SPUG:search performance -- loops vs compound RE

Michael R. Wolf MichaelRunningWolf at att.net
Sun Jan 19 23:29:51 CST 2003


In his talk at Geospiza on Thursday, Damian mentioned something that
almost had me discard a trick of mine -- I create a RE from a string
by joining a list with alternation bars ("|").

Fortunately, I benchmarked it and found that I had misinterpreted him.
He *did* say that many alternations, especially early in a pattern can
be a problem because of backtracking.  What I *missed* was that the
problem manifests itself when there are multiple levels, thus
requiring expensive (i.e. greater than O(N)) backtracking.  It turns
out that having multiple branches off the start state is actually
pretty fast, since they fail early and therefore don't have to
backtrack much.

Here's an outline for the remainder of this message.  It goes from
high level to low level.  Read until you've reached your detail
saturation, it gets progressively more detailed.

 - Observations
 - Outstanding questions
 - Benchmark summary
 - Benchmark output
 - Benchmarking code

================================================================
Observations

The basic comparison in the code is encapsulated in two subroutines,
loop_search and RE_search.

loop_search loops over a list to count up matches in @gene_data

    for (@search_genes) {
	$count{$_}++ if ( grep{/$_/g} @gene_data);
    }

RE_search constructs a RE of alternatives, then applies it once to
@gene_data

    my $gene_RE = join "|", @search_genes;
    $count{$_}++ for grep{/$gene_RE/go} @gene_data;

The base data (@gene_data) remained constant.

I varied the number of items to match (@search_genes) against the base
data.

I varied the percentage of matches within the items to match.

-- 'RE_search' always outperformed 'for_search' by 1-2 orders of
    magnitude.

-- Both subroutines slowed down with increasing number of patterns to
   find, though 'for_search' degraded more rapidly (200:1) than
   'RE_search' (6:1) over 2+ orders of magnitude on pattern count.

-- Both subroutines were independent of the match percentage.

================================================================
Outstanding questions

- It seems that the function 'map_search' should be very similar to
  'for_search'.  It's substantially slower.  I can't figure why.  Do I
  have a bad map structure?  Have I overlooked something obvious?

================================================================
Benchmark summary

Rate		Match		
Type	Count	0	50	100

for	1	118	117	120
	10	12	11.9	11.9
	100	1.54	1.2	1.5
	500	0.6	0.29	0.61
RE|	1	919	915	944
	10	116	115	117
	100	140	141	139
	500	151	150	149

================================================================
Benchmark output

Benchmark: running RE|_0001_100%, for_0001_100%, each for at least 3 CPU seconds...
RE|_0001_100%:  4 wallclock secs ( 3.07 usr +  0.00 sys =  3.07 CPU) @ 989.59/s (n=3042)
for_0001_100%:  4 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 118.54/s (n=374)
               Rate for_0001_100% RE|_0001_100%
for_0001_100% 119/s            --          -88%
RE|_0001_100% 990/s          735%            --

Benchmark: running RE|_0001_050%, for_0001_050%, each for at least 3 CPU seconds...
RE|_0001_050%:  3 wallclock secs ( 3.13 usr +  0.00 sys =  3.13 CPU) @ 970.64/s (n=3042)
for_0001_050%:  4 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 118.92/s (n=374)
               Rate for_0001_050% RE|_0001_050%
for_0001_050% 119/s            --          -88%
RE|_0001_050% 971/s          716%            --

Benchmark: running RE|_0001_000%, for_0001_000%, each for at least 3 CPU seconds...
RE|_0001_000%:  3 wallclock secs ( 3.12 usr +  0.01 sys =  3.13 CPU) @ 946.88/s (n=2959)
for_0001_000%:  3 wallclock secs ( 3.18 usr +  0.00 sys =  3.18 CPU) @ 117.46/s (n=374)
               Rate for_0001_000% RE|_0001_000%
for_0001_000% 117/s            --          -88%
RE|_0001_000% 947/s          706%            --

Benchmark: running RE|_0010_100%, for_0010_100%, each for at least 3 CPU seconds...
RE|_0010_100%:  4 wallclock secs ( 3.06 usr +  0.00 sys =  3.06 CPU) @ 123.69/s (n=379)
for_0010_100%:  4 wallclock secs ( 3.03 usr +  0.00 sys =  3.03 CPU) @ 11.90/s (n=36)
                Rate for_0010_100% RE|_0010_100%
for_0010_100% 11.9/s            --          -90%
RE|_0010_100%  124/s          939%            --

Benchmark: running RE|_0010_050%, for_0010_050%, each for at least 3 CPU seconds...
RE|_0010_050%:  4 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 122.14/s (n=384)
for_0010_050%:  4 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 11.95/s (n=37)
                Rate for_0010_050% RE|_0010_050%
for_0010_050% 12.0/s            --          -90%
RE|_0010_050%  122/s          922%            --

Benchmark: running RE|_0010_000%, for_0010_000%, each for at least 3 CPU seconds...
RE|_0010_000%:  4 wallclock secs ( 3.41 usr +  0.00 sys =  3.41 CPU) @ 122.17/s (n=416)
for_0010_000%:  3 wallclock secs ( 3.09 usr +  0.00 sys =  3.09 CPU) @ 11.95/s (n=37)
                Rate for_0010_000% RE|_0010_000%
for_0010_000% 12.0/s            --          -90%
RE|_0010_000%  122/s          922%            --

Benchmark: running RE|_0100_100%, for_0100_100%, each for at least 3 CPU seconds...
RE|_0100_100%:  3 wallclock secs ( 3.02 usr +  0.00 sys =  3.02 CPU) @ 150.79/s (n=456)
for_0100_100%:  3 wallclock secs ( 3.29 usr +  0.00 sys =  3.29 CPU) @  1.52/s (n=5)
                Rate for_0100_100% RE|_0100_100%
for_0100_100% 1.52/s            --          -99%
RE|_0100_100%  151/s         9807%            --

Benchmark: running RE|_0100_050%, for_0100_050%, each for at least 3 CPU seconds...
RE|_0100_050%:  4 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 151.08/s (n=475)
for_0100_050%:  4 wallclock secs ( 3.17 usr +  0.00 sys =  3.17 CPU) @  1.26/s (n=4)
                Rate for_0100_050% RE|_0100_050%
for_0100_050% 1.26/s            --          -99%
RE|_0100_050%  151/s        11888%            --

Benchmark: running RE|_0100_000%, for_0100_000%, each for at least 3 CPU seconds...
RE|_0100_000%:  3 wallclock secs ( 3.08 usr +  0.00 sys =  3.08 CPU) @ 152.08/s (n=469)
for_0100_000%:  4 wallclock secs ( 3.31 usr +  0.00 sys =  3.31 CPU) @  1.51/s (n=5)
                Rate for_0100_000% RE|_0100_000%
for_0100_000% 1.51/s            --          -99%
RE|_0100_000%  152/s         9952%            --

Benchmark: running RE|_0500_100%, for_0500_100%, each for at least 3 CPU seconds...
RE|_0500_100%:  3 wallclock secs ( 3.23 usr +  0.00 sys =  3.23 CPU) @ 156.46/s (n=506)
for_0500_100%:  4 wallclock secs ( 3.29 usr +  0.00 sys =  3.29 CPU) @  0.61/s (n=2)
            (warning: too few iterations for a reliable count)
                 s/iter for_0500_100% RE|_0500_100%
for_0500_100%      1.65            --         -100%
RE|_0500_100% 6.39e-003        25677%            --

Benchmark: running RE|_0500_050%, for_0500_050%, each for at least 3 CPU seconds...
RE|_0500_050%:  3 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 162.37/s (n=504)
for_0500_050%:  4 wallclock secs ( 3.33 usr +  0.00 sys =  3.33 CPU) @  0.30/s (n=1)
            (warning: too few iterations for a reliable count)
                 s/iter for_0500_050% RE|_0500_050%
for_0500_050%      3.33            --         -100%
RE|_0500_050% 6.16e-003        54051%            --

Benchmark: running RE|_0500_000%, for_0500_000%, each for at least 3 CPU seconds...
RE|_0500_000%:  3 wallclock secs ( 3.09 usr +  0.00 sys =  3.09 CPU) @ 151.21/s (n=468)
for_0500_000%:  4 wallclock secs ( 3.30 usr +  0.00 sys =  3.30 CPU) @  0.61/s (n=2)
            (warning: too few iterations for a reliable count)
                 s/iter for_0500_000% RE|_0500_000%
for_0500_000%      1.65            --         -100%
RE|_0500_000% 6.61e-003        24888%            --

Benchmark: running for_0001_000%, for_0001_050%, for_0001_100%, for_0010_000%, for_0010_050%, for_0010_100%, for_0100_000%, for_0100_050%, for_0100_100%, for_0500_000%, for_0500_050%, for_0500_100%, each for at least 3 CPU seconds...
for_0001_000%:  3 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 118.17/s (n=374)
for_0001_050%:  3 wallclock secs ( 3.18 usr +  0.00 sys =  3.18 CPU) @ 116.83/s (n=372)
for_0001_100%:  4 wallclock secs ( 3.27 usr +  0.00 sys =  3.27 CPU) @ 119.75/s (n=391)
for_0010_000%:  4 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 12.05/s (n=38)
for_0010_050%:  3 wallclock secs ( 3.27 usr +  0.00 sys =  3.27 CPU) @ 11.91/s (n=39)
for_0010_100%:  4 wallclock secs ( 3.19 usr +  0.00 sys =  3.19 CPU) @ 11.93/s (n=38)
for_0100_000%:  2 wallclock secs ( 3.25 usr +  0.00 sys =  3.25 CPU) @  1.54/s (n=5)
for_0100_050%:  4 wallclock secs ( 3.33 usr +  0.00 sys =  3.33 CPU) @  1.20/s (n=4)
for_0100_100%:  3 wallclock secs ( 3.34 usr +  0.00 sys =  3.34 CPU) @  1.50/s (n=5)
for_0500_000%:  3 wallclock secs ( 3.34 usr +  0.00 sys =  3.34 CPU) @  0.60/s (n=2)
            (warning: too few iterations for a reliable count)
for_0500_050%:  4 wallclock secs ( 3.43 usr +  0.01 sys =  3.44 CPU) @  0.29/s (n=1)
            (warning: too few iterations for a reliable count)
for_0500_100%:  4 wallclock secs ( 3.28 usr +  0.00 sys =  3.28 CPU) @  0.61/s (n=2)
            (warning: too few iterations for a reliable count)

                 Rate for_0500_050% for_0500_000% for_0500_100% for_0100_050% for_0100_100% for_0100_000% for_0010_050% for_0010_100% for_0010_000% for_0001_050% for_0001_000% for_0001_100%
for_0500_050% 0.291/s            --          -51%          -52%          -76%          -81%          -81%          -98%          -98%          -98%         -100%         -100%         -100%
for_0500_000% 0.600/s          106%            --           -2%          -50%          -60%          -61%          -95%          -95%          -95%          -99%          -99%          -99%
for_0500_100% 0.611/s          110%            2%            --          -49%          -59%          -60%          -95%          -95%          -95%          -99%          -99%          -99%

for_0100_050%  1.20/s          313%          101%           97%            --          -20%          -22%          -90%          -90%          -90%          -99%          -99%          -99%
for_0100_100%  1.50/s          415%          150%          146%           25%            --           -2%          -87%          -87%          -88%          -99%          -99%          -99%
for_0100_000%  1.54/s          428%          156%          152%           28%            2%            --          -87%          -87%          -87%          -99%          -99%          -99%

for_0010_050%  11.9/s         3991%         1886%         1850%          890%          694%          675%            --           -0%           -1%          -90%          -90%          -90%
for_0010_100%  11.9/s         3998%         1889%         1854%          892%          696%          677%            0%            --           -1%          -90%          -90%          -90%
for_0010_000%  12.0/s         4039%         1909%         1873%          902%          704%          684%            1%            1%            --          -90%          -90%          -90%

for_0001_050%   117/s        40033%        19382%        19032%         9612%         7693%         7506%          881%          879%          870%            --           -1%           -2%
for_0001_000%   118/s        40491%        19604%        19250%         9723%         7782%         7593%          892%          890%          881%            1%            --           -1%
for_0001_100%   120/s        41036%        19869%        19510%         9855%         7888%         7696%          906%          904%          894%            2%            1%            --

Benchmark: running RE|_0001_000%, RE|_0001_050%, RE|_0001_100%, RE|_0010_000%, RE|_0010_050%, RE|_0010_100%, RE|_0100_000%, RE|_0100_050%, RE|_0100_100%, RE|_0500_000%, RE|_0500_050%, RE|_0500_100%, each for at least 3 CPU seconds...
RE|_0001_000%:  4 wallclock secs ( 3.40 usr +  0.00 sys =  3.40 CPU) @ 918.70/s (n=3119)
RE|_0001_050%:  4 wallclock secs ( 3.06 usr +  0.00 sys =  3.06 CPU) @ 914.52/s (n=2803)
RE|_0001_100%:  3 wallclock secs ( 3.12 usr +  0.00 sys =  3.12 CPU) @ 944.30/s (n=2950)
RE|_0010_000%:  4 wallclock secs ( 3.00 usr +  0.00 sys =  3.00 CPU) @ 116.18/s (n=349)
RE|_0010_050%:  3 wallclock secs ( 3.01 usr +  0.01 sys =  3.02 CPU) @ 115.08/s (n=348)
RE|_0010_100%:  3 wallclock secs ( 3.08 usr +  0.00 sys =  3.08 CPU) @ 117.34/s (n=362)
RE|_0100_000%:  4 wallclock secs ( 3.07 usr +  0.00 sys =  3.07 CPU) @ 140.49/s (n=432)
RE|_0100_050%:  4 wallclock secs ( 3.12 usr +  0.00 sys =  3.12 CPU) @ 141.17/s (n=441)
RE|_0100_100%:  4 wallclock secs ( 3.13 usr +  0.00 sys =  3.13 CPU) @ 139.20/s (n=435)
RE|_0500_000%:  4 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 151.08/s (n=475)
RE|_0500_050%:  4 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 150.23/s (n=483)
RE|_0500_100%:  3 wallclock secs ( 3.13 usr +  0.00 sys =  3.13 CPU) @ 148.96/s (n=467)

               Rate RE|_0010_050% RE|_0010_000% RE|_0010_100% RE|_0100_100% RE|_0100_000% RE|_0100_050% RE|_0500_100% RE|_0500_050% RE|_0500_000% RE|_0001_050% RE|_0001_000% RE|_0001_100%
RE|_0010_050% 115/s            --           -1%           -2%          -17%          -18%          -18%          -23%          -23%          -24%          -87%          -87%          -88%
RE|_0010_000% 116/s            1%            --           -1%          -17%          -17%          -18%          -22%          -23%          -23%          -87%          -87%          -88%
RE|_0010_100% 117/s            2%            1%            --          -16%          -16%          -17%          -21%          -22%          -22%          -87%          -87%          -88%

RE|_0100_100% 139/s           21%           20%           19%            --           -1%           -1%           -7%           -7%           -8%          -85%          -85%          -85%
RE|_0100_000% 140/s           22%           21%           20%            1%            --           -0%           -6%           -6%           -7%          -85%          -85%          -85%
RE|_0100_050% 141/s           23%           22%           20%            1%            0%            --           -5%           -6%           -7%          -85%          -85%          -85%

RE|_0500_100% 149/s           29%           28%           27%            7%            6%            6%            --           -1%           -1%          -84%          -84%          -84%
RE|_0500_050% 150/s           31%           29%           28%            8%            7%            6%            1%            --           -1%          -84%          -84%          -84%
RE|_0500_000% 151/s           31%           30%           29%            9%            8%            7%            1%            1%            --          -83%          -84%          -84%

RE|_0001_050% 915/s          695%          687%          679%          557%          551%          548%          514%          509%          505%            --           -0%           -3%
RE|_0001_000% 919/s          698%          691%          683%          560%          554%          551%          517%          512%          508%            0%            --           -3%
RE|_0001_100% 944/s          721%          713%          705%          578%          572%          569%          534%          529%          525%            3%            3%            --

================================================================

Benchmarking code

#! /usr/bin/perl -w

use Benchmark qw(timethese cmpthese);
use Memoize;
use List::Util qw/min/;

my $debug = 0;

# ================================================================
# Get sample gene data.

my @gene_data = grep {/\S+/ && /^[^>]/ } <DATA>;
chomp @gene_data;
my $gene_data = join "", @gene_data;

print("\@gene_data=>\n", join(",\n\t", @gene_data), "\n") if $debug;


# ================================================================
# Get genes to search for.
#     Usage: search_genes($count, $match_rate)

memoize 'search_genes';
sub search_genes {
    my $count = shift || 10;	# Return list length.
    my $match_rate = shift || 100; # 0-100.
    my @ret = ();		# Return list.

    my $match_hits = int($count * $match_rate/100);
    my $miss_hits = $count - $match_hits;

    # Grab some matches by grabbing 4-tuples from the real data.
    for (my $match_count = 1;
	 $match_count <= $match_hits;
	 $match_count++)
    {
	push @ret, substr($gene_data, rand(length($gene_data) - 4), 4);
    }

    # Add some misses, contrived from a 4 character string.
    # Starting from "uuuu" guarantees that it won't match /[ACGT]{4}/.
    for (my ($miss_count, $miss_value) = (1, "uuuu");
	 $miss_count <= $miss_hits;
	 $miss_count++, $miss_value++)
    {
	push @ret, $miss_value;
    }

    # Assert a correct return count.
    die "bad return list size" unless @ret == $count;

    # Use the hash's randomized key values to randomize the return order.
    my %randomizer;
    @randomizer{@ret} = @ret;

    return keys %randomizer;
}


# Find it by looping over the search_genes.
sub loop_search {
    my %count;
    my @search_genes = search_genes(@_);
    for (@search_genes) {
	$count{$_}++ if ( grep{/$_/g} @gene_data);
    }
    return %count;
}

# Find it by constructing a RE with lots of |'s between the search_genes.
sub RE_search {
    my %count;
    my @search_genes = search_genes(@_);
    my $gene_RE = join "|", @search_genes;
    $count{$_}++ for grep{/$gene_RE/go} @gene_data;
    return %count;
}

# Find it by map'ing a grep over the search_genes.
sub map_search {
    my %count;
    my @search_genes = search_genes(@_);
    %count = map { $_ => scalar grep{/$_/g} @gene_data } @search_genes;
    return %count;
}


# ================================================================
# Set up benchmarking.

my @search_gene_count = (1, 10, 100, 500);
my @match_rate = (100, 50, 0);

for my $count (@search_gene_count) {
    for my $match_rate (@match_rate) {

	# Seed the memoized cache so that the functions don't incur the
	# cost in their benchmark.
	my @throw_away = search_genes($count, $match_rate);

	my $loop_subref  = sub {loop_search($count, $match_rate)};
	my $loop_name = sprintf "for_%04d_%03d%%", $count, $match_rate;

	my $RE_subref  = sub {RE_search($count)};
	my $RE_name = sprintf   "RE|_%04d_%03d%%", $count, $match_rate;

	# my $map_subref  = sub {map_search($count)};
	# my $map_name = sprintf "map_%04d_%03d%%", $count, $match_rate;

	# How do they compare for a $count-sized set?
	cmpthese(0, {
		     $loop_name => $loop_subref,
		     $RE_name => $RE_subref,
		     # $map_name => $map_subref, 
		    }
		);

	# Save 'em for a different comparison later.
	$loop{$loop_name} = $loop_subref;
	$RE{$RE_name} = $RE_subref;
	# $map{$map_name} = $map_subref;
    }
}

# How do they compare across a range of set sizes?
cmpthese(0, \%loop);
cmpthese(0, \%RE);
# cmpthese(0, \%map);


__DATA__
>gi|20864310:11744956-11765571 Mus musculus WGS supercontig Mm3_WIFeb01_32
GTGTCCCTGCCACAGGCTCTCCATCGAGGACCATGGCGAGGCTGAGCTGGGGGTACGGCGAGCACAACGG
TGAGCGCGGGCTTCCAGAGGGGGCTGATGGGGGCTTGAGGGAGCTCTGAGCCCCGTGGGGGGGTTGGGGG
TCAGGGCCTGGTCCCCGCCGGCTCTCTCCAGAGTGGACGGCGGCATTCATTCAACTTCACTGGAAAAGCT
CACTGCTGTCCCGAGAAAGCTTAAGAGGTCAGAAGTCAGATGACACATTTGTAAGGAAACAAGGACAACT
GAGCCGCGAGAGCTCCCAGATCACTAAGTCACGGGACGCCTTCCAGGCGCTGTTGAAGCAATCTTGGTAA
CTTGTAATTTGCATACTGACTTGAAGTTAACTTGGGGCTTGTTCTTCAGTCTTACTTTCCTACCGTACCC
ATCCTTTCAGAGACCAAGGTTTAGCAAACGATTATAGAAATTATAATATGGTGTTAAATATATTTATTGA
TAAGCATGGCAACTTTTCTTCATCGCCTAAGTGTATTAGGGATAAGACATTCTTCTTGTTCATCGTTTGA
ACTGATTGCTTCAATTAATTACTCAAAAGAATTGCAAAGAAAAACTGGGAAAGCACTGATAGTCTTCAAA
ATGGAGTTTGTGGATAATAATATCAAAAACTTAAATTAGCATATACGTTATTGGATAATATTCTATAGTA
CATTTAATGAAAGTTTACGGAAAGTTTTCCCTTCTTTTATTTTATTTTCCCCCTTTTTGTGTTTTGAGAC
GAATCTTACTCTGTAGCTTAGTCTGGGCAGAACTTGTGGTCATCCTCTTTTCTTGGATGGAAAAAAAAAA
CTCGTTTCTTATTGCAGCTTATTTGAGGTCGTGATGACATTAATGTTATTTTTAAAATGACATCAGATGA
AGTTTAGATTTTTATGAATGACATTTATAATTTAGATGAATTTCTTAAGCCAAAATAGCAATCTTATGTT
TCATTACCTTCTAATTTGTGTGTTTGAAAGACAATCTTTACACATTTCAGTTTTGTCTCTGAAATCATTT
TGTTTGTTGTTATTTGGCAGTTATTAGGTGCCAGTAGTGGTACCCTCTCTGTGGTTAGGGAGAAGGTTGT
GTTAGCCAGTAGGTACTGATTGTACCCGAATAGGTACCCGAATAAGTATTGGTTTCAATAAAATTCTCCA
GAAAATTTAAAATTTCAACTTAGAAAGGGCATTATAATGAGGAGTTGTTTTACATCTTGTTCATTTTTTA
AATCTTAAAAAAGATTTATTCTTTTTTTAAAAAAATATGTTTATGAATTTTTGACTTGTATGTTGTGGAA
GTTAGAAGAGGGCATTAGATCAACAAGGACTGCTGCTGGTTTTAGCCTCCATGTGGGCCGGGAAATCGAA
CCCAGGTGCTCGGCAAGAGTATCAAGTGTTCTAACTGCTGGACCTTCTCCCCAGTCCCCAGTTTACATTC
TAGCTAGGAGTTGCAGAACCATTCTTCTCGCAGAAACAGTGGTTTTCAGAGGACCACACCTTGAAGTTAG
ATTATGAGATTATGTTGGAAGAATTCGGTTGGGATGTACTGGGAACTGACCAAGCATTTTTTTCTTTTTC
TTTTTCTTGTTCAGTCATTGAAAATACAGTGACTGAACAGCTGGAAAGAACTTAAGCTGAGCCTGGCAGT
GATAAAATGGAATGGGAATTGGAGCTCTGGACAGGACAGGGTGCCTGTTCCTAAGCAGTTTGTTTCTTCT
TCCGCTAACCTCTGATCATTTTATAGGTTTAGGCCGTGTGACATCACCAAACATCATATAACACTATGGA
TATTCAAAAATTCCTCAAGCCACTGAGGCATGTACCTTTCACTTAAGAACCATGGTTAAGTGAATTTAAA
GTCCAGTGTGGTAGGAAACATACAAAGGTGGGTCTATTTAAGAGGCCCGATATTGCAAGTGAATAGATAA
AACTGGCTATCCATCCCAGTGGCTTTATTTTGGGTAGATTTGACTTCTCTAAGAACAGGCCTGGTTGAGA
AGGGTTAGGGATTGATGACGGAAGGGCTTAGGAAGAGAAAGCAGCCCCTTATCTGTTGCAAAAATGTTTG
CATGTTGTGACTCCTGCATTGCATGTTTGAAATCTGGTGCTCATTACGTAGAATAACTCGTATGTGGTGG
TCATGACAGAAAGATTTTCTATATTAAATAAGAAGACAAAATTGTAAGCAGAAAGATACACACAGCAAGA
CGAGAAATAATCTCATAATCCTACAGTGTCTTCTGAGGATTTTAAATGCAAAATCGCCATGACCCATAGT
ATCTGATTCACAGGATACCTTTGAAGCAGGGTATATTGTCATTTGTTCATGGTGTGGCTTTTTTCCAGAA
ACCAATGTGAGCAACAATGTTATATTTTTTGACAGGGCATAGCCATTTTGTTTGAATTATTCTCTGTGTA
AGATTTGTGTGTGTGTGTGTGTTGGGTAGATGAGTTGCATATAACAGGTACCTCAGGTTAGCTGAGCTGA
GCAGAGGGGCATTAGAGGCTATCCGTCAGTGCTATAACTACTAGCAGAAATAGCAGGCAGTGTCTGCTCT
TCCTCTGCTTAAACTTCTTGGCCTCTGGAGCAGCCAAGGAACATTCTTGGTTTTGAGATGGAATTTCTTT
GTTTGCAACAATGAATTGTACTTCTGTTCTTGTTTGGTAGGTAGGTAACTTTGAGAAGCACTGTATGAAA
TGTAATTATTCTTTCACCTATAATGTACATCTTTAATTCTGATAACAATTTAAAGCAAACACAGTGCTTT
CCATAACCACAAAACACTAGTCATGGTTAAAATAGGAGCAGAGTCCTGAGGATCATACTTTTACTAATTT
TTAATTTTTCCCCATGATGTGGATGATGTGGCTGTGGGTATGGATGTTTTATTGTGTGCAGAAGCCAGAT
GGACCTTGGTTGTCTTCCCCTCTGTTCTCTATCACCTTCTTAATTGTTTCTCTCTGAGCCTGGAGTTCAG
AGAGTCAGACTTAGTGTAACTAGCCAGCTAATGTGGAACTCCTTAAGTCTCCTCCTAAATGCTGGACTTC
AAGTGAGCTGCCACACCCACCTGGCATTCCTATGGATAATGAGGATCCAAACTCTCACCTTCACATTTGT
GCTGCACTTCCTTTATCCATGAAGTGGAGTCCCCAGCCTGCTGCTACCAGTTTTAATTTGCTGAATGAAG
AACTTACTTAGTCCTCTCCTTTTGGTCTTCTCAATTTCAGGTCCCATTCACTGGAATGAATTGTTCCCTA
TTGCTGATGGTGATCAGCAGTCTCCAATTGAGATTAAAACCAAAGAAGTGAAATACGACTCCTCACTCCG
ACCTCTCAGTATCAAGTATGATCCTGCCTCAGCTAAAATCATCAGCAATAGTGGCCATTCCTTCAACGTT
GACTTTGACGACACGGAGGACAAATCAGGTTGGCTCTGTTTGTTTATTAGTTGTTGTAAGACGTTGGATG
GTTAGATTTACTCTCCTGTTTTTCACTCTGTAAATTTCAAAATTGAAGCATATTTATCATGTGAATTCAA
GTGTTATATATTTGAAACTTAAGATAATATTACCATGAAATAATAGAGAAAATTTGTAGAAAAAAGTATG
CTGGGTGATATTTTAAAATTGGTTTTAGGTTATTATTACTTAATGATGTAAATATTGAAGTTTAATAGTT
TTTTATAAATAATTTTAGTCTTTTCATGAAAACTTTAAAATTTCTTTAGATTTGTTTATTTTTATCTGTA
TGAATGTGTACTGTGTGGCTGTCTAAGGTTATGGTGGCTGTAAGCCCAGTGTGGGTACTGGGAATCAAAC
CTAGGTCCTCTGTACAAAAACACAAAATACTCTTAATATTAACTGCTAAGCCATTTCTCTAGTCCTGTTT
TTGGAAATTGTTTAGTTATAACTAAATTGCTAATTATTGTAAATGTAAAGTTGATGAGATATTTGCTTTC
TAAATCTTTTTTGTGCTTGCAGTCATAATATGTATGTGTAGAAAACAAGACACACAGAAATGTAGGATAA
AAATTAAGGCTGTCCCTACAGATTATAATTATGTTAGCAGCAATACATTGTTTTTCAGGATTTAAATTTG
ATGCCACACGTGTATACACATGCACACCATATTATTTTACATTTTTCTCTTATGTTGTATTTAGGCTGGT
ACTATATTACTCTAAAAATGTTTCCTATGCAAAATATTTCATGCATAGTTTTCATTAAAATGCATACCTC
TTGTTAATAAATGAAATATATCAGCCACTCTTTTATCATAATGTATATATTATCATCATAATAATGGACA
TTTAAGAAGGAAGAAAAGTAGATATTTAATTGAAAAAAGAAGTATTTAAAACATCTATCCTTATTTATAT
TTTTCATTAGTTGTAATAAAAAATAAATTTCACTTGTTCATGGGTCATGTCTTTCACAATGGAAAGGTGG
ACTCACAAATTAAAATGTTAATTCACTTTCTCAGTCTATTACCTAAAGGGAAAATAAAATACCATTTACT
TAAAATGAATATTTGAATACTGGAATACTCTTTGAGCCTATCTGCTGCCAATTTTAAAAATGTAGCTGAA
TGAAATTATGTGCAAACTTTTCTTGTCCATTGTGTGTTTGCAAGCATCTAGCCAGTGAATTTATGGGGCC
TAGTGTAGGTTCTAGGGGTTGGACTCAGGTTATTAGGGCTGCCTGGCAATACTCTCCCCCCCGCCCCCAG
TCATGCCATTGGCTCCCCATTAAGAATTTATATGATTTAATCATTTTCTTCATGAACTTATACTTGATGT
CATAAGATCCTGCTTTTATAAAAGCATTGTTGTTAGTAAAAATTGTAAGTGTATACAGATCTCTTCTTCA
CATTTGTTAGATAACCACACTGAAATATTTCTCTAGGCCTGTGCAAAATAAATAAAGAAAAATCAATGAC
GTTTCTTTTTCTGTGAAGCAGAGAGAAAACCTGCCTTATTAGATGTATTTAACTTAATTTCCTTCAGGCT
TTCAAATTTGTGAGTCTGTTAGTAGATGTATATGTAGTGTACAAAAGAGTTTGGAAAAGTAGCCCAAAGC
TTCTAAATATTAAGTTGCTACCACCCACATTTGTTACAGGATACTTTTATAATATTTAAACATAAAAGGT
CTAATGCTACTCACATCAAATATTAAAGTGTTGACATTATTCTTCAAAACCATTTTCTTTATGAATGTTA
GTATTTTTATTGGGGGAAAAATTCTAATTTAATTTGTTCTGTAGTAATCTCTCATTCTTTTCCTCCCTCC
TTCCCTATGCCCTCATTTCCCTGTATCTCCTGCCCCTTCCCCTCCCTCCCTTTCTCTCTCCTCCACTCTT
TAACTCCTTTGAGACAGGGTTCCTCACTGAACCTGGATCCAGGCCGGTAGCCTGGAAGCCCTTGAAATTC
TCCTGTTCTCACCCTGCCCACAGCACTGGGGCTACTGGCCTCGTGGCCACATCTAGATGATTTTTATTTT
TGTTGCTTGTTTGTTCTGAGTCAGAGTTACCCTGTGAAGTCCAGGCTGGCTGCATTAAAGGTGGGAGCCA
CCACTCCCAGCCCTGGTTTTTGTTTTAACTGGCCCACATGCTTTAACAGCACTGCTCGTACTCACTGAGC
CACCTCCCCAGCTCCAAGAAGCCATTCCTGACCAAAAATTAACTGTGAATTTTATCAGTGAACACACCAC
AAAATTGCCACCATGGTACTTGAGGGTTTTGCTTGGCTGGGCCAATGCACACCTGCACCTTGGCTAACAT
GGAGGCATCCACTCTTCAGAACATTAATAGTTCATTGAAAGGTGACATCTAGGCACAAAATCCTTTAGGA
AGACTATTCACTAAATATAGAAGGGGCTCTTGAGGGGAGACAAGATAGGGATGCTCTAGACTCATCTCAG
GGAATTTCACCTGACCCTGGTTCCTGGTGGTCTGGGATGACTCCACCCAGAACTTCCACCACTGCAGTTT
AACTGCCAGGTGGCATTTCTTGACCTGTTACTTTAGTGATTTATTTGAAAGAGTTTACTTTTTTGGAAAT
TCTAAGTGAAAGGAAATAAAAGTAGGTATGAGTTTGGAGAGATCATTACTTGTTTTGAAGAATAAAATGG
AGACAATGATTAATTATTCACTGATCTGTGATGGAAAGTAAAATAAAAATTGGTCATGTGAAAACACAAA
ATCACTTTCATTAAAATTAAGGATTGTTGCCTACTACTGTGGAGCACATCTGCAGTCCCTTCCCTTGTGA
GGTACTTATCTCTCTAGAGGCACTAGGACCTGGGAGAATGGAGTGGACAAATGAGGCAGACTAAAGTCTC
ATGGAATAGCTGAGGGGAGTCACGTGAGTAAAGCACGTGATTACAAGCACAAGCCACACGACATGTGGGG
TGCAAGCCCCCCTTGGAAAAGCGAGTTTTTCCATACAGGCACAGAGAGGATGACAGCAGCAGGCAATAAC
GAGTAAGCTAAAGTAAACTCGCTCCTATTCACTACATCTGCAAGAAGCACAAAAACAAATTTCAAGAACA
ATTTTGTGCTTTTGAGGAAACTGAGGGCACCAGTCTCTTGTCTTGTTTTCTTGGAGTTTTCTCACAAGTG
CTCAGACTTCTCACATGACTCCATTGATGGGCAAGTCCTGACAATGAGGCTGAAGAGGAAGAGTCACAAG
CCAGTCCGTCTAACCAAAAAGAAACCCACAGATTGGCTGTTTATTGCAGATCCTTAGAAACCTACATGTT
TTTAAGCTCACTTTTTCCTGACCTGATTTTTCGAGAGGATCCTTCAACAGTCTTTTTCAAAATTAGGCAT
TTGCTTATTCTAAACTCACTGAAATACTGACCTGTGCAGACTGAATATGTAACCTGTAAAATAATCCATG
CTGCTTAGCCAGACAAAGCCTGCTAACCTAACTTTAAGAGTGACCTCTACTGCCATTATTCTTGGATGCC
TCCCTAACAATGTGTGGTTTTTGTATCACTTTCTTTCTCCGGAGCCAACAAGCCTGAGTCTCCTCCCAAA
GTCAATTCCACATTGATTACTCAAGCTCTCTAATCTCCTTTCTATCTGCAAGGGAATGACTTTTAGCCCA
GCTCAGATTTTGTTATGCAACAGCAAGAAGAAAAGCACAATAGAGCCCTTGACTACTTTCCTTTAGCTGC
CATTCCATCCTGGGTCAATGCCAGCTGTGTAATGAACACATTGCTGGCGTCATTCAGGGGAATCGTGCTG
AAACTGTTTAAAGACAAATCAAATATCTTATCCATTTATTCATCAGGTATTTGTGCATCTCCTCTGACAG
TTACTACGCTAGGAGGTGGTGATAGCAGGATTGCAGTCTCTGTTTTCATACTTGCATCCTAGTACCAGGA
GAAGCAGTAACAGAACCCTGTCTGTTTCACACAGTAATACAAGAGGAGGCCCGCAGACTGACCTCAATGG
TGGTCTCCTCTTTTTCACTGTTCACAGAGCTTTGAAAATAGCCATATTTTGCTATCATGATTTTGAAAAT
ATTTGTGTGTACGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTACGTGTATGTACCATCTG
ATATGGGTGCTGAGAACTGAACTTGGTCCTCTGGAAGAGCTGCAAGTATGCTTAACTGCTGAGTCATCTC
TCCTACCCCACCTTTATGTATTATAAAGAAATCTTTCTTATATAAGGTGGATAGGTCTTGAAATTTAAGA
CTCTGAAGAGTAATTTAAATATCTGTTACTAAGTCTGTATCTCCCTTTTCTTGCACAATTCTGTGGTATG
CTGGAGTTTAGTTACTATTACGCATATTCAGCCAGCATACAATGTTTCCTTTCCATTCCTGCCTCTTCAG
CAGACAAGGGAACTAGGCAGAAATCGTTTAGGGCTCTCCTTCCTTCGCCTCCTTCCCCCTCCCTTCCTCT
TCATTCTTTCCCCTTTCTTTCCTCCCTCATTCCCTTCCTTCCTTCCTTTCTTTTTCTTATTTTTTTTTTT
TTTTTTTTTGCACAGGATAGCCCAAAGTCACTGGCCAGGGTGCCAAGATTATAGGTGTGTGCTACCATGC
GTAGTTTAGGACCATTTTATATTAAAGTGTTTTTATGTACTTATGACATAATTTTATTACCATAAACTTA
GACATAATATTTGCTGAGGGAAAACACTAAAATATACTTCACCAAAGTAAAAAAGACATCTTGGAGTTTA
AAAAAATACTTTAATTTCTTCACAAATATAGAGTCTAAGGACTGAAGTCGTGCCAGTTTTTATGGTTATA
GCAACAATCATGCCATGGTAGGAATGGGTAGCACATGCCCAGTGCTGTTGTTTCTTCTATTTTCACAGCA
GTCTGGGGGCGGGGGGGGGGCTACATCCCTCGCTCCTGTGGTTAAATGTCCAAGTGGCAGCTTAGAAGGT
AGAGTTTGTCTAAGACCACCCTGCAGTGCCTGTTTCTGATCATCCAATCTCTTTGGCTCTCCCATGCTAA
CACTGAACTGTTTTTGTTTTTGTTTTTTTAAATTTCAATTTCTTACTCAGAAACTCTGGCTTGCCCCCAG
TTAAACAGGGTGGATTTTCAGTTTGTAGAATTCGAATCTTTTCTCTTTGCCATCTGAGGGTGCGTTGTGA
TTTTCCAAGTATTTAATGGTGGTCTCTAGTTCCTTTTTACTCTTTGTATATATGAAGTTGTATCCCTGTT
GGCAAAGTGAATGGCATATCTGTAAGGACAGGAATGTCCTGAGTGGTTCAGGGAGAAGTTCTGGGTTTTG
ATGGGATGTATAATGTGATTTATTTATTCATTTCATAACTCTTTAAAATGTGTTGGATTTAGTTCTGCGT
GGAGGTCCTCTCACTGGGAACTACAGGTTGCGGCAGTTCCATTTGCACTGGGGGTCAGCAGATGATCATG
GCTCAGAGCATGTGGTAGACGGAGTGAGGTATGCTGCAGAGGTAAGCCACGCACACACTGCCTAATCAAT
ACGGGATGCCTTCCATAGCCCCAGCAGAGCCTCAGCTACTCAGGCATCCCACTGTAGGGGACAGCTTCAT
TAACTCAGCAGGAAAGCTTCAAACAGGGTCTTTCATAGCCTTAAACCAAACCTGAAACCTTACTATTTAT
TATACATTTAAGATGAGTAGACTGAGCTTAACATGCTGTAACATGCCTGTGATCCCAGCATTTGGGAGGC
AGAGACAGGAGGATCAGGACTCCCAGGCCAGCAGCCTAGGATATATGACAAGATGCTATCTGACCAAACA
AAGTCAAATGACACTAACACCAAAAAATAACAAGAAGTACTTGCTGGAGGGCGTGGGATGGAAATCAGAG
ACTGGAAACCATTAAGTTATTTATCCAGCTATGAAACATTATGATGAGTTTATACAACCCCTATTTTGTT
ACGTGAAACTTAATCTGTTGGATTTTCTGAAAGGTCAGAGAGAAGAGAAACATTTGCGTTATGTTAGCTT
TGTGTGTATTTGATCCAGACAAATAATCAGAAATAAATAAAGCTCACATTCTATACATGACAGCAGTGGC
ACTTGGATAAACTGTAAGGGTACAAACTCCAGATTGCATTTGCAGGTTTCTAATGCAACTCTGTGCAGTA
TTCACAACACTGATAAACAGCACAAACAATGATCATTGTCATGCTTACTTTTTGCTGACAAGGTACTCCT
TTTTGATATAACAACATTCATTAGGAGTCCTCGGCTTAGTCTAATCCTCTGTGTGAAAGACAGAGTGTGA
TATACCTCATTTTAATACCATTAAGTAGCGCTGAGCTGAACTTTACCCCAAAATGAAAGTCACATCTCAG
TGAAAACTCTTGGAGTGAAACACTCCTGGCATGTGATTTCTTTCTACAAGACCGAGCGTTACCACGACTT
ACATACTGTCTTCATCTTCTCACAGTTTTGAGATGAGGTTTGATACACAGAATAGTTCTGTTGTTCAGAA
AATCCAGCAAATGGAACTTCTTTTCTACTCTGATATGTAGCTGACCTTTGAGGTTGCCATCCAACATGTT
TTTTTGGCTAGTTATTTCAGTTTTATCTAAGTGTTTTTATTGCAGTACCTGCTCTGTTCTCAGGAGAGAG
AGGGGAAAGTGATAGGCAGTCTACTCTCTGGCAGCAGCGGTAGTGGTGGATCTGTGAGAAAAATCTAGAC
TCAGAGTGCCCTTCCAGGGAAAGGGACTAGTAAGGGGAAGTGCTATGCAGTAGGAATGAGTTCAGCTTGC
TCACAGAGAGAAAAGCTTTTCTGTATAGGAATGGTACTGGTAAGAGAGAAAGAGGCGTGGACCCTGTCCT
GCAGAGCAAAGCCCTGCTCTGCTTTCTGTTATCTAAAACATATCTGACTGCCAAGTGGAGAACACAGGCC
ACTGTGGGGCAGATGTTAAAGGAGGGAGACAAAGTAGATGACTATGGAAGACTTGAGGTGAGCAGTGATG
GTGATTTGGGCAGGAATGTGAAGGCACTGGAGAGGGCCAATACATACTTGGCAGGCCATATCAACAGGAC
TTGCCTATACCAAGGATGCCGAGCTCCAGCAAGCTGTGTATACAAACCAGGATTTTAAAGAGGAAGTCAT
GGTGCTTTATCATAGCAACAGAAAGTAACCAGTACAAATATATGTATGCAAATATAAAGACTAGGCTAGT
AGTCCATATTGAAAACTGTATTTCTTATGGTTTGTCTATCATTGCTGTATGTTAGGTCTGAACTATAATC
CACAAGCCCATGTATCAAAGGCTTCTCCAGGGCAGTATTACTGGGAGGCTGATGAACTTTGAGAGGAGTG
GCCTCAAAGGAAGTCCTTAGGTCATTCCCATGTGCTTTTGATGGGATGGTAGGATCTTGCCCCATCATGG
GACCTTTTTACTTCCTGGTGATGAGGTATTCAGTCTCCCAGGCACTGCACCTGTGATATGCTACTTTGCC
ATTGACCAAAAAGTCAGAGGCATATACTGAGAACTTTCAAACTCAGAGCCATTTCTCTTTGTAAGTTAAT
TATCTCAGAACAGATGAAAAGCTAATATATAAATATAGGAGACGCATAAATCAGATATCCACACTCGTGA
TAGATTTTTGTCATAGTAATTGGCAGCATGTTTTGAATATCACAAGCATTCAGCTTAAAAATGCTTAGGT
GAAATAGTACTATTATTTATAAAGAACTTTACCAAAAAGGAAAAAAAAAATTCTGTTTTGTTCTTAAACA
GAGTCTCACAATGTTGCTCTGGATGGTCTGAGACTCATTGTATAGATAAGGGTGACCTAAATTTTGTAAC
AATCTACCTGGATCTGCTGATGCTCAAGTGTTGAAATTACAGATGTGTGCTACTACTCCGGGAGGGAAGA
ATCTTCCTCTGATAATTGTGAGGGCTAGTTTCCAGTCATCCATCTGACTCGATGTTCCTGTTAGTCAGGA
AGTATGCAGTTGTTAATTTGTTTACTTTTAACGCAAAAAACACCAATATAGAAAAGTGATACCAATTTCT
CCTAAGGCTATGTGAGAGAGAAGAGGGATTTACTAAAAACAGATTTTCTTGTTCTGGTTTCTCGTCATAT
TTCAAACAGTTATTATTTAGCCAGTAGAAGGATGTCTACACAGGAGACTTCCTTCTCTGTATTTATATAC
TCATTTCATAGCCAGTTGTGTTCCTGACCCATTGATGCCATTTCTCACTAAGAAAGCTATTTAAGGAGTT
GTTGTAACTGGCACAGAGCCATTTGGAATAACTTGAGCGCTCTCCCTGGCCCATCCCCACAGTGGAACGT
TCTTTATCTCTCCTGAGCCATGGGAGACTTGTTTTGTCATCATGTTTTCAGGGTTCTTTCCTCCCCCAAC
TATCTCACACCAACATAATACAGAACCCACCTTTGTATGTTTCTGTCTGGATATCACTTCGTATCCCTTG
ATTATACATGGTTGTTGGACTGTTTTATAGTTTTATAGTTGACTATCTGTGATAATTCTTATCTAACCAG
AAACTCTTCATATTCGTTATGTGGAGTAAGATTTTGAAGGATAGAGATAAAAGTATTTATTTGTATATAC
TAGATCATCTCTGTGACTGAGGGGAAATAGAGCATGAAAACTGAGTGAGTGCCCCTTTTTCAATTGCCAA
ACAGATACATAAGGATTCTTATCTGAGGTGGTCCCTGGTATCTTTGCTTGTTACAACATGGCCCAGCCTG
CAACATTTACTATAGGAACTAAATCCTCTAGGCCTGGCATATTGCCCTTTGGCTTCTCTGTCCTTCTTTC
AAGCGGAACTGAACTGGTAGTCAGTGTGCTTACTCAGCCTTCTCTCGTATTCCTCTGTGTTTGGGATACT
CTAGTGTTCATGGGGTCTAACAAGAAGGCTTTCTTTGGGTTTTGCAAATTTCTGCTTGTGTGAGCACCAG
CTGCTTCTTTTCTTGCTTGGACACCTTTGCCTTTTTGACCCACAGCAATCATATTTGTTCTTGGCAAAAG
ATCTGAGTCTATTCATATAAGGTAGAAAATGTAAACTGCCTATGCGAGTCAGCTCAGTATGACCATGGGA
ATGATGTACCCCTACATTAGAACATTGCACATAAAAACAAACTAATGCACATTTACCGTATGCAATTATC
ATTCAATAGTACAAATGATCTAATAATAAAAGCATATGACTAGATCTAAAATAGTTTATCATAAGGGGAT
GCAAATTCCCCAGCCACAAAAGTGAGAGACTGCAATGAGGAACATCTAGCAGGACAGTTTCAAGTGAAAC
CCTGTTACCCTCCTCTGCTACTTTACGAGGAAGTTGACTTTCTGTAGAGCCCAAGCACCTAGGTGGGTTC
TATGGGTAACTGGTATCTGAGTCACAGCGACTAGTAGCCCATAACCCTTCTGGTCTCATTTCATATAAGA
GTAGATTAGGGGGAATAAAGTCAGTGTCTGGATGAAGGAGTCCCTAGGCACTTTATCATTCAGCATCACA
TCAGACAGTTACAGCAATATTAGTAGCATTTCTATTTTTTGTCATGCTTATACAGATGTTTGAATTATGT
TATGTGTTTTCTTTTCAGCTGCATGTTGTCCACTGGAATTCAGACAAATACCCGAGCTTTGTAGAGGCAG
CTCATGAGTCCGATGGGCTGGCTGTCCTGGGAGTATTTCTACAGGTGAGAACCCACTGTTTGATTTTAAA
TAGCCATTTAACTAGTTTTAAATAGCAAACTAGATCTGAATATAGTACTTTCCCCTTGAAGTGAACACTA
TAAAGTTCCATACTAGTTTAGGGAAAGGGTCACTTTTTTCTGAATTTCCAGTTGACTATGTGAGTAGCAA
CTGCCACGCCAGCAAGAAAGCAGCAGAAGGAACAGCTGAAATCCCAAGAAGAAACCTAGGGGCTTCTGGT
TCCTGACTTCCACATGGAGAGCTAGAACAACAGAGCATTCAGTTTCATGGTTCTTGTGGCACTTGTTTGC
CCCTGTTGGCAAATCATCTCAGAAATCGTGGTCACTTGTGCGATCAGCAAGTTCTGTCAGCATGCTTGGG
AACAGTTCCATACAGGGCGTGCACTGTTTCCATGCCTCATAATCTGTGTGATGTTGTAACTTGTGGAACA
GGAGTGGCGCTGAGAGGCAAAGACTGGGAACGATGTGCCAAGCAGAGGCAGCCAGGATTTTACCCTTGAA
ATCTGGGTGCTAGCAACAGGATCCAGGAATGGTGGGAGAAAATGCTTGACTTTTATGGGGTTTTATACCT
TTTGGGGGGGGGGGTTGAAAATGTTCCTATTAATGAAAGGTGTAAATTTTATGTATTTGTGTATTTACAA
TGCGTATGCTTTTCAGGGTGGAATGCCTTGATTTGGAACTTTAAGAAACTTGGGGCTGCAAGTAGGAGAT
CTAAAATTTCATGGAAGAGTTGAGGGCAGCTCAGCCAGTCTGGTTCTATATGCCACAGCTGGTTTAATAG
TCACTTCCCTAAGCAGGGTTTCTTTCAGTTAACCTGAGTCTTAAACATGGCTCAGCAGTTAAGAGTGCTT
GCTGCTTTTCCGGGATACCAGAGTTCAGACCCTAGCCAGATTGCTTACCAGTGTTTGTAACTCCAGCTCC
AGAGAATCTGACACCCTCTTATGTTCTCCTTGAGCTTCCACATAAGCTCATACACATGCATGTCTGAAAC
ACGTGAAGCTATTACTATCAGCGTTGGAACTAACCTACAGTGCTATTCCCATAATGCTATCTTGTTCAGA
CTCTTCTGGCACAATCAATCTGTCAGGTAGAGGAGAACCTTGTTCTACATTCACTGTAGGCTTTGAGCTG
ACTCTGGCTTTTAGAAAATAATGAAAATGTAAGGATTGAAATGAAATGCTTGTTGCTTGTTTACTCCTGT
AATTATGTCTGTTTTGAAACTTTACACTTTTAGATTGGGGAACACAATCCTCAACTGCAAAAGATCACTG
ATATTTTGGATTCCATAAAGGAAAAGGTAAAATTAACTACTGTTTGTTAATGACCAATATTTTTCTACTT
TCCTGAATTTTGAGCACTTACACAGTAGACATATCATATCATGCATTATTTGAAGCAAGTTTCAACTTAA
CAGACCCAGACTGCAGAAATAATTTATTGCCACATACCTTTTCAGAGTTGTGAAGAGCCTGATATTATCT
ATAGTAATCACTAATAAGTCTATGCAGATTTAAGTACCAACATAATAATTTTATAAAAAAAAGAAGTAAA
TTATAACTTACTTAAAAGACTACTTATATAAAATAAGATTCTGTTTTTTTCCTTGACCTGGGATCTCTCT
CCATATTTCACACTAGCCTGTTACTCCTTCTGGAGCCCAGGCTGAGCCTTGAACTCATGACCCCCTGCCT
CTGCCTGTTGACTTCTGGGATTATAGGTATATGCCATCATATCTCACTCTATTGTCCTTCTATAAATCTA
TAGAATTTACAACTTTATCTGTTCTTTTTTGAGTTAAAACAGAAATTTGTTTTACTAAAATATTGATGGA
TGATAGTAATTATACAGTGAATGTGTGTGTGTCCGTCTGTCTATCTTATTTGTAATCTGTAGCAATTCTC
TTTGTTTTTCCAGGGTAAACAAACACGGTTCACAAATTTTGACCCGTTATGCTTGCTTCCATCATCTTGG
GACTACTGGACATACCCTGGCTCTCTGACAGTTCCACCTCTTCTTGAGAGTGTCACGTGGATTGTTTTAA
AACAACCTATAAGTATCAGCTCTCAACAGGTATGTTCATTCTTCCAAGTTAATTGTGCTGCTATCAGAGG
AAACTTCTATGTCATTTTTAAAACACTGTTTATATTTCTGCCATATTTTGGAGTCTGACATTTTCTTTCA
TTAATTAGGTGAATGGTTAGACTAGATAAGGTTCATGTCCTCTCCCTCCTTTTGGACTTTCCCTCCTTCC
TTTGTTTTTTTTCTTTCTTTCTATCAGGTCTTTCTATGTAGCCTAGGTTAGCCTTGAAATTGGGATCTTT
CTGCTGTAGACCCCCAGGCACTGGGACGACAGGTCTGCCACCATCGAAGGCACATGGATTTGATCCCTTT
TTAAATTGCTCTTACTGAATCACTGCTCAGAAATGTTAGATGCTTAAACTTTAAGTGGTTTACAACCCCA
GAGGGGAGTTTGAGTGTGGGATGGCAACCTCATCCCTCACTTGGTGCTGTGTGTCTTTCTGCTGGAGGTG
GGCTCTATAAGTTTCCTCTCCCCATTGTCAGGCATTTCATCTAAGGTACCCAACTTTGAGTCCTGAGAGT
TTCTCACCTCATCAGTTTCTCATCAAGTAAATCAGGTCTCTGGTACTTTTTGGGGGGGTCCCCCCCAACA
TCCTATTTCCTGAGGTTGCCTGTTTCCATTCTTTCTGCTGGCCCTCAGGTCTTCAGTCCTTTTCCCCCAC
CCAATACCATATTATGTTCCCCTCTTGCAACCCCCCCACCCCATCCCCTTTCCCTCTCAAGCCCCTCCCT
CTCTCCCTCCCCCCTTGTGATTGCTATCTTCTCCCTCCCTCCCAAGTGGGATTGAGGCATTATCACTTGG
GCCCTTTTGCTTGTTGACCTTTTTGAGTTATGTGGACTGTATATTGATATTCTGTACTTTTTTTTTGGCT
AATATCCACATATTAGTGAGTACATGTCATGCAAGTCCTTTTGGGTCTGAGTTACCTCACTCAGAATATT
TTGTAGTTCCATTCATTTTAAAAACATTTAATTCTGTAAAAATTTTACTTGTTTTTATTATCCTATGTGT
GTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGG
GAGAGAGAGATGTGTCTGTGTGGCCCTCTATGTATATGATAAGTGTGTATGTGTGTGTGTGTGTGTGTGT
GTGTGTGTGTGTGTGCGTGTGTGTGTGTGTGTGAATGTATGGGGGTGTATATATGCCCCACTGTGCATGT
GGATATCCAAGGACAACTTTGTGGAGTTGGTTCTCTGCTTTTACCTATGTGTGTGTTATAGGGATTGAAC
ACATTTCATCATAGCCTTTACCATCTGAGCCATAGTCCCAGCCCTGACATGTTTTTTTCTTTTCTTCTTT
CTTTCTTTCTTTCTTTCTTTCTTTTTAAATGGGTTCTTTGTGAGTTTCACATCATGCACCCCAGTTTTGC
TCATCTCTGTCTTCTCATTGCTGCCCTTCACCTTATAACCCCCGACCCCCACCCCACCGGAACCCCATGA
GTTATTAGTCTAGTTCAAGGTCTCTGGTCTCAGTGACACCATCACTACTTAATCCCCACCAGGCTCCTCC
TGGTTATTCTGCAGTTGCCTGTGTCATGGAGATCCTGCAGCTTGGAAACAGCAGGCCTTTTTACGAATCT
CATATGCTCATAGATGATACAGATTTTGGGGGTGGGCTAACCAGAGACCTGGATTTTTGCCAGGGTAGGA
ACAGAGCCACTCTGTGTGCAGGCCTTCCCTTATTTGCACCACCAGGGTGAACTCTCCAGCACTATTAAGG
TTAGGCCACTCAATGCTGCCATTGGCAAGAGGCAGCTCTCCTGCTTTCATGGCTTGGCACGAGGCACCAG
CACCTATGCCTTCAGAGCCATCTCCACTGTGCTGCCCAGCCAAGGTGCCCAGCCCACTCTCCCAAATGCT
ATAGTGGGCAGGGCTAGCTTTTCTGCTCTCAAGTCCTCAGGTCTGCTCTTCTGACTATTGCAGGTGATGA
GGGACAAGAGGGGGGAGGATATTATCACCGTATCCATGCCACCACTGAATGGCAGATGAGGGACTACTGG
CAGGGCCAGCTCTCTGAGTTTTCACTCTTAGGGCTGGCTCGCCTGCACCTCCACCACCAGGGTCAGCTCT
GCTGTGCAGTGCCTGCTTTCCCCAGTGCTGCAGCAGGTGAGGGGCAGGGTTGGATCTCCTGAGCTCATAA
TCCTTTGGGTAGCTTTGCCAACTGCCAGAGGTAGTGGTGGTGGTGGGCAGGGGGATATCACCTATTTGCC
TGTGCCGGTTCAGGCAGAATAGTGGCAGGGTTACTCACACCCTGCTCTCAGGGCCAGCTCCACTGTGCTG
CCTGCATGAGGTGGAGGGCCATGAGTGTTGCCTCCAGTGAGAGATAGGGCCAGCTCTTGAGAGCACAGAA
TACAGTGAGGGACAGTTATGTCCCTGTTAGAAGTCTAGTGGACTCAGACATGCCCCTCAGTAGCAGGTAA
GTCTGGGACCTCACCATGGCCCCAGATGACAGGGCTGGCCCTCCCAACAGGCTACTCTTCTCTGCCCTTA
CGTCTCCAGTTTCATCTCTCTCCATAATGCTCAAGTTGCTCCATGTTTCTTTCTCCCACATCTGATCACC
ACATACTTGCATATTGTAGTCATTTGGGGAATTAGATTAAATAACATAGTGTAAAGAACTTTAAGCACAG
TGTCTGGATCTCTGTGTTCTAGAAGAGAGCTTATTTTATTAGTACTCAACTTTGGCTCCAGTGGAGAGTT
CTTAAAGATGGCTGAGACAAGTGTGACACAAAATTACTTAGAGGACTTTGCAAAAAAAGGATTTTGTCTT
GCTGGGGCTGCTATTCAAGGAAATGAAGATCTTAGTCGTTGGGCCCAGGAAACCAGCAAAGCAGGTCACA
CTTTGCTCAGCCTCCAGGCTGTACGGAGATGAACCTGCCAAGAAGGGGTGGGTGCTGAGTCAGCCTTGGT
GGGAAGGGGGCAAGTTTCCTGCCTGAATGAGCCTGTGCCTACGTGAGGGATAAGGTATCTGAGCCAGCCA
GGTAGGTCATGAAGCCAAGAGAAACTAACCTCAACAGGGCTTGGCATGTTCTCCCTGGCTGGGCCAGGCA
ATGGGGAGAGTACTAAGGCTTAGGGCTCTTAGCAAATGTGCAAGCTGGTAGAAGAAAGTTCTACGGAAAG
ATGCAATTCTGCATGGGTGATAGAGAGGTAGGGATTTATGACAAGCTTCCGAGGAATCTGTGTGTGTGTG
TGTGTGTGTGTGTGTGTGTGTTTGGTTGTGTGTCTGTGGGAGCAGTGTCTTCTGAGCAGCTGCATTCCCA
GGACCATCACGTGGACTGGAGTCATGACCAGGGTTACTTTAGCCTCTTTTGCTGGATTTCACCATGAGTT
CTTCCTCATTCGTCCTCTGTGTTTTCAGCTACAATGATCGTAGAACTTATGACGAATTCATAAGTTGTGA
TCATTTGTCTCCTCATTCCCATGTGTGGGCTCTGTGAAAAGACATGGCAGATTCTCATTTTTGAAAACAA
TAATCAGATTCTGCATCCACAGGCCATGGTTGTAAAGTGCTGTATTAATGGTGAGAACCGCTTTCTTCTC
TGCCTCCCTCTTATCTGATACTGTCCAGGAAATGAAGAAGGATGGAAGCCTAACTGATATGGCCTGAGGT
TAGGGGACTTAAAATTCATAGAAAATAAAGGCTCTCAACCTGACAGTTTACTAATTCCTCTCTATGGAAA
CACTGCAAACTCAAAAGAAACAACAGACCTCGTTCTAATATGCAGTATATGTATGCTTTTAGAGAATTTA
TCCAATCTCTATCACTGTAGACTTTGCTAAATCTTATTAAACAATACTGAATTTCCCCAAATTACTAGAG
TATTAGAAATCAAAATTATAACAGACTATGTGAATAGTGCTTTGCAGCAACTACAAGTAGTGTATAAAGT
TATATTTATTGATATCCAAAGATGTTTATAGTATATTATGTAGAAAAAGGAGATATCAAAAATGAGGTAT
ATTTGAGCACATTTTTGTAATAAAATATGTCAGATGTATGTTGTAGAGAGGGGGTGTATAGAAAACAGTT
CTGCAAATCCCAGTTTGGACTGTTCAGAGCACAACATTCTTTTAAAACTTTGATCCTCAAGTGAAGAACG
TTTATATACTTAATTTTGGATTCATTGTTATTTATATGGCAAAGAGAATCTAACAGAGCAATTCTTTATG
GTCTGTGACCTATAACTTTGAATTTTTACATTGCATTCGTTTTAGCTGCTGGAAGAGTAAAGACTATAAC
TCTTTCATCTTTTCCACGAAGTTCATTAAGATTGGTGTGACTTTCTGTGGTAAATTAATTCTCCTCTAAT
TGTCCACAGCTGGCCAGATTCCGAAGCCTCTTGTGCACAGCTGAGGGAGAGAGTGCGGCTTTTTTGTTAA
GCAATCACCGTCCACCACAGCCCTTGAAGGGCCGCAGAGTGAGAGCATCTTTCTATTAGCAGTCACCAGT
GGGTCAACCCAATCGGAACACGGAGGTAGCAAATACAACGGAACTCAGACATTCCAATAATGGCTTTTCG
AGAATTTCACGTTTGTGGATTCTACTTGTCCAGCACCTCTGGCACGGCAGAGAAAACCAGAAGTCTGAAA
TAACTTAGCCCATCACTCCTAGATTTGCCCCAATGTATGTCCAATTGCTAAATATGGGATGTAATTAAAA
TCACAAAGTATACCTGCTTCAGCCTTCCTGACAATAATGTCAGCCTTACCAACCTCAGACTGTACTAAAC
TTTATGGTGGGCTTAGACTGAGCCTATCCCATTCTAGATAGTGTTTGATAAAAACTTTAAATTCACTTTG
AACTGATATTATTCCCAAACAAGCAGTTCTTACAGTCTTGATAATTTTCTGATTAATCAAGAGTATATAT
TTCCTTTAATACATTTTCTCAGATTCTCATTTTATGTACTGTAATATAGCACATAAGACAAAACACACAC
AGACTAGGATAGAACAATGTGGCTACTCCTGTGATTAAAGTAACCTACAGTTTTAGTGAAGCATTCCTCA
GGCTAAGAACAGCTTTTTAAGACACTATTCCACGTAATATATTCACCCAAGAATGTTAATGACTACCAGG
GTGATGACATAGTGTGAGGCTCATGATATTAACGTGATTCAGACCAGCAATGTATACGATACCACTGCAG
CAGAACTGCCCCGAGCTGGTGAACAGCTTCCTACAAACAGAGTGGGACGCTATCCTATATCTGCTGTTTT
TTCTGTCACCCATTAAAAAGATGAACCACGTCTTGC




More information about the spug-list mailing list