The Computer Language
Benchmarks Game

fasta Python 3 #5 program

source code

# The Computer Language Benchmarks Game
# https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
#
# submitted by Joerg Baumann

from bisect import bisect
from contextlib import closing, contextmanager
from itertools import accumulate, chain, islice, zip_longest
from multiprocessing import Lock, RawValue, Process
from os import cpu_count
from re import sub
from sys import argv, stdout

write = stdout.buffer.write

def acquired_lock():
    lock = Lock()
    lock.acquire()
    return lock

def started_process(target, args):
    process = Process(target=target, args=args)
    process.start()
    return process

@contextmanager
def lock_pair(pre_lock=None, post_lock=None, locks=None):
    pre, post = locks if locks else (pre_lock, post_lock)
    if pre:
        pre.acquire()
    yield
    if post:
        post.release()

def write_lines(
        sequence, n, width, lines_per_block=10000, newline=b'\n', table=None):
    i = 0
    blocks = (n - width) // width // lines_per_block
    if blocks:
        for _ in range(blocks):
            output = bytearray()
            for i in range(i, i + width * lines_per_block, width):
                output += sequence[i:i + width] + newline
            else:
                i += width
            if table:
                write(output.translate(table))
            else:
                write(output)

    output = bytearray()
    if i < n - width:
        for i in range(i, n - width, width):
            output += sequence[i:i + width] + newline
        else:
            i += width
    output += sequence[i:n] + newline
    if table:
        write(output.translate(table))
    else:
        write(output)
    stdout.buffer.flush()

def cumulative_probabilities(alphabet, factor=1.0):
    probabilities = tuple(accumulate(p * factor for _, p in alphabet))

    table = bytearray.maketrans(
                bytes(chain(range(len(alphabet)), [255])),
                bytes(chain((ord(c) for c, _ in alphabet), [10]))
            )

    return probabilities, table

def copy_from_sequence(header, sequence, n, width, locks=None):
    sequence = bytearray(sequence, encoding='utf8')
    while len(sequence) < n:
        sequence.extend(sequence)

    with lock_pair(locks=locks):
        write(header)
        write_lines(sequence, n, width)

def lcg(seed, im, ia, ic):
    local_seed = seed.value
    try:
        while True:
            local_seed = (local_seed * ia + ic) % im
            yield local_seed
    finally:
        seed.value = local_seed

def lookup(probabilities, values):
    for value in values:
        yield bisect(probabilities, value)

def lcg_lookup_slow(probabilities, seed, im, ia, ic):
    with closing(lcg(seed, im, ia, ic)) as prng:
        yield from lookup(probabilities, prng)

def lcg_lookup_fast(probabilities, seed, im, ia, ic):
    local_seed = seed.value
    try:
        while True:
            local_seed = (local_seed * ia + ic) % im
            yield bisect(probabilities, local_seed)
    finally:
        seed.value = local_seed

def lookup_and_write(
        header, probabilities, table, values, start, stop, width, locks=None):
    if isinstance(values, bytearray):
        output = values
    else:
        output = bytearray()
        output[:stop - start] = lookup(probabilities, values)

    with lock_pair(locks=locks):
        if start == 0:
            write(header)
        write_lines(output, len(output), width, newline=b'\xff', table=table)

def random_selection(header, alphabet, n, width, seed, locks=None):
    im = 139968.0
    ia = 3877.0
    ic = 29573.0

    probabilities, table = cumulative_probabilities(alphabet, im)

    if not locks:
        with closing(lcg_lookup_fast(probabilities, seed, im, ia, ic)) as prng:
            output = bytearray(islice(prng, n))

        lookup_and_write(header, probabilities, table, output, 0, n, width)
    else:
        pre_seed, post_seed, pre_write, post_write = locks

        m = cpu_count() * 3 if n > width * 15 else 1
        partitions = [n // (width * m) * width * i for i in range(1, m)]

        processes = []
        pre = pre_write

        with lock_pair(locks=(pre_seed, post_seed)):
            with closing(lcg(seed, im, ia, ic)) as prng:
                for start, stop in zip([0] + partitions, partitions + [n]):
                    values = list(islice(prng, stop - start))

                    post = acquired_lock() if stop < n else post_write

                    processes.append(started_process(
                        lookup_and_write,
                        (header, probabilities, table, values,
                         start, stop, width, (pre, post))
                    ))

                    pre = post

        for p in processes:
            p.join()

def fasta(n):
    alu = sub(r'\s+', '', """
GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
""")

    iub = list(zip_longest('acgtBDHKMNRSVWY',
                           (.27, .12, .12, .27), fillvalue=.02))

    homosapiens = list(zip('acgt', (0.3029549426680, 0.1979883004921,
                                    0.1975473066391, 0.3015094502008)))

    seed = RawValue('f', 42)
    width = 60
    tasks = [
        (copy_from_sequence,
         [b'>ONE Homo sapiens alu\n', alu, n * 2, width]),
        (random_selection,
         [b'>TWO IUB ambiguity codes\n', iub, n * 3, width, seed]),
        (random_selection,
         [b'>THREE Homo sapiens frequency\n', homosapiens, n * 5, width, seed]),
    ]

    if cpu_count() < 2:
        for func, args in tasks:
            func(*args)
    else:
        written_1 = acquired_lock()
        seeded_2 = acquired_lock()
        written_2 = acquired_lock()

        locks_sets = [
            (None, written_1),
            (None, seeded_2, written_1, written_2),
            (seeded_2, None, written_2, None),
        ]

        processes = [
            started_process(target, args + [locks_sets[i]])
                for i, (target, args) in enumerate(tasks)
        ]

        for p in processes:
            p.join()

if __name__ == "__main__":
    fasta(int(argv[1]))
    

notes, command-line, and program output

NOTES:
64-bit Ubuntu quad core
Python 3.9.2


Sun, 21 Mar 2021 00:55:24 GMT

MAKE:
mv fasta.python3-5.python3 fasta.python3-5.py
~/.local/bin/pytype .
ninja: Entering directory `.pytype'
[1/1] check fasta.python3-5
FAILED: /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/.pytype/pyi/fasta.python3-5.pyi 
/usr/bin/python3 -m pytype.single --imports_info /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/.pytype/imports/fasta.python3-5.imports --module-name fasta.python3-5 -V 3.8 -o /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/.pytype/pyi/fasta.python3-5.pyi --analyze-annotated --nofail --quick /home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 9, in <module>: Can't find module 'multiprocessing.RawValue'. [import-error]
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 22, in started_process: Function Process.__init__ was called with the wrong arguments [wrong-arg-types]
         Expected: (self, group, target, name, args: tuple = ..., ...)
  Actually passed: (self, target, args: list)
Called from (traceback):
  line 210, in current file
  line 201, in fasta
  line 202, in <listcomp>
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 43, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 210, in current file
  ...
  line 120, in lookup_and_write
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 43, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 81, in copy_from_sequence
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 47, in write_lines: No attribute 'translate' on bytearray [attribute-error]
  In bytearray
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 54, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 210, in current file
  ...
  line 120, in lookup_and_write
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 54, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 81, in copy_from_sequence
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 57, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 210, in current file
  ...
  line 120, in lookup_and_write
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 57, in write_lines: unsupported operand type(s) for +: 'bytearray' and 'bytes' [unsupported-operands]
  Function __add__ on bytearray expects Union[bytearray, str]
Called from (traceback):
  line 81, in copy_from_sequence
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 59, in write_lines: No attribute 'translate' on bytearray [attribute-error]
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 67, in cumulative_probabilities: No attribute 'maketrans' on Type[bytearray] [attribute-error]
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 101, in lcg_lookup_fast: No attribute 'value' on bytes [attribute-error]
  In Union[Any, List[Tuple[str, float]], bytes, int, list, str]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 101, in lcg_lookup_fast: No attribute 'value' on str [attribute-error]
  In Union[Any, List[Tuple[str, float]], bytes, int, list, str]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 101, in lcg_lookup_fast: No attribute 'value' on int [attribute-error]
  In Union[Any, List[Tuple[str, float]], bytes, int, list, str]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 101, in lcg_lookup_fast: No attribute 'value' on list [attribute-error]
  In Union[Any, List[Tuple[str, float]], bytes, int, list, str]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 101, in lcg_lookup_fast: No attribute 'value' on List[Tuple[str, float]] [attribute-error]
  In Union[Any, List[Tuple[str, float]], bytes, int, list, str]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 107, in lcg_lookup_fast: Can't assign attribute 'value' on str [not-writable]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 107, in lcg_lookup_fast: Can't assign attribute 'value' on int [not-writable]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 107, in lcg_lookup_fast: Can't assign attribute 'value' on list [not-writable]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection
File "/home/dunham/all-benchmarksgame/benchmarksgame_i53330/fasta/tmp/fasta.python3-5.py", line 107, in lcg_lookup_fast: Can't assign attribute 'value' on List[Tuple[str, float]] [not-writable]
Called from (traceback):
  line 210, in current file
  line 189, in fasta
  line 130, in random_selection

For more details, see https://google.github.io/pytype/errors.html
ninja: build stopped: subcommand failed.
Computing dependencies
Analyzing 1 sources with 0 local dependencies
Leaving directory '.pytype'
make: [/home/dunham/all-benchmarksgame/2000-benchmarksgame/nanobench/makefiles/u64q.programs.Makefile:375: fasta.python3-5.python3_run] Error 1 (ignored)

9.14s to complete and log all make actions

COMMAND LINE:
/opt/src/Python-3.9.2/bin/python3 -OO fasta.python3-5.py 25000000

(TRUNCATED) PROGRAM OUTPUT:
>ONE Homo sapiens alu
GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
ACAGAGCGAGACTCCGTCTCAAAAAGGCCGG