crossroads-2.81/0000755000175000001440000000000012130034075012517 5ustar httpuserscrossroads-2.81/xr/0000755000175000001440000000000012130034076013151 5ustar httpuserscrossroads-2.81/xr/etc/0000755000175000001440000000000012130034076013724 5ustar httpuserscrossroads-2.81/xr/etc/make.help0000644000175000001440000000114712130034072015512 0ustar httpusers Make what? Choose one of: make local - local program construction, creates program xr/build/xr make localprof - with profiling info make localmem - with memory debugging info make install - installation to BINDIR (default: /usr/sbin), manpages under MANDIR (default: /usr/share/man/) make uninstall - removes installed files make clean - cleans up build artifacts make tar - packs sources in an archive under /tmp make commit - commits to repository, maintainer-only You can overrule the install path as follows: BINDIR=/my/programs/dir MANDIR=/my/manpages/dir make install crossroads-2.81/xr/etc/e-ver0000755000175000001440000000320512130034072014664 0ustar httpusers#!/usr/bin/perl use strict; use Getopt::Std; # ChangeLog # 1.03 Revamp to Perl. Support for RPM's spec files. # 1.02 -V shows more info. # 1.01 -V flag implemented # 1.00 First version my $VER=1.03; my %opts; # Show usage and stop. sub usage () { die ("\n", "Copyright (c) e-tunity 2000 ff. All rights reserved.\n", "Contact e-tunity for more info.\n", "Usage: e-ver file(s) VERSION\n", "The files are checked for ChangeLog-style entries or RPM-style\n", "entries. The stated versions must match VERSION.\n\n"); } # Check a version in a file. sub checkversion ($$) { my $f = shift; my $v = shift; open (IF, $f) or die ("e-ver: cannot read $f: $!\n"); while () { chomp (); if (/^[0-9]/) { # ChangeLog style entry. my $curver = sprintf ("%g", $_); die ("e-ver: ChangeLog-style version $curver is not the\n", " required $v. You should probably update $f\n") if ($curver != $v); close (IF); return; } if (/^Version: */) { s/^Version: *//; my $curver = sprintf ("%g", $_); die ("e-ver: RPM-spec style version $curver is not the\n", " required $v. You should probably update $f.\n") if ($curver != $v); close (IF); return; } } close (IF); die ("e-ver: failed to find version ID in $f, cannot check\n"); } # Main starts here. usage() unless (getopts ("V", \%opts)); if ($opts{V}) { print ("$VER Version ID Checker\n"); exit (0); } usage() if ($#ARGV < 1); my $version_to_check = pop (@ARGV); foreach my $f (@ARGV) { die ("e-ver: no such file $f\n") unless (-f $f); checkversion ($f, $version_to_check); } crossroads-2.81/xr/etc/usage.txt0000644000175000001440000002414212130034072015570 0ustar httpusers This is XR, a load balancer and failover utility for TCP/HTTP services. Usage: xr [flags], where the flags may be the following (long versions may not exist on your platform): --add-server-header HDR, -H HDR Inserts HDR into back end bound HTTP messages. The header value is appended when a pre-existing header is present. --add-x-forwarded-for, -x Adds X-Forwarded-For with external IP address to back end streams in HTTP messages. --add-xr-version, -X Adds an XR version header to client and back end streams in HTTP messages. --allow-from MASK, -a MASH Allow only clients that match MASK. MASK is e.g. 192.168.255.255, which would allow the class B network 192.168.*.* --backend ADDRESS:PORT[:MAX[:WEIGHT]], -b ADDRESS:PORT[:MAX[:WEIGHT]] Specifies a back end, use multiple -b... to specify several back ends. At least one backend must be given. Specifier MAX is optional: when given, defines the maximum connections for the back end. WEIGHT is optional: when given, specifies the weight (bigger means better server, default 1) --backend-check METHOD, -g METHOD Defines how back ends are checked. This flag must be specified PRIOR to defining back ends with -b... The checker will then apply to all next back ends. Alternatives are: connect:IP:PORT - successful TCP connects at IP:PORT indicate that the back end is alive. When IP is not stated, the back end's IP is assumed. get:IP:PORT/URI - A HTTP GET is sent to IP:PORT/URI. When an HTTP status 200 is seen, the back end is assumed alive. When /URI is not given, then "/" is assumed. external:PROGRAM - The PROGRAM is called with the arguments "IP:PORT", availability as "available" or "unavailable", and the number of connections. The program must echo 0 to indicate that the back end is alive. The default behavior is a TCP connect, to the back end's IP, at the back end's port. Use "--backend-check connect::" to reset previous flags to the default. --backend-timeout SEC, -t SEC Defines network read timeouts for back ends, default 30 sec. Use 0 to prevent timing out. Use "--backend-timeout RSEC:WSEC" to specify separate timeouts for reads and writes, default 30:3. --buffer-size SIZE, -B size Sets the network buffer size, default is 2048 (in bytes) --checkup-interval SEC, -c SEC Defines the back end checking period. Each SEC seconds, every back end is checked whether it is alive. Default is 0 (off). --client-timeout SEC, -T SEC Defines network read timeouts for clients, default 30 sec. Use 0 to prevent timing out. Use "--client-timeout RSEC:WSEC" to specify separate timeouts for reads and writes, default 30:5 --close-sockets-fast, -C Sockets are closed faster to avoid TIME_WAIT states. --debug, -D Sets debugging on, more verbosity on top of --verbose --defer-time USEC, -u USEC If a connection is going to be deferred due to hitting the "soft" rate (see --soft-maxconnrate), then this option sets how long the deferral will last, in microseconds. Default is 500000 (0.5 seconds). --deny-from MASK, -A mask Deny clients that match MASK. --dispatch-mode METHOD, -d METHOD Defines how to dispatch over back ends, the method may be: f, first-available - first live back end gets all traffic e:EXT, external:EXT - external program EXT is queried h, strict-hashed-ip - client IP is hashed to determine a back end, the client is denied when back end is down. H, lax-hashed-ip - client IP is hashed, fallback to least-connections when target back end is down l, least-connections - back end with least connections is taken r, round-robin - back ends take turns L, weighted-load - randomly picks from back end with favor given to backends with lower load average. (NOTE: load average must be updated by the backend, e.g. using the web interface). s:SEC, strict-stored-ip:SEC - if client connected before within SEC seconds, then the same backend is used. Client is denied if that backend is down. Else a new is found by least-connections. S:SEC, lax-stored-ip:SEC - same as strict-stored-ip, but falls back to least-connections when a previously used back end is down. Default method is l (least-connections). When external mode is selected, program EXT is started with arguments (b0 repeated for all back ends). Here is the back end definition, eg. "10.1.1.1:80"; is "available" or "unavailable", is the nr. of connections. The program must reply with a back end number (0..max) on stdout. --dns-cache-timeout SEC, -F SEC DNS results for back end hostnames are cached for SEC seconds. The default is 3600 (1 hour). Use 0 to suppress. --foreground, -f Suppresses forking/threading, only for debugging. Also suppresses wakeups (--wakeup-interval), checkups (--checkup-interval) and the webinterface (--web-interface). --hard-maxconn-excess PROGRAM, -E PROGRAM When a client exceeds the hard maxconnection rate, PROGRAM is invoked with the client's IP as argument. The program may e.g. invoke iptables to block the offending IP. --hard-maxconnrate MAXCONS, -R MAXCONS Sets the "HARD" maximum average number of connections per IP allowed within a given time period (see -U, --time-interval). If a particular IP exceeds this number, then their connection is immediately closed. Default is 0 (disabled). If both the "soft" and "hard" rates are set, and the "hard" rate is lower than the "soft" rate, then only the "hard" rate is obeyed. --help, -?, -h This text. --host-match HOST, -M HOST Subsequently stated backends only apply when clients request a matching host. Only available when the server is in http mode. --log-traffic-dir DIR, -l DIR Log passing traffic with dumps in DIR. Only for debugging, slows down the balancer. --max-connections MAX, -m MAX Sets the maximum number of connections to the balancer. Default is 0, no maximum. --onend CMD, -Z CMD Runs CMD after successful termination of a client. For the arguments of CMD see -y. --onfail CMD, -y CMD Runs CMD when XR fails to connect to a back end. The arguments to the command are: the client's IP address, and the back end address. --onstart CMD, -z CMD Runs CMD just before letting a back end handle a client's connection. For the arguments of CMD see --onfail, -y. --pidfile FILE, -p FILE FILE is written with the process id of XR upon startup, and removed upon exit. --prefix-timestamp, -P Messages (verbose, debug, error etc.) are prefixed with a time stamp. --quit-after REQUESTS, -Q REQUESTS Stops the balancer after REQUESTS hits. For debugging / loadtesting. --remove-reservations, -G In stored-ip algorithms, outstanding reservations for expected clients are removed when no more back ends are available. --replace-host-header, -I Inserts "Host: " into back end bound HTTP messages. Pre-existing Host headers are overwritten. The value of is the server name as in the setting of --backend (-b). --server TYPE:IPADDRESS:PORT, -S TYPE:IPADDRESS:PORT Specifies the server. TYPE is tcp or http or udp. IPADDRESS is the IP address to listen to. PORT defines the TCP port to listen; when port is 0, XR will listen to stdin (inetd-mode, not available for udp). Default: tcp:0:10000 (TCP balancing, on all interfaces, via port 10000). --soft-maxconn-excess PROGRAM, -e PROGRAM When a client exceeds the soft maxconnection rate, PROGRAM is invoked with the client's IP as argument. --soft-maxconnrate MAXCONS, -r MAXCONS Sets the "SOFT" maximum average number of connections per IP allowed within a given time period (see -U, --time-interval). If a particular IP exceeds this number, then their connection is deferred (see -u, --defer-time). Default is 0 (disabled). --sticky-http, -S Enables sticky HTTP sessions by injecting XRTarget cookies into HTTP streams. Only effective with "--server http:...." --time-interval SEC, -U SEC If either --soft-maxconnrate or --hard-maxconnrate is specified, this option allows you to specify the time period to which those numbers of connections apply. For example, "--soft-maxconnrate 200 --time-interval 60" would trigger the "soft" limit on any IP attempting more than 200 connections in any 60 second period. Default is 1 (second). --tryout, -n Validates all flags and stops; does not start the balancer. --url-match URL, -j URL Subsequently stated backends only apply when clients request a matching URL. Only available when the server is in http mode. --verbose, -v Increases verbosity, default is silent operation. --version, -V Shows the version info, and author/maintainer contacts (for reporting bugs). --wakeup-interval SEC, -w SEC Defines wakeup period (rechecking) in seconds, of unavailable back ends. Default is 5. Use -w0 to suppress. --web-interface IP:PORT[:NAME], -W IP:PORT[:NAME] Starts a web interface on specified IP address and port. The optional NAME is displayed. --web-interface-auth USER:PASS, -Y USER:PASS Access to the web interface will be protected by basic authentication. XR's errors and warnings are sent to stderr, debugging and verbose messages go to stdout. Invoke XR daemons using something like "xr --backend ... [other flags] 2>&1 | logger &", or use xrctl. Send signal SIGHUP (-1) to write back end states to the log. Send signal SUGUSR1 (-30) to toggle verbose logging. Send signal SIGUSR2 (-31) to toggle debug logging. Other typical signals request termination. crossroads-2.81/xr/etc/firstav.pl0000755000175000001440000000102312130034072015732 0ustar httpusers# firstav.pl - sample "first available" dispatching algorithm, # implemented as an external Perl program #!/usr/bin/perl use strict; print STDERR ("firstav.pl: Invocation: @ARGV\n"); my $n = shift (@ARGV); for my $i (0..$n - 1) { my $addr = shift (@ARGV); my $av = shift (@ARGV); my $conn = shift (@ARGV); print STDERR ("firstav.pl: $i: backend at $addr, $av, $conn connections\n"); if ($av eq 'available') { print ("$i\n"); exit (0); } } print STDERR ("firstav.pl: Nothing available!\n"); exit (1); crossroads-2.81/xr/etc/c-conf0000755000175000001440000004544012130034072015022 0ustar httpusers#!/usr/bin/env perl use strict; use Getopt::Std; # Globals my $VER = "1.18"; # 1.18 [KK 2013-04-05] Added /usr/lib/arm-linux-gnueabihf for Raspberry Pi # 1.17 [KK 2013-03-15] /lib/x86_64-linux-gnu added for Ubuntu # 1.16 [KK 2011-10-10] /usr/lib/x86_64-linux-gnu added to the libdirs for # Ubuntu 11 64-bits. # 1.15 [KK 2008-10-12] Option "optflags" implemented. # 1.14 [KK 2008-08-22] c-compiler and c++-compiler attempt to find by # version, eg. '/opt/local/bin/g++-mp-4.2' is better # than '/usr/bin/g++' # 1.13 [KK 2008-07-15] Opimized subfiles() - way faster when nonrecursive now # 1.12 [KK 2008-04-15] Messaging improved upon -v flag # 1.11 [KK 2008-01-14] Added /opt/local/{lib,include} to the standard libs. # Also added /sw # 1.10 [KK 2007-08-29] Added libvariable01 and flag -l. Flags -l/L get # used upon libfunction/libvariable checks. # 1.09 [KK 2007-06-13] Added 'lib64' variants to libdirs, for 64bit Linux # 1.08 [KK 2007-05-22] -L{dir} shown only once for identical dirs during 'lib' # 1.07 [KK 2007-05-18] Flag -c for caching implemented # 1.06 [KK 2007-04-27] Added ifheader01 and libfunction01 # 1.05 [KK 2006-09-28] Flag -s (silent) implemented. Usage text updated. # 1.04 [KK 2006-09-05] C-compilers: gcc/g++ get selected first, instead of # cc/c++. Helps HP-UX ports. [Thanks, Bernd Krumboeck.] # 1.03 [KK 2006-07-19] 'subfiles' keeps track of visited dirs incase of # recursion. Testing is now by inode, used to be by name. # 1.02 [KK 2006-06-01] 'findbin' searches for .exe too now, for Cygwin support # 1.01 [KK 2005-09-29] Implemented context-sensitive help via -h. # Action 'header' implemented. # 1.00 [KK 2005-09-28] First version # Configuration my @def_headerdirs = ('/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include', "$ENV{HOME}/include", ); my @def_libdirs = ('/usr/lib', '/usr/lib64', '/lib/x86_64-linux-gnu', '/usr/lib/x86_64-linux-gnu', '/usr/lib/arm-linux-gnueabihf', '/usr/local/lib', '/usr/local/lib64', '/opt/local/lib', '/opt/local/lib64', '/usr/ucblib', '/sw/lib', '/sw/lib64', "$ENV{HOME}/lib", ); my @c_compilers = ('gcc', 'cc'); my @cpp_compilers = ('g++', 'c++'); # Globals my %opts; my $base; my @warnings; my $printed; my @headerdirs; my @libdirs; my @libs; my $cachekey; my $cacheval; # Show usage and croak sub usage { die <<"ENDUSAGE" This is c-conf, the C compilation configuration helper V$VER Copyright (c) e-tunity. Contact for information. Usage: $base [flags] header FILE.H [FILE.H...] Searches for directories containing the named header(s), returns appropriate -I flags. $base [flags] headerdir DIR [DIR...]: Searches for directory containing headers, returns appropriate -I flags. $base [flags] ifheader FILE.H DEFINE Searches for the named header. If found, a compilation flag -DDEFINE is returned, indicating that the header is found. $base [flags] ifheader01 FILE.H DEFINE Similar to ifheader, but the returned define is either DEFINE=0 or DEFINE=1 $base [flags] lib NAME [NAME...]: Searches for libNAME.{a,so,...}, returns appropriate -L and -l flags. $base [flags] libfunction FUNC DEFINE Creates a small program that tries to use FUNC. If this succeeds, a -DDEFINE=1 flag is returned. $base [flags] libfunction01 FUNC DEFINE Similar to libfunction, but the returned define is DEFINE=0 or DEFINE=1 $base [flags] libvariable01 VAR DEFINE Creates a small program that accesses variable VAR. If this succeeds, -DDEFINE=1 is returned. $base [flags] so-name NAME: Returns filename of a shared-object for NAME, e.g. libNAME.so $base [flags] so-cflags: Returns compilation flags to build shared objects $base [flags] so-lflags: Returns linkage flags to produce a shared-object library $base [flags] c-compiler: Returns name of C compiler $base [flags] c++-compiler: Returns name of C++ compiler $base [flags] optflags: Returns fast-code optimization flags. Optional flags: -c CACHE: settings will be dynamically determined unless present in CACHE; new settings will be added to CACHE -h: to show short help for an action, e.g. try '$base -h so-name' -s: to suppress showing of warnings -v: to show verbose messages -I DIR[,DIR..]: to add DIR(s) to the searchpath for headers, default searchpath is @headerdirs -L DIR[,DIR..]: to add DIR(s) to the searchpath for libraries, default searchpath is @libdirs -l LIB[,LIB..]: to add LIB(s) to C compiler invocations, when checking for lib functions or variables Meaningful output is returned on stdout. Verbose messages, warnings and errors go to stderr. ENDUSAGE } # Issue a warning sub warning { push (@warnings, "@_"); } # Show a message sub msg { return unless ($opts{v}); print STDERR ("$base: ", @_); } # Show help info if -h was given sub checkhelp { return unless ($opts{h}); print STDERR (@_); exit (1); } # Basename / dirname of a file. sub basename ($) { my $name = shift; $name =~ s{.*/}{}; return ($name); } sub dirname ($) { my $name = shift; return (undef) unless ($name =~ /\//); $name =~ s{/[^/]$}{}; return ($name); } # Get the uname. sub uname() { my $ret = `uname`; chomp ($ret); return ($ret); } # Find a binary along the path. sub findbin($) { my $bin = shift; my $bestx = undef; my $bestver = -1; foreach my $d (split (/:/, $ENV{PATH})) { my @cand = (glob("$d/$bin"), glob("$d/$bin.exe"), glob("$d/$bin-*"), glob("$d/$bin-*.exe")); msg ("Candidates for '$bin' in '$d': [@cand]\n"); for my $x (@cand) { if (-x $x) { my $ver = $x; $ver =~ s{^.*/[^\d]*}{}; $ver = sprintf("%g", $ver); msg ("Version of $x: $ver\n"); if ($bestver < $ver or !$bestx) { $bestver = $ver; $bestx = $x; msg (" .. best so far\n"); } } } } msg ("Failed to locate executable '$bin'!\n") unless ($bestx); return ($bestx); } # Recursively determine the files under a given dir. my %_dir_visited; sub subfiles ($$$) { my ($dir, $mask, $recursive) = @_; %_dir_visited = (); my ($dev, $ino) = stat($dir) or return (undef); my $tag = sprintf ("%d-%d", $dev, $ino); return (undef) if ($_dir_visited{$tag}); $_dir_visited{$tag} = $dir; return (undef) unless (-d $dir); my @ret = (); foreach my $f (glob ("$dir/$mask")) { push (@ret, $f) if (-f $f); } if ($recursive) { foreach my $d (glob ("$dir/*")) { next unless (-d $d); my @subret = subfiles ("$d", $mask, 1); my $added = 0; foreach my $f (@subret) { if (-f $f) { push (@ret, $f); $added++; } } } } if ($#ret > -1) { return (@ret); } else { return (undef); } } # Output stuff, update $cacheval incase we'll add it to the cache later. sub output { if ($printed++) { print (' '); $cacheval .= ' '; } print (@_); for my $a (@_) { $cacheval .= $a; } } # Find a header, output a define if found. sub if_header { checkhelp <<"ENDHELP"; 'ifheader' tries to find a header file in the 'include' directories. When found, a define-flag for the C compiler is returned. E.g.: $base ifheader malloc.h HAVE_MALLOC_H (may return -DHAVE_MALLOC_H) Use in a Makefile as in: CFLAGS = \$(CFLAGS) \$(shell c-conf ifheader malloc.h HAVE_MALLOC_H) Then in a C source as: #ifdef HAVE_MALLOC_H #include #endif ENDHELP usage() if ($#_ != 1); my ($h, $def) = @_; foreach my $d (@headerdirs) { if (-f "$d/$h") { msg ("Header '$h' found as '$d/$h'\n"); output ("-D$def"); return; } } } # Find a header, output define=0 or define=1 sub if_header01 { checkhelp <<"ENDHELP"; 'ifheader01' tries to find a header in the 'include' directories. When found, a define for the C compiler is returned having value 1. When not found, the value is 0. Use in a Makefile as follows: CFLAGS = \$(shell c-conf ifheader01 malloc.h HAVE_MALLOC_H) Then in a C source as: #if HAVE_MALLOC_H == 1 #include #endif ENDHELP usage() if ($#_ != 1); my ($h, $def) = @_; foreach my $d (@headerdirs) { if (-f "$d/$h") { output ("-D$def=1"); return; } } output ("-D$def=0"); return; } # Find a header sub header { checkhelp <<"ENDHELP"; 'header' locates one or more C headers in the 'include' directories. E.g.: $base header e-lib.h stdio.h (may return -I/usr/include -I/usr/e/include) Use in a Makefile as in: CFLAGS = -C -Wall \$(shell c-conf header e-lib.h) Then in a C source as: #include ENDHELP usage() if ($#_ == -1); foreach my $h (@_) { my $found = 0; foreach my $d (@headerdirs) { if (-f "$d/$h") { $found++; msg ("Header '$h' found as '$d/$h\n"); output ("-I$d"); last; } } warning ("Failed to locate header '$h' in @headerdirs\n") unless ($found); } } # Find a header directory sub headerdir { checkhelp <<"ENDHELP"; 'headerdir' locates directories under which (in steps) C headers are E.g.: $base headerdir libxml2 (may return '-I/usr/include/libxml2') Use in a Makefile as in: CFLAGS = -C -Wall \$(shell c-conf headerdir libxml2) Then in a C source as: #include ENDHELP usage() if ($#_ == -1); foreach my $headerdir (@_) { my $found = 0; foreach my $d (@headerdirs) { my $target = "$d/$headerdir"; if (subfiles ($target, '*.h', 0)) { msg ("Header directory '$headerdir' found as '$target'\n"); output ("-I$target"); $found++; } } warning ("Header dir '$headerdir' not found\n") unless ($found); } } # Find a library sub lib { checkhelp <<"ENDHELP"; 'lib' generates the linkage flags for a given library name. The name is bare, without 'lib' and '.so' and the like. E.g.: $base lib xml2 (may return '-L/usr/lib -lxml2') Use in a Makefile as in: LDFLAGS = \$(shell c-conf lib xml2) ENDHELP usage() if ($#_ == -1); my %dirshown; foreach my $lib (@_) { my $found = 0; foreach my $d (@libdirs) { my $hit = (subfiles ($d, "lib$lib.*", 0))[0]; if ($hit) { msg ("Library '$lib' found as '$hit'\n"); $found++; $hit =~ s{/[^/]*$}{}; if (! $dirshown{$hit}) { output ("-L$hit"); $dirshown{$hit} = 1; } output ("-l$lib"); } } #warning ("Library '$lib' not found\n") # unless ($found); } } # Compilation flags to make a so-ready object. sub so_cflags { checkhelp <<"ENDHELP"; 'so-cflags' returns the compilation flags that are necessary when building objects for a shared library. E.g.: $base so-cflags (may return '-fPIC') Use in a Makefile as in: CFLAGS = -c -g -Wall \$(shell c-conf so-cflags) ENDHELP usage() if ($#_ > -1); my $flags; if (uname() eq 'Darwin') { $flags = '-fPIC'; } elsif (uname() eq 'Linux') { $flags = '-fpic'; } msg ("Shared object compilation flags: '$flags'\n"); output ($flags); } # Linkage flags to make an so. sub so_lflags { checkhelp << "ENDHELP"; 'so-lflags' returns the linkage flags that are necessary when combining objects into a shared library. E.g.: $base so-lflags (may return '-dynamiclib -Wl,-single_module') Use in a Makefile as in: MY_SO = \$(shell c-conf so-name my) \$(MY_SO): *.o \$(CC) -o \$(MY_SO) \$(shell c-conf so-lflags) *.o ENDHELP usage() if ($#_ > -1); my $lib = shift; my $flags; if (uname() eq 'Darwin') { $flags = "-dynamiclib -Wl,-single_module"; } else { $flags = "-shared"; } msg ("Shared library linkage flags: '$flags'\n"); output ($flags); } # Find the C compiler and return it, or die trying. sub find_c_compiler { foreach my $c (@c_compilers) { my $full = findbin($c); return ($full) if ($full); } die ("No C compiler found\n"); } # Get the C compiler sub c_compiler { checkhelp <<"ENDHELP"; 'c-compiler' tries to find a C compiler and returns its (bare) name. E.g.: $base c-compiler -> gcc ENDHELP usage() if ($#_ > -1); my $cc; eval { $cc = find_c_compiler(); }; if ($@) { warning ($@); } else { msg ("C compiler: '$cc'\n"); output ($cc); } } # Get the C++ compiler sub cpp_compiler { checkhelp <<"ENDHELP"; 'c++-compiler' tries to find a C++ compiler and returns its (bare) name. E.g.: $base c++-compiler -> g++ ENDHELP usage() if ($#_ > -1); foreach my $c (@cpp_compilers) { my $full = findbin($c); if ($full) { msg ("C++ compiler: '$full'\n"); output ($full); return; } } warning ("No C++ compiler found\n"); } # Get fast code optimization flags. sub optflags { checkhelp <<"ENDHELP"; 'optflags' tries to determine optimization flags. E.g.: $base optflags -> -O3 ENDHELP usage() if ($#_ > -1); for my $optflag ('-fast', '-O3', '-O2') { if (test_compile ("int main() {}\n", $optflag)) { output ($optflag); return; } } warning ("No optimization flag found."); } # Get the name for an SO. sub so_name { checkhelp <<"ENDHELP"; 'so-name' returns the filename of a shared library, based on the LIB argument. E.g.: $base so-name test -> libtest.so ENDHELP usage() if ($#_ != 0); my $name = shift; my $dir = dirname ($name); my $base = basename ($name); my $dest; if (uname() eq 'Darwin') { $dest = "lib$base.dylib"; } else { $dest = "lib$base.so"; } if ($dir ne '') { msg ("Shared library name for '$name': '$dir/$dest'\n"); output ("$dir/$dest"); } else { msg ("Shared library name for '$name': '$dest'\n"); output ("$dest"); } } # Check that a libfunction is present. sub libfunction { checkhelp <<"ENDHELP"; 'libfunction' checks whether a library function is present. There are two arguments: the function to check, and a define to output when the function is found. The output is a -D flag for the compiler commandline. E.g.: $base libfunction printf HAVE_PRINTF -> -DHAVE_PRINTF=1 $base libfunction foo_bar HAVE_FOOBAR -> (nothing) ENDHELP if (test_libfunction (@_)) { msg ("Library function '$_[0]' present\n"); output ("-D$_[1]=1"); } else { msg ("Library function '$_[0]' absent\n"); } } # Check that a lib variable is present, 01 version sub libvariable01 { checkhelp <<"ENDHELP"; 'libvariable01' checks whether a library variable is present. There are two arguments: a variable name, and a define to output with value 0 or 1. E.g.: $base libvariable01 errno HAVE_ERRNO -> -DHAVE_ERRNO=1 ENDHELP if (test_libvariable(@_)) { msg ("Library variable '$_[1]' present\n"); output ("-D$_[1]=1"); } else { msg ("Library variable '$_[1]' absent\n"); output ("-D$_[1]=0"); } } # Check that a libfunction is present, 01-version sub libfunction01 { checkhelp <<"ENDHELP"; 'libfunction01' checks whether a library function is present. There are two arguments: the function to check, and a define to output when the function is found. When the lib function is found, then the define is returned with a value 1, else with a value 0. E.g.: $base libfunction01 printf HAVE_PRINTF -> -DHAVE_PRINTF=1 $base libfunction foo_bar HAVE_FOOBAR -> -DHAVE_FOOBAR=0 ENDHELP if (test_libfunction (@_)) { msg ("Library function '$_[1]' present\n"); output ("-D$_[1]=1"); } else { msg ("Library function '$_[1]' absent\n"); output ("-D$_[1]=0"); } } sub test_compile { my $sourcecode = shift; my $cc = find_c_compiler(); # Create a temp .c file. my $src = "/tmp/$$.c"; my $dst = "/tmp/$$.out"; open (my $of, ">$src") or die ("Cannot write $src: $!\n"); print $of ($sourcecode); close ($of); my $cmd = "$cc "; for my $flag (@_) { $cmd .= "$flag "; } $cmd .= "$src -o $dst " . cc_inc_flags() . ' ' . cc_libdir_flags() . ' ' . cc_lib_flags(); # print ($cmd, "\n"); my $ret = system ("$cmd >/dev/null 2>&1"); unlink ($src, $dst); return ($ret == 0 ? 1 : 0); } # Return @headerdirs as C flags sub cc_inc_flags() { my $ret = ''; for my $h (@headerdirs) { $ret .= " -I$h"; } msg ("C compilation include flags: '$ret'\n"); return ($ret); } # Return @libdirs as C flags sub cc_libdir_flags() { my $ret = ''; for my $l (@libdirs) { $ret .= " -L$l" if (-d $l); } msg ("C library directory flags: '$ret'\n"); return ($ret); } # Return @libs as C flags sub cc_lib_flags() { my $ret = ''; for my $l (@libs) { $ret .= " -l$l"; } msg ("C library flags: '$ret'\n"); return ($ret); } # Test whether a lib function is present. sub test_libfunction { usage() if ($#_ != 1); my ($func, $def) = @_; return (test_compile ("main () {\n" . " void $func (void);\n" . " $func();\n" . "}\n")); } # Test whether a lib variable is present. sub test_libvariable { usage() if ($#_ != 1); my ($var, $def) = @_; return (test_compile ("main () {\n" . " extern int $var;\n" . " $var = 42;\n" . "}\n")); } # Main starts here $base = $0; $base =~ s{.*/}{}; usage () unless (getopts ('vhI:L:sc:l:', \%opts)); # See if we got a cache with the requests in it. # If we can match the request, return the result. if ($opts{c}) { $cachekey = ''; for my $a (@ARGV) { $cachekey .= ' ' if ($cachekey ne ''); $cachekey .= $a; } if (open (my $if, $opts{c})) { while (my $line = <$if>) { chomp ($line); my ($key, $val) = split (/\t/, $line); if ($key eq $cachekey) { output ($val); print ("\n"); exit (0); } } } } foreach my $d (split (/,/, $opts{L})) { push (@libdirs, $d); } foreach my $d (split (/,/, $opts{I})) { push (@headerdirs, $d); } foreach my $d (split (/,/, $opts{l})) { push (@libs, $d); } push (@libdirs, @def_libdirs); push (@headerdirs, @def_headerdirs); my $action = shift (@ARGV); if ($action eq 'header') { header (@ARGV); } elsif ($action eq 'headerdir') { headerdir (@ARGV); } elsif ($action eq 'lib') { lib (@ARGV); } elsif ($action eq 'so-cflags') { so_cflags (@ARGV); } elsif ($action eq 'so-lflags') { so_lflags (@ARGV); } elsif ($action eq 'c-compiler') { c_compiler(@ARGV); } elsif ($action eq 'c++-compiler') { cpp_compiler(@ARGV); } elsif ($action eq 'so-name') { so_name (@ARGV); } elsif ($action eq 'ifheader') { if_header (@ARGV); } elsif ($action eq 'ifheader01') { if_header01 (@ARGV); } elsif ($action eq 'libfunction') { libfunction (@ARGV); } elsif ($action eq 'libfunction01') { libfunction01 (@ARGV); } elsif ($action eq 'libvariable01') { libvariable01 (@ARGV); } elsif ($action eq 'optflags') { optflags (@ARGV); } else { usage (); } print ("\n") if ($printed); # Add to the cache if necessary. if ($opts{c}) { open (my $of, ">>$opts{c}") or die ("Cannot append to cache file $opts{c}: $!\n"); print $of ("$cachekey\t$cacheval\n"); } if ($#warnings > -1) { foreach my $w (@warnings) { print STDERR ("$base WARNING: $w") unless ($opts{s}); } exit (1); } exit (0); crossroads-2.81/xr/etc/e-txt2c0000755000175000001440000000273312130034072015141 0ustar httpusers#!/bin/sh VER=1.04 # ChangeLog: # 1.04 Call to e-copyright removed. # 1.03 -V shows more info # 1.02 In the text file, ' is changed to \' and \ is changed to \\ # 1.01 -V flag implemented # 1.00 First version # e-txt2c: development tool # just write up your usage in a file "usage.txt", then run # e-txt2c DEFINENAME < usage.txt > usage.h # then include usage.h in your program and refer to define DEFINENAME # to address the string # check args if [ "$1" = "-V" ] ; then echo $VER TXT to C-string Translator exit 0 fi if [ -z "$1" ] ; then cat << ENDUSAGE 1>&2 Usage: e-txt2c DEFINENAME output.h E.g., when writing up your usage() function, just put your text in usage.txt. Then run "e-txt2c USAGETEXT usage.h" and include usage.h. Refer to your text using the define symbol USAGETEXT. Typically this is a rule in a Makefile, as in: # my "main.c" includes "usage.h", so it is dependent on that main.o: main.c usage.h # how to make usage.h usage.h: usage.txt e-txt2c USAGETEXT usage.h ENDUSAGE exit 1 fi cat << ENDWARNING /* * Warning: this file is auto-generated from an input file by e-txt2c. * Don't modify this, your changes will be overwritten (probably during * the next "make"). * To change this text, find the sources, edit the text input, and * re-make the program. */ ENDWARNING echo "#define $1 \\" sed \ -e 's:\\:\\\\:g' \ -e "s:':\\\':g" \ -e 's:":\\":g' \ -e 's:^: ":' \ -e 's:$:\\n" \\:' echo ' ""' crossroads-2.81/xr/etc/gettools0000755000175000001440000000114712130034072015511 0ustar httpusers#!/usr/bin/perl use strict; die ("Usage: gettools SRCDIR DSTDIR TOOL [TOOL...]\n") if ($#ARGV < 2); my $srcdir = shift (@ARGV); die ("gettools: source dir $srcdir not found\n") unless (-d $srcdir); my $dstdir = shift (@ARGV); die ("gettools: dest dir $dstdir not found\n") unless (-d $dstdir); for my $t (@ARGV) { gettool ($srcdir, $dstdir, $t); } sub gettool ($$$) { my ($sd, $dd, $t) = @_; my $src = "$sd/$t"; return unless (-f $src); my $dst = "$dd/$t"; if (! -f $dst or (stat($src))[9] > (stat($dst))[9]) { system ("cp '$src' '$dst'") and die ("gettools: cp failed\n"); } } crossroads-2.81/xr/etc/status.xslt0000777000175000001440000000000012130034072023140 2status-nosavebutton.xsltustar httpuserscrossroads-2.81/xr/etc/status-nosavebutton.xslt0000644000175000001440000005613612130034072020717 0ustar httpusers XR Status Overview

XR Status Overview


service:
Detailed Status


Add back end ip:port

Quick Overview

Back end , , , connections

Activity

Number of threads
Used file descriptors (approx.)
File descriptor limit
Thread Description Back end Duration
(client ) Powered by Crossroads V. Visit for more info. Server Status Accepting connections, concurrent client(s), Terminating, still serving connections, defined back ends Dispatch mode Type Checks Wakeup interval off sec Checkup interval off sec Timeouts Client read unlimited sec Client write unlimited sec Back end read unlimited sec Back end write unlimited sec DNS cache validity unused sec Fast sockets closing eliminates TIME_WAIT state Debugging Verbose logging Debug logging Traffic log directory Activity scripts Onstart command Onend command Onfail command Network buffer size bytes DOS Protection Max. connections unlimited maximum value (0 for unlimited) Sample duration sec Hard max connection rate unlimited sessions per sample (0 for unlimited) Soft max connection rate unlimited sessions per sample (0 for unlimited) Defer time in microsec, 1.000.000 = 1 sec Hard excess signal program Soft excess signal program Access Control Lists New allow-from New deny-from Web interface credentials Format username:password
Back end State Health , Connections (anticipating ) Connect failures Served bytes, clients Options Weight Max. connections unlimited maximum value (0 for unlimited) Load average Backend check (. to reset) Host match any host request (. for any host) URL match any url request (. for any url) Up state Stop all connections
HTTP Goodies Add X-Forwarded-For Sticky HTTP Replace Host: headers Allow from Deny from Server header New server header
crossroads-2.81/xr/etc/xrprof0000755000175000001440000000126712130034072015174 0ustar httpusers#!/usr/bin/perl use strict; open (my $if, "/tmp/xr-prof.txt") or die ("Cannot read /tmp/xr-prof.txt: $!\n"); my %info; while (my $line = <$if>) { chomp($line); my (undef, undef, $name, $duration) = split (/\s+/, $line); # print ("$name: $duration\n"); if ($info{$name}) { my ($calls, $total) = @{ $info{$name} }; $calls++; $total += $duration; $info{$name} = [ $calls, $total ]; } else { $info{$name} = [ 1, $duration ]; } } for my $k (sort bytotal keys(%info)) { my ($calls, $total) = @{ $info{$k} }; print ("$k: $total usec\n"); } sub bytotal { my @aa = @{ $info{$a} }; my @bb = @{ $info{$b} }; return ($bb[1] <=> $aa[1]); } crossroads-2.81/xr/etc/status-savebutton.xslt0000644000175000001440000005574512130034072020367 0ustar httpusers XR Status Overview

XR Status Overview


Detailed Status


Add back end ip:port

Quick Overview

Back end , , , connections

Activity

Number of threads
Used file descriptors (approx.)
File descriptor limit
Thread Description Back end Duration
Powered by Crossroads V. Visit
for more info. Server Status Accepting connections, concurrent client(s), Terminating, still serving connections, defined back ends Dispatch mode Type Checks Wakeup interval off sec Checkup interval off sec Timeouts Client read unlimited sec Client write unlimited sec Back end read unlimited sec Back end write unlimited sec DNS cache validity unused sec Fast sockets closing eliminates TIME_WAIT state Debugging Verbose logging Debug logging Traffic log directory Activity scripts Onstart command Onend command Onfail command Network buffer size bytes DOS Protection Max. connections unlimited maximum value (0 for unlimited) Sample duration sec Hard max connection rate unlimited sessions per sample (0 for unlimited) Soft max connection rate unlimited sessions per sample (0 for unlimited) Defer time in microsec, 1.000.000 = 1 sec Hard excess signal program Soft excess signal program Access Control Lists New allow-from New deny-from
Back end State Health , Connections (anticipating ) Served bytes, clients Options Weight Max. connections unlimited maximum value (0 for unlimited) Load average Backend check (. to reset) Host match any host request (. for any host) Up state Stop all connections
HTTP Goodies Add X-Forwarded-For Sticky HTTP Replace Host: headers Allow from Deny from Server header New server header crossroads-2.81/xr/etc/Makefile.class0000644000175000001440000000270512130034072016470 0ustar httpusersSRC = $(wildcard *.cc) OBJ = $(patsubst %.cc, $(BASE)/xr/$(BUILDDIR)/$(DIR)_%.o, $(SRC)) DIR = $(shell pwd | sed 's:.*/::') SYS = $(shell uname) HST = $(shell hostname) # How many times should XR check a back end using plain TCP connects? # Just once fails on some systems. Twice seems to do the job. CONNCHECKS = 2 # When connecting to a back end with the socket in nonblocking mode, is # the connection alive when the socket is just writable? When commented out, # the socket must also be non-readable (which should be the standard, but on # some systems appears not to work). Leave this commented out unless you are # experimenting or really know what you are doing. # CCC = -DCONNECTCHECK_ONLY_WRITABLE # On my dev system, I want warnings to stop the compilation. Does not apply to # others where warnings won't stop the build. ifeq ($(HST), Kostunrix.local) ERRFLAG = -Werror endif class-compile: $(OBJ) $(BASE)/xr/$(BUILDDIR)/$(DIR)_%.o: %.cc @echo "Compiling: " `pwd`/$< @$(CONF_CC) $(PROF) $(PROFILER) $(CONF_OPTFLAGS) \ -DVER='"$(VER)"' -DAUTHOR='"$(AUTHOR)"' -DHST='"$(HST)"' \ -DMAINTAINER='"$(MAINTAINER)"' -DDISTSITE='"$(DISTSITE)"' \ -DSYS='"$(SYS)"' -D$(SYS) $(MEMDEBUG) $(CCC) \ -DCONF_CC='"$(CONF_CC)"' -DCONF_LIB='"$(CONF_LIB)"' \ -DCONF_OPTFLAGS='"$(CONF_OPTFLAGS)"' $(CONF_STRNSTR) \ -DCONNCHECKS=$(CONNCHECKS) \ $(CONF_GETOPT) $(CONF_GETOPT_LONG) $(CONF_INET_ATON) \ -I$(BASE)/xr \ -c -g -Wall $(ERRFLAG) -o $@ $< crossroads-2.81/xr/sys/0000755000175000001440000000000012130034076013767 5ustar httpuserscrossroads-2.81/xr/sys/sys0000644000175000001440000000674212130034072014535 0ustar httpusers#ifndef _SYS_ #define _SYS_ /* System-wide includes, 'cuz I'm too lazy to repeat them throughout * the entire source tree. */ // C #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef INADDR_NONE # define HAVE_INADDR_NONE #else # define INADDR_NONE 0xffffffff #endif // C++ #include #include #include #include #include #include #include /* When the system goes out of open files, we take a nap for X secs. Set * to 0 to suppress this. */ #define EMFILE_SLEEP 3 /* Profiling support on/off */ #ifdef PROFILER # define PROFILE(x) Profiler local_prof(x) #else # define PROFILE(x) #endif /* Memory debugging on/off */ #ifdef MEMDEBUG # define MEM(x) x #else # define MEM(x) #endif /* If you fear that your malloc() / realloc() may have threading problems, * uncomment the following. It will cause mutex locks around the calls. */ // #define MISTRUST_MALLOC_THREADSAFE /* If you fear racing conditions in thread_create() then uncomment this. * BTW it would be really weird if thread_create() weren't thread-safe., so * defining this is very likely not necessary. */ // #define MISTRUST_THREAD_CREATE_THREADSAFE using namespace std; // This is for the Servertype of serversocket() #include "servertype/servertype" /* Generic funtions */ string inet2string(struct in_addr in); bool ipmatch (struct in_addr addr, struct in_addr mask); vector str2parts (string const &s, char sep); void mt_srand(unsigned long s); unsigned long mt_rand(void); bool check_acl(string const &ipstr, struct in_addr ipaddr); int sysrun (string const &s); int maxtimeout(int a, int b); string base64_decode(string const &s); void mutex_lock(void *obj); void mutex_unlock(void *obj); bool mutex_lock_cout(); void mutex_unlock_cout(); bool mutex_lock_cerr(); void mutex_unlock_cerr(); #ifndef HAVE_INET_ATON int inet_aton (char const *name, struct in_addr *addr); #endif #ifndef HAVE_STRNSTR char *strnstr (char const *s, char const *find, size_t slen); #endif /* Messaging. Conditionals are defined as a macro to speed things up. */ #define msg(x) \ if (config.verbose() && mutex_lock_cout()) { \ if (config.prefixtimestamp()) { \ Timestamp tm; \ cout << tm.desc() << ' '; \ } \ cout << pthread_self() << " INFO: " << x; \ cout.flush(); \ mutex_unlock_cout(); \ } #define debugmsg(x) \ if (config.debug() && mutex_lock_cout()) { \ if (config.prefixtimestamp()) { \ Timestamp tm; \ cout << tm.desc() << ' '; \ } \ cout << pthread_self() << " DEBUG: " << x; \ cout.flush(); \ mutex_unlock_cout(); \ } #define reportmsg(x) \ if (mutex_lock_cerr()) { \ if (config.prefixtimestamp()) { \ Timestamp tm; \ cerr << tm.desc() << ' '; \ } \ cerr << pthread_self() << " REPORT " << x; \ mutex_unlock_cerr(); \ } #define warnmsg(x) \ if (mutex_lock_cerr()) { \ if (config.prefixtimestamp()) { \ Timestamp tm; \ cerr << tm.desc() << ' '; \ } \ cerr << pthread_self() << " WARNING " << x; \ mutex_unlock_cerr(); \ } #endif crossroads-2.81/xr/sys/inetaton.cc0000644000175000001440000000030512130034075016114 0ustar httpusers#include "sys" #ifndef HAVE_INET_ATON int inet_aton (char const *name, struct in_addr *addr) { in_addr_t a = inet_addr (name); addr->s_addr = a; return a != (in_addr_t)-1; } #endif crossroads-2.81/xr/sys/strnstr.cc0000644000175000001440000000113512130034075016014 0ustar httpusers#include "sys" #ifndef HAVE_STRNSTR // [KK 2008-10-13] Got this from // http://opengrok.creo.hu/dragonfly/xref/src/lib/libc/string/strnstr.c // and it's of course for systems that don't have this lib function // themselves char *strnstr(const char *s, const char *find, size_t slen) { char c, sc; size_t len; if ((c = *find++) != '\0') { len = strlen(find); do { do { if (slen < 1 || (sc = *s) == '\0') return (0); --slen; ++s; } while (sc != c); if (len > slen) return (0); } while (strncmp(s, find, len) != 0); s--; } return ( (char*) s); } #endif crossroads-2.81/xr/sys/main.cc0000644000175000001440000000600112130034075015216 0ustar httpusers #include "sys/sys" #include "config/config" #include "balancer/balancer" #include "error/error" #include "profiler/profiler" #include "ThreadsAndMutexes/mutex/mutex" #include "ThreadsAndMutexes/mutextable/mutextable" using namespace std; // Global variables (definition) Config config; Balancer balancer; MutexTable mt(100); Mutex cout_lock, cerr_lock; static void showlimits() { typedef struct { int resource; string description; } Limit; static Limit limit[] = { { RLIMIT_CORE, "coredump size (bytes)" }, { RLIMIT_CPU, "cpu time (sec)" }, { RLIMIT_DATA, "data segment size (bytes)" }, { RLIMIT_FSIZE, "max file size (bytes)" }, # ifdef RLIMIT_MEMLOCK { RLIMIT_MEMLOCK, "locked mem size (bytes)" }, # endif { RLIMIT_NOFILE, "max open files" }, # ifdef RLIMIT_NPROC { RLIMIT_NPROC, "max processes" }, # endif # ifdef RLIMIT_RSS { RLIMIT_RSS, "max resident set size (bytes)" }, # endif { RLIMIT_STACK, "max stack size (bytes)" } }; for (unsigned i = 0; i < sizeof(limit) / sizeof(Limit); i++) { struct rlimit rl; if (getrlimit(limit[i].resource, &rl)) throw Error(string("Failed to request limit: ") + strerror(errno)); ostringstream o; o << "Limits for " << limit[i].description << ": hard limit " << unsigned(rl.rlim_max) << ", soft limit " << unsigned(rl.rlim_cur) << '\n'; msg(o.str()); } } static int org_argc; static char **org_argv; static void sigcatcher (int sig) { debugmsg("Seen signal " << sig << '\n'); switch (sig) { case SIGHUP: // Generate a report to the log. balancer.report(true); break; case SIGUSR1: // Toggle verbosity. if (config.verbose()) config.verbose(false); else config.verbose(true); break; case SIGUSR2: // Toggle debugging. if (config.debug()) config.debug(false); else config.debug(true); break; case SIGINT: case SIGQUIT: case SIGABRT: case SIGTERM: case SIGSTOP: // Stop the balancer balancer.terminate(true); break; default: // Ignore ostringstream o; o << "Signal " << sig << " ignored\n"; msg(o.str()); break; } } int main (int argc, char **argv) { PROFILE("main"); static int relevant_sig[] = { SIGHUP, // Back end states to log SIGINT, SIGQUIT, SIGABRT, SIGTERM, SIGSTOP, // Terminate SIGUSR1, SIGUSR2, // Toggle verbose/debug SIGPIPE, // Ignore }; try { // Save original commandline org_argc = argc; org_argv = argv; // Load configuration from the commandline, promote verbosity config.parsecmdline (argc, argv); if (config.verbose()) showlimits(); msg("XR running as PID " << getpid() << '\n'); // Load the signal handler. for (unsigned i = 0; i < sizeof(relevant_sig) / sizeof(int); i++) signal (relevant_sig[i], sigcatcher); // Configure the balancer and start serving. balancer.init(); balancer.serve(); } catch (Error const &e) { cerr << e.what() << endl; return (1); } catch (...) { cerr << "ERROR: Unidentified exception caught" << endl; } return (0); } crossroads-2.81/xr/sys/sysrun.cc0000644000175000001440000000076212130034075015645 0ustar httpusers#include "sys" #include "config/config" int sysrun(string const &s) { int ret = system(s.c_str()); if (ret == -1) { warnmsg("Failed to start command: " << s << '\n'); return -1; } if (WIFEXITED(ret)) { int stat = WEXITSTATUS(ret); if (stat) { warnmsg("Command" << s << " exited with status " << stat << '\n'); } else { msg("Command " << s << " terminated normally\n"); } return stat; } warnmsg("Command " << s << " failed miserably!\n"); return ret; } crossroads-2.81/xr/sys/maxtimeout.cc0000644000175000001440000000017112130034075016470 0ustar httpusers#include "sys" int maxtimeout(int a, int b) { if (!a) return b; if (!b) return a; return a < b ? a : b; } crossroads-2.81/xr/sys/ipmatch.cc0000644000175000001440000000072412130034075015725 0ustar httpusers#include "sys" #include "../config/config" bool ipmatch (struct in_addr adr, struct in_addr mask) { PROFILE("ipmatch"); long laddr = 0, lmask = 0; memcpy (&laddr, &adr, sizeof(adr)); memcpy (&lmask, &mask, sizeof(mask)); bool match = ( (laddr & lmask) == laddr ); debugmsg("Matching ip " << inet2string(adr) << " against mask " << inet2string(mask) << ": " << (match ? "match" : "miss") << '\n'); return (match); } crossroads-2.81/xr/sys/mutexlock.cc0000644000175000001440000000074612130034075016317 0ustar httpusers#include "sys" #include "ThreadsAndMutexes/mutextable/mutextable" #include "ThreadsAndMutexes/mutex/mutex" extern MutexTable mt; extern Mutex cout_lock, cerr_lock; void mutex_lock(void *o) { mt.lock(o); } void mutex_unlock(void *o) { mt.unlock(o); } bool mutex_lock_cout() { return cout_lock.trylock(); } void mutex_unlock_cout() { cout_lock.unlock(); } bool mutex_lock_cerr() { return cerr_lock.trylock(); } void mutex_unlock_cerr() { cerr_lock.unlock(); } crossroads-2.81/xr/sys/mtrand.cc0000644000175000001440000001531112130034075015563 0ustar httpusers/* NOTE: All of the functions have been commented out, with two exceptions: - init_genrand(seed) has been renamed to mt_srand(seed) - genrand_int32(void) has been renamed to mt_rand(void) The renaming was to resemble the naming of srand() and rand(). All other functions were unnecessary, and as such commented out. -- KK */ /* A C-program for MT19937, with initialization improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Before using, initialize the state by using init_genrand(seed) or init_by_array(init_key, key_length). Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, 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. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ static unsigned long mt[N + M]; /* the array for the state vector */ static int mti = N + 1; /* mti == N+1 means: */ /* mt[N] is not initialized */ /* initializes mt[N] with a seed */ void mt_srand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ mt[mti] &= 0xffffffffUL; /* for >32 bit machines */ } } /* initialize by an array with array-length */ /* init_key is the array for initializing keys */ /* key_length is its length */ /* slight change for C++, 2004/2/26 */ // void init_by_array(unsigned long init_key[], int key_length) // { // int i, j, k; // init_genrand(19650218UL); // i=1; j=0; // k = (N>key_length ? N : key_length); // for (; k; k--) { // mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) // + init_key[j] + j; /* non linear */ // mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ // i++; j++; // if (i>=N) { mt[0] = mt[N-1]; i=1; } // if (j>=key_length) j=0; // } // for (k=N-1; k; k--) { // mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) // - i; /* non linear */ // mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ // i++; // if (i>=N) { mt[0] = mt[N-1]; i=1; } // } // // mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ // } /* generates a random number on [0,0xffffffff]-interval */ unsigned long mt_rand(void) { unsigned long y; static unsigned long mag01[2]={0x0UL, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ mt_srand(5489UL); /* a default initial seed is used */ for (kk = 0; kk < N - M; kk++) { y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL]; } for (;kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } /* generates a random number on [0,0x7fffffff]-interval */ // long genrand_int31(void) // { // return (long)(genrand_int32()>>1); // } /* generates a random number on [0,1]-real-interval */ // double genrand_real1(void) // { // return genrand_int32()*(1.0/4294967295.0); // /* divided by 2^32-1 */ // } /* generates a random number on [0,1)-real-interval */ // double genrand_real2(void) // { // return genrand_int32()*(1.0/4294967296.0); // /* divided by 2^32 */ // } /* generates a random number on (0,1)-real-interval */ // double genrand_real3(void) // { // return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); // /* divided by 2^32 */ // } /* generates a random number on [0,1) with 53-bit resolution*/ // double genrand_res53(void) // { // unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; // return(a*67108864.0+b)*(1.0/9007199254740992.0); // } /* These real versions are due to Isaku Wada, 2002/01/09 added */ // int main(void) // { // int i; // unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; // init_by_array(init, length); // printf("1000 outputs of genrand_int32()\n"); // for (i=0; i<1000; i++) { // printf("%10lu ", genrand_int32()); // if (i%5==4) printf("\n"); // } // printf("\n1000 outputs of genrand_real2()\n"); // for (i=0; i<1000; i++) { // printf("%10.8f ", genrand_real2()); // if (i%5==4) printf("\n"); // } // return 0; // } crossroads-2.81/xr/sys/str2parts.cc0000644000175000001440000000136512130034075016246 0ustar httpusers#include "sys" #include "config/config" vector str2parts (string const &s, char sep) { PROFILE("str2parts"); string str = s; size_t pos; vector parts; bool sep_is_first = false; while ( (pos = str.find_first_of(sep)) != string::npos) { if (!pos) { sep_is_first = true; parts.push_back(""); } else { sep_is_first = true; parts.push_back (str.substr(0, pos)); } str = str.substr(pos + 1); } if (str.length() > 0) parts.push_back (str); else if (sep_is_first) parts.push_back(""); /* ostringstream o; o << "str2parts: "; for (unsigned int i = 0; i < parts.size(); i++) o << "[" << parts[i] << "] "; o << "\n"; _debugmsg(o.str()); */ return (parts); } crossroads-2.81/xr/sys/base64decode.cc0000644000175000001440000000432312130034075016527 0ustar httpusers #include "sys" /* ========================================================================= * The remainder of the code originates from http://base64.sourceforge.net/. * The original version was written by Bob Trower. * Adapted for C++ by me [kk] * ========================================================================= */ /* ** Translation Table as described in RFC1113 ** Not used during decode phase static const char *xx_cb64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; */ /* ** Translation Table to decode (created by author) */ static const char *xx_cd64 = "|$$$}rstuvwxyz{$$$$$$$>?@" "ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ" "[\\]^_`abcdefghijklmnopq"; /* ** decodeblock ** ** decode 4 '6-bit' characters into 3 8-bit binary bytes */ static void decodeblock(char in[4], char out[4]) { out[0] = (unsigned char ) (in[0] << 2 | in[1] >> 4); out[1] = (unsigned char ) (in[1] << 4 | in[2] >> 2); out[2] = (unsigned char ) (((in[2] << 6) & 0xc0) | in[3]); } /* ** decode ** ** decode a base64 encoded stream discarding padding, line breaks and noise */ static string base64_decode(char const *srcstr, int srclen) { char in[4], out[4], v; int i, j, len, morechars; string decbuf; int declen = 0; /* Initialize. Only the first 3 chars of out will get overwritten. */ out[3] = 0; /* Examine all characters. */ j = 0; morechars = 1; while (morechars) { for (len = 0, i = 0; i < 4 && morechars; i++) { v = 0; while (morechars && !v) { v = (unsigned char) srcstr[j++]; if (j > srclen) morechars = 0; v = (unsigned char) ((v < 43 || v > 122) ? 0 : xx_cd64[v - 43]); if (v) v = (unsigned char) ((v == '$') ? 0 : v - 61); } if (morechars) { len++; if (v) in[i] = (unsigned char) (v - 1); } else in[i] = 0; } if (len) { decodeblock (in, out); decbuf += string(out); declen += len - 1; } } /* All done. */ return (decbuf); } string base64_decode(string const &s) { return base64_decode(s.c_str(), s.length()); } crossroads-2.81/xr/sys/inet2string.cc0000644000175000001440000000035012130034075016543 0ustar httpusers#include "sys/sys" #include "ThreadsAndMutexes/mutex/mutex" string inet2string(struct in_addr in) { string ret; mutex_lock((void*)inet_ntoa); ret = inet_ntoa(in); mutex_unlock((void*)inet_ntoa); return ret; } crossroads-2.81/xr/Checkers/0000755000175000001440000000000012130034076014700 5ustar httpuserscrossroads-2.81/xr/Checkers/checkupthread/0000755000175000001440000000000012130034076017512 5ustar httpuserscrossroads-2.81/xr/Checkers/checkupthread/checkupthread0000644000175000001440000000044312130034075022247 0ustar httpusers#ifndef _CHECKUPTHREAD_ #define _CHECKUPTHREAD_ #include "sys/sys" #include "ThreadsAndMutexes/thread/thread" #include "ThreadsAndMutexes/threadlist/threadlist" #include "balancer/balancer" #include "error/error" class Checkupthread: public Thread { public: void execute(); }; #endif crossroads-2.81/xr/Checkers/checkupthread/execute.cc0000644000175000001440000000213412130034075021462 0ustar httpusers#include "checkupthread" void Checkupthread::execute() { Threadlist::desc("Checkup thread"); while (1) { if (config.checkupsec()) { msg("Running checkup thread\n"); for (unsigned i = 0; i < balancer.nbackends(); i++) { Backend target(balancer.backend(i).backenddef()); try { target.check(); if (target.live()) { balancer.backend(i).live(true); msg("Checkup call: backend " << target.description() << " is alive\n"); } else { balancer.backend(i).live(false); balancer.backend(i).markconnecterror(); msg("Checkup call: backend " << target.description() << " is unavailable\n"); if (config.onfail().length()) { ostringstream o; o << config.onfail() << " 0.0.0.0 " << target.description() << ' ' << balancer.backend(i).connections(); sysrun(o.str()); } } } catch (Error &e) { debugmsg("Error in checkup thread: " << e.what() << '\n'); } catch (...) { debugmsg("Error in checkup thread\n"); } } sleep(config.checkupsec()); } else sleep(30); } } crossroads-2.81/xr/Checkers/wakeupthread/0000755000175000001440000000000012130034076017364 5ustar httpuserscrossroads-2.81/xr/Checkers/wakeupthread/execute.cc0000644000175000001440000000172512130034075021341 0ustar httpusers#include "wakeupthread" void Wakeupthread::execute() { Threadlist::desc("Wakeup thread"); while (1) { if (config.wakeupsec()) { for (unsigned i = 0; i < balancer.nbackends(); i++) { if (! balancer.backend(i).live()) { Backend target(balancer.backend(i).backenddef()); debugmsg("Wakeup thread: checking " << target.description() << '\n'); target.live(balancer.backend(i).live()); try { target.check(); if (target.live()) { msg ("Wakeup call: backend " << target.description() << " has awoken\n"); balancer.backend(i).live(true); } else balancer.backend(i).markconnecterror(); } catch (Error &e) { debugmsg("Exception in wakeup thread: " << e.what() << '\n'); } catch (...) { debugmsg("Exception in wakeup thread\n"); } } } sleep (config.wakeupsec()); } else { debugmsg("Wakeup thread: no activity right now\n"); sleep(30); } } } crossroads-2.81/xr/Checkers/wakeupthread/wakeupthread0000644000175000001440000000044012130034075021770 0ustar httpusers#ifndef _WAKEUPTHREAD_ #define _WAKEUPTHREAD_ #include "sys/sys" #include "ThreadsAndMutexes/thread/thread" #include "ThreadsAndMutexes/threadlist/threadlist" #include "balancer/balancer" #include "error/error" class Wakeupthread: public Thread { public: void execute(); }; #endif crossroads-2.81/xr/webinterface/0000755000175000001440000000000012130034076015607 5ustar httpuserscrossroads-2.81/xr/webinterface/webinterface0000644000175000001440000000105512130034075020170 0ustar httpusers#ifndef _WEBINTERFACE_ #define _WEBINTERFACE_ #include "sys/sys" #include "ThreadsAndMutexes/thread/thread" #include "ThreadsAndMutexes/threadlist/threadlist" #include "fdset/fdset" #include "httpbuffer/httpbuffer" #include "SocketHandling/socket/socket" class Webinterface: public Thread { public: Webinterface(); virtual ~Webinterface(); void execute(); private: void serve(); void answer(Httpbuffer r); void answer_status(); void answer_xslt(); void answer_blob (string const &b); Socket cfd, sfd; }; #endif crossroads-2.81/xr/webinterface/answerblob.cc0000644000175000001440000000060412130034075020253 0ustar httpusers#include "webinterface" void Webinterface::answer_blob (string const &blob) { ostringstream cl; cl << blob.size(); string resp = static_cast ("HTTP/1.0 200 OK\r\n") + "Content-Type: text/xml\r\n" "Connection: close\r\n" "Content-Length: " + cl.str() + "\r\n" "\r\n" + blob; Netbuffer buf(resp); buf.netwrite(cfd, config.client_write_timeout()); } crossroads-2.81/xr/webinterface/answerstatus.cc0000644000175000001440000001570412130034075020667 0ustar httpusers#include "webinterface" #include "balancer/balancer" void Webinterface::answer_status() { string xml = "\n" "\n" "\n"; ostringstream o; o << "\n" "\n" "\n" " \n" " " << VER << "\n" " " << DISTSITE << "\n" " \n" " \n" "
" << config.sipaddr() << ":" << config.sport() << "
\n" " " << config.stypestr() << "\n" " " << config.client_read_timeout() << "\n" " " << config.client_write_timeout() << "\n" " " << config.backend_read_timeout() << "\n" " " << config.backend_write_timeout() << "\n" " " << config.dispatchmodestr() << "\n" " " << config.removereservations() << "\n" " " << config.webinterfaceip() << ':' << config.webinterfaceport() << "\n" " " << config.webinterface_auth() << "\n" " " << config.webinterfacename() << "\n" " " << config.dnscachetimeout() << "\n" " " << config.buffersize() << "\n" " " << config.fastclose() << "\n" " " << config.onstart() << "\n" " " << config.onend() << "\n" " " << config.onfail() << "\n" " \n" " " << config.wakeupsec() << "\n" " " << config.checkupsec() << "\n" " \n" " \n" " " << config.verbose() << "\n" " " << config.debug() << "\n" " " << config.dumpdir() << "\n" " \n" " \n" " " << config.maxconn() << "\n" " " << config.connrate_time() << "\n" " " << config.hardmaxconnrate() << "\n" " " << config.softmaxconnrate() << "\n" " " << config.defertime() << "\n" " " << config.hardmaxconnexcess() << "\n" " " << config.softmaxconnexcess() << "\n" " \n" " \n" " \n"; for (unsigned i = 0; i < config.nallow(); i++) o << " \n" " " << i << "\n" " " << inet2string(config.allow(i)) << "\n" " \n"; o << " \n" " \n"; for (unsigned i = 0; i < config.ndeny(); i++) o << " \n" " " << i << "\n" " " << inet2string(config.deny(i)) << "\n" " \n"; o << " \n" " \n" " \n" " " << config.addxrversion() << "\n" " " << config.addxforwardedfor() << "\n" " " << config.stickyhttp() << "\n" " " << config.replacehostheader() << "\n" " \n" ; for (unsigned i = 0; i < config.nserverheaders(); i++) o << " \n" " " << i << "\n" "
" << config.serverheader(i) << "
\n" "
\n" ; o << "
\n" "
\n" " " << balancer.nbackends() << "\n" " " << balancer.terminate() << "\n" " " << balancer.connections() << "\n" "
\n" ; for (unsigned i = 0; i < balancer.nbackends(); i++) o << " \n" " " << i << "\n" "
" << balancer.backend(i).description() << "
\n" " " << balancer.backend(i).weight() << "\n" " " << balancer.backend(i).maxconn() << "\n" " " << balancer.backend(i).loadavg() << "\n" " " << balancer.backend(i).upstr() << "\n" " " << balancer.backend(i).livestr() << "\n" " " << balancer.backend(i).availablestr() << "\n" " " << balancer.backend(i).connections() << "\n" " " << balancer.backend(i).connecterrors() << "\n" " " << balancer.backend(i).bytesserved() << "\n" " " << balancer.backend(i).clientsserved() << "\n" " " << balancer.backend(i).hostmatch() << "\n" " " << balancer.backend(i).urlmatch() << "\n" " " << balancer.backend(i).backendcheck().setting() << "\n" "
\n" ; o << " \n" " \n"; unsigned nthreads = 0, max_open_files; struct rlimit rl; if (getrlimit(RLIMIT_NOFILE, &rl)) throw Error("Failed to get limit for open files"); max_open_files = unsigned(rl.rlim_cur); for (Threadmap::iterator it = Threadlist::map().begin(); it != Threadlist::map().end(); it++) { nthreads++; pthread_t thread_id = (*it).first; Threadinfo thread_info = (*it).second; o << " \n" " " << thread_id << "\n" " " << thread_info.desc() << "\n" " " << thread_info.backend() << "\n" "
"; if (thread_info.backend() >= 0) o << balancer.backend(thread_info.backend()).description(); o << "
\n" " " << thread_info.timestamp().elapsed() << "\n" " " << inet2string(thread_info.clientip()) << "\n" "
\n"; } /* The estimate of the number of used fd's is: * Base is 5 (stdin/stdout/stderr, listen-fd for service, listen-fd * for webinterface * Plus 2 x #-threads (1 to client, 1 to backend) * There will be fd's in use for shared libs etc., but we don't see * those.. */ o << "
\n" " " << nthreads << "\n" " " << nthreads * 2 + 5 << "\n" " " << max_open_files << "\n" "
\n"; o << "
\n\n"; answer_blob (o.str()); } crossroads-2.81/xr/webinterface/answer.cc0000644000175000001440000003704612130034075017426 0ustar httpusers#include "webinterface" #include "balancer/balancer" static void stop_backend_thread(pthread_t id) { Threadinfo info = Threadlist::info(id); msg("Stopping thread " << id << " (backend socket " << info.backendfd() << ", client socket " << info.clientfd() + ")\n"); close(info.backendfd()); close(info.clientfd()); Threadlist::deregister(id); } static unsigned str2uns (string const &s, string const &desc) { unsigned ret; if (sscanf (s.c_str(), "%u", &ret) < 1) throw Error("Bad " + desc); return (ret); } static double str2dbl (string const &s, string const &desc) { double ret; if (sscanf (s.c_str(), "%lf", &ret) < 0) throw Error("Bad " + desc); return (ret); } static pthread_t str2threadid (string const &s, string const &desc) { pthread_t ret; long long val; int convret; if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) convret = sscanf(s.c_str() + 2, "%llx", &val); else convret = sscanf(s.c_str(), "%lld", &val); if (convret < 1) throw Error("Bad " + desc); memcpy (&ret, &val, sizeof(ret)); return (ret); } static unsigned backendindex (string const &s) { unsigned ret; ret = str2uns (s, "back end index"); if (ret >= balancer.nbackends()) throw Error("Back end index out of range"); return (ret); } static unsigned headerindex (string const &s) { unsigned ret; ret = str2uns (s, "header index"); if (ret >= config.nserverheaders()) throw Error("Server header index out of range"); return (ret); } bool str2bool (string const &s, string const &desc) { int i; bool ret; if (sscanf (s.c_str(), "%d", &i) > 0) ret = (i != 0); else if (s == "on" || s == "yes" || s == "true") ret = true; else if (s == "off" || s == "no" || s == "false") ret = false; else throw Error("Bad " + desc + " switch '" + s + "'"); return (ret); } string decode (string const &s) { string ret; for (char const *cp = s.c_str(); cp && *cp;) { if (*cp == '%') { int v; cp++; if (sscanf (cp, "%2x", &v)) { ret += static_cast(v); cp += 2; }else { ret += '%'; } } else if (*cp == '+') { ret += ' '; } else { ret += *cp; cp++; } } // debugmsg ("Decoded: '" + s + "' into '" + ret + "'\n"); return (ret); } void Webinterface::answer(Httpbuffer req) { if (req.requestmethod() != Httpbuffer::m_get) throw Error("Only request method GET supported"); // If web interface authentication is in effect, then we need the creds // for all requests. if (config.webinterface_auth() != "") { // Incoming auth headers have the format: // Authorization: Basic BASE64-ENCODED-UN:PW string given_auth = req.headerval("Authorization:"); if (given_auth.length() > 6) given_auth = given_auth.substr(6); if (base64_decode(given_auth) != config.webinterface_auth()) { string resp = "HTTP/1.0 401 Authorization Required\r\n" "WWW-Authenticate: Basic realm=\"Crossroads Web Interface\"\r\n" "Content-Length: 0\r\n" "\r\n"; Netbuffer buf(resp); buf.netwrite(cfd, config.client_write_timeout()); return; } } string uri = req.requesturi(); // Status overview if (uri == "/") { answer_status(); return; } // XSLT request if (uri == "/xslt") { answer_xslt(); return; } // /favicon.ico requests (those pesky browsers) if (uri == "/favicon.ico") { string resp = "HTTP/1.0 404 Not Found\r\n" "Content-Length: 0\r\n" "\r\n"; Netbuffer buf(resp); buf.netwrite(cfd, config.client_write_timeout()); return; } if (uri[0] == '/') uri = uri.substr(1); vector parts = str2parts (uri, '/'); for (unsigned i = 0; i < parts.size(); i++) parts[i] = decode(parts[i]); // server/buffersize/VALUE if (parts.size() == 3 && parts[0] == "server" && parts[1] == "buffersize") { unsigned sz = str2uns (parts[2], "buffer size"); if (sz < 1) throw Error("Buffer size may not be less than 1"); config.buffersize(sz); answer_status(); return; } // /server/webinterfaceauth/ // /server/webinterfaceauth/USER:PASS if (parts.size() == 3 && parts[0] == "server" && parts[1] == "webinterfaceauth") { config.webinterface_auth(parts[2]); answer_status(); return; } // /server/maxconnections/ // /server/maxconnections/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "maxconnections") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "server weight"); config.maxconn(num); answer_status(); return; } // /server/addxrversion/BOOLEAN if (parts.size() == 3 && parts[0] == "server" && parts[1] == "addxrversion") { config.addxrversion (str2bool (parts[2], "addxrversion")); answer_status(); return; } // /server/addxforwardedfor/BOOLEAN if (parts.size() == 3 && parts[0] == "server" && parts[1] == "addxforwardedfor") { config.addxforwardedfor (str2bool (parts[2], "addxforwardedfor")); answer_status(); return; } // /server/stickyhttp/BOOLEAN if (parts.size() == 3 && parts[0] == "server" && parts[1] == "stickyhttp") { config.stickyhttp (str2bool(parts[2], "stickyhttp")); answer_status(); return; } // /server/replacehostheader/BOOLEAN if (parts.size() == 3 && parts[0] == "server" && parts[1] == "replacehostheader") { config.replacehostheader (str2bool(parts[2], "replacehostheader")); answer_status(); return; } // /server/newheader/NEWHEADER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "newheader") { config.addserverheader(parts[2]); answer_status(); return; } // /server/changeheader/NR // /server/changeheader/NR/VALUE if (parts.size() == 4 && parts[0] == "server" && parts[1] == "changeheader") { unsigned ind = headerindex(parts[2]); if (parts[3] == "") config.removeserverheader(ind); else config.changeserverheader(ind, parts[3]); answer_status(); return; } // /server/verbose/BOOLEAN if (parts.size() == 3 && parts[0] == "server" && parts[1] == "verbose") { config.verbose(str2bool(parts[2], "verbose")); answer_status(); return; } // /server/debug/VERBOSE if (parts.size() == 3 && parts[0] == "server" && parts[1] == "debug") { config.debug(str2bool(parts[2], "debug")); answer_status(); return; } // /server/logtrafficdir // /server/logtrafficdir/VALUE if (parts.size() == 3 && parts[0] == "server" && parts[1] == "logtrafficdir") { config.dumpdir(parts[2]); answer_status(); return; } // /server/clientreadtimeout // /server/clientreadtimeout/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "clientreadtimeout") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "client read timeout"); config.client_read_timeout(num); answer_status(); return; } // /server/clientwritetimeout // /server/clientwritetimeout/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "clientwritetimeout") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "client write timeout"); config.client_write_timeout(num); answer_status(); return; } // /server/backendreadtimeout // /server/backendreadtimeout/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "backendreadtimeout") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "back end read timeout"); config.backend_read_timeout(num); answer_status(); return; } // /server/backendwritetimeout // /server/backendwritetimeout/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "backendwritetimeout") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "back end write timeout"); config.backend_write_timeout(num); answer_status(); return; } // /server/dnscachetimeout // /server/dnscachetimeout/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "dnscachetimeout") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "DNS cache timeout"); config.dnscachetimeout(num); answer_status(); return; } // /server/wakeupinterval // /server/wakeupinterval/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "wakeupinterval") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "wakeup interval"); if (num) config.checkupsec(0); config.wakeupsec(num); answer_status(); return; } // /server/checkupinterval // /server/checkupinterval/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "checkupinterval") { unsigned num = 0; if (parts[2] != "") num = str2uns (parts[2], "checkup interval"); if (num) config.wakeupsec(0); config.checkupsec(num); answer_status(); return; } // /server/timeinterval/SECS if (parts.size() == 3 && parts[0] == "server" && parts[1] == "timeinterval") { unsigned num = str2uns(parts[2], "time interval"); if (num < 1) throw Error("Time interval may not be less than 1"); config.connrate_time(num); answer_status(); return; } // /server/hardmaxconnrate/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "hardmaxconnrate") { config.hardmaxconnrate(str2uns(parts[2], "hard maxconnrate")); answer_status(); return; } // /server/softmaxconnrate/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "softmaxconnrate") { config.softmaxconnrate(str2uns(parts[2], "soft maxconnrate")); answer_status(); return; } // /server/defertime/NUMBER if (parts.size() == 3 && parts[0] == "server" && parts[1] == "defertime") { unsigned num = str2uns(parts[2], "defer time"); if (num < 1) throw Error("Defer time may not be less than 1"); config.defertime(num); answer_status(); return; } // /server/closesocketsfast/BOOL if (parts.size() == 3 && parts[0] == "server" && parts[1] == "closesocketsfast") { config.fastclose(str2bool(parts[2], "close sockets fast")); answer_status(); return; } // /server/addallowfrom/ADDRESS if (parts.size() == 3 && parts[0] == "server" && parts[1] == "addallowfrom") { config.addallow(parts[2]); answer_status(); return; } // /server/allowfrom/NR // /server/allowfrom/NR/ADDRESS if (parts.size() == 4 && parts[0] == "server" && parts[1] == "allowfrom") { unsigned ind = str2uns(parts[2], "allowfrom index"); if (parts[3] != "") config.changeallow(parts[3], ind); else config.deleteallow(ind); answer_status(); return; } // /server/adddenyfrom/ADDRESS if (parts.size() == 3 && parts[0] == "server" && parts[1] == "adddenyfrom") { config.adddeny(parts[2]); answer_status(); return; } // /server/denyfrom/NR // /server/denyfrom/NR/ADDRESS if (parts.size() == 4 && parts[0] == "server" && parts[1] == "denyfrom") { unsigned ind = str2uns(parts[2], "denyfrom index"); if (parts[3] != "") config.changedeny(parts[3], ind); else config.deletedeny(ind); answer_status(); return; } // /server/hardmaxconnexcess/ // /server/hardmaxconnexcess/PROGRAM if (parts.size() == 3 && parts[0] == "server" && parts[1] == "hardmaxconnexcess") { config.hardmaxconnexcess(parts[2]); answer_status(); return; } // /server/softmaxconnexcess/ // /server/softmaxconnexcess/PROGRAM if (parts.size() == 3 && parts[0] == "server" && parts[1] == "softmaxconnexcess") { config.softmaxconnexcess(parts[2]); answer_status(); return; } // /server/onstart/ // /server/onstart/PROGRAM if (parts.size() == 3 && parts[0] == "server" && parts[1] == "onstart") { config.onstart(parts[2]); answer_status(); return; } // /server/onend/ // /server/onend/PROGRAM if (parts.size() == 3 && parts[0] == "server" && parts[1] == "onend") { config.onend(parts[2]); answer_status(); return; } // /server/onfail/ // /server/onfail/PROGRAM if (parts.size() == 3 && parts[0] == "server" && parts[1] == "onfail") { config.onfail(parts[2]); answer_status(); return; } // /server/addbackend/IP:PORT if (parts.size() == 3 && parts[0] == "server" && parts[1] == "addbackend") { vector address = str2parts(parts[2], ':'); if (address.size() != 2) throw Error("When adding back ends, the address must be IP:PORT"); Backend b; b.server(address[0]); b.port(str2uns(address[1], "back end port")); balancer.addbackend(b, false, false, false); answer_status(); return; } // /server/deletebackend/NR if (parts.size() == 3 && parts[0] == "server" && parts[1] == "deletebackend") { balancer.deletebackend(backendindex(parts[2])); answer_status(); return; } // /server/type/http, /server/type/tcp if (parts.size() == 3 && parts[0] == "server" && parts[1] == "type") { config.stype(parts[2]); answer_status(); return; } // /backend/NR/weight/NUMBER if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "weight") { unsigned ind = backendindex(parts[1]); unsigned num = str2uns (parts[3], "back end weight"); if (num < 1) throw Error("Weight may not be less than 1"); balancer.backend(ind).weight(num); answer_status(); return; } // /backend/NR/maxconnections/NUMBER if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "maxconnections") { unsigned ind = backendindex(parts[1]); unsigned num = str2uns (parts[3], "back end maxconnections"); balancer.backend(ind).maxconn(num); answer_status(); return; } // /backend/NR/loadavg/FLOAT if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "loadavg") { unsigned ind = backendindex(parts[1]); double fnum = str2dbl (parts[3], "back end loadavg"); balancer.backend(ind).loadavg(fnum); answer_status(); return; } // /backend/NR/hostmatch/EXPRESSION // /backend/NR/hostmatch if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "hostmatch") { unsigned ind = backendindex(parts[1]); balancer.backend(ind).hostmatch(parts[3]); answer_status(); return; } // /backend/NR/urlmatch/EXPRESSION // /backend/NR/urlmatch if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "urlmatch") { unsigned ind = backendindex(parts[1]); balancer.backend(ind).urlmatch(parts[3]); answer_status(); return; } // /backend/NR/up/BOOL if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "up") { unsigned ind = backendindex(parts[1]); balancer.backend(ind).up(str2bool(parts[3], "up")); answer_status(); return; } // /backend/NR/backendcheck/ // /backend/NR/backendcheck/VALUE if (parts.size() == 4 && parts[0] == "backend" && parts[2] == "backendcheck") { unsigned ind = backendindex(parts[1]); BackendCheck check; if (parts[3] != "") check.parse(parts[3]); balancer.backend(ind).backendcheck(check); answer_status(); return; } // /backend/NR/stopconnections if (parts.size() == 3 && parts[0] == "backend" && parts[2] == "stopconnections") { unsigned ind = backendindex(parts[1]); bool done = false; while (!done) { done = true; for (Threadmap::iterator it = Threadlist::map().begin(); it != Threadlist::map().end(); it++) { pthread_t thread_id = (*it).first; Threadinfo thread_info = (*it).second; if (thread_info.backend() == (int)ind) { stop_backend_thread(thread_id); done = false; break; } } } answer_status(); return; } // /thread/kill/VALUE if (parts.size() == 3 && parts[0] == "thread" && parts[1] == "kill") { pthread_t id = str2threadid(parts[2], "thread id"); stop_backend_thread(id); answer_status(); return; } throw Error("No action for URI '/" + uri + "'"); } crossroads-2.81/xr/webinterface/execute.cc0000644000175000001440000000401512130034075017557 0ustar httpusers#include "webinterface" #include "balancer/balancer" void Webinterface::execute() { Threadlist::desc("Web interface"); // Create the server socket, or retry infinitely. // This is maybe a too big precaution - previous xr's are responsible // for killing off their web interfaces. But we don't want a new xr // start to croak and cause downtime just because the web interface, // so we just retry for a bit. while (true) { try { msg("Starting web interface\n"); sfd.bind(config.webinterfaceip(), config.webinterfaceport()); } catch (Error const &e) { mutex_lock(&cerr); if (config.prefixtimestamp()) { Timestamp tm; cerr << tm.desc() << ' '; } cerr << e.what() << " (webinterface, retrying in a sec)\n"; mutex_unlock(&cerr); sleep(1); continue; } break; } msg("Web interface started on socket " << sfd.fd() << "\n"); while (!balancer.terminate()) { try { Fdset fdset(0); fdset.add (sfd); fdset.wait_r(); if (fdset.readable(sfd)) { cfd = sfd.accept(); serve(); cfd.close(); } } catch (Error const &e) { mutex_lock(&cerr); if (config.prefixtimestamp()) { Timestamp tm; cerr << tm.desc() << ' '; } cerr << e.what() << " (webinterface)\n"; mutex_unlock(&cerr); if (cfd.fd() >= 0) { ostringstream m; m << "\n" " \n" " Web interface error\n" " \n" " \n" "

Web interface error

\n" " XR's web interface could not handle your request.\n" "

\n" " " << e.what() << "\n" " \n" "\n"; ostringstream o; o << "HTTP/1.0 500 Server Error\r\n" "X-Reason: " << e.what() << "\r\n" "Content-Length: " << m.str().length() << "\r\n" "\r\n" << m.str(); Netbuffer buf(o.str()); buf.netwrite(cfd, config.client_write_timeout()); cfd.close(); } } } msg("Web interface stopping.\n"); sfd.close(); } crossroads-2.81/xr/webinterface/answerxslt.cc0000644000175000001440000000017012130034075020325 0ustar httpusers#include "webinterface" #include "../build/status.xslt.h" void Webinterface::answer_xslt() { answer_blob (XSLT); } crossroads-2.81/xr/webinterface/serve.cc0000644000175000001440000000051112130034075017236 0ustar httpusers#include "webinterface" void Webinterface::serve() { debugmsg("Webinterface serving request on client fd " << cfd.fd() << '\n'); Httpbuffer clientrequest; clientrequest.netread(cfd, config.client_read_timeout()); msg("Webinterface request: " << clientrequest.firstline() << '\n'); answer(clientrequest); } crossroads-2.81/xr/webinterface/webinterface0.cc0000644000175000001440000000014012130034075020626 0ustar httpusers#include "webinterface" Webinterface::~Webinterface() { msg("Stopping web interface\n"); } crossroads-2.81/xr/webinterface/webinterface1.cc0000644000175000001440000000011012130034075020624 0ustar httpusers#include "webinterface" Webinterface::Webinterface(): cfd(), sfd() { } crossroads-2.81/xr/Makefile0000644000175000001440000000430712130034075014614 0ustar httpusers # Configuration DIRS = $(shell find . -type d | grep -v '.svn') BUILDDIR = build BIN = $(BUILDDIR)/xr LIB = $(BUILDDIR)/libxr.a TMPXR = /tmp/xr-$(shell whoami) CONF_CC = $(shell etc/c-conf -c $(BUILDDIR)/config.cache c++-compiler) CONF_OPTFLAGS = $(shell etc/c-conf -c $(BUILDDIR)/config.cache optflags) CONF_LIB = $(shell etc/c-conf -c $(BUILDDIR)/config.cache \ lib ucb nsl pthread socket m alf) CONF_GETOPT = $(shell etc/c-conf -c $(BUILDDIR)/config.cache \ ifheader getopt.h HAVE_GETOPT_H) CONF_GETOPT_LONG = $(shell etc/c-conf -c $(BUILDDIR)/config.cache \ libfunction getopt_long HAVE_GETOPT_LONG) CONF_INET_ATON = $(shell etc/c-conf -c $(BUILDDIR)/config.cache \ libfunction inet_aton HAVE_INET_ATON) CONF_STRNSTR = $(shell etc/c-conf -c $(BUILDDIR)/config.cache \ libfunction strnstr HAVE_STRNSTR) foo: $(MAKE) subdirs $(MAKE) $(BIN) install: $(BINDIR)/xr $(BINDIR)/xr: $(BIN) cp $(BIN) $(TMPXR) strip $(TMPXR) install $(TMPXR) $(BINDIR)/xr rm -f $(TMPXR) subdirs: $(BUILDDIR)/usage.h $(BUILDDIR)/status.xslt.h @echo 'About to build in class dirs: $(DIRS)' @for f in $(DIRS) ; do \ echo "Making: $$f"; \ BASE=$(BASE) CC=$(CONF_CC) BUILDDIR=$(BUILDDIR) VER='$(VER)' \ AUTHOR='$(AUTHOR)' MAINTAINER='$(MAINTAINER)' \ DISTSITE='$(DISTSITE)' MEMDEBUG=$(MEMDEBUG) BINDIR='$(BINDIR)' \ CONF_CC='$(CONF_CC)' CONF_LIB='$(CONF_LIB)' \ CONF_GETOPT=$(CONF_GETOPT) CONF_GETOPT_LONG=$(CONF_GETOPT_LONG) \ CONF_INET_ATON=$(CONF_INET_ATON) \ CONF_OPTFLAGS='$(CONF_OPTFLAGS)' \ CONF_STRNSTR=$(CONF_STRNSTR) \ $(MAKE) -C $$f -f $(BASE)/xr/etc/Makefile.class \ || exit 1; \ done ar rs $(LIB) */*.o ranlib $(LIB) $(BUILDDIR)/usage.h: etc/usage.txt etc/e-txt2c USAGE $(BUILDDIR)/usage.h touch config/parsecmdline.cc $(BUILDDIR)/status.xslt.h: etc/status.xslt etc/e-txt2c XSLT $(BUILDDIR)/status.xslt.h touch webinterface/answerxslt.cc $(BIN): $(LIB) $(CONF_CC) $(PROF) $(CONF_OPTFLAGS) -g -o $(BIN) \ -L$(BUILDDIR) -lxr $(CONF_LIB) clean: rm -f $(BIN) $(LIB) core obj/*.o etc/usage.h $(BUILDDIR)/config.cache find . -name \*.bak -exec rm {} \; crossroads-2.81/xr/build/0000755000175000001440000000000012130034076014250 5ustar httpuserscrossroads-2.81/xr/fdset/0000755000175000001440000000000012130034076014256 5ustar httpuserscrossroads-2.81/xr/fdset/fdset1.cc0000644000175000001440000000020412130034075015746 0ustar httpusers#include "fdset" Fdset::Fdset (int t) : tsec(t), set() { FD_ZERO(&readset); FD_ZERO(&writeset); FD_ZERO(&exceptset); } crossroads-2.81/xr/fdset/fdset0000644000175000001440000000210512130034075015303 0ustar httpusers#ifndef _FDSET_ #define _FDSET_ #include "../sys/sys" #include "../error/error" #include "../config/config" #include "../SocketHandling/socket/socket" using namespace std; class Fdset { public: Fdset(int t); int timeout() const { return tsec; } void timeout(int t) { tsec = t; } void add(int fd) { set.push_back(fd); } void add(Socket &s) { set.push_back(s.fd()); } unsigned size() const { return set.size(); } int fd(unsigned index) { return set[index]; } double wait(bool wait_read, bool wait_write); double wait_rw() { return wait(true, true); } double wait_r() { return wait(true, false); } double wait_w() { return wait(false, true); } bool readable(int fd) { return FD_ISSET(fd, &readset); } bool readable(Socket &s) { return FD_ISSET(s.fd(), &readset); } bool writeable(int fd) { return FD_ISSET(fd, &writeset); } bool writeable(Socket &s) { return FD_ISSET(s.fd(), &writeset); } private: int tsec; fd_set readset, writeset, exceptset; vector set; }; #endif crossroads-2.81/xr/fdset/wait.cc0000644000175000001440000000411712130034075015533 0ustar httpusers#include "fdset" double Fdset::wait(bool wait_read, bool wait_write) { PROFILE("Fdset::wait"); Timestamp start; struct timeval tv, *tvp; // No fd's? Nothing to wait for. if (set.size() < 1) throw Error("Internal jam in Fdset::wait(): no fd's to wait for"); // Prepare select sets. FD_ZERO (&readset); FD_ZERO (&writeset); FD_ZERO (&exceptset); for (unsigned i = 0; i < set.size(); i++) { FD_SET (set[i], &readset); FD_SET (set[i], &writeset); FD_SET (set[i], &exceptset); debugmsg("About to wait for fd "<< set[i] << '\n'); } // Prepare timout specifier. if (tsec) { tv.tv_sec = tsec; tv.tv_usec = 0; tvp = &tv; debugmsg("Waiting limitation: " << tsec << '\n'); } else { tvp = 0; debugmsg("No waiting limitation\n"); } // Run the select. if (select (FD_SETSIZE, wait_read ? &readset : 0, wait_write ? &writeset : 0, &exceptset, tvp) < 0) { if (errno != EINTR) throw Error(string("Select failure: failed to wait: ") + strerror(errno)); FD_ZERO(&readset); FD_ZERO(&writeset); FD_ZERO(&exceptset); return start.elapsed(); } // Check for exceptions. for (unsigned i = 0; i < set.size(); i++) if (FD_ISSET (set[i], &exceptset)) { ostringstream o; o << "Exception on fd/socket " << int(set[i]); throw Error(o.str()); } // More debugging: What has become readable, what has become // writeable, also state if no change was seen if (config.debug()) { bool statechanged = false; for (unsigned int i = 0; i < FD_SETSIZE; i++) { if (FD_ISSET(i, &readset)) { debugmsg("Fd " << i << " is readable\n"); statechanged = true; } if (FD_ISSET(i, &writeset)) { debugmsg("Fd " << i << " is writeable\n"); statechanged = true; } } if (!statechanged) { ostringstream o; o << "Select timeout: neither of the fd's "; for (unsigned int i = 0; i < set.size(); i++) o << set[i] << ' '; o << "has shown activity in " << tsec << " sec\n"; debugmsg(o.str()); } } // All done. Return microsecs since start. return start.elapsed(); } crossroads-2.81/xr/error/0000755000175000001440000000000012130034076014302 5ustar httpuserscrossroads-2.81/xr/error/error0000644000175000001440000000054712130034075015363 0ustar httpusers#ifndef _ERROR_ #define _ERROR_ #include "sys/sys" #include "timestamp/timestamp" using namespace std; class Error { public: Error (string s); Error (int i); Error &operator+ (Error const &other); Error &operator+ (string const &s); Error &operator+ (int i); char const *what() const throw (); private: string desc; }; #endif crossroads-2.81/xr/error/opplus1.cc0000644000175000001440000000015712130034075016216 0ustar httpusers#include "error" Error &Error::operator+ (Error const &other) { desc += other.desc; return (*this); } crossroads-2.81/xr/error/opplus2.cc0000644000175000001440000000014312130034075016212 0ustar httpusers#include "error" Error &Error::operator+ (string const &s) { desc += s; return (*this); } crossroads-2.81/xr/error/opplus3.cc0000644000175000001440000000020612130034075016213 0ustar httpusers#include "error" Error &Error::operator+ (int i) { ostringstream o; o << i; desc += o.str(); return (*this); } crossroads-2.81/xr/error/what.cc0000644000175000001440000000041512130034075015553 0ustar httpusers#include "error" #include "../config/config" char const *Error::what() const throw (){ ostringstream o; if (config.prefixtimestamp()) { Timestamp tm; o << tm.desc() << ' '; } o << pthread_self() << " ERROR: " << desc; return (o.str().c_str()); } crossroads-2.81/xr/error/error1.cc0000644000175000001440000000006712130034075016025 0ustar httpusers#include "error" Error::Error (string s): desc(s) { } crossroads-2.81/xr/error/error2.cc0000644000175000001440000000014012130034075016016 0ustar httpusers#include "error" Error::Error (int i) { ostringstream o; o << i; desc = o.str(); } crossroads-2.81/xr/backendvector/0000755000175000001440000000000012130034076015763 5ustar httpuserscrossroads-2.81/xr/backendvector/backendvector0000644000175000001440000000104112130034075020513 0ustar httpusers#ifndef _BACKENDVECTOR_ #define _BACKENDVECTOR_ class BackendVector { public: BackendVector(): vec(), is_defined(false) {}; bool isdefined() const { return is_defined; } void isdefined(bool i) { is_defined = i; } void add (unsigned nr) { vec.push_back(nr); } unsigned size() const { return vec.size(); } unsigned operator[] (unsigned index) const { return vec[index]; } void reset() { vec.clear(); is_defined = false; } private: vector vec; bool is_defined; }; #endif crossroads-2.81/xr/timestamp/0000755000175000001440000000000012130034076015154 5ustar httpuserscrossroads-2.81/xr/timestamp/elapsed.cc0000644000175000001440000000040712130034075017100 0ustar httpusers#include "timestamp" double Timestamp::elapsed() const { struct timeval end; gettimeofday(&end, 0); double usec = ( ((double)end.tv_sec * 1000000 + end.tv_usec) - ((double)tv.tv_sec * 1000000 + tv.tv_usec) ); return usec / 1000000; } crossroads-2.81/xr/timestamp/desc.cc0000644000175000001440000000055412130034075016404 0ustar httpusers#include "timestamp" string Timestamp::desc() const { struct tm *tmp = localtime(&tv.tv_sec); char buf[80]; sprintf (buf, "%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d,%3.3d", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, tmp->tm_hour, tmp->tm_min, tmp->tm_sec, int(tv.tv_usec / 1000)); return buf; } crossroads-2.81/xr/timestamp/timestamp0000644000175000001440000000035512130034075017104 0ustar httpusers#ifndef _TIMESTAMP_ #define _TIMESTAMP_ #include "sys/sys" class Timestamp { public: Timestamp(); Timestamp(int sec_since_epoch); double elapsed() const; string desc() const; private: struct timeval tv; }; #endif crossroads-2.81/xr/timestamp/timestamp1.cc0000644000175000001440000000011312130034075017541 0ustar httpusers#include "timestamp" Timestamp::Timestamp() { gettimeofday(&tv, 0); } crossroads-2.81/xr/timestamp/timestamp2.cc0000644000175000001440000000017112130034075017546 0ustar httpusers#include "timestamp" Timestamp::Timestamp(int sec_since_epoch) { tv.tv_sec = sec_since_epoch; tv.tv_usec = 0; } crossroads-2.81/xr/backenddef/0000755000175000001440000000000012130034076015217 5ustar httpuserscrossroads-2.81/xr/backenddef/backenddef1.cc0000644000175000001440000000150012130034075017650 0ustar httpusers#include "backenddef" unsigned BackendDef::min_wt; unsigned BackendDef::max_wt; bool BackendDef::minmax_wt_set = false; BackendDef::BackendDef (string server, string port, string maxclients, string w) : srv(server), prt(-1), max(0), host_match(""), url_match(""), wt(1), backend_check() { if (sscanf (port.c_str(), "%d", &prt) < 1) throw Error("Bad backend port specifier: '" + port + "' is not a number"); if (maxclients.size() && sscanf (maxclients.c_str(), "%u", &max) < 1) throw Error("Bad maximum connections specifier: '" + maxclients + "' is not a number"); unsigned ww; if (sscanf(w.c_str(), "%u", &ww) < 1) throw Error("Bad backend weight specifier: '" + w + "' is not a number"); if (ww < 1) throw Error("Weights less than 1 are not supported"); weight(ww); } crossroads-2.81/xr/backenddef/backenddef0000644000175000001440000000320412130034075017206 0ustar httpusers#ifndef _BACKENDDEF_ #define _BACKENDDEF_ #include "sys/sys" #include "error/error" #include "profiler/profiler" #include "backendcheck/backendcheck" #include "ThreadsAndMutexes/mutex/mutex" using namespace std; class BackendDef { public: BackendDef(): srv(""), prt(-1), max(0), host_match(""), url_match(""), wt(1), backend_check() { hostmatch(""); urlmatch(""); } BackendDef(string s, string p, string m = "", string w = "1"); void server(string s) { srv = s; } string const &server() const { return (srv); } void port (int p) { prt = p; } int port() const { return (prt); } unsigned maxconn() const { return (max); } void maxconn (unsigned m) { max = m; } unsigned weight() const { return wt; } void weight (unsigned w); unsigned adjustedweight() const { return min_wt + max_wt - wt; } void hostmatch(string const &s); string const &hostmatch() const { return (host_match); } regex_t const &hostregex() const { return (host_regex); } void urlmatch(string const &u); string const &urlmatch() const { return (url_match); } regex_t const &urlregex() const { return (url_regex); } BackendCheck const &backendcheck() { return backend_check; } void backendcheck(BackendCheck const &b) { backend_check = b; } private: string srv; int prt; unsigned max; string host_match; regex_t host_regex; string url_match; regex_t url_regex; unsigned wt; static unsigned min_wt, max_wt; static bool minmax_wt_set; BackendCheck backend_check; }; #endif crossroads-2.81/xr/backenddef/urlmatch.cc0000644000175000001440000000051412130034075017344 0ustar httpusers#include "backenddef" void BackendDef::urlmatch (string const &s) { PROFILE("BackendDef::urlmatch"); url_match = (s == "" ? "." : s); if (regcomp (&url_regex, url_match.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB)) throw Error("Url match specifier '" + url_match + "' isn't a valid regular expression"); } crossroads-2.81/xr/backenddef/hostmatch.cc0000644000175000001440000000052312130034075017517 0ustar httpusers#include "backenddef" void BackendDef::hostmatch (string const &s) { PROFILE("BackendDef::hostmatch"); host_match = (s == "" ? "." : s); if (regcomp (&host_regex, host_match.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB)) throw Error("Host match specifier '" + host_match + "' isn't a valid regular expression"); } crossroads-2.81/xr/backenddef/weight.cc0000644000175000001440000000047512130034075017022 0ustar httpusers#include "backenddef" void BackendDef::weight(unsigned w) { static int lock; mutex_lock(&lock); wt = w; if (!minmax_wt_set) { min_wt = w; max_wt = w; minmax_wt_set = true; } else { if (min_wt < w) min_wt = w; if (max_wt > w) max_wt = w; } mutex_unlock(&lock); } crossroads-2.81/xr/netbuffer/0000755000175000001440000000000012130034076015131 5ustar httpuserscrossroads-2.81/xr/netbuffer/setchar.cc0000644000175000001440000000030412130034075017065 0ustar httpusers#include "netbuffer" bool Netbuffer::setchar(unsigned offset, char ch) { PROFILE("Netbuffer::setchar"); if (offset >= buf_sz) return false; buf_data[offset] = ch; return true; } crossroads-2.81/xr/netbuffer/copy.cc0000644000175000001440000000060412130034075016411 0ustar httpusers#include "netbuffer" void Netbuffer::copy (Netbuffer const &other) { debugmsg("Netbuffer: copying other\n"); buf_sz = other.buf_sz; buf_alloced = other.buf_alloced; LOCK_MALLOC; buf_data = (char*)malloc(buf_alloced); UNLOCK_MALLOC; if (!buf_data) throw Error("Memory fault in Netbuffer::copy"); memcpy (buf_data, other.buf_data, buf_alloced); } crossroads-2.81/xr/netbuffer/printable.cc0000644000175000001440000000066512130034075017426 0ustar httpusers#include "netbuffer" string Netbuffer::printable (char ch) const { ostringstream o; if (isprint(ch) && ch != '\\') { o << ch; return (o.str()); } else if (ch == '\n') return ("\\n"); else if (ch == '\r') return ("\\r"); else if (ch == '\t') return ("\\t"); else { char buf[10]; sprintf (buf, "%3.3o", ch & 0xff); o << "\\" << buf; return (o.str()); } // Avoid warnings return ("."); } crossroads-2.81/xr/netbuffer/reset.cc0000644000175000001440000000015212130034075016557 0ustar httpusers#include "netbuffer" void Netbuffer::reset() { debugmsg("Netbuffer: resetting\n"); buf_sz = 0; } crossroads-2.81/xr/netbuffer/destroy.cc0000644000175000001440000000033012130034075017124 0ustar httpusers#include "netbuffer" void Netbuffer::destroy() { if (buf_alloced) debugmsg("Netbuffer: destroying " << buf_alloced << " bytes\n"); free(buf_data); buf_data = 0; buf_sz = 0; buf_alloced = 0; } crossroads-2.81/xr/netbuffer/charat.cc0000644000175000001440000000026012130034075016677 0ustar httpusers#include "netbuffer" char Netbuffer::charat(unsigned index) const { PROFILE("Netbuffer::charat"); if (index >= buf_sz) return (0); return buf_data[index]; } crossroads-2.81/xr/netbuffer/netbuffer1.cc0000644000175000001440000000022112130034075017473 0ustar httpusers#include "netbuffer" Netbuffer::Netbuffer(): buf_data(0), buf_sz(0), buf_alloced(0) { debugmsg("Netbuffer: creating zero size buffer\n"); } crossroads-2.81/xr/netbuffer/netbuffer2.cc0000644000175000001440000000013212130034075017475 0ustar httpusers#include "netbuffer" Netbuffer::Netbuffer (Netbuffer const &other) { copy (other); } crossroads-2.81/xr/netbuffer/netbuffer3.cc0000644000175000001440000000010112130034075017472 0ustar httpusers#include "netbuffer" Netbuffer::~Netbuffer() { destroy(); } crossroads-2.81/xr/netbuffer/netbuffer4.cc0000644000175000001440000000020012130034075017473 0ustar httpusers#include "netbuffer" Netbuffer::Netbuffer (string const &s): buf_data(0), buf_sz(0), buf_alloced(0) { setstring(s); } crossroads-2.81/xr/netbuffer/netbuffer0000644000175000001440000000327412130034075017041 0ustar httpusers#ifndef _NETBUFFER_ #define _NETBUFFER_ #include "sys/sys" #include "memory/memory" #include "error/error" #include "config/config" #include "profiler/profiler" #include "fdset/fdset" #include "servertype/servertype" /* A few defs when malloc() / realloc() are suspected to be not thread-safe. * The defines are used in eg. copy() and check_space(). */ #ifdef MISTRUST_MALLOC_THREADSAFE #define LOCK_MALLOC mutex_lock((void*)malloc) #define UNLOCK_MALLOC mutex_unlock((void*)malloc) #else #define LOCK_MALLOC #define UNLOCK_MALLOC #endif class Netbuffer MEM(: public Memory) { public: Netbuffer(); Netbuffer (Netbuffer const &other); Netbuffer (string const &s); virtual ~Netbuffer(); Netbuffer const &operator= (Netbuffer const &other); char charat(unsigned index) const; char operator[] (unsigned index) { return charat(index); } char const *bufdata() const { return buf_data; } unsigned bufsz() const { return buf_sz; } unsigned netread (Socket &s, unsigned timeout = 0); unsigned netwrite (Socket &s, unsigned timeout) const; unsigned strfind (char const *s) const; unsigned charfind (char ch, unsigned start = 0) const; bool setchar(unsigned offset, char ch); void setstring(string const &s); string stringat(unsigned index, unsigned len); bool insertat(unsigned index, char const *s, unsigned len = 0); bool removeat(unsigned index, unsigned len = 1); void reset(); private: void copy (Netbuffer const &other); void destroy(); void check_space(unsigned extra); string printable(char c) const; string printable() const; char *buf_data; unsigned buf_sz; unsigned buf_alloced; }; #endif crossroads-2.81/xr/netbuffer/setstring.cc0000644000175000001440000000041012130034075017454 0ustar httpusers#include "netbuffer" void Netbuffer::setstring(string const &s) { debugmsg("Netbuffer: setting to string\n"); destroy(); check_space(s.size() + 1); buf_sz = s.size(); memcpy (buf_data, s.c_str(), buf_sz); buf_data[buf_sz] = 0; } crossroads-2.81/xr/netbuffer/charfind.cc0000644000175000001440000000042212130034075017213 0ustar httpusers#include "netbuffer" unsigned Netbuffer::charfind(char ch, unsigned start) const { PROFILE("Netbuffer::charfind"); if (buf_sz <= start) return 0; char *cp = (char*)memchr(buf_data + start, ch, buf_sz); if (!cp) return (0); return (cp - buf_data); } crossroads-2.81/xr/netbuffer/netwrite.cc0000644000175000001440000000437312130034075017307 0ustar httpusers#include "netbuffer" #include "balancer/balancer" #include "SocketHandling/socket/socket" unsigned Netbuffer::netwrite (Socket &s, unsigned timeout) const { PROFILE("Netbuffer::netwrite"); debugmsg("About to write " << buf_sz << " bytes to fd " << s.fd() << ", timeout " << timeout << '\n'); if (!buf_sz) return (0); // Log to dump directory if requested if (config.dumpdir().length()) { ostringstream of; of << config.dumpdir() << "/" << balancer.requestnr() << "." << s.fd(); FILE *f; if ( (!(f = fopen (of.str().c_str(), "a"))) && (!(f = fopen (of.str().c_str(), "w"))) ) { warnmsg("Cannot write traffic log " << of.str() << ": " << strerror(errno) << '\n'); } else { fwrite (buf_data, 1, buf_sz, f); fclose (f); } } // Send to the socket unsigned totwritten = 0, ntries = 0; while (totwritten < buf_sz) { // Don't go beyond 5 tries. if (++ntries > 4) { ostringstream o; o << "Network writing to fd " << s.fd() << " failed, " << totwritten << " bytes sent of " << buf_sz; throw Error(o.str()); } // Wait for the socket to become writeable. if (timeout) { Fdset set (timeout); set.add (s); set.wait_w(); if (! set.writeable(s)) { ostringstream o; o << "Fd " << s.fd() << " failed to become writable within " << timeout << " sec"; throw Error(o.str()); } } // Push bytes ssize_t nwritten; nwritten = write (s.fd(), buf_data + totwritten, buf_sz - totwritten); // If any bytes were written, we're ok // EINVAL / EINPROGRESS errors are handled as: retry // All other errors mean the link is broken if (nwritten >= 1) { ntries = 0; if (config.debug()) { ostringstream o; o << "Sent " << nwritten << " bytes to fd " << s.fd() << ": "; for (unsigned i = totwritten; i < totwritten + nwritten; i++) o << printable(buf_data[i]); o << "\n"; debugmsg(o.str()); } totwritten += nwritten; } else if (errno == EINVAL || errno == EINPROGRESS) { msg("Write warning: " << strerror(errno) << '\n'); } else { ostringstream o; o << "Write/send failed: errno=" << int(errno) << ", " << strerror(errno) << ", result=" << int(nwritten); throw Error(o.str()); } } return buf_sz; } crossroads-2.81/xr/netbuffer/stringat.cc0000644000175000001440000000034112130034075017270 0ustar httpusers#include "netbuffer" string Netbuffer::stringat(unsigned index, unsigned len) { string ret; for (unsigned i = index; i < index + len; i++) { if (i >= buf_sz) break; ret += buf_data[i]; } return ret; } crossroads-2.81/xr/netbuffer/printable1.cc0000644000175000001440000000025112130034075017476 0ustar httpusers#include "netbuffer" string Netbuffer::printable() const { string ret; for (unsigned i = 0; i < buf_sz; i++) ret += printable(buf_data[i]); return ret; } crossroads-2.81/xr/netbuffer/insertat.cc0000644000175000001440000000107312130034075017271 0ustar httpusers#include "netbuffer" bool Netbuffer::insertat(unsigned index, char const *s, unsigned len) { PROFILE("Netbuffer::insertat"); if (!len) len = strlen(s); if (config.debug()) { string pr; for (unsigned int i = 0; i < len; i++) pr += printable(s[i]); debugmsg("Netbuffer: inserting " << pr << " at " << index << '\n'); } if (index >= buf_sz) return false; check_space(len); memmove (buf_data + index + len, buf_data + index, buf_sz - index); memcpy (buf_data + index, s, len); buf_sz += len; return true; } crossroads-2.81/xr/netbuffer/checkspace.cc0000644000175000001440000000202612130034075017530 0ustar httpusers#include "netbuffer" void Netbuffer::check_space(unsigned extra) { PROFILE("Netbuffer::check_space"); if (!buf_alloced) { buf_alloced = extra; // When the first network buffer is allocated in HTTP mode, get // twice as much. Most often that will be enough to fetch the whole // client request, so that one realloc() will be spared. if (extra == config.buffersize() && config.stype() == Servertype::t_http) buf_alloced <<= 1; debugmsg("Netbuffer: reserving " << buf_alloced << " bytes for network buffer\n"); LOCK_MALLOC; buf_data = (char*)malloc(buf_alloced); UNLOCK_MALLOC; if (! buf_data) throw Error("Memory fault in Netbuffer::check_space"); } else if (buf_sz + extra > buf_alloced) { debugmsg("Netbuffer: reallocating net buffer from " << buf_alloced << " to " << (buf_alloced + extra) << " bytes\n"); buf_alloced += extra; LOCK_MALLOC; buf_data = (char*)realloc(buf_data, buf_alloced); UNLOCK_MALLOC; if (! buf_data) throw Error("Memory fault in Netbuffer::check_space"); } } crossroads-2.81/xr/netbuffer/removeat.cc0000644000175000001440000000045212130034075017262 0ustar httpusers#include "netbuffer" bool Netbuffer::removeat(unsigned index, unsigned len) { if (index >= buf_sz) return false; if (index + len >= buf_sz) buf_sz = index; else { memmove (buf_data + index, buf_data + index + len, buf_sz - index - len); buf_sz -= len; } return true; } crossroads-2.81/xr/netbuffer/opassign.cc0000644000175000001440000000032412130034075017261 0ustar httpusers#include "netbuffer" Netbuffer const &Netbuffer::operator= (Netbuffer const &other) { debugmsg("Netbuffer: copying other\n"); if (this != &other) { destroy(); copy (other); } return (*this); } crossroads-2.81/xr/netbuffer/netread.cc0000644000175000001440000000222712130034075017064 0ustar httpusers#include "netbuffer" #include "SocketHandling/socket/socket" unsigned Netbuffer::netread (Socket &s, unsigned timeout) { PROFILE("Netbuffer::netread"); // debugmsg("Reading from fd " << s.fd() << ", timeout " // << timeout << "\n"); if (timeout) { Fdset set(timeout); set.add(s); set.wait_r(); if (! set.readable(s)) { msg("Fd "<< s.fd() << " failed to become readable within " << timeout << " sec\n"); return 0; } } check_space(config.buffersize()); // Read from the network. If this fails, don't throw an exception // because it's quite common (too much logging otherwise). ssize_t nread = read (s.fd(), buf_data + buf_sz, config.buffersize()); if (nread < 0) { msg("Read failed on fd " << s.fd() + ": " << strerror(errno) << '\n'); return 0; } buf_sz += nread; if (config.debug() && nread) { ostringstream o; o << "Got " << nread << " bytes from fd " << s.fd() << ", timeout " << timeout << ": "; for (unsigned i = 0; i < (unsigned)nread; i++) o << printable(buf_data[i]); o << "\n"; debugmsg (o.str()); } return nread; } crossroads-2.81/xr/netbuffer/strfind.cc0000644000175000001440000000037212130034075017112 0ustar httpusers#include "netbuffer" unsigned Netbuffer::strfind(char const *s) const { PROFILE("Netbuffer::strfind"); if (!buf_sz) return (0); char *cp = strnstr(buf_data, s, buf_sz); if (cp) return (cp - buf_data); return (0); } crossroads-2.81/xr/backendcheck/0000755000175000001440000000000012130034076015536 5ustar httpuserscrossroads-2.81/xr/backendcheck/backendcheck0000644000175000001440000000160112130034075020043 0ustar httpusers#ifndef _BACKENDCHECK_ #define _BACKENDCHECK_ #include "sys/sys" #include "error/error" class BackendCheck { public: enum CheckType { c_connect, c_get, c_external, }; BackendCheck(); CheckType checktype() const { return check_type; } void checktype(CheckType t) { check_type = t; } string server() const { return srv; } void server(string s) { srv = s; } int port() const { return prt; } void port(int p) { prt = p; } string uri() const { return geturi; } void uri(string u) { geturi = u; } string program() const { return extprog; } void program(string const &p) { extprog = p; } void parse(string setting); string setting() const; string description() const; private: CheckType check_type; string srv; int prt; string geturi; string extprog; }; #endif crossroads-2.81/xr/backendcheck/parse.cc0000644000175000001440000000246612130034075017166 0ustar httpusers#include "backendcheck" static int parse_port(string const &s) { int ret; if (sscanf(s.c_str(), "%d", &ret) < 1) ret = 0; return ret; } static string parse_uri(string const &s) { size_t slash = s.find_first_of('/'); if (slash == string::npos) return ("/"); return s.substr(slash); } void BackendCheck::parse(string setting) { // Resets to default if (!setting.size()) { check_type = c_connect; srv = ""; prt = 0; geturi = ""; extprog = ""; return; } vector parts = str2parts(setting, ':'); // connect:IP:PORT if (parts.size() == 3 && parts[0] == "connect") { check_type = c_connect; srv = parts[1]; prt = parse_port(parts[2]); geturi = ""; extprog = ""; return; } // get:IP:PORT // get:IP:PORT/URI if (parts.size() == 3 && parts[0] == "get") { check_type = c_get; srv = parts[1]; prt = parse_port(parts[2]); geturi = parse_uri(parts[2]); extprog = ""; return; } // external:PROGRAM if (parts.size() == 2 && parts[0] == "external") { check_type = c_external; srv = ""; prt = 0; geturi = ""; extprog = parts[1]; return; } // No luck today throw Error("Back end check specifiers must be either an empty string, " "or 'connect:IP:PORT' or 'get:IP:PORT' or 'get'IP:PORT/URI' " "or 'external:PROGRAM'"); } crossroads-2.81/xr/backendcheck/setting.cc0000644000175000001440000000057412130034075017527 0ustar httpusers#include "backendcheck" string BackendCheck::setting() const { ostringstream o; if (check_type == c_external) o << "external:" << extprog; else { if (check_type == c_connect) o << "connect:"; else o << "get:"; if (srv != "") o << srv; o << ':'; if (prt) o << prt; if (check_type == c_get) o << geturi; } return o.str(); } crossroads-2.81/xr/backendcheck/backendcheck1.cc0000644000175000001440000000020612130034075020510 0ustar httpusers#include "backendcheck" BackendCheck::BackendCheck() : check_type(c_connect), srv(""), prt(0), geturi(""), extprog("") { } crossroads-2.81/xr/backendcheck/description.cc0000644000175000001440000000143312130034075020370 0ustar httpusers#include "backendcheck" string BackendCheck::description() const { ostringstream o; o << "Back end check type: "; switch (check_type) { case c_connect: o << "TCP connect to "; if (srv == "") o << "backend IP, "; else o << "alternative IP '" << srv << "', "; if (prt == 0) o << "backend port"; else o << "alternative port '" << prt << "'"; break; case c_get: o << "HTTP GET to "; if (srv == "") o << "backend IP, "; else o << "alternative IP '" << srv << "', "; if (prt == 0) o << "backend port"; else o << "alternative port '" << prt << "'"; break; case c_external: o << "External program " << extprog; break; default: throw Error("Internal jam in BackendCheck::description"); } return (o.str()); } crossroads-2.81/xr/buffer/0000755000175000001440000000000012130034076014422 5ustar httpuserscrossroads-2.81/xr/buffer/buffer0000644000175000001440000000175212130034075015622 0ustar httpusers#ifndef _BUFFER_ #define _BUFFER_ #include "../error/error" class Buffer { public: Buffer(); Buffer(Buffer const &other); ~Buffer(); Buffer &operator= (Buffer const &other); Buffer &operator= (char const *b); void set (char const *b, unsigned len); void add (char const *b, unsigned len); char const *data() const; int strfind (char const *s) const; char &operator[] (unsigned index); string stringat (unsigned index, unsigned len) const; void removeat (unsigned index, unsigned len = 1); void insertat (unsigned index, char const *s, unsigned len); void insertat (unsigned index, string s); // This ones are called often so let's inline them. unsigned size() const { return (buf_len); } char charat (unsigned index) const { if (index >= buf_len) return (0); return (buf_data[index]); } private: void copy (Buffer const &other); void destroy(); char *buf_data; unsigned buf_len; }; #endif crossroads-2.81/xr/config/0000755000175000001440000000000012130034076014416 5ustar httpuserscrossroads-2.81/xr/config/addxrversion.cc0000644000175000001440000000022612130034075017434 0ustar httpusers#include "config" void Config::addxrversion(bool b) { int lock; mutex_lock (&lock); add_xr_version = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/stickyhttp.cc0000644000175000001440000000022212130034075017126 0ustar httpusers#include "config" void Config::stickyhttp (bool b) { int lock; mutex_lock (&lock); sticky_http = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/ipstoretimeout.cc0000644000175000001440000000023112130034075020014 0ustar httpusers#include "config" void Config::ipstoretimeout (int t) { int lock; mutex_lock (&lock); ipstore_timeout = t; mutex_unlock (&lock); } crossroads-2.81/xr/config/changedeny.cc0000644000175000001440000000045412130034075017034 0ustar httpusers#include "config" void Config::changedeny (string &a, unsigned index) { if (index >= denylist.size()) throw Error("No such deny-from specifier"); struct in_addr in; if (!inet_aton (a.c_str(), &in)) throw Error("Bad deny-from specfier '" + a + "'"); denylist[index] = (in); } crossroads-2.81/xr/config/addserverheader.cc0000644000175000001440000000025412130034075020055 0ustar httpusers#include "config" void Config::addserverheader (string const &s) { int lock; mutex_lock (&lock); serverheaders.push_back (s); mutex_unlock (&lock); } crossroads-2.81/xr/config/setdispatcmode.cc0000644000175000001440000000321012130034075017730 0ustar httpusers#include "config" void Config::setdispatchmode (string s) { if (s.substr(0, 2) == "e:") { dmode.mode (Dispatchmode::m_external); external_algorithm = s.substr (2); } else if (s.substr (0, 9) == "external:") { dmode.mode (Dispatchmode::m_external); external_algorithm = s.substr(9); } else if (s == "f" || s == "first-available") dmode.mode (Dispatchmode::m_firstactive); else if (s == "h" || s == "strict-hashed-ip") dmode.mode (Dispatchmode::m_strict_hashed_ip); else if (s == "H" || s == "lax-hashed-ip") dmode.mode (Dispatchmode::m_lax_hashed_ip); else if (s == "l" || s == "least-connections") dmode.mode (Dispatchmode::m_leastconn); else if (s == "r" || s == "round-robin") dmode.mode (Dispatchmode::m_roundrobin); else if (s == "L" || s == "weighted-load" ) { timeval t1; gettimeofday(&t1, NULL); mt_srand(t1.tv_sec * t1.tv_usec); dmode.mode (Dispatchmode::m_weighted_load); } else if (s.substr(0, 2) == "s:") { dmode.mode (Dispatchmode::m_strict_stored_ip); ipstoretimeout(setinteger(s.substr(2))); } else if (s.substr(0, 17) == "strict-stored-ip:") { dmode.mode (Dispatchmode::m_strict_stored_ip); ipstoretimeout(setinteger(s.substr(17))); } else if (s.substr(0, 2) == "S:") { dmode.mode (Dispatchmode::m_lax_stored_ip); ipstoretimeout(setinteger(s.substr(2))); } else if (s.substr(0, 14) == "lax-stored-ip:") { dmode.mode (Dispatchmode::m_lax_stored_ip); ipstoretimeout(setinteger(s.substr(14))); } else throw Error("Bad dispatch mode -d" + s); if (dmode.mode() == Dispatchmode::m_external && external_algorithm.size() < 1) throw Error("External algorithm handler missing"); } crossroads-2.81/xr/config/deleteallow.cc0000644000175000001440000000036712130034075017233 0ustar httpusers#include "config" void Config::deleteallow(unsigned index) { if (index >= allowlist.size()) throw Error("Index out of range, cannot delete allow-from"); allowlist.erase(allowlist.begin() + index, allowlist.begin() + index + 1); } crossroads-2.81/xr/config/addallow.cc0000644000175000001440000000030712130034075016513 0ustar httpusers#include "config" void Config::addallow (string a) { struct in_addr in; if (!inet_aton (a.c_str(), &in)) throw Error("Bad allow-from specfier '" + a + "'"); allowlist.push_back (in); } crossroads-2.81/xr/config/changeallow.cc0000644000175000001440000000046112130034075017211 0ustar httpusers#include "config" void Config::changeallow (string &a, unsigned index) { if (index >= allowlist.size()) throw Error("No such allow-from specifier"); struct in_addr in; if (!inet_aton (a.c_str(), &in)) throw Error("Bad allow-from specfier '" + a + "'"); allowlist[index] = (in); } crossroads-2.81/xr/config/pidfile.cc0000644000175000001440000000022512130034075016337 0ustar httpusers#include "config" void Config::pidfile (string const &p) { int lock; mutex_lock (&lock); pid_file = p; mutex_unlock (&lock); } crossroads-2.81/xr/config/deletedeny.cc0000644000175000001440000000036012130034075017045 0ustar httpusers#include "config" void Config::deletedeny(unsigned index) { if (index >= denylist.size()) throw Error("Index out of range, cannot delete deny-from"); denylist.erase(denylist.begin() + index, denylist.begin() + index + 1); } crossroads-2.81/xr/config/adddeny.cc0000644000175000001440000000030412130034075016331 0ustar httpusers#include "config" void Config::adddeny (string d) { struct in_addr in; if (!inet_aton (d.c_str(), &in)) throw Error("Bad deny-from specfier '" + d + "'"); denylist.push_back (in); } crossroads-2.81/xr/config/prefixtimestamp.cc0000644000175000001440000000023312130034075020143 0ustar httpusers#include "config" void Config::prefixtimestamp(bool b) { int lock; mutex_lock (&lock); prefix_timestamp = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/config1.cc0000644000175000001440000000321012130034075016246 0ustar httpusers#include "config" bool Config::verbose_flag = false; int Config::lport = 10000; Servertype Config::styp; string Config::sip = "0"; vector Config::blist; Dispatchmode Config::dmode; unsigned Config::c_timeout = 30; unsigned Config::c_write_timeout = 5; unsigned Config::b_timeout = 30; unsigned Config::b_write_timeout = 3; unsigned Config::wakeup = 5; unsigned Config::checkup = 0; unsigned Config::bufsize = 2048; bool Config::foreground_mode = false; bool Config::add_xr_version = false; bool Config::debug_flag = false; bool Config::add_x_forwarded_for = false; bool Config::sticky_http = false; bool Config::replace_host_header = false; unsigned Config::max_conn = 0; string Config::external_algorithm = ""; string Config::pid_file = ""; bool Config::prefix_timestamp = false; vector Config::serverheaders; vector Config::allowlist; vector Config::denylist; bool Config::fast_close = false; int Config::ipstore_timeout; bool Config::use_webinterface = false; string Config::webinterface_ip; int Config::webinterface_port; string Config::webinterface_name; string Config::web_auth; string Config::dump_dir; unsigned Config::soft_maxconnrate = 0; unsigned Config::hard_maxconnrate = 0; unsigned Config::defer_time = 500000; unsigned Config::connrate_timeinterval = 1; unsigned Config::quit_after = 0; string Config::soft_maxconn_excess_prog = ""; string Config::hard_maxconn_excess_prog = ""; unsigned Config::dns_cache_timeout = 3600; string Config::on_start = ""; string Config::on_end = ""; string Config::on_fail = ""; bool Config::remove_reservations = false; char **Config::org_argv = 0; Config::Config () { } crossroads-2.81/xr/config/buffersize.cc0000644000175000001440000000022112130034075017063 0ustar httpusers#include "config" void Config::buffersize(unsigned b) { int lock; mutex_lock (&lock); bufsize = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/config0000644000175000001440000001705112130034075015611 0ustar httpusers#ifndef _CONFIG_ #define _CONFIG_ #include "sys/sys" #include "backenddef/backenddef" #include "servertype/servertype" #include "dispatchmode/dispatchmode" #include "error/error" #include "ThreadsAndMutexes/mutex/mutex" #include "backendcheck/backendcheck" using namespace std; class Config { public: Config (); // Init by cmdline void parsecmdline (int ac, char **av); // Accessors bool verbose() const { return (verbose_flag); } void verbose (bool v) { verbose_flag = v; } bool debug() const { return (debug_flag); } void debug (bool d) { debug_flag = d; } unsigned quitafter() const { return (quit_after); } Servertype::Type stype() const { return (styp.type()); } void stype(string const &s) { styp.type(s); } string stypestr() const { return (styp.typestr()); } string const &sipaddr() const { return (sip); } int sport() const { return (lport); } int backends() const { return (blist.size()); } /* PID file */ void pidfile(string const &s); string const &pidfile() { return pid_file; } /* Client timeouts */ unsigned client_read_timeout() const { return (c_timeout); } void client_read_timeout (unsigned c) { c_timeout = c; } unsigned client_write_timeout() const { return c_write_timeout; } void client_write_timeout(unsigned c) { c_write_timeout = c; } /* Back end timeouts */ unsigned backend_read_timeout() const { return (b_timeout); } void backend_read_timeout (unsigned b) { b_timeout = b; } unsigned backend_write_timeout() const { return b_write_timeout; } void backend_write_timeout(unsigned b) { b_write_timeout = b; } unsigned wakeupsec() const { return (wakeup); } void wakeupsec (unsigned w) { wakeup = w; } unsigned checkupsec() const { return (checkup); } void checkupsec (unsigned w) { checkup = w; } unsigned buffersize() const { return (bufsize); } void buffersize (unsigned b); bool foregroundmode() const { return (foreground_mode); } bool addxrversion() const { return (add_xr_version); } void addxrversion (bool b); bool addxforwardedfor() const { return (add_x_forwarded_for); } void addxforwardedfor (bool b); bool stickyhttp() const { return (sticky_http); } void stickyhttp(bool b); bool replacehostheader() const { return replace_host_header; } void replacehostheader(bool s) { replace_host_header = s; } unsigned maxconn() const { return (max_conn); } void maxconn (unsigned m); string const &externalalgorithm() const { return (external_algorithm); } bool prefixtimestamp() const { return (prefix_timestamp); } void prefixtimestamp (bool p); bool fastclose() const { return (fast_close); } void fastclose (bool f); bool usewebinterface() const { return use_webinterface; } string const &webinterfaceip() const { return webinterface_ip; } int webinterfaceport() const { return webinterface_port; } void webinterface_auth(string const &s); string webinterface_auth() const { return web_auth; } string webinterfacename() const { return webinterface_name; } unsigned nserverheaders() const { return (serverheaders.size()); } string const &serverheader (unsigned n) { return (serverheaders[n]); } void addserverheader (string const &s); void removeserverheader (unsigned i); void changeserverheader (unsigned i, string const &s); string const &dumpdir() const { return (dump_dir); } void dumpdir (string s) { dump_dir = s; } unsigned softmaxconnrate() const { return soft_maxconnrate; } void softmaxconnrate(unsigned n) { soft_maxconnrate = n; } unsigned hardmaxconnrate() const { return hard_maxconnrate; } void hardmaxconnrate(unsigned n) { hard_maxconnrate = n; } unsigned defertime() const { return defer_time; } void defertime(unsigned n) { defer_time = n; } unsigned connrate_time() const { return connrate_timeinterval; } void connrate_time(unsigned n) { connrate_timeinterval = n; } unsigned dnscachetimeout() const { return dns_cache_timeout; } void dnscachetimeout(unsigned t) { dns_cache_timeout = t; } unsigned nallow() const { return (allowlist.size()); } unsigned ndeny() const { return (denylist.size()); } void addallow (string a); void adddeny (string d); void changeallow(string &a, unsigned index); void changedeny(string &a, unsigned index); void deleteallow(unsigned index); void deletedeny(unsigned index); int ipstoretimeout() const { return (ipstore_timeout); } void ipstoretimeout(int t); struct in_addr allow(unsigned n) const { return (allowlist[n]); } struct in_addr deny(unsigned n) const { return (denylist[n]); } BackendDef const &backend (int i) const { return (blist[i]); } Dispatchmode::Mode dispatchmode() const { return (dmode.mode()); } string dispatchmodestr() const { return (dmode.modestr()); } bool removereservations() const { return remove_reservations; } void removereservations(bool b) { remove_reservations = b; } string const &softmaxconnexcess() const { return soft_maxconn_excess_prog; } void softmaxconnexcess(string const &s) { soft_maxconn_excess_prog = s; } string const &hardmaxconnexcess() const { return hard_maxconn_excess_prog; } void hardmaxconnexcess(string const &s) { hard_maxconn_excess_prog = s; } void onstart(string s) { on_start = s; } string const &onstart() const { return on_start; } void onend(string s) { on_end = s; } string const &onend() const { return on_end; } void onfail(string s) { on_fail = s; } string const &onfail() const { return on_fail; } /* Restart of program */ void restart(); private: void setbackend (string const &s, string const &hostmatch, string const &urlmatch, BackendCheck const &bc); void setwebinterface (string s); void setserver (string s); void setdispatchmode (string s); int setinteger (string s) const; static string pid_file; static bool verbose_flag; static int lport; static Servertype styp; static string sip; static vector blist; static Dispatchmode dmode; static unsigned c_timeout, c_write_timeout; static unsigned b_timeout, b_write_timeout; static unsigned wakeup; static unsigned checkup; static unsigned bufsize; static bool foreground_mode; static bool add_xr_version; static bool debug_flag; static bool add_x_forwarded_for; static bool sticky_http; static bool replace_host_header; static unsigned max_conn; static string external_algorithm; static bool prefix_timestamp; static vector serverheaders; static vector allowlist; static vector denylist; static bool fast_close; static int ipstore_timeout; static bool use_webinterface; static string webinterface_ip; static int webinterface_port; static string webinterface_name; static string web_auth; static string dump_dir; static unsigned soft_maxconnrate; static unsigned hard_maxconnrate; static unsigned defer_time; static unsigned connrate_timeinterval; static unsigned quit_after; static string soft_maxconn_excess_prog; static string hard_maxconn_excess_prog; static unsigned dns_cache_timeout; static string on_start, on_end, on_fail; static bool remove_reservations; static char **org_argv; }; extern Config config; #endif crossroads-2.81/xr/config/setinteger.cc0000644000175000001440000000031512130034075017074 0ustar httpusers#include "config" int Config::setinteger (string s) const { int ret; if (sscanf (s.c_str(), "%d", &ret) < 1) throw Error("Bad numeric specifier in '" + s + ": not a number"); return (ret); } crossroads-2.81/xr/config/removeserverheader.cc0000644000175000001440000000034112130034075020617 0ustar httpusers#include "config" void Config::removeserverheader (unsigned i) { int lock; mutex_lock (&lock); serverheaders.erase (serverheaders.begin() + i, serverheaders.begin() + i + 1); mutex_unlock (&lock); } crossroads-2.81/xr/config/setserver.cc0000644000175000001440000000052712130034075016752 0ustar httpusers#include "config" void Config::setserver (string str) { // Split into 3 parts vector parts = str2parts (str, ':'); if (parts.size() != 3) throw Error("Bad server specifier, expected: TYPE:IPADDRESS:PORT"); // Store type, IP and port styp.type (parts[0]); sip = parts[1]; lport = setinteger (parts[2]); } crossroads-2.81/xr/config/restart.cc0000644000175000001440000000042612130034075016412 0ustar httpusers#include "config" void Config::restart() { for (int i = 0; org_argv[i]; i++) cout << "Arg " << i << ": " << org_argv[i] << '\n'; execvp("xr", org_argv); ostringstream o; o << "Failed to restart: errno=" << errno << ", " << strerror(errno); throw Error(o.str()); } crossroads-2.81/xr/config/parsecmdline.cc0000644000175000001440000002116712130034075017401 0ustar httpusers#include "config" #include "../build/usage.h" using namespace std; void Config::parsecmdline (int ac, char **av) { // Remember original argv. org_argv = av; // Prepare invoking command line. string cmdline; for (int i = 0; i < ac; i++) { if (i) cmdline += ' '; cmdline += av[i]; } // Not a single argument? Usage. if (ac == 1) throw Error("Bad command line '" + cmdline + "'\n" + USAGE); # define OPTSTRING "?a:A:B:b:c:CDd:E:e:fF:Gg:hH:Ij:l:" \ "m:M:np:PQ:r:R:Ss:t:T:u:U:vVW:w:xXy:Y:z:Z:" # ifdef HAVE_GETOPT_LONG static struct option longopts[] = { { "allow-from", required_argument, 0, 'a' }, { "deny-from", required_argument, 0, 'A' }, { "backend", required_argument, 0, 'b' }, { "buffer-size", required_argument, 0, 'B' }, { "checkup-interval", required_argument, 0, 'c' }, { "close-sockets-fast", no_argument, 0, 'C' }, { "debug", no_argument, 0, 'D' }, { "dispatch-mode", required_argument, 0, 'd' }, { "hard-maxconn-excess", required_argument, 0, 'E' }, { "soft-maxconn-excess", required_argument, 0, 'e' }, { "dns-cache-timeout", required_argument, 0, 'F' }, { "foreground", no_argument, 0, 'f' }, { "remove-reservations", no_argument, 0, 'G' }, { "backend-check", required_argument, 0, 'g' }, { "help", no_argument, 0, 'h' }, { "add-server-header", required_argument, 0, 'H' }, { "replace-host-header", no_argument, 0, 'I' }, { "url-match", required_argument, 0, 'j' }, { "log-traffic-dir", required_argument, 0, 'l' }, { "max-connections", required_argument, 0, 'm' }, { "host-match", required_argument, 0, 'M' }, { "tryout", no_argument, 0, 'n' }, { "pidfile", required_argument, 0, 'p' }, { "prefix-timestamp", no_argument, 0, 'P' }, { "soft-maxconnrate", required_argument, 0, 'r' }, { "quit-after", required_argument, 0, 'Q' }, { "hard-maxconnrate", required_argument, 0, 'R' }, { "server", required_argument, 0, 's' }, { "sticky-http", no_argument, 0, 'S' }, { "backend-timeout", required_argument, 0, 't' }, { "client-timeout", required_argument, 0, 'T' }, { "time-interval", required_argument, 0, 'u' }, { "defer-time", required_argument, 0, 'U' }, { "verbose", no_argument, 0, 'v' }, { "version", no_argument, 0, 'V' }, { "wakeup-interval", required_argument, 0, 'w' }, { "web-interface", required_argument, 0, 'W' }, { "web-interface-auth", required_argument, 0, 'Y' }, { "add-xr-version", no_argument, 0, 'X' }, { "add-x-forwarded-for", no_argument, 0, 'x' }, { "onfail", required_argument, 0, 'y' }, { "onstart", required_argument, 0, 'z' }, { "onend", required_argument, 0, 'Z' }, { 0, 0, 0, 0 } }; # endif int opt; bool backend_set = false; bool tryout = false, wakeup_used = false; string current_hostmatch = ""; string current_urlmatch = ""; BackendCheck current_backendcheck; vector parts; # ifdef HAVE_GETOPT_LONG while ( (opt = getopt_long (ac, av, OPTSTRING, longopts, 0)) > 0) #else while ( (opt = getopt (ac, av, OPTSTRING)) > 0 ) #endif { switch (opt) { case 'a': addallow (optarg); break; case 'A': adddeny (optarg); break; case 'b': setbackend (optarg, current_hostmatch, current_urlmatch, current_backendcheck); backend_set = true; break; case 'B': bufsize = (unsigned)setinteger (optarg); break; case 'c': checkup = setinteger (optarg); break; case 'C': fast_close = true; break; case 'D': verbose_flag = true; debug_flag = true; break; case 'd': setdispatchmode (optarg); break; case 'E': hard_maxconn_excess_prog = optarg; break; case 'e': soft_maxconn_excess_prog = optarg; break; case 'F': dns_cache_timeout = (unsigned)setinteger(optarg); break; case 'f': foreground_mode = true; break; case 'G': removereservations(true); break; case 'g': current_backendcheck.parse(optarg); break; case 'h': case '?': throw Error(USAGE); break; case 'H': addserverheader (optarg); break; case 'I': replacehostheader(true); break; case 'j': current_urlmatch = optarg; break; case 'l': dumpdir (optarg); break; case 'M': current_hostmatch = optarg; break; case 'm': max_conn = (unsigned)setinteger (optarg); break; case 'n': tryout = true; break; case 'P': prefix_timestamp = true; break; case 'p': pidfile(optarg); break; case 'Q': quit_after = (unsigned) setinteger(optarg); break; case 'r': soft_maxconnrate = (unsigned) setinteger (optarg); break; case 'R': hard_maxconnrate = (unsigned) setinteger (optarg); break; case 's': setserver (optarg); break; case 'S': sticky_http = true; break; case 't': parts = str2parts(optarg, ':'); if (parts.size() == 1) { backend_read_timeout(atoi(parts[0].c_str())); backend_write_timeout(atoi(parts[0].c_str())); } else if (parts.size() == 2) { backend_read_timeout(atoi(parts[0].c_str())); backend_write_timeout(atoi(parts[1].c_str())); } else throw Error("Bad backend timeout specifier, " "expected SEC or RSEC:WSEC"); break; case 'T': parts = str2parts(optarg, ':'); if (parts.size() == 1) { client_read_timeout(atoi(parts[0].c_str())); client_write_timeout(atoi(parts[0].c_str())); } else if (parts.size() == 2) { client_read_timeout(atoi(parts[0].c_str())); client_write_timeout(atoi(parts[1].c_str())); } else throw Error("Bad backend timeout specifier, " "expected SEC or RSEC:WSEC"); break; case 'U': defer_time = (unsigned) setinteger(optarg); break; case 'u': connrate_timeinterval = (unsigned) setinteger (optarg); break; case 'v': verbose_flag = true; break; case 'V': cout << "XR version : " << VER << "\n" << "Written by : " << AUTHOR << "\n" << "Maintained by : " << MAINTAINER << "\n" << "Primary site : " << DISTSITE << "\n" << "Compiled with : " << CONF_CC << "\n" << "Optimization : " << CONF_OPTFLAGS << "\n" << "System : " << SYS << "\n" << "Libraries : " << CONF_LIB << "\n" << "Type sizes : ssize_t=" << sizeof(ssize_t) << ", int=" << sizeof(int) << ", long=" << sizeof(long) << ", double=" << sizeof(double) << ", ptr=" << sizeof(char*) << "\n" ; # ifdef HAVE_GETOPT_H cout << "getopt.h : present\n"; # else cout << "getopt.h : absent\n"; # endif # ifdef HAVE_INADDR_NONE cout << "INADDR_NONE : present\n"; # else cout << "INADDR_NONE : absent, defined to " << INADDR_NONE << "\n"; # endif # ifdef HAVE_GETOPT_LONG cout << "getopt_long() : present\n"; # else cout << "getopt_long() : absent (only short flags will work)\n"; # endif # ifdef HAVE_INET_ATON cout << "inet_aton() : present\n"; # else cout << "inet_aton() : absent\n"; # endif # ifdef HAVE_STRNSTR cout << "strnstr() : present\n"; # else cout << "strnstr() : absent\n"; # endif exit (0); case 'W': setwebinterface(optarg); break; case 'w': wakeup = setinteger (optarg); wakeup_used = true; break; case 'X': add_xr_version = true; break; case 'x': add_x_forwarded_for = true; break; case 'y': onfail(optarg); break; case 'Y': webinterface_auth(optarg); break; case 'z': onstart(optarg); break; case 'Z': onend(optarg); break; default: throw Error("Unknown flag, try 'xr -h' for usage"); break; } } // Sanity checks. if (ac != optind) throw Error("Bad command line '" + cmdline + "'\n" + USAGE); if (!backend_set) throw Error("No backend defined, use '-b...' at least once, " "or try 'xr -h' for usage"); if (checkup && wakeup) { if (!wakeup_used) wakeup = 0; else throw Error("Use either --checkup-interval or --wakeup-interval, " "but not both"); } // In tryout mode, stop now. if (tryout) exit (0); msg ("+--------------------------------------------+\n"); msg ("| Welcome to xr V" VER " |\n"); msg ("| Copyright (c) Karel Kubat |\n"); msg ("| Distributed under GPLV3. |\n"); msg ("+--------------------------------------------+\n"); msg ("Invoking command line: '" + cmdline + "'\n"); } crossroads-2.81/xr/config/setwebinterface.cc0000644000175000001440000000063612130034075020103 0ustar httpusers#include "config" void Config::setwebinterface (string str) { vector parts = str2parts (str, ':'); if (parts.size() < 2 || parts.size() > 3) throw Error("Bad webinterface specifier in '-W" + str + "', expected: IP:PORT"); use_webinterface = true; webinterface_ip = parts[0]; webinterface_port = setinteger(parts[1]); if (parts.size() == 3) webinterface_name = parts[2]; } crossroads-2.81/xr/config/webinterface_auth.cc0000644000175000001440000000050112130034075020377 0ustar httpusers#include "config" void Config::webinterface_auth(string const &s) { // Make sure there is a ':' delimiter in the parameter if (s.length() > 0 && s.find_first_of(':') == string::npos) throw Error("Bad web interface authentication parameter, " "format must be username:password"); web_auth = s; } crossroads-2.81/xr/config/Makefile.lib0000644000175000001440000000005112130034075016616 0ustar httpusersDIR = config include ../etc/Makefile.lib crossroads-2.81/xr/config/changeserverheader.cc0000644000175000001440000000026412130034075020553 0ustar httpusers#include "config" void Config::changeserverheader (unsigned i, string const &s) { int lock; mutex_lock (&lock); serverheaders[i] = s; mutex_unlock (&lock); } crossroads-2.81/xr/config/maxconn.cc0000644000175000001440000000022012130034075016361 0ustar httpusers#include "config" void Config::maxconn (unsigned m) { int lock; mutex_lock (&lock); max_conn = m; mutex_unlock (&lock); } crossroads-2.81/xr/config/fastclose.cc0000644000175000001440000000021712130034075016707 0ustar httpusers#include "config" void Config::fastclose(bool b) { int lock; mutex_lock (&lock); fast_close = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/addxforwardedfor.cc0000644000175000001440000000023712130034075020253 0ustar httpusers#include "config" void Config::addxforwardedfor(bool b) { int lock; mutex_lock (&lock); add_x_forwarded_for = b; mutex_unlock (&lock); } crossroads-2.81/xr/config/setbackend.cc0000644000175000001440000000156212130034075017033 0ustar httpusers#include "config" void Config::setbackend (string const &str, string const &host, string const &url, BackendCheck const &backend_check) { vector parts = str2parts (str, ':'); if (parts.size() < 2 || parts.size() > 4) throw Error("Bad back end specifier in '-b" + str + "', expected: SERVER:PORT or SERVER:PORT:MAXCONNECTIONS" " or SERVER:PORT:MAXCONNECTIONS:WEIGHT"); BackendDef *bdp = 0; if (parts.size() == 2) bdp = new BackendDef(parts[0], parts[1]); else if (parts.size() == 3) bdp = new BackendDef(parts[0], parts[1], parts[2]); else if (parts.size() == 4) bdp = new BackendDef(parts[0], parts[1], parts[2], parts[3]); if (!bdp) throw Error("Memory fault in Config::setbackend"); bdp->hostmatch(host); bdp->urlmatch(url); bdp->backendcheck(backend_check); blist.push_back (*bdp); delete bdp; } crossroads-2.81/xr/DispatchAlgorithms/0000755000175000001440000000000012130034076016742 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/weightedload/0000755000175000001440000000000012130034076021402 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/weightedload/weightedload0000644000175000001440000000046212130034075023766 0ustar httpusers#ifndef _WEIGHTEDLOAD_ #define _WEIGHTEDLOAD_ #include "sys/sys" #include "error/error" #include "balancer/balancer" #include "DispatchAlgorithms/algorithm/algorithm" class Weightedload: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/weightedload/target.cc0000644000175000001440000000264312130034075023203 0ustar httpusers#include "weightedload" unsigned Weightedload::target(struct in_addr clientip, BackendVector &targetlist) { // First loop thru and add up the weights. double total_load = 0; for (unsigned i = 0; i < targetlist.size(); i++) { if (balancer.backend(targetlist[i]).loadavg() == 0) total_load += 1 / 0.01; else total_load += 1 / balancer.backend(targetlist[i]).loadavg(); } // Now pick a random number from 0 to total_load // 4294967295 = 2^32 - 1 double pick_load = total_load * mt_rand() * (1.0 / 4294967295.0); msg ("Weighted by Load Average; load-range is " << total_load << ", and the selected load-range is " << pick_load << '\n'); // Now see which server that means! total_load = 0; for (unsigned i = 0; i < targetlist.size(); i++) { if (balancer.backend(targetlist[i]).loadavg() == 0) total_load += 1 / 0.01; else total_load += 1 / balancer.backend(targetlist[i]).loadavg(); if (total_load >= pick_load) { // if (config.verbose()) { // ostringstream o; // o << balancer.backend(targetlist[i]).loadavg(); // msg ("Weighted by Load Average chose backend " + // (string)balancer.backend(i).description() + " which has a " + // "load average of " + o.str() + "\n"); // } return targetlist[i]; } } throw Error("Weighted-load algorithm: no available back ends "); return targetlist[0]; // We need some kind of default... } crossroads-2.81/xr/DispatchAlgorithms/external/0000755000175000001440000000000012130034076020564 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/external/external0000644000175000001440000000047712130034075022340 0ustar httpusers#ifndef _EXTERNAL_ #define _EXTERNAL_ #include "sys/sys" #include "error/error" #include "DispatchAlgorithms/algorithm/algorithm" #include "balancer/balancer" #include "config/config" class External: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/external/target.cc0000644000175000001440000000215612130034075022364 0ustar httpusers#include "external" unsigned External::target(struct in_addr clientip, BackendVector &targetlist) { // Prepare command to run ostringstream o; o << config.externalalgorithm() << ' ' << balancer.nbackends(); for (unsigned i = 0; i < balancer.nbackends(); i++) o << ' ' << balancer.backend(i).description() << ' ' << balancer.backend(i).availablestr() << ' ' << balancer.backend(i).connections(); msg("External algorithm: invoking '" << o.str() << '\n'); FILE *f; if (! (f = popen (o.str().c_str(), "r")) ) throw Error("Cannot start '" + o.str() + ": " + strerror(errno)); unsigned i; if (fscanf (f, "%u", &i) < 1) { pclose(f); throw Error("External algorithm '" + o.str() + "' did not reply with a number"); } msg("External algorithm says: " << i << '\n'); if (i >= balancer.nbackends()) { pclose(f); ostringstream o; o << "External algorithm '" << o.str() << "': answer " << i << " out of bounds"; throw Error(o.str()); } if (pclose (f)) throw Error("External algorithm '" + o.str() + "' terminated with error"); return (i); } crossroads-2.81/xr/DispatchAlgorithms/firstactive/0000755000175000001440000000000012130034076021265 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/firstactive/firstactive0000644000175000001440000000045712130034075023540 0ustar httpusers#ifndef _FIRSTACTIVE_ #define _FIRSTACTIVE_ #include "sys/sys" #include "error/error" #include "DispatchAlgorithms/algorithm/algorithm" #include "balancer/balancer" class Firstactive: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/firstactive/target.cc0000644000175000001440000000107512130034075023064 0ustar httpusers#include "firstactive" unsigned Firstactive::target(struct in_addr clientip, BackendVector &targetlist) { if (config.debug()) { debugmsg("First-active algorithm: " << targetlist.size() << " back end(s) to consider\n"); for (unsigned int i = 0; i < targetlist.size(); i++) debugmsg(" Considering back end " << targetlist[i] << " which is " << balancer.backend(targetlist[i]).description() << '\n'); } if (targetlist.size() == 0) throw Error("First-active algorithm: no available back ends"); return (targetlist[0]); } crossroads-2.81/xr/DispatchAlgorithms/algorithm/0000755000175000001440000000000012130034076020730 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/algorithm/algorithm0000644000175000001440000000052012130034075022635 0ustar httpusers#ifndef _ALGORITHM_ #define _ALGORITHM_ #include "ThreadsAndMutexes/thread/thread" #include "backendvector/backendvector" #include "profiler/profiler" class Algorithm: public Thread { public: virtual ~Algorithm(); virtual unsigned target(struct in_addr clientip, BackendVector &targetlist) = 0; }; #endif crossroads-2.81/xr/DispatchAlgorithms/algorithm/algorithm.cc0000644000175000001440000000006212130034075023222 0ustar httpusers#include "algorithm" Algorithm::~Algorithm() { } crossroads-2.81/xr/DispatchAlgorithms/hashedip/0000755000175000001440000000000012130034076020527 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/hashedip/target.cc0000644000175000001440000000240612130034075022325 0ustar httpusers#include "hashedip" unsigned HashedIp::target(struct in_addr clientip, BackendVector &targetlist) { // Nothing to do if we don't have targets. if (!targetlist.size()) throw Error("Hashed-ip algorithm: no back ends to dispatch to"); // Hash the client's IP into an index unsigned h = 0; for (char *cp = (char*)&clientip; unsigned(cp - (char*)&clientip) < sizeof(struct in_addr); cp++) { h += *cp; h %= targetlist.size(); } unsigned index = targetlist[h]; msg("Client IP "<< inet2string(clientip) << " hashes to " << index << ", back end " << balancer.backend(index).description() << '\n'); // In strict mode, back end must be available, or don't proceed // In lax mode, fall back to least-connections dispatching if (! balancer.backend(index).available()) { if (config.dispatchmode() == Dispatchmode::m_strict_hashed_ip) throw Error("Hashed-IP algorithm: target back end " + balancer.backend(index).description() + " unavailable"); else { msg("Hashed-IP algorithm: target back end " << balancer.backend(index).description() << " unavailable, " << "falling back to least-connections\n"); Leastconn l; index = l.target(clientip, targetlist); } } // Got it return (index); } crossroads-2.81/xr/DispatchAlgorithms/hashedip/hashedip0000644000175000001440000000056112130034075022240 0ustar httpusers#ifndef _HASHEDIP_ #define _HASHEDIP_ #include "sys/sys" #include "error/error" #include "balancer/balancer" #include "config/config" #include "DispatchAlgorithms/algorithm/algorithm" #include "DispatchAlgorithms/leastconn/leastconn" class HashedIp: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/roundrobin/0000755000175000001440000000000012130034076021123 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/roundrobin/target.cc0000644000175000001440000000271512130034075022724 0ustar httpusers#include "roundrobin" unsigned Roundrobin::target(struct in_addr clientip, BackendVector &targetlist) { // Regardless of a pre-existent targetlist, we rebuild it here. // We do that to take weights into accounts. static bool building; mutex_lock(&building); targetlist.reset(); for (unsigned int i = 0; i < balancer.nbackends(); i++) for (unsigned int j = 0; j < balancer.backend(i).weight(); j++) targetlist.add(i); mutex_unlock(&building); if (config.debug()) { ostringstream o; o << "Round robin target list: "; for (unsigned i = 0; i < targetlist.size(); i++) o << targetlist[i] << ' '; o << '\n'; debugmsg(o.str()); } if (targetlist.size() == 1) return (targetlist[0]); static int prev_run_index = -1; unsigned first_try_val = 0; bool first_try_set = false; while (true) { // See where we will start unsigned cur_val; if (prev_run_index == -1) { cur_val = 0; } else { if (! first_try_set) { first_try_set = true; first_try_val = prev_run_index; } cur_val = prev_run_index + 1; cur_val %= targetlist.size(); if (cur_val == first_try_val) throw Error("Round robin dispatcher: no backends\n"); } // Store for next time 'round mutex_lock(&prev_run_index); prev_run_index = cur_val; mutex_unlock(&prev_run_index); if (! balancer.backend(targetlist[cur_val]).available()) continue; // Done. return (targetlist[cur_val]); } } crossroads-2.81/xr/DispatchAlgorithms/roundrobin/roundrobin0000644000175000001440000000045412130034075023231 0ustar httpusers#ifndef _ROUNDROBIN_ #define _ROUNDROBIN_ #include "sys/sys" #include "error/error" #include "balancer/balancer" #include "DispatchAlgorithms/algorithm/algorithm" class Roundrobin: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/leastconn/0000755000175000001440000000000012130034076020730 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/leastconn/target.cc0000644000175000001440000000310012130034075022516 0ustar httpusers#include "leastconn" unsigned Leastconn::target(struct in_addr clientip, BackendVector &targetlist) { PROFILE("Leastconn::target"); msg("Starting least-connections dispatcher\n"); if (config.debug()) { ostringstream o; o << "Back end target list:"; for (unsigned i = 0; i < targetlist.size(); i++) o << ' ' << targetlist[i]; o << '\n'; debugmsg(o.str()); } bool found = false; unsigned best_weighted = 0, t = 0; for (unsigned i = 0; i < targetlist.size(); i++) { if (! balancer.backend(targetlist[i]).available()) { debugmsg("Back end " << balancer.backend(targetlist[i]).description() << " is NOT available\n"); continue; } unsigned connections = balancer.backend(targetlist[i]).connections(); unsigned anticipated = IPStore::anticipated(targetlist[i]); unsigned adjweight = balancer.backend(targetlist[i]).adjustedweight(); unsigned this_weight = (connections + anticipated) * adjweight; ostringstream o; if (config.debug()) o << "Back end " << balancer.backend(targetlist[i]).description() << ": connections=" << connections << ", anticipated=" << anticipated << ", adjweight=" << adjweight << ", thisweight=" << this_weight; if (!found || this_weight < best_weighted) { t = targetlist[i]; best_weighted = this_weight; found = true; debugmsg(o.str() << " is best so far\n"); } else debugmsg(o.str() << " skipped, got a better one\n"); } if (!found) throw Error("Least-connections algorithm: no available back ends"); return (t); } crossroads-2.81/xr/DispatchAlgorithms/leastconn/leastconn0000644000175000001440000000050412130034075022637 0ustar httpusers#ifndef _LEASTCONN_ #define _LEASTCONN_ #include "sys/sys" #include "error/error" #include "balancer/balancer" #include "DispatchAlgorithms/algorithm/algorithm" #include "ipstore/ipstore" class Leastconn: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/DispatchAlgorithms/storedip/0000755000175000001440000000000012130034076020573 5ustar httpuserscrossroads-2.81/xr/DispatchAlgorithms/storedip/target.cc0000644000175000001440000000331712130034075022373 0ustar httpusers#include "storedip" unsigned StoredIp::target(struct in_addr clientip, BackendVector &targetlist) { PROFILE("StoredIP::target"); IPStore::on(); msg("Starting stored-ip dispatcher\n"); int tb; if ( (tb = IPStore::target(clientip)) >= 0 ) { unsigned target = tb; IPStore::clear(clientip); if (balancer.backend(target).available()) { // Historical target is up, go there! msg("Sending " << inet2string(clientip) << " to " << balancer.backend(target).description() << '\n'); return target; } msg ("Historical target " << balancer.backend(target).description() << " unavailable\n"); if (config.dispatchmode() == Dispatchmode::m_strict_stored_ip) throw Error("Stored-IP algorithm: target back end " + balancer.backend(target).description() + " unavailable"); } // Client is seen for the first time, or after the timout period, or // their preferred back end is down (and we're in lax mode ofc). // Treat as new connection. Leastconn l; if (!config.removereservations()) return l.target(clientip, targetlist); else { BackendVector tlist = targetlist; while (true) { try { return l.target(clientip, tlist); } catch (...) { // We're out of back ends and need to clear up the IP store // to retry. // We give it a sec, remove the oldest entry, and rebuild the // target list for the least-connections dispatch algorithm. warnmsg("Out of back ends, releasing oldest client entry " "and retrying\n"); IPStore::clearoldest(); sleep(1); BackendVector newlist; for (unsigned int i = 0; i < balancer.nbackends(); i++) if (balancer.backend(i).available()) newlist.add(i); tlist = newlist; } } } } crossroads-2.81/xr/DispatchAlgorithms/storedip/storedip0000644000175000001440000000065312130034075022352 0ustar httpusers#ifndef _STOREDIP_ #define _STOREDIP_ #include "sys/sys" #include "error/error" #include "balancer/balancer" #include "config/config" #include "timestamp/timestamp" #include "DispatchAlgorithms/algorithm/algorithm" #include "DispatchAlgorithms/leastconn/leastconn" #include "ipstore/ipstore" class StoredIp: public Algorithm { public: unsigned target(struct in_addr clientip, BackendVector &targetlist); }; #endif crossroads-2.81/xr/memory/0000755000175000001440000000000012130034076014461 5ustar httpuserscrossroads-2.81/xr/memory/memfollow.cc0000644000175000001440000000011112130034075016761 0ustar httpusers#include "memory" void Memory::mem_follow(bool b) { s_follow = b; } crossroads-2.81/xr/memory/memdisplay.cc0000644000175000001440000000053712130034075017140 0ustar httpusers#include "memory" void Memory::mem_display() { static int lock; mutex_lock(&lock); for (unsigned i = 0; i < s_memlog.size(); i++) { MemoryEntry ent = s_memlog[i]; mutex_lock(&cout); cout << "Memory::mem_display " << ent.ptr << ' ' << ent.sz << ' ' << ent.desc << '\n'; mutex_unlock(&cout); } mutex_unlock(&lock); } crossroads-2.81/xr/memory/memfollow1.cc0000644000175000001440000000010612130034075017046 0ustar httpusers#include "memory" bool Memory::mem_follow() { return s_follow; } crossroads-2.81/xr/memory/memdata.cc0000644000175000001440000000011612130034075016375 0ustar httpusers#include "memory" Memory::MemoryLog Memory::s_memlog; bool Memory::s_follow; crossroads-2.81/xr/memory/memmark.cc0000644000175000001440000000033012130034075016414 0ustar httpusers#include "memory" void Memory::mem_mark(string const &desc) { MemoryEntry ent = { 0, 0, "MARK " + desc }; static int lock; mutex_lock(&lock); s_memlog.push_back(ent); mutex_unlock(&lock); } crossroads-2.81/xr/memory/memory0000644000175000001440000000170112130034075015712 0ustar httpusers#ifndef _MEMORY_ #define _MEMORY_ #include "sys/sys" #include "ThreadsAndMutexes/mutex/mutex" class Memory { public: // Memory accessing functions static void *malloc(size_t sz, string const &desc = ""); static void *realloc(void *ptr, size_t newsz, string const &desc = ""); static void free(void *ptr); static void *operator new(size_t sz); static void operator delete(void *ptr); static void *operator new[](size_t sz); static void operator delete[](void *ptr); // Follow actions immediately? static void mem_follow(bool b); static bool mem_follow(); // Dump what we have static void mem_display(); // Marker in the overview static void mem_mark(string const &desc = ""); // Internal storage types struct MemoryEntry { void *ptr; size_t sz; string desc; }; typedef vector MemoryLog; private: static MemoryLog s_memlog; static bool s_follow; }; #endif crossroads-2.81/xr/memory/memmalloc.cc0000644000175000001440000000063612130034075016742 0ustar httpusers#include "memory" void *Memory::malloc(size_t sz, string const &desc) { static int lock; void *ptr = ::malloc(sz); MemoryEntry ent = { ptr, sz, desc }; mutex_lock(&lock); s_memlog.push_back(ent); mutex_unlock(&lock); if (s_follow) { mutex_lock(&cout); cout << "Memory::malloc(" << sz << ") -> " << ptr << ' ' << desc << '\n'; mutex_unlock(&cout); } return ptr; } crossroads-2.81/xr/memory/memfree.cc0000644000175000001440000000107312130034075016410 0ustar httpusers#include "memory" void Memory::free(void *ptr) { if (!ptr) return; static int lock; for (unsigned i = 0; i < s_memlog.size(); i++) { mutex_lock(&lock); MemoryEntry ent = s_memlog[i]; mutex_unlock(&lock); if (ent.ptr == ptr) { if (s_follow) { mutex_lock(&cout); cout << "Memory::free(" << ptr << ")\n"; mutex_unlock(&cout); } ::free (ent.ptr); mutex_lock(&lock); s_memlog.erase(s_memlog.begin() + i); mutex_unlock(&lock); return; } } cerr << "FREE Request for non previously allocated memory\n"; } crossroads-2.81/xr/memory/memnew1.cc0000644000175000001440000000012612130034075016337 0ustar httpusers#include "memory" void *Memory::operator new[](size_t sz) { return malloc(sz); } crossroads-2.81/xr/memory/memdelete.cc0000644000175000001440000000011612130034075016726 0ustar httpusers#include "memory" void Memory::operator delete(void *ptr) { free(ptr); } crossroads-2.81/xr/memory/memnew.cc0000644000175000001440000000012412130034075016254 0ustar httpusers#include "memory" void *Memory::operator new(size_t sz) { return malloc(sz); } crossroads-2.81/xr/memory/memrealloc.cc0000644000175000001440000000131312130034075017105 0ustar httpusers#include "memory" void *Memory::realloc(void *ptr, size_t newsz, string const &desc) { static int lock; if (!newsz) { free(ptr); return 0; } else { for (unsigned i = 0; i < s_memlog.size(); i++) { MemoryEntry ent = s_memlog[i]; if (ent.ptr == ptr) { ent.ptr = ::realloc(ptr, newsz); ent.sz = newsz; ent.desc = desc; mutex_lock(&lock); s_memlog[i] = ent; mutex_unlock(&lock); if (s_follow) { mutex_lock(&cout); cout << "Memory::realloc(" << ptr << ", " << newsz << ") -> " << ent.ptr << ' ' << desc << '\n'; mutex_unlock(&cout); } return ent.ptr; } } cerr << "REALLOC Request for non previously allocated memory\n"; } return 0; } crossroads-2.81/xr/memory/memdelete1.cc0000644000175000001440000000012012130034075017002 0ustar httpusers#include "memory" void Memory::operator delete[](void *ptr) { free(ptr); } crossroads-2.81/xr/servertype/0000755000175000001440000000000012130034076015361 5ustar httpuserscrossroads-2.81/xr/servertype/type1.cc0000644000175000001440000000037212130034075016733 0ustar httpusers#include "servertype" #include "error/error" void Servertype::type (string id) { if (id == "tcp") t = t_tcp; else if (id == "http") t = t_http; else throw Error("Bad server type '" + id + "', supported are 'tcp' or 'http'"); } crossroads-2.81/xr/servertype/servertype0000644000175000001440000000054112130034075017513 0ustar httpusers#ifndef _SERVERTYPE_ #define _SERVERTYPE_ #include using namespace std; class Servertype { public: enum Type { t_tcp, t_http, }; Servertype(): t(t_tcp) { } Servertype(string id) { type(id); } void type(string id); string typestr() const; Type type() const { return t; } private: Type t; }; #endif crossroads-2.81/xr/servertype/typestr.cc0000644000175000001440000000035412130034075017403 0ustar httpusers#include "servertype" #include "error/error" string Servertype::typestr() const { if (t == t_tcp) return ("tcp"); else if (t == t_http) return ("http"); else throw Error("Server type unknown in Servertype::typestr"); } crossroads-2.81/xr/Dispatchers/0000755000175000001440000000000012130034076015422 5ustar httpuserscrossroads-2.81/xr/Dispatchers/tcpdispatcher/0000755000175000001440000000000012130034076020257 5ustar httpuserscrossroads-2.81/xr/Dispatchers/tcpdispatcher/tcpdispatcher0000644000175000001440000000117712130034075023044 0ustar httpusers#ifndef _TCPDISPATCHER_ #define _TCPDISPATCHER_ #include "Dispatchers/dispatcher/dispatcher" #include "netbuffer/netbuffer" #include "httpbuffer/httpbuffer" #include "ipstore/ipstore" #include "SocketHandling/socket/socket" class TcpDispatcher: public Dispatcher { public: TcpDispatcher(Socket &clientsock): Dispatcher(clientsock), netbuffer() {} virtual void execute(); virtual void dispatch(); virtual void handle(); unsigned readchunk(int src); Httpbuffer &buf() { return netbuffer; } private: Httpbuffer netbuffer; // same as netbuffer, but // httpdispatcher reuses it }; #endif crossroads-2.81/xr/Dispatchers/tcpdispatcher/execute.cc0000644000175000001440000000467312130034075022241 0ustar httpusers#include "tcpdispatcher" void TcpDispatcher::execute() { Threadlist::clientfd(clientfd()); Threadlist::clientip(clientfd().clientaddr().sin_addr); if (!check_dos() || !check_acl()) return; debugmsg("Dispatch request for client fd " << clientfd().fd() << '\n'); // Try to determine the back end. try { Threadlist::desc("Dispatching"); dispatch(); } catch (Error const &e) { warnmsg(e.what() << " (" << inet2string(clientfd().clientaddr().sin_addr) << ")\n"); return; } // Verify that the target is within the allowed set. if (targetbackend() < 0 || targetbackend() >= (int)balancer.nbackends()) { warnmsg("Target back end " << targetbackend() << "out of range\n"); return; } // Dispatch! msg("Dispatching client fd " << clientfd().fd() << " to " << balancer.backend(targetbackend()).description() << ", fd " << backendfd().fd() << '\n'); Threadlist::desc("Serving"); Threadlist::backend(targetbackend()); Threadlist::backendfd(backendfd()); balancer.backend(targetbackend()).startconnection(); if (config.onstart().length()) { ostringstream o; o << config.onstart() << ' ' << inet2string(clientfd().clientaddr().sin_addr) << balancer.backend(targetbackend()).description() << ' ' << balancer.backend(targetbackend()).connections(); msg("Running onstart script: " << o.str() << '\n'); sysrun(o.str()); } bool failed = false; try { handle(); } catch (Error const &e) { warnmsg(e.what() << " (" << inet2string(clientfd().clientaddr().sin_addr) << ")\n"); failed = true; if (config.onfail().length()) { ostringstream o; o << config.onfail() << ' ' << inet2string(clientfd().clientaddr().sin_addr) << balancer.backend(targetbackend()).description() << ' ' << balancer.backend(targetbackend()).connections(); msg("Running onfail script: " << o.str() << '\n'); sysrun(o.str()); } } balancer.backend(targetbackend()).endconnection(); if (!failed && config.onend().length()) { ostringstream o; o << config.onend() << ' ' << inet2string(clientfd().clientaddr().sin_addr) << balancer.backend(targetbackend()).description() << ' ' << balancer.backend(targetbackend()).connections(); msg("Running onend script: " << o.str() << '\n'); sysrun(o.str()); } msg ("Done dispatching to back end fd " << backendfd().fd() << " at " << balancer.backend(targetbackend()).description() << '\n'); } crossroads-2.81/xr/Dispatchers/tcpdispatcher/handle.cc0000644000175000001440000000216612130034075022025 0ustar httpusers#include "tcpdispatcher" void TcpDispatcher::handle() { debugmsg("TCP dispatcher: About to shuttle between client fd " << clientfd().fd() << " and backend fd " << backendfd().fd() << '\n'); Fdset readset(maxtimeout(config.client_read_timeout(), config.backend_read_timeout())); readset.add(clientfd()); readset.add(backendfd()); while (1) { Socket sock, othersock; int timeout; readset.wait_r(); if (readset.readable(clientfd())) { sock = clientfd(); othersock = backendfd(); timeout = config.backend_write_timeout(); } else if (readset.readable(backendfd())) { sock = backendfd(); othersock = clientfd(); timeout = config.client_write_timeout(); } else break; if (!netbuffer.netread(sock)) break; debugmsg("Had data on " << sock.fd() << ", sending to " << othersock.fd() << '\n'); netbuffer.netwrite (othersock, timeout); if (sock == backendfd()) balancer.backend(targetbackend()).addbytes(netbuffer.bufsz()); else IPStore::activity(clientfd().clientaddr().sin_addr, targetbackend()); netbuffer.reset(); } } crossroads-2.81/xr/Dispatchers/tcpdispatcher/dispatch.cc0000644000175000001440000000411612130034075022366 0ustar httpusers#include "tcpdispatcher" void TcpDispatcher::dispatch() { // Check that a working algorithm is available. May be missing if // constructor's "new" failed. if (!algorithm()) throw Error("No algorithm in Tcpdispatcher::dispatch"); bool connected = false; // Build up the target list, if not yet done so. The HTTP dispatcher // might've created it already for host-based matching (in which case // we won't bother here). if (! targetlist().isdefined()) { msg("Creating target list for the TCP dispatcher\n"); for (unsigned i = 0; i < balancer.nbackends(); i++) if (balancer.backend(i).available()) { targetlist().add(i); if (config.verbose()) msg(" Candidate target: " << balancer.backend(i).description() << '\n'); } } // Call the dispatch algorithm until we can connect, // or until the algorithm is out of back ends (throws exception). while (!connected) { targetbackend(algorithm()->target(clientfd().clientaddr().sin_addr, targetlist())); // Define a dummy back end according to the current selection. // Connect to it. If that succeeds, get the socket from it. Backend tb; tb.server(balancer.backend(targetbackend()).server()); tb.port(balancer.backend(targetbackend()).port()); if (!tb.connect()) { balancer.backend(targetbackend()).live(false); if (config.verbose()) msg("Failed to connect to back end " << tb.description() << ", trying to dispatch to other\n"); // Re-evaluate back ends. Something may have come online. msg("Re-creating target list for the TCP dispatcher.\n"); targetlist().reset(); for (unsigned i = 0; i < balancer.nbackends(); i++) if (balancer.backend(i).available()) { targetlist().add(i); if (config.verbose()) msg(" Candidate target: " << balancer.backend(i).description() << '\n'); } // And now fall thru into the next loop run... } else { connected = true; backendfd(tb.sock()); msg ("Will dispatch client to back end " << tb.description() << " on fd " << tb.sock().fd() << '\n'); break; } } } crossroads-2.81/xr/Dispatchers/httpdispatcher/0000755000175000001440000000000012130034076020450 5ustar httpuserscrossroads-2.81/xr/Dispatchers/httpdispatcher/senderrorpage.cc0000644000175000001440000000172512130034075023623 0ustar httpusers#include "httpdispatcher" void HttpDispatcher::senderrorpage(string const &reason) { PROFILE("HttpDispatcher::senderrorpage"); msg("Sending error page to client: '" << reason << "'\n"); try { string txt = "\n" " \n" " Internal Server Error\n" " \n" " \n" "

Internal Server Error

\n" " You request could not be completed. Please retry later.

" " (" + reason + ")\n" " \n" "\n"; ostringstream mess; mess << "HTTP/1.0 502 Internal Server Error\r\n" "Content-Length: " << txt.size() << "\r\n" "XR-Reason: " << reason << "\r\n" "\r\n" << txt; Netbuffer buf(mess.str()); buf.netwrite(clientfd(), config.client_write_timeout()); } catch (Error const &e) { // Silently discard, we are not interested in errors // that ocur when an error page is being sent msg (e.what() << " (while sending error page)\n"); } } crossroads-2.81/xr/Dispatchers/httpdispatcher/handle.cc0000644000175000001440000000720612130034075022216 0ustar httpusers#include "httpdispatcher" void HttpDispatcher::handle() { PROFILE("HttpDispatcher::handle"); // The client request was already retrieved before starting the // dispatcher. We can continue by applying server-directed headers. if (config.addxrversion()) buf().setheader ("XR", VER); if (config.addxforwardedfor()) buf().addheader ("X-Forwarded-For", inet2string(clientfd().clientaddr().sin_addr)); for (unsigned n = 0; n < config.nserverheaders(); n++) buf().setheader (config.serverheader(n)); // Patch up the Host: header if requested so. if (config.replacehostheader()) { ostringstream o; o << balancer.backend(targetbackend()).server() << ":" << balancer.backend(targetbackend()).port(); buf().replaceheader("Host:", o.str()); } // Flush client info received so far to the back end. debugmsg("Sending client request to back end\n"); buf().netwrite(backendfd(), config.backend_write_timeout()); // Let's see if we will need to modify the server headers. bool modify_serverheaders = false; if (config.addxrversion() || (config.stickyhttp() && !issticky())) modify_serverheaders = true; // Store the client request. May want to log it later. string client_request = buf().firstline(); // Go into copy-thru mode. If required, catch the server headers on // their first appearance and modify them. bool backend_response_checked = false; while (1) { Fdset readset (maxtimeout(config.client_read_timeout(), config.backend_read_timeout())); readset.add(clientfd()); readset.add(backendfd()); readset.wait_r(); Socket sock; unsigned timeout; if (readset.readable(clientfd())) { sock = clientfd(); timeout = config.client_read_timeout(); } else if (readset.readable(backendfd())) { sock = backendfd(); timeout = config.backend_read_timeout(); } else break; buf().reset(); if (!buf().netread(sock, timeout)) break; if (sock == backendfd() && modify_serverheaders) { debugmsg("Back end response seen, applying modifications\n"); modify_serverheaders = false; while (! buf().headersreceived()) if (!buf().netread (sock, config.backend_read_timeout())) throw Error("Failed to get headers from back end"); if (config.addxrversion()) buf().setheader("XR", VER); if (config.stickyhttp() && !issticky()) { ostringstream o; o << "XRTarget=" << targetbackend() << "; path=/"; buf().setheader("Set-Cookie", o.str()); } } // The back end response may now get flushed to the client. // If the response code is 4** or 5**, log it as a warning. if (!backend_response_checked && sock == backendfd() && buf().headersreceived()) { string respcode = buf().stringat(9, 3); if (respcode[0] == '4' || respcode[0] == '5') warnmsg("HTTP back end indicates fault: '" << buf().firstline() << "' as response to '" << client_request << "'\n"); backend_response_checked = true; } // Flush info to the other connected side. Socket othersock; if (sock == clientfd()) { othersock = backendfd(); timeout = config.backend_write_timeout(); // Re-patch Host header if requested if (config.replacehostheader()) { ostringstream o; o << balancer.backend(targetbackend()).server() << ":" << balancer.backend(targetbackend()).port(); buf().replaceheader("Host:", o.str()); } } else { othersock = clientfd(); timeout = config.client_write_timeout(); } debugmsg ("Had data on " << sock.fd() << ", sending to " << othersock.fd() << '\n'); buf().netwrite(othersock, timeout); if (sock == backendfd()) balancer.backend(targetbackend()).addbytes(buf().bufsz()); } } crossroads-2.81/xr/Dispatchers/httpdispatcher/httpdispatcher0000644000175000001440000000101512130034075023415 0ustar httpusers#ifndef _HTTPDISPATCHER_ #define _HTTPDISPATCHER_ #include "sys/sys" #include "Dispatchers/tcpdispatcher/tcpdispatcher" #include "httpbuffer/httpbuffer" #include "SocketHandling/socket/socket" class HttpDispatcher: public TcpDispatcher { public: HttpDispatcher(Socket &s): TcpDispatcher(s) {} void dispatch(); void handle(); bool issticky() const { return is_sticky; } void issticky(bool s) { is_sticky = s; } private: void senderrorpage(string const &desc); bool is_sticky; }; #endif crossroads-2.81/xr/Dispatchers/httpdispatcher/dispatch.cc0000644000175000001440000000655112130034075022564 0ustar httpusers#include "httpdispatcher" void HttpDispatcher::dispatch() { PROFILE("HttpDispatcher::dispatch"); unsigned stickytarget; string host_header = ""; string url = ""; // Try to dispatch. Since we're in HTTP mode, we must return an // error page when dispatching fails. try { // Get the client's request. May need for cookie inspection or for the // host header. while (!buf().headersreceived()) { // cout << "BUFFER fetching headers: " << buf().as_string() << '\n'; if (! buf().netread(clientfd(), config.client_read_timeout())) { msg("Didn't receive a valid client request, stopping"); throw Error("No HTTP request received"); } } msg("Received client request: '" + buf().firstline() + "'\n"); // cout << "BUFFER with headers: " << buf().as_string() << '\n'; // See if hostmatching or urlmatching is used. // This is true when hosts or urls are matched against non-dot. bool hostmatchused = false; bool urlmatchused = false; for (unsigned i = 0; i < balancer.nbackends(); i++) { if (balancer.backend(i).hostmatch() != ".") hostmatchused = true; if (balancer.backend(i).urlmatch() != ".") urlmatchused = true; } // Build new target list if host- or url matching applies. if (hostmatchused || urlmatchused) { msg("Creating matched target list for the HTTP dispatcher\n"); if (hostmatchused) host_header = buf().headerval("Host"); if (urlmatchused) url = buf().url(); BackendVector v; v.isdefined(true); for (unsigned i = 0; i < balancer.nbackends(); i++) { if (! balancer.backend(i).available()) continue; bool host_allowed = true, url_allowed = true; if (hostmatchused && regexec(&(balancer.backend(i).hostregex()), host_header.c_str(), 0, 0, 0)) { debugmsg("Back end " + balancer.backend(i).description() + " forbidden due to hostmatch\n"); host_allowed = false; } if (urlmatchused && regexec(&(balancer.backend(i).urlregex()), url.c_str(), 0, 0, 0)) { debugmsg("Back end " + balancer.backend(i).description() + " forbidden due to urlmatch\n"); url_allowed = false; } if (host_allowed && url_allowed) { v.add(i); msg("Candidate target: " + balancer.backend(i).description() + "\n"); } } targetlist(v); } // Dispatch as a normal backend if sticky HTTP is off, or if the // sticky target is badly specified. if (!config.stickyhttp() || (sscanf(buf().cookievalue("XRTarget").c_str(), "%d", &stickytarget) < 1 && sscanf(buf().paramvalue("XRTarget").c_str(), "%d", &stickytarget) < 1) || stickytarget >= balancer.nbackends()) { issticky(false); TcpDispatcher::dispatch(); } else { // Got a sticky target. Try to connect. If that fails, fallback // to non-sticky dispatching. targetbackend(stickytarget); Backend tb = balancer.backend(stickytarget); tb.live(true); msg("Sticky HTTP request for " + tb.description() + "\n"); if (! tb.connect()) { balancer.backend(stickytarget).live(false); msg("Failed to connect to back end " + tb.description() + ", trying to dispatch to other\n"); issticky(false); TcpDispatcher::dispatch(); } else { backendfd(tb.sock()); issticky(true); } } } catch (Error const &e) { senderrorpage(e.what()); throw e; } } crossroads-2.81/xr/Dispatchers/dispatcher/0000755000175000001440000000000012130034076017550 5ustar httpuserscrossroads-2.81/xr/Dispatchers/dispatcher/checkacl.cc0000644000175000001440000000134012130034075021611 0ustar httpusers#include "dispatcher" bool Dispatcher::check_acl() { if (config.nallow()) { bool allowed = false; for (unsigned n = 0; n < config.nallow(); n++) if (ipmatch(clientfd().clientaddr().sin_addr, config.allow(n))) { allowed = true; break; } if (!allowed) { msg("Not serving client IP " << inet2string(clientfd().clientaddr().sin_addr) << ": no match in allow list\n"); return false; } } if (config.ndeny()) { for (unsigned n = 0; n < config.ndeny(); n++) if (ipmatch(clientfd().clientaddr().sin_addr, config.deny(n))) { msg("Not serving client IP " << inet2string(clientfd().clientaddr().sin_addr) << ": match in deny list\n"); return false; } } return true; } crossroads-2.81/xr/Dispatchers/dispatcher/checkdos.cc0000644000175000001440000001020112130034075021633 0ustar httpusers#include "dispatcher" typedef map < long, std::queue > AccessMap; static AccessMap accesslog; static time_t accesslog_lastclean = 0; // Execute an external program upon excess of hard/soft rates static void run_excess(string const &prog, char const *ip) { ostringstream o; o << prog << ' ' << ip; msg("Max connection rate exceeded, invoking '" << o.str() << '\n'); int ret = sysrun(o.str()); if (ret == -1) { throw Error(string("Failed to start system call: ") + strerror(errno)); } else if (ret) { warnmsg("Program '" << o.str() << "' exited with exit status " << ret << '\n'); } else { msg("Program '" << o.str() << "' finished.\n"); } } bool Dispatcher::check_dos() { msg ("Verifying DOS protection\n"); Threadlist::desc("Verifying"); static int lock; // Check 'softmaxconnrate' and 'hardmaxconnrate' now! // Descend into this block if connrate_time() is set, AND // either hardmaxconnrate() is set, // or both softmaxconnrate() and defertime() are set. if (config.connrate_time() && (config.hardmaxconnrate() || (config.softmaxconnrate() && config.defertime()))) { // The map lookup/insert key. struct sockaddr_in sa = clientfd().clientaddr(); long key; memset(&key, 0, sizeof(key)); memcpy(&key, &(sa.sin_addr), sizeof(sa.sin_addr)); time_t now, min_ts; now = time(0); min_ts = now - config.connrate_time(); unsigned max_conns = max(config.hardmaxconnrate(), config.softmaxconnrate()); mutex_lock (&lock); accesslog[key].push(now); mutex_unlock (&lock); if (accesslog_lastclean < min_ts) { // Clean the entire access log, it's been a while... mutex_lock(&lock); accesslog_lastclean = now; mutex_unlock(&lock); bool done = false; while (!done) { done = true; for (AccessMap::iterator i = accesslog.begin(); i != accesslog.end(); i++ ) { if (accesslog[i->first].back() < min_ts) { // This IP hasn't made ANY connections in a while // -- erase! Also restart loop, i++ won't be valid // after erase(i) accesslog.erase(i); done = false; break; } else { // Keep popping off this IP's oldest connection // until we have only "recent" connections left. mutex_lock(&lock); while ( accesslog[i->first].front() < min_ts || accesslog[i->first].size() > max_conns ) accesslog[i->first].pop(); mutex_unlock(&lock); } } } } else { // The "big log" doesn't need to be fully cleaned, // but this particular IP should be! mutex_lock(&lock); while ( (accesslog[key].front() < min_ts) || (accesslog[key].size() > max_conns) ) { accesslog[key].pop(); } mutex_unlock(&lock); } if ( config.hardmaxconnrate() && (accesslog[key].size() >= config.hardmaxconnrate()) ) { // This IP has violated the "HARD" limit! Reject the connection ostringstream o; o << "Client " << inet2string(clientfd().clientaddr().sin_addr) << " has hit the HARD maximum number of connections (" << config.hardmaxconnrate() << " conections in " << config.connrate_time() << " seconds; " << accesslog[key].size() << " connections recorded). Client is refused.\n"; warnmsg (o.str()); run_excess(config.hardmaxconnexcess(), inet2string(clientfd().clientaddr().sin_addr).c_str()); return false; } else if ( config.softmaxconnrate() && (accesslog[key].size() >= config.softmaxconnrate()) ) { // This IP has violated the "SOFT" Limit. Go to sleep for a while. ostringstream o; o << "Client " << inet2string(clientfd().clientaddr().sin_addr) << " has hit the SOFT maximum number of connections (" << config.softmaxconnrate() << " connections in " << config.connrate_time() << " sedonds; " << accesslog[key].size() << " connections recorded). Client is deferred for " << config.defertime() << " microseconds.\n"; warnmsg (o.str()); run_excess(config.softmaxconnexcess(), inet2string(clientfd().clientaddr().sin_addr).c_str()); usleep(config.defertime()); } } return true; } crossroads-2.81/xr/Dispatchers/dispatcher/startdispatcher.cc0000644000175000001440000000163412130034075023266 0ustar httpusers#include "dispatcher" void Dispatcher::start_dispatcher() { // Instantiate dispatchmode algorithm switch (config.dispatchmode()) { case Dispatchmode::m_roundrobin: algo = new Roundrobin; break; case Dispatchmode::m_firstactive: algo = new Firstactive; break; case Dispatchmode::m_external: algo = new External; break; case Dispatchmode::m_strict_hashed_ip: case Dispatchmode::m_lax_hashed_ip: algo = new HashedIp; break; case Dispatchmode::m_strict_stored_ip: case Dispatchmode::m_lax_stored_ip: algo = new StoredIp; break; case Dispatchmode::m_weighted_load: algo = new Weightedload; break; case Dispatchmode::m_leastconn: default: algo = new Leastconn; break; } // NOTE: Memory errors for algorithm pointer are not handled here, // but in dispatch() (don't want to throw up in the constructor) debugmsg("Dispatcher instantiated.\n"); } crossroads-2.81/xr/Dispatchers/dispatcher/dispatcher0000644000175000001440000000335712130034075021630 0ustar httpusers#ifndef _DISPATCHER_ #define _DISPATCHER_ #include "sys/sys" #include "memory/memory" #include "balancer/balancer" #include "config/config" #include "ThreadsAndMutexes/thread/thread" #include "ThreadsAndMutexes/threadlist/threadlist" #include "backendvector/backendvector" #include "netbuffer/netbuffer" #include "SocketHandling/socket/socket" // Dispatching algorithm workers #include "DispatchAlgorithms/algorithm/algorithm" #include "DispatchAlgorithms/roundrobin/roundrobin" #include "DispatchAlgorithms/firstactive/firstactive" #include "DispatchAlgorithms/leastconn/leastconn" #include "DispatchAlgorithms/external/external" #include "DispatchAlgorithms/hashedip/hashedip" #include "DispatchAlgorithms/storedip/storedip" #include "DispatchAlgorithms/weightedload/weightedload" #ifdef MEMDEBUG class Dispatcher: public Thread, public Memory #else class Dispatcher: public Thread #endif { public: Dispatcher(Socket &s); virtual ~Dispatcher(); virtual void execute() = 0; virtual void dispatch() = 0; virtual void handle() = 0; bool check_dos(); bool check_acl(); int targetbackend() const { return target_backend; } void targetbackend(int t) { target_backend = t; } Socket &clientfd() { return client_fd; } void clientfd(Socket &c) { client_fd = c; } Socket &backendfd() { return backend_fd; } void backendfd(Socket &b) { backend_fd = b; } Algorithm *algorithm() const { return algo; } BackendVector &targetlist() { return target_list; } void targetlist (BackendVector t) { target_list = t; } private: void start_dispatcher(); int target_backend; Socket client_fd, backend_fd; Algorithm *algo; BackendVector target_list; }; #endif crossroads-2.81/xr/Dispatchers/dispatcher/dispatcher0.cc0000644000175000001440000000015612130034075022266 0ustar httpusers#include "dispatcher" Dispatcher::~Dispatcher() { delete algo; debugmsg ("Dispatcher finished\n"); } crossroads-2.81/xr/Dispatchers/dispatcher/dispatcher1.cc0000644000175000001440000000030512130034075022263 0ustar httpusers#include "dispatcher" Dispatcher::Dispatcher(Socket &clientsock): Thread(), target_backend(-1), client_fd(clientsock), backend_fd(-1), algo(0), target_list() { start_dispatcher(); } crossroads-2.81/xr/httpbuffer/0000755000175000001440000000000012130034076015322 5ustar httpuserscrossroads-2.81/xr/httpbuffer/cookievalue.cc0000644000175000001440000000105012130034075020132 0ustar httpusers#include "httpbuffer" string Httpbuffer::cookievalue (string c) { PROFILE("Httpheader::cookievalue"); string cval = headerval ("Cookie"); string match = c; if (match[match.size() - 1] != '=') match += '='; string ret = ""; size_t pos = cval.find(match); if (pos != string::npos) { pos += match.size(); for (char ch = cval[pos]; pos < cval.size() && ch != ';' && ch != ',' && ch; ch = cval[++pos]) { ret += ch; } } msg("Cookie value '" << c << "' : '" << ret << "'\n"); return (ret); } crossroads-2.81/xr/httpbuffer/firstline.cc0000644000175000001440000000204212130034075017625 0ustar httpusers#include "httpbuffer" string &Httpbuffer::firstline() { PROFILE("Httpbuffer::firstline"); // Already determined? Re-return. if (first_line.size()) { debugmsg("Previously determined first buffer line: " << first_line << '\n'); return first_line; } // Extract the first line for (unsigned i = 0; i < bufsz(); i++) { char ch = charat(i); if (ch == '\n' || ch == '\r') break; first_line += ch; } // Buffer must start with a known HTTP label, else we're in a TCP // transmission static string http_label[] = { // Request labels "OPTIONS ", "GET ", "HEAD ", "POST ", "PUT ", "DELETE ", "TRACE ", "CONNECT ", // Response labels "HTTP/", // Stopper "" }; bool is_label = false; for (unsigned int i = 0; http_label[i] != ""; i++) if (!strncmp(first_line.c_str(), http_label[i].c_str(), http_label[i].length())) { is_label = true; break; } if (!is_label) first_line = ""; debugmsg("First line determined as: [" << first_line << "]\n"); return first_line; } crossroads-2.81/xr/httpbuffer/addheader.cc0000644000175000001440000000050012130034075017524 0ustar httpusers#include "httpbuffer" void Httpbuffer::addheader (string const &var, string const &val) { PROFILE("Httpbuffer::addheader(string,string)"); if (!headersreceived()) return; string old = headerval(var); if (old.size()) { old += ", " + val; setheader(var, old); } else setheader (var, val); } crossroads-2.81/xr/httpbuffer/reset.cc0000644000175000001440000000016412130034075016753 0ustar httpusers#include "httpbuffer" void Httpbuffer::reset() { first_line = ""; bodystart = 0; Netbuffer::reset(); } crossroads-2.81/xr/httpbuffer/findheader.cc0000644000175000001440000000133112130034075017717 0ustar httpusers#include "httpbuffer" unsigned Httpbuffer::findheader(string h) { PROFILE("Httpbuffer::findheader"); // No headers in here yet? Don't process. if (!headersreceived()) return 0; // We must have a first HTTP line, else we don't have headers if (!firstline().length()) return 0; // Scan until bodystart (which is set in headersreceived()). // Used to scan until bufsz() but that's not right, thanks Maxim P. for (unsigned int i = 1; i < bodystart; /* incremented below */) { // At header? if (!strncmp(bufdata() + i, h.c_str(), h.size())) return i; // No, advance beyond \n or fail if (! (i = charfind('\n', i)) ) return 0; i++; } // Avoiding warnings: return 0; } crossroads-2.81/xr/httpbuffer/headersreceived.cc0000644000175000001440000000054712130034075020760 0ustar httpusers#include "httpbuffer" bool Httpbuffer::headersreceived() { PROFILE("Httpbuffer::headersreceived"); if (bodystart) return (true); unsigned off; if ( (off = strfind("\r\n\r\n")) > 0 ) { bodystart = off + 4; return (true); } if ( (off = strfind("\n\n")) > 0 ) { bodystart = off + 2; return (true); } return (false); } crossroads-2.81/xr/httpbuffer/requestmethod.cc0000644000175000001440000000033512130034075020522 0ustar httpusers#include "httpbuffer" Httpbuffer::RequestMethod Httpbuffer::requestmethod() { PROFILE("Httpheader::requestmethod"); if (bufsz() >= 3 && !strncmp(bufdata(), "GET", 3)) return (m_get); return (m_other); } crossroads-2.81/xr/httpbuffer/addheader1.cc0000644000175000001440000000060012130034075017606 0ustar httpusers#include "httpbuffer" void Httpbuffer::addheader (string const &h) { PROFILE("Httpbuffer::addheader(string)"); if (!headersreceived()) return; unsigned i; for (i = 0; i < h.size(); i++) if (h[i] == ':') { string var = h.substr(0, i); i++; while (isspace(h[i])) i++; string val = h.substr(i); addheader (var, val); return; } } crossroads-2.81/xr/httpbuffer/headerval.cc0000644000175000001440000000121712130034075017564 0ustar httpusers#include "httpbuffer" string Httpbuffer::headerval (string const &var) { PROFILE("Httpbuffer::headerval"); if (!headersreceived()) return (""); string myvar = var; if (myvar[myvar.size() - 1] != ':') myvar += ":"; unsigned int start; if ( (!(start = strfind(myvar.c_str()))) || (start >= bodystart) ) return (""); start += myvar.size(); for (char ch = charat(start); ch && isspace(ch); ch = charat(++start)) ; string ret; for (char ch = charat(start); ch && ch != '\r' && ch != '\n'; ch = charat(++start)) ret += ch; debugmsg ("Header " + myvar + " '" + ret + "'\n"); return (ret); } crossroads-2.81/xr/httpbuffer/setheader.cc0000644000175000001440000000072112130034075017574 0ustar httpusers#include "httpbuffer" void Httpbuffer::setheader (string const &var, string const &val) { PROFILE("Httpbuffer::setheader"); if (!headersreceived()) return; string myvar = var; if (myvar[myvar.size() - 1] != ':') myvar += ':'; // Find position beyond first \n unsigned i; if (! (i = charfind('\n')) ) return; // Poke in the header. string h; h = myvar + ' ' + val + "\r\n"; insertat(i + 1, h.c_str()); } crossroads-2.81/xr/httpbuffer/setheader1.cc0000644000175000001440000000051512130034075017656 0ustar httpusers#include "httpbuffer" void Httpbuffer::setheader (string const &h) { PROFILE("Httpbuffer::setheader(string)"); unsigned i; for (i = 0; i < h.size(); i++) if (h[i] == ':') { string var = h.substr(0, i); i++; while (isspace(h[i])) i++; string val = h.substr(i); setheader (var, val); } } crossroads-2.81/xr/httpbuffer/replaceheader1.cc0000644000175000001440000000053712130034075020502 0ustar httpusers#include "httpbuffer" void Httpbuffer::replaceheader(string const &h) { PROFILE("Httpbuffer::replacehader(string)"); unsigned i; for (i = 0; i < h.size(); i++) if (h[i] == ':') { string var = h.substr(0, i); i++; while (isspace(h[i])) i++; string val = h.substr(i); replaceheader(var, val); return; } } crossroads-2.81/xr/httpbuffer/replaceheader2.cc0000644000175000001440000000077212130034075020504 0ustar httpusers#include "httpbuffer" void Httpbuffer::replaceheader(string const &var, string const &val) { PROFILE("Httpbuffer::replacehader(string,string)"); if (!headersreceived()) return; debugmsg("Attempting to replace header " << var << " with " << val << '\n'); unsigned off = findheader(var); debugmsg("Header [" << var << "] occurs at position " << off << '\n'); if (off) { unsigned nl = charfind('\n', off); if (nl) removeat(off, nl - off + 1); setheader(var, val); } } crossroads-2.81/xr/httpbuffer/setversion.cc0000644000175000001440000000063212130034075020032 0ustar httpusers#include "httpbuffer" bool Httpbuffer::setversion (char v) { PROFILE("Httpbuffer::setversion"); // No first line? Nothing to do yet. unsigned croff = charfind('\n'); if (!croff) return false; // Find the HTTP/1.x header unsigned stroff = strfind("HTTP/1."); if (!stroff || stroff > croff) return false; // Poke in the new version. return setchar(stroff + 7, v); } crossroads-2.81/xr/httpbuffer/httpbuffer0000644000175000001440000000207212130034075017416 0ustar httpusers#ifndef _HTTPBUFFER_ #define _HTTPBUFFER_ #include "sys/sys" #include "netbuffer/netbuffer" #include "config/config" #include "profiler/profiler" class Httpbuffer: public Netbuffer { public: // Recognized request methods. Modify requestmethod.cc to add more. enum RequestMethod { m_get, m_other, }; Httpbuffer(); bool headersreceived(); string headerval (string const &var); string &firstline(); string url(); bool setversion(char v); void setheader (string const &var, string const &val); void setheader (string const &h); void addheader (string const &var, string const &val); void addheader (string const &h); void replaceheader (string const &var, string const &val); void replaceheader (string const &h); string cookievalue (string var); string paramvalue(string var); RequestMethod requestmethod(); string requesturi(); string as_string() const; void reset(); private: unsigned findheader (string h); unsigned bodystart; string first_line; }; #endif crossroads-2.81/xr/httpbuffer/url.cc0000644000175000001440000000157012130034075016435 0ustar httpusers#include "httpbuffer" static string methods[] = { "HEAD", "GET", "POST", "PUT", "DELETE", "TRACE", "OPTIONS", "CONNECT" }; string Httpbuffer::url() { if (firstline().empty()) return ""; // The first line must be a method, followed by the URL, followed // by optional mush, as in: GET /index.html HTTP/1.1. // Match the method first. unsigned url_start = 0; for (unsigned i = 0; i < sizeof(methods) / sizeof(string) ; i++) if (firstline().substr(0, methods[i].size()) == methods[i]) { url_start = methods[i].size(); break; } if (!url_start) return ""; while (firstline()[url_start] == ' ' && url_start < firstline().size()) url_start++; string ret; for (unsigned i = url_start; firstline()[i] != ' ' && i < firstline().size(); i++) ret += firstline()[i]; debugmsg("URL of request: " + ret + "\n"); return ret; } crossroads-2.81/xr/httpbuffer/requesturi.cc0000644000175000001440000000031712130034075020041 0ustar httpusers#include "httpbuffer" string Httpbuffer::requesturi() { PROFILE("Httpbuffer:requesturi"); vector parts = str2parts (firstline(), ' '); return (parts.size() >= 2 ? parts[1] : ""); } crossroads-2.81/xr/httpbuffer/httpbuffer1.cc0000644000175000001440000000017112130034075020061 0ustar httpusers#include "httpbuffer" Httpbuffer::Httpbuffer(): bodystart(0), first_line("") { PROFILE("Httpbuffer::Httpbuffer"); } crossroads-2.81/xr/httpbuffer/paramvalue.cc0000644000175000001440000000100712130034075017763 0ustar httpusers#include "httpbuffer" string Httpbuffer::paramvalue (string c) { PROFILE("Httpheader::paramvalue"); string uri = requesturi(); string match = c; if (match[match.size() - 1] != '=') match += '='; string ret = ""; size_t pos = uri.find(match); if (pos != string::npos) { pos += match.size(); for (char ch = uri[pos]; pos < uri.size() && ch != '&' && ch != '?'; ch = uri[++pos]) ret += ch; } msg("Param value '" << c << "' : '" << ret << "'\n"); return ret; } crossroads-2.81/xr/httpbuffer/asstring.cc0000644000175000001440000000024512130034075017463 0ustar httpusers#include "httpbuffer" string Httpbuffer::as_string() const { string ret = ""; for (unsigned i = 0; i < bufsz(); i++) ret += charat(i); return ret; } crossroads-2.81/xr/backend/0000755000175000001440000000000012130034076014540 5ustar httpuserscrossroads-2.81/xr/backend/markconnecterror.cc0000644000175000001440000000034412130034075020425 0ustar httpusers#include "backend" void Backend::markconnecterror() { debugmsg("Logging connection error on back end " << description() << '\n'); static int lock; mutex_lock(&lock); nconnerr++; mutex_unlock(&lock); } crossroads-2.81/xr/backend/endconnection.cc0000644000175000001440000000021612130034075017673 0ustar httpusers#include "backend" void Backend::endconnection() { static int lock; mutex_lock(&lock); nconn--; mutex_unlock (&lock); } crossroads-2.81/xr/backend/startconnection.cc0000644000175000001440000000023412130034075020262 0ustar httpusers#include "backend" void Backend::startconnection() { static int lock; mutex_lock (&lock); nconn++; totconn++; mutex_unlock (&lock); } crossroads-2.81/xr/backend/livestr.cc0000644000175000001440000000014012130034075016531 0ustar httpusers#include "backend" string Backend::livestr() const { return (live() ? "alive" : "dead"); } crossroads-2.81/xr/backend/up.cc0000644000175000001440000000046412130034075015476 0ustar httpusers#include "backend" void Backend::up (bool state) { PROFILE("Backend::up"); static int lock; mutex_lock (&lock); bool oldstate = isup; isup = state; mutex_unlock (&lock); if (oldstate != state) msg("Marking back end " << description() << " as " << upstr() << "\n"); } crossroads-2.81/xr/backend/available.cc0000644000175000001440000000106312130034075016766 0ustar httpusers#include "backend" #include "profiler/profiler" #include "ipstore/ipstore" bool Backend::available() const { PROFILE("Backend::available"); /* debugmsg("Back end " << description() << ": " << livestr() << ", " << upstr() << ", " << connections() << " connections, " << IPStore::anticipated(balancerindex()) << " anticipated, " << maxconn() << " max\n"); */ if (!maxconn()) return (islive && isup); return (islive && isup && (connections() + IPStore::anticipated(balancerindex()) < maxconn())); } crossroads-2.81/xr/backend/live.cc0000644000175000001440000000026112130034075016004 0ustar httpusers#include "backend" void Backend::live (bool state) { PROFILE("Backend::live"); static int lock; mutex_lock(&lock); islive = state; mutex_unlock(&lock); } crossroads-2.81/xr/backend/check.cc0000644000175000001440000000531412130034075016126 0ustar httpusers#include "backend" void Backend::check() { debugmsg("About to check back end " << description() << ": " << backendcheck().description() << '\n'); ostringstream o; Backend tester; Httpbuffer httpbuffer; switch (backendcheck().checktype()) { case BackendCheck::c_connect: // Assume we test at the true back end address/port. // Override if necessary. tester = *this; if (backendcheck().server() != "") tester.server(backendcheck().server()); if (backendcheck().port() != 0) tester.port(backendcheck().port()); // Attempt CONNECT CHECK times (see /etc/Makefile.class) for (int i = 0; i < CONNCHECKS; i++) { tester.connect(); if (tester.live()) break; } live(tester.live()); debugmsg("Check of back end " << description() << " by connecting to " << tester.description() << ", result: " << livestr() << '\n'); break; case BackendCheck::c_get: // HTTP GET to stated server, port, uri tester.server(backendcheck().server()); tester.port(backendcheck().port()); tester.connect(); if (! tester.live()) { warnmsg("HTTP GET checker: host " << backendcheck().server() << ", port " << backendcheck().port() << "not responding\n"); live(false); } else { o << "GET " << backendcheck().uri() << " HTTP/1.0\r\n" "Host: " << backendcheck().server() << "\r\n" "Connection: close\r\n" "\r\n"; httpbuffer.setstring (o.str()); httpbuffer.netwrite(tester.sock(), config.backend_write_timeout()); httpbuffer.reset(); while (!httpbuffer.headersreceived()) httpbuffer.netread(tester.sock(), config.backend_read_timeout()); msg("HTTP GET checker got answer: '" << httpbuffer.firstline() << '\n'); if (httpbuffer.stringat(9, 3) == "200") live(true); else debugmsg("Back end assumed dead.\n"); } break; case BackendCheck::c_external: // External program to be called, with arguments: // IP:PORT availability current-connections o << backendcheck().program() << ' ' << description() << ' ' << availablestr() << ' ' << connections(); FILE *f; int result; if (! (f = popen(o.str().c_str(), "r")) ) { live(false); warnmsg("Failed to start external checker '" << o.str() << ": " << strerror(errno) << '\n'); } else { if (fscanf(f, "%d", &result) < 1) { live(false); warnmsg("External checker '" << o.str() << "' did not reply with a number\n"); } else { msg("External checker '" << o.str() << "' replied: " << result << '\n'); live(result == 0); } if (pclose(f)) { warnmsg("External checker '" << o.str() << "' terminated with error\n"); live(false); } } break; default: throw Error("Internal fry in Backend::check()"); } } crossroads-2.81/xr/backend/availablestr.cc0000644000175000001440000000016512130034075017521 0ustar httpusers#include "backend" string Backend::availablestr() const { return (available() ? "available" : "unavailable"); } crossroads-2.81/xr/backend/connect.cc0000644000175000001440000000404712130034075016504 0ustar httpusers#include "backend" bool Backend::connect() { PROFILE("Backend::connect"); debugmsg("About to connect to back end " << description() << '\n'); // Resolve hostname, prepare binding struct sockaddr_in backendaddr; backendaddr.sin_family = AF_INET; backendaddr.sin_port = htons(bdef.port()); backendaddr.sin_addr.s_addr = dnsentry.resolve(bdef.server()); // Client socket goes into nonblocking mode, so we can connect // and enforce a timeout later. int flags; if ( (flags = fcntl (clsocket.fd(), F_GETFL, 0)) == -1 ) throw Error(string("Failed to get fd flags: ") + strerror(errno)); if (fcntl (clsocket.fd(), F_SETFL, flags | O_NONBLOCK) == -1) throw Error(string("Failed to fd in nonblocking mode: ") + strerror(errno)); // Do the connect int conres = ::connect (clsocket.fd(), (struct sockaddr *)&backendaddr, sizeof(backendaddr)); int conerrno = errno; debugmsg("Connect result: " << conres << ", errno: " << conerrno << ' ' << strerror(conerrno) << '\n'); // Put socket again in blocking mode. if (fcntl (clsocket.fd(), F_SETFL, flags) == -1) throw Error(string("Failed to put fd in blocking mode: ") + strerror(errno)); // Check on the outcome of the connect if (!conres || conerrno == EINPROGRESS) { // Wait for socket to go writable. Fdset fdset (config.backend_write_timeout()); fdset.add (clsocket); fdset.wait_rw(); # ifdef CONNECTCHECK_ONLY_WRITABLE if (fdset.writeable(clsocket)) live(true); else { markconnecterror(); live(false); } # else if (fdset.writeable(clsocket) && !fdset.readable(clsocket)) live(true); else { debugmsg("Connect socket writable: " << (fdset.writeable(clsocket) ? "yes" : "no") << ", readable: " << (fdset.readable(clsocket) ? "yes" : "no") << '\n'); markconnecterror(); live(false); } # endif } debugmsg("Back end " << description() << " is " << livestr() << " (socket " << clsocket.fd() << ")\n"); return (islive); } crossroads-2.81/xr/backend/upstr.cc0000644000175000001440000000013112130034075016216 0ustar httpusers#include "backend" string Backend::upstr() const { return (up() ? "up" : "down"); } crossroads-2.81/xr/backend/backend1.cc0000644000175000001440000000031012130034075016510 0ustar httpusers#include "backend" Backend::Backend () : bdef(), islive(true), isup(true), clsocket(), nconn(0), totconn(0), nconnerr(0), bytes_served(0), loadaverage(0.1), dnsentry(), index(-1) { } crossroads-2.81/xr/backend/backend2.cc0000644000175000001440000000033012130034075016513 0ustar httpusers#include "backend" Backend::Backend (BackendDef const &b) : bdef(b), islive(true), isup(true), clsocket(), nconn(0), totconn(0), nconnerr(0), bytes_served(0), loadaverage(0.1), dnsentry(), index(-1) { } crossroads-2.81/xr/backend/backend3.cc0000644000175000001440000000005412130034075016517 0ustar httpusers#include "backend" Backend::~Backend() { } crossroads-2.81/xr/backend/backend0000644000175000001440000000516412130034075016057 0ustar httpusers#ifndef _BACKEND_ #define _BACKEND_ #include "sys/sys" #include "backenddef/backenddef" #include "fdset/fdset" #include "error/error" #include "profiler/profiler" #include "backendcheck/backendcheck" #include "httpbuffer/httpbuffer" #include "dnsentry/dnsentry" #include "SocketHandling/socket/socket" using namespace std; class Backend { public: Backend(); Backend(BackendDef const &b); virtual ~Backend(); bool connect(); void markconnecterror(); Socket &sock() { return clsocket; } void check(); string description() const; bool available() const; string availablestr() const; bool live() const { return islive; }; void live(bool state); string livestr() const; void up(bool state); bool up() const { return isup; } string upstr() const; string const &server() const { return bdef.server(); } void server(string s) { bdef.server(s); } int port() const { return bdef.port(); } void port(int p) { bdef.port(p); } unsigned maxconn() const { return bdef.maxconn(); } void maxconn(unsigned m) { bdef.maxconn(m); } string const &hostmatch() const { return bdef.hostmatch(); } void hostmatch(string const &s) { bdef.hostmatch(s); } regex_t const &hostregex() const { return bdef.hostregex(); } string const &urlmatch() const { return bdef.urlmatch(); } void urlmatch(string const &u) { bdef.urlmatch(u); } regex_t const &urlregex() const { return bdef.urlregex(); } unsigned weight() const { return bdef.weight(); } void weight(unsigned w) { bdef.weight(w); } unsigned adjustedweight() const { return bdef.adjustedweight(); } unsigned connections() const { return nconn; } unsigned connecterrors() const { return nconnerr; } double bytesserved() const { return bytes_served; } unsigned clientsserved() const { return totconn; } double loadavg() const { return loadaverage; } void loadavg(double l) { loadaverage = l; } void addbytes(unsigned n); void startconnection(); void endconnection(); BackendDef const &backenddef() const { return bdef; } BackendCheck const &backendcheck() { return bdef.backendcheck(); } void backendcheck(BackendCheck const &b) { bdef.backendcheck(b); } void balancerindex(int i) { index = i; } int balancerindex() const { return index; } private: BackendDef bdef; bool islive; bool isup; Socket clsocket; unsigned nconn, totconn, nconnerr; double bytes_served; double loadaverage; DNSEntry dnsentry; int index; }; #endif crossroads-2.81/xr/backend/addbytes.cc0000644000175000001440000000023112130034075016641 0ustar httpusers#include "backend" void Backend::addbytes (unsigned n) { static int lock; mutex_lock(&lock); bytes_served += n; mutex_unlock (&lock); } crossroads-2.81/xr/backend/description.cc0000644000175000001440000000021312130034075017365 0ustar httpusers#include "backend" string Backend::description() const { ostringstream o; o << server() << ":" << port(); return (o.str()); } crossroads-2.81/xr/profiler/0000755000175000001440000000000012130034076014773 5ustar httpuserscrossroads-2.81/xr/profiler/profiler1.cc0000644000175000001440000000016412130034075017205 0ustar httpusers#include "profiler" FILE *Profiler::outf; Profiler::Profiler (char const *f): timestamp() { fname = f; } crossroads-2.81/xr/profiler/profiler2.cc0000644000175000001440000000031512130034075017204 0ustar httpusers#include "profiler" Profiler::~Profiler() { if (!outf) outf = fopen ("/tmp/xr-prof.txt", "w"); if (outf) fprintf (outf, "%s %s %g\n", timestamp.desc().c_str(), fname, timestamp.elapsed()); } crossroads-2.81/xr/profiler/profiler0000644000175000001440000000044712130034075016544 0ustar httpusers#ifndef _PROFILER_ #define _PROFILER_ #include "sys/sys" #include "timestamp/timestamp" #include "ThreadsAndMutexes/mutex/mutex" class Profiler { public: Profiler (char const *f); ~Profiler(); private: char const *fname; Timestamp timestamp; static FILE *outf; }; #endif crossroads-2.81/xr/balancer/0000755000175000001440000000000012130034076014720 5ustar httpuserscrossroads-2.81/xr/balancer/deletebackend.cc0000644000175000001440000000072412130034075020003 0ustar httpusers#include "balancer" void Balancer::deletebackend(unsigned i) { if (backend(i).up()) throw Error("Only 'down' back ends can be deleted."); if (backend(i).connections()) { ostringstream o; o << "Back end cannot be deleted, there are still " << backend(i).connections() << " connections"; throw Error(o.str()); } int lock; mutex_lock(&lock); backends.erase(backends.begin() + i, backends.begin() + i + 1); mutex_unlock(&lock); } crossroads-2.81/xr/balancer/addbackend1.cc0000644000175000001440000000016512130034075017351 0ustar httpusers#include "balancer" void Balancer::addbackend (BackendDef const &b) { Backend newb (b); addbackend(newb); } crossroads-2.81/xr/balancer/addbackend2.cc0000644000175000001440000000121012130034075017342 0ustar httpusers#include "balancer" void Balancer::addbackend (Backend const &b, bool is_up, bool is_live, bool do_check) { debugmsg("Adding back end " << b.description() << " to list\n"); int lock; mutex_lock(&lock); backends.push_back (b); backends[backends.size() - 1].up(is_up); backends[backends.size() - 1].live(is_live); backends[backends.size() - 1].balancerindex(backends.size() - 1); mutex_unlock(&lock); if (do_check) { debugmsg("Verifying added back end " << b.description() << '\n'); backends[backends.size() - 1].check(); } debugmsg("Back end " << b.description() << " added to list\n"); } crossroads-2.81/xr/balancer/balancer1.cc0000644000175000001440000000022712130034075017057 0ustar httpusers#include "balancer" Balancer::Balancer () : server_fd(), request_nr(0), backends(), term(false), rep(false), rest(false), webinterface(0) { } crossroads-2.81/xr/balancer/serve.cc0000644000175000001440000001314712130034075016360 0ustar httpusers#include "balancer" #include "Dispatchers/tcpdispatcher/tcpdispatcher" #include "Dispatchers/httpdispatcher/httpdispatcher" // #define SHOWDEBUG void Balancer::serve() { // Start up wakeup/checkup handlers. These are always started - even // when config.wakeupsec() and config.checkupsec() are not defined // and have value 0. Via the web interface, the values can be later // changed, but we want to have the checkers running always. if (!config.foregroundmode() && config.sport()) { msg("Starting wakeup thread.\n"); Wakeupthread *wt = new Wakeupthread(); if (!wt) throw Error("Memory fault in Balancer::serve"); wt->start(); msg("Starting checkup thread.\n"); Checkupthread *ct = new Checkupthread(); if (!ct) throw Error("Memory fault in Balancer::serve"); ct->start(); } // Write the PID file. if (config.pidfile() != "") { FILE *f; if (! (f = fopen(config.pidfile().c_str(), "w")) ) throw Error(string("Cannot write pid file ") + config.pidfile() + ": " + strerror(errno)); fprintf(f, "%u\n", getpid()); fclose(f); } // Wait for activity, serve it. msg("Awaiting activity on fd " << server_fd.fd() << '\n'); MEM(Memory::mem_mark("Balancer start")); MEM(Memory::mem_follow(true)); while (true) { MEM(Memory::mem_display()); Fdset fdset(0); fdset.add(server_fd); fdset.wait_r(); if (! fdset.readable(server_fd)) { // We caught a signal. Either a request to report status, // or to terminate. msg("Interrupt seen\n"); if (terminate()) { msg("Termination requested, XR will stop.\n"); break; } else if (report()) { msg("Report requested\n"); reportmsg("*** XR STATUS REPORT STARTS ***\n"); for (unsigned i = 0; i < nbackends(); i++) { reportmsg("Back end " << i << ": " << backend(i).description() << ", weight " << backend(i).weight() << '\n'); reportmsg(" Status: " << backend(i).availablestr() << ", " << backend(i).livestr() << '\n'); reportmsg(" Connections: " << backend(i).connections() << " (max " << backend(i).maxconn() << ")\n"); reportmsg(" Served:" << backend(i).bytesserved() << " bytes, " << backend(i).clientsserved() << " clients\n"); } report(false); reportmsg("*** XR STATUS REPORT ENDS ***\n"); continue; } else if (restart()) { msg("Restart requested\n"); config.restart(); } else { msg("Non-meaningful interrupt or select timeout, " "resuming\n"); continue; } } // Got activity! Check total # of connections. msg("Got activity on fd " << server_fd.fd() << '\n'); request_nr++; if (config.maxconn() && connections() >= config.maxconn()) { msg("Not serving connection: already " << connections() << " connection(s) (max " << config.maxconn() << ")\n"); continue; } if (server_fd.fd()) { // In daemon mode (server_fd > 0): Accept, serve and loop again Socket clsock; try { clsock = server_fd.accept(); } catch (Error const &e) { warnmsg(e.what() << '\n'); clsock.close(); continue; } msg("Accepted connection from " << inet2string(clsock.clientaddr().sin_addr) << " as client fd " << clsock.fd() << '\n'); // Show how we look if (config.verbose()) { ostringstream o; msg("Balancer is serving " << connections() << " clients\n"); msg("Current back end states:\n"); for (unsigned i = 0; i < nbackends(); i++) { msg(" Back end " << backend(i).description() << ": " << backend(i).connections() << " connections, max " << backend(i).maxconn() << ", status " << backend(i).availablestr() << ", anticipated " << IPStore::anticipated(i) << '\n'); } } Dispatcher *d; switch (config.stype()) { case Servertype::t_tcp: d = new TcpDispatcher(clsock); break; case Servertype::t_http: d = new HttpDispatcher(clsock); break; default: throw Error("Internal error, can't choose dispatcher"); break; } if (!d) throw Error("Memory fault: cannot instantiate dispatcher\n"); // Allocation boundary printout if (config.debug()) { void *mem = malloc(16); free(mem); debugmsg("Allocation boundary at dispatcher start: " << mem << '\n'); } #ifdef SHOWDEBUG void *mem = malloc(16); free(mem); cout << "XR allocation at dispatcher start: " << mem << '\n'; #endif d->start(); } else { // If fd-serving, serve and close. Don't thread it up. TcpDispatcher *d; switch (config.stype()) { case Servertype::t_tcp: d = new TcpDispatcher(server_fd); break; case Servertype::t_http: d = new HttpDispatcher(server_fd); break; default: throw Error("Internal error, can't choose dispatcher"); break; } if (!d) throw Error("Memory fault in Balancer::serve"); d->execute(); break; } // If we exceed the max # of requests, stop.. if (config.quitafter()) { msg("Request " << requestnr() << " underway of max " << config.quitafter() << '\n'); if (requestnr() >= (long)config.quitafter()) { msg("Max requests served, will stop.\n"); break; } } } // We're stopping now. If a PID stamp was created, remove it. if (config.pidfile() != "") unlink(config.pidfile().c_str()); // Wait for running threads to die off. delete webinterface; unsigned prev_conn = 0x19081962; while (1) { unsigned curr_conn = balancer.connections(); if (!curr_conn) break; if (curr_conn != prev_conn) { msg("There are still " << curr_conn << " connections\n"); prev_conn = curr_conn; } sleep(1); } msg("XR is idle, stopping.\n"); } crossroads-2.81/xr/balancer/balancer0000644000175000001440000000261412130034075016414 0ustar httpusers#ifndef _BALANCER_ #define _BALANCER_ #include "sys/sys" #include "memory/memory" #include "backend/backend" #include "backenddef/backenddef" #include "config/config" #include "fdset/fdset" #include "error/error" #include "SocketHandling/socket/socket" // Check ups of back ends and the web interface #include "Checkers/wakeupthread/wakeupthread" #include "Checkers/checkupthread/checkupthread" #include "webinterface/webinterface" using namespace std; class Balancer { public: Balancer (); void init(); void addbackend(BackendDef const &b); void addbackend(Backend const &b, bool is_up = true, bool is_live = true, bool do_check = true); void deletebackend(unsigned i); void serve(); unsigned nbackends() { return backends.size(); } Backend &backend (unsigned i) { return backends[i]; } bool terminate() const { return term; } void terminate (bool t) { term = t; } bool report() const { return rep; } void report (bool r) { rep = r; } void restart(bool t) { rest = t; } bool restart() const { return rest; } long requestnr() const { return request_nr; } unsigned connections(); private: void init_tcp (); void init_fd (); Socket server_fd; long request_nr; vector backends; bool term; bool rep; bool rest; Webinterface *webinterface; }; extern Balancer balancer; #endif crossroads-2.81/xr/balancer/init.cc0000644000175000001440000000162612130034075016176 0ustar httpusers#include "balancer" void Balancer::init() { // Set the listening socket. if (! config.sport()) { // In inetd mode, set the server socket to fd 0. // Else it will be initialized. server_fd.fd(0); } else { // In TCP mode: Prepare the binding. server_fd.bind(config.sipaddr(), config.sport()); } // Start the web interface if requested. if (config.usewebinterface() && !config.foregroundmode()) { webinterface = new Webinterface(); if (! webinterface) throw Error("Memory fault in Balancer::init"); webinterface->start(); } // Add workable back ends, display initial states. for (int i = 0; i < config.backends(); i++) addbackend (config.backend(i)); msg("Back end start states of " << nbackends() << " backends:\n"); for (unsigned i = 0; i < nbackends(); i++) msg(' ' << backend(i).description() << " is " << backend(i).availablestr() << '\n'); } crossroads-2.81/xr/balancer/connections.cc0000644000175000001440000000027012130034075017547 0ustar httpusers#include "balancer" unsigned Balancer::connections() { unsigned ret = 0; for (unsigned i = 0; i < nbackends(); i++) ret += backend(i).connections(); return (ret); } crossroads-2.81/xr/SocketHandling/0000755000175000001440000000000012130034076016046 5ustar httpuserscrossroads-2.81/xr/SocketHandling/basesocket/0000755000175000001440000000000012130034076020171 5ustar httpuserscrossroads-2.81/xr/SocketHandling/basesocket/close.cc0000644000175000001440000000053712130034075021611 0ustar httpusers#include "basesocket" void Basesocket::close() { if (_initialized && _fd > 0) { debugmsg("Shutting down socket " << _fd << '\n'); if (config.fastclose()) { struct linger l; l.l_onoff = 1; l.l_linger = 2; setsockopt (_fd, SOL_SOCKET, SO_LINGER, &l, sizeof(l)); } shutdown(_fd, SHUT_RDWR); ::close(_fd); _fd = -1; } } crossroads-2.81/xr/SocketHandling/basesocket/basesocket0000644000175000001440000000074212130034075022241 0ustar httpusers#ifndef _BASESOCKET_ #define _BASESOCKET_ #include "sys/sys" #include "config/config" class Basesocket { public: Basesocket(); Basesocket(int fd); ~Basesocket(); int fd(); void fd(int f); void bind(string const &addr, int port); bool operator==(Basesocket const &other) const; void close(); Basesocket *accept(); struct sockaddr_in clientaddr(); private: int _fd; int _initialized; struct sockaddr_in _clientaddr; }; #endif crossroads-2.81/xr/SocketHandling/basesocket/accept.cc0000644000175000001440000000135212130034075021737 0ustar httpusers#include "basesocket" Basesocket *Basesocket::accept() { int f; int size; struct sockaddr_in claddr; debugmsg("About to accept client on server socket " << _fd << '\n'); size = sizeof(claddr); if ( (f = ::accept(_fd, (struct sockaddr *)&claddr, (socklen_t *)&size)) >= 0 ) { Basesocket *ret = new Basesocket(f); ret->_clientaddr = claddr; debugmsg("Client " << inet2string(ret->_clientaddr.sin_addr) << " accepted as basesocket " << f << '\n'); return ret; } if (EMFILE_SLEEP && errno == EMFILE) { warnmsg("Out of file descriptors while accepting network " "connection, taking a short nap\n"); sleep(1); } throw Error(string("Failed to accept client: ") + strerror(errno)); } crossroads-2.81/xr/SocketHandling/basesocket/basesocket1.cc0000644000175000001440000000012212130034075022676 0ustar httpusers#include "basesocket" Basesocket::Basesocket(): _fd(-1), _initialized(false) { } crossroads-2.81/xr/SocketHandling/basesocket/basesocket2.cc0000644000175000001440000000012512130034075022702 0ustar httpusers#include "basesocket" Basesocket::Basesocket(int f): _fd(f), _initialized(true) { } crossroads-2.81/xr/SocketHandling/basesocket/basesocket3.cc0000644000175000001440000000010212130034075022676 0ustar httpusers#include "basesocket" Basesocket::~Basesocket() { close(); } crossroads-2.81/xr/SocketHandling/basesocket/fd1.cc0000644000175000001440000000046512130034075021156 0ustar httpusers#include "basesocket" int Basesocket::fd() { if (_initialized) return _fd; _initialized = true; if ( (_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0 ) throw Error(string("Failed to create socket: ") + strerror(errno)); debugmsg("Socket " << _fd << " created\n"); return _fd; } crossroads-2.81/xr/SocketHandling/basesocket/fd2.cc0000644000175000001440000000013412130034075021150 0ustar httpusers#include "basesocket" void Basesocket::fd(int f) { _fd = f; _initialized = true; } crossroads-2.81/xr/SocketHandling/basesocket/opeq.cc0000644000175000001440000000016312130034075021443 0ustar httpusers#include "basesocket" bool Basesocket::operator==(Basesocket const &other) const { return _fd == other._fd; } crossroads-2.81/xr/SocketHandling/basesocket/clientaddr.cc0000644000175000001440000000013712130034075022611 0ustar httpusers#include "basesocket" struct sockaddr_in Basesocket::clientaddr() { return _clientaddr; } crossroads-2.81/xr/SocketHandling/basesocket/bind.cc0000644000175000001440000000243612130034075021420 0ustar httpusers#include "basesocket" void Basesocket::bind(string const &addr, int port) { // Make socket reusable. int val = 1; if (setsockopt (fd(), SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) { ostringstream o; o << "Failed to set reuse socket options on fd " << fd() << ": " << strerror(errno); throw Error(o.str()); } // Prepare binding. struct sockaddr_in saddr; memset (&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); // Assign interface to listen to if (addr[0] != '0') { debugmsg ("Binding socket " << fd() << " to specific IP address " << addr << '\n'); if ( (saddr.sin_addr.s_addr = inet_addr (addr.c_str())) == INADDR_NONE ) throw Error("Cannot convert IP " + addr + " to network bytes"); } else { debugmsg ("Binding socket " << fd() << " to all local IP addresses\n"); saddr.sin_addr.s_addr = htonl (INADDR_ANY); } // Bind and listen if (::bind (fd(), (sockaddr*) &saddr, sizeof(saddr)) < 0) throw Error(string("Failed to bind to IP/port: ") + strerror(errno)); if (listen (fd(), 5) < 0) throw Error(string("Failed to listen to IP/port: ") + strerror(errno)); msg("Listening for activity on fd " << fd() << '\n'); } crossroads-2.81/xr/SocketHandling/socket/0000755000175000001440000000000012130034076017336 5ustar httpuserscrossroads-2.81/xr/SocketHandling/socket/accept.cc0000644000175000001440000000037212130034075021105 0ustar httpusers#include "socket" Socket Socket::accept() { // Try to accept the client connection (or throw up) Basesocket *client = _basesocket->accept(); // Got a connection. Create a new smartsocket and return it. return Socket(client); } crossroads-2.81/xr/SocketHandling/socket/socket0.cc0000644000175000001440000000052012130034075021211 0ustar httpusers#include "socket" Socket::~Socket() { #ifdef SOCKET_DEBUG if (*_refcount == 1) { debugmsg("Socket: discarding " << description() << '\n'); } else { debugmsg("Socket: subtracting " << description() << '\n'); } #endif (*_refcount)--; if (! *_refcount) { delete _refcount; delete _basesocket; } } crossroads-2.81/xr/SocketHandling/socket/socket1.cc0000644000175000001440000000033512130034075021216 0ustar httpusers#include "socket" Socket::Socket() { _refcount = new int; *_refcount = 1; _basesocket = new Basesocket; #ifdef SOCKET_DEBUG debugmsg("Socket: created fresh, " << description() << '\n'); #endif } crossroads-2.81/xr/SocketHandling/socket/socket2.cc0000644000175000001440000000037212130034075021220 0ustar httpusers#include "socket" Socket::Socket(Socket const &other) { _refcount = other._refcount; _basesocket = other._basesocket; (*_refcount)++; #ifdef SOCKET_DEBUG debugmsg("Socket: created copy, " << description() << '\n'); #endif } crossroads-2.81/xr/SocketHandling/socket/socket3.cc0000644000175000001440000000034712130034075021223 0ustar httpusers#include "socket" Socket::Socket(int f) { _refcount = new int; *_refcount = 1; _basesocket = new Basesocket(f); #ifdef SOCKET_DEBUG debugmsg("Socket: created with fd, " << description() << '\n'); #endif } crossroads-2.81/xr/SocketHandling/socket/socket4.cc0000644000175000001440000000034712130034075021224 0ustar httpusers#include "socket" Socket::Socket(Basesocket *b) { _refcount = new int; *_refcount = 1; _basesocket = b; #ifdef SOCKET_DEBUG debugmsg("Socket: created with basesocket, " << description() << '\n'); #endif } crossroads-2.81/xr/SocketHandling/socket/socket0000644000175000001440000000170212130034075020550 0ustar httpusers#ifndef _SOCKET_ #define _SOCKET_ #include "sys/sys" #include "error/error" #include "config/config" #include "SocketHandling/basesocket/basesocket" // To have the smart-socket approach generate debug info: // #define SOCKET_DEBUG class Socket { public: Socket(); Socket(Socket const &other); Socket(int fd); Socket(Basesocket *b); ~Socket(); Socket const &operator=(Socket const &other); Socket accept(); int fd() { return _basesocket->fd(); } void fd(int f) { _basesocket->fd(f); } void bind(string const &addr, int port) { _basesocket->bind(addr, port); } bool operator==(Socket const &other) const { return *_basesocket == *(other._basesocket); } void close() { _basesocket->close(); *_refcount = 1; } struct sockaddr_in clientaddr() { return _basesocket->clientaddr(); } string description(); private: int *_refcount; Basesocket *_basesocket; }; #endif crossroads-2.81/xr/SocketHandling/socket/opis.cc0000644000175000001440000000116512130034075020621 0ustar httpusers#include "socket" Socket const &Socket::operator=(Socket const &other) { if (this != &other) { #ifdef SOCKET_DEBUG if (*_refcount == 1) { debugmsg("Socket: destroying for assignment " << description() << '\n'); } else { debugmsg("Socket: subtracting for assignment " << description() << '\n'); } #endif (*_refcount)--; if (! *_refcount) { delete _refcount; delete _basesocket; } _refcount = other._refcount; (*_refcount)++; _basesocket = other._basesocket; #ifdef SOCKET_DEBUG debugmsg("Socket: assigned " << description() << '\n'); #endif } return *this; } crossroads-2.81/xr/SocketHandling/socket/description.cc0000644000175000001440000000023612130034075022170 0ustar httpusers#include "socket" string Socket::description() { ostringstream o; o << "refcount:" << *_refcount << ", base:" << _basesocket; return o.str(); } crossroads-2.81/xr/ThreadsAndMutexes/0000755000175000001440000000000012130034076016541 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/mutex/0000755000175000001440000000000012130034076017703 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/mutex/mutex0000644000175000001440000000042212130034075020765 0ustar httpusers#ifndef _MUTEX_ #define _MUTEX_ #include "sys/sys" #include "error/error" class Mutex { public: Mutex(); void lock(); void unlock(); bool trylock(); pthread_mutex_t mutex() const { return _mutex; } private: pthread_mutex_t _mutex; }; #endif crossroads-2.81/xr/ThreadsAndMutexes/mutex/trylock.cc0000644000175000001440000000033612130034075021702 0ustar httpusers#include "mutex" #include "profiler/profiler" bool Mutex::trylock() { int res = pthread_mutex_trylock(&_mutex); if (res && res != EBUSY) throw Error("Failed to try to lock mutex"); return res == 0; } crossroads-2.81/xr/ThreadsAndMutexes/mutex/lock.cc0000644000175000001440000000023112130034075021135 0ustar httpusers#include "mutex" #include "profiler/profiler" void Mutex::lock() { if (pthread_mutex_lock(&_mutex)) throw Error("Failed to lock mutex"); } crossroads-2.81/xr/ThreadsAndMutexes/mutex/mutex1.cc0000644000175000001440000000017112130034075021433 0ustar httpusers#include "mutex" Mutex::Mutex() { if (pthread_mutex_init(&_mutex, 0)) throw Error("Failed to initialize mutex"); } crossroads-2.81/xr/ThreadsAndMutexes/mutex/unlock.cc0000644000175000001440000000026512130034075021507 0ustar httpusers#include "mutex" #include "error/error" #include "profiler/profiler" void Mutex::unlock() { if (pthread_mutex_unlock(&_mutex)) throw Error("Failed to unlock mutex"); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/0000755000175000001440000000000012130034076020713 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/mutextable/copy.cc0000644000175000001440000000035112130034075022172 0ustar httpusers#include "mutextable" void MutexTable::copy(MutexTable const &other) { _size = other.size(); _table = new MutexTree* [_size]; for (unsigned i = 0; i < _size; i++) _table[i] = new MutexTree(*(other._table[i])); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/mutextable0000644000175000001440000000121512130034075023006 0ustar httpusers#ifndef _MUTEXTABLE_ #define _MUTEXTABLE_ #include "sys/sys" #include "config/config" #include "ThreadsAndMutexes/mutextree/mutextree" class MutexTable { public: MutexTable(unsigned sz); MutexTable(MutexTable const &other); ~MutexTable(); MutexTable const &operator=(MutexTable const &other); void lock(void *o); void unlock(void *o); unsigned size() const { return _size; } int weight(unsigned i) const; int balance(unsigned i) const; private: void copy(MutexTable const &other); void destroy(); unsigned hash(void *o); MutexTree **_table; unsigned _size; }; #endif crossroads-2.81/xr/ThreadsAndMutexes/mutextable/destroy.cc0000644000175000001440000000021412130034075022707 0ustar httpusers#include "mutextable" void MutexTable::destroy() { for (unsigned i = 0; i < _size; i++) delete _table[i]; delete _table; } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/mutextable1.cc0000644000175000001440000000037012130034075023454 0ustar httpusers#include "mutextable" MutexTable::MutexTable(unsigned sz): _size(sz) { debugmsg("Initializing mutex table with " << sz << " slots"); _table = new MutexTree* [sz]; for (unsigned i = 0; i < sz; i++) _table[i] = new MutexTree; } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/mutextable2.cc0000644000175000001440000000013412130034075023453 0ustar httpusers#include "mutextable" MutexTable::MutexTable(MutexTable const &other) { copy(other); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/mutextable3.cc0000644000175000001440000000010412130034075023451 0ustar httpusers#include "mutextable" MutexTable::~MutexTable() { destroy(); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/lock.cc0000644000175000001440000000013612130034075022151 0ustar httpusers#include "mutextable" void MutexTable::lock(void *obj) { _table[hash(obj)]->lock(obj); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/balance.cc0000644000175000001440000000016612130034075022611 0ustar httpusers#include "mutextable" int MutexTable::balance(unsigned i) const { return i < size() ? _table[i]->weight() : 0; } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/hash.cc0000644000175000001440000000107112130034075022143 0ustar httpusers#include "mutextable" /* * How to hash a pointer into an unsigned. Based on the famous hashpjw() * function. */ // #define DEBUG unsigned MutexTable::hash(void *obj) { unsigned v = 0; unsigned char *cp = (unsigned char *)obj; for (size_t i = 0; i < sizeof(obj); i++) { v <<= 4; v |= *cp++; if (unsigned g = v & 0xf0000000) { v = v ^ ( g >> 24 ); v = v ^ g; } } v %= _size; # ifdef DEBUG debugmsg("Pointer " << obj << " hashed to bucket " << v << " (given size " << _size << ")\n"); # endif return v; } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/unlock.cc0000644000175000001440000000014212130034075022511 0ustar httpusers#include "mutextable" void MutexTable::unlock(void *obj) { _table[hash(obj)]->unlock(obj); } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/opis.cc0000644000175000001440000000026612130034075022177 0ustar httpusers#include "mutextable" MutexTable const &MutexTable::operator=(MutexTable const &other) { if (this != &other) { destroy(); copy(other); } return *this; } crossroads-2.81/xr/ThreadsAndMutexes/mutextable/weight.cc0000644000175000001440000000016512130034075022512 0ustar httpusers#include "mutextable" int MutexTable::weight(unsigned i) const { return i < size() ? _table[i]->weight() : 0; } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/0000755000175000001440000000000012130034076020551 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/mutexnode/copy.cc0000644000175000001440000000036412130034075022034 0ustar httpusers#include "mutexnode" void MutexNode::copy(MutexNode const &other) { mutex(other.mutex()); obj(other.obj()); left(other.left() ? new MutexNode(*(other.left())) : 0); right(other.right() ? new MutexNode(*(other.right())) : 0); } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/destroy.cc0000644000175000001440000000013112130034075022543 0ustar httpusers#include "mutexnode" void MutexNode::destroy() { delete _left; delete _right; } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/balance.cc0000644000175000001440000000024712130034075022447 0ustar httpusers#include "mutexnode" int MutexNode::balance() const { int lw = left() ? left()->weight() : 0; int rw = right() ? right()->weight() : 0; return lw - rw; } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/mutexnode0000644000175000001440000000206212130034075022503 0ustar httpusers#ifndef _MUTEXNODE_ #define _MUTEXNODE_ #include "ThreadsAndMutexes/mutex/mutex" #include "error/error" class MutexNode { public: MutexNode(void *o); MutexNode(MutexNode const &other); ~MutexNode(); MutexNode const &operator=(MutexNode const &other); void obj(void *o) { _obj = o; } void *obj() const { return _obj; } MutexNode *left(MutexNode *l) { _left = l; return _left;} MutexNode *left() const { return _left; } MutexNode *right(MutexNode *r) { _right = r; return _right; } MutexNode *right() const { return _right; } void lock() { _mutex.lock(); } void unlock() { _mutex.unlock(); } Mutex mutex() const { return _mutex; } void mutex(Mutex m) { _mutex = m; } int weight() const; int balance() const; private: void copy(MutexNode const &other); void destroy(); Mutex _mutex; void *_obj; MutexNode *_left, *_right; }; #endif crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/opis.cc0000644000175000001440000000026212130034075022031 0ustar httpusers#include "mutexnode" MutexNode const &MutexNode::operator=(MutexNode const &other) { if (this != &other) { destroy(); copy(other); } return *this; } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/mutexnode1.cc0000644000175000001440000000014112130034075023144 0ustar httpusers#include "mutexnode" MutexNode::MutexNode(void *o): _mutex(), _obj(o), _left(0), _right(0) { } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/mutexnode2.cc0000644000175000001440000000013012130034075023143 0ustar httpusers#include "mutexnode" MutexNode::MutexNode(MutexNode const &other) { copy(other); } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/mutexnode3.cc0000644000175000001440000000010112130034075023142 0ustar httpusers#include "mutexnode" MutexNode::~MutexNode() { destroy(); } crossroads-2.81/xr/ThreadsAndMutexes/mutexnode/weight.cc0000644000175000001440000000026512130034075022351 0ustar httpusers#include "mutexnode" int MutexNode::weight() const { int w = 1; if (left()) w += left()->weight(); if (right()) w += right()->weight(); return w; } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/0000755000175000001440000000000012130034076020563 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/mutextree/nodelock.cc0000644000175000001440000000210312130034075022663 0ustar httpusers#include "mutextree" #include "config/config" MutexNode *MutexTree::nodelock(void *o, MutexNode *start) { // No tree start yet? Create one. if (!start) { # ifdef DEBUG debugmsg("Mutex nodelock: new node for " << o <<", locking now\n"); # endif start = new MutexNode(o); start->lock(); # ifdef DEBUG debugmsg("Mutex nodelock: new node for " << o <<" locked\n"); # endif return start; } // At object? Dive into the Mutexnode. if (start->obj() == o) { # ifdef DEBUG debugmsg("Mutex nodelock: existing node for " << o << ", locking now\n"); # endif start->lock(); # ifdef DEBUG debugmsg("Mutex nodelock: existing node for " << o << " locked\n"); # endif return start; } // Decide whether to recurse left or right. if (start->obj() < o) { # ifdef DEBUG debugmsg("Mutex nodelock: going left for " << o << '\n'); # endif start->left(nodelock(o, start->left())); } else { # ifdef DEBUG debugmsg("Mutex nodelock: going right for " << o << '\n'); # endif start->right(nodelock(o, start->right())); } return start; } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/copy.cc0000644000175000001440000000034012130034075022040 0ustar httpusers#include "mutextree" void MutexTree::copy(MutexTree const &other) { # ifdef DEBUG debugmsg("Mutex: WARNING - copy invoked\n"); # endif _treelock = other._treelock; _root = new MutexNode(other._root); } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/destroy.cc0000644000175000001440000000012512130034075022560 0ustar httpusers#include "mutextree" void MutexTree::destroy() { delete _root; _root = 0; } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/nodeunlock.cc0000644000175000001440000000043212130034075023231 0ustar httpusers#include "mutextree" void MutexTree::nodeunlock(void *o, MutexNode *start) { if (!start) return; if (start->obj() == o) start->unlock(); else if (start->obj() < o) nodeunlock(o, start->left()); else nodeunlock(o, start->right()); } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/unlocktree.cc0000644000175000001440000000033412130034075023244 0ustar httpusers#include "mutextree" void MutexTree::unlocktree() { # ifdef DEBUG debugmsg("Mutex: unlocking tree\n"); # endif _treelock.unlock(); # ifdef DEBUG debugmsg("Mutex: tree unlocked\n"); # endif } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/lock.cc0000644000175000001440000000052212130034075022020 0ustar httpusers#include "mutextree" void MutexTree::lock(void *o) { # ifdef DEBUG debugmsg("Mutex: locking object: " << o << " (this=" << this << ", root=" << _root << ")\n"); # endif locktree(); _root = nodelock(o, _root); unlocktree(); # ifdef DEBUG debugmsg("Mutex: object " << o << " locked\n"); # endif } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/balance.cc0000644000175000001440000000014212130034075022453 0ustar httpusers#include "mutextree" int MutexTree::balance() const { return _root ? _root->balance() : 0; } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/mutextree0000644000175000001440000000131112130034075022523 0ustar httpusers#ifndef _MUTEXTREE_ #define _MUTEXTREE_ #include "ThreadsAndMutexes/mutexnode/mutexnode" #include "config/config" // This adds verbosity to the below class functions // #define DEBUG class MutexTree { public: MutexTree(); MutexTree(MutexTree const &other); ~MutexTree(); MutexTree const &operator=(MutexTree const &other); void lock(void *o); void unlock(void *o); int weight() const; int balance() const; private: void locktree(); void unlocktree(); MutexNode *nodelock(void *o, MutexNode *start); void nodeunlock(void *o, MutexNode *start); void copy(MutexTree const &other); void destroy(); MutexNode *_root; Mutex _treelock; }; #endif crossroads-2.81/xr/ThreadsAndMutexes/mutextree/unlock.cc0000644000175000001440000000037612130034075022372 0ustar httpusers#include "mutextree" void MutexTree::unlock(void *o) { # ifdef DEBUG debugmsg("Mutex: unlocking object: " << o << '\n'); # endif nodeunlock(o, _root); # ifdef DEBUG debugmsg("Mutex: object " << o << " unlocked\n"); # endif } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/locktree.cc0000644000175000001440000000032412130034075022700 0ustar httpusers#include "mutextree" void MutexTree::locktree() { # ifdef DEBUG debugmsg("Mutex: locking tree\n"); # endif _treelock.lock(); # ifdef DEBUG debugmsg("Mutex: tree locked\n"); # endif } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/opis.cc0000644000175000001440000000026212130034075022043 0ustar httpusers#include "mutextree" MutexTree const &MutexTree::operator=(MutexTree const &other) { if (this != &other) { destroy(); copy(other); } return *this; } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/mutextree1.cc0000644000175000001440000000027612130034075023201 0ustar httpusers#include "mutextree" MutexTree::MutexTree(): _root(0), _treelock() { # ifdef DEBUG debugmsg("Mutex: constructed (this=" << this << ", root=" << _root << ")\n"); # endif } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/mutextree2.cc0000644000175000001440000000026712130034075023202 0ustar httpusers#include "mutextree" MutexTree::MutexTree(MutexTree const &other) { # ifdef DEBUG debugmsg("Mutex: copy constructor (this=" << this << ")\n"); # endif copy(other); } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/mutextree3.cc0000644000175000001440000000022312130034075023173 0ustar httpusers#include "mutextree" MutexTree::~MutexTree() { # ifdef DEBUG debugmsg("Mutex: destroying " << this << "\n"); # endif destroy(); } crossroads-2.81/xr/ThreadsAndMutexes/mutextree/weight.cc0000644000175000001440000000014012130034075022353 0ustar httpusers#include "mutextree" int MutexTree::weight() const { return _root ? _root->weight() : 0; } crossroads-2.81/xr/ThreadsAndMutexes/thread/0000755000175000001440000000000012130034076020010 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/thread/execute.cc0000644000175000001440000000014312130034075021756 0ustar httpusers#include "thread" // Dummy incase the derived class doesn't define one void Thread::execute() { } crossroads-2.81/xr/ThreadsAndMutexes/thread/run.cc0000644000175000001440000000104512130034075021122 0ustar httpusers#include "thread" #include "sys/sys" void *Thread::_run (void *data) { Thread *t = (Thread*) data; debugmsg("Thread: starting run\n"); Threadlist::enregister(); try { t->execute(); } catch (Error const &e) { mutex_lock(&cerr); if (config.prefixtimestamp()) { Timestamp tm; cerr << tm.desc() << ' '; } cerr << e.what() << "\n"; mutex_unlock(&cerr); } Threadlist::deregister(); debugmsg("Thread: ending run\n"); // Cleanups delete (t); // To satisfy the prototype return (0); } crossroads-2.81/xr/ThreadsAndMutexes/thread/thread0000644000175000001440000000074212130034075021204 0ustar httpusers#ifndef _THREAD_ #define _THREAD_ #include "sys/sys" #include "memory/memory" #include "error/error" #include "config/config" #include "timestamp/timestamp" #include "ThreadsAndMutexes/mutex/mutex" #include "ThreadsAndMutexes/threadlist/threadlist" using namespace std; #ifdef MEMDEBUG class Thread: public Memory #else class Thread #endif { public: virtual ~Thread(); void start(); virtual void execute(); private: static void *_run(void *data); }; #endif crossroads-2.81/xr/ThreadsAndMutexes/thread/start.cc0000644000175000001440000000223112130034075021451 0ustar httpusers#include "thread" #include "profiler/profiler" void Thread::start() { PROFILE ("Thread::start"); if (config.foregroundmode()) _run ((void*)this); else { pthread_t th; pthread_attr_t attr; int res; if (pthread_attr_init (&attr)) throw Error("Cannot initialize thread attributes"); if (pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)) throw Error("Cannot set thread state as detached"); for (int i = 0; i < 3; i++) { # ifdef MISTRUST_THREAD_CREATE_THREADSAFE mutex_lock((void*)_run); # endif res = pthread_create (&th, &attr, _run, (void*) this); # ifdef MISTRUST_THREAD_CREATE_THREADSAFE mutex_unlock((void*)_run); # endif if (!res) { pthread_attr_destroy (&attr); return; } else if (res == EAGAIN) { if (config.verbose()) msg ("Failed to start thread: " + (string)strerror(res) + ", retrying\n"); sleep (1); continue; } else { pthread_attr_destroy (&attr); throw Error(string("Failed to start thread: ") + strerror(res)); } } throw Error("Failed to start thread: " "Resources unavailable after 3 tries, giving up"); } } crossroads-2.81/xr/ThreadsAndMutexes/thread/thread2.cc0000644000175000001440000000005112130034075021643 0ustar httpusers#include "thread" Thread::~Thread() { } crossroads-2.81/xr/ThreadsAndMutexes/threadinfo/0000755000175000001440000000000012130034076020664 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/threadinfo/threadinfo0000644000175000001440000000203512130034075022731 0ustar httpusers#ifndef _THREADINFO_ #define _THREADINFO_ #include "sys/sys" #include "timestamp/timestamp" #include "ThreadsAndMutexes/mutex/mutex" class Threadinfo { public: Threadinfo(): th_desc(), th_tm(), th_backend(-1), th_backendfd(-1), th_clientfd(-1) { memset(&th_clientip, 0, sizeof(th_clientip)); } void desc(string s) { th_desc = s; } string const &desc() const { return th_desc; } Timestamp const ×tamp() const { return th_tm; } void backend(int b) { th_backend = b; } int backend() const { return th_backend; } void backendfd(int f) { th_backendfd = f; } int backendfd() const { return th_backendfd; } void clientfd(int f) { th_clientfd = f; } int clientfd() const { return th_clientfd; } void clientip(struct in_addr c) { th_clientip = c; } struct in_addr clientip() const { return th_clientip; } private: string th_desc; Timestamp th_tm; int th_backend, th_backendfd, th_clientfd; struct in_addr th_clientip; }; #endif crossroads-2.81/xr/ThreadsAndMutexes/threadlist/0000755000175000001440000000000012130034076020704 5ustar httpuserscrossroads-2.81/xr/ThreadsAndMutexes/threadlist/desc.cc0000644000175000001440000000014612130034075022131 0ustar httpusers#include "threadlist" void Threadlist::desc(string const &s) { th_map[pthread_self()].desc(s); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/enregister.cc0000644000175000001440000000027612130034075023366 0ustar httpusers#include "threadlist" Threadmap Threadlist::th_map; void Threadlist::enregister() { Threadinfo n; mutex_lock(&th_map); th_map[pthread_self()] = n; mutex_unlock(&th_map); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/deregister1.cc0000644000175000001440000000021712130034075023430 0ustar httpusers#include "threadlist" void Threadlist::deregister(pthread_t id) { mutex_lock(&th_map); th_map.erase(id); mutex_unlock(&th_map); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/deregister2.cc0000644000175000001440000000013212130034075023425 0ustar httpusers#include "threadlist" void Threadlist::deregister() { deregister(pthread_self()); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/backend.cc0000644000175000001440000000014212130034075022576 0ustar httpusers#include "threadlist" void Threadlist::backend(int b) { th_map[pthread_self()].backend(b); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/clientfd.cc0000644000175000001440000000015512130034075023003 0ustar httpusers#include "threadlist" void Threadlist::clientfd(Socket &f) { th_map[pthread_self()].clientfd(f.fd()); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/clientip.cc0000644000175000001440000000016312130034075023021 0ustar httpusers#include "threadlist" void Threadlist::clientip(struct in_addr adr) { th_map[pthread_self()].clientip(adr); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/backendfd.cc0000644000175000001440000000015712130034075023116 0ustar httpusers#include "threadlist" void Threadlist::backendfd(Socket &f) { th_map[pthread_self()].backendfd(f.fd()); } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/map.cc0000644000175000001440000000011312130034075021762 0ustar httpusers#include "threadlist" Threadmap &Threadlist::map() { return th_map; } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/info.cc0000644000175000001440000000013412130034075022143 0ustar httpusers#include "threadlist" Threadinfo Threadlist::info(pthread_t id) { return th_map[id]; } crossroads-2.81/xr/ThreadsAndMutexes/threadlist/threadlist0000644000175000001440000000120712130034075022771 0ustar httpusers#ifndef _THREADLIST_ #define _THREADLIST_ #include "sys/sys" #include "ThreadsAndMutexes/threadinfo/threadinfo" #include "SocketHandling/socket/socket" typedef map Threadmap; class Threadlist { public: static void enregister(); static void deregister(pthread_t id); static void deregister(); static Threadmap &map(); static Threadinfo info(pthread_t id); static void desc(string const &s); static void backend(int b); static void clientfd(Socket &f); static void backendfd(Socket &f); static void clientip(struct in_addr adr); private: static Threadmap th_map; }; #endif crossroads-2.81/xr/ipstore/0000755000175000001440000000000012130034076014636 5ustar httpuserscrossroads-2.81/xr/ipstore/clearoldest.cc0000644000175000001440000000144612130034075017452 0ustar httpusers#include "ipstore" void IPStore::clearoldest() { time_t oldest_time = time(0) + 100; StoreMap::iterator oldest_entry; bool found = false; static int lock; mutex_lock(&lock); dump(); // Find oldest entry. for (StoreMap::iterator iter = store.begin(); iter != store.end(); iter++) { if ((*iter).second.lastaccess < oldest_time) { oldest_time = (*iter).second.lastaccess; oldest_entry = iter; found = true; } } // Kill it if we got it. if (found) { if (config.debug()) { Timestamp tm((*oldest_entry).second.lastaccess); debugmsg("Erasing oldest IP store entry: " << inet2string(oldest_entry->first) << " on " << tm.desc() << '\n'); } store.erase(oldest_entry); } mutex_unlock(&lock); dump(); } crossroads-2.81/xr/ipstore/anticipated.cc0000644000175000001440000000110212130034075017423 0ustar httpusers#include "ipstore" unsigned IPStore::anticipated(unsigned b) { if (!onoff || b >= balancer.nbackends()) return 0; // Weed store for decisions later weed(); // Get number of anticipated clients for given back end unsigned ret = 0; static int lock; mutex_lock(&lock); for (StoreMap::iterator iter = store.begin(); iter != store.end(); iter++) if ((*iter).second.targetbackend == (int)b) ret++; mutex_unlock(&lock); debugmsg("Anticipated connections for back end " << b << ": " << ret << '\n'); return ret; } crossroads-2.81/xr/ipstore/target.cc0000644000175000001440000000112212130034075016426 0ustar httpusers#include "ipstore" IPStore::StoreMap IPStore::store; bool IPStore::onoff = false; int IPStore::target(struct in_addr clientip) { // Weed out the store, for decisions later weed(); // Let's see if we know the client. if (store.count(clientip) > 0) { if (config.verbose()) { Timestamp tm(store[clientip].lastaccess); msg("Client IP " << inet2string(clientip) << " last visited on " << tm.desc() << " and went to " << balancer.backend(store[clientip].targetbackend).description() << '\n'); } return store[clientip].targetbackend; } return -1; } crossroads-2.81/xr/ipstore/dump.cc0000644000175000001440000000064412130034075016115 0ustar httpusers#include "ipstore" void IPStore::dump() { if (!config.debug()) return; debugmsg("IPStore dump:\n"); for (StoreMap::iterator iter = store.begin(); iter != store.end(); iter++) { Timestamp tm((*iter).second.lastaccess); ostringstream o; o << "Client IP " << inet2string(iter->first) << " on " << tm.desc() << " to back end " << (*iter).second.targetbackend << '\n'; debugmsg(o.str()); } } crossroads-2.81/xr/ipstore/activity.cc0000644000175000001440000000060712130034075017003 0ustar httpusers#include "ipstore" void IPStore::activity(struct in_addr clientip, unsigned curbackend) { if (!onoff) return; msg("Logging activity for back end " << curbackend << " from " << inet2string(clientip) << '\n'); int lock; mutex_lock(&lock); store[clientip].targetbackend = (int)curbackend; store[clientip].lastaccess = time(0); mutex_unlock(&lock); } crossroads-2.81/xr/ipstore/weed.cc0000644000175000001440000000116212130034075016070 0ustar httpusers#include "ipstore" void IPStore::weed() { time_t now = time(0); bool done = false; static int lock; mutex_lock(&lock); while (!done) { done = true; for (StoreMap::iterator iter = store.begin(); iter != store.end(); iter++) { if (now - ((*iter).second.lastaccess) > config.ipstoretimeout()) { if (config.debug()) { Timestamp tm((*iter).second.lastaccess); debugmsg ("Stale entry: " << inet2string(iter->first) << " visited on " << tm.desc() << ", erasing\n"); } done = false; store.erase(iter); break; } } } mutex_unlock(&lock); } crossroads-2.81/xr/ipstore/clear.cc0000644000175000001440000000036212130034075016233 0ustar httpusers#include "ipstore" void IPStore::clear(struct in_addr clientip) { debugmsg("Erasing IP entry of " << inet2string(clientip) << '\n'); static int lock; mutex_lock(&lock); store.erase(clientip); mutex_unlock(&lock); } crossroads-2.81/xr/ipstore/ipstore0000644000175000001440000000201112130034075016237 0ustar httpusers#ifndef _IPSTORE_ #define _IPSTORE_ #include "sys/sys" #include "config/config" #include "timestamp/timestamp" #include "balancer/balancer" #include "ThreadsAndMutexes/mutex/mutex" class IPStore { public: struct ClientData { int targetbackend; time_t lastaccess; }; struct ClientDataCmp { bool operator() (struct in_addr a, struct in_addr b) const { long la, lb; memcpy (&la, &a, sizeof(long)); memcpy (&lb, &b, sizeof(long)); return (la - lb) < 0; } }; typedef map StoreMap; static int target(struct in_addr clientip); static void activity(struct in_addr clientip, unsigned curbackend); static unsigned anticipated(unsigned bckend); static void clear(struct in_addr clientip); static void clearoldest(); static void on() { onoff = true; } static void off() { onoff = false; } private: static void dump(); static void weed(); static StoreMap store; static bool onoff; }; #endif crossroads-2.81/xr/dispatchmode/0000755000175000001440000000000012130034076015615 5ustar httpuserscrossroads-2.81/xr/dispatchmode/modestr.cc0000644000175000001440000000134112130034075017577 0ustar httpusers#include "dispatchmode" #include "config/config" string Dispatchmode::modestr() const { ostringstream o; switch (mode()) { case m_leastconn: return ("least-connections"); case m_roundrobin: return ("round-robin"); case m_firstactive: return ("first-available"); case m_external: return (static_cast("external:") + config.externalalgorithm()); case m_strict_hashed_ip: return ("strict-hashed-ip"); case m_lax_hashed_ip: return ("lax-hashed-ip"); case m_strict_stored_ip: o << "strict-stored-ip:" << config.ipstoretimeout(); return (o.str()); case m_lax_stored_ip: o << "lax-stored-ip:" << config.ipstoretimeout(); return (o.str()); default: return ("unknown"); } } crossroads-2.81/xr/dispatchmode/dispatchmode0000644000175000001440000000076512130034075020213 0ustar httpusers#ifndef _DISPATCHMODE_ #define _DISPATCHMODE_ #include "sys/sys" using namespace std; class Dispatchmode { public: enum Mode { m_leastconn, m_roundrobin, m_firstactive, m_external, m_strict_hashed_ip, m_lax_hashed_ip, m_strict_stored_ip, m_lax_stored_ip, m_weighted_load, }; Dispatchmode() : mymode(m_leastconn) { } void mode (Mode m) { mymode = m; } Mode mode() const { return (mymode); } string modestr() const; private: Mode mymode; }; #endif crossroads-2.81/xr/dnsentry/0000755000175000001440000000000012130034076015017 5ustar httpuserscrossroads-2.81/xr/dnsentry/resolve.cc0000644000175000001440000000114012130034075017000 0ustar httpusers#include "dnsentry" in_addr_t &DNSEntry::resolve (string const &h) { // If the entry is there and if it's up to date, run with it if (result && timestamp.elapsed() <= (double)config.dnscachetimeout()) return result; // Resolve now. struct hostent *hostaddr; mutex_lock((void*)gethostbyname); if ( (hostaddr = gethostbyname(h.c_str())) ) memcpy (&result, hostaddr->h_addr_list[0], hostaddr->h_length); mutex_unlock((void*)gethostbyname); if (!hostaddr) throw Error("Failed to resolve host '" + h + "'"); debugmsg("Host " << h << " resolved\n"); return result; } crossroads-2.81/xr/dnsentry/dnsentry0000644000175000001440000000052212130034075016606 0ustar httpusers#ifndef _DNSENTRY_ #define _DNSENTRY_ #include "config/config" #include "error/error" #include "timestamp/timestamp" #include "ThreadsAndMutexes/mutex/mutex" class DNSEntry { public: DNSEntry(): result(0), timestamp() {} in_addr_t &resolve(string const &str); private: in_addr_t result; Timestamp timestamp; }; #endif crossroads-2.81/doc/0000755000175000001440000000000012130034076013265 5ustar httpuserscrossroads-2.81/doc/fig/0000755000175000001440000000000012130034076014032 5ustar httpuserscrossroads-2.81/doc/fig/cluster.graffle0000644000175000001440000003315412130034070017043 0ustar httpusers ActiveLayerIndex 0 AutoAdjust CanvasColor w 1 CanvasOrigin {0, 0} CanvasScale 1 ColumnAlign 1 ColumnSpacing 36 CreationDate 2008-07-15 11:11:27 +0200 Creator Karel Kubat DisplayScale 1 cm = 1 cm GraphDocumentVersion 5 GraphicsList Class LineGraphic Head ID 4 ID 30 Points {288.594, 104.284} {367.5, 102.219} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 27 Class LineGraphic Head ID 27 ID 29 Points {116.479, 138.195} {154.614, 126.669} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 9 Class LineGraphic Head ID 27 ID 28 Points {116.486, 80.1664} {153.816, 89.2202} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 8 Bounds {{147, 61}, {152, 90}} Class ShapedGraphic ID 27 Shape Cloud Class LineGraphic Head ID 7 ID 26 Points {421.842, 114.609} {454.158, 130.391} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 4 Class LineGraphic Head ID 6 ID 25 Points {422.5, 101.5} {453.5, 101.5} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 4 Class LineGraphic Head ID 5 ID 24 Points {421.842, 88.3909} {454.158, 72.6091} Style stroke HeadArrow FilledArrow TailArrow 0 Tail ID 4 Bounds {{62, 131}, {54, 31}} Class ShapedGraphic ID 9 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 Client} Bounds {{62, 58}, {54, 31}} Class ShapedGraphic ID 8 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 Client} Bounds {{454, 128}, {54, 31}} Class ShapedGraphic ID 7 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 B3} Bounds {{454, 86}, {54, 31}} Class ShapedGraphic ID 6 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 B2} Bounds {{454, 44}, {54, 31}} Class ShapedGraphic ID 5 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 B1} Bounds {{368, 86}, {54, 31}} Class ShapedGraphic ID 4 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 XR} Bounds {{355, 35}, {166, 133}} Class ShapedGraphic ID 3 Shape Rectangle Style stroke CornerRadius 5 Text Text {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf330 {\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\fs24 \cf0 Cluster\ \ \ \ \ \ \ \ \ \ \ \ \ } GridInfo GuidesLocked NO GuidesVisible YES HPages 1 ImageCounter 1 IsPalette NO KeepToScale Layers Lock NO Name Layer 1 Print YES View YES LayoutInfo LayoutTarget 3 LinksVisible NO MagnetsVisible NO MasterSheet Master 1 MasterSheets ActiveLayerIndex 0 AutoAdjust CanvasColor w 1 CanvasOrigin {0, 0} CanvasScale 1 ColumnAlign 1 ColumnSpacing 36 DisplayScale 1 cm = 1 cm GraphicsList GridInfo HPages 1 IsPalette NO KeepToScale Layers Lock NO Name Layer 1 Print YES View YES LayoutInfo LayoutTarget 3 Orientation 2 OutlineStyle Basic RowAlign 1 RowSpacing 36 SheetTitle Master 1 UniqueID 1 VPages 1 ModificationDate 2008-07-15 11:15:13 +0200 Modifier Karel Kubat NotesVisible NO Orientation 2 OriginVisible NO OutlineStyle Basic PageBreaks YES PrintInfo NSBottomMargin coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG NSLeftMargin coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG NSPaperName string A4 NSPaperSize size {595.2, 841.8} NSRightMargin coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG NSTopMargin coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFklwCG ReadOnly NO RowAlign 1 RowSpacing 36 SheetTitle Canvas 1 SmartAlignmentGuidesActive YES SmartDistanceGuidesActive YES UniqueID 1 UseEntirePage VPages 1 WindowInfo CurrentSheet 0 DrawerOpen DrawerTab Outline DrawerWidth 209 FitInWindow Frame {{537, 57}, {593, 939}} ShowRuler ShowStatusBar VisibleRegion {{0, 0}, {578, 825}} Zoom 1 crossroads-2.81/doc/xr.10000644000175000001440000000405312130034071013775 0ustar httpusers.TH "XR" "1" "Nov 6, 2008" "Crossroads" "Man Page" .SH "NAME" xr \- Crossroads Load Balancer & Fail Over Utility .SH "SYNOPSIS" \fBxr [--verbose] [--web-interface XRSERVER:PORT] --server tcp:XRSERVER:PORT --backend BACKEND:PORT [--backend BACKEND:PORT] ...\fR .SH "DESCRIPTION" This manual page briefly documents XR, the Crossroads Load Balancer & Fail Over Utility. XR is an open source load balancer and fail over utility for TCP based services. It is a dae mon running in user space, and features extensive configurability, polling of back ends using wake up calls, status reporting, many algorithms to select the 'right' back end for a reques t (and user-defined algorithms for very special cases), and much more. XR is service-independent: it is usable for any TCP service, such as HTTP(S), SSH, SMTP, dat abase connections. In the case of HTTP balancing, XR handles multiple host balancing, and can provide session stickiness for back end processes that need sessions, but aren't session-awa re of other back ends. XR furthermore features a management web interface and can be run as a stand-alone daemon, or via inetd. Execute 'xr -h' to get a complete list of available command-line parameters. .SH "EXAMPLE" xr --verbose --server tcp:0:80 --backend 10.1.1.1:80 --backend 10.1.1.2:80 --backend 10.1.1. 3:80 --web-interface 0:8001 This instructs XR to listen to port 80 and to dispatch traffic to the servers 10.1.1.1, 10.1.1.2 and 10.1.1.2, port 80. A web interface for the balancer is started on port 8001. Direct your browser to the server running XR. You will see the pages served by one of the three back ends. The console where XR is started, will show what's going on (due to the presence of --verbose). Direct your browser to the server running XR, but port 8001. You will see the web interface, which shows the status, and where you can alter some settings. .SH "SEE ALSO" xrctl(1) .SH "AUTHOR" XR was written by Karel Kubat . Web page: http://crossroads.e-tunity.com .P This man page was written by Frederik Dannemare . crossroads-2.81/doc/xrctl.10000644000175000001440000000274312130034071014504 0ustar httpusers.TH "XRCTL" "1" "2008,2009" "Crossroads" "Man Page" .SH "NAME" xrctl \- Crossroads control-script .SH "SYNOPSIS" \fBxrctl [OPTION]...\fR .SH "DESCRIPTION" This manual page briefly documents xrctl, the Crossroads control-script. Instead of starting XR by hand, consider using xrctl. Edit /etc/xrctl.xml, which is the configuration file, and configure your service(s), all their options, and back ends. Then type xrctl start to start all your services, or xrctl stop to stop them. .SH "OPTIONS" .nf list [SERVICE] - show configuration of a service, or of all start [SERVICE] - start a service, or all configured services stop [SERVICE] - stop a service, or all configured services kill [SERVICE] - brutal stop, interrupts connections force [SERVICE] - start a service (or all) if not running stopstart [SERVICE] - stop and start a service, or all killstart [SERVICE] - kill and start a service, or all status [SERVICE] - show running status of a service, or of all rotate [SERVICE] - rotate logs of a service or of all generateconfig [SERVICE] - queries running XR's for the configuration and shows it in the format of /etc/xrctl.xml .fi .SH "SEE ALSO" xr(1), xrctl.xml(5) .SH "AUTHOR" xrctl was written by Karel Kubat . Web page: http://crossroads.e-tunity.com .P This man page was written by Frederik Dannemare and updated by Karel Kubat . crossroads-2.81/doc/xrctl.xml.50000644000175000001440000002333112130034071015303 0ustar httpusers.TH "XRCTL.XML" "5" "2008,2009" "Crossroads" "Man Page" .SH "NAME" xrctl.xml \- Crossroads control-script configuration file .SH "SYNOPSIS" The file /etc/xrctl.xml is xrctl's configuration. It defines how xrctl will start the balancer xr. If you wish to use xrctl to control the balancer, then you must configure all services, options and back ends in xrctl.xml. .SH "EXAMPLE" The following is a configuration example. See the file xr.pdf which is distributed with the sources for a full description. .nf /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin true ssh tcp

0:20000
0:20001 1800:3 1800
server1:22
server2:22
server2:22
webone
0:20010
http 127.0.0.1:20011 lax-hashed-ip 3 0 yes yes /tmp yes /where/ever/activitystart /where/ever/activityend /where/ever/activityaborted 10.255.255.255 192.168.1.255 192.168.1.100 4096 2 200 150 1000000 400 /path/to/program off on off
MyFirstHeader: Whatever
MySecondHeader: WhateverElse
server1:80
2 300 www.mysite.org
server2:80
100 connect::81 www.myothersite.org
server3:80
get:server3:80/healthcheck.cgi www.myothersite.org
.fi .SH "SEE ALSO" xr(1), xrctl(1) .SH "AUTHOR" xrctl and the corresponding configuration file format were written by Karel Kubat . Web page: http://crossroads.e-tunity.com .P This man page was written by Karel Kubat . crossroads-2.81/doc/xr.odt0000644000175000001440000064052512130034072014436 0ustar httpusersPKdz=^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKdz=Configurations2/statusbar/PKdz='Configurations2/accelerator/current.xmlPKPKdz=Configurations2/floater/PKdz=Configurations2/popupmenu/PKdz=Configurations2/progressbar/PKdz=Configurations2/menubar/PKdz=Configurations2/toolbar/PKdz=Configurations2/images/Bitmaps/PKdz=/CC-Pictures/10000000000001E1000000D761463138.pngPNG  IHDR|~]ClIDATxw\GǯQA.`ÊXF5101j^+&Ɩ 5j4EE-w18v~eݝߜ9sL'OXAS  "-`^DA̋h yA(!0L28т Ueu:]^Xq!E">@hV57l"т $'gϞy昘ooÇ+W2:nܸ`hb<?Ξ=;5gT!ݮ]XHszk~BRy{m۶[:t ׯpC{۷o6m3g_*8[BhA ;!$...k2۷oܸ[!Bq>{ 5ݨQ@_{͞=;cׯ_pWWjժ@!zWtF4Z0(=d_Ϝ9"2I]bŭ[ٳgƍݻw_v-i4_qssAMB 5ϛ7+W`VTǐ!MihAR u^-Zd)ܷoO?wAp-V;p/^|sDDԩSjժW`87|]v}ٲd;3т $Py93 {{E#K( pww\ `vih DUg`ă;m$_6k:fh4* k֬δ-v S2'3R*O)gqh6?hFI۴3:EAH&$PiYheFFeAl4T"-BPe@%)ZY#m^*0תC_g8т $DLؠj5_|@gY],m!%2RD{34VYa Z&strт V^հ $if"gaьh )בI*LdVgB4Z}HnUAvh  rт E4ZF hA0/v~=IxhA0M#S9H1hEhA0ǹ5k,h<ǏϘ1wrmihA0 wގ;>&={-.1Ңт`lDMF^ft4ڵkx4rH4lȦh Y!L.Fxٲe˪YF ai.`x9rn4W4Z#)FJ0p|+W /8_~\<3nT+eʔWu;wرcG{```=J.M=jRjv#dQw B"eԨQΝK6o{۶m =ժU:u TRuAyѣG˔)Y/P@XX G_q`mÜ|Ux⾾_o9pʕ+jt z:?y6+a0o{EC{gYhQ*9d{&ŋ`[~g ٳ>m3 \qMG-4H^_}ȑ#.}Û5k˩tXrCʐ88 | ޻w͛a'Bnժ{7iҤK<8K4:q`]ĉ5jР^+ :&& Ib0aR/ӧO;^zoFpppv+,)u0Ka\t P0ЙUVҥMJ Ѩ(]ΦF u+VwfOFg}pB5}[???4CS^4F+'?23~ׯ_W_M& FSAv)Yeˢi2e mUbbPgct#GL޽{6ro+ViVvmv'懸۷O/$bG;>`Ə?dȐnݺ[ƍUF Ge˖Ix.][.$'įM$X()xf&`2LŋCMҲHׯ_?((2=gH-XLg0>֭[:Xk׮"HE(]ڡt+R͛7.]j{eڵ+>.n7:,G֪U ?p@3DEun f23~Ӎ.cFF رc۶mdsɧOJm@ܺu ʠ6@WX}4=߆R-ZJM;WN 3f̠=M49|tt+Y
S] s*,,lŊA,ACh&O< 6lٲ%߿fѣGRؾ.ZsOuuU9/~p{Ft׮]S7 7nܼys`փ;0'ǎzURW RJt˷z3:ÇO4 gȐ!'Nprr2Dg4Z& (`R(g:,VY?x -#X¿`ۨ_549("_IBJ@o^zAAAY@atO8w ]cǎuooo(ѣӼl1owܶm۠Qܹ3`4Ts͝;7y򫄤Ӯ];~~~aS:;=:iB"##+Vk. Ь˗;qt93(ܔcС:u)=h & ?JHN{Ϟ=_}%Ka_oٲrʋ-[謩ycCٱc79skx XR+VrB+QdժU!AAAWhO1w@JO52d@RdÇôD֭[ѧϟL2F٨$Ӽ$;9p6=lgvZXֺ&!E+VXx^ؓQxa?GTP'O¦T*c;IkGM)aɓRعswRHՄAC y@C'UXOhJ*mmc]\\_F 9}tBCT̼6|ٰa޽{.Et}ƌ'Жpjժ˩7dH!D{H(v4JQ*-h"~JɵTiXH.NLΰĉVuel)TѼJ-\ft)eIK8w@{Ƕ*^ttG,,T^MUr<v4sげ@͋O{?aD5Vh ~clr… kÛmx}!R$ʖ_;T[Ç4ŎڧY5`ꄡ&@Uw?BiO>]jU~|MϞ=~. };VX<?^?eLNƪZC3ɳA4`;|zѼ 4G߼y+'bƍʔ)CټhMY}Dh2Y@xd2L'9:8|PsS2 9ȗ/.'taԨQ 6̬K%9,$jY,Fi4txHSɈ֬* P.;ߟh)!a'8ctJutXP"qA5Z9 L5;wX/!$O>dΜ9 ߗTKnR[И1]v7=_|ٳg:th̙t-[tdYȔ)SNCu|޽| ډ+Z׷^z=ھ}ߑ#G<==-[6|p\t...^!AeAYk x\jneP%KSBs)4mڴA-Z>S@%,Y@vի 븁bͽNYk@!Ӑo4zh?L[h1xW^yEGY~={Zm۶mΝhH3FOht@@MM4r4SalhJURx{9sni!pҥK.\5m;(y[rٺuk.g Yt)}oߞ8qiz*j߿{hƍxp.@ /^lРǏ7nnޥB ݼySk%Odm]iHԾj>TVm…|AA`J(QBի;99s7'ADO|˖- jҤ ͛<{\ҥ:iҤu֩g(qqq0:t萒 ?>ů9 P%ؘ1c'|nӮ]\]]SR0 @۶mhgϞmO׮])«B'Tvڟ~رcS#8k֬gϞ5j>S$^˃hK0{Vܹsܸ֭qB_)ڵkarʥT?vTYf|rMXnnn/>|ɒ%Sr@'`w顡kkv}LR3z:ڳqqq3gΰaÌ. GK+0`O͚5 VZu+kӑ+ XJѯ)l@iS-|޼yqbŊ0=zt+V8w\?W\[mh*RƍKw6mX!~;n= }}kb.]n@n݊;  *)A4LsV1u:R)_XOb `9JF|t<Ǚ-9qRGݻaDs wƍ͛7[s0-[vȑ:uJcɒ%;v숌̟?;wꫯ&ý:]o 1ZFR=dȐE)Rb푴o^۹s۷og+;=JwnѰFuС|LXXՓhtb~uP7n|r2/;v㏻uKboBzD4J2͟)^pŋ'N.|aꫯFitA^Z5yԔT@ft9hPuJO8駟.]T3_LЛɗ/oX&$DHHHZJ.ݱcGˢeʕ&L2dHkw **JF' ^FMyq}7"ffA/6TPaݕ*U Ep `ۢYb.]|Ǐ=zt߾}SlDw@.UM㑬[yMvYD ^xThVv+W@`۷nݺׯGR9bcr]NdQ;w,~ g͚\hѥx5k駟otL; <8o޼<]܁"(.r>>g[D͗_~yq(uҥ 4lذ… ].S#lAYd-\ OA9y={R '`._ʖ-s)S/__~2)A AFΝ; 40hS.]Z@RJ,pi )m2J,>vةSzyyk#FHbhP'Ҍm۶2\S޽J#S:)uz_&<SDYf3棏>TRnFstQݢ`U^rh!#|9tQ v=zt)+@LbŊ}xVZ]t,Yjٳׯ4)Yx<޽/x7sæ4-/gg)S9r̙knٲeƍQ` 2$_|]t1 mؽ{(P`jPu}6FS/xXm۶ "&!?wߝ5k;wXkB.`ZdLH^jjwZ{~z'''2a8ʕ vRp3g}JbOSNʕR >sAMFx90ԩf‚Lw1""aÆƕќrOj<^{ ݻ.aM)R$::W IO>/^D;wns>>u!GBa?+I3Mo?m{ƍiѣGdwfI@ڴik_25m8vX@@}NNNd#:Ȉ ̕+W`/]Abbbt93M^5yÇiyZ:~8J8sLڣY{_LҺup??ZX7XdJ$TT J'SZRy慄ԬYFdJ!;:ĈZF"AP6j4 u۱c+ ٳQNK^xqȐcǖ,Y2WAcDXuG :::((̙3踠 9&4Lik0TâePGڵ]v ?~<"}={6:IKܹs…iJxxB8ގ3G AFhiJlH W//M._r4jo-Fΐ+q 6"EZ/Xl+_(6oPmۺ䊇h#h'7axF$0dI/j/ 5<:ps`&s:iuhݺuTT>ooYf2YjE{… {.oذ7ã[nx'!'3mNCf 3eʔ'OҶkǎaџc֭kTy{h0lIZMeZ6KURbEOO4jcƌI{Θ1rE/=^ VPxxXhN.^6-Z4l@sXa qP;$-8:0իt~~~GA}!0BBBڴizdtI֎&hؐdڨ% h׎X%w9zƬ k׮TÇ=zSoҥKӧOO!s|App0T\Xf͵k:utΝH35iP['''R ǎY*,%-8B{iڶmΝ;a8–)SٳƏo aakA#3 61b,I&}Wh<]rxh5_tˉi.AjhλVF*U;w￟6mZR:wܶm[ȷ.jqxJ,K/Mr ls)D ?Zjոq|+V(IwqQd^i#-$ = *-\;3~bS;rU_~vM8… ,شi͛ccc/_&bAӗ.]jiS/.SfXb~]|޷Tr<<<зbŊٳg߻w-9ތիCǓ|:ۋsŋС>_hN;foo-[l޼9ZBUdfRmÜOee<TP!(2z8rHXX.Qa)G{g7nԨQsΥ?Q'@q jժԩSvEYNT7o=zd@M4Az0\kҶ̩Ԭ$(lp 5ϴLÇ͋_?o߾ ў]|'-[hѢ"E87ƍǏGwĉ;wnݺupۇ?"qnݺ5z/nݺ^^^UjNOesߥgJ:!$;uN=NT Ke˖wyZ%M 7)ώ8fݺuPdރFt"K{`9B&LrAhbÆ ]vB|́޽ANRS+.$%h3elTVM3Vgggv(`U5 4udg W xH*Mc (F~hv܉7f͚}g=svƓ@7mc|?V.ڥK 'f͚#FXRÔ4F' 1G06lq; rgtV{I&-]Դ o x DY)Tf`?Oϗ/L`˳'NQ}겪]AEaMkjڴ)޶?H%D/޻wor`ţ7@~dP3q ܙ`YW#b> )g֭C}ʔ) UV9ht qA削RØByرW~gh,dr~~~C z"SMPJ2GcH4o)Ma3ќʊgUr$OJGFw00mڴ֯_?1UF__ŋwOwޜވ̬RCMϚ"VpvYH - pԨQxW 71cL5ZV\TԵ !4?"Q5uL1a#AN%DnJR jO#YӐ$/NL4I.4GQTdVKdOG?OpUV*UbbbКC^q˗/_re^B/qU+ѣG[9y;wڵkC) sOh* D3lȲqO4 BA~tN0QҸH2[nָqJ*UF Ge˖}.]׭[wٲevO:3r8HA2n "NJOn˳ bCI`# A$;؀n-Zډk׮mܸqP[޽{Pv:] LfjިQ#|͓M4Wg5Rz /]g'SNǏW^"En޼Vhҥb׮]`>0Y=FDץ I %"aʐL9h$uYUg692ݢtblљL֪H'g k4 cuwwg7 78@mpbWuGp<4:I*y4dsoQۢ//=߆Rӌ^YzcǎagU6iæi6`c#d !ՠ*5/u.kRd*T ru~91*5$aN $y4FsiC<Z =`SZr¡P!7b(4 Aڴ.#A{j=ʕvĐ+Sk1٭$Ul$~iDI'qkv]Y4q,Ж(@dʂ h۸fRg2W%XDY쒠F; &!Ď $)  @ScTjFT_t,\h1I$6^ΡWˠj4˴]/WCmK#eApg4[7 voOPKBbf2AӟTf/aLr k4kJl];:mC8Y7, /-mr*SLHDnkzTY!iVϓxkJnK2 Q&&65v8MDfƹaJ%/\\\.\`,oK9iFl Tڒp/'SeEMhMhfeΎ*P1Z΂|W#G4 o֬.;}`l6ҟp+dvq0sU^չ$lX*ߙ}yKHHHZJ.ݱcGˢeʕ&LlhM(P} ISfKzsz8bkqB[lHԠB wTRhh Pq G'NrZ;vjooe˖=Zμy|||^5VL],/K_c 6rܷdPbEتaaak׾r ...K@'h5UH4ov{r٧R- K˛7/QȃƔۙ Nȱ<;yw'oZ$ՋIOeTM0* ZpiŮX3+KEZ~xX{d$,ͶYxҀL <$Ⱥ ¨8ƃ4aTD&ʦ*IH|v(,efwF&Ug׌}BwȤ$]B!o/[^ G\8ΕC]-&e \ 4Vrsz'~}2Kb!ƒ=Y<D՘ffisB))A ً|;xA4yB lJު;i:-}d2M-1Ob[m`70h`"#Z4:L+qXkD[d=CA0ՔVsAiF%ݰ458KͶhB4Z$sT9)U Ea/ ,phA0˘^ۆQA!Iӄ% -ƣf%4EDhQaT$B4Z̋Q т E4ZF hA"-`^DA̋h yA0/т E4ZF hA"-`^DA̋h yA0/т E4ZF hA"-`^DA̋h yA0/т E4ZF hA"-`^DA̋h y?7{(IENDB`PKdz=GwUU-Pictures/1000000000000275000000BA3B64A6DD.pngPNG  IHDRuG,KUIDATx \SGJР* &P JJK\ XE+VZӷxAu`]ԲŶ]Ux TD(%H NKrQxVLvf-`9cgswY>?9Z>JZq(aT)NdBWQKݷvk? Tg}o-$kanwδwbs>[y)vwW7dDbN+KǏ|gYa@gVݩ9Dy;_)e*]xc'i`^ZyWƐQFƐ=Wmv?u~>k W?i3Q?wIߝ[Mq_\P_A s~>qCyា›MDS.Y1kp}q'fJþXI1_j5Ѝd﮲k-^ [_d5:tc7OeᎩ %_?wYj/օåOq:OKb[E1ʷhya/W7jl.iӦ̐ޟTV8~VF2Qgzi&Fc0v!p!wٝVCqOQ H/?M)&6W5ʪƶ~KZ-]{-:?Y?:utk/tnY5ػ\s9텊cWGX{Z)t-v[ pI~nZ\/J1F~/6~iG-xk&mvM|yQM?ts.XT6_~*6ZdKM4 #\/>g+=gv*N_i4axϷ\Bg,^b% ΜAKNJoJtK:9xWkӡDO Ct_N{# ψVJ>jm4[W7~{,+:Q/G_!bZ -)=W6UViq{t"-:2Q?q}ZczYj>3I1tЙF~]W'\=5҃Ifz4K6a>!/c<U׆w߱#VLL<.*k_^qdtzT@?ٽ0|v%w,=ɔTR\}篝r.xTj);hcV} hzL+WnnHCϱk5Pͥekc-Y}u{^ᅬ{WV,=>'aR JyrE-?wq{OcLC'LG%οqSM_ꇩq{5(/WO"qRꘀY,>͗8'5?*ʫϟcs-{TOw]nSo&ulcr05JhQ J<<1ofvs Rn=mOiҿCA F%|Mz*jp#GN91Όi%ݻu`UqNt<OQˊ]93%djk՟}Yaut 0fCQEg[}/ppIa(=bfx7G6;kZhK¡}׿i>>3;e$[&Y$pilk0Zyֹ/2bs;B_w3؞EAߞoOА<0oD_}{Mȫ#6vH\m!|ܢ[ + 7m}?gWu6z A^֨4,4?H-ۅo/cZq8\YlE%e8qTT[bgݛ7edoɖKܮ}"zwH7}\_(HpۋnD7^-.sqn~)\SxXܗ`j]UyX^1Vq itrk+s]`;SIAս+~ZZ\- 4S t `k_%_f e.o/0pgCNmq}w5=!d(oMZv.PUZ N{{sFEZZ)ωd yb}}Ip 悬.!GCj4W M{FoCѠD]'B E#I1\rcކ [> S7'[+ W‰arbu {Ȇʜ ȊVX`CyM\ ZvwH\98.})Ռૐ/}$C{ 0vˊsp N݆yufU3%U[,ocz^PSG;5v)K(Q=)8pSbݷ ̜7m7mO.HJ$ 9dm{J$3>ldv)clzF#`zf с9</}dDC QyCC8ې=IuLVCrcSo3ڨQPT-yy 1^fJ%(eeLpdFAVYmW_iUjru|udUZT#l>odHWW lIi\wXcD(~*퐜Vmrx| Ѫu vʾR#d/8&K]q B@IJJ2%-](cD:Դh7LՖZ¯rw&@7uXQqio @ ;+Nf9q8?S nd mo\nz^4*:Qa-ډV071D\p8EnQJLsj!+lP!͉?)zKjcCe/ҳn)IL|ʴ )0Z}:MN^&/Bh[&{OU_ue¤x##qfASH _c4IurB5/}+9%ɒ aD ݪf,(qE ? ,M!np:]JzҊHTNzׁfy 3tz总RWiSv@D3I˩RF x^K9{_C* gFi&NiDXsKt-}3=xkÿ~rO޾n=C*?f)1\I"KЙr!7%@שzK9w [*;b-hO5xx##JUIRY(۩tcZl6i+q?kD#]9ňF%IU)TOMKA vэh|:KD:i 烪] rPthDL`uΎHo~P(Uښם22ƭaC mL؞*gG*ULzܠy RZ#;B/жץ`V6{O=RQaXѵ!ۥD52k3\jfRNǫA4 ! FWz@1pu3GU4qht =S F :XViBttn9ЍqNA4M&<0l(\B ?TWy 5ɡ~k{x _A!5ɡ~@c`mW}Jگ " H  + ?# u[=ɖ!jkT^C~7 X uAP_G4Jc#.pa3#xaۼ /?,~, 8rvb;ra'ӖxGOϧWgVUqnee~avh)^_v>yĤ?$ިŧʇ( l!=#$egz.nC?+.c7 ğntg5\R8(dgĥbqi輕k^^R(2ӯx W7* :w.K_[89Wf`f"v! %*nDZ믽#9(qUk໳ -NJ{2lPxi.2ڏ1l&}+`P_7I/ҙz6{yfX)Ȏ9rK;L%C'Iq%Pw)(%}plFc~o:dB c|y]+c:0)܃?vH% ?ρn0M~SePTLhsSpHG1@dhA}d@ c;E%mYǡ3i$,!hx3m1DFWÐC7K8P?n(o d/SY@qDbS]AG6ܐv1(+8U Ɛ C8)eVZExNx2JFkT5_%j:W}קd/@t~QA C~O7Lo+Wz9LqGlq&v?0{ʨ+;>&'PW*3EcLJOh ѝ=Ck [0cToR m~2Z@AFϟRZQ8k?&{\(w& TLߔ0+;nӥ" -hO5?#xA/ =~T!i`5Yg(;>BSX?ÀKp"J^  P_WdjETfDi'fb r3^4VJLTe404fhmRHV.[Z*W>GErhz#ӗ+fj(TA{_ B 2Ԡ*2QLz_:U1'N+ӖPV*+ H" H  aC]A-h" HCkPal+ؾt% WAP_AA}EAu#]SVcj-=(RVJP+WR{+r݈ޱW mF1z(jT+uryTA#Y z߻O4++ܑQ˭W20(/? s}%ݿPipc'D^nu/em~+*[gR]i%'gpz+O>M2,euJo em5Ņ7C#;H&$125Ʃɪݍ򔽮x׭~:}|NǿҸbIfbj_w .㎁I$E>Mw9w?D|JhLe@ a8F̃ܵ1d.-s51?Jg| h`%fED 5Ti\c e8W'Ψ:x5V +E&q 3_ww.[pV^y6jM]yo4A}3L$|7ǮD̆fHϞd>;%ҵ{T#Wb.SP~c0M AJ []㟩cuf1^  VMK#P 95$Lc#g-yW2;( CJ'//a;_]rr6ywOJ]Y3L}tr Xdn-YX!9ёbJ RÝ}OƇ^wpv6jͶp ^J[nSǒ`[a/̔tZ9 rn9Q‚xvDŃڴؼWHp`ЀZZq+2C]Ie%GYg_fY﵄DU輓8vX.~QY q?1 0<ɥ7*D]k,#Lj+#>CH,jIX6E '7xy0 ތ \xxLFK/6lo,Ul gVUm5qꖗ]t?`LvPݫrs`S}ghC 溿|ojO,#k29U6sq9dg%bq o1y^"&5Iy/gӔ5W.T=7øM^fE ;w $aPD)Ͼc%ߪdz"Jջ ;|` Ѝ&fV~nog)gf1B=?"qDEbޒNSY[}BYti-+Ip3}o]K sodLdDjqJnJ~$Ą:R[݌Zv\4Om /.\z0 ~R,;>49w uiDDX^]Zhy;ok.T㕆d 뢯̃{PĖ֎P}܃Agi&>-$.ې_!cƪ -N` {_SMiWi:Uu]YV]ts I 4-VEfy2 [dDb#X՟XvڲD X{ҪNu#?&6}]ujh&a ɋ\~k:dB c|y]陳GK M)-+Pi)-0_Jv-2pɃ:Y*3weTF%NJR2J8rz9IΝP.pDgFE=,"O4Z81F@WrOe֋ Ds- M@cƈB4abV/4ݸ-g %'CŐqMPV]@^ƥAT鍪/.)9zMy|+)M3(@z(DWJP4ܿPuoT]k2]jrсui-vjѓ-'9&#) ĠUb5&qcjFb̞nyw,}Iq;qq=WlB ;F[;3a&=h"lVyHN'xWߒCwL(<@I1cȇ,ON$l|{%2s]^VOgKAখS=[/#!Ao8&ҺB ~ٻ >/]Tw&6ERi_*Xc̠.:bsYp#W"?f<涏='tD m'WS>75\:/` c 9|'EOYZ`Iml^|ɘ X4ךS nd mo>fL\^QW4G0қ 6Vs4'yQDYYrs["~N b§3Vw4 o&؍]Kf[^M]jg$jG.'ճ+'ż7eUD"-~\=eT}Օ ftJ\uR$LdG:ֹ G:P_ŅN r5k(/KMNz\4$o"$~Mc}[J(xv 0X-w:L#!eM4+TI=rVZMȤkF]m$j|ǖӷ;?ETK82Rބ%YG&ZjV*G<{vIn|bvpNՕIΫ{j}kU4}gP2VlCo',0m%ͯ8܃&kpWw6vw{c"H>9U{˰ҊHTNz#1uN=,+2n|ՏCo addޘwV.J_eH Qi'ADTɂ<^jGQ(Wsk:&s&1_Jޛ.iRl pT[ȮpDּJxEӬvd DJmP@``u Abdjи^'DTh|av; t_}g^S} vU^$4uRƃ+Bԕ5zٽľwe^:pyx+jtgߜIvZeWNs4/ڧn,w XαWq>KiGiQU};Gխ25k&zTEYF^,P_Wժ }}AT | ONh*+[%ΞRpp>ڕ U)[R۠1tlA\/+2i]7E"zwX\#kJ$ev#F(̤^gJ1hh貿5ᩚ#3\jfRNRÌNjZ9tۿiy7ٞ*'@F]M?'Pȋ쮪RiՈF^e7R(9C{B׋^/;|*7Q] vMt?6{(QʚBtWdjETfDw4;꣎>t]l/UYgVUz5b65٣ .^ (4&w yL{l}4t_Pϸq"D:'Wl(V*C${wi➠0qntD-]3t[`>5g`"2H(atai=NZh}" < ë]F' uFXl_A  iOkA~EAKKtU?C[@RiRt^rWAdyEv᭯?ƍ  ,ȨLv]Z@}EA*JF,q7+ 2 y " R.URhhP(@ösg~mS'X24Tެ1c ;K}&RGuqB_ %ذʙػ[ywn#r7㋓qqg~Gw:%PF5u6|⇙y^PwA . @QO r7POqE$_n7LzN׆'m43O-KJ$ 9p'!m2jQ^>wxQ:3DDh~]wmjฬ}8/=),?1"a`nT*<cJ JynE\/)MGk_[89Wf`f"g^Z]sǞͷg^2QuXQa/ -#7~Qagn܎Ie^̰̄oL3Kӡ>qAH`HS@X-c|aE۬IK+'D6;Ҋ !ٙ@7'-n\¥7_Iy^ &َwj6yWkdczlx^{е\LgDF\--͐!ٷm44u€sW<4P%eBXfc;"2܇5.ܮ_ӞhI'ۃ_A(>9}KNOgd (z]PG :\cwo.iV7:Z3_&[h`{ @+^\\̜fρ?{Kܫpnt!*.Q3顛%sP(;5U/pv\l=oVտ)P_AX]2¦$sG'4iw{\#xvhp]xτw r-ДqZЩxUޥ Ւ EIYr)+6R͖eKiDX} vS n"K/t #9CN8h[hA{6H ɋ4o4>~g2dwwF8TKe3t~,?68%NڲA:=AqWEu!B䨮Ae 44ȉqF޿\ˡJtvbi'*۵M T}#9Tvgr_VP+)nޙ mA@t jiJhɕD aa SxMa&D~1Enk*Ϊ;+lᗩ| geaBGʎ\&(qv<|B߈`A)P^CM(CA&xШ j Xwnn< 'd?F-^" ǚFc~Sl}uZiS8۰* cba7X%A5z <ARTj5s v::ݨ r5CC#[_[hܨ ?R lAkؐd Ȉbzh" HCkPa`"HFE+ 2,]ZB MRt^.0 2@Ֆ᭯?ƍ  ,h 2dw+ 2PT6B0dT^ 2,'C" H  .JgO乧*j7jS6=s͊>2D4ovr\} 4`E ne1Ƀ*}BRn5*MnY"w'F!jd, u[=R澹Q1l4naQp7DžY66ԥP_bv1~kwb8 _+Ӧ=Y\ |adA:eu ?'<7A~_@\zWl\`#/?,~, 8xfPA $125Ɖ+*s/ȒYa 1ey%-2'|ˏ LUdkCߚlN]V`2Hg&H? ,2;b=+NXlG#Nfz,"{D&M%'W.W۸w^洄DU輓8voN8|6юAӗ x/0k>y럮{%:,7X}s'ʺ;i5㧳&\bo8j:AAu{k rleDM`DAfjgO(71Jǧ RoU~(ț>#8 ș (~Yj~?ZɡEi:ⴉ6QE+xXz;#$1\Su@\AF:-J큲F $ѵ%6p~y {h'\sYkK6ԓ @#&bhvTR֬1Lҋ\B]Ye š:rnt8DR#4į^gCxl Lp~]ؒŸ́M ^y޸{/YMm䷶JNI{O!y3Ox !K ͉?)zKjcCe/WG^ _[\'kc:[<}OraXFڋ*nqk~{T b>9H7&ONh 4}nD#fQ\߄ %t3,7`9u(&96gfJ9?Qf#aEwiwxQhP}(OxnU]J}1G_-k6Rǯ8܃&kOH;/;WÝX/WO ?uL,%b5\%24K?!X4)8)Miyr= mf;ewDx~x&)FWߝ)!6d`.VeF斌m6tsĥYVu4.%weJ=T*QgHQ Е;#_.ՀNSOW2XEq R9P{yX;eG=U*OS4OAѴ)[S*mhwUzS*+ztyw4ȁ4@ƳzH"tVSXfER4k^WaK4N~ CaiB 8/Ш5эNN AO1)TcHtȧ.拱1szԼfA}EAAAWAdQio׾>,?N`Ӎ  ---׮]344o}mQq" ȟ\pjK1xZaCZAz0r/ _A!5m0Bam#2B^گ ti Nn67Kҽ{ Ȁ֟YF}EAhdd4 d2ݻwjAPT*F!Jjܨ 2,'C" H  .JX RJ@|/*ʦηLso[S߮)1ps5C䅣~sPsz}Xy b 1~F~g^LOs֫2` NCɟB2$ Cn %l6G EKS, GICR~uСL1 [0c- GeDnCA0g"?n(Aዕ-94'pJ7ƇnM( {1_݉>Lu-Y"mLStDS]>zE ;w $auzG:2š?FHV$,MSք[l,^R#T 7y)w#r9`{(Z!8#2n_N]f!^<>}yk̚㓄Wv EE=PyCZuȐ^H3)ui럑|f_ v-ɕ_|zτ=>0wz48ڒu'ܪL:HK/姁8TۗW R[dr,ɹQ8 [ {ŘG@Ku' Ec#6%pN}:d\?YW_֪<]m4A1M/]fKffepoOqGįfܙwJ$pX^Dqm>- x8Xg$q_֣HA'9CٻɖoD!\&jAOB i^ax_U,%=k/&O: k$IVt:#8=yuh11IL* Օ鯩ɤżNm1WZTQ 3myAy y?.+O nr 9eCmïU7kG1/CC+c-6fXvZqytv}qܤb/"4}<D˟5&xHDGD䘕S nd mon-9>ϭ{ ӠthDM Q@>SA xiD!fgNɐTPܻpGh<_ N>qI/|uH0ET]nq0=< Iz\' (²"vHPw9CgD7,Sk6__ZI׮}O}zŴ p=C7_FpW @ ړ * a5(NA7L*vܲ;BAcgw|u1a{T%׳LzChtƭaC mf딭HmP}lGD:{J5jW*/JkQ=%weJ=y,*x*921;AA/El5*CL]QhLfmN*b LJэ{'+3u`K׻AF3@w6 3e72iX$_ :U0hnϼ Xş<ţ<~mƹ3Uӷ1 jWn$śwCLm(<_BQ/`M,b0VV†ݨ\]s+Asr3i$ؾqѬbH=lK.{zߒ ?,!14͂stۤDϰܥC_9d-Bˋ(MvIu:drtV6ӧf&kjRyFqe"Ì_ח5m޹Cyqݩh!IXzR\XO?\{%%iLIA&iR-?- (ORvAB&C\A_ڤ|-"}X zqU,(;ն6ܺ76GSV-UGQ--?d2+> m%ݼp#Z?l(g.FrѦE2}kҧs騌E:$pD|+V1fʭby@II 8?Gon5y [_u87JkJԩ>4KCn}aQn{Ȯ*<7 cz6\IufB_]N#e7./5Khqb6d&È]_ [fK̘vKo3{$kZR [nFݽ K׬o9'AnBY_&N-TZ<~-/~z{UG< Rhy/~(̳ XC_yk>t5iAyb{C9i.j^lIbqeƟλ_JS4/,rQQ,3B,}8~ø GǦv"9t~^90bK ( -#~5f:Π"T&p4pzT$!ABdY8\M#eept#Hm7Y 8HEp)T6VNRjc `X) `<-։CD+F4ں(JҭyӀ-`A_G.\\!H!p kd)8ey>A!Oٸ !CfӔR_ʯ ӟCwH`a]]˦N3z|{!H Q~?2m;p-AbEعs(XYgXkpap9l6Tǎuth5Wp% _&suZm^(zX|EӮsXمWυBIENDB`PKdz=@-Pictures/100000000000027B000001F109571736.pngPNG  IHDR{IDATx@?ϐ!CLPP@ Ȇ^;(uDoB(F&uofKyoa]RPASHQl~gj:>L9;>y<:A0A" 9@EAs  栯 \iQ4ڮ.^ޡw X[eX̻W1}qA!ՎKԟ}v˗L;++!K3oQ#GޭQqA'X^*gb<<<\q/\pɃ&'7c}dggR9*. 245]޸rHk_2ePs _ONxfT\AĬt+ƌ$&&؝# WPFˋ'ɈRL.wA1+]]yy?h>,Pwv-ʭ;8Y_~Gݺ%|-H_-C S?m1!1*. b>:ujD`:W*p>]0UuĶD/(;n߭_8%#IK2'|yeww;lZqjR, E ^vXl;gZMkZ lׯ[Ibs[EA~3]8yĉܪT"26_5}4}vR׬ Q OǺn+2}F\"DnUDZbמ=.e߉,ԉI-^}]A{DrƬ2ct8OSƨKeCKz˳W;a {JŅ /~U1Q[iA]qߋVCnɰ#4}ƌƄ?sq¿͕Ym_)?~ϟ|QAsbC ]ו_4 zq醟Heh|{ZAwZm'",IU]}ok˸7F$2ESֳLqY$D"(+kʍh疞9i@v#rGs3= ^ S<ŅtaHq T_|)[EAn... ÚaM\Ikɴ&J$R{߸6;/|~^}fғM[ ;-[iWUkod;g:=6,3uMQ_MCOb 3dt4]V#FÈ.;b{?U;kی 3+?*I] RVaAmPo㙑JrKց<'y|z%]HX%t7؄F?fP_Yw3Hhv Bފm\6wPPi0_t>8[6 .^O8VUzz547">R5߻G_&-*ihuaFA>nGvQzH<~(n?av`pE{O}ědi$c? 9AKtByqxGJ-+=֓"f95bJajZ"#G9 zo}\k fΚ4{+oӛ@[SYji=JuxϧQQPt>||$68D%I!N-[+ĻQΪJ9 PA0f>\V8m6-mX/ #dzAQ>T[kBWJ\4 ǮS'z]=VH ^5gUoA3n;;jw4(- `F/x!%0)cMOS#L5Vbӵ#`>`mu| Ge|$~;l\621a.^`ΈΪ{Kl#fkL ).[-)L$:MO1 I2VyDnVnޣ6cN(W-u5ց.(a 7Yl[qh^.ʼpPKr081iީSf5xYh(hoDʾ58eJۉvElאlD7NO{pz5U8Q{`w"nV*)4|" >C_':Җyٞ;*}_FE&RS҈c +)|^3VzՕ cBWݗ>#(n1,N֕y0!%*y-|҅RmASt$e$wv_:ll-QZZԹ']+G:s*W7w={܏1 MerALڲuɏ'5_]镹E1XdtB-QH*X'O7,r9ROD²kN3ŎMGc. d$dGO1`XE_ǵ KOY݆+Ӣh^ '[EJ}mKC7lA3lmq=yx ˵#>S7-kx<7ϰwϺSSmmO7K _aofo6Rnf-QNQFIZ@YYu_'[7Rl@";s4]ٮ$' &my:٠ TY*Kb۱{NJ_rZ|LZ xuk;FMS7(  Vc?ofY% Ms"f[[ߑ8w&?DnoXe普55( rKPsDnG}1^b3zW^ٳ {K &fax? bV/yɴ>|?Y9i `$;;O:^[[qbxz:S} +++a^^.F[~[v>Gpjxxp]\FQ㮬{" C-N6;c奺|YTjMwP.,[Y(&MSGGT\Ad zFuTWWV=r o?!_-k<>c^K]7. !^g*@lV_ܬ@(_wRרϥ., =Kal7vƗDp'\~.dz[dl1IL!]bA[ǔcj#k4 WylΗ/jꦴ'(͕*y\ޱܾyx!Oem9/ mǫ[fW}K,^?xw(ǧe%X!z2JX*%8uguA˓;GF=^o"<`d)?- K<29y WOU+q;{ӭ)n%o$:jC{;D~j ͽԌd*ԧ6gу/i:X:CeTf5/uA^!Gf[1ˌ̔<ϋӂ=K?zO0# 3E1_ rbJq)^N7ய@P}&ΩSfSV¨Z꓎Ǹ<ٳ9j`P٭%KV5`fʪՂ &T]Apn 6_[t]!0:a9=ר@D W K^}$ZSPkO5#<\qnPȀ4 zCm rUCfAd  9諸Cfp# c> bPqA" 9tן>U{mC|ס~X~f gD7.핋HC`rnZ Ad2@q.N7FDп$/q3]i7D4p6YN~Jz>}3cnͽ~S.ؐZ2_|# UCi۟>JYoPjtӋn`ɺi)Aa@ $.eaItV~ƛaa^wl?*gJsP^?-D }C7RM*d>Tx0x9&h2LNMK! ?)'F):?;J{r?Ji|RvTz'z.dz[dl1$mtM@%RGo~3"ru$6`6v\8)guabQW|eO'e;o9Th')U$-nClEfV$j؟C/9q!I#9b+= ]Nol崩By0^6tJ^wab?&{hH2劜9cv85=g ɺ_vݡ?,R VEMd {L{CaŅeq8?#˞g8Ϫ<+呑i+lwiܻW,~ͭ'x@_Bk'8^pJ˕T-dQRhiϖWnqo (UZ.oɖ'w ɥyE[c5 [+$o7yG41Вې%T-|*]M_X->%lh{^hwSOe +Wỷ}<7xH+JQR\~coU肄|g8{<149gEcy Yfqp^ ɰL污ip%CSkl%'1_t9dĞ{ iϽfEҲ#M>P_0xdqA FՕG5NS b} ]PYּ?>,E|+@rg\^ CUyBjt3Ibm%H[Kiju&ʮJI'nEs濚7$J (=Lx8GyĄ-KE;H*j<_=I[ څB3ԌKS RHlz:V Nʆya$Nke@v zGmknHں2+ Qӛ!^:0f$S&f:. 2V鯅H|[7w[y'28O<&@ On햾9(0vcn,R K w0{cHh=f.$&tʘ+,_D! uh mABxnsIvNgST}YXf'pcBgdy.vU6ή}[A7fIжc サo`ƵmȟZjdud`!1x]9 LKUyѕ3iyʼ9Mu!{+](sKJuza10m6л ,MVqEJ/o[JZA9 :37@'`;]U@`OA >!塼vkcj w$ɵbNдT(JO (gM0=; | 9%]v~§GV$ ueOBy@Ԓ]%&3Rq  -k!_A Dӹ+ ǜFFm5֜כM`PFUX1m X,wm W_EA 7HxWjBAˤ.2+/8 |- ;dV G - ;}qAlY%Ͷ2>d8bĈ^ nRuF'T\A|,r/*. T\AdЪ[[Z`7|;Ep=ǚM[O7|G<Ü1gL ͌9Ԇ rP a#mU{Ќe0Xq5}XKZgkM==1Ǵ&BDO 2x9|ǾYL 7N6 ч\G[՞qybu6i>=w|ռP ?^^ ܡ_;[Ev9 Ea|Ҷ6.L= JoFvXh/fɛtTzeI&u*ҏZ? + $+ݘ~\ib^ϘJ+m[oso=sf*_pU>9`uZ+DxХ>Dˌ=yI2-2퐮7ͺN{ϑ̑T䇤mK<&윿Δg nnqL>lnNC?w1uEϝxCpI~YKqu܂g+S7EƸՄ@m9/ mǫ[fW}K,^y\IXIB%%᱾m'V(28M3VygURqٓ<$PAA_7mXYYsvV tGYU82{+$VGemCCI+Te{DW=jWyzS:K%sxg[[/ҝkk뺗#nV4j⸳ynN)K#H&iS̶[$=g)<3.VY~Lj,Pa0۲X٤[:&;+5DmE5Z/k.( _8;GA71^c:o $dZn lAscIZX5adl P9 Dn }WnG!F΀Jy^˓&n=sF*ێl'&ic}dqa+Oig"oCj~mfN)@ƻ_\S",u-H-8\2+ @m(EtT=E}|Us~U["(\X7m]HόOm`QIYPJYEMTCj9_**c8..*5<:P^%;&vrGao{,;j?9/7Wd(&/1}bEDwUg ~;m{Ǹ{h $#I  YR;463˘Kݜ ,b2unXEFo4fOH?幷م2w>QgZܒ&֭׶;shjaJwѡ1/u#8e@'Ã&CzF뗄kfr}zdEO А)x:3h{:$I5Ꞝ"^S͑$n , 1պ8AR(=)4p5lapCa's0UʏQ@EmYˋ |͐*JK`ݒ<ϋӂ=Ki^1r#(%JZ g.⯥ @lUbq^=R:]>h%[0Ua(6e\ go1&^+n.E,%U7mGYH륺QjIlI1?^v9()^N֓e}X7O^~l!5_l1 -jJ5(OE(l~w4MyLݥ{Wbz-:ٵM"a*vJkš/.[HH䀢Z9=Lqd/-{]Iٔ-f,Yրu!àȞk\O7h1}(iQ淶3|aPrüc4*P080íl9}YםqCcB&eQZ8 pgXք+`.#Ta  T\A|twwz@oPqAsqI[[[CԲCOo:*. b>~|}w-Ap-_)EAsWqs̊DRE > Xf[YQhwNuww+ʭ[b" Q=66ƏSZvvv>|7A1<LJb !@R577 `2E %.ooA1|AA*. 2[^ԲlKW$KVӪbl(pӼ77mU<Ü'N7hϑCmD}~hm?tt3m8<) V8M%D>@"Ϫ6F‚mQ~]!"3Ex;x;*>uĤW~O駝0hn Eoo;V}Ыmɗ3S :qצ AZ+]^E}Xŧڪ{*s'G_U!zgpf4(;+0 ӚuW'A,h?*gJj?`}oQ4> T*ڤBK>GPQ(e,cW1vM1.Me'{}uYe Z0r+ˁvV-ߚH*=<zP{빏OiDxR\'2]fO]wKm$=mtM֝ Gwv{4dD&?$mKN_ u$6`6v\8_pU~ɓZ:-jCƢ8'xL}?_-m?oԐDw~3"ٜOHݘ^F^KDžp0E!_MxFso% s>m'2vqO5b]{t~;ĜEn}/Yqlر$JI^ne_.`{ESӉ1+"]{5WρZ.;e*9]QVxYC~ ?Z \-?.'w(L{XN[áe%(8g{O/D;NpdiϽfEҲ#M>P_0xdW啢"C<Ŷ(R295MϹo_]Ҿ:2WLcc5¬ssbEEij#ڎ2=HǠ-w6 6ȨJI'`̤•]Dx$Qۉ; m [GiA{lp̦ /LuCTK6sho3h\vAefY<ɪJ9\W3^!As-/yFVH 3i%kB 5:g{DW=jWyzS:@֝Q?L*k*`z=" vD<8\!pLxT>0Cm{6|-Z3[pZ)L0Xthu6ȁaygWh k-΢c%ÊlD\l;db='dvHx{ːXptw#6xy5ĜW!4; ĄNsEMiM2vַ;\hTxfvC͆m_{ne> ˭jN7-?unwղ6(;P3d<;~{̣ .] -vƆip;[8A}ZO)xkJDnJs!faUy;OM`ov@5,A0p-A>["ؗ brfQT!cIV.+(ӓl?نxd]x13WNNN2Zd~榄Mſs8s?K8,0{`} ֏L. ;dV G 'z8 / `tEADzel65˾s[Tnj|A1걱1~Ųý騸 x>>>,ְzJjnnh1DQqAd2)&K](*. b>,r/*. T\AdЪ[[Z`?Xnme8s9#TӑUbPƏ̫*~{dx{!6 A> (3F۪.~(}kQ*9e2"ĪO'C,7&Z'`~O 㚧G"Ϫ6F‚mQ]0}ĆZgHvÈ cBΑFwO7 "x_/ʋ =iڊUsy7v|[# ֘LkƀЂm+ 5]vr6MǾYL 3[CW^Kן~WyQR"k?)ng0"x{s!l1eo !9}a z裸 ;PEi%<|='?ss"g$ѻxKfv*b2rRMCKHH9ELbvmcge5_bdq"×9w-vM1.Me'{͘ź8$rrR@(_Ʒ?)-9}'} ݵ&6`T;4N,{ҟk5Ķ#ȽGR"WT4?Oj)4[2E?rӵ]^!ޕ!Pztڕ ෭x˹M3q|7 N,V8\3qF߻,U\`ӥޚ+\mhTeeգڻ/D;NpQW!,\7ß~tM~/r{lr)P_X->%lh{~qRBWGn3'xqX_,CLMAt[rY 3M1v3oM4; "6^~ZTI><"`̞% ⑨Oęf;ܜLWefYXnmUsLْSZ53M'#e}$Nc[dxm:qc(?H'ҢCv>5 !?vK DnX:yņ]fY1%3N4B2_[ ್!:+VUTp\T]N3s^n>>c( O$ZOO>2{d❒u6R \999Ylk-U%ϛr#]!l?z #}2qBKZAh $#I7$$*Sy2Nϵ#^XOLүPQ[)"_3X@-&=tZn}Rؑ`sLA8mUEW?ǟ2o$qS `aM"6}2EyQp6جw:77fsOH s7p/B8f 27`ݒ<ϋӂ=Ki^vn &hTO+j x-E90TG(^N7W>jz/ս)Bqd/-{]b)(o},Uf7y9ɢ6) þv|<ҽTv1Yŀ|hImbƽ^쥗JU7Eb{fw kUj7)03H?BBLl&6o.YRk6.0(gMl.ג!½{#m7x#*`9萣/1(jKE#27`9#T,iDA T\A1 6"?PO: *. bN:::NZ.7%e ; b*nY11[*82aSGA1˖Ul++w;,ΩnRuEEAǣzllkl<|po:*. b>x<e _)*EEAɤ(j(.qvI{ eз bPqACnmUj`H (3F۪.~(}kQ*9e2"": ,{ҟkkh̀պ59rČպR aL9FYY/6Ey|잴Umōf{୑Y\Y@l4-|#4տ#.hoǤ`}̱v[!ۛf_.ȮKܖlNRda>~yxyy I;sa+HPz WsmkSܣ^I١${l狅6|t-ܕyRM|z5p"2Ϧ< ].o ?c`t_bdQ@$\z GzlЉݡtm,u nEʏh~BTS{D-@QB; 4ùtȨzlVj'ʷM2^18VV{)-WVRyEIIxȞZm'V(27 N,V8\3qF櫹KbIڳũ"cjBږdކ,jSmC9BY-nև?"@ S/1Rqw*rA>ڐ=GܮR3*ԭz$L>w}ؙvjܔ? ^'$.?F7?0ĖG#)P$mٶ8`4Øyk' *H[KjtH*|̡ KCӮynN)K#HyNڔVD,T #Ly[ 2t]īmF2(*V7fx<_?ږeeӓ9ռB򤉣ۯ~k3UGcY@JMVQ G D-hHض-w]M'@0sq= `O!)H#pQٱ 6 2pD 0 \9Nة6eċ_EŽOoO;vqyZ !mn7ZI<&mH:@ .XuøDZ2*2S% jlh<}ֶK.YRx5% ۾41;8nᅶ Ǎ ̓z2!-:4`Ӫ^S },ApQq 97j_)} `BZcu-.޸D$g֤~q /[vpvfJlZTH^s,H rK DnX:yņ]f0zY.ħ-:cmsgexݤrq F1&g #}2qBX8=1H> I.ɨ ԯ$2Nϵ ^<А)h \kvT%Dٶ,{+](s꣒?"-)jwSEf5-hb2( 3sI>?頻xWEl*CL(?GejvI^YO4]bqPK4J [ Iۢ`c1yPagt&Oͱד(*aSEȄj?Zoيۡ7A1O?}P[a>kᾊ 8 / `X" 9諸Cfppc 0a  wz8g_82nn.#D"H]5.aT\ @TUf$DA jYW\HƂH0?/(kL?D_Kkj@j%/ BTB]1Af`3 ÌBϺt>99r0dhD3fG˳W;C^l#gϝ/-gb0 f9xfW}}}hzZڣw>=,3$q;;3``0̤T={g/eo/PdxW.Suoj[)Es?By4`0 R\ɊB( Zm>5qBs[n$hhi{m;2uUCDa`0ÀFJoNj *ߖJ#?Y;lff$sTMS'nWZ`Ź,Κe}cWu滞~XoO0 fh%*||W֣+ G9^8J4֝8y|ѓߪRk:Ȓn UYV}hXU\>-fLfxolդ3gʏ{9t׮[Ktd?q3o)Yx Kr]hKATVte+7UX]Wuߤ]𮓾Н]<݃?.I_تo½F #m3ỏ &m>R*ͬA?h5s' -X$kfrtf2*_=sU; c6A ).#THm7Vwl}5yd|K.YN x{UN P;?WC=?q3ײ[谜6ڇ7ӳ I΅Qo-9BFna>=h..8JGbp5&)S!]U+m޷s?>h]Oi9kYO}%Gr_~BϮ*]2d|S'k:f]%[vC7g y<5.8B2V:PṤq3,An*y7(aڣO{a*m~CNhʡ!G#bٴ\ Ѕ/B5+agեP URHR GBΠeބ~8 g${wFHJ"5/~VvBNXzu:"nRqd^O(+ٓPHQPL<O:ZA{BNП\S?ؼl - F `_Z #kNteK87!V}y[׆ythȎábaQFlnX)nT#nоc,U\]\ZNV-UoU0#y*AV{2`Qü!t՝{j=xԍE>w4G^) Ay:I1tߔڎwXah[o[ӦQh+cfO9?.2lXo{s/n L1tDES ݷ-hűI;~xp&+Q kn{)ͽӫncbq}2 HQ_U{ah>OE6y`X*Xl~quW:|-BFl_n_hH}MduvXc>*@FaJZǕEAwksn=hRA+QHcxNs=/I1$Q\:\yC]"T M~(20RPKql.Ce21> }דIU&J]2)b\qV8x}7eqZbLƇUQs-i`鞃 ^g7Z%c;5uwa̞!,M!rrye=~T(}8%6zG^NKqFuGšŅOFZKaӠN_ )ګy۪Doyb8cwHӻ~=:a]7Qơ_ ǸI&!Vhf$kr|o֨OˬϴZVa݈F.~cϗu6vC Ч]AϹȮծ&bDkߔWE76&,O&VKù.mpQL9 i d sM{sg=ced%ӈ#xH.ˌWR+!xWk(h܉WBMc˼bZeWԖׂJ?ɥq2YR3tcԣ>b .\2eo!4H*8劯;'ˢ3sR I(LpM_JS|5JkMw]F EX fS\ !ƸZ%륭UW$mes&SŠShXk<ʰ6$ݣ#OK[kouT:Rʮlh%`"෡uTKc;Sذ'2e$Bk:?!,߼ދenyXT\(IM?y>O=rnt _HwxI~Ԅͳrὂ;eH$[jjE,GyAA[ǙWO w0"EOlK,Qcd)dіo 71AhG4.OV⼤$UQ;iՂ{X%(M&⿦ՎJcYVv͍ΞNRr(fU)d-ڮpjN"FiaK.5P-]4x] Yz<%]!.qҒ"sw8K,=YJkԉ“MVid|۹Y̛W2c#~F+70⒴1.;2ʤ>~x"Lr֖t]lɪ?=}j킥lPRɽ'Zhx_?*nAittLiy[.OJ6_Pv`S뛈;Y>(y"((mvδ]b])燵c>1շ{̹^7e~OC-3 a|`-%g8|"7HP&8`2joZ~?:hw7-rd)B# b*$b0qPVQ#󳹼Eώ SS~ٺeࢮz^ 6`7&u:kTK<꓍C$̛EWmv(%{ [Z=꤯0 ϮX0aOd䙦˜*BGI޵Bt1> ZKr =^tUi |k#'0JWڗQ\>BdM  u/dCc0S}\"Eq #"ti+LۢT@Lk+;] +REM63S?|cjPhVZP(j*r J)!OTsM5l)Be1tAQʗw(P0hy*5~2Y/2{#?eMrƘW閩H uA=J!<ԇ'Įe;+S:d0,Rp4Vvf8>\V 5PHZ,&F*dBZWCfQ<&b1)サ5Xxqʘj]%(6qSL$$ۚe]]qƯ +Fم`~Ԟmm>Q;lB({5wtqt@gbng,{g`0)B _;;q48c{7V( Q#b0 fR!H..ӟ/uϜ9?ȫ6+.`& 8g}{L*5$d [z$1pc0)PԍF35 vyB1.`vd.u`S#c\ ˯T;3 ؂f|>l6n+.`&Flg@$ 1cƽw5W;r/63ΗM7V\ L66,2d]jiŲ w+->`0Rw @7e/_ow42kIGSN~хtqh+.`&$BQ(pr_mH+we;2u~|Ê`0F#uj *ߖ#'F0d;d7<`Oӧ&̩Ri7NVq;tWDW7,{z`$ 1#=J(UJs*G#W*Wsqh;qx'UtQ!%Q)5UYؿ\]d|{jR]1EY|[~P]ޗU3ė? |9݄U~?.-9%ɝ `F R\Go@٭D10Tj>?Ȝů]L7WŸ;kh9?^\?O0͝K3ǨJ^;LK Zb}װrv6UUPSA1( R94shD7v<ЗK2P7>R!Z)KQ GKBV^KW;~w3/2B\vdPq-Z-恝wNXFAQE<6H޻C#4qR;13I0혰?)=M+Hƭ\Z-I_ i}u x9Fkܡ|Zk{>Gc+._LLG +6S˚qv2N KCu-@[{s\MQ@qbZtt,ȅ>Ő`Ѡ fTF0Wnm;o[^cv.+UMKA9W.6ך@S{WtgL(4dʿT¨p9ܣUm1rx&!nj6B KNP]hJfmwWP":;TW9+4z6_Ҵ,\˞tGYj9Y#Դ9o@r&gN pOqᅠ꤮Sᑙ+ ZLJ#';}Pe⓷+ %Cc72݉X;+Z7,y*(8r/d6qsNx;H<$ݗy{w.i|/㧛Q>4M#\[QImU0Uݨ $mb?O]0Mc3) P7Uqz(<`֧[[Y8j$$$*D!!e1nL\ !Bq{:[ s켯έZM3=ˮޚQOܳg<ϲ!:1D_$7`#**WPr)[j%+?+%MU;gږCBlܠNnk_񝭏e &$F٫T;ӗ38F185Aur7kIDyNe }߾%K{waǙ@c+vBPz61`0ID"Ly/ױcjO?s w l(92Tqa2i ss- W =1̔bCF̙̈́I; <`0IS}s߼.pc0)`0w:;r~`A[<ьχ- ``0dhD3fG˳W; /63ΗM7V\ L66,2<]jiŲ w+->`0Rw @7e/_owd\ѭӢ}t!]܇<G`0I).dEP F60\p[-74w=fJ g>Lݪe"߰b0 a@Hrl}jZ0ʷjsGv@xz4=}jɜ*v 7\OΌ67,{z\a0̽hQBRWqe=pT'Dc݉={* ,JЯq`Ž(Ν{XbRlzOvd%F;=8zҒS|q\EY|˯`b8OԶo|n%qɦZWG-~}ddܣ*u\m(ƝXMĊ{Q*UHh86}MBҋweT*`ܷ*`8zV?a|a0 *CC=F|ic } *_) *ux~KPj+ f֮.GeBQGBΠ|Vc`}XЀÙRXPLboɓJ՞;Xpye9 3V?eN٬b+ŹgAAJ_{("CRM|1-23 %wWl q8T\RhyAUo| 3Ƚ-MGz}ܬl }R. /G;&OJp`Qe"բ[yv۩sNۖWؤ $*ս`.s%GE]:ۯ(OZT=X#}GOs'V[!8(xġ>y#g+V*|$ٙ{k+?@FYiŵÄSQˍEa;KI䡎OUc)(};r -$jvz ˩Ix&oNśYO6 ijQt:zL9 ت ОOe,%!67GPu]hjXS0C@ĵC⩍q*KK[Y7?H2M~AZ ?7l MLd*jؐtCH<ǸSsT˾%oˮuk])4&%% ҎIxt"LjKM[75sBX@qWX%uǝGv.PYٳEK@hƒ^agZ֖t]lɪ?=}j킥lPRɽ'8}AM[&}\5E\{"3DjEp<$7܈WeKuCOiVUV8Zx"YPjj +,kY厌 񜣒t_)9;BF*-=%KKVGgǟȈ?f 3(G7Y5f=@Se]b0  *Fsrw&[_C=u,s9TP1gdޟdAt8/a*s>+ 5!(LYhhw$7߬5Qj8K~ҾV =Wֈ[E7A7L_/m֛KSR~`Bш{sגr +yRY 3.`} Ngv s캻@f>bLC Oj`əğ=6WvjU}v+ ȱi6Cq1*Sa. 岹|&: )Wʵ;wO^-QBܳ *,/>HSO6CZ&ՃXjMwSk82)T];EeSt:B.wnѾ_P#3 (ZJYyقV.\ 2-rk A[ZZ_ |aiw0 >o;>yJflG#merrg^=/3HF(:U8LQQ\>B] ʭ5W>[$H.9pdh-is~?:+yKP2.ZW~vYFU4L$,WZ7e~iqt(wCZ[v{E*unl x}벒VK:lCrǂ`D>08M@:PS?YRw,K tkiM>Lp_mƉ4d>:f4v^,ۮ>Ղz*l. 1RKs]PiPX eevcM1D-S%. vji~LD=Cw ;4lˑԒ&QQ`0(4{_/u@-sR~q}.( ˑ4ڈ5wsoY6׬v3 3i`Ř1d[s \\8Ζ\xuݴ{~`Xq1:sfFhY.  Xq1 3yh >ԣ&Ӏ`0IOOϏ?haa[|Gz <3WIL)tc\ `&}s߼.pc0)`0GTT- p?9Ve2پ}<"V\ LOp+noo~;+.`&6I\.okkh-b`0ARi4Q\.b`0P#b`0 f2`0JѡPcğ[*=kTBRw$*^sveLh}\G;y`eȟRu9uMI\<Ǚa|}`0F\sJEua>oR]qda]巽f+-x/RgPeVI yŁ 񑅰.+Ƈ4YC%S@㳎nW;FZ:9:]5Y<[=[5.85s6^#M2zѡ1OؾU#'|KYqck`+~':!<8^;Ez|%FnPȕrG -J#E0&,Y F#"+gk5k+uW 1̢kjxC%#]Ph\(]OD_kq5ï6C.m PxN=o\EQ|v:7n3깝v{fKr}z8H-PRܪCۙΚ -T)P~0ggk'cA>WV>C-OWP%J.7<^l?JU4YʮA*7 . H(ݘJ0Y?LOOq퍇N[Qʣ]r&- YJCvgAABL;~w3/ Y,pthv0'kű$v\C\㫚Ub"Cdߋ_8tǍ|$qzpa0,3OljʻRCJִ0ƒKGEɴi9́vOvTV{D]p%n_oc pPV:JUk}حߠT`JrI@zHnmp_F{^ .>cF&L~'oЗ5kl~Ei}Һ^訧D -Vy0/%^V_^u8KgnO%)EI7/{-?vGRV* !!c/m`x{7ҹ.0V’i/T׬8+p*|mn5e([zǭAue׆Ǯx̖auHqx +-+'䳬䡃_s˽w_ǹI[Τ, Vvm9E'j[=a].p0keICCmr">~ i^G~\[Zb^gVx+.yi_3[,_᫺[f1fzںU(wqX窤á򎟈JP5>AKM߲+Ss $b]'(xB|?(y ~h+9WV\G=H6VZ璵Tdͷ` Z? AQRa8Ri6Ʈ"3DvJqTc_Д=>.%Ox_,nq ~6@Akxg}S++^+`0CqOHn3Z득Vں HBh=AΦ|e/=9\b܌uD!"m.aKpGЋ/KGAEEhMIIFHu5So;lvhO2io)oxDQ Fz滶oo9ڀ }Ld潊m8 6#D\k0@ZW7[0I^p)d-)|m\YERmE8ҍCuM>g`0ŹB?Czzv\ hĥ<ݚƍ4 tgsA!;,+9`Y`3:LJca J$tJ;Jz'X+WڴQi75VT4C"$h :|z/ꗹeb W DE1_qaKCaT3\1ON5ƚAc{YL6=ɅO3q[M.O ˮlh%`"tЦ6`d!T[ͪ> y<>mpxew_|U"d2n\rˆTl@ѪGt9oYH ]v0ն"Xys Tx`#J%q27 7mϸ@!KRy9 k)s BCŵ\CVpOkF5E\$ ll c>y'G>C3z&O0K9_ch0ņ=oRݪaēSEE^ťX[TIZ+tXp􋪉P>l?Liy[n)h/u<FXdc<źLG1KV+[>=lu[/rv@ jH($yu.0 h41ƶK20)N\e^f|e.UoS|E;$^s:dJ Ơ'lrJLF &`}Fmeʗw(PfI ga Bs;51/ \ & ?,WXz W38z/tdZP(j*yN ë@~*-0=1Zr-z/NAm)B``)LR,°M1 51*e(1K r\*tu 5FƊshc:Q>4"gǹqkJ{em$?-`08 z@Q]uŶmZ yHBa/ `0CE󡜠p01 Lzzz~G >܊ۣep=V\ LMSۋɃJ+n{u`S1.`0o^LEtzVpb0LQ|b0 f򈊪e0$R 'jL&۷[Ċ`0cs Lnoc`0f===L uXq1 3yPT6EXq1 3yaVe &&EI: 7!6GWLA -XzVe 9~bK*ɕ>/ jiywhz6_Ajs?Kʀ t]S&r&c7|vUK72㫂.*s}?FFI8gznK9Ӆ"M EI?/zoiz|;[S& [W6f]n{.+ ?R js_e\eͯ54g7*Fuog>6Ykt?(%^+zU|AbLV`p5!Qk*%슶tGÒ3 uFh6lь6ȣBFkApLg^vets>k&*cf"D~P)a}, ys~k7cqz \SG? 4H*A`BuK(%Rbd[%n$.]*e}vm.JhZXH${F^nZ~};s3sfޛ[ ˏs`O͉ H^9gYx%kD4mެ,̐9.-=-_Y%Q]D'ED̮s*߈&2ʐ]ayTP[pRd̴ӬD '>5*Fy3uhf{T:$()Y@+"_DCSꝙ -mK]hn軹UQ"PaO;ZY+醻T LF <4q (ڛ D(h0Rw bVLTU"^B1}Uv53w.;99zM2_]1Dl?~23䯗'ESFbUֹ /c2~Pwޓ'O}Eue~;]hude7f!e@ tzz`F [u=DZF͊@I.:vc e ܴlbGW}{Ѕd?%V1ބYgvF:մ9Dw9K^ K9|~𘏫ݓ/ JgAaf,5Wͺ{Y02]8ŮDf/̒^eMɥ*M ɅSi5ikb)OxxU蓽yuZjqį닗Ng>/G3}qQ^}CxV\O ('IUg6h{E套Y]lp$ Ԣ "+4:PƫLaJLը7_~RPXI  Jh-Fu9WЌ~(WsX|j7a7=ȪYitqv{bPgPvu[z[_y Fz%)R:$z1VB]# ,t_Nar螤: ];*X>c5Ї8~p(V/7^V0$O1 m>LZEBU*yey 57ܟ`gjdc v40V jl։.]0OȘX4wJ1(ß~R, Ey] :\/[j\W ^ 1Y\(3~q(:T\VX}V;ML%,}>+/;Yr7=T1V&JbDYu+Z7sjgyĵs7;ޕ})K\`pVIasq>;qBC!o_IDŎ`G?Ѯ(6Dq[3p|L/|ebwt&1'5D|'pz箰uT+< S 38'oxs/ӂq)BI2EZ-(|w@R`hN dѣ[>KcSN_Sy@k_o&69٦[X/~_ZAq|k0/t+h#mȩ`2VT9{"g[r$ij *"\sV4͎ςs_/-5ymHrU<:ĸ XuƷDi2 +=j8 Y@>>4-MuHcJƆyW=9 멖F.ѯ߿}#^&kvO8l95ruڄ8Ur"nDh׍mc՜|`Ԛ:!ݫm5h6 1D&0^CId;k! 1o<* {LKה42t$n$Cqc^sRӥ|J\ :$%wo eJkxR?bghv3%{'Bͺ1 B:+غXD,Q5]8cR#1;p&gef`l a7x1%Ir~|@ \ * gcn$+I~6hBnY";;FN>cV Dɺ`[ʾ<٩ z[;*OLKiHLxpWT9:9ȉgO?oUgCsnnE%Vc&vMwD (`Sdƚ5 L>?Gf" ;*[0-?Eѧ!2TnP9խw53ՠ1$71LK.όxH#"hTI84#E eFg1z(:+ GzbxXV9h7 8ew9W]/zR駸7HWF4H&cl3~. ;>ݻ>l9dɻD36F\x#,|!:;?8F\Lj צg 6 F\L%W^̎ aą@ }n)ml8O$ /bS(@ 8MO#ځL1)oh@ SG\\#Hѽl=dǎ10B dxNìYz;22_È @ B[~e"{zzˆ @ $"]]q!2ueq0/L0B dQ)d*3^=kt @;O+-HM~-ΣFD\_nqػn"<(UJ껻|߲8S-=|"=xC O=NtK2;/]аusVL{aMjJd;ַHwڻb2^@3ӀZqJde&#@'DaY)5if| OZiV"z?~di"N3@@qsvi~(WsX|j7a7=ȪY榺{Rں|@GkT> 7'8f{E套Y]lp8.HqXuN7I%Ffjhd!EZ,*F cb xxνfǬk|fu$zdeaG=ll@=YeR}^)sbZ=z )͖Y@?t@&0>eXwWe7A&yR2@vxKL0݈֯NM(q[a7};8bd<&7KkLӡMdٍȮ!4~Sz{-̟갡R@!:͡x8{o@)n[])+zOzaB .ZXn!FdKo &kx5]RVa tJpجqPOHp_{JhNc"X E $ V̻̊\Ny&CgHʷ.ȀO Q/IUlpiB 3جx }u`e db3T;ⶢr}K "쉺Uż_ L J,u]dNԒϼLn0a4u"WxӉbW @ݭKIcO<˙ktEJM>L 4KZ O5ˋcʥ98mw(N`Z3A:XZ>ᒟU箰uT+x!O KSЭ:Ele[Gƿm>vNE k.!--)GD/սڛ[,k]X)hjŦJ Q` Hv0RLP)HeiI& fVsh!oO4/-;Iy%=m9D=N%fyhyKS@xZ}8Dž@ H$mlt?K7dǎ10B dxNìYS;22_È @ B?8铏\.W #.@<O Lvvaą@ 1#0B 2 @ iE1ݯ"3="=]^o>貐? F$})K)qB<5%W:GTTsNq?`Imv^_ _Q*%j״/׮.dOLcaP3g+rkYfӻapQƗ &:&c]! ?h|՟_&GӚO&lʫh3w#4Tٙ:2`zRMPB4;?# N5s\t~\;$y 6_ w}Xy?ؾ&?l,ey\֙j.~]}s2u~0kiymTXn9 ¤ZXbd} FGWs_D~AG_@fi4c~C94`},='?>2fa frCGŪs_(wwJ.@)gho.sJ~u+C(тd/:  8f~^$SU9Grs }IŻ>0e0H^5}AA60~J,t.,NΉXVfT7G}rޚK#sfO݀}K MOܷ%q`_AMfmaxu]K"0acj; ^`Hߨ .:ng mn6~ȋku3{rFHn[DmwSTVt "IBDMl?>Lson")m IP:PawA6!vg愘O .~ ԺƟp`}&Gh]VZedY T敕p)ckf\OXΐ{E套 oIc n}g'S\ /D]UbjA<]-0 zJ@7?Itl: D}Ɂ>wձX 7 }?eTs_o,.l &*M ɅSi5ikb/ J˺WzWY;樒~;K5 L4(42SCC9_عluOw< T~^Cj\[h 3E{=_x@l#FӫrnR۟^nv˓Z m{C}AU&c]+H ?32oթ) rΡm͒w>w`#/ Z`q \5r>22{4?fՔor\`^ʹ$sYw6 WLgaݸ{Rotq{r,34iK7PgnN)WsI˶@r.q wo>}@x{= RV%Gǻ94bWf*~a(mJ.W_PIg{"#[vq|ɮKAb &5;,:+$ym٧>✦ o0wA$,.#7NvH7ҋ9lf(0>4Զ#GE%kma7h*` y r cbd\_}Fcy(Op@tɫE)ݽ{Q Q HcKYF ''=#FjTi)nCbgDYUMLōd?*UY-U׮)Mso()?MM.nV0m G^f(j%^+?d/MB1F,CLgwߔ^@ oBe_oIR P X`v9_]Yj^Rig'ߝ!-|Qa:8*(( Ivx`/A+^S_XW=|z/5ZVp>A\^%Nɺx2'jg^X NL e>WwgNvytb4XX`@鵡9a5b@lOZn%f"rY)z1aD i Gb䰑@-]C-u;ǭ Q±XWDq<$$z;ڽd7/ȔuA]Ke8y02;PK?'ʪ\:q?bK#ᢧݱƁ2Ldcz^ƓSFsfgA/y棇;**؂K=G|srI}&t` [_p_^ٓ*+lS2k\_炘"Xgw^>\_R.`aH p۶; x&R/gJnҽ9+e4{h{{{GN5Lexg.AyKSm߽[8NlHL[k ?8P)j&QdK4 PDbWRtu^&>Pws#tPqt1R L.ڵЍ.v󕖱1¢D3DGǀfЊbC?MgrЕ4ȚjADD?I?l|k#䕚;;E) H 17?ek~hOC>WPv(dY 31" sf;odd0Dlf5j t mI_a[R^Z*zqnRhIv!i[EA^G2'Dc5GQE"B;b߽調&ZCЎ!lmyKK.D\Wao쪍3"x./ĠwB=Њ-mKOCx%>׻4iFXmtWPyMݱt2WC4wPMXqnRA3VlI):v :bhm Zgh e @D>wAW@pI"Ū~ 1;ij7!J"ִ(DJij;K0T6$ӜDKv+0yEmcjؐ2B,U'E퉺A-ʵ @M"6-yA"-HlR2KC 'wlH8eu+mx*6I`D@XU{ޟpDXg\(Kpx"ѼKnQ$)TH] ª`VxBt;ȔH$]AB%V9 S0}:ݰgK7v{4=k =C6)}k9e*!$}-\sM!xRPHD"f0fw@Kљz4qXeͼ޼ I=HK8YBKyPyV$7G[ 0>q^4":L  ϻ2 Ko1!heHǖˀ$2ƒEH$g11ZVbO"W "sA2PʁBrPU=&A?/IWi1 ci:Em)|{¥y;OZvA] ;g]#.ctM}Ő @z[d1ׁDdLO0Z 2<Sq!2u5^G*h0lq!2 _zN̎ aą@ }n)ml8O$ /bS(@ 8MO#ځL1)oh@ SG\\#Hd~rjttT&;{F\Li5KUqGFFkqq!2uP({{oU8ryOO]q!2uxD\d7H:f28F\@q!2(UDW2qG^'l@ p6o+m]*՟ L{_}3l9'ΝϠ?xPʔ־Hvz.H>pF'p( 1fzA47BGy h>lO}Aߍ=3|?a?>?-?j֍GR.[̘ 骳#_5'oyUJ껻SXrNq?`IHs,ѿL,J(rZO46 o\^?sv R{*FlU}i6w0e||_3f,18~AܦOO[aDBߗ[TsQKh|՟_&GӚO&lʫhֺ'iBv9SY+~j{}ՈhLZ+ AG )x >h{U+ҝS[2xNGǵCz!,}g Lx{ϲ<.Li?WWzEm|}[ܾ9Q:|?tH|?MpY^4V[N`"3b,J7Aun hyL@'%R9 WogNQ:Yؿ791ON{3x^GtSoVjOu.C8 "6ͦΐ&`J/r{EOސ( FauaMl:V_3]*̍H!#WE@чa tKvx ơ3Je,zVUl^[ybdvRkeTŪs_8j#R)*n@LB4+s4?ssJD0:nxlZ/d0OMI͏${T 'h #8f~^$SU9)&5b`*H^5}AV~J,t.,NΉXVJEɯ]?r)'WWJn-\MX7/L&'ؿf[ےuڸS ~ۦpN=BM'`4G`Ft|5?z!LؘNǷ#x[?]8a,J59y_dI"^\yf_"Ԩmڻ)*+Nv¾Hq$"@S1ۏdOz1rպJER #!)JCN~Rq]: yi˴ ٵ.8 <6'|o`Hvt}n Dw̝E;͸,p|›-^JvƳ^Jd[,;Pڔt/1;_)n#6eEjNv\C"O 4Y/}`^VcֵO>a:# xy6<~p;Zg? k^7[~f?^=g)*U)o\H.JIN^]KQ*^fIw;_;qÑמ߻א:Z9e][r\`^ʹ$sYw6 WXQ,7E)yey 57ܟ`T/^F;u K5+W'_V-;- 2W)֐ J G=ll@mLsN˹Imr{UP-Oj9t'ַ%mWsvi 832oթ) rΡbAKL\5r>22{4?Qod:vߒ~Uջ+XOЉVUElRcDd"o6om F9^!'@LYr+辜mw#~kͼ.q wo>}@x{]l1Vv%Ffjh4okj6 7tORTbdn|ɮKAb &5;,:+$ǽ}9Z)e٧>✦ o0{wQ15Mq{ ' <`890ҋ9\\¬;͸Os%Q;B] 59' U[LI Qv7};8;UY-IDރ%@2hnLJWˀn)=Ni^F>Е\K)XTr-a\^~Wv0!j* Q+M~HȦ Szk@WxF4d4Jo)^X% ^J%|&D_ ( Hg4 fk͔1 q3a n6) p)ݽ{@08x۴hdReLDG{7v~R^#.ؠmHU vkr;r1S ]D{Mɨ< Eao ~g7e'v8hZ81/: :s\uhI憴kШPdV+*@} 3qꄈuZA=AnUGǏHiCHV`wH ~[n0\̚IpY+8/pߎƸlw w[TBzA0=LF!ZNMu25]RVa)K)ahei+ `2X}E[ZJP92O]2շQ}Rt&UڒϬgj bHʷ.ʁ!( (B٤dmG/eI`>DQΎ:Y*3UƐj0*`;O5!\%uLsfvtpLZ53 O|6|x3""P(Ɓy]dG&-"hˑT㇊1_Fv3iyMb\]sP1 q;*]OJSù'@R)к^`z/Y cjo .K|A]sh[URI~wٓpDvBQm(~~U8]]\J Bk' &kr'u']ћ3fk@94xvuQ"$VpMuZ[|"2XEjR|f9NSgQѽgʼP%@m3}qAz8Y&ɬ%yaUEtwJ '2AUz;[۳Y'Zj>RutXW -1+Uymmq֕9IaTj\V ^Lp:Q^Wv@TCZ/F8sut 020ߎb]aI $$hNA&z8LH$J[;캤q`new<$~NUunҁwXx0ɿO_oa$T<-O NKwRiҌF.i>iRtpo8/PV +$[Q-))L$O?w\'?ې :>˙ktEJMQk/|ebwt6 LLnNJ ["z{nH*(P\pbYCkˇK~ Y{x>n>Ot!{?p} i+o-n^pmr)ct?*[3p|AC$8 }^\o)8YHreqg(qR,`\Y:,r{.NL?in=,<%/|T:I=Wܲ@*Vv<0oiJMWsk\t=DR.`aC"iw*VyExl]Yϫ3<90 ME+o*v/EWweO9#wY![wX}%}-4:; Sf8) 5gbFNJA~uqdܥ =xt d39 L7Ќd[LGJ(%g9+! ͮ ރ-ؤձ%%k1"x./Ġw;yB>#,unbeX<;=N?S>RЉhRhѽ2Ȁw0EvGw7)O$Cǐ"BeOy mO4;+;Q+c|ToХYLF!ݫKm5ϢX2Xr!2v+zob1L7f`" vuT,`$HaD̄!<]uyc¢wA}gT񪲶tWPyMݱt2WC4wPMX0rQ,W7/ #9{3MLdg3bD>ݒPbJd_WZƦ3W!R\+x'sn~3d#4Cf)]SP8H@Bҷ)2@_"PJbõϕU2}=Qi; =5v:V uZ/Ȫ=fO8l"Q߶ic)(Ub)1U%%S(NZ'Nߦޱu@DtBU"1ԂDɩgJd0A1-Ax$3ė)0bZ`[T*ZNB:X:1f-H*ӵ&b&Lw {6-r 6MM8pZaq\ϐMJ9s@voNʀ̫|Uwꕇ{hpQ+NKљUX` o[cE)CJ[{0ԛ7!>' 6ci^0јj<XәHY 1X/`51e,DϾD2PʁBrP,Qu&d:^d3$b+tȓ'-\LhLtT|t7we'ӎ5 XC&-6Zno%_O0B O;891B<hzdPgO5`ą@ ԡ0:{iF~að `ą@ T2<<|U;;ݻ3;k0@ Sǫp~:hm?@g6оOus\@[4mR'xJ4h~\f:xAc 3f6hR΢mv^_ _[_<{t⾈N~ge9%L4ؖtw̳߻33Ag.aWj҃5C(\l6D36YbdA?Y} wԲ7sJ%/*L6+cyPz1 _QMǻZ2K/m~C???yšS1_qPWSA~|Qɥ@wI'Ѕ:CR%~d I]z8Qڅ$,۝}Ub5ܥHtaqRtN]9[Qe_ayk:/Uho.sWǮK&Wy NR^s4?=O5R؋d^Q%w%Qp)id4(zl7EeERN N!q,GQPZtkjDSwj>ɾ}榟]T$vL*H%"WA&7Tp U7,2qӒaJ^$)!=:*Hkr. |5?z!&lLM|[ND蹻#h29?*EYDa 4I[sIRC@x+Id0Oh-HFѨzJdd£?k<ĒBgGlK C#Pu0Y:53C!>"8.PNv %l&ߕ/Db:E5$뢗7=Wt웮(yJ@Y8*6D^41;Ը., vR~KΣ3rc J!8r.71ݳ͂9O+-*/̮n}K=d^\{/ټڬ=YeR}^)sb_@@.=g (Z}CPufA$w`KIQʛ$$|ɮKAb &5;,:+$䷋J襸{"NhMSfǛpGϤ[uis朗s䡾*Apu N d2 KD\Y )^Ds@t/}@x{B)Jeċ /+~&<4+ 21Ww6`M\-C 4 *ȋ6_C`Ԗp 5RV*ےvJQ[^^4.zvZJOK^ kt^+XL$w& <>2/9̙;1~TT;g=2EE_,S(M=|674}g-Y~> 0O:}7(+:D!ZӯWqO8`N:8k}~)b9QW d_zR{\zj$o{(Ņ~%&)s\PbrwJJ\]74.,FuW?C@j7V .HEk]^,]z?}qP풵"kpwLvŋ*0ғi]+,|=7'*{`eEtFuIOpKVW] AN$NQmsȧ玷h)ۅe猪R:1ywdUI_QSEÉ ]F@E[ ~ظfFifOFt#Y7be QXy xmHxnEOK߃4fvq08dʾ7ƃ_Tzs|x\3\t> kEk'{Y!Utd. 0F;l~X}/EqŢΑ'J 5?*TGuG:e9W뮏?$gŅYgR ʏjLbQVeEW$3 )@[fրp0(Pq'7ۚ_+y <fi[=岦[VX(Zֲ},? ~ M'Nt>jgI5됮/!.ܺ0iμ_4w 3-z<31:pO /;%e 'UK"V/yt>wLle!}>Zͼ$m"iT}=[7nRqS4<+H)|&^@nMҳfd^14 Lp:[ӨMחu/fKuqI!uE+]+ Tb\DocLsl :<}Toܻ8O:K=&l!IU[Npvy9ӹR buk}]SzbUok۟6b3~!1oBzM`&sVoeW>Qz vNj;+LobooP,GWJ:`)wGrKBcGۄN]V2݆ec#VG%e}%4=Y`ͫX{t.#g RУm*(\RJck>)nzmlƙ/NhvjJ`|xR3Bڤ6$ˎdY[O-!XlKG̯e5}5,FgCwo:yqHGILW?[,bG2N_7IFyxhq`Pڌ/ƼZ"2FIw.cw Xl Ơ" VI)z6AHϟ?Nm1 L+Wv|sK1qpƊqK`Om}dI>. LƊADu>UEzL@AB||=I66?3% S ( *. 'tۏ($ĚRܺu "2Yp8~~~L&~#"(ʎN}A 2P/aLpzjT\APqAd"ԊRD}YsztdwP]u|}mK%kگgOkX@X mIk|vloObzZ Q!m)=~gV^W®1'|,Tr[e{xeKz}|'Aj\Yڎ3Rٷ'VE7O#iTmJ*  Jiq!w8 ȃMPP(ZG&HÙw1usZ̐G|SٕUt8LoKO*Kc1`N>gV-yJCnj;[J`_)]U}JSjUNn_)AAM8!_ 4i/Z?&AU- KʓpRc7Ns&^BMi|2ERrSohV6GҊN 3#g?R'Cuq͆K|k4jo]_YF/Rt@fqkQ *C_SϽ7\H*Dl;JJqNRA?jܐ{}2(uKoZh%#20S\U{A6d>i/Bc}Ԙ"60.{Yt4Jm&G__2MaF'm} *:e>n=K}kOmguU^[UNpw}^M:,%&vn,KXQ){oqzNžjeI.o9v4Jl>\K9$c}j^bUC[NjثM*9o|իLNҩwni{E$k02wkHyCBsGflgD5MO.G$ϹX$]4"]e3nVf &{-F82x;9kK^/ R#}ꪼ?iCP4_fɾ3ªKoSWEU[vB()X*OZB@?O!`G<9cl}S|j 4kr=67nLQWHJA̩r^Ⱦ>ycv-e^RXѨ|rtghKzh,N]];b^QZ|r榖u ,wFpa/Ws_ I\( BRc)o:m&3"3Zq dU 6IӅ|y}$9Q&]ƚ9g&Jxآhmn?}͠2R;XUP% {mG'j7V A`⪿(f0ܪnƶ /{o9󴳻ݥz] L|f9:%x2?y xΛ#* ̠DݠƼq3Ź7l7_/LiR 4]RMu6{E)qCzd 'ҵ9&Y[2)tTUioB>Ɇҏh]} ĤHʱjNU>S -Q2S@5u5v >J'A7}HL{L7C#_rJ@J./TU6˰ylIxI6 XqU_c8oŘ l.Zӑ_,imVQ],ÍQW Aq JmݹaaY1ϱ펻H g7O-1B눤11  z8E i|zͫ zCMxzCb]\iI+.sW <;6͔92īR#@H񺹁Y 1vۋC:;oNid 't7A0=;WB/9Ю5ܨ,Ƙ32$16n)IO tU TbB,'A&1B$TLwG>_R R(nÞ$t)ɬmQ($ 7?6RzEBm$f뵛R1``BCO+*ƆdY~qEbS`Ġ^iM H!TheC?&on6lH(X LP% tnVb^nzmrCDflJV0"ڂ0$wVJƼ>irڱswq3?bqsKܔW_1bbǜ>⡽-+ gG,GA{f: 5 ^<Hh }˸^gC#=JFFQb!Nί8󣚄YqRB3Z Ɗo kՆ5H" EAAA&T\A& Z߫G&-ZÊ' ƻPq,?^T\dbMqu Qq,\ͽ.pƊqK`Om}}\Aw=+Ń:`"b =& d!>$I{q2irj``@P8Qq,<ޚ.2 &nL8ɼ)(ʎN}A 2P/իLpzjT\APqAd"@}056@wo?=ծaq\إA,=Fvw z5Z l zW|`OPJ%#XV-yJC0c!ǻBUҔZ>7IAd{,'S$ +7zW'S[&83lEssvMs.7ɻf-sRqNB j]:yz0ܪ@{#JyH-Ww]Z(ںUٽ͡O!,ߵϰ:}"Y[4ґx;ʹW+%V9q>gi[xa6:_OUo++9#zMD6uQTk'. STɀRMӪcl "՟,Q\2> Ⱦ># dGq@vkR;眮e@ /Jژg+H,U ⢵. j=Яs(c/^TAHBd>i ]ǽ]f%dʱBCy"n(ThIMRӚ*:ItbTic<ڭ~.w$Mt!9zC=0 2AN: ^V.W,Gv}I6T~EK &4[g@14DN j }`k`P?ާ;E"ܚ?'@~O== ;g:B߿om*^ߎNQ֐D71 o0O7ܸDNf\% K *L[kj/Q۔gp-Ftݸe (ΩM;7F7Mx% Br4^|ޓx"Ne@1h wZ?^ATIWT(Q$"' AeȍS.kZe4r!4KS!fK,{W|p٦+#SKb :4.:{Z3,]b^4e@yv rǽt}rG~6Oݑ-)q?,Fs&zoct-GԕBPܮ. LƊAA2DA3BIENDB`PKdz= layout-cacheM1KBqG*D(&D65" :-D{ksC7I7%p#kz{7\~=ws)=<%0 8 #ߢZq"ң8tlzW'Lp)(9 $^0F1SH)sMbaY\&QdkX۴e='Δ>dA#"]5@PBmgznvzJ4ߪؾ}q/)PK{{!PKdz= content.xmlْH.vdE FpOV֖3+dDuH$AtɒdzI&>7ЅLO/Wп$\">Kw߿?Ady&_>k4"(ُw6`M?MF")4):o/M& (I‘oM:~'y1kN/_SQc|mح3liݏ] QgâߜNӓi$O[קpO7d1X`giu";>|R2uEV4a.jp_{GÄj^Pwo'B?Nd';-zi,? c\(Yj2F5+-,nm'}ы,D?oɗn0izPxf,ZGECEK!F_; c~֏k) u<4sQXE eߋAQ cbk^$'%(*d2N/f d_> 'q(,ZAIv  YR1 i{p2fh/ᵪ[m}cwf]k4w|wNr)U$zb3=ݐw1G$j/8,/h+2 ^ʛt*:РvJ97Vh%IjY+Ө}c*{GavK< gn&(B$,vqSFn'/+ BD<%s懋×,:'H3Lč7ڗWsW;j}jU}hgC}Ye=#G88쳂y\q|f'Ky%AQ?M~/b&~\:_wӢ@aiɛK7zl/dw@3/>=^vG7}IGv&-0a !5%k(nuj5Эռj%=Нʡ_{sKw^C`-ڳS pw5КE=[N7&iΞH c| =vt^t7?3 \9Åug?oyg^?9϶`%S6EX^!\kw2ʞdnd7_!*$֎6܁퍰6šFɖfܷFMworgp^ZRhv0V:Aܫ;'57S/ny?ʚ_XZi&軙WUJy}awS[Vˉņ͔I0wm9Ng'sc˂oą l!h9皿,+>vvdwaﺲN\ɺݝ|lZ;/:WҭQ7M`.ܝ3k~7dG϶w?S<X'Z)H+LHXޛ-)y=W|}Ҟ;{>fEχq}y_򼷏FY~Z<>O'}lVJ|W< A!O|С}}#r5~Otv'n;_+bt/`m:A [G1SsllxG1?j/](..y{gC#>kվYb{g)&G(:3~OZm)&G>譾G|>譾GtԮbԬ#pV)>Ym/y_SvȐjCή{ZSPsp>U}~$fm{6 y 14WB="˕=B]6_&>5]ӛn>VDQv}^kN>}zdh{o5H۫][=jgVsl4c>ܭ~- ާ25gi5OZ~EW_ʾwPeykx ,{ oAU:kW#9;<5x5#}s;I{gknR{),_~;kOO im;M)nsY"~k,e;}O9Wf:jJeY=-\ځ^xw ם`"n5d? n|p=hdF|0+_-9.xn*|q-q/-HPWBE.$[$ڣfCZYG+ÖKmEMs MrјFI?6h2YMQa(^ؚOSv]/!6fo7@׎ʨyMU藪⸺!* #3 .J"w$?Y 8ͱt(_3W(is,}[EYKC^|^qԌϟ,ēQIfgda^X2ѷτH>B\@E્("Y*GJ#Ha/*fҾ E~3Ks-\]\l4aNW Ίڞwea[C!@/{mI" H~RM>]dz dP;OhcV%=n4BHڻ8H,4 kO/1ˊX4}b by8E?s i5ԳFsEd2j YCnon3/Ө_ 9ͯk/"xpd(?]5_jp`z0S 9B}t:;:]~:zBJ@ς?]>:]>tj>POdzJe\=TPC{Cu=T2PCuN{J'=TPɠ{~tPCu=T?T:yO=TPC{Cu=T2~᡺ )}2IQ+mz8H8~;">:?&X >峆(qŠP/ԥJ]>RXvZNzEz)0,Gu,ՎϘQ;%?gzGza N\Kҟ1kQGv,ƬxGzu%%8^,Wh|&K"yT^,Wh|&K"yT^и8xzyo꧑ٽ7>9x+zo'7^ {S?⽩75bK=VX 䱺{~tXcu՟_yA'=VXcC{tXcu=V?:y*'kcwޱ;jk}%8 àWzWz++N+yacu=VXP䱺?VŠxa%x"(iDE)R|҃dN/INa \[ {{&(I/UM36rF`y`>Ċl"џ+?iox1J-x_!85IGh34oq<ɋ,DU]؍ӥ֍| %JxE5n'b;8d]=?ܨ ū,, yx|!P2 ¤_ηa ?Q3u&ݰXl5wߡ^]ÝTӂ\4hFw1AYڟ4/9At?a?279H?c0ؒ O'YO1W3RW\\d*5 4 ? J8Y@a1.ɋ$It`1~@$'9>E0p_1\Zdb%0a|R1SE,z_B{ȢaBh N^G8V;0lؾ& dD/ cM.<Ѥ7 Fp+:K2@>,M&9`o԰0{t ~qI`s8agIxK@FlD..Q F6] ㍋h 0oL6 ,nb[)#$gBh{rðA[N8Ad//p Oq)״ "5 q1]<"C ܂HH&&FirEa,vI}+?xt/oivQNhDCl&Vbu- :Rl}4ѧgbD;|YB, %~Y@l# 85dߋJU5llT)SA *k1ų?4_?U 4Xbb6u)CvR9B,*hl~[PJoS*Wim*wʲJBzʬ`/_.@^s]*K~U{.wL7\T 6d_KP!d/d~HS)fTѕ fKodӎTZi#Ԍ*4NE &l(UJ>/j(L h=\w1s؜8?"IO_7`Gɘ~V[4A鉃&9 q^N8j8.U:rL4َa mڵQvmk۽aD:{k6rpM3RI慶Q|;ɢt廓h?ʣDCquUK l偼v[Q/`ܽ}U߉"[4 ftQM6n[=IApab/]ȹ֒Jwͷj>D5 <B&o>.O$YBYZ4K~%j]Dd64eU/}1 `0 y/lyu7=64{`v7 3Lmw!v~unt&JVaUUw/)W ,!+f>lW[츳~&!v?7nr ~ɘCP =,ݗSh -czih;?lg=L)Y  Mvvm_oz+nZ\=zY4.3By']z E?)asK={>D"rC9M/HME6&#\#|] '.M ˡ|ziv`78HD1MA8&F?i6WPCMJAq:)p} tԣ V7ϯ//ZgVd?z;gx\_= iz%䛧r5]]R 8N)&c:\b//gv)uR#cV PdZTr'fX05 E!#2x 9""בc`X)R k p0E 0IQSSw6F7b:3F5h2 X1B:EP`^8}K_A =8ĥD0\7ԊzzaC֣"IT==(+v<|] 6Dwv*;e @6R1,IB\33qO G[邔IDΥO.#`ʹie(E / 0PB-/)ނp_BV%gՖӤh,7s[Usٮ UyWߟ]=C#1̬<ӔR;j5Gy0ul$HY$L_xN]Za'm2}8wFo1Ɗ@b(6hP3 ^~(e( ]|gӜEX<G"~݅)|ƀI&YVae='q^a_}O:ҳRKSx(YK |x42rۅ>8ף@tF@!'Bkvi_?C=sґFAl9 d"B v4 S+mEhNl2ޠjL+l[{I5syz̖o 4zH[on#{ fR %;RsJI~Z/d9 a5A2)nhAQ@eJ'=6)RE`qw+N6>ͨ%<ֿLЉ[ k*1Ym Ljv0Z\Z&G&Y %:Ղsb^iJIհaO)4͛^^Q UBv$˲|{CTGι\(7/݇(Φ-4b3c5=}m`&UG*Ygف,c)U#?(YrY+Da D&t@zؚdiK2^sIyVJpc(:q1/"'+a ņd}[bCp:BV"җo{ѰUCZC^Sˑ|NB6*+rr9*TnGr>|w:EY:A%XK&svɳS78#&= tc!>J ?Sw6ODZu'YQnLn~A"4{3,ZwQI6:X헯 +m֭ lH |bL.|nH~@J8f")+Eƌ: AS&w.UOxF.ԍrK9S:k*s xMЪ~jӌ,h0="?ߗ֠HK"  Y%(F u{eeZYz6*72HLþD?1O4S:}@jK1>8|H3&zGȪ*(KQp'.̳|mcЄ,*A/ ;)WgU)rߜ(/J]Ua2 `i‡E19=ї'ivC9yf\|FN8_N1 h kQa2Q"*As_?tq, /0!0 R-thG~-lJ{7 dH(U{8oja*3!y,A}G SLEg vr[A(,&1<L\D>΅ >bj0L|̱-ĆHQffQDΛ?God)c gDK{$Ź( wL@Z[H ဎ-L>`vAdx Zr07KAiTv|PKT;:x].tvfduN>}R&C@#'zF$JiJ- ^GwRx ]\d&$@`_I`PMKTp Br.3USZ(90MYDQ aVAkePkXҗCu'r1GTx-ʗfAjۙb}Bui,2QX+u[EUI7N9;R `6"H!VHJG)%|֤B`;a |8Ȭcf("˜EM+e(2D.ۈ5}_HN6c;Ξvnwr8EN1xš.PZS RyfM%ogy8djI/}9P֖JY[v[ 9u?Z`b3n'#04h3ԴD[T#P[wCPLu|< Kir#` \T$6< jE4\nT3UJA,=z'%a:fɆV]3ۭNy*wppE4}[y>[~˅W_5عlüJ:pO.YxvX75 Tp7!p4pc;~?ۿ[<$q,CsF&Yέ\k Ж^)d``:NBOW{+ҙ4`&qT6{aZ05I;%Km[kƘVEɖEucލ'|D7S^#yaqV]&zѐy2׿l4Ш"Xyů+vzna6[l-:uDGĦ0D)*j7" hũQ8ֳ/Ǫ=,W.vN+CC~l_Nx +}yfZ #ӄ.m̳ 5lʁ+)E4`XΐSK,OwT'Bz: /S]i$-m1yP> r| 1ЋkF:_ڨ #Pn8̢T"$[|™g-9flGz&"b`#*k&^qB &a+LlާBE$8N庇aUqo_LCN6aAqA}wzrY37 pxsEU#ѓ(h~+ediz/2՝)@#m>+٤Oa[~FOїV!a9)Je4t`b ;vrkDwCN$I,hwVeyZ2?@LMIOyKo|H]C.nN/6h :B F _ƹ@w=].Rc?H>kc9Oon~J\ItPJAp_dE#t#+RS 'H/8}9%|lP.LC̉H ^fG9Y 0CU6gOXQhl$be{ H۰pǿ)AԚ1ҺM$AW9!ʢ~"b5l__ szA OW3co~Oy \7߾ 2H(m6nI|Yh9/BKYnν+`& !| K&g|LM%-kq<ܴBl';aMCjS-eyܰW<09Q*Jer*~CX (d iaNBfpȇ(عI& kJt̯.FSİ9'l )nhō5CyqQbOJ [2^SznGRˈ~OIanA7R# x]QN:_SIU3+!(ث5R(.I2|Y"۸/sB7@EY*?(hr ԬOtܬp G!׊EG >seIt)/%`)T`;!Tfґ ")n[X@VbR6!{L$OYA*%.FRIR$jH4vK-ۼ阘Cڙ̾ziۄ'%Q|)TОr~q<g2qSHe Qt`DJI7OJ+ԑb_q_ ILUǜo#R7W~.cWaPKAP Zыq3'B5GU! ʉ4-d.W4l Ȧ5gõ¬˽yBsu}*GTDʦcisչq#Q F8qzEM.U!gq!k똫E%SRJSWNUFC1,wl:fH)sm˃#@b'7-'w*ɘ;dSHm#6vAVq*y"!ZqU-ȋ5_J:T\҈ |Vǜ}9DX$5]:g͋N/a]V\*6Tl\ $|i_yװ c 뙨?J. ̙?Sa[U&?5`1ot ]# a:3; ,TK`P$#: Z $ -XJfx}y҄mYP7w"hָQmiKda+.pq.W4Zܧ䣤)]X4DdŀRR#hjП+ڶ"92b X.ȯmS5N:'^ m8Koqm"+]^E'"CǪ%9(op Lz6w+xAwuC% cqXҸz8SZ }N IpRZ"i7PeUF?b4ƴfjl&6)K( ܕ?nZ]̂uR#ؑ# ޤBԪLg*;\De@20xAG=<6,o!VfH̐)%[a'R}26++c"EZiav1|MfdqyUҀnL2!h'rgEDk/)w=)ض2kEeje`U %&nvsڈ3 4v#dQG.T J$*BTђQ}}OT( H)6\:1((B Ɂ~iT6Ŵ:ĩ.;ʄG l2F Q-cmذL= Vp#3ՂuQQWR;ldP[qO^9  &}ҺB0[LZUne/ #_uYt9 +][XX`khPeOII.bT7sd&a὾q):JSj-r8C#M{!ȯi9v,is,xB}䥗VDrxX}3AtRͦΤBuaL2zϲuە25+Ix"OUt2ȴ3~ˎ+Dg|wعg,ںhWh3BV,npupil8bh[GYqQa!&9Ht@Hʇ#IK3ݣ?ޒo4]*y'9͢ yZEG]Y$BB1(Ͽi#rLΤ1z70M$&dHO,q荩%c-wpZr_w>U'N6/rAhK~Q2yl$(}3}h(xaXt*~ExbqrGHyPj&q2p2|Se7ǡҵ}Q\%C#, )w5y ~V`N*hl퇂U;Q%^1s*5Ùhx?8V*l_2ƋP\ލL"Lmj| }uS9TSQLٴġHKƝzUUrǙs819̎eboP(XAղxK^Atwꩈv۬;ZLu3DǛRDTmhF]kJY+L\ 骳:0fE]g6SK(*‚*ƪIGٕǼSck+…ohAum+Qێkf帽 <8U0ToPbźNfG9yW'a2¹sAhmi,";ڤd;xNu ]6;kr#/f#4V||f]i&kk*ݱy"˰Z-_}b~?7M3L 2b=Wz 2 "_6*qyOByp6@i/e0AZJ1r 8}jIAM$ӠeP ,K1'$Έ/W9zKYVPOJP{WJŪE1K4&cԢ򔁑4FN36Md)H^$Ϥd\p1JGk . X92DJ]PA eCQ\ Sp$dT*;s$ѳN!01I3Nп*^怐/Dj~-8NO`$ie&@[\"Det#1X&eP^ba } CQrPtS Q^:Iq$ U7bFtaT)Q'f/֮ZO5Z.+e!Xk1ZCWdtQZTXd%&wU!rĽϕܰl R*2Dr5ɄKsZtğ.d1u *ic=|@zĶ-e4wy!uȩf9g|>brTWY%%`.r?o ;Y+VqԠChz-:~+*UWDTMDu<=P (DeU ZO2%IW)e€w*JR6S]w, >ke0|2h}ʰ]b4Fc9M:JNX1?-[+/vduξYtgEadIdPdhh^;=#rͰmcĈnu؎폢 'W=:Q4PCk]v0rw*D"/+9Td'GQ9!\aЕ_娸\/ `N>hʀ9b.k5&nB$V87@b>22g ]7Yz%oVIJ7.FILUeMy*tG}7c.Lo쀪72Ma:͛[vҼn/ bl%$q~cXTp||JN%D:nEH8hl)<}rI:4P͖S3jѓ]o)n׸< rȈ7 ʼjG`ץ/i9li(ʍ#P|BR/ev O {Qd*hS9YCY줭NV Wgr?zh7ZՠF(FH).00ʥb L Qa .Y[DihA#(42;*NV$@ i4إ~H f bZ峨jL 2>8jQgr{Oz4Gy>/)Y *2psF1T9bI%A@Pq$:_(P\넓\w]J%l sF 9oCG}J^أFB\,SZ(Oyzɠoʊ2],d|z*E?(ey.tܒaT RkZʺ1mQL~NCI,FHdgh]\_]_\]U"K']e ]\(N6I07;,TJ|Wf3pA-i8sx>-cϤDAySDwlM&IFc%Q\P5)CFn=TǨǩٮYh4!-,.V ukp\يkhvS 뺲b7d)E Z5yLiӜTPe (nrT,PJ^\ Vfה\I 0Jl j;*!=%k˺к6{8y8}b%V*!wMU񇔳 h.W^߂zsQ(*\lImy)&haJXԊw3,׎e%?\*'(J!FI7o3Iz3 *¥N7׆S+M:ub":҇g& ) 9Y8/1ٻFTCs^:WJzT$Gye޿P?J &!Pٖ2W3xTn(̐upw c,EP.5s 5lf;jar Zy\͛?R4{gd*97r#t1lj_šlJ /c 1NlJQ;'DVQ 3 !Sܼ/:D\?ӥѵ6IFGTⓥհ/P(-W\xo/υM3jbuƨ+դAcd:Px̬PQ[o5YAfIŒ4iI~啇 R 3"ڴkݬB]e.et6^}A;B AV5U vg+LoT=m$G8?yCh-KyVIUIj Ш%ښ@YwƼԦZY>N+aɈX|o3)uY09qT02.;A!xfIf%;^9҆d_F0&KAj"j$zf/eiWrjxpY]ٺuP_*C9O~!u:˼^٫V-Gvˎ:nOەO;u0 1Uwn+g 5t:HOխ9v*ةcg_;D4ʲkY{=ylw s^0 sa$# 7}Z7Ԩu)h0,F)"X*yPw5?>w P;͐|~: nc(|hjKv}!#vZ@t$ƯS.0s(y1Zu%JEp TF>L*v}~3vlFcؤB#@I)^u}Tt_qSw2ަ]x^~X&hI:qno-*m&x;o\ *JTԅ Xާh>PoGvǡ ;9ʋۀ D'Q;)kHPLLOe0a81EQTeU;mM/R/%+ՇZ\85F/|V柨nh> ͡`Q9/i <<>4L׮F`"s10:6H(9%0.>vq?~a@ɮNoN~wzךa˚;ݍcsI{WYDg"G Ӣ ajoy5o෴ʤ%l:xe(b/+vީeKQY} +-Pq0.-t7Iz:wOK']:qS}RWqq0^0P 3GݮӘ&*Vp7@8 )(M~AA溸Be崘Y!hyǓdODL(a;,H): Y4`e9&*V'FN_*v"9GH2x6ح',7QRa(?:!W:Y:V` `Ijsf~$O%Q ,c"WA]10ItLX2CS9y,B] x+SM*&J!ҕ]rOniTl# T1Ĺ۔C|p&i5:`Ѽǭ2Qѫ9ՠ7 !Ln|$GVUmy#tL>qXDHUuo e1T~?2EkPL7"5#1v-IHWTPGywsΘCڧѕ8-Ͳ`l,CQXb˟)VPc0UW!Zga`CDPʅ M\; (G&MY[#qsq:kUJvI z~}%#~nxs<#l'Ǖ|/fݩ/\ka&,( w9 YIntSf%~;My.i4pG-0vc2 2^迸iD}-EBnyרĞqTJwgƗ0viNl|:7nɿ0-z$m$ǟϋFT/#Fd*VK0Gg~L2Ŷ"4Τ[ #@iLދ05îR8aV+.ba'8{{s,޳Nf_g0S*թgAOgKտ@jh.>T1FvkF8X uk8nt"KJĦ#F2XP/6 7ؽs6`α0f4GyUgi!K OLQ4VQC!0[?r 3HtWzQĈ9[&NL㐱 f5?M84q#TW~cJa=T Ǥn nt[;lQV&9%oӡnJ`.{O\Ԕͤ0I xꉰIel%DWP}RLuV핹?P2Wf y#ZJ]S UنxbΚ* g.,{0Awj,d\Ɠ~3̨oo_73ڭ%.ޙ>E,U 3}e6>Z=Jz:93ZS4Z:_;olq&##wi`0 y ȱ <9lg҈vä5b&M2*r?WJs4S鑢YlmF8"vN8r"tVHʋ`Z4K7ӀA1 Dj(m*҈1vZoTX{siNp= M;&7: Fv"RqA-1VaA~v.B uwI+q*Wy>_[b`yCɲ' j@4K.Xj\T 7/TI'J;$&ٗ'pU>* D d2T¸e]r'R*%%ϭC9WjOy`O|H>fIF/HJM:T.s,O邭ok"LB&GԚJE^:Iy̓A|L@ZJ2DZ2\Z\ _9ux9.o$JJs^|<,D)ZN_$)R젵<0i[D myג0ށmHpWXu*Y{aJ*PA}D׿y#swlMTGsbQEcJkfy&dTά)kS!{{1sv139Liw^O?|}VtT|x.>@ocL>$ɢc@b*šg$,$+e)&(hH'Vѣ-fVxZ}sr,%4Hzu2O8?!>Nw\bjQNyN}W(ق@}5&u<ٶ˱tUlRMqSS2y|tx҇SCj/<5ϑ<&t_ |iY HҨ*dI\ @dSMqbiGRxp}Wk29PLn 6Y؈B*yNnֱcsO۩,_?%OE6T#Ӡ*Bcɿv" jH~ص6-MxNE F|ϻ "y<{p Ĵ2v|sL< +#(0y2sxt  DҺId .E}l&[dYL"ց'W[ л}X"]}4иD5s)Eiw%7S*t!|]wj{5VEy>_&7 t.K*B~K8id <4,%:R>]L{,TׅƘ'l6[A+d7rڼEO8%l..$-걙y-Y:J$P t~4p'ί`TQ c%y5B\m,h4:,물̛,ͷ?7;Y-Ӿջ>tnaw͎rJ9L v#SGݖsEEs/}LIXy+gzϮ|HcyH=<ma XpumOHJIJrx9!sDD2f@I3@'6_s w*Yԣv~m#Y_뉙:xSU[5!]eؖW<1;3 2pPGnD'we"$l*Jܻ1.ܡ?/ ~_OwvҞ8Ln⤙=C= 'xPaWqx͏/ZÓzG#0ZK Rˇ1՜)r{>$/{?l͢ )O8~|z꩷X2fay0bl~=Yqy᧝a.wv;//_z]`|ONusJ^5ˏ"4S'!Ei[5s Dv>lahfǻ2dFi -TRv?*{˔/(mO?ϿOJ``BY*"%ì`Fgu"QSr(c.LI M㦱`uSŠ0xl/dlZG[Q804&˾괝fvg, V ;5Q6 Hn Zn P @JВ%yv&Grϸc@PXoj(@wfVm5''G ԖDە%/]iSO zQjA-2OH{FD Ğ*j|xG6eJ\t)8Ccb;i%כFm 0H'tՕmL(V9A(%ѐ{N axHo>V} .yY[D?e] vTá}S_TB FoF(G'Vtst0!X9~FA6Pa >My3r<@]9p^K5|`GG*nf} la $L1%C+iۇR+)#R"U<ZP*}OQ* K1(S\37SauX5DwUF4yͬZ?Kw渙BCgja "EpN0vd\%N.c"lڌVTLG'X /=kTiihհIb^C`CgP9yFT`Տw ]QSk"|E`DK{ctC^O&!c`  9 EQD^Qy_=.JA) &&.O3A 11(҆ي4ItylZ*:ָxH$J X  IU=rri:t=f2K 9d.}j bܻ}rQ%=嶎8+,.Lu]Z]%_p]ʺ@v\_X;d]*L'+EW$kTEI 9QUp7śDp1w19QHDʘ:'Vр,I^;~϶W-^q]+d`JIX &*e֚XqRa28Qqul4bȵ "KXX{28vh´)ZZCI+\ W,l+?"uHPMQ *DʕZk/M$ ِʐ,Б'JiHM:q}-Ul%EL;pV||iؒ,mU\OH!ϝ' PC+A9 `)E<ڶ[EGLoEm mOJ۠أ[kxjrql"T+ּSw(>6jn͹(=,]g&N\*f*Q0U^)omkxkdp7rXB{9 <. ;-վ4> 09u1@XL}.t)~-liwJ`*e@?oII^3R HwNlI JO1GͱkwM{?;A4w{J{= !v=oc[\Y1M # vxh;V!: %tyna,ƖcƇQkňH`3 4D= iymx3P(pҧ6.5?(?{[#Ɗ΃ʱ>]6UT)AYuhI t*jq["K泇+g;e0/1t5,>|]`CB~D8k۱|;A76OxbM Ɏ=l o \Nk<p6kl9ˬq` vJpzv~aن(Q4+lm''?_ /M*΂6i(/) ;8jQ(mb OUiu估G޴į!K"'GQٖzѱY BUþe%JOAAFb^.$ OAߕ";޳qŷvGkwwoR.%'?VlhԶ%+{r^#{ G$1,[xb~!^hq32n>4pTKT#2ˑ@ {迶րqU/qRL⥨*N-Z<% ȑ*Qk#a !ks^D,L?Ce\;o$R#stGՕ1'v5li]w!bQb&ms`pJ9 G_GM]JUab*U8L s1rz.>/:=LUm@f0ʽӌ(;wLVzn`t&sicmWm2x2 mFDe̤f@bY0pqB0yfg韵n IO&~bwcΜa#kYqK)*q^Y891s񪩮4pL @tdcDi,a|]݀k悩: f~C3yvN3s^_VeYcLb<Y>c7D(6,Q* |$[L]wID!&ɦ@x@,9^v,ViW3KS|ҕOZ0)S Dp_ "ŶfrI x̮MPFSC:Sq2K@K'P̝M9l=}`Q` ՂX]GxS wFqa5=0^c)L}9W%WϨ+XnN]iGtڤ54HÔ(sK=I >)Ӛf%QݗSS;^0|eဘ'_@yi\0t~QN{D#LP&|rS _jK0o[g( ;I+sL#m: oCz$<ȹ55wc^~i&21Ra}8ỎKfvʬ1{ XI #̅Je^hMPR%q۟RRg}loװmuedg'Nk8sO`V$&[0 _H~ZlR)H*'ΩΚⳗon&#Xpd<-_2ԁ}%aWF4pڷ$g07jE7Dљ]`aKN(Ơ݄TB5 {gy~\u|ؔ8Ԟx5@fyV%vvO$klכoB~eE-򂣬os/nn>in61PDQmܫ;#Up<;X89_Hcowa,[ӁͲsrITH Zj ԘUS0Av3ā٭&,ob_sJ!.kW$r"JzlNqUA$nkdd )ds f(w ; !1GXQ̘Y0E6,SH JYBNώ3cwwk֩;x9R~K7o?$ ]1C6\gׇ@÷9𦦾Dt*bzDt(C- FvgRX#'8g7qly݊;V-XVЎ&ӊgV_Xys-4%~e3B0KʢY^O9NX Soa2 K4yy mvl5A&̓7$`(Ǝ~[7 8|&Mp3i~8#,~Sտ.,XV $kxA [=Y0I|ƈ,/~çX~ԓyg$H:rJ {Ti%Ss}\+ڧ(SS> ,.K;f.g<e+- Ĕ-僄E,~vbEDZ)`1@uu%{+N'Rt 0$̪>TӾC)F؏=*BO7ϮddUwVΰ)\ѤAb%?T1,"y֣U?RiUlatB!ƃ/{Yo7N~g#`V]l:'l~)_t;;Z[s0^&D S3<vy'X$)ʉ//YclUJ ok<$Ψv{KQzH~Jg4QshƖ]kE)j>֮o8I(LAY:vl#n̞^܄!#TIȋ0|a0S߽ί9\'!7{r#Wҝ1lj |jw1`Q2x);ڎyRw=;$8 j~5u>#"Tl2QG4_R:sVDpy ebo25Lsx|n'CwOz1ɹpAên|4G܍b\%*DHn40?4?ƣf/>rOU-ỼRxXrs{uq uki>(.$o& yӣyflf'B@#ϼ3bcA%eL&Ss bY}L[z)#jʬ05z,Afy'_im3K (!}Y)`Q5m ulf/[l\RfTGǝA۾Fw\ȷOZt:FڕOTepW Z(%]TʶR} ~=4Ho//PW(HJ=?亃qʗ|FtM5^S3\[-CJBszYhˇ5~XG[ "u lpd,}+ny^" MdQ$v#(miBf|[^~6D7 c7kh)TnVlA =jdA732U[e2֯fiN*CM}6P޳{m`Cv g;t;ku1}1$w1MeIV5Huv֞'C6.4-pj㰱rtݓAkvN֟+옅H?A;/z6OJn7o6G ܴ(xdk9ʑQݒ+1͡C65m vd:v_(h`c*JD+K?`e ֭I JCF)ciPFќ"ǫחή~|0Y'|BxxE@\a>J+mhj%C/Z<ئkT-L;H6Cj >S%eY'^:#Kb-ߔa.UPXS׮& 釋kewq:奻`Ԙ<'㻗/!7+]Uc2eeP<0m4]_&XKӹt+Pn_w!͖znCsr32=u@hP 3k2s[]DTiHF3()ۯ 2z^oYU jg /iC\-SXqj, &9+[9Ё1E{U*tJnM"qgLğCTK.1'&4?S'3ס+D8MD,ݘ'>% \em/ɇ ||+12*Ͼ *HUXpǗ$φ7 4?݃h"H,Dqhb΃/iMْ!#kʼn $%X@Q#lZuV@mtO;]FCV]A5AKLƊK UdN7D >eeO-lU!lL,k<SB)7BICLȒl|\FB Rqpxv}[8,Xgi9<:PhekĽa>nlfA5%fz<ʙ ?p, $@Vpa%ykTʳn;ad2b]\B#]1zbM EDqGԍXLiԮ#ˉwnopXKD]}&I8l=!5i` Vt2.&S$xnwͩj݊mĂ9 d5GP<3x:)ǀ^0g!<$:G!i |+_)9P UM3r<*@d_sL8BJT'=2U$K?-7O6sgtLD5ϔ0-ܑ!.j ?~ 5'VS?ۂB ab6wC|8'iNnTs_ysj|ǜSRVb!6z^c޷`V A_jlDsW{N*j7%n`\tu43_2p`bY~DN02,{~qK]|Fh q8e=p?( H͈HaF{#" vt uY#P3jy3f3Є#G=g?9%nk* qhSh%Wc8Nw#Q+!Qw/M_/+ z$fuT D\\ǫ/?jE>9OQz?z.R"#͈3r3MbS' zlz9ϔL=*y䓚aED#o 9^0ǩ_rPɅ&oNb18aλӯnV 8 `W/Gq//- n{8c,;]U%sN;0Xs'\|+ R9 GCrYn):8`ء̥r ]%ZF0fyhdMa8!ҭ#Rl 34`~_ Yy|geSੂ(& 2ΑبI64`:p+H(8̈K⃑_%Sdc}5A8T3 ܶ1h5f #Wb.2L#L϶]P'w:oifbj:Iȁ("o|!.#iiPsppT4ч{ks}T2Opr$Gطl[ף&0s:*6; }puw!PZWB ki\atc֦V ţZbbcv Yhfh-qoȢ{RSX(!PXf*I{ZB郸2K61:D+:^ 3wh5 D+i:{o7hG&a%שbKA$f#oۊ΋Pgk?yӟO{&Q:@½h(=O\V,q3 y7}$P!wŠ zaYq"AK%_+o0VUqLCߟ9:lgZ1UQQͨh!C%;@률@+h^FOx4,VO%@Zq;tZyk/r#0k(dܼȗ`^&p0]qBѕm;ms*?Б YȽYxOP8 S 0ot&dy}9`'ptKf|8s=핬l_JGFhTlu>+Axpp-'D*Y2kpnUrqŋ>8OtN(T~}.}mA,Ey*Zp]mS{a6D9/205p/V #kdžH^}[HSl)zR_G`g,C"&fi*lP8'e{WMwd,KBj`ٲfɞeqQv0V& v;sX:Q} ֤_Q#IoMnk(Zx#ؙd_r]]e#a]SbR=B˘Z[,Z: [*!)"kZixS`MowSZRM2*x8n4,3JѠRٹ#O@ $pO.WAJJʮg  >հo@sUaJ?|3B:Xg\֘{w:bLg%0*ErO^@f(;*@`W|F:ď]3`G|CI^;~ N*' oY)Ne|%ʦ ekQջ_v%vYP/(Vbrδ]#њv`%Wqp[|ʆf W/j9G`&q)|d[ppmHZ "AC¤1@{tbN\J'Yg4D\ʁ|ʼnG] j8]?+Έ8#!c00MH}ɸ$x,F IvX0 r'_.ϝ3z_3/6gOK]Ɖ839CT93oE6}3Rj8b0Q5]H;])Yc]ouf ۡ{iI3XN<aR]`, T@d e4=4:1G{ݧ[zY>x ivόw?]T+e YgE!lp?\z\ip^r½c}Ui[db!4Iػ(/Ep:]\K Rm3"a/[)*`,+t;Cn0Щ? 㕼.RB}YWD5Qb?\v27u#˃G Np2՗g~&vgr8蝨#PjޫT =xudTѐ E riMB]nZR]" bmŠsp28+CTvkkE15Ub+Z*ʾm)lOg1.ēS RR3iVx%[d e ׀t'I& ]I8KsR(rSd) FuT+q$ΨTzwR1s0eHLt՜%I>/6!j p,jjr֎aa1(v]5XD#B_ѬF/+; x؞KhS~+P (r]#BSOUC&wLwS9 lSS8@#UІ́\I.R|%J,Ml)gBLc"}P'rTRhBr L{]#GHUU8 'MAҌ*@j3hHh=Ilqep1Rdt,v"x:,vN1 68Dpm p(@ ޜяn$0a2%Jl)GwLl$?ÜU,z;Aw|lf"d)bʒi!q#odf9A iKm0~ڔqU/@NvȠfD2\V4 qTH6ȍܔJգ d,\tm ~6@% T>D 59di) v[rf&¢l8W@umc@N`#Mjᄾ:]o\Jb%Wv'au퉝:X)x>v9p}{$iC I+P)=DX]!-Ӭ!$9n(ȴa%|r8~[m +87$/:ڬ&\QFWXW`1z[zz@|ڠ*C)TQb qgeur!Q=6_m#DGz'⩜:b7qgąb5J[U]'l*n[{^Hft٠!=amfyXt%R ӗT81B?+89YE4WxM,t qW +y@PO4K Ѩ&8mT(!Jl 0v=w*c` 89j?i0,!Gbk|E ;L݉Nwy BreQPDlCz! 1E[ں_柔&Zjj򻽚xyk>3醂6=[XQV Z(eYK6SS: `ϵp[=:XL{Yxx!T{n{ UlFr]OAWhe+L7Relv6O1 yne1OL G--U!;ge2`m,\@i"tb֒:F3~ zR8זJF1Fnaatt`vIŰGJzوBô*Wk0?`ObQ(} {z1i'A yĉǀ)&Ty 'c[GsX~^O]#n*Mgm\~2cr9zI~=mz[Ey17¼S_ՠVGIx9P3w0.zw0,Fp-ѦsW&F|w?89<<9 TÉCӰŨA GS~\gYK"z\g$e %~^w,}MV$@vQCB L 8#bgh$E$AA$҆@h谸YnaoeFJw|W3,IRȏkЃ4>ar5υ$ @3QAM=" :0]j׾[ĕb'rc#ᱩ#RM|2hߙrqm]C5yE] \-$6`KSm{تSVClJmGz8iUJ*'үLς xXq$`<fgwb; dDRQw͞uk,(x@2P}1m–+ok6Kr[I;X| vL9+w{;&;?d8PF_?urP 4m@Hі)F-JN#zLmW…~xJ킫@ .]lThWI>Auvtb_/m8c]2r|[Rd{k7n{’F[(! _lA I{\yzt [M5a8Lcq(=kT(4ǺGJ] RŬDRHt Mz I˸+9 f~3wݣ ȁM㻗)-]M- 8(&ǔYeIp(!ocy 7Sӹ v?s@~x),ןxXdjDG8!g1e b>㽲pOCD{ A*ĉMX iY8+ܯŸ(|Qi0pb~uF</?j&]Z) Q3@:F)m V=+ɋi\z4^n3W9Z9>eK50'MK#Cb?]#&?iWm6Ko΋;y,W_KG-f'~FSlb  8>׋=Kn!E[=E~ X~EՙWGazs,8p xBI.7Ǩ8|.=([B垜p$J0ƻqYf <)I@A_g4U?]䫋+Cg;rZO&:T'9%t6.]R-Bύ'ݸ'ux6跄YR L'LSĻ3C׃y#k , g-3;  H#F8ʓQ&- C'4%:?!LʦnR?\^zy)UFIN)rD笲p1Z,rsXY]5y>4ceJ1D( 'eK|F6]I cM;؏a#|ܶKw߿uZv*vz#x\S`Mj:n~UpXARM_uCjh?gɧG$/<1ݟK^=7OB<`A8HΕO@YOG;c]lv~pptxt lunj死s)I~0oG>V̖ K1: 9_9HH@7_aHytY5yy<vf'2bl$R >-M|bW4@]Lǐ70 7L"GkFDv{/K$ ce$E㎟$=bC΅V;I`nx.|cnbo4~i:y|hSo]Us7>"lf_tـCMAT5jWBsB}ÁB0"ID_A@>|2SgN;8v*< s96_k0`sx7k'- rPJc:v lEY~?i 5<:AVY-!3J}򮦳pk&iadNg|q]Tp:G2Ӭ}6 mSs׫43 I+> Ͻ!HhuiF1\S&tpALԠtEtX704P9Z 4_,y|5N> 8Ofˆ$^ȟ$">Ƨ(WzjH$ dcAJF`Ըb|ʋGD,MBPKǘ{գhPKdz= styles.xml][~0ou%Mw6h M9%V#%=ҟ_R^D_l=h/?~=nQ/rr!G0p@Wb=D}g%5WB,3 4SaGf:6] L1^aq@${ဎF'eIYG?/,#!l Tb@gxZJT05:1׍F"Ү`{.MF8,~B}py.>}nSa'Lc Eauc7yMRxHw{_u͡w8\p0_sć[ o%dVi@ ܟ1I!YS9?/5U= ^YNT!8Txd!@ȩurВct ڶVsDSځ0, dM"J,E0>g|l1d钤(#eNo+ ! 2TF0)x$5bs'1l4Y"j\8M3P( Nu#NٷD 'ʢTD(*$LV S8c7)I[UH h訩А@~=EQޕ(;,˵FҖf2p3 K,{!Ewx0"k;)!Iȣ0n(Ǡ`$,Ҍ7x"$' CS@J2F#ډZ.NzW`L]Gv[NZÕ^e*eANQ%m<~-2a:6(?' APT_ڱѩ9R@+)@7~(XXF>ep|!HHES9}![俊d!xUJ\%P{*\ y#|߶(M>jI=ˀ}C%9]؀~"jG6 ,Sf.[/qzg KEWm[KNTH:! JiܢFeY/Md9٬`_F,  &FDj 6MrL)#.7->r>5䌲~Hxg_RIutzU#(y~fjW)[CRYEe~UXxFs Rw?N;m}4VE*Dq{f V~w ad>FRơθF a]֋/ǩُSp*`lmp3Yjvusgn&U2=y/":*ϴSߩ.#3}XC+;>B_TȦ(DVd"F|4X{fŒ胳յTA_S3˔~#}]׬qUkAeiYali˖9#=~@(."`Я0p͡ i5&zD"jFTvyufC`pΪԂ>Żv_-%I6٢Nؘ.y-kMNWd9 +K`}} a_>=FY3onv1'5<2{߃뷅q#y1K

',BVƓŝ'ƔRR"Ҭ5\7jǥ>Gt|ZnsUT~Y{Lr nn 5Oa ú+:֎f8CtLImgc٤k6{2iq]aYuW3MjkI;TWunҵnZɤ΀IԴכ7w\M7;`R&]JuCߓEum%]ljOJQ-5ͣKJ7󯘧9ۦr۹5;&D S(BW;einuth5ۿEۿgnqr\o;֌I`']Y쳛o-+$QG6ZM*+ۭm0 wR1'ݣ^A*O啎2FV]0쇓v2Z[3U==:ӑZ0B_;L?Rq׼T'2(u3B}={"~)W|̵R=q,F<xAX$(ȗY_+!)"Jߞ"ӲJXҼNiQJ|OQi"yÝO<ՙQ*UohE7 /YY~{NOy».iGTX%Z7̑ `KJ{z~uHd|Ldklm-1r-1*pތjl4A!&ل)/ZV$3ݰiќ>Fu6R:Ey&nܦo+7@u~T~RԈpeGT])K}aF9o z69F4]Ӿx+5oz;wrxA#뒛û^7sv6'19۞.Af=WnW[?@x+3]nSǯƓaNRך3"]6]ѵ|[^;/vlG?|w^Tx mqO@dI:Tʙ `pom/C3ūiC3ʫiƲ hf|y5l =A4c;vchf|z5͸Vchf|`{%Ͱh=4c0&WS;7UMG&4k3~bQ(yN=z +*&Jyၿ|-ՉڞB*xaw13*n:bῢ$Rv'oT0˂Mid lk(H ̩p)lOg A]͖fdLV"w:E sD 1\~!X2,_N6t`FYZq|ԗ-D5ܷ9,Wkrj+YXFծ^Ji%\Tmټ NR0[28{7cӏاgd_ٵ3Y[/Mrg]ʭ>|sA,}5 13R4D#(I NeoOffice/3.1.2$Unix OpenOffice.org_project/Patch 12008-07-15T10:23:002010-11-26T13:36:03en757PT61H16M39SPKdz=Thumbnails/thumbnail.pngEPL nݹ w׋;\][73yo5USS5Twב>Ew"˗/Ȳ2_| =P³#+)s M_V C6q,p A0 b7r1r(mm_;Nva3<|ѡ#COE<=)#K0cF9{~'A L X6f@pcSᐄC"NT%e%ŕM X U?0󝹤3T]st*|[ʑ7RgNjZ W>IbU<b;+$ җ~9Dvdj 㳺exQRfFRbU!Cfte<{ ~NHV4Q ji7u}Ϭ4zQ?MxQݛ$'3ja0KG6ֻ5!w(M?; 8AhoLJ)v]n3f^7A?Qokw!WKE(4gNM[Cf4,,޹KXamiMinD>6z~~/T\Wu/Nzz!֒A%E鬂Q;!xU [Y=UsCЫ6P= o`8'u]6Z>aS"^nՃ 6T `NbMy5{O=<x^1F w$S3+ўfd<]7շO;-Hj)DuTf釄 OӈZa#?b[쿘4E( :ټ]BD\rpuVeE" KSRr ʼ^?{P+O +/UnݬM ~1/+!Vg X82t2]/׫xSԀ$q8 K<%o!ȫGwmΙ\[v4ugNŒ:oT}_`6:Zl=Ouz$t!cH""tj|BHvEkiph6;FoP{۸Z/ ISS^2:* "jQ/F` ?ƃAK%UtKef޳Ӌ]'ex抻WYO#ta>G3 _U>sG.@fC;ɴ9R: 8ڣmp_Fh=häqoylFvnJшkh񎤈¤~/-G[+h5S{shNb$"tWmdU*)+0f_t$|֊q`|t~b\'/ xα\ @9s 8mv G_XTY\t?=>y!앹-yw+^]ȧ55אDyzf#HވHu(v?NI;8|S[oǖ0!tv(m}Esk˦%@)4UȾvJ?Ni? |AКBgB1P3wmal,f}0fȧt{Skۗ_m՘Lw  et09re )9_>T\TOU(Oy}C eC'ws} uH`c~SAO;gTҞ%ZrKջ!NsR~ڠ׋2 Rg4f85)[ynvgyWuGi+OT^QR($e)%ZM^QZ07Eg\/2Y0ܴ#k_$Kk!8*YhbsӄL3JaTL[gqvh~;+OZᨠ'Cי[E4MU3|Eᩃٍ^0迺(<^ -8A2Ah-)ZMp g!)r*fpp~t&ToM#a"R"u%˾<"qwՖy\GO'l0q͇g0PjjIS_&qz$l@bZ019q'֜ןfi I1gh?skjkލcԵOx>O"\Z~%L< vknڟ{}v=-cP'z8c6MM8x)~Uwݥ|D!> ny?o L^V'|?e;},[R|eXnn VEV׸oE2Ŏ^ WC]2z0xn'\Rx d]¿ٞ[[ ys`u B7}(_^p|4qUk6nǏy}t3pk&ciGD_4~2B!S{^VX PiD&+QЃٖKSz6+&qM5Z?rWleq=B.>GcTA(-bw:ZJMl*FzYL'fPc4YC:QgM'ۤx\tgǪW E)MR91\KUEOv)Mڀ>ǂ' U1>k&^C,f6[B.Y7[ Dew/7ʫNK:Qx/OB&Ju:IĬ V4SC-D6kvϓ-ҹ򖅫~K_zb7 4P"e΅rqݹtǮzIN'!3lu lǖ Wk_*5aqH[5$0ɸ#n6V3edC:fôpėQBYRCj>ȇmcTCy+ےSuX?~f],~߫߸24O?6O; 9oVLh7g*#q7I%p\ȓI0 ou}!Dc OWP%HO|;O;؋t"݀3>{7'z9ؠs(I Z.se;q懝-禍NF⺲ϾIMW(bZJA'.&F'޿>VJ]a[3f/BߧPAD$Y& K X$ -ݬVCK/B86;$Vbȋڹx)SKͫ=BLK4 mIQRjDxšJY! ᰊ;!= Irյ[,Oa\,Ci4)\hh GL}ߗ29eX cEW([gy45]iOckg u74זUSӳNr5>[Oql,ght4ؚ$Y^cX,3 vUzM;  hH`΍k@-qK28ޅ\DH)*]00*~YkWQE"/5ah58$6Mq-u6Q%* bب|Zz\J0it|DjB λڪT(c&XNa-ȹS;O"ȯ~ِ?)]M*JSۻoq#GKn.duxQ^ $a/ #yq:\,(p9"1"{u w'/볎g0 CW!_FnNZsQft>),s6P ͍FyPh̨W*Ak|4_ ~'7_\ˬNd+,9rDD\~$Uњl4DjunBA!#G(6)-%NLomfR" qG$KUP.xsxdg|%:<< AHWH^B׽%`cJ8rAN'Q,(ήaU4Yg#Ȫ(%HVrp|yDh]%̹ ]k2ϊ @$AmƵM2(II,??ˋRٸL9_hYfVѯAs.WdIJgdUTyﴼ1%z`Eմ!*-Y1Z28r&8Ie6%X`NsX|eoNfR#la/ivk3j giOA 4kW徢"57rڀWÇoj0EC&AJJ?ףFKI2iV=(|vrDž\ӄLZk)p=+etʒ=si}b5HE'Xt_Lb[76AY|8).éTF"7eKi)mydwP6+UȁRm &9sG.xOK&jjSFַ!°{snlrB {cP;sJK?#lN@LCgv>ZeTzFk|dЫL׶rGMS1#}⃫O:\ ̾!hߩ]XK^(3F /:cs U7r$V8迉iQRe.A+\ITxh>/) ­mEd׷(̺Rbg^Z4بy 0$_UAn _lTix!3Ů0n/._hg~s5xB*lj$sK^A!Ъ:20C+ }S2c3 $mU8Yqv)aN.,Z$fA>7m)cj8VB&HH_+qb2I rV]B`Qj@"gS >t洸 }.+d9?L R^Q`v'q7|^Y^h鑲4 Z:4gsV}szwoе˯9"C.w&~7<\yVy<9(qlӈ56HU "2PØg,tqP* a5 w|Z65]w M+|ggjM ;9 {^UTftIP&^Ex?mC= €[ͅHہ[_vz)RƆP48fn5kiT˔̷$-[jvMH*eC e]uς|$mrV+Q.E&Oۊ`ziQ;cIҹwmQE7ng3XsݚPCq^;AIBy e'&6 uEx&mL"!s}ZRtgH(}21S5v~fJ"5b /&DBk<~tŤHͳH6VSdn)`2DVM8 TѶ3y?QE'LF *bUƌ J'Uc[Ƹ _8̇& ֞S׳< a\c%:^x$RQ9Pf5C;6WvWOU)z.aiۂvB~'_pbW£:Q}e"hVbEx’.+"7kGB10DJ~вMzbE ;#N 4By_MOR֏xS O"ʧwv_wle ٬sVW9Ć_.EINSgjBҎ2|r&*ޒ%}|eb&yebgb ?? 245`$֒rjGD_M`$- 9u㖱X:3Wƺёooޡ'HRRܡ&-VDCF8'>]ˡ7vDt\z,!FS ц F7s:Lsp )NaK$xV?|VW}^zWo{4U1:|P>X[&,:ή *բ@9І\4_ pR.;]C쁜>t\:T~Ĵ *!R\^E0W6C5/֊(uD_.Q_Zw[.NLh<9 @-.@=4.rHnJS` L$ȥ\LܸOȌjx_?]ʏm#ʈ@W3qyC=1MKA9'LĦ/*SvvHCū @Z_مB9 YYpw ;$]Fh9V؋&bu9^8 m!u@DZs:SGs!ԐHHMֆ~)m7Цzw4|zT;dUzft"Zђ /!oYp*Tg MĉoQ+΁IEiZyU]}Qzͳ [ aOn.y2uū2%,G(%m"Tiކ: &kzzxFy;3/x擤a֜#9~NjxWH'Qq^H]];a}-q9uTTVG`@]* X^v Q]'Ėb >7n |_ۡF %n4}61E\p J)= [NMCȡ5ߡ#q#|u21i#DX@^ʫgPOZ}46m<[P{7GdO/+RTt2cϾ5-]vN 6,AD1ZM5^V{3+ ,_ 'vz5(7ozA__-Mӣ~RfM#mY_b-oߜB54V\, 7Ȋ'G L̛7q'[wvj$C۪Xڊ-T}|uk$/x '^hm42;$f.eĐ*VIvgeԊ@Դ,*U]H+,1 _mY Axw14d*;Ju gd d II0-*䁦Ƶ-俓eNt_չnw& aJV{ttMf&Ig2WzdWVy<'Pj/rLR ثyVe./\kL$t`pVDŏ錚 KkVg |\g(7,&l;j׏G5JWݤ_$w๙ow]iI_YNѼmypO:DzrW3' q  7O3WWAd6iv"8ꧪh˻wz w\C y.$7 +1d^5Iv@gOPyB% >j&y$Dm{Z&?:p_\1("j ``my6opRϸFb~&6Y:=z6 ܦmG3QMf)>s_!fN;w\n?ng̬矡Ƿ O9_!+M?VP}Gs;ĕ(5iY6ԓl*܂P;>ed qW [xqE43&Nɺ)xo"4ag[Yɣ#@^;;I1rN,~xM?mU,p$2;a1HE|eW]/&ݰlrq]%6~0× CMVeA{%ZfDp"kά c㺋WK#l_\!,l8lblr⭑KQ;<8g:Β d^Sn9ޖZl 'TČJHkJfLn=4T'p+NWÝAe0B;`pVFA-3LR5fXjN'tbҹH"=8D~NM-Me(Ըw?o>YR~-JI΁$i@BOd2uS7\Xޑ!UŵxTy..8NJB}kVMUSn^dfXm&NjY10!?77{gdi&swC5"X9>xsAuʺ ARb(e"+KIF3'6[[ =Rh.Fxp #tSY[q~R"2+9/I.:gsGtu̬=Ғ|( 5^ N=Gneo/Udz¡>kݤ/'ղ7SSjmSX q3]{lIɬ`*]iQɟ$6^NG_: ;ž-X$_&/1|ss:.HaIJ6N6a;5`WH8*ё ^iCMkF(vȨB}=4絓IYCv7g*fwZiR.? zwNN> ! 0::KJDZTZ{=pfjJ!*ݭ"\Y0Ճ`+D!lP$}lԍf;=krBWcc}D57ҲtrׇAf]t2W5YQV1D(dtT\kwfU+h9UUJ={,_i([pmZTRF=+jҟz4ͭeցoB"،"5N]8 ZGʓa42d;UsE={6}\qۥDx}0 AfK'DA-֞)S?u;_4zDag8B$6IJKdQ ~eQW"|3/d \=6N}WӮ@=>Z;.%qR*ݠ౬oY~`NXx}0p2iM %e70xVc[$|8oђD~¹/#]6}X̬ƀZa E[(_5xE,뼄mV6 [4uD^BGW9wUpLZ#q֐cK"fBhwO(_W_7d%kčPK58PKdz=Thumbnails/thumbnail.pdfxdݺc[۶tJRmc۶m۶u{k֬9>z b lY,&, FQd(at Av %KzBh%='J!Crwc:q rt2o_ȪW;y~.*~2~<&}tp:i^X{.f,U yB 'XA0goOKǛ)uf/H<|/._y_9A[QԢ59 *<>LmO}Ǜv 5z=0CmOBo야5<W2 Whۏo $۔hK<Þ= 9v7-2Ӊ_|CkQ?Sgfs UuZ`iUm*HV8u9-AZGDM"'(zX]w?So/]vwRP2tF~nǦmG%Tcz jPytSEV;}EwUoa`< Ez؛I)!@C7;I]%@\(g:ఈ ,殇1GJ}'3wgP.~}VjEmi W~CD[^mUcbCbPCPe\D>gV͊Z<ɡ5+*;hϷo֣xnink-Z"$O{ q<^I3V~4Sl($}b۰mN`^ZmQxziIĎ( !|u)M%1qgPc\  kOd, LJ͌Y=l|{>C }Q)_Qb$7mfof m-6ǹAo*TUW4hʧ.&%MtNŲU'%^m,i)v)$1;'Jj)Zĕ @;y_J8kL7>_aHI"X%9bD  e`0lGy2IC,tP(lURõIHj`d%/hMg H~+u#Mٟv5v yıL$-""{ھ*(SwydT Q&ݡ tp]mZ.y ^VZ=y =S~˰9_1XNb3U̔i]9,XO fڏԠ.m]S]hrm^ pZgZTN#+ljХ\4*D2k2ۈ/jv^_S{`b̒ri=HnƧVK8q[VzLN[C:4T, C6uM.';oh%2W;.d~Av*>0p)<׾%zHS^ 2 GOǖ}a_r倅WQkz7Ɣѵ!93\q<"LJf /+I-!W+"L,:T0Př=ga"MX-cjReA}stlPcu2u.L(Pues'&Xķ2fw瑬 R*>[U!H >2:8`{oϒa6ȠE];9bь5Ӈ`ixo$E~`u{,&>k9 MasW4 2{Nbu1dF>?OFOY'%e:v5cL$`Z_d# SA3iB ~(S#WQDT/"gLMjw#[a@1W}0q>.nu$}pdV2驿ՏTߣsv97ZcG:+js)X<N S!o=D cV|ZW>ɹ2ᢰhX0uF^F%Po]D Gꆼ#QD*;8'YC-PI(F59QuB]Jofa؜b$]'ٵ][gDN7cS+59D?h a* Ng\kƃఓ> 2KE D@QZr P}e" #n$#жIw\kA7a={3BiO"kC Â.  ebU 31^ e7)91bGҎK/wKP~'U7E] =,Mc9 q‚qv@$W\!׹c6FxX4:׌Rծ[!K+^kAFUmoMcuHg@n @Y -ň`f Wwgd9۟P"\K2M0ybn&D!fjSƊ P F++Ӱ |xDCQeWclPxu/JC<ۀJ_c'6puфՌcB,E:F%ZJGÀbE* ^1g`$KLhno%;Rcb4&̈CD,ӢӝW]*a7~#PZ7ỳ7 lR)7ҽP_'Z#!A}ϩUۧVu%L+H<.p`vUIj.gL&`2Ct:0M6 U&uw1 recc-<ow3):nw'D`/wlv /@( EnyVHiXRفxυ8S [8# fY,d2i܇VK:J3bB\ h(:XZ fHC5r}M`;Θ4yaM JDܲXwLЁ%_!]c&k(֘ DG,3!鞰DoR 2-kȲ;]LTxY 8RZxV!WlbVO^~ Tx, ķVƞiBm4HBga][퇮)<҉`Jס+n/3u׺4PnΟ=$ASK2bY%eo:5V x=$3bcuzWT9[;4 Tu&Sy8O! g孺K~v~._#W ؓT{#~v$%CţN8a{K2[NNʞXfWC&ʎ:[>}$W&RޝX{?WznrM/kRi|||s_>^#T6s!&x*Juck1Y ZQs xqrr[/%;?J1?hO7$f3;_  Cy~R㐻,N Eƈ5nr,Z2!Bl"Ke"O"=^hʬKZռ+l=(WG@GKFx~z& c}ܛ׶wӳ <,T=2oH*AkO:g:DE2W.PzMUG .PS. njʥUk⿩N.]P<6q6r- K윎S+yo6V U>]ж}4.J^i|hݨyYzM (!I -J8耦[)b$Wf;j!:5QQYQZ@|y}_K:y&k^H ,w2yS%w<'Y:\Vȳo&?CTz @^Ew' .4E %mRg)"|CkIHFzXD߻޶pq-3|=}=J#΃gMn5% Ozc=|kay553k3%uPHf3D~4 I[J,j,]90v9Tu~kWpI~MkJ}K`aW,龂@؁];OJɈF#遛bVXނ|^hx`- ´`"[*9_ڀ^rk:>p@]vmf"k`"dgp[VOΌuq8H< LMa_&X7,~ҙ@5%ذPB=!1H-2gTW=A>8A_PO~U݃6 drQpҶwl+/w Q\a׸j8JܓYax -Hۘ`^xǼF\[@kVh}ۙ{8o^8#Dۺޣc(g=պ\t(?vm;bAIN ^}]$aVxa|̯}MC R0aIjƱ`6 3RjmRqn䴸"L:1 Yٳfs4߷yz3 S uiv<ֳVӀ 6hdeV*P7cre=^Un|5{5|v8BzCbg4kxĊͺЦq1( Ҕu }`TfΊLXR=/kKcѠͿ}YѐÖTV k]ݪ܏`OZAkY|1V;}D8!iqìo@UH>AҁaB*  .O.UC9Ať%H6c41'r%Iti"mh:0H9>j!>p YH=oݬ'Q0C"&'O GyFKIOL,N0x'M3JC&ء1pG6Ku"ؖLgJ6l7Ԥ;ّPq{{1R:~9$-ݟ44W\*,yEe_ʡas~ЌX竃؛L s8>g?ٛ?A[ksmϰ \kK\ U,Ki# {2X8P &JDknġ Vi*n0,G .;Tq%)V~4tpU_oeN>\ ,~i c-NxQJOwjN{x`znޅlte0-9]tmB-9E$ޟއhi_#zl;CE 7{;{0{*v7|lhH-4)V+}lEZ dB,.4oi%=(ls#؎4(lx gshn-=.%3/n,!Rw6 P=qp#/u'~F O(=NQGv5$s٤WlM\qAcJ!_|vɚ/1* RY?|uyf{p| |&b k/2^Voj9oB54s&Pڜ^I>\lf Wџ;s"1 $^oI YXz(.r[VJ_ؗ)Kfy3uV$Kqg7[}>q`-S,b}g o0ֲ Ǟ!f[ (foFfG;_P;"pD[s+h6i+e?i9 b?A6?rVfKӿE9Uv3zO 7M/F[2;%G%n!Z)X2c5h3e 0vO#u})llJxhs\V>/=I c|A0#y o2&} g9:UO ڙVޑ)Df`t?m)V{?Jlpb0l8f9`]JOEGi:֒{h>ԉT+IʴsmJ?AN^gQ#'x DxXjCvB;/\P)ZG{ M:4rfo#ʛ=B7?ezOtv ߯>gh %n3耫o,- qkIV g,KRMeJD9 1g71W֟\MְW8UIZs߰A|U*gK/&S:êߘw=Rԉw]_AZ7s@.pKN#Gg&:C~`p7-_dQlF_ Ç`ݗ1ѽ ͥYf7Jҏɴ6+clJeIfEElJwk)RJ%cߟ?kH!<1px`ŁmzNY52#j&DB I:#CrMT=",r]HeY6z}gEw|8++;@*HbUh[띙_Pǐu h4O2U,9{hCQ!GG(ߺ̹o( bg 6FLxAx(U?0%κp8㋧NJV=]cGXǜҔ~X5Wė)%@9"03To7M0 dő2"yjTFZ`uL.aj2 cor [=𵪱IV^LLyga~&\jDK#h8A+0J!:-ߜd8dRPz,8):˗c)myҭ|/ڢ|җcKC pfݧw#%կE5kЖ)0PƋ%PJλrBGEYkK^7\U eX2!Y6Qo91q1~*nݗ| ;i\9R)dYrXzb yiRPD 7Z<=ȭLjmVSɌLAuwSV6 9=N߮UyMjVUK $k4 (am 73q0 LFQ7"nYXXYBDIgb0rٹvZњo '^(052AF%ʟa'cUSC?0]ٙstB+$ Ϙ5fM ++puY`f?Z~vvyҟ?YgUAouwKTsmڃ6V翅)V$ajg j+"dYVֆV.%ߚJ*r[Ŀ#A TsQѨ~i{'> Y8# WxL YDB.F#'ψF CqDߑ&d,AwEâkY܃Nkm"\C>QM*̪}du 3v>AKva%~bⲜ'c'aBgنǟ.Mk= Ac0Dgݑ0_uZ7quX/ǂ oL3\wbtin0ȁ0f=gk}n!#z}QcGoMRz$pOcF B4\S.ka3Gwt,#_M~b]}?n(Q ~9EV=}z R\o V:vZLXcuP;D:'=jd/źjg`7gGNwq*V*;F ozAuV;VhsK\t4Hy{79+t1Fp1qyߠ)F>D][I `ʎRU@ Je yhe Bg᪗ '.('`(#uFWçOHs 8ԋһ//} o;79̧nK Bf1x?jڍNfj8gŜZjM@n2jTyXh3c*Ċ .! Re; $rm b31{NJUtP6'?n(Coရ!<%N"xN sFW!h`F`$~<^MOO8Ԧ=l8Pyy='xfeSG 5.Ck# =lE&j%% ՙPIݮK \><bЍ)ۥcΪbyǻM3sΆhN:)NkGsc<*OyU{żj1|etix.Npys{} 63pDZhUYX;g>~xXXgBL>_N J'#XƎ{*>%(롒=GLбaD-D8ʦ0#Y{Q Ly$_9MJ>q,@lbnc,ߖѐt\ 8]R&3X른&g+.k pr{CE=s,Gt|'Htu^;3?=YD?}Yl`Qnu0h% 6= c8OH?O9L}ŇK$kUmJz9n[Gp툕J0QRàXǮհi-3eI4[XRHWXhaޭt#? 0O%[5ڽÛGm7#0 T,;yp\y";7Q$_>`ѳwdp%2 a-]?M֧3X8Ћe(..H^Y%3EȪLl\c@-CHHkZN:kF{31Q.'/+2ubNޑFx cY0K XvUvobo%ŋ~W=.b:^\d؜ℂXƽO_^|.!\1~9&X9&F-=ʪ=I“o]3$۩c$4 '?St ̻ pp:2 Va Tevtܘ.^@xq_P5m| lM]G;FkxMj#^pU6Xw+bQ;7o]2ց[%L$}s?l nA-UP^R3Fݹ!=2}FcYz#;rvSbACALTPF&~y*C噺$;9u}e|\c[kUpfEhPv;ys?${?)Q2ٜYuO 24\bH/ؓΥ |`b.K ثd|}XZ5uE{WST3|i}l## ޚ7짴kBzek^$@YIXmWNm)~@K&p,Hn*: ˌ;Q`믩í9qMSB1%́V9Tbӳw?"&?u]E#3c|T>00+ը|+ _4%nI>5y<E@ܸXe 蹖^z@v}Ւ _ ]^F8({ ezXSc X"pVެ\ nl}FM )m/IeYF_m]q_y?C|K>BM )J疊ppۏueJK~(!7aE4&U%uX<\fJ q+Ǻ3gJ-WQBV^rMmO`oo1pUtb ʭrnr%[83߫7Ͽoy{x'-"YF""aMQ_.;g_Qc¨3sB$H^suJE;;uE0niq^~{bPh&3W5+Z`SFT#QŖs%LzM3*Y)Pj@UmhX^ϰ^7Y7\q(<[V2cVKt0,mɇ:r h'aKg`~n[^kQOմ7M A{(>˾FB5^Ljʧ aФΈ0Y: Z߯&Vڍ0@sל.gʫtCϷzXb;lr;M+ e4gR!WFk܁BDMoY b90! G?1k5\b:0s;[2&QwD6U<^^ZQV7&~x$WhVljXPUT__DC!&X) ر-Gr2KJi8d45rJuo|8Ru0Itbmke"s=YI80976䩛ǯxk0B-swy|lC X&PU: RjRvm-/JBuOԔϓ򧻆ҽ|yԭ(nҿ6/ T:(]oR4O˸!3f^H4o OLr=,^hxS΂4o&bR-ok=qJ(\1[OJwNòD/~!l/;zЦ&!*eC1tPlEѾ{j\$ KU{ΠLA[jKK$sNH*,b%K`ɷǔFahRCK9L`E΢M_0oC{$52`@gaYAG5ry +ά줍ݦ/]WDBHM;{_Uؑ$G`F[fP|{HC|3EmtɼdC+ JfmT;P"3eH!.Lh70XI%a)sa*x3sLߛLX?tmYQG\"5 FIsK04P%&o DvE7 OٰPޯI^Y4SNr~x~GN8Ki@BLby=FΛc| K>=УVTŦԾSkkgj *7EA[aSg[@;1˽-5a?p|$ ]R$Z`TWJH=B^U[6|RQww+ӞDcPR 5]( $. Ca>NQX[dU #)?A,);Fj Ũ|YiikI)#g,+.bJ,S Mc]`w@1B wd _msP~A #xCUÆW~jK[m m0)DB-T(v'쭳:Ԏ$c5{o0}MnWܔpSf,ngea011xMsv@ Y ^'!XYBNmN O ^df05,Al?[XXXM`o7enyyXlN :ʖݸcf;mulc۶NǶ1;N:^{޻cj}Uk֜Usg<g=-%־`L:2 *_eIGt%5oXH*Z+^̤jϴBPKmZ~ޱLqSp*}E\}dDt' ٴ]}v{&Q)/*M!)*rJolqgaQ^Jݿ5 vvUB6`=`,Du\7T1pr3 &~SOtAVҧgOSKuPZWih@Eu蔨}(cJЄ9igx],2oamH^)M׌bBk?RRlBu8Q5tJ6 {7OxZNR#qy/ TZ!{7KViUmHv!>mKAa 0@f 0Ye~$ 1Ln:.NMɢiXҊw,řV(O:%])0Ot1lb`E&+`@1>ֿ_(?;k5u:gxUdT ni&}4 9`v-&;A;g|8͏gpE~ %✣t|CZ'5o.2Ugߧb"k۟TK펮)#ΊY7HygzJϲ3I^htֲi7|_av)4^d~No+ bXag" )Pʪ+G y^ Df 4=;KUpRnEDŅ2qh ٢~.'Ƚ.ڿtr<4 11|/R$| ao\@yD,^\u@OP8;D$R wОN(1!qoaٜ- {o4 M{X^m?̫Ԟ=&7.CǺ]gg7=w,J W&{H>@ai2Mݐa0ƾ,.◯EsT؆g F3TriCkvtn'tY%:Mq WDJ䙎sU|%K' S;S˿Kv/ovb.#W.h*OkPr^55m_%w(!Tm9`GaNGdh}#rBbE89$KJR;цGXI1hϘ({b83g'.Nk;Pq^2zxA? -dWʶYFb2k80IiOx`jD$yqDє!@DwwZR;5xw9m?THW)@XѢ\Iވw(5NRi*qfú{{&S!yh1E2ȿ6 5 2};ET,sD*&M% FYrna1[Ȫo3,>MK˵w'ԳXPi;J!цw(hA} "ۊ3 %]F 1}5st{c؂MN9gs dž.)m6#~Y\MW]Y47>⿞ Dnآ˯f?\=xV| XCEkcT ud$tETq;]&xTbwl(_; .yޖٖ5sxqVj$ PKվ1]Z&iۥx?3;MKԄshjy?Pwh|q ӐqM<2JyarLO.6^7 K{f%Xm-)74ݝظZӧګ2JeU3h9(O͟R rjsٖUC*4eC)HQnJ\5cC۳cgEL_~tGA/qPԁ&c?$jkJ3BT~jr*6J$,j,*>IF/vSD;6J)}^T޽aV@;l,#QVW0Q4aG;()YWKI/fA(RO[flt m[-iI%a\XP)Mޑ>"W0$-R5(y%b4Fzd*4ynj%T&ؠQXunKLys>gl"Qincc`@fx30hY]8Eɓ8m+Y5C%WIJ.*Vޜ.?U_]ApUTcX,3݇8F -A>'zG# @OghzL2$gM2AK]K?x\4E8`<U2B4䏱>@Oz{81F0 G Elvm6]h˺®qfCIqCzV3&n`-%I<}oA7j/g<8iCz0̙a6.gԆ)v@5%R',nNکC LeLvzJ'榑l I tc;I٪8.C fz$- lHH 3Ji݋.,<0,a6^B>^t>:~*G;&q,lϗ]\H,ZccJ:*lFFlE!ppnv-]Ҭ2*)8R<`A9 %"ʜ 2ɶ2X3\XXmtͿuoRͬ&p>~3VJ_hY [W7+rMF %v!{fiQs?2p'yk\ @nwA2o2D.Tڤ"EiS*gՉkO{O=Z %FyypKGH*pY|~FtхSpB;sTBÉ,~Bc_"_-BX$N\ ];3Aۅ"ĥM<|1(3 b1 +4FN6¨VdOw&^0 fVr;$֡( S )ik08}!vL:Vw3M:+,{Y,O1 vP3nڥi%K&"X#Jj\,dYy{0( LϜ8u!KQ6‰tI̹e 6.nvCAg̍vWO |Ϝ9ft^X)FDXi\ALҮ"B=Nk- [- PQ5yCmI;=wT/8F+bEun-Zn7,m'AnϨtmM-p 7J; ôISI5uַ> ǝ4p^)ܪ*us=Ϝp191nfr wC]|&tW$Bݬ_shD/^;|$tX7g<^K~>f@ZsU!W1ׇFTY5]Ӹ@LwA9騺z[9IԬGE'gR_ݣv`zOd|Er]toz2i34\ZCd~ւT ؖ*: \at?$^,ON}h~j+n폠;xj.(^yAo6F.~.OG@ }ѻ YcRFQԬk߂;DF۹co3k%m6tԋ(oD\"ھ@}݈WZEyD^^,҃u/0ZH\Kp-"rTnf}Kz ]V%XۧKY36,y %=؊ Hވ>y hgz­u}ϓ'luڞ>o?i}!>B/8;ZB:qd[Bu?C0#M@#\=M`KZm~7_)~$ט Mx*kvZ49bl 2ma gJ42mJpog-MSЈcĢf^ak]FIlr|2\X殕 )f}RQP7{>d7d ;ߢ|^>t{j#M=z>1 +1}niVS nS]g*VtSw #=yZ~\.;W`.Lp;Wm`d!C>zt U׾]~U_-l,1fb,={0z'iW?L&9r0ai\Xa$apƫ[Pn˘PI(R|]'ێ.n2颺Xmk-ڣoPn͏ f @k<3ɂ`gQzWKriuC͔wXAOGu SN7^)"t'$uŜp?Fj`~Wv͓2b``NK\ y\ * "NUR^;Z;]^-8=~ 3֖c_>N=3\NUʻi`Ts3*pɭ~JM>0e'/:8 %#(@1h%0ɔ |s`#>QEz/,2>JgNP3z{& AII/jMژw f؜q#/88U9DX`PH;U|t)V}/Y${JJuYh^E7Nƞߢx>؜J-Q>ד,.u?n> 19|vNC7f xW:QKJR\q+ s֔_ϥgx-늢-4<= aR9p9yw1/rt9n* 't@洬d{m 53-a} ]wtV&Isj#;m@llVw@ȞI#t܂[h}G\_A1"zB8)\; I]e#A1*+@]i$$+;_ NPj='`ܸr:}uǘwKW^9_HCя-{ !s1vp`p }(L[8MY;h G $F:4lLa'nԇpi @XL-2MD5xeC4LQ# 55J|glzӾe^|&@j0Pɻ.Gր5y:> :palo;{+08v WU1 a'd(~id?nVhXc֋"glAmlۀqN+IZ*rB0P#@$D~ πF-wyt%֟#J=4 .~D24Ez'& W N\V˧ k꟒\BDM <@%vo\%JW.6wyV|BҧWoHfvB.jNc!d|!! L(Ob-AI۔8=jY;*SR)IR9:.(lpށ=|LPVTJspvޮ@wiUudTdbE|fKC:W뚣[ًYj)Ds=y)Cq#/(Ip>fT\ 8RL/ڜѦs%}Sv@X PBoֳ48`!GysH<ȥ&3 h?/&xZ_"iw 7˼)/&:je+̟{%"ʦkx!}x .¶ إf{dfη6j9ZG*M[ cs"DEYSCxG T* @"#*g Ml#2d~(ΗJ"go4'w$[bnu?|_^-crf%7e2עGٿ{amn:>W .2v;|ΏfY=sܜe︬u䔛3"7$ҷxx9܀y!)/ i=nK{7/>cy~픺p*>A2M'oN&Z[N۹#$SQH7?D#5J 5CD% #+[fȊYxeG /Ó'ߍXQs<~j`;pgw*pY!q@O ~ˑ`D!GeQd]  Ṣ~c/q'GufmvMDj.6 A܊>$iz6|< ٖ7閗aTߍ=FjAMtTm< %_ֈ1RJR>7uPmu*%%,^8G7k/8cnţxMf)E_U>EΈm5d's m'Z؏}D;UbqWJ$-ɀ;O%|Ȩg'3Ȱǀw7VFV 0G&dC`볻I##$$&KRpWG~>f%VH,`8!6F1Y"|;B+Qo}!~F̍i+exMz”@vm^kէvANUƶ΄u ÒP{64q ]OXi[=g˗"-K S@@b1)ksm0|l 3z8|c ۗFx+ oHvE$]U|WMX$ N ۼP `xjc-ea|{6PlD l Daw]:B3*:^#};7R ^̳{կϝs$I'Sۀۆ۶ _e{u!-ezfd\k]dۨ]>A,IZb+)ҀLb:w7y]ɰscx3PWʦ!ODl`iuMLƌ5Wr `uzHjO 6̍8\>#:"REYƜ* =%8\G97bL#ojc!y+N ꅋ?F9 q/5gBkԈC6pDݢ/obTqWeeNxb# gNy鋍GېVK|}} V+7Ђ$t He dFbL^FU271U$m*ʃTdb9IECoX:5#h" f/tUSqj5%ń @v#i,ZDIӒ,TRoT˳|m_Emo(v$;ӫmbsͫJA@,%VmB]kZSk_]ɒt݁4 wcA4I;Hhɵ֐kYKJF0uZc3wF g xj/;O;<_a~R<1JuGq- p}Żt_ܥcVnε|NM/ c'zk^iRTO^*ctx'2W[*'fLכ]|D\];oh}^ں>:/w]1T9,_rSVG4GP2ܑ-?oH>8q\9DPnY??М)ӌJp1Cbt]Hw> GJdN (P5UVڑ W؄kU:n~x #-f*Кr زJF7]57ɯ>oCg;TY7\ko?yWRU; VQ+R<ām+`a6ꕱ^Wu%Yk`|,GJ%O2RnG8 @JFK8%iaHh௿%(V!l#!a^&xvxN5>0B[(ҊΔliXΜWr1R="MT.E8X96{cLr p׾0+6qĂK )tU$K*~XOwLg\:JAiu4?lBr}l%/T0o"[.3qdAltyM]K[^V>S/+Q7ysTG4Bp+( 9o_!\Zqu§ W{!  xcI-$H=bSzJܗ?N9e4NAhJ-ٚJx}>;Z"܊csRƑBX=s*}!=#}#$Qw&zCjCB7Տ)Mjl?o8v:BI뜑dJY #Yl;˰& nwOY+pZ?g zj7rGB }-Bѷf,  . g#mAh(%t(Ҕ{\]Ϗ6c$iț Doz0G a M7( Bwhh֒ [a_ *̯`jO$x %JA4~?mr< zMs^?|zuMsiZN\fNj &{h{irRȎA##sgB瘤~؉`9ZR^z${!r;s'6i&vY8SGxXھ[P%wpz#bۀ.nZ"W|Ɠ?f<1:ߑXO_t~HCcq6W8jTiuX$ DFh'v&:Ÿ&ZFqM-)"΢sc8<sYEw#Rt r/#qÖg4h10KG4u04%ZN<-5^uf%80@XGĆ2,|.%Hcx:+H1G}vb?y]F-mu^V vcK,/O9B >)eGl$רWYf(O$EJEm_KcaL Cl6j(N=QIO ҜZxWl -\Զ W.g)t[>!J'sWYr1 |Vn^w]c{u'H6q0h|}S:?$( MTE,X`(krp+|ui "4NenS·LdxW_;{BP!^.k$`) Tb-ؽT=/@&0_u)p33vUD8Pw?M+_}a'QE5Z %y&;W=UJVPX?aaI_: ()d.>^~cEtG;XET NRrH E.dCqs=x SYp)KU7.R/CFVx>3[6#NӚ-d*_כ\\|YU7`N.U(ަ  '~kB6Eq|&uϬ:rl&›ՙ(8G+:d(~i"(@i".[ZHKdR 9 L$R;dU:/Or#x>3J9{e|oͮf0+/]StߺN9m{uC&tE͂''``~Ђ8~NQG-o紞>$;K>Fe0n[zaw @kDn`f8џA>?~`N vRwĮO#LN5.U`[*&IjhAG81e݆X$ N8.9m/8];<ªͳz" cT8joE_|:IFM++t@ƃ ;tbe!mp2RvdzqH";OVhV ضB8fҠ↽]LB͊<4~ y*VcG$,&kr;f~|') &XNU[/-Z_G|WU+$vُ~_Y/T'JH6pW6Qk7q@8j|Q*Q59tȂ&({UcAo[pdeֻ|a_ưfg}ee"dd`g"`. cW&w^5jß7d dde vFWk;}m$^V,lHl 67}T~mom~!73 3 !g`{ vT_$Zdfx:fwMyfD?M,sX2ܠe{7`zQoƼe̿ʿfb_&&V^PQ^^X^QϷz~+zy}__o+;:[^\}mh(̤M/fod.E}xm~0tRz_cƊbCK/{"I:A ̍4 K![wKE=;֮ټpÌBHY93P&ZphI\(xvY264!,!܎Uqg8jwÍ*-)wrW]U?H靥r^_"M8RU7mMw R[57xL63nLH6T,z ˬVq@,{v`lj aG҅^p-캝VI5J]00ƌy'@!C?qR"?zF&\~?Ն{4t)$d(_"PqWg%t"4-Bwp\ 'A@8dgJ,#$8Bq4n1X8OG.ea4Ε@&vզV$\y=l|vPncUSY>ŦDȝD]l~JbO߾vϓ?>oCuhGW_;wwc>=vՀ4ex]"lq&%6AʭZq z C`! ANr4Fm.|.,=Z' _=*7L-FdݯhsT.H8qM޸3 mv="&t }%Hc2@wͣW6O_Y"TJ&Ԇ@SlaM*CP|+h2LXip`&Y2W]ыf#˸Ϩ,ѩ?/rB.4gO~]>[&QǰO}ApqPa)m:N+. Q`EA#MA{]:7k1:♥ZKA'[^%:2X|qa}D%Lmc&‚vHֽTh2e"=`"e%=a5slx1f$r)aYygkd9<5s*C .qyi-<$bgCY~0/9d;nXF'l/|tqfط]PKdP!PKdz=META-INF/manifest.xmlr @ w NTc9͹0Z ``D_4j: 4"V N&O`Ъ"y (kڊ|{|Hoj1%pX60OnEUfNR\T@ar0m30Y`)*Œ3 q'Ug'W6VdHγGZ^7^0bۆvK~PKyln PKdz=^2 ''mimetypePKdz=MConfigurations2/statusbar/PKdz='Configurations2/accelerator/current.xmlPKdz=Configurations2/floater/PKdz=Configurations2/popupmenu/PKdz=JConfigurations2/progressbar/PKdz=Configurations2/menubar/PKdz=Configurations2/toolbar/PKdz=Configurations2/images/Bitmaps/PKdz=/CC--Pictures/10000000000001E1000000D761463138.pngPKdz=GwUU-FPictures/1000000000000275000000BA3B64A6DD.pngPKdz=@-3Pictures/100000000000027B000001F109571736.pngPKdz={{! flayout-cachePKdz=ǘ{գh content.xmlPKdz=crp`~ ~kstyles.xmlPKdz=h{meta.xmlPKdz=58YThumbnails/thumbnail.pngPKdz=wc߭~DThumbnails/thumbnail.pdfPKdz=dP! 74settings.xmlPKdz=yln 9META-INF/manifest.xmlPK;crossroads-2.81/doc/xr.pdf0000644000175000001440000276707012130034072014430 0ustar httpusers%PDF-1.4 %äüöß 2 0 obj <> stream xˮ-7)!GH$O۽nw9:%erUq/7w[ZMy_%zo__Bzr}o-|.{;?~'P罹SSٱoũ! Z~hJV `^5O.gF4X<P?}R9?w2tAAOk%'ΗKkiSN4|6Om,vo ӡTtW_8 +Vq"P6^7YmeRƠ\?κBu}&S2y!f)wv (du []+*-8Xϣ/@ZVnzW[X" GB&} g2턶Þ-cZb;?W8)H>C7,~B^"Am|M/[|s=|s;,8w97Ȣ(lUm)]K%@=dJqat \O 5W%,^8xS案FHɧ -/`,ьImQ3F6e#] t:\yDūg!Jxel.ȮzNFgTb#7\X O"V35&@iCHoˍFz]Az{}ɹ\yB"te;Iaw6vӉe')"&HSc+*䛲sݪ/C6'հ#*m!5zgF_ԩRe%?ynvxn>j==;ev6}AbLB>oI#%vYuLRkZr!C֕dK-L`;e%i}L/b=`3k@hZ OKVDXuά3KjRt6gS!|l&ɖdDhctKL}j+T6\ mt-x&5ktsGI$'  6Vjs .s<׆9+;\[+Q41y:H}V(_#*t+ xhIh^%DW,v8D eOuD|J$!=‰VwZѷ;^1m"6>"9n/q ȝC0h}=q)'IzˎRn6KIT˾SrJol/5J@mmCͩ^65NȄ<G B. z}8̷wU'e6w?BCF_8?@\^`Iy?qs,Xܣ_%h9f\X3-0-v2yk=Wg׸(P`,%ẉ,\GgG])e]_i`*F{;@R($w+.갚%pYL]ݢ/", >Xry~Gw j+}"n۪,8P7jh>뺈SZV,ldޔ_iδ*?F1۾sDL,S.7RN|J=&_M?0͐hNHL5*y6 VT iAKB_mL"dt:6a KA5SF=R׌u0ʡ& jl[);,;X, Huv} )X#Uiw9ST>o+{>{ʟowksJd䙭 lZc+.-L^kH S=O ̓$By?68JgZo *;IB~ז\wA<zk9;kesZ~ԑ]^JM ϐUB#!/yj/#}0=4!l>6&7:h#LN:$ZSBNj)#rL_sP$y En>[x9.nܞϣؾ}bرeZE+)xH}͉^r#Cjv,!E$ua{* EQ-݈MEI}o;>wf!?O>VB<{BYec):R(%~BJa "|@'/D#έ8)]-mod:eeB eF,xOrgs5]yC<ߒ[6C]e cxo͇  Y@0F>'m7$@(Q4'9@%`"QfL>(ٲfb+|f[_)s"Nc8$ J 2K݇hiFe1OhhQp<$-J(PJ,QX<$Z|a-wݹ3ll4)uBOR&tw6Ӆ V%gCo;j+mWrF.S\Lb+Nz^6O$NƄE4w>,/xf!3 z QwNq5Bem|UL Dz3h9}jXo!̨ab}fF# w<>]aG#&tl} yg,e*Tڵ2ƂFĶ1]ah3j6I싹KpL2J^Ia\v^.n"VA}g""幝wI4 PgFԫ|@6XbEN xqB-ߔ}[&#!et@#ۍۭȐ[2ɨ E҉T3Z/JC C%$͵VJ(k H/3Y ,'#3ۈ.Q<x IV2`Î:^B,%G2d0;3m x P2- HMيn㔂 W -|j^G.-IiBk7j"=~(:)G35Iz ,,/Pώ7H u1:@#}|,_k͹sWm$ "}ߦI2UvL1:*[ܵ3K'җIJN6E(^3J7O= O_NAb}F"ڜH~飓 l&Yr*oV5iA 5wn5,>}MjXumslMNppߔ8̇9 ݒ2*:0'$ŵ8S> 5_8/ gE+b,ŭ{ PHSd f9 [~VLf_֫ )W y%eTWFc2_823jJp[[ٝ:ϕ+1v.ʆ$ϵAD/ >?8j;YN ag)1l}&Q^VOʚeT ePˬ5[zI٣n&>޲{JOko T@b7gǼ6ն=3,m=MN束*{ɶJPRbuJyc+&J2蹥#[{U39G4h|1(JK+'Rt? KozJd> 0&`,II{%7hei6s?V*s҇7n'SRo%R@1YMe>V┺[Wq{pbz޸ #f  xJws&}8~0)R< b!/מ^ܿ[ |a"TT sLD1d5^n="Dͳ`(*=b&.(h>>dewa~mY~a~O rZJ;=ja—EKmuUtE^E'd4^VD߉~ Y6z-T8/Szh_DG-g%[~3lUJ<<7mkt=4GqqfgYV%o8զ>Y{ 62Yf]i;<>7ؕCSlo +g?gďo pq~vOd9O s9Ƚ@twR/8wa<8$ӂ|'VK1:,maGy>ߥ iaϲ;Ftj蝄y:_~*rrUK?ל+?gKe5|ɳ8o9B endstream endobj 3 0 obj 4778 endobj 5 0 obj <> stream xͮ:bӘ`99@n N#'@gߐY Xk?CKHUEI/_fg_ϿT_׿?GZL6Wuw4w4uU>(Zc)5o=s=ϊc%߮ ϳ[U_vn{\Sk{{Uϯ-ʯY> 5h;Y_NGg]UfO#IA%v6yM7q8+ 7yIl3b^:q -3Y l:F:1Aі] E54JAE:54AS>hIwҜ*hʿ mƻU6Ԫ ^.=B|j'Y+T# wnɕOǝem+`#/e2FtU#5Hmc8p 5B6@jΊ#DIWEC tmx!6-u8H'3!צ)!H';DKBZ_2ZAڡ_ ъt u. iE:חQv3A3Nv0mSAmѽJ^mv 5zՌmR^m< aX'y68!6èy aDFMa|@<< *};:)Tj|g9T=T`upu>>&Tn9~; s-glޮ>ꮘ!ɧ;pe0gbs8C_"%sm kF} ԋ/ɑ}\3~;kC)v>%B|T_NɛwhNVhi'jD=gPIaP tgi#sMHrdղf$MRK.ilFH ,Yjuͪ3T!:*VPhOH+Xl UyM+Y@PEM iK4j{̌sf6 X4ڢ,x`ZD; v"oBVw"wVI `E[V453XyRgNF'/4'~\Gs5;{ütѐufݨɇ+kX6d_wVG^}[hqaUAe͕$~ 5X/i#:tGkӬ?p厸%DKBz~t ih+H;ѕiE:nQNt?J:;D+": iE:9ډVΉ+Mӊt8uFKD;ўVm (#B F1[_z55ʣԴRC: 9t8ekh;+mDǁ{X pӴ=c%=NQXh#CJy:VzXiGXiNJ_Xr =u 5]Wٛ|0ݬQ>/.;EC_ԧ uٙb1ϵ5r\kjB\X}Yꩯ]n_ y$gqKFU͇}]yWi|xKKnLH˲r~pm?Td 5Uڨ"_ޖ}ym@n/6׿?9qȚfӷY`*2ǘ7H͵wh"mD#IG^"JԴbt1&F)hjx$: N7J7'P[4DS:ggNsvh]KZN8YMHFcs4Ɲ1AcsD g~FRCJcg~FR>391ۻ49l>b;s|w Dz/379`' ]4Duk1Í|>VOYGi%XtTy?|{Ц+&뫴!l׵Ng?WVuɩ 9l{>vj^Vg}_0t_0$mDUeTUPUAU Ujj&**h^ Z{Ak/h^ Z{Ak/h^ Z{Ak7vCk7vCk7vCk7vCk7vCk7vCk7vCk7vCk7vCk7vCk7vCk7vCk7^+Z{EkhWkqћ?qњqe? \9s}Q֮7#%aey) VEC[qї|8%Gwɚhj_wj3`CGFHkHy!@6@jHMe@SC:ZF\ψԁԐm&IѵtYBiyB- [hډB=3݀悴C[hZNk M;њV{ I[Aډ- 4H'ѽWNt&z@ѽ@ӊt2M $+W{ I0tmai#:]Y$ : 3$!wgIF4ӻ]I:^];j|-IZz{hUy!yQ-9toy1޹;kv{^k HfFZIS=HS5TfI~7J~.F?PK:@'} kfTQUFUUZZ[oH 3RT5P@UUMT5I9BTS*@:TfTQU~ST* :Wρw_vEǸp^YlC2I G"VFύqGcFݮ }ڿve3[lz'mXӬ]HE557Ft}[whHLH і4mDWt]j6kBM ޷4mD'gƚf{vGN4%zWtiڡ|5M+Itiډ|5M+&i+H;iE:pDډ#w4H'Н)7wh3[M3P[轹ݑteiJ}莤+cMSz}MmnޛgxtHi Iס;{OgRzo@6;tP^ek۾yq+c•vό5 >%&?guߛa9GB*[NsrWΊh83E)eoç=/ l^WG ~%JTlm-QyƤ3(O>2Zaʓ<S V JdJJI+h%kjT6DPz~4mTŖ_YiEV$KAj١GD>o-RTUP*kn}DHH 2RTQUGU}Qm`4mDsI )TQtw#J":挴-6@jHцjm :2Ft)%I۾&^d|W{wߥF'"/4u~'P !luzvrS}L3]Yn K[,*t׎B&HѝW+iΫԐ_ZIѝ&!Dw^&H p]55hH!1X:R`UcPKmMJZN 7)&鄾yN1@:i@ӊt ovъtB,;ASNtEiE:ւC,k-M+ }h':5u|~ i虶Z$mD= һ t<'gDf.7wUz[wUzk.߻iJ3x= wgIRz'I]bT Okԛ@}'oPw"E]^1o(DWDZ>^ôO^l;L5^;a{$} t9]O6|MMSձK"i; W 1Nh'WJZNyJډ iv,#Zu?c;4,5;KmRs='Atm>i#6iL6(R 45䲿X)t?emgCt-l}ZBZ^ $iK.k;PM+Xrɤ%L*iK.c.8 iK tM.4ڦ,7eۉFoR"E끔gm6VSTGy '6?GRzHlyy߉ "/|F@_.]-[tyF@;[tѷH'4=vs Kahre ;$v_OzaX9_ 7?ndN{SCI;s!QRR$ iV`\'i#Ztm\'!DGFڈNT5Q$U:Iѝ\'!D3ʨJt_%mD+j1Wt'IڈnQRCj'IjHOrh"U!mDˁԐ*CU;Nѝ\'!D[F:j')$mDwrT}$խ$=wEF瘭#752qh## Vد.yܑ|ޜN AaqeQq;uG;Ώlk|N"ܮ /TWgStC75}>\S uVU_>UMҼQhm.yErO&FwZ`F,N%("Ho V?IԊkH;њ\"c0S}{(C :3Yl@q՜;DXMYGjjB6Ui+6rjj`So@+P+SӊtM2y˜2k \1'ř|A?Sr1083ݝC W0]s~йQ7E ~4z:ݵTKxsS '=Qe=o4D%qAȚS_+AZƚ%ZK.BO R.7ƸȾ~mD.CA4 **CUv-!DmMю:j&j/F.i#UeTQUAUUTeʚycr 5SKSTQUGUU T5PDUUEm6@jHQUFUUTUPUAUz臨!D[F:ꨪjݦ?čfZˊxO-:y^#JOgND<_|kK{]#ujZmE7R`)hkn/QHP벞] ִ}AT{ꚪ>_𭛷O%^"`{M6Ʒ3a:\ VMQi-%i-%i-% Z2h)Z h ZhiZ:hlk`k`k`k`k`k`k`k`k`k`k`k`k`lV [vjgfכ?'/+)Z[G_h{jؗ7r]D9]4UM9nJݵqIs% yb母>pϼi6׾z^[xܮ ^{v% ^{\*[at*zXϳ;[3^"{/?͓Tm l\]]זvj_W\}EڈÕ1RC:`6@j"DgFSDSAڝD?!H/H;Q=2Ҋt}m EtAHH+3? Zijkɞ.,t[ ,gh9X1 ڈ RC:_I=+A/%%i:~$m >Q;j;x-w,+~IZY"/; /+@J^Up|"ӥtt}~~3" s۵aWDWc+w^E}C5Q{uNٔtϡ_414m8;סln>~v@Zi#*'TQUFUU(Iѝ%i#ߋjvN;'JFtDIjHIՙET9QDIՙtDIڈ(I jPUEUUUTP՞S4AtDI&j3'(DIjHѝ%i#ZPUAUU2TUQU3s$mDwNjٚELEL+Q,?HͿ{tw,&gQJ{@E·/|͊u }[r:zn8p׆ /!_)ɩacâ;(l{|JV02| ׶TC  e3(EkLJᘦ qɁԐgK1.HѽWRC:6v 5g5#cEKȠFriE:FH;hG =蜝!ZNAeA=蜝!:ւC:ggV9;C]{+jZN~jE Tֆ6+t k"iI_pI7,vzo~fg$Ѓ,{s΢)7?3~fg$gvFRzoE8o1Y ٿ߉ }:+z{EV§_{iS. NUYs 1;U U~s޽g֥k򋆙}j!˗(yԨV_#.fSӰU55}PUSy(9st~V_w9V9؜_7׃Z>myWԝ͠?I[]5_]͵k| ! -H:@HZti?;>->"nx$Dw| iE:o9v-!ny񁤝$H' m?H֠}I $mDH:@FH '>Pt6_@RC:}Iy@@Rzo~I齹t|wC|pԗd`N_|k|.\->[| 8vZr?wm}0{`yu<^WyÜFr$jvECԷ:Kw?v3eiO࿚.6@jHь2* Uj:jԐe%mD*T2ʨ 2Te*j:ߊݙ+6@jHIReTY"U4 **CU* Xv@ZVfdZ̒LkYQbEG1o^kcŔFQwQ_ E1(F_}bn%QQڰ^whNOCls K UMu az4;='k)ق;e _W^׳?U)x{DAډ愴"c4QvVR& N%)WFډʚV4`4q0mO10$?J? : [SCz~ti#Zt_mDԐG#:tIFtzԐUUOUOAtzҴxnۑt]ߎ4m0b 55:[STiM 6ԴMzY_&TMT=vuA͞z~ͬ箙[;[h)*ӵ_umeHNS<{;s.ZtoޤU/bAtdj&ڻ^iJIAti#ZPUAUU2TUQUEU;Utkڈ 55j&j땦͏x!D׮W *Pv<# JڈAMQUGUU T5QDUT}It 5hFUUTUPUAUv8.HJ<FCtE%|/L<}}Cp4, Pڝ"s]XdRFD뜉\Yv;s}M>aA׼?󩚜ɷPXTb&Cp'N幯^Gx[ im$Z NԒ&H'Zv׮1IH+Igv#!H!1)H;sA!Hh[IZND$$DQ"vgeѳOH+IUt,ǐIˋQS**|_s루h޷y#i:1;cj*Z+bm?-5ͷT 57v^Y~OUtKkV h1RAK-4@K-t2@-L2ߑRRRv n-`l[v n-`l[v n-`lv lv lv lv lv lv lv lv lv lv lv lv lv+nۭ`lە1īC\w1Ěǟ6>{xuknわ} m{Ѱ_R*j;M6ww۝ü_p=!HqfY8"}^oMQiw}CatG\39a߯5DZ%"Atzi#Z*CU*jKf5mDצRT5P@UUMT5I޴W0@jHѵi 2Te5XAt} ִRTQ@UUMT5Q$UFHѕ9!D3ʨ 2Tej&!Dn6UuTQ@UUMT5輢V"!+ZLkYъbEG+o~ks߈VDoF+_g~ʷhE=u՝wr-Z[r=-Z[rgrhhsXQܵae}oKu1ψŕI{bךYUyk!AVWZ"$ʗtӍF=7WuᄡBPEṽ%?8=?(4QdMkc3߇=`C5֡Ate;iڈC55hHut]N6ӿY?tg;iڈC55vҴ-~ xzDJڈV<=~o%mD==~vҴtN6Ie }^{ooW{?x5?<;œ5 >OXumY*vsueI2'8>3oJ 9u",k]cumؕiF߾@]txϵ]y$]u[.q߽ڰ$Ys%E59Ջzx׵\XިcK4>篦]͜Ǎ-u>Z;\p-[}ۭS(ngU`S\Z h)@ Z*hZ:h頥ZheءخخخخخخخخخخخخV [v+nۭ/ƫ};c_//k ڽ q8X3B ~B9rRv/; [0M' }|Ư@/mp竣m殍puaaZ˩}Gw9TgᘼZ ּENuYtf \,@r N&y2KrVag\B5< !R?Wpk)-4]8iR _J8|ʜ« N0W{^}g$a_ص˙wܩr{6S.|M"[o.K]Ś#'aZ__x.Fq f~LhW=w2z'XQMT%#Qa$z#G&oYQ42{G4WR61H@-!6gb2#ZNh[[{iډmϩtB۞TTHFH+ mk][mZHS*$omPݧThJvR>BS M8Z?t06޾#;b0>`dN#_X]X>X s_ʘbI~Myݸٻ{]u4EbsbU6sU7O5JTG-pHwlj6 L@ZCkIkYDIZ2hɠZ h1b Z*hiZv3n`l7f[v n-`l[v n-`l[v n-`lk`k`k`k`k`k`k`k`k`k`k`k`k`lV [v0ͧ{ 3wa^tq,Ewψ`Z_0|_G\4.vWha-] 9\Sy|VwޟkG]gtOeZL{ܱ֗㗥ᮌтׇhxjcZ:/kd7l-1.0G㒌POaٵ]yŐu|N1; {^Z>~}#zi@l)AgD@jm"Dْ6׮ѳ?kHєj%'`$Z R?fFO?!`e/sSl{,.i`\bw+CdqS\\}61qN疳4ufN_FfMx$Uk!Uo>&)/,D!F8wsʮ<~5LN 8x6},.u0U˹Vٗ%*Q>gO?u8s׮҄e;m]Znsh;}s*;UtQ,ҦY;5 Ago݁6k~t#m@| Ԑg6Uֱ8ԹTʪӴŝBM\W Xܙo%3߈:vV,n,ΎƸ3h1VƸs4ТGhYhڈVlIJ#Hg;@Rl'ڋOF6FjAwhngi ,?[OGokEǚA8'_f ,N<\0n4+E}N>$ t{Es;:+2I/mXP|M͔+mP܋o?KLTaJ#V "DO4﷟$ N4\: C4D-!o:ւyUuȝ DGBZQdLte^Imme^IfntW6;JRrIw$EUSt{y6{PRC!"H=W(!%U{״WAti#$5}h=Atg_I`]Su+ l>h|=3$n4lqaN?7lTNoҴLnK{.޾ۅ/;K ivNKffZ GlAtmi#QUGU}@]s(4mDԐ3 (t)*j! Դ]j*j}-TYI :P@U;mERC::BRF4*Ki#Zt5Tej/Ԑ爴I+:2FtH )ZbIV$"IZN^i':Ҋt㓂-k{OM+ƩNTP9st/(iz,);^KjHK`+l2M 7lRC:~ 3f!: $mD #' KFH %i#`$a):2FtH ƿO"'fݳjZqb7u7-;剮e}sز|ue龨+Ws3:-ӵ_u{e|Nn5)Iz9)$ /9 ,`..V6kW >`0g D9iT5ZG HZ"XMC4`ҽk> stream x˪6u؃:16x߀xܓ}/IPEQP/BCNWo_ǯr_Wݯ?hg?~_WC<0~e? Zr},t0Op8ZSw=m_M7ɼM*M+.ZtK}.U ç-ߦFO}u+hl{zklCxlE*GN1dO'c/|~b<'ԯhB y+y$q>i+Sے{rՁyFϧݰ9?Vj@|t! [v}+iLH!y/ۨ6~oե[L-&^1vkOwZʶw{ S]~vϾ[T!AZP~nCYkj\3fTs-S͵ HWZkTwQݵFu:]Fשn> _Twsv|r M}H3'?Lߞ=#wMhouhi.1[+]?nT.ņP|8G"7!NϹp:l7O3Ud&Q>|ܨ!mDNjꨪޜ7mc#"-D!UETQUBU U%Te@jH*:joo'Z!EUUETPUBU U](D i#Z"RTUQUEUU5TPUGU\Ծh!Ƙ* *J**CU5v-)j[v|O>t!Zr-EPoꓢ9ӏLЅe~\{/ut!VOY>9&@wè5B>PE=YL(^rfHѩ>L3J>8K{goNJTQ' .|R^/gB2X{BNNN3@}>J5CP ?1#6!?q}T4"g= \IkRR()?51@5`R~Du^q@~a>+g?:?i}Вפ(G듖kHRI)Gm*hkS@jL9j0 E{ ~3[ẢA ^ckbShh5&| ?Be-wO1Oi5V᭵R~ZB>ө_?(?k^&3!G9TQk^FYπuEb&6wϠaA? oAJi t>+lx .Ws!t6fA"3|a ,"{S9CxK{`iA٦G*_UO۹#ozTyJٸP(-CyWCe3ƒ,+HUn1~^kƊfkř0Dh9|QC|=B{2H iRiqm3 jH=H}˴RmṤ= , #>HZWS H3jZ57Z4։D+бrM{XF |u\u[ԖJD2ju PVw1@3յ܈ju JUjum͟+ڨյmHJujuAjM@jMR`Yzm:Iß𧂟C}.mֱ6n6Z>{jD~)SFx)mLWoďcJRmCSoinSkûJ9rӢ4rI סT,5DQr+m)rSG1ޣ fݐ߾ݢ-)Z^tvViY99|(?9c]uSި~fr۹^EE?SڻlQwf\iRM;ѐV1 EU;OܣIhl %+hE_Q ~ 5 J/m4O_Ԑ61"EUiijHmYB4֋>h=RT5Oд'EhjH-_MyR'Eh_4mD'M IST5cpIg i!ZU;/55 h>H՚i4^aD+Ahu\)B';|3.fV/x.\n;O([42JM:ϷE2R#YuFWh%oG,5vd՜-JjvKϑ<_muy.E+欰4OB4HI՘oQUDU U%TP*CU#Aڈj:ZiJҜ]Ԑ6svQB42Te*2*5֓Ԑ6svQB:ZiJ֩`u*UET5[45oѴͨ* **j8^4ӽ{Q,δHhFԢk4I7L)&̉\k=6r|_|b٘v=E(}o?vrӱG5c]xb$;ZvmkfbwE22#o%G)s||/unYlX5No^k廗h6+f_*iVh6 Q̀5z7w]:^KY>w]k錢k錤i'QUFUUX@#k tAZ8#h\ g$-DEI )*LMQH | EUUT5/t^(!mD[D:ꨪ4/Ҵ ijHш"JjMJڈCI ѹ!QSTQUAUUCI i#"B:1QBtMJjHш"JjnҴ[4-DV-MQUFUUT&S$5LN椊dk椊d5bE]ocװb *s~ 5+5+7fE,|&d}T@ !nq]zq(r1|6̏n߼zW5ĻRb}1[T6@{-=겼b5:c#EGvI3@# ՜Ӓwލ-z$;vEܼpd6 HJ@ڎ154bl1żYҌFvhȎ4I-bA-z;l1&|ǔF ZSdq0FR;Sii @V,hEREddž:=A[ v<0bmהla1--,E%w$ي%E[Nv,hy偤mQ mрuEG[tE>.mqźKEf y{*7xt329b4_: ]֛˅9m.#ovyͽLy\ti^Z}FdG<0PSC **j֖IsK"):(QUDU U%TP*CUU--6kK.-):ꨪsKj]t6}.-i!KK2Te*2*ERCڈ--UuTIչERRuniT[Z*ERCڈ--UeTQUAUUUTUQUEU U5T0CM-t{0_$ZbEϿ__>)bt8Qҡc--T䃧+8c.oa>'ÓՇyqG^ m[Z{MnI(X>Z].zNV>RME,n-~Js7ǂ(slN@͘xn}\}ܶ{Adk:Ɔ냊{>ot[ԤupM6C0vt3[ݯ='k뗣~c|yS8*jM%9Vݭ/k}ds,ٖd{ptϵ>gpǙ"@e8*ciMUq v]UxqvjHaOsDZà55hch;f`\O|]߿iu}'f4#Dwh%:cJM3Nt~дW j-@煂V#c8ьCYW jZ~G ԑu͠swȺlPSCڠ+5-PGֵud]>i!ZZWjڈ6ExXSꡬSkJ=v!>%#Q[qc';u|[QLJF}:.:34mWG)sSTYLϿz#Y9PCڈ+D4-Dہ\iߊ5!mS6yN 8[sI i#:WjZځԾ/(蜓д:R`UT`{[ jЈ4Q 5(1ICBZ]fhJPFtEAf_#  I+ԯH;ԯD[5 hZь$+P,PyFA6_< En M< EZjM< I j)ZߴTJIڠQo\o)֩< I< IߜQbq: z!FA͖ODAw" @~.tst_nnϢU{[$4{-X'\h';+ i%ZRTU$iFVDM3N4u}sui':ipf<NJf\ t6Ԑ6EM @6k(i!KQ\BtKԐNBtԐ6 U %{x55 @QSR.PԐ6shBU UHHsU͓4-D$M i#P\i&\k!m@L3]Kf4X|b:zAFCu7'W8h \Od. OMg 9^gd1zVp>;4-}3{ǟy#{Ck"BhVf(k^r{Xs3`^{P̀5͆XXՔV4[Sw3G+Xe5,˚7{$ XkLhuB5oLH,kޘڑ,%`U֮1Y5Iּ1#Y ]cGU͚Ԥ!ɚVPl~ԂG-~ygQu?zNQK=h:K1ݏS3~ygsB5ݏ1~Iv~L 6IܽOϱkqA0cNK#.'>7ѣ/>>xt2C}s}&ť_8lz NNN | 5hAUUUTUQUEU U5TQUGU˞$-M yUETQUBU U%TePUFUU͓$]]V%5:ꨪujm\F4F!x~9[6[erq~Fg6-B>ء/F~WwvDWE7fg.߻0bvk}eY!5+;%qhGVȞnsW]25+w 2ߨ!md@$"-Do@vjHy`hI i#N q6H;x8jh:.2;`,mkɟ Q?ym-Tt-zu35 :k? l^pQf}Em@laޒ|d%=T&Zs= \Ṡ298YR(KKz+o] s.s*iy eR-X)NriR85Y G+n= 2O愴-vvk٘mH@) iz."4 ɀdz}2D3N4/2E2Iko еLJt4#D+xFEMבԠl>0I i:X&ZGԐ63I t@=Iڈ"b4I iz{.IRZ}.MSt-N@=IjHs c$7ӓu6y bx (&̉{?k/8ۂig_mudOAm M6|suy[mG?~ͯguJVo%e`n-Id=J5 k=1khm`M5c#X}fkLdkF"̀5`EFeȧ֜`Uߞ1uR>\; ^ߞs0uA-U܋`Y9jVO3.VmygkE*g,kITٝ95"X,vYifU+L9ΊnϙwQ3;[3(`67F}v 63`Ľuggj2Ę=F0 Fv.vٍn1-eyзg >kD}1?^ܨco ǡcmU[*^* @zgݗ灜Ҋu+yUѢJX'oc_}/[bR,*} cvU$LxiB[j±_vdѼoW)>Xۥ]/omۥmZŨ5(ٷkt/VRNtChJZ !~s-Ҵoy MеJS7X|zgFh'Ť{9vi^ ƙT\f߾~P_' S?7wtA?X~t?S=mP7Vda}Թ{r[DdfJw[d5]>@Uu&^qΔj.^w}$T6^Wslռ#M4rqu#Snt~!Uo2bLk{r4C5dVg(r$UtDLAiTNf=zM[ X`\u+iLiK4vKpDlPi iZIU R5UK:oҴu;:] BtTS4&H@Ӛ Q"iB2X8gҔ;i*FJrJEʽ4ho\K4:n-Ի@[Իֻ`?BO.RKN8_{_p76.mx?W:\O>>E]tϸQilv}lm n:sC *6C[&gmk|^gJ[o% wF𥷯o5h5q ׌өbϮ>]i(-5t&ßK_4q]lxގth\6ybkG?Ko9RWյcDZm}m:+׎M}Ԃ;Bg`!lX|zx}وk<و<ߙ6*1|_sȳw~gg' endstream endobj 9 0 obj 9883 endobj 11 0 obj <> stream x}ˮe9n<=(p93w' ĿG7bk}b@ė("go>꬟cx`/hMy?:>??s{MCckF{뗿}ix;ojV>}i "pm?09϶[ pZjl >D9|ڹK9^}~k ks1{*z_ "eO 7NMBWSpU,Slj5Kry tHj$,-9- u uב ֥nuxъƸ bxԫmk tyv 򱔀OlFKƖY1c/m5quISOXƀ}D`dplH/hށ6QeU]M3uDzag8h@43W@ [^jߒJ-9g.p,AxC."J̥}Y‰:J(Rեёc8&L\:0d 3YI<Zs'mN3BC#BOގ7rw B˝{_gkN <׈qSBDg<`UsmkQ|cۯ8f>k`!褴tA{kk@Tz}n#A/7|t]ϴCg:h%ay:fklK^sJzE(:/="0  JGؗ.EԉFQ35 ꬨp"g9uMr傣ȗb?RVX0R8 ] rZ+lDi89'Zu9Ɖ3#ȉ݁a5- *i5@G,׃t jPȂ̅%w7}RHdAKEL3W-ˁІy Fo9E2X r^:gRBf=Ďtuɑ3=٭^` q?t!7@ؕ;ۯȵ.ڴRdtMp&䈓gHv=H ܨo?Kvā+X~akr :qJGl/cR 9Ӓ`xa- (po\d_.gYRc ?&r QS(U|z:C8P aBuu(*L3ρj^b*1(0}8"gX|~}p벯9Q{ռi*Rߖ:}o6 Cyf"gG/@1%hC.T lyZJR|lEj'>Ԋ iiz:Q Ї}&u+X8|yCS9jzn%w/{:{;*^a{%=:N붓 }$+} g.|EA+ qA5PָP}ͤ7 j[ԪwtIʙ; li_=,- ta;}4B.z0%ľ@ԔqBP|F` >%҆%yyQ##ng &Ź i)Yw<9=7VӜ>stKz;l;]~'nQ;ŮD]mwy_Du@ e6e%% -Ź#Ly { "V$eM g/83{F>+'g.&ցW2͗KOf!Ej#"7 rұ-+FD[}5_ 8d{ h{v֔J2D[ήq×J+/[H#Eք[; R-[ o kAqlFJzGA1 g zV*^X9"Jbd'sKH+*'WGę(j5cBSb{fVDqP~D*hX>?Cߴ m=%2A/8Y|,zeLgkĩIN5 ;P-=_Fќ`xYV*x wRk<2w+[⊔-R[-Rd0Ctj$[?Q;#_ٙx;^uuJS,PpJ_ O wVSmLHozN߀肯Hc;PYwXŕstaeVz {|Dx>Εzx#*g >vM;< @QQǥp/E6(VN@ )uy+ոCg28ʫׁ"3L:!gpEKr{l{] Zo}|pF\wBn+W@[ېDe=#T|PKp쇁rJ!j1u wޫ^kDffK5\@=-֥+Bg ^!!5O+v+ *ЙjٵyJHЏPN`x]3R} UrE%j:1'IkE)2OFߞm,kB}EPFmH3$>4 )޿+G[]M)O1;xyҧy)7C{p$eGG8!rOOJDOL%<$ =MtęvOcD0!*ЩR*Y>}rz7f9;8o X=-%GfHXkR'Bʅ64HsQE(x)j.H; {~JMc҉Q*${BZ(Y(PN&$}9vwx\-| Z7=lW["m STgo@Ѷ·mg?>friY"%JԴ9KҳLRwlgAH; ^@?49fEX^)VGnT3YJv=5Rp>gvrA"Akem^ Ү+H:|5*Mbf]X昧\WIoPJV=u{;ТCiDBiNlw/5(x8) [HK=%BjQ̆:GԕR,eaJk JPwK0/ݙIl N5~HJ~B_葩5` ΊG1Fq%~u3uU3R\fRrtSҕm&48,汨ħN5 x~zށ'Vj}.o]#u ~U6 ?ǃLG泎EM;qMOMĖ QR7lo8oxWm,L bj^03]~jB%yN'z:!8pN ď c鄤K]`Ŏr2[1=iEssWg3%+7ya{V=8c0o46?~8EҸ U7\_<'@Ɂ@Ef; d*$xUw%s*YO2g~8 ë}c$Q&F gnz7;au^ZWE )"%O2.Jsdף Sҥ;:.My8&H] Jw7^O{i/6v+wWOs`>W5!'-;>$UCKG[26g4ճV{q^H!uS##W3Y'\ueQ},<7Thͅ<3sJqjг6>So$#8Z:q"}| 3SS=q1@˴.F!Rx sPB%oRh<%)t^ɍ(oF:Q42SZva@zi0ʈ t h;)q*JNcKA) Zw5ya0/Z3bL6Lv1qE^$ƃ楒ڄ8 1*CST6(e9r"=MJ/V.H8=.u܋_^a-WH: łA˝m##o@ԊjX%CvDEWpns1f~- n)_{Pn uY pO5蘮 ,Sn܎mZrM㰸ѥxv`7=cW}7(v2\P?SKx$Jz"UGq%:3544jEMS4IU螙lerORe>dS_]Q[&u3PCn-Q\3D)InU+GH<&ytݡ甯@=Rk zWxBo-r6 fuiE6a,}Fe:Ťզ|Z$& et^/[n;P/GZuۨy|SjTD WF,I ʙ#C-凵>J[kM(<.|cz."rGcMe;+[|GcLl">òA y_jA(ghvnJ6wKP3/mWF)\ƕhަu:jL~=>nsd+KVUABT7JHvr2ssqCOxЭ !\,!!H/T~QgJ@mؗl܈IQ|8b[68wXY|Fi.ϸJכLjDN_oBVHڼҰ\Ew:C)@xØ^Hsf]=ѕȸTn<No:Ȉ97o]F˻7hy_=C\H| OI/LRt1j%EQq(a 8qKc z9h]w9SMn?QC^=*@:NmSN2Zjv<ȨIF};JslvMeZUגI)`mv JժW5T:Ş(04QkE(y'Qjzd.Q}Ia5=Tjz) ZvӾ--l ch)ʅv5իN-ݹE+iRWT)-xKzWbPFčn'8HIgvhR,3$4gg'^LF#[Ww((P~[= [7ôq G)o zk(y^!߸3{9%5_ 'G JOE2yƦ7bډ5-t8)9jٷEsbfnRtFPdw\;rI>UVMcV__/SVhSޕ[|HzÊhE6жljrրPkz {s*nD?Pc"*uP1^$VNK>3j,G`3BnH]Ob_{7M4FV\6 \QΥH D h]R'5|u@~o(?>R7jT%aJ$Ѧ}Sk|Bq g7pn }w]~@ڀ'xQ˶O ~R|t9+tmP?J]3+@I*VRux$r'r?uIj^Dϣ ĸR\TuqCg4HF63HS߿jH2ÂkE\^CaSZh2Y|g/SmnugJ.FxyCz% }QkANj_˨9E}ÙZJi˻4MTR^].1)7uxq2Yu 8'יc wjJz^\?R d8 TɉzEF&ex|QE[#;H[8XWW5σwSSlA@->1P(ʽts :6PԴפkb&k"uJPb֐I@pCqE+mXэpB|R'ƫ=UA)`5/ti[F (ԉ?ةg$FID)M{5!QZU6֛Gg R;#0%ҪpAosz{Zl8SH }'a5] Zo,%=QA @ Jw,\)b-:: E]yzE([񰠧zFE\)YQz>؅ aKY2_.Լ`{=iDzl)u}Ia{?z?y\jzR>Guhr.VCWt|VQZok>Gz2<psig@0%; Pǫ5;PYrf( !TjTm[.:K8 69s1ʙoWYjyN9xÈȟ}_h+5S^.s# aL﵆ZN>YhN\8e)]\_E&]"1K J{AxG=%72jA(fwſNZ|Hb5A'J:I{QICd;P#%! Kvcg^5>N|ZjĻIkSc׍ϲ)ۼ ]ٮٮ޻"+A8˃?b?u#1=3Yd#1)m0>aۢtRӍo r?; %¹LRk^[TQS C>vCQnk*:H܅H[T8]f3q,C*VM,`M(E^P (zWIQzk3G- P t|jmNڠ 9Nj\%/aNtI\!X+P[2Jz j$9)6ė7V^H/3ւP~+J;h.7=Wޥ٪ZW# vKr:pC).tb_1%a9scsl"=tQ^zCcebTc"e9 zCC&&O"=7(%lm${P8D>߀'i% +WP^%+N;?-4޵oKC 8$D8~8~JGMX};GH=;ӫ{*Ox+GKu^O$N6/t*R' VתԲ%^ȕdC['}CZoQF3q7H4/E7NἚřA EonW`qK!|9+xBG>1v裏1@?{k,/ `7` Ђ@B NŊU9nW5k^Ԯim}&֌OID O:93'J{I88+mt9s>.3^pq̤F]12ImM=u"=VN2h'Fw#TI{|Vw݌ / ת@Ym^J> }C1H_N9Bx I>Xؖ!g.. RD_RDRMūHLWuGSɩx G1 G>>ԫ{\`!E4[:h]W+AGWѰq(]pQL^qLAnP}@52~ªw\Eqp}M 2v}-ta'bOMjׅ]j8ڠxJrnƽuG~Zdm@SqGr_b_p!\/Vj//] Hzi6d# мcDqp52+wlQխzuG gGRkL>rY"(y>vPBG2=:ZĺWq83뙣8Sѻ^utp/gt4}+$6Sf4E2qX6;"oV=D˿||kWy|o/qkh ˣ>ͅ/j[TpE߾pl endstream endobj 12 0 obj 10020 endobj 13 0 obj <> stream xy\UM+s@qB(˴nMK3oMWlԺ}j~'PҜ58^+8  &*9|/=Ϗ}OG#g^^k^+/OQEQEQEQEQEQEQEQ¿1*vXojoZopq) qe_~矬ߋ\n@{>EQn g9#W^ yמz꩏>hW\˾}Z] XҥK?K>s*Ԋ(6,aF5k֠A ^O>)Wܞ={.^F#|s s}W._|XږJ+ H׬Ys۶mYYY6mdᅬB1cʕ+ϝ;wر^zկ_?&&朅 6̜9311ɓ'srr8^ZUZQcY… [֭ӧSN@֏>(]'ŋԩgիW?޷oߋ/x}sYvw}tSLH7-OVVE1 -|UeĈǏ!#DDQct'pw*--w޸I&j޼yժU;r_Zrʜ^DHiPVEC q\tgΜiٲ%6iDWӱĘg> ֭0?#hѢunРP7?tPݱoYx㎸ 6{xu8*M?F(ydCp\x f5j@QTSNիW/XO6:?Hqbb3Zn닪=ˮ]%K,]vښ5kbsssIH{:cEQCJ·'3%u$Z*3:emqIP/kc 6@#1$K/_駟Duҝ(JEc'N|YYY"I ]>ֺm|FСC6 1:/ZQj!F{ (j2 "<gLgϞB˫+:ʡ(baU4ͱbk+op0?q$a賾Z(r-׮tw˗/_xQ\>" Nۍs6N~%?>+ȵ*-ˊڡ\#,> VEeIRy[YQxו]Y\G~+E+*ֻ~(WZNZϊ(p ܣ\ k(KѝEQEQEQEQEQEQv{gthDj z N>}ZZ5zMquժU)wJ: [媑VcmϞ=˭PdIuP5%NSjiE1܀O?q:uTfffrrrlll%<V(qʝҧP Jx+Wiii{Rݠ)wJ:@M>P+Tųp/jϜ9wܰaJ%NSjZAPVs^t)'''###11q۶mWV%:[T)(;<1 )wJ:@M>P+团(7>|r,[L%~RRRBBBL򎏼2tP S} pJxϟ8q"--m7n\hJTKKs;O&P*ъY ^\`JW=u=GR;O&PTpΝLMMݵk׆ T=GDSjZAPVbH4EO%NJ*eAlDhϑ8.MM>D+QvgD+ QvgJQBn~=ׯ_m?Ϩ[hJ:@M>P+xk%?h1FݒDS]usؠ8(IĞ5zb+E hq$;tfeeٳ!ц2_kl]%rx*PvG2gڵgϞݮ]2e 'W_Oa$ZƟ={BZ1?*юD/X@>5k ԩSklr 8_wTV rNIĬ(G%q(C1uQQQw}\xG&hg+WpV5~̘1f@]Ή8Vv+ WϢ8J4nB y<׾}YКxܭ[0RDHDKo7ٱ-X?-ٮ+pO_SqF%qk1%Z8iSD1Z2G&B&rY ؋& s>-|o 0S3ͨD;$Νo-+3gн4(UZ51\]qa=RdY4YŋHR`7+++333==СC+p3thb[)D;$:&&QFAAA_M+ĉIII&5^v9'N%f"/FZę2Yd]i6'Oܱcٳ @\zL2e˖XbժURJU\f͚O?oݽ{1c,]JbL&?meQv%Z&q5j֭[6F1X,v+..u0_Fz Ef͚?qƈpڵ[hA7oޜO='E9r6bĈ;K*Tkٲȑ#wڅ\FB *юcrD'}7lyY$B6g$f"'bɵ⌳E3QN:hXz 2dӦM\S=z(N:w}h~=I%ux=={> 76KyQA%q̟QhǏ:th8"IL/cE7^ a z$RnݺzÇti j>}*UԴiSj S[$1\8 %1NZw)*юcrD@+W RRRbcca $Zb&r*~)ʻFT4&~{yAogΜ~>,Bm S[#3Ip 򑇒y Ñ2D~nϋXJ?\!bN>MWWF9VZU$86))e8ڴ3BVkU .j޽kҥ {$rmҤ SN0(!.OOO0am۶{͛5k֢Ew}7 _~ƍ[z5Rb/r]Z%q̟Q.h#G$$$DGG/_΄g{/6L;vl|Xd W'΃%f"'~T}fcV Ƙ8g40777;;ڵ/?;/cNtXN8A"* o+W^@ ^`ʕ++VXxɓ ԡCFyyy)hٲ%uF֐kYCߒ*юcrDs!tq[lYt= |}}u/rľ}~/ʅ RRR|I;|wDԫC֫WJ*>---햴TNRyjԨwyӦMd&ж^ҰJehVHOM63r4jܧO 3} Vb,|-79Ndǎuy޽撇d1Q_MRv.=GA9cF瘘FHN—SO@%F ό2TTޛ4iƸI 3ܱcLjQ(ӦM>裫Vp4ENDUV~~~rUX[E jc: $i;_)F8qG\#c/ݻF >֭+?tD `hv,?%G ri UV޽;X{X! wDpve˖7~@K*unxBJݻ7nhD/[wr*^Ȼf,Y7.P.]׿k$N &ߞxDo R s]!OnѢO?Mq5 En,h{<[k`2elzHteS]5kz{{?쳇+q͛m>|8(8ի9 #m, (o Ph4ɠ6zRirő#GzyyY3Y鸜$:2aH3gn|د5']Kd1A"iVhP]BCC)ttvvHxRi \rvϟ/F{g\;%SY ,OWTj 68=9@S[9V.+UԹsgc}ڵk*UFٳBK-=.,DX^Yf8pm2I ȅsRnܹsᄌ8ȳgʸt_X%چSNq޽;b|OQ [Ns`ҝ!>}ns2ey~[kqnBڵk `MK^z)==vYTHmgy{{K^ݸM$ژ}>s_>Νs[ᘂ[#\W"6J)2e_zx{5~'h,Kh-Se˃5jE\Yjդ+)/ӮqJtbbb֭}||ƌtYSY?88Sߔ#K~5kN"MHtIx؈8>93yPrL r|yXd:-RW.6b$N4Rҡ`G=jԨHtIx؈8]~gv%Æ {W<\ [oEDDXSLF=thDyqu&}:]).Q<"t<>"9:H4hݻwRhdÞ={"_nΝ; SJ~uBF˖-m6>=hB-̜9SNeʔZT`+3tڕ:3{vq%tСnݺM4qpʁK%Zj>>^V"DSeq,׽w^n ZvΝ;}t,;t~{>֭[/>۰aúuOB@h+UTl;3UUV WFc5z鋽+u |%,[6+|ӥKy@jՊղ|i3Ahep8wcN(n>P (DNG"7Pv"ﹹ8رbݼ?/O#e:ujժ栍+VfN/Ut >~#*N~?.u6za%y%:ϲ:6 E DE9-ϲkVFiӦY/0,̟Ds~+W^zW,FB֬Ycǎ䬬,zW$:$*U!"!gϞ7|?M0 1%TÓ'O9rtժUe7$4mڴ{MXJt"11UV>>>cƌGpLJ~͐[vpEM6UT>| <)Pv6>|xȑHRI5j߮[xE]w*WJ*KPv rCLLL=_a,Y=BCCcbbdB,vméSzPw\,%%e߾}ըD;,ubw]^;vx:4| 60a¼y֭[-9Jj;wȐ/kժUT)]:TxF}}}=zO.42q9Y<^%P^AAAUTi׮")S]8hׯ_;x`vv t8+V.y:L?PX>>>~իWo۶z %<^%Pj#G2^ A"O|.#r6:=lh޼9YSI%K;\\;nܸvwuMnXŋS:ƒ:yTc˖-n֯s=1118.цϯ^tH vz-ZȺ뮲eˮ\rÆ <ҥKr|uԡkz W7P%333qGwi#pbÈ,__%7]voEs;8@$CTF)[/ϗ-[FJ* 4ˌqơxit`Æ DH7onܹ݊3}9rǚ5knݺÇDjXhOkJW=u=Gu}r NS|ѣGC1d؈8VyKfeeqk7k֌K{ױa6p_>Fqggg2GDD,\𫯾BuR7CJ⟇>qovʕ[lٳg<%̶J|c,b[hc'3)aK)/׫W֡Cnm~usnAvZ9y$ $=};rU^V'|w_~%=ѷ:\z?>h rNj'7 }vNy?~|˖-WNƺBOB M4ׯy„ gϦ@322N:uj`Teg$ KKK1y%N>H֘d1conڴIB$5dh [DDŋ7||S?s=w}}Ǵ#G?K>4%e!A%q̟QNhk -K"S%K4mUϳMw(7СCz)oo>hɒ%`HVn*F6lX+W\8ݻ7Ϟ=&NC[lq3ߴi./7nܸ֭[(pV3*Otر_~7$$dڴiTpZ-]T9O%?\$6^q۶mE"+ʔ)ӠAٰƲ<''~;wnذN0vX[nuԹ{mGk[lٺumy9r_=s̅  ?P TT?rI6Pvg+$ZF9ܼys p>_wi&d 2e?ODUR%wOve˖ 6P?oѣq6lXHHɓCCC1hƍ鼐GG}.Z ɨgy7ٳgk׎>,,ź[n]V^z'[hZ(ǪU_g86))I=\6ʱcIch|̙3i$}v_)H9uF1DUFKXn݊wyW_4jԈۄ84i[oaizI2`roĈ"4| ,Xb9O)8Rsrrd1\$9O%8(T*LYfXX GKn;8EMT|sG,_΄Q`,W:x`>,Yd_ltbf 3,gF6ƭUzǎproN#2C ӧقoW^r֭ͦc,121'|͏>?|衇;$ dԴiӎ;v'2VeA+dѣǏ?uT37**^gdd+~߃D;S$jᜏ?N]Zl@Y`*o::= v-&&> /@S^,][hQ<hȉE?uڑ5khӈرcќCE~=ZC"GSuE/7n\lYԘ %Ν;zȑNρ["..S7zd\ ƍ7a„iӦ͜9oݡ92L5# y8hFA%q2eTP9;@ԯ_tFDxKgϞ͛76$KD*frdff""B^)dK>vn+IƎDNvV5^SRR`۶m+W\p5H\Ruޝ_'xVZe-<xNI&!VΝ+#'{GժZ=<䓈l u>nϨqÆ _z7xM6H2쓱Æ î IT+&3.ʊkg¦Lߘ1ce944TԘ"CZKVB7l@2ciO'| ę8aJ8K#;"tDs<rDsgϲ G! r<SO=wn<+aPNS \WPY:Q(53I7c0Ql/N|DI[Cdd#7NSW^yRJ/sRit ʕ+GWC8  Qc|2(r]vQ(RSS322;&ΙL36x5*ю,5jԈ;ŗXoooG3Dsy6{ɞ6Mǡdɒ}Q[ > zE`h*))FyEA6n;M&>|Fq۷o'(V=壥8`Fӂ,#E[Yqe˖-S 2^tisժU)^z?!eT/i˛̥Q.Ixnjj<86-όd{JٛRƜ8 *юc2DYީ侮Y7~^A qSUT_~Ŋ7Jtff&& cf5zVdFe SEVc#k, b[l*",l'҂d-!!!111%%s r~15bcG߸q5700E5Y~ݻwGoZh߾}:tEO?<t_|@q#\'AR.̆I5xqȲxfcVA%q̟Qfϴϙ3A6&soݺ:Fi\D(Mn5.h1FgҝԤ;1Z֝6ZU p.X[h(gyQIGESRROrʰ}hyd#V#]r%Zf$9,+e F*"2eN*΂J܆˪DkEg1Gn0r+ 1[[rfddEԄB@i[@ucl۶?رC^0qaejjjzz(3|: &?Og)Pv???n@zmr ]5:?lk3[9"CLNN>pha>W#ƔfLm$ ePq.h  t%00}2JEb{Yw.T$vz-͕&,BZf8|8Rf|f1l k8J/_@ @p&B{v|1ʕ+CAl*UrbEkG2 BN_H<4fsl=*^,4q:*N>5tPD oOAlv%]pAaD%.QTMezJq.2!rGi,z,c'222bcc7nhQ'ZhH 7"''kQb;5E)Ⅸ?CvvvZZ\zt Tѣ'P:Yرc|i^tHJ“P?FiR1!-<<\F9>VYeEm9Jl󑭢eY؊T-b~Dhvrr2=Ĉcرcnl4SEo><u2!ҤL)YcB%NSc C6:㏲YF!N0|dKYX6$"!|u*-}3n߾ݘ@5k֬)S|@UG t1!ҤL)YcB%N5jZaմ^Ͳ%w.c1c(u/pg)R{̘ y!55u߾}˗/\ Ts1&Q&eJg]=f+[/ގYGW$V4F!]EC"##'Pt 'Q)%kLHč-oBߠ^]obEb*-e:..nΝ@8 i&eJ(qCeV$殔=\fY TsFiLH3> stream x}ɮ-rݼ58f=Փ[kfpV;xxunl32 ~?:W1J?f?ou~ͯ#U~5֐r&J *)~ABF5a_Bb! Z?_(qM{Ay Z3&~C}ŭyMlD3'k }O?6qxuM ]PԄ&o{xK8gakx.E9ME*5gܽ|Vó.r~a"ڴr/57Zz= ^aݞ:QF '{x%gGЎ-%K./i.5" -R^atJ u%yA^13Lܘeu5+B}g@#NyЌڟue_uo[u/ݍҺKFEZT+eJ/5B?W^LYEҺ5ħ}`_ &C\|/iWHpyAן;>~oK:>߿yt4w|7} r7f>@dKO 쯴 Ht>` OXڀ$6xp̶+Ju;Bb,E*Q8\m 9(N8kNu\5\FGz|ZwVS)p<)Ҫ866}}D5ǔh.Ur?y _CD $P9eMWr c!JV3hroiFZsQ!{_L" 8&_XbV`5}ZB'^*Ho/u2ZB'`"17`0͜OJuyk^T ЋCl@ƿ&Aَc_/@(g&a$߮AF=9o&(y7ۿ :˿ ϩ-mJɿ]v|oF>'&V5v|o@}ojL|zoɿ@ \'`EoiD2y(p,1I^{'y~uЇGwd~]3ʷowDגGs*3ճ>x?79ZZuy?7)OA9>x?9y OB;|~'~'%oAoO[ f =^Pdahmw#>:.߾GiQ3w"; ij0?)FA\:\A);#VVƢ_٭ģ"K/uШH}$,p3#?A$%;pЇHBѹ# 7I8Y$'hy>S^@t,=]+YM3aWEӃiXNټMP5o915hOnz<¨d*RS&BIՊ3cNi憄V̽9Ʉ8ܾZC1uVCݘWҡ@AM0#&ГWf\cT7 GU'zF0$`}i$ 1GBHKsNT3Pۭ"oHXy93J 3뙭h_sG&/,;JuFb* ET>qb9HAXe4ݑaO˟&(F/k 7Gn@Tn6W-vRM0_ =bh>"㽝|J)r-#QVHM '-wZE[Vk'5UJ.PhrN8rgCCE_XSD(EKy 9vJ%sKFbZCǶV1.yϤ\uGEquךX7@QBOw f5)+&"r)l|bf(y+POzro;0@+bkʬ1(HiH0DIM ]r|WbҗzI9lwRh[^qǧӡg=@ᰇ3%A4p\º0Xڵ8`\CA(Pn/WU~OFWTP=\FRu{#Rp,AWC #8`fRo9ۗtpu Pr,NחK@(,8/VNGC{el'ʇĩ9q].+ʀKӛ)d V8̙4I1jg dA)X˔Hn ܠ(|W|Y&c-8IcgD7G9_:oBB(xa+KQuF(0l2( JqH[d 0tK.at-% QMs閠֡hz0N!<<)ȚvKz=+Rg\։O Sv;\3Y7ª \R.Jv@jQeFQޢ431!4uV~lw>0 U4g !-k={Օ٬j}wkT-dbl wUE9;hf_z`=1% ""X<)NT޶¨`Qe'Lo OKs,}OV"s֜"9'#!Ftv J1F(nztYb~N7x&T[E(qh"Θ"d[)N\& ,"5%\{86Ri5 0=.DJE)jl$Qq4$TO/khG^P`8XȊj$E*%ASQImJ;m{{/RrρhŞC)J.TqA]EBZvP}i]]缠Q CF`TQiO%NvPc$/> v,Ea OVK).Jqb -7)KNUMiOSȇ9n:.RlU[il;XwwҫԩՓV:Pg:;)|3\[ԙkD PGۈ;[eRV[' 6翀BۍUn}]#t=RHjSJ5>Pyk,FɎLR1ɇNq.z֌R'S PCvSbKPy^JQ+JPpyy"vgKN zW뮼NJ"HyED8cgwX:([d4V5#Ehat<\Ac RGOpZÂ.V"Wu园 ҫ6iG+~mU8n䝵(#|*u ˯ZgI~3OR {(z}Ф8EPW6SDފkiݝ^YثV-RAKQuMenIN5l©viNڊ3//8K\q*Ћǹ!#VTZEQ}ԛ85]KaeXݨۇ|X`ZT͊5bE&7`K7\r=8 閚ך9([YZd!ݶߘ3[+Km)[g&F>tͧQ2&[{EV/tjMFi[uRҎQE((JOEU"ml.OtiW(8AzNׁ38$]3au=7g){'hF>-OiyиLGPTҊ!!WyQ+uE3|K@~~uEgM& {Eb۔.aGw )j3GDQRgJh2#aonc«EY:;՝S3ǎ\iXM %qOnDvB]X(\dabw#y]xAĘNXa%0X`uC>y ڄRռ6&A1W!6?sEjgʮ' խ֪mҎ6}AGy4%+XծudUH:1ʙ8UI㎲+6|reҩ~e@RX)@k9)v9ֺ9yjc$E|ۛ<E B{+#d;Y/vGJn'}Yf_FWxgG>]C J.gPf;c%ƔazVG"WO"wkѲO -pgpJޓcr_:l*bWvޣ֫jTkxQ}@\l*#د^cK|[d{_PPg1F?wVŧØl].d?0=CoTM}#OxHm^Y[7nbb|%+˖# 7Pÿz{Ju 2JNDk,qk ncKĐckq+rC3H~Xnպ-J+" 7\{k`e7oo>ٝrgjF_ Fc=:,ߕHN&vTds&K?P H$hjݏKˏ8B}R_rɛm֨Oya BEsk ?47ӕhV|Em ƢJJa9x]ImFI$8`(')'AA~5ʋޚ z/[4ᠶEٽe%Dɒh[7tczQJ ZEj ϒz| \r$QL(ί ӜQw0ieVB$*-+߱j-; zJ(|#͠d+j:,|i[m:HhEYmVu;+͈PSꪩQjG%b)N[z'lz1?&V?OOd b-lJ3׬vC]O)%ٕQzzH)qyNǬ5EJf)уU> 6{'P޲~F]r@m:_?BHXvۍ5Iz3!JHwkYŭc3@"6\WIlN pcQⷬ {hn3ݣ=p@iDw)(IHyHzBxBĉ3~4QO8'ki.g dm$EuH&&iKMt1FbԲ>ObKٞw\P=cdE9΃k_o&U&k3zndL?oJ^4sTñpgX/M8[|fƏm@Xa&Zf#tm֥>bD^A7і6$r Y lp4^yDY> 1 *C;][&o Tn{Î;׳WaTS{*`F1Ҳ!j fR .=ss7vѾVƬUoEh[\o^* J[Fl(ENA=֣4*43G--甤-ʖw6'^B ,ǒcIe$dJwC@0'p4ygky>`t (q:zt:]$7K=^TYݴg<y֣w4MwK,.p,9s+ 4NQzm{o IvvW DԕU,}jj#M~)JD@_dm\@ b~ՄvMKי"B1ا_(O{ cO9+4zf{sOμ % Bjh(r7(ilFdhzBr>/(uG @/%c^JRrHy:*,j]nsLjϰҙkνMn{WHvHuL%jRE{s|{Z06*go֋cJe:`-dzr*T&6r)<;sVԶ?i.taghr̷ۡ]=E~Ud&Ћb TB#wR<лOՄFJZ#loā䦩V,eZk#zFC=X3h\ Ł\upco=YыRӠG&ewtMńPE8QcZ%jRua=$5ƽP#GuO-a(v+Zᴞ @Rqg*IRh&J{Uijhz#d ICQXltUͨ\rfޏOH{Ig/li\@LGHe =4/]J'|//pd4u4 Ҥ f/qP22Jy J(3~7@(qe(}QkeDZ"i>(UŊB7Vӵ䡷Ihk7(YQFOVSR#w;K%Ղ÷=K$렷H^'" ya/QKvj[Lqd>],|;0/A'#GlvMe[8A%^2T|,EaUAnbI[nWsAÁֺHbeDmɨy I~f~@=ӗ۫0Fqc5Xq׋ڏ~l \ޯDqz@oIN^ǁ0V&B 7+1[LMđZ]F&fkۖ3 B P.i Vr Zgg~ \"P/_)cAJVwӶމ2!SJV>֔=G. R8ժך*權yeOg˙ZWW'\Q0g͘:Jbgcg>h{-(r松U㣚yDWي-*UJ 9k]֊ȍ[%^Pj_@z`|,Kʯx,ѻ%z=#;(N {Srԫ&ǒ#qkRj5e.WN&riXA 8ϭytT>.[QWsTk\ YJ#cv6[v<XJ1b\h3-$Vuy#Ψjl(?zp`$4tX Bi3EoCj/M;˹[R/{ҨgN(dʏq+0 gޝ_vYh͠`}:dudWG!<ҐFѳZXI<ˁi৾zy(@ޛ{ Y?[ )V$8m=(eYyЇ) Jxc,3!'ɞzWu?Ypf*CwQ:wR+GWB8Xp8*ճ*;$,wX|D%/ӗB;_E!9sy-P^GzG^q:i>xК2;CDWfcH(r"wbH/f_@|-mm \Gh֫zD>P; )@)n DQ@j֥ƭKG 'pMM{@.RyG8A@Gs0|v)=r7&?:>~ǁBW|92΃'t1Kure!4&W=vE`v{LZKZG|:beEnPnR!%0tM^4CD_=k2)<;[͚Rֶ, E{Z4_@SI)魇IK` M2 _ޮkm\׊ gNK[sKܲz+8I׆rq'Z;b ̝TRS dC++ۿ~b?~X`wA)3,oSJ`#Զ<EvXdr^{,EbI>\a>nտ615=t0j '\W>cw>I+JuFoOxek$5gRml>yҚ6=_+-PөO?DfR'۬sѪ%gF\%µk}0ԣ(֧䚏r{xh;(YPA1LcsDG#wM+B'\/耱ִ;TͿVPlIr}IYɂ@`AR4!dV JG2J*>&+Sznr?d~8saBu q̃-u>C*uv=sG_r:RD#̅ GЬfɋUn'U9Nu3jwBUѻg{ICgEPznè/(C苨9Y6j~t[K@',dU{ѻr}&Q(W~+4jSAzT;rio*c #zF8~+٪l{}z*sUlk_:*zwdkP1Ov]߿E`ׁvt"1i{(E ]JquPc_A֥.UkD(:ݮkYn,ōT֊٤ FAj h>&a)h5"ɎeXJN#(YeCk&{ ~/cԗu_Ẓj6;KIz2Hp-h7(p#ΔN% wRZʙnzU+Nƭ AW+To/*ǭӓ%5Ltk&CMB'&;Wja_=Lps$i1; (Qu99 [Mf]%^fuئ'l ]& ^&?ΪxPHC%N_\QSvk% _ή}vI`tjՒeZu˾,>gĸ[?ZL{s)iXe!UlvTZ\hV[RIKoN1u0 A,q . /ex~oݢ< ,&A5cJ:er?jQId'U*~=%Vw`JgK<;NZZ^ [ZvM0H-M$H2_'*yn8v %״C4;FRqa~xv}ML@ KB-/(A i^N5ҚKy JVtepJ<d'"T͓J~4@FDm]U,dR2HǔSi'$NfejZVߢ6r6HއFGC=J8޶hEiz]!j狒8x52B)2ʩº*As>}}.jɰ[gy5= ;qOqޙZaenT ъ0.˛WoQ7OyL$YFVW{=G?z߬3ovc?~k??( endstream endobj 17 0 obj 15343 endobj 19 0 obj <> stream x}ۮm9n{}y4tw v'`/Y^chUTqIMERW_ߏ[+9|.?鯿ן_׏~_` ?߿?⁽EnAN̊ /3GvD)4m)@@(7#P!%#!tWTB!VhK/TbZ_$4&aJxB;i_PnDe+ .9S@^'V1Ϙ#? t*pЩXXw)a WRD P4g%Tp4h-g"|7]H!~7] 3@űi)o㔂7eЊxSR'˦OZªiKJKKM[jegq7Z]V3zH:B>WsHNc<'u9ў͙VVB<B5sz+!j_6=xa3vna{e YWuuR_#5fn>Il;DwuLѼN5:hC`Te5>Bdw) Ew*V/GVxj%g] ݜ٢iQL߭ Bv2:KQ%ȣ*.#%G?j_t^j%Vq//d Bhg!t\QQSȅ) _5% ݗ&sE MQyވKbˀy"< 93Wݼ@-kaӢcnL$a= RݴXQ<ڥP37Uaex~3l*AѕAgRA+n]8OǮJZŘG:@ Iɘh6r+jG{tWkڐ-$v]dp(Q1ht4+i\NeLtHMgUcXY\oJ[Vfh 1Zz:۹24Rɾrîrl@/ZhDN &?@FܑE]8nٻe-\% >?M 29n7,ύYNDB-9{( j NbQ@:ws9g%.$5*G`Eכ[D(ZIъzg23[ ZoHI.DҊI˩U|clci.Vl JˢFJIbmLo5>@dj33:x5vG7Mv.z4mUMRnVn( WN" "OUA1G֑Ad+Cٞvό_]!E֑t[oq߱D\-܍dn|CB񒑩I3t%V798 j܏yKA:5ʭ3BNY묛в*+$| V\ qƼ刉Eᑀ&lYj37H+i aE RW3~ʅ2rEI $CnSCy3v-[rCEAJu(\Cr-KVQcVg=ʓL<Zo8k+Rc E*/`fd=Il&KH+NV47ɚQ:hhY$y3WVR}8pǙ#P+c=P$\38c{|6n`[hW80-=rH[Wr9g?OV/dž ًҭf )yY;<[L{]*)aEԒV&Wk6(⹃tA(0Q*غ?T&Ҁ܄*|iaW;Hc$"8;\*QXUR#kY%Yː|9 #߀|xZmak &rf@t|RM>]Ilm> gVP)Q-nS5RƱx MzC1TN2*zJnR{@jMAf2=7VUQ4o!bNeKe}#g f؅=_zfIz,,_ ,gk4;w3 䱔:z-}`t8 В&g%v U/Tlƪ!6e7MPY!߳4L;*i'd>kn0eeK@[d_ero *\?kC/Nci*Lad=PL{c՚8J%R1*`܍U{E}kNdR=U_mT(@ ;`Evrk]SR:DF(F =-<{iLIvb7]Ƀ0qδPĶ=1:N;⮿#`ENu%sPdr@ ir([6#-Ⱦn y@ r"l )VMILizy$S󮐥'~!Ԑ3>NwR&)-w@D ;ƄEU$4!r5UQq̄3q~*QnxRr4Zz;Z3c#JR%[XI3'&vQVR(IJ IVݯV LhH;#2TP%ziVNH S((OxPk'cF(zV&_WM*WBͰ]݈=il B3ϣ֝GxJ\h~TcoY#(y>W2c}4rR=fvm RSb==BIWC04TG-t[PطVY7</~Ƒl8WA3EVOսC=J*QRW3b/ïeOKV%?3b KEʐkIڧڗӳ(Gqؑv:-6I-v3 i5JxyY՛75yto67(5ŵxqi bx/F|JzڭMM=;.Ϻ-ƱB,U^lZG=P.Q&-\OҬI:U;ED\ߥӡ%S'Kfo[HKchKtBdr1E@#~b97:X: & H#>@.V=-+]\Q 3{h~tPȬuR|XeZ \UԼ?3-@+E mL~U;ZU;8(0A8c(z %k#V\>3#%%=#Ҋ~wrBę|2k g.(vruV.uv¹5U+uPrZЯ|o{@忣\fX/6[+g; ~XQA}7_,[{I03?#!KNKBlDKq Ǿ4XBXYR#ւ3oeq刬&&3waܒ0ڱ:Բ߿ەaz7 nGRwMߴ'Is@t]Ǘ!L;.gkYq;$v'黩w/w9xVV{ 04zL(B9KK8QBvUb,GJq Ƒ4WK'-vf*Bp \:4V"9#29c܉Y%cN(`ӫ-Aro4×5r~mu.Cv>T}wX!j`ߍB1-XNkկu/lBfrp:ęe>AiE5xd]iuM֓ElJ&g=(OiJZnۉwO \/֭\Hɧ0o::ZmW^9gks:FΨ } ,Z~2ԕ~SInzFh(gJ]\Ir\ZKu<Ҍ?V{x4)X۸QM> Htwv^Inw۝{YHVc"nwF:c}ከ\KwXV.CKZz[W3jxPVAѝ~!t˺Xe:8Wr'O_ ȝ0/Dcɫ;VT2Vx8vo]rƄ7#B)aS:nyCz^{ݍNPhO8'$5{ h˅HazCzDA%Q)|vW7xBqfk$&%m ݉(*1^¸zIEj[~{A6b利`YňGh(ą|0_p\*zzE9z%(C\)s|2l7qjǝ/F݂븻^:[.rNn%CZz_y5|.]GO _ ]S+xS||M7F؊ϧXnG>Do4w9G5a-~~qRqn""ns?zfk!pvME(E/jo:45E-%[EjPsV:AnwY:zPjuvE:AI"̩ Ժl'-%34km2jEal#:S)Pp@slB]HE@u8tTQCb|V)"-2=n[N롞Qڛ󜜹 f-:ڛu3j${HYY~:Ή3_';/3W 4tk0#~G]7SuܧImZ0^Y99~}xRv4 K(79O"LP-ZIKy`9܀'Ɔ82K7$ c.tϼ cfIWDόPAZ=)ܑCDH)JuޯP6tt^)Y^Vͤ`\Q 8;qq@Ҫn`SgG_jՏSRZu˾[є)EA҅ʻ?(%Ɖy+J4Kw}{/ }nT:sn gtMϲ rœWWnR= RT T0$ Rr"Ʉ1Jkh35~XahVz:iÞG:¬Uy[\M%{޿۸eYf7!̍ܳp[|s~M; giF+RrPo(]] !B]04vH_Mr2b̕ Cnh( ծMA6X՞FV_QEX \hWtTj *B%#?:8(o gtFݎPC Sr-61cQsvѩ6M -#J7 9R`w p u fiRuOWˉYÞsC/ q7JT;k op+W"Z^vʓ/i4@]5^}ys>@J=0:bq4/obKcvT*T1$Ux_.ҁ/`*YWWKBJ%;R_%G=jvМ(e\GAP831n:z .\ ęs-gʵpfʵ87כI"y̔M214*,.Q.Sc灢|L Y%kg;9ПƮwCYx:Iu UCj4 rtKWd ZKJ:Kv94e/3TF_akOL9"lŝewAqf{P͌;7Optc"'s JE3o6*9L8jQ 80JI}RƳRs9[Agͤ%G9⮤S#Á륲rp@Y`K<;u)mgxpOV*C;mzg{.M \{Z@he@|͂7<bK Q%J]',Aw\C7[\ڏLKqzs=`e==-q^N¹X:64\/ ſCwdZrLuHJ.H'![k,#+R'$PTwJ(m䆟d12!Ѻ*I֝U:@fU {>Nm<))%i ŊEiuEI)HD+ݜWӻ<>Pj1_җ3b=4^k>.ZRӶ-bw9PJ^mE^<b AǁB3v4r/z}Q(s<ECzX>v\Ase!2'~O:$A26@z=QAì=ob 8+id%K˳KyF6w4#OK퀰X>e\}3\.zA)]'gru>[XE~fb^76Zeq@nnOh_.97榥g!#$w_G~҆Lrfl3=mJ{aEiCM㔓^5 #͕V| ~Ĩ"?tߐN[lT4+g^@h`ծWS3 -iHq(F3? sЫD'[1ĊPLDk*)l ~1Y s~AZ#N烔gR-I#-="cQbZ0X#u2Ovn=q*L-ʁR5VĒDkt|RVgzCg\+,S Z8!o3Rn6/sDp;~p)%IdUJ RNzLRlj_/ Jc/1tдAhF!-_R6E ݢnBJfQV]ي$t; *~ARSR*؂~vu0֞n8^m[%ξF-pߢ6Ըŏ-]]H|sЍ7/dMeW"X6ǒǟ7iXPk"_SN]K- jl,hebu.G?9[tF!R4Yeϫr0.!`9J.nu\zt]"W-6ɡlmaĜ l3ҋ^e >cAxnKlbu%Zg^^ƚcyv>ckf"EٍD7qɁx`$LtĨ@lsݕVݮZMvc)‚5W>_,pP\5ԕ3&)iX=͌t(+>(8QQ+z\Q]D<(RJ]7nއ`H-넱Z\YvšXD;{`EPS $JqjQraДnTm\QM&\n;)?^/ҁ"1H=i/8S 7w';C3HȂ *BIM<SKNb8dg.nW\/5B?u+NLXkG&s]Sz;(l^rr33`UI9 vA"#IrV܍ F*ʌI!brz%zГXI"1߼n,Zqft{6PY$i1:r'Ii6ewǃާ@ֈO9yV=o ]AOş{{ qWfQ:hIr'a38zAEkCꖡ8sCNPmMIN(AfUtho t,;Ih:j&VyΨ EÇ%|.ynpfnh7W)H^{zHҙv?ZR5Uz].S qQ#O9cp5;ma *=Ӥ͘#ѳ=w&:bcb:4d׻BJ9=%RzZRl|vFpd@g0amjfir8SuF.ۋtjE(r܊nPc(W7J;(&[g4`HJra)r~9I\1ͪaJ=<$Z8ZVVY3S gV^ͺatyo+5!:[rX]*[r15lPDeCK _7'_d?ֽJR([ \D^˃ӓ}a8p0~VAzИ0txvK %D |+^/,/\[Is+pAS{qxC^"81+L6)k]HEª}gܖ(.YŒark/ȅ-ngڗ2SpL'7ے$vi=fgdؽ7$5.%FAnvV\}}{^]/Ŝ+<n|Nr pcEgd 3ot}AD*cHH)rO@ ƘT(m\4N͋h#8_@\Y;+g4*2puԈzUNI-8ԀZM3e57jZZg޵_-Z:#!,#]A[d?-fڌo{!Q< J3o3zr?XvjKʐ!nPjdym_*F/i: m/Vy]ouF.JV5AkWNAkHZ) d+/Oʘ/zW z_/Mj~Ѳ8_@ilEv =oGFYVm95sc+BZp†{v.O9V奄Ῐu\J hW +#&/,{Q@|t ~3S")FtgdڤrƌPj𛡼ԱaªB17lMioH3f{?^_ 뷗kq/1FnD endstream endobj 20 0 obj 15008 endobj 22 0 obj <> stream xۊfq*8I-9sCn 0o?zzyWa>IU_[x Q>oo{^~˷R[k_[ooJ_-Ʒ^ݯ~S5MLa'^7b {N=v{/{ bCSc`A*:SL%xo:1SMI/Eo6P-S)R9\Om Btmm8?ZI|zUt O4crBl=bUXFJm9 Ɨs ɔ=old%Ӈ8n fjPQQ_S=)Ǘ8~M8:%Uw|6,$e-eXewf 6c, ~sYMP;ט߃S dU"^6q_6G9{E*ȑʞG>,6j~o͵3m*]GǜKab5`'e=Τ]8rXsΕBx(X[eO Cl WבKLh_^q_KʇZ^v,/6(B|6 3 M*a&H$BlzI@`aem# 7e\&B/n1P4wD@#`փ bt* WX񲊛Ji T{}O%rF+B6'|k帄&͓dЂlz&ۓaT|Ѯˮ)V_g$X,G* R9ג,'2Kc!PB{ׂ]-VΖXӗP;?)'J&j<u&-(=߼ XI,N#tt GSk7rS“aTi*mгd+y̶uS/$}S;Kc[Rk5Ξ 7߾p\KfzY&kZ n%s-+c M$;=RW$ҍȼ 8Dn}fkD1!])S1ĘIt\CD:!LY@)JG"zO(R/mRf'P%E e&plZT掘!th]Хю%n֦e"6 } G!?3c RuxbR "gYxbo*Fgd!Bs Hܙw@?siVeY,U".G 98*xeN ޡ'oS; ,{1H% F89ځ+5(!3b:}st-rvrJ!)(WYH[D5`˹5z.R?I) 3ypU= gH(Toq%3]}>7?W qLLM$e#25[}'eenG,wLF[ImIAn*1u,Eԙ=-|w[J4-FA:rLfHCvE=:DzGJԼQGw۰)lCʮ̌wm Ȍ;H@qЦ8!)Fn)!)AҖT9LrGK dT eAʶ\nx6%x.$u`3fw>KFUh$Fr%Aȳg G*z_N!>Ovsc,:%Uk~f=2E*eC͕ZK@:elpsyYx:Df~ٕ< S m rjOd:;UYԼWV|IVUȫb̏JX̗7zjGD!=g~JnDTCb()|!eڄw_r(!˲wv 2¾w=z(o>pk0[K"ߕvRI}"߶¼ħ9r>+>߳ HJo!+IYIϕ|b[HفF?4[뎼)ݕsZ74BI Yy{$Ij'RWص:V$Z$Q9Ii+n{a!]{&ǻӺrN7Ir'qm=9n*WO?C> խA$΍ "m)Hh!E}+bU5iVs!ZG 8&{UŢjLܶh5Tqw23W;2̡)GK_ /H1[ UҠXw;gS d03RjnsmX F=; QN3H #wyJ,|փs۸B.Oɟ턟ɵu4X[ʴY]N|9]Y3%Q3Uj;iwgJW,ׯ }9L&%^g׏=\-$M}!X0[9~l ry:xq/֨]~e'SOUg?`?=+R)(Z\K-9|{jѳ<V3bMOȫ0OWMqo>W[4/PptT7ddZYn"/}DY;ȅ?qS Bw7|FׯVwpuS < Zoʸ=[[qo) ͗cT5Be] M#rޞ9e,Jiȸ,mCW`z^/o\I.gvnqٳe>9i>%^e xzyg}j@}8:=_:sSYF?s>#j7"17_^1+oD٬g4Ս~g+qgWʋT*)*QJʋmTCNZ( -7"aJg[9@eT6[w9w\1#F:?cxv}Ǜuӛ묦H͐>@{|٤/Tg m|[p=35 %ruRC_𦯸wIm]o0fB'HNi^*x$PYUEܙH~ yz5_~eZw%_F苅vX-:Ew4J{>⭼X3m@i3?~Fl$mXCۈZN GJLfNO& ˩I2pu&Hn*1,sj(&dݩ,6ǕkyZ7ZRY?uJ˜"{66竐AXK7gU/|s@2VJ03MbQǴ 9OlU9OW;ɳ$ Np u EONzn{$ێ~]?!pߨRT G=hbI$Eira))BkͨTuJ|/gSĩ416PN~]s 굵~|ms|WUMݒ=vq%c9fRcTg5r%r7V*$9ӽLҽFc`iU.l< >ϩxH9KV0N o4P-+dco8OFkv}ISo~\KboL G:V}' [3l.Ƕ>}Gjʉu]3Bw[`Ím״Q=K\'WkhgJڮ ׅXXgL'UJ,GjP>H=>HtBgd_`d2ʸͮrLVWi+I+TRc|ڂ<\Vnx-JN_{hd}֒wVvq37ڈvLEo1*Lىm{m>C~ . zQUT麳Ti9>k5Pʿ%pFr4*U(Aw[J!U¶bBoA)5,@tPΒ-' j^yNFЋm޸%)^f?`c:[ROҊvմwTv,SW&CIfR2j0ͷMLj"WB5[ˬ2-Uϯmt{Qa*\Zݮ|1&H"NW5c*lRҸ"gIC<Ɂ"hW)@V딿Xw_P_hgſjyoGUgoŮo?oj[+L endstream endobj 23 0 obj 6200 endobj 25 0 obj <> stream x]ˮeqWܱ%̶|@0Ŀއ\kWQb>?߇p??GK?7}v{??j,RI}௿W?^6MV69YmRh jMhTg)j&vMhV߬6-=_-=EQݗrfQΗjo)|֏g>//~7/^ ^/~~?onV駽_Vz-0dm,lyowGhW:C6z[϶!V@h|| 9&_qKn$oejD!TG3XBPQ P0۰@Sg)axe;Q,A-Kpu+U8Pm0ϗHf4,?Xo ]g= N-`C 6E1A[6H K; w+T/LLjZ3C} h#?ڣ\lR`Ln8W1k>'~.M݃׭B J@$怘5[ ,B|0'DɔF4m {RtK-ԆrX+Z4US ;4h@NncZ >Qt/Zy=Ĩd_Ƹ# sa@Fpgt!! P4b[Ԍr{gT(:^Zևm j$qW%[m7tje/o'}e#xti廜Mlc(zx6R")*μ}nQ>Is>Զ8gi\'n639 p%l$)ck ƣ)rbe5ͽY/;FKI& ޠs,m6m{˨B(HUŷUU\`-IJҞvRt\vɭH}ce}ry-5󗖘ɢ'.*>^%.;v@}.TbTm@bH .&nbm$JֹP)8W]5}wmϚMۏ@KiA[eԳ-X=eH*_%BdPnXl{ynJBQƿ+X-$zbw vFnbo˩#"\==cx Q EQѡ-):ri+L 2Η҂Q8|d U}l c8%ͱʮ6j=z8Eɇ77WBp8) yZ'FS gZѸ>ьRC>:1!4T=Wݖ@'*KȊbZD99\k=S[LաQ<~Ǹf8O#!pZlۺ@i]{Dk@>t;<]hЉZ(uuo=5g ixӷ\7Mcیmry۷!Ŵs@*R̡~"%'U2^-FmQ ̜L ǩL7u&` VKֵ"ŸLq8&D1&q/ƶn15j/8.o:F{S rbP3jmv*P i܎Cu 69IOѥt+FLGn&/D0yY(G#;hS ^4nBN'L{KRAit-fA7%wb[Cٷ{XYkh5x5z4O͓38؆C%](Cy[Dnan_ XZ9g,LBsōq8_^r܃sgQr~s's7TuIVϴ҆QitL[9)+8:<:5qL/4"|*Z qY,ʉM=!8s9A(zwED?,b8vh*0ƃGbFL2(S h!Cb2QpFMoǞ[:obq%pdbVm${P?W\oYSAt_@6Vt1"Jeyht\֒v*rS-1qr'Z|DvmG`Z7&BQgnE%PV,P܊nLhrB;PVg\Gψ+y RT@Set1z `Ly PWmebm 5Զ'] QTL^ ak; }7L4x@ JW(\vhXzS΅ɫZH݈k=t*'¶)핓vxW)nQٜHa8W9B3gd1(nLbe1&^.WHfCP'L1G;#9N/W镅֖niY J.9NQ|M.(j8.)E[˙84]9?>W(WU6S.a;2;vxPqZ]]E- yzCɫI{!tbL45Z$I뢴[3XfŲPX,mtXE/[5xcw۸ npleYr} X0݂>l73n逵] GW՚]j!m>bClP f*9g{r3u#NM!|>i3xHglfJi̴Iߤyk ~ ,jUDZհ{l7WzUvK'tg/hn%He0jO+Ya7]Ȼ h<̚jc5tBӂfF@JMv!<4eJ9s-ؽ$m{qr8AO]=x6)ม|еm*z %mKQ +$)_b(MJeYD~vG7%a%ݒCK4m?}ՖrF&/Ru`kK;^|kTJ:RxҞlI֖.U-7.*^\ڳ)Yi$FF)ڋ(;l; q =(eC}ĵ,lцxdRq)Y+\,w ד; rQl[#rOL iz 38B^{*=ɗ;@7 @1} 0#J"9J"ɗ:7^Eӊ7KGZltdƝ7Y K?xX8<¶m봇ΈnI^YTya9I'3iָD)IY.bhvs)S44a-!*n\!.'vo2mH3)A.z}vQNc0$ ~]{~, (#=(l@JU8v wэg7x#Zv., EU|N0̧T3G 樈r)Ӟ!@ۚb;Xo WQTұJɤKmtHp>TLDm.*hoָnӸj]DV5w]ğ;b>CSLjm1 hܘv{[Tͳ k܌>THRa)5,N54.Q*E;-dD{}e8n#RL7(bcEYdoH9j_-Zr>nMJ&# :WV[awy#TլOԶHM'.lKƭ%gECeK>偦kRb#|(~P`kq<~pr(@P`k<@P`W9Xv(UqCr(`v TŸ ʡI lmC U,C&0*P =7r( XָP<0{CP`CC6 3C Xv06CC˝C lr(`W lr(LeghG+Zݟɗ~/ҍq(p*U@2W}٘dJUmI3nr(oGW)сʮ] !^mcJ!*·7gjhrdY|;e[[QcV2jyYLT6]bSimtpN|`m v.=e U^RIc3PɯՖ"+^ϝxۉW8lTIc~h[R2EDی*w0._BЖUU>d𤓘[c ޔn̾@:,'dk>NROr#y*JzB4AkOT% |d=Iyo<Tgj+}1:L8y@:}'"]NŶӚ>t1B >=On7 ɲh2}-<>`-܎Cq /|,lGӦԡWy4KWEЁ^*(LNdz}\z{/fRt3#vQtt8_;XȈQo>Ggs32I}3}y"q%SS|0w8ݼms\^,-{>"d=sC,LhG˦8)EsxM [\OA9I^-0JUAsH/~ZL;?O >\aUd.%٠gg,kRѵdSv? =ahEy|=NE9*KAsdaøɡϠ3Cyh<S#)ΦS(F돤O=7vSqYiJM(ZjRcji< arMc1ȍR%374øK?~vgU1}fiY*c+tō;apʗ# 1HE@{. 9# A'r+fF/WϏt(Ռ^(%ua>->pFEL@8F).SϺ'_-t)XM^t)JQҌ:EdNQ*pwq&EK~!W1K^o4WpݎQ/]gK>HӼ(2M8Gg9*u6ݏw_q>W]熀xn?Nc:rn ù5}NWs%ɢr'Qr ;,ʍp "Ep 7&Ct؟³Nmhz pZBsf^_a]v('ThMi {cm^jŬm^j7VY DݠD=7Wwa߸—ΕGdHhѷ`۹mP]v3nO]v3t$lH9=C&J4ھ歪mit8ޠjzULe|Ule~ .4)&Xϝ^FXb?zb?R{W[QiU(-L4dp!1MCqӐe$SKmbi!hKE=; cJne^Eݽ^Lf_`7 j4( ]>z Syl&clϬM+M*4C RrR?&4ٙ3v)be.N^iQacR/d8]=>RO{3 ]t:Wչ2Εv9L \1'YfԋEM2D(jUEzK^7R).z*eP,Wpvl0dgW7OVo }kN)#l\QW07%L7;jo)V9V(z`T\I+Eұ 2V0kcsR0 G>ә3X^&dӈިjFoTMSZSJĢiW3*iV/a->E4.SӼ .38%&F2}I=*4USD1URKJ*yaU[;=@:f3]N[+MA uJ킢w(iS~*NT=ڥx7jw#o g{]Ǧg1]L]Th:qAiA{c˸1-ޘ\oZoD 7{gxS0^?EcS8(yި`؅jAvZ]h ӂY(N s@ThCD*tBǦ .L N>pcZp5zGw+-ޭc3*<iJ>g U]aTm'ATo5CJƴycZTg~NUWyөMU2ulLUp,U]B@ zd(|N7 `,P[S%d.T  U*sCsÔJxqYC!]ª})>Ș)>YBSƔ7-ie& )&fdTТ'B.0'Wb\aQ<-` &$T.Kmn-VI|)eU3)HA~@7 Xg6_k{tȏgųS]K{Vm< Og|Γ/Vn[յ5R{ճz{5z틼[ }SJ٣!:LY. Di%!fyK6ŋ#K:O2 "*TǙZ8øRsC:BA {"4|FCB yEiU;7wY}FGQ`ij kT3xjDTp|)OYQ!Eܵ|O6Ԕxi/W'.|Wz\hH3rh5X¨'N /Dw^`n(S=I>(Z2>Ir9l3JQ,B!I4nFnPyN-詟%7aYF6.TsIt3P1ED0̕*mø'6:%bCM;>>OJE=FwϤ I{@?MSwwoZ6KGs1 b/_,7 8[.E*Z|h;E㻌R5 sހb^M&ֿi|S©2CҮ|fڳ{х Dn!Y Қq'՛TT<(ݰorOlKI|l+a7q 37"%PZe:QK=ȩHz(A,k@=M抒Qgx*CGP1k;j2>z8?fciK6ZQAĹJh;s\-!N} bT> 3]61LtٶXV9}/2Y~&ʽy~fͧԃ΍Tֹ(=X(}>s7!B;}>cd擜m#Q> stream x]]m߯WH@gm/$#HkiS#oQ//W4~__9^ï}U^C~/~]_~6&~)U/ k;ɝ2޴/`d܁1Eր_<'綱P&u>i_b屎 ҇RtFTi8_k7k$QӍ52%1; (x+ (DC>PT(Œ G ƒ!9)P|rA>G\o_էe[N=a6.=~=yb~X=Eɢ6rE^l.v^u}3K*>NZgtEnI%7E5=sCNeT Bh!6=,<Λ%Q~`m"Hn"HH4^hQ$G(]&KIH[J87t.-MWbreuKv5u}F9WJ#VE]WADUv-ԗ?o@syU:B)=l;yҫꤶ@z+# ::\bHFqGr=l~iCKsAS;'(A>-|[* fG{@ptkD](Pu<(vQLGc>dgo׮dάvxYPژ."N8$ci5Ψӱ63αfFZC(}}^0NXAq)U4/DPBuf$U8ьGՌwv*&BXa 3nhckMz;=Zz_ĉb/Fb?ǺW@D"QpRM_d+Y.CrH^)5]<#;C1(Ph 5bi]PeFhA.y^*Bů՗p74WG*Š5-FQM Wŧ{y{Qq>-9"rDb%'O}e?}GCmL7N7  0"XB۠uMKxED a,ua#/ puúhQ +mn-CֺLxzԓɊ8-̔~Z?spbra^1ALx9M@b2B煀CmJ"b^ ͠@P&J3HӬ pdZ>3l׊cO-6RBy=.@hk}Ap1w׎;ᰳp2(Ipkm;{Q?@Tnh4g,RlU)t2X̆ Hq úguv1a%vn[c)Zp]O0xE!cFNr(HyEWTЁ"Gw 8Vvo#N*7YٽHa;NPu~1 @)]n1% FZm-eq^"=TQ< 8e)LcMxY(G5̉Z!2jUXG(i7ףyOaܚn &Nڑ=.)S9qϘ~֋>67Щ+7~Tc"E^lwԘw A:zytqSU3w.ՕA.iƂVj9PoqRK=ZJ1|VTcU4|k-KX+kF AzjGSyh6g+qDM!}=dzaYla+H~CH/Y~56HI1ZPeP;n!t;d,SAd_֥򛸤s#i zAӫ;%C'qJp x%\ܙřK xgxX&wbE9٥#ł<= sND(glo*i/qdXkψ%I0 c'XJYڳZOz5ug D9Z1Lnm׀_NuR?jk,%}O=Q6#"YWƳ TCxӢ^*A\S+E/%JzZ#x r=9@Ez#z3 tzGr/~KZr[Zzw+7~DliX'f<|ooZt4PG3Gyxh6/ϲKYwƈ-劫#}6`.\ALfz1%ŽoVB1T.2SQ886W hgMk8ZuxO4eRru.e=dž^]ʇrbG߱{JMRZC{PݛQfoZ8=IxF3T(EOi#ד#+|Ƥ|ѦV9ov<Ɠ\Kr=ZDgY{k_{~O%$S>ҍwT3\@:fɝ/̯,Q])&hv5љyZPRqfcb' qHx\Z7uVqL 7GVĆP.mpYJROC&W)dZ Łu u. ȋ?|a] `46DSA}&mh3k Ku_Ўŗ`o(VLG=b8VW3޹EG3$fE]F]~:a~tD} n.F䟸&bԮk_5CG;SBos֤hEΞ2r/R3ˊ=|gD?oßv+u^7]Aq>"IXsQO[<~>ϵtlA|Co'وmC6bǙ:@Kj3[|J0)p_me/nt_`<sclu63sqR( jtPK~ c==N{Mr#IE.S=ܰR3i{ꎵRkO_4#isd}_((}/k֞&{xI9o'z 63}^$(ēXKZTRIo8QHh>ƹbԋ>J+_OYDG>V%Eߣf+J#2U?SIH%_v]܈Jo.# b>ܸ\I~j(1Fu3ioyON#Msoˣ/[<8gn=wnNa}>Enk$HۦRdlaȂ*='ϊgK:u7q>u1%%7( o}蛴\x-F-u'n#03C nG"{U q$UN.:+w}]jxVy)';Dm(?K UokwlK({Bf rG ᛳ6qov~X/5ңՈ:CQG7LJoRTV5[bӒ/{J? :4Yjɶuhe˶'np^;u)\Fs#xU.z3{o;*D*ztn7-2r?_E.ZDYj-}^3.5"'r@mVXݱ(܀ֆu?mm$ř־} *VM?P~Yz< y6)psg~A&V[ae/6]n̐G*=ª oeV%,<-R.2s L~9y5ڗ6-jg#.V^oPOO񢱳]׾`AJ??/(Rdʓ`7UceFՈRwr=ͼJHI^D=]8}ӫø1V3_]NؚV{{HAyuw('`Uj؇rq5et2EvbE@//*R&K yBA!tba=huo\NZZŧwW|x؊=+k:Nny;:xɀRos:m{%nE 睹:lcVws&㩄ZO3cU%(E9pq#rl.*j=p;熜¸2#@z3+Z78s Wϟ 7$h]I,|3Ykw8h7(6Үv^Pz-)iKqZ٠EdDgV\UV]ns8EWqMǝ:˺8 KSo=Ne8ed0B4 x" ]H E9+rl3Sc@(DCz9D _=*#nA6ysz {Aı8 6-6#צ^P:$k,]WTDafH-r5ol-n-r}"i\3[$Ez8Xq F֭pg Lpe٠o <ҘAA_NT @yDJA(((XP5GS]zgsA)F`ܱGo!z)nR$̎$.7ZA(UWãW\+u|hlsɵwґx]N7B;\ZvW$ '睷u:$o]{ɸAs!ΔRnfvwyh-k^#&{p]#*v1lj*۰n …qtҋuSEl@-T+gc=Aji] NRf⺜G XusEX>")bO<>QX9Z>{&|ʹclc}4ϧ̸!Zdm&OaPvNA W.1ry+C!l`L_k<~ksR*+`X!0c8fƤ޼#&&`thۘ@±OpyZűE,h#8ZDZ(+gF6DJѝm*XꀗJUf8eHAYmҼ@)bw(ݼX %#s`#嗧ePQc 8$t X'{֕+a1^i$|mMb<^/Sy$.`~ʥhPEmz駱~A .ԧ*ʯPsb4Hk07.f5 ;ׁF5b,~FÏp P(kƧ}*@\ק J7kt;6ܝ;p۱c:˗os,K1:9cmNa`V7="ZLTr"p c֑J7m+p A lIcIkij' rfH6xlB]6i <;MVCJFtQU"7*յ-Iأm$AWfGEfub޲mP yܝY#q7ջVUډ+zsS+m`S[3ƦqS@75o٠wI0(5#5g>k&bIM>-5ݥf7Tڠ~{Ť"ߏ'JV,h:yUmn_nc^2n~tRZO GqE5"ZkDvܙ"nR$=OͧZR/8>in잌YR]N.sdg/(#:K~ۺG-e׵Z JpsErw瘻^:XFR"mW#l^_~1q]lUo1' endstream endobj 29 0 obj 9469 endobj 31 0 obj <> stream x}˪m]?8zBa2WP\}/v142gǒ BgG_9?]8߿hL??~>3_~_)m_uլy3oֿ6p?p,;;pk6 Q&4nj*?"ض%k/1`;%v U,ºM uJQ!3ы86QH6H/ pZ)bmq Uˊ=oᢍq*|1>/K1MUM83B?ߓ& ! >EsD Er_ZO#PkH8 $@L  ;=VVZl}DV=jZ~\x&f YF0г\QB`g P4#t@]}tn 2.JoE';P7PǺd1_Jɤuh̬ 5`SU}/U5N^c&?EXB70C@x WLi=Fl9@j0._%+ q^3Gc܅ H!|9_w: RX>o#6V3 T8(N;p4hw1X{i,@ ,8!)(a AqY\c o5>jw[ۍW-"7(,nI\IooH/g !WJWLpƐ:"(ѫ,Rp23X/beX2xO|qD3lNZ.jGFn4G37!y'pj&fP}O;Zd~Qp,J׬^d`6g r[z"t VG ?VPgz!#XA!]`M Wgج9,CBZ '0f?@8}|o87] ݾcۛGA NY|6\U["rdG9%:|cPܦ4\];8o 2ͣHY,`Mԑ>tH`6- ֤krtaQ: j:yLt+bflCT+Bn3$gy+ 6b7 LXՄc/[8QsR(^JuB(|S!|sB(FPPɏ0̩2x-?mc1D*o1u:jLދIH=]#;769Kw錥Ќ%R:^s)jgZۅ%-gg{v6jg+Jx̯(\mڑU˗/ucM]ۤye|]!G;ōjH)┊QN~lA`Z=֊KlsE3kRe<#+3xm՟Iw̽_LVmdJH-)ayK,n68#.qQ9bTmԙ:VwE*,#wcoW/jڀ^(gQs,4&Sg-Z~b'g6mx(fz _%n gTY254'[7E{F)VJ^3UΚ͍:@&%E 5 +Ju -֑Vgm̭׭pBQTS7:L3wݠ-^(#ęm ЛIG?X(*X?%VZ"b@ )ImC}'U~ġBvA eNŧi>+wEYLwc1Qu-<&!\F&A'$u0{E4'D SC> vR^ !/R:3DRK|w2}gk0$=L1pɄi/;+`NXC!. =!;wgo[b<#.&brяCR qa wR(ƅq}|ɤEtސ=h|f\WE/U([;`]t1nG-NTM3H ʀk[<%p Υ(R< R`0C6dG>kZK(15 Vq76NR8qPB8ϋۗaRKY-,ԋ,gz0 Rae䒩T^<3uW {7]tuZ/^?!*&u&t>}\*fkK'xc`5+bɫzOXQP M.$[hN9bUEfEg:a$n~@2}^EL:h;VP qǦ(DJߑ]^;CTP>)<@ Q ?+HQ0o]v|-\;7[`c#eG@=yL̂DaIlb".ɗZ7UЙWU&,XW&Ha\ E>"!Y`^4EU7zW Qo}w; &襥6S`?؀@ ;Nw+TD(b?YgAC(ieU^*^WQ 4=@_ÛpWFeBz:bL8 C^жs %* >J)M߲A&2{DɫUN٤ Ӝ*vU|iw0=}6zVov!]Lu,^k1a9AW&n^賽ԫtn@Nlө-K55=}yMN ͨsJh'HjmV/<MRm K@ Q̪idCpPo!|}JRkVᡒm$?976tH6i_;7t ,?~mˆcgRdzOx=@<>1x=#*Ttλ=Ec7#C||9d03]wُt>RO wW~-Va^*W2 h1y*fKa/=3cR!eiG52|hcSbhMh7XŅu}Լ^ImNy2P (mΐը03%[ˣҋEM;]kj5hxF`bmP/ȏQPL~|ulu e'PO#?RltIOYCC+N=@ `T>Qg .#)lͤT>8.\n~#CzЫ è80]<\"M3Dw2Qk7 +}? tP:?P_JM3 'Snn KX~z+>thgN{.$=s2=2]0zA#C\_ZP܏["iD4~wU3Q_Q~OzL65> bt1]﴿1j1'"lCGagʱ`q Vȕy!u!U>wq2MH_U*j='F0 +tvH(g= IiN{Y I>jWt*)5:]89Bz^ pEK+ޥga憶55)^0Z \Z7 K־$=Ew[Cɚ/^۽bRy wEװ]^aQ;?0:a׍z 9kV́^ɵfQ~Wuw+9 TKRHXקcsMRUG_fv.}]|Z#P=Mx։ 7WWKv0.t+=z70KA^/$?e/ "޼Q&oa.} 7ZyB[笋JV7^IȒ%t+* 1"x'( pt`QY _;, \?@ oؼM 䭃7 7LrM2wg֫6 F-ƼÎ+Q/&B^@x=h5Mz;"↖zJ<%N'ٞkIc嵡̔^&nPu[fcTM^䛼x^ńŋnRHJwE<3#= 5.orjR-v,(>x%fGl9՜Kl&wҴ*vl,,-R]vj~jz̅"Pa]'wׁ d%m zL$^MʯWi, &p~C%j̀0}֒I%dR7^eW~ẘ`5tFd@0.7/-N7P۠4%H oP(RKu=#ǺMr{SХEJ+C>$FdS+ dNFQ+˃Wx[#Q֕.7/pݛ9&o]=V\ޚ[bŀr](RwWJECEJ#oe@-W6qk.wę˃yEŘ/S' zM#|i˙r&liAۣ?LvA q\=_e3RRDZg!U(7[@zḰgi_=OY|1#pȇ䢑r.F*c3g|u+*4Frw1gbžf{XP ~FMj"B.^7tYuu4YQS %+b/Vq$Q3{x犴+عD WOXW=%V\!O[Ynp V]=%7(=`m88r>Vl7 64g(WT^o#)*7TxvŹ+jBVp>:LVs5Q=T{*L }mn@c15*pp+/~E\Z e;ʏd#mXV2DXQ5'L&y娤Ԧo V  (gպ3Bc]co)NU댴;GjV y\(K:i|)Fj.gzN:8Ki&op'gj[9"j 5i ]nQkWCov!WK;yAmbz(ƍO~*1Ϊ͏UX}Ѣ3j %fh JjnoUKӬ/E_;bDWcjBwc7>V2ŷs{ 8:/w7]BCeJ62:d.%&sS 3OIIkF|9h7j i9zFXQJͺ̯+6.y ͏V3QCl87Sh ыcSuag != t>]*ghiֵeQckE(/%=\L:E@ǂ.cvnb<9ظ򏜲'w[LL;k~~wt+\jv ԟZxt D;7 vhUg\Pj(VcEM\Igf(z2!nvLmF=W*7(F{ #)~ byv9ozޚo\%Z==m,%6Al !1!Tsڣ֨os(M˨޲dRӶt¬SKyzF#ʖ:QzQUZtYN) ._f#qxxݛyջy+@y\4EI$eQiEuG/N _XK~{Ru9_mc͵9;K77[Eqa-I]FYغ&)*uc!zsE #X[W"TIa ܖ-Ďauj.Vz+ *BL6}?Bs}w& x>dI[Ho[|:x}:xFT꿸˗q$+U%\l$.֢|lZ!" DWaQC5CxvP>({ ^P \0y=.3h)AsL^Ai3n4Oʈαy-RA)p%qO*)%n>+XKPc-`%8ycUTڗWh,<f(t){UZ/փg ηyrMTֆ.i]z#~Wc;ꍖCZ(Lo {{Em>9ʟgOJ%9[:K~5ݥ.J_~3kBf8 r8PL7їe47 0Qs0]"$nK:Cu/_=ao5X~bYhF RHHo. @+t^-A#0C.tGR=iF(%=xXX`8cIƘVrd՚TghTu| ; f>/K_\[":cxm_٠D!c+/[l~zbw/Wn_gd?u/=5Pu@0]C8`sGP:oc;CsunPnc#>3qۯk8hRһ2IX߮(zNҥә~ьu?>5=%ᯂ% Cz: 'p/c 2Z&4 17{X#J*!Vы8wL9j^ rǻگ$dƋ2bGYN/`/A/ny HYc[>Pً˛mPŶIZpp!ix z~}Vkg@9\ld$s&I%Iv\Ю鼩b A7YOq_8ՕK;XX QEJ/d}}Z7U@/&wm#ħ#QϧۚހmRzW>=pOF(r2_kR+Tгƌ3q|le@U4 q +@)d6& "@>=Tɩ6:GCb啲)=ڠ :JTl*Nfgv^]e{iix::zuF&Qlc)LD=b%8jLkR]U+&U#n5_g^\nh=|&nQ>Tab^M^BV9_DOBMҪ5[k359"y;o+0KET. +7LH5:E2פ(7"-@$ZD=x{ĶGb= bR-xf*54@i%8W %,XwNԺ/|v)2;^x0^$71Rg>ǁ5q(z.X.> stream x}ݪf9}=E^"/4OWwc1 nf^GGZK{2I 2>IءPo[}k)|}??~{Vk}Bǿǿ[}F^|;w&=ߓ L;4@oiÓt=.sdh1}/;?#!j Є BU7JQ$T jPz9sm Ī%:>4k v~NU96>7EOu.EvYQPChGn PF9CԜ JRVQ7z5'\MUUMЪZQH6ۃڌcih ] Z>Q7(Ju,64N)?uCŵU\k``+mga&A:g 郌 Y` Zr.(.|"#pzԺma-*p8#ɀ7.J !;e)PP$`J[փ8vW4zF٢P/ȑ>1N r H3t98vPSKFhG"4]M/mG9!qc( 7p ۊO Mjqg"8M'mckcQX wl3$cay],֒!OXfAU.J茕z,es87 fp 8#1uS^3v@ d7,_vh-Kp.u*!X)RBz?>.Z@>#VޠqڟN䉐tN"r%8gҜ^ SC!3SwGdQB&OIo Lh}bm!}BYy3r" ?~wCĽ&FbRqiw /I_#$Y= *zVUڿ"hO_ +kEkK čD}E/✯( h,;NX y/X4 !EuA|bu1˟XřC*FZ7Vę>'ZuoQFJ3g\o} ;?і^P!z.'~hx@\#l6=7.(rط|$}jNbsjC fτRF*}#hmEi G.4>3?wF貀B=l[-iZ2<;N"X 79pݹ1H!KB\#.B?~wƼ#V7v ao;{OE9ĝ 8v(Ğ]P;nԎ$5SJƦ:+\]qN|=KqA\q>ΚԺ#.(rq ."%hsLg<+("7(k(AISLQJg&u."NG1R隋5PU~R#mFN.1ªӮ cg`!]B{TdP%x -,1Ɲɰ8ۙCW` t$PJz8,E_p}Fl\7b?~wPFrr=ɴ 2@g`4FaŎp7Iǚ>.Q=yqM$q.7r2X*V$P6E\ٹ|65xAϊv[\ f-/`% .%|M μi(at<{A\ck>`"AH|X.57fGB;R+܏S,gܼh9ZkEslQyE-񒮟t-3 ĕ2GJ<6DXM8ae^r^B*|"9c[ v*$F oNwd.;Pk~ zߙ XhHf b/@{Zpff7U 1ʆ8J_e"biE\M&C.P WMKM;Dz^ vy 6^fLO^Uf${RHUPe5G^` V|aY3/ g^@a5ZWu g;dNS-*e/O_Ե40s<# TEGRx,j4'/#>wxFĠm$hWm<,܎i[5).H{FA{@o۲B!@y)V/]ۡGcEAbzJ I ۍW9Q<5QPFčhl-.!\VPFT/ 'B.~, NTfArǒNQȘEe]X+>EBC'܂"Vǥ=A=5aԷZZ5A+z1*ͱr y1 o|pڪ1i"0P[;ُ?F6Rn|xbf<]- _wvy]o_a rf?3G\38KUBzִ#EDžq|?-B#PHqJuR&%qHgrS:%%yO @{=rA;|"T1v>eF{.Folv1 y$V%\|BYr.yPJmcq۳2Uqh܅0G>j_,"Tұ-Wk^ tqrJrd^Ѥdi%%xmjHҋ_\Њ;Ր#ϬSth( Tc+\pKR{\>a."٩i_k>T/V2ifl1ՈD\1- UK$]"n2u$N٦cYų~7àY|Yv H$ﶡڂRoEnPʑQ3X#d(m۠t9/V`2qS9|"'k*`X:ra"#I87C x0/%8v^pRҋa7:rī76&Kjcx>j/6?7Ky9}DFA9?Rmh3sADA`fΑߋQ:5/`3H^Cab%!M6R@(G[B)j-eQ[8!_@(o|ƙ|مRyyxp% !:<,;I_9y#m,u@B&HaߩIbz Z=|*Y=tIXhkj=^e](^&ñQ{҅W94iK]ͱp2{Ea2?~淾P3Zn~]23 1S ^uX ES@(M>.G_`Er+x8ַ2⼾ UDhnt;.|9.EL潧ˊpqgK"+Mu_0<MV-Lhe3LJSf7w qeJjJGݮug2]682#Z4NjF; b= qQaEXg]+Lտϙv7H;1q Ť%y {Ti`F%:f`Y #VB+_\K`c :߽JαyN6#wMgaFQrRxd_R]=r4i#Yy{ә(U &^ʈl8lG=}_yfm^9}bĬjqh\FԽ^O67"G(wnҀ@l5Q򇛝 PM s7iNjz jT%\n{=Wޡ 1ż.8yMɋԞ(v%~GS3 Y+-!ΔEyk/+A(-VQ3 V 1*䚞w(P3('\7%|E-Gjl!SAkGjҥ\yCzɃPw;'"EG(ءbOo. }:o:i@%vW32Ԕi-MJ*^V,a Ry &oaU{).R1@ГrcA#V{E~ZvP;lGd0OK95;v\L-^xk^ܶr69" B KG!p 90JFXȔ~&?Qc3r@RCA*>y?\ ֪qj5gIXq>q *ug ;lЗ7V1 WDb=g䄙Y8Q\CDz~aƍYH/0SϺ )ᆴde:w/8h%=# 6)H/)̔OHma6OSN W>?~z\<7͊-xTz1(JF^;,i/pNB"~GG%ɐGlBȔJ'=>~@vi**~tԤnj2K:ZԉG41Qʔ^b{<ԓrh#忀f1 76 ݏ]}[_N8-u EQkXDA[K l #yəKzAlc1Cjq{;=t5шbIs|9nj9fϑeIKx4Q&}Reon#gCVAS@V;8u3q=+]y=KI0zȆ]z.:gmcm?t% /ECjI3wb㕉"j揀[jUA %R@ h˝hG}}R %9fv^yxD<!L۴vxw7 7;zxR<٘9^v JeeH%ECPLCpG;Κ+z N3GνU,~rl5PoPܗ = `u6rIm'ƳY9VekzR9֓X:-(]jN^T&s8)zdK.z5y5vteaZk>5RJh JIk%?{3Z=-䂹z>5URmjVH[S^E-7_3}//ss_(Eꍃm.Rp_PO˱nKI(> RDRJf>NHi~S(>ĉOv+ 'hYȲ Zq4i.(ZAh$Eacpׅ*^w6H?5W}X#A{C)/ ^mɋq P"y8afH1XNr%(zyEI.$Ęc HAoFP[P@*e;Εc%.+r;8)&o)6 jc@#)1ui&ӣ+bI.AgKq$Թy,͈3ލ@;(eOІcj~2,GzyɋDWn9so7ܡHKQ<wSm,])Y%we{ؒe<0'ןpBp1t'ZɯQF Z'Ԏ2DS'/8] yGO#C) цapFM8u 2 njG{vBx&eN#zI|5>:+tY @z*յ~!0Ĵ/OMpM3TĂRS|6(9WҹqpbkV5xqp|^@xvT;C=c7?i|ﶆ}Z(u|\['Ӓ ,oKb@*w[֑̀tPq]!\C[Atx_pF/Ŏzw J @E)G=o>?!kbi(:ـFf&Bۀ""K/S)~Fh>lPM3g$h$6K@YG m7j=8yz@R^TrT#kEIw17)\45tـ|2ݠEtk$(cD>ݧhpңYW2TTߥĂlmFG8Q L|Il^tp6oEA8Ӟ~TCJ!txEӸrY0ڵE=5h.ڦz~8AAzh`| .&pQK5\#`څS[*J^ߢld4|Sʣ)*2I4<##IMm%6ɽ*_gy3c)ǯ^>7P庲}\1='|XF6&3G7 ISAqIcmXΙֆٿ3pTFٶ\3gΆ rCR~8VT&T6- U\&;ѱAZFcPn: =e XI9HGnЋdt7QRgV:}B,VXrA0f?6(2?4v|j%"z~ 퀃Gcaj -3Xjm_ӸC {J'4X 'OaKGc}]*J}bEj|C;=~4ѶX%)׵pD^NiCkJ"-Pk6h v]v#uj&<'N렞G){7}5oo|nB^*n0pˆwxinB 6qװ&ջ mc1?fP`V/\fZoPPR$VnƋ^.\6 e=YrCS.$;U~z*. *\@ H=^6WRp(o,P"5y;噅QXŶ [gK0xl+Yr8C0qs( y\3zkNu;h:!T S Yl ٫:z$/\Pʅd.\ʊĹx*5sѩ8mn\,Y' і _ANaV43ʞ681MPB-]zـMzmQx1wk}я"Z.ʏ x/<8jޚqUwy5s Sgn3$ ϻJmĺomwWsA~ (7or}~z5ms 'EQQf^[Gg7( ;>=]<8sa,ћc @f=iX}4v ".o؊l]b=0 a'z ځ ("ǁIqgأ=iY g7'V8gV8 zR^4=TKye~Q4 ;ctLG6(ŁG]je%Δu } MޚOIfR6+MVp.ΒekDvURo AvW0=?,1"G 4]wA1!:ߧV2*eo }.ʛVInxAIV8XxϘNjw[Vڢ ƼĪנWiBxV#`州?o+1jRx@CE\Wbm5[ Ҿ%|C xk^H=(;ۣr0fvQmJjR|g|Yl 'j o1CrA>`Դzi h=_UA5 J"7M궄|zGs z]ooPh 4H/tB1m_bXZx5jяLj8i4=!֌cq|ș[±)o&g@Iwt7R>o^_Tg"F:ˍ<\v`.yb/߀oJ/s#(Z,h_!߆UK.hAIdn eѣpE8ZG|q; 5EfNћ"KݓHFՒ$eGHx;ndQ *>G&JZ>+6(6l4suy3Gmhֻm-C|fCQ~|o2Kwy~2O1iT/ІyH(3sk-JAVv:53rGR/(ʍ\ͅ?b՞'}7(bWbF׋~*32xN(fBt@ݮ$'ٌ>wh_Uـݍ9\/(n-(Ğ=R3{m,XXzV!.6$7 S0jN .u qx1 |AY҂ cȎ\2/VaRZE0 H6".c,f">ѱ*GnFgaШ)UΈBb%S(ڠ`_:z3@%;{Ⱥ( % k):X 7m4CTҖn]3CK0ҺF(invY (vDKnT"> stMf>sttqڃP1KP:IZGEń=E{&* QS}Ak 3Rxn!67ᘨ90Q$c[qqŧ_R.-rRٟK㑯Ol/'Y`o ޾zXt$LFU=cKkJ cdj2r}޾P4q{:Z mYճ~aHC_0jx7\8hGi_xp'+}u+i;ԫd'w*iZ~[׽S60 ]', kq) x$?G_|Y=*w.?fO:Bm6a<>}nzs1v>#挒1Sp]*./tn7SzbWGO4e<}.~$v)Nhљ| #tnvbS,!v%djՈv;}/Mq'2/{6:=FmǙPS%icI]ܧ J>4R /|_SPzFcW~rvZªE4n{ȟP<]zR~)U mi(O8KEqjη/hƤZgR{p!&6 q9硧iU3K!|FRri,׼ѼFNb+ofIlԘ8uYֵ'ZmބfGiyF3r b!]䫻zd Gn'Qےԧ8/PyAk8i.kOX üP%FMJmyVgVȃӅ݈r;Τ^w&ڼ ,v:+ Fi*h;ǫfG`jD{%fdHUC-K7qC%Ptr Os@d9}6 k&nGiq4Vަ(e ͐S3UQ3.r ]g%U?wzI/`T #R ԩ⡫kBN}' '2 Eɕ1_RK36&ݶ*I65UHz[*}*Z)8XrFRcR6xܣV8 Z嗞2XG Ŕl$#^&!VO[OM">:oM%kjk-~-I$F="@)vN=xd;+^#g= 8Q9[&]:ЊzL fMZyN*ʝ@?W z1 G\n6ȑ붊EMn*i^GQ{hI%idqc1Eo|N|H+%&Nٰzb?+$v/*#ȍ{AS=q:8r0zvE 5v> {> ; dGY@kF(E,U=ҳ]Z'VΛԧ %],z١tX ޹T JizBjУ"K:1!vh.!'9yq~vDЬ?с]syr]^v+q.zǚ2ѥ؊M {Vuo񔁣Y!JSMRQܪB["䆟J9Z9sCM`qK a5$W0hAS-E4KҨ]4;6~5vp^BJ@ J)AMtϫhgA(/Ë7&f>{A,iT5ͽjA6e@ypށa_5qNy֛t͟oP:+^]غӫzk|)JZHURmok LOMBi AQ BQC95ZY;ʢe'9 F9h΋jRM俨vjO¨% )\b=ƣWd~EKs}`b~\I-N hb- V!ބP Gςr'Oਖ਼èdU^i$9>3]P V}KV8QJ8ݸXky v|BN[|^ b ~P8K]fq:4rh,I͝(Lr}Qb*Q,# Ke)›_.z4BJw%&CLwQ'\ >Tp,'QsČ!WN%8ы;eOif?ȶ6o#)Q#~nt,Rr[K-7(*`zHO=OԨEzj8{u/zA+`uGʡERAAՐ"uԈԹD:M~_ot<. Q:N-6\/6xa;mWv He_~jdٻ(XW\APJ |ZXq絝͈XaD5]:G>xauè]0aM3ȆpKvXtZ +ohz Xz>s3j]SֆGpB(gkoO:nCevx4vn~AqŸ( Ɖ#@ x}5sD^Skf#z;fFs&Qk>cg27)6(UHȈ^OF-(3Ž"ncpף'Aш|轹7h+E+Joy[qJzuA9s5F_$iѯj8*:L yGR`5^V4bchҍץ{iEdrN5- 6I5yg bV|[wV _3FQsD>*Z]kͣZ! Vb6U|̡#_&<"Ԩ3Xa>bfQIaZ\kjSߔjz*Yg {Vجz|r;ީ A>!Tj`gAZ'<^T-a=[s_|~_ ߲?z1H endstream endobj 35 0 obj 15058 endobj 37 0 obj <> stream x}fnݼTtn9Yyį_WZK݅F7$) ?=TF?wѾ?o迷f_?_K?RB7l֟{H)Kމ#[bQe?T+HEn-X~>Lcl'&^[B*rz~&(#F2X^?"u|F@-Ro5<œ"ՀPc8Bo{FVNQI٤vi HO1_>~Y}Y}VZIyHKIj `Ŵ/+Һӗ%񗕁/~h7zFKB,5Fqњ~\q5CQ9J i:ȱ_Tp_K~KGVIos`GI7hKPwD1|Xc@Z7=h$d8, MJyVdM9 ~}d)d _ڑ=[m)Ҹ6ŎR՘pF2 `e& USr|HŌ>-`v0{(q3icyB lu<?f,Re]ϧ~\qn[+l˨FFmf |t,4Y 0,Y( b-4PpE=ܗh![>i˦_u2| }@iƸ 9/xDw ʗ;M Fwwc7gl~,>9ubp`o@1ԝ&.֝㭈}7}jc~F e䝆]҂I*M\TXJ{+d 4ᮆ,ϬmG>K+݊}ժDй]bې+:8DžO1͂h~a$BIX{+%@ }8qFDD\ >-C`(Д0BTPp$8 MQfEfDHw@ω 2R gDTҐruD5x!όq3JFzܑgB}rIfxؤRϘpਹZCXL`h G,F]5u'l9 peF.R(g޴ӏ,˵ '#hJZCS@Qm*hz$ֈ%#m)_ #U]Gtn_.YnHRq2mBS! WS"ʹ54@+N~:CJ>ĀRs{ܣp/qّKFgگ:Jb| =BݱNFeyx:I".am" T¨SW/հKs~=Gqn(b-a_lq3"$Y:R)j3-J<{fq5OnR9_*I]jM.]R)q:χzY{&=ǾjWGLtT Xk!@p3KS-U r]8:c㢡Y`E#〞)PL 'E#sq fZ@OE׊TD%O8"ŏ.:q:bo%_|ȂrT3-[Ĺr4㾉*qZЖefFfs"@8bڦ̿Õne*| 7 ǵ,5.C֎ڣ83z֔ F%%;CYGRnbj1E\y5QT&#{<3uoL GlqԐq{@*eTQ#n|Y(]e73|gp=Tj:lWD7LygKIofiz OYd*hg @MH%loh7y iP~Jc *T-"# 9UR$sP͆PT@Yj[AMY&oū6}g"Ikz'].{HX-!l4Ͳ^m}S9-mqJP/FoO !7*"&S4CFZ"[eyc 2[|D O?Lp^6c#͝hDgᝇH mhEnqT[STI/-Q'JHҐӉ xB3IO(&y G= bT-'?y3"D\%qR:X%e?ݨT W?/ Ē|Vf M"$5)I [Z.V"ϺdD7qeUN5(QЯE-e 4叒$&Rx5 % ţjj={Of{D؆y :qFF0YS"tQQ7]=;֍];'U-.^~׈# m28*sAXq)vpLY ol:(zDrXD&EЫqB@>"8 zqK#R*~umxJj8l+29sA&$hY%frzAB^{aBR5GU[JUJ䨵W/J*$W+泂K3/ko&K O/HW aa~!m;} TF"C/f_بX튉uL+8?TDRk){RX80F}äp\•dEr}*VNɪ5P'Y"X3ZJ )DSҘ!^>fq56ťE)Ӣ$Y.2NWHdtl}=RT#uϝ476©6W<ܯR_rWh.o^}oB%VɗP1Tڒ ))\ؚ|*ylJz( 6 - Yj+=fJ£Qg0,4/]";*ŠST3hiD4b1gPp:LP,;Q0ځL.ڷ~˺´z^֣XʮfZe&u=K=$C-_Aer=Ac]֭C,Zb F"B0f_m-\hCG#ըqQna[5Gd[DIqzUbV`_mT|RR~CYLlAڪf%_ʳh-hwl̤(ҙ0JwhQ ئyᢛ/.u3[R7)%d$A[rQT3!Ꝟh3{XE-&߄|oBjԕaƝ |Q W'-q rL/FhK!L~(_J x:g 惠/Zf6kIg̓KV5BeY'd_C7:z-m93T`~`~o@\ea%j-#[Hiotw[>U/ EJ5%\٨| xⷣ:Rm¶4n9TVf5hZ;jnP9 P="W~jC*ΨU=yZN%Fg4F{C["`Q\ OۚPN$E%W*{^ln-gtTFiͨVOy NjR9w\C|/֜")^&!!{OY ~FU,L-!Lc070%Ow k2J~@*嵂1: + O Rw5J-ɓkɓ_"'70R`5h<re1[ڝI$}Lm̯4ZҲXq {va"heK6wK"|"Į+2nI'P 93F,*Ueog\JHUdHoU|99ĕ!\j̷}U@ե xҼ:Szmgm*8%6Mp$,4:at,xFEنKm%ݪ4ĦLZ)CBɟ4P oJV \V8'[t(0Qb| /=.6|!٫QJ963hWth01O MZ ›g 5aXC<Ϙxqly=Rxq;Oj>` bByK^6Bb*ŹQ5|yۇJwkt>SԌZ*mk Fqܑct"NI[!NeUjWw7*Am\,BL;ǟH߽"m!ZEl7Yv#RI,HH6(aE1ЁtB*)#5ªUSBɾ[KJ7|Rv^Sq>|fe%=-j^A*Vw`&D7ɩ\LQ,Ǹ/9=C1f$}~YQS" hA<>SUC2j J!̡I1^h5(7s¯N r^xPJ_JML]>He{{Ӊ瓿Z-}nJuZײhqT#dS|lzSoT*C+K,(rs)7*ჴAqL*UpLOvN $azg$L lR zL}ߜ@衖f猒 ooTIrL«IHxq6ImݵVNjԛUxIʶ,yQWVR&gQ0,`tOm|'0RV_TdU[.EdHʸ"k5<ě$V]mH4?JR vYJ@++uw-AؔY*f볲e&oBqwvӐjXjT/f>5g| u.q QفT*UVb%"0G^pmWr7<}ݱ&:FDPH-b({w>-)cRϨXU5OɐJ/Rlu-bŕv=s[G١{Y[ϔgx<̀urF<`9I÷♺Q%I<^L3//(d1M\L-Dޕ%I:LWmh '> p6-\ԼOKZ~]^jk]"[`kVUfiSx!#EQ/>,bQυvMdoGA,qFOnm^c[ʹm^{]U1eo jmDE|gRm7wf$_K儗2^ (₯,AZRAsԘ6W?>f*M ɔT#=~?~ғ^$obj\WR[3ڮ`I)%Mnޒ}U ]0" @N6.5hBPA{{ltm+}a[$+}&y.{VwܵZFeqm)db%13{DU!LgC\\DO lI~ī:zv㙎mz>Ou1t-K] Hivٝ>ϸ;NkBʹjV<Ћؽ l&t}sF%km1-D=jAoMzrٶz=\ q.AChe~My(zNYgGOKLr6+zGאkos}M mջ CĠA=Dd^!rܸ7;dN9S"?TL^yapx\9}άoB5TaۣS\-p~嵨{*e0.3EC=!o+ [T7\G.(trEpuQ6b6#vGR֔Y̅IY ӀdϞoݴTrs;Cs'rpe^!{!7%"W~#gْ+t4OZG۠2Z+g:"Hq< I[01t[Uvlp^%Xb칠V)ee]&ڨt)gG:FBvQ)\|ٟWW3uзʡJD[L ڵc<͗B #˙ xK9;4~F =^>;w z~DvH (e̯(˘`AЖYub\@C'85MVnsʚ|C;קڈg}R!էzJq>bBK2Olr[t[) .W/c-ծ '^1zQ9-ԗla>|ϩ, 4(p+H^b[vUR=%VQCg.+z!u금ʑ'zO%RmR1T 4K^OεUJ%LԨYfVAГhN($Woǩje4d1x!,૒a[~<"]lj}0-ؐgjT "rǽaHԳ( A/޼%˧k,!\Лw7wyȑ`DƵssڪ? KT7,!ξ;Jy.&bo;q[Cѳ @@\b8%AjZzç,0]B 9-ji B*A%g!䌼6 E,_EzժYɹXEERQ\ e8BG~V){A!,6[6D/OfdG.q,.[vYaJZ^JOΨ6;Co'YJkiz٥,* z e5j%*YREE#H-\V5\|M{.U "'َg-ͳb_~ zh;to"'hbKح<;#ҙo*W;-1T؟1HثL w*2*Ⱦ?-`=PRD"3.HlIaݕ> T8vn@e g_Pq\$O)tUJI"EV⨊ja"4-`ТhdLH=蚫kMϗY <Br+g98JC9O+)N(M!&S~APM(__bx\iVOU4_RoԚ.~"WZS39OSN>j$Nl'7YBTڧÒ_DJI T|^Txi3e73R\7ah+y rvl/CDq< wRlKʬ4UMGMo_7 3 FDp]Dž-&,WF1{dՐfdJz05˒.g3yY~} 7ܳ}eҳ]"T(ƚiGmsO.:\{>(9UhII~ ʬVfLlj]}H5߯Vv .nl/jY+:k*{OsR./'g_msj!־sfu"bA'D~'xYGz$Vz^}.[3Wn_01w X L U=uZG!.4ͫe>W;/+S].+O>#Ǻ…ުJ6Ѻ6%nt]˙0x!a8G\c{aЍx݈gaЇxV4F{) *![[R|Y)PMe-u/WI l<)yA*6c<4+(zё&g4SCYIx [BJ R&WbJ6g6@"J‰,꼊2tYHJ9=qClhm\L4@eCş|ijKCО ˡgjT2\ř/˵h~8 (/9vY!0q\/ Y^mw2( `T7kO<]dj{.x >.lZN<N[wL m'pqIPX{t;_luBZǗB_ꡯ_k;ܟx!"OO[ӗ$5EFEh~ӌʞӼd$Sb) qQ)5CN 9?(Cb)ǖ\֒rle#~GRgjUԈ3ݴI)̋V #SJ5G'Sv6ⵄY$\+Pӝ+pHiDI.4z) E(JV+3`Rp8CϜ9p9yRՌRz>yHj8[W*@MHqs,_PYScKa[.k7rYy}G {̱\nf9n*Ӏ%r,!ɓ.3\iaϗb"mcm,Q&fNN;ʙTɃR&jD9B󬒯mc HRP(KP,uPA3'g%`VGi~;hC𓄌.k)oR@rFXLQIJX6zCNPE0%߇7ϟ>9<vċ%w>90SEmh~ꈠS4-)θQh űt_{5˶ͶogP/D5ZєN+8R xJ64>@[BYOJit\ѤA)&jd@F↻;]LRR39ZGIjsD!lz7L}SkJA:Sr?-@QW;/)D1g43YR!M甏: ZweB!͎38@T1<!վ-fa;n:9&Qg~D'yԘ~ ]Cw[ ޒ}"B;J  <TNf/>;xɇv[KT{̇DRGDu4HI2zaJ5u/dcxpagi('31Nx*Q<Oinːꨢb q8#z &UPfm2\>*IvCu\q ;){%B@RImC)R6EAl{ u$‚\rFR#=ugmf~ ۑݵ,<(9/V}'v&u5ﶞ\?'*Gdi\l ?U,\tVKZuz9ٶ ;.WGb7+U] DQrWEf?VZw\&\]ʞSYofhJ*Kʔp Lp֋ Y}RVR@U$\o$ #LSů ݡv~09c#"H -}dK;Tq;)ԳrbިTGnT`AgeFٹ9^qT,CqOz{,pmSۑP|"Fhʘ -]AQj&?Udp(K+x62<Ҋc-PR"="Ykj3Ԏrq^g7 9Av9"|s ܄k_*'oɞnҰ+^~xAZ:buwǣ*LV27&6f5&בvyqo *gAIL^bz0kNv(B8j6^~kYW<nd [^vnZNHZSQlO_y7Oe@?Idpa(;[\V+1Bc9?iNx8ꅛ_g6__|Hepm:hzoK@U>܆y1W'͎ud^8ffCw:bB5$zۼ|h~6rY8IMrRIesD;FNR%gRjg[BZ.ߣQ]ip܏VvثT&Uruy!yQqg(zL QG5GaXI=n-bToe;pav앐a-Bɹ"&9vr5s<1f >|HI"\=+}2*0χ8oIj^5C.nC˳k`y ~dP, wb}HQd;bUτOeT1 s`.l0*]]/z)|o1yC_ޢo'%\Ag\ qRAU&`nBj>~CԐc迸DuLq)>AJr$9>{>3Y{m<J/^7!b8wTϵȵ[@[=E$&Ҽ>ԸDg( Ml9S,etV!;:y;!ס7Br$ҘL^(S&+CK7R)1gKqM["#j9ֈT6WBO($m35Ƹj+ P/rLf'3@㌑X y݃3Jz3kpT (4 r>e NJ`]<{.oYlV6sȗCɑ4O]z&Hd[J'Gw\6BukN\@Eu@K,=F򺉭4EAv~^Om}FYAghP-;R 6(J]/Gmm$EbP? k!5!ۦ^;~GE*x_htΪfTxgҶ Q!]Պ!xƇx[~ISZ ?ԣpXQЈ?daXw%IxU=gCӽt}*)$!| (+ QNIUuL*P3G#螟/(+^SIskKk^Il~S+Rqś4Y% _3aq֒byk[E;g|u_4m3K;]J|Ӳ,6d %FK뇳g߿/_4V?3 endstream endobj 38 0 obj 18703 endobj 40 0 obj <> stream x}Τ9ݾ"׳610pl"C:GQedPś(ܗo{W+~kos_^ʷWJWOoH*q!1+O %{8ES)Adp^\8)%񛉩~ܿ?o?߼+ǯ?6`p;5 X7`ށ/Q0|°/L3!< KKI9 ~=r#ǂп4|G(ʕp󰮍WHsn/۠%~y=R4ru02ꌯỄ)=η V>@ We0A1A~!x"/B@.%B A_Ri>@i@фQȍQ P<@%!*@kԲ Ѹ(/:j Pki&hxH:VXX|霗1BE~1HU#=cnR ?LQ:5/A=/ Wخ\j%GM Xܶ$6)DMs>zT-Wy?9}e(p H7!Bʈ6P [*[CAbtW,eO 7p͹,(v@VBXIJ-8w8-,"$̯(i^qg8-t*TP +JP;PEh١5$nCaA#A ;|.dhAn`@;̗B搤ch+FN }CïtP|GG/ZsE𵄋6ǂN߭7W1F ]Fkˏ~[[={@g|9\(E$~7|S7/n#RG>c88rAmG JC䊼 JZBf.~.˸[ӜOwBzd4C4BA5)߉DaU۶- xjjn¢-az/bB1sH-.egFЇpc{ɥ֢yJT {W]^\S:.A]?~5f2SC '"igϝaBK; 7֤ fM&ACB=kR 1ÌHҦD=l!+~i\27|dRJwGq;EO+nta.pP 5η|9soqlC匉񹣌h/űlB43&1 +VH:Gmp1eOCHPʘp>i%h*yL։}+!"\"LZCv^CR ?KvM@z10wX H7wP>@D5è HJa B;2xć": |߿;=| gaqC ,^\@65Iwi!O]/9)ނr M!#N"Ee*}Cůat+#{iQt!S)րBEClդ.Ufݾk/0Ac)E<7 38N(]:(%qB57R]rD\ds-nƬ6OJV3Etx67LbI1ZMnxgFEц!hlv a SӼS/Z/bZzUq.ʯJy*`^:_59rr(ڦyz~托O hkD:9^\󇄶/!7jFq՜Ԑk$h GMM5!;ySm Gn<cE& +XPʫol2Eq>j6cSYiJJJWLҥt@@Im¥Á:1ou;Ҍ1K뜘n}v!@q*GRZ~1sˆV>􎒸 5wEv+V /ܯbAjNI0[~Vzŋ(Zn)LzCbxZ5U/mɎ285M\}:U_z#ƈTq/qG` ōSU6X)ܟ1eeӴ';ɔ]0Tҿowj5gA銭hGq ݠG_ClYп"yY zzZC>9RqFt6Ȝ')PXPЎ|zgkn1[T)G>p >Fy $ҪF3|/RLwV#g9kn+/9qm yAMQE.ny]%0pNy}\֧lfݣEA#MҸ+ّB*(M^v|S(Vo3H}/[+v8:UŎ#wȫCn4O{\}3鵢i^&΋-fcL$c wf0w(H3-N:DpXӏ@܆9%g p(G( z8L JqĨeFZ PFi %VAЂ/# !{n Po8_zy5wbf\T Plן$nF]W͈E@o:AҫƉF!(&U5t-(]4jx>Ax8.i+obI\*qC+ \bF`#("BX7n=c!Iu(#$mEߵw*7(U/|vIqd~j6juHs@7ƍہpr4]R#ƌ,^`TL#sFd Јlm@<r}oY /QaÏ!Ղm [Ey(ḲFf5֑QxPr=Pd]qzy(KǏ7$v /G HOA(%o1ໜ;ZУTV"X6.|z"/2Hʖft`wѷP!iCD X%>bw-vSeZCl}8j܂Mkk R1 ^E艞5M1! oM6 y] W.h3nG!$xy):64.[P-`-65ޠߊ(]OF}m =_bFT+ʝzn+} =hY O8WX;S Wڂzb n# ,49*y\h7M_&~ ȋ-`Gi/ĊPP+QXm+)'ZP>ɇ7O>_tu<ɬy<^<7 ׊$ut.Fڸ )+npQ\p.#*KVFVX9{/=.T~.~9Z˯GC D,(}Ւ\ =}Ds0,FvML$<"` ^5?#w9ב]M#X4d{=A7!t5p 10#0#eq4k_ٵ7(Ru4L 5 P&@}w6VߝOw] ^맒qFT8 гe ȈꬨuS"EȯeS;'J8.#sOxE1N8k:葭MH1fPDfH|>q9{*hُV2k򪶾qSDZ:p:DɮzTiwCce7/lFF0GCT/qOʷUjLTui)+JWw9V.x!}PD@*Ocf Cu8hp;#iK7 %1e&#X@ omSRe>-(f3|Uft@E)Rd^HF`?On;F_'6vV,in];%E%"@)$c*xVAG^W|yگf#@9l-BCˢz8[EE+Ghk2gpw_ڦCv9*"Z;Wc쾷KYj-4mye;hlܧ}JDVUt"KrF"u@]v/g&~ԚJ[qr\8Ɉ_`'( |A_ 6%޿;R 58T3EaZ?zoL ߮IE8#qb BqjP!q8PG/^`0uha:# iRm/ЌSrфH?}EEmlE"oXCK8 0!dO?(#ŧR)lG CG7mL2f<&!S6:z=R%nԎAt:tY);OgeG^ 5[ҫLC#GmLEse:T WJ@ UÚKS]4ĪtS GLM/(%fz lr@D(~5/zoi2hĜ9GrH\Ԛ .miU#[md W iZf\)ܼ4noУE>#Nu.$ȩWTR뀪8yP3/* |C02Z 0(7nĥC!N*-i u'}lB цz_)rMJ8EqJGme<cDT]aYK*I=/ڕ+ɍRoT& ϣIV!bJR'ٰਿԶ;+q64/* &k8*9)wh,t=e3Zk $"Zm65^Y(yeLk/Qn#29],lܰPȍkg $lBwϧsY@й)X`Z+ m@DLd_|sd JY\E(0Q - v@KNknq銦_qٲ80NO(l)[\@+~ZcWq7ݔG8lq| vwCEkR#zTd*ōLKoŋu 8[ uYA@EaE3'PdGaeg\Гa)Ge:Ew=vӺ@KA>j;Ӝ7{f᷑)PCTw{dlA꺔9k{2ݝG-eḣc*$>g7=[)α& .l3fzɋwOR5V#*Kfz!׋{Fi;D]Pj]/z3'Ѽ t$ޤ`J'C'y\fDww"h,u?2ُ: mLɹ*HOmPBGܗ˓_l.&^X7QK|śƎUPeAAFi'mN p[ߡU!Lo) Aa,S#ό/ҼZ⦢6H7(d5/S!(; Ժy[^}wܖ1ccöR=c sd s˰d/CAvz5"4AdԀ7HVÿL 4f`$k^6gH XڢȅrC ҥڼL=TK\ۀ9r C9LA}~Q%gj9rD.a _&+{ϜF5E󒉚kADA|%GBA(W/ܼ]VG.꒠8kd_.*]W|c${\̯6BD򣞪p)^v * 6@!o,W칪q; s%p'}s) ͜ R)㒈kb>6bHXKl=$.6GziC=\\b˺Yg[>8|]ۄD;whbkۏh7 5B5,ukJiX۟ rWD+iV?e [*ag&x] ;[ܨZ XkywQqK>R,SmT[a>S̺ϕ σRS+STN]I6ysv`>~ᐱǣYn ̜+֕tV {#|UV/(̓ .@t6KF.(M"?tqalFckO'4 "3%*Ɏ>X7ٵ+M})쨡L(r|/o%(YuUF":3: vؤt(/b47/ˮ V +Q&z83hoH:jcݖ7ƹ[amŨ}`|koTͫN(ƽ\+_+{z-9hE Y6qFCDž*jxqI6Zǥc!԰K mwXIh6D)mUF{9Aݜ3jy/u/TUw{CCAd͋J̋v'd9l9e%'?ҺG\jYY'th<\|+:#EV lv͢"XK/eb\ B* TIz3Z}7'Uꯃtgᚶ`wbFvtN'gK\.ӑ&SwձGTw=rd"ƋkKq~H:G;/^9f\h% UG(7#▗9Im+ݍ-U/f yrXg .!B%ZqQcJ )֜M-*K$5_F%?F.k(m+Rzc=UEm+2/'ZC1ntK1`w, =b<]@1۰3|0 cE۠/r @nXQ6(զEaDd}.bݚmW-.)5 qzTgD&%KNT-ԉc^GF*. EmhT} 5utjmFtWP(3* rRL\.z\v" -#W(ԂPyQނ7! ߕ v9\JE";"f/5OVߍv|r$F#G|X/:Z?yF(F_ll7پKo$G{D~?ն)cm07 pTeA)@mR,%KmÿpQi35YO[WfLmivFIqf'xuGl) җxg/T9#rB*Rqp!K ut'YFMd$)y{U+ј̮$Dry^PjQ:EaIBN=%}) <4/PaGz>ͩYbpWCNaQ+p#:r H'P0bo*'+cS_)3)z饢QzDN]OS'9aEBڏB:'J[H 7l!]$- ϾR;}ZH-qBFFRSR5\Hs!U  nB(3tUN2-uK4)SIiy/(VLR5̅T4RE\HRBK*r<$^ཐ]KǶ4;:nmzـ盎M(Aij3P\A 6.?7(Di}s7aMwN声eT 9E}8>{3wn~n??8;x}n3bBsۍqn[n\N7^x}nvCw:x}nv|N>$E4?Ӎ/\tNӍ/.9驠tp:SA?@z|aP5.8 OqCL.G P,>UЩj>SA|?(T}KܩkAAbw$W_+8G<w|mNU@SQ}?GwAw}?>@$4ܑ]V4>:Iܩ wA˃>ɂfS{ȕ-h")\/are.i0yz1ESw79&7'LN)hrɉ&O&drwӎIf3MNaN[_&(~ i?܂[M&h&>t܂@9[Ln[[M?R i6 hf>h6b,٬>fQi6i6Jp,N=TjAV}ZwV*A͂=TJO+R-ܧj>T槕jnrVC&7'LN)tATe܂~05SU6riǤ44=mۙSUAɩL[`r Lnqi-$d&'d6&'6U`r <ܚ6S9T!!ˡ.=9USOI3:sk䇃TwuA:!̡.(-SxAJ9T5CΡgUCUߝ9T5#H-lT$m4Q#pԬHRIj>"IY߬HTYE*ZqZEdd}%d=lk7(̶>P ւRj=P{ *wm qu=ʯΫ!ZR6C|bwȷ| R.nB>E ָ%&۸ۨ]%'Ը3\~|SoAI$ԩoQֵY|_ 4Goןf0IpjA endstream endobj 41 0 obj 13561 endobj 43 0 obj <> stream x}ɮlH3v|gf~ԟ+\Go8[o`M+'rvmkoo 23- Fo(r}CKFh}8s*_v 9N5x=$31ӰN,łRdJՊ^Rl"P }@TBR5"t58Ō+BP 4`ѻS*#B;P 9̀RXvTH)}jAr/8Qp߮S!94RȿErZ$ m7RDZ:P ݃:ɡP :, ɀF~8?g$H2o e(eFmgAHc;'Ҕ' PSP^;/>P2Nf)FD`;VƑc- VQ30hmzj摿Am J(݅1Y(钿6)7?*btTIw9iJDhHXO+Inӎ4 ӺmӢ|K 㲙e6euݡcEuJ. ji8EFq*4J+EAWF=s#*T`=q`~{(-TGE(}3iRtCKX}PΦ/8c\)i 3P$"}_;n>%UMRBw;nz՗z;yu3n:r^0&6#< sJS(k?'"҄¦ߞfCHDsj$nRDڷjn1~imHk)^RC(ilD.fS ʧs⁂ LX;jU˄r HP^.~; 6%gR/O.wڔuUrk316{ fjާཁpQ}χ( :#x?6{po(ndڳ.i lusC8-\Bq^|q "7}צ)Za5PK/5s "sӱ2 3M@83.H)fJq_v[D0F"zb7O#iEHGBBJCRCd$[&ѨMh{qFnsF%?EXQM!xSxF[F%zB:d#_$r]ʂy`zH)gebJ~5-Z9+axb[AޓYj;f-"8sk7p_o7 }>_/˼:nտi8Vi#6POIQ^?P@ HK{?t@ˡ}]JIPN (/>h)X]Z?Wp,\h)O_fF:X5:2# ?t2H)Vq,c8DRTN"N_ r3HTG3JOvQ<_YH/TTVcWt(A>d(ѿ>g031"F c_4f/>q$b%$c)ySN?1Jݛ]^I!OK<]S\#\lI^qVX@+;^b8[ #.z( 2.L3 N.ǵY3fF>O kHՁبIvbiS۪G`G4gj,Kfij@;Htn!:l`2s,JuāPcꎿ L%H<XZwHY%bu~|;p,Ҫ;Ef!qj jXOS(98q&tEVi">3S2ART KLzB (-p1hEIҧ:FilN(FQq+KوPtobtpA1Ŏb@Ԩ*  .z*mR5SR/87!qy]>3_:(f;E< @qlȦCbo/G©l+NѬ] c\P2k`V' YCs3TT#μoI:$; x+#JWm<!/9! 茬޵<)<#1dq$uV0D9t?@ >@*2z=vk3\J~X]fJcV=3>sX8nIH)J:EёS8w RuEAL݁P "\1XܝӑZ1$@WYlCG AJ.P~*$UϳPBԠ~UDZ#ʱǝTrA6M9n[[Ky} *L6!+ ۸Xok+KElaUz @¹|pPU8y 87! hilL  m3nYjLq fY29iPJ.xjS* S3qW[Uڢfn#rϒ= 9,,ZW_+!](K +|&@s> Dw'k@]v #)<3to6S{ĺ@v#bNY51|.JNu͜hhMپKG#w2,rrL3C]?%֥`S/b f)$*HFZ H%ɫ gB3iq Z.>(t\< @CA6 ˕mGq3:$\.V9"ƛM;ir@A2J;w^ȅfnhJ8\EVMķݦ)LiIS*:NJF@U5qQLdEw-uq2YGt$bn ߍk2{IAne=2`7F꟝!^׬w3=6v" ׫{ b7sx-!S"=@Њ45v 3zB yGj*,JJ Zr戻0f7p܂&N[@}δpwP&Z#.\n=.,XH`(.q8SC~whXy!و@3b+CFZ:p,5^?)iq]fW]|֮ "3e;wrGtHJRo%-@i6-.]nУipJ-';-krkɜ==p*R# @1>j2#UJqPkNvOWzҢFK(k?sAL󦍋gRZ2<[j1oG2/nP\&a͛#)}ԀGre5(p?(LG(qoG[ө^v—UUOG^/>uT@KMuԩG8ӑC_~&y~[ey@y1b;#cxy!OR:(^\& m 傫>1'pI1--X(F$(z9~+.0'r]yOҐC{;4jb:r`*ZMމDkL'焜DѹێۈQK@IlqYuybzRh:C_NEj߷1h1,5a Il ˡ6g-o3\5%][m~[X+,47=P7)Cq"%h͜h,eGwǑ;xp4f).gAL#Xyʛ;u]l(?W֝v@Pp]FOə3jcO _m_;[l@tM8lY.H 0;_sZzbC3<`M->':cqmpOU?ԏ&ilGG}) O]<~ٸYY5RaG@ 5ZǼ)_0J^YJ$9R>a$}}Vww@H.QtYeKnk R /tiK$Rbm$CD!6YS B~* 5=qBRۼGqY /9CT1U}7ńMIH;-RE}yG?2j6創pJ+prz^9[H~{^. eo@yj.tsywa%zq!,QU*m9HwhZmEIVё/IcDvvzZ.Nz]CAᤶN<ߛK:GVof1ƪDrut(ե3䌗G1 qn1T8Xȏqš}HPOl7zOB gEy~^#gq"VtQU$[@akEK=kyv'B # ɡ\ 3g$4I*qG+Z/SaGt`GEj_`;UTE2^;j TnNVuG/ڙW|@[y]KL@"\,Y^مyER@Z7d/\7V7d/tn3HwxM6ZC.FFBSE,oXVX…Vd>3JAz@[fFfZՇ8+HDڣ/%Bpp,'fCdѫKUb SI=-׶(c[[%5hz@'Rdkv̄ah1(%)ïA/w;7]%R#xicj+C˧2e^-ݒ-dL8k8UɷE WBG(O oyu!ϔ7~)#ugⵀw6CIA!96VC켬rPFW2JWnc)ehhJU!<% !8ah[ĎO׵IR(ri- *?O?x3]&rǢ+YKSI)q'^4v,z%Tz>P1r.oɡݠwáqkNHF#>VZ>uFt Ys/-Eb^` VTt| y9VԞ@qmP.L`i֝5^Χ++(*TEuWH.Viªjw]j*4ЊGށR'e ȣ9S^Q!oR3c\_+B1F1Ƴb!IXh`:͗,'ekU Gg8 1lxrCDlC;C1|'63bj؆ZY}Yh|v.SPa?᯸ H_{.w.y.{.#Orڀ;ֿz ?zz6TQ4wJsFc[M0&D;TӀR*9 vIߦucJtHտv%N~$"e˶?"8Q9w#Ic/(3/kӅ{]Oh)J&wEY~|+9_ 1 r59t Qb7v[w=tU.R3ݠȷjL-3$VC}t?PqJFeOdʚd/\X<fZYh7(F=Q)&r\BNn6#2v\NU(i-9klؑb;%Hv>+Ђ(5fPc9p`I)K'*%1-F,Ԝ+~9+jUJ6ۡKβ,c{sw{R,y&fßXKP5{E vB\}avcr>5 z;EZ0`%/lP/[- }Jyh xt;AZPWb(`(G(1^^S@ҋKя?sYzT!v+#t/G%׀V.Go&GQ%KlJ,7ԡ:\d#zY;52=q՚0y-Rr"xj8^r8HcyįfR3ʑőgJ*J3'* wg(JsaB B休a8/]Ic킱7U~̟z^ 8~KoDUEK~OץX<_IMIEo[luNI:yH?r 9L\崃 fϞO;oc.#Qק33zt6Byn3cf8LkM  -ܨ@rGjg,83GFJRdž G*Q i';"#[tVuӏ+"$eA/_ﳨSVPHum,5 ~Mұ1R&G 'rF_Q1*rO' 7Nw&&_G33>C0%:@mb=;OB x^q|D.Ǽ;K7#byX ?õg!C$Q|3OpwBN_bKJ Sj MR2_/ +WC Sз6ź$ݠ+03u@P(TpRU%fl(g i愼"!yk(-_|,zHަOqwv ВQl 3Vmxr-.H(UQwPrc1Iޮ cKd1 U?f^frl+wRZrURjble uv| Q=T(55욺~w`X]p 'k#C-H|9 ^"L3CI7{y_nWpUi<8@.$1?/A8s*REͻ\Լ՝VgQ3ׁT͂3#Zc\qpEu'$n:ET8'sLQ`)/;J洊2 #9+@5W K54jfSv3]t;ys!7(P.VG&̌U$h#r`CTzsHt5WgJhC([n62wS#P-v &d7wq~u(yRD)y-LJUQRy;~-#ç̐#ڒG$V<#z+!EQ&i憔9M2VYpld/UCIYW.7't?uXwen$ݲ~m jYsC<*λ&54&Yo)oPpQANm(0!IznPt3 r&#ʬxt@FvRz\p87 3ptߍ纂26LeBH-K3/}U׬^-\_oj^St7^(uylF)J7Rz֔^fSY9//Zt6<_O)O~)g&Rz8LRbyjJ9-|$&-Gp=yiv2in!-0hZw j]o;pI ']!º\.R3@)*iJAo~YĨڍ'}>LP.+8@)^$*̨7lx C-fURRTP凛3b2p$'p@=+ne^r}>Y%~qmvQ9_δ_Ғ]LqrzD7UWn@l17j0 !,jRk7 ͛]P.hlz7%k*! 2?n SM {wRsNilYʲ{;BmR-(J] 7Ț7rqxŌX6TWl[0`&7tz$vwM)Qg%0 FoLϊnɳM57AV3xlvh.0#we7 ݀\Uw vuw .5|ܼ2uqo}}O&vs,v62ꨡ#rE <}ru9Q(Pn7;diʍ =o@'}C B 9r7-=2nB9RPjP G}3JYN^-k3otwIt#_ tސVɮjEhn;.#hn6'%,Mj/nPz?u Ԣw:z\W_0ܠ>c[NbH(V-]y7pU8j)#oV!W-!jPqUB@.1{y;s;q wf( 뒫򏪴:X>]jVi58مzEJit1J+8멭nR-UJRY*u5t8ĸ}6eJKHqdzjǫm|pwK0FHWnXB#ᴠ+{R\`޳lA)/{]m ^3=ºb^ϛ6/A-!"HGr_Zj%ԢXE{ r}^p|!IZ1[tB|O֤k^^re)G)N]<^@ 9zi sv]VJW0ek7,\ UhŎ. D!Or9 5QڊeXJf~i=KYlKdfnAQc؂u[ի$u'u];V]c4bVvj׮f^9f1I>vdzD<xȽHm7ʗhuה8BեIJڎ% 1nuXP8E6]Kz Fxʹvު}VXXT^5VU3p9AͰ;Ǡ!B`xUwc[#j>h\S @[7~b $٩nݩ=@ r4bd/=@#^cb͕@)HXT03պ1{}idbKJ@)iEVE7lVk푍[~V (᥎™mh_NvYK "5j \z0= Q6)a)RiFAD͡IgJWS%}arlsn7/RcDtDoQX %VQ$GJ>2䎶x/Th`fvTǎ 51/:]y&3J]/7#_ y˩eq6&PKV3yJvMtH+jSPnPrZd&5ߒP{+]JJ~,S{F/Y>cVK +A{%)W:2˕D ?6O\pog_;]Y z)5MN; fU@sL(RNɎO';u=w~K8t x:(Jz` -FEr/zֽTm@zp;ݡ *[tw{U{MpKdכ*҉b~}&>6vYej;vAtoڇuZ3&]'8K|GyW? ZMdŸ.ΔHoZ)'MGqvV1n^.uU*y9sMEޤCw?4 yEA#hFů/ Us\{fs],[S = j3i軔Gk.O7_A6cw/tz#IQccx%O?Q~wPf]?5ICMv'oY}Iz&=WJ;C̿϶0z#eI7½w\Bw-pwL)hىu ;3>XJae~d:_8U)_{~H]I1Iyz!N9!J J_هj?SN1qzIo15f(s>J#y h_)l4%2o8r Mr/'{}9#%hl#7 =\#z5Ε-eI4=J2|E/kDMWcU=rxdQ9h\.rnE;P;}Π1_k(^a(sT(\V o/)r VǩZ0x~Q_rب&8pԜ=D +"B쨬Cf;3ًD!a+b6o 5ߖ?rlb(gZ `kx E,%j@쁒#=A$[oA?<ڴA% z+O\=^mߡӃ^gliz$Rg]6Ib¸HzIv=ɤ&~j E-4 wKO.TPm?0{dzӵΰEK |ӎ(ܐVGFcU0 N;E_v.j±lRoP8eC(o" v5ogƐ+YGt+pU"@#?Χ GL~;I<\JNɥ$da\tUy/Z T"kQ3g-1|)hVERgPtxT4*~BIF8S˩'*bE}3Lw>+\-h1;T5IP.th)T&&< fo'7 h??BH endstream endobj 44 0 obj 17373 endobj 46 0 obj <> stream x}ɮln<=8:*BTdHki/H쯿D/^Eb#QEOƷ&2XL0۴%A5/BsACh\VАF?+u섦N -@(bhJQ5q'}p(U**bhJU8x 2P 8N)TƐP 1d}T4*7'T|RIִO*}RQtNкHr 6UNB Q$UNAIhJrV?*[>-h|P9T9!o[Pr \Qp%c_6ZJfoR}j@)0yU_Q? >iϚ|GAQi~$.=GB HhJ=GBP Em~i_o8r5ox0?kӎ/6?BgQ M4?h$TQp #6? cBQGq5J͏T (ߍL̡L!VCXGJ9}hǘ=R Ƹ$>Eu@)X+)ĪEԔ#?.g+vl;Y8o@4sk$P"i +lm7(%{g"^Fh+~78!oJDc;2 PB|=, }ay`/ieq*"Fs;SiF㖐ƸHc܍LP4>+r/z@lRFvl@)7T`$KB@%Hnu5m9K8*u'|œCoIMt0sEr.zqʂqռ0'mb8BhE:zJhe,SiEjlUSfIbYђ ȿІP{)"$/8z^G ]|fV68 һ|VtxH6neJ hgj?\QC̑TfίrC8Cu-}8|됰9)CC+n@ Ḧt\F}%}@[7(b ᒡj5ozW|Y滬(!FCPu/ˡHcϖ8wwkرyh w%|Z¡.Ns WD3GTy R|vűE:iU DBfiUЈ VH^QГq z2]}Xhmfd Ozd7K#ZBbGD؂HoI*~ˎ2BLZcEy&Z5.*g Ϩ}5v v8_93z2]h$׋HPܛ)DzJ{A;R$z} 6G(@ZhT=J]ﮩfd/^Lv|³`a9"9NamQT^r ؁ٳ1(݁a17D[Pxy7 }v|x }+[;"i8]"5렱 ɏXEd\`EN}2^P s[PxEc\Ʒ䋨Ҁ?XN#WGc/)1LW/NwNw!a9sH9N0ڭE]2B/PgyR歬˼y)5YOz=jYG{\Й;[Õn&'+`f gpsD(b5qhYgr_XZBzV.ÃM/RH|~sO;j <؛4Rb:ҙdAA{S)&p@m-3/pѢޤLZnt,dSl c.:6\SdYb8fiE3;m3H>j yF5u6;ei1#."t}Rtɜ@x؈:H 4F!F:=Џ]*RR+~AK٠ 8 WȠj>rEy; :Zqnqp(pEY B@e̠м0o*̑A,Q]mֆ$KF0^=S+҂ŚTydR3w4so(&BɽMߚGÁz<2- œe 2fSBRʢC(:a,;8(FgGNŅΕv ĹyaeFhcHǎ1LD]*y1Q?v^gXd17wHU@ n?N jFSM9D/"P>0%3S$|hy^U*. @9uU͜3ΌYn05+*vw8D YGwT*UqE:݅VJc+P0-fUwj(2SfHyQ_E\4%h ͳ9ϦBBE.4ܔDqLH Eۘ(h}XQ9%%I1R;a,_#(4(42P)zDk6δ/FqFyWh9+%x䦴4$b,h /v1%-)Ջ5)5Ah!>3~#hQ덷!-(3!)qxc{p/;إ#ꃯm?׋&R4gjbV. }t֚8s>P._:*wI,軠%(7)W&3ko g9 3pqF*bŁyk5TХ5~E3[iU=܆ּtirLCoK:Ђ\9/H98%I тN#CɹLd 0rO1?s dKEGtIr]i!,ס42 (!50 ԗ!STE}\JtƋ;,)^Z-3wKCYxNm rTJQ28j68SǙ*u%+h@c%m$٠k@3LhٝFLXe̓TbAs%ؓT#j=:_,oJ.zD!z }Ⱦ?H[<3?pC۬[H^il0VV/;3fVyfթwXktdQ%Bٚ39e!5(?qS\QYߘEL£_Q.Υ8Xm晓X™GvrSְ{'lw5ˮ'-Eź4N1&ˬp.HWM`=qBGNs*prсTq?;vӐŊԊh,d.XeOcо?HmX?8?1hX 3vNc0], f?p4v{[G{;jp >}rATL!qkt{N r m# A?q0Y>?]:c)d^`f/(ޞs6I4,MM8DW-qۼ\м-\d|l,'k9;ԓWbNQskYuD:/(r8sY{Eo}}0bxobn"i~gBo"SHu8*u):X3Mޙ ϡ<޳Ir#1Py 7[B2ZbyJ79xBG%d׾r5v+k=%#:]ܮq5Qb ܩlֽ NHzǩ )AcZbrAi!iv=TjcTY#=@nfB#[UnK>阋yۥٕo0sdGw(X5toUY@l ˆDHZ. 9踝ȶAL=,*V|6zl q:.뱶 JBAm R@'jxF_.4~QAֵHфgIHҏMߍ$FK|"jKX$E8/];`O[J?vg9>Y.Ýw g>L4O4!iX+xR xf[PT?wݐBV7 t ZŔHoBA)?HnX/8{e[H.}T<zvQj TZP(b䁎ܖIϖt3 ALVP/<q 7wHp($e/23zTĭzܑvoqŔrPND4gI;NBFR]Va|D1Jzf+Shè rQKxHNwJQS!x>IQn9 6LSuRwdzCMz8'꤂PAHR$QC:WJ9i-J"ԋH+R'rҼLJ?iP͸_CB Z  r:wp*6Qe:l#|XG kUu)Py<*|ҫy 5]kShA \kF+@)5f0h8s# XkWV%NY|(ρs ]b\ ɩYJ ̷CGXBhH +7snV$qWz%¹~*E9 (S^/7wJQz#Ϋ݋և@~7Q&];,r~%GњS*Lr77w[}=p$S )mɆjNtZ Ҍ :'{Ba5zyCE -o5ͣ8ɽuXy)q0ܾZhO܊{*;"iL w n$/v9u-9ωY:~g!5%<ʔ!$ :ho@wpZ6CIaXa9#{Vju-ČDRZX~U DhS/xv'/FPX~0-j=Sgt^U婯KO<_6yuy~Y%fc;>avn}Hv|b5(qGf!kX:1V"|I~׮QI-{Q4oyaMxū#JL kT |RP(=|ȬTAWs ^"}EB2iEJQXD(u+(xz~ʢ߰3V*U3߇x =#af-@L~mFR͞\Qrp9T<=_Ņ/|HӃQeFbfmñ|R|wX#m^,YrhɹBU_,*S>ʔ<΢2Eے7hr9_,YUɗ=($%+2Y .fy7,d"[[U QJR;i1Rt@JXwy%nE:+i&G~Tv"urw; neZQ}~S^S[yHy${ymH@xĬ O$!Bv+ x\4JWOc- ڍEEq4Ftvgyo!g.xı+V$6 njDI%* kE\ؠyn\HrE# ~R7.NN@ae-zw'£Q`7"?ޭkpPg:Kp0OV l}_ Wůrt RwU*JExTf?8JII|=Ib`-vC{4M(y1E@ #s'P6GGyZ,aBU#-3b/~XqCCxl:E ᦄ39a,=gڌGbKO(.Q*",C^"2 KJ s O)6X;裎M8PX+AـrRw6ڧmQ@k: 0A@6'ٰn`66lo8gw R k_WȮwk|"79:[ro9p 'YhFH9х G%:bP"Eq9) "SɒNFG CdtEJnd[>Vi)WikNe]htxu#τWuwW7 2n?m(jZk$m i>)%d=.eo=E Nkf@s8aP:6TU'8:tƜpoWV:(.f9xTZN ]љjqS[196EKoG(lq(uEtY[`{)6|$kj*,* Ӣt5-tSH&3o DowڝR+ms3{sV HHaB\H\Ff"j:BV$ ύ*('$42'&W\2!8U FKo9rN,)aJrflh;|zRQh,gT L+ꨙ$o_P<<;w#KǑ3eU#TkX{@MuAx y*Ge#;oȒ},=!)9]Ja;˭̗["5y]{CZ\<ÚԱ6KRRDGEcHk^MDD|ѽx?dq*hzz4#s V{/ekQh"zZimyTz8\{f w,k?=q3 q;@lHA񽛝 ּT^l+VrִE-C Uc]qެGөיRޛ%X!(D_t-]9!%i֪LRx,zƭ./\J]]DZmj71r]K_\D(U439s =Ѩh NVvR  'AQk6/f6R YntQjP|sR}T ^%M@dż#EtHMMz7{)0 Dfsn*@No: _fqraX1!̣Z/S}>.63 ۸izlb!w),A`-7ü"fqx6PJ#*;ߔƩhJ$UnF86;29MRya^=Qԫ6ٔ SfYUcC̲Ej͉6Js#H #DPbDi kx&Kb5jH_|7U"/JkuG/l46TȈ}5zAJavI"Vg/M((4Fs_%jO5 {1 =ݱvVy8kZLcȀ9KJϲM|A"~s=@x)t,Kd :ԊKyghI $)DS U)7Pe+J 1nj\ ֒UaeIb=GM #3_5jՆWg**(?qUp=\d/`AH@ PUrAU(:dz ԓ]WG_%gE8 k_4oAf.wм?J^;3p*}/g!ECPir03kt?xӂ_(ێ7+4G#Б2P'3;MdJ䑻PWkѰv)B#ڵzX_yD"1`Sq\wrVGEځT"`QDu|GpzK&.D# uTVXQ}z5Hr@'2L8*(aIWR5H[~־5=9tnlq UlH)2-)E P< &JqBE"Ph9Zk4}֬@IM[i$;a$p 4#V uXЇpm$kPi$wiHv)iXPTi$ԼHPFbN)(Em5H| 4 J;@JHH H)2! (EO#V;ĂRRʋ@)2շPi$oɄ4\E'B+9&%q@) rhx;/PPk,j z7(o(4Vo|IցR St.v*sx$Վ) Xm,QZUMR=q`(-HSFiAR)xZBJѣ)XY~EmfzP_dj8C8FJ#Pw#?!P@s9\"]\o#?.;];4#?G.ǂ>KԼXЧst9اsɂ>K@%zMc}\"v9uXz9!:o3>]6e 4P8C4]Er(JMCgB.Ʌ40;a`p4>iL#&~}:(40OgL0fA4ji`(ZL>iw4k쓁@4 ziOg5LN>ii`wQfA4 t3#dm`tۧ3͂>i\ ̂>i,4 tYЧ3iogggyYЧ3;4kOg3 Lxai{iּT_NQG:.5gyYc<44Cv> zi4BgEy> zi:34a κ48[_8X VmlҊ@|;QP7Gf|h =Zx{kNio٤;SM D@C oH z$e͌N]j7:Y7ܐ%Dy4kRF1;g'NAА3Ft ._ aH~g+ x9:!ߥLZ뵼fş`׶RFiwUY\nk4JRF)!:3־\}$L~Ԫƣ@)\7JCTuB1hW A)Dk.i226lKz-KYYHR/wˎ$0ΝDŽ[aęfnR(MH+ GrC~VЀ.(:VUrJ䲐}ʤG$wz)8 wAj.Yֆ4{H}#otLo !Ǚ7ɟ F-vt(pZ`&źZio8W?> stream x}ͮݼ{p_m_;@f $HOE[Q-(j}I=_~u?)ߜ۟VbqN@RZI5.$.ֹ\5ՅוT='ꢜK˯T mCC*E\3*⸹5y?J1UR}$"Zjȸ^zmIk]Q[Rex.3]Vο 458\9*ӌI5WW?J͸ #a7Ha$e oF ] B)^?p\CjF`Ҷ&u1#EVUNZ*z68nՏfOcg1!/H3o$I\rU HEi,X0)W|_M9q/EHɡy|hN V7r}Tfy r߿fq!qSBL"ar!n&ϐW~cT@ wɷ#"sV_X+KI8nP=Ԃ J:@7Ӥ"s0}Ŷ az /0Ч\Qϩ\}GMƵFrH_+}4;ਤ7&TB HXӡEaܝA֓Eɂ"!\&cj 5.7H͸ 6dUn{;(J rURq-~_Z@thtu ~'~߆gAmĖ/ql`kh)}sb E\ԘXmj`XeFkݕ{grzY(QU'B?cFken[q|84[\IW[ֵ AoI$TK)=gmTĊ|~ty`5Z+Gl߸R%/P ͷ< +lglҨL zNߌZHH%wZ].DHq.EjAOw5Me O渭#^>D8d] } {s>u>=Fj;ص#6{Y*5:Tf@(g9!!>kѳ{!H~k\7Jjm ̗n%|Nʢ{rt(GFr?R>I)q'x$R+c=65.f$/{3ܹdL*Q$$;0_IKu=beK!l. N9!FI[ H<8g;*D"@pArZ%ꩍsJ3yPps*P R=>Ϥ"TtS'326(W +"5UWd6w%aci8kZ9?!2}pkx . u#DqM&FI߇&֋x0J=D́$<|`[6m (?#]̥PJ̨lR#h8]4_Z.'G`'\dC%@^2*}iO3k(;+9 d(Cj4xje @e{ WtY'zZD]EKN.lW2b$r¶Ɏ;=99ʿZZoHncr4r6sko|k=TX69?D}1C<'*NgcwwR pǗ9F) 7_V)v6E $TbB$Em[I˽"{Oī_ФU}}nm ă [}?T0ԿC SIU\ wA}ըC}gpP_%b$5wRzPIMR~l!Ro,gGއzWroYT_;8TU_SOj>Xv_aWgVv_U,BjK/PIMU_®Z N0S>N-SɨSh$GIQWEImV(qI_zƏ6o_d2.~X 7IO %EwL"9#.$Ev';(vT˒x} ==Qm͍y/T9K6sqIэMW^~A:~'RA$Rz !'!CJA:0B;`H98HgXA$5R8Hո T By@Rvy_D R8H i߱mĶımѶ ͤڶPsROsROsRw9i'9'9'$5ͤ𧢎m#K/{LKm#Vm&/mcۨQǶz6?^Ћ7T\ )К7ZƟ*?OΞC9"SƟTU-z%Nt )Bo9{>O?NSIixO=Ɵb>o)t?|SqkZhewÌmCN"ο'LDrSKiqm6%yR:CR =鶖_1|{c=ewpiER yݣJGHŠ.JQA 3"j2ane ?n%F OVZ54I-)Ļko@̈́NGfzҕ3vQ=-m9e-Ǹ2 #Der0،9 ͡ZJ r!*֍⾧E/VWFѫ*n7zsa3m4oM90:meV/WE8bYB(\Ƕ-LmiamKDTdd?ycM[T8Ȃ yE*BasY^FgHZ9UW#$lxtKKJR{^[xBpQ8Wj-CMȩpp̉n+Fy+&-O. (v஦k@v=υQny|*t`3 InM7z֍u>Tf δP΅ ׀6RV g7IAz֒^ʢ_Oc2KYDUJ}qQR;ղhF9b!bóCԌrĸpS|o<HԌڊj> rLH׎@$ ui`զe<bTKaW擈 -qA,m^u}c)]@v cRks闺0S¨ŋA-wqmIy" C8@KI4P\^*)\\QEq;ʙ-T+ ZI9#Qhg5"YIy:>hn!Qk99j3{+HCŨ#:Iɗ9k\ovSk .!5Kt $mcu(c\T(n7i4p()Z +ko!^r:H?3wEn=j#AYI)UK[^n7"rq7.{,p #G:~*7d<.mtwf9mԌ.b>-K\Du]/v V3hi*$ ']g[%Obp?QKwPIIlbAD|c˜;k&(ۚ<%-KK /y8G*r,6d&GjgΣ}n ;h؅+∆]=N)V1 %#P$zcAZ•1o߾\kؕ^%[rX;ౚkzvx$G d64`[df* ԩgLzкSBG3V]%WLOP1O:rK8:[Ѫ"'v"Į#n]"2)?N)ĺ'tnlK˜Y;VqRwOuRL.)|g-T NS8P[Ede8KMZzGBn%#Pؤvg`jtol5~O1jN}C|3<=-2?/"72V"l٧6U퀌P7d"{ D]L.@Z7d.(XJoxFN@Wau / v*9ip} p ZN@!!ʑ+-/Zxq.נg'9#hUTB{zi˕=cJ˸ F{:kB Ga[b3-1P[-[Ε\7+XtXċE5Wi}q!vQjwd\w""6Kͥ!RD|D7S7VyACj^!).hj:n)Vn#L-R>EJ`;#6\+Tn R܇U.,"{{e X`E-aNC*Je *m3ErK6\,Bz0nP0PyrGLnyGWZqBLrE}wË F;-,HNja[LF{? Ԗh"(ͶF}̟,#[=~ CBKK9'QƂR@I䳺jB&+\嬥[樠+Ypr,QC /7.^8lj܎ 8ƛX znyP nQ&1~DXi|e;(Ϻp9 m> YK,ѝi|F}=֩ ~:'p*m{xk&DZ"TNyFlWz^^Q'Gi`#lO"#tˏع2GkfRïC޿۬˳۩,D\~OVa^xxm.ğd\҅]+=ӊZuű ВҖL+/6g!tqpDQnF1g䪐mמ)M˜m+scŠo~(i:E띓k뭲RG*RĈy'6ly]NX@QT4[8w:8ۊjP.Rrѭ4r1TRRKfJJ~I +f\Ah*i!9PpuH'^uWv r egeYxL̈TQ3(tJ]qwq\>U/teֈ2R1 =WjH#X1Nb. f1CAϮ!rE/rVuNJr*G xQsO!l(]vYYKQUz(5$T9XRpHtv9FxKEP)DKT@rbc-t9Jy9Z3a.[ o|'Z-~n4!Rf_%auHh/o b,-{>Wx=iDPU &b!cpܿI0{Ə2\eVc:=ۚ^g`3OÁ zVQ>Bőw(3GM ];#WoM<"`=9z<9n85ޤ`H f:H]U0E/?mkBi6YԈ*<_z->mkAܯ׊o:*F GamǩaYp?R~n9zeF=˺cІ\[B e]Bh7Y|[ا8q|l E 9D$7=jM[JW;? a5%d@ Em>3X,NKЪp@ (*̓i+:)e5Q3EqC0Ua11uVhe!b|X#ls^xl=Nm<{m^fů=#tfʅT*?/p4律&*sbϬ(`GjLwIB |KqSagI3aFrrY8A!֙Q(FZ1׷tQe/7Rh0 *QON1IaGm/z/iʆ6=>(d|*eMDR+޸RsCEGEJ#\X`;F!_<6eMƑ3\ n<[l Z9 BU. uydJqL^JSD,(Uq$yķ)^&^Ox=/^Ox=3YȢf$%^Q_O[q$SsP0V1 '֋ h'sD6c^5^=tE,4z4Sg3L# [~iTKr.`ݤVn6=n8[ݏ/] '2+o djF4Z~*t7aZ_ 2*:"K~q)[e2)q*In?r|Q+mó:kZ7et&(#9Q}leU'6wUjv,F -ڝro&,kvm(!E98|UI$HV\%e*+S]aa]9PT|3p+Κ70SZ|Z*(+rYvBE7YPh]]ª7?e r|;]H.b[ҪEEP]$Kr8C bd\s~@d(ڼҳSlbKS@cg ,TLXff [!ʽ$Smh/^5KGUI8I\NjS>RU8{hʁ3 Aƶ[;:)'co/+IBVBhSr96=?l5`*v5V.=]lcz6&(Bs$\A^5P[DAf!ԽZ"N`䍍mk9&8M&5m+M"]=R)QBx1ݡP3ݶ%MdH1M"& b`PA t*$X(Zeյb\ 6oAzK6J_APo*3}5<+ޚP:ʖfceeu6w*/TzWE8pUk=63Ԯ_M~Ϯaz* 4ѣ)67:ܤe}Q)ᦣ=IQKM _qsyjڲgԳ _Z5j2.=..twBmV{陾bh?Slҳ5/lnTHxLQf ^vH/K_1TN5ȊnEA!"z^'_"DF%EbBMt.lZ)JzjA;zj { 9ߚm~{-ZQlR+۬Ń (<w/Q,b!(bRO_J/u uM 5Q6EñVqmIuRUR %ɛJIrF*rqk@Nq0s׻ǙdstaS)G0#;IɑJp/ڳ=faԭ[0TzG,}LתZH)քT*JL_pQIA=ښ( !AGeJHevA\|, HYOrF֘7׭p+CJ3€`NseD@P`|"Z))k߽zDZV{/vճg/gJ_qfTV*ҹH3k)LZ0tSE)MC_K7k/A~]\I$a~ITխUǑ_5}~RhE\Q#{ƨHףrfO+!K^ Lx?izwxCP:9D**K(kkeO pvQ.VpGp,AI譸om?|`.;˲י y º!7tFe%Elj9,W +j72/V^:']Ty{~Xԣ`gee)' VIȬ = Ets8ۑSqg7>P/}>z] zvp4I!VV"ώ}3/4BRBćHǯ[^B/Z$tE QC14aJU̝򫂖uY U_(?96Z'x sxUMOgMz*1ЖvGN8(Ke{{Tnm=D ץ]|xYӥ%HֵIH2duP7f<ޠRY顥-0WxZr[vYR7BոLX(G+ȭƕGTǵ' ;5V+vB$GSqL*=ט/It9<3}qcA9 GInR︿)^M\p\.`\FElN-_x`hKֈ|AzЋ-Rx73Ys} GV+^^~c[xY~Gk2/OPb }kй 9&g0.gBǑNVvT>)8^t|Ƌ&ZJWee*Gx.r}P~˃Hn ,mErQ׊T҃`QqJzr+Y%Nl? `'Yf!bRX]:[6l Ϊ"WCG ǃf!7Bf%Bc眜!HP툚TJt@[5*b*G)rYoU.{ܡA=Ja홞 wfin4' MlNI,cP1p(}x!\햐\hJvQ݈r E@*&Cg "qT2?:btV6Lr5B>TtuFi%8 n ?kDWe t!kP& D<R.w]G[ kR3- «nHJ*]%F.6Yh. .K[F#-~\]@ʴGZa\/..BãmWB@_I-5vFNRSU`]RrљPh|YPP='ߨfW*BUš='t#:dF1 ^Qpќ^~ɝ0ޯUk4p<.++.%Y-L*U}JEŻol,9N9Lg{DkF85S)/BGns*> s>nfI\s2~Hh@yM!!'CDf[!dґw6ti10v -W -vTލKog G=l@Y9@D+^q2ϣu\'.4?N>jN Jޗyߴ-vT^hMTk@/E-=} Wwjؠsj60+FIq+ '_=D >YFY#/ #͞es ǥǙ;todۍ|ٴXVE8)!)}:0"T` p"V>N ǙE_Kt ygN]|)QR=MitL /*-DѭǕEX%Xi \5 5 SSvtQb44rx.}J^k~nI"D!1=)t Yg;1"#A=Ls{E^ tz*D\aK]IM |p%suugc[j԰yL*5*%TD'G$U{Wkp}:-SڅD=؍;sEI0@DgI{a*9ƒ.R8e\fQ/ԓQt+n#t`5UtmmvB-iAO \X>\i\!?.7?a9o'UJs)zNK@`% 8S? [ĵw\CD#?lk3ij%fT?M!RÃbX-%>H:? xĈs%\om=ɉ^@zpb;@zVC-(#yj.;& K9Ƶe-2iivѪsZGjVpԌ%$j FfڷOt e~\֠Uʘ[4ZorFVej7\!ʛN@dܟ;R#{ur=X⸿$Ig`v}@N"AJFGU!+$&{f[36?( _A V9Ȋpɪ͠v9YC!t2^Q6:?NU/ϗq{z^&O0-d+==eeSdA݆ WEs`3#~#^HNwVPpzXIvp潻W9cryHYN:+{t,D@eڣ{VQn(=j!Rf>Wt+N,w ~Qtγ.[ a>s]vA~DIW#Co%){0gi/l~ bly(R'aKTAeK,K8FJYuz1gW >u L*U q_ĵe6e>)cO/T=E!ţmJa hG)\ΨyЙAXRq_Z3CJO:$T.EK9 g)8 XP9> stream x}ˮm]_v''[7@zI.(HuE &_("Ï~*{??`_[?j?1_迍10ן7``#Nl_mH;8w` G0plau ȊHj%WvDñ9̄qF^В`B;5[ nЮm~//t7}t+J94B#B/R CަʍrI>ͯvЈPĘf%;e3}pňq#w7w_t.6[`"|/tNq R rr9uKK p& 3BBF،<;Ptmpba,e _ c4 ccGjP2s"Ӳ̃d*B)/M%!:AziMK-Fh/ȕN;ZE mBC(j kpEzeecKYV8-'Ĺ##@FV2@黥N!5KZH->k[_j=\֦}YAŨ8Ws MN/<_k:SDN85.]k_Gm=sՉ3C!GJ8w/[t=]vܵ]_Օװ \Bw)_ރJ(5mzаlljOաݗO,.F; /6O~9OL3;ܴCΙmgq*5ŭRv59kƥzRavyF<*cTLrl>t'*{cqoUEs,W)]+I [Va˪\@1 g-5/n_h:W@ªPH{jaHM+'$WE|7ӾV,M mjc:ߵr:HW=-J\*`AÐ[ ;~h&7W:u_|pͣtZO:}iUx.DkO~=_:9nNae[ ݸ?#ё !=PtGW(:+@2br7G3/+rR|ГU|WW8t8eꪫ-Wn:JˎWxPvsCˍ\N@ ǚ!/Sᵎ'|"ԾPmx8ǟ6n#G܊vPҞ0e&a'C'.gƋ.6wmBhC^M|冕p[7zJFI^Y$zHeY f*}_p7T<sMHM!&q9;J/Q42ٯ 1(؅9 'sDݠ[ltgXZ([F>hu.e;|Y)J5]\ t̵s]!Yؑ.01.kxP7?6~Orۦ!-ywPHVvp}B{U7"SsG OA. g BcE(S Ypc^̷HRHΛ Hb%W隱pQs'Zq*g>$WX4vЫ jkJU̱w % 3M/yڮr$E5+4R2Je yUNuNDOC)+&KD^q+6] tZw1yl~rĖg#d10Q:eyrE7 zTPozZn +#.]7 E+GN|ov;p7'tq@Iql6R[NA=כMmɠ6/V}J]ﺹ'_I`z<԰_j=:j@:<tVKl!֊iFgqR\6'9z|#ѭt P3 7Mp,JYz(:o(3otb>:7(5b[5Veq۰JyS(Gƈz&(-S3P#-Vƥ>Μ|GjKC(-1L*Vnz663EuQD\F_Z-jQve)K`1h;#Qe,GиIJ!#vIQ[ \;JgnuX!ű^`d|tm9eϜiIQRcLvd.tIlC"}䂶4ũUkIVqf1 g"c&Ed&pD6cL[)?&|U?ӌ=5>5WZNHkMB- H '#Jjw 18, `^.$#3Pف/rQl=pYe> 29qn3)֯|԰Ǯ?csJ3^_57*gJ8#[atBi֟HNǢN2 9,E7%J~NAR üPJ3.\"ȍcLwk{.˩.#wje~ahPQb̈zP:<5o}#ޤn žXG.t\4<;S/B> +~whfCW׹bKE pٽop61:MDz/h]<&ę]ґ"L^i\grNF@14HWYM>*N7l3fȤ3ӵAF(hЦDPnw;@&zdP*NvGj^GP-o'[hSZj~R# 87WN؃TOBX\ag@^`$44Gb -F'LhIpغ>aV@ RP<*s^E6ӅM$ 'lZh, vX+,@䡁S^rcB[GY(2WQ̦ey/qcpzr7S^ >Vuv"ӕ`M*!ZL7\񻛭t\e&J(KLʡ]voG[hUy_m'䏝߽;t Z6 6v˲1l= Ew ۣdU7Aϛg9#G:"NG\$ 8yIm r,ƒ_I@\z(⷗WzI823qC-@bVi:䲜\P[E S+{UzRz\MlAɊ⊩kx*~s;"<"RTC)PzʧuAkߢ)ýLes En9s^BOxeڌn%C%l(HiLxYajg*mˡ\k~FwL4\A'r.R27뇫x=$"9[#,Lwr}$`I옙4>3{ Zz3DK/W'r.:qq]tƘvEL s{-0-_rYk=s7p˯\~@xdn@L`&vN'r>؎RvXDݾu:VZF(9TK5;AQQcYʈZ}5T {IG2HE;kH^KczNqTQB嶒-$VrJiW)YӐW/nx}5fNs5ęsw_˯zO@E*3/X5tLf׉3lHr"Ye-q:' ɪ]VJPü"cn7=\HoV,ZJ@pBz)*_XYBL`\'2g/8><grNIe&kD]H7um7^{ JrNjvm7EמUt5f(0q#1K]%ك/\wܟIN9+o6gH%J>]fۿoI=R"@*g[P5mPj# qʄ$%CꅘU^~uJO"ٟ>Lnqh9bU\NmHr uJ2RJζg'k耱"ɜh)U%/`A]$VE,8[O$E^ ]pO'WuysO !zwVz0'N%>U!oBu¼hSU>mܟX ]&vXi9HUixdRy :@T{]SK&E:)>#|H/R ̔PoEͺS3:oȯLX PGEWvpqÓs#hx O57]:$C_/<_kmZ+"u U82'h.Kh^]rreS*nxE)@.6033z8Rk7GٌӲ5gQ̺=+qfA1 +j:,| GAūGF^qJ ԶLvlV1MωxLN1\̥RhhiHg$Imff+EB靿VpM~Y׹rDҺ֚W\}2f3&,Y[&}ͨ|_~`6z g'U (< 3&WKt~:o6eRH;ѣ#dK$?0O4/1&y?hʛ9mkqqlUh.?B66-! \m:b$_\]?0*J:?(s4Qc$u3ywLI얗}Qe\Z;.7p|FR$Di8EU$ b3ȋIp(7TMyHQR鳔j&xョAmc}GMbm/2_$)ŲM6K.gjR8Jz[ʱbXbb SyUhSp_v\qo²^UZXdpm nH mxtD]C3#y!$!U=J ~".].^yp)qH+x_\<.gmK.vgKcűeޠ=k&Ġ 'YW\*yRҪޤz)X^;Z*KkVe@CED|({#tL7)|6f%GeOEJ3Pol!g+ FEf^KI,9FRA_4t\)^]~\4H6)8XH}V5- 9%-#aUsRnοwSH-t'fHeb(FAEQrNɹP0W%f qh鱶ܓ8y%. {.ޓ^<(w R%"ki&5w{gMHo =o; _DC;uD$>qŶ>Pj]Jz{1L#yO_hf B!yzZNP ֏LrR.WlƋ~ZH>-Zm҉rpkHNz^/6()ZN`?ik(Jpe T3^tr]MȒ!r:[QYF3g&:Pc9 A9Qj}kɀXɵ;UBu^M9YfM[U{J@ y߯ Ejp]jҬs/4hMhe[ ^PUnę.bْbԚGWSzI?QK2RkvQA O^مZGͧNk/ȉ1,ծb6JJzfqJ Ug$Rj-]Ζ>lB?Oȫ'>Pj/oѲPiV֖s8WVxLym4_K}1#_w=[ D\6_qN@'gRsr̟RȐGF@s(C-ҵF?P葊kmfYB;byK2~v roU(k򐯢(*9yh^isJeˉ4,q5=V հ8_*V\_tB]%'ѻVəs*dĸk}K4JuHimLtJ+@֗E\_rokNY/$2tv{iJ@ W]v 9qkXv{o+mY0+*vR\BcP4.56'mWS}+/giaLBIo^r%Vu\In$?z@ss}p^A ֹB{'\b*BErx#"flQKm8uw >@J`މ}R g7Atc/g)%3)l7YSkȋažnѳ{w.X.p$rO@{\޾Uj)[o<^gGU)y|+jW J~j2 Q6nPg\Dg`Է1Qr˶lXCC(#S p]~7c8]A".Sb("w vPnNv\ 8e)WNօ4hu$ F5YvYBr"YfjJًEKYS|$$E .Fv_NBD$ |rkhƗ1nA^BBynD+ݏ؆1^^Qe2ۏ07KSZ^䠑7#CzG(')΋:>3kl9R@_ Yi&u~C_sη1^S]IzҫUO7k{3gV‘7.cEVE"wgސ|h[vV% 'BZKb,uC[ŗv>fzzak#c!hw=C}=V+:Cs#{?Mʙ{U' #AWWp,eѾL{h9s]L>Fy{yQ$4@>/6pČ<ƌQ5^D+qup37 gn |@ڡ g8 mB׆P"t2RHAthPS #y_%y.?{ok*<>cŇ6(]?N-yy@nֆU6(Ň*tXEVԆd{ rU~Rֈi+3-AĊjH:V}G0-I,:U.?KW\E7(# ^8 :蒇1/_\Pt|ū+NFT'{@N"E~&1Liyಣd0$)*0JY]ѺOmf)Y~JK 3y=\ P*3J?Ũ^Or^xܴV o<"iARX尋$X$JU5{xc[!EO ; T SAʝe_L(f5LQvF]MCUR}sBU:RXm6(&G!.;Lbr!ܼcޝsJJ8s7> |gk~U MHF=}C3T9OXkA\nq3@zF\ }+o{.?a|t޿ƾvy;D,1:RϼCھ~`rOfac3nN*yHU:3B< L LjEv4F`赵%ۓiqLR4K|H8*'!ە'- \<ۇNO=ºG>]<] ^a;ՃpDA];.&蕆iQpzXB:zx~ʮ GH$i<ǹ43)*^&uIVڨ̟ n v8тIshrOrX>s=Kv_|W2?V6WN{U.YaYv)P[KwI|m(Qi9?}rh[隲+}}UG'dbҋiN/i'&o~ x6,}/ K nC.qtg J#Cf4V.\^7(,ܨL^ƪqˈ!*#;_)-fVD:]d B_^)cL/<|xx-qKũI&O W:5vbLJl(x\拼z Z֚1H[HׂV:5sߠs VրZK ׎cDžVʍ.g*Xjg\%9%7"t\ td)\C#FrśȡHzrR/rԫ:'.0ęj xh K3w r|ۿV;ou (-^EIƵ])7Enn|颋E[ԎxașmuZju@މH7+!x}W!+L͌!|@'B ٔ@~2zw8b^qp_:ƑW\w\(S׽Py]0hV'R,Kۆ g JuzE}cQ( -lxrEaF9*EAAM.ʯuAuz=LJJ>Ȣ}kؾ\p(kJv\I6%֦# 88Xhp'CGڌZ("W1yT@]B\ˎyTpny;*/hA))**/;oBCBR9p9Pvƺ-xoJN݉E9"1K$NMP,#5tǎ} >*\/Mj*E*Ґ?^Qұ@w[6PڌܠK&eۊ5 P.kl>(5$B&` |\xᆭӀ|:{(泞J%*&7͂fUvSc;lzRQ9f\xe^EmM.ڧ3i^#ίWJ_i[27^(Pi,3cG(Хc F?UD^EYłJ]/&y\x[n)û<@WV#KvXқSg=.9Sv(7^g Y(PbzL k, PF:!S5X/k.6;o[g)Z{gd.Zό&ɩYwU78{ɫZ!bbR!EiXBsҊ+EZqY0g'vdѷW{%AKbokIY=mVeyj٪kRNYޙ5YWkrX ji+)A|땳wb3pOeW_LO;606SacVyhZKD QByoǁMKd}MzrՁ Bk~s6jjcv'T&%~J1 {^osL#?0i/J_/lR:{U 3UtS}4h>-I}Fuѝ{`T֫` !#RLR;y>Tڒ@8`vSRN \Jiޫ Sz4Z0ߍJgk!g,j%Swa_%{'w-÷Ur<3zywڦ7j/-}U,4l6R:6E}TatoWժlQjdVHWtn#]:wW1)g$u%B V|p[\{A J@g\g)(>Ěiqvvɘ7 f8c_(OxT[/l<fy8|p2 KhToJv݋.[RaH/~dl G7G)qBo 3 ;׫u#eS?=i3g83Í˚w IҚW^' af}:u_!0BaeϙwCoy%l\kgGϨIsvjY4C93]4$6Am vYAנ{PHo'>sc>[~8}o_Oo__oeeNkS endstream endobj 53 0 obj 15654 endobj 55 0 obj <> stream x}fn|?E=~>9_?՟TTnl[ERT$?7}W{֒޿?}ǿ|:ͻy4v4ڔڤĦڄڸ"^D /ow[g?s^yo~}ɬ@,/b ;/n"#.GsҐڐS)Pgx&RD#W#p:Rl¶%|O璿Lbzh[p~Y=ִ,P@ _VʩtG-5 P],.t*DaE2࿼FE*RM>g"bCbs"OJ#U* l[- Gh:n+=YEkjEJD+^H5y63"T\5x 2oeUѡn+>5b3H%Y!5xc?8+2_l9&$!Wbl.5!iFA{~) /u#0+2$9Fa"F1,)h&4tY,DJs1*Hb|XwRk`-Ʊ'EÊ3]3U b|"bPX} [Ɵ/*-hkX`0 ZesmQL xOFgb<škw'!Y Xw[ sK\:/yd#X ft~Y kYD //ذgnԵrkF7:RvNH_MrU; u21m@{HKCAKI wB-} .!W8'j_S :1msbu5ΨkQq[v/C+T7=T h5v TVC"˚&|s#x 5mߋM.&kb*YExn3>; [6ͰĝY S۶6aA]ǎqfھ|Pqއ_Ԣ7[Irm9"ТR4o%Agwq;n[[J]0x[%ޔuQ T`54);ePJAA;6rUdoYD0 "٩\+{=z3^ss~YB;=dc ;"Ͷ~[Hnb3]!l7!Γ>OKUs-Y C( X~гNqM+CL=&z-T%DZĹQM@j"f88@Z)qmX\H7jMtEUy&V(ڤIH UTg* ivq Bmmr&kZT >]fzTkbwR<10uRzRvE\;̳PULv fTg[W[rӋeCJbۈ]T,@d >\T9 mI`wɠ.h(  5H][$LKʪ$mR faܷP=ۡ+g/A\HQ;3 .{q[=TͅX4-T.XҨyb [sC*)S[=I4UҢBGOŷU=^VصG1HZ$њN~Ch:vty/H;i:`R&eX l/{_/R((?L!)`ۉafHM]ꐚᦙ^.8.C'gxU9f_q53Y6)ÿ^Waw&߽aJj.*EV漨黔y뙲mp]{5BM;DŽsO vV\_trvIzImaߎT3ݶ dCl[tJ_V5؅6W镒2&t{m h~iT[p0|ڻ7J~dٶ2ƫͦ>+ Ŋh l=R4TxyB"Gnhû]-Z-Z "yƁM=Mvd)%.1QmqȞ툗} )ԊGemٛG9Bk np6uz$ݨ]΁ I3>h ld6(?+󙇾߽˲;J2;.QhA[0|jKoe4* 0{9+EZ\[yȋz"omYE=e7!#/!y,F=dYd9^"˞ L8`[<nmTx혩&Gdwm=]ĕe''i=?M?5~F~*E)i2Z\uZՁ͜vԬvUFňH92<RF6]7z'#Ā0vHwN-+Jh\] =Q9z_,GE*Z ͓U+^~<[ިcZR-KLU>Rz** `lo^:;`7" ҮXDOgīÈn'0^DTZbnlPTt&Ֆr hw|_x3GȘLdo{sj@/W$U'ՌˈJ"WQ|0+oqHj8">o:aOm'U "kz%RC)WAT"h}RO2`Ec={h;wzۢfNl! 2Z&qX}. ivZi|T9])?pFzoGGc@EEat&\Jk߼@,b=F~cQ@oKԆ=]%'.xsU˓H&aq -}ne)W|l숓plWTduRYۈJ*ңvQ ah_9YNh.6v)c[{^D8Cȁ8e~AgM7pyE"D1ϧNE$o♖FDKvzw0/r:0) jžڀgTvFoԔgd\|/noI="O8o]W1-`nP}wn*YXI6Zlӕ",If=;>\p"9/bAYGzJ ,ھA#*]ZU ӟ`qxfñ]̴,*iy>|!Mxyo8È:/:ŦbD{df,6\hS,ѮQ8~2yhk2lо^m]{QA\X[+R#ũygf5jfkQFH+xVrtwq"$l[EjR\VdR ]ֶ#j)#*35˾\Ve1߂V8e'pE3NN͵%vlnD{ t#)~yZFXϝE}ė4[}]tsQB+ B7h+s]nV^SoÇKn מ?ɉVVXl./f(2r.1jfaU'L SzIT/UMYARvpIyJ@RYƚ:wd`^_3SD6$E Sې6j|Fې66*;U-h͐$fH Irl${6C0CROG j!-& h*h*N.*X%QߍJ$i)^;'S~Mvbs* ʊhSY9LeI5 692xr;g*/^S3?SQ3TPP0WϯyNeʢMerNerNET^vBTR~g*KjE ,Ѧ`7+{ qVH* BE+Q:t2vnŦvomG m 1džnӲvI7@ڋz֘,bWmlesKVclǑiSrIwӓ} R.]!bSʌdۖp{ lMA{a({vLbR6E i~r !r,!zr|aQOâE=Ez=,)zPCqh-J c&2ZNZN'')d8L!a {VS&a k|a {|a I=SqB8La0U0Oa3FS_1'FhJ3FSR1'FS^5>1'FhM {|b4aO&$hBO&t`1'FvhO3FSmgڞb4aO&ф,MHb'î1' NȱMcE=hz-)F[whMvBzr'PCPScJ2JNuPR+MwxvIa9Wr(IM! 9Tr.d D@9ȡzQZ9Trz Pl4/8;lq:[E4g+]S|'l?c|nQOݢE;wz)IMgE=wS|ҡ:w+sttz Y )[|r+i9 9 9>c|nQOݢE=wߩNȡ8cQOxBJr>c= r|hC=-*`AR *H΄ 9Tr'P=OȡzC;!wBJr,*ݭQR'ȱxoB{kBa5Xm) 9VvBr@1GȡxC̾r|ɏSnHҝ|&IvZFqbqoQ߁2F-K/$ŁeIfXT, Hzs/ێ֒* bSm-O_8w8x8ppppp pph'QO'8G<8B=?gQG#%u:xC=QPGu!| ٯOw 6!%qLHEr:&䢞ܨ$F}%97!ɹQI΍zHrJIل\Ss[χ$6'j;'jLH&lirTRIyNHeqsBjjE:$9=CY85ΈC8=ΈC8fġ7#q(˘qȖqH,m-gġqFRqH)[ġ,n&9%i3ɩq&9=$ǙT8gSLr*I$Lr*$T8%9%Om-ɹ=$9=$ǙTIN%\@~)x~' Nȱx)AA| N!9uB99T۴<]]AA1 )~  9r19VDm_} Ǣb@mF:$91-;!jBB{ ПAjnT:w/>!`W/%ޔ1[܈^ڔ|^¼%XGaB50!Pٹ+*Y2#٘pD@[='=&8 eWoxAf:h:1U!ĜZ?" r1Dz%T&ؖ6RQ:@K`y0\H9wt8Z{\V̓P:ʂf<< шp}N'X^=4t|׭vL7"Hn\,M(jҕEwhWx[`@^Rv*\sOe(RI#'|pKY%{-fb[{-f뙮C@g\ŝեm`Wܶ#i@в`KJ c:ae7Zj{ 1U/֋e:*ݸK̻{deM~pv\IKF޼XUMeBpݧ]ǫE,fןm yV+WUH(v9"X ;6jBvs֭p'aw>|Wᙓpev>"BɁ/ŋn˄Vg+Ja J'{W)].WѼ kI=}x5'p=?I~D3L}k?Dږu@n JB۔m [-b.ߨD=JSRB/YTI ߍg_QA2TӊnkrD̓IMw丷s^C{kyqoC{rVLqoC{r܋zqK,-a=[{QO9zqo=r[[ԯe[qoC[?m;|qo|7r[C{k{q+9nɱ,9ne3-{8O9nsAO9!ǽQ9nrܒ+qK9[[J?:丷rܪVwccFqJb3rLg2ܤ?p1UyJDp 9Z+ߵEMsٙ)@Tޯ UrMyhW(Mzׇ+eW{< P:ُ:ď1QC hllDAGk#be׋J +F>Kilcȶ!.@PǶLؖ8/- 9ubr1,0ai=Yz"[k UudHEC[9ՅW`JYp]|~)hiJYgKibƊ6FU6֔P;|!W͂/5G Ԁr/4KU#hmH1 tkeq  Jh1nV#ZQ_IVGẽ5mF_A\6wd[{SJ䶽 `z: ťǦ~s,ۊ,%{mDP2q&PtoMP]/\k$;Υ;JFK&*2߂#H(8wYt"}loD΃HiֹpJ;.*,?z<ۉFDmcRz7ꖩv9XQ39>Ev"k n= 5OY4 <G_E@=rLWDlKPUQl,ͼvBfۻ8!q]N˔ZF -AGUlK /Wn|? 12kK ơ黩Rn KpᔝRnf+©Qגl*zCυ% P L^L -چy/=K~JDݑ*o<=!1G&,T0[`q >#P`JQ'Z=ԢVRm'R\[09j9qA2*('ʛAce@ZTZ;O <P+#`Uo=G#C-ې5U+B_Tܘ;K NS%mQn']QJ=cӈm{ʿμwm w C V}jq{YC}ȇxY-O!zYS}ȢCSO}SE=Շ|Ռs4&X=CTϳ>C=և,>d|Ym隼Z8Շ,>DlۑS}Ȓ>dTZCVS}+g}EO}>DqCTy>ևE=Շ>Dq5Cg}FGD8?qnEҒ8A(#ˠ* rH,r KDmb:d }kgXUKo*n> Fl}OqhMhG+1o*Z,zI\@iE=n?Htмi8 =2C#gKN8: Yv<8o^1L#}Ke©FnW| . H=.1C(l4NWؙҏm)w8#*^.62. ¥MDD6B%q?P>5mEiW=~h]c'^_+P+x`l"6>Æ6p`dMq>x+#y06rz40l׿}T->]*\UԤ_9[ 9K?k$ $5xK>'{?80 +j)&wT@ N3FGl7Ȟ+k^>ZE;9-{ӪPdG7*eL<G]RZ%s#p4):ŀ|:lK]:_CPY}7Wm ٞߝ!F|CE<@mdۨȶQM15!ڨȶQmQO_+ҰٶQ_[χ-Fakd[m;|$tpZ/e7sKrl_j/esKqڟdy>mmm_%Z-/)gKJitGxǣUxe Peu PjW*Y+@%WV,<μTh^*+@7 P)ITrUېZ]מzTc@AJٮߵ%VCe$cv)'|+.3lwJ\{p"!MVK|tT!VDt#Cl"\|[[,?KX}p3n1{YW/."+>D4f̈n[C" D}t6!*ݑPTkf+/E{NJi7fiS)UC6*CmQb[Ɗ@%9m zoDcKW9u( uGT2ֱuj@ v7s)^As41Qٳ%) vol[LyZpbpR&R^I]voy,_th/~7cJG1Wn/` OGipP9hht^,Ro"rḢx +E#`w`N.m(3U~U_sfSHbGʪ]({fMlGjfC\zeulUulUdlUiȓs~nqR p9~o \FƣEnU\CWvH*Dz%Oz;X$jiE"_%qwCVQD"*S807?EZZRiO!낒 iE2h"XD뻄REa":X=]k?x䙫j 1K)#JNjlT߯BY V#mnz( t=(eWSG7{o:ׯ(??j/? endstream endobj 56 0 obj 14456 endobj 58 0 obj <> stream x]ˮ%7r+ڋ,d10pl}>d+nzu|W2>zWj3|>?>ZoQbx:nHs91&KRcrScRScbUcBUc|Qc\ ^?[^n??ˇsOo;^?_W`Nۧ_%^x-V6BcLX^2jN #n%^ʰjNuq;@:&7":OC‰u. rK+BRg<@ЙfQ@0Pj\H_ZV8s3%sZ ]Cgܑ_rsCh `_I.V\p>"AS|$}/@ZD'wOcPyn~c"K9ȍX3Jb2eZ{} rEhBiw,]p_/j.ts'iCBM3gg-,QqGt[vؗhChC_9丣CO8gʟo ᠃1ӺuVHIMb_ZNtf ':XzY+9YJkliدgc[ 6cFU!^h~Q%(&so_LŊj;,45݈b&c 2q`v᚛oVS4ЏD{yBW` 0"f!*.gc % y2Eﶢ[#:B(^fŨ%kMJ'Yյ'bb2sLSe0b*%cf4Oįnw}>f퉈$Y5|@2*zM( ߷(Vu e`AΜ?;A70<ٽ xnDQcy7yX[UAP&,:.+ pY9q* (EtDZRh?C8Jc+ ]JV,Kkz}e cGD+8߿WJߎ*:6Cvh;Tnîrv{1 {C×{C-\6=V *֍Qg܄rP u**0*7~yP9[o7*'0Un*7A&SUNPʧrT'JkRRU޼g9q&Ty)6UVUcMe r]Se9s\G^@'E1U8*/]读*/и\TyUYQ2窱h1TY4TyY5,5U*/UX**+ꪬd՗ ܶGvECZ2Z.GrTx%}#?秋c!4Twe+R 9LavurR2j@Jẵ!pݦ5爵ūLaE6zwfC@Ja5^(SH)8tON@)ʨB:좫wEH@ Eio=Eg8\>DjEObjvs,i9NEOJ#C| 7iƝo } Eb }X,'Nh}`7 -g)yC'i\j숹Kq\;1X& Hk||Z船sͱR8v\js)船nGE,2' +P7-P |P7Q!O 9O 9O 9O )6{+sO  9jP9I!BNBuo]!NBΑO 9AJ)V9 O  C!nB,Ke%PRj桐slxPH5s>(f )PHPHEjC!ءjC!̷BM!A!-nTT3rbRg(j(\#+!$òFw("#+!JZYfFVB|g%5!hFBH ~PY J#+!JIjݑPY 5sRĄJyjd%-ϝxg%yd%~GVB᜚Ծ;+0Y EǑPֈ v>~'́O 4so( >O\Cاj89cx9RPu1\R pÁuq?Á >T\tȕ^E{;pAہyw;pAہ y8pEPtKW3wh1Ɂ+Z >>+Z\`|;pAہ+pbG8pjp\\P)\<j8pEǖ%n.s;p\t;pAہO(t8 Eg9j8pAesjÁÁ t;paoc7$[JgLW8TP 1 VÊ;VLCX1aVL(}[XU..uCn\oNwu- O,tܡGH*Dd)fE Vqpk=pT y\,a?\nҊQI@bjtK@O.QҤJE D)Qԣ`Neu޿b P'IWz1t[ 디AZ CW({X"Bpn ]˃DZM.'/6eLڒ`,KZqcLI XqZ%(:cT!Ή Z%7:5HJq!p]aQm'y>:l-bX3'W&̓Xs>ȫϤmQ;sx_!7:6~9K,EwZ…vTj<^^t ^ھ4>=ZM%uc$4d"u!MT▫Ƹx8#4R—v8U7_[RU6$Tkqtͮ¯FyK7:_IޢG=:;u"Fc$1@h:yKsEyBAScAr+ŢXX o$?Y$?],<$w}$&P.EgDNG䍿58^O^jMHm5L 5Z`]H--T;P,#dbPO VaMRbח X{n5Gt#db$=sHwDQ|/-& sZP }e ZmAJ,DEs(l$)!-@c"$;$./ޟ8=?]&o "eD(}y "D\ccn)o q ehC(ҢO-ͽIҊ* Y&Ih(|M; Z}&(۲_6ņKmH y6"e7A y"N' ,Iu`oF"F^N춟4ehJ.'KE(X bȀ3mD8rxa'//b+!/"6߭,X2M^8<t #b$$L:$s`&OLCŚ /3bhO&{O@tͨL9QJ=& .߬}$PN [2R)ȳ~[ZL!Jk(Wjg~[yҊwDE24k`Qo(+(nƜ>J<ٕ.mJj|Fp9K@3@e9D꤆zė$mH0L sQ`{Uj*ƑoF$B@;M]!c:q-"L)Z&)*LZ;:1T\V ReK@J ΡkC0 +o9H;ٚAHϱPN %f'3Z ;QiY0d$*ECӓd& ⳂPퟒGH͈I$9>;خx1B-u6 |hĂ@j/o"--. 2Uj8lQJzOC;I^1 Aљ/(s Bjl+q戚iRK(l\2u3q{!iFJK̜sT3ю*/XawU`uyj'@[ŀmY6XJQQ1A= qPjpAjz8Ьu3j®(1H 'Ou`{p) Z5uz֐Ng#+{2INڿ 6Rv,Y-Z#heeK!9M3^a% n,N(d?B7aPmDhNKwHKIO=B;q']OM^к $_w!(Ej,SJ RЀYlS]xc:/w sȽ-hΚ 8qʸofP3ӻ"q~YF֣VRʅ]?8dTMJn X?)R2z!mS{3-rN+ ј.UB8z(zX+VX Sv9؅9sp 0iᠻ]RleRӖka!'*bsT%j?Y4k(SbN$zƝ:WE:E^R jP^5v1HJ+݌sd{xzt$ڵz%í2<֖&p699PKqQ7Q*{x)nA>vG382~I{Լν]&R5?av4Xtn\0ƨ.DbCnȉ̼8=s5rV1 Z4Rt_W5=9g'-P3J#+r5}\#J'X^[^$RyBq*EHlm\~H@4Mł 5 /@a=Hm[w@n([Tx+.gkIn$V![w8G6" t*5uwZ>;FnhQSf-PQ%1H c.1_Q;r^\&ܡMZɯ==we[\wx$şZylg;POb5<ԺvD?oVa| .&fhUtVdi \*xSb<ء cvNhir2T8[IٚN(U2 7" @d78FSc^5zm'JEG߸Vz*9U0{7~=E*'fSde+CaX`Q"Y29Nt5du[<[AD! m}M}ӱ}]#.6dw: Rp$ֽtϢ7p{'-@> {8Ba:;dul儓3[DE g5ъ..*Uow՛u3۽ W@~SB ~zw3in#@QA䑪ϴx*Oٞ5to-ܖRН_/zKHJKQf̺SF[=X*O|IJ+%5|7pCBf( "҉5B#@Sg\̖;'Op͙r#i%~9Xo}=3rZ9\.my$U$#{@xF(!ZFm$ùtС;W3[ۈ s:籜+T# GavE( ?=I_1$=χ&%{[LjxmA<(Ԩ67k15nd;~͑s[ru8=Ĕ:-TgΒ+NUJs\+c1!^#{@GJ7&ck%i1]WO؊#*[}}*vBo~:p+r|fqМpOpc%{*A8f7OR#.@: mΫm4jwIJR/[(z 4֚qɱ(Ly`o=(Jm <ԛd{r'(^# D$oH6@<5Oq=7q빛JVf\5]P?0~^#G(@"yú]m֍48ָ[ݸd[i;{UcGij\qGH+@OFiǤ q;A=>" {rC=>䟿i`M4FEcIEr|1 D!c#c;XA<g,BRAE)E|SW$*1Fp/\QRbQ4jI4>mHG~G -_Q'zAd=AaD(j$|zrP{r 9Z+Slލ^S hmєT[\hYRm[HF(o_h՛=sFK7'ݨTD6}ߧ;u1=? "9˱޿0 Ϧңe$Pͪk Fvd QȲ&V ݟdN(G: !cPm°mZiJ)P~ J]NRvFlv$V9199u9oE:4]9 }w)ٞau)ǗMyJ Wޖ#ʙȜPnLa,5~nޘRc-PLĞVYto!F V@1h$ -HENcD15ݸpGJh3 Ly =@#x qs 傪x]1X+9ҷR^2ЊtHen>W"hr`z@t2hN54dxC!X7Am; Dsk}.@|ݫE.@<-Rȉ.bm e%|F anT ]k)~8\Pp!B;n\gϵKԥX9H`U=0 /=Ib}qvma wC.ΡqQa;)Y%\ozU,@"GUs_ u:I=c[ V%V+Y'8-qںd.\pҽH9ګ T)Su}HeKJAJ8sTZNN%8taEJhE( DW~z-^:-M~-hL .VDs`R_|:7c;?y3;_E-Pnk@`歔)Э:3/Uh,_c]dNy$rr7IA6Q aP.)lX7:ļPR*qёCRQ7~oșUnh:h+:pނSz۟ vNrҟq]mj?_ަe0.#ݓchtjQc>=09 eQa7hOQԉ~B[eNv.usѸB6SѿKE~}kq{rQwŴzԜŤϑz45ojdJ[}m;-su*p-W&+ځ=m )x3xϸ %vPWQ ʅ*K˜|jP9cqyE~bgGn1g"Q(]sf|U)}*9'$^ ۸, 8a+^^W  k PsR[uuPX~Yn GDڂU$!e#@ɡz co$ Zq[Q{KFiŶ[Z(H0Kz#̼hj iSߌ#tg-i-A1]bRV$cЀ8s#_3= x2oTi'*r'Z*ڨ,%WZ?;[f-J#O6#XʚX* RN8Wr{TQV]pB!*"V%IgFI8FC_Ay]{U~TtA*0@hw~c1^zPvt3YՇ'n پ튬wkmx~mh7)mo5v俗r8Vy>]Q<* M"?9GF1q剟 (봦@TXL ̖ d[pT8Jǘ\0Nǘz9 Xji:,@RV uf0VM(}U.^ٛB/ f.M__X}5,A~pű%t/+`"DE#*gD@KAqKR+BT_=vgq(]7_.D(/΍t+`fzdnu* 7 uO<%O\ɓ(rh2݅R}V7(FpJ{g m8qc?S80r sY8GK=Q:v|:v@A*:[O5g¸j4+#Ur?nݟc:yq}A(ȣYJXO B ɡ&ؒz_^冾R9Vz=*|z;dlAʓO&Ic_Ɗ2!t({Q=Dډݦվ @*S$T̜ \B{ X MTʡtu'$]$#N FҋUH({1wSp71W[.~yC9ݛ7\罽(EanX ~WP+D-J# bLDCnkZ8SԔHSjױi |9i6%X*$[X\~J:A)6jI+ j|D*@d&"%0J2>KDjsjf' SJhH[J*zP> XX|n8z}޴. GnJܚ-c)Ks3zVvpZvRvaz+prkQV39uo߹_HlH] l('ztQ iH9y7_*JpR歓7.=8#"ozA]ЌP*ɏ9j-SR-F\{5[z Eς"UM`f<y=[~eիƈ 4/ѬEUY  h챕::#GwcCo FݎUiGf3X}M-&Wf&3B$ScG}Bɍ"V[)duo5{Y+qfCꣿpsMqrr##>ta|U/ ÃyFgf77h9X&L@e>s @9Ctg *Yݯߊc!!-ҤN{DKaLi:{BKⴚM2G ˏgOx$ptu#ߦcMEPTD#ŬGf t'`T{R.XNсbTK.̑l_JHe x- !q|BLIRQEIƼ=]N9 *ƊU#Vny.|J?wYW?]LbZ2W~,ʷBiAv/@3M^Xu1agيPLܫ\76tNjF*ES-(+\IExN{f9;X aP%^)qRv ga;+XzM!L"ۻq~x(o%?}z7~ b\o !"w;W;3?򍾌8~߿w {ܾ { ݾUEyo^x*]{wP l/m+WV[ǽJ=S }zu~CÄwJ<%4bGQaf~Ϡ~IԹfv M}o յ,^Y"lQ+׵Ckh2Jw(c=ZVr/ha+i Awj-}'77JKjdŠG&|xamF̠5 t{4zF$R"m+]A@%hGeo]H>.HŜAR CLsFTЋ{%_rcDFq/Y"@yD %#Y SxP!_{^dn@:Ԫrs$~1ԕMh9Pge,=zOG,!JIJp̔pk +L'R)uccQbKKB.P\\ :ׂdFRGef<7%u0Ds;҅Y)ߴp%`:4tO{5萴'3., {SKYՄ@qE7$#\dAd ł 2իw\PKP[_]~X#>ŧ7P( t~!;9*M't{chP_nKOkFLag>buI}öNNa۽iֳjW R>gubo Q?ղo_84Wܳdz,/<"JOʬ<ȸU&Sĺh;V#~ l˂ۊT;)|c|B7;TJ{ 7/zǗgВ޸c=lIުhS>ae0/Uփ{DDvLq -ġC,ͧ|C{+qz19׿ 0ƶܱxc0>s,pN&YT H, b#m1n-o 6G1jOĴΊb+}B=45tO[x8Fpu ܢd#̻ 873@95~/*GN`܏~q֑]IUVa<#}@?<^+gBjMs96zMj\/nRB@0nMsU~ b?.dlt;V= k/yPn:! ӓen{@0P|1\aFݵ NGqK`EJܷw$εl͂U#$x/iMY"y$C/YL p; ,ʸ&FT`b<.2esd(܏rkfJLQ&+IQ]T'M.83u$ymEo2ugA }dK-'žcϋ9)N ?^ #M(aR͢BY+2O_Oq](H4ӎb>7pXjiNl> stream x}ˮe9<"\\UNYukӝ6F1lH4I/;bk_@N>!riC*, {m] I*BE W8P*@W/(N. B+BI.׃/E]芢INtM7+bElj䀷3QQBśEe9EBG(}m@ZB$yJPE&MnTݴeI0~ 8h6Lݛ;RB;mbB;(BN?y}x[$9O!,-༠xV"'yZXiK>x҆Y0ߏSw`q _@D6LCߧa -~>id'A۱ߧwR) yKa6g1rAec9dH܄\mN0kB:cIm^z|,׎cQmQTM垐h۝ndQw(|N@bk,G;<9e o"%*g`m2lYmPEGY rY ?޻G 8P*Z" k5t@_ŽpwC3"8`=wɏNe03I %hږ&:Hj ģo=Gw"Utx}l~I.o4J C !>wCC}@8>ςV{Dcj:ev٠Ha!,exM׊-kQ:I1 s3.wU"]%91$/x_h u AdmL}&=J|LR.܏5[36XhrG.3p<8+T_ǢeMRЀe uQS.(EYNIC K yD~4j(yõ(tˈ/ɠ/%dpV4l-{dhOoFIƽwv5nWj6v5n1"/r5'n]oE _oEr0*7ɓ5Fi>m?=L0rlF$JѡtQ(c$EW''o]48z^VܳBjjCKxe. tOGel! fYs[M  $oe-#$~$M 8]_UԟWj6כ2OvGbeWVt~z,xgpFѹ%XWqw擈$wYGS׳FY,iptǦ~(`a}F Sn |ciV HЎУF>IgQED5bEqlcp;N1-ycMwJѹ"۷ 1 jX[B u8ٙog~ -_BǸmPL̿k-GSg\Fbe- E+7(zr׏ ԠSe76(5E5qViN8? H.4`^^R4"-%lP*XP<*9)Zw!62&)QW#/Vy!En:0zoIi`r5H}v=f{Y)=#E_+L._,Bg;X.:vPQ2!.*W^mӌaRb7pIXc:LaIZm;6E*R/Sw7.wkaKWęPv~+UUI (WCBʸZty##J_*ypBJCM# Ba$]rhMg[ -f+Sk~_|.D.- #b3,bD#P|aʯ3]c)kڂ:(LP j޸Ӟ/LĉBIgB*ĉTYHpv\RJPnC` .(VܵrԊzj9.ՑzJ,;D9.ͱ Bm!zXS9\ܾ< M._-h2y# 8YsqIEbԇ{?V!z834!]V΋&÷MRKF.X/4ha7A/2nBtaE,%c4  YO5]vh$rQM.\Xr7? h><_mS@Iaʠy`o">9h-ծ^0|SH(L{=8/OCZ4G{DzJ._g{>̛|gvl3,$޿;8Rl\@H_@n&mSxXCV3۠OZ Yq"cYcem/7,4 1kʾqDS)e+0H(r|K=f,e;KhC4K`x@eng^I`ܡo0|1w9j0)jނ<DԱ# he&ȮQVzsCrfD}ziqa!ѣKFRL+CV%is]dmcU=J _{&ݒTvKRIHE4a Q"I\CVo)\ HJo; 5nhU53t"`r/4nY嫽#obV4C.k,ޥ7y<pdS&{Jb<.k^:ƋލTSX[/ JXu5 6 9Z!zדԬD~'sP;QQW``?w`1͒w]T=TVVu-X~ޠkc zsS:XiIL x(Kڠ¸QtZ= ;b̞eEQxpyOȇƮ6QLR?5T%/4ɂQNX$϶V$iT~ %|-JVr-ӚQjj; FFGd @%g_X2҆A͢η$ZIVUv"xùQيJ/.ަ뮗h{*WfsQKMr)E_enQ*YSRG/mχ5{X읒fܿos}`wM[ AەΎx J!DS5a?T Jf?PrBB( >0F TVglcњ&fԼq@Yr|bkK%5%ReR1"ߍ̱ #h8sGɠ N VCoDWMŜ(Tj@ygHϷ$k=I2L$ zVmGݗ-Rnlka~޿̙?~Va^c)S|)e: V)i@H6E;- @W$m@a2RD%:frqC:&n yF0XٺqՂfiZQLe6S%%!Bݍ %$ yCYPv|,Iq"_9K|, )e:P^$bA\O=OɁ"eIp,uLY$,A =BlXx!UhWjt-'4SQ/9So~ٝ"Td(cgmlIF ʗ9UwdD:^4pf2- KoU-)KVQJҍ{.eΎ}y<(?dFS=Q?%axC -}gK>ll̖(̖75vfKؙ-Yxʖ(ZebSdA%Oْ}ʖl/cD;["pzgKļ-Y#% -Ц1IeK% -Q$OE-Ζ,SD\̖&-Q1-awd|ʖ%[}v3tXl4-I*F35t7ę)(M 3gSJ#eSeS#tdZG)ZG֐wd(Σ˾KRfR m\4{|ZbUES67YF:[}1YwC>C~(AkAupkYJ#| ȡ J.`>KLANݡeCZ fb܀x GD1 ֪FPN ]PȫEr:X0{}-QTR#ˀ3SG2#)iD)"X:U\th(ڠ+ Kc{ҽ`v+ 3-s+:kk$cAR5Y('N! ֶGloIZUt/WyEhyq=ubiG{VYPGլP:O b:PuUq^H/~WIZyA8fłW;"QڨZVnntlbi;7M]vqZPIxMW~KUs<uş8k }@n^fe%Ank?6Nӟk=6ifIt7sHCQ;|kǽK%9q9a&` F4wY~#E'%\` NQh,ͳ}|`4|3-w oyD1oָ0X<>cN`Mj@;29M@t^+k@܊hy<"CոT){65i;{}EmӁt]+ eo4L?nVY6y)8_~_y 5PLd 0z'3:m%[8޸aGog;~f?_1_Uh;ʂ Hg@jb5U$/n/nPOL/YCvݠSNj>VEq=7YJq!= #?%j^Iߵ; ݠNyVmFXTY/Gq$0#h.Ҫ=P!o?R磑vU=Ol+ۑ |O.d+[T 4^,N'T~q^]#Hgd >pw7gn6 pp{AAI~_q.r 'aEw66X U!`'19o 3ג!?X&*ײ9㓐`U)LH&tï_4ltUV#qJ!L=&*W'QQ(MP N&gVq&ېL>rlGkigPfTu)(Y`a{Eeeߎ#RH vHh/mP E+BUЂ )8c;,: yɯԋ.Vk8MKB0YG%anI"PУ^Nt$2yhk .j6,:xBiŞ5҂qJLҊzJMt !B/Y~qeuԖPw,뺀@z9)w lb|4n0.I7y4Y[ --(;F֯Bb5Sfjy D)M)E%m ̞'I{']JIm~vC.P_梷<sDZg(XKݻM(zkC$cZև]43Lʏ&}9V\-q^tWt~{cÙ:JoV™E"GȸIMמV]PҊ|6", Z@il@ htz_JSF,yeDrF@9J7z$?7⾋Ψ>̴ yN3$pe>ur@y.=0#ܜP7yR|vHJpE.Rt+zE>ttq+82_lmgY`/},a%=ym>%,CY/>m(%X8)q*8t17\z<-ߋ2xYv-GauX'N-PR '+RgcMB@c~hjEaƾ3yTQg<885"ug3;7rAyw.A/'(G?.3HAR](r8ؕG2EjN;Q(9||E eޕ8qU z[£dP'±֯f[/p_X^TO:*O$ kۛ(@d.7 BV3YH7;3bF~w"$,s҅P0+rBځY(8!<@!<۔̗z_ފPWCF(:]R!IeϦ ',H`(etʮ/!ozaZwR WQbe/E(EsȂZJ5=tc" P gJ+%C".PJ(3ev2GMC_8Ycy9JJ53g1BW褙DD~OH\qվZAGSig$V_1&s.gw脡h冋ECL?^W^l;%B.OA˗ ZZq~>͋ ) F/ClvܠtzKZד=]ޠbFr^I(W]"K},ADozC!y]h<}k~Zr^t\S93ԇZq p\Ȏ?_P#75)QWgR=BQU5ߠKCG{p(k}l׺o{tޠT~g[6o~`$6 Z 5-$!]Z% #䗃Ӕ,JfWmǫG]Rc6e۠P noAkQn>t8Ma}$䜳q(,9 sNj;ʪ>Sk6jb Q\;]$c.;e9}?LfF4D]{^enhUj{V1֓ MwMWR8ɷɡHurl*s辑Dp1Z iԞBXj/ҟyR]CS%uV:^Լ]$Ի>Bql@;1:~%+v잿;"z[uMH0T}G3GȎ,a_RAR5,6XPnKRC(9xQwq`764#aN"R[C$1!}Kc/h):.Y7x-Qʼn-Q! ) 'kC*b>`/Ey*  K:,]Woi?og ,A_v1ċ-_lIVSXrgvbԮ+IE]cI P.PC"rڨFuDD*Qv K1݆ zۥ MҡB`\{_Bж^t{e"*_m!.Sqs%i7}(#Jt)nf [5"?zKi\m#7*Bv_,57{1;zt7-؞(CK U@֋q;m,jCȝnDwTkՂQ::c5OQKworU-A&p J5AbۢnHVM8+qCEY/6bb'.KDL(*q5oAXA)_I|K&4 R-GjiHƏ$EFRN.Sa2?g$/￾~a?_{d5y endstream endobj 62 0 obj 15198 endobj 64 0 obj <> stream x}ˮe7\_\ *]. Wݓ}=Z܋R$2x3v0t_?S+h~o|/?~~xǀkGH[@^~/-_??_oc˟__Dm_l0} Xq͚w`5!]c}V>ԯAShL/,hN}iR@̜q݌3V+9Wjyi6ҶPR7Ī#=yi,H74#Jk|F4_^2K)cC Uj՗X kv4'g..Ф\E+忺#5q %~3 #@Tčԇs^s:gUInű5hr/j-dPI= 7p溯[ k3D=ur|ïn膫^3'&`H" S%2UPj,rV鿼e6#uj]>542t81:PAhan>4&Я%o8~ьXe',V|[u竷䭈WpqK\7J~8<e #YK~Jv9qCVS95/|er3RKP,0ȋsE .$rFj}l#~;j6(ujQ˯;=7m Ρ`2L:awb}C(b@iP1 x>7u O(.(/hADMA & b_}(88wsѥD$t)87) =F"N_4yҠ.ynp \r7T8S]p]"h׋̯o3I(# |v$e :?/R) >@Y.- (I CZ Nf3 AE(JAuX@jD>lm&XQ3gƫ9řKCNb^Q/W\dkȪ=^`҅.êR|d ~bZid(Sg®( tn±XDCtE3:5.v.EVR;D/J d0,F)R;r|^M$oCXQj\DXѓƷ^jƚ/Zm_s+H~jĠYHu vI17*7+Š1ez@A=9RAIpsG5V Jf*hhv^ ىˈL`~*>u,> tEu9m ʠ}Ʀ%YT+ rk3s遷fStHF1Y#1*h#`DCњ ZdߠwM8-U6*2KW؂~٩H_BrHec;2Q/]Z3cR'DTLBBO|,S!qg >8wxRL#](a2[gf5֕O`RFߝ!E幆r v|lR瑑(͛-ϵXYA&  eeuX8ځS|ȟo m)N&q)\ VC;p!Nap q̿sR)}_Hc?`rw>'LnMdrk'@MNA)49 e&`$MNB;pt6Y$mrK&VּO&'mr LN4MN?*W)D}^tVMS-S;&a^H>$T3c~>'#ķY>ݏNHh],{v? 6ݏ`ԣzt? :ݏ6N\Ozg}=o#~ЅLRt?k,5 )<0#v? cBQGq5*So#85Z{n u)~2I94eTz:A c*yQp f{ԚyZ;eo,!/h[@ J8e*6 W HAIYƍcϚ-7(}! ˅T7YnKB,Ct&c.5Xb\:Xw"*0vduʆ\sv;QfC ^6 ].;M"X#o ^>Pm$l= ztA뫃%&t=#8QPIsƆVh-LoUE)K0HFǕ#hҺ[BRcCrE_GfW>ԶŢ]"3%R%qc#ЋR@AI+X%Ew%ez!A rm 7.oNğRg"y(hmrnci2d Z?גN/gm,])1";81Ƶd3F$pGH-mH-fܽm a]qR VRPΰ|%7( lQ MpDQwS=xE~arFߤl_!-P-NJV:>?~' 2r -($#,xg ?L-qf|k\Cv}[ѭ!ѝry;q䷩Ɠ3k:B:gћS6jt.:2|).wm;Vԡu8eFL^C}w 1sv~MiM8פ6-RL;-v19dUFN+@̔T,HP"Cp!xKik,[[D=H\4=xx(z*^AS8?KV DeqBvdA)t8 @9`fnޒSsv Rq9X09sB; g t9AaQ`]nP3mA'E]Ȳ)XP tQ_)Xo2&VuOfmqth%wzf3I[AV4`t{%!o(a<7w_U%hMu9Eўw8ch^Yt.h{ɍhəWڪ9N ʞ_!.#N_cMؔdžHD Im;."IǨ^XSXW#Xq~ hRrڤwX>{^jN.>l=#qjG,uJ-~%ʮ_ _RHO9 l^~!IzĹZcůoFjynA)5KSb0͚SJRJN2M!^Mň/ĆPJ='9u@ZEX9UƷ4iY&4ħUR.8P׸^#zfkAZu3GDQV5^8/n*zr>h ʵKkDEjaUQ3?n\zzTp8dO1׫z $%/@*ՆG^kKOH_l*חwA,\'}7|o#Ϲ"d9WȎ>ۊ}; Ё t r}]P k?'P iU!W??g%?V-"A2B.Q^u1R<QNnP0i'ERz9V2H(9ˁk]9T["a=X ^R 7( h`FnzBK4!l7.SK^@ns}(\.nj p Ťm<#`VL!WpqjC]#jlZ_Qw\$ɧwLSI[.;IJbɞf >0xǪ ɞcivƸ/m]Gc;#eO5pvsA1d_$e'Y(-Qq@, W$k@q Y}A8ͭI;E+˰OP4ʳ{7d!g Y-g"I=c)JOGɈ\_;0򍊲X"d}$Y; Z˽m] \C}Czp%t3`Lw[9Im佸:i|S!S^}]xau{0z?4 /sclvde]qְoQ/Z q~醜^!Q< д{VPIOA]JB(C]{yPiܛV J. [xf,Oaw1Dڵm$/MOB-ZcC B1 BNS! +*+2jG'r쾚NJIԺL\kJ@FzP\_GJ`\!m#ϼsފ6(cgc3]3SmtSj-bعQ tpYI:βm# 6AdZfEJFͅH5*7!e1\|)M^DkWl1Γ0^Nj8({8<s{[Omzc3ysGĂC1N ( Rp7"Ƈ=ۜ-ԞtJQ >_~"PHѼ#JL)_^gP^?B"-nO⦆I[Ѓ|nBŭ; Th0J !QR%S^Hna݆wfg+S{Z, ?5@rh&Fr: 8UҍÈ8a\v^CPZ9>\s &y.lcg=r!VUU}$:YFH+5VB ҶAϸŨ&xTV2r{'{R>'Ρ9 !7zJnb^M_EI r&жR=Իauvy (shpEqOγ}ҫ z<# H/5lwc$4vk@zňpBg2=_m9[=k$n+֮qR=.O7}A^"gm&gRkqoecrÏ#q҃ߏUu$-ly]|[o6\&ʃ8WTyj.6vaE[q(nNZF"alI*HP>"iAeNG*:drEzP1mh 7jF- bc S *!_E =j$mmGOl3O.IM/J#Y}%KǪ΍ro<:owesq\dS.^w4=sCɓ h]$VɮCuCc!>RPZz,(^403Dݨ7b>:$z&ďFE{ĨX/*Qy*q#ٔ҉W^' = ٻK8nj5ں,!{m?xa^wmm8 |π@:(V5穀B[r1^t8١mk|PҚp;-x `^.Geн=V(;_p-Y#u1_Zfܘ6%BIҌQt@Vge L [2Z&nP P&ސ4s0׵ ^5Z6^qӽL^F%l_'8E*u8.Q us,g.(qz$E6;Jwm_Ooa]Q?NHQ6bk"kN/9.$y%R~l]t8ٻnkuoXziR{V1'seGwDw3u.tIjR.|>\/VG#= .xw(wAF)q`.5lێ%UFq`];oVGm H{_ :_g+;}KvdnueK#~U~c>(3UgqI2(pnH=vK~Ǖ64^tWFG%,3'=/vO]]Q(3ۥ'j}|E~'S-vȫ&^ۣA Eݽ}y糧Q|~{Sasݡ~dz+~ @r&5)g#PvXC]1, Rkxv}HREl܂RNd314`f Q0jf Ӄ8hiLU#+As&Ij` r/ulA;#ΜjPЌX5ody(Yf-\CsA(9J; X2"^/\#RFxηx0H^HޖPS"Hҙ ŀ4WLZрĹdqVңz[m,N:GmC㱿L)7΍@U{+,s|e@SDPb#')fuOq ]7l(zIȗ!²ý)t1FD{;NHG CbP=9Q٥ ot1tJ@fL}T1 Ǩ1Z"s!G9!. ':Gs6%ہ\Eky@I5gh%f͓߮.`Z.(Rc PrPVqh^\u*\u*Ċȳ_ۆxߠxQG^jy5?Oqǎo2h78Mǝu ߐ:o]#G+L0)o]/qoB u0%>9ihi삯D03Xg\seD=7ڎ ViYUV&?jw?:jTE߬^qlKJYٮtxYкz qe<"@9}>"ίG A#爘G,WKUhXbpZGwg$VѶKtγewo2A=>k~Nx41h8M AsE-UGem?e3r+Ֆ4۴xHW: u0k]y;]UO3b5?B5ہvroD/(f淪;V~Vbuߠ?Y }Q$FoC2 dqGJ(3ә+Ϫ5̍)tWF&GVB'U\ 3sεHNۼg st,Yg]QQSja;( 5xnϩi^E_u9AMt.Tk!* zAݵ@:L|{/,p!wЋh/4H^OqEoi0sJgh~|먢6SxȊ/庙OJgG6Q8qqB(#(4=dOWK LzGPש0)ji̙)-8[pōg~7VBLC(+HSp9l^[2H/={Њhf7aE3<)XAv̬p76NRB etM<Xj.@AQ'қ%ZE^SiϠPzm`IQu7JyMdo!OF z}~ٗ>A ʀ/Cadٓ$+#g %=7vP&i㽱m-8y~5PW6Ŝ i_lF}0#=|C GzÔ;"w:=-8p%Vq _(Sn/ EϬlTX% tXjKMZ"?z<"vZ &.RCr@SL:' Ze -#ԿJ5D+jP5wz-h3B˃6IITأ7 /UR~}%7,{'QBP8w~Ymtj[J>!&W>2wzHdKp,v `T ۠|y*7{QxJ}LWJSv7c$j67|b'14lE zFgxK=IK?~!S>=C/-q5߁`IHgy>~Pᖢ:"˼- *׵˭X B) @/?uUPm2׶5?(E)8$0EcpUUIO^SZ'(Mɮ׵7%%' +l]J*IoIKu;`ҫbE\*֥Tc,o^楰%gXrrmb|SdAՓGϪ |u&q?K|r$kVi;ўꍞKoOɑJ-χoI=A&_J攋ݎ2o5.H8a+t?\W*J {{Y"z;5E[T]9O8M \`;#货}޼+8q#[ݸ5-Nz{qG+拋dAAr}*BZOk:b-6(eP*A?Q<?%O?)sT.#+Y'jۮV+IS|CG 6swF+O`jE6_q,mxk+>6wWv泠c#ޠx9"8Mסa=TJ9s9[r@!1fr5lfYlz5=35QS ȎzQl؇ou<ӈ3SW#l"ȃqQ0Kc}LvIuh3-5.R$z"eNY '%Ѫ\Wv, [݁Q;Ѳ` lkw[Z^uyiJS׵uS(VNԏv0/rEmT@ g%16,WJA;oEC;H%5Zsr۫YPީ#D#R~mE(qOUԓ=z2mR+S:ʝfĪĊZc!δ]۠dOp܉un(O([ڑI(h19V!V"GNQ֨"VtU5A˴"|"CyUv&(]*X.RYkG֫60ܭ%4_:.md\KّBg(]8Aρ 7<_U;w(=E/F֠gU##ʨd+Cs%?F6%WV37Hl^/P:EFV \daZZ8ix>Aj;&N)gMkm ə &ҹҹS$Ƹz驈_Ϯ]IzӚmξO|NjF$=1ċ}iї6JQZB17763YxSb iڢb_IҸVtUe5~rli-؟Gp,HKVȤ|Q"6p^.&1F>_5&~~X;KIL,(py3vss r^{|%Axu3{3ş ÍG[?_;+C5䟯!\2suƐR(fG;7$\Ε3}^se.2l)XEO Jp[;*$3@GE viA~VkMsRp5j ;[]ȲF"5[eJ+9Ͳm]-m谬=|wA,n=r FrʈY&ѥv6cW4jlN}m}yB ]@|G=0.DB[Ȧ-9ʈOfyuAG,QsqfbZHˏ8 endstream endobj 65 0 obj 17066 endobj 67 0 obj <> stream x]ˮ%qWܵW$O@0`G=? nF[ ;|3I&Y=_[xWzo|_Kx!Ƿϗ[\[ e6ӯVW^?_J}o齽~S?/jzw߾$k La[zQr-X cviFČ"11 HM h o-N!@ P4GVދeFFDIV%,ERUʡ%Z T [F}NS#/g^QF@R#N&ńhFtHI/NR=H"9lB`)Wկs3r[V Z+E-rs?aL(fRwy֩*0xҺ_:DY},4QM]c=pSڱXս`Kxr(@Ob9 #/8jIIK{HBє˖y% Řr|4;ŌQҰm,*ZQh6Dnxbc/O =>C~p>e9zO"';Q!")uD2ƋA?~r@qk;D숎CL=!?#cw?xlCĆ^W6g+~w3hyOf۝S+nh炟`Obspn<Ug+)RD1.؉)ʩop1ͰgLmhJC@|9)[O&7P=zZ`\J[q[-pj<_Z=G#j&1ZZN3-rJ襤q1_!fh˔W8N^#z5 m ~MdH5ZOҨ%T7CaR6: ZnUk$&WLBӽX&)=J]-RdA+&5ҋiqyJAq: n+=MZJ#ZAu`/ڹ=FĞQ_o`9*Rrj7+%#)EPV(6͙ddu\N&1irhs(_V{FĤa{H&5 PisF7c=Z鱖;8v7].q|-ގγ.wd?ۙV[BȞ{mG1"h^0Tk+u,&%16AՕ~w_R.S>ɼZt\]>s eр>ڌ@A%{>f %(DOوl痶ߑ_2PQ˦ 4? @~ZC Cuzh>Q&BP@V'&Zݤ*%,I{J֥̃ˬ{ͨ9>J4\Gb>VP7Hs6z Ǒink[X_-Xxۯl39vЂT}>C<.%i-K.m-Kd5K1̀i0㚘,|Iʱ$Er$nj%ux/~`OB|3ڍmj(nNs_ =}dv Wl UFDj뵂Տ$3ΈR SEqw')95CK/irDeDhK֖&~<Ү۴R:A&wit2ͦ]̉KֆSG˧l{ x߫%'q#\߄㇆V6su_'mKrj5+2vS d{⪝x_@SvZ9XxASQ3+zQqG' _,,=xv`=`xDˠ)Y۫Y8ثYFiP%QGp=ePZ* Mw*fe+]SsCf=}=C0ww(ɵbTZC+**~Kp$P5RL5?" ǃh;NF㞼c+{~Qܬ:HQ[Gk_jSӘqC?D~R0_r)yifC`φe⎿ ={RA|ؠѝVq8 'Z.;qJj Pj@]з2 Ne3sqy 4(hl'DFm~~9ƪZ0hK$){{˵{`5HJ)p-$pM~wB CIh@q:{MBCIa^ml`Tw)L,zgo5zNȪIGW0ys y}&[/9'YJgЂ{W?Q}ԡHY<lt6*.O-Y*ߊ™|/Fv+ziUJ뙉nWv3 wNWfz^ǮBʳjf2CSIUD$f0t[N-ь%*}"xK3;m/&l ,tfzv̍ ĕC< U!C(\i2kܽtPDϮriNDp\?֔=}4ٶ4$#G d'AN2kuR ׅ:`m*U`@|:-#a[zMkgh*-͔3CV(B 9nG⧄xXi-`+ȁmy m s6ݯ?Df'+#|2U0*zA5`<kìzVt\ꘜ٦x1ikYk ӂ4*Z{Z~;oP42cAmKBTm%IzbJħ.EA:&-{kR{K@,8]r{F 6@VۏRF3Kiú~_ OA)*E*4N43aJ}\Vk*)P$O@8yjIzu_ۚlQoX3ڳӨz\ H1-QB?Pe1,U 1s*H^@emAJrnZr껞,S_:ϧ@{ALy&i^~,I[§sd>er)I䌾GY[Ӽ.ZD zar H9u ~G9fG:Iqm [,^ A[Y[bIV]# ȹfzqiҏJGe/}Z@0pONu4w ' QU!LQ_69i:#{eP;߯ }^APtOAHOAP 2hk{ *WɶG oEY=Uɶ˚U=] {z| E+~mz{mdyΛwY:ǹEa(:UaϮ6>Bٚ eǟv$Z@?:3mMxyn9PM߱߱hatPx!㼿;?8Oq}?8OqB5S>yvyvyvyoEY=yvyEՊ ]q^< =_vA#Hڼ#w[XO;o(( Ej[% A4 #n䷕#J${^ZXjvD1 )hY!E8tۚ4NEK&4#Zbr|8|N4lpOs }6aЇ[۸sam}m}m}V  zf9l(q,YUe|U"h-k"̹~/lhl$87^={r> / % -ah<?&;n- N 0W?AkۆիxCT:%XTؚ{;! z,)U\MU4e!̮n?zfeI(Q֢ijvu~C?%ў],uwIQTG/6o(U)+C0 AEO\5 4dפ$?{!SR?hn{͒ށG#Vb!ZXHRGi$W%![ ;WGZSlrd}D1T) J5@-]Jrћh7tPŃni+ffU?e(Ѻu ݩGyzO9,+l5hV:6lKh>X]ۛʞ_kǰ0SWM-~ d{>{Y Z3}*diϥTpBij 69.+>U۵E-td$їkCaa%m.y QxȮ%P{(bЎbDUǨx?[G!2 9cO@D9fnGA΄D7kkc6.'rxN~0] S9n ՄRV{ GCہmH@?JD%ޗwVjG׭"/v>AVn$=\ ~¬HnIv;_Q 0*R#:+U='rCQP]@(!/J y a^+eoQ+YNheAD4cI$Ѩ Q-(e3 ev kAXLGɟǐ("頬+$1 /H9w TmGCoڀWYIcĹxL˞ΜLڪ$S:JeϹ~o鯞ic}cLZE$͍fymfmU4U!!tiFɁf<"3))oh͆-LLI.QJi&kཹaMGu[4v1 )ƥ̗)F;]fHBi.(rCD)L}IMjE<ݛ#PjqFv$ְ:鮖YSb}Y;Mp?>^$H}}ܴ3ʇh(_n2kTL~m JhP>F3?Kv8q4B*3BoCsvYܾ)wi5ővڻ62 + y1nqPnijܵLhd ;JO}ۚjctiOhk!;ӑ$Y*"&F QYPʁԬ-RjHyĤ{^ 7'eDN;,?qNВ>8NrЪ6>~|φ603vCq?.,*G0M()O0δgCT~*:yփL3u 9Nn^rŻrg~z߿~/en 6xs9Q?9lۗ_:޾/Ng9~;^|0>G endstream endobj 68 0 obj 7624 endobj 70 0 obj <> stream xpy뵓MWN^ڠcl0)ۘSS&ALM eh-Xa7X؅# ^KZI\IЏՏW7½ﻻXRDpIy3x>w}V=,'4o9;ΞMJJQnTT TT6Th7B뷝8ua!.n^w_{Eˡm^PP!QQר59N.4/rO}K{M7j@o~oz**oH_̙3DŹW\}\ԅ0ضcccp믿oLS_]8uugZv QAPyP^{5t?=۷_}ڍ%4oo}ٵkב#GΝ;tMӴ N?Q5{gKo(#⾱ˤ[ڞvqļ@1VQ|СYT+:_vkT5Ji̫ʜ\:X?4m/8qٳH^=M~fE?߿UHtųvޕsv[YLz3#_}Ut'p̙ʑʞ={PQoogT+~ꕩDWz]T$P/MZ0lwB.T*?X!.^Ξ~d_|q$;zɓʙ3(<>$W(E Ld $t>C|bʳ?<74g_9]2YGΖwMEd^9b'N8|0%@z}}+_@ܕUj:êg 4'1_E )ln0<oer0*cVUi]k_I]Ň+cf''X,"!ۿE IѣG;&>>KQ̿|lGΛ_FGޗHG{7#O>&>ke{G=>x}oף/vIlqo?³o8[,j˿wQB%9rСCE'kQJp5a2ӨD4l9;(ʙ| zbn8|dP0t< %cp^[{e>@ B}dE4G uiaa"Qvb//gD:*09+Y&3 3 f"r \&z+oCBt [Rqn;HtqQ=^xQS>x,DIEgl#gmyxr_rÇ$ T𗻌"]͞PxN2KR Q;> q 1Gc{1# υL0S!6g[i :3h5޼u!i4DrqdWɁ͚e \Ъr \&̷ H׎?~ɓ' E}(3! 'Q xe>D}?&)NdO.d)ϿuV-YQaPb=|矟&*Z n` dAfRצÉܴ$ųQ2g@ftp0_,&eV.&V5,M=30ajl=f%FB1\-#n??yƜ+&89Ѽ%`Yr,)\l`3t*ḊzlR,=p 17wsTBB ۩SΐܳgVJx xWw cE/_9RD]/`G>L}E;b㚞ةݷg7e=^ "!E1~[oM¯$~cB[|OjHh.:5=Xȑ%r/[`SM5)0E*y-mK(b5#GJ]c=z5$pΝ_}3){ޱCu^>gӧOS/TΞ?"G|7N0pM]N<~kT TT$TӧOO>?m}~plT/T/9sgմau)g Nճ!3ioY8U 2[\OPGLP>7q,YveG2RKHLSQs{z/n1T>L,=sfw\ 9CQ-^{.KQw]?/r_HMYСP9տۚs h9fObECC?بk%vl6g?bI$po foɓ?wQQQᯬkUc^XGtVURKRԔ:YJJ/ @ҿ4D:,KS+P`ԅ7w⍷߾H0ZhC\>W\y@R9=4CQϹyb; l歷H~؝wn7>{k^b?L?TV.Op."oL"Nf)e#(VO3}xi|?ԓ ~|}ڸJ<c{?|\gt.pvJx"ò${+_aQ?W`{(ff|&lS&5oJtpQ~\]Nx5%2\)^ʏД-\/Ry"$n-FıOr`˥-!2OU*1Th,GH9Ǖ Xa$YD.(} 9|?brbp)<kU D`aMM>WؒbȅL|b(;c&(FQkJ1'Қ(XZcQYn_:ED䆧`t +\T%\m ̔x~\68{6-Ba D_\2^$ zXX+3<:7td>RD&j bZR!) H S00B|H><S6Fg 3ԙ+Z&'Kʼn|n$`W`P8%(-r;K']Z5][TVE. _^+٢9&­ n5]&9 NP,vXX؜ G#82jWG7wz$Bp_8OP EH]`"))B5஠5b'ʩYBk{"uXh\z R ^í .y`L3F!uVʌp+9nd=/h1D_\VW'#Z.m?L;t?,IpQjMijDS2xPvVDłNʜ0`j[8n&HՌejXp٪Li٘Q4ecnagj)ϊ CR )|.X9k6{^ t@o ℬ tvw@үı+w]/X7TpMnl<]bӽ`Z{qcٔBEroMsӔm|YHqwѵ1e JuVSS=lN)#5VoNʜJZC4Sw -("*c^US(ο|1RD8R`,r_Ik8`rۄ:v)+wց5\CMIM;b .p:֑yU;h_h;@&Nq5\{]׉V) ^^{@ MXbΝO?m{V;TST_GAp:٦kfO8 N *@/d.HQ\Ź ng&+ʜ"2%ug}4lWgkyrP.bo -*0еm; 7,c lնfw㽛)VXj 7BSXs֖\C@qS( 2hhQ.'aooN3ߕˣAk27/X㿡ٰEqAp% ڂ&MD=v={=xpi>A Q T0+!;h&dpc<BA_ Estn|S;t?ڗ4 +Aٓ*=afܼM !sҌfJ[d6 H$[䬃tzЕXIp E,sL]bO''16CL)4d>ŗgʬ,' E ;H!&E46[MTp/4yDkd }ǰZiXS%,'\!R\zno ey">$LN5v <KL){jn]FX|?Cѵ{"(T${m{U X/%vb; Oo]qR觨~s<!gzH0޼9EW`[NQyi˭V`شkx Upy͠$:U8݋Gp.1˶K(e<'5}fN>[łSp&'EpU.券GHX9rZ+qV\IT"HbI&m%N`Y} N\Cޥl"5MtO Id<"'cRnp€FVSJ%EBUjXEeei:/kM< u^[ KҜn+"Υ󪑌͊憨+i,OxsDTR8 4r8e#/xЦBBeNURv0¡&c) 1rRQ"jU Eey"1lPWqs㘽3 gUuv ;CpL_G}0R9kaTMU5%ȨZMWU3D@au b[0/jmK}UҚpf5.gisR9W.e)s43С@@Vؽ{wW|@@Vv$yst:.1ϛw6оЄ)\WWeY: z>Š銖z٧o,xX SCYFD}牁n >ג\OՌsUm(f`3ˤ L>&w%>}q>[mvM S4ZPT8+|6LQAAon j>֟-(\EfE1treǂk5zqTaS`{(&&w;޶e.ѧDOFtOyzʚebu JXd!Q+ڦ~y%ߏ|9VT3 `=E{@ˣA; )@o̘zm >Ä|ĄDddUmù̀k"o-bS͵젙8I?@xV]01D.F2SD_ >Wui,|i?WBM-ze*Y:|{/.:Qđ(6gk{hʗa<śNٛr2bv0ؖ(vK QZnѵB=[3^2RZ)Я09'FzZVpO3~.2ia pNJ>kx6Lny` Re wAU%Q6cHX.rZ[(I!5sْ<) W/CAEIMUn{d8n*%_p+zE;zͣ @7bu]PGr[b%.em^՘v)x2NL-5+̭JR*q.:XV*8XڜPr1k3m#9MG* S&hIEad4WiieYHN 9UaJ]jiMT$JqE $QDUu듪>_)Rr6.ЍX{{YAvn >WLnxykFt9;Hl}. ;bm:5\sNv]'Zvzy /4au;w>?NZPMQ}:h_hl} SO;9 yg MXU;h_h͂k誂 YQ7܍A3YLyV|v;.'py@&N :jFgxNu8HVt\-x>N@L[Ha&Xk%qfRHy/ }XAp U+:SCrf+Hh jTXL&%H 2#hd&>V.OG[׭]bb^_tUQliFQ*4TU RwqRk_LNn.@^Ey\9$|fKO)qt #OEs78 糃$a 1>?L?B̄fgl5t\.KY)UR[d"ω,:3}/M !35^%|ՓoEQKpGѠTK;)э׷ۨ) صE: JmeO:EX0BYCa &d{Qk .-:[fTJxJSF1P(Og>263Bᥘ表0Tht!STÃOtS԰)6PCa}NxX,f.8bL97Ȭ\{% :\LQf ,ZKSYt mX\}A)D4@%J6S4 .á 9 +"B-#u`x zv,}{& $RBCI50Q:Ogy">4pL5sSKC53aCEGq31,?_-R,MѮw kOG$TYWS Bf'7է\.SdNKL)xٖpFa4,G[2g:/G$ fnjy.򬏮->j3jxU~EYtcNӔ/+Kݷ4Xo>z8:(w Xb5\9'K8ճAkܠ)]˚laN VK}e+tf -Jks0@)j|.i wAUYWx'K nuO5\}d4u}X)*KPErk nU)&Vp)t.[Dpl6DkIUMIx$2JA ɱ(m{#S+r}/Is2g9vNNŌK|}gTp7gx[]- NRǓ\W` 1%RGk Y 'ۂ>{Ղ.M؎~h&ցSU1sׂXt9;H9 Mb]UmX[q]O&)_^og`:E.e]S_Җ8l}~iR*o8sl}. ;bm:5\sNv]'Zvzy /4au;w>?NZPMQ}:h_hl} SO;9 yg MXU;h_h͂k誂L[4 ڻrT)K5*U"L 2s:SЄ)WT "iӊ..R x%xkT*E`*n4au5TQHO Cʙq\"-TQa$TrAp75az(K|KWh&F(]ܺSЄ)Zͅ(*R /u2q]3Λ@p7ωx֍h(LkB%4Xg>raǕM~:0 h5[d#safޜ0g)OG'Ap׮}Q!sҌfJ 9: :EX06 d )-AeDnX>'K1B~<<^Bեhbψ^ *\gU,R~|%.%+iVHA@WftQ]8 -OD8O#ʳ\vk.pŘ$sLoO׻yH$Jk.S4 .áMn?sY4E+ZQm@p7M`50(j$>''16C0 lz-! SL/s"bHfZg+C:' 뫭z}A'seaJy'k\!)юRXb)e/RQ[KrҦSX>'Pȭݬ\6ÑhnjpqJY \*:ec!sH["j8\bZFV5+l} S޽_˶hڡ:t(оЄ)v%vjj>С@@]):< 9]Ez ;b.^>?H|55߻oǬ}|nٺ.9]Eàw"}w}7n{ Gίܿ|9]EàLygϝ;>Uȋԉ]7\}\OUk 8uٳg_]S=y+wXp=~3g?v>TvVtA7vNNNG9)gԮZ++ܾ?>ַv:ǻNS6N̈>vt1CE&̷ti Шf #`޵6vNkSMK&ɗ^zi޽JĚ?)n)'L~{zMc7?tSﬧ3X<f妋h5.$hRA`{tG R~je(.+Xc)/ݰ0^Ub#D.[pd_-" |'WzPS*b3A,gAj&0@k<-L哉9lٜ RT8gzS{ rڮ/+ʑ\\S T"V^#` ۶m bŶO?g[ɥ?MmK;/}'zy?IeOoܛ|h}z .KSv'v 8I`9E)]fl8^p׊BeR+Pl!}v\itlaxDF -Zk [/H@o h]pr !f\]x84FT=H$`iXC30N fIF{V`B}EO17NrQ@QۅqYR Jl]oN[5%@OHXkyܐYLqDO#NW 䈭XR^b?0Q-m$n5f¦2"Oy2f' pz f*6yÙ(ac:ݏn` 0X.^8yb)4)"=S!yGKQj~Ft)P{c`=it:/|B _8x>f/,hyӁU*W-Dj޿ '!;, ,ĝ6FpfJJ&)YgpXTXy^euD|z 3G`4@YL+lEkѬŸHXF.''ѝ*!U{cЩ` wu\...Mx4IQ{h_(*`W;?8*Wyd`?yJq#j̜ x2enEjٌ*ն`ԦV~lޣ%pT1sstGjҸRBG,B N :Cq/O65iz|csہ?|CU//0̒89HWȌ+^擶YRR$e9fB~W+KVH@{2eqBU«t"_6pD1OB]oa0ϕHdT%Ԥ,U$p+G ő(sA^a59ڢ”g\knI|[p4)YM)8Dp漆{kVE2+VR2}!farxu|u].e{26 KY2kR[74j!M](UyE0w)gȗ\otV|AFD%%xpzc`=iG[{j? ?kMC>gZ38pp("[KL\-dxsRgθ5]LµxRĄǷ {sXu/BCؾz;q h}ql9v᠉DL%Bg >e]7M@@SεR9Cx1kժH0P˵5QbTt2S~*X+_-kK7H5õ.x9QN٫d>40\< j5\ iPn`# B CN8̎Fvɾ/T[]k{t[7=v~>9x;u\WҪ2iͻtT.]cu}J4P0X۷l |M@};~wo$ i|Ayud/^wl>nbq"*Mӕs_߾03kW2CǵձŻuOR >zo>x0կ~GS-btEv?3V'NmދʃJza3;iǎ&&_2R >hP,ǎs2-uV x[^*nky>U*|`}pD+׭} >fU|[uu>'*ۧÇv_8r~U_ ~)gAp=|@W0e2wysΟ?}큣OuU<+w>u}6WtA7kÿ/N:uٵ-/s著ιr>sfc'a=AekgAp=|@WQxc/xȑ|vM龲_?h}kr>I >=iAHp:$58xϔVzo>NM|غ?J1^r:*_Q&vqago཯{x<wǏ?!}ɖ=;ܶrL8@?[Y)oO{⓷QyqT_+}bF&֦HEs+ɤmη P;܎oPApm&ŊmJ϶ܓK}[=,Yf$IeOoܛ|h}z .to)?* ĘPYhvS!6 N[-L9sDC(iH\*6 糃扑̔I|.(qOQn|܌*SQӡ+&̓4 DXӇlf3#\HTT, d4( ,"ݷo~͘#@7!<:1tᓥwٿǶOd]p38 1Fgd(ωQE J px %FK 2 T#fZ,`͚Q42ŘO&hQTXC㿯=g 5oPAp/,nyyzcu/<EQS3]^8ϛwUj'Rx~o!& YY2+I.HdX##_eyx؎pm%˔ŌG| 1k7⁺ InC̒y~EګnQ2a',m*2^[]>;dNgDLu83z'Vي<@O4 Y%toE[ 4]w݅lMRW{C=J>*iՎ/aNwرO д5'^D2x/#QC5QNn\2GIEr;rpkKKڂENQuV%`+rQJ5]p=촮q/CYDZ.y 4޻gJR}Evcߤ>އ?HQq/O65iz|csہ?|aw)GS˓\)<\xN 9UaJOogDS2᥻Ad)9%,D!Vrˊcp+%rZgRJ3/)%$ίS(h >_)R KҜn+8Fw5\9)DFLM_ rs& Tx(_K}_oPAp۷oAMzr+E}q >ק {/&jj۟M+jio}+=,ĺ~7HՌeUqǗtVMS+$1Åj({sUƒPmWLd/ms}ޱ 6 [Č$MVWGgOX85{/***[; sA0ػ;/ނʀJʃJzyC;6gMނʀJҶY}000000oŋoym ^ CW>As{^ eg\{-Uo-[ץ >h.^o?{JrKWWT.\UeʎWh'Ŝ&L*XwBlG2]<,@.!Ԭ=jXt'lclIK4hZFkFp=%{z3Gr>3~v7|+ߺPo׿y.k?SsS~pc,AG>o*o Ÿ}?/KV7Ba^q#GGo׿-kH|7?G\P.S} X6 Qַn} _x׿i_PymE}ſwtd?je `@߂ "^{MӴ?P7_X7Gۻ4{o AA ~>= #מ+ˈpʗz뭯]S~?8zBgQ^.-e bFLfe^<ϿUSiU|BJn q\CZ~_|饗W/TU|wGg?OO~ǯ~念 @jsS@Yវ \y?>ޮ >)~_(PL/U?saHd忽q ypѿ5sO(6~iܗ;2aa+9ݹbs˿^/_}_2̿=zNWֹk?\M2$_r۰n7xDѥ pG?QD(!=99y3UW|{_{O T?#;] ?¿[?n~wpS2\̭j2pSRK=\)Dfp%JjkбSrʍa6dR:bȹH# eZnR$f ѥ p'>/}K(UюKs Cz)O|=z]՗&|x~>?omڟok?Dx{@I{B᪶trЃy4U ן^7!3̲wAئÕ:Ip mmRpK  __y饗o:d/^ Nӿ/ο>tKoM': n_׿|:{O|C#hr'琚$պkq#ͨr zh*MAwmYL^J_=H;<G;Jg džaDeb[xg7ܸ4.M3$OJ~^~W_E9ۮo{?'o~)iWE?/?1Q[?<#\pt~?n]l>cT=]mfKM[9Jd&F,ZB3ƚz{\u'\9եV%ǧwhJ..n3MlKsv]DWU}6y+H<|?~~8{23_>] y6 fZ៖̚a#f.}l[ΝV~d~ʶ)4m9Ub#}mDW^y孷?OF>oF^Kr[cg~qq564vvBL.-=7 <7840o~>mM|B U;Z'}/k?qp2WdsC;{NO>d.i~Q{n}4ݺu޽{us(vHSO} 8,hлs΃4Ebw~[#)ק'c6 >O-"}}{; `sPAHX(B= \"cp6(׳=.( o^Zځ(^;X4РK$vw,R%<QH۹]pvN O2 H n%1>w d [.0WDK$vw,6'Ple󛲴[&m}e4ͦ2zrI]uKN:.uĭ,ːO["hUz׈pڕe,c ֻͦuQj&kϮtNUVemE@sJum@נӹugs(OE4/`-ࡀW pBL^caWWw;t|/ #R3$|ONuw~{ufI ;\hU\gnG7&RU1x;@:#N̻Yګdiۆnf)0g>WR]C=|JW> b܎=Bz%Y-rLIo!T Zn\I>}#v?h%;  1ݪg7H:m!H xvq l7zx[ē|i8ȭC g$=4ݼ0t2itwzӜ5 4 '.Yn(zMS3s{{'n0FQ 4`KMI`j"얅2!; يMJ=ܚnNK^̨mф,ٍQS|~pj_=2k.5U}P̛'Hrg] 4 &# yuOgޒ2^u zx[v sȑbhU&_ "Q.r}\K]n2,u7>z-ܐ}٫Um䖼&q]DC\Ja:x5od{ռ%e I@ w. z@DbwB<6]YCi i09+O1E~1p{A_eW^GC"}}`1Ad.%{6 z@?fՀzƍ{wig znݺwg]<S7ξܹo/ M>p{Aݻ KS`sPA~ڑHX(B= \"c6 6 5IkamNjS7+bA5S1ԒYA ֮Ino`N*mTE:?4 R;ns-Iwoz|ڽ̫a,$.6r|˸0|TJB3ܐ(ra3$ڇZW=0d4^Ƨ0ŒZʖ%<.^lnfmɤgJ)Y7fy­ Wkkb'=Vp-"=8u|kH( ɶdJus \gNetb"L-#KQUB TXA.DYh瓕Ncdb v3SB:%jxQe,t~۴JG]JWvCd$ I&.H+]UpIVd[Ek;m8Ҟ1uȃFoUYH zMu7&2Zuyw,2Rt2]fK|ֹ) c«sgRs%]\qŀQA7:G5]n8AopښmaҴU=>5&IZMF280;hIY8襳|G8|TNh (5G}MCD)o:(aWXf$J=)ݾ\;ۈY qg^nUZ(3܋`PbbK 'q"6_J^v&[싻EL-k0IfMڶy+ezy?fnWz3J ) ,IQԪͤ.fᑎuUbÏ >#-E;R;{ZI !sUFw>l^IU˨4+pA/p9Вq 臆B:/U+Ɋ=vpFf베<*p8A+`k61xz?htdvkv'.:-:K^vdax3-8KhR.K2.s:J Ll\s߰FO<ɗF{,=I{:ʡ68Դ*Klɝ.?u39 Z;Z2HC+th Mr[⤰Dz$V-2ciV.2qmr1ѩ{z Jj$c94%82,]Se,\}dR1ZF)^K.D$\{xR ʲJYSS>Hp=#Z3I $L! QƊ۴DUBk VnY8WeYά<0Р$\Wy-@F%#MPnGȲL)7 X`!3*S6L0Uq/l@xKԹR#)>se:y.e/ MLNQegM&zH8n>p GAGXq_Ow)ͽ3=2Upu!.?^Bm֞e>M9aW _ R,wE6^jKN!1.^il)͜)^q ŧz}ͨr tφh2p.[Ԑ)&*⩦xhYG]>c&-iP194h5C? {)׌e]+7 S w:S,ҩzdA|hD"ZhCU㡁lF:oRd#Xʇy$pZޱZ X;Rw`5n} @@@@@@@@@@@@@@Rbϸ `anƏKzƍ{wig)@tPܺu޽{us(vHSO} 8`NBΝ;^Q]j䄽/<5kVOYb~cp|J=(}ϒ7q?o{2&i S“~[hJȽO#EŬ*4>%7n> I7(m\!ՓG7;hDyfQMEp k1LZ.^nC+rYTrs=s{z[ltC"R_ k~ z5]7z[xZ'3tR6GK3tS/!?-\HEmNaڪ3wZδ$1f oL],OWa2ңIӷjMm7TA`| +nJϟ'n>w($NeF)^/?I9ol9h^ -y[o̤ Y]̐>z-7 3Hi@ᲀ|Yn+|cdboەe& :$&[ *A tJPiz z1[|&ITnD̙j%46SlF18F1K1X|8&T_VUk,&N9GR;e A,sYRL]7ݺ a!2͹fpǔQ!]V=G;d`Ee}|vs"87* 'V{J8K!%݉hVy̡ [:9vU2ܷv[MYw*Sp-e+ۢE! f(>¥ ?( c:e_2|&+P2.!d3>lҁ&䭸pA) 1o,<:txcm۸HK|{SgW>(T(UDW]}W>Un&2r 8N(x&=OKYGw/m1P[ KW)V6ҁ"iwzoy<ݰ SœvdЪ$9p. 8S;CYc* վRU"#XJcQBnn-tpr/3pҕ-Qܡa<4f4R5Apjyסk]ФfmQfEHVma[Dηve*69MpK4nFd MCoB+ ;'l zEN*ΰRɳӽyPF ۲\krxGƌ?n3lЏ Opy.KSgwcNnoy-$_Ʃn~&M"PFݩ$eރbRYеÁv$?XZnpIz>;Ո;0)K{y4ѺԥjsbX&^7o+(ҙu${ζ@^'.,2-EZ1^ma\0qZn tFx"q<_Mo˾N~dllp27UPc>E&4v2)ÒC\7ji\#JWqU 87g;l7<5 ux'L~B!Y^Jn#\'dOC])SvvtP W82\ˋE~qed(s .̨{2]S~5ýȻ!{lr:zMܪ <$ڇyw(ǝoe=H IK&rc!\q&0ZYշ: pf#V#}GUz9w2yFDkedhv/z&`h&:T:^ZvsJ*E.;[ <ߥMuۨ 7`מfUaaOg2 F@څ ?:h训-#=/9rVEto> {d&l1c7!@΀r<']:IO8K@H < M]#'|P66I7~ cq7Н(զohZ_9#O^0Ce"{"h<|^a`G^6h 7O' L|95pb ;p=+9utlLSʦ4_BtpƯ,)|k_Uʒ(52wxN[itS;䔲ƊNu8]iHpUwR.Z ormaWAU3osɶX5*ưdV ~!ւOս>O$eu$ĕ{kNc: Y9iCs^+y92gDd] HmsY :WM6zeê[z):wMᎩ <^>@ErɔOh;J8r}S[ֵr3>+{[i^Q,*P Z82L#Yt1;C(sTFCci>phY՟=\${-Η=h#M4+]{ȏ|^ /h0n ;$6rW9k+/uSq./w&[x^v#_ ;a!ogAl.6XfbqמL(C@]@py/pɰc/o{;2Zm)%ּ!OS[=kI8v+4@dîќ''V9O͎ ӖgYuBtnԹ:LҔfWnҔ~KS%.PLH7”mem C=?&ols[vǡ \5y<—q"rс"x KK}#\_z!AK$vw, /w}wwQ<퐦H_@q= @ŋ/(+:i4E_  s)g | 7v % @SO=uƍ=W;i4E_ :(nݺu޽ϺyO;)ק>n}0!AqΝ|{1ig)@tPܽ{w~i ~l>!A?H$vw, /@DbwBl>!AMeZ%0^{=@67NJ7j@f!V.2'HG|q S0$~$ܿ(nR SQS$e%0ju;y \%=8ł${UI4z%I*bٰO/\P]/!?==ǔ×.IYO^Z0蠈ZR.K@d+Vkfs_nەe'nmgNz\lN:.%mgsN+ܜo[^a%.eFhU+FoUYdǮJ~u;ͭqi:ltiʼ؄[cnE':vr*kЋܺVXAEfp}ρ)5OOKbIteKw, /Ы5 ll~Kю&CI7Q[p+xL]nBar^?# 4Ki )ցS~>4BOz%E=6V‡MT ^MfV>(T}s;6W9dq1~-n@DbwB!`0Z> UIR, zQUi呛 ]FK5R+Dha­\B cR:zM?"Rvw D bm؄K-вGE6 v8Ў6(% m_FA.ݱP| "^c]K a8QeYg8^PuA¥jAA^ %@z0*VA7պ]ebrΊhvDžpvOñ,u9˭(Z \"c!IZݙ+j.wJ~ ) L45pݷyd6cؒ|[Bx>e躮h;aXG~q@BCj&G[|#nd+Ehvd{;Ƿz:~ZzULB]\;CZ;w)n-V J;15q"W;j]JR$'~1@=>-0|ǟ{*eKNG e'|0T'\#\dU.|f-ېC)auޡ碭;t4>V//0zvdH UmF!kf->yz ł iG"cp6F4%J0: 4+-~Mf$7x\ Lќ\[AK$vw, /@DbwBl>!AK$vw, /@DbwBl>!Aqwy;|wig)@tP⋲,ʫ(vHSO} 8`NBXA2{ƽP7@ >(pc7~\@tP!AK$vw, /kp^{=p6䂬 q cj`޿iNJ/*G+G54K;uw{q6NJWhQR}Q惟A"\Cj2Tضb^"@斲0I 4 *SP qvUŵz=֑Oɸ1uZxa_e=n11M䏃 g7XcJJk}ԐjAwݥFSr?_GjՙxsͳvVf!"@1L%R+0iٺDz½67 4p>䳏!2Lm/OA.ɸ1x!~GRPgNH4{ Lo )OHe0_X&7Z'Ï($mXWOYmY{w)})~U15-:ꥱ_ {=@m<׽fY6Lln,t~DC+6rszp-e;tZ)RRB薤N%oIQ;,u'rkIK;EW)[SƢ&neɓ,y"G'^}|-o6Ir}-7ZI'+GYn[KN%u%]TqR,uSUEN[P}~w$>8X:ׇJ58jWY~Lj5or!T]vG~;喊Nl)I3IN5od=@F%$ Yv|, '/1̚UqZ6oy` h-6nvtJQпItܭ$Qiܖ9#^(l+ʞcIɨn횸#b#ub2Q%ŮA'\%l]G6;^,Cp 2EatAp-uXK{?SzE5m<n'n+%t-t85d<:ڕD/WI߶7SL vdЪ$90Yt)!)_ kJr#IFf_Tfp5K{=z{4lW>(T܎UנU n_9:߃B"^;WpS|%U?S^IQ8[aZ=T>@t6hGJ/2`rE)hWQ9UI7 m}H{E.!i] sSzɶTUm/{>_v-~isT{zMj^1A5nj(|J fwO5̈́8Cv#FwP,0g ٌA;sIH$,n+S'<Pez:%|YQ~x+?CY/!tm;b ]wJnvJ]ՒKBq;{KEpiTA?28.Ama.:H֑,u:Bd2Xu3~<E/)G c7" P&UѰ7ѐ5\1Mߌ;nб= vԵ.[iJ2 DZ2lKt˓I.f];hGR{Dv9[B׈T]ݝv&LyJ:ʡ68Դ*2K/ -вYKy}錢 p15i*oD >I5lN(YMz5^?F;=P"M ox;"۹ˏh%\#H Tn&vDCJc#w=r0zI 1~7`= _91{2 U^FMA2Y?w Bp%e:{xY^P-)zϐR.V% 7Oֲ7E4QAe20kmg[.VRy!dOʿh惀5 8&DQ0γ=V),Y9˭VD]n蠏{Q|mQ9+mb~QN#HYy)kpdNMP.$)* R0mνDE}&i!|5ixNRoƱr;F$P2"M 5F"4cS٣Սfjn.\+8鞦BK|`LT'y@ȼY8IcK1ܭvf]pE_`=*iD5<5TvʠD Ku65 G5U7j"*8>3ٌ<82tJ%Jm%iE*hrT_=&a-(GNcS.Z޲&ި6zȆ]{$n'6pFY?Np'nF4Sʪg0=*T9\0-Al}S6 :W'eu$Vpq4C@]e Oaa2Yoe]okFMjTG{Htp[1/½675-$F/)#ȭ5w1n+Hr/,{Ky{Ǒ{PYU›IG4qclaωrH&b)-ܒW,Wٵ&$QusN=C.i#MN O-F;eчrvի k*H_~ٻ2dI„KZh#\S ʿ!> \wjdWp聓>ȿM#O.c0b,j?`E-G BwDS:AXꮷ?\;n=m5mRe.z_ZSCzh~)e*4cr[Gpf-zmYY މ̚a<ԯTǦ>6#ì?Li> Qm yEET9VXuӨ+[7]RBAw#-aN"i3y- nY0U;! Tx@S~۪Mqg#Ǩ|r~#yNtqdC:(ු\Svcj`޿iNJ|0[A/'%+4T} dM@Ui_tPא }gJ1> {E!I6j܊\)n11MdV:#.gLD߿z]s*^.v}Ci}]2;RϗDr="gZ/ZYY\3(X1ˊ,tP9Z2z)r K jAw ubki^ka'{qwQ _[+l0LB oO_>X錸1x!vG\wl}~yBn2* i拶;w񜹹oX~1NQI4[2@H7x3mj 1zGA'\lQsrY^ @reiVΙSVGW&K\c>o%.eWkfDr՞RnWIuκ;7YfnyD)䨙_JWv"kv%ԡUF|2 [v6I}o%>p.[;7ɳNv,l)I5.?Pon1Ln಩v<BV U\nCޘua,TLu7vNT_,{ٕΉ8)wFoT~•:e_{=@muqLV6E@k޶!3N;( YrEoLNu3z.u\$iKwh ʮ}M'i|:|+)AOř.hmHtCWAc*dq1~-C L#5Mt-~kv-E;RxVh=ըK7Ud ރb^vuuXKϧSJ?LZҕAښۉLM,RAUm~9[[(" pVn&0 m}H{E.!i] sSzUɶTUm/{Ն(#pk6y) B<:~6&y++$I6nw+&FA9Ln 6lC6UL)$J{oJUmrn@BeҍwE|K(ln_9>v|+FLfI]#1%~tcGoN̓^ 8}ZJ]a4ձ֓b17RE꽥"@4ՠ~pl^8"K|l[wV /H]NVx+#˗ے(8AnQ]SJNxQZZHֻbjqK^;SFC]3'R\\(PӪ 4QY6L>OYWH#rϪJdq8x`DlkHj 9NoI=aD +x)қE\%:"5Gq{I2'w F62h8]+":;}Ԙ>E)3XuDy,n 5Rvj[E6s#7*N{s#p h+vD(_oN;^x!bLbX<'uuBz8=xz#,|s )ǡ9L]A'\I@x/^!@! G Ki6V>̻qIr v#2Gőyhr2RvSbXɎUFc"ikn{AJR9]Mx*._5i â)4FlXuK(GNcS.Z -kxBFpڣ|$L#I9p#m,a w7E4,}L1)<,Ƒs+pǾVCp9 %Mr4b씲 u>Ewz({ģWeGAM#_75ʍb vʍ=tO-;3pdc8_{=@m[YoJ]~[clJdM(gQwݕL(:_|ٝd3Iꬸ:;hKVt(@T 2o}Q6>Դo-eXT|d}fu >e7DaR]~ y=d nJV[Ewx]/V|ݠ*H#eȒr9 ha申 rtF~%)SU&y'ت%H ',5kew%\I`[J]Q{46g;!FNrpǭmޚ6opr]'m[riM pI82KS1_#@ۖ`_ 6k^tօ47LAЏLslxXj M==fBW,+YHRTsY[7Z*d@1ƘM<ƑnDGm@ Fї2oDzgespZ䩙n&|w?pa[45}7/'>"g89OAczWAL=q)|s)XPB` \"h6o/@d!K SplGwn䟳O-s=p"Hf3ˌkE^R,m{R-m+|9{=@mn)ޖ3`,D! Iny+D6\S'?Q%JiOcW0JK>B΋m{?QKQG}9+zx$%3~?"D ɷDUUEVTݹuu݁50\9cJ9'"%R y>-[zܔ7϶eY.u\!&?( W$: i¸7O/\Tɶ~|a(U$­ʤ3!hUjx=~ywv6RN-tKR'ܛw@'T܆ r3whϮtN^񛍢@ܖOYJ:YilӕmEs$oN.~Boe!wKyaGpQLé>lE.rȎ4^-*+v&e> ]m mX5EAM.neYn%>tڃqEzsDiph;KWiJ(Kn+Z4NY^:͏Fzڜo]1K~!9aSg9-E;R{xʍ3y>%t!1 ^LkU.L0$^9u1ZW,4]-ta8v{:V>(Tpڰ;gwxZzܔl"Q6NRڙtmg;b ]gIx*aKAqO*;,7C~lKUUƼ]:Ĭ" ֆADG*LeaiҒ)e]7X@|+PР/eP)}9+ 4RT6N&ݐ%hµ9UI7 wIuVؑBy塃"H@z2mlZ8wK)TWtRY:&%Snn~TZ,@;ʨUY6T xMDc#Tɳ8tCmpiU<#C=&y΄ćLpoK7xGR:̀}s_]60d];hG^ʣi8`FR²Z% Fvi&,8M; 8*v )Iuӎ[iܪ |)#E&)X#ӟL:/u̡(]Jp's4׃Y gAjmg2c:(&R;yƥBpqʴU`{:=AQ$pV:JY^<Og yTag%)bPi9xddgyٻMṂ^p݄ W- 3Xn51 5RsC 7kd :7zBxFbq!ostn DvĴxLkFsΊ4yY.+rYVpu;( jpĠ~MF9{bׂQiң^K&7 $ʖx'Fst#֖9DK j=\MpU[@Y  q9VT-'YWptҥ)N@}n3\bEr2ihRo&)31eIymnUDn8.6ʾs9?t* IVBu+<~` ࠃr9#}AEp-m#t od[)WqڡZs9Lj/~6%{Rb jszJYħ-L\;Zs_3j(D# fd3im[_wYZdxA6dR.1h AC3eW^(0Yx)hn/<PW ѝ9-۲qW|#e-(:YO7QÙ4^ HK6湢>yMͩo.:hV&.UtyLyy Q>NVGú}Vf'xcR\ Y&~qT/]Q;YxT-Ǫt);<|p@D}wd]V_?2?oIeqA߾9|^,F;?hOh<0vRO]TUpbIp}soĪxssMv"v-wd0gE$8Z<62yr0دˋ5޵ϣOk^e^K()1˳UR˹4ٌ 4O,h/BdzyACvk4.7q"eU, 'JH9\ )'%Mwyo9Gp{龇mnc5]p\+Tqk/\]3i)U8/r웦vxTlL}̗I>N x2Ul7_ҕ!% i '.Ul7_pRR;^|\a8)@p)`s 0_|uxļur9%/pR޲fG[[i>!SB+|.qpUl7@` 7|&B7o޼}r $-xTG܃l7w>~fHX<񨎬 !؜oB>|/Ț{&>|xxx=  /H|w^Վ ؜oBC\gM|w8 \CϷ?esdp??_ 3XWarOwdBT ; k3bh:'O.$x-".ϫ-=+^? j[ѡ}6؞P:՞˶6\ ։|\S _\b ȝL:>ŗ85::j>1AHnl[dnZȬѿw|nrd> |oROf!$@{j<.)p Wv넢3uTNSeH+^GC4@Ʃ.eS= ]`dmWY*3ZYQgYM3iN]xP" Ɣ~C~.x0Y̊lFv7藣^IMlVO?49BR4W,/)4P4=oІTlŸqEcG[ΤM[wqf'iwho&tjN=[鮧c@]V="KnY jf \|yiNw$.3|EpzNN+xl)ӥxhGy>YEUQjjs;@x޽d#aU1& zO;娦_+:[ABdRC2#aX$I]-W ы˱&aa*[V@ج g4eD7AINܕu-҂rkNbRg|+""#!Srϫȼ+MEz7O(`Q7*Q)hja0بY^['qݩrz!t |})p xez/zf ;¯idq V&mj֌$T'[k4g޶HVR2?˚*S+ZQA9f˖w-h/K1>ӝ;lȻu&l:#$׼xߗ ;˸+HIcuc7[ j:EU+jyFv= Y?C-f䎊n8P+vU[}BS [ՕiLO9V\fv+~_ U#*"96a3ᮅ\*IdUۻѤ٥Q^^ZM.EAÍVa\ye0͂Y#mCvբcDMɽ4;YZx{bmҷke!5ױܵ8p:*e%_-6{ Wsr9W.dH4 g4D*_]ܒ7K#otެw2 ΰMpKIG?3"!u*!Hapskv4;{wcJ%۵ ;*4biy9W+u)NpͅȮ+_ج -VO")[-z=AK̂ȼMl"\yBb7~E>VUl Inqo] &3Bad"J\g"dN8,JgGR+Mת|lxM'x4b׎u9%AQA\Mݦ3ՂᢎՇuoraurv flp˓mS.9\c@˒u]]Qg}p&^9ǂЪf 0|׫6'4XUc'.pyٓG] mu毮]4X!Nsj_ep kA[}sLyZ5f \'.3l\Z,ak>9=Ȱ ɶWWa!MOn~~I~k-.Kc~2,E] )r3i9ܒEN)"TǤagzkP<ĪrkdE//k8up z .B[ V` ǂ7{JHYUIK كAC_c1p܄<)j۵8g؝ b /wGzuP="!e %.37M=yˇ||k-% Z\JFKpVM[ț\r*ӌ?pzZiϬ#]'Zt\mg{/ܹ8 z#M} ؜oBC\gM|w8n26п˗/no@RiGudM=|w޲6g 4hxƣ:&`s K~UM_ %jп͛7o߾܀IŦA3Ց5 M}ݻ?-#g<#kA6пÇ>}' xƣ:&`s MS3"M}vpxc26п@pA9߄݇ 6QsOҰn6!9Ap7 mۧ=SC 3Z]2F޳@YA<o؄>pd0g1ʝ:E!m<"$@;=FS@pu"YrI1*STbz9[Mn=%MU-W$1o'"s=<.idL{vWzԳ*p:ZVsDj'fLk#WQ$jdܥvE.B/e40!.3&͙ZneK~Ws²5+kb"r=2%wvU,׏z{!7nɵu|st"z:2.X3%,|,ܜ]mkRʨ2\n僿hZm_=16*D b~`\wiz!_t keD\gMCSI3Em n'c <;dM #hRMT e+Qv,<4)52˝kgz;ޙ=Y쀨^{=\˿&Ўh\NGgZԴ"9p8CDҐ{I>ʹ k"s(HZ&*VxlkeD\gMCK|OM%NRE:&g2B? {}VRqjתWcCQ+\L*#cmƱY;:ʥ]+sو*4w%:WM\gMCG7K"sWQrME}STC,FM8p=uں*9JtEpiYhM:Τ[n8n24??>%$LF7/̑ɳTdSCM ET|רrxT>Z7rz^s\e*ɦu9"8/`{,;Eo2pA\gMwy®+s\~=𚮋{ /;s\>NS@paI?'<3ߤ@pasw|=2o^ȗѿI#.3&`s Ap7M}˗_77 4hxƣ:&`s ߿oYO3Tlx> stream x}}M+Lvn}e6V;ef}ږ3kmHC42 1mr*fRZNӭiWb `[%آ-R rNcx\jWZgvxy<t```````;lk ;+8;&gb>8~Ŗ\"y/&}&zݩk]hgQ^ʗHvܺ4n¹,:SNB.${)vܶ:ۥ3+[r ׳v;nHvZg r){Y:cy3y`[ yM7okNل.B箘O>N^7ztObu氮e7͝<|B])I|ˑ=]Op: LNԷ\H^ Ydg1!7ng5e4ݮ{{𞅖XO&sw):ɧ{~Q/v#Gϫ맏Sco׽'6MXhnx:hʷ72{gSV)3=ekE}ɮ=aYSzld}aHČMk s5hK<߽g asCXZf2޲r}D/Y]v<{yy䥂s;|[(+V?5c^{ |{ !Xg7r2/&}f =G6˸sgȋ&щcG_JܧKT𔩏EqO2ey< y6{bM<Π]Ggۛ{&qeʴջ[x쎩7yo{Troڌ}:}32r?MixLO^2;%}-U_0TĕYOm>5뾎y~v}cN 3Sz_yZ=ɫy 1ivK$@t;^q-n|փghr> \d͕&7G"w_gI[n}pn2p%{];KQSlߵNyNӟ?^>{⧲k//;_Xk'n1vM7>^[}k쵈~">hp6{p_߫٢ :߻R% 8;}t=]7[}pޕ](-Fn65?~c$nɯ}Vt}]//GKXgS˫iz#8PWq6:͞4eO [)1wta[8ΝgϠK[[γJҖup=Iβ]Ιˋ`h&vWq``````````````׆#r{4j ; 2!'(_@0ʬܞ`|CMeeU3W3-.]FPwK_~epyݨԮXH쭵6:`utJ:}fXSl-sl)";\Wf(jV8R1^G~!E*5{dm^Z`xY`)tK{=y+Q(is"T'?phZ&pMPxTY:W(@)Ub}TWr~ UbK.ĸy5`ɫ5W* ^)vT( < Y 1xeܦ 5jp11F}YC%l4RuCQY+֣ !ꑮ&$)[gQ!z[fUH<=R SCv>Z5jWU]e,;Hgv,jp8ge)^6e%Fiɍ$H0?f+ybbtWs KZg]vɔ'*LTJ簗^R3#3z5Ԙ<#KJܻJ^QP:~čW:r^j'K񙖌+ܜlPA)4ezC~d/26?thkge%תHVĂeqr^"M3:^wa;q.1+&Ay@^р2H}ND۶h٨D+˫fzOeՍ_zߵԝ_Ķ)ۋ/ ;+v@^G]CȨm;[N isHm. Ub޾EӽԦn+ؑ-ƝW9 Qf5v5bIYx)Ѯ-r+:EeK^ݞ"j+#yDr7_CCRXcV^ЦR3#3hvCR#)EUJ)*\͌;ozyIbi'ԑr2xD@^GFnEkH:37\b߳sc+%)Vtz (V逵] .S ?MyN ޑ']K^f 8Qf-M UeVDUXE) lQ!ol#ZrxhFՐ /vAeVCnO0P؁aY =@` 우{r{4j ; 2!'(_@0ʬܞ`| (z vR-. +]yW+(r^W dv`|4$deȷ^92WcSYiWQaҸ}XH쭵ƟLuY=*B='4++(*0g}D:L͒hZj{zNsRavEDiR̊_$hvYR֝p3[ub=v~UF5bQ>t#K+).ߒl ('mKZ\GQG -nPVcuY=^3v|尯TOtZD=P뭺% ^>Z^DC$63~r\UuB{4 4$1e[aTq1ד<@P1F9,R/uvͅ'(72`yi ?lWd5jHf=\'/cOl%2ن TqC[܉/m7;XyeV빭eq 1;yxvV3逯Xh|w^qe?Ԥ"@35_Zo`G6Z Ҩ+ =)C%uzfΗ=?XʊM^Kt s`76)-e/TPKgÖҗMW$Noyj} `<@MUWg CMfP /$QXAwtDѓI%2<`*Ww;boo.BCbUi1(}"^yݭ pV16G˸ÅyeVo [.W9 JHR΢R#[ >I]҃R!^ˢP.\zPutKr= _3d]SE{Q聩x|)- hse NwF֤d C"ejgvLwu#} 6 H¡-nƫ+!J+^TeY<<`Ti5Weq8ֳbqm6fJVuգJ(&QhfKsv#e VI7-MW`j8ɫ4*i/beWCcVV fQTwYvI&@^G &Y(16qtdv,Bj^/>&d;l)3[ @h&9i7-S״ J3Lگ{Ez~.[ƕgA +dlz^Bɶ;9dqJАcȲs<G-ϗJsliГW,O"n2]2k Gײn.cVƶ=6i;qJBpmpi/7[]n6"LחJk2{IXIyݗ?3UR \M2qn5QEcK1ZcrWȚqkFN9[m_ϽD+ZN ia3yaǍ>[}MO~ݡ00UIm*"qi5qO7 &:˴ѧ&BF-3z\ڏ`8Gr4FшqѠ^qE(6(%GК j.vE5ؒfUo&li0tP^z5[ewFqfʢD "]/ΗjjuYmYr <"('K_<~-লD-d5\qDE?':"O]í'8zV\Taǔ#Eyz]LKrGW?/o6Rc׊;WT 0h l> -y,-Kg"+UZGUr"F7'<9,Of8[B)1kjtOmл{#y%yeVwIY-R"pJGKd)>Ӓ>9QQ6`zC2B|;'KL2Žy5Y c+_}n`e$)ױit/Hx`P{C~>ی$ejrN}ŽqX6]˖upiK=Ct5U3lN7ڸ1פC*ӯU3S/ΗU<`xFyF-@ǻCѹn[zӆׯⴷ{36X?y ωz_z"͞sFӸhfx}#Ϻ\)n乯ʣ /Ԣ.=C-_+aCU)9@^U ƍ֛MtD4YS-RHwDA ;wMvXB!|b\Vl -jU53*>4ʊ:ڱ4zGБkڪP)Z g?Re'~0l,5ܸ0z3 @O4 dq.z72=X9`,H$X)0?_6v.kL#(:,KU}PՖF)|<ڕWPׄDrd*|y%x\ڏr۔WVn^5a+{eHY(`}.F9[^GU2e־{@d{+$+5-`eʫ*`kζdħ eיqW+UӐGu >EM)&Ŭ}ݓW%3c=ap WU$I`PudY]ik#mJaS4?&I2kh++Ij%|5QcwReZ&kV UR89b+8VF"FeS^(X{IG:RVhO^~pCyX,VZ*}fҋW՚d"NY ػ˺$s╘>\㰡!F簏S 52"]ZQ_1TMIu5p-.zgJޫRtzI%1}pW)kzt2M̽4zN(V$dusytUԂ6!'(_{[M7fL؋!@;@䦸^xM$:R^3c/d 'xwRk&El|`rS:tQ_mJ / @n ("0L(P0)@^4`BM1D^Uӑʫ u5 P.| ėFO-ϵ6)U՞FFf ciAZ\}RGF("c˗cP?k,jnm,ERK\{rЩMXWEST£J:"9uQL%y JrzFifrmKg=E8uWԒ4nvy; #ѽk*,ZeFqW z!fIky 3 ;)6FhBuCO 6dn=wŁtjGkEdPJ.1fKqWsF|j|~p=@Mn&4U;v"_KѾrw n|j*N{bT$7gK^phrxZQc=ފnT@bcI:ˁvyK4)= pQkt+ Izُ+Le2|c2jMK0L׳]NMgD*0ڜr7b=U2bk7e[|JWv5ohOP1NW`/]I!Tl4͔pFT=FBU`b.-oWIt15{Mْ5~E]wdmK5;`6).7ˢ\Z@ZOJm9LZ2`ƁgT:f ǫ*(16qzB(=llQMyN`].^pHid{Q>uږjHŝ^db =49 rSciW 5 gӛbcKW.3Qڒծ2ӝ]lߨ&?֌M!`Bx^(lv~KVxvȵO6⠤5W.-@uX>kH,h8!۳ޣ+0*Mav-JQa2ڪF7:#ѽk&'k4J Utu%KuUHE/'fmNis$.vSrt^Z;D^D~% .ċ@WvX*:Z@>evw rSV8TCekE5$a`jO c3tU⡷TlWp[4lFI+b[f;b, qptq0T7ix1-#viCO(kfkwqS!&Դ|5|yuxvqb[bZ$(G)d(š$T|ȓ-21Q&`dbWke cilWl>S4Z;L,/`qyJyڬT`)'&zFЯd7XAy5\b2mJyEuTq jr˫<8AOJN0:+9Fo޽zi&Ѭԡ{8Wi^xEӾ?fL؋!(HO C)E5?"p 8 :tQ_mJ8G4g@=W`45 Fo%ETiE u5M[9JZ\ZXa'Cy2ES!uLz B''4瑆 :/1 [K Y 1d[lQ4FG#!! gC>y-(+]2ZؙfɫTqXAj_6z=R-`mj \3ڸsx݉]&*h)J ˫5!ig;L Uv&Y7i6j94(@ iʱ4jL͔Xj.ZCu nM{6jEHr"l񨏸jko+_rס'._cwz^{=/ׅbtc&aFh_<=uy !]^۵(EhӸI )ՐnycMU 91y:P$3C%u Ƒ0ym=/ \ z(uu1W%fŒˈZ(@ if+jFBekE UHT?zc\ bɒ$p[]Hٗ|-k!yI^]B5OCRcw,e*qYth`k3Bk!@ {DXn<9EI|;'KL2{UcjX{*x[-UyV ِFoWk'g(j[xFqzc׀1^rٹXg񸧚Jf EU\g NQit#Ylgثsd}fph@WɖX1J8@ i6jSG:~b cihYJѶ(}[#Y m6'np"1e־ESYDŞlhQN8 7Դk5c_2 li@^Դk5ǷVH W5yFSi@^4g@C$:R^3c/ ?DRRk&E@^po  pog56aHWطǘm {8WE_ᇥ/~q塇z7z{ۢLu%ՕL؋!(ry}Svx^-s;W2c/ 5zzk?3gΟ?aG~GCnJ]䏽+-//G?:y;=W[z?t?O`;R}{ʿ!vŒ?"p 8 }a̙X ot~|^ZǿͩߵgM~veF` 8d2_;u;;j˼^x£??op_·A}?p@^qHMS92MJKYZQ5=zW_mۧwԼO{o3}om?ODc8 >vyuk;[)yE19}+(}z<ĉm^;=?|ޣh?T>B!'z?ܻGn~;_|m[Os~0OrJ*TC96u㫋@|u똇*,xw JPK{JHy:XI &2Wb3ɣO^YEzرzy 7Ny-/ 5LE P{uc/=y''zr_x3hWT\OVk?o:p*~輝Sү&Kop߼鯜8})kS^u!۵L"hZk*9_I#lW(/60~ܚ)qd'__}U$'O{J"*OxN򲜭i{ 6#KJiˬHyUe$N-24q/RڽWMqPodiVf%T '7;vqo Eޝߴ6G?/96#g-XQ¿gמ%z=$=k2hu"Omd&ߒ]v#A:Uq -(4m]cPH6Գ&>yH^xӧOK6{Q+ߑ7m~78J?}W/u~_8~]~o'gڧ۟EEKr^w'.q8h/r{i š󝊲ScH6Г3g^SN;w=st2>u=>~Iu~wࣈ>݋6PT&0;CEQDڪ(={C/>Q9r}unN@qb{8˫,&Zb~'0vz޿s?5wq>w>K؋!\\^&^ӟ[3=>}fQ++CyQ5zugo/((&(>(VW2c/ lξ]䃁>m(#HxH endstream endobj 72 0 obj 15878 endobj 74 0 obj <> stream xˮeϯD= : TϮ [Ԏ55@62"$Q|"3_GS9?7???~?-?,GG ?_͚뿯(gѾ~=~?}㏿*GտS?,;68X6lhL;06f>! $ Q36Z6+9Μ%hUƍV5Vڿp "WA/味kA⪣O()&KJXgԐp,͜ %geTwmᶟ/Ҙ$J1}ITKúȿToҘ*J##V=""B+HMĪקX3V9Na^tSp7@ ІbNHer;frK:nhx@37HYngP|y*by%>.t%3: o8m5kx ]P䲂Z@x;eP*sJ-0j)/9bA-(%҈S׀<9@f=cŏˉ]mG|:p]tasE3 9 ZOrQkX\ogt/hb=shAOr>w 3GM%tyPIZXQ@J")AN-:O|z/Z{@ f nG@1FƸח%E򙗜f":.Dj#8 ](Zta,9?c3!-azDQ7:/ЊK.YR\}:M1snhl"USݐCP{0k \fC(RC!gvT+*~cmMRA3necrŀY(i1^ ņbRYW,dրNihwZhGI;VQ/1Pa-\l5}962VrZ@Grѡ ZrLc8`7ݴvF/R"vr+m]tysűqPʅ3ά ׌")Z-5aw\t(G2ӛ'/Sr<#%'tקC)բy8o0\Zh?VLΠKj46ӔP+Ɂw3EYDG-10 ]$JWrW춆V/e=!^S 8!0b %9B/:0]^8䰏lF::JW5Ds@̹",nkKaԎjhtjd#A7}+h7<J+UyƀO͹ -8ٙQ}Eޞ5ob7#gTnPNUh5 qv!K]EWoE%V9!(KuqG:FϺ:ЖȆU;g])DžN#%ƣ8& :u-pJK1wwY#rW=@3r@ j\B9o ~R{|wʟec܋~e?@ʟ0-]3-XQHE l*D_d+J͜BC릁8RAhlsl>c1ϩok}}!=P2ZƣaGtp|ݓt(ZmS9t\ SZTc͐@#%fy2P̑-Tz@y=ʭS뎌t/ƠiaA[/~%)6Kt1cl6n2ﲂEA bD2_xtq.Rt3i3iFWs EЎp]HE xѬ.V OIu_ζ#Xdg }uJjq91%^}ut9qg>m%P,\0.Z2 _m[m8 Ndi~V64# {P|BUӋiUS~}v7Hɓ8(usFEr/֬w[R }پr%ZmѐGU3XEY JE 󖽯$.m3(jE gI0ou PsERE٠Ovoz极 szQf&]Dψlio[=dGo.[0-Z6o/+[#ɎGĈn00TZ9-*86.~ )숨IrA8S ъtVM9w/av%lϰ wtQa卪-ݶ\7eg$U7 .V'N @).eJ*~cuEA JAGN hk™n|ros=oRۼt)X r D3;҄DƆ"m)u;_(5Er`Mʫy3[&f_^LYBm*R5EܢA(78=hQQs.[y)k5{BP.g;rnQ^ crRfN!ggm3K$Qc|g<7tWHGXY*r]_CJm\$#t弢BWIJԡt8ƧELoX {DR2UB5+z }] :@ځkr7Nƥ"&lݟ䍞'gN]ϻtGџ¹vьXbg,yxFXy3zup ɫhj5<\dS#bE79 %"MtjɄz|הQ8<g|H͛qnǒ\/StRSVX : uzPA{$[Fn_fʙ7WrD"(-IbA¯7Z+RW;m^ xD;&0r{{v0~hp_Ae6bˤW$oP63ӾA`|FCRnXQ(!8'm3ܠ/=ǚ^螤UM@B#)YvQnRA[k}?[V%;RЌPJIy)%V# WޚHi،UIُ@noyIzqz͖/R>{TfO7|{|;#n,r#3r5hTHh .ǺW輞ckzsI35 lBA[G#[.epBw/"ܠ\%8^XO[ X.Y*L5ce_U<}Ê=y@F1y?;gň·/dxpƌt=6nnj͒+^ykԄz݂2-[+J=jtA3W)%\4a*L Sژz J+@i$iybL~FC? -%- Q葮tPq,3ƽA/fj-24p{*+j …9)g/7(zІ It攺ċ咑zeㄒV'˪=\|$G71J)~0.N cy"N9ywГ x~@,5g!56Rۨ P36>csRe%3Cl%^4̈g(MVlŒHŏƁbwa_0z-̓0㴭Ƅw>gw}l_(Y~`t}?4l;ƶj._4r6bAgXr4&%ߨB; Kzvp܊j=^󘗹 \V236|*ؓ^vjQriRWex\큂!쒂.`943;t/T Ojkm+$t/sy:LߝChO_b>r`¾8ncF m>خ#l~_KINڪl#q0Z^O'(k#^v=wi%{ßӖ9!wCv-3%aߺ|6xrP=vt.~Hk6o993>e\VPrmłPr#@[̀%Ya/"Ɯ^R@ϰiK(cMk[6(B!\w](km+VRқIB;R?} +@Vog[~[Y-K,z)׎Qf[@%AF '(P ˍhURoywR8%Cf<˙#J"Ԁz;(ILV@""҂Ÿݡ(F哗mУw3l~/n3ExgjGeӗ5cE;=.eI E0 uu@^QjCo#;m3^c}\n"K4z9fSG%"MRfq4-Tӑz}[薔-y%V Y̾Arֈ֝J1g>;AUjϕgRr7+Z&gQ+dzYuӻ$8 HrRWsS tQ,Fvvd@(N/{cMߝQ0=J>:eXr,֣x'FI Fr[Zywr?L^7rE_6XfnO=ceNO?KLTy|ec#J7 YY$ thґʅm-Yͮ:P;`Ee+/ڏ+7`eCۓ4[~66IZ(+fr Hb(>utj;sLOϡ~H? =-ۚm$v &.G@z${KS.^A {yG@9klJޓVrl 83eegǓXC8ڨo87(W!X/U8i*<{REԳ:T;Z X3xCg>jgxUk@ITڙM JOJA(jƺMRft(EbO, 穠9vKvZBKeЁ!sy*Hhw) mQ සrMPj_>omG8 ИnElRs"*7,1tǗQ{Hg/cW,P|E'~(I HI>Rw?q u:nN!OѐPI5B$jr&=DO%3Pn+;c#;E" uI)ѣ8o+!mzMJT" JRE f>3z -g&O1LEr@=(Gf< ( e{Ջˆr~d' 庹KIŞHGOTgBZlz،m/hwӕ^g/B|[^WO [y}gjYjE>Z s>?%*p=e;64er)_Be]Vޥ!#mdE^vWѣ9JŜ~9.߱Wi/;.z%=(oT~6i266hs[ާp\N&mPz5 +@9#X~1T3[祑~K3@ (EґR:` 8VNZH:~{Z}Pm/gf*4ԙW39ouQ!3f/ЁPÜRwć]ae鸱nɛH$ ڧ/Ѡ 6rU4 h]ز 72"b c v;Y.3T'!9o:5dx#Fr-#7ڴˍNgjA3yTYP JѠI9QJܼ֖f@&}ݠ\w%6"~u|Eo@;7+V$eOrd5#-o#(P](zxr?`fnUWJ1эgY+`Ec[b4i*Lc 8V^h5Qj}71ޠ]ܧ{h݊Qu+fr(U3áSVM:`^~P^[l"i>PlrVeU$ުS3۲ӏ-r Gt4#s+L1p3٤̙QtMqZWL'ZѾYW1В/oS*4' ĘKC҅?[#(*)9i9ڗ5sk-&Y&hPzm%?PtE<3Sh`]NE7!ؠT@œU3;嶣aG]jvOjؘ`V}j4\YcE R:ݤ!|>yanr[w=5'5o_ ˹h݂m$dƥ YL{YT2EaɈvPZ_l(1qV]cUpb^jKi+!\HC(TQa;!ޒ,[NIM$1]_4l0G}˙H-gƚ\whȿk5)-=^k >Dż>^I})59q,{T0/&v \3d[='o|<5^G%2yɿ*0z0̓4Wg7VCyLRR An8dvf!\^VH ʿ7JU.y[B(eZu2- tNM;0mPjJqh6?n = 7 -/bx޿F `*´P{y}(=-o/Ox,N]n{8吢g,;+(xR*|8{6ŭ40z13hV붪a/TЌ@|v??@Ur]P~<=/]C=r2EAެpÙL5l :AKsJ%u=5BRHFJqhJ$Z@)T$P(eTR`Ei@)Q6(YLRgcmfcB |;+t<ăxd:Ÿ4ӓ[ւ$:JF%|7("a ztTexGSkŜ$#6}RYz2wY/ni)h߿;L# Ivځ(Hvo滍DT#iI;73ZAQz=ڪ^48zxFj@(N =% ~SE:RdB$ vzѓ)%/~gy[NR5ܬu4_p6/`fF)10jWRԈ/f3WS8Hz|$E^.t;,'TPkv1wEA3󲮑Q6 9'(.r~",ƒ-^,JT'u+NlH+znr5Pr qHm&9ގ]Bp3Ssa~~h.?*vٟaWIsbد&k zquY4ԥ2I$y[ԉ__> 7vz ?m^K>@,{ք`09twTF &^ , J9o8X?'_NpH03ӌc9p]rBr?JCY$hRer!}dJb(HO^s$=5y[jVUi+8]X3=BsVOBٌXI@wF%9VgF%{@G =#v蟔pG|)ցr`E$8!.Л(8s[u.%]njFmymAie,S^(<nrh V_zmsSnVM y˝Qn|}X؞fn\s9&swK?KwuDw۾m#c9jZrb`}-z6#kX3P3쳗cnFoSh\߳1ot~ǻGp~wHܺ\y/+r|\#> j ٭N*]W+YT/D߁Q5hΪwM7cRJHV$2m8Íd|eqjwڛ©s-*WK1:sSqqn"GքԇyEdnLy , 8s(DcѴ?$JWHZ@khxмXq($üw\lo8S6VXi| JߋF+ϴXզ.[VA;RH_{8{<(QS^r]z$}Jٻu^43Y)D;Ksiרi\Ş!4Fhg)I]8ȗs}vP8커|S]%y泵KAvZ-n sey&o=y VD~H~ϴ!7THzb ( Og}y`t )PE?.U}*wrWԎVO,.ןF`ٌ= w匢sc.4՟0N1yAr*!c!%' ɪ^-6xv4JfSۡx2V!zy^Yh7na䢏2.HGz"g/eM#^EG-i۸/UW\ȅyڻjf'gΆӕ@(Rj3 X!|&ͽy%n[:4 u?)VVo6gnڗChzTw=YpIƜcrWIz.us8QIX2i.A]z5SlxOY4Ν:lAۿF;=p{SׯVX N>跺z?@5g9nH.`HHsyھNu, Ah3@9ߨ~֒J+s!VI%(̛*Qr=lC ҇Ê(Zvy6MRIbGi#/JKK'+kIF V(u:U-UŢ~q|ߠ5_$}uXt$4 5(gjG+M2ф4u l 'E糥J3')^-U")KA-S:Rbbe\twZVfdym6 :툚 R\gF]8RY.Ov1#.ْQ K1 8SNǣI+{t(k%!g޿Rru?@{m[t'1kers;=]v!m,-W !2=A8ޖDȓ6(֔fd'L"Q"bE RVl@+raCPXJ"@:t)wDB@qhfHN 3=/*B(y\)QF+Q2IėVtgi֋&O?tp̀PJ[G@2HjnttjGx]@cAj;*0]Ck0%-0Y9e0tJV$ν^ʼѻw6S;ᦁ9йLO¡ =+-JtQNi%JO֓L֊'EOrj Ӷ)< ۈC%7lH̳p,|ݯޟ9;VJt㙙br#[kduV3;n#vo=|q*@5xy_ ;Z?VDbdju\o<,V_vr3Pa5^7_T_uZjFQ.<\~ azΗ+8#fwu:]1Jҿ]/AzEI\EI\%#46I+\90OKllq7۸.YްY۩t\˴Uu=#E2KЁn<<>-=x=Thv,۪x>Ţ, Ja. fĘN Yc\>-iœiYzQP<<@R|R&|" rܰ:0-nrK"d*+( >(&o"w yD)FəwKsĞF%$IoJmEb~̉TCg&Ji8_֤rgSV@JlyQbp[)7QRYղ8@cix&Bik'5}8oKY̡IiPZVj֦w)Q3թfXblbg'm-rFq?Zph)yP錢4QX^;?̔/RUWªO/tG/tʁӎʁWRpnWB^Vے>-=6WVb1!<9"mx'}=oTJl]BW/ln%OB/||UU6IHuǞ|}g1nHq_O8wI9 =QOy6a7z镪bom}O.Էv;t*f~يQky@3 >ErNPf4 -u5 xkwD*hme33Rj­.K.;AT)*\V땞3e""v0 et(i9F1JjFm0{niXzKK_^d &8]Ƴ2 m\YV^u=V٨<[Mq G#˲<}ߠG,ߛgX0qK %.},Y JXW H]f]P) *ەvh<1_PUUJIAIb5󃴠Pj(u.79mn2!3mj}:I O6Zt@Yb'&(!9GAT"-9^Ԗm?I}۩HNSzȚkr 7U3hJ6ײf~خ+(~wHNJ<@,r~x.=m0p>rdXSKwX!i_Qa8h OɈ5X:."m$%z 1(Gf~Hvyro rPIdѣy.=ͷXѬv мaA.jzt86^wEuRXBxPk}3aR̻*gOʏW::+u#zyG\E+G(]f.{ĩ4=k{o+WHXU/1˽v'yOPrA:OUj(g=U`0jnT|9#%BwWeIBx}ۃ0/7 endstream endobj 75 0 obj 16941 endobj 77 0 obj <> stream x]ˮeqW8>/`Yv̜qxa޳ދRC:7dU1|S#?`~[;O}/;?o~o`G`ށ#܀)kCkh/șS(T/ݿB g6^ ĊXPd@[0͍F8#'МES30B#S=M1P`Rҙ"^:c `!ɀԢԓ *[|,SqZZƯ@mh Q/5N6=9v˃ui;9&nDhN59'9|FmWԊЂPX_r ?>iA)\2#FVꆾqzݗkЌ\#BBA3,º#˷? %Q?֬z~wMA׼@gH@0UiYh1ĩ׼UB@9H0j:r\B[KwӴ` K!iely@w\@9k/ )7yR}Z4&״`g"@9pRk(n9+(`BzXQiUʨUxJVO(R[ىqǗ>V.=NhC>xb%G I#s@a|Ψ>bHg4S;e7cE]&>~6C(/:HtqOG™qfभ ilW U%X2 ЂqW3U1z~)ІVOtJN\2Fl{<# ǯTC F&cݡAo[Co[oHͭw̭7`E;*ñ }׷XC<"%^\ [ε"'?̴jFPS ١ H9f.Eq$EPz)&8wLZ[Sdř #?ʁqE8 c?Ҏ Z6 M|r(#`Q> #\QFOX~I Cw=rɨ7U!>ޤ{ mm=Okw;p嶟6^,:c~$Ѥ,Z>RIR?p)LRk }u):4vigRV=F:E;5(½$8k=hK[X6w\;Eƶ߸3Zajyķ!vyЏ=.HsCP䰸XQt9(=J;@]4d\m|@@V:P_0bxKPH(]ppA1P 9,?J10@!2]P ~;`lBNb`ȗ3Z҉"CK[ٯ6(^&Tv [<ʏg7Nvt~M?@s'_ 4‘~Lm5@}JO>_r:ԙG11ǔ&e;q\JU|m=k3vS;v Z}}<|Q=)~,̱yIig;Ϡ qu(OޏḚ794=dڽ4~1C};>CظB`RBG-ukR,Oܭ&gaGKڅ<+;!nu,yN}zXjweզeC%}Fߋ YǶ@t+aFl~u5:9pōqǑOa] o(k+r\~q1KPN_1bnS\/nǐQURʷ7qخJBFq+»u WYEϊG>+`E{hGiz($J}A iY 1SF|EwXC M55"ik3IKӷw@jik]_p<֕ a<1b90)=,Rv30ϥRȜr:T2"ސ{I>mNEvϛ%;U%;эh5*gpZgF|X^ه5FK¼zΙxa ]+kl1~avZEXWk]Zg `DS%CR8xFˉæb1n yC_@a}׍RHyKIO"6/fnXqN03vĊ Pęw%5Ud2wWKޏCnEz槃^gog}|zͿy+qw30Τh'u1ݾP@-iݠx PXƸU4bmՍm5]xZ -ŨY{:OoV?mƒKg{JjPv$QSؙT7_< gowΥ Njh<\H/ڀ0])xrKp~(e&[zo>Ź+ZNjX+=`DzbA*lXH|t]RZIWD' VʋJ[{EÐ"ZB7&ut&$ḧ́@ͼk_Ug.J7v j1gos^3W>kmɩ87? u^֕<42:Jvh@E]Z*zCdU}D'6W.je"R1z.aʷD+-Ҁ˷x㩶ۼ'/>UZ6Q4H~Ե#Б.=B5Aw yR%c=[qeII>;ΤxЊYk2){̄\݀GtTZ>#}uGC~uFIR;sԲϸVEXsUF QDfiMw`!TFR׍#4 軭(rMȊyJZ bNc1QOdܨ}t7"=6z<#W-eqa@Y"-!HNu h 0PU+qi>l=6~wu6  =&Xa-a1N]P:J 0[#Z zڒ ϰtHǵ)KG7҂[{Ij(FTwֈGIГS$^r >wH5J| !7W{ŧk,5CSp\䢋M: FA} eJ&(Xn2SPR';EKah0#dI [6+ J)t J̞CA\s X~$c}9q=tyz=tyauQYu)Xuް:oCW=Q OGtsb)sQIAq>̛ #_0u(fA6^^;ŝ6ʻ5\O1OD5lw/)OA:󮲈 J+ / 9T(P:s% 8S6OߠT(d 5:ݾ( |_>3:NŘpm*JL̆ 2⸰^Q\hfɫzQVH-nVhK_Լ*1e(A @x"-܎$A ȯKJk!~#.1GG^+@vBYlb7j\AͻIhhG譼6k@Av2=iĹV~xDoɋR6F%iɟPWWc9u q/Oߠ&@MvM*0 '%l lgzteUր2B^:+ZEWJ#~KM<跪Z,tٮt# CRFNio=6 H:bڕEam^#o9&iޅN4k&TQ9K7(u7mE\0Q J/CLc; *'A@ɱ-уUCNoh)K)zRRoC*V_TmHպԑPOQ&&HoYÁiUEQ H/mh+||KL|xu+ozx ?vݟQL&|x=7w_<=o+m߰mYgVGmxzl}}3_V//G*MC>Y;.ǣ>>糧}lp9v[+?Q\N:JOJ=uu3`Fiu%U#.aLҷnq1oQLy3?-|!9mBU56W7zT >Z 0xZ1gKECC@9 T&\nW%y |6GiA_DQ/Ǜ~ Ǽ)?Ʉ{xjUV^zX}R ۛ_5Rg[͜sRŪJtЋ4׃>Ck,UW)S( SPf#i)OVZ1_p qJ=_? 8vWnz[1i39ͮm/*B wd8ӯct_ҵVdS\J<ПޠTT[[%*Kxx$W7a7U#\7ཉ&[&0ޛwIȍz {n@!Vpԯ zkUw!Δ_%gV'̮q쒞4e"AAU>O`v25׹+N[M/56h%6c nVQˁt'\q-^\nEiҦ.GJaRo.gY1F'=4ƣI!s~Bҁ.Wq8?% _?8Ę{*4'zj33KސڎƼ6|Z-m =!5#] ]; (z','S7#|qerrZyͷ/'8.ZK VuX'GL㾊]P]qCݮZ}KԊuvJ⹾E7ۑ g_ jwy(y0čaР5(#џA8 &)+Lr` LJ {Xo =yͳoLW<8=.(ut1|bYԟiKTQyg\BQ*e7"*yƳVt0|evKއR+bц0UG{% =|N2]uz|RP mH*=x [A(}J䪗P*DJue*Նdd”N*|Ź65,dR|nP3M PZ|:PT&=$7!iF|ƥtEjfNI^֡J  \#".[CD2V͐$__y>n~1o~}ޔYFI9e "|7\袾diU۸UĘṯ[/ϔŚY'Lv lĜ`DtAc&l¨g-K9>cu+蹀|#1 .SҖh y} 0z4zAr=aѸC#39yGRu]#"dĕb|[{(7Z;_PX<[`r;Kz8ajw{Aq;.ukN Ն+f]A}@4\ۆםPݥEu,k&K^G- ItqPR%%=mS*^̣gΆގL1Hi-Irxz֊ao,`j[NyV9eKE9hٛ]gCjl8ё{<){ke9'"zĘgrǕ1JpUrՈ jpw \V2QHދM%(N; Bm!ʁUwYؼU!uu}6(Yփ[ !o\ay8XyIնZJr2X/n8MzIvXKQmy`>?'{M xRLA@g x&#lR<>%ʨDIN{ Jٓ r[.zOmP[^xS" *D'N15X ] T8u5|tZ2s`Y*ޭ?DXyno3i;HFv@G`YK nv7&emR3es=xYe4#$J\ $ceu459NF[?/_ycҔ{LFf endstream endobj 78 0 obj 9167 endobj 80 0 obj <> stream x}ɮ%r侾"Z\qT5;u?В%@u<'fAcZ2t;}_^{?Z_ӏw?՝O?嗚ʏWJW ޔ^=l)!6>6.6&Td$ڄڸ&ڄDЪjSjSjjh x)=]oJ|聩K)KꏚW+Z_b/ZIx_T9$^ &ְ٥ebf[՞W"L;dޕ wzMK+VCjsjlW̗AqK|3JϷ=#έ#e}hR. S/QM̠fOm%Z[u"Ve1^`Lݹ3PwkK|_"7Vmy"u)!E=Oł{)f\cI [OLSo2x[GsGc)Ԙ 8pLЧaPg)Dp^sh}iUF+Xf)Hx}EJ>!O* 6tiFz6T3b/Rv1.&lXlx1t1AJL0s ٣#lHmg ,tн W $+|h+;ZK\@R[HvSAR@[%(h=HӤ09X9n,YTGK&3|7LQn_Y l]aԐ ׀"Ql"JfT kf0|Q9TFQkS!QC(?kX'mH-H3AG>q % ݂bɼR[ i r<-MhUu/FBwRЊ32(# kS]7*3ȍi7=19}>1:Gl4yG-xQ]%Cʁλ$U}Jq[ZaVڶrζդWaXC8RWSEw] Te]{K[ȫoQuV~#Mbv;}`;jɇn53hkNL 6G]ew+8N)ñ>+8lWOp[qwnm5]ݎ\9*J#GX4rJ#Sr&m$BО%JJkfzw5W] im # }NrIuVV䂊GF=s B8${^7l5Xes(j>dƼcρoiy@,ai޿{cM88vqDy\::n#.&ڐ zryƥgi1r܀31܃7Yx p N)pE VPQ.`Yǥײp?#²9 y=&nDaKHGFfilݒy=[QͫW4<+΄){vx+UT/D!GP!>\ǎ/yR(!XhgusLfbd:VUgGu t5.BKi}ND  :mco!;#9MtM|T \C*=ajK}@8RY$P qk(٣|U!mQc's%hjٶ|·TƓ; 23+gKa}tyGJ~9]zIJ54՘E#Y NIA!kh̊yDswЖwi%Э~7Üg @#F+,z6ĠQ]T$ڍt ?l ;6}|rg*nWt+c訟{^jcgpvYA羳߸qvmY0 `Q?X4 J)7m(nu=hU0%0u&Էe_l\:!CXsUOvoo7a޴sCB}"@wKkCg2 ^nƩOE}wcfRWgKj>xzF3 >c_.K}v(IIlE7s;glJq);rE{E;0X֮42v Dbd\i6 r*Х%cvO s.F-}B:if \8h_A>їbpzT{VY}7=jL1GؖO|2đ^ k&;BqzP!a.R<#-pnGuPmT w&G*+{Sk)je5GYA{8NR9B|Ft"%Dh`|ٕ_˳&%pʞ|E֧*ClQ64\![Uǖ* C塿 $v\~ʻP!ڑ1GqZ.b۱WK[ЖΘt/OHTWtjت< !mB];:/j@+6:?4֚)%;iA8ֵOJtg2oT)CiY]nJJu.ЎN Օ>P=Zݭ4:6J6"Bw#x#K:9uE}cyՎǣgE|L1IJZcBΠ6?>avMrŅKz71thwQ`P :q5(@*gl< tqHVAWjiᾢEW-:ԅFFrqIe-pXi~uǖ.xh(,0хlkrFo8(ǝ0ďETNLi(v'e)j"6^ygGԨXf<:_-Jg2uȬ+<1A 'qYݿ{p^ARJ>=[nف'.ɖE)$} v,JiS=C[jAk,w[z1ӡ#BG+CCQgMڲO h RkFA 6O6)MvGap ) G?ԩ^ծΆ_D GaqY mq.][>q!hn;-<6渕 Ez#N1v^${M Cf|mJm%O9槇:Z&N(T?Xh w'g&"4305 B$M| |_v1QM}}:ؿuT3|r5t8z-?U#|Zvքg">yo3Dl>S{j=qw9,7sD Wcc z /Zr!9.wK4rދжl&K[ [:hTArOH{"DΟut]O~4x2ޕHЩOWX "ucn^zQHۃqCKtġ,4VXW;:Ɛ>9徹14V!? m8j"ۆA丶a ]%H+TPMl037¶\/' J;$ZRğU *JwˉN#TrԴuloI&84N-+%`߲8f2=Xwd1z͑}Xi'hw!NܶMDR]`cmG|4Rla\-᧝pv!Oe'a!in"~9ڬMMO际ykf%.jىwt\ޘmbʤ9B͸?/[R~XS5aJ+S7o$*%žD/6sFϽ/t& 3?lCnO<$CMʏp86$]٢l87nCm&Sdhs5친kA _ *T |Aӂnۙtsۙʇڪ+t>-pWTp??Bk:Vt'Ѧܢ[]*Ѯ\8[WS 1 3"6Z7hv ;v(fPjW0uEukרt5Š =BTx449_\QqEKnAebՎ65úp,>Q,'O(Soi7NL?;hG@R'hh^ĸaԭ]IJ}|gV;ozoVw\]&dvNsS'f䮤IZ$.fvK-[D17zkj|Go [E4[cT:G)n|HqnUjߊτvnIS7$7i=.>拶wiۘnyF}z1^}{=ɰC5?h''m_(53,?')E4[DDY`ccNw{njY ׍dYM-wnvBfe[ؒ+7ug%Rf^GW*o-M%kbbY̻3Zd@+/vf%{k>) lea'xb癍)|L<323'AXf&L!53S3?Sksfhr\*Y925%)fFBG,c=[ΦPYlkyҖHNj@;ŏwI_07ɓepJgffq5ҳ6ttyto64D.h;OwJ#ҽ(M$VP~yPҖ4Ų'X@˞6"h&nM }f1ާf_v>6E'j.ҸgQVܝl~Xq{ZzFXY|;0Vj;w\;nSg0#x3JMmѴXj?ڌ3qԞEi3#Am5?m|GOvVޑ~\~r_|: OyCڝ!xWLڧ|hٱOtk,ׇq"xIw׍j1.xi'Mxq0_,?]-j_=nGIF_Qx 1;WMN~NU`z=c\41HOb< *|+.x1_CpbCc\3g ۊ <ƞ1蛣UvM0c 0x6>0Ʃi.sz?C{In}lPUg6C#T?=ȴtmAy۠=*՟|@Hw}+ |qm&ҵ-J|^L[H"Vjee+UI4YzڢĀ\QQtBc[چ6Rr0?ӭy-cR7oH֊H=ܐg.~|>٫)}ozFowzpɊ3' gz24uc*ݛkoơzCB*ͥ "i2n]طe@#<&,Bj~Q[U?㪓%e!x{想b-h[BYR=B|V|9(]_9`ĎH6zl|2I4$}>xA~mJJ[۔QjBx}JmMšdO,(Ӈ#%_*4ߊ'hFԶB=m8f=!4='/d)h$17vs@o-Ӥ;$>i)#'Jo".c?h&bTmD}iqC;rK!?&]*8 {ؖo⩞C~ʕ "C eӌ WTϲA~~| rjp|CAP( Ѡx~Q&jeBw"PGp)+HW\gzO$|©⸑m*̈O847qpFXE]:Drk.qMJ7IG;t 9Z>iu2դQo#[WhikunQ43yX#d3ZpZ/KF]7&{SiM jxԽj4*JМ&IHubnmѻe1t'ݵs8لhMKg_jۇ9߿{Ȳl &W-0jMa-_D,GW$'"KXסK8w?n*VVv#·Nauͯ} B̊Ts*3 nz=}>RI_B3+Pyk8*ߩHݼPoF>( ([.CErEo\cێZCe<޲ԙ,<sd+Ld-!${{_б-^ΏQ/m1u F3.3Q=M hO(:cD'B"bj(_<Ōֈ*8O>E8\ѴnOt﹋`?z^_p){9d?ϫ?o endstream endobj 81 0 obj 9743 endobj 83 0 obj <> stream x}fݼ"=Ho ,UmɳRǒ{ү`k"+UoSj{V޾?uV-1o_H@|kM)UUIEE YYqIyhZm\{1oSZڴo?sۿ欍W7?溂 v{\@ؾƛ` +X'X 6chcma*y{I{w@]aq65kz* πE-ڱ?ۿ8~kYd[gQ @u*QbwLd]qYmnB8QYԩlKv]'J^~$`4ѿ@[8p2Er0[T*f@C<%Q:=[sKD⮡f#$TyJT hg -?!Pт@z>Ƌ}\ь(Ҝ}7.GMFi}>5 PBגt5i?'OZWEA" $D!2M!j \LO $2dk֞>d0T(Z-C/ф~y8/9=m_mf#1U$ƛ?.~T=O|2\RQjTV(lJD%rIs҂W8sU>}u ?xp@ӱϙ8ֱwܲ)A VL/ F9^{4PW c R4zfQ\ 8.zXwD=U)U4nAM#(:J~y3\#l}(sZm#K;PZ֙"]FNnMufs{(;^@WEG5kzQkpSMsD>qt=2~Tnl8d'55x+>^l>xDkBpbEC-1p}|HM(jҸ]#XIqqTR$]U/Ԁ([3RF|Ğ[yp-0{ȏGGXV7Zm#E!^8M!Vɡ]7D# cˌcޠ˺(r2Zfozʹ'.DZe_<`rg !yjT38;ݶJ ҡ @Tj^t ڎgE\f>ĸ֗f|vE"L>CݦaĥY3A8mr4m;}h.|L\A߁bͨ8Nj|m4MŃlxS ЦS3jm4L($gB)3N{.K -ܤP~y8$9n|r1e?h#ڰ-eOґŐ6=|SF3G%>E=JRQy(#/7=4'FҕZ<o@=CޟX`[t| "K-h1j8e;_;ᰜ_wKxz}/F@3D,sENŮ"Si}(/̗QvfƗ ᩇq93%CD풖qq2ˡ-JC$gwE=y_/޳R@ ޘ.V铻hO lzQ9Wiu#-)|}51˂fDY鰷W hij6=-]s8>M!^QwXpEE=mS\!hrdܨSmFP-YD\خ Ѿ%˞76j`xЛ-)&f,mGFƒQ#L;\,0 q"fw2k'rD0<9)7y7D1 [cػ/A/X d?(װB) ˊ@<~`5,?Qi_`J02k #W`-Trdh1/qLkyA"A2^?Ƣ5/}rQ۹Y=ëvޯsC:@O8_گh,|>Mv1qbPA9!e>rdx3sY0E' EM8kI?Jm·U:[OMZk?~]X9b91wnk͕FTtZ([&)pc{pd+s։BA-,WǞWWxbdXN:ڌn['qLcUW."7Q#BODvLf^/VXA)cYkɹys)u~#eXe(gk5!J矫Lļ]`MxT0~1=FI_.*PgF:|Eb1l[bO?R=K9] ')+4+עZ>Ë Qʃ@1npbO&HӈNED)D-vOc@TQ<(PfGR2)In+ WNt[Ac8㕋yLg[ j;Vj=1 M.9ƒQqF Rzdec|Q!ϊ|. e -Eyh}~c$҃<;9H} ֥Ų86(Omv0A Vm(YZDÞ]9Cϔ9kh&3gG9l[30灔F;PKZPjxȜy : ^$Ej5M|a Psaz<`%B V=(^iB p.41虨j⍓ckjF­Jɚ*݊ҥXsչŖqfL{/;գSH#Xs!ԋ΅q/8(T!'( m|l*WTNW2B>>E>^G)y9:*t!qi^jM?qGk5{"J޲x NŔ.GzKb.+F+4.V\vG&FJhISxsفb6']vI7QmacOvm#lwmG燏_1:Hн*[]zg s\uRpCGr)D"ܲ\͍UNBCN7d{ k f)]Esiz'y ^ҊFZvW^W螭(Q?Ǎm(]f iJep"/ƍAƕZ%?3D`q^l|ŖpFX9qW-*+q޲f|W)a_2_ x}gY6Vq3 ێD {NJ=S̱D [!Bω$( b-<-a|*)us;f 1 Jöx;f&|{.>S7>3V)WqQJǒhxLT8x?-u'a.PGiw>@m3wQ9FN>n֖Wnqp| ʇ ZzCVOq kBxtCŁc~Jƫ KQr*Kpu*]WIQ-\U =z OuՋt:sx "y*O|q|RTE$޴9&f:՘p %|$8"^rjbaCZE +D\k Q) En],q ȍ\O5kKzNNm75Q{F#jo,Ht M|-ٖxoi0_⸔aeb 3#UT(ttO QƎIhsOzF Q1?nͶm((}$Ej#\aq_QhXT|nxb<N3 cmTfJN{,9dAA(]>v3C.opQIv[GaD57YC;,,ePݍU[n7>4`/9xk랋oATvƱK9bmՑ$Irn qR(Wͧ5+KœĊc: N$+^9ꞭRyľbFoچg|?RkJD=Mr&1- Y92/%!9s;KѸz̖[(DD)}lItD7=8*ʵsC!:! ¤ݞd/-KI~۞Y@)J:,`b[Q D+ +8H?X\hQrA5%-.wQ ¤eBYJov%] )%]h)MMlǖǛhySthn,viIK@=hFI= tG RYJ;hCnPQE;'-5h%X9NJH]&_L̖~t^#4hӜ.[(j|2Q14%`vOq9{9 dd}HU\A^QrQXB"h z>)'j+9q8,%t6} {w{r\7tvȞcDN۾&)Ƭmnc.C*[^?4U8QESe>Pe L4і^,>xcGWv7XȎZb1h _>(WkK*}P[/ɒ=HXMTUr>!@w`Rs)=3PLA9UV$g'9a=k9-=cŃң0ľI*./@3TW?w*~)g` m9< L9Ɣi@NДS,7 ؉$R227G*`&\4Rȥ*4{=\TgUs6 KAb^m~\8܈b?{2#>(ݗx7OMV+iXnL*^!Jk|z-_ŝԍ~598YrI E۞gqwzd4E'GǗ9QOPuE^=vBzM=D .Qg8~t@3$\0a{K`QK| WOXwZE:ǯAK:g-"{@.qTJ:|= wq|_KߴҋV\qSr*QC7-I[S{vxPi5]V^hOWq ]d\BTVnK'Vˍ"b,EW2> h!MЫk =Q*g*$7&JQ~jaM D/c!b9sR#En19+մrs% ^XP!cwwVNCRd~1a qp rMsrm{DwhxQQ+.E8yeXT%]IU=vȠNJ^7=k%QJEg)Z%./s{sQJ&~.~f"T)J+zLE|lNvIO0]ڋ&%bQȻQ$ᴋ<\WQzZqFT wxڅ J #BVBWhfMFZGߤg&pXQ%Jd,$=^KȶkڟG+.j^Hlot^Qvθr(pdK$DDW>#hE{{\p8qK ݷsy+1fDfiHQi]1z: _ӫ8*f⁞:j={nA"^g˞cg/4Ub'b'\G"VgE$'sOK_PJ%ASn3ǥeFfr.|)1D1^-KzTppHTE$%?+v> Ҍ2yqvE=v^UIؖN@~jZiY5`_Hse +Y*{/g.X`ץ rQ-hɶrq)f>ʙuM )Җ U#֞mOXUV"L7uqZ5_,VL\j袷ˤS6cg9fwB@ ':{ٚݞ<^gʗ+PL_d\GYv0PMfS:Q~mW( T7F*`tԸEl5t-Ff[oV4/m1x@/qAC3Jv) tb/@Dn7J=sտ9zBgbB~]9.62s*#S0~hWlY^PJ %WZbuSsVCoI-OR<M{'aW$lF@Tʨ/~R{4'ZFzV?ʖ E`~t/UлZq.iH1WQt/ZW"j#m/*L~5v'j QJIYܺClK[N qQD1B/H[-`[47=QɷE6GY  EPI/|ۏw8Oh΄P-&%iˢ$׬D;Q)񒭚HcQP}I%/=xpg$q`"Ӄ\)=&\9 s0D'1D7Vա.h99d!`^#:zh_+նv?~QLDk] T5]Эu]ӊ]sgE5Y!ͽC=)иah9 tepo'Mt^V`sX&{Xo~n vsXP2qm|V[%.TŠ8E~ztӐSVlXo zb˸ VXo匾[cR>*뭚Xo{@K㸞d0 )} ># Y 8YO<S1?c~P ǜc~z3Q: 39Q:.g{ƆT4 9C{:yٖ3rΥp<{5 ϥ_{۽ _{qmIV5u/惽N^M^ո^*.{\~UHUګWAkaB ɿ*+^ڜx367~(lNh66A)67QwJ%Ͷ5r5r9G -fۿlnM|`suOڜD/ذ9M:ٜКּ6'95 yH5)vBk]КwW!UH/aW?^BK(мQION&p%&z=y %%ppj+J"yz !K^BHBz{yx !K^'? {W~~Y=mVm*#ŋmVQսB^o+tB/^o+z~ЋۊVH 0ohVc>G|zOfKL0&9̉2;d0'z O?(0'JdOYIßݙ Z v2(ɴ?yq s,,h5`Aۮ z8Ph9h]qdJmTK-ݵ{z\劯Z6F@S ?WXOX&dOY𝠸X9`|ǩ{ɩLGYwԼG}O;)dJ>s[enDn3ܗ Bm+) 9Ծd*9 r =k JkD7J+XVZ '/=SqFt#S?࠘K<"ݰWQ|F0~t5Q (b)~…A+ٯ)&j e`uU4pgjvsGi+Jzqm3ٳВ<.P"kJvCe#Emn<E!='!nHɓo.(ސ )#PA>Slkx<^qfRYg=\Y%:ҩ`ʥ j͗N,]/">XAk<:fmS4G+%˅TjNoh/<9Lk Վ([zhu UYScM)ZoŒ.VY[ec+<7<(HDw7 (X@/1A>*XaAcSKѩX@]cLvU#(EQڟw|!idQDZEb(Esvʂq j%K I8.}0f{[i[|Mn 5%֛e8+1Lcx8([驉&H(][&F|KQmFV4Z): J-0w< GNryyƋ;AD Rlȳq==FJ!4Sv3B@'ǜlpYaF2abehF`puhe9K'3nPl…Œe>T7|U G/$ L]3׃4cl|KndlX|_NŀRpƶǥcݤh a襐b9/B_}PQ4'~yRjpi2<G|&'V v[qL:`L:8dngCQF>lK9ezmJs-3!kT*9<HD@n'jjQahQ-VUR4m8Gj3+Bobʥ-SV"aNjIZĈ_1#Y)[ ҴA&Z Mta5ǬՎ{) g),9eZ83ko9[|]2-eѾ.Bj{7GT-Vz/>cf>3!ܱY ˼(v%7epTi\WTC- Y`}y*x6>M;Թ;x?zk#&OÛaA=RŸJ[%i2> stream x]ˮ-m߯8 NJ`2s@~ q# %⢸tOat-H,Id]^UzLwo߮~^?;|Y?jp}~E6֢4ﹲW&-JZϽE@H|_MXYYt6fmB#mrRNDʉJ9)'*Hcgkd-Jtj!\R!g&e&&&$rty?/_E{^~?~0^w}C/& eg~fxi4 V\НvgO `6MԖgd!=׀ < e:96sgl2\AB b?\0)F!ruxhц(Jˇ6.~OQqAv1D*P::nھIM/ԵhEG DOU3jDlF6mt;EjG @&R=o6!h.!0X%=#3ж#˵?#&xO~Ñn'{ ?ގm#:\fƯ32+L16 APD/}^ gem`l= J/HFPpwն#zpM mdb8^0K!NFfRQ|͸*lr0PQPF8VgmƓŗ06uYQ2x]P2.U/A1umFb8%CEz~+2eT;]Ӷ%Кψ6g 96a #$Fq4uؼetc+0aud㎖L4<΄##bύ^Fʵ80v30ui^A#M=5wW,ЖX|a[ F<=F<9*&b!9]_t&3ϥɹ-Oqp?\-7|H!@ ̭ ۯd l+\)]0_3R@lƌA[.0*BĶU5h5_3lv٢v6 i 2j sb9' ătjٱ%T]QtsbLCoԞ$/ LXzCrȞP:f'%sQ+0|3|aϝ74(m:%&W<|N皝~1(}(:8TqFB__ c3J7ȸ|`P;<7m3krTSc'[?/'lD uCoqhx *Gw§@9e@Yalߔ^Y$hч]rEYsψ;P䑵0N>o'X?"XQ nmT7Z/0#{yVLҁq>y!xI籟yαC}? l;ba2AÕ+V>jb hLe@Rh8*tpT}Ҝ+Ԟl^aBK(Am6&0; ]e b`> w{`>Êb`4 *VK ̧mX u#b`-{Ö&0Ono:fFMH:PhL ktlza\ˀڝE%j\*->,P?!VOA3Ǡ (GkT&(< ssEL7Ş*)oyp?$82PYo]oԞ̵^Z~۹/Z^-og-ZhrbJb se-LF52aYˆG]>JVc_ Q7CIqm$5MUci/G:nk)B[CV[{zhLR=oyϧ21P_9=b>9q{[Мq P.flLL1ۤzU)Q#6'"L-tjL t_~G 1p:7).*qBoԆ QoY6yj(WК-5FWvX䗻Xn 8b`$&i6sجNBƍ~ּ݋LǪg ~K MO@M@M⮋R4G5/b -Z+Sۦ2HLTJfʖL[)c0ek-a:o\0Zzu}~[:;%5[0lvdjkc)媧S_U-ϡiy7N.m o)/С}  mo9 ѾZ;Ud5(yL7Rq =y~g,Q-3GݨXS9.L|}[S%DfM+#)ċ0^`LSħ"*d*$xWN%0^﹢hm%ǜ&(nfˠ68蔧x2wx݇1^ x9l㵦v+v yL z6HZ\Q=lM^"骋:[u>4H1=3\6u Ӥ w6\̨&yhp-?G:˃Z)c0>7ߨܹD{uTZL DjFG%sҍ^luiV+?09Weखz(ɏQPVɏYCkEN~BZtS3Vr.Ngd Θ`8c6bqVT}%/E}8 Fz1P'?,zκh~W~̱ C~I)>`zW(Ih[TX-=kZ:1kfY:W(I=5!cMЖbMl%WzL3JhOQR(L3JhOWho%Ox_;bY (Ks)Y FݥF:Wd,t:dǨNv ,ev`ˎLR^,{{,e㳔ɨR&,>KHշ/E82TF zL 7uV}lݷL]ώ.t;:0%/?mKzw1e>Q0`WDz\{""WDX~\pEDWei25"L.2QGH%1/5bg:$UeK~[Ai4 Sf-3rɮ jsZ!#b8 t_VS'j^B٭SE{Ι+z,t}m[H~G7r@/qb^j$N(ԹzB=Fu>ďwm oIPC : u'$N,KP8z'TK'qXB0$hyĉ42o3F}wXf.q;r~ p[b-1q2im/><QLLr@4qI9اC)iNO|ÔlPV դJ]4xe݌! [=* cpU˼4m̡qLH|e_umsce^m~9ϯ! Y@D ͳ.~Ɖ 1ۦB{^;"j~%Iln(]8#sjlTs>gS9A[bټ#fDMn04FBmO͞z2-(^(˗ik6T3G> 5dE\ [A\l1rV| 'MHafKv{3*Ȥ aDycϭqfg&.ΏPݸ#x0DNGAyjNI4NIcA& Q|3$?r "t/@_gȅTd4S h\n\&Wǃ+O }nGoaf|j|[3Aw?l, `ڌ=9QQ7pF8MeTs6I+do[i~޷d,&Qs|Hqm2O2O2Oʵ=U[6œl:$b'DqdN6jdN6 }mSDJ@W=$"&Q1VN6Bl:*kRSuiM-A,Pe zw9)PP'DN6Ibe5*'d{6 WBlD?kq!Θ=W1cYsi>W1㌉ 3f Pb1t*@QS1t,Ɯh婾(/+,K-Oe=nڿVn8ig%{v RPݠ؞2S[N~(8aCO$szW㱊mduZ*tʬu2UjNP*B u2SUfﴪTExVq!V5 ä'8Gyšϝ8JW:C{8LCzaW&=yš8\^qꓫ깸721˅6*d02ϫlmUf&=tJ2)WڔL/ҬIGL3`v|0p>>ViVj'VxgEͺ^wO6@@d:0eV|{6#HHy@ʋ?>pS|6b2 2x|H51`O@D z1?>@;}k)>=U| Z`, ƅʗN@@q . zo(P/QfIjlD*I=f{J-_zw}~GDrX(P/QFue$ʨwzflTY%{ka۔~'A'QF te$(IQ(P/QFNyKQ-D:b QO8Ęp荞eb|9~aâ_Qa~adFTK,kZp:˜< ,m1 m=-BMy|Иg')=&_eOM,3ł[bbL+n.e\&BP}#gW6ѹzG40K!)O-ۏ4D+I<.'`:lo︭XS~rb>ؙw,݈zA0Ǻ4j頑Ul<6\E4QQfFm@1c[dTpl ~K#QE&i1 QS@K5Æe-L#nX :tύl6>f2s[I!j 5G*vsB)lR7]<.:Ć t. 4Foown>n z65mF18Y Ic{Kw9_|Ĺd _cz356:j)Cm7^e|M !Q3vX'Ju l6M#P/pLWw:\*3Q'vXb[[myn3c֨;0_6+!G`{1v$ lM/DSBlm5c>` mUhCDu>@՞) =V{S"ӱM n`ʹ[NBM =,vչAw2=-`@ t-Ի٭ꤣk}sO 2V@aN: NŅS@u N)`@;ov3 n&qq!70`,n: f7ռ٭Pf< 0XW@=Q#v nxW2l`w,p/` u ()`PB=zv [:b10F wmA; t ,+`: yG@>eٞM[+;;B-ZNjߠw~^: 0PsX)`нWB uS.3f,3^r 3&2x1tdď36,/E}8 F NBgQ_s-@{(_&Phgझ ߨPﳗ u>{Ѷ(i~ٸjg/)*Vcֳ Ej,HgBLڳX >Vcg/iKDO  *!<?!<3tFt)Z_XW9XPRf\|2Ce)Qw)Qﳗ uz9K\jLg/UK糗tIJ)ځ)ﳗ)Yʋe/`ϕLx|2\ʄg)`ߵ7W={>?wۿ6B}+?6y endstream endobj 87 0 obj 9841 endobj 89 0 obj <> stream x]ۮq|?_#(A 7'b02~v|揫?}m{;?~VQ_}}| O9˫92+S2++)s!rJ-X?EJN$^θ|RBmU U*VeYm'erH|mX2beEʤz*A:Yz AL~2I/P}˫Oz%F?ޟ/=^Uim?ys=hn}E h:>pN, YG@ رO zQ=0W@L_;20Ul+9m0# XlTmZ>l >I/M/R)d l}@~rHgu{N`JEzٶ4*QL_S`J蜝竗_S'P]P8h;E_. o=<.; P)rbџ<ON ׉WN'OՀ)'^x] ru!S(^IӶS^*0k%3' rN`ʉWNSN2Yd {u qOפO!uCBj^ L9 \ r)%dӅLrҖv)T/俳ʣHS(:"m7Jۍ:iSEFFk$mZQ6EQ4iS MQ 61VMˢ)BЅiU`Mݖt'Ҧh MQ'6EQE*FԲQo\>Eur+YyP^d8d$ʋ]ި=yQ'"eq)/,^hܳQ9bDj(Z(7ܨE˦(QEؒ_ОJ4N<' vShW0]튞튶vEk@ ]Ю5 ZsXuQP1%:7J}ȳM0w޻k#xnYVFc WS :8D; mǒ`Va(~f[n@ܾun sfʭ0~X9퉣tޭePtt\/=AnݒK8zun+Rq2=qU RYr{s; "\q/7N˜}.>mh#S? N^PJz*KbW~>xzxYaI|sp溷zRzTJQ1E|G/=?#Z?9S}_e1y1dž#vqnaGQ>yTxjOۓG-}5Mw^(~]ޤ {3t WԜr*> '@M8x/ u~<}2fCZ>' ~}G*¼zl~_|M~j2[,nPwWn@`ji\ AM8Hm [}8%S]w;,fܘ |Ol$op)[ V :BLw,lu Jѵظ+o DrKخNF{La3ךpn×27|㠙)_o|g/n{{<6 83tVߚUKo{Jm{vkK8q=9C,n5zPwsEGm),a[Ĥ[Od{a|׷*Xhi*u088W43ıh)4855PlIBx62 c9Ӳ(#̔vG) r0f!c6KB" b:"fPw)0+Ys'`GS! "-x0jfz V"X%̔}q]yna`3Q$D`uGC` "07Z#Q4ExUlm{,CxCs_hXi`UOA_1 aP-*Zs h z%>SS4WVj9B-Zjo0V=V_j ܙ^}Qܛꕹh 抢;ʅ,Ƭ]Y˲plڮ,s1&61\2s} (707j%\LJY e5-jsv pPFK:M-JYLTCKsr6R EсL8Q VAj(4Ķs ~mvn*[xb'[xbݹgh;ө)/R/):W4Oh>A5X࿊F V5hpdв/__/s_LO0"RdP~OLQ0E\T{Ec_4r1VlZZT7)<1V"/DN1&bL|u1)"[bLu1iw1c֮1cSN1f=1&:Řxk;2+Գ]< 9D 8C*B~h(FBh$FB*EBh$7 r2/B5MHxDI))䊢:\Q''2 r2Ч\L ' )ˑoBNu9)W3EȉN!':xrSȉL!'BNF4!g_BZ!':xrS_d~;|n!OslqK)P4J'hiAK КK9(>E#F Ȕ\+P4J'` 05 ^[ S7[o0H'`vt 4H'` Q:LK:S2H'@{,tQcJs:L*&t1~m@XEG?ݨ >.NE+um uԯAwD\2%_:(1w/> lu*r, ϣU2T׆kS5=F^f?k姍۴!ˉ[M #Qy p=̯tه:ٻf_n T>^ʶGm\u9YOxhL`e7)ORWU3^(l7ҖJ.qx3_:%M\su39Wr?b.rЯ蹸&0bZ,J DI:/l jACxTGv5NG{̏~7a==0T,bm}N嗃ua18/r$I>`EhP @!tEpjpY rxh l { \/dCCq^p0epS6H/`h# YH™ z@8B `,K@AzN{%h^O^`AzE q^XMǯEIY`Hu\Q0H/PH)0 ɚ>FH`o!,(X4̛˛S&BAIu1(ˊ.eyŠ,ߺįӠhĠoc/oc/O(2pPK2Oj5y^Az ˩.ԺZ\Q4H/`KBc֮,ƌeYIve1&61XIbf^_WK@q_|j QzrӋ*5-XjɕB#⑁ #ѠNTdGRU߸:$~I@K$K_htUҫAŢ_ "7_0yYt߰|0(m@E8mFa3EspQYQ ),AfUwp)Ѐ)7\T}K)o[c)4(3mEY 0s)`*LЧ/佔h2ϐRr/e~!/佔2R^z,_EerQ(g/]齕j>HTz Gz գP=hz7EPW%Zz75SQzSS^/`*J/;UO:M QTOuؐ瞍m E#~1UO}jSN#^3UU+GfzkGfzdSL#~3Txg`^#PŬ}'`pÀ 7; 0hpàE nvח`-=q#DMqcLvFov䭭qk;{ |nimU+sel@ SJc Fyrhak' eQ->M˺̤݌ٙ}kP#>,S(B[=+8+ *ʿlX}ONd %.l#st&^J]wPf/uGQ\XTfwqDrGYb-<^9.7E˯$i|`>ٯop6rgG <.П pqe9Ν u?u_`*3гcYR"? Ik8,!Gaf>Y`\B?-#٧EfmMI,)|*Èx.{Z(?u>GZ`Z`ZhMNܴ79S6x3h`j^B 4-4 Д B M)va&f2Lƅf4-d,aABf=9̤ >0a&Q3]C *VB X3MޏwB sE`\C 0-4hZh P(РhAh)\|n1hOĠ5>Vr&$M Z TkB ^A{'xr jχ< ԞߤFB B %^^+ (ve1f,b B iŘ`,Ƥs1>; 헨Rc{P2p {QhQh)4-5-ZjJE@ -h?$-4hZHZQꖩpϏAdKNdF?>R_hzQEVd$^Um$VdUkƅ@dU[EV ؈CVI򎣭^qXYya=w+y!>5qOwS~8l=f.n-8LMY 2)$0df,Kafq}$㰟TPMu< *DP 8CP*zh(F{u,;ڃz":oȔL9Avݾ9!S#ݗrS^n+2i7`jxOAe}A%^3xT5SPLA%^3T6)'"Z/")SPD_ЧOcTb)~CPMA%֓YORY?z;U0pP ѱ)**}5e/0 uiͥzQY|(5`hk uMAA3)ګbK~AȝB~A u 45hhk XԼ뚒A.8 dDQ ej*44eSG9B\&AK\fks=Em #)>`YخK3=Qmq7eLJC]NRA`x7jEy~G)JS떻5i\V/*'܎#~^/\0!A1eok[ s7;@?, [ۭ'Z%=^Hh3't3$ydO")=S <9i|BPnT_-JCv/Z-̓x̟΃B>,krԯZ]ZF\2jLڜnD:ZJiOe,Cބ;종0]znjWJzw)'g]γ1O?rt&k}T'/V_ ]wIDs +~XdqJq۰R|=4DZ#.)W9;5#mW0mW0m7`tqQ܇i5T45GZ6:P4z֚v b Al"m7evS6m7ev`fe0hά'qW#àAl;}0%C5`AlQli5m7=bY%Ô}>MW(ƶpm7`n ݠAlQlA#њvSv ,=!> stream x]ˮ%qWܵw0 f x'{%ۀY]`AFs|s|xg8s~gi~p|Q/_HILNLLLH\$Cg%(+QRY\JDY#ωn>즓nT|vSfk$%b_HJ=2vc N g7$nvz|R?}ǿ/a~>_,^aW 4%i. ~F]4("z\˧NN^JmQ6Fu_'Z_#|ZPK@D\hPPjZjW:hk-TQU^]U4sQ;2LLElwog` eBģǐ<|Gԗ {(:K}oԈLw.:je5g]^F 5FkB},3^U7PT+j81uR@ZZwD- (jҠ . ]A ]iFnW+C3js EwjƙY*nYި\.4;v .# xۅhG] "ƂLT1*g)DKR05S(**H>2}zɶ?$OG;=(ރ{ܠ;ZqvʛNFaXe\I,sy$hB =.ܠY%=rXʍڵ*,:BY5wG( MPX.ڏ7h 7о   m7N }̎-˄I&LƔL7JjmLSq; aˁߍNGc ^>1* Ğo;5ͨXӠ=]U,C|v\+=ECwa8ʞ(0iNHA;5jQfxHkjN}#ZB<ǞE}7 qA%n,P8dd܏uc֍t4q:8DL(GJ͢cF=ёBFb6#*XPȱYս֣"Wv.f-mp__^;Кr"ZaDFՆ4q:O)D"6<Ex"S&c)P֌(gtQ9˻lDTk|zS+"S'+I'ӧs7h#Xo~iFzVԚF/rmK4ON85\^l>%Dr n@mf6M^s_8&5\T}Ƨޔ#n4U|- mJHrC\uЕȾXPc{pVO :*G' W s87Ssb6̱!Iǚ!I8hŲưoRAԬǜ|,62D1J` VA kcHȜFDq~Nk'fuzYk65+\U`7"xxbDzf-,vSYk(l(涱q6̥;VJ=oOjOy2!{5ͫc5.h}fkwMo8!qq0 U 3q0 D'!fp{:JC̍6,s0f4Wq0,r=Cx !r07+뻇kޠs@'m^*ꄱ)ԛ1VNB06+<[yR+j (2pR{ޕB06:al u\^9al }zVU(Թ&\dڕɘ,Fەɘ dLz|MFT}gPԗS}oUꅱNXB06Z/90ҏw |Rh1P8:6mal u(:,Բ^^zz@KN\Pst0R[UszP%N DـLyn<ݪbj h|H @K*@ѩ mQI 7%-J:qI3*ԙdU'ц5ZgǫjF-,yNW22$c0LhcGp;^&2Ȏ@vtsK{5wV"K?ˇ" (i,bPu-Fo\"Y.6"W=jEEɱHƔXbciOE/$<^Ix,H-#oU! e0pZ/`XEe0T,F]˸Qsf,oXrQUX(3ωec e0T,c\XBcide,|u,c9e,_TVY)3\z%s)9e:5NgN,<,YSr:˴FNg96:BTFRJ)Ѧ>qbC (>' xnnE%>Fz`ą: }2,̮1T|B#ZB|"Y|q+uz}GT* rށ*ꤠ,KAYw:w zy*k{) :3b^ BUIAQjvRP8^e]'ճ=݃<:/IAQP'EN Bz`G *餠$D]n1%nF)(w6i6g "=g\}{z ,8{vtFj~F2Tk (:0o0g] c6P[ntD9aYLɝ3Qz]MM =Q*ә@z H#J.vdZmHSWrt@MM,k69#~(0➧Ojmʢ>xI^}yl]"K_O#[F džWc(&\U3*vI}#tVoL S~R+DK;γz6ά5"cO5ppĤLu=Jg0;PF.X6$월L/Tr>Pc0M/9aQ);`pyĴ-7\Aɞ[gGA)t3xY²(JIz pT#)&:Y)8u% A\>O^%~L>[ ;tv[ -bTU9֊Ф=Gpf}670ň2œxxMRX2az6Y׉;GGi`jblB-!\爛YS9dDq!:0eyĬh儺qa3ݺ$0͢ll$7h[h?ӫ6sXecy-GA;J0ڊel^63PGv$kZRg'kY[wdI@(93Wq/_fֹz\\}w,dY.ɲTsPZ̨HUֹTsj~dY*ɲTe(v,N*dYN̩*dYvg08ƅ(ɲd,KB8&=㡽:YL~x8>,dY.˲T:YN%;w,K>,dY*ɲTeP/R,KUg=Cx !r0,˲{hdY.ɲ\e:Y f˲TeI{% eY,;B-ZNj]B,K:Y u,DB^9Y }fYzV]BHʅLƬ]2,KڮLDdLd0'ck2>˲L,;_}8՗C}B,˅zYeP'˒<՗֜u}e:Ͳ|RhfY*ЄHstl,J y}H= CK{*v 53hB~sFNg(8?Zr:?t~t<)x󣽚OD͜=SqEq~OQ<ª2OΝBv"Ws'4Nv"J[&?ى0};=;:ڹeN+;6(`(WQd/#id0mLS) Ld.9wP--~2lz9Bo"+ζ騗-~lY9zٖMSMBɛl:;+U@/|^*ğ+ԉ?W5; uh.AО$=YZBs: uğ/ԋ?Wj~ğN9,<Qƒ1% 4yڟi?'r}|mN*k͟@`ƣX ֡@H8P C}}ƌ(Nq\ц4BhdЭFJxu3=-[]*j-FF&O7b֊emqF de` Oz ]|ĕjFYIKoQ|@;1iNmU9Fob;N0T?vҝYL~( Wf-l4i#qFolv);6L)vl>QZl{NGtR8_~lxgH+? Xu 3Q׹An6&I^}?3Ie&sHc9Ǒ՜ |Y̏ai GX#нmP=N`,fd 1h̪t>NO4A9Z`@>jA „l&oI A 8f+;תaٔ6~>!e 8FL|#TrxPԆ%XQ57>$;iʾJ3L;؟ 1/µEfR:}6FL0=bK&٣>5y3w ϨUf2?]f4Ҡu0M&GdWPn̬S6:g-Fƚ[ʬnAB?'ǩ^ՎZcbgF#椺, N$pJxT΍]yVlDRVi[3m|~:Q;/}AQIK Pm3 zJל cEgV'!g>d)Slq~˥oflaqNw7oN?:^ jUNىReH/:AEGœ?: ~b'Oq$N*$Nmw2 IX-e\HXB?Ʋ*IcғZګVP'Ojrgœz ~U'OIc=ZUv>7 {H\ ~ |&)ISP'o^B=jvTG8`Qџ4PAzNz ~PoX5; ~ uhDk{jSz+PK@®%)ISP'TI[3+P'ON)B&c֮Lƌe?ڮLDdLd0'ck26"WD} (7z ~ TY'ONYԗ՜u}xl''f%sK3 u~Fg-J3ׇD/ (z.%]Ώv܆~ﹽ>e䖂[ rtpKBzZS)6,:˻6GMTYySmwNY }SΔPgR]j,:GU 4:?Fѹ#mwisLCLP;GT}}?2+#tIˤL+a($-HdV iyά@2PzCO (ӟ JO*$3?Qן.O&t?Qן?= OYO}0t?]pyU * 5ӞSymW)++WBqτݝS1])E.D/J4Dӧ?e?%z~ScyxF^718=&/P1o7Bi 3wԜ\UL"MC,?s"S0f=^`xCc zy̅LYQ(kW<&++Pn)D$zy'#!~Ć1._1._1.Oi4zsHׇP#*^\^\^O\^O\^OLW{%F#Phg=FQEQ=P\unUOG endstream endobj 93 0 obj 7571 endobj 95 0 obj <> stream x}-rܽb_0 YGrD@^ q ؜ȪA֮ENYl5??O*_Ǚ??/ux7K_G=w*@AiA*SU&]LTp2)䫉2lLLL)L.L*W|~5I***sTQ&^UgQeZQejVeJVerReRRebTeB|na~RW?s?` ?jz_Y li[z)ykOH[l}Ñ%yA hyY@5'aiA+'Ts6!Q{@Q!G@[DWT⋸ YzkRպkm;D4ky 2gEqLj>3ӑgkހ}[µqz aО(22kJl>^xJONWDkA4(>hBYKCYn꾑{jyeEӂ;*}4a!^56aCks<6,c¦9E5jίmgF-O>тF+td%2 ,2򉽉$|]/GDG8|߄Dk' *_ܿ{^e`WL^WosCbgY! ׯDfEJRyPQP- e1f 1w6Mו C*"3_iQSŲ%֖L"S뵢.P'Bp :aτ2 PGY)39yF<^ψ7-Ƹ8DX0&#JdHϬ% c/7_vJxڀr]fїκ+:7S(cv@,eX/VQ(Ƃ yqLDs#Ri^ȗ0Ouբnm48j– Df4fnR|ato͑ȈS97l,s:f_˹_{dA}L>A=k c^1EE//E 4oܿ{0`D7 $h4ApB\o~٪gwdD1N C.bqJx,Ō K1cHkVcG1@ 4Di}6a+QC Ϋ jMtHѿWm[PzEhb,3҄L1(1F:BY^=gpb!Kg"hշ`۰{7h!AMkcX76@ -j'EO" Gm={R3zԬݣ ڨPX7c=~A_YsF:~\?y9W2mi՜w0na[*z1~ PGۛ%)~ bx4DŽe 1cc1~6z )w)~<@M2'J$"Q ˍRi(5ĐP^Pf!3 sRy])6:*EƍOk(2l17Sq#{3jdQ(K[P\hՒ,H'ҮGzuUSJ1opS =}(EjH}G(8'r|wZD/J5V͛5̲4-mÀ<4qeF nO>=98htcFUxm4ShaBζ\kY=su5^v" l7Ϻx;eǷhΝ}t/tϏ)_Zu3<]pbg7s+c~8KbV&ָ2WtԳbt3J cȘebf:Zĉb0y?~BClDQ2L84[#j^4yeՄR=޴a5}ƚ˪>:KZ+ip(#8Q22t`gQڜ?PڜѺ6 lնJE닪ovVỤstEAoE7_!/xP}=,EHP+zz:=]5A5$oi(ȏT'Ӓh~Mچ{HG~ ,ϺE'oA'~zc.}(2X=vvta,%wBbia]а,e%Di*{F7]eadٶ`pfSZev_j&Q[͒:O@>hn\]kë]'4gÂt'"z9/Ȝоqz9=ֳ=A|:n,KC bjBծk( oi.%1=z՞d'NP-ߥsujY8$m_"YbI4w q–$4_+|/N9_ kY-,hC*{;Rg# K"9i)]QlQ*6gjeDtśTq\&ځ5٢+ow&%vYTٯ{wzyβ=1&=EA'vޅ|mzB߮=!r]; [QBk5903NYCQX1: 7}$PQMYKr ۓ 0C@JNEW͌ *y~i%t;{1ӹq*V=#ĔG/eibܯˇ7tX1bBq,˛![N(F㴅3 %-ǥ.jKc lC峀<-K44ddRe֍kUZM4e.?_b?cZ/ ƶ'6aM#mz8*]bKE41N~ܳjSp?dFKeTl;_ 7IPf<6|ޏ{fo'vo *n|#7F(F꿸f)J-T=ٞ\v(og1V=a5٣E~1DnيA!e]?ׁ(ZsH1'D y፹Ờ=7Eő ߺޘ - @5{ #mѿ?eVBx_c>Wo"`m3HעRR\1:xpw.Zᴟa ޹nk9RZcm×e=,V⳺;kRs 9zkntkŮTYUNޅ+FXXtb7`+r+L|L_Q -e`"UXP m1sEqβKOm`EˣtyXG8WMi {U0#޿띜Rvdwqq<>ӵx{"a5&v;+FgjsvUTc;vVmEt\e * %e{AwčB}Ѥ SJ1$4.t)m):ASu={%USC@SҜ6*y#骩L{4Q&KHLsэ`z_=mpxKNg+#`H'Q ϝP>C':)_{w*R:4+e Nx> {"}罎& K͏cm1#*gkm;m1VJ!S %g}c=eU6Dޭȷ,wxcx9z_ o,:yT=N6m0&PP߳F}MAԗr g5} pKc~@5?(a9?(i,hu\TYͪ?# YQXNhM!lpPx*мP*tx%^Ai6p;^AYȂ/QzrÇYNF3Ū)>_@S1aMNS<'Qi-LŞ.4χ\='0;^wc{+vx\rYNx஋Rxi$.Zqg_eEXu+y7nzct/t"ə~0Jr-ZAǮʘZzcNkshE6gBJˊLַݘXvc.3ZOrk `wf1B|PE>(%b<2QV䵤;r͒~&:e~_N ~"a"s,8} {4E5XfM "tpm?>.5q8JSsyGx<7Gxܸ <.S&(X"q},6{dŵ;6օ cafc]otƫo_>uQ˨owͥ~ 1G]fѷ,Ou[p3?wfϷ<|c\Bo15]_9cc~d|fK׏n56']+,͑ GWnv`𢫕]?9H2' VE3 FvBC~P#?hDPcJUrpuDi]M\x0D)QM=#<ޜ7(n@SUP\>E'<hbB7 1>U% 9Uxͪkn^^s3V?:>3{|ȘG@w|hsG`7oc7F}Ӹ=foON(B2`Άsf53!q˧ t+?Zy=;9|l+5|YFDʈ|_߆ )-"}eDd+,3wmP)N7)tkmNu6u$W ƛ/:Xou"lTܿ{ IOZz Z$YzD_IH( ew#e`&-!W+Ps4I]r{Z( X!A~>^W8Fƴ+KE8kegs{s]~$0DLò_-z!J Xf#!s|7@Y᥊ߥe/=ڵr g\ gӧpF8 u~ŏ%ـ,풡 >Gmɝe ~1JU Sc>> .6{zCi- g,)ۣ'46KmӔ`hz]c%R:=`d1-(IA4Jdz+I*"jĿJR" b %Bc0lR6* O%畭rx.b@D)HO!K.jvTҌ,e9H^3ѭ3|7"JꉶP5n{-nH+uq~Kc؆ `WN&/Ip^kܿWmRB6 LV|DP۬_o2!lϨW#HiL tNRʴVH(eܦ&himgN@9D2$c&$1xF9Dcs-IqB `[꘢ڳ+ [fS%xwLi*bRV;Z4>ގ_Hz[G[ZK/hö́(n8ckoAmPfPfgDa %Rp&2(I!}FdOQeh"SS42tJ5'%'Ʀ)_hS\,E[i(oKx)z83Kgў4FejG1":Xr:8FP٠#T'=SdMޞvNZ :ii9JhL{8RjԖOjIx+QrX }T_*pD/']0vA8 z_.sS~hu)$]:IoIz+k6Z]:IoF $Z,B{xN8*МP*t8D :z=&s`N.uzNۥ wβN^u2.5;c>.p& dUN\1V6me1VZmYMuD[JlmUh+ێh+ێ֕ckߠ;A?@A?5Q蠟.1ptR=.':g~Iul,3XPgjЛ~6~D{n%KY'b[':sI:$A?§n$Tg45GxЏ~#{ӏ~ǍTDF2"S#DHI$cIǍDFH8I}/d+A 4M d+Q#[.~P/ۂ>y9ܖNuqԋ:v^d;[dt[:9Tl7ί:*n l,Mld;=|&[SF§nֻVY` [d+|&[!M§n>uhxlɧ;ww)iN}gagP*xV7*tDg:x67 oU5Sn"M>]jVCMxiwͳgEkoYݛg''ϪS:yVg#t1ZaT3>p4j G3EtU7/[ e2vm)ҙPS(s>PS(]J5>EyJ4[r͟?g$dm=*t@e 2.u F'ГU~ur/8j,dhU2DZ=4n pP~@oy)dku)ƥshAuAgkF{ w(9(|&u^֥uAܭKN]Ty-[*PPt2. :Y\㺠N&urN溠N>ץhtrJY Ed45s@b/PS7C=h]@at/7qz05A>}W:Wg%/3e?f %%QPQtF_dRg)`@,ejaU.]!T~"Y.q(g~~&ilX,hR>4U=nQRB5Qo@|D R*=>L+hLqYjKf}=2_#FۆR{*صwؕ2ѥŎ"8Ze#e|mƍhyˉޅּUR]K2Hľ2s3EOUP+ Gnƍl)Pz̖Hlgr<6/ˑl/.(y2DrI'|ReX[ϴ9#)蓔L mTŽmJ@ذM1֋bm>9fPմļf~jǨ&=q7AӖc1lD} XR`L=C[>X ͱf 1M{,=C*z槆=ߢc%>V h5?^dXl^J!mmG5@wI y{ 0&d!n9p·x(#DސGAb^ Q1L :QѾ^h#:$WPxͶWq#9YBMaHjꂒ8}$5@v1xq׈DF",%č(l;RW3ҕehv-ᝁ:1c%Z">Vd=? &iN7,:ҊjCvz|K'̉D/D Z*K[gI2`ڠ;+X٥,IDV2K[keU t˖7:ˍ/tG$exDQj~ly,mA*ۇJ?1*-wqP/bɛ-5Z:He ?K3ߒwGڴL {3si؛"H7AX|iڿ2ߌ :+[Y[Y"+ʲXYeT{Ei1I][x9ݞ|WoDQ6&(Ko,B Jg-zE}9kL&jDӐuEi3~RĤ=oKyJ_]ٓmaCqUR3Ef7a-@=z#MK@ %{B`<`lxW/hzm'*KO2z 2t4!wRޔUӎXכ)c;a7j*׿Ŏn.៿x: endstream endobj 96 0 obj 11770 endobj 98 0 obj <> stream x}%9ݾ"׳ *ލ݀_3n3y}_Q!:L4 ]+EREQov|]9|o/?|_÷?u~*򙿅/7CQ-ϖEפZiUOAaw9DRZk\UTH>ʱ66%ڤv6骪My6Tmry)gro}^g_coL->z{olox `Wf-u<=0{5 GC AL&Wvh< 1o^)JPj=-<_;N$=cFm@/jThU {Gkh<pG|1(oOVlh:ݔfGdЊ4L2h{>Fc8j5 Uض7*PJH3J0&sCI=7ΔthCkk qÉK1zRH6~sH'eV=+65nA'ЈY*unA27KKj W>ԗ6#Gٌ( ik9˚#njLk#>6Q*S7_+h?+9ufЊ TˎWl np?klEpj{Q%ٸ%pQKF3Le_odϡQ7=E)MDq2f6h7 їKv䫏]= L߭5Cčzm&\%m]\炅T8P3ﲗywѺǐcE>m)Qjz<9n42*mwslHWF~H ׭n6kW8X6'_ -ʆjWQU)0mQ m&*)t{I| l R4 Dq*3Q%yк20]3Na`f[pr#t<Պ te@a+;́dׇ@gӸDW+-:ѴjtvڣʛwUj1~PҞډk'- NXAY;DbL\QXb<X XcAeV_JW;Q>~;Q>Ʒ:|W}K?gFZ:3$> W.:}|o;Vsca.e{rMf6Xg|{ـSdꉜ^9|.Q pz~ й;~TO ୓c ZH|Qc\4Fp62$*4GIT0J:9Li΃N(:y[`%*P,E|W]7:.QBd6]C_'5Q Oʡ)Z<͓r]xRg yRgI9 I9"!Cq+oa ZXCI~5w-b5GXCPJz#b5^J/FXCE:*r -J"8ە, ] 4%v)t.R]]]}. K5۾W{ɷ9_ ""rRjOFN➌|J^PSln,{Np8Ef& bn)v pL)fB]?mRUSHSKS(ςzI}LljBg%D&Ɣrܧ¯~d4@NQ~K|6W#K(ݫ~ҽ?{@sxW DͽRpt^=ҽzPВ4چ{yWʽR=jDRg;Jͽ<ݫ)'C5B8WWC%jС +:y[ hYDB'z0 }Pw-w=_;)n ۃDs&@ !{{z5޾= bfۃ-7B[\C5bwfŰը#T#8e13P7#T#xqjM#T85B5B/R=v9eNr9 ?(VG^y:VʣбWr`Dۂ ?(llh\}^l-X F˯X~T*0Q=~LtZN~(6W[.S %@de+j{=/4ӵۓСt #pzF$ (ߒȝlAwԖ.v7]&N4d)`Gmi[폀mZ-@Ǎ6z_UK t-xHk7d9QKqgMQU2~|(rJ=[D=4ch.^NҀ*>/Жy){}4_\:pPͧ#CB@aZG8ZJ5;j|pv᭤F[{/)NQϖђWvx&:w&Q*j+x*G Kn}KY|o+;hdodl7m7@ 9jõF9)l)FS9%*VJ y4ǐ6kr.emAFt"T9lbSIϮ1I^Eh#==XU-5*S-q~Vwroy<ܞ{~ qv UnD5Vq^VXtk͍*"gl\k\[fcCNBfFmӫjU/ oɫz>f:l]bՈ"_}K_q7^&{ʩTIJ>Q|!^|$i>X4L>ʠG_6ZњHǟNBO@cW@Gh)c6WW*̀|/]ϯNa=Ey [ұjoh'zoǒ@E %=v (Ɲ%X,gةlrЫgW CKñD9,z Z-y5DBishuia5egDO}k/ GWkQ,5kΤ 'Ǘ~ٯal^5AAY4kd-a\{ʴkemL+"1GA*C;_<=*'DpL`EW,V| uV2V~ye-x-sKқq#.e흈.ɶDxmHq]8E(OK(Z֗C).;ԓߍtHgPv/Wb-{ PC ꬻք(] =@FD H^]hZVQ]٣hdO 念mU:9= ŧrs qns?JoRP)|h6[V&N PEW1ŽV!С8rs)ԚS4縳"-:^)Ex{L59#DU9!a Iqi_!e3 (S$AHxM&OhyEfq@/c-v\C[KOB< %|f.wEPmJ< ^"%t{Ed_{@ ]s#z{NGDtCɫ΀<~ ,k̥guݿɃ .<.2'J;u_]v=/2]ECtד[ko_ 55s~]V39s 6I]=yPZ̕s dz@dO/޳|{T3(hٲ'$Uv6Q.S\ [ZRNQN:%ڀSIC*#~b@/WQAf8 FAdTD7 Nte0]D ia%Mf]ۅAtmѡ ЅATAT=hhpc> D A(E :*6ގѵEdQ k .WNuAt(j& 0-Serp *}Qܔ9oS>q[8pGK pa}tj~l gȆT9d݌8pBNQY Ʃ\z@9IIsDjjU>tV?]E޵ux] mx_}oA(# /9eQx5# fЈ»ٷxBͯQTKQ5j5j5j)NZj~Z&+85j5\*َZJ~#[ReEh-@~׊j֋jZYm%zQ<gKwp_Kvɿ`Ug^~h5q6 n1tY-L0υp ?Dp;k^{~Ĩ/x觫;=IctdS;}Zt0aPV T:]; dZ*}g˅27?=w/Vg19=r}Wte_]}/#N/@sUׯL UY^x;-Ȫ)=)/% \BBZB#2PjBBPjFZ%sD\\.GG% ?>(W+.s=el"<>z"$;_΅m|1cԮ\՚aZ4{=BPbO*TX#ЂÏ4o-&DC ˚rdqxߖq+{N;/hKxh柳W_Ἦy}烸ҁ|w88x2mx&6R^K(c ]CQ<iW-ȇ+36@-iN4eC(㸮$р}''h>xu&S@TyE3%@zAz|\B=G~s[zȧ&Fv@.Hm6۩9fn%{Bќ,mHy)ҍӄn^(zz(ot^QۿJWF1o:,eϪSу}ڭvTɞiv#\1l,UQ9_UIk>H[SS.i3Gz -isW^Q[l&1&=ֆs`IDXhć-uFx P^^=Áx wGr Mofh<Vx^R82w<}=K%BleJ>Bπc1=F' j۵#IQ*Qx,jŹHT-EiE F!,ؐ*Њf#Ոryh,XI/|E :':x@GR51GB9 d(]N8*YVEUq4NJ愼dF;]xJ%շWڤj[ v8_Ki0B!UϽ@8Ԙ,`heWEsf@RgEI]etk3{:/WZo˺=3E̞ιU\~WKc(߯E:l2~GΥ&NbJd_-WyؔP_}de'2zNӘpHw( m66#Ml%/JkM`=9Am'D~+.1~ij+fue,vK 5]Am^xp܌u(ů=Ư躿ZC7?/lI )k^e@>{q钺C@TTdEUnI}Wxi**d;.S钸A,kCw$UgTKKʀO]^Rh%j욍2b,t5:\-vb1w/wrlrQXTИ%&O4BCpC>ѭ K3ym$ &L շ+<[b/i9M&JT*rDSP1v+JQ-RS?6VDIJW 3Hxz6:-t4ֶ/:گhU:-/㝠:=pph$ψac!RD'thS66${ Qqx=^nЩb0#K#_DǞ$ˆ((Dž2XżjMFzsT6Z%ZomԜάU`BhfX oCQRu ( f b0mE!E(agzJOY_ڜ؜? n+[80+$/z Zrz;wDG"GcN=)) QrzJr$1^Ѿҭ+w.aq܈tߠmDTA~cczٖR[<(ȝlPM{W} x\z`h[,8>8^ODm+G;T5ΓT9d7&Jp0Nt3K9LH. &t 1y.{͛vŷ'JnbOWmt%#P!;q|@(z g^d AxWaSHv^#Y#Q i3sgn (E-I[e*FSΠDHRSJEB.* 'ku4\PWެ|,XiŸh#R2?Ey\k(Fzs R5hdF.UJhS걑Q'~.FzmvnR|ќ^E +\hiFF7yUX; /cëʆW%ftfڋirw[eoGet< fgxje4'XWFR7QZmErg}MU|:8'TD^ qJķw(\[*R*&Py\'5̞17&JdDs2UPFq=P))K\UEJ(ZGɋO\ 7PfMɠMgȑVHOI6u卨ǔy}9"1}B:Arfvu=cQ^5ނ4w[p zҺκQ%>cvC6<]a'ks/ %ߑ3_җgv~g 9 lza'7,R'Z[2+UEڮ91Rg[N*F ]i=D_g }9;F.P(+*:64RQRlw%mb7g&W D^Q#:Wߍ+Ir#folg!(6bf0*ޙtW\-L(-Um8k7W4IɜtTC3Ior6ƣMi$٫o&L\M)T=YoeDpE7npϾvg\L#JQu5w^Y4 7l@_V񼋲i^6V Ѹ\ΙV$me z@ ]h]=tK{Jd)˕]qs@NDibW%ݕ?$WC:k1$5Yb X߬?ѱ$Xր??m{ endstream endobj 99 0 obj 11504 endobj 101 0 obj <> stream x}ݮ.9n}?žI_s2@^ v#mY]bq`gHQ%?2ʏs1㟿?|/׏qQwK?W׏k ׏2 ?H>HLLI2)SzceZeejeeJaeraeRfebfeBbeDI#++S+S tV"XJ\{D7%g7J=V ø%Đ|1]j{ѾBۿckoK߆6?/X;w`tU>fGhh;׏Ϳ"Zm~`8#Ҹ ix>Fwmɀr?ՊLs"ZQ:Ŋ,e`#Ǧ#P] #F:3O+?tb 6D+jMYQ.Ï{+LY3c>3vs^Uù# r%#8ޏC8\+aʢ%n83B<.賵 52bIUhs g}MLׄ8^(7hѩ3-;-VB AKJ27md_ZY9؟jzq[u2 ިlP)фŕ(T61}RnSNhab,\5@NZ'E},SO=Ǐe\yD<Թ| \N}aMqִlV5)G2k.Pc5WYWr@⧱v{F6pD0#ze/<38ZYC^:o$`c/QeAAhB]Hό2րoC]h fg %>~hkxYg:}q "AW7 -1,J A8Ϣq1}0us5=ۊ6ߌ5Rh;^8XvO?0~vwxzgA²4} V8lVUu|BuZ^p+6ӎY|,+ r%:]Ѓٱ%|-|4W`moC6GcU޼z/[MJ;+o` 횚ㅽB+B*?o4Q0hR5.^jϠ92 #K.'L/ {~Q@m3>U5zA4lوR;H.t\c{I'&ḲYxFhuÙ;@SZo7q}ճOCcDw6:P~L%;Ӈ@1S)W\rJfƜKdR͇u05?uߢ+#y7܉X Qˢ6Z?VxQG"٬&ʚ"9q٬ӜR1,?׬&O<5\^pg={Є5h`+-(Q9(L*^cr@P`mEx@yqE7ihIg%DZDM5W @\K bqSC55@x]$ 5][bۻyDH/i!. Zavaxf^ӕ/Ds3_MPH%V1U#T|̓=Ԍ=1Hu(:H&Hd=i](`FM2q۹ mp:&\-r|(9¸dCǸmPM1Gwdwd)W9XFXҔK]Gt%߹ -.a"r mA@ a'Pt㎢' Hc4h\ @"Ll2"oefHlvM͒a,mVgK5f yA m5a4 '71OG/n yroPqt8ח(L#bT!/7cD` `V$V3Wg5yt쓼ehduI?0h:+~6#SB 3݋w=;̸7в8׽ lV%yI{%aWQN;S=Luj+l.f"YZ^3M/':stv3pQ.D],ƿҍ{=60'n\gPyqe]$0%Z𕖡%1,\ hWu&5<X4Ƣ96\WXּSȡqf Ю͹S@tƑKȆn296ŖWzdfT7l`%gQt>Ȳ^g0=6WUh  qy+dvPM] _MBsȋZ=iAWqѱB%~{JG1l؋f,RAn l5=^Ҧ_'3Jju ~g*;wk*LCށ)Mu!S~"IWrljnE`NL٣:e` KCЄLaخ3=,PQ*w`*dgd0?F,df慏Nˎb I ̃6,30fj`VY˼j`O!DA"xǻ@ͣ^A*Dh@=]u̼W*53)xsMPK@B&o1~P  CBCojcչ̕ƅ.Ƭ]]˺/avu1&2c"YIHo ߳ ;Te'ltwQ_V/9%9 wlM&Shi,G%dP%Hc #)賄U #υ/\E[\z^u5@q7ǞD`mO:oW(tY4.1b*u}ǞbHbST _Ƿ܅we[ ?/г[QT< xBVq7X(7W܅mg҂{KEHB@ E*JA B'nC#őBUpC{IeaّY*;RP@ o0Tv)<}'RYhvBѶ8s}Zo%M DDhJkMˊkM{%5vC\kV֬Zoyۙ27<$ε8׆,q.54$n8sQT\vq%$q.vG([HJ0Po+PZ5dm7Ըmq+Hq/8j%x`Ն:pʅZţqÉ))JJn+Aajw~TDK & U~PW /mhpA[w;oDlsCQ뻵I;:ݫpHnzisֳYφLk њ{ \筁D5Խ@"?Y5I@@NY듞01N%IuFJI.3J)tJjZgsӷ(5EDEjW"l(Nf-qEۈHl٤70E*V`S;SEsT` (&?cہ59.dʼvȔ9ĎM1){S6Z8Tl# LG2M zGEL4(Iz0\gMB̓$Yiͱ!SN|fuc+?$ dtT:|P’P/PwCM-NYٻ'ª@Od!Uf =+u     }hR7gH*TxK*u7UΤzEk^`q MXdeuSz*6T- ,MY6Uk^N腎HZWezPs81)/BQLkJlX Sj%N`:VoZ &Tb%8:' 0 ) iYC/Lf |.go)$j腣妨^^Z_7.[7C/^6] lq^c0eT%` lz} YB/tzd`^@yʁzYMSuVd ȔI?)½S1^hz5Keu)3 $dʤ8 ) j/ l(O ^h$ty^hIyLSa%<#`f 7Sw:q' u Y9w s S:SY>͘ʱt*L+kGͬgO^IRxYR^h%+$䲶.Ғ{] 4EH3TuG69Yw>V|dÜZ.ҫH"rGv"M{^sGSHz&{&<ދ4a^꜏l5442or;0eNmtf}E5α.Ҍ)]xt^eqE̾{^2L8pE^ "MxE۽Hy/Ҭ^]ܼi6Z]ܤQ$I(mPH  V9YwjNyCS uNm6ujaΩ͆:6g}[dH"{@V,c*ϾEz"[huDVWַȊUKW^)g$Yh䥭Ҟɛd=7B{&oL$+홽InP9+=֙B㭌)柾I;Yan9_}+ssAM+ 4wˊd@.{4_/s4b=-&]6S,1|K*޶i/Y>B@.9-(VPYNhFί-tgs0I@v$bꈾRNxD p_SN&yQLvg1:{JaX6)'/fC+fxf{k9fJvʹ7:޹S)Ԓ׎rs];5g<Vte[oǠL0#?ӊ`?&d,~WI+Y?SsGkgW0SiN;['ެ+,yØ̒7q4?WJlrlPz??U:gMY0υkdAJcOkT$_ QL"4a^pN/2.zX7|`2q6QAq^kL-78ן{fY M s[ #@M"iqXoõ&)˙[/g7}-.`.OӑZL''IWQLx;נ:WDU61 EDS>R+UGTI߼:-=O2= Y1E8k0\+<{3yQlz D!'0|,ח_ק4O|]>ivdr1Ey}n2Ei7fx̆С@?7cYc M˅{ ˿(|jNVy#:(]s:7F^u_e=zN`Zsμ^kGT=T(R=,䱡N& u2yln+dž9ў"^TD*T0PB[* U<.Ի]N&řl%z+d,hϚJB:Y 7j֥Ky.u޴gO7`˱VmU1s9ڪc嘞s9\>cc嘦s98@T2#uKWQgPyنzB:6Y0'󲍋>VBHdF@EfAݭBBBBB[y[5ڳTrLP@ o0TVAݙPo+AѶ8X%Cu+Fm%XYJ^VG {+AjpCBBњ{+4JDkCu+[ Ʊn%ESJgc%JPJ U+񠮕xPJ,Գm3JX%=+Pk`eJ^`Q+PJo+Aj+YzVb Zs[q :u[ 5`Z ԴcD򷕠hwtӷҀE%P 8<pxP7P/na^aj 8^a^aq 8,j35@ u1I8";@d{x4@d{tp ҽFtї̜Yd'. -|@wözu7 zz셾7 6 6ً̮ >޿#"{@6VLd^z9\pjvHls*%ϴy[^ trl trleC.pYeC.[ͯ.[I'A{,31eJㅾ\aiӱ!9\kRu8&.zj%>SS.eu6ͳ낢Fl@~kչwEɣd6)9;4|:xEOLض(W/{'G8^d&]!.~C&7Kc.. `{˼c[FBtRlIm&ka k6Z?4k{lZ鈚+dwDQm7ǻ3{0*^>6>IA_9H=@{״^PK CbEɩK9}1|D-5~N[脍$y3N,wp{&nЕ̨g|Fj$D;“9՜rH iT܀q?njM)C-ͩcՈdG^ .3ZD$ z73~թ5 G3:сSs+RK=gC׼ܝʒ`jk-zk3Hky]3"1ƾEZx 3Ψ&BO[ u!xG>W2vEN'ACLM~иD L)|yƍ7`㐵r,E@k7 ،1=Ռ,~ߨP6` Fnm#sF,k~3gLϑ(I}%!㷆 !ApD 3ϭ|zi D7y5CF2?() +^4Sĵר |τJ.~Y v. Y@êk;w,WdJi#KQ/3w;2]OH05n73ė8!wv z7x@bǒ̵vsezIQl6jn5 ޼jd`nY>\8@QF.^/oU>TCy, 6>ZYX8%g#>5/eL"+)W+ddg'*j2J:b7Ez3JGc?tQ^/`w zw,XZ=vޱ070:5n}m`||hޱs^s t%S֡gob͘A\.$a\̈́t.enfwЙa ]<2 w)S-$d :de`noxaʒid倶ȴ! әD훉>SRz|Ew?} endstream endobj 102 0 obj 10880 endobj 104 0 obj <> stream x}ˮe7r\_cnZ<-?`t55ཇ\ks1u!HHenƛ`0>~Gђ??~ {5~ ?~,߿xQG_},uBaX~ہ~#{D۴_Z?P/6!aڅ>&V46%#}v%N BhesI:}F~hnPF BE)u)Åg$n66ҼN؈'^NT.# @3/}i]xiE =ohHQ+otp+BӅ5z0kXqGhF'6]8V\vc B;#}q^ZX m$ E>zV.,E!ې"FH+`|hdH/r2Q8x[{SDOBq $R@DZjl)M^o*r9:^HⵂPԴI\%I @=5ϿxjV7PŖĐ4%V=(-gio \O8FH.0 V\aLMTj֗o; JQ,[c\)4NvPH@c5vwĹ\@Ψ!#MBc14उıy2Twԋ5%fx}}?ĻFizyfԻPbZ-`|͚- k,z9|~MڌOq?7\"mNJn 7"(j E |w.`Bc + H3n^Xg-l ۔ 1@(RͨǴ*[A.1a^U@XPuN 7x-95q -7^ks 1zqG^7b1y1&&"psXh Z")"$<~}^El BIkph_{G(UVvW)˺BXI3&Mg.>#xFnO%]ܱ ӫydDcksj2+Eu3#cEu+XqNĊo)V\#yc(zG(a<RC{xra-ɸ+ qTP7(zm$%3&x}3T8gĈ8p%==(rm%[8,vח1 zzwH/F0Hüσ0knߔ`j(mgl[_ި|_߾IاK)#n墰}"P7&mMm.lmdȚN7VMѥ摙Sr Yx4rKn2vX+Y>LC~77fa`qY!TG\AR`>*(79s1Xi- Uヒ3rQ&uJ-2A.0*-eٿW #GyggUƤ]wLr5y fCʮ4_uf.O]x֪Ðg,sV.lg;?m<xU5 šRrSe02rQ,q(+S+@*]#S9pݦ,u8Ӟe|`^?kOWcVdFc;]rbOqzT& V Ӽ$ݎI4GJ#ȈbüT3r#p! PQOx~tNs CQ.:F%\$̵Hq"T2C[ohdg $P)P3G0Xſd'~98S9qA]8| F챁=Nq^,Mw7"ę|c|5 3bU B}E ŨΑXNj7h$V^46%Yo9[ Z(Ex/ xoN{o)[#ycbd0? JCA-FIg춠YE\a>#ҙP.g3Oљ˃wW)X૜ [1Q')gQJF2tˁF cQGDv9E7QViS̔ih2,XPlS*ţzU}J Bmx99I.xyuJ_óə]:8$DQԒ Wiy\c֗ Ҽ9])Q-ZBP܂~Cċ]B1NkPvFqmt`j :=ҧ NbҥP*!נO$jL٠##Ro8W9G9Py璄f>}AWm ƍ]r hC 53EOb"[1qDLb5 Dc1QʀnNs`!|ޒ8[JX=ߖP'Prx gc>#錮|F͂xZY‰*jF5h%O~2r&1ʚwfF\}ξssȧ\ܾ{OY~rP /Z-ŝT"@7"iZyrE%iU+].XQ$#-yEoth7=[ ]׼W*NQأ.4kh{mry825g}9oΨ]yHu%")oPkt1{5rݠQ^jZ{I -NnD|D| $TuJZF$bFJ?"t=^t-1.4kChE(Ś$W&=`L6B/6zdhSM2!06uhypS@ hb؀Ix7n?뫷A&PF(kK|Ay>4DɨsrFa}ƍ4=3{EjHJmI6$i9L>5dW/c:o}tj5Qj8zP17hX NgP'X((^C}F]cE_GvBI`>٤O1XszO2 QdsYį-C/\~9%TR}O1a񃂖 Ǻr qoRMGp;hkѬ?+b`qm72+\.SHMyV`tu]T=6 Ӷn`ZK]')'7}a]ciuM9eԣYX4iS0K"C,.I WL?ԲѿNiX)¥+LĽ<%7oDkeİ enTc18KǸ1wН,u"&}RB'uG%(Wv^ζfp}drFK"Mh H0~#gf6n \K--&)Oފ/Y+Z>i,m*@0GsI8// *#b᥶#3`L)c9EnK| % +K+ W| pVeE]%ђK W Joiʹ䦋 ܅5vw6RM-(pڿۥ DהG"5M8KT-NS[>.&-ag_˲ԙh/SR>W Jѓ%)'k_ Zj/V-&jZC_0!n*r5'V~q8o&! bE*9S =/Zz_oIvfnomEiMDp$7nN;G.-pnc>70Ęxo XFF8>RGeRd[J\  Y6(]VYlG!KZ 6)p=%JE>G\-R<;j9n#* 0E0HrGSz>zUF!Ȏ:QyJ% _±dSr/@|><_mqm"=kJRRWFt%[9:"D]s1nӡG9xYJy8w jMyylhOI*dz0Fkw Zh-{᳕o+M Um=Zu*aMr[oq<֌k(lz"bA\QT./`\ .І,˸%k%-IGYw:/x!hz rcREʋwZ dk㮬&(%G/xQOҟ]Ju5C^mԐ- 2Yͭb_F@lsk~x(Jb=}$Eۡ|kbIL,#:ˎFy^<=-MZBBrC`R EF<_ $hs D#h er]`<2UxFnԾ}V<Ɲv!G s[8Qay,*ŷֈ0 >ЮfL *Nlix9`ʂQYyX=74ΚL14MPSr+?&3eϏIr;pJ~)@ d((}J2 E|V"QKC3Aml8]@%Pt[&]hV4JnܠVޝE39o (_8sUcQ{(_J[ Ej/SuGOMop^W2̼aJ-.az@N(t'!5d"z);͟zy Da=jo͈/HDG^NZF墿c5tɾZ0 Dl^]Y[tɮ|{ͻRoכ,>YwF"khwȤG1oA0yOA5^~5>_&’wͲk Hd;f"SUow6h`lTnn+u_Icc-u7lkq rt!(L͋Cڀ.K-AlxRt< gB>BW@dzkz"P͑kX7(vRb~]/D$|kFK͜t3[`=w6D剨Qyʎ ٚr\xhW:fvb8t6͵vٟæ:YpK":B)G3|_PZۖJ= Ht9qL::N5BͪB@%h_a'*fI/DB\-F%CF9Yo.}4Ff8٣Xܬ gn1^6ԊZؤfMooϟnc ڥE{ @y8#S[5JslHE qQ.ԎsV,Ny9v8ѐO zu,-O WoJzƓYFt .JƋb^8ew8OkQi;(ZbT(;EQ ނ&ێ }cs44҆#OŁBWsUOXd{s78O{esIyo׋>!} nJ7mʹ2Ւ#ɧR3`Lկ)}Nc,祶FQu(:\)y帟o(IqCJńEJ#H@qE.PMhD(%G ("K:B)r(u:rqZ{rVm\2 ta`mKN.b1"dͶ@BHQo0I~r;fU.`>ۤ@G9bqV mא%VpYpr^E_N"h%2yl5['jނ86S |LrކkE{Pd"))$G~.=#Z&h Y)8OvGf+^%Ri7^d_ 谪XRyG[="#1VK|m,7yQ|dP=(ΛʈPvUhSptU;])1_Q_>xO@i祃\;x3Z?.(ǻ/AJ/ZCCJI/929?^}xڇ'^VZ57jJY} IRStx,ڒl~8ZXf2dcñ̆Xfz8<l_~lñ=YXfwV(6ۗHnRRD.ShܨLۼӪE'G\B)P@RiC bt3A&rly%u#BG/Ecew ZgA˹kEkD-ܷwtp>ma&ЂRp[rQb`R>\5:j|a t0Ife!sMi5Kwi|tdMH+Ji΀eA)MUoc}('`̽h,%Fաc*^̞rU\ t/gKe.*pW^ƪ^x17J~#I`HʶNCSANpzK VC VC)ƨ1aGX*' 7.>q얪2jRTQ\Pn֎RZ5W+#횗F/(]z0]d"N(&%=Y-U#nIrjJRB16ũD _kV2lM~1_JxѩXnXůlKNYEorhZLTg\j`M} yuQ3©Op#.hkaBi"9E~8֎2q8u=_7֫ vKq6S6M۩giQ,dcaG,hURiDWR9ʃŨnz\1_FKE{{H<=Ϻ{){7 e_Y`WLMiHTgž[g~П9/\07nqсWmAY'fY|pqF}eVkq^a?z=j?㓱o5$jq;[IG6#,9Jl;DYf J9PgT3"*͚GW $6/E]vH+xuּkAOׂ/EьV6#ЙWL}Tf/0o&:r:#Dx<0 ʭwr#@6+8iw䗭H~T=zYuE(#@z~2z"ﴠTlVxAϛ]|s"5X v[i81B%∅6(e+ʈf*i7ɋnZYZ3ΧWA/r^q7chDZZ ]bhi- 0Q#R̀1&HZZ7cC{ʊɈc#{̇yO"OQW,Gn Yy)p}tX긩|LbED{ >^TŪ9޾LmVHBVf%hWCw&DFd_Is]9&T}:^BXꯏvŷ.y+z0 kǦiB8,ڳ^ouCԐ0N5&) +iA(VueǚWcX)ǞkoَkktWY! v`č9{Fg/I^boнxy$E@> =:|agR}wn7xU>:C:7g1QDuD{A\NvCzq'.oō9c`;,Ol;&=m5.+h}ՍV'`;'^9Kgď@G :L~өS=Y u8{>Ttq:7hmǴè!۵Z,{mĵ@w<. JEc}c?ID(]Ӱ !R \(՗푗m$BgD$=o @ '+J Μ ΄jbE' |)p,gCAK>x#E3so!$fp <"$-a\9΢E[gg]I]޾ZcuhToRU%Ōba+؅QőE@3nGnP 񊮛8.bŃbIMOY& &`_ǘ=EC-`ŷ.bڧr$G $?A wŊFR%̊9ĈsK*8(n Q|gz:aEOt)ϸ|RƱ⾝Sb;2|\Қ{OhE=\[)~!p 貫艗ЎP8k"lݙCE{Mse{Ky$)-X=83 {HF lߥT-\ je7 ʗ,Y.0B6IMB"GdKbuax&Hgb$'R-m:TJu,=<Jy"Ɯt(Y*=4*؃Jz+=% .ZBu^kIJ Xsv9g&R K# x)L*sn_v[iGZqw RVi,VULSRGp[DcMjC YMYsƲ)&,Tg(k43&m0Zk9rf{Ě0Nׇ6C2pr\ڿo_误c?? endstream endobj 105 0 obj 11265 endobj 107 0 obj <> stream x}ˎm9<= xv?ˀ{ҿ76^n)DQ$>?(cw>5~~k_m_oo:oj֚ 7kOꁣHΆ#a)84<#t<[dM:h?gK[Dpڿ!L3sHńЉďj[JAɬWTBQxk(Ѫvdܐέ!߸çy$ @d Gr3H P փO1_8>%.JR@ \mJq1͜J?#޾ SQVARINu^lIj?e5izhA79O#|\x)2vL~+".CP9vт&(cEÙ?KPh[e.I=(AkA8%֋,OӴ(zq+9_#wIR:akRGJ헝|Ѡnt$V4:&| aEɯ.W;fc7M-agt߮7|^%*DC9:;&$껙xCαm|/"e( զ)U'~E^.B㩡#wbL.gB@s\/rLN]*Q83Q"1y+Q Cj)Ѝc9ڗ@tD#̝0?u}DEgj2" e#~ɐLNߟX;G~"27\rk̤H2 @$AP)nE wf oR;B Ka[1>Q8.\Hn5tbB}A':"h-GegH(J E>]]XbcKܥv.hp=Nq]hQ͌.iY1 ,GlKmn:B=yf,aMq r@(=e|; *7 ~eJ17{q-I_JDpз:asΘ诖$-.FGJUyyM٪^&?>=¾q޻VRV;.uPcb+ۄ4$'5pAɃ^);?6 N&0]=g9p[8 Q/yZL9T:-[aS$$ !VB ǜY*XX&N\$y`92֤e j"g%GT p[x{,(%"{\w ]j^}.1 Z {.%I4%k QQdο44+JMҲOS4ͺ=N*N5{zG/Δ=Qp%YҎὮ=YZnG)i'J{\Δ2\*/芞Frj'9fZHcH-JkX,oPksh8昤%;U*3o'SmF{_ ~B**UjZ2v MZ=qHOJ; Lm !J$ַ*ַKuBwQ4Mrq)`)zn06zrz_C=O൏ e_^6,2$5ߡ5'(ʽ6Au_N <9վbkI}|Ф} $?YЯ wyWKA܉cS+bE~wHm\5ubm9w1nZ9w#)9n ȹBxEW1-S弖T;_Sp=kԴ絖rF_ʈ Ƒ4RuoBZn2;+lG)uUΜkۢ"M46[7cJ:%7M' PlؖJcBXK uE5bRҸqO)(yÍV-ŅL2EE$Sh6/ZL=6f ˊUe\6\zreGlRv1-#m+B6w lFMn}AZ`"T@ɭo*Rbh)*j[RR-/gD?L*tđZ+ΌmR<뵪^H7 ܓ9L8+8Ý/+Z e~ExTޑfWMh7_YCWkicx00~h5FV`ȍĎ9<@liAGG#u>=yu}\>VI_Y/yj%ʱ=ꑽi@y%Y%JZLA' B #3g뜩֛XR\IY]Ϝ ydmzl)](7nR8[Ѵhb Qo 8-(5fIvEVx IȂ$m)-ſQʛ p\_{ gue4h f|:֬ry>'-VFI%Smm6+ye-$Gpb%wL5Tx{]>! y܆Y/9> AvD*4ͤWiUr9W(I)VմjDӉ0&m\0YK%-=)s]t%-ݭss=?:rNL {X~^,mn%*r:Y>UϛdUY3c󢵹h qUZJP{/3p{VRHW|P/T* C$M듑_r+Zĩ]~y\Z_˾TߵFqVK}3bEmC':vPUzDDPr}&&FVid2~=l2H4Z]Sy\|:z=6%,샊X aF|1D7l @z m9SXHٲ&σBʈ,ߎ ">(V!ڍT)<,:+oh9QV*Qv#d}ixSDVV$Wi\&Ѐ} ʆ)wb*PWj94R#Fqj>)҉ΛԹeR߁@'΂P@EUxburEtxBp7XQ. lAGeWvʔҖOΜ4߳k楷"Ղ[ ?AZrID@A墵^ Nh+9oHnd*[8Uiz-XKr _pW -5 _. lRupNh;y%} .B]EuTrPr~X,#JGԞ_;xi d'`ijZ{hʍIa#)"v拊3=tƩnbZuqґpPv-v#:jގv@.Vڄ {SF6ŌJpjx)9eszb&\ 7p3J>(RO=)qEoQEEPISj4M7#Ҙ{VРJ̄XQSqqy-5YUQ䌻yeV+*"׊R.NX\Qw):9(=̠V@[:9e=3\-h+q\vFm;}Qތcm_(bepI)mH%7W8v-t(wٮ*=X#nYx{`:^k tӣ |x8]VП?Q=\MU|+G 2I|+s=;=n'!ǰ/)Z!όqGwRPe[w,tXzC('1*LV Y]ޱXQ!nBV#0I^sg־a ~RHO8C3Yk:Eܯ.]MG8{e*W&'FfC=~'g6Ɖ{M,Z-dRy Q:9*`?%QJˍ½%I ==i Vrf둯&kXKlcITKT\W,Z2R&X:X-`*#N} @IMpEtM7\/_Fvj.]kϾHքgr@HŜBcظ @5![.Z:jR&)KM̥TQ؅\EnV ]Tɿܴ\o_(1n3|lDo"䋎-z[EX 8yqkF*) -rIЮI_үu;) JT~M+kL(WgzP)"re'Ҋ, Ji%φ[kZNJb.4K~w` ϓ (@HM^!r4ܜ5oLENيƾՁf뾡|LZ:DYZ9wHY4ՁIj#e(WbaEpEtD#u3H{M]\=Ħ+%5h[YRyŷ_c^*8o7NQ%˙әP0Z/r%@nSso %rraHޭfdFAt NtL-؏ʱ-/Dza'rݬoemF^ {C]y4q- K@-kASOeD2A&'15t&G9]h~fPp;NR+wwJ]hph,q}JtwޤnG޿;v{ɬ8x${葕SV}l fwkOgC?#ԡݲҾ~wh>; *+"g$Rd~P?m:(+]WnXXk{o}4q:|{n` J &@ ^n9o J|TQ8:+cEG"kܣ#:-7d5ĘHzrR*>v1Zb3rvSr%\:@G'@~g"w㲅zsҚS͓:XֻĨc޷:n4F?Z%n0AEu1}Ǹwo?/?#T,ڜ}0Ҧp$v231 Gr \k{&wl{=ؑFؖ=fĠlZ tx1IEVv>Tz\'Ǩgrf㮘\=;|5Fk=BZ8׎:YOݣ7I~O &w廄c=\eڿC'q3Ul oPS" #r* @3[ޏҙ4sU^$_ȱ1%80ʖ 0]5g;V dt5ltlF{B-Iؽi˾ӕKe{* Mμ_mw.zu9)[qEOAUdu\ 4jkJW:>HHgru y[2k3w{OX %o]|"&']փcg\cYu۞q}/t<r l[u֍)$e'ێE_^RZzM&XnFu8ꃉUg{&߭\Vc-LW-Jۑw԰Zi')< uz(QV)j.MRрPOLWH+ﰺwq=m?#U_;xiUxfV=*7%AQpqG&B̘eӑԑ?=قP*Bc}yrP zVsH :n.=.3Z.i0I4!-%T'V"M[xr5wrwpYIO jWRaA(_ᛉr|\6@Iw^f)5Ք刺GЄܧuOP̙Kf>m ia a^5zrS%rV=fHދ{I3P;@J6<{q}+fRp,=Qԑ8v\řzhmHp>.mj&\@9Dg#ΜTx;q&".fE6:uTЕnEJQi:e6n~B¤c"{Ai%9΋jH:^rv9FƜU["wZw֨q uĊ֋vIJ|3B'mX<"PquR3 ,䇢jP/dw|}@_󶵿j&|ncxSbuPSn$S`h;\( /496w^^3(I, -т\r!rl q`.c+r3SD-j)WyvNxk9FqoSXYRyh_@*z[\bE}ҊJ剡bsVvc=igM$%d7!ZɆQ]|DcL~h ZYZ VAKc]Gr΍%Wf;w9ſrNRIz0\O'JaJJyyqӹQ32=3X"RO(tWeyэɴQWu\-!k]xڴ*b뷆rN_G/d~wV'I/tc HtnQns@~6; }tQLK/X Mr5#P{\ 7U33r5EW2L3.} B)rN\^.&W[=8ց3(ME:O ` $ve젔r9ntl3J ]7^*#LPWB+"~d(g+QӠ g+V0ʌvDnft2!VU:'Q9XrZ1 C;jo9wſ~zwiӁ^wq< Iy@0-G<H3kVź69ϐjf4/U?wO|7Ix4ၝZ0/z_ʬ@"ׄpB@RнU|?7\W- +k RYCDjЭҊﭢƸW瘰Z~د">5ClEzv!djr}wN" }{$m%)sA_ $yw9cS5%+j'ut/uR9DZQGϋ}S?mqN%W;.BQEJ R$Baw;OO˕+m19`jaY^,*}A}f:޲ԙj:KZu)(50\ {a\5eK쫵+QR]ZiS!vo/;X;n;Mv=pӮ1&xDY P|Ӝ瓔4[.܏R֯Cag2>@7% { =sRMnR0.jqx;<&4e%=> stream x}Υr\Oc~I2-/8 Yܽɵ-{ԵI֍UE/^{Z_o/;˷WVZy:5yǐ7毦`qq?WWbtBB{Q/H}Z ƤńKט~/ ǿc4,}Mָ_ #;+,ہq-Ł L z?~ ma-ߍ-@ ~;0852oě=Fv2.#R&)ؽ_CNTF1w&¹"td9svF~h@[`A|Ep ݉zT7USԑ"49oE释V]kzG  ! 2B Q爞. )VqƙsF(k(O*vo{ :G2hd==: 4*> ^t5z3&@ ;~qC1`i2BQcP61G/\*yBiW_V(hB7[8shWԢŎ__zE^[:^>A; '|ҹ/+4E/DJ h:PCTH=T z*+Te*r^~ۛ١ /}ўL<.~tm_x*O-pE:\[|Yg)XZ7U<A%;Bqg gW4f3ۼ#; ~wDp "tZ!-3?E! \B!%=͌cqK>B}2f W;}Նӑ4k/vdA;ór(mc%녞ݍH:C3Dsxހ6/,sG[XZǖp-: E8n܈W n8vorxg^ F)E^/E0E!vѺrduza)Ջ|Sv2Z*sh{*t.}zY9 e=o;4uy7Nj=ZX+VV<S~xn]3 k$lf'BpVzÑ/u iAOG־譇")i7SCeDSܹH6<㸏<< f,zͼhW}!W+9JB,x+wj;|S4kc tӴ  緙&DJ@,Cq襁iҤuC $?;]vMb! HzcA-4fXF1n#y8sv (6(Nc'Geb9+z7bt  >l9Cɒ6(/o}\RI9l5b !aqzEjƪ˹JXT=FN|/vi~׉]zCk<.#V9ovQgӟȾ~xǷ >@T>߶Ŵ#!]510iwhgX7`A`EFz9t|cPw_ܤ%Ӈ3rap׽=`z!DO~ p- Ʒ3Bˠa*=hn}r܂}\H&$s/3/_P#p݈Reb9yDkZH͛Q4oNهLAi'dPyk,-r< wZv#9rGmcy:_{Γ;0ƒ/vƵ\lH;;:yw+'0,'=1oÒu D-JBYf z7$$u!Ewх3pI )5.:"xqRH\#~rq,oޖ^_UrO9.9$H^qwgkOq`fvhf֤ @Ah1< #![=Yaw9^ |k}hDWܪ zdGIء䆻Ű6ibK%v`Ƶ|'o ƹ!3$:$gA1"pB:p>:zAN *9 5fӈm¨V8)NS:̩ص 7^P2ŕ=psYVSX^MSm߯44M4- IIII{&1miiM4M(}NӴtׁM{Iw4-(9W]E&FMv.]5}-,e6Mk$~NӴtMSHI i 4M i>Јf`&!iZ"k8MӴENMӤVIH rEבSǥU;-]޿;oq[쇑!XXxdo00(RoSHʋp0/ORfpjhxțLo qڷ+Q[%/86Lz>|83 xWMý'ހ"PygFgκhMSqrzS)䚾 mbt"m&ϴúg^zMs|dE LˍځtC7PF\vtĻQV HCq.Y#n-&&'&ލnfd;X63e4;s:͉PF%s YFܙTGvEߒOo%=ɮ(%47녏*H%7ʢ bz>z>qg $V|6RFm3aJ¬0qUA滋I-n*m$F!ͮHـxkv|8 aMr 0> 08R陵aQ #?=c0عı~pz]a`^$ )P6U!1d~'8 r\C(F<ryI>͚ʚ(3"%vl]ϛDV$ʹ.#E=N+j4v8+m#{aԵlf2Hسn}! rmĈ8s\¹qFGj%72nh97_4Er?hIj?t?8yh?~<׸|\ЧA1;O t?OځMW > ἃj_ЧA /j ;/f _Zt?Oj/3';O ~Pf^3j /~iiaĸiĸiCߦIIiA?}\ЧAnzi>}\ЧA4M AE4Mkݧ5~p=lߦi|\ЧAA4)ziZЧA4M4uA4MڧA4MBbb! AwۀS#詑/ƙSSCѓcɱf }6(l"m[Hq 8q = J&ȡ?fNq DC-$@wf8u):{\ + !SG8Ef@oiFo>=E4ziFO`֚, :w!4~D'VC(2uלG]6{l q[wԉ4yA}fHYoJgRDP#gDZ zu.)&؞}y^5bB4v9wؿ}tk讅,״Xic H%/d :0p s;/MӌNOBYc)Ԍ^lގ#/ y}#k?DԸUuR|RtR$v` (_6D7֏Er7XJuEe*Vʃl@Ϯy)6$ڊ΋lqC%0/]r  c1~9#zBga!о }|D sz^ZqI_$3fNcTSW.U]H T[y&#Jvz8@C΄c){is-z@ӡ -6? Q$7!VȺ]vxQ[\қTPFlK7^YkT܉Eg ݂*Ӽ> %6$=59 Hޣ=.=J ?HR8q%};6edBHKA#m@ا<&Gݰ\MVtH:]w^ǔ=IvֵHn _C `nRu`dz8y+^ceonc׵>1"6csS ΂jW7ѣH FrԳLziݞoamc̱ ')1 x-Pیhk)}h)2]tie.#?PJ(bIX[3,"7p߁hXPWGa).P>B+#"dm*o־jr܍^.R; I}J*ʗFPi|3`9ɞު!Et%X+:;Ao7-#N`'TC]qc-q:~$ФdE7\Ԧt@.H; )Ẅ5ٰ"j1;/.I8Alh9..엶6N>PN*&ŸEj+ -v^Ƃ6 PZ3^35b*?OKθӒ"?hۂ֋FN֍g)ejxy8ЕT.3zt%`% %TzJr9g(eo]L lM̏"ɦcjgwu;?@*fH,t1voA&pEIE=!H7zdp7I/`gv܋UGA۠\jQ5:0'{փp;{d]SjEm6dz~wmA`x|6mYٳLkr洏w򉺒d*eJ,fɚZa<ö þQL  9>+YH<XH8! #ԃ?'"k XHc*BK+*-8οZ 'J )ز).#^b"pO)u)kb^ 9E/8E=7 89su7Nȧy:Ԋ#p^EUcam,^:V}x}ɒ]K+^ r^K].K>t}++WZݗ66e2/ 3OÛN,kvܻG'G65^<8ʣjt, IN`o6(Q{%&MZXΏGԶRG:9ENP 0{^Ϟl0ȴL.oaL\8ɞGnw܏n*EqI,bk#{[u=rk+,$<̓ei2BRm)s.vHN[J[N[@\ҽh {*Z{I~G>f_Rv⸺_yDݼ~!U5CVd%8w=(,wgV~fq4e4Hq? 0~eJCu^>xάݐʾ%Ba!_ϯf쒗X ٟglxPqQW2@ aG%/H<[?gBcETYc7ړ2 Hrn!xـ].w{٠lWo_ լlJĢg;RKRKm{nN1V:8]SgaV:#rdq껒r>ԠȎK* BN:|Zgw#Wi(Td-yVLYњKj-y8vH=Ot-K^4¼e'L-Jx)(.!%q> 0464a$!o89:cG;ީ1'?|Qj\dN_bE~ %yA^~֊ W ;I!\4f xyHYHYw V&vqRGl";: +{/d>˖sxr"|Д'ޱ}<6\\`=Q]@^mV'zntɅ+~=`n0[5iHeKE4oxAdZ)!F)]\R& VK~n]SU+.{ #Kk˕cIjH0H-47ʭݵn>+j*eFK)E C˙`A鹘^+u񢭳DRKnG\X,=&9zgu)ܜ&SuB 2G/}K@(6/[W{ʫJ:^eF: +vQ(ܸ$ӽ5~ =_|zyHEv! JSj90z(OxVP) x{N]ttVyy<@8]z* L\4"/-o69s~Ak$u(΁7=(9!:Bu,A} m*ٕVQ~%U|K/LY_ nN6R&(OאGo0Qԣ;_M9^MջfV?əcuV?){2VΜ7_>z:^Fr dVĸ!*T|ZuʝdrљK\$+絜@96gBAL?ɒcF;XT--єiMq@M*Rġ2!7GZmy~!xB}ˢ Oзf]Pz%oI䜅=Z"QϗyK4/VsWy4!XzYyn77Gh}̣^$t?󃏖ߪH0azm=F?~)syT4ib%"V xnnx N]lV$F9x<98gȥԸ$kBSt^PFeD#3@+>Y;{%^yq-ߍxZw7Y|w>Ug>աn3_wcgΞH2|(݀g>nЇ2 2 Ğy4tV+gNȧ2 PAt%N3t%Vw4ksSm^S j\YVո۪'1 d=3!mĵw>4W_۴gs \]-:[,lcoУ{h.q<}I6W~o.׳Б>4Wp}h.9ǵoaHKW)}8}IjgR5ZBj *.V? Ő[w\C3=C@}׼=}ǡC=9H Jپ+}ug^Sh"N5"/!Z@zpݖeA#D{.IIGa"?'bȨUʏpJ.DJA|{8ihEFQDG[MUq$wy[вmX>}8]+f\֐Y}z|6tT-@v><]Oppf#k荸gF> یGKTG#aF/m5jW?/M\7pgLHv"?gtX|!_f p;/9?Dn,h*JFՒ:{H_l֤{Q/ wpN R y]5^f=ČmEdYBףQѮH4q)&ݾ葖"wt1k<--D3OyVpұt@L7~GUlۀ|EԢ޺lPvoE%\;X:}mjϲ}fj8yjYϛrZq'q=s^X =/52z|ܬbkXeʅGH_(c $#5-I*6(ZgknԃEg`mPAz P"qzIփll׃DvE}p}fHXrԨUMZ*rPR3EF<RAPP_6Ĭ Q V( V窸;jκ93sE7D8M[y6=sN7)X-,a֛[R[qؖlMc<^/<ڀZњ* D{FQ+B;p$̔ljyƬ絶ћ%"jSH`PRQ,NcTs+*.O^Fy)MV=^CJm^0wU'3~OGbh(+ QIBǼ5B8~ʾ\pwQ ʈ:ߗzU@/Z?l@F> stream x]ˮ-;R8c*?!{"1kh!! &rˎb}b+NG8\ks|S=Wy_Xe=??~kmWYl=5}ڽ}]* %ɫIYaST6ۡllʮllҦlM,Uؤste3¦feST %iUy`UʃFӏ}??wӏ?߂EeRdm~w3xd&p/3xL^O`uɀCeCgDlZgkS̀~琑Xq~/^|=\Ʌ+ h1Da>vuvIx0DwxnO2OGiɲ?i YDw#"o[l9Ę|"xl?i_<4aFН@+(K/7Y'pdD^p Ku6史IV]On#591|Ku=ѽV?zFϊa>Tb+f3%#""\Qc-y <=aӲ/Uւ\ O^pe|boJ#z^da4*=gexn/Q vMʉc ]?4ڪKX15d.\b˕vG0A- maqrXk{HYr IrB 5 [qqhv9gB*W45kcti]hR0s*3 _MRazc|c0WFwĠ}mFOʩ62|lvC6i š,|s! ʰ8XmAl"?ʛH "H  µ|/{g9[˾nVHq;˼ewβcs,ec!/,߸]]U,x, r̖]氿|5n7c#7hލh1^@{voŮ"wEvg:"1/aע%bu32nFq۷blɔm@LK$HEmղFio4\Z>z(OԦllSv%T`l*F M^)*cܔJ F*lm)+d,_uVڑ3.75@pũt-/&4,4'oqA_q 'mj q~Jܡ'3DAsNX<`\8̃kJ'v퀪LXw b\mU(Q1 pRNgFoz{5?K:v;&/ޙpwer{۩Z D"bm  %BWmgjuxt/=[. fxt(%WS[Ȗ?b}uϚBm=eO+UN n;#mlum/O=~) tʖWM=0!Xe{8[򊱱 E۶m穧"5mP|jNe4lrH經-֠ˊ(.0>jSmaK<&,ZRŒ Qy~<#7j dB*H5!K-M[Evp~bTh bv5W9YD9/8rrف{NhD4/`9X䲾TΩF7ݛm}y_%H;@DȚ-DNs|DEwY RŹϽސ9dƕȌ*iy\RyQD6ꇾmKyե.0>SEu*[PYQr߳3v~߲{Dݣw@15k+@Y+V{'GJ-ztpЕ\a5(,wrlφ?e,eCOt*R[ӄQ=aR #E\PnszkuE˰[ptRzzv@A͏NVd+v|A@*K^\Y2S=af&|nה>Yr79KҾP:2a807hܮ 3lXn/)Y.>ʪ}UΒZG?r[K 62s Y-̱Ȝr˼ϻ~ Uzw/c_d<[2~J18$K+Z3$ǒ C^oW ΃j.;#(zXl%a//pAW(e?_fI9(g9܄X-u8uAXT9ur& pvKA􊭮>Z[/V=Fskb {Jv=cq,}WK8>?3l gnUOa]M!>5ضD*k1miO,{`CrPsĹհh'&4V+\Ck?x4DǕ}c!Mmsf[Zj)GyӶCF|[Hͪnx:s?\E`k[ *s:RW׫'z TGaEÚ@fUf>_^L-ۉD+;4Ps + *qË)8 qxds8Ё7\2 [㐈ɿKr`t&WƙVm㑈u\-cs2(8 e^wAiι,n}:soY69F}_T5Ö\Cl3^=fHn[Ĝ)XN:zkV"/Q_2K^SkyjjEkBsSuo uK}8 <ñ8 l7;l3Fr UJV[)Jwj0g)鏭UfM^c/˙bob(z![+;bI"ciW\:^<>qe fP{oM' ě$|\zK˸f=sӵ)Nu qS:15d/Xs0⺪|'wU\ &9+L=_Z):Vѐ d<}X= da\Fއ٩]<юƪҶYU;3GLX܇_ N% P%O"jO Txqhd؆kƌEzB³-'ۍ *ׁyȩpG #KC>c۶ؚP\ "wT (paHxHa:0G*ґX"ŽuŜBۺBpgLKo*y_0RaCqbk:/ @~EBSqvn:QvcÅi#eROBnv+Oy5>]Ҡ_d˭V-_W {'jnjPl9AWͪ;:˶Hv;mGn `Zkn(\m$#mv'퍅 ٫ ۤV΍{ムh;t)&o+mn,F0=d)*=v =+ͳ{gyY)םi'xLG׺yd_wyg xS;}yt./ST/*YyjJXG)*a?H}i'xTʢz^SF '%2*c.>'fB=<JKJEzlm"s#jiWMsgcضA?M:crˡo<*ʶ*W-d[-.rO-ek[ֶWPir10P0P0P0iF=Pg)*.c vN9c{{ nҾMk]͎QLfr;Ls=]L}I[Lp5i`g{v.[r;۵vumDzcusT^%`R<3vS>}.dzLD2:eB*RlMLɩ5KՁ2Y(/Wvi3qU*M`GOUl:/4R;P[[arek;՗#[&}|}Qn;pRpHDy֩$XEXغ ޺lu)=r1=jrj<,QM6V~jT-0bMU,LNe䩀/<$Z>iciѮ jekekr|6Z6d[kBl"}l*RbbW ҧr;Ung}1IMeXQ9ӎ1)%Q($G hǘ|&&ʤ gbu٤svL2L0BeǘXvI%fʎ03qfڹ8޹4sa}pY}hȟfح v!oĐiR{~ [Pv&;%43ŏGFeۙq?MlvmĎhRc.n_~Jz* %oDO啉*>]fK*e8P&e28&e8)DQ@0޺4[&&e9P&e")dr`L(UoM*0Tcr)b)l]2Eo]4Elp5TO5L>TlZ6 ),)*eR*󅧚*b*uQY*ªlMZ&\^U&ĪvMdC^H]wDvRbv# CL^)[dJLV*$uwaEcLL;ƤcLHLF&p1E%bdJ#{x]:{읏c{Оdv_ ;ˎ1\;,T!v eGo&<&%#큋#KcPTM{^_F^Ί Ptv HF=Ҷ@40FAJHhB M(!cBEFFSFGT&4gђl4&ѓO# %+z٣FRG&=E[6Omd5b'æFYj TF[jnqMhe]+i;w <9ȎBNuEFtiNsHq_#%1j#1Z^2R^63es2XrHDFd $wNQ -u,MP=0y{-Čx.ieu;FXFWK'+1*:[IcJʓpg;چÍ7eo,}̹Qi[ lAصma6]b;7^,f O*)*ͶsӶn sӶL µ zжxڙ2vLΔ9a=}C> d"*@.RTRekblMNW&7J$ƨ@I𘉫uL60|_|oܨX RmiȻ$J%E1u-T^U %+^KzU,L|W=xc,","2lMEo]W.!%mwhmc2Rg9BNgEFfiNeΈq_6ݠ2(m+N_c1F]KF\KfxQ1 :xQrVMc[cUTOZVp_]s6,x5I<cAئQŜhNG4NFt8q;#"G*V|cV1{bUAp72 yDU47[Uc䓦ĊᘢB; (xU*XX/ 7o2W*ԩU*Wt*XxiQiwCi`nJA* ;!7d0 ХyYZfhU?erekbztɹ @Ycd}ui3]ٚw$^E^e^…~DU?al%ٮw+A1u,b{`Ӝ^+3j:FhJc1Fctڽddʽ4*m2"Q1~:~'N݊U?cOXßgٓU?#nǪꇷy%oȲkx,U?cŜ$iN4Nt8=r;#GG;ªN3Rc=ꧏ~~x~ZCsU?=qꇶW?vVtU?~xԩVVбcmZ1V6ܔ$ QA&7ȄY.ͣ]&.ZٚD+LoQ(2(1lIh@Y#ltU?e@Y3RU?".eVYZ6)W&GU??&j Lʪ[v1\ܕɻ{xqMEo]E]E,\GYVm:oPm+N zhCdo(|Xnf{cxѫk*F {x(vJ1B7FQ&c;C{IscH*@ey {ç51|Q'xyX2JhYljy3j(m,|6(VE+>Ǖ0R#jej'kat=DoZ6l-Ѷ@akԩ[d-->PFF₉lKڶm,57,ʚ,qmfM(n,rВ---8ζ&[n[r믄:Ą!&b"H\;ۙqO`{>Gu^ǘu ^Įɤ>L:"n1y71a5M5IZǞƽ4932M2&M:F^m /nr5=pꞐUMhֺhHdu;rgaLx&VM*M.#n\2#|1}$cL~L|{2<.4*.D% y+i|wnQf6:hQx5ZRFL+%tcjHjxhJylD5Z&dꈁ>+%9~<:B=רk9#WF_ÖEPrY|jhl[!r##D^Gz!eku@!fGVG()1^G i-CJ5`se4Zd,zQB -}/--/ r_c 1%~ o>~fOwW1rXؖaO>rPeI)m iLy.q=0i9,z`#m1r$31#RN 988Kx&9c' 1}+w 2bShxӣ5TF+#Ŀh(QQ@Y(sHSEhsVV>9yKV+ JezHsV+)H-j%E]#1NhUNeVe'W1^ȸFcYъqU>Y4ƏJÖJGV+)VjcV+ZI뵒JMVRV+ J+TVR^S[JblV(TV+ JeB.˥Z0X\Kɶ(X'mI@!_r>Ζ[eX%@cL;ev^6[.Ԯ ~GX1V+ױcʾ"doۙ>\{`1V+HwJw.=XLȺk%ᓓ_69PV+ JF#Y2"V(TvPȓnT^8Jub-;(;l`E5D8*ԈVSj1~VVR=ZIlV+ZIJ]DoVlⵒZiVR^Yzdrz,Vc@YZZiV-{rY- ;_oŗ"%lApHivm) B@Җ{.:–7F7Fƈ^^6$/DH.R+nJwZdnJwVm6vME>.zФH$zd]DZ1R+ &|dMy]B{g2ci"{n~GJ8v}N MȈqe :9=:A*(RD9PFed9PFcFc2y u["V˨Suɒ3ْWR'b$:K.ÙZ&dK.ęPr%lSc#T)T[#Tr9΄qTZs\9\Q@IDcT+h҄ZIjȀߓpSF;ZwuWq9msH[`{'lG(]wuUwu4H(zg_v׿;$"}ۉ1Z#e䎑nd4*pMFn2!&c1&q.3Å*{c1&yc׽drǽ4m2c3Ҩ\]m"G=qVL*ʹ[O>ʾn~稠К>\cir1X3M2 Ypdz"F%FWoe odr3ɢ{gr4yR#}J,MQ m%i#ƪ49.NΤ 0"=|]nsXKz ܆݃Ka[ ͻDȇě-p'p#1\kӷa \uA@1kn \TnnJU^vh9Dc E..P>KҬGzb񹟥ҩk" Duga|p>62)Sky(6)Q9߼=6j+ؗMc0G|"O=~,ۥFµxP U nQ\$rxY \!Ǯ[.Yc.;rXs4Ipvv`xྣ=2oX-3ΊsKeyɌbu`Ȳߒ7HG3jI(3\,q! rh0{Pcř. KNMʞ_>%,aJ\7ájӉzVFEo! OAqjU޲5oK-̯W#sߞz^ [v0T$l衊!-]]YuOz r-~ =-ʲؗ,K|V[vṡ9Qqօpp:!ZǺ`FouE-z2͢?PB?_>jΟ|Ib endstream endobj 114 0 obj 13483 endobj 116 0 obj <> stream x}l_q=84 Y'$DU֒mKERkSE~%Ïٝǿ_jY~~̣ÛGGMNͩ66666>ۘ^gQ_???/X%W/X l#b۵NfZ.-4ɌwC/H/kڨ/g__6CvR1f*rO-bPV&x!_H`QkmQ#Q+8nrn K=07F4=nxYNAHHŶ/H-0#`H圐Z6BF@ /ш YߐѮP ζ=f7I|h] .!ހ$'9UѾjF1dW*z/HM(ɎziF_p.vA3 qUpUX#rmkͷrӳ}!E@9\|Œ}EOq_(m=PW*J1]5)鵛Z+j/eD|mF3}wj ŊAuJr*H՗Ck RA/Lcj]Ceǰ z~si@DMHlko$ DW;P B}Vޙ"/Wb'9G/y_\Pk 3@);ז,QS9s\O UA<ϴSQN/J#g=x];rN;6/Wʞ r^@%g͗4BHEY*D>$INU3z ^9 rޒƕ*\D9Od3uۇ2RnxFcwK+}"j" %L% G;l"5'-rod9ׁ0.c1LFs@e4ğdxUN7ITDТʹ 5QÌ *q7bIy+Rɹk L8MM/R ZCUawDR?!sF{$2l[h W$Y_X#FRX͖DA+IF%C!RGr(RG `p"dE!s!7a@H%ܥB@ q[IҌZ[;~QETg7ĄSA:J{(+ڰ' H}gRIsUJ-<իjf)+/;4V<=՟v\4uBwSl/",OԜEӫcKDu}_ؗJ^K~efW2^V[# +UL"F-w#Η|T8.zm }xMۑLLwm M|qAo $Q.K]w]nr˭%l"Z@Ky#R-#|-jEu("4d>U ɇFQt~mjT"HmQ)Q ˨tٶr"XQڡ]iΜ9sRN5 ěNֆ[ xef=nEʍH-8)# W4mQli[a\MnQ.cA%:6[cbѭVV ѭ1m."Ŗ]D N-{<@p( *GR>oYߢR.OQPCB;J'Z)Za}ATH`1e`K8㨸bA̟T er7Z>9rSrNZ֖,Yi`PwDM 5 ȹ;7 =J)jY2W d;JL*Tm6Ssz"/zD͠:r]@<@~wSEjS23^zC[&grerLRO޿{hl0KDmM6x{7[PU8&H{ޢeULz vk0*E|pDM7D Gȇ"co[[uSIcKJL{b#NѴj9nZhl\XŚd<< q̦Z.`1Ej2ۙ%&jK{kb!Cvةd8Ӟl w/ynW V6'H߀j{'cH0jkjA?m$-#RnÚ D#H]~1n,y<ُ )]#WuqUK{F6rU/IeLQR-Sn6*_ Jqk,/Z.jn3"4,WQv\WԸ3;j>Ѱ q>GZ4BAYB%r|KJ[0XW nC~)R.0=|Ls|E4$$XeWy%54:B/FFUPOcB}٩ W  "дfS_lybKȳPahU?RG?$TrI]ڑ4>aG{siNg^fM{\R#Ax$=n/Љ|oR,KK~ %ѴI?^iJvvp4Iq ']*x&:Iyi0:wG?6-PnݤBJܤS'(f`[m> yEWw`D{Ǚ$0Scs1cWBiR*qHm rR&DգMG/h->V`KI<'@K~~) P6P5 hN'`J&ζM z\_R a>ۋbog`~hg~Kv '%P*%3(ᗆr%Ҵd:'KNiwx|>|fw&ioE9z#:Dy͹݄9~hmQ*o9nB̙ 0Djˇv ~isʇv}!C;DR9D{{G>s;yv쎴7 ڢt3Ac`v G< lv˄APhZ6ēxdgvGb%T(5(7}QB>bb9y}&]*Ɍ ~hY|F?4_wP0nR(at' %`K< x{c1U Ȫd/_#4'p^mOƝ'^=E=$k6Z5CbUWۓO*Cl;{Qx3!\b7 {|7q`.ds17  rR]䌒:iB7+wk d@PEޖن9ޖI-~ݺ10*l-$9tԝJz9q6I1ϊ T!OX!ۖj\++yNfmF fCIQu;^Vǧn Q ZC֋v8[ͨu3>VZnףF\\]40 nmc hmhtWMوT tڌr 4t_y3л}`Q7Jcr+z&S¶the7*Ҫ ,%iaG]TVOժ01+9j?5%,#9RwUV!+ohkDH 265Q3[ eUgo=Mb1ŋג2l;i,Ze]h/{@ FbXjY1 M"=֊D, HEaEĺ_yiU^-i"Vc#RMQC]҈xgzK ǴQU5Q1&jvRFr$ѳf$Og|/ xB'ۆҚFIެy&Y=?(N8[jb6.G +_Eqb - *ֱ-h`(Yt隫gtNxPQ\tȚ AkIVHU*[*z/Ǟv(x o-*!=y; ߬5|8n_Rek^i璿v #Ÿ|X}ь',*=t8BGǶi{gg?\bwT\#U\>+9=n}eVi}Sv ڞj5]JPKjOk$FƦyJ6Lc1'؆|͢/N9@[k~ѷ; _۷iBVQ3[h9W+-5`fzL1 ʊ삣x8ŗ;+8ҳyj̐P?좌P( \f>&bR9aqgKX\Eh@ir]9AX݃z hi'b#;Mu;"mR4ֶc?U!G em="ńP]oTnjRdɇv~f!ާE(Xq,'VagD*J-hÏ(.HQ.8!B?O;]˷R+p tf ="{.Ww6̓UE3vy5X)u4n(ECkYV V*Re*G$ G8DŽ%j(H!=%9.bqTϥOQ ầV[VR(u{FK |fJpi)Bb@Bús"0>4:nkCQfQq;}/iNLw|\* U J^Ы6`ڗ.b/:m ܌;e՘zAɰ l1U~uLUF F^ !Z /ܪǍd97fX} LɢE7wY#W'9j.NRsǵM6.v}z:OT'|u5x8x;C9RVjHx'CўUV_P$֛͍k^Acwd=wR*{j3JJfz4S,–9%sLQ3} I%=RͦF,T{!XBU۶~nZ;yTEg\ѹt'56o+6";%$Gl]hK[Tŭ-B墲YYًJ >Ogn=Wf~jl=Sj4Bm)Yz* ǭa7*RXnF%/tJv[WEi$Di3̔r5 'R%m*FOS@*ʨ*4QX X?D^sM?v U5\r玫# =j\[J0X/ WFBOȋ!ݱ6x1Į'9z;E>62̞7h^G8_K)x~14B(={Iʳ\P9p|`"F ~۰hm5vK6? 䍗U*xU23/i"Ƌa'ߗ唂s\>INSݥeªxUi* >!X,4)Ik=GI,ZI`gM̿8]Y*Ѯ̝m%沷=t$ZPHbu2^'u2]=MC̣Y?$YaZ6;%V2^-7ǤZōȞT*-3ΆJ́7׮*1 9I9+ZPr9$MR~;WoW 6sO{2x^-e Uӳ~;I܇#spk_~z>е|7ʉT]TRV7g*ƅSySW7d_gԴ Bg@bwk{'%Vmfft$bzu *fW^)`w1최IX@Td;ze΀8zR>u2Y_d5|⧷;Ty`!mwjgKvbhST,_ y<<䙰Uc=z$g3SԘ 삎.x=XP6.}F;v)Cgu `^ K/\=R%LlKTz~q=9=S{g4S$Y-/*8hDWkIҗud445n:v\xHk,!.Ȝ҅;m뫩SL_KVrH)!Pؚ2a65O ?$hp*^ۗ@C0bN%&fG6 F׸q$dv`۸䨆%rWގnE3Q-]9xRTwcbuXVFێ}kVg=T!ƝRRFB3*Qm]~:];T6+ޡogJ!PD$)6.k㠥6s>_u@`s8-4 Krj6ѣZA}:+Ay^'1Tq. n-ϺYQgQC1G-s=RhM~t75Hr-^Ed /u,p鄢M[,ӁHRݎKtQgkqI)a&K@l.EG*1b$uۇ:8FSTRv**W[oդf [[?f-PvQ).F'(Iv1EoI 5͞ZJsը# .K{EBIq^ORR vڬ8/n=cRw 86Nr_Vn%o*jpU͑8.F';Lvc')E9)ɵ ڦ dGv w u;;d_DgCQ-@̆ybaխin1 j7"jB`XͧM.4Q,wE$ǑTǮ" ł_t*sI3kqxjkKw=QƏ$fZ͒'';]tp6dyZG7˪mT:F1QcAY<i*2e ъ?J^8#J*سLwFxE7FtkC6"nͭZ"ޙ7Z/<"v xEH}{MkEHLNҼ[ ޿{Hf,"|g4ZM|񕐀݂-c#ґy_*#-Hί`OXYTJ.G `Ra#ܐƨ=$I)e NWzŪoT9`[rw ꚓʜR Su/NrC}tyhLE8Q)RWBe#*oTz6e*1 q ^n%#}*-_iQhP--аШoulIK+ɅƙhCڨPn3G;LhI ZR 8O|jYtkK*ճfz{B GJ |u-!?**j ˇO+N$lVrEv,Wƙ>h¯A/FѨeUeNqFM7I֊'$i9P9_+(uiͧCwQϷQ]߁]Ю?8\Ε PBqM/R 203LUiXӈ$:fr%e(%+,ۆ۪Y@`@o ӟrQZ\nJjL%r;~/y]|&A&=X9لyMe+  x~3рg-wSE$w0Kę[|#¾kږhi/ mDT%"_J%?-K4KM+Axۖ)Uڒm nlT~mroG,Gl7Q$|Ό=.gTgtSK  tOu,YIy<]m˧x'Wjk%l7*l.XqM8nD %Ï"<*4p`wVC-'Z4Gl*@pvD=Q=1Vd/u0NJs"?ҭ _n{ Op*QXpmN)ŊTLŵɎ޾C"OoijUrVi %{wWY\ճUfD/ ֤P)fFSٲ77yuO8"]uPIsmw4:Y7f.=Kj|M!3.yBF==cs;DwejImZ"ѲEnaۉ^bAvc C|emd]nRy^Z_e5]֋fQmC=_m#z}8 {J()PJ`|L="5(5 r&QjoQM3,黇dG15?ִdܣUr-yf-1@${vn#سH/Qš-1%v c>]qVy+M} ǭ$+sѮ=U&׭wH%wmf3T#Ɲ)9l^TT7˔RJR!6Q+3og\I8htPcuh:JF Af>;fOV/XZLRj*("["TvCsÂ1elxHTA?K͎1 E/Xq>v 5@ybBE;a/_ő? m}<+>`pU VHjK {&W_|9Jq+Rq\v=~ P ^j'D=n"Oaq5LXU3 8G.]( mTZz>VrxӨ4E-gw. E&8X=䵆X {&O!6!ϜJ+^צ5D"2kV /(tMh7q?08jۮa8l/);_x___[}Ϗj??іJ endstream endobj 117 0 obj 14083 endobj 119 0 obj <> stream x}ˮe9<"%QOaUm3.Iwk-DYGŗ) ??Q~ڏ_~_oZ??G?ۿG?HBc W+S؁1ϴA@hD?4fDu!E(\qf+7gfvS_#KE֌8-y۸ww}gQ(0+Ik?kS?e)8K^\2Y$Ջp,'~hIHp2!4wԂ^ESkHn&3Vm;BD6cEjx;#o-# /{i9R\TChpȾlբqCSZ~Z-K.{,n᧶9T`c±%"t\1j-K:f7ˢi䂖KxKAnR^lvHV`,:Phe@;BL_nX~@+%KL$6ɬSiH}q2N-D4v(Z],/Fy g2@ɣ.j\oXX\:Bq毿_pԊ#О^{C:#!q/'yUJ]}>RȓN$- S.[8]S3#+z5]`vcqkK*rN/fGHrd|uu-Mh_i$#4eNѾP["ϗ%R~J(ūfnU+]E;Y|E:g݋X& sHE_')J+6}FЄ ea؍G9寯}f.ߚAklh5klB~>asO7}&+Ѐ17Vbs~0P$Ő%`N7/Մ;>jJ[nj7\E'fnhۡ;NjKzZh^sƢCBُA/zݒgroEEp,A+2}(4ޓ[VXr`T8+b)ޤyKA)$j/;J_R_IJ@K]*cKEyF&"WE+ 1ΠhvQ'FXn-ぢ+:fD Om%v:Uce7av`:+}9,39508]GUKl+N_IKx D=뢃 e܁PtU\7蓐j Sثl醳5C GBxXȪNͣ\[uklӃ[cYͷn{5~{5~`Zg/J@$K䄔Pr2Z;2]yЎpƒgt!GD;"SqtDy(FC݌g1ЦΉ5FV+ق ;\Z.u" 8i =i:#F<?mY+o EJc9_6LՒ!oq]T.7>naVJwX梟 X1+K~)"|LGX4nU3J>P(Cp,A,aLީfXmrd  \UQ_xJ"){^[;J\nzޒ.2oԮTMӿjI[_t=^aV܍>R״^MϴP87|Oi,%T`?QopRخQG3F-c1RDЎ$3}WLVEGOP~]M=C1?w) IQoGzI@dzb cmJAu>ЎP?VO|(X5\2%:X 5, XeGX7Q$ L>/Y”p^+05CMWH_'HT2@BJ՛TVp,S=^!>5.V+O@ȫ3b!돕$p4 gΐQ(qӓOo D ]VIoFC(:VR^R^-R^@ߚm4ƾ4z63583 Xj&rovRBg]UNf"C^38DM"t[C"{D\qwy(h?E &9pEVM)W3' =AيK`cOPwz!-v Ru!(,Ⱥ◻(KWrnKa&k6֝;%!nCA0Uu^pZQjϦ.Ժ%K̂,9o GrEbG+8Q4Fg/tę_*͵T&8Xr9[|vAɜP +Q!)AD{v(!7г1!PhL5%Zr$^Ƹ?#] ȃ#2Ğ&bHc.8Ľ,T7&q,ЁܣiA_ xM }Jmc: TMRSҩ(HE׽ZvTYp%fE[E U*dռK-lA>2s$f - fHEVgV $pZL[YPKEoAzI1Ʉ#=VkWbUsiX-doH)絛5vbg9U(mRh,X,~ Ȼv.gvJ%Bewg"q.+d.}#Ꟊǝ /g=cmy(Eٜ JݽL7ǢW@\ VCbG6gؠt#^J3cUR.p(I~YQÿ%ǴjVC>"לz˝弱_0Oo0j/&s3L1>ęo@ę=>Ԓ6YRn8y4F£1C-4? zp.%w E%"d`aRܛ@Ib :#Y lT&Nh<kH|NKdndQL @#2Shf^&ICOQ ʲ[doxS^hqG] ݡ\Zz#{08}[L6۠T34XGh{hQiِ3׆3ERGܰk#nM:b-m?w25yʚc]6|Q)&r7A*RK<#%(Տ er`m#P ~VXT4T#oO _syPv1U%凫Y=ObgTB&\R#jRX@rnD=?뢸W$p*rVst| J/Wr#*o$s]qrOfu6rq?\YnX_~ :E3?6ƮֺJ(;5톤EG44V I;!##}T.\_)l3le)m ޴k~W!)'-vWNe'~ey Ĕ8{GKzٯoG(i1=,؆QfTP' *{[P'C \(Y] ^'C((~=TX/# "=t/SX% ]5J弜WokϬ VmrjSf,݁Uc$Ѹrhjx6!ӒʵXQq<Ċ%E>DG(&U8wYPR#>53_B+F!uh62Ҽ_rU3灺KY^h9kD̵\:$r+wnTjeɳ&Gb9C< _M1-J$OE?? 󯖘_n銟)w?\G@9ʽg,ۥӇV3_;J/h|gK9~@^O,7Ў#hZt\VXћtC:"+;FqܨV38S+26 %#htdDؠ=L/X.h޲IY*nPr3HF'Ǘ*P?rTgF<=Iu/př3I egP~D( u`G{&&n o L7%_5(ԡ={ hfH!]hXHu4B9*JoM~.Q ɊZI+6ť Ę)6bD U±8rO/#g3׋=.d%)Y5y2x9oUo5Ö]wbfŝr k2OrkId̈́8Si`dް7>]A u)&u\NEo/"w.{O}Fe/{S).ְ y\7]zE?2]\ YTɆ'?P[=dc>0;}#`{U)y) a~rL]#3B)$juUg+8XШdx{d~]xb8a^*0/]UM#Fڀƴ/CtTm,]'i70|0m9?$JQjM7@o5?$&e,hXeJfפ)F+)qRbvxRYTrw~np[8}9+mf~nv~8u ӱ)'yT$.nv^qꀤ|!IL|,ROW XyEƆ3rMp.QﶔBBAbs^WG]tXc>s}"B+U<ޘ %}v/$:'Ԭ]_NՋ?;r[J^@D{KQ | _|{$$UE]{!,.~)aL=3rR x% RzjRXKHx]E2R,RVAEYz&9P[-O -g.M*FR#&#~ɢecnn13a+[7XK;卵ٮXJFP/-;GoJMUz5{MA6(-fNS+hҫM]gJ>=^-R^]R~y]VuKq<툾 B6ºir BvPEsa #u@K$6vz=ũ F7uMY dqfJ7T;S|Ůx =$f\Q=qd.iۜގ ֢Qi_J]} R"cUAgǻ_ND%tDK7P!6DAJ3{S yZAθݯ}Ԟ'X/nPҐT>Ob{ĚR7 X~IxW֊gNCdru_Y7 6(겯h]4-hIeo$n7h(}KRE p&;8PTtRgzɼd^Ϳ'(2kćwwQuĀڅE^q")O 07ogF%ů|57ێz|3wn(=Q+PpU.,o.%#SݥR;8#Mw ؿxz0bJ3opoZAa%G_fY\%f gǘ k԰p7Լv.<z8}^AWwitIټKleuWrșS|]ȊY[ EBiw.e -TQt~"kF:O#P諸_z0"h:6(hό=2#bzQ24$#TLȏBTtbP;7i$U\0/1W:(!Qt9~\e%V#~)g~my<5|FoN1yVhoc)dkq6Ft>?|H=CgM i{پڡ\u[4zv/ ։.EU5sb5RD=.SZ%'=_CBӼ̉f>dkAmݠGsP?tAV }m0B%P|I#)J(a@En^CȽ =6ͻ Jw iq|FIu!_WOPnfQy8s+3crF!=he\n]g]rЊPz:葽4c?.w; IǪ@g@Gw QKTtb=̜hZL۸1 ALP,mYϴXxPͨ?;u'q=Hr]w ހ -#K7 OZo@Ѕ!~(m@t"D%P*o|W"R#]Qi6Ǟa&83,ʐ| Q~N!x&79BH/%땦i_񴍤T 4H[YKiaeU{(a JMz.wV-4~oTn1=R5c_ =HoA %c^޻)y F' SnJ&8 ԯ%trLW EK/&aԩd5~ I7~ Aǀf=ٟ_ Fę_owbE(9vAmA+[xV+xR3[εIvMӶƺ537E,W_'z1^Ib)0Ӈ jެ<^BmhEso`ޑ(I+vpnxZz~:F#Zt%=k:%bkH0 N UZ#~`J1JQ3Sؿ(e gCKcmfjGZ#x0S/8׀,3wD Ʋ?IHM"BƮqՊ@$\8Ҳ䂒QΜP }zbg3ŕsy6)Rb_ o#?Zg2BX|o.MCǙ4Rm@m3<8Q|7^xR?̉tLmVB靭.er6L{mRu˅VMCɥ+YYSk׆ފkfT}JV**Hiޮ}֛i t` =O-󫍪Ҧ/S2W #+D]Un"WmŠOIb'/z9g U;[ lp?o9s]1^m e϶߉z<3KF |-: 主Frrl7t ?UW03O&rFjnkr4'jޕsfwQ$%JEaiH u(j?+PY-ޙJ"y9yju3/H].!h3ܥ, `97y\ݖ~+Wq]q iMc L~EN; hL"Ur4)ۍ93TC/h}4E4J u!.LR~g`_rQ~鳢݆PEZCsZ擳*`-nF.h,~/>A"ydV ["?yڼjۥ,e<-q]?MLzfµrvfPrIa[r ^8a{Q ͬS~0}$5#-`)Cȏ@1.ns$1VIyFE(f_N6s46g$#52 =qf$Grh iEPvM2@'?䍬脮lx?-#򞜶yI cs0ߺۡI2Z4 dPT9\t7a2ʜQ8{*EcEuVuV.YI3?6"uę%mmfr|\/zm^ZY`l`Oj`5ؓt7:cXw*Y9Eb>ȥOс(ݜŞX2HErE2֓|/GZjH&+⼬{^{"鹣Tfw "hI/gXH FE2ޜങ?8'{N$nh.}XpM {RG;gƎ/;ΆPjJ2pQp]:_(#vq]N-7KD(:5J„4l ԕrNuG@Yh4SLw6mNi]=7%ci wǔyx@ff,~qĖ_ƆB$knjxo+4\[]*{v![[ ŌRNmv _뱏I~̛7jXpQp^2}eve~0!驢Уu~Cn$MWV7rp%RgPZdP³aH\)SG 'od ̱Ph@I ZOm7'(HؽI{W)5U'(/1d|.ۄV9U~f&P~]ki\k+Hkkrnˢgĕg/? J ϓ(QA%uZ>7zXsf^まa4e:ɇ .b^5--Cso8ɶe嵼I=rPƯϯ1`[ׯ7h2o_cˏC endstream endobj 120 0 obj 15173 endobj 122 0 obj <> stream x]ˮemWq7zP/9i ?8O9N߭^*4Q$(ng_e-~~ #Q?~wkY?ZY>lXH3=#=}g%&[Sȋr6>_ ^??)ߢ6~ə~Z `phd@L i6D3RMsjжTc/_hgDK^ږ$!U%¸⸄֌@UԶeDUo& ,uLMu l?)KgYSg&}@K}^ jZZjNB]3ц=R#SmPR%8jDŤhA>| PZJL㠸XHlB|=zPE>܄\xxc},4 \qSL#p\Зiܗ͚Lk'D &(l ?V -ZpRL/6OPS#D> oQKeD\8hB2r'DxF1}]Ӕ:Fͤ6-d SٞdIlbF]"j' \#fgmے[~eڔ{5;Є-_i/ qц(pʎfG]h3ܩ,w/}ʰ{7b D_= DoiL|/4?svD䛬B_;Iv %% pRQl'[c+|v !gjqv}l0Y&ʵخElQTqL̪g;UOO7fҸK17, b 8_,Ҹ5fa[!m+:&q'GGNCbW)k9ftq#M* nj~|˜A2)"7pP-rÁ<ҥ>Pr$SeDOg:"1p8ՓNxMә&,};ۆP6W*}f-}jL`iŇ/mMі8D>#{NQӔ YH{@N)8ŶœdR"ZF.?0emE^a<|R2N$'('4~!TQt9}{ɴv7sZIpc꠯oISJeNO0J"J/`R@3G=Lp9=C(ǀV|m :J.7`FMU8H(!ad6 Rw'ѦӷR;i<<̷ǃM~.{!oyZԋK1úDzz9P5fXxVУm3j@$5]|_ ™OSt^^ X (>f=z\GJQ2 ",Oͧw wd"͐+Ҩ%M-jOE)="3sxbQx㦐e:y#9yGрK{,٤g,Ys2dP2Z[ηhqfcd锵:@|`ύ>wop#U2ha_?2RF<%~F W~[2s85Cn aN}{9wD)gćy ihw+ƝW5h[[J(^ 4/" u@ fI!8#=A CہrdJg2i?S<Ԝs5#(ıG@[6xš;4ЖaC;ka&rZǁfFI!JNФtrL#MQʞ0tq]u] ;ʭ:Kcܧ8u,$[:>CISiP C"aPAn~mN+,%\ZxIҪ~3k֐) !+QFEN*Ph3qӡ[OH'Ij} ũZsSNh6 ,7m(] Č2_nh1 f_(1#M\a\(Ֆƪd >L(kvĊ+z.3۷KWThq7Bn39y̧S*_S.y5#_zee'úW`ždǭW r5+7I̫zN9tQH@ ѧSȇ9O}ڜCjF@15ң(]GbbIVtf,5lp\ ]uf5}ܙA (!md,V0RoI4J3,-` d4.G_tF }j Ooոml̆=ϣG80o1>6s\3qKbd@B4ȆM2~t~0o-N_Ę/Pv䶶5 x~ܧCn/m=Sb/Z[)X+5OI~PANlɆ;r8CNS 5)>) p$%u'p-SRIw^oB> %?貔| u:N()0}S~'qnрS"gRB3EnTewIjL+Sz C\:pt4}~܌-}_wm[.c@7_ ml/~d~P4^=?sP$bi[2s[E2׸H2W[w[52Wm)$ )2!INR9"텢 YBkz {"sQ+p[!Vh*>.c2oc+6oc+tmlNr.c+6dl%ځSԳ׫0S~'L)V/L2_(7qS,:~ 'SZj_2QvF=ר/S|fNW܁S4])w,=lv@NY[B^Nq.IGBӵL zb!)VNSxL%턜|)WP]DNgLmަUOR1%Ó߿ksg+4W{KZŘbaR E%5`t7" &dK7=tïb(1%9_?aR5H ݭNGԳ˭-~;􄳡]:! )Igt@|C@'HۢWH`xܬʔtt WFOd;ȋz=fˇU)'*xifFݳs+*gw&W-jFkH-iO[B %OGCTZ7m PQiڒ̛{Mi )1r9bǔzSA\,;a 'RT dNy:!a(pb7UfJ̳kG>?f6fASH3)7K$e؃xkp3=?rkkt5|/\ѿD}`@ZÖ 䫁- vVb.o(;W[t(&g/zq"˯T4#uPJZHH!z+Gw^Q4 !JA 4'HV+ Jq2EbE1YjF)%IIPc9 !Jo/hVdgs)2tp*{)`8Ӡa 9Y_q*=5ۗ+*2: _t9UȝL:H=轌\z>oTvoBFL\)}x JG_4%$l$O2ȅdp{]=\UK'Z8piWG^'(JQey\/z}.l^B;ySTFzǻ{\O(5G|̚6=z-|y}/KN;򑵊>m>b_+E->βF7LE_3zK4n=zۦCmg޿{"!o0ӸZRtU)ʞ<һm(o>'A9=qyoϯLE,/Ծa|cˈ?;*Ԉ-e?MUƆ]&xE(? 2'ЬEj~^LD?:+ Ms TEQuLv2jA'Y~ IB B)X3OiMr9;ъ3Qڕ֌jdD-A.*+=r}Nj3u=E{#%Iyyew-N2풣&=g~r}wvhY>g?6/XaGwoI?4~U(U B$^?$m(R'IRBqg/t#"Z}3RQjK&6\'N$~Q={]Cc[>N }qQq=-ܧg4$1{tftr rЮoo]GdMS<t$WI8\),#Cm)W**۠(ҥPJUL8KIevVmUB!?C J/&Vvl|.6:WdSuۆ:Gh'>|Ğ:zP4Őv{5I3sJ5e8 q1r"(%U0;-&t_F(q'F,?cĶ |`gx޿ُl+o\(Do\Ja._zrQ$om_n5| d~e ö!(1UD:Q(6 "K ^ R$OP } ::Qٯ 5)?ҕ/՞I=gKn"M%.EWzc^i֬ꍲg>Pq#gm:^,nYxEf&5c]hݮݶ#Ϳqad,攦[ǒkO1=WMYLjx{OESLjh1=/y#q1=gr2w#^=/;.h^O!|\%3|)lǥj{ۀ9ͼSIJg>wzZ8^C4lRrɟN-hZa Q]+mVz҉wPIhy*)ނJQS;mYsy49eP: 9Em3?V{K6% frcD8KH|T$5g555Y')Ą֝ RKK@F 2oҚށu;e;|cӒ7oW7y ʦϵf`@p԰gz%}t8Jes-w+>=iF(Dzx%A =?:|FK"<@|Tzl{;* GPx"&:i:߉„K q~P7pg1Q--SO4F'(N~;;]e_R6?ԃ/%f(63iJxtFqO:b$cӪV[rG;j5o;qAQ9pHomL?ކUfHv>rKԻC6tE(ĹKA:45l*$!GC2yf]?eW.ZeO6>kըj~J7+4.]ƃ6YE>s[8y E/F+k1M;+wZ,-TBJ~4#DT6~S^$t*!;'D4c=|)P+8+6 z-7?bkpޖk-dO\FrV,[qG &Gp'"`TVf-%nQ1fa'4VвuЉDzMfȁbRB\#ZuW6\\Xg(#6R=/;X͓T?VmМ.su׵us R!ؒ}# WE8MJh;>y mPPro%{ϞFQ|ֵHѭ4RIUˀr TGW–v}[(K3/(\J+j}]'\%s%Ch)PDŞ9aϷTmmtCnPړNcBSR3Q $tU?_q}YJ~ҪM\1Z+izV':ΕV6ؖ%7C"G2tym$'(t`ϔj4{MJbF+O7U+l'oWSײkn蔳q؉f}1mwք(J( Y{(vS"p۞(<`ONᾙ#ٞ2wps,eM.WZ6=e6%ўGEZdI{ n"Gz ;x XN|(]ٿ.^T()J5((v2 Յ;9|f'3uʶqAu;Ȉ8#O) 삢^oiWE-Q)-D)(}z5"7nϠvM%=;ioLbAꯌ_ۿw_/ߊo`W??}% endstream endobj 123 0 obj 10263 endobj 125 0 obj <> stream x}ˮ%<"&hTU܌ rb] $:$7p?|{K_?W~%]N%}G O7Oo[$47U&_Uɭ66%696)616!6>6.6 Mj^^)NNJRPz҃KAlJbUz҃Ĵу|}sB?ꍄ~h+dl6[pGV>NboZ}yo~~sSaHXz-~(Z\[^ 8i?׻.PO$#U1+J4)|5ӨHd- _Q?9ஃ(;7sC b Є:>ӴO)wn~X Ltw} ꌍ{ ʤ>W l\H+z΅l e[󀒽|(jhF]vzg;fDSk-zU㌐dda{iUsyk3׮f.ǼyD򩢭zTa䌂'q@zh4_)Q:Aȫ4" %&Nj_q?JMWī KJḿ J"y#7'%C')AYBd=Lv+h赣ruq r"t$[,SW8r4ߴ&'G :Gg@?-K+HۢHP~)B:MJiڜ2u/ מ3JTUw&o~t.j^5sZ;d*';&#Z:?E_%}%\* K1qCMPy/-@4j3AfHtHP*02x྽땁QOG*%ݾ@ϔ*(/a%%&K-#Pidt)h.h0y3*\K1 K>|PmRBݫQr6#rR]H1&z."@_( fZJ!4%r1?Ă0Z.CvQzT@/d!U8.i -j9q^ 't?Z5\Z&URL3D4cФQBzPL,ؓKI|77T,8XV/2Fj/!]G*Ag-Js zFlKYq=ɠ Z9qrȍWh~9N{a7X: Q*B#s,9s=mUZzhB3bqDesu2jN8&,%Ɔ8 UK wNf$Sq4r0fR!KrO#徱cQSRV}!bO59 0sEX(3z^ Qأ'zEJ_8`zmv~B O+P= [_Dz-CΉzV9 @"f:N }狡,|v1Cݫ :S\@z_ӂQ•Յf=rs# Ώ8# jwL~(7pe>+FKgT7 I_]P]PHܱ.kUcڤ-h2EV}e#bƕϘK^*W̞\^"fe/E|8t9İ;E[}CsM4r;bHgY#h;`9铢2ܯ50+kFd'*Oɇ5T/E$/PjV_J'`VK_&l3's4sz6)\k~5ғ6~d9 ack L{c1*tJ'\z(=8/>Dic E0eWT R8.n3rir$ QB%$]$fnNʳSRAm .( (s,6sy 8QFmSQl*̇!ХQRS:KjYZGuitI{ -iMhɩF2[@'=tzԋ| uQhAcX+hT08 %ZH1SqckU5Ŷ s.H򱀦Rʵ?3r?>QQ[S/rKuT\9P诼xu*V 4.Ż@3ZJ9jt@Uj#mۖpoi?7˴I-i7̼(T:0A/YV9!W5/I8ɑm{"s Ȧs)m'.]dsSi ovNqN151A,5yϮ8h%ҌD4MX)K49[)MX^Hc} 󀛬|iǁ< eyP>lgD]5s?~TٞY[Gά-[kpeڲfDaD7 uډ klϬkZ;~'X+Zkp4_4>VkgϿnX;QajvNCPJ4#hRdD6~'D&!2p+ݭ`tكVK viZJllv]Fݥݥ9E7`=r yD1_ys7,ϙQ#rψ^0Q4`/l9ũ`QFqj8N!NI kpN(* ەDw+ݮgJD+} nh :[϶PPEP9n?[O#TJ_^P (xG@;*tD@M# #Ћ;((#Ћ{Oz!ݏ]OG(nσs?ճtҟmw+Iծ=s~(Q8(Q4#hݏX* * 4}>v bv(D7tW='h6  :aSnT4Tqj(j;Tqj(ѭgSP;>~G|Щ;>NuĘ0⣢xG;>#> >QͷG#>~G|T|4N~A+1ޅ(\ ΅LtWr]PBtS$UimI&  Y.o[/(=рS$!s!p7E&ũBl Q.DB 4 Q.Do9#s!fs!J~݅)l0eSVnMADw/tS/^zޤK <[nJ IWeÔ'9~pyg-S^yc /SXݘЋ۔JmnN(MYhmBknS2MYm z,fdJkF6 l@iXk kp!.DBpBt LB&/΅Lt"`-'`nA\ZPtÅ "!p!xS|rŸSWJ ]Bo"$!ۅ(tEUw!B ]w!ۅ )kYp!9ñ| ÅLtSXͩÅLtB&s!}ɉ3Y>ps}SIݝ]fj;خlHgm7Z`hlm|-6:g'8l}~=}f[oev+. lиStL4m^}Cv)sRG;n.w,椹w) y@q'4N/F.4Rtow8Rtũ StqcO\<ĕƍ JB2kt]kY %hKRp]~v]15ׇӊ\Dqё@9́%SEN ץ85\29hzd?'B^ilV^ylҒR/~X6YR_ꤓ>lz0#u]|nByX j5-OHZ U ^lK4˯˃E:8P3Za)p9%.:A./m`VĴ풗 dK'kJ@w_Ί%-h~eZ?^*3m':@i+~\$Y}~ɩlFWVїqܪ'h^p/zVQD=O՗!%Iܘy /Yz`!gK>*+gKE |toڎmv/Ֆc~0g))G/)AWnУJIU $*R .W=/[ ~'Ϩ+erH\gO3_9g|V,p%TQՊ-A_Z`Bj/]_, / ˼uęP[LYPJr A]GMq6GV 7hIN(:VP:t\ ^%Pb='9vʟt@3-(.a +] $|Hhc +|H ѪC$C!㦓mA_¨+CA8_cVH׾1*?ɕ)F%M]4_]R)&⊜$.E ?AD\ ).\hsI?y^E.WvмhjgP@~徧+;=]g˼jS u .WRI/ŒpF?g Hp%Uq-,mJ@ + !7IKh R7;' Ei\pМ^4QQl(җQK>-P~m1RU'&5v~,?Ɋ4ӸVӕ4Vq* ![^:'9f/S+'<.i2Vj6gOHQLAL%;7ron~2W3.k+hPM5_ACE˽l*лQ=ݲ}A[O+e׿st89/Jv3Gx2s} dtۋ5an' Ўݿ{im NW顂bb={]Kӻ{O=sgzr̉ l< \%2WP*&$Cbo&--rgf{] x(wM(]N\M ?aGJgJZ_ukl4Iʳ+е{Z7d,>( 4tIdҳg>P*:`lV T!R,(48.k̊;He~vV j>C[VA"O_-G #J o #2kWWhܔĂF)v$jslYiTl+ogW}]%wHqdDT[W lȉ7mn_z *!NȉgRu ^F8nīR ^] %SFvS37+S7rx{]~pcSNdi?Sזx9-mIYe gQp@8r/@/gVu|+K ESŠQ^A/s((nS 1@]|lK/Pg/<|Y#!- 7J]t'z}S/!㸴lB^ݪUMSiWA~|DZsgPrAҥd4_ '^2i9ւt:C޶?N[Hoݯ'A4˥C=XfB(eDTeބδ!hZa}I55E-.Kv칑eAQ<+t55D%d&';nXb:v77lIL8(3:ǛxhiR,%p|~?p} 7T߽tn. Gÿ#W0zĂDi ވ+(r r=7["I"L9SzՉw"pO3ˁdض)fFI΅tsa[Eh'3JčKrÌJ:ͨ4=hP:Fp8KkO#8=D/^qu'g'[v]͸TC[yvf͍|rcA_ħ&͕m(QF"DEɠ;YP?|Qk凨{fDBOR犪t,ceϹaD~]FP%熱^՗ h'4'K_կF4ɍ<>gCĜn_rs-tvEa+RuPz:z^y(%yL*9Zy];u JtClW#丩¸q^iհ-4.LnjRvL`X[MJA9fz`XgS:'IRYJzD3E[H[Ds.vPkAe UI L\UCmAs6Ovu*D,\ZO6^۫^:*MURўDZPPBz):8AiF?mC.>h٥QϩJV@Oԃ~sJ&iEjq)$+)e4 7r1_?LoOʘ-+^?߳=:1QWF:F?~43nt#PߣZAa㏕:ɴ?`Aْߛҕ,{.)uZU碢_m3X"r?D^p(Ͷwg[ɖ̶X"Җ5q\~FΝz݂EDܐlL拙(W{e8Az2o($hݶ~|pƴ7nqv>Wǿr׆T7 t ŶVu_PNQlĿ ɎwzM[r>B\'^ɋ@*r*z;g:A`\~:$d'e<3E4ӽj %duuōduu5n9JzDrPTt^㦄Gk̈vXi{kg^?YY{}??o+Q']N #pޮz endstream endobj 126 0 obj 10290 endobj 128 0 obj <> stream x}ͮ.9rܾ⮵.WHw X2 X?&3:}K2L&Q$~oU38syy?~\?ˏVGG?.o[Do}P8:D':D0?;1Cn""!ȍ ~GȞ؍ނjOW)щp:''z胚hn/4E!:!)iu<9EDٜx_əi<9Et~Do}Pgpi~CtC4ړ[AhƓ[AM44:D':DK9xr7z> N,NB,l87xrb7z >(DP=2–O|ti3m{Q}s#O? rXms mT{͡`896=hm{.ݦۃ6;ektI{犏سm{g JBzyQ'y=G{@.rtS%Gz6I{9yʸ%gyyy^M7I{y3ջl7{y37{̏yu0l,o}q??S)o[߆zW=O?wퟨm]9GJI:Zm NjbFDk_{M e@#۠E)o%%4h ,,3o|}]<*57qJw7~;zVGnpJ?2ec{vsʯE0{"z!1To>A-_ezJ["զ[^ {km3gzx+/ ^GaXV8qЁdrlE" 9Lj+T=6i(K\j\wR<@X/l hqָx|Q,"YQTXה;eZå: 6)AiE>4ƭcmiF(Z,9[#[i )bh+JZ)7ꌠ36[rmѡ#fh=^^P@L`Ʒ˩{9S'j1~ d7Hjo* (ɳ:uKdi+H8PY}BFو fBJ,Oݢt,.3Bz{C9EuZ@+yDUo՟KID+ǫ $.b C٧e+H^_]ۧ(A^>ڋa)U4SZ}^gt-:aʋWVrp hTKg>8t2cxqT'nxh=#C?p9,P'f`唽s[Z/!7;>޳{a@OWCc>Qr>^sPKtN#ʎuj䪳d̔ȧ ڪ˅- mWyT={\tn?Mp39IEPT6Mp79\e.EJ1Il.ri{zk'\u\9*͘h3WɒnR:J֛wsCaJJsdK+fv" o\%뽰wvs*yU1WJyԘT,sc:\%Jjes+y3WɒbR#sz\i"* d'DyU/cwb{<6%ylByL:1Qp;re Ϯ VgYk'+>70uQ % Z>E8׌zk@y'IEWOq(oF(-cL98\EY{3,K۔߉lw\ m]QvE#}m;˥_-CLn$9,-}1ߍ%ԙޫ]bVE=S>VŢF⪢ sh+=+lTo؞b&(ec4e1'hEu(2`fw&-,xg"ܙ.V%LZ|gҪޑIy / ҏShIwİTKKtZ㣳k0q=_|<ckcF+R{Kz ~VDOG[Ӻ"Z E_9RОZi0XiQo κ4hd1zɾ;{vw@9[td*y5hpejQ8-8glEsS;D)F;J'"v_ZA qT K1:1A!cwwk:kf;3 K葜gxvh8N(NW}oBkYы9 dπ=D,x}lx9^Zq 9 ) ܧ(tpr=닉餄:!{ Vd{˜[&J*\FhfD[N1lż%ܨ]Pb@mݚ \gzݚ <Z1ɻ5xP2#nSXf?EiJ',AU cB?lԛfD΃fEUZfF'r-j -G*46T"LJE[-;TĮ1^|s‹oT\w̩jOE߲JePUU|ZcB+*$o.UrМެhM zLVΩnV6+clDi|91'.(vʈҪֻo6ʒmϥәsCHCjk6瑲!^X0%k{+V#z׳A:EKBgTٮVZ*5,ns,|nůrʨ39^zN1iWf8c7B*o-IA#^Fruٛe|x6 W8~7W8WNvFnv0Z7;lBw;'(emv0:tQl;VRg8FQv0z;`TcjQ(K葻`tfDK 1Zk1ڕLgo1ZZVC!VWCmbɖOq`f(pQ]ol]!zSbFdeS];6Ln%6FŃ M͒/M P~ܤJ@k,jztWiY'm=cR>Yy!,7}>#s}' ]Q'7oF?^uN:?\_pl'u/ewը}Xk'|6}yLIfR10NI̤*ԘIUv'c&]%6ĻLViL/K7x'9x}GZDߩt^n-1ҽ u&fZD7|(% mՓK7| % h7|c O,8xBǃ't䀣}*O(5P*<:tJ'ThE-1xB.<,|ԃ'ȹ Ɲ'TyBqOg %&0bӷ@[occy .f0:ІZJ:e,(<<.彔 R}%쁘68_ #MExbWgϯPځ9V֢.ʤm2l d{ d<E62唥 z`.2NE,;.r7Զ\;ވ^H1No.rZwE-)tHU"u7k 47T닏=]G+kP4utxq|cR ez`G21l8w@} "@uNek&$KD;b6T(rb9?C&az:ňYXaz/zD~ָs,~%-N:nCy|'qep1 v@ywK'J+SKl8NJMN2ݪ@cY@c~=F_P+܍o:"Z{({~YBvm_&~8~5g98˨]>%=E&ʴ3IF8.,_ۭ M)B8>ż8C}eEYdvSl~{~{MLyo=lQ82NJY|r潞#c%Mב+ =-SXב%u{cG~,nٱh;]f,ʴXe.WgɇZf\xȄyS& z*g2g3_r4RhF }j~4`l'6Ag<F9/xOp/.\ۓ}$Y_σՌi,ߛ#%lEKPkStlMY6YwHmsyߥc@ Vi봢7QQʨ30C{7MZl3,vNKrA2kvfKd<篆[!g#: tq= )/-5'|lQuv.@jeo8]ɛ;e# 6"?lDFz%"BOčGTݢBǁ 6m.jځ_㇋u(66Q>Os"%Pb,Sx.)'rfF-V7NP59nrMS֋_[DYμD2߅m1d廪nq(u, ZpqA0!v//p!wl)0"p"aVQEpˌrwD7Ps(l"B<^zY%t4FI{PdfrCYzۘe.[v+EVD5ohMdg*d޳"?1Q[E[?7ᖉ-s\ _|{SZʎVstֽd0r040LᛉV(%׈(8#Ȏvlݨ6Ѳ7޼p K;0NglUfeX(!c3#!UKJh ^ؑ+5b^;+TOe~hevQ's(G8C/e;^Spȿؗ7Dz!쾞χØC_Hc%_keiߚWN1!J.wM(ycw\[/]gErF-1xˉJaC(0vy֋i&VYn- tk(*mޒm{?:3|ʉ>Ewaf} ~2 I A Ej+UP&[8e/dbkoUc͑y'>7BNhrt{_dc (k{5Έwk__0PvM IW嫛#xF/}>ޘ*?xK֝)7/;S5HTy}V_9VjL9'^2!f/Yn}9>ȶv(!a#:=dLEv5$9GqG|o 1E[S1_c*ɺwڅ#Ve'%NY^D?%K*GHDh2x]C9?#+8 (҃d_P:sAyo͐J6fԳJ( 5RY䕭-[=?A_"hM>mƚ(}[ČNy|sq;YiKk{R  h|D٪LL˛VFAc&% fd_UX%=n4%U҄6$QX%B*)[%ZUDwVIݭVUj1UҔݭ&[%MtJRZ U%UyJR8IZwڅj'ʧƼFʲSMPdDwv@Vjq0Z0 bZU%vðUO^#e=;:wHtrͶc^Y^Uߍci_]o8ct_hmͧ~'BҥU;˼G-z~=黇avEN/YJ_n-4e}o_?\zr5Q~dҔJ6Ҧ,f;KPVeG*%@[no>P+ZaڬJ.`9]8Y0b,XJ/#۞(}~HYj-rnc.w^ås(qu}PEmcmJ{^ԉNT]f]ok@қ Prdt} ᵢ}ɒ.3YrzqCj3ͲKgc*{آnsrs(͍;w:+y_9grnUc&&&$Z U1P(&PSvL*L|͹Adc-::{wB~pl8[| eqYasBYNz^:4GZޚ*OKv*VniEYVz4dvl1,ٱ'סR>H2NWt҉(WU{ղ'DE ^; yNDE)D m(tDgQ]١Yl'X8}Nd'goX⭓xb`6\s-v05XtқØ9V4cYǮ J^dߝCu> stream x]͎5mO,: 0@vN 0<_?WTϑo13]s.UEQTקǏ>_Qlq}˵H3}>ˇ O?|o UП>{>)~_o}Թ?W;v~oC?B }vF$|nDHr+h޳m=ϳ<As-\iЩϦ7nz^i`7nzxBy?7.zx%yxo7zxy:7Kzެy uё 6_/-??A,&_8{iWM*Sw^^?پ+FݠqT8 Q -E5#vT ц[G!\CJ|Pޖ?`:qn_N> $QzPGV4(;^t|uьh>hC4c˿CTڣJ06}kiDB +NR".Ph< 3<p](#iWnJYjLp wVsDCMٟL[ Z4,w#ȉlN #R2gd~geh_sљ^=ؽlH6544)$ZE"ORB9FAbВ*#5@Q#Y !1]:c3Zr\cqz@z_zlY5(HVh*:h%^~hM_IFYoruM :v[eMk 8QSY&'iRM{I xB;3Ғ'zo͞ц("5{hD)9'4lAÍ.]6Eu%ڤKօ]ӃzRU( ~Ox'JymgH|Xv_~X0G@lİك.ζ$JFFI)Ro[Zg/%=nE%;PVh L~|єs|y ,6^Q u_xnM[H7:$Lmק=SbU!;soL辽_u+h0=u_d%.IKtO}45ŖE +v{Vj !zDQV#bHVSMQE.>%ǒqq. $E٪ N">JJCZGC^ PZ!JZEᯃf~g3^o"pD+Zr6G W14&f^I䩀8(ZA;&nA/K3MW<̻7m[1=M)QQi ݭ([ZQ.2dE?\XQ&[QtL₀(Ud#.?4QWA\CiX)+\#X_m&+ƘG(rTěTr$Fr±ɔı.k㾮޿[fE'*J*hZJ]jT\R\뢀.uQhySUR7uQiÙ,-nQ䆽Yg03'2b/6WǠ{ɋM6OLGr8ߜE9%6}TojҨ#8WɖI=Ȕd:b3yWts"_\e5j,F\hP\޿stkJ*Fj:ֽ FX?ZLodd`+4"]2AOQź-ypYutVV0GdKBTuD$\'\;b,,JZz$YދX`㰑/[+UAUq#mĄeP6< I>lDק^ J&W0W( W-Dm[rK1)˨$͖]IFãn$p8΅D3*T1olҴPi9U)7$@Ͷ/؟Vq5h9v=.K4Md4: =ncj+; O6h:y卟fWʭE;۷}F) -m -('kSoVO%7D, )ʢ"-\!sI/"N6B]澝nքpl02!R.'osOM 0`8xV^M2jRI&Lߛ$,1+6Ґ9&5`8~iF˶nc; jFzCeZo[8|V,s܂ekIq-NrJetۖ6>Foۢw %)p, X=& [,$H0,E<ISbIx$G2jhKu:`xʃ)փyynPۃykцc⅚FEm5ݏqYݽdF6m}ۈOm;(jJB6m#pطAlJ#^mFE|+e@Dޭ?`.o0-|1x:.u_9'Y9% ZWNQY9Fe.[eourŃuFLEK%w'W<(3R5ɃPu5FDi5.E/բߛs9JdT(|o=Ȣ6{l[r.KSr&+%C+/~v*kDЍ`, ?|w?Ҳq%E_dü go(eޅcG+ΛG+M*rUC9+Z;/ۆī֠' ՟(zn}VySP8B|,[L8K(oH7{\v3Ǩ!53o $Zmm8X)O烥P6S٨$hm[0~oPFZEKgbtq(nMT'njekڳNehy/1'vs@9nReKۀ+p_g?0ǯe]"_S߸fc߸>h}\sH$~ \OZJVUЯh/Q)DrwU>yN_%q̧Wȧ-kȧ<.2)|ʄ6ёO1VgL"ʉbyD1G -*35>" +[2T'X c:[!+n΀RFNcP. E9VebRTaAm뾛\0זfQS~QaNnQK,= r. K{7NAǖeݛP%> J}gMde[&HEQnYku[]Yvh K/貃Iˑh4~#cI9Ҝcgzmܭ G|&A_Q{xKrl_ - Rkh^Ky`hIV+KN(PU}_I;nvj_uš~KAҳ,ց>tY-d.:Sǩn-~=Cw34"kݹ}԰/֍+~8~g[=&~Lh5ht"]GfxwP}Q\ST)\{l"ҭr.F++GCU}J j9S4[M!7t?ܵiklA>"z`]w>)C䠏0C#Ƨ&>?gά~:1٨6#*5AXQEVTA+j5*Vt;+XQnB7VT1݊+ XQأUbEV4-5+VG-=ªK4* ~~/VAM3$o܍B6e;Yw+cEt(7X-jYpTy9ue*+`٣Qi'4f?f6O74hi6V"KMzPkhi0>ڣ-b8c[:AhN'%qeԲ}6U!-7.Wu3s8 t /g]~YȈ:Gmtҵ6ZLXlz [*;~T?|-u@Kʚkv>WMDyhlvZBiEW=Cӆ$C-g6E@َvZDrS$:#D tf܃vÉ }uKқzIvi$yhy+|Ќ~"Hc955O3'A\GxJFb:NoE['Λ!Oيc3W4εyje>NtwDiNIVҩkYQ'(-wMC9;^q%Pr:Z&'+񔄵s{VcIq-NوgaMO<jg!س`d?za*inحzTD?Y =|i >rILh1i=n"Į,[ߚFgp-{q&Bxe\o Dj,0}=PrZGהDi2k Jg\GYfz1Fel϶F4tk@>Pjّ~.|qe^P`WJ)X*rXN\Ʌ{֬ߨ7{4VF+)r[.Nk֍X.4oκJsL镈/Ǡ'P^5ʇ-LG ̗ ft$倕rvsJ#J"OrIQvrl4?Us"rq2sjfcőtʉneK-*xe`lEw'-G$: !+tZ o`t "Jv(R7ŭŖD[ڦ$}8 @@"rK9` HvVD)-S:9zBI N{OLTSz:r`= ґ-s %W`˺u|tnMp)JGVYJ|4]Y\壭 =}D:G)5 EHe -ӧc-rEWIdwDaGݣBkѫ= Kct=}-(_+`<vB/KF#;/k6Kw-;y_{%/k^^)kĀ6{,Nݣr&_Y>%iY^!{^ (biu Q*4:*-{EQ@֑8fB$ʛKr;h̖e)+.dp(+eYu_HR59خvMR럊Í- LV.fw܅oEe܏']\vxF0e1)Z:K&{ЩhGdHhk3wƁ+j1Mm/]NRkJ.*BZ8SL"jͪqQoDwF񀻈cR.DŽ68FGۈHK;X@iыrPC>iczW9۝2D#FE2. cdj zgX-eUnޑN][AV{D0\=rlZ4|m?Ma%Z`\iI*y^,Ww2k0]/vI5~ڀشI;v.!9 wHdYh87bX҈(Qٛ\ah5\c++\ Gs8%4W\ gOtZDqgّэzyи"4JPYptiZ4FWUa|ك,v;nLcK V7XR`k*ZcV(m0xmB=r4va -mB߱[[4Z"-_' ىrF4.-ris1iJgq<24S%>AF)gB*N0|ղ\;g;ԁvܿ[d َ n ZVlwfgB|ؙhLrGw3Snvf*t3S6Z#ԯ6ϥK5lWr&:.hC] H9#:RuE^@lI0>Ԯ4Eg."1e;w5X%UG,ھ6}y5ǭ9qN 磼S;C93z:"WGM('4#@2$vi(\y,j \8H9R-^܎գQ\Nkf焖s;Fp,Me%gϿu?OgQ*m8G7- ͈ڭ&!Yzޏ\Y̒yb~rJohx0Q.W뙎rRh[pkp5>" ݽ`E+Ch@`k(FF CGl#Lvh)p(%eK{*hΚcǤ9p^β_8FtG-GiM1xשeԙr^ZMr4Cq ]9gY(Wt=gݔgPVhQ|*IlYrfr},ʰV Ջ?sӄE˧ F)#QDi}7DWE\.oq.Od¡]rT]Eޛk. ǎ>PSq,dXPJ|^Kv夶n 'Ρ-}?j16%~G>Հ/2cr%72cwGfwId&Ɍ̘Ȍ=636e&9lΌM͙e2c{̲z/g4./6]^ly1cydƬGfĞHKmu\Oh[c䄴593+g,) hD#GSr;bkTa>bۧpvЌCQG`)3wΰr_aF}5z2NpnNp)tsKܝRr7'٣]OpXƕ浤oVkGǴp=1zDqzREB>j,w)ZH[G&ah]0tG䷭Gv#{=aQ# t#yx#&GX-rw=°;w=oM'Ϲ]=bƢq# zDwC/zѣ1# ϣaIc#,F=QƹGGX-z1z6M=]0VgGCzaKzI®Gl]/r\)d)Qڣl%;\&uq2'J x+Y CXA>PڡT֠y&;gJ 0iO7hX%IK_gރye^ԧ>G 'xvd endstream endobj 132 0 obj 11085 endobj 134 0 obj <> stream x]ˮ%mWҫ$Fm ?8 E.q-uNn߮^zPŇoq|^_}{?B??o/G#mWbko ׿*Op)Nt4Z?^՜rj#|壤Tt4. хLܾ+"Rdz$MǫO7|) HoTHvM: yʗ"ЋF'i̚T^7:IT^7*I"}t4gM*_B/IK^EzB{V"1 5m|) HotDb~) HotfRzިZot.tSi~) HoTHc=4ͯEF'B'髤5"ЋF44H$]$0YTD&{"ЋFAΏS#S_2KSɇ6u.]#Z_ԥLC+|_:0l]Z>kƎuuMIӪ9'z5COfɯkZȇ~d.-uINvޢ) dq;IX?VCg{ (s8.JZźa0)M%uURi03J}࣯Z8> IVVVDwk^`ꟲmEԻ Vq#oײ4i5{.w4+::J&ݦMq1-Ъ!GݐdWeje, JDe,WY_X}Qnk)trйߠrq=ƿ+TrDņc |Vo(EGr02zOK(? U6#ebTvucUmNA 6y*'7y+yK.4dlgYӏ}dej'Jx6iDW8s@ s:Kr$>c/o$WȍR Xr>pTF.ȅ8m5S32\([km&۹ 8sbT 3t ZQp̲'k2(g]|䷡h/]6qvCfJz8(,v"= ͈@P*9~wQŰMzY]!Wz=\5U+iٌ(ACNM6 ?p HczUpJ'fis~*)ZQ+iQCgsӲosrQcMݫXħJmD+Ju)Z^ҤۓQ4+*"p}\T)|an#~YLBPuCN^C ƗZS6eұ+P؟LB9UJBNP:|&ߊc@Z%mjǏ4zr{29 аߗ0\}~֔XUhJ-9)Bs(Sl!G1I:>$]ۤP"I 4"I#I #I^I HH*׈$)#:@ZB&mƄXI#cu7$" M [T9V\©.SI"2eKsL el)VǓ7=gqy+ۣ`d{QnM%uJGQbEbD 5nٞ6U1A)Q+m[E?Q*<މH=ȉINZ"̂A1UvNZ5W8gIIqG5ap=K"dV@+s9r|]4_.~-cQuR_~b'5;iαnвf'-ȰB:4Ue'-Բ\4AlIֲ;)JMvv;ia{Iִ<^ 2W]T^kIϜN9mXx< ;BDOaJmʶYQc졧,آe $K1C#('Y6 9K#s;Qܑ:ygh3_CrH#;K#hH^mUʸn`2m *(`%ʶ[yjOY}0Gd}81mz2sda*R9V?>%;M˭R͖ÐUlp*fCvO賬7J 6R,74@IHPQxbUIfB)wi'n ;@x % -xαoвf/ȰB :m4mUe/uK}eqz٨P)SD=2LfèPۼ˜hyWY>2=켫.5j ueU8d*84wy<<]ẹs诵LUU<#^ɲLl*U[q=|YG 7Lp)v4K `gξNOyF%Y}eD{" "]z\J:%W7dQ7P7Ovq:I쌲k  u#EFr\3RRcT8֒U}k)Uɱ1QTqDtWCL=j3ejfl-3'{fk#t-䴤.9TFɖog69--t39iZZsFVҍ%NrKI )VV)%[ `kMrʔ\$0HN%WAb}ulZs"(,Pn((E2C M#,ϑҎrB7 pirB 5rB 8rK~X{ڬ7`Xfq0V韺K xcnne,+2T7+cqߴ27fZo̲2Yo̰16yλD✊˜I94O> ѷ77͍[~fƶ-#gc9lkn-[L|)94x=I˜qZ`l܌=Kgf)S2/%+cssdlnΌ]_Fddcl[L30w;͗ڱ"ˍmJɑuq$Y2.NA{Y[6gŖ͙i˜y-3ḇ` e(|b徟B6h JrJz J J֔]B֤1F(xo žIZRO4|~i*.@lLS Bj"~t3D\ѦN!DlOd^(S1C۩}RNbciZ=Y\_1-3hg¾b8!%,ԪbA|rSPأ[0- my`wv(7?lA':}1ݠ鏭r|B|v,yiM!t"KsSyy@ 2{:xotDDېvA8϶5-lǿ?sQU+xod3=iqYZ%B_:}"JCV?Y]YK~ٿ wFF-zJ+{+-Ǯ $yf5.asyP7%mΔ,sD=3h GFD[58 %St:ݷ1j {0t2ArL"Z[䴿7C J.;pQh-C,ʽ=H]tn KiVIǃDf @;%+*/UcʪHFl*V*^%} -F}<|LaR|$]߸\ܘ7@isQ\/н~ŋ}iS.>a0z0-f[E;$+g-qַuBnnVQH!%΋ 2]6*t3([ @Q(P2bDqb.tۺJs[Ob6guc =l&dQ)X5?f*޶Z%m7I{$)nlU?l|cXGD)9WrJ> ?ՕaPu_5@/qpr :Yf0iո͟%ѓGfҚ:Is:\(ƒ)xB9(AEK Vd:尭K)T2s"K«$@2|+]htHvD8F"WT93W9JıC9r8C/ƳD}(iQ{jhl{jʹ|W\I_OERm=MrGwQђ^U1=I\;8IӆxN@%_H@m3{& h$ h$ h$ h$ h% j% nL@ܨXX螀XQ#w& nJ@,ޝ yP\PKDhQzrۅq7m CB)OToDCN0ZGb8EgCѰ $3$3WaVadJIG^$+; klBP8[Nw '. f%'"r n)@ xwyeN$ 4'2H8DBc\ǔFh&]0ܫh)38FFKWsEI2C-8ljAˁZ rתyRD+MC\Z3 J$,J$,J$zDתHQ3j:*  7j&VP*J$xAagt%CV"   OV"Hpx%]GJ%5{"D,L$xm#3W"aV"_W"+̾+൹3 K2DӪ+{%j% >D?H~H$,J$,J$(Z#j  nHp)%Zd$j$\NH"W H$Ic$HpGO nHpKD5  >v#x&<^D'3L$J"A3P#P#J n$IL$(H$J"I$xc? ^3y&n"ԷhH~iHXHPHXHP["AaF"AH$uJ"Al$j$|t$z>_(E`U(?A.R<+/Uy-GJ܌(',~!U f$ nhOО$=EpC{1+5Ƭi3ߘxc8ar,N#Uud:_o )piYI e,V┏5. EuJ\-'cv.&QyyͻLZJ52ٓ¶g{﷥ 99J'%#tiu.~Kʡf(W\72ϨeȧIRQa(TWی#j%k準J2#J'lAh,ّ݃yxܞ^\i:7W晵Esq[K;9 r^)ap̻lJ7Uݑ~蕠GOΦZ'r3mcPz(HP(#p҅򘱢%]"M^rB7zKNQh]N4ܐJƹcf: u(!EI3/zCӘ_-^/h~PMf.GT4?V PGߪߢ4F)-[EK.H7(Pu!'[u?vZM'wqsh8 4\ wwûPQQ].r}j97j^|֞8m 巍_֓q+ rB,5Mr:2|9dtr<z.[ΧWtjw&,ʦNpe)_$i>kb@n%@"`RL:gdFܿL G^r-45Y [J·1@~z$-˛nd߈[kmzI," f%uۋ]3jH qyma\wkw]s Q2:82n\ۋ]|euCZ6yNlIc!qQ\<|x#jJ A)yTt#rэן<|,x^ᢥ]O ǻ? 牃J=QrKUJ7Пis8fr Hr}j3Hm5GWUOi הrm{3IQʻFU9*y%QB[ ^%hȩgqq~g; GwQ@qTqjPqT8*t;H0m\~m8 c3org8V7<w|Z6Mnx7%[:j&Al tG\Xmryզ #D_h -^R<ϴ(㸑Qy J9 WlTFD)Q{ o˛îCO3j!ZH'Z\ -ml83) lև:L]|Z&gGN{^: Pi MǃFJ<Ah!lGNvxzdZ2=g ˶V-N6[9zJÚ 4š 4š 4š 4š š 5, kި\\FV`F0nAvЄlU(J+P08F7[ˋhG^//vMQQyq{=GI(7 ښti7ۓ,~ɡ!e}<'ZZ+;ŠݨVmll1/8+ VqN<#>yܓhF3zϊ:7ۘgWJg( xm OGF> stream x]ˮ$qWܵI2iIwz[kw1X]sX=wHƛ` W3}4 /gB/?|?j#g/o1)5}_>BVX|e\@ꗏGN1 } {0<=!sH_eΡ>k }BC_Pq0οߠs ?nR7+&@T^xx!㑥oIVmxoXsmRwMC_0xosK߆~˗渂@y/۵ XtaКZ4}c[Fa؎Ўc/F\E)]Sjrg17ohE(RrF-ܷ74 th %F 5"6o2&Ұe,%𵎜@Z!?\'ªE)jKG@zf"7J 6Īu$ pҮ Z+Xu">Z g)jMUʀJB %^YPȫǮB-8p.qFʯ*Zqt*BQ~=hD8|!=x%=9$q~lO\la+Ğ B+KV~uKPI*7+,& 9U PkJ;Ý`lZG(~] O 6`_ھ= J1,RD=-:%CJ=}xRO38i48U҃D-}dfgTi~ PB->v- GxG{xfvG3BIЩ %\.3bUg#ۄ =2R3H;QZ#mj^^(?=UGhH>!"fr]QGV=?0fgg솒?l1cюZ]B(')GdxCɻp{8!8Pë-P3C\+3h{p^ZrSrv=/]k]m.v(ͻ^5fb &](uI1(0K"k8\9nq)-(;Zti#qFh yltL:tu&Ժ=%ªRofvKz~׾yo{Q\3Ȭ~2pF914X/Gz76}z6"לJb~ۊ ezUck[qAݒJ磝'l<^:P#9' "x0:HT1{\RX%G}4XY9sXdmTqG/tGUSb電7/sQZWyB+gR_;$]6뵀 HrtQhF06j҇͆Y+©w :W(V13=bv+e `U2)dCb/7b\2~z=u)"֭gIǫQc..D/Pz=xSf'9|X"jWV [@>|и#H RC=p (> Qܳr @i -(#H&@{l]GNM*b(.|cF nj+mBб[%ҧu66U2m+%'ZсQh:B;@1a4>뻤(yԵ3SR փQX?b[8pt)F :}KB٢!]PJu$Ž)/7bu|NU5M9qzN+cP^ gGa݌;vh]Jid݀i8'H!=tgTʥqvj7q,^RQR10MD '=p?Bߊ9@~m'n4;։(NLGhv7,*՚FwMFq\Rq{(^?7@O=y@n Î[;D耐{^AyѬZ0x]|wUM |G\B){:%, y1M,.#C*%(eEFz(Nyĸ^Q;#{f6itDYO׉S=#(K<('hH83 vGmH2EĊ"v`#Hs=~}FͩҐ[;k+IqnpCo **ZK3'μEڣ{]< +Q tpN儕](_ 6f=(gD,ҍWD}<"렱$Ӻ3;pCqlGAѯt|>e84O R8%!ĉv EjEqQAs?\2z ЎA$-lDڣ9.CKN+'~1{ZwduԚg>J 9X\7hnHmu+w=հ. *&*Ƶ @ 1Gzsk5o3 J~C)^o8u( K:u"X;PkbDQ4y#WUQ_Q8NeQJ! 9I׼I7(F5)` p" %'>{%ĪfQgĭ ~LrzcޡG7 O(2ُl*{3U@97PQfztJ,SbnW.cQ$SLF|Cp-@cr-0RRIO|o049yz]Λ2ʥ ؋xnm,/ xä0">h"t^P]<Ǣ- U"i %_gkY yC!NH*:1Da8mW(,iѻ.cήvI^:.5.F8Eoӧl+Z:b45͇q [V~+I\к+(S gxKQI>HYpЊte)q&krՑJRgRGhC(e tH35(?(etgtR5=5,Yͨpjvo-cn_|n+U:ìI1)< G"9e_hNMOcQgEz/'IZhI%^S=T%@y*B*B)^Z`nuqUӛ#z-ކ25#[z/xӼJɊU ZWęj2OZF(bY Iof@7kVA㨍SF`jh7XuPdU(ZBEk #d#j+WN0. yґcd~ѐ"Z_ y2DJ@%ZuQ@MZ|Lao/[ %_@TǷ\H03blųq *ӗc)9KUfr<^ynq ۵w;=⬻`i~ݵ"z)g@k~UihX4O-g&Z _$j])-3$y'9+BUv%O젪ϯW8;`<j(ӥG&)o6sIzѱ$kz<[oykh;!:tRY)!w5)X.EX򌭢hyk>'O/XWC=V}PmV7E~7MK9x kk2NM_p\1W(ZBug9șyuq .~vb}m%Jruy94 $8o]o(՝T<셙 v4"՝1KhT ( ܽAg j伟$9eD?tCR !Ɣ+mvPj^q,ITN-{n`ϓUI3&xfƕ_=KEJ:u&COD.LPrʆPIy0*OY9A&SkIʧ_Gh93N2ZVr\(RSJmP'>9 `n6bF  wh(O" hf"r™]z1Ƽ%kfNmm^:ẃSA߉sEm[J@ j`(|H1gvt7&@#}:TMύP k`nݿ6yzϟZ:ˁW~RRT.{A)'KA]:^LܘMyF'KE[NKq#z22#H3S-NE~A71EKōs9Fj݂/`\u|*9hԯ83йtXRh bOofP4fKIY847ff`cƒri>T:61+h` 3ƽ϶#{Ic%{ ac#~n1 VĵxuW<663eŠFLuݼUh(zFj݆{ Edwj7ƓEjx'c]WJmc_q:?a:^@YRursYĚbdmtBxQ=\ܪPL<ݞp(vf6릈+8@݊5qɫYax3c5VpYsnzh JC;K~D/;H0{f*CZ-ِK[ 0heMfp\U9])=ncLjaH^4\$E3UcyE?-R ̱ Et>t;?eL-Ԍm$=9-c1x|(MNPqt3#=w$EHGWi+َ{(ьRUwqg7r=3LU{]l[q,VM$#hݞɸTY%<`y&x&w+쥂ox=yU 78Qj8Kudm5ͬң{q6IF0bk#jjGb *SBOA-JHB\8Q8Rr7<[L_tjQʥPNV?FR3~VQ3^"n3rӕ(H.ʑ?Eғ9{9] &XtK݀Nu̟*6?^&W5xʱ- @ 'w=r:iW>xmRc'/[=nkT8cD4~nAmc!.'a7؉ǥ8_Y[xN|"Y5iOXa,1ᨙz hZvC=~@>GU9"߯66|OKCS9"2Zś= FSn餘{2<R*Y|S ~yWC 3/c߄p PAU^a4D@ (8tPd@9Ey*%,^6^EbG(G!%#5)HDƊjh0 =z#],X!ăc s2ϰ5_]Xy_o)~ْ_Vk?i=?yW. 5HO q {뺙 )4skqs Kҩ0/E5n ^RZ}1<{$^D& PP_p[} :"=BjԘٍKo)>E?TϨ+F^8z%+l 5 KI銒t.H'*n[TCqXAGok%Dap>xԗ|Lami'KM4"8W̦OF!X}+nJAOp3 bC%b0]&>3#;4&6 A'ny֭ NPjEbP Q/ ʭPVrCja ?_W5\YϜ/T b5̒ϳhncY=P;*7MM8937[Gb_񘂈3h҂xnDZMxDKK'7allrd?r#NZ9Гp Oԓ *H }#͜$.g|O9=Mq&wlr/MI-_Э_:3˽xF)i؀M_'S:5? @?DZR XQs"tJXNNb2/ +NFߺ&"-m'huzEk.nE@\ԷyVT`uSPi3; ]QYC#E|'NkB\L^(8&}mc百̐O?C*!Khhß~N^95\Uu_Λzx=k77o7>YxY^@<]x|!yw.+J7!tkZ*;u4m݀S\q!A E4[b[嵞y=rxXr^ֈPTGQj1Q_mGt3< ǘLq#&e^n8z |PHF.c4ӝڂZ2:YS3P籡VÐdR"M=<<-e5Gr}\J8ǀP N^lTlՃχ#庹i'_DU$oz.&эUw\*c(ů dt%?*NxKz:ogoʼnѷn MqVM`?.+pEuHe#ևmX?.-#"|HQ`U>egkDEkۡynj_.88Sk(>̖+g8Pn"E2yof_'斧fnˈs/ L*_8E/J~!|2?F|42?L{Řq┠SW.$F"{0)L?bV˙{C(UAWtFaBRay&h}RTF|%P>y(A{I饟3S.?yѺ(ۍ:EB钜O6PʙN6=JjތU;2^=#yKY%D#u |K9q"ң&'X#wsű 'zªuI|Z7y\ 2B,93;w93iZ&Vˆb*;I۟ {f*HM3޻2(ZS苨;];B Pqib(jzA(=wJh|m+Arâ(KuR}>Q3[?Qzz~ gy3yY#JO#vxF*l>c'jov?{~'f|^Ooen< o 0|X" z>8^@~#,Br!׌0we[Fj(%CΚGR(:O`M(s IƩͣn >G&DX\5Ƥg*+Dv4>q' mUU/)Z7-^x{ܣ_N3J/L񗙏[a 9$9|G_GO񏏿</ endstream endobj 138 0 obj 12341 endobj 147 0 obj 18468 endobj 146 0 obj << /Length 147 0 R /Length1 27732 /Filter /FlateDecode >> stream x}yToս}f٘a_DDdveQP %"El:hAD F4d>^B~U݃$O[VN]W]z)#H&͘|!'D~޲9ˋe|By׭˚3,\hY͋)omW.uWX5\bY/f^؉g͹SWYAV^~U.\t!G E%^"7䉑bBOjT=yKa7{^{/AG,o{ߏ䒖^a=m!f"<"B H At:2 5A5|dxM%O+hWMR,A{"|f" qױH%h~,/R*Hm ^63}{@΢H<婆j"bHD$R_x V伿RK"OQJЗ^0u(HzXo=o?KEnFY^by!&ߑoV|[# 5$sPZDQOrϓ&5O✑ }GQc<.5/6׼"y dgyMu,QF餃qyI"f闥SH^#?'wᩯgU2uEDfU<5:""esjDr4#$R;i/0!?xV#d?EED;{>EDþҘX"AV>ǟ,Oӽ%?%$3y+/ˋ1~ϣN,v0je<6޲-[gR%pfH0%w$wsdy`swt#ed#'7p܊:OEc~ E^!:#2^X^$k7^︎/HV<]F=TE:{ŤUJ2X^$H=҅dͅLW)|> \`LF']-õ%l7df3]7DP{iO㘽No7ymvW)g H_  A+Dz DN)C"!d(ˡ?'j5U-|1BC77v9' :]SBЭÄqh$)hJh4ɐl-ǯհja Jhj"Ͱ*:Z02:x,Q_@V;'Ȥғ߿\ 9w%yH/Rei__dnzq|mJ&嗪kUr*4jlͻڹe7tDpQij|ݴܜ3XYۂ gac_y_]{c&?rh|3<;Jd@ J e@ bϫ$R&H$f͘c$` ,HJƒ ݙ_+O oĀ'ЏTzJZ|yH{J@nΞNSCu]!CE 1:g"G !]2eѢ),f>J{#M9j:&.WfCdH>ڭ:LTKUn5ɽ6N\+H66`44wػޫlN>,>n(.sF pj [ K}wz)?_[BҔt4 `0yV2N1ES'LxQ#C*RD:6Jtejvpe.6Dx"K;faͬ!3Sot )P:M$lzzF[_ O>٥p})Q7q ?(7x'6k-iz)Ra>=jr0r{|nt{`@mpnTuC6U01fI+I'QU IOبM"SccuXgSUYEg%bs$^=9"27Gvs]}3tTa/Ai&Ck̍hh_l[ر"zILr.ڪܰw[<vn_&qјg75ɣ^|_R;8vH³+*Q2we԰/TL''.*(eQ.y.%qh,,J(L9WLDtpQ QTvj9^<VgI.+ ""cQTT76dܒŗMo5mM g7;`9[F?L'\d;T*שrNӞP%Ą9aW>Ȭ%x]T,d^ aSm3Y-BVl|>}ȬRx̲16alg˨m޽g99GijGG iinF|^f JR|r`԰f╍`͕M~dX͖Yk2xD|秝}]TF8fK /4- vSEu(JNRjNQ4 _Piiu2N~^!2䫅 YTj2&EV;^!ӫ*V}FTUFbJ[􂰒F-㸤 t<|dH:5qcNV $J L*9f0ښzogϷi3G-3~t,᪘2ov)/ܑw<)4 L4UXyqES *z|Tp@Z)j-qp3PlUD[gPg9 *.ϔP|G (T3~xV:ue; ym*2. B R7|/%+u]%z'I*XQj}yr&V=]ΝFUЛ"A=7aVfg\X4e$˱DWn w,]rօnuѢs{l[`r)eun&so%[3Ǘ%05S=3?ĵDʳ*ֵV͐tnrn}6SrNguyb89?XF!\iBՙ\ؗc~ 2hwǩO 5;*u~4oz{_ G ==Eh^T8x?cE Cܥ%oؚ_ .L>R8V2+ >Ro1|#}wDC).WT E+5等roX+Y z\ K'tPxIw+%p۬ť$ER1ŵ]WOW̥#$> K[g/ X(bҋE" _fiy\jc-N?D_9ߢKl q;KpzRWTEC^}-$ij 8qxC*a \ye3,laoyqu?fi7.ȦI=*v>:C9K2* v~ 3x=0 2 $5 .p%^tוrh OWIX%Md)ҟ 3o|e&֏{N $A6AlF6ΏyfKG8LC_/̉J*,ј阑D ğ#)!YHC {0s-2i^CG网U2squ^D6O\XUr'2W)?O+o0Xp/x>>7y.˕K 3]M[ )f፨ǖNEtџz Wejkٰc :ҥMf]OS5'خ&?;2FhH"<'gub b-NV<^e_ZD0L+/ ] vQvM'hyΚlo/yKDcrީmO78jnGk Ƨ-seRc 'f@,z^\}eѓH#"tQB.C{I:LRBX鉫dW%׈kdk?I)AY*LAM!E}TVaS}y: {P;W`jeEqɚ- 5׌oZuB>$PuҫfLp+f_}7_5o%Bh쮥3̸lGif4eRi\b\kd|еdf@3e1/!~]u ~(DYrlJ_zOX, y x$TE7tN8J Q.`rW~R* }VQAݾR$MOiˣjwЙUt 65JʟY+S1x 2IbP{e`׬ Z`֊B'c`2}Lu:-LZ4sI# HRl rO8rîY8?H(몉WLRx.Y9ȸdfD0 0 WWWţ)Ø~&uT utHBAbg0锒AC%RVnTSU>w[5:8Y8frU}H`+>( UX2p,:t|*WC`{ t(p™́p( E"XpT>&MrOapt&b_96333ӶĶ$ssfmK'؎;rX*lrqURpupj5ѺUիwyzA*i,%^k-se2,bI,SY-*@Z2/I;'EPЈx=HiM [^8]8Lm8Vr}d])9] k@ .Ც:B҅>_}Ђ;Y}¹OX8 CD$h+H>(HSڍ^/#6M>,ö;]]LD 9E2'R4VLqUhprܗ=nLw 6ݚExcM/s+sAS{i FS6,6,KTˆ5ŪjFUK3";;/`B nK/apf&Y2+RZ|Buya)M/gSUƜMcHMf甦ꆸevUIFe;l:׵e@zPc4U@Ƃoͳu|C4uas؞2ʚj5&#[ߦMHLa P^ZxVuf7xf/& ?mp[sZJ/3F\V);;?x:m}4 T(kkEi3Hv^~9BBчFOOlP":,ga9l@ 0S@~W}GlيdShe4?zTȬZrU@8@Ϋ/tԄ1*I< f6UU)*ij*5 @gڮ3e.1 9-U)0!S:8T*#ղx fqřnaJ B{L ^PkqE=ʼn&HX4BgY&DrYXYU#VaKown1l, UqC5'lQyN`P2\Mכ& K_Znw,*^)>.닆" M)jE'oI4jIM;>Tgw7?ty0hLƃ"WMgF v_KMGk߁Cs{oXb^b_]Ua}yaaۼZdf7eE=q7:M>݊u w+B`dP\l[}; \\fjY[{nbX?S2B8*.FF^A]b;/ν/DݸD$3б(aCqTbg`ip0 6c9rs~B9:9:߹ʲzSUnIޑN8TtU'SX( }TUJ|cvAj Ci|l9ˣ\2JQ\M?Pկb:=vqE͘y[k'&} G*u'~wb"!_"?5 [}]%;7t׀ȧh U~Y xC!sN)ץuZJ mhT{h4;T'^W؜,b~;mO*7SFnE1O0YLNa߹N9(9FQخlS끷e-S6>kܭo7Eo Ro,)9\Z v43LP `&˷hGl."=X|̕"?.G1aUA#9FmcH5yz>?EJddP 6XR+y**n7]|JJ7lqs q=}# {"\Y.5S Ct zyt\tM"%=#2p,}'d$Yqs ڂX$ &Rb1/Sxc1}sN&xdTXUTduF#:EG$UBbnW%1)H_-6L .x Ûelc !BZOA Vs׹L+^:;٧F;Q1t[] Tv,%9"*I7{n‡RKn_vl ?R`,zH-˪6L'O"Gu?9alh:bZ-W$$uP8ݕcJw_) .c~.Z{Q}Rp v~QL]wB9Or<Ϟw0; 揺rzdrZ ;qǞ+4M>B ~' nErR_e-)'ξ< rٙ OO<;Y%h#Yp+8Wly8NQ(y pUtB}=GĢˍ3 aHK|v3S _0K,;#Y*3ƻyp( гNJB+6ZjSVܹw𷷮z$gVZͭ"l6{wuPeBq\A+FګU7=ߡ{ش 5(E+4hWi׼U{gI)]VSmimOtOHH\l@1Me=p4ݒ$KnX?n#TaBܕyKhsg6NWob9Q;aM 2D"ŗ|?Dژi c&1+AgzЙ 5=R7߈S.UAr ` {Ip= 5p;κzXD s@N:J$ ,rZvFTpGW!W-6p>qϣ7Gݞ=[C'>^rxPGXyK̇Ζj>;삼 w91ڎaQu<z΀ xWq=;<ۧHY'7T`K&a> :`tΈD2I|ۭu+t Spzb/fGpUX[*ƯmA@2GY̍@,}3kKE˨,28_RT{ݷi_:ZzmȄǹ<&Q-|rݺ]*Z]1vBEƗԚQ54ZB\ @i ZⴐlE񁎁W%rgrG(gt(+WZyyCk$4e|>chM'пpUP@?x@Y335Jθ=S\n-I͢\mn2ҹxm:h-^hG9Hҭf.4Є0s;؎ SьwǓdm%4|ꨨ wI@~+ϣ+ZcG8x!,ZaPBa.20,:P<Աx%k {$;H!R2I.65) f x)&u-,h3G}C};Ag'1&Ȣ☵ȅa8=U)-Fgcw&5曉6aSep,oS7_wX ƺsM5sc^P5}Z,u?ݾ[xl; |Lm J DM r4ZM8f9/Fh cR$RXHر4 hrQZl6Nf BN aVH RKB8S,!CcQ$ ĵ $jͼGq,SFb82XRۆ.3sŕTq_ A:оv)(o2D./ERE9fMbn^vj* ] uLf|8)f j+ހ+ZBw->`UЭ9kJ(΀IjbksyK"h ~.c,y9D`*m.]Ev¯R쭋hyb|gyt? ƴ`$rNkAփM9ϰc:/$z~5S}b~a49b07U ]X.&qba_37rhn^^~|#Džzկ@k=JD&Owvv nfB(p)t3ؚ` #Q`j,h](oqoW Eyr+22D0.km4'HbY? M#gڒWzÐd8&*7[Nkćy.9w=-x(dT$̫%rE&^XH3mV'g\c> ՘W#vVY+sך`_^++2g3B[Q[at72fAp5{J. 1^8C'q|8mhu1l$`3)X{2Nz`3Y)uɈ| 9~ѪhՌSpzl&kk~T!2WMSlmooqyKۏG; ~uSkYC=ж_NQS}p,aoMr0 7 {"*7Fa0 P$jӠ<c*{@wqX׎ L\:d7qUBL#OL2)X_ "Ǭ=]UŤDT .P\{34<؝* fD֧xzۋ7ӺMyz aظ1:g©cG F /l}p>8!5Sb?&؊ /ubp a0k} $a`: SBlml20 y0GJt:1y sgr.d'l9Wd>-:%/BEƅg&6r%G T_wtyGG/LGQϿ~npuh[ u> ZyD''o2`/U7.A@-N$@ hlޏi |K(/AGÁYr dZZ` eB*L|[?׊\ɠOF-kaVqoh`5 ,^%RklA=@$0%w[~~'4C [p׽6ܵ83"`EtPX2uoT,[]KC$oۙNJG-XU[2;0 ҐY]gC];jܫ֡J~Y?97nDOz @,,q;`(z;uK.z.Uz DdE3 ^w,4Y{њKWDbAq~k]W.{Y{,C"Y`[a "*C@{0!.W&7VvSS>)p%Spi _+.w5nnQOd$h7>{& ' 7?HȄk (I)DKNb/I23 6ab(L/3*FlI NÚzwXU `) á5Vk_ yЂq3w0l'AU績j~O M l"LOC%H/C|yPԘӑX{PO-5цAv&P= vϟBf *Ӫ{vK pz$*C1[E`WcGT/jo,8B#R?]ܛ<1 * "6Ě5w'.KnkIo)`p0iļn`ye^/,))<5Hqm + Rs9p%P^}c/dDɠ1&;_ځ/}NSؿAeS=w=3=>Ʋ=T%s1=ټcޯ3(T!0.[~&kA3r][`O^xU|G:7&kZܬ71;+ }脮3K4?ؾ}YO/Z!i3ev5g@hLJHpTYXO Rq)l?m cF' ⫋2%2J T?W2 ԣ _jˣz X% W[-3vE}Y dA#l7-c 'lmNGľ'f4UXϫ @M -LO)̨a\Y_nF ʨh'$nZ S ٺ2kER=R5HoD='XEPuE7;/RX!`:<Z9Cƿ˩;]4ukV_{ՂkK-Y6rz=8' @0 XX:}I)8dy$@`9`=N>' 0 h, x>$3m{;b~@L9?P(؀r|@E_f+e]PPf6Denn@{2?Яvf}ej087(P2b@ʫW(s֏߮~À7 (|aϼ G !US endstream endobj 145 0 obj << /Type /FontDescriptor /Ascent 754 /CapHeight 595 /Descent -246 /Flags 32 /FontBBox [-655 -409 764 1089] /FontName /JAAAAA+Courier /ItalicAngle 0 /StemV 0 /MaxWidth 823 /XHeight 462 /FontFile2 146 0 R >> endobj 148 0 obj [ 600 600 600 600 600 0 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 0 0 0 600 600 600 0 600 600 600 600 600 600 600 0 0 0 600 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 ] endobj 144 0 obj << /Type /Font /Subtype /TrueType /BaseFont /JAAAAA+Courier /FontDescriptor 145 0 R /Widths 148 0 R /FirstChar 32 /LastChar 211 /Encoding /MacRomanEncoding >> endobj 152 0 obj 13104 endobj 151 0 obj << /Length 152 0 R /Length1 20068 /Filter /FlateDecode >> stream x|{|[ŕ̽W/Kd=-˖dɲ-z[d+q$"AB!d PviJ ,PʇR6viK(P\̫$$)I4a [Ĥ4#Թ}g$;s93s9yp$"[tU@tf7`S#,O6 "j5 1\w]n[~-4GWzEڼ&q^MX:nb߹ꛊ'{zBp۸a3~"{l+BB_'4Nt"IIM̗vy*cԤe#W=ӻ]*3y]=UU :b_Vkv+?puZ@/C. UXY ק#MuT2RtGl+t&ADayHtN@kDtKjQZDyԱN#ȧ{x./d";5zwtqtvO){x]wdx^y3y9F(GI y6 i"+P}Bi="r-o,?XY^U"u. 2|D^o'oVA #RQ3oaeʜ&eDdzx.Os-%<(ce;AJp'V 8u=Qr V2 g;qe1 VgS^9ԿFrC)>39 V:E Sbe"@l'~@'x5"W#-"r*j8^x" oC=g@~VyYP+MTcik\~|8GfH孿!ϑC gygx~Da-"x!?a-" 6gZD^֍(s OgF$)w'-<=CLYY$^Y?#ryErdH YY$w?_.x"-zD^87| {d+yzbel|:^^Kpr\W*~J2҇7.u,%W^8%DhtZH P#|rEn.FH.-}i%|sxlL2igH?ƣ,c$e\/o\"p-IH+v& )ZG+YkF&ͤUD^(DoĊό7D"LAB0)5$9kO9g:4X צ. 7"&5{vEwzy?L^TsIY[ܤ׹9"8=NbųU`-bXOrb櫬C,dΓ&^"z\;DI+EGNͧ⚗"dKa6/+*)aC:EC~pF xY1*j-9DsyC G8a -T&N!2j:}N-ޓh^yA| {췀*@~DZ-"izo蹃x1'n(?:ប {74瘅 ?"w d5}aFU{gs˟"O B '!)C^wP!3ox2,}&=QĻb~FJ A`s-y`?&bNKfspQ[Zۄ6OGUn.JF#=qzcmlo3R$V QH"<=ciY\"u}q!mB Ɏ{F@ f_qH\BZqƕS@ڊY|/ɠ[ <d^C5cB~wB*dv!tNh@7D*`P)6q @_ں< A]?{! X-]${ I3op'OBCX,I)H T Uϫ%u/4fMx- 2JY-{(Ia*AXZ,;q+66SɊ'\U*ՓКb$Z ȾbD>hk xMU,F>RД}~zu=@s}T53_全[ *Qk&{*k< Y]e3&&=^6:gWST,5޿6nGZ9i&V;wmUB NaP 89! b7]7]ZL4N- VCV*7;1؆̙.Y-j Ÿ|D1t*$N*I9%jL7tnP2.L.Km5*A볂kMGo\jPIٯ'봔HAWk˽ 5EM6&9W-v;`_J=+%#wD΀熣@+&cª%7/Y| tv޼kM)ywnɮz+*/I5C02RY?"RvJ#~qgi.A^T5H5eC6I seBUj'|05҇4~WЮIFQ:0LoOMV-oN%kqbIª5o^v'hrĐ)K?;C;~t%MoEq*k|,"S$,U{ȀF[a*.JF$KQIF}^$f&1~@a8S4sPn/"LPj\IO6 >O~^]WZ;ϴ-8˭V'5n[fI ȵkEJJET'J~HZ˶C;_f0E':_VmXMxSzՕe9]d|߳e J}CA~5VHn#WQS  M%Z"jHWI,jMbG7ʼ: dZ$42N4g 8<,>fP>JdD()`[/nωsߜ%+/=^=u5>p[~qyE+\>s]ҟ^vs^vcv R=?"CmLK*٤KECJW+h6,7ոEԥrT"N]zSg5V!~y80^9iUZ: S5BRK*4GhEhZ5+nKEҶ1\;WITIcIWQ>N@M7j!㍍Dx-Po~ C.P )l iJ_TΑ/%+Hؚ@)>y6D gHF5 cc+Ⱦ~0 +Z\/R)ILaQ1v1aA0ޢ{:4= @Ϧ[d)hTr'hn_'esgѡXmOPrOrxȨ;`Zj,5m+$CM*B-9, l?(i0<bAA PFк^i(c_9W/ڕyd/ݾlǶa+}:?v[*8jokn%V.ܼ }5e{u_v\u٥׮?ou{!z[1k֊/[cO2;$Vٌ? .%WmT)*.5xkh0sc5&q3&F.D'~uß*EZv¹͟wJ~/O)o+g+HR@Wغtml-%VnT卆w2a-V̎V ȗmΎZdoL\3o̻la<Y{+MJ4jh꜒0&`p#P7^6|L4Ntc2dU KlЊuedYت]fMZQJf}bp]-! "YV9n %S_P;ID*,f^o bBDH!^,w#t:I+{X%xy"^omGܥ" /2S^Za\o۩J 7Vth7-Q|\*oVH1o]]Q|̐E| [x#JfB*Kyݠgջcrd(}F5y1Ã2[\ ~8MXx']U. au+8[*LbݶЃ.^RK|+:s#Mu3k_dĭY/?y/0z61&ȫFyD2Ԕ:nQVW7E^_Ce ؇Z73CF&>|"*0q7La~3*qU#z%(w{ٞz/Tӝd[M oQ߱t hƷlIdrd.N&RfeTky6\Oa/ w%!kc~g_ ahfev5~Xü+{2?h(ΌHCA#gb椩`A] jQ8زcvg|-ߥK֯Z87u|eFg9i=uᕻrVL;oꆺ]@Y@^Ks6sHɆ"yHu Ն|_]buv]u"F9RZR;?LLFx#h8mfE` \1zbЯv]mO>ED+USD8tCL-لx`2-`6ʑ]Lf2l*;څ c}*=M^1bua< L07rۀ wmk@`ZP V3濱]:`=X4ѰT&^I#t֓*M*{XO5Yan_PFK4ܚ u3 #vDm2{ǣ&pc/[ptR͗irs2^ΤS&,lfY[JgЫ|ĉf[. J!AXB;?:W H_6돷Iǒ.t l)%*pQ`CKHRw6lP*pi5nk–pmk[KsCs'!yIVϱ", I}^o(/`hVҜO=ҝ*M͙f^nU&7]ٕEdE B%e ˔l"N/<7rx|LJWf2`xB-*v,~5Fkqŝ/(_v;o?S?U^mⱃ{ {IyL x6@jg);VѠ :ZE*i[ ampkkd N[,+ik:-y婋2~ӿ~3߸qM.>Vf^Z $SU,YRUT8Vt,`W T"D]fԯJFݦ&}]WE-msK"*)~I$wSU6XpSmu@a12&/t<ޯZƼ](m{8"Tl?/sqiSdam?-[W30ɖ\'w.kNJ+W ^A-)J3tNlv|$Cc̢ ]b '2,NfHԔCTD{Rϭ=3yq”iW:&L6ޝH -;^=TU7pr&ỳmA)PN<= ](+(6fWjP]gE^;, O UXVfFiFg~劁6ykMMA}G9x_Dĥ`+Hi5*zM Jʳ_||=]rC=NX[Gc:xūS(}tʿEf5Su,NT ~7 {픾3n=kVڴOllCT%CΐToil3Ir hsfPh[ҽLlaɊ|V9p.`UmZ1M*[3h Đ6jrC:H2kµUMhCmf"[EW1P,1dƍku8}MP]_p|FqomL _-7̈1]|~)4cuo;Ohy+ έ 9J0׸阪]ﭭYpYda5*hu% !TjY#Yp^)DUs8qMEDQ&e$SDqG+_|KUUHC{P٭Z.Z]g3-9 ?{Ѧ'̀•=IOu0vouJT@C ۱ e)yAKK4 Ǡ vUO;a;" #Шr7qȚ*v= F?MTI@(oUrKiX%c=l,Gő|= g+dzHoEUL_+c k{D:VV~.N|Z#P1 g+9UTaWoQXw`!V)&o)Cצ3jMF[m/FY6*zjv?&.=d4uIz*f'2{TnVoRo]!Ӛ^Ԕ|np7>rs V6?|%2#fj/4M6Ң­%<{u]_ֹ?~gssa6>vO-Y_zՓ?gtdH gxXky>m 8jSdxҺL)PSt%E<~gf==V ^iX=Ci3j&Ղ ޸m;Q" ,mݮ D{ꔳ'\]07ql/)'jOc?>`o77Ai #ZFEpL2rQzJX1$ꚛ@%[7~\)<CW}Oe}xLhT!j<܍9M|tz&4`t'=g)&n-yz䠈sMir^ ؤ7 l?.apʎqDvn>KqFNDK2TrW^:|NLNiS |vԮiTAj.J+k/ t`t]/1jPS ## HgA{͠Uuc:V<ӊgZ6 "~[y<ħ'lo(1=R.-u"N+3W1ڴ z߆붥CK \#^le*/X/@BMsgv)Sa7I\ TY'uPG\>:BP̆fp|:2^|d1F~Xx`l@_|l?*<;,p5kxTػ?S5&t[0~78f"ne P948}R}P(h<~R>2ȥbb,诎`Ì-<#tҰjm詢E@-E!ۖ-oi3rZ9$Jriw|k.7[k׺뾱$i&B\r|Oռ__{;S2d6CΤv!bөTŀx2u*jN"Z٨իk}h|Y4?i3j_oMt3ԗgµ}قen,̾!&E@Fg1d-R-MCVG0weY}0Y 1ݖYLkv.mXl +kO? sa]'/ʴRf'qH`jj1꩞uqA#lz[ﳺ1 51`'g9_Xx6ue[zhӣ9c\}"5bM=;ٗ0A!ߋSjKGrgTL=.|LS`EG_ԯ\DʞUCtH]_+'/,Ã縵ˣHl-1ƦO ;EG(݈Raw;H7ޭ7ߝ&"ӣӨ֙0# ~{96R2zU/mxD<|ƨ?d|c;,!#q)nз5qgadqpZ#8y3it_XԕIw]w$TY]Y.&`na= Z} 4|'?vrU[\ mOXIoٔ\KOo)#Whc7V=^ّl\ز5uyy`=9cB43 8rӀ[J|m"m34sR4>M6*&&ZQj7E"3x쩫gHY NBc[VTjy]֕q7.ow2aL2r>xjAʟ³^m^V}BdQ>\Z55$1Z_tg9F'Jpȶ,8nqܢ}Skl-!3ܝ4; Y!8XBVù;d[p݆S8jx8!h]/>VNAU{GK-qW QxI `MQ7'qz l~BF z?ҏp^ßû؟#nո^7 D654/=Y{x"ɃlNrpoBsX&G@钊;T؜ ،.c½}/u|qׇX1gsɪ_f6ٙT[—VU][w=l9PDxC-y;?`Fۈgn₯WA]-}Qw5~FPY?}켂qi'P`'|EC(8[ Xb?WB\6eAᶋ,xiYʁyssz#aozd:;3 ƌd]ߢٷ$6aaP XچrbdM>7BU8א&;ɩZyné`❥EkwHz*[fVjzRfAe>Ӭ=E-A `؎e1.*J0g[z^rU ӕѻ<d}fꋮ9 L-ִ$[_I*W`y|56#Hfk,@yu筻·#N\T] t/n,'&8Ss/afpFyϛJc>-6l|z~J:V[?SGyYVRTHnU= ڞܻ[S+8Kz4徒tP%Z_'&^ѪN*edGrA*N- 1f>=rFN[UVt $H"SUklM*Cبȃjȯ3 aNA`pܰi5CWF:8귨f*;SC_سDO{v%@?:u6ݱ#`夆F 3pRdd׮0>ssp񿲉ɇ89k"hНw~%V &4M컄a6wy |/<Ɯq/X +| u[#`C].0N,c>+݃Tb)O=ė7ZeXD Γs*ْ#RiGAc4Z:NuU$f Ҁ MYH x [pMVfdB?̾YNUɦmmӏDK$0G3UVhKʬS |{˴[焒f<& Q~q&u·u.77"joؙ—s!D)ٷr);, fg&ޏo+'pz_jGPKpv: 8'̟wN'=੓`l'L&;7 ? l|$I0[d|$x$x$x$x$x$II0zlNMOoo_? < ae|$$}0q~73mT7 endstream endobj 150 0 obj << /Type /FontDescriptor /Ascent 754 /CapHeight 595 /Descent -246 /Flags 32 /FontBBox [-656 -403 784 1119] /FontName /LAAAAA+Courier-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 823 /XHeight 462 /FontFile2 151 0 R >> endobj 153 0 obj [ 600 0 600 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 0 600 600 0 600 600 600 0 600 0 0 0 0 600 0 600 600 0 600 600 600 600 0 600 0 0 0 600 0 600 600 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj 149 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LAAAAA+Courier-Bold /FontDescriptor 150 0 R /Widths 153 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 157 0 obj 7227 endobj 156 0 obj << /Length 157 0 R /Length1 11496 /Filter /FlateDecode >> stream xZTս?YdO&IHfgL&$a KPHB!,GB ""Q+Pт`'nTmҖGܪHn Nw~緝{Yp4OVFFoBϷ8uN0*oN]c'D20mIW I'355Mm4gZOyi/#/O K(jt+ёH$TdBWc~h}><94Y=&iFM8:TS|N{IGbMh=uYBgųY5,2-&я$À{rNxf@ *U)d$$rE /3(q CuĄ^3*I (Ĩx"TbKB/; ]O' -@2N7Q ?~CP$_; Z%ZEj%M- x5%`>ha. ubO2#$ )NbuA2#Ĉk?ˌ_2/_1|$eF>'G<F>O''?+B"WD/3rYԼOjw cmrIH/() gM/3:~j<9y㘑s\ɫB+e qqˑ&4ȋ%q/Ӥu\NN׳8|v] ch9&x8J<v3][(C{dO2Z?c8ߊ7v0rH-A' ~nqR <\ȣb^Ghnj2{8bph+E/D;H8;5J0R m \KJ1bh,ʃO>k/XrsW\+#T0Gb .2NR!ɒ 2#b;_ybDdg4C@`#Zx#:{[q^;xrbU~>N1]`"`J5 0AdEDLۋ2ˌdDVu|5(5,32!8fȂ i HƓ?/3Vzq8nQ3^3봑Z!>Gx?jxBomRw!Gd}H`z|9'Н}ZIOʹU RYGϪdFsj76Y6 n/Lq H3 υX.>ZCJ&dR\mDjr5ۈMu)j4COtd4df>ŠVi8[ER26a ]/Z@a'.i?ɮYo=Iv`T ǫ9Lux^  7oDz@`21@``#`ˀ9tM]O~| ``7|% M6$PEZxnB2봊nIilN5LIFMƫiִk5IG+o輺tczŴ*vdqlC"-NUv%*hT$GoH{of>ٖ%ZT"yNm_-8k*/tvDh_ZA  awi.-KK@abE1Y LJcĨѮө&H6%.VI]sTOJA.ajwWb[!OLSRSFUf*c4*0 Y)&t+6El&.,j%'?0yȑS@4yX Vb e} An_tfSE5ʖ[US۪)UPI&H"ZH*{{<UZ)p`"ܱ6T/MHW[Nb/5e9?m{3g4̙}fLԐ:c٨OX M5:g}֙ϺkVSYxʊS9a˝K1+zRy}Bﭯ76͗.FT_d!Wnm,3cFH*e>~YHM%VDr]e*\::(?T9ur^oDg1ynxZ|n7/y/FT aaaВe50*?G髞M{R3T9d9팭%v{/ؓY\k5mΛr?^Vs;b ;2#C6_B ~ ;0M׿ל :Ͳ:SUw+ b!ym0źDoLJTG6km|>ϵBovfHQ?gZ@2p] ڡz*!eY~P0߰\v"|d1P٨Y\WVW5ɩUWQ+ Y~a ci)_ZV;fse)HLѱTtJ3b_oJs#^-DPlBuzݟ#˹iri?i3y}t,7Wb-DsZUMi,@x<2Kt45C+Kqe9tP`r& RxL%B*IRSrjzMZ:lnͅ&ezlbY*oVM&aur5tu>* HH&ryłK$Œn {  Vd)2_\k<T̍?󜙐vYe5JKVY]"z]6)-pafp+7M\h2d^e@Ku5*(=2f߿pȥ3Mk͙z0~QjUxɢ7Wڜ^3aO8y=Cu+%nFьgHd7GC"k jtHb蜪@oYҦbK6{Ik]4wLUqDZ#JtڭǺxbyqO\)bZVCnB.m6ltrʱfٓ~ဴe66ݴ8.s#3ӹᨈTj`d9d v`bdPR8ؐ|.}48M3Ђ8:琵nཛm;T7J}"M< +@]N@حg&I ,1|,M*@]̼{!sQ` c}sLvd NխLT[LyZl` YVy`Iк  "_H(Jz&8Kܝyf],M^;0=A>i#@.J׫0/"CU#C7qȲϱ*`LЌOJ Uu/uqAN HmMɖqmIһmJꋤ X͊rڦ4+^; 8kXѕӷW}.w >n6%FT*=e hbknF9v)qra7-G_\.sc3=o"M; ,y=#/߻{u#Gɥ^ǢWzܹvL_V:h4Qsw} $Sou 1_==p&Aeq|!.QzɯW~~Z&Sۆ M.tzNx3U?Դ9F:q3ڹ^r}]EW& {΅Um^M~6<arfl ?w_[1Hkpmt^xpϼDT*Bċ۳ʈ# G.n [st:Ω%&͓R֘،XlKO 5Y/ulxidGR{rqؚA7[(XH FWUO0C S-AwmкK%'RU0Nȯ9Q9}M3g5ڊ; \9=i[d]/dr=F}5sfl!Y;lm.bQ wI?Ba#Vr{3}!sԢ9[=YZ9;=a[no+"$14ڠ!GZ ]p 3^Uuaŕ&83eY宏D$" pǽA~xKƒPz}Y]7trN-⡽_* L(v᥉NOZn߆qƱBv@&b֭鍿sNzo4")?s=NIp_8Q+ՆM6+6i;TjU!zmFqތ*uyUw|Q;w4,5FEPĠ*2dmir ܧ"nP/rB D\LU岒,qF)}(ՖKϷNa"6ᱸaN;_}QгWȾ xϕ/.GXVig  J|ӊ(( !vDmC/E&V^|Ȇr10_9k|8H2 F_d5 2R|)b= $idi sFL=sfvpp )ц7$KUF|j>@; S@<UF|j>@; S@ `#"?4[eJЧd:'΍1> endobj 158 0 obj [ 600 0 0 0 0 0 0 0 0 0 0 0 600 600 600 0 600 600 600 600 0 0 0 0 600 0 600 0 0 0 0 0 0 600 600 0 0 600 0 600 0 600 0 0 0 600 600 0 600 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 ] endobj 154 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MAAAAA+Courier-Oblique /FontDescriptor 155 0 R /Widths 158 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 162 0 obj 2975 endobj 161 0 obj << /Length 162 0 R /Length1 5344 /Filter /FlateDecode >> stream xX{pSUHKRM>SyhCB-$mSJ +8]T" >X۔aoA2쪨#*ˌΎ]qT4w{F(?ϙs9;{ӹ|eFA7P( zI>DIMk2.m=*ݹt`)jNn!ETIDǵwLK5ړ%gp}8Gxw=O~踎e+:9˃^$- #qfmUSir&l[2z%tyɜ|.;aR kԐHD$lYq1 +PEgXCԞB+nU6R{ԇœuWAr%pT Г{֏b*yL 4>M _rpgoROA{ÙEqtC>-,.*  GL\~ۓ ;GMr㰰׶TؖΰMA5JVha=wTgPaaSͶي I. _@riR"dض dʴy} pW1K8B,m*w)t(52gGne#wȭ&~ۍ3E|c1h7MI&DSd2*lT0PJ5Lϑ;t偿8cS~@ɋCf#A 荪N8`f4:A@lZteZ:nX&郞l>HcTo:$\I`Y~~U]m͞K 5*w7bO[fe6آ@PnMr=]͚Kr@gt\])6-Z~d2mZ ֪ ZZZ }-mֺZs䪹CJJҸ Q;%0G/:>1.8xW~ۋL^ DU} '`;@"id݂u5.`GS>8h-0U{:>OÍQS?̥9ד uz ePKpYPB=Onx>uxHmQyJU+d@5xϳ'B"hU?l?vŬcqC.̤ZI@7xf=ެv$]T狀t 8˱#b5s [.fWoq+0̐U_R߆NiE@`Aw1}Z>|?‹xDf,t2ۘ 5>ξ^n~70+yM-Qϫ_k;Ln;`vqA:p ^G5iXsm،$z\+c,L 1 L;ͼtl;]2{^xn 7UfIu ^5Bof73-?t-6.3nyrE ("э Nc7 DՄ^ֳkٙʆp/eNXŰ[}P,)\GtʢrntgZSn<&bg2xe/Y~˒*+ 4Y "pO?eQ#ڸyȳ*OWD88E$ʯ%QEs?|;`F حkEokԺD@ F}ujJ8Q!m)!󎪀]7F;KMBe>tRo%zZχk| 4vб\10wiK*hۥ)ɒsd -f9^,HAojj=[| p]rZi} ȳwS+\Cb)$V-LCd| :/iE/=}bg6 !fh=9MpÔͪt)Pz~\ cRkZ1Q̅yd]i _(Yr(~oQYAZT(h+]KcHt 쒝iN(zg6“cq)d i#AxD"tDC[!\zm])KG:!\>#BtGCxχp0Xd5E;KGxuBxH·"p-|ܟy6cqS (: ¿ !E: EOC®tv_̋ޔ$(EH_$4@'I;8pۍJ˘ÓɬijspF,?BD'N-ʸ-wǾ-W9<g_m6z\%gux?q _gbY,c 66xl\&2%BKW*me^圁WsH6JKJ5r~0 H__Ue5]V̓쐡Mrbf endstream endobj 160 0 obj << /Type /FontDescriptor /Ascent 770 /CapHeight 717 /Descent -230 /Flags 32 /FontBBox [-951 -481 1445 1122] /FontName /IAAAAA+Helvetica /ItalicAngle 0 /StemV 0 /AvgWidth -441 /MaxWidth 1500 /XHeight 523 /FontFile2 161 0 R >> endobj 163 0 obj [ 722 ] endobj 159 0 obj << /Type /Font /Subtype /TrueType /BaseFont /IAAAAA+Helvetica /FontDescriptor 160 0 R /Widths 163 0 R /FirstChar 67 /LastChar 67 /Encoding /MacRomanEncoding >> endobj 167 0 obj 6457 endobj 166 0 obj << /Length 167 0 R /Length1 10056 /Filter /FlateDecode >> stream xz |TZ9$ILf&30$I< Bx%hB(h@ "BQ@jO)Wk; ^>JU[Z~EbzQ0g:gb:'kkO֯`+м(?o^^OLx`֚xZxzXT?E(.x<}kOޢsmcrv隮;ƇvڵW.V++I\pQޱJ' Z`a5==%8*ˉ  YtC_V9K _^=ݧݢzj\@m)@Tvx\*,hɋ@LDyêaHTw֏^B= .*۶5Tkϳ)RT=?` Ͽ;}r|)qI;NWSC$+{?8+#>q WSpı*Sq@8ۦ<oxoM,eɲaLa*(l!kk8jp(ю;m/.k~NV̦:p/<O蹄<a|{%%BS;E0H^؇:fyl\@V^BûE\E`<`'B7Mw)B:fl#0 <;~yeZn7R~?__ _8,UTq(a&D/Hc)YxIu N; k%h{ "$P cbaXJ}z zܙ.#ÞfZ&cj!Yj*Q9Aȯuu:Ya.P ]5!3줬넝r.*fjT3zg%T;ke Z)` *&%OE 3p@Pmg i31 h0k3W%ר ܡڰMq*c]=4 ? '5ۑ+?{vESuٮ0)6Ca]Z*V0 ;wrSNu=@ƅNꖹ5s2 Yķ o*gXq $̡uպ;CmahiJ eK@9VP]P-.˖xxOȡe˩?R2 cgag7 BXW4Fѯ i+YaTyօcltƘ[Q[mʾTF;IT_v}$Y7t^g W0v}O/mI}w,EԔv[j'dPZ޷ oumm0-7Sqp+C4%)#E1⠎593sJq^%ޡ"la+Z]`[xm:S(CMPj (U*oYe5.h o 6Dsko[*8޼2s \K^ȭJ] }.lu'҆UO<9#8p6S[ ܮ4rElɘN!JȭM-ˉ2a7𴯃pk!<} Wq39U|AJAB 66A`0L5bm" <|Ѫz݇Ss>O^NK2 D itRt&5jmt3NR34[ʟbg\p]%1Mel S<એÞ셳g=w(stx+$}ҧwy3 >sϽ&}44o [NwRhq!7Uvgf`津z[>ּfcL+dC 9@+JVh ,/e.7! ;e)Be} y;}`zUwXK' :dI sVzK mѺдKWݽ@$cfoDb`_bnjt 3%f^ddlo-'\-'h̹dȾJ-_0i !#ݳs6?y}`Owa\׿nvɔV r=a;vhky7-ghOjiο=˿_Z -/p^YbB!@75ZF AVk-Հ׀ 2Jˁ(НF@wՂ1嵬f1 qXgɳ_4EtzIo9?E4XeVU4Svʢo ~P?^y\ۑjtxNA"&b.HC%c @kSZWwi-`:<_oĝ.{xLUU+gpi4Stj4ASܙYJ[SZZQZIN 1O^6|}WNiʡLyc@"& ,區L".JiC ]@RBQMwfVT);i2_͂g9cYonFUׯŔCv1lzjhj_|CQӛ}-W?&5[PtSLNuM ~_-+1D}7pӮqkq3&f0g[ };5 )UF<6є< }y3vSUn:yVOr zE'FeB eV2H򢒷 yE1ezRʙի\ŽOygݚEۥ/%aON#oҘ3Jj;V/wq%ZqZܯ̭t =n~0i0;gыh-!8Xgs= S^HvL6Lo #`2ˮF l̙KEtm gשSwN@5/y[#_܎' :45R ٶvSy<}`yթu6=D$ޖ&& Lh6iM,ɖ7eft8Ͱ=Ř4I;h߿8Zt|:md]ed=T &nq>e&ba?Ìn!DǻW[6>&4IƐFN$Cz"9b;aZBc"y#D41V(eOLB}j6\#Wk 3{ 0,$6E I.FIqogS#Z_t5Cc੷[Y}KVZȤ7A\KkJryռ&{G򭉽MP aKpZ/dYX5j5!,g:uΔǙl'5N)S4M^[MIДg-(`IsW&CJ 0tTq3v3%Z6\q_\1$w$e-Ζb=:bgZc~nnE\b@ii:6u~>Wb2O^в釧 Kʄ`#]sD' A MpSHN&ruybJ,#\$L>3N1D( 4d g.M':]Ko=1˅^l*YεY8g|':bVa!&h ɫuܺYϵ7WEV'i_|B,y^Ȣۀ"(2^A_[q}OO_[X m^ ߫,_;'4w@]5k}룈?K=B${%NEt 5R> endobj 168 0 obj [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 0 0 611 0 0 0 0 0 611 0 0 778 0 0 722 0 0 722 0 0 667 0 0 0 0 0 0 0 0 556 0 556 611 556 0 0 0 278 0 0 278 0 611 611 0 0 389 556 333 0 556 0 0 556 ] endobj 164 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+Helvetica-Bold /FontDescriptor 165 0 R /Widths 168 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 172 0 obj 8718 endobj 171 0 obj << /Length 172 0 R /Length1 12396 /Filter /FlateDecode >> stream xz |Tsνwd$eL&3 Ą,H$7!bD P""[n&@ZR}ͯź~֭f\9y2],$R^K({n}T:ȸ]Jn R.e\JMDe44/\~yթV-(C:'ڧ?"X}yOJw՚4ڣ+z&YQkſ219%D?n!qrP9- 2ϑ(W- \lԔ-%z/y?/v2 kEp iN<ΑjIC76Z'i # APZg:uwG+Gcғ;*7vbB{Xm⻇xdMb> ~ hȀwAI$QcUAI?R[H/&|?GV,>-OD$]g)UY>Fc^40q4GS6-nlO JO w G x_<ϟ٘f [S&$^+*GPjX-SwJኲR ( vf8oGXK-.j1&1.N.z:(= c=hh#ZCЏ>ւ7^ zuD/@ѫ#D˽@. KGtD]:B .D;@v ځh]GDPPPPu #T T TQD@T *BGTQD"D@G"#@ @8t :bq u8@1#Ɓb_5$i|#9@rD G&.! f 1`ǀӱc;옎c:VBBBЀЀt @ 1#bA1 :b @ 1Āb=5Za^7I:@thH?:m:U9Z}7 Z Z:2È J@gw=q#fv=q4pGZm@1=n5l yq.sOƋ"B Q: 'TK :!m"1@ezEZF>e2SbaoFdPM({xc045 oߏXx^YFLȾ ަ7o jWvԿ?F~&X߽ߎ gb0."]/MMÒ PeR$#,C-10/26Cc14e&bJ3Ll&29GjT`EB.g&N瓖%yMMmKgB#,m"M 51-7iSm#\6ڦ/br5~#,)h3PH[n%Ʋ}e!szF]k]zfWshvWۼ퉼V)"ɼXvέ-ͣ&XcT"_mA.kAB IaRr! riVr4.'3!7Vy(2at5X C XbޱIzE~?D@ἧWgzcZW" /EjTjDjgdŐJo(v-=PKK~rqI 0~(hRkwhkC=Ps`hEP=2cy9>Yn 7w4~m_Q-mՋ:D[ :?j FVhAmjY!쾽cDMWyzl+'kr;z yF&ң1jҬ QTX(D "igخ"3BMtf"H۴9mZpޢa* |ۜ^쥖tN}k(8 }۷v5}Fi%ڴ)sMu5ǐw֙24ɐҍI>6%@-K=/옵t!P}(G}dNh.sS7Oя9a M1lЍ)3CrirNHϣ7Rb(=>E٘|RBl闈I?Nir-ͤ~z~2Yr",*FVЇɖ;tK/W.J4$L>,`*ͧM>+#4,Y7$7y4-XE7y6_KYm'zvFqzA4N1'a%Vna~i@! CG}+t)Un ??MuJ$1w䧸sZGGiowx'}l*[fgǸټ߅O [gIT~E~G^n6&NLܞiWa;6 VQ'?-bE+k S{}Qā>7U i߁,XuY;b66v=~` ܈Gy#ǻy̷𖱗?ăq#4Y)-.Vb }x *=!^ޗ>cb^fXǕ+ esdh{339 #XJG93anߩ{]cA|ԋ5[ ?415eA~ƙ#ZM z^Lkh'f:6e%7ƦyTtG+U ; -Lv6GuoB&V~ \V u_ąɩ|t{LؽrcfSMb.:d^ޓ*]^`NTJc38_m~NTWUN(?4Z2(. _v923vՒf6 ,qF-֮HD:ԍetid~SF \7!BTSꗒ@K( Espnjq=>Kq+ ƺ-Z[JPzڌЌRJKG41bLpOCLV Q[F t/t4RXZ8Fu7fhF n5*qAKeewhR7h2hY;*qNŻ" 9_E [[􍘩6qXƶI\RKd]hPShy05~^|hr|-֐u795j %eCblH*cRL14q-4t0"JKbP2 $s:R-ɉZ%Tk(xKxWW[K3EgwZ1Pܓ*oj&5amJ Bo(iY3:<9^ xї"HtX49i Fg@:/҂%1#F@#`ΎN3km7蝥_j/OFY+|Yk(=ܸ$pGxԄ$ٞPaB9C*Q<1njpkS3/R*L voE^`O3m b2)z_?q>H}sBS0T&*_E.u 7V%Q s::?uphQEsruNP2 x% 2)r7%^9cU3e?ї_ sщ-dwz'KhEMHWrs\{f)),!RG29(4'ѣu坫C><O%F09tN^e3"#N9RS:W)S*nt{H*TOR;Ia{`0\N ԰dFڤptQ:ǝ?>^}U|)v4_RH>;b۞NܸlSkkE7sZ%^ˬO[X-ʷB(e&P'望3-t/r?7jiiY59-r-%4 |M1:\d)4zYc"XT 륍h/;!녎՟o8?X.Ƣѡ_b$%Jg:UpRPNDS*ʲ7şK$N^4fVϼ^y;'8xٽ;v{A\Z\\(90{YrROooLNv?К6;uaŴ,oe՚kuuj˨$V{~mp~j2m]6nf2ΩfU `7WKdP`t{qf&4=,gz Ӎdlߑ/ۃ&j6eMXxxkuzbgWͷ#'c ţ'alb@9wxfT#6lN' #gXz6ZFmy}O+ǂ"gUQBH*I g wm4xI߶`׏LiUݴHz-nċ?~l݆3p2E49d^$r;;3,;9lY i6d:Of`v7K[$f'P!˙fj06$SwɱsfE3e'{o'r䁽3o0saHxO[=]gf+fs,Zy1m1Aw X^1fI78m+E< \ =N˹9<W endstream endobj 170 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 716 /Descent -212 /Flags 32 /FontBBox [-628 -376 2000 1011] /FontName /FAAAAA+Arial-BoldMT /ItalicAngle 0 /StemV 0 /AvgWidth 479 /Leading 33 /MaxWidth 2000 /XHeight 519 /FontFile2 171 0 R >> endobj 173 0 obj [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 556 611 0 0 556 333 0 0 0 0 0 278 0 611 611 0 0 0 556 333 ] endobj 169 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FAAAAA+Arial-BoldMT /FontDescriptor 170 0 R /Widths 173 0 R /FirstChar 32 /LastChar 116 /Encoding /MacRomanEncoding >> endobj 177 0 obj 7769 endobj 176 0 obj << /Length 177 0 R /Length1 11088 /Filter /FlateDecode >> stream xz `TYɼ$I2y!2@XB %/4`XP$@$,0,QY# ZJ]к,PT-|jVFh?Bo&,y9{e˚J$6Ť27"˟|/DϽ=^N]Hdj»o3&r hnj/e#Q/a4߾x9s&f'3PvxWb~ooӇE-KB>rM zVKdeCv"HSd"N t"Y!ʢ<͗%4gEGz}x7{UlE1I gs S=߬P3ޟUK:n;t1ڧE@3^6PR1bHdhUV (Hէ27KtHCZu:Qpp`$Mxd(֞u_Xřuzp<4%O 46͏μV ޙl+gH21K/vTb6GaY2$w[xwgOh@Lk9sgGF~Y<?@) ?v(*.<#K  *w?4*ICI4JyC|QQ2TCe8Vr3!0X 0{ػ eHOK`24Q~#8WoR8~Zoo-^otx}TfA;\A^v+s#iPl1 l;z"=g&mO " 0$Ϩ" >0n&{$p90&z`" VUCOWTev~'t't't'NпeƟv mBZìu*k}6լ^ZZZCZUcHi]757k=ZwdykUY :dzY&;7:O8 4qLs;˃F.*Cc1: !cPc#-b#s-zjGZ(rc)!Kܣ/i)J1|P5EQ֬囶jMUBSorL٦4ӬSVsl6e379-;ĩf?# < n)qf}JrXV9:*gKQSk*4;o<膹6]kkl&U$os\7i7sk46<y'$C_.e]yGݫ"ZIP8b B ,M)єj{ɽz? ۙhRPe-]1<ׂ.!Q?TDr[WFLNQn2K'A{+b_i N:\hr&"zM-tVh"Xm#: :v7,d+c=Ag#I{I,|Rbsc`~kidGy7VJ0bqPyi;dMo;I.qF}:h(gVÅ I4߲Rϕ{{J7ԟѲ~Io;,^ VCA34B5XKƳFzCK)Â+eVŦ|Z̘q94~5ǭ3[cNϹX $Sa*kawٟ8^?wɿ75b?AzfN6Ma?`l%fO/|?/5KK_cL[ 9󻞯c4p/V=S 30 K2?aYdϱl,O_q$}qr#F#BI~ ;oR+RaUxJY)9>14bxph5݇3?2G=Գg[OGOWcJ qz V7yo el Գl \˶K`fkć y_`H&"٥titT'5IKmRDz[PD$]e+|\//??74cvzcwD5cLMSLu-}3h1KWtT!P9WBi4CSNb].h>B x_⣥IM|H|@c2uˇb仌V7Z1R1b_Iz_:L2X7I -o';+ӝJOKu:{jIN2Y+H!"7okhkZgT%v_o[\oWhّX34=6Nii3j3>alXMEP}_L1r JYQ7 @|@,5ƈh0%#ږ%Ìo:M:7k˥r*NCL4𠏉;`tY^ -QT\vHibZrW6ymh.D˴ـ9*je":*$T]=dpvt#Hul:is"jHZE*ym.x\Npx 5K6n-oL7Hqթ3gfN^`Z`0}AfCNr m[w-سn%I Nb$>G AԪ89m;\ u#YNl-h1@88G -t 7rS%5kޱc=sv\k߯㧙̾Ξ===v?=pӘռBOBBvɴGS%@^÷'eDF ىd}bOTū.E袱/5.P.]ಖ)+]>YVf3rbqC +aE_jJ&])Ҍb(2Q]p#F v'K{ƬzӉzD}&LRCSS5hbá#_iI̛f ^hzR⅂"C'gdKsp9)ғT-[*Ųf &:\PK;9Yƛ&ZkMӹ] ɴ GLo&X9)++R79; Y#</sb%&(yMVF OVǓedI<ͫDUbθ5%4-tJ Y{Kq]p}r{K{\/BC%Eh{ɕ+u:BH6 R9& ,`$ձ;t1b0w4hd"w>q}OK7s3w>_n['ROڗ?q4ez3M pBpL&!&T5dE$V79#{{ m՝ȩRNťJ m~CyY h 6¶&W8nu,ϖ*渖N[okK۔-٠Jmb&y e?.5]vS&ob,lW\u MV[M-A7 NJ/-Q6#4;FQr[G# u) u1T[W FlN'L. ʖS\g3]E{e(hr!@npzkL5Hb}]7ߺ߮{WW}(3/}⯯Vm*ug̞K{s"jɥVz>;uIJy5p$frid/<,Gp7C~2 䙓ʯz%Y׭ ruZ] 11wQy֙{5q9Lq0t'zI4U_48*'8֙N A%iNڛעTW ElOnˊ5WiF}Ƣ5rRcMKL}:C -N.%<8 @DĄof`_=43T JJ.vo;L/r;k?M_JQCsxY2c솞ֽW]|u/O?g—-Rۘ?n˄LNZ$ TGij斤CU}=J-bk_R:ܟn$h p:{+GH&ݛq|`7WLfB3(mvY);HHaf k4:m$8`_C#78+/ᩎeP_OUY'7~ * $n$ b!7uEi/kPL+KL(Rk5t_~'T4&&?u!i0^b+%;l+26Y^oײֺ`ێ7R%2U-@'9_MV,c vm%ޖ#I,)jJŮ슝ۣ}$wiI t-orJsAubsJX-%0 q]$@IMs Fza//ܾKsY4t܍&lvyIqOx8Gƪ_?{˱I[^l坽wY^xW㷆<KI@.hD]p;C~^{/*EJIIɌaMNՠKxPw":c yJ(~nNm~x:t-z\1f66lTDmBYs+Vy7g=ڕu8Kg%5{]]Ҩs8wP&_5U)ӓ.K,RLxdǍ|᧻v\% ϋ8>* {uTᒬca}ENP&W / .-Z8mlġ]f7t߳}ձkg4eŏ&b{fYls?z>|4?.?.}~TD:jf˅o_j 塲;5.T endstream endobj 175 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 716 /Descent -212 /Flags 32 /FontBBox [-665 -325 2000 1006] /FontName /EAAAAA+ArialMT /ItalicAngle 0 /StemV 0 /AvgWidth 441 /Leading 33 /MaxWidth 2000 /XHeight 519 /FontFile2 176 0 R >> endobj 178 0 obj [ 556 556 556 556 556 556 556 556 556 556 ] endobj 174 0 obj << /Type /Font /Subtype /TrueType /BaseFont /EAAAAA+ArialMT /FontDescriptor 175 0 R /Widths 178 0 R /FirstChar 48 /LastChar 57 /Encoding /MacRomanEncoding >> endobj 182 0 obj 6586 endobj 181 0 obj << /Length 182 0 R /Length1 8992 /Filter /FlateDecode >> stream x: xչ?gfw@vM͚ +4dIOPX~H~Y+5>*jm̕ފ/ـgwg̜s̙JVݰXHl=+yhO7 ,N,Zbٵ0Hxϲkn^Z[R|gIaL}ZN0c]0bx_G[68vmڑ7q^Qv /+q9$ew{ #!#%ds~JI;IԐq W#`> \N4 (kv>/p9Q>zo7v}jxp(ugWd7dYמܺgH#54>r#]H~f7wwힽ{wݪ҇kn|X}Ww1ҝwwJ];Nv0;Hɠ>X;{Abk6llK:]-2l6[#WǷE(QHUUTbQG 'ʬ*R)1FHQ$Qbŭ)bWbv)")BmYu?yM3?֣ Feѝm:{IȠvtg5$m 7/(܋d-[.Wqr}L,՝Y-ܔHcZoɚpJ7F˃Y2/uw֒H-o@w*|v&$G kpi+x%yi31#?;I+ɗN {r%S!g|>T$AL'Z^`", \B~ cZ+{=}b-}.#/rz.'kA "arCBjramrr 6Pb܂䐣?G헶+۪H0'ib[ U=/dpL2e22?-U* nZ3T4A +EO?M \kl4B4*XrZl9 Ԋ-1{)vjfU"![8) FV6WIZ]uU.|Ţn|jRV]Da҇2΢H3u'ơL ЩSer崐Ip :l  տyt׎Y 6޳},y9}Gj٘OD Fۜ !`n;}v1ccH!A#W"2 EQ qYʕrTn;dV,jfH"(L95CՠXwep`JCIO6e`1x6x8eDsx22-E|OuHQ;@Gh xNbp+[ QTUWH0Qɢ(I Um\}ukWkG2ݪZ-(*Cd_EqgDfH;3|<3| @PY,E@щdZiEGbEFM5H1xeŸ,yJKI'$A 17 ZV-*U8C)XD E-Bs_G;TY|%I5hPV p){7#ʕ+U^1 NʟCgh?wg_aSE-b/S,["J(PeIQU ,.nAI ^TZ_8"r'h| P҂(P4@GI8UF_`gĹ#9'ךTAJ@5G + wc`[Kl$*Cn%'8>΂1P $rbC!NRVZUӨ[EttlïtΙiIuýOu4al7N졣Ɨ3hI}qqmf,.QA*f(Lq `᱉N]ҽR`e<56 "l]ɺU[Dhk4fZ. "&9s6>9^Z@DFy|*b x W1I'v9.9KcRT//?D۹C|94*[XX=K#Wi cs*]&A*Q#Fe" Z wA }/b ƽ Z i8I}O|6Jl0S@Kx볣 ` A]DfbsYG$_W)G-V~0pִ(Yp:JjQCCfdsчL%CdB6ۉ!xZɑ6O= nPGprJ횧]M1-Ef6r,1*=ʌ#A/] s+"PLԹǾp}pvp޸vڷBKy >REfDH-QP5("ɘ{^j/E'SJU:eE Ge5 Phz`SlX\ZIBɱ4YYוI&fH (+1F=bKA7x[kե;hyoŗSmK\+&/-{o9[Y ErXT]|.JKsZNպֹI+Qg)WuKv0f&v!h7ww77w4~y<.7wv67  a3; Q~\;3s5u`VAi,/3bE iJhӈe.gdYht9 ]!$2`EEg[΀} 8 W}iƎܓ{!;x-kg-~/[i˧^|ݥ'>7ͺtڢ9[~upJ1 zWo,E1#>^h?֩Wpn;6?mbv%tInn‡!+Cf:7P qky G#rbƟr~޼zxlQ>)-߶xo,jPlV_fVgjSQcwYDB7a'm RJ6jJU갥:N=~̔)IR1+~$#8\]Ø ^ +ۥK㩹n]zq_憎M_uU5c@ endstream endobj 180 0 obj << /Type /FontDescriptor /Ascent 939 /CapHeight 728 /Descent -222 /Flags 96 /FontBBox [-108 -279 1156 965] /FontName /KAAAAA+Trebuchet-BoldItalic /ItalicAngle -5 /StemV 0 /AvgWidth 481 /MaxWidth 1172 /XHeight 533 /FontFile2 181 0 R >> endobj 183 0 obj [ 301 0 0 0 0 0 0 0 0 0 0 0 0 0 367 397 0 586 586 0 0 0 0 0 0 0 0 0 0 586 0 0 0 614 590 0 632 593 585 0 0 278 0 0 0 786 660 0 583 0 624 0 0 0 0 0 657 0 0 0 0 0 0 0 0 593 593 0 593 552 0 0 0 327 0 540 320 830 562 0 0 0 447 459 438 0 0 0 0 564 ] endobj 179 0 obj << /Type /Font /Subtype /TrueType /BaseFont /KAAAAA+Trebuchet-BoldItalic /FontDescriptor 180 0 R /Widths 183 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 187 0 obj 11358 endobj 186 0 obj << /Length 187 0 R /Length1 15748 /Filter /FlateDecode >> stream x{{`T^{׼Lf23a !LI<y$(TD*J6|V϶h률~^[[V(mUPӊ1su3sϙs^{=~k=nnYl;,q冕rwhX 6d팩76~me5+WgY/ё=Iopm[؉믹ttlX|\aMi)lf˵Gt5s^t].c:TƙJbta*c_ 1?ҧe7/}3'N$u~51ܾ} gYJ-{JKk'/[=˰ƶۺ )l .6[yت%vM+@zM-wGh {Y]I.I i*oϲ/:~mY;{mlK?݌4D٢9ήNVUΚ1}Z7N)O.+7vLay\Nk"81XhʈXmXy[u茢tFV׮Lʵte"{e•dF+X1d,U%о*2>ࠠ&#UNZMvV_ܑ\Q5v p9+ckcǰN.:cPt89gG>S&W\pY*Y5c:NݾWt]'hf;c6WP7`{\3SdsNa]*&{\3Uyݧ|ñ}rTC[ڀl$bg c llmQ"ec3g,(lK+ѿ eI4kWckGͣll&(\9S$(WIlSqm'{SSOY\Șit qG0/i@sۻ 2}m^v\f6'!, e|< c16b6b6 l"MfqVΦMc wL6 VDba"Fӥt-9_QqR^mv>JП23]gWYy[c֙7_̹.X6T(I> Z8NWsHtLb]Lp'馒i& lb@Ӥt)nڨ>W&`M$j)EF;h7'ü7&rA.]dOwd4a:NS=;zf;1K kK,A7w{&@^ndah4j})Ń ֠2B:, Rw0%rC\1Oɐ MiA(cYԩ Czu'&G0 >b.y?IǺ] +~߅Q3xk0+\.bfYi sx{^()5oW޾<%oX ?L \hwpp14- {BOu)0S|\uc,]ǻCLS:-X6iD,V& :Ću;o븢ӯ_ov#O[?ڧ^7n^ ߡl;eqw"7qZ\rw89}PtYb,)'.wwWHK?+v,?/(Ri@ɬX7Yߦ?] K%Mjîб kqei, wG, {<>)t(p>jh6 _*ۂa ߽~Ke>GO^s|m)璞2gu/Lhm(rC!CK7-ƽ vbAK5-XRGRnS? BaMAJ  C 3=qs"mNs[7X}o>7[ں.hJe%leL nsp 8nUQE u-k`r n ^H,Uk4Gik֡ݯ=9 25.Vר-^!)77w1UChTY.dĔ~էMS٧n.WpQ&Q˹ȥҘϐ:鐘TL\݁)J"]L)MP !8o*%¾j˹zn2[HSx2zE= -*Q%<.vTĈ IzJow>4VQHՀ8d0X pS3QW"g74>J2'/X1vO HŴ4#R/娤U,(/Bjm&d_.T>![[+fYg&<}z/_:'Y'ʯμfݶm34rAau"wU 8W%aC$hSw`P(h QDŋLwEF6a-Yݔr5\;\]@M LFU3$]jpy?Ǡ+fȚKZtzb_j;4L]hl,Ͼ!J,MP9 @``r >~~'O>t!7?d_R:םU &I,|]K᯽HhJ!56\HlamY/1{֜Q!uޏ7{#]B@.)| 6qTr)+҅aUjnʹVQTVPk ^q`gMt }H+Y@VݻZS^>e>FJ7ܥxb2a<*n4F8f0.CЊ44BcfH%fHx# ؏"zUφ>v{b\Mʷ(%}PxP|P EF*Ⱦ^OU,2fg4'3ԓ5pS=fJ/B^'Tf:K -o"ؔpo.Df}W揕50+qn|dg߹?wi[GnZ7uk#/ٹ}7qb1-{dDUE\.p E"%(ǔn_@<MLŧtN{-9lk`)ɬWg~çt<͆q;h`pdIQۿ\+I\$`.QZŴ 4}T: x OM<`ߴߩ*1= ?{lA%.vE(_F:QM(+.̫TA>>$F S^n+UPBjsQfX@c(:8HtVE I{k'Ff*". 5V]Gb=/':yyh'<&wNpvp WU#(rV2mQ\[.v8!Md9hRjU'Jit8$硾68h7Tn6AHI(0ERg36i*IoNË@:&3ӛpٍӛ6mmajLPER\ni{Fo#{BX}P-01c(y!#֢WJaQ$F©E%$ mI.:d "iԪ#Es8 f̰tZB!2MS&_woMJ^JJCfJ6tOP<{-Ⱦ]\S*= )|V&fݪ͡Zs 2"H5wRJNg{Ό} XxHĹ3 tm?SGD+>< ڃ )H:G>u| QDU@Ɣ!|A<,HTCU,q 2]+Twv:<8[Yi[RJ-FKJ~v{/ ZJ33tֈ'|H7dk%筗4K971^̚ɰIf8)#Vgss|X@g%mjaË~! l' ^Ĭgc {/C2/G>iصCNZD1k'_mAQ[# ,~LӋTSb(rA^H—uQ\YTjΛԨ*S4/rff;f J'}z=V h?D̀?dc,Z*4b w _;]?}|Ozg-z儵N[vˡq X ~Om&P62?CeREƿ̯jR D^.M]'\ƕ]}r pSn sʱlp!!E)ˮo,L !r^ϙ ^\\AZaaȎthw4p>" K%7,Xqh Vkm\I\e9uG -}ӫϽqG?Ċ5;' *q$nۑ;lwKsZ+B6>CC!P[89/)> qw?K%MjЉ]꣤QXUYls s;k`BT}SI{aJ) R}2xǏI^Y{7wz?@ +) O $WT37W#51V.e$"FQn%CS5Q͵Pi8"Ev6 U!I `ϥ/Az?ڕv^ZѣWCwe_Hk)TzwTPfkY@p^H"bK^É=.ZuUUdې3- ١܌̪p?'Jd'wC%g\&d.CSaŁ40"bvcm&$-JPT^Npm-RH[0MT*VʕZEPD\.*ևa5ҊSJEa#C.w9|1rLfv̗̓Y@ p! aCaNA7͘]]e7\t˩'cTcHg>TT`1([d lr&҉a,ԝݭ{z4S5|9sX)Y͘HUh$q֓s89́$~8Ԯlvj#X$auFlYKl8kېrܭ]٘Nzh~<@@i94Has(ʄ=pi( Y w\IxqJC6z<> VrEډ2mV`eEFYѐmQ hǔ6F3(>((o:+0-@iż8d&GBkSj~(h("V:\_2>Tu9CZؖȤaͣyȼG~Q:Y%4Yo#PxXذ"#q@9Y4%+Z|-?YGle]>`\X2vN=6Xu+/_ouЖ(_<\6֣ Wl?_b[6lzHA;xv! Fؼg&'X 8܁5*9NR 8NPb i rcmCVOqe|w=WUSY[W313aQ_=, [u;Cݠn,o¬!Mv9W`KFU_8(Vu}ZKƺ#Be9\B'}͓]qqdJUM!BqhLq2'v$ʠ8+2ܒ `L;8I֑ZM`MCL(| vU<)H~PYou@:+kȢneC ِs ,k.Ӈ⛌CQ*۔k@^|1!oa&HW$CNws@sYwb]SM e Br ( KShϕ7zV5\3o/ٿc%?Zk)%WllFSi)H fy'_׶ RRk/&|]k|[qkQJV}ЕF?|s5(9m%0P!0F-D_ SX1F8e pvi5MsϏc orB"z9B,-d^e#=̍dUWIC~J^/q+}-Y-|g4:i1uz҇lh-Sa<,b\c07;|̣ykw1Whn`F[[Ȋ,^2v"(6\qN}u+>ǖ f]O }1-/J:S@ĸe[shBIcݬF#ylOp~+5A_zˣ9O+ς!$NV,bƒ=[Gr{Zkf" E\PDX~ljW'.Qd"{m~{jyڼCXbsgu]n!Lwt0Yi]g4+4{|{gsfR꺢=]'a2 g[ðXՄעSMDI ,)FuooOe2R IMZ5hߠ,81 2Ǘ̽*wknGhxEKrJ@f쒓(G)ByT\59yc}4ScmMuYx҈MaEbYj^ yP;hv3GNB%8<3blDՋmAG1Xa#;TP-,n% #aUd]ceupL+2.kr݅alG"Ie;Tju\ mvfIޠ.$,:DHܐiM4e wqV)!EC?TCRhr7;<}rI,ա&xX故C6dr'k4ބ:USd/PnKa9*LX%M3/[|| o7'^ pn"}3.DMKklNVK7}-rN44\rJZoYo/CG?AGߝ&m~SfE-7g4[ÑٻrXom|}_"ZN.Mirvhy}_ܨ+w:fS:71`d?HK}b +ܲ&BXHX?ND~KC5kJ[e_$Yଇ=\ubQLztmPu樫8vܬ 0]WuE(Mrd.S DSͬKY^άadeޒ`ڋH/,<^J"~b" b'`ur\wbF&"_`0r4n:d6*{P=&gu3} jk*A4v["wgcC,PN臵6Ŝo"$GCMǪ̙<9"g^ V*#FyER=Xa21s3x5p:,`_薒4x]yU9( 7*G^0/F7$ P;ѿ0~&n+,}0=jՃ5 kjF*is>%VG(Wbd)QۤD 4+m嬢ԻW`C"Wɼu6ՐM5XX6I.6IJ %ի H'3?C/SdMKQŒ6f_s|V?l![_{bl [ʖ4{ t/ -Y9z5Zl^scg]~5N7} endstream endobj 185 0 obj << /Type /FontDescriptor /Ascent 939 /CapHeight 728 /Descent -222 /Flags 32 /FontBBox [-101 -270 1129 980] /FontName /GAAAAA+TrebuchetMS-Bold /ItalicAngle 0 /StemV 0 /AvgWidth 474 /MaxWidth 1162 /XHeight 533 /FontFile2 186 0 R >> endobj 188 0 obj [ 301 0 0 0 0 0 0 229 367 367 0 0 367 367 367 390 586 586 586 586 586 586 586 0 0 0 367 0 0 0 0 0 0 633 595 612 643 569 583 671 684 278 0 617 553 745 667 703 587 709 611 511 612 678 622 884 601 0 0 0 0 0 0 0 0 533 582 512 581 575 370 502 593 298 0 548 295 859 590 566 583 584 427 431 396 591 527 784 552 534 528 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 586 586 ] endobj 184 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GAAAAA+TrebuchetMS-Bold /FontDescriptor 185 0 R /Widths 188 0 R /FirstChar 32 /LastChar 211 /Encoding /MacRomanEncoding >> endobj 192 0 obj 16327 endobj 191 0 obj << /Length 192 0 R /Length1 22532 /Filter /FlateDecode >> stream xռy|T7~/g}_Id aD!!tNXR@ %@L(`qۺVE ƺ +s~3 b̜sfk^=++YK8-zQ1е[Jpo_#,rYCRr;C$ADr5dw`|asdf =N\0ON4Bv_{bMR]5bċb_X>n옲ҢÇ f.f14U%(V0ԕKWWE8 B85ǟ -[?d \o>;I BPWOE8MΨƊPW/6`cE. UvMraat<)<<|n`ׂpvZ0;rvF4mϫ\tE99ssdq.eRj\+ c&q{\zEEk"|Wvtw +<w WTv1i5n@*2O¤Wv^+{a%ڌoN~kQL-o0RP-slDh2KIXdcK'ޏ7_+::#mmZGS%^ {ᶌɷr.lc!)Wtg֖cy6iVm(b7`6&n 3膙skwE6̪}Q6i9s"-B^8fߐa{ k;_¹ &:[4lӱ-vYغ?b>l8[Nd4(!Qy)i$6Lld AWshi{_#Ϥߑgw ʾ;R]`4ZH>HF>$ qtW_d"؝nQ4LZ\gZ~!1[ZIdIfU})G!xd`LEX)pG$@$ I |/!$LXh>pAB-ÿsvu<.Ӱl%'? ?A?tͫzkC~Ltb;u>,ֵb[[^g قhö`5 Is:UiVmce99,YɴeYN<˾\,7.FkYeYd "csշB%6.llę<+6x;z?d:]Rp[R+/Sd7L* +<3@@yϑ:4a6hegqJ&džZl^mQ9rf4*v(+T7 NuBp+\ހ/: ϸ!P~}{#Kћ?Y&b2%q?UNEFl[*4nz=wSOh)}Nosn}@T6AgRog/gpl_~?;JA%qCNzG:}I);bڪl XǶC=wZ-VQt8˜6gsS|A_'}}}}|* IҮ%U h͍I}{a˜{R\mk;HSǹ="ac 'j$D@4So(Z5f^V/\3ct|/oAϥt{Wf< n"RPӘX]M]Tv*(Lu\!e%,wŮ+(Ǘ rJs\%l1٨?JodmԷ9iBHBq \64GrƦeTm 379sp[OaD`"%~Wy~ث/7~o2\0t ?wfs1 NC(Iql'9>5~|걾*i7I "0Fqkkcix3KkW0XV.1y)e|îD4h GzS~9ay l]X᭵ÓK)"*O4d,Siy\A`+1,!$y$'Sn~YR eIV߻^>F}N/~/fk-yyEL9oUrylg8szUVe*,D*%jWTapjK2[E`z N9{ڵ&=#GGK(}up&C.a6&`,_{~ml+ ]_am&Jein~;gϳ*{󰩐?ͨ1ʏy)e1[Ic7cG|4kj9787Lwʪ38*'DgɳZ*--2o4)ŷKy6b LPL dhN+i(UF(#gX:!Lb*WJJhhcȮJs M]1tk}PBsٲgg]X?3-G)"`FMu\Lutc,-Ey^_ߛqLgQIo.ݯ#Vd:lU>N#]U66?x^ك{^koٵ fyX APMq:tL9I %,Hc+H4MrϳIs  ɽB58@Wl 0 pñ8sr#є @Mha `P 3Vnٓܶ'wݼdɅۯ}[1>h -ƈ}mws2s#ь NX)d^6~ιNt `N5=`أvس yB6$gB]%Paz{ 1Hr$)7Jv7B _~ͥK+럠?}GޕCkNᱯG3-|v(݇XE/ռ76sʛT%%Uj:IA4W&z7J+WDs|^ϝlnrR)y^7OFigAFa猠RwBBl.` U7!f .T!z<*[dXNGQ_/a%TIsd$GMUk212]5 4ATUm %ࠡ܃)n2`1" OF|inND }t͘nqH@N_'t~ ⚀t%ѧ'v_{IOOٵS5/u\ZZ y|o{+/̊ykOuA+<{]}Ǥ "ݱeHV4*eU^VޒΆ]V1%_s,FDFMT l4=Ӌ|z`bi;qDU!#!1hw 1\Ɣ ʺT(GF(@ĊDx'*Bcp4ŗҎ 졁z4~ӮB\zC~&yTS 6M $ljl!}F_O5#STkj4SLSjmr TjR>4)8 @5U*g&pzj\:6E@lyRXMW7ol9pNcOQa_/e!z tcT^HEƙrKZDG|DX#u"z :clbh)ɔ_b%`>KVYEoU/*)DKXU-%?N%nʏc|9hN)}>U7Omkc+1WIBA\+3YvV KPo+G5k츙3o[V~T븎g޷~mo];kؙ3ǎERǻSDXi˫L[f FAkIAK7%ЋD߷rd"/J#n_Yip 7,sU&[EWemFV@v,ԑU B:MTMTiVQSm*˝Vy'RۇcI!4GM0wi ;>`#'#Ҭ,;!MsOC!haȑ3@ႉ76WV]̉pG! V H@H*_  UTˋ0 ˱S<4Aod#~?_vjbb4T?{NGXy_ߺUpȩ<}JcoC~Yb+fJRf&] +e6cd*";nus DWT\ 13BTJ),OU Q,S<40k T<X?'XrGU쑜biGt֖K4}sѹOˏӇ/@3- -6^.b;,Xm6W|kk>)lVfˈ yXRĨxf~wiBiFLa*ߑsvSݪT-\,n;ᡨbB=S$ yD#|A;v@%z uE8œ!55T 1"VNMzԿ{allɻA#2@tF|*A]D;ÀU}; 5C/ޣL2Va"1M6M5Z5Xa8%bn53b ,X+4+HILN )Bk{g P+9."6lH_ϫ:9t>yK,KL~C%rQ'h" o4N9FE-)*hTR4*VM`!\U2VeMM4@9zj‚ՌJ&׼ 4);EG t4C](]^ZH>3bpX*.֓ Wj$,@4Vdw_S._(FU(,UP'!=%F! yzҷMA?뻓_Џ͇_Y/sēɛ;(CJ r.vqL&ʫP8E.)\[&75e/Xo0MyNQj5c`,'/((\Ju9 ߵ&v[6IO=IP96tF> #X8\a5SWXLЪN9/+B F9n …qe@~WXWU#;Q#VQxuRT,bFUd 4  ' w5#Zi*gNN(#{LMMie|gb0 55O55/32+Pu:U.SW>Jf=SiuhA* FST hIR*32] ͖mn~a#rkr]B%b[ЄL#X0toǦմt$U!j9hILKI$N `M%B(eQKO|4#8}FnxA|-u .0i_zZ/3sLZ:w?~yיdH8p̜|[ *Vbې)د6Y,wq8l#hd=L#B&BV2EP\Vh&/L8 .y9 N[h3fbBGDwQS\@fBDK2*Ǝdam^np -$Eߓ{Ot6i<+ɻΦ/O!3'! 861?@Ss iwV LE~O )&n2!;yзxz'zM4,`z.&9jFO`/)6q/OrQX9 RNcIլlZ+8C;qM!)f3N)2# f[%wП".M]ð1SE5I\슷八X~rihAg??ap^ߒel0=~Ԥ3ȝ9A@U8k vf6sfY*D҄9sZ]Fi!f*--(C5EVMȚ+y o$:*D܈2[e):EO5Kِ\rRW=gY9y N7/?|MW@)cig~PX2* ̍(7KGB|,gK3Z[1" `4U٪HjZ6*Igx sRZ#Vf HUAzdePh-35"Ak0CaRLxQtP)b SPn{kGDcv ф Y :)(qF}, ?r"ؼ\NyGVR ,W94xڌQX?c} |'UYIª<-jn@8׼&N4P=66v XFL)f&eVD%kTfKYR&FYojV5 @KҵKi4x)DJ=o*8EZ|.,x3Fc {+F6'WG넍? <5V.TzU ^\76LTY7Xj ;22 Bu-cG%vb=,&C)܂>~PޏxW<s.)=SD"Gz@S1)ǂ~sދg68q8 OʄoLC/?r6,оa/^SXl4Hь%("!*,ZIBCyy LQ=|{x,hޢ[}qV鯏%8+M, \yoclV) N0ďYM~A*~F0x$! ̽\!!+UaU,:Vћ> ClʍYV}@)'BK  f HXB²?ܿRSvgɇ$7fj:h3atpeBjԐ q}&1?eJL<`cJݶv#Zɖncl?83hAT R2f֨ې7݇w,R+oMUF4jT#:cD vJcQ5h2߉&{ƕ^cf o.0e'($-]), G%U $=R:לNQego^^t.?+/ׇ.Sgh>ݷP:~Cg?1KLUQܑN;,[O l7@"cT>t\lLZ%q~-q.7vр&$$ij5[m`p\ >vW@02T61`Z 붤8h6q[7'+x,ڏ% Eh%Rوw@~EwwϙO_#ӯ`#ÞZ?aOIU%IKH: %E]!H}}%;9CV]Pn@P4X)B;U%bAqbQWՉx_@~6 WY0b༌BqfK;(YYOZUKJ;-^!}F88߇!\xpLj 1 ~IF /}pݟr:JKGG9EZL&dW d̎X=O P ^}Hd dPږFm <`4$!W4Y~#aᨒ6në5n"6&d[?ަlPXEC #JP ٓS[D*-tEPRشYdsIOj/O蹐AD`튣?<A@sb Vv/#=l2UE@4nF"K,tPbHmζ[Uu]ܖngbYO{vZハ+~XS Ͽv렌3ߥ%W5 }Mn? wY=cl.'c".ad.vE&؎,p [L 4d-XdSy^n173'q?=4l(bfk~T->$Uhk3 #omD$DlM͈1R9;ڪR5*T{ιw.5c/M.EN4.䭖luG6P, f;]^8)̳Ӿ66М!Y.pz mev* ==('D''~^K77h<vwiK{E/$Zv|ӯբ/bϩnYD Q.F# p:xncc^ "O8{vϏSb@ |V1gD*J6htȧ6)ՏZcYЙO>S e| bEޡJK @(0f!H]x*l)^!%X|1N4rf\1iQV1c8Bg`VjᒐJ%h@Q>6[i[bçGg WߓX9@E J,X3}W8.\wcɏ9ވNMbBh1T\3")^^<5ӂaпWw9om?^%C'Cȟck"yѼD^C^k 7!nr& I gqO qk8kI|ȡ!LJ1'ZNv,̴lf&@=j=Ţ]T={MG`ù9 ۅ,Cq@ ˞6uEso4֡xwy+44l){ kس.mgk+×LMg_(I4MCߤ/Ev-i^?MpmoM`6ovOZ, ;Ҏ?'~347V F8^ {u$ v98pЅlnrlňv)3/imvfѳaK ~xܔR)@h+ɖ)2N`N*\655Je+7|ڂ2,qW!y j %*XʞTDIsԘ5l$J!Sx86@p n6+h6joϞيgⴃf{~}GV>ai'Kor%YDЍf2"B#66_B-~f[&;?eϥ\̲K rskssr7nHnf9X4[Z'FPԜ5=o]c@*Y )aS&+V<_Ǭߵ;^mE]ߧ?=n}w>[~h=G|ԋn{}/ьnY7cfR`}Q0s[\?#eVU2; qVR24'4,CژGOydjW;\q$4%ER\pvOuGV(YL4FD7-VŔ6* Ä9 @VD3D;z΅}h m=8{ў?%\{'w jӺ s_?B_zJwnψkѮH:3ID֫Tgr r&EWU5Ҝ&p&y;$:jDF@X*t K)@T!'O\K/ O+FRo^1~̄,F=k4x[B$Ŕ57cH`x-?__/Vj -}СX Y\5+%Z%i1gIXAqSy##k$אBn&Vm-6N럼s+UR⁀|5-=j mO<6iWb~"#rš yͱ?7k%FLrq/<W-V{k6.63Ay-XNb"`iBJ\T ^+rxoKğ&ɦ p{"2fX*$Р~g3vas"hTfٹFaU4?d#hkmm ,TNt~loCߌF"|Ae>fNVL~rb5B?D9B*4@RC@ GS-+ڿgf~bay[{ܻad3bp`~D!A#FaDQG-?UBp9n JG*!H`m\,F >]RdRZ% D0v4!aMcsAI}Xݴ/^ir2}"pE E~;YeC %D@5NRZmWQFv*DQQ&d(M(Mz6z<Lj,WSVNJS 3S~Q637QQB~%\uX]")nUw ``m:ZD)EfD$$ۨiO:$Ò& 7u6Q)Ցb_(2`xىޅ UҡuRHQhjƤ7L) зJf%)X`0b JDjjA/x)JNevΒWڈ.ާ*j TNCeU{"YÞN6!O2cژb‰;o&S xKpqjnqT❲QZ=AT!,ꍩJbYK/NP6}Θ~;]:l*I6J&eDϿ0⠕tP{]2[ұ"Y~'.~yiln-~wuYL6S) klP܃15bZy/A/s7ٟs]䱊O45Q?t ~ÙoEM~ȵ1 eeWDw4!Nl8Չ_a;ndMAвSLOG7ZɬPQ2O A٨܇σ诉MgAg_ew%2Wrs4*7ck%]ʥs<=3<;(`w6` ï{`)_w&Do6wX?}|Io="M<dKg]RQ8ky-W^2sZg5J endstream endobj 190 0 obj << /Type /FontDescriptor /Ascent 939 /CapHeight 728 /Descent -222 /Flags 96 /FontBBox [-110 -258 1108 946] /FontName /DAAAAA+TrebuchetMS-Italic /ItalicAngle -5 /StemV 0 /AvgWidth 458 /MaxWidth 1110 /XHeight 533 /FontFile2 191 0 R >> endobj 193 0 obj [ 301 0 325 524 0 600 706 160 367 367 367 524 367 367 367 524 524 524 524 524 524 524 524 524 524 524 367 367 524 524 524 367 0 611 566 598 613 536 525 676 654 278 0 0 506 761 638 674 543 0 582 481 581 648 587 852 557 570 550 0 355 0 524 524 0 525 557 460 557 537 401 502 557 307 367 504 320 830 546 537 557 557 417 405 420 557 490 744 501 493 475 0 524 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 367 0 524 524 ] endobj 189 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DAAAAA+TrebuchetMS-Italic /FontDescriptor 190 0 R /Widths 193 0 R /FirstChar 32 /LastChar 211 /Encoding /MacRomanEncoding >> endobj 197 0 obj 19252 endobj 196 0 obj << /Length 197 0 R /Length1 29588 /Filter /FlateDecode >> stream xս{`UŽ/>3d$!A#,!!ALDT* JUQVo UClKѢP5VDkXjz|P$+sw'wg}wfX¼l SpɂL~^"&cbK[8*ƴpd㶖O~N{l8|l-YWk]<뻖,X|?Zf::>d׭l#X%y=o`L}mg/8ۏW`jj "6-9^.kxp/X:ϳ v_}-w 5ٿuo7M37k7T3u~Mٿf~ff+sʄYWV+3EedT3j͠74MTMa2诫4gmVs];)~3k:g5tnlenKek8sNCB^xD^3a9JK+':٥ VscŶQlOưQ,mi|ub=XV(XJT-bQ|BŞsd̾1 ېg?FGfw7{=q0Ynf㊍f~ bi~Mq> 1~om|GFeξ.o7طwO?ǹUM~r+[# I6B=??^AA+Ka&{ɕ&^lMQ++[RtCdţ`qLCTEp62wrsshs:4z$.hLo^ә7pw\i|Den"7l|OEncWµVvqG2V͉׷l9o'Njq==: rnDA3}N%r3*+ҳ16I>Sig%w;m#;Ȯh..]`^C7W*ׯ v˭Hl[QYԝy򂹉_0T># GNRϠ/}Tt[ t']**ltftf37kHyj':W,l킖h!p)%pkAFhbB̆΢ܥ܉qɃlo8G+;:Y]E$R:*Hʝٰv~"'|HLNZaѕY@W&ҳ;F1z)790^:PޅٝFhJ#$&+wb9N;ugztby}9Q&UflqlUJwjtgꤢ:9O\Ml8x(vdO$2P0riSbzF!%14dh!\[/{;ɓܚYhns%Od ' T>9:Blɹ/_sEn"~[M>lFhwN3/ϝh}rt(kf.mHVHYR -fid,҆.Ť才#91hlb{)YFcjϢ<bGe J(&K#SzF* nv J1ۨ-f3r\sۥFǟeQ-Ezl۰W~3,u?a>-SW|xk(xu(_Q *gª !fXd),Xo:;e, Of9, ayl(gl 6w ˄DJ BV.bfD6UJ66%𠧱lp+.%]UO)|5O a+de@}^;OF9\zĽSOg<upTthc|;DʆOcOg]꠫gLQhK_5"Ŀf3%wzWC =TwV;0p缜uoQk˕5 RGU1@8ČG8v+E=*e(o`6#XF<. -*.)YC [Uq5X;¢pؙ/_}>3 ) ! UeE9E>| P|}7⻩w~SÃ6cRSzn"M-Sr~nOr-_ɛoon=yѿ;Վ;߱}#;۾toU/Gh*SMw` 46sDt{4mV5Xnݐc4c`˦gff>/nyu"\#{/W[ Vj4 ((* zzQyznВǖW147eSrCQBzJ0{LPur=^Y_+voS玝^2^W)[޽{'nscm4#9WL)Bd=vĞ•j1Ky|%% hZJeAJGwƻ/ٗzX5õ*j]+U#ƔRJ[uv( O/?V`M R;,zhkeG#| 2k\` +9j|_OWR YZ!ѝZ0Nՠ<[ڛ) *%PP?h_[ޱO/5?vG{8=\y7KÃ)T5pWS eEx$?\,oX{Θ+u`ZzlµcS|GS[&?R9+=1o~K޾: 5 2.).&֐h^gzM^л˥pݡ&,,aM7Si,S7)١PvIvX,MSOy7{8 g @<k}!^d#{A}{@cKwxDn|i,1bXmIeu;)Q#~~ʳbJJ٢!%ʫ!{p8^1?OINJRծH^K=\)Uƣ4l?GDZEV*I U16EsLl:W)8=q^dQ$/BDVV'Y9zCeMb]BA~=Dvly|~@qW:qt{0( |V;_:+DJeLg2/=i,Hb9,f$BdGGR* Bh_R /qqD&d's"D'SPF RݔVGGŕtX'*5{ H:1$=g_)YAVB>̇iqK%E'Śx>}#V![m1w[xU)Ԅ$ѳ=e+߀$]z.2*eUzw{[uLO#NzxYQOg``=" PN#VC 7ǜ;\OsoyzbP9 aV;3K]΋a(s,עD&?`?g{߰\}'FzvKJ5p\ \TI'%rp$\OolceH s04 \O!$WX>/m<;s$?Dv$`vNo+>w픞uAw׋+[GJ?-|-0Nr2&qk$Zh1ۭ״ⰳU:RRz \[\﹔|WK@|,ZcI޸T/w77w5? 8~)t?lB*Y lp4N&eTTRmi\6/OK.9'|7~BJ}+e zAҫI}q$j@ͽAn.,d<#UDn"d 3P4? zo57fko_k/Y2޵O[[<=]6FT7hǪ1jCz42ZmPU7zUcf@3/|/ruPuXM0qG*,"S -?/n_㶋]w_vOo߰؟BFpRfA˗%%[7X 8r] Ek tk>uЪ8o\)D+xJj 5S_HXj$͎? w[Zw.I.I.]RR~?VU!B,$ma}.*z6 Nv:nW0,"kt[DJHp.joImO}0UQ:6eUYO!-Cڇ( Yt šҳ7UM27>W9~k( 'h,qhA2BTAr :=c2:lC)шB ?߼e7?Ǯx[Rw]1]ڽ}E?7~5߮[]+__r}Kgn 3rc5ACxxޅ}RU^ lGp1jqWzr']_Bv7? IXpIpmfZ⌨z%OwIJ I JR&,9|dWA@gB|Xպh{ESS#`|JS@G@$hH6vBLa5A $ޱO=HhwlI:˒4\mm>N x$m V@i*PPkSRKk]&c /iRQ' @˷V/R*sG*4YތdRfo&s)w7m8֟Щo: +7 XlMժCqJׄL-@jtU[uhNmvLJ pMpjA0bk߉!bC( TE=bѯyh\/SqOۈS%mMJ9HV2J [C٤lVv*wcWJ2;^Z&4ptFT*YrY3GJZ]ZIX QOD9 cwZи-q?BuBgfVegߔ9sgw3ezY,@ks}q\LNX~(%VAkHxN(YKbWs%<h9_g }bKߺ#;W^2e}%Ґ1Xyvo--露a{,{䚻R?f1Pnzwv1\iX$NtQv7ܫ/T7*ywťܭɆF&H^<J܀T\AM Jx<^! CǕi.Ax+Mw1ZXdJYW!4USxr`p$Yg"V8*+.XN4[UYLWخz):NQgQ)(whi*,/7 d+rl5ŬQзO'~]9UHrRUDl];"!nA[nmUV﹏O2=Qc &m760`_9׾`Š Uib> 㪾S:'5=?n2G)TCܑJ1gjqON߂a.d%ӆ *&stҌ EݡHuërsZsV樱ҜM9rYp,"sdksrDZ!jnbܒ111^^;FzߐZ૎@*LDZܻWv>oPrCKHҶes>}hs'4 E[K3/i|?}-)_Q-͞{oW[{aY37he)|u,3[%W{x d{ma{`{K*Jw+C"鄫7Ca:!$Átpj);x۪_[\(n1ˏAc^X< uТ ^hߴI^^?O|&@8Dtʣ*S.7l)~WTF%[D ;:ަ<:Mb@ķg,`A=JƀVEr+;`dQ/?z7{ؿkk4S_Yw ~~cI& kD"~ܬY3. m*CP7vF8бDHnc--sCH^v`Ë"Ɍ` "Bܐ5G2ΨV%OJE\BՈKn )F'\%&Wv[("nzW'- {dm~qMz_}y#++1*00dcZ1R2 #$e)eD)O$ ExJ OQ6ժjVm92,B(?Sz~\Z[NlvQh+ msYb8B7aB0@=lTG^J ]ܗ@wS{tVm&Qs`` J_~N#ʝ6D{m/.ȐJUz+n\:UN嚞W&G:0,V`Ƌ RmNh0`c,8ӑV=^O-K,UJT)STLR1UJTp% RLM71 +"7QǕ2 Dyg3c "Fx\RD)iIqA`M=AF1 C'*..="/8I*b41B]Wݣ\aae?oUiYj¶_k[n泑9I[? OLV'P2[X_ jNUvޅۀ34@/SGxNTLZ56. Iv&&+s RY,Cb ,ڌK}kXF϶OBDRMvvYF|~l %"3ȃfeW:U'IUA0*H>Z!j$d&5 GK"%U"{J\В 3e̪%7D(èoBKhqw- ;yޝqSyU $;aIV)c~B~fnXR&PXtu=DyP8|M=J QG:K%Os Q2D=Â#[6FV7G` BJMD)<q@ٿ&p 0 vs`HY}*Yo8r<6d=.b_:'%/'|kPدWO"_R`jDBX$3,HyE7Xc ¢OGT'R@%oQ )`IFj'(~l21iv2b(W[~CO*M^Դ,xpt+d^gK7R7n!*\?^mr+J De*{B_nxFGUvpu¸Ò}ee we tB2mu0ڏ㮓.TP/_\ ~w D&uSݧSR@R5%%MP֫xJ L]f؇ PD yW." nHrss=c[w\'ÔgOOP^:=KHG+lD㝠n'%EE.An5\DU( ),e|&u)9ggą("Ο4eI8|IQj7>F^Js+RWcBV.P&{ E~{N%1A`[AH_(:8(v5&DZqFz>I/ԯu% xX\gs(Jgeuʲ `kNa^TSۮ+ ZAsuJg o1[ <ajQ)sgEB\q-BpUB4n#|)u8qy1KG*v"hks 3i2i2i2`1, X/A`̒ 0OɠIJhVxPtxꨚ *"FHOd:3 .;VhEȋ\+7 v =^|Y?7!םitb'=E #ӓ DT =7ޗH $qsHmQb|a4ci~px@G;<2y qk$^VJ~E*JRfPRop7ŗPEYI׾>E;ycфoS^&׭X_paTZ %V)dLz61 ഔ,+-^y u' 5zFKFW sҮJ[t?DpHޤMqa c r-CVձ/ knHA6+i9uPnT78c/&}wgOTWls`w?w9C+ !u" ol4;Bx_j[49A"G4TR)y.9@$qHThtȻ!v,/QhI'H.R ڐlTF(9ؠ2?s_ ndUfdgnީޫZqrвyцh[tUTJ#T5'U3D<pA V 64Lts,Kxc#rڒ>& A#X2)e';7+1aI.9 CQ` ^?oަiִ /!t,0]p@t&K^ тNI듄iERNd;[ȤT!#%U`8dԊ;XU8O+ٚ! )i >'Hn2Blܿ__\K-)GOk#IlrnؑJC=^$ yXp@Tcj*RB&(@M֕B9\vJTg{N>>(S{T@Chqr<\Ҥˣ3^[ c~eD1p\Mk0ݺ6[Oبb@KF:!OJ .r:xnC\zqxlY?hVp C^_ߏ<R9qҍ#d3Y]!'d`̬rU˴jmxW1m]i6J;R"3ӥގr͔&V{` J8 #;JviS}_`]tT2hpce#>)Ɩ_==~~q=M>O ͨis+ҮU{^rkp7bט2G8.n(l?Q|:v2'``l@ZUO8E*o?`w;^+{@\ҷ]/bx߅}dׂL][ k 5Lb4Y5& z"tDtp8gH nl=vc|3^0d*%Z'r {4T m!o/K~-[*SaB5{vraF!nt|8जTWåTspcdo*?ԋXgr5oܰ5٬Ǜ7MBєR85]I5u&=3-7yn^kg) S} =,%0$-Iw?X?潼ero];7~3N޷18xb OWj h4oor<#gfaieo|ca|]ait}ٷI%ۅnXM:ԬPR/ϼ/>}{C>Y/+ݕy~W>b~d5'k?Kロt4om&'%NXv;FR6KNɡ1(YWREu΄i>A] =]b_DS =}P̒W.M )+mSDj-UfƧ)!B?˅M1h5YȗF^;BAh3?oBwS Jtޑ,4ɡT9ou'ݻoyHd]M_'gO=H}afӐou8y| 1t|}c񾡋zS:!se&哞=m73ZI9KjS9L4 S?YӪ#'m*5+N&?glwI4 MpD08 +_%Q p@B"6%GA fѴ(̀rKc-``<;%+d+1Ymnݷ=Ė#WO?8S^{_3.pLjG_v.֖7ڿƉ'~\rY*o9|?JaYz`TM{7X9˜;|o׌`,֒LAa4Y&>}R\8N"¹FEREOZ"5k LGn p\ҞҞsI{%_$/'bp $.W*u F"n;``ˤv@ędd:47[rW6MƬlpcTVү;ywᜭ/'V9hN?r|E/i{HъAu#Jp\ 7K&+!veJEHʖpx@)H29@1a3AKjILofPCRXtYG QڳЂWbs›8gTѕGUVgj{+GS:_E ÏΓXlXDM2!!_m]NYz@0|w)\V[nR(=tW>B*ڑs9}1IT%[p)Iytu2Jba^cpC>S.…P;p(:H.;"#Sڝ?ؽ)}vt=pXFYr}m:{L5p\R\t-CZJG<(09[BVȃCS3p +bXܵ~sI֕'n pr #ظ{ {/Rw~29g–VYEEd70=n٥ٛek4gt,AE#%,ٽYqa{dQ}ʤfȈO3(1d,1 4C>̀!{݊lKθ4dX(?t,25R/(?,)@bRvɇC8<$IS%4C Z4Cqie^F: %e@e<5MUҽuYnrFء^'BdR} IudЃJHj!F{m+W^yŸw4[xnv{ %?VnoEutԿ.o#ŪcmVO%s@.G:x$2I{C$@CrQ A;>0'C 'R2wםg`?CлnPGo"uD( j{wxGߞ6h}Xszʭ \ fyYRDXiL%>iB5yqp1u8zBF)DDzdiǤf yX2XD2I^pZ:"WFD`"B ℕJ;:%9sG/dtwFgxKM?yPN`,c?n/ّM2sGm~y&A'hi~Ǚ佟{PtKVjc5G|p iu+:B9(? !6do3?$Cb a\{II=<2FS l˜ ܗ+ X{5;b*N (WlUB;[{룔}2T @OQT+JqZ@-ty, ҏ5j9QjK VsRJ\HYZW2ޚnuuE Ȓ,\]@.U zĬb%@+&qX2&GONXRH*P:x'~p87U >aAiad<d/7y]w۷ۗf!E 7|dS#/oK Eyk?~U׶AgҨ5F! iIMKR;.NHFc-s(in?ݢ+)4sDp{W*B'0@13~B˦ݻzU/Z_FDi1 s0Y :w].L6M.9s[s2c,6 Mޝc4 SxstN^eP iRnWpl*ͮD*h aFKDDh8! J N՗N^:N+BZ< 柧Y͓x'stn];wRۻ.[^Ծ|;9Z2~ܿ|뾧Z&Ĥ^1)k-dFQ#7.ӱNLq:c\'iBtcnRzX1 |I00VTO2>EKA= J8W lD<">0BuFc8t:19co!-È);Вoi7j?eʴy{OI̓~q3F=_,Lu#g<nV"v $tTL6ȧ N|!:9=R ț?w?xdXaZ@a>u1K+adR(,]08C&0Mr(u~cJzZ ;<]+yX2Bp7uPВI۽;ҼΟE}O^S%N|*RwJ:MfAk+aLVI7oJ^KR% Oy XXR\r$'׬B73qL)\cYdÏJ!'R{h.eܣd^"ҋJL<Ǽ361vɛx~kȷb}_K(ڀ%cv!0S$N4/y0=>B|+y\VN{Hv>&cQ||z %O  Q+Uѽ0[ ?=NDv >Cfcz_+fkZPkYP2]xC 0xt#BdAQNP"_Vn?eL\OyǕ^;G?ޫ+< }քR7~SHEVA 5JY\z%à"im5B";t-!>Ӏ|Fh(,d,nag&ͪ=^q#ې hJ JubAkn:$Jy<w8cC7 67ú߬ܩ[K5Xf|b<{<'ixt SpJc<党+0wٷ%b5#]ρQQ&k5J_0uuZMN,8y:W:+Q~j5I.4@gqSY+|A z?-H8M"O6 ;Ћgư:V- S}SoL7u>%bpS+lLR(ZB0L B+RЃ<~` i(u:O̭S8ΐA$")Tv* esF gъ!p~]:,#оa`n9[g $u@݀},~1~/c22_(aίd Fx>/N\~o`l&օ{=ێ/>:eO9qK\ѾeE7j endstream endobj 195 0 obj << /Type /FontDescriptor /Ascent 939 /CapHeight 728 /Descent -222 /Flags 32 /FontBBox [-86 -262 1082 943] /FontName /CAAAAA+TrebuchetMS /ItalicAngle 0 /StemV 0 /AvgWidth 454 /MaxWidth 1114 /XHeight 533 /FontFile2 196 0 R >> endobj 198 0 obj [ 301 0 0 0 0 600 706 160 367 367 367 524 367 367 367 524 524 524 524 524 524 524 524 524 524 524 367 367 524 0 524 367 0 590 566 598 613 536 525 676 654 278 477 576 506 709 638 674 558 676 582 481 581 648 587 852 557 570 0 367 0 367 524 524 0 525 557 495 557 545 370 502 546 285 367 504 295 830 546 537 557 557 389 405 396 546 490 744 501 493 475 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 367 0 524 524 0 367 0 0 0 0 0 0 0 0 580 ] endobj 194 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CAAAAA+TrebuchetMS /FontDescriptor 195 0 R /Widths 198 0 R /FirstChar 32 /LastChar 222 /Encoding /MacRomanEncoding >> endobj 202 0 obj 389 endobj 201 0 obj << /Length 202 0 R /Length1 524 /Filter /FlateDecode >> stream x5Q/a~k]!?cd*pC*RNm]d(? a1] xI˟_h Szh0u;:A>ӎ">h*#PV`#=_p>ͥZ2iQW >"0(ֱ6` "=x@ x4H`*&@ٱE[7lhyصvN<+ ?p*Tp-O࠹Q b]KU{j3 +H^L`.SLOx/  blKS_Յ#׻@_GdI#3Yc3ne,kǹ[JZ./ǹ,U endstream endobj 200 0 obj << /Type /FontDescriptor /Ascent 917 /CapHeight 815 /Descent -313 /Flags 4 /FontBBox [-179 -313 1083 917] /FontName /HAAAAA+Neo3Symbol /ItalicAngle 0 /StemV 0 /AvgWidth 735 /MaxWidth 1168 /XHeight 611 /FontFile2 201 0 R >> endobj 203 0 obj [ 356 ] endobj 205 0 obj 222 endobj 204 0 obj << /Length 205 0 R /Filter /FlateDecode >> stream x]n D{b˻!E")N>Bƅ>@b f?;;`ɓc\aٓh;pަT5(d}M4PJw8=0ho=pUpAJᔯ{1,eߧrL?lpFc (ThuiY0NGkt]:-_|TsnSPby7ojp endstream endobj 199 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HAAAAA+Neo3Symbol /FontDescriptor 200 0 R /Widths 203 0 R /FirstChar 33 /LastChar 33 /ToUnicode 204 0 R >> endobj 206 0 obj <> endobj 207 0 obj <> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <>/Contents 5 0 R>> endobj 7 0 obj <>/Contents 8 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 15 0 obj <>/Contents 16 0 R>> endobj 18 0 obj <>/Contents 19 0 R>> endobj 21 0 obj <>/Contents 22 0 R>> endobj 24 0 obj <>/Contents 25 0 R>> endobj 27 0 obj <>/Contents 28 0 R>> endobj 30 0 obj <>/Contents 31 0 R>> endobj 33 0 obj <>/Contents 34 0 R>> endobj 36 0 obj <>/Contents 37 0 R>> endobj 39 0 obj <>/Contents 40 0 R>> endobj 42 0 obj <>/Contents 43 0 R>> endobj 45 0 obj <>/Contents 46 0 R>> endobj 48 0 obj <>/Contents 49 0 R>> endobj 51 0 obj <>/Contents 52 0 R>> endobj 54 0 obj <>/Contents 55 0 R>> endobj 57 0 obj <>/Contents 58 0 R>> endobj 60 0 obj <>/Contents 61 0 R>> endobj 63 0 obj <>/Contents 64 0 R>> endobj 66 0 obj <>/Contents 67 0 R>> endobj 73 0 obj <>/Contents 74 0 R>> endobj 76 0 obj <>/Contents 77 0 R>> endobj 79 0 obj <>/Contents 80 0 R>> endobj 82 0 obj <>/Contents 83 0 R>> endobj 85 0 obj <>/Contents 86 0 R>> endobj 88 0 obj <>/Contents 89 0 R>> endobj 91 0 obj <>/Contents 92 0 R>> endobj 94 0 obj <>/Contents 95 0 R>> endobj 97 0 obj <>/Contents 98 0 R>> endobj 100 0 obj <>/Contents 101 0 R>> endobj 103 0 obj <>/Contents 104 0 R>> endobj 106 0 obj <>/Contents 107 0 R>> endobj 109 0 obj <>/Contents 110 0 R>> endobj 112 0 obj <>/Contents 113 0 R>> endobj 115 0 obj <>/Contents 116 0 R>> endobj 118 0 obj <>/Contents 119 0 R>> endobj 121 0 obj <>/Contents 122 0 R>> endobj 124 0 obj <>/Contents 125 0 R>> endobj 127 0 obj <>/Contents 128 0 R>> endobj 130 0 obj <>/Contents 131 0 R>> endobj 133 0 obj <>/Contents 134 0 R>> endobj 136 0 obj <>/Contents 137 0 R>> endobj 208 0 obj <> endobj 209 0 obj < /Dest[36 0 R/XYZ 56.7 658.5 0]/Parent 208 0 R/Next 210 0 R>> endobj 210 0 obj < /Dest[36 0 R/XYZ 56.7 265.4 0]/Parent 208 0 R/Prev 209 0 R/Next 211 0 R>> endobj 211 0 obj < /Dest[39 0 R/XYZ 56.7 729.1 0]/Parent 208 0 R/Prev 210 0 R/Next 212 0 R>> endobj 212 0 obj < /Dest[42 0 R/XYZ 56.7 525 0]/Parent 208 0 R/Prev 211 0 R/Next 213 0 R>> endobj 213 0 obj < /Dest[42 0 R/XYZ 56.7 234 0]/Parent 208 0 R/Prev 212 0 R/Next 214 0 R>> endobj 214 0 obj < /Dest[45 0 R/XYZ 56.7 590.3 0]/Parent 208 0 R/Prev 213 0 R/Next 215 0 R>> endobj 215 0 obj < /Dest[45 0 R/XYZ 56.7 528.1 0]/Parent 208 0 R/Prev 214 0 R/Next 216 0 R>> endobj 216 0 obj < /Dest[45 0 R/XYZ 56.7 453.1 0]/Parent 208 0 R/Prev 215 0 R/Next 217 0 R>> endobj 217 0 obj < /Dest[45 0 R/XYZ 56.7 378.1 0]/Parent 208 0 R/Prev 216 0 R/Next 218 0 R>> endobj 218 0 obj < /Dest[48 0 R/XYZ 56.7 408 0]/Parent 208 0 R/Prev 217 0 R/Next 219 0 R>> endobj 219 0 obj < /Dest[48 0 R/XYZ 56.7 142.4 0]/Parent 208 0 R/Prev 218 0 R/Next 220 0 R>> endobj 220 0 obj < /Dest[51 0 R/XYZ 56.7 646.5 0]/Parent 208 0 R/Prev 219 0 R/Next 221 0 R>> endobj 221 0 obj < /Dest[51 0 R/XYZ 56.7 417.7 0]/Parent 208 0 R/Prev 220 0 R/Next 222 0 R>> endobj 222 0 obj < /Dest[51 0 R/XYZ 56.7 221.9 0]/Parent 208 0 R/Prev 221 0 R/Next 223 0 R>> endobj 223 0 obj < /Dest[54 0 R/XYZ 56.7 166.3 0]/Parent 208 0 R/Prev 222 0 R/Next 224 0 R>> endobj 224 0 obj < /Dest[60 0 R/XYZ 56.7 696 0]/Parent 208 0 R/Prev 223 0 R/Next 225 0 R>> endobj 225 0 obj < /Dest[60 0 R/XYZ 56.7 576.7 0]/Parent 208 0 R/Prev 224 0 R/Next 226 0 R>> endobj 226 0 obj < /Dest[63 0 R/XYZ 56.7 785.3 0]/Parent 208 0 R/Prev 225 0 R/Next 227 0 R>> endobj 227 0 obj < /Dest[63 0 R/XYZ 56.7 627.8 0]/Parent 208 0 R/Prev 226 0 R/Next 228 0 R>> endobj 228 0 obj < /Dest[63 0 R/XYZ 56.7 171.3 0]/Parent 208 0 R/Prev 227 0 R/Next 229 0 R>> endobj 229 0 obj < /Dest[73 0 R/XYZ 56.7 672.1 0]/Parent 208 0 R/Prev 228 0 R/Next 230 0 R>> endobj 230 0 obj < /Dest[73 0 R/XYZ 56.7 312.7 0]/Parent 208 0 R/Prev 229 0 R/Next 231 0 R>> endobj 231 0 obj < /Dest[76 0 R/XYZ 56.7 754.6 0]/Parent 208 0 R/Prev 230 0 R/Next 232 0 R>> endobj 232 0 obj < /Dest[76 0 R/XYZ 56.7 609.4 0]/Parent 208 0 R/Prev 231 0 R/Next 233 0 R>> endobj 233 0 obj < /Dest[76 0 R/XYZ 56.7 464.2 0]/Parent 208 0 R/Prev 232 0 R/Next 234 0 R>> endobj 234 0 obj < /Dest[79 0 R/XYZ 56.7 493.4 0]/Parent 208 0 R/Prev 233 0 R/Next 235 0 R>> endobj 235 0 obj < /Dest[82 0 R/XYZ 56.7 785.3 0]/Parent 208 0 R/Prev 234 0 R/Next 236 0 R>> endobj 236 0 obj < /Dest[82 0 R/XYZ 56.7 172.4 0]/Parent 208 0 R/Prev 235 0 R/Next 237 0 R>> endobj 237 0 obj < /Dest[97 0 R/XYZ 56.7 333.8 0]/Parent 208 0 R/Prev 236 0 R/Next 238 0 R>> endobj 238 0 obj < /Dest[106 0 R/XYZ 56.7 468.7 0]/Parent 208 0 R/Prev 237 0 R/Next 239 0 R>> endobj 239 0 obj < /Dest[106 0 R/XYZ 56.7 159.5 0]/Parent 208 0 R/Prev 238 0 R/Next 240 0 R>> endobj 240 0 obj < /Dest[109 0 R/XYZ 56.7 785.3 0]/Parent 208 0 R/Prev 239 0 R/Next 241 0 R>> endobj 241 0 obj < /Dest[115 0 R/XYZ 56.7 248.8 0]/Parent 208 0 R/Prev 240 0 R/Next 242 0 R>> endobj 242 0 obj < /Dest[118 0 R/XYZ 56.7 234.8 0]/Parent 208 0 R/Prev 241 0 R>> endobj 143 0 obj <> endobj 139 0 obj <> >> endobj 140 0 obj <> >> endobj 141 0 obj <> >> endobj 142 0 obj <> >> endobj 243 0 obj <> endobj 244 0 obj < /Producer /CreationDate(D:20101126133616+01'00')>> endobj xref 0 245 0000000000 65535 f 0000761412 00000 n 0000000019 00000 n 0000004868 00000 n 0000761558 00000 n 0000004889 00000 n 0000023532 00000 n 0000761704 00000 n 0000023554 00000 n 0000033508 00000 n 0000761850 00000 n 0000033529 00000 n 0000043622 00000 n 0000043645 00000 n 0000062585 00000 n 0000761998 00000 n 0000062608 00000 n 0000078024 00000 n 0000762146 00000 n 0000078047 00000 n 0000093128 00000 n 0000762321 00000 n 0000093151 00000 n 0000099424 00000 n 0000762469 00000 n 0000099446 00000 n 0000109980 00000 n 0000762636 00000 n 0000110003 00000 n 0000119545 00000 n 0000762784 00000 n 0000119567 00000 n 0000131432 00000 n 0000762932 00000 n 0000131455 00000 n 0000146586 00000 n 0000763080 00000 n 0000146609 00000 n 0000165385 00000 n 0000763228 00000 n 0000165408 00000 n 0000179042 00000 n 0000763376 00000 n 0000179065 00000 n 0000196511 00000 n 0000763524 00000 n 0000196534 00000 n 0000209198 00000 n 0000763672 00000 n 0000209221 00000 n 0000224521 00000 n 0000763820 00000 n 0000224544 00000 n 0000240271 00000 n 0000763968 00000 n 0000240294 00000 n 0000254823 00000 n 0000764116 00000 n 0000254846 00000 n 0000269056 00000 n 0000764264 00000 n 0000269079 00000 n 0000284350 00000 n 0000764412 00000 n 0000284373 00000 n 0000301512 00000 n 0000764560 00000 n 0000301535 00000 n 0000309232 00000 n 0000359123 00000 n 0000309254 00000 n 0000359100 00000 n 0000375167 00000 n 0000764708 00000 n 0000375190 00000 n 0000392204 00000 n 0000764875 00000 n 0000392227 00000 n 0000401467 00000 n 0000765023 00000 n 0000401489 00000 n 0000411305 00000 n 0000765171 00000 n 0000411327 00000 n 0000426195 00000 n 0000765319 00000 n 0000426218 00000 n 0000436132 00000 n 0000765467 00000 n 0000436154 00000 n 0000444397 00000 n 0000765615 00000 n 0000444419 00000 n 0000452063 00000 n 0000765763 00000 n 0000452085 00000 n 0000463928 00000 n 0000765911 00000 n 0000463951 00000 n 0000475528 00000 n 0000766059 00000 n 0000475551 00000 n 0000486506 00000 n 0000766209 00000 n 0000486530 00000 n 0000497870 00000 n 0000766359 00000 n 0000497894 00000 n 0000509824 00000 n 0000766509 00000 n 0000509848 00000 n 0000522268 00000 n 0000766659 00000 n 0000522292 00000 n 0000535850 00000 n 0000766809 00000 n 0000535874 00000 n 0000550032 00000 n 0000766959 00000 n 0000550056 00000 n 0000565304 00000 n 0000767109 00000 n 0000565328 00000 n 0000575666 00000 n 0000767259 00000 n 0000575690 00000 n 0000586055 00000 n 0000767409 00000 n 0000586079 00000 n 0000597441 00000 n 0000767559 00000 n 0000597465 00000 n 0000608625 00000 n 0000767709 00000 n 0000608649 00000 n 0000619595 00000 n 0000767859 00000 n 0000619619 00000 n 0000632035 00000 n 0000775897 00000 n 0000776036 00000 n 0000776177 00000 n 0000776330 00000 n 0000775482 00000 n 0000651411 00000 n 0000650643 00000 n 0000632082 00000 n 0000632059 00000 n 0000650866 00000 n 0000665362 00000 n 0000664807 00000 n 0000651610 00000 n 0000651587 00000 n 0000665035 00000 n 0000673402 00000 n 0000672885 00000 n 0000665565 00000 n 0000665543 00000 n 0000673117 00000 n 0000676942 00000 n 0000676675 00000 n 0000673608 00000 n 0000673586 00000 n 0000676917 00000 n 0000684186 00000 n 0000683691 00000 n 0000677141 00000 n 0000677119 00000 n 0000683939 00000 n 0000693673 00000 n 0000693202 00000 n 0000684391 00000 n 0000684369 00000 n 0000693458 00000 n 0000702050 00000 n 0000701738 00000 n 0000693876 00000 n 0000693854 00000 n 0000701989 00000 n 0000709438 00000 n 0000708925 00000 n 0000702247 00000 n 0000702225 00000 n 0000709177 00000 n 0000721861 00000 n 0000721101 00000 n 0000709650 00000 n 0000709627 00000 n 0000721348 00000 n 0000739292 00000 n 0000738489 00000 n 0000722069 00000 n 0000722046 00000 n 0000738739 00000 n 0000759665 00000 n 0000758847 00000 n 0000739502 00000 n 0000739479 00000 n 0000759088 00000 n 0000760932 00000 n 0000760346 00000 n 0000759866 00000 n 0000759845 00000 n 0000760586 00000 n 0000760632 00000 n 0000760611 00000 n 0000761101 00000 n 0000761285 00000 n 0000768009 00000 n 0000768069 00000 n 0000768263 00000 n 0000768530 00000 n 0000768769 00000 n 0000768962 00000 n 0000769195 00000 n 0000769398 00000 n 0000769597 00000 n 0000769876 00000 n 0000770043 00000 n 0000770304 00000 n 0000770547 00000 n 0000770734 00000 n 0000770945 00000 n 0000771228 00000 n 0000771503 00000 n 0000771736 00000 n 0000772003 00000 n 0000772234 00000 n 0000772457 00000 n 0000772640 00000 n 0000772867 00000 n 0000773082 00000 n 0000773261 00000 n 0000773448 00000 n 0000773723 00000 n 0000773894 00000 n 0000774073 00000 n 0000774268 00000 n 0000774463 00000 n 0000774695 00000 n 0000774855 00000 n 0000775011 00000 n 0000775291 00000 n 0000776480 00000 n 0000776595 00000 n trailer < <806BC9A6B74DCF67DC3F0BF71DF998A3> ] /DocChecksum /6E9CC7CDA2EECBECC1903B28187357AB >> startxref 776771 %%EOF crossroads-2.81/test/0000755000175000001440000000000012130034076013477 5ustar httpuserscrossroads-2.81/test/onend0000755000175000001440000000016212130034072014523 0ustar httpusers#!/bin/sh echo Client $1 was handled by $2 and is now stopping, $3 connections remain \ >> /tmp/activity.log crossroads-2.81/test/externalchecker0000755000175000001440000000051612130034072016572 0ustar httpusers#!/usr/bin/env perl # Example of an external checker # Alternate its-alive / its-dead every approx 10 sec my $sec = int((localtime())[0] / 10); my $out = $sec & 1 ? "1" : "0"; print STDERR (">>>> External checker: ", scalar(localtime()), " @ARGV\n"); if ($ARGV[0] =~'localhost') { print("$out\n"); } else { print("0\n"); } crossroads-2.81/test/urlmatch.xml0000644000175000001440000000146612130034072016043 0ustar httpusers false /tmp /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin urlmatch http

0:20000
0:20001 yes yes
server1:10000
/$
server2:10000
/pages/fch
server3:10000
/pages/[^f][^c][^h]
crossroads-2.81/test/xr-analyze-test0000755000175000001440000000065412130034072016475 0ustar httpusers#!/usr/bin/perl use strict; my $n = 0; my $tot = 0; my @num; while (my $line = ) { next unless ($line =~ /^\d/); $tot += $line; push(@num, $line); $n++; } exit(1) if ($n < 2); my $avg = $tot / $n; my $sumsq = 0; for my $n (@num) { my $diff = $n - $avg; $sumsq += ($diff * $diff); } print ("Total : $n\n", "Average : ", $avg, "\n", "SD : ", sqrt($sumsq / ($n - 1)), "\n"); crossroads-2.81/test/xr-http-test0000755000175000001440000000130212130034072016000 0ustar httpusers#!/usr/bin/perl use strict; use LWP::UserAgent; use Time::HiRes qw(sleep gettimeofday tv_interval); $|++; die <<"ENDUSAGE" if ($#ARGV != 2); Usage: $0 URL THREADS DURATION Will start THREADS to get URL. The entire test will run for DURATION seconds. ENDUSAGE my ($url, $threads, $duration) = @ARGV; for my $i (1..$threads) { next if (fork()); my $t_start = [gettimeofday()]; my $runs = 0; while (tv_interval($t_start) < $duration) { $runs++; my $t_run = [gettimeofday()]; my $ua = LWP::UserAgent->new(); $ua->timeout(5); my $resp = $ua->get($url); print(tv_interval($t_run), "\n") if ($resp->is_success()); } exit(0); } while(wait() != -1) { } crossroads-2.81/test/backendmon0000755000175000001440000000227012130034072015523 0ustar httpusers#!/usr/bin/env perl use strict; use XML::Simple; use LWP::UserAgent; # Check arguments if ($#ARGV != 1) { die << "ENDUSAGE"; Usage: $0 webinterface-url period Example: $0 http://localhost:20001 5 The XR web interface at the stated URL is checked and the back end states are reported. ENDUSAGE } # Process while (1) { check($ARGV[0]); sleep($ARGV[1]); } # Check the web interface. Take unavailable back ends offline. sub check($) { my $url = shift; # Access web interface my $ua = LWP::UserAgent->new(); my $resp = $ua->get($url); if (! $resp->is_success()) { warn("Failed to access the XR web interface on '$url': ", $resp->status_line(), "\n"); return; } # Parse the XML my $xml; eval { $xml = XMLin($resp->content()); }; if ($@) { warn("Failed to parse web interface response: $@\n"); return; } # print Dumper $xml; my @backends = @{ $xml->{backend} }; print("\n", scalar(localtime()), "\n"); for my $b (@backends) { print(" Back end ", $b->{nr}, " at ", $b->{address}, ": available=", $b->{available}, " up=", $b->{up}); print(" DEAD") if ($b->{live} ne 'alive'); print("\n"); } } crossroads-2.81/test/xr-smtp-test0000755000175000001440000000214012130034072016005 0ustar httpusers#!/usr/bin/perl use strict; use Net::SMTP; use Time::HiRes qw(sleep gettimeofday tv_interval); $|++; die <<"ENDUSAGE" if ($#ARGV != 4); Usage: $0 ENDPOINT FROM-ADDRESS TO-ADDRESS THREADS DURATION Will start THREADS to send dummy e-mails to TO-ADDRESS. The test will run for DURATION seconds. ENDPOINT is the IP address to connect to. ENDUSAGE my ($endpoint, $from, $address, $threads, $duration) = @ARGV; for my $i (1..$threads) { next if (fork()); my $t_start = [gettimeofday()]; my $runs = 0; while (tv_interval($t_start) < $duration) { $runs++; my $t_run = [gettimeofday()]; my $smtp = Net::SMTP->new($endpoint, Timeout => 5) or die ("Cannot start SMTP\n"); $smtp->mail($from); $smtp->to($address); $smtp->data(); $smtp->datasend("To: $address\n"); $smtp->datasend("Subject: Testing mail\n"); $smtp->datasend("\n"); $smtp->datasend("This is just a test message.\n"); $smtp->dataend(); $smtp->quit(); print(tv_interval($t_run), "\n"); } exit(0); } while(wait() != -1) { } crossroads-2.81/test/test.cgi0000644000175000001440000000176612130034072015150 0ustar httpusers#!/usr/bin/perl # Simple script for benchmarking purposes. Invoke as: # http://whereever/test.cgi?bytes=XYZZY&usec=PLUGH # Will spam XYZZY bytes as payload, and delay for PLUGH microsecs. # The payload files are created in $tmpdir if they don't yet exist # so that CPU looping is avoided. use strict; use Time::HiRes qw(usleep); use CGI qw(:standard); my $tmpdir = '/tmp'; # CGI Header print ("Content-Type: text/plain\r\n\r\n"); # Delay for 'usec' microsecs. my $usec = param('usec') or 0; usleep($usec); # Check that we have a file for the payload. If not, create it. my $bytes = param('bytes'); my $file = "$tmpdir/test.cgi.$bytes"; if (! -f $file) { open (my $of, ">$file") or die ("Cannot write $file: $!\n"); for (my $i = 0; $i < $bytes; $i++) { print $of ('X'); } close ($of); } # Send the file to the browser. my $buf; open (my $if, $file) or die ("Cannot read $file: $!\n"); while (sysread($if, $buf, 2048)) { print ($buf); } # All done. Return control to the web server. crossroads-2.81/test/downer0000755000175000001440000000305012130034072014715 0ustar httpusers#!/usr/bin/env perl use strict; use XML::Simple; use LWP::UserAgent; use Data::Dumper; # Check arguments if ($#ARGV != 1) { die << "ENDUSAGE"; Usage: $0 webinterface-url period Example: $0 http://localhost:20001 5 The XR web interface at the stated URL is checked for unavailable back ends. Such back ends are taken offline. This is repeated each 'period' seconds. ENDUSAGE } # Process while (1) { check($ARGV[0]); sleep($ARGV[1]); } # Check the web interface. Take unavailable back ends offline. sub check($) { my $url = shift; # Access web interface my $ua = LWP::UserAgent->new(); my $resp = $ua->get($url); if (! $resp->is_success()) { warn("Failed to access the XR web interface on '$url': ", $resp->status_line(), "\n"); return; } # Parse the XML my $xml; eval { $xml = XMLin($resp->content()); }; if ($@) { warn("Failed to parse web interface response: $@\n"); return; } # print Dumper $xml; my @backends = @{ $xml->{backend} }; for my $b (@backends) { print("Back end ", $b->{nr}, " at ", $b->{address}, ": available=", $b->{available}, " up=", $b->{up}, "\n"); if ($b->{available} ne 'available' and $b->{up} eq 'up') { print(" Marking back end as 'down'.\n"); my $resp = $ua->get($url . '/backend/' . $b->{nr} . '/up/0'); warn("Failed to mark back end down: ", $resp->status_line(), "\n") unless ($resp->is_success()); } } } crossroads-2.81/test/xr-client-ping0000755000175000001440000000651012130034072016263 0ustar httpusers#!/usr/bin/perl use POSIX ':sys_wait_h'; use strict; # Main my $quiet = 0; while($ARGV[0] eq '-q') { $quiet++; shift(@ARGV); } usage() if ($#ARGV != 1); my $sleeptime = sprintf('%d', $ARGV[1]); die("$0: bad interval $ARGV[1]\n") if ($sleeptime < 2); while (1) { # Clean up any zombies while (waitpid(-1, WNOHANG) > 0) { } # Run the test do_test(); # Sleep for the duration of the interval my $slept = 0; while ($slept < $sleeptime) { $slept += sleep($sleeptime - $slept); } } # Show usage and croak sub usage() { die <<"ENDUSAGE"; Usage: xr-client-ping [-q] WEBINTERFACE-URL INTERVAL The web interface is queried for clients. Connections to non-pingable clients are killed. The process is repeated each interval. The arguments: -q: quiet mode, suppresses verbose messaging WEBINTERFACE-URL: the URL of XR's web interface, include http:// INTERVAL: number of seconds ENDUSAGE } # Start a single test my $_tries = 0; sub do_test() { msg ("-----------------------------------------------------------------\n"); msg ("Starting check run\n"); my $xml; eval { $xml = http_get($ARGV[0]); }; if ($@) { msg ("Could not access web interface: $@\n"); die ("Too many tries now, giving up...\n") if ($_tries++ > 5); return; } $_tries = 0; my $active = 0; my ($id, $clientip); for my $line (split(/\n/, $xml)) { $active = 1 if ($line =~ //); $active = 0 if ($line =~ /<\/thread>/); if ($active) { if ($line =~ //) { $id = $line; $id =~ s/\s*//; $id =~ s/<\/id>.*//; } elsif ($line =~ //) { $clientip = $line; $clientip =~ s/\s*//; $clientip =~ s/<\/clientip>//; check_client($id, $clientip) if ($clientip ne '0.0.0.0'); } } } } # Check one thread ID and client IP sub check_client($$) { my ($id, $clientip) = @_; msg ("Checking connection for client $clientip (XR thread $id)\n"); return if (fork()); my $cmd = "ping -c3 -t3 $clientip >/dev/null"; msg ("$clientip: pinging (external '$cmd')\n"); my $status = system($cmd); if ($status != 0) { msg ("$clientip: ping status '$status' $!\n"); msg ("$clientip: not reachable, stopping XR thread $id\n"); eval { http_get("$ARGV[0]/thread/kill/$id"); }; msg ("Failed to stop thread $id\n") if ($@); } else { msg ("$clientip: reachable, connection assumed valid\n"); } exit(0); } # Do a HTTP GET. Try LWP::UserAgent if available, else try wget. sub http_get($) { my $url = shift; my $ua; # Try LWP::UserAgent eval { require LWP::UserAgent; }; if (! $@) { $ua = LWP::UserAgent->new(); $ua->timeout(3); my $res = $ua->get($url); die ("Could not access url '$url'\n") unless ($res->is_success()); return $res->content(); } # Try wget or curl, or any other command (can be put in here) for my $cmd ("wget -q -O- -T3 '$url'", "curl --connect-timeout 3 -s '$url'") { msg ("Running: $cmd\n"); open (my $if, "$cmd |"); if ($if) { my $cont = ''; while (my $line = <$if>) { $cont .= $line; } if (close($if)) { return $cont; } else { msg("$cmd failed: $!\n"); } } } # All failed, now what? die ("No method to access url '$url'\n"); } # Verbose messaging sub msg { print ($$, ' ', scalar(localtime()), ' ', @_) unless ($quiet); } crossroads-2.81/test/ftp.xml0000644000175000001440000000142012130034072015003 0ustar httpusers false /tmp ftp tcp
127.0.0.1:21
first-available true
172.16.238.1:21
true
ftpdata tcp
127.0.0.1:20
first-available true true
172.16.238.1:20
crossroads-2.81/test/status.xslt0000644000175000001440000000375612130034072015745 0ustar httpusers Crossroads Status Overview

XR Status Overview


Back end Weight Max. connections Host match Health state Availability Connections Bytes served Clients served
crossroads-2.81/test/xr-mysql-connect0000755000175000001440000000055712130034072016653 0ustar httpusers#!/bin/sh # Where does your mysql live? mysql=/usr/local/mysql/bin/mysql # Get the host and port from the argument (which is the back end, # as host:port) host=`echo $1 | sed 's/:.*//'` port=`echo $1 | sed 's/.*://'` # Try to connect to the host and port. Print the result on stdout. echo quit | $mysql -h $host -P $port --protocol=tcp --connect-timeout=3 echo $? crossroads-2.81/test/ntimes0000755000175000001440000000073012130034072014720 0ustar httpusers#!/usr/bin/perl # ntimes - fork and run it die ("Usage: ntimes TIMES COMMAND\n", "Forks TIMES and each fork runs the COMMAND.\n") if ($#ARGV != 1); for my $i (1..$ARGV[0]) { my $pid = fork(); die ("$0: cannot fork, $!\n") unless (defined($pid)); if (!$pid) { system($ARGV[1]); exit(); } } while (1) { my $kid = wait(); last if ($kid < 1); print ("$0: Child $kid terminated\n"); } print ("All forks have finished, done.\n"); crossroads-2.81/test/onfail0000755000175000001440000000012112130034072014663 0ustar httpusers#!/bin/sh echo `date` Back end $2 with $3 connections failed for client $1 1>&2 crossroads-2.81/test/restricted-webinterface.xml0000644000175000001440000000262512130034072021026 0ustar httpusers false /tmp web tcp
0:11000
127.0.0.1:11001 yes
server1:8000
webinterface tcp
0:11002
10.50.45.189
localhost:11001
crossroads-2.81/test/multi-ip.xml0000644000175000001440000000223212130034072015754 0ustar httpusers true clpipe /var/log/xr.clog /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin first tcp
192.168.2.5:10000
first-available 192.168.2.5:10001 yes yes
www.google.nl:80
www.thedailywtf.com:80
second tcp
172.16.89.1:10000
first-available 172.16.89.1:10001 yes yes
kubat.nl:80
slashdot.org:80
crossroads-2.81/test/xr-stdby/0000755000175000001440000000000012130034076015253 5ustar httpuserscrossroads-2.81/test/xr-stdby/xr-is-live0000755000175000001440000000145512130034072017201 0ustar httpusers#!/usr/bin/perl use strict; die <<"ENDUSAGE" if ($#ARGV < 0); Usage: xr-is-live HOST [HOST...] Polls stated host(s) for live status. Exits with the number of unreachable hosts. Sample usage: xr-is-live onehost - checks if the one host is down xr-is-live h1 h2 h3 h3 h5 - checks if this network is down (this can be assumed when exit status is larger than 3) ENDUSAGE for my $h (@ARGV) { next if fork(); if (!testlive($h)) { print ("$h is not reachable\n"); exit (1); } exit (0); } my $ret = 0; while (1) { last if (wait() == -1); $ret++ if ($?); } print ("total $ret not reachable host(s)\n") if ($ret); exit ($ret); sub testlive($) { my $h = shift; system("ping -c3 -t1 '$h' >/dev/null") and return undef; return 1; } crossroads-2.81/test/onstart0000755000175000001440000000012512130034072015111 0ustar httpusers#!/bin/sh echo `date` Client $1 will be handled by $2, $3 connections so far 1>&2 crossroads-2.81/test/sampleconf.xml0000644000175000001440000001755312130034072016357 0ustar httpusers /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/local/bin:/opt/local/sbin true ssh tcp
0:20000
0:20001 SSH Balancer admin:secret 1800
server1:22
server2:22
server2:22
webone
0:20010
http 127.0.0.1:20011 lax-hashed-ip 3 0 yes yes /tmp yes 10.255.255.255 192.168.1.255 192.168.1.100 2 200 150 1000000 400 /path/to/program off on off on
MyFirstHeader: Whatever
MySecondHeader: WhateverElse
server1:80
2 300 www.mysite.org
server2:80
100 connect::81 www.myothersite.org
server3:80
get:server3:80/healthcheck.cgi (www.myothersite.org)|(www.yetanothersite.org)
crossroads-2.81/test/status.xml0000644000175000001440000000253712130034072015547 0ustar httpusers
localhost:3129
1 0 dead unavailable 0 00
aab-proxy-1:8080
1 0 dead unavailable 0 00
aab-proxy-2:80
1 0 dead unavailable 0 00
localhost:3128
1 0 alive available 8 1276168
crossroads-2.81/test/iphashtest.cc0000644000175000001440000000166412130034072016165 0ustar httpusers// C #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // C++ #include #include #include #include #include using namespace std; int main () { for (int a = 0; a <= 255; a++) { ostringstream o; o << "192.168.1." << a; struct in_addr ad; inet_aton (o.str().c_str(), &ad); unsigned index = 0; for (char *cp = (char*) &ad; unsigned(cp - (char*)&ad) < sizeof(struct in_addr); cp++) { index += *cp; index %= 60; //cout << " " << "byte: " << hex << *cp // << ", index: " << index << "\n"; } cout << inet_ntoa(ad) << ": " << dec << index << "\n"; } return (0); } crossroads-2.81/test/externaldispatcher0000755000175000001440000000033312130034072017311 0ustar httpusers#!/usr/bin/env perl # Example of an external dispatcher. # ---------------------------------- print STDERR (">>>> External dispatcher called on ", scalar(localtime()), " with arguments @ARGV\n"); print("0\n"); crossroads-2.81/Makefile0000644000175000001440000000600112130034072014151 0ustar httpusers# Top-level Makefile for XR # ------------------------- VER ?= 2.81 PREFIX ?= $(DESTDIR)/usr BINDIR ?= $(PREFIX)/sbin MANDIR ?= $(PREFIX)/share/man TAR ?= /tmp/crossroads-$(VER).tar.gz AUTHOR ?= Karel Kubat MAINTAINER ?= Karel Kubat DISTSITE ?= http://crossroads.e-tunity.com BASE ?= $(shell pwd) foo: @cat xr/etc/make.help local: mkdir -p xr/build xr/etc/gettools /usr/local/bin xr/etc c-conf e-ver xr/etc/e-ver ChangeLog $(VER) BASE=$(BASE) AUTHOR='$(AUTHOR)' MAINTAINER='$(MAINTAINER)' \ DISTSITE='$(DISTSITE)' MEMDEBUG=$(MEMDEBUG)\ VER='$(VER)' PROF=$(PROF) PROFILER=$(PROFILER) $(MAKE) -C xr localprof: PROF=-pg PROFILER=-DPROFILER make local localmem: MEMDEBUG=-DMEMDEBUG make local install: local $(BINDIR)/xrctl install-manpages mkdir -p $(BINDIR) BASE=$(BASE) AUTHOR='$(AUTHOR)' MAINTAINER='$(MAINTAINER)' \ DISTSITE='$(DISTSITE)' \ VER='$(VER)' BINDIR=$(BINDIR) $(MAKE) -C xr install @echo @echo ' The balancer program xr is now installed to $(BINDIR).' @echo ' The control script xrctl is installed there too. In order to' @echo ' use it, you will have to create /etc/xrctl.xml (if you have' @echo ' not done so yet). See "man xrctl.xml" for an example.' @echo @echo ' Have fun with Crossroads $(VER),' @echo ' -- $(MAINTAINER)' @echo $(BINDIR)/xrctl: xrctl/xrctl Makefile sed 's:__VER__:$(VER):' < xrctl/xrctl > $(BINDIR)/xrctl chmod +x $(BINDIR)/xrctl install-manpages: $(MANDIR)/man1/xr.1 $(MANDIR)/man1/xrctl.1 \ $(MANDIR)/man5/xrctl.xml.5 $(MANDIR)/man1/xr.1: doc/xr.1 mkdir -p $(MANDIR)/man1 cp $< $@ $(MANDIR)/man1/xrctl.1: doc/xrctl.1 mkdir -p $(MANDIR)/man1 cp $< $@ $(MANDIR)/man5/xrctl.xml.5: doc/xrctl.xml.5 mkdir -p $(MANDIR)/man5 cp $< $@ uninstall: rm -f $(BINDIR)/xr $(BINDIR)/xrctl @echo @echo 'The balancer binary xr and the control script xrctl have been' @echo 'removed from $(BINDIR).' @echo @if [ -f /etc/xrctl.xml ] ; then \ echo 'The configuration /etc/xrctl.xml still exists. Remove this' ; \ echo 'by hand if you are sure you will not be needing it.'; \ else \ echo 'Configuration /etc/xrctl.xml was not found. Maybe you have'; \ echo 'it in a different location or under a different name.'; \ echo 'If so, consider removing it by hand.'; \ fi; @echo @echo 'XR was uninstalled!' clean: rm -rf xr/build/* find . -name gmon.out -exec rm {} \; tar: clean rm -rf $(TAR) /tmp/crossroads-$(VER) cd ..; cp -r crossroads /tmp/crossroads-$(VER) cd /tmp; tar czf $(TAR) \ --exclude .git --exclude .svn --exclude crossroads-$(VER)/xr/build \ crossroads-$(VER) rm -rf /tmp/crossroads-$(VER) @echo @echo 'Sources now tarred into $(TAR)' commit: local clean test `svn status | grep '^\?' | wc -l` -eq 0 || \ (echo 'SVN not fully up to date: run "svn status"' && exit 1) test -f doc/xr.pdf || \ (echo 'PDF version of the docs not present!' && exit 1) test doc/xr.pdf -nt doc/xr.odt || \ (echo 'PDF version of the docs is stale!!' && exit 1) perl -c xrctl/xrctl svn -m $(VER) commit crossroads-2.81/LICENSE0000644000175000001440000007633212130034072013534 0ustar httpusersGNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONScrossroads-2.81/xrctl/0000755000175000001440000000000012130034076013654 5ustar httpuserscrossroads-2.81/xrctl/xrctl0000644000175000001440000006445512130034075014750 0ustar httpusers#!/usr/bin/perl use strict; use Getopt::Std; use Term::ANSIColor qw(:constants); # Versioning my $VER = "__VER__"; # -------------------------------------------------------------------------- # xrctl: used to start, stop, restart etc. the XR balancer. # Default configuration file to read and default logging facility my $default_conf = '/etc/xrctl.xml'; my $default_logger = 'logger'; my $default_prefixtimestamp = undef; # Default settings, must match xr's defaults my $default_dispatchmode = 'least-connections'; my $default_maxconnections = 0; my $default_client_timeout = 30; my $default_client_read_timeout = 30; my $default_client_write_timeout = 30; my $default_backend_timeout = 30; my $default_backend_read_timeout = 3; my $default_backend_write_timeout = 3; my $default_buffersize = 2048; my $default_wakeupinterval = 5; my $default_checkupinterval = 0; my $default_weight = 1; my $default_hostmatch = '.'; my $default_urlmatch = '.'; my $default_backendcheck = 'connect::'; my $default_timeinterval = 1; my $default_hardmaxconnrate = 0; my $default_softmaxconnrate = 0; my $default_defertime = 500000; my $default_hardmaxconnexcess = 0; my $default_softmaxconnexcess = 0; my $default_dnscachetimeout = 3600; # Cmd line flags my %opts = (v => 0, c => $default_conf, ); usage() unless (getopts('vc:', \%opts)); usage() if ($#ARGV == -1); # Load configuration my $xml; open (my $if, $opts{c}) or die ("Cannot read configuration $opts{c}: $!\n"); while (my $line = <$if>) { $xml .= $line; } close ($if); my $xp = new XMLParser($xml); # Load up the system config. my %sysconf; my $sysblock = $xp->data('system'); if ($sysblock ne '') { my $sysxp = new XMLParser($xp->data('system')); for my $tag qw(pscmd logger uselogger logdir maxlogsize loghistory path prefixtimestamp) { $sysconf{$tag} = $sysxp->data($tag); msg("System config $tag: $sysconf{$tag}\n") if ($sysconf{$tag} ne ''); } if ($sysconf{path} eq '') { msg ("No path in configuration, using environment\n"); $sysconf{path} = $ENV{PATH}; } if ($sysconf{logger} ne 'logger') { msg ("Using non-default logger\n"); $default_logger = $sysconf{logger}; } if ($sysconf{pscmd} eq '') { $sysconf{pscmd} = xfind_bin('ps'); if (`uname` =~ /SunOS/) { $sysconf{pscmd} .= ' -ef pid,comm'; } else { $sysconf{pscmd} .= ' ax -o pid,command'; } } msg ("PS command: $sysconf{pscmd}\n"); if ($sysconf{prefixtimestamp}) { $default_prefixtimestamp = 1 if istrue($sysconf{prefixtimestamp}); } else { $default_prefixtimestamp = 1 if (!istrue($sysconf{uselogger}) or !find_bin('logger')); } msg ("Log lines will be prefixed with a timestamp\n") if ($default_prefixtimestamp); } # Load up the service names. my @service_name; for (my $i = 0; ; $i++) { my $serviceblock = $xp->data('service', $i) or last; my $servicexp = new XMLParser($serviceblock) or die ("No blocks in configuration\n"); my $name = $servicexp->data('name') or die (" block lacks \n"); push (@service_name, $name); msg ("Service '$name' seen\n"); } die ("No service blocks seen\n") if ($#service_name == -1); # Take action $|++; my $cmd = shift(@ARGV); @ARGV = @service_name if ($#ARGV == -1); msg ("Acting on command: $cmd\n"); if ($cmd eq 'list') { cmd_list(@ARGV); } elsif ($cmd eq 'start') { cmd_start(@ARGV); } elsif ($cmd eq 'stop') { cmd_stop(@ARGV); } elsif ($cmd eq 'kill') { cmd_kill(@ARGV); } elsif ($cmd eq 'force') { cmd_force(@ARGV); } elsif ($cmd eq 'stopstart') { cmd_stopstart(@ARGV); } elsif ($cmd eq 'killstart') { cmd_killstart(@ARGV); } elsif ($cmd eq 'status') { cmd_status(@ARGV); } elsif ($cmd eq 'rotate') { cmd_rotate(@ARGV); } elsif ($cmd eq 'configtest') { cmd_configtest(@ARGV); } elsif ($cmd eq 'generateconfig') { cmd_generateconfig(@ARGV); } else { die ("Missing or unknown action $cmd\n"); } # -------------------------------------------------------------------------- # Top level commands sub cmd_list { for my $s (@_) { print ("Service: $s\n"); print (" Process name : ", process_name($s), "\n"); print (" Logging : ", log_file($s), "\n"); print (" XR command : ", xr_command($s), "\n"); } } sub cmd_start { my @to_start; for my $s (@_) { if (is_running($s)) { warn("Cannot start service $s, already running\n"); } else { push(@to_start, $s); } } for my $s (@to_start) { print ("Service $s: "); start_service($s); print ("started\n"); } } sub cmd_stop { my @pids; for my $s (@_) { my @p = is_running($s); if ($#p == -1) { warn("Cannot stop service $s, not running\n"); } else { print ("Service $s: running at @p\n"); push (@pids, @p); } } for my $p (@pids) { msg ("About to stop PID: '$p'\n"); } kill (15, @pids) if ($#pids > -1); print ("Services @_: stopped\n"); } sub cmd_kill { my @pids; for my $s (@_) { my @p = is_running($s); if ($#p == -1) { warn("Cannot kill service $s, not running\n"); } else { print ("Service $s: running at @p\n"); push (@pids, @p); } } for my $p (@pids) { msg ("About to kill PID: '$p'\n"); } kill (9, @pids) if ($#pids > -1); print ("Services @_: killed\n"); } sub cmd_force { for my $s (@_) { print ("Service $s: "); if (is_running($s)) { print ("already running\n"); } else { start_service($s); print ("started\n"); } } } sub cmd_stopstart { my @pids; for my $s (@_) { my @p = is_running($s); if ($#p == -1) { warn("Cannot stop service $s, not running\n"); } else { push (@pids, @p); } } print ("Service(s) @_: "); kill (15, @pids) if ($#pids > -1); print ("stoppped\n"); for my $s (@_) { print ("Service $s: "); start_service($s); print ("started\n"); } } sub cmd_killstart { my @pids; for my $s (@_) { my @p = is_running($s); if ($#p == -1) { warn("Cannot killstart service $s, not running\n"); } else { push (@pids, @p); } } print ("Service(s) @_: "); kill (9, @pids) if ($#pids > -1); print ("killed\n"); for my $s (@_) { print ("Service $s: "); start_service($s); print ("started\n"); } } sub cmd_status { for my $s (@_) { print ("Service $s: "); print (BOLD, RED, "not ", RESET) unless (is_running($s)); print ("running\n"); } } sub cmd_rotate { if (istrue($sysconf{uselogger}) and find_bin($default_logger)) { print ("Rotating not necessary, logging goes via logger\n"); return; } for my $s (@_) { print ("Service $s: "); my $f = log_file($s); print ("log file $f, "); if (substr($f, 0, 1) ne '>') { print ("not a file\n"); next; } $f = substr($f, 1); if (! -f $f) { print ("not present\n"); next; } if ((stat($f))[7] < $sysconf{maxlogsize}) { print ("no rotation necessary\n"); next; } unlink("$f.$sysconf{loghistory}", "$f.$sysconf{loghistory}.bz2", "$f.$sysconf{loghistory}.gz"); for (my $i = $sysconf{loghistory} - 1; $i >= 0; $i--) { my $src = "$f.$i"; my $dst = sprintf("$f.%d", $i + 1); rename($src, $dst); rename("$src.bz2", "$dst.bz2"); rename("$src.gz", "$dst.gz"); } rename($f, "$f.0"); print("rotated, "); my $zipper; if ($zipper = find_bin('bzip2') or $zipper = find_bin('gzip')) { system ("$zipper $f.0"); print ("zipped, "); } if (my @p = is_running($s)) { kill (15, @p) if ($#p > -1); print ("stopped, "); start_service($s); print ("started, "); } print ("done\n"); } } sub cmd_configtest { for my $s (@_) { print ("Service $s: "); my $cmd = xr_command($s) . ' --tryout'; if (system ($cmd)) { print ("FAILED, command: $cmd\n"); } else { print ("configuration ok\n"); } } } sub cmd_generateconfig { print ("\n", "\n", "\n", " \n", " \n"); for my $k (sort (keys (%sysconf))) { print (" <$k>$sysconf{$k}\n") if ($sysconf{$k} ne ''); } print (" \n"); for my $s (@_) { generateconfig($s); } print ("\n"); } # -------------------------------------------------------------------------- # Small utility functions # Show usage and die. sub usage() { die <<"ENDUSAGE"; This is xrctl V$VER, the control script for XR, the Crossroads Load Balancer. Usage: xrctl [-FLAGS] action [SERVICE ...] Flags are: -v increases verbosity -c CONFIG specifies the configuration, default $default_conf Actions are: configtest validates the configuration list shows the xr command line start starts the service(s) if they are not yet running stop gracefully stops the service(s) if they are running kill brutally kills the service(s), interrupting all connections force forces the service(s) up: starts if not running stopstart gracefully restarts the service(s) if they are running killstart brutally restarts status shows which services are running rotate rotates logs of the service(s) generateconfig queries running XR's for the current configuration and shows it in the format of $default_conf The SERVICES following an action are the services stated in the configuration. When absent, all configured services are handled. ENDUSAGE } # Is a service running? sub is_running { my $s = shift; open (my $if, "$sysconf{pscmd} |") or die ("Cannot start '$sysconf{pscmd}': $!\n"); my @ret; while (my $line = <$if>) { chomp ($line); $line =~ s/^\s*//; my ($pid, $cmd) = split(/\s+/, $line); # msg("Command '$cmd' at pid '$pid' (line $line)\n"); if ($cmd =~ /^xr-$s/) { push (@ret, $pid); msg ("Candidate PID: $pid\n"); } } return (@ret); } # Unconditionally start a given service sub start_service { my $s = shift; my $xr = xfind_bin('xr'); my @args = xr_cmdarr($s); my $logstr = log_file($s); my $logtype = substr($logstr, 0, 1); my $logout = substr($logstr, 1); # Try out the command line my $cmdline = xr_command($s) . ' --tryout'; system ($cmdline) and die ("Command line '$cmdline' fails to parse\n"); my $pid = fork(); die ("Cannot fork: $!\n") unless (defined ($pid)); return if ($pid > 0); # Child branch open (STDIN, '/dev/null') or die ("Cannot read /dev/null: $!\n"); if ($logtype eq '|') { open (STDOUT, "|$logout") or die ("Cannot pipe stdout to $logout: $!\n"); open (STDERR, "|$logout") or die ("Cannot pipe stderr to $logout: $!\n"); } else { open (STDOUT, ">>$logout") or die ("Cannot append stdout to $logout: $!\n"); open (STDERR, ">>$logout") or die ("Cannot append stderr to $logout: $!\n"); } exec ({$xr} @args); exit (1); } # Verbose message. sub msg { return unless ($opts{v}); print (@_); } # Find a binary along the path sub find_bin { my $bin = shift; my @parts = split (/\s/, $bin); if (substr($parts[0], 0, 1) eq '/' and -x $parts[0]) { msg("Binary '$bin' is executable as-is\n"); return $bin; } for my $d (split (/:/, $sysconf{path})) { if (-x "$d/$parts[0]" and -f "$d/$parts[0]") { msg ("Binary '$parts[0]' found as '$d/$parts[0]'\n"); $parts[0] = "$d/$parts[0]"; return (join (' ', @parts)); } } msg ("Binary '$bin' not found along $sysconf{path}\n"); return (undef); } sub xfind_bin { my $bin = shift; my $ret = find_bin ($bin) or die ("Binary '$bin' cannot be found along path '$sysconf{path}'\n"); return ($ret); } # Process name according to a service name sub process_name { my $service = shift; return ("xr-$service"); } # Log file according to a service name sub log_file { my $service = shift; my $logger = find_bin($default_logger); if (istrue($sysconf{uselogger}) and defined($logger)) { if ($default_logger eq 'logger') { return ("|$logger -t 'xr-$service'"); } else { $logger =~ s/\{service\}/$service/g; return ("|$logger"); } } else { return ('>' . $sysconf{logdir} . '/' . process_name($service) . '.log'); } } # XR command according to a service name as one string sub xr_command { my $service = shift; my @parts = xr_cmdarr($service); msg ("Exec command: @parts\n"); my $ret = xfind_bin('xr'); for (my $i = 1; $i <= $#parts; $i++) { my $sub = $parts[$i]; $sub =~ s/^\s+//; $sub =~ s/\s+$//; $ret .= ' ' . shquote($sub); } msg ("Shell command: $ret\n"); return ($ret); } # XR command according to a service name as an array, including ARGV[0] # pseudo-name sub xr_cmdarr { my $service = shift; my @cmd; push (@cmd, "xr-$service"); push (@cmd, '--prefix-timestamp') if ($default_prefixtimestamp); # Fetch the block for this service my $sp = xml_serviceparser($service) or die ("Failed to locate block for service '$service'\n"); # Service descriptions inside the block my $ss = xml_serverparser($sp); my $type = 'tcp'; $type = $ss->data('type') if ($ss->data('type')); my $addr = '0:10000'; $addr = $ss->data('address') if ($ss->data('address')); my $full = "$type:$addr"; push (@cmd, '--server', $full) if ($full ne 'tcp:0:10000'); # Flags that should go on the command line if the bool-tag is true my %boolflags = (closesocketsfast => '--close-sockets-fast', verbose => '--verbose', debug => '--debug', removereservations => '--remove-reservations'); # Web interface def comes from two tags my $w = $ss->data('webinterface'); if ($w) { if (my $name = $ss->data('webinterfacename')) { $w .= ":$name"; } push(@cmd, '--web-interface', $w); } # Handle general flags and boolflags push (@cmd, flag($ss, '--web-interface-auth', 'webinterfaceauth', ''), flag($ss, '--dispatch-mode', 'dispatchmode', $default_dispatchmode), flag($ss, '--max-connections', 'maxconnections', $default_maxconnections), flag($ss, '--client-timeout', 'clienttimeout', $default_client_timeout), flag($ss, '--backend-timeout', 'backendtimeout', $default_backend_timeout), flag($ss, '--buffer-size', 'buffersize', $default_buffersize), flag($ss, '--wakeup-interval', 'wakeupinterval', $default_wakeupinterval), flag($ss, '--checkup-interval', 'checkupinterval', $default_checkupinterval), flag($ss, '--time-interval', 'timeinterval', $default_timeinterval), flag($ss, '--hard-maxconnrate', 'hardmaxconnrate', $default_hardmaxconnrate), flag($ss, '--soft-maxconnrate', 'softmaxconnrate', $default_softmaxconnrate), flag($ss, '--defer-time', 'defertime', $default_defertime), flag($ss, '--hard-maxconn-excess', 'hardmaxconnexcess', $default_hardmaxconnexcess), flag($ss, '--soft-maxconn-excess', 'softmaxconnexcess', $default_softmaxconnexcess), flag($ss, '--dns-cache-timeout', 'dnscachetimeout', $default_dnscachetimeout), flag($ss, '--onstart', 'onstart'), flag($ss, '--onend', 'onend'), flag($ss, '--onfail', 'onfail'), flag($ss, '--log-traffic-dir', 'logtrafficdir', '')); for my $k (sort (keys (%boolflags))) { push (@cmd, $boolflags{$k}) if (istrue($ss->data($k))); } # Timeouts when specified using separate tags my $t = $ss->data('clientreadtimeout'); if (defined($t)) { my $val = $t; $t = $ss->data('clientwritetimeout'); $val .= ":$t" if (defined($t)); push (@cmd, '--client-timeout', $val); } $t = $ss->data('backendreadtimeout'); if (defined($t)) { my $val = $t; $t = $ss->data('backendwritetimeout'); $val .= ":$t" if (defined($t)); push (@cmd, '--backend-timeout', $val); } # ACL's for (my $i = 0; ; $i++) { my $mask = $ss->data('allowfrom', $i) or last; push (@cmd, '--allow-from', $mask); } for (my $i = 0; ; $i++) { my $mask = $ss->data('denyfrom', $i) or last; push (@cmd, '--deny-from', $mask); } # HTTP goodies push (@cmd, '--add-xr-version') if ($ss->data('addxrversion') and istrue($ss->data('addxrversion'))); push (@cmd, '--add-x-forwarded-for') if ($ss->data('addxforwardedfor') and istrue($ss->data('addxforwardedfor'))); push (@cmd, '--sticky-http') if ($ss->data('stickyhttp') and istrue($ss->data('stickyhttp'))); push (@cmd, '--replace-host-header') if ($ss->data('replacehostheader') and istrue($ss->data('replacehostheader'))); for (my $i = 0; ; $i++) { my $h = $ss->data('header', $i) or last; push (@cmd, '--add-server-header', $h); } # The blocks for this service my $last_hostmatch = $default_hostmatch; my $last_urlmatch = $default_urlmatch; my $last_backendcheck = $default_backendcheck; for (my $i = 0; ; $i++) { my $bp = xml_backendparser($sp, $i) or last; # Handle host match my $hm = $bp->data('hostmatch'); if ($hm and $hm ne $last_hostmatch) { push (@cmd, '--host-match', $hm); } elsif ($hm eq '' and $last_hostmatch ne '') { push (@cmd, '--host-match', $default_hostmatch); } $last_hostmatch = $hm; # Handle url match my $um = $bp->data('urlmatch'); if ($um and $um ne $last_urlmatch) { push (@cmd, '--url-match', $um); } elsif ($um eq '' and $last_urlmatch ne '') { push (@cmd, '--url-match', $default_urlmatch); } $last_urlmatch = $um; # Handle back end checks my $bc = $bp->data('backendcheck'); if ($bc and $bc ne $last_backendcheck) { push (@cmd, '--backend-check', $bc); } elsif ($bc eq '' and $last_backendcheck ne '') { push (@cmd, '--backend-check', $default_backendcheck); } $last_backendcheck = $bc; # Get address, weight and max connections my $ad = $bp->data('address') or die ("Backend in service '$service' lacks
\n"); my $mx = $bp->data('maxconnections'); $mx = $default_maxconnections if (!$mx); $ad .= ":$mx"; my $wt = $bp->data('weight'); $wt = $default_weight if (!$wt); $ad .= ":$wt"; push (@cmd, '--backend', $ad); } # TODO: stuff, and the pid, resulting in something like: # push(@cmd, '--pidfile', "/var/run/xr-$service.pid"); # All done my @ret; # msg("Generated flags/arguments:\n"); for my $c (@cmd) { if ($c ne '') { push (@ret, $c); # msg (" $c"); } } # msg ("\n"); return (@ret); } # Shell-quote a string sub shquote($) { my $s = shift; return $s unless ($s =~ /[\(\)\'\"\| \*\[\]\^\$]/); if ($s !~ /'/) { $s = "'$s'"; } elsif ($s !~ /"/) { $s = "\"$s\""; } else { $s =~ s/"/\\"/g; $s = "\"$s\""; } return $s; } # Prepare a flag for the command line if it is defined and if it is # not equal to the default sub flag { my ($parser, $longopt, $tag, $default) = @_; msg ("Flag tag $tag: ", $parser->data($tag), " (default: '$default')\n"); if ($parser->data($tag) ne '' && $parser->data($tag) ne $default) { msg ("Flag values meaningful: ", $longopt, ' ', $parser->data($tag), "\n"); return ($longopt, $parser->data($tag)); } return (undef); } # Is a boolean value true sub istrue { my $val = shift; return (1) if ($val eq 'true' or $val eq 'on' or $val eq 'yes' or $val != 0); return (undef); } # Fetch an XMLParser for a block given a service name sub xml_serviceparser { my $service = shift; for (my $i = 0; ; $i++) { my $xml = $xp->data('service', $i) or return (undef); msg ("XML service block: $xml\n"); my $sub = new XMLParser($xml); return ($sub) if ($sub->data('name') eq $service); } return (undef); } # Fetch an XMLParser for a block given a service parser sub xml_serverparser { my $serviceparser = shift; my $xml = $serviceparser->data('server') or return undef; return new XMLParser($xml); } # Fetch an XMLParser for a block given a service parser and # an order number sub xml_backendparser { my ($serviceparser, $order) = @_; $order = 0 unless ($order); my $xml = $serviceparser->data('backend', $order) or return (undef); return (new XMLParser($xml)); } # Generate a service configuration from the running XR, if it has a # web interface sub generateconfig { my $s = shift; msg ("Generating runtime configuration for service '$s'\n"); my $sp = xml_serviceparser($s) or die ("No service '$s' known.\n"); my $webint = $sp->data('webinterface'); # Web interface at IP "0" means localhost $webint =~ s/^0:/localhost:/; if ($webint eq '') { print ("\n", " \n"); return; } print ("\n", " \n", " \n", " $s\n"); # Get the configuration from a running XR. Try LWP::UserAgent or # fall back to wget. my $response_blob; eval ("require LWP::UserAgent;"); if ($@) { msg ("LWP::UserAgent not present, trying wget\n"); my $wget = find_bin('wget') or die ("Neither LWP::UserAgent nor wget found.\n", "Cannot contact service web interface $webint.\n"); open (my $if, "wget --no-proxy -q -O- http://$webint/ |") or die ("Cannot start wget: $!\n"); while (my $line = <$if>) { $response_blob .= $line; } close ($if) or die ("Wget indicates failure\n"); } else { my $ua = LWP::UserAgent->new(); my $res = $ua->get("http://$webint/"); die ("Failed to contact web interface at $webint:\n", $res->status_line(), "\n") unless ($res->is_success()); $response_blob = $res->content(); } # Print the config. my $active = 0; for my $l (split (/\n/, $response_blob)) { if ($l =~ //) { print (" $l\n"); $active = 1; } elsif ($l =~ /<\/status>/) { $active = 0; } elsif ($l =~ //) { $active = 0; } elsif ($l =~ /<\/activity>/) { $active = 1; } elsif ($active) { print (" $l\n"); } } print (" \n"); } # -------------------------------------------------------------------------- # Idiotically simple XML parser. Used instead of a "real" parser so that # xrctl isn't dependent on modules and can run anywhere. Safe for using # with xr-style XML configs, but not with any XML in the free. package XMLParser; sub new { my ($proto, $doc) = @_; my $self = {}; die ("Missing XML document\n") unless($doc); my $docstr = ''; for my $p (split (/\n/, $doc)) { $docstr .= $p; } # Whitespace between tags is trash $docstr =~ s{>\s+<}{><}g; # Remove comments from the doc FINDCOMM: for (my $i = 0; $i <= length($docstr); $i++) { next unless (substr($docstr, $i, 4) eq '') { # print ("Comment: ", substr($docstr, $i, $end + 3 - $i), "\n"); $docstr = substr($docstr, 0, $i) . substr($docstr, $end + 3); $i--; next FINDCOMM; } } } # Activity logs is trash $docstr =~ s{.*}{}g; # print $docstr, "\n"; $self->{xml} = $docstr; bless ($self, $proto); return ($self); } sub data { my ($self, $tag, $order) = @_; # print("Searching for <$tag> order $order\n"); die ("XML::data: no tag to search for\n") unless ($tag); $order = 0 unless ($order); my $xml = $self->{xml}; my $ret = undef; for (0..$order) { my $start = _findfirst($xml, "<$tag>"); return (undef) unless (defined ($start)); $xml = substr($xml, $start + length("<$tag>")); # print ("start $start $xml\n"); my $end = _findfirst($xml, ""); die ("Failed to match , invalid XML\n") unless (defined ($end)); $ret = substr($xml, 0, $end); $xml = substr($xml, $end + length("")); # print ("end $end $xml\n"); } # print("Result for <$tag> $order: [$ret]\n"); return ($ret); } sub _findfirst { my ($stack, $needle) = @_; # print ("needle: $needle, stack: $stack\n"); for my $i (0..length($stack)) { my $sub = substr($stack, $i, length($needle)); # print ("sub: $sub\n"); return ($i) if ($sub eq $needle); } return (undef); } sub _findlast { my ($stack, $needle) = @_; for (my $i = length($stack); $i >= 0; $i--) { return ($i) if (substr($stack, $i, length($needle)) eq $needle); } return (undef); } 1; crossroads-2.81/ChangeLog0000644000175000001440000005301412130034070014267 0ustar httpusers2.81 [KK 2013-04-05] - Upped to c-conf 1.18 for Raspberry Pi. 2.80 [KK 2013-03-15] - Upped to c-conf 1.17 (Ubuntu 64bits libs). - When replacing Host: headers with the back end address, the port is also appended. See flag -I / --replace-host-header. Thanks Nuno F. for the patch. 2.79 [KK 2012-04-19] - Bugfix in the web interface network handling. 2.78 [KK 2012-04-18] - xrctl fixes, thanks Carlos H. for reporting. 2.77 [KK 2012-02-16] - gc++ 4.6 portability issues 2.76 [KK 2011-05-24] - Round-robin dispatching takes weights into acocunt. By request of and suggested by David T. 2.75 [KK 2011-05-23] - Signal SIGUSR1 toggles verbose logging, SIGUSR2 toggles debug logging. - Back end connection attempts improved (assumes "alive" unless a failure is seen). - Flag parsing for -p / --pidfile fixed. - Warning: Memory leak reported with high load. Under investigation. 2.74 [KK 2011-04-05] - Promoted to STABLE. A word of warning: DOS protection under high load may be unstable, currently under investigation. 2.73 [KK 2011-03-05] - Removed too much debugging verbosity from socket handling - Bugfix in basesocket/accept.cc, thanks Mario M. for reporting - Change in tcp dispatcher: when the algorithm fails, a new target list is constructed for re-dispatching. 2.72 [KK 2011-01-11] - Web interface correctly retrieved in "xrctl list" (including the display name and all). - Small bugfix in TCP-connect-checking of dead back ends (see xr/backend/check.cc). - Bugfix in the first-available dispatch algorithm. - Socket handling rewritten, using Socket/Basesocket classes. Consider this version alpha-code until the new socket handling proves itself! 2.71 [KK 2010-11-25] - Recentness of doc/xr.pdf is checked (against doc/xr.odt) during "make commit" - Error messages are also prefixed with a timestamp when flagged so (just as warnings, verbose messages etc.) - Web interface flag --web-interface may hold a 3rd argument, a name. This name is rendered in the browser. Xrctl tag "webinterfacename" introduced for this purpose. - Fixed 32-bit issue in MutexTable::hash(), the modulo-operation while hashing worked on 64-bit systems, but not on 32-bit. (Thanks, several people for reporting this.) - Fixed mutex issue during pre-operation scanning of back ends. XR would crash when started with only dead back ends in the pre-scan phase. 2.70 [KK 2010-10-28] - Bugfix in 3-secs delay during out of file handles conditions (see xr/balancer/serve.cc) - Potential bug fixed in web interface responder (check for validity of client socket added). - Browser requests for /favicon.ico are silently dropped (404 return), instead of showing up in the error log as unknown url. - Small codechanges in back end testing via TCP. E.g, when tcp-connect checking a back end, the connection is attempted twice by default. Just once appears to fail on some systems, twice fixes the problem. - Basic authentication for the web interface implemented. This can be given on the commandline using --webinterface-auth, in xrctl.xml using the tag webinterfaceauth, or injected later on the url /server/webinterfaceauth/USER:PASS 2.69 [KK 2010-10-08] - Installation paths in the make install process can be tweaked, thanks Felix A. W. O. for suggesting this. - Verbose and debugging output were by mistake both controlled by the flag --debug (instead of --debug and --verbose). Fixed. - When the process runs out of open files, XR will sleep for EMFILE_SEC secs (see the #define in sys/sys). This avoids thrashing the output log. - Documentation updated. 2.68 [KK 2010-09-22] - All sources checked by cppcheck (static code analysis). - License file added. - Bugfix in xrctl.xml parsing, logger and other binaries can be now specified as absolutes. - Mutex handling rewritten, new code is faster than the older one and hopefully more thread-safe in rare conditions (fingers crossed ;-) - Macros for verbose/debug output rewritten for type-safeness. Locking of cout/cerr is in try-out mode only, so that mutex locks due to messages won't happen. - All occurrences of inet_ntoa() changed to inet2string() (see sys/inet2string.cc) for thread-safeness. - Double header-processing in HTTP mode fixed. Thanks for reporting, Maxim P. and Chin F. - Optimisation / consistency fix in Httpbuffer::findheader(), thanks Maxim P. for finding this and reporting. 2.67 [KK 2010-06-11] - Further bugfix in xrctl to shell-escape all XR parameters where necessary (including e.g. url matching regexps etc.). 2.66 [KK 2010-06-09] - Bugfix in xrctl, --host-match arguments are now shell-quoted (they are regular expressions and can contain pipe characters etc). Thanks Chewped for reporting. 2.65 [KK 2010-04-26] - Bugfix in backend/connect.cc - if the determination whether a back end is available goes haywire, the client socket may stay open and not be consumed. Thanks Franz J. for reporting! - Version stamped as STABLE. 2.64 [KK 2010-01-29] - Fixed signal handling for start/stop/restart. - Web interface now immediately shuts down at a stop request, so that next xr instances can grab the web interface port immediately. 2.63 [KK 2010-01-11] - Previous 2.62 stamped as stable, 2.63 will be the new development trunk. 2.62 [KK 2010-01-08] - Fixed possible coredump cause in Balancer::serve(), which might explain some troubles during high load (many really concurrent requests). 2.61 [KK 2009-11-17] - Netbuffer::netwrite() will abort after 5 attempts that yield 0 written bytes. Probable cause of CPU hogging - thx Franz J. for reporting. - Fixed potential cause of crashes in base class for Dispatcher (algorithm handler would not get initialized in the constructors). 2.60 [KK 2009-11-02] - Some errors demoted to informational messages to choke the amount of log information that's generated. 2.59 [KK 2009-10-14] - Bugfix in logger handling of xrctl, read http://xrforum.org/viewtopic.php?t=495 if you fancy. Thanks Hobbit for reporting this! 2.58 [KK 2009-10-14] - Added test/ftp.xml as a sample ftp service configuration. - Implemented URL-based dispatching: flag --url-match/-j, present in xrctl, tested in test/urlmatch.xml, added to web interface - Usage information now shows long versions of flags first. 2.57 [KK 2009-09-14] - Output of "xrctl status" colorized when a service is not running, thanks Frederik D. for the suggestion and the code! - Small cleanup of xrctl's usage information. 2.56 [KK 2009-05-26] - Bugfix in cleaning of IPStore map - Implemented flag --remove-reservations (xrctl: tag: removereservations) - Timeouts adjusted: all read time outs set to 30, client-write set to 5, backend-write set to 3 - Implemented tag prefixtimestamp in system block to force timestamping. 2.55 [KK 2009-05-13] - Implemented connection error counting of back ends. - Select-handling revised: atomic readability and writeability checks, see xr/fdset/wait.cc and wait_r(), wait_w(), wait_rw(). - Checks for connect() success can be configured to verify only writeable status of a socket (see xr/backend/connect.cc, macro CONNECTCHECK_ONLY_WRITABLE in xr/etc/Makefile.class). - Added test/xr-mysql-connect. - Added commands kill and killstart to xrctl. Action restart renamed to stopstart. - Added simple benchmarking under test/: xr-http-test (based on an older script) and xr-smtp-test. Plus a simple analyzer of the reported timings, xr-analyze-test. - Revamped stored-ip dispatcher, added IPStore class to keep track of clients. 2.54 [KK 2009-04-29] - Stamped new STABLE version. 2.53 [KK 2009-04-24] - test/xr-client-ping now can live without LWP::UserAgent. When this Perl module is not present, the script will fall back to wget/curl. - Upon thread kill, sockets are closed using socketclose() (sys/socketclose.cc), which also shutdown()s the socket. - Bugfix in xrctl regarding new format of client/backend timeout. 2.52 [KK 2009-04-21] - Bugfix in the roundrobin dispatcher. When only one back end would be up, then the roundrobin dispatcher would incorrectly compute the right back end. This bug only became visible with host-matching in HTTP mode. 2.51 [KK 2009-04-15] - Separate "write" timeouts introduced in flags -t and -T - Web interface activity overview includes client ip addresses - Added test/xr-client-ping (see docs) 2.50 [KK 2009-03-30] - Bugfix in activation of the onfail script in the checkup thread. - Compilation flag -Werror only passed to the compiler when on the development system Thera.local (see xr/etc/Makefile.class). - Onstart, onend and onfail scripts (when present) are invoked with a third argument, the number of connections at the time - Set-Cookie header directive (see the HTTP dispatcher) attaches an explicit path "/". - Rewired the tcp dispatcher and http dispatcher to use a common buffer inside the tcp dispatcher (instead of 2 separate ones). 2.49 [KK 2009-03-27] - Implemented onfail hook (to complement onstart/onend, flag -y). 2.48 [KK 2009-03-26] - Implemented onstart/onend hooks (flags -z, -Z). - Sticky HTTP mode inspects the URI (parameter XRTarget) when no sticky cookie is present. 2.47 [KK 2009-03-04] - Stored-ip dispatching was enhanced to "anticipate" reconnects from previously seen clients. The number of anticipated connections is taken into account when dispatching a new client. - Bugfix in command line parsing of dispatch mode lax-stored-ip (would be recognized as strict). 2.46 [KK 2009-02-18] - Dispatcher-related classes moved under directory xr/Dispatchers/. - UDP balancer implementation started (code stubs in place). - xrctl bugfixed: a backend-scope maxconnections statement would confuse the global server block. Thanks Rajeev for reporting. 2.45 [KK 2009-02-18] - Usage information formatted. - Rubberstamped "stable"! 2.44 [KK 2009-02-11] - Reviewed code for "throw"s (edited for consistency). - Bug in Webinterface::execute() (during accept()). Thanks Vladimir T. for reporting and testing. 2.43 [KK 2009-02-09] - Added Httpbuffer::replaceheader() methods - Added flag -I (to replace Host: headers), integrated in xrctl / webinterface - Webinterface reports approx. # of open fd's and the limit (in activity) 2.42 [KK 2009-01-28] - Bugfix in "xrctl generateconfig". The activity info introduced before (which the web interface now emites), confused xrctl. - Bugfix in sys/ipmatch.cc: mask matching corrected for systems where longs are not 4 bytes (64bit systems). - Bugfix in hashed-ip dispatch mode: When no back ends were available, the dispatcher would crash (fixed). - XSLT stylesheet that transforms web interface slightly changed to improve the looks. - Bugfix in xrctl's "rotate" action. Thanks "ncisrael" for reporting it in the forum. 2.41 [KK 2009-01-05] - Bugfix in xrctl, thanks Eddie for reporting it. 2.40 [KK 2009-01-03] - Netbuffer::read() failures are no longer logged as errors, but as verbose messages. - XML configuration now supports "logger" to redefine logger program. - Small changes to xrctl: ps command is auto-guessed when not specified in the XML configuration. 2.39 [KK 2008-12-04] - Added Httpbuffer::reset() - The HTTP dispatcher will show back end error returns (when the HTTP code is in the 400 or 500 range) - main() will show runtime limits when invoked with -v - The HTTP dispatcher no longer downgrades to HTTP/1.0 and closed connections. Webserver back ends can do this. - Exceptions during the sending of an error page in HTTP mode are discarded, no longer logged. - Mutex lock added around thread startups (see Thread::start()), when requested soq in sys/sys. - Mutex locks around malloc()/realloc(), when requested so in sys/sys. - Fixed possible socket leak in TcpDispatcher::execute(). The back end socket might not have been closed when the dispatch phase crashed. - Dispatchers are now derived from a new base class Dispatcher, in preparation for UDP handling. - Timestamp handling centralized in a class Timestamp. - Messaging (msg(), debugmsg(), reportmsg(), warnmsg()) centralized. - Started threads are administered in Threadlist. Separate threads are killable from the web interface, or all threads to a given back end. 2.38 [KK 2008-11-19] - Bugfix in xrctl: Weights and max connections in back ends are now passed correctly. - Added version ID to xrctl. 2.37 [KK 2008-11-17] - Main accept-loop in Balancer::serve() doesn't throw an exception when a network connection can't be accepted. The reason is shown in a warnmsg(). 2.36 [KK 2008-11-11] - Typo bugfix in xrctl, fixed. - xrctl will take the environment's PATH if no path is given in the configuration. 2.35 [KK 2008-11-11] - The wakeup and checkup thread are always started, even when no wakeups or checkups are defined. Reason is that later these timers can be set in the web interface, so we want the threads running. When no checks/wakeups are applicable, the threads will recheck each 30 secs. - Server type (tcp/http) made configurable through the web interface. 2.34 [KK 2008-11-09] - Fixed sys/str2parts.cc for 64bit systems. 2.33 [KK 2008-11-07] - Solaris portability for gcc 3.4 issues in Tcpdispatcher::execute() - Removed warnings about non-found libraries (on systems that don't need them) - Support for DESTDIR setting in top Makefile (for debian packaging) - Man pages added as doc/xr.1, doc/xrctl.1 and doc/xrctl.xml.5. 2.32 [KK 2008-11-05] - Bugfix in "stored-ip" dispatching algorithm. 2.31 [KK 2008-10-30] - Changes related to XML-style configuration file support. A new-style xrctl is in provided and during "make install" put in BINDIR (normally: /usr/sbin). See test/sampleconf.xml for an example of a configuration file. - Added webinterface URI's to control DOS-protection related settings. - Added DOS-protection variables to XML-output of the web interface. - Server-wide maxconnection tag output moved into dosprotection block. - Added display of such variables to the style sheet that renders the XML in a browser. - Added option close-sockets-fast to XML output and to website URI controls. - Added allow-from and deny-from lists to XML output and to website URI controls. - Added the primary distribution site to the top-level Makefile as macro. This now shows up in "xr -V". The version ID and site also show up at the bottom of the web interface screen. - Target "uninstall" added to the top-level Makefile. - Bugfix in Netbuffer::netwrite(). When the remote connection would be hung up, XR would be blissfully unaware. SIGPIPE signals are now ignored. - Implemented flag -g / --backend-check. Alternatives: connect:ip:port, get:ip:port[/uri], external:program. - Added back end check type to the web interface reports, created control at web interface for /backend/NR/backendcheck/VALUE to change it. Added to XML configuration parsing. - Docs updated, ofc. - Status of balancer shown in web interface. Minor bugfix in xrctl. - Added flags -E/-e (hard/soft-maxconn-excess, to call an external program). Also added to web interface with controls and updated docs. - Added mutex locks around cerr output catch-blocks of exceptions. - Added more checks for memory allocation faults. - Implemented DNS caching of back end host names (flag -F, --dns-cache-timeout). Also implemented in web interface output and controls. - Implemented adding and/or deleting back ends from the user interface, including scripting URI's. - Implemented generation of a new configuration using "xrctl generateconfig". 2.30 [KK 2008-10-25] - Reversioned to 2.30 in prepration for STABLE release. - Bugfix in Netbuffer::netwrite() (debug output of written data) - SIGPIPE gets ignored, see sys/main.cc - Fixed re-entrancy issues for gethostbyname() that applies to some unices. See Backend::connect() (xr/backend/connect.cc). 2.22 [KK 2008-10-16] - Implemented up/down state in back ends. Fixed up the docs. - Rewrote msg() and debugmsg() handling: these are now macros that call _msg() and _debugmsg() depending on verbose/debug flags. The argument is a Mstr object, used to concatenate strings with ints, doubles and so on. 2.21 [KK 2008-10-14] - Fixed round-robin dispatching with only 1 configured back end. The bug was that on the next-time around, no "other" back end would be found. - Centralized reading/writing from fd's and buffer handling into class Netbuffer. This removes superfluous buffer copying in the HTTP dispatcher. - Rewrote HTTP dispatcher & (hopefully) optimized it. - Added Profiler class and xr/etc/xrprof tool. - Many other small changes. - Added docs on maxconn flags and weighted-load dispatching. - THIS VERSION IS A REWRITE OF THE HTTP DISPATCHER. IT IS ALPHA-QUALITY. 2.20 [KK 2008-10-13] - Fixed -C flag recognition, --close-sockets-fast worked, but I'd omitted -C from the flag set. - Ongoing optimization work. 2.19 [KK 2008-10-13] - Changed the TCP Dispatcher to allow for setting a maximum # connection attempts per client, with options to either defer the connection or drop it. - Added a dispatch mdoe "weighted-load" for randomly picking a back end based on the inverse of their respective load averages. (gem) - Verbose/debug options in the web interface are now rendered as select boxes. - Web interface errors are rendered on the client as an HTML error page. - Docs updated regarding web interface URI's. - Turned on compliler optimizing (had forgotten that before!) - Docs updated regarding web interface URI's. 2.18 [KK 2008-10-08] - Improved command line parsing, so that when --checkup-interval is used, suppression of "--wakeup-interval 0" is no longer needed. 2.17 [KK 2008-10-07] - Type sizes reported in "xr -V" - Fixed nasty bug in sys/fdwrite.cc 2.16 [KK 2008-10-05] - Enhanced web interface to show debug, verbose and traffic log states - Altering parameters for the web interface get sent in encoded form - Option --log-traffic was renamed to --log-traffic-dir for consistency - Enhanced web interface to modify client and back end timeouts - Enhanced web interface to modify wakeup / checkup intervals. 2.15 - Sanity checks in Config::parsecmdline(): -w/-c together throws error. - Network sends are now using write(), unless under Solaris, which uses send(). - --log-traffic logs to file with as the base name: the request number. - System (uname) is recorded during compilation and displayed in "xr -V" 2.14 [KK 2008-09-30] - Removed spurious debug message. - Fixed usage info for buffer size flag (should be -B, not -b). - Implemented flag -l (--log-traffic). 2.13 [KK 2008-09-17] - Porting issues resolved for older MacOSX (10.3, 10.4) - Bugfix in XML emitting of web interface. Most browsers didn't even notice.. 2.12 [KK 2008-09-10] - Small code changes for g++ v3.x backward-compatibility support. (Thanks Simon M.) - Web interface: layout enhanced, more modification options - Code cleanup, duplications removed - Network sending ignores some errno's and retries (see sys/fdwrite.cc) - Web interface retries binding to its socket (incase a previous instance hasn't terminated yet) - Web interface returns an HTTP error page (status 500 only, no content) during errors 2.11 [KK 2008-09-04] - Bugfix in "first-active" dispatch mode. Previously XR would gobble up fd's when no back end was available. - Web interface (first version) implemented. 2.10 [KK 2008-09-02] - Bugfix in host match mode. When a back end doesn't match anything, then the client isn't served. (Previously the dispatcher would fall back to least-connections over all known back ends.) - In HTTP mode, a 502 error gets returned to the client when dispatching fails or when back end processing goes haywire. There is just one error page, 502 error header, 0 bytes content length. - Implemented back end weights for least-connections dispatching. - Bugfix in Backend::connect(): Socket gets closed when connecting fails. 2.09 [KK 2008-09-01] --host-match code implemented 2.08 [KK 2008-08-31] I'd forgotten to include the 'P' into the set of allowed flags (--prefix-timestamp would work, -P not). Fixed. 2.07 [KK 2008-08-28] Stupid bug in 2.06, sorry that 2.06 got out.. Fixed. 2.06 [KK 2008-08-27] Upped c-conf to 1.14. xrctl updated: 'ps' command format also suitable for SunOS. New class Mutex implemented. Mutex-locks are now more fine-grained (per one global or static). Solaris9 port w/gcc 3.4.6 done. 2.05 [KK 2008-08-15] Thrown errors now based on std::exeception. "xr -V" shows compilation settings. Code reorganized into directory hierarchy. 2.04 [KK 2008-08-11] Mutex in Thread class is now a static. Implemented dispatching algorithm "stored clent ip", in the variants strict and lax. Flag -n / --tryout implemented. Implemented in xrctl. 2.03 [KK 2008-08-10] Updated docs regarding the mailing list. Fixed verbose display upon accepting a client ("current back end states"). Implemented dispatching algorithm "hashed client ip", in the variants strict and lax. 2.02 [KK 2008-08-09] Changes to the Makefile & some sources to avoid warnings under RHL (thanks, Simon M.). Bytes processed by a back end is now administered in TcpDispatcher::writechunk() and not readchunk(). Reason: In HTTP mode, the target back end is not yet known upon the first read -- the first read from the client comes before dispatching. Thanks Simon M. for the bug report. All select()'s now check for errno==EINTR, incase XR gets a signal -1 (for status report). 2.01 [KK 2008-08-08] Implemented flag -C (--close-sockets-fast): this option *can* be used under heavy stress when too many network sockets remain in TIME_WAIT state (try with 'netstat -n | grep TIME_WAIT'). Syntax of xrctl is checked upon "make commit". Added documentation about Solaris tcp_time_wait_interval and Linux ip_conntrack_max. Added documentation about binding XR to the same port, using different bind-to IP's. 2.00 [KK 2008-08-07] Release of 2.00.