mod_perl-2.0.9/0000755000104000010010000000000012540623203013761 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/0000755000104000010010000000000012540623175016356 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/Changes0000644000104000010010000000257712540623175017664 0ustar AdministratorsNone=head1 NAME Changes - Apache::Reload change logfile =head1 CHANGES =over 1 =item 0.13 May 09, 2015 Fix reload.t. Reported in CPAN RT#96656. [Steve Hay] =item 0.12 March 31, 2012 Set the -apxs argument correctly when building from mod_perl. [Steve Hay] Doc spelling fix [Nicholas Bamber] Add Apache-Test 1.34 dependency. [Phred] =item 0.11 August 21, 2010 Ignore require-hooks which exist in %INC [Ryan Gies ] Reloads by file, not module name [Ryan Gies ] Add a no Apache::Reload directive which skips reloading for modules that have it included (useful for Moose compatibility). [Graham Barr, ] Add Empty NOTICE file http://rt.cpan.org/Ticket/Display.html?id=34786 [Niko Tyni (Debian Perl Group) ] =item 0.10 February 25, 2008 Add make disttest procedure to RELEASE document - fred Check for Apache::Test version 1.30, needed to run tests - fred Apache::Reload and Apache2::Reload bundled for CPAN release This release incorporates unreleased changes in 0.08 and 0.09 [Fred Moyer ] =item 0.09 Apache2::Reload was part of mod_perl2 core in this version =item 0.08 Remove modified modules before reloading them [Javier Ureuen Val] Imported from v0.07 into ASF SVN [Philip M. Gollucci ] Matt Sergeant has donated Apache-Reload to the ASF. =back mod_perl-2.0.9/Apache-Reload/lib/0000755000104000010010000000000012540623174017123 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/lib/Apache/0000755000104000010010000000000012540623175020305 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/lib/Apache/Reload.pm0000644000104000010010000002041512540623175022053 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package Apache::Reload; use strict; $Apache::Reload::VERSION = '0.13'; use vars qw(%INCS %Stat $TouchTime %UndefFields %Ignore); %Stat = ($INC{"Apache/Reload.pm"} => time); $TouchTime = time; sub import { my $class = shift; my ($package,$file) = (caller)[0,1]; $class->register_module($package, $file); } sub unimport { my $class = shift; my ($package,$file) = (caller)[0,1]; $class->unregister_module($package, $file); } sub package_to_module { my $package = shift; $package =~ s/::/\//g; $package .= ".pm"; return $package; } sub register_module { my ($class, $package, $file) = @_; my $module = package_to_module($package); if ($file) { $INCS{$module} = $file; } else { $file = $INC{$module}; return unless $file; $INCS{$module} = $file; } no strict 'refs'; if (%{"${package}::FIELDS"}) { $UndefFields{$module} = "${package}::FIELDS"; } } sub unregister_module { my ($class, $package, $file) = @_; my $module = package_to_module($package); $Ignore{$module} = 1; } sub handler { my $r = shift; my $DEBUG = ref($r) && (lc($r->dir_config("ReloadDebug") || '') eq 'on'); my $TouchFile = ref($r) && $r->dir_config("ReloadTouchFile"); my $TouchModules; if ($TouchFile) { warn "Checking mtime of $TouchFile\n" if $DEBUG; my $touch_mtime = (stat($TouchFile))[9] || return 1; return 1 unless $touch_mtime > $TouchTime; $TouchTime = $touch_mtime; my $sym = Apache->gensym; open($sym, $TouchFile) || die "Can't open '$TouchFile': $!"; $TouchModules = <$sym>; chomp $TouchModules; } if (ref($r) && (lc($r->dir_config("ReloadAll") || 'on') eq 'on')) { *Apache::Reload::INCS = \%INC; } else { *Apache::Reload::INCS = \%INCS; my $ExtraList = $TouchModules || (ref($r) && $r->dir_config("ReloadModules")) || ''; my @extra = split(/\s+/, $ExtraList); foreach (@extra) { if (/(.*)::\*$/) { my $prefix = $1; $prefix =~ s/::/\//g; foreach my $match (keys %INC) { if ($match =~ /^\Q$prefix\E/) { $Apache::Reload::INCS{$match} = $INC{$match}; my $package = $match; $package =~ s/\//::/g; $package =~ s/\.pm$//; no strict 'refs'; # warn "checking for FIELDS on $package\n"; if (%{"${package}::FIELDS"}) { # warn "found fields in $package\n"; $UndefFields{$match} = "${package}::FIELDS"; } } } } else { Apache::Reload->register_module($_); } } } my @changed; while (my($key, $file) = each %Apache::Reload::INCS) { local $^W; warn "Apache::Reload: Checking mtime of $key\n" if $DEBUG; my $mtime = (stat $file)[9]; unless (defined($mtime) && $mtime) { for (@INC) { $mtime = (stat "$_/$file")[9]; last if defined($mtime) && $mtime; } } warn("Apache::Reload: Can't locate $file\n"),next unless defined $mtime and $mtime; unless (defined $Stat{$file}) { $Stat{$file} = $^T; } # remove the modules if ($mtime > $Stat{$file}) { if ($Ignore{$key}) { warn "Apache::Reload: Not reloading $key\n"; } else { delete $INC{$key}; push @changed, $key; } } $Stat{$file} = $mtime; } # reload the modules foreach my $key (@changed) { warn("Reloading $key\n") if $DEBUG; if (my $symref = $UndefFields{$key}) { warn("undeffing fields\n") if $DEBUG; no strict 'refs'; undef %{$symref}; } require $key; warn("Apache::Reload: process $$ reloading $key\n") if $DEBUG; } return 1; } 1; __END__ =head1 NAME Apache::Reload - Reload changed modules =head1 SYNOPSIS In httpd.conf: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off Then your module: package My::Apache::Module; use Apache::Reload; sub handler { ... } 1; =head1 DESCRIPTION This module is two things. First it is an adaptation of Randal Schwartz's Stonehenge::Reload module that attempts to be a little more intuitive and makes the usage easier. Stonehenge::Reload was written by Randal to make specific modules reload themselves when they changed. Unlike Apache::StatINC, Stonehenge::Reload only checked the change time of modules that registered themselves with Stonehenge::Reload, thus reducing stat() calls. Apache::Reload also offers the exact same functionality as Apache::StatINC, and is thus designed to be a drop-in replacement. Apache::Reload only checks modules that register themselves with Apache::Reload if you explicitly turn off the StatINC emulation method (see below). Like Apache::StatINC, Apache::Reload must be installed as an Init Handler. =head2 StatINC Replacement To use as a StatINC replacement, simply add the following configuration to your httpd.conf: PerlInitHandler Apache::Reload =head2 Register Modules Implicitly To only reload modules that have registered with Apache::Reload, add the following to the httpd.conf: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off # ReloadAll defaults to On Then any modules with the line: use Apache::Reload; Will be reloaded when they change. =head2 Register Modules Explicitly You can also register modules explicitly in your httpd.conf file that you want to be reloaded on change: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test" Note that these are split on whitespace, but the module list B be in quotes, otherwise Apache tries to parse the parameter list. =head2 Un-Register Modules Explicitly If ReloadAll is set to On, then you can explicity force a module not to be reloaded with no Apache::Reload; A warning will appear in the error log that the file has changed, but will not be reloaded =head2 Special "Touch" File You can also set a file that you can touch() that causes the reloads to be performed. If you set this, and don't touch() the file, the reloads don't happen. This can be a great boon in a live environment: PerlSetVar ReloadTouchFile /tmp/reload_modules Now when you're happy with your changes, simply go to the command line and type: touch /tmp/reload_modules And your modules will be magically reloaded on the next request. This option works in both StatINC emulation mode and the registered modules mode. =head1 PSUEDOHASHES The short summary of this is: Don't use psuedohashes. Use an array with constant indexes. Its faster in the general case, its more guaranteed, and generally, it works. The long summary is that I've done some work to get this working with modules that use psuedo hashes, but its still broken in the case of a single module that contains multiple packages that all use psuedohashes. So don't do that. =head1 AUTHOR Matt Sergeant, matt@sergeant.org =head1 MAINTAINERS the mod_perl developers, dev@perl.apache.org =head1 SEE ALSO Apache::StatINC, Stonehenge::Reload =cut mod_perl-2.0.9/Apache-Reload/lib/Apache2/0000755000104000010010000000000012540623175020367 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/lib/Apache2/Reload.pm0000644000104000010010000004350012540623175022135 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::Reload; use strict; use warnings FATAL => 'all'; our $VERSION = '0.13'; use Apache2::Const -compile => qw(OK); use Apache2::Connection; use Apache2::ServerUtil; use Apache2::RequestUtil; use ModPerl::Util (); use vars qw(%INCS %Stat $TouchTime); %Stat = ($INC{"Apache2/Reload.pm"} => time); $TouchTime = time; sub import { my $class = shift; my ($package, $file) = (caller)[0,1]; $class->register_module($package, $file); } sub package_to_module { my $package = shift; $package =~ s/::/\//g; $package .= ".pm"; return $package; } sub module_to_package { my $module = shift; $module =~ s/\//::/g; $module =~ s/\.pm$//g; return $module; } sub register_module { my ($class, $package, $file) = @_; my $module = package_to_module($package); if ($file) { $INCS{$module} = $file; } else { $file = $INC{$module}; return unless $file; $INCS{$module} = $file; } } sub unregister_module { my ($class, $package) = @_; my $module = package_to_module($package); delete $INCS{$module}; } # the first argument is: # $c if invoked as 'PerlPreConnectionHandler' # $r if invoked as 'PerlInitHandler' sub handler { my $o = shift; $o = $o->base_server if ref($o) eq 'Apache2::Connection'; my $DEBUG = ref($o) && (lc($o->dir_config("ReloadDebug") || '') eq 'on'); my $ReloadByModuleName = ref($o) && (lc($o->dir_config("ReloadByModuleName") || '') eq 'on'); my $TouchFile = ref($o) && $o->dir_config("ReloadTouchFile"); my $ConstantRedefineWarnings = ref($o) && (lc($o->dir_config("ReloadConstantRedefineWarnings") || '') eq 'off') ? 0 : 1; my $TouchModules; if ($TouchFile) { warn "Checking mtime of $TouchFile\n" if $DEBUG; my $touch_mtime = (stat $TouchFile)[9] || return Apache2::Const::OK; return Apache2::Const::OK unless $touch_mtime > $TouchTime; $TouchTime = $touch_mtime; open my $fh, $TouchFile or die "Can't open '$TouchFile': $!"; $TouchModules = <$fh>; chomp $TouchModules if $TouchModules; } if (ref($o) && (lc($o->dir_config("ReloadAll") || 'on') eq 'on')) { *Apache2::Reload::INCS = \%INC; } else { *Apache2::Reload::INCS = \%INCS; my $ExtraList = $TouchModules || (ref($o) && $o->dir_config("ReloadModules")) || ''; my @extra = split /\s+/, $ExtraList; foreach (@extra) { if (/(.*)::\*$/) { my $prefix = $1; $prefix =~ s/::/\//g; foreach my $match (keys %INC) { if ($match =~ /^\Q$prefix\E/) { $Apache2::Reload::INCS{$match} = $INC{$match}; } } } else { Apache2::Reload->register_module($_); } } } my $ReloadDirs = ref($o) && $o->dir_config("ReloadDirectories"); my @watch_dirs = split(/\s+/, $ReloadDirs||''); my @changed; foreach my $key (sort { $a cmp $b } keys %Apache2::Reload::INCS) { my $file = $Apache2::Reload::INCS{$key}; next unless defined $file; next if ref $file; next if @watch_dirs && !grep { $file =~ /^$_/ } @watch_dirs; warn "Apache2::Reload: Checking mtime of $key\n" if $DEBUG; my $mtime = (stat $file)[9]; unless (defined($mtime) && $mtime) { for (@INC) { $mtime = (stat "$_/$file")[9]; last if defined($mtime) && $mtime; } } warn("Apache2::Reload: Can't locate $file\n"), next unless defined $mtime and $mtime; unless (defined $Stat{$file}) { $Stat{$file} = $^T; } if ($mtime > $Stat{$file}) { push @changed, [$key, $file]; } $Stat{$file} = $mtime; } #First, let's unload all changed modules foreach my $change (@changed) { my ($module, $file) = @$change; my $package = module_to_package($module); ModPerl::Util::unload_package($package); } #Then, let's reload them all, so that module dependencies can satisfy #themselves in the correct order. foreach my $change (@changed) { my ($module, $file) = @$change; my $name = $ReloadByModuleName ? $module : $file; require $name; if ($DEBUG) { my $package = module_to_package($module); warn sprintf("Apache2::Reload: process %d reloading %s from %s\n", $$, $package, $name); } } return Apache2::Const::OK; } 1; __END__ =head1 NAME Apache2::Reload - Reload Perl Modules when Changed on Disk =head1 Synopsis # Monitor and reload all modules in %INC: # httpd.conf: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload # when working with protocols and connection filters # PerlPreConnectionHandler Apache2::Reload # Reload groups of modules: # httpd.conf: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache2::*" #PerlSetVar ReloadDebug On #PerlSetVar ReloadByModuleName On # Reload a single module from within itself: package My::Apache2::Module; use Apache2::Reload; sub handler { ... } 1; =head1 Description C reloads modules that change on the disk. When Perl pulls a file via C, it stores the filename in the global hash C<%INC>. The next time Perl tries to C the same file, it sees the file in C<%INC> and does not reload from disk. This module's handler can be configured to iterate over the modules in C<%INC> and reload those that have changed on disk or only specific modules that have registered themselves with C. It can also do the check for modified modules, when a special touch-file has been modified. Require-hooks, i.e., entries in %INC which are references, are ignored. The hook should modify %INC itself, adding the path to the module file, for it to be reloaded. C inspects and reloads the B associated with a given module. Changes to @INC are not recognized, as it is the file which is being re-required, not the module name. In version 0.10 and earlier the B, not the file, is re-required. Meaning it operated on the the current context of @INC. If you still want this behavior set this environment variable in I: PerlSetVar ReloadByModuleName On This means, when called as a C, C will not see C<@INC> paths added or removed by C scripts, as the value of C<@INC> is saved on server startup and restored to that value after each request. In other words, if you want C to work with modules that live in custom C<@INC> paths, you should modify C<@INC> when the server is started. Besides, C<'use lib'> in the startup script, you can also set the C variable in the httpd's environment to include any non-standard 'lib' directories that you choose. For example, to accomplish that you can include a line: PERL5LIB=/home/httpd/perl/extra; export PERL5LIB in the script that starts Apache. Alternatively, you can set this environment variable in I: PerlSetEnv PERL5LIB /home/httpd/perl/extra =head2 Monitor All Modules in C<%INC> To monitor and reload all modules in C<%INC> at the beginning of request's processing, simply add the following configuration to your I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload When working with connection filters and protocol modules C should be invoked in the pre_connection stage: PerlPreConnectionHandler Apache2::Reload See also the discussion on C>. =head2 Register Modules Implicitly To only reload modules that have registered with C, add the following to the I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off # ReloadAll defaults to On Then any modules with the line: use Apache2::Reload; Will be reloaded when they change. =head2 Register Modules Explicitly You can also register modules explicitly in your I file that you want to be reloaded on change: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test" Note that these are split on whitespace, but the module list B be in quotes, otherwise Apache tries to parse the parameter list. The C<*> wild character can be used to register groups of files under the same namespace. For example the setting: PerlSetVar ReloadModules "ModPerl::* Apache2::*" will monitor all modules under the namespaces C and C. =head2 Monitor Only Certain Sub Directories To reload modules only in certain directories (and their subdirectories) add the following to the I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2" You can further narrow the list of modules to be reloaded from the chosen directories with C as in: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2" PerlSetVar ReloadAll Off PerlSetVar ReloadModules "MyApache2::*" In this configuration example only modules from the namespace C found in the directories I and I (and their subdirectories) will be reloaded. =head2 Special "Touch" File You can also declare a file, which when gets Ced, causes the reloads to be performed. For example if you set: PerlSetVar ReloadTouchFile /tmp/reload_modules and don't C the file I, the reloads won't happen until you go to the command line and type: % touch /tmp/reload_modules When you do that, the modules that have been changed, will be magically reloaded on the next request. This option works with any mode described before. =head2 Unregistering a module In some cases, it might be necessary to explicitly stop reloading a module. Apache2::Reload->unregister_module('Some::Module'); But be carefull, since unregistering a module in this way will only do so for the current interpreter. This feature should be used with care. =head1 Performance Issues This module is perfectly suited for a development environment. Though it's possible that you would like to use it in a production environment, since with C you don't have to restart the server in order to reload changed modules during software updates. Though this convenience comes at a price: =over =item * If the "touch" file feature is used, C has to stat(2) the touch file on each request, which adds a slight but most likely insignificant overhead to response times. Otherwise C will stat(2) each registered module or even worse--all modules in C<%INC>, which will significantly slow everything down. =item * Once the child process reloads the modules, the memory used by these modules is not shared with the parent process anymore. Therefore the memory consumption may grow significantly. =back Therefore doing a full server stop and restart is probably a better solution. =head1 Debug If you aren't sure whether the modules that are supposed to be reloaded, are actually getting reloaded, turn the debug mode on: PerlSetVar ReloadDebug On =head1 Caveats =head2 Problems With Reloading Modules Which Do Not Declare Their Package Name If you modify modules, which don't declare their C, and rely on C to reload them, you may encounter problems: i.e., it'll appear as if the module wasn't reloaded when in fact it was. This happens because when C Cs such a module all the global symbols end up in the C namespace! So the module does get reloaded and you see the compile time errors if there are any, but the symbols don't get imported to the right namespace. Therefore the old version of the code is running. =head2 Failing to Find a File to Reload C uses C<%INC> to find the files on the filesystem. If an entry for a certain filepath in C<%INC> is relative, C will use C<@INC> to try to resolve that relative path. Now remember that mod_perl freezes the value of C<@INC> at the server startup, and you can modify it only for the duration of one request when you need to load some module which is not in on of the C<@INC> directories. So a module gets loaded, and registered in C<%INC> with a relative path. Now when C tries to find that module to check whether it has been modified, it can't find since its directory is not in C<@INC>. So C will silently skip that module. You can enable the C mode to see what C does behind the scenes. =head2 Problems with Scripts Running with Registry Handlers that Cache the Code The following problem is relevant only to registry handlers that cache the compiled script. For example it concerns C> but not C>. =head3 The Problem Let's say that there is a module C: #file:My/Utils.pm #---------------- package My::Utils; BEGIN { warn __PACKAGE__ , " was reloaded\n" } use base qw(Exporter); @EXPORT = qw(colour); sub colour { "white" } 1; And a registry script F: #file:test.pl #------------ use My::Utils; print "Content-type: text/plain\n\n"; print "the color is " . colour(); Assuming that the server is running in a single mode, we request the script for the first time and we get the response: the color is white Now we change F: - sub colour { "white" } + sub colour { "red" } And issue the request again. C does its job and we can see that C was reloaded (look in the I file). However the script still returns: the color is white =head3 The Explanation Even though F was reloaded, C's cached code won't run 'C' again (since it happens only once, i.e. during the compile time). Therefore the script doesn't know that the subroutine reference has been changed. This is easy to verify. Let's change the script to be: #file:test.pl #------------ use My::Utils; print "Content-type: text/plain\n\n"; my $sub_int = \&colour; my $sub_ext = \&My::Utils::colour; print "int $sub_int\n"; print "ext $sub_ext\n"; Issue a request, you will see something similar to: int CODE(0x8510af8) ext CODE(0x8510af8) As you can see both point to the same CODE reference (meaning that it's the same symbol). After modifying F again: - sub colour { "red" } + sub colour { "blue" } and calling the script on the secondnd time, we get: int CODE(0x8510af8) ext CODE(0x851112c) You can see that the internal CODE reference is not the same as the external one. =head3 The Solution There are two solutions to this problem: Solution 1: replace C with an explicit C + C. - use My::Utils; + require My::Utils; My::Utils->import(); now the changed functions will be reimported on every request. Solution 2: remember to touch the script itself every time you change the module that it requires. =head1 Threaded MPM and Multiple Perl Interpreters If you use C with a threaded MPM and multiple Perl interpreters, the modules will be reloaded by each interpreter as they are used, not every interpreters at once. Similar to mod_perl 1.0 where each child has its own Perl interpreter, the modules are reloaded as each child is hit with a request. If a module is loaded at startup, the syntax tree of each subroutine is shared between interpreters (big win), but each subroutine has its own padlist (where lexical my variables are stored). Once C reloads a module, this sharing goes away and each Perl interpreter will have its own copy of the syntax tree for the reloaded subroutines. =head1 Pseudo-hashes The short summary of this is: Don't use pseudo-hashes. They are deprecated since Perl 5.8 and are removed in 5.9. Use an array with constant indexes. Its faster in the general case, its more guaranteed, and generally, it works. The long summary is that some work has been done to get this module working with modules that use pseudo-hashes, but it's still broken in the case of a single module that contains multiple packages that all use pseudo-hashes. So don't do that. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors Matt Sergeant, matt@sergeant.org Stas Bekman (porting to mod_perl 2.0) A few concepts borrowed from C by Randal Schwartz and C (mod_perl 1.x) by Doug MacEachern and Ask Bjoern Hansen. =head1 MAINTAINERS the mod_perl developers, dev@perl.apache.org =cut mod_perl-2.0.9/Apache-Reload/LICENSE0000644000177200010010000002613612540623175015472 0ustar SteveNone Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mod_perl-2.0.9/Apache-Reload/Makefile.PL0000644000104000010010000001726212540623175020340 0ustar AdministratorsNoneuse strict; use lib qw(lib); use Config; my %prereqs = (); my %mp2 = ( mod_perl2 => 1.99022 ); my %mp1 = ( mod_perl => 0 ); my $at_min_ver = 1.34; my $mp_gen; # MOD_PERL_2_BUILD is set from building from mod_perl Makefile.PL which should # also set MP_APXS if ($ENV{MOD_PERL_2_BUILD}) { push @ARGV, "-apxs", $ENV{MP_APXS}; my $mp_gen = satisfy_mp_generation(2); } else { $mp_gen = satisfy_mp_generation(); } %prereqs = ($mp_gen == 1 ? %mp1 : %mp2); my $HAS_APACHE_TEST = check_for_apache_test(); my $VERSION; set_version(); my %common_opts = ( VERSION => $VERSION, PREREQ_PM => \%prereqs, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', PREOP => 'find $(DISTVNAME) -type d -print|xargs chmod 0755 && ' . 'find $(DISTVNAME) -type f -print|xargs chmod 0644', TO_UNIX => 'find $(DISTVNAME) -type f -print|xargs dos2unix' }, clean => { FILES => 't/TEST' }, ); ### MAINTAINER_BUILDING_RELEASE is hack ### for the Release Manager's use only. ### We will set it so that the resulting ### distribution will be called Apache-Reload-\d+.tar.gz ### and NOT Apache2-Reload-\d+.tar.gz ### This is for historical reasons and consistency if ($mp_gen == 1 || $ENV{MAINTAINER_BUILDING_RELEASE}) { require ExtUtils::MakeMaker; ExtUtils::MakeMaker::WriteMakefile( %common_opts, NAME => "Apache::Reload", ABSTRACT_FROM => 'lib/Apache/Reload.pm', ); } else { require ModPerl::MM; ModPerl::MM::WriteMakefile( %common_opts, NAME => "Apache2::Reload", ABSTRACT_FROM => 'lib/Apache2/Reload.pm', ); } sub check_for_apache_test { return unless eval { require Apache::Test; if ($Apache::Test::VERSION < $at_min_ver) { die "Apache::Test version is " . $Apache::Test::VERSION . ", minimum version required is $at_min_ver" . ", tests will be skipped\n"; } require Apache::TestMM; require Apache::TestRunPerl; 1; }; Apache::TestMM::filter_args(); my %args = @Apache::TestMM::Argv; Apache::TestRunPerl->generate_script(); return 1; } sub set_version { require Apache::Reload; $VERSION = $Apache::Reload::VERSION; my $fh = Symbol::gensym(); open $fh, 'Changes' or die "Can't open Changes: $!"; while (<$fh>) { if(/^=item.*-(dev|rc\d+)/) { $VERSION .= "-$1"; last; } last if /^=item/; } close $fh; } # If a specific generation was passed as an argument, # if satisfied # return the same generation # else # die # else @ARGV and %ENV will be checked for specific orders # if the specification will be found # if satisfied # return the specified generation # else # die # else if any mp generation is found # return it # else # die sub satisfy_mp_generation { my $wanted = shift || wanted_mp_generation(); unless ($wanted == 1 || $wanted == 2) { die "don't know anything about mod_perl generation: $wanted\n" . "currently supporting only generations 1 and 2"; } my $selected = 0; if ($wanted == 1) { require_mod_perl(); if ($mod_perl::VERSION >= 1.99) { # so we don't pick 2.0 version if 1.0 is wanted die "You don't seem to have mod_perl 1.0 installed"; } $selected = 1; } elsif ($wanted == 2) { #warn "Looking for mod_perl 2.0"; require_mod_perl(); if ($mod_perl::VERSION < 2.0) { die "You don't seem to have mod_perl 2.0 installed"; } $selected = 2; } else { require_mod_perl(); $selected = $mod_perl::VERSION >= 1.99 ? 2 : 1; warn "Using $mod_perl::VERSION\n"; } return $selected; } sub require_mod_perl { eval { require mod_perl }; eval { require mod_perl2 } if ($@); die "Can't find mod_perl installed\nThe error was: $@" if $@; } # the function looks at %ENV and Makefile.PL option to figure out # whether a specific mod_perl generation was requested. # It uses the following logic: # via options: # perl Makefile.PL MOD_PERL=2 # or via %ENV: # env MOD_PERL=1 perl Makefile.PL # # return value is: # 1 or 2 if the specification was found (mp 1 and mp 2 respectively) # 0 otherwise sub wanted_mp_generation { # check if we have a command line specification # flag: 0: unknown, 1: mp1, 2: mp2 my $flag = 0; foreach my $key (@ARGV) { if ($key =~ /^MOD_PERL=(\d)$/) { $flag = $1; } } # check %ENV my $env = exists $ENV{MOD_PERL} ? $ENV{MOD_PERL} : 0; # check for contradicting requirements if ($env && $flag && $flag != $env) { die <catdir('..', 'lib'); unshift @INC, $mplib if -e File::Spec->catfile($mplib,'mod_perl2.pm'); my $atlib = File::Spec->catdir('../', 'Apache-Test', 'lib'); unshift @INC, $atlib if -d $atlib; } eval { require mod_perl2 } if ($@); unless ($@) { $wanted = 2; } } else { $wanted = 1; } } return $wanted; } package MY; sub postamble { my $self = shift; my $string = $self->SUPER::postamble; $string .= <<'EOF'; tag : svn copy https://svn.apache.org/repos/asf/perl/Apache-Reload/trunk https://svn.apache.org/repos/asf/perl/Apache-Reload/tags/$(VERSION_SYM) @echo update lib/Apache/Reload.pm VERSION now EOF return $string; } sub test { my $self = shift; eval { require Test::More } or return <Apache::TestMM::test(@_) if $HAS_APACHE_TEST; return <Apache::TestMM::clean(@_) if $HAS_APACHE_TEST; return $self->SUPER::clean(@_); } sub constants { my $self = shift; my $string = $self->MM::constants; # mp2 installs this into INSTALLSITEARCH, so in order to avoid # problems when users forget 'make install UNINST=1', trick MM into # installing pure perl modules to the sitearch location, when this is # not installed as a part of mp2 build if (!$ENV{MOD_PERL_2_BUILD}) { $string .= <<'EOI'; # install into the same location as mod_perl 2.0 INSTALLSITELIB = $(INSTALLSITEARCH) DESTINSTALLSITELIB = $(DESTINSTALLSITEARCH) EOI } $string; } mod_perl-2.0.9/Apache-Reload/MANIFEST0000644000104000010010000000030312540623175017503 0ustar AdministratorsNoneMANIFEST Makefile.PL README LICENSE lib/Apache/Reload.pm lib/Apache2/Reload.pm t/conf/extra.last.conf.in t/all.t t/reload.t t/lib/Apache/TestReload.pm t/lib/Apache2/TestReload.pm RELEASE Changes mod_perl-2.0.9/Apache-Reload/NOTICE0000644000177200010010000000000012540623175015347 0ustar SteveNonemod_perl-2.0.9/Apache-Reload/README0000644000177200010010000000627012540623175015342 0ustar SteveNoneNAME Apache::Reload - Reload changed modules SYNOPSIS In httpd.conf: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off Then your module: package My::Apache::Module; use Apache::Reload; sub handler { ... } 1; DESCRIPTION This module is two things. First it is an adaptation of Randal Schwartz's Stonehenge::Reload module that attempts to be a little more intuitive and makes the usage easier. Stonehenge::Reload was written by Randal to make specific modules reload themselves when they changed. Unlike Apache::StatINC, Stonehenge::Reload only checked the change time of modules that registered themselves with Stonehenge::Reload, thus reducing stat() calls. Apache::Reload also offers the exact same functionality as Apache::StatINC, and is thus designed to be a drop-in replacement. Apache::Reload only checks modules that register themselves with Apache::Reload if you explicitly turn off the StatINC emulation method (see below). Like Apache::StatINC, Apache::Reload must be installed as an Init Handler. StatINC Replacement To use as a StatINC replacement, simply add the following configuration to your httpd.conf: PerlInitHandler Apache::Reload Register Modules Implicitly To only reload modules that have registered with Apache::Reload, add the following to the httpd.conf: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off # ReloadAll defaults to On Then any modules with the line: use Apache::Reload; Will be reloaded when they change. Register Modules Explicitly You can also register modules explicitly in your httpd.conf file that you want to be reloaded on change: PerlInitHandler Apache::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test" Note that these are split on whitespace, but the module list must be in quotes, otherwise Apache tries to parse the parameter list. Special "Touch" File You can also set a file that you can touch() that causes the reloads to be performed. If you set this, and don't touch() the file, the reloads don't happen. This can be a great boon in a live environment: PerlSetVar ReloadTouchFile /tmp/reload_modules Now when you're happy with your changes, simply go to the command line and type: touch /tmp/reload_modules And your modules will be magically reloaded on the next request. This option works in both StatINC emulation mode and the registered modules mode. PSUEDOHASHES The short summary of this is: Don't use psuedohashes. Use an array with constant indexes. Its faster in the general case, its more guaranteed, and generally, it works. The long summary is that I've done some work to get this working with modules that use psuedo hashes, but its still broken in the case of a single module that contains multiple packages that all use psuedohashes. So don't do that. AUTHOR Matt Sergeant, matt@sergeant.org MAINTAINERS the mod_perl developers, dev@perl.apache.org SEE ALSO Apache::StatINC, Stonehenge::Reload mod_perl-2.0.9/Apache-Reload/RELEASE0000644000104000010010000000562312540623175017367 0ustar AdministratorsNoneInstructions for Apache-Reload Release Manager 0. Ask the PMC to verify that you have the appropriate CPAN permissions on dev@perl. If this is your first release, ask someone with APML karma on PAUSE to verify you have the appropriate permissions. Likely someone on the PMC can do this. a. login into https://pause.perl.org b. menu click: Select Mailinglist/Action c. choose APML and Change Permissions and click go d. click 3.1 Make somebody else co-maintainer e. choose the modules to give the perms to type the username of the new co-maintainer f. if you happen to know that packages were added this release, make sure you give the correct permissions to them. MAINTAINER_BUILDING_RELEASE=1 perl Makefile.PL 1. 'make disttest' - to make sure nothing is missing from the manifest. Now 'make dist', and test this generated package (not svn) with as many configurations as possible on as many platforms as possible. a. edit ./Changes: - change -dev to -rc\d+ starting with -rc1 b. nuke any preinstalled Apache-Reload libs and run 'make test' c. test that you can 'make install' and then run 'make test' again d. test whether we still 100% OK on systems with no LWP: % APACHE_TEST_PRETEND_NO_LWP=1 make test 2. once confident that the package is good, upload a release candidate to people.apache.org/~username and post 24 hour-ish candidate alert to the various lists o dev/perl.apache.org o modperl/perl.apache.org Subject: [RELEASE CANDIDATE] Apache-Reload 0.13 RC\d+ (or maybe longer to give most people a chance to catch up). no need to tag this package a. if problems are detected during stage 2, repeat stages 1 and 2. 3. when the package has been reported to be good, prepare a new package to be released a. edit ./Changes - remove -rc\d+ - add release date b. rerun: % perl Makefile.PL make sure tag looks right % make -n tag c. commit Changes % svn ci Changes d. tag % make tag e. create the final package % make dist f. test the final package again at least once 4. Upload the package to CPAN 5. Announce the package a. post ... to the modperl, announce lists Subject: [ANNOUNCE] Apache-Reload 0.13 include - MD5 sig (as it comes from CPAN upload announce). - the latest Changes 6. Prepare for the next cycle a. increment version in lib/Apache/Reload.pm and lib/Apache2/Reload.pm also b. edit ./Changes: - start a new item with incremented version + '-dev' =item 0.14-dev c. bump up version numbers in this file to make it easier to do the next release. $ perl -pi -e 's/(\d+)\.(\d+)/join(".", $1, $2+1)/eg' RELEASE (undo the change to the PAUSE menu item number in item 0d. above) d. commit Changes % svn ci -m "start 0.13-dev cycle" Changes RELEASE \ lib/Apache/Reload.pm lib/Apache2/Reload.pm mod_perl-2.0.9/Apache-Reload/t/0000755000104000010010000000000012540623175016621 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/t/all.t0000644000177200010010000000015712540623175015660 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 1, need_module('mod_perl.c'); ok(1);mod_perl-2.0.9/Apache-Reload/t/conf/0000755000104000010010000000000012540623175017546 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/t/conf/extra.last.conf.in0000644000177200010010000000113412540623175021205 0ustar SteveNone PerlModule Apache2::Reload PerlModule Apache2::TestReload PerlModule Apache::Reload PerlModule Apache::TestReload SetHandler perl-script PerlInitHandler Apache2::Reload PerlResponseHandler Apache2::TestReload PerlInitHandler Apache::Reload PerlHandler Apache::TestReload mod_perl-2.0.9/Apache-Reload/t/lib/0000755000104000010010000000000012540623173017365 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/t/lib/Apache/0000755000104000010010000000000012540623175020550 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/t/lib/Apache/TestReload.pm0000644000177200010010000000143612540623175021257 0ustar SteveNonepackage Apache::TestReload; use strict; use warnings FATAL => 'all'; #use ModPerl::Util (); use Apache::Constants qw(:common); my $package = 'Reload::Test'; our $pass = 0; sub handler { my $r = shift; $pass++; $r->send_http_header('text/plain'); if ((defined ($r->args)) && ($r->args eq 'last')) { #Apache2::Reload->unregister_module($package); #ModPerl::Util::unload_package($package); $pass = 0; $r->print("unregistered OK"); return OK; } eval "require $package"; Reload::Test::run($r); return OK; } # This one shouldn't be touched package Reload::Test::SubPackage; sub subpackage { if ($Apache::TestReload::pass == '2') { return 'SUBPACKAGE'; } else { return 'subpackage'; } } 1; mod_perl-2.0.9/Apache-Reload/t/lib/Apache2/0000755000104000010010000000000012540623175020632 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Reload/t/lib/Apache2/TestReload.pm0000644000104000010010000000151312540623175023236 0ustar AdministratorsNonepackage Apache2::TestReload; use strict; use warnings FATAL => 'all'; use ModPerl::Util (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); use Apache2::RequestIO (); my $package = 'Reload::Test'; our $pass = 0; sub handler { my $r = shift; $pass++; if (defined $r->args and $r->args eq 'last') { Apache2::Reload->unregister_module($package); ModPerl::Util::unload_package($package); $pass = 0; $r->print("unregistered OK"); return Apache2::Const::OK; } eval "require $package"; Reload::Test::run($r); return Apache2::Const::OK; } # This one shouldn't be touched package Reload::Test::SubPackage; sub subpackage { if ($Apache2::TestReload::pass == '2') { return 'SUBPACKAGE'; } else { return 'subpackage'; } } 1; mod_perl-2.0.9/Apache-Reload/t/reload.t0000644000177200010010000000273112540623175016356 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile tmpdir); Apache::TestRequest::user_agent(keep_alive => 1); plan tests => 3, need 'HTML::HeadParser'; my $test_file = catfile qw(Reload Test.pm); my $location = '/reload'; my @tests = qw(const prototype simple subpackage); my $header = join '', ; my $initial = <<'EOF'; sub simple { 'simple' } use constant const => 'const'; sub prototype($) { 'prototype' } sub promised; EOF my $modified = <<'EOF'; sub simple { 'SIMPLE' } use constant const => 'CONST'; sub prototype($$) { 'PROTOTYPE' } EOF t_write_test_lib($test_file, $header, $initial); { my $expected = join '', map { "$_:$_\n" } sort @tests; my $received = GET $location; ok t_cmp($received->content, $expected, 'Initial'); } t_write_test_lib($test_file, $header, $modified); { my $expected = join '', map { "$_:" . uc($_) . "\n" } sort @tests; my $received = GET $location; ok t_cmp($received->content, $expected, 'Reload'); } { my $expected = "unregistered OK"; my $received = GET "$location?last"; ok t_cmp($received->content, $expected, 'Unregister'); } __DATA__ package Reload::Test; our @methods = qw(const prototype simple subpackage); sub subpackage { return Reload::Test::SubPackage::subpackage() } sub run { my $r = shift; foreach my $m (sort @methods) { $r->print($m, ':', __PACKAGE__->$m(), "\n"); } } 1; mod_perl-2.0.9/Apache-SizeLimit/0000755000104000010010000000000012540623175017061 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/Changes0000644000104000010010000001025512540623175020357 0ustar AdministratorsNone=head1 NAME Changes - Apache::SizeLimit change logfile =head1 CHANGES =over 6 =item 0.97 2012-04-02 Set the -apxs argument correctly when building from mod_perl. [Steve Hay] =item 0.96 2011-12-21 eval Linux::Smaps->new call when checking for /proc/self/smaps [Christian Ruppert ] Require Apache::Test 1.36 [Fred] Unshared size is now interpreted as RSS - shared instead of VSIZE - shared on Linux [Torsten] Subtest 1 checks that Apache2::SizeLimit->_limits_are_exceeded() returns false without any limits. But if the test runs near the end of the test suite it may very well be that some other test has set a limit. [Torsten] =item 0.95 2011-01-19 Fix erroneous version in Core.pm for 0.94 release. [fred] =item 0.94 2011-01-19 Install Apache::SizeLimit in arch specific location, the same as mod_perl. This prevents problems when A-SL is built outside the mod_perl build tree. [Fred Moyer] =item 0.93 2010-10-02 Add PerlModule and PerlLoadModule doc directives. [Fred Moyer ] Fix overlooked bug where handler expected to be called as a method handler, but was documented to be called like a normal Perl cleanup handler ala 'PerlCleanupHandler Apache2::SizeLimit' [Fred Moyer ] =item 0.92 2010-09-23 Export USE_SMAPS, VERSION, and REQUEST_COUNT to Apache::SizeLimit from Apache::SizeLimit::Core. Call _platform_check_size as a class method to prevent error when USE_SMAPS=0, RT #33303 Reported by: jgoodridge@alum.dartmouth.edu [Fred Moyer ] *********** HEADS UP - SHARED CODE BASE - HEADS UP *********** Apache-SizeLimit has been hybridized. It has been split into 3 packages. 1) Apache::SizeLimit - User API for httpd 1.3.x / mod_perl 1.x 2) Apache2::SizeLimit - User API for httpd 2.x / mod_perl 2.x 3) Apache::SizeLimit::Core - Interal Shared Functionality _NEVER_ use this module directly. [Philip M. Gollucci ] Skip tests on OS X (darwin) due to broken getrusage(3) [Fred Moyer , Philip M. Gollucci ] Added a SUPPORT section to the docs. [Dave Rolsky ] =item 0.91 2007-03-29 Fix Can't call method "child_terminate" on an undefined value By add_cleanup_handler() pass $r to _exit_if_to_big() via shift [David Wheeler ] =item 0.9 2006-07-12 Copied from the mod_perl 1 core for an independent CPAN release. [Philip M. Gollucci ] Added support for using Linux::Smaps (on Linux only, obviously) to get much more accurate shared memory numbers on 2.6.x kernels. Taken from Apache2::SizeLimit. [Dave Rolsky ] Added support for using Linux::Pid to get the parent pid on Linux. This fixes a long-standing bug that caused this module to never actually kill a process when using Perl 5.8.1+ on Linux. [Dave Rolsky ] Added new OO methods for configuring the module, C, C ,and C. [Dave Rolsky ] Added a new method, C. [Dave Rolsky ] Documentation for new API, as well as lots of general work on the docs. [Dave Rolsky ] Much code refactoring. [Dave Rolsky ] Added many tests for both the new and deprecated APIs. [Dave Rolsky ] Deprecated use of globals and the existing C, C, and C functions. [Dave Rolsky ] When calling C, C, and C, only add Apache::SizeLimit as a cleanup handler once, not once for each function call. Taken from Apache2::SizeLimit. [Dave Rolsky ] Fixed calculation of shared memory on BSD. [Philip M. Gollucci ] Removed support for OSX, because testing shows that BSD::Resource is not working on that platform. [Dave Rolsky ] =item 0.05 mp2 core / not released =item 0.04 not released =item 0.03 not released =item 0.02 not released =item 0.01 2006-06-23 original version; created by h2xs 1.23 with options -X -A -n Apache-SizeLimit [Philip M. Gollucci ] =back mod_perl-2.0.9/Apache-SizeLimit/INSTALL0000644000177200010010000000055012540623175016211 0ustar SteveNoneto install this module simply follow the canonical procedure for installing any perl module $ tar zxvf Apache-SizeLimit-0.XX.tar.gz $ cd Apache-SizeLimit-0.XX $ perl Makefile.PL For static mod_perl use -httpd /path/to/httpd For dynamic mod_perl use -apxs /path/to/apxs $ make $ sudo make install for further directions, see the README. mod_perl-2.0.9/Apache-SizeLimit/lib/0000755000104000010010000000000012540623174017626 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/lib/Apache/0000755000104000010010000000000012540623175021010 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/lib/Apache/SizeLimit/0000755000104000010010000000000012540623175022721 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/lib/Apache/SizeLimit/Core.pm0000644000104000010010000001570112540623175024153 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package Apache::SizeLimit::Core; use strict; use warnings; use Config; use Exporter; use vars qw( $VERSION $REQUEST_COUNT $USE_SMAPS $MAX_PROCESS_SIZE $MAX_UNSHARED_SIZE $MIN_SHARE_SIZE $CHECK_EVERY_N_REQUESTS $START_TIME @ISA @EXPORT_OK ); @ISA = qw(Exporter); @EXPORT_OK = qw( $VERSION $REQUEST_COUNT $USE_SMAPS $MAX_PROCESS_SIZE $MAX_UNSHARED_SIZE $MIN_SHARE_SIZE $CHECK_EVERY_N_REQUESTS $START_TIME ); $VERSION = '0.97'; $REQUEST_COUNT = 1; use constant IS_WIN32 => $Config{'osname'} eq 'MSWin32' ? 1 : 0; sub set_max_process_size { my $class = shift; $MAX_PROCESS_SIZE = shift; } sub set_max_unshared_size { my $class = shift; $MAX_UNSHARED_SIZE = shift; } sub set_min_shared_size { my $class = shift; $MIN_SHARE_SIZE = shift; } sub set_check_interval { my $class = shift; $CHECK_EVERY_N_REQUESTS = shift; } sub get_check_interval { return $CHECK_EVERY_N_REQUESTS; } sub set_start_time { $START_TIME ||= time(); } sub get_start_time { return $START_TIME; } sub get_and_pinc_request_count { return $REQUEST_COUNT++; } sub get_request_count { return $REQUEST_COUNT++; } # REVIEW - Why doesn't this use $r->warn or some other # Apache/Apache::Log API? sub _error_log { my $class = shift; print STDERR "[", scalar( localtime(time) ), "] ($$) $class @_\n"; } sub _limits_are_exceeded { my $class = shift; my ($size, $share, $unshared) = $class->_check_size(); return 1 if $MAX_PROCESS_SIZE && $size > $MAX_PROCESS_SIZE; return 0 unless $share; return 1 if $MIN_SHARE_SIZE && $share < $MIN_SHARE_SIZE; return 1 if $MAX_UNSHARED_SIZE && $unshared > $MAX_UNSHARED_SIZE; return 0; } sub _check_size { my $class = shift; my ($size, $share, $unshared) = $class->_platform_check_size(); return ($size, $share, defined $unshared ? $unshared : $size - $share); } sub _load { my $mod = shift; eval "require $mod" or die "You must install $mod for Apache::SizeLimit to work on your" . " platform."; } BEGIN { my ($major,$minor) = split(/\./, $Config{'osvers'}); if ($Config{'osname'} eq 'solaris' && (($major > 2) || ($major == 2 && $minor >= 6))) { *_platform_check_size = \&_solaris_2_6_size_check; *_platform_getppid = \&_perl_getppid; } elsif ($Config{'osname'} eq 'linux') { _load('Linux::Pid'); *_platform_getppid = \&_linux_getppid; if (eval { require Linux::Smaps && Linux::Smaps->new($$) }) { $USE_SMAPS = 1; *_platform_check_size = \&_linux_smaps_size_check; } else { $USE_SMAPS = 0; *_platform_check_size = \&_linux_size_check; } } elsif ($Config{'osname'} =~ /(?:bsd|aix)/i) { # on OSX, getrusage() is returning 0 for proc & shared size. _load('BSD::Resource'); *_platform_check_size = \&_bsd_size_check; *_platform_getppid = \&_perl_getppid; } # elsif (IS_WIN32i && $mod_perl::VERSION < 1.99) { # _load('Win32::API'); # # *_platform_check_size = \&_win32_size_check; # *_platform_getppid = \&_perl_getppid; # } else { die "Apache::SizeLimit is not implemented on your platform."; } } sub _linux_smaps_size_check { my $class = shift; return $class->_linux_size_check() unless $USE_SMAPS; my $s = Linux::Smaps->new($$)->all; return ($s->size, $s->shared_clean + $s->shared_dirty, $s->private_clean + $s->private_dirty); } sub _linux_size_check { my $class = shift; my ($size, $share) = (0, 0); if (open my $fh, '<', '/proc/self/statm') { ($size, $share) = (split /\s/, scalar <$fh>)[0,2]; close $fh; } else { $class->_error_log("Fatal Error: couldn't access /proc/self/status"); } # linux on intel x86 has 4KB page size... return ($size * 4, $share * 4); } sub _solaris_2_6_size_check { my $class = shift; my $size = -s "/proc/self/as" or $class->_error_log("Fatal Error: /proc/self/as doesn't exist or is empty"); $size = int($size / 1024); # return 0 for share, to avoid undef warnings return ($size, 0); } # rss is in KB but ixrss is in BYTES. # This is true on at least FreeBSD, OpenBSD, & NetBSD sub _bsd_size_check { my @results = BSD::Resource::getrusage(); my $max_rss = $results[2]; my $max_ixrss = int ( $results[3] / 1024 ); return ($max_rss, $max_ixrss); } sub _win32_size_check { my $class = shift; # get handle on current process my $get_current_process = Win32::API->new( 'kernel32', 'get_current_process', [], 'I' ); my $proc = $get_current_process->Call(); # memory usage is bundled up in ProcessMemoryCounters structure # populated by GetProcessMemoryInfo() win32 call my $DWORD = 'B32'; # 32 bits my $SIZE_T = 'I'; # unsigned integer # build a buffer structure to populate my $pmem_struct = "$DWORD" x 2 . "$SIZE_T" x 8; my $mem_counters = pack( $pmem_struct, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); # GetProcessMemoryInfo is in "psapi.dll" my $get_process_memory_info = new Win32::API( 'psapi', 'GetProcessMemoryInfo', [ 'I', 'P', 'I' ], 'I' ); my $bool = $get_process_memory_info->Call( $proc, $mem_counters, length $mem_counters, ); # unpack ProcessMemoryCounters structure my $peak_working_set_size = (unpack($pmem_struct, $mem_counters))[2]; # only care about peak working set size my $size = int($peak_working_set_size / 1024); return ($size, 0); } sub _perl_getppid { return getppid } sub _linux_getppid { return Linux::Pid::getppid() } 1; __END__ =head1 NAME Apache::SizeLimit::Core - Because size does matter. =head1 SYNOPSIS DO NOT USE ME DIRECTLY See Apache::SizeLimit for mod_perl 1.x See Apache2::SizeLimit for mod_perl 2.x =cut mod_perl-2.0.9/Apache-SizeLimit/lib/Apache/SizeLimit.pm0000644000104000010010000004011612540623175023261 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package Apache::SizeLimit; use strict; use warnings; use Config; use Apache::Constants (); use constant IS_WIN32 => $Config{'osname'} eq 'MSWin32' ? 1 : 0; use vars qw($VERSION); $VERSION = '0.97'; use Apache::SizeLimit::Core qw( $MAX_PROCESS_SIZE $MAX_UNSHARED_SIZE $MIN_SHARE_SIZE $CHECK_EVERY_N_REQUESTS $START_TIME $USE_SMAPS $VERSION $REQUEST_COUNT ); use vars qw(@ISA); @ISA = qw(Apache::SizeLimit::Core); __PACKAGE__->set_check_interval(1); sub handler { my $r = shift || Apache->request; return Apache::Constants::DECLINED() unless $r->is_main(); # we want to operate in a cleanup handler if ($r->current_callback eq 'PerlCleanupHandler') { return __PACKAGE__->_exit_if_too_big($r); } else { __PACKAGE__->add_cleanup_handler($r); } return Apache::Constants::DECLINED(); } sub add_cleanup_handler { my $class = shift; my $r = shift || Apache->request; return unless $r; return if $r->pnotes('size_limit_cleanup'); # This used to use $r->post_connection but there's no good way to # test it, since apparently it does not push a handler onto the # PerlCleanupHandler phase. That means that there's no way to use # $r->get_handlers() to check the results of calling this method. $r->push_handlers( 'PerlCleanupHandler', sub { $class->_exit_if_too_big(shift) } ); $r->pnotes(size_limit_cleanup => 1); } sub _exit_if_too_big { my $class = shift; my $r = shift; return Apache::Constants::DECLINED() if ($class->get_check_interval() && ($class->get_and_pinc_request_count % $class->get_check_interval())); $class->set_start_time(); if ($class->_limits_are_exceeded()) { my ($size, $share, $unshared) = $class->_check_size(); if (IS_WIN32 || $class->_platform_getppid() > 1) { # this is a child httpd my $e = time() - $class->get_start_time(); my $msg = "httpd process too big, exiting at SIZE=$size KB"; $msg .= " SHARE=$share KB UNSHARED=$unshared" if $share; $msg .= " REQUESTS=" . $class->get_request_count(); $msg .= " LIFETIME=$e seconds"; $class->_error_log($msg); if (IS_WIN32) { # child_terminate() is disabled in win32 Apache CORE::exit(-2); } else { $r->child_terminate(); } } else { # this is the main httpd, whose parent is init? my $msg = "main process too big, SIZE=$size KB "; $msg .= " SHARE=$share KB" if ($share); $class->_error_log($msg); } } return Apache::Constants::OK(); } { # Deprecated APIs sub setmax { my $class = __PACKAGE__; $class->set_max_process_size(shift); $class->add_cleanup_handler(); } sub setmin { my $class = __PACKAGE__; $class->set_min_shared_size(shift); $class->add_cleanup_handler(); } sub setmax_unshared { my $class = __PACKAGE__; $class->set_max_unshared_size(shift); $class->add_cleanup_handler(); } } 1; __END__ =head1 NAME Apache::SizeLimit - Because size does matter. =head1 SYNOPSIS PerlModule Apache::SizeLimit Apache::SizeLimit->set_max_process_size(150_000); # Max size in KB Apache::SizeLimit->set_min_shared_size(10_000); # Min share in KB Apache::SizeLimit->set_max_unshared_size(120_000); # Max unshared size in KB PerlCleanupHandler Apache::SizeLimit =head1 DESCRIPTION ******************************** NOIICE ******************* This version is only for httpd 1.3.x and mod_perl 1.x series. For httpd 2.x / mod_perl 2.x Apache2::SizeLimit documentation please read the perldoc in lib/Apache2/SizeLimit.pm ******************************** NOTICE ******************* This module allows you to kill off Apache httpd processes if they grow too large. You can make the decision to kill a process based on its overall size, by setting a minimum limit on shared memory, or a maximum on unshared memory. You can set limits for each of these sizes, and if any limit is exceeded, the process will be killed. You can also limit the frequency that these sizes are checked so that this module only checks every N requests. This module is highly platform dependent, please read the L section for details. It is possible that this module simply does not support your platform. =head1 API You can set set the size limits from a Perl module or script loaded by Apache by calling the appropriate class method on C: =over 4 =item * Apache::SizeLimit->set_max_process_size($size) This sets the maximum size of the process, including both shared and unshared memory. =item * Apache::SizeLimit->set_max_unshared_size($size) This sets the maximum amount of I memory the process can use. =item * Apache::SizeLimit->set_min_shared_size($size) This sets the minimum amount of shared memory the process must have. =back The two methods related to shared memory size are effectively a no-op if the module cannot determine the shared memory size for your platform. See L for more details. =head2 Running the handler() There are several ways to make this module actually run the code to kill a process. The simplest is to make C a C in your Apache config: PerlCleanupHandler Apache::SizeLimit This will ensure that C<< Apache::SizeLimit->handler() >> is run for all requests. If you want to combine this module with a cleanup handler of your own, make sure that C is the last handler run: PerlCleanupHandler Apache::SizeLimit My::CleanupHandler Remember, mod_perl will run stacked handlers from right to left, as they're defined in your configuration. If you have some cleanup code you need to run, but stacked handlers aren't appropriate for your setup, you can also explicitly call the C<< Apache::SizeLimit->handler() >> function from your own cleanup handler: package My::CleanupHandler sub handler { my $r = shift; # Causes File::Temp to remove any temp dirs created during the # request File::Temp::cleanup(); return Apache::SizeLimit->handler($r); } =over 4 =item * Apache::SizeLimit->add_cleanup_handler($r) You can call this method inside a request to run C's C method for just that request. It's safe to call this method repeatedly -- the cleanup will only be run once per request. =back =head2 Checking Every N Requests Since checking the process size can take a few system calls on some platforms (e.g. linux), you may not want to check the process size for every request. =over 4 =item * Apache::SizeLimit->set_check_interval($interval) Calling this causes C to only check the process size every C<$interval> requests. If you want this to affect all processes, make sure to call this during server startup. =back =head1 SHARED MEMORY OPTIONS In addition to simply checking the total size of a process, this module can factor in how much of the memory used by the process is actually being shared by copy-on-write. If you don't understand how memory is shared in this way, take a look at the mod_perl docs at http://perl.apache.org/docs/. You can take advantage of the shared memory information by setting a minimum shared size and/or a maximum unshared size. Experience on one heavily trafficked mod_perl site showed that setting maximum unshared size and leaving the others unset is the most effective policy. This is because it only kills off processes that are truly using too much physical RAM, allowing most processes to live longer and reducing the process churn rate. =head1 PER-PLATFORM BEHAVIOR This module is highly platform dependent, since finding the size of a process is different for each OS, and some platforms may not be supported. In particular, the limits on minimum shared memory and maximum shared memory are currently only supported on Linux and BSD. If you can contribute support for another OS, patches are very welcome. Currently supported OSes: =head2 linux For linux we read the process size out of F. If you are worried about performance, you can consider using C<< Apache::SizeLimit->set_check_interval() >> to reduce how often this read happens. As of linux 2.6, F does not report the amount of memory shared by the copy-on-write mechanism as shared memory. This means that decisions made based on shared memory as reported by that interface are inherently wrong. However, as of the 2.6.14 release of the kernel, there is F entry for each process. F reports various sizes for each memory segment of a process and allows us to count the amount of shared memory correctly. If C detects a kernel that supports F and the C module is installed it will use that module instead of F. Reading F is expensive compared to F. It must look at each page table entry of a process. Further, on multiprocessor systems the access is synchronized with spinlocks. Again, you might consider using C<< Apache::SizeLimit->set_check_interval() >>. =head3 Copy-on-write and Shared Memory The following example shows the effect of copy-on-write: require Apache::SizeLimit; package X; use strict; use Apache::Constants qw(OK); my $x = "a" x (1024*1024); sub handler { my $r = shift; my ($size, $shared) = $Apache::SizeLimit->_check_size(); $x =~ tr/a/b/; my ($size2, $shared2) = $Apache::SizeLimit->_check_size(); $r->content_type('text/plain'); $r->print("1: size=$size shared=$shared\n"); $r->print("2: size=$size2 shared=$shared2\n"); return OK; } SetHandler modperl PerlResponseHandler X The parent Apache process allocates memory for the string in C<$x>. The C-command then overwrites all "a" with "b" if the handler is called with an argument. This write is done in place, thus, the process size doesn't change. Only C<$x> is not shared anymore by means of copy-on-write between the parent and the child. If F is available curl shows: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13452 shared=7456 2: size=13452 shared=6432 Shared memory has lost 1024 kB. The process' overall size remains unchanged. Without F it says: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13052 shared=3628 2: size=13052 shared=3636 One can see the kernel lies about the shared memory. It simply doesn't count copy-on-write pages as shared. =head2 solaris 2.6 and above For solaris we simply retrieve the size of F, which contains the address-space image of the process, and convert to KB. Shared memory calculations are not supported. NOTE: This is only known to work for solaris 2.6 and above. Evidently the F filesystem has changed between 2.5.1 and 2.6. Can anyone confirm or deny? =head2 BSD (and OSX) Uses C to determine process size. This is pretty efficient (a lot more efficient than reading it from the F fs anyway). According to recent tests on OSX (July, 2006), C simply reports zero for process and shared size on that platform, so OSX is not supported by C. =head2 AIX? Uses C to determine process size. Not sure if the shared memory calculations will work or not. AIX users? =head2 Win32 Uses C to access process memory information. C can be installed under ActiveState perl using the supplied ppm utility. =head2 Everything Else If your platform is not supported, then please send a patch to check the process size. The more portable/efficient/correct the solution the better, of course. =head1 ABOUT THIS MODULE This module was written in response to questions on the mod_perl mailing list on how to tell the httpd process to exit if it gets too big. Actually, there are two big reasons your httpd children will grow. First, your code could have a bug that causes the process to increase in size very quickly. Second, you could just be doing operations that require a lot of memory for each request. Since Perl does not give memory back to the system after using it, the process size can grow quite large. This module will not really help you with the first problem. For that you should probably look into C or some other means of setting a limit on the data size of your program. BSD-ish systems have C, which will kill your memory gobbling processes. However, it is a little violent, terminating your process in mid-request. This module attempts to solve the second situation, where your process slowly grows over time. It checks memory usage after every request, and if it exceeds a threshold, exits gracefully. By using this module, you should be able to discontinue using the Apache configuration directive B, although for some folks, using both in combination does the job. =head1 DEPRECATED APIS Previous versions of this module documented three globals for defining memory size limits: =over 4 =item * $Apache::SizeLimit::MAX_PROCESS_SIZE =item * $Apache::SizeLimit::MIN_SHARE_SIZE =item * $Apache::SizeLimit::MAX_UNSHARED_SIZE =item * $Apache::SizeLimit::CHECK_EVERY_N_REQUESTS =item * $Apache::SizeLimit::USE_SMAPS =back Direct use of these globals is deprecated, but will continue to work for the foreseeable future. It also documented three functions for use from registry scripts: =over 4 =item * Apache::SizeLimit::setmax() =item * Apache::SizeLimit::setmin() =item * Apache::SizeLimit::setmax_unshared() =back Besides setting the appropriate limit, these functions I add a cleanup handler to the current request. =head1 SUPPORT The Apache-SizeLimit project is co-maintained by several developers, who take turns at making CPAN releases. Therefore you may find several CPAN directories containing Apache-SizeLimit releases. The best way to find the latest release is to use http://search.cpan.org/. If you have a question or you want to submit a bug report or make a contribution, please do not email individual authors, but send an email to the modperl perl.apache.org mailing list. This list is moderated, so unless you are subscribed to it, your message will have to be approved first by a moderator. Therefore please allow some time (up to a few days) for your post to propagate to the list. =head1 AUTHOR Doug Bagley , channeling Procrustes. Brian Moseley : Solaris 2.6 support Doug Steinwand and Perrin Harkins : added support for shared memory and additional diagnostic info Matt Phillips and Mohamed Hendawi : Win32 support Dave Rolsky , maintenance and fixes outside of mod_perl tree (0.9+). =cut mod_perl-2.0.9/Apache-SizeLimit/lib/Apache2/0000755000104000010010000000000012540623175021072 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/lib/Apache2/SizeLimit.pm0000644000104000010010000004070612540623175023350 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package Apache2::SizeLimit; use strict; use warnings; use Config; use APR::Pool (); use Apache2::RequestUtil (); use Apache2::MPM (); use Apache2::Const -compile => qw (DECLINED OK); use ModPerl::Util (); die "Apache2::SizeLimit at the moment works only with non-threaded MPMs" if Apache2::MPM->is_threaded(); use constant IS_WIN32 => $Config{'osname'} eq 'MSWin32' ? 1 : 0; # 2.x requires 5.6.x+ so 'our' is okay our $VERSION = '0.97'; use Apache::SizeLimit::Core qw( $MAX_PROCESS_SIZE $MAX_UNSHARED_SIZE $MIN_SHARE_SIZE $CHECK_EVERY_N_REQUESTS $START_TIME $USE_SMAPS $VERSION $REQUEST_COUNT ); our @ISA = qw(Apache::SizeLimit::Core); __PACKAGE__->set_check_interval(1); sub handler { my $r = shift || Apache2::RequestUtil->request(); return Apache2::Const::DECLINED unless $r->is_initial_req(); # we want to operate in a cleanup handler if (ModPerl::Util::current_callback() eq 'PerlCleanupHandler') { return __PACKAGE__->_exit_if_too_big($r); } else { __PACKAGE__->add_cleanup_handler($r); } return Apache2::Const::DECLINED; } sub add_cleanup_handler { my $class = shift; my $r = shift || Apache2::RequestUtil->request(); return unless $r; return if $r->pnotes('size_limit_cleanup'); # This used to use $r->post_connection but there's no good way to # test it, since apparently it does not push a handler onto the # PerlCleanupHandler phase. That means that there's no way to use # $r->get_handlers() to check the results of calling this method. # $r->get_handlers() SEGFAULTS at the moment in 2.x $r->pool->cleanup_register(sub { $class->_exit_if_too_big(shift) }, $r); $r->pnotes(size_limit_cleanup => 1); } sub _exit_if_too_big { my $class = shift; my $r = shift; return Apache2::Const::DECLINED if ($class->get_check_interval() && ($class->get_and_pinc_request_count % $class->get_check_interval())); $class->set_start_time(); if ($class->_limits_are_exceeded()) { my ($size, $share, $unshared) = $class->_check_size(); if (IS_WIN32 || $class->_platform_getppid() > 1) { # this is a child httpd my $e = time() - $class->get_start_time(); my $msg = "httpd process too big, exiting at SIZE=$size KB"; $msg .= " SHARE=$share KB UNSHARED=$unshared" if $share; $msg .= " REQUESTS=" . $class->get_request_count(); $msg .= " LIFETIME=$e seconds"; $class->_error_log($msg); $r->child_terminate(); } else { # this is the main httpd, whose parent is init? my $msg = "main process too big, SIZE=$size KB "; $msg .= " SHARE=$share KB" if ($share); $class->_error_log($msg); } } return Apache2::Const::OK; } { # Deprecated APIs # If you use these, you must set # PerlOptions +GlobalRequest -- we have no $r otherwise # This is differs a from the mp1 series sub setmax { my $class = __PACKAGE__; $class->set_max_process_size(shift); $class->add_cleanup_handler(); } sub setmin { my $class = __PACKAGE__; $class->set_min_shared_size(shift); $class->add_cleanup_handler(); } sub setmax_unshared { my $class = __PACKAGE__; $class->set_max_unshared_size(shift); $class->add_cleanup_handler(); } } 1; __END__ =head1 NAME Apache2::SizeLimit - Because size does matter. =head1 SYNOPSIS PerlLoadModule Apache2::SizeLimit Apache2::SizeLimit->set_max_process_size(150_000); # Max size in KB Apache2::SizeLimit->set_min_shared_size(10_000); # Min share in KB Apache2::SizeLimit->set_max_unshared_size(120_000); # Max unshared size in KB PerlCleanupHandler Apache2::SizeLimit =head1 DESCRIPTION ******************************** NOIICE ******************* This version is only for httpd 2.x and mod_perl 2.x series. For httpd 1.3.x / mod_perl 1.x Apache::SizeLimit documentation please read the perldoc in lib/Apache/SizeLimit.pm ******************************** NOTICE ******************* This module allows you to kill off Apache httpd processes if they grow too large. You can make the decision to kill a process based on its overall size, by setting a minimum limit on shared memory, or a maximum on unshared memory. You can set limits for each of these sizes, and if any limit is exceeded, the process will be killed. You can also limit the frequency that these sizes are checked so that this module only checks every N requests. This module is highly platform dependent, please read the L section for details. It is possible that this module simply does not support your platform. =head1 API You can set set the size limits from a Perl module or script loaded by Apache by calling the appropriate class method on C: =over 4 =item * Apache2::SizeLimit->set_max_process_size($size) This sets the maximum size of the process, including both shared and unshared memory. =item * Apache2::SizeLimit->set_max_unshared_size($size) This sets the maximum amount of I memory the process can use. =item * Apache2::SizeLimit->set_min_shared_size($size) This sets the minimum amount of shared memory the process must have. =back The two methods related to shared memory size are effectively a no-op if the module cannot determine the shared memory size for your platform. See L for more details. =head2 Running the handler() There are several ways to make this module actually run the code to kill a process. The simplest is to make C a C in your Apache config: PerlCleanupHandler Apache2::SizeLimit This will ensure that C<< Apache2::SizeLimit->handler() >> is run for all requests. If you want to combine this module with a cleanup handler of your own, make sure that C is the last handler run: PerlCleanupHandler Apache2::SizeLimit My::CleanupHandler Remember, mod_perl will run stacked handlers from right to left, as they're defined in your configuration. If you have some cleanup code you need to run, but stacked handlers aren't appropriate for your setup, you can also explicitly call the C<< Apache2::SizeLimit->handler() >> function from your own cleanup handler: package My::CleanupHandler sub handler { my $r = shift; # Causes File::Temp to remove any temp dirs created during the # request File::Temp::cleanup(); return Apache2::SizeLimit->handler($r); } =over 4 =item * Apache2::SizeLimit->add_cleanup_handler($r) You can call this method inside a request to run C's C method for just that request. It's safe to call this method repeatedly -- the cleanup will only be run once per request. =back =head2 Checking Every N Requests Since checking the process size can take a few system calls on some platforms (e.g. linux), you may not want to check the process size for every request. =over 4 =item * Apache2::SizeLimit->set_check_interval($interval) Calling this causes C to only check the process size every C<$interval> requests. If you want this to affect all processes, make sure to call this during server startup. =back =head1 SHARED MEMORY OPTIONS In addition to simply checking the total size of a process, this module can factor in how much of the memory used by the process is actually being shared by copy-on-write. If you don't understand how memory is shared in this way, take a look at the mod_perl docs at http://perl.apache.org/docs/. You can take advantage of the shared memory information by setting a minimum shared size and/or a maximum unshared size. Experience on one heavily trafficked mod_perl site showed that setting maximum unshared size and leaving the others unset is the most effective policy. This is because it only kills off processes that are truly using too much physical RAM, allowing most processes to live longer and reducing the process churn rate. =head1 PER-PLATFORM BEHAVIOR This module is highly platform dependent, since finding the size of a process is different for each OS, and some platforms may not be supported. In particular, the limits on minimum shared memory and maximum shared memory are currently only supported on Linux and BSD. If you can contribute support for another OS, patches are very welcome. Currently supported OSes: =head2 linux For linux we read the process size out of F. If you are worried about performance, you can consider using C<< Apache2::SizeLimit->set_check_interval() >> to reduce how often this read happens. As of linux 2.6, F does not report the amount of memory shared by the copy-on-write mechanism as shared memory. This means that decisions made based on shared memory as reported by that interface are inherently wrong. However, as of the 2.6.14 release of the kernel, there is F entry for each process. F reports various sizes for each memory segment of a process and allows us to count the amount of shared memory correctly. If C detects a kernel that supports F and the C module is installed it will use that module instead of F. Reading F is expensive compared to F. It must look at each page table entry of a process. Further, on multiprocessor systems the access is synchronized with spinlocks. Again, you might consider using C<< Apache2::SizeLimit->set_check_interval() >>. =head3 Copy-on-write and Shared Memory The following example shows the effect of copy-on-write: require Apache2::SizeLimit; package X; use strict; use Apache2::Const -compile => qw(OK); my $x = "a" x (1024*1024); sub handler { my $r = shift; my ($size, $shared) = $Apache2::SizeLimit->_check_size(); $x =~ tr/a/b/; my ($size2, $shared2) = $Apache2::SizeLimit->_check_size(); $r->content_type('text/plain'); $r->print("1: size=$size shared=$shared\n"); $r->print("2: size=$size2 shared=$shared2\n"); return OK; } SetHandler modperl PerlResponseHandler X The parent Apache process allocates memory for the string in C<$x>. The C-command then overwrites all "a" with "b" if the handler is called with an argument. This write is done in place, thus, the process size doesn't change. Only C<$x> is not shared anymore by means of copy-on-write between the parent and the child. If F is available curl shows: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13452 shared=7456 2: size=13452 shared=6432 Shared memory has lost 1024 kB. The process' overall size remains unchanged. Without F it says: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13052 shared=3628 2: size=13052 shared=3636 One can see the kernel lies about the shared memory. It simply doesn't count copy-on-write pages as shared. =head2 solaris 2.6 and above For solaris we simply retrieve the size of F, which contains the address-space image of the process, and convert to KB. Shared memory calculations are not supported. NOTE: This is only known to work for solaris 2.6 and above. Evidently the F filesystem has changed between 2.5.1 and 2.6. Can anyone confirm or deny? =head2 BSD (and OSX) Uses C to determine process size. This is pretty efficient (a lot more efficient than reading it from the F fs anyway). According to recent tests on OSX (July, 2006), C simply reports zero for process and shared size on that platform, so OSX is not supported by C. =head2 AIX? Uses C to determine process size. Not sure if the shared memory calculations will work or not. AIX users? =head2 Win32 Uses C to access process memory information. C can be installed under ActiveState perl using the supplied ppm utility. =head2 Everything Else If your platform is not supported, then please send a patch to check the process size. The more portable/efficient/correct the solution the better, of course. =head1 ABOUT THIS MODULE This module was written in response to questions on the mod_perl mailing list on how to tell the httpd process to exit if it gets too big. Actually, there are two big reasons your httpd children will grow. First, your code could have a bug that causes the process to increase in size very quickly. Second, you could just be doing operations that require a lot of memory for each request. Since Perl does not give memory back to the system after using it, the process size can grow quite large. This module will not really help you with the first problem. For that you should probably look into C or some other means of setting a limit on the data size of your program. BSD-ish systems have C, which will kill your memory gobbling processes. However, it is a little violent, terminating your process in mid-request. This module attempts to solve the second situation, where your process slowly grows over time. It checks memory usage after every request, and if it exceeds a threshold, exits gracefully. By using this module, you should be able to discontinue using the Apache configuration directive B, although for some folks, using both in combination does the job. =head1 DEPRECATED APIS Previous versions of this module documented three globals for defining memory size limits: =over 4 =item * $Apache2::SizeLimit::MAX_PROCESS_SIZE =item * $Apache2::SizeLimit::MIN_SHARE_SIZE =item * $Apache2::SizeLimit::MAX_UNSHARED_SIZE =item * $Apache2::SizeLimit::CHECK_EVERY_N_REQUESTS =item * $Apache2::SizeLimit::USE_SMAPS =back Direct use of these globals is deprecated, but will continue to work for the foreseeable future. It also documented three functions for use from registry scripts: =over 4 =item * Apache2::SizeLimit::setmax() =item * Apache2::SizeLimit::setmin() =item * Apache2::SizeLimit::setmax_unshared() =back Besides setting the appropriate limit, these functions I add a cleanup handler to the current request. In the 2.x series of mod_perl to use the deprecated functions, you must set PerlOptions +GlobalRequest accordingly. =head1 SUPPORT The Apache-SizeLimit project is co-maintained by several developers, who take turns at making CPAN releases. Therefore you may find several CPAN directories containing Apache-SizeLimit releases. The best way to find the latest release is to use http://search.cpan.org/. If you have a question or you want to submit a bug report or make a contribution, please do not email individual authors, but send an email to the modperl perl.apache.org mailing list. This list is moderated, so unless you are subscribed to it, your message will have to be approved first by a moderator. Therefore please allow some time (up to a few days) for your post to propagate to the list. =head1 AUTHOR Doug Bagley , channeling Procrustes. Brian Moseley : Solaris 2.6 support Doug Steinwand and Perrin Harkins : added support for shared memory and additional diagnostic info Matt Phillips and Mohamed Hendawi : Win32 support Dave Rolsky , maintenance and fixes outside of mod_perl tree (0.9+). =cut mod_perl-2.0.9/Apache-SizeLimit/LICENSE0000644000177200010010000002613612540623175016175 0ustar SteveNone Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mod_perl-2.0.9/Apache-SizeLimit/Makefile.PL0000644000177200010010000001646612540623175017147 0ustar SteveNoneuse strict; use Config; my %prereqs = (); my %mp2 = ( mod_perl2 => 1.99022 ); my %mp1 = ( mod_perl => 0 ); my $at_min_ver = 1.36; my $mp_gen; # MOD_PERL_2_BUILD is set from building from mod_perl Makefile.PL which should # also set MP_APXS if ($ENV{MOD_PERL_2_BUILD}) { push @ARGV, "-apxs", $ENV{MP_APXS}; my $mp_gen = satisfy_mp_generation(2); } else { $mp_gen = satisfy_mp_generation(); } %prereqs = ($mp_gen == 1 ? %mp1 : %mp2); unless ( $ARGV[0] eq '--dist' || $ENV{MOD_PERL_2_BUILD} ) { if ( $Config{'osname'} eq 'linux' ) { $prereqs{'Linux::Pid'} = 0; if ( -e '/proc/self/smaps' ) { $prereqs{'Linux::Smaps'} = 0; } } elsif ( $Config{'osname'} =~ /(bsd|aix)/i ) { $prereqs{'BSD::Resource'} = 0; } elsif ( $Config{'osname'} eq 'MSWin32' ) { $prereqs{'Win32::API'} = 0; } } my $HAS_APACHE_TEST = check_for_apache_test(); my %common_opts = ( PREREQ_PM => \%prereqs, clean => { FILES => 't/TEST' }, ); ### MAINTAINER_BUILDING_RELEASE is hack ### for the Release Manager's use only. ### We will set it so that the resulting ### distribution will be called Apache-SizeLimit-\d+.tar.gz ### and NOT Apache2-SizeLimit-\d+.tar.gz ### This is for historical reasons and consistency if ($mp_gen == 1 || $ENV{MAINTAINER_BUILDING_RELEASE}) { require ExtUtils::MakeMaker; ExtUtils::MakeMaker::WriteMakefile( %common_opts, VERSION_FROM => "lib/Apache/SizeLimit.pm", NAME => "Apache::SizeLimit", ABSTRACT_FROM => 'lib/Apache/SizeLimit.pm', ); } else { require ModPerl::MM; ModPerl::MM::WriteMakefile( %common_opts, VERSION_FROM => "lib/Apache2/SizeLimit.pm", NAME => "Apache2::SizeLimit", ABSTRACT_FROM => 'lib/Apache2/SizeLimit.pm', ); } sub check_for_apache_test { return unless eval { require Apache::Test; if ($Apache::Test::VERSION < $at_min_ver) { die "Apache::Test version is " . $Apache::Test::VERSION . ", minimum version required is $at_min_ver" . ", tests will be skipped\n"; } require Apache::TestMM; require Apache::TestRunPerl; 1; }; Apache::TestMM::filter_args(); my %args = @Apache::TestMM::Argv; Apache::TestRunPerl->generate_script(); return 1; } # If a specific generation was passed as an argument, # if satisfied # return the same generation # else # die # else @ARGV and %ENV will be checked for specific orders # if the specification will be found # if satisfied # return the specified generation # else # die # else if any mp generation is found # return it # else # die sub satisfy_mp_generation { my $wanted = shift || wanted_mp_generation(); unless ($wanted == 1 || $wanted == 2) { die "don't know anything about mod_perl generation: $wanted\n" . "currently supporting only generations 1 and 2"; } my $selected = 0; if ($wanted == 1) { require_mod_perl(); if ($mod_perl::VERSION >= 1.99) { # so we don't pick 2.0 version if 1.0 is wanted die "You don't seem to have mod_perl 1.0 installed"; } $selected = 1; } elsif ($wanted == 2) { #warn "Looking for mod_perl 2.0"; require_mod_perl(); if ($mod_perl::VERSION < 2.0) { die "You don't seem to have mod_perl 2.0 installed"; } $selected = 2; } else { require_mod_perl(); $selected = $mod_perl::VERSION >= 1.99 ? 2 : 1; warn "Using $mod_perl::VERSION\n"; } return $selected; } sub require_mod_perl { eval { require mod_perl }; eval { require mod_perl2 } if ($@); die "Can't find mod_perl installed\nThe error was: $@" if $@; } # the function looks at %ENV and Makefile.PL option to figure out # whether a specific mod_perl generation was requested. # It uses the following logic: # via options: # perl Makefile.PL MOD_PERL=2 # or via %ENV: # env MOD_PERL=1 perl Makefile.PL # # return value is: # 1 or 2 if the specification was found (mp 1 and mp 2 respectively) # 0 otherwise sub wanted_mp_generation { # check if we have a command line specification # flag: 0: unknown, 1: mp1, 2: mp2 my $flag = 0; foreach my $key (@ARGV) { if ($key =~ /^MOD_PERL=(\d)$/) { $flag = $1; } } # check %ENV my $env = exists $ENV{MOD_PERL} ? $ENV{MOD_PERL} : 0; # check for contradicting requirements if ($env && $flag && $flag != $env) { die <catdir('..', 'lib'); unshift @INC, $mplib if -e File::Spec->catfile($mplib,'mod_perl2.pm'); my $atlib = File::Spec->catdir('../', 'Apache-Test', 'lib'); unshift @INC, $atlib if -d $atlib; } eval { require mod_perl2 } if ($@); unless ($@) { $wanted = 2; } } else { $wanted = 1; } } return $wanted; } package MY; sub postamble { my $self = shift; my $string = $self->SUPER::postamble; $string .= <<'EOF'; tag : svn copy https://svn.apache.org/repos/asf/perl/Apache-SizeLimit/trunk https://svn.apache.org/repos/asf/perl/Apache-SizeLimit/tags/$(VERSION_SYM) @echo update lib/Apache/SizeLimit.pm VERSION now EOF return $string; } sub test { my $self = shift; eval { require Test::More } or return <Apache::TestMM::test(@_) if $HAS_APACHE_TEST; return $self->SUPER::test(@_); } sub clean { my $self = shift; return $self->Apache::TestMM::clean(@_) if $HAS_APACHE_TEST; return $self->SUPER::clean(@_); } sub constants { my $self = shift; my $string = $self->MM::constants; # mp2 installs A-T into INSTALLSITEARCH, so in order to avoid # problems when users forget 'make install UNINST=1', trick MM into # installing pure perl modules to the sitearch location, when A-T is # not installed as a part of mp2 build if (!$ENV{MOD_PERL_2_BUILD}) { $string .= <<'EOI'; # install into the same location as mod_perl 2.0 INSTALLSITELIB = $(INSTALLSITEARCH) DESTINSTALLSITELIB = $(DESTINSTALLSITEARCH) EOI } $string; } mod_perl-2.0.9/Apache-SizeLimit/MANIFEST0000644000104000010010000000076312540623175020220 0ustar AdministratorsNoneChanges INSTALL LICENSE MANIFEST MANIFEST.SKIP Makefile.PL README lib/Apache/SizeLimit.pm lib/Apache/SizeLimit/Core.pm lib/Apache2/SizeLimit.pm t/pod.t t/response/TestApache/basic.pm t/response/TestApache/deprecated.pm t/response/TestApache/zzz_check_n_requests.pm t/response/TestApache/check_n_requests2.pm t/response/TestApache2/basic.pm t/response/TestApache2/deprecated.pm t/response/TestApache2/zzz_check_n_requests.pm t/response/TestApache2/check_n_requests2.pm t/apache/all.t t/apache2/all.t mod_perl-2.0.9/Apache-SizeLimit/MANIFEST.SKIP0000644000104000010010000000023112540623175020753 0ustar AdministratorsNone.*CVS.* ^Makefile$ \.\#.* ~$ MANIFEST.SKIP .*\.tar\.gz .bak$ ^blib/ .*\.svn.* \#.* t/TEST.* t/apache.* t/conf.* t/htdocs.* t/logs.* t/response.* RELEASE mod_perl-2.0.9/Apache-SizeLimit/README0000644000177200010010000003106312540623175016043 0ustar SteveNoneNAME Apache2::SizeLimit - Because size does matter. SYNOPSIS PerlLoadModule Apache2::SizeLimit Apache2::SizeLimit->set_max_process_size(150_000); # Max size in KB Apache2::SizeLimit->set_min_shared_size(10_000); # Min share in KB Apache2::SizeLimit->set_max_unshared_size(120_000); # Max unshared size in KB PerlCleanupHandler Apache2::SizeLimit DESCRIPTION ******************************** NOIICE ******************* This version is only for httpd 2.x and mod_perl 2.x series. For httpd 1.3.x / mod_perl 1.x Apache::SizeLimit documentation please read the perldoc in lib/Apache/SizeLimit.pm ******************************** NOTICE ******************* This module allows you to kill off Apache httpd processes if they grow too large. You can make the decision to kill a process based on its overall size, by setting a minimum limit on shared memory, or a maximum on unshared memory. You can set limits for each of these sizes, and if any limit is exceeded, the process will be killed. You can also limit the frequency that these sizes are checked so that this module only checks every N requests. This module is highly platform dependent, please read the "PER-PLATFORM BEHAVIOR" section for details. It is possible that this module simply does not support your platform. API You can set set the size limits from a Perl module or script loaded by Apache by calling the appropriate class method on "Apache2::SizeLimit": * Apache2::SizeLimit->set_max_process_size($size) This sets the maximum size of the process, including both shared and unshared memory. * Apache2::SizeLimit->set_max_unshared_size($size) This sets the maximum amount of *unshared* memory the process can use. * Apache2::SizeLimit->set_min_shared_size($size) This sets the minimum amount of shared memory the process must have. The two methods related to shared memory size are effectively a no-op if the module cannot determine the shared memory size for your platform. See "PER-PLATFORM BEHAVIOR" for more details. Running the handler() There are several ways to make this module actually run the code to kill a process. The simplest is to make "Apache2::SizeLimit" a "PerlCleanupHandler" in your Apache config: PerlCleanupHandler Apache2::SizeLimit This will ensure that "Apache2::SizeLimit->handler()" is run for all requests. If you want to combine this module with a cleanup handler of your own, make sure that "Apache2::SizeLimit" is the last handler run: PerlCleanupHandler Apache2::SizeLimit My::CleanupHandler Remember, mod_perl will run stacked handlers from right to left, as they're defined in your configuration. If you have some cleanup code you need to run, but stacked handlers aren't appropriate for your setup, you can also explicitly call the "Apache2::SizeLimit->handler()" function from your own cleanup handler: package My::CleanupHandler sub handler { my $r = shift; # Causes File::Temp to remove any temp dirs created during the # request File::Temp::cleanup(); return Apache2::SizeLimit->handler($r); } * Apache2::SizeLimit->add_cleanup_handler($r) You can call this method inside a request to run "Apache2::SizeLimit"'s "handler()" method for just that request. It's safe to call this method repeatedly -- the cleanup will only be run once per request. Checking Every N Requests Since checking the process size can take a few system calls on some platforms (e.g. linux), you may not want to check the process size for every request. * Apache2::SizeLimit->set_check_interval($interval) Calling this causes "Apache2::SizeLimit" to only check the process size every $interval requests. If you want this to affect all processes, make sure to call this during server startup. SHARED MEMORY OPTIONS In addition to simply checking the total size of a process, this module can factor in how much of the memory used by the process is actually being shared by copy-on-write. If you don't understand how memory is shared in this way, take a look at the mod_perl docs at http://perl.apache.org/docs/. You can take advantage of the shared memory information by setting a minimum shared size and/or a maximum unshared size. Experience on one heavily trafficked mod_perl site showed that setting maximum unshared size and leaving the others unset is the most effective policy. This is because it only kills off processes that are truly using too much physical RAM, allowing most processes to live longer and reducing the process churn rate. PER-PLATFORM BEHAVIOR This module is highly platform dependent, since finding the size of a process is different for each OS, and some platforms may not be supported. In particular, the limits on minimum shared memory and maximum shared memory are currently only supported on Linux and BSD. If you can contribute support for another OS, patches are very welcome. Currently supported OSes: linux For linux we read the process size out of /proc/self/statm. If you are worried about performance, you can consider using "Apache2::SizeLimit->set_check_interval()" to reduce how often this read happens. As of linux 2.6, /proc/self/statm does not report the amount of memory shared by the copy-on-write mechanism as shared memory. This means that decisions made based on shared memory as reported by that interface are inherently wrong. However, as of the 2.6.14 release of the kernel, there is /proc/self/smaps entry for each process. /proc/self/smaps reports various sizes for each memory segment of a process and allows us to count the amount of shared memory correctly. If "Apache2::SizeLimit" detects a kernel that supports /proc/self/smaps and the "Linux::Smaps" module is installed it will use that module instead of /proc/self/statm. Reading /proc/self/smaps is expensive compared to /proc/self/statm. It must look at each page table entry of a process. Further, on multiprocessor systems the access is synchronized with spinlocks. Again, you might consider using "Apache2::SizeLimit->set_check_interval()". Copy-on-write and Shared Memory The following example shows the effect of copy-on-write: require Apache2::SizeLimit; package X; use strict; use Apache2::Const -compile => qw(OK); my $x = "a" x (1024*1024); sub handler { my $r = shift; my ($size, $shared) = $Apache2::SizeLimit->_check_size(); $x =~ tr/a/b/; my ($size2, $shared2) = $Apache2::SizeLimit->_check_size(); $r->content_type('text/plain'); $r->print("1: size=$size shared=$shared\n"); $r->print("2: size=$size2 shared=$shared2\n"); return OK; } SetHandler modperl PerlResponseHandler X The parent Apache process allocates memory for the string in $x. The "tr"-command then overwrites all "a" with "b" if the handler is called with an argument. This write is done in place, thus, the process size doesn't change. Only $x is not shared anymore by means of copy-on-write between the parent and the child. If /proc/self/smaps is available curl shows: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13452 shared=7456 2: size=13452 shared=6432 Shared memory has lost 1024 kB. The process' overall size remains unchanged. Without /proc/self/smaps it says: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13052 shared=3628 2: size=13052 shared=3636 One can see the kernel lies about the shared memory. It simply doesn't count copy-on-write pages as shared. solaris 2.6 and above For solaris we simply retrieve the size of /proc/self/as, which contains the address-space image of the process, and convert to KB. Shared memory calculations are not supported. NOTE: This is only known to work for solaris 2.6 and above. Evidently the /proc filesystem has changed between 2.5.1 and 2.6. Can anyone confirm or deny? BSD (and OSX) Uses "BSD::Resource::getrusage()" to determine process size. This is pretty efficient (a lot more efficient than reading it from the /proc fs anyway). According to recent tests on OSX (July, 2006), "BSD::Resource" simply reports zero for process and shared size on that platform, so OSX is not supported by "Apache2::SizeLimit". AIX? Uses "BSD::Resource::getrusage()" to determine process size. Not sure if the shared memory calculations will work or not. AIX users? Win32 Uses "Win32::API" to access process memory information. "Win32::API" can be installed under ActiveState perl using the supplied ppm utility. Everything Else If your platform is not supported, then please send a patch to check the process size. The more portable/efficient/correct the solution the better, of course. ABOUT THIS MODULE This module was written in response to questions on the mod_perl mailing list on how to tell the httpd process to exit if it gets too big. Actually, there are two big reasons your httpd children will grow. First, your code could have a bug that causes the process to increase in size very quickly. Second, you could just be doing operations that require a lot of memory for each request. Since Perl does not give memory back to the system after using it, the process size can grow quite large. This module will not really help you with the first problem. For that you should probably look into "Apache::Resource" or some other means of setting a limit on the data size of your program. BSD-ish systems have "setrlimit()", which will kill your memory gobbling processes. However, it is a little violent, terminating your process in mid-request. This module attempts to solve the second situation, where your process slowly grows over time. It checks memory usage after every request, and if it exceeds a threshold, exits gracefully. By using this module, you should be able to discontinue using the Apache configuration directive MaxRequestsPerChild, although for some folks, using both in combination does the job. DEPRECATED APIS Previous versions of this module documented three globals for defining memory size limits: * $Apache2::SizeLimit::MAX_PROCESS_SIZE * $Apache2::SizeLimit::MIN_SHARE_SIZE * $Apache2::SizeLimit::MAX_UNSHARED_SIZE * $Apache2::SizeLimit::CHECK_EVERY_N_REQUESTS * $Apache2::SizeLimit::USE_SMAPS Direct use of these globals is deprecated, but will continue to work for the foreseeable future. It also documented three functions for use from registry scripts: * Apache2::SizeLimit::setmax() * Apache2::SizeLimit::setmin() * Apache2::SizeLimit::setmax_unshared() Besides setting the appropriate limit, these functions *also* add a cleanup handler to the current request. In the 2.x series of mod_perl to use the deprecated functions, you must set PerlOptions +GlobalRequest accordingly. SUPPORT The Apache-SizeLimit project is co-maintained by several developers, who take turns at making CPAN releases. Therefore you may find several CPAN directories containing Apache-SizeLimit releases. The best way to find the latest release is to use http://search.cpan.org/. If you have a question or you want to submit a bug report or make a contribution, please do not email individual authors, but send an email to the modperl perl.apache.org mailing list. This list is moderated, so unless you are subscribed to it, your message will have to be approved first by a moderator. Therefore please allow some time (up to a few days) for your post to propagate to the list. AUTHOR Doug Bagley , channeling Procrustes. Brian Moseley : Solaris 2.6 support Doug Steinwand and Perrin Harkins : added support for shared memory and additional diagnostic info Matt Phillips and Mohamed Hendawi : Win32 support Dave Rolsky , maintenance and fixes outside of mod_perl tree (0.9+). mod_perl-2.0.9/Apache-SizeLimit/RELEASE0000644000177200010010000000773112540623175016173 0ustar SteveNoneInstructions for Apache-SizeLimit Release Manager 0. Ask the PMC to verify that you have the appropriate CPAN permissions on dev@perl. make sure your public key is in the KEYS file in the mod_perl docs. you should only need to do this if this is your first time playing Release Manager $ cd mod_perl-docs $ grep $USER src/dist/KEYS note that the KEYS file itself contains all the instructions you need on how to add your key. if you need further help on gpg (like how to create a key in the first place) you can look here http://people.apache.org/~geoff/gpghowto.html Copy the KEYS file into place: % scp KEYS www.apache.org:/www/www.apache.org/dist/perl/KEYS If this is your first release, ask someone with APML karma on PAUSE to verify you have the appropriate permissions. Likely someone on the PMC can do this. a. login into https://pause.perl.org b. menu click: Select Mailinglist/Action c. choose APML and share_perms and click go d. click 3.5 Make somebody else co-maintainer e. choose the modules to give the perms to type the username of the new co-maintainer f. if you happen to know that packages were added this release, make sure you give the correct permissions to them. TODO: 1/2. run pod2text to update the README and commit any changes if neccessary. Decide what to do about having almost identical pod in Apache::SizeLimit and Apache2::SizeLimit 3/4. Configure MAINTAINER_BUILDING_RELEASE=1 perl Makefile.PL 1. 'make dist' - to make sure nothing is missing from the manifest, etc. Now test this generated package (not svn) with as many configurations as possible on as many platforms as possible. a. edit ./Changes: - find lib -type f \( -name "*.pm" -o -name "Changes" \) | \ xargs perl -pi -e 's,0.95-dev,0.96-rc1,g' - don't commit these (see dev@ archives) b. nuke any preinstalled Apache-SizeLimit libs and run 'make test' c. test that you can 'make install' and then run 'make test' again d. test whether we still 100% OK on systems with no LWP: % APACHE_TEST_PRETEND_NO_LWP=1 make test 2. once confident that the package is good, upload a release candidate to people.apache.org/~username and post 24 hour-ish candidate alert to the various lists o dev/perl.apache.org o modperl/perl.apache.org Subject: [RELEASE CANDIDATE] Apache-SizeLimit 0.96 RC\d+ (or maybe longer to give most people a chance to catch up). no need to tag this package a. if problems are detected during stage 2, repeat stages 1 and 2. $ md5 Apache-SizeLimit-0.96-rc1.tar.gz > Apache-SizeLimit-0.96-rc1.tar.gz.md5 $ sha256 Apache-SizeLimit-0.96-rc1.tar.gz > Apache-SizeLimit-0.96-rc1.tar.gz.sha256 $ gpg --detach-sign --armor Apache-SizeLimit-0.96-rc1.tar.gz 3. when the package has been reported to be good, prepare a new package to be released a. edit ./Changes: - remove -rc\d+ (also remove this from modules) - add release date b. rerun: % perl Makefile.PL make sure tag looks right % make -n tag c. commit Changes and modules % svn ci Changes lib/ d. tag % make tag e. create the final package % make dist f. test the final package again at least once 4. Upload the package to CPAN 5. Announce the package a. post ... to the modperl, announce lists Subject: [ANNOUNCE] Apache-SizeLimit 0.96 include - MD5 sig (as it comes from CPAN upload announce). - the latest Changes 6. Prepare for the next cycle a. increment version in lib/Apache/SizeLimit.pm b. edit ./Changes: - start a new item with incremented version + '-dev' =item 0.97-dev c. bump up version numbers in this file to make it easier to do the next release. $ perl -pi -e 's/(\d+)\.(\d+)/join(".", $1, $2+1)/eg' RELEASE d. commit Changes % svn ci -m "start 0.97-dev cycle" Changes RELEASE lib/Apache/SizeLimit.pm lib/Apache2/SizeLimit.pm lib/Apache/SizeLimit/Core.pm mod_perl-2.0.9/Apache-SizeLimit/t/0000755000104000010010000000000012540623175017324 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/apache/0000755000104000010010000000000012540623175020545 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/apache/all.t0000644000177200010010000000162712540623175017607 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Config; use Apache::Test; # skip all tests in this directory unless mod_perl is enabled plan tests => 1, \&my_need; ok 1; sub my_need { my $ok = 1; if ( $Config{'osname'} eq 'linux' ) { $ok = need_module('Linux::Pid'); if ( -e '/proc/self/smaps' ) { $ok &= need_module('Linux::Smaps'); } } elsif ( $Config{'osname'} =~ /(bsd|aix)/i ) { $ok &= need_module('BSD::Resource'); } elsif ( $Config{'osname'} eq 'MSWin32' ) { $ok &= need_module('Win32::API'); } elsif ( $Config{'osname'} eq 'darwin' ) { push @Apache::Test::SkipReasons, "$Config{osname} is not supported - broken getrusage(3)"; return 0; } $ok &= need_module('mod_perl.c'); $ok &= need_apache(1); $ok &= need_min_module_version('Test::Builder' => '0.18_01'); return $ok; } mod_perl-2.0.9/Apache-SizeLimit/t/apache/check_n_requests2.t0000644000177200010010000000071712540623175022445 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; my $module = 'TestApache::check_n_requests2'; my $url = Apache::TestRequest::module2url($module); plan tests => 1, need_min_module_version('Apache::Test' => 1.29); require Apache::TestUtil; Apache::TestUtil::t_start_error_log_watch(); my $res = GET $url; my $c = grep { /Apache::SizeLimit httpd process too big/ } Apache::TestUtil::t_finish_error_log_watch(); ok $c == 0; mod_perl-2.0.9/Apache-SizeLimit/t/apache/zzz_check_n_requests.t0000644000177200010010000000073412540623175023277 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; my $module = 'TestApache::zzz_check_n_requests'; my $url = Apache::TestRequest::module2url($module); plan tests => 1, need_min_module_version('Apache::Test' => 1.29); require Apache::TestUtil; Apache::TestUtil::t_start_error_log_watch(); my $res = GET $url; sleep(5); my $c = grep { /Apache::SizeLimit httpd process too big/ } Apache::TestUtil::t_finish_error_log_watch(); ok $c == 1; mod_perl-2.0.9/Apache-SizeLimit/t/apache2/0000755000104000010010000000000012540623175020627 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/apache2/all.t0000644000177200010010000000201412540623175017660 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Config; use Apache::Test; # skip all tests in this directory unless mod_perl is enabled for 2.x series plan tests => 1, \&my_need; ok 1; sub my_need { my $ok = 1; if ( $Config{'osname'} eq 'linux' ) { $ok = need_module('Linux::Pid'); if ( -e '/proc/self/smaps' ) { $ok &= need_module('Linux::Smaps'); } } elsif ( $Config{'osname'} =~ /(bsd|aix)/i ) { $ok &= need_module('BSD::Resource'); } elsif ( $Config{'osname'} eq 'MSWin32' ) { $ok &= need_module('Win32::API'); } elsif ( $Config{'osname'} eq 'darwin' ) { push @Apache::Test::SkipReasons, "$Config{osname} is not supported - broken getrusage(3)"; return 0; } $ok &= need_min_apache_version("2.0.48"); eval { require mod_perl2; }; $ok &= $mod_perl2::VERSION && $mod_perl2::VERSION >= 1.99022 ? 1 : 0; ## 2.0.0-RC5+ $ok &= need_min_module_version('Test::Builder' => '0.18_01'); return $ok; } mod_perl-2.0.9/Apache-SizeLimit/t/apache2/check_n_requests2.t0000644000177200010010000000072112540623175022522 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; my $module = 'TestApache2::check_n_requests2'; my $url = Apache::TestRequest::module2url($module); plan tests => 1, need_min_module_version('Apache::Test' => 1.29); require Apache::TestUtil; Apache::TestUtil::t_start_error_log_watch(); my $res = GET $url; my $c = grep { /Apache2::SizeLimit httpd process too big/ } Apache::TestUtil::t_finish_error_log_watch(); ok $c == 0; mod_perl-2.0.9/Apache-SizeLimit/t/apache2/zzz_check_n_requests.t0000644000177200010010000000073612540623175023363 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; my $module = 'TestApache2::zzz_check_n_requests'; my $url = Apache::TestRequest::module2url($module); plan tests => 1, need_min_module_version('Apache::Test' => 1.29); require Apache::TestUtil; Apache::TestUtil::t_start_error_log_watch(); my $res = GET $url; sleep(5); my $c = grep { /Apache2::SizeLimit httpd process too big/ } Apache::TestUtil::t_finish_error_log_watch(); ok $c == 1; mod_perl-2.0.9/Apache-SizeLimit/t/conf/0000755000104000010010000000000012540623175020251 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/conf/modperl_extra.pl.in0000644000177200010010000000036712540623175022165 0ustar SteveNoneuse strict; use warnings FATAL => qw(all); use File::Spec (); my $test = File::Spec->catfile('@ServerRoot@', qw(.. .. INSTALL.raven)); if (-e $test) { require lib; lib->import(File::Spec->catfile('@ServerRoot@', qw(.. .. blib lib))); } 1; mod_perl-2.0.9/Apache-SizeLimit/t/pod.t0000644000177200010010000000020112540623175016363 0ustar SteveNoneuse Test::More; eval "use Test::Pod 1.14"; plan skip_all => "Test::Pod 1.14 required for testing POD" if $@; all_pod_files_ok(); mod_perl-2.0.9/Apache-SizeLimit/t/response/0000755000104000010010000000000012540623173021160 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache/0000755000104000010010000000000012540623175023203 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache/basic.pm0000644000177200010010000000725712540623175022734 0ustar SteveNonepackage TestApache::basic; use strict; use warnings; use Apache::Test qw(-withtestmore); use Apache::Constants qw(OK); use Apache::SizeLimit; use Config; use constant ONE_MB => 1024; use constant TEN_MB => 1024 * 10; sub handler { my $r = shift; plan $r, tests => 13; { local ($Apache::SizeLimit::Core::MAX_PROCESS_SIZE, $Apache::SizeLimit::Core::MIN_SHARE_SIZE, $Apache::SizeLimit::Core::MAX_UNSHARED_SIZE); ok( ! Apache::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns false without any limits set' ); } { my ( $size, $shared ) = Apache::SizeLimit->_check_size(); cmp_ok( $size, '>', 0, 'proc size is reported > 0' ); { # test with USE_SMAPS=0 my $smaps = $Apache::SizeLimit::USE_SMAPS; $Apache::SizeLimit::USE_SMAPS = 0; my ( $size, $shared ) = Apache::SizeLimit->_check_size(); cmp_ok( $size, '>', 0, 'proc size is reported > 0' ); $Apache::SizeLimit::USE_SMAPS = $smaps; } SKIP: { skip 'I have no idea what getppid() on Win32 might return', 1 if $Config{'osname'} eq 'MSWin32'; cmp_ok( Apache::SizeLimit->_platform_getppid(), '>', 1, 'real_getppid() > 1' ); } } { # We can assume this will use _at least_ 10MB of memory, based on # assuming a scalar consumes >= 1K. my @big = ('x') x TEN_MB; my ( $size, $shared ) = Apache::SizeLimit->_check_size(); cmp_ok( $size, '>', TEN_MB, 'proc size is reported > ' . TEN_MB ); Apache::SizeLimit->set_max_process_size(ONE_MB); ok( Apache::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on max process size' ); SKIP: { skip 'We cannot get shared memory on this platform.', 3 unless $shared > 0; cmp_ok( $size, '>', $shared, 'proc size is greater than shared size' ); Apache::SizeLimit->set_max_process_size(0); Apache::SizeLimit->set_min_shared_size( ONE_MB * 100 ); ok( Apache::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on min share size' ); Apache::SizeLimit->set_min_shared_size(0); Apache::SizeLimit->set_max_unshared_size(1); ok( Apache::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on max unshared size' ); } } { # Lame test - A way to check that setting this _does_ # something would be welcome ;) Apache::SizeLimit->set_check_interval(10); is( $Apache::SizeLimit::CHECK_EVERY_N_REQUESTS, 10, 'set_check_interval set global' ); } { Apache::SizeLimit->set_max_process_size(0); Apache::SizeLimit->set_min_shared_size(0); Apache::SizeLimit->set_max_unshared_size(0); my $handlers = $r->get_handlers('PerlCleanupHandler'); is( scalar @$handlers, 0, 'there is no PerlCleanupHandler before add_cleanup_handler()' ); Apache::SizeLimit->add_cleanup_handler($r); $handlers = $r->get_handlers('PerlCleanupHandler'); is( scalar @$handlers, 1, 'there is one PerlCleanupHandler after add_cleanup_handler()' ); Apache::SizeLimit->add_cleanup_handler($r); $handlers = $r->get_handlers('PerlCleanupHandler'); is( scalar @$handlers, 1, 'there is stil one PerlCleanupHandler after add_cleanup_handler() a second time' ); } return OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache/check_n_requests2.pm0000644000177200010010000000202412540623175025245 0ustar SteveNonepackage TestApache::check_n_requests2; use strict; use warnings; use Apache::Constants; use Apache::Test qw(-withtestmore); use Apache::SizeLimit; use constant ONE_MB => 1024; use constant TEN_MB => ONE_MB * 10; use constant TWENTY_MB => TEN_MB * 2; my $i = 0; my %hash = (); sub handler { my $r = shift; plan $r, tests => 11; Apache::SizeLimit->add_cleanup_handler($r); Apache::SizeLimit->set_max_process_size(TEN_MB); ## this should cause us _NOT_ to fire Apache::SizeLimit->set_check_interval(5); # We can assume this will use _at least_ 1MB of memory, based on # assuming a scalar consumes >= 1K. # and after 10 requests, we should be _at least_ 10MB of memory for (0..9) { my @big = ('x') x ONE_MB; $hash{$i++} = \@big; is($i, $i, "now using $i MB of memory (at least)"); } is( 1, Apache::SizeLimit->_limits_are_exceeded(), "we passed the limits and will _NOT_ kill the child" ); return Apache::Constants::OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache/deprecated.pm0000644000177200010010000000173212540623175023743 0ustar SteveNonepackage TestApache::deprecated; use strict; use warnings; use Apache::Test qw(-withtestmore); use Apache::Constants qw(OK); use Apache::SizeLimit; sub handler { my $r = shift; plan $r, tests => 5; my $handlers = $r->get_handlers('PerlCleanupHandler'); is( scalar @$handlers, 0, 'there is no PerlCleanupHandler before add_cleanup_handler()' ); Apache::SizeLimit::setmax( 100_000 ); is( $Apache::SizeLimit::MAX_PROCESS_SIZE, 100_000, 'setmax changes $MAX_PROCESS_SIZE' ); Apache::SizeLimit::setmin( 1 ); is( $Apache::SizeLimit::MIN_SHARE_SIZE, 1, 'setmax changes $MIN_SHARE_SIZE' ); Apache::SizeLimit::setmax_unshared( 1 ); is( $Apache::SizeLimit::MIN_SHARE_SIZE, 1, 'setmax_unshared changes $MAX_UNSHARED_SIZE' ); $handlers = $r->get_handlers('PerlCleanupHandler'); is( scalar @$handlers, 1, 'there is one PerlCleanupHandler after calling deprecated functions' ); return OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache/zzz_check_n_requests.pm0000644000177200010010000000211512540623175026101 0ustar SteveNonepackage TestApache::zzz_check_n_requests; use strict; use warnings; use Apache::Constants; use Apache::Test qw(-withtestmore); use Apache::TestUtil; use Apache::SizeLimit; use constant ONE_MB => 1024; use constant TEN_MB => ONE_MB * 10; use constant TWENTY_MB => TEN_MB * 2; my $i = 0; my %hash = (); sub handler { my $r = shift; plan $r, tests => 11; Apache::SizeLimit->add_cleanup_handler($r); Apache::SizeLimit->set_max_process_size(TEN_MB); ## this should cause us to fire Apache::SizeLimit->set_check_interval(); # We can assume this will use _at least_ 1MB of memory, based on # assuming a scalar consumes >= 1K. # and after 10 requests, we should be _at least_ 10MB of memory for (0..9) { my @big = ('x') x ONE_MB; $hash{$i++} = \@big; is( $i, $i, "now using $i MB of memory (at least)" ); } is( 1, Apache::SizeLimit->_limits_are_exceeded(), "we passed the limits and _WILL_ kill the child" ); return Apache::Constants::OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache2/0000755000104000010010000000000012540623175023265 5ustar AdministratorsNonemod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache2/basic.pm0000644000177200010010000000565712540623175023020 0ustar SteveNonepackage TestApache2::basic; use strict; use warnings; use Apache::Test qw(-withtestmore); use Apache2::Const -compile => qw(OK); use Apache2::SizeLimit; use Config; use constant ONE_MB => 1024; use constant TEN_MB => 1024 * 10; sub handler { my $r = shift; plan $r, tests => 10; { local ($Apache::SizeLimit::Core::MAX_PROCESS_SIZE, $Apache::SizeLimit::Core::MIN_SHARE_SIZE, $Apache::SizeLimit::Core::MAX_UNSHARED_SIZE); ok( ! Apache2::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns false without any limits set' ); } { my ( $size, $shared ) = Apache2::SizeLimit->_check_size(); cmp_ok( $size, '>', 0, 'proc size is reported > 0' ); { # test with USE_SMAPS=0 my $smaps = $Apache2::SizeLimit::USE_SMAPS; $Apache2::SizeLimit::USE_SMAPS = 0; my ( $size, $shared ) = Apache2::SizeLimit->_check_size(); cmp_ok( $size, '>', 0, 'proc size is reported > 0' ); $Apache2::SizeLimit::USE_SMAPS = $smaps; } SKIP: { skip 'I have no idea what getppid() on Win32 might return', 1 if $Config{'osname'} eq 'MSWin32'; cmp_ok( Apache2::SizeLimit->_platform_getppid(), '>', 1, 'real_getppid() > 1' ); } } { # We can assume this will use _at least_ 10MB of memory, based on # assuming a scalar consumes >= 1K. my @big = ('x') x TEN_MB; my ( $size, $shared ) = Apache2::SizeLimit->_check_size(); cmp_ok( $size, '>', TEN_MB, 'proc size is reported > ' . TEN_MB ); Apache2::SizeLimit->set_max_process_size(ONE_MB); ok( Apache2::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on max process size' ); SKIP: { skip 'We cannot get shared memory on this platform.', 3 unless $shared > 0; cmp_ok( $size, '>', $shared, 'proc size is greater than shared size' ); Apache2::SizeLimit->set_max_process_size(0); Apache2::SizeLimit->set_min_shared_size( ONE_MB * 100 ); ok( Apache2::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on min share size' ); Apache2::SizeLimit->set_min_shared_size(0); Apache2::SizeLimit->set_max_unshared_size(1); ok( Apache2::SizeLimit->_limits_are_exceeded(), 'check that _limits_are_exceeded() returns true based on max unshared size' ); } } { # Lame test - A way to check that setting this _does_ # something would be welcome ;) Apache2::SizeLimit->set_check_interval(10); is( $Apache2::SizeLimit::CHECK_EVERY_N_REQUESTS, 10, 'set_check_interval set global' ); } return Apache2::Const::OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache2/check_n_requests2.pm0000644000177200010010000000204712540623175025334 0ustar SteveNonepackage TestApache2::check_n_requests2; use strict; use warnings; use Apache2::Const -compile => qw(OK); use Apache::Test qw(-withtestmore); use Apache2::SizeLimit; use constant ONE_MB => 1024; use constant TEN_MB => ONE_MB * 10; use constant TWENTY_MB => TEN_MB * 2; my $i = 0; my %hash = (); sub handler { my $r = shift; plan $r, tests => 11; Apache2::SizeLimit->add_cleanup_handler($r); Apache2::SizeLimit->set_max_process_size(TEN_MB); ## this should cause us _NOT_ to fire Apache2::SizeLimit->set_check_interval(5); # We can assume this will use _at least_ 1MB of memory, based on # assuming a scalar consumes >= 1K. # and after 10 requests, we should be _at least_ 10MB of memory for (0..9) { my @big = ('x') x ONE_MB; $hash{$i++} = \@big; is($i, $i, "now using $i MB of memory (at least)"); } is( 1, Apache2::SizeLimit->_limits_are_exceeded(), "we passed the limits and will _NOT_ kill the child" ); return Apache2::Const::OK; } 1; mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache2/deprecated.pm0000644000177200010010000000167612540623175024034 0ustar SteveNonepackage TestApache2::deprecated; use strict; use warnings; use Apache::Test qw(-withtestmore); use Apache2::Const -compile => qw(OK); use Apache2::SizeLimit; sub handler { my $r = shift; plan $r, tests => 3; Apache2::SizeLimit::setmax( 100_000 ); is( $Apache2::SizeLimit::MAX_PROCESS_SIZE, 100_000, 'setmax changes $MAX_PROCESS_SIZE' ); Apache2::SizeLimit::setmin( 1 ); is( $Apache2::SizeLimit::MIN_SHARE_SIZE, 1, 'setmax changes $MIN_SHARE_SIZE' ); Apache2::SizeLimit::setmax_unshared( 1 ); is( $Apache2::SizeLimit::MIN_SHARE_SIZE, 1, 'setmax_unshared changes $MAX_UNSHARED_SIZE' ); return Apache2::Const::OK; } 1; __DATA__ PerlOptions +GlobalRequest SetHandler modperl PerlResponseHandler TestApache2::deprecated mod_perl-2.0.9/Apache-SizeLimit/t/response/TestApache2/zzz_check_n_requests.pm0000644000177200010010000000214012540623175026161 0ustar SteveNonepackage TestApache2::zzz_check_n_requests; use strict; use warnings; use Apache2::Const -compile => qw(OK); use Apache::Test qw(-withtestmore); use Apache::TestUtil; use Apache2::SizeLimit; use constant ONE_MB => 1024; use constant TEN_MB => ONE_MB * 10; use constant TWENTY_MB => TEN_MB * 2; my $i = 0; my %hash = (); sub handler { my $r = shift; plan $r, tests => 11; Apache2::SizeLimit->add_cleanup_handler($r); Apache2::SizeLimit->set_max_process_size(TEN_MB); ## this should cause us to fire Apache2::SizeLimit->set_check_interval(); # We can assume this will use _at least_ 1MB of memory, based on # assuming a scalar consumes >= 1K. # and after 10 requests, we should be _at least_ 10MB of memory for (0..9) { my @big = ('x') x ONE_MB; $hash{$i++} = \@big; is( $i, $i, "now using $i MB of memory (at least)" ); } is( 1, Apache2::SizeLimit->_limits_are_exceeded(), "we passed the limits and _WILL_ kill the child" ); return Apache2::Const::OK; } 1; mod_perl-2.0.9/Apache-Test/0000755000104000010010000000000012540623176016070 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/Changes0000644000104000010010000012653312540623176017375 0ustar AdministratorsNone=head1 NAME Changes - Apache::Test change logfile =head1 CHANGES =over 3 =item 1.39 Apr 21 2015 Test scripts can now test if perl has a fork() implementation available by using the Apache::Test::need_fork() function. [Steve Hay] CPAN RT#87620: Add -D APACHE2_4 to identify httpd-2.4. [Michael Schout] =item 1.38 Aug 6 2012 Fix log_watch.t on Windows, which can't (naturally) delete open files. [Steve Hay] Fix t_filepath_cmp, t_catfile and t_catfile_apache in Apache::TestUtil on Windows: their use of Win32::GetLongPathName() was broken for non-existent files. [Steve Hay] Remove use of Nullsv as per modperl commit 1362399. [Steve Hay] have Apache::TestConfigPerl::configure_inc set up @INC to include ../blib/lib and ../blib/arch if they exist. The bundled Apache::Reload may fail to load Apache2::Const & co otherwise when testing. [Torsten Foertsch] =item 1.37 January 29, 2012 Apache::TestRequest: improve compatibility for SSL requests with LWP 6 and IO::Socket::SSL, in particular [Kaspar Brand] As of httpd revision 1053230 (version 2.3.11) the NameVirtualHost directive became superfluous and a warning is issued when it is met. So, Apache::Test now wraps NameVirtualHost directives in blocks. [Kaspar Brand] Add comments about the source files of auto configurated tests to the generated httpd.conf and improve indentation a bit. [Torsten Foertsch] Run t/TEST tests by default in alphabetical order and only t/SMOKE tests by default in random order. [Rainer Jung] Add t_file_watch_for to Apache::TestUtil [Torsten Foertsch] Add $boolean parameter to Apache::TestHandler::ok and Apache::TestHandler::ok1 Add a few bits of documentation [Torsten Foertsch] Apache::TestHandler forgot to require Apache2::RequestRec [Torsten Foertsch] =item 1.36 February 2, 2011 Skip sok.t unless perlio is enabled [Torsten Foertsch] Deprecate t/TEST -times=X in favor of t/SMOKE -times=X. Changes to TAP::Harness have removed the ability to re-use test object attributes. Also generate t/SMOKE on build now, instead of requiring the user to build it. Thanks to Jim Jagielski for the spot on the -times=X issue on t/TEST. [Fred Moyer] More or less cosmetical, prevent repeating "adding source lib" info lines in the output when testing Apache::Test, SizeLimit and similar [Torsten Foertsch] =item 1.35 January 22, 2011 Return value on running tests as root should be 0, not 1. Thanks to Michael Schout for the spot. [Fred Moyer] Add support for RFC2253 DN string format to dn_oneline in Apache::TestSSLCA [Stefan Fritsch] Make Apache::Test::sok() compatible with the -withtestmore option [Torsten Foertsch] Make -withtestmore a per-package option (make it behave sane). [Torsten Foertsch] =item 1.34 December 18, 2010 Fix build edge case where rpm based mp sources missing Apache2::Build cause require failure in Apache-TestConfig. Reported by Ryan Gies. [Fred Moyer] When an explicit shared mod_perl lib is not defined, default to the first shared module found by find_apache_module(). [Fred Moyer] Fix logic error in TOP_LEVEL constant calculation. Remove Apache::test compatibility from mod_perl 1.27. [Fred Moyer] Remove the custom config feature, and instead use inline directives, ENV vars, and look for apxs et al in PATH. [Fred Moyer] Prevent reconfiguration when t/TEST is called with -run-tests only. (rev 1004278) [Torsten Foertsch] Make "t/TEST -ping=block" work when LWP is installed. (rev 1004275) [Torsten Foertsch] Don't attempt to run the test suite as root. The workarounds needed to facilitate root testing cause large maintenance costs, and return no tangible benefits. [Fred Moyer] =item 1.33 September 14, 2010 Propagate APACHE_TEST_NO_STICKY_PREFERENCES to the Apache environment for mod_perl configurations (Apache::TestConfigPerl), http://www.gossamer-threads.com/lists/modperl/dev/101929 [Torsten Foertsch] Provide build/test environment for modules bundled with mod_perl like Apache::Reload and Apache::SizeLimit [Torsten Foertsch] The CN in server certificates generated by Apache::TestSSLCA will now match the servername passed to t/TEST. [Joe Orton] Add check for automated testing environment variable before prompting with EU::MM to quit the test suite. Some automated smoke tests were failed because the EU::MM prompt was timing out. [Adam Prime, Fred Moyer] https://rt.cpan.org/Public/Bug/Display.html?id=32993 use TAP::Harness for Apache::TestHarnessPHP [Mark A. Hershberger] https://rt.cpan.org/Public/Bug/Display.html?id=54476 Fix error where non root user gets test failure with httpd suexec and mod_fcgid [Peter (Stig) Edwards] =item 1.32 April 15, 2010 Fix issue with recent feature where lack of libapreq resulted in test failure. [Philippe M. Chiasson] Added t_{start,read,finish}_file_watch to Apache::TestUtil [Torsten Foertsch] =item 1.31 February 24, 2010 Modify need_cgi so that it looks for cgi.c instead of cgi. This is a fix for the case insensitive filesystem correction listed below. [Phillipe M. Chiasson] t/next_available_port.t doesn't need mod_cgid, use need_cgi instead of need_module('mod_cgi.c') [Philippe M. Chiasson] PR: 21554 Load mod_apreq2.so if it is available [Derek Price, ] Add conditional to ignore IfVersion directive if mod_version is not built. [Adam Prime , Fred Moyer ] PR: 41239 t/TEST -ping does not return a valid return code to the calling shell [ozw1z5rd ] Prevent infinite loop when no default apxs or httpd is present and repeated attempts to run the test suite under an automated harness (such as a cpan smoke test). Issue reported by CORION and ANDK, PR: 12911 [Fred Moyer ] Use need_module('mod_cgi.c') and need_module('mod_cgid.c') in t/next_available_port.t instead of need_cgi. On case insensitive file systems such as OS X, need_cgi will fulfill the requirement with cgi.pm, when mod_cgi.c is the desired requirement. [Fred Moyer ] Fix overridden get_basic_credentials test when using NTLM authentication [Rick Frankel ] Work around a bug introduced in libwww-perl in version 5.820 for httpd's credentials [Gunnar Wolf , Niko Tyni ] Make Apache::TestConfig::untaint_path tolerate undefined arguments [Torsten Foertsch ] =item 1.30 November 26, 2007 Added t_write_test_lib for temporary testing packages [Fred Moyer ] Fix syntax error in generated PHP files t/conf/*.php.in [Philippe M. Chiasson] Add bwshare.so to the list of modules to not inherit b/c it rate limits requests to less then that of a test suite. PR: 25548 [imacat ] Add EXTRA_CFLAGS to c-module building if defined in the environment [Geoffrey Young] =item 1.29 November 28, 2006 Require a minium of Module::Build 0.18 when using Apache::TestMB. PR: 19513 [Philip M. Gollucci] Teach Apache::TestClient to encode spaces(' ') in query string of URLs as %20. This is not a full mapping of ASCII to URL encoding. If you need this, install LWP -- then Apache-Test will use LWP -- which does this for you. [Philip M. Gollucci] Allow Apache::TestClient which is used when LWP is not installed to accept mutiple headers of the same name. [Philip M. Gollucci] Add t_start_error_log_watch() and t_finish_error_log_watch() to the Apache::TestUtil API which are only exported unpon request. [Torsten Foertsch ] Allow version variants of debuggers to be passed as arguments to -debug. i.e. -debug=gdb65 for systems with multiple versions of the same debugger. [Philip M. Gollucci] On Win32, the Apache executable is called httpd.exe in Apache/2.2, so let Apache::TestConfig try to find that if Apache.exe isn't found [Randy Kobes] force reconfiguration if existing configuration was generated by an older version of Apache-Test [Geoffrey Young] the -t_pid_file code resulted in confusing and fatal error message for people using stale 1.27 configurations. so take steps to make sure things continue to work. [Geoffrey Young] =item 1.28 - February 22, 2006 add need_imagemap() and have_imagemap() to check for mod_imap or mod_imagemap [ Colm MacCárthaigh ] shortcuts like need_cgi() and need_php() no longer spit out bogus skip messages [Geoffrey Young] Adjust Apache::TestConfig::untaint_path() to handle relative paths that don't start with /. [Stas] If perlpath is longer than 62 chars, some shells on certain platforms won't be able to run the shebang line, so when seeing a long perlpath use the eval workaround [Mike Smith ] Location of the pid file is now configurable via the command line -t_pid_file option [Joe Orton] remove the mod_perl.pm entry from %INC after Apache::Test finishes initializing itself. because both mp1 and mp2 share the entry, leaving it around means that Apache::Test might prevent later modules from loading the real mod_perl module they're interested in, leading to bad things [Geoffrey Young] use which("cover") to find the cover utility from Devel::Cover and run it only if found. [Stas] Devel::Cover magic is now fully integrated. no more modperl_extra.pl or extra.conf.in fiddling - 'make testcover' should be all you need to do now [Geoffrey Young] Implemented a magic @NextAvailablePort@ to be used in config files to automatically allocate the next available port [Stas] Adjust Apache::TestConfig::add_inc to add lib/ in separate call to lib::->import at the very end of @INC manipulation to ensure it'll be on top of @INC. For some reason lib has changed to add directories in a different order than it did before. [Stas] =item 1.27 - October 20, 2005 localize ScriptSock directive to always point to t/logs/cgisock regardless of inherited and custom mod_cgid settings [Geoffrey Young] Prevent the config file from being overwritten on platforms such as WIN32 under certain conditions. [Randy Kobes] make sure that the TESTS Makefile.PL parameter is properly recognized ["Christopher H. Laco" ] Add the output of ldd(unix/cygwin) and otool -L (darwin) for httpd to the mp2bug report script. [Philip M. Gollucci] fall back on using httpd-defined HTTPD_ROOT as the base for httpd.conf if all other options fail. [Geoffrey Young] =item 1.26 - July 25, 2005 some people have their Apache user/group names include spaces, so fix the autogenerated httpd.conf to quote the two. [Stas] make sure mp2 loading doesn't make it impossible to complete mp1 runs. [Matt Sergeant, Geoffrey Young] add Apache::TestConfigParrot and Apache::TestRunParrot to support mod_parrot server-side testing [Geoffrey Young] update -withtestmore action to properly work with newer versions of Test::Builder [Geoffrey Young] =item 1.25 - June 17, 2005 provide $Apache::TestUtil::DEBUG_OUTPUT as target for t_debug() statements, defaulting to STDOUT. this allows for changing t_debug() to STDERR when using functions like t_write_file() from within handler() server-side tests. [Geoffrey Young] adjust need_module()/have_module() to not try to require a module if it was explicitly passed with a .c extension. in certain cases this prevents a fatal error (e.g. trying to call Apache::Test::have_module('mod_alias.c') from the sections. [Stas] =item 1.24 - May 20, 2005 When adding TypesConfig directives (either inherited from the global httpd.conf or from the locally generated mime.types) make sure to enclose it in .., since mod_mime might be unavailable. [Stas] =item 1.23 - May 3, 2005 Fix Apache::TestRequest::hostport to return the default host:port string if $Apache::TestRequest::Module is 'default' or undef [Stas] Fix Apache::TestRequest::module2url to allow passing '' as a URI path. [Stas] tweaks to Apache::TestClient to better deal with corrupted responses when LWP is not available. [Stas] =item 1.22 - April 14, 2005 ******************** IMPORTANT ******************** this version of Apache-Test does not completely configure mod_perl for mod_perl versions 1.99_21 or earlier. Please read the below changes carefully. *************************************************** remove Apache::TestConfig::modperl_2_inc_fixup(). Apache-Test is no longer Apache2.pm aware - it will not configure mod_perl support to look in Apache2/ automatically. [joes] Add support for mp2's Apache:: -> Apache2:: rename [joes] =item 1.21 - March 23, 2005 fix Apache::TestConfig (was missing 'use lib' before using lib::import) [William McKee ] TestConfigPerl will now configure mod_perl last, giving mod_perl highest priority throughout the httpd lifecycle. [Geoffrey Young] Apache::TestConfig::untaint_path needs to remove empty entries in the PATH list, since -T considers those tainted too. [Stas] add Apache::TestHarnessPHP which allows for running client-side scripts via php instead of perl. [Geoffrey Young] =item 1.20 - January 22, 2005 instead of trying to match various custom server name variations (each vendor seems to replace "Apache" in 'httpd -v' with their own name), just try to match the "/x.y" in "Foo-Apache-Bar/x.y.z" to figure out the server generation (rev). [Stas] extend Apache::TestConfig::which() to search under perl's bin directory (in the case of local perl install many utils get installed there, but won't be in PATH). [Stas] Apache::TestConfig::inherit_load_module handles .dll modules (previously was only .so) [Stas] Apache::TestConfig::should_skip_module now works with regex patterns. [Stas] =item 1.19 - January 5, 2005 Test for module.c instead of module.so for IfModule in find_and_load_module [Chia-Liang Kao ] Apache-Test/META.yml is excluded from mp2 distro to make PAUSE indexer happy, but then perl Makefile.PL complains about a missing META.yml, so autogenerate it if it wasn't in the distro [Stas] =item 1.18 - December 23, 2004 fix a bug in A-T config generation, when a vhost entry was in autogenerated httpd.conf (e.g. coming from .pm file) and another from extra.conf.in. We used to have a ports collision, since extra.conf wasn't reparsed and the same port was getting assigned to more than one vhost entry, preventing server startup: default_ VirtualHost overlap on port 8530, the first has precedence (98)Address already in use: make_sock: could not bind to address 0.0.0.0:8530 no listening sockets available, shutting down could be reproduced with t/TEST -conf followed by t/TEST -maxclients 1 in the mp2 test suite (or the new Apache-TestMe test suite, which now includes a special setup for this bug). [Stas] new TestConfig wrapper find_and_load_module [Chia-Liang Kao ] add Apache-TestItSelf and Apache-TestMe sub-projects. [Stas] add various straps to aid the new Apache-TestItSelf sub-project, which is used to test A-T config options [Stas] avoid entering endless loops when interactive config is used, by restarting the test suite with an explicit selected arguments for -httpd (and optionally -apxs) [Stas] META.yml is now locally maintained. we need to tell PAUSE indexer not to try to index HTTP::Request::Common and warnings packages, which happen to be used by A-T [Stas] =item 1.17 - December 11, 2004 Apache::TestHandler: need to load Apache::RequestIO for mp2 for puts() to work [Stas] new Apache::TestConfig wrapper untaint_path() [Randy Kobes] fix the config thaw() functionality (when top_dir wasn't in @INC the saved config won't be loaded and tests will blow) [Stas] new wrapper Apache::TestRequest::module2url to simplify handling of vhosts in the client. ["Christopher H. Laco" ] resolve -T taint issues: [Stas] - untaint $cmd in Apache::TestConfig::open_cmd - fix the tainting of @INC (by untaintinig top_dir variable) require Cwd 2.06 or higher (to solve File::Spec::rel2abs problems under -T). Enforce the modules version requirements for those who aren't running under CPAN/CPANPLUS shell) [Stas] Apache::TestTrace: don't export by default the 'todo' utility's symbol since it collides with Test::More [Stas] Tweak the handling of mp2 source build case in Apache::TestConfig::httpd_config(), apparently mp2 source build doesn't always know where httpd/apxs are, so we need to give a better error message in this particular case. [Stas] Add cookie jar tests ["Christopher H. Laco" ] Don't run interactive prompts when STDIN is closed [Stas] Add LockFile directive in the autogenerated httpd.conf, which points to t/logs, to handle the case where LockFile is hardcoded at compile time to some other directory on the system. [Stas] =item 1.16 - November 9, 2004 launder the require()d custom config filename to make -T happy [Torsten Förtsch ] added Apache::TestRunPHP and Apache::TestConfigPHP classes, which provide a framework for server-side testing via PHP scripts [Geoffrey Young] fix problem with multiple all.t files where only the final file was being run through the test harness. [Geoffrey Young] Documented that redirection does not work with "POST" requests in Apache::TestRequest unless LWP is installed. [David Wheeler] Separated the setting of the undocumented $RedirectOK package variable by users of Apache::TestRequest from when it is set internally by passing the "requests_redirectable" parameter to the user_agent() method. This allows users to override the behavior set by the user_agent() method without replacing it. [David Wheeler] =item 1.15 - October 22, 2004 add need_php4() and have_php4() which will return true when mod_php4 is available. also, tidy up need_php() and have_php() for PHP4 on Apache 2.0. [Joe Orton] add new test_config make target, equivalent to t/TEST -conf, and make it a prerequisite for the cmodules make target. now you can 'make cmodules' to build the things in c-modules/ without running t/TEST -conf first. [Geoffrey Young] add -withtestmore import action, which allows Test::More >= 0.49 to replace Test.pm as the engine for server-side tests [Geoffrey Young] add automatic core dump backtrace generation in t/REPORT if Devel::GDB is installed [Gozer] add 'testcover' make target for running tests with Devel::Cover [Geoffrey Young] =item 1.14 - October 12, 2004 improve the same_interpreter framework to handle response failures while trying to init and later find out the same interpreter. [Stas] make sure that 'make distclean' cleans all the autogenerated files [Stas] make sure that if -maxclients option is passed on the command line, minclients will never be bigger than that value [Stas] add -one-process runtime argument, which will start the server in single-server mode (httpd -X in Apache 1.X or httpd -D ONE_PROCESS in 2.X) [Geoffrey Young] In open_cmd, sanitize PATH instead of clearing it [Gozer] Allow / \ and \\ path delimiters in SKIP file [Markus Wichitill ] Added an apxs query cache for improved test performance [Gozer] run_tests make target no longer invokes t/TEST -clean, making it possible to save a few development cycles when a full cleanup is not required between runs. [Geoffrey Young] Apache::TestSmoke imrovements: [Stas] o the command line option -iterations=N should always be respected (previously it was internally overriden for order!='random'). o since IPC::Run3 broke the Ctrl-C handler, we started to loose any intermediate results, should the run be aborted. So for now, try to always store those results in the temp file: smoke-report...$iter.temp fix 'require blib' in scripts to also call 'blib->import', required to have an effect under perl 5.6.x. [Stas] don't allow running an explicit 'perl Makefile.PL', when Apache-Test is checked out into the modperl-2.0 tree, since it then decides that it's a part of the modperl-2.0 build and will try to use modperl httpd/apxs arguments which could be unset or wrong [Stas] Fix skip test suite functionality in the interactive configuration phase [Stas] s/die/CORE::die/ after exec() to avoid warnings (and therefore failures) when someone overrides CORE::die when using Apache-Test [William McKee, Stas] Overrode Module::Build's "testcover" action in Apache::TestMB to prevent the Apache::Test sticky preference files from being included in the coverage report. [David] =item 1.13 - Aug 20, 2004 move the custom config code into Apache::TestConfig, split the config object creation in 2 parts - first not requiring the knowledge of httpd location, the second requiring one, refactor the custom config interactive prompting into the second phase, if failed to find httpd. Reshuffle the code to run first bits not requiring the knowledge of httpd location. [Stas] fix Apache::TestCommonPost::lwp_do to work with LWP 5.800 ($res->content() doesn't allow CODE refs anymore, instead used content_ref to avoid huge strings copy) [Stas] add @PHP_MODULE@ extra.conf.in substitution variable, which selects mod_php4 or mod_php5 as appropriate. [Geoffrey Young] the have() function was removed entirely - use need() instead. [Geoffrey Young] add need() and need_* variant functions (need_module(), need_apache(), etc) for use specifically with plan() to decide whether or not a test should run. have_* variants (have_module(), have_apache(), etc) are now specifically for use outside of plan(), although they can continue to be used within plan() without fear of current tests breaking. [Geoffrey Young] add need_php() and have_php() which will return true when either mod_php4 or mod_php5 are available, providing functionality similar to need_cgi() and have_cgi(). [Geoffrey Young] Add APACHE_TEST_EXTRA_ARGS make variable to all invocations to t/TEST to allow passing extra arguments from the command line. [Gozer] When APACHE_TEST_NO_STICKY_PREFERENCES=1 is used don't even try to interactively configure the server, as we don't save any config it was entering an infinite loop. [Stas] If a directory t/lib exists from where the tests are run, adjust @INC so that this directory is added when running the tests, both within t/TEST and within t/conf/modperl_inc.pl. This allows inclusion of modules specific to the tests that aren't intended to be installed. [Stas, Randy] make a special case for threaded mpm configuration, to ensure that unless maxclients was specified, MaxClients will be exactly twice bigger than ThreadsPerChild (minclients), since if we don't do that, Apache will reduce MaxClients to the same value as ThreadsPerChild. [Stas] Renamed generate_test_script() to generate_script() in Apache::TestMB to match the naming convention used in Apache::TestMM and elsewhere. [David] Apache::TestMB now only prints the "Generating test running script" message if verbosity is enabled (e.g., by passing --verbose when executing Build.PL). [David] Fixed the "requests_redirectable" parameter to Apache::TestRequest::user_agent() so that it works as docmented when passed a negative value. [Boris Zentner] Documented support for passing an array reference to the "requests_redirectable" parameter to Apache::TestRequest::user_agent() to be passed to LWP::UserAgent if LWP ist installed. [David] =item 1.12 - June 28, 2004 Force projects that use Apache::TestReportPerl to implement report_to() if they use t/REPORT in their projects. [Stas] Add redirect tests [David Wheeler ] add -no-httpd runtime option to allow tests to run without configuring, starting, or stopping Apache. this essentially provides a direct Test::Harness interface through t/TEST, useful for running single tests that do not depend on Apache. [Geoffrey Young] Add support for Module::Build, with a new module: Apache::TestMB (a "clone" of Apache::TestMM for ExtUtils::MakeMaker). [David Wheeler ] switch the order of arguments in t_cmp() and t_is_equal() so that the order matches Test::More::is() and other Test::More functions. the new call is: t_cmp($received, $expected, $comment); support for $expected as the first argument marked as deprecated and will be removed in the course of the next few release cycles. [Geoffrey Young] add skip_reason() to Apache::Test, which provides a mechanism for user-specified skip messages [Geoffrey Young] Tweak Apache::TestRun to support test filenames starting with /(.\\)?t\\/ prefixes, windows style (needed for t/SMOKE) [Steve Hay] =item 1.11 - May 21, 2004 if we fail to match the Apache revision (which is OK at the early stages, like 'perl Makefile.PL', default to a non-existing revision 0. But provide no more misleading defaults (used to default to revision 2 and then looking for mod_perl2). [Stas] Improve the regex to match the Apache revision out of 'httpd -v' [Michael A Nachbaur ] -minclients is now what -maxclients used to be, -maxclients is now really what it says it is [Stas] Fix Apache::TestRequest::lwp_as_string to work with LWP 5.79 [Stas] =item 1.10 - April 18, 2004 Quote and escape the executables in the shell calls [Ken Coar, Stas] Quote and escape filtered args received during 'perl Makefile.PL' [Geoffrey Young, Ken Coar] add :withtestmore import tag to Apache::Test, which will export all standard Apache::Test symbols except those that collide with Test::More. [Geoffrey Young] Use function prototypes in Apache::TestUtil functions t_cmp() and t_is_equal() to handle the case when an argument to the function, is a function call itself which may return undef (previously had to explicitly force a scalar context to get the undef value). The idea was borrowed from Test::More. [Stas] Fixed a Windows-only segment which would result in a 'use of uninitialised value' error if a hash being traversed had an entry with a key but an undefined value. [Ken] Support continuous configuration line when parsing the inherited configuration file [Stas] Since some of the inherited from the global httpd.conf modules require mod_perl to be loaded first, arrange for that to happen. [Stas] Don't try to set ulimit unlimited for coredumps on Solaris, unless run as root [Rob Kinyon ] Added '-httpd_conf_extra ' configuration option to allow a file of server config directives to be inherited in addition to the server's own httpd.conf file (or the one specified by -httpd_conf). [Ken and Stas] Generated Listen directive now listen on 0.0.0.0 to force using IPv4 addresses on IPv6 systems until LWP supports IPv6. [Gozer] improved docs [David Wheeler ] Add a virtual method Apache::TestRun::pre_configure, and fix the documentation to say that subclasses must not forget to run the superclass' method. [Stas] Apache::TestRunPerl now performs an early check whether it can load the right mod_perl environment. [William McKee , Stas] $ENV{APACHE_TEST_NO_STICKY_PREFERENCES}, if true, will both suppress generation of persistent preferences and ignore any that already exist. [Geoffrey Young] make the project's test suite relocatable, handling the case where after Apache-Test configuration was created and not cleaned up before the directory was moved. This is especially important for those cases where users try to run 'make test' as root from /root, A-T tells them that they can't do that (because of the perms) and suggests to try again, afer moving the whole project under /tmp or similar. [Stas] When running as 'root' make the client side drop the root permissions and run with the same permissions as the server side (e.g. nobody). This is needed in case the client side creates any files after the initial check (during server side startup and beyond), so that the server side could read/write them. [Stas] t_server_log_error_is_expected t_server_log_warn_is_expected t_client_log_error_is_expected t_client_log_warn_is_expected now support an optional argument, suggesting how many entries to expect [Stas] =item 1.09 - March 8, 2004 remove the dependency on APR::UUID (i.e. mod_perl 2.0) in the same_interpreter framework (use plain time/rand/$$ concatenation) [Stas] Updated to the new Apache License Version 2.0 [Gozer] handle cases on Win32 when supplied paths have spaces in their names [Stas] c-modules build errors are no longer ignored [Stas] change -DAPACHE1 (and like defines) to -D APACHE1 to fix Win32 compatibility issues [Steve Hay] fix the custom config use for Apache-Test's own upgrades [Stas] =item 1.08 - February 24, 2004 Instead of hard-coding listen directive to 127.0.0.1, use the server name. [Gozer] added -defines configuration option, providing a way to pass additional -D names to the server for use in blocks. [Geoffrey Young] Make it possible to run TEST (or another driving script) from any path (e.g. t/TEST, ./TEST, /full/path/to/t/TEST) [Stas] If at least one *conf*.in files is modified since the last configuration, make sure to regenerate them all, so the right ports will be assigned. [Stas] Make sure that Apache-Test modules are installed into INSTALLSITEARCH during a standalone build. Because EU::MM does so when A-T is bundled with mp2, and we want to avoid having A-T installed in two different places under @INC. [Stas] HTTP/0.9 responses no longer croak, provided $ENV{APACHE_TEST_HTTP_09_OK} is true. [Geoffrey Young] Hard-code listen directive to 127.0.0.1, solving problems for people with IPv4 & IPv6 address until a better solution is found. [Gozer] prefix Apache::TestTrace (non-colour mode) messages with the loglevel, similar to what Apache does. [Stas] Instrument A-T with an optional successful (shell-wise) abort of the test suite, by asking the user whether they want to continue w/o completing the test suite. Use it in places where we know that the test suite will certaionly fail (e.g. running from /root as 'root', or not providing httpd/apxs locations). [Stas] In order to make Apache-Test compatible with the rest of Perl testing frameworks, we no longer chdir into t/, but run from the root of the project (where t/ resides). A test needing to know where it's running from (e.g. to read/write files/dirs on the filesystem), should do that relative to the serverroot, documentroot and other server configuration variables, available via Apache::Test::vars('serverroot'), Apache::Test::vars('documentroot'), etc. [Stas] Apache::Test::vars() can now query for config arguments [Stas] generate t/conf if it does not already exist, which it may not if the tests are entirely autoconfigured. [Geoffrey Young] Special to Apache-Test environment variables: APXS APACHE APACHE_GROUP APACHE_USER APACHE_PORT are now moved to: APACHE_TEST_APXS APACHE_TEST_HTTPD APACHE_TEST_GROUP APACHE_TEST_USER APACHE_TEST_PORT respectively, for consistency with other APACHE_TEST_ env vars and in order not to interfere with other projects that may use the same env vars. [Stas] if $self->{reconfigure} is true, make sure to perform a complete reconfiguration, to solve the bug where conf.in files weren't reparsed and vhost hostport info was getting lost on subsequent runs when APACHE env var was set (one of the cases when $self->{reconfigure} is true). [Stas] handle "Include conf/*conf" cases when inheriting httpd.conf in a cleaner way, don't complain that "*conf" doesn't exist, since it's a glob pattern. Instead check try to resolve the base directory. [Stas] import the Apache::TestMM clean target in Makefile.PL so 'make clean' will call t/TEST -clean [Stas] fix have_apache_version(), have_min_apache_version(), and have_min_module_version() to use proper numeric version strings in comparisons. thanks to Rafael Garcia-Suarez for the spot. [Geoffrey Young] fix Apache::TestConfig::which to check that the found file is a plain file [Stas] implementing custom interactive and non-interactive (with the -save option) reusable configuration for -httpd, -apxs, -user, -group, and -port [Randy Kobes, Stas] =item 1.07 - Decemeber 22, 2003 allow conditional C module compilation on a more granular level. #define HTTPD_TEST_REQUIRE_APACHE 2.0.49 is now recognized. [Geoffrey Young] Another attempt at providing a test function that verifies whether Apache when switching from 'root' to 'nobody' or another user will be able to access and create files under the t/ directory. This time using perl's vars $(, $< since POSIX equivalents seem to be broken on some systems. Also using a better test that actually tries to write/read/execute in the path under test. [Stas] Cleanly exit (and complain) if the default hostname resolution has failed (usually due to a missing localhost entry in /etc/hosts) [Stas] Fix Apache::TestConfigParse to handle quoted Include arguments [Stas] Fix Apache::TestServer::wait_till_is_up not to bail out if the server takes time to start and LWP is not available. [Stas] Fix Apache::TestConfigParse to handle glob includes, like Include conf/*.conf on RedHat [Philippe M. Chiasson] Fix Apache::TestConfig::add_config not to append " " at the end of the config lines. This was a problem with config sections imported from .pm files, the appended "" made it impossible to have multi-line directives using \ [Stas] Fix a bug in '-port select' which was incorrectly using the same port twice [Stas] added bugreport and file argument options to Apache::TestRun::generate_script() [Geoffrey Young] =item 1.06 - November 10, 2003 added -startup_timeout and $ENV{APACHE_TEST_STARTUP_TIMEOUT} as places to specify the maximum number of seconds to wait for the test server to start. the default is still 60 seconds. [Geoffrey Young] use apxs PREFIX to resolve relative httpd.conf directives ServerRoot is not present [Mike Cramer] add support for a new subclass method 'bug_report', which if provided will be called when 'make test' fails. we use it in mod_perl to print the pointers on how to proceed when the failure occurs. [Stas] sudo and su -u aren't portable, therefore use a simple setuid/setguid perl program instead, to check whether the root directory of the test suite is rwx by the user/group apache is going to run under (when running 'make test' as root). [Stas] =item 1.05 - October 23, 2003 core scanning changes [Stas] - speedup by not chdir'ing into subdirs - an optional scanning of only t/ dir (used by TestSmoke) - don't scan on win32, since it has no core files in the autogenerated t/conf/modperl_inc.pl don't add the project/lib directory, unless a special env var APACHE_TEST_LIVE_DEV is true. This is because some projects change things in project/blib and pushing project/lib on top of @INC, breaks the test suite for them [Stas] TestRun was using httpd.pid file to ensure that the server is killed before starting it, if the file existed. This was a problem on win32 platforms, where a process scheduler tries to re-use the pids that were just freed, which may have killed a valid process which is not even Apache.exe. So we try not to rely on that file, and if the server wasn't properly stopped and still running, users will learn about that, since the port will be busy, and Apache will fail to start. Users have to kill it manually. TestSmoke is no longer using an explicit kill `cat httpd.pid` to stop Apache, but delegates the stopping procedure to TestRun [Steve Hay, Randy Kobes] use IPC::Run3 in Apache::TestSmoke to run t/TEST commands, so as t/SMOKE can be used on Win32 [Stas, Steve Hay, Randy Kobes] place mod_perl-specific directives in containers within httpd.conf, allowing the default server to start if mod_perl isn't present. [Geoffrey Young] fix t/request.t to get /index.html, instead of / since not everybody uses mod_dir [Steve Piner ] when testing whether Apache started as root and running under 'nobody' or alike, will be able to -r/-w/-x in t/ use 'su' instead of 'sudo', the latter is not available on all unix platforms. [Vivek Khera ] in the Apache/test.pm nuke code s/PERLRUN/FULLPERL/ as older MakeMaker doesn't have the PERLRUN target [Stas] Apache 1.3 servers now run in standard prefork mode under normal operation. single server mode (httpd -X) was replaced with MaxClients set to 1 by default. [Geoffrey Young] =item 1.04 - September 29, 2003 if the server stops reading from the client before it has sent all its data, Apache::TestClient (which is used when LWP is not available) would just die without any error message (5.8.1) because no SIGPIPE handler was setup and the Broken Pipe error was missed. Replacing 'print $s' with $s->send() solves this problem: Apache::TestClient will just move on without bailing out. [Stas] if env var APACHE_TEST_PRETEND_NO_LWP is true, Apache::Test will pretend that LWP is not available. useful for testing whether the test suite will survive on a system which doesn't have libwww-perl installed. [Stas] Apache::TestSmoke provides a new mode: -bug_mode, which runs an equivalent of plain 't/TEST' but generates a lot of useful debug information, in addition to matching the core files to the tests that caused them. [Stas] Apache::TestSmoke now scans for core files, just like Apache::TestRun does [Stas] Allow the creation of name based virtual hosts by supplying containers in .conf.in$ files. [André Malo] fix Apache::TestSSLCA to generate a separate index.txt file for each module, as on certain platforms openssl fails to re-use the same file. [Stas] remove the unused example section from t/conf/extra.conf.in, it made an assumption that mod_auth is available [Stas] in the autogenerated t/conf/httpd.conf include mod_alias and mod_mime loading, in case they were built as a shared object and wasn't loaded from the system-wide httpd.conf from which Apache::Test inherits the config. [Stas] added have_apache_mpm() function [Geoffrey Young] when moving test-specific config directives from __DATA__ to httpd.conf don't use hash, or the order of arguments is not preserved. Thanks to perl-5.8.1 for randomizing the hash seed, which has exposed the bug by breaking the test suite. [Stas] when the tests are run in the 'root' mode, check whether the DocumentRoot and its parent dirs are rwx before the tests are run and suggest possible workarounds when the tests are doomed to fail, because of the permission issues. [Stas] UPLOAD is now auto-exported, like the rest [David Wheeler ] Change the way the redirect_ok parameter works so that it affects only _that call_ to the function. Afterward it should revert to the old value of $RedirectOK. [David Wheeler ] Change user_agent() so that the LWP::UserAgent "requests_redirectable" parameter actually does something useful vis-à-vis $RedirectOK. [David Wheeler ] Apache::TestRequest API documenation [David Wheeler ] Enable TransferLog in the autogenerated httpd.conf only if mod_log_config is available [Stas] =item 1.03 - June 19, 2003 Instrumented Makefile.PL to unconditionally remove any old pre-installed occurrences of Apache/test.pm, which has been renamed to Apache/testold.pm in mod_perl 1.28 to avoid collisions with Apache/Test.pm on case-insensitive systems. [Stas] Apache::TestClient now handles correctly responses with no body and its response header() method is no longer case-sensitive [Stas] add skip helper shortcuts: have_min_perl_version, have_min_module_version [Stas] pass to 'use lib' only 'lib/' dirs that actually exist in autogenerated t/TEST t/SMOKE and others. [Stas] add the ASF LICENSE file to the distro [Stas] get rid of Apache::TestTrace's dependency on Apache::TestConfig as it creates too many circular use() problems. [Stas] wrap blib loading in eval block (added to autogenerated files), to prevent 'make clean' failures. [Stas] add two more variants of each of the tracing functions. If the '_mark' suffix is appended (e.g., 'error_mark') the trace will start with the filename and the line number the function was called from. If the '_sub' suffix is appended (e.g., 'error_info') the trace will start with the name of the subroutine the function was called from. [Stas] add support for a new env var APACHE_TEST_TRACE_LEVEL, used to override the tracing level. It propogates the overriden (either by env var APACHE_TEST_TRACE_LEVEL or -trace option) value to the server-side, so we can use Apache::TestTrace in mod_perl handlers, and be able enable/disable tracing from the commmand line. This way we don't have to comment out debug prints. [Stas] =item 1.02 not released =item 1.01 - May 1, 2003 improved support for 3rd party modules test configuration setup: automatically include 'use blib' in autogenerated t/TEST and add 'use Apache2' in the startup file for mod_perl 2.0. [Stas] new configuration option: -libmodperl [path/to/]mod_perl.so (so one can build several DSO objects, rename them, so several builds can co-exist under the same LIBEXECDIR and test them all. Mainly useful for testing 3rd party modules, with different mod_perl DSO builds. [Stas] set $Apache::Test5005compat::VERSION because of the bogus warnings generated by EU::MM::parse_version() when it sees $NOT_THIS_MODULE::VERSION [Randal L. Schwartz ] a few fixes in Makefile.PL and t/TEST.PL to work with perl-5.005_03 [Stas] perlpods are found either in the 'pods/' or 'pod/' subdirs [Randal L. Schwartz ] Autoconfigure Alias /getfiles-* only if the corresponding targets exist [Stas] =item 1.00 - Apr 28, 2003 when inheriting httpd.conf on some platforms SERVER_CONFIG_FILE is an absolute path, so try to use that if found. [Haroon Rafique ] new Apache::Test functions: have_min_apache_version - to require a minimal Apache version. have_apache_version - to require a specific Apache version. [Stas] Apache::TestUtil API change: write_perl_script => t_write_perl_script write_shell_script => t_write_shell_script chown => t_chown All 3 functions are now optionally exported [Geoffrey Young]. Provide a new request macro _BODY_ASSERT to replace _BODY in cases where the client part of the test directly prints to the output, in order to avoid skipped tests instead of reporting the failure of the server side. Use it in automatically generated tests. [Stas] httpd (1.3 && 2) / winFU have problems when the first path's segment includes ':' (security precaution which breaks the rfc) so we can't use /TestFoo::bar as path_info in Apache::Tests. Adjusting all tests to use /TestFoo__bar. [Stas] change Apache::TestConfig::filter_args to accept arguments which aren't only key/value pairs, but also tokens like 'FOO=1' [Stas] In autogenerated t/TEST, make sure not to include 'use Apache2' for the mod_perl 2.0 build itself [Stas] avoid starting httpd with 'Group root' when running the test suite under root [Stas] add support for 'make test TEST_VERBOSE=1 "TEST_FILES=foo bar"' [Stas] Apache::Test now can run 'make test' under 'root', without permission problems (e.g. when files need to be written), it'll chown all the files under t/ to the user chosen to run the server with, before running the tests and will restore the permissions at the end. [Stas] don't inherit loading of the mod_perl object from the system-wide config, since Apache::TestRunPerl already configures it [Stas] Support two new shortcuts for skip functionality: - have_threads: checks whether both Apache and Perl support threads - under_construction: to print a consistent/clear skip reason [Stas] Support blocks in .pm files, so we can have a full manual control over generated config sections. These sections are fully parsed and variables are substituted, including vhosts. [Stas] Implement a more robust autogenerated client .t test in Apache::TestConfigPerl. Before this fix if the server side returned 500, the test would get skipped, not good. Now it will die a horrible death. [Stas] Before v1.0 most changes were logged in modperl-2.0/Changes (see mod_perl <= v1.99_08). =back mod_perl-2.0.9/Apache-Test/CONTRIBUTORS0000644000177200010010000000130412540623176016045 0ustar SteveNoneApache-Test was originally developed by: Doug MacEachern Now maintained by: Fred Moyer Philip M. Gollucci with contributions from the following helpful people (in alphabetical order): Alessandro Forghieri David Wheeler Gary Benson Geoffrey Young Ken Williams Randy Kobes Rick Myers Stas Bekman Steve Hay Steve Piner Tatsuhiko Miyagawa mod_perl-2.0.9/Apache-Test/INSTALL0000644000177200010010000000072512540623176015224 0ustar SteveNoneto install this module simply follow the canonical procedure for installing any perl module $ tar zxvf Apache-Test-1.XX.tar.gz $ cd Apache-Test-1.XX $ perl Makefile.PL $ make $ sudo make install if you want to run the tests contained within the distribution you can point to a suitable Apache distribution via $ perl Makefile.PL -httpd /path/to/your/apache/bin/httpd $ make $ make test $ sudo make install for further directions, see the README. mod_perl-2.0.9/Apache-Test/lib/0000755000104000010010000000000012540623173016633 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/lib/Apache/0000755000104000010010000000000012540623176020017 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/lib/Apache/Test.pm0000644000104000010010000007230412540623176021302 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::Test; use strict; use warnings FATAL => 'all'; use Exporter (); use Config; use Apache::TestConfig (); use Test qw/ok skip/; BEGIN { # Apache::Test loads a bunch of mp2 stuff while getting itself # together. because we need to choose one of mp1 or mp2 to load # check first (and we choose mp2) $mod_perl::VERSION == 2.0 # just because someone loaded Apache::Test. This Is Bad. so, # let's try to correct for that here by removing mod_perl from # %INC after the above use() statements settle in. nobody # should be relying on us loading up mod_perl.pm anyway... delete $INC{'mod_perl.pm'}; } use vars qw(@ISA @EXPORT %EXPORT_TAGS $VERSION %SubTests @SkipReasons); $VERSION = '1.39'; my @need = qw(need_lwp need_http11 need_cgi need_access need_auth need_module need_apache need_min_apache_version need_apache_version need_perl need_min_perl_version need_min_module_version need_threads need_fork need_apache_mpm need_php need_php4 need_ssl need_imagemap need_cache_disk); my @have = map { (my $need = $_) =~ s/need/have/; $need } @need; @ISA = qw(Exporter); @EXPORT = (qw(sok plan skip_reason under_construction need), @need, @have); %SubTests = (); @SkipReasons = (); sub cp { my @l; for( my $i=1; (@l=caller $i)[0] eq __PACKAGE__; $i++ ) {}; return wantarray ? @l : $l[0]; } my $Config; my %wtm; sub import { my $class=$_[0]; my $wtm=0; my @base_exp; my @exp; my %my_exports; undef @my_exports{@EXPORT}; my ($caller,$f,$l)=cp; for( my $i=1; $i<@_; $i++ ) { if( $_[$i] eq '-withtestmore' ) { $wtm=1; } elsif( $_[$i] eq ':DEFAULT' ) { push @exp, $_[$i]; push @base_exp, $_[$i]; } elsif( $_[$i] eq '!:DEFAULT' ) { push @exp, $_[$i]; push @base_exp, $_[$i]; } elsif( $_[$i]=~m@^[:/!]@ ) { warn("Ignoring import spec $_[$i] ". "at $f line $l\n") } elsif( exists $my_exports{$_[$i]} ) { push @exp, $_[$i]; } else { push @base_exp, $_[$i]; } } if (!@exp and @base_exp) { @exp=('!:DEFAULT'); } elsif (@exp and !@base_exp) { @base_exp=('!:DEFAULT'); } $wtm{$caller}=[$wtm,$f,$l] unless exists $wtm{$caller}; warn("Ignoring -withtestmore due to a previous call ". "($wtm{$caller}->[1]:$wtm{$caller}->[2]) without it ". "at $f line $l\n") if $wtm{$caller}->[0]==0 and $wtm==1; $class->export_to_level(1, $class, @exp); push @base_exp, '!plan'; if( $wtm{$caller}->[0] ) { # -withtestmore eval <<"EVAL" package $caller; #line $l $f use Test::More import=>\\\@base_exp; EVAL } else { # -withouttestmore eval <<"EVAL"; package $caller; #line $l $f use Test \@base_exp; EVAL } die $@ if $@; } sub config { $Config ||= Apache::TestConfig->thaw->httpd_config; } my $Basic_config; # config bits which doesn't require httpd to be found sub basic_config { $Basic_config ||= Apache::TestConfig->thaw(); } sub vars { @_ ? @{ config()->{vars} }{ @_ } : config()->{vars}; } sub sok (&;$) { my $sub = shift; my $nok = shift || 1; #allow sok to have 'ok' within my ($caller,$f,$l)=cp; if (exists $wtm{$caller} and $wtm{$caller}->[0]==1) { # -withtestmore require Test::Builder; my $tb=Test::Builder->new; if (%SubTests and not $SubTests{ 1+$tb->current_test }) { $tb->skip("skipping this subtest") for (1..$nok); return; } # trick ok() into reporting the caller filename/line when a # sub-test fails in sok() return eval <()); EOE } else { if (%SubTests and not $SubTests{ $Test::ntest }) { skip("skipping this subtest", 0) for (1..$nok); return; } # trick ok() into reporting the caller filename/line when a # sub-test fails in sok() return eval <()); EOE } } #so Perl's Test.pm can be run inside mod_perl sub test_pm_refresh { my ($caller,$f,$l)=cp; if (exists $wtm{$caller} and $wtm{$caller}->[0]==1) { # -withtestmore require Test::Builder; my $builder = Test::Builder->new; $builder->reset; $builder->output(\*STDOUT); $builder->todo_output(\*STDOUT); # this is STDOUT because Test::More seems to put # most of the stuff we want on STDERR, so it ends # up in the error_log instead of where the user can # see it. consider leaving it alone based on # later user reports. $builder->failure_output(\*STDOUT); } else { # -withouttestmore unless (exists $wtm{$caller}) { warn "You forgot to 'use Apache::Test' in package $caller\n"; $wtm{$caller}=[0,$f,$l]; } if (defined &Test::_reset_globals) { Test::_reset_globals(); # Test.pm uses $TESTOUT=*STDOUT{IO}. We cannot do that # due to the way SetupEnv works. $Test::TESTOUT = \*STDOUT; } else { $Test::TESTOUT = \*STDOUT; $Test::planned = 0; $Test::ntest = 1; %Test::todo = (); } } } sub init_test_pm { my $r = shift; # needed to load Apache2::RequestRec::TIEHANDLE eval {require Apache2::RequestIO}; if (defined &Apache2::RequestRec::TIEHANDLE) { untie *STDOUT; tie *STDOUT, $r; require Apache2::RequestRec; # $r->pool require APR::Pool; $r->pool->cleanup_register(sub { untie *STDOUT }); } else { $r->send_http_header; #1.xx } $r->content_type('text/plain'); } sub plan { init_test_pm(shift) if ref $_[0]; test_pm_refresh(); # extending Test::plan's functionality, by using the optional # single value in @_ coming after a ballanced %hash which # Test::plan expects if (@_ % 2) { my $condition = pop @_; my $ref = ref $condition; my $meets_condition = 0; if ($ref) { if ($ref eq 'CODE') { #plan tests $n, \&has_lwp $meets_condition = $condition->(); } elsif ($ref eq 'ARRAY') { #plan tests $n, [qw(php4 rewrite)]; $meets_condition = need_module($condition); } else { die "don't know how to handle a condition of type $ref"; } } else { # we have the verdict already: true/false $meets_condition = $condition ? 1 : 0; } # trying to emulate a dual variable (ala errno) unless ($meets_condition) { my $reason = join ', ', @SkipReasons ? @SkipReasons : "no reason given"; print "1..0 # skipped: $reason\n"; @SkipReasons = (); # reset exit; #XXX: Apache->exit } } @SkipReasons = (); # reset my ($caller,$f,$l)=cp; %SubTests=(); if (my $subtests=$ENV{HTTPD_TEST_SUBTESTS}) { %SubTests=map { $_, 1 } split /\s+/, $subtests; } if (exists $wtm{$caller} and $wtm{$caller}->[0]==1) { # -withtestmore Test::More::plan(@_); } else { # -withouttestmore unless (exists $wtm{$caller}) { warn "You forgot to 'use Apache::Test' in package $caller\n"; $wtm{$caller}=[0,$f,$l]; } Test::plan(@_); } # add to Test.pm verbose output print "# Using Apache/Test.pm version $VERSION\n"; } sub need_http11 { require Apache::TestRequest; if (Apache::TestRequest::install_http11()) { return 1; } else { push @SkipReasons, "LWP version 5.60+ required for HTTP/1.1 support"; return 0; } } sub need_ssl { my $vars = vars(); need_module([$vars->{ssl_module_name}, 'Net::SSL']); } sub need_lwp { require Apache::TestRequest; if (Apache::TestRequest::has_lwp()) { return 1; } else { push @SkipReasons, "libwww-perl is not installed"; return 0; } } sub need { my $need_all = 1; for my $cond (@_) { if (ref $cond eq 'HASH') { while (my($reason, $value) = each %$cond) { $value = $value->() if ref $value eq 'CODE'; next if $value; push @SkipReasons, $reason; $need_all = 0; } } elsif ($cond =~ /^(0|1)$/) { $need_all = 0 if $cond == 0; } else { $need_all = 0 unless need_module($cond); } } return $need_all; } sub need_module { my $cfg = config(); my @modules = grep defined $_, ref($_[0]) eq 'ARRAY' ? @{ $_[0] } : @_; my @reasons = (); for (@modules) { if (/^[a-z0-9_.]+$/) { my $mod = $_; $mod .= '.c' unless $mod =~ /\.c$/; next if $cfg->{modules}->{$mod}; $mod = 'mod_' . $mod unless $mod =~ /^mod_/; next if $cfg->{modules}->{$mod}; if (exists $cfg->{cmodules_disabled}->{$mod}) { push @reasons, $cfg->{cmodules_disabled}->{$mod}; next; } } die "bogus module name $_" unless /^[\w:.]+$/; # if the module was explicitly passed with a .c extension, # do not try to eval it as a Perl module my $not_found = 1; unless (/\.c$/) { eval "require $_"; $not_found = 0 unless $@; #print $@ if $@; } push @reasons, "cannot find module '$_'" if $not_found; } if (@reasons) { push @SkipReasons, @reasons; return 0; } else { return 1; } } sub need_min_perl_version { my $version = shift; return 1 if $] >= $version; push @SkipReasons, "perl >= $version is required"; return 0; } # currently supports only perl modules sub need_min_module_version { my($module, $version) = @_; # need_module requires the perl module return 0 unless need_module($module); # support dev versions like 0.18_01 return 1 if eval { no warnings qw(numeric); $module->VERSION($version) }; push @SkipReasons, "$module version $version or higher is required"; return 0; } sub need_cgi { return _need_multi(qw(cgi.c cgid.c)); } sub need_cache_disk { return _need_multi(qw(cache_disk.c disk_cache.c)); } sub need_php { return _need_multi(qw(php4 php5 sapi_apache2.c)); } sub need_php4 { return _need_multi(qw(php4 sapi_apache2.c)); } sub need_access { return _need_multi(qw(access authz_host)); } sub need_auth { return _need_multi(qw(auth auth_basic)); } sub need_imagemap { return need_module("imagemap") || need_module("imap"); } sub _need_multi { my @check = @_; my $rc = 0; { local @SkipReasons; foreach my $module (@check) { $rc ||= need_module($module); } } my $reason = join ' or ', @check; push @SkipReasons, "cannot find one of $reason" unless $rc; return $rc; } sub need_apache { my $version = shift; my $cfg = Apache::Test::config(); my $rev = $cfg->{server}->{rev}; if ($rev == $version) { return 1; } else { push @SkipReasons, "apache version $version required, this is version $rev"; return 0; } } sub need_min_apache_version { my $wanted = shift; my $cfg = Apache::Test::config(); (my $current) = $cfg->{server}->{version} =~ m:^Apache/(\d\.\d+\.\d+):; if (normalize_vstring($current) < normalize_vstring($wanted)) { push @SkipReasons, "apache version $wanted or higher is required," . " this is version $current"; return 0; } else { return 1; } } sub need_apache_version { my $wanted = shift; my $cfg = Apache::Test::config(); (my $current) = $cfg->{server}->{version} =~ m:^Apache/(\d\.\d+\.\d+):; if (normalize_vstring($current) != normalize_vstring($wanted)) { push @SkipReasons, "apache version $wanted or higher is required," . " this is version $current"; return 0; } else { return 1; } } sub need_apache_mpm { my $wanted = shift; my $cfg = Apache::Test::config(); my $current = $cfg->{server}->{mpm}; if ($current ne $wanted) { push @SkipReasons, "apache $wanted mpm is required," . " this is the $current mpm"; return 0; } else { return 1; } } sub config_enabled { my $key = shift; defined $Config{$key} and $Config{$key} eq 'define'; } sub need_perl_iolayers { if (my $ext = $Config{extensions}) { #XXX: better test? might need to test patchlevel #if support depends bugs fixed in bleedperl return $ext =~ m:PerlIO/scalar:; } 0; } sub need_perl { my $thing = shift; #XXX: $thing could be a version my $config; my $have = \&{"need_perl_$thing"}; if (defined &$have) { return 1 if $have->(); } else { for my $key ($thing, "use$thing") { if (exists $Config{$key}) { $config = $key; return 1 if config_enabled($key); } } } push @SkipReasons, $config ? "Perl was not built with $config enabled" : "$thing is not available with this version of Perl"; return 0; } sub need_threads { my $status = 1; # check APR support my $build_config = Apache::TestConfig->modperl_build_config; if ($build_config) { my $apr_config = $build_config->get_apr_config(); unless ($apr_config->{HAS_THREADS}) { $status = 0; push @SkipReasons, "Apache/APR was built without threads support"; } } # check Perl's useithreads my $key = 'useithreads'; unless (exists $Config{$key} and config_enabled($key)) { $status = 0; push @SkipReasons, "Perl was not built with 'ithreads' enabled"; } return $status; } sub need_fork { my $have_fork = $Config{d_fork} || $Config{d_pseudofork} || (($^O eq 'MSWin32' || $^O eq 'NetWare') && $Config{useithreads} && $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/); if (!$have_fork) { push @SkipReasons, 'The fork function is unimplemented'; return 0; } else { return 1; } } sub under_construction { push @SkipReasons, "This test is under construction"; return 0; } sub skip_reason { my $reason = shift || 'no reason specified'; push @SkipReasons, $reason; return 0; } # normalize Apache-style version strings (2.0.48, 0.9.4) # for easy numeric comparison. note that 2.1 and 2.1.0 # are considered equivalent. sub normalize_vstring { my @digits = shift =~ m/(\d+)\.?(\d*)\.?(\d*)/; return join '', map { sprintf("%03d", $_ || 0) } @digits; } # have_ functions are the same as need_ but they don't populate # @SkipReasons for my $func (@have) { no strict 'refs'; (my $real_func = $func) =~ s/^have_/need_/; *$func = sub { # be nice to poor souls calling functions with $_ argument in # the foreach loop, etc.! local $_; local @SkipReasons; return $real_func->(@_); }; } package Apache::TestToString; Apache::Test->import('!:DEFAULT'); sub TIEHANDLE { my $string = ""; bless \$string; } sub PRINT { my $string = shift; $$string .= join '', @_; } sub start { tie *STDOUT, __PACKAGE__; Apache::Test::test_pm_refresh(); } sub finish { my $s; { my $o = tied *STDOUT; $s = $$o; } untie *STDOUT; $s; } 1; __END__ =head1 NAME Apache::Test - Test.pm wrapper with helpers for testing Apache =head1 SYNOPSIS use Apache::Test; =head1 DESCRIPTION B is a wrapper around the standard C with helpers for testing an Apache server. =head1 FUNCTIONS =over 4 =item plan This function is a wrapper around C: plan tests => 3; just like using Test.pm, plan 3 tests. If the first argument is an object, such as an C object, C will be tied to it. The C global state will also be refreshed by calling C. For example: plan $r, tests => 7; ties STDOUT to the request object C<$r>. If there is a last argument that doesn't belong to C (which expects a balanced hash), it's used to decide whether to continue with the test or to skip it all-together. This last argument can be: =over =item * a C the test is skipped if the scalar has a false value. For example: plan tests => 5, 0; But this won't hint the reason for skipping therefore it's better to use need(): plan tests => 5, need 'LWP', { "not Win32" => sub { $^O eq 'MSWin32'} }; see C for more info. =item * an C reference need_module() is called for each value in this array. The test is skipped if need_module() returns false (which happens when at least one C or Perl module from the list cannot be found). Watch out for case insensitive file systems or duplicate modules with the same name. I.E. If you mean mod_env.c need_module('mod_env.c') Not need_module('env') =item * a C reference the tests will be skipped if the function returns a false value. For example: plan tests => 5, need_lwp; the test will be skipped if LWP is not available =back All other arguments are passed through to I as is. =item ok Same as I, see I documentation. =item sok Allows to skip a sub-test, controlled from the command line. The argument to sok() is a CODE reference or a BLOCK whose return value will be passed to ok(). By default behaves like ok(). If all sub-tests of the same test are written using sok(), and a test is executed as: % ./t/TEST -v skip_subtest 1 3 only sub-tests 1 and 3 will be run, the rest will be skipped. =item skip Same as I, see I documentation. =item test_pm_refresh Normally called by I, this function will refresh the global state maintained by I, allowing C and friends to be called more than once per-process. This function is not exported. =back Functions that can be used as a last argument to the extended plan(). Note that for each C function there is a C equivalent that performs the exact same function except that it is designed to be used outside of C. C functions have the side effect of generating skip messages, if the test is skipped. C functions don't have this side effect. In other words, use C with C to decide whether a test will run, but C within test logic to adjust expectations based on older or newer server versions. =over =item need_http11 plan tests => 5, need_http11; Require HTTP/1.1 support. =item need_ssl plan tests => 5, need_ssl; Require SSL support. Not exported by default. =item need_lwp plan tests => 5, need_lwp; Require LWP support. =item need_cgi plan tests => 5, need_cgi; Requires mod_cgi or mod_cgid to be installed. =item need_cache_disk plan tests => 5, need_cache_disk Requires mod_cache_disk or mod_disk_cache to be installed. =item need_php plan tests => 5, need_php; Requires a PHP module to be installed (version 4 or 5). =item need_php4 plan tests => 5, need_php4; Requires a PHP version 4 module to be installed. =item need_imagemap plan tests => 5, need_imagemap; Requires a mod_imagemap or mod_imap be installed =item need_apache plan tests => 5, need_apache 2; Requires Apache 2nd generation httpd-2.x.xx plan tests => 5, need_apache 1; Requires Apache 1st generation (apache-1.3.xx) See also C. =item need_min_apache_version Used to require a minimum version of Apache. For example: plan tests => 5, need_min_apache_version("2.0.40"); requires Apache 2.0.40 or higher. =item need_apache_version Used to require a specific version of Apache. For example: plan tests => 5, need_apache_version("2.0.40"); requires Apache 2.0.40. =item need_apache_mpm Used to require a specific Apache Multi-Processing Module. For example: plan tests => 5, need_apache_mpm('prefork'); requires the prefork MPM. =item need_perl plan tests => 5, need_perl 'iolayers'; plan tests => 5, need_perl 'ithreads'; Requires a perl extension to be present, or perl compiled with certain capabilities. The first example tests whether C is available, the second whether: $Config{useithread} eq 'define'; =item need_min_perl_version Used to require a minimum version of Perl. For example: plan tests => 5, need_min_perl_version("5.008001"); requires Perl 5.8.1 or higher. =item need_fork Requires the perl built-in function C to be implemented. =item need_module plan tests => 5, need_module 'CGI'; plan tests => 5, need_module qw(CGI Find::File); plan tests => 5, need_module ['CGI', 'Find::File', 'cgid']; Requires Apache C and Perl modules. The function accept a list of arguments or a reference to a list. In case of C modules, depending on how the module name was passed it may pass through the following completions: =over =item 1 need_module 'proxy_http.c' If there is the I<.c> extension, the module name will be looked up as is, i.e. I<'proxy_http.c'>. =item 2 need_module 'mod_cgi' The I<.c> extension will be appended before the lookup, turning it into I<'mod_cgi.c'>. =item 3 need_module 'cgi' The I<.c> extension and I prefix will be added before the lookup, turning it into I<'mod_cgi.c'>. =back =item need_min_module_version Used to require a minimum version of a module For example: plan tests => 5, need_min_module_version(CGI => 2.81); requires C version 2.81 or higher. Currently works only for perl modules. =item need plan tests => 5, need 'LWP', { "perl >= 5.8.0 and w/ithreads is required" => ($Config{useperlio} && $] >= 5.008) }, { "not Win32" => sub { $^O eq 'MSWin32' }, "foo is disabled" => \&is_foo_enabled, }, 'cgid'; need() is more generic function which can impose multiple requirements at once. All requirements must be satisfied. need()'s argument is a list of things to test. The list can include scalars, which are passed to need_module(), and hash references. If hash references are used, the keys, are strings, containing a reason for a failure to satisfy this particular entry, the values are the condition, which are satisfaction if they return true. If the value is 0 or 1, it used to decide whether the requirements very satisfied, so you can mix special C functions that return 0 or 1. For example: plan tests => 1, need 'Compress::Zlib', 'deflate', need_min_apache_version("2.0.49"); If the scalar value is a string, different from 0 or 1, it's passed to I. If the value is a code reference, it gets executed at the time of check and its return value is used to check the condition. If the condition check fails, the provided (in a key) reason is used to tell user why the test was skipped. In the presented example, we require the presence of the C Perl module, C, that we run under perl E= 5.7.3 on Win32. It's possible to put more than one requirement into a single hash reference, but be careful that the keys will be different. It's also important to mention to avoid using: plan tests => 1, requirement1 && requirement2; technique. While test-wise that technique is equivalent to: plan tests => 1, need requirement1, requirement2; since the test will be skipped, unless all the rules are satisfied, it's not equivalent for the end users. The second technique, deploying C and a list of requirements, always runs all the requirement checks and reports all the missing requirements. In the case of the first technique, if the first requirement fails, the second is not run, and the missing requirement is not reported. So let's say all the requirements are missing Apache modules, and a user wants to satisfy all of these and run the test suite again. If all the unsatisfied requirements are reported at once, she will need to rebuild Apache once. If only one requirement is reported at a time, she will have to rebuild Apache as many times as there are elements in the C<&&> statement. Also see plan(). =item under_construction plan tests => 5, under_construction; skip all tests, noting that the tests are under construction =item skip_reason plan tests => 5, skip_reason('my custom reason'); skip all tests. the reason you specify will be given at runtime. if no reason is given a default reason will be used. =back =head1 Additional Configuration Variables =item basic_config my $basic_cfg = Apache::Test::basic_config(); $basic_cfg->write_perlscript($file, $content); C is similar to C, but doesn't contain any httpd-specific information and should be used for operations that don't require any httpd-specific knowledge. =item config my $cfg = Apache::Test::config(); my $server_rev = $cfg->{server}->{rev}; ... C gives an access to the configuration object. =item vars my $serverroot = Apache::Test::vars->{serverroot}; my $serverroot = Apache::Test::vars('serverroot'); my($top_dir, $t_dir) = Apache::Test::vars(qw(top_dir t_dir)); C gives an access to the configuration variables, otherwise accessible as: $vars = Apache::Test::config()->{vars}; If no arguments are passed, the reference to the variables hash is returned. If one or more arguments are passed the corresponding values are returned. =head1 Test::More Integration There are a few caveats if you want to use I with I instead of the default I backend. The first is that I requires you to use its own C function and not the one that ships with I. I also defines C and C functions that are different, and simply Cing both modules in your test script will lead to redefined warnings for these subroutines. To assist I users we have created a special I import tag, C<:withtestmore>, which will export all of the standard I symbols into your namespace except the ones that collide with I. use Apache::Test qw(:withtestmore); use Test::More; plan tests => 1; # Test::More::plan() ok ('yes', 'testing ok'); # Test::More::ok() Now, while this works fine for standard client-side tests (such as C), the more advanced features of I require using I as the sole driver behind the scenes. Should you choose to use I as the backend for server-based tests (such as C) you will need to use the C<-withtestmore> action tag: use Apache::Test qw(-withtestmore); sub handler { my $r = shift; plan $r, tests => 1; # Test::More::plan() with # Apache::Test features ok ('yes', 'testing ok'); # Test::More::ok() } C<-withtestmore> tells I to use I instead of I behind the scenes. Note that you are not required to C yourself with the C<-withtestmore> option and that the C 1> syntax may have unexpected results. Note that I version 0.49, available within the I 0.49 distribution on CPAN, or greater is required to use this feature. Because I was initially developed using I as the framework driver, complete I integration is considered experimental at this time - it is supported as best as possible but is not guaranteed to be as stable as the default I interface at this time. =head1 Apache::TestToString Class The I class is used to capture I output into a string. Example: Apache::TestToString->start; plan tests => 4; ok $data eq 'foo'; ... # $tests will contain the Test.pm output: 1..4\nok 1\n... my $tests = Apache::TestToString->finish; =head1 SEE ALSO The Apache-Test tutorial: L. L subclasses LWP::UserAgent and exports a number of useful functions for sending request to the Apache test server. You can then test the results of those requests. Use L in your F to set up your distribution for testing. =head1 AUTHOR Doug MacEachern with contributions from Geoffrey Young, Philippe M. Chiasson, Stas Bekman and others. Questions can be asked at the test-dev httpd.apache.org list For more information see: http://httpd.apache.org/test/. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/Test5005compat.pm0000644000177200010010000000376312540623176021122 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::Test5005compat; use strict; use Symbol (); use File::Basename; use File::Path; $Apache::Test5005compat::VERSION = '0.01'; my %compat_files = ( 'lib/warnings.pm' => \&warnings_pm, ); sub import { if ($] >= 5.006) { #make sure old compat stubs dont wipe out installed versions unlink for keys %compat_files; return; } eval { require File::Spec::Functions; } or die "this is only Perl $], you need to install File-Spec from CPAN"; my $min_version = 0.82; unless ($File::Spec::VERSION >= $min_version) { die "you need to install File-Spec-$min_version or higher from CPAN"; } while (my($file, $sub) = each %compat_files) { $sub->($file); } } sub open_file { my $file = shift; unless (-d 'lib') { $file = "Apache-Test/$file"; } my $dir = dirname $file; unless (-d $dir) { mkpath([$dir], 0, 0755); } my $fh = Symbol::gensym(); print "creating $file\n"; open $fh, ">$file" or die "open $file: $!"; return $fh; } sub warnings_pm { return if eval { require warnings }; my $fh = open_file(shift); print $fh <<'EOF'; package warnings; sub import {} 1; EOF close $fh; } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestBuild.pm0000644000177200010010000003512312540623176020357 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestBuild; use strict; use warnings FATAL => 'all'; use subs qw(system chdir info warning); use Config; use File::Spec::Functions; use File::Path (); use Cwd (); use constant DRYRUN => 0; my @min_modules = qw(access auth log-config env mime setenvif mime autoindex dir alias); my %shared_modules = ( min => join(' ', @min_modules), ); my %configs = ( all => { 'apache-1.3' => [], 'httpd-2.0' => enable20(qw(modules=all proxy)), }, most => { 'apache-1.3' => [], 'httpd-2.0' => enable20(qw(modules=most)), }, min => { 'apache-1.3' => [], 'httpd-2.0' => enable20(@min_modules), }, exp => { 'apache-1.3' => [], 'httpd-2.0' => enable20(qw(example case_filter case_filter_in cache echo deflate bucketeer)), }, ); my %builds = ( default => { cflags => '-Wall', config => { 'apache-1.3' => [], 'httpd-2.0' => [], }, }, debug => { cflags => '-g', config => { 'apache-1.3' => [], 'httpd-2.0' => [qw(--enable-maintainer-mode)], }, }, prof => { cflags => '-pg -DGPROF', }, shared => { config => { 'apache-1.3' => [], 'httpd-2.0' => enable20_shared('all'), }, }, mostshared => { config => { 'apache-1.3' => [], 'httpd-2.0' => enable20_shared('most'), }, }, minshared => { config => { 'apache-1.3' => [], 'httpd-2.0' => enable20_shared('min'), }, }, static => { }, ); my %mpms = ( default => [qw(prefork worker)], MSWin32 => [qw(winnt)], ); my @cvs = qw(httpd-2.0 apache-1.3); my @dirs = qw(build tar src install); sub enable20 { [ map { "--enable-$_" } @_ ]; } sub enable20_shared { my $name = shift; my $modules = $shared_modules{$name} || $name; enable20(qq(mods-shared="$modules")); } sub default_mpms { $mpms{ $^O } || $mpms{'default'}; } sub default_dir { my($self, $dir) = @_; $self->{$dir} ||= catdir $self->{prefix}, $dir, } sub new { my $class = shift; #XXX: not generating a BUILD script yet #this way we can run: #perl Apache-Test/lib/Apache/TestBuild.pm --cvsroot=anon --foo=... require Apache::TestConfig; require Apache::TestTrace; Apache::TestTrace->import; my $self = bless { prefix => '/usr/local/apache', cwd => Cwd::cwd(), cvsroot => 'cvs.apache.org:/home/cvs', cvs => \@cvs, cvstag => "", ssldir => "", mpms => default_mpms(), make => $Config{make}, builds => {}, name => "", extra_config => { 'httpd-2.0' => [], }, @_, }, $class; #XXX if (my $c = $self->{extra_config}->{'2.0'}) { $self->{extra_config}->{'httpd-2.0'} = $c; } for my $dir (@dirs) { $self->default_dir($dir); } if ($self->{ssldir}) { push @{ $self->{extra_config}->{'httpd-2.0'} }, '--enable-ssl', "--with-ssl=$self->{ssldir}"; } $self; } sub init { my $self = shift; for my $dir (@dirs) { mkpath($self->{$dir}); } } use subs qw(symlink unlink); use File::Basename; use File::Find; sub symlink_tree { my $self = shift; my $httpd = 'httpd'; my $install = "$self->{install}/bin/$httpd"; my $source = "$self->{build}/.libs/$httpd"; unlink $install; symlink $source, $install; my %dir = (apr => 'apr', aprutil => 'apr-util'); for my $libname (qw(apr aprutil)) { my $lib = "lib$libname.so.0.0.0"; my $install = "$self->{install}/lib/$lib"; my $source = "$self->{build}/srclib/$dir{$libname}/.libs/$lib"; unlink $install; symlink $source, $install; } $install = "$self->{install}/modules"; $source = "$self->{build}/modules"; for (<$install/*.so>) { unlink $_; } finddepth(sub { return unless /\.so$/; my $file = "$File::Find::dir/$_"; symlink $file, "$install/$_"; }, $source); } sub unlink { my $file = shift; if (-e $file) { print "unlink $file\n"; } else { print "$file does not exist\n"; } CORE::unlink($file); } sub symlink { my($from, $to) = @_; print "symlink $from => $to\n"; unless (-e $from) { print "source $from does not exist\n"; } my $base = dirname $to; unless (-e $base) { print "target dir $base does not exist\n"; } CORE::symlink($from, $to) or die $!; } sub cvs { my $self = shift; my $cmd = "cvs -d $self->{cvsroot} @_"; if (DRYRUN) { info "$cmd"; } else { system $cmd; } } my %cvs_names = ( '2.0' => 'httpd-2.0', '1.3' => 'apache-1.3', ); my %cvs_snames = ( '2.0' => 'httpd', '1.3' => 'apache', ); sub cvs_up { my($self, $version) = @_; my $name = $cvs_names{$version}; my $dir = $self->srcdir($version); if ($self->{cvsroot} eq 'anon') { $self->{cvsroot} = ':pserver:anoncvs@cvs.apache.org:/home/cvspublic'; unless (-d $dir) { #XXX do something better than doesn't require prompt if #we already have an entry in ~/.cvspass #$self->cvs('login'); warning "may need to run the following command ", "(password is 'anoncvs')"; warning "cvs -d $self->{cvsroot} login"; } } if (-d $dir) { chdir $dir; $self->cvs(up => "-dP $self->{cvstag}"); return; } my $co = checkout($name); $self->$co($name, $dir); my $post = post_checkout($name); $self->$post($name, $dir); } sub checkout_httpd_2_0 { my($self, $name, $dir) = @_; my $tag = $self->{cvstag}; $self->cvs(co => "-d $dir $tag $name"); chdir "$dir/srclib"; $self->cvs(co => "$tag apr apr-util"); } sub checkout_apache_1_3 { my($self, $name, $dir) = @_; $self->cvs(co => "-d $dir $self->{cvstag} $name"); } sub post_checkout_httpd_2_0 { my($self, $name, $dir) = @_; } sub post_checkout_apache_1_3 { } sub canon { my $name = shift; return $name unless $name; $name =~ s/[.-]/_/g; $name; } sub checkout { my $name = canon(shift); \&{"checkout_$name"}; } sub post_checkout { my $name = canon(shift); \&{"post_checkout_$name"}; } sub cvs_update { my $self = shift; my $cvs = shift || $self->{cvs}; chdir $self->{src}; for my $name (@$cvs) { $self->cvs_up($name); } } sub merge_build { my($self, $version, $builds, $configs) = @_; my $b = { cflags => $builds{default}->{cflags}, config => [ @{ $builds{default}->{config}->{$version} } ], }; for my $name (@$builds) { next if $name eq 'default'; #already have this if (my $flags = $builds{$name}->{cflags}) { $b->{cflags} .= " $flags"; } if (my $cfg = $builds{$name}->{config}) { if (my $vcfg = $cfg->{$version}) { push @{ $b->{config} }, @$vcfg; } } } for my $name (@$configs) { my $cfg = $configs{$name}->{$version}; next unless $cfg; push @{ $b->{config} }, @$cfg; } if (my $ex = $self->{extra_config}->{$version}) { push @{ $b->{config} }, @$ex; } if (my $ex = $self->{extra_cflags}->{$version}) { $b->{config} .= " $ex"; } $b; } my @srclib_dirs = qw( apr apr-util apr-util/xml/expat pcre ); sub install_name { my($self, $builds, $configs, $mpm) = @_; return $self->{name} if $self->{name}; my $name = join '-', $mpm, @$builds, @$configs; if (my $tag = $self->cvs_name) { $name .= "-$tag"; } $name; } #currently the httpd-2.0 build does not properly support static linking #of ssl libs, force the issue sub add_ssl_libs { my $self = shift; my $ssldir = $self->{ssldir}; return unless $ssldir and -d $ssldir; my $name = $self->{current_install_name}; my $ssl_mod = "$name/modules/ssl"; info "editing $ssl_mod/modules.mk"; if (DRYRUN) { return; } my $ssl_mk = "$self->{build}/$ssl_mod/modules.mk"; open my $fh, $ssl_mk or die "open $ssl_mk: $!"; my @lines = <$fh>; close $fh; for (@lines) { next unless /SH_LINK/; chomp; $_ .= " -L$ssldir -lssl -lcrypto\n"; info 'added ssl libs'; last; } open $fh, '>', $ssl_mk or die $!; print $fh join "\n", @lines; close $fh; } sub cvs_name { my $self = shift; if (my $tag = $self->{cvstag}) { $tag =~ s/^-[DAr]//; $tag =~ s/\"//g; $tag =~ s,[/ :],_,g; #-D"03/29/02 07:00pm" return $tag; } return ""; } sub srcdir { my($self, $src) = @_; my $prefix = ""; if ($src =~ s/^(apache|httpd)-//) { $prefix = $1; } else { $prefix = $cvs_snames{$src}; } if ($src =~ /^\d\.\d$/) { #release version will be \d\.\d\.\d+ if (my $tag = $self->cvs_name) { $src .= "-$tag"; } $src .= '-cvs'; } join '-', $prefix, $src; } sub configure_httpd_2_0 { my($self, $src, $builds, $configs, $mpm) = @_; $src = $self->srcdir($src); chdir $self->{build}; my $name = $self->install_name($builds, $configs, $mpm); $self->{current_install_name} = $name; $self->{builds}->{$name} = 1; if ($self->{fresh}) { rmtree($name); } else { if (-e "$name/.DONE") { warning "$name already configured"; warning "rm $name/.DONE to force"; return; } } my $build = $self->merge_build('httpd-2.0', $builds, $configs); $ENV{CFLAGS} = $build->{cflags}; info "CFLAGS=$ENV{CFLAGS}"; my $prefix = "$self->{install}/$name"; rmtree($prefix) if $self->{fresh}; my $source = "$self->{src}/$src"; my @args = ("--prefix=$prefix", "--with-mpm=$mpm", "--srcdir=$source", @{ $build->{config} }); chdir $source; system "./buildconf"; my $cmd = "$source/configure @args"; chdir $self->{build}; mkpath($name); chdir $name; for my $dir (@srclib_dirs) { mkpath("srclib/$dir"); } for my $dir (qw(build docs/conf)) { mkpath($dir); } system $cmd; open FH, ">.DONE" or die "open .DONE: $!"; print FH scalar localtime; close FH; chdir $self->{prefix}; $self->add_ssl_libs; } sub make { my($self, @cmds) = @_; push @cmds, 'all' unless @cmds; for my $name (keys %{ $self->{builds} }) { chdir "$self->{build}/$name"; for my $cmd (@cmds) { system "$self->{make} $cmd"; } } } sub system { my $cmd = "@_"; info $cmd; return if DRYRUN; unless (CORE::system($cmd) == 0) { my $status = $? >> 8; die "system $cmd failed (exit status=$status)"; } } sub chdir { my $dir = shift; info "chdir $dir"; CORE::chdir $dir; } sub mkpath { my $dir = shift; return if -d $dir; info "mkpath $dir"; return if DRYRUN; File::Path::mkpath([$dir], 1, 0755); } sub rmtree { my $dir = shift; return unless -d $dir; info "rmtree $dir"; return if DRYRUN; File::Path::rmtree([$dir], 1, 1); } sub generate_script { my($class, $file) = @_; $file ||= catfile 't', 'BUILD'; my $content = join '', ; Apache::Test::basic_config()->write_perlscript($file, $content); } unless (caller) { $INC{'Apache/TestBuild.pm'} = __FILE__; eval join '', ; die $@ if $@; } 1; __DATA__ use strict; use warnings FATAL => 'all'; use lib qw(Apache-Test/lib); use Apache::TestBuild (); use Getopt::Long qw(GetOptions); use Cwd (); my %options = ( prefix => "checkout/build/install prefix", ssldir => "enable ssl with given directory", cvstag => "checkout with given cvs tag", cvsroot => "use 'anon' for anonymous cvs", version => "apache version (e.g. '2.0')", mpms => "MPMs to build (e.g. 'prefork')", flavor => "build flavor (e.g. 'debug shared')", modules => "enable modules (e.g. 'all exp')", name => "change name of the build/install directory", ); my %opts; Getopt::Long::Configure(qw(pass_through)); #XXX: could be smarter here, being lazy for the moment GetOptions(\%opts, map "$_=s", sort keys %options); if (@ARGV) { print "passing extra args to configure: @ARGV\n"; } my $home = $ENV{HOME}; $opts{prefix} ||= join '/', Cwd::cwd(), 'farm'; #$opts{ssldir} ||= ''; #$opts{cvstag} ||= ''; #$opts{cvsroot} ||= ''; $opts{version} ||= '2.0'; $opts{mpms} ||= 'prefork'; $opts{flavor} ||= 'debug-shared'; $opts{modules} ||= 'all-exp'; #my @versions = qw(2.0); #my @mpms = qw(prefork worker perchild); #my @flavors = ([qw(debug shared)], [qw(prof shared)], # [qw(debug static)], [qw(prof static)]); #my @modules = ([qw(all exp)]); my $split = sub { split '-', delete $opts{ $_[0] } }; my @versions = $opts{version}; my @mpms = $split->('mpms'); my @flavors = ([ $split->('flavor') ]); my @modules = ([ $split->('modules') ]); my $tb = Apache::TestBuild->new(fresh => 1, %opts, extra_config => { $opts{version} => \@ARGV, }); $tb->init; for my $version (@versions) { $tb->cvs_update([ $version ]); for my $mpm (@mpms) { for my $flavor (@flavors) { for my $mods (@modules) { $tb->configure_httpd_2_0($version, $flavor, $mods, $mpm); $tb->make(qw(all install)); } } } } mod_perl-2.0.9/Apache-Test/lib/Apache/TestClient.pm0000644000177200010010000001220612540623176020533 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestClient; #this module provides some fallback for when libwww-perl is not installed #it is by no means an LWP replacement, just enough for very simple requests #this module does not and will never support certain features such as: #file upload, http/1.1 (byteranges, keepalive, etc.), following redirects, #authentication, GET body callbacks, SSL, etc. use strict; use warnings FATAL => 'all'; use Apache::TestRequest (); my $CRLF = "\015\012"; sub request { my($method, $url, @headers) = @_; my @real_headers = (); my $content; for (my $i = 0; $i < scalar @headers; $i += 2) { if ($headers[$i] =~ /^content$/i) { $content = $headers[$i+1]; } else { push @real_headers, ($headers[$i], $headers[$i+1]); } } ## XXX: ## This is not a FULL URL encode mapping ## space ' '; however is very common, so this ## is useful to convert $url =~ s/ /%20/g; my $config = Apache::Test::config(); $method ||= 'GET'; $url ||= '/'; my %headers = (); my $hostport = Apache::TestRequest::hostport($config); $headers{Host} = (split ':', $hostport)[0]; my $s = Apache::TestRequest::vhost_socket(); unless ($s) { warn "cannot connect to $hostport: $!"; return undef; } if ($content) { $headers{'Content-Length'} ||= length $content; $headers{'Content-Type'} ||= 'application/x-www-form-urlencoded'; } #for modules/setenvif $headers{'User-Agent'} ||= 'libwww-perl/0.00'; my $request = join $CRLF, "$method $url HTTP/1.0", (map { "$_: $headers{$_}" } keys %headers); $request .= $CRLF; for (my $i = 0; $i < scalar @real_headers; $i += 2) { $request .= "$real_headers[$i]: $real_headers[$i+1]$CRLF"; } $request .= $CRLF; # using send() avoids the need to use SIGPIPE if the server aborts # the connection $s->send($request); $s->send($content) if $content; $request =~ s/\015//g; #for as_string my $res = { request => (bless { headers_as_string => $request, content => $content || '', }, 'Apache::TestClientRequest'), headers_as_string => '', method => $method, code => -1, # unknown }; my($response_line, $header_term); my $eol = "\015?\012"; local $_; while (<$s>) { $res->{headers_as_string} .= $_; if (m:^(HTTP/\d+\.\d+)[ \t]+(\d+)[ \t]*(.*?)$eol:io) { $res->{protocol} = $1; $res->{code} = $2; $res->{message} = $3; $response_line = 1; } elsif (/^([a-zA-Z0-9_\-]+)\s*:\s*(.*?)$eol/o) { $res->{headers}->{lc $1} = $2; } elsif (/^$eol$/o) { $header_term = 1; last; } } unless ($response_line and $header_term) { warn "malformed response"; } { local $/; $res->{content} = <$s>; } close $s; # an empty body is a valid response $res->{content} = '' unless exists $res->{content} and defined $res->{content}; $res->{headers_as_string} =~ s/\015//g; #for as_string bless $res, 'Apache::TestClientResponse'; } for my $method (qw(GET HEAD POST PUT)) { no strict 'refs'; *$method = sub { my $url = shift; request($method, $url, @_); }; } package Apache::TestClientResponse; sub header { my($self, $key) = @_; $self->{headers}->{lc $key}; } my @headers = qw(Last-Modified Content-Type); for my $header (@headers) { no strict 'refs'; (my $method = lc $header) =~ s/-/_/g; *$method = sub { shift->{headers}->{lc $header} }; } sub is_success { my $code = shift->{code}; return 0 unless defined $code && $code; $code >= 200 && $code < 300; } sub status_line { my $self = shift; "$self->{code} $self->{message}"; } sub as_string { my $self = shift; $self->{headers_as_string} . ($self->{content} || ''); } my @methods = qw( request protocol code message method headers_as_string headers content ); for my $method (@methods) { no strict 'refs'; *$method = sub { my($self, $val) = @_; $self->{$method} = $val if $val; $self->{$method}; }; } #inherit headers_as_string, as_string, protocol, content, etc. methods @Apache::TestClientRequest::ISA = qw(Apache::TestClientResponse); 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestCommon.pm0000644000177200010010000000574312540623176020555 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestCommon; use strict; use warnings FATAL => 'all'; use File::Basename; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache::TestCommonPost (); #this module contains common tests that are called from different .t files #t/apache/passbrigade.t #t/apache/rwrite.t sub run_write_test { my $module = shift; #1k..9k, 10k..50k, 100k, 300k, 500k, 2Mb, 4Mb, 6Mb, 10Mb my @sizes = (1..9, 10..50, 100, 300, 500, 2000, 4000, 6000, 10_000); my @buff_sizes = (1024, 8192); plan tests => @sizes * @buff_sizes, [$module, 'LWP']; my $location = "/$module"; my $ua = Apache::TestRequest::user_agent(); for my $buff_size (@buff_sizes) { for my $size (@sizes) { my $length = $size * 1024; my $received = 0; $ua->do_request(GET => "$location?$buff_size,$length", sub { my($chunk, $res) = @_; $received += length $chunk; }); ok t_cmp($length, $received, 'bytes in body'); } } } sub run_files_test { my($verify, $skip_other) = @_; my $vars = Apache::Test::vars(); my $perlpod = $vars->{perlpod}; my %pod = ( files => [], num => 0, url => '/getfiles-perl-pod', dir => "", ); if (-d $perlpod) { my @files = map { basename $_ } <$perlpod/*.pod>; $pod{files} = \@files; $pod{num} = scalar @files; $pod{dir} = $perlpod; } else { push @Apache::Test::SkipReasons, "dir $vars->{perlpod} does not exist"; } my %other_files = (); unless ($skip_other) { #allow to skip the large binary files %other_files = map { ("/getfiles-binary-$_", $vars->{$_}) } qw(httpd perl); } my $tests = $pod{num} + keys(%other_files); plan tests => $tests, sub { $pod{num} and have_lwp() }; my $ua = Apache::TestRequest::user_agent(); for my $file (@{ $pod{files} }) { $verify->($ua, "$pod{url}/$file", "$pod{dir}/$file"); } for my $url (sort keys %other_files) { $verify->($ua, $url, $other_files{$url}); } } 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestCommonPost.pm0000644000104000010010000001215312540623176023315 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestCommonPost; use strict; use warnings FATAL => 'all'; use constant POST_HUGE => $ENV{APACHE_TEST_POST_HUGE} || 0; use Apache::TestRequest (); use Apache::TestUtil qw(t_cmp t_debug); use Apache::Test qw(sok); BEGIN { my $use_inline = 0; eval { #if Inline.pm and libcurl are available #we can make this test about 3x faster, #after the inlined code is compiled that is. require Inline; Inline->import(C => 'DATA', LIBS => ['-lcurl'], #CLEAN_AFTER_BUILD => 0, PREFIX => 'aptest_post_'); *request_init = \&curl_init; *request_do = \&curl_do; $use_inline = 1; } if POST_HUGE; if (POST_HUGE) { if ($@) { t_debug "tests will run faster with Inline and curl installed"; print $@; } else { t_debug "using Inline and curl client"; } } unless ($use_inline) { t_debug "using LWP client"; #fallback to lwp *request_init = \&lwp_init; *request_do = \&lwp_do; } } sub lwp_init { use vars qw($UA $Location); $UA = Apache::TestRequest::user_agent(); $Location = shift; } sub lwp_do { my $length = shift; my $request = HTTP::Request->new(POST => $Location); $request->header('Content-length' => $length); if (LWP->VERSION >= 5.800) { $request->content_ref(\('a' x $length)); } else { # before LWP 5.800 there was no way to tell HTTP::Message not # to copy the string, there is a settable content_ref since # 5.800 use constant BUF_SIZE => 8192; my $remain = $length; my $content = sub { my $bytes = $remain < BUF_SIZE ? $remain : BUF_SIZE; my $buf = 'a' x $bytes; $remain -= $bytes; $buf; }; $request->content($content); } my $response = $UA->request($request); Apache::TestRequest::lwp_trace($response); return $response->content; } my @run_post_test_small_sizes = #1k..9k, 10k..50k, 100k (1..9, 10..50, 100); my @run_post_test_sizes = @run_post_test_small_sizes; if (POST_HUGE) { push @run_post_test_sizes, #300k, 500k, 2Mb, 4Mb, 6Mb, 10Mb 300, 500, 2000, 4000, 6000, 10_000; } sub Apache::TestCommon::run_post_test_sizes { @run_post_test_sizes } sub Apache::TestCommon::run_post_test { my $module = shift; my $sizes = shift || \@run_post_test_sizes; my $location = Apache::TestRequest::resolve_url("/$module"); request_init($location); for my $size (@$sizes) { sok { my $length = ($size * 1024); my $str = request_do($length); chomp $str; t_cmp($length, $str, "length posted"); }; } } 1; __DATA__ __C__ #include #include static CURL *curl = NULL; static SV *response = (SV *)NULL; static long total = 0; static size_t my_curl_read(char *buffer, size_t size, size_t nitems, void *data) { size_t bytes = nitems < total ? nitems : total; memset(buffer, 'a', bytes); total -= bytes; return bytes; } static size_t my_curl_write(char *buffer, size_t size, size_t nitems, void *data) { sv_catpvn(response, buffer, nitems); return nitems; } void aptest_post_curl_init(char *url) { char *proto = "HTTP/1.1"; /* curl default */ curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_MUTE, 1); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_curl_read); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write); if (!getenv("APACHE_TEST_HTTP11")) { curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); proto = "HTTP/1.0"; } fprintf(stdout, "#CURL using protocol %s\n", proto); fflush(stdout); response = newSV(0); } SV *aptest_post_curl_do(long len) { sv_setpv(response, ""); total = len; curl_easy_setopt(curl, CURLOPT_INFILESIZE, len); curl_easy_perform(curl); return SvREFCNT_inc(response); } void aptest_post_END(void) { if (response) { SvREFCNT_dec(response); } if (curl) { curl_easy_cleanup(curl); } } mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfig.pm0000644000104000010010000016646212540623176022441 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfig; use strict; use warnings FATAL => 'all'; use constant WIN32 => $^O eq 'MSWin32'; use constant OSX => $^O eq 'darwin'; use constant CYGWIN => $^O eq 'cygwin'; use constant NETWARE => $^O eq 'NetWare'; use constant SOLARIS => $^O eq 'solaris'; use constant AIX => $^O eq 'aix'; use constant WINFU => WIN32 || NETWARE; use constant COLOR => ($ENV{APACHE_TEST_COLOR} && -t STDOUT) ? 1 : 0; use constant DEFAULT_PORT => 8529; use constant IS_MOD_PERL_2 => eval { require mod_perl2 } || 0; use constant IS_MOD_PERL_2_BUILD => IS_MOD_PERL_2 && eval { require Apache2::Build && Apache2::Build::IS_MOD_PERL_BUILD() }; use constant IS_APACHE_TEST_BUILD => grep { -e "$_/lib/Apache/TestConfig.pm" } qw(Apache-Test . .. ../Apache-Test); use lib (); use File::Copy (); use File::Find qw(finddepth); use File::Basename qw(dirname); use File::Path (); use File::Spec::Functions qw(catfile abs2rel splitdir canonpath catdir file_name_is_absolute devnull); use Cwd qw(fastcwd); use Socket (); use Symbol (); use Apache::TestConfigPerl (); use Apache::TestConfigParse (); use Apache::TestTrace; use Apache::TestServer (); use Apache::TestRun (); use vars qw(%Usage); %Usage = ( top_dir => 'top-level directory (default is $PWD)', t_dir => 'the t/ test directory (default is $top_dir/t)', t_conf => 'the conf/ test directory (default is $t_dir/conf)', t_logs => 'the logs/ test directory (default is $t_dir/logs)', t_pid_file => 'location of the pid file (default is $t_logs/httpd.pid)', t_conf_file => 'test httpd.conf file (default is $t_conf/httpd.conf)', src_dir => 'source directory to look for mod_foos.so', serverroot => 'ServerRoot (default is $t_dir)', documentroot => 'DocumentRoot (default is $ServerRoot/htdocs', port => 'Port [port_number|select] (default ' . DEFAULT_PORT . ')', servername => 'ServerName (default is localhost)', user => 'User to run test server as (default is $USER)', group => 'Group to run test server as (default is $GROUP)', bindir => 'Apache bin/ dir (default is apxs -q BINDIR)', sbindir => 'Apache sbin/ dir (default is apxs -q SBINDIR)', httpd => 'server to use for testing (default is $bindir/httpd)', target => 'name of server binary (default is apxs -q TARGET)', apxs => 'location of apxs (default is from Apache2::BuildConfig)', startup_timeout => 'seconds to wait for the server to start (default is 60)', httpd_conf => 'inherit config from this file (default is apxs derived)', httpd_conf_extra=> 'inherit additional config from this file', minclients => 'minimum number of concurrent clients (default is 1)', maxclients => 'maximum number of concurrent clients (default is minclients+1)', perlpod => 'location of perl pod documents (for testing downloads)', proxyssl_url => 'url for testing ProxyPass / https (default is localhost)', sslca => 'location of SSL CA (default is $t_conf/ssl/ca)', sslcaorg => 'SSL CA organization to use for tests (default is asf)', libmodperl => 'path to mod_perl\'s .so (full or relative to LIBEXECDIR)', defines => 'values to add as -D defines (for example, "VAR1 VAR2")', (map { $_ . '_module_name', "$_ module name"} qw(cgi ssl thread access auth php)), ); my %filepath_conf_opts = map { $_ => 1 } qw(top_dir t_dir t_conf t_logs t_pid_file t_conf_file src_dir serverroot documentroot bindir sbindir httpd apxs httpd_conf httpd_conf_extra perlpod sslca libmodperl); sub conf_opt_is_a_filepath { my $opt = shift; $opt && exists $filepath_conf_opts{$opt}; } sub usage { for my $hash (\%Usage) { for (sort keys %$hash){ printf " -%-18s %s\n", $_, $hash->{$_}; } } } sub filter_args { my($args, $wanted_args) = @_; my(@pass, %keep); my @filter = @$args; if (ref($filter[0])) { push @pass, shift @filter; } while (@filter) { my $key = shift @filter; # optinal - or -- prefix if (defined $key && $key =~ /^-?-?(.+)/ && exists $wanted_args->{$1}) { if (@filter) { $keep{$1} = shift @filter; } else { die "key $1 requires a matching value"; } } else { push @pass, $key; } } return (\@pass, \%keep); } my %passenv = map { $_,1 } qw{ APACHE_TEST_APXS APACHE_TEST_HTTPD APACHE_TEST_GROUP APACHE_TEST_USER APACHE_TEST_PORT }; sub passenv { \%passenv; } sub passenv_makestr { my @vars; for (sort keys %passenv) { push @vars, "$_=\$($_)"; } "@vars"; } sub server { shift->{server} } sub modperl_build_config { my $self = shift; my $server = ref $self ? $self->server : new_test_server(); # we can't do this if we're using httpd 1.3.X # even if mod_perl2 is installed on the box # similarly, we shouldn't be loading mp2 if we're not # absolutely certain we're in a 2.X environment yet # (such as mod_perl's own build or runtime environment) if (($server->{rev} && $server->{rev} == 2) || IS_MOD_PERL_2_BUILD || $ENV{MOD_PERL_API_VERSION}) { eval { require Apache2::Build; } or return; return Apache2::Build->build_config; } return; } sub new_test_server { my($self, $args) = @_; Apache::TestServer->new($args || $self) } # setup httpd-independent components # for httpd-specific call $self->httpd_config() sub new { my $class = shift; my $args; $args = shift if $_[0] and ref $_[0]; $args = $args ? {%$args} : {@_}; #copy #see Apache::TestMM::{filter_args,generate_script} #we do this so 'perl Makefile.PL' can be passed options such as apxs #without forcing regeneration of configuration and recompilation of c-modules #as 't/TEST apxs /path/to/apache/bin/apxs' would do while (my($key, $val) = each %Apache::TestConfig::Argv) { $args->{$key} = $val; } my $top_dir = fastcwd; $top_dir = pop_dir($top_dir, 't'); # untaint as we are going to use it a lot later on in -T sensitive # operations (.e.g @INC) $top_dir = $1 if $top_dir =~ /(.*)/; # make sure that t/conf/apache_test_config.pm is found # (unfortunately sometimes we get thrown into / by Apache so we # can't just rely on $top_dir lib->import($top_dir); my $thaw = {}; #thaw current config for (qw(conf t/conf)) { last if eval { require "$_/apache_test_config.pm"; $thaw = 'apache_test_config'->new; delete $thaw->{save}; #incase class that generated the config was #something else, which we can't be sure how to load bless $thaw, 'Apache::TestConfig'; }; } if ($args->{thaw} and ref($thaw) ne 'HASH') { #dont generate any new config $thaw->{vars}->{$_} = $args->{$_} for keys %$args; $thaw->{server} = $thaw->new_test_server; $thaw->add_inc; return $thaw; } #regenerating config, so forget old if ($args->{save}) { for (qw(vhosts inherit_config modules inc cmodules)) { delete $thaw->{$_} if exists $thaw->{$_}; } } my $self = bless { clean => {}, vhosts => {}, inherit_config => {}, modules => {}, inc => [], %$thaw, mpm => "", httpd_defines => {}, vars => $args, postamble => [], preamble => [], postamble_hooks => [], preamble_hooks => [], }, ref($class) || $class; my $vars = $self->{vars}; #things that can be overridden for (qw(save verbose)) { next unless exists $args->{$_}; $self->{$_} = delete $args->{$_}; } $vars->{top_dir} ||= $top_dir; $self->add_inc; #help to find libmodperl.so unless ($vars->{src_dir}) { my $src_dir = catfile $vars->{top_dir}, qw(.. src modules perl); if (-d $src_dir) { $vars->{src_dir} = $src_dir; } else { $src_dir = catfile $vars->{top_dir}, qw(src modules perl); $vars->{src_dir} = $src_dir if -d $src_dir; } } $vars->{t_dir} ||= catfile $vars->{top_dir}, 't'; $vars->{serverroot} ||= $vars->{t_dir}; $vars->{documentroot} ||= catfile $vars->{serverroot}, 'htdocs'; $vars->{perlpod} ||= $self->find_in_inc('pods') || $self->find_in_inc('pod'); $vars->{perl} ||= $^X; $vars->{t_conf} ||= catfile $vars->{serverroot}, 'conf'; $vars->{sslca} ||= catfile $vars->{t_conf}, 'ssl', 'ca'; $vars->{sslcaorg} ||= 'asf'; $vars->{t_logs} ||= catfile $vars->{serverroot}, 'logs'; $vars->{t_conf_file} ||= catfile $vars->{t_conf}, 'httpd.conf'; $vars->{t_pid_file} ||= catfile $vars->{t_logs}, 'httpd.pid'; if (WINFU) { for (keys %$vars) { $vars->{$_} =~ s|\\|\/|g if defined $vars->{$_}; } } $vars->{scheme} ||= 'http'; $vars->{servername} ||= $self->default_servername; $vars->{port} = $self->select_first_port; $vars->{remote_addr} ||= $self->our_remote_addr; $vars->{user} ||= $self->default_user; $vars->{group} ||= $self->default_group; $vars->{serveradmin} ||= $self->default_serveradmin; $vars->{minclients} ||= 1; $vars->{maxclients_preset} = $vars->{maxclients} || 0; # if maxclients wasn't explicitly passed try to # prevent 'server reached MaxClients setting' errors $vars->{maxclients} ||= $vars->{minclients} + 1; # if a preset maxclients valus is smaller than minclients, # maxclients overrides minclients if ($vars->{maxclients_preset} && $vars->{maxclients_preset} < $vars->{minclients}) { $vars->{minclients} = $vars->{maxclients_preset}; } # for threaded mpms MaxClients must be a multiple of # ThreadsPerChild (i.e. maxclients % minclients == 0) # so unless -maxclients was explicitly specified use a double of # minclients $vars->{maxclientsthreadedmpm} = $vars->{maxclients_preset} || $vars->{minclients} * 2; $vars->{proxy} ||= 'off'; $vars->{proxyssl_url} ||= ''; $vars->{defines} ||= ''; $self->{hostport} = $self->hostport; $self->{server} = $self->new_test_server; return $self; } # figure out where httpd is and run extra config hooks which require # knowledge of where httpd is sub httpd_config { my $self = shift; $self->configure_apxs; $self->configure_httpd; my $vars = $self->{vars}; unless ($vars->{httpd} or $vars->{apxs}) { # mod_perl 2.0 build (almost) always knows the right httpd # location (and optionally apxs). if we get here we can't # continue because the interactive config can't work with # mod_perl 2.0 build (by design) if (IS_MOD_PERL_2_BUILD){ my $mp2_build = $self->modperl_build_config(); # if mod_perl 2 was built against the httpd source it # doesn't know where to find apxs/httpd, so in this case # fall back to interactive config unless ($mp2_build->{MP_APXS}) { die "mod_perl 2 was built against Apache sources, we " . "don't know where httpd/apxs executables are, therefore " . "skipping the test suite execution" } # not sure what else could go wrong but we can't continue die "something is wrong, mod_perl 2.0 build should have " . "supplied all the needed information to run the tests. " . "Please post lib/Apache2/BuildConfig.pm along with the " . "bug report"; } $self->clean(1); error "You must explicitly specify -httpd and/or -apxs options, " . "or set \$ENV{APACHE_TEST_HTTPD} and \$ENV{APACHE_TEST_APXS}, " . "or set your \$PATH to include the httpd and apxs binaries."; Apache::TestRun::exit_perl(1); } else { debug "Using httpd: $vars->{httpd}"; } $self->inherit_config; #see TestConfigParse.pm $self->configure_httpd_eapi; #must come after inherit_config $self->default_module(cgi => [qw(mod_cgi mod_cgid)]); $self->default_module(thread => [qw(worker threaded)]); $self->default_module(ssl => [qw(mod_ssl)]); $self->default_module(access => [qw(mod_access mod_authz_host)]); $self->default_module(auth => [qw(mod_auth mod_auth_basic)]); $self->default_module(php => [qw(sapi_apache2 mod_php4 mod_php5)]); $self->{server}->post_config; return $self; } sub default_module { my($self, $name, $choices) = @_; my $mname = $name . '_module_name'; unless ($self->{vars}->{$mname}) { ($self->{vars}->{$mname}) = grep { $self->{modules}->{"$_.c"}; } @$choices; $self->{vars}->{$mname} ||= $choices->[0]; } $self->{vars}->{$name . '_module'} = $self->{vars}->{$mname} . '.c' } sub configure_apxs { my $self = shift; $self->{APXS} = $self->default_apxs; return unless $self->{APXS}; $self->{APXS} =~ s{/}{\\}g if WIN32; my $vars = $self->{vars}; $vars->{bindir} ||= $self->apxs('BINDIR', 1); $vars->{sbindir} ||= $self->apxs('SBINDIR'); $vars->{target} ||= $self->apxs('TARGET'); $vars->{conf_dir} ||= $self->apxs('SYSCONFDIR'); if ($vars->{conf_dir}) { $vars->{httpd_conf} ||= catfile $vars->{conf_dir}, 'httpd.conf'; } } sub configure_httpd { my $self = shift; my $vars = $self->{vars}; debug "configuring httpd"; $vars->{target} ||= (WIN32 ? 'Apache.EXE' : 'httpd'); unless ($vars->{httpd}) { #sbindir should be bin/ with the default layout #but its eaiser to workaround apxs than fix apxs for my $dir (map { $vars->{$_} } qw(sbindir bindir)) { next unless defined $dir; my $httpd = catfile $dir, $vars->{target}; next unless -x $httpd; $vars->{httpd} = $httpd; last; } $vars->{httpd} ||= $self->default_httpd; } if ($vars->{httpd}) { my @chunks = splitdir $vars->{httpd}; #handle both $prefix/bin/httpd and $prefix/Apache.exe for (1,2) { pop @chunks; last unless @chunks; $self->{httpd_basedir} = catfile @chunks; last if -d "$self->{httpd_basedir}/bin"; } } #cleanup httpd droppings my $sem = catfile $vars->{t_logs}, 'apache_runtime_status.sem'; unless (-e $sem) { $self->clean_add_file($sem); } } sub configure_httpd_eapi { my $self = shift; my $vars = $self->{vars}; #deal with EAPI_MM_CORE_PATH if defined. if (defined($self->{httpd_defines}->{EAPI_MM_CORE_PATH})) { my $path = $self->{httpd_defines}->{EAPI_MM_CORE_PATH}; #ensure the directory exists my @chunks = splitdir $path; pop @chunks; #the file component of the path $path = catdir @chunks; unless (file_name_is_absolute $path) { $path = catdir $vars->{serverroot}, $path; } $self->gendir($path); } } sub configure_proxy { my $self = shift; my $vars = $self->{vars}; #if we proxy to ourselves, must bump the maxclients if ($vars->{proxy} =~ /^on$/i) { unless ($vars->{maxclients_preset}) { $vars->{minclients}++; $vars->{maxclients}++; } $vars->{proxy} = $self->{vhosts}->{'mod_proxy'}->{hostport}; return $vars->{proxy}; } return undef; } # adds the config to the head of the group instead of the tail # XXX: would be even better to add to a different sub-group # (e.g. preamble_first) of only those that want to be first and then, # make sure that they are dumped to the config file first in the same # group (e.g. preamble) sub add_config_first { my $self = shift; my $where = shift; unshift @{ $self->{$where} }, $self->massage_config_args(@_); } sub add_config_last { my $self = shift; my $where = shift; push @{ $self->{$where} }, $self->massage_config_args(@_); } sub massage_config_args { my $self = shift; my($directive, $arg, $data) = @_; my $args = ""; if ($data) { $args = "<$directive $arg>\n"; if (ref($data) eq 'HASH') { while (my($k,$v) = each %$data) { $args .= " $k $v\n"; } } elsif (ref($data) eq 'ARRAY') { # balanced (key=>val) list my $pairs = @$data / 2; for my $i (0..($pairs-1)) { $args .= sprintf " %s %s\n", $data->[$i*2], $data->[$i*2+1]; } } else { $data=~s/\n(?!\z)/\n /g; $args .= " $data"; } $args .= "\n"; } elsif (ref($directive) eq 'ARRAY') { $args = join "\n", @$directive; } else { $args = join " ", grep length($_), $directive, (ref($arg) && (ref($arg) eq 'ARRAY') ? "@$arg" : $arg || ""); } return $args; } sub postamble_first { shift->add_config_first(postamble => @_); } sub postamble { shift->add_config_last(postamble => @_); } sub preamble_first { shift->add_config_first(preamble => @_); } sub preamble { shift->add_config_last(preamble => @_); } sub postamble_register { push @{ shift->{postamble_hooks} }, @_; } sub preamble_register { push @{ shift->{preamble_hooks} }, @_; } sub add_config_hooks_run { my($self, $where, $out) = @_; for (@{ $self->{"${where}_hooks"} }) { if ((ref($_) and ref($_) eq 'CODE') or $self->can($_)) { $self->$_(); } else { error "cannot run configure hook: `$_'"; } } for (@{ $self->{$where} }) { $self->replace; s/\n?$/\n/; print $out "$_"; } } sub postamble_run { shift->add_config_hooks_run(postamble => @_); } sub preamble_run { shift->add_config_hooks_run(preamble => @_); } sub default_group { return if WINFU; my $gid = $); #use only first value if $) contains more than one $gid =~ s/^(\d+).*$/$1/; my $group = $ENV{APACHE_TEST_GROUP} || (getgrgid($gid) || "#$gid"); if ($group eq 'root') { # similar to default_user, we want to avoid perms problems, # when the server is started with group 'root'. When running # under group root it may fail to create dirs and files, # writable only by user my $user = default_user(); my $gid = $user ? (getpwnam($user))[3] : ''; $group = (getgrgid($gid) || "#$gid") if $gid; } $group; } sub default_user { return if WINFU; my $uid = $>; my $user = $ENV{APACHE_TEST_USER} || (getpwuid($uid) || "#$uid"); if ($user eq 'root') { my $other = (getpwnam('nobody'))[0]; if ($other) { $user = $other; } else { die "cannot run tests as User root"; #XXX: prompt for another username } } return $user; } sub default_serveradmin { my $vars = shift->{vars}; join '@', ($vars->{user} || 'unknown'), $vars->{servername}; } sub default_apxs { my $self = shift; return $self->{vars}->{apxs} if $self->{vars}->{apxs}; if (my $build_config = $self->modperl_build_config()) { return $build_config->{MP_APXS}; } if ($ENV{APACHE_TEST_APXS}) { return $ENV{APACHE_TEST_APXS}; } # look in PATH as a last resort if (my $apxs = which('apxs')) { return $apxs; } elsif ($apxs = which('apxs2')) { return $apxs; } return; } sub default_httpd { my $self = shift; my $vars = $self->{vars}; if (my $build_config = $self->modperl_build_config()) { if (my $p = $build_config->{MP_AP_PREFIX}) { for my $bindir (qw(bin sbin)) { my $httpd = catfile $p, $bindir, $vars->{target}; return $httpd if -e $httpd; # The executable on Win32 in Apache/2.2 is httpd.exe, # so try that if Apache.exe doesn't exist if (WIN32) { $httpd = catfile $p, $bindir, 'httpd.EXE'; if (-e $httpd) { $vars->{target} = 'httpd.EXE'; return $httpd; } } } } } if ($ENV{APACHE_TEST_HTTPD}) { return $ENV{APACHE_TEST_HTTPD}; } # look in PATH as a last resort if (my $httpd = which('httpd')) { return $httpd; } elsif ($httpd = which('httpd2')) { return $httpd; } elsif ($httpd = which('apache')) { return $httpd; } elsif ($httpd = which('apache2')) { return $httpd; } return; } my $localhost; sub default_localhost { my $localhost_addr = pack('C4', 127, 0, 0, 1); gethostbyaddr($localhost_addr, Socket::AF_INET()) || 'localhost'; } sub default_servername { my $self = shift; $localhost ||= $self->default_localhost; die "Can't figure out the default localhost's server name" unless $localhost; } # memoize the selected value (so we make sure that the same port is used # via select). The problem is that select_first_port() is called 3 times after # -clean, and it's possible that a lower port will get released # between calls, leading to various places in the test suite getting a # different base port selection. # # XXX: There is still a problem if two t/TEST's configure at the same # time, so they both see the same port free, but only the first one to # bind() will actually get the port. So there is a need in another # check and reconfiguration just before the server starts. # my $port_memoized; sub select_first_port { my $self = shift; my $port ||= $port_memoized || $ENV{APACHE_TEST_PORT} || $self->{vars}{port} || DEFAULT_PORT; # memoize $port_memoized = $port; return $port unless $port eq 'select'; # port select mode: try to find another available port, take into # account that each instance of the test suite may use more than # one port for virtual hosts, therefore try to check ports in big # steps (20?). my $step = 20; my $tries = 20; $port = DEFAULT_PORT; until (Apache::TestServer->port_available($port)) { unless (--$tries) { error "no ports available"; error "tried ports @{[DEFAULT_PORT]} - $port in $step increments"; return 0; } $port += $step; } info "the default base port is used, using base port $port instead" unless $port == DEFAULT_PORT; # memoize $port_memoized = $port; return $port; } my $remote_addr; sub our_remote_addr { my $self = shift; my $name = $self->default_servername; my $iaddr = (gethostbyname($name))[-1]; unless (defined $iaddr) { error "Can't resolve host: '$name' (check /etc/hosts)"; exit 1; } $remote_addr ||= Socket::inet_ntoa($iaddr); } sub default_loopback { '127.0.0.1'; } sub port { my($self, $module) = @_; unless ($module) { my $vars = $self->{vars}; return $self->select_first_port() unless $vars->{scheme} eq 'https'; $module = $vars->{ssl_module_name}; } return $self->{vhosts}->{$module}->{port}; } sub hostport { my $self = shift; my $vars = shift || $self->{vars}; my $module = shift || ''; my $name = $vars->{servername}; join ':', $name , $self->port($module || ''); } #look for mod_foo.so sub find_apache_module { my($self, $module) = @_; die "find_apache_module: module name argument is required" unless $module; my $vars = $self->{vars}; my $sroot = $vars->{serverroot}; my @trys = grep { $_ } ($vars->{src_dir}, $self->apxs('LIBEXECDIR'), catfile($sroot, 'modules'), catfile($sroot, 'libexec')); for (@trys) { my $file = catfile $_, $module; if (-e $file) { debug "found $module => $file"; return $file; } } # if the module wasn't found try to lookup in the list of modules # inherited from the system-wide httpd.conf my $name = $module; $name =~ s/\.s[ol]$/.c/; #mod_info.so => mod_info.c $name =~ s/^lib/mod_/; #libphp4.so => mod_php4.c return $self->{modules}->{$name} if $self->{modules}->{$name}; } #generate files and directories my %warn_style = ( html => sub { "" }, c => sub { "/* @_ */" }, php => sub { "" }, default => sub { join '', grep {s/^/\# /gm} @_ }, ); my %file_ext = ( map({$_ => 'html'} qw(htm html)), map({$_ => 'c' } qw(c h)), map({$_ => 'php' } qw(php)), ); # return the passed file's extension or '' if there is no one # note: that '/foo/bar.conf.in' returns an extension: 'conf.in'; # note: a hidden file .foo will be recognized as an extension 'foo' sub filename_ext { my ($self, $filename) = @_; my $ext = (File::Basename::fileparse($filename, '\..*'))[2] || ''; $ext =~ s/^\.(.*)/lc $1/e; $ext; } sub warn_style_sub_ref { my ($self, $filename) = @_; my $ext = $self->filename_ext($filename); return $warn_style{ $file_ext{$ext} || 'default' }; } sub genwarning { my($self, $filename, $from_filename) = @_; return unless $filename; my $time = scalar localtime; my $warning = "WARNING: this file is generated"; $warning .= " (from $from_filename)" if defined $from_filename; $warning .= ", do not edit\n"; $warning .= "generated on $time\n"; $warning .= calls_trace(); return $self->warn_style_sub_ref($filename)->($warning); } sub calls_trace { my $frame = 1; my $trace = ''; while (1) { my($package, $filename, $line) = caller($frame); last unless $filename; $trace .= sprintf "%02d: %s:%d\n", $frame, $filename, $line; $frame++; } return $trace; } sub clean_add_file { my($self, $file) = @_; $self->{clean}->{files}->{ rel2abs($file) } = 1; } sub clean_add_path { my($self, $path) = @_; $path = rel2abs($path); # remember which dirs were created and should be cleaned up while (1) { $self->{clean}->{dirs}->{$path} = 1; $path = dirname $path; last if -e $path; } } sub genfile_trace { my($self, $file, $from_file) = @_; my $name = abs2rel $file, $self->{vars}->{t_dir}; my $msg = "generating $name"; $msg .= " from $from_file" if defined $from_file; debug $msg; } sub genfile_warning { my($self, $file, $from_file, $fh) = @_; if (my $msg = $self->genwarning($file, $from_file)) { print $fh $msg, "\n"; } } # $from_file == undef if there was no templates used sub genfile { my($self, $file, $from_file, $nowarning) = @_; # create the parent dir if it doesn't exist yet my $dir = dirname $file; $self->makepath($dir); $self->genfile_trace($file, $from_file); my $fh = Symbol::gensym(); open $fh, ">$file" or die "open $file: $!"; $self->genfile_warning($file, $from_file, $fh) unless $nowarning; $self->clean_add_file($file); return $fh; } # gen + write file sub writefile { my($self, $file, $content, $nowarning) = @_; my $fh = $self->genfile($file, undef, $nowarning); print $fh $content if $content; close $fh; } sub perlscript_header { require FindBin; my @dirs = (); # mp2 needs its modper-2.0/lib before blib was created if (IS_MOD_PERL_2_BUILD || $ENV{APACHE_TEST_LIVE_DEV}) { # the live 'lib/' dir of the distro # (e.g. modperl-2.0/ModPerl-Registry/lib) my $dir = canonpath catdir $FindBin::Bin, "lib"; push @dirs, $dir if -d $dir; # the live dir of the top dir if any (e.g. modperl-2.0/lib) if (-e catfile($FindBin::Bin, "..", "Makefile.PL")) { my $dir = canonpath catdir $FindBin::Bin, "..", "lib"; push @dirs, $dir if -d $dir; } } for (qw(. ..)) { my $dir = canonpath catdir $FindBin::Bin, $_ , "Apache-Test", "lib"; if (-d $dir) { push @dirs, $dir; last; } } { my $dir = canonpath catdir $FindBin::Bin, "t", "lib"; push @dirs, $dir if -d $dir; } my $dirs = join("\n ", '', @dirs) . "\n";; return <<"EOF"; use strict; use warnings FATAL => 'all'; use lib qw($dirs); EOF } # gen + write executable perl script file sub write_perlscript { my($self, $file, $content) = @_; my $fh = $self->genfile($file, undef, 1); my $shebang = make_shebang(); print $fh $shebang; $self->genfile_warning($file, undef, $fh); print $fh $content if $content; close $fh; chmod 0755, $file; } sub make_shebang { # if perlpath is longer than 62 chars, some shells on certain # platforms won't be able to run the shebang line, so when seeing # a long perlpath use the eval workaround. # see: http://en.wikipedia.org/wiki/Shebang # http://homepages.cwi.nl/~aeb/std/shebang/ my $shebang = length $Config{perlpath} < 62 ? "#!$Config{perlpath}\n" : <clean_add_file($to); } sub symlink { my($self, $from, $to) = @_; CORE::symlink($from, $to); $self->clean_add_file($to); } sub gendir { my($self, $dir) = @_; $self->makepath($dir); } # returns a list of dirs successfully created sub makepath { my($self, $path) = @_; return if !defined($path) || -e $path; $self->clean_add_path($path); return File::Path::mkpath($path, 0, 0755); } sub open_cmd { my($self, $cmd) = @_; # untaint some %ENV fields local @ENV{ qw(IFS CDPATH ENV BASH_ENV) }; local $ENV{PATH} = untaint_path($ENV{PATH}); # launder for -T $cmd = $1 if $cmd =~ /(.*)/; my $handle = Symbol::gensym(); open $handle, "$cmd|" or die "$cmd failed: $!"; return $handle; } sub clean { my $self = shift; $self->{clean_level} = shift || 2; #2 == really clean, 1 == reconfigure $self->new_test_server->clean; $self->cmodules_clean; $self->sslca_clean; for (sort keys %{ $self->{clean}->{files} }) { if (-e $_) { debug "unlink $_"; unlink $_; } else { debug "unlink $_: $!"; } } # if /foo comes before /foo/bar, /foo will never be removed # hence ensure that sub-dirs are always treated before a parent dir for (reverse sort keys %{ $self->{clean}->{dirs} }) { if (-d $_) { my $dh = Symbol::gensym(); opendir($dh, $_); my $notempty = grep { ! /^\.{1,2}$/ } readdir $dh; closedir $dh; next if $notempty; debug "rmdir $_"; rmdir $_; } } } my %special_tokens = ( nextavailableport => sub { shift->server->select_next_port } ); sub replace { my $self = shift; my $file = $Apache::TestConfig::File ? "in file $Apache::TestConfig::File" : ''; s[@(\w+)@] [ my $key = lc $1; if (my $callback = $special_tokens{$key}) { $self->$callback; } elsif (exists $self->{vars}->{$key}) { $self->{vars}->{$key}; } else { die "invalid token: \@$1\@ $file\n"; } ]ge; } #need to configure the vhost port for redirects and $ENV{SERVER_PORT} #to have the correct values my %servername_config = ( 0 => sub { my($name, $port) = @_; [ServerName => ''], [Port => 0]; }, 1 => sub { my($name, $port) = @_; [ServerName => $name], [Port => $port]; }, 2 => sub { my($name, $port) = @_; [ServerName => "$name:$port"]; }, ); sub servername_config { my $self = shift; $self->server->version_of(\%servername_config)->(@_); } sub parse_vhost { my($self, $line) = @_; my($indent, $module, $namebased); if ($line =~ /^(\s*)\s*$/) { $indent = $1 || ""; $namebased = $2 || ""; $module = $3; } else { return undef; } my $vars = $self->{vars}; my $mods = $self->{modules}; my $have_module = "$module.c"; my $ssl_module = $vars->{ssl_module}; #if module ends with _ssl and it is not the module that implements ssl, #then assume this module is a vhost with SSLEngine On (or similar) #see mod_echo in extra.conf.in for example if ($module =~ /^(mod_\w+)_ssl$/ and $have_module ne $ssl_module) { $have_module = "$1.c"; #e.g. s/mod_echo_ssl.c/mod_echo.c/ return undef unless $mods->{$ssl_module}; } #don't allocate a port if this module is not configured #assumes the configuration is inside an if ($module =~ /^mod_/ and not $mods->{$have_module}) { return undef; } #allocate a port and configure this module into $self->{vhosts} my $port = $self->new_vhost($module, $namebased); #extra config that should go *inside* the my @in_config = $self->servername_config($namebased ? $namebased : $vars->{servername}, $port); my @out_config = (); if ($self->{vhosts}->{$module}->{namebased} < 2) { #extra config that should go *outside* the @out_config = ([Listen => '0.0.0.0:' . $port]); if ($self->{vhosts}->{$module}->{namebased}) { push @out_config => ["\n". "${indent}${indent}NameVirtualHost" => "*:$port\n${indent}"]; } } $self->{vars}->{$module . '_port'} = $port; #there are two ways of building a vhost #first is when we parse test .pm and .c files #second is when we scan *.conf.in my $form_postamble = sub { my $indent = shift; for my $pair (@_) { $self->postamble("$indent@$pair"); } }; my $form_string = sub { my $indent = shift; join "\n", map { "$indent@$_\n" } @_; }; my $double_indent = $indent ? $indent x 2 : ' ' x 4; return { port => $port, #used when parsing .pm and .c test modules in_postamble => sub { $form_postamble->($double_indent, @in_config) }, out_postamble => sub { $form_postamble->($indent, @out_config) }, #used when parsing *.conf.in files in_string => $form_string->($double_indent, @in_config), out_string => $form_string->($indent, @out_config), line => "$indent", }; } sub find_and_load_module { my ($self, $name) = @_; my $mod_path = $self->find_apache_module($name) or return; my ($sym) = $name =~ m/mod_(\w+)\./; if ($mod_path && -e $mod_path) { $self->preamble(IfModule => "!mod_$sym.c", qq{LoadModule ${sym}_module "$mod_path"\n}); } return 1; } sub replace_vhost_modules { my $self = shift; if (my $cfg = $self->parse_vhost($_)) { $_ = ''; for my $key (qw(out_string line in_string)) { next unless $cfg->{$key}; $_ .= "$cfg->{$key}\n"; } } } sub replace_vars { my($self, $in, $out) = @_; local $_; while (<$in>) { $self->replace; $self->replace_vhost_modules; print $out $_; } } sub index_html_template { my $self = shift; return "welcome to $self->{server}->{name}\n"; } sub generate_index_html { my $self = shift; my $dir = $self->{vars}->{documentroot}; $self->gendir($dir); my $file = catfile $dir, 'index.html'; return if -e $file; my $fh = $self->genfile($file); print $fh $self->index_html_template; } sub types_config_template { return <find_and_load_module('mod_mime.so'); unless ($self->{inherit_config}->{TypesConfig}) { my $types = catfile $self->{vars}->{t_conf}, 'mime.types'; unless (-e $types) { my $fh = $self->genfile($types); print $fh $self->types_config_template; close $fh; } $self->postamble(< TypesConfig "$types" EOI } } # various dup bugs in older perl and perlio in perl < 5.8.4 need a # workaround to explicitly rewind the dupped DATA fh before using it my $DATA_pos = tell DATA; sub httpd_conf_template { my($self, $try) = @_; my $in = Symbol::gensym(); if (open $in, $try) { return $in; } else { my $dup = Symbol::gensym(); open $dup, "<&DATA" or die "Can't dup DATA: $!"; seek $dup, $DATA_pos, 0; # rewind to the beginning return $dup; # so we don't close DATA } } #certain variables may not be available until certain config files #are generated. for example, we don't know the ssl port until ssl.conf.in #is parsed. ssl port is needed for proxyssl testing sub check_vars { my $self = shift; my $vars = $self->{vars}; unless ($vars->{proxyssl_url}) { my $ssl = $self->{vhosts}->{ $vars->{ssl_module_name} }; if ($ssl) { $vars->{proxyssl_url} ||= $ssl->{hostport}; } if ($vars->{proxyssl_url}) { unless ($vars->{maxclients_preset}) { $vars->{minclients}++; $vars->{maxclients}++; } } } } sub extra_conf_files_needing_update { my $self = shift; my @need_update = (); finddepth(sub { return unless /\.in$/; (my $generated = $File::Find::name) =~ s/\.in$//; push @need_update, $generated unless -e $generated && -M $generated < -M $File::Find::name; }, $self->{vars}->{t_conf}); return @need_update; } sub generate_extra_conf { my $self = shift; my(@extra_conf, @conf_in, @conf_files); finddepth(sub { return unless /\.in$/; push @conf_in, catdir $File::Find::dir, $_; }, $self->{vars}->{t_conf}); #make ssl port always be 8530 when available for my $file (@conf_in) { if (basename($file) =~ /^ssl/) { unshift @conf_files, $file; } else { push @conf_files, $file; } } for my $file (@conf_files) { (my $generated = $file) =~ s/\.in$//; debug "Will 'Include' $generated config file"; push @extra_conf, $generated; } # regenerate .conf files for my $file (@conf_files) { local $Apache::TestConfig::File = $file; my $in = Symbol::gensym(); open($in, $file) or next; (my $generated = $file) =~ s/\.in$//; my $out = $self->genfile($generated, $file); $self->replace_vars($in, $out); close $in; close $out; $self->check_vars; } #we changed order to give ssl the first port after DEFAULT_PORT #but we want extra.conf Included first so vhosts inherit base config #such as LimitRequest* return [ sort @extra_conf ]; } sub sslca_can { my($self, $check) = @_; my $vars = $self->{vars}; return 0 unless $self->{modules}->{ $vars->{ssl_module} }; return 0 unless -d "$vars->{t_conf}/ssl"; require Apache::TestSSLCA; if ($check) { my $openssl = Apache::TestSSLCA::openssl(); if (which($openssl)) { return 1; } error "cannot locate '$openssl' program required to generate SSL CA"; exit(1); } return 1; } sub sslca_generate { my $self = shift; my $ca = $self->{vars}->{sslca}; return if $ca and -d $ca; #t/conf/ssl/ca return unless $self->sslca_can(1); Apache::TestSSLCA::generate($self); } sub sslca_clean { my $self = shift; # XXX: httpd config is required, for now just skip ssl clean if # there is none. should probably add some flag which will tell us # when httpd_config was already run return unless $self->{vars}->{httpd} && $self->{vars}->{ssl_module}; return unless $self->sslca_can; Apache::TestSSLCA::clean($self); } #XXX: just a quick hack to support t/TEST -ssl #outside of httpd-test/perl-framework sub generate_ssl_conf { my $self = shift; my $vars = $self->{vars}; my $conf = "$vars->{t_conf}/ssl"; my $httpd_test_ssl = "../httpd-test/perl-framework/t/conf/ssl"; my $ssl_conf = "$vars->{top_dir}/$httpd_test_ssl"; if (-d $ssl_conf and not -d $conf) { $self->gendir($conf); for (qw(ssl.conf.in)) { $self->cpfile("$ssl_conf/$_", "$conf/$_"); } for (qw(certs keys crl)) { $self->symlink("$ssl_conf/$_", "$conf/$_"); } } } sub find_in_inc { my($self, $dir) = @_; for my $path (@INC) { my $location = "$path/$dir"; return $location if -d $location; } return ""; } sub prepare_t_conf { my $self = shift; $self->gendir($self->{vars}->{t_conf}); } my %aliases = ( "perl-pod" => "perlpod", "binary-httpd" => "httpd", "binary-perl" => "perl", ); sub generate_httpd_conf { my $self = shift; my $vars = $self->{vars}; #generated httpd.conf depends on these things to exist $self->generate_types_config; $self->generate_index_html; $self->gendir($vars->{t_logs}); $self->gendir($vars->{t_conf}); my @very_last_postamble = (); if (my $extra_conf = $self->generate_extra_conf) { for my $file (@$extra_conf) { my $entry; if ($file =~ /\.conf$/) { next if $file =~ m|/httpd\.conf$|; $entry = qq(Include "$file"); } elsif ($file =~ /\.pl$/) { $entry = qq(\n PerlRequire "$file"\n\n); } else { next; } # put the .last includes very last if ($file =~ /\.last\.(conf|pl)$/) { push @very_last_postamble, $entry; } else { $self->postamble($entry); } } } $self->configure_proxy; my $conf_file = $vars->{t_conf_file}; my $conf_file_in = join '.', $conf_file, 'in'; my $in = $self->httpd_conf_template($conf_file_in); my $out = $self->genfile($conf_file); $self->find_and_load_module('mod_alias.so'); $self->preamble_run($out); for my $name (qw(user group)) { #win32 if ($vars->{$name}) { print $out qq[\u$name "$vars->{$name}"\n]; } } #2.0: ServerName $ServerName:$Port #1.3: ServerName $ServerName # Port $Port my @name_cfg = $self->servername_config($vars->{servername}, $vars->{port}); for my $pair (@name_cfg) { print $out "@$pair\n"; } $self->replace_vars($in, $out); # handle the case when mod_alias is built as a shared object # but wasn't included in the system-wide httpd.conf print $out "\n"; for (sort keys %aliases) { next unless $vars->{$aliases{$_}}; print $out " Alias /getfiles-$_ $vars->{$aliases{$_}}\n"; } print $out "\n"; print $out "\n"; $self->postamble_run($out); print $out join "\n", @very_last_postamble; close $in; close $out or die "close $conf_file: $!"; } sub need_reconfiguration { my($self, $conf_opts) = @_; my @reasons = (); my $vars = $self->{vars}; # if '-port select' we need to check from scratch which ports are # available if (my $port = $conf_opts->{port} || $Apache::TestConfig::Argv{port}) { if ($port eq 'select') { push @reasons, "'-port $port' requires reconfiguration"; } } my $exe = $vars->{apxs} || $vars->{httpd} || ''; # if httpd.conf is older than executable push @reasons, "$exe is newer than $vars->{t_conf_file}" if -e $exe && -e $vars->{t_conf_file} && -M $exe < -M $vars->{t_conf_file}; # any .in files are newer than their derived versions? if (my @files = $self->extra_conf_files_needing_update) { # invalidate the vhosts cache, since a different port could be # assigned on reparse $self->{vhosts} = {}; for my $file (@files) { push @reasons, "$file.in is newer than $file"; } } # if special env variables are used (since they can change any time) # XXX: may be we could check whether they have changed since the # last run and thus avoid the reconfiguration? { my $passenv = passenv(); if (my @env_vars = sort grep { $ENV{$_} } keys %$passenv) { push @reasons, "environment variables (@env_vars) are set"; } } # if the generated config was created with a version of Apache-Test # less than the current version { my $current = Apache::Test->VERSION; my $config = $self->{apache_test_version}; if (! $config || $config < $current) { push @reasons, "configuration generated with old Apache-Test"; } } return @reasons; } sub error_log { my($self, $rel) = @_; my $file = catfile $self->{vars}->{t_logs}, 'error_log'; my $rfile = abs2rel $file, $self->{vars}->{top_dir}; return wantarray ? ($file, $rfile) : $rel ? $rfile : $file; } #utils #For Win32 systems, stores the extensions used for executable files #They may be . prefixed, so we will strip the leading periods. my @path_ext = (); if (WIN32) { if ($ENV{PATHEXT}) { push @path_ext, split ';', $ENV{PATHEXT}; for my $ext (@path_ext) { $ext =~ s/^\.*(.+)$/$1/; } } else { #Win9X: doesn't have PATHEXT push @path_ext, qw(com exe bat); } } sub which { my $program = shift; return undef unless $program; my @dirs = File::Spec->path(); require Config; my $perl_bin = $Config::Config{bin} || ''; push @dirs, $perl_bin if $perl_bin and -d $perl_bin; for my $base (map { catfile $_, $program } @dirs) { if ($ENV{HOME} and not WIN32) { # only works on Unix, but that's normal: # on Win32 the shell doesn't have special treatment of '~' $base =~ s/~/$ENV{HOME}/o; } return $base if -x $base && -f _; if (WIN32) { for my $ext (@path_ext) { return "$base.$ext" if -x "$base.$ext" && -f _; } } } } sub apxs { my($self, $q, $ok_fail) = @_; return unless $self->{APXS}; my $val; unless (exists $self->{_apxs}{$q}) { local @ENV{ qw(IFS CDPATH ENV BASH_ENV) }; local $ENV{PATH} = untaint_path($ENV{PATH}); my $devnull = devnull(); my $apxs = shell_ready($self->{APXS}); $val = qx($apxs -q $q 2>$devnull); chomp $val if defined $val; # apxs post-2.0.40 adds a new line if ($val) { $self->{_apxs}{$q} = $val; } unless ($val) { if ($ok_fail) { return ""; } else { warn "APXS ($self->{APXS}) query for $q failed\n"; return $val; } } } $self->{_apxs}{$q}; } # return an untainted PATH sub untaint_path { my $path = shift; return '' unless defined $path; ($path) = ( $path =~ /(.*)/ ); # win32 uses ';' for a path separator, assume others use ':' my $sep = WIN32 ? ';' : ':'; # -T disallows relative and empty directories in the PATH return join $sep, grep File::Spec->file_name_is_absolute($_), grep length($_), split /$sep/, $path; } sub pop_dir { my $dir = shift; my @chunks = splitdir $dir; while (my $remove = shift) { pop @chunks if $chunks[-1] eq $remove; } catfile @chunks; } sub add_inc { my $self = shift; return if $ENV{MOD_PERL}; #already setup by mod_perl require lib; # make sure that Apache-Test/lib will be first in @INC, # followed by modperl-2.0/lib (or some other project's lib/), # followed by blib/ and finally system-wide libs. my $top_dir = $self->{vars}->{top_dir}; my @dirs = map { catdir $top_dir, "blib", $_ } qw(lib arch); my $apache_test_dir = catdir $top_dir, "Apache-Test"; unshift @dirs, $apache_test_dir if -d $apache_test_dir; lib::->import(@dirs); if ($ENV{APACHE_TEST_LIVE_DEV}) { # add lib/ in a separate call to ensure that it'll end up on # top of @INC my $lib_dir = catdir $top_dir, "lib"; lib::->import($lib_dir) if -d $lib_dir; } #print join "\n", "add_inc", @INC, ""; } #freeze/thaw so other processes can access config sub thaw { my $class = shift; $class->new({thaw => 1, @_}); } sub freeze { require Data::Dumper; local $Data::Dumper::Terse = 1; my $data = Data::Dumper::Dumper(shift); chomp $data; $data; } sub sync_vars { my $self = shift; return if $self->{save}; #this is not a cached config my $changed = 0; my $thaw = $self->thaw; my $tvars = $thaw->{vars}; my $svars = $self->{vars}; for my $key (@_) { for my $v ($tvars, $svars) { if (exists $v->{$key} and not defined $v->{$key}) { $v->{$key} = ''; #rid undef } } next if exists $tvars->{$key} and exists $svars->{$key} and $tvars->{$key} eq $svars->{$key}; $tvars->{$key} = $svars->{$key}; $changed = 1; } return unless $changed; $thaw->{save} = 1; $thaw->save; } sub save { my($self) = @_; return unless $self->{save}; # add in the Apache-Test version for later comparisions $self->{apache_test_version} = Apache::Test->VERSION; my $name = 'apache_test_config'; my $file = catfile $self->{vars}->{t_conf}, "$name.pm"; my $fh = $self->genfile($file); debug "saving config data to $name.pm"; (my $obj = $self->freeze) =~ s/^/ /; print $fh <new({thaw=>1}); # XXX: need to run httpd config to get the value of httpd if (my $httpd = $test_config->{vars}->{httpd}) { $httpd = shell_ready($httpd); $command = "$httpd -V"; $cfg .= "\n*** $command\n"; $cfg .= qx{$command}; $cfg .= ldd_as_string($httpd); } else { $cfg .= "\n\n*** The httpd binary was not found\n"; } # perl opts my $perl = shell_ready($^X); $command = "$perl -V"; $cfg .= "\n\n*** $command\n"; $cfg .= qx{$command}; return $cfg; } sub ldd_as_string { my $httpd = shift; my $command; if (OSX) { my $otool = which('otool'); $command = "$otool -L $httpd" if $otool; } elsif (!WIN32) { my $ldd = which('ldd'); $command = "$ldd $httpd" if $ldd; } my $cfg = ''; if ($command) { $cfg .= "\n*** $command\n"; $cfg .= qx{$command}; } return $cfg; } # make a string suitable for feed to shell calls (wrap in quotes and # escape quotes) sub shell_ready { my $arg = shift; $arg =~ s!\\?"!\\"!g; return qq["$arg"]; } 1; =head1 NAME Apache::TestConfig -- Test Configuration setup module =head1 SYNOPSIS use Apache::TestConfig; my $cfg = Apache::TestConfig->new(%args) my $fh = $cfg->genfile($file); $cfg->writefile($file, $content); $cfg->gendir($dir); ... =head1 DESCRIPTION C is used in creating the C configuration files. =head1 FUNCTIONS =over =item genwarning() my $warn = $cfg->genwarning($filename) genwarning() returns a warning string as a comment, saying that the file was autogenerated and that it's not a good idea to modify this file. After the warning a perl trace of calls to this this function is appended. This trace is useful for finding what code has created the file. my $warn = $cfg->genwarning($filename, $from_filename) If C<$from_filename> is specified it'll be used in the warning to tell which file it was generated from. genwarning() automatically recognizes the comment type based on the file extension. If the extension is not recognized, the default C<#> style is used. Currently it support C!-- --E>, C and C<#> styles. =item genfile() my $fh = $cfg->genfile($file); genfile() creates a new file C<$file> for writing and returns a file handle. If parent directories of C<$file> don't exist they will be automagically created. The file C<$file> and any created parent directories (if found empty) will be automatically removed on cleanup. A comment with a warning and calls trace is added to the top of this file. See genwarning() for more info about this comment. my $fh = $cfg->genfile($file, $from_file); If C<$from_filename> is specified it'll be used in the warning to tell which file it was generated from. my $fh = $cfg->genfile($file, $from_file, $nowarning); If C<$nowarning> is true, the warning won't be added. If using this optional argument and there is no C<$from_file> you must pass undef as in: my $fh = $cfg->genfile($file, undef, $nowarning); =item writefile() $cfg->writefile($file, $content, [$nowarning]); writefile() creates a new file C<$file> with the content of C<$content>. A comment with a warning and calls trace is added to the top of this file unless C<$nowarnings> is passed and set to a true value. See genwarning() for more info about this comment. If parent directories of C<$file> don't exist they will be automagically created. The file C<$file> and any created parent directories (if found empty) will be automatically removed on cleanup. =item write_perlscript() $cfg->write_perlscript($filename, @lines); Similar to writefile() but creates an executable Perl script with correctly set shebang line. =item gendir() $cfg->gendir($dir); gendir() creates a new directory C<$dir>. If parent directories of C<$dir> don't exist they will be automagically created. The directory C<$dir> and any created parent directories will be automatically removed on cleanup if found empty. =back =head1 Environment Variables The following environment variables affect the configuration and the run-time of the C framework: =head2 APACHE_TEST_COLOR To aid visual control over the configuration process and the run-time phase, C uses coloured fonts when the environment variable C is set to a true value. =head2 APACHE_TEST_LIVE_DEV When using C during the project development phase, it's often convenient to have the I (live) directory appearing first in C<@INC> so any changes to the Perl modules, residing in it, immediately affect the server, without a need to rerun C to update I. When the environment variable C is set to a true value during the configuration phase (C, C will automatically unshift the I directory into C<@INC>, via the autogenerated I file. =head1 Special Placeholders When generating configuration files from the I<*.in> templates, special placeholder variables get substituted. To embed a placeholder use the C<@foo@> syntax. For example in I you can write: Include @ServerRoot@/conf/myconfig.conf When I is generated, C<@ServerRoot@> will get replaced with the location of the server root. Placeholders are case-insensitive. Available placeholders: =head2 Configuration Options All configuration variables that can be passed to C, such as C, C, C, etc. To see the complete list run: % t/TEST --help and you will find them in the C sections. =head2 NextAvailablePort Every time this placeholder is encountered it'll be replaced with the next available port. This is very useful if you need to allocate a special port, but not hardcode it. Later when running: % t/TEST -port=select it's possible to run several concurrent test suites on the same machine, w/o having port collisions. =head1 AUTHOR =head1 SEE ALSO perl(1), Apache::Test(3) =cut __DATA__ Listen 0.0.0.0:@Port@ ServerRoot "@ServerRoot@" DocumentRoot "@DocumentRoot@" PidFile @t_pid_file@ ErrorLog @t_logs@/error_log LogLevel debug 2.4.1> DefaultRunTimeDir "@t_logs@" TransferLog @t_logs@/access_log ScriptSock @t_logs@/cgisock ServerAdmin @ServerAdmin@ #needed for http/1.1 testing KeepAlive On HostnameLookups Off Options FollowSymLinks AllowOverride None LockFile @t_logs@/accept.lock StartServers 1 MinSpareThreads @MinClients@ MaxSpareThreads @MinClients@ ThreadsPerChild @MinClients@ MaxClients @MaxClientsThreadedMPM@ MaxRequestsPerChild 0 LockFile @t_logs@/accept.lock NumServers 1 StartThreads @MinClients@ MinSpareThreads @MinClients@ MaxSpareThreads @MinClients@ MaxThreadsPerChild @MaxClients@ MaxRequestsPerChild 0 LockFile @t_logs@/accept.lock StartServers @MinClients@ MinSpareServers @MinClients@ MaxSpareServers @MinClients@ MaxClients @MaxClients@ MaxRequestsPerChild 0 LockFile @t_logs@/accept.lock StartServers @MinClients@ MinSpareServers @MinClients@ MaxSpareServers @MinClients@ MaxClients @MaxClients@ MaxRequestsPerChild 0 ThreadsPerChild 50 MaxRequestsPerChild 0 SetHandler server-info SetHandler server-status mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfigC.pm0000644000177200010010000002774512540623176020643 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfig; #not TestConfigC on purpose use strict; use warnings FATAL => 'all'; use Config; use Apache::TestConfig (); use Apache::TestConfigPerl (); use Apache::TestTrace; use File::Find qw(finddepth); sub cmodule_find { my($self, $mod) = @_; return unless $mod =~ /^mod_(\w+)\.c$/; my $sym = $1; my $dir = $File::Find::dir; my $file = catfile $dir, $mod; unless ($self->{APXS}) { $self->{cmodules_disabled}->{$mod} = "no apxs configured"; return; } my $fh = Symbol::gensym(); open $fh, $file or die "open $file: $!"; my $v = <$fh>; if ($v =~ /^\#define\s+HTTPD_TEST_REQUIRE_APACHE\s+(\d+)\s*$/) { #define HTTPD_TEST_REQUIRE_APACHE 1 unless ($self->{server}->{rev} == $1) { my $reason = "requires Apache version $1"; $self->{cmodules_disabled}->{$mod} = $reason; notice "$mod $reason, skipping."; return; } } elsif ($v =~ /^\#define\s+HTTPD_TEST_REQUIRE_APACHE\s+(\d\.\d+(\.\d+)?)/) { #define HTTPD_TEST_REQUIRE_APACHE 2.1 my $wanted = $1; (my $current) = $self->{server}->{version} =~ m:^Apache/(\d\.\d+\.\d+):; if (Apache::Test::normalize_vstring($current) < Apache::Test::normalize_vstring($wanted)) { my $reason = "requires Apache version $wanted"; $self->{cmodules_disabled}->{$mod} = $reason; notice "$mod $reason, skipping."; return; } } close $fh; push @{ $self->{cmodules} }, { name => "mod_$sym", sym => "${sym}_module", dir => $dir, subdir => basename $dir, }; } sub cmodules_configure { my($self, $dir) = @_; $self->{cmodules_disabled} = {}; #for have_module to check $dir ||= catfile $self->{vars}->{top_dir}, 'c-modules'; unless (-d $dir) { return; } $self->{cmodules_dir} = $dir; finddepth(sub { cmodule_find($self, $_) }, $dir); unless ($self->{APXS}) { warning "cannot build c-modules without apxs"; return; } $self->cmodules_generate_include; $self->cmodules_write_makefiles; $self->cmodules_compile; $self->cmodules_httpd_conf; } sub cmodules_makefile_vars { return < "", 2 => "") : (1 => "", 2 => ".libs/"); sub cmodules_build_so { my($self, $name) = @_; $name = "mod_$name" unless $name =~ /^mod_/; my $libdir = $self->server->version_of(\%lib_dir); my $lib = "$libdir$name.so"; } sub cmodules_write_makefiles { my $self = shift; my $modules = $self->{cmodules}; for (@$modules) { $self->cmodules_write_makefile($_); } my $file = catfile $self->{cmodules_dir}, 'Makefile'; my $fh = $self->genfile($file); print $fh $self->cmodules_makefile_vars; my @dirs = map { $_->{subdir} } @$modules; my @targets = qw(clean); my @libs; for my $dir (@dirs) { for my $targ (@targets) { print $fh "$dir-$targ:\n\tcd $dir && \$(MAKE) $targ\n\n"; } my $lib = $self->cmodules_build_so($dir); my $cfile = "$dir/mod_$dir.c"; push @libs, "$dir/$lib"; print $fh "$libs[-1]: $cfile\n\tcd $dir && \$(MAKE) $lib\n\n"; } for my $targ (@targets) { print $fh "$targ: ", (map { "$_-$targ " } @dirs), "\n\n"; } print $fh "all: @libs\n\n"; close $fh or die "close $file: $!"; } sub cmodules_write_makefile { my ($self, $mod) = @_; my $write = \&{"cmodules_write_makefile_$^O"}; $write = \&cmodules_write_makefile_default unless defined &$write; $write->($self, $mod); } sub cmodules_write_makefile_default { my($self, $mod) = @_; my $dversion = $self->server->dversion; my $name = $mod->{name}; my $makefile = catfile $mod->{dir}, 'Makefile'; my $extra = $ENV{EXTRA_CFLAGS} || ''; debug "writing $makefile"; my $lib = $self->cmodules_build_so($name); my $fh = $self->genfile($makefile); print $fh <{APXS} all: $lib $lib: $name.c \$(APXS) $dversion $extra -I$self->{cmodules_dir} -c $name.c clean: -rm -rf $name.o $name.lo $name.slo $name.la $name.i $name.s $name.gcno .libs EOF close $fh or die "close $makefile: $!"; } sub cmodules_write_makefile_aix { my($self, $mod) = @_; my $dversion = $self->server->dversion; my $name = $mod->{name}; my $makefile = catfile $mod->{dir}, 'Makefile'; my $apxsflags = ''; # # Only do this for Apache 1.* # if ($self->server->{rev} == 1) { $apxsflags = "-Wl,-bE:$name.exp"; my $expfile = catfile $mod->{dir}, "$name.exp"; if (! -f $expfile) { my $fh = Symbol::gensym(); $name =~ /^mod_(\w+)(?:\.c)?$/; my $sym = $1 . '_module'; open $fh, ">$expfile" or die "open $expfile: $!"; print $fh "$sym\n"; close $fh; } } my $extra = $ENV{EXTRA_CFLAGS} || ''; debug "writing $makefile"; my $lib = $self->cmodules_build_so($name); my $fh = Symbol::gensym(); open $fh, ">$makefile" or die "open $makefile: $!"; print $fh <{APXS} APXSFLAGS=$apxsflags all: $lib $lib: $name.c \$(APXS) $dversion $extra -I$self->{cmodules_dir} \$(APXSFLAGS) -c $name.c clean: -rm -rf $name.o $name.lo $name.slo $name.la .libs EOF close $fh or die "close $makefile: $!"; } sub cmodules_write_makefile_MSWin32 { my($self, $mod) = @_; my $dversion = $self->server->dversion; my $name = $mod->{name}; my $makefile = "$mod->{dir}/Makefile"; debug "writing $makefile"; my $extras = ''; my $lib = $self->cmodules_build_so($name); $extras = ' -llibhttpd -p ' if ($self->server->{rev} != 1); my $goners = join ' ', (map {$name . '.' . $_} qw(exp lib so lo)); my $fh = Symbol::gensym(); open $fh, ">$makefile" or die "open $makefile: $!"; my $extra = $ENV{EXTRA_CFLAGS} || ''; debug "writing $makefile"; print $fh <{APXS} all: $lib $lib: $name.c \$(APXS) $dversion $extra -I$self->{cmodules_dir} $extras -c $name.c clean: -erase $goners EOF close $fh or die "close $makefile: $!"; } sub cmodules_make { my $self = shift; my $targ = shift || 'all'; my $cmd = "cd $self->{cmodules_dir} && $Config{make} $targ"; debug $cmd; system $cmd; if ($?) { die "Failed to build c-modules"; } } sub cmodules_compile { shift->cmodules_make('all'); } sub cmodules_httpd_conf { my $self = shift; my @args; for my $mod (@{ $self->{cmodules} }) { my $dir = $mod->{dir}; my $lib = $self->cmodules_build_so($mod->{name}); my $so = "$dir/$lib"; next unless -e $so; $self->preamble(LoadModule => "$mod->{sym} $so"); my $cname = "$mod->{name}.c"; my $cfile = "$dir/$cname"; $self->{modules}->{$cname} = 1; $self->add_module_config($cfile, \@args); } $self->postamble(\@args) if @args; } sub cmodules_clean { my $self = shift; my $dir = $self->{cmodules_dir}; return unless $dir and -e "$dir/Makefile"; unless ($self->{clean_level} > 1) { #skip t/TEST -conf warning "skipping rebuild of c-modules; run t/TEST -clean to force"; return; } $self->cmodules_make('clean'); for my $mod (@{ $self->{cmodules} }) { my $makefile = "$mod->{dir}/Makefile"; debug "unlink $makefile"; unlink $makefile; } unlink "$dir/Makefile"; } #try making it easier for test modules to compile with both 1.x and 2.x sub cmodule_define_name { my $name = shift; $name eq 'NULL' ? $name : "APACHE_HTTPD_TEST_\U$name"; } sub cmodule_define { my $hook = cmodule_define_name(@_); "#ifndef $hook\n#define $hook NULL\n#endif\n"; } my @cmodule_config_names = qw(per_dir_create per_dir_merge per_srv_create per_srv_merge commands); my @cmodule_config_defines = map { cmodule_define($_); } @cmodule_config_names; my $cmodule_config_extra = "#ifndef APACHE_HTTPD_TEST_EXTRA_HOOKS\n". "#define APACHE_HTTPD_TEST_EXTRA_HOOKS(p) do { } while (0)\n". "#endif\n"; my $cmodule_config_hooks = join ",\n ", map { cmodule_define_name($_); } @cmodule_config_names; my @cmodule_phases = qw(post_read_request translate_name header_parser access_checker check_user_id auth_checker type_checker fixups handler log_transaction child_init); my $cmodule_hooks_1 = join ",\n ", map { cmodule_define_name($_); } qw(translate_name check_user_id auth_checker access_checker type_checker fixups log_transaction header_parser child_init NULL post_read_request); my $cmodule_template_1 = <<"EOF", static const handler_rec name ## _handlers[] = { {#name, APACHE_HTTPD_TEST_HANDLER}, /* ok if handler is NULL */ {NULL} }; module MODULE_VAR_EXPORT name ## _module = { STANDARD_MODULE_STUFF, NULL, /* initializer */ $cmodule_config_hooks, name ## _handlers, /* handlers */ $cmodule_hooks_1 } EOF my @cmodule_hooks = map { my $hook = cmodule_define_name($_); < $cmodule_template_1, 2 => $cmodule_template_2); sub cmodules_module_template { my $self = shift; my $template = $self->server->version_of(\%cmodule_templates); chomp $template; $template =~ s,$, \\,mg; $template =~ s, \\$,,s; local $" = ', '; return <genfile($file); while (read Apache::TestConfigC::DATA, my $buf, 1024) { print $fh $buf; } print $fh @cmodule_hook_defines, @cmodule_config_defines; print $fh $cmodule_config_extra; print $fh $self->cmodules_module_template; close $fh; } package Apache::TestConfigC; #Apache/TestConfig.pm also has __DATA__ 1; __DATA__ #ifndef APACHE_HTTPD_TEST_H #define APACHE_HTTPD_TEST_H /* headers present in both 1.x and 2.x */ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "http_request.h" #include "http_log.h" #include "http_main.h" #include "http_core.h" #include "ap_config.h" #ifdef APACHE1 #define AP_METHOD_BIT 1 typedef size_t apr_size_t; typedef array_header apr_array_header_t; #define APR_OFF_T_FMT "ld" #define APR_SIZE_T_FMT "lu" #endif /* APACHE1 */ #ifdef APACHE2 #ifndef APACHE_HTTPD_TEST_HOOK_ORDER #define APACHE_HTTPD_TEST_HOOK_ORDER APR_HOOK_MIDDLE #endif #include "ap_compat.h" #endif /* APACHE2 */ #endif /* APACHE_HTTPD_TEST_H */ mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfigParrot.pm0000644000177200010010000000515112540623176021713 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfigParrot; #things specific to mod_parrot use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile splitdir abs2rel); use File::Find qw(finddepth); use Apache::TestTrace; use Apache::TestRequest; use Apache::TestConfig; use Apache::TestConfigPerl; use Config; @Apache::TestConfigParrot::ISA = qw(Apache::TestConfig); sub new { return shift->SUPER::new(@_); } sub configure_parrot_tests_pick { my($self, $entries) = @_; for my $subdir (qw(Response)) { my $dir = catfile $self->{vars}->{t_dir}, lc $subdir; next unless -d $dir; finddepth(sub { return unless /\.pir$/; my $file = catfile $File::Find::dir, $_; my $module = abs2rel $file, $dir; my $status = $self->run_apache_test_config_scan($file); push @$entries, [$file, $module, $subdir, $status]; }, $dir); } } sub configure_parrot_tests { my $self = shift; my @entries = (); $self->configure_parrot_tests_pick(\@entries); $self->configure_pm_tests_sort(\@entries); my %seen = (); for my $entry (@entries) { my ($file, $module, $subdir, $status) = @$entry; my @args = (); my $directives = $self->add_module_config($file, \@args); $module =~ s,\.pir$,,; $module =~ s/^[a-z]://i; #strip drive if any $module = join '::', splitdir $module; my @base = map { s/^test//i; $_ } split '::', $module; my $sub = pop @base; debug "configuring mod_parrot test file $file"; push @args, SetHandler => 'parrot-code'; push @args, ParrotHandler => $module; $self->postamble(ParrotLoad => $file); $self->postamble($self->location_container($module), \@args); $self->write_pm_test($module, lc $sub, map { lc } @base); } } 1; __DATA__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfigParse.pm0000644000104000010010000003735512540623176023432 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfig; #not TestConfigParse on purpose #dont really want/need a full-blown parser #but do want something somewhat generic use strict; use warnings FATAL => 'all'; use Apache::TestTrace; use File::Spec::Functions qw(rel2abs splitdir file_name_is_absolute); use File::Basename qw(dirname basename); sub strip_quotes { local $_ = shift || $_; s/^\"//; s/\"$//; $_; } my %wanted_config = ( TAKE1 => {map { $_, 1 } qw(ServerRoot ServerAdmin TypesConfig DocumentRoot)}, TAKE2 => {map { $_, 1 } qw(LoadModule LoadFile)}, ); my %spec_init = ( TAKE1 => sub { shift->{+shift} = "" }, TAKE2 => sub { shift->{+shift} = [] }, ); my %spec_apply = ( TypesConfig => \&inherit_server_file, ServerRoot => sub {}, #dont override $self->{vars}->{serverroot} DocumentRoot => \&inherit_directive_var, LoadModule => \&inherit_load_module, LoadFile => \&inherit_load_file, ); #where to add config, default is preamble my %spec_postamble = map { $_, 'postamble' } qw(TypesConfig); # need to enclose the following directives into .., since mod_foo might be unavailable my %ifmodule = ( TypesConfig => 'mod_mime.c', ); sub spec_add_config { my($self, $directive, $val) = @_; my $where = $spec_postamble{$directive} || 'preamble'; if (my $ifmodule = $ifmodule{TypesConfig}) { $self->postamble(< $directive $val EOI } else { $self->$where($directive => $val); } } # resolve relative files like Apache->server_root_relative # this function doesn't test whether the resolved file exists sub server_file_rel2abs { my($self, $file, $base) = @_; my ($serverroot, $result) = (); # order search sequence my @tries = ([ $base, 'user-supplied $base' ], [ $self->{inherit_config}->{ServerRoot}, 'httpd.conf inherited ServerRoot' ], [ $self->apxs('PREFIX'), 'apxs-derived ServerRoot' ]); # remove surrounding quotes if any # e.g. Include "/tmp/foo.html" $file =~ s/^\s*["']?//; $file =~ s/["']?\s*$//; if (file_name_is_absolute($file)) { debug "$file is already absolute"; $result = $file; } else { foreach my $try (@tries) { next unless defined $try->[0]; if (-d $try->[0]) { $serverroot = $try->[0]; debug "using $try->[1] to resolve $file"; last; } } if ($serverroot) { $result = rel2abs $file, $serverroot; } else { warning "unable to resolve $file - cannot find a suitable ServerRoot"; warning "please specify a ServerRoot in your httpd.conf or use apxs"; # return early, skipping file test below return $file; } } my $dir = dirname $result; # $file might not exist (e.g. if it's a glob pattern like # "conf/*.conf" but what we care about here is to check whether # the base dir was successfully resolved. we don't check whether # the file exists at all. it's the responsibility of the caller to # do this check if (defined $dir && -e $dir && -d _) { if (-e $result) { debug "$file successfully resolved to existing file $result"; } else { debug "base dir of '$file' successfully resolved to $dir"; } } else { $dir ||= ''; warning "dir '$dir' does not exist (while resolving '$file')"; # old behavior was to return the resolved but non-existent # file. preserve that behavior and return $result anyway. } return $result; } sub server_file { my $f = shift->server_file_rel2abs(@_); return qq("$f"); } sub inherit_directive_var { my($self, $c, $directive) = @_; $self->{vars}->{"inherit_\L$directive"} = $c->{$directive}; } sub inherit_server_file { my($self, $c, $directive) = @_; $self->spec_add_config($directive, $self->server_file($c->{$directive})); } #so we have the same names if these modules are linked static or shared my %modname_alias = ( 'mod_pop.c' => 'pop_core.c', 'mod_proxy_ajp.c' => 'proxy_ajp.c', 'mod_proxy_http.c' => 'proxy_http.c', 'mod_proxy_ftp.c' => 'proxy_ftp.c', 'mod_proxy_balancer.c' => 'proxy_balancer.c', 'mod_proxy_connect.c' => 'proxy_connect.c', 'mod_modperl.c' => 'mod_perl.c', ); # Block modules which inhibit testing: # - mod_jk requires JkWorkerFile or JkWorker to be configured # skip it for now, tomcat has its own test suite anyhow. # - mod_casp2 requires other settings in addition to LoadModule # - mod_bwshare and mod_evasive20 block fast requests that tests are doing # - mod_fcgid causes https://rt.cpan.org/Public/Bug/Display.html?id=54476 # - mod_modnss.c and mod_rev.c require further configuration my @autoconfig_skip_module = qw(mod_jk.c mod_casp2.c mod_bwshare.c mod_fcgid.c mod_evasive20.c mod_modnss.c mod_rev.c); # add modules to be not inherited from the existing config. # e.g. prevent from LoadModule perl_module to be included twice, when # mod_perl already configures LoadModule and it's certainly found in # the existing httpd.conf installed system-wide. sub autoconfig_skip_module_add { push @autoconfig_skip_module, @_; } sub should_skip_module { my($self, $name) = @_; for (@autoconfig_skip_module) { if (UNIVERSAL::isa($_, 'Regexp')) { return 1 if $name =~ /$_/; } else { return 1 if $name eq $_; } } return 0; } #inherit LoadModule sub inherit_load_module { my($self, $c, $directive) = @_; for my $args (@{ $c->{$directive} }) { my $modname = $args->[0]; my $file = $self->server_file_rel2abs($args->[1]); unless (-e $file) { debug "$file does not exist, skipping LoadModule"; next; } my $name = basename $args->[1]; $name =~ s/\.(s[ol]|dll)$/.c/; #mod_info.so => mod_info.c $name =~ s/^lib/mod_/; #libphp4.so => mod_php4.c $name = $modname_alias{$name} if $modname_alias{$name}; # remember all found modules $self->{modules}->{$name} = $file; debug "Found: $modname => $name"; if ($self->should_skip_module($name)) { debug "Skipping LoadModule of $name"; next; } debug "LoadModule $modname $name"; # sometimes people have broken system-wide httpd.conf files, # which include LoadModule of modules, which are built-in, but # won't be skipped above if they are found in the modules/ # directory. this usually happens when httpd is built once # with its modules built as shared objects and then again with # static ones: the old httpd.conf still has the LoadModule # directives, even though the modules are now built-in # so we try to workaround this problem using $self->preamble(IfModule => "!$name", qq{LoadModule $modname "$file"\n}); } } #inherit LoadFile sub inherit_load_file { my($self, $c, $directive) = @_; for my $args (@{ $c->{$directive} }) { my $file = $self->server_file_rel2abs($args->[0]); unless (-e $file) { debug "$file does not exist, skipping LoadFile"; next; } if ($self->should_skip_module($args->[0])) { debug "Skipping LoadFile of $args->[0]"; next; } # remember all found modules push @{$self->{load_file}}, $file; debug "LoadFile $file"; $self->preamble_first(qq{LoadFile "$file"\n}); } } sub parse_take1 { my($self, $c, $directive) = @_; $c->{$directive} = strip_quotes; } sub parse_take2 { my($self, $c, $directive) = @_; push @{ $c->{$directive} }, [map { strip_quotes } split]; } sub apply_take1 { my($self, $c, $directive) = @_; if (exists $self->{vars}->{lc $directive}) { #override replacement @Variables@ $self->{vars}->{lc $directive} = $c->{$directive}; } else { $self->spec_add_config($directive, qq("$c->{$directive}")); } } sub apply_take2 { my($self, $c, $directive) = @_; for my $args (@{ $c->{$directive} }) { $self->spec_add_config($directive => [map { qq("$_") } @$args]); } } sub inherit_config_file_or_directory { my ($self, $item) = @_; if (-d $item) { my $dir = $item; debug "descending config directory: $dir"; for my $entry (glob "$dir/*") { $self->inherit_config_file_or_directory($entry); } return; } my $file = $item; debug "inheriting config file: $file"; my $fh = Symbol::gensym(); open($fh, $file) or return; my $c = $self->{inherit_config}; while (<$fh>) { s/^\s*//; s/\s*$//; s/^\#.*//; next if /^$/; # support continuous config lines (which use \ to break the line) while (s/\\$//) { my $cont = <$fh>; $cont =~ s/^\s*//; $cont =~ s/\s*$//; $_ .= $cont; } (my $directive, $_) = split /\s+/, $_, 2; if ($directive eq "Include") { foreach my $include (glob($self->server_file_rel2abs($_))) { $self->inherit_config_file_or_directory($include); } } #parse what we want while (my($spec, $wanted) = each %wanted_config) { next unless $wanted->{$directive}; my $method = "parse_\L$spec"; $self->$method($c, $directive); } } close $fh; } sub inherit_config { my $self = shift; $self->get_httpd_static_modules; $self->get_httpd_defines; #may change after parsing httpd.conf $self->{vars}->{inherit_documentroot} = catfile $self->{httpd_basedir}, 'htdocs'; my $file = $self->{vars}->{httpd_conf}; my $extra_file = $self->{vars}->{httpd_conf_extra}; unless ($file and -e $file) { if (my $base = $self->{httpd_basedir}) { my $default_conf = $self->{httpd_defines}->{SERVER_CONFIG_FILE}; $default_conf ||= catfile qw(conf httpd.conf); $file = catfile $base, $default_conf; # SERVER_CONFIG_FILE might be an absolute path unless (-e $file) { if (-e $default_conf) { $file = $default_conf; } else { # try a little harder if (my $root = $self->{httpd_defines}->{HTTPD_ROOT}) { debug "using HTTPD_ROOT to resolve $default_conf"; $file = catfile $root, $default_conf; } } } } } unless ($extra_file and -e $extra_file) { if ($extra_file and my $base = $self->{httpd_basedir}) { my $default_conf = catfile qw(conf $extra_file); $extra_file = catfile $base, $default_conf; # SERVER_CONFIG_FILE might be an absolute path $extra_file = $default_conf if !-e $extra_file and -e $default_conf; } } return unless $file or $extra_file; my $c = $self->{inherit_config}; #initialize array refs and such while (my($spec, $wanted) = each %wanted_config) { for my $directive (keys %$wanted) { $spec_init{$spec}->($c, $directive); } } $self->inherit_config_file_or_directory($file) if $file; $self->inherit_config_file_or_directory($extra_file) if $extra_file; #apply what we parsed while (my($spec, $wanted) = each %wanted_config) { for my $directive (keys %$wanted) { next unless $c->{$directive}; my $cv = $spec_apply{$directive} || $self->can("apply_\L$directive") || $self->can("apply_\L$spec"); $cv->($self, $c, $directive); } } } sub get_httpd_static_modules { my $self = shift; my $httpd = $self->{vars}->{httpd}; return unless $httpd; $httpd = shell_ready($httpd); my $cmd = "$httpd -l"; my $list = $self->open_cmd($cmd); while (<$list>) { s/\s+$//; next unless /\.c$/; chomp; s/^\s+//; $self->{modules}->{$_} = 1; } close $list; } sub get_httpd_defines { my $self = shift; my $httpd = $self->{vars}->{httpd}; return unless $httpd; $httpd = shell_ready($httpd); my $cmd = "$httpd -V"; my $httpdconf = $self->{vars}->{httpd_conf}; $cmd .= " -f $httpdconf" if $httpdconf; my $serverroot = $self->{vars}->{serverroot}; $cmd .= " -d $serverroot" if $serverroot; my $proc = $self->open_cmd($cmd); while (<$proc>) { chomp; if( s/^\s*-D\s*//) { s/\s+$//; my($key, $val) = split '=', $_, 2; $self->{httpd_defines}->{$key} = $val ? strip_quotes($val) : 1; debug "isolated httpd_defines $key = " . $self->{httpd_defines}->{$key}; } elsif (/(version|built|module magic number|server mpm):\s+(.*)/i) { my $val = $2; (my $key = uc $1) =~ s/\s/_/g; $self->{httpd_info}->{$key} = $val; debug "isolated httpd_info $key = " . $val; } } close $proc; if (my $mmn = $self->{httpd_info}->{MODULE_MAGIC_NUMBER}) { @{ $self->{httpd_info} } {qw(MODULE_MAGIC_NUMBER_MAJOR MODULE_MAGIC_NUMBER_MINOR)} = split ':', $mmn; } # get the mpm information where available # lowercase for consistency across the two extraction methods # XXX or maybe consider making have_apache_mpm() case-insensitive? if (my $mpm = $self->{httpd_info}->{SERVER_MPM}) { # 2.1 $self->{mpm} = lc $mpm; } elsif (my $mpm_dir = $self->{httpd_defines}->{APACHE_MPM_DIR}) { # 2.0 $self->{mpm} = lc basename $mpm_dir; } else { # Apache 1.3 - no mpm to speak of $self->{mpm} = ''; } my $version = $self->{httpd_info}->{VERSION} || ''; if ($version =~ qr,Apache/2,) { # PHP 4.x on httpd-2.x needs a special modname alias: $modname_alias{'mod_php4.c'} = 'sapi_apache2.c'; } unless ($version =~ qr,Apache/(2.0|1.3),) { # for 2.1 and later, mod_proxy_* are really called mod_proxy_* delete @modname_alias{grep {/^mod_proxy_/} keys %modname_alias}; } } sub httpd_version { my $self = shift; my $httpd = $self->{vars}->{httpd}; return unless $httpd; my $version; $httpd = shell_ready($httpd); my $cmd = "$httpd -v"; my $v = $self->open_cmd($cmd); local $_; while (<$v>) { next unless s/^Server\s+version:\s*//i; chomp; my @parts = split; foreach (@parts) { next unless /^Apache\//; $version = $_; last; } $version ||= $parts[0]; last; } close $v; return $version; } sub httpd_mpm { return shift->{mpm}; } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfigPerl.pm0000644000104000010010000004705112540623176023254 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfig; #not TestConfigPerl on purpose #things specific to mod_perl use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile splitdir abs2rel file_name_is_absolute); use File::Find qw(finddepth); use Apache::TestTrace; use Apache::TestRequest; use Config; my %libmodperl = (1 => 'libperl.so', 2 => 'mod_perl.so'); sub configure_libmodperl { my $self = shift; my $server = $self->{server}; my $libname = $server->version_of(\%libmodperl); my $vars = $self->{vars}; if ($vars->{libmodperl}) { # if set, libmodperl was specified from the command line and # should be used instead of the one that is looked up # resolve a non-absolute path $vars->{libmodperl} = $self->find_apache_module($vars->{libmodperl}) unless file_name_is_absolute($vars->{libmodperl}); } # $server->{rev} could be set to 2 as a fallback, even when # the wanted version is 1. So check that we use mod_perl 2 elsif ($server->{rev} >= 2 && IS_MOD_PERL_2) { if (my $build_config = $self->modperl_build_config()) { if ($build_config->{MODPERL_LIB_SHARED}) { $libname = $build_config->{MODPERL_LIB_SHARED}; $vars->{libmodperl} ||= $self->find_apache_module($libname); } else { $vars->{libmodperl} ||= $self->find_apache_module('mod_perl.so'); } # XXX: we have a problem with several perl trees pointing # to the same httpd tree. So it's possible that we # configure the test suite to run with mod_perl.so built # against perl which it wasn't built with. Should we use # something like ldd to check the match? # # For now, we'll default to the first mod_perl.so found. } else { # XXX: can we test whether mod_perl was linked statically # so we don't need to preload it # if (!linked statically) { # die "can't find mod_perl built for perl version $]" # } error "can't find mod_perl.so built for perl version $]"; } # don't use find_apache_module or we may end up with the wrong # shared object, built against different perl } else { # mod_perl 1.0 $vars->{libmodperl} ||= $self->find_apache_module($libname); # XXX: how do we find out whether we have a static or dynamic # mod_perl build? die if its dynamic and can't find the module } my $cfg = ''; if ($vars->{libmodperl} && -e $vars->{libmodperl}) { if (Apache::TestConfig::WIN32) { my $lib = "$Config{installbin}\\$Config{libperl}"; $lib =~ s/lib$/dll/; $cfg = 'LoadFile ' . qq("$lib"\n) if -e $lib; } # add the module we found to the cached modules list # otherwise have_module('mod_perl') doesn't work unless # we have a LoadModule in our base config $self->{modules}->{'mod_perl.c'} = $vars->{libmodperl}; $cfg .= 'LoadModule ' . qq(perl_module "$vars->{libmodperl}"\n); } else { my $msg = "unable to locate $libname (could be a static build)\n"; $cfg = "#$msg"; debug $msg; } $self->preamble(IfModule => '!mod_perl.c', $cfg); } sub configure_inc { my $self = shift; my $top = $self->{vars}->{top_dir}; my $inc = $self->{inc}; for (catdir($top, qw(blib lib)), catdir($top, qw(blib arch))) { if (-d $_) { push @$inc, $_; } } # try ../blib as well for Apache::Reload & Co for (catdir($top, qw(.. blib lib)), catdir($top, qw(.. blib arch))) { push @$inc, $_ if -d $_; } # spec: If PERL5LIB is defined, PERLLIB is not used. for (qw(PERL5LIB PERLLIB)) { next unless exists $ENV{$_}; push @$inc, split /$Config{path_sep}/, $ENV{$_}; last; } # enable live testing of the Apache-Test dev modules if they are # located at the project's root dir my $apache_test_dev_dir = catfile($top, 'Apache-Test', 'lib'); unshift @$inc, $apache_test_dev_dir if -d $apache_test_dev_dir; } sub write_pm_test { my($self, $module, $sub, @base) = @_; my $dir = catfile $self->{vars}->{t_dir}, @base; my $t = catfile $dir, "$sub.t"; return if -e $t; $self->gendir($dir); my $fh = $self->genfile($t); my $path = Apache::TestRequest::module2path($module); print $fh <preamble(IfModule => 'mod_perl.c', [ qw(PerlPassEnv APACHE_TEST_TRACE_LEVEL PerlPassEnv HARNESS_PERL_SWITCHES PerlPassEnv APACHE_TEST_NO_STICKY_PREFERENCES) ]); } sub startup_pl_code { my $self = shift; my $serverroot = $self->{vars}->{serverroot}; my $cover = <<'EOF'; if (($ENV{HARNESS_PERL_SWITCHES}||'') =~ m/Devel::Cover/) { eval { # 0.48 is the first version of Devel::Cover that can # really generate mod_perl coverage statistics require Devel::Cover; Devel::Cover->VERSION(0.48); # this ignores coverage data for some generated files Devel::Cover->import('+inc' => 't/response/',); 1; } or die "Devel::Cover error: $@"; } EOF return <<"EOF"; BEGIN { use lib '$serverroot'; for my \$file (qw(modperl_inc.pl modperl_extra.pl)) { eval { require "conf/\$file" } or die if grep { -e "\$_/conf/\$file" } \@INC; } $cover } 1; EOF } sub configure_startup_pl { my $self = shift; #for 2.0 we could just use PerlSwitches -Mlib=... #but this will work for both 2.0 and 1.xx if (my $inc = $self->{inc}) { my $include_pl = catfile $self->{vars}->{t_conf}, 'modperl_inc.pl'; my $fh = $self->genfile($include_pl); for (reverse @$inc) { next unless $_; print $fh "use lib '$_';\n"; } my $tlib = catdir $self->{vars}->{t_dir}, 'lib'; if (-d $tlib) { print $fh "use lib '$tlib';\n"; } # directory for temp packages which can change during testing # we use require here since a circular dependency exists # between Apache::TestUtil and Apache::TestConfigPerl, so # use does not work here eval { require Apache::TestUtil; }; if ($@) { die "could not require Apache::TestUtil: $@"; } else { print $fh "use lib '" . Apache::TestUtil::_temp_package_dir() . "';\n"; } # if Apache::Test is used to develop a project, we want the # project/lib directory to be first in @INC (loaded last) if ($ENV{APACHE_TEST_LIVE_DEV}) { my $dev_lib = catdir $self->{vars}->{top_dir}, "lib"; print $fh "use lib '$dev_lib';\n" if -d $dev_lib; } print $fh "1;\n"; } if ($self->server->{rev} >= 2) { $self->postamble(IfModule => 'mod_perl.c', "PerlSwitches -Mlib=$self->{vars}->{serverroot}\n"); } my $startup_pl = catfile $self->{vars}->{t_conf}, 'modperl_startup.pl'; unless (-e $startup_pl) { my $fh = $self->genfile($startup_pl); print $fh $self->startup_pl_code; close $fh; } $self->postamble(IfModule => 'mod_perl.c', "PerlRequire $startup_pl\n"); } my %sethandler_modperl = (1 => 'perl-script', 2 => 'modperl'); sub set_handler { my($self, $module, $args) = @_; return if grep { $_ eq 'SetHandler' } @$args; push @$args, SetHandler => $self->server->version_of(\%sethandler_modperl); } sub set_connection_handler { my($self, $module, $args) = @_; my $port = $self->new_vhost($module); my $vars = $self->{vars}; $self->postamble(Listen => '0.0.0.0:' . $port); } my %add_hook_config = ( Response => \&set_handler, ProcessConnection => \&set_connection_handler, PreConnection => \&set_connection_handler, ); my %container_config = ( ProcessConnection => \&vhost_container, PreConnection => \&vhost_container, ); sub location_container { my($self, $module) = @_; my $path = Apache::TestRequest::module2path($module); Location => "/$path"; } sub vhost_container { my($self, $module) = @_; my $port = $self->{vhosts}->{$module}->{port}; my $namebased = $self->{vhosts}->{$module}->{namebased}; VirtualHost => ($namebased ? '*' : '_default_') . ":$port"; } sub new_vhost { my($self, $module, $namebased) = @_; my($port, $servername, $vhost); unless ($namebased and exists $self->{vhosts}->{$module}) { $port = $self->server->select_next_port; $vhost = $self->{vhosts}->{$module} = {}; $vhost->{port} = $port; $vhost->{namebased} = $namebased ? 1 : 0; } else { $vhost = $self->{vhosts}->{$module}; $port = $vhost->{port}; # remember the already configured Listen/NameVirtualHost $vhost->{namebased}++; } $servername = $self->{vars}->{servername}; $vhost->{servername} = $servername; $vhost->{name} = join ':', $servername, $port; $vhost->{hostport} = $self->hostport($vhost, $module); $port; } my %outside_container = map { $_, 1 } qw{ Alias AliasMatch AddType PerlChildInitHandler PerlTransHandler PerlPostReadRequestHandler PerlSwitches PerlRequire PerlModule }; my %strip_tags = map { $_ => 1} qw(base noautoconfig); #test .pm's can have configuration after the __DATA__ token sub add_module_config { my($self, $module, $args) = @_; my $fh = Symbol::gensym(); open($fh, $module) or return; while (<$fh>) { last if /^(__(DATA|END)__|\#if CONFIG_FOR_HTTPD_TEST)/; } my %directives; while (<$fh>) { last if /^\#endif/; #for .c modules next unless /\S+/; chomp; s/^\s+//; $self->replace; if (/^#/) { # preserve comments $self->postamble($_); next; } my($directive, $rest) = split /\s+/, $_, 2; $directives{$directive}++ unless $directive =~ /^postamble($directive => $rest); } elsif ($directive =~ /IfModule/) { $self->postamble($_); } elsif ($directive =~ m/^<(\w+)/) { # strip special container directives like and my $strip_container = exists $strip_tags{lc $1} ? 1 : 0; $directives{noautoconfig}++ if lc($1) eq 'noautoconfig'; my $indent = ''; $self->process_container($_, $fh, lc($1), $strip_container, $indent); } else { push @$args, $directive, $rest; } } \%directives; } # recursively process the directives including nested containers, # re-indent 4 and ucfirst the closing tags letter sub process_container { my($self, $first_line, $fh, $directive, $strip_container, $indent) = @_; my $new_indent = $indent; unless ($strip_container) { $new_indent .= " "; local $_ = $first_line; s/^\s*//; $self->replace; if (/process_vhost_open_tag($_, $indent); } else { $self->postamble($indent . $_); } } $self->process_container_remainder($fh, $directive, $new_indent); unless ($strip_container) { $self->postamble($indent . ""); } } # processes the body of the container without the last line, including # the end tag sub process_container_remainder { my($self, $fh, $directive, $indent) = @_; my $end_tag = ""; while (<$fh>) { chomp; last if m|^\s*\Q$end_tag|i; s/^\s*//; $self->replace; if (m/^\s*<(\w+)/) { $self->process_container($_, $fh, $1, 0, $indent); } else { $self->postamble($indent . $_); } } } # does the necessary processing to create a vhost container header sub process_vhost_open_tag { my($self, $line, $indent) = @_; my $cfg = $self->parse_vhost($line); if ($cfg) { my $port = $cfg->{port}; $cfg->{out_postamble}->(); $self->postamble($cfg->{line}); $cfg->{in_postamble}->(); } else { $self->postamble("$indent$line"); } } #the idea for each group: # Response: there will be many of these, mostly modules to test the API # that plan tests => ... and output with ok() # the naming allows grouping, making it easier to run an # individual set of tests, e.g. t/TEST t/apr # the PerlResponseHandler and SetHandler modperl is auto-configured # Hooks: for testing the simpler Perl*Handlers # auto-generates the Perl*Handler config # Protocol: protocol modules need their own port/vhost to listen on #@INC is auto-modified so each test .pm can be found #modules can add their own configuration using __DATA__ my %hooks = map { $_, ucfirst $_ } qw(init trans headerparser access authen authz type fixup log); $hooks{Protocol} = 'ProcessConnection'; $hooks{Filter} = 'OutputFilter'; my @extra_subdirs = qw(Response Protocol PreConnection Hooks Filter); # add the subdirs to @INC early, in case mod_perl is started earlier sub configure_pm_tests_inc { my $self = shift; for my $subdir (@extra_subdirs) { my $dir = catfile $self->{vars}->{t_dir}, lc $subdir; next unless -d $dir; push @{ $self->{inc} }, $dir; } } # @status fields use constant APACHE_TEST_CONFIGURE => 0; use constant APACHE_TEST_CONFIG_ORDER => 1; sub configure_pm_tests_pick { my($self, $entries) = @_; for my $subdir (@extra_subdirs) { my $dir = catfile $self->{vars}->{t_dir}, lc $subdir; next unless -d $dir; finddepth(sub { return unless /\.pm$/; my $file = catfile $File::Find::dir, $_; my $module = abs2rel $file, $dir; my $status = $self->run_apache_test_config_scan($file); push @$entries, [$file, $module, $subdir, $status]; }, $dir); } } # a simple numerical order is performed and configuration sections are # inserted using that order. If the test package specifies no special # token that matches /APACHE_TEST_CONFIG_ORDER\s+([+-]?\d+)/ anywhere # in the file, 0 is assigned as its order. If the token is specified, # config section with negative values will be inserted first, with # positive last. By using different values you can arrange for the # test configuration sections to be inserted in any desired order sub configure_pm_tests_sort { my($self, $entries) = @_; @$entries = sort { $a->[3]->[APACHE_TEST_CONFIG_ORDER] <=> $b->[3]->[APACHE_TEST_CONFIG_ORDER] } @$entries; } sub configure_pm_tests { my $self = shift; my @entries = (); $self->configure_pm_tests_pick(\@entries); $self->configure_pm_tests_sort(\@entries); for my $entry (@entries) { my ($file, $module, $subdir, $status) = @$entry; my @args = (); my $file_display; { $file_display=$file; my $topdir=$self->{vars}->{top_dir}; $file_display=~s!^\Q$topdir\E(.)(?:\1)*!!; } $self->postamble("\n# included from $file_display"); my $directives = $self->add_module_config($file, \@args); $module =~ s,\.pm$,,; $module =~ s/^[a-z]://i; #strip drive if any $module = join '::', splitdir $module; $self->run_apache_test_configure($file, $module, $status); my @base = map { s/^test//i; $_ } split '::', $module; my $sub = pop @base; my $hook = ($subdir eq 'Hooks' ? $hooks{$sub} : '') || $hooks{$subdir} || $subdir; if ($hook eq 'OutputFilter' and $module =~ /::i\w+$/) { #XXX: tmp hack $hook = 'InputFilter'; } my $handler = join $hook, qw(Perl Handler); if ($self->server->{rev} < 2 and lc($hook) eq 'response') { $handler =~ s/response//i; #s/PerlResponseHandler/PerlHandler/ } debug "configuring $module"; unless ($directives->{noautoconfig}) { if (my $cv = $add_hook_config{$hook}) { $self->$cv($module, \@args); } my $container = $container_config{$hook} || \&location_container; #unless the .pm test already configured the Perl*Handler unless ($directives->{$handler}) { my @handler_cfg = ($handler => $module); if ($outside_container{$handler}) { my $cfg = $self->massage_config_args(@handler_cfg); $self->postamble(IfModule => 'mod_perl.c', $cfg); } else { push @args, @handler_cfg; } } if (@args) { my $cfg = $self->massage_config_args($self->$container($module), \@args); $self->postamble(IfModule => 'mod_perl.c', $cfg); } } $self->postamble("# end of $file_display\n"); $self->write_pm_test($module, lc $sub, map { lc } @base); } } # scan tests for interesting information sub run_apache_test_config_scan { my ($self, $file) = @_; my @status = (); $status[APACHE_TEST_CONFIGURE] = 0; $status[APACHE_TEST_CONFIG_ORDER] = 0; my $fh = Symbol::gensym(); if (open $fh, $file) { local $/; my $content = <$fh>; close $fh; # XXX: optimize to match once? if ($content =~ /APACHE_TEST_CONFIGURE/m) { $status[APACHE_TEST_CONFIGURE] = 1; } if ($content =~ /APACHE_TEST_CONFIG_ORDER\s+([+-]?\d+)/m) { $status[APACHE_TEST_CONFIG_ORDER] = int $1; } } else { error "cannot open $file: $!"; } return \@status; } # We have to test whether tests have APACHE_TEST_CONFIGURE() in them # and run it if found at this stage, so when the server starts # everything is ready. # XXX: however we cannot use a simple require() because some tests # won't require() outside of mod_perl environment. Therefore we scan # the slurped file in. and if APACHE_TEST_CONFIGURE has been found we # require the file and run this function. sub run_apache_test_configure { my ($self, $file, $module, $status) = @_; return unless $status->[APACHE_TEST_CONFIGURE]; eval { require $file }; warn $@ if $@; # double check that it's a real sub if ($module->can('APACHE_TEST_CONFIGURE')) { eval { $module->APACHE_TEST_CONFIGURE($self); }; warn $@ if $@; } } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestConfigPHP.pm0000644000177200010010000004326612540623176021104 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestConfigPHP; #things specific to php use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile splitdir abs2rel); use File::Find qw(finddepth); use Apache::TestTrace; use Apache::TestRequest; use Apache::TestConfig; use Apache::TestConfigPerl; use Config; @Apache::TestConfigPHP::ISA = qw(Apache::TestConfig); my ($php_ini, $test_more); { # __DATA__ contains both php.ini and test-more.php local $/ = "END_OF_FILE\n"; $php_ini = ; chomp $php_ini; $test_more = ; chomp $test_more; } sub new { return shift->SUPER::new(@_); } my %warn_style = ( html => sub { "" }, c => sub { "/* @_ */" }, ini => sub { join '', grep {s/^/; /gm} @_ }, php => sub { join '', " sub { join '', grep {s/^/\# /gm} @_ }, ); my %file_ext = ( map({$_ => 'html'} qw(htm html)), map({$_ => 'c' } qw(c h)), map({$_ => 'ini' } qw(ini)), map({$_ => 'php' } qw(php)), ); sub warn_style_sub_ref { my ($self, $filename) = @_; my $ext = $self->filename_ext($filename); return $warn_style{ $file_ext{$ext} || 'default' }; } sub configure_php_tests_pick { my($self, $entries) = @_; for my $subdir (qw(Response)) { my $dir = catfile $self->{vars}->{t_dir}, lc $subdir; next unless -d $dir; finddepth(sub { return unless /\.php$/; my $file = catfile $File::Find::dir, $_; my $module = abs2rel $file, $dir; my $status = $self->run_apache_test_config_scan($file); push @$entries, [$file, $module, $subdir, $status]; }, $dir); } } sub write_php_test { my($self, $location, $test) = @_; (my $path = $location) =~ s/test//i; (my $file = $test) =~ s/php$/t/i; my $dir = catfile $self->{vars}->{t_dir}, lc $path; my $t = catfile $dir, $file; my $php_t = catfile $dir, $test; return if -e $t; # don't write out foo.t if foo.php already exists return if -e $php_t; $self->gendir($dir); my $fh = $self->genfile($t); print $fh <genfile($all); print $fh < 'all'; use Apache::Test; # skip all tests in this directory unless a php module is enabled plan tests => 1, need_php; ok 1; EOF } } sub configure_php_inc { my $self = shift; my $serverroot = $self->{vars}->{serverroot}; my $path = catfile $serverroot, 'conf'; # make sure that require() or include() calls can find # the generated test-more.php without using absolute paths my $cfg = { php_value => "include_path $path", }; $self->postamble(IfModule => $self->{vars}->{php_module}, $cfg); # give test-more.php access to the ServerRoot directive $self->postamble("SetEnv SERVER_ROOT $serverroot\n"); } sub configure_php_functions { my $self = shift; my $dir = catfile $self->{vars}->{serverroot}, 'conf'; my $file = catfile $dir, 'test-more.php'; $self->gendir($dir); my $fh = $self->genfile($file); print $fh $test_more; close $fh or die "close $file: $!"; $self->clean_add_file($file); } sub configure_php_ini { my $self = shift; my $dir = catfile $self->{vars}->{serverroot}, 'conf'; my $file = catfile $dir, 'php.ini'; return if -e $file my $log = catfile $self->{vars}->{t_logs}, 'error_log'; $self->gendir($dir); my $fh = $self->genfile($file); $php_ini =~ s/\@error_log\@/error_log $log/; print $fh $php_ini; close $fh or die "close $file: $!"; $self->clean_add_file($file); } sub configure_php_tests { my $self = shift; my @entries = (); $self->configure_php_tests_pick(\@entries); $self->configure_pm_tests_sort(\@entries); my %seen = (); for my $entry (@entries) { my ($file, $module, $subdir, $status) = @$entry; my @args = (); my $directives = $self->add_module_config($file, \@args); my @parts = splitdir $file; my $test = pop @parts; my $location = $parts[-1]; debug "configuring PHP test file $file"; if ($directives->{noautoconfig}) { $self->postamble(""); # which adds "\n" } else { unless ($seen{$location}++) { $self->postamble(Alias => [ catfile('', $parts[-1]), catfile(@parts) ]); my @args = (AddType => 'application/x-httpd-php .php'); $self->postamble(Location => "/$location", \@args); } } $self->write_php_test($location, $test); } } 1; __DATA__ ; This is php.ini-recommended from php 5.0.2, ; used in place of your locally installed php.ini file ; as part of the pristine environment Apache-Test creates ; for you ; [NOTE]: cat php.ini-recommended | grep -v '^;' | sed -e '/^$/d' ; ; exceptions to php.ini-recommended are as follows: display_startup_errors = On html_errors = Off @error_log@ output_buffering = Off ; the rest of php.ini-recommended, unaltered, save for ; some tidying like the removal of comments and blank lines [PHP] engine = On zend.ze1_compatibility_mode = Off short_open_tag = Off asp_tags = Off precision = 14 y2k_compliance = On zlib.output_compression = Off implicit_flush = Off unserialize_callback_func= serialize_precision = 100 allow_call_time_pass_reference = Off safe_mode = Off safe_mode_gid = Off safe_mode_include_dir = safe_mode_exec_dir = safe_mode_allowed_env_vars = PHP_ safe_mode_protected_env_vars = LD_LIBRARY_PATH disable_functions = disable_classes = expose_php = On max_execution_time = 30 ; Maximum execution time of each script, in seconds max_input_time = 60 ; Maximum amount of time each script may spend parsing request data memory_limit = 128M ; Maximum amount of memory a script may consume (128MB) error_reporting = E_ALL display_errors = Off log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = Off variables_order = "GPCS" register_globals = Off register_long_arrays = Off register_argc_argv = Off auto_globals_jit = On post_max_size = 8M magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off auto_prepend_file = auto_append_file = default_mimetype = "text/html" doc_root = user_dir = enable_dl = On file_uploads = On upload_max_filesize = 2M allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [Date] [filter] [iconv] [sqlite] [xmlrpc] [Pcre] [Syslog] define_syslog_variables = Off [mail function] SMTP = localhost smtp_port = 25 [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [MySQL] mysql.allow_persistent = On mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_port = mysql.default_socket = mysql.default_host = mysql.default_user = mysql.default_password = mysql.connect_timeout = 60 mysql.trace_mode = Off [MySQLi] mysqli.max_links = -1 mysqli.default_port = 3306 mysqli.default_socket = mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mSQL] msql.allow_persistent = On msql.max_persistent = -1 msql.max_links = -1 [OCI8] [PostgresSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [Sybase] sybase.allow_persistent = On sybase.max_persistent = -1 sybase.max_links = -1 sybase.min_error_severity = 10 sybase.min_message_severity = 10 sybase.compatability_mode = Off [Sybase-CT] sybct.allow_persistent = On sybct.max_persistent = -1 sybct.max_links = -1 sybct.min_server_severity = 10 sybct.min_client_severity = 10 [bcmath] bcmath.scale = 0 [browscap] [Informix] ifx.default_host = ifx.default_user = ifx.default_password = ifx.allow_persistent = On ifx.max_persistent = -1 ifx.max_links = -1 ifx.textasvarchar = 0 ifx.byteasvarchar = 0 ifx.charasvarchar = 0 ifx.blobinfile = 0 ifx.nullformat = 0 [Session] session.save_handler = files session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.bug_compat_42 = 0 session.bug_compat_warn = 1 session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" [MSSQL] mssql.allow_persistent = On mssql.max_persistent = -1 mssql.max_links = -1 mssql.min_error_severity = 10 mssql.min_message_severity = 10 mssql.compatability_mode = Off mssql.secure_connection = Off [Assertion] [COM] [mbstring] [FrontBase] [gd] [exif] [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 END_OF_FILE /*******************************************************************\ * PROJECT INFORMATION * * * * Project: Apache-Test * * URL: http://perl.apache.org/Apache-Test/ * * Notice: Copyright (c) 2006 The Apache Software Foundation * * * ********************************************************************* * LICENSE INFORMATION * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the * * License. You may obtain a copy of the License at: * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an "AS * * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * * express or implied. See the License for the specific language * * governing permissions and limitations under the License. * * * ********************************************************************* * MODULE INFORMATION * * * * This is a PHP implementation of Test::More: * * * * http://search.cpan.org/dist/Test-Simple/lib/Test/More.pm * * * ********************************************************************* * CREDITS * * * * Originally inspired by work from Andy Lester. Written and * * maintained by Chris Shiflett. For contact information, see: * * * * http://shiflett.org/ * * * \*******************************************************************/ header('Content-Type: text/plain'); register_shutdown_function('_test_end'); $_no_plan = FALSE; $_num_failures = 0; $_num_skips = 0; $_test_num = 0; function plan($plan) { /* plan('no_plan'); plan('skip_all'); plan(array('skip_all' => 'My reason is...')); plan(23); */ global $_no_plan; global $_skip_all; global $_skip_reason; switch ($plan) { case 'no_plan': $_no_plan = TRUE; break; case 'skip_all': echo "1..0\n"; break; default: if (is_array($plan)) { echo "1..0 # Skip {$plan['skip_all']}\n"; exit; } echo "1..$plan\n"; break; } } function ok($pass, $test_name = '') { global $_test_num; global $_num_failures; global $_num_skips; $_test_num++; if ($_num_skips) { $_num_skips--; return TRUE; } if (!empty($test_name) && $test_name[0] != '#') { $test_name = "- $test_name"; } if ($pass) { echo "ok $_test_num $test_name\n"; } else { echo "not ok $_test_num $test_name\n"; $_num_failures++; $caller = debug_backtrace(); if (strstr($caller['0']['file'], $_SERVER['PHP_SELF'])) { $file = $caller['0']['file']; $line = $caller['0']['line']; } else { $file = $caller['1']['file']; $line = $caller['1']['line']; } $file = str_replace($_SERVER['SERVER_ROOT'], 't', $file); diag(" Failed test ($file at line $line)"); } return $pass; } function is($this, $that, $test_name = '') { $pass = ($this == $that); ok($pass, $test_name); if (!$pass) { diag(" got: '$this'"); diag(" expected: '$that'"); } return $pass; } function isnt($this, $that, $test_name = '') { $pass = ($this != $that); ok($pass, $test_name); if (!$pass) { diag(" '$this'"); diag(' !='); diag(" '$that'"); } return $pass; } function like($string, $pattern, $test_name = '') { $pass = preg_match($pattern, $string); ok($pass, $test_name); if (!$pass) { diag(" '$string'"); diag(" doesn't match '$pattern'"); } return $pass; } function unlike($string, $pattern, $test_name = '') { $pass = !preg_match($pattern, $string); ok($pass, $test_name); if (!$pass) { diag(" '$string'"); diag(" matches '$pattern'"); } return $pass; } function cmp_ok($this, $operator, $that, $test_name = '') { eval("\$pass = (\$this $operator \$that);"); ok($pass, $test_name); if (!$pass) { diag(" got: '$this'"); diag(" expected: '$that'"); } return $pass; } function can_ok($object, $methods) { $pass = TRUE; $errors = array(); foreach ($methods as $method) { if (!method_exists($object, $method)) { $pass = FALSE; $errors[] = " method_exists(\$object, $method) failed"; } } if ($pass) { ok(TRUE, "method_exists(\$object, ...)"); } else { ok(FALSE, "method_exists(\$object, ...)"); diag($errors); } return $pass; } function isa_ok($object, $expected_class, $object_name = 'The object') { $got_class = get_class($object); if (version_compare(php_version(), '5', '>=')) { $pass = ($got_class == $expected_class); } else { $pass = ($got_class == strtolower($expected_class)); } if ($pass) { ok(TRUE, "$object_name isa $expected_class"); } else { ok(FALSE, "$object_name isn't a '$expected_class' it's a '$got_class'"); } return $pass; } function pass($test_name = '') { return ok(TRUE, $test_name); } function fail($test_name = '') { return ok(FALSE, $test_name); } function diag($message) { if (is_array($message)) { foreach($message as $current) { echo "# $current\n"; } } else { echo "# $message\n"; } } function include_ok($module) { $pass = ((include $module) == 'OK'); return ok($pass); } function require_ok($module) { $pass = ((require $module) == 'OK'); return ok($pass); } function skip($message, $num) { global $_num_skips; if ($num < 0) { $num = 0; } for ($i = 0; $i < $num; $i++) { pass("# SKIP $message"); } $_num_skips = $num; } /* TODO: function todo() { } function todo_skip() { } function is_deeply() { } function eq_array() { } function eq_hash() { } function eq_set() { } */ function _test_end() { global $_no_plan; global $_num_failures; global $_test_num; if ($_no_plan) { echo "1..$_test_num\n"; } if ($_num_failures) { diag("Looks like you failed $_num_failures tests of $_test_num."); } } ?> mod_perl-2.0.9/Apache-Test/lib/Apache/TestHandler.pm0000644000177200010010000001210212540623176020665 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestHandler; use strict; use warnings FATAL => 'all'; use Apache::Test qw/!:DEFAULT/; # call import() to tell about -withouttestmore use Apache::TestRequest (); use Apache2::Const -compile => qw(OK NOT_FOUND SERVER_ERROR); #some utility handlers for testing hooks other than response #see modperl-2.0/t/hooks/TestHooks/authen.pm if ($ENV{MOD_PERL} && require mod_perl2) { require Apache2::RequestRec; # content_type require Apache2::RequestIO; # puts } #compat with 1.xx my $send_http_header = Apache->can('send_http_header') || sub {}; my $print = Apache2->can('print') || Apache2::RequestRec->can('puts'); sub ok { my ($r, $boolean) = @_; $r->$send_http_header; $r->content_type('text/plain'); $r->$print((@_>1 && !$boolean ? "not " : '')."ok"); 0; } sub ok1 { my ($r, $boolean) = @_; Apache::Test::plan($r, tests => 1); Apache::Test::ok(@_==1 || $boolean); 0; } # a fixup handler to be used when a few requests need to be run # against the same perl interpreter, in situations where there is more # than one client running. For an example of use see # modperl-2.0/t/response/TestModperl/interp.pm and # modperl-2.0/t/modperl/interp.t # # this handler expects the header X-PerlInterpreter in the request # - if none is set, Apache::SERVER_ERROR is returned # - if its value eq 'tie', instance's global UUID is assigned and # returned via the same header # - otherwise if its value is not the same the stored instance's # global UUID Apache::NOT_FOUND is returned # # in addition $same_interp_counter counts how many times this instance of # pi has been called after the reset 'tie' request (inclusive), this # value can be retrieved with Apache::TestHandler::same_interp_counter() my $same_interp_id = ""; # keep track of how many times this instance was called after the reset my $same_interp_counter = 0; sub same_interp_counter { $same_interp_counter } sub same_interp_fixup { my $r = shift; my $interp = $r->headers_in->get(Apache::TestRequest::INTERP_KEY); unless ($interp) { # shouldn't be requesting this without an INTERP header die "can't find the interpreter key"; } my $id = $same_interp_id; if ($interp eq 'tie') { #first request for an interpreter instance # unique id for this instance $same_interp_id = $id = unpack "H*", pack "Nnn", time, $$, int(rand(60000)); $same_interp_counter = 0; #reset the counter } elsif ($interp ne $same_interp_id) { # this is not the request interpreter instance return Apache2::Const::NOT_FOUND; } $same_interp_counter++; # so client can save the created instance id or check the existing # value $r->headers_out->set(Apache::TestRequest::INTERP_KEY, $id); return Apache2::Const::OK; } 1; __END__ =encoding utf8 =head1 NAME Apache::TestHandler - a few response handlers and helpers =head1 SYNOPSIS package My::Test; use Apache::TestHandler (); sub handler { my ($r) = @_; my $result = do_my_test; Apache::TestHandler::ok1 $r, $result; } sub handler2 { my ($r) = @_; my $result = do_my_test; Apache::TestHandler::ok $r, $result; } =head1 DESCRIPTION C provides 2 very simple response handler. =head1 FUNCTIONS =over 4 =item ok $r, $boolean The handler simply prints out C or C depending on the optional C<$boolean> parameter. If C<$boolean> is omitted C is assumed. =item ok1 $r, $boolean This handler implements a simple response-only test. It can be used on its own to check if for a certain URI the response phase is reached. Or it can be called like a normal function to print out the test result. The client side is automatically created as described in L. C<$boolean> is optional. If omitted C is assumed. =item same_interp_counter =item same_interp_fixup TODO =back =head1 SEE ALSO The Apache-Test tutorial: L. L. =head1 AUTHOR Doug MacEachern, Geoffrey Young, Stas Bekman, Torsten Förtsch and others. Questions can be asked at the test-dev httpd.apache.org list For more information see: http://httpd.apache.org/test/. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestHarness.pm0000644000177200010010000001206412540623176020722 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestHarness; use strict; use warnings FATAL => 'all'; use Test::Harness (); use Apache::Test (); use Apache::TestSort (); use Apache::TestTrace; use File::Spec::Functions qw(catfile catdir); use File::Find qw(finddepth); use File::Basename qw(dirname); sub inc_fixup { # use blib unshift @INC, map "blib/$_", qw(lib arch); # fix all relative library locations for (@INC) { $_ = "../$_" unless m,^(/)|([a-f]:),i; } } #skip tests listed in t/SKIP sub skip { my($self, $file) = @_; $file ||= catfile Apache::Test::vars('serverroot'), 'SKIP'; return unless -e $file; my $fh = Symbol::gensym(); open $fh, $file or die "open $file: $!"; my @skip; local $_; while (<$fh>) { chomp; s/^\s+//; s/\s+$//; s/^\#.*//; next unless $_; s/\*/.*/g; push @skip, $_; } close $fh; return join '|', @skip; } #test if all.t would skip tests or not { my $source_lib = ''; sub run_t { my($self, $file) = @_; my $ran = 0; if (Apache::TestConfig::IS_APACHE_TEST_BUILD and !length $source_lib) { # so we can find Apache/Test.pm from both the perl-framework/ # and Apache-Test/ my $top_dir = Apache::Test::vars('top_dir'); foreach my $lib (catfile($top_dir, qw(Apache-Test lib)), catfile($top_dir, qw(.. Apache-Test lib)), catfile($top_dir, 'lib')) { if (-d $lib) { info "adding source lib $lib to \@INC"; $source_lib = qq[-Mlib="$lib"]; last; } } } my $cmd = qq[$^X $source_lib $file]; my $h = Symbol::gensym(); open $h, "$cmd|" or die "open $cmd: $!"; local $_; while (<$h>) { if (/^1\.\.(\d)/) { $ran = $1; last; } } close $h; $ran; } } #if a directory has an all.t test #skip all tests in that directory if all.t prints "1..0\n" sub prune { my($self, @tests) = @_; my(@new_tests, %skip_dirs); foreach my $test (@tests) { next if $test =~ /\.#/; # skip temp emacs files my $dir = dirname $test; if ($test =~ m:\Wall\.t$:) { unless (__PACKAGE__->run_t($test)) { $skip_dirs{$dir} = 1; @new_tests = grep { m:\Wall\.t$: || not $skip_dirs{dirname $_} } @new_tests; push @new_tests, $test; } } elsif (!$skip_dirs{$dir}) { push @new_tests, $test; } } @new_tests; } sub get_tests { my $self = shift; my $args = shift; my @tests = (); my $base = -d 't' ? catdir('t', '.') : '.'; my $ts = $args->{tests} || []; if (@$ts) { for (@$ts) { if (-d $_) { push(@tests, sort <$base/$_/*.t>); } else { $_ .= ".t" unless /\.t$/; push(@tests, $_); } } } else { if ($args->{tdirs}) { push @tests, map { sort <$base/$_/*.t> } @{ $args->{tdirs} }; } else { finddepth(sub { return unless /\.t$/; my $t = catfile $File::Find::dir, $_; my $dotslash = catfile '.', ""; $t =~ s:^\Q$dotslash::; push @tests, $t }, $base); @tests = sort @tests; } } @tests = $self->prune(@tests); if (my $skip = $self->skip) { # Allow / \ and \\ path delimiters in SKIP file $skip =~ s![/\\\\]+![/\\\\]!g; @tests = grep { not /(?:$skip)/ } @tests; } Apache::TestSort->run(\@tests, $args); #when running 't/TEST t/dir' shell tab completion adds a / #dir//foo output is annoying, fix that. s:/+:/:g for @tests; return @tests; } sub run { my $self = shift; my $args = shift || {}; $Test::Harness::verbose ||= $args->{verbose}; if (my(@subtests) = @{ $args->{subtests} || [] }) { $ENV{HTTPD_TEST_SUBTESTS} = "@subtests"; } Test::Harness::runtests($self->get_tests($args, @_)); } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestHarnessPHP.pm0000644000177200010010000001023212540623176021265 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestHarnessPHP; use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile catdir); use File::Find qw(finddepth); use Apache::TestHarness (); use Apache::TestTrace; use Apache::TestConfig (); use vars qw(@ISA); @ISA = qw(Apache::TestHarness); use TAP::Formatter::Console; use TAP::Harness; sub get_tests { my $self = shift; my $args = shift; my @tests = (); my $base = -d 't' ? catdir('t', '.') : '.'; my $ts = $args->{tests} || []; if (@$ts) { for (@$ts) { if (-d $_) { push(@tests, sort <$base/$_/*.t>); push(@tests, sort <$base/$_/*.php>); } else { $_ .= ".t" unless /(\.t|\.php)$/; push(@tests, $_); } } } else { if ($args->{tdirs}) { push @tests, map { sort <$base/$_/*.t> } @{ $args->{tdirs} }; push @tests, map { sort <$base/$_/*.php> } @{ $args->{tdirs} }; } else { finddepth(sub { return unless /\.(t|php)$/; return if $File::Find::dir =~ m/\b(conf|htdocs|logs|response)\b/; my $t = catfile $File::Find::dir, $_; my $dotslash = catfile '.', ""; $t =~ s:^\Q$dotslash::; push @tests, $t }, $base); @tests = sort @tests; } } @tests = $self->prune(@tests); if (my $skip = $self->skip) { # Allow / \ and \\ path delimiters in SKIP file $skip =~ s![/\\\\]+![/\\\\]!g; @tests = grep { not /(?:$skip)/ } @tests; } Apache::TestSort->run(\@tests, $args); #when running 't/TEST t/dir' shell tab completion adds a / #dir//foo output is annoying, fix that. s:/+:/:g for @tests; # remove *.php tests unless we can run them with php if (! Apache::TestConfig::which('php')) { warning(join ' - ', 'skipping *.php tests', 'make sure php is in your PATH'); @tests = grep { not /\.php$/ } @tests; } elsif (! $phpclient) { warning(join ' - ', 'skipping *.php tests', 'Test::Harness 2.38 not available'); @tests = grep { not /\.php$/ } @tests; } return @tests; } sub run { my $self = shift; my $args = shift || {}; my $formatter = TAP::Formatter::Console->new; my $agg = TAP::Parser::Aggregator->new; my $verbose = $args->{verbose} && $args->{verbose}; my $php_harness = TAP::Harness->new ({exec => $self->command_line(), verbosity => $verbose}); my $perl_harness = TAP::Harness->new ({verbosity => $verbose}); my @tests = $self->get_tests($args, @_); $agg->start(); $php_harness->aggregate_tests($agg, grep {m{\.php$}} @tests); $perl_harness->aggregate_tests($agg, grep {m{\.t$}} @tests); $agg->stop(); $formatter->summary($agg); } sub command_line { my $self = shift; my $server_root = Apache::Test::vars('serverroot'); my $conf = catfile($server_root, 'conf'); my $ini = catfile($conf, 'php.ini'); my $php = Apache::TestConfig::which('php') || die 'no php executable found in ' . $ENV{PATH}; return ["env", "SERVER_ROOT=$server_root", $php, "--php-ini", $ini, "--define", "include_path=$conf"]; } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestMB.pm0000644000177200010010000002704112540623176017616 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestMB; use strict; use vars qw(@ISA); use Module::Build 0.18; use Apache::Test (); use Apache::TestConfig (); @ISA = qw(Module::Build); sub new { my $pkg = shift; my($argv, $vars) = Apache::TestConfig::filter_args(\@ARGV, \%Apache::TestConfig::Usage); @ARGV = @$argv; my $self = $pkg->SUPER::new(@_); $self->{properties}{apache_test_args} = $vars; $self->{properties}{apache_test_script} ||= 't/TEST'; $self->generate_script; return $self; } sub valid_property { return 1 if defined $_[1] && ($_[1] eq 'apache_test_args' || $_[1] eq 'apache_test_script'); shift->SUPER::valid_property(@_); } sub apache_test_args { my $self = shift; $self->{properties}{apache_test_args} = shift if @_; return $self->{properties}{apache_test_args}; } sub apache_test_script { my $self = shift; $self->{properties}{apache_test_script} = shift if @_; return $self->{properties}{apache_test_script}; } sub ACTION_test_clean { my $self = shift; # XXX I'd love to do this without t/TEST. $self->do_system( $self->perl, $self->_bliblib, $self->localize_file_path($self->apache_test_script), '-clean'); } sub ACTION_clean { my $self = shift; $self->depends_on('test_clean'); $self->SUPER::ACTION_clean(@_); } sub ACTION_run_tests { my $self = shift; $self->depends_on('test_clean'); # XXX I'd love to do this without t/TEST. $self->do_system($self->perl, $self->_bliblib, $self->localize_file_path($self->apache_test_script), '-bugreport', '-verbose=' . ($self->verbose || 0)); } sub ACTION_testcover { my $self = shift; unless ($self->find_module_by_name('Devel::Cover', \@INC)) { warn("Cannot run testcover action unless Devel::Cover " . "is installed.\n" . "Don't forget to rebuild your Makefile after " . "installing Devel::Cover\n"); return; } $self->add_to_cleanup('coverage', 'cover_db'); my $atdir = $self->localize_file_path("$ENV{HOME}/.apache-test"); local $Test::Harness::switches = local $Test::Harness::Switches = local $ENV{HARNESS_PERL_SWITCHES} = "-MDevel::Cover=+inc,'$atdir'"; local $ENV{APACHE_TEST_EXTRA_ARGS} = "-one-process"; $self->depends_on('test'); $self->do_system('cover'); } sub ACTION_test_config { my $self = shift; $self->do_system($self->perl, $self->_bliblib, $self->localize_file_path($self->apache_test_script), '-conf', '-verbose=' . ($self->verbose || 0)); } sub _bliblib { my $self = shift; return ( '-I', File::Spec->catdir($self->base_dir, $self->blib, 'lib'), '-I', File::Spec->catdir($self->base_dir, $self->blib, 'arch'), ); } sub ACTION_test { my $self = shift; $self->depends_on('code'); $self->depends_on('run_tests'); $self->depends_on('test_clean'); } sub _cmodules { my ($self, $action) = @_; die "The cmodules" . ( $action ne 'all' ? "_$action" : '') . " action is not yet implemented"; # XXX TBD. $self->depends_on('test_config'); my $start_dir = $self->cwd; chdir $self->localize_file_path('c-modules'); # XXX How do we get Build.PL to be generated instead of Makefile? # Subclass Apache::TestConfigC, perhaps? $self->do_system('Build.PL', $action); chdir $start_dir; } sub ACTION_cmodules { shift->_cmodues('all') } sub ACTION_cmodules_clean { shift->_cmodues('clean') } # XXX I'd love to make this optional. sub generate_script { my $self = shift; # If a file name has been passed in, use it. Otherwise, use the # one set up when the Apache::TestMB object was created. my $script = $self->localize_file_path($_[0] ? $self->apache_test_script(shift) : $self->apache_test_script ); # We need a class to run the tests from t/TEST. my $class = pop || 'Apache::TestRunPerl'; # Delete any existing instance of the file. unlink $script if -e $script; # Start the contents of t/TEST. my $body = "BEGIN { eval { require blib && blib->import; } }\n"; # Configure the arguments for t/TEST. while (my($k, $v) = each %{ $self->apache_test_args }) { $v =~ s/\|/\\|/g; $body .= "\n\$Apache::TestConfig::Argv{'$k'} = q|$v|;\n"; } my $infile = "$script.PL"; if (-f $infile) { # Use the existing t/TEST.PL. my $in = Symbol::gensym(); open $in, "$infile" or die "Couldn't open $infile: $!"; local $/; $body .= <$in>; close $in; } else { # Create t/TEST from scratch. $body .= join "\n", Apache::TestConfig->perlscript_header, "use $class ();", "$class->new->run(\@ARGV);"; } # Make it so! print "Generating test running script $script\n" if $self->verbose; Apache::Test::basic_config()->write_perlscript($script, $body); $self->add_to_cleanup($self->apache_test_script); } 1; __END__ =head1 NAME Apache::TestMB - Subclass of Module::Build to support Apache::Test =head1 SYNOPSIS Standard process for building & installing modules: perl Build.PL ./Build ./Build test ./Build install Or, if you're on a platform (like DOS or Windows) that doesn't like the "./" notation, you can do this: perl Build.PL perl Build perl Build test perl Build install =head1 DESCRIPTION This class subclasses C to add support for testing Apache integration with Apache::Test. It is broadly based on C, and as such adds a number of build actions to a the F script, while simplifying the process of creating F scripts. Here's how to use C in a F script: use Module::Build; my $build_pkg = eval { require Apache::TestMB } ? 'Apache::TestMB' : 'Module::Build'; my $build = $build_pkg->new( module_name => 'My::Module', ); $build->create_build_script; This is identical to how C is used. Not all target systems may have C (and therefore C installed, so we test for it to be installed, first. But otherwise, its use can be exactly the same. Consult the L documentation for more information on how to use it; L may be especially useful for those looking to migrate from C. =head1 INTERFACE =head2 Build With the above script, users can build your module in the usual C way: perl Build.PL ./Build ./Build test ./Build install If C is installed, then Apache will be started before tests are run by the C action, and shut down when the tests complete. Note that C can be called C-specific options in addition to the usual C options. For example: perl Build.PL -apxs /usr/local/apache/bin/apxs Consult the L documentation for a complete list of options. In addition to the actions provided by C (C, C, C, C, etc.), C adds a few extra actions: =over 4 =item test_clean This action cleans out the files generated by the test script, F. It is also executed by the C action. =item run_tests This action actually the tests by executing the test script, F. It is executed by the C action, so most of the time it won't be executed directly. =item testcover C overrides this action from C in order to prevent the C preference files from being included in the test coverage. =back =head2 Constructor =head3 new The C constructor takes all the same arguments as its parent in C, but can optionally accept one other parameter: =over =item apache_test_script The name of the C test script. The default value is F, which will work in the vast majority of cases. If you wish to specify your own file name, do so with a relative file name using Unix-style paths; the file name will automatically be converted for the local platform. =back When C is called it does the following: =over 4 =item * Processes the C-specific options in C<@ARGV>. See the L documentation for a complete list of options. =item * Sets the name of the C test script to F, unless it was explicitly specified by the C parameter. =item * Calls C to generate C test script, usually F. =back =head2 Instance Methods =head3 apache_test_args Returns a hash reference containing all of the settings specified by options passed to F, or explicitly added to C<@ARGV> in F. Consult the L documentation for a complete list of options. =head3 apache_test_script Gets or sets the file name of the C test script. =head3 generate_script $build->generate_script; $build->generate_script('t/FOO'); $build->generate_script(undef, 'Apache::TestRun'); This method is called by C, so in most cases it can be ignored. If you'd like it to use other than the default arguments, you can call it explicitly in F and pass it the arguments you desire. It takes two optional arguments: =over 4 =item * The name of the C test script. Defaults to the value returned by C. =item * The name of an C test running class. Defaults to C. =back If there is an existing F (or a script with the same name as specified by the C parameter but with F<.PL> appended to it), then that script will be used as the template for the test script. Otherwise, a simple test script will be written similar to what would be written by C (although that function is not aware of the arguments passed to F, so use this one instead!). =head1 SEE ALSO =over 4 =item L Demonstrates how to write tests to send requests to the Apache server run by C<./Build test>. =item L The parent class for C; consult it's documentation for more on its interface. =item L This article by Geoffrey Young explains how to configure Apache and write tests for your module using Apache::Test. Just use C instead of C to update it for use with C. =back =head1 AUTHOR David Wheeler Questions can be asked at the test-dev httpd.apache.org list. For more information see: I and I. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestMM.pm0000644000177200010010000001613412540623176017632 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestMM; use strict; use warnings FATAL => 'all'; use Config; use Apache::TestConfig (); use Apache::TestTrace; use Apache::TestSmoke; sub import { my $class = shift; for my $section (@_) { unless (defined &$section) { die "unknown Apache::TestMM section: $section"; } no strict 'refs'; my $sub = "MY::$section"; # Force aliasing, since previous WriteMakefile might have # moved it undef &$sub if defined &$sub; *$sub = \&{$section}; } } sub add_dep { my($string, $targ, $add) = @_; $$string =~ s/($targ\s+::)/$1 $add /; } sub clean { my $self = shift; my $string = $self->MM::clean(@_); add_dep(\$string, clean => 'test_clean'); $string; } sub test { my $self = shift; my $env = Apache::TestConfig->passenv_makestr(); my $tests = "TEST_FILES =\n"; if (ref $self && exists $self->{'test'}) { $tests = 'TEST_FILES = ' . $self->{'test'}->{'TESTS'} . "\n"; } my $preamble = Apache::TestConfig::WIN32 ? "" : <catfile($ENV{HOME}, '.apache-test'); my $cover_exec = Apache::TestConfig::which("cover"); my @cover = ("", "testcover :", ); push @cover, "\t-\@$cover_exec -delete" if $cover_exec; push @cover, "\t-HARNESS_PERL_SWITCHES=-MDevel::Cover=+inc,$atdir \\", "\tAPACHE_TEST_EXTRA_ARGS=-one-process \$(MAKE) test"; push @cover, "\t-\@$cover_exec" if $cover_exec; $cover = join "\n", @cover, ""; } else { $cover = <<'EOF'; testcover : @echo "Cannot run testcover action unless Devel::Cover is installed" @echo "Don't forget to rebuild your Makefile after installing Devel::Cover" EOF } return $preamble . $tests . <<'EOF' . $cover; TEST_VERBOSE = 0 test_clean : $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) \ t/TEST $(APACHE_TEST_EXTRA_ARGS) -clean run_tests : $(PASSENV) \ $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) \ t/TEST $(APACHE_TEST_EXTRA_ARGS) -bugreport -verbose=$(TEST_VERBOSE) $(TEST_FILES) test :: pure_all test_clean run_tests test_config : $(PASSENV) \ $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) \ t/TEST $(APACHE_TEST_EXTRA_ARGS) -conf cmodules: test_config cd c-modules && $(MAKE) all cmodules_clean: test_config cd c-modules && $(MAKE) clean EOF } sub generate_script { my $file = shift; unlink $file if -e $file; my $body = "BEGIN { eval { require blib && blib->import; } }\n"; my %args = @Apache::TestMM::Argv; while (my($k, $v) = each %args) { $v =~ s/\|/\\|/g; $body .= "\n\$Apache::TestConfig::Argv{'$k'} = q|$v|;\n"; } my $in = Symbol::gensym(); open $in, "$file.PL" or die "Couldn't open $file.PL: $!"; { local $/; $body .= <$in>; } close $in; info "generating script $file"; Apache::Test::basic_config()->write_perlscript($file, $body); Apache::TestSmoke->generate_script; } sub filter_args { my($argv, $vars) = Apache::TestConfig::filter_args(\@ARGV, \%Apache::TestConfig::Usage); @ARGV = @$argv; @Apache::TestMM::Argv = %$vars; } 1; =head1 NAME Apache::TestMM - Provide MakeMaker Wrapper Methods =head1 SYNOPSIS require Apache::TestMM; # import MY::test and MY::clean overrides for MM Apache::TestMM->import(qw(test clean)); # parse command line args Apache::TestMM::filter_args(); # autogenerate the script Apache::TestMM::generate_script('t/TEST'); =head1 DESCRIPTION C provides wrappers for the C craft, making it easier to extend the autogenerated F with C. =head1 FUNCTIONS =head2 C use Apache::TestMM qw(test clean); or: Apache::TestMM->import(qw(test clean)); Imports C overrides for the default C I and I targets, as if you have defined: sub MY::test {...} sub MY::clean {...} in F. C does this for you so that these Makefile targets will run the Apache server and the tests for it, and clean up after its mess. =head2 C push @ARGV, '-apxs', $apxs_path; Apache::TestMM::filter_args(); WriteMakefile(...); When C is called it parses C<@ARGV>, hoping to find special options like C. C accepts a lot of configuration options of its own. When C is called, it removes any C-specific options from C<@ARGV> and stores them internally, so when C is called they aren't in C<@ARGV> and thus won't be processed by C. The options can be set when F is called: % perl Makefile.PL -apxs /path/to/apxs Or you can push them manually to C<@ARGV> from the code: push @ARGV, '-apxs', $apxs_path; When: Apache::TestMM::generate_script('t/TEST'); is called, C-specific options extracted by C are written to the autogenerated file. In our example, the autogenerated F will include: %Apache::TestConfig::Argv = qw(apxs /path/to/apxs); which is going to be used by the C runtime. The other frequently used options are: C<-httpd>, telling where to find the httpd (usually when the C<-apxs> option is not used), C<-libmodperl> to use a specific mod_perl shared object (if your mod_perl is built as DSO), C<-maxclients> to change the default number of the configured C directive, C<-port> to start the server on a specific port, etc. To get the complete list of available configuration options and their purpose and syntax, run: % perl -MApache::TestConfig -le 'Apache::TestConfig::usage()' You may wish to document some of these in your application's F file, especially the C<-apxs> and C<-httpd> options. =head2 C Apache::TestMM::generate_script('t/TEST'); C accepts the name of the script to generate and will look for a template with the same name and suffix I<.PL>. So in our example it'll look for F. The autogenerated script F will include the contents of F, and special directives, including any configuration options passed via C> called from F, special fixup code, etc. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestPerlDB.pm0000644000177200010010000000312412540623176020424 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # #no 'package Apache::TestPerlDB.pm' here, else we change perldb's package use strict; sub Apache::TestPerlDB::lwpd { print Apache::TestRequest::lwp_debug(shift || 1); } sub Apache::TestPerlDB::bok { my $n = shift || 1; print "breakpoint set at test $n\n"; DB::cmd_b_sub('ok', "\$Test::ntest == $n"); } my %help = ( lwpd => 'Set the LWP debug level for Apache::TestRequest', bok => 'Set breakpoint at test n', ); my $setup_db_aliases = sub { my $package = 'Apache::TestPerlDB'; my @cmds; no strict 'refs'; while (my($name, $val) = each %{"$package\::"}) { next unless defined &$val; *{"main::$name"} = \&{$val}; push @cmds, $name; } print "$package added perldb commands:\n", map { " $_ - $help{$_}\n" } @cmds; }; $setup_db_aliases->(); 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestReport.pm0000644000177200010010000000777012540623176020602 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestReport; use strict; use warnings FATAL => 'all'; use Apache::Test (); use Apache::TestConfig (); use File::Spec::Functions qw(catfile); use File::Find; sub new { my $class = shift; bless { @_ }, $class; } # generate t/REPORT script (or a different filename) which will drive # Apache::TestReport sub generate_script { my ($class, $file) = @_; $file ||= catfile 't', 'REPORT'; my $content = join "\n", "BEGIN { eval { require blib && blib->import; } }", Apache::TestConfig->perlscript_header, "use $class;", "$class->new(\@ARGV)->run;"; Apache::Test::basic_config()->write_perlscript($file, $content); } sub replace { my($self, $template) = @_; $template =~ s{\@(\w+)\@} { my $method = lc $1; eval { $self->$method() } || $self->{$1} || ''; }eg; $template; } sub run { my $self = shift; print $self->replace($self->template); } sub config { Apache::TestConfig::as_string() } sub report_to { 'test-dev@httpd.apache.org' } sub postit_note { my $self = shift; my($to, $where) = split '@', $self->report_to; return < $where. To subscribe to the list send an empty email to $to-subscribe\@$where. EOF } sub executable { $0 } my $core_dump; sub core_dump { my $self = shift; $core_dump = ""; if (eval { require Devel::GDB }) { find(\&dump_core_file, 't') } $core_dump || ' [CORE TRACE COMES HERE]'; } sub dump_core_file { return unless /^core(\.\d+)?$/; my $core = $_; my $gdb = new Devel::GDB (); my $test_config = Apache::TestConfig->new({thaw=>1}); my $httpd = $test_config->{vars}->{httpd}; return unless defined $httpd; $core_dump .= join '', $gdb->get("file $httpd"), $gdb->get('sharedlibrary'), $gdb->get("core $core"), $gdb->get('info threads'), $gdb->get('thread apply all bt'); } sub date { scalar gmtime() . " GMT" } sub template { <<'EOI' -------------8<---------- Start Bug Report ------------8<---------- 1. Problem Description: [DESCRIBE THE PROBLEM HERE] 2. Used Components and their Configuration: @CONFIG@ 3. This is the core dump trace: (if you get a core dump): @CORE_DUMP@ This report was generated by @EXECUTABLE@ on @DATE@. -------------8<---------- End Bug Report --------------8<---------- @POSTIT_NOTE@ EOI } 1; __END__ =head1 NAME Apache::TestReport - A parent class for generating bug/success reports =head1 Synopsis use Apache::TestReport; Apache::TestReport->new(@ARGV)->run; =head1 Description This class is used to generate a bug or a success report, providing information about the system the code was running on. =head1 Overridable Methods =head2 config return the information about user's system =head2 report_to return a string containing the email address the report should be sent to =head2 postit_note return a string to close the report with, e.g.: my($to, $where) = split '@', $self->report_to; return < $where. To subscribe to the list send an empty email to $to-subscribe\@$where. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestReportPerl.pm0000644000177200010010000000237412540623176021420 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestReportPerl; use strict; use warnings FATAL => 'all'; use Apache::TestReport (); use ModPerl::Config (); # a subclass of Apache::TestReport that generates a bug report script use vars qw(@ISA); @ISA = qw(Apache::TestReport); sub config { ModPerl::Config::as_string(); } sub report_to { my $self = shift; my $pkg = ref $self; die "you need to implement $pkg\::report_to() to return the " . "contact email address of your project"; } 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestRequest.pm0000644000177200010010000010531512540623176020751 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestRequest; use strict; use warnings FATAL => 'all'; BEGIN { $ENV{PERL_LWP_USE_HTTP_10} = 1; # default to http/1.0 $ENV{APACHE_TEST_HTTP_09_OK} ||= 0; # 0.9 responses are ok } use Apache::Test (); use Apache::TestConfig (); use Carp; use constant TRY_TIMES => 200; use constant INTERP_KEY => 'X-PerlInterpreter'; use constant UA_TIMEOUT => 60 * 10; #longer timeout for debugging my $have_lwp = 0; # APACHE_TEST_PRETEND_NO_LWP=1 pretends that LWP is not available so # one can test whether the test suite survives if the user doesn't # have lwp installed unless ($ENV{APACHE_TEST_PRETEND_NO_LWP}) { $have_lwp = eval { require LWP::UserAgent; require HTTP::Request::Common; unless (defined &HTTP::Request::Common::OPTIONS) { package HTTP::Request::Common; no strict 'vars'; *OPTIONS = sub { _simple_req(OPTIONS => @_) }; push @EXPORT, 'OPTIONS'; } 1; }; } unless ($have_lwp) { require Apache::TestClient; } sub has_lwp { $have_lwp } unless ($have_lwp) { #need to define the shortcuts even though the wont be used #so Perl can parse test scripts @HTTP::Request::Common::EXPORT = qw(GET HEAD POST PUT OPTIONS); } sub install_http11 { eval { die "no LWP" unless $have_lwp; LWP->VERSION(5.60); #minimal version require LWP::Protocol::http; #LWP::Protocol::http10 is used by default LWP::Protocol::implementor('http', 'LWP::Protocol::http'); }; } use vars qw(@EXPORT @ISA $RedirectOK $DebugLWP); require Exporter; *import = \&Exporter::import; @EXPORT = @HTTP::Request::Common::EXPORT; @ISA = qw(LWP::UserAgent); my $UA; my $REDIR = $have_lwp ? undef : 1; sub module { my $module = shift; $Apache::TestRequest::Module = $module if $module; $Apache::TestRequest::Module; } sub scheme { my $scheme = shift; $Apache::TestRequest::Scheme = $scheme if $scheme; $Apache::TestRequest::Scheme; } sub module2path { my $package = shift; # httpd (1.3 && 2) / winFU have problems when the first path's # segment includes ':' (security precaution which breaks the rfc) # so we can't use /TestFoo::bar as path_info (my $path = $package) =~ s/::/__/g; return $path; } sub module2url { my $module = shift; my $opt = shift || {}; my $scheme = $opt->{scheme} || 'http'; my $path = exists $opt->{path} ? $opt->{path} : module2path($module); module($module); my $config = Apache::Test::config(); my $hostport = hostport($config); $path =~ s|^/||; return "$scheme://$hostport/$path"; } sub user_agent { my $args = {@_}; if (delete $args->{reset}) { $UA = undef; } if (exists $args->{requests_redirectable}) { my $redir = $args->{requests_redirectable}; if (ref $redir and (@$redir > 1 or $redir->[0] ne 'POST')) { # Set our internal flag if there's no LWP. $REDIR = $have_lwp ? undef : 1; } elsif ($redir) { if ($have_lwp) { $args->{requests_redirectable} = [ qw/GET HEAD POST/ ]; $REDIR = undef; } else { # Set our internal flag. $REDIR = 1; } } else { # Make sure our internal flag is false if there's no LWP. $REDIR = $have_lwp ? undef : 0; } } $args->{keep_alive} ||= $ENV{APACHE_TEST_HTTP11}; if ($args->{keep_alive}) { install_http11(); eval { require LWP::Protocol::https; #https10 is the default LWP::Protocol::implementor('https', 'LWP::Protocol::https'); }; } # in LWP 6, verify_hostname defaults to on, so SSL_ca_file # needs to be set accordingly if ($have_lwp and $LWP::VERSION >= 6.0 and not exists $args->{ssl_opts}->{SSL_ca_file}) { my $vars = Apache::Test::vars(); my $cafile = "$vars->{sslca}/$vars->{sslcaorg}/certs/ca.crt"; $args->{ssl_opts}->{SSL_ca_file} = $cafile; # Net:SSL compatibility (legacy) $ENV{HTTPS_CA_FILE} = $cafile; } eval { $UA ||= __PACKAGE__->new(%$args); }; } sub user_agent_request_num { my $res = shift; $res->header('Client-Request-Num') || #lwp 5.60 $res->header('Client-Response-Num'); #lwp 5.62+ } sub user_agent_keepalive { $ENV{APACHE_TEST_HTTP11} = shift; } sub do_request { my($ua, $method, $url, $callback) = @_; my $r = HTTP::Request->new($method, resolve_url($url)); my $response = $ua->request($r, $callback); lwp_trace($response); } sub hostport { my $config = shift || Apache::Test::config(); my $vars = $config->{vars}; local $vars->{scheme} = $Apache::TestRequest::Scheme || $vars->{scheme}; my $hostport = $config->hostport; my $default_hostport = join ':', $vars->{servername}, $vars->{port}; if (my $module = $Apache::TestRequest::Module) { $hostport = $module eq 'default' ? $default_hostport : $config->{vhosts}->{$module}->{hostport}; } $hostport || $default_hostport; } sub resolve_url { my $url = shift; Carp::croak("no url passed") unless defined $url; return $url if $url =~ m,^(\w+):/,; $url = "/$url" unless $url =~ m,^/,; my $vars = Apache::Test::vars(); local $vars->{scheme} = $Apache::TestRequest::Scheme || $vars->{scheme} || 'http'; scheme_fixup($vars->{scheme}); my $hostport = hostport(); return "$vars->{scheme}://$hostport$url"; } my %wanted_args = map {$_, 1} qw(username password realm content filename redirect_ok cert); sub wanted_args { \%wanted_args; } sub redirect_ok { my $self = shift; if ($have_lwp) { # Return user setting or let LWP handle it. return $RedirectOK if defined $RedirectOK; return $self->SUPER::redirect_ok(@_); } # No LWP. We don't support redirect on POST. return 0 if $self->method eq 'POST'; # Return user setting or our internal calculation. return $RedirectOK if defined $RedirectOK; return $REDIR; } my %credentials; #subclass LWP::UserAgent sub new { my $self = shift->SUPER::new(@_); lwp_debug(); #init from %ENV (set by Apache::TestRun) my $config = Apache::Test::config(); if (my $proxy = $config->configure_proxy) { #t/TEST -proxy $self->proxy(http => "http://$proxy"); } $self->timeout(UA_TIMEOUT); $self; } sub credentials { my $self = shift; return $self->get_basic_credentials(@_); } sub get_basic_credentials { my($self, $realm, $uri, $proxy) = @_; for ($realm, '__ALL__') { next unless $_ && $credentials{$_}; return @{ $credentials{$_} }; } return (undef,undef); } sub vhost_socket { my $module = shift; local $Apache::TestRequest::Module = $module if $module; my $hostport = hostport(Apache::Test::config()); my($host, $port) = split ':', $hostport; my(%args) = (PeerAddr => $host, PeerPort => $port); if ($module and $module =~ /ssl/) { require Net::SSL; local $ENV{https_proxy} ||= ""; #else uninitialized value in Net/SSL.pm return Net::SSL->new(%args, Timeout => UA_TIMEOUT); } else { require IO::Socket; return IO::Socket::INET->new(%args); } } #Net::SSL::getline is nothing like IO::Handle::getline #could care less about performance here, just need a getline() #that returns the same results with or without ssl my %getline = ( 'Net::SSL' => sub { my $self = shift; my $buf = ''; my $c = ''; do { $self->read($c, 1); $buf .= $c; } until ($c eq "\n" || $c eq ""); $buf; }, ); sub getline { my $sock = shift; my $class = ref $sock; my $method = $getline{$class} || 'getline'; $sock->$method(); } sub socket_trace { my $sock = shift; return unless $sock->can('get_peer_certificate'); #like having some -v info my $cert = $sock->get_peer_certificate; print "#Cipher: ", $sock->get_cipher, "\n"; print "#Peer DN: ", $cert->subject_name, "\n"; } sub prepare { my $url = shift; if ($have_lwp) { user_agent(); $url = resolve_url($url); } else { lwp_debug() if $ENV{APACHE_TEST_DEBUG_LWP}; } my($pass, $keep) = Apache::TestConfig::filter_args(\@_, \%wanted_args); %credentials = (); if (defined $keep->{username}) { $credentials{$keep->{realm} || '__ALL__'} = [$keep->{username}, $keep->{password}]; } if (defined(my $content = $keep->{content})) { if ($content eq '-') { $content = join '', ; } elsif ($content =~ /^x(\d+)$/) { $content = 'a' x $1; } push @$pass, content => $content; } if (exists $keep->{cert}) { set_client_cert($keep->{cert}); } return ($url, $pass, $keep); } sub UPLOAD { my($url, $pass, $keep) = prepare(@_); local $RedirectOK = exists $keep->{redirect_ok} ? $keep->{redirect_ok} : $RedirectOK; if ($keep->{filename}) { return upload_file($url, $keep->{filename}, $pass); } else { return upload_string($url, $keep->{content}); } } sub UPLOAD_BODY { UPLOAD(@_)->content; } sub UPLOAD_BODY_ASSERT { content_assert(UPLOAD(@_)); } #lwp only supports files sub upload_string { my($url, $data) = @_; my $CRLF = "\015\012"; my $bound = 742617000027; my $req = HTTP::Request->new(POST => $url); my $content = join $CRLF, "--$bound", "Content-Disposition: form-data; name=\"HTTPUPLOAD\"; filename=\"b\"", "Content-Type: text/plain", "", $data, "--$bound--", ""; $req->header("Content-Length", length($content)); $req->content_type("multipart/form-data; boundary=$bound"); $req->content($content); $UA->request($req); } sub upload_file { my($url, $file, $args) = @_; my $content = [@$args, filename => [$file]]; $UA->request(HTTP::Request::Common::POST($url, Content_Type => 'form-data', Content => $content, )); } #useful for POST_HEAD and $DebugLWP (see below) sub lwp_as_string { my($r, $want_body) = @_; my $content = $r->content; unless ($r->isa('HTTP::Request') or $r->header('Content-Length') or $r->header('Transfer-Encoding')) { $r->header('Content-Length' => length $content); $r->header('X-Content-length-note' => 'added by Apache::TestRequest'); } $r->content('') unless $want_body; (my $string = $r->as_string) =~ s/^/\#/mg; $r->content($content); #reset $string; } $DebugLWP = 0; #1 == print METHOD URL and header response for all requests #2 == #1 + response body #other == passed to LWP::Debug->import sub lwp_debug { package main; #wtf: else package in perldb changes my $val = $_[0] || $ENV{APACHE_TEST_DEBUG_LWP}; return unless $val; if ($val =~ /^\d+$/) { $Apache::TestRequest::DebugLWP = $val; return "\$Apache::TestRequest::DebugLWP = $val\n"; } else { my(@args) = @_ ? @_ : split /\s+/, $val; require LWP::Debug; LWP::Debug->import(@args); return "LWP::Debug->import(@args)\n"; } } sub lwp_trace { my $r = shift; unless ($r->request->protocol) { #lwp always sends a request, but never sets #$r->request->protocol, happens deeper in the #LWP::Protocol::http* modules my $proto = user_agent_request_num($r) ? "1.1" : "1.0"; $r->request->protocol("HTTP/$proto"); } my $want_body = $DebugLWP > 1; print "#lwp request:\n", lwp_as_string($r->request, $want_body); print "#server response:\n", lwp_as_string($r, $want_body); } sub lwp_call { my($name, $shortcut) = (shift, shift); my $r = (\&{$name})->(@_); Carp::croak("$name(@_) didn't return a response object") unless $r; my $error = ""; unless ($shortcut) { #GET, HEAD, POST if ($r->method eq "POST" && !defined($r->header("Content-Length"))) { $r->header('Content-Length' => length($r->content)); } $r = $UA ? $UA->request($r) : $r; my $proto = $r->protocol; if (defined($proto)) { if ($proto !~ /^HTTP\/(\d\.\d)$/) { $error = "response had no protocol (is LWP broken or something?)"; } if ($1 ne "1.0" && $1 ne "1.1") { $error = "response had protocol HTTP/$1 (headers not sent?)" unless ($1 eq "0.9" && $ENV{APACHE_TEST_HTTP_09_OK}); } } } if ($DebugLWP and not $shortcut) { lwp_trace($r); } Carp::croak($error) if $error; return $shortcut ? $r->$shortcut() : $r; } my %shortcuts = (RC => sub { shift->code }, OK => sub { shift->is_success }, STR => sub { shift->as_string }, HEAD => sub { lwp_as_string(shift, 0) }, BODY => sub { shift->content }, BODY_ASSERT => sub { content_assert(shift) }, ); for my $name (@EXPORT) { my $package = $have_lwp ? 'HTTP::Request::Common': 'Apache::TestClient'; my $method = join '::', $package, $name; no strict 'refs'; next unless defined &$method; *$name = sub { my($url, $pass, $keep) = prepare(@_); local $RedirectOK = exists $keep->{redirect_ok} ? $keep->{redirect_ok} : $RedirectOK; return lwp_call($method, undef, $url, @$pass); }; while (my($shortcut, $cv) = each %shortcuts) { my $alias = join '_', $name, $shortcut; *$alias = sub { lwp_call($name, $cv, @_) }; } } my @export_std = @EXPORT; for my $method (@export_std) { push @EXPORT, map { join '_', $method, $_ } keys %shortcuts; } push @EXPORT, qw(UPLOAD UPLOAD_BODY UPLOAD_BODY_ASSERT); sub to_string { my $obj = shift; ref($obj) ? $obj->as_string : $obj; } # request an interpreter instance and use this interpreter id to # select the same interpreter in requests below sub same_interp_tie { my($url) = @_; my $res = GET($url, INTERP_KEY, 'tie'); unless ($res->code == 200) { die sprintf "failed to init the same_handler data (url=%s). " . "Failed with code=%s, response:\n%s", $url, $res->code, $res->content; } my $same_interp = $res->header(INTERP_KEY); return $same_interp; } # run the request though the selected perl interpreter, by polling # until we found it # currently supports only GET, HEAD, PUT, POST subs sub same_interp_do { my($same_interp, $sub, $url, @args) = @_; die "must pass an interpreter id, obtained via same_interp_tie()" unless defined $same_interp and $same_interp; push @args, (INTERP_KEY, $same_interp); my $res = ''; my $times = 0; my $found_same_interp = ''; do { #loop until we get a response from our interpreter instance $res = $sub->($url, @args); die "no result" unless $res; my $code = $res->code; if ($code == 200) { $found_same_interp = $res->header(INTERP_KEY) || ''; } elsif ($code == 404) { # try again } else { die sprintf "failed to run the request (url=%s):\n" . "code=%s, response:\n%s", $url, $code, $res->content; } unless ($found_same_interp eq $same_interp) { $found_same_interp = ''; } if ($times++ > TRY_TIMES) { #prevent endless loop die "unable to find interp $same_interp\n"; } } until ($found_same_interp); return $found_same_interp ? $res : undef; } sub set_client_cert { my $name = shift; my $vars = Apache::Test::vars(); my $dir = join '/', $vars->{sslca}, $vars->{sslcaorg}; if ($name) { my ($cert, $key) = ("$dir/certs/$name.crt", "$dir/keys/$name.pem"); @ENV{qw/HTTPS_CERT_FILE HTTPS_KEY_FILE/} = ($cert, $key); if ($LWP::VERSION >= 6.0) { # IO::Socket:SSL doesn't look at environment variables if ($UA) { $UA->ssl_opts(SSL_cert_file => $cert); $UA->ssl_opts(SSL_key_file => $key); } else { user_agent(ssl_opts => { SSL_cert_file => $cert, SSL_key_file => $key }); } } } else { for (qw(CERT KEY)) { delete $ENV{"HTTPS_${_}_FILE"}; } if ($LWP::VERSION >= 6.0 and $UA) { $UA->ssl_opts(SSL_cert_file => undef); $UA->ssl_opts(SSL_key_file => undef); } } } #want news: urls to work with the LWP shortcuts #but cant find a clean way to override the default nntp port #by brute force we trick Net::NTTP into calling FixupNNTP::new #instead of IO::Socket::INET::new, we fixup the args then forward #to IO::Socket::INET::new #also want KeepAlive on for Net::HTTP #XXX libwww-perl 5.53_xx has: LWP::UserAgent->new(keep_alive => 1); sub install_net_socket_new { my($module, $code) = @_; return unless Apache::Test::have_module($module); no strict 'refs'; my $new; my $isa = \@{"$module\::ISA"}; for (@$isa) { last if $new = $_->can('new'); } my $fixup_class = "Apache::TestRequest::$module"; unshift @$isa, $fixup_class; *{"$fixup_class\::new"} = sub { my $class = shift; my $args = {@_}; $code->($args); return $new->($class, %$args); }; } my %scheme_fixups = ( 'news' => sub { return if $INC{'Net/NNTP.pm'}; eval { install_net_socket_new('Net::NNTP' => sub { my $args = shift; my($host, $port) = split ':', Apache::TestRequest::hostport(); $args->{PeerPort} = $port; $args->{PeerAddr} = $host; }); }; }, ); sub scheme_fixup { my $scheme = shift; my $fixup = $scheme_fixups{$scheme}; return unless $fixup; $fixup->(); } # when the client side simply prints the response body which should # include the test's output, we need to make sure that the request # hasn't failed, or the test will be skipped instead of indicating the # error. sub content_assert { my $res = shift; return $res->content if $res->is_success; die join "\n", "request has failed (the response code was: " . $res->code . ")", "see t/logs/error_log for more details\n"; } 1; =head1 NAME Apache::TestRequest - Send requests to your Apache test server =head1 SYNOPSIS use Apache::Test qw(ok have_lwp); use Apache::TestRequest qw(GET POST); use Apache::Constants qw(HTTP_OK); plan tests => 1, have_lwp; my $res = GET '/test.html'; ok $res->code == HTTP_OK, "Request is ok"; =head1 DESCRIPTION B provides convenience functions to allow you to make requests to your Apache test server in your test scripts. It subclasses C, so that you have access to all if its methods, but also exports a number of useful functions likely useful for majority of your test requests. Users of the old C (or C) module, take note! Herein lie most of the functions you'll need to use to replace C in your test suites. Each of the functions exported by C uses an C object to submit the request and retrieve its results. The return value for many of these functions is an HTTP::Response object. See L for documentation of its methods, which you can use in your tests. For example, use the C and C methods to test the response code and content of your request. Using C, you can perform a couple of tests using these methods like this: use Apache::Test qw(ok have_lwp); use Apache::TestRequest qw(GET POST); use Apache::Constants qw(HTTP_OK); plan tests => 2, have_lwp; my $uri = "/test.html?foo=1&bar=2"; my $res = GET $uri; ok $res->code == HTTP_OK, "Check that the request was OK"; ok $res->content eq "foo => 1, bar => 2", "Check its content"; Note that you can also use C with C and its derivatives, including C: use Test::More; # ... is $res->code, HTTP_OK, "Check that the request was OK"; is $res->content, "foo => 1, bar => 2", "Check its content"; =head1 CONFIGURATION FUNCTION You can tell C what kind of C object to use for its convenience functions with C. This function uses its arguments to construct an internal global C object that will be used for all subsequent requests made by the convenience functions. The arguments it takes are the same as for the C constructor. See the C> documentation for a complete list. The C function only creates the internal C object the first time it is called. Since this function is called internally by C, you should always use the C parameter to force it to create a new global C Object: Apache::TestRequest::user_agent(reset => 1, %params); C differs from C<< LWP::UserAgent->new >> in two additional ways. First, it supports an additional parameter, C, which enables connection persistence, where the same connection is used to process multiple requests (and, according to the C> documentation, has the effect of loading and enabling the new experimental HTTP/1.1 protocol module). And finally, the semantics of the C parameter is different than for C in that you can pass it a boolean value as well as an array for C. To force C not to follow redirects in any of its convenience functions, pass a false value to C: Apache::TestRequest::user_agent(reset => 1, requests_redirectable => 0); If LWP is not installed, then you can still pass in an array reference as C expects. C will examine the array and allow redirects if the array contains more than one value or if there is only one value and that value is not "POST": # Always allow redirection. my $redir = have_lwp() ? [qw(GET HEAD POST)] : 1; Apache::TestRequest::user_agent(reset => 1, requests_redirectable => $redir); But note that redirection will B work with C unless LWP is installed. It's best, therefore, to check C before running tests that rely on a redirection from C. Sometimes it is desireable to have C remember cookies sent by the pages you are testing and send them back to the server on subsequent requests. This is especially necessary when testing pages whose functionality relies on sessions or the presence of preferences stored in cookies. By default, C does B remember cookies between requests. You can tell it to remember cookies between request by adding: Apache::TestRequest::user_agent(cookie_jar => {}); before issuing the requests. =head1 FUNCTIONS C exports a number of functions that will likely prove convenient for use in the majority of your request tests. =head2 Optional Parameters Each function also takes a number of optional arguments. =over 4 =item redirect_ok By default a request will follow redirects retrieved from the server. To prevent this behavior, pass a false value to a C parameter: my $res = GET $uri, redirect_ok => 0; Alternately, if all of your tests need to disable redirects, tell C to use an C object that disables redirects: Apache::TestRequest::user_agent( reset => 1, requests_redirectable => 0 ); =item cert If you need to force an SSL request to use a particular SSL certificate, pass the name of the certificate via the C parameter: my $res = GET $uri, cert => 'my_cert'; =item content If you need to add content to your request, use the C parameter: my $res = GET $uri, content => 'hello world!'; =item filename The name of a local file on the file system to be sent to the Apache test server via C and its friends. =back =head2 The Functions =head3 GET my $res = GET $uri; Sends a simple GET request to the Apache test server. Returns an C object. You can also supply additional headers to be sent with the request by adding their name/value pairs after the C parameter, for example: my $res = GET $url, 'Accept-Language' => 'de,en-us,en;q=0.5'; =head3 GET_STR A shortcut function for Cas_string>. =head3 GET_BODY A shortcut function for Ccontent>. =head3 GET_BODY_ASSERT Use this function when your test is outputting content that you need to check, and you want to make sure that the request was successful before comparing the contents of the request. If the request was unsuccessful, C will return an error message. Otherwise it will simply return the content of the request just as C would. =head3 GET_OK A shortcut function for Cis_success>. =head3 GET_RC A shortcut function for Ccode>. =head3 GET_HEAD Throws out the content of the request, and returns the string representation of the request. Since the body has been thrown out, the representation will consist solely of the headers. Furthermore, C inserts a "#" at the beginning of each line of the return string, so that the contents are suitable for printing to STDERR during your tests without interfering with the workings of C. =head3 HEAD my $res = HEAD $uri; Sends a HEAD request to the Apache test server. Returns an C object. =head3 HEAD_STR A shortcut function for Cas_string>. =head3 HEAD_BODY A shortcut function for Ccontent>. Of course, this means that it will likely return nothing. =head3 HEAD_BODY_ASSERT Use this function when your test is outputting content that you need to check, and you want to make sure that the request was successful before comparing the contents of the request. If the request was unsuccessful, C will return an error message. Otherwise it will simply return the content of the request just as C would. =head3 HEAD_OK A shortcut function for Cis_success>. =head3 HEAD_RC A shortcut function for Ccode>. =head3 HEAD_HEAD Throws out the content of the request, and returns the string representation of the request. Since the body has been thrown out, the representation will consist solely of the headers. Furthermore, C inserts a "#" at the beginning of each line of the return string, so that the contents are suitable for printing to STDERR during your tests without interfering with the workings of C. =head3 PUT my $res = PUT $uri; Sends a simple PUT request to the Apache test server. Returns an C object. =head3 PUT_STR A shortcut function for Cas_string>. =head3 PUT_BODY A shortcut function for Ccontent>. =head3 PUT_BODY_ASSERT Use this function when your test is outputting content that you need to check, and you want to make sure that the request was successful before comparing the contents of the request. If the request was unsuccessful, C will return an error message. Otherwise it will simply return the content of the request just as C would. =head3 PUT_OK A shortcut function for Cis_success>. =head3 PUT_RC A shortcut function for Ccode>. =head3 PUT_HEAD Throws out the content of the request, and returns the string representation of the request. Since the body has been thrown out, the representation will consist solely of the headers. Furthermore, C inserts a "#" at the beginning of each line of the return string, so that the contents are suitable for printing to STDERR during your tests without interfering with the workings of C. =head3 POST my $res = POST $uri, [ arg => $val, arg2 => $val ]; Sends a POST request to the Apache test server and returns an C object. An array reference of parameters passed as the second argument will be submitted to the Apache test server as the POST content. Parameters corresponding to those documented in L can follow the optional array reference of parameters, or after C<$uri>. To upload a chunk of data, simply use: my $res = POST $uri, content => $data; =head3 POST_STR A shortcut function for Ccontent>. =head3 POST_BODY A shortcut function for Ccontent>. =head3 POST_BODY_ASSERT Use this function when your test is outputting content that you need to check, and you want to make sure that the request was successful before comparing the contents of the request. If the request was unsuccessful, C will return an error message. Otherwise it will simply return the content of the request just as C would. =head3 POST_OK A shortcut function for Cis_success>. =head3 POST_RC A shortcut function for Ccode>. =head3 POST_HEAD Throws out the content of the request, and returns the string representation of the request. Since the body has been thrown out, the representation will consist solely of the headers. Furthermore, C inserts a "#" at the beginning of each line of the return string, so that the contents are suitable for printing to STDERR during your tests without interfering with the workings of C. =head3 UPLOAD my $res = UPLOAD $uri, \@args, filename => $filename; Sends a request to the Apache test server that includes an uploaded file. Other POST parameters can be passed as a second argument as an array reference. C will read in the contents of the file named via the C parameter for submission to the server. If you'd rather, you can submit use the C parameter instead of C, and its value will be submitted to the Apache server as file contents: my $res = UPLOAD $uri, undef, content => "This is file content"; The name of the file sent to the server will simply be "b". Note that in this case, you cannot pass other POST arguments to C -- they would be ignored. =head3 UPLOAD_BODY A shortcut function for Ccontent>. =head3 UPLOAD_BODY_ASSERT Use this function when your test is outputting content that you need to check, and you want to make sure that the request was successful before comparing the contents of the request. If the request was unsuccessful, C will return an error message. Otherwise it will simply return the content of the request just as C would. =head3 OPTIONS my $res = OPTIONS $uri; Sends an C request to the Apache test server. Returns an C object with the I header, indicating which methods the server supports. Possible methods include C, C, C and C. This function thus can be useful for testing what options the Apache server supports. Consult the HTTPD 1.1 specification, section 9.2, at I for more information. =head2 URL Manipulation Functions C also includes a few helper functions to aid in the creation of urls used in the functions above. =head3 C $path = Apache::TestRequest::module2path($module_name); Convert a module name to a path, safe for use in the various request methods above. e.g. C<::> can't be used in URLs on win32. For example: $path = Apache::TestRequest::module2path('Foo::Bar'); returns: /Foo__Bar =head3 C $url = Apache::TestRequest::module2url($module); $url = Apache::TestRequest::module2url($module, \%options); Convert a module name to a full URL including the current configurations C and sets C accordingly. $url = Apache::TestRequest::module2url('Foo::Bar'); returns: http://$hostname:$port/Foo__Bar The default scheme used is C. You can override this by passing your preferred scheme into an optional second param. For example: $module = 'MyTestModule::TestHandler'; $url = Apache::TestRequest::module2url($module, {scheme => 'https'}); returns: https://$hostname:$port/MyTestModule__TestHandler You may also override the default path with a path of your own: $module = 'MyTestModule::TestHandler'; $url = Apache::TestRequest::module2url($module, {path => '/foo'}); returns: http://$hostname:$port/foo =head1 ENVIRONMENT VARIABLES The following environment variables can affect the behavior of C: =over =item APACHE_TEST_PRETEND_NO_LWP If the environment variable C is set to a true value, C will pretend that LWP is not available so one can test whether the test suite will survive on a system which doesn't have libwww-perl installed. =item APACHE_TEST_HTTP_09_OK If the environment variable C is set to a true value, C will allow HTTP/0.9 responses from the server to proceed. The default behavior is to die if the response protocol is not either HTTP/1.0 or HTTP/1.1. =back =head1 SEE ALSO L is the main Apache testing module. Use it to set up your tests, create a plan, and to ensure that you have the Apache version and modules you need. Use L in your I to set up your distribution for testing. =head1 AUTHOR Doug MacEachern with contributions from Geoffrey Young, Philippe M. Chiasson, Stas Bekman and others. Documentation by David Wheeler. Questions can be asked at the test-dev httpd.apache.org list. For more information see: I and I. mod_perl-2.0.9/Apache-Test/lib/Apache/TestRun.pm0000644000177200010010000010573112540623176020067 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestRun; use strict; use warnings FATAL => 'all'; use Apache::Test (); use Apache::TestMM (); use Apache::TestConfig (); use Apache::TestConfigC (); use Apache::TestRequest (); use Apache::TestHarness (); use Apache::TestTrace; use Cwd; use ExtUtils::MakeMaker; use File::Find qw(finddepth); use File::Path; use File::Spec::Functions qw(catfile catdir canonpath); use File::Basename qw(basename dirname); use Getopt::Long qw(GetOptions); use Config; use constant IS_APACHE_TEST_BUILD => Apache::TestConfig::IS_APACHE_TEST_BUILD; use constant STARTUP_TIMEOUT => 300; # secs (good for extreme debug cases) use subs qw(exit_shell exit_perl); my $orig_command; my $orig_cwd; my $orig_conf_opts; my %core_files = (); my @std_run = qw(start-httpd run-tests stop-httpd); my @others = qw(verbose configure clean help ssl http11 bugreport save no-httpd one-process); my @flag_opts = (@std_run, @others); my @string_opts = qw(order trace); my @ostring_opts = qw(proxy ping); my @debug_opts = qw(debug); my @list_opts = qw(preamble postamble breakpoint); my @hash_opts = qw(header); my @help_opts = qw(clean help); my @request_opts = qw(get post head); my @exit_opts_no_need_httpd = (@help_opts); my @exit_opts_need_httpd = (@debug_opts, qw(ping)); my %usage = ( 'start-httpd' => 'start the test server', 'run-tests' => 'run the tests', 'order=mode' => 'run the tests in one of the modes: ' . '(repeat|random|SEED)', 'stop-httpd' => 'stop the test server', 'no-httpd' => 'run the tests without configuring or starting httpd', 'verbose[=1]' => 'verbose output', 'configure' => 'force regeneration of httpd.conf ' . ' (tests will not be run)', 'clean' => 'remove all generated test files', 'help' => 'display this message', 'bugreport' => 'print the hint how to report problems', 'preamble' => 'config to add at the beginning of httpd.conf', 'postamble' => 'config to add at the end of httpd.conf', 'ping[=block]' => 'test if server is running or port in use', 'debug[=name]' => 'start server under debugger name (gdb, ddd, etc.)', 'breakpoint=bp' => 'set breakpoints (multiply bp can be set)', 'header' => "add headers to (" . join('|', @request_opts) . ") request", 'http11' => 'run all tests with HTTP/1.1 (keep alive) requests', 'ssl' => 'run tests through ssl', 'proxy' => 'proxy requests (default proxy is localhost)', 'trace=T' => 'change tracing default to: warning, notice, ' . 'info, debug, ...', 'one-process' => 'run the server in single process mode', (map { $_, "\U$_\E url" } @request_opts), ); sub fixup { #make sure we use an absolute path to perl #else Test::Harness uses the perl in our PATH #which might not be the one we want $^X = $Config{perlpath} unless -e $^X; } # if the test suite was aborted because of a user-error we don't want # to call the bugreport and invite users to submit a bug report - # after all it's a user error. but we still want the program to fail, # so raise this flag in such a case. my $user_error = 0; sub user_error { my $self = shift; $user_error = shift if @_; $user_error; } sub new { my $class = shift; my $self = bless { tests => [], @_, }, $class; $self->fixup; $self; } #split arguments into test files/dirs and options #take extra care if -e, the file matches /\.t$/ # if -d, the dir contains .t files #so we dont slurp arguments that are not tests, example: # httpd $HOME/apache-2.0/bin/httpd sub split_test_args { my($self) = @_; my(@tests); my $top_dir = $self->{test_config}->{vars}->{top_dir}; my $t_dir = $self->{test_config}->{vars}->{t_dir}; my $argv = $self->{argv}; my @leftovers = (); for (@$argv) { my $arg = $_; # need the t/ (or t\) for stat-ing, but don't want to include # it in test output $arg =~ s@^(?:\.[\\/])?t[\\/]@@; my $file = catfile $t_dir, $arg; if (-d $file and $_ ne '/') { my @files = <$file/*.t>; my $remove = catfile $top_dir, ""; if (@files) { push @tests, map { s,^\Q$remove,,; $_ } @files; next; } } else { if ($file =~ /\.t$/ and -e $file) { push @tests, "t/$arg"; next; } elsif (-e "$file.t") { push @tests, "t/$arg.t"; next; } elsif (/^[\d.]+$/) { my @t = $_; #support range of subtests: t/TEST t/foo/bar 60..65 if (/^(\d+)\.\.(\d+)$/) { @t = $1..$2; } push @{ $self->{subtests} }, @t; next; } } push @leftovers, $_; } $self->{tests} = [ map { canonpath($_) } @tests ]; $self->{argv} = \@leftovers; } sub die_on_invalid_args { my($self) = @_; # at this stage $self->{argv} should be empty my @invalid_argv = @{ $self->{argv} }; if (@invalid_argv) { error "unknown opts or test names: @invalid_argv\n" . "-help will list options\n"; exit_perl 0; } } sub passenv { my $passenv = Apache::TestConfig->passenv; for (keys %$passenv) { return 1 if $ENV{$_}; } 0; } sub getopts { my($self, $argv) = @_; local *ARGV = $argv; my(%opts, %vopts, %conf_opts); # a workaround to support -verbose and -verbose=0|1 # $Getopt::Long::VERSION > 2.26 can use the "verbose:1" rule # but we have to support older versions as well @ARGV = grep defined, map {/-verbose=(\d)/ ? ($1 ? '-verbose' : undef) : $_ } @ARGV; # permute : optional values can come before the options # pass_through : all unknown things are to be left in @ARGV Getopt::Long::Configure(qw(pass_through permute)); # grab from @ARGV only the options that we expect GetOptions(\%opts, @flag_opts, @help_opts, (map "$_:s", @debug_opts, @request_opts, @ostring_opts), (map "$_=s", @string_opts), (map { ("$_=s", $vopts{$_} ||= []) } @list_opts), (map { ("$_=s", $vopts{$_} ||= {}) } @hash_opts)); $opts{$_} = $vopts{$_} for keys %vopts; # separate configuration options and test files/dirs my $req_wanted_args = Apache::TestRequest::wanted_args(); my @argv = (); my %req_args = (); while (@ARGV) { my $val = shift @ARGV; if ($val =~ /^--?(.+)/) { # must have a leading - or -- my $key = lc $1; # a known config option? if (exists $Apache::TestConfig::Usage{$key}) { $conf_opts{$key} = shift @ARGV; next; } # a TestRequest config option? elsif (exists $req_wanted_args->{$key}) { $req_args{$key} = shift @ARGV; next; } } # to be processed later push @argv, $val; } # save the orig args (make a deep copy) $orig_conf_opts = { %conf_opts }; # fixup the filepath options on win32 (spaces, short names, etc.) if (Apache::TestConfig::WIN32) { for my $key (keys %conf_opts) { next unless Apache::TestConfig::conf_opt_is_a_filepath($key); next unless -e $conf_opts{$key}; $conf_opts{$key} = Win32::GetShortPathName($conf_opts{$key}); } } $opts{req_args} = \%req_args; # only test files/dirs if any at all are left in argv $self->{argv} = \@argv; # force regeneration of httpd.conf if commandline args want to # modify it. configure_opts() has more checks to decide whether to # reconfigure or not. # XXX: $self->passenv() is already tested in need_reconfiguration() $self->{reconfigure} = $opts{configure} || (grep { $opts{$_}->[0] } qw(preamble postamble)) || (grep { $Apache::TestConfig::Usage{$_} } keys %conf_opts ) || $self->passenv() || (! -e 't/conf/httpd.conf'); if (exists $opts{debug}) { $opts{debugger} = $opts{debug}; $opts{debug} = 1; } if ($opts{trace}) { my %levels = map {$_ => 1} @Apache::TestTrace::Levels; if (exists $levels{ $opts{trace} }) { $Apache::TestTrace::Level = $opts{trace}; # propogate the override for the server-side. # -trace overrides any previous APACHE_TEST_TRACE_LEVEL settings $ENV{APACHE_TEST_TRACE_LEVEL} = $opts{trace}; } else { error "unknown trace level: $opts{trace}", "valid levels are: @Apache::TestTrace::Levels"; exit_perl 0; } } # breakpoint automatically turns the debug mode on if (@{ $opts{breakpoint} }) { $opts{debug} ||= 1; } if ($self->{reconfigure}) { $conf_opts{save} = 1; delete $self->{reconfigure}; } else { $conf_opts{thaw} = 1; } #propagate some values for (qw(verbose)) { $conf_opts{$_} = $opts{$_}; } $self->{opts} = \%opts; $self->{conf_opts} = \%conf_opts; } sub default_run_opts { my $self = shift; my($opts, $tests) = ($self->{opts}, $self->{tests}); unless (grep { exists $opts->{$_} } @std_run, @request_opts) { if (@$tests && $self->{server}->ping) { # if certain tests are specified and server is running, # dont restart $opts->{'run-tests'} = 1; } else { #default is start-server run-tests stop-server $opts->{$_} = 1 for @std_run; } } $opts->{'run-tests'} ||= @$tests; } my $parent_pid = $$; sub is_parent { $$ == $parent_pid } my $caught_sig_int = 0; sub install_sighandlers { my $self = shift; my($server, $opts) = ($self->{server}, $self->{opts}); $SIG{__DIE__} = sub { return unless $_[0] =~ /^Failed/i; #dont catch Test::ok failures # _show_results() calls die() under a few conditions, such as # when no tests are run or when tests fail. make sure the message # is propagated back to the user. print $_[0] if (caller(1))[3]||'' eq 'Test::Harness::_show_results'; $server->stop(1) if $opts->{'start-httpd'}; $server->failed_msg("error running tests"); exit_perl 0; }; $SIG{INT} = sub { if ($caught_sig_int++) { warning "\ncaught SIGINT"; exit_perl 0; } warning "\nhalting tests"; $server->stop if $opts->{'start-httpd'}; exit_perl 0; }; #try to make sure we scan for core no matter what happens #must eval "" to "install" this END block, otherwise it will #always run, a subclass might not want that eval 'END { return unless is_parent(); # because of fork $self ||= Apache::TestRun->new(test_config => Apache::TestConfig->thaw); { local $?; # preserve the exit status eval { $self->scan_core; }; } $self->try_bug_report(); }'; die "failed: $@" if $@; } sub try_bug_report { my $self = shift; if ($? && !$self->user_error && $self->{opts}->{bugreport} && $self->can('bug_report')) { $self->bug_report; } } #throw away cached config and start fresh sub refresh { my $self = shift; $self->opt_clean(1); $self->{conf_opts}->{save} = delete $self->{conf_opts}->{thaw} || 1; $self->{test_config} = $self->new_test_config()->httpd_config; $self->{test_config}->{server}->{run} = $self; $self->{server} = $self->{test_config}->server; } sub configure_opts { my $self = shift; my $save = shift; my $refreshed = 0; my($test_config, $opts) = ($self->{test_config}, $self->{opts}); $test_config->{vars}->{scheme} = $opts->{ssl} ? 'https' : $self->{conf_opts}->{scheme} || 'http'; if ($opts->{http11}) { $ENV{APACHE_TEST_HTTP11} = 1; } # unless we are already reconfiguring, check for .conf.in files changes if (!$$save && (my @reasons = $self->{test_config}->need_reconfiguration($self->{conf_opts}))) { warning "forcing re-configuration:"; warning "\t- $_." for @reasons; unless ($refreshed) { $self->refresh; $refreshed = 1; $test_config = $self->{test_config}; } } # unless we are already reconfiguring, check for -proxy if (!$$save && exists $opts->{proxy}) { my $max = $test_config->{vars}->{maxclients}; $opts->{proxy} ||= 'on'; #if config is cached and MaxClients == 1, must reconfigure if (!$$save and $opts->{proxy} eq 'on' and $max == 1) { $$save = 1; warning "server is reconfigured for proxy"; unless ($refreshed) { $self->refresh; $refreshed = 1; $test_config = $self->{test_config}; } } $test_config->{vars}->{proxy} = $opts->{proxy}; } else { $test_config->{vars}->{proxy} = 'off'; } return unless $$save; my $preamble = sub { shift->preamble($opts->{preamble}) }; my $postamble = sub { shift->postamble($opts->{postamble}) }; $test_config->preamble_register($preamble); $test_config->postamble_register($postamble); } sub pre_configure { } sub configure { my $self = shift; if ($self->{opts}->{'no-httpd'}) { warning "skipping httpd configuration"; return; } # create the conf dir as early as possible $self->{test_config}->prepare_t_conf(); my $save = \$self->{conf_opts}->{save}; $self->configure_opts($save); my $config = $self->{test_config}; unless ($$save) { my $addr = \$config->{vars}->{remote_addr}; my $remote_addr = $config->our_remote_addr; unless ($$addr eq $remote_addr) { warning "local ip address has changed, updating config cache"; $$addr = $remote_addr; } #update minor changes to cached config #without complete regeneration #for example this allows switching between #'t/TEST' and 't/TEST -ssl' $config->sync_vars(qw(scheme proxy remote_addr)); return; } my $test_config = $self->{test_config}; $test_config->sslca_generate; $test_config->generate_ssl_conf if $self->{opts}->{ssl}; $test_config->cmodules_configure; $test_config->generate_httpd_conf; $test_config->save; } sub try_exit_opts { my $self = shift; my @opts = @_; for (@opts) { next unless exists $self->{opts}->{$_}; my $method = "opt_$_"; my $rc = $self->$method(); exit_perl $rc if $rc; } if ($self->{opts}->{'stop-httpd'}) { my $ok = 1; if ($self->{server}->ping) { $ok = $self->{server}->stop; $ok = $ok < 0 ? 0 : 1; # adjust to 0/1 logic } else { warning "server $self->{server}->{name} is not running"; # cleanup a stale pid file if found my $pid_file = $self->{test_config}->{vars}->{t_pid_file}; unlink $pid_file if -e $pid_file; } exit_perl $ok; } } sub start { my $self = shift; my $opts = $self->{opts}; my $server = $self->{server}; #if t/TEST -d is running make sure we don't try to stop/start the server my $file = $server->debugger_file; if (-e $file and $opts->{'start-httpd'}) { if ($server->ping) { warning "server is running under the debugger, " . "defaulting to -run"; $opts->{'start-httpd'} = $opts->{'stop-httpd'} = 0; } else { warning "removing stale debugger note: $file"; unlink $file; } } $self->check_runtime_user(); if ($opts->{'start-httpd'}) { exit_perl 0 unless $server->start; } elsif ($opts->{'run-tests'}) { my $is_up = $server->ping || (exists $self->{opts}->{ping} && $self->{opts}->{ping} eq 'block' && $server->wait_till_is_up(STARTUP_TIMEOUT)); unless ($is_up) { error "server is not ready yet, try again."; exit_perl 0; } } } sub run_tests { my $self = shift; my $test_opts = { verbose => $self->{opts}->{verbose}, tests => $self->{tests}, order => $self->{opts}->{order}, subtests => $self->{subtests} || [], }; if (grep { exists $self->{opts}->{$_} } @request_opts) { run_request($self->{test_config}, $self->{opts}); } else { Apache::TestHarness->run($test_opts) if $self->{opts}->{'run-tests'}; } } sub stop { my $self = shift; return $self->{server}->stop if $self->{opts}->{'stop-httpd'}; } sub new_test_config { my $self = shift; Apache::TestConfig->new($self->{conf_opts}); } sub set_ulimit_via_sh { return if Apache::TestConfig::WINFU; return if $ENV{APACHE_TEST_ULIMIT_SET}; # only root can allow unlimited core dumps on Solaris (8 && 9?) if (Apache::TestConfig::SOLARIS) { my $user = getpwuid($>) || ''; if ($user ne 'root') { warning "Skipping 'set unlimited ulimit for coredumps', " . "since we are running as a non-root user on Solaris"; return; } } my $binsh = '/bin/sh'; return unless -e $binsh; $ENV{APACHE_TEST_ULIMIT_SET} = 1; my $sh = Symbol::gensym(); open $sh, "echo ulimit -a | $binsh|" or die; local $_; while (<$sh>) { if (/^core.*unlimited$/) { #already set to unlimited $ENV{APACHE_TEST_ULIMIT_SET} = 1; return; } } close $sh; $orig_command = "ulimit -c unlimited; $orig_command"; warning "setting ulimit to allow core files\n$orig_command"; # use 'or die' to avoid warnings due to possible overrides of die exec $orig_command or die "exec $orig_command has failed"; } sub set_ulimit { my $self = shift; #return if $self->set_ulimit_via_bsd_resource; eval { $self->set_ulimit_via_sh }; } sub set_env { #export some environment variables for t/modules/env.t #(the values are unimportant) $ENV{APACHE_TEST_HOSTNAME} = 'test.host.name'; $ENV{APACHE_TEST_HOSTTYPE} = 'z80'; } sub run { my $self = shift; # assuming that test files are always in the same directory as the # driving script, make it possible to run the test suite from any place # use a full path, which will work after chdir (e.g. ./TEST) $0 = File::Spec->rel2abs($0); if (-e $0) { my $top = dirname dirname $0; chdir $top if $top and -d $top; } # reconstruct argv, preserve multiwords args, eg 'PerlTrace all' my $argv = join " ", map { /^-/ ? $_ : qq['$_'] } @ARGV; $orig_command = "$^X $0 $argv"; $orig_cwd = Cwd::cwd(); $self->set_ulimit; $self->set_env; #make sure these are always set $self->detect_relocation($orig_cwd); my(@argv) = @_; $self->getopts(\@argv); $self->pre_configure(); # can't setup the httpd-specific parts of the config object yet $self->{test_config} = $self->new_test_config(); $self->warn_core(); # give TestServer access to our runtime configuration directives # so we can tell the server stuff if we need to $self->{test_config}->{server}->{run} = $self; $self->{server} = $self->{test_config}->server; local($SIG{__DIE__}, $SIG{INT}); $self->install_sighandlers; $self->try_exit_opts(@exit_opts_no_need_httpd); # httpd is found here (unless it was already configured before) $self->{test_config}->httpd_config(); $self->try_exit_opts(@exit_opts_need_httpd); if ($self->{opts}->{configure}) { warning "cleaning out current configuration"; $self->opt_clean(1); } $self->split_test_args; $self->die_on_invalid_args; $self->default_run_opts; # if configure() fails for some reason before it has flushed the # config to a file, save it so -clean will be able to clean if ($self->{opts}->{'start-httpd'} || $self->{opts}->{'configure'}) { eval { $self->configure }; if ($@) { error "configure() has failed:\n$@"; warning "forcing Apache::TestConfig object save"; $self->{test_config}->save; warning "run 't/TEST -clean' to clean up before continuing"; exit_perl 0; } } if ($self->{opts}->{configure}) { warning "reconfiguration done"; exit_perl 1; } $self->start unless $self->{opts}->{'no-httpd'}; $self->run_tests; $self->stop unless $self->{opts}->{'no-httpd'}; } sub rerun { my $vars = shift; # in %$vars # - httpd will be always set # - apxs is optional $orig_cwd ||= Cwd::cwd(); chdir $orig_cwd; my $new_opts = " -httpd $vars->{httpd}"; $new_opts .= " -apxs $vars->{apxs}" if $vars->{apxs}; my $new_command = $orig_command; # strip any old bogus -httpd/-apxs $new_command =~ s/--?httpd\s+$orig_conf_opts->{httpd}// if $orig_conf_opts->{httpd}; $new_command =~ s/--?httpd\s+$orig_conf_opts->{httpd}// if $orig_conf_opts->{httpd} and $vars->{apxs}; # add new opts $new_command .= $new_opts; warning "running with new config opts: $new_command"; # use 'or die' to avoid warnings due to possible overrides of die exec $new_command or die "exec $new_command has failed"; } # make it easy to move the whole distro w/o running # 't/TEST -clean' before moving. when moving the whole package, # the old cached config will stay, so we want to nuke it only if # we realize that it's no longer valid. we can't just check the # existance of the saved top_dir value, since the project may have # been copied and the old dir could be still there, but that's not # the one that we work in sub detect_relocation { my($self, $cur_top_dir) = @_; my $config_file = catfile qw(t conf apache_test_config.pm); return unless -e $config_file; my %inc = %INC; eval { require "$config_file" }; %INC = %inc; # be stealth warn($@), return if $@; my $cfg = 'apache_test_config'->new; # if the top_dir from saved config doesn't match the current # top_dir, that means that the whole project was relocated to a # different directory, w/o running t/TEST -clean first (in each # directory with a test suite) my $cfg_top_dir = $cfg->{vars}->{top_dir}; return unless $cfg_top_dir; return if $cfg_top_dir eq $cur_top_dir; # if that's the case silently fixup the saved config to use the # new paths, and force a complete cleanup. if we don't fixup the # config files, the cleanup process won't be able to locate files # to delete and re-configuration will fail { # in place editing local @ARGV = $config_file; local $^I = ".bak"; # Win32 needs a backup while (<>) { s{$cfg_top_dir}{$cur_top_dir}g; print; } unlink $config_file . $^I; } my $cleanup_cmd = "$^X $0 -clean"; warning "cleaning up the old config"; # XXX: do we care to check success? system $cleanup_cmd; # XXX: I tried hard to accomplish that w/o starting a new process, # but too many things get on the way, so for now just keep it as an # external process, as it's absolutely transparent to the normal # app-run } my @oh = qw(jeez golly gosh darn shucks dangit rats nuts dangnabit crap); sub oh { $oh[ rand scalar @oh ]; } #e.g. t/core or t/core.12499 my $core_pat = '^core(\.\d+)?' . "\$"; # $self->scan_core_incremental([$only_top_dir]) # normally would be called after each test # and since it updates the list of seen core files # scan_core() won't report these again # currently used in Apache::TestSmoke # # if $only_t_dir arg is true only the t_dir dir (t/) will be scanned sub scan_core_incremental { my($self, $only_t_dir) = @_; my $vars = $self->{test_config}->{vars}; # no core files dropped on win32 return () if Apache::TestConfig::WIN32; if ($only_t_dir) { require IO::Dir; my @cores = (); for (IO::Dir->new($vars->{t_dir})->read) { my $file = catfile $vars->{t_dir}, $_; next unless -f $file; next unless /$core_pat/o; next if exists $core_files{$file} && $core_files{$file} == -M $file; $core_files{$file} = -M $file; push @cores, $file; } return @cores ? join "\n", "server dumped core, for stacktrace, run:", map { "gdb $vars->{httpd} -core $_" } @cores : (); } my @msg = (); finddepth({ no_chdir => 1, wanted => sub { return unless -f $_; my $file = basename $File::Find::name; return unless $file =~ /$core_pat/o; my $core = $File::Find::name; unless (exists $core_files{$core} && $core_files{$core} == -M $core) { # new core file! # XXX: could rename the file if it doesn't include the pid # in its name (i.e., just called 'core', instead of 'core.365') # XXX: could pass the test name and rename the core file # to use that name as a suffix, plus pid, time or some # other unique identifier, in case the same test is run # more than once and each time it caused a segfault $core_files{$core} = -M $core; push @msg, "server dumped core, for stacktrace, run:\n" . "gdb $vars->{httpd} -core $core"; } }}, $vars->{top_dir}); return @msg; } sub scan_core { my $self = shift; my $vars = $self->{test_config}->{vars}; my $times = 0; # no core files dropped on win32 return if Apache::TestConfig::WIN32; finddepth({ no_chdir => 1, wanted => sub { return unless -f $_; my $file = basename $File::Find::name; return unless $file =~ /$core_pat/o; my $core = $File::Find::name; if (exists $core_files{$core} && $core_files{$core} == -M $core) { # we have seen this core file before the start of the test info "an old core file has been found: $core"; } else { my $oh = oh(); my $again = $times++ ? "again" : ""; error "oh $oh, server dumped core $again"; error "for stacktrace, run: gdb $vars->{httpd} -core $core"; } }}, $vars->{top_dir}); } # warn the user that there is a core file before the tests # start. suggest to delete it before proceeding or a false alarm can # be generated at the end of the test routine run. sub warn_core { my $self = shift; my $vars = $self->{test_config}->{vars}; %core_files = (); # reset global # no core files dropped on win32 return if Apache::TestConfig::WIN32; finddepth(sub { return unless -f $_; return unless /$core_pat/o; my $core = "$File::Find::dir/$_"; info "consider removing an old $core file before running tests"; # remember the timestamp of $core so we can check if it's the # old core file at the end of the run and not complain then $core_files{$core} = -M $core; }, $vars->{top_dir}); } # catch any attempts to ./t/TEST the tests as root user sub check_runtime_user { my $self = shift; return if Apache::TestConfig::WINFU; my $user = getpwuid($>) || ''; if ($user eq 'root') { error "Apache cannot spawn child processes as root, therefore the test suite must be run as a non-privileged user."; exit_perl(1); } return 1; } sub run_request { my($test_config, $opts) = @_; my @args = (%{ $opts->{header} }, %{ $opts->{req_args} }); my($request, $url) = ("", ""); for (@request_opts) { next unless exists $opts->{$_}; $url = $opts->{$_} if $opts->{$_}; $request = join $request ? '_' : '', $request, $_; } if ($request) { my $method = \&{"Apache::TestRequest::\U$request"}; my $res = $method->($url, @args); print Apache::TestRequest::to_string($res); } } sub opt_clean { my($self, $level) = @_; my $test_config = $self->{test_config}; $test_config->server->stop; $test_config->clean($level); 1; } sub opt_ping { my($self) = @_; my $test_config = $self->{test_config}; my $server = $test_config->server; my $pid = $server->ping; my $name = $server->{name}; # support t/TEST -ping=block -run ... my $exit = not $self->{opts}->{'run-tests'}; if ($pid) { if ($pid == -1) { error "port $test_config->{vars}->{port} is in use, ". "but cannot determine server pid"; } else { my $version = $server->{version}; warning "server $name running (pid=$pid, version=$version)"; } return $exit; } if (exists $self->{opts}->{ping} && $self->{opts}->{ping} eq 'block') { $server->wait_till_is_up(STARTUP_TIMEOUT); } else { warning "no server is running on $name"; exit_perl(0); } return $exit; #means call exit() if true } sub test_inc { map { "$_/Apache-Test/lib" } qw(. ..); } sub set_perl5lib { $ENV{PERL5LIB} = join $Config{path_sep}, shift->test_inc(); } sub set_perldb_opts { my $config = shift->{test_config}; my $file = catfile $config->{vars}->{t_logs}, 'perldb.out'; $config->genfile($file); #mark for -clean $ENV{PERLDB_OPTS} = "NonStop frame=4 AutoTrace LineInfo=$file"; warning "perldb log is t/logs/perldb.out"; } sub opt_debug { my $self = shift; my $server = $self->{server}; my $opts = $self->{opts}; my $debug_opts = {}; for (qw(debugger breakpoint)) { $debug_opts->{$_} = $opts->{$_}; } if (my $db = $opts->{debugger}) { if ($db =~ s/^perl=?//) { $opts->{'run-tests'} = 1; $self->start; #if not already running $self->set_perl5lib; $self->set_perldb_opts if $db eq 'nostop'; system $^X, '-MApache::TestPerlDB', '-d', @{ $self->{tests} }; $self->stop; return 1; } elsif ($db =~ s/^lwp[=:]?//) { $ENV{APACHE_TEST_DEBUG_LWP} = $db || 1; $opts->{verbose} = 1; return 0; } } $server->stop; $server->start_debugger($debug_opts); 1; } sub opt_help { my $self = shift; print <usage; 1; } # generate t/TEST script (or a different filename) which will drive # Apache::TestRun sub generate_script { my ($class, @opts) = @_; my %opts = (); # back-compat if (@opts == 1) { $opts{file} = $opts[0]; } else { %opts = @opts; $opts{file} ||= catfile 't', 'TEST'; } my $body = "BEGIN { eval { require blib && blib->import; } }\n"; my %args = @Apache::TestMM::Argv; while (my($k, $v) = each %args) { $v =~ s/\|/\\|/g; $body .= "\n\$Apache::TestConfig::Argv{'$k'} = q|$v|;\n"; } my $header = Apache::TestConfig->perlscript_header; $body .= join "\n", $header, "use $class ();"; if (my $report = $opts{bugreport}) { $body .= "\n\npackage $class;\n" . "sub bug_report { print '$report' }\n\n"; } $body .= "$class->new->run(\@ARGV);"; Apache::Test::basic_config()->write_perlscript($opts{file}, $body); } # in idiomatic perl functions return 1 on success and 0 on # failure. Shell expects the opposite behavior. So this function # reverses the status. sub exit_perl { exit_shell $_[0] ? 0 : 1; } # expects shell's exit status values (0==success) sub exit_shell { # require Carp; # Carp::cluck('exiting'); CORE::exit $_[0]; } 1; __END__ =head1 NAME Apache::TestRun - Run the test suite =head1 SYNOPSIS =head1 DESCRIPTION The C package controls the configuration and running of the test suite. =head1 METHODS Several methods are sub-classable, if the default behavior should be changed. =head2 C The C method is executed when C was executed with the C<-bugreport> option, and C (or C) fail. Normally this is callback which you can use to tell the user how to deal with the problem, e.g. suggesting to read some document or email some details to someone who can take care of it. By default nothing is executed. The C<-bugreport> option is needed so this feature won't become annoying to developers themselves. It's automatically added to the C target in F. So if you repeateadly have to test your code, just don't use C but run C directly. Here is an example of a custom C My::TestRun->new->run(@ARGV); package My::TestRun; use base 'Apache::TestRun'; sub bug_report { my $self = shift; print < The C method is executed before the configuration for C is generated. So if you need to adjust the setup before I and other files are autogenerated, this is the right place to do so. For example if you don't want to inherit a LoadModule directive for I but to make sure that the local version is used, you can sub-class C and override this method in I: package My::TestRun; use base 'Apache::TestRun'; use Apache::TestConfig; __PACKAGE__->new->run(@ARGV); sub pre_configure { my $self = shift; # Don't load an installed mod_apreq Apache::TestConfig::autoconfig_skip_module_add('mod_apreq.c'); $self->SUPER::pre_configure(); } Notice that the extension is I<.c>, and not I<.so>. Don't forget to run the super class' c method. =head2 C META: to be completed =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestRunParrot.pm0000644000177200010010000000344512540623176021256 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestRunParrot; use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile canonpath); use Apache::TestRun (); use Apache::TestConfigParse (); use Apache::TestTrace; use Apache::TestConfigParrot (); use vars qw($VERSION); $VERSION = '1.00'; # make CPAN.pm's r() version scanner happy use File::Spec::Functions qw(catfile); # subclass of Apache::TestRun that configures parrot things use vars qw(@ISA); @ISA = qw(Apache::TestRun); sub new_test_config { my $self = shift; Apache::TestConfigParrot->new($self->{conf_opts}); } sub configure_parrot { my $self = shift; my $test_config = $self->{test_config}; $test_config->postamble_register(qw(configure_parrot_tests)); } sub configure { my $self = shift; $self->configure_parrot; $self->SUPER::configure; } #if Apache::TestRun refreshes config in the middle of configure #we need to re-add parrotconfigure hooks sub refresh { my $self = shift; $self->SUPER::refresh; $self->configure_parrot; } 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestRunPerl.pm0000644000177200010010000001000412540623176020676 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestRunPerl; use strict; use warnings FATAL => 'all'; use Apache::TestRun (); use Apache::TestConfigParse (); use Apache::TestTrace; use vars qw($VERSION); $VERSION = '1.00'; # make CPAN.pm's r() version scanner happy use File::Spec::Functions qw(catfile); #subclass of Apache::TestRun that configures mod_perlish things use vars qw(@ISA); @ISA = qw(Apache::TestRun); sub pre_configure { my $self = shift; # Apache::TestConfigPerl already configures mod_perl.so Apache::TestConfig::autoconfig_skip_module_add('mod_perl.c'); # skip over Embperl.so - it's funky Apache::TestConfig::autoconfig_skip_module_add('Embperl.c'); } sub configure_modperl { my $self = shift; my $test_config = $self->{test_config}; my $rev = $test_config->server->{rev}; my $ver = $test_config->server->{version}; # sanity checking and loading the right mod_perl version # remove mod_perl.pm from %INC so that the below require() # calls accurately populate $mp_ver delete $INC{'mod_perl.pm'}; if ($rev == 2) { eval { require mod_perl2 }; } else { eval { require mod_perl }; } my $mp_ver = $mod_perl::VERSION; if ($@) { error "You are using mod_perl response handlers ", "but do not have a mod_perl capable Apache."; Apache::TestRun::exit_perl(0); } if (($rev == 1 && $mp_ver >= 1.99) || ($rev == 2 && $mp_ver < 1.99)) { error "Found mod_perl/$mp_ver, but it can't be used with $ver"; Apache::TestRun::exit_perl(0); } if ($rev == 2) { # load apreq2 if it is present # do things a bit differently that find_and_load_module() # because apreq2 can't be loaded that way (the 2 causes a problem) my $name = 'mod_apreq2.so'; if (my $mod_path = $test_config->find_apache_module($name)) { # don't match the 2 here my ($sym) = $name =~ m/mod_(\w+)2\./; if ($mod_path && -e $mod_path) { $test_config->preamble(IfModule => "!mod_$sym.c", qq{LoadModule ${sym}_module "$mod_path"\n}); } } } $test_config->preamble_register(qw(configure_libmodperl configure_env)); $test_config->postamble_register(qw(configure_inc configure_pm_tests_inc configure_startup_pl configure_pm_tests)); } sub configure { my $self = shift; $self->configure_modperl; $self->SUPER::configure; } #if Apache::TestRun refreshes config in the middle of configure #we need to re-add modperl configure hooks sub refresh { my $self = shift; $self->SUPER::refresh; $self->configure_modperl; } 1; __END__ =head1 NAME Apache::TestRunPerl - Run mod_perl-requiring Test Suite =head1 SYNOPSIS use Apache::TestRunPerl; Apache::TestRunPerl->new->run(@ARGV); =head1 DESCRIPTION The C package controls the configuration and running of the test suite. It's a subclass of C, and should be used only when you need to run mod_perl tests. Refer to the C manpage for information on the available API. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestRunPHP.pm0000644000177200010010000002573612540623176020445 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestRunPHP; use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile canonpath); use Apache::TestRun (); use Apache::TestConfigParse (); use Apache::TestTrace; use Apache::TestConfigPHP (); use Apache::TestHarnessPHP (); use vars qw($VERSION); $VERSION = '1.00'; # make CPAN.pm's r() version scanner happy use File::Spec::Functions qw(catfile); # subclass of Apache::TestRun that configures php things use vars qw(@ISA); @ISA = qw(Apache::TestRun); sub start { my $self = shift; # point php to our own php.ini file $ENV{PHPRC} = catfile $self->{test_config}->{vars}->{serverroot}, 'conf'; $self->SUPER::start(@_); } sub new_test_config { my $self = shift; Apache::TestConfigPHP->new($self->{conf_opts}); } sub configure_php { my $self = shift; my $test_config = $self->{test_config}; $test_config->postamble_register(qw(configure_php_inc configure_php_ini configure_php_functions configure_php_tests)); } sub configure { my $self = shift; $self->configure_php; $self->SUPER::configure; } #if Apache::TestRun refreshes config in the middle of configure #we need to re-add php configure hooks sub refresh { my $self = shift; $self->SUPER::refresh; $self->configure_php; } my @request_opts = qw(get post head); sub run_tests { my $self = shift; my $test_opts = { verbose => $self->{opts}->{verbose}, tests => $self->{tests}, order => $self->{opts}->{order}, subtests => $self->{subtests} || [], }; if (grep { exists $self->{opts}->{$_} } @request_opts) { run_request($self->{test_config}, $self->{opts}); } else { Apache::TestHarnessPHP->run($test_opts) if $self->{opts}->{'run-tests'}; } } sub split_test_args { my($self) = @_; my(@tests); my $top_dir = $self->{test_config}->{vars}->{top_dir}; my $t_dir = $self->{test_config}->{vars}->{t_dir}; my $argv = $self->{argv}; my @leftovers = (); for (@$argv) { my $arg = $_; # need the t/ (or t\) for stat-ing, but don't want to include # it in test output $arg =~ s@^(?:\.[\\/])?t[\\/]@@; my $file = catfile $t_dir, $arg; if (-d $file and $_ ne '/') { my @files = <$file/*.t>; push @files, <$file/*.php>; my $remove = catfile $top_dir, ""; if (@files) { push @tests, map { s,^\Q$remove,,; $_ } @files; next; } } else { if (($file =~ /\.t$/ || $file =~ /\.php$/) and -e $file) { push @tests, "t/$arg"; next; } elsif (-e "$file.t") { push @tests, "t/$arg.t"; next; } elsif (/^[\d.]+$/) { my @t = $_; #support range of subtests: t/TEST t/foo/bar 60..65 if (/^(\d+)\.\.(\d+)$/) { @t = $1..$2; } push @{ $self->{subtests} }, @t; next; } } push @leftovers, $_; } $self->{tests} = [ map { canonpath($_) } @tests ]; $self->{argv} = \@leftovers; } 1; __END__ =head1 NAME Apache::TestRunPHP - configure and run a PHP-based test suite =head1 SYNOPSIS use Apache::TestRunPHP; Apache::TestRunPHP->new->run(@ARGV); =head1 DESCRIPTION The C package controls the configuration and running of the test suite for PHP-based tests. It's a subclass of C and similar in function to C. Refer to the C manpage for information on the available API. =head1 EXAMPLE C works almost identially to C, but in case you are new to C here is a quick getting started guide. be sure to see the links at the end of this document for places to find additional details. because C is a Perl-based testing framework we start from a C, which should have the following lines (in addition to the standard C parts): use Apache::TestMM qw(test clean); use Apache::TestRunPHP (); Apache::TestMM::filter_args(); Apache::TestRunPHP->generate_script(); C will create a script named C, the gateway to the Perl testing harness and what is invoked when you call C. C accepts some C-specific arguments and passes them along. for example, to point to a specific C installation you would invoke C as follows $ perl Makefile.PL -httpd /my/local/apache/bin/httpd and C will be propagated throughout the rest of the process. note that PHP needs to be active within Apache prior to configuring the test framework as shown above, either by virtue of PHP being compiled into the C binary statically or through an active C statement within the configuration located in C. Other required modules are the (very common) mod_alias and mod_env. now, like with C and C, you can place client-side Perl test scripts under C, such as C, and C will run these scripts when you call C. however, what makes C unique is some added magic specifically tailored to a PHP environment. here are the mechanics. C will look for PHP test scripts in that match the following pattern t/response/TestFoo/bar.php where C and C can be anything you like, and C is case sensitive. when this format is adhered to, C will create an associated Perl test script called C, which will be executed when you call C. all C does is issue a simple GET to C, leaving the actual testing to C. in essence, you can forget that C even exists. what does C look like? here is an example: if it looks odd, that's ok because it is. I could explain to you exactly what this means, but it isn't important to understand the gory details. instead, it is sufficient to understand that when C calls C it feeds the results directly to C, a module that comes with every Perl installation, and C expects what it receives to be formated in a very specific way. by itself, all of this is pretty useless, so C provides PHP testers with something much better. here is a much better example: the include library C is automatically generated by C and configurations tweaked in such a a way that your PHP scripts can find it without issue. the functions provided by C are equivalent in name and function to those in C, a standard Perl testing library, so you can see that manpage for details on the syntax and functionality of each. at this point, we have enough in place to run some tests from PHP-land - a C to configure Apache for us, and a PHP script in C to send some results out to the testing engine. issuing C would start Apache, issue the request to C, generate a report, and shut down Apache. the report would look like something like this after running the tests in verbose mode (eg C): t/php/bar....1..6 ok 1 - foo is equal to foo not ok 2 - foo is not equal to foo # Failed test (/src/devel/perl-php-test/t/response/TestFoo/bar.php at line 13) ok 3 - bar is bar not ok 4 - baz is baz # Failed test (/src/devel/perl-php-test/t/response/TestFoo/bar.php at line 17) # got: 'baz' # expected: 'bar' ok 5 - bar is not beer ok 6 - bar matches ar$ # printing some debugging information ok 7 - baz is a baz FAILED tests 2, 4, 7 Failed 3/6 tests, 50.00% okay Failed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------------------- t/php/bar.t 6 3 50.00% 2 4 7 Failed 1/1 test scripts, 0.00% okay. 1/6 subtests failed, 83.33% okay. note that the actual test file that was run was C. this file is autogenerated based on the C pattern of your PHP script. C happens to be written in Perl, but you really don't need to worry about it too much. as an interesting aside, if you are using perl-5.8.3 or later you can actually create your own C client-side scripts and they will be run via php (using our C). but more on that later... =head1 SEE ALSO the best source of information about using Apache-Test with PHP (at this time) is probably the talk given at ApacheCon 2004 (L), as well as the code from the talk (L). there is also the online tutorial L which has all of the mod_perl-specific syntax and features have been ported to PHP with this class. =head1 AUTHOR C is a community effort, maintained by a group of dedicated volunteers. Questions can be asked at the test-dev httpd.apache.org list For more information see: http://httpd.apache.org/test/. =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestServer.pm0000644000104000010010000004570312540623176022474 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestServer; use strict; use warnings FATAL => 'all'; use Config; use Socket (); use File::Spec::Functions qw(catfile); use Apache::TestTrace; use Apache::TestRun; use Apache::TestConfig (); use Apache::TestRequest (); use constant COLOR => Apache::TestConfig::COLOR; use constant WIN32 => Apache::TestConfig::WIN32; my $CTRL_M = COLOR ? "\r" : "\n"; # some debuggers use the same syntax as others, so we reuse the same # code by using the following mapping my %debuggers = ( gdb => 'gdb', ddd => 'gdb', valgrind => 'valgrind', strace => 'strace', ); sub new { my $class = shift; my $config = shift; my $self = bless { config => $config || Apache::TestConfig->thaw, }, $class; $self->{name} = join ':', map { $self->{config}->{vars}->{$_} } qw(servername port); $self->{port_counter} = $self->{config}->{vars}->{port}; $self; } # call this when you already know where httpd is sub post_config { my($self) = @_; $self->{version} = $self->{config}->httpd_version || ''; $self->{mpm} = $self->{config}->httpd_mpm || ''; # try to get the revision number from the standard Apache version # string and various variations made by distributions which mangle # that string # Foo-Apache-Bar/x.y.z ($self->{rev}) = $self->{version} =~ m|/(\d)\.|; if ($self->{rev}) { debug "Matched Apache revision $self->{version} $self->{rev}"; } else { # guessing is not good as it'll only mislead users # and we can't die since a config object is required # during Makefile.PL's write_perlscript when path to httpd may # be unknown yet. so default to non-existing version 0 for now. # and let TestRun.pm figure out the required pieces debug "can't figure out Apache revision, from string: " . "'$self->{version}', using a non-existing revision 0"; $self->{rev} = 0; # unknown } ($self->{revminor}) = $self->{version} =~ m|/\d\.(\d)|; if ($self->{revminor}) { debug "Matched Apache revminor $self->{version} $self->{revminor}"; } else { $self->{revminor} = 0; } $self; } sub version_of { my($self, $thing) = @_; die "Can't figure out what Apache server generation we are running" unless $self->{rev}; $thing->{$self->{rev}}; } my @apache_logs = qw( error_log access_log httpd.pid apache_runtime_status rewrite_log ssl_engine_log ssl_request_log cgisock ); sub clean { my $self = shift; my $dir = $self->{config}->{vars}->{t_logs}; for (@apache_logs) { my $file = catfile $dir, $_; if (unlink $file) { debug "unlink $file"; } } } sub pid_file { my $self = shift; my $vars = $self->{config}->{vars}; return $vars->{t_pid_file} || catfile $vars->{t_logs}, 'httpd.pid'; } sub dversion { my $self = shift; my $dv = "-D APACHE$self->{rev}"; if ($self->{rev} == 2 and $self->{revminor} == 4) { $dv .= " -D APACHE2_4"; } return $dv; } sub config_defines { my $self = shift; my @defines = (); for my $item (qw(useithreads)) { next unless $Config{$item} and $Config{$item} eq 'define'; push @defines, "-D PERL_\U$item"; } if (my $defines = $self->{config}->{vars}->{defines}) { push @defines, map { "-D $_" } split " ", $defines; } "@defines"; } sub args { my $self = shift; my $vars = $self->{config}->{vars}; my $dversion = $self->dversion; #for .conf version conditionals my $defines = $self->config_defines; "-d $vars->{serverroot} -f $vars->{t_conf_file} $dversion $defines"; } my %one_process = (1 => '-X', 2 => '-D ONE_PROCESS'); sub start_cmd { my $self = shift; my $args = $self->args; my $config = $self->{config}; my $vars = $config->{vars}; my $httpd = $vars->{httpd}; my $one_process = $self->{run}->{opts}->{'one-process'} ? $self->version_of(\%one_process) : ''; #XXX: threaded mpm does not respond to SIGTERM with -D ONE_PROCESS return "$httpd $one_process $args"; } sub default_gdbinit { my $gdbinit = ""; my @sigs = qw(PIPE); for my $sig (@sigs) { for my $flag (qw(pass nostop)) { $gdbinit .= "handle SIG$sig $flag\n"; } } $gdbinit; } sub strace_cmd { my($self, $strace, $file) = @_; #XXX truss, ktrace, etc. "$strace -f -o $file -s1024"; } sub valgrind_cmd { my($self, $valgrind) = @_; "$valgrind -v --leak-check=yes --show-reachable=yes --error-limit=no"; } sub start_valgrind { my $self = shift; my $opts = shift; my $config = $self->{config}; my $args = $self->args; my $one_process = $self->version_of(\%one_process); my $valgrind_cmd = $self->valgrind_cmd($opts->{debugger}); my $httpd = $config->{vars}->{httpd}; my $command = "$valgrind_cmd $httpd $one_process $args"; debug $command; system $command; } sub start_strace { my $self = shift; my $opts = shift; my $config = $self->{config}; my $args = $self->args; my $one_process = $self->version_of(\%one_process); my $file = catfile $config->{vars}->{t_logs}, 'strace.log'; my $strace_cmd = $self->strace_cmd($opts->{debugger}, $file); my $httpd = $config->{vars}->{httpd}; $config->genfile($file); #just mark for cleanup my $command = "$strace_cmd $httpd $one_process $args"; debug $command; system $command; } sub start_gdb { my $self = shift; my $opts = shift; my $debugger = $opts->{debugger}; my @breakpoints = @{ $opts->{breakpoint} || [] }; my $config = $self->{config}; my $args = $self->args; my $one_process = $self->version_of(\%one_process); my $file = catfile $config->{vars}->{serverroot}, '.gdb-test-start'; my $fh = $config->genfile($file); print $fh default_gdbinit(); if (@breakpoints) { print $fh "b ap_run_pre_config\n"; print $fh "run $one_process $args\n"; print $fh "finish\n"; for (@breakpoints) { print $fh "b $_\n" } print $fh "continue\n"; } else { print $fh "run $one_process $args\n"; } close $fh; my $command; my $httpd = $config->{vars}->{httpd}; if ($debugger eq 'ddd') { $command = qq{ddd --gdb --debugger "gdb -command $file" $httpd}; } else { ## defaults to gdb if not set in %ENV or via -debug $command = "$debugger $httpd -command $file"; } $self->note_debugging; debug $command; system $command; unlink $file; } sub debugger_file { my $self = shift; catfile $self->{config}->{vars}->{serverroot}, '.debugging'; } #make a note that the server is running under the debugger #remove note when this process exits via END sub note_debugging { my $self = shift; my $file = $self->debugger_file; my $fh = $self->{config}->genfile($file); eval qq(END { unlink "$file" }); } sub start_debugger { my $self = shift; my $opts = shift; $opts->{debugger} ||= $ENV{MP_DEBUGGER} || 'gdb'; # XXX: FreeBSD 5.2+ # gdb 6.1 and before segfaults when trying to # debug httpd startup code. 6.5 has been proven # to work. FreeBSD typically installs this as # gdb65. # Is it worth it to check the debugger and os version # and die ? unless (grep { /^$opts->{debugger}/ } keys %debuggers) { error "$opts->{debugger} is not a supported debugger", "These are the supported debuggers: ". join ", ", sort keys %debuggers; die("\n"); } my $debugger = $opts->{debugger}; $debugger =~ s/\d+$//; my $method = "start_" . $debuggers{$debugger}; ## $opts->{debugger} is passed through unchanged ## so when we try to run it next, its found. $self->$method($opts); } sub pid { my $self = shift; my $file = $self->pid_file; my $fh = Symbol::gensym(); open $fh, $file or do { return 0; }; # try to avoid the race condition when the pid file was created # but not yet written to for (1..8) { last if -s $file > 0; select undef, undef, undef, 0.25; } chomp(my $pid = <$fh> || ''); $pid; } sub select_next_port { my $self = shift; my $max_tries = 100; #XXX while ($max_tries-- > 0) { return $self->{port_counter} if $self->port_available(++$self->{port_counter}); } return 0; } sub port_available { my $self = shift; my $port = shift || $self->{config}->{vars}->{port}; local *S; my $proto = getprotobyname('tcp'); socket(S, Socket::PF_INET(), Socket::SOCK_STREAM(), $proto) || die "socket: $!"; setsockopt(S, Socket::SOL_SOCKET(), Socket::SO_REUSEADDR(), pack("l", 1)) || die "setsockopt: $!"; if (bind(S, Socket::sockaddr_in($port, Socket::INADDR_ANY()))) { close S; return 1; } else { return 0; } } =head2 stop() attempt to stop the server. returns: on success: $pid of the server on failure: -1 =cut sub stop { my $self = shift; my $aborted = shift; if (WIN32) { require Win32::Process; my $obj = $self->{config}->{win32obj}; my $pid = -1; if ($pid = $obj ? $obj->GetProcessID : $self->pid) { if (kill(0, $pid)) { Win32::Process::KillProcess($pid, 0); warning "server $self->{name} shutdown"; } } unlink $self->pid_file if -e $self->pid_file; return $pid; } my $pid = 0; my $tries = 3; my $tried_kill = 0; my $port = $self->{config}->{vars}->{port}; while ($self->ping) { #my $state = $tried_kill ? "still" : "already"; #print "Port $port $state in use\n"; if ($pid = $self->pid and !$tried_kill++) { if (kill TERM => $pid) { warning "server $self->{name} shutdown"; sleep 1; for (1..6) { if (! $self->ping) { if ($_ == 1) { unlink $self->pid_file if -e $self->pid_file; return $pid; } last; } if ($_ == 1) { warning "port $port still in use..."; } else { print "..."; } sleep $_; } if ($self->ping) { error "\nserver was shutdown but port $port ". "is still in use, please shutdown the service ". "using this port or select another port ". "for the tests"; } else { print "done\n"; } } else { error "kill $pid failed: $!"; } } else { error "port $port is in use, ". "cannot determine server pid to shutdown"; return -1; } if (--$tries <= 0) { error "cannot shutdown server on Port $port, ". "please shutdown manually"; unlink $self->pid_file if -e $self->pid_file; return -1; } } unlink $self->pid_file if -e $self->pid_file; return $pid; } sub ping { my $self = shift; my $pid = $self->pid; if ($pid and kill 0, $pid) { return $pid; } elsif (! $self->port_available) { return -1; } return 0; } sub failed_msg { my $self = shift; my($log, $rlog) = $self->{config}->error_log; my $log_file_info = -e $log ? "please examine $rlog" : "$rlog wasn't created, start the server in the debug mode"; error "@_ ($log_file_info)"; } #this doesn't work well on solaris or hpux at the moment use constant USE_SIGCHLD => $^O eq 'linux'; sub start { my $self = shift; my $old_pid = -1; if (WIN32) { # Stale PID files (e.g. left behind from a previous test run # that crashed) cannot be trusted on Windows because PID's are # re-used too frequently, so just remove it. If there is an old # server still running then the attempt to start a new one below # will simply fail because the port will be unavailable. if (-f $self->pid_file) { error "Removing old PID file -- " . "Unclean shutdown of previous test run?\n"; unlink $self->pid_file; } $old_pid = 0; } else { $old_pid = $self->stop; } my $cmd = $self->start_cmd; my $config = $self->{config}; my $vars = $config->{vars}; my $httpd = $vars->{httpd} || 'unknown'; if ($old_pid == -1) { return 0; } local $| = 1; unless (-x $httpd) { my $why = -e $httpd ? "is not executable" : "does not exist"; error "cannot start server: httpd ($httpd) $why"; return 0; } print "$cmd\n"; my $old_sig; if (WIN32) { #make sure only 1 process is started for win32 #else Kill will only shutdown the parent my $one_process = $self->version_of(\%one_process); require Win32::Process; my $obj; # We need the "1" below to inherit the calling processes # handles when running Apache::TestSmoke so as to properly # dup STDOUT/STDERR Win32::Process::Create($obj, $httpd, "$cmd $one_process", 1, Win32::Process::NORMAL_PRIORITY_CLASS(), '.'); unless ($obj) { die "Could not start the server: " . Win32::FormatMessage(Win32::GetLastError()); } $config->{win32obj} = $obj; } else { $old_sig = $SIG{CHLD}; if (USE_SIGCHLD) { # XXX: try not to be POSIX dependent require POSIX; #XXX: this is not working well on solaris or hpux $SIG{CHLD} = sub { while ((my $child = waitpid(-1, POSIX::WNOHANG())) > 0) { my $status = $? >> 8; #error "got child exit $status"; if ($status) { my $msg = "server has died with status $status"; $self->failed_msg("\n$msg"); Apache::TestRun->new(test_config => $config)->scan_core; kill SIGTERM => $$; } } }; } defined(my $pid = fork) or die "Can't fork: $!"; unless ($pid) { # child my $status = system "$cmd"; if ($status) { $status = $? >> 8; #error "httpd didn't start! $status"; } CORE::exit $status; } } while ($old_pid and $old_pid == $self->pid) { warning "old pid file ($old_pid) still exists"; sleep 1; } my $version = $self->{version}; my $mpm = $config->{mpm} || ""; $mpm = "($mpm MPM)" if $mpm; print "using $version $mpm\n"; my $timeout = $vars->{startup_timeout} || $ENV{APACHE_TEST_STARTUP_TIMEOUT} || 60; my $start_time = time; my $preamble = "${CTRL_M}waiting $timeout seconds for server to start: "; print $preamble unless COLOR; while (1) { my $delta = time - $start_time; print COLOR ? ($preamble, sprintf "%02d:%02d", (gmtime $delta)[1,0]) : '.'; sleep 1; if ($self->pid) { print $preamble, "ok (waited $delta secs)\n"; last; } elsif ($delta > $timeout) { my $suggestion = $timeout + 300; print $preamble, "not ok\n"; error <pid) { print "server $self->{name} started\n"; my $vh = $config->{vhosts}; my $by_port = sub { $vh->{$a}->{port} <=> $vh->{$b}->{port} }; for my $module (sort $by_port keys %$vh) { print "server $vh->{$module}->{name} listening ($module)\n", } if ($config->configure_proxy) { print "tests will be proxied through $vars->{proxy}\n"; } } else { $self->failed_msg("server failed to start!"); return 0; } return 1 if $self->wait_till_is_up($timeout); $self->failed_msg("failed to start server!"); return 0; } # wait till the server is up and return 1 # if the waiting times out returns 0 sub wait_till_is_up { my($self, $timeout) = @_; my $config = $self->{config}; my $sleep_interval = 1; # secs my $server_up = sub { local $SIG{__WARN__} = sub {}; #avoid "cannot connect ..." warnings # avoid fatal errors when LWP is not available return eval { my $r=Apache::TestRequest::GET('/index.html'); $r->code!=500 or $r->header('client-warning')!~/internal/i; } || 0; }; if ($server_up->()) { return 1; } my $start_time = time; my $preamble = "${CTRL_M}still waiting for server to warm up: "; print $preamble unless COLOR; while (1) { my $delta = time - $start_time; print COLOR ? ($preamble, sprintf "%02d:%02d", (gmtime $delta)[1,0]) : '.'; sleep $sleep_interval; if ($server_up->()) { print "${CTRL_M}the server is up (waited $delta secs) \n"; return 1; } elsif ($delta > $timeout) { print "${CTRL_M}the server is down, giving up after $delta secs\n"; return 0; } else { # continue } } } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestSmoke.pm0000644000177200010010000006452612540623176020407 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestSmoke; use strict; use warnings FATAL => 'all'; use Apache::Test (); use Apache::TestConfig (); use Apache::TestTrace; use Apache::TestHarness (); use Apache::TestRun (); # for core scan functions use Apache::TestSort; use Getopt::Long qw(GetOptions); use File::Spec::Functions qw(catfile); use FindBin; use POSIX (); use Symbol (); #use constant DEBUG => 1; # how many times to run all tests at the first iteration use constant DEFAULT_TIMES => 10; # if after this number of tries to reduce the number of tests fails we # give up on more tries use constant MAX_REDUCTION_TRIES => 50; my @num_opts = qw(times); my @string_opts = qw(order report); my @flag_opts = qw(help verbose bug_mode); my %order = map {$_ => 1} qw(random repeat); my %usage = ( 'times=N' => 'how many times to run the entire test suite' . ' (default: ' . DEFAULT_TIMES . ')', 'order=MODE' => 'modes: random, repeat' . ' (default: random)', 'report=FILENAME' => 'save report in a filename' . ' (default: smoke-report-.txt)', 'verbose[=1]' => 'verbose output' . ' (default: 0)', 'bug_mode' => 'bug report mode' . ' (default: 0)', ); sub new { my($class, @argv) = @_; my $self = bless { seen => {}, # seen sequences and tried them md5 hash results => {}, # final reduced sequences md5 hash smoking_completed => 0, tests => [], total_iterations => 0, total_reduction_attempts => 0, total_reduction_successes => 0, total_tests_run => 0, }, ref($class)||$class; $self->{test_config} = Apache::TestConfig->thaw; $self->getopts(\@argv); my $opts = $self->{opts}; chdir "$FindBin::Bin/.."; $self->{times} = $opts->{times} || DEFAULT_TIMES; $self->{order} = $opts->{order} || 'random'; $self->{verbose} = $opts->{verbose} || 0; $self->{run_iter} = $self->{times}; # this is like 'make test' but produces an output to be used in # the bug report if ($opts->{bug_mode}) { $self->{bug_mode} = 1; $self->{run_iter} = 1; $self->{times} = 1; $self->{verbose} = 1; $self->{order} = 'random'; $self->{trace} = 'debug'; } # specific tests end up in $self->{tests} and $self->{subtests}; # and get removed from $self->{argv} $self->Apache::TestRun::split_test_args(); my $test_opts = { verbose => $self->{verbose}, tests => $self->{tests}, order => $self->{order}, subtests => $self->{subtests} || [], }; @{ $self->{tests} } = $self->get_tests($test_opts); $self->{base_command} = "$^X $FindBin::Bin/TEST"; # options common to all $self->{base_command} .= " -verbose" if $self->{verbose}; # options specific to the startup $self->{start_command} = "$self->{base_command} -start"; $self->{start_command} .= " -trace=" . $self->{trace} if $self->{trace}; # options specific to the run $self->{run_command} = "$self->{base_command} -run"; # options specific to the stop $self->{stop_command} = "$self->{base_command} -stop"; $self; } sub getopts { my($self, $argv) = @_; my %opts; local *ARGV = $argv; # permute : optional values can come before the options # pass_through : all unknown things are to be left in @ARGV Getopt::Long::Configure(qw(pass_through permute)); # grab from @ARGV only the options that we expect GetOptions(\%opts, @flag_opts, (map "$_=s", @string_opts), (map "$_=i", @num_opts)); if (exists $opts{order} && !exists $order{$opts{order}}) { error "unknown -order mode: $opts{order}"; $self->opt_help(); exit; } if ($opts{help}) { $self->opt_help; exit; } # min $self->{opts} = \%opts; $self->{argv} = [@ARGV]; } # XXX: need proper sub-classing # from Apache::TestHarness sub skip { Apache::TestHarness::skip(@_); } sub prune { Apache::TestHarness::prune(@_); } sub get_tests { Apache::TestHarness::get_tests(@_);} sub install_sighandlers { my $self = shift; $SIG{INT} = sub { # make sure that there the server is down $self->kill_proc(); $self->report_finish; exit; }; } END { local $?; # preserve the exit status eval { Apache::TestRun->new(test_config => Apache::TestConfig->thaw)->scan_core; }; } sub run { my($self) = shift; $self->Apache::TestRun::warn_core(); local $SIG{INT}; $self->install_sighandlers; $self->report_start(); if ($self->{bug_mode}) { # 'make test', but useful for bug reports $self->run_bug_mode(); } else { # normal smoke my $iter = 0; while ($iter++ < $self->{run_iter}) { my $last = $self->run_iter($iter); last if $last; } } $self->{smoking_completed} = 1; $self->report_finish(); exit; } sub sep { my($char, $title) = @_; my $width = 60; if ($title) { my $side = int( ($width - length($title) - 2) / 2); my $pad = ($side+1) * 2 + length($title) < $width ? 1 : 0; return $char x $side . " $title " . $char x ($side+$pad); } else { return $char x $width; } } my %log_files = (); use constant FH => 0; use constant POS => 1; sub logs_init { my($self, @log_files) = @_; for my $path (@log_files) { my $fh = Symbol::gensym(); open $fh, "<$path" or die "Can't open $path: $!"; seek $fh, 0, POSIX::SEEK_END(); $log_files{$path}[FH] = $fh; $log_files{$path}[POS] = tell $fh; } } sub logs_end { for my $path (keys %log_files) { close $log_files{$path}[FH]; } } sub log_diff { my($self, $path) = @_; my $log = $log_files{$path}; die "no such log file: $path" unless $log; my $fh = $log->[FH]; # no checkpoints were made yet? unless (defined $log->[POS]) { seek $fh, 0, POSIX::SEEK_END(); $log->[POS] = tell $fh; return ''; } seek $fh, $log->[POS], POSIX::SEEK_SET(); # not really needed local $/; # slurp mode my $diff = <$fh>; seek $fh, 0, POSIX::SEEK_END(); # not really needed $log->[POS] = tell $fh; return $diff || ''; } # this is a special mode, which really just runs 't/TEST -start; # t/TEST -run; t/TEST -stop;' but it runs '-run' separately for each # test, and checks whether anything bad has happened after the run # of each test (i.e. either a test has failed, or a test may be successful, # but server may have dumped a core file, we detect that). sub run_bug_mode { my($self) = @_; my $iter = 0; warning "running t/TEST in the bug report mode"; my $reduce_iter = 0; my @good = (); # first time run all tests, or all specified tests my @tests = @{ $self->{tests} }; # copy my $bad = $self->run_test($iter, $reduce_iter, \@tests, \@good); $self->{total_iterations}++; } # returns true if for some reason no more iterations should be made sub run_iter { my($self, $iter) = @_; my $stop_now = 0; my $reduce_iter = 0; my @good = (); warning "\n" . sep("-"); warning sprintf "[%03d-%02d-%02d] running all tests", $iter, $reduce_iter, $self->{times}; # first time run all tests, or all specified tests my @tests = @{ $self->{tests} }; # copy # hack to ensure a new random seed is generated Apache::TestSort->run(\@tests, $self); my $bad = $self->run_test($iter, $reduce_iter, \@tests, \@good); unless ($bad) { $self->{total_iterations}++; return $stop_now; } error "recorded a positive failure ('$bad'), " . "will try to minimize the input now"; my $command = $self->{base_command}; # does the test fail on its own { $reduce_iter++; warning sprintf "[%03d-%02d-%02d] trying '$bad' on its own", $iter, $reduce_iter, 1; my @good = (); my @tests = ($bad); my $bad = $self->run_test($iter, $reduce_iter, \@tests, \@good); # if a test is failing on its own there is no point to # continue looking for other sequences if ($bad) { $stop_now = 1; $self->{total_iterations}++; unless ($self->sequence_seen($self->{results}, [@good, $bad])) { $self->report_success($iter, $reduce_iter, "$command $bad", 1); } return $stop_now; } } # positive failure my $ok_tests = @good; my $reduction_success = 0; my $done = 0; while (@good > 1) { my $tries = 0; my $reduce_sub = $self->reduce_stream(\@good); $reduce_iter++; while ($tries++ < MAX_REDUCTION_TRIES) { $self->{total_reduction_attempts}++; my @try = @{ $reduce_sub->() }; # reduction stream is empty (tried all?) unless (@try) { $done = 1; last; } warning sprintf "\n[%03d-%02d-%02d] trying %d tests", $iter, $reduce_iter, $tries, scalar(@try); my @ok = (); my @tests = (@try, $bad); my $new_bad = $self->run_test($iter, $reduce_iter, \@tests, \@ok); if ($new_bad) { # successful reduction $reduction_success++; @good = @ok; $tries = 0; my $num = @ok; error "*** reduction $reduce_iter succeeded ($num tests) ***"; $self->{total_reduction_successes}++; $self->log_successful_reduction($iter, \@ok); last; } } # last round of reducing has failed, so we give up if ($done || $tries >= MAX_REDUCTION_TRIES){ error "no further reductions were made"; $done = 1; last; } } # we have a minimal failure sequence at this point (to the extend # of success of our attempts to reduce) # report the sequence if we didn't see such one yet in the # previous iterations unless ($self->sequence_seen($self->{results}, [@good, $bad])) { # if no reduction succeeded, it's 0 $reduce_iter = 0 unless $reduction_success; $self->report_success($iter, $reduce_iter, "$command @good $bad", @good + 1); } $self->{total_iterations}++; return $stop_now; } # my $sub = $self->reduce_stream(\@items); sub reduce_stream { my($self) = shift; my @items = @{+shift}; my $items = @items; my $odd = $items % 2 ? 1 : 0; my $middle = int($items/2) - 1; my $c = 0; return sub { $c++; # remember stream's state # a single item is not reduce-able return \@items if $items == 1; my @try = (); my $max_repeat_tries = 50; # avoid seen sequences my $repeat = 0; while ($repeat++ <= $max_repeat_tries) { # try to use a binary search if ($c == 1) { # right half @try = @items[($middle+1)..($items-1)]; } elsif ($c == 2) { # left half @try = @items[0..$middle]; } # try to use a random window size alg else { my $left = int rand($items); $left = $items - 1 if $left == $items - 1; my $right = $left + int rand($items - $left); $right = $items - 1 if $right >= $items; @try = @items[$left..$right]; } if ($self->sequence_seen($self->{seen}, \@try)) { @try = (); } else { last; # found an unseen sequence } } return \@try; } } sub sequence_seen { my ($self, $rh_store, $ra_tests) = @_; require Digest::MD5; my $digest = Digest::MD5::md5_hex(join '', @$ra_tests); #error $self->{seen}; return $rh_store->{$digest}++ ? 1 : 0 } sub run_test { require IPC::Run3; my($self, $iter, $count, $tests, $ra_ok) = @_; my $bad = ''; my $ra_nok = []; #warning "$self->{base_command} @$tests"; #$SIG{PIPE} = 'IGNORE'; $SIG{PIPE} = sub { die "pipe broke" }; # start server { my $command = $self->{start_command}; my $log = ''; IPC::Run3::run3($command, undef, \$log, \$log); my $started_ok = ($log =~ /started/) ? 1 : 0; unless ($started_ok) { error "failed to start server\n $log"; exit 1; } } my $t_logs = $self->{test_config}->{vars}->{t_logs}; my @log_files = map { catfile $t_logs, $_ } qw(error_log access_log); $self->logs_init(@log_files); # run tests { my $command = $self->{run_command}; my $max_len = 1; for my $test (@$tests) { $max_len = length $test if length $test > $max_len; } for my $test (@$tests) { (my $test_name = $test) =~ s/\.t$//; my $fill = "." x ($max_len - length $test_name); $self->{total_tests_run}++; my $test_command = "$command $test"; my $log = ''; IPC::Run3::run3($test_command, undef, \$log, \$log); my $ok = ($log =~ /All tests successful|NOTESTS/) ? 1 : 0; my @core_files_msg = $self->Apache::TestRun::scan_core_incremental(1); # if the test has caused core file(s) it's not ok $ok = 0 if @core_files_msg; if ($ok == 1) { push @$ra_ok, $test; if ($self->{verbose}) { if ($log =~ m/NOTESTS/) { print STDERR "$test_name${fill}skipped\n"; } else { print STDERR "$test_name${fill}ok\n"; } } # need to run log_diff to reset the position of the fh my %log_diffs = map { $_ => $self->log_diff($_) } @log_files; } elsif ($ok == 0) { push @$ra_nok, $test; $bad = $test; if ($self->{verbose}) { print STDERR "$test_name${fill}FAILED\n"; error sep("-"); # give server some time to finish the # logging. it's ok to wait long time since we have # to deal with an error sleep 5; my %log_diffs = map { $_ => $self->log_diff($_) } @log_files; # client log error "\t\t*** run log ***"; $log =~ s/^/ /mg; print STDERR "$log\n"; # server logs for my $path (@log_files) { next unless length $log_diffs{$path}; error "\t\t*** $path ***"; $log_diffs{$path} =~ s/^/ /mg; print STDERR "$log_diffs{$path}\n"; } } if (@core_files_msg) { unless ($self->{verbose}) { # currently the output of 'run log' already # includes the information about core files once # Test::Harness::Straps allows us to run callbacks # after each test, and we move back to run all # tests at once, we will log the message here error "$test_name caused core"; print STDERR join "\n", @core_files_msg, "\n"; } } if ($self->{verbose}) { error sep("-"); } unless ($self->{bug_mode}) { # normal smoke stop the run, but in the bug_mode # we want to complete all the tests last; } } } } $self->logs_end(); # stop server $self->kill_proc(); if ($self->{bug_mode}) { warning sep("-"); if (@$ra_nok == 0) { printf STDERR "All tests successful (%d)\n", scalar @$ra_ok; } else { error sprintf "error running %d tests out of %d\n", scalar(@$ra_nok), scalar @$ra_ok + @$ra_nok; } } else { return $bad; } } sub report_start { my($self) = shift; my $time = scalar localtime; $self->{start_time} = $time; $time =~ s/\s/_/g; $time =~ s/:/-/g; # winFU my $file = $self->{opts}->{report} || catfile Apache::Test::vars('top_dir'), "smoke-report-$time.txt"; $self->{runtime}->{report} = $file; info "Report file: $file"; open my $fh, ">$file" or die "cannot open $file for writing: $!"; $self->{fh} = $fh; my $sep = sep("-"); my $title = sep('=', "Special Tests Sequence Failure Finder Report"); print $fh <{base_command} @{$self->{tests}} $sep EOM } sub report_success { my($self, $iter, $reduce_iter, $sequence, $tests) = @_; my @report = ("iteration $iter ($tests tests):\n", "\t$sequence\n", "(made $reduce_iter successful reductions)\n\n"); print @report; if (my $fh = $self->{fh}) { print $fh @report; } } sub report_finish { my($self) = @_; my $start_time = $self->{start_time}; my $end_time = scalar localtime; if (my $fh = delete $self->{fh}) { my $failures = scalar keys %{ $self->{results} }; my $sep = sep("-"); my $cfg_as_string = $self->build_config_as_string; my $unique_seqs = scalar keys %{ $self->{results} }; my $attempts = $self->{total_reduction_attempts}; my $successes = $self->{total_reduction_successes}; my $completion = $self->{smoking_completed} ? "Completed" : "Not Completed (aborted by user)"; my $status = "Unknown"; if ($self->{total_iterations} > 0) { if ($failures) { $status = "*** NOT OK ***"; } else { $status = "+++ OK +++"; } } my $title = sep('=', "Summary"); my $iter_made = sprintf "Iterations (%s) made : %d", $self->{order}, $self->{total_iterations}; print $fh <{total_tests_run} $iter_made EOM if ($attempts > 0 && $failures) { my $reduction_stats = sprintf "%d/%d (%d%% success)", $attempts, $successes, $successes / $attempts * 100; print $fh <{runtime}->{report} . ".$iter.temp"; debug "saving in $file"; open my $fh, ">$file" or die "cannot open $file for writing: $!"; print $fh join " ", @$tests; close $fh; } sub build_config_as_string { Apache::TestConfig::as_string(); } sub kill_proc { my($self) = @_; my $command = $self->{stop_command}; my $log = ''; require IPC::Run3; IPC::Run3::run3($command, undef, \$log, \$log); my $stopped_ok = ($log =~ /shutdown/) ? 1 : 0; unless ($stopped_ok) { error "failed to stop server\n $log"; } } sub opt_help { my $self = shift; print <import; } }", Apache::TestConfig->perlscript_header, "use $class;", "$class->new(\@ARGV)->run;"; Apache::Test::basic_config()->write_perlscript($file, $content); } 1; __END__ =head1 NAME Apache::TestSmoke - Special Tests Sequence Failure Finder =head1 SYNOPSIS # get the usage and the default values % t/SMOKE -help # repeat all tests 5 times and save the report into # the file 'myreport' % t/SMOKE -times=5 -report=myreport # run all tests default number of iterations, and repeat tests # default number of times % t/SMOKE # same as above but work only the specified tests % t/SMOKE foo/bar foo/tar # run once a sequence of tests in a non-random mode # e.g. when trying to reduce a known long sequence that fails % t/SMOKE -order=rotate -times=1 foo/bar foo/tar # show me each currently running test # it's not the same as running the tests in the verbose mode % t/SMOKE -verbose # run t/TEST, but show any problems after *each* tests is run # useful for bug reports (it actually runs t/TEST -start, then # t/TEST -run for each test separately and finally t/TEST -stop % t/SMOKE -bug_mode # now read the created report file =head1 DESCRIPTION =head2 The Problem When we try to test a stateless machine (i.e. all tests are independent), running all tests once ensures that all tested things properly work. However when a state machine is tested (i.e. where a run of one test may influence another test) it's not enough to run all the tests once to know that the tested features actually work. It's quite possible that if the same tests are run in a different order and/or repeated a few times, some tests may fail. This usually happens when some tests don't restore the system under test to its pristine state at the end of the run, which may influence other tests which rely on the fact that they start on pristine state, when in fact it's not true anymore. In fact it's possible that a single test may fail when run twice or three times in a sequence. =head2 The Solution To reduce the possibility of such dependency errors, it's helpful to run random testing repeated many times with many different srand seeds. Of course if no failures get spotted that doesn't mean that there are no tests inter-dependencies, which may cause a failure in production. But random testing definitely helps to spot many problems and can give better test coverage. =head2 Resolving Sequence Problems When this kind of testing is used and a failure is detected there are two problems: =over =item 1 First is to be able to reproduce the problem so if we think we fixed it, we could verify the fix. This one is easy, just remember the sequence of tests run till the failed test and rerun the same sequence once again after the problem has been fixed. =item 2 Second is to be able to understand the cause of the problem. If during the random test the failure has happened after running 400 tests, how can we possibly know which previously running tests has caused to the failure of the test 401. Chances are that most of the tests were clean and don't have inter-dependency problem. Therefore it'd be very helpful if we could reduce the long sequence to a minimum. Preferably 1 or 2 tests. That's when we can try to understand the cause of the detected problem. =back This utility attempts to solve both problems, and at the end of each iteration print a minimal sequence of tests causing to a failure. This doesn't always succeed, but works in many cases. This utility: =over =item 1 Runs the tests randomly until the first failure is detected. Or non-randomly if the option I<-order> is set to I or I. =item 2 Then it tries to reduce that sequence of tests to a minimum, and this sequence still causes to the same failure. =item 3 (XXX: todo): then it reruns the minimal sequence in the verbose mode and saves the output. =item 4 It reports all the successful reductions as it goes to STDOUT and report file of the format: smoke-report-.txt. In addition the systems build parameters are logged into the report file, so the detected problems could be reproduced. =item 5 Goto 1 and run again using a new random seed, which potentially should detect different failures. =back =head1 Reduction Algorithm Currently for each reduction path, the following reduction algorithms get applied: =over =item 1 Binary search: first try the upper half then the lower. =item 2 Random window: randomize the left item, then the right item and return the items between these two points. =back =head1 t/SMOKE.PL I is driving this module, if you don't have it, create it: #!perl use strict; use warnings FATAL => 'all'; use FindBin; use lib "$FindBin::Bin/../Apache-Test/lib"; use lib "$FindBin::Bin/../lib"; use Apache::TestSmoke (); Apache::TestSmoke->new(@ARGV)->run; usually I converts it into I while adjusting the perl path, but you create I in first place as well. =head1 AUTHOR Stas Bekman =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestSmokePerl.pm0000644000177200010010000000212112540623176021211 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestSmokePerl; use strict; use warnings FATAL => 'all'; use Apache::TestSmoke (); use ModPerl::Config (); # a subclass of Apache::TestSmoke that configures mod_perlish things use vars qw(@ISA); @ISA = qw(Apache::TestSmoke); sub build_config_as_string { ModPerl::Config::as_string(); } 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestSort.pm0000644000177200010010000000371412540623176020250 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestSort; use strict; use warnings FATAL => 'all'; use Apache::TestTrace; sub repeat { my($list) = @_; return @{$list}; } sub random { my($list) = @_; my $seed = $ENV{APACHE_TEST_SEED} || ''; my $info = ""; if ($seed) { $info = " (user defined)"; # so we could reproduce the order } else { $info = " (autogenerated)"; $seed = time ^ ($$ + ($$ << 15)); } warning "Using random number seed: $seed" . $info; srand($seed); #from perlfaq4.pod for (my $i = @$list; --$i; ) { my $j = int rand($i+1); next if $i == $j; @$list[$i,$j] = @$list[$j,$i]; } } sub run { my($self, $list, $args) = @_; my $order = $args->{order} || 'repeat'; if ($order =~ /^\d+$/) { #dont want an explicit -seed option but env var can be a pain #so if -order is number assume it is the random seed $ENV{APACHE_TEST_SEED} = $order; $order = 'random'; } my $sort = \&{$order}; # re-shuffle the list according to the requested order if (defined &$sort) { $sort->($list); } else { error "unknown order '$order'"; } } 1; mod_perl-2.0.9/Apache-Test/lib/Apache/TestSSLCA.pm0000644000104000010010000003020412540623176022061 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestSSLCA; use strict; use warnings FATAL => 'all'; use Cwd (); use DirHandle (); use File::Path (); use File::Copy 'cp'; use File::Basename; use Apache::TestConfig (); use Apache::TestTrace; use constant SSLCA_DB => 'index.txt'; use vars qw(@EXPORT_OK &import); use subs qw(symlink); @EXPORT_OK = qw(dn dn_vars dn_oneline); *import = \&Exporter::import; my $openssl = $ENV{APACHE_TEST_OPENSSL_CMD} || 'openssl'; my $version = version(); my $CA = 'asf'; my $Config; #global Apache::TestConfig object my $days = '-days 365'; my $cakey = 'keys/ca.pem'; my $cacert = 'certs/ca.crt'; my $capolicy = '-policy policy_anything'; my $cacrl = 'crl/ca-bundle.crl'; #we use the same password for everything my $pass = 'httpd'; my $passin = "-passin pass:$pass"; my $passout = "-passout pass:$pass"; # in 0.9.7 s/Email/emailAddress/ in DN my $email_field = Apache::Test::normalize_vstring($version) < Apache::Test::normalize_vstring("0.9.7") ? "Email" : "emailAddress"; my $ca_dn = { asf => { C => 'US', ST => 'California', L => 'San Francisco', O => 'ASF', OU => 'httpd-test', CN => '', $email_field => 'test-dev@httpd.apache.org', }, }; my $cert_dn = { client_snakeoil => { C => 'AU', ST => 'Queensland', L => 'Mackay', O => 'Snake Oil, Ltd.', OU => 'Staff', }, client_ok => { }, client_revoked => { }, server => { CN => 'localhost', OU => 'httpd-test/rsa-test', }, server2 => { CN => 'localhost', OU => 'httpd-test/rsa-test-2', }, server_des3 => { CN => 'localhost', OU => 'httpd-test/rsa-des3-test', }, server2_des3 => { CN => 'localhost', OU => 'httpd-test/rsa-des3-test-2', }, }; #generate DSA versions of the server certs/keys for my $key (keys %$cert_dn) { next unless $key =~ /^server/; my $val = $$cert_dn{$key}; my $name = join '_', $key, 'dsa'; $cert_dn->{$name} = { %$val }; #copy $cert_dn->{$name}->{OU} =~ s/rsa/dsa/; } sub ca_dn { $ca_dn = shift if @_; $ca_dn; } sub cert_dn { $cert_dn = shift if @_; $cert_dn; } sub dn { my $name = shift; my %dn = %{ $ca_dn->{$CA} }; #default values $dn{CN} ||= $name; #try make sure each Common Name is different my $default_dn = $cert_dn->{$name}; if ($default_dn) { while (my($key, $value) = each %$default_dn) { #override values $dn{$key} = $value; } } return wantarray ? %dn : \%dn; } sub dn_vars { my($name, $type) = @_; my $dn = dn($name); my $prefix = join '_', 'SSL', $type, 'DN'; return { map { $prefix ."_$_", $dn->{$_} } keys %$dn }; } sub dn_oneline { my($dn, $rfc2253) = @_; unless (ref $dn) { $dn = dn($dn); } my $string = ""; my @parts = (qw(C ST L O OU CN), $email_field); @parts = reverse @parts if $rfc2253; for my $k (@parts) { next unless $dn->{$k}; if ($rfc2253) { my $tmp = $dn->{$k}; $tmp =~ s{([,+"\\<>;])}{\\$1}g; $tmp =~ s{^([ #])}{\\$1}; $tmp =~ s{ $}{\\ }; $string .= "," if $string; $string .= "$k=$tmp"; } else { $string .= "/$k=$dn->{$k}"; } } $string; } sub openssl { return $openssl unless @_; my $cmd = "$openssl @_"; info $cmd; unless (system($cmd) == 0) { my $status = $? >> 8; die "system @_ failed (exit status=$status)"; } } my @dirs = qw(keys newcerts certs crl export csr conf proxy); sub init { for my $dir (@dirs) { gendir($dir); } } sub config_file { my $name = shift; my $file = "conf/$name.cnf"; return $file if -e $file; my $dn = dn($name); my $db = sslca_db($name); writefile($db, '', 1); writefile($file, <{C} ST = $dn->{ST} L = $dn->{L} O = $dn->{O} OU = $dn->{OU} CN = $dn->{CN} emailAddress = $dn->{$email_field} [ req_attributes ] challengePassword = $pass [ ca ] default_ca = CA_default [ CA_default ] certs = certs # Where the issued certs are kept new_certs_dir = newcerts # default place for new certs. crl_dir = crl # Where the issued crl are kept database = $db # database index file. serial = serial # The current serial number certificate = $cacert # The CA certificate crl = $cacrl # The current CRL private_key = $cakey # The private key default_days = 365 # how long to certify for default_crl_days = 365 # how long before next CRL default_md = sha1 # which md to use. preserve = no # keep passed DN ordering [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ comment ] nsComment = This Is A Comment 1.3.6.1.4.1.18060.12.0 = DER:0c064c656d6f6e73 EOF return $file; } sub config { my $name = shift; my $file = config_file($name); my $config = "-config $file"; $config; } use constant PASSWORD_CLEARTEXT => Apache::TestConfig::WIN32 || Apache::TestConfig::NETWARE; #http://www.modssl.org/docs/2.8/ssl_reference.html#ToC21 my $basic_auth_password = PASSWORD_CLEARTEXT ? 'password': 'xxj31ZMTZzkVA'; my $digest_auth_hash = '$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/'; sub new_ca { writefile('serial', "01\n", 1); writefile('ssl.htpasswd', join ':', dn_oneline('client_snakeoil'), $basic_auth_password); openssl req => "-new -x509 -keyout $cakey -out $cacert $days", config('ca'); export_cert('ca'); #useful for importing into IE } sub new_key { my $name = shift; my $encrypt = @_ ? "@_ $passout" : ""; my $out = "-out keys/$name.pem $encrypt"; if ($name =~ /dsa/) { #this takes a long time so just do it once #don't do this in real life unless (-e 'dsa-param') { openssl dsaparam => '-inform PEM -out dsa-param 1024'; } openssl gendsa => "dsa-param $out"; } else { openssl genrsa => "$out 1024"; } } sub new_cert { my $name = shift; openssl req => "-new -key keys/$name.pem -out csr/$name.csr", $passin, $passout, config($name); sign_cert($name); export_cert($name); } sub sign_cert { my $name = shift; my $exts = ''; $exts = ' -extensions comment' if $name =~ /client_ok/; openssl ca => "$capolicy -in csr/$name.csr -out certs/$name.crt", $passin, config($name), '-batch', $exts; } #handy for importing into a browser such as netscape sub export_cert { my $name = shift; return if $name =~ /^server/; #no point in exporting server certs openssl pkcs12 => "-export -in certs/$name.crt -inkey keys/$name.pem", "-out export/$name.p12", $passin, $passout; } sub sslca_db { my $name = shift; return "$name-" . SSLCA_DB; } sub revoke_cert { my $name = shift; my @args = (config('cacrl'), $passin); #revokes in the SSLCA_DB database openssl ca => "-revoke certs/$name.crt", @args; my $db = sslca_db($name); unless (-e $db) { #hack required for win32 my $new = join '.', $db, 'new'; if (-e $new) { cp $new, $db; } } #generates crl from the index.txt database openssl ca => "-gencrl -out $cacrl", @args; } sub symlink { my($file, $symlink) = @_; my $what = 'linked'; if (Apache::TestConfig::WINFU) { cp $file, $symlink; $what = 'copied'; } else { CORE::symlink($file, $symlink); } info "$what $file to $symlink"; } sub hash_certs { my($type, $dir) = @_; chdir $dir; my $dh = DirHandle->new('.') or die "opendir $dir: $!"; my $n = 0; for my $file ($dh->read) { next unless $file =~ /\.cr[tl]$/; chomp(my $hash = `openssl $type -noout -hash < $file`); next unless $hash; my $symlink = "$hash.r$n"; $n++; symlink $file, $symlink; } close $dh; chdir $CA; } sub make_proxy_cert { my $name = shift; my $from = "certs/$name.crt"; my $to = "proxy/$name.pem"; info "generating proxy cert: $to"; my $fh_to = Symbol::gensym(); my $fh_from = Symbol::gensym(); open $fh_to, ">$to" or die "open $to: $!"; open $fh_from, $from or die "open $from: $!"; cp $fh_from, $fh_to; $from = "keys/$name.pem"; open $fh_from, $from or die "open $from: $!"; cp $fh_from, $fh_to; close $fh_from; close $fh_to; } sub setup { $CA = shift; unless ($ca_dn->{$CA}) { die "unknown CA $CA"; } gendir($CA); chdir $CA; init(); new_ca(); my @names = keys %$cert_dn; for my $name (@names) { my @key_args = (); if ($name =~ /_des3/) { push @key_args, '-des3'; } new_key($name, @key_args); new_cert($name); if ($name =~ /_revoked$/) { revoke_cert($name); } if ($name =~ /^client_/) { make_proxy_cert($name); } } hash_certs(crl => 'crl'); } sub generate { $Config = shift; $CA = shift || $Config->{vars}->{sslcaorg}; my $root = $Config->{vars}->{sslca}; return if -d $root; my $pwd = Cwd::cwd(); my $base = dirname $root; my $dir = basename $root; chdir $base; # Ensure the CNs used in the server certs match up with the # hostname being used for testing. while (my($key, $val) = each %$cert_dn) { next unless $key =~ /^server/; $val->{CN} = $Config->{vars}->{servername}; } #make a note that we created the tree $Config->clean_add_path($root); gendir($dir); chdir $dir; warning "generating SSL CA for $CA"; setup($CA); chdir $pwd; } sub clean { my $config = shift; #rel2abs adds same drive letter for win32 that clean_add_path added my $dir = File::Spec->rel2abs($config->{vars}->{sslca}); unless ($config->{clean}->{dirs}->{$dir}) { return; #we did not generate this ca } unless ($config->{clean_level} > 1) { #skip t/TEST -conf warning "skipping regeneration of SSL CA; run t/TEST -clean to force"; return; } File::Path::rmtree([$dir], 1, 1); } #not using Apache::TestConfig methods because the openssl commands #will generate heaps of files we cannot keep track of sub writefile { my($file, $content) = @_; my $fh = Symbol::gensym(); open $fh, ">$file" or die "open $file: $!"; print $fh $content; close $fh; } sub gendir { my($dir) = @_; return if -d $dir; mkdir $dir, 0755; } sub version { my $version = qx($openssl version); return $1 if $version =~ /^OpenSSL (\S+) /; return 0; } 1; __END__ mod_perl-2.0.9/Apache-Test/lib/Apache/TestTrace.pm0000644000177200010010000001715412540623176020362 0ustar SteveNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestTrace; use strict; use warnings FATAL => 'all'; use Exporter (); use vars qw(@Levels @Utils @Level_subs @Util_subs @ISA @EXPORT $VERSION $Level $LogFH); BEGIN { @Levels = qw(emerg alert crit error warning notice info debug); @Utils = qw(todo); @Level_subs = map {($_, "${_}_mark", "${_}_sub")} (@Levels); @Util_subs = map {($_, "${_}_mark", "${_}_sub")} (@Utils); } @ISA = qw(Exporter); @EXPORT = (@Level_subs); $VERSION = '0.01'; use subs (@Level_subs, @Util_subs); # default settings overrideable by users $Level = undef; $LogFH = \*STDERR; # private data use constant COLOR => ($ENV{APACHE_TEST_COLOR} && -t STDOUT) ? 1 : 0; use constant HAS_COLOR => eval { #XXX: another way to color WINFU terms? !(grep { $^O eq $_ } qw(MSWin32 cygwin NetWare)) and COLOR and require Term::ANSIColor; }; use constant HAS_DUMPER => eval { require Data::Dumper; }; # emerg => 1, alert => 2, crit => 3, ... my %levels; @levels{@Levels} = 1..@Levels; $levels{todo} = $levels{debug}; my $default_level = 'info'; # to prevent user typos my %colors = (); if (HAS_COLOR) { %colors = ( emerg => 'bold white on_blue', alert => 'bold blue on_yellow', crit => 'reverse', error => 'bold red', warning => 'yellow', notice => 'green', info => 'cyan', debug => 'magenta', reset => 'reset', todo => 'underline', ); $Term::ANSIColor::AUTORESET = 1; for (keys %colors) { $colors{$_} = Term::ANSIColor::color($colors{$_}); } } *expand = HAS_DUMPER ? sub { map { ref $_ ? Data::Dumper::Dumper($_) : $_ } @_ } : sub { @_ }; sub prefix { my $prefix = shift; if ($prefix eq 'mark') { return join(":", (caller(3))[1..2]) . " : "; } elsif ($prefix eq 'sub') { return (caller(3))[3] . " : "; } else { return ''; } } sub c_trace { my ($level, $prefix_type) = (shift, shift); my $prefix = prefix($prefix_type); print $LogFH map { "$colors{$level}$prefix$_$colors{reset}\n"} grep defined($_), expand(@_); } sub nc_trace { my ($level, $prefix_type) = (shift, shift); my $prefix = prefix($prefix_type); print $LogFH map { sprintf "[%7s] %s%s\n", $level, $prefix, $_ } grep defined($_), expand(@_); } { my $trace = HAS_COLOR ? \&c_trace : \&nc_trace; my @prefices = ('', 'mark', 'sub'); # if the level is sufficiently high, enable the tracing for a # given level otherwise assign NOP for my $level (@Levels, @Utils) { no strict 'refs'; for my $prefix (@prefices) { my $func = $prefix ? "${level}_$prefix" : $level; *$func = sub { $trace->($level, $prefix, @_) if trace_level() >= $levels{$level}; }; } } } sub trace_level { # overriden by user/-trace (defined $Level && $levels{$Level}) || # or overriden by env var (exists $ENV{APACHE_TEST_TRACE_LEVEL} && $levels{$ENV{APACHE_TEST_TRACE_LEVEL}}) || # or default $levels{$default_level}; } 1; __END__ =head1 NAME Apache::TestTrace - Helper output generation functions =head1 SYNOPSIS use Apache::TestTrace; debug "foo bar"; info_sub "missed it"; error_mark "something is wrong"; # test sub that exercises all the tracing functions sub test { print $Apache::TestTrace::LogFH "TraceLevel: $Apache::TestTrace::Level\n"; $_->($_,[1..3],$_) for qw(emerg alert crit error warning notice info debug todo); print $Apache::TestTrace::LogFH "\n\n" }; # demo the trace subs using default setting test(); { # override the default trace level with 'crit' local $Apache::TestTrace::Level = 'crit'; # now only 'crit' and higher levels will do tracing lower level test(); } { # set the trace level to 'debug' local $Apache::TestTrace::Level = 'debug'; # now only 'debug' and higher levels will do tracing lower level test(); } { open OUT, ">/tmp/foo" or die $!; # override the default Log filehandle local $Apache::TestTrace::LogFH = \*OUT; # now the traces will go into a new filehandle test(); close OUT; } # override tracing level via -trace opt % t/TEST -trace=debug # override tracing level via env var % env APACHE_TEST_TRACE_LEVEL=debug t/TEST =head1 DESCRIPTION This module exports a number of functions that make it easier generating various diagnostics messages in your programs in a consistent way and saves some keystrokes as it handles the new lines and sends the messages to STDERR for you. This module provides the same trace methods as syslog(3)'s log levels. Listed from low level to high level: emerg(), alert(), crit(), error(), warning(), notice(), info(), debug(). The only different function is warning(), since warn is already taken by Perl. The module provides another trace function called todo() which is useful for todo items. It has the same level as I (the highest). There are two more variants of each of these functions. If the I<_mark> suffix is appended (e.g., I) the trace will start with the filename and the line number the function was called from. If the I<_sub> suffix is appended (e.g., I) the trace will start with the name of the subroutine the function was called from. If you have C installed the diagnostic messages will be colorized, otherwise a special for each function prefix will be used. If C is installed and you pass a reference to a variable to any of these functions, the variable will be dumped with C. Functions whose level is above the level set in C<$Apache::TestTrace::Level> become NOPs. For example if the level is set to I, only alert() and emerg() functions will generate the output. The default setting of this variable is I. Other valid values are: I, I, I, I, I, I, I, I. Another way to affect the trace level is to set C<$ENV{APACHE_TEST_TRACE_LEVEL}>, which takes effect if C<$Apache::TestTrace::Level> is not set. So an explicit setting of C<$Apache::TestTrace::Level> always takes precedence. By default all the output generated by these functions goes to STDERR. You can override the default filehandler by overriding C<$Apache::TestTrace::LogFH> with a new filehandler. When you override this package's global variables, think about localizing your local settings, so it won't affect other modules using this module in the same run. =head1 TODO o provide an option to disable the coloring altogether via some flag or import() =head1 AUTHOR Stas Bekman with contributions from Doug MacEachern =cut mod_perl-2.0.9/Apache-Test/lib/Apache/TestUtil.pm0000644000104000010010000007050012540623176022134 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache::TestUtil; use strict; use warnings FATAL => 'all'; use File::Find (); use File::Path (); use Exporter (); use Carp (); use Config; use File::Basename qw(dirname); use File::Spec::Functions qw(catfile catdir file_name_is_absolute tmpdir); use Symbol (); use Fcntl qw(SEEK_END); use Apache::Test (); use Apache::TestConfig (); use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %CLEAN); $VERSION = '0.02'; @ISA = qw(Exporter); @EXPORT = qw(t_cmp t_debug t_append_file t_write_file t_open_file t_mkdir t_rmtree t_is_equal t_filepath_cmp t_write_test_lib t_server_log_error_is_expected t_server_log_warn_is_expected t_client_log_error_is_expected t_client_log_warn_is_expected ); @EXPORT_OK = qw(t_write_perl_script t_write_shell_script t_chown t_catfile_apache t_catfile t_file_watch_for t_start_error_log_watch t_finish_error_log_watch t_start_file_watch t_read_file_watch t_finish_file_watch); %CLEAN = (); $Apache::TestUtil::DEBUG_OUTPUT = \*STDOUT; # 5.005's Data::Dumper has problems to dump certain datastructures use constant HAS_DUMPER => eval { $] >= 5.006 && require Data::Dumper; }; use constant INDENT => 4; { my %files; sub t_start_file_watch (;$) { my $name = defined $_[0] ? $_[0] : 'error_log'; $name = File::Spec->catfile(Apache::Test::vars->{t_logs}, $name) unless (File::Spec->file_name_is_absolute($name)); if (open my $fh, '<', $name) { seek $fh, 0, SEEK_END; $files{$name} = $fh; } else { delete $files{$name}; } return; } sub t_finish_file_watch (;$) { my $name = defined $_[0] ? $_[0] : 'error_log'; $name = File::Spec->catfile(Apache::Test::vars->{t_logs}, $name) unless (File::Spec->file_name_is_absolute($name)); my $fh = delete $files{$name}; unless (defined $fh) { open $fh, '<', $name or return; return readline $fh; } return readline $fh; } sub t_read_file_watch (;$) { my $name = defined $_[0] ? $_[0] : 'error_log'; $name = File::Spec->catfile(Apache::Test::vars->{t_logs}, $name) unless (File::Spec->file_name_is_absolute($name)); my $fh = $files{$name}; unless (defined $fh) { open $fh, '<', $name or return; $files{$name} = $fh; } return readline $fh; } sub t_file_watch_for ($$$) { my ($name, $re, $timeout) = @_; local $/ = "\n"; $re = qr/$re/ unless ref $re; $timeout *= 10; my $buf = ''; my @acc; while ($timeout >= 0) { my $line = t_read_file_watch $name; unless (defined $line) { # EOF select undef, undef, undef, 0.1; $timeout--; next; } $buf .= $line; next unless $buf =~ /\n$/; # incomplete line # found a complete line $line = $buf; $buf = ''; push @acc, $line; return wantarray ? @acc : $line if $line =~ $re; } return; } sub t_start_error_log_watch { t_start_file_watch; } sub t_finish_error_log_watch { local $/ = "\n"; return my @lines = t_finish_file_watch; } } # because of the prototype and recursive call to itself a forward # declaration is needed sub t_is_equal ($$); # compare any two datastructures (must pass references for non-scalars) # undef()'s are valid args sub t_is_equal ($$) { my ($a, $b) = @_; return 0 unless @_ == 2; # this was added in Apache::Test::VERSION 1.12 - remove deprecated # logic sometime around 1.15 or mid September, 2004. if (UNIVERSAL::isa($a, 'Regexp')) { my @warning = ("WARNING!!! t_is_equal() argument order has changed.", "use of a regular expression as the first argument", "is deprecated. support will be removed soon."); t_debug(@warning); ($a, $b) = ($b, $a); } if (defined $a && defined $b) { my $ref_a = ref $a; my $ref_b = ref $b; if (!$ref_a && !$ref_b) { return $a eq $b; } elsif ($ref_a eq 'ARRAY' && $ref_b eq 'ARRAY') { return 0 unless @$a == @$b; for my $i (0..$#$a) { t_is_equal($a->[$i], $b->[$i]) || return 0; } } elsif ($ref_a eq 'HASH' && $ref_b eq 'HASH') { return 0 unless (keys %$a) == (keys %$b); for my $key (sort keys %$a) { return 0 unless exists $b->{$key}; t_is_equal($a->{$key}, $b->{$key}) || return 0; } } elsif ($ref_b eq 'Regexp') { return $a =~ $b; } else { # try to compare the references return $a eq $b; } } else { # undef == undef! a valid test return (defined $a || defined $b) ? 0 : 1; } return 1; } sub t_cmp ($$;$) { Carp::carp(join(":", (caller)[1..2]) . ' usage: $res = t_cmp($received, $expected, [$comment])') if @_ < 2 || @_ > 3; my ($received, $expected) = @_; # this was added in Apache::Test::VERSION 1.12 - remove deprecated # logic sometime around 1.15 or mid September, 2004. if (UNIVERSAL::isa($_[0], 'Regexp')) { my @warning = ("WARNING!!! t_cmp() argument order has changed.", "use of a regular expression as the first argument", "is deprecated. support will be removed soon."); t_debug(@warning); ($received, $expected) = ($expected, $received); } t_debug("testing : " . pop) if @_ == 3; t_debug("expected: " . struct_as_string(0, $expected)); t_debug("received: " . struct_as_string(0, $received)); return t_is_equal($received, $expected); } # Essentially t_cmp, but on Win32, first converts pathnames # to their DOS long name. sub t_filepath_cmp ($$;$) { my @a = (shift, shift); if (Apache::TestConfig::WIN32) { $a[0] = Win32::GetLongPathName($a[0]) if defined $a[0] && -e $a[0]; $a[1] = Win32::GetLongPathName($a[1]) if defined $a[1] && -e $a[1]; } return @_ == 1 ? t_cmp($a[0], $a[1], $_[0]) : t_cmp($a[0], $a[1]); } *expand = HAS_DUMPER ? sub { map { ref $_ ? Data::Dumper::Dumper($_) : $_ } @_ } : sub { @_ }; sub t_debug { my $out = $Apache::TestUtil::DEBUG_OUTPUT; print $out map {"# $_\n"} map {split /\n/} grep {defined} expand(@_); } sub t_open_file { my $file = shift; die "must pass a filename" unless defined $file; # create the parent dir if it doesn't exist yet makepath(dirname $file); my $fh = Symbol::gensym(); open $fh, ">$file" or die "can't open $file: $!"; t_debug("writing file: $file"); $CLEAN{files}{$file}++; return $fh; } sub _temp_package_dir { return catdir(tmpdir(), 'apache_test'); } sub t_write_test_lib { my $file = shift; die "must pass a filename" unless defined $file; t_write_file(catdir(_temp_package_dir(), $file), @_); } sub t_write_file { my $file = shift; die "must pass a filename" unless defined $file; # create the parent dir if it doesn't exist yet makepath(dirname $file); my $fh = Symbol::gensym(); open $fh, ">$file" or die "can't open $file: $!"; t_debug("writing file: $file"); print $fh join '', @_ if @_; close $fh; $CLEAN{files}{$file}++; } sub t_append_file { my $file = shift; die "must pass a filename" unless defined $file; # create the parent dir if it doesn't exist yet makepath(dirname $file); # add to the cleanup list only if we created it now $CLEAN{files}{$file}++ unless -e $file; my $fh = Symbol::gensym(); open $fh, ">>$file" or die "can't open $file: $!"; print $fh join '', @_ if @_; close $fh; } sub t_write_shell_script { my $file = shift; my $code = join '', @_; my($ext, $shebang); if (Apache::TestConfig::WIN32()) { $code =~ s/echo$/echo./mg; #required to echo newline $ext = 'bat'; $shebang = "\@echo off\nREM this is a bat"; } else { $ext = 'sh'; $shebang = '#!/bin/sh'; } $file .= ".$ext"; t_write_file($file, "$shebang\n", $code); $ext; } sub t_write_perl_script { my $file = shift; my $shebang = "#!$Config{perlpath}\n"; my $warning = Apache::TestConfig->thaw->genwarning($file); t_write_file($file, $shebang, $warning, @_); chmod 0755, $file; } sub t_mkdir { my $dir = shift; makepath($dir); } # returns a list of dirs successfully created sub makepath { my($path) = @_; return if !defined($path) || -e $path; my $full_path = $path; # remember which dirs were created and should be cleaned up while (1) { $CLEAN{dirs}{$path} = 1; $path = dirname $path; last if -e $path; } return File::Path::mkpath($full_path, 0, 0755); } sub t_rmtree { die "must pass a dirname" unless defined $_[0]; File::Path::rmtree((@_ > 1 ? \@_ : $_[0]), 0, 1); } #chown a file or directory to the test User/Group #noop if chown is unsupported sub t_chown { my $file = shift; my $config = Apache::Test::config(); my($uid, $gid); eval { #XXX cache this lookup ($uid, $gid) = (getpwnam($config->{vars}->{user}))[2,3]; }; if ($@) { if ($@ =~ /^The getpwnam function is unimplemented/) { #ok if unsupported, e.g. win32 return 1; } else { die $@; } } CORE::chown($uid, $gid, $file) || die "chown $file: $!"; } # $string = struct_as_string($indent_level, $var); # # return any nested datastructure via Data::Dumper or ala Data::Dumper # as a string. undef() is a valid arg. # # $indent_level should be 0 (used for nice indentation during # recursive datastructure traversal) sub struct_as_string{ return "???" unless @_ == 2; my $level = shift; return "undef" unless defined $_[0]; my $pad = ' ' x (($level + 1) * INDENT); my $spad = ' ' x ($level * INDENT); if (HAS_DUMPER) { local $Data::Dumper::Terse = 1; $Data::Dumper::Terse = $Data::Dumper::Terse; # warn my $data = Data::Dumper::Dumper(@_); $data =~ s/\n$//; # \n is handled by the caller return $data; } else { if (ref($_[0]) eq 'ARRAY') { my @data = (); for my $i (0..$#{ $_[0] }) { push @data, struct_as_string($level+1, $_[0]->[$i]); } return join "\n", "[", map({"$pad$_,"} @data), "$spad\]"; } elsif ( ref($_[0])eq 'HASH') { my @data = (); for my $key (keys %{ $_[0] }) { push @data, "$key => " . struct_as_string($level+1, $_[0]->{$key}); } return join "\n", "{", map({"$pad$_,"} @data), "$spad\}"; } else { return $_[0]; } } } my $banner_format = "\n*** The following %s expected and harmless ***\n"; sub is_expected_banner { my $type = shift; my $count = @_ ? shift : 1; sprintf $banner_format, $count == 1 ? "$type entry is" : "$count $type entries are"; } sub t_server_log_is_expected { print STDERR is_expected_banner(@_); } sub t_client_log_is_expected { my $vars = Apache::Test::config()->{vars}; my $log_file = catfile $vars->{serverroot}, "logs", "error_log"; my $fh = Symbol::gensym(); open $fh, ">>$log_file" or die "Can't open $log_file: $!"; my $oldfh = select($fh); $| = 1; select($oldfh); print $fh is_expected_banner(@_); close $fh; } sub t_server_log_error_is_expected { t_server_log_is_expected("error", @_);} sub t_server_log_warn_is_expected { t_server_log_is_expected("warn", @_); } sub t_client_log_error_is_expected { t_client_log_is_expected("error", @_);} sub t_client_log_warn_is_expected { t_client_log_is_expected("warn", @_); } END { # remove files that were created via this package for (grep {-e $_ && -f _ } keys %{ $CLEAN{files} } ) { t_debug("removing file: $_"); unlink $_; } # remove dirs that were created via this package for (grep {-e $_ && -d _ } keys %{ $CLEAN{dirs} } ) { t_debug("removing dir tree: $_"); t_rmtree($_); } } # essentially File::Spec->catfile, but on Win32 # returns the long path name, if the file is absolute sub t_catfile { my $f = catfile(@_); return $f unless file_name_is_absolute($f); return Apache::TestConfig::WIN32 && -e $f ? Win32::GetLongPathName($f) : $f; } # Apache uses a Unix-style specification for files, with # forward slashes for directory separators. This is # essentially File::Spec::Unix->catfile, but on Win32 # returns the long path name, if the file is absolute sub t_catfile_apache { my $f = File::Spec::Unix->catfile(@_); return $f unless file_name_is_absolute($f); return Apache::TestConfig::WIN32 && -e $f ? Win32::GetLongPathName($f) : $f; } 1; __END__ =encoding utf8 =head1 NAME Apache::TestUtil - Utility functions for writing tests =head1 SYNOPSIS use Apache::Test; use Apache::TestUtil; ok t_cmp("foo", "foo", "sanity check"); t_write_file("filename", @content); my $fh = t_open_file($filename); t_mkdir("/foo/bar"); t_rmtree("/foo/bar"); t_is_equal($a, $b); =head1 DESCRIPTION C automatically exports a number of functions useful in writing tests. All the files and directories created using the functions from this package will be automatically destroyed at the end of the program execution (via END block). You should not use these functions other than from within tests which should cleanup all the created directories and files at the end of the test. =head1 FUNCTIONS =over =item t_cmp() t_cmp($received, $expected, $comment); t_cmp() prints the values of I<$comment>, I<$expected> and I<$received>. e.g.: t_cmp(1, 1, "1 == 1?"); prints: # testing : 1 == 1? # expected: 1 # received: 1 then it returns the result of comparison of the I<$expected> and the I<$received> variables. Usually, the return value of this function is fed directly to the ok() function, like this: ok t_cmp(1, 1, "1 == 1?"); the third argument (I<$comment>) is optional, mostly useful for telling what the comparison is trying to do. It is valid to use C as an expected value. Therefore: my $foo; t_cmp(undef, $foo, "undef == undef?"); will return a I value. You can compare any two data-structures with t_cmp(). Just make sure that if you pass non-scalars, you have to pass their references. The datastructures can be deeply nested. For example you can compare: t_cmp({1 => [2..3,{5..8}], 4 => [5..6]}, {1 => [2..3,{5..8}], 4 => [5..6]}, "hash of array of hashes"); You can also compare the second argument against the first as a regex. Use the C function in the second argument. For example: t_cmp("abcd", qr/^abc/, "regex compare"); will do: "abcd" =~ /^abc/; This function is exported by default. =item t_filepath_cmp() This function is used to compare two filepaths via t_cmp(). For non-Win32, it simply uses t_cmp() for the comparison, but for Win32, Win32::GetLongPathName() is invoked to convert the first two arguments to their DOS long pathname. This is useful when there is a possibility the two paths being compared are not both represented by their long or short pathname. This function is exported by default. =item t_debug() t_debug("testing feature foo"); t_debug("test", [1..3], 5, {a=>[1..5]}); t_debug() prints out any datastructure while prepending C<#> at the beginning of each line, to make the debug printouts comply with C's requirements. This function should be always used for debug prints, since if in the future the debug printing will change (e.g. redirected into a file) your tests won't need to be changed. the special global variable $Apache::TestUtil::DEBUG_OUTPUT can be used to redirect the output from t_debug() and related calls such as t_write_file(). for example, from a server-side test you would probably need to redirect it to STDERR: sub handler { plan $r, tests => 1; local $Apache::TestUtil::DEBUG_OUTPUT = \*STDERR; t_write_file('/tmp/foo', 'bar'); ... } left to its own devices, t_debug() will collide with the standard HTTP protocol during server-side tests, resulting in a situation both confusing difficult to debug. but STDOUT is left as the default, since you probably don't want debug output under normal circumstances unless running under verbose mode. This function is exported by default. =item t_write_test_lib() t_write_test_lib($filename, @lines) t_write_test_lib() creates a new file at I<$filename> or overwrites the existing file with the content passed in I<@lines>. The file is created in a temporary directory which is added to @INC at test configuration time. It is intended to be used for creating temporary packages for testing which can be modified at run time, see the Apache::Reload unit tests for an example. =item t_write_file() t_write_file($filename, @lines); t_write_file() creates a new file at I<$filename> or overwrites the existing file with the content passed in I<@lines>. If only the I<$filename> is passed, an empty file will be created. If parent directories of C<$filename> don't exist they will be automagically created. The generated file will be automatically deleted at the end of the program's execution. This function is exported by default. =item t_append_file() t_append_file($filename, @lines); t_append_file() is similar to t_write_file(), but it doesn't clobber existing files and appends C<@lines> to the end of the file. If the file doesn't exist it will create it. If parent directories of C<$filename> don't exist they will be automagically created. The generated file will be registered to be automatically deleted at the end of the program's execution, only if the file was created by t_append_file(). This function is exported by default. =item t_write_shell_script() Apache::TestUtil::t_write_shell_script($filename, @lines); Similar to t_write_file() but creates a portable shell/batch script. The created filename is constructed from C<$filename> and an appropriate extension automatically selected according to the platform the code is running under. It returns the extension of the created file. =item t_write_perl_script() Apache::TestUtil::t_write_perl_script($filename, @lines); Similar to t_write_file() but creates a executable Perl script with correctly set shebang line. =item t_open_file() my $fh = t_open_file($filename); t_open_file() opens a file I<$filename> for writing and returns the file handle to the opened file. If parent directories of C<$filename> don't exist they will be automagically created. The generated file will be automatically deleted at the end of the program's execution. This function is exported by default. =item t_mkdir() t_mkdir($dirname); t_mkdir() creates a directory I<$dirname>. The operation will fail if the parent directory doesn't exist. If parent directories of C<$dirname> don't exist they will be automagically created. The generated directory will be automatically deleted at the end of the program's execution. This function is exported by default. =item t_rmtree() t_rmtree(@dirs); t_rmtree() deletes the whole directories trees passed in I<@dirs>. This function is exported by default. =item t_chown() Apache::TestUtil::t_chown($file); Change ownership of $file to the test's I/I. This function is noop on platforms where chown(2) is unsupported (e.g. Win32). =item t_is_equal() t_is_equal($a, $b); t_is_equal() compares any two datastructures and returns 1 if they are exactly the same, otherwise 0. The datastructures can be nested hashes, arrays, scalars, undefs or a combination of any of these. See t_cmp() for an example. If C<$b> is a regex reference, the regex comparison C<$a =~ $b> is performed. For example: t_is_equal($server_version, qr{^Apache}); If comparing non-scalars make sure to pass the references to the datastructures. This function is exported by default. =item t_server_log_error_is_expected() If the handler's execution results in an error or a warning logged to the I file which is expected, it's a good idea to have a disclaimer printed before the error itself, so one can tell real problems with tests from expected errors. For example when testing how the package behaves under error conditions the I file might be loaded with errors, most of which are expected. For example if a handler is about to generate a run-time error, this function can be used as: use Apache::TestUtil; ... sub handler { my $r = shift; ... t_server_log_error_is_expected(); die "failed because ..."; } After running this handler the I file will include: *** The following error entry is expected and harmless *** [Tue Apr 01 14:00:21 2003] [error] failed because ... When more than one entry is expected, an optional numerical argument, indicating how many entries to expect, can be passed. For example: t_server_log_error_is_expected(2); will generate: *** The following 2 error entries are expected and harmless *** If the error is generated at compile time, the logging must be done in the BEGIN block at the very beginning of the file: BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } use DOES_NOT_exist; After attempting to run this handler the I file will include: *** The following error entry is expected and harmless *** [Tue Apr 01 14:04:49 2003] [error] Can't locate "DOES_NOT_exist.pm" in @INC (@INC contains: ... Also see C which is similar but used for warnings. This function is exported by default. =item t_server_log_warn_is_expected() C generates a disclaimer for expected warnings. See the explanation for C for more details. This function is exported by default. =item t_client_log_error_is_expected() C generates a disclaimer for expected errors. But in contrast to C called by the client side of the script. See the explanation for C for more details. For example the following client script fails to find the handler: use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 1; t_client_log_error_is_expected(); my $url = "/error_document/cannot_be_found"; my $res = GET($url); ok t_cmp(404, $res->code, "test 404"); After running this test the I file will include an entry similar to the following snippet: *** The following error entry is expected and harmless *** [Tue Apr 01 14:02:55 2003] [error] [client 127.0.0.1] File does not exist: /tmp/test/t/htdocs/error When more than one entry is expected, an optional numerical argument, indicating how many entries to expect, can be passed. For example: t_client_log_error_is_expected(2); will generate: *** The following 2 error entries are expected and harmless *** This function is exported by default. =item t_client_log_warn_is_expected() C generates a disclaimer for expected warnings on the client side. See the explanation for C for more details. This function is exported by default. =item t_catfile('a', 'b', 'c') This function is essentially Ccatfile>, but on Win32 will use C to convert the result to a long path name (if the result is an absolute file). The function is not exported by default. =item t_catfile_apache('a', 'b', 'c') This function is essentially Ccatfile>, but on Win32 will use C to convert the result to a long path name (if the result is an absolute file). It is useful when comparing something to that returned by Apache, which uses a Unix-style specification with forward slashes for directory separators. The function is not exported by default. =item t_start_error_log_watch(), t_finish_error_log_watch() This pair of functions provides an easy interface for checking the presence or absense of any particular message or messages in the httpd error_log that were generated by the httpd daemon as part of a test suite. It is likely, that you should proceed this with a call to one of the t_*_is_expected() functions. t_start_error_log_watch(); do_it; ok grep {...} t_finish_error_log_watch(); Another usage case could be a handler that emits some debugging messages to the error_log. Now, if this handler is called in a series of other test cases it can be hard to find the relevant messages manually. In such cases the following sequence in the test file may help: t_start_error_log_watch(); GET '/this/or/that'; t_debug t_finish_error_log_watch(); =item t_start_file_watch() Apache::TestUtil::t_start_file_watch('access_log'); This function is similar to C but allows for other files than C to be watched. It opens the given file and positions the file pointer at its end. Subsequent calls to C or C will read lines that have been appended after this call. A file name can be passed as parameter. If omitted or undefined the C is opened. Relative file name are evaluated relative to the directory containing C. If the specified file does not exist (yet) no error is returned. It is assumed that it will appear soon. In this case C will open the file silently and read from the beginning. =item t_read_file_watch(), t_finish_file_watch() local $/ = "\n"; $line1=Apache::TestUtil::t_read_file_watch('access_log'); $line2=Apache::TestUtil::t_read_file_watch('access_log'); @lines=Apache::TestUtil::t_finish_file_watch('access_log'); This pair of functions reads the file opened by C. As does the core C function, they return one line if called in scalar context, otherwise all lines until end of file. Before calling C these functions do not set C<$/> as does C. So, if the file has for example a fixed record length use this: { local $/=\$record_length; @lines=t_finish_file_watch($name); } =item t_file_watch_for() @lines=Apache::TestUtil::t_file_watch_for('access_log', qr/condition/, $timeout); This function reads the file from the current position and looks for the first line that matches C. If no such line could be found until end of file the function pauses and retries until either such a line is found or the timeout (in seconds) is reached. In scalar or void context only the matching line is returned. In list context all read lines are returned with the matching one in last position. The function uses C<\n> and end-of-line marker and waits for complete lines. The timeout although it can be specified with sub-second precision is not very accurate. It is simply multiplied by 10. The result is used as a maximum loop count. For the intented purpose this should be good enough. Use this function to check for logfile entries when you cannot be sure that they are already written when the test program reaches the point, for example to check for messages that are written in a PerlCleanupHandler or a PerlLogHandler. ok t_file_watch_for 'access_log', qr/expected log entry/, 2; This call reads the C and waits for maximum 2 seconds for the expected entry to appear. =back =head1 AUTHOR Stas Bekman , Torsten Förtsch =head1 SEE ALSO perl(1) =cut mod_perl-2.0.9/Apache-Test/lib/Bundle/0000755000104000010010000000000012540623176020047 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/lib/Bundle/ApacheTest.pm0000644000104000010010000000331112540623176022424 0ustar AdministratorsNone# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Bundle::ApacheTest; $VERSION = '0.02'; 1; __END__ =head1 NAME Bundle::ApacheTest - A bundle to install all Apache-Test related modules =head1 SYNOPSIS perl -MCPAN -e 'install Bundle::ApacheTest' =head1 CONTENTS Crypt::SSLeay - For https support Devel::CoreStack - For getting core stack info Devel::Symdump - For, uh, dumping symbols Digest::MD5 - Needed for Digest authentication URI - There are URIs everywhere Net::Cmd - For libnet MIME::Base64 - Used in authentication headers HTML::Tagset - Needed by HTML::Parser HTML::Parser - Need by HTML::HeadParser HTML::HeadParser - To get the correct $res->base LWP - For libwww-perl LWP::Protocol::https - LWP plug-in for the https protocol IPC::Run3 - Used in Apache::TestSmoke =head1 DESCRIPTION This bundle lists all the CPAN modules used by Apache-Test. =cut mod_perl-2.0.9/Apache-Test/LICENSE0000644000177200010010000002613612540623176015204 0ustar SteveNone Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mod_perl-2.0.9/Apache-Test/Makefile.PL0000644000104000010010000001174012540623176020045 0ustar AdministratorsNoneuse 5.005; use lib qw(lib); use Apache::Test5005compat; use strict; use warnings; # was this file invoked directly via perl, or via the top-level # (mp2) Makefile.PL? if top-level, this env var will be set use constant TOP_LEVEL => $ENV{MOD_PERL_2_BUILD}; if (!TOP_LEVEL) { # see if we are building from within mp root, add src lib if we are eval { require File::Spec }; unless ($@) { if ( -e File::Spec->catdir('..', 'lib') ) { # building A-T from mp subdirectory, use the mp lib unshift @INC, File::Spec->catdir('..', 'lib'); } } } use ExtUtils::MakeMaker; use Symbol; use File::Find qw(finddepth); use Apache::TestMM qw(test clean); #enable 'make test and make clean' use Apache::TestRun; use Apache::TestTrace; use Apache::TestReport; use Apache::TestConfig (); use Apache::TestRunPerl; my $VERSION; set_version(); Apache::TestMM::filter_args(); my @scripts = qw(t/TEST); finddepth(sub { return if $_ eq 'Apache-TestItSelf'; return unless /(.*?\.pl)\.PL$/; push @scripts, "$File::Find::dir/$1"; }, '.'); my $has_mp; eval { require mod_perl2 }; if ($@) { eval { require mod_perl }; if (!$@) { $has_mp = 1; } } else { $has_mp = 2; } for (@scripts) { Apache::TestMM::generate_script($_); } Apache::TestReport->generate_script; my @clean_files = qw(.mypacklist t/TEST t/REPORT Makefile.old ); my %prereq = ( 'File::Spec' => '0.8', 'Cwd' => '2.06', ); # Apache-Test/META.yml is excluded from mp2 distro to make PAUSE # indexer happy, but then perl Makefile.PL complains about a missing # META.yml, so autogenerate it if it wasn't in the distro my $no_meta = TOP_LEVEL ? 1 : 0; WriteMakefile( NAME => 'Apache::Test', VERSION => $VERSION, PREREQ_PM => \%prereq, NO_META => $no_meta, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', PREOP => 'find $(DISTVNAME) -type d -print|xargs chmod 0755 && ' . 'find $(DISTVNAME) -type f -print|xargs chmod 0644', TO_UNIX => 'find $(DISTVNAME) -type f -print|xargs dos2unix' }, clean => { FILES => "@clean_files", }, ); # after CPAN/CPANPLUS had a chance to satisfy the requirements, # enforce those (for those who run things manually) check_prereqs(); sub check_prereqs { my %fail = (); for (sort keys %prereq) { unless (chk_version($_, $prereq{$_})) { $fail{$_} = $prereq{$_}; } } if (%fail) { error "\nThe following Apache-Test dependencies aren't satisfied:", map { "\t$_: $fail{$_}" } sort keys %fail; error "Install those from http://search.cpan.org and try again"; exit 0; } } sub chk_version { my($pkg, $wanted) = @_; no strict 'refs'; local $| = 1; print "Checking for $pkg..."; (my $p = $pkg . ".pm") =~ s#::#/#g; eval { require $p;}; print("not ok\n$@"), return if $@; my $vstr = ${"${pkg}::VERSION"} ? "found v" . ${"${pkg}::VERSION"} : "not found"; my $vnum = eval(${"${pkg}::VERSION"}) || 0; print $vnum >= $wanted ? "ok\n" : " " . $vstr . "\n"; $vnum >= $wanted; } sub set_version { $VERSION = $Apache::Test::VERSION; my $fh = Symbol::gensym(); open $fh, 'Changes' or die "Can't open Changes: $!"; while (<$fh>) { if(/^=item.*-(dev|rc\d+)/) { $VERSION .= "-$1"; last; } last if /^=item/; } close $fh; } sub add_dep { my($string, $targ, $add) = @_; $$string =~ s/($targ\s+::)/$1 $add/; } no warnings 'redefine'; sub MY::postamble { my $self = shift; my $string = $self->MM::postamble; $string .= <<'EOF'; tag : svn copy https://svn.apache.org/repos/asf/perl/Apache-Test/trunk https://svn.apache.org/repos/asf/perl/Apache-Test/tags/$(VERSION_SYM) @echo update lib/Apache/Test.pm VERSION now EOF return $string; } sub MY::test { my $self = shift; # run tests normally if non root user return $self->Apache::TestMM::test(@_) if (($> != 0) # root user or (Apache::TestConfig::WINFU)); # win users # or win32 return <MM::constants; # mp2 installs this into INSTALLSITEARCH, so in order to avoid # problems when users forget 'make install UNINST=1', trick MM into # installing pure perl modules to the sitearch location, when this is # not installed as a part of mp2 build if (!$ENV{MOD_PERL_2_BUILD}) { $string .= <<'EOI'; # install into the same location as mod_perl 2.0 INSTALLSITELIB = $(INSTALLSITEARCH) DESTINSTALLSITELIB = $(DESTINSTALLSITEARCH) EOI } $string; } mod_perl-2.0.9/Apache-Test/README0000644000104000010010000001311412540623176016750 0ustar AdministratorsNone######### # About # ######### Apache::Test is a test toolkit for testing an Apache server with any configuration. It works with Apache 1.3 and Apache 2.0/2.2/2.4 and any of its modules, including mod_perl 1.0 and 2.0. It was originally developed for testing mod_perl 2.0. ################# # Documentation # ################# For an extensive documentation see the tutorial: http://perl.apache.org/docs/general/testing/testing.html and the documentation of the specific Apache::Test modules, which can be read using 'perldoc', for example: % perldoc Apache::TestUtil and the 'Testing mod_perl 2.0' article: http://www.perl.com/pub/a/2003/05/22/testing.html ################### # Got a question? # ################### Post it to the test-dev httpd.apache.org list. The list is moderated, so unless you are subscribed to it it may take some time for your post to make it to the list. For more information see: http://perl.apache.org/projects/Apache-Test/index.html List Archives: # www.apachelabs.org http://www.apachelabs.org/test-dev/ # marc.theaimsgroup.com http://marc.theaimsgroup.com/?l=apache-modperl-test-dev # Mbox file http://perl.apache.org/mail/test-dev/ ############## # Cheat List # ############## see Makefile.PL for howto enable 'make test' see t/TEST as an example test harness see t/*.t for example tests if the file t/conf/httpd.conf.in exists, it will be used instead of the default template (in Apache/TestConfig.pm); if the file t/conf/extra.conf.in exists, it will be used to generate t/conf/extra.conf with @variable@ substitutions if the file t/conf/extra.conf exists, it will be included by httpd.conf if the file t/conf/modperl_extra.pl exists, it will be included by httpd.conf as a mod_perl file (PerlRequire) ################## # Handy examples # ################## some examples of what i find handy: see TEST -help for more options test verbosely % t/TEST -verbose start the server % t/TEST -start run just this test (if server is running, will not be re-started) % t/TEST t/apr/table run just the apr tests % t/TEST t/apr run all tests without start/stop of server (e.g. server was started with -d) % t/TEST -run stop the server % t/TEST -stop ping the server to see whether it runs % t/TEST -ping ping the server and wait until the server starts, report waiting time % t/TEST -ping=block reconfigure the server, do not run tests % t/TEST -configure run as user nobody: % t/TEST -User nobody run on a different port: % t/TEST -Port 8799 let the program pick the next available port (useful when running a few test sessions on parallel) % t/TEST -Port select run on a different server: % t/TEST -servername example.com configure an httpd other than the default (that apxs figures out) % t/TEST -httpd ~/ap/httpd-2.0/httpd configure a DSO mod_perl object other than the default (that stored in Apache::BuildConfig) % t/TEST -libmodperl ~/ap/httpd-2.0/modules/mod_perl-5.8.0.so or one that can be found relative to LIBEXECDIR % t/TEST -libmodperl mod_perl-5.6.1.so switch to another apxs % t/TEST -apxs ~/ap/httpd-2.0-prefork/bin/apxs turn on tracing % t/TEST -preamble "PerlTrace all" GET url % t/TEST -get /server-info HEAD url % t/TEST -head /server-info HEAD (no url defaults to /) % t/TEST -head GET url with authentication credentials % t/TEST -get /server-info -username dougm -password foo POST url (read content from string) % t/TEST -post /TestApache::post -content 'name=dougm&company=covalent' POST url (read content from stdin) % t/TEST -post /TestApache::post -content - < foo.txt POST url (generate a body of data 1024 bytes in length) % t/TEST -post /TestApache::post -content x1024 POST url (only print headers, e.g. useful to just check Content-length) % t/TEST -post -head /TestApache::post -content x100000 GET url (only print headers, e.g. useful to just check Content-length) % t/TEST -get -head /foo start server under gdb % t/TEST -debug start server under strace (outputs to t/logs/strace.log) % t/TEST -d strace run .t test under the perl debugger % t/TEST -d perl t/modules/access.t run .t test under the perl debugger (nonstop mode, output to t/logs/perldb.out) % t/TEST -d perl=nostop t/modules/access.t control how much noise Apache::Test should produce. to print all the debug messages: % t/TEST -trace=debug to print only warnings and higher trace levels: % t/TEST -trace=warning the available modes are: emerg alert crit error warning notice info debug turn on -v and LWP trace (1 is the default) mode in Apache::TestRequest % t/TEST -d lwp t/modules/access.t turn on -v and LWP trace mode (level 2) in Apache::TestRequest % t/TEST -d lwp=2 t/modules/access.t run all tests through mod_ssl % t/TEST -ssl run all tests with HTTP/1.1 (keep alive) requests % t/TEST -http11 -ssl run all tests with HTTP/1.1 (keep alive) requests through mod_ssl % t/TEST -http11 run all tests through mod_proxy % t/TEST -proxy ################## # Stress testing # ################## run all tests 10 times in a random order (the seed is autogenerated and reported) % t/SMOKE -times=10 -order=random run all tests 10 times in a random order using the seed obtained from the previous random run (e.g. 2352211): % t/SMOKE -times=10 -order=2352211 repeat all tests 10 times (a, b, c, a, b, c) % t/SMOKE -times=10 -order=repeat When certain tests fail when running with -times option, you want to find out the minimal sequence of tests that lead to the failure. Apache::TestSmoke helps to ease this task, simply run: % t/SMOKE which tries various sequences of tests and at the end reports the shortest sequences found that lead to the same failure. for more options do: % t/SMOKE -help mod_perl-2.0.9/Apache-Test/RELEASE0000644000104000010010000000477512540623176017110 0ustar AdministratorsNoneInstructions for Apache-Test Release Manager 0. Ask the PMC to verify that you have the appropriate CPAN permissions on test-dev@. 1. 'make dist' - to make sure nothing is missing from the manifest, etc. Now test this generated package (not svn) with as many configurations as possible on as many platforms as possible. a. edit ./Changes: - change -dev to -rc\d+ starting with -rc1 - note that you *do not* want to change the version in Apache/Test.pm, this is a significant difference than other Apache::* modules. this means that development proceeds with non '-dev' or '-rc1' version tags, so keep that in mind. b. nuke any preinstalled Apache-Test libs and run 'make test' c. test that you can 'make install' and then run 'make test' again d. test whether we still 100% OK on systems with no LWP: % APACHE_TEST_PRETEND_NO_LWP=1 make test 2. once confident that the package is good, upload a release candidate to perl.apache.org/~username and post 24 hour-ish candidate alert to the various lists. note that you will need to be subscribed to all of the following lists. o test-dev/perl.apache.org o dev/perl.apache.org o modperl/perl.apache.org o dev/httpd.apache.org (or maybe longer to give most people a chance to catch up). no need to tag this package Subject: [RELEASE CANDIDATE] Apache-Test-1.39 RC\d+ a. if problems are detected during stage 2, repeat stages 1 and 2. 3. when the package has been reported to be good, prepare a new package to be released a. edit ./Changes: - remove -rc\d+ - add release date b. rerun: % perl Makefile.PL make sure tag looks right % make -n tag c. commit Changes % svn ci Changes d. tag % make tag e. create the final package % make dist f. test the final package again at least once 4. Upload the package to CPAN 5. Announce the package a. post ... to the modperl, announce lists Subject: [ANNOUNCE] Apache-Test 1.39 include - MD5 sig (as it comes from CPAN upload announce). - the latest Changes 6. Prepare for the next cycle a. increment version in lib/Apache/Test.pm b. edit ./Changes: - start a new item with incremented version + '-dev' =item 1.40-dev c. bump up version numbers in this file to make it easier to do the next release. $ perl -pi -e 's/(\d+)\.(\d+)/join(".", $1, $2+1)/eg' RELEASE d. commit Changes % svn ci -m "start 1.40-dev cycle" Changes RELEASE lib/Apache/Test.pm mod_perl-2.0.9/Apache-Test/SUPPORT0000644000177200010010000000442212540623176015270 0ustar SteveNoneThe Apache-Test project is co-maintained by several developers, who take turns at making CPAN releases. Therefore you may find several CPAN directories containing Apache-Test releases. The best way to find the latest release is to use http://search.cpan.org/. If you have a question or you want to submit a bug report or make a contribution, please do not email individual authors, but send an email to the test-dev httpd.apache.org mailing list. This list is moderated, so unless you are subscribed to it, your message will have to be approved first by a moderator. Therefore please allow some time (up to a few days) for your post to propagate to the list. If 'make test' fails to start, with an error message: !!! no test server configured, please specify an httpd or apxs or put either in your PATH. For example: t/TEST -httpd /path/to/bin/httpd or similar, please don't submit a bug report, since this is a user error, not a bug in Apache-Test. Instead, do what the error message suggests; Apache-Test needs to know where it can find Apache and other components. If you have apxs installed you can run the test suite via: % t/TEST -apxs /path/to/bin/apxs or if you set the APXS environment variable, via make: % APXS=/path/to/bin/apxs make test If you don't have 'apxs', tell Apache-Test where your httpd can be found: % t/TEST -httpd /path/to/bin/httpd or via the APACHE environment variable: % APACHE=/path/to/bin/httpd make test *** CPAN Testers *** CPAN Testers using CPANPLUS and running under 'root' are required to update their perl installation to have IPC::Run 0.78 or higher. Please do not post failure reports unless you have this prerequisite satisfied. It has nothing to do with Apache-Test itself, and needed for CPANPLUS to flush the STDERR and STDOUT streams at the right time, allowing you to skip the test suite if the conditions aren't suitable for its execution. *** Apache C modules bug reports *** It's now possible to easily create tarballs with self-contained bug reports for Apache modules in C. Geoff developed and maintains the skeleton: http://perl.apache.org/~geoff/bug-reporting-skeleton-apache.tar.gz So next time you want to send a reproducable bug report for some C module, grab that tarball, put your code in and submit it to the relevant list. mod_perl-2.0.9/Apache-Test/t/0000755000104000010010000000000012540623176016333 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/alltest/0000755000104000010010000000000012540623176020003 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/alltest/01bang.t0000644000177200010010000000011312540623176017332 0ustar SteveNoneuse Apache::Test; plan tests => 1; ok (0, 'this test should never run'); mod_perl-2.0.9/Apache-Test/t/alltest/all.t0000644000177200010010000000016312540623176017037 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 1, skip_reason('testing all.t'); ok 1; mod_perl-2.0.9/Apache-Test/t/alltest2/0000755000104000010010000000000012540623176020065 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/alltest2/01bang.t0000644000177200010010000000011312540623176017414 0ustar SteveNoneuse Apache::Test; plan tests => 1; ok (0, 'this test should never run'); mod_perl-2.0.9/Apache-Test/t/alltest2/all.t0000644000177200010010000000020112540623176017112 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 1, skip_reason('testing more than one all.t'); ok 1; mod_perl-2.0.9/Apache-Test/t/bad_coding.t0000644000177200010010000000110512540623176016665 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; # This test tests how good Apache-Test deals with bad coding practices # of its users plan tests => 1; { # passing $_ to a non-core function inside a foreach loop or # similar, may affect $_ on return -- badly breaking things and # making it hard to figure out where the problem is coming from. # # have_* macros localize $_ for these bad programming cases # let's test that: my @list = ('mod_dir'); my %modules = map { $_, have_module($_) } @list; ok 1; } mod_perl-2.0.9/Apache-Test/t/cgi-bin/0000755000104000010010000000000012540623176017643 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/cgi-bin/cookies.pl.PL0000644000177200010010000000047112540623176020247 0ustar SteveNone#!perl -wT use strict; use CGI; use CGI::Cookie; my %cookies = CGI::Cookie->fetch; my $name = 'ApacheTest'; my $c = ! exists $cookies{$name} ? CGI::Cookie->new(-name=>$name, -value=>time) : ''; print "Set-Cookie: $c\n" if $c; print "Content-Type: text/plain\n\n"; print ($c ? 'new' : 'exists'), "\n"; mod_perl-2.0.9/Apache-Test/t/cgi-bin/next_available_port.pl.PL0000644000177200010010000000013012540623176022625 0ustar SteveNoneuse strict; print "Content-Type: text/plain\n\n"; print $ENV{NextAvailablePort} || ''; mod_perl-2.0.9/Apache-Test/t/conf/0000755000104000010010000000000012540623176017260 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/conf/extra.conf.in0000644000177200010010000000200212540623176017750 0ustar SteveNone#this file will be Include-d by @ServerRoot@/httpd.conf #the subclass inside t/TEST added the authname and allowed_users variables Redirect /redirect http://@ServerName@/redirected/ SetHandler perl-script PerlResponseHandler TestMore::testpm PerlHandler TestMore::testpm SetHandler perl-script PerlResponseHandler TestMore::testmorepm PerlHandler TestMore::testmorepm ScriptAlias /cgi-bin/ "@ServerRoot@/cgi-bin/" AllowOverride None Options +ExecCGI # t/next_available_port.t SetEnv NextAvailablePort @NextAvailablePort@ mod_perl-2.0.9/Apache-Test/t/conf/modperl_extra.pl.in0000644000177200010010000000041512540623176021166 0ustar SteveNoneuse strict; use warnings FATAL => qw(all); use File::Spec (); use lib (); # empty so we can calculate the lib to use my @libs = (File::Spec->catfile('@ServerRoot@', 'response'), File::Spec->catfile('@ServerRoot@', qw(.. lib))); lib->import(@libs); 1; mod_perl-2.0.9/Apache-Test/t/cookies.t0000644000177200010010000000073712540623176016262 0ustar SteveNone# this test tests how a cookie jar can be passed (needs lwp) use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 2, need [qw(CGI CGI::Cookie)], need_cgi, need_lwp, need need_module('mod_alias.c'); Apache::TestRequest::user_agent( cookie_jar => {} ); my $url = '/cgi-bin/cookies.pl'; ok t_cmp GET_BODY($url), 'new', "new cookie"; ok t_cmp GET_BODY($url), 'exists', "existing cookie"; mod_perl-2.0.9/Apache-Test/t/import.t0000644000177200010010000001107012540623176016130 0ustar SteveNone#!perl use strict; use warnings FATAL=>'all'; use Test (); Test::plan tests=>47; sub t { my $p=$_[0]; no strict 'refs'; Test::ok defined &{$p."::ok"} && \&{$p."::ok"}==\&Test::ok, 1, "$p - ok"; Test::ok defined &{$p."::need"} && \&{$p."::need"}==\&Apache::Test::need, 1, "$p - need"; Test::ok defined &{$p."::plan"} && \&{$p."::plan"}==\&Apache::Test::plan, 1, "$p - plan"; } sub tm { my $p=$_[0]; no strict 'refs'; Test::ok defined &{$p."::ok"} && \&{$p."::ok"}==\&Test::More::ok, 1, "$p - ok"; Test::ok defined &{$p."::need"} && \&{$p."::need"}==\&Apache::Test::need, 1, "$p - need"; Test::ok defined &{$p."::plan"} && \&{$p."::plan"}==\&Apache::Test::plan, 1, "$p - plan"; } {package X0; use Apache::Test;} {package Y0; use Apache::Test qw/-withtestmore/;} t 'X0'; tm 'Y0'; {package X1; use Apache::Test qw/:DEFAULT/;} {package Y1; use Apache::Test qw/-withtestmore :DEFAULT/;} t 'X1'; tm 'Y1'; {package X2; use Apache::Test qw/!:DEFAULT/;} {package Y2; use Apache::Test qw/-withtestmore !:DEFAULT/;} Test::ok !defined &X2::ok, 1, '!defined &X2::ok'; Test::ok !defined &X2::need, 1, '!defined &X2::need'; Test::ok !defined &X2::plan, 1, '!defined &X2::plan'; Test::ok !defined &Y2::ok, 1, '!defined &Y2::ok'; Test::ok !defined &Y2::need, 1, '!defined &Y2::need'; Test::ok !defined &Y2::plan, 1, '!defined &Y2::plan'; {package X3; use Apache::Test qw/plan/;} {package Y3; use Apache::Test qw/-withtestmore plan/;} Test::ok !defined &X3::ok, 1, '!defined &X3::ok'; Test::ok !defined &X3::need, 1, '!defined &X3::need'; Test::ok defined &X3::plan && \&X3::plan==\&Apache::Test::plan, 1, "X3 - plan"; Test::ok !defined &Y3::ok, 1, '!defined &Y3::ok'; Test::ok !defined &Y3::need, 1, '!defined &Y3::need'; Test::ok defined &Y3::plan && \&Y3::plan==\&Apache::Test::plan, 1, "Y3 - plan"; {package X4; use Apache::Test qw/need/;} {package Y4; use Apache::Test qw/-withtestmore need/;} Test::ok !defined &X4::ok, 1, '!defined &X4::ok'; Test::ok defined &X4::need && \&X4::need==\&Apache::Test::need, 1, "X4 - need"; Test::ok !defined &X4::plan, 1, '!defined &X4::plan'; Test::ok !defined &Y4::ok, 1, '!defined &Y4::ok'; Test::ok defined &Y4::need && \&Y4::need==\&Apache::Test::need, 1, "Y4 - need"; Test::ok !defined &Y4::plan, 1, '!defined &Y4::plan'; {package X5; use Apache::Test qw/ok/;} {package Y5; use Apache::Test qw/-withtestmore ok/;} Test::ok defined &X5::ok && \&X5::ok==\&Test::ok, 1, "X5 - ok"; Test::ok !defined &X5::need, 1, '!defined &X5::need'; Test::ok !defined &X5::plan, 1, '!defined &X5::plan'; Test::ok defined &Y5::ok && \&Y5::ok==\&Test::More::ok, 1, "Y5 - ok"; Test::ok !defined &Y5::need, 1, '!defined &Y5::need'; Test::ok !defined &Y5::plan, 1, '!defined &Y5::plan'; {package X6; use Apache::Test qw/ok need/;} {package Y6; use Apache::Test qw/-withtestmore ok need/;} Test::ok defined &X6::ok && \&X6::ok==\&Test::ok, 1, "X6 - ok"; Test::ok defined &X6::need && \&X6::need==\&Apache::Test::need, 1, "X6 - need"; Test::ok !defined &X6::plan, 1, '!defined &X6::plan'; Test::ok defined &Y6::ok && \&Y6::ok==\&Test::More::ok, 1, "Y6 - ok"; Test::ok defined &Y6::need && \&Y6::need==\&Apache::Test::need, 1, "Y6 - need"; Test::ok !defined &Y6::plan, 1, '!defined &Y6::plan'; my $warning; { local $SIG{__WARN__}=sub {$warning=join '', @_}; eval <<'EVAL'; package Z0; use Apache::Test qw/:withtestmore/; EVAL } Test::ok $warning, qr/^Ignoring import spec :withtestmore at/, "Ignore import warning"; undef $warning; { local $SIG{__WARN__}=sub {$warning=join '', @_}; eval <<'EVAL'; package X0; use Apache::Test qw/-withtestmore/; EVAL } Test::ok $warning, qr/^Ignoring -withtestmore due to a previous call /, "Ignore -withtestmore warning"; use Config (); my $pio=$Config::Config{useperlio} ? '' : 'need perlio'; my $output; Test::skip $pio, sub { my @res; { local $Test::ntest=-19; local $Test::planned=-42; package Y2; # uses Apache::Test qw/-withtestmore !:DEFAULT/ # so nothing is exported local *STDOUT; open STDOUT, '>', \$output; { # suppress an 'uninitialized' warning in older perl versions local $SIG{__WARN__}=sub { warn $_[0] unless $_[0]=~m!uninitialized\svalue\sin\sopen\b.+ Test/Builder\.pm!x; }; Apache::Test::plan tests=>17; } Test::More::isnt "hugo", "erwin", "hugo is not erwin"; @res=($Test::ntest, $Test::planned); Test::Builder->new->reset; } return "@res"; }, '-19 -42', '$Test::ntest, $Test::planned did not change'; Test::skip $pio, $output=~/^1\.\.17$/m; Test::skip $pio, $output=~/^ok 1 - hugo is not erwin$/m; mod_perl-2.0.9/Apache-Test/t/log_watch.t0000644000104000010010000000376312540623176020500 0ustar AdministratorsNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil qw/t_start_file_watch t_read_file_watch t_finish_file_watch t_write_file t_append_file t_catfile t_cmp/; plan tests => 11; my $fn=t_catfile(Apache::Test::vars->{t_logs}, 'watch'); unlink $fn; t_start_file_watch 'watch'; t_write_file $fn, "1\n2\n"; ok t_cmp [t_read_file_watch 'watch'], ["1\n", "2\n"], "t_read_file_watch on previously non-existing file"; t_append_file $fn, "3\n4\n"; ok t_cmp [t_read_file_watch 'watch'], ["3\n", "4\n"], "subsequent t_read_file_watch"; t_append_file $fn, "5\n6\n"; ok t_cmp [t_finish_file_watch 'watch'], ["5\n", "6\n"], "subsequent t_finish_file_watch"; ok t_cmp [t_finish_file_watch 'watch'], ["1\n","2\n","3\n","4\n","5\n","6\n"], "t_finish_file_watch w/o start"; ok t_cmp [t_read_file_watch 'watch'], ["1\n","2\n","3\n","4\n","5\n","6\n"], "t_read_file_watch w/o start"; ok t_cmp [t_read_file_watch 'watch'], [], "subsequent t_read_file_watch"; t_append_file $fn, "7\n8\n"; unlink $fn; ok t_cmp [t_read_file_watch 'watch'], ["7\n","8\n"], "subsequent t_read_file_watch file unlinked"; t_write_file $fn, "1\n2\n3\n4\n5\n6\n7\n8\n"; ok t_cmp [t_finish_file_watch 'watch'], [], "subsequent t_finish_file_watch - new file exists but fh is cached"; t_start_file_watch 'watch'; ok t_cmp [t_read_file_watch 'watch'], [], "t_read_file_watch at EOF"; # Make sure the file is closed before deleting it on Windows. t_finish_file_watch 'watch' if $^O eq 'MSWin32'; unlink $fn; t_start_file_watch 'watch'; t_write_file $fn, "1\n2\n3\n4\n5\n6\n7\n8\n"; { local $/=\4; ok t_cmp [scalar t_read_file_watch 'watch'], ["1\n2\n"], "t_read_file_watch fixed record length / scalar context"; ok t_cmp [t_finish_file_watch 'watch'], ["3\n4\n","5\n6\n","7\n8\n"], "t_finish_file_watch fixed record length"; } mod_perl-2.0.9/Apache-Test/t/log_watch_for_broken_lines.t0000644000104000010010000000166112540623176024073 0ustar AdministratorsNone#!perl use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil qw/t_start_file_watch t_file_watch_for t_cmp t_catfile t_append_file/; plan tests => 5, need_fork; my $fn=t_catfile(Apache::Test::vars->{t_logs}, 'watch'); unlink $fn; t_start_file_watch 'watch'; my $pid; select undef, undef, undef, 0.1 until defined($pid=fork); unless ($pid) { # child t_append_file $fn, "\nhuhu\n4 5 6 \nblabla\n"; for(1..3) { select undef, undef, undef, 0.3; t_append_file $fn, "$_ "; } t_append_file $fn, "\nhuhu\n4 5 6 \nblabla"; exit 0; } ok t_cmp t_file_watch_for('watch', qr/^1 2 3 $/, 2), "1 2 3 \n", 'incomplete line'; my @lines=t_file_watch_for('watch', qr/^\d \d \d $/, 2); ok t_cmp @lines, 2, '2 lines'; ok t_cmp $lines[0], "huhu\n", '1st line'; ok t_cmp $lines[1], "4 5 6 \n", 'found it'; ok t_cmp t_file_watch_for('watch', qr/^\d \d \d $/, 0.3), undef, 'timeout'; waitpid $pid, 0; mod_perl-2.0.9/Apache-Test/t/more/0000755000104000010010000000000012540623176017275 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/more/01testpm.t0000644000177200010010000000025212540623176017235 0ustar SteveNone# see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testpm"; mod_perl-2.0.9/Apache-Test/t/more/02testmore.t0000644000177200010010000000025612540623176017570 0ustar SteveNone# see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testmorepm"; mod_perl-2.0.9/Apache-Test/t/more/03testpm.t0000644000177200010010000000025212540623176017237 0ustar SteveNone# see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testpm"; mod_perl-2.0.9/Apache-Test/t/more/04testmore.t0000644000177200010010000000025612540623176017572 0ustar SteveNone# see the description in t/more/all.t use strict; use warnings FATAL => qw(all); use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestMore__testmorepm"; mod_perl-2.0.9/Apache-Test/t/more/all.t0000644000177200010010000000141312540623176016330 0ustar SteveNone# skip all the Test::More tests if Test::More is # not of a sufficient version; use strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 1, need need_min_module_version(qw(Test::More 0.48_01)), need_module('mod_perl.c'); ok 1; # the t/more/ directory is testing a few things. # # first, it is testing that the special # Apache::Test qw(-withtestmore); # import works, which allows Apache::Test to use # Test::More as the backend (in place of Test.pm) # for server-side tests. # # secondly, it is testing that we can intermix # scripts that use Test.pm and Test::More as the # backend, which was a bug that needed to be worked # around in early implementations of -withtestmore. # hence the reason for the specific ordering of the # tests in t/more/. mod_perl-2.0.9/Apache-Test/t/next_available_port.t0000644000177200010010000000057012540623176020643 0ustar SteveNone# this test tests how a cookie jar can be passed (needs lwp) use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, need need_cgi, need_module('mod_env.c'); my $url = '/cgi-bin/next_available_port.pl'; my $port = GET_BODY($url) || ''; ok $port, qr/^\d+$/, "next available port number"; mod_perl-2.0.9/Apache-Test/t/ping.t0000644000177200010010000000030112540623176015546 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; plan tests => 3; my $config = Apache::Test::config(); ok $config; my $server = $config->server; ok $server; ok $server->ping; mod_perl-2.0.9/Apache-Test/t/redirect.t0000644000177200010010000000103412540623176016416 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 6, need need_module('mod_alias.c'), need_lwp; my $url = '/redirect'; # Allow request to be redirected. ok my $res = GET $url; ok ! $res->is_redirect; # Don't let request be redirected. ok $res = GET($url, redirect_ok => 0); ok $res->is_redirect; # Allow no more requests to be redirected. Apache::TestRequest::user_agent(reset => 1, requests_redirectable => 0); ok $res = GET $url; ok $res->is_redirect; mod_perl-2.0.9/Apache-Test/t/request.t0000644000177200010010000000107212540623176016307 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 9, \&need_lwp; my $url = '/index.html'; ok GET_OK $url; ok GET_RC $url; ok GET_STR $url; ok GET_BODY $url; ok HEAD_OK $url; ok HEAD_RC $url; ok HEAD_STR $url; ok GET_OK $url, username => 'dougm', password => 'XXXX'; #e.g. for auth ok GET_OK $url, Referer => $0; #add headers #post a string #ok POST_OK $url, content => 'post body data'; #or key/value pairs (see HTTP::Request::Common #ok POST_OK $url, [university => 'arizona', team => 'wildcats'] mod_perl-2.0.9/Apache-Test/t/response/0000755000104000010010000000000012540623173020166 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/response/TestMore/0000755000104000010010000000000012540623176021733 5ustar AdministratorsNonemod_perl-2.0.9/Apache-Test/t/response/TestMore/testmorepm.pm0000644000177200010010000000042612540623176022571 0ustar SteveNonepackage TestMore::testmorepm; use strict; use warnings FATAL => qw(all); use Test::More; use Apache::Test qw(-withtestmore); sub handler { plan shift, tests => 2; is (1, 1, 'called Test::More::is()'); like ('wow', qr/wow/, 'called Test::More::like()'); 0; } 1; mod_perl-2.0.9/Apache-Test/t/response/TestMore/testpm.pm0000644000177200010010000000032512540623176021704 0ustar SteveNonepackage TestMore::testpm; use strict; use warnings FATAL => qw(all); use Apache::Test; use Apache::TestUtil; sub handler { plan shift, tests => 1; ok t_cmp(1, 1, 'called Apache::Test::ok()'); 0; } 1; mod_perl-2.0.9/Apache-Test/t/sok.t0000644000104000010010000000561512540623176017323 0ustar AdministratorsNone#!perl use strict; use warnings FATAL=>'all'; use Test (); use Config (); unless ($Config::Config{useperlio}) { print "1..0 # need perlio\n"; exit 0; } Test::plan tests=>8; my $output; { package X0; use Apache::Test; local ($Test::planned, $Test::ntest, %Test::todo); local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}=""; plan tests=>3; sok {1}; sok {1}; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2$/m && $output=~/^ok 3$/m; { package Y0; use Apache::Test qw/-withtestmore/; local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}=""; plan tests=>3; sok {1}; sok {1}; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2$/m && $output=~/^ok 3$/m; { package X0; local ($Test::planned, $Test::ntest, %Test::todo); local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}="1 3"; plan tests=>3; sok {1}; sok {1}; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2 # skip skipping this subtest$/mi && $output=~/^ok 3$/m; { package Y0; local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}="1 3"; plan tests=>3; sok {1}; sok {1}; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2 # skip skipping this subtest$/mi && $output=~/^ok 3$/m; { package X0; local ($Test::planned, $Test::ntest, %Test::todo); local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}=""; plan tests=>4; sok {1}; sok {ok 1; 1} 2; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2$/m && $output=~/^ok 3$/m && $output=~/^ok 4$/m; { package Y0; local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}=""; plan tests=>4; sok {1}; sok {ok 1, "erwin"} 2; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2 - erwin$/m && $output=~/^ok 3$/m && $output=~/^ok 4$/m; { package X0; local ($Test::planned, $Test::ntest, %Test::todo); local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}="1 4"; plan tests=>4; sok {1}; sok {ok 1; 1} 2; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2 # skip skipping this subtest$/mi && $output=~/^ok 3 # skip skipping this subtest$/mi && $output=~/^ok 4$/m; { package Y0; local *STDOUT; open STDOUT, '>', \$output; local $ENV{HTTPD_TEST_SUBTESTS}="1 4"; plan tests=>4; sok {1}; sok {ok 1} 2; sok {1}; } Test::ok $output=~/^ok 1$/m && $output=~/^ok 2 # skip skipping this subtest$/mi && $output=~/^ok 3 # skip skipping this subtest$/mi && $output=~/^ok 4$/m; mod_perl-2.0.9/Apache-Test/t/TEST.PL0000644000177200010010000000156312540623176015453 0ustar SteveNoneuse strict; use lib qw(lib ../lib); use warnings FATAL => 'all'; use Apache::TestRun (); package MyTest; use vars qw(@ISA); @ISA = qw(Apache::TestRun); #subclass new_test_config to add some config vars which will #be replaced in generated config, see t/conf/extra.conf.in #'make test' runs -clean by default, so to actually see the replacements: #perl t/TEST apxs ... #cat t/conf/extra.conf #perl t/TEST -clean sub new_test_config { my $self = shift; $self->{conf_opts}->{authname} = 'gold club'; $self->{conf_opts}->{allowed_users} = 'dougm sterling'; return $self->SUPER::new_test_config; } sub bug_report { my $self = shift; print <new->run(@ARGV); mod_perl-2.0.9/Apache-Test/ToDo0000644000177200010010000001164712540623176014770 0ustar SteveNone- on linux most symbols are resolved on demand, but this is not the case with certain other platforms. so testing on linux may not detect some problems, exposed on other platforms. env var PERL_DL_NONLAZY=1 tries to resolve all symbols at load time. we could always enforce that with this patch: --- Apache-Test/lib/Apache/TestRun.pm 16 Apr 2004 20:29:23 -0000 1.166 +++ Apache-Test/lib/Apache/TestRun.pm 6 May 2004 04:43:01 -0000 @@ -643,7 +643,7 @@ } close $sh; - $original_command = "ulimit -c unlimited; $original_command"; + $original_command = "ulimit -c unlimited; PERL_DL_NONLAZY=1 $original_comma nd"; - general config: adjust Apache/TestConfig.pm not to write irrelevant httpd.conf sections (e.g. for win32, and vice versa, A-T knows exactly what mpm it needs to write the config for). Thus reducing the clutter. - winnt case: Apache/TestConfig.pm config for before Apache-2.0.50 ThreadsPerChild had to be at least as big as the number of Vhosts. This was fixed in 2.0.50. Since A-T knows the httpd version, it shouldn't start so many threads for httpd >= 2.0.50, but @MinClients@. Also add BACK_COMPAT_MARKER in the logic so when no longer support httpd < 2.0.50, this logic could be removed. - sometimes the server aborts completely after the test suite has run some of the tests (e.g. win32's server has crashed and no replacement is available), but the client part continues to run tests unaware of that problem. what would be nice to be able to detect that the server is gone and somehow abort the test suite - Custom sticky config: invalidate invalid bits of the saved config, e.g. if apxs is saved but can't be found on the filesystem. So if someone installs Apache in one location, runs A-T which saves that location, and then nukes Apache and reinstalls it into a different location we should drop the previously saved config since the path to apxs and/or httpd is now invalid. - Apache-Test doesn't run on IPv6 systems, need to change the autogeneration of httpd.conf to support IPv6. It requires a replacement of 'Listen 80' with 'Listen servername:80' Philippe posted patch here: http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=105514290024419&w=2 For now, 127.0.0.1 will be hardcoded in the Listen directive, but a better method would use this table: Apache \ OS | IPV4 | IPV6 -------------------------------------------- --enable-v4-mapped | 80 | 80 --disable-v4-mapped | can't happen | 127.0.0.1:80 To more correctly pick the right Listen flavor. - Apache-Test assumes that any core file found under t/ was generated by httpd, (and suggests the gdb invoking command) which is incorrect in some cases. For example t/TEST -config, which is run by bin/perl, may dump core as well. - consider not using the __DIE__ sighandler, but instead wrap the potentially failing code in the eval trap blocks. - print STDERR is buffered in test handlers, whereas warn() works normally. select() helps, but STDERR should be unbuffered in first place. - If something goes wrong during the ./t/TEST's phase when all the configuration files httpd.conf, etc. are generated, t/conf/apache_test_config.pm now gets written, so t/TEST -clean can work However if the problem happens during 'make test' for some reason Makefile doesn't abort on exit from test_clean target, no matter if I put exit -1, 0 or 1, and proceeds with run_tests target. probably, since __DIE__ will stop the server. to reproduce the problem during configure() apply this patch: Index: Apache-Test/lib/Apache/TestConfigPerl.pm =================================================================== RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestConfigPerl.pm,v retrieving revision 1.38 diff -u -r1.38 TestConfigPerl.pm --- Apache-Test/lib/Apache/TestConfigPerl.pm 2001/10/18 04:18:16 1.38 +++ Apache-Test/lib/Apache/TestConfigPerl.pm 2001/10/19 02:14:56 @@ -347,6 +347,7 @@ if (open $fh, $file) { my $content = <$fh>; close $fh; + require $file; if ($content =~ /APACHE_TEST_CONFIGURE/m) { eval { require $file }; warn $@ if $@; - segfaults should be trapped and: * the test routine should be aborted, since it's possible that some other test will segfault too and overwrite the core file * it'd be cool to automatically generate the backtrace with help of Devel::CoreStack and save it in the file * once we add the backtrace feature, we don't have to abort the rest of the tests, but to save each bt as "backtrace.$test_path". => this should be very useful in smoke testing * later, it'd be nice to integrate this with build/bugreport.pl, so the bug report with the backtrace and everything we want to know from user's machine, including their /etc/shadow (:-) will be automatically posted to the list. mod_perl-2.0.9/bin/0000755000104000010010000000000012540623176014542 5ustar AdministratorsNonemod_perl-2.0.9/bin/mp2bug0000644000177200010010000000223112540623176013756 0ustar SteveNone#!perl # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # use strict; use warnings FATAL => 'all'; use FindBin; use constant IS_MOD_PERL_BUILD => -e "$FindBin::Bin/../lib/mod_perl2.pm"; if (IS_MOD_PERL_BUILD) { unshift @INC, "$FindBin::Bin/../lib"; } else { eval { require mod_perl2 }; if ($@) { die "This script requires mod_perl 2.0\n", "$@"; } } require ModPerl::TestReport; ModPerl::TestReport->new(@ARGV)->run; mod_perl-2.0.9/BRANCHING0000644000177200010010000000445312540623176013315 0ustar SteveNoneThis doc explains how to create/work/re-merge svn branches ####################################### ### PREREQUISITE ### ####################################### You need to have svnmerge installed and working before you can proceed with rest of the instructions. You can find it here: http://www.orcaware.com/svn/wiki/Svnmerge.py ####################################### ### make a new branch ### ####################################### we will create a branch mybranch branch: svn copy https://svn.apache.org/repos/asf/perl/modperl/trunk \ https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch \ -m "creating mybranch" check out: svn co https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch change externals to point to the new A-T branch (if one was done) svn propedit svn:externals . initialize svnmerge tracking in the branch (if you plan to pull trunk/ changes into the branch) mybranch/ $> svnmerge init property 'svnmerge-integrated' set on '.' mybranch/ $> svn ci -F svnmerge-commit-message.txt initialize svnmerge tracking on the trunk: trunk/ $> svnmerge init https://svn.apache.org/repos/asf/perl/modperl/branches/mybranch property 'svnmerge-integrated' set on '.' mybranch/ $> svn ci -F svnmerge-commit-message.txt ############################################## ### merging changes from branch to brahch ### ############################################## Work from a clean checkout of the branch you want to merge *to* Check on the availability of changes to merge $> svnmerge avail -b -l ------------------------------------------------------------------------ r584362 | gozer | 2007-10-12 21:00:47 -0700 (Fri, 12 Oct 2007) | 1 line Changed paths: A /perl/modperl/branches/mybranch (from /perl/modperl/trunk:584361) creating mybranch ------------------------------------------------------------------------ r584363 | gozer | 2007-10-12 21:05:32 -0700 (Fri, 12 Oct 2007) | 3 lines Changed paths: M /perl/modperl/branches/mybranch Initialized merge tracking via "svnmerge" with revisions "1-584361" from https://svn.apache.org/repos/asf/perl/modperl/trunk Then merge the ones you want to merge $> svnmerge -r 584362-584363 review the changes, fix conflicts, etc Check in the merged version $> svn ci -F svnmerge-commit-message.txt mod_perl-2.0.9/build/0000755000104000010010000000000012540623176015071 5ustar AdministratorsNonemod_perl-2.0.9/build/config.pl0000644000104000010010000000043412540623176016674 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use FindBin qw($Bin); use lib "$Bin/../lib"; use ModPerl::Config (); print ModPerl::Config::as_string(); mod_perl-2.0.9/build/make_etags0000644000177200010010000000125412540623176015215 0ustar SteveNonesearch=".. ../.." for dir in $search; do if test -d "`pwd`/$dir/modperl-2.0"; then root="`pwd`/$dir" echo "root=$root" fi done #e.g. symlink to $HOME/perl/perl-current #XXX: perl has its own (more robust) TAGS generator: emacs/ptags perl_src=$root/perl/ #XXX: apache has its own: build/MakeEtags apache_src=$root/httpd-2.0/ modperl_src=$root/modperl-2.0/src/ xs_src=$root/modperl-2.0/xs cd $root/modperl-2.0 rm -f src/modules/perl/etag_files for dir in $apache_src $modperl_src $perl_src $xs_src; do echo $dir find $dir -follow -name '*.[ch]' >> src/modules/perl/etag_files done (cd src/modules/perl && etags `cat etag_files`) rm -f src/modules/perl/etag_files mod_perl-2.0.9/build/make_rpm_spec0000644000104000010010000000770212540623176017627 0ustar AdministratorsNone#!perl use strict; require "lib/mod_perl2.pm"; my $dev_build = is_dev_build(); my $release = $dev_build ? svn_release() : 1; my $version = $mod_perl2::VERSION_TRIPLET; my $path = $dev_build ? "mod_perl-$version-$dev_build" : "mod_perl-$version"; my $tarname = "$path.tar.gz"; my $httpd_ver = min_httpd_ver(); open(my $spec, ">mod_perl.spec") || die "Can't open mod_perl.spec $!"; print $spec <<"EOF"; %define _version $mod_perl2::VERSION_TRIPLET %define _release $release %define _source http://apache.org/dist/perl/$tarname %define _dirname $path %define _httpd_min_ver $httpd_ver %define _perl_min_ver 5.6.1 EOF print $spec <<'EOF'; Name: mod_perl Version: %{_version} Release: %{_release} Summary: An embedded Perl interpreter for the Apache Web server Group: System Environment/Daemons License: Apache License, Version 2.0 Packager: mod_perl Development Team URL: http://perl.apache.org/ Source: %{_source} BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: httpd >= %{_httpd_min_ver} BuildRequires: perl >= %{_perl_min_ver} BuildRequires: httpd-devel >= %{_httpd_min_ver} BuildRequires: apr-devel, apr-util-devel %description Mod_perl incorporates a Perl interpreter into the Apache web server, so that the Apache web server can directly execute Perl code. Mod_perl links the Perl runtime library into the Apache web server and provides an object-oriented Perl interface for Apache's C language API. The end result is a quicker CGI script turnaround process, since no external Perl interpreter has to be started. Install mod_perl if you're installing the Apache web server and you'd like for it to directly incorporate a Perl interpreter. %package devel Summary: Files needed for building XS modules that use mod_perl Group: Development/Libraries Requires: mod_perl = %{version}-%{release}, httpd-devel %description devel The mod_perl-devel package contains the files needed for building XS modules that use mod_perl. %prep %setup -q -n %{_dirname} %build CFLAGS="$RPM_OPT_FLAGS" %{__perl} Makefile.PL /dev/null ';' %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc Changes LICENSE README* STATUS SVN-MOVE docs/ %{_bindir}/* %{_libdir}/httpd/modules/mod_perl.so %{perl_vendorarch}/auto/* %{perl_vendorarch}/Apache/ %{perl_vendorarch}/Apache2/ %{perl_vendorarch}/Bundle/ %{perl_vendorarch}/APR/ %{perl_vendorarch}/ModPerl/ %{perl_vendorarch}/*.pm %{_mandir}/man?/* %files devel %defattr(-,root,root,-) %{_includedir}/httpd/* %changelog EOF sub min_httpd_ver { my $min_httpd_ver; open my $mk, 'Makefile.PL'; while (<$mk>) { if (/MIN_HTTPD_VERSION_DYNAMIC\s*=>\s*'(.*)'/) { $min_httpd_ver = $1; last; } } close $mk; $min_httpd_ver; } sub svn_release { open my $svn, "<.svn/entries"; my $revision; while (<$svn>) { if (/revision="(\d+)"/) { $revision = $1; last; } } close $svn; $revision; } sub is_dev_build { my $dev; open my $fh, 'Changes'; while (<$fh>) { if (/^=item.*-(dev|rc\d+)/) { $dev = $1; last; } last if /^=item/; } close $fh; $dev; } mod_perl-2.0.9/build/source_scan.pl0000644000104000010010000000122012540623176017725 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- #requires C::Scan 0.75+ use lib qw(lib Apache-Test/lib); use strict; use Apache2::ParseSource (); use ModPerl::ParseSource (); use ModPerl::FunctionMap (); use ModPerl::WrapXS (); #XXX: we should not need to require this here my $p = Apache2::ParseSource->new(prefixes => ModPerl::FunctionMap->prefixes, @ARGV); $p->parse; $p->write_constants_pm; $p->write_functions_pm; $p->write_structs_pm; $p = ModPerl::ParseSource->new(@ARGV); $p->parse; $p->write_functions_pm; mod_perl-2.0.9/build/win32_fetch_apxs0000644000104000010010000000657012540623176020172 0ustar AdministratorsNone#!C:/Perl/bin/perl ################################################################### # apxs, apr-config, and apu-config are Apache utilities used # # to both get certain configuration information and also to # # assist in building Apache modules. These utilities have not # # yet been officially ported to Win32. The following will fetch # # and install a development version of these scripts which can # # be used in both mod_perl 2 and Apache C modules. # # # # Please report problems in installing or using these utilties to # # Randy Kobes # ################################################################### use strict; use warnings; use Getopt::Long; use File::Spec::Functions; use File::Path; use ExtUtils::MakeMaker qw(prompt); use Cwd; die "This is intended for Win32" unless ($^O =~ /Win32/i); my $prefix; GetOptions( 'with-apache2=s' => \$prefix); unless ($prefix and -d $prefix) { die << 'END'; I could not determine a valid Apache2 directory. Please run this script specifying the option --with-apache2=/Path/to/Apache2 where /Path/to/Apache2 is the location of your installed Apache2 top-level directory. END } exit 0 if (-e catfile($prefix, 'bin', 'apxs.bat')); print << 'END'; ---------------------------------------------------------------------- I could not find an apxs utility, which will be used in certain parts of the build, if present. This utility (and the apr-config and apu-config utilities) have not yet been ported to Apache2 on Win32, but a development port is available. You can either - ignore installing apxs by answering "no" at the prompt below (mod_perl will still build), - install apxs by answering "yes" at the prompt below, - quit now, run the "fetch_win32_apxs.pl" script in the build/ directory to fetch and install the utilities, and then rebuild mod_perl, - quit now, and from http://apache.org/dist/perl/win32-bin/ grab apxs_win32.tar.gz; when unpacked, this contains a README explaining how to install the utilities. Afterwards, rebuild mod_perl. ---------------------------------------------------------------------- END my $ans = prompt('Install apxs now?', 'yes'); exit 0 unless $ans =~ /^y/i; my $prog; for my $trial(qw(Apache.exe httpd.exe)) { next unless -e File::Spec->catfile($prefix, 'bin', $trial); $prog = $trial; last; } die "Could not determine the Apache2 binary name" unless $prog; require LWP::Simple; LWP::Simple->import(qw(is_success getstore)); my $file = 'apxs_win32.tar.gz'; unless (-e $file) { my $remote = 'http://apache.org/dist/perl/win32-bin/' . $file; print "Fetching $remote ... "; die "Download of $remote failed" unless (is_success(getstore($remote, $file))); print " done!\n"; } require Archive::Tar; my $cwd = getcwd; my $dir = 'apxs'; my $arc = Archive::Tar->new($file, 1); $arc->extract($arc->list_files()); die "Unpacking $file failed" unless (-d $dir); print "chdir $dir\n"; chdir $dir or die "chdir to $dir failed: $!"; my @args = ($^X, 'Configure.pl', "--with-apache2=$prefix", "--with-apache-prog=$prog"); print "@args\n"; system(@args) == 0 or die "system @args failed: $?"; chdir $cwd; #rmtree($dir, 1, 1) or warn "rmtree of $dir failed: $!"; #print "unlink $file\n\n"; #unlink $file or warn "unlink of $file failed: $!"; mod_perl-2.0.9/build/xs_generate.pl0000644000104000010010000000050412540623176017731 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use lib qw(lib Apache-Test/lib); use Apache::TestConfig (); # needed to resolve circular use dependency use ModPerl::WrapXS (); my $xs = ModPerl::WrapXS->new; $xs->generate; mod_perl-2.0.9/Changes0000644000104000010010000033224712540623176015300 0ustar AdministratorsNone=head1 NAME Changes - Apache mod_perl changes logfile =head1 CHANGES all changes without author attribution are by Doug MacEachern Also refer to the Apache::Test changes log file, at Apache-Test/Changes =over 3 =item 2.0.9 June 18, 2015 Add note to README about MP_INLINE problem when building with GCC 5. [Niko Tyni ] Fix t/api/aplog.t for apr-1.5.2. [Steve Hay] Note that Perl 5.22.x is currently not supported. This is logged as CPAN RT#101962 and will hopefully be addressed in 2.0.10. [Steve Hay] Fix unthreaded build, which was broken in 2.0.9-rc2. [Steve Hay] Remove PerlInterpScope. This has not been working properly with threaded MPMs with httpd-2.4.x and the use-case of this directive was questionable. [Jan Kaluza] Allow running the test suite with httpd-2.4.x when mod_access_compat is not loaded. [Steve Hay] Add support for Apache httpd-2.4.x. [Torsten Foertsch, Jan Kaluza, Steve Hay, Gozer] Don't call modperl_threaded_mpm() et al. from XS code. Fixes Debian Bug #765174. [Niko Tyni ] Make sure modperl_interp_select uses r->server rather than the passed s parameter to find the interpreter pool to pull an interpreter from. This fixes an issue with vhosts with a separate interpreter pool and runtime dir-config merges that used to pull the interpreter from the wrong pool. [Torsten Foertsch] PerlInterpScope is now more advisory. Using $(c|r)->pnotes will bind the current interpreter to that object for it's lifetime. $(c|r)->pnotes_kill() can be used to prematurely drop pnotes and remove this binding. [Torsten Foertsch] Now correctly invokes PerlCleanupHandlers, even if they are the only handler type configured for that request [Torsten Foertsch] For threaded MPMs, change interpreter managment to a new, reference-counted allocation model. [Torsten Foertsch] Expose modperl_interp_pool_t via ModPerl::InterpPool, modperl_tipool_t via ModPerl::TiPool and modperl_tipool_config_t via ModPerl::TiPoolConfig [Torsten Foertsch] Expose modperl_interp_t via ModPerl::Interpreter [Torsten Foertsch] Fix t/compat/apache_file.t on Windows. Apache::File->tmpfile() wants TMPDIR or TEMP from the environment, or else defaults to /tmp. The latter is no good on Windows, so make sure the environment variables are passed through. (TEMP should be set to something suitable on Windows.) [Steve Hay] Fix t/api/err_headers_out.t with HTTP::Headers > 6.00. [Rolando ] Fix the build with VC++ and dmake (rather than nmake) on Windows. The Makefile generated by Apache2::Build uses shell commands for the manifest file, but neglected to tell dmake to use the shell. [Steve Hay] Don't write an 'rpm' target into the Makefile on Windows. It isn't relevant on Windows, and the (hard-coded, not MakeMaker-generated) recipe group has syntax which dmake doesn't understand. [Steve Hay] =item 2.0.8 April 17, 2013 Perl 5.16.3's fix for a rehash-based DoS makes it more difficult to invoke the workaround for the old hash collision attack, which breaks mod_perl's t/perl/hash_attack.t. Patch from rt.cpan.org #83916 improves the fix previously applied as revision 1455340. [Zefram] On Perl 5.17.6 and above, hash seeding has changed, and HvREHASH has disappeared. Patch to update mod_perl accordingly from rt.cpan.org #83921. [Zefram] Restore build with Perl 5.8.1, 5.8.2 etc: take care to use $Config{useithreads} rather than $Config{usethreads}, and supply definitions of Newx and Newxz as necessary. [Steve Hay] On Perl 5.17.9, t/apache/read2.t fails because an "uninitialized value" warning is generated for the buffer being autovivified. This is because the sv_setpvn() that's meant to vivify the buffer doesn't perform set magic; the warning is generated by the immediately following SvPV_force(). Patch to fix this from rt.cpan.org #83922. [Zefram] Fix t/perl/hash_attack.t to work with Perl 5.14.4, 5.16.3 etc, which contain a fix for CVE-2013-1667 (memory exhaustion with arbitrary hash keys). This resolves rt.perl.org #116863, from where the patch was taken. [Hugo van der Sanden] use APR::Finfo instead of Perl's stat() in ModPerl::RegistryCooker to generate HTTP code 404 even if the requested filename contains newlines [Torsten] Remove all uses of deprecated core perl symbols. [Steve Hay] Add branch release tag to 'make tag' target. [Phred] =item 2.0.7 June 5, 2012 Fix breakage caused by removal of PL_uid et al from perl 5.16.0. Patch from rt.cpan.org #77129. [Zefram] =item 2.0.6 April 24, 2012 Preserve 5.8 compatibility surrounding use of MUTABLE_CV [Adam Prime] Move code after declarations to keep MSVC++ compiler happy. [Steve Hay] Adopt modperl_pcw.c changes from httpd24 branch. [Torsten Foertsch] Pool cleanup functions must not longjmp. Catch these exceptions and turn them into warnings. [Torsten Foertsch] Fix a race condition in our tipool management. See http://www.gossamer-threads.com/lists/modperl/dev/104026 Patch submitted by: SalusaSecondus Reviewed by: Torsten Foertsch Ensure that MP_APXS is set when building on Win32 with MP_AP_PREFIX, otherwise the bundled Reload and SizeLimit builds will fail to find a properly configured Test environment. [Steve Hay] Fix a few REFCNT bugs. Patch submitted by: Niko Tyni Reviewed by: Torsten Foertsch Correct the initialization of the build config in ModPerl::MM. The global variable was only being set once on loading the module, which was before Apache2::BuildConfig.pm had been written, leading to cwd and MP_LIBNAME being unset when writing the Reload and SizeLimit makefiles. [Steve Hay] Discover apr-2-config from Apache 2.4 onwards. [Gozer] Apache 2.4 and onwards doesn't require linking the MPM module directly in the httpd binary anymore. APXS lost the MPM_NAME query, so we can't assume a given MPM anymore. Introduce a fake MPM 'dynamic' to represent this. [Torsten Foertsch, Gozer] Perl 5.14 brought a few changes in Perl_sv_dup() that made a threaded apache segfault while cloning interpreters. [Torsten Foertsch] PerlIOApache_flush() and mpxs_Apache2__RequestRec_rflush() now no longer throw exceptions when modperl_wbucket_flush() fails if the failure was just a reset connection or an aborted connection. The failure is simply logged to the error log instead. This should fix cases of httpd.exe crashing when users press the Stop button in their web browsers. [Steve Hay] Fixed a few issues that came up with LWP 6.00: - t/response/TestAPI/request_rec.pm assumes HTTP/1.0 but LWP 6 uses 1.1 - t/api/err_headers_out.t fails due to a bug somewhere in LWP 6 - t/filter/TestFilter/out_str_reverse.pm sends the wrong content-length header [Torsten Foertsch] Bugfix: Apache2::ServerUtil::get_server{description,banner,version} cannot be declared as perl constants or they won't reflect added version components if Apache2::ServerUtil is loaded before the PostConfig phase. Now, they are ordinary perl functions. [Torsten Foertsch] Check for the right ExtUtils::Embed version during build [Torsten Foertsch] Take a lesson from rt.cpan.org #66085 and pass LD_LIBRARY_PATH if mod_env is present. Should prevent test failures on some platforms. [Fred Moyer] =item 2.0.5 February 7, 2011 The mod_perl PMC dedicates this release of mod_perl to Randy Kobes, who passed away in September 2010. Randy was a member of the mod_perl project management committee and a co-author of the mod_perl Developer's Cookbook. His work helped many Windows mod_perl users. His work with ppm files, and Win32 perl users will be sorely missed. He was kind, bright, and always willing to lend a hand on the mod_perl user's list. Prepare modperl for the upcoming perl 5.14 [Torsten Foertsch] Add lib/ModPerl/MethodLookup.pm to MANIFEST via lib/ModPerl/Manifest.pm RT #48103 reported by MARKLE@cpan.org [Fred Moyer] PerlIOApache_write() now throws an APR::Error object, rather than just a string error, if modperl_wbucket_write() fails. [Steve Hay] Authentication tests fail with LWP 5.815 and later [Doug Schrag] Concise test won't perform unless StatusTerse is set to ON [Doug Schrag] Look for a usable apxs in $ENV{PATH} if all other options fail, then prompt the user for one. [Phred] Work around bootstrap warnings when Apache2::BuildConfig has not been created yet. [Phred] Remove Apache::test compatibility (part of mod_perl 1.2.7), that code causes build issues and is 4 versions out of date. [Phred] Make sure perl is built either with multiplicity and ithreads or without both [Theory, Torsten] Support for "install_vendor" and "install_site" make targets [Torsten] Run tests on bundled pure perl Apache::* modules [Gozer, Phred] Implement a mini-preprocess language for map-files in xs/maps. [Torsten Foertsch] Implement APR::Socket::fileno [Torsten Foertsch] Export PROXYREQ_RESPONSE, a missing PROXYREQ_* constant [Gozer] Make sure standard file descriptors are preserved by the perl-script handler [Torsten Foertsch] Fix the filter init handler attribute check in modperl_filter_resolve_init_handler() [Torsten Foertsch] Make sure buffer is a valid SV in modperl_filter_read() [Torsten Foertsch] Move modperl_response_finish() out of modperl_response_handler_run in mod_perl.c [Torsten Foertsch] "MODPERL_INC= now correctly supported as an argument to Makefile.PL" [Torsten Foertsch] Fix an XSS issue in Apache2::Status reported by Richard J. Brain . [Torsten Foertsch] Add NOTICE file to the distribution. [Joe Schaefer] Make sure Apache2::RequestIO::read doesn't clear the buffer on end of file and handle negative offsets and offsets that are larger than the current string length. [Torsten Foertsch] Fix a problem that could make APR::XSLoader and Apache2::XSLoader load the wrong shared library. [Torsten Foertsch] Fix compilation when using a non-threaded APR. [Gozer, Philip M. Gollucci] Make sure mod_perl's own ChildInitHandlers are run before user supplied ones. This fixes the incorrectly reported value of $$ at ChildInit time [Gozer] =item 2.0.4 April 16, 2008 Fix $r->location corruption under certain conditions [Gozer] Fix a crash when spawning Perl threads under Perl 5.10 [Gozer] Fix erratic behaviour when filters were used with Perl 5.10 [Gozer] Fix problems with redefinitions of perl_free as free and perl_malloc as malloc on Win32, as described at http://marc.info/?l=apache-modperl&m=119896407510526&w=2 [Tom Donovan] Fix a crash when running a sub-request from within a filter where mod_perl was not the content handler. [Gozer] Refactor tests to use keepalives instead of same_interp [Gozer, Phred] Apache2::Reload has been moved to an externally maintained CPAN distribution [Fred Moyer ] PerlCleanupHandler are now registered with a subpool of $r->pool, instead of $r->pool itself, ensuring they run _before_ any other $r->pool cleanups [Torsten Foertsch] Fix a bug that would prevent pnotes from being cleaned up properly at the end of the request [Torsten Foertsch] On Win32, embed the manifest file, if present, in mod_perl.so, so as to work with VC 8 [Steve Hay, Randy Kobes] Expose apr_thread_rwlock_t with the APR::ThreadRWLock module [Torsten Foertsch] Don't waste an extra interpreter anymore under threaded MPMs when using a modperl handler [Torsten Foertsch] Fix a bug that could cause a crash when using $r->push_handlers() multiple times for a phase that has no configured handlers [Torsten Foertsch] Catch up with some httpd API changes 2.2.4: The full server version information is now included in the error log at startup as well as server status reports, irrespective of the setting of the ServerTokens directive. ap_get_server_version() is now deprecated, and is replaced by ap_get_server_banner() and ap_get_server_description(). [Jeff Trawick] 2.3.0: ap_get_server_version() has been removed. Third-party modules must now use ap_get_server_banner() or ap_get_server_description(). [Gozer] fixed Apache2::compat Apache2::ServerUtil::server_root() resolution issues [Joshua Hoblitt] *) SECURITY: CVE-2007-1349 (cve.mitre.org) fix unescaped variable interprolation in regular expression [Randal L. Schwartz , Fred Moyer ] Make $r->the_request() writeable [Fred Moyer ] fix ModPerl::RegistryCooker::read_script to handle all possible errors, previously there was a case where Apache2::Const::OK was returned on an error. [Eivind Eklund ] a minor compilation warning resolved in modperl_handler_new_from_sv [Stas] a minor compilation warning resolved in modperl_gtop_size_string [Stas] Prevent direct use of _deprecated_ Apache2::ReadConfig in sections with httpd Alias directives from incorrectly generating 'The Alias directive in xxxxx at line y will probably never match' messages. [Philip M. Gollucci ] Prevent Apache2::PerSections::symdump() from returning invalid httpd.conf snippets like 'Alias undef' [Philip M. Gollucci ] Require B-Size 0.9 for Apache2::Status which fixes Can't call method "script_name" on an undefined value [Philip M. Gollucci ] -march=pentium4 or anything with an = in it in CCFLAGS or @ARGV that gets passed to xs/APR/APR/Makefile.PL broke the @ARGV parsing. I.E. FreeBSD port builds when users had CPUTYPE set in /etc/make.conf. [Philip M. Gollucci ] Fixes to get bleed-ithread (5.9.5+) to comile again. [Philip M. Gollucci ] =item 2.0.3 November 28, 2006 Prevent things in %INC that are not stat() able from breaking Apache2::Status 'Loaded Modules' under fatal warnings. [Philip M. Gollucci ] When using MP_AP_PREFIX on WIN32 make sure that its a valid directory. [Nikolay Ananiev ] Fix bug concerning 'error-notes' having no value on errordocument redirect. [Guy Albertelli II ] Multi-line $PerlConfig is now working [Gozer] PerlOptions None was previously incorrectly reported as invalid inside or blocks. [Philip M. Gollucci] Require B::Size 0.07 and B::TerseSize 0.07 for Apache2::Status [Philip M. Gollucci] Apache2::Status was expecting B::TerseSize to return an op count for things that it didn't causing requests like http://localhost/perl-status/main?noh_b_package_size to cause 405s [Philip M. Gollucci] Updates for Win32 to allow building and testing on Apache/2.2: - use httpd.exe as the Apache binary name when installing apxs - use new apr library names (libapr-1.lib and libaprutil-1.lib) [Randy Kobes] Make sure that additional library paths are included in the build flags so that mod_perl will use the same versions of libraries that APR does. [Mike Smith ] Added $r->connection->pnotes, identical to $r->pnotes, but for the entire lifetime of the connection [Geoffrey Young, Gozer] Fixed problems with add_config() and thread-safety: [Gozer] - $s->add_config is not allowed anymore after server startup - $r->add_config can only affect configuration for the current request, just like .htaccess files do Make sure that LIBS and other MakeMaker command line flags are not ignored by the top level Makefile.PL and xs/APR/APR/Makefile.PL [Stas] Corrected a typo that would cause the corruption of $), the effective group id as Perl sees it [Gozer] Added support for httpd-2.2's new override_opts in Apache2::Access. Calls to add_config() now accept an override_opts value as the 4th argument. [Torsten Foertsch , Gozer] Fix 'PerlSwitches +inherit' that got broken somewhere along the way to 2.0. You can also use 'PerlOptions +InheritSwitches' for the same result. [Gozer] Add perl API corresponding to User and Group directives in httpd.conf: Apache2::ServerUtil->user_id and Apache2::ServerUtil->group_id [Stas] Apache2::Reload now first unloads all modified modules before trying to reload them. This way, inter-module dependencies are more likely to be correctly satisfied when reloaded [Javier Uruen Val , Gozer] $r->add_config() can now take an optionnal 3rd argument that specifies what pseudo the configuration is evaluated into [Torsten Foertsch ] remove -DAP_HAVE_DESIGNATED_INITIALIZER and -DAP_DEBUG from MP_MAINTAINER mode to avoid collisions [Joe Orton] Back out r280262 which was causing Apache2::Reload to misbehave. [JT Smith ] Perl_do_open/close fixes to make mod_perl 2.0 compile with blead-perl@25889+ (5.9.3+) [Stas] Added Apache2::PerlSections->server, returning the server into which the section is defined [Gozer] Require B::Size and B::TerseSize v0.06 for Apache2::Status options StatusTerse and StatusTerseSize which has now been updated to support the new mod_perl2 api post RC5. [Philip M. Gollucci] When using Apache2::PerlSections->dump, the configuration would print out in the correct order, but when the configuration was passed off to Apache the ordering was lost. [Scott Wessels ] =item 2.0.2 - October 20, 2005 add :proxy import tag to Apache2::Const which exposes new constants PROXYREQ_NONE, PROXYREQ_PROXY, and PROXYREQ_REVERSE [Geoffrey Young] $0 Fixes : [Gozer] - Setting $0 works on Linux again - HP-UX and *BSDes show the correct process name instead of '-e' Fix a critical but trivial bug that would cause MP_MAINTAINER=1 or MP_TRACE=1 builds to fail if not building against a threaded APR. Functions such as apr_os_thread_current() would not be linked in, but were expected to be. [Philip M. Gollucci] Add the output of ldd(unix/cygwin) and otool -L (darwin) for httpd to the mp2bug report script. [Philip M. Gollucci] Prevent tools such as Apache2::Status's Loaded Modules screen from displaying erroneous information about mod_perl.pm being loaded. [Stas, Philip M. Gollucci] Correctly set the version of ModPerl::MethodLookup, previously, it was not set because of the way it was Generating via ModPerl::WrapXS. [Philip M. Gollucci] Improve the detection of whether or not we are in an mp2 build tree. This allows usage of ExtUtils::MakeMaker options such as PREFIX to not break the probe of mp2 build trees. [Stas, Philip M. Gollucci] Add support for the newer Smaps (/proc/self/statm) on Linux systems that support it (i.e. linux-2.6.13-rc4-mm1) to accurately count the amount of shared memory. [Torsten Foertsch ] On cygwin some dlls might happen to be with identical base addresses and if you try to load both of them you'll get an error and you'll have to use the rebase utility to fix them. this fix should prevent this. [Nikolay Ananiev ] Fix an undefined warning in DSO builds when not using MP_APXS. [Nikolay Ananiev ] When running Makefile.PL with the MP_MAINTAINER=1 option add -Wdeclaration-after-statement if we are using gcc version 3.3.2 or higher and its not already part of the ccopts. [Philip M. Gollucci, Gozer] Several fixes to Apache2::Status [Philip M. Gollucci] When using Apache2::Reload and ReloadDebug is set to 'On', sort the output alphabetically [Philip M. Gollucci] croak in case a filter returns DECLINED after calling $f->read (as it is not supposed to happen) [Stas] another round of cygwin fixes [Nikolay Ananiev ] Multiple fixes to make mod_perl 2.0 work with blead-perl (5.9.3+) [Stas] t/modules/reload.t would fail if run more than 3 times, breaking smokes [Gozer] filter flushing now doesn't croak on connection reset (ECONNRESET/ECONNABORTED), but just logs the event on the 'info' level. [Stas] RPM Friendly builds : [Gozer] - make dist tarballs can now be built directly into RPMs with rpmbuild - Added a new target 'make rpm' to directly build rpms from a checkout =item 2.0.1 - June 17, 2005 B::Terse has problems with XS code, so adjust Apache::Status to eval {} the code doing Syntax Tree Dump: syntax and execution order options [Stas] Fix a broken regexp in Apache2::Build::dir() on win32 that would incorrectly attempt to fully-qualify paths like c:/some/path [Nikolay Ananiev ] Fix the "No library found" warnings when building on win32 without apxs and MP_AP_PREFIX [Nikolay Ananiev ] The pure-perl ModPerl::Util::unload_package implementation was accidently deleting sub-stashes [Gozer] If running Makefile.PL unnatended (STDIN isn't a terminal or MP_PROMPT_DEFAULT=1), break out of potentially infinite prompt loops [Gozer] fix ModPerl::TestReport used by t/REPORT and mp2bug to use ExtUtils::MakeMaker's MM->parse_version to get the interesting packages version number, w/o trying to load them (which may fail if the environment is not right) [Stas] fix a bug in ModPerl::RegistryCooker: now stripping __(END|DATA)__ only at the beginning of the line [Stas] APR::Base64 : [Torsten Foertsch ] - fix encode_len() to return the length without accounting for the terminating '\0' as the C API does. - fix encode() to create the string of the correct length (previously was creating one too many) in mod_perl callbacks merge error-notes entries rather than store just the newest error [Mark ] Expose Apache2::Const::EXEC_ON_READ (added to the :override group) [Stas] Fix a bug in custom directive implementation, where the code called from modperl_module_config_merge() was setting the global context after selecting the new interpreter which was leading to a segfault in any handler called thereafter, whose context was different beforehand. [Stas] =item 2.0.0 - May 20, 2005 fix global anon_cnt double-initialization bug that was causing startup segfaults on OSX. [Gozer] fix the ap_install target in the top-level Makefile (used for static build) [Stas] Reintroduce a pure-Perl version of ModPerl::Util::unload_package() The problematic XS version is now called unload_package_xs() and not used by default [Gozer] More APR::Status wrappers: [Stas, Randy Kobes] - is_EOF - is_ECONNABORTED - is_ECONNRESET - is_TIMEUP make sure that the build picks up the include directories based on the apxs queries and only search the httpd source if $self->{MP_AP_PREFIX} was set. Earlier it was always picking the headers from the httpd source if it was available, which was resulting in the wrong headers if the installed httpd was different than the source that was found [Stas] introduce ModPerl::RegistryPrefork and ModPerl::PerlRunPrefork, which behave the same as ModPerl::Registry and ModPerl::PerlRun, respectively, but chdir to the script's directory like mod_cgi does. These two new handlers will refuse to load under threaded MPMs where chdir can't be used as it will affect all running threads [Stas] ModPerl::RegistryCooker::chdir_file_normal() now chdirs to the current script's directory or the specified directory as an argument, as it was planned in first place. Therefore switch ModPerl::Registry and ModPerl::PerlRun to us NOP for this method call. If chdir_file is mapped to chdir_file_normal(), then run() and convert_script_to_compiled_handler() now call chdir to the script's directory and at before returning go back to the server root. [Stas] prevent undef warnings in catfile() calls in Apache2::Build when called from the ModPerl-Registry tree [Stas] fix modperl_brigade_dump to use apr_file_printf() instead of fprintf(), which doesn't work everywhere [Stas] Fix a warning triggered by `ln` on Cygwin, when running perl Makefile.PL for a second time without previously running make clean. [Nikolay Ananiev ] When compiling a static mod_perl and MP_AP_CONFIGURE="--with-apr=/some/path" argument is given, Apache will use the apr-config at the given path, but mod_perl was using the default at "srclib/apr/.libs". Fix that [Nikolay Ananiev ] Show MP_APU_CONFIG as an argument to Makefile.PL in the Usage menu. [Nikolay Ananiev ] Makefile.PL: fix the pre-rename mp2 install diagnostics code, to use the mp version of 1.999xx and not 1.999_xx, as the latter is unsuitable for numerical comparison, also fix the name of the reported conflicting directory [Stas]. add APR::Status::is_(EACCES|ENOENT), and use in ModPerl::RegistryCooker to return, as appropriate, Apache2::Const::(FORBIDDEN|NOT_FOUND), based on $@. Also remove a check in modperl_slurp_filename of src/modules/perl/modperl_util.c to enable $@ to be set when opening or reading a file fails. This fixes a bug on Win32, revealed in 404.t and redirect.t of the ModPerl-Registry tests, as reported by Steve Hay and Markus Wichitill [Stas, Randy Kobes] link Apache2::* and ModPerl::* to mod_perl.a and DynaLoader.a, but -lmod_perl and -lDynaLoader don't work, and we can't supply the full paths, because MakeMaker doesn't allow this. I workaround this by making a symlink to mod_perl.a (called libmod_perl.a) and copy DynaLoader.a to libDynaLoader.a (I don't create a symlink, because, when running make clean, the real DynaLoader.a may get deleted). The APR::* extensions are not affected, because in both cases we link them against aprext. Also other small fixes are added. [Nikolay Ananiev ] =item 1.999_23 - May 3, 2005 fix Apache2::Build::dynamic_link_MSWin32 to generate a new line after dynamic_link code in Makefile [Nikolay Ananiev ] fix a warning in Apache2::Build::build_config() when building with MP_STATIC_EXTS=1 [Nikolay Ananiev ] improving DSO support on cygwin. The problem with cygwin is that it behaves like windows (it's a posix layer over windows after all). That's why we need to supply all symbols during linking time just like on win32, by adding -lapr-0 -laprutil-0 and -lhttpd. On windows, Apache supplies all the three libraries and it's easy to link, but on cygwin apache doesn't play nice and doesn't supply libhttpd. This change adds libapr and libaprutil. [Nikolay Ananiev ] improve the diagnostics when detecting mp2 < 1.999022, tell the user which files and/or dirs need to be removed [Stas] restore the DESTDIR support partially nuked by the apache2 rename branch [Torsten Förtsch ] add APR::Status to provide functions corresponding to the APR_STATUS_IS_* macros of apr_errno.h, especially those composites like APR_STATUS_IS_EAGAIN(s) which are satisfied by more than one specific error condition. Presently only APR_STATUS_IS_EAGAIN is provided [Randy Kobes] fix the generation of the manpages for .pm files from sub-projects like ModPerl-Registry (previously was creating manpage files like .::ModPerl::PerlRun.3) [Stas] fix the pod2man'ification part of 'make install' (using POD2MAN_EXE instead of POD2MAN Makefile macro) [Stas] =item 1.999_22 - April 14, 2005 ******************** IMPORTANT ******************** this version of mod_perl is completely incompatible with prior versions of mod_perl, both 1.XX and 1.99_XX. Please read the below changes carefully. *************************************************** remove MP_INST_APACHE2 installation option and Apache2.pm - all mod_perl related files will now be installed so they are visible via standard @INC. also, refuse to install over mod_perl 2 versions less than 1.999_22. [Geoffrey Young] s/Apache::/Apache2::/g and s/mod_perl/mod_perl2/g in all module APIs. so, Apache::RequestRec is now Apache2::RequestRec, Apache::compat is now Apache2::compat, and so on. [joes] move all Apache:: constants to Apache2::Const and all APR:: constants to APR::Const. for example, Apache:OK is now Apache2::Const::OK and APR::SUCCESS is now APR::Const::SUCCESS. [Geoffrey Young] add $ENV{MOD_PERL_API_VERSION} as something that clearly distinguishes which mod_perl version is being used at request time. [Geoffrey Young] rename Apache->request() to Apache2::RequestUtil->request(), and Apache->server() to Apache2::ServerUtil->server() [Geoffrey Young] fix Apache2::Status which was bailing out on trying to load modules with dev versions like 2.121_02 [Stas] When parsing Makefile.PL MP_* options, handle correctly the MP_FOO=0 entries [Philip M. Gollucci ] init the anonsub hash for base perl and each vhost +Parent (previously was init'ed only for the base perl) [Stas] fix a bug when a non-threaded perl is used and anonymous sub is pushed at the server startup (the CV wasn't surviving) [Stas] Make sure that CPAN shell doesn't triple over usage of $ExtUtils::MakeMaker::VERSION [Randy Kobes] Apache2::RequestRec->new now sets $r->request_time [Stas] remove CGI.pm and Apache::Request dependencies from Apache2::Status since they weren't used at all [Geoffrey Young] Fixes for Apache2::Reload's touchfile feature (return Apache2::Const::OK instead of 1) [Chris Warren ] cygwin fixes: [Nikolay Ananiev ] - doesn't like XS wrapper starting with 'static' - need to compile everything with -DCYGWIN ModPerl::RegistryCooker API change: s/rewrite_shebang/shebang_to_perl/ the new API now returns the string to prepend before the rest of the script, instead of rewriting the content, which is both faster and doesn't mislead the perl debugger [Dominique Quatravaux ] Starting from ExtUtils::MakeMaker 6.26 went back to pm_to_blib target from pm_to_blib.ts introduced in 6.22, so needed to fix the glue_pod target, so install will work correctly [Stas] Syntax errors in sections were not correctly caught and reported. [Gozer] when building mp2 EU::MM looks into Apache-Test/MANIFEST and complains about the missing Apache-Test/META.yml (which is indeed not included in the modperl package due to the PAUSE problems of dealing with more than one META.yml. Solution: Exclude Apache-Test/MANIFEST from mod_perl distribution package. [Stas] ModPerl::Registry no longer checks for -x bit (we don't executed scripts anyway), and thus works on acl-based filesystems. Also replaced the -r check with a proper error handling when the file is read in. [Damon Buckwalter ] Apache2::RequestUtil::slurp_filename now throws an APR::Error exception object (before it was just croaking). [Stas] fix APR::Error's overload of '==' (it was always returning true before), and add the corresponding '!=' [Stas] if $r->document_root was modified, restore it at the end of request [joes] Apache2::ServerRec method which set the non-integer fields in the server_rec, now copy the value from the perl scalar, so if it changes or goes out of scope the C struct is not affected. Using internal perl variables to preserve the value, since using the server pool to allocate the memory will mean a memory leak [Stas] add the escape_url entry in the ModPerl::MethodLookup knowledgebase [Stas] Apache2::SubProcess::spawn_proc_prog now can be called in a void context, in which case all the communication std pipes will be closed [Stas] fix a bug in $r->document_root, which previously weren't copying the new string away [Stas] introduce a new build option MP_AP_DESTDIR to aid package builders direct the Apache-specific files to the right place. [Cory Omand ] Fix bug in modperl_package_clear_stash() segfaulting when encountering declared but not yet defined subroutines. [Steve Hay , Gozer] win32 needs PERL_SYS_INIT3/PERL_SYS_TERM calls [Steve Hay ] Fix broken MP_STATIC_EXTS=1 build. [Gozer] Perl -Duse64bit fix. Pointers can't just be generically casted from/to IVs. Use PTR2IV/INT2PTR instead. [Gozer] Perl -Duse64bit fix. apr_size_t pointers can't just be generically casted from/to UVs. Use PTR2UV/INT2PTR instead. [Gozer] fix a bug in Apache2::Build::dir: If the right directory isn't found in the for loop $dir still contains a > value, so the ||= has no effect. [Nick Wellnhofer ] =item 1.999_21 - January 22, 2005 PerlPostConfigRequire was trying to detect missing files early on, but without searching thru @INC, causing false negatives. Better off skipping that check and leave it to modperl_require_file() to report problems with finding the file. [Patrick LeBoutillier , Gozer] add a perl bug workaround: with USE_ITHREADS perl leaks pthread_key_t on every reload of libperl.{a,so} (it's allocated on the very first perl_alloc() and never freed). This becomes a problem on apache restart: if the OS limit is 1024, 1024 restarts later things will start crashing [Gisle Aas , Stas] on Irix mod_perl.so needs to see the libperl.so symbols, which requires the -exports option immediately before -lperl. [Gordon Lack ] pool arguments to startup and connection callbacks must be blessed into APR::Pool and not Apache::Pool class [joes] Make PerlSetEnv, PerlPassEnv and %ENV in PerlRequre, PerlModule, PerlConfigRequire and PerlPostConfigRequire affect each other, so a change in one of these is immediately seen in the others. [Pratik , Stas] =item 1.999_20 - January 5, 2005 the autogenerated modules (and some implemented in xs/ modules) are now getting the same version number as $mod_perl::VERSION (the exception are APR modules which get 0.009_000 for now). [Stas] until we figure out how to tell PAUSE index about versions of the autogenerated modules, create a fake module which lists all the autogenerated modules and their versions and include that in the distro. [Stas] moving to the triplet version notation, which requires us to bump 1.99 => 1.999 so 1.999020 (mp2) > 1.29 (mp1). [Stas] Now we are gong to have: $mod_perl::VERSION : "1.099020" int $mod_perl::VERSION : 1.09902 $mod_perl::VERSION_TRIPLET: 1.99.20 and PerlPostConfigRequires were leaking some memory at startup. Use parms->temp_pool instead of parms->pool for temporary memory allocations. [Gozer] deal with a situation where an object is used to construct another object, but it's then auto-DESTROYed by perl rendering the object that used it corrupted. the solution is to make the newly created objects refer to the underlying object via magic attachment. only objects using objects that have DESTROY are effected. This concerns some of the methods accepting the custom APR::Pool object (not native pools like $r->pool). [Stas] Adjusted: - APR::Brigade: new - APR::Finfo: stat - APR::IpSubnet: new - APR::Table: copy, overlay, make - APR::ThreadMutex: new - APR::URI: parse - Apache::RequestUtil: new - APR::Pool: new - APR::BucketAlloc: new APR::Bucket::alloc_create moved to APR::BucketAlloc::new APR::Bucket::alloc_destroy moved to APR::BucketAlloc::destroy [Stas] prefork handlers optimisation: don't dup the handler struct unless this is a threaded-mpm [Stas] speed up the 'perl Makefile.PL' stage [Randy Kobes]: - reduce the number of calls to build_config() of Apache::Build within ModPerl::BuildMM - cache the results of the calls to apxs_cflags, apxs_extra_cflags, and apxs_extra_cppflags in Apache::Build - in apxs of Apache::Build, return a cached result only when defined move ModPerl::Util::exit() into mod_perl.so, since it needs to work, even if ModPerl::Util wasn't loaded [Stas] =item 1.99_19 - December 23, 2004 $r->hostname is now writable [Gozer] Static build with a Perl without ithreads and a non-threaded MPM would segfault on startup. Caused by a bug in perl's perl_shutdown() code. Fixed in Perl 5.8.2, so it's now a build requirement [Gozer] replace the added in 1.99_17 code on resetting/restoring PL_tainted, with explicit reset before and after each each callback. This solves a complicated tainting issues caused when perl exception object is thrown. rgs suggested that it should be safe, similar to perl's own pp_nextstate which says: /* Each statement is presumed innocent */ [Stas] New configuration directives: [Gozer] - PerlConfigRequire Just like PerlRequire, but _always_ triggers an immediate interpreter startup - PerlPostConfigRequire A delayed form of PerlRequire, that waits until the post_config phase before require'ing files fix a warning in Apache::Status [John Williams ] Ignore Apache-Test/META.yml in distribution tarballs until PAUSE is capable of handling multiple META.yml files in one distro [Gozer] modperl_exports.c now wraps all exported functions in a #ifndef function_name wrapper to help in weeding out functions that only make sense for certain Perl configurations (perlio, threads) (which also fixes static build against perlio-disabled perls, like 5.6.x) [Gozer] for make test, skip configuring fastcgi if it's found in the global httpd.conf, as it causes crashes in the test suite [Stas] fix Makefile.PL arguments parser to support more than one MP_foo option on the same line (including .makepl_args.mod_perl2 file) [Stas] fix compilation issues in ModPerl::Util::current_perl_id (on some builds newSVpvf can't be resolved but Perl_newSVpvf works just fine). [Stas, Markus Wichitill ] fix APR::Error::str to return a lexical variable, rather than a string. This function is called by SvTRUE in modperl_errsv() via overload and on win32 (and randomly on linux) causes crashes via: "Attempt to free temp prematurely" warning, where this 'temp' is the string returned by this function. Making it a lexical variable before returning it, resolves the problem. [Steve Hay] fix META.yaml s/private/no_index/ (to hide the bundled Apache-Test from PAUSE indexer) [Randy Kobes] =item 1.99_18 - December 12, 2004 Fix x86_64 warnings in modperl_restart_count_*, due to casting between integers and pointer types [Joe Orton] open_logs and post_config handlers require the Apache::OK return code or the server aborts, so we need to log an error in case the handler didn't fail but returned something different from Apache::OK [Stas] new function ModPerl::Util::current_perl_id() which returns something like (.e.g 0x92ac760) (aTHX) under threaded mpm and 0 under non-threaded perl (0x0). Useful for debugging modperl under threaded perls. [Stas] make sure that modperl's internal post_config callback, which amongst other things, cloning perl interpreters is running as modperl_hook_post_config_last APR_HOOK_REALLY_LAST, which ensures that user's post_config callbacks are run before the cloning. now the code from config phase's startup.pl can be safely moved to the post_config phase's equivalent. [Stas] Further sync with libapr constants changes: [Stas] - the constants APR::(READ|WRITE|CREATE|APPEND|TRUNCATE|BINARY|EXCL|BUFFERED|DELONCLOSE) now have a prefix APR::FOPEN_ and moved group s/filemode/fopen/ - constants from the fileprot group moved to the fprot group and the prefix has changed: from APR::FILEPROT_ to APR::FPROT_ - this also fixes the import of APR_EXCL as an error constant $r->print() and tied print() now return 0E0 (zero but true) when the call was successful but for zero bytes. [Geoffrey Young] a new function Apache::ServerUtil::server_shutdown_cleanup_register to register cleanups to be run at server shutdown. [Stas] $bb->cleanup is no more segfaulting (was segfaulting due to a broken prototype in APR, and consequently invalid XS glue code) [Randy Kobes, Stas] make sure that ABSPERLRUN and ABSPERLRUN are defined in src/modules/perl/Makefile (needed by win32 build) [Stas] For static builds, mod_perl header files were being installed into apache's source tree instead of where apache installed it's own headers [Gozer] modperl_threads_started() wasn't working under static worker build, due to MP_threads_started static variable not being reset on restart. Now resetting it. [Stas] @INC shrinking efforts: [Stas] 1) when adding $ServerRoot don't add the trailing / (as it ends up twice when added by A-T w/o trailing /) 2) add $ServerRoot/lib/perl only if it actually exists For static builds, we now run 'make clean' in httpd's source tree before running ./configure if the source tree has been configured before [Gozer] Apache::SizeLimit ported [Perrin Harkins ] create a new subpool modperl_server_user_pool (from modperl_server_pool), which is used internally by Apache::ServerUtil::server_restart_register. This ensures that user-registered cleanups are run *before* perl's internals cleanups are run. (previously there was a problem with non-threaded perls which were segfaulting on user cleanups, since perl was already gone by that time). [Stas] Starting from ExtUtils::MakeMaker 6.22 it no longer generates pm_to_blib target, but pm_to_blib.ts, so needed to fix the glue_pod target, so install will work correctly [Stas] Apache::RequestUtil : $r->child_terminate() implemented for non-threaded MPMs. [Gozer] new API Apache::ServerUtil::restart_count() which can be used to tell whether the server is starting/restarting/gracefully restarting/etc. Based on this feature implement $Apache::Server::Starting and $Apache::Server::ReStarting in Apache::compat [Stas] Apache::Resource ported to mp2 [Stas] If none of MP_APXS, MP_AP_PREFIX and MP_USE_STATIC were specified when configuring Makefile.PL, we now prompt for APXS path first and only if that fails ask for MP_AP_PREFIX. This is a requirement to get 'make test' find httpd. [Stas] Dynamically prompt and add MP_INST_APACHE2=1 when installing on systems with mod_perl 1 preinstalled. [Stas] fix the logging call in RegistryCooker [Lars Eggert ] fix $r->filename in Apache::compat to update the finfo struct (which is how it worked in mp1) [Stas] enclose all occurences of eval_* with ENTER;SAVETMPS; ... FREETMPS;LEAVE; previously things just happened to work, due to external scopes which was not very reliable and some change could introduce obsure bugs. [Stas] in case a native apache response filter is configured outside the block with PerlSet*Filter directive, make sure that mod_perl doesn't try to add it as connection filter (previously was logging an error like: [error] a content filter was added without a request: includes) [Stas] replace the slow implementation of anon handlers using B::Deparse, with per-interpreter cache of compiled CODE refs (sort of emulating named subroutines for anonymous handlers) [Stas]. avoid segfaults when a bogus $r object is used [Stas] Remove magicness of PerlLoadModule and implement Apache::Module::add() for modules that implement their own configuration directives [Gozer] Apache::Connection::remote_ip is now settable (needed to set the remote_ip record based on proxy's X-Forwarded-For header) [Stas] Fix Modperl::Util::unload_package() [Gozer] - Mistakenly skipping small entries of size 2 and less - Leave entries from other packages alone $filter->remove now works with native (non-modperl) filters + test [Torsten Förtsch ] =item 1.99_17 - October 22, 2004 Implement Apache->unescape_url_info in Apache::compat and drop it from the official API for CGI::Util::unescape() as a suggested replacement [Gozer] fix xs_generate to croak on duplicate entries in xs/maps files [Christian Krause ] Workaround a possible bug in Perl_load_module() [Gozer] Fix a problem building with non-GNU make (can't make target dynamic in xs/APR/aprext) [Gozer] escape HTML in dumped variables by Apache::Status [Markus Wichitill ] $r->document_root can now be changed when safe to do so [Gozer] APR::Bucket->new now requires an APR::BucketAlloc as its first argument. New subs added: APR::Bucket::setaside, APR::Bucket::alloc_create, APR::Bucket::alloc_destroy, APR::Brigade::bucket_alloc. [joes] reimplement APR::Pool life-scope handling, (the previous implementation had problems) [joes] make sure that Apache::Filter::read, APR::Socket::recv, Apache::RequestIO::read, APR::Brigade::flatten, and APR::Bucket::read all return tainted data under -T [Stas] tag the custom pools created by mod_perl for easier pools debug [Joe Orton] fix a bug in non-ithreaded-perl implementation where the cached compiled CODE refs of httpd.conf-inlined one-liner handlers like: PerlFixupHandler 'sub { use Apache::Const qw(DECLINED); DECLINED }' didn't have the reference count right. [Stas] per-server PerlSetEnv and PerlPassEnv values are properly added to %ENV when only a per-directory handler is configured. [Geoffrey Young] resolve several 'Use of uninitialized value in...' warnings in Apache::Status [Stas]. make install and static build now correctly installs mod_perl as well as the statically built apache [Gozer] if some code changes the current interpreter's tainted state to on, the return value from the handler callback will be tainted, and we fail to deal with that. So revert to coercing any return value, but undef (a special case for exit()). to IV, so that tainted values are handled correctly as well. [Stas] make sure that each handler callback starts with a pristine tainted-ness state, so that previous callback calls won't affect the consequent ones. Without this change any handler triggering eval or another function call, that checks TAINT_PROPER, will crash mod_perl with: "Insecure dependency in eval while running setgid. Callback called exit." farewell message [Stas] make sure that 'make distclean' cleans all the autogenerated files [Stas] $r->log_reason has been ported and moved out of Apache::compat [Gozer] APR::OS::thread_current renamed APR::OS::current_thread_id and now returns the actual thread_id instead of an object that needed to be dereferenced to get at the thread_id [Gozer] change a bunch of the APR:: constants to have a better prefix (APR::FILETYPE_* and APR::FILEPROT_). libapr will be changed soon too [Stas] Generate modperl_exports.c for static builds to prevent the linker from stripping needed but unused symbols [Gozer] Add .libs/ as part of the library search path when building against httpd's source tree [Gozer] In the static build, run make in httpd's srclib/ early to have generated files present at mod_perl configure time [Gozer] When searching for ap(r|u)-config in httpd's source tree, search into srclib/apr-util as well as srclib/apr [Gozer] Remove APR::Finfo::pool as it has no use to us [Stas] get PerlSetVar and PerlAddVar multi-level merges to (finally) work properly. [Rici Lake ] MP_AP_BUILD configure option removed. Now implicit when MP_USE_STATIC is specified [Gozer] Apache::Module $mod->version() and $mod->minor_version() renamed to $mod->ap_api_major_version() and $mod->ap_api_minor_version for clarity [Gozer] Apache::Log changes: [Stas] - moved to compat: Apache::warn, Apache->warn, Apache::Server->warn, Apache::Server::warn - re-enabled $r->warn - removed support for Apache::ServerRec->warn (Apache::ServerRec::warn is still there) Apache::Directive conftree() changed from class method to regular subroutine [Gozer] Apache::Module top_module() and get_config() as class methods added to Apache::compat for backwards compatibility [Gozer] Apache::Module top_module() and get_config() changed from class methods to regular subroutines [Gozer] Added Apache::CmdParms::add_config() to work around a memory leak discovered with sections in .htaccess files [Gozer] Added ModPerl::Util::unload_package() to remove a loaded package as thoroughly as possible by clearing it's stash. [Gozer] fix Apache->request($r) to be set-able even w/: PerlOptions -GlobalRequest [Stas] Add Apache::Reload->unregister_module() to explicitely remove a module from Apache::Reload's monitoring list [Gozer] introduce a custom modperl error message for failing filter handlers (previously 'unknown error' coming from rc=500 was logged) [Stas] Fix Apache::Log methods/functions to log into the vhost's error_log file (if there is one). ( $s->log->*, $s->log_error, $s->log_serror, Apache::ServerRec::warn, etc.). Apache::ServerRec can now export its warn function to override CORE::warn [Stas] Fix $s->log->*, $s->log_error and $s->log_serror to again log into the vhost's error_log file (if there is one). [Stas] $s->log->warn and other $s->log->foo are now logging to the right vhost server and not the global one. modperl_sv2server_rec was broken. [Stas] Fix a glue_pod make target bug, when .pm file doesn't exist, e.g. ThreadMutex.pm is not created on unless $apr_config->{HAS_THREADS} [Stas] Introduce APR::Socket::poll to poll a non-blocking socket [Ken Simpson ] Fix the error message when the minimal required httpd version is not satisfied [Pratik ] Fix interactive prompting at perl Makefile.PL, when no APXS or MP_AP_PREFIX were provided. now asking for an alternative location if the suggested choices weren't selected. [Stas] Added APR::URI->rpath method. Returns the path of an uri minus path_info, if any. [Gozer] moved Apache::current_callback() to ModPerl::Util::current_callback where it belongs [Gozer] modperl_perl_module_loaded() fixed to use %INC to determine if a module is loaded instead of checking for the existence of a stash [Gozer] fix the modperl build, where httpd has been built against separate installations of apr-util and apr, where apr-util has been installed with a different includedir to apr. [Joe Orton] $Apache::Server::SaveConfig is now $Apache::PerlSections::Save [Geoffrey Young] =item 1.99_16 - Aug 22, 2004 Fix a compilation problem breaking 1.99_15 (sv_copypv was added in perl 5.7.3) [Jason Woodward ] Added $r->content_languages in Apache::RequestRec [Gozer] APR::Bucket: add delete() and destroy() methods [Stas] =item 1.99_15 - Aug 20, 2004 replace the memory allocation for modperl filter handlers to use a temporary subpool of the ap_filter_t object. previously using perl's safemalloc had problems on win32 (randomly my_perl == NULL) [Stas] Disable Apache::HookRun::run_create_request -- it's already run internally by Apache::RequestRec->new [Stas] Update Apache::RequestRec->new() to initialize members of request_rec which were added some time ago (without it we were getting segfaults in the new pseudo_http test. [Stas] Apache::CmdParms->limited member replaced by is_method_limited() method [Gozer] Apache::Module changes [Gozer] - readwrite => readonly: cmds, next, name, module_index, minor_version, version - removed: remove_module ensure that a sub-dir Apache-Test exists in the source distro (this is a requirement, since the test suite relies on the particular Apache-Test version distributed with the mod_perl source) [Stas] combine handler resolving failure error with the actual error, so there is only one logged entry [Stas] pod manpages are now glued to all .pm files for which .pod exists at 'make install' phase [Stas] Apache::RequestIO::sendfile() now indicates which file it has failed to open on failure. [Stas] fix Apache::SubRequest's methods: lookup_file, lookup_uri, lookup_method_uri to default the last argument to r->proto_output_filters (no request filters for the subrequest) and not r->output_filters->next as it was before (one filter was getting skipped and the rest of the filters were applied *twice*). [Stas] Apache::CmdParms changes [Gozer] - readwrite => readonly: override, limited, directive, pool, temp_pool, server, path, cmd, context, err_directive - removed: limited_xmethods, xlimited, config_file, err_directive Fix a bug in APR::Bucket->new when a passed argument was of type PADTMP [Stas] Apache::Connection changes [Stas, "Fred Moyer" ] - readwrite => readonly: pool, base_server, local_addr, remote_addr, remote_ip, remote_host, aborted, local_ip, local_host, id, conn_config, sbh, bucket_alloc - removed: logname Move check_cmd_context from Apache::Command to Apache::CmdParms. [Gozer] Add :context group of constants for check_cmd_context(). NOT_IN_VIRTUALHOST, NOT_IN_LIMIT, NOT_IN_DIRECTORY, NOT_IN_LOCATION, NOT_IN_FILES, NOT_IN_DIR_LOC_FILE & GLOBAL_ONLY [Gozer] Removed Apache::Command method soak_end_container [Gozer] Removed Apache::Module methods (dynamic_load_handle and find_module_name) [Gozer] All Apache::Command methods are now read-only [Gozer] Removed Apache::Command methods (func and cmd_data) [Gozer] Removed Apache::Directive methods (data & walk_config) [Gozer] All Apache::Directive methods are now read-only [Gozer] Filters should not reset $@ if it was already set before invocation [Gozer] Apache::compat server_root_relative now correctly handles absolute paths like ap_server_root_relative does [Gozer] Fix a bug in sections with multiple aliases in a virtualhost container. [Gozer] PerlModule, PerlRequire, Perl and is now supported in .htaccess. They will run for each request. [Gozer] removed support for httpd 2.0.46. httpd 2.0.47 is now the minimum supported version. [Geoffrey Young] Static builds for httpd >= 2.0.51 available. With the new MP_AP_BUILD option, configure and compile an httpd with mod_perl statically linked in [Gozer] Apache::RequestRec methods changes [Stas] - readwrite => readonly: connection, canonical_filename, header_only, main, next, prev, pool, per_dir_config, request_config, proto_num, protocol, request_time, server, the_request, unparsed_uri - removed: remaining - this method is not needed if the deprecated $r->client_block methods aren't used, (use $r->read $r->instead) canonical_filename - it's a private member The func Apache::SubProcess::spawn_proc_prog is now a method: $r->spawn_proc_prog [Stas] Apache::Process methods (pool, pconf and short_name) are now read-only [Stas] ($r|$c|$s)->server_root_relative were removed. Now only an explicit and somewhat deprecated function API remains: Apache::ServerUtil::server_root_relative($pool, $path); it's too easy to cause memory leak with this method, and it's inefficient as it duplicates the return value, to avoid potential segfaults if the pool it was allocated from gets destroyed and the value is attempted to be used. Instead of this method use the equivalent: File::Spec->catfile(Apache::ServerUtil::server_root, $fname); [Stas] $r->psignature now lives in the package it belongs to: Apache::RequestUtil (previously lived in Apache::ServerUtil). [Stas] A few functions moved namespace from Apache:: to Apache::ServerUtil:: (to make it easier to find the container of the function): [Stas] - exists_config_define - server_root - get_server_built - get_server_version fix an old outstanding bug in the APR::Table's TIE interface with each()/values() over tables with multi-values keys. Now the produced order is correct and consistent with keys(). Though, values() works correctly only with perl 5.8.x and higher. [Joe Schaefer] require Perl 5.6.1, 5.6.0 isn't supported for a long time, but we weren't aborting at the Makefile.PL stage [Stas] Apache::RequestUtil::method_register($s->process->pconf, 'FOO'); is now $s->method_register('FOO'). Apache::RequestUtil::add_version_component($s->process->pconf, 'BAR/0.1'); is now $s->add_version_component('BAR/0.1'). [Stas] Remove $Apache::Server::StrictPerlSections. Now, all sections errors are fatal by default and cause server startup to abort on error. [Gozer] Fix ($r|$filter|$bucket)->read() functions to run the set magic logic, to handle cases when a passed buffer to fill is not a regular scalar. [Stas] Apache::ServerRec accessors changes: [Stas] - readonly accessors: process, next, is_virtual, module_config, lookup_defaults and addrs - readwrite accessors with the exception of threaded mpms, where the accessors are writable only before the child_init phase (i.e. before threads are spawned): server_admin, server_hostname, port, error_fname, error_log, loglevel, timeout, keep_alive_timeout, keep_alive_max, keep_alive, names, wild_names, limit_req_line, limit_req_fieldsize, limit_req_fields, and path supports a new type of struct accessor, which is just like read/write one, but doesn't allow write access starting at the ChildInit phase under threaded mpm (to avoid thread-safely issues) [Stas] In order to be consistent with Apache::RequestRec, Apache::Server is now Apache::ServerRec and all methods/functions from Apache::Server now live in Apache::ServerRec. [Stas] Use a context-specific Perl_load_module() instead of load_module(), to avoid the problem with 'load_module' symbol resolution on certain platforms, where for some reason it doesn't get resolved at compile time to Perl_load_module_nocontext [Stas] Make it possible to disable mod_perl for the base server, but enable it for the virtual hosts [Stas] Removed the deprecated path argument to $r->add_config() [Gozer] Created a META.yml for CPAN and friends, including Apache-Test as a private resource to keep CPAN from installing mod_perl when a user just wants Apache::Test [Gozer] Moving HTTP specific functions get_status_line, method_register from Apache:: to Apache::RequestUtil:: to match their container [Stas] Adjust the list of mod_perl header files installed into the Apache2 include/ directory, made necessary from the renaming and refactoring arising from the decoupling of APR and APR::* from mod_perl.so. Also include modperl_apr_perlio.h under xs/APR/PerlIO/ in the list of such files installed [Stas, Randy Kobes] $r->read()/READ now throw exceptions [Stas] $r->rflush now returns nothing (was always returning APR::SUCCESS before) [Stas] bug reports generating code: [Stas] - add (apr|apu)-config linking info - show the full path to the config file used to get the data for the report The APR and APR::* family of modules can now be used without having to load mod_perl.so. On *nix, this is done by compiling the needed functions from the appropriate sources used to build mod_perl.so into APR.so, and then arranging for APR::* to 'use APR ()'. On Win32, a static library of needed functions is built, and APR/APR::* then link into this library [Stas, Joe Schaefer, Randy Kobes] APR::RequestIO::sendfile() now flushes any buffered output before sending the file contents out. If the return status is not checked and an error happens it'll throw an exception. Fix offset handling. [Stas] Registry: remove the misleading prefix "$$: $class:" in the logged error message, since not only registry errors will get logged if $@ is set [Stas] change t/REPORT to suggest to post bug reports to the modperl users list, to be consistent with the documentation [Stas] amd64 fixes [Joe Schaefer ] - use IV insteaf of int where a pointer is used - mpxs_APR__Bucket_new needs to use apr_size_t/off_set_t types APR::Socket::recv() now returns the length of the read data [Stas] APR::Bucket's read() returns "" instead of undef when there is no data to read. [Stas] fix a bug in Registry handlers, where the same error was logged twice and potentially a wrong error code returned [Stas] Apache::RequestIO: print(), printf(), puts(), write(), rflush() throw an exception on failure [Stas] Apache::SubRequest: run() throw an exception on failure [Stas] Apache::Filter: [Stas] - remove unneeded methods: remove_input_filter() and remove_output_filter(), fputs() - frec() accessor is made read-only - fflush(), get_brigade() and pass_brigade() now throw exceptions if called in the void context - read, print() and puts() throw an exception on failure Apache::FilterRec: [Stas] - remove the next() accessor since it's not used by Apache at the moment - name() is made read-only APR::URI: [Stas] - removed accessors o is_initialized() (internal apr_uri flag) o dns_looked_up() and dns_resolved() (they are not used by apache/apr) - all remaining accessors now accept undef value, which unsets the field Extended WrapXS code to support a new type of accessor: char * which accepts undef to set the C pointer to NULL and as such unset the member of the struct. [Stas] Exception error messages now include the error id along with the error message (as they did in first place). [Stas] $r->finfo now accepts APR::Finfo object as an optional argument. [Stas] APR::Finfo [Stas] - change stat() to return finfo - make all field accessors readonly ARP::password_validate is now ARP::Util::password_validate [Stas] APR::IpSubnet::new() now throws APR::Error exception (not returning rc) [Stas] rename package APR::NetLib -> APR::IpSubnet to match the class name [Stas] APR::BucketType: [Stas] - name is readonly APR::Brigade [Stas] - destroy() now throws APR::Error exception (not returning rc) - rename empty => is_empty - added the method cleanup() - flatten() now returns the number of bytes read (and passed the buffer by the argument) and throws APR::Error exception APR::Bucket: [Stas] - read() now returns the length of the read data and throws APR::Error exception (not returning rc). The returned scalar is now TAINTED. - type->name now has a module APR::BucketType - type(), length(), start(), data() are now all readonly - new() fix a bug in offset handling =item 1.99_14 - May 21, 2004 APR::SockAddr::port() accessor is now read-only [Stas] APR::Pool now has destroy() and clear() available [Stas] now logging the errors happening in pool cleanup callbacks [Stas] use the new Apache-Test attribute -minclient in the test suites. Now along with the default maxclients = minclients+1, we no longer should get 'server reached MaxClients setting' errors. [Stas] new API for APR::Socket recv() and send() + updated tests [Stas] add infrastructure for new ModPerl::Const constants and the first constant ModPerl::EXIT. [Stas] re-implement ModPerl::Util::exit to use exception objects, so it's possible to detect exit called in eval context and call it again outside the eval context. [Stas] add the perl interface for the new exception handling code (mod_perl, apache and apr methods will now throw exceptions with $@ being an object). New class APR::Error was added, to handle the exception objects with overload methods. Also added confess and croak equivalents of Carp's methods, since at the moment the Carp's ones don't work as is. The following perl and C methods have been renamed: modperl_apr_strerror => modperl_error_strerror APR::strerror => APR::Error::strerr [Stas] set the 'error-notes' table to the error message on HTTP_INTERNAL_SERVER_ERROR [Stas] fix the apxs build function to not handle empty lookups as errors [Randy Kobes, Steve Hay] fix type casting problems in the io functions [Stas] add support for libgtop 2.5.0+ (maintenance mode) [Stas] APR::Socket::timeout_set now croaks on failure [Stas] significantly speedup the startup of threaded mpm test suite, by configuring only the minimal number of perl interpreters to start [Stas] make APR::Socket::opt_(set|get) working (and change the previous behavior) [Stas] make sure that our protocol module tests that interact with the socket use a blocking read [Joe Orton] Use a better approach to figure out whether we need to strip perl's LargeFilesSource flag, by checking whether libapr was compiled with -D_FILE_OFFSET_BITS=64 or not. Checking for APR_HAS_LARGE_FILES is useless since it doesn't tell whether 32 vs 64 bits off_t and similar types are used [Joe Orton] 'SetHandler perl-script' no longer grabs any newly encountered END blocks, and removes them from PL_endav, but only if they are explicitly registered via ModPerl::Global::special_list_register(END => $package_name) (this is a new function). It's now possible to have a complete control of when END blocks are run from the user space, not only in the registry handlers [Stas] END blocks encountered by child processes and not hijacked by ModPerl::Global::special_list_register() are now executed at the server shutdown (previously they weren't executed at all). [Stas] Added test to ensure sections can have things like %Location tied [Gozer] Fix the installation on Win32 so that an appropriate Apache2 subdirectory under the Perl tree is used when MP_INST_APACHE2 is specified [Randy Kobes] Fix a redefined warning in Apache::Status [Stas] Fix Apache::Status, to lookup the Apache::Request version without loading it. Only if a suitable (2.x) version is found -- load and use it. Previously loading the 1.x version was affecting Apache::compat. [Stas] Fix a bug in special blocks handling (like END), which until now was dropping on the floor all blocks but the last one (mainly affecting registry handlers). [Stas] The filter streaming API print() function, now correctly handles a binary data [Stas] Fix Registry handlers, not to lose the execution errors, when they include END blocks [Stas] =item 1.99_13 - March 8, 2004 respect $ENV{APACHE_TEST_STARTUP_TIMEOUT} settings if any [Stas] Added tests for issuing subrequests from filters [Geoffrey Young] Updated to the new Apache License Version 2.0 [Gozer] Drop the support for making GATEWAY_INTERFACE special. It's not needed as $ENV{MOD_PERL}, available in both mod_perl generations, should be used to test whether the code is running under mod_perl. [Stas] Handle correctly the situation when response HTTP headers are printed from the handler and the response body starts with \000, which is the case with some images like .ico. [Stas] Apache::PerlSections->dump() and store(filename) [Gozer] expose $c->keepalive related constants and $c->keepalives counter [Stas] Perl handlers are now guaranteed to run before core C handlers for all request phases. [Geoffrey Young] Fix the STDIN/OUT overriding process to handle gracefully cases, when either or both are closed/bogus (the problem was only with useperlio enabled perl) [Stas] copy apr_table_compress logic from later httpd versions in case mod_perl is built against 2.0.46, as mod_perl now requires it internally. users should be aware that 2.0.47 may become the oldest supported httpd version in the near future. [Geoffrey Young] Fix the corruption of the httpd process argv[0], caused by $0 manipulating [Stas] ModPerl::MethodLookup::lookup_method now handles sub-classed objects [Stas] standard %ENV population with CGI variables and contents of the subprocess_env table (such as SetEnv and PassEnv) has been delayed until the last possible moment before content-generation runs. PerlSetEnv and PerlPassEnv are each an exception to this and are placed in both %ENV and the subprocess_env table immediately, regardless of the current [+-]SetupEnv setting. [Geoffrey Young] fix PerlAddVar configuration merging [Geoffrey Young] Anonymous subs are now supported in push_handlers, set_handlers, add_input_filter, etc. A fast cached cv is used with non-ithreaded perl. A slower deparse/eval approach (via B::Deparse) is used with ithreads enabled perls. Further optimizations are planned for the latter case. [Stas] ht_time w/o the pool is now available only via override/restore compat API. format_time, has been renamed back to ht_time, and the default values for fmt, time and gmt are now supported. [Stas] it's now possible to push new handlers into the same phase that is running at the moment [Stas]. when $r->handler($new_handler) is called from a response phase, it now checks that the response handler type is not switched (e.g. from 'modperl' to 'perl-script') from the currently used one [Stas] Since Apache::SubProcess is now part of the mp2 API, add $r->cleanup_for_exec as a noop in Apache::compat. That function is no longer needed in Apache2. [Stas] When 'perl Makefile.PL PREFIX=/foo/bar' is used and mod_perl 1 is found, but at different prefix no longer require MP_INST_APACHE2=1. [Stas] modperl_mgv_resolve now croaks when a module scheduled for autoloading fails to load. AutoLoaded modules shouldn't silently fail. [Stas] Perl(Input|Output)FilterHandler handlers are now always AutoLoaded, as if '+' prefix was used. This must be performed to get the access to filter attributes long before the filter itself is executed. [Stas] APR/Pool.xs has been reimplemented. The problem with the previous implementation is that a dead perl pool object could hijack a newly created pool, which didn't belong to that object, but which happened to be allocated at the same memory location. The problem is that apr_pool_user_data_set/get has no mechanism to check whether the pool has changed since it was last assigned to (it does but only in the debug mode). It really needs some signature mechanism which can be verified that the pool is still the same pool. Since apr_pool doesn't have this feature, the reference counting has been reimplemented using a plain sv reference. Several new (mainly hijacking) tests which badly fail with the previous impelementation have been added. [Stas] fix calling $r->subprocess_env() in a void context so that it only populates %ENV if also called with no arguments. also, make sure it can be called more than once and still populate %ENV. [Geoffrey Young] add APR::Brigade::pool() to allow access to the pool associated with the brigade [Geoffrey Young] make 't/TEST -startup_timeout secs' working (previously user's value was ignored) [Stas] ModPerl::Registry and friends now support non-parsed headers scripts, whose filename =~ /^nph-/, identically to mod_cgi. + test [Stas] implement APR::Brigade::length() and APR::Brigade::flatten() (the latter implements a wrapper for apr_brigade_flatten, but also includes an emulation of apr_brigade_pflatten) as [Geoffrey Young] ($r|$s)->add_config() now die if failed (previously returned the error) [Stas] fix context problems in sections and PerlModule/PerlLoadModule/PerlRequre under threaded mpms w/ PerlOptions +Parent/+Clone in Vhosts + TestVhost::config test. [Stas] Implemented Apache::get_server_version and Apache::get_server_built as constant subroutines [Geoffrey Young] Moved some functions out of the Apache:: namespace: Apache::unescape_url() is now Apache::URI::unescape_url() Apache::log_pid() is now Apache::Log::log_pid() Apache::LOG_MARK() is now Apache::Log::LOG_MARK() [Geoffrey Young] if MP_AP_PREFIX is used apxs and apr-config from the apache build tree won't work, so it can't co-exist with MP_APXS and MP_APR_CONFIG build options - ensure that this doesn't happen. [Stas] server_root_relative() now requires either a valid pool or an $r, $s, or $c object as a first argument. also, the returned result is a copy, protecting against cases where the pool would go out of scope before the result. [Geoffrey Young] Check the success of sysopen in tmpfile() in compat [Geoffrey Young] make sure DynaLoader is loaded before XSLoader, not only with perl 5.6.1, but always because of the issues with sections are loaded from +Parent vhost [Stas] added ($r|$s)->is_perl_option_enabled($option_name), to test for PerlOptions + tests [Stas] On Solaris add a workaround for xs/APR/APR/Makefile.PL to build APR.so, correctly linked against apr and apr-util libs, by addding the missing -R paths corresponding to -L flags. EU::MM was adding them via LD_RUN_PATH instead of using -R, but since perl's lddflags may have -R it overrides LD_RUN_PATH. So explicitly add anything that may go into LD_RUN_PATH via -R. Also make sure that -R coming from Apache will appear first. [Brad Lanam ] 'make dist' now generates and picks Apache-Test/META.yml which was always reported missing, as it was included in Apache-Test/MANIFEST [Stas] fix the $r->read function to return undef on failure similar to the core perl function and make $! available for those who test for read() failures. [Stas] Make sure that pnotes are destroyed after PerlCleanup handlers are finished and not before + test. [Stas] =item 1.99_12 - December 22, 2003 Restore a proper behavior of all Registry handlers, but PerlRun, not to reset %INC to forget any .pl files required during the script's execution. [Stas] are now evaluating code into one distinct namespace per container, similar to ModPerl::Registry scripts. [Philippe M. Chiasson] Fix ModPerl::MM::WriteMakefile to use the MODPERL_CCOPTS entry from Apache::BuildConfig, as it contains some flags added by mod_perl, which aren't in perl_ccopts and ap_ccopts. [Stas] Add the implementation of Apache::Connection::local_addr and Apache::Connection::remote_addr to the Apache::compat overridable functions. [Stas] Apache::compat's implementation of APR::URI::unparse, Apache::RequestRec::finfo and Apache::RequestRec::notes is now overridable and not enabled by default. [Stas] Apache::compat no longer enables functions which collide with mp2 API by default. It provides two new functions: override_mp2_api and restore_mp2_api to override and restore the original mp2 API. [Stas] For Win32, add a .bat extension to candidates for the apxs and apr-config utilities used in Apache::Build, so that the -x file test can potentially succeed [Randy Kobes] Plug a memory leak with 'perl-script' not cleaning up the temp vars created during the override of STDIN/STDOUT to use the :Apache IO layer [Stas] libgtop config (needed for enabling MOD_PERL_TRACE=m) is now searched using the gnome packaging tools if available (pkg-config for gnome-2.x and gnome-config for gnome-1.x) [Stas] Prevent a problem where an autovivified package (stash) prevents from modperl_mgv to load the file with that package (until now it was checking whether the stash existed already and skipped the loading if that was the case). Now checking %INC and attempting to load the module. Reporting the failure only if the module has failed to load and the stash is not defined (so that it's possible to autovivify packages without loading them from an external file). [Stas] MaxClients is now overridable from the t/TEST -maxclients command line option (it was hardcoded before). [Stas] Postpone the allocation of the wbucket in filters till the moment it's needed (if at all). Since non-streaming filters aren't going to use that buffer, it's a waste to allocate/free it. [Stas] Extend the autogenerated bug report to include information about installed modules of special interest (which may aid in understanding the bug report), such as CGI.pm, Apache::Request, LWP, etc. [Stas] As the test suite keeps on growing, it takes longer time to startup. Change the main test suite timeout to 180 secs for threaded mpms and 120 secs for non-threaded ones. [Stas] use plain malloc/free to allocate filter structs, since they could be invoked hundreds of times during a single request, causing huge memory demands if the memory is allocated from the pool, which gets destroyed only at the end of a request. [Stas] Fix a compilation error in APX.xs when MP_HAVE_APR_LIBS is not defined [Fred Moyer ] fix a memory leak when $filter->ctx is used [Stas] fix buglet on Win32 (and potentially other non-Unix platforms) where not all files were being installed under a relative Apache2 subdirectory when MP_INST_APACHE2 was specified [Randy Kobes]. deprecated APR::SockAddr::port_get()/APR::SockAddr::port_set() replaced with direct access to the port record via APR::SockAddr::port(). [Geoffrey Young, Stas] deprecated APR::URI::default_port_for_scheme() replaced with APR::URI::port_of_scheme() [Geoffrey Young] deprecated APR::SockAddr::ip_set() and APR::NO_TIMEOUT removed. [Geoffrey Young] Apache::MPM->is_threaded() replaces Apache::MPM_IS_THREADED [Geoffrey Young] fix "PerlSetVar Foo 0" so that $r->dir_config('Foo') returns 0, not undef [Geoffrey Young] add Apache::MPM class, along with show() and query() class methods [Geoffrey Young] add :mpmq import tag to Apache::Const [Geoffrey Young] Fix ModPerl::Registry handlers family to modify $0 only for the duration of the handler, by localizing it [Stas] Fix :Apache perlio's STDOUT to be reentrant + modules/include_subreq test [Stas] fix slurp_filename to always open the file and not try to guess whether filename has been already opened, as there is no reliable way to accomplish that [Stas] Apache->can_stack_handlers is now in Apache::compat (mp2 always can stack handlers) [Stas] add access to $r->finfo() and related APR::Finfo methods, such as $r->finfo->size(), $r->finfo->mtime(), and $r->finfo->stat() [Geoffrey Young] add :filetype import tag to APR::Const [Geoffrey Young] sections now properly set $0 to the name of the configuration file they are in. [Philippe M. Chiasson] Apache::Status: provide a workaround for Config::myconfig() which fails under threads with (5.8.0 < perl < 5.8.3) [Elizabeth Mattijsen ] Fix Apache::Status::handler to return 'Apache::OK' [Juanma Barranquero ] sections now properly set filename and line number information, making error messages report the correct location. [Philippe M. Chiasson] =item 1.99_11 - November 10, 2003 add a build/win32_fetch_apxs script (called within the top-level Makefile.PL) to offer to fetch and install a Win32 development version of apxs and (apr|apu)-config [Randy Kobes] rewrite $r->read() and perlio read functions to use the same function, which completely satisfies the read request if possible, on the way getting rid of get_client_block and its supporting functions which have problems and will most likely will be removed from the httpd-API in the future. Directly manipulate bucket brigades instead. [Stas] Since Apache2.pm pops /foo/Apache2 dirs to the top of @INC, it now also takes care of keeping lib and blib dirs before the system dirs, so that previously installed libraries won't get loaded instead of the currently uninstalled libraries that are under test. [Stas] When 'make test' fails we now print the info on what to do next [Stas] At the end of 'make install' we now print the info how to proceed with mod_perl and what to do in the case of post-install problems [Geoffrey Young] Adjust the source to properly work with 5.8.2's new algorithm of dynamic re-hashing of hashes on hash collision attack. [Nicholas Clark , Stas]. Add a test that mounts such an attack so we can verify that we can survive this rehashing. [Scott A Crosby , Nicholas Clark , Tels , Mark Jason Dominus , Stas] Standardize the Apache::PerlSections package name to it's plural form for clarity and so that the pod gets glued in it's proper place. [Philippe M. Chiasson ] return value from Perl callbacks are now passed directly to Apache without additional post-call manipulations (such as assuming HTTP_OK should really be OK). [Geoffrey Young] perl 5.8.1 w/ ithreads has a bug where it reports the wrong parent pid (as if the process was never forked), provide a local workaround (+ new test). [Rafael Garcia-Suarez ] overridden STD* streams now can be further overridden and will be properly restored, which allows functions like $r->internal_redirect work (+add tests) [Stas] implement perlio's getarg hook, which now allows duping STD* streams overloaded by modperl [Stas] Add PerlMapToStorageHandler [Geoffrey Young] callbacks are now expected to return a meaningful value (OK, SERVER_ERROR, etc) or return via an official API (exit, die, etc). relying on implicit returns from the last call evaluated by a subroutine may result in server errors. [Stas, Geoffrey Young] in the MP_MAINTAINER mode add the -Werror compilation flag when perl v5.6.2 or higher is used, so that we don't miss compilation warnings. [Stas] fix the Makefile.PL option parser to support overriding of certain build options, in addition to appending to them (.e.g. now MP_LIBNAME is overridable) [Andrew Wyllie ] make sure that connection filters won't be inserted as request filters [Stas] Prevent the 'Use of uninitialized value.' warning when ModPerl::Util::exit is used. [Stas] To make the test-suite sandbox-friendly, which break when things try to run off /tmp, use t/logs as the location of the mod_cgid socket and TMPDIR env var [Haroon Rafique ] =item 1.99_10 - September 29, 2003 added Apache::CRLF, Apache::CR, and Apache::LF to Apache::Const's :platform group [Geoffrey Young] make sure that the custom pools are destroyed only once and only when all references went out of scope [Stas] ($r|$c)->add_(input|output)_filter(\&handler) now verify that the filter of the right kind is passed and will refuse to add a request filter as a connection filter and vice versa. The request filter handler is not required to have the FilterRequestHandler attribute as long as it doesn't have any other attributes. The connection filter handler is required to have the FilterConnectionHandler attribute. [Stas] fix tracing with (PerlTrace/MOD_PERL_TRACE) on win32 (the error_log filehandle was invalid after the open_logs phase) [Stas] fix a bug where %ENV vars set via subprocess_env persist across requests. (e.g. a Cookie incoming header which ends up in $ENV{HTTP_COOKIE} would persist to the next request which has no Cookie header at all). Now we unset all the %ENV vars set from subprocess_env. Improve and extend the tests to cover this bug. [Stas] it is invalid to return HTTP_INTERNAL_SERVER_ERROR or any other HTTP response code from modperl_wbucket_pass, therefore set the error code into r->status and return APR_SUCCESS. Until now response handler with messed up response headers, were causing no response what so ever to the client. LWP was assuming 500, and it was all fine, testing without LWP has immediately revealed that there was a problem in the handling of this case. [Stas] put the end to the 'Not a CODE reference' errors, instead provide an intelligent error message, hopefully telling which function can't be found. at the same time improve the tracing to include the pid/tid of the server that has encountered this problem, to make it easier to debug. [Stas] mod_perl handler must be duped for any mpm which runs within USE_ITHREAD. Until now there was a big problem with prefork mpm if any of its vhosts was using PerlOptions +(Parent|Clone) and happened to load handlers before the main server. When that was happening the main server will see that the handler was resolved (since it sees the handler struct from the vhost that loaded this module, instead of its own), which in fact it wasn't, causing the failure to run the handler with the infamous 'Not a CODE reference' error. [Stas] Make sure that the static mod_perl library is built after the dynamic (a requirement on win32) [Steve Hay ] Apache::Status now generates HTML 4.01 Strict (and in many cases, also ISO-HTML) compliant output. Also add a simple CSS to make the reports look nicer. [Ville Skyttä ] APR::Pool::DESTROY implemented and tweaked to only destroy pools created via APR::Pool->new() [Geoffrey Young] $r->slurp_filename is now implemented in C. [Stas] remove support for httpd 2.0.45/apr 0.9.3 and lower. httpd 2.0.46 is now the minimum supported version. [Geoffrey Young] APR::PerlIO now accepts the pool object instead of a request/server objects, so it can be used anywhere, including outside mod_perl [Stas] when perl is built with perlio enabled (5.8+) the new PerlIO Apache layer is used, so now one can push layers onto STDIN, STDOUT handles e.g. binmode(STDOUT, ':utf8'); [Stas] add ap_table_compress() to APR::Table [Geoffrey Young] alter stacked handler interface so that mod_perl follows Apache as closely as possible with respect to VOID/RUN_FIRST/RUN_ALL handler types. now, for phases where OK ends the Apache call list (RUN_FIRST handlers, such as the PerlTransHandler), mod_perl follows suit and leaves some handlers uncalled. [Geoffrey Young] Apache::Build now tries to use the new APR_BINDIR query string to find the location of apr-config. [Stas] new package Apache::porting to make it easier to port mp1 code to mp2 [Stas] new Apache::Build methods: mpm_name(), mpm_is_threaded(). use them in the top-level Makefile.PL to require 5.8.0/ithreads if mpm requires threads. [Stas] add the missing XS methods to ModPerl::MethodLookup, add support for mp1 methods that are no longer in the mod_perl 2.0 API. [Stas] mod_perl now refuses to build against threaded mpms (non-prefork) unless perl 5.8+ w/ithreads is used [Stas] don't try to read PERL_HASH_SEED env var, where apr_env_get is not available (apr < 0.9.3) [Stas] APR.so now can be loaded and used outside mod_perl (all the way back to httpd 2.0.36) [Stas] perl 5.8.1 randomizes the hash seed, because we precalculate the hash values of mgv elements the hash seed has to be the same across all perl interpreters. So mod_perl now intercepts cases where perl would have randomize it, do the seed randomization by itself and tell perl to use that value. [Stas] fix APR::PerlIO layer to pop itself if open() has failed. [Stas] move the definition of DEFINE='-DMP_HAVE_APR_LIBS' to the top level Makefile.PL, since it overrides MY::pasthru target which makes it impossible to define local DEFINE in subdirs. [Stas] make APR perl functions work outside mod_perl: several libraries weren't linked. Also LIBS needs to receive all libs in one string. [Stas] Apache::compat: $r->cgi_env, $r->cgi_var are now aliases to $r->subprocess_env [Stas] For Win32, generate .pdb files for debugging when built with MP_DEBUG. These will get installed into the same directory as the associated dll/so libs. As well, install mod_perl.lib into MP_AP_PREFIX/lib/ for use by 3rd party modules [Randy Kobes]. Apache2.pm is now autogenerated and will adjust @INC to include Apache2/ subdirs only if built with MP_INST_APACHE2=1 [Stas] Change the default value for the argument 'readbytes' for ap_get_brigade(), from 0 to 8192. other than being useless, 0 always triggers an assert in httpd internal filters and 8192 is a good default. [Stas] Fix DynaLoader breakage when using DL_GLOBAL on OpenBSD [Philippe M. Chiasson ] renamed the private modperl_module_config_get_obj function to modperl_module_config_create_obj, since the logic creates the object but doesn't dig it out if it already exists. then, moved logic from mpxs_Apache__Module_get_config into a new public C function that reused the old name, modperl_module_config_get_obj. while Apache::Module->get_config exists as a wrapper to return the object to Perl space, now C/XS folks can also access the object directly with the public function. [Geoffrey Young] Apache::Reload: add a new config variable: ReloadConstantRedefineWarnings to optionally shut off the constant sub redefine warnings [Stas] implement $parms->info. directive handlers should now be complete. [Geoffrey Young] MP_GTOP now works with modern GCC [Philippe M. Chiasson get_client_block is bogus in httpd-2.0.45 (and ealier), as it can't handle EOS buckets arriving in the same bucket brigade with data. so rewrite ModPerl::Test::read_post to use an explicit read through all bucket brigades till it sees eos and then it stops. The code is longer but it works correctly. [Stas] an attempt to resolve the binary compatibility problem in PerlIOAPR_seek API when APR_HAS_LARGE_FILES=0 [Stas] perl 5.8.0 forgets to export PerlIOBase_noop_fail, causing problems on win32 and aix. reimplement this function locally to solve the problem. APR::PerlIO should now be useful on win32 and aix [Stas] implement DECLINE_CMD and DIR_MAGIC_TYPE constants [Geoffrey Young] allow init filter handlers to call other methods than just $f->ctx [Stas] Fix Apache::Reload to gracefully handle the case with empty Touchfiles [Dmitri Tikhonov ] PerlRequire entried should be executed before PerlModule entries in VirtualHost containers, just like in the base server [Stas] =item 1.99_09 - April 28, 2003 $filter->seen_eos() now accepts 1/0 to set/unset the flag so streaming filters can control the sending of EOS. [Stas] support systems where apr header files are installed separately from httpd header files ["Andres Salomon" ] implement init filter handlers + tests [Stas] improving ModPerl::MethodLookup to: - handle more aliased perl XS functions - sort the methods map struct so one can use the autogenerated map as is - add lookup_module, tells which methods are defined by a given module - add lookup_object, tells which methods can be called on a given object - provide autoexported wrappers print_method, print_module and print_object for easy deployment from the command line [Stas] add Perl glue for functions: APR::Socket::timeout_get APR::Socket::timeout_set [Stas] similar to SetEnv, upcase the env keys for PassEnv on platforms with caseless env (e.g. win32) [steve.sparling@ps.ge.com] Add a backcompat wrapper for $r->notes (mp2 supports only the APR::Table API) [Stas] Add a script mp2bug and a target 'make bugreport', so people can use bugreporting during the build and after modperl is installed. [Stas] Add a script mp2doc as a replacement for perldoc (due to 2.0 modules living under Apache2, which won't be looked at by perldoc). [Stas] Add a constant APR::PerlIO::PERLIO_LAYERS_ARE_ENABLED and use it in tests [Stas] Require perl 5.8 or higher when building mod_perl on OSes requiring ithreads (e.g., win32), since 5.6.x ithreads aren't good. [Stas] MP_COMPAT_1X=0 now can be passed to Makefile.PL to disable mp1-back-compat compile-time features + adjust tests. [Stas] and /lib/perl are now added to @INC, just like mod_perl 1.0 with MP_COMPAT_1X=1 (currently enabled by default). [Stas] The Perl-5.8.0 crypt() workaround is now used only if 5.8.0 is used, since 5.8.1-tobe/5.9.0-tobe(blead-perl) won't compile with it. [Geoffrey Young] new directives PerlSetInputFilter and PerlSetOutputFilter, which are the same as SetInputFilter and SetOutputFilter respectively, but allow to insert non-mod_perl filters before, between or after mod_perl filters. + tests [Stas] improved filters debug tracing [Stas] implement $filter->remove (filter self-removal) + tests [Stas] remove the second-guessing code that was trying to guess the package name to load from the handler configuration (by stripping ::string and trying to load the package). fall back to using explicit PerlModule to load modules whose handler sub name is not called 'handler' + adjust tests. [Stas] set the magic taint flags before modules are required [Stas] make sure to set base server's mip before any of the PerlRequire/PerlModule directives are called, since they may add add_config(), which in turn runs Perl sections or PerlLoadModule, which may need the scfg->mip to be set. [Stas] ModPerl::MM is now ready to be used in Makefile.PL of 3rd party mod_perl modules [Stas and Geoff] fix a segfault caused by PerlModule in $s->add_config, due to setting the MP_init_done flag before init was done + add test [Stas] adjust the generated Makefile's to properly build on aix (tested on powerpc-ibm-aix5.1.0.0) [Stas] the build now automatically glues the .pod files to the respective .pm files, so one can use perldoc on .pm files to read the documentation. [Stas] provide a workaround for ExtUtils::MakeMaker::mv_all_methods, so ModPerl::BuildMM and ModPerl::MM can override EU::MM methods behind the scenes. [Stas] adding ModPerl::BuildMM, which is now used for building mod_perl. ModPerl::MM will be used for 3rd party modules. ModPerl::BuildMM reuses ModPerl::MM where possible. [Stas] drop the glue code for apr_generate_random_bytes, since it's not available on all platforms. [Stas] Since non-threaded mpms don't use tipools in mips, don't create and destroy them. [Stas] re-use the workaround for glibc/Perl-5.8.0 crypt() bug for the main/vhost base perl interpreters as well. This solves the problem for the buggy glibc on RH8.0. [Stas] send_cgi_header now turns the header parsing off and can send any data attached after the response headers as a response body. [Stas] move the check that print/printf/puts/write/etc are called in the response phase into the functions themselves so 1) we can print a more useful error message 2) this check is not always needed in modperl_wbucket_write, when called internally, so we save some cycles. [Stas] add checks that print/printf/puts/write/etc are called in the response phase. move the check into the functions themselves so we can print a more useful error message [Stas] 'make install' now installs mod_perl*h files under httpd's include tree [Stas] When PerlOptions +ParseHeaders is an effect, the CGI headers parsing won't be done if any *mod_perl* handler before and including the response phase, sets $r->content_type. (similar behavior to mp1's send_http_header() [Stas] Registry: make sure that $r is not in the scope when the script is compiled [Stas] $Apache::Server::SaveConfig added. When set to a true value, will not clear the content of Apache::ReadConfig:: once sections are processed. [Philippe M. Chiasson push_handlers, Apache->set_handlers and Apache->get_handlers [Stas] revamp the code handling output flushing and flush bucket sending. Namelly modperl_wbucket_flush and modperl_wbucket_pass now can be told to send a flush bucket by themselves, attaching it to the data bb they are already sending. This halfs the number of output filter invocations when the response handler flushes output via $| or rflush. adjust tests, which were counting the number of invocations. [Stas] move ModPerl::RegistryCooker to use a hash as object (similar to mp1), to make it easier to subclass. [Nathan Byrd ] $r->rflush has to flush internal modperl buffer before calling ap_rflush, so implement rflush, instead of autogenerating the xs code for it. [Stas] fix the input filters handling of DECLINED handlers (consume the data, on behalf of the handler) + tests [Stas] fix the code that autogenerates modperl_largefiles.h not to define macros matching m/^-/ (was a problem on aix-4.3.3) [Stas] $Apache::Server::StrictPerlSections added. When set to a true value, will abort server startup if there are syntax errors in sections [Philippe M. Chiasson send_http_header implementation to Apache::compat. This allows the 1.0 code to run unmodified if $r->send_http_header is called before the response change. we already handle the check whether content_type was set, when deciding whether the headers are to be parsed inside modperl_wbucket_pass(). [Stas] fixes to Apache::compat. make $r->connection->auth_type interface with r->ap_auth_type. make both $r->connection->auth_type and $r->connection->user writable. [Geoffrey Young] Open up r->ap_auth_type, making it possible to write custom authen handlers that don't rely on Basic authentication or it's associated ap_* functions. [Geoffrey Young] add Apache::Bundle2 [Stas] Apache::Reload now supports the PerlPreConnectionHandler invocation mode, so connection filter and protocol modules can be automatically reloaded on change. [Stas] implement Apache::current_callback + $r->current_callback goes into Apache::compat, since now we have a way too many callbacks unrelated to $r [Stas] Add Apache::compat methods: $r->connection->auth_type and $r->connection->user (requires 'PerlOptions +GlobalRequest') + tests [Stas] Several issues resolved with parsing headers, including making work the handlers calling $r->content_type() and not sending raw headers, when the headers scanning is turned on. Lots of tests added to exercise different situations. [Stas] warn on using -T in ModPerl::Registry scripts when mod_perl is not running with -T [Stas] perl 5.7.3+ has a built-in ${^TAINT} to test whether it's running under -(T|t). Backport ${^TAINT} for mod_perl running under 5.6.0-5.7.3, (what used to be $Apache::__T. $Apache::__T is available too, but deprecated. [Stas] add PerlChildExitHandler implementation [Stas] add PerlCleanupHandler implementation + test [Stas] die when Apache->request returns nothing ('PerlOptions -GlobalRequest' or 'SetHandler modperl') [Stas] New Apache::Directive methods: as_hash(), lookup() + tests + docs [Philippe M. Chiasson ] Stacked handlers chain execution is now aborted when a handler returns something other than OK or DECLINED [Stas] make $filter->read() in input streaming filters, use the same number of arguments as read() in the output filters. [Stas] Implement $r->add_input_filter and $r->add_output_filter $c->add_input_filter and $c->add_output_filter and add tests [Stas] Skip the handler package::func resolving error, only when the error message matches "Can't locate .*? in @INC", rather than just "Can't locate", since there are many other errors that start with that string. [Stas] the top level 'make test' now descends into the ModPerl-Registry dir to run 'make test' there [Stas] All response functions are now returning status and the callers check and croak on failure or progate them further. [Stas] OPEN, CLOSE and FILENO implementation for Apache::RequestRec [Stas] Another fix for the handling of the return status in ModPerl::RegistryCooker: reset the status to the original one only if it was changed by the script, otherwise return the execution status [Stas] prevent segfault in $r->print / $filter->print (in output filter) and related functions when they are called before the response phase [Stas] prevent segfault in send_http_header when it's called before the response phase [Stas] input stream filtering support was added + tests (plus renaming filter tests so we can know from the test name what kind of filter is tested) [Stas] Add proper support for mis-behaved feeding filters that send more than one EOS bucket in streaming filters + test. [Stas] prevent a segfault when push_handlers are used to push a handler into the currently phase and switching the handler (perl-script/modperl) + tests [Stas] Add $filter->seen_eos to the streaming filter api to know when eos has been seen, so special signatures can be passed and any data stored in the context flushed + tests. [Stas] Add $filter->ctx to maintain state between filter invocation + tests [Stas] Request input and output filters are now getting the EOS bucket, which wasn't passed through before. Now the context can be flushed on EOS. [Stas] =item 1.99_08 - January 10, 2003 Correct ModPerl::RegistryCooker to reset %INC, after compile for .pl files which don't declare the package + add tests to check that [Stas] Log the real error message when Foo::Bar::sub_name fails to resolve, because of a problem in Foo::Bar, when Foo::Bar *was* found [Stas] Add PerlPreConnectionHandler support in Apache::Test [Stas] Enable PerlPreConnectionHandler [Stas] Support the Host: request header in Apache::TestClient [Stas] restore the ModPerl::RegistryLoader::new() method for backwards compatibility [Stas] port the support for NameWithVirtualHost in ModPerl::RegistryCooker and ModPerl::RegistryLoader [Stas] fix the handling of the return status in ModPerl::RegistryCooker, add a test to verify that [Stas] under non-threaded perl need to check whether mod_perl is running, when modperl_vhost_is_running check is done. [Stas] fix $r->read to read all the requested amount of data if possible, adjust the test TestApache::read to verify that [Stas] fix the method content() in Apache::compat to read a whole request body. same for ModPerl::Test::read_post. add tests. [Stas] Adjust the reverse filter test to work on win32 (remove trailing \r) [Randy Kobes ] Strongly suggest win32 users to upgrade to 5.8.0, if they run 5.6.x [Randy Kobes ] When installing the mod_perl shared object, first need to check whether the directory 'modules' already exists, and create it if not. [Randy Kobes ] Add a capability to tune the test configuration sections ordering in Apache::TestConfigPerl [Stas Bekman] fix the complaining code about late PerlSwitches when PerlLoadModule is used before it [Stas Bekman] add various tests that exercise PerlLoadModule and vhosts [Stas Bekman] handle correctly PerlLoadModules (directives) with vhosts: - handle gracefully cases when things are undef/NULL - handle the case when scfg==NULL, by stealing the base_servers's config [Stas Bekman] make mod_perl work with vhosts when the server is started prior to post_config(): - call modperl_init_globals as early as possible, because the main server record is needed during the configuration parsing, for perlloadmodule and vhosts - also make sure that we are using a real base_server, when dealing with modperl_init, and if not retrieve it from the global record [Stas Bekman] prevent segfaults, when scfg is NULL in Apache::Module->get_config(); [Stas Bekman] ensure that a core file is a file indeed, before complaining [Philippe M. Chiasson ] add $r->as_string [Geoffrey Young] add backcompat vars: $Apache::Server::CWD and $Apache::Server::AddPerlVersion [Stas Bekman] env var MOD_PERL_TRACE is working again [Stas Bekman] add a new test TestDirective::perlloadmodule2, which performs a more evolved merging. [Stas Bekman] fix Apache::TestConfigPerl under mod_perl 1.0, need to require mod_perl.pm before using $mod_perl::VERSION [Geoffrey Young] add an Apache::SIG backcompat stub to Apache::compat [Stas Bekman] fix the Apache::TestConfigPerl's run_apache_test_config() function where test packages are scanned for the magic APACHE_TEST_CONFIGURE and if found get require()'d. Apache2 needs to be run for mod_perl 2.0. [Stas Bekman] move the custom mod_perl 2.0 configuration bits out of the ModPerl::TestRun, where they don't belong, into a special config file which is included at the very end of httpd.conf [Stas Bekman] extend Apache::Test to allow extra configuration files to be included at the very end of httpd.conf, when everything was loaded and configured [Stas Bekman] resolve a segfault in Apache::Module::get_config() for the edge case when the package name is bogus. [Stas Bekman] Apache::Reload: add support for watching and reloading modules only in specified sub-dirs [Harry Danilevsky ] enable APR.pm's linking for apr 0.9.2 and higher, which uses a new lib naming scheme, such as libapr-0.so.0.9.2, only if apr-config and apu-config scripts exist. [Stas Bekman] define IoTYPE_RDONLY/IoTYPE_WRONLY for perl-5.6.0 so the project compiles again under 5.6.0 [Stas Bekman] allow output streaming filters to append data to the end of the stream [Stas Bekman] fixes to compile with ActivePerl 5.8 beta [Randy Kobes ] fix for directive handlers within vhosts using threaded MPMs [Stephen Clouse ] fix support default AuthType to Basic if not set in $r->get_basic_auth_pw() [Philippe M. Chiasson ] workaround glibc/Perl-5.8.0 crypt() bug (seen with threaded MPMs) fix delete $ENV{$key} bug fix parse_args compat method to support non-ascii characters and tr/+/ / [Walery Studennikov ] fix post_connection compat method to behave as it did in 1.x [Geoffrey Young] add support for setting $r->auth_name and $r->auth_type [Philippe M. Chiasson ] add Apache->httpd_conf compat method [Philippe M. Chiasson ] add default handler Apache::PerlSection. make blocks to be EXEC_ON_READ so apache does not parse the contents. add "Perl" directive for general use and for which sections are stuffed into. [Philippe M. Chiasson ] rename overloaded LoadModule directive to PerlLoadModule and adjust the test naming =item 1.99_07 - September 25, 2002 fix =pod directive test config problem [Philippe M. Chiasson ] =item 1.99_06 - September 25, 2002 add support for pod directives (=pod,=back,=cut) and __END__ directive [Philippe M. Chiasson ] tweaks to support Test.pm 1.21 [Philippe M. Chiasson ] add $r->add_config method to add dynamic configuration at request time add Apache::DIR_MAGIC_TYPE constant add support for directive handlers fix source_scan to run with current httpd/apr add Apache::Server->add_config method to add dynamic configuration at server startup time add Apache::Directive->to_string method add support for pluggable sections fix compilation probs with get_remote_host() that had a wrong prototype [Stas Bekman] Apache::SubProcess now has a manpage [Stas Bekman] fix the Apache::SubProcess tests to work with perlio-disabled Perl [Stas Bekman] fix the filehandle leak in APR::PerlIO (both perlio-disabled and perlio-enabled Perl) [Stas Bekman] remove dup() when converting filehandles from apr_file_t to FILE* under perlio-disabled Perl (APR::PerlIO) [Stas Bekman] fix compilation if apache/apr do not have thread support =item 1.99_05 - August 20, 2002 fix PerlOptions +ParseHeaders to only parse once per-request add external redirects Registry tests [Stas Bekman] get rid of the compat layer in ModPerl-Registry [Stas Bekman] ModPerl::RegistryLoader is now fully operational and tested [Stas Bekman] Registry method handlers are now working [Stas Bekman] core Registry packages all compile the scripts into ModPerl::RegistryROOT:: namespace and cache them in %ModPerl::RegistryCache. Both overridable by the sub-classes. [Stas Bekman] compat tests were split into groups by functionality, send_fd test moved to compat. [Stas Bekman] added $c->get_remote_host and a compat wrapper $r->get_remote_host + tests [Stas Bekman] adjust the build system to support mod_perl build from the source tree. [Stas Bekman] ModPerl::RegistryCooker syncs with mod_perl 1.0's registry: - prototypes defined checks in flush_namespace [Yair Lenga ] - set error-notes on error [Geoffrey Young] - preserve status in Registry scripts [Geoffrey Young] apr_table_t is now an opaque type, use apr_table_elts() to get the array record [Stas Bekman] add support for redirects with PerlOptions +ParseHeaders backport to 2.0.35 adjust to filter register api change added APR::ThreadMutex module =item 1.99_04 - June 21, 2002 various APR PerlIO updates [Stas Bekman] stop using an apr_pool_t to allocate items for the interpreter pool, safer for threaded MPMs and prevents "leaks" when interpreters are removed from due to PerlInterpMax{Requests,Spare} implement modperl_sys_dlclose() to avoid apr/pool overhead/thread issues get the -DPERL_CORE optimization working again PERL_SET_CONTEXT to the parent interpreter when cloning interpreters at request time, else dTHX might be NULL during clone in the given thread, which would crash the server. =item 1.99_03 - June 15, 2002 win32 fix for the global Apache->request object to make sure it uses the thread local storage mechanism add a reference count mechanism to interpreters for use in threaded MPMs, so if APR::Pool cleanups have been registered the interpreter is not putback into the interpreter pool until all cleanups have run. unbuffer STDERR (by turning on autoflush by default) add support for Perl*Handler +Apache::Foo fix open_logs,post_config,child_init hooks to run in the proper order adjust to apr_bucket_type_t changes in 2.0.37-dev [Mladen Turk ] add MODPERL2 config define, as if the server had been started with -DMODPERL2 compat additions and fixes: $r->lookup_{file,uri}, $r->is_main, Apache->define added compat for Apache::log_error [Stas Bekman] =item 1.99_02 - June 1, 2002 pass the PATH and TZ environment variables at startup by default as 1.xx did fix ModPerl::Util::exit segv with 5.6.0 no longer support 5.7.x perl development versions added compat for Apache::Table->new various fixes to compile/run on darwin server-scope Perl{Set,Pass}Env config now propagated to %ENV at startup use SvOK(sv) instead of sv == &PL_sv_undef to detect undef values in xs [Stephen Clouse ] complete Apache::Util 1.x compat added Apache::MPM_IS_THREADED constant added compat function for Apache::Constants::SERVER_VERSION added Apache::Constants::export stub for compat added noop stubs for timeout functions removed from 2.0: $r->{soft,hard,reset,kill}_timeout turned on PerlOptions +GlobalRequest by default for perl-script handler unless it is explicitly turned off with PerlOptions -GlobalRequest added APR::OS::thread_current function added support for 1.x $r->subprocess_env functionality added support for $r->push_handlers(PerlHandler => ...) added support for $r->proxyreq to detect proxy requests $r->content_type($val) now calls ap_set_content_type underneath add the err_header_out() wrapper to Apache::compat + corresponding tests [Stas Bekman] fix $r->dir_config lookup of values set in the server context added Apache::REDIRECT shortcut constant various fixes for method handlers use Apache::ServerUtil in Apache::compat so Apache->server works in compat mode [Dave Rolsky ] add Apache::Util::unescape_uri alias to Apache::unescape_url in Apache::compat change Apache::unescape_url to return the escaped url as 1.x does disabled term coloring by default (enable with env var APACHE_TEST_COLOR=1) fix for APR::IpSubnet->new to check return status apr_ipsubnet_create enabled APR::SockAddr module turn on binmode for filehandle used in $r->send_fd get MP_{TRACE,DEBUG} Makefile.PL options working on win32 various fixes to build/run with bleedperl various fixes for win32 to get make test passing moved constuct_{url,server} methods to Apache::URI module implement Apache::URI::parse in Apache::compat give Perl*Handlers precedence over other handlers by using APR_HOOK_FIRST rather than APR_HOOK_LAST workaround bug in 5.6.1 when XSLoader loads DynaLoader, wiping out any dl handles it had been keeping track of. tidy up test to run standalone (without modperl test config) [Stas Bekman] override T_PTROBJ INPUT typemap to croak if object is not a blessed reference, to prevent possible segv from e.g. Apache::Server->process apr_lock.h is gone; disable APR::Lock for the moment enabled the Apache::Process module fix ModPerl::Util::exit to clear $@ before calling Perl_croak cut down on some build noise fix 'PerlOptions +GlobalRequest' when used within subrequests get rid of some "subroutine redefined" warnings in ModPerl::MM that show up with newer bleedperls. a few fixes for Apache::compat [Dave Rolsky ] =item 1.99_01 - April 6, 2002 First public release of mod_perl-2.0-tobe. =back =cut mod_perl-2.0.9/docs/0000755000104000010010000000000012540623177014723 5ustar AdministratorsNonemod_perl-2.0.9/docs/api/0000755000104000010010000000000012540623177015474 5ustar AdministratorsNonemod_perl-2.0.9/docs/api/Apache2/0000755000104000010010000000000012540623177016737 5ustar AdministratorsNonemod_perl-2.0.9/docs/api/Apache2/Access.pod0000644000177200010010000003434412540623176016752 0ustar SteveNone=head1 NAME Apache2::Access - A Perl API for Apache request object: Access, Authentication and Authorization. =head1 Synopsis use Apache2::Access (); # allow only GET method $r->allow_methods(1, qw(GET)); # Apache Options value $options = $r->allow_options(); # Apache AllowOverride value $allow_override = $r->allow_overrides(); # which Options are allowed by AllowOverride (since Apache 2.2) $allow_override_opts = $r->allow_override_opts(); # auth name ("foo bar") $auth_name = $r->auth_name(); # auth type $auth_type = $r->auth_type(); $r->auth_type("Digest"); # Basic authentication process my ($rc, $passwd) = $r->get_basic_auth_pw(); # the login name of the remote user (RFC1413) $remote_logname = $r->get_remote_logname(); # dynamically figure out which auth has failed $r->note_auth_failure(); # note Basic auth failure $r->note_basic_auth_failure(); # note Digest auth failure $r->note_digest_auth_failure(); # Apache Request value(s) $requires = $r->requires(); # Apache Satisfy value (as a number) $satisfy = $r->satisfies(); # check whether some auth is configured $need_auth = $r->some_auth_required(); =head1 Description The API provided by this module deals with access, authentication and authorization phases. C extends C>. =head1 API C provides the following functions and/or methods: =head2 C Specify which HTTP methods are allowed $r->allow_methods($reset); $r->allow_methods($reset, @methods); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$reset> ( boolean ) If a true value is passed all the previously allowed methods are removed. Otherwise the list is left intact. =item opt arg2: C<@methods> ( array of strings ) a list of HTTP methods to be allowed (e.g. C and C) =item ret: no return value =item since: 2.0.00 =back For example: here is how to allow only C and C methods, regardless to what was the previous setting: $r->allow_methods(1, qw(GET POST)); =head2 C Retrieve the value of C for this request $options = $r->allow_options(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$options> ( integer ) the C bitmask. Normally used with bitlogic operators against C>. =item since: 2.0.00 =back For example if the configuration for the current request was: Options None Options Indexes FollowSymLinks The following applies: use Apache2::Const -compile => qw(:options); $r->allow_options & Apache2::Const::OPT_INDEXES; # TRUE $r->allow_options & Apache2::Const::OPT_SYM_LINKS; # TRUE $r->allow_options & Apache2::Const::OPT_EXECCGI; # FALSE =head2 C Retrieve the value of C for this request $allow_override = $r->allow_overrides(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$allow_override> ( integer ) the C bitmask. Normally used with bitlogic operators against C>. =item since: 2.0.00 =back For example if the configuration for the current request was: AllowOverride AuthConfig The following applies: use Apache2::Const -compile => qw(:override); $r->allow_overrides & Apache2::Const::OR_AUTHCFG; # TRUE $r->allow_overrides & Apache2::Const::OR_LIMIT; # FALSE =head2 C Retrieve the bitmask of allowed C set by C for this request $override_opts = $r->allow_override_opts(); Enabling single options was introduced in Apache 2.2. For Apache 2.0 this function returns C> | C> | C> | C> | C>, which corresponds to the default value (if not set) for Apache 2.2. =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$override_opts> ( integer ) the override options bitmask. Normally used with bitlogic operators against C>. =item since: 2.0.3 =back For example if the configuration for the current request was: AllowOverride Options=Indexes,ExecCGI The following applies: use Apache2::Const -compile => qw(:options); $r->allow_override_opts & Apache2::Const::OPT_EXECCGI; # TRUE $r->allow_override_opts & Apache2::Const::OPT_SYM_LINKS; # FALSE =head2 C Get/set the current Authorization realm (the per directory configuration directive C): $auth_name = $r->auth_name(); $auth_name = $r->auth_name($new_auth_name); =over 4 =item obj: C<$r> ( C> ) The current request =item opt arg1: C<$new_auth_name> ( string ) If C<$new_auth_name> is passed a new C value is set =item ret: C<$> ( integer ) The current value of C =item since: 2.0.00 =back The C directive creates protection realm within the server document space. To quote RFC 1945 "These realms allow the protected resources on a server to be partitioned into a set of protection spaces, each with its own authentication scheme and/or authorization database." The client uses the root URL of the server to determine which authentication credentials to send with each HTTP request. These credentials are tagged with the name of the authentication realm that created them. Then during the authentication stage the server uses the current authentication realm, from C<$r-Eauth_name>, to determine which set of credentials to authenticate. =head2 C Get/set the type of authorization required for this request (the per directory configuration directive C): $auth_type = $r->auth_type(); $auth_type = $r->auth_type($new_auth_type); =over 4 =item obj: C<$r> ( C> ) The current request =item opt arg1: C<$new_auth_type> ( string ) If C<$new_auth_type> is passed a new C value is set =item ret: C<$> ( integer ) The current value of C =item since: 2.0.00 =back Normally C would be set to C to use the basic authentication scheme defined in RFC 1945, I. However, you could set to something else and implement your own authentication scheme. =head2 C Get the password from the request headers my ($rc, $passwd) = $r->get_basic_auth_pw(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret1: C<$rc> ( C> ) C if the C<$passwd> value is set (and assured a correct value in Cuser|docs::2.0::api::Apache2::RequestRec/C_user_>>); otherwise it returns an error code, either C if things are really confused, C if no authentication at all seemed to be in use, or C if there was authentication, but it wasn't C (in which case, the caller should presumably decline as well). =item ret2: C<$ret> (string) The password as set in the headers (decoded) =item since: 2.0.00 =back If C> is not set, this handler first sets it to C. =head2 C Retrieve the login name of the remote user (RFC1413) $remote_logname = $r->get_remote_logname(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$remote_logname> ( string ) The username of the user logged in to the client machine, or an empty string if it could not be determined via RFC1413, which involves querying the client's identd or auth daemon. =item since: 2.0.00 =back Do not confuse this method with Cuser|docs::2.0::api::Apache2::RequestRec/C_user_>>, which provides the username provided by the user during the server authentication. =head2 C Setup the output headers so that the client knows how to authenticate itself the next time, if an authentication request failed. This function works for both basic and digest authentication $r->note_auth_failure(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: no return value =item since: 2.0.00 =back This method requires C to be set to C or C. Depending on the setting it'll call either Cnote_basic_auth_failure|/C_note_basic_auth_failure_>> or Cnote_digest_auth_failure|/C_note_digest_auth_failure_>>. =head2 C Setup the output headers so that the client knows how to authenticate itself the next time, if an authentication request failed. This function works only for basic authentication $r->note_basic_auth_failure(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: no return value =item since: 2.0.00 =back =head2 C Setup the output headers so that the client knows how to authenticate itself the next time, if an authentication request failed. This function works only for digest authentication. $r->note_digest_auth_failure(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: no return value =item since: 2.0.00 =back =head2 C Retrieve information about all of the requires directives for this request $requires = $r->requires =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$requires> ( ARRAY ref ) Returns an array reference of hash references, containing information related to the C directive. =item since: 2.0.00 =back This is normally used for access control. For example if the configuration had the following require directives: Require user goo bar Require group bar tar this method will return the following datastructure: [ { 'method_mask' => -1, 'requirement' => 'user goo bar' }, { 'method_mask' => -1, 'requirement' => 'group bar tar' } ]; The I field is what was passed to the C directive. The I field is a bitmask which can be modified by the C directive, but normally it can be safely ignored as it's mostly used internally. For example if the configuration was: Require user goo bar Require group bar tar Require valid-user and the request method was C, C<$r-Erequires> will return: [ { 'method_mask' => -1, 'requirement' => 'user goo bar' }, { 'method_mask' => -1, 'requirement' => 'group bar tar' } { 'method_mask' => 4, 'requirement' => 'valid-user' } ]; But if the request method was C, it will return only: [ { 'method_mask' => -1, 'requirement' => 'user goo bar' }, { 'method_mask' => -1, 'requirement' => 'group bar tar' } ]; As you can see Apache gives you the requirements relevant for the current request, so the I is irrelevant. It is also a good time to remind that in the general case, access control directives should not be placed within a ELimitE section. Refer to the Apache documentation for more information. Using the same configuration and assuming that the request was of type POST, the following code inside an Auth handler: my %require = map { my ($k, $v) = split /\s+/, $_->{requirement}, 2; ($k, $v||'') } @{ $r->requires }; will populate C<%require> with the following pairs: 'group' => 'bar tar', 'user' => 'goo bar', 'valid-user' => '', =head2 C How the requires lines must be met. What's the applicable value of the C directive: $satisfy = $r->satisfies(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$satisfy> ( integer ) How the requirements must be met. One of the C>: C>, C> and C>. =item since: 2.0.00 =back See the documentation for the C directive in the Apache documentation. =head2 C Can be used within any handler to determine if any authentication is required for the current request: $need_auth = $r->some_auth_required(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$need_auth> ( boolean ) TRUE if authentication is required, FALSE otherwise =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/CmdParms.pod0000644000177200010010000002262512540623176017256 0ustar SteveNone=head1 NAME Apache2::CmdParms - Perl API for Apache command parameters object =head1 Synopsis use Apache2::CmdParms (); use Apache2::Module (); use Apache2::Const -compile => qw(NOT_IN_LOCATION); my @directives = ( { name => 'MyDirective', cmd_data => 'some extra data', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub MyDirective { my ($self, $parms, $args) = @_; # push config $parms->add_config(['ServerTokens off']); # this command's command object $cmd = $parms->cmd; # check the current command's context $error = $parms->check_cmd_context(Apache2::Const::NOT_IN_LOCATION); # this command's context $context = $parms->context; # this command's directive object $directive = $parms->directive; # the extra information passed thru cmd_data to # Apache2::Module::add() $info = $parms->info; # which methods are ed ? $is_limited = $parms->method_is_limited('GET'); # which allow-override bits are set $override = $parms->override; # which Options are allowed by AllowOverride (since Apache 2.2) $override = $parms->override_opts; # the path this command is being invoked in $path = $parms->path; # this command's pool $p = $parms->pool; # this command's configuration time pool $p = $parms->temp_pool; } =head1 Description C provides the Perl API for Apache command parameters object. =head1 API C provides the following functions and/or methods: =head2 C Dynamically add Apache configuration at request processing runtime: $parms->add_config($lines); =over 4 =item obj: C<$parms> ( C> ) =item arg1: C<$lines> (ARRAY ref) An ARRAY reference containing configuration lines per element, without the new line terminators. =item ret: no return value =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_add_config_>>, Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_add_config_>> =head2 C Check the current command against a context bitmask of forbidden contexts. $error = $parms->check_cmd_context($check); =over 4 =item obj: C<$parms> ( C> ) =item arg1: C<$check> ( C> ) the context to check against. =item ret: C<$error> ( string / undef ) If the context is forbidden, this method returns a textual description of why it was forbidden. If the context is permitted, this method returns C. =item since: 2.0.00 =back For example here is how to check whether a command is allowed in the CLocationE> container: use Apache2::Const -compile qw(NOT_IN_LOCATION); if (my $error = $parms->check_cmd_context(Apache2::Const::NOT_IN_LOCATION)) { die "directive ... not allowed in context" } =head2 C This module's command information $cmd = $parms->cmd(); =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$cmd> ( C> ) =item since: 2.0.00 =back =head2 C This command's directive object in the configuration tree $directive = $parms->directive; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$directive> ( C> ) The current directive node in the configuration tree =item since: 2.0.00 =back =head2 C The extra information passed through C in C>. $info = $parms->info; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$info> ( string ) The string passed in C =item since: 2.0.00 =back For example here is how to pass arbitrary information to a directive subroutine: my @directives = ( { name => 'MyDirective1', func => \&MyDirective, cmd_data => 'One', }, { name => 'MyDirective2', func => \&MyDirective, cmd_data => 'Two', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub MyDirective { my ($self, $parms, $args) = @_; my $info = $parms->info; } In this example C<$info> will either be C<'One'> or C<'Two'> depending on whether the directive was called as I or I. =head2 C Discover if a method is ELimitEed in the current scope $is_limited = $parms->method_is_limited($method); =over 4 =item obj: C<$parms> ( C> ) =item arg1: C<$method> (string) The name of the method to check for =item ret: C<$is_limited> ( boolean ) =item since: 2.0.00 =back For example, to check if the C method is being CLimitE>ed in the current scope, do: if ($parms->method_is_limited('GET') { die "..."; } =head2 C Which allow-override bits are set (C directive) $override = $parms->override; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$override> ( bitmask ) the allow-override bits bitmask, which can be tested against C>. =item since: 2.0.00 =back For example to check that the C's C and C options are enabled for this command, do: use Apache2::Const -compile qw(:override); $wanted = Apache2::Const::OR_AUTHCFG | Apache2::Const::OR_FILEINFO; $masked = $parms->override & $wanted; unless ($wanted == $masked) { die "..."; } =head2 C Which options are allowed to be overridden by C<.htaccess> files. This is set by C. $override_opts = $parms->override_opts; Enabling single options was introduced with Apache 2.2. For Apache 2.0 this function simply returns a bitmask with all options allowed. =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$override_opts> ( bitmask ) the bitmask, which can be tested against C>. =item since: 2.0.3 =back =head2 C The current pathname/location/match of the block this command is in $path = $parms->path; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$path> ( string / C ) If configuring for a block like ELocationE, ELocationMatchE, EDirectoryE, etc., the pathname part of that directive. Otherwise, C is returned. =item since: 2.0.00 =back For example for a container block: ... I<'/foo'> will be returned. =head2 C Pool associated with this command $p = $parms->pool; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$p> ( C> ) =item since: 2.0.00 =back =head2 C The (vhost) server this command was defined in F $s = $parms->server; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$s> ( C> ) =item since: 2.0.00 =back =head2 C Pool for scratch memory; persists during configuration, but destroyed before the first request is served. $temp_pool = $parms->temp_pool; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$temp_pool> ( C> ) =item since: 2.0.00 =back Most likely you shouldn't use this pool object, unless you know what you are doing. Use Cpool|/C_pool_>> instead. =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C Get context containing pointers to modules' per-dir config structures. $context = $parms->context; =over 4 =item obj: C<$parms> ( C> ) =item ret: C<$newval> ( C> ) Returns the commands' per-dir config structures =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Command.pod0000644000177200010010000000560712540623176017127 0ustar SteveNone=head1 NAME Apache2::Command - Perl API for accessing Apache module command information =head1 Synopsis use Apache2::Module (); use Apache2::Command (); my $module = Apache2::Module::find_linked_module('mod_perl.c'); for (my $cmd = $module->cmds; $cmd; $cmd = $cmd->next) { $cmd->args_how(); $cmd->errmsg(); $cmd->name(); $cmd->req_override(); } =head1 Description C provides the Perl API for accessing Apache module command information =head1 API C provides the following functions and/or methods: =head2 C What the command expects as arguments: $how = $cmd->args_how(); =over 4 =item obj: C<$cmd> ( C> ) =item ret: C<$how> ( C> ) The flag value representing the type of this command (i.e. C, C). =item since: 2.0.00 =back =head2 C Get I message for that command, in case of syntax errors: $error = $cmd->errmsg(); =over 4 =item obj: C<$cmd> ( C> ) =item ret: C<$error> ( string ) The error message =item since: 2.0.00 =back =head2 C Get the name of this command: $name = $cmd->name(); =over 4 =item obj: C<$cmd> ( C> ) =item ret: C<$name> ( string ) The command name =item since: 2.0.00 =back =head2 C Get the next command in the chain of commands for this module: $next = $cmd->next(); =over 4 =item obj: C<$cmd> ( C> ) =item ret: C<$next> ( C> ) Returns the next command in the chain for this module, C for the last command. =item since: 2.0.00 =back =head2 C What overrides need to be allowed to enable this command: $override = $cmd->req_override =over 4 =item obj: C<$cmd> ( C> ) =item ret: C<$override> ( C> ) The bit mask representing the overrides this command is allowed in (i.e C/C). =item since: 2.0.00 =back For example: use Apache2::Const -compile => qw(:override); $cmd->req_override() & Apache2::Const::OR_AUTHCFG; $cmd->req_override() & Apache2::Const::OR_LIMIT; =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/compat.pod0000644000177200010010000001350212540623176017025 0ustar SteveNone=head1 NAME Apache2::compat -- 1.0 backward compatibility functions deprecated in 2.0 =head1 Synopsis # either add at the very beginning of startup.pl use Apache2::compat; # or httpd.conf PerlModule Apache2::compat # override and restore compat functions colliding with mp2 API Apache2::compat::override_mp2_api('Apache2::Connection::local_addr'); my ($local_port, $local_addr) = sockaddr_in($c->local_addr); Apache2::compat::restore_mp2_api('Apache2::Connection::local_addr'); =head1 Description C provides mod_perl 1.0 compatibility layer and can be used to smooth the transition process to mod_perl 2.0. It includes functions that have changed their API or were removed in mod_perl 2.0. If your code uses any of those functions, you should load this module at the server startup, and everything should work as it did in 1.0. If it doesn't please L, but before you do that please make sure that your code does work properly under mod_perl 1.0. However, remember, that it's implemented in pure Perl and not C, therefore its functionality is not optimized and it's the best to try to L not to use deprecated functions and stop using the compatibility layer. =head1 Compatibility Functions Colliding with mod_perl 2.0 API Most of the functions provided by Apache2::compat don't interfere with mod_perl 2.0 API. However there are several functions which have the same name in the mod_perl 1.0 and mod_perl 2.0 API, accept the same number of arguments, but either the arguments themselves aren't the same or the return values are different. For example the mod_perl 1.0 code: require Socket; my $sockaddr_in = $c->local_addr; my ($local_port, $local_addr) = Socket::sockaddr_in($sockaddr_in); should be adjusted to be: require Apache2::Connection; require APR::SockAddr; my $sockaddr = $c->local_addr; my ($local_port, $local_addr) = ($sockaddr->port, $sockaddr->ip_get); to work under mod_perl 2.0. As you can see in mod_perl 1.0 API local_addr() was returning a SOCKADDR_IN object (see the Socket perl manpage), in mod_perl 2.0 API it returns an C> object, which is a totally different beast. If Apache2::compat overrides the function C to be back-compatible with mod_perl 1.0 API. Any code that relies on this function to work as it should under mod_perl 2.0 will be broken. Therefore the solution is not to override C by default. Instead a special API is provided which overrides colliding functions only when needed and which can be restored when no longer needed. So for example if you have code from mod_perl 1.0: my ($local_port, $local_addr) = Socket::sockaddr_in($c->local_addr); and you aren't ready to port it to to use the mp2 API: my ($local_port, $local_addr) = ($c->local_addr->port, $c->local_addr->ip_get); you could do the following: Apache2::compat::override_mp2_api('Apache2::Connection::local_addr'); my ($local_port, $local_addr) = Socket::sockaddr_in($c->local_addr); Apache2::compat::restore_mp2_api('Apache2::Connection::local_addr'); Notice that you need to restore the API as soon as possible. Both C and C accept a list of functions to operate on. =head2 Available Overridable Functions At the moment the following colliding functions are available for overriding: =over =item Apache2::RequestRec::notes =item Apache2::RequestRec::filename =item Apache2::RequestRec::finfo =item Apache2::Connection::local_addr =item Apache2::Connection::remote_addr =item Apache2::Util::ht_time =item Apache2::Module::top_module =item Apache2::Module::get_config =item APR::URI::unparse =back =head1 Use in CPAN Modules The short answer: B C in CPAN modules. The long answer: C is useful during the mod_perl 1.0 code porting. Though remember that it's implemented in pure Perl. In certain cases it overrides mod_perl 2.0 methods, because their API is very different and doesn't map 1:1 to mod_perl 1.0. So if anything, not under user's control, loads C user's code is forced to use the potentially slower method. Which is quite bad. Some users may choose to keep using C in production and it may perform just fine. Other users will choose not to use that module, by porting their code to use mod_perl 2.0 API. However it should be users' choice whether to load this module or not and not to be enforced by CPAN modules. If you port your CPAN modules to work with mod_perl 2.0, you should follow the porting L and L module guidelines. Users that are stuck with CPAN modules preloading C, can prevent this from happening by adding $INC{'Apache2/compat.pm'} = __FILE__; at the very beginning of their I. But this will most certainly break the module that needed this module. =head1 API You should be reading the mod_perl 1.0 L for usage of the methods and functions in this package, since what this module is doing is providing a backwards compatibility and it makes no sense to duplicate documentation. Another important document to read is: L which covers all mod_perl 1.0 constants, functions and methods that have changed in mod_perl 2.0. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Connection.pod0000644000177200010010000003612312540623176017645 0ustar SteveNone=head1 NAME Apache2::Connection - Perl API for Apache connection object =head1 Synopsis use Apache2::Connection (); use Apache2::RequestRec (); my $c = $r->connection; my $c = $r->connection; # is connection still open? $status = $c->aborted; # base server $base_server = $c->base_server(); # needed for creating buckets/brigades $ba = $c->bucket_alloc(); # client's socket $socket = $c->client_socket; # unique connection id $id = $c->id(); # connection filters stack $input_filters = $c->input_filters(); $output_filters = $c->output_filters(); # keep the connection alive? $status = $c->keepalive(); # how many requests served over the current connection $served = $c->keepalives(); # this connection's local and remote socket addresses $local_sa = $c->local_addr(); $remote_sa = $c->remote_addr(); # local and remote hostnames $local_host = $c->local_host(); $remote_host = $c->get_remote_host(); $remote_host = $c->remote_host(); # server and remote client's IP addresses $local_ip = $c->local_ip(); $remote_ip = $c->remote_ip(); # connection level Apache notes $notes = $c->notes(); # this connection's pool $p = $c->pool(); =head1 Description C provides the Perl API for Apache connection record object. =head1 API C provides the following functions and/or methods: =head2 C Check whether the connection is still open $status = $c->aborted(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$status> ( boolean ) true if the connection has been aborted, false if still open =item since: 2.0.00 =back =head2 C Physical server this connection came in on (main server or vhost): $base_server = $c->base_server(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$base_server> ( C> ) =item since: 2.0.00 =back =head2 C The bucket allocator to use for all bucket/brigade creations $ba = $c->bucket_alloc(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$ba> ( C> ) =item since: 2.0.00 =back This object is needed by C> and C> methods/functions. =head2 C Get/set the client socket $socket = $c->client_socket; $prev_socket = $c->client_socket($new_socket); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_socket> ( C> object ) If passed a new socket will be set. =item ret: C<$socket> ( C> object ) current client socket if the optional argument C<$new_socket> was passed the previous socket object is returned. =item since: 2.0.00 =back =head2 C Lookup the client's DNS hostname or IP address $remote_host = $c->remote_host(); $remote_host = $c->remote_host($type); $remote_host = $c->remote_host($type, $dir_config); =over 4 =item obj: C<$c> ( C> ) The current connection =item opt arg1: C<$type> ( C> ) The type of lookup to perform: =over =item C will always force a DNS lookup, and also force a double reverse lookup, regardless of the C setting. The result is the (double reverse checked) hostname, or undef if any of the lookups fail. =item C returns the hostname, or C if the hostname lookup fails. It will force a DNS lookup according to the C setting. =item C returns the hostname, or the dotted quad if the hostname lookup fails. It will force a DNS lookup according to the C setting. =item C is like C except that a DNS lookup is never forced. =back Default value is C. =item opt arg2: C<$dir_config> ( C> ) The directory config vector from the request. It's needed to find the container in which the directive C is set. To get one for the current request use Cper_dir_config|docs::2.0::api::Apache2::RequestRec/C_per_dir_config_>>. By default, C is passed, in which case it's the same as if C was set to C. =item ret: C<$remote_host> ( string/undef ) The remote hostname. If the configuration directive B is set to off, this returns the dotted decimal representation of the client's IP address instead. Might return C if the hostname is not known. =item since: 2.0.00 =back The result of C call is cached in Cremote_host|/C_remote_host_>>. If the latter is set, C will return that value immediately, w/o doing any checkups. =head2 C ID of this connection; unique at any point in time $id = $c->id(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$id> (integer) =item since: 2.0.00 =back =head2 C Get/set the first filter in a linked list of protocol level input filters: $input_filters = $c->input_filters(); $prev_input_filters = $c->input_filters($new_input_filters); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_input_filters> Set a new value =item ret: C<$input_filters> ( C> ) The first filter in the connection input filters chain. If C<$new_input_filters> was passed, returns the previous value. =item since: 2.0.00 =back For an example see: L =head2 C This method answers the question: Should the the connection be kept alive for another HTTP request after the current request is completed? $status = $c->keepalive(); $status = $c->keepalive($new_status); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_status> ( C> ) Normally you should not mess with setting this option when handling the HTTP protocol. If you do (for example when sending your own headers set with Cassbackwards|docs::2.0::api::Apache2::RequestRec/C_assbackwards_>>) -- take a look at the ap_set_keepalive() function in F. =item ret: C<$status> ( C> ) The method does B return true or false, but one of the states which can be compared against (C>). =item since: 2.0.00 =back Unless you set this value yourself when implementing non-HTTP protocols, it's only relevant for HTTP requests. For example: use Apache2::RequestRec (); use Apache2::Connection (); use Apache2::Const -compile => qw(:conn_keepalive); ... my $c = $r->connection; if ($c->keepalive == Apache2::Const::CONN_KEEPALIVE) { # do something } elsif ($c->keepalive == Apache2::Const::CONN_CLOSE) { # do something else } elsif ($c->keepalive == Apache2::Const::CONN_UNKNOWN) { # do yet something else } else { # die "unknown state"; } Notice that new states could be added later by Apache, so your code should make no assumptions and do things only if the desired state matches. =head2 C How many requests were already served over the current connection. $served = $c->keepalives(); $served = $c->keepalives($new_served); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_served> (integer) Set the number of served requests over the current connection. Normally you won't do that when handling HTTP requests. (But see below a note regarding Cassbackwards|docs::2.0::api::Apache2::RequestRec/C_assbackwards_>>). =item ret: C<$served> (integer) How many requests were already served over the current connection. In most handlers, but HTTP output filter handlers, that value doesn't count the current request. For the latter it'll count the current request. =item since: 2.0.00 =back This method is only relevant for L connections. The core connection output filter C increments this value when the response headers are sent and it decides that the connection should not be closed (see C). If you send your own set of HTTP headers with Cassbackwards|docs::2.0::api::Apache2::RequestRec/C_assbackwards_>>, which includes the C HTTP response header, you must make sure to increment the C counter. =head2 C Get this connection's local socket address $local_sa = $c->local_addr(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$local_sa> ( C> ) =item since: 2.0.00 =back =head2 C used for ap_get_server_name when UseCanonicalName is set to DNS (ignores setting of HostnameLookups) $local_host = $c->local_host(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$local_host> (string) =item since: 2.0.00 =back META: you probably shouldn't use this method, but ( C> ) if inside request and C<$r> is available. =head2 C server IP address $local_ip = $c->local_ip(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$local_ip> (string) =item since: 2.0.00 =back =head2 C Get/set text notes for the duration of this connection. These notes can be passed from one module to another (not only mod_perl, but modules in any other language): $notes = $c->notes(); $prev_notes = $c->notes($new_notes); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_notes> ( C> ) =item ret: C<$notes> ( C> ) the current notes table. if the C<$new_notes> argument was passed, returns the previous value. =item since: 2.0.00 =back Also see Cnotes|docs::2.0::api::Apache2::RequestRec/C_notes_>> =head2 C Get the first filter in a linked list of protocol level output filters: $output_filters = $c->output_filters(); $prev_output_filters = $r->output_filters($new_output_filters); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_output_filters> Set a new value =item ret: C<$output_filters> ( C> ) The first filter in the connection output filters chain. If C<$new_output_filters> was passed, returns the previous value. =item since: 2.0.00 =back For an example see: L =head2 C Pool associated with this connection $p = $c->pool(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$p> ( C> ) =item since: 2.0.00 =back =head2 C Get this connection's remote socket address $remote_sa = $c->remote_addr(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$remote_sa> ( C> ) =item since: 2.0.00 =back =head2 C Client's IP address $remote_ip = $c->remote_ip(); $prev_remote_ip = $c->remote_ip($new_remote_ip); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$new_remote_ip> ( string ) If passed a new value will be set =item ret: C<$remote_ip> ( string ) current remote ip address if the optional argument C<$new_remote_ip> was passed the previous value is returned. =item since: 2.0.00 =back =head2 C Client's DNS name: $remote_host = $c->remote_host(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$remote_host> ( string/undef ) If Cget_remote_host|/C_get_remote_host_>> was run it returns the cached value, which is a client DNS name or C<""> if it wasn't found. If the check wasn't run -- C is returned. =item since: 2.0.00 =back It's best to to call Cget_remote_host|/C_get_remote_host_>> instead of directly accessing this variable. =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C Config vector containing pointers to connections per-server config structures $ret = $c->conn_config(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$ret> ( C> ) =item since: 2.0.00 =back =head2 C META: Autogenerated - needs to be reviewed/completed handle to scoreboard information for this connection $sbh = $c->sbh(); =over 4 =item obj: C<$c> ( C> ) =item ret: C<$sbh> (XXX) =item since: 2.0.00 =back META: Not sure how this can be used from mod_perl at the moment. Unless C is extended to provide a hook to read from this variable. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/ConnectionUtil.pod0000644000177200010010000000443312540623176020502 0ustar SteveNone=head1 NAME Apache2::ConnectionUtil - Perl API for Apache connection utils =head1 Synopsis use Apache2::Connection (); use Apache2::ConnectionUtil (); use Apache2::RequestRec (); # grab the connection object; my $c = $r->connection; # share perl objects like $r->pnotes $old_val = $c->pnotes($key => $value); =head1 Description C provides the L utilities API. =head1 API C provides the following functions and/or methods: =head2 C Share Perl variables between requests over the lifetime of the connection. $old_val = $c->pnotes($key => $val); $val = $c->pnotes($key); $hash_ref = $c->pnotes(); =over 4 =item obj: C<$c> ( C> ) =item opt arg1: C<$key> ( string ) A key value =item opt arg2: C<$val> ( SCALAR ) Any scalar value (e.g. a reference to an array) =item ret: (3 different possible values) if both, C<$key> and C<$val> are passed the previous value for C<$key> is returned if such existed, otherwise undef is returned. if only C<$key> is passed, the current value for the given key is returned. if no arguments are passed, a hash reference is returned, which can then be directly accessed without going through the C interface. =item since: 2.0.3 =back See (C>) for the details of the C method usage. The usage is identical except for a few differences. First is the use of C<$c> instead of C<$r> as the invocant. The second is that the the data persists for the lifetime of the connection instead of the lifetime of the request. If the connection is lost, so is the data stored in C. =head1 See Also L. L. L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Const.pod0000644000177200010010000006055112540623176016636 0ustar SteveNone=head1 NAME Apache2::Const - Perl Interface for Apache Constants =head1 Synopsis # make the constants available but don't import them use Apache2::Const -compile => qw(constant names ...); # w/o the => syntax sugar use Apache2::Const ("-compile", qw(constant names ...)); # compile and import the constants use Apache2::Const qw(constant names ...); =head1 Description This package contains constants specific to C features. mod_perl 2.0 comes with several hundreds of constants, which you don't want to make available to your Perl code by default, due to CPU and memory overhead. Therefore when you want to use a certain constant you need to explicitly ask to make it available. For example, the code: use Apache2::Const -compile => qw(FORBIDDEN OK); makes the constants C and C available to your code, but they aren't imported. In which case you need to use a fully qualified constants, as in: return Apache2::Const::OK; If you drop the argument C<-compile> and write: use Apache2::Const qw(FORBIDDEN OK); Then both constants are imported into your code's namespace and can be used standalone like so: return OK; Both, due to the extra memory requirement, when importing symbols, and since there are constants in other namespaces (e.g., C> and C>, and non-mod_perl modules) which may contain the same names, it's not recommended to import constants. I.e. you want to use the C<-compile> construct. Finaly, in Perl C<=E> is almost the same as the comma operator. It can be used as syntax sugar making it more clear when there is a key-value relation between two arguments, and also it automatically parses its lefthand argument (the key) as a string, so you don't need to quote it. If you don't want to use that syntax, instead of writing: use Apache2::Const -compile => qw(FORBIDDEN OK); you could write: use Apache2::Const "-compile", qw(FORBIDDEN OK); and for parentheses-lovers: use Apache2::Const ("-compile", qw(FORBIDDEN OK)); =head1 Constants =head2 C<:cmd_how> use Apache2::Const -compile => qw(:cmd_how); The C<:cmd_how> constants group is used in C> and Cargs_how|docs::2.0::api::Apache2::Command/C_args_how_>>. =head3 C One of I or I (L). =over =item since: 2.0.00 =back =head3 C One argument, occuring multiple times (L). =over =item since: 2.0.00 =back =head3 C Two arguments, the second occurs multiple times (L). =over =item since: 2.0.00 =back =head3 C No arguments at all (L). =over =item since: 2.0.00 =back =head3 C The command will parse the command line itself (L). =over =item since: 2.0.00 =back =head3 C One argument only (L). =over =item since: 2.0.00 =back =head3 C One or two arguments (L). =over =item since: 2.0.00 =back =head3 C One, two or three arguments (L). =over =item since: 2.0.00 =back =head3 C One or three arguments (L). =over =item since: 2.0.00 =back =head3 C Two arguments (L). =over =item since: 2.0.00 =back =head3 C Two or three arguments (L). =over =item since: 2.0.00 =back =head3 C Three arguments (L). =over =item since: 2.0.00 =back =head2 C<:common> use Apache2::Const -compile => qw(:common); The C<:common> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:config> use Apache2::Const -compile => qw(:config); The C<:config> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head2 C<:conn_keepalive> use Apache2::Const -compile => qw(:conn_keepalive); The C<:conn_keepalive> constants group is used by the (Ckeepalive|docs::2.0::api::Apache2::Connection/C_keepalive_>>) method. =head3 C The connection will be closed at the end of the current HTTP request. =over =item since: 2.0.00 =back =head3 C The connection will be kept alive at the end of the current HTTP request. =over =item since: 2.0.00 =back =head3 C The connection is at an unknown state, e.g., initialized but not open yet. =over =item since: 2.0.00 =back =head2 C<:context> use Apache2::Const -compile => qw(:context); The C<:context> group is used by the Ccheck_cmd_context|docs::2.0::api::Apache2::CmdParms/C_check_cmd_context_>> method. =head3 C The command is not in a EVirtualHostE block. =over =item since: 2.0.00 =back =head3 C The command is not in a ELimitE block. =over =item since: 2.0.00 =back =head3 C The command is not in a EDirectoryE block. =over =item since: 2.0.00 =back =head3 C The command is not in a ELocationE/ELocationMatchE block. =over =item since: 2.0.00 =back =head3 C The command is not in a EFilesE/EFilesMatchE block. =over =item since: 2.0.00 =back =head3 C The command is not in a EFilesE/EFilesMatchE, ELocationE/ELocationMatchE or EDirectoryE block. =over =item since: 2.0.00 =back =head3 C The directive appears outside of any container directives. =over =item since: 2.0.00 =back =head2 C<:filter_type> use Apache2::Const -compile => qw(:filter_type); The C<:filter_type> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:http> use Apache2::Const -compile => qw(:http); The C<:http> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:input_mode> use Apache2::Const -compile => qw(:input_mode); The C<:input_mode> group is used by C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head2 C<:log> use Apache2::Const -compile => qw(:log); The C<:log> group is for constants used by C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head2 C<:methods> use Apache2::Const -compile => qw(:methods); The C<:methods> constants group is used in conjunction with Cmethod_number|docs::2.0::api::Apache2::RequestRec/C_method_number_>>. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back corresponds to the HTTP C method =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back corresponds to the HTTP C method =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back corresponds to the HTTP C method =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:mpmq> use Apache2::Const -compile => qw(:mpmq); The C<:mpmq> group is for querying MPM properties. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:options> use Apache2::Const -compile => qw(:options); The C<:options> group contains constants corresponding to the C configuration directive. For examples see: Callow_options|docs::2.0::api::Apache2::Access/C_allow_options_>>. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:override> use Apache2::Const -compile => qw(:override); The C<:override> group contains constants corresponding to the C configuration directive. For examples see: Callow_options|docs::2.0::api::Apache2::Access/C_allow_overrides_>>. =head3 C F<*.conf> inside CDirectoryE> or CLocationE> =over =item since: 2.0.00 =back =head3 C Force directive to execute a command which would modify the configuration (like including another file, or C) =over =item since: 2.0.00 =back =head3 C C> | C> | C> | C> | C> =over =item since: 2.0.00 =back =head3 C F<*.conf> inside CDirectoryE> or CLocationE> and F<.htaccess> when C =over =item since: 2.0.00 =back =head3 C F<*.conf> anywhere and F<.htaccess> when C =over =item since: 2.0.00 =back =head3 C F<*.conf> anywhere and F<.htaccess> when C =over =item since: 2.0.00 =back =head3 C F<*.conf> inside CDirectoryE> or CLocationE> and F<.htaccess> when C =over =item since: 2.0.00 =back =head3 C F<*.conf> is not available anywhere in this override =over =item since: 2.0.00 =back =head3 C F<*.conf> anywhere and F<.htaccess> when C =over =item since: 2.0.00 =back =head3 C Unset a directive (in C) =over =item since: 2.0.00 =back =head3 C F<*.conf> outside CDirectoryE> or CLocationE> =over =item since: 2.0.00 =back =head2 C<:platform> use Apache2::Const -compile => qw(:platform); The C<:platform> group is for constants that may differ from OS to OS. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:remotehost> use Apache2::Const -compile => qw(:remotehost); The C<:remotehost> constants group is is used by the Cget_remote_host|docs::2.0::api::Apache2::Connection/C_get_remote_host_>> method. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:satisfy> use Apache2::Const -compile => qw(:satisfy); The C<:satisfy> constants group is used in conjunction with Csatisfies|docs::2.0::api::Apache2::Access/C_satisfies_>>. =head3 C =over =item since: 2.0.00 =back All of the requirements must be met. =head3 C =over =item since: 2.0.00 =back any of the requirements must be met. =head3 C =over =item since: 2.0.00 =back There are no applicable satisfy lines =head2 C<:types> use Apache2::Const -compile => qw(:types); The C<:types> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head2 C<:proxy> use Apache2::Const -compile => qw(:proxy); The C<:proxy> constants group is used in conjunction with Cproxyreq|docs::2.0::api::Apache2::RequestRec/C_proxyreq_>>. =head3 C =over =item since: 2.0.2 =back =head3 C =over =item since: 2.0.2 =back =head3 C =over =item since: 2.0.2 =back =head3 C =over =item since: 2.0.5 =back =head1 See Also L. L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Directive.pod0000644000177200010010000001616512540623176017470 0ustar SteveNone=head1 NAME Apache2::Directive - Perl API for manipulating the Apache configuration tree =head1 Synopsis use Apache2::Directive (); my $tree = Apache2::Directive::conftree(); my $documentroot = $tree->lookup('DocumentRoot'); my $vhost = $tree->lookup('VirtualHost', 'localhost:8000'); my $servername = $vhost->{'ServerName'}; use Data::Dumper; print Dumper $tree->as_hash; my $node = $tree; while ($node) { print $node->as_string; #do something with $node my $directive = $node->directive; my $args = $node->args; my $filename = $node->filename; my $line_num = $node->line_num; if (my $kid = $node->first_child) { $node = $kid; } elsif (my $next = $node->next) { $node = $next; } else { if (my $parent = $node->parent) { $node = $parent->next; } else { $node = undef; } } } =head1 Description C provides the Perl API for manipulating the Apache configuration tree =head1 API C provides the following functions and/or methods: =head2 C Get the arguments for the current directive: $args = $node->args(); =over 4 =item obj: C<$node> ( C> ) =item ret: C<$args> ( string ) Arguments are separated by a whitespace in the string. =item since: 2.0.00 =back For example, in F: PerlSwitches -M/opt/lib -M/usr/local/lib -wT And later: my $tree = Apache2::Directive::conftree(); my $node = $tree->lookup('PerlSwitches'); my $args = $node->args; C<$args> now contains the string "-M/opt/lib -M/usr/local/lib -wT" =head2 C Get a hash representation of the configuration tree, in a format suitable for inclusion in EPerlE sections. $config_hash = $conftree->as_hash(); =over 4 =item obj: C<$conftree> ( C> ) The config tree to stringify =item ret: C<$config_hash> ( HASH reference ) =item since: 2.0.00 =back For example: in F: SetHandler perl-script PerlHandler Test::Module And later: my $tree = Apache2::Directive::conftree(); my $node = $tree->lookup('Location', '/test/'); my $hash = $node->as_hash; C<$hash> now is: { 'SetHandler' => 'perl-script', 'PerlHandler' => 'Test::Module', } =head2 C Get a string representation of the configuration node, in F format. $string = $node->as_string(); =over 4 =item obj: C<$node> ( C> ) The config tree to stringify =item ret: C<$string> ( string ) =item since: 2.0.00 =back For example: in F: SetHandler perl-script PerlHandler Test::Module And later: my $tree = Apache2::Directive::conftree(); my $node = $tree->lookup('Location', '/test/'); my $string = $node->as_string; C<$string> is now: SetHandler perl-script PerlHandler Test::Module =head2 C Get the root of the configuration tree: $conftree = Apache2::Directive::conftree(); =over 4 =item obj: C ( class name ) =item ret: C<$conftree> ( C> ) =item since: 2.0.00 =back =head2 C Get the name of the directive in C<$node>: $name = $node->directive(); =over 4 =item obj: C<$node> ( C> ) =item ret: C<$name> ( string ) =item since: 2.0.00 =back =head2 C Get the F the configuration node was created from: $filename = $node->filename(); =over 4 =item obj: C<$node> ( C> ) =item ret: C<$filename> ( string ) =item since: 2.0.00 =back For example: my $tree = Apache2::Directive::conftree(); my $node = $tree->lookup('VirtualHost', 'example.com'); my $filename = $node->filename; C<$filename> is now the full path to the F that VirtualHost was defined in. If the directive was added with C>, the filename will be the path to the F that trigerred that Perl code. =head2 C Get the first child node of this directive: $child_node = $node->first_child; =over 4 =item obj: C<$node> ( C> ) =item ret: C<$child_node> ( C> ) Returns the first child node of C<$node>, C if there is none =item since: 2.0.00 =back =head2 C Get the line number in a F this node was created at: $lineno = $node->line_num(); =over 4 =item obj: C<$node> ( C> ) =item arg1: C<$lineno> (integer) =item since: 2.0.00 =back =head2 C Get the node(s) matching a certain value. $node = $conftree->lookup($directive, $args); @nodes = $conftree->lookup($directive, $args); =over 4 =item obj: C<$conftree> ( C> ) The config tree to stringify =item arg1: C<$directive> ( string ) The name of the directive to search for =item opt arg2: C ( string ) Optional args to the directive to filter for =item ret: C<$string> ( string / ARRAY of HASH refs ) In LIST context, it returns all matching nodes. In SCALAR context, it returns only the first matching node. If called with only C<$directive> value, this method returns all nodes from that directive. For example: @Alias = $conftree->lookup('Alias'); returns all nodes for C directives. If called with an extra C<$args> argument, it returns only nodes where both the directive and the args matched. For example: $VHost = $tree->lookup('VirtualHost', '_default_:8000'); =item since: 2.0.00 =back =head2 C Get the next directive node in the tree: $next_node = $node->next(); =over 4 =item obj: C<$node> ( C> ) =item ret: C<$next_node> ( C> ) Returns the next sibling of C<$node>, C if there is none =item since: 2.0.00 =back =head2 C Get the parent node of this directive: $parent_node = $node->parent(); =over 4 =item obj: C<$node> ( C> ) =item ret: C ( C> ) Returns the parent of C<$node>, C if this node is the root node =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Filter.pod0000644000177200010010000006441312540623176016776 0ustar SteveNone=head1 NAME Apache2::Filter - Perl API for Apache 2.0 Filtering =head1 Synopsis use Apache2::Filter (); # filter attributes my $c = $f->c; my $r = $f->r; my $frec = $f->frec(); my $next_f = $f->next; my $ctx = $f->ctx; $f->ctx($ctx); # bucket brigade filtering API $rc = $f->next->get_brigade($bb, $mode, $block, $readbytes); $rc = $f->next->pass_brigade($bb); $rc = $f->fflush($bb); # streaming filtering API while ($filter->read(my $buffer, $wanted)) { # transform $buffer here $filter->print($buffer); } if ($f->seen_eos) { $filter->print("filter signature"); } # filter manipulations $r->add_input_filter(\&callback); $c->add_input_filter(\&callback); $r->add_output_filter(\&callback); $c->add_output_filter(\&callback); $f->remove; =head1 Description C provides Perl API for Apache 2.0 filtering framework. Make sure to read C. =head1 Common Filter API The following methods can be called from any filter handler: =head2 C Get the current connection object from a connection or a request filter: $c = $f->c; =over 4 =item obj: C<$f> ( C> ) =item ret: C<$c> ( C> ) =item since: 2.0.00 =back =head2 C Get/set the filter context data. $ctx = $f->ctx; $f->ctx($ctx); =over 4 =item obj: C<$f> ( C> ) =item opt arg2: C<$ctx> ( SCALAR ) next context =item ret: C<$ctx> ( SCALAR ) current context =item since: 2.0.00 =back A filter context is created before the filter is called for the first time and it's destroyed at the end of the request. The context is preserved between filter invocations of the same request. So if a filter needs to store some data between invocations it should use the filter context for that. The filter context is initialized with the C value. The C method accepts a single SCALAR argument. Therefore if you want to store any other perl datastructure you should use a reference to it. For example you can store a hash reference: $f->ctx({ foo => 'bar' }); and then access it: $foo = $f->ctx->{foo}; if you access the context more than once it's more efficient to copy it's value before using it: my $ctx = $f->ctx; $foo = $ctx->{foo}; to avoid redundant method calls. As of this writing C<$ctx> is not a tied variable, so if you modify it need to store it at the end: $f->ctx($ctx); META: later we might make it a TIEd-variable interface, so it'll be stored automatically. Besides its primary purpose of storing context data across multiple filter invocations, this method is also useful when used as a flag. For example here is how to ensure that something happens only once during the filter's life: unless ($f->ctx) { do_something_once(); $f->ctx(1); } =head2 C Get/set the C> (filter record) object. $frec = $f->frec(); =over 4 =item obj: C<$f> ( C> ) =item ret: C<$frec> ( C> ) =item since: 2.0.00 =back For example you can call Cname|docs::2.0::api::Apache2::FilterRec/C_name_>> to get filter's name. =head2 C Return the C object of the next filter in chain. $next_f = $f->next; =over 4 =item obj: C<$f> ( C> ) The current filter object =item ret: C<$next_f> ( C> ) The next filter object in chain =item since: 2.0.00 =back Since Apache inserts several core filters at the end of each chain, normally this method always returns an object. However if it's not a mod_perl filter handler, you can call only the following methods on it: C>, C>, C>, C>, C> and C>. If you call other methods the behavior is undefined. The next filter can be a mod_perl one or not, it's easy to tell which one is that by calling Cfrec-Ename|docs::2.0::api::Apache2::FilterRec/C_name_>>. =head2 C Inside an HTTP request filter retrieve the current request object: $r = $f->r; =over 4 =item obj: C<$f> ( C> ) =item ret: C<$r> ( C> ) =item since: 2.0.00 =back If a sub-request adds filters, then that sub-request object is associated with the filter. =head2 C Remove the current filter from the filter chain (for the current request or connection). $f->remove; =over 4 =item obj: C<$f> ( C> ) =item ret: no return value =item since: 2.0.00 =back Notice that you should either complete the current filter invocation normally (by calling C> or C> depending on the filter kind) or if nothing was done, return C and mod_perl will take care of passing the current bucket brigade through unmodified to the next filter in chain. Note: calling remove() on the very top connection filter doesn't affect the filter chain due to a bug in Apache 2.0 (which may be fixed in 2.1). So don't use it with connection filters, till it gets fixed in Apache and then make sure to require the minimum Apache version if you rely on. Remember that if the connection is Ckeepalive|docs::2.0::api::Apache2::Connection/C_keepalive_>> ) and the connection filter is removed, it won't be added until the connection is closed. Which may happen after many HTTP requests. You may want to keep the filter in place and pass the data through unmodified, by returning C. If you need to reset the whole or parts of the filter context between requests, use the Lkeepalives> counting|docs::2.0::user::handlers::filters>. This method works for native Apache (non-mod_perl) filters too. =head1 Bucket Brigade Filter API The following methods can be called from any filter, directly manipulating bucket brigades: =head2 C Flush a bucket brigade down the filter stack. $rc = $f->fflush($bb); =over 4 =item obj: C<$f> ( C> ) The current filter =item arg1: C<$bb> ( C> ) The brigade to flush =item ret: C<$rc> ( C> ) Refer to the C> entry. =item excpt: C> Exceptions are thrown only when this function is called in the VOID context. Refer to the C> entry for details. =item since: 2.0.00 =back C is a shortcut method. So instead of doing: my $b = APR::Bucket::flush_create($f->c->bucket_alloc); $bb->insert_tail($b); $f->pass_brigade($bb); one can just write: $f->fflush($bb); =head2 C This is a method to use in bucket brigade input filters. It acquires a bucket brigade from the upstream input filter. $rc = $next_f->get_brigade($bb, $mode, $block, $readbytes); $rc = $next_f->get_brigade($bb, $mode, $block); $rc = $next_f->get_brigade($bb, $mode) $rc = $next_f->get_brigade($bb); =over 4 =item obj: C<$next_f> ( C> ) The next filter in the filter chain. Inside L it's usually Cnext|/C_next_>>. Inside L: Cinput_filters|docs::2.0::api::Apache2::Connection/C_input_filters_>>. =item arg1: C<$bb> ( C> ) The original bucket brigade passed to C, which must be empty. Inside L it's usually the second argument to the filter handler. Otherwise it should be created: my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); On return it gets populated with the next bucket brigade. That brigade may contain nothing if there was no more data to read. The return status tells the outcome. =item opt arg2: C<$mode> ( C> ) The filter mode in which the data should be read. If inside the filter handler, you should normally pass the same mode that was passed to the filter handler (the third argument). At the end of this section the available modes are presented. If the argument C<$mode> is not passed, C> is used as a default value. =item opt arg3: C<$block> ( C> ) You may ask the reading operation to be blocking: C>, or nonblocking: C>. If inside the filter handler, you should normally pass the same blocking mode argument that was passed to the filter handler (the forth argument). If the argument C<$block> is not passed, C> is used as a default value. =item opt arg4: C<$readbytes> ( integer ) How many bytes to read from the next filter. If inside the filter handler, you may want the same number of bytes, as the upstream filter, i.e. the argument that was passed to the filter handler (the fifth argument). If the argument C<$block> is not passed, 8192 is used as a default value. =item ret: C<$rc> ( C> ) On success, C> is returned and C<$bb> is populated (see the C<$bb> entry). In case of a failure -- a failure code is returned, in which case normally it should be returned to the caller. If the bottom-most filter doesn't read from the network, then C is returned (META: need to add this constant). Inside L the return code can also be C, which is success as well. =item excpt: C> You don't have to ask for the return value. If this function is called in the VOID context, e.g.: $f->next->get_brigade($bb, $mode, $block, $readbytes); mod_perl will do the error checking on your behalf, and if the return code is not C>, an C> will be thrown. The only time you want to do the error checking yourself, is when return codes besides C> are considered as successful and you want to manage them by yourself. =item since: 2.0.00 =back Available input filter modes (the optional second argument C<$mode>) are: =over =item * C> The filter should return at most readbytes data =item * C> The filter should return at most one line of CRLF data. (If a potential line is too long or no CRLF is found, the filter may return partial data). =item * C> The filter should implicitly eat any CRLF pairs that it sees. =item * C> The filter read should be treated as speculative and any returned data should be stored for later retrieval in another mode. =item * C> The filter read should be exhaustive and read until it can not read any more. Use this mode with extreme caution. =item * C> The filter should initialize the connection if needed, NNTP or FTP over SSL for example. =back Either compile all these constants with: use Apache2::Const -compile => qw(:input_mode); But it's a bit more efficient to compile only those constants that you need. Example: Here is a fragment of a filter handler, that receives a bucket brigade from the upstream filter: use Apache2::Filter (); use APR::Const -compile => qw(SUCCESS); use Apache2::Const -compile => qw(OK); sub filter { my ($f, $bb, $mode, $block, $readbytes) = @_; my $rc = $f->next->get_brigade($bb, $mode, $block, $readbytes); return $rc unless $rc == APR::Const::SUCCESS; # ... process $bb return Apache2::Const::OK; } Usually arguments C<$mode>, C<$block>, C<$readbytes> are the same as passed to the filter itself. You can see that in case of a failure, the handler returns immediately with that failure code, which gets propagated to the downstream filter. If you decide not check the return code, you can write it as: sub filter { my ($f, $bb, $mode, $block, $readbytes) = @_; $f->next->get_brigade($bb, $mode, $block, $readbytes); # ... process $bb return Apache2::Const::OK; } and the error checking will be done on your behalf. You will find many more examples in C and C tutorials. =head2 C This is a method to use in bucket brigade output filters. It passes the current bucket brigade to the downstream output filter. $rc = $next_f->pass_brigade($bb); =over 4 =item obj: C<$next_f> ( C> ) The next filter in the filter chain. Inside L it's usually Cnext|/C_next_>>. Inside L: Coutput_filters|docs::2.0::api::Apache2::Connection/C_output_filters_>>. =item arg1: C<$bb> ( C> ) The bucket brigade to pass. Inside L it's usually the second argument to the filter handler (after potential manipulations). =item ret: C<$rc> ( C> ) On success, C> is returned. In case of a failure -- a failure code is returned, in which case normally it should be returned to the caller. If the bottom-most filter doesn't write to the network, then C is returned (META: need to add this constant). Also refer to the C> entry to see how to avoid checking the errors explicitly. =item excpt: C> Exceptions are thrown only when this function is called in the VOID context. Refer to the C> entry for details. =item since: 2.0.00 =back The caller relinquishes ownership of the brigade (i.e. it may get destroyed/overwritten/etc. by the callee). Example: Here is a fragment of a filter handler, that passes a bucket brigade to the downstream filter (after some potential processing of the buckets in the bucket brigade): use Apache2::Filter (); use APR::Const -compile => qw(SUCCESS); use Apache2::Const -compile => qw(OK); sub filter { my ($f, $bb) = @_; # ... process $bb my $rc = $f->next->pass_brigade($bb); return $rc unless $rc == APR::Const::SUCCESS; return Apache2::Const::OK; } =head1 Streaming Filter API The following methods can be called from any filter, which uses the simplified streaming functionality: =head2 C Send the contents of C<$buffer> to the next filter in chain (via internal buffer). $sent = $f->print($buffer); =over 4 =item obj: C<$f> ( C> ) =item arg1: C<$buffer> ( string ) The data to send. =item ret: C<$sent> ( integer ) How many characters were sent. There is no need to check, since all should go through and if something goes work an exception will be thrown. =item excpt: C> =item since: 2.0.00 =back This method should be used only in L. =head2 C Read data from the filter $read = $f->read($buffer, $wanted); =over 4 =item obj: C<$f> ( C> ) =item arg1: C<$buffer> ( SCALAR ) The buffer to fill. All previous data will be lost. =item opt arg2: C<$wanted> ( integer ) How many bytes to attempt to read. If this optional argument is not specified -- the default 8192 will be used. =item ret: C<$read> ( integer ) How many bytes were actually read. C<$buffer> gets populated with the string that is read. It will contain an empty string if there was nothing to read. =item excpt: C> =item since: 2.0.00 =back Reads at most C<$wanted> characters into C<$buffer>. The returned value C<$read> tells exactly how many were read, making it easy to use it in a while loop: while ($filter->read(my $buffer, $wanted)) { # transform $buffer here $filter->print($buffer); } This is a streaming filter method, which acquires a single bucket brigade behind the scenes and reads data from all its buckets. Therefore it can only read from one bucket brigade per filter invocation. If the EOS bucket is read, the C> method will return a true value. =head2 C This methods returns a true value when the EOS bucket is seen by the C> method. $ok = $f->seen_eos; =over 4 =item obj: C<$f> ( C> ) The filter to remove =item ret: C<$ok> ( boolean ) a true value if EOS has been seen, otherwise a false value =item since: 2.0.00 =back This method only works in streaming filters which exhaustively Cread|/C_read_>> all the incoming data in a while loop, like so: while ($f->read(my $buffer, $wanted)) { # do something with $buffer } if ($f->seen_eos) { # do something } The technique in this example is useful when a streaming filter wants to append something to the very end of data, or do something at the end of the last filter invocation. After the EOS bucket is read, the filter should expect not to be invoked again. If an input streaming filter doesn't consume all data in the bucket brigade (or even in several bucket brigades), it has to generate the EOS event by itself. So when the filter is done it has to set the EOS flag: $f->seen_eos(1); when the filter handler returns, internally mod_perl will take care of creating and sending the EOS bucket to the upstream input filter. A similar logic may apply for output filters. In most other cases you shouldn't set this flag. When this flag is prematurely set (before the real EOS bucket has arrived) in the current filter invocation, instead of invoking the filter again, mod_perl will create and send the EOS bucket to the next filter, ignoring any other bucket brigades that may have left to consume. As mentioned earlier this special behavior is useful in writing special tests that test abnormal situations. =head1 Other Filter-related API Other methods which affect filters, but called on non-C objects: =head2 C Add C<&callback> filter handler to input request filter chain. $r->add_input_filter(\&callback); Add C<&callback> filter handler to input connection filter chain. $c->add_input_filter(\&callback); =over 4 =item obj: C<$c> ( C> ) or C<$r> ( C> ) =item arg1: C<&callback> (CODE ref) =item ret: no return value =item since: 2.0.00 =back [META: It seems that you can't add a filter when another filter is called. I've tried to add an output connection filter from the input connection filter when it was called for the first time. It didn't have any affect for the first request (over keepalive connection). The only way I succeeded to do that is from that input connection filter's filter_init handler. In fact it does work if there is any filter additional filter of the same kind configured from httpd.conf or via filter_init. It looks like there is a bug in httpd, where it doesn't prepare the chain of 3rd party filter if none were inserted before the first filter was called.] =head2 C Add C<&callback> filter handler to output request filter chain. $r->add_output_filter(\&callback); Add C<&callback> filter handler to output connection filter chain. $c->add_output_filter(\&callback); =over 4 =item obj: C<$c> ( C> ) or C<$r> ( C> ) =item arg1: C<&callback> (CODE ref) =item ret: no return value =item since: 2.0.00 =back =head1 Filter Handler Attributes Packages using filter attributes have to subclass C: package MyApache2::FilterCool; use base qw(Apache2::Filter); Attributes are parsed during the code compilation, by the function C, inherited from the C package. =head2 C The C attribute tells mod_perl to insert the filter into an HTTP request filter chain. For example, to configure an output request filter handler, use the C attribute in the handler subroutine's declaration: package MyApache2::FilterOutputReq; sub handler : FilterRequestHandler { ... } and add the configuration entry: PerlOutputFilterHandler MyApache2::FilterOutputReq This is the default mode. So if you are writing an HTTP request filter, you don't have to specify this attribute. The section L delves into more details. =head2 C The C attribute tells mod_perl to insert this filter into a connection filter chain. For example, to configure an output connection filter handler, use the C attribute in the handler subroutine's declaration: package MyApache2::FilterOutputCon; sub handler : FilterConnectionHandler { ... } and add the configuration entry: PerlOutputFilterHandler MyApache2::FilterOutputCon The section L delves into more details. =head2 C The attribute C marks the function suitable to be used as a filter initialization callback, which is called immediately after a filter is inserted to the filter chain and before it's actually called. sub init : FilterInitHandler { my $f = shift; #... return Apache2::Const::OK; } In order to hook this filter callback, the real filter has to assign this callback using the C> which accepts a reference to the callback function. For further discussion and examples refer to the L tutorial section. =head2 C If a filter wants to run an initialization callback it can register such using the C attribute. Similar to C the callback reference is expected, rather than a callback name. The used callback function has to have the C> attribute. For example: package MyApache2::FilterBar; use base qw(Apache2::Filter); sub init : FilterInitHandler { ... } sub filter : FilterRequestHandler FilterHasInitHandler(\&init) { my ($f, $bb) = @_; # ... return Apache2::Const::OK; } For further discussion and examples refer to the L tutorial section. =head1 Configuration mod_perl 2.0 filters configuration is explained in the L. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head1 TIE Interface C also implements a tied interface, so you can work with the C<$f> object as a hash reference. The TIE interface is mostly unimplemented and might be implemented post 2.0 release. =head2 C $ret = TIEHANDLE($stashsv, $sv); =over 4 =item obj: C<$stashsv> ( SCALAR ) =item arg1: C<$sv> ( SCALAR ) =item ret: C<$ret> ( SCALAR ) =item since: subject to change =back =head2 C $ret = PRINT(...); =over 4 =item obj: C<...> (XXX) =item ret: C<$ret> ( integer ) =item since: subject to change =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/FilterRec.pod0000644000177200010010000000321712540623176017423 0ustar SteveNone=head1 NAME Apache2::FilterRec - Perl API for manipulating the Apache filter record =head1 Synopsis use Apache2::Filter (); use Apache2::FilterRec (); my $frec = $filter->frec; print "filter name is:", $frec->name; =head1 Description C provides an access to the filter record structure. The C object is retrieved by calling C>: $frec = $filter->frec; =head1 API C provides the following functions and/or methods: =head2 C The registered name for this filter $name = $frec->name(); =over 4 =item obj: C<$frec> ( C> ) =item ret: C<$name> (string) =item since: 2.0.00 =back mod_perl filters have four names: modperl_request_output modperl_request_input modperl_connection_output modperl_connection_input You can see the names of the non-mod_perl filters as well. By calling Cnext-Efrec-Ename|docs::2.0::api::Apache2::Filter/C_next_>> you can get the name of the next filter in the chain. Example: Let's print the name of the current and the filter that follows it: use Apache2::Filter (); use Apache2::FilterRec (); for my $frec ($filter->frec, $filter->next->frec) { print "Name: ", $frec->name; } =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/HookRun.pod0000644000177200010010000003116012540623176017127 0ustar SteveNone=head1 NAME Apache2::HookRun - Perl API for Invoking Apache HTTP phases =head1 Synopsis # httpd.conf PerlProcessConnectionHandler MyApache2::PseudoHTTP::handler #file:MyApache2/PseudoHTTP.pm #--------------------------- package MyApache2::PseudoHTTP; use Apache2::HookRun (); use Apache2::RequestUtil (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK DECLINED DONE SERVER_ERROR); # implement the HTTP protocol cycle in protocol handler sub handler { my $c = shift; my $r = Apache2::RequestRec->new($c); # register any custom callbacks here, e.g.: # $r->push_handlers(PerlAccessHandler => \&my_access); $rc = $r->run_post_read_request(); return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_translate_name; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_map_to_storage; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; # this must be run all a big havoc will happen in the following # phases $r->location_merge($path); $rc = $r->run_header_parser; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; my $args = $r->args || ''; if ($args eq 'die') { $r->die(Apache2::Const::SERVER_ERROR); return Apache2::Const::DONE; } $rc = $r->run_access_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_auth_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_check_user_id; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_type_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_fixups; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; # $r->run_handler is called internally by $r->invoke_handler, # invoke_handler sets all kind of filters, and does a few other # things but it's possible to call $r->run_handler, bypassing # invoke_handler $rc = $r->invoke_handler; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_log_transaction; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; return Apache2::Const::OK; } =head1 Description C exposes parts of the Apache HTTP protocol implementation, responsible for invoking callbacks for each L. Armed with that API, you could run some of the http protocol framework parts when implementing your own protocols. For example see how HTTP AAA (access, auth and authz) hooks are called from a protocol handler, implementing L, which has nothing to do with HTTP. Also you can see in L how to re-implement Apache HTTP cycle in the protocol handler. Using this API you could probably also change the normal Apache behavior (e.g. invoking some hooks earlier than normal, or later), but before doing that you will probably need to spend some time reading through the Apache C code. That's why some of the methods in this document, point you to the specific functions in the Apache source code. If you just try to use the methods from this module, without understanding them well, don't be surprised if you will get some nasty crashes, from which mod_perl can't protect you. =head1 API C provides the following functions and/or methods: =head2 C Kill the current request $r->die($type); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$type> ( integer ) Why the request is dieing. Expects an Apache status constant. =item ret: no return value =item since: 2.0.00 =back This method doesn't really abort the request, it just handles the sending of the error response, logging the error and such. You want to take a look at the internals of C in F for more details. =head2 C Run the L phase. $rc = $r->invoke_handler(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C =item since: 2.0.00 =back C allows modules to insert filters, sets a default handler if none is set, runs C> and handles some errors. For more details see C in F. =head2 C Run the resource L phase. $rc = $r->run_access_checker(); =over 4 =item obj: C<$r> ( C> ) the current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This phase runs before a user is authenticated, so this hook is really to apply additional restrictions independent of a user. It also runs independent of 'C' directive usage. =head2 C Run the L phase. $rc = $r->run_auth_checker(); =over 4 =item obj: C<$r> ( C> ) the current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This phase is used to check to see if the resource being requested is available for the authenticated user (C<$r-Euser> and C<$r-Eap_auth_type>). It runs after the L and L hooks. Note that it will only be called if Apache determines that access control has been applied to this resource (through a 'C' directive). =head2 C Run the L phase. $rc = $r->run_check_user_id(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This hook is used to analyze the request headers, authenticate the user, and set the user information in the request record (C<$r-Euser> and C<$r-Eap_auth_type>). This hook is only run when Apache determines that authentication/authorization is required for this resource (as determined by the 'C' directive). It runs after the L hook, and before the L hook. =head2 C Run the L phase. $rc = $r->run_fixups(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This phase allows modules to perform module-specific fixing of HTTP header fields. This is invoked just before the L phase. =head2 C Run the L phase. $rc = $r->run_handler(); =over 4 =item obj: C<$r> ( C> ) The request_rec =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back C is called internally by C>. Use C only if you want to bypass the extra functionality provided by C>. =head2 C Run the L
phase. $rc = $r->run_header_parser(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) C or C. =item since: 2.0.00 =back =head2 C Run the L phase. $rc = $r->run_log_transaction(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C =item since: 2.0.00 =back This hook allows modules to perform any module-specific logging activities over and above the normal server things. =head2 C Run the L phase. $rc = $r->run_map_to_storage(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) C (or C) if this contextless request was just fulfilled (such as C), C if this is not a file, and C if this is a file. The core map_to_storage (C) will C and C the C<$r-Efilename> (all internal C functions). =item since: 2.0.00 =back This phase allows modules to set the per_dir_config based on their own context (such as CProxyE> sections) and responds to contextless requests such as C that need no security or filesystem mapping based on the filesystem. =head2 C Run the L phase. $rc = $r->run_post_read_request(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C or C. =item since: 2.0.00 =back This phase is run right after C or C, and not run during any subrequests. This hook allows modules to affect the request immediately after the request has been read, and before any other phases have been processes. This allows modules to make decisions based upon the input header fields =head2 C Run the L phase. $rc = $r->run_translate_name(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This phase gives modules an opportunity to translate the URI into an actual filename. If no modules do anything special, the server's default rules will be applied. =head2 C Run the L phase. $rc = $r->run_type_checker(); =over 4 =item obj: C<$r> ( C> ) the current request =item ret: C<$rc> ( integer ) The status of the current phase run: C, C, C. =item since: 2.0.00 =back This phase is used to determine and/or set the various document type information bits, like C (via C<$r-Econtent_type>), language, etc. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Log.pod0000644000177200010010000004364512540623176016276 0ustar SteveNone=head1 NAME Apache2::Log - Perl API for Apache Logging Methods =head1 Synopsis # in startup.pl #-------------- use Apache2::Log; use Apache2::Const -compile => qw(OK :log); use APR::Const -compile => qw(:error SUCCESS); my $s = Apache2::ServerUtil->server; $s->log_error("server: log_error"); $s->log_serror(__FILE__, __LINE__, Apache2::Const::LOG_ERR, APR::Const::SUCCESS, "log_serror logging at err level"); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_DEBUG, APR::Const::ENOTIME, "debug print"); Apache2::ServerRec->log_error("routine warning"); Apache2::ServerRec::warn("routine warning"); # in a handler #------------- package Foo; use strict; use warnings FATAL => 'all'; use Apache2::Log; use Apache2::Const -compile => qw(OK :log); use APR::Const -compile => qw(:error SUCCESS); sub handler { my $r = shift; $r->log_error("request: log_error"); my $rlog = $r->log; for my $level qw(emerg alert crit error warn notice info debug) { no strict 'refs'; $rlog->$level($package, "request: $level log level"); } # can use server methods as well my $s = $r->server; $s->log_error("server: log_error"); $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_DEBUG, APR::Const::ENOTIME, "in debug"); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_INFO, APR::Const::SUCCESS, "server info"); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_ERR, APR::Const::ENOTIME, "fatal error"); $r->log_reason("fatal error"); $r->warn('routine request warning'); $s->warn('routine server warning'); return Apache2::Const::OK; } 1; # in a registry script # httpd.conf: PerlOptions +GlobalRequest use Apache2::ServerRec qw(warn); # override warn locally print "Content-type: text/plain\n\n"; warn "my warning"; =head1 Description C provides the Perl API for Apache logging methods. Depending on the the current C setting, only logging with the same log level or higher will be loaded. For example if the current C is set to I, only messages with log level of the level I or higher (I, I, I and I) will be logged. Therefore this: $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_WARNING, APR::Const::ENOTIME, "warning!"); will log the message, but this one won't: $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_INFO, APR::Const::ENOTIME, "just an info"); It will be logged only if the server log level is set to I or I. C is set in the configuration file, but can be changed using the Cloglevel()|docs::2.0::api::Apache2::ServerRec/C_loglevel_>> method. The filename and the line number of the caller are logged only if C is used (because that's how Apache 2.0 logging mechanism works). Note: On Win32 Apache attempts to lock all writes to a file whenever it's opened for append (which is the case with logging functions), as Unix has this behavior built-in, while Win32 does not. Therefore C functions could be slower than Perl's print()/warn(). =head1 Constants Log level constants can be compiled all at once: use Apache2::Const -compile => qw(:log); or individually: use Apache2::Const -compile => qw(LOG_DEBUG LOG_INFO); =head2 LogLevel Constants The following constants (sorted from the most severe level to the least severe) are used in logging methods to specify the log level at which the message should be logged: =head3 C =head3 C =head3 C =head3 C =head3 C =head3 C =head3 C =head3 C =head2 Other Constants Make sure to compile the APR status constants before using them. For example to compile C and all the APR error status constants do: use APR::Const -compile => qw(:error SUCCESS); Here is the rest of the logging related constants: =head3 C used to mask off the level value, to make sure that the log level's value is within the proper bits range. e.g.: $loglevel &= LOG_LEVELMASK; =head3 C used to give content handlers the option of including the error text in the C sent back to the client. When C is passed to C the error message will be saved in the C<$r>'s notes table, keyed to the string I<"error-notes">, if and only if the severity level of the message is C or greater and there are no other I<"error-notes"> entry already set in the request record's notes table. Once the I<"error-notes"> entry is set, it is up to the error handler to determine whether this text should be sent back to the client. For example: use Apache2::Const -compile => qw(:log); use APR::Const -compile => qw(ENOTIME); $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_ERR|Apache2::Const::LOG_TOCLIENT, APR::Const::ENOTIME, "request log_rerror"); now the log message can be retrieved via: $r->notes->get("error-notes"); Remember that client-generated text streams sent back to the client B be escaped to prevent CSS attacks. =head3 C is useful for startup message where no timestamps, logging level is wanted. For example: use Apache2::Const -compile => qw(:log); use APR::Const -compile => qw(SUCCESS); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_INFO, APR::Const::SUCCESS, "This log message comes with a header"); will print: [Wed May 14 16:47:09 2003] [info] This log message comes with a header whereas, when C is binary ORed as in: use Apache2::Const -compile => qw(:log); use APR::Const -compile => qw(SUCCESS); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_INFO|Apache2::Const::LOG_STARTUP, APR::Const::SUCCESS, "This log message comes with no header"); then the logging will be: This log message comes with no header =head1 Server Logging Methods =head2 C<$s-Elog> get a log handle which can be used to L. my $slog = $s->log; =over 4 =item obj: C<$s> ( C> ) =item ret: C<$slog> ( C object ) C object to be used with L. =item since: 2.0.00 =back =head2 C<$s-Elog_error> just logs the supplied message to I $s->log_error(@message); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<@message> ( strings ARRAY ) what to log =item ret: no return value =item since: 2.0.00 =back For example: $s->log_error("running low on memory"); =head2 C<$s-Elog_serror> This function provides a fine control of when the message is logged, gives an access to built-in status codes. $s->log_serror($file, $line, $level, $status, @message); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$file> ( string ) The file in which this function is called =item arg2: C<$line> ( number ) The line number on which this function is called =item arg3: C<$level> ( C> ) The level of this error message =item arg4: C<$status> ( C> ) The status code from the last command (similar to $! in perl), usually C> or coming from an L. =item arg5: C<@message> ( strings ARRAY ) The log message(s) =item ret: no return value =item since: 2.0.00 =back For example: use Apache2::Const -compile => qw(:log); use APR::Const -compile => qw(ENOTIME SUCCESS); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_ERR, APR::Const::SUCCESS, "log_serror logging at err level"); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_DEBUG, APR::Const::ENOTIME, "debug print"); =head2 C<$s-Ewarn> $s->warn(@warnings); is the same as: $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_WARNING, APR::Const::SUCCESS, @warnings) =over 4 =item obj: C<$s> ( C> ) =item arg1: C<@warnings> ( strings ARRAY ) array of warning strings =item ret: no return value =item since: 2.0.00 =back For example: $s->warn('routine server warning'); =head1 Request Logging Methods =head2 C<$r-Elog> get a log handle which can be used to L. $rlog = $r->log; =over 4 =item obj: C<$r> ( C> ) =item ret: C<$rlog> ( C object ) C object to be used with L. =item since: 2.0.00 =back =head2 C<$r-Elog_error> just logs the supplied message (similar to Clog_error|/C__s_E_gt_log_error_>> ). $r->log_error(@message); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<@message> ( strings ARRAY ) what to log =item ret: no return value =item since: 2.0.00 =back For example: $r->log_error("the request is about to end"); =head2 C<$r-Elog_reason> This function provides a convenient way to log errors in a preformatted way: $r->log_reason($message); $r->log_reason($message, $filename); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$message> ( string ) the message to log =item opt arg2: C<$filename> ( string ) where to report the error as coming from (e.g. C<__FILE__>) =item ret: no return value =item since: 2.0.00 =back For example: $r->log_reason("There is no enough data"); will generate a log entry similar to the following: [Fri Sep 24 11:58:36 2004] [error] access to /someuri failed for 127.0.0.1, reason: There is no enough data. =head2 C<$r-Elog_rerror> This function provides a fine control of when the message is logged, gives an access to built-in status codes. $r->log_rerror($file, $line, $level, $status, @message); arguments are identical to Clog_serror|/C__s_E_gt_log_serror_>>. =over 4 =item since: 2.0.00 =back For example: use Apache2::Const -compile => qw(:log); use APR::Const -compile => qw(ENOTIME SUCCESS); $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_ERR, APR::Const::SUCCESS, "log_rerror logging at err level"); $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_DEBUG, APR::Const::ENOTIME, "debug print"); =head2 C<$r-Ewarn> $r->warn(@warnings); is the same as: $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_WARNING, APR::Const::SUCCESS, @warnings) =over 4 =item obj: C<$r> ( C> ) =item arg1: C<@warnings> ( strings ARRAY ) array of warning strings =item ret: no return value =item since: 2.0.00 =back For example: $r->warn('routine server warning'); =head1 Other Logging Methods =head2 LogLevel Methods after getting the log handle with Clog|/C__s_E_gt_log_>> or Clog|/C__s_E_gt_log_>>, use one of the following methods (corresponding to the C levels): emerg(), alert(), crit(), error(), warn(), notice(), info(), debug() to control when messages should be logged: $s->log->emerg(@message); $r->log->emerg(@message); =over 4 =item obj: C<$slog> ( L or L log handle ) =item arg1: C<@message> ( strings ARRAY ) =item ret: no return value =item since: 2.0.00 =back For example if the C is C and the following code is executed: my $slog = $s->log; $slog->debug("just ", "some debug info"); $slog->warn(@warnings); $slog->crit("dying"); only the last command's logging will be performed. This is because I, I and other logging command which are listed right to I will be disabled. =head2 C See L. =head2 C See L. =head2 C See L. =head2 C See L. =head2 C See L. =head2 C See L. =head2 C See L. Though Apache treats C calls as special. The message is always logged regardless the value of C, unless the error log is set to use syslog. (For details see httpd-2.0/server/log.c.) =head2 C See L. =head1 General Functions =head2 C Though looking like a constant, this is a function, which returns a list of two items: C<(__FILE__, __LINE__)>, i.e. the file and the line where the function was called from. my ($file, $line) = Apache2::Log::LOG_MARK(); =over 4 =item ret1: C<$file> ( string ) =item ret2: C<$line> ( number ) =item since: 2.0.00 =back It's mostly useful to be passed as the first argument to those logging methods, expecting the filename and the line number as the first arguments (e.g., Clog_serror|/C__s_E_gt_log_serror_>> and Clog_rerror|/C__r_E_gt_log_rerror_>> ). =head1 Virtual Hosts Code running from within a virtual host needs to be able to log into its C file, if different from the main log. Calling any of the logging methods on the C<$r> and C<$s> objects will do the logging correctly. If the core C is called, it'll be always logged to the main log file. Here is how to make it log into the vhost F file. Let's say that we start with the following code: warn "the code is smoking"; =over =item 1 First, we need to use mod_perl's logging function, instead of C Either replace C with C: use Apache2::Log (); Apache2::ServerRec::warn("the code is smoking"); or import it into your code: use Apache2::ServerRec qw(warn); # override warn locally warn "the code is smoking"; or override C: use Apache2::Log (); *CORE::GLOBAL::warn = \&Apache2::ServerRec::warn; warn "the code is smoking"; Avoid using the latter suggestion, since it'll affect all the code running on the server, which may break things. Of course you can localize that as well: use Apache2::Log (); local *CORE::GLOBAL::warn = \&Apache2::ServerRec::warn; warn "the code is smoking"; Chances are that you need to make the internal Perl warnings go into the vhost's F file as well. Here is how to do that: use Apache2::Log (); local $SIG{__WARN__} = \&Apache2::ServerRec::warn; eval q[my $x = "aaa" + 1;]; # this issues a warning Notice that it'll override any previous setting you may have had, disabling modules like C which also use C<$SIG{__WARN__}> =item 2 Next we need to figure out how to get hold of the vhost's server object. Inside HTTP request handlers this is possible via Crequest|docs::2.0::api::Apache2::RequestUtil/C_request_>>. Which requires either C> setting or can be also done at runtime if C<$r> is available: use Apache2::RequestUtil (); sub handler { my $r = shift; Apache2::RequestUtil->request($r); ... Outside HTTP handlers at the moment it is not possible, to get hold of the vhost's F file. This shouldn't be a problem for the code that runs only under mod_perl, since the always available C<$s> object can invoke a plethora of methods supplied by C. This is only a problem for modules, which are supposed to run outside mod_perl as well. META: To solve this we think to introduce 'PerlOptions +GlobalServer', a big brother for 'PerlOptions +GlobalRequest', which will be set in modperl_hook_pre_connection. =back =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C META: what is this method good for? it just calls getpid and logs it. In any case it has nothing to do with the logging API. And it uses static variables, it probably shouldn't be in the Apache public API. Log the current pid Apache2::Log::log_pid($pool, $fname); =over 4 =item obj: C<$p> ( C> ) The pool to use for logging =item arg1: C<$fname> ( file path ) The name of the file to log to =item ret: no return value =item since: subject to change =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Module.pod0000644000177200010010000001714412540623177016776 0ustar SteveNone=head1 NAME Apache2::Module - Perl API for creating and working with Apache modules =head1 Synopsis use Apache2::Module (); #Define a configuration directive my @directives = ( { name => 'MyDirective', } ); Apache2::Module::add(__PACKAGE__, \@directives); # iterate over the whole module list for (my $modp = Apache2::Module::top_module(); $modp; $modp = $modp->next) { my $name = $modp->name; my $index = $modp->module_index; my $ap_api_major_version = $modp->ap_api_major_version; my $ap_api_minor_version = $modp->ap_api_minor_version; my $commands = $modp->cmds; } # find a specific module my $module = Apache2::Module::find_linked_module('mod_ssl.c'); # remove a specific module $module->remove_loaded_module(); # access module configuration from a directive sub MyDirective { my ($self, $parms, $args) = @_; my $srv_cfg = Apache2::Module::get_config($self, $parms->server); [...] } # test if an Apache module is loaded if (Apache2::Module::loaded('mod_ssl.c')) { [...] } # test if a Perl module is loaded if (Apache2::Module::loaded('Apache2::Status')) { [...] } =head1 Description C provides the Perl API for creating and working with Apache modules See L. =head1 API C provides the following functions and/or methods: =head2 C Add a module's custom configuration directive to Apache. Apache2::Module::add($package, $cmds); =over 4 =item arg1: C<$package> ( string ) the package of the module to add =item arg2: C<$cmds> ( ARRAY of HASH refs ) the list of configuration directives to add =item ret: no return value =item since: 2.0.00 =back See also L. =head2 C Get the httpd API version this module was build against, B the module's version. $major_version = $module->ap_api_major_version(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$major_version> ( integer ) =item since: 2.0.00 =back This methid is used to check that module is compatible with this version of the server before loading it. =head2 C Get the module API minor version. $minor_version = $module->ap_api_minor_version(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$minor_version> ( integer ) =item since: 2.0.00 =back C provides API feature milestones. It's not checked during module init. =head2 C Get the C> object, describing all of the directives this module defines. $command = $module->cmds(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$command> ( C> ) =item since: 2.0.00 =back =head2 C Retrieve a module's configuration. Used by configuration directives. $cfg = Apache2::Module::get_config($class, $server, $dir_config); $cfg = Apache2::Module::get_config($class, $server); $cfg = $self->get_config($server, $dir_config); $cfg = $self->get_config($server); =over 4 =item obj: C<$module> ( C> ) =item arg1: C<$class> ( string ) The Perl package this configuration is for =item arg2: C<$server> ( C> ) The current server, typically Cserver|docs::2.0::api::Apache2::ServerUtil>> or Cserver|docs::2.0::api::Apache2::CmdParms>>. =item opt arg3: C<$dir_config> ( C> ) By default, the configuration returned is the server level one. To retrieve the per directory configuration, use Cper_dir_config|docs::2.0::api::Apache2::RequestRec>> as a last argument. =item ret: C<$cfg> (HASH reference) A reference to the hash holding the module configuration data. =item since: 2.0.00 =back See also L. =head2 C Find a module based on the name of the module $module = Apache2::Module::find_linked_module($name); =over 4 =item arg1: C<$name> ( string ) The name of the module ending in C<.c> =item ret: C<$module> ( C> ) The module object if found, C otherwise. =item since: 2.0.00 =back For example: my $module = Apache2::Module::find_linked_module('mod_ssl.c'); =head2 C Determine if a certain module is loaded $loaded = Apache2::Module::loaded($module); =over 4 =item name: C<$module> ( string ) The name of the module to search for. If C<$module> ends with C<.c>, search all the modules, statically compiled and dynamically loaded. If C<$module> ends with C<.so>, search only the dynamically loaded modules. If C<$module> doesn't contain a C<.>, search the loaded Perl modules (checks C<%INC>). =item ret: C<$loaded> ( boolean ) Returns true if the module is loaded, false otherwise. =item since: 2.0.00 =back For example, to test if this server supports ssl: if (Apache2::Module::loaded('mod_ssl.c')) { [...] } To test is this server dynamically loaded mod_perl: if (Apache2::Module::loaded('mod_perl.so')) { [...] } To test if C> is loaded: if (Apache2::Module::loaded('Apache2::Status')) { [...] } =head2 C Get the index to this modules structures in config vectors. $index = $module->module_index(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$index> ( integer ) =item since: 2.0.00 =back =head2 C Get the name of the module's I<.c> file $name = $module->name(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$name> ( string ) =item since: 2.0.00 =back For example a mod_perl module, will return: I. =head2 C Get the next module in the list, C if this is the last module in the list. $next_module = $module->next(); =over 4 =item obj: C<$module> ( C> ) =item ret: C<$next_module> ( C> ) =item since: 2.0.00 =back =head2 C Remove a module from the list of loaded modules permanently. $module->remove_loaded_module(); =over 4 =item obj: C<$module> ( C> ) =item ret: no return value =item since: 2.0.00 =back =head2 C Returns the first module in the module list. Usefull to start a module iteration. $module = Apache2::Module::top_module(); =over 4 =item ret: C<$module> ( C> ) =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/MPM.pod0000644000177200010010000000434112540623177016175 0ustar SteveNone=head1 NAME Apache2::MPM - Perl API for accessing Apache MPM information =head1 Synopsis use Apache2::MPM (); # check whether Apache MPM is threaded if (Apache2::MPM->is_threaded) { do_something() } # which mpm is used my $mpm = lc Apache2::MPM->show; # query mpm properties use Apache2::Const -compile => qw(:mpmq); if (Apache2::MPM->query(Apache2::Const::MPMQ_STATIC)) { ... } =head1 Description C provides the Perl API for accessing Apache MPM information. =head1 API C provides the following functions and/or methods: =head2 C Query various attributes of the MPM my $query = Apache2::MPM->query($const); =over 4 =item obj: C<$class> ( C> ) the class name =item arg1: C<$const> ( C> ) The MPM attribute to query. =item ret: C<$query> ( boolean ) the result of the query =item since: 2.0.00 =back For example to test whether the mpm is static: use Apache2::Const -compile => qw(MPMQ_STATIC); if (Apache2::MPM->query(Apache2::Const::MPMQ_STATIC)) { ... } =head2 C Check whether the running Apache MPM is threaded. my $is_threaded = Apache2::MPM->is_threaded; =over 4 =item obj: C<$class> ( C> ) the class name =item ret: C<$is_threaded> ( boolean ) threaded or not =item since: 2.0.00 =back Note that this functionality is just a shortcut for: use Apache2::Const -compile => qw(MPMQ_IS_THREADED); my $is_threaded = Apache2::MPM->query(Apache2::Const::MPMQ_IS_THREADED); =head2 C What mpm is used my $mpm = Apache2::MPM->show(); =over 4 =item obj: C<$class> ( C> ) the class name =item ret: C<$mpm> ( string ) the name of the MPM. e.g., "Prefork". =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/PerlSections.pod0000644000177200010010000002544112540623177020162 0ustar SteveNone=head1 NAME Apache2::PerlSections - write Apache configuration files in Perl =head1 Synopsis @PerlModule = qw(Mail::Send Devel::Peek); #run the server as whoever starts it $User = getpwuid(>) || >; $Group = getgrgid()) || ); $ServerAdmin = $User; =head1 Description With CPerlE>...C/PerlE> sections, it is possible to configure your server entirely in Perl. CPerlE> sections can contain I and as much Perl code as you wish. These sections are compiled into a special package whose symbol table mod_perl can then walk and grind the names and values of Perl variables/structures through the Apache core configuration gears. Block sections such as CLocationE>..C/LocationE> are represented in a C<%Location> hash, e.g.: $Location{"/~dougm/"} = { AuthUserFile => '/tmp/htpasswd', AuthType => 'Basic', AuthName => 'test', DirectoryIndex => [qw(index.html index.htm)], Limit => { "GET POST" => { require => 'user dougm', } }, }; If an Apache directive can take two or three arguments you may push strings (the lowest number of arguments will be shifted off the C<@list>) or use an array reference to handle any number greater than the minimum for that directive: push @Redirect, "/foo", "http://www.foo.com/"; push @Redirect, "/imdb", "http://www.imdb.com/"; push @Redirect, [qw(temp "/here" "http://www.there.com")]; Other section counterparts include C<%VirtualHost>, C<%Directory> and C<%Files>. To pass all environment variables to the children with a single configuration directive, rather than listing each one via C or C, a CPerlE> section could read in a file and: push @PerlPassEnv, [$key => $val]; or Apache2->httpd_conf("PerlPassEnv $key $val"); These are somewhat simple examples, but they should give you the basic idea. You can mix in any Perl code you desire. See I and I in the mod_perl distribution for more examples. Assume that you have a cluster of machines with similar configurations and only small distinctions between them: ideally you would want to maintain a single configuration file, but because the configurations aren't I the same (e.g. the C directive) it's not quite that simple. CPerlE> sections come to rescue. Now you have a single configuration file and the full power of Perl to tweak the local configuration. For example to solve the problem of the C directive you might have this CPerlE> section: $ServerName = `hostname`; For example if you want to allow personal directories on all machines except the ones whose names start with I: $ServerName = `hostname`; if ($ServerName !~ /^secure/) { $UserDir = "public.html"; } else { $UserDir = "DISABLED"; } =head1 API C provides the following functions and/or methods: =head2 C Get the current server's object for the EPerlE section $s = Apache2::PerlSections->server(); =over 4 =item obj: C (class name) =item ret: C<$s> ( C> ) =item since: 2.0.03 =back =head1 C<@PerlConfig> and C<$PerlConfig> This array and scalar can be used to introduce literal configuration into the apache configuration. For example: push @PerlConfig, 'Alias /foo /bar'; Or: $PerlConfig .= "Alias /foo /bar\n"; See also Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_add_config_>> =head1 Configuration Variables There are a few variables that can be set to change the default behaviour of CPerlE> sections. =head2 C<$Apache2::PerlSections::Save> Each CPerlE> section is evaluated in its unique namespace, by default residing in a sub-namespace of C, therefore any local variables will end up in that namespace. For example if a CPerlE> section happened to be in file F starting on line 20, the namespace: C will be used. Now if it had: $foo = 5; my $bar = 6; $My::tar = 7; The local global variable C<$foo> becomes C<$Apache2::ReadConfig::tmp::httpd_conf::line_20::foo>, the other variable remain where they are. By default, the namespace in which CPerlE> sections are evaluated is cleared after each block closes. In our example nuking C<$Apache2::ReadConfig::tmp::httpd_conf::line_20::foo>, leaving the rest untouched. By setting C<$Apache2::PerlSections::Save> to a true value, the content of those namespaces will be preserved and will be available for inspection by C> and Cdump|/C_Apache2__PerlSections_E_gt_dump_>> In our example C<$Apache2::ReadConfig::tmp::httpd_conf::line_20::foo> will still be accessible from other perl code, after the CPerlE> section was parsed. =head1 PerlSections Dumping =head2 Cdump> This method will dump out all the configuration variables mod_perl will be feeding to the apache config gears. The output is suitable to read back in via C. my $dump = Apache2::PerlSections->dump; =over 4 =item ret: C<$dump> ( string / C ) A string dump of all the Perl code encountered in EPerlE blocks, suitable to be read back via C =back For example: $Apache2::PerlSections::Save = 1; $Listen = 8529; $Location{"/perl"} = { SetHandler => "perl-script", PerlHandler => "ModPerl::Registry", Options => "ExecCGI", }; @DirectoryIndex = qw(index.htm index.html); $VirtualHost{"www.foo.com"} = { DocumentRoot => "/tmp/docs", ErrorLog => "/dev/null", Location => { "/" => { Allowoverride => 'All', Order => 'deny,allow', Deny => 'from all', Allow => 'from foo.com', }, }, }; print Apache2::PerlSections->dump; This will print something like this: $Listen = 8529; @DirectoryIndex = ( 'index.htm', 'index.html' ); $Location{'/perl'} = ( PerlHandler => 'Apache2::Registry', SetHandler => 'perl-script', Options => 'ExecCGI' ); $VirtualHost{'www.foo.com'} = ( Location => { '/' => { Deny => 'from all', Order => 'deny,allow', Allow => 'from foo.com', Allowoverride => 'All' } }, DocumentRoot => '/tmp/docs', ErrorLog => '/dev/null' ); 1; __END__ It is important to put the call to C in it's own CPerlE> section, otherwise the content of the current CPerlE> section will not be dumped. =head2 Cstore> This method will call the C method, writing the output to a file, suitable to be pulled in via C or C. Apache2::PerlSections->store($filename); =over 4 =item arg1: C<$filename> (string) The filename to save the dump output to =item ret: no return value =back =head1 Advanced API mod_perl 2.0 now introduces the same general concept of handlers to CPerlE> sections. Apache2::PerlSections simply being the default handler for them. To specify a different handler for a given perl section, an extra handler argument must be given to the section: $foo = 1; $bar = 2; And in My/PerlSection/Handler.pm: sub My::Handler::handler : handler { my ($self, $parms, $args) = @_; #do your thing! } So, when that given CPerlE> block in encountered, the code within will first be evaluated, then the handler routine will be invoked with 3 arguments: =over =item arg1: C<$self> self-explanatory =item arg2: C<$parms> ( C> ) C<$parms> is specific for the current Container, for example, you might want to call C<$parms-Eserver()> to get the current server. =item arg3: C<$args> ( C>) the table object of the section arguments. The 2 guaranteed ones will be: $args->{'handler'} = 'My::PerlSection::Handler'; $args->{'package'} = 'Apache2::ReadConfig'; Other C pairs given on the CPerlE> line will also be included. =back At this point, it's up to the handler routing to inspect the namespace of the C<$args>-E{'package'} and chooses what to do. The most likely thing to do is to feed configuration data back into apache. To do that, use Apache2::Server-Eadd_config("directive"), for example: $parms->server->add_config("Alias /foo /bar"); Would create a new alias. The source code of C is a good place to look for a practical example. =head1 Verifying CPerlE> Sections If the CPerlE> sections include no code requiring a running mod_perl, it is possible to check those from the command line. But the following trick should be used: # file: httpd.conf #!perl # ... code here ... __END__ Now you can run: % perl -c httpd.conf =head1 Bugs =head2 EPerlE directive missing closing 'E' httpd-2.0.47 had a bug in the configuration parser which caused the startup failure with the following error: Starting httpd: Syntax error on line ... of /etc/httpd/conf/httpd.conf: directive missing closing '>' [FAILED] This has been fixed in httpd-2.0.48. If you can't upgrade to this or a higher version, please add a space before the closing 'E' of the opening tag as a workaround. So if you had: # some code change it to be: # some code =head2 EPerlE[...]E was not closed. On encountering a one-line EPerlE block, httpd's configuration parser will cause a startup failure with an error similar to this one: Starting httpd: Syntax error on line ... of /etc/httpd/conf/httpd.conf: use> was not closed. If you have written a simple one-line EPerlE section like this one : use Apache::DBI; change it to be: use Apache::DBI; This is caused by a limitation of httpd's configuration parser and is not likely to be changed to allow one-line block like the example above. Use multi-line blocks instead. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/porting.pod0000644000177200010010000000532212540623177017226 0ustar SteveNone=head1 NAME Apache2::porting -- a helper module for mod_perl 1.0 to mod_perl 2.0 porting =head1 Synopsis # either add at the very beginning of startup.pl use Apache2::porting; # or httpd.conf PerlModule Apache2::porting # now issue requests and look at the error_log file for hints =head1 Description C helps to port mod_perl 1.0 code to run under mod_perl 2.0. It doesn't provide any back-compatibility functionality, however it knows to trap methods calls that are no longer in the mod_perl 2.0 API and tell what should be used instead if at all. If you attempts to use mod_perl 2.0 methods without first loading the modules that contain them, it will tell you which modules you need to load. Finally if your code tries to load modules that no longer exist in mod_perl 2.0 it'll also tell you what are the modules that should be used instead. C communicates with users via the I file. Everytime it traps a problem, it logs the solution (if it finds one) to the error log file. If you use this module coupled with C> you will be able to port your applications quickly without needing to restart the server on every modification. It starts to work only when child process start and doesn't work for the code that gets loaded at the server startup. This limitation is explained in the L section. It relies heavily on C>. which can also be used manually to lookup things. =head1 Culprits C uses the C function to provide its functionality. However it seems to be impossible to create C at the server startup, Apache segfaults on restart. Therefore it performs the setting of C only during the I phase, when child processes start. As a result it can't help you with things that get preloaded at the server startup. If you know how to resolve this problem, please let us know. To reproduce the problem try to use an earlier phase, e.g. C: Apache2::ServerUtil->server->push_handlers(PerlPostConfigHandler => \&porting_autoload); META: Though there is a better solution at work, which assigns AUTOLOAD for each class separately, instead of using UNIVERSAL. See the discussion on the dev list (hint: search the archive for EazyLife) =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Process.pod0000644000177200010010000000366512540623177017172 0ustar SteveNone=head1 NAME Apache2::Process - Perl API for Apache process record =head1 Synopsis use Apache2::Process (); use Apache2::ServerRec (); my $proc = $s->process; # global pool cleared on exit my $global_pool = $proc->pool; # configuration pool cleared on restart my $pconf = $proc->pconf; # short program name (e.g. httpd) my $proc_name = $proc->short_name; =head1 Description C provides the API for the Apache process object, which you can retrieve with Cprocess|docs::2.0::api::Apache2::ServerRec/C_process_>>: use Apache2::ServerRec (); $proc = $s->process; =head1 API C provides the following functions and/or methods: =head2 C Get configuration pool object. $p = $proc->pconf(); =over 4 =item obj: C<$proc> ( C> ) =item ret: C<$p> ( C> ) =item since: 2.0.00 =back This pool object gets cleared on server restart. =head2 C Get the global pool object. $p = $proc->pool(); =over 4 =item obj: C<$proc> ( C> ) =item ret: C<$p> ( C> ) =item since: 2.0.00 =back This pool object gets cleared only on (normal) server exit =head2 C The name of the program used to execute the program $short_name = $proc->short_name(); =over 4 =item obj: C<$proc> ( C> ) =item ret: C<$short_name> (string) e.g. C =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Reload.pod0000644000177200010010000002743312540623177016761 0ustar SteveNone=head1 NAME Apache2::Reload - Reload Perl Modules when Changed on Disk =head1 Synopsis # Monitor and reload all modules in %INC: # httpd.conf: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload # when working with protocols and connection filters # PerlPreConnectionHandler Apache2::Reload # Reload groups of modules: # httpd.conf: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache2::*" #PerlSetVar ReloadDebug On # Reload a single module from within itself: package My::Apache2::Module; use Apache2::Reload; sub handler { ... } 1; =head1 Description C reloads modules that change on the disk. When Perl pulls a file via C, it stores the filename in the global hash C<%INC>. The next time Perl tries to C the same file, it sees the file in C<%INC> and does not reload from disk. This module's handler can be configured to iterate over the modules in C<%INC> and reload those that have changed on disk or only specific modules that have registered themselves with C. It can also do the check for modified modules, when a special touch-file has been modified. Note that C operates on the current context of C<@INC>. Which means, when called as a C it will not see C<@INC> paths added or removed by C scripts, as the value of C<@INC> is saved on server startup and restored to that value after each request. In other words, if you want C to work with modules that live in custom C<@INC> paths, you should modify C<@INC> when the server is started. Besides, C<'use lib'> in the startup script, you can also set the C variable in the httpd's environment to include any non-standard 'lib' directories that you choose. For example, to accomplish that you can include a line: PERL5LIB=/home/httpd/perl/extra; export PERL5LIB in the script that starts Apache. Alternatively, you can set this environment variable in I: PerlSetEnv PERL5LIB /home/httpd/perl/extra =head2 Monitor All Modules in C<%INC> To monitor and reload all modules in C<%INC> at the beginning of request's processing, simply add the following configuration to your I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload When working with connection filters and protocol modules C should be invoked in the pre_connection stage: PerlPreConnectionHandler Apache2::Reload See also the discussion on C>. =head2 Register Modules Implicitly To only reload modules that have registered with C, add the following to the I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off # ReloadAll defaults to On Then any modules with the line: use Apache2::Reload; Will be reloaded when they change. =head2 Register Modules Explicitly You can also register modules explicitly in your I file that you want to be reloaded on change: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test" Note that these are split on whitespace, but the module list B be in quotes, otherwise Apache tries to parse the parameter list. The C<*> wild character can be used to register groups of files under the same namespace. For example the setting: PerlSetVar ReloadModules "ModPerl::* Apache2::*" will monitor all modules under the namespaces C and C. =head2 Monitor Only Certain Sub Directories To reload modules only in certain directories (and their subdirectories) add the following to the I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2" You can further narrow the list of modules to be reloaded from the chosen directories with C as in: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2" PerlSetVar ReloadAll Off PerlSetVar ReloadModules "MyApache2::*" In this configuration example only modules from the namespace C found in the directories I and I (and their subdirectories) will be reloaded. =head2 Special "Touch" File You can also declare a file, which when gets Ced, causes the reloads to be performed. For example if you set: PerlSetVar ReloadTouchFile /tmp/reload_modules and don't C the file I, the reloads won't happen until you go to the command line and type: % touch /tmp/reload_modules When you do that, the modules that have been changed, will be magically reloaded on the next request. This option works with any mode described before. =head2 Unregistering a module In some cases, it might be necessary to explicitely stop reloading a module. Apache2::Reload->unregister_module('Some::Module'); But be carefull, since unregistering a module in this way will only do so for the current interpreter. This feature should be used with care. =head1 Performance Issues This module is perfectly suited for a development environment. Though it's possible that you would like to use it in a production environment, since with C you don't have to restart the server in order to reload changed modules during software updates. Though this convenience comes at a price: =over =item * If the "touch" file feature is used, C has to stat(2) the touch file on each request, which adds a slight but most likely insignificant overhead to response times. Otherwise C will stat(2) each registered module or even worse--all modules in C<%INC>, which will significantly slow everything down. =item * Once the child process reloads the modules, the memory used by these modules is not shared with the parent process anymore. Therefore the memory consumption may grow significantly. =back Therefore doing a full server stop and restart is probably a better solution. =head1 Debug If you aren't sure whether the modules that are supposed to be reloaded, are actually getting reloaded, turn the debug mode on: PerlSetVar ReloadDebug On =head1 Caveats =head2 Problems With Reloading Modules Which Do Not Declare Their Package Name If you modify modules, which don't declare their C, and rely on C to reload them, you may encounter problems: i.e., it'll appear as if the module wasn't reloaded when in fact it was. This happens because when C Cs such a module all the global symbols end up in the C namespace! So the module does get reloaded and you see the compile time errors if there are any, but the symbols don't get imported to the right namespace. Therefore the old version of the code is running. =head2 Failing to Find a File to Reload C uses C<%INC> to find the files on the filesystem. If an entry for a certain filepath in C<%INC> is relative, C will use C<@INC> to try to resolve that relative path. Now remember that mod_perl freezes the value of C<@INC> at the server startup, and you can modify it only for the duration of one request when you need to load some module which is not in on of the C<@INC> directories. So a module gets loaded, and registered in C<%INC> with a relative path. Now when C tries to find that module to check whether it has been modified, it can't find since its directory is not in C<@INC>. So C will silently skip that module. You can enable the C mode to see what C does behind the scenes. =head2 Problems with Scripts Running with Registry Handlers that Cache the Code The following problem is relevant only to registry handlers that cache the compiled script. For example it concerns C> but not C>. =head3 The Problem Let's say that there is a module C: #file:My/Utils.pm #---------------- package My::Utils; BEGIN { warn __PACKAGE__ , " was reloaded\n" } use base qw(Exporter); @EXPORT = qw(colour); sub colour { "white" } 1; And a registry script F: #file:test.pl #------------ use My::Utils; print "Content-type: text/plain\n\n"; print "the color is " . colour(); Assuming that the server is running in a single mode, we request the script for the first time and we get the response: the color is white Now we change F: - sub colour { "white" } + sub colour { "red" } And issue the request again. C does its job and we can see that C was reloaded (look in the I file). However the script still returns: the color is white =head3 The Explanation Even though F was reloaded, C's cached code won't run 'C' again (since it happens only once, i.e. during the compile time). Therefore the script doesn't know that the subroutine reference has been changed. This is easy to verify. Let's change the script to be: #file:test.pl #------------ use My::Utils; print "Content-type: text/plain\n\n"; my $sub_int = \&colour; my $sub_ext = \&My::Utils::colour; print "int $sub_int\n"; print "ext $sub_ext\n"; Issue a request, you will see something similar to: int CODE(0x8510af8) ext CODE(0x8510af8) As you can see both point to the same CODE reference (meaning that it's the same symbol). After modifying F again: - sub colour { "red" } + sub colour { "blue" } and calling the script on the secondnd time, we get: int CODE(0x8510af8) ext CODE(0x851112c) You can see that the internal CODE reference is not the same as the external one. =head3 The Solution There are two solutions to this problem: Solution 1: replace C with an explicit C + C. - use My::Utils; + require My::Utils; My::Utils->import(); now the changed functions will be reimported on every request. Solution 2: remember to touch the script itself every time you change the module that it requires. =head1 Threaded MPM and Multiple Perl Interpreters If you use C with a threaded MPM and multiple Perl interpreters, the modules will be reloaded by each interpreter as they are used, not every interpreters at once. Similar to mod_perl 1.0 where each child has its own Perl interpreter, the modules are reloaded as each child is hit with a request. If a module is loaded at startup, the syntax tree of each subroutine is shared between interpreters (big win), but each subroutine has its own padlist (where lexical my variables are stored). Once C reloads a module, this sharing goes away and each Perl interpreter will have its own copy of the syntax tree for the reloaded subroutines. =head1 Pseudo-hashes The short summary of this is: Don't use pseudo-hashes. They are deprecated since Perl 5.8 and are removed in 5.9. Use an array with constant indexes. Its faster in the general case, its more guaranteed, and generally, it works. The long summary is that some work has been done to get this module working with modules that use pseudo-hashes, but it's still broken in the case of a single module that contains multiple packages that all use pseudo-hashes. So don't do that. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors Matt Sergeant, matt@sergeant.org Stas Bekman (porting to mod_perl 2.0) A few concepts borrowed from C by Randal Schwartz and C (mod_perl 1.x) by Doug MacEachern and Ask Bjoern Hansen. =cut mod_perl-2.0.9/docs/api/Apache2/RequestIO.pod0000644000177200010010000002276512540623177017436 0ustar SteveNone=head1 NAME Apache2::RequestIO - Perl API for Apache request record IO =head1 Synopsis use Apache2::RequestIO (); $rc = $r->discard_request_body(); $r->print("foo", "bar"); $r->puts("foo", "bar"); # same as print, but no flushing $r->printf("%s $d", "foo", 5); $r->read($buffer, $len); $r->rflush(); $r->sendfile($filename); $r->write("foobartarcar", 3, 5); =head1 Description C provides the API to perform IO on the L. =head1 API C provides the following functions and/or methods: =head2 C In HTTP/1.1, any method can have a body. However, most GET handlers wouldn't know what to do with a request body if they received one. This helper routine tests for and reads any message body in the request, simply discarding whatever it receives. We need to do this because failing to read the request body would cause it to be interpreted as the next request on a persistent connection. $rc = $r->discard_request_body(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$rc> ( integer ) C> if request is malformed, C otherwise. =item since: 2.0.00 =back Since we return an error status if the request is malformed, this routine should be called at the beginning of a no-body handler, e.g., use Apache2::Const -compile => qw(OK); $rc = $r->discard_request_body; return $rc if $rc != Apache2::Const::OK; =head2 C Send data to the client. $cnt = $r->print(@msg); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<@msg> ( ARRAY ) Data to send =item ret: C<$cnt> ( number ) How many bytes were sent (or buffered). If zero bytes were sent, C will return C<0E0>, or "zero but true," which will still evaluate to C<0> in a numerical context. =item excpt: C> =item since: 2.0.00 =back The data is flushed only if STDOUT stream's C<$|> is true. Otherwise it's buffered up to the size of the buffer, flushing only excessive data. =head2 C Format and send data to the client (same as C). $cnt = $r->printf($format, @args); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$format> ( string ) Format string, as in the Perl core C function. =item arg2: C<@args> ( ARRAY ) Arguments to be formatted, as in the Perl core C function. =item ret: C<$cnt> ( number ) How many bytes were sent (or buffered) =item excpt: C> =item since: 2.0.00 =back The data is flushed only if STDOUT stream's C<$|> is true. Otherwise it's buffered up to the size of the buffer, flushing only excessive data. =head2 C Send data to the client $cnt = $r->puts(@msg); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<@msg> ( ARRAY ) Data to send =item ret: C<$cnt> ( number ) How many bytes were sent (or buffered) =item excpt: C> =item since: 2.0.00 =back C is similar to C>, but it won't attempt to flush data, no matter what the value of STDOUT stream's C<$|> is. Therefore assuming that STDOUT stream's C<$|> is true, this method should be a tiny bit faster than C>, especially if small strings are printed. =head2 C Read data from the client. $cnt = $r->read($buffer, $len); $cnt = $r->read($buffer, $len, $offset); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$buffer> ( SCALAR ) The buffer to populate with the read data =item arg2: C<$len> ( number ) How many bytes to attempt to read =item opt arg3: C<$offset> ( number ) If a non-zero C<$offset> is specified, the read data will be placed at that offset in the C<$buffer>. META: negative offset and \0 padding are not supported at the moment =item ret: C<$cnt> ( number ) How many characters were actually read =item excpt: C> =item since: 2.0.00 =back This method shares a lot of similarities with the Perl core C function. The main difference in the error handling, which is done via C> =head2 C Flush any buffered data to the client. $r->rflush(); =over 4 =item obj: C<$r> ( C> ) =item ret: no return value =item since: 2.0.00 =back Unless STDOUT stream's C<$|> is false, data sent via Cprint()|/C_print_>> is buffered. This method flushes that data to the client. =head2 C Send a file or a part of it $rc = $r->sendfile($filename); $rc = $r->sendfile($filename, $offset); $rc = $r->sendfile($filename, $offset, $len); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$filename> ( string ) The full path to the file (using C on all systems) =item opt arg2: C<$offset> ( integer ) Offset into the file to start sending. No offset is used if C<$offset> is not specified. =item opt arg3: C<$len> ( integer ) How many bytes to send. If not specified the whole file is sent (or a part of it, if C<$offset> if specified) =item ret: C<$rc> ( C> ) On success, C> is returned. In case of a failure -- a failure code is returned, in which case normally it should be returned to the caller. =item excpt: C> Exceptions are thrown only when this function is called in the VOID context. So if you don't want to handle the errors, just don't ask for a return value and the function will handle all the errors on its own. =item since: 2.0.00 =back =head2 C Send partial string to the client $cnt = $r->write($buffer); $cnt = $r->write($buffer, $len); $cnt = $r->write($buffer, $len, $offset); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$buffer> ( SCALAR ) The string with data =item opt arg2: C<$len> ( SCALAR ) How many bytes to send. If not specified, or -1 is specified, all the data in C<$buffer> (or starting from C<$offset>) will be sent. =item opt arg3: C<$offset> ( number ) Offset into the C<$buffer> string. =item ret: C<$cnt> ( number ) How many bytes were sent (or buffered) =item excpt: C> =item since: 2.0.00 =back Examples: Assuming that we have a string: $string = "123456789"; Then: $r->write($string); sends: 123456789 Whereas: $r->write($string, 3); sends: 123 And: $r->write($string, 3, 5); sends: 678 Finally: $r->write($string, -1, 5); sends: 6789 =head1 TIE Interface The TIE interface implementation. This interface is used for HTTP request handlers, when running under C> and Perl doesn't have perlio enabled. See the I manpage for more information. =head2 C =over 4 =item since: 2.0.00 =back NoOP See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back NoOP See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back NoOP See the I Perl entry in the I manpage =head2 C =over 4 =item since: 2.0.00 =back See the I Perl entry in the I manpage =head1 Deprecated API The following methods are deprecated, Apache plans to remove those in the future, therefore avoid using them. =head2 C This method is deprecated since the C implementation is buggy and we don't want you to use it at all. Instead use the plain Cread()|/C_read_>>. =head2 C This method is deprecated since Cget_client_block|/C__get_client_block_>> is deprecated. =head2 C This method is deprecated since Cget_client_block|/C__get_client_block_>> is deprecated. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/RequestRec.pod0000644000177200010010000012175112540623177017633 0ustar SteveNone=head1 NAME Apache2::RequestRec - Perl API for Apache request record accessors =head1 Synopsis use Apache2::RequestRec (); # set supported by the handler HTTP methods $allowed = $r->allowed(); # auth type $auth_type = $r->ap_auth_type(); # QUERY_STRING $args = $r->args(); # non-parsed-headers handler $status = $r->assbackwards(); # how many bytes were sent $bytes_sent = $r->bytes_sent(); # client connection record $c = $r->connection(); # "Content-Encoding" HTTP response header $r->content_encoding("gzip"); # the languages of the content $languages = $r->content_languages(); # "Content-Encoding" HTTP response header $r->content_type('text/plain'); # special response headers table $err_headers_out = $r->err_headers_out(); # request mapped filename $filename = $r->filename(); # request finfo $finfo = $r->finfo(); # 'SetHandler perl-script' equivalent $r->handler('perl-script'); # was it a HEAD request? $status = $r->header_only(); # request input headers table $headers_in = $r->headers_in(); # request output headers table $headers_out = $r->headers_out(); # hostname $hostname = $r->hostname(); # input filters stack $input_filters = $r->input_filters(); # get the main request obj in a sub-request $main_r = $r->main(); # what's the current request (GET/POST/etc)? $method = $r->method(); # what's the current method number? $methnum = $r->method_number(); # current resource last modified time $mtime = $r->mtime(); # next request object (in redirect) $next_r = $r->next(); # there is no local copy $r->no_local_copy(); # Apache ascii notes table $notes = $r->notes(); # output filters stack $output_filters = $r->output_filters(); # PATH_INFO $path_info = $r->path_info(); # used in configuration directives modules $per_dir_config = $r->per_dir_config(); # pool with life span of the current request $p = $r->pool(); # previous request object in the internal redirect $prev_r = $r->prev(); # connection level input filters stack $proto_input_filters = $r->proto_input_filters(); # HTTP protocol version number $proto_num = $r->proto_num(); # connection level output filters stack $proto_output_filters = $r->proto_output_filters(); # the protocol, the client speaks: "HTTP/1.0", "HTTP/1.1", etc. $protocol = $r->protocol(); # is it a proxy request $status = $r->proxyreq($val); # Time when the request started $request_time = $r->request_time(); # server object $s = $r->server(); # response status $status = $r->status(); # response status line $status_line = $r->status_line(); # manipulate %ENV of the subprocess $r->subprocess_env; $r->subprocess_env($key => $val); # first HTTP request header $request = $r->the_request(); # the URI without any parsing performed $unparsed_uri = $r->unparsed_uri(); # The path portion of the URI $uri = $r->uri(); # auth username $user = $r->user(); =head1 Description C provides the Perl API for Apache request_rec object. The following packages extend the C functionality: C>, C>, C>, C>, C>, C> and C>. =head1 API C provides the following functions and/or methods: =head2 C Get/set the allowed methods bitmask. $allowed = $r->allowed(); $prev_allowed = $r->allowed($new_allowed); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_allowed> ( bitmask ) Set the bitvector. =item ret: C<$allowed> ( bitmask ) returns C<$allowed>, which is a bitvector of the allowed methods. If the C<$new_allowed> argument is passed, the value before the change is returned. =item since: 2.0.00 =back A handler must ensure that the request method is one that it is capable of handling. Generally modules should C any request methods they do not handle. Prior to aborting the handler like this the handler should set C<$r-Eallowed> to the list of methods that it is willing to handle. This bitvector is used to construct the C<"Allow:"> header required for C requests, and C (405) and C (501) status codes. Since the default Apache handler deals with the C method, all response handlers can usually decline to deal with C. For example if the response handler handles only C and C methods, and not C, it may want to say: use Apache2::Const -compile => qw(OK DECLINED M_GET M_POST M_OPTIONS); if ($r->method_number == Apache2::Const::M_OPTIONS) { $r->allowed($r->allowed | (1< is always allowed, modules don't need to set it explicitly. Since the default_handler will always handle a C, a module which does *not* implement C should probably return C. Unfortunately this means that a script C handler can't be installed by mod_actions. For example, if the module can handle only POST method it could start with: use Apache2::Const -compile => qw(M_POST HTTP_METHOD_NOT_ALLOWED); unless ($r->method_number == Apache2::Const::M_POST) { $r->allowed($r->allowed | (1< If an authentication check was made, get or set the I slot in the request record $auth_type = $r->ap_auth_type(); $r->ap_auth_type($newval); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$newval> (string) If this argument is passed then a new auth type is assigned. For example: $r->auth_type('Basic'); =item ret: C<$auth_type> (string) If C<$newval> is passed, nothing is returned. Otherwise the current auth type is returned. =item since: 2.0.00 =back I holds the authentication type that has been negotiated between the client and server during the actual request. Generally, I is populated automatically when you call C<$r-Eget_basic_auth_pw> so you don't really need to worry too much about it, but if you want to roll your own authentication mechanism then you will have to populate I yourself. Note that C<$r-Eap_auth_type> was C<$r-Econnection-Eauth_type> in the mod_perl 1.0 API. =head2 C Get/set the request QUERY string $args = $r->args(); $prev_args = $r->args($new_args); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_args> ( string ) Optionally set the new QUERY string =item ret: C<$args> ( string ) The current QUERY string If C<$new_args> was passed, returns the value before the change. =item since: 2.0.00 =back =head2 C When set to a true value, Apache won't send any HTTP response headers allowing you to send any headers. $status = $r->assbackwards(); $prev_status = $r->assbackwards($newval); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$newval> (integer) assign a new state. =item ret: C<$status> (integer) current state. =item since: 2.0.00 =back If you send your own set of headers, which includes the C HTTP response header, you must make sure to increment the number of requests served over this connection (which is normally done by the core connection output filter C, but skipped when C is enabled). $r->connection->keepalives($r->connection->keepalives + 1); otherwise code relying on the value of Cconnection-Ekeepalives|docs::2.0::api::Apache2::Connection/C_keepalives_>> may malfunction. For example, this counter is used to tell when a new request is coming in over the same connection to a filter that wants to parse only HTTP headers (like C). Of course you will need to set Cconnection-Ekeepalive(1)|docs::2.0::api::Apache2::Connection/C_keepalive_>> ) as well. =head2 C The number of bytes sent to the client, handy for logging, etc. $bytes_sent = $r->bytes_sent(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$bytes_sent> (integer) =item since: 2.0.00 =back Though as of this writing in Apache 2.0 it doesn't really do what it did in Apache 1.3. It's just set to the size of the response body. The issue is that buckets from one request may get buffered and not sent during the lifetime of the request, so it's not easy to give a truly accurate count of "bytes sent to the network for this response". =head2 C Get the client connection record $c = $r->connection(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$c> ( C> ) =item since: 2.0.00 =back =head2 C Get/set content encoding (the "Content-Encoding" HTTP header). Content encodings are string like I<"gzip"> or I<"compress">. $ce = $r->content_encoding(); $prev_ce = $r->content_encoding($new_ce); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_ce> ( string ) If passed, sets the content encoding to a new value. It must be a lowercased string. =item ret: C<$ce> ( string ) The current content encoding. If C<$new_ce> is passed, then the previous value is returned. =item since: 2.0.00 =back For example, here is how to send a gzip'ed response: require Compress::Zlib; $r->content_type("text/plain"); $r->content_encoding("gzip"); $r->print(Compress::Zlib::memGzip("some text to be gzipped)); =head2 C Get/set content languages (the C<"Content-Language"> HTTP header). Content languages are string like I<"en"> or I<"fr">. $languages = $r->content_languages(); $prev_lang = $r->content_languages($nev_lang); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_lang> ( ARRAY ref ) If passed, sets the content languages to new values. It must be an ARRAY reference of language names, like I<"en"> or I<"fr"> =item ret: C<$languages> ( ARRAY ref ) The current list of content languages, as an ARRAY reference. If C<$new_lang> is passed, then the previous value is returned. =item since: 2.0.00 =back =head2 C Get/set the HTTP response I header value. my $content_type = $r->content_type(); my $prev_content_type = $r->content_type($new_content_type); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_content_type> (MIME type string) Assign a new HTTP response content-type. It will affect the response only if HTTP headers weren't sent yet. =item ret: C<$content_type> The current content-type value. If C<$new_content_type> was passed, the previous value is returned instead. =item since: 2.0.00 =back For example, set the C header to I. $r->content_type('text/plain'); If you set this header via the C> table directly, it will be ignored by Apache. So do not do that. =head2 C Get/set MIME response headers, printed even on errors and persist across internal redirects. $err_headers_out = $r->err_headers_out(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$err_headers_out> ( C> ) =item since: 2.0.00 =back The difference between C> and C, is that the latter are printed even on error, and persist across internal redirects (so the headers printed for C handlers will have them). For example, if a handler wants to return a 404 response, but nevertheless to set a cookie, it has to be: $r->err_headers_out->add('Set-Cookie' => $cookie); return Apache2::Const::NOT_FOUND; If the handler does: $r->headers_out->add('Set-Cookie' => $cookie); return Apache2::Const::NOT_FOUND; the C header won't be sent. =head2 C Get/set the filename on disk corresponding to this response (the result of the I filename> translation). $filename = $r->filename(); $prev_filename = $r->filename($new_filename); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_filename> ( string ) new value =item ret: C<$filename> ( string ) the current filename, or the previous value if the optional C<$new_filename> argument was passed =item since: 2.0.00 =back Note that if you change the filename after the C> phase was run and expect Apache to serve it, you need to update its C record, like so: use Apache2::RequestRec (); use APR::Finfo (); use APR::Const -compile => qw(FINFO_NORM); $r->filename($newfile); $r->finfo(APR::Finfo::stat($newfile, APR::Const::FINFO_NORM, $r->pool)); if you don't, Apache will still try to use the previously cached information about the previously set value of the filename. =head2 C Get and set the I request record member: $finfo = $r->finfo(); $r->finfo($finfo); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$finfo> ( C> ) =item ret: C<$finfo> ( C> ) Always returns the current object. Due to the internal Apache implementation it's not possible to have two different objects originating from C<$r-Efinfo> at the same time. Whenever C<$r-Efinfo> is updated all objects will be updated too to the latest value. =item since: 2.0.00 =back Most of the time, this method is used to get the C member. The only reason you may want to set it is you need to use it before the Apache's default map_to_storage phase is called. Examples: =over =item * What Apache thinks is the current request filename (post the C> phase): use Apache2::RequestRec (); use APR::Finfo (); print $r->finfo->fname; =item * Populate the C member (normally, before the C> phase): use APR::Finfo (); use APR::Const -compile => qw(FINFO_NORM); my $finfo = APR::Finfo::stat(__FILE__, APR::Const::FINFO_NORM, $r->pool); $r->finfo($finfo); =back =head2 C Get/set the equivalent of the C directive. $handler = $r->handler(); $prev_handler = $r->handler($new_handler); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_handler> ( string ) the new handler. =item ret: C<$handler> ( string ) the current handler. If C<$new_handler> is passed, the previous value is returned. =item since: 2.0.00 =back =head2 C Did the client has asked for headers only? e.g. if the request method was B. $status = $r->header_only(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$status> ( boolean ) Returns true if the client is asking for headers only, false otherwise =item since: 2.0.00 =back =head2 C Get/set the request MIME headers: $headers_in = $r->headers_in(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$headers_in> ( C> ) =item since: 2.0.00 =back This table is available starting from the C> phase. For example you can use it to retrieve the cookie value sent by the client, in the C header: my $cookie = $r->headers_in->{Cookie} || ''; =head2 C Get/set MIME response headers, printed only on 2xx responses. $headers_out = $r->headers_out(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$headers_out> ( C> ) =item since: 2.0.00 =back See also C>, which allows to set headers for non-2xx responses and persist across internal redirects. =head2 C Host, as set by full URI or Host: $hostname = $r->hostname(); $prev_hostname = $r->hostname($new_hostname); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_hostname> ( string ) new value =item ret: C<$hostname> ( string ) the current hostname, or the previous value if the optional C<$new_hostname> argument was passed =item since: 2.0.00 =back =head2 C Get/set the first filter in a linked list of request level input filters: $input_filters = $r->input_filters(); $prev_input_filters = $r->input_filters($new_input_filters); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_input_filters> Set a new value =item ret: C<$input_filters> ( C> ) The first filter in the request level input filters chain. If C<$new_input_filters> was passed, returns the previous value. =item since: 2.0.00 =back For example instead of using Cread()|docs::2.0::api::Apache2::RequestIO/C_read_>> to read the POST data, one could use an explicit walk through incoming bucket brigades to get that data. The following function C does just that (in fact that's what Cread()|docs::2.0::api::Apache2::RequestIO/C_read_>> does behind the scenes): use APR::Brigade (); use APR::Bucket (); use Apache2::Filter (); use Apache2::Const -compile => qw(MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub read_post { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->remove; # optimization to reuse memory } } while (!$seen_eos); $bb->destroy; return $data; } As you can see C<$r-Einput_filters> gives us a pointer to the last of the top of the incoming filters stack. =head2 C
Get the main request record $main_r = $r->main(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$main_r> ( C> ) If the current request is a sub-request, this method returns a blessed reference to the main request structure. If the current request is the main request, then this method returns C. To figure out whether you are inside a main request or a sub-request/internal redirect, use Cis_initial_req|docs::2.0::api::Apache2::RequestUtil/C_is_initial_req_>>. =item since: 2.0.00 =back =head2 C Get/set the current request method (e.g. C, C, C, etc.): $method = $r->method(); $pre_method = $r->method($new_method); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_method> ( string ) a new value =item ret: C<$method> ( string ) The current method as a string if C<$new_method> was passed the previous value is returned. =item since: 2.0.00 =back =head2 C Get/set the HTTP method, issued by the client (C, C, etc.) $methnum = $r->method_number(); $prev_methnum = $r->method_number($new_methnum); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_methnum> ( C> ) a new value =item ret: C<$methnum> ( C> ) The current method as a number if C<$new_methnum> was passed the previous value is returned. =item since: 2.0.00 =back See the Callowed|/C_allowed_>> entry for examples. =head2 C Last modified time of the requested resource $mtime = $r->mtime(); $prev_mtime = $r->mtime($new_mtime); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_mtime> (epoch seconds). a new value =item ret: C<$mtime> (epoch seconds). the current value if C<$new_mtime> was passed the previous value is returned. =item since: 2.0.00 =back =head2 C Pointer to the redirected request if this is an external redirect $next_r = $r->next(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$next_r> ( C> ) returns a blessed reference to the next (internal) request structure or C if there is no next request. =item since: 2.0.00 =back =head2 C There is no local copy of this response $status = $r->no_local_copy(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$status> (integer) =item since: 2.0.00 =back Used internally in certain sub-requests to prevent sending C for a fragment or error documents. For example see the implementation in F. Also used internally in Cmeets_conditions|docs::2.0::api::Apache2::Response/C_meets_conditions_>> -- if set to a true value, the conditions are always met. =head2 C Get/set text notes for the duration of this request. These notes can be passed from one module to another (not only mod_perl, but modules in any other language): $notes = $r->notes(); $prev_notes = $r->notes($new_notes); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_notes> ( C> ) =item ret: C<$notes> ( C> ) the current notes table. if the C<$new_notes> argument was passed, returns the previous value. =item since: 2.0.00 =back If you want to pass Perl structures, you can use Cpnotes|docs::2.0::api::Apache2::RequestUtil/C_pnotes_>>. Also see Cnotes|docs::2.0::api::Apache2::Connection/C_notes_>> =head2 C Get the first filter in a linked list of request level output filters: $output_filters = $r->output_filters(); $prev_output_filters = $r->output_filters($new_output_filters); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_output_filters> Set a new value =item ret: C<$output_filters> ( C> ) The first filter in the request level output filters chain. If C<$new_output_filters> was passed, returns the previous value. =item since: 2.0.00 =back For example instead of using Cprint()|docs::2.0::api::Apache2::RequestIO/C_print_>> to send the response body, one could send the data directly to the first output filter. The following function C does just that: use APR::Brigade (); use APR::Bucket (); use Apache2::Filter (); sub send_response_body { my ($r, $data) = @_; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $b = APR::Bucket->new($bb->bucket_alloc, $data); $bb->insert_tail($b); $r->output_filters->fflush($bb); $bb->destroy; } In fact that's what Cread()|docs::2.0::api::Apache2::RequestIO/C_read_>> does behind the scenes. But it also knows to parse HTTP headers passed together with the data and it also implements buffering, which the above function does not. =head2 C Get/set the C, what is left in the path after the I filename> translation: $path_info = $r->path_info(); $prev_path_info = $r->path_info($path_info); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$path_info> ( string ) Set a new value =item ret: C<$path_info> ( string ) Return the current value. If the optional argument C<$path_info> is passed, the previous value is returned. =item since: 2.0.00 =back =head2 C Get the dir config vector: $per_dir_config = $r->per_dir_config(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$per_dir_config> ( C> ) =item since: 2.0.00 =back For an indepth discussion, refer to the L. =head2 C The pool associated with the request $p = $r->pool(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$p> ( C> ) =item since: 2.0.00 =back =head2 C Pointer to the previous request if this is an internal redirect $prev_r = $r->prev(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$prev_r> ( C> ) a blessed reference to the previous (internal) request structure or C if there is no previous request. =item since: 2.0.00 =back =head2 C Get the first filter in a linked list of protocol level input filters: $proto_input_filters = $r->proto_input_filters(); $prev_proto_input_filters = $r->proto_input_filters($new_proto_input_filters); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_proto_input_filters> Set a new value =item ret: C<$proto_input_filters> ( C> ) The first filter in the protocol level input filters chain. If C<$new_proto_input_filters> was passed, returns the previous value. =item since: 2.0.00 =back C<$r-Eproto_input_filters> points to the same filter as Cconnection-Einput_filters|docs::2.0::api::Apache2::Connection/C_input_filters_>>. =head2 C Get current request's HTTP protocol version number $proto_num = $r->proto_num(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$proto_num> (integer) current request's HTTP protocol version number, e.g.: HTTP/1.0 == 1000, HTTP/1.1 = 1001 =item since: 2.0.00 =back =head2 C Get the first filter in a linked list of protocol level output filters: $proto_output_filters = $r->proto_output_filters(); $prev_proto_output_filters = $r->proto_output_filters($new_proto_output_filters); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_proto_output_filters> Set a new value =item ret: C<$proto_output_filters> ( C> ) The first filter in the protocol level output filters chain. If C<$new_proto_output_filters> was passed, returns the previous value. =item since: 2.0.00 =back C<$r-Eproto_output_filters> points to the same filter as Cconnection-Eoutput_filters|docs::2.0::api::Apache2::Connection/C_output_filters_>>. =head2 C Get a string identifying the protocol that the client speaks. $protocol = $r->protocol(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$protocl> ( string ) Typical values are C<"HTTP/1.0"> or C<"HTTP/1.1">. If the client didn't specify the protocol version, the default is C<"HTTP/0.9"> =item since: 2.0.00 =back =head2 C Get/set the I request record member and optionally adjust other related fields. $status = $r->proxyreq($val); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$val> ( integer ) PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE, PROXYREQ_RESPONSE =item ret: C<$status> ( integer ) If C<$val> is defined the I member will be set to that value and previous value will be returned. If C<$val> is not passed, and C<$r-Eproxyreq> is not true, and the proxy request is matching the current vhost (scheme, hostname and port), the I member will be set to PROXYREQ_PROXY and that value will be returned. In addition C<$r-Euri> is set to C<$r-Eunparsed_uri> and C<$r-Efilename> is set to C<"modperl-proxy:".$r-Euri>. If those conditions aren't true 0 is returned. =item since: 2.0.00 =back For example to turn a normal request into a proxy request to be handled on the same server in the C phase run: my $real_url = $r->unparsed_uri; $r->proxyreq(Apache2::Const::PROXYREQ_PROXY); $r->uri($real_url); $r->filename("proxy:$real_url"); $r->handler('proxy-server'); Also remember that if you want to turn a proxy request into a non-proxy request, it's not enough to call: $r->proxyreq(Apache2::Const::PROXYREQ_NONE); You need to adjust C<$r-Euri> and C<$r-Efilename> as well if you run that code in C phase, since if you don't -- C's own post_read_request handler will override your settings (as it will run after the mod_perl handler). And you may also want to add $r->set_handlers(PerlResponseHandler => []); so that any response handlers which match apache directives will not run in addition to the mod_proxy content handler. =head2 C Time when the request started $request_time = $r->request_time(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$request_time> (epoch seconds). =item since: 2.0.00 =back =head2 C Get the C> object for the server the request C<$r> is running under. $s = $r->server(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$s> ( C> ) =item since: 2.0.00 =back =head2 C Get/set the reply status for the client request. $status = $r->status(); $prev_status = $r->status($new_status); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_status> ( integer ) If C<$new_status> is passed the new status is assigned. Normally you would use some C>, e.g. C. =item ret: C<$newval> ( integer ) The current value. If C<$new_status> is passed the old value is returned. =item since: 2.0.00 =back Usually you will set this value indirectly by returning the status code as the handler's function result. However, there are rare instances when you want to trick Apache into thinking that the module returned an C status code, but actually send the browser a non-OK status. This may come handy when implementing an HTTP proxy handler. The proxy handler needs to send to the client, whatever status code the proxied server has returned, while returning C to Apache. e.g.: $r->status($some_code); return Apache2::Const::OK See also Cstatus_line|/C_status_line_>>, which. if set, overrides C<$r-Estatus>. =head2 C Get/set the response status line. The status line is a string like "200 Document follows" and it will take precedence over the value specified using the C<$r-Estatus()> described above. $status_line = $r->status_line(); $prev_status_line = $r->status_line($new_status_line); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_status_line> ( string ) =item ret: C<$status_line> ( string ) =item since: 2.0.00 =back When discussing Cstatus|/C_status_>> we have mentioned that sometimes a handler runs to a successful completion, but may need to return a different code, which is the case with the proxy server. Assuming that the proxy handler forwards to the client whatever response the proxied server has sent, it'll usually use C, like so: $r->status_line($response->code() . ' ' . $response->message()); return Apache2::Const::OK; In this example C<$response> could be for example an C object, if C was used to implement the proxy. This method is also handy when you extend the HTTP protocol and add new response codes. For example you could invent a new error code and tell Apache to use that in the response like so: $r->status_line("499 We have been FooBared"); return Apache2::Const::OK; Here C<499> is the new response code, and I is the custom response message. =head2 C Get/set the Apache C table, or optionally set the value of a named entry. $r->subprocess_env; $env_table = $r->subprocess_env; $r->subprocess_env($key => $val); $val = $r->subprocess_env($key); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$key> ( string ) =item opt arg2: C<$val> ( string ) =item ret: C<...> =item since: 2.0.00 =back When called in VOID context with no arguments, it populate C<%ENV> with special variables (e.g. C<$ENV{QUERY_STRING}>) like mod_cgi does. When called in a non-VOID context with no arguments, it returns an C>. When the C<$key> argument (string) is passed, it returns the corresponding value (if such exists, or C. The following two lines are equivalent: $val = $r->subprocess_env($key); $val = $r->subprocess_env->get($key); When the C<$key> and the C<$val> arguments (strings) are passed, the value is set. The following two lines are equivalent: $r->subprocess_env($key => $val); $r->subprocess_env->set($key => $val); The C C> is used by C>, to pass environment variables to externally spawned processes. It's also used by various Apache modules, and you should use this table to pass the environment variables. For example if in C you do: $r->subprocess_env(MyLanguage => "de"); you can then deploy C and write in I<.shtml> document: English Deutsch Sorry =head2 C First HTTP request header $request = $r->the_request(); $old_request = $r->uri($new_request); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_request> ( string ) =item ret: C<$request> ( string ) For example: GET /foo/bar/my_path_info?args=3 HTTP/1.0 =item since: 2.0.00 =back =head2 C The URI without any parsing performed $unparsed_uri = $r->unparsed_uri(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$unparsed_uri> ( string ) =item since: 2.0.00 =back If for example the request was: GET /foo/bar/my_path_info?args=3 HTTP/1.0 Curi|/C_uri_>> returns: /foo/bar/my_path_info whereas C<$r-Eunparsed_uri> returns: /foo/bar/my_path_info?args=3 =head2 C The path portion of the URI $uri = $r->uri(); my $prec_uri = $r->uri($new_uri); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_uri> ( string ) =item ret: C<$uri> ( string ) =item since: 2.0.00 =back See the example in the Cunparsed_uri|/C_unparsed_uri_>> section. =head2 C Get the user name, if an authentication process was successful. Or set it. $user = $r->user(); $prev_user = $r->user($new_user); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$new_user> ( string ) Pass C<$new_user> to set a new value =item ret: C<$user> ( string ) The current username if an authentication process was successful. If C<$new_user> was passed, the previous value is returned. =item since: 2.0.00 =back For example, let's print the username passed by the client: my ($res, $sent_pw) = $r->get_basic_auth_pw; return $res if $res != Apache2::Const::OK; print "User: ", $r->user; =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C META: Autogenerated - needs to be reviewed/completed List of allowed methods $list = $r->allowed_methods(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$list> ( C> ) =item since: 2.0.00 =back META: Apache2::MethodList is not available at the moment =head2 C META: Autogenerated - needs to be reviewed/completed Array of extension methods $array = $r->allowed_xmethods(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$array> ( C> ) =item since: 2.0.00 =back META: APR::ArrayHeader is not available at the moment =head2 C Config vector containing pointers to request's per-server config structures $ret = $r->request_config($newval); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$newval> ( C> ) =item since: 2.0.00 =back =head2 C META: Autogenerated - needs to be reviewed/completed Flag for the handler to accept or reject path_info on the current request. All modules should respect the AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO values, while AP_REQ_DEFAULT_PATH_INFO indicates they may follow existing conventions. This is set to the user's preference upon HOOK_VERY_FIRST of the fixups. $ret = $r->used_path_info($newval); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$newval> (integer) =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/RequestUtil.pod0000644000177200010010000006645412540623177020047 0ustar SteveNone=head1 NAME Apache2::RequestUtil - Perl API for Apache request record utils =head1 Synopsis use Apache2::RequestUtil (); # add httpd config dynamically $r->add_config(['require valid-user']); # dump the request object as a string print $r->as_string(); # default content_type $content_type = $r->default_type(); # get PerlSetVar/PerlAddVar values @values = $r->dir_config->get($key); # get server docroot $docroot = $r->document_root(); # set server docroot $r->document_root($new_root); # what are the registered perl handlers for a given phase my @handlers = @{ $r->get_handlers('PerlResponseHandler') || [] }; # push a new handler for a given phase $r->push_handlers(PerlCleanupHandler => \&handler); # set handlers for a given phase (resetting previous values) $r->set_handlers(PerlCleanupHandler => []); # what's the request body limit $limit = $r->get_limit_req_body(); # server and port names $server = $r->get_server_name(); $port = $r->get_server_port(); # what string Apache is going to send for a given status code $status_line = Apache2::RequestUtil::get_status_line(404); # are we in the main request? $is_initial = $r->is_initial_req(); # directory level PerlOptions flags lookup $r->subprocess_env unless $r->is_perl_option_enabled('SetupEnv'); # current value $location = $r->location(); # merge a container in a request object $r->location_merge($location); # create a new Apache2::RequestRec object $r = Apache2::RequestRec->new($c); # tell the client not to cache the response $r->no_cache($boolean); # share perl objects by reference like $r->notes $r->pnotes($key => [$obj1, $obj2]); # get HTML signature $sig = $r->psignature($prefix); # get the global request object (requires PerlOptions +GlobalRequest) $r = Apache2::RequestUtil->request; # insert auth credentials into the request as if the client did that $r->set_basic_credentials($username, $password); # slurp the contents of $r->filename my $content = ${ $r->slurp_filename() }; # terminate the current child after this request $r->child_terminate(); =head1 Description C provides the L utilities API. =head1 API =head2 C Dynamically add Apache configuration at request processing runtime: $r->add_config($lines); $r->add_config($lines, $override); $r->add_config($lines, $override, $path); $r->add_config($lines, $override, $path, $override_opts); Configuration directives are processed as if given in a CLocationE> block. =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$lines> (ARRAY ref) An ARRAY reference containing configuration lines per element, without the new line terminators. =item opt arg2: C<$override> ( C> ) Which allow-override bits are set Default value is: C> =item opt arg3: C<$path> ( string ) Set the C> C component. This is the path of the CLocationE> block. Some directives need this, for example C. If an empty string is passed a C pointer is passed further at C-level. This is necessary to make something like this work: $r->add_config( [ '', 'AllowOverride Options AuthConfig', '', ], ~0, '' ); Note: C is valid only in directory context. B Some directives need a non-empty path otherwise they cause segfaults. Thus, use the empty path with caution. Default value is: C =item opt arg4: C<$override_opts> ( C> ) Apache limits the applicable directives in certain situations with C. With Apache 2.2 comes the possibility to enable or disable single options, for example AllowOverride AuthConfig Options=ExecCGI,Indexes Internally, this directive is parsed into 2 bit fields that are represented by the C<$override> and C<$override_opts> parameters to C. The above example is parsed into an C<$override> with 2 bits set, one for C the other for C and an C<$override_opts> with 2 bits set for ExecCGI and Indexes. When applying other directives, for example C or C the appropriate bits in C<$override> must be set. For the C directive additionally C<$override_opts> bits must be set. The C<$override> and C<$override_opts> parameters to C are valid while applying C<$lines>. C<$override_opts> is new in Apache 2.2. The mod_perl implementation for Apache 2.0 lets you pass the parameter but ignores it. Default for C<$override_opts> is: C> | C> | C> | C> | C> That means, all options are allowed. =item ret: no return value =item since: 2.0.00, C<$path> and C<$override_opts> since 2.0.3 =back See also: Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_add_config_>> For example: use Apache2::RequestUtil (); use Apache2::Access (); $r->add_config(['require valid-user']); # this regards the current AllowOverride setting $r->add_config(['AuthName secret', 'AuthType Basic', 'Options ExecCGI'], $r->allow_override, $path, $r->allow_override_opts); =head2 C Dump the request object as a string $dump = $r->as_string(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$dump> ( string ) =item since: 2.0.00 =back Dumps various request and response headers (mainly useful for debugging) =head2 C Terminate the current worker process as soon as the current request is over $r->child_terminate(); =over 4 =item obj: C<$r> ( C> ) =item ret: no return value =item since: 2.0.00 =back This method is not supported in threaded MPMs =head2 C Retrieve the value of the DefaultType directive for the current request. If not set C is returned. $content_type = $r->default_type(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$content_type> ( string ) The default type =item since: 2.0.00 =item removed from the C API in version 2.3.2 =back =head2 C C<$r-Edir_config()> provides an interface for the per-directory variable specified by the C and C directives, and also can be manipulated via the C> methods. $table = $r->dir_config(); $value = $r->dir_config($key); @values = $r->dir_config->get($key); $r->dir_config($key, $val); =over 4 =item obj: C<$r> ( C> ) =item opt arg2: C<$key> ( string ) Key string =item opt arg3: C<$val> ( string ) Value string =item ret: ... Depends on the passed arguments, see further discussion =item since: 2.0.00 =back The keys are case-insensitive. $apr_table = $r->dir_config(); dir_config() called in a scalar context without the C<$key> argument returns a I reference blessed into the C> class. This object can be manipulated via the C> methods. For available methods see the C> manpage. $value = $r->dir_config($key); If the C<$key> argument is passed in the scalar context only a single value will be returned. Since the table preserves the insertion order, if there is more than one value for the same key, the oldest value assosiated with the desired key is returned. Calling in the scalar context is also much faster, as it'll stop searching the table as soon as the first match happens. @values = $r->dir_config->get($key); To receive a list of values you must use C method from the C> class. $r->dir_config($key => $val); If the C<$key> and the C<$val> arguments are used, the set() operation will happen: all existing values associated with the key C<$key> (and the key itself) will be deleted and C<$value> will be placed instead. $r->dir_config($key => undef); If C<$val> is I the unset() operation will happen: all existing values associated with the key C<$key> (and the key itself) will be deleted. =head2 C Retrieve the document root for this server $docroot = $r->document_root(); $docroot = $r->document_root($new_root); =over 4 =item obj: C<$r> ( C> ) The current request =item opt arg1: C<$new_root> Sets the document root to a new value B. Note the L. =item ret: C<$docroot> ( string ) The document root =item since: 2.0.00 =back =head2 C Returns a reference to a list of handlers enabled for a given phase. $handlers_list = $r->get_handlers($hook_name); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$hook_name> ( string ) a string representing the phase to handle (e.g. C) =item ret: C<$handlers_list> (ref to an ARRAY of CODE refs) a list of handler subroutines CODE references =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_get_handlers_>> For example: A list of handlers configured to run at the response phase: my @handlers = @{ $r->get_handlers('PerlResponseHandler') || [] }; =head2 C Return the limit on bytes in request msg body $limit = $r->get_limit_req_body(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$limit> (integer) the maximum number of bytes in the request msg body =item since: 2.0.00 =back =head2 C Get the current request's server name $server = $r->get_server_name(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$server> ( string ) the server name =item since: 2.0.00 =back For example, consruct a hostport string: use Apache2::RequestUtil (); my $hostport = join ':', $r->get_server_name, $r->get_server_port; =head2 C Get the current server port $port = $r->get_server_port(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$port> ( integer ) The server's port number =item since: 2.0.00 =back For example, consruct a hostport string: use Apache2::RequestUtil (); my $hostport = join ':', $r->get_server_name, $r->get_server_port; =head2 C Return the C for a given status code (excluding the HTTP-Version field). $status_line = Apache2::RequestUtil::get_status_line($status); =over 4 =item arg1: C<$status> (integer) The HTTP status code =item ret: C<$status_line> ( string ) The Status-Line If an invalid or unknown status code is passed, C<"500 Internal Server Error"> will be returned. =item since: 2.0.00 =back For example: use Apache2::RequestUtil (); print Apache2::RequestUtil::get_status_line(400); will print: 400 Bad Request =head2 C Determine whether the current request is the main request or a sub-request $is_initial = $r->is_initial_req(); =over 4 =item obj: C<$r> ( C> ) A request or a sub-request object =item ret: C<$is_initial> ( boolean ) If true -- it's the main request, otherwise it's a sub-request =item since: 2.0.00 =back =head2 C check whether a directory level C flag is enabled or not. $result = $r->is_perl_option_enabled($flag); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$flag> ( string ) =item ret: C<$result> ( boolean ) =item since: 2.0.00 =back For example to check whether the C option is enabled for the current request (which can be disabled with C) and populate the environment variables table if disabled: $r->subprocess_env unless $r->is_perl_option_enabled('SetupEnv'); See also: L and L. =head2 C Get the path of the ELocationE section from which the current C is being called. $location = $r->location(); =over 4 =item obj: C<$r> ( C> ) =item ret: C<$location> ( string ) =item since: 2.0.00 =back =head2 C Merge a given CLocationE> container into the current request object: $ret = $r->location_merge($location); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$location> ( string ) The argument in a CLocationE> section. For example to merge a container: ... that argument will be I =item ret: C<$ret> ( boolean ) a true value if the merge was successful (i.e. the request C<$location> match was found), otherwise false. =item since: 2.0.00 =back Useful for insertion of a configuration section into a custom C object, created via the Cnew()> method. See for example the L. =head2 C Create a new C object. $r = Apache2::RequestRec->new($c); $r = Apache2::RequestRec->new($c, $pool); =over 4 =item obj: C ( C> ) =item arg1: C<$c> (C>) =item opt arg2: C<$pool> If no C<$pool> argument is passed, C<$c-Epool> is used. That means that the created C object will be valid as long as the connection object is valid. =item ret: C<$r> ( C> ) =item since: 2.0.00 =back It's possible to reuse the HTTP framework features outside the familiar HTTP request cycle. It's possible to write your own full or partial HTTP implementation without needing a running Apache server. You will need the C object in order to be able to reuse the rich functionality supplied via this object. See for example the L which reuses HTTP AAA model under non-HTTP protocol. =head2 C Add/remove cache control headers: $prev_no_cache = $r->no_cache($boolean); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$boolean> ( boolean ) A true value sets the C request record member to a true value and inserts: Pragma: no-cache Cache-control: no-cache into the response headers, indicating that the data being returned is volatile and the client should not cache it. A false value unsets the C request record member and the mentioned headers if they were previously set. =item ret: C<$prev_no_cache> ( boolean ) Should you care, the C request record member value prior to the change is returned. =item since: 2.0.00 =back This method should be invoked before any response data has been sent out. =head2 C Share Perl variables between Perl HTTP handlers # to share variables by value and not reference, $val should be a lexical. $old_val = $r->pnotes($key => $val); $val = $r->pnotes($key); $hash_ref = $r->pnotes(); B sharing variables really means it. The variable is not copied. Only its reference count is incremented. If it is changed after being put in pnotes that change also affects the stored value. The following example illustrates the effect: my $v=1; my $v=1; $r->pnotes( 'v'=>$v ); $r->pnotes->{v}=$v; $v++; $v++; my $x=$r->pnotes('v'); my $x=$r->pnotes->{v}; In both cases C<$x> is C<2> not C<1>. See also C on CPAN. There has been a lot of discussion advocating for pnotes sharing variables by value and not reference. Sharing by reference can create 'spooky action at a distance' effects when the sharing is assumed to share a copy of the value. Tim Bunce offers the following summary and suggestion for sharing by value. What's wrong with this code: sub foo { my ($r, $status, $why) = @_; $r->pnotes('foo', ($why) ? "$status:$why" : $status); return; } Nothing, except it doesn't work as expected due to this pnotes bug: If the same code is called in a sub-request then the pnote of $r-Eprev is magically updated at a distance to the same value! Try explain why that is to anyone not deeply familar with perl internals! The fix is to avoid pnotes taking a ref to the invisible op_targ embededed in the code by passing a simple lexical variable as the actual argument. That can be done in-line like this: sub mark_as_internally_redirected { my ($r, $status, $why) = @_; $r->pnotes('foo', my $tmp = (($why) ? "$status:$why" : $status)); return; } =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$key> ( string ) A key value =item opt arg2: C<$val> ( SCALAR ) Any scalar value (e.g. a reference to an array) =item ret: (3 different possible values) if both, C<$key> and C<$val> are passed the previous value for C<$key> is returned if such existed, otherwise C is returned. if only C<$key> is passed, the current value for the given key is returned. if no arguments are passed, a hash reference is returned, which can then be directly accessed without going through the C interface. =item since: 2.0.00 =back This method provides functionality similar to (C>), but values can be any Perl variables. That also means that it can be used only between Perl modules. The values get reset automatically at the end of each HTTP request. Examples: Set a key/value pair: $r->pnotes(foo => [1..5]); Get the value: $val = $r->pnotes("foo"); C<$val> now contains an array ref containing 5 elements (C<1..5>). Now change the existing value: $old_val = $r->pnotes(foo => ['a'..'c']); $val = $r->pnotes("foo"); C<$old_val> now contains an array ref with 5 elements (C<1..5>) and C<$val> contains an array ref with 3 elements C<'a'>, C<'b'>, C<'c'>. Alternatively you can access the hash reference with all pnotes values: $pnotes = $r->pnotes; Now we can read what's in there for the key I: $val = $pnotes->{foo}; and as before C<$val> still gives us an array ref with 3 elements C<'a'>, C<'b'>, C<'c'>. Now we can add elements to it: push @{ $pnotes{foo} }, 'd'..'f'; and we can try to retrieve them using the hash and non-hash API: $val1 = $pnotes{foo}; $val2 = $r->pnotes("foo"); Both C<$val1> and C<$val2> contain an array ref with 6 elements (letters 'a' to 'f'). Finally to reset an entry you could just assign C as a value: $r->pnotes(foo => undef); but the entry for the key I still remains with the value C. If you really want to completely remove it, use the hash interface: delete $r->pnotes->{foo}; =head2 C Get HTML describing the address and (optionally) admin of the server. $sig = $r->psignature($prefix); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$prefix> ( string ) Text which is prepended to the return value =item ret: C<$sig> ( string ) HTML text describing the server. Note that depending on the value of the C directive, the function may return the address, including the admin information or nothing at all. =item since: 2.0.00 =back =head2 C Get/set the ( C> ) object for the current request. $r = Apache2::RequestUtil->request; Apache2::RequestUtil->request($new_r); =over 4 =item obj: C (class name) The Apache class name =item opt arg1: C<$new_r> ( C> ) =item ret: C<$r> ( C> ) =item since: 2.0.00 =back The get-able part of this method is only available if C> is in effect or if Crequest($new_r)> was called earlier. So instead of setting C>, one can set the global request from within the handler. =head2 C Add one or more handlers to a list of handlers to be called for a given phase. $ok = $r->push_handlers($hook_name => \&handler); $ok = $r->push_handlers($hook_name => ['Foo::Bar::handler', \&handler2]); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$hook_name> ( string ) the phase to add the handlers to =item arg2: C<$handlers> ( CODE ref or SUB name or an ARRAY ref ) a single handler CODE reference or just a name of the subroutine (fully qualified unless defined in the current package). if more than one passed, use a reference to an array of CODE refs and/or subroutine names. =item ret: C<$ok> ( boolean ) returns a true value on success, otherwise a false value =item since: 2.0.00 See also: Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_push_handlers_>> Note that to push input/output filters you have to use C> methods: C> and C>. =back Examples: A single handler: $r->push_handlers(PerlResponseHandler => \&handler); Multiple handlers: $r->push_handlers(PerlFixupHandler => ['Foo::Bar::handler', \&handler2]); Anonymous functions: $r->push_handlers(PerlLogHandler => sub { return Apache2::Const::OK }); =head2 C Populate the incoming request headers table (C) with authentication headers for Basic Authorization as if the client has submitted those in first place: $r->set_basic_credentials($username, $password); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$username> ( string ) =item arg2: C<$password> ( string ) =item ret: no return value =item since: 2.0.00 =back See for example the L which reuses HTTP AAA model under non-HTTP protocol. =head2 C Set a list of handlers to be called for a given phase. Any previously set handlers are forgotten. $ok = $r->set_handlers($hook_name => \&handler); $ok = $r->set_handlers($hook_name => ['Foo::Bar::handler', \&handler2]); $ok = $r->set_handlers($hook_name => []); $ok = $r->set_handlers($hook_name => undef); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$hook_name> ( string ) the phase to set the handlers in =item arg2: C<$handlers> (CODE ref or SUB name or an ARRAY ref) a reference to a single handler CODE reference or just a name of the subroutine (fully qualified unless defined in the current package). if more than one passed, use a reference to an array of CODE refs and/or subroutine names. if the argument is C or C<[]> the list of handlers is reset to zero. =item ret: C<$ok> ( boolean ) returns a true value on success, otherwise a false value =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_set_handlers_>> Examples: A single handler: $r->set_handlers(PerlResponseHandler => \&handler); Multiple handlers: $r->set_handlers(PerlFixupHandler => ['Foo::Bar::handler', \&handler2]); Anonymous functions: $r->set_handlers(PerlLogHandler => sub { return Apache2::Const::OK }); Reset any previously set handlers: $r->set_handlers(PerlCleanupHandler => []); or $r->set_handlers(PerlCleanupHandler => undef); =head2 C Slurp the contents of C<$r-Efilename>: $content_ref = $r->slurp_filename($tainted); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$tainted> (number) If the server is run under the tainting mode (C<-T>) which we hope you do, by default the returned data is tainted. If an optional C<$tainted> flag is set to zero, the data will be marked as non-tainted. Do B set this flag to zero unless you know what you are doing, you may create a security hole in your program if you do. For more information see the I manpage. If you wonder why this option is available, it is used internally by the C> handler and friends, because the CGI scripts that it reads are considered safe (you could just as well C them). =item ret: C<$content_ref> ( SCALAR ref ) A reference to a string with the contents =item excpt: C> Possible error codes could be: C> (permission problems), C> (file not found), and others. For checking such error codes, see the documentation for, for example, C> and C>. =item since: 2.0.00 =back Note that if you assign to C<$r-Efilename> you need to L. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Resource.pod0000644000177200010010000000315312540623177017333 0ustar SteveNone=head1 NAME Apache2::Resource - Limit resources used by httpd children =head1 Synopsis PerlModule Apache2::Resource # set child memory limit in megabytes # default is 64 Meg PerlSetEnv PERL_RLIMIT_DATA 32:48 # linux does not honor RLIMIT_DATA # RLIMIT_AS (address space) will work to limit the size of a process PerlSetEnv PERL_RLIMIT_AS 32:48 # set child cpu limit in seconds # default is 360 seconds PerlSetEnv PERL_RLIMIT_CPU 120 PerlChildInitHandler Apache2::Resource =head1 Description C uses the C module, which uses the C function C to set limits on system resources such as memory and cpu usage. Any C operation available to limit on your system can be set by defining that operation as an environment variable with a C prefix. See your system C manpage for available resources which can be limited. The following limit values are in megabytes: C, C, C, C, C, C; all others are treated as their natural unit. If the value of the variable is of the form C, C is treated as the soft limit, and C is the hard limit. If it is just a single number, it is used for both soft and hard limits. =head1 Defaults To set reasonable defaults for all RLIMITs, add this to your httpd.conf: PerlSetEnv PERL_RLIMIT_DEFAULTS On PerlModule Apache2::Resource =head1 See Also BSD::Resource(3), setrlimit(2) =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Author Doug MacEachern =cut mod_perl-2.0.9/docs/api/Apache2/Response.pod0000644000177200010010000002250612540623177017345 0ustar SteveNone=head1 NAME Apache2::Response - Perl API for Apache HTTP request response methods =head1 Synopsis use Apache2::Response (); $r->custom_response(Apache2::Const::FORBIDDEN, "No Entry today"); $etag = $r->make_etag($force_weak); $r->set_etag(); $status = $r->meets_conditions(); $mtime_rat = $r->rationalize_mtime($mtime); $r->set_last_modified($mtime); $r->update_mtime($mtime); $r->send_cgi_header($buffer); $r->set_content_length($length); $ret = $r->set_keepalive(); =head1 Description C provides the L utilities API for dealing with HTTP response generation process. =head1 API C provides the following functions and/or methods: =head2 C Install a custom response handler for a given status $r->custom_response($status, $string); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$status> ( C> ) The status for which the custom response should be used (e.g. C) =item arg2: C<$string> (string) The custom response to use. This can be a static string, or a URL, full or just the uri path (I). =item ret: no return value =item since: 2.0.00 =back C doesn't alter the response code, but is used to replace the standard response body. For example, here is how to change the response body for the access handler failure: package MyApache2::MyShop; use Apache2::Response (); use Apache2::Const -compile => qw(FORBIDDEN OK); sub access { my $r = shift; if (MyApache2::MyShop::tired_squirrels()) { $r->custom_response(Apache2::Const::FORBIDDEN, "It's siesta time, please try later"); return Apache2::Const::FORBIDDEN; } return Apache2::Const::OK; } ... # httpd.conf PerlModule MyApache2::MyShop AuthName dummy AuthType none PerlAccessHandler MyApache2::MyShop::access PerlResponseHandler MyApache2::MyShop::response When squirrels can't run any more, the handler will return 403, with the custom message: It's siesta time, please try later =head2 C Construct an entity tag from the resource information. If it's a real file, build in some of the file characteristics. $etag = $r->make_etag($force_weak); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$force_weak> (number) Force the entity tag to be weak - it could be modified again in as short an interval. =item ret: C<$etag> (string) The entity tag =item since: 2.0.00 =back =head2 C Implements condition C rules for HTTP/1.1 specification. This function inspects the client headers and determines if the response fulfills the specified requirements. $status = $r->meets_conditions(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$status> ( C> ) C if the response fulfills the condition GET rules. Otherwise some other status code (which should be returned to Apache). =item since: 2.0.00 =back Refer to the L document for an indepth discussion of this method. =head2 C Return the latest rational time from a request/mtime pair. $mtime_rat = $r->rationalize_mtime($mtime); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$mtime> ( time in seconds ) The last modified time =item ret: C<$mtime_rat> ( time in seconds ) the latest rational time from a request/mtime pair. Mtime is returned unless it's in the future, in which case we return the current time. =item since: 2.0.00 =back =head2 C Parse the header $r->send_cgi_header($buffer); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$buffer> (string) headers and optionally a response body =item ret: no return value =item since: 2.0.00 =back This method is really for back-compatibility with mod_perl 1.0. It's very inefficient to send headers this way, because of the parsing overhead. If there is a response body following the headers it'll be handled too (as if it was sent via C>). Notice that if only HTTP headers are included they won't be sent until some body is sent (again the "send" part is retained from the mod_perl 1.0 method). =head2 C Set the content length for this request. $r->set_content_length($length); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$length> (integer) The new content length =item ret: no return value =item since: 2.0.00 =back =head2 C Set the E-tag outgoing header $r->set_etag(); =over 4 =item obj: C<$r> ( C> ) =item ret: no return value =item since: 2.0.00 =back =head2 C Set the keepalive status for this request $ret = $r->set_keepalive(); =over 4 =item obj: C<$r> ( C> ) The current request =item ret: C<$ret> ( boolean ) true if keepalive can be set, false otherwise =item since: 2.0.00 =back It's called by C. For the complete complicated logic implemented by this method see F. =head2 C sets the C response header field to the value of the mtime field in the request structure -- rationalized to keep it from being in the future. $r->set_last_modified($mtime); =over 4 =item obj: C<$r> ( C> ) =item opt arg1: C<$mtime> ( time in seconds ) if the C<$mtime> argument is passed, L<$r-Eupdate_mtime|/C_update_mtime_> will be first run with that argument. =item ret: no return value =item since: 2.0.00 =back =head2 C Set the Cmtime|docs::2.0::api::Apache2::RequestRec/C_mtime_>> field to the specified value if it's later than what's already there. $r->update_mtime($mtime); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$mtime> ( time in seconds ) =item ret: no return value =item since: 2.0.00 =back See also: L<$r-Eset_last_modified|/C_set_last_modified_>. =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C Send an "error" response back to client. It is used for any response that can be generated by the server from the request record. This includes all 204 (no content), 3xx (redirect), 4xx (client error), and 5xx (server error) messages that have not been redirected to another handler via the ErrorDocument feature. $r->send_error_response($recursive_error); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$recursive_error> ( boolean ) the error status in case we get an error in the process of trying to deal with an C to handle some other error. In that case, we print the default report for the first thing that went wrong, and more briefly report on the problem with the C. =item ret: no return value =item since: 2.0.00 =back META: it's really an internal Apache method, I'm not quite sure how can it be used externally. =head2 C META: Autogenerated - needs to be reviewed/completed Send an MMAP'ed file to the client $ret = $r->send_mmap($mm, $offset, $length); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$mm> (C>) The MMAP'ed file to send =item arg2: C<$offset> (number) The offset into the MMAP to start sending =item arg3: C<$length> (integer) The amount of data to send =item ret: C<$ret> (integer) The number of bytes sent =item since: 2.0.00 =back META: requires a working APR::Mmap, which is not supported at the moment. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/ServerRec.pod0000644000177200010010000003767712540623177017466 0ustar SteveNone=head1 NAME Apache2::ServerRec - Perl API for Apache server record accessors =head1 Synopsis use Apache2::ServerRec (); $error_fname = $s->error_fname(); $is_virtual = $s->is_virtual(); $keep_alive = $s->keep_alive(); $keep_alive_max = $s->keep_alive_max(); $keep_alive_timeout = $s->keep_alive_timeout(); $limit_req_fields = $s->limit_req_fields(); $limit_req_fieldsize = $s->limit_req_fieldsize(); $limit_req_line = $s->limit_req_line(); $path = $s->path(); $hostname = $s->server_hostname(); $port = $s->port(); $server_admin = $s->server_admin(); $proc = $s->process(); $timeout = $s->timeout(); $loglevel = $s->loglevel(); my $server = Apache2::ServerUtil->server; my $vhosts = 0; for (my $s = $server->next; $s; $s = $s->next) { $vhosts++; } print "There are $vhosts virtual hosts"; =head1 Description C provides the Perl API for Apache server_rec object. C> provides an extra functionality. =head1 API C provides the following functions and/or methods: =head2 C Get/set the C file value (e.g. F) $error_fname = $s->error_fname(); $prev_error_fname = $s->error_fname($new_error_fname); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_error_fname> ( string ) If passed, sets the new value for C Note the L. =item ret: C<$error_fname> ( string ) Returns the C value setting. If C<$new_error_fname> is passed returns the setting before the change. =item since: 2.0.00 =back =head2 C Test whether C<$s> is a virtual host object $is_virtual = $s->is_virtual(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$is_virtual> ( boolean ) Returns the is_virtual setting. If C<$new_is_virtual> is passed, returns the setting before the change. =item since: 2.0.00 =back Example: print "This is a virtual host" if $s->is_virtual(); =head2 C Get/set the C setting, which specifies whether Apache should accept more than one request over the same connection from the same client. $keep_alive = $s->keep_alive(); $prev_keep_alive = $s->keep_alive($new_keep_alive); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_keep_alive> ( boolean ) If passed, sets the new keep_alive. Note the L. =item ret: C<$keep_alive> ( boolean ) Returns the C setting. If C<$new_keep_alive> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the C setting, which specifies the maximum number of requests Apache will serve over a C connection. $keep_alive_max = $s->keep_alive_max(); $prev_keep_alive_max = $s->keep_alive_max($new_keep_alive_max); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_keep_alive_max> ( integer ) If passed, sets the new keep_alive_max. Note the L. =item ret: C<$keep_alive_max> ( integer ) Returns the keep_alive_max setting. If C<$new_keep_alive_max> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the C setting (in microsecs), which specifies how long Apache will wait for another request before breaking a C connection. $keep_alive_timeout = $s->keep_alive_timeout(); $prev_keep_alive_timeout = $s->keep_alive_timeout($new_timeout); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_keep_alive_timeout> ( integer ) The expected value is in microsecs. If passed, sets the new C timeout. Note the L. =item ret: C<$keep_alive_timeout> ( integer ) Returns the C timeout value (in microsecs). If C<$new_timeout> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set limit on number of request header fields $limit_req_fields = $s->limit_req_fields(); $prev_limit_req_fields = $s->limit_req_fields($new_limit_req_fields); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_limit_req_fields> ( integer ) If passed, sets the new request headers number limit. Note the L. =item ret: C<$limit_req_fields> ( integer ) Returns the request headers number limit. If C<$new_limit_req_fields> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set limit on size of any request header field $limit_req_fieldsize = $s->limit_req_fieldsize(); $prev_limit = $s->limit_req_fieldsize($new_limit); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_limit_req_fieldsize> ( integer ) If passed, sets the new request header size limit. Note the L. =item ret: C<$limit_req_fieldsize> ( integer ) Returns the request header size limit. If C<$new_limit> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set limit on size of the HTTP request line $limit_req_line = $s->limit_req_line(); $prev_limit_req_line = $s->limit_req_line($new_limit_req_line); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_limit_req_line> ( integer ) If passed, sets the new request line limit value. Note the L. =item ret: C<$limit_req_line> ( integer ) Returns the request line limit value If C<$new_limit_req_line> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the C directive value $loglevel = $s->loglevel(); $prev_loglevel = $s->loglevel($new_loglevel); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_loglevel> ( C> ) If passed, sets a new C value Note the L. =item ret: C<$loglevel> ( C> ) Returns the C value as a constant. If C<$new_loglevel> is passed, returns the setting before the change. =item since: 2.0.00 =back For example, to set the C value to C: use Apache2::Const -compile => qw(LOG_INFO); $s->loglevel(Apache2::Const::LOG_INFO); =head2 C The next server record in the list (if there are vhosts) $s_next = $s->next(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$s_next> ( C> ) =item since: 2.0.00 =back For example the following code traverses all the servers, starting from the base server and continuing to vhost servers, counting all available vhosts: use Apache2::ServerRec (); use Apache2::ServerUtil (); my $server = Apache2::ServerUtil->server; my $vhosts = 0; for (my $s = $server->next; $s; $s = $s->next) { $vhosts++; } print "There are $vhosts virtual hosts"; =head2 C Get/set pathname for the C setting $path = $s->path(); $prev_path = $s->path($new_path); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_path> ( string ) If passed, sets the new path. Note the L. =item ret: C<$path> ( string ) Returns the path setting. If C<$new_path> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the port value $port = $s->port(); $prev_port = $s->port($new_port); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_port> ( integer ) If passed, sets the new port. Note the L. META: I don't think one should be allowed to change port number after the server has started. =item ret: C<$port> ( integer ) Returns the port setting. If C<$new_port> is passed returns the setting before the change. =item since: 2.0.00 =back =head2 C The process this server is running in $proc = $s->process(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$proc> ( C> ) =item since: 2.0.00 =back =head2 C Get/set the C value $server_admin = $s->server_admin(); $prev_server_admin = $s->server_admin($new_server_admin); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_server_admin> ( string ) If passed, sets the new C value. Note the L. =item ret: C<$server_admin> ( string ) Returns the C value. If C<$new_server_admin> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the C value $server_hostname = $s->server_hostname(); $prev_server_hostname = $s->server_hostname($new_server_hostname); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_server_hostname> ( string ) If passed, sets the C value Note the L. =item ret: C<$server_hostname> ( string ) Returns the C value If C<$new_server_hostname> is passed, returns the setting before the change. =item since: 2.0.00 =back =head2 C Get/set the timeout (C) (in microsecs), which Apache will wait for before it gives up doing something $timeout = $s->timeout(); $prev_timeout = $s->timeout($new_timeout); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_timeout> ( integer ) If passed, sets the new timeout (the value should be in microseconds). Note the L. =item ret: C<$timeout> ( integer ) Returns the timeout setting in microseconds. If C<$new_timeout> is passed, returns the setting before the change. =item since: 2.0.00 =back Let us repeat again: the timeout values is microseconds. For example to set the timeout to 20 secs: $s->timeout(20_000_000); =head1 Notes =head2 Limited Functionality under Threaded MPMs Note that under threaded MPMs, some of the read/write accessors, will be able to set values only before threads are spawned (i.e. before the C>). Therefore if you are developing your application on the non-threaded MPM, but planning to have it run under threaded mpm, you should not use those methods to set values after the ChildInit phase. The affected accessor methods are marked as such in their respective documentation entries. =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C Get the addrs value $addrs = $s->addrs(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$addrs> ( C> ) Returns the addrs setting. =item since: subject to change =back META: this methods returns a vhost-specific Apache2::ServerAddr object, which is not implemented at the moment. See the struct server_addr_rec entry in httpd-2.0/include/httpd.h for more information. It seems that most (all?) of the information in that record is available through other APIs. =head2 C Get the lookup_defaults value. MIME type info, etc., before we start checking per-directory info. $lookup_defaults = $s->lookup_defaults(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$lookup_defaults> ( C> ) Returns the lookup_defaults setting. =item since: subject to change =back =head2 C Get config vector containing pointers to modules' per-server config structures. $module_config = $s->module_config(); =over 4 =item obj: C<$s> ( C> ) =item ret: C<$module_config> ( C> ) Returns the module_config setting. =item since: subject to change =back =head2 C Get/set the value(s) for the C setting $names = $s->names(); $prev_names = $s->names($new_names); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_names> ( C> ) If passed, sets the new names. Note the L. =item ret: C<$names> ( C> ) Returns the names setting. If C<$new_names> is passed, returns the setting before the change. =item since: 2.0.00 =back META: we don't have C yet =head2 C Wildcarded names for ServerAlias servers $wild_names = $s->wild_names(); $prev_wild_names = $s->wild_names($new_wild_names); =over 4 =item obj: C<$s> ( C> ) =item opt arg1: C<$new_wild_names> ( C> ) If passed, sets the new wild_names. Note the L. =item ret: C<$wild_names> ( C> ) Returns the wild_names setting. If C<$new_wild_names> is passed, returns the setting before the change. =item since: 2.0.00 =back META: we don't have C yet =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/ServerUtil.pod0000644000104000010010000005244612540623177021562 0ustar AdministratorsNone=head1 NAME Apache2::ServerUtil - Perl API for Apache server record utils =head1 Synopsis use Apache2::ServerUtil (); $s = Apache2::ServerUtil->server; # push config $s->add_config(['ServerTokens off']); # add components to the Server signature $s->add_version_component("MyModule/1.234"); # access PerlSetVar/PerlAddVar values my $srv_cfg = $s->dir_config; # check command line defines print "this is mp2" if Apache2::ServerUtil::exists_config_define('MODPERL2'); # get PerlChildExitHandler configured handlers @handlers = @{ $s->get_handlers('PerlChildExitHandler') || []}; # server build and version info: $when_built = Apache2::ServerUtil::get_server_built(); $description = Apache2::ServerUtil::get_server_description(); $version = Apache2::ServerUtil::get_server_version(); $banner = Apache2::ServerUtil::get_server_banner(); # ServerRoot value $server_root = Apache2::ServerUtil::server_root(); # get 'conf/' dir path (avoid using this function!) my $dir = Apache2::ServerUtil::server_root_relative($r->pool, 'conf'); # set child_exit handlers $r->set_handlers(PerlChildExitHandler => \&handler); # server level PerlOptions flags lookup $s->push_handlers(ChildExit => \&child_exit) if $s->is_perl_option_enabled('ChildExit'); # extend HTTP to support a new method $s->method_register('NEWGET'); # register server shutdown callback Apache2::ServerUtil::server_shutdown_register_cleanup(sub { Apache2::Const::OK }); # do something only when the server restarts my $cnt = Apache2::ServerUtil::restart_count(); do_something_once() if $cnt > 1; # get the resolved ids from Group and User entries my $user_id = Apache2::ServerUtil->user_id; my $group_id = Apache2::ServerUtil->group_id; =head1 Description C provides the L utilities API. =head1 Methods API C provides the following functions and/or methods: =head2 C Dynamically add Apache configuration: $s->add_config($lines); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$lines> ( ARRAY ref ) An ARRAY reference containing configuration lines per element, without the new line terminators. =item ret: no return value =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_add_config_>> For example: Add a configuration section at the server startup (e.g. from I): use Apache2::ServerUtil (); my $conf = <<'EOC'; PerlModule Apache2::MyExample SetHandler perl-script PerlResponseHandler Apache2::MyExample EOC Apache2::ServerUtil->server->add_config([split /\n/, $conf]); =head2 C Add a component to the version string $s->add_version_component($component); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$component> ( string ) The string component to add =item ret: no return value =item since: 2.0.00 =back This function is usually used by modules to advertise themselves to the world. It's picked up by such statistics collectors, like netcraft.com, which accomplish that by connecting to various servers and grabbing the server version response header (C). Some servers choose to fully or partially conceal that header. This method should be invoked in the C> phase, which will ensure that the Apache core version number will appear first. For example let's add a component I<"Hikers, Inc/0.99999"> to the server string at the server startup: use Apache2::ServerUtil (); use Apache2::Const -compile => 'OK'; Apache2::ServerUtil->server->push_handlers( PerlPostConfigHandler => \&add_my_version); sub add_my_version { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; $s->add_version_component("Hikers, Inc/0.99999"); return Apache2::Const::OK; } or of course you could register the C> handler directly in F Now when the server starts, you will something like: [Thu Jul 15 12:15:28 2004] [notice] Apache/2.0.51-dev (Unix) mod_perl/1.99_15-dev Perl/v5.8.5 Hikers, Inc/0.99999 configured -- resuming normal operations Also remember that the C directive value controls whether the component information is displayed or not. =head2 C C<$s-Edir_config()> provides an interface for the per-server variables specified by the C and C directives, and also can be manipulated via the C> methods. $table = $s->dir_config(); $value = $s->dir_config($key); @values = $s->dir_config->get($key); $s->dir_config($key, $val); =over 4 =item obj: C<$s> ( C> ) =item opt arg2: C<$key> ( string ) Key string =item opt arg3: C<$val> ( string ) Value string =item ret: ... Depends on the passed arguments, see further discussion =item since: 2.0.00 =back The keys are case-insensitive. $t = $s->dir_config(); dir_config() called in a scalar context without the C<$key> argument returns a I reference blessed into the I class. This object can be manipulated via the I methods. For available methods see I. @values = $s->dir_config->get($key); To receive a list of values you must use C method from the C> class. $value = $s->dir_config($key); If the C<$key> argument is passed in the scalar context only a single value will be returned. Since the table preserves the insertion order, if there is more than one value for the same key, the oldest value assosiated with the desired key is returned. Calling in the scalar context is also much faster, as it'll stop searching the table as soon as the first match happens. $s->dir_config($key => $val); If the C<$key> and the C<$val> arguments are used, the set() operation will happen: all existing values associated with the key C<$key> (and the key itself) will be deleted and C<$value> will be placed instead. $s->dir_config($key => undef); If C<$val> is I the unset() operation will happen: all existing values associated with the key C<$key> (and the key itself) will be deleted. =head2 C Check for a definition from the server startup command line (e.g. C<-DMODPERL2>) $result = Apache2::ServerUtil::exists_config_define($name); =over 4 =item arg1: C<$name> ( string ) The define string to check for =item ret: C<$result> ( boolean ) true if defined, false otherwise =item since: 2.0.00 =back For example: print "this is mp2" if Apache2::ServerUtil::exists_config_define('MODPERL2'); =head2 C Returns a reference to a list of handlers enabled for a given phase. $handlers_list = $s->get_handlers($hook_name); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$hook_name> ( string ) a string representing the phase to handle. =item ret: C<$handlers_list> (ref to an ARRAY of CODE refs) a list of references to the handler subroutines =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_get_handlers_>> For example: A list of handlers configured to run at the I phase: @handlers = @{ $s->get_handlers('PerlChildExitHandler') || []}; =head2 C Get the date and time that the server was built $when_built = Apache2::ServerUtil::get_server_built(); =over 4 =item ret: C<$when_built> ( string ) The server build time string =item since: 2.0.00 =back =head2 C Get the server version string $version = Apache2::ServerUtil::get_server_version(); =over 4 =item ret: C<$version> ( string ) The server version string =item since: 2.0.00 =back =head2 C Get the server banner $banner = Apache2::ServerUtil::get_server_banner(); =over 4 =item ret: C<$banner> ( string ) The server banner =item since: 2.0.4 =back =head2 C Get the server description $description = Apache2::ServerUtil::get_server_description(); =over 4 =item ret: C<$description> ( string ) The server description =item since: 2.0.4 =back =head2 C Get the group id corresponding to the C directive in F: $gid = Apache2::ServerUtil->group_id; =over 4 =item obj: C (class name) =item ret: C<$gid> ( integer ) On Unix platforms returns the gid corresponding to the value used in the C directive in F. On other platforms returns 0. =item since: 2.0.03 =back =head2 C check whether a server level C flag is enabled or not. $result = $s->is_perl_option_enabled($flag); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$flag> ( string ) =item ret: C<$result> ( boolean ) =item since: 2.0.00 =back For example to check whether the C hook is enabled (which can be disabled with C) and configure some handlers to run if enabled: $s->push_handlers(ChildExit => \&child_exit) if $s->is_perl_option_enabled('ChildExit'); See also: L and L. =head2 C Register a new request method, and return the offset that will be associated with that method. $offset = $s->method_register($methname); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$methname> ( string ) The name of the new method to register (in addition to the already supported C, C, etc.) =item ret: C<$offset> ( integer ) An int value representing an offset into a bitmask. You can probably ignore it. =item since: 2.0.00 =back This method allows you to extend the HTTP protocol to support new methods, which fit the HTTP paradigm. Of course you will need to write a client that understands that protocol extension. For a good example, refer to the C example presented in C>, which demonstrates how a new method C is registered and used. =head2 C Add one or more handlers to a list of handlers to be called for a given phase. $ok = $s->push_handlers($hook_name => \&handler); $ok = $s->push_handlers($hook_name => [\&handler, \&handler2]); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$hook_name> ( string ) the phase to add the handlers to =item arg2: C<$handlers> ( CODE ref or SUB name or an ARRAY ref ) a single handler CODE reference or just a name of the subroutine (fully qualified unless defined in the current package). if more than one passed, use a reference to an array of CODE refs and/or subroutine names. =item ret: C<$ok> ( boolean ) returns a true value on success, otherwise a false value =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_push_handlers_>> Examples: A single handler: $s->push_handlers(PerlChildExitHandler => \&handler); Multiple handlers: $s->push_handlers(PerlChildExitHandler => ['Foo::Bar::handler', \&handler2]); Anonymous functions: $s->push_handlers(PerlLogHandler => sub { return Apache2::Const::OK }); =head2 C How many times the server was restarted. $restart_count = Apache2::ServerUtil::restart_count(); =over 4 =item ret: C ( number ) =item since: 2.0.00 =back The following demonstration should make it clear what values to expect from this function. Let's add the following code to F, so it's run every time F is parsed: use Apache2::ServerUtil (); my $cnt = Apache2::ServerUtil::restart_count(); open my $fh, ">>/tmp/out" or die "$!"; print $fh "cnt: $cnt\n"; close $fh; Now let's run a series of server starts and restarts and look at what is logged into F: % httpd -k start cnt: 1 cnt: 2 % httpd -k graceful cnt: 1 cnt: 3 % httpd -k graceful cnt: 1 cnt: 4 % httpd -k stop cnt: 1 Remembering that L, we can see that the C goes from 1 to 2 during the server start. Moreover we can see that every operation forces the parsing of F and therefore reinitialization of mod_perl (and running all the code found in F). This happens even when the server is shutdown via C. What conclusions can be drawn from this demonstration: =over =item * C returns 1 every time some C<-k> command is passed to Apache (or C or some alternative signal is received). =item * At all other times the count will be 2 or higher. So for example on graceful restart the count will be 3 or higher. =back For example if you want to run something every time C is run you just need to check whether C returns 1: my $cnt = Apache2::ServerUtil::restart_count(); do_something() if $cnt == 1; To do something only when server restarts (C or C, check whether C is bigger than 1: my $cnt = Apache2::ServerUtil::restart_count(); do_something() if $cnt > 1; =head2 C Get the main server's object $main_s = Apache2::ServerUtil->server(); =over 4 =item obj: C (class name) =item ret: C<$main_s> ( C> ) =item since: 2.0.00 =back =head2 C returns the value set by the top-level C directive. $server_root = Apache2::ServerUtil::server_root(); =over 4 =item ret: C<$server_root> ( string ) =item since: 2.0.00 =back =head2 C Returns the canonical form of the filename made absolute to C: $path = Apache2::ServerUtil::server_root_relative($pool, $fname); =over 4 =item arg1: C<$pool> ( C> ) Make sure that you read the following explanation and understand well which pool object you need to pass before using this function. =item opt arg2: C<$fname> ( string ) =item ret: C<$path> ( string ) The concatenation of C and the C<$fname>. If C<$fname> is not specified, the value of C is returned with a trailing C. (it's the same as using C<''> as C<$fname>'s value). =item since: 2.0.00 =back C<$fname> is appended to the value of C and returned. For example: my $dir = Apache2::ServerUtil::server_root_relative($r->pool, 'logs'); You must be extra-careful when using this function. If you aren't sure what you are doing don't use it. It's much safer to build the path by yourself using use C>, For example: use File::Spec::Functions qw(catfile); my $path = catfile Apache2::ServerUtil::server_root, qw(t logs); In this example, no memory allocation happens on the Apache-side and you aren't risking to get a memory leak. The problem with C is that Apache allocates memory to concatenate the path string. The memory is allocated from the pool object. If you call this method on the server pool object it'll allocate the memory from it. If you do that at the server startup, it's perfectly right, since you will do that only once. However if you do that from within a request or a connection handler, you create a memory leak every time it is called -- as the memory gets allocated from the server pool, it will be freed only when the server is shutdown. Therefore if you need to build a relative to the root server path for the duration of the request, use the request pool: use Apache2::RequestRec (); Apache2::ServerUtil::server_root_relative($r->pool, $fname); If you need to have the path for the duration of a connection (e.g. inside a protocol handler), you should use: use Apache2::Connection (); Apache2::ServerUtil::server_root_relative($c->pool, $fname); And if you want it for the scope of the server file: use Apache2::Process (); use Apache2::ServerUtil (); Apache2::ServerUtil::server_root_relative($s->process->pool, $fname); Moreover, you could have encountered the opposite problem, where you have used a short-lived pool object to construct the path, but tried to use the resulting path variable, when that pool has been destructed already. In order to avoid mysterious segmentation faults, mod_perl does a wasteful copy of the path string when returning it to you -- another reason to avoid using this function. =head2 C Register server shutdown cleanup callback: Apache2::ServerUtil::server_shutdown_cleanup_register($sub); =over 4 =item arg1: C<$sub> ( CODE ref or SUB name ) =item ret: no return value =item since: 2.0.00 =back This function can be used to register a callback to be run once at the server shutdown (compared to C> which will execute the callback for each exiting child process). For example in order to arrange the function C to be run every time the server shuts down (or restarts), run the following code at the server startup: Apache2::ServerUtil::server_shutdown_cleanup_register(\&do_my_cleanups); It's necessary to run this code at the server startup (normally F). The function will croak if run after the C> phase. Values returned from cleanup functions are ignored. If a cleanup dies the exception is stringified and passed to C. Usually, this results in printing it to the F. =head2 C Set a list of handlers to be called for a given phase. Any previously set handlers are forgotten. $ok = $s->set_handlers($hook_name => \&handler); $ok = $s->set_handlers($hook_name => [\&handler, \&handler2]); $ok = $s->set_handlers($hook_name => []); $ok = $s->set_handlers($hook_name => undef); =over 4 =item obj: C<$s> ( C> ) =item arg1: C<$hook_name> ( string ) the phase to set the handlers in =item arg2: C<$handlers> ( CODE ref or SUB name or an ARRAY ref ) a reference to a single handler CODE reference or just a name of the subroutine (fully qualified unless defined in the current package). if more than one passed, use a reference to an array of CODE refs and/or subroutine names. if the argument is C or C<[]> the list of handlers is reset to zero. =item ret: C<$ok> ( boolean ) returns a true value on success, otherwise a false value =item since: 2.0.00 =back See also: Cadd_config|docs::2.0::api::Apache2::RequestUtil/C_set_handlers_>> Examples: A single handler: $r->set_handlers(PerlChildExitHandler => \&handler); Multiple handlers: $r->set_handlers(PerlFixupHandler => ['Foo::Bar::handler', \&handler2]); Anonymous functions: $r->set_handlers(PerlLogHandler => sub { return Apache2::Const::OK }); Reset any previously set handlers: $r->set_handlers(PerlCleanupHandler => []); or $r->set_handlers(PerlCleanupHandler => undef); =head2 C Get the user id corresponding to the C directive in F: $uid = Apache2::ServerUtil->user_id; =over 4 =item obj: C (class name) =item ret: C<$uid> ( integer ) On Unix platforms returns the uid corresponding to the value used in the C directive in F. On other platforms returns 0. =item since: 2.0.03 =back =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C Start sending STDERR to the error_log file $s->error_log2stderr(); =over 4 =item obj: C<$s> ( C> ) The current server =item ret: no return value =item since: 2.0.00 =back This method may prove useful if you want to start redirecting STDERR to the error_log file before Apache does that on the startup. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/SizeLimit.pod0000644000177200010010000002350512540623177017460 0ustar SteveNone=head1 NAME Apache2::SizeLimit - Because size does matter. =head1 Synopsis This module allows you to kill off Apache httpd processes if they grow too large. You can choose to set up the process size limiter to check the process size on every request: # in your startup.pl, or a section: use Apache2::SizeLimit; # sizes are in KB $Apache2::SizeLimit::MAX_PROCESS_SIZE = 12000; # 12MB $Apache2::SizeLimit::MIN_SHARE_SIZE = 6000; # 6MB $Apache2::SizeLimit::MAX_UNSHARED_SIZE = 5000; # 5MB # in your httpd.conf: PerlCleanupHandler Apache2::SizeLimit Or you can just check those requests that are likely to get big, such as CGI requests. This way of checking is also easier for those who are mostly just running CGI scripts under C>: # in your script: use Apache2::SizeLimit; # sizes are in KB Apache2::SizeLimit::setmax(12000); Apache2::SizeLimit::setmin(6000); Apache2::SizeLimit::setmax_unshared(5000); This will work in places where you are using C> or anywhere you enable C>. If you want to avoid turning on C, you can pass an C> object as the second argument in these subs: my $r = shift; # if you don't have $r already Apache2::SizeLimit::setmax(12000, $r); Apache2::SizeLimit::setmin(6000, $r); Apache2::SizeLimit::setmax_unshared(5000, $r); Since checking the process size can take a few system calls on some platforms (e.g. linux), you may want to only check the process size every N times. To do so, put this in your startup.pl or CGI: $Apache2::SizeLimit::CHECK_EVERY_N_REQUESTS = 2; This will only check the process size every other time the process size checker is called. =head1 Description This module is highly platform dependent, please read the L section. It also does not work L. This module was written in response to questions on the mod_perl mailing list on how to tell the httpd process to exit if it gets too big. Actually there are two big reasons your httpd children will grow. First, it could have a bug that causes the process to increase in size dramatically, until your system starts swapping. Second, it may just do things that requires a lot of memory, and the more different kinds of requests your server handles, the larger the httpd processes grow over time. This module will not really help you with the first problem. For that you should probably look into C> or some other means of setting a limit on the data size of your program. BSD-ish systems have C which will croak your memory gobbling processes. However it is a little violent, terminating your process in mid-request. This module attempts to solve the second situation where your process slowly grows over time. The idea is to check the memory usage after every request, and if it exceeds a threshold, exit gracefully. By using this module, you should be able to discontinue using the Apache configuration directive C, although you can use both if you are feeling paranoid. Most users use the technique shown in this module and set their C value to C<0>. =head1 Shared Memory Options In addition to simply checking the total size of a process, this module can factor in how much of the memory used by the process is actually being shared by copy-on-write. If you don't understand how memory is shared in this way, take a look at the extensive documentation at http://perl.apache.org/docs/. You can take advantage of the shared memory information by setting a minimum shared size and/or a maximum unshared size. Experience on one heavily trafficked mod_perl site showed that setting maximum unshared size and leaving the others unset is the most effective policy. This is because it only kills off processes that are truly using too much physical RAM, allowing most processes to live longer and reducing the process churn rate. =head1 Caveats This module is platform-dependent, since finding the size of a process is pretty different from OS to OS, and some platforms may not be supported. In particular, the limits on minimum shared memory and maximum shared memory are currently only supported on Linux and BSD. If you can contribute support for another OS, please do. =head2 Supported OSes =over 4 =item linux For linux we read the process size out of F. This seems to be fast enough on modern systems. If you are worried about performance, try setting the C option. Since linux 2.6 F does not report the amount of memory shared by the copy-on-write mechanism as shared memory. Hence decisions made on the basis of C or C are inherently wrong. To correct the situation there is a patch to the linux kernel that adds a F entry for each process. At the time of this writing the patch is included in the mm-tree (linux-2.6.13-rc4-mm1) and is expected to make it into the vanilla kernel in the near future. F reports various sizes for each memory segment of a process and allows to count the amount of shared memory correctly. If C detects a kernel that supports F and if the C module is installed it will use them instead of F. You can prevent C from using F and turn on the old behaviour by setting C<$Apache2::SizeLimit::USE_SMAPS> to 0 before the first check. C also resets C<$Apache2::SizeLimit::USE_SMAPS> to 0 if it somehow decides not to use F. Thus, you can check it to determine what is actually used. NOTE: Reading F is expensive compared to F. It must look at each page table entry of a process. Further, on multiprocessor systems the access is synchronized with spinlocks. Hence, you are encouraged to set the C option. The following example shows the effect of copy-on-write: require Apache2::SizeLimit; package X; use strict; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile=>qw(OK); my $x= "a" x (1024*1024); sub handler { my $r = shift; my ($size, $shared) = $Apache2::SizeLimit::HOW_BIG_IS_IT->(); $x =~ tr/a/b/; my ($size2, $shared2) = $Apache2::SizeLimit::HOW_BIG_IS_IT->(); $r->content_type('text/plain'); $r->print("1: size=$size shared=$shared\n"); $r->print("2: size=$size2 shared=$shared2\n"); return Apache2::Const::OK; } SetHandler modperl PerlResponseHandler X The parent apache allocates a megabyte for the string in C<$x>. The C-command then overwrites all "a" with "b" if the handler is called with an argument. This write is done in place, thus, the process size doesn't change. Only C<$x> is not shared anymore by means of copy-on-write between the parent and the child. If F is available curl shows: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13452 shared=7456 2: size=13452 shared=6432 Shared memory has lost 1024 kB. The process' overall size remains unchanged. Without F it says: r2@s93:~/work/mp2> curl http://localhost:8181/X 1: size=13052 shared=3628 2: size=13052 shared=3636 One can see the kernel lies about the shared memory. It simply doesn't count copy-on-write pages as shared. =item Solaris 2.6 and above For Solaris we simply retrieve the size of F, which contains the address-space image of the process, and convert to KB. Shared memory calculations are not supported. NOTE: This is only known to work for solaris 2.6 and above. Evidently the /proc filesystem has changed between 2.5.1 and 2.6. Can anyone confirm or deny? =item BSD Uses C to determine process size. This is pretty efficient (a lot more efficient than reading it from the I fs anyway). =item AIX? Uses C to determine process size. Not sure if the shared memory calculations will work or not. AIX users? =item Win32 Under mod_perl 1, SizeLimit provided basic functionality by using C to access process memory information. This worked because there was only one mod_perl thread. With mod_perl 2, Win32 runs a true threaded MPM, which unfortunately means that we can't tell the size of each interpreter. Win32 support is disabled until a solution for this can be found. =back If your platform is not supported, and if you can tell us how to check for the size of a process under your OS (in KB), then we will add it to the list. The more portable/efficient the solution, the better, of course. =head2 Supported MPMs At this time, C does not support use under threaded MPMs. This is because there is no efficient way to get the memory usage of a thread, or make a thread exit cleanly. Suggestions and patches are welcome on L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Author Doug Bagley Edoug+modperl bagley.orgE, channeling Procrustes. Brian Moseley Eix maz.orgE: Solaris 2.6 support Doug Steinwand and Perrin Harkins Eperrin elem.comE: added support for shared memory and additional diagnostic info Matt Phillips Emphillips virage.comE and Mohamed Hendawi Emhendawi virage.comE: Win32 support Torsten Foertsch Etorsten.foertsch gmx.netE: Linux::Smaps support =cut mod_perl-2.0.9/docs/api/Apache2/Status.pod0000644000177200010010000001301412540623177017024 0ustar SteveNone=head1 NAME Apache2::Status - Embedded interpreter status information =head1 Synopsis # disallow public access Order Deny, Allow Deny from all Allow from 127.0.0.1 SetHandler modperl PerlOptions +GlobalRequest PerlResponseHandler Apache2::Status or # disallow public access Order Deny, Allow Deny from all Allow from 127.0.0.1 SetHandler perl-script PerlResponseHandler Apache2::Status =head1 Description The C module provides some information about the status of the Perl interpreter embedded in the server. Configure like so: # disallow public access Order Deny, Allow Deny from all Allow from 127.0.0.1 SetHandler modperl PerlOptions +GlobalRequest PerlResponseHandler Apache2::Status Notice that under the C> core handler the I menu option will show only the environment under that handler. To see the environment seen by handlers running under the C> core handler, configure C as: # disallow public access Order Deny, Allow Deny from all Allow from 127.0.0.1 SetHandler perl-script PerlResponseHandler Apache2::Status Other modules can "plugin" a menu item like so: require Apache2::Module; Apache2::Status->menu_item( 'DBI' => "DBI connections", #item for Apache::DBI module sub { my ($r, $q) = @_; #request and CGI objects my (@strings); push @strings, "blobs of html"; return \@strings; #return an array ref } ) if Apache2::Module::loaded('Apache2::Status'); B: C must be loaded before these modules via the C or C directives (or from F). A very common setup might be: Perl Module B::TerseSize SetHandler perl-script PerlResponseHandler Apache2::Status PerlSetVar StatusOptionsAll On PerlSetVar StatusDeparseOptions "-p -sC" due to the implementation of Apache2::Status::noh_fileline in B::TerseSize, you must load B::TerseSize first. =head1 Options =head2 C This single directive will enable all of the options described below. PerlSetVar StatusOptionsAll On =head2 C When browsing symbol tables, the values of arrays, hashes and scalars can be viewed via C if this configuration variable is set to C: PerlSetVar StatusDumper On =head2 C With this option C and the C module installed, functions and variables can be viewed ala C style: PerlSetVar StatusPeek On =head2 C With this option C and the C module installed, subroutine lexical variable information can be viewed. PerlSetVar StatusLexInfo On =head2 C With this option C subroutines can be "deparsed". PerlSetVar StatusDeparse On Options can be passed to C like so: PerlSetVar StatusDeparseOptions "-p -sC" See the C manpage for details. =head2 C With this option C, text-based op tree graphs of subroutines can be displayed, thanks to C. PerlSetVar StatusTerse On =head2 C With this option C and the C module installed, text-based op tree graphs of subroutines and their size can be displayed. See the C docs for more info. PerlSetVar StatusTerseSize On =head2 C With this option C and the C module installed, a I<"Memory Usage"> will be added to the C main menu. This option is disabled by default, as it can be rather cpu intensive to summarize memory usage for the entire server. It is strongly suggested that this option only be used with a development server running in C<-X> mode, as the results will be cached. PerlSetVar StatusTerseSizeMainSummary On =head2 C When C is enabled, another link I<"OP Tree Graph"> will be present with the dump if this configuration variable is set to C: PerlSetVar StatusGraph This requires the B module (part of the Perl compiler kit) and C (version 0.03 or higher) module to be installed along with the C program. Dot is part of the graph visualization toolkit from AT&T: http://www.graphviz.org/. B: Some graphs may produce very large images, some graphs may produce no image if C's output is incorrect. =head2 C Location of the dot program for C, if other than I or I =head2 C Directory where C should write it's temporary image files. Default is C<$ServerRoot/logs/b_graphs>. =head1 Prerequisites The C module, version C<2.00> or higher. Other optional functionality requirements: C - 0.59, C - 0.05, C> - 0.03. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 See Also perl(1), Apache(3), Devel::Symdump(3), Data::Dumper(3), B(3), C(3), L. =head1 Authors Doug MacEachern with contributions from Stas Bekman =cut mod_perl-2.0.9/docs/api/Apache2/SubProcess.pod0000644000177200010010000001425412540623177017640 0ustar SteveNone=head1 NAME Apache2::SubProcess -- Executing SubProcesses under mod_perl =head1 Synopsis use Apache2::SubProcess (); use Config; use constant PERLIO_IS_ENABLED => $Config{useperlio}; # pass @ARGV / read from the process $command = "/tmp/argv.pl"; @argv = qw(foo bar); $out_fh = $r->spawn_proc_prog($command, \@argv); $output = read_data($out_fh); # pass environment / read from the process $command = "/tmp/env.pl"; $r->subprocess_env->set(foo => "bar"); $out_fh = $r->spawn_proc_prog($command); $output = read_data($out_fh); # write to/read from the process $command = "/tmp/in_out_err.pl"; ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($command); print $in_fh "hello\n"; $output = read_data($out_fh); $error = read_data($err_fh); # helper function to work w/ and w/o perlio-enabled Perl sub read_data { my ($fh) = @_; my $data; if (PERLIO_IS_ENABLED || IO::Select->new($fh)->can_read(10)) { $data = <$fh>; } return defined $data ? $data : ''; } # pass @ARGV but don't ask for any communication channels $command = "/tmp/argv.pl"; @argv = qw(foo bar); $r->spawn_proc_prog($command, \@argv); =head1 Description C provides the Perl API for running and communicating with processes spawned from mod_perl handlers. At the moment it's possible to spawn only external program in a new process. It's possible to provide other interfaces, e.g. executing a sub-routine reference (via C) and may be spawn a new program in a thread (since the APR api includes API for spawning threads, e.g. that's how it's running mod_cgi on win32). =head1 API =head2 C Spawn a sub-process and return STD communication pipes: $r->spawn_proc_prog($command); $r->spawn_proc_prog($command, \@argv); $out_fh = $r->spawn_proc_prog($command); $out_fh = $r->spawn_proc_prog($command, \@argv); ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($command); ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($command, \@argv); =over 4 =item obj: C<$r> ( C> ) =item arg1: C<$command> ( string ) The command to be C<$exec()>'ed. =item opt arg2: C<\@argv> ( ARRAY ref ) A reference to an array of arguments to be passed to the process as the process' C. =item ret: ... In VOID context returns no filehandles (all std streams to the spawned process are closed). In SCALAR context returns the output filehandle of the spawned process (the in and err std streams to the spawned process are closed). In LIST context returns the input, outpur and error filehandles of the spawned process. =item since: 2.0.00 =back It's possible to pass environment variables as well, by calling: $r->subprocess_env->set($key => $value); before spawning the subprocess. There is an issue with reading from the read filehandle (C<$in_fh>)): A pipe filehandle returned under perlio-disabled Perl needs to call select() if the other end is not fast enough to send the data, since the read is non-blocking. A pipe filehandle returned under perlio-enabled Perl on the other hand does the select() internally, because it's really a filehandle opened via C<:APR> layer, which internally uses APR to communicate with the pipe. The way APR is implemented Perl's select() cannot be used with it (mainly because select() wants fileno() and APR is a crossplatform implementation which hides the internal datastructure). Therefore to write a portable code, you want to use select for perlio-disabled Perl and do nothing for perlio-enabled Perl, hence you can use something similar to the C wrapper shown in the L section. Several examples appear in the L section. C is similar to C, but provides you a better framework to communicate with that process and handles the cleanups for you. But that means that just like C it gives you a different process, so you don't use the current Perl interpreter in that new process. If you try to use that method or fork to run a high-performance parallel processing you should look elsewhere. You could try Perl threads, but they are B expensive to start if you have a lot of things loaded into memory (since C dups almost everything in the perl land, but the opcode tree). In the mod_perl "paradigm" this is much more expensive than fork, since normally most of the time we have lots of perl things loaded into memory. Most likely the best solution here is to offload the job to PPerl or some other daemon, with the only added complexity of communication. To spawn a completely independent process, which will be able to run after Apache has been shutdown and which won't prevent Apache from restarting (releasing the ports Apache is listening to) call spawn_proc_prog() in a void context and make the script detach and close/reopen its communication streams. For example, spawn a process as: use Apache2::SubProcess (); $r->spawn_proc_prog ('/path/to/detach_script.pl', $args); and the F contents are: # file:detach_script.pl #!/usr/bin/perl -w use strict; use warnings; use POSIX 'setsid'; chdir '/' or die "Can't chdir to /: $!"; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; open STDOUT, '+>>', '/path/to/apache/error_log' or die "Can't write to /dev/null: $!"; open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; setsid or die "Can't start a new session: $!"; # run your code here or call exec to another program reopening (or closing) the STD streams and called C makes sure that the process is now fully detached from Apache and has a life of its own. C ensures that no partition is tied, in case you need to remount it. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/SubRequest.pod0000644000177200010010000002305712540623177017653 0ustar SteveNone=head1 NAME Apache2::SubRequest - Perl API for Apache subrequests =head1 Synopsis use Apache2::SubRequest (); # run internal redirects at once $r->internal_redirect($new_uri); $r->internal_redirect_handler($new_uri); # create internal redirect objects $subr = $r->lookup_uri("/foo"); $subr = $r->lookup_method_uri("GET", "/tmp/bar") $subr = $r->lookup_file("/tmp/bar"); # optionally manipulate the output through main request filters $subr = $r->lookup_uri("/foo", $r->output_filters); # now run them my $rc = $subr->run; =head1 Description C contains API for creating and running of Apache sub-requests. C is a sub-class of C>. =head1 API C provides the following functions and/or methods: =head2 C Free the memory associated with a sub request: undef $subr; # but normally don't do that =over 4 =item obj: C<$subr> ( C> ) The sub request to finish =item ret: no return value =item since: 2.0.00 =back C is called automatically when C<$subr> goes out of scope. If you want to free the memory earlier than that (for example if you run several subrequests), you can C the object as: undef $subr; but never call C explicitly, since it'll result in C being called more than once, resulting in multiple brain injuries and certain hair loss. =head2 C Redirect the current request to some other uri internally $r->internal_redirect($new_uri); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$new_uri> ( string ) The URI to replace the current request with =item ret: no return value =item since: 2.0.00 =back In case that you want some other request to be served as the top-level request instead of what the client requested directly, call this method from a handler, and then immediately return C. The client will be unaware the a different request was served to her behind the scenes. =head2 C Identical to C>, plus automatically sets Ccontent_type|docs::2.0::api::Apache2::RequestRec/C_content_type_>> is of the sub-request to be the same as of the main request, if Chandler|docs::2.0::api::Apache2::RequestRec/C_handler_>> is true. $r->internal_redirect_handler($new_uri); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$new_uri> ( string ) The URI to replace the current request with. =item ret: no return value =item since: 2.0.00 =back This function is designed for things like actions or CGI scripts, when using C, and you want to preserve the content type across an internal redirect. =head2 C Create a subrequest for the given file. This sub request can be inspected to find information about the requested file $ret = $r->lookup_file($new_file); $ret = $r->lookup_file($new_file, $next_filter); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$new_file> ( string ) The file to lookup =item opt arg2: C<$next_filter> ( C> ) See Clookup_uri|/C_lookup_uri_>> for details. =item ret: C<$ret> ( C> ) The sub request record. =item since: 2.0.00 =back See Clookup_uri|/C_lookup_uri_>> for further discussion. =head2 C Create a sub request for the given URI using a specific method. This sub request can be inspected to find information about the requested URI $ret = $r->lookup_method_uri($method, $new_uri); $ret = $r->lookup_method_uri($method, $new_uri, $next_filter); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$method> ( string ) The method to use in the new sub request (e.g. C<"GET">) =item arg2: C<$new_uri> ( string ) The URI to lookup =item opt arg3: C<$next_filter> ( C> ) See Clookup_uri|/C_lookup_uri_>> for details. =item ret: C<$ret> ( C> ) The sub request record. =item since: 2.0.00 =back See Clookup_uri|/C_lookup_uri_>> for further discussion. =head2 C Create a sub request from the given URI. This sub request can be inspected to find information about the requested URI. $ret = $r->lookup_uri($new_uri); $ret = $r->lookup_uri($new_uri, $next_filter); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$new_uri> ( string ) The URI to lookup =item opt arg2: C<$next_filter> ( C> ) The first filter the subrequest should pass the data through. If not specified it defaults to the first connection output filter for the main request Cproto_output_filters|docs::2.0::api::Apache2::RequestRec/C_proto_output_filters_>>. So if the subrequest sends any output it will be filtered only once. If for example you desire to apply the main request's output filters to the sub-request output as well pass Coutput_filters|docs::2.0::api::Apache2::RequestRec/C_output_filters_>> as an argument. =item ret: C<$ret> ( C> ) The sub request record =item since: 2.0.00 =back Here is an example of a simple subrequest which serves uri I: sub handler { my $r = shift; my $subr = $r->lookup_uri("/new_uri"); $subr->run; return Apache2::Const::OK; } If let's say you have three request output filters registered to run for the main request: PerlOutputFilterHandler MyApache2::SubReqExample::filterA PerlOutputFilterHandler MyApache2::SubReqExample::filterB PerlOutputFilterHandler MyApache2::SubReqExample::filterC and you wish to run them all, the code needs to become: my $subr = $r->lookup_uri("/new_uri", $r->output_filters); and if you wish to run them all, but the first one (C), the code needs to be adjusted to be: my $subr = $r->lookup_uri("/new_uri", $r->output_filters->next); =head2 C Run a sub-request $rc = $subr->run(); =over 4 =item obj: C<$subr> ( C> ) The sub-request (e.g. returned by C>) =item ret: C<$rc> ( integer ) The return code of the handler (C, C, etc.) =item since: 2.0.00 =back =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C META: Autogenerated - needs to be reviewed/completed Redirect the current request to a sub_req, merging the pools $r->internal_fast_redirect($sub_req); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$sub_req> ( string ) A subrequest created from this request =item ret: no return value =item since: 2.0.00 =back META: httpd-2.0/modules/http/http_request.c declares this function as: /* XXX: Is this function is so bogus and fragile that we deep-6 it? */ do we really want to expose it to mod_perl users? =head2 C META: Autogenerated - needs to be reviewed/completed Create a sub request for the given apr_dir_read result. This sub request can be inspected to find information about the requested file $lr = $r->lookup_dirent($finfo); $lr = $r->lookup_dirent($finfo, $subtype); $lr = $r->lookup_dirent($finfo, $subtype, $next_filter); =over 4 =item obj: C<$r> ( C> ) The current request =item arg1: C<$finfo> ( C> ) The apr_dir_read result to lookup =item arg2: C<$subtype> ( integer ) What type of subrequest to perform, one of; Apache2::SUBREQ_NO_ARGS ignore r->args and r->path_info Apache2::SUBREQ_MERGE_ARGS merge r->args and r->path_info =item arg3: C<$next_filter> ( integer ) The first filter the sub_request should use. If this is NULL, it defaults to the first filter for the main request =item ret: C<$lr> ( C> ) The new request record =item since: 2.0.00 =back META: where do we take the apr_dir_read result from? =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/URI.pod0000644000177200010010000001402612540623177016204 0ustar SteveNone=head1 NAME Apache2::URI - Perl API for manipulating URIs =head1 Synopsis use Apache2::URI (); $hostport = $r->construct_server(); $hostport = $r->construct_server($hostname); $hostport = $r->construct_server($hostname, $port); $hostport = $r->construct_server($hostname, $port, $pool); $url = $r->construct_url(); $url = $r->construct_url($rel_uri); $url = $r->construct_url($rel_uri, $pool); $parsed_uri = $r->parse_uri($uri); $parsed_uri = $r->parsed_uri(); $url = join '%20', qw(one two three); Apache2::URI::unescape_url($url); =head1 Description While C provides a generic API to dissect, adjust and put together any given URI string, C provides an API specific to Apache, by taking the information directly from the C<$r> object. Therefore when manipulating the URI of the current HTTP request usually methods from both classes are used. =head1 API C provides the following functions and methods: =head2 C Construct a string made of hostname and port $hostport = $r->construct_server(); $hostport = $r->construct_server($hostname); $hostport = $r->construct_server($hostname, $port); $hostport = $r->construct_server($hostname, $port, $pool); =over 4 =item obj: C<$r> ( C> ) The current request object =item opt arg1: C<$hostname> ( string ) The hostname of the server. If that argument is not passed, Cget_server_name|docs::2.0::api::Apache2::RequestUtil/C_get_server_name_>> is used. =item opt arg2: C<$port> ( string ) The port the server is running on. If that argument is not passed, Cget_server_port|docs::2.0::api::Apache2::RequestUtil/C_get_server_port_>> is used. =item opt arg3: C<$pool> ( C> ) The pool to allocate the string from. If that argument is not passed, Cpool|docs::2.0::api::Apache2::RequestRec/C_pool_>> is used. =item ret: C<$hostport> ( string ) The server's hostport string =item since: 2.0.00 =back Examples: =over =item * Assuming that: $r->get_server_name == "localhost"; $r->get_server_port == 8001; The code: $hostport = $r->construct_server(); returns a string: localhost:8001 =item * The following code sets the values explicitly: $hostport = $r->construct_server("my.example.com", 8888); and it returns a string: my.example.com:8888 =back =head2 C Build a fully qualified URL from the uri and information in the request rec: $url = $r->construct_url(); $url = $r->construct_url($rel_uri); $url = $r->construct_url($rel_uri, $pool); =over 4 =item obj: C<$r> ( C> ) The current request object =item opt arg1: C<$rel_uri> ( string ) The path to the requested file (it may include a concatenation of I, I and I components). If that argument is not passed, Curi|docs::2.0::api::Apache2::RequestRec/C_uri_>> is used. =item opt arg2: C<$pool> ( C> ) The pool to allocate the URL from If that argument is not passed, Cpool|docs::2.0::api::Apache2::RequestRec/C_pool_>> is used. =item ret: C<$url> ( string ) A fully qualified URL =item since: 2.0.00 =back Examples: =over =item * Assuming that the request was http://localhost.localdomain:8529/test?args The code: my $url = $r->construct_url; returns the string: http://localhost.localdomain:8529/test notice that the query (args) component is not in the string. You need to append it manually if it's needed. =item * Assuming that the request was http://localhost.localdomain:8529/test?args The code: my $rel_uri = "/foo/bar?tar"; my $url = $r->construct_url($rel_uri); returns the string: http://localhost.localdomain:8529/foo/bar?tar =back =head2 C Break apart URI (affecting the current request's uri components) $r->parse_uri($uri); =over 4 =item obj: C<$r> ( C> ) The current request object =item arg1: C<$uri> ( string ) The uri to break apart =item ret: no return value =item warning: This method has several side-effects explained below =item since: 2.0.00 =back This method call has the following side-effects: =over =item 1 sets Cargs|docs::2.0::api::Apache2::RequestRec/C_args_>> to the rest after C<'?'> if such exists in the passed C<$uri>, otherwise sets it to C. =item 2 sets Curi|docs::2.0::api::Apache2::RequestRec/C_uri_>> to the passed C<$uri> without the Cargs|docs::2.0::api::Apache2::RequestRec/C_args_>> part. =item 3 sets Chostname|docs::2.0::api::Apache2::RequestRec/C_hostname_>> (if not set already) using the (C) parts of the passed C<$uri>. =back =head2 C Get the current request's parsed uri object my $uri = $r->parsed_uri(); =over 4 =item obj: C<$r> ( C> ) The current request object =item ret: C<$uri> ( C> ) The parsed uri =item since: 2.0.00 This object is suitable for using with C> =back =head2 C Unescape URLs Apache2::URI::unescape_url($url); =over 4 =item obj: C<$url> ( string ) The URL to unescape =item ret: no return value The argument C<$url> is now unescaped =item since: 2.0.00 =back Example: my $url = join '%20', qw(one two three); Apache2::URI::unescape_url($url); C<$url> now contains the string: "one two three"; =head1 See Also C>, L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/Apache2/Util.pod0000644000177200010010000000600112540623177016454 0ustar SteveNone=head1 NAME Apache2::Util - Perl API for Misc Apache Utility functions =head1 Synopsis use Apache2::Util (); # OS escape path $escaped_path = Apache2::Util::escape_path($path, "a 'long' file.html"); # format time as a string my $fmt = "%a, %D %H:%M:%S %Z"; $fmtdate = Apache2::Util::ht_time($r->pool, $r->request_time, $fmt, 0); =head1 Description Various Apache utilities that don't fit into any other group. =head1 Functions API C provides the following functions and/or methods: =head2 C convert an OS path to a URL in an OS dependant way. $escaped_path = Apache2::Util::escape_path($path, $p); $escaped_path = Apache2::Util::escape_path($path, $p, $partial); =over 4 =item arg1: C<$path> ( string ) The path to convert =item arg2: C<$p> ( C> ) The pool to allocate from =item opt arg3: C<$partial> ( boolean ) if TRUE, assume that the path will be appended to something with a '/' in it (and thus does not prefix "./") if FALSE it prepends C<"./"> unless C<$path> contains C<:> optionally followed by C. the default is TRUE =item ret: C<$escaped_path> ( string ) The escaped path =item since: 2.0.00 =back =head2 C Convert time from an integer value into a string in a specified format $time_str = Apache2::Util::ht_time($p); $time_str = Apache2::Util::ht_time($p, $time); $time_str = Apache2::Util::ht_time($p, $time, $fmt); $time_str = Apache2::Util::ht_time($p, $time, $fmt, $gmt); =over 4 =item arg1: C<$p> ( C> ) The pool to allocate memory from =item opt arg2: C<$time> ( number ) The time to convert (e.g., C or Crequest_time|docs::2.0::api::Apache2::RequestRec/C_request_time_>>). If the value is not passed the current time will be used. =item opt arg3: C<$fmt> ( string ) The format to use for the conversion, using strftime(3) tokens. If the value is not passed the default format used is: "%a, %d %b %Y %H:%M:%S %Z" =item opt arg4: C<$gmt> ( boolean ) The time will be not converted to GMT if FALSE is passed. If the value is not passed TRUE (do convert) is used as a default. =item ret: C<$time_str> (string) The string that represents the specified time =item since: 2.0.00 =back Examples: Use current time, the default format and convert to GMT: $fmtdate = Apache2::Util::ht_time($r->pool); Use my time, the default format and convert to GMT: my $time = time+100; $fmtdate = Apache2::Util::ht_time($r->pool, $time); Use the time the request has started, custom format and don't convert to GMT: my $fmt = "%a, %D %H:%M:%S %Z"; $fmtdate = Apache2::Util::ht_time($r->pool, $r->request_time, $fmt, 0); =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/0000755000104000010010000000000012540623177016116 5ustar AdministratorsNonemod_perl-2.0.9/docs/api/APR/Base64.pod0000644000177200010010000000306512540623177015751 0ustar SteveNone=head1 NAME APR::Base64 - Perl API for APR base64 encoding/decoding functionality =head1 Synopsis use APR::Base64 (); my $clear = "foo" my $encoded = APR::Base64::encode($clear); my $decoded = APR::Base64::decode($encoded); my $len_enc = APR::Base64::encode_len(length $clear); =head1 Description C provides the access to APR's base64 encoding and decoding API. =head1 API C provides the following functions and/or methods: =head2 C Decode a base64 encoded string $decoded = decode($encoded); =over 4 =item arg1: C<$encoded> ( string ) The encoded string. =item ret: C<$decoded> ( string ) The decoded string. =item since: 2.0.00 =back =head2 C Encode a string to base64 $encoded = encode($clear); =over 4 =item arg1: C<$clear> ( string ) The unencoded string. =item ret: C<$encoded> ( string ) The encoded string. =item since: 2.0.00 =back =head2 C Given the length of an unencoded string, get the length of the encoded string. $len_enc = encode_len($len_clear); =over 4 =item arg1: C<$len_clear> ( integer ) the length of an unencoded string. =item ret: C<$len_enc> ( integer ) the length of the string after it is encoded =item since: 2.0.00 =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/Brigade.pod0000644000177200010010000002245012540623177016261 0ustar SteveNone=head1 NAME APR::Brigade - Perl API for manipulating APR Bucket Brigades =head1 Synopsis use APR::Brigade (); $bb = APR::Brigade->new($r->pool, $c->bucket_alloc); $ba = $bb->bucket_alloc(); $pool = $bb->pool; $bb->insert_head($b); $bb->insert_tail($b); $b_first = $bb->first; $b_last = $bb->last; $b_prev = $bb->prev($b_last); $b_next = $bb->next($b); $bb2 = APR::Brigade->new($r->pool, $c->bucket_alloc); $bb1->concat($bb2); $len = $bb->flatten($data); $len = $bb2->flatten($data, $wanted); $len = $bb->length; $bb3 = $bb->split($b_last); last if $bb->is_empty(); $bb->cleanup(); $bb->destroy(); =head1 Description C allows you to create, manipulate and delete APR bucket brigades. =head1 API C provides the following functions and/or methods: =head2 C Empty out an entire bucket brigade: $bb->cleanup; =over 4 =item obj: C<$bb> ( C> ) The brigade to cleanup =item ret: no return value =item since: 2.0.00 =back This method destroys all of the buckets within the bucket brigade's bucket list. This is similar to C>, except that it does not deregister the brigade's C> cleanup function. Generally, you should use C>. This function can be useful in situations where you have a single brigade that you wish to reuse many times by destroying all of the buckets in the brigade and putting new buckets into it later. =head2 C Concatenate brigade C<$bb2> onto the end of brigade C<$bb1>, leaving brigade C<$bb2> empty: $bb1->concat($bb2); =over 4 =item obj: C<$bb1> ( C> ) The brigade to concatenate to. =item arg1: C<$bb2> ( C> ) The brigade to concatenate and empty afterwards. =item ret: no return value =item since: 2.0.00 =back =head2 C destroy an entire bucket brigade, includes all of the buckets within the bucket brigade's bucket list. $bb->destroy(); =over 4 =item obj: C<$bb> ( C> ) The bucket brigade to destroy. =item ret: no return value =item excpt: C> =item since: 2.0.00 =back =head2 C Test whether the bucket brigade is empty $ret = $bb->is_empty(); =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$ret> ( boolean ) =item since: 2.0.00 =back =head2 C Return the first bucket in a brigade $b_first = $bb->first; =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$b_first> ( C> ) The first bucket in the bucket brigade C<$bb>. C is returned if there are no buckets in C<$bb>. =item since: 2.0.00 =back =head2 C Get the data from buckets in the bucket brigade as one string $len = $bb->flatten($buffer); $len = $bb->flatten($buffer, $wanted); =over 4 =item obj: C<$bb> ( C> ) =item arg1: C<$buffer> ( SCALAR ) The buffer to fill. All previous data will be lost. =item opt arg2: C<$wanted> ( number ) If no argument is passed then all data will be returned. If C<$wanted> is specified -- that number or less bytes will be returned. =item ret: C<$len> ( number ) How many bytes were actually read. C<$buffer> gets populated with the string that is read. It will contain an empty string if there was nothing to read. =item since: 2.0.00 =item excpt: C> =back =head2 C Insert a list of buckets at the front of a brigade $bb->insert_head($b); =over 4 =item obj: C<$bb> ( C> ) Brigade to insert into =item arg1: C<$b> ( C> ) the bucket to insert. More buckets could be attached to that bucket. =item ret: no return value =item since: 2.0.00 =back =head2 C Insert a list of buckets at the end of a brigade $bb->insert_tail($b); =over 4 =item obj: C<$bb> ( C> ) Brigade to insert into =item arg1: C<$b> ( C> ) the bucket to insert. More buckets could be attached to that bucket. =item ret: no return value =item since: 2.0.00 =back =head2 C Return the last bucket in the brigade $b_last = $bb->last; =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$b_last> ( C> ) The last bucket in the bucket brigade C<$bb>. C is returned if there are no buckets in C<$bb>. =item since: 2.0.00 =back =head2 C Return the total length of the data in the brigade (not the number of buckets) $len = $bb->length; =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$len> ( number ) =item since: 2.0.00 =back =head2 C my $nbb = APR::Brigade->new($p, $bucket_alloc); my $nbb = $bb->new($p, $bucket_alloc); =over 4 =item obj: C<$bb> ( C> ) =item arg1: C<$p> ( C> ) =item arg2: C<$bucket_alloc> ( C> ) =item ret: C<$nbb> ( C> ) a newly created bucket brigade object =item since: 2.0.00 =back Example: Create a new bucket brigade, using the request object's pool: use Apache2::Connection (); use Apache2::RequestRec (); use APR::Brigade (); my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); =head2 C Get the bucket allocator associated with this brigade. my $ba = $bb->bucket_alloc(); =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$ba> ( C> ) =item since: 2.0.00 =back =head2 C Return the next bucket in a brigade $b_next = $bb->next($b); =over 4 =item obj: C<$bb> ( C> ) =item arg1: C<$b> ( C> ) The bucket after which the next bucket C<$b_next> is located =item ret: C<$b_next> ( C> ) The next bucket after bucket C<$b>. C is returned if there is no next bucket (i.e. C<$b> is the last bucket). =item since: 2.0.00 =back =head2 C The pool the brigade is associated with. $pool = $bb->pool; =over 4 =item obj: C<$bb> ( C> ) =item ret: C<$pool> ( C> ) =item since: 2.0.00 =back The data is not allocated out of the pool, but a cleanup is registered with this pool. If the brigade is destroyed by some mechanism other than pool destruction, the destroying function is responsible for killing the registered cleanup. =head2 C Return the previous bucket in the brigade $b_prev = $bb->prev($b); =over 4 =item obj: C<$bb> ( C> ) =item arg1: C<$b> ( C> ) The bucket located after bucket C<$b_prev> =item ret: C<$b_prev> ( C> ) The bucket located before bucket C<$b>. C is returned if there is no previous bucket (i.e. C<$b> is the first bucket). =item since: 2.0.00 =back =head2 C Split a bucket brigade into two, such that the given bucket is the first in the new bucket brigade. $bb2 = $bb->split($b); =over 4 =item obj: C<$bb> ( C> ) The brigade to split =item arg1: C<$b> ( C> ) The first bucket of the new brigade =item ret: C<$bb2> ( C> ) The new brigade. =item since: 2.0.00 =back This function is useful when a filter wants to pass only the initial part of a brigade to the next filter. Example: Create a bucket brigade with three buckets, and split it into two brigade such that the second brigade will have the last two buckets. my $bb1 = APR::Brigade->new($r->pool, $c->bucket_alloc); my $ba = $c->bucket_alloc(); $bb1->insert_tail(APR::Bucket->new($ba, "1")); $bb1->insert_tail(APR::Bucket->new($ba, "2")); $bb1->insert_tail(APR::Bucket->new($ba, "3")); C<$bb1> now contains buckets "1", "2", "3". Now do the split at the second bucket: my $b = $bb1->first; # 1 $b = $bb1->next($b); # 2 my $bb2 = $bb1->split($b); Now C<$bb1> contains bucket "1". C<$bb2> contains buckets: "2", "3" =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/Bucket.pod0000644000177200010010000003411612540623177016143 0ustar SteveNone=head1 NAME APR::Bucket - Perl API for manipulating APR Buckets =head1 Synopsis use APR::Bucket (); my $ba = $c->bucket_alloc; $b1 = APR::Bucket->new($ba, "aaa"); $b2 = APR::Bucket::eos_create($ba); $b3 = APR::Bucket::flush_create($ba); $b2->is_eos; $b3->is_flush; $len = $b1->length; $len = $b1->read($data); $type = $b1->type; $b1->insert_after($b2); $b1->insert_before($b3); $b1->remove; $b1->destroy; $b2->delete; # remove+destroy $b4 = APR::Bucket->new($ba, "to be setaside"); $b4->setaside($pool); =head1 Description C allows you to create, manipulate and delete APR buckets. You will probably find the various insert methods confusing, the tip is to read the function right to left. The following code sample helps to visualize the operations: my $bb = APR::Brigade->new($r->pool, $ba); my $d1 = APR::Bucket->new($ba, "d1"); my $d2 = APR::Bucket->new($ba, "d2"); my $f1 = APR::Bucket::flush_create($ba); my $f2 = APR::Bucket::flush_create($ba); my $e1 = APR::Bucket::eos_create($ba); # head->tail $bb->insert_head( $d1); # head->d1->tail $d1->insert_after( $d2); # head->d1->d2->tail $d2->insert_before($f1); # head->d1->f1->d2->tail $d2->insert_after( $f2); # head->d1->f1->d2->f2->tail $bb->insert_tail( $e1); # head->d1->f1->d2->f2->e1->tail =head1 API C provides the following functions and/or methods: =head2 C Tell the bucket to remove itself from the bucket brigade it belongs to, and destroy itself. $bucket->delete(); =over 4 =item obj: C<$bucket> ( C> ) =item ret: no return value =item since: 2.0.00 =back If the bucket is not attached to any bucket brigade then this operation just destroys the bucket. C is a convenience wrapper, internally doing: $b->remove; $b->destroy; Examples: Assuming that C<$bb> already exists and filled with buckets, replace the existing data buckets with new buckets with upcased data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->read(my $data)) { my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data); $b->insert_before($nb); $b->delete; $b = $nb; } } =head2 C Free the resources used by a bucket. If multiple buckets refer to the same resource it is freed when the last one goes away. $bucket->destroy(); =over 4 =item obj: C<$bucket> ( C> ) =item ret: no return value =item since: 2.0.00 =back A bucket needs to be destroyed if it was L from a bucket brigade, to avoid memory leak. If a bucket is linked to a bucket brigade, it needs to be L from it, before it can be destroyed. Usually instead of calling: $b->remove; $b->destroy; it's better to call C> which does exactly that. =head2 C Create an I bucket. $b = APR::Bucket::eos_create($ba); =over 4 =item arg1: C<$ba> ( C> ) The freelist from which this bucket should be allocated =item ret: C<$b> ( C> ) The new bucket =item since: 2.0.00 =back This bucket type indicates that there is no more data coming from down the filter stack. All filters should flush any buffered data at this point. Example: use APR::Bucket (); use Apache2::Connection (); my $ba = $c->bucket_alloc; my $eos_b = APR::Bucket::eos_create($ba); =head2 C Create a flush bucket. $b = APR::Bucket::flush_create($ba); =over 4 =item arg1: C<$ba> ( C> ) The freelist from which this bucket should be allocated =item ret: C<$b> ( C> ) The new bucket =item since: 2.0.00 =back This bucket type indicates that filters should flush their data. There is no guarantee that they will flush it, but this is the best we can do. =head2 C Insert a list of buckets after a specified bucket $after_bucket->insert_after($add_bucket); =over 4 =item obj: C<$after_bucket> ( C> ) The bucket to insert after =item arg1: C<$add_bucket> ( C> ) The buckets to insert. It says buckets, since C<$add_bucket> may have more buckets attached after itself. =item ret: no return value =item since: 2.0.00 =back =head2 C Insert a list of buckets before a specified bucket $before_bucket->insert_before($add_bucket); =over 4 =item obj: C<$before_bucket> ( C> ) The bucket to insert before =item arg1: C<$add_bucket> ( C> ) The buckets to insert. It says buckets, since C<$add_bucket> may have more buckets attached after itself. =item ret: no return value =item since: 2.0.00 =back =head2 C Determine if a bucket is an EOS bucket $ret = $bucket->is_eos(); =over 4 =item obj: C<$bucket> ( C> ) =item ret: C<$ret> ( boolean ) =item since: 2.0.00 =back =head2 C Determine if a bucket is a FLUSH bucket $ret = $bucket->is_flush(); =over 4 =item obj: C<$bucket> ( C> ) =item ret: C<$ret> ( boolean ) =item since: 2.0.00 =back =head2 C Get the length of the data in the bucket. $len = $b->length; =over 4 =item obj: C<$b> ( C> ) =item ret: C<$len> ( integer ) If the length is unknown, C<$len> value will be -1. =item since: 2.0.00 =back =head2 C Create a new bucket and initialize it with data: $nb = APR::Bucket->new($ba, $data); $nb = $b->new($ba, $data); $nb = APR::Bucket->new($ba, $data, $offset); $nb = APR::Bucket->new($ba, $data, $offset, $len); =over 4 =item obj: C<$b> ( C> ) =item arg1: C<$ba> ( C> ) =item arg2: C<$data> ( string ) The data to initialize with. B in order to avoid unnecessary data copying the variable is stored in the bucket object. That means that if you modify C<$data> after passing it to C you will modify the data in the bucket as well. To avoid that pass to C a copy which you won't modify. =item opt arg3: C<$offset> ( number ) Optional offset inside C<$data>. Default: 0. =item opt arg4: C<$len> ( number ) Optional partial length to read. If C<$offset> is specified, then: length $buffer - $offset; will be used. Otherwise the default is to use: length $buffer; =item ret: C<$nb> ( C> ) a newly created bucket object =item since: 2.0.00 =back Examples: =over =item * Create a new bucket using a whole string: use APR::Bucket (); my $data = "my data"; my $b = APR::Bucket->new($ba, $data); now the bucket contains the string I<'my data'>. =item * Create a new bucket using a sub-string: use APR::Bucket (); my $data = "my data"; my $offset = 3; my $b = APR::Bucket->new($ba, $data, $offset); now the bucket contains the string I<'data'>. =item * Create a new bucket not using the whole length and starting from an offset: use APR::Bucket (); my $data = "my data"; my $offset = 3; my $len = 3; my $b = APR::Bucket->new($ba, $data, $offset, $len); now the bucket contains the string I<'dat'>. =back =head2 C Read the data from the bucket. $len = $b->read($buffer); $len = $b->read($buffer, $block); =over 4 =item obj: C<$b> ( C> ) The bucket to read from =item arg1: C<$buffer> ( SCALAR ) The buffer to fill. All previous data will be lost. =item opt arg2: C<$block> ( C> ) optional reading mode constant. By default the read is blocking, via C>. =item ret: C<$len> ( number ) How many bytes were actually read C<$buffer> gets populated with the string that is read. It will contain an empty string if there was nothing to read. =item since: 2.0.00 =item excpt: C> =back It's important to know that certain bucket types (e.g. file bucket), may perform a split and insert extra buckets following the current one. Therefore never call Cremove|/C_remove_>>, before calling C<$b-Eread>, or you may lose data. Examples: Blocking read: my $len = $b->read(my $buffer); Non-blocking read: use APR::Const -compile 'NONBLOCK_READ'; my $len = $b->read(my $buffer, APR::Const::NONBLOCK_READ); =head2 C Tell the bucket to remove itself from the bucket brigade it belongs to. $bucket->remove(); =over 4 =item obj: C<$bucket> ( C> ) =item ret: no return value =item since: 2.0.00 =back If the bucket is not attached to any bucket brigade then this operation doesn't do anything. When the bucket is removed, it's not not destroyed. Usually this is done in order to move the bucket to another bucket brigade. Or to copy the data way before destroying the bucket. If the bucket wasn't moved to another bucket brigade it must be L. Examples: Assuming that C<$bb1> already exists and filled with buckets, move every odd bucket number to C<$bb2> and every even to C<$bb3>: my $bb2 = APR::Brigade->new($c->pool, $c->bucket_alloc); my $bb3 = APR::Brigade->new($c->pool, $c->bucket_alloc); my $count = 0; while (my $bucket = $bb->first) { $count++; $bucket->remove; $count % 2 ? $bb2->insert_tail($bucket) : $bb3->insert_tail($bucket); } =head2 C Ensure the bucket's data lasts at least as long as the given pool: my $status = $b->setaside($pool); =over 4 =item obj: C<$b> ( C> ) =item arg1: C<$pool> ( C> ) =item ret: ( C> ) On success, C> is returned. Otherwise a failure code is returned. =item excpt: C> when your code deals only with mod_perl buckets, you don't have to ask for the return value. If this method is called in the C context, i.e.: $b->setaside($pool); mod_perl will do the error checking on your behalf, and if the return code is not C>, an C> will be thrown. However if your code doesn't know which bucket types it may need to setaside, you may want to check the return code and deal with any errors. For example one of the possible error codes is C>. As of this writing the pipe and socket buckets can't C, in which case you may want to look at the C implementation. =item since: 2.0.00 =back Usually setaside is called by certain output filters, in order to buffer socket writes of smaller buckets into a single write. This method works on all bucket types (not only the mod_perl bucket type), but as explained in the exceptions section, not all bucket types implement this method. When a mod_perl bucket is setaside, its data is detached from the original perl scalar and copied into a pool bucket. That allows downstream filters to deal with the data originally owned by a Perl interpreter, making it possible for that interpreter to go away and do other things, or be destroyed. =head2 C Get the type of the data in the bucket. $type = $b->type; =over 4 =item obj: C<$b> ( C> ) =item ret: C<$type> ( C> ) =item since: 2.0.00 =back You need to invoke C> methods to access the data. Example: Create a flush bucket and read its type's name: use APR::Bucket (); use APR::BucketType (); my $b = APR::Bucket::flush_create($ba); my $type = $b->type; my $type_name = $type->name; # FLUSH The type name will be I<'FLUSH'> in this example. =head1 Unsupported API C also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the L so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C $data = $b->data; Gives a C pointer to the address of the data in the bucket. I can't see what use can be done of it in Perl. =over 4 =item obj: C<$b> ( C> ) =item ret: C<$data> ( C pointer ) =item since: subject to change =back =head2 C $start = $b->start; It gives the offset to when a new bucket is created with a non-zero offset value: my $b = APR::Bucket->new($ba, $data, $offset, $len); So if the offset was 3. C<$start> will be 3 too. I fail to see what it can be useful for to the end user (it's mainly used internally). =over 4 =item obj: C<$b> ( C> ) =item ret: C<$start> ( offset number ) =item since: subject to change =back =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/BucketAlloc.pod0000644000177200010010000000441612540623177017116 0ustar SteveNone=head1 NAME APR::BucketAlloc - Perl API for Bucket Allocation =head1 Synopsis use APR::BucketAlloc (); $ba = APR::BucketAlloc->new($pool); $ba->destroy; =head1 Description C is used for bucket allocation. =head2 C Create an C object: $ba = APR::BucketAlloc->new($pool); =over 4 =item class: C =item arg1: C<$pool> ( C> ) The pool used to create this object. =item ret: C<$ba> ( C> ) The new object. =item since: 2.0.00 =back This bucket allocation list (freelist) is used to create new buckets (via Cnew|docs::2.0::api::APR::Bucket/C_new_>>) and bucket brigades (via Cnew|docs::2.0::api::APR::Brigade/C_new_>>). You only need to use this method if you aren't running under httpd. If you are running under mod_perl, you already have a bucket allocation available via Cbucket_alloc|docs::2.0::api::Apache2::Connection/C_bucket_alloc_>> and Cbucket_alloc|docs::2.0::api::APR::Brigade/C_bucket_alloc_>>. Example: use APR::BucketAlloc (); use APR::Pool (); my $ba = APR::BucketAlloc->(APR::Pool->pool); my $eos_b = APR::Bucket::eos_create($ba); =head2 C Destroy an C>: $ba->destroy; =over 4 =item arg1: C<$ba> ( C> ) The freelist to destroy. =item ret: no return value =item since: 2.0.00 =back Once destroyed this object may not be used again. You need to destroy C<$ba> B if you have created it via Cnew|/C_new_>>. If you try to destroy an allocation not created by this method, you will get a segmentation fault. Moreover normally it is not necessary to destroy allocators, since the pool which created them will destroy them during that pool's cleanup phase. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/BucketType.pod0000644000177200010010000000206512540623177017003 0ustar SteveNone=head1 NAME APR::BucketType - Perl API for APR bucket types =head1 Synopsis use APR::BucketType (); my $name = $b_type->name; =head1 Description C allows you to query bucket object type properties. =head1 API C provides the following functions and/or methods: =head2 C Get the name of the bucket type: my $bucket_type_name = $b_type->name; =over 4 =item arg1: C<$b_type> ( C> ) =item ret: C<$bucket_type_name> ( string ) =item since: 2.0.00 =back Example: use APR::Bucket (); use APR::BucketType (); my $eos_b = APR::Bucket::eos_create($ba); my $b_type = $eos_b->type; my $name = $b_type->name; Now C<$name> contains I<'EOS'>. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/Const.pod0000644000177200010010000005366212540623177016023 0ustar SteveNone=head1 NAME APR::Const - Perl Interface for APR Constants =head1 Synopsis # make the constants available but don't import them use APR::Const -compile => qw(constant names ...); # w/o the => syntax sugar use APR::Const ("-compile", qw(constant names ...)); # compile and import the constants use APR::Const qw(constant names ...); =head1 Description This package contains constants specific to C features. Refer to C> for more information. =head1 Constants =head2 C<:common> use APR::Const -compile => qw(:common); The C<:common> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head2 C<:error> use APR::Const -compile => qw(:error); The C<:error> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back The error I, may be returned by many different system calls, especially IO calls. Most likely you want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C Something is not implemented =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:fopen> use APR::Const -compile => qw(:fopen); The C<:fopen> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:filepath> use APR::Const -compile => qw(:filepath); The C<:filepath> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:fprot> use APR::Const -compile => qw(:fprot); The C<:fprot> group is used by Cprotection|docs::2.0::api::APR::Finfo/C_protection_>>. =head3 C Execute by group =over =item since: 2.0.00 =back =head3 C Read by group =over =item since: 2.0.00 =back =head3 C Set group id =over =item since: 2.0.00 =back =head3 C Write by group =over =item since: 2.0.00 =back =head3 C use OS's default permissions =over =item since: 2.0.00 =back =head3 C Execute by user =over =item since: 2.0.00 =back =head3 C Read by user =over =item since: 2.0.00 =back =head3 C Set user id =over =item since: 2.0.00 =back =head3 C Write by user =over =item since: 2.0.00 =back =head3 C Execute by others =over =item since: 2.0.00 =back =head3 C Read by others =over =item since: 2.0.00 =back =head3 C Sticky bit =over =item since: 2.0.00 =back =head3 C Write by others =over =item since: 2.0.00 =back =head2 C<:filetype> use APR::Const -compile => qw(:filetype); The C<:filetype> group is used by Cfiletype|docs::2.0::api::APR::Finfo/C_filetype_>>. =head3 C a file is a block device =over =item since: 2.0.00 =back =head3 C a file is a character device =over =item since: 2.0.00 =back =head3 C a file is a directory =over =item since: 2.0.00 =back =head3 C a file is a symbolic link =over =item since: 2.0.00 =back =head3 C the file type is undedetermined. =over =item since: 2.0.00 =back =head3 C a file is a FIFO or a pipe. =over =item since: 2.0.00 =back =head3 C a file is a regular file. =over =item since: 2.0.00 =back =head3 C a file is a [unix domain] socket. =over =item since: 2.0.00 =back =head3 C a file is of some other unknown type or the type cannot be determined. =over =item since: 2.0.00 =back =head2 C<:finfo> use APR::Const -compile => qw(:finfo); The C<:finfo> group is used by C> and Cvalid|docs::2.0::api::APR::Finfo/C_valid_>>. =head3 C Access Time =over =item since: 2.0.00 =back =head3 C Storage size consumed by the file =over =item since: 2.0.00 =back =head3 C Creation Time =over =item since: 2.0.00 =back =head3 C Device =over =item since: 2.0.00 =back =head3 C an atomic unix apr_dir_read() =over =item since: 2.0.00 =back =head3 C Group protection bits =over =item since: 2.0.00 =back =head3 C Group id =over =item since: 2.0.00 =back =head3 C whether device is case insensitive =over =item since: 2.0.00 =back =head3 C device and inode =over =item since: 2.0.00 =back =head3 C Inode =over =item since: 2.0.00 =back =head3 C Stat the link not the file itself if it is a link =over =item since: 2.0.00 =back =head3 C type, mtime, ctime, atime, size =over =item since: 2.0.00 =back =head3 C Modification Time =over =item since: 2.0.00 =back =head3 C name in proper case =over =item since: 2.0.00 =back =head3 C Number of links =over =item since: 2.0.00 =back =head3 C All fields provided by an atomic unix apr_stat() =over =item since: 2.0.00 =back =head3 C user and group =over =item since: 2.0.00 =back =head3 C all protections =over =item since: 2.0.00 =back =head3 C Size of the file =over =item since: 2.0.00 =back =head3 C Type =over =item since: 2.0.00 =back =head3 C User protection bits =over =item since: 2.0.00 =back =head3 C User id =over =item since: 2.0.00 =back =head3 C World protection bits =over =item since: 2.0.00 =back =head2 C<:flock> use APR::Const -compile => qw(:flock); The C<:flock> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:hook> use APR::Const -compile => qw(:hook); The C<:hook> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:limit> use APR::Const -compile => qw(:limit); The C<:limit> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:lockmech> use APR::Const -compile => qw(:lockmech); The C<:lockmech> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:poll> use APR::Const -compile => qw(:poll); The C<:poll> group is used by C>. =head3 C =over =item since: 2.0.00 =back Pending error =head3 C =over =item since: 2.0.00 =back Hangup occurred =head3 C =over =item since: 2.0.00 =back Can read without blocking =head3 C =over =item since: 2.0.00 =back Descriptior invalid =head3 C =over =item since: 2.0.00 =back Can write without blocking =head3 C =over =item since: 2.0.00 =back Priority data available =head2 C<:read_type> use APR::Const -compile => qw(:read_type); The C<:read_type> group is for IO constants. =head3 C =over =item since: 2.0.00 =back the read function blocks =head3 C =over =item since: 2.0.00 =back the read function does not block =head2 C<:shutdown_how> use APR::Const -compile => qw(:shutdown_how); The C<:shutdown_how> group is for XXX constants. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head2 C<:socket> use APR::Const -compile => qw(:socket); The C<:socket> group is for the C> object constants, in methods C> and C>. The following section discusses in detail each of the C<:socket> constants. =head3 C Possible values: XXX =over =item since: 2.0.00 =back Turns on debugging information =head3 C Queries the disconnected state of the socket. (Currently only used on Windows) Possible values: XXX =over =item since: 2.0.00 =back =head3 C Keeps connections active Possible values: XXX =over =item since: 2.0.00 =back =head3 C Lingers on close if data is present =over =item since: 2.0.00 =back =head3 C Turns blocking IO mode on/off for socket. Possible values: 1 nonblocking 0 blocking For example, to set a socket to a blocking IO mode: use APR::Socket (); use APR::Const -compile => qw(SO_NONBLOCK); ... if ($socket->opt_get(APR::Const::SO_NONBLOCK)) { $socket->opt_set(APR::Const::SO_NONBLOCK => 0); } You don't have to query for this option, before setting it. It was done for the demonstration purpose. =over =item since: 2.0.00 =back =head3 C Controls the C setting Possible values: XXX =over =item since: 2.0.00 =back =head3 C The rules used in validating addresses supplied to bind should allow reuse of local addresses. Possible values: XXX =over =item since: 2.0.00 =back =head3 C Controls the C setting Possible values: XXX =over =item since: 2.0.00 =back =head2 C<:status> use APR::Const -compile => qw(:status); The C<:status> group is for the API that return status code, or set the error variable XXXXXX. The following section discusses in detail each of the available C<:status> constants. =head3 C The operation did not finish before the timeout. =over =item since: 2.0.00 =back Due to possible variants in conditions matching C, for checking error codes against this you most likely want to use the C> function instead. =head2 C<:table> use APR::Const -compile => qw(:table); The C<:table> group is for C and C constants. See C> for details. =head3 C =over =item since: 2.0.00 =back See C> and C>. =head3 C =over =item since: 2.0.00 =back See C> and C>. =head2 C<:uri> use APR::Const -compile => qw(:uri); The C<:uri> group of constants is for manipulating URIs. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back =head3 C =over =item since: 2.0.00 =back See C>. =head3 C =over =item since: 2.0.00 =back =head2 Other Constants =head3 C =over =item since: 2.0.00 =back See C>) =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/Date.pod0000644000177200010010000000534012540623177015600 0ustar SteveNone=head1 NAME APR::Date - Perl API for APR date manipulating functions =head1 Synopsis use APR::Date (); # parse HTTP-complient date string $date_string = 'Sun, 06 Nov 1994 08:49:37 GMT'; $date_parsed = APR::Date::parse_http($date_string); # parse RFC822-complient date string $date_string = 'Sun, 6 Nov 94 8:49:37 GMT'; $date_parsed = APR::Date::parse_rfc($date_string); =head1 Description C provides the Perl interface to APR date manipulating functions. =head1 API C provides the following functions and/or methods: =head2 C Parse HTTP date strings $date_parsed = parse_http($date_string); =over 4 =item arg1: C<$date_string> ( string ) The date string can be in one of the following formats: Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format refer to RFC2616 for the details (GMT is assumed, regardless of the used timezone). =item ret: C<$date_parsed> ( number ) the number of microseconds since 1 Jan 1970 GMT, or 0 if out of range or if the date is invalid. =item since: 2.0.00 =back Remember to divide the return value by 1_000_000 if you need it in seconds. =head2 C Parse a string resembling an RFC 822 date. It's meant to be lenient in its parsing of dates. Hence, this will parse a wider range of dates than C>. $date_parsed = parse_rfc($date_string); =over 4 =item arg1: C<$date_string> ( string ) The date string can be in one of the following formats: Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format Sun, 6 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sun, 06 Nov 94 08:49:37 GMT ; RFC 822 Sun, 6 Nov 94 08:49:37 GMT ; RFC 822 Sun, 06 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk] Sun, 6 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk] Sun, 06 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85] Sun, 6 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85] =item ret: C<$date_parsed> ( number ) the number of microseconds since 1 Jan 1970 GMT, or 0 if out of range or if the date is invalid. =item since: 2.0.00 =back Remember to divide the return value by 1_000_000 if you need it in seconds. =head1 See Also L. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L. =cut mod_perl-2.0.9/docs/api/APR/Error.pod0000644000177200010010000001562112540623177016017 0ustar SteveNone=head1 NAME APR::Error - Perl API for APR/Apache/mod_perl exceptions =head1 Synopsis eval { $obj->mp_method() }; if ($@ && $ref $@ eq 'APR::Error' && $@ == $some_code) { # handle the exception } else { die $@; # rethrow it } =head1 Description C handles APR/Apache/mod_perl exceptions for you, while leaving you in control. Apache and APR API return a status code for almost all methods, so if you didn't check the return code and handled any possible problems, you may have silent failures which may cause all kind of obscure problems. On the other hand checking the status code after each call is just too much of a kludge and makes quick prototyping/development almost impossible, not talking about the code readability. Having methods return status codes, also complicates the API if you need to return other values. Therefore to keep things nice and make the API readable we decided to not return status codes, but instead throw exceptions with C objects for each method that fails. If you don't catch those exceptions, everything works transparently - perl will intercept the exception object and C with a proper error message. So you get all the errors logged without doing any work. Now, in certain cases you don't want to just die, but instead the error needs to be trapped and handled. For example if some IO operation times out, may be it is OK to trap that and try again. If we were to die with an error message, you would have had to match the error message, which is ugly, inefficient and may not work at all if locale error strings are involved. Therefore you need to be able to get the original status code that Apache or APR has generated. And the exception objects give you that if you want to. Moreover the objects contain additional information, such as the function name (in case you were eval'ing several commands in one block), file and line number where that function was invoked from. More attributes could be added in the future. C uses Perl operator overloading, such that in boolean and numerical contexts, the object returns the status code; in the string context the full error message is returned. When intercepting exceptions you need to check whether C<$@> is an object (reference). If your application uses other exception objects you additionally need to check whether this is a an C object. Therefore most of the time this is enough: eval { $obj->mp_method() }; if ($@ && $ref $@ && $@ == $some_code) warn "handled exception: $@"; } But with other, non-mod_perl, exception objects you need to do: eval { $obj->mp_method() }; if ($@ && $ref $@ eq 'APR::Error' && $@ == $some_code) warn "handled exception: $@"; } In theory you could even do: eval { $obj->mp_method() }; if ($@ && $@ == $some_code) warn "handled exception: $@"; } but it's possible that the method will die with a plain string and not an object, in which case C<$@ == $some_code> won't quite work. Remember that mod_perl throws exception objects only when Apache and APR fail, and in a few other special cases of its own (like C>). warn "handled exception: $@" if $@ && $ref $@; There are two ways to figure out whether an error fits your case. In most cases you just compare C<$@> with an the error constant. For example if a socket has a timeout set and the data wasn't read within the timeout limit a C>) use APR::Const -compile => qw(TIMEUP); $sock->timeout_set(1_000_000); # 1 sec my $buff; eval { $sock->recv($buff, BUFF_LEN) }; if ($@ && ref $@ && $@ == APR::Const::TIMEUP) { } However there are situations, where on different Operating Systems a different error code will be returned. In which case to simplify the code you should use the special subroutines provided by the C> class. One such condition is socket C timeout, which on Unix throws the C error, but on other system it throws a different error. In this case C> should be used. Let's look at a complete example. Here is a code that performs L: my $rlen = $sock->recv(my $buff, 1024); warn "read $rlen bytes\n"; and in certain cases it times out. The code will die and log the reason for the failure, which is fine, but later on you may decide that you want to have another attempt to read before dying and add some fine grained sleep time between attempts, which can be achieved with C and C typemappings for the corresponding C object type. Now we run C and find the following definitions in the autogenerated files: file:xs/modperl_xs_typedefs.h ----------------------------- typedef scoreboard * Apache__Scoreboard; file:xs/modperl_xs_sv_convert.h ------------------------------- #define mp_xs_sv2_Apache__Scoreboard(sv) \ ((SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) \ || (Perl_croak(aTHX_ "argument is not a blessed reference \ (expecting an Apache::Scoreboard derived object)"),0) ? \ (scoreboard *)SvIV((SV*)SvRV(sv)) : (scoreboard *)NULL) #define mp_xs_Apache__Scoreboard_2obj(ptr) \ sv_setref_pv(sv_newmortal(), "Apache::Scoreboard", (void*)ptr) The file I declares the typemapping from C to Perl and equivalent to the C section of the XS's I file. The second file I generates two macros. The first macro is used to convert from Perl to C datatype and equivalent to the I file's C section. The second macro is used to convert from C to Perl datatype and equivalent to the I's C section. Now proceed on adding the glue code for the new interface. =head2 Importing Constants and Enums into Perl API To I httpd and APR constants and enums into Perl API, edit I. To add a new type of C constants adjust the C<%defines_wanted> variable, for C modify C<%enums_wanted>. For example to import all Cs starting with C add: my %defines_wanted = ( ... APR => { ... flock => [qw{APR_FLOCK_}], ... }, ); When deciding which constants are to be exported, the regular expression will be used, so in our example all matches C will be imported into the Perl API. For example to import an I C for APR, add: my %enums_wanted = ( APR => { map { $_, 1 } qw(apr_read_type) }, ); Notice that I<_e> part at the end of the enum name has gone. in case of Apache constants remove the leading C and terminating C. For example I needs to be added as: my %enums_wanted = ( Apache2 => { map { $_, 1 } qw(conn_keepalive) }, ); After adding/modifying the datastructures make sure to run C or C and verify that the wanted constant or enum were picked by the source scanning process. Simply grep I for the wanted string. For example after adding I enum we can check: % more xs/tables/current/Apache2/ConstantsTable.pm ... 'read_type' => [ 'APR_BLOCK_READ', 'APR_NONBLOCK_READ' ], Of course the newly added constant or enum's typemap should be declared in the appropriate I files, so the XS conversion of arguments will be performed correctly. For example I is an APR enum so it's declared in I: apr_read_type | IV C is used as a typemap, Since enum is just an integer. In more complex cases the typemap can be different. (META: examples) =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/core/mod_perl_specific.pod0000644000177200010010000002132112540623177021222 0ustar SteveNone=head1 NAME mod_perl internals: mod_perl-specific functionality flow =head1 Description This document attempts to help understand the code flow for certain features. This should help to debug problems and add new features. This document auguments L and discusses the internals of the mod_perl-specific features. Make sure to read also: L. META: these notes are a bit out of sync with the latest svn, but will be updated once the innovation dust settles down. =head1 Perl Interpreters How and when Perl interpreters are created: =over =item 1 modperl_hook_init is invoked by one of two paths: Either normally, during the open_logs phase, or during the configuration parsing if a directive needs perl at the early stage (e.g. PerlLoadModule). ap_hook_open_logs() -> # normal mod_perl startup load_module() -> modperl_run() -> # early startup caused by PerlLoadModule =item 2 modperl_hook_init() -E modperl_init(): o modperl_startup() - parent perl is created and started ("-e0"), - top level PerlRequire and PerlModule are run o modperl_interp_init() - modperl_tipool_new() # create/init tipool - modperl_interp_new() # no new perls are created at this stage o modperl_init_vhost() # vhosts are booted, for each vhost run: if +Parent - modperl_startup() # vhost gets its own parent perl (not perl_clone()!) else - vhost's PerlModule/PerlRequire directives are run if any if +(Parent|Clone) - modperl_interp_init() (new tipool, no new perls created) =item 3 Next the post_config hook is run. It immediately returns for non-threaded mpms. Otherwise that's where all the first clones are created (and later their are created on demand when there aren't enough in the pool and more are needed). o modperl_init_clones() creates pools of clones - modperl_tipool_init() (clones the PerlStartInterp number of perls) - interp_pool_grow() - modperl_interp_new() ~ this time perl_clone() is called ~ PL_ptr_table is scratched modperl_xs_dl_handles_clear =back =head1 Filters Apache filters work in the following way. First of all, a filter must be registered by its name, in addition providing a pointer to a function that should be executed when the filter is called and the type of resources it should be called on (e.g., only request's body, the headers, both and others). Once registered, the filter can be inserted into a chain of filters to be executed at run time. For example in the pre_connection phase we can add connection phase filters, and using the ap_hook_insert_filter we can call functions that add the current request's filters. The filters are added using their registered name and a special context variable, which is typed to (void *) so modules can store anything they want there. You can add more than one filter with the same name to the same filter chain. Here is how mod_perl uses this infrastructure: There can be many filters inserted via mod_perl, but they all seen by Apache by four filter names: MODPERL_REQUEST_OUTPUT MODPERL_REQUEST_INPUT MODPERL_CONNECTION_OUTPUT MODPERL_CONNECTION_INPUT XXX: which actually seems to be lowercased by Apache (saw it in gdb), (it handles these in the case insensitive manner?). how does then modperl_filter_add_request works, as it compares *fname with M. These four filter names are registered in modperl_register_hooks(): ap_register_output_filter(MP_FILTER_REQUEST_OUTPUT_NAME, MP_FILTER_HANDLER(modperl_output_filter_handler), AP_FTYPE_RESOURCE); ap_register_input_filter(MP_FILTER_REQUEST_INPUT_NAME, MP_FILTER_HANDLER(modperl_input_filter_handler), AP_FTYPE_RESOURCE); ap_register_output_filter(MP_FILTER_CONNECTION_OUTPUT_NAME, MP_FILTER_HANDLER(modperl_output_filter_handler), AP_FTYPE_CONNECTION); ap_register_input_filter(MP_FILTER_CONNECTION_INPUT_NAME, MP_FILTER_HANDLER(modperl_input_filter_handler), AP_FTYPE_CONNECTION); At run time input filter handlers are always called by modperl_input_filter_handler() and output filter handler by modperl_output_filter_handler(). For example if there are three MODPERL_CONNECTION_INPUT filters in the filters chain, modperl_input_filter_handler() will be called three times. The real Perl filter handler (callback) is stored in ctx-Ehandler, which is retrieved by modperl_{output|input}_filter_handler and run as a normal Perl handler by modperl_run_filter() via modperl_callback(): retrieve ctx->handler modperl_output_filter_handler -> modperl_run_filter -> modperl_callback This trick allows to have more than one filter handler in the filters chain using the same Apache filter name (the real filter's name is stored in ctx-Ehandler-Ename. Now the only missing piece in the puzzle is how and when mod_perl filter handlers are inserted into the filter chain. It happens in three stages. =over =item 1 When the configuration file is parsed, every time a PerlInputFilterHandler or a PerlOutputFilterHandler directive is encountered, its argument (filter handler) is inserted into dcfg-Ehandlers_per_dir[idx] by modperl_cmd_input_filter_handlers() and modperl_cmd_output_filter_handlers(). idx is either MP_INPUT_FILTER_HANDLER or MP_OUTPUT_FILTER_HANDLER. Since they are stored in the dcfg struct, normal merging of parent and child directories applies. =item 2 Next, modperl_hook_post_config calls modperl_mgv_hash_handlers which works through dcfg-Ehandlers_per_dir[idx] and resolves the handlers (via modperl_mgv_resolve), so they are resolved by the time filter handlers are added to the chain in the next step (e.g. the attributes are set if any). =item 3 Now all is left is to add the filters to the appropriate chains at the appropriate time. modperl_register_hooks() adds a pre_connection hook modperl_hook_pre_connection() which inserts connection filters via: modperl_input_filter_add_connection(); modperl_output_filter_add_connection(); modperl_hook_pre_connection() is called during the pre_connection phase. modperl_register_hooks() directly registers the request filters via ap_hook_insert_filter(): modperl_output_filter_add_request modperl_input_filter_add_request functions registered with ap_hook_insert_filter(), will be called when the request record is created and they are supposed to insert request filters if any. All four functions perform a similar thing: loop through dcfg-Ehandlers_per_dir[idx], where idx is per filter type: MP_{INPUT|OUTPUT}_FILTER_HANDLER, pick the filters of the appropriate type and insert them to filter chain using one of the two Apache functions that add filters. Since we have connection and request filters there are four different combinations: ap_add_input_filter( name, (void*)ctx, NULL, c); ap_add_output_filter(name, (void*)ctx, NULL, c); ap_add_input_filter( name, (void*)ctx, r, r->connection); ap_add_output_filter(name, (void*)ctx, r, r->connection); Here the name is one of: MODPERL_REQUEST_OUTPUT MODPERL_REQUEST_INPUT MODPERL_CONNECTION_OUTPUT MODPERL_CONNECTION_INPUT ctx, storing three things: SV *data; modperl_handler_t *handler; PerlInterpreter *perl; we have mentioned ctx-Ehandler already, that's where the real Perl filter handler is stored. ctx-Eperl stores the current perl interpreter (used only in the threaded environment). the last two arguments are the request and connection records. notice that dcfg-Ehandlers_per_dir[idx] stores connection and request filters in the same array, so we have only two arrays, one for input and one for output filters. We know to distinguish between connection and request filters by looking at ctx-Ehandler-Eattrs record, which is derived from the handler subroutine's attributes. Remember that we can have: sub Foo : FilterRequestHandler {} and: sub Bar : FilterConnectionHandler {} For example we can figure out what kind of handler is that via: if (ctx->handler->attrs & MP_FILTER_CONNECTION_HANDLER)) { /* Connection handler */ } else if (ctx->handler->attrs & MP_FILTER_REQUEST_HANDLER)) { /* Request handler */ } else { /* Unknown */ } =back =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/core/mpms.pod0000644000177200010010000000301512540623177016530 0ustar SteveNone=head1 NAME MPMs - Multi-Processing Model Modules =head1 Description Discover what are the available MPMs and how they work with mod_perl. META: This doc is under construction. Owners are wanted. -- pgollucci volunteering =head1 MPMs Overview =head1 The Worker MPM META: incomplete You can test whether running under threaded env via: C #ifdef USE_ITHREADS /* whatever */ #endif When the server is running under the threaded mpm Cthreaded_mpm> is set to true. Caveats: All per-server data is shared between threads, regardless of locking, changing the value of something like ap_document_root changes it for all threads. Not just the current process/request, the way it was in 1.3. So we can't really support modification of things like ap_document_root at request time, unless the mpm is prefork. we could support modification of modperl per-server data by using r-Erequest_config in the same way push_handlers et al is implemented. But it is not possible to use this approach for anything outside of modperl (ap_document_root for example). =head1 The Prefork MPM META: incomplete =head1 The Event MPM =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Philip M. Gollucci Epgollucci (at) p6m7g8.comE =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] Philip M. Gollucci Epgollucci (at) p6m7g8.comE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/debug/0000755000104000010010000000000012540623177017110 5ustar AdministratorsNonemod_perl-2.0.9/docs/devel/debug/c.pod0000644000177200010010000007776712540623177016165 0ustar SteveNone=head1 NAME Debugging mod_perl C Internals =head1 Description This document explains how to debug C code under mod_perl, including mod_perl core itself. For certain debugging purposes you may find useful to read first the following notes on mod_perl internals: L and L. =head1 Debug notes META: needs more organization (if you grok any of the following, patches are welcome) META: there is a new compile-time option in perl-5.8.8+: -DDEBUG_LEAKING_SCALARS, which prints out the addresses of leaked SVs and new_SV() can be used to discover where those SVs were allocated. (see perlhack.pod for more info) META: httpd has quite a lot of useful debug info: http://httpd.apache.org/dev/debugging.html (need to add this link to mp1 docs as well) META: profiling: need a new entry of profiling. + running mod_perl under gprof: Defining GPROF when compiling uses the moncontrol() function to disable gprof profiling in the parent, and enable it only for request processing in children (or in one_process mode). META: Jeff Trawick wrote a few useful debug modules, for httpd-2.1: mod_backtrace (similar to bt in gdb, but doesn't require the core file) and mod_whatkilledus (gives the info about the request that caused the segfault). http://httpd.apache.org/~trawick/exception_hook.html =head2 Entering Single Server Mode Most of the time, when debugging Apache or mod_perl, one needs to start Apache in a single server mode and not allow it to detach itself from the initial process. This is accomplished with: % httpd -DONE_PROCESS -DNO_DETACH =head2 Setting gdb Breakpoints with mod_perl Built as DSO If mod_perl is built as a DSO module, you cannot set the breakpoint in the mod_perl source files when the I program gets loaded into the debugger. The reason is simple: At this moment I has no idea about mod_perl module yet. After the configuration file is processed and the mod_perl DSO module is loaded then the breakpoints in the source of mod_perl itself can be set. The trick is to break at I, let it load I, then you can set breakpoints anywhere in the modperl code: % gdb httpd (gdb) b apr_dso_load (gdb) run -DONE_PROCESS [New Thread 1024 (LWP 1600)] [Switching to Thread 1024 (LWP 1600)] Breakpoint 1, apr_dso_load (res_handle=0xbfffb48c, path=0x811adcc "/home/stas/apache.org/modperl-perlmodule/src/modules/perl/libmodperl.so", pool=0x80e1a3c) at dso.c:138 141 void *os_handle = dlopen(path, RTLD_NOW | RTLD_GLOBAL); (gdb) finish ... Value returned is $1 = 0 (gdb) b modperl_hook_init (gdb) continue This example shows how to set a breakpoint at I. To automate things you can put those in the I<.gdb-jump-to-init> file: b apr_dso_load run -DONE_PROCESS -d `pwd`/t -f `pwd`/t/conf/httpd.conf finish b modperl_hook_init continue and then start the debugger with: % gdb /home/stas/httpd-2.0/bin/httpd -command \ `pwd`/t/.gdb-jump-to-init =head2 Starting the Server Fast under gdb When the server is started under gdb, it first loads the symbol tables of the dynamic libraries that it sees going to be used. Some versions of gdb may take ages to complete this task, which makes the debugging very irritating if you have to restart the server all the time and it doesn't happen immediately. The trick is to set the C flag to 0: set auto-solib-add 0 as early as possible in I<~/.gdbinit> file. With this setting in effect, you can load only the needed dynamic libraries with I gdb command. Remember that in order to set a breakpoint and step through the code inside a certain dynamic library you have to load it first. For example consider this gdb commands file: .gdb-commands ------------ file ~/httpd/prefork/bin/httpd handle SIGPIPE pass handle SIGPIPE nostop set auto-solib-add 0 b ap_run_pre_config run -d `pwd`/t -f `pwd`/t/conf/httpd.conf \ -DONE_PROCESS -DAPACHE2 -DPERL_USEITHREADS sharedlibrary mod_perl b modperl_hook_init # start: modperl_hook_init continue # restart: ap_run_pre_config continue # restart: modperl_hook_init continue b apr_poll continue # load APR/PerlIO/PerlIO.so sharedlibrary PerlIO b PerlIOAPR_open which can be used as: % gdb -command=.gdb-commands This script stops in I, so you can step through the mod_perl startup. We had to use the I so we can load the I library as explained earlier. Since httpd restarts on the start, we have to I until we hit I second time, where we can set the breakpoint at I, the very point where httpd polls for new request and run again I so it'll stop at I. This particular script passes over modperl_hook_init(), since we run the C command a few times to reach the I breakpoint. See the L section for standalone script examples. When gdb stops at the function I it's a time to start the client, that will issue a request that will exercise the server execution path we want to debug. For example to debug the implementation of C we may run: % t/TEST -run apr/pool which will trigger the run of a handler in I which in turn tests the C code. But before that if we want to debug the server response we need to set breakpoints in the libraries we want to debug. For example if we want to debug the function C which resides in I we first load it and then we can set a breakpoint in it. Notice that gdb may not be able to load a library if it wasn't referenced by any of the code. In this case we have to load this library at the server startup. In our example we load: PerlModule APR::PerlIO in I. To check which libraries' symbol tables can be loaded in gdb, run (when the server has been started): gdb> info sharedlibrary which also shows which libraries are loaded already. Also notice that you don't have to type the full path of the library when trying to load them, even a partial name will suffice. In our commands file example we have used C instead of saying C. If you want to set breakpoints and step through the code in the Perl and APR core libraries you should load their appropriate libraries: gdb> sharedlibrary libperl gdb> sharedlibrary libapr gdb> sharedlibrary libaprutil Setting I to 0 makes the debugging process unusual, since originally gdb was loading the dynamic libraries automatically, whereas now it doesn't. This is the price one has to pay to get the debugger starting the program very fast. Hopefully the future versions of gdb will improve. Just remember that if you try to I and debugger doesn't do anything, that means that the library the function is located in wasn't loaded. The solution is to create a commands file as explained in the beginning of this section and craft the startup script the way you need to avoid extra typing and mistakes when repeating the same debugging process again and again. Under threaded mpms (e.g. worker), it's possible that you won't be able to debug unless you tell gdb to load the symbols from the threads library. So for example if on your OS that library is called I make sure to run: sharedlibrary libpthread somewhere after the program has started. See the L section for examples. Another important thing is that whenever you want to be able to see the source code for the code you are stepping through, the library or the executable you are in must have the debug symbols present. That means that the code has to be compiled with I<-g> option for the gcc compiler. For example if I want to set a breakpoint in /lib/libc.so, I can do that by loading: gdb> sharedlibrary /lib/libc.so But most likely that this library has the debug symbols stripped off, so while gdb will be able to break at the breakpoint set inside this library, you won't be able to step through the code. In order to do so, recompile the library to add the debug symbols. If debug code in response handler you usually start the client after the server was started, when doing this a lot you may find it annoying to need to wait before the client can be started. Therefore you can use a few tricks to do it in one command. If the server starts fast you can use sleep(): % ddd -command=.debug-modperl-init & ; \ sleep 2 ; t/TEST -verbose -run apr/pool or the C framework's C<-ping=block> option: % ddd -command=.debug-modperl-init & ; \ t/TEST -verbose -run -ping=block apr/pool which will block till the server starts responding, and only then will try to run the test. =head2 Precooked gdb Startup Scripts Here are a few startup scripts you can use with gdb to accomplish one of the common debugging tasks. To execute the startup script, simply run: % gdb -command=.debug-script-filename They can be run under gdb and any of the gdb front-ends. For example to run the scripts under C substitute C with C: % ddd -command=.debug-script-filename =over =item * Debugging mod_perl Initialization The F startup script breaks at the C function, which is useful for debugging code at the modperl's initialization phase. =item * Debugging mod_perl's Hooks Registeration With httpd Similar to the previous startup script, the F startup script breaks at the C, which is the very first hook called in the mod_perl land. Therefore use this one if you need to start debugging at an even earlier entry point into mod_perl. Refer to the notes inside the script to adjust it for a specific I file. =item * Debugging mod_perl XS Extensions The F startup script breaks at the C function implemented in I. This is an example of debugging code in XS Extensions. For this particular example the complete test case is: % ddd -command=.debug-modperl-xs & \ t/TEST -v -run -ping=block filter/api When I test is running it calls mpxs_Apache2__Filter_print() which is when the breakpoint is reached. =item * Debugging code in shared objects created by C This is not strictly related to mod_perl, but sometimes when trying to reproduce a problem (e.g. for a p5p bug-report) outside mod_perl, the code has to be written in C. And in certain cases, Inline can be just the right tool to do it quickly. However if you want to interactively debug the library that it creates, it might get tricky. So similar to the previous sections, here is a gdb F startup script that will save you a lot of time. All the details and a sample perl script are inside the gdb script. =back =head1 Analyzing Dumped Core Files When your application dies with the I error (which is generated by the C signal) and optionally generates a F file you can use C or a similar debugger to find out what caused the I (or a I as we often call it). =head2 Getting Ready to Debug In order to debug the F file you may need to recompile Perl and mod_perl with debugging symbols. Usually you have to recompile only mod_perl, but if the F dump happens in the I library and you want to see the whole backtrace, you need to recompile Perl as well. It may also occur inside httpd or 3rd party module, in which case you will need to recompile those. The following notes should help to accomplish the right thing: =over =item * mod_perl rebuild mod_perl with C. % perl Makefile.PL MP_DEBUG=1 ... % make && make test && make install Building mod_perl with C will: =over =item 1 add C<-g> to C =item 1 turn on C (tracing) =item 1 Set C =item 1 Link against F if F<$Config{archlibexp}/CORE/libperld$Config{lib_ext}> exists. =back =item * httpd If the segfault happens inside I or I calls, rebuild httpd with C<--enable-maintainer-mode>: % CFLAGS="-g" ./configure --enable-maintainer-mode ... % make && make install =item * perl If the segfault happens inside I calls, rebuild perl with C<-Doptimize='-g'>: % ./Configure -Doptimize='-g' ... % make && make test && make install Remember to recompile mod_perl if you've recompiled perl. =item * 3rd party perl modules if the trace happens in one of the 3rd party perl modules, make sure to rebuild them, now that you've perl re-built with debugging flags. They will automatically pick the right compile flags from perl. =back Now the software is ready for a proper debug. =head2 Causing a SegFault Most likely you already have the segfault situation, but sometimes you want to create one. For example sometimes you need to make sure that L. For that purpose you can use C available from CPAN: http://search.cpan.org/dist/Debug-FaultAutoBT/ % perl -MDebug::DumpCore -eDebug::DumpCore::segv Segmentation fault (core dumped) Notice that you could use Perl's C to achieve the same goal: % perl -le 'dump' Abort (core dumped) but the generated in that case backtrace is not very useful for learning purposes. If all you want to test is whether L then Perl's C will do just fine. =head2 Getting the core File Dumped Now let's get the F file dumped from within the mod_perl server. Sometimes the program aborts abnormally via the SIGSEGV signal (I), but no F file is dumped. And without the F file it's hard to find the cause of the problem, unless you run the program inside C or another debugger in first place. In order to get the F file, the application has to: =over =item 1 have the effective UID the same as real UID (the same goes for GID). Which is the case of mod_perl unless you modify these settings in the program. =item 1 be running from a directory which at the moment of the I is writable by the process that received this signal. Notice that the program might change its current directory during its run, so it's possible that the F file will need to be dumped in a different directory from the one the program was originally started from. Under Apache C is used as the default directory. Since that directory is sually not writable by the user running Apache, it's possible to use the directive C (available since Apache 2.0.45) to tell Apache to dump the core file elsewhere. =item 1 be started from a shell process with sufficient resource allocations for the F file to be dumped. You can override the default setting from within a shell script if the process is not started manually. In addition you can use C to manipulate the setting from within the code as well. You can use C for C and C for C to check and adjust the resource allocation. For example inside C, you may set the core file size to unlimited: panic% ulimit -c unlimited or for C: panic% limit coredumpsize unlimited For example you can set an upper limit on the F file size to 8MB with: panic% ulimit -c 8388608 So if the core file is bigger than 8MB it will be not created. =item 1 Of course you have to make sure that you have enough disk space to create a big core file (mod_perl F files tend to be of a few MB in size). =back Note that when you are running the program under a debugger like C, which traps the C signal, the F file will not be dumped. Instead it allows you to examine the program stack and other things without having the F file. So let's write a simple script that uses C: core_dump.pl ------------ use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Debug::DumpCore (); use Cwd; my $r = shift; $r->content_type('text/plain'); my $dir = getcwd(); $r->print("The core should be found at $dir/core.$$\n"); $r->rflush; Debug::DumpCore::segv(); In this script we load the C, C, C and C modules, then we acquire the Apache request object and set the HTTP response header. Now we come to the real part -- we get the current working directory, print out the location of the F file that we are about to dump and finally we call C which dumps the F file. Before we run the script we make sure that the shell sets the F file size to be unlimited, start the server in single server mode as a non-root user and generate a request to the script: panic% cd /home/httpd/bin panic% limit coredumpsize unlimited panic% ./httpd -DONE_PROCESS -DNO_DETACH # issue a request here Segmentation fault (core dumped) Our browser prints out: The core should be found at /home/httpd/bin/core.12345 And indeed the core file appears where we were told it will be: panic% ls -l /home/httpd/bin/core.12345 -rw------- 1 stas stas 13758464 Nov 23 18:33 /home/httpd/bin/core.12345 As you can see it's about 14MB F file. Notice that mod_perl was started as user I, which had write permission for directory I. Notice that on certain platforms you get no PID digits appended to the core file name, so sometimes, it'll be just F. =head2 Analyzing the core File First we start C: panic% gdb /home/httpd/bin/httpd /home/httpd/bin/core.12345 with the location of the mod_perl executable and the core file as the arguments. To see the backtrace you run the I or the I command: (gdb) bt #0 0x407ab26c in crash_now_for_real ( suicide_message=0x407ad300 "Cannot stand this life anymore") at DumpCore.xs:10 #1 0x407ab293 in crash_now ( suicide_message=0x407ad300 "Cannot stand this life anymore", attempt_num=42) at DumpCore.xs:17 #2 0x407ab39b in XS_Debug__DumpCore_segv (my_perl=0x86a9298, cv=0x8d36750) at DumpCore.xs:26 #3 0x40540649 in Perl_pp_entersub () from .../libperl.so ... #7 0x404530cc in modperl_callback () from .../mod_perl.so Well, you can see the last commands, but our perl and mod_perl are probably without the debug symbols. This is not the kind of trace you should send as a part of your bug report, because a lot of important information that should aid resolve the reported problem is missing. Therefore the next step is to recompile Perl and mod_perl (and may be Apache) with debug symbols as L in this chapter. Now when we repeat the process of starting the server, issuing a request and getting the core file, after which we run C again against the executable and the dumped F file. panic% gdb /home/httpd/bin/httpd /home/httpd/bin/core.6789 Now we can see the whole backtrace: (gdb) bt #0 0x407ab26c in crash_now_for_real ( suicide_message=0x407ad300 "Cannot stand this life anymore") at DumpCore.xs:10 #1 0x407ab293 in crash_now ( suicide_message=0x407ad300 "Cannot stand this life anymore", attempt_num=42) at DumpCore.xs:17 #2 0x407ab39b in XS_Debug__DumpCore_segv (my_perl=0x86a9298, cv=0x8d36750) at DumpCore.xs:26 #3 0x40540649 in Perl_pp_entersub (my_perl=0x86a9298) at pp_hot.c:2890 #4 0x4051ca4d in Perl_runops_debug (my_perl=0x86a9298) at dump.c:1449 #5 0x404c1ea3 in S_call_body (my_perl=0x86a9298, myop=0xbfffed90, is_eval=0) at perl.c:2298 #6 0x404c19cf in Perl_call_sv (my_perl=0x86a9298, sv=0x8cd0914, flags=4) at perl.c:2216 #7 0x404530cc in modperl_callback (my_perl=0x86a9298, handler=0x81ba6d8, p=0x8d16828, r=0x8d16860, s=0x813d238, args=0x8d018d8) at modperl_callback.c:102 #8 0x404539ce in modperl_callback_run_handlers (idx=6, type=4, r=0x8d16860, c=0x0, s=0x813d238, pconf=0x0, plog=0x0, ptemp=0x0, run_mode=MP_HOOK_RUN_FIRST) at modperl_callback.c:263 #9 0x40453c2d in modperl_callback_per_dir (idx=6, r=0x8d16860, run_mode=MP_HOOK_RUN_FIRST) at modperl_callback.c:351 #10 0x4044c728 in modperl_response_handler_run (r=0x8d16860, finish=0) at mod_perl.c:911 #11 0x4044cadb in modperl_response_handler_cgi (r=0x8d16860) at mod_perl.c:1006 #12 0x080db2bc in ap_run_handler (r=0x8d16860) at config.c:151 #13 0x080dba19 in ap_invoke_handler (r=0x8d16860) at config.c:363 #14 0x080a9953 in ap_process_request (r=0x8d16860) at http_request.c:246 #15 0x080a3ef8 in ap_process_http_connection (c=0x8d10920) at http_core.c:250 #16 0x080e7efc in ap_run_process_connection (c=0x8d10920) at connection.c:42 #17 0x080e82f8 in ap_process_connection (c=0x8d10920, csd=0x8d10848) at connection.c:175 #18 0x080d9b6d in child_main (child_num_arg=0) at prefork.c:609 #19 0x080d9c44 in make_child (s=0x813d238, slot=0) at prefork.c:649 #20 0x080d9d6a in startup_children (number_to_start=2) at prefork.c:721 #21 0x080da177 in ap_mpm_run (_pconf=0x81360a8, plog=0x817e1c8, s=0x813d238) at prefork.c:940 #22 0x080e0de8 in main (argc=11, argv=0xbffff284) at main.c:619 That's the perfect back trace to send as a part of the bug report. Reading the trace from bottom to top, we can see that it starts with Apache calls, followed by mod_perl calls which end up in C which calls the Perl program via C. Notice that in our example we knew what script has caused the Segmentation fault. In a real world the chances are that you will find the F file without any clue to which of handler or script has triggered it. The special I C macro comes to help: For perl enabled with threads that's: define curinfo printf "%d:%s\n", my_perl->Tcurcop->cop_line, \ my_perl->Tcurcop->cop_file end For a non-threaded version that's: define curinfo printf "%d:%s\n", PL_curcop->cop_line, \ ((XPV*)(*(XPVGV*)PL_curcop->cop_filegv->sv_any)\ ->xgv_gp->gp_sv->sv_any)->xpv_pv end Simply past the correct version at the gdb prompt (in this example the perl is threaded): (gdb) define curinfo Type commands for definition of "curinfo". End with a line saying just "end". > printf "%d:%s\n", my_perl->Tcurcop->cop_line, \ my_perl->Tcurcop->cop_file >end and now we can call it: (gdb) curinfo No symbol "my_perl" in current context. Oops, the function where the segfault has happened doesn't have the perl context, so we need to look at the backtrace and find the first function which accepts the C argument (this is because we use a threaded perl). In this example this is the second frame: #2 0x407ab39b in XS_Debug__DumpCore_segv (my_perl=0x86a9298, cv=0x8d36750) at DumpCore.xs:26 therefore we need to go two frames up: (gdb) up 2 #2 0x407ab39b in XS_Debug__DumpCore_segv (my_perl=0x86a9298, cv=0x8d36750) at DumpCore.xs:26 26 in DumpCore.xs and now we call C again: gdb) curinfo 14:/home/httpd/cgi-bin/core_dump.pl Et voilà, we can see that the segfault was triggered on line 14 of F, which has the line: Debug::DumpCore::segv(); And we are done. These are the bits of information that are important to extract and include in your bug report in order for us to be able to reproduce and resolve a problem. In this example it was the full backtrace, the filename and line where the faulty function was called (the faulty function is C) and the actual line where the Segmentation fault occured (C at C). =head2 Analyzing the core File Automatically If the core file(s) are found in the mod_perl source directory, when running F the core file backtraces will be automatically extracted and added to the report if the perl module C is installed. See the function C in F if you want to see how it is invoked or refer to the C manpage. =head2 Obtaining core Files under Solaris There are two ways to get core files under Solaris. The first is by configuring the system to allow core dumps, the second is by stopping the process when it receives the SIGSEGV signal and "manually" obtaining the core file. =head3 Configuring Solaris to Allow core Dumps By default, Solaris 8 won't allow a setuid process to write a core file to the file system. Since apache starts as root and spawns children as 'nobody', core dumps won't produce core files unless you modify the system settings. To see the current settings, run the coreadm command with no parameters and you'll see: % coreadm global core file pattern: init core file pattern: core global core dumps: disabled per-process core dumps: enabled global setid core dumps: disabled per-process setid core dumps: disabled global core dump logging: disabled These settings are stored in the I file, but you should set them with the coreadm utility. As super-user, you can run coreadm with -g to set the pattern and path for core files (you can use a few variables here) and -e to enable some of the disabled items. After setting a new pattern, enabling global, global-setid, and log, and rebooting the system (reboot is required), the new settings look like: % coreadm global core file pattern: /usr/local/apache/cores/core.%f.%p init core file pattern: core global core dumps: enabled per-process core dumps: enabled global setid core dumps: enabled per-process setid core dumps: disabled global core dump logging: enabled Now you'll start to see core files in the designated cores directory and they will look like I where httpd is the name of the executable and the 2222 is the process id. The new core files will be read/write for root only to maintain some security, and you should probably do this on development systems only. =head3 Manually Obtaining core Dumps On Solaris the following method can be used to generate a core file. =over =item 1 Use truss(1) as I to stop a process on a segfault: panic% truss -f -l -t \!all -s \!SIGALRM -S SIGSEGV -p or, to monitor all httpd processes (from bash): panic% for pid in `ps -eaf -o pid,comm | fgrep httpd | cut -d'/' -f1`; do truss -f -l -t \!all -s \!SIGALRM -S SIGSEGV -p $pid 2>&1 & done The used truss(1) options are: =over =item * C<-f> - follow forks. =item * C<-l> - (that's an el) includes the thread-id and the pid (the pid is what we want). =item * C<-t> - specifies the syscalls to trace, =item * !all - turns off the tracing of syscalls specified by C<-t> =item * C<-s> - specifies signals to trace and the C turns off the numerous alarms Apache creates. =item * C<-S> - specifies signals that stop the process. =item * C<-p> - is used to specify the pid. =back Instead of attaching to the process, you can start it under truss(1): panic% truss -f -l -t \!all -s \!SIGALRM -S SIGSEGV \ /usr/local/bin/httpd -f httpd.conf 2>&1 & =item 1 Watch the I file for reaped processes, as when they get SISSEGV signals. When the process is reaped it's stopped but not killed. =item 1 Use gcore(1) to get a F of stopped process or attach to it with gdb(1). For example if the process id is 662: panic% gcore 662 gcore: core.662 dumped Now you can load this F file in gdb(1). =item 1 C the stopped process. Kill the truss(1) processes as well, if you don't need to trap other segfaults. =back Obviously, this isn't great to be doing on a production system since truss(1) stops the process after it dumps core and prevents Apache from reaping it. So, you could hit the clients/threads limit if you segfault a lot. =head1 Debugging Threaded MPMs =head2 Useful Information from gdb Manual Debugging programs with multiple threads: http://sources.redhat.com/gdb/current/onlinedocs/gdb_5.html#SEC25 Stopping and starting multi-thread programs: http://sources.redhat.com/gdb/current/onlinedocs/gdb_6.html#SEC40 =head2 libpthread when using: set auto-solib-add 0 make sure to: sharedlibrary libpthread (or whatever the shared library is used on your OS) without which you may have problems to debug the threaded mpm mod_perl. =head1 Defining and Using Custom gdb Macros GDB provides two ways to store sequences of commands for execution as a unit: user-defined commands and command files. See: http://sources.redhat.com/gdb/current/onlinedocs/gdb_21.html Apache 2.0 source comes with a nice pack of macros and can be found in I. To use it issue: gdb> source /wherever/httpd-2.0/.gdbinit Now if for example you want to dump the contents of the bucket brigade, you can do: gdb> dump_brigade my_brigade where C is the pointer to the bucket brigade that you want to debug. mod_perl 1.0 has a similar file (I) mainly including handy macros for dumping Perl datastructures, however it works only with non-threaded Perls. But otherwise it's useful in debugging mod_perl 2.0 as well. =head1 Expanding C Macros Perl, mod_perl and httpd C code makes an extensive use of C macros, which sometimes use many other macros in their definitions, so it becomes quite a task to figure out how to figure out what a certain macro expands to, especially when the macro expands to different values in differnt environments. Luckily there are ways to automate the expansion process. =head2 Expanding C Macros with C The mod_perl I's include a rule for macro expansions which you can find by looking for the C rule. To expand all macros in a certain C file, you should run C, which will create I with all macros expanded in it. For example to create I with all macros used in I: % cd modperl-2.0/xs/APR/PerlIO % make apr_perlio.i the I file now lists all the macros: % less apr_perlio.i # 1 "apr_perlio.c" # 1 "" #define __VERSION__ "3.1.1 (Mandrake Linux 8.3 3.1.1-0.4mdk)" ... =head2 Expanding C Macros with C With gcc-3.1 or higher and gdb-5.2-dev or higher you can expand macros in gdb, when you step through the code. e.g.: (gdb) macro expand pTHX_ expands to: PerlInterpreter *my_perl __attribute__((unused)), (gdb) macro expand PL_dirty expands to: (*Perl_Tdirty_ptr(my_perl)) For each library that you want to use this feature with you have to compile it with: CFLAGS="-gdwarf-2 -g3" or whatever is appropriate for your system, refer to the gcc manpage for more info. To compile perl with this debug feature, pass C<-Doptimize='-gdwarf-2 -g3'> to C<./Configure>. For Apache run: CFLAGS="-gdwarf-2 -g3" ./configure [...] for mod_perl you don't have to do anything, as it'll pick the C<$Config{optimize}> Perl flags automatically, if Perl is compiled with C<-DDEBUGGING> (which is implied on most systems, if you use C<-Doptimize='-g'> or similar.) Notice that this will make your libraries B! e.g. on Linux 2.4 Perl 5.8.0's normal I is about 0.8MB on linux, compiled with C<-Doptimize='-g'> about 2.7MB and with C<-Doptimize='-gdwarf-2 -g3'> 12.5MB. C is also becomes about 10 times bigger with this feature enabled. I instead of 0.2k becomes 11MB. You get the idea. Of course since you may want this only during the development/debugging, that shouldn't be a problem. The complete details are at: http://sources.redhat.com/gdb/current/onlinedocs/gdb_10.html#SEC69 =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/debug/code/0000755000104000010010000000000012540623177020022 5ustar AdministratorsNonemod_perl-2.0.9/docs/devel/debug/code/.debug-inline0000644000177200010010000000277412540623177020476 0ustar SteveNone # save this file as .debug and execute this as: # gdb -command=.debug # or if you prefer gui # ddd -command=.debug # # NOTE: Adjust the path to the perl executable # also this perl should be built with debug enabled file /usr/bin/perl # If you need to debug with gdb a live script and not a library, you # are going to have a hard time to set any breakpoint in the C code. # the workaround is force Inline to compile and load .so, by putting # all the code in the BEGIN {} block and call Inline->init from there. # # you also need to prevent from Inline deleting autogenerated .xs so # you can step through the C source code, and of course you need to # add '-g' so .so won't be stripped of debug info # # here is a sample perl script that can be used with this gdb script # # test.pl # #-----# # use strict; # use warnings; # # BEGIN { # use Inline Config => # #FORCE_BUILD => 1, # CLEAN_AFTER_BUILD => 0; # # use Inline C => Config => # OPTIMIZE => '-g'; # # use Inline C => <init; # # } # # my_bp(); tb main # NOTE: adjust the name of the script that you run run test.pl # when Perl_runops_debug breakpoint is hit Inline will already load # the autogenerated .so, so we can set the bp in it (that's only if # you have run 'Inline->init' inside the BEGIN {} block b S_run_body continue b Perl_runops_debug continue # here you set your breakpoints b my_bp continue mod_perl-2.0.9/docs/devel/debug/code/.debug-modperl-init0000644000177200010010000000242712540623177021616 0ustar SteveNone# This gdb startup script breaks at the modperl_hook_init() function, # which is useful for debug things at the modperl init phase. # # Invoke as: # gdb -command=.debug-modperl-init # # see ADJUST notes for things that may need to be adjusted # ADJUST: the path to the httpd executable if needed file ~/httpd/worker/bin/httpd handle SIGPIPE nostop handle SIGPIPE pass set auto-solib-add 0 define myrun tbreak main break ap_run_pre_config # ADJUST: the httpd.conf file's path if needed # ADJUST: add -DPERL_USEITHREADS to debug threaded mpms run -d `pwd`/t -f `pwd`/t/conf/httpd.conf -DONE_PROCESS -DAPACHE2 continue end define modperl_init sharedlibrary mod_perl b modperl_hook_init continue end define sharedap # ADJUST: uncomment next line to debug threaded mpms #sharedlibrary libpthread sharedlibrary apr sharedlibrary aprutil #sharedlibrary mod_ssl.so continue end define sharedperl sharedlibrary libperl end # start the server and run till modperl_hook_init on start myrun modperl_init # ADJUST: uncomment to reach modperl_hook_init on restart #continue #continue # ADJUST: uncomment if you need to step through the code in apr libs #sharedap # ADJUST: uncomment if you need to step through the code in perlib #sharedperl mod_perl-2.0.9/docs/devel/debug/code/.debug-modperl-register0000644000177200010010000000452312540623177022476 0ustar SteveNone# This gdb startup script allows to break at the very first invocation # of mod_perl initialization, just after it was loaded. When the # perl_module is loaded, and its pointer struct is added via # ap_add_module(), the first hook that will be called is # modperl_register_hooks(). # # Invoke as: # gdb -command=.debug-modperl-register # # see ADJUST notes for things that may need to be adjusted define sharedap sharedlibrary apr sharedlibrary aprutil #sharedlibrary mod_ssl.so end define sharedperl sharedlibrary libperl end ### Run ### # ADJUST: the path to the httpd executable if needed file ~/httpd/prefork/bin/httpd handle SIGPIPE nostop handle SIGPIPE pass set auto-solib-add 0 tbreak main # assuming that mod_dso is compiled in b load_module # ADJUST: the httpd.conf file's path if needed # ADJUST: add -DPERL_USEITHREADS to debug threaded mpms run -d `pwd`/t -f `pwd`/t/conf/httpd.conf \ -DONE_PROCESS -DNO_DETACH -DAPACHE2 # skip over 'tbreak main' continue # In order to set the breakpoint in mod_perl.so, we need to get to # the point where it's loaded. # # With static mod_perl, the bp can be set right away # # With DSO mod_perl, mod_dso's load_module() loads the mod_perl.so # object and it immediately calls ap_add_module(), which calls # modperl_register_hooks(). So if we want to bp at the latter, we need # to stop at load_module(), set the 'bp modperl_register_hooks' and # then continue. # Assuming that 'LoadModule perl_module' is the first LoadModule # directive in httpd.conf, you need just one 'continue' after # 'ap_add_module'. If it's not the first one, you need to add as many # 'continue' commands as the number of 'LoadModule foo' before # perl_module, but before setting the 'ap_add_module' bp. # # If mod_perl is compiled statically, everything is already preloaded, # so you can set modperl_* the breakpoints right away b ap_add_module continue sharedlibrary mod_perl b modperl_register_hooks continue #b modperl_hook_init #b modperl_config_srv_create #b modperl_startup #b modperl_init_vhost #b modperl_dir_config #b modperl_cmd_load_module #modperl_config_apply_PerlModule # ADJUST: uncomment next line to debug threaded mpms #sharedlibrary libpthread # ADJUST: uncomment if you need to step through the code in apr libs #sharedap # ADJUST: uncomment if you need to step through the code in perlib #sharedperl mod_perl-2.0.9/docs/devel/debug/code/.debug-modperl-xs0000644000177200010010000000266112540623177021305 0ustar SteveNone# This gdb startup script breaks at the mpxs_Apache__Filter_print() # function from the XS code, as an example how you can debug the code # in XS extensions. # # Invoke as: # gdb -command=.debug-modperl-xs # and then run: # t/TEST -v -run -ping=block filter/api # # see ADJUST notes for things that may need to be adjusted # ADJUST: the path to the httpd executable if needed file /home/stas/httpd/worker/bin/httpd handle SIGPIPE nostop handle SIGPIPE pass set auto-solib-add 0 define myrun tbreak main break ap_run_pre_config # ADJUST: the httpd.conf file's path if needed # ADJUST: add -DPERL_USEITHREADS to debug threaded mpms run -d `pwd`/t -f `pwd`/t/conf/httpd.conf \ -DONE_PROCESS -DNO_DETACH -DAPACHE2 continue end define sharedap # ADJUST: uncomment next line to debug threaded mpms #sharedlibrary libpthread sharedlibrary apr sharedlibrary aprutil #sharedlibrary mod_ssl.so continue end define sharedperl sharedlibrary libperl end define gopoll b apr_poll continue continue end define mybp # load Apache/Filter.so sharedlibrary Filter b mpxs_Apache__Filter_print # no longer needed and they just make debugging harder under threads disable 2 disable 3 continue end myrun gopoll mybp # ADJUST: uncomment if you need to step through the code in apr libs #sharedap # ADJUST: uncomment if you need to step through the code in perlib #sharedperl mod_perl-2.0.9/docs/devel/debug/perl.pod0000644000177200010010000000245112540623177016657 0ustar SteveNone=head1 NAME Debugging mod_perl Perl Internals =head1 Description This document explains how to debug Perl code under mod_perl. Most of the L applies to mod_perl 2.0: =head2 Detecting Hanging Processes See L for the explanation, but under mp2 to use signals to detect where the process is spinning, you can't use C<$SIG{USR2}>, you have to use POSIX signals. i.e. the code becomes: use Carp (); use POSIX qw(SIGUSR2); my $mask = POSIX::SigSet->new( SIGUSR2 ); my $action = POSIX::SigAction->new(\&tell_where_spinning, $mask); my $oldaction = POSIX::SigAction->new(); POSIX::sigaction(SIGUSR2, $action, $oldaction ); sub tell_where_spinning { Carp::confess("caught SIGUSR2!"); }; and then: % kill USR2 and watch for the trace in F. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/help/0000755000104000010010000000000012540623177016752 5ustar AdministratorsNonemod_perl-2.0.9/docs/devel/help/help.pod0000644000177200010010000001223012540623177016503 0ustar SteveNone=head1 NAME Getting Help with mod_perl 2.0 Core Development =head1 Description This document covers the resources available to the mod_perl 2.0 core developer. Please notice that you probably want to read the L if you have problems using mod_perl 2.0. The following mailing lists and resources can be of a major interest to the mod_perl 2.0 developers. =head1 mod_perl =head2 Submitting Patches If you submit patches the I manpage can be very useful. You can find it I or similar or read it online at http://sunsite.ualberta.ca/Documentation/Misc/perl-5.6.1/Porting/patching.html. Note that we prefer the patches inlined into an email. This makes easier to comment on them. If your email client mangles the spacing and wraps lines, then send them as MIME attachments. =head2 mod_perl 2.0 Core Development Discussion List This list is used by the mod_perl 2.0 core developers to discuss design issues, solve problems, munch on patches and exchange ideas. =over =item * mailing list subscription: mailto:dev-subscribe@perl.apache.org =item * archive: http://marc.theaimsgroup.com/?l=apache-modperl-dev&r=1&w=2#apache-modperl-dev =back When reporting problems, be sure to include the output of: % perl build/config.pl which generates the output from: =over 4 =item perl -V =item httpd -V =item Makefile.PL options =back Please use the output generated by I utility. If you get segmentation faults please send the L to the modperl developers list. =head2 mod_perl 2.0 Core Development SVN Commits List This list's traffic is comprised of solely svn commits, so this is the place to be if you want to see mod_perl 2.0 evolve before your eyes. =over =item * mailing list subscription: mailto:modperl-cvs-subscribe@perl.apache.org =item * archive: http://marc.theaimsgroup.com/?l=apache-modperl-cvs&r=1&w=2#apache-modperl-cvs =back =head2 Apache-Test The C project, originally developed as a part of mod_perl 2.0, is now a part of the Apache C project. You get this repository automatically when checking out the mod_perl-2.0 svn repository or you could check it out explicitly via: % svn co http://svn.apache.org/repos/asf/perl/Apache-Test/trunk/ Apache-Test The module is discussed on the mod_perl development mailing list. Commit changes go to the mod_perl svn commit mailing list. Both lists are covered in the preceding sections. =head1 Apache =head2 httpd 2.0 =over =item discussion/problems report: mailing list subscription: mailto:dev-subscribe@httpd.apache.org archive: http://marc.theaimsgroup.com/?l=apache-new-httpd&r=1&w= =item svn commits mailing list subscription: mailto:httpd-2.0-cvs-subscribe@perl.apache.org archive: http://marc.theaimsgroup.com/?l=apache-cvs&r=1&w=2 =back =over =item * Apache source code cross-reference (LXR): http://lxr.webperf.org/ =item * Apache source code through Doxygen documentation system: http://docx.webperf.org/ =item * =back =head2 Apache Portable Runtime (APR) The Apache Portable Run-time libraries have been designed to provide a common interface to low level routines across any platform. mod_perl comes with a partial Perl APR API. =over =item discussion/problems report: mailing list subscription: mailto:apr-dev-subscribe@perl.apache.org archive: http://marc.theaimsgroup.com/?l=apr-dev&r=1&w=2 =item svn commits mailing list subscription: mailto:apr-cvs-subscribe@perl.apache.org archive: http://marc.theaimsgroup.com/?l=apr-cvs&r=1&w=2 =back =head2 Perl 5 Currently mod_perl 2.0 requires perl 5.6.1 and higher. If you think you have found a bug in perl 5 report it to the perl5-porters mailing list. Otherwise please choose the appropriate list from the extensive perl related lists: http://lists.perl.org/. =over =item discussion/problems reports: mailing list subscription: mailto:perl5-porters-subscribe@perl.org archive: http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ and http://archive.develooper.com/perl5-porters@perl.org/ news gateway: news://news.perl.com/perl.porters-gw/ =item Perl Dev Resources http://dev.perl.org/ =item perforce Perl uses C for its source revision control, see I manpage coming with Perl for more information. the perforce repository: http://public.activestate.com/gsar/APC/ or ftp://ftp.linux.activestate.com/pub/staff/gsar/APC/ the Perl Repository Browser: http://public.activestate.com/cgi-bin/perlbrowse the Perl cross-reference: http://pxr.perl.org/source/ mailing list subscription: perl5-changes-subscribe@perl.org archive: http://archive.develooper.com/perl5-changes@perl.org/ =back =cut =head1 More Help There is a L in the user documentation set which covers mod_perl user's issues. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Stas Bekman [http://stason.org/] =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/performance/0000755000104000010010000000000012540623177020323 5ustar AdministratorsNonemod_perl-2.0.9/docs/devel/performance/size_matters.pod0000644000177200010010000001225412540623177021643 0ustar SteveNone=head1 NAME Measure sizeof() of Perl's C Structures =head1 Description This document describes the I various structures, as determined by I. These measurements are mainly for research purposes into making Perl things smaller, or rather, how to use less Perl things. =head1 Perl Structures Structures diagrams are courtesy gdb (print pretty) and a bit of hand crafting. =over 4 =item CV - 229 minimum, 254 minimum w/ symbol table entry cv = { sv_any = { // XPVCV * xpv_pv = 0x0, // char * xpv_cur = 0, // STRLEN xpv_len = 0, // STRLEN xof_off = 0 , // IV xnv_nv = 0, // NV xmg_magic = 0x0, // MAGIC * xmg_stash = 0x0, // HV * xcv_stash = 0x0, // HV * xcv_start = 0x0, // OP * xcv_root = 0x0, // OP * xcv_xsub = 0x0, // void (*)(register PerlInterpreter *, CV *) xcv_xsubany = { // ANY any_ptr = 0x0, any_i32 = 0, any_iv = 0, any_long = 0, any_dptr = 0, any_dxptr = 0 }, xcv_gv = { // GV * sv_any = { // void * xpv_pv = 0x0, // char * xpv_cur = 0, // STRLEN xpv_len = 0, // STRLEN xiv_iv = 0, // IV xnv_nv = 0, // NV xmg_magic = { // MAGIC * mg_moremagic = 0x0, // MAGIC * mg_virtual = 0x0, // MGVTBL * mg_private = 0, // U16 mg_type = 0, // char mg_flags = 0, // U8 mg_obj = 0x0, // SV * mg_ptr = 0x0, // char * mg_len = 0, // I32 }, xmg_stash = 0x0, // HV * xgv_gp = { // GP * gp_sv = { // SV * sv_any = 0x0, // void * sv_refcnt = 0, // U32 sv_flags = 0 // U32 }, gp_refcnt = 0, // U32 gp_io = 0x0, // struct io * gp_form = 0x0, // CV * gp_av = 0x0, // AV * gp_hv = 0x0, // HV * gp_egv = 0x0, // GV * gp_cv = 0x0, // CV * gp_cvgen = 0, // U32 gp_flags = 0, // U32 gp_line = 0, // line_t gp_file = 0x0, // char * }, xgv_name = 0x0, // char * xgv_namelen = 0, // STRLEN xgv_stash = 0x0, // void * xgv_flags = 0, // U8 }, sv_refcnt = 0, // U32 sv_flags = 0, // U32 }, xcv_file = 0x0, // char * xcv_depth = 0, // long xcv_padlist = 0x0, // AV * xcv_outside = 0x0, // CV * xcv_flags = 0, // cv_flags_t } sv_refcnt = 0, // U32 sv_flags = 0, // U32 }; In addition to the minimum bytes: =over 4 =item name of the subroutine: GvNAMELEN(CvGV(cv))+1 =item symbol table entry: HvENTRY (25 + GvNAMELEN(CvGV(cv))+1) =item minimum sizeof(AV) * 3: xcv_padlist if !CvXSUB(cv) =item CvROOT(cv) optree =back =item HV - 60 minmum hv = { sv_any = { // SV * xhv_array = 0x0, // char * xhv_fill = 0, // STRLEN xhv_max = 0, // STRLEN xhv_keys = 0, // IV xnv_nv = 0, // NV xmg_magic = 0x0, // MAGIC * xmg_stash = 0x0, // HV * xhv_riter = 0, // I32 xhv_eiter = 0x0, // HE * xhv_pmroot = 0x0, // PMOP * xhv_name = 0x0 // char * }, sv_refcnt = 0, // U32 sv_flags = 0, // U32 }; Each entry adds C, minimum of 7 (initial C). Note that keys of the same value share C, across all hashes. =item HvENTRY - 25 + HeKLEN+1 sizeof(HE *) + sizeof(HE) + sizeof(HEK) =item HE - 12 he = { hent_next = 0x0, // HE * hent_hek = 0x0, // HEK * hent_val = 0x0 // SV * }; =item HEK - 9 + hek_len hek = { hek_hash = 0, // U32 hek_len = 0, // I32 hek_key = 0, // char }; =item AV - 53 av = { sv_any = { // SV * xav_array = 0x0, // char * xav_fill = 0, // size_t xav_max = 0, // size_t xof_off = 0, // IV xnv_nv = 0, // NV xmg_magic = 0x0, // MAGIC * xmg_stash = 0x0, // HV * xav_alloc = 0x0, // SV ** xav_arylen = 0x0, // SV * xav_flags = 0, // U8 }, sv_refcnt = 0, // U32 sv_flags = 0 // U32 }; In addition to the minimum bytes: =over 4 =item AvFILL(av) * sizeof(SV *) =back =back =head1 SEE ALSO perlguts(3), B::Size(3), http://gisle.aas.no/perl/illguts/ =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Doug MacEachern Edougm (at) covalent.netE =back =head1 Authors =over =item * Doug MacEachern Edougm (at) covalent.netE =back =cut mod_perl-2.0.9/docs/devel/performance/speed_matters.pod0000644000177200010010000000706112540623177021771 0ustar SteveNone=head1 NAME Which Coding Technique is Faster =head1 Description This document tries to show more efficient coding styles by benchmarking various styles. WARNING: This doc is under construction META: for now these are just unprocessed snippets from the mailing list. Please help me to make these into useful essays. =head1 backticks vs XS META: unprocessed yet. compare the difference of calling an xsub that does _nothing_ vs. a backticked program that does _nothing_. /* file:test.c */ int main(int argc, char **argv, char **env) { return 1; } /* file:TickTest.xs */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" MODULE = TickTest PACKAGE = TickTest void foo() CODE: # file:test.pl use blib; use TickTest (); use Benchmark; timethese(100_000, { backtick => sub { `./test` }, xs => sub { TickTest::foo() }, }); Results: Benchmark: timing 100000 iterations of backtick, xs... backtick: 292 wallclock secs (18.68 usr 43.93 sys + 142.43 cusr 84.00 csys = 289.04 CPU) @ 1597.19/s (n=100000) xs: -1 wallclock secs ( 0.25 usr + 0.00 sys = 0.25 CPU) @ 400000.00/s (n=100000) (warning: too few iterations for a reliable count) =head1 sv_catpvn vs. fprintf META: unprocessed yet. and what i'm trying to say is that if both the xs code and external program are doing the same thing, xs will be heaps faster than backticking a program. your xsub and external program are not doing the same thing. i'm guessing part of the difference in your code is due to fprintf having a pre-allocated buffer, whereas the SV's SvPVX has not been pre-allocated and gets realloc-ed each time you call sv_catpv. have a look at the code below, fprintf is faster than sv_catpvn, but if the SvPVX is preallocated, sv_catpvn becomes faster than fprintf: timethese(1_000, { fprintf => sub { TickTest::fprintf() }, svcat => sub { TickTest::svcat() }, svcat_pre => sub { TickTest::svcat_pre() }, }); Benchmark: timing 1000 iterations of fprintf, svcat, svcat_pre... fprintf: 9 wallclock secs ( 8.72 usr + 0.00 sys = 8.72 CPU) @ 114.68/s (n=1000) svcat: 13 wallclock secs (12.82 usr + 0.00 sys = 12.82 CPU) @ 78.00/s (n=1000) svcat_pre: 2 wallclock secs ( 2.75 usr + 0.00 sys = 2.75 CPU) @ 363.64/s (n=1000) #include "EXTERN.h" #include "perl.h" #include "XSUB.h" static FILE *devnull; MODULE = TickTest PACKAGE = TickTest BOOT: devnull = fopen("/dev/null", "w"); void fprintf() CODE: { int i; char buffer[8292]; for (i=0; idougm (at) covalent.netE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/devel/porting/0000755000104000010010000000000012540623177017504 5ustar AdministratorsNonemod_perl-2.0.9/docs/devel/porting/porting.pod0000644000177200010010000000745212540623177020001 0ustar SteveNone=head1 NAME Porting Apache:: XS Modules from mod_perl 1.0 to 2.0 =head1 Description This document talks mainly about porting modules using XS code. It's also helpful to those who start developing mod_perl 2.0 packages. Also make sure to first read about L. =head1 Porting Makefile.PL It's only an issue if it was using C. A new configuration system is in works. So watch this space for updates on this issue. ModPerl::MM is the new replacement of Apache::src. =head1 Porting XS Code If your module's XS code relies on the Apache and mod_perl C APIs, it's very likely that you will have to adjust the XS code to the Apache 2.0 and mod_perl 2.0 C API. The C API has changed a lot, so chances are that you are much better off not to mix the two APIs in the same XS file. However if you do want to mix the two you will have to use something like the following: #include ap_mmn.h /* ... */ #if AP_MODULE_MAGIC_AT_LEAST(20020903,4) /* 2.0 code */ #else /* 1.0 code */ #endif The C<20020903,4> is the value of the magic version number matching Apache 2.0.47, the earliest Apache version supported by mod_perl 2.0. =head1 Thread Safety META: to be written #ifdef MP_THREADED /* threads specific code goes here */ #endif For now see: http://httpd.apache.org/docs-2.0/developer/thread_safety.html =head1 PerlIO PerlIO layer has become usable only in perl 5.8.0, so if you plan on working with PerlIO, you can use the C constant. e.g.: #ifdef PERLIO_LAYERS #include "perliol.h" #else #include "iperlsys.h" #endif =head1 'make test' Suite The C testing framework that comes together with mod_perl 2.0 works with 1.0 and 2.0 mod_perl versions. Therefore you should consider porting your test suite to use L. =head1 Apache C Code Specific Notes Most of the documentation covering migration to Apache 2.0 can be found at: http://httpd.apache.org/docs-2.0/developer/ The Apache 2.0 API documentation now resides in the C header files, which can be conveniently browsed via http://docx.webperf.org/. The APR API documentation can be found here http://apr.apache.org/. The new Apache and APR APIs include many new functions. Though certain functions have been preserved, either as is or with a changed prototype (for example to work with pools), others have been renamed. So if you are porting your code and the function that you've used doesn't seem to exist in Apache 2.0, first refer to the "compat" header files, such as: I, I, and I, which list functions whose names have changed but which are otherwise the same. If this fails, proceed to look in other headers files in the following directories: =over =item * I functions in I =item * I functions in I and I =back =head2 ap_soft_timeout(), ap_reset_timeout(), ap_hard_timeout() and ap_kill_timeout() If the C part of the module in 1.0 includes C, C, C and C functions simply remove these in 2.0. There is no replacement for these functions because Apache 2.0 uses non-blocking I/O. As a side-effect of this change, Apache 2.0 no longer uses C, which has caused conflicts in mod_perl 1.0. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Stas Bekman [http://stason.org/] =item * Doug MacEachern Edougm (at) covalent.netE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/index_top.html0000644000177200010010000000037512540623177015706 0ustar SteveNone index bottom mod_perl-2.0.9/docs/os/0000755000104000010010000000000012540623177015344 5ustar AdministratorsNonemod_perl-2.0.9/docs/os/config.cfg0000644000177200010010000000034612540623177015374 0ustar SteveNoneuse vars qw(@c); @c = ( id => 'os_2.0', title => "OS-specific Info", abstract => < [qw( win32 )], ); mod_perl-2.0.9/docs/os/win32/0000755000104000010010000000000012540623177016306 5ustar AdministratorsNonemod_perl-2.0.9/docs/os/win32/Changes.pod0000644000177200010010000000072412540623177016464 0ustar SteveNone=head1 NAME CHANGES =head1 Description Refer to this document to learn what changes were made to the documents, since you've read these last time. The most recent changes are listed first. =head1 Thu May 30 16:44:02 SGT 2002 * split modperl2 into config and install [Randy Kobes Erandy@theoryx5.uwinnipeg.caE] =head1 Thu May 30 12:20:02 SGT 2002 * win32::modperl2 initial docs submitted by Randy Kobes Erandy@theoryx5.uwinnipeg.caE =cut mod_perl-2.0.9/docs/os/win32/config.cfg0000644000177200010010000000057412540623177016341 0ustar SteveNoneuse vars qw(@c); @c = ( id => 'win32_2.0', title => "Win32 Platforms", stitle => "Win32", abstract => < [qw( install.pod config.pod faq.pod )], copy_glob => [qw( mpinstall distinstall )], changes => 'Changes.pod', ); mod_perl-2.0.9/docs/os/win32/config.pod0000644000177200010010000001307612540623177016365 0ustar SteveNone=head1 NAME Configuring mod_perl 2.0 for Win32 =head1 Description This document discusses how to configure mod_perl 2.0. =head1 Configuration Add this line to F: LoadModule perl_module modules/mod_perl.so Be sure that the path to your Perl binary (eg, F) is in your C environment variable. This can be done either by editing F, if present, or through the I option of the I tab of the I area of the Control Panel. Especially when running Apache as a service, you may also want to add the directive LoadFile "/Path/to/your/Perl/bin/perl5x.dll" to F, before loading F, to load your Perl dll. You may also want to use a start-up script to load commonly used modules; this can be done with a directive as, eg, PerlRequire "C:/Apache2/conf/extra.pl" where a sample start-up script F is use ModPerl::Util (); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Connection (); use Apache2::Log (); use Apache2::Const -compile => ':common'; use APR::Const -compile => ':common'; use APR::Table (); use Apache2::compat (); use ModPerl::Registry (); use CGI (); 1; C is used to provide backwards compatibility with mod_perl 1.0. C, named so as not to conflict with C of mod_perl 1.0, is used for registry scripts. =head1 Registry scripts Using C to speed up cgi scripts may be done as follows. Create a directory, for example, F, which will hold your scripts, such as ## printenv -- demo CGI program which just prints its environment ## use strict; print "Content-type: text/html\n\n"; print "

Environment variables

    "; foreach (sort keys %ENV) { my $val = $ENV{$_}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "
  • $_ = \"${val}\"
  • \n"; } #sleep(10); print "
"; Note that Apache takes care of using the proper line endings when sending the I header. Next, insert in F the following directives: Alias /perl/ "/Apache2/perl/" SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI PerlOptions +ParseHeaders whereby the script would be called as http://localhost/perl/name_of_script The C directive is needed when the script sends the header (in mod_perl 1.0, this was given as C. As an illustration of how mod_perl 2.0 addresses the issues raised in the discussion of issues in L concerning the threading limitations of mod_perl 1.0 on Win32, consider the C script above with the C line uncommented. Using the Apache benchmarking tool C of the Apache 2.0 Win32 distribution: C:\Apache2\bin> ab -n 5 -c 5 http://localhost/perl/printenv to make 5 concurrent requests, we find the following results. For mod_perl 1.0/Apache 1.3: Server Software: Apache/1.3.23 Concurrency Level: 5 Time taken for tests: 50.51972 seconds while for mod_perl 2.0/Apache 2.0: Server Software: Apache/2.0.45 Concurrency Level: 5 Time taken for tests: 13.729743 seconds The dramatic difference is due to the fact that in Apache 1.3/mod_perl 1.0 a given request has to finish (taking essentially 10 seconds, due to the C call) before the next request is processed, whereas on Apache 2.0/mod_perl 2.0 the requests are processed as they arrive. =head1 Hello World As you will discover, there is much to mod_perl beyond simple speed-up of cgi scripts. Here is a simple I example that illustrates the use of mod_perl as a content handler. Create a file F as follows: package Apache2::Hello; use strict; use Apache2::RequestRec (); # for $r->content_type use Apache2::RequestIO (); # for $r->puts use Apache2::Const -compile => ':common'; sub handler { my $r = shift; my $time = scalar localtime(); my $package = __PACKAGE__; $r->content_type('text/html'); $r->puts(<<"END");

Hello

Hello from $package! The time is $time. END return Apache2::Const::OK; } 1; and save it in, for example, the F directory. Next put the following directives in F: PerlModule Apache2::Hello SetHandler modperl PerlResponseHandler Apache2::Hello With this, calls to http://localhost/hello will use C to deliver the content. =head1 See Also The directions for L, the L, L, L, L, and the L. Help is also available through the archives of and subscribing to the L. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back =head1 Authors =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/os/win32/distinstall0000644000177200010010000001252512540623177016667 0ustar SteveNone##################################################################### # A Perl script to retrieve and join split files # making up a Win32 Perl/Apache binary distribution # # Files created by hjsplit (http://www.freebyte.com/hjsplit/) # with the joining accomplished by hj-join # # This script is Copyright 2003, by Randy Kobes, # and may be distributed under the same terms as Perl itself. # Please report problems to Randy Kobes ##################################################################### use strict; use warnings; use Net::FTP; use Safe; use Digest::MD5; use IO::File; use ExtUtils::MakeMaker; die 'This is intended for Win32' unless ($^O =~ /Win32/i); my $theoryx5 = 'theoryx5.uwinnipeg.ca'; my $bsize = 102400; my $kb = sprintf("%d", $bsize / 1024); my $cs = 'CHECKSUMS'; my $join = 'join32.exe'; print <<"END"; This script will fetch and then join the files needed for creating and installing a Perl/Apache Win32 binary distribution from ftp://$theoryx5/pub/other/. If the file transfer is interrupted before all the neccessary files are obtained, run the script again in the same directory; files successfully fetched earlier will not be downloaded again. A hash mark represents transfer of $kb kB. Available distributions are: 1. Perl 5.8.7 / Apache 2.0.54 / mod_perl-2.0.1 2. Perl 5.6.1 / Apache 1.3.27 / mod_perl 1.27 It is recommended to install Perl and Apache into fresh locations, so that current files are not overwritten and that old files do not linger which may confuse the new installation. END my $dist; my $ans = prompt("Desired distribution (1, 2, or 'q' to quit)?", 1); CHECK: { ($ans =~ /^q/i) and die 'Installation aborted'; ($ans == 1) and do { $dist = 'Perl-5.8-win32-bin'; last CHECK; }; ($ans == 2) and do { $dist = 'perl-win32-bin'; last CHECK; }; die 'Please answer either 1, 2, or q'; } my $exe = $dist . '.exe'; my $ftp = Net::FTP->new($theoryx5); $ftp->login('anonymous', "$dist\@perl.apache.org") or die "Cannot login to $theoryx5"; $ftp->cwd("pub/other/$dist") or die "Cannot cwd to pub/other/$dist"; my $max; die "Unable to determine number of files to get" unless ($max = get_max()); my @files = (); # fetch the CHECKSUMS file print qq{Fetching "$cs" ...}; $ftp->ascii; $ftp->get($cs); print " done!\n"; die qq{Failed to fetch "$cs"} unless (-e $cs); push @files, $cs; # evaluate CHECKSUMS my $cksum; die qq{Cannot load "$cs" file} unless ($cksum = load_cs($cs) ); $ftp->binary; $ftp->hash(1, $bsize); # fetch the join program die qq{Cannot fetch "$join"} unless (fetch($join)); push @files, $join; # fetch the split files print "\nFetching $max split files ....\n\n"; for (1 .. $max) { my $num = $_ < 10 ? "00$_" : "0$_"; my $file = $dist . '.exe.' . $num; push @files, $file; die qq{Cannot fetch "$file"} unless (fetch($file)); } print "\nFinished fetching split files.\n"; $ftp->quit; # now join them if (-e $exe) { unlink($exe) or warn qq{Cannot unlink $exe: $!}; } my @args = ($join); system(@args); die qq{Joining files to create "$exe" failed} unless (-e $exe); # remove the temporary files, if desired $ans = prompt('Remove temporary files?', 'yes'); if ($ans =~ /^y/i) { unlink(@files) or warn "Cannot unlink temporary files: $!\n"; } # run the exe, if desired $ans = prompt("Run $exe now?", 'yes'); if ($ans =~ /^y/i) { @args = ($exe); system(@args); } else { print "\nDouble click on $exe to install.\n"; } # fetch a file, unless it exists and the checksum checks sub fetch { my $file = shift; local $| = 1; if (-e $file) { if (verifyMD5($file)) { print qq{Skipping "$file" ...\n}; return 1; } else { unlink $file or warn qq{Could not unlink "$file"\n}; } } my $size = sprintf("%d", $ftp->size($file) / 1024); print "\nFetching $file ($size kB) ...\n"; $ftp->get($file); print "Done!\n"; unless (-e $file) { warn qq{Unable to fetch "$file"\n}; return; } unless (verifyMD5($file)) { print qq{CHECKSUM check for "$file" failed.\n}; unlink $file or warn qq{Cannot unlink "$file": $!\n}; return; } return 1; } # routines to verify the CHECKSUMS for a file # adapted from the MD5 check of CPAN.pm # load the CHECKSUMS file into $cksum sub load_cs { my $cs = shift; my $fh = IO::File->new; unless ($fh->open($cs)) { warn qq{Could not open "$cs": $!\n}; return; } local($/); my $eval = <$fh>; $fh->close; $eval =~ s/\015?\012/\n/g; my $comp = Safe->new(); my $cksum = $comp->reval($eval); if ($@) { warn qq{eval of "$cs" failed: $@\n}; return; } return $cksum; } # verify a CHECKSUM for a file sub verifyMD5 { my $file = shift; my ($is, $should); my $fh = IO::File->new; unless ($fh->open($file)) { warn qq{Cannot open "$file": $!}; return; } binmode($fh); unless ($is = Digest::MD5->new->addfile($fh)->hexdigest) { warn qq{Could not compute checksum for "$file": $!}; $fh->close; return; } $fh->close; if ($should = $cksum->{$file}->{md5}) { my $test = ($is eq $should); printf qq{ Checksum for "$file" is %s\n}, ($test) ? 'OK.' : 'NOT OK.'; return $test; } else { warn qq{Checksum data for "$file" not present in $cs.\n}; return; } } # get number of split files sub get_max { my $dir = $ftp->ls(); my $count = 0; foreach (@$dir) { $count++ if m!$dist.exe.\d+$!; } return $count; } mod_perl-2.0.9/docs/os/win32/faq.pod0000644000177200010010000000213412540623177015660 0ustar SteveNone=head1 NAME Frequently asked questions for mod_perl on Win32 =head1 Description This document discusses some questions that arise often with mod_perl 2.0 on Win32. =head1 See Also The L, the discussion of L, the L, L, and a L. Help is also available through the archives of and subscribing to the L; you will probably find the L useful reading beforehand. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back =head1 Authors =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/os/win32/install.pod0000644000177200010010000002761412540623177016571 0ustar SteveNone=head1 NAME mod_perl 2.0 Win32 Installation Instructions =head1 Description This document deals with installation specifics on Win32 platforms. =head1 Synopsis As described in the discussion of issues in L, a mod_perl 1.0 enabled server based on Apache 1.3 on Win32 is limited to a single thread serving a request at a time. This effectively prevents concurrent processing, which can have serious implications for busy sites. This problem is addressed in the multi-thread/multi-process approach of mod_perl 2.0/Apache 2.x, which consequently requires a Perl built with ithreads enabled. There are some threading issues in perl-5.6 (upon which ActivePerl builds 6xx are based) which cause problems with mod_perl 2.0 on Win32. Consequently, the minimum required perl version is 5.8 (upon which ActivePerl builds 8xx are based) for use with mod_perl 2.0 on Win32. =head1 Installing Unless you are using an all-in-one package, you should first install Perl and Apache, either from the sources or as binaries. The Perl sources are available from L, with directions for building contained in F. ActiveState also makes the sources available for their binary builds at L, which may contain, in particular, Win32-specific fixes not in the CPAN Perl sources. If you are building Perl from source then you must enable both USE_MULTI and USE_ITHREADS in the Makefile to enable ithreads, as required for mod_perl 2.0 on Win32. ActivePerl builds also enable USE_IMP_SYS, providing the implicit "host" layer which gives a C emulation, but this is at the cost of disabling PERL_MALLOC which may have significant performance implications since Win32's system C is notably slower than Perl's in some situations. Thus, unless you require the C emulation or specifically want an ActivePerl- compatible build then you may want to disable USE_IMP_SYS and enable PERL_MALLOC. (Note that you cannot currently enable PERL_MALLOC with USE_IMP_SYS enabled as well.) As a binary, at present, an ActivePerl- compatible Perl, compiled with Visual C++, is the most common one used in the Win32 mod_perl/Apache environment; you can obtain such a prebuilt Perl binary from L. The Apache sources and binaries are available at L. As of this writing, mod_perl 2.0 is known to compile and work with both an ActivePerl-compatible perl-5.8 (ActivePerl build 8xx) and with an otherwise similar Perl having USE_IMP_SYS disabled and PERL_MALLOC enabled. See the section on Apache/mod_perl binaries below for details on a suitable repository containing mod_perl ppm packages, and also how to obtain other Win32 binary packages. When installing Perl or other related binaries, subtleties may arise in using path names that have spaces in them - you may, for example, have to specify F by the DOS 8.3 path name F in certain Apache directives. If you want to avoid this, install, if possible, these packages to locations without spaces in their names (eg, F for Perl and F for Apache 2.0). In the following, it may be necessary to invoke certain commands through a DOS prompt. A DOS window may be opened either through a I option of the I menu, or by choosing to run, from the Start menu, C or C, as appropriate. =head2 Building from sources If you are building mod_perl 2.0 from sources, it is probably also best to do the same for Apache 2.0. The Apache 2.0 sources can be obtained from L, which when unpacked will contain at the top-level a Visual Studio project file (make sure to obtain the I archive). Choose the C target to build and install Apache 2.0, which by default will be placed in F. At the present time you must have version 2.0.47 or greater of Apache2 in order to build mod_perl. Having built and installed Apache 2.0, next obtain the mod_perl 2.0 sources. First obtain the L as a C file - when unpacked, using Winzip or similar tools, a subdirectory F will be created. Next, run the command C:\modperl_src> perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2 Then C:\modperl_src> nmake C:\modperl_src> nmake test will build and test mod_perl 2.0. mod_perl 2.0 on Win32 is considered at an alpha stage of development, so not all the tests may pass. The final command, C:\modperl_src> nmake install will install the necessary mod_perl 2.0 files into your Perl directory tree, and also copy F into your F
directory. If this build fails, or you want features not present in the official releases, you may want to try the sources obtained from svn - see the discussion on the L<2.0 Development Source Distribution|download::source/Development_mod_perl_2_0_Source_Distribution> for details. Be aware, though, that as well as providing bug fixes, there may be new features being added and tested in the svn versions, so at any given time there are no guarantees that these packages will build and test successfully. =head2 PPM Packages The following assumes you already have ActivePerl 8xx (I 6xx) from L and a Win32 Apache 2.x binary from L. In installing this, you might avoid some future problems by choosing installation directories that do not have spaces in their names (eg, F). At this time you must have version 2.0.47 or greater of Apache2 in order to install the mod_perl 2 ppm package. After installing Perl and Apache 2.x, you can then install mod_perl via the C utility. ActiveState does not maintain mod_perl in their ppm repository, so you must get it from a different location other than ActiveState's site. A quick way to do this is to download the script F and save it as, for example, I. Invoking this as C on a command line will take you through a dialogue, based on your configuration, which will determine and install, via C, the desired mod_perl ppm package. The direct way to install mod_perl via ppm is simply as (broken over two lines for readability) C:\> ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd for Apache/2.2, and C:\> ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl-2.0.ppd for Apache/2.0. Another way, which will be useful if you plan on installing additional Apache modules, is to add the following repository within C: http://theoryx5.uwinnipeg.ca/ppms/ for ActivePerl 819 or higher, or http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58 for ActivePerl 818 or lower; see the help utility within C for details on how to do this. mod_perl 2.0 can then be installed, within the ppm shell, as ppm> install mod_perl for Apache/2.2, and as ppm> install mod_perl-2.0 for Apache/2.0. This will install the necessary modules under an F subdirectory in your Perl tree, so as not to disturb a possible existing F directory from mod_perl 1.0. See the section below on configuring mod_perl to add this directory to the C<@INC> path for searching for modules. The preceding L repository is appropriate for ActivePerl 8xx builds, based on perl-5.8. If you're using an ActivePerl 10xx build, based on perl-5.10, you can install mod_perl via C:\> ppm install http://cpan.uwinnipeg.ca/PPMPackages/10xx/mod_perl.ppd for Apache/2.2. The corresponding repository that can be added to ppm is http://cpan.uwinnipeg.ca/PPMPackages/10xx/ after which mod_perl can be installed as ppm> install mod_perl Note that ActivePerl 8xx and ActivePerl 10xx are not binary compatible, which means ppm packages compiled, for example, for an 8xx build are not compatible with ActivePerl 10xx. The mod_perl PPM package also includes the necessary Apache DLL F; a post-installation script should be run which will offer to copy this file to your Apache2 modules directory (eg, F). If this fails, you can get F from L and install it to your Apache2 modules directory by hand. Note that, because of binary incompatibilities, one should I install packages for ActivePerl 8xx from a repository containing packages for ActivePerl 6xx, and vice-versa, particularly if these packages contain XS-based modules. Also note that modules compiled under Apache/2.0 are not compatible with modules compiled under Apache/2.2, so be sure to install the mod_perl ppm package appropriate for your version of Apache/2.x. The mod_perl package available from this site will always use the latest mod_perl sources available from CPAN compiled against the latest official Apache release; depending on changes made in Apache, you may or may not be able to use an earlier Apache binary. However, in the Apache Win32 world it is particularly a good idea to use the latest version, for bug and security fixes. If you want to try a later development version of mod_perl 2, get the F ppm package instead; the development version may contain bug fixes that were found since the last CPAN release, but it may also contain experimental features that have not been fully tested. If you encounter problems loading F, ensure that the mod_perl version you are using matches that of Apache, make sure you are using at least Apache/2.0.47, and also make certain C is in your C environment variable or try adding the Apache directive LoadFile "C:/Path/to/your/Perl/bin/perlxx.dll" before loading F. If all else fails, a reboot may help. If the I repository is down, you can access these packages at L, for builds 8xx, and L, for builds 6xx. =head2 All in one packages There are a number of binary packages for Win32 that contain the necessary Perl and Apache binaries: =over =item * IndigoPerl from L, =item * XAMPP for Windows from L =item * DeveloperSide.NET for Windows at L =item * zangweb from L =back As well, at L there is a package F containing a binary version of perl-5.8 (compatible with ActivePerl 8xx), together with Apache 2.0 and mod_perl 2.0. See the file F for a description. If you have trouble fetching the whole file at once, the directory L contains this distribution split across multiple files - see F for instructions on how to join them. Alternatively, if you have Perl already, you can get the script F which, when invoked as C, will fetch and join the files for you. =head1 See Also The directions for L, the L, L, L, and the L. Help is also available through the archives of and subscribing to the L. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back =head1 Authors =over =item * Randy Kobes Erandy@theoryx5.uwinnipeg.caE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/os/win32/mpinstall0000644000177200010010000002505312540623177016340 0ustar SteveNone#!C:/Perl/bin ##################################################################### # A Perl script to fetch and install via ppm mod_perl on Win32 # Copyright 2002, by Randy Kobes. # This script may be distributed under the same terms as Perl itself. # Please report problems to Randy Kobes ##################################################################### use strict; use warnings; use ExtUtils::MakeMaker; use LWP::Simple; use File::Copy; use Config; use Safe; use Digest::MD5; require Win32; require File::Spec; die "This only works for Win32" unless $^O =~ /Win32/i; die "No mod_perl ppm package available for this Perl" if ($] < 5.006001); my ($apache2, $apache, $apache22); my @drives = drives(); # find a possible Apache2 directory APACHE2: { for my $drive (@drives) { for my $p ('Apache2', 'Program files/Apache2', 'Program Files/Apache Group/Apache2') { my $candidate = File::Spec->catpath($drive, $p); if (-d $candidate) { $apache2 = $candidate; last APACHE2; } } } } if ($apache2) { $apache2 = fix_path($apache2); my $ans = prompt(qq{Install mod_perl-2 for "$apache2"?}, 'yes'); $apache2 = undef unless ($ans =~ /^y/i); } # if no Apache2, try to find Apache1 unless ($apache2) { APACHE: { for my $drive (@drives) { for my $p ('Apache', 'Program Files/Apache', 'Program Files/Apache Group/Apache') { my $candidate = File::Spec->catpath($drive, $p); if (-d $candidate) { $apache = $candidate; last APACHE; } } } } } if ($apache) { $apache = fix_path($apache); my $ans = prompt(qq{Install mod_perl 1 for "$apache"?}, 'yes'); $apache = undef unless ($ans =~ /^y/i); } # check Apache versions if ($apache or $apache2) { my $vers; if ($apache) { $vers = qx{"$apache/apache.exe" -v}; die qq{"$apache" does not appear to be version 1.3} unless $vers =~ m!Apache/1.3!; } else { my $vers; for my $binary(qw(Apache.exe httpd.exe)) { my $b = File::Spec->catfile($apache2, 'bin', $binary); next unless -x $b; $vers = qx{$b -v}; last; } die qq{Cannot determine the Apache version} unless $vers; die qq{"$apache2" does not appear to be version 2.x} unless $vers =~ m!Apache/2.!; $apache22 = 1 if $vers =~ m!Apache/2.2!; } } # prompt to get an Apache installation directory else { my $dir = prompt("Where is your apache installation directory?", ''); die 'Need to specify the Apache installation directory' unless $dir; $dir = fix_path($dir); die qq{"$dir" does not exist} unless (-d $dir); if ($dir =~ /Apache2/) { my $ans = prompt(qq{Install mod_perl 2 for "$dir"?}, 'yes'); $apache2 = $dir if ($ans =~ /^y/i); } else { my $ans = prompt(qq{Install mod_perl 1 for "$dir"?}, 'yes'); $apache = $dir if ($ans =~ /^y/i); } unless ($apache or $apache2) { my $mpv = prompt('Which mod_perl version would you like [1 or 2]?', 2); if ($mpv == 1) { $apache = $dir; } elsif ($mpv == 2) { $apache2 = $dir; } else { die 'Please specify either "1" or "2"'; } } } die 'Please specify an Apache directory' unless ($apache or $apache2); my $theoryx5 = 'http://theoryx5.uwinnipeg.ca'; my $ppms = $theoryx5 . '/ppms/'; my $ppmsx86 = $ppms . 'x86/'; my $ppmpackages = $theoryx5 . '/ppmpackages/'; my $ppmpackagesx86 = $ppmpackages . 'x86/'; my ($ppd, $tgz, $ppdfile, $tgzfile, $checksums, $so_fetch, $so_fake); my $so = 'mod_perl.so'; my $cs = 'CHECKSUMS'; # set appropriate ppd and tar.gz files if ($] < 5.008) { $checksums = $ppmpackagesx86 . $cs; if ($apache2) { die 'No mod_perl 2 package available for this perl version'; } else { my $ans = prompt('Do you need EAPI support for mod_ssl?', 'no'); if ($ans =~ /^n/i) { $ppdfile = 'mod_perl.ppd'; $tgzfile = 'mod_perl.tar.gz'; $so_fake = 'mod_perl.so'; } else { $ppdfile = 'mod_perl-eapi.ppd'; $tgzfile = 'mod_perl-eapi.tar.gz'; $so_fake = 'mod_perl-eapi.so'; } $ppd = $ppmpackages . $ppdfile; $tgz = $ppmpackagesx86 . $tgzfile; $so_fetch = $ppmpackagesx86 . $so_fake; } } else { $checksums = $ppmsx86 . $cs; if ($apache2) { my $ans = prompt('Do you want the latest mod_perl 2 development version?', 'no'); if ($ans =~ /^n/i) { if ($apache22) { $ppdfile = 'mod_perl.ppd'; $tgzfile = 'mod_perl.tar.gz'; $so_fake = 'mod_perl.so'; } else { $ppdfile = 'mod_perl-2.0.ppd'; $tgzfile = 'mod_perl-2.0.tar.gz'; $so_fake = 'mod_perl-2.0.so'; } } else { $ppdfile = 'mod_perl-dev.ppd'; $tgzfile = 'mod_perl-dev.tar.gz'; $so_fake = 'mod_perl-dev.so'; } $ppd = $ppms . $ppdfile; $tgz = $ppmsx86 . $tgzfile; $so_fetch = $ppmsx86 . $so_fake; } else { my $ans = prompt('Do you need EAPI support for mod_ssl?', 'no'); if ($ans =~ /^n/i) { $ppdfile = 'mod_perl-1.ppd'; $tgzfile = 'mod_perl-1.tar.gz'; $so_fake = 'mod_perl-1.so'; } else { $ppdfile = 'mod_perl-eapi-1.ppd'; $tgzfile = 'mod_perl-eapi-1.tar.gz'; $so_fake = 'mod_perl-eapi-1.so'; } $ppd = $ppms . $ppdfile; $tgz = $ppmsx86 . $tgzfile; $so_fetch = $ppmsx86 . $so_fake; } } my $tmp = $ENV{TEMP} || $ENV{TMP} || '.'; chdir $tmp or die "Cannot chdir to $tmp: $!"; # fetch the ppd and tar.gz files print "Fetching $ppd ..."; getstore($ppd, $ppdfile); print " done!\n"; die "Failed to fetch $ppd" unless -e $ppdfile; print "Fetching $tgz ..."; getstore($tgz, $tgzfile); print " done!\n"; die "Failed to fetch $tgz" unless -e $tgzfile; print "Fetching $so_fetch ..."; getstore($so_fetch, $so_fake); print " done!\n"; die "Failed to fetch $so_fetch" unless -e $so_fake; print "Fetching $checksums ..."; getstore($checksums, $cs); print " done!\n"; die "Failed to fetch $checksums" unless -e $cs; # check CHECKSUMS for the tar.gz and so files my $cksum = load_cs($cs); die "Could not load $cs: $!" unless $cksum; die qq{CHECKSUM check for "$tgzfile" failed.\n} unless (verifyMD5($cksum, $tgzfile)); die qq{CHECKSUM check for "$so_fake" failed.\n} unless (verifyMD5($cksum, $so_fake)); unless ($so_fake eq $so) { rename($so_fake, $so) or die "Rename of $so_fake to $so failed: $!"; } # edit the ppd file to reflect a local installation my $old = $ppdfile . '.old'; rename ($ppdfile, $old) or die "renaming $ppdfile to $old failed: $!"; open(my $oldfh, $old) or die "Cannot open $old: $!"; open(my $newfh, ">$ppdfile") or die "Cannot open $ppdfile: $!"; while (<$oldfh>) { next if /; $eval =~ s/\015?\012/\n/g; close $fh; my $comp = Safe->new(); $cksum = $comp->reval($eval); if ($@) { warn $@; return; } return $cksum; } sub verifyMD5 { my ($cksum, $file) = @_; my ($fh, $is, $should); unless (open($fh, $file)) { warn "Cannot open $file: $!"; return; } binmode($fh); unless ($is = Digest::MD5->new->addfile($fh)->hexdigest) { warn "Could not compute checksum for $file: $!"; close($fh); return; } close($fh); if ($should = $cksum->{$file}->{md5}) { my $test = $is eq $should ? 1 : 0; printf qq{Checksum for "$file" is %s\n}, ($test == 1) ? 'OK.' : 'NOT OK.'; return $test; } else { warn "Checksum data for $file not present in CHECKSUMS.\n"; return; } } sub fix_path { my $file = shift; $file = Win32::GetShortPathName($file); $file =~ s!\\!/!g; return $file; } sub drives { my @drives = (); eval{require Win32API::File;}; return map {"$_:\\"} ('C' .. 'Z') if $@; my @r = Win32API::File::getLogicalDrives(); return unless @r > 0; for (@r) { my $t = Win32API::File::GetDriveType($_); push @drives, $_ if ($t == 3 or $t == 4); } return @drives > 0 ? @drives : undef; } mod_perl-2.0.9/docs/rename.pod0000644000177200010010000001145612540623177015004 0ustar SteveNone=head1 NAME mod_perl 2.0 renaming =head1 Description This document discusses the effects of the decision to rename parts of the mod_perl API. =head1 Synopsis During a sequence of release candidates leading up to the official release of mod_perl 2, in late December, 2004 there was considerable discussion regarding the choice of namespaces for the 2.0 API. The main concern expressed was that some of the C modules used in mod_perl 2 had the same names as those in mod_perl 1. After a lively and, at times, heated debate, a proposal was made to rename parts of the mod_perl 2 API - see the thread at L. This proposal was subsequently voted on and then adopted. =head1 Changes The main changes involved in this renaming are as follows. =over =item * Rename all C modules to C, save for the following exceptions: =over 4 =item * The C modules in the C distribution are unaffected by this rename. =item * Constants under the C namespace, such as C, are now called as C (for example, C). =item * Constants under the C namespace, such as C, are now called as C (for example, C). =back =item * Crequest()> has been renamed to Crequest()>. =item * Cserver()> has been renamed to Cserver()>. =item * Rename C to C =item * Discontinue the practice of installing mod_perl in a relative F subdirectory, so that the use of C to adjust C<@INC> is no longer needed. =back Concurrent with these changes, a decision was also made to refuse to install mod_perl 2 in the same Perl tree as any installed mod_perl 2 package of version prior to 1.999_22. =head1 Effects The mod_perl developers did not take lightly the effects of changing the API at such a late stage in the development cycle. For most users the change to the new API should be relatively straightforward: =over =item * Before installing mod_perl 2, either remove an earlier mod_perl 2 installation (prior to 1.999022), or else choose to install the new version in a different area. To remove enough of a prior installation of mod_perl 2 in order to satisfy this requirement, one can do, on Unix, % find /usr/lib/perl5 -name 'Apache2*' -exec rm -rf {} \; where F is the top-level root of your Perl tree. Note that this will also remove any 3rd party Apache modules installed under an F subdirectory. In many situations you would want to do this, as such modules will need porting to the new API. However, if there are modules under this location that you want to keep, you can use % find /usr/lib/perl5 -name 'Apache2*' -exec ls -lR {} \; to list the files under this tree. For Win32 ppm users, the command ppm> remove mod_perl within the ppm shell will remove an installed C ppm package. =item * If building mod_perl 2 from source, the C argument of C is no longer supported. =item * Replace the use of use Apache::SomeCoreModule; in a script or module by use Apache2::SomeCoreModule; Similarly, an Apache directive PerlModule Apache::SomeCoreModule in an F file should be replaced by PerlModule Apache2::SomeCoreModule and C should be replaced by C in the same places. Note that "core modules" are defined as those that ship with the mod_perl 2 distribution. Other CPAN modules in the C namespace may not follow the same conventions. =item * Replace the use of constants C by C and C by C. =item * Remove any occurrences of use Apache2; in a script or module, as well as PerlModule Apache2 in an Apache configuration file. =item * In a script or module, replace Crequest()> by Crequest()> and Cserver()> by Cserver()>. =item * If using C you will need to upgrade to version 3.11 - versions 3.10 and older contain bugs and versions 3.07 and older do not support support the new mod_perl API. you can get C from L. =back Beginning with mod_perl-1.999_22, an environment variable C<$ENV{MOD_PERL_API_VERSION}> has been added to specify which mod_perl version is being used. =head1 See Also The directions for L. Help is also available through the archives of and subscribing to the L. =head1 Authors L. =cut mod_perl-2.0.9/docs/TODO0000644000177200010010000000424512540623177013517 0ustar SteveNone2.0 docs todo: --- mp2 Utilities need to be documented (a separate document?): mp2bug - (should also be mentioned in user/help/help.pod) *** General items *** --- Add a note somewhere that explains the layout of the documentation, in particular: api/ - documents the API, fully covering all options. user/ and devel/ are tutorials and don't necessarely cover all the features of a discussed module. but should instead point to the API manpage for a complete info. The point is that we want to avoid duplication of the documenation, in order to make it easier to maintain the docs and keep them in sync. --- under SetHandler modperl the Options +SetupEnv has no effect. Instead either use perl-script or call $r->subprocess_env in the void context. --- On the cleanups from Bill Rowe's email (need to integrate this into the cleanup docs, the hook that we don't have yet): Cleanups are a LIFO stack. When a pool is freed, first all sub-pools are freed. Then all cleanups within that pool are run (the cleanups in the sub-pool already ran when those sub-pools were freed.) So if you register a cleanup, then create an apr object in the same pool, those apr object's cleanup runs before your registered cleanup. If you create an apr object and register your own cleanup, you still have that object until your registered cleanup is finished. --- * this is probably a documenation issue. Several phases are of type VOID and docs say: Handlers of the type C will be I executed in the order they have been registered disregarding their return values. Though in mod_perl they are expected to return C. may be we shouldn't mark them as VOID then, but RUN_ALL? this is in user/handlers/intro.pod --- * the issue with crypt_r: in 5.8.0's each perl clone allocates 128K for crypt_data. This fixed in 5.8.1 and 5.9.0 (#19119 (maint) and #19122 (blead)), however this could be quite a waste for those using 5.8.0. perhaps adding a note to performance chapter will do. For more info see the thread: http://archive.develooper.com/perl5-porters@perl.org/msg93846.html --- --- --- --- --- --- --- --- --- --- --- --- --- --- mod_perl-2.0.9/docs/user/0000755000104000010010000000000012540623200015664 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/Changes.pod0000644000177200010010000000155612540623177016063 0ustar SteveNone=head1 NAME CHANGES =head1 Description Refer to this document to learn what changes were made to the documents, since you've read these last time. The most recent changes are listed first. =head1 ... Replaced the idiom of using $mod_perl::VERSION as a test for whether or not you're running under mod_perl 1.x or mod_perl 2.x with a more accurate and general test. By Frank Wiles EfrankEatEwiles.orgE. A new troubleshooting section on how to resolve can't locate file foo, when there is a system limit on the maximum open files. By Ken Simpson EksimpsonEatElarch.mailchannels.comE. A few corrections in the config chapter by Jean-Sébastien Guay Ejean_seb EatE videotron.caE. A new troubleshooting section on how to resolve "undefined symbol" problems by Matisse Enzer Ematisse EatE hamparts.comE. =cut mod_perl-2.0.9/docs/user/coding/0000755000104000010010000000000012540623177017144 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/coding/coding.pod0000644000177200010010000006462312540623177017225 0ustar SteveNone=head1 NAME Writing mod_perl Handlers and Scripts =head1 Description This chapter covers the mod_perl coding specifics, different from normal Perl coding. Most other perl coding issues are covered in the perl manpages and rich literature. =head1 Prerequisites =head1 Where the Methods Live mod_perl 2.0 has all its methods spread across many modules. In order to use these methods the modules containing them have to be loaded first. If you don't do that mod_perl will complain that it can't find the methods in question. The module C> can be used to find out which modules need to be used. =head1 Techniques =head2 Method Handlers In addition to function handlers method handlers can be used. Method handlers are useful when you want to write code that takes advantage of inheritance. To make the handler act as a method under mod_perl 2, use the C attribute. See the Perl I manpage for details on the attributes syntax (C). For example: package Bird::Eagle; @ISA = qw(Bird); sub handler : method { my ($class_or_object, $r) = @_; ...; } sub new { bless {}, __PACKAGE__ } and then register it as: PerlResponseHandler Bird::Eagle When mod_perl sees that the handler has a method attribute, it passes two arguments to it: the calling object or a class, depending on how it was called, and the request object, as shown above. If Cmethod> syntax is used for a C, e.g.: PerlResponseHandler Bird::Eagle->handler; the C<:method> attribute is not required. In the preceding configuration example, the C method will be called as a class (static) method. Also, you can use objects created at startup to call methods. For example: use Bird::Eagle; $Bird::Global::object = Bird::Eagle->new(); ... PerlResponseHandler $Bird::Global::object->handler In this example, the C method will be called as an instance method on the global object $C. =head2 Cleaning up It's possible to arrange for cleanups to happen at the end of various phases. One can't rely on C blocks to do the job, since these L until the interpreter quits, with an exception to the L handlers. Module authors needing to run cleanups after each HTTP request, should use C>. Module authors needing to run cleanups at other times can always register a cleanup callback via C> on the pool object of choice. Here are some examples of its usage: To run something at the server shutdown and restart use a cleanup handler registered on C> in F: #PerlPostConfigRequire startup.pl use Apache2::ServerUtil (); use APR::Pool (); warn "parent pid is $$\n"; Apache2::ServerUtil::server_shutdown_cleanup_register((\&cleanup); sub cleanup { warn "server cleanup in $$\n" } This is usually useful when some server-wide cleanup should be performed when the server is stopped or restarted. To run a cleanup at the end of each connection phase, assign a cleanup callback to the connection pool object: use Apache2::Connection (); use APR::Pool (); my $pool = $c->pool; $pool->cleanup_register(\&my_cleanup); sub my_cleanup { ... } You can also create your own pool object, register a cleanup callback and it'll be called when the object is destroyed: use APR::Pool (); { my @args = 1..3; my $pool = APR::Pool->new; $pool->cleanup_register(\&cleanup, \@args); } sub cleanup { my @args = @{ +shift }; warn "cleanup was called with args: @args"; } In this example the cleanup callback gets called, when C<$pool> goes out of scope and gets destroyed. This is very similar to OO C method. =head1 Goodies Toolkit =head2 Environment Variables mod_perl sets the following environment variables: =over =item * C<$ENV{MOD_PERL}> - is set to the mod_perl version the server is running under. e.g.: mod_perl/2.000002 If C<$ENV{MOD_PERL}> doesn't exist, most likely you are not running under mod_perl. die "I refuse to work without mod_perl!" unless exists $ENV{MOD_PERL}; However to check which version is used it's better to use the following technique: use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ); # die "I want mod_perl 2.0!" unless MP2; =back mod_perl passes (exports) the following shell environment variables (if they are set) : =over =item * C - Executables search path. =item * C - Time Zone. =back Any of these environment variables can be accessed via C<%ENV>. =head2 Threaded MPM or not? If the code needs to behave differently depending on whether it's running under one of the threaded MPMs, or not, the class method Cis_threaded> can be used. For example: use Apache2::MPM (); if (Apache2::MPM->is_threaded) { require APR::OS; my $tid = APR::OS::current_thread_id(); print "current thread id: $tid (pid: $$)"; } else { print "current process id: $$"; } This code prints the current thread id if running under a threaded MPM, otherwise it prints the process id. =head2 Writing MPM-specific Code If you write a CPAN module it's a bad idea to write code that won't run under all MPMs, and developers should strive to write a code that works with all mpms. However it's perfectly fine to perform different things under different mpms. If you don't develop CPAN modules, it's perfectly fine to develop your project to be run under a specific MPM. use Apache2::MPM (); my $mpm = lc Apache2::MPM->show; if ($mpm eq 'prefork') { # prefork-specific code } elsif ($mpm eq 'worker') { # worker-specific code } elsif ($mpm eq 'winnt') { # winnt-specific code } else { # others... } =head1 Code Developing Nuances =head2 Auto-Reloading Modified Modules with Apache2::Reload META: need to port Apache2::Reload notes from the guide here. but the gist is: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload #PerlPreConnectionHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache2::*" Use: PerlInitHandler Apache2::Reload if you need to debug HTTP protocol handlers. Use: PerlPreConnectionHandler Apache2::Reload for any handlers. Though notice that we have started to practice the following style in our modules: package Apache2::Whatever; use strict; use warnings FATAL => 'all'; C 'all'> escalates all warnings into fatal errors. So when C is modified and reloaded by C the request is aborted. Therefore if you follow this very healthy style and want to use C, flex the strictness by changing it to: use warnings FATAL => 'all'; no warnings 'redefine'; but you probably still want to get the I warnings, but downgrade them to be non-fatal. The following will do the trick: use warnings FATAL => 'all'; no warnings 'redefine'; use warnings 'redefine'; Perl 5.8.0 allows to do all this in one line: use warnings FATAL => 'all', NONFATAL => 'redefine'; but if your code may be used with older perl versions, you probably don't want to use this new functionality. Refer to the I manpage for more information. =head1 Integration with Apache Issues In the following sections we discuss the specifics of Apache behavior relevant to mod_perl developers. =head2 HTTP Response Headers =head3 Generating HTTP Response Headers The best approach for generating HTTP response headers is by using the L. Some common headers have dedicated methods, others are set by manipulating the C> table directly. For example to set the I header you should call Ccontent_type|docs::2.0::api::Apache2::RequestRec/C_content_type_>>: use Apache2::RequestRec (); $r->content_type('text/html'); To C> a custom header I you should call: use Apache2::RequestRec (); use APR::Table; $r->headers_out->set(My-Header => "SomeValue"); If you are inside a registry script L the C> object. Howerever you can choose a slower method of generating headers by just printing them out before printing any response. This will work only if C> is in effect. For example: print "Content-type: text/html\n"; print "My-Header: SomeValue\n"; print "\n"; This method is slower since Apache needs to parse the text to identify certain headers it needs to know about. It also has several limitations which we will now discuss. When using this approach you must make sure that the C filehandle is not set to flush the data after each print (which is set by the value of a special perl variable C<$|>). Here we assume that STDOUT is the currently Ced filehandle and C<$|> affects it. For example this code won't work: local $| = 1; print "Content-type: text/html\n"; print "My-Header: SomeValue\n"; print "\n"; Having a true C<$|> causes the first print() call to flush its data immediately, which is sent to the internal HTTP header parser, which will fail since it won't see the terminating C<"\n\n">. One solution is to make sure that STDOUT won't flush immediately, like so: local $| = 0; print "Content-type: text/html\n"; print "My-Header: SomeValue\n"; print "\n"; Notice that we Cize that change, so it L. If you send headers line by line and their total length is bigger than 8k, you will have the header parser problem again, since mod_perl will flush data when the 8k buffer gets full. In which case the solution is not to print the headers one by one, but to buffer them all in a variable and then print the whole set at once. Notice that you don't have any of these problems with mod_cgi, because it ignores any of the flush attempts by Perl. mod_cgi simply opens a pipe to the external process and reads any output sent from that process at once. If you use C<$r> to set headers as explained at the beginning of this section, you won't encounter any of these problems. Finally, if you don't want Apache to send its own headers and you want to send your own set of headers (non-parsed headers handlers) use the Cassbackwards|docs::2.0::api::Apache2::RequestRec/C_assbackwards_>> method. Notice that registry handlers will do that for you if the script's name start with the C prefix. =head3 Forcing HTTP Response Headers Out Apache 2.0 doesn't provide a method to force HTTP response headers sending (what used to be done by C in Apache 1.3). HTTP response headers are sent as soon as the first bits of the response body are seen by the special core output filter that generates these headers. When the response handler sends the first chunks of body it may be cached by the mod_perl internal buffer or even by some of the output filters. The response handler needs to flush the output in order to tell all the components participating in the sending of the response to pass the data out. For example if the handler needs to perform a relatively long-running operation (e.g. a slow db lookup) and the client may timeout if it receives nothing right away, you may want to start the handler by setting the I header, following by an immediate flush: sub handler { my $r = shift; $r->content_type('text/html'); $r->rflush; # send the headers out $r->print(long_operation()); return Apache2::Const::OK; } If this doesn't work, check whether you have configured any third-party output filters for the resource in question. L may ignore the command to flush the data. =head2 Sending HTTP Response Body In mod_perl 2.0 a response body can be sent only during the response phase. Any attempts to do that in the earlier phases will fail with an appropriate explanation logged into the I file. This happens due to the Apache 2.0 HTTP architecture specifics. One of the issues is that the HTTP response filters are not setup before the response phase. =head2 Using Signal Handlers 3rd party Apache 2 modules should avoid using code relying on signals. This is because typical signal use is not thread-safe and modules which rely on signals may not work portably. Certain signals may still work for non-threaded mpms. For example C can be used under prefork MPM, but it won't work on any other MPM. Moreover the Apache developers don'tq guarantee that the signals that currently happen to work will continue to do so in the future Apache releases. So use them at your own risk. It should be possible to rework the code using signals to use an alternative solution, which works under threads. For example if you were using C to trap potentially long running I/O, you can modify the I/O logic for select/poll usage (or if you use APR I/O then set timeouts on the apr pipes or sockets). For example, Apache 1.3 on Unix made blocking I/O calls and relied on the parent process to send the SIGALRM signal to break it out of the I/O after a timeout expired. With Apache 2.0, APR support for timeouts on I/O operations is used so that signals or other thread-unsafe mechanisms are not necessary. CPU timeout handling is another example. It can be accomplished by modifying the computation logic to explicitly check for the timeout at intervals. Talking about C under prefork mpm, POSIX signals seem to work, but require Perl 5.8.x+. For example: use POSIX qw(SIGALRM); my $mask = POSIX::SigSet->new( SIGALRM ); my $action = POSIX::SigAction->new(sub { die "alarm" }, $mask); my $oldaction = POSIX::SigAction->new(); POSIX::sigaction(SIGALRM, $action, $oldaction ); eval { alarm 2; sleep 10 # some real code should be here alarm 0; }; POSIX::sigaction(SIGALRM, $oldaction); # restore original warn "got alarm" if $@ and $@ =~ /alarm/; For more details see: http://search.cpan.org/dist/perl/ext/POSIX/POSIX.pod#POSIX::SigAction. One could use the C<$SIG{ALRM}> technique, working for 5.6.x+, but it works B under DSO modperl build. Moreover starting from 5.8.0 Perl delays signal delivery, making signals safe. This change may break previously working code. For more information please see: http://search.cpan.org/dist/perl/pod/perl58delta.pod#Safe_Signals and http://search.cpan.org/dist/perl/pod/perlipc.pod#Deferred_Signals_%28Safe_Signals%29. For example if you had the alarm code: eval { local $SIG{ALRM} = sub { die "alarm" }; alarm 3; sleep 10; # in reality some real code should be here alarm 0; }; die "the operation was aborted" if $@ and $@ =~ /alarm/; It may not work anymore. Starting from 5.8.1 it's possible to circumvent the safeness of signals, by setting: $ENV{PERL_SIGNALS} = "unsafe"; as soon as you start your program (e.g. in the case of mod_perl in startup.pl). As of this writing, this workaround fails on MacOSX, POSIX signals must be used instead. For more information please refer to: http://search.cpan.org/dist/perl/pod/perl581delta.pod#Unsafe_signals_again_available and http://search.cpan.org/dist/perl/pod/perlrun.pod#PERL_SIGNALS. Though if you use perl 5.8.x+ it's preferrable to use the POSIX API technique explained earlier in this section. =head1 Perl Specifics in the mod_perl Environment In the following sections we discuss the specifics of Perl behavior under mod_perl. =head2 C Blocks Perl executes C blocks as soon as possible, at the time of compiling the code. The same is true under mod_perl. However, since mod_perl normally only compiles scripts and modules once, either in the parent server (at the server startup) or once per-child (on the first request using a module), C blocks in that code will only be run once. As the C manpage explains, once a C block has run, it is immediately undefined. In the mod_perl environment, this means that C blocks will not be run during the response to an incoming request unless that request happens to be the one that causes the compilation of the code, i.e. if it wasn't loaded yet. C blocks in modules and files pulled in via C or C will be executed: =over 4 =item * Only once, if pulled in by the parent process at the server startup. =item * Once per each child process or Perl interpreter if not pulled in by the parent process. =item * An additional time, once per each child process or Perl interpreter if the module is reloaded off disk again via C>. =item * Unpredictable if you fiddle with C<%INC> yourself. =back The C blocks behavior is different in C> and C> handlers, and their subclasses. =head2 C and C Blocks C and C blocks run when the source code compilation is complete, but before the program starts. C can mean "checkpoint" or "double-check" or even just "stop". C stands for "initialization". The difference is subtle; C blocks are run just after the compilation ends, C just before the runtime begins. (Hence the C<-c> command-line perl option runs C blocks but not C blocks.) Perl only calls these blocks during I, which mod_perl calls once at startup time. Under threaded mpm, these blocks will be called once per C>. Therefore C and C blocks don't work after the server is started, for the same reason these code samples don't work: % perl -e 'eval qq(CHECK { print "ok\n" })' % perl -e 'eval qq(INIT { print "ok\n" })' =head2 C Blocks As the C manpage explains, an C block is executed as late as possible, that is, when the interpreter exits. So for example mod_cgi will run its C blocks on each invocation, since on every invocation it starts a new interpreter and then kills it when the request processing is done. In the mod_perl environment, the interpreter does not exit after serving a single request (unless it is configured to do so) and hence it will run its C blocks only when it exits, which usually happens during the server shutdown, but may also happen earlier than that (e.g. a process exits because it has served a C number of requests). mod_perl does L for scripts running under C> and friends. The L section explains how to deal with cleanups for non-Registry handlers. C> API: C>, C> and C>, internally used by registry handlers, can be used to run C blocks at arbitrary times. =head2 Request-localized Globals mod_perl 2.0 provides two types of C handlers: C> and C>. Remember that the C directive is only relevant for the response phase handlers, it neither needed nor affects non-response phases. Under the handler: SetHandler perl-script several special global Perl variables are saved before the handler is called and restored afterwards. This includes: C<%ENV>, C<@INC>, C<$/>, C's C<$|> and C blocks array (C). Under: SetHandler modperl nothing is restored, so you should be especially careful to remember localize all special Perl variables so the local changes won't affect other handlers. =head2 C In the normal Perl code exit() is used to stop the program flow and exit the Perl interpreter. However under mod_perl we only want the stop the program flow without killing the Perl interpreter. You should take no action if your code includes exit() calls and it's OK to continue using them. mod_perl worries to override the exit() function with L which stops the program flow, and performs all the necessary cleanups, but doesn't kill the server. This is done by overriding: *CORE::GLOBAL::exit = \&ModPerl::Util::exit; so if you mess up with C<*CORE::GLOBAL::exit> yourself you better know what you are doing. You can still call C to kill the interpreter, again if you know what you are doing. One caveat is when C is called inside C -- L explains how to deal with this situation. =head1 C Handlers Family =head2 A Look Behind the Scenes If you have a CGI script F: #!/usr/bin/perl print "Content-type: text/plain\n\n"; print "Hello"; a typical registry family handler turns it into something like: package foo_bar_baz; sub handler { local $0 = "/full/path/to/test.pl"; #line 1 test.pl #!/usr/bin/perl print "Content-type: text/plain\n\n"; print "Hello"; } Turning it into an almost full-fledged mod_perl handler. The only difference is that it handles the return status for you. (META: more details on return status needed.) It then executes it as: foo_bar_baz::handler($r); passing the C> object as the only argument to the C function. Depending on the used registry handler the package is made of the file path, the uri or anything else. Check the handler's documentation to learn which method is used. =head2 Getting the C<$r> Object As explained in L the C<$r> object is always passed to the registry script's special function C as the first and the only argument, so you can get this object by accessing C<@_>, since: my $r = shift; print "Content-type: text/plain\n\n"; print "Hello"; is turned into: sub handler { my $r = shift; print "Content-type: text/plain\n\n"; print "Hello"; } behind the scenes. Now you can use C<$r> to call various mod_perl methods, e.g. rewriting the script as: my $r = shift; $r->content_type('text/plain'); $r->print(); If you are deep inside some code and can't get to the entry point to reach for C<$r>, you can use Crequest|docs::2.0::api::Apache2::RequestUtil/C_request_>>. =head1 Threads Coding Issues Under mod_perl The following sections discuss threading issues when running mod_perl under a threaded MPM. =head2 Thread-environment Issues The "only" thing you have to worry about your code is that it's thread-safe and that you don't use functions that affect all threads in the same process. Perl 5.8.0 itself is thread-safe. That means that operations like C, C, C, C<=>, C, C<+=>, etc. are thread-safe. Operations that involve system calls, may or may not be thread-safe. It all depends on whether the underlying C libraries used by the perl functions are thread-safe. For example the function C is not thread-safe when the implementation of C is not thread-safe. Other usually problematic functions include C, C, etc. Another important issue that shouldn't be missed is what some people refer to as I. Certain functions executed in a single thread affect the whole process and therefore all other threads running inside that process. For example if you C in one thread, all other thread now see the current working directory of that thread that C'ed to that directory. Other functions with similar effects include C, C, etc. Currently there is no cure for this problem. You have to find these functions in your code and replace them with alternative solutions which don't incur this problem. For more information refer to the I (I) manpage. =head2 Deploying Threads This is actually quite unrelated to mod_perl 2.0. You don't have to know much about Perl threads, other than L, to have your code properly work under threaded MPM mod_perl. If you want to spawn your own threads, first of all study how the new ithreads Perl model works, by reading the I, I (I) and I (I) manpages. Artur Bergman wrote an article which explains how to port pure Perl modules to work properly with Perl ithreads. Issues with C and other functions that rely on shared process' datastructures are discussed. I. =head2 Shared Variables Global variables are only global to the interpreter in which they are created. Other interpreters from other threads can't access that variable. Though it's possible to make existing variables shared between several threads running in the same process by using the function C. New variables can be shared by using the I attribute when creating them. This feature is documented in the I (I) manpage. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/coding/cooking.pod0000644000177200010010000000506512540623177017406 0ustar SteveNone=head1 NAME Cooking Recipes =head1 Description As the chapter's title implies, here you will find ready-to-go mod_perl 2.0 recipes. If you know a useful recipe, not yet listed here, please post it to L and we will add it here. =head1 Sending Cookies in REDIRECT Response (ModPerl::Registry) use CGI::Cookie (); use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => qw(REDIRECT); my $location = "http://example.com/final_destination/"; sub handler { my $r = shift; my $cookie = CGI::Cookie->new(-name => 'mod_perl', -value => 'awesome'); $r->err_headers_out->add('Set-Cookie' => $cookie); $r->headers_out->set(Location => $location); $r->status(Apache2::Const::REDIRECT); return Apache2::Const::REDIRECT; } 1; =head1 Sending Cookies in REDIRECT Response (handlers) use CGI::Cookie (); use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => qw(REDIRECT); my $location = "http://example.com/final_destination/"; sub handler { my $r = shift; my $cookie = CGI::Cookie->new(-name => 'mod_perl', -value => 'awesome'); $r->err_headers_out->add('Set-Cookie' => $cookie); $r->headers_out->set(Location => $location); return Apache2::Const::REDIRECT; } 1; note that this example differs from the Registry example only in that it does not attempt to fiddle with C<$r-Estatus()> - C uses C<$r-Estatus()> as a hack, but handlers should never manipulate the status field in the request record. =head1 Sending Cookies Using libapreq2 use Apache2::Request (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); use APR::Table (); use APR::Request::Cookie (); sub handler { my $r = shift; my $req = $r->pool(); my $cookie = APR::Request::Cookie->new($req, name => "foo", value => time(), path => '/cookie'); $r->err_headers_out->add('Set-Cookie' => $cookie->as_string); $r->content_type("text/plain"); $r->print("Testing...."); return Apache2::Const::OK; } =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/config/0000755000104000010010000000000012540623200017131 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/config/config.pod0000644000104000010010000012062312540623177021123 0ustar AdministratorsNone=head1 NAME mod_perl 2.0 Server Configuration =head1 Description This chapter provides an in-depth mod_perl 2.0 configuration details. =head1 mod_perl configuration directives Similar to mod_perl 1.0, in order to use mod_perl 2.0 a few configuration settings should be added to I. They are quite similar to 1.0 settings but some directives were renamed and new directives were added. =head1 Enabling mod_perl To enable mod_perl built as DSO add to I: LoadModule perl_module modules/mod_perl.so This setting specifies the location of the mod_perl module relative to the C setting, therefore you should put it somewhere after C is specified. If mod_perl has been statically linked it's automatically enabled. For Win32 specific details, see the documentation on L. Remember that you can't use mod_perl until you have configured Apache to use it. You need to configure L or L. =head1 Server Configuration Directives =head2 CPerlE> Sections With CPerlE>...C/PerlE> sections, it is possible to configure your server entirely in Perl. Please refer to the L manpage for more information. META: a dedicated chapter with examples? See also: L. =head2 C<=pod>, C<=over> and C<=cut> It's known that anything written between tokens C<=pod> and C<=cut> is ignored by the Perl parser. mod_perl allows you to use the same technique to make Apache ignore things in F (similar to # comments). With an exception to C<=over apache> and C<=over httpd> sections which are visible to Apache. For example the following configuration: #file: httpd.conf =pod PerlSetVar A 1 =over apache PerlSetVar B 2 =back PerlSetVar C 3 =cut PerlSetVar D 4 Apache will see: PerlSetVar B 2 PerlSetVar D 4 but not: PerlSetVar A 1 PerlSetVar C 3 C<=over httpd> is just an alias to C<=over apache>. Remember that C<=over> requires a corresponding C<=back>. =head2 C C is useful if you need to pass in multiple values into the same variable emulating arrays and hashes. For example: PerlAddVar foo bar PerlAddVar foo bar1 PerlAddVar foo bar2 You would retrieve these values with: my @foos = $r->dir_config->get('foo'); This would fill the I<@foos> array with 'bar', 'bar1', and 'bar2'. To pass in hashed values you need to ensure that you use an even number of directives per key. For example: PerlAddVar foo key1 PerlAddVar foo value1 PerlAddVar foo key2 PerlAddVar foo value2 You can then retrieve these values with: my %foos = $r->dir_config->get('foo'); Where I<%foos> will have a structure like: %foos = ( key1 => 'value1', key2 => 'value2', ); See also: L. =head2 C C does the same thing as C>, but it is executed as soon as it is encountered, i.e. during the configuration phase. You should be using this directive to load only files that introduce new configuration directives, used later in the configuration file. For any other purposes (like preloading modules) use C>. One of the reasons for avoding using the C directive, is that the C stream is not available during the restart phase, therefore the errors will be not reported. It is not a bug in mod_perl but an Apache limitation. Use C> if you can, and there you have the C stream sent to the error_log file (by default). See also: L. =head2 C The C directive is similar to C>, in a sense that it loads a module. The difference is that it's used to triggers L. This can be useful for modules that need to be loaded early, as is the case for modules that implement L, which are needed during the configuration phase. See also: L. =head2 C PerlModule Foo::Bar is equivalent to Perl's: require Foo::Bar; C is used to load modules using their package names. You can pass one or more module names as arguments to C: PerlModule Apache::DBI CGI DBD::Mysql Notice, that normally, the Perl startup is L until after the configuration phase. See also: C>. See also: L. =head2 C The directive C provides fine-grained configuration for what were compile-time only options in the first mod_perl generation. It also provides control over what class of Perl interpreter pool is used for a CVirtualHostE> or location configured with CLocationE>, CDirectoryE>, etc. L<$r-Eis_perl_option_enabled($option)|docs::2.0::api::Apache2::RequestUtil/C_is_perl_option_enabled_> and L<$s-Eis_perl_option_enabled($option)|docs::2.0::api::Apache2::ServerUtil/C_is_perl_option_enabled_> can be used at run-time to check whether a certain C<$option> has been enabled. (META: probably need to add/move this to the coding chapter) Options are enabled by prepending C<+> and disabled with C<->. See also: L. The available options are: =head3 C On by default, can be used to disable mod_perl for a given C. For example: PerlOptions -Enable =head3 C Share the parent Perl interpreter, but give the C its own interpreter pool. For example should you wish to fine tune interpreter pools for a given virtual host: PerlOptions +Clone PerlInterpStart 2 PerlInterpMax 2 This might be worthwhile in the case where certain hosts have their own sets of large-ish modules, used only in each host. By tuning each host to have its own pool, that host will continue to reuse the Perl allocations in their specific modules. =head3 C Off by default, can be used to have a C inherit the value of the C from the parent server. For instance, when cloning a Perl interpreter, to inherit the base Perl interpreter's C use: PerlOptions +Clone +InheritSwitches ... =head3 C Create a new parent Perl interpreter for the given C and give it its own interpreter pool (implies the C option). A common problem with mod_perl 1.0 was the shared namespace between all code within the process. Consider two developers using the same server and each wants to run a different version of a module with the same name. This example will create two I Perl interpreters, one for each CVirtualHostE>, each with its own namespace and pointing to a different paths in C<@INC>: META: is -Mlib portable? (problems with -Mlib on Darwin/5.6.0?) ServerName dev1 PerlOptions +Parent PerlSwitches -Mlib=/home/dev1/lib/perl ServerName dev2 PerlOptions +Parent PerlSwitches -Mlib=/home/dev2/lib/perl Remember that C<+Parent> gives you a completely new Perl interpreters pool, so all your modifications to C<@INC> and preloading of the modules should be done again. Consider using L if you want to inherit from the parent Perl interpreter. Or even for a given location, for something like "dirty" cgi scripts: PerlOptions +Parent PerlInterpMaxRequests 1 PerlInterpStart 1 PerlInterpMax 1 PerlResponseHandler ModPerl::Registry will use a fresh interpreter with its own namespace to handle each request. =head3 C Disable Cs, all compiled-in handlers are enabled by default. The option name is derived from the C name, by stripping the C and C parts of the word. So C becomes C which can be used to disable C: PerlOptions -Log Suppose one of the hosts does not want to allow users to configure C, C, C and EPerlE sections: PerlOptions -Authen -Authz -Access -Sections Or maybe everything but the response handler: PerlOptions None +Response =head3 C Resolve C at startup time, which includes loading the modules from disk if not already loaded. In mod_perl 1.0, configured C which are not a fully qualified subroutine names are resolved at request time, loading the handler module from disk if needed. In mod_perl 2.0, configured C are resolved at startup time. By default, modules are not auto-loaded during startup-time resolution. It is possible to enable this feature with: PerlOptions +Autoload Consider this configuration: PerlResponseHandler Apache::Magick In this case, C is the package name, and the subroutine name will default to I. If the C module is not already loaded, C will attempt to pull it in at startup time. With this option enabled you don't have to explicitly load the handler modules. For example you don't need to add: PerlModule Apache::Magick in our example. Another way to preload only specific modules is to add + when configuring those, for example: PerlResponseHandler +Apache::Magick will automatically preload the C module. =head3 C Setup the global C> object for use with Crequest|docs::2.0::api::Apache2::RequestUtil/C_request_>>. This setting is enabled by default during the C> phase for sections configured as: SetHandler perl-script ... but is not enabled by default for sections configured as: SetHandler modperl .... And can be disabled with: SetHandler perl-script PerlOptions -GlobalRequest ... Notice that if you need the global request object during other phases, you will need to explicitly enable it in the configuration file. You can also set that global object from the handler code, like so: sub handler { my $r = shift; Apache2::RequestUtil->request($r); ... } The C<+GlobalRequest> setting is needed for example if you use older versions of C to process the incoming request. Starting from version 2.93, C optionally accepts C<$r> as an argument to C, like so: sub handler { my $r = shift; my $q = CGI->new($r); ... } Remember that inside registry scripts you can always get C<$r> at the beginning of the script, since it gets wrapped inside a subroutine and accepts C<$r> as the first and the only argument. For example: #!/usr/bin/perl use CGI; my $r = shift; my $q = CGI->new($r); ... of course you won't be able to run this under mod_cgi, so you may need to do: #!/usr/bin/perl use CGI; my $q = $ENV{MOD_PERL} ? CGI->new(shift @_) : CGI->new(); ... in order to have the script running under mod_perl and mod_cgi. =head3 C Scan output for HTTP headers, same functionality as mod_perl 1.0's C, but more robust. This option is usually needs to be enabled for registry scripts which send the HTTP header with: print "Content-type: text/html\n\n"; =head3 C Turn on merging of C arrays. For example with a setting: PerlFixupHandler Apache2::FixupA PerlFixupHandler Apache2::FixupB a request for I only runs C (mod_perl 1.0 behavior). But with this configuration: PerlFixupHandler Apache2::FixupA PerlOptions +MergeHandlers PerlFixupHandler Apache2::FixupB a request for I will run both C and C handlers. =head3 C Set up environment variables for each request ala mod_cgi. When this option is enabled, I fiddles with the environment to make it appear as if the code is called under the mod_cgi handler. For example, the C<$ENV{QUERY_STRING}> environment variable is initialized with the contents of I, and the value returned by I is put into C<$ENV{SERVER_NAME}>. But C<%ENV> population is expensive. Those who have moved to the Perl Apache API no longer need this extra C<%ENV> population, and can gain by disabling it. A code using the C module require C because that module relies on a properly populated CGI environment table. This option is enabled by default for sections configured as: SetHandler perl-script ... Since this option adds an overhead to each request, if you don't need this functionality you can turn it off for a certain section: SetHandler perl-script PerlOptions -SetupEnv ... or globally: PerlOptions -SetupEnv ... and then it'll affect the whole server. It can still be enabled for sections that need this functionality. When this option is disabled you can still read environment variables set by you. For example when you use the following configuration: PerlOptions -SetupEnv PerlModule ModPerl::Registry PerlSetEnv TEST hi SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI and you issue a request for this script: setupenvoff.pl -------------- use Data::Dumper; my $r = Apache2::RequestUtil->request(); $r->content_type('text/plain'); print Dumper(\%ENV); you should see something like this: $VAR1 = { 'GATEWAY_INTERFACE' => 'CGI-Perl/1.1', 'MOD_PERL' => 'mod_perl/2.0.1', 'PATH' => 'bin:/usr/bin', 'TEST' => 'hi' }; Notice that we have got the value of the environment variable I. =head2 C C instructs mod_perl to pass the environment variables you specify to your mod_perl handlers. This is useful if you need to set the same environment variables for your shell as well as mod_perl. For example if you had this in your .bash_profile: export ORACLE_HOME=/oracle And defined the following in your I: PerlPassEnv ORACLE_HOME The your mod_perl handlers would have access to the value via the standard Perl mechanism: my $oracle_home = $ENV{'ORACLE_HOME'}; See also: L. =head2 C PerlPostConfigRequire /home/httpd/perl/lib/startup.pl is equivalent to Perl's: require "/home/httpd/perl/lib/startup.pl"; A C filename argument can be absolute or relative to C or a filepath in Perl's C<@INC>. You can pass one or more filenames as arguments to C: PerlPostConfigRequire path1/startup.pl path2/startup.pl C is used to load files with Perl code to be run at the server startup. It's not executed as soon as it is encountered, but L during the server startup. Most of the time you should be using this directive. For example to preload some modules or run things at the server startup). Only if you need to load modules that introduce new configuration directives, used later in the configuration file you should use C>. As with any file with Perl code that gets C'd or C'd, it must return a I value. To ensure that this happens don't forget to add C<1;> at the end of F>. See also: C> and C>. See also: L. =head2 C C does the same thing as C>, but you have almost no control of L. Therefore you should be using either C> (executes immediately) or C> (executes just before the end of the server startup) instead. Most of the time you want to use the latter. See also: L. =head2 C C allows you to specify system environment variables and pass them into your mod_perl handlers. These values are then available through the normal perl C<%ENV> mechanisms. For example: PerlSetEnv TEMPLATE_PATH /usr/share/templates would create C<$ENV{'TEMPLATE_PATH'}> and set it to I. See also: L. =head2 C C allows you to pass variables into your mod_perl handlers from your I. This method is preferable to using C or Apache's C and C methods because of the overhead of having to populate C<%ENV> for each request. An example of how this can be used is: PerlSetVar foo bar To retrieve the value of that variable in your Perl code you would use: my $foo = $r->dir_config('foo'); In this example C<$foo> would then hold the value 'bar'. B that these directives are parsed at request time which is a slower method than using L See also: L. =head2 C Now you can pass any Perl's command line switches in I using the C directive. For example to enable warnings and Taint checking add: PerlSwitches -wT As an alternative to using C in I to adjust C<@INC>, now you can use the command line switch C<-I> to do that: PerlSwitches -I/home/stas/modperl You could also use C<-Mlib=/home/stas/modperl> which is the exact equivalent as C, but it's broken on certain platforms/version (e.g. Darwin/5.6.0). C is removing duplicated entries, whereas C<-I> does not. See also: L. =head2 C mod_perl 2.0 provides two types of C handlers: C and C. The C directive is only relevant for response phase handlers. It doesn't affect other phases. See also: L. =head3 C Configured as: SetHandler modperl The bare mod_perl handler type, which just calls the C's callback function. If you don't need the features provided by the I handler, with the C handler, you can gain even more performance. (This handler isn't available in mod_perl 1.0.) Unless the C callback, running under the C handler, is configured with: PerlOptions +SetupEnv or calls: $r->subprocess_env; in a void context with no arguments (which has the same effect as C for the handler that called it), only the following environment variables are accessible via C<%ENV>: =over =item * C and C (always) =item * C and C (if you had them defined in the shell or I) =back Therefore if you don't want to add the overhead of populating C<%ENV>, when you simply want to pass some configuration variables from I, consider using C and C instead of C and C. In your code you can retrieve the values using the C method. For example if you set in I: SetHandler modperl PerlResponseHandler Apache2::VarTest PerlSetVar VarTest VarTestValue this value can be retrieved inside C with: $r->dir_config('VarTest'); Alternatively use the Apache core directives C and C, which always populate Csubprocess_env>, but this doesn't happen until the Apache I phase, which could be too late for your needs. Notice also that this handler does not reset C<%ENV> after each request's response phase, so if one response handler has changed C<%ENV> without localizing the change, it'll affect other handlers running after it as well. =head3 C Configured as: SetHandler perl-script Most mod_perl handlers use the I handler. Among other things it does: =over =item * C is in effect only during the PerlResponseHandler phase unless: PerlOptions -GlobalRequest is specified. =item * C is in effect unless: PerlOptions -SetupEnv is specified. =item * C and C get tied to the request object C<$r>, which makes possible to read from C and print directly to C via C, instead of implicit calls like C<$r-Eputs()>. =item * Several special global Perl variables are saved before the response handler is called and restored afterwards (similar to mod_perl 1.0). This includes: C<%ENV>, C<@INC>, C<$/>, C's C<$|> and C blocks array (C). =item * Entries added to C<%ENV> are passed on to the C table, and are thus accessible via Csubprocess_env> during the later C and C phases. =back =head3 Examples Let's demonstrate the differences between the C and the C core handlers in the following example, which represents a simple mod_perl response handler which prints out the environment variables as seen by it: file:MyApache2/PrintEnv1.pm ----------------------- package MyApache2::PrintEnv1; use strict; use Apache2::RequestRec (); # for $r->content_type use Apache2::RequestIO (); # for print use Apache2::Const -compile => ':common'; sub handler { my $r = shift; $r->content_type('text/plain'); for (sort keys %ENV){ print "$_ => $ENV{$_}\n"; } return Apache2::Const::OK; } 1; This is the required configuration: PerlModule MyApache2::PrintEnv1 SetHandler perl-script PerlResponseHandler MyApache2::PrintEnv1 Now issue a request to I and you should see all the environment variables printed out. Here is the same response handler, adjusted to work with the C core handler: file:MyApache2/PrintEnv2.pm ------------------------ package MyApache2::PrintEnv2; use strict; use Apache2::RequestRec (); # for $r->content_type use Apache2::RequestIO (); # for $r->print use Apache2::Const -compile => ':common'; sub handler { my $r = shift; $r->content_type('text/plain'); $r->subprocess_env; for (sort keys %ENV){ $r->print("$_ => $ENV{$_}\n"); } return Apache2::Const::OK; } 1; The configuration now will look as: PerlModule MyApache2::PrintEnv2 SetHandler modperl PerlResponseHandler MyApache2::PrintEnv2 C cannot use C and therefore uses C<$r-Eprint()> to generate a response. Under the C core handler C<%ENV> is not populated by default, therefore C is called in a void context. Alternatively we could configure this section to do: PerlOptions +SetupEnv If you issue a request to I, you should see all the environment variables printed out as with I. =head1 Server Life Cycle Handlers Directives See L. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head1 Protocol Handlers Directives See L. =head2 C See C>. =head2 C See C>. =head1 Filter Handlers Directives mod_perl filters are described in the L, C> and C> manpages. The following filter handler configuration directives are available: =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head1 HTTP Protocol Handlers Directives See L. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head2 C See C>. =head1 Threads Mode Specific Directives These directives are enabled only in a threaded mod_perl+Apache combo: =head2 C The number of interpreters to clone at startup time. Default value: 3 See also: L. =head2 C If all running interpreters are in use, mod_perl will clone new interpreters to handle the request, up until this number of interpreters is reached. when C is reached, mod_perl will block (via COND_WAIT()) until one becomes available (signaled via COND_SIGNAL()). Default value: 5 See also: L. =head2 C The minimum number of available interpreters this parameter will clone interpreters up to C, before a request comes in. Default value: 3 See also: L. =head2 C mod_perl will throttle down the number of interpreters to this number as those in use become available. Default value: 3 =head2 C The maximum number of requests an interpreter should serve, the interpreter is destroyed when the number is reached and replaced with a fresh clone. Default value: 2000 See also: L. =head1 Debug Directives =head2 C The C is used for tracing the mod_perl execution. This directive is enabled when mod_perl is compiled with the C option. To enable tracing, add to I: PerlTrace [level] where C is either: all which sets maximum logging and debugging levels; a combination of one or more option letters from the following list: a Apache API interaction c configuration for directive handlers d directive processing f filters e environment variables g globals management h handlers i interpreter pool management m memory allocations o I/O r Perl runtime interaction s Perl sections t benchmark-ish timings Tracing options add to the previous setting and don't override it. So for example: PerlTrace c ... PerlTrace f will set tracing level first to 'c' and later to 'cf'. If you wish to override settings, unset any previous setting by assigning 0 (zero), like so: PerlTrace c ... PerlTrace 0 PerlTrace f now the tracing level is set only to 'f'. You can't mix the number 0 with letters, it must be alone. When C is not specified, the tracing level will be set to the value of the C<$ENV{MOD_PERL_TRACE}> environment variable. See also: L. =head1 mod_perl Directives Argument Types and Allowed Location The following table shows where in the configuration files mod_perl configuration directives are allowed to appear, what kind and how many arguments they expect: General directives: Directive Arguments Scope -------------------------------------------- PerlSwitches ITERATE SRV PerlRequire ITERATE SRV PerlConfigRequire ITERATE SRV PerlPostConfigRequire ITERATE SRC PerlModule ITERATE SRV PerlLoadModule RAW_ARGS SRV PerlOptions ITERATE DIR PerlSetVar TAKE2 DIR PerlAddVar ITERATE2 DIR PerlSetEnv TAKE2 DIR PerlPassEnv TAKE1 SRV Sections RAW_ARGS SRV PerlTrace TAKE1 SRV Handler assignment directives: Directive Arguments Scope -------------------------------------------- PerlOpenLogsHandler ITERATE SRV PerlPostConfigHandler ITERATE SRV PerlChildInitHandler ITERATE SRV PerlChildExitHandler ITERATE SRV PerlPreConnectionHandler ITERATE SRV PerlProcessConnectionHandler ITERATE SRV PerlPostReadRequestHandler ITERATE SRV PerlTransHandler ITERATE SRV PerlMapToStorageHandler ITERATE SRV PerlInitHandler ITERATE DIR PerlHeaderParserHandler ITERATE DIR PerlAccessHandler ITERATE DIR PerlAuthenHandler ITERATE DIR PerlAuthzHandler ITERATE DIR PerlTypeHandler ITERATE DIR PerlFixupHandler ITERATE DIR PerlResponseHandler ITERATE DIR PerlLogHandler ITERATE DIR PerlCleanupHandler ITERATE DIR PerlInputFilterHandler ITERATE DIR PerlOutputFilterHandler ITERATE DIR PerlSetInputFilter ITERATE DIR PerlSetOutputFilter ITERATE DIR Perl Interpreter management directives: Directive Arguments Scope -------------------------------------------- PerlInterpStart TAKE1 SRV PerlInterpMax TAKE1 SRV PerlInterpMinSpare TAKE1 SRV PerlInterpMaxSpare TAKE1 SRV PerlInterpMaxRequests TAKE1 SRV mod_perl 1.0 back-compatibility directives: Directive Arguments Scope -------------------------------------------- PerlHandler ITERATE DIR PerlSendHeader FLAG DIR PerlSetupEnv FLAG DIR PerlTaintCheck FLAG SRV PerlWarn FLAG SRV The I column represents the type of arguments directives accepts, where: =over =item ITERATE Expects a list of arguments. =item ITERATE2 Expects one argument, followed by at least one or more arguments. =item TAKE1 Expects one argument only. =item TAKE2 Expects two arguments only. =item FLAG One of C or C (case insensitive). =item RAW_ARGS The function parses the command line by itself. =back The I column shows the location the directives are allowed to appear in: =over =item SRV Global configuration and CVirtualHostE> (mnemonic: I). These directives are defined as C in the source code. =item DIR CDirectoryE>, CLocationE>, CFilesE> and all their regular expression variants (mnemonic: I). These directives can also appear in I<.htaccess> files. These directives are defined as C in the source code. These directives can also appear in the global server configuration and CVirtualHostE>. =back Apache specifies other allowed location types which are currently not used by the core mod_perl directives and their definition can be found in I (hint: search for C). Also see L. =head1 Server Startup Options Retrieval Inside I one can do conditional configuration based on the define options passed at the server startup. For example: use Apache::DB (); Apache::DB->init; PerlFixupHandler Apache::DB So only when the server is started as: % httpd C<-DPERLDB> ... The configuration inside C will have an effect. If you want to have some configuration section to have an effect if a certain define wasn't defined use C, for example here is the opposite of the previous example: # ... If you need to access any of the startup defines in the Perl code you use C>. For example in a startup file you can say: use Apache2::ServerUtil (); if (Apache2::ServerUtil::exists_config_define("PERLDB")) { require Apache::DB; Apache::DB->init; } For example to check whether the server has been started in a single mode use: if (Apache2::ServerUtil::exists_config_define("ONE_PROCESS")) { print "Running in a single mode"; } =head2 C Define Option When running under mod_perl 2.0 a special configuration "define" symbol C is enabled internally, as if the server had been started with C<-DMODPERL2>. For example this can be used to write a configuration file which needs to do something different whether it's running under mod_perl 1.0 or 2.0: # 2.0 configuration # else From within Perl code this can be tested with C>, for example: use Apache2::ServerUtil (); if (Apache2::ServerUtil::exists_config_define("MODPERL2")) { # some 2.0 specific code } =head1 Perl Interface to the Apache Configuration Tree For now refer to the L manpage and the test I in the mod_perl source distribution. META: need help to write the tutorial section on this with examples. =head1 Adjusting C<@INC> You can always adjust contents of C<@INC> before the server starts. There are several ways to do that. =over =item * I In L you can use the C pragma like so: use lib qw(/home/httpd/project1/lib /tmp/lib); use lib qw(/home/httpd/project2/lib); =item * I In I you can use the C directive to pass arguments to perl as you do from the command line, e.g.: PerlSwitches -I/home/httpd/project1/lib -I/tmp/lib PerlSwitches -I/home/httpd/project2/lib =back =head2 C and C Environment Variables The effect of the C and C environment variables on C<@INC> is described in the I manpage. mod_perl 2.0 doesn't do anything special about them. It's important to remind that both C and C are ignored when the taint mode (C) is in effect. Since you want to make sure that your mod_perl server is running under the taint mode, you can't use the C and C environment variables. However there is the I module on CPAN, which, if loaded, bypasses perl's security and will affect C<@INC>. Use it only if you know what you are doing. =head2 Modifying C<@INC> on a Per-VirtualHost If Perl used with mod_perl was built with ithreads support one can specify different C<@INC> values for different VirtualHosts, using a combination of C> and C>. For example: ServerName dev1 PerlOptions +Parent PerlSwitches -I/home/dev1/lib/perl ServerName dev2 PerlOptions +Parent PerlSwitches -I/home/dev2/lib/perl This technique works under any MPM with ithreads-enabled perl. It's just that under prefork your procs will be huge, because you will build a pool of interpreters in each process. While the same happens under threaded mpm, there you have many threads per process, so you need just 1 or 2 procs and therefore less memory will be used. =head1 General Issues =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Doug MacEachern Edougm (at) covalent.netE =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/config/custom.pod0000644000177200010010000013252012540623200017251 0ustar SteveNone=head1 NAME Apache Server Configuration Customization in Perl =head1 Description This chapter explains how to create custom Apache configuration directives in Perl. =head1 Incentives mod_perl provides several ways to pass custom configuration information to the modules. The simplest way to pass custom information from the configuration file to the Perl module is to use the C> and C> directives. For example: PerlSetVar Secret "Matrix is us" and in the mod_perl code this value can be retrieved as: my $secret = $r->dir_config("Secret"); Another alternative is to add custom configuration directives. There are several reasons for choosing this approach: =over =item * When the expected value is not a simple argument, but must be supplied using a certain syntax, Apache can verify at startup time that this syntax is valid and abort the server start up if the syntax is invalid. =item * Custom configuration directives are faster because their values are parsed at the startup time, whereas C and C values are parsed at the request time. =item * It's possible that some other modules have accidentally chosen to use the same key names but for absolutely different needs. So the two now can't be used together. Of course this collision can be avoided if a unique to your module prefix is used in the key names. For example: PerlSetVar ApacheFooSecret "Matrix is us" =back Finally, modules can be configured in pure Perl using CPerlE Sections|docs::2.0::user::config::config/C_E_lt_PerlE_gt___Sections>> or L, by simply modifying the global variables in the module's package. This approach could be undesirable because it requires a use of globals, which we all try to reduce. A bigger problem with this approach is that you can't have different settings for different sections of the site (since there is only one version of a global variable), something that the previous two approaches easily achieve. =head1 Creating and Using Custom Configuration Directives In mod_perl 2.0, adding new configuration directives is a piece of cake, because it requires no XS code and I, needed in case of mod_perl 1.0. In mod_perl 2.0, custom directives are implemented in pure Perl. Here is a very basic module that declares two new configuration directives: C, which accepts one or more arguments, and C which accepts a single argument. C validates that its arguments are valid strings. #file:MyApache2/MyParameters.pm #----------------------------- package MyApache2::MyParameters; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OR_ALL ITERATE); use Apache2::CmdParms (); use Apache2::Module (); use Apache2::Directive (); my @directives = ( { name => 'MyParameter', func => __PACKAGE__ . '::MyParameter', req_override => Apache2::Const::OR_ALL, args_how => Apache2::Const::ITERATE, errmsg => 'MyParameter Entry1 [Entry2 ... [EntryN]]', }, { name => 'MyOtherParameter', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub MyParameter { my ($self, $parms, @args) = @_; $self->{MyParameter} = \@args; # validate that the arguments are strings for (@args) { unless (/^\w+$/) { my $directive = $parms->directive; die sprintf "error: MyParameter at %s:%d expects " . "string arguments: ('$_' is not a string)\n", $directive->filename, $directive->line_num; } } } 1; And here is how to use it in I: # first load the module so Apache will recognize the new directives PerlLoadModule MyApache2::MyParameters MyParameter one two three MyOtherParameter Foo MyParameter eleven twenty MyOtherParameter Bar The following sections discuss this and more advanced modules in detail. A minimal configuration module is comprised of three groups of elements: =over =item * An array C> for declaring the new directives and their behavior. =item * A call to C> to register the new directives with apache. =item * A subroutine per each new directive, which is called when the directive is seen =back =head2 C<@directives> C<@directives> is an array of hash references. Each hash represents a separate new configuration directive. In our example we had: my @directives = ( { name => 'MyParameter', func => __PACKAGE__ . '::MyParameter', req_override => Apache2::Const::OR_ALL, args_how => Apache2::Const::ITERATE, errmsg => 'MyParameter Entry1 [Entry2 ... [EntryN]]', }, { name => 'MyOtherParameter', }, ); This structure declares two new directives: C and C. You have to declare at least the name of the new directive, which is how we have declared the C directive. mod_perl will fill in the rest of the configuration using the defaults described next. These are the attributes that can be used to define the directives behavior: I>, I>, I>, I> and I>. They are discussed in the following sections. It is worth noting that in previous versions of mod_perl, it was necessary to call this variable @APACHE_MODULE_COMMANDS. It is not the case anymore, and we consistently use the name @directives in the documentation for clarity. It can be named anything at all. =head3 C This is the only required attribute. And it declares the name of the new directive as it'll be used in I. =head3 C The I attribute expects a reference to a function or a function name. This function is called by httpd every time it encounters the directive that is described by this entry while parsing the configuration file. Therefore it's invoked once for every instance of the directive at the server startup, and once per request per instance in the I<.htaccess> file. This function accepts two or more arguments, L attribute's value|/Directive_Syntax_Definition_Constants>. This attribute is optional. If not supplied, mod_perl will try to use a function in the current package whose name is the same as of the directive in question. In our example with C, mod_perl will use: __PACKAGE__ . '::MyOtherParameter' as a name of a subroutine and it anticipates that it exists in that package. =head3 C The I<> attribute defines the valid scope in which this directive can appear. There are L which map onto the corresponding Apache macros. These constants should be imported from the C> package. For example, to use the C constant, which allows directives to be defined anywhere, first, it needs to be imported: use Apache2::Const -compile => qw(OR_ALL); and then assigned to the I attribute: req_override => Apache2::Const::OR_ALL, It's possible to combine several options using the unary operators. For example, the following setting: req_override => Apache2::Const::RSRC_CONF | Apache2::Const::ACCESS_CONF will allow the directive to appear anywhere in I, but forbid it from ever being used in I<.htaccess> files: This attribute is optional. If not supplied, the default value of C> is used. =head3 C Directives can receive zero, one or many arguments. In order to help Apache validate that the number of arguments is valid, the I attribute should be set to the desired value. Similar to the I> attribute, the C> package provides a special C> constants group which maps to the corresponding Apache macros. There are L to choose from. In our example, the directive C accepts one or more arguments, therefore we have the C> constant: args_how => Apache2::Const::ITERATE, This attribute is optional. If not supplied, the default value of C> is used. =head3 C The I attribute provides a short but succinct usage statement that summarizes the arguments that the directive takes. It's used by Apache to generate a descriptive error message, when the directive is configured with a wrong number of arguments. In our example, the directive C accepts one or more arguments, therefore we have chosen the following usage string: errmsg => 'MyParameter Entry1 [Entry2 ... [EntryN]]', This attribute is optional. If not supplied, the default value of will be a string based on the directive's I> and I> attributes. =head3 C Sometimes it is useful to pass information back to the directive handler callback. For instance, if you use the I parameter to specify the same callback for two different directives you might want to know which directive is being called currently. To do this, you can use the I parameter, which allows you to store arbitrary strings for later retrieval from your directive handler. For instance: my @directives = ( { name => ' Apache2::Const::RSRC_CONF, args_how => Apache2::Const::RAW_ARGS, }, { name => ' Location, req_override => Apache2::Const::RSRC_CONF, args_how => Apache2::Const::RAW_ARGS, cmd_data => '1', }, ); Here, we are using the C function to process both the C and C directives. In the C callback we can check the data in the I slot to see whether the directive being processed is C and alter our logic accordingly. How? Through the C method exposed by the C class. use Apache2::CmdParms (); sub Location { my ($cfg, $parms, $data) = @_; # see if we were called via LocationMatch my $regex = $parms->info; # continue along } In case you are wondering, C and C were chosen for a reason - this is exactly how httpd core handles these two directives. =head2 Registering the new directives Once the C> array is populated, it needs to be registered with apache using C> Apache2::Module::add(__PACKAGE__, \@directives); =head2 Directive Scope Definition Constants The I> attribute specifies the configuration scope in which it's valid to use a given configuration directive. This attribute's value can be any of or a combination of the following constants: (these constants are declared in I.) =head3 C The directive cannot be overridden by any of the C options. =head3 C The directive can appear within directory sections, but not outside them. It is also allowed within I<.htaccess> files, provided that C is set for the current directory. =head3 C The directive can appear anywhere within I, as well as within I<.htaccess> files provided that C is set for the current directory. =head3 C The directive can appear anywhere within I, as well as within I<.htaccess> files provided that C is set for the current directory. =head3 C The directive can appear within directory sections, but not outside them. It is also allowed within I<.htaccess> files, provided that C is set for the current directory. =head3 C The directive can appear anywhere within I, as well as within I<.htaccess> files provided that C is set for the current directory. =head3 C META: details? "unset a directive (in Allow)" =head3 C The directive can appear within directory sections. The directive is not allowed in I<.htaccess> files. =head3 C The directive can appear in I outside a directory section (CDirectoryE>, CLocationE> or CFilesE>; also CFilesMatchE> and kin). The directive is not allowed in I<.htaccess> files. =head3 C Force directive to execute a command which would modify the configuration (like including another file, or C). Normally, Apache first parses the configuration tree and then executes the directives it has encountered (e.g., C). But there are directives that must be executed during the initial parsing, either because they affect the configuration tree (e.g., C may load extra configuration) or because they tell Apache about new directives (e.g., C or C, may load a module, which installs handlers for new directives). These directives must have the C turned on. =head3 C The directive can appear anywhere. It is not limited in any way. =head2 Directive Callback Subroutine Depending on the value of the I> attribute the callback subroutine, specified with the I> attribute, will be called with two or more arguments. The first two arguments are always C<$self> and C<$parms>. A typical callback function which expects a single value (C>) might look like the following: sub MyParam { my ($self, $parms, $arg) = @_; $self->{MyParam} = $arg; } In this function we store the passed single value in the configuration object, using the directive's name (assuming that it was C) as the key. Let's look at the subroutine arguments in detail: =over =item 1 C<$self> is the current container's configuration object. This configuration object is a reference to a hash, in which you can store arbitrary key/value pairs. When the directive callback function is invoked it may already include several key/value pairs inserted by other directive callbacks or during the C> and C> functions, which will be explained later. Usually the callback function stores the passed argument(s), which later will be read by C> and C>, which will be explained later, and of course at request time. The convention is use the name of the directive as the hash key, where the received values are stored. The value can be a simple scalar, or a reference to a more complex structure. So for example you can store a reference to an array, if there is more than one value to store. This object can be later retrieved at request time via: my $dir_cfg = $self->get_config($s, $r->per_dir_config); You can retrieve the server configuration object via: my $srv_cfg = $self->get_config($s); if invoked inside the virtual host, the virtual host's configuration object will be returned. =item 2 C<$parms> is an C> object from which you can retrieve various other information about the configuration. For example to retrieve the server object: my $s = $parms->server; See C> for more information. =item 3 The rest of the arguments whose number depends on the I>'s value are covered in L. =back =head2 Directive Syntax Definition Constants The following values of the I> attribute define how many arguments and what kind of arguments directives can accept. These values are constants that can be imported from the C> package (C>). For example: use Apache2::Const -compile => qw(TAKE1 TAKE23); =head3 C The directive takes no arguments. The callback will be invoked once each time the directive is encountered. For example: sub MyParameter { my ($self, $parms) = @_; $self->{MyParameter}++; } =head3 C The directive takes a single argument. The callback will be invoked once each time the directive is encountered, and its argument will be passed as the third argument. For example: sub MyParameter { my ($self, $parms, $arg) = @_; $self->{MyParameter} = $arg; } =head3 C The directive takes two arguments. They are passed to the callback as the third and fourth arguments. For example: sub MyParameter { my ($self, $parms, $arg1, $arg2) = @_; $self->{MyParameter} = {$arg1 => $arg2}; } =head3 C This is like C> and C>, but the directive takes three mandatory arguments. For example: sub MyParameter { my ($self, $parms, @args) = @_; $self->{MyParameter} = \@args; } =head3 C This directive takes one mandatory argument, and a second optional one. This can be used when the second argument has a default value that the user may want to override. For example: sub MyParameter { my ($self, $parms, $arg1, $arg2) = @_; $self->{MyParameter} = {$arg1 => $arg2||'default'}; } =head3 C C> is just like C>, except now there are two mandatory arguments and an optional third one. =head3 C In the C variant, the first argument is mandatory and the other two are optional. This is useful for providing defaults for two arguments. =head3 C C is used when a directive can take an unlimited number of arguments. The callback is invoked repeatedly with a single argument, once for each argument in the list. It's done this way for interoperability with the C API, which doesn't have the flexible argument passing that Perl provides. For example: sub MyParameter { my ($self, $parms, $args) = @_; push @{ $self->{MyParameter} }, $arg; } =head3 C C is used for directives that take a mandatory first argument followed by a list of arguments to be applied to the first. A familiar example is the C directive, in which a series of file extensions are applied to a single MIME type: AddType image/jpeg JPG JPEG JFIF jfif Apache will invoke your callback once for each item in the list. Each time Apache runs your callback, it passes the routine the constant first argument (I<"image/jpeg"> in the example above), and the current item in the list (I<"JPG"> the first time around, I<"JPEG"> the second time, and so on). In the example above, the configuration processing routine will be run a total of four times. For example: sub MyParameter { my ($self, $parms, $key, $val) = @_; push @{ $self->{MyParameter}{$key} }, $val; } =head3 C An I> of C instructs Apache to turn off parsing altogether. Instead it simply passes your callback function the line of text following the directive. Leading and trailing whitespace is stripped from the text, but it is not otherwise processed. Your callback can then do whatever processing it wishes to perform. This callback receives three arguments (similar to C>), the third of which is a string-valued scalar containing the remaining text following the directive line. sub MyParameter { my ($self, $parms, $val) = @_; # process $val } If this mode is used to implement a custom "container" directive, the attribute I> needs to OR C>. e.g.: req_override => Apache2::Const::OR_ALL | Apache2::Const::EXEC_ON_READ, META: complete the details, which are new to 2.0. To retrieve the contents of a custom "container" directive, use the C> object's methods C> or C> : sub MyParameter { my ($self, $parms, $val) = @_; my $directive = $parms->directive; my $content = $directive->as_string; } There is one other trick to making configuration containers work. In order to be recognized as a valid directive, the I> attribute must contain the leading C>. This token will be stripped by the code that handles the custom directive callbacks to Apache. For example: name => '/MyContainerE> token, as our C> handler will read in that line and stop reading when it is seen. However in order to catch cases in which the C/MyContainerE> text appears without a preceding CMyContainerE> opening section, we need to turn the end token into a directive that simply reports an error and exits. For example: { name => '', func => __PACKAGE__ . "::MyContainer_END", errmsg => 'end of MyContainer without beginning?', args_how => Apache2::Const::NO_ARGS, req_override => Apache2::Const::OR_ALL, }, ... my $EndToken = ""; sub MyContainer_END { die "$EndToken outside a container\n"; } Now, should the server administrator misplace the container end token, the server will not start, complaining with this error message: Syntax error on line 54 of httpd.conf: outside a container =head3 C When C is used, Apache will only allow the argument to be one of two values, C or C. This string value will be converted into an integer, C<1> if the flag is C, C<0> if it is C. If the configuration argument is anything other than C or C, Apache will complain: Syntax error on line 73 of httpd.conf: MyFlag must be On or Off For example: sub MyFlag { my ($self, $parms, $arg) = @_; $self->{MyFlag} = $arg; # 1 or 0 } =head2 Enabling the New Configuration Directives As seen in the first example, the module needs to be loaded before the new directives can be used. A special directive C is used for this purpose. For example: PerlLoadModule MyApache2::MyParameters This directive is similar to C, but it require()'s the Perl module immediately, causing an early mod_perl startup. After loading the module it let's Apache know of the new directives and installs the callbacks to be called when the corresponding directives are encountered. =head2 Creating and Merging Configuration Objects By default mod_perl creates a simple hash to store each container's configuration values, which are populated by directive callbacks, invoked when the I and the I<.htaccess> files are parsed and the corresponding directive are encountered. It's possible to pre-populate the hash entries when the data structure is created, e.g., to provide reasonable default values for cases where they weren't set in the configuration file. To accomplish that the optional C> and C> functions can be supplied. When a request is mapped to a container, Apache checks if that container has any ancestor containers. If that's the case, it allows mod_perl to call special merging functions, which decide whether configurations in the parent containers should be inherited, appended or overridden in the child container. The custom configuration module can supply custom merging functions C> and C>, which can override the default behavior. If these functions are not supplied the following default behavior takes place: The child container inherits its parent configuration, unless it specifies its own and then it overrides its parent configuration. =head3 C C is called once for the main server, and once more for each virtual host defined in I. It's called with two arguments: C<$class>, the package name it was created in and C<$parms> the already familiar C> object. The object is expected to return a reference to a blessed hash, which will be used by configuration directives callbacks to set the values assigned in the configuration file. But it's possible to preset some values here: For example, in the following example the object assigns a default value, which can be overridden during merge if a the directive was used to assign a custom value: package MyApache2::MyParameters; ... use Apache2::Module (); use Apache2::CmdParms (); my @directives = (...); Apache2::Module::add(__PACKAGE__, \@directives); ... sub SERVER_CREATE { my ($class, $parms) = @_; return bless { name => __PACKAGE__, }, $class; } To retrieve that value later, you can use: use Apache2::Module (); ... my $srv_cfg = Apache2::Module::get_config('MyApache2::MyParameters', $s); print $srv_cfg->{name}; If a request is made to a resource inside a virtual host, C<$srv_cfg> will contain the object of the virtual host's server. To reach the main server's configuration object use: use Apache2::Module (); use Apache2::ServerRec (); use Apache2::ServerUtil (); ... if ($s->is_virtual) { my $base_srv_cfg = Apache2::Module::get_config('MyApache2::MyParameters', Apache2::ServerUtil->server); print $base_srv_cfg->{name}; } If the function C is not supplied by the module, a function that returns a blessed into the current package reference to a hash is used. =head3 C During the configuration parsing virtual hosts are given a chance to inherit the configuration from the main host, append to or override it. The C subroutine can be supplied to override the default behavior, which simply overrides the main server's configuration. The custom subroutine accepts two arguments: C<$base>, a blessed reference to the main server configuration object, and C<$add>, a blessed reference to a virtual host configuration object. It's expected to return a blessed object after performing the merge of the two objects it has received. Here is the skeleton of a merging function: sub merge { my ($base, $add) = @_; my %mrg = (); # code to merge %$base and %$add return bless \%mrg, ref($base); } The section L provides an extensive example of a merging function. =head3 C Similarly to C>, this optional function, is used to create an object for the directory resource. If the function is not supplied mod_perl will use an empty hash variable as an object. Just like C>, it's called once for the main server and one more time for each virtual host. In addition it'll be called once more for each resource (CLocationE>, CDirectoryE> and others). All this happens during the startup. At request time it might be called for each parsed I<.htaccess> file and for each resource defined in it. The C function's skeleton is identical to C. Here is an example: package MyApache2::MyParameters; ... use Apache2::Module (); use Apache2::CmdParms (); my @directives = (...); Apache2::Module::add(__PACKAGE__, \@directives); ... sub DIR_CREATE { my ($class, $parms) = @_; return bless { foo => 'bar', }, $class; } To retrieve that value later, you can use: use Apache2::Module (); ... my $dir_cfg = Apache2::Module::get_config('MyApache2::MyParameters', $s, $r->per_dir_config); print $dir_cfg->{foo}; The only difference in the retrieving the directory configuration object. Here the third argument C<$r-Eper_dir_config> tells C> to get the directory configuration object. =head3 C Similarly to C>, C merges the ancestor and the current node's directory configuration objects. At the server startup C is called once for each virtual host. At request time, the merging of the objects of resources, their sub-resources and the virtual host/main server merge happens. Apache caches the products of merges, so you may see certain merges happening only once. The section L discusses in detail the merging order. The section L provides an extensive example of a merging function. =head1 Examples =head2 Merging at Work In the following example we are going to demonstrate in details how merging works, by showing various merging techniques. Here is an example Perl module, which, when loaded, installs four custom directives into Apache. #file:MyApache2/CustomDirectives.pm #--------------------------------- package MyApache2::CustomDirectives; use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Module (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); my @directives = ( { name => 'MyPlus' }, { name => 'MyList' }, { name => 'MyAppend' }, { name => 'MyOverride' }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub MyPlus { set_val('MyPlus', @_) } sub MyAppend { set_val('MyAppend', @_) } sub MyOverride { set_val('MyOverride', @_) } sub MyList { push_val('MyList', @_) } sub DIR_MERGE { merge(@_) } sub SERVER_MERGE { merge(@_) } sub set_val { my ($key, $self, $parms, $arg) = @_; $self->{$key} = $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); $srv_cfg->{$key} = $arg; } } sub push_val { my ($key, $self, $parms, $arg) = @_; push @{ $self->{$key} }, $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); push @{ $srv_cfg->{$key} }, $arg; } } sub merge { my ($base, $add) = @_; my %mrg = (); for my $key (keys %$base, keys %$add) { next if exists $mrg{$key}; if ($key eq 'MyPlus') { $mrg{$key} = ($base->{$key}||0) + ($add->{$key}||0); } elsif ($key eq 'MyList') { push @{ $mrg{$key} }, @{ $base->{$key}||[] }, @{ $add->{$key}||[] }; } elsif ($key eq 'MyAppend') { $mrg{$key} = join " ", grep defined, $base->{$key}, $add->{$key}; } else { # override mode $mrg{$key} = $base->{$key} if exists $base->{$key}; $mrg{$key} = $add->{$key} if exists $add->{$key}; } } return bless \%mrg, ref($base); } 1; __END__ It's probably a good idea to specify all the attributes for the C<@directives> entries, but here for simplicity we have only assigned to the I> directive, which is a must. Since all our directives take a single argument, C>, the default I>, is what we need. We also allow the directives to appear anywhere, so C>, the default for I>, is good for us as well. We use the same callback for the directives C, C and C, which simply assigns the specified value to the hash entry with the key of the same name as the directive. The C directive's callback stores the value in the list, a reference to which is stored in the hash, again using the name of the directive as the key. This approach is usually used when the directive is of type C>, so you may have more than one value of the same kind inside a single container. But in our example we choose to have it of the type C>. In both callbacks in addition to storing the value in the current I configuration, if the value is configured in the main server or the virtual host (which is when C<$parms-Epath> is false), we also store the data in the same way in the server configuration object. This is done in order to be able to query the values assigned at the server and virtual host levels, when the request is made to one of the sub-resources. We will show how to access that information in a moment. Finally we use the same merge function for merging directory and server configuration objects. For the key C (remember we have used the same key name as the name of the directive), the merging function performs, the obvious, summation of the ancestor's merged value (base) and the current resource's value (add). C joins the values into a string, C joins the lists and finally C (the default) overrides the value with the current one if any. Notice that all four merging methods take into account that the values in the ancestor or the current configuration object might be unset, which is the case when the directive wasn't used by all ancestors or for the current resource. At the end of the merging, a blessed reference to the merged hash is returned. The reference is blessed into the same class, as the base or the add objects, which is C in our example. That hash is used as the merged ancestor's object for a sub-resource of the resource that has just undergone merging. Next we supply the following I configuration section, so we can demonstrate the features of this example: PerlLoadModule MyApache2::CustomDirectives MyPlus 5 MyList "MainServer" MyAppend "MainServer" MyOverride "MainServer" Listen 8081 MyPlus 2 MyList "VHost" MyAppend "VHost" MyOverride "VHost" MyPlus 3 MyList "Dir" MyAppend "Dir" MyOverride "Dir" SetHandler modperl PerlResponseHandler MyApache2::CustomDirectivesTest MyPlus 1 MyList "SubDir" MyAppend "SubDir" MyOverride "SubDir" SetHandler modperl PerlResponseHandler MyApache2::CustomDirectivesTest C loads the Perl module C and then installs a new Apache module named C, using the callbacks provided by the Perl module. In our example functions C and C aren't provided, so by default an empty hash will be created to represent the configuration object for the merging functions. If we don't provide merging functions, Apache will simply skip the merging. Though you must provide a callback function for each directive you add. After installing the new module, we add a virtual host container, containing two resources (which at other times called locations, directories, sections, etc.), one being a sub-resource of the other, plus one another resource which resides in the main server. We assign different values in all four containers, but the last one. Here we refer to the four containers as I, I, I and I, and use these names as values for all configuration directives, but C, to make it easier understand the outcome of various merging methods and the merging order. In the last container used by CLocation /custom_directives_testE>, we don't specify any directives so we can verify that all the values are inherited from the main server. For all three resources we are going to use the same response handler, which will dump the values of configuration objects that in its reach. As we will see that different resources will see see certain things identically, while others differently. So here it the handler: #file:MyApache2/CustomDirectivesTest.pm #------------------------------------- package MyApache2::CustomDirectivesTest; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Module (); use Apache2::Const -compile => qw(OK); sub get_config { Apache2::Module::get_config('MyApache2::CustomDirectives', @_); } sub handler { my ($r) = @_; my %secs = (); $r->content_type('text/plain'); my $s = $r->server; my $dir_cfg = get_config($s, $r->per_dir_config); my $srv_cfg = get_config($s); if ($s->is_virtual) { $secs{"1: Main Server"} = get_config(Apache2::ServerUtil->server); $secs{"2: Virtual Host"} = $srv_cfg; $secs{"3: Location"} = $dir_cfg; } else { $secs{"1: Main Server"} = $srv_cfg; $secs{"2: Location"} = $dir_cfg; } $r->printf("Processing by %s.\n", $s->is_virtual ? "virtual host" : "main server"); for my $sec (sort keys %secs) { $r->print("\nSection $sec\n"); for my $k (sort keys %{ $secs{$sec}||{} }) { my $v = exists $secs{$sec}->{$k} ? $secs{$sec}->{$k} : 'UNSET'; $v = '[' . (join ", ", map {qq{"$_"}} @$v) . ']' if ref($v) eq 'ARRAY'; $r->printf("%-10s : %s\n", $k, $v); } } return Apache2::Const::OK; } 1; __END__ The handler is relatively simple. It retrieves the current resource (directory) and the server's configuration objects. If the server is a virtual host, it also retrieves the main server's configuration object. Once these objects are retrieved, we simply dump the contents of these objects, so we can verify that our merging worked correctly. Of course we nicely format the data that we print, taking a special care of array references, which we know is the case with the key I, but we use a generic code, since Perl tells us when a reference is a list. It's a show time. First we issue a request to a resource residing in the main server: % GET http://localhost:8002/custom_directives_test/ Processing by main server. Section 1: Main Server MyAppend : MainServer MyList : ["MainServer"] MyOverride : MainServer MyPlus : 5 Section 2: Location MyAppend : MainServer MyList : ["MainServer"] MyOverride : MainServer MyPlus : 5 Since we didn't have any directives in that resource's configuration, we confirm that our merge worked correctly and the directory configuration object contains the same data as its ancestor, the main server. In this case the merge has simply inherited the values from its ancestor. The next request is for the resource residing in the virtual host: % GET http://localhost:8081/custom_directives_test/ Processing by virtual host. Section 1: Main Server MyAppend : MainServer MyList : ["MainServer"] MyOverride : MainServer MyPlus : 5 Section 2: Virtual Host MyAppend : MainServer VHost MyList : ["MainServer", "VHost"] MyOverride : VHost MyPlus : 7 Section 3: Location MyAppend : MainServer VHost Dir MyList : ["MainServer", "VHost", "Dir"] MyOverride : Dir MyPlus : 10 That's where the real fun starts. We can see that the merge worked correctly in the virtual host, and so it did inside the CLocationE> resource. It's easy to see that C and C are correct, the same for C. For C, we have to work harder and perform some math. Inside the virtual host we have main(5)+vhost(2)=7, and inside the first resource vhost_merged(7)+resource(3)=10. So far so good, the last request is made to the sub-resource of the resource we have requested previously: % GET http://localhost:8081/custom_directives_test/subdir/ Processing by virtual host. Section 1: Main Server MyAppend : MainServer MyList : ["MainServer"] MyOverride : MainServer MyPlus : 5 Section 2: Virtual Host MyAppend : MainServer VHost MyList : ["MainServer", "VHost"] MyOverride : VHost MyPlus : 7 Section 3: Location MyAppend : MainServer VHost Dir SubDir MyList : ["MainServer", "VHost", "Dir", "SubDir"] MyOverride : SubDir MyPlus : 11 No surprises here. By comparing the configuration sections and the outcome, it's clear that the merging is correct for most directives. The only harder verification is for C, all we need to do is to add 1 to 10, which was the result we saw in the previous request, or to do it from scratch, summing up all the ancestors of this sub-resource: 5+2+3+1=11. =head3 Merging Entries Whose Values Are References When merging entries whose values are references and not scalars, it's important to make a deep copy and not a shallow copy, when the references gets copied. In our example we merged two references to lists, by explicitly extracting the values of each list: push @{ $mrg{$key} }, @{ $base->{$key}||[] }, @{ $add->{$key}||[] }; While seemingly the following snippet is doing the same: $mrg{$key} = $base->{$key}; push @{ $mrg{$key} }, @{ $add->{$key}||[] }; it won't do what you expect if the same merge (with the same C<$base> and C<$add> arguments) is called more than once, which is the case in certain cases. What happens in the latter implementation, is that the first line makes both C<$mrg{$key}> and C<$base-E{$key}> point to the same reference. When the second line expands the C<@{ $mrg{$key} }>, it also affects C<@{ $base-E{$key} }>. Therefore when the same merge is called second time, the C<$base> argument is not the same anymore. Certainly we could workaround this problem in the mod_perl core, by freezing the arguments before the merge call and restoring them afterwards, but this will incur a performance hit. One simply has to remember that the arguments and the references they point to, should stay unmodified through the function call, and then the right code can be supplied. =head3 Merging Order Consequences Sometimes the merging logic can be influenced by the order of merging. It's desirable that the logic will work properly regardless of the merging order. In Apache 1.3 the merging was happening in the following order: (((base_srv -> vhost) -> section) -> subsection) Whereas as of this writing Apache 2.0 performs: ((base_srv -> vhost) -> (section -> subsection)) A product of subsections merge (which happen during the request) is merged with the product of the server and virtual host merge (which happens at the startup time). This change was done to improve the configuration merging performance. So for example, if you implement a directive C which performs the exponential: C<$mrg=$base**$add>, and let's say there directive is used four times in I: MyExp 5 MyExp 4 MyExp 3 MyExp 2 The merged configuration for a request I will see: (5 ** 4) ** (3 ** 2) = 1.45519152283669e+25 under Apache 2.0, whereas under Apache 1.3 the result would be: ( (5 ** 4) ** 3) ** 2 = 5.96046447753906e+16 which is not quite the same. Chances are that your merging rules work identically, regardless of the merging order. But you should be aware of this behavior. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/config.cfg0000644000177200010010000000241212540623200015710 0ustar SteveNoneuse vars qw(@c); @c = ( id => 'user_guide_2.0', title => "User's guide", abstract => < 'Introduction', chapters => [qw( intro/start_fast.pod intro/overview.pod design/design.pod )], group => 'Installation', chapters => [qw( install/install.pod config/config.pod config/custom.pod )], group => 'Coding', chapters => [qw( coding/coding.pod coding/cooking.pod )], group => 'Porting', chapters => [qw( porting/porting.pod porting/compat.pod )], group => 'mod_perl Handlers', chapters => [qw( handlers/intro.pod handlers/server.pod handlers/protocols.pod handlers/http.pod handlers/filters.pod handlers/general.pod )], group => 'Performance', chapters => [qw( performance/prevent.pod performance/mpm.pod )], group => 'Troubleshooting', chapters => [ qw( troubleshooting/troubleshooting.pod help/help.pod )], copy_glob => [qw( porting/code handlers/*.gif handlers/*.jpg )], changes => 'Changes.pod', ); mod_perl-2.0.9/docs/user/design/0000755000104000010010000000000012540623200017135 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/design/design.pod0000644000104000010010000004616012540623200021121 0ustar AdministratorsNone=head1 NAME Notes on the design and goals of mod_perl-2.0 =head1 Description Notes on the design and goals of mod_perl-2.0. We try to keep this doc in sync with the development, so some items discussed here were already implemented, while others are only planned. If you find some inconsistencies in this document please let the list know. =head1 Introduction In version 2.0 of mod_perl, the basic concept of 1.0 still applies: Provide complete access to the Apache C API via the Perl programming language. Rather than "porting" mod_perl-1.0 to Apache 2.0, mod_perl-2.0 is being implemented as a complete re-write from scratch. For a more detailed introduction and functionality overview, see L. =head1 Interpreter Management In order to support mod_perl in a multi-threaded environment, mod_perl-2.0 will take advantage of Perl's I feature, new to Perl version 5.6.0. This feature encapsulates the Perl runtime inside a thread-safe I structure. Each thread which needs to serve a mod_perl request will need its own I instance. Rather than create a one-to-one mapping of I per-thread, a configurable pool of interpreters is managed by mod_perl. This approach will cut down on memory usage simply by maintaining a minimal number of intepreters. It will also allow re-use of allocations made within each interpreter by recycling those which have already been used. This was not possible in the 1.3.x model, where each child has its own interpreter and no control over which child Apache dispatches the request to. The interpreter pool is only enabled if Perl is built with -Dusethreads otherwise, mod_perl will behave just as 1.0, using a single interpreter, which is only useful when Apache is configured with the prefork mpm. When the server is started, a Perl interpreter is constructed, compiling any code specified in the configuration, just as 1.0 does. This interpreter is referred to as the "parent" interpreter. Then, for the number of I configured, a (thread-safe) clone of the parent interpreter is made (via perl_clone()) and added to the pool of interpreters. This clone copies any writeable data (e.g. the symbol table) and shares the compiled syntax tree. From my measurements of a I including a few random modules: use CGI (); use POSIX (); use IO (); use SelfLoader (); use AutoLoader (); use B::Deparse (); use B::Terse (); use B (); use B::C (); The parent adds 6M size to the process, each clone adds less than half that size, ~2.3M, thanks to the shared syntax tree. NOTE: These measurements were made prior to finding memory leaks related to perl_clone() in 5.6.0 and the GvSHARED optimization. At request time, If any Perl*Handlers are configured, an available interpreter is selected from the pool. As there is a I and I per thread, a pointer is saved in either the conn_rec-Epool or request_rec-Epool, which will be used for the lifetime of that request. For handlers that are called when threads are not running (C), the parent interpreter is used. Several configuration directives control the interpreter pool management: =over 4 =item PerlInterpStart The number of intepreters to clone at startup time. =item PerlInterpMax If all running interpreters are in use, mod_perl will clone new interpreters to handle the request, up until this number of interpreters is reached. when C is reached, mod_perl will block (via COND_WAIT()) until one becomes available (signaled via COND_SIGNAL()) =item PerlInterpMinSpare The minimum number of available interpreters this parameter will clone interpreters up to C, before a request comes in. =item PerlInterpMaxSpare mod_perl will throttle down the number of interpreters to this number as those in use become available =item PerlInterpMaxRequests The maximum number of requests an interpreter should serve, the interpreter is destroyed when the number is reached and replaced with a fresh one. =back =head2 TIPool The interpreter pool is implemented in terms of a "TIPool" (Thread Item Pool), a generic api which can be reused for other data such as database connections. A Perl interface will be provided for the I mechanism, which, for example, will make it possible to share a pool of DBI connections. =head2 Virtual Hosts The interpreter management has been implemented in a way such that each CVirtualHostE> can have its own parent Perl interpreter and/or MIP (Mod_perl Interpreter Pool). It is also possible to disable mod_perl for a given virtual host. =head2 Further Enhancements =over 4 =item * The interpreter pool management could be moved into its own thread. =item * A "garbage collector", which could also run in its own thread, examining the padlists of idle interpreters and deciding to release and/or report large strings, array/hash sizes, etc., that Perl is keeping around as an optimization. =back =head1 Hook Code and Callbacks The code for hooking mod_perl in the various phases, including C directives is generated by the C module. Access to all hooks will be provided by mod_perl in both the traditional C configuration fashion and via dynamic registration methods (the ap_hook_* functions). When a mod_perl hook is called for a given phase, the glue code has an index into the array of handlers, so it knows to return DECLINED right away if no handlers are configured, without entering the Perl runtime as 1.0 did. The handlers are also now stored in an apr_array_header_t, which is much lighter and faster than using a Perl AV, as 1.0 did. And more importantly, keeps us out of the Perl runtime until we're sure we need to be there. Cs are now "compiled", that is, the various forms of: PerlResponseHandler MyModule->handler # defaults to MyModule::handler or MyModule->handler PerlResponseHandler MyModule PerlResponseHandler $MyObject->handler PerlResponseHandler 'sub { print "foo\n"; return OK }' are only parsed once, unlike 1.0 which parsed every time the handler was used. There will also be an option to parse the handlers at startup time. Note: this feature is currently not enabled with threads, as each clone needs its own copy of Perl structures. A "method handler" is now specified using the `method' sub attribute, e.g. sub handler : method {}; instead of 1.0's sub handler ($$) {} =head1 Perl interface to the Apache API and Data Structures In 1.0, the Perl interface back into the Apache API and data structures was done piecemeal. As functions and structure members were found to be useful or new features were added to the Apache API, the xs code was written for them here and there. The goal for 2.0 is to generate the majority of xs code and provide thin wrappers where needed to make the API more Perlish. As part of this goal, nearly the entire APR and Apache API, along with their public data structures is covered from the get-go. Certain functions and structures which are considered "private" to Apache or otherwise un-useful to Perl don't get glued. The Apache header tree is parsed into Perl data structures which live in the generated C and C modules. For example, the following function prototype: AP_DECLARE(int) ap_meets_conditions(request_rec *r); is parsed into the following Perl structure: { 'name' => 'ap_meets_conditions' 'return_type' => 'int', 'args' => [ { 'name' => 'r', 'type' => 'request_rec *' } ], }, and the following structure: typedef struct { uid_t uid; gid_t gid; } ap_unix_identity_t; is parsed into: { 'type' => 'ap_unix_identity_t' 'elts' => [ { 'name' => 'uid', 'type' => 'uid_t' }, { 'name' => 'gid', 'type' => 'gid_t' } ], } Similar is done for the mod_perl source tree, building C and C. Three files are used to drive these Perl structures into the generated xs code: =over 4 =item lib/ModPerl/function.map Specifies which functions are made available to Perl, along with which modules and classes they reside in. Many functions will map directly to Perl, for example the following C code: static int handler (request_rec *r) { int rc = ap_meets_conditions(r); ... maps to Perl like so: sub handler { my $r = shift; my $rc = $r->meets_conditions; ... The function map is also used to dispatch Apache/APR functions to thin wrappers, rewrite arguments and rename functions which make the API more Perlish where applicable. For example, C code such as: char uuid_buf[APR_UUID_FORMATTED_LENGTH+1]; apr_uuid_t uuid; apr_uuid_get(&uuid) apr_uuid_format(uuid_buf, &uuid); printf("uuid=%s\n", uuid_buf); is remapped to a more Perlish convention: printf "uuid=%s\n", APR::UUID->new->format; =item lib/ModPerl/structure.map Specifies which structures and members of each are made available to Perl, along with which modules and classes they reside in. =item lib/ModPerl/type.map This file defines how Apache/APR types are mapped to Perl types and vice-versa. For example: apr_int32_t => SvIV apr_int64_t => SvNV server_rec => SvRV (Perl object blessed into the Apache2::ServerRec class) =back =head2 Advantages to generating XS code =over 4 =item * Not tied tightly to xsubpp =item * Easy adjustment to Apache 2.0 API/structure changes =item * Easy adjustment to Perl changes (e.g., Perl 6) =item * Ability to "discover" hookable third-party C modules. =item * Cleanly take advantage of features in newer Perls =item * Optimizations can happen across-the-board with one-shot =item * Possible to AUTOLOAD XSUBs =item * Documentation can be generated from code =item * Code can be generated from documentation =back =head2 Lvalue methods A new feature to Perl 5.6.0 is I, where the return value of a subroutine can be directly modified. For example, rather than the following code to modify the uri: $r->uri($new_uri); the same result can be accomplished with the following syntax: $r->uri = $new_uri; mod_perl-2.0 will support I for all methods which access Apache and APR data structures. =head1 Filter Hooks mod_perl 2.0 provides two interfaces to filtering, a direct mapping to buckets and bucket brigades and a simpler, stream-oriented interface. This is discussed in the L. =head1 Directive Handlers mod_perl 1.0 provides a mechanism for Perl modules to implement first-class directive handlers, but requires an XS file to be generated and compiled. The 2.0 version provides the same functionality, but does not require the generated XS module (i.e. everything is implemented in pure Perl). =head1 EPerlE Configuration Sections The ability to write configuration in Perl carries over from 1.0, but but implemented much different internally. The mapping of a Perl symbol table fits cleanly into the new I API, unlike the hoop jumping required in mod_perl 1.0. =head1 Protocol Module Support L support is provided out-of-the-box, as the hooks and API are covered by the generated code blankets. Any functionality for assisting protocol modules should be folded back into Apache if possible. =head1 mod_perl MPM It will be possible to write an MPM (Multi-Processing Module) in Perl. mod_perl will provide a mod_perl_mpm.c framework which fits into the server/mpm standard convention. The rest of the functionality needed to write an MPM in Perl will be covered by the generated xs code blanket. =head1 Build System The biggest mess in 1.0 is mod_perl's Makefile.PL, the majority of logic has been broken down and moved to the C module. The I will construct an C object which will have all the info it needs to generate scripts and Is that apache-2.0 needs. Regardless of what that scheme may be or change to, it will be easy to adapt to with build logic/variables/etc., divorced from the actual Is and configure scripts. In fact, the new build will stay as far away from the Apache build system as possible. The module library (I or I) is built with as little help from Apache as possible, using only the C provided by I. The new build system will also "discover" XS modules, rather than hard-coding the XS module names. This allows for switchabilty between static and dynamic builds, no matter where the xs modules live in the source tree. This also allows for third-party xs modules to be unpacked inside the mod_perl tree and built static without modification to the mod_perl Makefiles. For platforms such as Win32, the build files are generated similar to how unix-flavor Is are. =head1 Test Framework Similar to 1.0, mod_perl-2.0 provides a 'make test' target to exercise as many areas of the API and module features as possible. The test framework in 1.0, like several other areas of mod_perl, was cobbled together over the years. mod_perl 2.0 provides a test framework that is usable not only for mod_perl, but for third-party C modules and Apache itself. See C>. =head1 CGI Emulation As a side-effect of embedding Perl inside Apache and caching compiled code, mod_perl has been popular as a CGI accelerator. In order to provide a CGI-like environment, mod_perl must manage areas of the runtime which have a longer lifetime than when running under mod_cgi. For example, the C<%ENV> environment variable table, C blocks, C<@INC> include paths, etc. CGI emulation is supported in mod_perl 2.0, but done so in a way that it is encapsulated in its own handler. Rather than 1.0 which uses the same response handler, regardless if the module requires CGI emulation or not. With an I enabled Perl, it's also possible to provide more robust namespace protection. Notice that C is used instead of 1.0's C, and similar for other registry groups. C makes it easy to write your own customizable registry handler. =head1 Apache2::* Library The majority of the standard C modules in 1.0 are supported in 2.0. The main goal being that the non-core CGI emulation components of these modules are broken into small, re-usable pieces to subclass Apache::Registry like behavior. =head1 Perl Enhancements Most of the following items were projected for inclusion in perl 5.8.0, but that didn't happen. While these enhancements do not preclude the design of mod_perl-2.0, they could make an impact if they were implemented/accepted into the Perl development track. =head2 GvSHARED (Note: This item wasn't implemented in Perl 5.8.0) As mentioned, the perl_clone() API will create a thread-safe interpreter clone, which is a copy of all mutable data and a shared syntax tree. The copying includes subroutines, each of which take up around 255 bytes, including the symbol table entry. Multiply that number times, say 1200, is around 300K, times 10 interpreter clones, we have 3Mb, times 20 clones, 6Mb, and so on. Pure perl subroutines must be copied, as the structure includes the C of lexical variables used within that subroutine. However, for XSUBs, there is no PADLIST, which means that in the general case, perl_clone() will copy the subroutine, but the structure will never be written to at runtime. Other common global variables, such as C<@EXPORT> and C<%EXPORT_OK> are built at compile time and never modified during runtime. Clearly it would be a big win if XSUBs and such global variables were not copied. However, we do not want to introduce locking of these structures for performance reasons. Perl already supports the concept of a read-only variable, a flag which is checked whenever a Perl variable will be written to. A patch has been submitted to the Perl development track to support a feature known as C. This mechanism allows XSUBs and global variables to be marked as shared, so perl_clone() will not copy these structures, but rather point to them. =head2 Shared SvPVX The string slot of a Perl scalar is known as the C. As Perl typically manages the string a variable points to, it must make a copy of it. However, it is often the case that these strings are never written to. It would be possible to implement copy-on-write strings in the Perl core with little performance overhead. =head2 Compile-time method lookups A known disadvantage to Perl method calls is that they are slower than direct function calls. It is possible to resolve method calls at compile time, rather than runtime, making method calls just as fast as subroutine calls. However, there is certain information required for method look ups that are only known at runtime. To work around this, compile-time hints can be used, for example: my Apache2::Request $r = shift; Tells the Perl compiler to expect an object in the C class to be assigned to C<$r>. A patch has already been submitted to use this information so method calls can be resolved at compile time. However, the implementation does not take into account sub-classing of the typed object. Since the mod_perl API consists mainly of methods, it would be advantageous to re-visit the patch to find an acceptable solution. =head2 Memory management hooks Perl has its own memory management system, implemented in terms of I and I. As an optimization, Perl will hang onto allocations made for variables, for example, the string slot of a scalar variable. If a variable is assigned, for example, a 5k chunk of HTML, Perl will not release that memory unless the variable is explicitly Ied. It would be possible to modify Perl in such a way that the management of these strings are pluggable, and Perl could be made to allocate from an APR memory pool. Such a feature would maintain the optimization Perl attempts (to avoid malloc/free), but would greatly reduce the process size as pool resources are able to be re-used elsewhere. =head2 Opcode hooks Perl already has internal hooks for optimizing opcode trees (syntax tree). It would be quite possible for extensions to add their own optimizations if these hooks were plugable, for example, optimizing calls to I, so they directly call the Apache I function, rather than proxy via a I. Another optimization that was implemented is "inlined" XSUB calls. Perl has a generic opcode for calling subroutines, one which does not know the number of arguments coming into and being passed out of a subroutine. As the majority of mod_perl API methods have known in/out argument lists, mod_perl implements a much faster version of the Perl I routine. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Doug MacEachern Edougm (at) covalent.netE =head1 Authors =over =item * Doug MacEachern Edougm (at) covalent.netE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/0000755000104000010010000000000012540623200017464 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/handlers/bucket_brigades.dia0000644€ÿÿÿÿ00010010000000766311727205031023013 0ustar ????????None‹í]moã¸þ¾¿Âð}iÃ÷—óín-P í½ëç@‰µŽºŽÈÊeÓýíåPÊ›#9¶(zãìä°›“—Ö£¡83‡Ãá?}¹\ŒþÈËu±Z¾3BÇ£|y¾šËùûñ¿ÿë÷vüÓ‡w?Ίìÿg^f—#ÿå®Þ/ªêꇓ“››²¸]gÕª$‹âš¬ó“ÿe‹EvâŒ?¼ß`–U|Ö|šUUYœ]Wùh™]æïÇgÙùçy¹º^ÎÆu«¦Ýùj±*Gd‹÷ãï>…ŸñIs›“'÷Ùrï«lžŸ•yö¹ûÖÔÿ8×çÖWy¹yÛ˫պðMªÛ«gM:î?jÓ´ZûFËù‡ï~–ßÕÔ|ðp¯¶í©.³r^,Ÿãø¾YÔÁ‰åœûÎPÎ:j¤aw}²?ÜÙaᇅ+ W¬O¯VeUfEõòlµZäÙ²F­Êë¼?Îú<[ø!¶M¬)>Uµzáù?e‹õ.ÔßkÛ¾š;/‹ÙvÅ}Ò¢ã.7Ŭº8ý’¨»ê»ß&ºûź8[ämO_,«Án;Ìí7ßN°Þ_ õÝ:ÝÃÌæ*Wû»‡ùu1Ë×/ ³§m:îtÑ4;y©×7ÛíÚ1õGÎ:@,²Û¼lnÿñÁMšÜXœG½°:ûO~^5âýVeËYVÎFß>®¾ŒX‡çÅìýøWú´{6ò7ó–ïYÿ\­î'Rq&&‚h­í¦äÏíFÊÙÙ&HéÅÈ–óE~Ä ®íT"%g®ˆP}óE~yz¾*—Ï9ÂÀ"¤`Qž‹ygM%NºÇ?Xy1¿¨ºÁ8#z°³U9ËË—D£„Zúô‡÷Ã[_¬nN[øêάÝrœ<(Mo-b±Z$7Æ1I¤c)µÈ‰H1¯Eœm¼I¢KªECˆ¸‹qç ÃÁ´ˆ‡ÖKÿrNŸúÙO›‚ÿÒ+æS–Ü[/ÿ™W7«ò3¨åõºE-y¬Z2K¨¢l¢‰u¨„zÉ41p¤0rÊÂã‚‘V=Çïùj¹<Í—³ N/!;šŠðX´¯¿¸^Ÿ^xsºÈ·>SèK´QÆm}"G˜äÆõl`kKC˜lÂa̘Ä4’ë SÞZjõÒ]­›ø_B ù“†wêûÙ¨`øÿu±º9¿ÈÊÊ+À?²åµ7¿^åeVy%hÑ­ Ž8't¶sZ¦Ô$D$µœrN¨6&aø©”^jwrS„2fÅÜ¡Ô0 ¶(–ùËN‹mø,Þéz«Ïª1úA|*‹ ž†>¿ª[ÜÖWëêv‘oäËëËæÅ<³N­Œ}`«üK5~!T°Ñ¦«›BlõI»0lGvKä¢ë¥¯–U|>ú”]‹[ðž×eïüf<  i}‡_ê|ÜŸû?Æ3mÕ¥Mþ'ã@ŸøÖÉní!ã`6‰æNŠÛ([óåeÞþB†þ®â´†kö4)‹âêôbUÿõÃ)[DÏO·Áx_ç€$`2:°$üìG© O™2®äq¸TÁãë)W„)+ÕІ% +Å ˆD‰ $GI4¼…uLÖóq¡‘p áˆ"*špè¬SÝðÌSnï c‰ G¼€H8p á@Âq”„Ã<„ G$áÐÑ„Ã*A8,qæžpæÝØG¼€H8p á@ÂqŒ„CPB%$}ó—Ì R{BzŒ0i36< ¢á€baLŒßß={©KÄ}dD[£CS®R¦/ÝÇ6Ÿ.í´¯¶nfšl™¹<íÏ-祆ÐkÎ…E/êûd·¾€wâߺ¢ëgŽêî_Fuç€}U+?†íxôð¯^”gOÕò]Þ|Wöø®h¾+z|W6ßU=¾«šïêÎïÞYÂNÜÅPüR”ç×ÌK~»Ê³ÏÞ™þé/×åÊÿÿòÏ-vÃF§#ßi %:mÞ# ‰I1á !YˆZG•ÐIg'ƒ¹ËüÄ‹æžþØ„JŒQCä ã g(÷yn]]tÜÇ{i¥Í„ƒö$Ï£u* yÄG˸Óø­Ó&Ò"$Fжbô£?Ç™Hë§V\ÃfŽé´û‰#ŒÞ¤eÁ!›Äé-ÖÔ8Ò[8ìÒæþWòì–Xùn Ý@ºtãH³[˜’m\kB¾Ë7ØÙ-î|’Lîùd·˜Ãðxùo ß@¾|ãH“[E¾|£gn ã$·*M(¨²sCße®¤ž0Kœu&ä·P*b\ÿ>ù-íR¶/h+ÊCSÑwyÇ—»àææêN×ÄäOê²(;4¬»Ä9-ã “W„ˆÈ^qÙ+ŒF¤¯xîž eß Ä冬ð£YîTâURãç $•œú±í¨t íBñÔÕ†¢EÄIN"p“ˆ£ ZzLaêòyÎá$'qœ#¾è'Î YPëR†-=ã‰+ë ð•ZÖ¡uÒÀå2"ë@Ö¬YÇQ²á  À:$ã iÒŽ=c—j€Ââ¦./¶ª¸%Z³FAØRÅãÿ>eÅ[DlZrx*hš8j¿…ùl™™ìšécä1F³Eމ×'Œ.£…,4µGŒî½µj7u‚m. 1ÿ{ ƒC›ÕlâlƒA„DÒŽ¤I;’öc$í@b4œá±@ÒŽ¤}_Ò]MCÅá+OªµLºoSi c€Ä¤æ@4,õD#ÊûïÌÜ;ål?§Gùƒ¦Ö$­©qgöꃽ9½ãÅ15+Øk(Áâ+@x+[nÓžõ#w$f””S?ú2ÔuV¦=’n!w«¡Õ ç¸íZB!F}Ø’ý…{ýëŠÑ%ž1ëPtS¹”æÔ#1GëòžÔÉ©Ãk]cÄtÒl¦A„ÄÚVŒQ`ŒâcÚ@ålXÊÐC¢Øó¼b:@ˆÂ…Cf¬T¸¤! %¹sI:7…ƒp•bqΟE»œí'ôRUŸjH¥I¢¸×ÿ}ú Wˆ‚³˜…{! ÎâCN†1À‰áÒ¥ Q¸I3j¦’hÙŒ>e]Ú"•C‰! ¤Ñ¢xÓ! ÎãC²ž½["iâ…¬C°Á*„(TQpJ¤N¢@H Q m}}¶•m±­^±è ΃o0h!ëI‹ƒ ì´À E‰Þ÷m‰2¬Þ-9O9¯óH,ÔVðDÄp7…“¤ u¤MICiÒ¤!HCÞ qö#Y !\c~'òH½Ž 2L'm’ò@bTÝÑ)ÀC$ð%’î*BDä!ÈC0cYÇQî*ávÖau ëˆej€Ý¬Š†uH"õcÖ¡‰raCˆˆ¬Y²dGº—UqdÈ:z'ŠêøDQ]§´"çIEµäpÔ¸!ÜrE¥Žôþ{$ŠvÈÙš(J–¡©ÔIEë?[–g73V¶Lf6{v‹Úç%ôËT5™ª\D”·á<¢†6—gÀsõlØïNëÜSMœ2^ŸΫÑDz˜g³|ý-Z–>ó´}X¢9éoNöŒUŠèÝ«÷Uä%¼M‘2V 9“5’áÖL'ÜÔõë¢.i1€!„Ü-X©ÜÓ›6XiÔ¡QŒ]bìò›XÞ×¼Š!Ìk8ZIm^5­‘Tc^­5V0¯ÑB¢yEóŠæõ›Júr€-ÏT™ºxšµ6é–g)%Õ<’°¶<+cusøµK¼é9^HLûEãúúŒ«ÜºéYaèC×wyŒÁ!¿ŠpÇ%Æš0ñ7Žy¨69KKMpʽ—±wÝä,™«‘<õ€¨¼R¢f<íÄn!‘y ó86æ1ÐKC&ò7>K«u]ªÞ A&ÉD†8ÆWˆÃ0éÇüc&¢‰¤b"C‰L™2d"of3´ÈD‰ ÅD¢÷=rA¨R ¡$f"œçdL„+¸Õÿyj&2ˆÈD‰ A&ò6˜—„j¦a“2d"ñLĵ:ãˆ6éæ«»ÕGŒõH«3ŒX§²:%$2d"ÈD‰¼±ÕJœäx(2‘½K+¿]SQØç2k’G¤Ñ®9ÍW¨©GÚ*X%é]þiçÒ bnIߊÉ`MR[a7–@7*PQq×·Ï­gÙúâå*AÁ:Öo2Eñ¶—VF—j¯¡¥kNºN9Yð@ÂÉ ¯ÆúÉ÷ŠÁ›Ìn—¼ÚP‡˜[ÜhÌj+êë+×Wõ•ô5º¬|Izw2}ÊMu€Ä â:(¬ãS¸ÖõFbïÈR×`í”sËb jìÖXý•46ºÊDˆÃHv G)5˜ÔIÁÊ ¿¶†…åºô.¶SÎ-AsŠûv5Ö|%Þ¸Î9aÆë"²w ±ÝÓ{.8ÜÞJ9…%|Ê%\[Çuj…í³¥%õsjæ ¥–¨­¯U[Ò9”þh?\lbýáp$²†¬L£?Ü_+*“W°í³]$´3޽}õ¦tœTñU(‡Šnžˆ´vüÉB)z3}„l± %.Ѽ8"q‰&©GÓCx4å !ÂX—š:@J˜àѼ*”LÊC8´6);¡´Ð²÷Äòa„,%#”t¿ãArÍñÙÒš¦&í*!—„Q@ÜM¹7¼Šeã½qé—ÿ•_®þÈg£³PÒunú09£½tR«b°*²Ön­“ÄâŠýó@`U8\špùú­Ê¯e1/–^ÁЬج´O4+IÍŠʬ¢¥8„YÃ.ŃY±áòõ›•¿-×yY![ùJfesx¢YISPƒd^ùé¶WoÓ±g×Ô+a­$Í5¯S¯‡ÍZ w€Ô«V9»s¯¢vuàJÓ+_¶±ëÂõõ"»ÍËïê ÿg^f—Þý«Î÷)-mod_perl-2.0.9/docs/user/handlers/bucket_brigades.gif0000644€ÿÿÿÿ00010010000005304211727205031023013 0ustar ????????NoneGIF87al²÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôAAAòòò???ððð===îîî;;;ììì999êêê777èèè555æææ333äää111âââ///ààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷DDDõõõBBBóóó@@@ñññ>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,l²þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠÔxŔɓ(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨QMÍZÊ´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]û5)Û·pãÊK·®Ý»xóêÝûÖ-ß¿€ L¸°áÈÛPš¸±ãÇ#KžLy®ßʘ3kÞ̹³g¶—?‹Mº´éÓƒC£^ͺµë×°›ªŽM»¶íÛ¸ÏÎÍ»·ïßÀ¯îN¼¸ñ㫇#_μ¹sÄÊŸKŸN½ºÚèÖ³kßÎ*öîàÃþ‹Gþ}é¼LèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hàAUy³d2ÒƒF(á„Vhá…f¨á† 5³àbW9Ç6$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)ä;’€‡S1èà6Ã4éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl’ÙÉ‘2VÕ’mÖiçxæ©çž|öé矀êå›HJ¥$L ªè¢Œ6êè£F*é¤MgˆˆRªé¦œvêé§ †:(œI‚h¢¦ªêª¬¶êê«þXZZªœT¡ ë­¸æªë®¼ª)«¡¦Î™i¯Äkì±È²úkT‡&šì³ÐF+í´u.ë]°µKí¶Üvë­·Ö>Õì·ä–kî¹°†ëԸ趻+îÆ{«º²a;•­òæ»* ~è믨ô2Åî¿wêEĬ°¦/5ðÂ?Š‚@ýFlñ¢ ÏòðÅûy°@ w,2Ÿo<òÉuNŒ$pÂ?RðbÂ' xÒ@“ÇhÂIÉ-h “Iù“o~çFÀÄ:±MP©—à@'8q BhMZkÆñT8és/ Å2ÆW¾ó¯i°C“ˆC@"¡b¦œE,(„àJX“íÂ4?'ÍpJ©ˆá0–qµ‚É­ þtûW 4ЃI¡I)С'ž1Š#ÒŽt•ˆÚ0À`a| I P•ø I„£Iá •j0Ž&‰ÁÃ@é,¡Ã\0,Kb“–Ø$Õ #çhÒ;Rè5fÅ,*3ã•$ü ˆD8 ¸Ð@ Hq‚E§W(m Ô€(ÖAºÏõòIŸCD<† 'år—xR'¨tÅ ¦Ñ™ÃЄ”Z0ŠkSØÜe¡ô Htûàc¡üØ:@¾ŽW=(Æ3dð$fHÀI“8D”ˆ° '`Nþ‚ œ4„v #=Œ¦œt|dI ªxÆ•fX *$ˆú".Фš¾lR%ºÑ$/TÑÀ*+zÑ&M@Šß¨•nðÅa„ƒkÒü§(ê8(i ~Ñ ©M¡Ô¹&5óS*<Õ9u5Þ NÚç“´v Kœ¢$à'¡DZµIÌ(…VKq |^首:  –‘e¾,Ѓ4ébÍÆ6‰ Œ£F Ú±×aÃi›Ø4ê ï5I®t­@5Œ pb/ €”‹Pp °ÇF"4щRÜ€IÍèD&8!‚j #kØF*0 ÄÖÕ´Ã8þÀ&4À¨ÀAATa±W)ˆV}Æ&½J*hR(‰D'­€J¶³-ºÄ¬#K«hF“”€‚ý!­™x·ÔÛlýVWÍ8n“’q'ãM¢šÄö£lM‚Dœ4 G\U¯NÚÀ#¶d†!È¡I }Ò r Ã& M²@ þ…Öƒ¨u¼¾RyÃvÞ\½âˆ¤A‚&•+(*à¤{¬Âª…1HA…&Q ¥%Ö6 XƒÅ‹°šD ¨¢ ¨Äu«Ô`l5P‚FàT ‚¢ÿúnB›á.Giîë0²êeF!2Hsþšk°„#¨YÍÅ-³œ¡fsŠùXdžó£ÖlèùÏSª3T‰¬PPã„4£øìgE;z‚~ ¡-gFSZÑ‘vʤ/ÝeKsZÏ™nʦ?=^O“ºÌ¡fʨOM3S³:é^ʪ_2WÓZ¼±nÐPoí2[óÚe¹žõ¯9æëv1‚š`À•ò\%fg)¸!”¬†5iK‰k¸ ö®‡=²bŸkˆh’"(Y%±^ÉÜ]²c”L÷%uKÉÝÊêãµÊ9èmïÊPv”.ÐäüúËÛmš&2Xp¢ðû@ Œ`$(A$Mq "*PÅ XÀ‚´Â/x þbpà3±»Ip†%RPt ³Ð6k“  MŒ °fÌŸTZ”ní :<ÓJT Ø$6I‚´à63¸AÿyPå á0HhBLÞâúc½ïì¨ XC«§h´É-•8KfG»Ú³4_4YÛ]gF ŠP„Ÿø€:ÑËn@™À.a KX ”˜Ä$‰@âx€Á,Bd÷’ê2á$ÔýIqÎ@N£ (ŹI'¬¡”òmV‰ŒfD£ׯ7Æ‘‹¶wõ˜*m‡¾Q¶kY»Ôv-Ý}JÉ_¾žž®¼“köM¾»ãþŒ:Ñ¡J¿†>ÀLH=øSúé3wÍiVóšÙ\²»ùMæŠóRB=>£l׎Q8©ßð % RNbI˜¤IN²I‰«4 £TJ§$|g§UòÄJNÒNâ ¥Pn ZÕ$°R²¨p Ð4Ö$$IäÖ$ p ¤  5hJ#5 x`#`'à Üb}ß²˜ö·}N’ 95 ­÷}G÷Là ð"bM¸R-õRí'S4eS8¥SàÇSN¢~@vë"v’fo޲ZäàKå$yvOù¤TÃp Ñ eä$š0PMRPÿ…%hX jȆO¢ $ÀcOâlþà #uO %ôä$@ðTM’‡µ[¯YÃ@¯'-@ø-ŒÀ šð>M‚ $E¸• Ã¢ÀÀ;À£ªÈŠÃÀV … Öž   Ö„[Mc‹QBY–…YšÅYžZ¢EZ¦…ZªÅZ®¥XM"[´e[¸¥[Å'†õBoe¨‹b;Ñ@ \ð_y–\ORUM G[N’U[ÕU}¸PN2Žåè$ç%ˆèuMNÒTOUø%²€U[ÅU^1  ž@êH-ŸØ1žðjÆ×)3`ŽÎE%®@&`ˆÃ0]з%™‘n8%ûø$þ¨\ög;ù8 þ’UR \à!‘}6^[ó@‘Ü(0d¨ifˆ|O² t°‘S$Fùµ_MÒ_ 8 ^0 š8 6%/`XX2CFyˆ(%hÃ`Ià$õÕ$÷å$… N2M€r%C¶]/-Ém S‘›wZ• ’è$°& A0 R`c8¦c<†o ( ¹‰F†dJæ$„À ¤  U¢—¥À—N" ¥0Z%ˆÃ Ÿ©UYЦ€ ™`;.c2–‚à'@ «P ;pEEvdI¶d-¤`)p‡ÔbÀvI3xykÔ×1ÿKpœÀö“”¢6”Ž&ÍG3|þG-“œ§V§%^ÛÙÞy2à™žsžì92ëùžãžòÉ1ñYŸ CŸø1÷¹Ÿ£Ÿþ©0ý ú ú/z ñb î"Œ Eh‚mX25U#}Y‚Z[“+ ª í v² °[P2 ‰  ° ÐWQ‚@ •`–p—`’jod£ïF%'—nXâ£Û8Nó¶BZ0Z'; A?à 2%d ± 0ð ®à %ßp '`—D $ ¡i¢:=÷sAÇu'dFÔS+×r/‡uؤuV@D@Ø%I·@ ô@4AäLþTÇAÿóAu:B%Ô¦_g¤açB ŽIú-KÚ.v{Ã0{Ã7 ¡$GÃ@GÃ`z]¸T\äE`¤”R‚{ã£{ÐÄFMâFuG6|N(|yÄ©Eо5©ÿR©èbGáGàÔ$Ç$;õ$ÅšLNr“Q¢~e{1%ÔdMÄŠMºd¬O"¬öÇ[Ò©1Ô©jÖÉ«Þâ«ç¬¶×SVÄ…SMNbQOrRM’RTF0µ^3•F5~[8 î:ªN‚®`è)*®”Êþâ R„‹Ã ‹Ãp[¹µ[ÓhZ¦ˆMjµÕZsõZŒåX%YÅXY†—Y›ÕYŸ5 ¡5Z¥uZT›þX°e±Øø°¹:+HJ°òB®6Ë-›³Û‚³<;-;û³Ò²€ B{.A{´ÏB´F«´ä’´N{,LµßµTK,S{µ:Û­&£µÑ’µ^ ´\û­²®aË+`{¶Ðbµj{+i۶ȶpë*o;·Å"·v»*u›·¼2 `|ë¶E¸Æ2 ¸  zH¸¬²·ŠÛ5Ž:†Zw† @ùÓ¸ªÂ¸˜»:c¹à:¹ÁG¹¹¡¢¹¤»*† côàV§ë)¦ûºª«æE%”+,úpC ²«)±û»aø¸ÝX³RB¹€P #0Y0Îû¼F'¼‹¼ÒË)©þ K¡ qƒÕ (ÔÛ½”r½Kq Ñ tp¾tp ýоýÀð¿ò ¿ûP¿ö{¿õ«ú»¿ü«ùð¿Àÿ‹\ÀLÀ÷À ¼À÷`üÀìÀõ0Á\ÁŒ¾œÁœÁóÐÁüÁ,"<Â$,ñpÂ(œÂ' ,ÜÂ.ÌÂïÃ2<Ãïà6|Ã8lÃí°Ã<ÜÃ;Ì@ÄBÌëPÄF|ÄE¬J¼ÄL¬ÄéðÄO\H0ÅTœ V|ÅXœÅVÜœM ¾3û5Æ%È;¾‘M1’Æj¼Æ"ÑÅ^|4›¶ Ø; ä fÌh|ÆðÇþÆp‚<È„,ÈÈpȈœÈ‡œŒÜÈŽœÊÉ’<É‘¼–|ɘlḚ́ɜÜÉÌРʢ ÊÎPʦ|Ê¥üª¼Ê¬ÜÊ®¬ÊÐ˲<˱¶|˸Ұ˼ÜË»<ÀÌ ÌÔPÌÆ|ÌÔPʼÌ̬ÌÖðÌÐÍÏ|Ô\ÍWÀ°W€ ÜÜÍÞÌÍYÎâ<ÎᬠælÎæ°ê¼ÎúÐÎîüÎðÜÎØ Çq<¼´Ëau|ÇWðþüìÜK¸iZð(zcYÏr Æt<%cŒýi…aRÐí( ½Ð mÏs¼«mÇd €þÒ* ¸¯Æ¹(Ð ýÑÜJ¼@é¹e ºžàÆÂ@€€™v9S Ó-ÓMÓÖÛ¹a %”+°’v9 —Ë(1ÍÑ3Ô’º€X Û0ŽRÕÒÑXÕJýÐÇ {œJJT]ÔV}Ôe=)zU$ŸDà ©(& Ôc}Õs¾g-ÒR2Õò{-(}mÔÍ0ƒ]»¼ú’z'‹×-Ø6=8­k“ž÷Ð`| ~Í(d}Ù’‚·v9 Z·(•ý×rmÚ‚ÚÜæ9Å(­MÚ€ ÛŽ"ÛÃváfÛ¢ÍØºý(¼ýkå@­¬Ü–=Ü»ýØøÌ« ЉþrÛ‹RÚÌÍ(ÅÍk\pÉ=ÚÕÛ×-(Ù}k~@ BÝŠbÝá-ÞÎfâJ-ÕݽÞìÙÞºÙÂ&ŸfÀNi¢dðßà.àm÷0à>ൽ&êMß2Þ´Æf &ßP!}&ùÊààõ}Ïîm—0!>â"^â$>âP&¾â'Îâ¦`%M]0ã4^ã6~ã8žãÞ Í%¾á(Žaf  ‰ GžäH¾äJ~ä MÎäR®ä¶°®T%=ðViP'?äBÞÞvf—^С J æl¾ænÞæpþærç٠ŀÜSÀ þoQolæbî'C>^fÀl-à/-%ðçoá Ð¥m"èƒN2d>vÇ©9Ð lÁXP ]í¥ÅùY~á®á—Þ'…>^pž¾ßA€%-kAð`¶_b髞'­.^z {¬Ûà M%Y>kq €vâë¿~'Á^3ýÀPÀ’Êv%Ÿ°…¸íª>íÀžéßxœR@3À~ SY%‡º°̺&ÒŽîmRí4ÃXß°·q0êS⥮¾…`î@îïvð4ó¾Ðj1 í0ïV²0 i¡ëp]éç.þñÕ¢î‘ † > v°% %¼ÌŽÎíoòò’ ï@ % ý0%åíàžã^î9¯óÿÎóŸ Ý Å ˜` Z”%õ~ïhñíûÎï%Ïô¾âô9í¬ Á€B`Én% ßiñ£`þõ`&kOñ4“Û@h 0 ’ZâñTp4Ê=÷_÷`Ѻ¬bÏÙÞ¹S h1P˜[²@gpxÒ%û`‹÷.£å`h!7«Z’ïpÄÙ^w"ú£%õàÆ§ÿøùýiZU€•pE%;pß.‹KþŸû[o ½oß]ËkHð·ÀúeA € o%ÝîÀ÷e÷r_'xàœÐ¿%lÐô Ö_æû¼Îi"°‰^á Þ%‚ßý@¶a D˜Pá‚x,aQâDŠ-^ĘQãFŽ=~œ F36ø°€f³\¾„9 S1m¾Ì`Hž=}þú.—›EÆüV ƒÆ…z3€3@:„hUëV®]½~µj€Åر0fÐ¥J•,¡Î¬uVÎ`íÞÅ›0PžSrýº„°ˆŠÆ:ý•k€-»Xó>†YòdƒœÎ^¦ºkÖÚ”W¶þ< ×/]Ê¥Mgœ…(â¨T•Óx/ÖPAàÔøáiÞ½}Û%B¤Øp#ÅC’öAZ¥óɧï¹Ç©ë¡š«­ž'k9äˆg\ã±Ý »vØ@{µÕP#·Ñ€ûœsÌ ›îrî&#ïqÆ£ïpþŒo÷‹nç"ñ•TÐB‹lÇ"òȯ¹Æ Ë«Áœ *¦á\ Ï£‰ ÑŸ!Ý 'šA &–aݹæ–K&9$ŽÁ€RŒ.8">²Œ—I~×ÀÕw;‹WVîèê;|—ÇëšZ¶)ø¥q6„#è<ˆ~ÅÓ-+ß \- „ðÈ7ÿ7ô² Uu€^»yãJÞ^æïÿªXÉ~–U,XGC›èÝ&7ÝøþÄw«õ§¾y`OA R0g1Æ/²«í¥;õ« þD¸#Ô <Èž!LP Ž´ç ð)Ø|êƒÀß(W°ÝùÊçÀvå§hE·âD^³¢T”7B&þDàèFôÜ Š ‹X«…< ,~/|7Ì!xpX 1†ñ+ã ò/#σÈS¢ýš8G(Á Zˆž± ¬ÓÊ€ÇÔð‹·cxù›E‚åè˜I rÄã%ñ(K¤c&7Ò€÷ÙÏt °Šèhä@‡+½hF7Úц´+²ÐC‹`9ËÑÚr¥/i«¸Ù%p¶Iˆé<êÛÙ*ŘÐ?£ˆšÐÈ;°V%`FèH÷Ú׎žtú*²ë_û×Áît‡ßüáPË™ÔÏŽ¬©­b ì£Ö7)¡$Ü᫹6LÄ4`DÖ´wLnk‹þœ;ÝêÆu²‘¼]%Ç™ÉÐÆwK¥ ”àïv‰ ê@¬4tø,’€9°ð"ÝþvÂg1îr[âà~7ÅåÐzÝ;ßWç¾ÂÄ á^@8‚e $œΈÁð…7#2OxÍÞfešÙ15È…žI‘ûÏâHx ŽÚ ¯)® €–üåø½Ë]s xZ&?‡IЇ>ö½'¨@2. h€#n7 0ÀÐx:À£ž§CR߸J;NvÂkÒì=¡öTßmpäÞæÕ»Ç€shîr8Ý펑ËϽîZñ:¨îì—þþ^‡ç )P×t üƒá3Ót/\;¿ÈãÿùtO¾òÑ=ïÃí{Ð÷üëõn¶ÇM¿üß $ @,Þr•wä Ä»¯ûÙ¿Ûö¸·ˆìiîïÞFþè•Ï|ö›Æù9Æðn¥3½#}O÷Þ7rýì§{ûá?í㺮3>Ñ ;Òƒ‚öS@Éx?(-R»p¶óˆÎK7ø¼À¿pÓ?¾Ã»wë@é»¶op‰€ ·~¬Ž°B,-܈@¼¶,LžÂ,Â<‹h†6”DxÃ8t$ ‡pKx€¯ ·µ ÐC>¼6?L­(Å>üCóã8ŠˆC‚7eØ&P‚IÔÅŒ¨D»x@P‚k›ÀL‰v€.B࣎øDWEEŽhÆgŒFW¡õ-¾,€½ß ‚Šú Xâ‚BãÇ(0‡~y^yÕ à~` ˆã96ïõ‰N¦ãÖEW@6ÀFÄBÆ• X_ß°‚ƒò(cGN㼈_`cQ=ûÕŠ6Zxa Àäî•Mö‰aÖä‹~«TN—B®†ðxzúKhd¼8ãZÎ a î#8#0–32¸ßüí`þbVç_æ6å¨\×õ› Uþ¾•Lp„ð€XûQ¸æ»ÈfȘÀ¨„ƒFè„Vè…®„¿å #n€¼‘艦èŠ&ƒ3†‡€ÖˆrîsFç¬çr>çeÆbfÖgÆ,°‚ðP1ö àVc*ë‚®(*[ ;€ˆ¶èŸ¦hŒÖ茀h 6ê¼j“žçÝ%½ÒÀçð¸eèðXPÊ é¼Ð‚(åê®KæŠ@’±&ë²6ë²¾„­ÈémÙéŸXkmiëRfÔf Ø£»Æë¼Îk[HC½ök½FV°¨°P-(ìÃ6ìÄFìÃî†PìÇ^lȦ‹ˆìʆìmÈÖìÊžl Èê›ü þ±>ëÑ&í´¶ Ñ&íÔ&kÓþã¹î.»àë÷ÄŒWØ-ˆÛÆíÛÖíÜÎmN€ÞÞíàæí#¸*‹p‚HHîåVîæfîäVixnç¦næ…˜Š8îéænêV€*èîðVëÎnÏ~dÐFo`æ× Ëð†€ïø–ïù¦ïú¶ï7™Î$@p ‚/øïðð'ð7ðÿ¶hi‹àKh„JÈ §ð ·ð Çð ×ð ¯Eˆð 'q/ñ÷p÷‰ÏNõ^2» ‰›Ùë‡H€'Ð4Øòò 'ò!7ò"· Xþ¦‹ÐK8d‰hò'—¸(Ÿòž`qçr…€q{³ ,ÄZH¸\Èx†À„Gðh€«~¶ŠP‚Zx¯OÈr†˜ó:—¸;ÏsØò.t^ZjAæŠΆ„‹ä-à58.¸…¿.‰ÀwÃH„Jç†KO·Lßt«ôAïò/O¾»àk~8’{Ž˜Jˆ¢„û„>ЃŒXÏI8"Pj®ˆ[(€Óu^ÿ‰Q'u7uõ» Ë„‹cKàˆbà_€¡Ö;HÞŠÐs@€„«€pƒ‹Èöm¸nÿvQ?ïb'õc7Á»˜ñ H8ïOøxþz7%ˆnC˜¹w³‚h‡ÜÓ÷„ë÷7wmFwAWwTó173GóŽ0€€Ã‚n¸öа}H€«…%¡.ˆŒßøwëø× b?xÐNxñ´gŸøSø p,H·þeà'àˆA†Gx·ˆ0ÈÑ'ýt3}Ô× :¸ÐÇ?G<°/{ö^xy ókË}ðÐ÷DXH·qà…è.x€i¯5$ LÅåg~Vs~è ØÙßE:˜=m£B_à¯xùpcNm‰NH·|ƒñÕhpʺ6/ÈØø—ÿZ£ûß ì×þI8ofðà°NšÍjèðá,LA¬è0€m7rìèñãÁY,iÒb®@²DX®“2e60ö¯%ÈjÈÌìY±Ö·A8;êäéóè, B‡2EHÀ“¦R§R­jõ*Ö¬Z·rµþºnÄ‚2<)‘bOŒ»âÜ Ò£¦XÒŠ$Gq{Öª€«…töö õD@ÕÀƒ Ë4Œ˜­S¨'S®lù2æÌ Í “H°#Y™g}ªÕŒpaŒe:ÀgkzW—‚bV%ûÑ6y+˜ªºy÷¶ø;xå§QM3oîü9t­`]8`G‘ÏcŠžH:£ókæÔ*Q‡¾>N¶ZgÀ<Äu ´`ÅÒ#ü‡µä;VÕ>~ù5´_–)‚ *¸ e| òàƒ£xD/=h·Qhfy—xΑ“‘€³œ@\¹aÅ-!ÎG+dµŽ$Ï„ˆ\£ŒþÒh£’1ø#A éQž €5¿Ìb¡Xr§!Z3•æ-#…Ø.pÕ6;¨8É ËdEÊ(Ó„H€>—\E¦™¢©fË 9'u6Wä°è©ŒD4Ä$hOš4‡k5ç\ž€\9F-³å׈,Td¥E#†„ȃf\…©¦rêiöDq*ª©jc9M¸ú*¬±ÂÊ ­µÚz+®Ì,±+¯½úúëÊ;,±Å«LÉ*»,³Í& ´ÑJ;-µÈq-¶Ùj»íÆxû-¸áŠëmåš{.ºéA »íºû.¼Ä 1/½õÚ{ïÂè»/¿ý v8T@þŸ^ˆP†ƒn(e‡Í¡¦š€­íÓ•+þH! СÕ>¨ä¢.c´sUÇ òÈ=¹2Ë-»ü2Ì1Ë<3Í5Û|3Î9ë¼3Ï+ ÜÁø¹äÁ%\¡ Êœxä凞z]½cÃ0Fã'[!rФÅÕRK5b^µu×½}öeOe!Ûm»Í‡†Ø17ÝuÛ]÷=yë½7ß}§@ x>8á…žâ‰+¾8ãùèñ8ä‘K90t¢Ç>™k¾9çïÃè¡‹>:é|ôs:ê©«¾úé~¸þ:ì±ËîÇ?µÛ~;î¹ÿï½ûþ;ð€0<ñÅ€4(° óLþt“ ŠôÂ2Mé!\ä7b‰]1ÒÇÐð-2A7[µBÁ.ùQáO,YŸ>|ë·Ÿ¶?º‚ÃÀÀ"ùûÏV‘X& ƒEÏhÓ³HҬװæÌ˜T–Ø‚",h#ؘVäП™'µ ÕU4ÈÁâx„É©ƒî—¿ýõï.Ì +¶ CZüôU…EIKcΊüœ‚Qli?¶´Â\Y@´Iø£Y¢áCE+ÒON)þìÄÂ’‘+…ƒ<‡}j;;¤^Or½æ CÈÏ È`@€Ï.q ®T Èj¬þòðIä"»$Š‘e¼äVJ€=„¡h9«'Ç2Ç  Gyеf@¦üXLqú!Š{pÅ €eq¦Ð±]Å–¸ì.yyB/.ˆ’u#&“i" Â3üä+’ÀQþ9cÈžyÐlLEÛ€O5&q€®(€V0¨ðŒ­”óœÅIç:1s “NÈT&>¥R „E‡Ý‰£IæÈ@šÇhÅdøÐOÀǰBW(ˆªgä`ÅV$JÑÞX£òDa1Á¸BK泤L1Â+<™hBdš%%…hž"Vb2H°A>ÊÆ˜u`B R;EøhC(aþ+ïªy†ZÔSAõœÓ=M*UcÏ\éC Ð’”9u$†yò¸ÇÉtÉ(dж¸áîì ô11­´õ­´‰ë\%IO‘V²…Sý«GŒP>7þó;Õ4)éaƒÞìb}`ådŽÑk'x[Š!e¤r5·˜бÍr¶7Ÿ mfæi?¾“¤€}-N@)MQ¾ô°¦ºÑ›tl³2šØÂ{z“È2˜ Ãbi£„"h£+ÇMîj–ÛÜÔ‚Ô©¬¥,°Ør—%²m)m¹ Sæ4½qà*C„iô£8ÏH ƒ] ¢7ÝH‡º2ßúÒæ¾þù¥nSôÔ!ew»Ý=0a¡dXi"è PÊX%0íNAÈüÃÁè !žp®tøÃ´ ñˆ<ÉëΩÀ~±³:Û­Z¤«ÌÀJh –q”@›Z a“ G,dЛxA´\A²’iÃd'3uÅa¬“‹aüâï>ĥ⵭fª€:@w/í,ã^„ƒ6‡0†Ù B£7 @G$·2ç:ÓæÎyÖëj¯Œ]íjyË,írxk<^æàvçx4¤#-éIW¸Œä€Úð`´œŒ'² †]$ƒÔ¦.5ªO­êrà õ¨S-kUÏšÕ®þÖŒj¿(èºÐæ²C¼¬h0k¦=kÁe` fdÃÍ~¶³£ íi[` ;e‘€ØÛÞî6¸¿-n;ˆC)€Œ¶Ç­îp³»ÜçÆuuÌb÷Ú×ÜvC„]3Oø7À.𜘙Åàð…+¼á ¸ÂM·Ê迸Å3Žñg¼2ÿ¸ÆC^ñæä:¤»¦wœíýZ|G$Ñû^´Ê[B,̼æ4¿¹Ís~󘓱ä]Ù@ ‚.ô¡}èÉ«BÑ“^ôNTeŒx:Ô£.õ¨/'˜:Ö§>VžÓ‰åú†¿¹.v±ûœ+©è™ÍMk ½fþûœ¼îr°Ãîv/tÙ·4!~ÿ;à/øÁ>ÈpUX€(° ñŽ<ä#/ùɳ  çÝ$w¿œØ™ÿô_›û¬ä1ÇŸo/]•eðƒ19>®ýè8_iã?I§•³OàúèU{Uª€u\ßx;ú›S~æ¿ÿ—TÿU@°Âõ5Ó„Y?=Âõñ‚ÿ™ÆþQÓN ÿ Uĉ\_\¬Þñ½^öP fþD`m‘ É<4XÆîùƒ‰•^cñƒðUñß:¤ e˜à—ñ .È ¶ eä‘üž VpŸ÷ý!€.ádøà°I¡>Ç^Æß´_ë=Àf…üÑ_ëÙ_Ö\!WPaçµD=Ô ¶aUd¡e ¶^3QBVðü: fÒç Ã#DÁ_ô¡!2VfÁïm`bÅ$@*´ âUüáC„ÝA<tr`¢(vD"Rà –tV…À´ž)íà(R…&^DÝ„'€9¨A-þ¢A”"eäÑ<”Þ:(aV0a/”ÁD!þ06Å-6'ê"ø¸ƒ<ã( ãd4Ó$”ž'²ÀVP°Aéyx€62E4ÎÂ4 "àÈÀ˜$\Õ:!7BNéý l–ž…À=ÆÖ¡ÛÜmb.Â#*ÜÂÙI„4@‚DNd?$æ#[ÀhCé%ϧeE$NbˆTâBd;¾£'¢Â,Ð(¸Œ8Z$ bdWœ¢?Á¦tŸ0]Å+Æbˆ˜RÀ¤wd¾%$.bJ"¤8œ‚Rž‚0ÀKåÊdW´F1 È1VW(ÁðÃ2 ÁäT~ÄI.äQe <Ä«˜C´%9¼%9Œ\Š]†]†þ8äåì¥7ô¥7t`&7 &7Ì6f$f`c^c^5DfL&5T&5LfJƒf¦ 4t&Á9h¾Š­ðʰ,K´dË·˜‹»Ð˾k¾fƒlþmþ€/Üfä&/ì&/ì€oêpêB '.ç ç Ø‚rÖsÒ‚sÒ D§tÊuÊ‚ \g,dg lg è ,Àx¾‚x¾Â ”§+œ§+¸€z¶{+¼§ä­‚|®}ª‚}ªÂÀuÊ@uö§ ^†7†H8vÅ@;„:ªcXú“‚=K”eË¥C¤eÛ](†f¨†n(‡vhÌÔ@þØL€ZÆ>¶@ˆøcW¬@Bˆ dƒ:(ÕHH(D2€2ÀÙÁB7tƒôè7üè7€†‘Š‘ŠÁ8$),i94i9˜”š X¤¡•¦–ª–ªÁ:t)|)´ƒ˜º™¾ƒ™¾¤i<¬©Û̃›ÒœÆ)ÔÒÞ l$NähŽè ÎëÜNïO ª¡‚$ª ,ª €£¤€¤!ÂáB@!lªtª!|ª!€¨©"€©"„@H¬jü¼ª"Ī",­.‚­Þ(@]´† 4‚¯:°:‚°:Âë#+²>þ,ëDF€³F€ œÃß±*µV+FŒheh¤ È~¤VL¨€€ÐÀ¢EŽ¥Q€JθdeØÓÕ‰,@ÐɼÖëÜk‚H%WœâØ$|ôNvE=5ˆx Ã‹Â(ÉèGåX#Œ}Vì <À»ZŽ”—½Òëœè+‚ð+W4üm°Á²…VöAWšG!.,l‚Å(„ÎèêaüÁ¬À$0¼n, pìmtˆìVDXPõÆ>>%Wh‚ÂÇh¬ÌJŒçbKxb@@Às c­ÐΉÑÉÙb! j†'¶B~œ]ϲ…вþ(|øBÕZmaÕìÃJD”­sˆ-ÙmКmá†ìÚfÆ;À¶šÇf#[€«*À¹}ä-4]-¢e­B¦+=@tn¤-.ƒ˜.sÈÁâiÆ1ÜÁlmì,UWhÀõ=DUhòi;ÄTXHaG6lǶlÏ6;ðƒÇ2…kÓ¶nï6cÛ6¾Žž ƒ¶ŠöeÁj£6U„C7èTëQ…wÀj§ˆASowÿà Ãj•Ê÷qcÅxS…;œ¶ÀHE€øõøËwpÓwþ?á÷wëwxkÆþ—wSX´Éï!ÊTtøõ8W` 4@xÿA„…; %¥%»#&³E†[EKò×ïÝ@ù2EŽ_/V˜8ŠçŸ&ID‹ë­kosœv.ˆ+l˜_|èR…_Ÿ:F3E–ß–wyVy‘C_!0ÂþäA°x~ÏØ~ó÷ï™ãú÷‚xU¼÷ï±wPž·žž³™—¹ÝYAª>ˆ9HÄ‚F&ùî.97€Q”^J¬VÜ—¼EUxƒ8|úï…zWº ]»²ÌÀаy…»ù…gƦƒÂïÍ…w[EÀïáBK…ˆ·Þþ¦‡@U»¦sú©_ªÛ]»²ƒwÂ>€<4Ä¢·9Ö¾yf„_üɾÆULm'üX„âT0 ¯·ž¯ ùP˜{¯ÿú˜Ã¢,ƒ¼Ï;½×{½3A4ÄC;pé:„i;”©šÆƒ¼)œÖ©܃à æ|Žé¸NíOª¢6j¤Rj¦rê§Žê! ªªú¬Öê"ä*#4@4B°k²B€D:k$H€H‚$LÀ$LP%T@TB%X€%ô¼%\À%\7cBd@&d‚h€&lÀlÂ&p'pBt@'xÖxÂÌ4€(„@„B(ˆ€(ˆÂŒÀ( )”þÛ—B)˜€)˜Â œÀ)   *¤@*¤‚ ¨€*Ч|:Þ{]+¨çy¾€x‚',lgvò§,H§s2§-gqæpú&/äæmþ€lº&Ý‘CtFP;¬»8,ÿ s±øÃÄYÅ\GëEè»åˆ;{S€»îóþ»o¶ð?ñ¿ñ?è7„è“>£c¯£Ç²s”å–žœO×Utè3wqà˜/\Åì{IéÙþžWÅ÷×þízÎæ>¬?û·¿û»ÿààÃbbdZef¦4Dgþ[h6@0[²D™²$ÈIÀ_bĆ„"0`?~øêÑþƒ¯ºtåÈëÆ [¶jÔ 5ƒå Y2dÄŠ,0^½xáÊ•‹V­Z´`Å‚E«V¬P¥JEªT)R BâÔ©¦L™0QªDפH5j„(Q"D„ ( >}øàÉ“‡N:tàÄæM4¡P&S† ˜0a¸téÂK-X¨T¡%J&Mš0A’ ‘"E€ „G§äk²É#OMUÜ÷ãÇrÏEuÿÔõZ{7Ghʱ7Çy€FßùõwØsЀh÷ÓôJjµ´ö_ôÚ…oψ%.òv 8ØòâŒ#Þ¸ã\a|˜ÄzMÆð™bR&1à–|ÙX6¾C8=… ä´a.M¦Ø½?}ÏH Ýé°ÝD’h£ÏEšÅxK†ù¿dÐGj‘qãjå Š­ùëúëkãyÃfôp.Pç =M9èY€ZIu¨&bN¡Hºíno½Iöìô`Áùs‚eÄ÷›ñóŸ·ž9þ0MXÚ…³dÛážåž¸ó"u€ˆsÐE'ÝtDå}¼ðÃ?˜{bç3jÆ[¿vŸ¨¼ûù)WîÖã–q ˆJ”¢<½(ú2 3¤ã\‹òJÉ-*8áO#åVè±'§Ú ª2õæöjzSÆ` \2c÷ÕdþÔ‘AmÙ$éaq- ›k%ÔQ“úª6 |]‚+·æZW+^uXßÄ_XÁ ¶¦œìac)A§ÛS²»ÇF–¬,#$5ú¯GpÁ xúT6L·þ©­¯Ú&i©iZkZU¡»2ƒ“`[ÙΖ¶MRÃŒ–‘ÜîV·½å-oAa‚ßú–¸¿ €þh4 2,—¹ÍunsCåçNwºÉh‘r©›]2DW»ÚµîžÖùžv(˜´Õ¯ŠªLfvVL%èz_åÞ½¶öSDG=K‘_ýî—¿ýõïY€:”CÅ(8¨ð…/XÁ fp‚µ€`OøÁ ŽÚA#GԖÞ­? Ð¢ {˜ÄñŸÂëžñÚ§¼Ãí¢ÒK¨—ªj=-ÝÓŒIUã]ÍQC€Þæž|3:~ ,cÉMfò“e(OYʬÀ*L¢ˆú£ ]öò—Áf1¹ g0˜Œ¶Lf5¯YÌfæ¡RŸËº3³ÿŠ1Œ_,UâUg:¡JþÇgUùyÇ|Ö( ‹';¥ Qöà…EÏ"¤@ŽŒ`?cÒ À+d”éMwúÓp£eIÞwº˜[èmõ¢ÖóUÑ`®Ý0µ¬IEkØšµ×Zd1i 4ÒÂ-âd'Dâ:Rî1éRà3zv´=íj£øÔ;œ³ªëlç`œƒÜå>G6ì3nsóáeÚ•­žâEBDª¢ÂjÿDo_Øß ½ÖkË0ipà¶3J?µèM|^42*1é%üxFø¢'îS7Õf•Ú,†[]Ø'ä°mÁ°fñx¬œåðà€}TÞrfmbQZ<Øûþ!` Q6Ç9©v¾ƒ_ñ˜PDˆ–dìÑ#ËR‚ æ1i2XB :Úð+‹<œXFWÏúÖå Þn³óÛ,^µÉîñµ¯ý 'èOÚÙ®vF |²…}êÛ?/ª`-÷ûßϬðýæ€7üß?tCËÇÿ²ˆŒé;,A­o+F ª£ˆ~aÑd8óŒ6ßùÏs›ãÞNµÙíÀ”)A ­w½–ÑÖ¿¾õMïR¬JLÛ½ ÷¹—íîý}-Dg"È€£s„„p”¾]<€%vd„:ŒúmžõŒ¤Oý YQqžÅŠëÓbÕÿaL ýùÑ~ÛÉüéw¿úOßþ]%hA† £S\AnÀ 4nG¢ÿÞÆ¨-G0È pÛHÏ—<Žü 0%0þæ¥À‚, t„®!êÞfÁ~Ä- Șú!GLU°ûÆN¼Ê.üÎnmðqDˆ®èŽŽ ‚fé¼gFâ! ^îm‚ ¢áGè ë‚Fëüárd ߯ ¡pãpgr0 µp ùã†ìEÀñ|ò*'G€|àmªa‚F¾Šó‚Æ·@GÞðmäÖbPÅf>Ä ý𽇮e€ø|ÆøJàG„¢!hè $H²Ï‚†àtd+ññþùdðôh0õqIQj¼p^è/hî/ÿv„ ì`‚FÞ!Š$}Æ¡OGl‘bp±¯0xJ1…ñjNñZ,}F9pG@ô(bVàâ¡Hp1hRpu¤}æ}£°pÁ1ç¥ÅèòT gÚûØà‚¦ò!Šä‚`Àg¨pGèÑ·® ­ÐQ2 …%(fÀ€äª rNUŠÁÜ®H |æµæpG.2#`#aÐõù°ò$QCrXD4€b.H¾a¶bh ÀHŒ€€#¦äGzò'þ)F(¤êS²)’AVòWhbLjV@ (¦¼+‹ (æárqGÄ’,#Æ,?ÅûÀ¯$Eñ)åò$£rW<ï (F Š$ @ˆG òÅH¦Í(¦ €€¤031Ûò¿oߣç²2².ë  SLÒqiD `à(¨A$Û%ôÁ˜êGPó\T“5S$åŒ$'Ó$-37‡3?Å ò\’!Ä 4!Új Öï3#Ûåµ´Á"›3b sWÜR2ï7us;G‘7¥%_ò\br&‹$6ÓÎ¥ú€º¤(¡þ]²HÜ>‡r6ÑŒ¸3?ÃÑ;e*k ]bÀHÊ¡Dë\ÀÎaOŽ Ú…-‹¤AõàAà,Cò>1K?54ù“PÆС]†iA¤B Úø»¤¨­]œÁ1‹ÄE/FeT)ËŠ)7tG¹°Cÿ„4Ó Ä…jäÁ3sd €ÚÅ nD(aá\0©ZH TJ3©J/Ôñ“G½T }ôO 2Ä…IŠ =Y€Î…ö@þ$ ÎÅ}(«HàTNÅ…Nå:m3;ãòKµvÂtOD4A\0سKÎA\ŽáÈàOŠÁ'ß“[.þ(ƒŒ¤RàRm%S÷2ßò6ÿ4PMupµKþ“[”ö"6SÄø!EBÅåЍKt•[xÕˆ¬ST±S<(óT‘lRUI>4D¹eD÷$>áP¹… l ÿ„FÅ%F÷¡E_”[¸5TiuTý4Y͵v¾!BáaˆÀl„ôU¥H÷d, Ä%ú`E(cà’²´KøÕ_©T\1”ÎÎõ`Gšía ò@U¥àLÿäˆl寡´JIàT¸EO»¤c?²†…OaQ6eœ  À ¦P7ÀV0AQ å`lÅ ª@¥æàSþ1hO|h…VS‡u\‹uŽ5evWð àalÁVdPþáÁVÄ –HŒöÁVˆHX»¤lÏöUÒ¶d‰µOU;Ÿ¶n÷Ä j& \V_ÄÒÀVÈÜmOîá”ÀV à tO\ôl…܈qÀq_ráViå–iéÖn9H2ÀI á_ÚžAUâÕHD Tàl¥œôO,±_UeJ7iOb÷Uh÷r Ü:·w¥jF>Äá»ìÀaåb‰¡g'aŠðälPHŽÉcUå˜ÆjOª÷U°×XLVG}7|dfa+þ% fIeþfI`Q&@ä@U®j·g6T…žì‰Rï7ëÉ{ãödÅw€g¤¶Æ€x¯¥j‹àø!8‚%ø rkEÜ JHe€¡N…mU…ˆ*Q@˜TD€1W€ x…$QeKøÖ÷hkpÿD€¡t@ rx‡u¸‡yø‡•àÜ@ ÅE1@U,·ˆàˆI%‰ –K3”…¥¸A˜à€c‹ˆxXv€"¸¸‹½ø‹»¸6¶K´–†Õ8ÙxÝx^@h˜P<íüáŽñ8õxý¡…êwOꘙý…wõ¦8‘ÿÃøh+uSê’%9’)þy’-™’F†e+{ÿÄ}4¶89i9¹”Ó£Šk‹”À”s¤\ù•a9–e–ǸKfù–q¹jyK—òYY‘³ƒÃºê—§ø{}™˜Yxè†ÃÊ`•‘y…¹KŸy…ƒ¹Ãêgš8š£›8jâ&^á’ v¢'|ƒ¹¹wµÙ`ÓyŠ ¨¥xyžY˜…\ˆž XžŸ Øžù9›|ÿ¹si ÃWŸIÙ }· ºs.ºw:¢ëö¡I•¢97œ0º¢ú˜7e5ú£SÖ¢ËU¤–¡LaIznK5¥y¥]Ú\WZs[:¦54«l:YgºiszCþqº§Mu§7¨¹³§—¨¹S¨k©-Ó¨™úK•ú©Õ©¥zG£ºª½´~«7ôª¹zCµzl¿ú)½z¬ó“:Õ¬“º£¥Y­·­Ë­-³¬åÚ2'eoëz.é:¯åò®ùZ¯Ùz›ÿZ.õ²x°r¯% û°[û±2À™%;±›/%)Û²7²3{ž?[ ;{´2²M;{ ;µµ];¶)¶e»¶š¶m;·á·u»·§™·};¸Y¸…»¸‹9´÷Ù¸•™‰{¹[‘;¡Ÿ{º;…šº±Ûw›;»¹[§£¢»;¼9W¨IÀÌûþ¼Ñ;½Õ{½Ù»½Ýû½á;¾å{¾é»¾íû¾ñ;¿õ{¿ù»¿ýû¿<À|À ¼Àû›¾û6?yÁ¼ÁüÁ!<Â%|Â)¼Â-üÂ1<Ã5|Ã9œÃ­{B€€ D|ÄI¼ÄMüÄQ<ÅU|ÅY¼Å]üÅa<Æe|Æi¼ÆmüÆq<Çu|Çy¼Ç}üÇ<È{¼òzyÒŒüÈ‘<É•|É™¼ÉüÉ¡<Ê¥\NÈuÊ­üʱ<˵|˹¼Ë½üË«üËÅ|ÌɼÌÍüÌÑ<ÍÛ%ÌÕ¼ÍÝüÍá<Îå|Î_…ÍéüÎñ<Ïõ|Ïù|Éí¼Ï=Ð}Ð }Ïÿ¼Ð=Ñ}ÑÝɽÑ!Z=Ò%}Ò)=G+ýÒ1=Ó5Ñ}Ó=ýÓA=Ô±¼ÓE½ÔMýÔQý\H=ÕY½Õ]ýÕ#3sa}Öi½Ö?}Õm=×u}×½Ã}ý×=Ø…}؉½ØýØ‘=Ù5< ;mod_perl-2.0.9/docs/user/handlers/bucket_brigades.png0000644€ÿÿÿÿ00010010000006361711727205032023044 0ustar ????????None‰PNG  IHDRl²Ö+°sBITÛáOà pHYsÐй‹çŸ IDATxœìÝw\Ùú0ð“Ð{GÄŽ,ØV°£‹mUÖÞQVî V¶XV,+`A½vÛêêÚñÚQÅ‚Jo ¢HQŠB òþqÞ;¿\@H&g& <ß?òI™yÎJžœ™3ç Zx![[[gggEgpÉ‘#Gx!OOÏÇ+:€Kx<_Ñ9\E  Š(@Q€&(¢MPDš ˆ4Ah‚" ÐE  Š(@Q€&(¢MʲîðÏ?ÿDDD0‘ ÐL¬\¹RGGGªM===ÅRóóóc6q@Ñrss›,ˆˆFO{ðà‰‰ Ñ„ÅÛ·oßþýû¥Ü˜f511133£·/ÐlI{!‹Ú ˆ4Ah‚" ÐE  Š(@Q€&(¢MPDš ˆÀ%%%ŠNÐ(¢pÀÆ=z¤è,uÑœ;ÀšÜÜÜÓ§O¿zõê?ÿù¢süè‰ÐÜíÚµK(FFFBg€æŠ(Íî†âûŠMPQš5Ü Å÷¡3 @sE€æK²е€Î¨X,‹ÅÕÕÕ555•••"‘¨¬¬¬ªªª¸¸X(~úô©²²²   ¼¼üÇeeeìgxøðaww÷Ý»wïÚµkÓ¦M999ì瀅‡‡¯\¹²‘W—-[&Oü°°°Fâ×qøðayÚj©``7lܸ199ùüùóc^¹råÌ™3666ZZZ«V­RUU•f¯Ã‡§¥¥ñxvìØk×®7îêÕ«&L¸råÊwß}wñâÅÉ“'_¸páûï¿?wîÜÔ©SÿüóÏéÓ§Ÿ>}zÖ¬Y§Nš={öÉ“'çÎ{òäÉùóçŸ>}zΜ9gΜ™3gÎÙ³ggÍšõ×_MŸ>ýÂ… S§N½té’»»ûÕ«W'OžŸ?zôh„««+BhÔ¨Q!üW4lØ0„ÐСCBC† A¹¸¸°ÿ6ëxûö­¦¦&¾ÿîÝ»àà`}}ýòòòáÇ÷èÑcÑ¢E;wÖÑÑ‹ÅJJJ;wž:u*BH$íÝ»W$‰ÅbeeeŸ]»vÅÅÅùùùuíÚuÏž=>ô÷÷ïÚµk˜ƒ®©©9pà@uuuuuµŠŠŠX,n$½ÚÚÚýû÷WTTÔÔÔðùü+VÜ¿ÿÖ­[AAA¡'N$$$àûåååW¯^ÕÓÓ+..ŽŽŽÆÿÅOOO“õë׫««×O !tðàÁÈÈH¼±³³sŸ>}B>,**âóùŸ?މ‰Ùµkù_@³E”¾uëÖ•””ìÚµ«¤¤D(ª©©):#ܺukÆŒ:::¡®]»æååI³×Õ«W©Ã‰ ,øù矡ˆ2§~7STgÔÆÆ!d``€ÒÓÓCéêê"„´µµBZZZ! „þ_À·***!%%%–³•SVVÖîÝ»###¿ýöÛ%K–à'÷ìÙãïïß—¿¿¿£££ŸŸŸ’’ÒÆ×­[·{÷n¼eHHÈ÷ßoii‰ÊÎÎ>zô¨¯¯ïÖ­[»v튲°°øý÷ßñýú1/\¸0qâD+++œÆÚµkÉ3!!aË–-:t@ÿ­ñ^^^ÉÉÉøÕùóçS)ÉÝ A¥ïÔ©S%%%¿þú+BH(^¼xÑËË ¿T¿ºÔÖÖâ;¿ÿþûèÑ£©-%‡ QÛPx<^“i˜ššRW™TTTøúú.]º´]»vRîR[[[^^ŽÇY…B‘HD£]Фƻ¡tF™³dÉê<(BhÖ¬YøŽ©©éš5k$·¼xñ"¾ƒïà[„²²rÓ‡Ø?üPç™ú1BR^¸2jÔ¨¢RGÅ$ijjþüóÏužtuuÅÅO__Ÿz/ ¦„rsssss“|fÓ¦MÒäÙ²Áu¢4•———””;vÌßßßßßÿìÙ³>¤^ÍËË;qâõ088˜ú"YXXHuSRR$/Asrr:uêõ°¨¨èìÙ³MfÒ§OŸ3gÎÈšFFÆ´iÓ/^ŒÏv”––ÖÙÀÇÇgúôéu>Ê'Mš‚ï?~|üøñ²¶ š$M7k׌ÀuÐ¥iÙ²eeeeøË]PPPnnîºuë¶lÙ‚êÞ½»’’’¶¶¶P(üæ›oƇwœ?þ²eË455+++õõõËÊÊÖ®]»zõjƒ9sæ=zÔËËK___]]ÝÜÜ|Þ¼yx¯-[¶DEE]¾|yòäÉ—.]ŠŠŠÚ²e˺uëB+V¬8|øð²eË´´´444LMM‡ òµ”iÓ¦µk×îܹsçÎC½}ûß¡$&&VWWKŽ>|x\\ÜŠ+ø|~çÎñu€,iº¡tFP8BÈÓÓSú©(6nÜèçç—ššjffÆdbÜö믿Ò;Ä Z¹êêj//¯:ÇÉE"QAA²²²©©iíû÷ïO››‹‡†5‚ÇãAO€fDEEåèÑ£už|ùòåÀmllnÞ¼©¬_çDÉÛ¸qcdd¤¯¯ï;w AO”¼ 60= €æz¢MPDš ˆ4Ah‚" ÐEÐJ]¸paÇŽ»ví¢¦mž(›ì–u¤¥¥íÞ½[rJí…‡‡K9¿îׄ……5Ù EúÙxZ!(¢€ÖèéÓ§êêê«W¯^±b…’’Ò‹/šÜ/ˆ& é·¬ÃÚÚzùòåÔz¢_3räHé×h««k“­P***äi«eƒëDɈ‹‹«3ýl34mÚ´¿þú‹‰È111çÏŸg"8hâââ>|ˆ—÷¢n¹#ù!ÔøŽ¡Ÿ_¶l™ƒƒo'22rõêÕøþ¤I“‚‚‚ðʾLOO=zô“'O455W®\©¬¬œ––†—û¥&ý/)) ÒÕÕýòåKNNNÏž=gÏžmll\K„Б#G>|hii©¥¥åììŒ'.((رc‡‘‘‘P(üöÛo%•Fmmíþýû+**jjjø|þŠ+îß¿ëÖ-¼’̉'ðýòòò«W¯êééGGGïܹS2ާ§§‰‰ÉúõëÕÕÕß½{¬¯¯_^^>|øðÁƒãHdd$ÞØÙÙ¹OŸ>¡‡ñùüÏŸ?ÇÄÄìÚµ‹Îï EhEôرc!!!...!‘HTZZúÓO?uìØQž˜¿üò‹¯¯/©9ë¥$gòÔ ºÄýòË/Ò\TQQQXXÈãñø|>u+ùPEE¥Î3ÔC„Ð×vl|ƒ6mÚ0ôv”•ÿçÓZ£×ËËkÉ’%ÕÕÕ~~~Ô«ÖÖÖÖÖÖ’ë€?~|ÅŠººº`Ù²eÔÂgõ·Dyzz¾~ýzÓ¦M***;wîÄEÔÔÔtÛ¶mxƒ   Y‹hBB–-[:tè€ÂÅÏËË+99¿:þ|jqâ“'O.\¸¯$QgåàÐÐÐyóæQkìÙ³Çßßoéïïïè設­íåå% ë¬ìvïÞ½Y³fuéÒ!Ô«W/™2oaZc]¸paRR5A|yyù¯¿þºgÏ…$S^^.Óör&O-&€¬8pà@EgALæ%'ý·±±iò?¥¶¶VWW!¤««kgg×dsæææ***H¢Zçç燄„à…¯ssseÍßÎÎWP„PûöíYù§²²’Z‹i„ ÔóiiiŸ>}’<·š••E•ÿÊÊÊœœœ¯­µjÕª+W®\¾|Y(6¸¦iëÑ‹h™™™øŸ£KæååýûßÿÎÊÊ’\ÜñÆ‘‘‘<O$ñx¼ÚÚÚíÛ·KF ݰaäI“¨™ÿª««÷ìÙSPP€ª¬¬tss3f ~iãÆQQQÔ„Áƒ;VžäýýýAvvö¯¿þzôèQuuuü$Bèßÿþ÷‡²³³\«/åÆçó bbbºuë†WgC…„„dddˆÅâ²²²¹sçâC^ØÕ«W=z¤ªªZQQ1tèPêùFÞòóçÏ/]º¤ªªZUUU[[[\\ c€B|óÍ77nÜÀÿq¡¡¡²®(Çãñ®®nQQQJJ 6mÚ¤££ƒh- ›”””••…Ïkfeeihh „Äb1~µªªêË—/TªEEEúúúu"X[[/]ºtïÞ½øc¤_¿~ÞÞÞT™oD\\uXkëÖ­ 5ÿ£•Ñœœ\º £¢¢$ÏeR‡%ÍÌ̶nÝ*9ÊŸê z%%%«V­’ +âââ®^½J}CDíÛ·oÆŒøáž={†×åÞ°aCqq±¬‹¦5’<~~Ú´igÏž TUU¥^òññA_4xòäI;;;ü®oܸþûï¿S¯zxxà;b±ØÇLJ*¢aaa?~¤¾C„„„¤¥¥5ù–9rðàA|$M,:tH¦÷) ¸páÂöíÛ•••-,,¨2°wï^ê »»»¥¥%BèàÁƒB¡ðéÓ§B¡°}ûö“&MZ¸páŽ;tttø|¾­­-¶þ–¡C‡EFF.Z´H[[;**êÌ™3³fÍ8pà¾}û444ªªªbcc?~ühllŒwÇ P»×wçÎ ãÇkiiáCßø¼S§N»víªªª***z÷î]^^ž™™™§§çÞ½{ÕÕÕ«ªªÊÊÊ||| ò²²”••,X°páBWWWOOÏùó窩©áþ±»»»¡¡!BÈÚÚzçÎJJJ"‘húôé–––aaa‰‰‰B¡°´´ÔÕÕ•ÁßS³×J‹¨¥¥%UºÁ?þ¸mÛ¶¶mÛ6¾WXXuš!¤££#Ù‹úøñãôéÓOŸ>ÿì(7oÞÄ}2L$©©©áŠÂPò–––2g‹‹£ÆŒ;öÒ¥K’Ù¿yóFEE…ÏççååQ/ýý÷ß’#<<<¤:ÔÈ[vvvvvv®­­ÍÏψˆØ¶m[ýo8áúõë¯_¿.--…¡­\'ŠBÏž=³¶¶¦RC ²³³srr¨çœœN:E=,**¢¾T"„tuu;vìèíí½yófÉA }úô9sæÌך.--­_›åIž†>}úPKŸÞºuëýû÷ÔK………T§9%%Eò§áêêzüøqêá±cǨÁ¼eÜEæóùmÛ¶4i’d‡n7nÜòåË×­[çèè¨è\€Â´Æžè±cÇ$‡óTVVÚÛÛKŽÒþæ›o|||455544JJJÖ¯_¿zõj==½9sæ=zÔËËK___]]ÝÜÜ|Þ¼yx—€€€ììl„………‰‰É”)S €›X±bÅáÇ—-[¦¥¥¥¡¡ajj:dÈjÌÛ÷ßïíí­¯¯¯ªªª§§7sæLSSSÚÉoذ¡ªªêÑ£GxƒÙ³gÛÛÛã—üüü„B!õ’®®.döìÙ{÷î ‰DVVV’C çÏŸ¿lÙ2MMÍÊÊJ}}ý²²²µk×â1G£G¾råÊO?ý¤¢¢"ºwïnhh¸uëÖ5kÖ4ò–ß¿¿eË|q[UU>‘—™™‰úøñ£¢ÔÅCyzzJ?BrãÆ~~~©©©fffL&fåÊ•ømÐLDFFŽ?ÞÉÉ),,LѹÐòäææš››7¾%ǃùàK3À° ÿFêLhàßüGŽIOOÿòå Œ»)AÿŸ§§§¢SŽÃ¹MPDš ˆ4Ah‚" h¥<¸{÷nww÷Ý»wKÎÆÅYW+ od–ÍððpÉ%Ìh “~`Xj©0: •§OŸVUUáŶjkkÅb±¶¶vƒK)EDDˆÅb¼uÇÀÀ Á? CCC%·ÇŒ›œÑZÔ¤ÐMNø.¿ŠŠ ™¶9rdRRR#¯ÆÅÅÉ“«««ô+¸Éš|«E •   ¡Pˆ]àóù<¯k×® Ñ/_¾\¹r…Çãáͨ;:th°ˆ …ÂW¯^In)d~‰#GŽ<|øÐÒÒRKKËÙÙyÈ!¡‡ñùüÏŸ?ÇÄÄàUÞ½{¬¯¯_^^>|øðÁƒ#„<˜žž>zôè'Ožhjj®\¹RYYùàÁƒÔòjÎÎÎ}úôip÷šššTWWWWW«¨¨P‹ƒ6¨¶¶vÿþýxM>Ÿ¿bÅŠû÷ïߺu O7vâĉ„„|¿¼¼üêÕ«zzzÅÅÅÑÑÑ’‹/!„<==MLLÖ¯_¯®®þµwT?ù ­Q€TΟ?/å–;vIž[ýÚ;ª¯ÁHëEš7gÎ|ëÖ­ @õë×ÏÛÛ›ö\ÓõwüøqNNŽ¥¥%B('''11±‘Ý“’’²²²¨n«††Bˆ:\UUõåË|ŸÇãéëë׉`mm½téÒ½{÷zxxèêêÊôŽü´NPD­ÔÁƒ…B!>áçîסC‡"##-Z¤­­uæÌ™Y³f………%&& …ÂÒÒRê´îüùóÕÔÔTUUÕÔÔÜÝÝ ÷îÝKA¤b"„¬­­wîÜ©¤¤$‰¦OŸniiY÷yóæíÛ·O,WWW MMÍððð‘#GÖÏüÎ;Ç×ÒÒÂçñª‚:uÚµkWUUUQQÑ»wïòòòÌÌÌ<==÷îÝ«®®^UUUVVæããchh–••¥¬¬¼`Á‚… ºººzzz6øŽL¾ÁHëK¡ÐÜ=yòÄÍÍmàÀ7oÞTt.´|°À(¢4wøª’Æ/x(Q€&(¢MPDš ˆ4Ah‚" ÐE  Š(@#EtÛ¶mŸ>}b"2Ð|0RDcccÝÜÜrss™4LÎMKK3fLzz:Cñ…cðœhNNŽ››[ll,sM Ä`m×®ÝÇ'L˜ðàÁæZ…Á"ºgÏžY³f•––~ÿý÷ƒ š0aÂ?ÿüÃ\sË” ­¬|êÔ)¼Ô{jj*B¨  ÀÔÔ´Îfëׯwrrb. €! Q„ŸÏÿ÷¿ÿýêÕ«°°0„ЫW¯^½zUg¸G1[D1\DùåWWWêùµk×>yòäåË—ºººÔ“xýáÆÙ¦å5$ n½#®7¤¬¬Ü®]»:ÛÐX[[$ɺ €lQŠ­­í°aè‡ÆÆÆ¡7²™¬ÑÕÕŠÎÀ V‹hƒlmm ¨‡Ò|O'²MËkHÜzGŒ6”žž.‰ºvíª¬¬ÌPC¥¥¥u¶¡qD¡¶¶:£4OlQêÿ? àĉÔ󉉉¡ß~ûm̘1,¤€$›üüüÿüç?mÚ´Qt.MˆŠŠ3f ‘oQ²/¢éééÄ÷SSSñ0]вýý÷ßiiiÞÞÞŠN˜Ål3fLAA~¸bÅ És¢˜£9öõìÙ³[·nŠÎÇ`ŒŒEgÌ‚ž(`„ŒÎ´xPD#>þ¼yóæ'N0ׄP(|ÿþ=íÝkjjBYYYeeeô"Áà)Z9(¢€æææëׯg´‰ÂÂÂÞ½{ËdÔ¨Q´÷={öì˜1cäLÞ9Œ> IDAT@x–üf>¡?­QИ   ‡øøxYomll~úé§={öÐØßæçç6’›¥¥¥±±ñÇ---ÕÔÔXû™ˆÅâ7oÞ „YkÐ~ü˜™™Édj!$‹qµ†" À ˆ‚&þôÓOxüÓ222–/_þÛo¿É´Î…#ºÔ¨"|I+@Mh׮ݾ}û|}}YhK(9rdóæÍ2íÅÚiQ8– ¨Š(h‚¡¡áÂ… ·lÙÂB[ÑÑѳfÍzýúµL{±VDñ…4PD(¢  æææ/^´µµŒ6T\\Ü¥K—{÷îuëÖM¦Yî‰â‹j-€P(”3QдѣGGDDèèè0ÚJqqñ¥K—.\(ëŽxlѧOŸÞ¾}ËDbŒ* …yðàÁä E4M$M:u÷îÝŒ¶òæÍ›¹sçÒû›f¡3úúõëâââ¶mÛššš2× €OŸ>1cFEE…œq ˆ‚¦ÙÛÛŸ8qÂÇLJÑVŠŠŠ:Ac_Š(Œ* Åˆ‰‰™6m‘¥5`)4Ð4}}ýyóæ•––&%%1×Ê«W¯V®\IïŒ#Q€”ÜÝÝI ò€ž(hš¡¡áŽ;âââjjjjB,¬_¿žÇãÑØ*¢b±˜tjÿŸ‹(þ™0÷Öh=RSS§L™òåËmmm"¡ˆ‚¦©¨¨\¼xQSSóÙ³g 5‘˜˜Ø¡C‡}ûöI?W‘$sss“ÏŸ?34oŒ*€ÓÁ¢E‹¦OŸþí·ß~üøqüøñË—/'穸»»oÛ¶Mþ“ð_ÃçóSRRŠ‹‹—.]J/‚££ã;w¢££;vìH67„Pzz:Œ*€+nß¾}ýúuÉg*++/]º„ﻺº^¸paÛ¶mDÚ‚" ¤òéÓ']]Ý9sæ3ÿŸþéÛ·ïðáÃiG Š¨»»;ÁÄ0¸BILLÐýµ§:é}ŠÉú|vI…m|3)߬œ­íÍ2ô¦¤|³Äß”LN²î.'GGÇ àûùùù¤N‚ÖEH…Çã=ztÀ€€xE_»vÍÉɉv|²  àíÛ·òãújkkccc‘¢‹hQQÑÍ›7å‰O*…¿S߆ëÜùÚCJMM Š(ÖÝ»wOŸ>=cÆ ²‘ÃÂÂÊËËçÌ™#gGGǰ°°èèh²EÏU„ +«®]»úùù5¾Í׺à ??ßÊÊ }ýã©ÎCzŸbøNBBÂæÍ›{öì¹aÆÆw¯Ó.½Öeݽ‘7{áÂ…}ûöM:uéÒ¥r¶þµ7KüM:u* `Þ¼y¿þúk“o–ø›’éÏ ß9tèÐúõë—,Y²eË–Æw§mûöí[·n}òäÉÎ;ñ3%%%D"×EHkÆŒk×®MKK#ÙÆÆ&%%åÇÖÖÖòÄ¡Šè÷ßO*7Ô<Žå"„ôõõÝÜÜ›ƒ”TTTBòŒSˆG!„ŒŒŒzôè¡è\¤…G*hjjre™[%%%„ÇÃw˜^çÉW¯^•””œ Š(–@ PQQ™>}ú׆½Ñ¶sçN{{ûþýûˇ¡y‹šIH©_¿~?þø£ä3åååÇGŒ3æï¿ÿ&ÕQ ­öíÛWWWgddTTThhhŒìææ¡ªª*gÉy‹Ž-‚"ÚzÀäP-Ã!C† "ùLii©’’Riiéýû÷?~}J$2LûdpþüùÈÈH²g2ºtéâââBj2hâW‹¦§§ ¼d)©˜EéСÕ+WÌÌÌä_Žƒ" dÚ¹sçÛ·oŒ¹mÛ¶/^ôéÓ‡H4|µ(ÁÓ¢p,—Îõ(ÜÍH¯K—.W®\!õµŠ(Á¤I“A×®] Æ\¼x±­­-Ï)?âc‹ ˆ‚fŽs…¿9$lccséÒ%}}}ùCA2àóù&&&Û·o'µ&Zaaá’%Kª««-,,ˆÄÕÏ[D$ QZ¤=z\ºtIþ©La`’’RFFFZZZNNNûöí娫«»víÚÔÔTùCafffmÚ´ÉÏÏóæMçÎåŒFÍUäàà@"»Ö¢9t5èán怆޽{÷ìÙSΠвY¿~ýòåË322ˆD;|øðîÝ»‰Ôc Á#º0ª4œ+üÍ*aeey{’PDl¶lÙräÈRÛæÌ™ãééI{å–,¢p,—žfõ))îfŠ(MZZÚìÙ³IÜ9räéÓ§›mO_*E4gœ+üœK¸qpNÈÆÖÖ6<<üþýû@þsò·nݺrå ÙeJqÍ»{÷®ü³7` _‹»…}èÐ’@2›?¾H$ŠŸ7oÞõë×ÇGïö—_~ÉÈȘ={6Ùå?©±E¤ªŽüCZîV}îfŠ(Ù¹s碣£ýýýGõ÷ß÷îݛޭ@ 8}út^^ñ ÷Eä–g€ œ+üœK¸qPD–––^^^rÞ.]º´C‡:t ž”=; ˆ:Ú´iƒ/”ÿ4Oׯ_ £·o~~>Bèõë×>>>´ ¢wùÁãÇ è5š€zóæÍÕ«WéEÐÐÐ=z4½}A4 ¼¼ü?þ'B~~>íVVV´/à»|ùrHH½}±{÷îÝ»wÞ¾ƒ ¢QD9Wø9—0s ˆ€Ç$kkkïÚµ‹Ív#""NŸ>-ÏQ8s333ry5->>þÕ«Wô2ç\áç\ÂÌ" h@çÎuttJJJ&NœÈæ„MIIIH¾ËŠpÓÑÑù믿ˆ¥%…É“'¿zõŠ^æœ+üœK˜9PD àóù=zôxüøqttô˜1cXkWþ .ºu릡¡ñúõëââb===r©5Ažù­8Wø9—0s`Æ"@Ãð%ÁuåšTSS‡ä›ñ_EEÅÎÎN,ÇÄÄK­ YYY:::ô–=,üÄskíÂϹ„™EÐ0â+œ7éåË—eeeíÛ·744”'ñee›„ÛêÙ³'½y²8Wø9—0s ˆ¦¨R$ÿ/\þñ‘avÈŸ9ç ?çfH3JЬà±EYYY´/fþ””ÿŒ—¢>ßåÉœs…Ÿs 3Š( axlb±‘:ã…ÏØedd‘È«iògιÂϹ„EðUl~PâQE<Oþ®†²²²½½=kgì ²³³uuu;uêD;ç ?çfQÀW±9¶*²²²"²H;›å·Ò£GyÎÕq®ðs.a†@|û¥ˆÔ/.fιÂϹ„™ÀT6%%% E°¦S§NºººÙÙÙ,Œ-ÂCTHñbóóTæœ+üœK˜ LÑk×®ùûû3À6Ç‘6Âæ;.*&Rø9—0ìoÛ¶mõêÕµµµÌ5`;óQ£ŠzöìI$ uÆŽéÌóóósrrtuu;vì(g(Î~Î%Ìf.‡„„,^¼¸ªªŠÑVhÙðãb±X!­³3¶(55µ¼¼¼}ûöDFaìdNpÎ~Î%ÌÆÏÐ^¾|yæÌ™åååL7`>dÇô5õLœñbç`#ÙÌ9Wø9—0qÌ&äììl``p÷îÝI“&åååUTT…BF[…Çåäääçç3× ëØ,¢ÜE°ðs.aâ˜-¢]»v}úôi‡ž={fgggnn¾`Á‚Šzàx/ÍŸÏÇç)ý dâ:zkkkMMÍ7oÞ|ùò…`Ø:ÈfιÂϹ„‰c¼klmm‰›#„nݺe^ÏÊ•+™N@Óc‹D"©¹Š$±0>W§§§GjÎ~Î%LÇ—-,,¨?%%%M ªªª,$Ó罨QEúúúd#3ÝO§Š{ôèÉs…Ÿs §ÌN3jjjøÎ˜1c®_¿N=ìØ1ØØØ 6ÔÙ¥ñ?Jæ^U`ÓÍ616Ýl£½»®®.þd—~´mFF†”[2„éRÄ\?ƒÌ‰‡zþüyttôˆ#†¥/üœK˜,–ŠhãRRRRRRlèÔ©Svvvuuµ¢‘AÇŽõôôðØ¢6mÚÏÜ/¦‡ãÌ{÷îM0&ç ?ç&‹í"ZSS#y¹ þ(éÕ«×wß}WgËÆ¿§Óxõþýû>6lØàÁƒO’xÓò¿fccÓ®];…$Fc÷ÜÜÜÊÊJ¼}³J¬ÁWŸ>}êä䤤¤ÄBÓÆÆÆ×®]‰DÒ­®¨¨PlgÏ[íææF<>sŸ’øŒÝÛ·o¿|ùBð T sWæp¨ðs.a²X*¢ÔTº·oßÖÒÒªóªÓ9”——?|øpРA\Ç4wî\mmmE'"­”””¼¼¼áÇ+:©9rdþüù¬¡—õ/0::zäÈ‘ %#%‡ÈÈÈ/^/¢"‘(>>žø¨"LYY¹{÷îÏž=câg˜———››K|]Î~Î%L‹ÒÒÒ¨©¼”””4êQQQa! Ü3hžGÕ›´gÏ6¿•_EEEYY™¢³V~~¾¢æâ æÆáQE:t >ªcî`#õáNöS~†¦b¢ðs.a²/¢±±±ÎÎΙ™™ÊÊÊ&Lx_Ï®]»˜Nƒë–-[Ö§OEg! ½655m†3¡4+,”"â‘1.fιÂϹ„ böƒ#))iðàÁ#FŒx÷îÝû÷ï;Æh‹-ÕÞ½{Ÿ={¦è,dPYYYZZªè,¤=Ñ&áy‹rssóòòÈFfú:z¦?ߙšÂϹ„ b¶ˆ>{ö¬¼¼|òäÉþù§¦¦&£mµl>>>NNNŠÎBÚÚÚÔuMÍôD›D³$þA‰¤0÷)I±ûüù3ÙÈÜí‰/üœK˜ Æ?8<<<‚ƒƒ9td¯y:pàÀ“'O… ªªª 'ÚÂ0QD©QEÌMF£¤¤„ÏØ‘ àǹ¹¹ ÍÀ¹ÂϹ„ b¶ˆúúúîØ±¾ãËïÇ0`€¢³¦¦¦ººº¢³V›6mší—惉±E)))ø:T‚aë`¢ŸÄè¹:Î~Î%LSåÇã¬Y³†¡ø­ÍáÇ###… ª««©ëšš?âçùZ$&z¢ìô3˜¸‘‹ã¡-üœK˜¦®2e ‡N‰5?üð·~žÐmy:uꤧ§‡Ç™™™‰ÉÎ/&úÐ쌇âPáç\¤0ÕåÖ'~óòàÁEg!nõD])³Åàñxø‚o‚”ì|JvíÚUKK+33“à;¦3ç\áç\¤ÀÙJnX´h‘‹‹‹¢³††ôD[²‡ì«HuÆŽTæ>|xÿþ½žž^ÇŽ‰¬s…Ÿs “ÒŠŠ(§g,:qâÄýû÷… jjj¢³V3?'Šÿh›Ãøa²½ vFadË? çê8Wø9—0)­¨ˆrÚ‚ †ªè,d ¦¦Æ¡+ƒ¡'*%²c‹Øìg0TD‰DûÎ~Î%LQnøã?ÂÃÃ… jkk¹Õmý¼æ÷ß¿ÿáÃù£ás«ìœñ"ûùÎNæœ+üœK˜(¢Ü0gΆ¼eˆššš†††¢³ôD¥DvÞ"æÖ⮟±{ûöí§OŸäÆNæœ+üœK˜ˆf±(7hÒŸþijj:cÆ E'"-±XÌ­ž¨¢Sà ‡:t(99YÎP Ôˆ_¦á3vQQQ—.]’sÍ/_¾|øðA__¿C‡„²k˜dá722’3 …Ÿs E”fΜɭ‰ŸTUU9ÔmÛ¶-ôD¥„{7nܸqã†üÑ:wį̂"¬W¯^QQQ?üð‘h,œ«ã\áç\ÂD@å†óçÏëééÍž=[щHK,+: i½ÿ^Ñ)pÆ Aƒ–-[F*šµµ5©PMrvv~üø1©h£F"ªœ+üœKX~+¢ááá´?š_¾|‰JNN¾té½FFFŠ";mÚ4…ü1½zõJ__¿¨¨HÖ[²²²üü|ûâÛòòr™N‡ÐNUOOOYY™ÍT9­M›6~~~ŠÎ‚777777Eg!Î~Î%,?ŽÑãÇß¼ySž—/_¾|ù2½}ÝÝÝå)¢ùùù¿üòK@@[;;»›7ož;wŽ^„ Èzò©¬¬lÆ 3f̸ÿþ°aÃdº2dHDDDŸ>}hìk``¯­­}êÔ)R:thxxx¯^½ØIéq®ðs.aùq¬ˆ:::Þ¼y³S§Nýû÷g³ÝGeeeÉÓÛ¨®®~þüy\\œªªj||¼¬·AAAgÏž¥·ïäÉ“SRR,,,dÍY  2¤²²ÒÖÖ¶mÛ¶2ÝZXXÌœ9Sֽ𭖖ŸÏ···g'Ussó9sæ°–* %á!„<==>,å7nôóóKMM%5µLîܹ3uêÔ¡C‡²<}““Ó‹/nܸ1hÐ ÚA®]»¶{÷î³gÏ ‚=z$&&²pûèÑ£~ýúeeeÑ(¢QQQnnn>>>»ví¢ý®iX¹r¥‘‘ÑÌ™3 ¤Ü…C©Ò3bĈ޽{ß½{—¹VX```@@@nn®¹¹yã[òx<. øDÿîS[[ËZ£UUU‰‰‰|>_αøïÞ½óðð066vrrRWWgç–Çãîß¿ŸFÂŽŽŽÕÕÕS¦L‘ç]Ó0nÜ8Y/áPª€–„cEÔÄÄÄÜÜ\ ¼~ýšµF“’’„Baçεµµå‰ãêêúúõë³gÏ’JLmÛ¶­¨¨Xµj}ÕÔÔºuë¶`Á‚‚‚â‰}Mzzú±cÇìììdêÛq(U@K±"Š˜Yúµq¤®ù­¨¨077>|8‰¤¤uìØ1uuuÚß9>|^QQA6«F9òãDzîÈ¡T-Ѧ‘ZÓ®gÏžEEEÞÞÞ¬MÓZSS3mÚ4¡PاOz:4hР‡’M¬ÁÁÁ?0`€¬;r(U@‹ÁÕ"JvýôÆ‘š™Ïç‹D¢+V°vB÷ãÇ‹-²±±QV¦9 {éÒ¥oÞ¼¡1(‰¶)S¦8::Ò¸(–C©Z ®ÑØØXvJ©QEX¯^½Ž;&祮Òþùç“'OhG(..ÖÕÕýã?fÕˆÚÚÚ3f¤¥¥ÙÚÚʺ/‡R´Ü+¢&&& ==…扌*ÂTUU§OŸ.Ïu22yñâÅwß}wàÀÚŒŒŒ²³³çÏŸÏΙ?±XhllL£{Ç¡T-÷Š(b÷´(©¢˜µµõµk×|||ˆDk’®®nXX˜···cÆŒøøxy®Á8vìXfffii)ÁľfôèÑššš´wçPª€–z¢M [D 233'MšÄ±輼¼ &¤¦¦ÊycDD„‡‡GBB©Ä1{öì£GZYYÑÛC©Ê1fmP7­ÁóçωNQ|È!W¯^0a©æ¸ZD---srrÒÒÒlll˜h*êÖ­ÁQE˜³³ó÷ßÏèuúÕÕÕ·nÝ***š;w®üÑLLL¶lÙòäÉ“œœKKKùÖWSSóñãÇÐÐPÚÓübJÀ„ÀÀÀˆˆˆ_²³³»~ý:Ù+¼¹zN1D—‰¢Ç7nœ››ñÈ”gÏž¹»»O:•TÀ?þøãÍ›7"‘ˆTÀ:BCCµµµ_½z%(¥ `ˆ³³óäÿêׯ~rÁ‚D&p•Äá¯ÒŽŽŽ×¯_ŽŽž5kñ™+¢íÛ·?þ¼½½½X,fhæUmmíS§NõîÝ[]]H@ŸþùçÉ“' ]á:vìX@””$(¥*“W¯^ :´‘ ***rrrôõõÛ¶mK¯ ùÿ!Bó‰ÐLÒ`?žneÆ #FŒÀÏœ?~Ú´ir¦ñ5Ü.¢ˆ›=Q--­•+W^¼xñÍ›7LÔ}ûömaaáòåË圫¨NÌgÏž1÷‡øÝwߥ¦¦ž;wNþPJU&åååñññÒlöþý{ò NQFÇQ£ŠzôèA62æííýçŸ24'€’’RiiéíÛ·IÍ›0`@aaá… FE¼÷\[[{ëÖ­ÌÌL"ç*8”ªLºuëvøðáF6(//÷îžžž©©)½&ä¼ìêÏ?ÿ<~üøŒ3,X@;ˆü—~Ñ‹ðÏ?ÿüòË/C‡UTd#4“4ذ~ýú„„„ììì—/_âgýZÉá"J-zõêñ5™U„¥¦¦:4 `õêÕă߹sÇÔÔt̘1dÃÞ¼y³OŸ>B¡Ô!bÊ»wïºté2a„ãÇ È¡T¥§©©ÙäÊðd'™áÑæææ\œ†ÂÈÈ!Ô¥K—þýû+: |®ÁorL,ñÄáEˆÉ)˜;–‹ >¼²²râĉLïܹsfff~~>Ù°K–,ùüù3©‹«$iiiUWWœÅ‰C©Ȳ°°èú¿¨Q %Û·‹(s§E™˜fA’†††††ÆØ±c‰G®©©9|ø°Ác¹XFF†ºº:ל9sFEE…àï‘C©ÈÚ¿ÿ³ÿµk×®víÚéêêŠD¢iӦݾ}›`sPDFv-îú455SRR’““‰Ÿ­®®vqqaâg2tèP>ŸL<òðáë«« æPª¦=:!!áÝ»w^^^B¡p„ ¯_¿&œÛE”¡5Ñ„Barr2s£Š°   Mâ1Óà IDATMMâsèß»wïåË—LŒM‹Å¥¥¥LôžçÌ™£ªªªªªJ* ‡R°æ÷ß_¸pauuõ»wïHÅäv522j×®]ii)Ù+ߪªªºvíÊèÌÕ«WWTTо¤ïklll¬¬¬ ȆEÙØØ=z”ì)_¾| ÍÌÌ$8ˆC©XÃãñ¶oßNvjnQÄÌ]¦GaiiiêêêÄy~üø‘¡†?~tuuÅãI‰wqqùùçŸ ÆDœJÀ>Ÿ¿gÏwwwbIRîѾ}û …Â#F]mÁ‚ššš Më:`À€ÈÈÈ£GŒ©§§÷úõë   ‚1§R°IIIéàÁƒ¤–©h!E”ì™EvŠ¨ŠŠJ·nÝ~þùg‚‹Û¥¦¦˜ššêé鑊)‰ÇãõêÕkÒ¤Ic^ºtIWW766–`LÄ©T,SVV>~üx×®]åÅù"ŠÇÅÅÅÕÔÔ XYYÉè\E’ž>}zæÌ@@* ……ÅìÙ³™›{ÝÖÖ6--mæÌ™¤Fr‰D¢‘#G–––R3D“¡TìSRR277—?狨‘‘‘••Á±E ÕÕÕL*ÂöîÝûÝwßìFïÞ½ûòåËÝ»w'°>Ÿodd@êô§OŸÖ­[×½{wâ7r(UÐ࿆„-XKø8ÀQR§E™¾BTÒòåËÃÂÂtuuI\¸pá˜1c-ÿ:t¸zõ*‘hŸ>} züø1‘hup(UGµ„"Jvò?vNˆbŸ?îÑ£Çõë׉D‰D®®®>ìÒ¥ ‘€ 200ðññ5j‘hÉÉÉK–,i|^uÚ8”*€£ZB%;@—Í"jddôòåËñãÇ™ç–ÏçŸ>^$‘U„ÙÛÛ+++§¦¦–——“ŠÙ è†ÄNåóùïß¿wsscyNKmìeb¦uuuÆÁ4 ±SD§M›6qâÄÏŸ?Oœ8ñ·ß~ûã?"""Xh@›E”xgŽsºÐˆ¥Ð444N:µxñâ'NìÝ»!Ô³gÏE‹ÕÙ¬sç΃ b!@“8]‡zõêuæÌF“‡¹ŠÆÒz¢ÊÊÊÇŽ344 B%$$øøøÔÙfÖ¬YPDh&lllÔÕÕ_¿~]\\¬§§ÇDç*’ÄÂØ"<ª¨M›6fff̵š?öåæñx;wîÄEÔÊÊÊÕÕ•z)--íÁƒ¬eh’ŠŠŠ]LLLllìСC™h*²··WWW'¹{÷î***xl‘¦¦&ÙàË{ETR=‚ƒƒ©‡ÇŽ{ðàÁ•+Wîß¿þ;S¨äŸ¤ñjƒÏÈ™T2õ³b"²<ÉF&õî|Fá?·kp333³óçÏã‡Ò̈[\\Üä6LpttŒ‰‰‰ŽŽf¨ˆ2W‡ÔÔÔlllãââ:¾E`Š)¢ *//gzH: 7vìØ~ýú…††*:‘¦1=¶ˆÑ:äàà˜˜ E0J1E4;;ûèÑ£ÔÃG!„&Ož¼yóf$ñÝ\òKzý'i¼Š >|øðâÅ‹===éE&•Lƒ]FöÝ´iÓÇׯ_ïììÌNªòG zúôéÊ•+û÷ï/g2õcâ7røðᘘ˜~øºnì/!Ô®]»víÚµoß?l°/[ÇÛ·oýüüšÜŒ8¦Wçft9ë^½z>}š¡o0W °ZDoݺ…ï$$$,^¼¸Î«æææLç ¯¯222êÒ¥ Óm‘e``€êÒ¥‹“““¢s‘ÖéÓ§B’§À›³7nÄÄÄ 4h„ Œ6$ÓŸ_\\s™4‚ѱEååå©©©LŒ*Â[”‘‘QTTdff£Š{EôÀÞÞÞø~»víêŸe0`kÉpîÍHÓq€{{ûèè蘘˜aÆ‘ ŽGuïÞø¨"ÌÞÞž¹±EÐ 6ЍX,Þ¼yóo¿ýÆãñœœœlll<<bÌFÇA6ŠèåË—‹‹‹•””vïÞ={ölZl|J =æÆ±0gsc‹ ˆ Óþ«©©?~\á ææ-b¡á M|`ÌU$±QDµµµÏŸ??~üxÚ åÁN¤¹¢”8 ׯ_ ‹G©¨¨04ªc¨M*jÓ¦ ÙÈ€‹/¢FFF×®]sqqaº!qÊÊÊvvvb±866–`X<ª¨[·njjjÃÖagg§¢¢òòå˲²2‚aáX.Äl533 kVKÁ9Qd‚«Ùƒ¢8s£Š0555[[Ûšš²×1zy+àf‹èˆ#:uêÄh­” Lem%N&ÎéÂ2¢@çDA«Å¹ÂϹ„YÀĬ¬Õ!âß`T¨£ÕQø”@&ݺuÓÐÐÀ£iˆ¤FÙÛÛ ØâßðüMmÛ¶555%pZ«+¢Üå(„²²²½½=Õ“_\\\MM ££Š0;;;UUU‚c‹`T¨Š(`ç ?çfÙþÓsIÂó[EÔÑêŠ(|J +&Š(ksÈ®EEÔÑêŠ(@VLQÖêPïÞ½¡äaT¨Š(gp±͹œ9—0;¨±E_¾|‘3TYYk£Š0‚W¹¤§§Ã¨"P‡båp[ôâÅ‹_ýÕÒÒRžPyyy555vvv,Œ*¨±E=RV–ëïþýûº¡àµº" ] hèի׋/>L$›uÏ[?xð`"a𠉫EôùóçYYYõŸwrr²²²jdû—/_"„’““/]º$ÍöRÆ—^qq±H$ªÿ¼žž^ƒ_“©í…B!B¨´´ôÓ§OÒl/e|¤1uêT===RÑFŒA*”4ÆŽKðŸøÂj€Ó8ù©šŸŸ¿iÓ¦ÈÈÈú/>}ºgÏžõŸ?yòä™3g¨‡—/_¾|ù²ôÛKÆ—³ˆŽ7.))©þó±±± ~=6l˜äèü~øA¦í%ãwèÐAÖlÅbñçÏŸeÝ‹R§ðÓ ¦¦¦­­-ýöœK˜+úöíÛ·o_EgA“¯¯¯¯¯¯¢³-'‹è©S§"##;uêÔ¿ÿ:/µoß¾Á]X[[[ÿyRÛKiîܹIIIÚÚÚêêêu^úÚ7e}}}ccãúϓھq<oÀ€?~¤±/…*ü4,_¾|Æ ÒoϹ„œÆÉ"êè訪ª:gÎ???)wùñÇüñGé›hd{y&?³¶¶F-_¾|óæÍRî‚Ç2H¯‘íéeîààp÷îÝ ?£ŠŠŠD"óOœKÀ]œ,¢Ã‡LJÝ8gîܹ .´µµe¿iÚµßÑÑñîÝ»ÞÞÞ[·n%›RãÌÌÌòóóiÌkù„ì‰DÁÁÁ^^^rÆáäu¢JJJ¤æÂ–•œíZYYÙÙÙqkl0+a5);;;??ßÐÐÆñsÎ% `Ymmí¿þõ¯ÿüç?ò‡âdå4E•Úðð%R“KIžéU9—0€Mb±ØÇÇçÂ… D¢AM°°°011ùøñcff&kÊ33çn>t/qÈC,ûúú6xñ=PDAÓNœ&%9ç(ç\Âv¬]»6$$„`@(¢R©ªªjß¾ý¬Y³8×øðჯ¯ïµk×ä B|eã&Éyt”s õ÷ß_¸paÑ¢ETSSûõ×_IEæäè\¬¨¨H__Ÿ¶³²²ž?έ1A¡¨¨¨;vDGG»¸¸ÐÂrMÊÎÎ.((022¢=¯çòéÓ§Ç×yò—_~yÿþ=BHEE寿þ244ô÷÷'Ò‡‹è—/_þùçŸöíÛ³p ìÁº¢¢"mmm¡P¨¥¥E$`#ð2Šrž«c¹&ᆜIJJœK@JZZÚܹs|‰Çã>}zâĉ>$Õ‡熄„Lš4éôéÓ,´Ev؈¯¯¯ŠŠÊ­[·ˆDk‘ò‡ê|úô‰¡:ò~Î% ËØØx²<õŠŽŽÎÔ©SÉ6Äáž(›½ ²EÔÀÀÇtww'°¤2wppñâ xeE¤ðs.á&‰Åb¡P(ÏYy±X\]]™™©¬¬¬¤¤„C‰ÅbêN“%Ÿ—u_²¡$Ÿ¤¢ÉŸû¡H5'ýÏ¡PŠý{|X\\Œ²µµÅ«Œ`mÛ¶ÍËËcâ|‡‹(Ä[[[Ëç3Ø¥®ªªJLLäóù¤Ž×±Vþ³²² ŒŒÚµk'g¨^½z…‡‡s¨ðs.á&%&&š™™1Ú@V.¢&&&¹¹¹éééݺuc®¡ÄÄĪª*kkkR§0©ÙÄb1£#•å\áç\ÂMâñxªªªòüÁðx<±X, Û´i£§§‡Cñx<êN“%Ÿo|ãÚÚÚ¨¨(>Ÿ?pà@9C5øPòI*š<ñ«W¯º¹¹©©©ÉJʬˆdž››baa±xñâ&›#Õ®<¿Ä7oÞlÞ¼¹S§N6l3Tý‡)))kÖ¬)//Ç _b .I‡‹(BÈÑÑ177÷Å‹ŒÑ„„D´ŸannnbbRXX˜™™Ù±cGRaë#ØCâ\áç\ÂMêÑ£GDDÓ­RYYÙ¶m[UUÕëׯ+:øûûkkk3úÃ„ØØØSSÓeË–):©ÄÆÆnÞ¼YOOo„ ă«ªª"„¢££ëÏR^ùÿÚ»÷ ¨ÊÿàgwQ\a¹ˆÀª Èr±™Ø…H³¨q4Ñ5ó ]p‚Ñó–Õˆš•9ù 4dt"¼“9 c9“—ÀTÄ! D³Üu—›\dH.»üþ8¿/Ã,pÎóœ=Ï~߯?˜–Ï~ÚqΛçœÏyNG‡Õjuuu%øv qRí’š””d6›ß{ï=‚5¥Y'­\¹2##cÁ‚âKñÁ/Á¨©àg®a'£`s—¥ØØØÚÚZGw¢¨Õê°~FÅqœÕj‹‹kkk#øvl‡¨d§ìBBB”¦sN·zõjR/ÒôL|õÌPÃàpùùù¸ð̺¨¨¨â~bbb&L˜ V«/]º´xñb‚Ïc;D###SRRÝȈEEEŽ7ŽöÜïž¹Lb®ap¸_|ñÞ½{ŽîbĘ[÷KßðéÓ§oݺuåÊ­V{áÂñO@ëÅö5ÑñãÇïß¿_‚}‹ˆ?zeÞ¼y‰‰‰dkÒ&A&ñC:ãÇ'2¤Ã\ÃàpgΜ;v¬£»ZBCCsss.\x÷î]R5Ù^‰2Ñg¢•––Òûû‘ßµ€ø­D¬4ìL˜[ñâããoß¾íè.FŒ¹OÛ ó÷ò7ë…áš8q¢ŸŸ_SS½ó]dw-`®agÂÜa—““Ó¤œŒÁ`ÈÉÉÑh4Dª!DahŸ %~}‘¹†Á±V¬X!ñã܉`îO‡7}êÔ)"§î¢ötvvVVV:º ሟ1f.“˜kØi8ü()̉'¢££Ýň1÷iˡ᧟~zïÞ½âë8CˆÒ»¸øûᅦ„„<õÔS”êÓsúôi½^OöÙ³åL2™L ãÇ U“¹†Á±’““ ÝHdÒ¤Iâ‹°=KðÕét”êÓ{$êõë×oÞ¼YSSC¶,Õm€hlýÃ\ÃNCK ¾úê+²ÛÙHƒ¹O›¹†íp†•è­[·V­Zµ{÷nâ•i?⪮®îøñã4®ÁPê|„ ôFuhœe®á±xÄa±gŽãÖ¬Y“ŸŸïè.€%΢µµµüî»ïˆW¦={™••õꫯž:uŠxe>˜ißé ¥”IÌ5 ”žž>{ölGw1bÌýÉÂ\Ãv8Cˆö}&Á²V«µ¢¢B¥Réõz‚eûâ¿üª‘ £ÑØÐÐàëëKãZ¥ž9Ê!ÊPÃÎÑ£ä¦M›ØÚ1ŸÇܧÍ\Ãv8Ã5Qþ)Tf³ùÎ;ïñ*++³Ùl=ö½Lø5.ñ+vT¯ÕQÚôŸ^ð3×08PZZ¿S9À09ÃJ”£sÊN‚u†V«õ÷÷øð!Ùi¨vÞwT‡`YzÁÏ\ÃÎÑ¥ÆÖ­[i\^¡¹O›¹†í@ˆJ£ÑèõzÚ7Ñèœ-¥e.ø™kØi°x üä“OâããݰĩB”ìu¯åË——••%''¬ÙÍÍÍ­¬¬œ9s&Áš}1·îg®ap”;w=zÔÑ]Œs¯0×°ÎpM”ûïYµß~ûíŸþQ©TŽng(ÍŽÜ^¹¿¨¨¨óçÏ—––¾òÊ+¤jÒQ¶– ‹Åòã?Š,rèÐ!Á×ûgÏž(²IMMeëÂc.“˜kØ' QŸôôôçŸ^©$¹¶–àA+ÑÑÑ)))óæÍ£ýF~£ÑØØØèëëKd‘þ˜kX&¬Vë† DÙ¸q£àß-**ð[eeeƒAÀ×óçÏ·¶¶nß¾]X…âââÇÜÇÇG@ÛÍÍÍ>ð‹ÇY,Žã:;;ÅÜ=iҤѣGÿõÌ5L‰“„(ÇqË—/—àÁ¢ÄùùùíÚµ‹­Î‰oD{H‡¹†eB§Óyxx´´´,[¶LÊ¢---ÙÙÙnnn¡¡¡#ýÝîîîË—/ðÁ/^\µjU~~þˆ¾ž={6..îý÷ßð»k×®]·n]aa¡°={öì[o½%à{UVV žáP*•F£qD™Ä\Ô8Oˆ‚døQºººÊÊÊñiï Å\Ã2¡P("## V¬X1þ|ÉÞ÷Â… ÙÙÙz½^À™Õîî˜àà`¥R£V«GôÕÓÓóÙgŸéo©Õêgžy¦¥¥eåÊ•S¦LöÍÿsR*•ÁÁÁÂ*ÓÖÖVSS£ÓéFúh0æ¦! BðWKJJˆd’Oåd®a™àC´´´TÊs½ÙÅÅ%))éêÕ«=:~ü8ÇqÒ|]»ví‘#G^zé%Á—TÃÃÃÇŽÛÞÞ^\\!!!##ƒ|áã?###55µÿOß~ûí;vôÿ~ÿ×[­Öööö-[¶ˆ‰‚£:ÒÜ+Â\Ã2¡Óé<==«ªªjkkµZ­ïØÐÐ`4ÝÝÝLñâââ::: È6fß’%KÎ;'rûnzû<Æf³•••)•JƒÁ à×™k˜g Ñææf¥R9àJ?((hÀ󜃽~Ö¬Yäû³«££cÀÛÛÛGôz‚Æßß_«ÕÖÖÖŠ¿bµZ9ú™Ä\Ã2¡P( CAAAIIÉ‚ $xGþo”ˆˆÁ]\\4MDDÄÏ?ÿ,ÍMŸMMM[·n?~PP˜:TŸ!? ŠŠ «Õ*ìôs Óàl!ÊqÜÔ©S/^¼Hïõ”477/_¾|éÒ¥ýäêê:`XözwwwòýõuîÜ9R×_%È$æ–‰ÞÙ")CTÌÇ«R©L&SMMM]]4§ÜÕjõ›o¾yûöm‘uÂÃÃÝÜÜŒFcSS“4£:"?mæ¦Á C”]®®®®®®ô^OVVV–Íf#UM‚àg®a™àïä“lµAdldóæÍ………{÷î•&D;–——÷ú믋¬ÃêüòË/¥¥¥sæÌ!Ò›}ü™XÁŸ6s Ó€ÔjµZ­vt#À\Ã2!ñl‘¥ÆþóŸÆÆF~[ ,\¸ÐÍÍm̘1âKEEEI™Iâ?mæ&·¸€=ÁÁÁžžžÕÕÕ555´ß«¡¡Ád2‰™*â•——ÇÆÆæåå‘j̾eË–ååå………‰/%åUF›ÍV^^.rH‡¹†‰CˆÈcwëæ÷-â$9Pòo¡×ëEn‚m0ÊË˧OŸÞÚÚJ¨5{²²²"""ˆœá—2“nÞ¼iµZCBBÄtÎ\ÃÄ!D`‡(‘“u ,ÈÈÈhll_ʾŸ~ú)11Q©TyúEXX?ª#AçD>mæ&! Clß"‚GÉ“'O¾ûî»ÕÕÕâKÙ“––¦ÓéˆT“r "3\Ì5LB†ÀâJôÌ™3ü±˜}ø†)99yÛ¶mŸà+Ù¤¶þa®a²0 Cè-ª®®¦wÓH}}½ÉdÒh4"§ŠxK—.Õëõ7nÜ_ʾ\½z•àvNÒ¬û é0×0YX‰À …ó#¤¦Šx===ÉÉÉåååT²ššš|}}srrüüüHÕ”fT§¼¼œÔs “…€¡IpF—ìÉ:—“'ON›6íÎ;D ÈÛÛû?þ˜;w.Áš¡¡¡îîî´Gu^_d®a²¢04 NÙ?Jž8qâÒ¥Kü^Ç”|þùç3gÎ|øð!Ášü¨'ɧMäò3s “…€¡I¶%x”\½zõ¼yó¨N®_¿þ‡~xòÉ'É–•ìä9©O›¹† BˆÀÐ&OžìååUSSC馑úúúû÷ïk4‚ñ­©©ÉÉÉ¡º¿´Á`xùå—‰_¥£Ićt˜k˜ „( ö¾Ed§ŠxS¦LY¿~ý;wZZZHÕ쫳³³¢¢âèÑ£>>>d+ÓΤòòr›ÍêææF¤ s „€a‘ D‰ß˜™™ÙÝÝÝÕÕE¶,ïúõë£GÎÌÌ$þÔÒÞQ††²•yÄO2×0AQ~ä‡Ò=õ”qµfÍFSPP@¶,/,,Ìjµ&%%¯¬R©ôz=GùO‚™Ä\Ã!D`X¨ž²£tÃÝ»wkkk)m±k×®1cÆTUUÑ(NõÓæÿd!›IÌ5L B†%((ÈËË«¶¶–xl>þÆÄ/å¶¶¶¶µµ]ºt‰lÙ^ü¨ŽÉd">ªCéú"s “‚€á¢´oÕÝÌfsxx8ñË¢yyyjµúûï¿'[¶—R©¤4ªC)“˜k˜„( ÕÓ¹”Ž’3f̰X,$[vÊ”)4Fs{Q]÷Óø´™k˜„(€Üyyy-^¼866ÖÑpAAAÞÞÞdg‹êêê(Mñº»»Ç·hÑ"²e÷íÛçêêÚÔÔD¶l_4žÓÙ;¤Ã¯Éb®a"¢r`0ˆvì©‚]]]¹¹¹¹¹¹¤ ˆÆ¨Õ] ˜k˜„(€¬ñËPþ¿å°%>[$ÁRc̘1‹-Z¸p!©‚qqq´C”£öiÓ{´5s ‹‡µ¯¿þº÷Æ;“ÉtòäIÇöèíí]WWg±XÄWãëxxx‹¯6˜°°° .$$$*èççwåÊ•øøxRCöž"«ÕZQQAuH‡¹†ÅCˆÈW[[Û—_~Ù÷;iii6›ÍQýp¤÷-â‹ JSE'É/N·gÏž©S§Š/e±XvîܽuëVñÕìãGu®]»ö믿ÆÅʼn¬&A&1×°xQ™ÊÊÊðV³ÙœýÆoHÞÑÿ㎅……sæÌ!RP‚£¤··÷–-[´ZíáÇ›››½¼¼­®®Þ±cGXXížy‘‘‘×®]+))a%“˜kX$„(€µ··ïÛ·o°ŸîÞ½;11ÑQ‹Ñ   9sæº4ëââBi¯¢¾´ZíæÍ›SSS‹‹‹SSS?ýôSÁ_µZ­ÉdÊÈÈ ¡Ý6÷ß›¶mÛöᇊ,ÕÝÝ-Ás ‹„£C‡Ù¹cÝb±œ8q‚êÆ­ö:uÊQo-Œ¿¿¿¿¿ÿ„ :;;½½½Å|]µjÕ»Zÿ…_‡õôôôôôˆ¯&Ás ‹¤à8.%%eø»3ôÑGÛ·o¿}û¶V«¥ÙÀÿ®öööÈÈHûÛ¾”””¸ººJÖ8 Á1`…BAu—%s ÿË®]»>û쳪ªª!þ£P(0 ;‡rã4~1*M?àXJr¤ $æ! /_|ñÅp^¹gÏ«ÕJ»°! /‡æ=vUUUÇ§ÝØÁ"yù믿–,YÂq"‹ÿj6›9Ž ìûM…BQ]]íÈ^þç!DäeÏž=ÿúNWW—¯¯¯‹‹Ë¹sçÒ §säŽ_w¹aÈBˆ„;¬Dd ! B@ „(€Üát.€l!DBˆÈV¢²…! À,Fä ! B€X‰ÈB@ „(€@Qàt.€¢ ÈÉÉqt 0œÎ! B@ „(€@Q¢!DBˆ„! B@ {禧§»»»“mÀá ‡ÿb!ºÿ~a¿à4F¢6lHII¡Ñ €Løùù çe#QF£ÑhFÞ€³Á`€@Q¢!DBˆ„! B@ „(€@Q¢!DBˆ€´þã| ˆª·UãIEND®B`‚mod_perl-2.0.9/docs/user/handlers/connection_cycle.gif0000644€ÿÿÿÿ00010010000004060511727205031023215 0ustar ????????NoneGIF87aVò÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôAAAòòò???ððð===îîî;;;ììì999êêê777èèè555æææ333äää111âââ///ààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷DDDõõõBBBóóó@@@ñññ>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,Vòþg H° ÁƒaXȰ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª€°¥K„°½œI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“îd™4¦Ò§P£JJµªÕ«X³jʩӭ`ÊK¶¬Ù³h“v=ú5­Û·pãÊK·îZ£mëêÝË·¯ß¿€gÝ-š7°áÈ+^Œs0ÑÂŒ#KžL¹rYÇC![Þ̹³çÏ•jMº´éÓ‰1 zf •°cËžM»¶íÛûLV”uk—düN\¬ Ý’yõ]¼`ðæÐ£K=¾[´LéÀ…cßÎ=(õäÖ»þ|.¾¼ùšß#+ÿÉ\:ùóðãLÏx½ÏöÑßËßožþbû=á~ü¸ŠÈ“€ÍhàƒÍ!˜Zxñ9á…­Iˆ˜‚;1Xœ…†Hš†‡q¨“‡Ä(⊜‘XP1|™˜ŠÃ©È⓹(P1žØÃÆ^2âDão6âh¤b.úp<üÑÂW$Ž  ˜†¹@€ÎBº˜c”çMi`•ƒñäLgZÙ‚µ òÅBÈÐáWš5 Ùš˜û-Dž™ijä_ Ô,TE 4üèLv¢†§|e´hN“*Pzó ³8 ØX¥-5zÚ£ðˆCU¹'Kª‘¥þ=QgF ¥I.OÕ² F0Í5ÝŒƒ†täóÏ ²ˆ#Ppœ|"J (¬à,´èRƒ¤`ZF…&T2$Ž0È„òõÀ±Î9btƒÅ4Ï(Q »  ÝЦºäØZwñ)P¤°þt  ÏßlŽlÈG?pˆ"@0lâI($œ B ¯È‚KC$ñ5Ú€SÆqÜÁJòpÛÔuœ½CR7öÛÁ{-ôÐï*¸-ôGs´Ž8ÜXÅE£ -°¸° ¥ˆòI\@A$Ž,’€ °Í^á¼™˜ã(Óž¢+/Ä@Kþ¾ q3QX³8ä¤áÎøøóCÏ5ùÙç«®öÉvÑ:qÁC{¸3†7ØHÓÄAðbK,®°‚ £€ÒÉT Á#ŒœK@û؇å|“ N !D/·ÌÚ’ßìY98ó©çùœêä =å8GÊ õ`_Ã×\|Ûž€4ËïËïôŽý÷‘S¿uJtÇBKRK]ÝOÿ˜Û–qÀå£ÀÖ÷3l€êLÝ·&äÌB–HÃB®Ì%ìà ÿ*s p#€FjÕ²*–0`CÕãÆÀ™ø‡ÇBĉ^ă ÌÌ)#€„þ- ¢[$t DTa!k¸Þ‚Ãö¯3N@€(Ä*–…D4DbO$ -MX·*“ ¨ƒŠVL#Xt4 :ì9pKh¼Îo@£÷x6 äã#ñr¸šN˜ƒùÈÈé8ð/sL )™]‹l¤&“âÇÒ‰l¡ddl€Gî„y›LåûLÙ—Hޱ2 û"OP©ÊZÚ¤“pqe;£àª'´´¥0]‚K&~RŒ»äLàŸs˜Ð,H1é=BöF”‘™Ÿœi¾hz³z¬äÞ1éøÄΰÇàæ7× NÃ貜œ9˜ NvÚÓ…áþÜË;Cù™1 õ¼§@2Í´ì/øŒ7P€ô¡—ʧ^J˜„z& Ђ3“ÆÑŽzô£ )I$Š¿qJ2!íL¡¼Ñ–‡¢I)g €@ºô¦¨ifdº™% 8 jitºžZÆh‡P—ê¢öƨ•âÁÔªZÆ©Ë*ez€íYõ«‘Á*{´:\``e'ä8#ÖûU2´À?ÒªÖ R¦­zkdblÒu“@« ^¤WƸøë7+BW¡ª+zj¬`TèØÉ²p„¬Z¡‚Û!½®Õ-Êa XoJ”§=ઈ†ÀÊ¢vµ¯¥þ gOTØÔ¦E9*@"J͇$°µÈ nû˾Ô¶%³QmõGåœ à-4!«ÙÆRö·Â®m-+©Ï"פ¢Ynq¯ëØÈ2……—•¬e3[^õ–î0« ôÚŒ¸9DïN’+$ñÆ6».9lÛËø #$ä+Lú¾¤À÷„‡v&þÞµ5avɉ_'vxÃÊ&À`[NXµ®Õ®ƒAyà³¶/±°M0Œ&G„ÅþÞKX@—x•(±*E˜Bò*кëínz‹L]ɪ!2®“sÜãSØ&>°A8€K¹´'MJ”iBã[ùyÅÕ±þ™±ë’L@_Vl˜‘2fFM™Ê(V1kéëb x'âü×9¥Î/)óÏ®Ëä=V³“=!·ž¬Þ À„Në“É‚h—(*†Ö‰$‚L›,Ua‡êœ@£8µ¬±’j˜¬š+bqJ1ë^S¥Ö(ʦ©² À×Ȇ ° òépÁ ÐŽ¶´§Míj[ûÚØÎ¶¶©½ àbÛà·¸ÇMîr›ûÜèN·º×Íîr¿ãÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûûݲ,Ȳ ÒlÄâ EH¸ÂÎð†;üá¸Ä'Îpm` w816ÎñŽ{üã ¹ÈþGNò’›üä(O¹ÊWÎò–»üå0¹ÌgNóš·üž:ÈÀ RðYÄB’!^ì¢û¤97ÈÎÒóŸKFˆ…ѧ®¤C¼MªÓ#óЂê`·‰ÕuŽu¯hè‘ÑÃÎö—Œ]éegËÙ%Sø¢íx?ÈÛw„dë%  ¡ ƒ0E4òö½déi:Ú¯4¿y„ 8Ah0‚ñ`wü@ ? Éæ0AÎfÄRÔè©.zÞô†ù…:ä:1 Aª$fOû¤ó½š8Žéß'˜Hüþ~³ðª0y€Í$¾Ñkþ?‹ÛÏý0: l@Ñ0¡ý©sßûËOL±µ<*à a½<–Øþ¢¿¿ïˆq ·³0‘wiý·}Æ÷x¨|x‡a :° €³Ð þpËЀþ÷€£;%€ˆQ  Fm0 +$ ‚#xuÈ·aXx]§Íq@ü°Ó@ƒÉö7¨e9H;xH¥`%*`„GH‚¶g‚E…‚‰a}L²‰ÃVˆlHÈ\[8Ì—oÄ00†dˆ…ݧ…OÅ…‰ ³^↽V†vµ„Ñ„ˆÁWÀ zèk|hMþ@;´ƒhPŽøˆ‰’8‰”X‰–x‰—È ›‚‰œØ‰žø‰“8Ñ XЦxЍ˜Šª¸Š¬øˆÖðа‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¹HqˆÉ7ŠH‡r°݌ʸŒÌØŒÎøŒÐÒ(3à ÓxؘÚèŒ3€8a¶àâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxø˜íøÛŒpHzň†!À€Rˆ± Þx†Ð…8ØÐz÷r˜ˆ‹˜†ÙH ùù­‘þhƒf©ƒYŒ´‘ Ù‘y 9‘"Ùþ‡Äx‘‰’|¤’6Ñ-‰/iˆƒ3I‡ó`“{„“5¡“;i=Y?©„A)1”¹9É’I KIMÙj³P’L˜†R™’Ty”Vy•ž‘•±•Já•–D©FFIHi–Ÿ–¡–IÁ–ç–SÉ‘t‰•é“™„\©—>Ç—bé—y–É”ƒ9’)”o™Fq9s¹˜›a—³€—Ha˜;–79–rY–˜IšÉ™GᙈšŠYš–qš)“B¡ššE)š–Iš®°“ˆø´•“iE•ù—¹›’Ñ›dG˜kI“ÂÙ—+‰œ•¡œpÇœyéœÕ7œUþTœ.qœÒ¹Ôy| œØ)¶ —¸iœºùˆžhYž³pž”™žÝ¹žìiîY‚ð™šòIŸÄiŸ-áùyû™…ýiÁ™Ð–À¹Y Œq q˜ E± æ©B´‘µ ‰gà4 øékYcÄA¡ùŸú%šbD¡’õ  Á pA vá]zA&\é-šg'Ú˜Z›¿é:ŸÚ¹cAÁ£·¥?Ú8Iƒ€ á zp8J#JjO*(Z‘ä)™©Ò¥<±¥hñ¥H—·°ä°? ‘¥Z`¬¢Bäåd…BöYkEYŒ¨wÊdþIiÆ']ªa†:B…ªaj¡Dq¤ ¤{ЍKv©å%i™Ú*•Z&FƤëEd”&¨ZÅÉàM I§s±d¡jBJ:«Z«¾Å]°µchЦ±Úhª’¨zz«¼ÚžBš–D:Œ³©¢‹ö8½Š§“§çõ¬ºJ«·Ú¬˜%ªŸ*­:: Ü9 ÃÀ ËÄ(ð ³àªr^¦Z¤ ¨–j§” Y}Ö¢¤Š«‘ƨ(¶®„ê¢ÑçKÁÁúÃ<¬©8 Ä: ¯Kl§>,¨PL•)-03þ r:+,¡+Ä›IÄNÁGœ¡Ð)ñp £© †sŠ¿b<ÆÝ[ßËzÛ—µG°þô…¥t\ÇtñÀglÄ&Y›+ÚB™ Á`÷iÈÜ “Þ»³‘™ÆHÚ—4`CêiÉJƨ© á‹ž­IÊÈ…™Êõ¹Ê¬Ü®Üœ|›²<Ë{QË×y˪ºì¼Ÿ¾ËÀÌ|1ÌþYÌšËÈ<ÊŒÊ̼ŠaüÌfÍ ËÍ|ÌØ|ȦlƯ<ÍZÍ„üÍvŒÉx¬ÉcÊÉ“ZÎÎŒÎn¡Íû#”<“˜ É ò Îw,žì|ÿyϬ™Ïû Íá웤»½ÆG©Ïô¬CöÌÐréÐý]HÏ9iÑ}M=ÐýÑ}ЙŒþ· ²ÐÝÐ&=Ï(½Î*Ý!,MÒ.ýÒhÒ =Ò¸LÐ8}:Í5ÝÓ%ýÓÙÓþ<Ó'òŸOðoNýoíÕR=nº`ÎamÔbÔM‡d`s`Öb=Ö‡ ¹SnO½Öúv–ÀÖp×r=×t]×v}×ð&HýžyLÓtØRxq‚=Ø„]؆]kP‡½ØŒÝØŽýØqqð‘]Ù'ýÌ×ÿ ò v+À !ˆZ0ëM·ü§LMuoŒh± }Ñ”  ª-ίˆS·P uÙ°¸ AßdI˜«]Ïœ v¾ª… A ´þ=L½…¹ÐE¼ÓËMu]Vp×0„ô¦‰M¿`¼×Ò -ÔÍÝÞ}©§P@Ó7ݶ4G{‘ܽÝS§‰×`V0„T@ßR CäMÃðÞ2½Þ]íßF·àe‘€ ³ð¦NÀ` ø­JÅîààI áœÝÞSGáXPÕ°üÐPoú 8ð&†MÇp}&®ÙJ=#­=u— eáOUlW‡TFg„ܺLm™wANTãŽä³€ EZ¤åØÈÚ½Èx‡Q5ÏU…!~‹7 ØÀä|ôƒæ°ãüÙ×K­âþF‡æc1 0Þâðæ·Ð݇ LÏä€çªç>ÎçEG¥d|¦ª@„ŽÙ¡t®FÑpŽ^¡.$?ntW•^R } ä!Cœ> · ‰ˆ`KÓàC¥~{©^t«.Ç` ° !CE8‰ÀëµT à ½.¦næmg Ð bÁ•æñÚóü§JôAb®ÞÙÍÞ^tÖŽíiáíßd~èWî~îÓþ•ywD,•ÍýMÛ çÑ©ýMíl‡ïnÑÝ¿íMÝðáÿ~êöëÉV(ßPðïýMßÔ°ð›½Ò’žlSŸšøÝßãƒþñ=Žêlnàë4 &âŸîÉ& nÁâë„<Ê#ï'Nï)nóȆó:Ÿ<ÿM¬çz@Ïã4ï×Dïk'nQåß”  3/ô5/ða7õnQ²îMëȰõdŽî^v4eSháçßÔ©‡ö\©¼mtOPSóœQë¤3Ä@÷»†`—÷d°÷­žJñÂøR¾—yç Pnìëd},ü­ÑQßk/ùiAùßTww×ôyžñP¿öTׇh±îëtƒÈøÄ¼ù³¦ú¬GÄîÞɺ ûËLû²Æ pnAðß´ÞæûÒ ü§æSÄþŸ+µNý¶ üÛœò¾æS@ý¿N]÷u¤ÿ覯1ð}m'£éà+¿N²`ý‘jþl‡þê,ÿMP'uáoêãŸåý1Kà@‚ D˜PáB† >„QâD‰I¨¡˜Q¢4á4~RäHÀ"™2bƒg€Ê‚1Œ%€æNž=}þ¤ˆì"P=EšT©B^-ÝÉÒ%L™>mâÔ UëV®K…®ëÊ0 1aÍ ÜöîØ¬mnÖ¦]«Åí,¹oÕÒÛömÞ¹uñÆå x¯`¼‹à üW±^¶wá6¶2ÛÄŒûe|PêÁ—1 ÎþìyÕ`γ¥MÓDâFˬԫ‘¼s­šµìÖ³cßfM ÀºÔÙXö=ÛwoáÁ‰×>îf8mæ®aC  örÜÈ›ÿ®ü4 EêÍêþ=bÄO@ñâ/Áòþð<ÍZ〉Ϭºi´¬¶Ã0Èpq&“Yð(ÂCE ñÃG4‘D?œ6P„ñDWŒ‘ÆSıFè ¡‘=¼çF}ÄQC#!:VŽ4ˆ‹ œÊ3‚@ãI´‚Hc2K-µñ­'chçÈ' ¨S~92›´<VaS x„þ2B)¢r'+ Â2N?O[柾 ÓÈ1ËüÉbŽìÆš?JUüLÆŽ: ꬪÐ*¼òÂG?Õ¡"pãHg(¨r9%´ÔC“‚ •‚øÈçÑÍ0•pJ ± 5X¨†¨Æ§QK5òÔT…eö¡dòð‡ ‚‚nÙ@4tòÒ‚2pS`›%·'.}"€wŽl3ÌDÓH5µ,áM‚à‚@1œÓ[‚ÀõU\ ËE˜&%íiud€s€R”QG³ŒFŸ>°¨L‡/8ÀÈJˆ`<=8a—Ùtˆ%V•U#]eóRÈJþékjÑõßo{]ÙàN_fú#b}€xŽ\4šfº~ö B  E Ä€#»5h×£ï(Ošö¨O¬çvèÜž¢žÚȪ¯þéÌ4×dS…‚€Qziˆ62à´é¶Y^šnË Ô§ ãHeH‡âEl4ÎlúЊY"@”Yx0O3<ùñ(5­’S>g¿¼w¥6ïÜÈÏCÿiÕV_“H˜EBighUíÈÙžÅm•àHnß¿ŸE˜b{€yŽ´#ð™íÆ|š™PzI€²D» ëS–<{Êw_ßúìÆ“˜ïH_×ßþþô‚çQŸ ’ %ÇérüÞöR½Yx/€–Ë\O è !0Q£ÓPéüŽ?Øc?¡Xô ¥ÚYðváÊݸ>¸C•øß1Ò\T³ã=*ˆÚæŠ ¬ý De“Syx¹§õć@ÔÙ0ÅP™áúÀ~Ȧü¤‰³x¢ÿ¢7ÞqñeÜI`)#*FÂàþTôqª /èÄþi$ô ]BžÈ‘޲ã -ö©uô2cS yÂå°eŠ¥Dx€{éXD¼ò’d´Ò•¯„e,e9KZÖÒ•ö€=l¹K^ör–‡xÈÓþhÈ‘ ²¡$—ø|²R)]ëB¦A, ŠuTÓš×Äf6µ¹Mnv³š¼9Nr–S›« D“žd;;áNOºcc4ߨ%ƒèá÷Äg>õ¹Ï#øÒŸÿh@m9„øM^z<ˆ:`¤tjè %H "ÌBþ/žòL# rˆ°Á£iHE:R’–Ôœ'EiJ± ŠÃ!¤b¤»BŠÑ…<Ô šœè ÑXÑ5vï˜4uÙ!XT„@ ¥1^*2S¢Ħ¡h-êÓ¦6K™jU bÔ¦1U«y*AʘSN&Í“•û*¨àH¬¦u\EˆA54¯„x5­aˆDþUw¾ žTuë§4ÊÖ¡º®yi cšÐ…¯Áé^u:Ì©vð§U[ÓzXƒ$UC8«kcÝúX…ð‡ïÔ!fãTEƒhö«œM˜]¿JÚ±J¶¬P<«U§µĵZ…-Aäš!ºÊ´˜õDóJ'vòJª=µìný4Xßv³G5Hb3¤Bã"W¹}ä&ÛyZ¿¦Vº¡úmUƒ;Ïf´Ý V"ß”$7˜“åin/zÞ,]µµÖ}-vc{\™X2{Ä4 }¢à‘Ø· µ…i;‰ÚOò÷H½HzÅàƒpø#ëÈp1TÜ„O–D1‚Ãâa 88¢Ìµáx'\Þþ [XCÔÍ0€§d`—¦Ç'& ˆg¡] q·ÄŸQ°OÌ`+ùÀ3Aq=eú¦ØÉOîq”—Œeƒ¸x H/YelV £ÕÆJ¯•¯¼ïDÈíÅÐ{¼å·MÍv¾3–S¼ä=ã¹ÏjÎSŸwle? Z ^^ˆ„ÉLc3ŸC¬Ý¨ŽŸLg?šËx¾ô µGeÐZÓ†Ô2¦CýV#Ì&>ð‚™\å$SÉɬ´|_½êùºíÊJžuA= +·eÖ­£1„áYüvͰþ³§õje/Ù£6t¡qÝl!‹x;$–&ª<åNÇÈßævªëümU#¹Àv÷@v­×þã÷¹ú¬°1„ãbëxÛ«î¶«õ­oLoyÖÞV‡o kr ™ÈÛ1r¶Ó}ns‹Ý8 e­â6;âฺ¿;‹È¶û¶j„wtåí'c3Üoõ¸Ã-ðŒ#„å §5áJÍ^›}V•sî7ÃUžñ˜KÊzÃw¾ðYx¢÷ý¸ŠAbÌ‘cÈ¿‘ºÎ1žîžKÜâ:ÑÅsRwÕ“òÀ»Mu€¯™Ò`G¹­Õ뱓ûÐGð:cìܾnï¯"oºiˆ]rPoºí¯º§+>xµÃ<ãÕŽ—†°à‹¥~ÝêÎÎwä/­åÇ?òÒn5¡'e£„ݾ9°÷›÷³,þ !i¦µØ/žrŒ÷ín¹¥éÌuƒ£p»‹U¸”¹oÉS^ìÌŽ¶ž?}ìßWZÝp'H2°(^º“×îæ%½†PŸgeû~âÈÆü³¯ùfWÚô}sÍÝ{óÜ»µóPuwÝS‹»'2úZy:a]>jãŸÓØçó¿Ínèf×óàŸ9r95Ì¢-¹c¾µQ?’`?è{?­Ø;Ik*Ä;’Mˆ# ‰?5’@½Ò5T-™Ò -ËŒ8KFeˆ,Õˆ=¶t˾Eá•-S,Ä -‰MåT…0½žU#aKÕô 24 3dýÄQ6 G ]UðlU+}Õ¤Ð#IMAµÇöÜÕýd=­RíSL‰âP áMétRÁyP5Ó EÓåÓbõÔŒÐÎ#ÉÖ/50 0O@ÒËÆ<ÓÇLÓÈ,ÖhS€Í#þ)O½=PI×MÎüMi½WšØW#éWõ¤ÁG ØCMÛ×WuTPL#qÐ5MVoUÕqdÕpÕƒ-ˆr¥ˆ‹Õ^U×Ò`W-ÙX61IL¥Ï‰åÔ|͈¯<TÓýQ¥”î”Wp¥WqµW‘ý ‘K )TeMJfÕž}VDÍTŠY¢ˆŠýˆ›<’¤½RI%#±ŒQ˜ÝÓ¡½W’†<’1MÙ³ÈÆû®¥ xýÚyMÔz]T¢¥YŠ0[#AÛœÕFPñRVV%Vªå‰nüF#TŸ@JÓPJ6ù[ˆ¥Ò‚•YF¥V’@Ü#YÜ"mÒ®ØÚR±%WzÚ þQ€8’Yõ k;º|”Î}ÛÏýØ¥+Üb½Û‰ˆ„#9V¾E¸md“MQÀýÖ`åP‘`:ÃMŠÜÝ]#é]Æ]ÏeáR¹Ú‰H^å Ÿñá‰P€y4’s½ÒþüOŽõNã Wä­ÝW%[‰ð^ðÕñ]ÝRPP!ßT=_Á=ÞÈ^å½]‰„#IØ[ÍÆße¨‚fàvà†à–à ¦à ¶à ŽàJ½©<…ÚÊšHíU‰`#©—؄ކ­«è†fává†á–á¦áö‚ÆáÖáæaFäƒh½a4\«ÕP‚"aÀ˪’þ-Œ:?„¸Tëõ`ŸdTbû Öâ-æâ.öb ¾€…`]ÓX<†xbyŠâƒ¸bF«[‘ÕÖ¢…¦ã:¶ã;fáÖã=æcæA².Cà=CѪ4Þ`Ù\Ú5X¢•Ãh2hÜÒxÜB®*DF¿ˆ}¾ÊíÓÓ|ddŠär9ãhÂd±òÚ6ÞdÑe_ÒBàä1VY ˆQF¦R^.EÞ_Fæä5ÃëZ\- ]-K0dš²eðÂåôåßõÕÞO¥Pžä³¨d‚ æKb<¤bèúàb½\g¥P&—jnªcæµSî`m¶â>ýDWcúm]Yq把£z†rþ~Ùl¹m~Õ^°_ä\%dj.f ?†°g‰Hh‡ gœ\7îBþ¯fYèäh6‹iy6èAk²Ì³?Îržb ÛbBiufe@$‰–Þ‰—žˆP†eµ…çY˜é‰P½ï‹¼íã>üCj‰Àg6>ç}Ng^f˜‰¦ –û9Þ¾Ö<7d`> a&h89®»:J›¶…Sj„ ç_-^ýUf]Våf^é 뫦>¬æi•€æè]Z†ˆj…ö»Õk9¢c5»¾Þ‘¾æL~èT~ãƒUé¤ö;~˹þº†½Ê†i@ç‚vlãìùk8¹¾ëƒðisÖä“nd']ç”89À+¼´Ó:µnç |êÆŽÕãm·“ì¿+n‘ØêdZõ­í"c¨ëÇ&·ØsmÒ^êµè`èFmÇηê¾îОìœKî‰hhžíCjªõæÔŽ:Ö›ºÑ&ŠÄFa„îáöhËó¾´æïÃŽ’F“fïç®ÑΞn©Óé~[pÈömºÉoðþì²þ´:£¿û«ðˆmæjçÞå+½íèoÉ»¼ìÛ·à ¦vg2îï>‹×®¯Ë~1Çî‡è_ÃîV‰ßéL«´ß«ñ†e¶6 ·ön#q’Hþo¯b‰Vˆ÷þ‰$ û®C…ˆð®@ñ¥p&Gg‰Fð r¤ˆif¹òy>h¨ØðÀ¥ÍÙýˆ§Úߊ,/ W …(s7Zn5WN¯–h^±37!ßî¶îîxvñPÊkõÎlÚþp‘…r.¢rδóC¥-×s‚…h"¦Ú/W/Ó–iJW¤4ßë5_ä6oo/êóe…hj³XÙ·g¿åK]FÿkFõóNhÄLˆ;ç¢Dçr>wòÓ lH¾hÅv\¦¥fWè‡fwög‡öh—öi§öj·ökÇölöWõDëê!>Ç"æ^éfgº)€@÷tW÷ug÷vw÷w‡÷x—÷yþ§ww×Ì„øiômîe6ð…s|å/2þfÂüýY}ïp~oô"Áàƒˆ—ø‰§øŠ·ø‹ÇøŒ×øçøŽÇøÐn^÷“Q*%âíXRÏeSï÷W¥ƒzwù—‡ù˜y[ ùš·y›obzDvJVv&!ùêê0g7'Z#Î < MLXSG’RÙ^ôoøm߈@z¥7 ¦÷Z•hõ°pÝ?zx vpçç™ ë¨ð€#Ñèú” ò°0ò#¹¢Å,ûL÷aW‰µo{#y{aØ*ÿ“»Úõê•P£§ˆ O8’L XÓŠú¼×ìˆ&Ú«‡þLJ|#‘|Ê'UàË'{Zgs z8N{šˆ 8’ YñÝA•ò9“Ï_”ïk•¯z¾wú„#Á„ÙWÚd¿}:ü©Ú;WÆŸá'~Ø€5žËGýR7ËS·íT'‰Ix #ÁØ„´uõ§Öë?ýQßsʽõ>ý߈ò÷×¾ý¼¡EÛhý}àˆY8¨‚ 2lèðáÀK8@¬q@.‹7ZÄ¡„#È…ˆ'ò$ʇ}l0 @žB)!°0–€™:wòìéS§°j? L8”§DNG—2mÚt8N}rɰpeË—1›Ö¼þ™s*ذb}jËÖT€cA^ Ôé©_k9bù1w'T©wEÆv•åB—0 ÊdÚU!νŠ+^v«©„´ŒZÐaª»b“v³¶9$1ï>[LVïoÖÁ /=\01騲g+ŒŠöÀÊ—bÄ-УG·ˆ5°VÂ\m"þZüùó M#¸íÛ€Nзß-À ÷YUQ#W=õQ×a‡oÿ¹ìt"‚c×W®ïºîzϽ/y ¶•a̽æÜ~ ÞåXS Jp•àfšùÖY‚ÆÐNxÉØ`A*W W šx"CB蛄žLÕ›oÀí§!‡('`rþ«-W"Š=:%S0Bpà¢Irtl„7žB7†˜ãy;6§$–d™ÅCG LWpÙØµ“NþçW”€áhž@è ¥Þ@ìey'J r À(_†Yapî‡ ë„‡Ä‡m¦F`k®‡ ž‘ÊöŸÁQÀ'/fãGƒÚ£”‰¨#‰WJzêF@.E) –bŠê©I Æ“V)Z£é9Z'¤°úª|L=)ÁMc⇛™ ÊJëš ŠJeœVø+¶ é¹Ô°Åúv¬QMe¨gû)@:&ZP¨Ze©×f;oXŽPBpEiœŒî›®nN çþ,rþD§@vÒû«ª;ÕR÷ôih©µ°K€F­ÒºKmÁÖ>Šq¶Áê4Ì(A@ @)RƒŸY¬l™gº§1ÇÑÞúf®sîšp¯$KºíL>¨€5Â2AÓìÁÏ5ŸÙè…åºÇ ç¨ë±@ïVïÈB‹-Ò¥È( € €*¤MÍÛ¦¸õÛÖZ¼èˆò8ö© ÏÔKð1Ph$…>}`Auóñ`˜ÑñÎ÷|ðϳ(üx–&ïtl„`Ê@&°BlÔ­Ø™¾5»_ä“ëÌ®ÀÓl°Ok4çI­àô##œ P4‰où™ŠTã&þ¨{ÎPN‡§Unûå¹g¾yïÝ„Ö1`¼@¥À‚lB 7¿F?=¨µ|»È¼zçBùÄ:ø1ËøN1 (ä¡ÛHŸ—î·'€ ”£ÞH¥7S)0IžãId˜AƒE@€¤+fÓ¥>ݧf b gGvu d¸ë‰î¸WAýn'<8ÁA<#þà‚+å”qU-AÐÀ8¶v½ùe†ÛãÝ {G&ìhmXµ/N‰ñ‹ ¼&(¯(¢Èo<á9†tE|ø£Y$ƒˆá+”_ é6ûÅñD쉃€+À¸éÍ\ç‹Íþ±Ž* gáµíh}óiKøÊ»‰£'ʹ(AWyÓÕÞÚÙž?´'D#*щR› ¡CZÇ,›IóŸd (C´Ä<6QOTè~2I /ŠÀhCˆxJˆøó’ ]ˆ‡†‰Ncî¥wb)_z‘¸Ñfþn ©ioª‘s³’=õixÌØÐ–ÎP¨°B*@ª‚ÞŒ_cØ º†®”ª´jF—E›×9«ÕjADZPžÔg kqT: º¦ ‘)m ×Q›Â• H°Þ\-WWÌݯ&âkUýºA“¦¢RƒGbê¬|tlq¤ZÖ JOnJ'cÒÉÔª–6™%W!¹Ù:U†  Y÷jÖd–Öej [’Õwµ„1XqÂZÙ¼v ríªA%ˆP Þ7zVAZˆv6‚=êe5RÜäŠwËMs"Ì‘r¶¤;YguO”Ý¥œ7NÄUn:ƒÖ†P¶¨þÑ/JÎËZòâ÷¸ãU­€[°X#éuS;;Ý1Æw6¢Ý«v92Þû®¹>®{›¥ÓjX&©ð‡[ÛáŸgÃöÝpa` ’ÇV v¯Nà[aÚä»ÞŒëû!/8ÄÑèZù9Ån‘£Ìà£Ø¾OæÈƒŸ+[¯R²5‚hìŽ7sÝYâÇ%¾rƒA¼â4/˜Á1v³‚5²ß¿š2°¨dˆ%ÂÛä8«¹À*îs‹©Œ_";¸°É){iëe0‡ù9eɉMüf>ºÍ –±¥YŒi9‹x ýQ’çKš!„.òŸ×ÌbTšÒypCn¼ØÜ}™ºþÞÌ…òèá:9Ц6/°ÑgWÙלöÕ¨Orj+ÿÚÏv1³¡ÜkˆÐØV‰ÅÞ¬aXk ßz2=&³™÷LèSKÙÙÆvµ¥O2ç… ¸ųžË;ät–;Ðè66 —Í,³éÚL̶:·ÖnOfÌ»I¤›­ðJ¿Ú¬Fð½²n…tW6ßu¼!âð†xÓ™Vp?çˆ7äÁˆö7Iþ^–àŽ·¼Bn`·zÕúfóC&^OË&Ô I6ÂWÍñao<Ó7®Ç‹þjC«d¶M]´­]¾—\ƒÒù}8ÃéüŽ[ØWWˆÎ³ô·2¤Æ³µtçÄòcJ}1ß>þxyÓ¼é¤C;ätzEÂ>vËF?”ɸ÷ø­Ó§§gíOm{c(Ö¸[¤èsw|¯]|÷iç¼Ó©xl.þsÀwïÁëEy{UžcÃÛñŸaüýô.žÇÆç;f™a§KXíŒ6=X¨>ß¾"›ó½«öàk0Ò³÷Mùöî#{äßöýÝ'lHû ]º¦}ø·7~SÆœü³Z~˜'æ_ï{Ι|]ÓWlõi}}ì+fû¼jû ûš!hcá×Ïþ¡äï!îO}÷ùÈüUð%áÙ^Ôíßñ-CüŸ÷¨Þ,ð]ldƒ’9Ä*à ð©_*àRhÌ=`÷}ßgþ„A\àý”_ðáØLÀñy i8`÷@ 둆ë +ðî ö þ ¡!¡á+È^¬Ñ ¦„ ê î„î…à `€-d¡n!v¡~!†¡Ž!–a@ÙYÛùa[úiFáL ß!Ö¡Þ!ö` tŸ’Fp…9„‡–ÙŠ^ ¾ 6…(CÐÁ D¢$N"%V¢%^"&f¢&n"'v¢%:wÕ™wÝwâ3(è)Zþuà"¶âFÔàgÜ`qpÒ)ÞMtár›+öÕí¢q’ØÑ–ÝâW­¢.ú¢N|[|õágü!þw¤Q0>’!rÙ×9¡""cOŒY|‘àf˜`q¤Q3Šù #õá¢õ±"6¦£§¨ýwàP8Úb9c.œ:¦D/Þ#ßàã4c—£=ê£H(cu1ãfø{ôO?JãÙbܤChcuqãdxcpôÏ2 âþ[D®ÜDRdÂâfÈbpNGÊ#ú™##IŽÄ;Åd÷Ž;‡ÙÝ=ž#LÒ$Däm!äd8ãvÍMúF!>$5rÅ5úäFXäma$ch¤oM2ˆã "¢5ޤSbŸINJúÆÀU²$º¤¢cW.D>®å¯Œ%ø£Rd5¢Äªþ¥[P‚Ö)ø@p(d{°Ä¥Cêd@ÖcËåeE:"ÁIåbP%næ1`¥6¡]6¥bÂáW2FXâFÀdš%H¢¥Dâef¶efJÊg\f]žÄ]ödj Ä^:–P2QB‡;k&D’¦Hš¦bB%h9¦b@&mì¦(ÇÉ}dÊ…äèqålvÛf.FgÒÆÀrî‡k2¥t:%jNg–d'´æoîäK¤xÒf6Dƒ ¢{Âç{ÎB|Òç|Ö'~Þ§~Ê'ÚgFÃ;üç~Òg€ú§æ§€þgâç‚(‚h*0ß&_’ôÂ,Á;T¨p¨‡fh‡þ‚h…¾†jèˆrh‰†¨…¢¨ˆ‚hŠö<À>|芶hZè‹Úè…êhŽÞèŽÞ膺hRv§a`æz „c,B(À,()“2À’P”B)“.1<é”F©“Ji•fi•^)—6)˜n)•Ð˜Ž©–zi˜–)›ª)›‚i™’©›fi0Ç4C̨1…*Ažúé,èéŸæ)ž*  ª¡j¢j¡"jŸêŸòiTCŒ&¢ö©¤^ê¡n*¡fê¢>ê§rj¨V`BVBg"~ç‘®j–Ä ÃÑ¥w '«Ö긪Äê<&Oª§­þª¤Èäªh>'pF'­«þ²šˆ°Öi±†ªne².+µ¶Ç€³ž‘.E iµ~ë‰\+èjK¢gOt«ª‚«ºÊ†¸’ëYš+O ë´®+½Æ=€„ºÇ¶…¼Êf½þ+mÜk¾¶Ç¾E¿ú*À&¬lÔøå³ª¢Áz«ÂNìg0¬ÃjëyòªOlbR¬ÇN†=†>ìþDzÝǦìb„ìÈbìR2ÅÉžÊÎì\Üð€»Ž&¼îDÌÆ‚%¸Ð­Ð-Ñ­Ñ-Ò&­Ò.-Ó6­Ó>-ÔF­ÔN-ÕV­Õ^íÓ¾ƒÖn-×v­×~-؆­ØŽ-Ù–­Ù‚m€œ-Û¶­Û‚­?dìkŠþDÌv@Ü-Þæ­Þî-ßö­ßþ-à®à.á®á.â&®â..ã6®ã>.äF®ä*®?ÀL.æîÃÈ*ÌÍ~î]àì©@¬Éz.è¦îQŒkA¤­Î*‰én,ꪮíîDÌ´.¼î@ <(‚ì–,íÞ®ñ…‘AAè•-dÇðnà¹ÖîñV/Gü‚`ÞA0oܤÌAhúÈìN¯õ–ïL`ÇÄ Ä X–Œo¼R¯ùÖoCÁg"Öú¶ï,¨Á÷öf’È/ÏÒ¯ýðë@¿ñP .¸E–°NĬO°Bà/Ð@(ðc¬ÃKþlç‰@ðLH0°@H„Êœ°DLÄ€pJˆ0 Sp0ìæ< ° °A·0ñ’o ÷0A`ØEåÖ‚.Àà‰ £ £ÈÜúð­ AvÆCåºÄAyê°ôίlè¡V{1ÿÚ·™sD€/üðhB¤$ñI,1åÅ+}}ƳFëqÐXq\]óιG /„ĨWñc±eÆ1kìëD!#œVÒãk&ØSrXÈÉ$oÆ'D&—H Ó-›X'K2S„òN|±'‹×%óª+·2i Wï CŒ<Àêï°kÜan‡I™þWI䑜סZ}MÛ}Õ%1Cœ‘±§D&_ò×9Y4Û›«93Ò©Z3w]8§›,Ò ™73•›*¯Ù0£³¤Ás „&tR&”.0°0c²°IW,㛀ù³©©Ø€áß?G›Æõ³Aÿ™yYsG+$/ô•c@K´Aã²ÌU3?Cô0÷™BcòDäAk]H»dES´œÁèƒ'hÂlÂ&p'pBtB'x€'xÂ|Â'€(€B„‚ˆ€(ŒÀŒ )”@ ”‚ ˜€)œÀ œ  *¤@ ¤‚ ¨€*¬À ¬ °+´@ ´‚ ¸€+¼À ¼ À,Äþ@ Ä‚ È€,ÌÀ ÐB dá à.ä€.èÂäsÓ/Wß }´EF/VaSÒb/ö>“ dGô±rr9WöÎBöHôc_ {vÚe2›6£töAmö¬5´Mö,ì@½6lǶlÏ6mWësF tÞÝg¯¶Ò©v—ÅXi72F{eï¬e_6r§fŸön;\5ö¶a‡¶rk4c37äö²·b_lBd&`\Â\€%X€TBP%PÀ$LÂH‚$H@$DB@$@À#<Â8‚#8@#4B0#0À",Â(‚"(@"$B " À!‚!þ@!@À À‚@ @Â?üƒôC?ðÁ>ìƒäC>àÁ=Ôð,£ò¼] vn‡Qtkta›6GwdC¤ 6ÿxb‹ôn39’C9-Swã%÷tgvÌ™[úqv#ûJ-3 ·‘ëv”ù‘¯6¼9fï¤p[¹u+÷5y犛y™Kùu;·œãù”c9”#¶Ærwpw9¬|ùB„¹ô2û3 #v3twSôi‹6™c]6[²a“ör‡´£×U£3:¨ëù–Sùš7½‘:I´£:zÖ9Ö‰¡+„wÈ‘ó:SsÃMó‹¹s¶Ü›Ýº4‡q¨È$s8ËÞIÛ±Ï\w3¥ݤ °?²{±;´ï¸<;;·ÚVh³­/Ÿ=sïÄzA,±›3†¹;tÓ˺+È» ºóù^Ä»²µ»»—{SÌûO†½'9¾cË¿ò¾?2·/ l{ÀcÉ ½óûÂG¼<¼ÁK¼ÅÃ{Á_¼Æã Åo¼Ç+IǼȟHȼÉ|瞼ʇGɯ¼Ëû;mod_perl-2.0.9/docs/user/handlers/connection_cycle.png0000644€ÿÿÿÿ00010010000003606211727205032023237 0ustar ????????None‰PNG  IHDRVò¦¢-sBITÛáOà IDATxœíÝ{˜Õ™øñ·™ä¢ʳŠñÎ2àf5&Ååb‚äqu¹­ñ²ŽâQ£2Ü@@òH4ÙÌ€7\‰£nPÄû £5>DÃÈ xaƒ:=3ýû£öÓö¥ªº»ªÎ9UßÏùdmm­+«‚)èá!W+V¬xä‘G®ºêªÚÚÚýû÷þùç§žzêôéÓò“Ÿ¨ŽÎ?t‹§@.…C‰l?þ¤ßMÜsÏ=Û·o¯ªªêÖ­Û /¼ðÓŸþôÇ?þñã?ÞÞÞ®:4?‹_ˆF£ª‡Rž»¿:Iϲñ¿¾fòtHôîÝ{Á‚;v쨩©éÝ»÷o¼1f̘“O>yÅŠÿj"*ïþ}f±X,ñ›Ìô_fÊ·+žo’;o¾þô‘øÉ’¾$Ûz\90B·nݦOŸ¾}ûö»ï¾ûØcmll¼ôÒKO<ñÄ¥K—¶´´¨ŽÎ+¤@Ÿ±$OelcÛÀáú-–8Y sçÎ×^{í–-[î¿ÿþìܹóúë¯?öØcçÏŸÿüCutî#*Æ…Pº)..¾øâ‹ßyç'žxâôÓOß³gϬY³úôé3mÚ´€‘ãB(=E"‘‘#GnذáÅ_>|xKKËÆV!fP„b¤@š6lذaÃ>ú製{÷ªŽÅe¤@ÅâB©Ð\Ÿ>}úôé£: —q!T1z  )P1R ¨B T¬¨¨(‰´µµìwV ?R zt@ R z¤@P‚¨? %HêÑ %Hê‘@ R z\%|Müî?#z ¤©çz |òÉ'6•-/©A1R zîÞ2päÈ‘ô¶À jêqË@P‚¨µ@P‚¨)” ªÇ P‚¨½@P‚_„ªG ‡ŒcŸøAxNHêq!@b±X$IÉyéK` ¡êÑ à–x^T…1èªG à䌘±ƒ˜Ò ¹*%­¦¯ÄâÙüÖ±wk½ùÑ.ìê¶“‹\à–”ïëÿflül<å´Î”ÿæ·†œvªÚ]ïX컂ݯ§ o‘ï²N¶_§S‹ÅJn"§Œe[Ýt1)h× Ì(c¿80Hò–|ÑÒúc¶?O´Iô@܎цm Þõ‚ÌHéò¸ºh™ü8¹q®—ž­/^'Ÿ%Y¯‡ ¡ —±«à$Ÿ¥Wþ¼¯¼ ÉŒèÊÕíÄ’ôNtú’/ KRºµ}ñèP%ù;Êù·V`bЮWÈÕíü΃R¶îÊt‡H\‘þÃËô“ûŒ?6±^­EÁ¶ÿàE ÷"?šö ¼º]8?/ “ä!þ”í*Wâ{ɶcÛÆºõ³‰ S.ufüáh~›(„¦)0!ï«Û…o×y›/ S ‡lß99}a:<ƒw²‡Oe[’÷& ¡é…Pý¥œ’ò#]z „)0׫ÛXoÂɯcò¸€n»¡8R (¡Ý…PW®nÛfÍŒ ,j¼ù]@w؆ ¡ô”ñ 9H´K®\ÝΣ“ ÖéÏæT2̆^ =2í%3àBhà‘@ R z\%‚Ÿ¿dña4a~è€ZÔ?ÿüsV¾~ýúÄㆆ¶Rˆ>ø@D>þøc=Â'ð%®°4hP~-RàŒ36oÞ|ÄG¨D={öˆÈ[o½5mÚ´¼W¢m<ÕÐÐF‹ŠŠòø[-R ˆÔÔÔŒ5Juj¬ZµjܸqC‡}ôÑGUdž‰ÿœ"?Á¯êZ (A T_„€¤@õ耤@õH )ÐWÍÍÍ‹/NY˜->öØcW]uÕÎ;} BF—_„†A[[Û1ÇÓÜÜü£ýhèС‰åk±XìöÛo߸qãøÃÊÊJŸC€0 蟢¢¢[n¹EDfΜ™¼ûliiéu×]§0N]a0*¤@Å~ô£5*þø§?ýéi§¦6ÿn–‹Å’»;¶ÞxãË.»Ì»xôÿE¨ˆ¼ÿþû'Ÿ|²Ú`ü±`Á‚óÏ??׿zúé§o½õV/âAHÄb1Õ! O«W¯>î¸ã\_­¾÷ liiéÒ¥ËòåËU⇪ªª?þøPˆªªªš››óøÃæææcŽ9æÎ;ït=$:;ÿüó]wé›E¤k×®ýû÷W…–.]ºyóæìl·nÝ ùÛ¸ ýywÏ8­S`xsÌ1ÇsŒê( \ø9 ¤H€Ò7òÛ-€§ôMxŠ)R ¤H€"BŠ)R ¤H€"BŠ)R ¤H€"BŠ)R ¤HPéÉ'Ÿ\°`ÁþýûU ŒHP¦½½ýæ›ož1cÆ 'œð»ßý.ªŽÈM$‰D"n5ƒÿH¡ çµC‡¿ÿýïüãúé§×\sMÿþýyä‘X,æ[º‰d¡:.¯¤ìc°wz25úùeÁÕ;gŸ}ö† þô§?õë×ïý÷߿袋~øÃ®]»Vu\z Þû-ýC¼}L‹ÅÂ|n§3SS`6î~ø ú ‰Œ;öwÞY¶lYŸ>}þú׿þìg?;ûì³_ýuŸ#Q.qðcIâK’O¿’ß–ÙNþ¬Ï œÕ9_CÆfÏPSvÓa éÁ§´±mPøJl{2îc!»‰Â™š}û²HÙJÆgó~;‹çôlú^;ŒÓú ä½›Nÿ×ýWSSÓâÅ‹8∗^zéŒ3Î;vì{ï½—Óz‚Çú]—üߌË-ZfüokÈ›“g“w-e7mcȸ¡œ~  çÖn"o¦¦ÀŒÜý²àƒê<·"éܹóÍ7ß¼uëÖ3ftéÒ¥®®î_þå_®¸âŠ>ú(°ƒ!ù0¦Ÿ‡¥,I~Óf;5LimsÙÖ²i‹SCëé -mcHùHf<,Ö ?PÉ ³í©õñ)|7Q¸@¥@w¿,Ϧl…jáÔ¶¶6‹g»wï>þü-[¶\}õÕ‘Hä¾ûî;餓n¹å–¯¾úÊzµI_’ñ¦¼²é˳ý­Ec‡kïže|ÑmXsƒí:­~  çÊn"oŪ(TzWÃöË¢q,˵ïâd ®PÓÏÇ­(œ+»÷õ×__z饗]vY§N9äŽ;&þMÿïˆ#þþ÷¿oß¾ý—¿üeIIÉI'ôõ×_wíÚÕµ3×_‹³—u{Û‹%Ö 4Qà‡`| L‘ë—…WÕöAmkk+**jkkÛ¿Nƒâ£Ñè¦M›N<ñÄmÛ¶uîÜÙ»•Óü”o#L¹ ŸÞg²hò_@ ãS ×Ÿ">¨®+--]¾|ù„ ¾ùæ›bÆ0’ÿÄz/\aýévr ÒÿÄvµN6Ÿ —íÍÊÕÉ&ò‰D:w3·{÷îßüæ7¿ýíoãÉï”SN™6mZ[[ÛSO=àüg{ñ0ÛÏ ’¯ó§‰SÚX4°]CJ<¶ï'o’l[±Þ‹ä•q‰mÛÝ´=P¶{‘¾<åe-|7mƒ-SS §_ÖkKnÃÕÉnÚ–lÛ¶m¿üå/—/_¿F:tèÐiÓ¦1"‰¬\¹2§U…SúÈ\ë¸ékp¾]‡ 2nºëßø¶»é¤àm]˜Ï#›ÏLM®pòHoÀ5×?whãÆ‹-ZµjUkkk‡FUUUuúé§»¾!må”E iéd=mÜŠ3ïõ¤/OÃ罪œ"´nSàqp¾È›©)з/‹BðAuhݺu .|æ™gb±XÇŽ/½ôÒ[o½µ¢¢"§•@®LM€ööö?ÿùÏ‹-zíµ×DäÐC­¬¬¼ñÆ>úhÕ¡R ”yþùçG%"eeeS¦L¹öÚk{ôè¡:(!B „2Ç1bĹçž{ÅWtéÒEu8B‡e"‘È3Ï<£: á¨9BpŽ)R ¤H€"BŠ)R ¤H€"BÊ¿˜ÇMV¹3RpOm.¢)R ¤H€"BŠ)R ¤H€"BŠ©bÕXÙ·oßúõëUGa)KròÙgŸ©DtNݺuëÚµëôéÓU÷õêÕ+¿?ܳgOCCƒ»ÁäGÿÙûvîܹcÇŽû·SP¨––Ö¬o <õÔS_yåÕQ@#eee---Ó¦MSˆšššZZZN9åÕ@¥wß}·C‡ýû÷WHAŽ>úèÎ;{±f}S bøðáÇ÷y£“&MúôÓOxàòòrŸ7]ˆÍ›7WTTÄb±ÊÊÊK.¹Du8P£µµµ¤¤¤¸¸ØˆŠ’ü°²~ýúçŸ~ÿþýªÉÍwÜ¿T»hÑ¢öövÕá@øKß¡ßóYqh+ñß:é_ùKÖÔÔ´råÊøãÆÆÆÇ{LmX±bEJ0å‡<“&M:á„Þ{ï½GyÄ÷¡)Ї°bD/pÁ‚Ñhtüøñ'tRÊS‰È‹‹‹gÍš%tÄh‹CXÑPÄŽ;–/_^TT”Ü”L‘Oœ8ñÄOܼyóÃ?ìc€P†h‹CØÓ¹ø«_ýêàÁƒ]tQß¾}ÓŸMŽ<Ѽí¶Ûü‹êmq¿@ÀŠþBkjjÊËËG•²UTTÔÚÚšíã]áÒÒÒô§H0Oß¾}7oÞìÛæÎ<óLihhðm‹n9õÔSEä¯ý«ÏÛ½âŠ+¾üòKŸ7Z¸Í›76Lu.{àDdâĉªqA}}ýàÁƒ3>UH äB( S__üñÇ«ŽYÕÕÕEæ’^½zýä'?q}µ¤@fðàÁÛ¶mS²3fLÇŽUG‘³’’’Þ½{«Ž"OŸ}öÙÈ‘#ï¸ãŽÆÆÆäåS`kkëÔ©SGŒñç?ÿÙ×( ÓØØ8oÞ<×WK „avïÞÝÚÚêÛæè檲²2ñ3Zƒ455}öÙª£ÈS¯^½.¿üòöööšššäåSà<°eË–¾}ûž{î¹¾FY˜={ö¼ð ®¯–ì[·ÎÏZ ¹CãU¥@jJTUUuìØqåÊ•[¶lI,LOÑhôöÛo‘êêꢢ"ÿã̵@@D¤wïÞ~ÖãLìªB-P‰ï}ï{“&Mjkk[°`Abaz ¬­­Ý¾}{ÿþýþóŸ+ˆ²Ôßk\͵@U¦OŸ^\\üàƒnß¾=¾$%8p`þüù"2gÎã~&J-ñ½ˆ\Q TåøãŸ0aB4]¸pa|IJ \¶lÙÎ;¿ÿýï;VY”ù¢ˆø>.^`®¨*4cÆŒ¢¢¢åË—øá‡òݸÿþøeæÎk\P¨q> D®¨*Ô·oß /¼ðàÁƒ‹-’ï¦Àßÿþ÷Ÿ|òÉ~ðƒ‘#G*Ž2/Ô‘!C†P t‚Z`NP Œ›9sf‡î»ï¾O>ù$‘[ZZâWGçÎk蜩""»víò\ ‰˜“Ôãú÷ï?vìØo¾ùfñâʼnxÏ=÷ìÞ½ûôÓO?ï¼óT˜'j€ˆ¢9BMìªB-P¹Y³fE"‘{ï½wß¾}"ÒÚÚºxñb™;w®êÐòG-aŽPǘ#4'Á¨Æ}ÿûß9rdKKK}}½ˆ¼ýöÛ{öì4hЈ#T‡–?j€s„jZ âÁ 6ˆÈ_þòñ¢æ'j€s„:F-0'[¶l F-0î´ÓN;÷ÜsãW¤÷ïß?tèPÓ÷ŽZ Âýµgh-0¦7kÖ¬ÄcÓ»€âY-ñU0Lyy¹Ÿ›£˜«×ï¿ÿþßýîwþÄãŠ.]º´´´téÒåÖ[oUK®»îº &¤,ô¨H „a† R[[ë[GA¹3fŒÏ[t…“Zà'Ÿ|Ò·oß«¯¾ÚŸ ·qãÆÉ“'ÿú׿>ùä“UÇâÔ=÷ÜóÉ'Ÿ¤/oll\µj•ëAR c=.píÚµ…ÿò;%m 8pöìÙ³gÏ.pµþ8pà-·Üâúj/¸à‚›nº)Û³•••K–,1®#ØÔÔ4yòdÛŽàQG5pà@B*ÜÀ÷íÛwÅW¨$uuu—Çk¤@„]}}}YYY¶g÷îÝ[ZZZ]]ígHÙ˜Ûƒ´°jÕªÄ2ª««‹ÏÎe– LæÅ9ÔµÀ²²²3Î8ß`BèÍ7ßܼy³Eƒ×¡ãßçE®/0.ñ}ŽPäÊÐq™#4¨ˆ0.P{†Ž j-00¨"¾ D®¨ ÔæÕµ@xZ âû¡ÈU°k&Îd–lC‰¨"ÔµG-^ ˆP Ôµ@C9œQOÕÄ{ÔÆj/œµÀH’ÄÝ‹Ô ý¸@‡ß­ ¿‚ƒ] L—~¨ƒüb±˜’‚(µ@@¤°Z §ê>m-0ö­ŒÏ¦¼÷Ò—gkcÛÀvŸMn–þØ"NëOMÞ»i«¢¢‚Z g-0ýÃìä§ð‡‹¡ª&ÞEÉ<‹¥ä°Œ•ò¥ç ç l7‘þ·Ù÷)Oníf6={ö¤:.SõBvÓ‰ÖÓßN‰÷X$)G¦¼÷Ò3DÆ7§mÛM¤7ÈmÆ•Xÿ­Ãl÷µ@@$¯qÉŸÏÄÂôù Ûª2þ׺í&lW^8·vÓBØjNXd5ë…ÎØnÂâÍïWv3j€Hµ@NÕ}8U—×ÕŠ¤±nŸß‹«GãI0Lyyyq±'5lNÕ]Ùt¨jq^ô×Ã,ãÛq€ˆáãª.!«¦t£ü¿Ä-ßíܧwâ-ê¾ÙäZ öt7©"Œ äTַ݆lÙR`'#ã™MrŽLy6å"|¶¶ 2n"y[18Ü IK™÷¥Ý´E-Y·n]®µ@NÕSÚ[ü·p†Ö£Ñè®]»òøC‡…[Û?)„í ³]î¶¾ðžSœ^ïf¿~ýª««ÝZ[ãa˜ïh“ñ?öí@®ôgÓÏa3.±m`± ùöË¢“½H_žr&^ønÚ&¡¬JEbëz°“cpòòY´qøêç½›¶zõêåÅOvýëztN°É¯È©z¶Æ®ïf¨jp]ì» $P D ›#4ÛåÇŒ ¬—§,±m-†ô —SNVž¾’¼wÓ skÞ Dá¨"Ü/P{æÖxÜ/á~Ú g-^c\ Rð¡ðµ@xZ ’סðµ@xZ B-P{Ôáj€µcçÞIDAT@íQ „<ª’a˜!C†ÔÖÖÒÔÖ˜1cT‡‡µÀ>úhýúõ>ÄZüqÏž=Ó—766®ZµÊõŽ )†)d\ |PYY¹dÉã:‚MMM“'O¶îöéÓgõêÕUUU¾E¶yEþýßÿ=}a¼H DØÕ××—••Y4سgOCCƒoñ„ÍÖ­[­ÔÕÕ-Z´ÈŸ`\ää~'Nœ8q¢?ñ¸âúë¯_ºtéo~ó›)S¦¨Ž¥PÔ›Z`Ïž=[ZZü?O•±cÇZüðÃ]t‘‹«õÁèÑ£Ÿxâ‰Ç|Ô¨Q~n7ص@¨âQ-A0 ãJ¹Wœo ØÔÔ¼qAê2.ñ}\ ªDb.CÇ:©B!Æ"¾ 4÷ ZUò¦¨ õ™#É÷~¢ès„ Ì ˆø>.ÐÜ ¡ÔsÈ9BƒÔ ¤ˆ0G¨ö ­2G¨æˆ(ªÒ tŽZ >‚Ô ôh\ ½@FI-ÐDªR µ@xZ B-P{†Ö¨9j€ˆ¢q&R•¼ ­2.Psýúõ«®®v}µÔa%÷ ¤èµ@}©Ø«W//ºéôaŸkæ^¥˜jš£ˆp¿@íQ ÔGzÔæuŒZ`N¨jŽ9BEµ@1.0'Ô5Ç¡€µ@íQ ÔGÞ·ÔEãMÄ¡9 d-0ÎÜ÷p2j€ˆ¢9Bƒt6í5júÒû–Z ¡ŽQ ÌI kqÁèR D˜#T{Ôõaâ©[6ÔæuŒZ`N¨jŽZ "²nÝ:îè㢨9ø|µÊô^ ÿ¨ê&½@ <Øÿq&bŽÐœP Ôµ@@Dd÷îÝþϤ¯¯Q Ô¹§qɨ"Ìês„æ$ÀµÀ`¤@Æ"̪=jðãæuŒZ`N\ F/Z Âýsĸ@‡\ j€µ@ÇTûS ÔGzýúõ«®®v}µÔa%s„šˆ9BsB-Ps½zõò¢›N/†Q2G¨‰½@U¨ê#H½@j€s„:Æ¡9ijjòâ‡p µ@@DÑý᜹µÀ]»v©ŽÂeAê2.á~ŽQ Ì µ@Í1.ñ}ŽPäŠZ >‚Ô ¤ˆø>G(½À\Z ܲe ãuf|-ÐÄ/hˆq1GhN¢Ñ(ãuF-aŽPíQ „¨"Ìês„æ„Z æ¨"̪=Ck̪9j\…aêëëËÊÊ|Û½À\ÕÕÕ-Z´ÈçÎù¡Ë–-ûÕ¯~åuî¸ãL¬E9¤°?ºråÊO?ýÔ¶™¡µÀh4¼9Bƒ¤¢¢‚Z ¶W«ºuëÆE*/”——777Û6 |-J0.Qt¿@8Ǹ@xq€ãµÇ¸@xÁø9BWp¿@Í:G¨óqæþ<ØhŒ D¨=jðµ@@„ûjZ ¼@-ñý~È•¡µ@Óï‰D¼žȇMX ˆP Ôž¡µ@å÷ Œ$Q†¶¨"ÔµŸ³Z`®Òsžæ/±Ô¥ã#Y( F[Ôó‹ÅÒÓ^ÊÛ,ýgýlÊlä· P D¨=CkªÆ&I"ù%¸žcRVhÖÙµ@@Di-0ö­ŒÿÍé\ÛÜ“q[†Ö ôBJç/ù¿éOY,‰%ɶ¶”7­+›ðs„"&ÔÓϵS¾,lZ ¶Rr¡n'OÖzöìI-ÐwŽP‹smیۢ/P DL¨Úæ$‹Ë\`h-Pí¸@£«tþ ˆˆ¬[·Žq:3´¨j\`ú_Ò “Âa‚L¯§ž­ÿ6¿Mx‡q€ˆƒûB-jyË5-Ù–™mWbûçylÂ#Œ D4®:gôɸ-j¹².úŠåïE-ZW£Åò‚|Þ›ðµ@@Di-0Û …Ämd[Uú‰vúx‰lkÐ'ùÅQ Ìõï›RžÍö{+ÛIY4pk¡ˆ¢hôɸ-jðµ@@Di-Ð:ÍdÌLy¬*¿,¨jºI¹¡ó›Çµ@@$µÀ`£/P DL˜MÆy΂ÇÐZ ª9B} °€ç"j€÷ Ôž¡µ@µs„Âs„"&Ìš¹'à9¡/0G( B-P{Ôáj€ˆÉµÀ /P D¨jZ ¼@-1¹a¨nݺõé§Ÿö4žPÙ¶m[=¬ÛxT $Â0C† ©­­¥#¨­1cƨ!Îk'œpÂ+¯¼r÷Ýw{R¨Ø~¢W­ZåzGÃP Ô\eeå’%KŒënÙ²eòäÉNªMãÆ7nœ!îœsÎyî¹çž}öÙáÇ«Ž¥PñZ )aW___VVfÑà“O>Y³foñ„ǦM›ŠŠŠl›ÕÕÕ-Z´È‡xÜFwíÚ¥: —ÅÇácæDìjGyd§N–.]ê[<àü+ò¼óγm†Z üçÑ¡¤@ƺ8lذaƹ¸¹… NŸ>½ªªjÁ‚.®ÖÕÕÕóæÍ›7oÞìÙ³ýÜnàk R/УZ ƒ"`j9ñJCÇ*¿_ ¬1.ñ}\ ¹÷—Quîoè¸À@Þ/0H½@Æ"Œ Ì‘ÿÉ›Z ¼À¡€ˆïs„šÞ ô?ræÕGzÌ ˆP Ôµ@xZ "²nÝ:jN¨ŠœZ >‚Ô d\ "âóÕ*ÓS ÿ¨  ô¯Œ3(ÇýsB-Ð!jš£ˆø^ 4÷ëCUÿÕÐZ ÷ Ôµ@@DÑýM¼ªŠ¡µÀ@Þ/0H½@j€ˆïãM¯2.Ð!jš3¾¸‚Z`N¨:D-PsÔEµ@s{þ3´ȸ@ÍQ DÍj"Ææ„qšëׯ_uuµë«¥Ã(™#ÔÄ^ *Ôá…^½zyÑM§Ã(™#ÔDÌšjš£ˆ(š#”^ sÔáj€÷ tŒZ`N¨jŽq€÷ Ì㢨9Æ"Ü/Ð1UçþÔõ¤^ µ@@„9BcŽÐœ0G¨æ¨"̪=Ck̪¹ŠŠ j€š9BMÄ¡9¡¨¹ž={R ÔÌJ/Ð9júR/Z ¡ŽQ Ì µ@ÍQ DÕÍŸ@‡¨jŽq€÷ tLÕµ@xq€ˆÇµÀööö”%Ù‰ÿ“´åŠ9BsB-PsÔÏj_|ñÅ”)S²UƒÒÉÕW_}ÞyçmݺÕõHLG-^ ˆxV ,))yôÑGëëë×®]›¼<ãô|°bÅŠµk×ê|”9BsB-PsÕI0Lyyyq±û5ì®]»ÞrË-"2gΜôgSIMMM4?~ü‰'žèz$¦£/P D¼¬^sÍ5½{÷Þ°aÚ5k ÓÏ wìØ±bÅŠ¢¢¢Y³fy†[¨æ„Z æ¨"^Ž ìÒ¥K¼#8wîÜ”§’É‚ <8~üø“N:É‹0ÜŸ@‡¨jŽZ âñ¸À«¯¾ºwïÞ¯¿þúÓO?_’Ò—Ú¹sgmm­þ]@QwîO-PAêöëׯººÚõÕ’ajq]ºt™6mš$US¾>â]ÀŸÿüç}ûöõ(·0GhN¨j®W¯^^tÓI0ÌàÁƒ=#tòäÉåååo¼ñÆSO=•XO$~ø¡)]@…¨ê#H½@j€ˆÈîÝ»=–Þ¹sçDG0‹%},\¸ðÀ^xa¿~ý¼ À-Ìšjš£ˆø2GèUW]õOÿôOo¾ùæêÕ«ãKb±ØG}tß}÷uèÐ. 5júR/q€ˆÇµÀ¸DG0ù§¡ñ.à¸qã***<ݺ[¨æ„Z æˆøu¿À+¯¼òÈ#|ë­·6nÜ("_ýu¼ 8{öl¯7í.Æ:D-PsÔ¿î˜èþïÿþ¯ˆlܸñ›o¾¹à‚ ú÷ïïõ¦Ý¢ê‹ÏÜZ  ¸Å£Z 7K‚aêëëËÊÊ|ØÐ•W^yçwîØ±CDšššŒë*œ#tÑ¢E>o´p­­­»vírÒrÙ²eK–,ñ: 9Ü 0`„ Þã®›nºéòË/ÏøTEE÷ ü»_`§Nªªª¦L™""mmm\pÁ€üÙ´Ñ_ Ü»wï Aƒ¦NêuHas×]wíÝ»7Û³={öô¢›N „a† R[[kû£ÐÕ«WWUU¾¹DÚÛ´iÓÉ'Ÿ\ø =•Òçëß¿}}½[™{üøñ3gδm6fÌW6糜jeeeœ¹ÎúêNccãªU«\ï’a‡µÀ/¾øâ¸ãŽ[¸p¡!…ÁÊ•+^'¬¬¬\²d‰qÁ¦¦¦É“'ó£PmÅk¤@„óZ`·nÝ8UwKyyyss³“–æÖƒ7.0H<H „a|«"?¯B Æ"~ DÞ/0.ñk\ òfî¸@æÕs„"¾ÌŠB0G(¼PQQáÅý©Â0Ô5G-^èÙ³'÷ ¨êŽZ »"‘HÆé`"ß•ÓßšˆZ B-P{ÔmE,ùƒq¨"¹Ôù6Q‚Z »b±XƉ^cßò?$%˜#ѯ˜m6ꔜñ«JÕLÖž¢h+ùFɯ~ò{ÆÉûÇB¶UY¿Q³“rÓ¥lÍòŽÖ æ¥ÃøP ä:U!¨æJÕû*}»ÖuÇäÿ¦<ðµ@@D¿Z שR˜[ Tr¿À”ÎVâ Sàû'ãª2öÞÒŸMtOS¶nûV÷ôÝ„Z gÐ(œÃZ`!o6Û¯qö{<ëð’O¥-Ö“íÙôå¶ÍüéÈš[ t8xNkÒ“œmËlŸ…lϺ…9BµÀˆ¢Š]z®ÊIzÚK)Þø‰Z`Nb±˜Â¾ÃMg{ó'ÉT)ts„"¾ ä:U®¨æÊ·—Æ ;…^lˆZ ¢_-ÐS]§J0·†9BÓ¯„Ç2Éum>œc¡Îç9BÕžž;,ãY\§J_•'&1·èÛ¸@Û núòôfN*Á)O¥\ÒH6¹YÆ•;_¿ë¨"*jæ^¤’´]’T)ôµ@}¤“_z ÆÔ{ŽPs¯S%P ´åä5ÍØ&%å±çÁ8Y¿“ÜB-ñ¥ÈuªBZ ܲeKj梈ë~ÙÎÙÓ{ºQwZ ŒF£zΊ8æD|©:I¶mfš¼×ãJ^ /0G( ⸨äÛB-Þ ˆ„l\ ‰¨ Ô‘`Õ‰Z ¼À¸@@D¿û"µ@xq€ˆÈàÁƒ<.0¨ Ô‘Ý»wS Ô™¡µ@U÷ „CÔjÚ3´èü~P‚Z B-P{a¨nݺuÍš5žÆBÛ¶mëÑ£G¶g=ª’a˜!C†ÔÖÖÒÔÖ˜1cT‡çµÀN8aýúõwß}·×!…Å纱±qÕªU®wI0Œóqü1§ênÙ´iSQQ‘“–•••K–,1®#ØÔÔ4yòd'ÁqãÆ7· wôÑGôÑG;wî<úè£UÇR¨x-ˆ°[·nÅÕ’„£Ž:ªS§NK—.õ!¤8ÿüó4«««[´h‘×Á¸ÎÏûúÌŸéѽF-qxµjذaÆ ó:¤ C-ÐAš&q€HÐïŒ ÔM0zŒ D˜#T{æŽ Þ¡Aê2.a\ öÌH-PgÜ/a\ ö¨ê#H½@îˆP Ôµ@Ý£H-¡¨=Ck¼_`zÔjÚ3´àû£ȸ@@„Z ö¨ê#H½@Æ"ÔµG-P7ÁèR D¨jÏÐZ ã5G-¡¨=CkŒ ÔãjÚ£¨ õˆP Ôµ@Ý£H-¡¨½ÊÊʯ¿þZu9c\ æ¨"ÔµWWWwàÀÕQäŒqš£ˆP Ôµ@}©H-¡¨=jº F/Z B-P{Œ ÔGzÔjÚc\ n‚Ñ dŽP@„Z ö¨ê#H½@æD¨jZ n‚Ñ ¤ˆ|[ ܹsgCCÇ~("š?^¿~½§íÝŠÇ­í^vÙe†ÖÑøöÛo744´´´Ä¯_¿>yyÞׯ_Ÿq)ëO´±Xg¶6ÉË[ZZâ½À×_½øSÖYH<Îÿ6ý˜xT ”˜_ÆŒSWW—ñ©Q£F=þøã¾E£}úé§ÑhtÙ²eƒ ª­­ÅbÉÿð‡?Ø>^¶lÙYgeÛ&×å×™¼Ü"Îä6Ûçºy<Îëlnn.ìEV`ûöíguÖûï¿‹Å&MštÖYgmݺ5þxРA‰åɓ۲ÜÉú®39æ­[·vïÞ]DN?ýôlÛ²ÝG‡qº²‹Ç[·nýüóÏçÍ›—ñµ+**jmmÍöÊ677‹HiiiúS"‰ùu±xìØ±'N=ztúS£G¾ä’KFåO$Ý»wonnþÇ?þÏ…AU\\|àÀ¢¢¢ŒÏîÛ·¯[·n¥¥¥ñ\˜,‰p!‚,µ@ ˜|»Èg.R ½@ ¤@&z¶üK¼à?zèBŠÁôÿ‡¾Ñ ÌŽ)R ½@[¤@@H‘ ˜èÚ"BŠÁD/Ж.wollìÙ³§ê((Ãì®koo‘W_}õCQ‹‡ yçh‘+**žzê©§žzJu ÑhTDfϞݡC/øqÆy÷tµH555ªC€ éܹó7ß|óâ‹/vêÔIu,š ò©„Ä—_~™¾0[-pÿþý~ÄdR ˜íþûï?ꨣž{î9'ßxãòòòÚÚZ¯£2)̶k×®/¿ürîܹ)Ë3öçÌ™³oß¾¦¦&ÿâÓ)ÌvÍ5×”••544<ÿüóÖ-ÿò—¿<ýôÓ‡vØ/~ñ bÓ)Ìv衇ÆSÚ¼yó’—§÷çÌ™#"×]w]YY™¯!êŠÆ»öÚk{ôèñÊ+¯¼øâ‹ÙÚ¼þúëkÖ¬¡ ˜ŒÆK$¶äŠ`J/0Þœ2eJ=„¨%R Áu×]×£GuëÖ½ôÒKéÏnذá™gž)--¥ ˜ŒApØa‡Ýxã’ÔLî&º€Gq„²õC €€ˆg¸úúú—_~9yùk¯½¶víÚÒÒÒ›nºIQhš"@@”––Æ;‚ñŸ†&zñ.àÔ©Sé¦ ú„û•ðÁ”)S?üð—^ziݺuñ%¯½öÚ³Ï>Û­[·xvD2R`ªH$bbºÒ3ìHWÖ£p €ºuëvà 7ˆÈܹsã½ÀDððÃW›†´Kn}iæÍ‹›–E"¯ï…¦ç½Öbß*d%ñ£—ß»¢ð5HÚ;ÓÐlê$lU»ÉDI$¾ñh§NÚ½{÷ÄÁçŸ>‘‘B»èÊ—&#åì!æÊ’“h!yâ/Sì»8ÔyH$¼Ä;ÿ†n  ˜‘v)0.þŒw¿]@x-å ö ªÕÞæ{ #ïu¼#ܽ{wº€Ùhš³I¾ eq©ÄöBŠ“‹ZnÂá.¤,,d/ #ÝL9€ù…aKù×q¶3˜”…¶Ê¢Má¯EÆylÅöu,d7 çð-Wàòb 9j‡G2}Éͺwï~ýõ×Çßpà ‰tˆZÜ5>EäÛ/ø `úU¬”…9ý7c‹òÛ„ÅS)»ßzâq¢±+{a¡ð#™ˆÙ"l×y½þüØ(ëCíÏ»:ý=–.ÛV]ÙÍü¤(±{Ë~ ¼XCú~YêüÞ’vZvà 7,^¼¸­­­¥¥¥ºº:Q`ÊãAÞèçƒlÏF£Ñôƒœ c ´•òJǾ›)SžM‘-'YoÂɬ·k±þô?´Ý„ýÈ)Œ”­8ßMë}q‘ùO²(ÛÈ y˹õ~°àÖn:Ùí ³½å ?Py|ºmµ+ŸÍd_îÃ?ü¬³Îzî¹çî¼óÎ\·Ú¥ÀŒ§–9}®Ü}·² =¿²s÷;´@¦Ìùð®Ö„ÿa§lÑöP'ç›D‡#§¾¹å–[N?ýô’’ÉT‚Iy`ý¬Ÿ¼Xgqqæd§] ”¾yÓ¿(½ø7ôË%WúìfÈóŸèôZž“CÜ­Ìø'¶ ü1|øðáÇ+Ù´)ôú9Lä»?=Oð"yom·¤IŸß ÙÞ~&¾'áŠä—>ã”mèC¯èPú.[²Içe|¿æô-| ùm"ýúpJƒ<6d±vÓ ‡g±Ù{†‘-*Û«p¶¯EÞ/–óÔ‡Ý,\~œ<ޤíqóô“âÖÇ¢Õ…ÐÄu[I»Œ –_:oñØ·¿­JnfñçÉa¤Äà0€ôh³ífÆ}â±í&²íiNßJÖ[qr ä»?‹«Ð‰ÇÎ#L~K"½6“럋ånøŽrå-gÛÀ¶™í‹UøÇZÊËñc•jN¯…+ _‰õ¡Îïý@ÌF)0Û[ÍyãŒOå´ÚŒOåºká9‰ÜáªòŽÇù³N6W`/ÁùŸçz¬\¦w”[o9‡û˜ÇgÊI‡{‘ßÊsZaáëqòZÛм?;^!™‘B5§á"@:R ˜Óî¼it!Ô‰ŒõBÝ(̶*¨h~$d”òç#œ7ÃR ¯´>Té(Äç×-\„)R¤@@H‘!E „)R¤@@Hý?µ›/²TJ5IEND®B`‚mod_perl-2.0.9/docs/user/handlers/connection_cycle_all.dia0000644€ÿÿÿÿ00010010000000401311727205031024026 0ustar ????????None‹í\]oÛ6}ϯÜ×”æ§HÎK†¶À°+V`ݳ!ÛŒ£M– Inš=ì·ïRrãX–[³¹•݈MóˆϹ÷ò^úÇŸ¾¬"ï³I³0‰¯Fá‘gây²ãåÕèO?¿V£Ÿ®/~\„Áð™+¾gö¯«Ñmž¯ïîîPtŸy’¢(Ü ÌŒÿ ¢(C£ñèúÂów°òÀ¾·}7Èó4œmrãÅÁÊ\fÁü¯ešlâŨlµm7O¢$õ>ÑÕèÕMñ·ÝŒ÷úy¢ïu°4³Ô5wá¡u›®×&­v»Z'YMòûõA“†~ìë£6ÛV4ЗםÞðWå%mߨõUw¡ ù*H—a|ˆs•A‘¢”Âd­4–\’¯sr:Üìeᢗ…K_.̦ë$ÍÓ Ì!gI™ .QótcÚãdó ‚%öÔ°:Œâ&Ìóä™ë¿ ¢ì˜”o?°íTæ.Ópñ4q÷Z4ôr.òÛéGÓUö~ï¨÷ÏaÎ"Swõaœ÷Öý}?ÝWïN¡Þ»¯w\ eoæa¡Œ0âtó°Ü„ “=³ÌöÛ4ôt»m6~n֫페ò­Š±. ¢àÞ¤ÛîßîÌ´·½Á[Åy4 ÉìO3Ï·Ãû=âE.¼×ÞÛäËhçu€Ï.®F¿áýé©:å;˜Ÿu²[DqrÉ}¤$'ÕÊFÈlVÅHaA¼ŒÌ“ãd"0â\ÉK¡Æ¾ß×Df5'i|è!ô;À¨“ÃA~•Æ‘ÖJbMøB\HÑëÖ„ËÛ¼Œ£-fIº0ésãÁ+¼ÿ íðÂnÐt_#jTb®ì³Dv›ÜMkœà#,d½wLlMMÒ™šaX¹ùŽ© $T¢âšL€*Œ‹K!‘Ä-5»ðjR‰éa!GMŒ¨ \?<¸c–Š K™S–šûtÏÒ}?ÜIiW’2ŒØ1‚ñ¥C’ZËJ‚¤&rÂa™Ù?’’r—$ía€Çxƒ±f·à‚£H3, §þ‘oŠ¢‹¹}ž#E cSÃQÖ•£TïI-I†…C–Z$JˆEb Ë ‡2Â-O‰b-ïû<‰ã©‰ňZ³‘ÕÐPµ´†ñf5_W/¦.6=‰¾ñb¤irWíØÜv{žF&^>MX¾OWºB>+-íÊ€lÉáë'Þ-ðËš@§<±~)y»«Û _&Û/Óýï²ÃP¹rEýHï*Ö^ÒNëý(þ ñµ.ù/Ô„S;!î-ø/´cþײ¦Ý[e¤l)ÔÀÿïŠÿ óSèO*_Æ/ÄÑ™ÿIL;.ùã$€#_UH€dzá-x˜ºÉ¹k hgMSùÕh}p®>môúáñ'ó%¯á±ßÙ•6ê_ Xç»tåÅBN¨¶®<³ûb„´\€¹•gR3•6MZ‘ËÞkWI{¿{¸ƒïãõ&¿ø9Œr¸ Éð'2HMéÈ$Îë.À¾ïÝ«0º·ÂµIC›1w#/Ëïí"T°Ê.Þ•Ÿ¾~›D‹ÇRuúÅ„üµÓÍ;Úm@÷—êI˵ \5òo¬ÅÀ¸P…ËxeêoïN…É‘(µI´~v dFvvâ~yß´t*3œ< q 2Ã⪔柗Ìü¶Éùot¦q½:ãrgRuNñ)TîJßiöpl•E" ³ õ‘à>±A cX9JFYc.}Ä5ë¸Qû %Bï?”ó ¤%âIA iؘìgsá]˜Í ðÇwÞ‡ ®!±î¡„F*í_rm·ß¥Û") h·H¾¯'@,Å1+Ò€L8®¢é>Æ£êhfÊçÚç‚s©çÜúXT &'¾Æm“õ˜‡ç¹D*^éfMñæÉ4`Õ@ŸqFÑû%åÿi¦ñ©¹*ÜÁfÝÆ©¶@ô¤ù‹Âõô6IÿÁG ¢ÎõHOÁ€žåá¼^Ä”t.Hä>ÒÖ•¥ñ‡^€Dy‰ä+i‹1aÔ:јùÊ¥œö2ÈAN9äô¬åô~f@)0Q^ƒ>˜ejÏ„ÕIkç‚Ò‡ðª("sYR H„Øx“ &T!.„*UêRX{âQõjHC,™ñ³Liå´`­°ïTX_ª´|ÖóÖÎEÀ5@Tîs—>+Eœk^è Ml¾_ ^ æÔgícƒ´Ò:Hë9KëóÙWÒ¹`›‰m!£v{ò‰Ät‘n`˜ø¦öeqªÂ'šüÿ“¯Ódn²l—ƒý~“®ÄuеaM V—G(yg(90œ+›ÉrYùmd#9µÅbB^ Œ„àÚñÊÎãŽg dzº˜ûÎÅÙ”#\$5ujî))ÎP`î©D˜Xs÷ÏÃÜ›ÁÔ¿€©oXƒ©wYKEüdD”ÇŸË·¦Þª†ÔzbQ;£8þ€gý‚ÿAÛšê^ʨÚÕñý: ÿ…'ÙÃ)CŽ·î˜ãßì(¢U aºr|Œµ½åì,B×7ë`~kÆ«d1]›4ò(ÂÞijyÊè½_­ÁS5 þ¦®jé¾#׸V3çÔ[V=lŽ1{ãwý›] ÄD”H´Œ¨ 2‰³™_>}úxéýþÁ¾¾ÿð^M>Gƒœ¸Ù«_•ƒœ''åßÅÏ^_ìýžàõſѩ~sXmod_perl-2.0.9/docs/user/handlers/connection_cycle_all.png0000644€ÿÿÿÿ00010010000006140111727205032024062 0ustar ????????None‰PNG  IHDR½ñIC˜±sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy ÔÛÿ8þóš}ì{)Z -¢¢ÐMe©ä†´i!*J]KW‹’­´)¤½nn*QHJ´i‘VB‰RÉ’mf˜™×ïóýÌoÞ–1ÆšÎã¯1¯í9ƒy=ç<Ï‚ ‚ ˆp0€––ÖäÉ“{:AAz/‡…V®\ÑÓñ ‚ Ò{±X,Fèé0Aùe ¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa‘z:€®âçç÷ôéÓžŽA鳜œœ{:ŠîÖgó†gÏžikk7®§AAú ØØØÜÜÜžŽ¢ôÙ¼0nܸ™3göt‚ H”ÝÓ!ô Ô¿AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAa¡¼AAaõåù"AºÔ¶mÛ^¿~ýï¿ÿvä$>>>AAA`÷îÝÏž=ë`T"8tèPIIIqqñ™3gÚu`\\ÜÙ³g555ÅÅÅ7lØ@¡P„9*"""//ðxyy‰2" ÔÞ€ HŸèãã3uêÔmÛ¶uõµTTT:r†ÜÜÜž¡¹¿þú«ÓÏ)Œ5kÖ©ªª¶ë¨W¯^mß¾ýĉóæÍÛ·oŸ0Gݽ{—Íf‡†††„„ÐéôÔÔT‘BFDòAú___SSÓÚÚZ‹ÕÓá´!&&ÆÉÉ©§£èI7nÜptt”””¨««ýúU˜£®\¹âìì /[¶ìÚµk]"ò¿PA¾&66ö?þøþýûÍ›7çÌ™Ÿ |ýúõ„ òòòdee'L˜ðçŸòŽŠŠŠ*((Àq¼®®nÉ’%zzz¼M †±Ùl ø\îÞ½{á&.—XSSS^^îáá1zôhø|ccãþýû¿ÿ`2™–––Í—Ù+))‘“““€?¾ÿÞÙÙYWWÃ0iié¯_¿JHHhii­X±îpùò匌 *•Ê`0ŒçÍ›Ç;Õ•+W233) ƒÁ055mó-ün>((¨ººº¸¸ØÇÇ'22’F£Á'Û¼bk¼½½y¿|ù"---ÌQ†Q©Tø˜F£ñ#Ýå ‚ô5 NNNõõõîîî¼¼ÁßßßÜÜ\FFæðáÃ𙨨¨„„+++ø#ïöŒãøºuëxyCbbâׯ_y·Æššš 6ð®UXX¸råÊ‘#G644x{{ïß¿>ðàAGGÇÂ>üøñcþ8£¢¢ÜÝÝy?ª««4hçÎââ⎎ŽQQQbbb¼U^^<~üøÕ«Wá«KNNþñã/•‰ŠŠÊËËü ~7ïããppp8þ|pp°}„Áb±‚ƒƒwîÜ)±D"±³Â@Ú„òAú”ììì ‰†††²²2EEE¸ièСK—.åí¹bÅ ///x§d³ÙÇ/,,$“É¿µ<99™¿è.))ÁûQMMmäÈ‘ …Â÷JLL„ß×!6›M¥Rùó†òòr€¼¼<ðŠŠŠâââeee111ðÿªÉ©©©¼¤àâââáá󆤤¤ÐÐPþוžžÞæ%àÝh3x•ÀÀÀ6/!<6›ý÷ßoܸ‘×ú"‡ÃáÿÇñN ì7Í~ÛuÓ‘n ££ÓÓ!üÖN:USS¿³X¬ØØØU«VÁMÍï.\.>عsçŒ3x{ò÷ÏçíÃaX›a()) n½ŠŠâUè{„€w£Íà;±™À`0¼½½ÝÝÝ…ïSÉårëëëajÅb±Ølv'ƃö›æ fff¼2$‚t¢W¯^UVVöt¿¯úúúšššèèhøcCCÃÒ¥KyÙÀׯ_cbbx_²?>mÚ4ø¸¬¬Œ÷}úÍ›7%%%¼sêëëŸ:ujÉ’%ðǪª*Ø•Op$ãÇ?{öìÂ… [ÜZ[[ûóçO^!@fff‘‘‘¼T#::ÚÌÌ >ž>}ú‰'–-[ÆÛôùóç6O(àÝ|ç*((ðôôܱc‡¦¦& ¶¶¶I“úuë¾ÿ~òäIþN sçΊŠZ»v-àĉ³fÍê†P¬\¹’¿Ù­o°°°prrjÞ ’••ÍÏÏïæßššÊz‹‹K]]ÝØ±c7oÞ Ø½{÷7&Ož Õ}||FŽ™••%!!Áb±ŒŒŒlmmáOž<9yò¤˜˜“É”‘‘yò䉎ŽÎÆeee‘‘‘OŸ>•‘‘¡Ñh prr‚_¸oܸ±aÃ[[Ûÿþû/,,ÌÂÂÂß߀ãxDDÄÛ·oÅÅÅétº’’’‰‰ ¼5:4}útuuuþàóóóœœf̘±eˇ ØØØØÛÛÃ€ØØØÌÌLÆb±&MšÄß/2..îÁƒd2¹ººzôèÑ©©©:::¾¾¾Þ+à233ŒŒ‹-5j|øpáÂþÌÌÌÊÊÊ>|Ø$Ÿ +..&Ç_½zu›êt»wï¦Ñh[·níþK÷‹E£ÑPÞ€ å ½Y§Ï°$²-[¶ìر£gcè=ïÆ/ê·ÍÐü ‚ Ý­Ç“Êù-lÛ¶-##ÃÛÛ;%%¥§céyèÝ@Dö›ö‹DäwÐÓQt«;vÔ××7~Ú´i¿á»t”7 ‚ôM[¶léé>Õ)AÊAÊAÊAÊAÊA‡‰ Òµ:TRRR\\|æÌFqpp¸xñbOGñ[@y‚ ¿¸‚Ô”)S0 ãp8 ÅÏÏF£uäœþþþp½«®¶fÍ€0‹<5'nâ­µdÉ--­î£Ó‰öÎ >jñâÅ Êî¶dÉ’û÷ï£uÅvñ÷÷¯¨¨à­Ã”——·{÷î.)Ôâ\н œ¸©ï-@%Ú;/ø(kkkQÃAÚ§òƒA§Óy?â8^]]---Ýñ3÷S§Nýôé|L§ÓŒŒ:rÎÌÌ̃æääMM͆††)S¦lذ¡3âí999Ë—/¿}û¶””Tó­“'Oîß¿÷G…ô%#FŒà­;T]]]\\ìãã !x7ÚË—/gddP©TƒallÌ[{zÛ¶m=â}ù666¶²²â¿µ£ †±Ùl ø\îÞ½{Û<ª½ÿÞÙÙYWWÃ0iié¯_¿JHHhii­X±"00ðõë×&LÈËË“••mllœ0aŸþÙæ9÷ïßÿýûw“É´´´„‹ ¸–€£»vízüøñÈ‘#¹\î·oßÜÜÜ&L˜7 ~磢¢ p¯««[²d‰žž^›G8p ´´´µúKk¿"‚u(oÀqÃ0&“¹sçÎ/_¾”••©««7nÊ”)ÒÒÒ †‘ÉäΊõWäááqóæÍääd‰tíÚ5ޝ]»¶aÆþýûÛÚÚ666Þ½{·¬¬LUUµcî¸oß¾UUUUWW·˜7¸¸¸tHHsêÔ)ÞÞKΟ?L¡Px»%$$”——‡……Á?~õêÕ9sæ~þüÙâ÷xG%&&~ýú•wTMM /epTçRWW4hÐÎ;ÅÅÅ£¢¢ÄÄÄ<<<þþþæææ222‡†;GEE%$$ðߘ[tðàAGGÇÂ>üøñc×pÀ××wþüù®®®ƒnhhðôôäÝ•¼ó˜‘p_·nï·,à¨uëÖVê/~)"D=oàp8D"ñæÍ›³gÏnlläßD ,,,¼¼¼ÌÌÌpg2™ü ¿•Ù³gÓéôäääU«V©¨¨Œ1"  ªªJFFfÖ¬Yoß¾üóÏ?§OŸ~ùòå¸qã8 //Ÿžž~àÀׯ_KHH˜˜˜xzzÂÿLƒ±uëÖñãÇŸ8q¾¥õõõ¦¦¦T*Àår£¢¢Îž=[ZZ:bĈµk×NŸ>`ffV\\FÄöØ~ðþý{û˜˜˜lß¾}Ê”)l6›DúÝn\¼x‘L&›šš7ÙÂßbÿñãG6›Íkü„Š‹‹°ÃWuuuóóçååá8nkk $‰³gÏÎÈÈ(//‡Ïðú@À¢,Ø$ X†àoùäõ MG‚G~°[@ðññ‘àm hhhÈÌÌ„îE‹5 nš5kVll¬§§'Fc±X“&Mâ/ØÙÙ­]»VFF†B¡HKK/X°@IIIðQ‹/ŽŒŒ\µj•ŒŒ F0`€““S›×Úºu+‹ÅâE(%%%ä`HÞ8LX Y¼x±––V~~þ£G¶oß¾eË–’’’+W®ØØØðŒ=šH$®[·NBB‚ÅbñÃÓÓ3""býúõââât:]IIÉÄÄDSSSðµZ; °mÛ¶ÌÌÌK—.ÙÙÙåææÞ¿çÎ~~~‚ßù¥K—®_¿^LLŒÉdÊÈÈÔÕÕùùùmܸ6©¶v”€×%à—"8BDoçD"QÀ¨˜±cÇÞ¼y“Åb}ûöíÛ·oÚÚÚ-îVXX8lØ0Ñb0™L.—Ëk!ïÍš”óù5içTUU%W®\iÞ)DWW—N§>|8<<œ—ŠÈÊÊΚ5 šš:bÄŽã·oß–€ÿo"ü_ÍÎÎVWWp†æí¥­4hèÔà‘¾Çßßßßß¿ÅMÛ¶mpà¼yóZ×`nnnnnÞÞ£œÛu”ÈãEá8Ì&ÔÔÔ233áãÿý·ÉÀâÅ‹[œÌ@@†¹¹¹µ÷Z­€544î޽˿µµw^OOײ¹ÖŽüö¶öKahòÇñúúz2™Ü=58ቘ7°Ùlƒ!àÆ°páB6~üøk×®µ–TWW8pÓ¦ML&³½xxx <˜F£Á¦û^+!!áÆ€cÇŽ 8ÐÅÅ…×¥èèÑ£/^¼DFFJIIQ©Ô%K–ÈÈȸ»»oذÁÂÂÂÄÄ„D"¼|ùÒÍÍÍÅÅEZZ: ÀÇÇÇÜÜÜØØ˜F£=}ú4''ÇÁÁaøðáVVV¡¡¡OŸ>6lXVVÖË—/7mÚD&“ÓÒÒÑÑÑ .TVVNIIܼyÓÕÕUÀ&aŒ9ÒÀÀÀßß?--mРAl6;??ÿåË—©©©222€~ýú|}}µ´´JKK=z4kÖ¬-[¶\¸p¡¸¸øãÇð ‘’’ÒÔÔ´¶¶-øîÿm"‚t&“I£Ñ<øñãÇòòr6›=qâD###Xç­¯¯ï=ß1ÀÊ•+›4G·‰ÉdbF§Ó[K¢¢¢œœœôõõ½¼¼LLLš d³Ù, >þ[)‘H¤ÓéEEEt:N§ÃîMXXX899ñ7!++Û=óýñÇEEE𱜜Ü;wx¿{þ©d2ùÔ©Súúú€›7o=z4//@ 8PWW×ÍÍmÈ!pÏÌÌÌcÇŽegg744¨¨¨LŸ>}Íš5bbb°¬ûíÛ·aÆ-[¶ ŽÛ†1`¶aÆiÓ¦Í;—Á` 2äÖ­[6 £¶¶6$$$99¹¼¼œB¡¨©©988ÌŸ?Ÿ÷r"""Nœ8QUU5dÈSSÓåË—+))ñ¿®®.ì3!Bð]óë(555Þ¼ÒͶmÛvëÖ-CCÃéÓ§·Ö”‚t–Ý»wÓh´N>1 2™lee•œœÜdÓðáÃ×­[·|ùr ‰ºº:Ø3½§°X,&bÞ)((ð*ЉDb³Ù€„„SSÓ¬¬,“âââ&y“ɤP(ð‹¸ ÅÅÅ%$$rss•””zsÞ€ünPÞ€ ¿‰ÎʈD¢©©iFFFkûHKK;;;¯[·Vu{ Ì:´&o4?Ïùóçá|‘–––÷îÝ«©©‰ˆˆÀ0¬¬¬Œ78Ãüû÷ïkERYYÉf³Qç8AäWG&“ccc$ €Ÿ?þóÏ?.\趨èÐ0‡áÇçääð~„ÝOnß¾]]]••óåˉdjjÚâh{KKËaÆÕÕÕ E2™,&& ä‚ ò«Ã0ìÝ»wv ‘H6lðõõ•’’jllìñY˜EÏpŸ9sf\\ü‘L&}ýúuöìÙü©Àܹs544ZëÄ‘‘ѮѴóæÍƒåpAétðÇ0,..ÎÚÚ://OJJªµ¤Ëåb&ò,díš.Aô¼Á`8;;kjj~ÿþ=>>~éÒ¥jjjK—.mÒ~»Ñõ¶)ÕA¤—7(((X[[Ÿ={öÞ½{Gmq¸èFrròíÛ·Û{éþýû¯\¹²]ƒ5:T§àr¹S¦La0ptlTTÔÉ“'›ìceeÕ« ‚ H¯g´k‘¼¼<àÙ³g:::>444l²CmmíÔ©Skjj&L˜ÐÞ¥¹à¸H"‘˜˜˜hii)äQ¢ÏùñãÇÍ›7Óh´Ã‡S(”]»výý÷ßÍ÷9r¤#-Aä7Ñ|Ã0ÇÆ sss‹¿ÿþ¤I“øw“xÿþ=œÌ·½deeuuu}}}üøÑ…y\3''gòäɰi%===>>~Ë–- ƒ·Æ‰¼¼¼ŸŸß‚ áÈLAAš`³ÙMVèëëgddÔÖÖJHHp8œÆÆÆÖÕÕÁ©›¸yóf‹ó´)??_WW·½CÇÛ—7üüùSBBbçÎ[·nåeß¿711ILLܵkWMMÍÁƒÍÌÌ®_¿.&&öáÃÇÑâ‚ Ò"&“9|øpþgˆDâ™3gêëëïܹC Ž= ×^²d o=~ŠŠŠóçÏg³ÙíZ÷‹L&?yòD„€ÛqGÿöíN7nÿØKˆÉdZ[[gdd„……}þüùôéÓ,KLLlèС"Ä„ ‚ ¿ 2™l`` ##SUUŸqqq1bĺuëÂÃÃù÷ h>"ϤI“²²²„¿naa¡h ›7à8Þ¯_?GGÇæIT__?gΜ¬¬¬S§N‰‰‰õì\˜‚ òK€"ÓÓÓ?|øpçÎ.—òæÍ›Ã‡óïF$ ÔÞ•Ä»‚°yÃׯ_«ªªø—\k®¸¸ØÆÆ&33óñãÇííÕ‰ ‚ ¿¡‡>|̘1cÆŒ±´´$‘H?~ü˜5kV“9‘ÍÍÍ{IÑ_Øy¦•••wïÞÝf¦óðáÃ7N˜0õ…DAÁ²²² ÃÃí­­O:E"‘îÝ»§¡¡Ñ¼ˆ0zô艰9¡’—ÆÆF"‘/ÌÎûöí³¶¶611fg2™ § ©y—QÃ^ã­¼ŽW9§Ñh=‚ HŸRYY9~üø•+W?~ðúõëÝ»wçää|ùò€a˜¥¥åܹsX,–È·¼N$TÞðáøš”0;ã8îââòæÍ›ÔÔÔéÓ§ ÞÙÈÈèÇœ¶9+++ÑŠ=!!!¢]ô7´qãF€Þ1¡éêêöt‚ôvp^g‡cllüàÁÞó{öì)))9sæÌÕ«W§L™Âápâââ,--™L&‡Ãé I2o1bD»n………GŽñðð°†a÷îÝk­—¥`†††bbb±±±T*~n¯+VˆpÔï æ èCépz‚èèhggçæó"ž;wNVVöàÁƒ—.]úüù³¥¥%‡ÃéU-¾Âv²HKKk×yÏœ9ãááãx‹+S ò­ˆÃáçÄí$‚ ÒýÊËËKJJZL C‡3ÆÕÕ•Ãáô’Ú¿¶ûE666â8~ïÞ½v÷Ù³g%%%>lq+™LîÈäÓl6;''gÏž="ŸAAºœ::00PðMpÍš5ðÚÛ’ L{CNNF°ZW‹pwuumqkZZ\>ûãÇÙÙÙ¯^½*--mqO"‘èïïÏÿÌû÷ï•””ÔÕÕ,XŸd0t:½]"‚ H7ûðá—˽|ù²àÝ8Ž­­mvv6†aŠŠŠÝ›Úno=zô³gÏD8u||<@àO©êëëáSSÓ½{÷ 2ÄÆÆÆÏÏoêÔ©„V|ý_?þ|ÿþ=À×××ÆÆ¦¼¼<""‚F£1 ‚DAn3lذK—. Óâ^ZZºpáBEEÅÆÆFaÎL£ÑÄÚ£Å^Âh»½J¥Š–7¤¤¤<þ\]]ÝÙÙYRRrÕªU£F:{ölEEEBBBjjê«W¯àž†Mœ8ñÏ?ÿæ´ÚÚÚðÏ•+Wäååkjj6nÜ*B‚ Ò„ï/xëÖ­K—.ÙÚÚ ³szzz{#)++P©Ô5kÖÀŽƒÂ$Bõ‹|þüy{£°ÙlWW×8::ÚØØ|ýú5>>~ðàÁ‰‰‰l6{Ô¨Q'OžÜµkÜ™J¥ž>}zìØ±éééÓ¦MKOO1bD]]ƒÁ;vì£Gtuu322 pýúu==½«W¯R(‹µzõj‹U__O¥R‰D¢¡"‚ HWc±X†eff ÈúõëçÎ Çm¶¶‘HŒ¡× †aúúúAAA°ÐÏår;!oàr¹áÅ‹íÊÊÊ:|øðÚµkCBB¤¤¤FFFÆÆÆ¼p/++#‘H …D"=ZVVÖÙÙÖ8àkPWWH¤×¯_øðaܸq·nÝš6m€B¡¼~ýº¨¨hêÔ©(i@Az­?~ðJöÂ(--ÍÈÈ9r¤’’RkûØÙÙ‰Rcc#Ng2™4MÈÌ£þ ÇñŸ?Š“¿¿ÿçÏŸ\\\~þüùêÕ+//¯òòò§OŸ–––&$$|ÿþýÓ§O>|ÐÓÓËÍÍ2dH¿~ýîÝ»wóæÍÓ§Oûøøðæè–––Þµk×™3g¾~ýúÇp¹Üúúz Ãnݺ%))‰úE"‚ ½ÙÀïܹÓÞ£âãã$ D&“ëêê,,,„?¤íö††††ŽŒ–° IDAT™¬®®^·nÝÿýÇd2¥¥¥ÇŒ³cÇ.—;lØ0Ç'Nœ ‘HpÝmccc111€··7\T^^>((¨¡¡ÉdböäÉ6›M îìááQWWàp8¨ÉAéµÚµÔ5tíÚµÐÐPØüß|k}}½˜˜ŽãYYYyyyoÞ¼ií–m`````ÀÿLRRÒâÅ‹sssáœÖàÿŠ ‚ãi;o²'§—/_އ“^á8ÞâhT¸î¶˜˜‡Ãár¹åååðù!C†H$ìÿÉ`0ÈdróWE"‘`3KCEA®+ï"Œ3ÈÏÏûö­¸¸ø Aƒà3999C‡¥R© åÓ§OGŽÙ´iL *++ÿþûï§N¨¬¬l²^Ä»wï˜L¦‚‚ÂãÇÙlvLLÌäÉ“ÕÕÕ§mç ,«¯±îîî¯_¿...ÖÒÒj¾Çñ'Ožèéé±ÙìÆÆÆ©S§ò–ƒyÉÿ ‰^83‚ ‚ðÔÕÕÕÖÖò¾Ù·KHHHTTÔùóç/^¼hcc³téÒW¯^=yò¤¢¢ÂÏÏoÙ²e„{ÊÊʆ‡‡ yZ8wâÓ§O'NœH"‘lll¬¬¬®]»&!!¿Ì·¨¼Ã0:ŽaXGJ€OŸ>y{{>|üßzðùGM˜0Ã099¹5kÖÔÕÕÁ¢†aÓ§Oß»w/ÿyÚl?AA^ˆÁ`ˆ68pâÄ '''[[ÛmÛ¶-[¶ÌÄÄÇñ—/_¾}ûVCC#11±²²RVVî\ZZzãÆ UUU‡SZZª¯¯Ÿ™™9a„OŸ>Á5¥ utt®_¿Îår·mÛ¦¥¥‡ ˆ‹‹ß¸qƒD"a&  ¿Õ¼¡±±‘ËåÂ1êêêyyy¢½Zž£Gž?þÏ?ÿzôhtt´¸¸¸¬¬l“Y‹~üøKöuuu†††%%%ZZZúúúòòòZZZD"QGGî©¢¢"--}íÚµ}ûö±Ùì~ýú±ÙlƒA$³³³G¥¤¤T[[Ûî¼L&6ŒËåNŸ>½ãyàçÏŸÑÑÑwîÜQUU¥R©ùùù?~ä_ûñãÇãÆ{ôè“É#¨ ‚ô Mº´ËÛ·oƒƒƒ·lÙbjjÊårÙlööíÛ­¬¬ú÷ïO£ÑÞ¿¯¨¨øâÅ MMÍ‚‚ þýû‹‰‰Ñh´³gÏ*++¿}ûV]]}úôé99¹ÈÈH{{ûÉ“'щbbb$éÉ“'7nÜÐ××Ç0LÀ×uAuŠ«W¯<ØÖÖ6 àÈ‘#¼ñTXXÈë¾Ð@(++k±‚ ‚üº:Ø_p×®]óçÏ—••UPP “É›7o®©©ill$“Ƀ–044$“Éòòò\.WYY™B¡ÄÇÇ/Z´Éår«ªªètº‡‡…BILL455ƒýôôôôôôàΦ™jµ»@mm­ÝâÅ‹_¾|©  PPPàëë«¢¢Ò‘×,ØÐ¡CÏž=›——7tèP6›ÝuBAî×Á¼Éd®ZµJ^^žÁ`444$%%åää¨Tªœœ…B‘———’’’‘‘‘——§P(T*µ¢¢‚wø!CêëëÅÅÅá„l6ÛÌÌ NgÀßðÏår¹\®€ñ‰­æ âââ***cÇŽ544Œu]]†aŸ €ãø£GæÏŸ?iÒ$*•Šãø½{÷ª««y;0 ##£˜˜'''^q¤³VqÔÞÀ+U4y¾¶¶6 @MMÍÁÁAÈË 0`ÅŠ:::’’’ ,ðóóSPP˜0aBjjêׯ_›whàr¹°§¨ð/AAz¸ÆÓüùói4š¢¢â¼yó:ëÌuuu)))ׯ_OHHàO 2™\UUº`¾Ä6NWWWgooßüªÑÑÑeeeÞÞÞB^&**JUU–6jkkÏŸ?¿k×.¸EHHˆ²²2@——×ÔÔ455]¾|yPPÐåË—?}úD&“™Lfû_Ò÷á8×zéé@AZE§Óétºœœœ»»;F;qâÄåË—õõõ»núc°hÑ¢÷ï߯_¿þõë×>ΠÓñJ™™™üÏ3ŒðððíÛ·OŸ>=99¹ÍËDGGoݺÕÏÏ/66¶µ}******rssïÞ½Ë{òï¿ÿÞ¶m[›çGú˜ƒFGG·¹Û‡¢¢¢ž?ŽºÓ"Hp÷î]8aQOÒÉíìììììJKKOŸ>=wîܹsçVWWïÝ»w×®]ûåÇÜÜ<88XWW÷Ó§O€Q£FuâÉ¡¶×§€¥Š&yàСC›7oÞ´i“0yC]]]DD„‘‘QóS ìííM$;«0ƒüÊËË?|ø Ìž¥¥¥£Gމ‰122êê¨:ËñãÇ9ÒÓQ }ÓªU«\\\z:ŠØÛÛõ‡øöí[YYÙÚµk7nÜØ=Qu6›mee%..~åÊ}}ý©S§nܸqÇŽNNN3fÌ0b’’’‹/.((HNNnÒObèСÁÁÁvvv•••\.—·xf§k»ùŽªðòòj’UTTDFF®_¿~Ô¨Qp@„`ááá^^^6lhWÞÀb±¾|ù¢¬¬,ü!HŸ±páB[[ÛÖ¶â8+…?~ü˜={¶¯¯¯§§ç/±òYEE…±±ñ’%Kz:¤¯9uê¬ÿöB?þùó§0{îܹ³¬¬lûöí}¦~ïµ¶¶¾xñ"‡ÃyøðáǃƒƒýüüÎ;ghh(ä©×­[øñãGjjê­[·îÞ½k```eeåèèÈåry \u‘¶óXª˜4iRFFF“Maaak×®]¿~ýÊ•+Ûår¹êêê/^¬¨¨8qℚšZbbâ»wïààÍ›êêêÐT’ˆ0ªY HŸaggwìØ±öš‡Ãi±TQVVvâĉ3fhkk sžýû÷766úøø´ëêÅÅÅááá:—Oؼ¡®®nÞ¼y-Ö "##Ùlv›MÊÊÊ***t:½°°077×ÞÞþÓ§O^^^Ç¿}û¶¼¼<\£ùœ¨N´ ªY HŸ¡¥¥uòäɾQ³ Ñh4mÖ¬YÍ7Á)!GŸ–––ž?ÞÆÆfذaí àýû÷íÚ¿5ÂÞ%$$”••›o*))IHH°··—““p}}}€¡¡¡´´ô¡C‡ôôôfΜ©¨¨˜½ÿ~))©Öfh`³ÙB‰ ªY HŸÑ—j­•* ¯^½joo/ä¸ãljÄéÓ§·ëê5È ßã[+U"""ètºàñè€U«V)++;vÌÝÝýÇ>>>¥¥¥¸¸'h©½56 "@5 éKúFÍ‚ÃáXXXHJJ6ßtôèQ*• ¿í´éÝ»w€öRí¼A@©"))©¨¨ÈÕÕÞû[¤¯¯ÿíÛ·‚‚‚øøø/^,^¼8!!ÁÈÈhëÖ­‚¯K$…Aø¡š‚ô} f! T‘ššZXX¸råJ·QžŸ?â8Þb¿ŽŽNký$z o€£*&OžÜ|—Ë=uꔦ¦æðáÃ[<Ã0}}}"‘˜œœlffÆd2ïÞ½kkk{ÿþýÜÜÜ&§j"joè+Nž<Ùýÿç¨f }F¨Y´Vªàr¹êêêS§Nmó$ººº†½xñ‚÷Œ²²òÙ³güøñüùó‡ÖÔÔìÝ»·ÉQ=7¥Š?~Z›t̘1²²²ÒÒÒ\.—L&ã8Λ¨üõë× ƒ·@xóÞ (oè3Nž<©¥¥Ò|É×.…jÒ—üÒ5 ¥Š'N°X,aæ5€uÿ¬¬,‰ää䔓“óéÓ§ ÉäóçÏÓétqqñæ³M÷LÞתh±pÀáp@ë5…Ù³gÈdró$€ÍfŸ={–B¡À–†æyªSô†UVVîܹsìØ±ÁÁÁBNVßYPÍAúŒ_·fA£Ñ¨Tj‹¥Š²²²Ë—/ÛØØ´¹"¨¾¾~CCî]»***bbbFŒ;cÆ Ó7÷LÞ !!¡¤¤Ôb©Þï[œ  ®^TTÔÚiÝÜÜvíÚÅ~JJJÍ;K"¿"X·355­ªªÚ½{·¶¶ö®]»*++»-€î©YüøñcÉ’%~f¤Z²d‰ššZOGÑó¾ÿ~÷îÝî¼b/¬YdggGEEµ9°±±ÑÞÞ¾ÅMd2yùòå‚Ï```ðâÅ‹?þøãíÛ·p´ÁÉ“'7mÚôîÝ;KKK&“ ZdÐYƒÛ]øöí[\\ÜáÇa; €öOOO UUUÞ3bbbü¿`‡ãçç˜;wî²eË\\\V¯^íëë[^^nccƒò†¾æ AAAéééÓ¦MƒËÏ;600°¢¢¢{b膚‹ÅŠ744ôððøúõkçž¼¹©S§ªýŸ1cƸ¹¹Á¢á¯"33ÓÑÑqÔ¨QcÆŒ±³³›3gNhhhOõ?rrrôôôZ+®Mžyòä¸qã¶mÛÖ¥8ŒÛÁÁÁÖÖöÑ£G]w¹ÎuíÚµ¥K—–””ØÚÚZYY•””¼~ýúÇ=×ÿøöí[UUUkyƒ‹‹Ëž={º9¤^ëáÇ666–––éééÝvÑÞS³€q?~tuuUWW?räH‹‘(Uà81dÈ3f´v•ñãÇ„'NØÚÚEGGËËËûøø¨ªªÖÖÖ ø(묢¿(÷cqqq ø\nÿþý÷ìÙS\\œ—'‰d2yþüù[¶l9wî\AAÁž={>|È?,𪪪Q£FñžQPP;v,Nÿã?xCPÆŒÓØØ¯Õ±×ˆô 8Ž7™¢cÒ¤I7oÞ|ð॥emmí¾}ûtttþþûïîïмfQPPÐ)7ð{†ªªª“ÉÜ·oŸ®®îÁƒ»è³löìÙsçάZµjÛ¶m7n|øðaUU`Ö¬Y°">>ÞÞÞ^KKkáÂ…ååå.—{üøqSSS Y³f%''óNÈf³÷íÛ7eÊ ===KKË 6ÀMéééóæÍÓÒÒÒ××߸qãçÏŸù#9}ú´¹¹¹†††ššÚäÉ“·lÙ"xƒÁغuëøñã“““wìØ±{÷îÔÔT999ؽºµÍÌÌÔÔÔV®\©£££©©iooÿöíÛ67 ^ÀKž9sæªU«¦¦¦jjjêêꀛá+RSS+))á+DþWÿ¯¥¥¥©TêƒæÌ™ceeuïÞ½î¹z/©YÀ¸!C†ôïßÿÓ§O«W¯VSS;xð ,ðPª8~ü8—Ë3gNkWý¡¡¡;wVOŸ>}÷îÝ•••ïÞ½ƒ_³á=ºÉõ \ôõ¢‚ŒŒÌÛ·o‡ 6mÚ4 …ˆ‹‹STT„;p8œœœoéŠÆÆFƒ!%%¥¤¤”‘‘±}ûö‚‚‚]»vÁµSëêê¾ÿλ©ü÷ß»ví*//§P(ñññøÿâr¹xë¸\nQQÑÍ›7?~üOØ®cl…;49¡€Ã…¿4@˜ÀZ»tóc;ëÒpüˈ#D»4o+ï/ÿßÖ3CCÄ„„gÏžùùùݼy3<<<22RKKKä¿LáÁš…¾¾¾¯¯oZZš¾¾>ŒJ¥R(êÿ¡P(4 >Ãÿ˜+ÿcX›PRRú÷ß³²²þúë¯Û·ooÙ²åèÑ£>>>óçÏïÒUSSƒaüb±lÙ²”””””///fccóàÁƒ—/_šššnݺõܹsÆÆÆæææ?^½zuPP-åããgbb2cƌ»wïÂ9í“’’ÜÝÝG޹hÑ¢šššää䬬¬ÄÄDqqqÀ›7o¶mÛ¦¯¯ojjZSS“’’R\\ CjmÓ³gϪ««×¯_Ï›+VLL,&&öo-B“3gΤ§§Ïœ9S^^>))ÉÙÙ9==H$ Ø$8øÖ^2ÀÙÙ9---))iÁ‚’’’†™˜˜ÀMÚÚÚnnnùùùIIIM~ "ßYðc>†·±æ_½š<ßäAkÏ CUUõþýûáááaaa÷ïߟ={¶‘‘Ñ_ýÕâ\ÃÎÎÎnôèÑþþþ°fqèС־Ó7ù€‚O6ù(k󹺺šÅbÁ» Ü&£ƒ JKK‹‹‹Û±cÇ‹/Ö®]´iÓ¦•+WòþÔy¥ŠæíXuuu°ÖТɓ'ÿüùÞsápcc#Ü”••5mÚ4ø¸ë'Šž7TVVÊÊÊÒét*•ZYYI¡PjkkÅÅÅÓÒÒ”••¹\®®®.ÜùîÝ»&&&$)++ëâÅ‹=ÊÊÊòõõ…_,8‘Hd³ÙÏŸ?ç?((èñãÇW¯^···ñâ†aYYY‡zùò¥0ö™D¾7èx†a¼ÿÏæ[KKKy—‘‘‘––îàå„WTT?gI$†a ,‹ÅbÕÔÔtä´ðo[__?555))ÉÕÕµ¨¨ÈÝÝ}ÿþýÚÚÚ èœèù9r„Íf_»vÍÄÄŽò²µµKII;vì¾}ûTTTàžŸ?>þ¼³³ó_ýàp8+V¬ µµµ---‹‹swwç;¼½½á§Ò?ÿü#-- oòòò“'ONHH¸tél³ëìá8N¥Rµµµ­­­yåÛÖ6Áw¸É[1räHÁ9sæÄ‰𠉶¶ö† JKKUTTl|IIIk/0oÞ“É{ÿþ½´´´¢¢"—Ë­ªª’““;vìþýûsss­­­#""6lØÀf³¹\.ül…/FZZ:66–ÿ*©©©cÆŒ±···´´Ãq|ùòåË—/÷ññ©¨¨ÀZG âããµ´´† ÂûËæß*øX[áMN(àpá/ &°Ö.ÝüØ^riÞV€¥¥åƒšä 7nÜØºuëãÇýû÷÷ôôtrrÚ½{wZZšhœÂ««« ºuë`ùòå»ví‚,«¡¡vÄiòj¾•ŧ¸¸øöíÛ¼¹Lîß¿øðaø ›D"3FÀ@©Ž¸xñ"™L655 n²)$$„ÿΔ——‡ã8¯7‘Hœ={vFFFyyy~~>ÀÊÊŠ·3oö˜?²Ù숈þ3óôôôV¬Xqþüù'OžH$Ò† `²µMðƒ¯Å~"„ÏðúYó¾{ðŽmq“€à¼dÑt$øŽ#“ɼqm­eêMžoò@øç›Ãþ/¥ “É’’’¼ÿ‚ªª*Gu.2™Ìk.âp8ÍßÞÖ>Üš|”µù©Ûödeey;3™Ì’’^jòîÝ» .ÀN_¼x1scCCƒ½½}kyC‹ƒsçÎÐñêÕ+[[ÛÓ§O·˜7´8i„DÌÄÄÄX,–œœ\CCƒ††ÆãÇ'Ož|áÂSSSÞ>p©®>øúú²ÙìU«V­_¿nÒ××ãeô€††pùòå&úðáCpp0ïspâĉ÷ïß i3Âüü|''§™3gŠö‘®€ýï÷’ää䀀€‡”””<<<–-[&à_¢såååùùù‹‹‹‡‡‡Ã.,:ˆü?vëÖ­Û·oS(”ëׯïÙ³–xi4ÚÂ… ÝÝ݇ Ì›÷¬ݹs§µ¯­Øÿ¶3ÃÊ`jj*¯ütûöm YYY%%%@vv¶ººz““¨ªª„+W®´¸]AAÁðáß?þñãÇâââ .„„„ØÙÙÉÈÈ´¶IWW—N§>|8<<œ÷) ++ ›—[ŒP´7G@ð^2?áo{Þ^QBo'///ØÎÑéçoß¾2e €Á`;vlÏž=_¾|Œ;vÓ¦MC‡튨š(**òõõ-(( R©{öìqpph~¿ï¬kíÞ½›F£ñ/•pÿþ}###Çsss·oß~ñâE‡C£Ñ\\\|||àÇMLL’’’bbbâââøû@´ÖÞ ++VZZÊ;“É$‰ü=ʯ_¿®®®^VV6|øp{{{‰D&“©Tê´iÓø?å:Bļ@ P(”çÏŸO˜0```pÿþ}GGǃ–@ƒqòäÉÓ§O3毿þ2dHyy9Ì‚ƒƒÃ?øþb±X=js0žµµµh#½üår¹©©©p¤¢¢âúõë—/_ÞÚ‚¨]áòåËûöíkhhÐÖÖŽŽŽnm~tÑÀþÉÉɰùZVVvÅŠ+W®äuýé\ 7nÜÀÑhü#¸Ž= g¢ŒŒ”’’¢R©K–,‘‘‘>|¸••UhhèÓ§O‡ –••õòåËM›6‘Éä‘#Gøûû§¥¥ 4ˆÍfççç¿|ù255ÕÝÝ}Æ °æXPPðò™èÔË IDATåK777@JJJHHì*Èb±òòò$$$à×ÍÖ6Ñéô€€ssscccöôéÓœœ†¨èèè… *++§¤¤nÞ¼éêê*`“€à¼d@¿~ý¾¾¾ZZZ¥¥¥=š5kÖ–-[.\¸P\\ ûß;vLJJJSSÓÚÚZ´à»âo£sa»;Àû\II‰‚‚¬LéèèlÚ´iæÌ™-îßnÞ¼Ì`0ÔÕÕcbb`Í«;ÁWš““£¥¥ s®®®¾¾¾l¾3\ÍqêÔ©Ó§Oÿùóç… bbbà÷¨óuuõÛ·o7Y0“F£mÙ²¥ÉH´^½zõäÉ“W®\˜™™­_¿ÞÚÚº³j4¢÷o””„I4iÒ$€»»»““Žã»wï^³fÍÿý'-- ×ü–——‡{r¹Ü†††&/^RR2##CÀåTUU—,Y’””$`€ Ò›Áª+VÖ®]ëììÌkTì­Õ&:OãøÀ׬Y³dÉØw©‹„……ÁIÕÎ;'''·xñbÞûùï¿ÿ~úô pþüy™Lž8q"\Ñ>44Î1wÿþýaÆÿùçŸð¨cÇŽ…„„$''§¦¦R(555ooo™9sæP©Ô£G^ºt‰@ 8ÐÜÜÜÜÜ¥¬¬¬¤¤ôðáÃŒŒ ==½7Â\PÀ¦yóæÁr¯]»ÖÐР¢¢âêêºfÍ>zôpúôi%%¥iÓ¦Á¡ —.]ruu°Ipð­½d¸U[[ÛÛÛûĉYYYC† ±µµ…Óò?~œ7ݹs纺ºð»ÁwÕßGw­p7Í›7Ϙ1£Û2‹'o°·· ëÒºÖÀ×[[[K¡P–-[æççÇ?qQs°o#€D"­\¹ÒÕÕõÓ§O‡†Ý2#FŒÐÓÓÓÑÑÑÓÓ311i±ˆ””ö½Ç0 ëß¿¿¦¦æœ9sîß¿wèׯÑÃýøá8^ZZ:`À€÷ïßïÝ»WQQñ¯¿þÚ·oŸ¦¦¦´´tEEE“Ö?м-šÃáò^üÒ¥KgÍšÕ¯_?999Øv ¿B00088vÍÏÏosÖ3gÎ899eggÇÅÅ‘Édggg™üü|ÐØØ¿¢¤á—û­Y³ÆÕÕ;îN]Z›à7mÚ4GGÇ.:9‚ôN²²²/^„Su§¯Mðxð@[[›H$ŠÜÐ+bÞÀårËËËËË˽¼¼rrröîÝkaañãÇÇÅÄÄ7oÞíèèYSS#¸—™““›Í1bD@@|¦¡¡¡gÿNçèèxáÂ…nëùÈÓ µ ~]ÔAz³tÅèbzIm‚_›ëQ5‡ã8™L~öìÙ¸qãrss544~üøÁb±444`ÞðîÝ;¸gBB‚……‘HüøñcPPŒŒŒ‹‹ …Bá äyóæ Fãå ƒaeeåàà`ee¥««[TTçÈ0àS€vç \.·²²R^^¾´´tÍš5iii[¶l9yò$€Ífóz-XZZ644,_¾\QQqÚ´içÏŸÇq\@ˆ$‰ä ¯ðƒôÝÑî©M ÒzOm¢ƒØl6™L–““hhhp¹ÜÁƒ¿~ý:%%…×ÿ233‹‰‰IHH066Þ¾};ü*.##ׯä¿cŽ5*((¨É…p¿páÂ… xÏÜ¿ܸq"ä í(uÀÉBQQ‘­­­¾¾~¿~ýÞ½{·nݺ¤¤$þAÃ…Ba³Ù³fÍ ›1cÆ;wˆD⯲Ô)Ò7\¾|ÙÙÙ¹¸¸X[[ûîÝ»(i@>àæÍ›K—.-((€C ~ݤ@&“êëëaëì0jÔ(EEÅÇÃ'sss===gÍšE£Ñ.^¼èéé §BÁqNVÍŸ4ÀCšOjÐÄ€†»¨·—°yìOñþýûÙ³gëééÕ××?þ<<<N©ÛÚðHØÃÐÐðÊ•+ÎÎÎáááT*N> ]ª®®ÎßßÏž=°Ý+99¹ë:4 Ò=X,ÖÎ;·nÝÊ`0ìííÓÒÒú@9›B¡Œ9’˜+Žã:::æææ666©©©žžžÖÖÖ©©©öööpHìÍ€a›Ín2È‚ÉdÖ××?}ú´µË„ùóçgffJKK‹6£¿°u ƒQ[[k`` ¡¡oeeU^^Žã8ÿòT­…ˆã¸ššÚÝ»wgΜùâÅ‹C‡ÕÕÕõx! éÃPmAúž>S›€ÉdR(ÇÏœ9»råÊÍ›7_¸pÎtФšZšmšH$’H¤aÆ”””vïÞ­   ÷ ‹Å¹›—°y™LVPPسg———Ëe³Ù¼ùÚ„a…B‘••½wïÞ¬Y³¦M›vï޽΂ MtÛ¸ AºM¯7јL&•J%‘H§N:r䈣£ã¥K—d2YFFfáÂ…PVVnsÊKØCàáÇàp8ãÇ·µµ­¬¬„Ë ðÆ'v¤o¸°wî'Ož‰Doooð¿óŸ OBB‚Ãᤤ¤ÈÈÈäååÁò ‚t"T›@¾§OÖ&øÁŸ‰DbTTÔ¨Q£²²²<< ›@¾§/›h.MbffvðàAuuõþù'<<<99yÀ€8Ž7ï®ì®^½ºvíZ8(¡G•7ˆ‹‹6ÌËË«ƒãr¹¹¹¹îîîp6«ž A 777T›@¾¤Ï×&Œ÷ïß?|øð-[¶xxx¼|ùÒ¢±±QNN®µ›£¢¢â·oßâââêêêf̘A"‘X,V·­NÎO¨n ,KOOÇñÞï ÂÝ»wccc8Àår;k ¤¯úôé\®E¼5|³³³Ñ¸ é3JKK-ZT\\܇ÇM¬^½úôéÓ...Û·oWTT¼yófk‹§ð:tè‹/¢¢¢|}} ®\¹¢­­ÝdÒ§n TÞëÄo!ÈÏÏwpp°µµ…‹tðlHŸwýúõëׯ·¹7 ¿Š>XÖõY›àùþý{ÿþýI$’È­øþùgccãüùó»tÜDkº;o@äÿkï:ï8€ÿ’‚ÁÉÍšˆ@5–UDSÐ#oj‡õ(jæXOÕ–áŽb€a¡VT `BE¥ªEÌ€*lÓ3Pd;Ûi…VZÝX£`¡Ö"<¥R^J—ýqÏîÉáÍ ñûù+yîÍ“_î9_žçwŸgjgEúté’©C0+V¬(--moo_ºté¸;ù׿þåíí-‘H&ÿ>ä “áþýû–––;vì˜7oÞCÞ áíí““ckk»iÓ¦q¬Äø0°Ò3Àd°´´HJJjnn~˜ª¬¾¾>"Šˆˆèììœü7LvNÁÉÉéa:aW1(//fœLÈ1ÝÝݳgÏîîîÞ°aÃ$¿5ê1"‘ÈÑÑÑ$oñà yð…¼øBÞ|!o¾7€‘ dgg{yyI¥R¹\¾víÚððpÓ†T[[ëââÒÓÓ3ôÃ0±±±“À# ÷a‚‘¥¤¤œ8qâ·¿ý­››[MMÍ;ï¼ÃîÃnB------?þøãÐÚ222¦êF½ã `Lmmm'OžLIIILL|ñÅU*UBB‚‡‡µ¶¶†‡‡Ï™3ÇÅÅE­V³¿þår9Ã0ëÖ­“J¥‹-*..fû©½¿¿?==ÝÍÍmÖ¬YÞÞÞ§OŸæÞºµµ5,,L&“I¥ROOO—ï¿ÿžˆ¼¼¼üýý‰H&“1 Ãm$ÓÔÔäèèåçç×ÖÖfØÿ87ocª««Óëõ¿úÕ¯¸–°°0öÁöíÛ›ššÞx㎎ŽÔÔÔŽŽŽ#GŽDGGïÙ³ÇÚÚúÔ©S¥¥¥ …â‰'ž©ýСC………ÁÁÁ‰äÖ­[jµZ(îÚµ‹ˆ›››g̘ñç?ÿùâÅ‹mmm Ãää䔕•i4­V;}út{{{6{{û¼¼¼ªªª””Ã0¦8uÝÊËË8 P(âãã?üðC•JµaÕJED[¶l™;w.}ôÑG¾¾¾DôÕW_ýñýF£¹xñ¢¯¯¯@ èëë›6mZ\\œH$w„ß}÷F£ …–––}}}ýýýo¾ù&=z´¨¨èÀ›6mbÏ|å•WþûßÿþýïŸä‰H­VwuuUTT¬X±‚ˆvìØáêê:z„¦³³³²²råÊ•‰‰‰†½MD„£ˆ×h4Ô9€!ocb[ZZj¯««ûøãÿñ,Y²„ˆ¬¬¬T*ÕáÇö³ŸÑ»ï¾kgg7kÖ¬¢¢¢ÎÎΟüä'#µçååÝ»wÏðßkaaá®]»¾øâ‹O?ý”ëýúõiiiìbjÏ>û,;œ°víÚ™3gr/ …kÖ¬ô50Ö8uÝž{î9ooïøøx"Z¹r¥··7›4‘££ãáljèõ×_ç<ðP|||kk+ÛHDµµµ©©©IIIãŽ0---..îÉ'Ÿ$¢ÎÎΈˆ¶}ÿþýwîÜ©««cŸÖÕÕýô§?•J¥“!%$$Qll,×í#Œooo?~üx{{»^¯7œS›ˆGÑÕÕ5A=ò0&ggg¡PøÏþsãÆ†íz½žˆ¸/ééÓ§³¿YÙ§†›Çî-;´}``ÀÏÏ/22’k·±±¡ÿÿϵ³³cmmmÇ÷ÿ}|qN(n€dhË(‡™?>;k3nz½žË“lllŽ?nxT,ß½{W"‘œ:uêõ×_çw&?ÂÑ!­^½º¥¥¥´´ô…^©‡‡ðþýû---DÔÝÝý‹_übýúõì¡äääÊÊJ®D÷¹çž3Üt ¤¤¤¼¼\ ôöö ‚þþþcÇŽ=L$ü ääähµÚ††©Têàààìì|êÔ©Éy÷aÕÖÖúûûëtº¡åJ Ä……f07€1Íš5+444""B§Ó¹»»www[ZZæææÊåòíÛ·GFFvtt;vlóæÍ555DTQQ¡P(êëë‰èÆË—/©}ëÖ­YYYÎÎÎK–,ihh(..vpp8{öì³Ï>ëìì¼sçÎàà`†aššš²³³cbb6oÞLÿÏ'²³³%Éùó竪ª>þøãÖÖÖúúúêêj"*++‹Å«V­Z´hјâ4â¥kllä¾6¹ö½{÷:sÿþý<4H~~>[e2n¡¡¡*•êÉ'Ÿtuuõòòš={¶áQÿóçÏoذÁÂÂÂp£¿ÉŒpt#EHD%%%AAA]]]»wï%oxøOž<Èí)™™ùé§ŸzyyQbbb[[Û°_x.\¸sçw¨½½}èU8(s†¡7€‘i4š9sæ¼÷Þ{YYYÖÖÖ¾¾¾*•J ªT*v†ø×¿þõÁƒ‰(##ƒˆ‚ƒƒ/_¾œ••ED¡¡¡:n¤öääd›‚‚‚ììl±XìîîÎ7XXXœ;wN¥R‘ÉdcŠÓˆ×ÍÉɉûnà󛈰?OýüüV¯^ý0½¹¸¸¤¥¥uttètºüüü ~ÅΞ=û믿Öjµ»wï6U„£)ªª*GGG¡PhkkÛÓÓÃŽILP„.\`X½½½VVVlÞ0в²²ôôtîéŒ3 Ë'WæBD/¾ø¢X,nnn&¢ÖÖÖ¸¸¸’’kkëmÛ¶8p`Ú´ir¹üöíÛ^^^ÿþ÷¿%É‘#G~ùË_ÑHíýýýo¿ývnnnss³L&  eߺµµU¥R•––vuuÍ;÷‡~¸rå Ã0^^^씓L&#¢§Ÿ~úÚµkDÔÔÔäééÉŽ;644p3’cŠxBÞF& ørH޽½}nnî Æëׯs+**Ønaa¡R©¸¹CNNNùùù#E¥V«ÕjµaËçŸ>ì™cŠÓœ&"¯¾¾~Þ¼y¶¶¶Ë–-[¶lY||ü ŸæóæÍ»qãÆœ9sLá a~~~{{;;Ò£×ë‹ŠŠ —1n„R©t½qÓdÃù² …2gò€ÇÎ;w\]]_xá…wß}—çKbbbN:%‹‰¨¹¹yè?Ùßüæ7¦ð†FØÕÕÕÞÞÎ¥‰===;wîä¹LÙ8"\ºtiAAÁÖ­[‡=ÚÑÑÑßß/¾7ÞÓÓ3??ÇŽìÓ{÷î]¼x100;!22²¥¥%//Ïè3(s†a!o0½7Þx£²²R£Ñ°÷aVVVªTªððð§žzŠˆt:Ýûï¿ÏÖÍÙØØ°·]°F:¤ÑhØF¡Pkkkkøv—.]²²²:tèÿe2™Z­"‘H(8p€mOII©¬¬,,lP™³¯¯ï?þÈ•+ŠÌÌÌßýîwû÷ï/((P(gΜ‰ŒŒ,))Y¾|ùHíqqqYYYJ¥rP™soo¯Í°eÎׯ_ÿùÏ?l™sJJŠV«eËœÁ˜âëÅIMM‰Dwk®Òëõ"‘yÀcçùçŸ/..ôÚ¬ B3Ñß߯Õjß{ï½[·n±eÎqqqÏ<óÌ;wT*Õßþö7‘H´yóæƒZ[[³õ†VVV—/_Þ¹sguuµ“““N§©½··÷èÑ£---l™shh([|򯯬R©>üðC®ÌùСCÜÄDBBB^^[æ¸uëVwww®Ì™ˆ¸2ç1Å9Ö‹ƒ¼y_mÞ€ý)€/ä Àòà yð…¼̈››cÀ(Ë-R[[ëââÂ.hc…uŸÀŒhµÚòòröl[[[www£¿Å(›âÀa¼̈­]»V¡P888‘\.gfݺuR©tÑ¢EÅÅÅìÉ®®® ÃlÚ´é©§ž’J¥Ë–-+(( ¢òòr‰DÂ0L[[Û±cÇÄb1û˜ˆ¼¼¼üýý‰H&“1 ³téR“}T€Gò0wÑÑÑDÄnB³|ùòˆˆˆ¾¾>®ýêÕ«{öìÉÊÊzþùç_{íµôôtOOϸ¸8öµAAAÜc"ÊÉÉa×9ÖjµgΜÑjµ&ø<2ÌS€¹i"ÊÍÍe˜Û¸q£T*MKK‹ŒŒôðð`_+•J½½½¹®FÚxÂx<FÚ„†aî±X,îééaG#À$ <<<ìííW¯^]^^þÀóUªŒ’çIƒñ0#W®\¹rå •••±u‘555DTQQ¡P(êëë‰èÆÜ&4¯¾úêܹs«ªª²²²BBB,--g̘ADgÏžµ°°øàƒˆ¨¡¡­²d7ÙËÎÎæ6ÅùꫯLôq¦­Vêééyþüù7ž;wnô-£ŒUªŒ’çIƒñ0#!!!)))D¤T*·lÙ’––FDDüå—_feeQhh(÷’5kÖdff†„„\¼xQ­V³/g7ÈIJJЉ‰ùþûï‰(33“=_.—ïÞ½;###66¶»»;99yÒ?%ÀÔ¤×ëÕjuLLÌáÇ7nܘ——·nݺÄÄı–*£äÙÌa¼ÌÈõë×Go¬¨¨t455uØJ…ÔÔÔÔÔÔaßE­V«ÕꇆQ]]ÝÑѱeË®%00pÛ¶m‹/Ž‹‹csô   ¡P¨ÑhØrrrÊÊÊ4V«>}º½½=EGGGGG³%Ï2™ì³Ï>{íµ×îÞ½>¦~`‚ o€GÕ_|ADeeeóæÍã !ÀÜXYY©T%Ïfóð¨:~ü8)•Ê—_~ÅP&·páB[[Û÷ߟkùàƒ–.]jii9ŽÞPòl¶0Þªa'5ÀT¬¬¬bccïÝ»çááñ׿þõÂ… çÎ#¢1•*=z”PòlÆ7€q(•ÊéÓ§§§§çää,Z´è/ùËŠ+È T¹··W&“QffæéÓ§É T¹¯¯oñâÅÉÉÉR©”þ_òüÝwß9;;«ÕêW^ye¬ý˜ì*Lu"R*•ìuŸJ EPPÐúõëMŒAyy¹¿¿CCƒ™W*¤¦¦ŠD¢¤¤$S2yôz½H$B}˜®äùêÕ«¦Ž†y 0#\É3Ã07oÞÄ:Næy˜”<›9ÌS_ÈÀÜÜܘ!Øe[ˆˆa˜ØØXÃó¿ýö[GGÇA§±°™ ÀdÂ<˜@TTTtt4»",ݼy“[/–ˆ222.\hx¾½½ý™3g®]»Æn?a›ÙL&Œ7€ °ëÈúøø899íÝ»wÓ¦Mžžž666MMMŽŽŽQQQ~~~†ã `ÕªU>>>ƒúv3›þþþôôt77·Y³fy{{ÞcœÀZœ•JŶp?\”J¥H$úä“Od2Y@@À×_=´†ÛÌ& ÀÙÙ¹   ;;[,»»»³“D«ïá€IDAT´sçÎÆÆFî­·mÛvâÄ "š={v{{;Æ3Ï<“››‹¤€'®Ì¹µµ5  ´´ôÒ¥Kl™³§§çÐq¶ÌyèæÚ^^^uuuDÄþi?ýôÓ×®]ëïïûí·sss›››e2Yppphh({~BBÂÉ“'‰H­Vgeeýðà !"F“ŸŸ÷î]‰DòÄOTUUá/Úˆ7€ Œ´ÜçŸ>lûþóŸQzS«ÕjµÚ°E¥Rq¹ˆ!N7lÅÅÅ£ô„2çÇòxX(s~| o€‡…2çÇò?”9?n7Àø¡Ìùq# "¥Ri¸ïÔ P(‚‚‚Ö¯_oê@` JMM‰DIII¦dòèõz‘H„ý)€/ä Àòà yð…¼øBÞ|!o¾7_È€/ä Àòà yð…¼øBÞ|!o¾7_È€/ä Àòà yð…¼ø²0uèĉEEE¦Ž¦ ššš—^zÉÔQ˜À”Íbccoß¾mê(`Ê’Ëå¦Á¦lÞàëëkê¦Ô7_È€/ä Àòà yð…¼øBÞ|!o¾7_È€/ä Àòà yð…¼øBÞ|YQ[[[mm­©#óÕÓÓcêà‘ò?ù7$ôußlúIEND®B`‚mod_perl-2.0.9/docs/user/handlers/connection_cycle_pre.dia0000644€ÿÿÿÿ00010010000000402411727205031024046 0ustar ????????None‹í\]oÛ6¾Ï¯ÜÛ”æ§HÎK†¶À°+V`ݵ!ÛŒ­M– Ynš]¼¿ý=”Ü8–¥Ä–Dwnå´äÐ|Dê<Ï9‡<ôÏ¿|YFÞg“®Ã$¾„ž‰§É,Œç7ƒ¿>ýúZ ~¹½úy?Áÿy,=øD¼¶W7ƒE–­~ïïïQô°²$EQ¸Ak3ü_EÁ ·Wž÷´ƒYö½í»A–¥ád“/–æf0 ¦ÿÌÓdÏE«m»i%©÷9ˆn¯îò×`¸íf¸×Ï3}¯‚¹™¤&ø§¾k /­›t½2i¹Ûå*Y‡Ð${X4©éÇþ~ÒfÛj âùí«7üUqKÛ7v}UÝh-H¶ ÒyâÀÜDÅDP¤(¥0B+%—ä뜜79/\t^¸ô¼páz¼JÒ, Âìr’$‘ â5K7¦9ÎzD`bÏ «Å(îÂ,K^¸ÿ» Z3€âíG¶ÊÜyΞ'î^‹š^îÃY¶q4]EïŽzÿ®ÃIdªî>Œ³Îºè¦ûòÓÉÕ{÷ñ–ÖPôVëfÊ#NwóM83ëÌl¿MMO‹m³áK³^nwìÄo•œu&Ývÿv禽íÞ*ΓYH&›i¶ÞŸYÏ‚tæ½öÞ&_»¨bŽpv3øïOOy@Ð(ßÁü¬’ ÄÉ5÷‘’œ”~(u “I#…Qñ<28Læ8Œ“‘Àˆs%¯…Bû~3\™åxš¤ña„Ðís \NùUJGZ+‰5U q!E ¬… 独Œ£ &I:3éKãÁ+¼ÿ¢ÍðÂÐx_#*TbªìO3ˆõ"¹WÁGxÈj9î˜Ø˜š¤555Â`¹ùŽ© $T"⚌€*Œ‹k!‘Ä-5ÛðjR‰éÀ£&FTP®_Ü1KE‰¥Ì)KÍýqÏÒý8ÜIi[’2Œø1‚ñ¥C’ZËJ‚¤&rÄÁÌì%CRRî’¤ ð’oðÖì–\pi†%ÁBø”Â?ò]Qt6µ?—HÑßÃØTp”µå(U{R` E’a᥉b‘˜Âr䡌pËS¢XÃç>MâxlâY>¢Fã¬e54T ½a¼YNW囩ÊMO¢o<išÜ—;6·d˞Ǒ‰çÏ–ïÓ•°¶/JDCDk`€À–õ |ý‹·~ÙDè”%6.%o÷çò2B͇ÉöÃtÿ³ì0U.ÝQ7ÀÛJ€õ—´•½Å€!¾Öÿ¸i i'ä½9ÿ…vÌÿêAV´³k«Œ-…êùÿCñ¿Da~ ýIéÃøLü­ùϑĴ¥É'ù‚ ™Az ¦Î%@r×!@í8+šÊ¯!@ãì»×€Khm Ð ?™/YýÖ¡<°‰PÿZ€Cì2”HÀ[1¢z{-–M‘3;-/ìÍ”ÚÔejùfö^»Ò¾÷»ÇGxõ>^m²«_Ã(ƒR³þÌRÝ~dgU7`ß÷î‚e=XåÚ¤¡Ý1÷o=X+T`E¾~›D³§ZuúÍäü•ÓõKÚM@÷mõ${mWNýk‹10nDá<^šêÇ»“ar$Jå.Z7K5:#[Ç q¿xnZ:ÕN‘8XȈ‹íµDŒ^˜Îü±Éz¡ù6BSk°½Ð¸\›T­7ù*Ö ¥ïtÿpl%•E" ³õ‘à>±i cX:NKjFYá/}Ä5k¹Tû§%Bï¿”ó´¤!âIi ©Yšìfyá]¸ž&@áï¼A\AbÝATÚ¿æÚ.ÀK·e4R@Ún‘|_€XŠcšo2Ḏ¦ýª¤A˜)ŸkŸ Î¥Rœ;Ü ä0”jÁ$ãÄ׸év}îáe.‘RT@Z€YW¼yv#°ì O¸ £èˆý¢òoº×øÜ\åá`½nãTY"zÒüEáj¼HÒð_ˆQƒ¨uEÒs0 gY8í¤1%­K¹´ eAi|ǹ Qž«©ï+iË1aÔјùÊ¥œv2È^N{9íåô¢åôab@)p ¢½}0óÔž «’ÖÖ%¥éU^F沨±ù&A> ¨B\•ª—ÒÚÉ ªYC BbÉ|È …dJ+§EkÝ€ý Òz®òò^Z/SZ[?ÕQ¹Ï]F­q®y®o€4²{þJð¢X8-îd½´öÒÚKë%Kë˰¤uÑ6ÛbFíöô#ˆé|ÃQNFL#\¬qϹûú1M¦f½ÞmÂþ¸»®ÄõkIö;¬.OQòŽQr 8Wv+Ëeñ·’9ŽäÔÖ‹ y-0‚kǧ([¯?¡uÎZjj&Mmâ۞Ъóö­ë³)G8_‡WÔ©·§$?F @4ÜVAhëü±­½ºoozOO_c޽§wYKEüTD «·žÞª†ÔzdQ[¤8þˆgõkBøA›zêNʨšÕñý: ÿLLjìàœ!ÇŒÛhÌñ·väɈʑ°M\¹+„kxäô"2×7«`º0Ãe2¯Lyaï ÒÙ,eôÞ/W(‚šÿ WWötß“«µÕÞÍ9 –UKcÌ>8Á]kȉ‰æ"c¿ÝÆ^ p}— 2¿}úôñÚûóƒýýþÃøm²)êåÄÍêXµUörrœœ×ùÞ^í}£àíÕÿ øÊ¾uXmod_perl-2.0.9/docs/user/handlers/connection_cycle_pre.png0000644€ÿÿÿÿ00010010000006156311727205032024111 0ustar ????????None‰PNG  IHDR½ñIC˜±sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy TkÿðçÌ>ö½D¥"Q¶B{(*¤äJ¹ÝhC›hÑt¥D ·M%IûrÛT(¡"m´hO– E–óœßÏûÎo^Ëc½z>sžsÎwæ|çY@A ÐÑÑ™8qbwG‚ ‚ HÏÅårcbb0€»»{TTTwǃ ‚ HÏÅb±h4¡»Ã@Aä_å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆ å ‚ ‚ˆŠÔÝt–M›6={ö¬»£@Az-ggç«õÚ¼áÙ³gzzz#GŽìî@A^èâÅ‹999ÝE7èµy`äȑӧOïî(A^èÅ‹ÝB÷@ýAÊAÊAÊAÊAÊAÊAÊAÊAUož/A¤S¾yóæŸþiÏI|}}CBB:*$ÀŽ;ž={ÖΨÄY\\\TTtêÔ©6xåʕӧO6LRRrݺu E”£¢¢¢>|ø€aX¿~ýÖ®]+VȈ8P}‚ ½JPP¯¯ïäÉ“;ûZêêêí9CNNN;ÏÐÔÆ;üœ¢X¹reHHHÿþýÛtÔëׯ·nÝäèè¸{÷nQŽJKKãp8áááaaat:=55U¬q ¼A^ÅßßßÏÏÏÜÜœÁ`°X¬î§ÇŽsuuíî(ºÓ7œ¥¥¥ZZZ¥¥¥¢·téRøzÑ¢E×®]ëÄ‘ÿ…Ú)ém.^¼8eÊ”²²²›7oΚ5 n zóæÍèÑ£?|ø //Ïf³GýÛo¿ñЉ‰ÉÏÏÇq¼¶¶ÖÅÅÅØØ˜¿+!!!##Ã0‡ƒaÇÛµkÜÅãñ‚‚‚jjj*++½½½GŒ·³Ùì={ö”••êëëmllš.³W\\¬   %%ÌÍÍ]ºt©‘‘†a²²²¥¥¥RRR:::K–,._¾œ‘‘A¥R™Læ„ ù§Š‹‹»ÿ>…Ba2™æææ­Þ"áwCHð!!!ÕÕÕEEE¾¾¾GŽ¡Ñhpc«Wl‰ÿõׯ_eeeE9 Ã0*• _Óh4þk¤  ¼AÞ&!!ÁÕÕµ®®nÕªUü¼ÁßßßÊÊJNNîÀpKLLLBB‚­­-ü‘ÿxÆq|õêÕü¼!11±´´”ÿh¬©©Y·nÿZîîº >>>{öìÛ÷ïßïì쬦¦Ã’Ø6oÞ¼mÛ¶î¡çÜ©_6o@ó7 ‚tµnODl(o@ä—˜‘‘áã㓜œÜݱt?t7±ý¢ý"ùÕtw]jÛ¶muuuM·[ZZþ‚wé((o@é6oÞÜÝ! ½j§@ADT(o@ADT(o@ADT(o@ADT(o@ADT(o@ADTh&‚ H犌Œ,...**:uê £“Ì;÷üùóÝÅ/å ‚ü À¤&Mš„a—Ë¥P(›6m¢Ñhí9§¿¿?\荒­\¹ Ê"OÀ‰›ø+E¹¸¸èèèt}N¼;/ü¨ ´/(DT(o@ºTÔo™¹é•hQ1¤­üýý¿ÿÎ_‡éÇ;vìhç’BÍΥأÀ‰›zßTâÝyáG͘1CÜp¶é€¼ÉdÒétþ8ŽWWWËÊʶÿÌÿv!&i•Ÿþó‡N¦‡š+9†—V¦ ?J¸Ü´Ê[a¹EÏb¬ßi‹7l²²õ¦¡oÇ(zþ3z^–o¦]–Üt¯¶…²l¿v}GDÀСCù뎆„„TWWùúú9rVBð´—/_ÎÈÈ R©L&s„ üµ§?~Ìÿò=aÂ[[[þù[: ‘‘a‡ÃÁ0ŒÇãíÚµ«Õ£:PnnîÒ¥KŒŒ0 “••---•’’ÒÑÑY²dIPPЛ7oFýáÃyyy6›=zôèß~û­Õs²Ùì={ö”••êëëmllàbÂB®%ä(@pppff¦®®.ÇûöíÛ²eËF w ¿ó111ùùù8Ž×ÖÖº¸¸·zÔÞ½{KJJZjié—"$BD¸vå 8ŽcÆb±¶oß^RRRVV¦¥¥5räÈI“&ÉÊÊ644é×­Ò˜¾QëÅõÒ× ßF/èO$cÏ.~=íþbÙS±OøüÒ×3Ë_Èö£™ÌSã4àïSËkÊXŠ%:0æöûYR_÷ͬæ4›7˜¯Ôõ!!½Ï‰'øOø,™;wîÙ³gCCC) ¿XBBBeeeDDü1::úêÕ«³fÍüüù³ÙïñBŽJLL,--åUSS³nݺVêXZZZ ؾ}»¤¤¤³³sLLŒ„„„··7ÀßßßÊÊJNNîÀ°pLLLBB‚àƒ¹Yû÷ïwvvVSSƒ?8p 33ÓÔÔTȵ„ðóó›7ož‡‡ÇÀÖ¬YÃ* ¹ó˜‘p_½z5ÿ·,ä¨Õ«WƒÚ_„üR„Dˆ'þCËå‰Ä›7oΜ9“Íf î"666kÖ¬™½ø©a"·àˆ‘”åýíòä]yÅ/«iR¤a–ÊÓ7jÉ÷§긗ÿ|«a*ï~Á„L'XµÜQwÉ4çái>=8ú¹ª¤¾ï0é©ë5GØö„§U~®Ó¦Rðà;»žÛßPÎa§n¿2ÂwZ Àeã)áyYç¿T—ÔÓdI2}hj#¤vM¸÷-‡y€aÀj½æÔ Z€WKN/{Áãà¿gæ ýê¨Ú<ò *..öõõ…_ñ­¬¬¦L™"¸W]]½iãwjj*ÿ™pssóöönõY.ä¨[·níÞ½›¿KZZ:**ª=ײ²²¤¤$@UUUBB@ ügpÜ Aƒ.\È/¹dÉ’µk×¶š7$&&ÂjˆÃáP©T˜¹–£`$P(‘þm9NtttAA™L&¥¥¥¢%„ð_Š" =y†a?¶··o”4x<^|||||¼¾¾¾··÷ï¿ÿk&Úê¿^}5Ä&-ôúƷ׉ßÎ,Ë&ш£ûåeTeÿäÔóN,~ÖOOfÜ¢õÕœ×‰ß ~_Ÿ>*EúœUÅüÉžö§LTI¢ÛI àòŸo+j®4¶OþƒïÇ>sÚ­g:_}˜¥òý˜Ï9·Ëõfô•R¢¼JøóûÓMÏÌ $LÈ®WñßZ paÍ«'ç¿ ›¢¬?£OYníûÔrªäB2_9èí­²Wñ߯.@“!alØe¸«ÿH¹É«ûÀxÿ­Ñ#ø®ù•!=Šºººf~Áj†ÎÃãñméiŸl8Ž7ÚÒ4æ¦TTTÄèB!ÞQBlß¾}Ú´iË—/‡?®]»¶OŽtñço ,KH™—/_†‡‡ÿþÉdŠ}¡^ õïüóž/“vå ›¢L“!Œç©tì0JÎçþD§=z~OÍu,•oîø@—#5W"Q RÊm ¥EÌÌ3Åf  §N<³šžŒœíGóÑñBó•ƒÜ/˜ÌܦãukÜP ¥Û?ð¸¸Ö$E€Ûy“?ÚëÚnÖþYR_õµ d—0¾2ŸœÿbµNsé9ã™Ût–ž36ž«Æ¯Š0qV5G `±z°ífm›MCŒ’ƒ»úÓ§û…{‰<‚ˆÂÂÂâÈ‘#ü=jaaÁÿ‘Á`4ûLr”‰‰É‰'ø»ªªªÎž=+ʵºLiié±cÇø?FGG[ZZ¶zÔ¨Q£NŸ>ÝÖk‰whùΗ——ó«+Þ¾}[\\,ÊQBô_J/#f}¬?ÈËËRÆÌÌlëÖ­“&Mâp8¿r/Àã“ED AÇRyî^½F»œ#õkì+ j¹lüÎÞÁ2°s%™F06®Ý”¾gà80žûŸG2ˆtèwîÎKFyÜ¢ ñŸ>$*Àãþÿ7’fw ãÛÀÀ^•¿}Þ~}‘îB Ú<òë ‚Ý₯¯¯””W@@@CCÃýû÷a ÷ü1|øp¸ËÎÎîâÅ‹kÖ¬¡Ñh,kܸq‚ sæÌñôô”““£P(²²²¿ÿþ»ŠŠŠð£,XpäÈ‘åË—ËÉÉÑh´~ýú¹ºº¶z­-[¶°X,~„222"†äÄ 4 ,ÐÑÑÉËË{üøñÖ­[7oÞ\\\gooÏ1bÄ"‘¸zõj)))‹5~üxþ@!a¬Y³&**ÊËËKRR’N§«¨¨˜™™ 6LøµZ: xÿþý .Ì™3'''çÁƒÛ·oß´i“ð;¿páB/// ‰úúz99¹ÚÚÚM›6­_¿^^^^ÈQBÞ—_Šð!Ä|œ³Ùl"‘(dTŒÁÍ›7Y,Ö·oß¾}û¦¯ßü£¥  `ðàÁâŨ¯¯çñx°É­'kÔœÿ?þ·’Sa€ˆy%£HÔ0–#Ó‰©ç/8bD$ÿç¨Ë¾‘”§:¨Þ$•õÕ‘à8x{«Œ&M’Th¦g¢(„„!Ó‡ (|VÕw˜Ts‡þÎõé®0:4x¤Wò÷÷÷÷÷ovW`` [×`eeeeeÕÖ£–.]ºtéÒ6%öxQ8³MMÍû÷ïÃ×ÿüóO£€ 4;™00 [¶lY[¯ÕÒQ€€€€€€øZ[[;--MpoKwÞØØ˜ß²©–Ž~{[ú¥°[4úŽ •P(”®iƒ˜y‡Ãa2™MÒøþøã6jÔ¨k×®µ”TWW«©©mذAxcG³¼¼¼H£Ñ F[í2Ùq%/¯•îì-PèO7_5#üçy{w~áóŸ€´Èš,™L#NX2PBlµ^óÌòaï ³T&±²¼Ú¢ç?§x 1_5ˆ.GvÕýÇëÕαéCÍI4â§ÌEÏŽ^пÏP)C{ÕÛ?|züCEKªàá÷¢ìŸ¶i)„wÉå€ôÇ-(Ûö:ñàÕõR‹Õƒ…솚žÌq ×½~{«LIC‚ËÆ¿}`eÿô}l&¡@ȪÒÖ¼V!Sõ…™ÿ»¡ƒª}°î£E•Ÿë* já ¡Ë’ú —1œ­*^ðÝðëDé4õõõ4mÿþýŸ>}ª¬¬äp8cÇŽ?~¼ŽãL&³ç|C3o 4 ð–RØ·öÑ£G“&M¬Tp8‹E$9Î_ýÕÖ«c&))ùùóg:ÞsneS7ƒ?T|¬<}jOØ‚ ÒC`öþý{!ˆDâúõëýüüdddØl6™ÜÍ}ÆÅÏpŸ6mÚ•+Wàd2988¸´´ÔÎή¶¶–_löìÙÚÚÚ-uƒÈÈÈhÓhZGGÇ .ˆ3‚ ‚ô4555-íÂ0,..nÆŒ¹¹¹222-% <Ã0±g!kÓt âç L&ÓÍÍmذaeeeñññ .ÔÒÒZ¸p¡`ÒÐÐÐ=oJ5Aé!„ä ŠŠŠ3fÌ8}úô½{÷:Ôl¸èFrrrjjj[/Ý·o_ww÷60hW;Ç333c2™sæÌÄÄÄ?~¼Q[[Ûºººž<êAAº•Úâ:ÉJJJ€gÏžýùçŸ4íàÁƒ %((¨Ùn¥ºººâ]AA~ü5EÁ™`Þ0xðàåË—_¿~ýÁƒãÆ,&%%•››[TT$Æu ýüü***:1o€Ë`¾zõj„ °j%===>>> €Åbñ×8QPPð÷÷ÿý÷ß•••áÈLAAáp8ýúõk´ÑÄÄ$##£¦¦FJJŠË媫«_ºt©¶¶ÖÎήénÞ¼Ùì|­ÊËË344lëÐñ¶å UUUÒÒÒÁÁÁül ¬¬lÒ¤I‰‰‰ÁÁÁ555û÷ï·°°ˆ‡pÿŧ@A–Ô××2Dp ‘H}ú8;;7M ÚÚZ{{ûÌÌÌ'NHHHô„¹0A¤‡ƒ"ÓÒÒ>}út÷î]ööíÛÈÈHÁbD"qÀ€m]I¼3ˆš7”––VUU .¹ÖTaaáìÙ³322233GÝá!‚ HoöèÑ£!C†èëëëëëÛØØH¤ŠŠ ;;»Fs"[ZZöF‚ˆåTUUwìØÑj¦óðáCŸÑ£G£¾‚ "\VVÖ˜1cöíÛ7cÆŒ“'O’H¤ôôtmmí¦zzzÝaS"%/l6›H$^¿~]”Âÿý÷Œ3&Mš$ÒåI$EEEQJBM»Œ ö*Üå oÄ;ðWîçÈ4QSLAD?~ü5j”‡‡ÇáÇ ¯_¿Þ±cÇ‹/LMMKJJ†ÙØØÌž=ÛÉɉÅb‰ýÈë@"å ?~d0"ÕÀq|éÒ¥oß¾MII™6mšðÂ&L¨¨¨å´MY[[«««s¹\1&ë  õë×tÇDæ€î‚ ­ó:óx¼‰'>xð€¿}çÎÅÅŧNºzõª™™—˽|ù²­­m}}=—Ëí I1o:th›‡òòòRðŒŒ Áe±D×Ѿ|ù2•J­¯¯ã K–,ã¨_ÌÐCépz‚ØØØ%K–49yæÌyyùýû÷_¸p¡¸¸ØÖÖ–ËåÒh´n µY¢v²¸sçN›Î{òäI///Ç›]™‚@ „Å‹·éœ|\.—@ Ðh´ššiiiñN‚ ‚ ]¯²²²¸¸¸Ù¤ŠŒŒÔÓÓóððàr¹=¤mBPëÖl6ÇqáKƒ7õìÙ³âââG5»·Ë€²Ùl‡óêÕ«]»vµç<‚ Ò•àÔÑAAAÂçhZ¹r%|€ö´¤ˆRßðòåKøÍ¾MçÅq<>>ÞÝݽٽwîÜËgüøñÅ‹¯_¿†@š"‰þþþ‚[rssUTT´´´¶nÝ:þ|¸‘ÉdÒéô6Eˆ ‚ ]¬  ÇñË—/ /Æår²³³1 SVVîšØDÔz}È#ž={&Æ©¯]»F Sªºº:øÂÜÜ|×®]ƒ ²··ß´iÓäÉ“ -(ý_?þÌÍÍlÚ´ÉÞÞ¾²²2**ŠF£1™L1‚DA.3dÈ‹/Š2!tIIÉüùó•••Ùl¶(g¦R©ô¶h¶(Z¯o R©âå ÉÉÉÏŸ?×ÔÔtww—’’Z¾|ùðáÃOŸ>ýýû÷ÄÄÄ”””ׯ_Ã’†3æ·ß~å´úúúð…¯¯o\\œ¢¢buuµêð ‚ô|·oß±dJJÊ… D)ÜÖî€òòr•J]¹r%ì8(J2!R¿ÈçÏŸ·5‡Ãñððxøðá¼yóìííKKK¯_¿>`À€„„„††]]ÝãÇÃÂ4íäÉ“ééé–––éééZZZµµµL&ÓÐÐ033ÓÐÐ0##£_¿~ñññnnnÆÆÆW¯^¥P(,kÅŠ,«®®ŽJ¥‰D1BEAÎÆb±0 »ÿ¾è‡xyyÍž=ŽÛl© @¸pá‚ñ`fbbúy<^ä <@ ´´&E«²²²8àéé&##˜0aÂĉùp///'‘Hl6›B¡H¤#F(((,]º¶qÀ÷ ¥¥ ‘HoÞ¼ùøñãÈ‘#SRR,-- %77·°°ÐÂÂ% ‚ HUQQ‘ŸŸÏo²EIIIFF†®®®ŠŠJKeœœœÄ‰ÍfÓéôúúz&ârš­ôoàr¹8ŽÿüùSì˜üýý¿|ùâäääææöóçÏׯ_¯]»¶¢¢âéÓ§%%% eee………?~46Þ4$ IDAT6ÎÉÉÑÐÐPQQ¹wïÞÍ›7O:åççÇŸ£[NNnûöí§N*--2e Ç«««Ã0,%%EJJ õ‹DAz255µ»wï¶õ¨ëׯ IÚ‰L&×ÖÖZ[[‹~Hëõ mZÒ»‘êêj//¯‹/Ö××ËÊÊêéémÛ¶Ëå<˜Çã;Çq2™Ìb±ètú„ $$$>>>p=PEEÅààà††8¿ÓÓ§O9@XØÛÛ»¶¶ÀårQ•‚ Òcµi©kèÚµkááá°ú¿éÞºº: dz²²>|øðöíÛ–Ù¦¦¦¦¦¦‚[’’’,Xðáǯ_¿Â--]EPëyƒˆ=9…¸téÒõë×mll`íE³£QáºÛ’’’\.—ÇãUVVÂí‰$!!!!!Q__O&“›¾+‰«YÚ*‚ ‚tØò.Æ8ƒ¼¼¼wïÞIJJ0nyùòå Aƒ¨T*…B),,<<\°LEEl²¯­­;vlqqñ°aÃLLLuttˆD¢¡¡!,©®®.++{íڵݻws8œ>}úp8&“I$³³³GŒ¡¬¬Ì`0Úœ7Éä‚‚Ø{qêÔ©íÏUUUGMKKSWW§R©ùùù?~äñxü™™™£Fzôè“É”€‹Wµÿº‚ Òíu/h“wïÞ…††nÞ¼ÙÜÜœÇãq8œ­[·ÚØØ¨ªªÒh´ÜÜ\%%¥—/_6,??ذa}úô‘””¤ÑhgΜéÛ·ïû÷ï555§N PPP8r䈓“ÓĉáÈD ‰ôäÉ“7n˜˜˜`&ä뺰vЏ¸¸ÁƒÛÛÛ:tˆ?²òóóóóó[Ú‹aXyy¹ŽŽN‡\ AAzˆvö ž7ož¼¼¼’’™LÞ°aƒÁhhh “É”’’3f ‰DRTTär¹}ûö¥P(ׯ_ç/ätäÈWUUE§Ó½¼¼¨Tê7ÌÌÌ$$$`ÿccccccXXØ4S-í`0NNNóçÏõꕲ²r~~¾ŸŸ¿çEg4hÐéÓ§srr Äáp:ïB‚ ÒõÚsx}}ýòåË™L&LA¤¤¤(м¼<™LVPP‘‘‘••UTT¤P(T*õû÷ïüÃ544`Õì)ÈápÌÍÍát‚ÿ<Çã ©ìo1o””TWW7003fÌ¥K—¸}ûöâââ¼¼¼Ï#""Þ½{7oÞ<6›M£Ñ„d:‚ òoÔþñ‰©©©§N¢ÓéԉƆøâæÍ›^^^üc §B€üù) ¿XKãÿ¿@K;àŠ9sæÔÕÕ9::Òh4›ˆˆˆÑ"Â0ÌÝÝ}ñâÅMÇuP©ÔÐÐÐ’’’5kÖܽ{—@  •‚ H¯Ô!8ooï¯_¿Â.p܆a°c#†a!;;;99™D"}úô Öp(++ïÝ»WCCƒJ¥bÿE&“Å @XNQ[[;gÎØ9‚Åbݸqcݺu}ûöMJJZ±bÅìÙ³E¼…B]@ Æëׯ÷îÝ;sæLCCÃVUUmذáÍ›7€iÓ¦‰÷A¤Çb2™µµµ<ÏÈȨýgûþý»ººú˜1câããù$ééÓ§K–,‘——733›5kÖƒ–-[–••U]]]VVæééÉb±ëÄ&¬9@RRRJJjìØ±<ŒØÑÑñÓ§O;wî¼zõª`£HKX,ÖÏŸ?srrÞ¿oddäééééé weeeUVVNŸ>Íf‹û ‚ HÏÄårát†Y[[·>$Žã?ž7oÞ¸qã`Fzzzuu5¿“É?~üñãÇ]\\ø*:j'aõ ü¦ŠFÛ F@@€¦¦æÜ¹sE¼Laa¡ªªêâÅ‹ ¤¥¥ÿý÷M›6)))™šš¦¦¦~ûö­i‡WSSÓþY®A¤»À5žæÍ›G£Ñ”••;ê̵µµÉÉÉññññññ‚ID&“á°ÏŸ/±•ÓÁ¦Š¦W=zôhEE…ˆ—9räÈ€`ÓƒÁ8{ölpp0\„",,¬oß¾ÎMaaa±dÉ’Ë—/‘Éd¸¢‚4‚ã8\륻AiN§Óé «V­¢Ñh±±±—.]266î¼é ÂüñáÃ//¯7oÞtø8ƒVNÇoª¸ÿ¾àv&“¹wïÞ­[·ZYY%''·z™ØØØÀÀÀM›6]ºt©¥2ß¿ÿþýûû÷ï—ý믿[=?ÒËìß¿?66¶ÕbG}öìêN‹ ½@ZZœ°¨»é`l6{Μ9sæÌ)))9uꔃƒƒƒƒCuuõÎ;CBB:öË¥¥åÎ;ŒŒŠŠŠÃ‡ïÀ“C­¯O›*å €lܸqÆ ¢ä ãСC¾¾¾ãÇoz*!BCC}||ˆDbG5Ì ÿ •••üµÍ„ûúõëˆ#Ž;6~üøÎŽª£DGG:t¨»£@z§eË–¹¹¹uw͘;wnmm­ð2¥¥¥åååžžžëׯº‡Ã±µµ•””Œ‹‹“••511™!KD'jý¿¦Š˜˜.—Ûj•ƒªªªºº:N/((ÈÉÉqrr*..^·nÝ!CRSSáBM'àd0¨j³@^CGGçøñ㽣͂F£Ñh4;;»¦»"""x<žˆ£OKJJΞ=kooßÖ¾Õ>|hSù–ˆú<–’’êÛ·ï„ šî***JHHprr’——rSSSÀ˜1cdee###§Nª¤¤”½wï^™–fhàp8"‰ j³@^£7µY´ÔT‘ŸŸõêU'''Ç DGG‰Ä©S§¶éê­ÎŸ!¢6|o©©E§Ó]]]…nbbX±bE¿~ý>¼jÕªOŸ>ùúú–––àâž ¹úTÙ€ˆµY H¯ÑkÚ,¸\®µµµ´´tÓ]QQQT*~ÛiÕû÷ïm¤ÚQ“´á‘\[[ëèèØìSüæÍ›Ÿ?vww‡Ïþf™˜˜”––æåå]»víÅ‹...‰‰‰&Lزe‹ðë6íñ€ "BmÒkô‚6 ØTÑtT %%¥  @øc”ïçÏŸ8Ž+((4Ý¥¬¬¬§§×ìQÝ7iªàñx'OžÔÑÑ2dH³ÇbfbbB"‘nݺeaaQ__÷îÝÙ³gß¿æM‚§j"ªoè-Ž?Îb±ºø¢¨ÍAz^ÐfÁf³œœšnçñxQQQZZZ“'Onõ$FFF†½|ù’¿EUUõÔ©Seee?®©©ÙµkW££º!oà8ÞìÀÏâ––ÒÓÓ“———““ãñxd2Çq~CË›7o˜L&?mlÚ›Õ7ôÇ×ÑÑ kºäk§BmÒküÛÛ,„4UÄÆÆ²X,Qæ5€ý333I$’‹‹Ë«W¯ çÏŸO&“Ïž=K§Ó%%%›ö8ìž¼ŽªhöAÎårAËÏø™3gH$RÓʇsúôi …kšæ ¨¾¡×À0ìÇÛ·o700 q²úŽ‚Ú,¤×ø÷¶YÐh4*•Ú쨊òòò+W®ØÛÛ÷íÛWøILLL¶oß^YYyüøq--­‹/NŸ>ÝÔÔTÈôÍÝ“7HII©¨¨4ÛT!$o€kþü¹¥Ó.[¶,$$¾nš7¨¨¨4í,‰üÁv;ss󪪪;vèëëÿøñ£Ëèš6‹ŠŠ —üüü?3Ò¹¸¸4­îTVV–––Ö•WìmÙÙÙ111­Žl©©pèÐ!2™¼xñbág011yñâ…¥¥eNNÎòåËUUU?îããóþý{›úúzÐÜ ƒŽœØæ¯òeeeqqq‘‘‘p|D£€šØqÍš5ÚÚÚ‚kzJHHþ‚¹\®ŸŸ_DDÀÞÞ~Ñ¢Ennn+V¬ðó󫬬´··GyCïó†ôôtKKËêêê]»v}ÿþ½kbè‚6 ‹uýúõ1cÆx{{ÃáBjòäÉšÿ¥§§·lÙ²ŠŠŠÎ¾hºÿ¾³³óðáÃõôôæÌ™3kÖ¬ðððîê¼|ùÒØØ¸¥Æµ‰':88tqH=Ð÷ïßííí­­­»2{èim?~üXºt©––ÖáÇ…Ôp¹ÜéÓ§7[1žžþþý{777!í²²²ÚÚÚAWWwâĉ,ëÞ½{7nÜ3fLUU“ɤÑh 3'¶ù,***d2yùòå™™™oÞ¼Y¿~=¬Qi¶¾ðõë×ïÚµëåË—üˆëëëš.ã1bĈ”””¨¨¨ØØØèèh“eË–Q©TÇQSEïÀj;qâÄäääû÷ïO›6­¦¦&<<ÜÀÀ 00°ËxÚfû~r8œãÇ9200°S[d¼½½á0î¹sç:88<~üÎ]ÿ¯píÚµ… ;88ØÚÚ¿yóæãÇÝ×ÿøöí[UUUKyƒ››ÛÎ;»8¤ëÑ£Gööö666ééé]vÑžÓf?â>}úäáá¡¥¥uðàÁf{‚ iª€kjhhL›6­¥«Œ5Š@ ÄÆÆÎž=ûóçÏGUTTôóóëß¿?ƒÁòQÖmy@RRÎ<­ªªºk×®ââbøí @$Édòܹs7oÞ|æÌ™üüü]»v=~üXpúL ꪪ†Îߢ¤¤d``@§Ó---ùCPôõõàµÚ÷‘ÇñFStŒ7îæÍ›>´¶¶f0»wï644ü믿ºf¼CÓ6‹üüüî?³ú÷ïïèèX__¿{÷n##£ýû÷wÒX’™3gΞ=°|ùòÀÀÀõë×?zô¨ªª `ggë!®_¿îä䤣£3þüÊÊJÇ‹ŽŽ677×ÖÖ¶³³»uëÿ„g÷îÝ“&MÒÖÖ666¶±±Y·nÜ•žžîè訣£cbb²~ýú/_¾FròäI+++mmmMM͉'nÞ¼Yø.&“¹eË–Q£FݺukÛ¶m;vìHMMUPP€Ý«[ŠÐÂÂBSSÓÝÝÝÐÐpذaNNNïÞ½ku—ðà…¼åéÓ§/_¾`nn®©©©¥¥µwï^¸+11¾#MMÍââbÁ[!F𽃬¬,•J}øðá¬Y³lmmïÝ»×5×í!mð#NCC£oß¾………+V¬ÐÔÔÜ¿?l8$¤©"::šÇãÍš5«¥«ÀÊþ°°°íÛ·ÃY«§NòãÇ÷ïßÃäð¦ DG 2½( ÃäääÞ½{7xðàiÓ¦Á%$._¾¬¢¢ p¹\8J¦6›Íd2eddTTT222 ‚ƒƒáÚ©µµµeeeü‡Ê¥K—`§ …rýúu¼e<¯éÆÂ¤¤¤ÏŸ?Ã{צcEÙ 娖.ÝôXÁ’ÂÏÜêE›žPøiaÉ–öÂßìСCE¿Jòo„ÿoíÙ˜1cŸ={¶iÓ¦›7oîÛ·ïÈ‘#:::bÿeжY˜˜˜øùùݹsÇÄÄÆF¥R) õ¿( Fƒ[_ î¥ €m***.\ÈÊÊÚ¸qãíÛ·7oÞ|èÐ!__ßyóæuꛪ©©Á0 ~@,Z´(99999yíÚµ4ÍÞÞþáǯ^½277ß²eË™3g&L˜`ee•™™¹bÅŠ8±›¯¯ï•+WÌÌ̦M›VPP––ç´OJJZµj•®®îüQSSsëÖ­¬¬¬ÄÄDIIIÀÛ·oMLLà×¾ää䢢"RK»ž={V]]íååÅŸ+VBBâØ±c°xKš™™:u*==}úô銊ŠIIIK—.MOO'‰Bv ¾¥· Xºté;w’’’~ÿýwiii ÃÌÌÌà.}}ýeË–ååå%%%5ú-ˆ|GýÀYðßg˜à‹F?6zÑêváàÿNÿþý}úÄ/ “ÑܹsçÊ•+Û¶m{ñâ…§§gHHȆ ÜÝÝùêü¦Š¦õXµµµl6¶54kÒ¤IÕÕÕð“þ³Ùl¸+++ËÒÒ¾î¼Aâç ?~ü——§ÓéT*¾f0ÒÒÒl6ûÎ;ªªª<ÏÈÈNKK›4i‰Dzòäɹsç?~œ••µiÓ&øÅ‚Ëå‰D‡óìÙ3þùƒƒƒ333ãââ$%%œœ²³³ BVVVddä«W¯D‰ðíÛ·b¿;¤‘ö×À:*Ð\« ¤¤„ 999YYÙv^Nt………ðs–D"aÖÐÐÀb±X,VMMM{N ÿ¶MLLRSS“’’<<<>þ¼jÕª={ö¨ªªvLô<Èáp®]»fffGy988HHH$''ìÞ½[]]–üòåËÙ³g—.]ºqãF—Ë]²dIxx¸ƒƒCIIÉ•+WV­ZÅoìðññŸJÿý·¬¬,|(**Nœ81!!áÂ… °Î®³‡ã8•JÕ×ן1c¿ù¶¥]ð÷ë×Oð]èêê püøñ§NŠ…kééëë¯[·®¤¤D]]]È.!Á·ô–ŽŽŽ²²²IIIîîîü©««¯Y³&99¹QÞ ^ðíüíóEDDÀ¾bNxžÁÿ¿–––öóóóôôÜ»woDDÄýû÷íìì&L˜Ð5+À6‹   »wﺺº"‘Øèyß±Wܽ{w£-8Ž„ß~ûÍÁÁáêÕ«^^^………ÞÞÞÛ¶m ]²d ¦3gÎ}òóóc³Ù+V¬ðòò‚»Œ%$$ø= ¡¡@ \¾|¹Ñ…>~ü¸cÇŽ;vÀaï÷°°°V#ÌÏÏwuu>}ºxoé Øÿ~/¹uëÖ–-[>|PQQñöö^´h‘‰Ž•››ëççWTT$))¹oß>ØE‚Í ÍNÌ"Š”””Û·oS(”øøø;wÂ&^6þüU«VihhìØ±~ïXwïÞmék+ö¿UͰe055•ßütûöm)))yyyØÎ˜­¥¥Õè$ýû÷'qqqÍ.A—ŸŸ?dÈçÏŸúô©¨¨èܹsaaasæÌ‘““ki—‘‘N?pàÀ¾}ûøŸ’òòò°z¹ÙÅ»9B‚ò–‰þØr{Å ½Ö®] ë9:œð|âÝ»w“&M0™ÌèèèÐÐЯ_¿ 6lØ`mm=hРΈª‘ÏŸ?ûùùåççS©ÔÐÐÐyóæ5û¨C„††R©TÁ¥<<¼¤¤„*&“I"‘{”ÇÇÇkii•——2dΜ90¤R©–––5ðG̼@ P(”çÏŸ=`bbòðáCggç}ûöñÿtŽ?~òäÉ#FlܸQCC£²²faaÞ¼y‚ ±X¬Ç·:ÏÆÆF¼€‘žþÇòx¼ÔÔÔ€€8RYYÙËËkñâÅ--ˆÚ®\¹ò÷ß744èééÅÆÆ¶4?ºx`ÿG~õµ¼¼ü’%KÜÝÝ•••;ð*| 7nÜÀÑ÷ó•š IDATh‚#¸:ôâÅ À‘#Gddd¨Tª‹‹‹œœÜ!ClmmÃÃß>}:xðବ¬W¯^mذL&ëêêšššúûûß¹sgÀ€'//ïÕ«W©©©«V­Z·nµµµ™™‰DÊÏÏõêÕ²eËÜÜÜàû ƒ]Y,Ö‡¤¤¤à×Í–vÑéô€€___++« &Ðh´§OŸ¾|ùrîܹB"„QG?¾ªªjrr2àæÍ›Bv ^È[–““ôéÓàçç§££SRRòøñc;;»Í›7Ÿ;w®¨¨ö¿;|ø°ŒŒÌ°aÃf̘!^ðñ·Ñ±°:L@ð9W\\¬¤¤ÓbCCà 6LŸ>½Ùò!))iÇŽL&SKKëØ±c°Í«+ÁwúòåKØ0çáááç秦¦Ö´0\ÍqÊ”)Ó¦MûùóçÙ³g;öøñcÐBÞ ¥¥uûöíF#t:}óæÍF¢©©©ÅÅÅ?~<..`aa±zõj;;»Žj£¿ƒ´´4L Ø\çéééêêŠãøŽ;V¬XqéÒ%YYYX ¨¨¨Kòx¼†††F«…JKKgdd¹œººzPP««kRR’*HOÿ©–,YRPPPRRòôô\ºt)¿Zh©m¢Áñ<OMMmåÊ•...°Ö´“DDDÀIÕΜ9£  °`ÁþýüçŸ gÏžÉä±cÇÂÎØáááC‡½xñâƒúÛo¿Á£>vëÖ­ÔÔT …¢©©éãã#''7kÖ,*•zèС .555++++++x”ªªªŠŠÊ£G222¤¤¤Œ×¯_sA!»UUU>|íÚµ††uuu•+W ‰~°ž>>±±±YYYpZžèèhþtvgΜÁ%‹Ä¾³þ>º ¬u€Ó¸þùçŸÓ¦M벌Åb…‡‡_»v 0gΜ¿ÿþ»SÿéZß/ƒÁ P(‹-Ú´i“àÄEMQ(ø‚D"yxx,[¶¬°°022’H$¼aèÐ¡ÆÆÆ†††£F277o¶ˆŒŒ ößÞc†õíÛW[[v‚†úôécooº½ƒ ÇKJJúõë———·sçN%%%__ßÝ»wëêêÊÊÊ~ÿþ½Ñdj¡i]4—Ë3f ÿÍ/\¸ÐÎÎNEEEAAAAAAEE~…:qâ„‹‹KûcFºü§*((PPPðôôtssëâÿm!m¨¾¾~ذa«W¯vtt„}ž;UjjjK»nß¾ÝÒ.‰´råJø„nDJJjË–-Í.T;}úô–ÚþfÍšÕÒÈ1!»ãÇ?~¼è6z¿‚½¤…ì¼· yxx4}´ ¹óbß;ýùçŸS§Ní²ŒüoÛÄ®]»,XÐe—nÃ02™ìêêêïï?pà@Ѽs玵µõÏŸ?aÿ$##£’’þ„Óååå,K°R6##öóõññ166Þ¿ÿرcׯ_Ï/PVV_<þœÃáH$×!Í4íÊpÿöí[ß¾}kjj\\\~üø±sçNººº   ;v¼zõjÓ¦Myyy­ÎÃzêÔ)WW×ììì+W®Éä¥K—ÂfQuuuÀf³á—B”4ü«Á>D+W®ôðð褾BtjÛ„ KKKggçN:9‚ôLòòòçÏŸ‡Su¥no›4pàÀ²²2~M•ˆØlöŒ3>þ¬ªªJ¡P NWPP€ß¢CBB|}}ùÍ\.·²²REEeĈ»wï¾wïÞ¼yó;â8ŽaXvv6ü1''GVVöâÅ‹ÖÖÖ<ïáÇúúúD"‘N§‹—Þ‰™7ðx¼ŠŠ •ÊÊʵk×¾|ùr×®]ÖÖÖ8ŽKHH$&&nܸñèÑ£ÎÎÎGŽ©©©ÞËÌÕÕ•ÃáhkkÀ- ]3ˆé2ÎÎÎçÎ벞|]Ð6!¨“ú1 HOÖ¯_¿FCj;[i›ÔêzTMá8N&“Ÿ={6räÈœœmmíòòr8à€ßá–Œ·±±!‰Ÿ? ‘••uss£P(ÿoß¾¥Ñhü¼PWWgkk;oÞ<[[[##£ÏŸ?ëèè`&dÀ§mÎx<Þ?KKKW­ZuçÎÍ›7?~Àápø½lll/^¬¬¬leeuæÌ8RHˆ$Ipä ¿áé5æÎÛõíš¶ AºRÏi›h'‡C&“ÚÚÚ<OCCãÍ›7ÉÉÉüþ7ÐäÉ“;–0~üø­[·Â¯ârrrpmLÁ'æðáÃùKEòá8~öìYØÕ zðàÁÈ‘#ÅÈÚÐÔ'c ………ÆÆÆ}úôyÿþýêÕ«“’’øƒ†ù( ‡Ã±³³ ›6mZZZ‘H줩v¤YW®\Y²dIQQ‘žž^ZZJ¤HJJZ¸pa~~>bðïMd2¹¡¡¡®®Ö.ÀþÇWVV>pàܘ““³fÍ;;;vîܹµk×>}ú€ã8œ¬Z0i€‡\¹rEøuûõë7dÈØE½­DÍ`ŠÜÜÜ™3gŽ5ª®®.;;{ß¾}pJ]Ø…¸)Øcܸqðã{ÿþýT* CNU[[ëïïÚÐЧ[î¼ ‚t ‹Àd2çÌ™sçÎîíÐÐ!(Š®®®à0WÇ ­¬¬ìííoß¾ííí=cÆŒÔÔT'''8–ÒÜÜ–äp8YÔ×××ÕÕÁ9ÖšE æÎ›‘‘!+++^gQÛ)˜L&ƒÁ055ÕÖÖ¾~ýº­­mee%Žã‚ËSµ"ŽãC‡MKK›6mZvvvdddmmm·7D!½j›@Þ§×´MQ__O¡Pp?}úô… ÜÝÝåååÏ;7nÜ8Ф547Û4‘H$‘HƒÎÏϨ¨¨ìرCII N”——WVV†uÿbwó5o “ÉJJJ¡¡¡ëÖ­ãñxl6›?C«àÐyyù{÷îÙÙÙYYY¥§§wÔ€i¤ËÆM ÒezÔ¸‰ÎP__O¥RI$ÒÉ“'8àìì|á™L–““›?þÞ½{UUU[òöxôèÑž={¸\î¨Q£~ûí·ªªª¯_¿Âñ‰‡@ ´§o¸¨Oî'Ož‰Ä 6À·!ƨt)))—’’"##“››+¤AăÚ&¤÷é•m‚®]» =ztøðá™™™ ÞÞÞ)))d2ÇqMMÍ={ö¸ºº>~ü˜@ ´ÚMD"½xñbÛ¶mÁÁÁpÂ1999]]]iiiIII8Oe{)oÈÈÈ=z4œNµ=N)++—••]¿~]YY±D:VnnîÂ… SRR$%%=Ñ©ƒ-éŸ?^¼xñµkרTêÞ½{>ܛڸÓ§O?|øðСCÏŸ?éÒ¥ÈÈH¸8°µµ5Ã0 …"//áÂ…M›6ÅÄÄP©Ô¬¬,ágž2eJç…-RÞ`ddtéÒ%þ"³bÃq\]]Ã099¹®\Œéõи é}zÓ¸‰Fàã“'OŽŒŒÔÔÔ ß»wï­[·úõë‡ãxÓïÕRRR\.7!!!..ÎÓÓÓÈÈJè"å ’’’ƒ^³fM;/Æãñ>|øàéé g³jçÙZ¾|9j›@ޤ׷MLœ8qÏž=C† ñ÷÷÷öö~ýúµµµ5›ÍVPPhéᨬ¬üíÛ·+W®ÔÖÖN:•D"±X¬.[\Hý"Y,–±±1øïì•b_Œ@ ¤¥¥]¸paÏž=<¯£ÖØ@z«ÂÂÂG /ƒãøóçÏѸ é5JJJþøã¢¢¢^7ÁøÝï~—””deeuýúu±XÌ}“gGGÇ .¤¤¤˜››»ºº^¼xÑÆÆFóMYºti{{û¼yófò¢ð8Zºt)Ǻ++«C‡=v«’ߺu ÆÝºuKÇè;wr9MGö›˜&CCC/¿ürOOÏÈȈ­­íTß¾nݺÏ>û,22R"‘feeMG“˜Ñ¼°åpãççççç§í(¦ËÂ… ÿþ÷¿§§§k;˜…˜•u­­mww7—3CCCgåÜ«½½ÝÌÌL__ÿ¡‡ð½½½|}}=<<437ÀìΊÆuþüym‡ +Ö®][^^ÞÕÕµzõê‡îä»ï¾suu‹Å3ÿœò€™000```àïï¿dÉ’G|ÂÕÕµ  @(nÙ²eÔâÓÓ +=ÌfýÇÄÄÄÖÖÖG©Ê"¢·ß~»»»{æwl@Þ0C˜9++«Gé„YÅ ²²ò­·Þ*//×Ldœ!oxÌÜ¿Á‚÷ïßÿÍo~3×F}ÀcF XZZjåÒo®7WÈ€+ä Àòà yhØÈÈH^^ž‹‹‹D"±··ß¸qcXX˜vCª¯¯·µµíïï{H$ÅÄÄÌ|H)<‡ –œœœ••õöÛo;88ÔÕÕýá`÷a×–¶¶¶¶¶¶_~ùeìm™™™³u£^€é€ñФÎÎΣG&'''$$¼úê«r¹<>>ÞÉɉˆ:::ÂÂÂ-Zdkk«P(˜oÿööö"‘hÓ¦M‰dÅŠ¥¥¥L?µgdd888˜™™¹ºº?~œ½tGGGhh¨T*•H$ÎÎζ¶¶?ÿü3¹¸¸xyy‘T*‰DìF2---–––‘‘‘žžžêýpàIƒñФ7nôõõ½üòËlKhh(óÂßß¿¥¥å½÷ÞëîîNMMíîîNKK‹ŠŠÚ½{·¡¡á±cÇÊËËÃÃÃe2ÙSO=5Q{RRRIII`` X,nhhP(<oçÎDäëëÛÚÚš`llüÙgŸ;w®³³S$åççWTT(•ÊÜÜܹsçš››3ñ˜››ÖÔÔ$''«„)Å©©ûVYY¹ÿ~™Lwá¹\þÒK/Éår"Ú¶mÛâÅ‹‰èË/¿tww'¢üñ/ùË䇔Jå¹sçÜÝÝõôô†††æÌ™+:Â;wî(•Jg``0444<<üþûïQJJÊçŸíííÍœùÆo´¶¶~ñÅúúú3!)ŠÞÞÞªªªçŸžˆÞ|óM;;»É#T*•===—/_^·n]BB‚zoÓá$âââ”Jå4u AÈ@“˜oç£ÚoܸñÕW_ýãÿXµjñù|¹\ž’’²téR"úè£LLLÌÌÌN:ÕÓÓ3oÞ¼‰Ú ïÞ½«þ絤¤dçÎׯ_ÿæ›oØþ7oÞœžžÎ,¦öÜsÏ1à 7nœ?>ûFçáá1êßÀTãÔÔ}{á…\]]ãââˆhݺu®®®LÒ@D–––)))Dôûßÿž}ñÀCqqqL#Õ××§¦¦|øQ"ándd$???77·©©I"‘XXXX[[;vlf®>®úúz///•J5¶\I$…††ªg07€&™™™…„„„‡‡«T*GGÇû÷ï—––ØÛÛûûûGDDtww>|xëÖ­úúúuuuDTUU%“ɉè‡~X»víDí~~~999ÖÖÖ«V­jjj*--µ°°8yòäsÏ=gmm½cÇŽÀÀ@‘HÔÒÒ’——½uëVú>‘——'‹Ïœ9SSSóÕW_utt466ÖÖÖQEE…©©éúõëW¬X1¥85xëš››ÙÍÍÍlûž={F¹oß¾¥¨¨ˆ©2yh!!!r¹üé§Ÿ¶³³sqqY°`úQ™LVZZêäädnn.‘H¸¯ñ'7Q„DTVVÐÛÛ»k×®Iò†GðèÑ£¾¾¾ìžÙÙÙß|ó‹‹ %$$tvvŽûïìÙ³·oßfuuu½«ÓeÎ0òÐ0¥R¹hÑ¢?þ8''ÇÐÐÐÝÝ].—ëéé•””Èårf†ø7Þ8pàeffQ``àÅ‹srrˆ($$D¥RMÔž˜˜( ‹‹‹óòòLMM™â}}ýÓ§OËåòôôôˆÅâ7zzz2!ÙÛÛïÚµ+33shhhåÊ•‰‰‰‰ÄÓÓó§Ÿ~bN_ýµT*Rœ¼oVVVìÿv0ÿQ0‰óõÔÓÓsÆ Ò›­­mzzzww·J¥***Z¶l™ú¿ØE‹566VWWïß¿_[Nn¢kjj,--y<ž‘‘Q{{»X,ž¦Ïž=Ë 60ù|>“7L¢¢¢"##ƒýÑØØX½xZ±eÎAAADôê«¯ššš¶¶¶QGGGlllYY™¡¡áöíÛ÷ïß?gÎ{{û›7oº¸¸üë_ÿ‹Åiii¿ýío‰h¢öááá?ü°   µµU*•†„„0—îèèËåååå½½½‹/¾wïÞ¥K—D"‘‹‹Ë7ˆH*•Ñ3Ïâø–èèècÇŽ™ššQkkëØ?²c3ÅŽðÆFØÛÛÛÕÕŦ‰ýýý;vìà¸LÙCD¸zõêââb??¿qvwwóx£Ÿwvv.**zóÍ7™ïÞ½{îÜ9___ö„ˆˆˆ¶¶¶ÂÂBÏ  ÌÆ…¼@ûÞ{ï½Ë—/+•Jæ9ÌË—/Ëåò°°°… ‘J¥úä“O˜º9¡Pȸyó&û<¤Æ#ܽ{÷ñãÇ###…B¡¡¡¡D"Y·nݲe˘£¯½öÚ;ï¼cbb2gΜùóçoÛ¶ñ÷÷ÏËË 311êݪTªöööç (s†qéQppðŒM˜Í™LÀ–+ËÏÏÏÆÆfÔr:ê¹\þ§?ý)44tT™³»»û/¿ü–Ëd²ììì?þñûöí+..–Éd'Nœˆˆˆ(++[»víDí±±±999ÁÁÁ£ÊœÝÜÜ„Bá¸eÎW¯^ýõ¯7n™srrrnn.S欧§7¥8§zsÒÒÒø|þô=š«ƒúúúò€'΋/¾XZZ:ê ´NA„:bxx877÷ã?nhh`ÊœcccŸ}öÙÛ·oËåò/¾øB lݺõÀ†††L½!ŸÏ¿xñâŽ;jkk­¬¬T*ÕD탃ƒ‡*..nkkcÊœCBB˜âÓææf¹\~á¶Ì9))‰˜ˆ/,,dÊœ}}}ýüüÙ2g"bËœ§çToòä \=±yö§®7WÈ€+ä ÀòÐ!"5Yny”úúz[[[fA˜*¬û:$77·²²’yÛÈÈÈÑÑQã—˜dSx Œ7€qsssss#¢7Êd2 "²··‰D›6m’H$+V¬(--eN¶³³‰D[¶lY¸p¡D"Y³fMqq1UVVŠÅb‘HÔÙÙyøðaSSSæ5¹¸¸xyy‘T*‰D«W¯ÖÚGx}zò-£4UªŒ’çƒñÐ!AAAÉÉÉD¼mÛ¶ôôt"ÊÌÌ$¢ÀÀÀÿüç?999D¾ÅÃÃ#;;;((èܹs …‚y;³AÎÁƒ£££þùg"ÊÎÎfη··ßµkWfffLLÌýû÷güSÌN}}} …":::%%ÅÛÛ»°°pÓ¦M S-UFɳŽÃxè«W¯NÞXUU5êhjj긕 ©©©©©©ã^E¡P(ŠGÆQ[[ÛÝݽmÛ6¶Å××wûöí+W®Œerô€€§T*™òóó+**”JennîܹsÍÍ͉(*****Š)y–J¥W®\y÷ÝwÛÛÛæÔLä ð¸º~ý:UTT,Y²„-„]Ãçó§TªŒ’g‡y x\9r„ˆ‚ƒƒ_ýuChÝòåËŒŒ>ùä¶åÓO?]½zµÁCô†’g…ñx\;©ÚÂçóãããcbbîÞ½ëääô·¿ýíìÙ³§OŸ&¢)•*:tˆPò¬Ã7€fÏ;7###??ÅŠŸþùóÏ?Oj¥ÊƒƒƒR©”ˆ²³³?Nj¥ÊCCC+W®LLL”H$ôÿ’ç;wîX[[+Š·Þzkªýhí.ÌvzDÌÜ÷ÙD&“lÞ¼YÛÀTVVzyy555éx¥BZZŸÏ?xð ¶™9}}}õ  CØ’ço¿ýVÛ±À80O:„-y‰D×®]Ã:Nºyè”<ë8ÌSWÈ@ Dc0˶‘H$Љ‰Q?ÿÖ­[–––£Nc`3€™„y ЂÈÈȨ¨(fEX"ºví»^,eff._¾\ý|ssó'NTWW3ÛO¨Ãf63 ã  Ì:²nnnVVV{öìÙ²e‹³³³P(lii±´´ŒŒŒôôôTWÐÓÓ[¿~½››Û¨~ÆÝÌfxx8##ÃÁÁÁÌÌÌÕÕUýãøøxfÐâèÑ£ööö‹-ÊËËc)•J‘Hdcccgg×××7Ý7àq„ñÐæ…H$ª¨¨ "ssóššš±ã ãw3›¤¤¤’’’ÀÀ@±XÜÐРP(x<ÞÎ;‰(,,ÌÄÄD©TÆÇÇ¿þúëb±ø¯ýkPPJ¥zÿý÷÷îÝ»lÙ²?ÿùÏ/^ÄŠ¶ãBÞZsòäÉæææ}ûö±S <ÏÃÃC pìaÜÍl ïÞ½«>ñQRRÂä Ì^8J¥2<<œ=ÁÜÜ|þüùYYYvvvnnniiiÌ Œ‚¼´ÆÍÍÍØØØÍÍÍÐÐPƒÝŽŒŒxzzFDD°-B¡pÔ9Û·oõ–3gÎ|ùå—µµµeeeW®\ÑÓÓÓ`T³•ƒƒÃO?ý4ª‘]íQ$…††¦¤¤°‡nݺåääÔÛÛ«~£¾¾ÞËËK¥R¡\I—!o-`׃ …Ìž4ŒºººÆÆÆÚÚZ権©éúõëy<Þµk×ƶÓx›ÙlذáôéÓÖÖÖ«V­jjj*--µ°°8yò$UWW_ºÃ*…±òIDATt‰½ôòåË™%îe2YWWמ={<<<JKKûûûù|þÌ߀ÇÊœŸ4È@ ØõàˆhïÞ½r¹œi÷ñña¿¸ ‚¯¿þZ*•úøøü÷¿ÿÛNãmfãããcmm]\\œ——gjjêèèÈLRÑŽ;š››ÙKoß¾=++‹ˆ,XÐÕÕÅ„ñì³Ï iàˆ-sîèèðññ)//?þÏ׿ŒÇ(zÌ‚R’“êÀe£ d6«b¤0Š ^Fæ ‡É‡q2q®äµPHcßo‡k"³šÎ“4>ôú`TÈÉá ¿K ãHk%±¦ |!.¤è€uoÂå}Þ F€Ñ–³$]˜ôµñ`„ÞÑvxa hº¯5*1Wö§DvŸŒÏ¤¢³p$1í¸äÓŽ|AJ LO Â'S ¹k/ qœ5Måw/ u>hÀ¥z´Ñ è‡Ç_Ì·¼†Ç~goØD¨-`C ìÒ›OHÀ[1¡z{-–m‘s;-¯¤g*mš‚µ"Ÿ½×®’úþðô¯>ÆëM~õ{åð@â/d‘šR’Iœ×Ý€}ß» Vaôh•k“†6 bF^–?ÚU¨`9”]|(ÿúö}-žkÕé7sö×rL7ïj·Ý_«'­×6pÕ迱ãn@A.ã•©¼;&G¢Ô&ÒúÙ5hÐÙÙ_`ˆûåsÓÒ©Îpò„Äa…L¸Ø^KÄè…éÌ›|š¿Ghì 4.·'Uç<ŸBå–¡ô¦ÇSY$Â0›P î–0†¥ã°¤a”5öÒG\³Ž»µ?pX"ôþK9KZ"ž–†ÍÉ~¶>„Ù< þà} âëêh¤Òþ5×v^º­¤‘Âv‹äûzÄRÓ"È„ãRšîc<ª˜a¦|®}.8—Jqî0Èa)Õ‚IƉ¯qÛŒ}æáu.‘ŠW@:€YS¼y1X5Ч@Ü…QtÄ~]ùßšn|i® w°Y·ñEª­=iþ¢p=½OÒð?à£Q碤—`@ÏòpÞH/bJ:W%riëÊ‚ÒøŽc/@¢¼PSßWÒV&b¨u¢1ó•K9íeƒœr:ÈéEËéãÌ€R`¢½}0ËÔ «“ÖÎU¥OáUQIæ2H„Øx“ &T!.„*UЉKiíeG•­!.±d>DÐB2¥•Óºµ~À~Ri=W…ù ­—)­kŸŠj€¨Üç.½VŠ8×¼Ð7@šØœ¿¼¬Në{ä ­ƒ´ÒzÉÒúz–t®Ûfb[ͨÝ€b1]$ådÂ4ÂåÙ Ñ÷œÙ×Ïi27Y¶KÂþ¼YWâ:ÇÚ°$‡ «Ëƒ”¼‡“”ΕMeQ—¹’ŽäÔÖ‹ y-0‚kÇ);o8¤uÎCZ‹¹ý¹ÄCZMÖ¾s}6åûðŠ:µö”')ˆ€†Û*m?¶µWaíÍ`éÏ`é–ã`é]ÖR¿å (Ç*­¥·ª!µžXÔŽ)Ž?åY?ÂÆ†à~ж–º—2ªvu@|¿È?Óñ"{8iÈ1ãÖsüÅE0¢ $lW.`Â5®Öà(‚šÿ¦®jé~#׸V3çÔYV=l1ûàwýÅ] #&J$ZˆŒý‚{-Àô]‚ÈüãË—Ï×ÞŸŸìïŸÞÁo“ÏÑ 'nvÇêWå 'ÇÉIy]|gàíÕÞ— Þ^ý^˜µ1xXmod_perl-2.0.9/docs/user/handlers/connection_cycle_process.png0000644€ÿÿÿÿ00010010000006177411727205032025005 0ustar ????????None‰PNG  IHDR½ñIC˜±sBITÛáOà pHYsÐй‹çŸ IDATxœìÝyö½DR¡h‘BZQZ®ÜÖÛ´Šö,}¥d©´«TÒ¾|ÛT–„Šh¡ºJ¡,e/1Ì>ç÷Çsïü|-cŒõêy¿úc欟9“9Ÿó¬ ‚ ‚ˆèëëO˜0¡«#AA¤ûâóùáááÀÕÕ5,,¬«ãAA¤ûb³Ù4ÐÕa ‚ ò¯òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄ…òAAÄEêê:Š··÷«W¯º: A¤Çrtt\°`AWGÑÙzlÞðêÕ«aÆ9²«AAz ëׯgeeuu] Çæ €‘#GNŸ>½«£@Az ×¯_wu]µo@AD\(o@AD\(o@AD\(o@AD\(o@AD\(o@AD\(o@AD\(o@AD\(o@AD\=y¼HAåçç÷îÝ»ÿþ÷¿m9ˆ§§g```{… zõêU£’@hhhQQQaaá… Zµã­[·.^¼8xð`iié 6P(qö ËÎÎÆ0¬OŸ>ëׯ—(dD¨¼AÅßßßÓÓsÒ¤I~~~}.___MMͶ!++«GhlëÖ­í~Lq¬^½:00°oß¾­ÚëíÛ·;v숈ˆð÷÷Ÿ={öÄÙ+))‰Çã…„„ìÝ»—N§'&&J2" ”7 Ò£øøøxyyYXX0 6›ÝÕá´àÌ™3NNN]EWŠ]°`¬¬,@WW·¤¤Dœ½"##áë%K–ܹs§CDþª§@¤§¹~ýúäÉ“ËÊÊîÝ»÷Ûo¿Á…þþþïÞ½=ztvv¶¢¢"—Ë=zôï¿ÿ.Ü+<<<77ÇñÚÚZGGGcccáªèèè”” Ãx<†a`Ïž=p•@ ð÷÷¯©©©¬¬ôðð:t(\ÎårøöäÉ“·o߆ŸîþýûÂT&<<<;;[ô%}5Dïéé ˜7oÞåË—ƒƒƒÅl‹ 6›¼k×. ö%‰íÒ"”7 Ò£dddhhh‡S^^®ªª WõïßñâÅÂ-—-[¶~ýzx§äñx'OžÌËË#“É¡~iùýû÷ëWºËÊʆ…… ßêèè(Jý»WLL |^‡x<•J­Ÿ7TVV”••믪ª*-- PWW—’’×&'&& “€‹‹‹‡‡ÌâââBBBê®äää/”ˆ«Ñbðšššþþþ-žB|<ï?ÿùÏÆ…¥/¢ñùüúoqoÇ`Ñ~Ѽá—7醆†]Â/íܹs555ð±˜Íf_¿~}åÊ•pU㻋@ €/víÚ5mÚ4á–õÛç ·Â0¬Å0ÔÔÔD—Þ‡‡‡ k軄ˆ«ÑbðíXÌ`2™›6mZ³føm*A]]L­Øl6ÇkÇxÑ~ѼÁÂÂbÈ!]Ò½{÷îÇ]ů«®®®¦¦æôéÓð-‡ÃY¼x±0())9sæŒð!ûäÉ“VVVðuyy¹ðyúýû÷EEEÂcš˜˜œ;wÎÑѾ­ªª‚MùDG2jÔ¨‹/.\¸°Éµ ãçϟŠqXZZž:uJ˜jœ>}ÚÒÒ¾ž:ujDDÄ’%K„«¾~ýÚâE\ ÑÁ·¯ÜÜÜuëÖíܹsðàÁƒÑ ÈaíÚµeeegÏž­ßˆaÖ¬Yááánnn€ˆˆ;;»N0€««kýb·žÁÚÚÚÉÉ©qC$HQQ1''§“CB~:::(oèB...µµµ†††[¶lÅÆÆN˜0ª{zz¤§§ËÈȰÙìqãÆ988À_¼xqöìY)))‹¥  ðâÅ‹#FlܸQQQpêÔ©—/_*((Ðh´>}ú899ÁnÿØØØ 6888ܸqcß¾}ÖÖÖ>>>ÇÃÂÂ>|ø --M§ÓÕÔÔÌÍÍá­:uêT]]ÝúÁçää899M›6mÛ¶móæÍûã?ìííçÎ _®_¿žššJ£ÑØlöرcë·‹¼uëÖÓ§OÉdruuõСCGŒáåå%âZ‰¸"‚÷õõåp8©©©ãÆüùçŸÂg°íÛ·³Ùlá*999Xê#š±±qß¾}…WæóçÏW®\©¿¥¥eyyù³gÏäûöí+,,$\µjU‹'jwÁÁÁT*uûöíê®Âf³i4ʤ=¡¼¡;k÷–$¶mÛ¶;wvm ÝçjüKý²y¿A¤³uyÒ€ Cy‚ ¿??¿”””M›6ÅÇÇwu,]] Db¿h»HA~5¾¾¾¾¾¾]E§Ú¹sg]]]ãåVVV¿àÕ@Ú ÊAz¦mÛ¶uuH„ê)AÊAÊAÊAÊAÊAꇉ Ò±BCC‹ŠŠ /\¸€Âè óæÍ»zõjWGñK@y‚ ÿp©‰'bÆçó)Š··7FkË1}||à|WmõêÕq&yjÜ$œ)ÊÑÑQ__¿óÃhw’]yÑ{-Z´¨mA!âByÒ©Ÿ9;;a&//_RR"##£¯¯¿lÙ2ÿwïÞ=:;;[QQ‘ËåŽ=ú÷ßoñ˜\.÷àÁƒeee‹ecc'q.{ÒÒÒ AiiéŠ+F W‰¾òááá¹¹¹8Ž×ÖÖ:::·¸×¡C‡Š‹‹›«iîK!"Z›òÇ1 c³Ù»ví*...++ÓÕÕ9räĉååå9@ ‘~Ý" {÷îݿ޼y$éÎ;m©Y¼sçΆ z÷îíààÀår“’’ÊËËûöíÛŽ1·]iiiUUUuuu“yƒ‹‹K燄ô<çÎÞQà½dÞ¼y—/_¦P(ÂÍ¢££+++÷íÛߞNjØ+&&¦¤¤D¸WMM0k±WûÒÕÕÕÒÒÚµk—´´ô‚ ÂÃÃ¥¤¤<<<>>>S¦LQPP8zô(Ü8<<<::ºþ¹IGŽY°`††|{ôèÑ´´4SSSç±ÀËËkþüùË—/ïׯ‡ÃY·nð®,âÊ`FÀq|íÚµÂoYÄ^k×®ÍÔ¿ˆøRDDˆˆ&ùMÏç‰Ä{÷îÍœ9“ËåÖ_E lllÖ­[7iÒ$ÇáŒÝmõßgæÌ™t:ýþýû+W®ÔÔÔÔÓÓóõõ­ªªRPP°³³ûðá`ÿþýçÏŸÏÌÌ9rä¡C‡”••“““:ôîÝ;ssóuëÖÁ?K&“¹}ûöQ£FEDDÀžºº: *• ááá/^,..ÖÓÓsss›:u*ÀÒÒ²°°pÒ¤Iiii,køðá~~~°ŠTÄ*@sax<Þ‘#GnÞ¼YZZ*++«¦¦¦¯¯˜>}:¬ƒ°°°`æææÿªcbbÖ­[Ççó=ÒÔÔ^( ‚G~AEEEžžžðÊ”)“'O®¿VSS³qåwbb¢ðžpqqñððhñ^.b¯û÷ï8p@¸JVV6,,¬-ç’Œªªª´´4@]]]JJ @ üÝ9®ÿþ‹/n¹lÙ²õë×·˜7ÄÄÄÀbˆÇãQ©T˜ˆ8—ˆ½`$ýúõP(”&Ÿ"ãñx'OžÌËË#“É¡¤¤Dœ½Dý¥H!Ú’7`öüùs{{ûI@ DEEEEE >ÜÃÃã?þ€%m õ_¯¦¦Ã0"‘X²dI|||||üúõëi4š½½ýÓ§O333Ùlöš5k þüóÏšššû÷ï§§§ÇÄÄHKK¿zõªººÚÝÝ]X+$%%uæÌEEEÀöíÛ/]º4~üø)S¦¤¥¥­Zµ*00pΜ9æææ.\HNNž>}º²²r\\œ³³srr2‘H±*..®¹0žžž·nÝ277Ÿ6mZ^^^RRü58;;?|ø0..î?þ••Å0ÌÜÜ®>|øŠ+rrrâââ\ ‚ éV455ETó×/fè8 Á’îöˆãxƒ%cnLMMM‚&’í%®]»¦M›¶råJøvýúõíxp¤½H>~@X¾|9›Í±Í›7oBBB¾ÿÎd2%>QpìØ±-[¶mii)|Ë`0š¼§ŠØËÄÄäܹsÂUUUU—/_ç\¦¤¤äÌ™3·'Ož´²²jq¯Q£F]¼x±µç’l/Ðü•///W¼ÿ¾¨¨Hœ½Dè&_J#ay,?Ý*ÞÜÜ|ÇŽ'Näñx¿r+ÀÕ«WÉd²……EpppƒU{÷î­_bÿåË',ù„ °®§ºººññ³³³qwpp€o‰DâÌ™3SRR*++áaX©+ D¬üÒë{ …I¦-Á#¿Ø,Ž@ xzzÊÈÈWùúúr8œÔÔTXÃýçŸ2®²³³»~ýúºuëh4›Í;vlýŠƒ9s渹¹)((P(yyù?þøCMMMô^‹-:uêÔÊ•+h4ZŸ>}œœœZ<×öíÛÙl¶0B9991;C ûa šE‹éëëçää<þ|ÇŽÛ¶m+**ŠŒŒ´··¾:t(‘H\»v­ŒŒ ›Í7nœ°£ˆ0Ö­[æîî.--M§ÓÕÔÔÌÍÍ,ú\ÍíðóóKMM½víÚœ9s²²²ž>>>>>M®òóó±ãìÙ³›ë×0eÊ”)S¦´v/gggggçVí%qQسÔÔTøú¿ÿýoƒ€E‹59˜ˆ00 [±bEkÏÕÜ^______øzРAIIIõ×6wå… !kn/Ñ—·¹/Et„]¢Á36ìTB¡P:§N|æ <ÉdЏ7üùçŸ4mÔ¨QwîÜi.3¨®®ÖÐÐØ¼y³èÊŽ&¹»»÷ë×F£1ŒÖîÛi¢££ccc'NœÐÐÐpqq¶':~üøëׯ§N’““£R©ŽŽŽ kÖ¬Ù°aƒµµµ¹¹9‰DÊÍÍÍÌÌ\±b…‹‹‹¼¼¼¯¯¯§§ç”)SÆO£Ñ^¾|ùæÍ›yóæ 8ÐÖÖ6$$äåË— HOOÏÌÌܼy3™L~øð!àôéÓ .TWWÜ»woùòå"V‰ÃÀÀÀÔÔÔÇÇçáÇZZZ</'''33311QAAЫW/€———¾¾~qqñóçÏíìì¶mÛvåÊ•ÂÂÂ/_¾À "''7xðà3fH|盂 ‡ÅbÑh´#GŽ|ùò¥²²’Çã3fܸq†††8Ž3™Ìîó„Œ\]]”H·ˆÅbaF§Ó›KÂÃÃMMM7lØ0qâÄ}y<ž0WÿÁôÿƒÆ0iiéüü|:.%%U¿ÄRÈÚÚÚÉÉIØ™¸EEÅNzhòäÉùùùðµ’’Ò£G„_|ý¡d2ùܹs&&&€{÷î?~<;;›@ hhh­X±B[[n™ššzâĉŒŒ ‡£©©9uêÔÕ«WKIIÁj…ëׯ—––0`É’%°Ó6Œð 6XYYÍš5‹Édjkk'$$ˆX%: ƒ±wïÞû÷ïWVVR(yóæÍŸ?_øqÂÂÂ"""ªªª´µµ-,,–.]ª¦¦Vÿj@FFF°Í„ÁwÌ7Öttt„ã H'óóóKHH033›:ujsE)H{ ¦R©m| b2™d2yÆŒ›8ÐÝÝ}É’%222µµµ°qzW½#%Ì a%4D"‘x< ::ÚÂÂ"==}âĉEEE ò‹E¡P೸ÌÌ̤¤¤dee³²²zõêÕmóä„òùE´WÞÀápˆD¢¥¥åãÇ›ÛFAAÁÙÙÙÍÍ Vìv˜7´©¹¢††Fƒ¼áòå˳gφcþÄÅÅÁθ¶¶¶åå媪ªÂÍàóŸ>}’lèÀ?~P©TÔ>Aù·#“ÉÿýïE$ €ªªª}ûö©ªªnÞ¼¹ÓkN›ò†¾yóFø6?yøðáÏŸ?ÓÓÓÏœ9óíÛ7‰dnnÞä666 hÕ@å$IJJ Ö‘#‚ È¿†a?~±‘Hܸq£———œœ—Ë%“É[“$ÏpŸ6mÚ­[·à[2™PRRbggW[[+ÜlÖ¬Yƒ j®CJJJ«zÓΞ=Öˆ#‚ Hχçi†a‘‘‘3fÌøô铜œ\sIƒ@ À0LâQÈZ5\‚äy“Étqq}úÇóm-%%¥#FxyyUTTt`Þ§ÁÌÌÌ?~<,ZINNŽŠŠòõõe³ÙÂ9N”””|||þøãUUUØ3AAx<^ƒ‰‡&&&)))555222|>_SS󯵵µptàîÝ»×äx-ÊÉÉ1bDk»Ž·.o¨ªª’•• ðõõfeee'NŒ‰‰ ¨©©9r䈥¥eTTìø€ãø/>9‚ ‚4‡Åb 8°þ"‘xáÂ…ººº¤¤$"‘xìØ18”£££££cã#¨ªªÎŸ?ŸÇãµjE‰ôâÅ nŽ´´TJJjÔ¨Qp€äúX,–ÝãÇCBB¾~ýzþüy6›-%%%åAAÆÈd²©©©‚‚BUU\ââ⢧§çîî~èСú[úúú57ÛÑØ±cÓÓÓÅ?o^^žd‹›7à8Þ«W¯ 4N ÚÚZ{{û´´´sçÎIIIuíX˜‚ ò¯E&%%}ùòåÑ£G`ïÞ½ïß¿ ­¿‘HÔÒÒjíLâAܼ¡¤¤¤ªªªþ”kÌš5+%%%--môèÑí‚ ‚ôdÏž=8pàðáÇnccC"‘***ìì쌉leeÕM*ý bn§®®Ôb¦óôéÓM›6=µ…DAÑÒÓÓÍÌÌ>!!aÚ´i¢7?~|EE…8‡mÌÚÚZSS“ÏçK0X÷Þ½{%;é/hãÆ]1±uu‚twp\g@0a„'Ož—ïÞ½»¨¨èÂ… ·oß677çóù7oÞ´µµe±X|>¿;$ @̼AOO¯U·¼¼¼ãÇ»»»‹Øð”””úÓb‰Σ}óæM*•Êb±$8²eË$Øë×ótÅAÚž ""bÙ²e{N^ºtIQQñÈ‘#×®]+**²µµåóù4­KBm’¸,>|تãž?ÞÝÝÇñ&g¦ aéÒ¥­:¦ŸÏ'4­¦¦FVVV²ƒ ‚ H竬¬,**j2i€BCC‡ ¶|ùr>ŸßMê&êk¹]$—ËÅq\ôÔà½zõª¨¨èÙ³gM®mã4 \.—ÇãeffîÙ³§-ÇAA·Žö÷÷=FÓêÕ«á ´»% @œò†7oÞÀ'ûVÇñ¨¨(WW×&×>|øNŸýùóçׯ_¿}û6iŒH$úøøÔ_òéÓ'555]]Ý;v,\¸.d2™t:½U"‚ H'ËËËÃqüæÍ›¢7ãóù†©ªªvNlbj¹¼aèС¯^½’àÐwîÜ!õSªºº:øÂÂÂbÏž=¾¾¾ýû÷···÷ööž4i¡%ÿëçÏŸŸ>}x{{ÛÛÛWVV†……Ñh4&“)A‚ Òixýúuq„...^¸p¡ªª*—ËçÈT*•ÞM¶"GËå T*U²¼!>>þ¯¿þÒÑÑquu•‘‘Y¹rå!C.^¼øýû÷˜˜˜„„„·oßÂ-1 333ûý÷ßÅ9ìðáÃá OOÏÈÈHeeåêêêM›6¡ÿ‚ H÷÷àÁ1·LHH¸v횃ƒƒ8·¶9 ¼¼@¥RW¯^ Š“LˆÕ.ò¯¿þjm4·|ùò§OŸÎŸ?ßÞÞ¾¤¤äîÝ»ZZZÑÑÑÇÀÀàìÙ³pcvþüyCCÃääd++«ääd]]ÝÚÚZ&“9bĈ´´´#F¤¤¤ôéÓ'**ÊÅÅÅØØøöíÛ …Íf¯ZµŠÍf×ÕÕQ©T"‘(A¨‚ ÒÑØl6†a©©©âïâîî>kÖ,Øo³¹mµk×$ˆÃ0“ÀÀ@XÑ/Ú!o¡¹9)Z”žž~ôèQ77·½{÷ÊÉÉÆ?aÂá8Ž———“H$.—K¡PH$ÒСC•””œaü ººº‰ôîݻϟ?92!!ÁÊÊ @¡P>}úTPP`ii‰’A¤Ûª¨¨ÈÍÍVÙ‹£¸¸8%%ÅÀÀ@MM­¹mæÎ+qH\.—N§³X,&ætš-´oàóù8ŽÿüùSâ˜|||¾~ý:wî\—Ÿ?¾}ûvýúõ/_¾,..ŽŽŽ.+++((øüù³±±qVV–¶¶¶ššÚãÇïÝ»wáÂ///áÝ »víºpáBIIÉäÉ“A]]†a 222¨]$‚ Òihh|ø --­¥¥—¼yó¦ÿþT*•B¡;vlóæÍ0-øñãǶmÛš:áÇ æ‹øøñ#“ÉTRRJKKãñxgΜ™0a‚®®®èÔ¡å¼NkÔFkÖ¬y÷î]AAAãµ8Ž¿xñÂØØ˜Çãñx¼I“& §ƒyìYÿEÝpd Aª«««©©>Ù·ÊÞ½{ÃÃÃ/_¾|õêU{{ûÅ‹¿}ûöÅ‹?~üðòòZ²d‰††ÜŽQ-æawïÞ xõêÕ˜1cH$’½½½­­í;wdddàÃ|“ZÈ0 ƒ½<ÛRU(((ؼyshh(øg>¸üÙ³gfff† 8pïÞ½«W¯®­­e0ðÔS§Nm0"d‹å'‚ Ò ÕÕÕIÖ9áäääàààçç·dÉsssÇ333?|ø §§óãÇEEE¸qqqqLLŒ––ŸÏ/..611yò䉩©iAAœ™!77×ÈÈ(**J øùùéëëÃ.ÒÒÒ±±±$ Ã0EøÍæ \.W Àž:::p¨¥¶8vìØåË—Ž9"Ì °oß¾ˆˆ8–Ãõë×ïß¿Ÿ’’‚ã8œ2›Åb57É‚ ‚ü[¨ªªfddH¶/Žã+V¬ÈÈÈ8~üxxx¸´´´¢¢bHHHým***`•}mmí˜1cŠŠŠlbb¢¬¬¬¯¯O$GŒ·ÔÔÔ”——¿sçÎx<^¯^½x<“É$‰C‡UUUe0­ÎÈdr^^l½8uêÔ¶ç €ªªªÓ§O'%%ijjR©ÔÜÜÜÏŸ? áiii£Fzöì“É”’’‚“Wµý¼‚ Òå4/h•>oÛ¶ÍÂÂB ðx¼;vØØØ¨««Óh´OŸ>©¨¨¼yófðàÁ¹¹¹ƒîÕ«—´´4F»téRïÞ½?~ü¨££3uêT€’’Ò©S§æÎ;aÂØ3QJJŠD"½xñ"66ÖÄÄÃ0ë¢ê)"## `ooïëë{üøqaÈ6ÊÍÍÍÍÍmn-†aåååúúúír.Aé&ÚØ^0 `þüùŠŠŠ***d2yóæÍ ƒÃáÉä~ýúÉÈȘ™™‘H$eee>Ÿß»wo …r÷î]áDN§NUUUt:ÝÝÝJ¥ÆÆÆš››KIIÁöÆÆÆÆÆÆpcQÃL5·‚Á`Ì;wáÂ…™™™ªªª¹¹¹^^^–¡ÿþ/^ÌÊÊêß¿?Çë¸!‚ Hçãp8mÙÅb­\¹RYY™ÉdÂDFFFII‰B¡(**’Éd%%%999yyyeee …B¥R¿ÿ.Ü][[-À–‚<ÏÂÂgP¿à_ …ýÍæ ÒÒÒššš†††fff7nÜèׯ߮]»ŠŠŠrrrÚ={PVVÞ·o߇æÏŸÏåri4šˆLAAþÚÞ?111ñÂ… t:Ú "‘Èápà‹{÷î¹»» ÷íß¿? ÇK¤P(ÂÍšë·øÿ4·ö¡˜3gN]]ÝìÙ³i4šÍ¾}û´´´ŠŠŠ`Ï1aæêêºtéÒÆý:¨Tjpppqqñºuë=zD PJA¤Gj—œ‡‡Ç·oß`ØoÃ0ذÃ0‘‘O"‘¾|ùK8TUU:¤­­M¥R±ÉdÉ•SÔÖÖΙ36Ž`³Ù±±±6lèÝ»w\\ܪU«fÍš%æ9( lÊ`0Þ¾}{èС™3gŽ1âØ±cUUU›7o~÷î`Ú´i’}A鶘Lfmm­@ 022jûѾÿ®©©iff%, ‘H/_¾\¶l™¢¢¢¹¹ùo¿ýöäÉ“+V¤§§WWW—••¹¹¹±Ùìúå U ---##3f̘'OžÔxöìÙ_¾|Ù½{÷íÛ·ëWŠ4‡Ífÿüù3++ëãÇFFFnnnnnnpUzzzeeåôéÓ¹\®Ä¹‚ ‚tO|>‡€a˜µµuÛÇCà8þüùóùóç;–a$''WWW 7`2™ãÆ;{ö¬£££°QE{Íâ$ª¼AXUÑ`9ƒÁðõõÕÑÑ™7ož˜§)((PWW_ºt©¡¡¡¬¬ìüáíí­¢¢bjjš˜˜XZZÚ¸Aƒ@ ¨©©iû(ׂ ÒUàOóçϧÑhªªª³gÏn¯#×ÖÖÆÇÇGEEEEEÕO 2™ »}¶ûx‰-VU4>ëéÓ§+**6mÚ$æiN:¥¥¥«6 ÆåË—à${÷îíÝ»7@€cSXZZ.[¶,00ðæÍ›………d2Îh… à8çzéê@AšE§Óétº’’Òš5kh4ZDDÄ7Œ;nøcðçŸfgg»»»¿{÷®Ýû´p8aUEjjjýåL&óСC;vì˜2eJ|||‹§‰ˆˆðóóóöö¾qãFsÛ|ÿþýû÷ï?~¬?Íèþó??¿ô0Gމˆˆhq³¼¼¼Ó§O¿zõ 5§E )) XÔÕ´3.—;gΜ9sæ_¸pÁÁÁÁÁÁ¡ººz÷îÝíûðceeµ{÷n##£ÂÂBÀ!CÚñàPËóSÀªŠyàèÑ£[·nݼy³8yƒÁ8~ü¸§§ç¸qãJ„àààM›6‰Äöª˜Aþ*++…s›‰öíÛ·¡C‡ž9sfܸqU{9yòäž(F:Ä&W_—®Ž¢ óæÍ«­­½MIIIyy¹››ÛÆ;'ªÎÁãñlmm¥¥¥###åååMLL&Mš´iÓ&''§éÓ§‹ùs‘‘qttÌÉɉoÐNB[[;88xîܹUUU oß¾ðQh1oÿTU¬_¿¾ANTYYyòäIww÷!C†À¢>|xÆ 6lhUÞÀf³¿}û¦®®.þ.H±páBÑÝv`MaEEÅÌ™3½¼¼Ö­[÷¯˜ù¬²²RÏ\e¼s¿®éiRNåÃúßnèùóç?þgË€€€ŠŠŠ;v´Kãÿî>÷Θ1ãêÕ«|>ÿÙ³gÏž= öññùÏþséÒ%3331µk×®µk×***=zdjjjkkûÇ.—«  ÐFœ¼VUŒ;6%%¥Áª}ûö¹¹¹¹»»»ºº¶x8C—••UkC„Óc"¿ yyyMMÍæÖÂ\Ã0''§sçÎùûû§¦¦†……©ªªvbŒ’R"«ê4;M-‚HFJ©»÷J 6)))éÊ•+8އ……¥¥¥>}Z[[»£ë@°ªâêÕ«Â%|>ßÏÏD"ùøøüöÛo·oßç8eeeOOOssó9sæ{'à8~ûöí™3gv³SË'h®W    >>~Á‚rrrâœ,++KVVVEE¥U!ÖÔÔ´j{äW³bÅŠýû÷+**>|øpìØ±­*ÐB¤35OKK `ll¬¢¢ò×_Mœ8ñîÝ»]rûàñx666pžçúvïÞÍ`0¼½½Å}ú—/_º:¨¶‚U—>|˜ÉdŠ9®ƒÁ 7nܨQ£šÛæû÷ïYYY —.]òóóûóÏ?ÍÌÌ Äd2ëêê$ÿÿ+oQUÁãñNžŸßdUEyyyDDÄôéÓ‡.Îq<Èår===[uöÂÂÂÇ‹h\">qËÿETU„‡‡óùü‹ÔÕÕ555étz^^^VVÖܹs‹ŠŠ6lØ0pàÀÄÄDeee8Fã8 ª§@ćê,¤ÇÐ××?{ölϨ³ Ñh4ÍÎήñª}ûö 1{Ÿ_¾|ÙÞÞ~À€­ ;;»UÛ7GÜû±ŒŒLïÞ½ÇßxUaaattôܹsEÁÔÔ`ff&//jll}Nœ8±fÍš/_¾xzz–””àäž ©òTØ€HÕY HÑcê,ø|¾µµµ¬¬lãUaaaT*>í´èãÇ€ÖvRm¯A ZqK®­­={v“wñ{÷îåç绺ºÂ{“LLLJJJrrrîܹóúõkGGǘ˜˜ñãÇoß¾]ôy·x@1¡: é1z@¬ªhÜ«——'ú6*ôóçOÇ•””¯RUU6lX“{uAÞ ¢ªB œ?^__àÀMî‹a˜‰‰ ‰Dºÿ¾¥¥%‹ÅzôèѬY³RSSaÞTÿP CDå =ÅÙ³gÙlv'ŸÕY HÑê,¸\îܹs/aaaººº“&Mjñ FFF†½yóF¸D]]ýÂ… eeeÏŸ?¯©©Ù³gOƒ½º oà8ÞäÀßâæ¦6l˜¢¢¢‚‚‚@ “É8Ž +ZÞ½{Çd2…icãÖ ¨¼¡Ç8{ö¬¾¾þÞ½{OùÚ¡P‚ôÿö: Ul6[œq `{Á´´4‰äè蘙™YPP°páB2™|ùòe:.--ݸÅa×ä °WE“7r>Ÿš¿ÇÏœ9@"‘ðx¼‹/R(XÒÐ8o@å =†a?~üصk—¡¡app°˜ƒÕ·Tg =Æ¿·Î‚F£Q©Ô&{U”——ߺuËÞÞ¾wïÞ¢bbbÂápvíÚUYYyöìY]]ÝëׯOŸ>ÝÔÔTÄðÍ]“7ÈÈȨ©©5YU!"o€sççç7wØ+VÂ×ó55µÆ%‘#XogaaQUU4|øð€€€?~tZSgQQQáè蘛›ÛîGFº¡°ßÓ6ªÆvu]¯¬¬,))©3ÏØ ë,222ÂÃÃ[ìØ\Uàøñãd2yéÒ¥¢`bbòúõk++«¬¬¬•+Wª««Ÿ={vÓ¦M?~´±±a±X ©NíÕ9±Õòeee‘‘‘¡¡¡°Dƒ€šØqݺuƒ ª?§§””Tý/˜Ïç{yyíÛ·`oo¿dÉ—U«VyyyUVVÚÛÛ£¼¡g€yC```rr²••Uuuõž={ ýýý¿ÿÞ91tB›Í¾{÷®™™™‡‡ì.Ô¡M’6ªÆÂžZ÷#_Õ”wv#’¶ø”Tj÷l«fœ§ÖýÃ6O÷ONÝÕ>½ÌÛKá_?ÿ3(ù“ÛäÚA–ªÆó5:9¤nèû÷ïöööÖÖÖ™=t·:‹?~8;;ëêêž8qBDùŸÏŸ>}z“ÉÉÉ?~tqqQÐ.//?hÐ ```0aÂ6›ýøñãØØX33³ªª*&“I£Ñ@GvNlõQÔÔÔÈdòÊ•+ÓÒÒÞ½{·qãFX¢Òdy†a7nܳgÏ›7o„³X,‡Óx¡C‡&$$„……EDDœ>>55uÚ´i555!!!†††~~~I‡ÖYÀ¶Ÿ<ïìÙ³#GŽÜ±cG‡ÖÈLߪ;Ô¶`ô¢¾& 4rS+/º¾î¸Óµ¯¿n|;1'íG!Ód¾Æ{õïù̯oªËsÛ§—y{ùY̪ûÎeV7ý¬f±¦ÿüÃb ó÷+xö왽½½Mrrr§´ûÔYÀŸ¸/_¾,_¾\WW÷رcM¶QUçÕÖÖž6mZsg5j@ˆˆˆ˜5kV~~þéÓ§•••½¼¼úöíË`0Dü”µ×T’y¤¥¥8Ž«««ïÙ³'(((66öÛ·o"‘H&“ôôôôõõÍÌÌú÷ïÿìÙ³ú“‹cVUU5dÈgÏžÁ%***t:ÝÜÜŽi >|8‡ÃçBzÇ Ñ1vìØ{÷î={ölÇŽ±±±8yòäÒ¥KÝÜÜ:!XgqâÄ áÜ{öìÑÔÔl®m¯øàoVß¾}G}ãÆýû÷Ÿ9sfýúõ...m?xcF¿÷!Ó‰o£K'¯¨Ô—Þ{ìÍ-ïê¾s¥”Èû,R¾½«, ‘z*¿ðõOm…E§ŒdT(¸O:úåÉéüªbVïÁ²S7êÀäÀçâ !9éW¿V³hò$¹^4¡² Ž>>(ß“Sô¦š&Cl¥:}«®bßÿ®-õT~Ê©üÊ/u>® AÓ·Rý}ïP«8uü›[Þk›*º^3!Ó‰v-?pÔ#2h.Â@ã¤Êü:ƒijyO¾sYü¾#vô*'z•èàE|ä=ã—f1#0 LÙ¨3u³.àõíâ‹+^ x8Àë•…R½K!Að=ƒ¼¼<‹Åzúôéo¿ý6vìØ­[·N˜0¡Î ë,®]»vøðá.œƒþÄikk³X¬‚‚‚U«VlÙ²ÅÙÙ–ÁªŠ‹/6>ÈÉ“'CBB~ûí·ØØ¦ë¿`aÿÞ½{i4ìa0uêÔÌÌLÀÇÇŽ #iœ@´W'Éç‹Â0LAAáÇ ˜6mœBâæÍ›jjjp>Ÿ{‰“.—Ëd2åääÔÔÔRRRüüüòòòàÜ©µµµeee›Ê7`£ …r÷î]¼y ñ‚‚‚¸¸¸üü|xíZµ¯8kâìÛÜ©ï[KÑGnñ¤(ú°pËæÖÂoVOOOüËØ`K᥀ðÿ-=333‹‰‰yõê•··÷½{÷>|êÔ)}}}‰ÿgŠÖY˜˜˜xyy=|øÐÄÄÆF¥R) õ …F£5·¾¦Öë&TUU¯]»–žž¾uëÖlÛ¶íøñãžžžóçÏïÐŪæb 0ÀÄý߯–¾)½´"ƒD#ŽšÝ''¥²0ã§¾•êÍ-)гPjÛ+÷É÷3‹_Í=0Ìt¡&àÚºÌW¿ž¬:|F¯²OµË©ÒD@fTé¹¥¯ú “»D‹UÍ{Sš÷ôûÆäñTàkfõ-Ï÷ýÍõ§¨2òÞÆ–Vü=oos«òÓ«˜?¹Ó¶è¤@•&º\3‘V¢š‹p°•jjx~Öƒòa3z˨P2£KÃÿxéýÊ‚@ÂD¬|s`±ºÿûûe™Q¥ckÑäH¼oß¾'OžÌœ9sܸq[·nm²U\û‚uÆ óññu¡¡¡Í=Ó7þujü;Öâ/|uu5…Bùòå‹pã¯_¿´´´>|xëÖ­;w¾~ýÚÍÍ-00póæÍ®®®Âa‘…U;—ÕÖÖr¹ÜyF}'N¬®®†¿ÌðÑšËý»-==ÝÊÊ ¾î¸N’ç ?~üPTT¤ÓéT*¾f0²²²\.÷áÇêêêÀÈÈnœ””4qâD‰ôâÅ‹+W®<þ<==ÝÛÛ>~ñù|"‘Èãñ^½z%<~@@@ZZZdd¤´´ôܹs322Bzzzhh(L¬Zôþý{‰?Ò@ÛÛ K’ð¦Z« O¡   //߯Ӊ¯  þÎ’H$ Ã8›Íf³Ù555m9,ü³711ILLŒ‹‹[¾|y~~þš5k:4tèPÐô@'m’¸?WÀ¼ºY àã§¼ˆÝ•m<_£ê+ëÅÕ¯S6èLÛª 7¾²æ #Ü Ê¦+õ,T2ª”A–*‘Åi—Š&¸j8u|À‰FÔ3R0š¥NWø{:ºæV1k¸Íÿ`^c˜œèu'*§†ç»\5Ñ™  Щpiåëªo,%-ºˆU"‚ÿ^Àlî#LhÒåÉ™Q¥–kÔ/Q(õ¥O÷Ô{SÚ o,ø6}÷õìÛ·¶kw¢ áßµ¬¬¬———››Û¡C‡öíÛ—ššjgg7~üøÎ™1ÖYøûû?zôÈÉɉ@ ‰Ä÷ûö=ã,Áqœ@ üþûï·oßvww/((ðððعsgppð²eËÀ?¿3gμpáBãcÂ{b“§“‘‘<4™X\ºtiãÆ<N§wÜ æ ƒÍfýúµoß¾YYYzzzÉÉÉ&&&,KQQñÓ§Oòòò*** ªªJIIÉÐÐðСCYYY3fÌ Û°aÇ0o€F^^þÆõÏ’0lذyóæY[[KKKã8¾téÒ%K–Àö’Ø?ÖÈÝ»wõõõµµµa†Õxûг ξͺñ¾õ·}äOÚø€¢ ·lñãˆl)¼666OŸ>m7ÄÆÆnß¾=-- лwïuëÖ999=|øP²ÿœâ«­­ LHH,Y²$00¶§áp86Äaÿ£ÁëkÙl¶pIaaჄUOž<9vìXaa!€H$:TNN®M)I3žŸ/$RúVªó5-nAèðú÷¼’ ÆóþnÍG b#ú\yø†QÎ)Íf íÕ…Ï?òwå}E^-Ÿ‹?<”WÿÈ•_þž–·ÿhEóUýŸ-øüü€HƬ½õ5’±ŠL#šlo("B¸DIûïiýHT@ÀÿÿÿTM®¼ˆ,™¶ßvd2¶Oo.Mo°¼¹-nÐ$ìŸd‚L&ËÊÊ ÿ ªªªDìÕ¾Èd²°2Ïçöw ‚lüëÔø§¬ÅŸÄšš Ã…³X¬¢¢"ajòñãÇ+W®ètú¢E‹lmm…ap8œ¹sç6—74ÙÉ0kÖ,Eoß¾upp8þ|“yCã©8%#aÞ %%Åf³•””8ΠAƒÒÓÓ'L˜påÊKKKá6pìÈ/_¾xyyq¹ÜU«V¹»»ÃUÆÆÆRRR¢‡Ã!7oÞlp¢ÏŸ?Á·°õûÞ½{[Œ077×ÉÉiúôé’}@¤#`ÿû\rÿþýíÛ·?}ú ¦¦æáá±dÉíëÓ§O^^^………ÒÒÒ‡ž5k–0HXÝÐäÀ,âHHHxðà…B‰ŠŠÚ½{÷ãÇ4máÂ…kÖ¬ÑÖÖ úÚ#G4¨bÿÿ[Ô¬ÔxWÖ[_€ãàýý2š,IZ‰,׋ (xUÕ{pß%-)sK‘jâ©¥4›¡¦+½3gJÅçºÊüºgç cü³LjJ)’›[¥m¬@¦÷ç.:eD$ÿáÍ-ï¤)#Ô›‹P²‹#"x¹>\ îmOÄå•$ôVZ¿~ýÖ­[;âÈ¢‹>Lœ8Àd2Ož< ½nÞ¼ÙÚÚºÿþUùùù^^^¹¹¹T*588xþüùM>µ‹àà`*•Zª„'OžŒ7Çñ¬¬¬;v\½z•ÏçÓh4OOOuuõú»ã8nnn~ïÞ½3gÎDFFÂΓPså ŠŠŠ!!!ÅÅÅÂC1™L‰T¿EyTT”®®nyyùÀçÌ™óH*•jeeåààÐ.\¼@ P(”¿þúkôèÑ“§OŸ.X°àðáÃÂÿ:gÏž=þüСC·nݪ­­]YY ³00þüŠŠŠú±ÙìçÏŸ·ØÏÆÆF²€‘îþÅ ‚ÄÄD___ØRUUÕÝÝ}éÒ¥ÍMˆÚêQjý IDATnݺµÿ~‡3lذˆˆˆæÆG— lAPTT\¶l™«««ªªj;žE(#²øÍÀÃCyJ}ékúc„¿ïÁäüõšG“'“iÄñËúI)‘{éÉŒ°WÝ•ýåù5]™¼§ß 3~Úþg‘BÐ&7p¬Òõ oßß/SÑ–âsñÒlFaÆOÏçæS6ê\Zùzï„ǃ­T D¬,§¶ð¯Ÿ“ÝZ¬éxS³+ûõíuY[Pò¡†*K‚-›[E¦‚ þëž¹{L²ž…2‰Fü’ö£ð¯Ÿ£õá‡ør@òÑÏc—ö“ïC{S ȼ[b¹v€ˆU"‚ñ‘¥”ÈyuàÚº·C媾2sS¿pP·0xv®°2¿®"¯^|º<©Ï¹³Ô% ¾#þo´/Ld‹xŸ+**RQQ©««nÙ²eúôéMnßâââ‚‚‚˜L¦®®î™3g :ç¼Bð“¾yóF__Çq*•º|ùr/// &zêÂÙ'Ož'' ¬¬ ·§Ál¡²²²)))"N§©©éïïïää'¢ƒ ÒÁ?ªeË–åååTTTÜÜÜœ¥¤¤:-†&ë&Ú÷°?…@ ÐÐÐX½zµ££c‡v º]ñ¹ðôLŒ2eì²~Â6}Ï/Á¢ø§g D Aw‚r3EÀ‚£†½õeÓ/}J®TÕ‘žwx¸É?ƒ,¹0*vWvftÉû{e$*¡—žŒí¶ARJ䑳û¨„óÒ.aL±/m¨u¯¡6·ƒ–× Ëõ¢æ¦Vf?ª É’úV´Ù66x±Êd¦BúƒÃ¹¯nó8¥¾t˵¬Ö눈07µž/×›6dºZft)ü¤–kˆX%:øæ>2\Û×HÞvÛ äã_>?û®2@Úx¾ÆÄ•ýŽäÁ+/> Ÿ‰ÂˆYê’ßQÿ?: ,u€Ã¸1bË–-Ó¦Më´ŒÍf‡„„ܹs0gΜýû÷wI_<øy …BY²d‰··wý‹£P(ð‰DZ¾|ùŠ+ BCC‰D"ÌôôôŒGŒ1jÔ( ‹&ÛˆÈÉÉaÿ´Ã0¬wïÞƒ ²··‡E¹€^½zÙÛÛƒ.oßPŽãÅÅÅ}úôÉÉÉÙ½{·ŠŠŠ§§ç äåå¿ÿ®££S{и,šÏç›™™ ?üâÅ‹íììÔÔÔ””””””ÔÔÔà£ê¹sçÛ3Ò%àU^^ž’’’›››‹‹K'ÿm7W7ѾX,ÖàÁƒ×®];{ölØæ¹CmM3on•gz³«ˆdÌjý@«õM´ÐdI³‚ f5ñ¬6Ü®÷p»¦GÀ5§Ï¨9}Z»  k®¬k®,~„ >o`ÁTqV‰^ÄG†,×h|kqå%¾g022Ú²eËÔ©S;-cÿ[7±gÏžE‹uÚ©À0ŒL&;99ùøøôë×Oü>|hmmýóçOeeåàà`€‘‘Qqq±pÀéòòr6›]¿P6%%öRÙ´i“±±ñ‘#GÆŒ³qãFáeeeðÅ_ýÅãñH$’@ h—jš6å 8Ž—––öîÝ»¦¦ÆÑÑñÇ»wïÖ×ׯ««ó÷÷ ÊÌÌôööÎÉÉi:4váÂ''§ŒŒŒ[·n‘Édggg…ÜÜ\MMMÀåráC!JþÕ`¢Õ«W/_¾¼½Z舯Cë&ê³²²Z°`AAº'EEÅ«W¯NÚÙ™P—×MÔׯ_¿²²2…VíÅårg̘‘ŸŸ¯®®N¡P NWRR‚OÑžžžÂê >Ÿ_YY©¦¦6tèÐ<~üxþüù³gϮ߸Çq Ã222àÛ¬¬,yyùëׯ[[[ ‚§OŸ>œH$ÒétÉÒ; ó@PQQ¡¦¦VYY¹~ýú7oÞìÙ³ÇÚÚº¢¢Çq))©˜˜˜­[·ž>}zÁ‚§Nª©©ÝÊÌÉɉÇã 4È××.áp8Ó‰é4 ,¸råJ§µ|ꄺ‰ú:¨‚tg}úôéÓ§ÙR¥ŽÐMê&êkq>ªÆp'“ɯ^½9rdVVÖ AƒÊËËa‡aƒS¸eTT” ‘HÌÏÏ ”——wqq¡P(ÚÚÚ nÿïß¿§Ñh¼PWWgkk;þ|[[[##£üü|}}} ÃDtø¡Õyƒ@ øñㇲ²rIIÉš5k>|¸mÛ¶³gÏx<ž°Õ‚ ‡ÃYºt©ªªê”)S.]º;RŠ‘D"Õïy"¬øAzŒyóæuþI;§nAÎÔ}ê&ÚˆÇã‘Éd%%%À Aƒ¶¶ö»wïâãã§L™RËI“&9s&::zܸq;vì€â pnÌúwÌ!C†§ŠÂqüòåË—/_.yòäÉÈ‘#%ÈZQÕc ÆÆÆ½zõúøñãÚµkãâ℆…( dz³³Û»wï´iÓ’’’ˆDb“ƒu#H¹uëÖ²eË ‡ –””„’éâââ/^œ›› »ü{“™Læp8uuu°t¶?2dˆªªêÑ£Gᬬ¬uëÖÙÙÙÑh´+W®¬_¿þåË—ÇἚõ“¸Ë­[·DŸ·OŸ>„MÔ[Kܼ¶§øôéÓÌ™3GUWW—‘‘qøða8¤îŒ3šÜ 6Ä;v,üù>rä•J}ýú_3éòïU[[ëããÌáp–,Yßq él6; À××—ÉdΙ3çáÇ]Û ¡]P(ƒúÝ\q1bÄ”)Sìíí}ú´xñâ„„iiéÓ§OïÛ·¯C;["Ò òóó—.]zçÎ*•zèС'Nô¤:ÀôéÓOœ8¡§§wõêÕ7n„††ÂÉ­­­†Q(EEÅk×®y{{‡‡‡S©ÔôôtÑGž`Ò¤I¡¡¡:::!!!‡ºÿ~Ÿ>}poü\-##Ãçó£££###ÝÜÜŒŒŒ`§„.!VÞ --=`À€uëÖµñd ;;ÛÍÍ ŽfÕÆ£!´råJT7ñíÝ}PSWúð‡$¨a›€€‹Q :ò¦m±Ž¢f»´[´¥‡òZ,èŠ DH( ´BqY` •®]ÜŠ³A‘Îìþ¬Ðb---Ö\…©Š#y©áõ÷ÇÞÉðæE øýüν9÷áÎ@žœóÜs¦“i?7ñòË/gffZYYÅÅÅmß¾ýâÅ‹‰¤··×ÄÄd´G¡PØÜÜ|âĉ®®®õë×ëêê*•ÊIÛ\§ºH¥RéèèH¿¯^ùØãñxgÏž-))ÉÌÌP×0]ýòË/ÕÕÕcŸ388øÃ?๠€iãÎ;¾¾¾7oÞœÆÏM„‡‡%%% …BŽû5.\¸ðÇÌÏÏ—J¥ÎÎÎ¥¥¥öööC}šœòvžø  ®_¿îåååééÉ>>>>>šŽb¢Ì›7¯õÿºNÉ®j:˜†æ­ÒÒÄÁÆÆ¦³³“Ë™¡¡¡Órn‚ÕÚÚjjjª««ûØCøžžž½½½ÞÞÞëÖ­Sol\LvÞÓ;+Ñ™3g4‚¶XµjUyyyGGÇŠ+»“ï¿ÿÞÅÅE(NþsÈ&Coo¯žžžŸŸßÂ… ŸðQ—‚‚CCÃM›6 Y|z¢a¥g€ÉÀ¬ÿ˜˜˜ØÜÜü$UYýýýDôÞ{ïuvvNþŽ È& 3§`iiù$0«TVV¾ûî»åååꉌ3ä SÌÇçÎûðáÃ?þñ“|iÔ7L1|>ßÂÂB#—Æxp…¼¸BÞ\!o®7WÈ@ÍóòòœE"‘ÝúõëÃÂÂ4R}}½MOOÏðC &&fòC˜¢ð&¨YrrrVVÖ{ï½gooùòå¿þõ¯ì>ìšÒÒÒÒÒÒòÛo¿ _ -33sºnÔ 00ÞêÔÞÞ~èСäää„„„7ÞxC*•ÆÇÇ;::Q[[[XXØüùómlld2óíßÎÎN lذA$-]ºT¡P0ýŒÖ>00‘‘aooojjêââräÈöÒmmm¡¡¡b±X$999ÙØØüúë¯DäìììááADb±X °É455YXXDFFº»»···«öÃ=N€§ Æ@®]»¦T*_{í5¶%44”yáçç×ÔÔôÁtvv¦¦¦vvv¦¥¥EEEíØ±ÃÀÀàðáÃåååááá‰ä™gž­=))©¤¤$ @(Þ¸qC&“ñx¼   "òöönnnNHH066þâ‹/NŸ>ÝÞÞ.òóó+**ärynnîÌ™3ÍÌ̘xÌÌÌ kkk“““U…qÅ©®ûVYY¹gωDwöìY©TúꫯJ¥R"Ú²eË‚ ˆè«¯¾rss#¢ëׯÿóŸÿû\.?}ú´›››ŽŽNÿŒ3bccù|þcGxïÞ=¹\Îãñôôôúûû>üðC"JII9qâDtt´§§'sæÛo¿ÝÜÜüå—_êêêNf„D$“ɺ»»«ªª^|ñE"zçwlmmÇŽP.—wuu?~õêÕ ª½MD„cˆ‹‹“ËåÔ9€!oub¾ëéé i¿víÚ×_ýŸÿügùòåD¤¯¯/•JSRR-ZDDŸ|òÉœ9sLMM?ÞÕÕ5kÖ¬ÑÚ ïß¿¯úﵤ¤$((èêÕ«ß~û-ÛÿÆÓÓÓ™ÅÔ^xáf8aýúõ³gÏfßÈãñÖ­[7äc`¼qªë¾½ôÒK...qqqD´zõj&i " ‹””"úË_þ¾x䡸¸¸¶¶6¦‘ˆêëëSSS÷íÛ÷ئ§§ÇÆÆ>ûì³DÔÕÕδÇÄÄ´¶¶Þ¸qƒùñûï¿·²²Z¸p!³AßdFHDñññLHl·Œ0..®££ãàÁƒJ¥RuNm""Cww÷õ  ^È@¬¬¬x<Þÿû_ö»C©Tû!=sæLæ;+ó£êæñª{Ëotwwˆˆ`Û é÷ÿ¹sæÌaŒŒïÿûãÅ9¡Ø’á-cÂÚÚš™µylJ¥’Í“ <¨zÔØØøÁƒ³fÍÊÉÉ‘ËåìÑÉŒpl£EHDÇ_»vmKKKyyù믿>ZOaooofffKK 1Û lܸ‘9”˜˜xþüy¶D÷¥—^zõÕWÙ7–••UVVêèèôõõéèè 8pàI"ánpp0???77·±±Q$™››[YY>|xr®>¢úúzºººáåJ 44T5k„‰€¼ÔÉÔÔ4$$$<<¼®®ÎÁÁááÇ …BOO¯  ÀÎÎÎÏÏ/""¢³³óÀ›7oÖÕÕ½|ù2UUUI$’††"úùçŸW­Z5Z»ONNŽ••ÕòåË …¹¹ù±cÇ^xá++«­[·‚¦¦¦¼¼¼èèèÍ›7ÓïùD^^žP(}ÚÛÛ›=!""¢¥¥¥°°Pí3(s†!oм>øàüùór¹œyóüùóR©4,,lÞ¼yDTWW÷ÙgŸ1us†††ÌcŒÑÉår¦‘ÇãÅÄÄ©^îÌ™3úúúIIIÜ#‹Å2™LGG‡Ïçóxº}û6û<¤Ú#ܱcÇ‘#G"## D"ÑêÕ«/^Ì}óÍ7ßÿý9sæÌ˜1cöìÙ[¶la†FüüüòòòÂÂÂæÌ™ÃçóÍÍÍýýýU»­««kmmíííU{Þ€2g‘OÚ„Ù¤‘H$þþþl¹2°|||¬­­‡,W U¡–J¥ÿûßCCC‡”9»¹¹ýöÛolù°D"ÉÎÎþÛßþ¶{÷îââb‰Drôèшˆˆ²²²U«VÖ›““<¤Ì¹¯¯ÏÕÕÕÐÐpÄ2ç‹/¾üòËqqq#–9'''çææ2eÎ:::ãŠs¼7'--M__âÍÕBJ¥’Ïç#oxê¼òÊ+ …bÈh­‚µÄÀÀ@nnî§Ÿ~zãÆ ¦Ì966öù矿{÷®T*ýòË/ù|þæÍ›÷îÝk``ÀÔêëëŸ;wnëÖ­—.]²´´¬««­½¯¯oÿþýÅÅÅ---L™sHHS|zëÖ-©TzöìY¶Ì9))‰˜ˆ/,,dÊœ½½½}||Ø2g"bËœÇçxoòä \=µyö§®7WÈ€+ä ÀòÐ"öööjYnyˆúúzfA/¬ûZ$77·²²’yÛÈÈÈÁÁAí—cSx$Œ7€quuuuu%¢õë×K$sss"²³³6l‰DK—.U(Ìɶ¶¶`Ó¦MóæÍ‰D+W®,..&¢ÊÊJ¡P(ÚÛÛ8`bb¼&"ggg"‹Å`ÅŠûU¦&ä  í¢¢¢ˆˆÙ„fÕªUáááýýýlûwß}·cÇŽœœœW^yeûöíNNN±±±Ì{ýýýÙ×D”ŸŸÏ¬sœ››{ôèÑÜÜ\ ü>Sæ)@Û¶ 0 ÌyzzŠD¢ôôôˆˆGGGæ½"‘ÈÅÅ…íj´Mq€#Œ7ÀÔ0Ú&4€}mbbÒÓÓÃŒF€F;::š™™­]»¶²²ò‘ç««T%Ï“ã  Eª«««««‰¨¢¢‚©‹477¿|ù2UUUI$’††"úùçŸÙMh¼¼¼Þÿý ÔÖÖæääêééѱcÇtuu?ÿüs"jlldª,™MöòòòØMq®_¿®¡_`ºÉÍÍŽŽ qrr:yò¤§§giiéØ[F©«T%Ï“ã  E“““‰(88xË–-éééD”™™IDÿûßÿrrrˆ($$„}˺uë²³³OŸ>-“ɘ·3äìÛ·/::ú×_%¢ììlæ|;;»mÛ¶effÆÄÄ<|ø011qÒK€éI©TÊd²èèè””OOÏ 6$$$Œ·T%ÏZã  E.^¼8vcUUÕ£©©©#V*¤¦¦¦¦¦Žx™L&“Éž LÁ¥K—:;;·lÙ¶x{{ûúú.[¶,66–ÉÑýýýy<ž\.gNÈÏϯ¨¨Ëå¹¹¹3gÎ433#¢¨¨¨¨¨(¦äY,_¸paûöí­­­aaaãê&ò˜ª®^½JD .d !@Ûèëë«T%ÏZó0Uûì3¶åóÏ?_±b…žžÞcô†’g­…ñ˜ªFœÔMÑ×׉‰¹ÿ¾££ã¿ÿýïS§N•––ѸJ•÷ïßO(yÖbÈ@=‚ƒƒgΜ™‘‘‘ŸŸ¿téÒ'N¼øâ‹¤RªÜ××'‹‰(;;ûÈ‘#¤RªÜßß¿lÙ²ÄÄD‘HD¿—<ß»wÏÊÊJ&“½ûî»ãíGcwaºÓ!¢àà`æ¾O'‰ÄßßãÆšÆ¡²²ÒÃã±±QË+ÒÒÒôõõ÷íÛ§é@&R©äóù¨o-–<÷ÝwšŽF€y Ð"lɳ@ ¸rå ÖqÒ6È@‹ äYËaž¸BÞ`oo/†Y¶…ˆALLŒêùwîܱ°°r›ÙL&ÌS€DFFFEE1+ÂÑ•+WØõb‰(33sÉ’%ªç›™™=z´¦¦†Ù~B6³˜Lo `Ö‘uuuµ´´Ü¹sç¦M›œœœ ›šš,,,"##ÝÝÝUÇtttÖ¬Yãêê:¤Ÿ7³ÈÈȰ··755uqqQ}Æ8>>ž´8tèÝüùóóòò˜Cr¹ÜÚÚZ X[[ÛÚÚ*•ʉ¾ SÆ@cìíí™ ¢¢‚ˆÌÌÌ kkk‡+ŒhÄÍl’’’JJJ„Bá7d2Ç "¢°°°9sæÈåòøøø·ÞzK(þë_ÿ ¬««ûðÃwíÚµxñâüãçÎʶ#BÞsìØ±[·níÞ½›bàñxëÖ­ãóù{q3›ÂÂÂû÷ï«N|”””0yƒ¹¹9³Ž\.gO033›={vVV–­­­««kZZ3C oquu566vuu500Pc·ƒƒƒîîîl‹¡¡ás|}}‡¼åäÉ“_}õÕ¥K—ÊÊÊ***.!–÷{IDAT\¸ £££Æ¨¦+{{û›7oidW{¡¡¡)))ì¡;wî8::vww«žÆ¨¯¯÷ð𨫫C¹’6CÞÀ®ghhÈìIø|ùrCCÃ¥K—˜£&&&kÖ¬áñxW®\¹qãÆðvi3›µk×–––ZYY-_¾¼±±Q¡P˜››;vŒˆjjjª««ÙK/Y²„Yâ^"‘tttìܹsݺu½½½ …¢§§G__òï À”ƒ2ç§ òÐv=8"Úµk—T*eÚ½¼¼Ø/.ÁÁÁ|>ÿ›o¾‹Å^^^¿üòËðvi3///++«âââ¼¼<f’‚ˆ¶nÝzëÖ-öÒ¾¾¾YYYD4wîÜŽŽ&ŒçŸ¾  IGl™s[[›——Wyyù™3g˜2g''§áã L™óð͵¯]»FDÌŸösÏ=WSS300ðñÇ477‹Å €æüøøøC‡‘L&ËÉÉyðàÁÞ½{‰H.—µ¶¶ …Âgžy¦¶¶Ñj„¼4`´õà~úé§ÛüñÇ1z“Éd2™LµE*•²¹ˆªººº{P(cô„2ç§òxR(s~z o€'…2ç§òx|(s~Ú o€Ç‡2ç§«®Å;=H$ÿ7j:˜†ÒÒÒôõõ÷íÛ§é@&R©äóùØŸ¸BÞ\!o®7WÈ€+ä Àòà yp…¼¸BÞ\!o®7WÈ€+ä Àòà yp…¼¸BÞ\!o®7WÈ€+]M0²²²Ž?®é(`º|ùò›o¾©é(4`Úæ 111·oßÖt0mÙÙÙi: ˜¶yƒ›››¦C˜nPß\!o®7WÈ€+ä Àòà yp…¼¸BÞ\!o®7WÈ€+ä Àòà yp¥KDíííõõõšŽ´WOO¦C€)åÿ¾Îò#C|ûIEND®B`‚mod_perl-2.0.9/docs/user/handlers/connection_cycle_time.dia0000644€ÿÿÿÿ00010010000000370111727205031024217 0ustar ????????None‹í\Qo›H~ϯ@fwÝ­›Tמ*tÒUºÞ³…íÃ8N^î·ß,8Æc`iÒ⨕Œ×3Ì2ß7³³³þðñ~íw2н0¸adŽ ,Â¥¬®Fÿ|ûrÉG¯/>,=÷=ü[EîÚ€o±zw5ºM’ÍûÉd·Û!ÿ!v“0B¾·E±œüçú¾;A“Ñõ…a<°tW]˯ºIyóm"À]Ë«ÑÜ]|_Eá6X޲Qù¸E臑qçúW£w7ék4ÉÅLä¼ {ã®ä<’î÷jÑ&¼„h"z#£¢Øõ&Œ=’…÷£}Ö9‡·¼ýeNOÑ Ìw4?›ðɉ.m$b)¬h÷1kTé˜Ï‹*"0 V¾ÌÕ8È435tJ,dÚ&cH3Ò—ëÙ"Œ‚ãä SÛR=)‘Û÷¨ˆ'v ·Ò[Ý&Õ°°h&FK2ÁD&7_ ŒÀ#™B %Èõ×LE|îf%ïép^N=“=ê÷†!ƒG Ę uÂ!LR5œM ¸• 0$¦f¶¶­ )AØÏ_:ÉPSÄ÷ÈsàRÈ»ÀËŸ^ KCÚ8QPÊÆ nkDŒâÞ\3Åbê †æ4Sºƒ`&ƒejJ«ª›¢ §"Ø®›âÍ”%šç…¥¬áçvÁÏiC?OÜ(™¹QîŠê$˜×Ê’g²g¾ V/[T®Õ^éÉY…çà¢=€«ÂÆÒævÓJïq×®ÖmuÊç­Ìñ˜Vp1Äi†­ôÔ#9¶˜~lU˜XÖrÎ3‰Š\d×/Þ±ŠYWE![ó‰,ªv›3=ŽJ ±Ue˜iíWíÀ¸:íª* sLuž?†Y;X¼á¡Gõ5ÿ<ï°VÛ|Sä,`f½ätJ0„ ¬ Ó8[™X žT)¦­OÖ×Eªé8öÏ× OÑ<[œÞ=V^L–ª?Ú½³…uC§èíW<`Í< óUî f?1ÀÒJ>F:Ã&¿UH4‘c«:Œâ<ì-î2އ=tg•{ãÐ¥•CpbÙ*ʱB,‚!Â:S̳¤ÛFoátØž9Œp›l¶€mÏOà1 D¢“HŽ]rà­º¨B½•ã³J΂XÁ èØ¥è &H…¸” dd±à8p‚¬À\²D'h`†Pd‘K‹(A'VŽ.ý¡%8'>±¥J^2“[ÊÀ(½f|`K ˜Â/k±ÉN~2W:€!tÈA‹m¸CØpåGÏ!ò*Šœ#»d-Ôb¤è½$ CÖâëèÒ+H°‹0ñ`\:À"¸„„piœ_þÚ&—F¸e|±åä:q%1WД&±b€G0SÖìá·$.ÞIŸ[Ú¦>ñÉ%_\²Ÿ˜'—@ñ¥\8â% A,¸¤/ñàžbÂh-¸`‰-y V½dHq• w°£ºb¨C‡CW fÝ®YQ*^4Ÿ\Ú(˜:Ó/e¢0ÝÒ ÄÄÑ.É´¢0B/¶Ê%ªÞŠ åHkZ‹¨õ­p«\çJ׺ÚÕ®€Ñ]÷Ê×¾úµ®ë@£þJØÂ6à„aËØÆÆ¡bjU²)'™j´K/¸Å—6pˆªz‰š­Å7nÀ%DD€KÅXæ–2¦¯ÂáаþC—8‹+„Á¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Áu‡"KÑuÉQOVÄb ¶X‹L,µ1.Á%>‚™ÐÀêx`Q”èÆ–4qÅ,šKé…'D¡ \p‚ [¢@):‘ F´sKæE¯z·$‚úv¢¦]RùºÄ^÷ÂW¾­2ÁœÀá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒg\â1LT’¥ e[ø& ÓøÇ@²‡Lä"ùÈC¶1u¥Ø8‹òxN>F²”§Lå*[ùÊXn±’q\]z]÷ÉwŠr–ÇLæ2›ùÌhþðþ–?•ã©ìÌksšçLç:ÛùÎ&^³§Ú,•7Ã9MrƳ MèBKYÏâsTüüç3ÚÐŽ´¤']ã³¹Ëýúr£åôhJ{úÓ ¾3¢9¥h¨0zÓdêt¨WÍêVSyÔ›*õSNj1©Úոε®a kMÉÚ)´®5˜n½ëbûØj¶ôž1m0M »MÄF¶´§Ýê^gê×M v¯±ËqE›Úàw¤­)lÍ©s%Kà‰MôÂMÿÔÓW¯õmqÛûÞu&÷¥Ì­í3s"pSWŸêí ãû൲Íl‡9ÛNøÅ–DIJSns)è„ XKKf—[¸Æþ9¾¥WÆr–\ùƽ4oiÕ;á)N ‘ežf `£e@…‡iÞaDÔA ç€9ˆõͲ†[ìáug¡Nvº’\bD ²ê¥?@}KRß’<éiÏZX=êS*¹^>æ !o8BJPf=ˆƒ !ö€Î‹,÷"»î(.<„‘YdÁÃu÷°8qÝÃwG8Ñ÷et!N7€¥ öà%’z‰£-ÝÒÀ1¿¥Ìsé¥µà¼Ø .hEÜá -8ÅÈXf@ ºv=ìQLëø¶÷°ì¿pR7ÞdŸÓÀ3ú%чL¢'kñ½äùZ´m µdÓƒ}&s]לrÔnDTM& e[(ÔJýÏe¢ÖP22­¯\-Øh}&>°záð(£ Ô^½Ñ”mÙÒÖ‘½%pm&fàÔq­(²­Ùµ&­2¡ý®-Ø‹}&>Œ 2ܬ]ÜdrÛcÛÙ³þ½%“=&SyÐ(Ò­Ù›&•}ÙÜò9ÚÄ]ÚfrUà(ä½ÜæM&×Ýš"ÛÓ] ½M&Í—(òÍÝõ]&Î Ý#Þ¡9ÜÄÍÜdâÜãÐ(¾Ü.&÷-q™"ÝóÝÝeBPN(ÎÝ~&ï2þlä]àíM&Ÿ™À(%îà'&®á™"ßÞßbRz°(4îá6>&÷ß 3âÂFàþàbbpŒBänä`‚ã |Ð%þácR O‰BánådãŽ1BŽj%^ä/&·PŠRæM~æ_‚åZn×GEåIÄ%=þ%bþàYˆBã]žçaå#3æ›V¡`UŠYb€&žš (ˆ®è_ò^&{ÞçÑ-å^Rå^&9µ†Âå]þéb"ç ÕŸ©ÕcÒäkÒ ÷(®ž&¡)Bp~ç\r\&”,€(¹þ%žîëh’é~2†.Ÿµž&·ðÀ—òìgìÃÞ)žŽ&`âp`²íjrë"Óì¡iíhÒ Yí‹Î&ÝþíÚÎëkâ†Sî(âž&Ø^èªÞ®è\³è~&¬¹³Þ(ÿ^&ôïo2 ÐrïÜîíààûÎÐý¾²_&<0Ån)?& Ïðœâðeâþ¯("&ÏìïײO&%XßîlBòiÖ˜’òd" }`ïòÞ&_î-Míï6ß&é]0ð‹óbâó!ôj" ü ôr‚ó'/æEßT¬.&P/&<0~éä(a&VïS'×ä óˆÂóf"õAÞõ“uôŸômBP´®÷jÒöo¿)r?&I@ÅáNõl’ö,ß×Fÿò{öar€ ÞŒ(’ÿ%‡ï„¯øi и(ïùïöp/1殕™¯¹Îª½Œ²úªú'Õ`¬§_(…_&›_÷Žïõ_&°ï%üÉøjRûæpûŒ’ûbrþ ·qOújú¢Ïõ½÷°Áß%¿|ù†²ý[âüa”)Ì&yË/ýi‚üʯ0©ÿlàÏ%&øÅ?'ç¯)å&Ópmðn£_'qÀŸZ D˜PáB† >„Q"CžV]ĘQcF7~ü¸€—‰%MžD™RåJ–%3ihiP€1Q¾Œ9íN›^6[®ã³@>'õ £M>UèäÔU-R*’$T®]½~M‰Ó¦Ü|€U(¶åТh"mù@ ·áæÜÙ³î^¾µ¤bÝh0H­} F,QmLhâ^¼R.ÝÄﮌv¾—×þ­ÚèßÁ—ÖXXôjÖn#³Äd˜13oíYå:õ9¹õð“¤QŸFQ5qæÍY¾^‰À˜³|¡§äí;´î”ŽÈømô6gçå£^M^Õ8êåæÝ¿_x]eúÊ?éüvà-ŸÝyã—½¸[);øÞ[o0äÒkï@ÝÃ¥Kå¾Úbú/@þ| AìÏ&ý,/AÀL®AW.“ÌÀ›\¬»0¦?¬Œ@”,`›ÊP@‡3+ÙiH%[sñ¤)ȃF£éqC›¨€G#êÒQ¥—d­HªŽ,ME†€"M5×d³M7ß„3N9ç¤þ³N;ïē͕4á ?ÿ4PAý36E4QEݤÏEý“‹,€´RKÅ×KíÐM?ÅTSPUª•QOEÕO˜s*23s¡V܉£V[oÅ5W]wåµW_6Xa‡%ÖVÈCÉwÔa¶YgŸ…6Zi§¥¶Zk¯Å6[m·å¶[o¿7\qÇÅö)XE/¹W‹U¡Vq"^y祷^{ïÅ7_}÷å·_ÿXÞ7=É„F8a…f¸a‡†8b‰'†xŒs‰k¤u±j7¡w)9d‘X%ƒGF9e•Wf¹e—)¶Ýô.Ú˜ªŽúøewf¸ä”Nþæ9h¡‡&ºè cÆ8Ýã2&,Ɉr6:ê¡}Nö`©¯Æ:k­µFšH¥K«9+§!‚zk³E¦º`«Ïf»m·ß^¸ëÖ˜Œîn>¨l¸÷F8m“€æ;pÁßZî0¿VÐîÔÆ~Ho¯×ï’‡¼rË/ÙðÕ7såwÈqÌ —|"ÊGG=uÕùÕ\4ÏÕCVÐ}u¸K—ètÛwç}ôÖC{=즷"ÞÞùÆ="Ýg¾y¸¯,ø×WÁÛ ÚÏÚïif¸Fùµ±?ü¬¡OLúØÙ¡ëÅ7Úo#"•nZž}ûïo™|ÄÌŸù¢ê Zþ‚V:#@‚© CCþê'@60bú; ÿú÷¿ZÐ.KÞ/0U˜a! ¼`Eè/F‚3£ ˆ °,y!ÂÂ0ƒp$„#ÄaéU¾œAé“•ñFŽà ±ƒÂ0„8¼áM(AÐô .ØË¨p!ÁÒ Ghƒh8È uxAŽÑ <ä‹SDw aŠx\À‚5è"aЏÃZpŠ1ÀAsÔ05-6¤øB+ÔP19b±¶Ä&>1Š<›bëuE3¢q/jDñçF„r‰žÐ cA؆!Œ9œ!ãˆW4Èá‹hÄ à þàkÔá †ˆ× s¸ñHæ2›ùLyͲ–·”—6:ˆƒÁt‚3Š€;h"^ˆ¨CG)¯aó˜Ñd¦3¡Ù·B:DÀF ÊÑHÛÁQŽt´ãÕð¨G>ú‚4#¾вÖ zÀ@Qpäù&˜*):‘ˆxÁ]ît·;ÞõÎ÷óþ«Ó<@€1ŽP–ÞyéÞt¼®o~7ãÆ6¥×ÀíµG,cƒˆE Ë{ß_øð–7½íoÚC<é¾ÀÛ]¯ÛG ßï™ïðÚGœyáþʸmuëM}_Y("8° ¯GvdPµ1Ø¡Ž*œ"ä(íAæp¬_ !ØvP† ˆô»ƒKƒ¿’'0@TÀø›¿ú 9-n¨ƒ7X‚G˜—ðwp†O ¼³#p,@ÁL@X@‰c8b†>X•Ö³Ÿª»º¬‹—­€®ûºÎ€¸›»ºsÄS<ÆK/»±+»³›[@Q †4è¥'ŒþÂ)ì¥FH»µk;x» ü¼ºû»Ñ¼1 ¼ƒYÂÂ;;#\¼Æ‹È“<ʳ<Ì£ªÍB!=3$½¥“™™yº»!?2¿„™Òá?H‚$ðƒTKôëõc¿qz¿ À” ´@ Ô@í’?ú³?öâ;3‡Y°Q$ES”—È¿ýë?'ø¿KDÁ\Á¤ÅôÄ E'ÐÄ ÌÀ ìÀ AH,"„EÄÄt@ääqºéI¡A$ĉñèaX‚?`Är½iôF?¯?±I3õ‘Æo$-ª†%@€mdGDÇxÜpìŠq‰P!y왉ó}ôGöþ¡G®°G¨+Ç úÇé4‡€ÇƒdH H¨H@,È6jHjäGˆXÈŠÔÈ·yȧˆÈÅ™HˆÚHˆIHêÆ‘DÉÀéH§øÈŒˆÆ”l˜’|Ç“„Éšd›•lŠ–üœ47›T™äFŸÊçaº¹9Ÿ1Æ@¬ sÊyÊF¤É¦”Ê¡ÁÉÑ8JWIJž”º©ô—§´A®˨©JŸÐIÿQÊ|äJ¯DˆŒ ˶œ˜±´‰²¤ž³dÊ©TKs˼丌 ¹|I½´—»4h¶2ÌÃDÌÄTÌÅdÌÆtÌÇ„ÌÈ”ÌɤÌÊ´ÌËÄÌÌÔÌÍäLÉ„‡¢<œg¼JrÄǺ”JÁ,ˆþ`‚ÕdÍÖtÍ×„ÍØ”Ínp‡9ÙÄMÜ<ÈÍÞôMØlºûÍá„M8âDNÙ„0†äÄMãtÎètM-@‡;8éÌÍkx†è¼…>L?ÉÒÌÀ¼HçÈ8£h’¦@8¯è’§s¸-°‰øä T x h09¿<Ë4à†5ÐEÐUÐeÐuЅЕР¥P½ƒòlDPÏA‹ù¬Ï®ÀO§xˆ„û ‘ºhÏ÷lŠ_ð†1Ð P­4ˆbh†ÅÑÕÑåÑõÑÒ Ò!%Ò"5RuGø8†9˜ƒcð‰õlŠ=þQ®Ѧ8€§BQÃQû4ŠGP†(x-ˆÓ25ÓˆÀ@„'õP´¸RaÑ !Xà‚˜¨Ò§R£è…0@à!2=ÓB5Ôƒ€®Y`Ó¾ S;¥R9 IÀSHuS,õ‰F`JøT˜ÒAÍO—TÊC5Õ)vp'° (m I¥T¨ÈS£0 †J=ŒF½Ó˜lPƒI0$ÑP­c•ÈSUÖ2Õ¨DhÕ6E‹Z½UYµT¯‚4(U†˜U§€U›˜¨IZp(VÑ쟹¤Ñee×ò0„¥zV-ÅÖu=‰mõ‰À®Ÿ¨V°þ֘؅-8‡Zˆ¨…kð%Ut lm׆] %`‡:€‚˜pÕ¦À×I VÃ(æÔWĸV†Uˆ…‚€„(°„„õìtØ–u©RŠ…V´ØØ&ÈØ¾Øq€l` {µØ|]‰\†u( Ø„‚Ђ2`‚%!T—uÚò(Ø™=ŒœÝÙ§ðY›` „žÝW°ØXc`‰Ðƒ¸N0ˆPW%iÚ§uÛá†8Ø–¨Ø¦ØÚ®uЬ‰=€'ðÚİZžM ¨;0G(ƒ°pH¶EVŽ`Ù·•ÜÖ¨XºY´à[¿ÍÛ¯í 8؆•Ð[þŸ¸[• \8ˆF0ƒ8£’¶ÜÙE B€À\Ä]Ñí\ÄÀ©J ]ÏýŠÍM‰[`†(1F¨ ƒhpX†Ø}ÜΉޤÝêE $ˆƒÏ|ŽÌE‹ßíÝÀ¼(ÞÊØÝÑ= „X@ˆèèUXYë¥ß–¸.FØÞÄßï5Œ\(˜Ÿ”(]Ÿð^“àdȸƒP„@(*`Ù­ß îŠ=ûüE ÿà¦à–ºS‰މý5 -¸`„HHJ€ƒž^ØIW ¢àN #Px€`•¨[§øà”5 ^‰<€)aáý `–@„0S ¦þá'¶‰€ÿÔaîE !&â6b®ÈoB ö`n‰C`&~áQ¥^(fcŸ‚•Øá¦èâ/ÖâʸÞb¯Àâ˜xR@ãøý!zmãCnˆ_xƒ;x†*<ÞcŸc•¨>:ã•p€Rä•}auEäQV UGpäʨäK–ä>† è#0ªWWî Hn‰0…OþÎÈ%å^žˆ@À±TN XYÆÕÊÀ„0¦e®Xå– „Ðeuáe_¶f‡ ‚ꌆ°°b·HæeÎÒʈ€f^ b6攦(S'¾æw>¥ Ó›èf´çrþçaæAšeÖøf–ÊSw†gx(n ØçE:æÊøÈ„~^{f‰@ØNãj.莮…^hƒ;˜z^ˆ&؇NŒw`AŠ^è†^ @ð‘vÞèP–ancH iÑPiiÈçĸm60‰Iމˆžh•@V˜æ¥¡éùµé^Ñ j”N “- £n‰ž^‰h…¦ŽŽêwÑj8‰9† ­æê¿vjHR‡ðj–°j¢N p²Nœ§6䳆â=5 ¶~ ¹¦ëŽ[ÀEëêfö ·V‰x¿>³lköH‚µ®g·`lþdžkÑ( ÇÄ®ëˆ €X°l#ÁìÌîe! è—øl·(íÓíí€-Xí…¸k¼nì€E‰Y™&ä5 lÙžánÅíÖ¸7àîíÊà.€t8 ÈöŠÝN PTåå†jç¶Þ\[‚ÂÎm´¸îì®îÊàH\‰îžýíàvˆ<([ñÞeÀ6oxþØÀ6l¨ˆïù.âÖpèüFˆú^‰öÖî“Àƒ©åojöïÿ~ç‹nWp î† P&¢_‰G‰x°…×FÊ Çpkæ°Ù‰ð§q qLnM€÷-qïŠ_ð“xÕ­p§&ïæ~þqëµZ0 ñõv ÷qg 6è¬î„W‰Ïñ‰h]`q¬tñ%g*(‡3Gó4Wó5gó6wó7OóÊ8Ws `:Çó<×ó3Zo`ƒ=_óCh@'ôB?ó/ÈsA7ôFô»ƒBǃCôçu‚&óÐ000†N÷ôOõPõQ'õR7õSGõTWõUgõVwõW‡õX—õY§uS(O£™NòLo¶Ï_ïÀõOÒõ…Ur^ _öeÇa/‘b—ßcGöÈŽJf·vqöK‡öBžöáPök÷loLïö¾øvp·vq÷N ßõr_sG÷eWwgþocw÷w¯öx×÷y™÷¦«÷h¿wÑ€÷}Ì~7Ê奀×ô|'x}7øÐüwnWø¬fø†G÷‡ßœmgx‹÷x{Áx×Ñø„çøÃøËž‘w(i/ù–8y”ŸJ•–/®—7Œ˜—ù¦¤ùò±y4Ãys¯ø*#ö±n*,’—¢—têˆbŸžßŸŸ'7—úŸz–¡$'‚")¢"+Rú¡É¤†û~)x†…,˜Nš5à‚ú7üzÞ‘ú¢úñ³ú«W¬¨=ê£?â™t“ÂO®ÛÛû}‰½kCüÕ¹{Ê{Òä{·Ðy‡ù,wû¥`j'þÆ‚§Õú|àŠ—ÉÂ&ÇŠ­È¢­qº-'pzÄïüÞR-ÑÏ—×o¬ H'îª\„ª­Ž¸­(è\ˆqس}¥Ë}÷R}sÊi§:8¯Ö:US:yÙ}rR~Ò¯,ÀVz¥Xr‚ËʬÈšÈï¡É¿ÇÊG‹Ëo˜”:¯+23&S²0k2¢ ©C*'²«²+«ª«'NÔ°@@¤ØJÑ€'£¸c¥B[˜e 7n\ØðaÄu5œsBÈ ÂFI™è4À‰Wê šà’‘$M¢t¢K—‡^Xi‚{r<´3áÏ /Üi’â¹.Ó2ºþàΛÖ9Á`ÈÕ4¶†²mëö-Ü¡&4Ôªk÷.Þ¼z÷òí‹€§U‚.L`Ê/àÅ/äÈ’'S®lù2æÌ™M|ˆëù3h'NKrwç“Àe¶¼-sÀ ¸†íD6BgâLð¦`Ò@›Æ`•Ð5¡ÈšFíD5ëÚ±g»mžzµFפ—Ó¦~ü¦@Wä²?åÎÝóùéŽæ˜^7o¾³ ,¹À>|u’HOh (]š(Yb‹)¸ b-¨`c8!…Zx!†zq6 ‡¡ €C1 1ܵ§âNî ö"*8ña;m­'Ðyþ#–ÈŠ,’Ö–Ž&¢ØÝvÔ­çÚ:I0¤v8é]\7v‡_Bí©¥‹0ÆX%n …:ˆ¹ãA‡e~6W†&ø a ²¹X„iÊ9'uV¸¡™y²uÍ7H‘ ›¬%ãŠ9Íø8e}%]QE4C™[®•S©wƒêÄ¡‰.ê–¦†"ÚLw^:‘È“—^™@¥ÄAE©¡šœ¥ Iy£•ß©*У‘²•«@ë8²Ì:ƒÄR‡z*Ëšvj¶æ›ƒ¹maq:{-¶Ù:‹ç²Ë6rÇ-¤@ .8áÛ, ,€%N˜€(ë`!½ï¼õÞ€5,¨`Kd:ÁKþ¯| ÀÉ:¡?€R82>bÂJ$"ºê²ë.¼òÒÛÙ[¯Û®y€C =Ô"1ì0Ä2ºæÎ ÉXòÉ)¯Üò ?ñ[¥‰ÂW|±˜àU ðÜ3ÌËÖï¿ t Ó&}5C(ŒBM¾v«l³ÚR-µÓR;˜µf»ý6Ü•q;¶ž ôÐÆW˜€…R„°;ÊT P_]"ÇHãDáwžøâ¢ÃŽ:Uœbª£pSÇK<²ÑÞ¸ãÌ'Iãù ¸à„ޏâp­øà iÀÍæ<±¥@¡^zw1ˆ³F  t{î»ßì„ï¤'åþ50²c€ë¨ =ŒC€.ºó’Sn¹©Ø#6õ·qã¢9³ØA÷²eÇÝÚѪ½ö*m¿?þqÏÍ>ÿýûÿ?z À€îËß_D¿ù­Í~| ç´¿R°‚üLd‚w\°ƒÐ#¿71ZŒ Sx  ~°….ôŸ4Ͻ°†5 !GȦFë„*ü!%ÃB±ˆF<"Û‚ÃêðA<|“ƒ(Å)ÞeˆI¼"³¨Åþ-M\ÐÙE*’ˆVÜ"Ó¨Æ5²¥‹ùû¢‚Âø 1–±Ž<#ó¨Ç=Ñøƒãbä¸ :Ú±øÃ#©ÈEþþÏ÷¤b !Dz’(D$#3©ÉM‚°@*„d›@iBZ²”ÙÂ$'S©ÊU:Á‘ïåa`IRš²–uB%+s©Ë=º2n²Œ$áDI[Ól¸Ü%2“™Å^Âí— rfý†YÌin dʼ&6ÓÈÌ·93˜Œ‘&5Ã)'´a æ<':Ó©Îu²³î|'<ã)ÏyÒ³žö¼'>ó©Ï}ò³ŸïD‡'SØMhÒRœ½L0¤ Ð…2´¡}(D#*щ:Ô,à°E3ªÑr”¡E€":*Ò‘’Ô¡“€ŸJªÒ•>T ðPXj Tô+èAsªÓº0D¦¬XAÍf¼4þ¦ÔÓšÒmàÜ)T£j`z¹E‰ª£N`^Æ¡Ô2U¨ejS£)!©²ªb8€`—o\Âè£WÁz±–’hE]‰*€uÔ*WÅ‰Ö¦â´­Žµ¤20€nx §(ƒý ØZ–°†µä2ê…ºÂhvÌkXÇZËÅÞô©}m1=` ghÉv íhiû"ÓV’²ÐÐbÙ¿v°…%&kèZØ2×Ùà2€‹SÔÑ·Ò®ÁÐÈJ1Z¸­hI»[äÚ4m]nsÓ+E/lÀÝ}Q%¨¨]îv÷»edBtß‹vø ºþø-p±»ÚòÊï¼kU/‚¥è ý¾ˆRÄ/ƒÀ_;B"ÂU ã|õkß§Õ›£Do‚C AND8S¬0ƒ/\H 0øS„0ƒ'lËäšÄ"¾1þHÀ`'Pñ-®äôk*¢X¿*ž1Ih`3…›xoÊä÷¹’ŽxoÈÈbýº˜¼^r“ÃŒ@Mt÷u¼rw³lIGÜAº|²‹IãÚXÌvÆ–¤‹ ;²Ùͦ´@›µtà)¢YºjFò—“ Å:ß¹ÑuÊpAPH@wІüŒÜ± >ZKoörS=\-F;ºÔi –péNSdÓµdD§¥aHJ ZΊþv"˜M­ëkFí¨$¬_$kbR Ð9¨$¦_¤i9½Âms^´¥w-í4]âE˰d±sìb.¢Í °d°3ìÌÔ @†¹»\8ûÖ`Ìõ´ã¦  <(e·ðíiNà諱 ô‰º¤€àtwá-ï…[Èƨe¿ÿMMEÀ”ùÞwf&aðZt .è ðb¨ "p Q pà'XAÅŸ…ð@*œá6?»kIqqbÕ”§PÁóÒ‰¼°b¦®øE-TPIXÁ.X‡ÌVµÞ¼ê!î¹Õ/´ó /CÇKÐÃ^þ˜»ŸPyfž-FRg½ínwþ4Ö Ôõ»|ý.b¯EÐ7K!µÏ‘íoÿ;àÝ>w»ÔÝ.wúQ!¾Òï<䥆swBÒuA'–`nKÔ%Èn €Zˆ¾<°€(J€‰Ft#ê¡®yäc/ûÙˉñ“Œ6ís¯ûÝŸmæ‘„=ïƒ/üáÛ^˜¸>ò“ûâóøÊ>ô³Îü;?úÖ¿~8‘^§éºúØÿ>ø+Y xß@ÜŸ¥ãïþõ§ð¨ G)Ê™ó;Uþì¿?þñ÷‚Ðâcˆ†ÐŸ`4Vþ ^Ëþ FÿýŸý!ˆï…ÒRßN ÂMÆàÞE`,q ú5`† fÆþF‚à^ Õ ¶`…”`aœ ùy 0Ÿ Þ ú † Î >Ó®àdìB¡!&¡.!6¡>!F¡N!V¡^!f¡n!v¡~!†¡Ž!Rð ,T<8€J]Z °”Î!Ö¡Þ!æ¡î!ö¡þ! ú¡*œá‚´C ƒÄ]ï¹!c¥_>" î a""*be¨ B¢&V $®%&â`¢#n")à~¢%¶áëa&–¢+²_ ¢¢…ˆ" ¾¢-‚_Ê¢šü ¨}à-þb¾À4A%¦ -#2à)cíñ¢þ ^_:Üc4^ã5Z#6n#0j#7~£+z#8Ž#$Š#9ž£ š#:®cª#;¾£º#<Î#ûÉ#=Þã÷Ù#>î#ôé#?þ#ñ9#+Ž"@$äù£A&¤ì!¤B6dà‰b„E¤DN$EV¤E^$Ff¤Fn$Gv¤G~$H†¤HŽ$I–¤IžäI äÔÁ'´¤K¾$LƤLÎ$MÖ¤MÞ$Næ¤Nî$Oö¤Oþ$P¥P%Q¥Q%R&¥R.%S6%L"#NTN%UV¥U^%Vf¥Vn%Wv¥W~%X†¥XŽ%Y–%Í¡Y¦¥Z®%[¶¥[¾%\Æ¥\Î%]¾ZÖÏ%^æ¥^î%_ö¥_þ%`‚e/&a¦a&b&¦b.æAc>&dF¦dN&eVfÂÝ¥ef¦fn&gv¦grå`~¦hŽ&i–¦iVfhž¦j®&k¶¦kªej¾¦lÎ&mÖ¦mBàmæ¦nî&oÊflö&p§p'^þ&q'r&§rj¥q.§s>'tF§´8¦tV§u^'o6'vn'wv'ij§w†§xŽçc‚'yž'z¦§^š§z¶§{¾gY¢¤|Î'}Ö§}Þ'~æ§~î'ö§þg@;mod_perl-2.0.9/docs/user/handlers/connection_cycle_time.png0000644€ÿÿÿÿ00010010000004404311727205031024252 0ustar ????????None‰PNG  IHDR„Z ÛÚsBITÛáOà pHYsÐй‹çŸ IDATxœíÝiXçþ>ð'la“Í . È"à‚Z–‚ ‚ T¥Šb­l*VPQ¬x\© T­Gq«Öª§xÉ¢ ‹¸àŠ‚Pq+‚jµî‚,ù¿˜óÏÅ@„$Ã$™ûó‹d23ßI0÷÷y2aFq!VVVNNNLWÀFÉÉÉBHHHÈÎ;™.€8ŽÓ5°Â€ac†!Œ†0`€ac†!Œ†0`€ac†!Œ†0`€ac†!Œ†0`€aJâoâàÁƒIIIâo@Fùùù-[¶LäÕ%ƵµµÅÅÅ–––ªªªâo @¶”––Ž1Bœ-H Œ)455•ÔÖd…®®®˜[ÀgÆ C0 a À0„1ÃÆ C0 a À0„1ÃÆ C0 a À0„1ÃÆ C0 a À0„1ÃÆ C3x<^uu5ÓUH„1H©[·n…‡‡×××3]íØ™I¥¥¥½{÷ž?>Ó…H„1H©… þöÛo999LB/ÖfRÿþýy<Þ… ž={Æt-´cg¿‚0)åççG9vìӅЋU™Ô’¶¶ö¨Q£šššŽ?Ît-ôbm¿‚0)åííÍápòòòÞ¿Ït-4bO& š8q"!$--éBèÅÚ~ :a RªOŸ>¶¶¶ïß¿ÏÍÍeºzùúúBRSS™.¤«yxxp¹ÜK—.ýõ×_L×B#6÷[Ðqc^TJÉýLõøñã¹\îåË—å;“uëÖm̘1MMML×B/–Ì€8Æ ½|||N:õîÝ;¦k¡{2IKfX2â@ƒôêÕ«—݇äþœj–d’ www.—{åÊ•§OŸ2] ØÜoA!ŒAª±$¥ÜÝÝUUUå>“ijjººº677Ë}J±ä7D†0©æííMÍT¿}û–éZh¤©©9vìX6d’ –¤Kæ@dcj={öüòË/ëêê²³³™®…^,É$AnnnªªªW¯^}òä ӵЈ=s „1H;–¤K2I††•RéééL×B/–ü&ƒhÆ í¼½½óóóß¼yÃt-4bO& ¢þښܧkû-脱ñ÷÷gºi¤¯¯ooo___òäI¦k¡K2IиqãÔÔÔ®]»öèÑ#¦k¡›û-ø$Ù ãÕ«WÇÄÄŒ92&&&&&æÎ;Y+66–îÂ:Bx3fÌè²Jd Kæ÷Ƨ®®.÷™$H]]}ܸq<Oî?Oem¿Ÿ${a¼bÅŠõë×;88¬_¿~ýúõVVVYKJþ¾±ð2&L˜Ðe•È///EEÅ3gμzõŠéZh¤®®îêêʆLÄ’ë‚°dD Ät³nݺ«W¯8°¹¹¹¶¶6,,ì‹/¾ ­Zµª°°0&&†ºéèèèééIýÜÐÐðÓO?Q§®®ÎÃÃÃÝÝZ´~ýúׯ_WWWÇÄÄìÞ½[UU•º“ZºgÏžÊÊJ÷îÝ»ÀÀ@~%™™™.\àp8§¹¹yãÆÂËØ²eË“'Oª««<Øò Ö¬YsüøqŸeË–Q7322&NœHÝR¼œéÑ£‡££ã¹sç²²²¦NÊt94òóóKOO?vìØœ9s˜®¥K¹ººjhhWWW1]]¨9€ôôôŒŒ ¶½Ä œü„ñ²e˾ùæ›ÐÐÐ~ýú}üø1""‚Æ+W®|õê?G[Ú¶mÛÔ©SûôéCÝܾ}ûÕ«Wíìì!Tjúûû>|8>>^EE¥åгgϦ~àñxßÿ=?Œ³²²ž>}Êß×›7o"##?YÆ÷ßÏßcK±±±?~ ¦n†„„ÔÕÕQI,¼xù3qâÄsçÎ¥¥¥Éw³$“©©©7.555##cÞ¼yL—C#Öö[ œü„1!¤ÿþýúõ#„¨¨¨hiiud•¬¬¬–-¶±±‘Ëå¶Ì3CCÃ5kÖ´Z«±±q×®]÷ïßWVVVPPhù-þÜÜܤ¤$þÍnݺíܹS´Ã¡Ìš5k÷îÝTNïÝ»wÖ¬Y/^žL˜0!::úìÙ³/_¾ÔÑÑaºº°'“ùúú¦¦¦;vL¾œµý'Wa,}}ý6‡ª|­Ä”µk׺¹¹ñÛE‹ñ577·z0‡Ã§Âþýû?}úôÝ»wŠŠŠ?655å/údñ2íÉ“'µµµ-ï:thqqñŽ;äu6ž2|øðÔÔÔƒ:880]K—200PWW/))ÉÎÎîÙ³'ÓåÐÈÎÎîÌ™3;vì˜Ó…t5BÈÚµk™.„vƒ.(((((`ºér÷îÝ›7o0]8„q¦R£¢¢ŠŠŠZÚè³zõê÷ïß_¼xÑÁÁÃá̘1ƒ:¡zÕªUùùùóçÏŸxð Óµ€‘±0^³fÍÉ“'GŽÉápšššTTT–/_®ªª*Î6ccc¯XLê*­­® caûâÅ þE|ËËË7lØ'Î6ß¿/ÊD%caÜÊ€þùçêçõë׿~ýººº:&&f÷îÝÔp™ÛÇŽ»pá—Ëýðუ£ã¤I“¨ûW­ZUXXÈ­:::zzzò·ßÞZ„ÌÌÌ .p8œÆÆF‡ÓÜܼqãÆO® å/]ºTQQ!gûMJJÊÖ­[kkkuttœüñGþ¢6‹ÏÊÊŠˆˆhjj"„äçç÷ëׯ«+™%Ûa|àÀêg*Pýýý>Ï¿„0!$33óùóç›6m¢nîÚµ+==ÝÇLJ²råÊW¯^ñ3»%!keee=}ú”¿Ö›7o"##?¹°ÁÅ‹·mÛvãÆ KKË?Ž9’ÿë! nܸñÝwß>}ZKKKp©““SÏž=»¦’.Û—ðCnOuuõòåË­­­ÝÜÜ? !ÁÁÁ .üd@ Y+777))‰¿¨[·nüËXж/‘‘‘={öôóókhh8wîܳgÏŒŒŒ˜®ëÿ¨­­}ùòåëׯی„ààà.«¤Ëö%üÛsïÞ½æææÄÄÄ6¸mohh¸hÑ¢ììì6ÃX´2€%dï«M†††ëׯ_·n݆ Z%1!¤å€˜>ÍÍÍ­îáp8]°_f>|ˆ‹‹1bDnnîêÕ«7lØŸŸ¯§§Çår !ÍÍÍ»vírqq±°°ðòòÊÍÍ¥Ö5j”™™YHHȰaÃ,--§L™rçÎO."„Lš4ÉÊÊÊÖÖ6**êÑ£GüEIII#GŽ´°°°±±ñððàÍÝÝÝçÌ™Cqqq133377ß²e µ(++ËÂÂÂÌÌÌÌ̬¦¦¦å¡‰P¼pííKÈ===©Ç4ÈÆÆ&))‰ÇãBþóŸÿP[{ðà!dþüù-·,ä…;vlHH!d̘1fff—/_þä%„2„¼”^^^ÔŽŽ?>eÊ++«€€€çÏŸSKýõWWWWª''§+Vt°B²Æ"5jÔîÝ»ù7÷îÝ;jÔ(þÍ·oß †«ðµlmm8À_ôòåËÇwd_ Ç®_¿þúõë ¨©©Q÷¨««ÿòË/QQQ„¸¸¸øøxccãÀÀ@…¹s禤¤Bœ !...? ¢>t²(''göìÙ Ó§O3fÌéÓ§§M›öîÝ;j¿111Û¶m377 :thyy9•R„   777BÈ´iÓBCCCCC©½B¬­­Ã¨¥­ˆP¼pííKÈÃÂÂÜÝÝ !………žžžÃ† Û¶m5#ecc3nÜ8þF|}}[nYÈ! Üj-SSÓO>QB´W†ð—rÖ¬Y®®®„E‹ݹsgâĉ=*++#„ܾ}{ÕªUŸ}öY``à¤I“Þ¿_]]Ý©’@ªÈØ4õš5k¨ó­bbb455ù‹V®\ùñãÇ‹/ROŸ>}РAÔ"//¯£GFDD¨ªªÖ××õÕW-ç'Ož<þ|mmíiÓ¦éëë _kÆŒ»wïž3gŽŽŽŽªªjïÞ½gΜùÉ}ÅÅÅÕ××ó+ÔÒÒÂלäÉ›7o!½{÷nyçÀ !=:|øpPPÐÒ¥K !MMM³gÏNLLôóóspp8xðà¾}ûìíí !ÖÖÖ‘‘‘Ož<144²hóæÍÚÚÚŽŽŽ„îÝ»;99eff¦¤¤|ûí·555©©©ááá .¤jˆŽŽnhh ~ž4i’¶¶vNNNHHˆ¡¡aËR #""òòòrrrZÞ/ZñŸ«öö%dƒ^^^ªªªÙÙÙaaa„ðððäääàà`SSSooï“'OR=ztSSËBY==½N=QµW†—’âçç§®®ž——7tèФ¤¤–+R_áñx\.×ÚÚz„ ˜ý–i2Ʊ±±±±±m.Zµj•'MšÔÞYÍ®®®TïÙ©µ‚‚‚‚‚‚:µ–˜_Á)GÀÿúõkÁEååå<ÏÏϺ©¨¨èíí}áÂþ|#ÿsejN»åà²ÍEUUUü3(ÔÀˆ:¿·å—øçù‹FœâE#|ƒüÿ­nnnÙÙÙÏŸ?§ºg%ä¥l)!!¡UO`cc3{öìÇB”””"##­­­é.h"ca µ†®¦¦¶}ûö­[·*)ýïÖÊ•+uuu½¼¼!ùùù „ðx¼Ó§Okjjêêꊶ/###…´´4þ”8•L¥¥¥æææB¶@}ÚÚ}ûö%-^LW®\¡fŒ ¹\®ŽŽÿ êëëWìø!ÓªUB^Ê–ÏJ©¬¬455-))©ªªª®®>räHBBÂäÉ“[>! CÆ’¡­­½råʘ˜WWWGGGUUÕâââ7nøûû›ššzzz&&&›˜˜\»v­¬¬lñâÅÊÊÊgΜ!„ìÝ»7  W¯^ÔY¸ÙÙÙ¡¡¡B…‡‡GFFŽ?ÞÙÙYII©²²²¬¬,,,,88xàÀvvv±±±gΜéÛ·occcEEEYYY~~>õ6m``@Y¶l™••Õ“'O ½¼¼V¬XqäÈ‘êêꪪ*BHrr²–––¥¥å„ D+^øsÕÞ¾:²ÁÕ«Wß¼yóõë×9993gΤÎÙìÕ«!dýúõ}ûö-//¿rå !äÆÔh²½CRáþýû¯^½J•×­[7.—H=íO9|øpMMÍýû÷ !»wïÖÖÖ8p ‡‡µÍ6ËòRBvìØñÇP[ÓÒÒjYF^^^BBu6Y}}}yy¹¦¦&5—²ˆC i5IÒ)‰‰‰QQQEEEüÄ·téR--­O¾­K›‹/&''—––~üøÑÐÐpܸqóæÍSWW§¦"=Z[[kbb2kÖ¬¯¿þš2f̘p8œÈÈȱcÇúúú~øðÁØØøÔ©SBB²³³wìØQ^^®  Ð§OŸáLJ……BÞ¾}›››ûüùs333ÿo¾ù†_äÎ;÷íÛ÷òåKccc—ï¾ûN__ŸÚ]Ëc>|8u¢–Å –ÚÛ—ð æååÍ™3Ç××÷Ì™3MMM“&MZ²d â×_ý÷¿ÿýìÙ3 ##£;wîÌœ9“Ÿ¸m² GýðáCþM•ýû÷ÛÚÚ )^p-Bˆ­­-ÿìÎöÊòR¶Ú ²²ò¨2ÒÓÓããã_¼xÑØØ¨©©icceii)ü™—röööçÏŸ§ºÙ¢««+N’r¨©„1H! c ÆgÏžíøyX [ØƬøjȺÌÌÌôôtBÈ®]»þüóO¦Ë0|f 2`óæÍÔÇ´‡¶²²²°°`º"IB€ øäçÐ2 ÓÔ C0 a À0|f,a?ÿüsMMMuuõÁƒ™®dƒŒ…ñ¾}ûvïÞ=räH…?º»» ^E±M±±±‚×9ÙêÕ«³³³GŽÉ¿§²²ò÷ß'„Ì›7‚+@@ÇÉXÏš5«¬¬lýúõÔ͵k×öéÓ§#t†ºÂ‰¤¬X±âŸþá—AY´h‘·¬"caÜJDDĪU«âãã©›{ö쩬¬äñxïÞ½ ´±±¡î_µjuáEꦣ£cËkÚ´·Vegg»»»‡‡‡wäÁÇŽ»pá—Ëýðუ£#uq§·oßÆÆÆR—Û»}ûö¿þõ/--­äääNU2J¶ÃX]]¡VBÈìÙ³©x<Þ÷ßÏÕ•+W¾zõªå@¶¥öÖ®¦¦†J÷ÊÊJwww“O®’™™ùüùóM›6Q7wíÚ•žžîããóÃ?¤¦¦RIL8p ½½=ÿŠu ÷d;Œ ! ÿ;!¼±±q×®]÷ïßWVVVPPxúôiGVm-Bˆ¡¡!•î¯ýÒR~~>?‰ !ÁÁÁ .ôññ144¬©©!„,[¶ŒÃá¬]»öñãÇüKº€Ü“í0®««ã_2líÚµnnnsæÌ¡nvðC\ÑÖjiõêÕ]¥Mïß¿÷î’’ÒÛ·oùËmß¾ý—_~aº è"ÏŸ?gºÆÈvÇÇÇó/ ÷ìÙ3;;;êçÛ·oScM¾·oß677 †œðµ$kÔ¨Q»wï ¢nîÝ»wÔ¨QÔÏ}ûöݼyó”)S¸\î–-[zöìI_²BGGgÑ¢E]±¡¡ÁÑÑñÕ«W™™™²r%±;wjjjvö`üñǽ{÷Θ1cùòå4Öx<Þ•+Wìíí;¾JYYÙäÉ“õõõÏž=+ý«È_qìØ±=:tèÐçŸNGmR¨GL—À  ã}ûöQ§b)((ÔÕÕyyy 2„Zôí·ß.X°@]]½®®NGGçÝ»wË—/ŠŠÒÕÕ%„Lž+//¿}û¶¤k”‰¬ôgR›¨QãÒ¥K©›;Jù¬€øH‘‰9¤H«‘"E´Á±’’5S-µƒcI¬”gR{¨Q£««+ÿžÎއ bjjúìÙ³‹/ÒS£XÄ?@>í· SÆ EZ)"Ž©”’Ú·0I¬”gR›Z)"Œ'NœH¤ò%–ÔRd´ß‚NAƒ´hs¤HmpìèèØ£GŠŠŠ›7oJ¨F‰‘ìÁJm&µGpÔHéìØ‘J©'Nˆ0ܤ•¤"‹ýt¤E›#EŠhƒcEEE///"•3Õ’=X©Í¤6µ9j¤tvì8hÐ sssiK)  ŸÌõ[ÐYc BFŠÑÇÔ[Xzzº¸õI”ÄV:3©=í);R/±Tõ[’=@Šlõ[ „1H!#EŠhƒã¯¾úJ__¿²²òÆb×(1t,•IÇŽ“@}t2j¤tvì(m)%ñ¤ÈV¿"@ó>9R¤ˆ08VTTôöö&Ò4r¢é`©LÊÌÌ”’LjðQ#¥ScG+++ ‹çÏŸŸ?^B5ŠEâÈ'…s Ac`Þ'GŠÑÇÒ6SMÓÁJ[&µé“£FŠhƒci˜ é)Ò6’…0†up¤Haplooo``ðßÿþ·´´TÔ%†Öƒ•žLjOGF”N©~+++«¡¡AÜÅCÓRd¢ß‘!ŒažžžŸ)R† æààPUUÕñí+((HÏ_÷¥õ`¥'“ÚÔÁQ#¥ScG ++«/^ˆW£Xè;@>éï·@dc`ذaÃ6oÞÜñÇ'''[XXtjÔ[Xzz:Çë\q’FëÁJI&µ§¡¡ÁÕÕµ#£FJ\\ÜàÁƒ;ø`ê%f¶ß¢õ)RÞo8Æ ÿìììzõêõàÁi˜©¦•4dR{¸\n\\\ÇÿùçŸ2¤ƒ¦R*33óãÇ"Ô&´ EÊû-Âä¦Zîç÷¤!“ann>hР—/_ž;wŽéZè%Íýˆa ¬ =3Õ´bO& bIJ±¶ß’{c`[[Û>}úTWW_¿~éZèÅ’LÄÿ>>GîSŠÍý–¼B‹p8jHÁ†™j6d’ ccãaƽ}ûöÔ©SL×B/Öö[ò a ìÂÿëò=SÍϤ¼¼<¦kéj,I)Öö[ò a ì2|øpccã§OŸ^¹r…éZèEe’ÜÏ¢R*;;»®®ŽéZhÄž9–@ë°j¦Zî3IPß¾}?ÿüówïÞÉý¬KæXa ¬ÃŸ©njjbº±'“±$¥XÛoÉ%„1°ÎСCMLLþúë¯Ë—/3] ½X’I‚¨”ÊÉÉùðáӵЈÍý–üAQPPîSŠ%™$ÈÐÐÐÆÆæýû÷¹¹¹L×B/Öö[òa lD…ññãÇå{¦š=™$ˆ%)ÅÚ~Kþ Œ† bjjúìÙ³‹/2] ½X’I‚¨”ÊÍÍ}ÿþ=ӵЈÍý–œAK±$¥X’I‚z÷îmgg÷áÇœœ¦k¡K~“åÂXŠš©>qâDcc#ӵЈ=™$ˆUg°°ß’3c`©Aƒ™››ÿý÷ߘ©–W>>> yyyïÞ½cº±¹ß’'JLí¸¡¡A¾ÿ!›q¹\ñ7ÒÜÜÜØØHë(½¼¼6mÚ”’’òÅ_з—Žhll¤ï`Ç·lÙ²¼¼¼çÏŸkhhбb4? IDAT qÔ××777Óq캺º¶¶¶………ǧFÉŒ ïù<== =:~üxúöÒŸ\.‡ÃaºŠ®Ã!„„„„ìܹSäM$&&FEE™ššv|­€€€ÜÜ\EEE‘÷ Ò©¾¾þñãÇjjjbngéÒ¥{öìQRb¬_¦Ô××ß¹sÇÀÀ€éB:JWWWœ$åp8L¾ÓmÚ´ÉÃÃÁ€C† ‘Ô¦"""BCC%µ5öööL—ÐÕð™1ÃÆ C0 a À0„1ÃÆ C0 a À0„1ÃÆÐ>|xÿþ}¦ Fcè Ý»w1b„»»ûìÙ³ïÞ½Ët9Òa ]ACCcÁ‚%%%Æ óññ™5kÖ;w˜. @Z Œ¡ëhhhÌŸ?¿¤¤dĈ¾¾¾3gμuëÓE0a,‡ÍÌ̘®¢]êêêááá%%%_|ñÅ×_xóæM¦‹`’̇ñèÑ£Íþ¿!C†„……ýý÷ßbnóâÅ‹S§N4hÐ!C&Ožìã㓘˜(‘j%åÆ666¯_¿ns©“““ŸŸ_—ÔYjjjsçÎ---µ··ŸeÊ++«€€€çÏŸB &MšdeeekkõèÑ#jk>|ˆ‹‹1bDnnîêÕ«7lØŸŸ¯§§Çår !ÍÍÍ»vírqq±°°ðòòÊÍÍ¥Ö5j”™™YHHȰaÃ,--§L™Â?;IÈ"!eB“’’FŽiaaaccãááI-rwwŸ3g!ÄÅÅÅÌÌÌÜÜ|Ë–-Ô¢¬¬, ê¨kjjZ>Q"ßeTUUÃÂÂJJJœ§M›6mÚ´ÒÒÒ.®AvI¼íJè}(2Æ­¼yó†Ãá(**BfÍšåêêJY´hÑ;w&NœøèÑ£²²²œœœÙ³g744LŸ>}̘1§OŸž6mÚ»wï!ׯ_ýúõ‚ ÔÔÔ¨ ª««ÿòË/QQQ„¸¸¸øøxccãÀÀ@…¹s禤¤Bœ !...? jjj¾HH„˜˜˜mÛ¶™››:´¼¼üÁƒÔ¢   777BÈ´iÓBCCCCC©½B¬­­Ã¨¥­ˆP|g}üøÑÞÞ¾®®nذaþ?ssssss333SSSSSS“þýû÷ïßßØØ¸_¿~ýúõëÛ·¯‘‘‘‘‘‘©©éªU«^¾|yöìÙQ£F‰P;‰Ö¶×œ¡ ö‘ò믿ºººRí ““ÓŠ+„/BïËHï ÒI‰é$æßÿþwcccFF†³³s·nÝ!~~~êêêyyyC‡MJJ244¤éîî®­­íèèHéÞ½»““SfffJJÊ·ß~ûæÍBHïÞ½[nyàÀ„G>|8((héÒ¥„¦¦¦Ù³g'&&úùù988}ZSS“êâE ¤ }}}BHii©¹¹¹-ðx¼î«oß¾D¢ÅK Ç;qâD||<—Ëý׿þ5vìXfë‘iïG…4gBA!í#!ÄÆÆföìÙ‡.**"„())EFFZ[[ Y„ÞWœÞäŒÌ‡qffæÉ“' !ÉÉÉ}úô VPøßá;vì NÍݽ{·––—Ë ÔÑÑ ŒŒ?~¼³³³’’ReeeYYYXXXpp°¶¶öÊ•+cbb\]]UUU‹‹‹oܸáïïojjêé陘˜X\\lbbríÚµ²²²Å‹+++Ÿ9s†²wïÞ€€€^½zåååB²³³CCC…,RÆÀíììbccÏœ9Ó·oßÆÆÆŠŠŠ²²²üü|Bˆ!dÙ²eVVVOž<),,ôòòZ±bÅ‘#Gª«««ªª¨'DKKËÒÒr„ ¢Oë Çãñ233ããã•••øáê$GÇûQ!Í™FPHûH©¬¬455-))©ªªª®®>räHBBÂäÉ“uttÚ[„Þ€OæÃxÓ¦MÔ™M‡ÒÓÓ›1cÿÞßÿýáÇ„ÇB”••ííímmm}||¸\îŽ;RRRúôéãêêJêE™4iR¯^½’““322>~ühhh:oÞ|ø„ D+ž¦—ŒÇã>^AA!66vܸq­¢:E„~THs&¤Ò>Bòòò¨sšêëëËËË555©‘_{‹ÔÔÔÐû’.é}Aúq!!!!­fo:%111**ª¨¨ÈÔÔ´ãk¸»»{xxˆ¼_NC† ©¬¬lsðÄãñ²³³©IÔ%K–¸»» ‰á¥K—jiiáMê“ÆŒÃïÀôôôΞ=ËïGGMõ£eeåØÚÚB¨9Û£GÖÖÖš˜˜Ìš5‹jÎ!oß¾¥ÁçÏŸS ¿¿ÿ7ß|CÉÎÎÞ±cGyy9Õ>><,,ÌØØ˜’žžÿâÅ‹ÆÆFMMM›¨¨(KKKá‹!/^LNN.--¥zßqãÆÍ›7O]]½½ ©ãåp8‘‘‘cÇŽõõõýðჱ±ñ©S§„,^¼C¦ìܹsß¾}/_¾466vqqùî»ïôõõ[>ó”áÇS_R¡x ÿZÈ8{{ûóçÏSmLÐÕÕ'Iÿw+Â$¨Í0æñx¹¹¹6lhjjZ²d‰‡‡Ç'GÃcÖbaËü45È„¬]»vñâÅžžž˜”ha ]ÁØØ¸  €é*¤”¼ý.™ƒ0`€ac†!Œ†0`€ac†!Œ†¿ÀÒkûöí¿üò ÓU@Wã_û™=Æ ¥bcc#""˜®‚Bþùç'''‡sþüyþU,%+11QKK‹º!ƒ-Z”••µxñbꊜ]£¤¤äǤ®sÊ”¼¼¼ùóç<øèÑ£߸4 ¥®®î«¯¾úðáéS§úôéCë¾Þ½{§ªªª¨¨(òzôè!Áz¤Â¤”¦¦¦¦¦&ÓUBˆ““Ó™3gŠŠŠèØ…†††¦¦&ãר™:ujVVV^^^LLL—íTOOOYY™ÙcŸãñx{öì™7oM{‘3Œ…1MŸ½ÐAOOoäÈ‘ùùù™™™3fÌ`º±$“3¦[·n¥¥¥ÿýïû÷ïÏt9té‚~«®®nëÖ­&L „lÙ²eÖ¬YêêêtìHÎà«MâëëK9vìӅЫe&1]K—âr¹„´´4¦k¡×ĉ ‡¹ÿ~[[[===GGÇ]»vÑ´#9ƒ0èOOO• .È÷—.Ø“I‚èN))Ak¿U__¿eË–¨¨(…æææ¥K—þüóÏoÞ¼‘øŽä CtttœOœ8Át-ôbI& 5j”¶¶ö7*++™®…F´ö[¿ýöÛ!C†J…±¹¹ùèÑ£wîÜ)ñÉ„1@GQ3Õ©©©LB/–d’ öÌ ÐÔo}üø1))iñâÅ„*Œ !‹/Þ¹sç«W¯$»/ùƒ0è(j¦úÙ³gL×B#öd’ –Ì ÐÔo9rÄÜÜüóÏ?'-ÂØÄÄÄÍÍmûöíÜ‘\Bt”¶¶ö¨Q£šššX2S-÷s‚\\\tttnÞ¼YQQÁt-4¢£ßjllܼyó’%K¨›‡ÇãQ?GGGïÙ³çŸþ‘Ô¾ä X2SMeÒ­[·ä;“©¨¨xzz¼ÄŸøý÷ßûõëgggGÝäŒ !ýúõóòòÚºu«¤ö%—Æ0~üx.—{éÒ%ùž©fO& bU¿%©9€¦¦¦M›6EGGóïi92&„DEEíß¿ÿï¿ÿ_ò a Ð ZZZ£GnjjÊÈÈ`ºz±$“9RWW÷Î;åååL×B#Éö[ÇŽ300pppàßÓrdLéÓ§Ï×_ýÓO?‰¿/y…0è–¤K2I²²2Kf$õ›ÜÜÜœ@DÍ×*Œ !‹-:tèÐ_ý%æîä sÜÝݹ\îåË—kkk™®…FìÉ$A~~~„.©~+##C[[ÛÙÙ¹å‚aܳgOÿÍ›7‹³/9†0èœnݺ;¶¹¹YîgªY’I‚œœœºwïþçŸÞ½{—éZh$‘~‹Çãmܸ±Õ°˜´Æ„ˆˆˆßÿýÉ“'"ïNŽ!Œ:%3Õ,É$AJJJ,™¿ßzøð¡¶¶öرc[Ýßf÷èÑ#,,¬¦¦FäÝÉ1„1@§¹»»«ªªÊwÏžLÄ’Yñû­~ýúeee ÞßfB¢££mmmEÛ—|Ctš†††««+fªå˜ƒƒÃgŸ}vïÞ½[·n1] èë·Ú chÂ@,™©fI& RRR¢®È+÷“¦~«Õ÷Œá“Æ¢pssSSS»zõêãÇ™®…FìÉ$Aè·Ä‘qg!ŒD¡®®îêêÊãñÒÓÓ™®…^,É$A=zô¨¬¬,++cºÑÔo!Œ; a "–|žÊ’L¤¨¨èååEX0+@G¿…iêÎBˆhܸqêêêEEEòýU öd’ *¥äþÀéè·02î,„1€ˆÔÔÔÜÜÜØ3S-÷™$ÈÞÞ^__ÿþýûüñӵЈŽ~ aÜYcѱäóT–d’ EEEooo‚FDâý¸³Æ¢suuÕÐи~ýúÇ™®…FüL’û¶CKf$Þo!Œ; a :UUUwwwöÌTËýa úòË/{öìYUUURRÂt-4’øNàê,„1€X&NœHX0ddI& RPPðññ!,x‰%;€‘qg!ŒÄâêꪩ©YZZZUUÅt-4bO& ¢ú­ôôtùêI¶ßBwÂ@,\.wüøñl˜©fI& ²³³ëÝ»÷Çå{V@²ý¸³ÆâbÉ9Õ,É$Aü”:vìÓµÐK‚ý¸³Æâ=z´––Öüqÿþ}¦k¡{2I•Rò=+ Á~ aÜYcqQ3Õ„'³$“ÙÚÚöéÓ§ººº¸¸˜éZh$Á~ aÜYc `ÉL5K2I‡Ãaɬ€¤ú-|µ©³Æàâ⢭­]VVVYYÉt-4bO& ¢® "÷³’ê·02î,„1€p¹\‚?ÕÄ’LôùçŸ=zôèÚµkL×B#Iõ[wÂ@2X2SÍ’LÄO)¹‰%ÒoadÜYcÉpvvÖÑѹuëÖ½{÷˜®…FìÉ$ATJ¥§§ËwÌH¤ßBw–Ó´íÉ“'µµµLWÑ9ööö'OžÜ±cÇŒ3:µb÷îݹ\nii)M…IÖàÁƒ !G2e ‡Ãsk÷îÝ{÷îL;‡Ãéիד'O:D= !CÈgoo_]]œœ¬¢¢"Ú¦OŸ.ÂQ÷îÝ[___´Ê4!$$$dçÎ"o"111**ª¨¨ÈÔÔTr…Û-]º4--­GL]¤¶¶vîܹ .dºNÓÕÕ'I9FÆ ½CCC™®ºÈÆ™.1øÌ€ac†!Œ†0`€ac†!Œ†0`€ac†!Œ†0`€ac „ÀÀ@333¦«)))#GŽ´°°øâ‹//^ÜrQ›ÏaVV–………™™™™™Ùƒº°R%cɸxñâÔ©S 4dÈÉ“'ûøø$&&2]ÔÿqãÆ ›×¯_·¹ÔÉÉÉÏϯ‹Kê8áÅwÙ«««—/_®¯¯8tèÐâââ–KÛ|­­­CCC]]]%XÈ\Ï@222"##{öìéçç×ÐÐpîܹgÏž1]×ÿQ[[ûòåËׯ_kii . îú’:Nxñ]¶Á{÷î577'&&öë×Opi›Ï¡¡¡á¢E‹²³³óòò$UÈŒŒÄõáǸ¸¸#Fäææ®^½zÆ ùùùzzz\.—ÒÜܼk×. //¯ÜÜ\j­Q£F™™™…„„ 6ÌÒÒrÊ”)wîÜùä"BHAAÁ¤I“¬¬¬lmm£¢¢=zÄ_ÔØØ˜””DM¢ÚØØxxxDFFR‹ÜÝÝçÌ™Cqqq133377ß²e µ¨å‡B)CÈ«ìååEíèøñãS¦L±²² xþü9µô×_uuu¥ŠqrrZ±bE‹f!ŒÄuýúõׯ_/X°@MMºG]]ý—_~‰ŠŠ"„ÄÅÅÅÇÇ*((Ì;7%%…âììL)((pqq xüøqPPPSS“ðE999³gÏnhh˜>}ú˜1cNŸ>=mÚ´wïÞQû‰‰Ù¶m›¹¹95‰Z^^Îÿ2((ÈÍÍ2mÚ´ÐÐÐÐÐPj/„kkë°°0ji+"/\{´±±7nÿa¾¾¾-ëi¯ø°°0wwwBHaa¡§§ç°aömÛ¶sçN‘7(\ppp«µLMM?ù Ñ^Â_åY³fQ“Þ‹-ºsçÎĉ=zTVVF¹}ûöªU«>ûì³ÀÀÀI“&½ÿ¾ºººS%S0M ®7oÞBz÷îÝòÎB=ztøðá   ¥K—BšššfÏž˜˜èçççààpðàÁ}ûöÙÛÛB¬­­###Ÿ|¸ššÚöíÛ·nݪ¤ô¿ÿS+W®ÔÕÕõòò"„äçç0€ÂãñNŸ>­©©©««+Ú¾ŒŒŒÒÒÒøSâ|Tü”––š›› Ùõ‘jGôíÛ—H´øŽl_^}}}Ç‹¿rå 5c\XXÈåruttÄÜ`kU†W¹%‡ÓêžÊÊJSSÓ’’’ªªªêêê#GŽ$$$Lž<¹åÒ a .mmí•+WÆÄĸºº:::ªªª߸qÃßßßÔÔÔÓÓ311±¸¸ØÄÄäÚµkeee‹/VVV>sæ !dïÞ½½zõ¢NµÍÎÎ ²(<<<22rüøñÎÎÎJJJ•••eeeaaaÁÁÁ´³³‹=sæLß¾}+**ÊÊÊòóó©÷bBȲeˬ¬¬ž|¸¦¦æþýû„Ý»wkkk8ÐÃÃÚf›ey• !;vìøã?¨­iiiµ,#///!!:›¬¾¾¾¼¼\SS“š·)§H1bÕ¿‹æòå˹¹¹!!!zzz’+ ØîÔ©S\.×ÆÆ†éB:dàÀ#FŒ¨¨¨8wî\II‰ªªª¿¿dd¤²²²«««²²òÅ‹/_¾¬­­=cÆ BȺuë^½zuãÆ ƒ=z¬[·®±±ññãÇBYZZ0àæÍ›çÏŸ¿}û6‡Ãqppð÷÷§Þ‹ÝÜÜÞ¼ysñâÅK—.ݽ{WCC#$$„ÿp¹ÜüüüÂÂÂæææñãÇkhh,X° ??¿²²’RVVVTTT[[;eÊBˆÅ ¢ÚÛ !D___WW733óÒ¥K/^¼011ùûï¿õõõ©sšÚ+þþýû™™™>>>ùùù> Xºt©‚‚‚ÈRü¢E‹®_¿N=KÅÅÅ%%%#GŽìÓ§!DÈs¸`Á‚Ó§OSa|óæÍ¢¢¢¿ÿþ{Ò¤IB^”#Fy•/^\RRBm­¸¸øúõëÎÎÎT=*--½wï^qqñýû÷ ”˜˜H5%2áÒ¥Kššš_~ù%Ó…tZ||¼8IºjÕ*!$$$¤Õ‡’˜˜UTTÄ?±@|K—.ÕÒÒ>ÒÈËË›3gÎÙ³g;~H­7öìÙ“¢ ÑÕÕ'I9¾Ú²*333==²k×®?ÿü“érD‡ÏŒ@VmÞ¼™ú˜öðáÃVVVLW "„1ȪS§N1]€d`š€ac†!Œ†0`€ac†!Œ†0`€aø \ ½¶oßþË/¿0]t‘wïÞEGG3]3Æ ¥bcc#""˜®‚åååÞÞÞzzzJJòü0  ¸¸xÓ¦MüË÷²ÄÁƒ׬YãêêºuëV¦k¡ÑÓ§OG­¢¢réÒ%uuu‰lSSSS"Û‘9òüF2MSSS^ÿ[ 0 ¼¼üÞ½{...L—C£)S¦Ÿ>}zÖ¬YL×Ò¥Ö­[wþüy yý5&„ØÙÙ]¹r¥¤¤ÄÏÏérd>3`€¯¯/!䨱cm.mnnîÚrèâíí­  pêÔ©·oß2]K—êÙ³ç—_~YWW—ÝjÑ7Ú{Ýeõ›œššÊt!2a Àê-,33³¡¡çíÛ·×®]kkk+7ÑÅžLÔ*¥nÞ¼¹zõjggçââbFK“6Yå1®IDAT$Öö[‡0`€………¥¥å‹/Ο?÷îÝ 6|ñÅ ÿüó––ÓJ K2I···¢¢bee%Õ`999mÚ´©²²’bjjÊtuÃæ~K²ð™13|||>ûì³%K–TTT´¼¿ÿþL•Dooï¥K—R™”––Öò`å)“Z¹{÷nZZZ¿~ýþüóÏ?ÿü³ÕRFª¢‰¯¯ï¥K—RSS'MšD¹yófjjjzzzeeåܹsñYr!ŒºTEEEZZZjjêíÛ·Û|€<½S³*“!÷îÝKMMMMM½{÷®‡¡ßAc€®PYY™žžžššzóæMᔃˆba&ýóÏ?&Lh¯ÁjIEEÅÐа Jêlë·èƒ0è ÉÉÉÉÉÉy¤L¿±6“tuu¿ùæ›~øá“422RTTì‚’hÅÂ~‹nc€®¯¤¤´}ûöO>R¦ß¿Ø–I-ÍŸ?ŸÃá¬X±BøÃdºÙ",î·è†³©ºÈÚµkçÍ›÷ɇÉtBæÏŸ¿fÍšO>LÖ3©Mááák×®þY?pªßêÈ#å¯ß¢Â ë¬Y³&<<\È´µµ»wïÞeõÐdÞ¼yrŸIí™;wîºuë„<@|þüù«W¯þäÃäàH»Â K­^½úûï¿oo©Ü¼±!“Ú3gΜuëÖq8œ6—ÊúÌ… s] a ÐÕV­Zµ`Á‚6ÉÇ;5… ™Ô!Ç.7Åæ~‹cÄÅÅ-\¸Pð~9‹(6dR{ÂÂÂÖ¯_ßêØ•””ŒŒŒ˜*IâØÜoI€+W®¼F¤üE2©=¡¡¡ñññ-ÝÐÐPEE…Á’$ŽÍý–d!ŒóÃ?DFF¶¼G.ß¿ØIí þñÇùÇ.—ƒEfû-ÿ.ØKÀ÷Œ˜Ëáp¨›rÆ„àà`‡³xñbGä4“ÚÄáp¢££y<ž¼xhh¨‚‚Â’%K¨×—H®ßš6mZ¿~ý!#GŽ$„TVVþþûïü̘1Cü½H„1Ö/_Îáp6nܨ¡¡Ñ£G¦Ë¡ 2©=³gÏæp8QQQrü·šiê·úôé³~ýzBÈ¢E‹ø?´|À„ $²#Æ!Œ˜·lÙ2‡“••ÕÞ¹0ò ™Ôžï¾ûŽÃáôêÕ‹éBhDG¿Õ³gÏöîÙ²eË“'Oª««<Øò÷îÝ >|8‡ÃÑÖÖ~úô©¦¦¦••ÕìÙ³ ! ?ýôÓ_ýE©««óððpww—H©bBH…˜˜˜!C†0]íØIí™5kVss3ÓUÐKâýV«“*!‹/¦~ ¾¯Óêæææ}ûö]»v­††ÆÔ©S÷ìÙ£®®Îÿò¶mÛ¦NÚ§OêæöíÛ¯^½jgg'‘jÅ0r3á&2©= òά4ô[=zôÐÐÐ „ôêÕK]]´xæ³²²¨a1¥±±‘Ëå"Œ€ØIl&Íý–¾¾>õÙ³´Á 0©í·FŒñÛo¿1]E02éUVVvèС˜˜ ØØXêþ¸¸¸úúú‹/RkiiQ?TTTþë_ÿZ±bEMMMZZÚĉù?DDDìܹsÁ‚jjjúúúÎÎΖ––L!!a ÒlÈ!mN,ÇÅŵùx33³‹/R?ó¿‘ÌÿÃá„……I¾J±IéL{ Œ†0`€ac+ïß¿gº„NC€\‰ŒŒ «¬¬dºN@€\ijjjhh=zôœ9sd%’Æ o¾þúëêêêÁƒ?^&"a rHKKkùòå2Éc[²ÉcsÒÉc`iŽd„1°ˆtF2ÃWmúøñ£µµ5³5€<ár¹'Nþ*’###lgg÷óÏ?óÍ7]S^›ceeåsçÎ1[ȓŋwäaÙÙÙqqq\.wÏž=ÞÞÞtW%ÃaÌáp ˜­ä —Ëþ*†ß¼yííí­ Àü'¶ ‡1@—‘¦ Œ@þIm SÆ Ï¤<†)cO2Ä1È›+W®¬[·ŽÇãI SÆ Wx<^~~¾¬Ä0a r%44tĈ‡éB:a rÅÆÆ†é:M6Æïr a À0„1ÃÆ C0 a À0„1ÃÆ C0 a À0„1ÃÆ C0LbWm’Å«dH „±µµuHHˆøÛQNNNâ¬.0vuuuuu;ì„ÏŒ†0`€ac†!Œ†0`€ac†!Œ†0`€ac†!Œ†0`€ac†!Œ€Ýþff 4åÄ3IEND®B`‚mod_perl-2.0.9/docs/user/handlers/filters.pod0000644000177200010010000030042612540623200017744 0ustar SteveNone=head1 NAME Input and Output Filters =head1 Description This chapter discusses mod_perl's input and output filter handlers. If all you need is to lookup the filtering API proceed directly to the C> and C> manpages. =head1 Introducing Filters You certainly already know how filters work, because you encounter filters so often in real life. If you are unfortunate to live in smog-filled cities like Saigon or Bangkok you are probably used to wear a dust filter mask: =for html dust mask

If you are smoker, chances are that you smoke cigarettes with filters: =for html cigarrette filter

If you are a coffee gourmand, you have certainly tried a filter coffee: =for html coffee machine

The shower that you use, may have a water filter: =for html shower filter

When the sun is too bright, you protect your eyes by wearing sun goggles with UV filter: =for html sun goggles

If are a photographer you can't go a step without using filter lenses: =for html photo camera

If you love music, you might be unaware of it, but your super-modern audio system is literally loaded with various electronic filters: =for html LP player

There are many more places in our lives where filters are used. The purpose of all filters is to apply some transformation to what's coming into the filter, letting something different out of the filter. Certainly in some cases it's possible to modify the source itself, but that makes things unflexible, and but most of the time we have no control over the source. The advantage of using filters to modify something is that they can be replaced when requirements change Filters also can be stacked, which allows us to make each filter do simple transformations. For example by combining several different filters, we can apply multiple transformations. In certain situations combining several filters of the same kind let's us achieve a better quality output. The mod_perl filters are not any different, they receive some data, modify it and send it out. In the case of filtering the output of the response handler, we could certainly change the response handler's logic to do something different, since we control the response handler. But this may make the code unnecessary complex. If we can apply transformations to the response handler's output, it certainly gives us more flexibility and simplifies things. For example if a response needs to be compressed before sent out, it'd be very inconvenient and inefficient to code in the response handler itself. Using a filter for that purpose is a perfect solution. Similarly, in certain cases, using an input filter to transform the incoming request data is the most wise solution. Think of the same example of having the incoming data coming compressed. Just like with real life filters, you can pipe several filters to modify each other's output. You can also customize a selection of different filters at run time. Without much further ado, let's write a simple but useful obfuscation filter for our HTML documents. We are going to use a very simple obfuscation -- turn an HTML document into a one liner, which will make it harder to read its source without a special processing. To accomplish that we are going to remove characters \012 (C<\n>) and \015 (C<\r>), which depending on the platform alone or as a combination represent the end of line and a carriage return. And here is the filter handler code: #file:MyApache2/FilterObfuscate.pm #-------------------------------- package MyApache2::FilterObfuscate; use strict; use warnings; use Apache2::Filter (); use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => qw(OK); use constant BUFF_LEN => 1024; sub handler { my $f = shift; unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } while ($f->read(my $buffer, BUFF_LEN)) { $buffer =~ s/[\r\n]//g; $f->print($buffer); } return Apache2::Const::OK; } 1; The directives below configure Apache to apply the C filter to all requests that get mapped to files with an I<".html"> extension: PerlOutputFilterHandler MyApache2::FilterObfuscate Filters are expected to return C or C. But instead of receiving C<$r> (the request object) as the first argument, they receive C<$f> (the filter object). The filter object is described later in this chapter. The filter starts by unsetting the C response header, because it modifies the length of the response body (shrinks it). If the response handler sets the C header and the filter doesn't unset it, the client may have problems receiving the response since it will expect more data than it was sent. I below describes how to set the Content-Length header if you need to. The core of this filter is a read-modify-print expression in a while loop. The logic is very simple: read at most C characters of data into C<$buffer>, apply the regex to remove any occurences of C<\n> and C<\r> in it, and print the resulting data out. The input data may come from a response handler, or from an upstream filter. The output data goes to the next filter in the output chain. Even though in this example we haven't configured any more filters, internally Apache itself uses several core filters to manipulate the data and send it out to the client. As we are going to explain in detail in the following sections, the same filter may be called many times during a single request, every time receiving a subsequent chunk of data. For example if the POSTed request data is 64k long, an input filter could be invoked 8 times, each time receiving 8k of data. The same may happen during the response phase, where an upstream filter may split 64k of output in 8, 8k chunks. The while loop that we just saw is going to read each of these 8k in 8 calls, since it requests 1k on every C call. Since it's enough to unset the C header when the filter is called the first time, we need to have some flag telling us whether we have done the job. The method C provides this functionality: unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } The C call will be made only on the first filter call for each request. You can store any kind of a Perl data structure in Cctx|docs::2.0::api::Apache2::Filter/C_ctx_>> and retrieve it later in subsequent filter invocations of the same request. There are several examples using this method in the following sections. To be truly useful, the C filter logic should take into account situations where removing new line characters will make the document render incorrectly in the browser. As we mentioned above, this is the case if there are multi-line CpreE>...C/preE> entries. Since this increases the complexity of the filter, we will disregard this requirement for now. A positive side-effect of this obfuscation algorithm is that it reduces the amount of the data sent to the client. The C module, available from the CPAN, provides a production-ready implementation of this technique which takes into account the HTML markup specifics. mod_perl I/O filtering follows the Perl principle of making simple things easy and difficult things possible. You have seen that it's trivial to write simple filters. As you read through this chapter you will see that much more difficult things are possible, and that the code is more elaborate. =head1 I/O Filtering Concepts Before introducing the APIs, mod_perl provides for Apache Filtering, there are several important concepts to understand. =head2 Two Methods for Manipulating Data mod_perl provides two interfaces to filtering: a direct bucket brigades manipulation interface and a simpler, stream-oriented interface. Apache 2.0 considers all incoming and outgoing data as chunks of information, disregarding their kind and source or storage methods. These data chunks are stored in I, which form L. Input and output filters massage the data in these I. Response and protocol handlers also receive and send data using bucket brigades, though in most cases this is hidden behind wrappers, such as C and C. mod_perl 2.0 filters can directly manipulate the bucket brigades or use the simplified streaming interface where the filter object acts similar to a filehandle, which can be read from and printed to. Even though you don't use bucket brigades directly when you use the streaming filter interface (which works on bucket brigades behind the scenes), it's still important to understand bucket brigades. For example you need to know that an output filter will be invoked as many times as the number of bucket brigades sent from an upstream filter or a content handler. Or you need to know that the end of stream indicator (EOS) is sometimes sent in a separate bucket brigade, so it shouldn't be a surprise that the filter was invoked even though no real data went through. As we delve into the filter details you will see that L, will help to understand how filters work. Moreover you will need to understand bucket brigades if you plan to implement L. =head2 HTTP Request Versus Connection Filters HTTP request filters are applied when Apache serves an HTTP request. HTTP request input filters get invoked on the body of the HTTP request only if the body is consumed by the content handler. HTTP request headers are not passed through the HTTP request input filters. HTTP response output filters get invoked on the body of the HTTP response if the content handler has generated one. HTTP response headers are not passed through the HTTP response output filters. It is also possible to apply filters at the connection level. A connection may be configured to serve one or more HTTP requests, or handle other protocols. Connection filters see all the incoming and outgoing data. If an HTTP request is served, connection filters can modify the HTTP headers and the body of request and response. If a different protocol is served over the connection (e.g., IMAP), the data could have a completely different pattern than the HTTP protocol (headers + body). Thus, the only difference between connection filters and request filters is that connection filters see everything from the request, i.e., the headers and the body, whereas request filters see only the body. mod_perl 2.0 may support several other Apache filter types in the future. =head2 Multiple Invocations of Filter Handlers Unlike other Apache handlers, filter handlers may get invoked more than once during the same request. Filters get invoked as many times as the number of bucket brigades sent from an upstream filter or a content provider. For example, a content generation handler may send a string, then force a flush, and then send more data: # assuming buffered STDOUT ($|==0) $r->print("foo"); $r->rflush; $r->print("bar"); In this case, Apache will generate one bucket brigade with two buckets. There are several types of buckets which contain data; in this example, the data type is I: bucket type data ---------------------- 1st transient foo 2nd flush Apache sends this bucket brigade to the filter chain. Then, assuming no more data is sent after C, it will create a last bucket brigade, with one bucket, containing data: bucket type data ---------------------- 1st transient bar and send it to the filter chain. Finally it will send yet another bucket brigade with the EOS bucket indicating that there will be no more data sent: bucket type data ---------------------- 1st eos N available on the CPAN.> Note that the EOS bucket may come attached to the last bucket brigade with data, instead of coming in its own bucket brigade. The location depends on the other Apache modules manipulating the buckets and can vary. Filters should never assume that the EOS bucket is arriving alone in a bucket brigade. Therefore the first output filter will be invoked two or three times (three times if EOS is coming in its own brigade), depending on the number of bucket brigades sent by the response handler. An upstream filter can modify the bucket brigades, by inserting extra bucket brigades or even by collecting the data from multiple bucket brigades and sending it along in just one brigade. Therefore, when coding a filter, never assume that the filter is always going to be invoked once, or any fixed number of times. Neither can you assume how the data is going to come in. To accommodate these situations, a typical filter handler may need to split its logic in three parts. To illustrate, below is some pseudo-code that represents all three parts, i.e., initialization, processing, and finalization. This is a typical stream-oriented filter handler. sub handler { my $f = shift; # runs on first invocation unless ($f->ctx) { init($f); $f->ctx(1); } # runs on all invocations process($f); # runs on the last invocation if ($f->seen_eos) { finalize($f); } return Apache2::Const::OK; } sub init { ... } sub process { ... } sub finalize { ... } The following diagram depicts all three parts: =for html filter flow logic

Let's explain each part using this pseudo-filter. =over =item 1 Initialization During initialization, the filter runs code that you want executed only once, even if there are multiple invocations of the filter (this is during a single request). The filter context ($f-Ectx) is used as a flag to accomplish this task. For each new request the filter context is created before the filter is called for the first time, and it is destroyed at the end of the request. unless ($f->ctx) { init($f); $f->ctx(1); } When the filter is invoked for the first time Cctx|docs::2.0::api::Apache2::Filter/C_ctx_>> returns C and the custom function init() is called. This function could, for example, retrieve some configuration data set in I or initialize some data structure to a default value. To make sure that init() won't be called on the following invocations, we must set the filter context before the first invocation is completed: $f->ctx(1); In practice, the context is not just used as a flag, but to store real data. You can use it to hold any data structure and pass it between successive filter invocations. For example, the following filter handler counts the number of times it was invoked during a single request: sub handler { my $f = shift; my $ctx = $f->ctx; $ctx->{invoked}++; $f->ctx($ctx); warn "filter was invoked $ctx->{invoked} times\n"; return Apache2::Const::DECLINED; } Since this filter handler doesn't consume the data from the upstream filter, it's important that this handler return C, in which case mod_perl passes the current bucket brigade to the next filter. If this handler returns C, the data will be lost, and if that data included a special EOS token, this may cause problems. Unsetting the C header for filters that modify the response body length is a good example of code to run in the initialization phase: unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } We will see more initialization examples later in this chapter. =item 2 Processing The next part: process($f); is unconditionally invoked on every filter invocation. That's where the incoming data is read, modified and sent out to the next filter in the filter chain. Here is an example that lowers the case of the characters passing through: use constant READ_SIZE => 1024; sub process { my $f = shift; while ($f->read(my $data, READ_SIZE)) { $f->print(lc $data); } } Here the filter operates only on a single bucket brigade. Since it manipulates every character separately the logic is simple. In more complicated situations, a filter may need to buffer data before the transformation can be applied. For example, if the filter operates on HTML tokens (e.g., 'Eimg src="me.jpg"E'), it's possible that one brigade will include the beginning of the token ('Eimg ') and the remainder of the token ('src="me.jpg"E') will come in the next bucket brigade (on the next filter invocation). To operate on the token as a whole, you would need to capture each piece over several invocations. To do so, you can store the unprocessed data in the filter context and then access it again on the next invocation. Another good example of the need to buffer data is a filter that performs data compression, because compression is usually effective only when applied to relatively big chunks of data. If a single bucket brigade doesn't contain enough data, the filter may need to buffer the data in the filter context until it collects enough to compress it. =item 3 Finalization Finally, some filters need to know when they are invoked for the last time, in order to perform various cleanups and/or flush any remaining data. As mentioned earlier, Apache indicates this event by a special end of stream "token", represented by a bucket of type C. If the filter is using the streaming interface, rather than manipulating the bucket brigades directly, and it was calling C in a while loop, it can check for the EOS token using the C<$f-Eseen_eos> method: if ($f->seen_eos) { finalize($f); } This check should be done at the end of the filter handler because the EOS token can come attached to the tail of some data or all alone such that the last invocation gets only the EOS token. If this test is performed at the beginning of the handler and the EOS bucket was sent in together with the data, the EOS event may be missed and the filter won't function properly. Filters that directly manipulate bucket brigades must manually look for a bucket whose type is C. There are examples of this method later in the chapter. =back While not all filters need to perform all of these steps, this is a good model to keep in mind while working on your filter handlers. Since filters are called multiple times per request, you will likely use these steps, with initialization, processing, and finishing, on all but the simplest filters. =head2 Blocking Calls All filters (excluding the core filter that reads from the network and the core filter that writes to it) block at least once when invoked. Depending on whether this is an input or an output filter, the blocking happens when the bucket brigade is requested from the upstream filter or when the bucket brigade is passed to the downstream filter. Input and output filters differ in the ways they acquire the bucket brigades, and thus in how blocking is handled. Each type is described separately below. Although you can't see the difference when using the streaming API, it's important to understand how things work underneath. Therefore the examples below are transparent filters, passing data through them unmodified. Instead of reading the data in and printing it out, the bucket brigades are passed as is. This makes it easier to observe the blocking behavior. The first example is a transparent input filter: #file:MyApache2/FilterTransparent.pm (first part) #----------------------------------------------- package MyApache2::FilterTransparent; use Apache2::Filter (); use Apache2::Const -compile => qw(OK); use APR::Const -compile => ':common'; sub in { my ($f, $bb, $mode, $block, $readbytes) = @_; my $rv = $f->next->get_brigade($bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; return Apache2::Const::OK; } When the input filter I is invoked, it first asks the upstream filter for the next bucket brigade (using the C call). That upstream filter is in turn going to ask for the bucket brigade from the next upstream filter and so on up the chain, until the last filter (called C), the one that reads from the network, is reached. The C filter reads, using a socket, a portion of the incoming data from the network, processes it, and sends it to its downstream filter. That filter processes the data and send it to its downstream filter, etc., until it reaches the first filter that requested the data. (In reality some other handler triggers the request for the bucket brigade, such as an HTTP response handler or a protocol module, but for this discussion it's sufficient to assume that it's the first filter that issues the C call.) The following diagram depicts a typical input filter data flow in addition to the program control flow. =for html input filter data flow

The black- and white-headed arrows show when the control is passed from one filter to another. In addition, the black-headed arrows show the actual data flow. The diagram includes some pseudo-code, in Perl for the mod_perl filters and in C for the internal Apache filters. You don't have to understand C to understand this diagram. What's important to understand is that when input filters are invoked, they first call each other via the C call and then block (notice the brick wall on the diagram), waiting for the call to return. When this call returns, all upstream filters have already completed their filtering task on the bucket brigade. As mentioned earlier, the streaming interface hides the details, but the first C<$f-Eread()> call will block as the layer under it performs the C call. The diagram shows only part of the actual input filter chain for an HTTP request. The C<...> indicates that there are more filters in between the mod_perl filter and C. Now let's look at what happens in the output filters chain. Here the first filter acquires the bucket brigades containing the response data from the content handler (or another protocol handler if we aren't talking HTTP). It may then make some modification and pass the data to the next filter (using the C call), which in turn applies its modifications and sends the bucket brigade to the next filter, etc. This continues all the way down to the last filter (called C) which writes the data to the network via the socket the client is listening to. Even though the output filters don't have to wait to acquire the bucket brigade (since the upstream filter passes it to them as an argument), they still block in a similar fashion to input filters, since they have to wait for the C call to return. In this case, they are waiting to pass the data along rather than waiting to receive it. Here is an example of a transparent output filter: #file:MyApache2/FilterTransparent.pm (continued) #----------------------------------------------- sub out { my ($f, $bb) = @_; my $rv = $f->next->pass_brigade($bb); return $rv unless $rv == APR::Const::SUCCESS; return Apache2::Const::OK; } 1; The I filter passes C<$bb> to the downstream filter unmodified. If you add print statements before and after the C call and configure the same filter twice, the print will show the blocking call. The following diagram depicts a typical output filter data flow in addition to the program control flow: =for html output filter data flow

Similar to the input filters chain diagram, the arrows show the program control flow and in addition the black-headed arrows show the data flow. Again, it uses Perl pseudo-code for the mod_perl filter and C pseudo-code for the Apache filters and the brick walls represent the waiting. The diagram shows only part of the real HTTP response filters chain, where C<...> stands for the omitted filters. =head1 mod_perl Filters Declaration and Configuration Now that we have laid out some basic concepts involved in filter use, we can look at how mod_perl filters are declared and configured. =head2 Filter Priority Types When Apache filters are configured they are inserted into the filters chain according to their priority type. In most cases when using one or two filters things will just work, however if you find that the order of filter invocation is wrong, you should consider the filter priority type. Unfortunately this information is available only in the Apache source code, unless it's documented in the module man pages. Numerical definitions of priority types, such as C and C, can be found in the Apache source distribution in I. As of this writing Apache comes with two core filters: C and C. Regardless of your configuration directives, e.g.,: SetOutputFilter DEFLATE SetOutputFilter INCLUDES the C filter will be inserted in the filters chain before the C filter, even though it was configured after it. This is because the C filter is of type C (20), whereas the C filter is of type C (10). As of this writing mod_perl provides two kind of filters with fixed priority type (the type is defined by L): Handler's Attribute Priority Value ------------------------------------------------- FilterRequestHandler AP_FTYPE_RESOURCE 10 FilterConnectionHandler AP_FTYPE_PROTOCOL 30 Therefore C filters (10) will always be invoked before the C filter (20), whereas C filters (30) will be invoked after it. When two filters have the same priority (e.g., the C filter (10) has the same priority as C filters (10)), they are run in the order they are configured. Therefore filters are inserted according to the configuration order when C> or C> are used. =head2 C The C directive registers a filter, and inserts it into the L input filters chain. This handler is of type C>. The handler's configuration scope is C>. B C handlers are passed two arguments: an C> object; and an C> object; See the examples that follow in this chapter for further explanation. B Filters are expected to return C> or C>. See the examples that follow in this chapter for further explanation. B C handlers are automatically C>ed, since they need to be compiled before L can be accessed. Therefore if the filter handler subroutine is not called C, you must preload the module containing the filter subroutine at server startup. A filter handler can be configured not to be C>ed, using the C<-> prefix. For example: PerlInputFilterHandler -MyApache2::FilterTest::lc The following sections include several examples that use the C handler. =head2 C The C directive registers a filter, and inserts it into the L output filters chain. This handler is of type C>. The handler's configuration scope is C>. B C handlers are passed five arguments: an C> object; an C> object; an C> constant; an C> constant; and the number of bytes to read. See the examples that follow in this chapter for further explanation. B B The following sections include several examples that use the C handler. Similar to C>, C handlers are automatically C>ed. =head2 C The C directive, documented at I, sets the filter or filters which will process client requests and POST input when they are received by the server (in addition to any filters configured earlier). To mix mod_perl and non-mod_perl input filters of the L nothing special should be done. For example if we have an imaginary Apache filter C and mod_perl filter C, this configuration: SetInputFilter FILTER_FOO PerlInputFilterHandler MyApache2::FilterInputFoo will add both filters. However the order of their invocation might not be as you expect. To make the invocation order the same as the insertion order, replace C with C, like so: PerlSetInputFilter FILTER_FOO PerlInputFilterHandler MyApache2::FilterInputFoo Now the C filter will always be executed before the C filter, since it was configured before C (i.e., it'll apply its transformations on the incoming data last). The diagram below shows the input filters chain and the data flow from the network to the response handler for the presented configuration: response handler /\ || FILTER_FOO /\ || MyApache2::FilterInputFoo /\ || core input filters /\ || network As explained in the section L this directive won't affect filters of different priority. For example assuming that C is a C filter, the configurations: PerlInputFilterHandler MyApache2::FilterInputFoo PerlSetInputFilter DEFLATE and PerlSetInputFilter DEFLATE PerlInputFilterHandler MyApache2::FilterInputFoo are equivalent, because mod_deflate's C filter has a higher priority than C. Thefore, it will always be inserted into the filter chain after C, (i.e. the C filter will apply its transformations on the incoming data first). The diagram below shows the input filters chain and the data flow from the network to the response handler for the presented configuration: response handler /\ || MyApache2::FilterInputFoo /\ || DEFLATE /\ || core input filters /\ || network C's C<;> semantics are supported as well. For example, in the following configuration: PerlInputFilterHandler MyApache2::FilterInputFoo PerlSetInputFilter FILTER_FOO;FILTER_BAR C will be executed first, followed by C and finally by C (again, assuming that all three filters have the same priority). =head2 C The C directive, documented at I sets the filters which will process responses from the server before they are sent to the client (in addition to any filters configured earlier). To mix mod_perl and non-mod_perl output filters of the L nothing special should be done. This configuration: SetOutputFilter INCLUDES PerlOutputFilterHandler MyApache2::FilterOutputFoo As with input filters, to preserve the insertion order replace C with C, like so: PerlSetOutputFilter INCLUDES PerlOutputFilterHandler MyApache2::FilterOutputFoo Now mod_include's C filter will always be executed before the C filter. The diagram below shows the output filters chain and the data flow from the response handler to the network for the presented configuration: response handler || \/ INCLUDES || \/ MyApache2::FilterOutputFoo || \/ core output filters || \/ network C's C<;> semantics are supported as well. For example, in the following configuration: PerlOutputFilterHandler MyApache2::FilterOutputFoo PerlSetOutputFilter INCLUDES;FILTER_FOO C will be executed first, followed by C and finally by C (again, assuming that all three filters have the same priority). As explained in the C> section, if filters have different priorities, the insertion order might be different. For example in the following configuration: PerlSetOutputFilter DEFLATE PerlSetOutputFilter INCLUDES PerlOutputFilterHandler MyApache2::FilterOutputFoo mod_include's C filter will be always executed before the C filter. The latter will be followed by mod_deflate's C filter, even though it was configured before the other two filters. This is because it has a L. And the corresponding diagram looks like so: response handler || \/ INCLUDES || \/ MyApache2::FilterOutputFoo || \/ DEFLATE || \/ core output filters || \/ network =head2 Adding OutputFilters Dynamically If you have the need to add output filters dymically during the request, mod_perl 2.0 offers you the possibility to push filter callbacks at request time. For example here is how to add an output filter during the Fixup phase: PerlFixupHandler MyApache2::AddFilterDyn And the corresponding module is: #file:MyApache2/AddFilterDyn.pm #------------------------------ package MyApache2::AddFilterDyn; use Apache2::Filter; use MyApache2::FilterObfuscate; use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; $r->add_output_filter(\&MyApache2::FilterObfuscate::handler); return Apache2::Const::OK; } 1; You can also add connection filters dynamically. For more information refer to the C> manpages C> and C>. =head2 HTTP Request vs. Connection Filters mod_perl 2.0 supports connection and HTTP request filtering. mod_perl filter handlers specify the type of the filter using the method attributes. HTTP request filter handlers are declared using the C attribute. Consider the following request input and output filters skeleton: package MyApache2::FilterRequestFoo; use base qw(Apache2::Filter); sub input : FilterRequestHandler { my ($f, $bb, $mode, $block, $readbytes) = @_; #... } sub output : FilterRequestHandler { my ($f, $bb) = @_; #... } 1; If the attribute is not specified, the default C attribute is assumed. Filters specifying subroutine attributes must subclass C, others only need to: use Apache2::Filter (); Request filters are usually configured in the CLocationE> or equivalent sections: PerlModule MyApache2::FilterRequestFoo PerlModule MyApache2::NiceResponse SetHandler modperl PerlResponseHandler MyApache2::NiceResponse PerlInputFilterHandler MyApache2::FilterRequestFoo::input PerlOutputFilterHandler MyApache2::FilterRequestFoo::output Now we have the request input and output filters configured. The connection filter handler uses the C attribute. Here is a similar example for the connection input and output filters. package MyApache2::FilterConnectionBar; use base qw(Apache2::Filter); sub input : FilterConnectionHandler { my ($f, $bb, $mode, $block, $readbytes) = @_; #... } sub output : FilterConnectionHandler { my ($f, $bb) = @_; #... } 1; With connection filters, unlike the request flters, the configuration must be done outside the CLocationE> or equivalent sections, usually within the CVirtualHostE> or the global server configuration: Listen 8005 PerlModule MyApache2::FilterConnectionBar PerlModule MyApache2::NiceResponse PerlInputFilterHandler MyApache2::FilterConnectionBar::input PerlOutputFilterHandler MyApache2::FilterConnectionBar::output SetHandler modperl PerlResponseHandler MyApache2::NiceResponse This configures the connection input and output filters. As can be seen from the above examples, the only difference between connection filters and request filters is that that connection filters see everything from the request, i.e., the headers and the body, whereas request filters see only the body. =head2 Filter Initialization Phase There is one more callback in the filter framework. And that's C. This I callback runs immediately after the filter handler is inserted into the filter chain, before it is invoked for the first time. Here is a skeleton of an init handler: sub init : FilterInitHandler { my $f = shift; #... return Apache2::Const::OK; } The attribute C marks the Perl function as suitable to be used as a filter initialization callback. For example you may decide to dynamically remove a filter before it had a chance to run, if some condition is true: sub init : FilterInitHandler { my $f = shift; $f->remove() if should_remove_filter(); return Apache2::Const::OK; } Not all C methods can be used in the init handler, because it's not a filter. Hence you can use methods that L, such as C> and C> or retrieve request information, such as C> and C>. You cannot use methods that operate on data, such as C> and C>. In order to hook an init filter handler, the real filter has to assign this callback using the C function which accepts a reference to the callback function, similar to C. The callback function referred to must have the C attribute. For example: package MyApache2::FilterBar; use base qw(Apache2::Filter); sub init : FilterInitHandler { ... } sub filter : FilterRequestHandler FilterHasInitHandler(\&init) { my ($f, $bb) = @_; # ... return Apache2::Const::OK; } While attributes are parsed during compilation (it's really a sort of source filter), the argument to the C attribute is compiled at a later stage once the module is compiled. The argument to C can be any Perl code which when C'ed returns a code reference. For example: package MyApache2::OtherFilter; use base qw(Apache2::Filter); sub init : FilterInitHandler { ... } package MyApache2::FilterBar; use MyApache2::OtherFilter; use base qw(Apache2::Filter); sub get_pre_handler { \&MyApache2::OtherFilter::init } sub filter : FilterHasInitHandler(get_pre_handler()) { ... } Here the C handler is configured to run the C init handler. Notice that the argument to C is always C'ed in the package of the real filter handler (not the init handler). So the above code leads to the following evaluation: $init_sub = eval "package MyApache2::FilterBar; get_pre_handler()"; This part is actually done in C, using the C C call. Currently only one initialization callback can be registered per filter handler. =head1 All-in-One Filter Before we delve into the details of how to write filters that do something with the data, lets first write a simple filter that does nothing but snooping on the data that goes through it. We are going to develop the C handler which can snoop on request and connection filters, in input and output modes. First we create a simple response handler that dumps the request's I and I as strings: #file:MyApache2/Dump.pm #--------------------- package MyApache2::Dump; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => qw(OK M_POST); sub handler { my $r = shift; $r->content_type('text/plain'); $r->print("args:\n", $r->args, "\n"); if ($r->method_number == Apache2::Const::M_POST) { my $data = content($r); $r->print("content:\n$data\n"); } return Apache2::Const::OK; } use Apache2::Connection (); use Apache2::Const -compile => qw(MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub content { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->remove; # optimization to reuse memory } } while (!$seen_eos); $bb->destroy; return $data; } 1; which is configured as: PerlModule MyApache2::Dump SetHandler modperl PerlResponseHandler MyApache2::Dump If we issue the following request: % echo "mod_perl rules" | POST 'http://localhost:8002/dump?foo=1&bar=2' the response will be: args: foo=1&bar=2 content: mod_perl rules As you can see it simply dumped the query string and the posted data. Now let's write the snooping filter: #file:MyApache2/FilterSnoop.pm #---------------------------- package MyApache2::FilterSnoop; use strict; use warnings; use base qw(Apache2::Filter); use Apache2::FilterRec (); use APR::Brigade (); use APR::Bucket (); use APR::BucketType (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => ':common'; sub connection : FilterConnectionHandler { snoop("connection", @_) } sub request : FilterRequestHandler { snoop("request", @_) } sub snoop { my $type = shift; my ($f, $bb, $mode, $block, $readbytes) = @_; # filter args # $mode, $block, $readbytes are passed only for input filters my $stream = defined $mode ? "input" : "output"; # read the data and pass-through the bucket brigades unchanged if (defined $mode) { # input filter my $rv = $f->next->get_brigade($bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; bb_dump($type, $stream, $bb); } else { # output filter bb_dump($type, $stream, $bb); my $rv = $f->next->pass_brigade($bb); return $rv unless $rv == APR::Const::SUCCESS; } return Apache2::Const::OK; } sub bb_dump { my ($type, $stream, $bb) = @_; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $b->read(my $bdata); push @data, $b->type->name, $bdata; } # send the sniffed info to STDERR so not to interfere with normal # output my $direction = $stream eq 'output' ? ">>>" : "<<<"; print STDERR "\n$direction $type $stream filter\n"; my $c = 1; while (my ($btype, $data) = splice @data, 0, 2) { print STDERR " o bucket $c: $btype\n"; print STDERR "[$data]\n"; $c++; } } 1; Recall that there are two types of two filter handlers, one for connection and another for request filtering: sub connection : FilterConnectionHandler { snoop("connection", @_) } sub request : FilterRequestHandler { snoop("request", @_) } Both handlers forward their arguments to the C function, which does the real work. These two subroutines are added in order to assign the two different attributes. In addition, the functions pass the filter type to C as the first argument, which gets shifted off C<@_>. The rest of C<@_> are the arguments that were originally passed to the filter handler. It's easy to know whether a filter handler is running in the input or the output mode. Although the arguments C<$f> and C<$bb> are always passed, the arguments C<$mode>, C<$block>, and C<$readbytes> are passed only to input filter handlers. If we are in input mode, in the same call we retrieve the bucket brigade from the previous filter on the input filters stack and immediately link it to the C<$bb> variable which makes the bucket brigade available to the next input filter when the filter handler returns. If we forget to perform this linking our filter will become a black hole into which data simply disappears. Next we call C which dumps the type of the filter and the contents of the bucket brigade to C, without influencing the normal data flow. If we are in output mode, the C<$bb> variable already points to the current bucket brigade. Therefore we can read the contents of the brigade right away, and then we pass the brigade to the next filter. Let's snoop on connection and request filter levels in both directions by applying the following configuration: Listen 8008 PerlModule MyApache2::FilterSnoop PerlModule MyApache2::Dump # Connection filters PerlInputFilterHandler MyApache2::FilterSnoop::connection PerlOutputFilterHandler MyApache2::FilterSnoop::connection SetHandler modperl PerlResponseHandler MyApache2::Dump # Request filters PerlInputFilterHandler MyApache2::FilterSnoop::request PerlOutputFilterHandler MyApache2::FilterSnoop::request Notice that we use a virtual host because we want to install connection filters. If we issue the following request: % echo "mod_perl rules" | POST 'http://localhost:8008/dump?foo=1&bar=2' we get the same response as before we installed C because our snooping filter didn't change anything. The output didn't change, but there was some new information printed to the I. We present it all here, in order to understand how filters work. First we can see the connection input filter at work, as it processes the HTTP headers. We can see that for this request each header is put into a separate brigade with a single bucket. The data is conveniently enclosed by C<[]> so you can see the new line characters as well. <<< connection input filter o bucket 1: HEAP [POST /dump?foo=1&bar=2 HTTP/1.1 ] <<< connection input filter o bucket 1: HEAP [TE: deflate,gzip;q=0.3 ] <<< connection input filter o bucket 1: HEAP [Connection: TE, close ] <<< connection input filter o bucket 1: HEAP [Host: localhost:8008 ] <<< connection input filter o bucket 1: HEAP [User-Agent: lwp-request/2.01 ] <<< connection input filter o bucket 1: HEAP [Content-Length: 14 ] <<< connection input filter o bucket 1: HEAP [Content-Type: application/x-www-form-urlencoded ] <<< connection input filter o bucket 1: HEAP [ ] Here the HTTP header has been terminated by a double new line. So far all the buckets were of the I type, meaning that they were allocated from the heap memory. Notice that the HTTP request input filters will never see the bucket brigades with HTTP headers because they are consumed by the last core connection filter. The following two entries are generated when C reads the POSTed content: <<< connection input filter o bucket 1: HEAP [mod_perl rules] <<< request input filter o bucket 1: HEAP [mod_perl rules] o bucket 2: EOS [] As shown earlier, the connection input filter is run before the request input filter. Since our connection input filter was passing the data through unmodified and no other custom connection input filter was configured, the request input filter sees the same data. The last bucket in the brigade received by the request input filter is of type I, meaning that all the input data from the current request has been received. Next we can see that C has generated its response. However we can see that only the request output filter gets run at this point: >>> request output filter o bucket 1: TRANSIENT [args: foo=1&bar=2 content: mod_perl rules ] This happens because Apache hasn't yet sent the response HTTP headers to the client. The request filter sees a bucket brigade with a single bucket of type I which is allocated from the stack memory. The moment the first bucket brigade of the response body has entered the connection output filters, Apache injects a bucket brigade with the HTTP headers. Therefore we can see that the connection output filter is filtering the brigade with HTTP headers (notice that the request output filters don't see it): >>> connection output filter o bucket 1: HEAP [HTTP/1.1 200 OK Date: Tue, 07 Mar 2006 10:59:08 GMT Server: Apache/2.0.55 (Unix) mod_perl/2.000002 Perl/v5.8.4 mod_ssl/2.0.55 OpenSSL/0.9.7c DAV/2 Connection: close Transfer-Encoding: chunked Content-Type: text/plain; charset=ISO-8859-1 ] This is followed by the first response body's brigade: >>> connection output filter o bucket 1: TRANSIENT [2b ] o bucket 2: TRANSIENT [args: foo=1&bar=2 content: mod_perl rules ] o bucket 3: IMMORTAL [ ] If the response is large, the request and connection filters will filter chunks of the response one by one. These chunks are typically 8k in size, but this size can vary. Finally, Apache sends a series of bucket brigades to finish off the response, including the end of stream meta-bucket to tell filters that they shouldn't expect any more data, and flush buckets to flush the data, to make sure that any buffered output is sent to the client: >>> connection output filter o bucket 1: IMMORTAL [0 ] o bucket 2: EOS [] >>> connection output filter o bucket 1: FLUSH [] >>> connection output filter o bucket 1: FLUSH [] This module helps to illustrate that each filter handler can be called many times during each request and connection. It is called for each bucket brigade. Also it is important to mention that HTTP request input filters are invoked only if there is some POSTed data to read and it's consumed by a content handler. =head1 Input Filters mod_perl supports L and L input filters. In the following sections we will look at each of these in turn. =head2 Connection Input Filters Let's say that we want to test how our handlers behave when they are requested as C requests, rather than C requests. We can alter the request headers at the incoming connection level with the alteration transparent to all handlers. This example's filter handler looks for data like: GET /perl/test.pl HTTP/1.1 and turns it into: HEAD /perl/test.pl HTTP/1.1 The following input filter handler does that by directly manipulating the bucket brigades: #file:MyApache2/InputFilterGET2HEAD.pm #----------------------------------- package MyApache2::InputFilterGET2HEAD; use strict; use warnings; use base qw(Apache2::Filter); use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => ':common'; sub handler : FilterConnectionHandler { my ($f, $bb, $mode, $block, $readbytes) = @_; return Apache2::Const::DECLINED if $f->ctx; my $rv = $f->next->get_brigade($bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $b->read(my $data); warn("data: $data\n"); if ($data and $data =~ s|^GET|HEAD|) { my $nb = APR::Bucket->new($bb->bucket_alloc, $data); $b->insert_after($nb); $b->remove; # no longer needed $f->ctx(1); # flag that that we have done the job last; } } return Apache2::Const::OK; } 1; The filter handler is called for each bucket brigade, which then includes buckets with data. The gist of any input filter handler is to request the bucket brigade from the upstream filter, and return it to the downstream filter using the second argument C<$bb>. It's important to remember that you can call methods on this argument, but you shouldn't assign to this argument, or the chain will be broken. There are two techniques to choose from to retrieve-modify-return bucket brigades: =over =item 1 Create a new empty bucket brigade C<$ctx_bb>, pass it to the upstream filter via C and wait for this call to return. When it returns, C<$ctx_bb> will be populated with buckets. Now the filter should move the bucket from C<$ctx_bb> to C<$bb>, on the way modifying the buckets if needed. Once the buckets are moved, and the filter returns, the downstream filter will receive the populated bucket brigade. =item 2 Pass C<$bb> to the upstream filter using C so it will be populated with buckets. Once C returns, the filter can go through the buckets and modify them in place, or it can do nothing and just return (in which case, the downstream filter will receive the bucket brigade unmodified). =back Both techniques allow addition and removal of buckets. Though the second technique is more efficient since it doesn't have the overhead of create the new brigade and moving the bucket from one brigade to another. In this example we have chosen to use the second technique, in the next example we will see the first technique. Our filter has to perform the substitution of only one HTTP header (which normally resides in one bucket), so we have to make sure that no other data gets mangled (e.g. there could be POSTED data and it may match C in one of the buckets). We use Cctx|docs::2.0::api::Apache2::Filter/C_ctx_>> as a flag here. When it's undefined the filter knows that it hasn't done the required substitution, though once it completes the job it sets the context to 1. Using the information stored in the context, the filter can immediately return C when it's invoked after the substitution job has been done: return Apache2::Const::DECLINED if $f->ctx; In that case mod_perl will call C internally which will pass the bucket brigade to the downstream filter. Alternatively the filter could do: my $rv = $f->next->get_brigade($bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; return Apache2::Const::OK if $f->ctx; but this is a bit less efficient. [META: the most efficient thing to do is to remove the filter itself once the job is done, so it won't be even invoked after the job has been done. if ($f->ctx) { $f->remove; return Apache2::Const::DECLINED; } However, this can't be used with Apache 2.0.49 and lower, since it has a bug when trying to remove the edge connection filter (it doesn't remove it). Most likely that problem will be not fixed in the 2.0 series due to design flows. I don't know if it's going to be fixed in 2.1 series.] If the job wasn't done yet, the filter calls C, which populates the C<$bb> bucket brigade. Next, the filter steps through the buckets looking for the bucket that matches the regex: C. If a match is found, a new bucket is created with the modified data (C. Now it has to be inserted in place of the old bucket. In our example we insert the new bucket after the bucket that we have just modified and immediately remove that bucket that we don't need anymore: $b->insert_after($nb); $b->remove; # no longer needed Finally we set the context to 1, so we know not to apply the substitution on the following data, and break from the I loop. The handler returns C indicating that everything was fine. The downstream filter will receive the bucket brigade with one bucket modified. Now let's check that the handler works properly. For example, consider the following response handler: #file:MyApache2/RequestType.pm #--------------------------- package MyApache2::RequestType; use strict; use warnings; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::Response (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); my $response = "the request type was " . $r->method; $r->set_content_length(length $response); $r->print($response); return Apache2::Const::OK; } 1; This handler returns to the client the request type it has issued. For a C request Apache will discard the response body, but it will still set the correct C header, which will be 24 for a C request and 25 for a C request. Therefore, if this response handler is configured as: Listen 8005 SetHandler modperl PerlResponseHandler +MyApache2::RequestType and a C request is issued to I: panic% perl -MLWP::UserAgent -le \ '$r = LWP::UserAgent->new()->get("http://localhost:8005/"); \ print $r->headers->content_length . ": ". $r->content' 24: the request type was GET the response body will be: the request type was GET and the C header will be set to 24. This is what we would expect since the request was processed normally. However, if we enable the C input connection filter: Listen 8005 PerlInputFilterHandler +MyApache2::InputFilterGET2HEAD SetHandler modperl PerlResponseHandler +MyApache2::RequestType and issue the same C request, we get only: 25: This means the body was discarded by Apache, because our filter turned the C request into a C request. If Apache wasn't discarding the body on C, the response would be: the request type was HEAD That's why the content length is reported as 25 and not 24 as in the real GET request. So the content length of 25 and lack of body text in the response confirm that our filter is acting as we expected. =head2 HTTP Request Input Filters Request filters are really non-different from connection filters, other than that they are working on request and response bodies and have an access to a request object. =head2 Bucket Brigade-based Input Filters As we have seen, filters can be either bucket brigade based, or stream oriented. Here we look at a request input filter that lowercases the request's body by directly manipulating the bucket brigade: C. #file:MyApache2/InputRequestFilterLC.pm #------------------------------------- package MyApache2::InputRequestFilterLC; use strict; use warnings; use base qw(Apache2::Filter); use Apache2::Connection (); use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => ':common'; sub handler : FilterRequestHandler { my ($f, $bb, $mode, $block, $readbytes) = @_; my $c = $f->c; my $bb_ctx = APR::Brigade->new($c->pool, $c->bucket_alloc); my $rv = $f->next->get_brigade($bb_ctx, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; while (!$bb_ctx->is_empty) { my $b = $bb_ctx->first; if ($b->is_eos) { $bb->insert_tail($b); last; } my $len = $b->read(my $data); $b = APR::Bucket->new($bb->bucket_alloc, lc $data) if $len; $b->remove; $bb->insert_tail($b); } return Apache2::Const::OK; } 1; As promised, in this filter handler we have used the first technique of bucket brigade modification. The handler creates a temporary bucket brigade (C), populates it with data using C, and then moves buckets from it to the bucket brigade C<$bb>. This bucket brigade is then retrieved by the downstream filter when our handler returns. This filter doesn't need to know whether it was invoked for the first time or whether it has already done something. It's a stateless handler, since it has to lower case everything that passes through it. Notice that this filter can't be used as the connection filter for HTTP requests, since it will invalidate the incoming request headers. For example the first header line: GET /perl/TEST.pl HTTP/1.1 becomes: get /perl/test.pl http/1.1 which invalidates the request method, the URL and the protocol. To test, we can use the C response handler, presented earlier, which dumps the query string and the content body as a response. Configure the server as follows: SetHandler modperl PerlResponseHandler +MyApache2::Dump PerlInputFilterHandler +MyApache2::InputRequestFilterLC Now when issuing a POST request: % echo "mOd_pErl RuLeS" | POST 'http://localhost:8002/lc_input?FoO=1&BAR=2' we get a response: args: FoO=1&BAR=2 content: mod_perl rules We can see that our filter has lowercased the POSTed body before the content handler received it. And you can see that the query string wasn't changed. We have devoted so much attention to bucket brigade filters, even though they are simple to manipulate, because it is important to understand how the filters work underneath. This understanding is essential when you need to debug filters or to optimize them. There are cases when a bucket brigade filter may be more efficient than the stream-oriented version. For example if the filter applies a transformation to selected buckets, certain buckets may contain open filehandles or pipes, rather than real data. When you call C, as shown above, the buckets will be forced to read that data in. But if you didn't want to modify these buckets you could pass them as they are and let Apache perform faster techniques for sending data from the file handles or pipes. N< The call to $b-Eread(), or any other operation that internally forces the bucket to read the information into the memory (like the length() op), makes the data handling less efficient because it creates more work. Therefore care should be taken so not to read the data in unless it's really necessary, and sometimes you can gain this efficiency only by working with the bucket brigades.> =head2 Stream-oriented Input Filters Let's now look at the same filter implemented using the stream-oriented API. #file:MyApache2/InputRequestFilterLC2.pm #------------------------------------- package MyApache2::InputRequestFilterLC2; use strict; use warnings; use base qw(Apache2::Filter); use Apache2::Const -compile => 'OK'; use constant BUFF_LEN => 1024; sub handler : FilterRequestHandler { my $f = shift; while ($f->read(my $buffer, BUFF_LEN)) { $f->print(lc $buffer); } Apache2::Const::OK; } 1; The logic is very simple here. The filter reads in a loop and prints the modified data, which at some point will be sent to the next filter. The data transmission is triggered every time the internal mod_perl buffer is filled or when the filter returns. C populates C<$buffer> to a maximum of C characters (1024 in our example). Assuming that the current bucket brigade contains 2050 chars, C will get the first 1024 characters, then 1024 characters more and finally the remaining 2 characters. Note that even though the response handler may have sent more than 2050 characters, every filter invocation operates on a single bucket brigade so you have to wait for the next invocation to get more input. Earlier we showed that you can force the generation of several bucket brigades in the content handler by using C. For example: $r->print("string"); $r->rflush(); $r->print("another string"); It's only possible to get more than one bucket brigade from the same filter handler invocation if the filter is not using the streaming interface. In that case you can call C as many times as needed or until EOS is received. The configuration section is nearly identical for the two types of filters: SetHandler modperl PerlResponseHandler +MyApache2::Dump PerlInputFilterHandler +MyApache2::InputRequestFilterLC2 When issuing a POST request: % echo "mOd_pErl RuLeS" | POST 'http://localhost:8002/lc_input2?FoO=1&BAR=2' we get the response: args: FoO=1&BAR=2 content: mod_perl rules As before, we see that our filter has lowercased the POSTed body before the content handler received it and the query string wasn't changed. =head1 Output Filters As discussed above in the section L, mod_perl supports L and L output filters. In the following sections we will look at each of these in turn. mod_perl supports L and L output filters. The differences between connection filters and HTTP request filters are described above in the section L. =head2 Connection Output Filters Connection filters filter B the data that is going through the server. Therefore if the connection is of the HTTP request type, connection output filters see the headers and the body of the response, whereas request output filters see only the response body. META: for now see the request output filter explanations and examples, connection output filter examples will be added soon. Interesting ideas for such filters are welcome (possible ideas: mangling output headers for HTTP requests, pretty much anything for protocol modules). =head2 HTTP Request Output Filters As mentioned earlier, output filters can be written using the bucket brigades manipulation or the simplified stream-oriented interface. This section will show examples of both. In order to generate output that can be manipulated by the two types of output filters, we will first develop a response handler that sends two lines of output: numerals 1234567890 and the English alphabet in a single string: #file:MyApache2/SendAlphaNum.pm #------------------------------- package MyApache2::SendAlphaNum; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; $r->content_type('text/plain'); $r->print(1..9, "0\n"); $r->print('a'..'z', "\n"); return Apache2::Const::OK; } 1; In the examples below, we'll create a filter handler to reverse every line of the response body, preserving the new line characters in their places. Since we want to reverse characters only in the response body, without breaking the HTTP headers, we will use the HTTP request output filter rather than a connection output filter. =head3 Stream-oriented Output Filters The first filter implementation uses the stream-oriented filtering API: #file:MyApache2/FilterReverse1.pm #---------------------------- package MyApache2::FilterReverse1; use strict; use warnings; use base qw(Apache2::Filter); use Apache2::Const -compile => qw(OK); use constant BUFF_LEN => 1024; sub handler : FilterRequestHandler { my $f = shift; while ($f->read(my $buffer, BUFF_LEN)) { for (split "\n", $buffer) { $f->print(scalar reverse $_); $f->print("\n"); } } return Apache2::Const::OK; } 1; Next, we add the following configuration to I: PerlModule MyApache2::FilterReverse1 PerlModule MyApache2::SendAlphaNum SetHandler modperl PerlResponseHandler MyApache2::SendAlphaNum PerlOutputFilterHandler MyApache2::FilterReverse1 Now when a request to I is sent, the response handler C sends: 1234567890 abcdefghijklmnopqrstuvwxyz as a response. The output filter handler C reverses the lines, so the client gets: 0987654321 zyxwvutsrqponmlkjihgfedcba The C module loads the C and C methods which encapsulate the stream-oriented filtering interface. The reversing filter is quite simple: in the loop it reads the data in the I mode in chunks up to the buffer length (1024 in our example), and then prints each line reversed while preserving the new line control characters at the end of each line. Behind the scenes C<$f-Eread()> retrieves the incoming brigade and gets the data from it, and C<$f-Eprint()> appends to the new brigade which is then sent to the next filter in the stack. C breaks the I loop when the brigade is emptied or the end of stream is received. While this code is simple and easy to explain, there are cases it won't handle correctly. For example, it will have problems if the input lines are longer than 1,024 characters. It also doesn't account for the different line terminators on different platforms (e.g., "\n", "\r", or "\r\n"). Moreover a single line may be split across two or even more bucket brigades, so we have to store the unprocessed string in the filter context so it can be used on the following invocations. Below is an example of a more complete handler, which takes care of these issues: sub handler { my $f = shift; my $leftover = $f->ctx; while ($f->read(my $buffer, BUFF_LEN)) { $buffer = $leftover . $buffer if defined $leftover; $leftover = undef; while ($buffer =~ /([^\r\n]*)([\r\n]*)/g) { $leftover = $1, last unless $2; $f->print(scalar(reverse $1), $2); } } if ($f->seen_eos) { $f->print(scalar reverse $leftover) if defined $leftover; } else { $f->ctx($leftover) if defined $leftover; } return Apache2::Const::OK; } The handler uses the C<$leftover> variable to store unprocessed data as long as it fails to assemble a complete line or there is an incomplete line following the new line token. On the next handler invocation this data is then prepended to the next chunk that is read. When the filter is invoked for the last time, signaled by the C<$f-Eseen_eos> method, it unconditionally reverses and sends the data down the stream, which is then flushed down to the client. =head3 Bucket Brigade-based Output Filters The following filter implementation uses the bucket brigades API to accomplish exactly the same task as the first filter. #file:MyApache2/FilterReverse2.pm #-------------------------------- package MyApache2::FilterReverse2; use strict; use warnings; use base qw(Apache2::Filter); use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => ':common'; sub handler : FilterRequestHandler { my ($f, $bb) = @_; my $bb_ctx = APR::Brigade->new($f->c->pool, $f->c->bucket_alloc); while (!$bb->is_empty) { my $b = $bb->first; $b->remove; if ($b->is_eos) { $bb_ctx->insert_tail($b); last; } if ($b->read(my $data)) { $data = join "", map {scalar(reverse $_), "\n"} split "\n", $data; $b = APR::Bucket->new($bb->bucket_alloc, $data); } $bb_ctx->insert_tail($b); } my $rv = $f->next->pass_brigade($bb_ctx); return $rv unless $rv == APR::Const::SUCCESS; return Apache2::Const::OK; } 1; Below is the corresponding configuration for I: PerlModule MyApache2::FilterReverse2 PerlModule MyApache2::SendAlphaNum SetHandler modperl PerlResponseHandler MyApache2::SendAlphaNum PerlOutputFilterHandler MyApache2::FilterReverse2 Now when a request to I is made, the client gets: 0987654321 zyxwvutsrqponmlkjihgfedcba as expected. The bucket brigades output filter version is just a bit more complicated than the stream-oriented one. The handler receives the incoming bucket brigade C<$bb> as its second argument. When the handler finishes it must pass a brigade to the next filter in the stack, so we create a new bucket brigade into which we put the modified buckets and which eventually we pass to the next filter. The core of the handler removes buckets from the head of the bucket brigade C<$bb>, while buckets are available, reads the data from the buckets, then reverses and puts the data into a newly created bucket. The new bucket is then inserted on the end of the new bucket brigade using the C method. If we see a bucket which designates the end of stream, we insert that bucket on the tail of the new bucket brigade and break the loop. Finally we pass the created brigade with modified data to the next filter and return. Similar to the original version of C, this filter is not smart enough to handle incomplete lines. The filter could be made more foolproof by building a better matching rule, and using the C<$leftover> buffer as demonstrated in the previous section. This left as an exercise for the reader. =head1 Filter Applications The following sections provide various filter applications and their implementation. =head2 Handling Data Underruns Sometimes filters need to read at least N bytes before they can apply their transformation. It's quite possible that reading one bucket brigade is not enough, but that two or more are needed. This situation is sometimes referred to as an I. Let's take an input filter as an example. When the filter realizes that it doesn't have enough data in the current bucket brigade, it can store the read data in the filter context, and wait for the next invocation of itself, which may or may not satisfy its needs. While it is gathering the data from the bucket brigades, it must return an empty bucket brigade to the upstream input filter. However, this is not the most efficient technique to resolve underruns. Instead of returning an empty bucket brigade, the input filter can request extra bucket brigades until the underrun condition gets resolved. Note that this solution is transparent to any filters before or after the current filter. Consider this HTTP request: % perl -MLWP::UserAgent -le ' \ $r = LWP::UserAgent->new()->post("http://localhost:8011/", \ [content => "x" x (40 * 1024 + 7)]); \ print $r->is_success ? $r->content : "failed: " . $r->code' read 40975 chars This client POSTs just a little bit more than 40kb of data to the server. Normally Apache splits incoming POSTed data into 8kb chunks, putting each chunk into a separate bucket brigade. Therefore we expect to get 5 brigades of 8kb, and one brigade with just a few bytes (a total of 6 bucket brigades). Now let's assume our example filter needs to have 1024*16 + 5 bytes to have a complete token before it can start its processing. The extra 5 bytes are just so we don't perfectly fit into 8kb bucket brigades, making the example closer to real situations. Having 40,975 bytes of input and a token size of 16,389 bytes, we will have 2 full tokens and a remainder of 8,197 bytes. Before showing any code, let's look at the filter debug output to better explain what we expect to happen: filter called asking for a bb asking for a bb asking for a bb storing the remainder: 7611 bytes filter called asking for a bb asking for a bb storing the remainder: 7222 bytes filter called asking for a bb seen eos, flushing the remaining: 8197 bytes We can see that the filter was invoked three times. The first time it has consumed three bucket brigades, collecting one full token of 16,389 bytes with a remainder of 7,611 bytes to be processed on the next invocation. The second time it needed only two more bucket brigades and this time, after completing the second token, 7,222 bytes remained. Finally on the third invocation it consumed the last bucket brigade for a total of six, just as we expected. However, it didn't have enough for the third token and since EOS has been seen (no more data expected), it has flushed the remaining 8,197 bytes as we calculated earlier. It is clear from the debugging output that the filter was invoked only three times, instead of six times (there were six bucket brigades). Notice that the upstream input filter, if there is one, isn't aware that there were six bucket brigades, since it saw only three. Our example filter didn't do much with those tokens, so it has only repackaged data from 8kb per bucket brigade, to 16,389 bytes per bucket brigade. But of course in a real implementation some transformation would be applied on these tokens. Now let's look at the implementation details. First let's look at the C handler, which is the first part of the module: #file:MyApache2/Underrun.pm #------------------------- package MyApache2::Underrun; use strict; use warnings; use constant IOBUFSIZE => 8192; use Apache2::Const -compile => qw(MODE_READBYTES OK M_POST); use APR::Const -compile => qw(SUCCESS BLOCK_READ); sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = read_post($r); #warn "HANDLER READ: $data\n"; my $length = length $data; $r->print("read $length chars"); } return Apache2::Const::OK; } sub read_post { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->remove; # optimization to reuse memory } } while (!$seen_eos); $bb->destroy; return $data; } The C handler is trivial -- it reads the POSTed data and prints how many bytes it has read. C sucks in all POSTed data without parsing it. Now comes the filter (which lives in the same package): #file:MyApache2/Underrun.pm (continued) #------------------------------------- use Apache2::Filter (); use Apache2::Const -compile => qw(OK M_POST); use constant TOKEN_SIZE => 1024*16 + 5; # ~16k sub filter { my ($f, $bb, $mode, $block, $readbytes) = @_; my $ba = $f->r->connection->bucket_alloc; my $ctx = $f->ctx; my $buffer = defined $ctx ? $ctx : ''; $ctx = ''; # reset my $seen_eos = 0; my $data; warn "\nfilter called\n"; # fetch and consume bucket brigades until we have at least TOKEN_SIZE # bytes to work with do { my $tbb = APR::Brigade->new($f->r->pool, $ba); my $rv = $f->next->get_brigade($tbb, $mode, $block, $readbytes); warn "asking for a bb\n"; ($data, $seen_eos) = flatten_bb($tbb); $tbb->destroy; $buffer .= $data; } while (!$seen_eos && length($buffer) < TOKEN_SIZE); # now create a bucket per chunk of TOKEN_SIZE size and put the remainder # in ctx for (split_buffer($buffer)) { if (length($_) == TOKEN_SIZE) { $bb->insert_tail(APR::Bucket->new($ba, $_)); } else { $ctx .= $_; } } my $len = length($ctx); if ($seen_eos) { # flush the remainder $bb->insert_tail(APR::Bucket->new($ba, $ctx)); $bb->insert_tail(APR::Bucket::eos_create($ba)); warn "seen eos, flushing the remaining: $len bytes\n"; } else { # will re-use the remainder on the next invocation $f->ctx($ctx); warn "storing the remainder: $len bytes\n"; } return Apache2::Const::OK; } # split a string into tokens of TOKEN_SIZE bytes and a remainder sub split_buffer { my $buffer = shift; if ($] < 5.007) { my @tokens = $buffer =~ /(.{@{[TOKEN_SIZE]}}|.+)/g; return @tokens; } else { # available only since 5.7.x+ return unpack "(A" . TOKEN_SIZE . ")*", $buffer; } } sub flatten_bb { my ($bb) = shift; my $seen_eos = 0; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); } 1; The filter calls C in a do-while loop until it reads enough data or sees EOS. Notice that it may get underruns several times, and then suddenly receive a lot of data at once, which will be enough for more than one minimal size token, so we have to take this into an account. Once the underrun condition is satisfied (we have at least one complete token) the tokens are put into a bucket brigade and returned to the upstream filter for processing, keeping any remainders in the filter context for the next invocations or flushing all the remaining data if EOS is seen. Note that this example cannot be implemented with streaming filters because each invocation gives the filter exactly one bucket brigade to work with. The streaming interface does not currently provide a facility to fetch extra brigades. Here is the Apache configuration for this example: PerlModule MyApache2::Underrun PerlInputFilterHandler MyApache2::Underrun::filter SetHandler modperl PerlResponseHandler MyApache2::Underrun::response =head2 Setting the Content-Length Header in Request Output Filters Earlier we have stated that a filter that modifies the content's length must unset the Content-Length HTTP header. However sometimes it's desirable to have this header set, for example when dealing with proxies. Since the headers are sent before the data, all the data must first be buffered and processed. You cannot accomplish this task with the streaming filter API since it passes FLUSH buckets through. As soon as the FLUSH bucket is received by the core filter that sends the headers, it generates the headers and sends those out. Therefore the bucket brigade API must be used here to have a complete control over what's going through. Here is a possible implementation: #file:MyApache2/FilterChangeLength.pm #------------------------------------- package MyApache2::FilterChangeLength; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use APR::Table (); use APR::Bucket (); use APR::Brigade (); use base qw(Apache2::Filter); use Apache2::Const -compile => qw(OK); use APR::Const -compile => ':common'; sub handler { my ($filter, $bb) = @_; my $ctx = $filter->ctx; # no need to unset the C-L header, since this filter makes sure to # correct it before any headers go out. #unless ($ctx) { # $filter->r->headers_out->unset('Content-Length'); #} my $data = exists $ctx->{data} ? $ctx->{data} : ''; $ctx->{invoked}++; my ($bdata, $seen_eos) = flatten_bb($bb); $bdata =~ s/-//g; $data .= $bdata if $bdata; if ($seen_eos) { my $len = length $data; $filter->r->headers_out->set('Content-Length', $len); $filter->print($data) if $data; } else { # store context for all but the last invocation $ctx->{data} = $data; $filter->ctx($ctx); } return Apache2::Const::OK; } sub flatten_bb { my ($bb) = shift; my $seen_eos = 0; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); } 1; In this module we use flatten_bb() to read the data from the buckets and signal when the EOS is received. The filter simply collects the data, storing it in the filter context. When it receives EOS it sets the C header and sends the data out. The configuration is straightforward: PerlOutputFilterHandler MyApache2::FilterChangeLength =head1 Filter Tips and Tricks Various tips to use in filters. =head2 Altering the Content-Type Response Header Let's say that you want to modify the C header in the request output filter: sub handler : FilterRequestHandler { my $f = shift; ... $f->r->content_type("text/html; charset=$charset"); ... Request filters have an access to the request object, so we simply modify it. =head1 Writing Well-Behaving Filters Filter writers must follow the following rules: =head2 Connection Filters over KeepAlive Connections Whenever a new HTTP request is processed, request filters get their context (Cctx|docs::2.0::api::Apache2::Filter/C_ctx_>>) reset. This is also true for the connection filter context, as long as the connection is not a C>) connection. When the connection is kept alive, there could be many requests processed during a single connection and the same filter context will persist through all of them, until the maximum number of KeepAlive requests over the same connection is reached or until the client breaks the connection. Sometimes it's desirable to reset the whole context or parts of it before a HTTP request is processed. For example C needs to know when it should start and stop processing HTTP headers. It keeps the state in the filter's context. The problem is that whenever a new HTTP request is coming in, it needs to be able to reset the state machine. If it doesn't, it will process the HTTP headers of the first request and miss the rest of the requests. So let's say we have a hypothetical module C which implements an input connection filter and it processes incoming data as long as the I flag is down. Once that flag goes up, the filter switches to the pass-through-unmodified mode. Here is a skeleton of the module: #file:MyApache2/Filter/StateMachine.pm #------------------------------------ package MyApache2::Filter::StateMachine; use base qw(Apache2::Filter); use Apache2::Connection (); use Apache2::Const -compile => qw(OK DECLINED CONN_KEEPALIVE); sub handler : FilterConnectionHandler { my ($f, $bb, $mode, $block, $readbytes) = @_; my $ctx = context($f); # pass through unmodified return Apache2::Const::DECLINED if $ctx->{state}; # get data, do some processing, send it out process(); # your code comes here # change the state if some condition is reached $ctx->{state}++ if $done_condition; return Apache2::Const::OK; } sub context { my ($f) = shift; my $ctx = $f->ctx; unless ($ctx) { $ctx = { state => 0, }; $f->ctx($ctx); } return $ctx; } 1; To make this module work properly over KeepAlive connections, we want to reset the I flag at the very beginning of the new request. To accomplish this, all we need to do is to change the C wrapper to be: sub context { my ($f) = shift; my $ctx = $f->ctx; unless ($ctx) { $ctx = { state => 0, keepalives => $f->c->keepalives, }; $f->ctx($ctx); return $ctx; } my $c = $f->c; if ($c->keepalive == Apache2::Const::CONN_KEEPALIVE && $ctx->{state} && $c->keepalives > $ctx->{keepalives}) { $ctx->{state} = 0; $ctx->{keepalives} = $c->keepalives; } return $ctx; } The only difference from the previous implementation is that we maintain one more state, which stores the number of requests served over the current connection. When Apache reports more served requests than we have in the context that means that we have a new request coming in. So we reset the I flag and store the new value of the served connections. For a more complete real-world implementation, see: http://search.cpan.org/dist/Apache-Filter-HTTPHeadersFixup/ =head2 Adjusting HTTP Headers The following information is relevant for HTTP filters =over =item * Unsetting the Content-Length header HTTP response filters modifying the length of the body they process must unset the C header. For example, a compression filter modifies the body length, whereas a lowercasing filter doesn't; therefore the former has to unset the header, and the latter doesn't have to. The header must be unset before any output is sent from the filter. If this rule is not followed, an HTTP response header with incorrect C value might be sent. Since you want to run this code once during the multiple filter invocations, use the C method to set the flag: unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } =item * META: Same goes for last-modified/etags, which may need to be unset, "vary" might need to be added if you want caching to work properly (depending on what your filter does. =back =head2 Other issues META: to be written. Meanwhile collecting important inputs from various sources. [ If a filter desires to store the incoming buckets for post processing. It must check whether the bucket type is transient. If it is -- the data must be copied away. If not -- the buckets may contain corrupted data when used later. The right thing is accomplished transparently by apr_bucket_setaside, for which we need to provide a perl glue. ] [ This one will be expanded by Geoff at some point: HTTP output filter developers are ought to handle conditional GETs properly... (mostly for the reason of efficiency?) ] [ talk about issues like not losing meta-buckets. e.g. if the filter runs a switch statement and propagates buckets types that were known at the time of writing, it may drop buckets of new types which may be added later, so it's important to ensure that there is a default cause where the bucket is passed as is. of course mention the fact where things like EOS buckets must be passed, or the whole chain will be broken. Or if some filter decides to inject an EOS bucket by itself, it should probably consume and destroy the rest of the incoming bb. need to check on this issue. ] [ Need to document somewhere (concepts?) that the buckets should never be modified directly, because the filter can't know ho else could be referencing it at the same time. (shared mem/cache/memory mapped files are examples on where you don't want to modify the data). Instead the data should be moved into a new bucket. Also it looks like we need to $b-Edestroy (need to add the API) in addition to $b-Eremove. Which can be done in one stroke using $b-Edelete (need to add the API). ] [ Mention mod_bucketeer as filter debugging tool (in addition to FilterSnoop) ] =head1 Writing Efficient Filters As of this writing, the Apache network input filter reads in 8000B chunks (not 8192B) and makes each bucket 8000B in size. Based on this, the most efficient reading technique is: use constant BUFF_LEN => 8000; while ($f->read(my $buffer, BUFF_LEN)) { # manip $buffer $f->print($buffer); } however if there is some filter in between, it may change the size of the buckets. Also this number may change in the future. Hmm, I've also seen it read in 7819 chunks. I suppose this is not very reliable. But it's probably a good idea to ask at least 8k, so if a bucket brigade has < 8k, nothing will need to be stored in the internal buffer. i.e. C will return less than asked for. ] [ Bucket Brigades are used to make the data flow between filters and handlers more efficient. e.g. a file handle can be put in a bucket and the read from the file can be postponed to the very moment when the data is sent to the client, thus saving a lot of memory and CPU cycles. though filters writers should be aware that if they call $b-Eread(), or any other operation that internally forces the bucket to read the information into the memory (like the length() op) and thus making the data handling inefficient. therefore a care should be taken so not to read the data in, unless it's really necessary. ] =head1 CPAN Modules Several modules are available on the CPAN that implement mod_perl 2.0 filters. As with all code on the CPAN, the source code is fully available, so you can download these modules and see exactly how they work. =over =item C - Interface into HTML::Clean for mod_perl 2.0 http://search.cpan.org/dist/Apache-Clean/ =item C - Manipulate Apache 2 HTTP Headers http://search.cpan.org/dist/Apache-Filter-HTTPHeadersFixup/ =back =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/filter_life_camera.jpg0000644€ÿÿÿÿ00010010000003512611727205032023511 0ustar ????????NoneÿØÿá‰ExifMM*nv(1~2Œ< °,,QuickTime 6.02002:08:02 06:47:37Mac OS X 10.1.5 (g,,ÿØÿàJFIFHHÿþ AppleMark ÿÛ„   % #!,!#'(***.1-)1%)*(  (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀ† "ÿÚ ?úFŠ( Š( Š( ŠBÁFIæ¢kËdšâ%©.(j*öÖšNäLÙlÿ*™oíîÜÂàb•ÐìËSVTnާ>†LAEPEPEPEPEPEP âŠ:f«É¥ËߤbBçÇÞ¤ƒÇ†ö1%ªÀêzÙ¯)ø—ïjYþñN=¶Šä¢’âÆBö³¼œü§ƒøV.Næ‘·TzçÄ[OÅ~ºÒá¹û!«n‡*[;IÏC_5_i^+Ð%(·—Ѩ<¦p?zÅ¿Ä9¬V85+S27I"` ü¦š¦â8ö$noùg#ÃðÿëФÖàã°Ïk¶Ú–•h··—±ÝÀ“ý*E @äà0±®]\iº%î¡c¨1°´Ì—u*9<ãw@{žkœºðá²S%²ôì:WŸx¶ËXš91<Ëo3~öÈl};qÒ’Wcm¥ª&_Š·†áä]IíÔª¶ÄBÊIŒËé^©ðsâΣ¬\_X_<—öð(t•øhþlžrçö5ó¸ðÔÍÒ28ÏJöï†6±ÚhF~Ç"Þ2¢§™èIÆkI;- à®õ=þé“ZàEÿ]8ýzSÛÄš"œbÃ9Æ>Ò™þuóÅX®fº°¹Ó5/ž(Ø8IóÜvϱí\Γâ alZ;‹$Åö"‹1'wý)¦Ú¸JÉØûR9TWÕѹ § Ó«ã›Ox—Ne6šÕ°ÿ¦L|b¾‡ð?Å+Äoi¤ÊÓ¦¦aPYãù&`¿6èzžqNäÜï袊c (¢€ (¢€ (¢€>{ø™{¡¾ódƒëž;ý b­}Jw¶…8ç]e&´iãšè)’„,ùx'9éY6K|7·—Í|Œ"*ÐÒn´íxI†HçÝ…‘ß ^ƒŠÏÛå@²Êʤ«!Á)æ´Óc3 ‡Ç½¬kl×Rýì6÷Ý´cµ\“[Ôg@âY¹ƒŽõÄ[ÇåÛÀwf’ôúõ­¸æ‘ #ÞÍ‚¡Tç©#ÿ9Í7ƒ™š†âi™G`Nöÿ>µ* wp:ž['¿þ‹ªi²(»€À[¾® Áö<×¢xOÀš£hï}$¡üͪ¢P¹Ïáô©º)&Ý>óÐy#-þqLb-´±ê6õÝÞ½š?xE<¶˜•/ÿ rÆx>´Û¯ øBÚÎãÉÓÑ¥±MæFçoæ4¹‘^Íž6 I“åüݱšèü¨ÍŒ4/,2¾…g±u~DþuSSÒ´‹i×s½¨#Ñ[ıò‘˜‘Øeþ§ð«¾³0x×I¶vÜcÕbĔՙ 4}v( QV0¢Š(¢Š(¢Š(þ) _ÎÝwÁ?–+Ï5Ýuke„²Æ˜9!2Äצ|UŒ©ÇÞµCú°þ•Å:†ÛŽ;šçz3T®Ž3Oð„:GŸ,S¼,F6܃€pxôE½¨8ç8ü+[Ý\ÆÍ3¡¹·Óôë^mhjw×{@Tld6r{p@÷æ½gÁºd67ebc¸]¸v_ùeÁÿh×kI£=Õ¼º;H# ‘$ÎVNÿË·œWªYx²ÓöS[G¼Ô%:Û£Ú1ÌÇ…-c+ÙÂÉ»6WÑmd°…æ¶ì.xäžýHÿ³¬ZË~éFE³žqò“Ú¸vñŸŠ/.¡nt­<Ì2‘²— à®Ià€OnÞôKã]ôóg¬é±ïÕ¡†òѾFo”©9Û–wCÚ£S^dq—:ŵäûtèoÀ++ʤ˜°Š§ðùGcá”íãý.YNùdÔŒqßnMbê÷×vš¶± ¼k<²Bø:né[£i|y¤±ÿH‘±ôOþµmsIëcëj(¢´¢Š(¢Š(¢Š(È>+§üTVÍŽ¶‰ÿ¡½p²& ôÏjô/‹1ÿÄÞÅým±ù1ÿóù:cŒæ°–æ±Ø·¤è­¬­Ô0nщ#'9ÏЩ¬/Éw¯¥Ï Šè³K £$ÁëÇçZv·SÙN—VÒ´3!Èe?¡õÕ­=ü%[ FXa¶Ô‰¶Œ 6•!¾¤¨ÏJR½4ø‹¥E£ëÐXDÅ’+e›YEsFÇ…ÿhêÚ|dŽÇÌ„žLKãý¢£9­mÁ×w…¤÷ÐIæ^©K"m@,Á8çzþî}fÓÂZ¸d·LÒô©P®éä¹V}Ë·«’~ïN:ÖÕ÷„ít-3íŒòßj (ó®äŒ¨U`W ½ݽiºƒTÏñ>ªºó,*E¼ "€²¼gÿ­éÇjî?gèËø»vÉc#p=YƼÊu,å»Ðv¯XýžaÄ×l釿rñÿõëDe{³èš(¢¬aEPEPEP^}㯇Që &£¥ŠøÏáfÿþuè4Q¸+\G5¤æãhäF*ÈÀ‚=j}UŠöÌ“…Y“è7W¹ø×Àv~(®! ¢£ä—³ã³xUî‘}¡\›+øâàç¡÷¸¬eÓ0~)Æcñ$cæQöp@=FXœW+ܱ}FxëÅkxÂi.5(Œ²3”‡hÜr@šÈ „‹Ñˆ=~´ãð‘'ï3£ð‡üŒºi8ùn¾ké+8íVÂ(ÿtð„]ŸÄ1ŽÃšùŸÃ7PZëv²Í2Eeœ³¾Ð0¦½µ>$xfËO´…õ8&xbP+g”Ž~`6ŠÊ¥Û7¢ÕÎ×ÏÙˆà‰Ì~ˆ6>˜%OèkÆS<¥”5£ùé¶EbqŠån~4iQ³5½­Û“Ìv€x׎•Ìø§â´Úý°·³ÒþÌ0A’i̤÷p¸?JŒ»)ÆÛžq!ʱ+žx>µìŸ³Ìu]IÊ‘¶Ê5çÝþ•äöVwžb¼K$ƒ•ãŒý{×Á jzLZŽ©¨BaKЋ · ÁbÇonH®¤q­ÏY¢Š*Š (¢€ (¢€ (¢€ (¢€ Åñ7…ìVÓ~ø«SUhôw‰OFu?3]f›ð[—k^][ÛzňüE} E; ±äºwÀ=& î¡4ǸBκ;á_…4à»tï5—ø¥bÇóë]•ÂÈ¥i£i¶ kx±Ýcüêè Š( aEPEPEPEPEPEPEPEPEPEPEPEPÿÙÿþ AppleMark ÿÛ„ÿÄ¢  }!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÀ ¿!ÿÚ ?þþ( Š( Š( Š( Š( Š( Š( Š( “põö ܾ´¹ ܹÆy ²Ž¦€0= ´´PEPEPEPKÖ²ïuíLq¥«[[ÈFà³Î‘’=pÄNJ*òvMè•ÎR÷âÏà ;wÛ~ èѰê§R·,?Ù¯6ñgíIðSÂú.¯«ÿÂkä¶¶²Ü%­ŠI<·LˆÌ#Œ*]Ší\2G5›¯F;ͪžÐgðIñ3þý¶<ñ?ÄúU×ì¡á3ÂÑ_H–ºuÌ—cP‚%rª²Jß#>É+ëŸØ¯þnøÏûrüZ cøQyáÝq¬%»·:vµj!º1‘º1æZ3Á$ö©¯N·²sM ðõ4c8&î~ÈØþØ_µ³¤Öþ×Wœæ_Z^oõÂ?”¿…føÏþ ¹ã„6“|U¿Ô4:A ½Ö¿£[Áeu!ÇuIãÏÊò#pN85çS¯YµÔ¿©ëWÃÂu*Ò²ZÝ‘ò×ü³áo ø´/ÙèwÞaŽÝ:Gš9X¥eRUâ`x#nAãšýý‡à¸ß³_í}ñ7Hø%qmq¡|E¿ ºl³G °ÔgXÚ_³‰dUòghÑÝb~X!ÆOéÅÍ4¦ÏUiËøi¿‘ût’+*²œ©äЃޜ]zfµónÔ¹ä Z(¢€ (¢€ CÚ€#‘sŽy¯óÄø¥ûdþÔÚwÆ_x¢ByõkǸ†ùDþaYß8~@UpT€®fª)ìo‡rŒ¹£¹ô÷Âoø*G‡o-'â߇§Óow×±öòOÍ“’Zý(ðGÅ|IÒ¯áMz;Í6XË‹ u+Ÿ˜.qÇ_Ä×—8Y6‘íÑÄs®W¹ù#û_Á5>|v¼ÕßO¬@f xü¸ú¯ ûÝsÎsÍ~ÇÁ">~Ðiï‡_´ÄÚÚ|#ðö³mªjw·ºå»ÜßOgÅoVë#J nPÅ‘FÍØÏJõkʤß*×Èò°ô9«FÓz>çöÓãø(MïìÓð«ÇŸtßj—¾ðæ“uª¾ŸkÄÂê;xÚWˆaÜBr^kå?…ŸðuoÂïˆpYéº'„4Ùõ©0¾Nµ|Ú|ùÿsÿº àÂ{nYr»Åt= {ÃÂi$ÔŸ_ó>¨²ÿƒOÖt©üWðÏÃñxvçÂnXæÉèPÍžÜ}kí¿†¿ð]Oø'.`Ò¼SñŽßà l+Ûj€Ënp6´ÖÂER¸P=k²3oFŽÊ•î~Ã[ÝAwVÒ¬–ҢɈÁ•Õ†ApA98­-Q@R¢€þ•þm4ûX~(xúØHì¾$Ô¢$.r¢æ@Tñ×'pã>ɽ Ùázþ›±—íѤ°L<ˆå`¤ã‘ϧkƒ¼ø“âOƒzF©â…ÿ¯4½CNF¼¸¶Ó®ÞâÞEF™Ò&#›®šãŒ\‘¼¥È¹—CÙþÁa|ReÓ4ÿ‰zºjÖ­~döð[ÊKÆù7ïÁÈéÉÍ~•ü2ý£¿fÚÁ%°ñÂÛjÎ¥žÓWš+iþB©NsÓšu)Ê›µpø¸Ö_¼•Î3ãìém5¬×>ÔÚ"–ŒÛܺy½q»>ùðkð›ö¯ý†m%Õ4ßÚ¾n¦–wšòÛÌ“Œæ]ÌYN:–è9í[Ñ«(ÉZ÷~FªI'$Ï—md]3Ì‚âêm+ìãk3›r7pv¸Ý‘€sÓ=ëõËþ ¡ñÀ?±÷ˆuÍ;Çþ9´²ðÜqÍw·¸••øØÆ8ã$g¯ZÚ¢•Jn7ÔåÃÍQª¥-ÒÚCöùýмkðâßÂC⛩¤×|?u¢Éäi²á£º edlŒ 8üüHýš¾ǪÃ{àmUÿ±f”†ÕÃQG»Ñ´ HÓl+$†XÒãPÛ æ4,f`¡q†\ž ÅVÓ!ÔÖòÚ |]us¥@â ‚ ©Èb²ªœÁœÙÏìÅ|ö<û'.fþGö3ÿçÿ‚æ~Ñ)øñð_à?Æí3×? õÛÛOÅ«ymgy¥Q .Ïòdg–„L[wýˆ¡ÎqÒ® µ©ÑžÈ}c (¢€ (6ùÒ¿Îö†Ó>Ïñ¿ã–ŸzxïY¶OÛ{*}ŠþuÁMòØèô¤î~Bücý þ&øK㻢x3ÄK øgP‚Ó@º’Þgò#gÊ/Ÿ &¾G8;¿vËüGΞý¤<=áŸÙÏsñJ}^&¹òîâv»šÞô6AV‡È@Í’<úw­)Q‹…â·G=J²si½<øÏðwþøÍ®išf®l<{co«hË4r4?e¹C MëÈXÜÉ'ƒåf’ÏÞ?ð.—?ˆMͅ߂̭o«©Ã;+ã´(æHÀ%~bÈ\ÖÊqŠ’ÔÁû³j:›á¿ÚÄ'ñmÔ>!ÔÑ,Ræ7ÓL‹HdHÔÆ7HÔW’@Ëgæ½æ ¯x^g´µ°¾³¹MÅÇ–b·"5{eJ‚¤œ¤1ƒDáY¤8Ôœ¯v6y®õm2Uñ çüJr¤žôKo’FwaÈTÛŽ0YU‚×7'ü#­(¸¸—J)º06,w2HêaH\€w"àpÅøàf¦ïuì›÷¤Xƒ^Ó¡%­\›„ŸìÎÝÒH݆ڄ`±ã*AaÈÁéT›_mGuõÕäåY%-»Ä¥XÄYØt'bþ×COßz‘x'äT¸¼»óôËqdXA¼Mr]wça ˜oÁ,#Ž8§\øžK1¾ÂÐ]nÝ)š÷jãpR¸¶6…Á¢ÞŠiØë<+ãZxÃq‡Ì¼Š++´™ÙíåR…63>C†UÀ<ñ‘šÿ^{pÞZ`_hËÁãµU(r\Ò2æ,QZ–PE‡µFküöÿkíOí5ûQiq+Ʊx÷Ämgæ?é÷\/¯¸1Ú(¿S§ “›Lü<ý¡¦ÒÇÀßxÇÂWM¸¶XuÖ0H×l~%–â&\dŒ;€2Øt‘ 럾(xöð‰umšåö§%×—m;\‡„)-åņrC Æk¢ZÚS£muò¹ÅV=gRMKK.ún]ø´Úмs¤j·Ñ–Òï4+9t¡"2˜ìÙî1ž ÌÞÿ|±ã]PÖõ߇¾еÄ q«j—v“\†IFóc´»lْĨç8­hKžm"$”}æiX¬Zþ«ǧÇtb&f2‰BãyP~P£'ñœWÖ-ñn©>µÊ\ݽôÑ@Ã÷’°.DlW’ ¶À«‚2TqWR_»zÚÆ1»•–æ?Š>|Qð¶¡¥Ùø«Á×Z5ΣnÆÉõ-&{4»Œä‡˜(ä†ÊîÜFy'Ÿ×ߨöøsûFêzÿüA¬@š†V»K·ŠO9ofл#åIˆ7~Ozå©R*Ÿ<]μ5 T¯ì«°¶ðFOØ»C‰îu;ÏÜÁ^l’_ø‚5HÕ‹1ÃÕà’s޼×[ü#þ ×áÈ}oÀ¶’F¬ÒI¨xÃRŒ¶î1K¸ÆÍ«»'åÀ'¥rÏ42Lä™|ßc÷{ò«ŸðM‡§Çúf™¤Eöé¿ ~(Úiú~šº…¼Öj[¢I©$²Ïoöcfᔂqå·%p>`F:W3œíÌzñ„9¹>Lý¿| ῇV ßö^LðêjÒK… 0±Öü=._j®æÏÉ#vI95üçxWâì˜ú¯†~3|WðN³ªüLÐ|?g£ÜiAÓ5)­aÃû÷ba‘62ùlOÌ;…]5ZQ桬ºú8éЄڬž¿>‹ñCÿbûýCâ—í—ð7T×cQ©kß4;éD÷:…®@P2ü¸ã =«ý\ÿÕ^ÒII¥ÒÇÍy%dÉ(ª,( Š)§µ`Ã8¯áöùÒ&µý³i†ÿøJnn0p2ÎD‹ßý¬þÁŽÚ¬êÂÛÜù?YÓäK(¡3 o”€3åî8<óœc§q\ –1Çw4E nAÛ$Ž=ø(×m-b TÛ­¸¥Ü˜JKާƒŽÜ}â[ýZÇÇ/4í\Ûëq4Ëë ½®“#/•<2ÆAŒn\†\<ŽÕ×;r4Ö‡ öªÚ>‡Ó¶w†ÿk ø›Ã??hjZ¤Ëj÷za“U7v­–\YXÆfÞU &çøÛ­KðJZB“¬_*x+NˆÎ òf?IA¯*·³ú´]îßO¼ö°j¬qÒUÝåmoè}ëñ×öÎý‘?g+û?ãÆ Oñ"¿LB×—Ü|ÊÞÝd‘À ¸QÀ9â¼ ÁÿðW_ø'ߊµ;]‘i“3¢“VÓ/-`öiŒ¢weZäörµÚ=yã0ÔæéÊJþ›Yÿ&ñG‡¼Oàÿø£Â:Ýž§áçð¯Šu kÝ2æ;ˆnãŽÖ Åh¥Š?üy68¯åJoüƒöjñ‡ƒu¿‡÷S|[¹Ö ¹Ðµ¯*1okhŒHÝØ „eòÐíùÉ<ŒVô#VPq¦ìîŸÉn¾ãÍÇT¢ªóOTÔ­ní;3Ù¿à“úHÕoÿØÎÅÃ0_Œº,Á˜óVûWrFðB1 AÇ8ÆNÕÅzšöþÔ¾GKáEQ Q@R@ 䫸£ÿ‚imûo~Ðp® Ë««ŽpûHùµqc~úXUûÆ|AtZ5‚)¤0 ˆÁèWžÁüý+›šÏ̾Ž{8¼É$ž%c'.N~èrz{ótÐïÝÚÇËÞ(ÓbÕ¾&x‡ËºY,Í…›G*ɽ$»nVè~P܃ÜW×òêþ-ø9ðçTø=qe¶þ5Òu-b[˜]ÃY,6.ÑÁ4l0Pà,ƒ?Þ\qÌU\Þâv“NÞ«_Њr䃨£u×ѽOæB;e¼ñ†¹4!•µiå’HÕv!Àf ¨å9mÃϯRñiµÅÿÑ­ ]ÙH7™ ãØ L’C.ÜLb½êžôd£µÙóð“Sæí±ôÄOŠß¾|0_ÚÞÍ ãXÔ.d/n`’è¬Éu{R­Ì±É ÏSËópèøeûiü ø¹àO„ÿ þ7ü%¾°û,:î¿§G—Ú¿©ÈA؇ìÖâF·ùvæ5#y¨–Q‡3z¤ÅRŒ>[Ãñ>€øeÿ ‡E×|]à|UŒxcÆúgˆ‡á.®o†b¿¶ÕlÕÉç K˜&XUÞY^×É I"Šüªñïoü®x“Á!ŽXõM:ââÒx‹ÆbÊîÑÇ ®¡YYxuu9ÁäµÏ4Ö¡IÂ..ê-þ;}Çè×üEµ¾ÿ‚ƒþÅöpYÿªñü÷Š6XÂòÈXqŒ-G\ŒWú‘§Ò½?·#’—Â:ŠfEPE5†AúWñ»ÿ7³Ÿ·'ƶ$¦¹°›n2ëaœwäâÆ'Nø‡À­ª¢MpŠº©°ÝÛõPr :ùHÀ+“· …°ažrkÝ|®2·wùŸ+7>ãý‹|>¶~.ºøs Étš\¶°Ã, ¸œ’$O?«ìŠC“™ÖÜ”r+ôÓöÏø'ðWÁïã= ‹ú¯ÃïŒ$Ž=åá(¸}3UÒYÄ"ÚFUC¸C´˜Ü°oŸ$’XáÔc„j=^‡|hMà*N;n~ë ¼ð?Åšæá¿[x§Y†Cke¨I"7*1‹9C¤ˆ˜¸ž„>kø§¥xòÎóXñ6­o$—1¯Úe²‡S¼\–-¼ÃŒç;²{ñ]“£%‹’RÓ§—™Àª%B7޽N»öñ®¥{ªøoÇ>Õn Ù]C¨XÝÌËö­>òÞTuW ÅYQ•ñ“Œž•ú ÿ ð厗ñ'AÕl H¬õïØß41¡Ë1Ÿ²Ã ŠÙ­£Ç÷bæ¼Ù.LOÞvÇ\,Óè×ä}ÿúès_ÁFÿdëu¶—Ë:Þ·¨3Êì|Þ§.ð¼c"<Ã9þ›«Üµè¯Š_×C_ê*Š( Jk{}+ù ÿ‚«i©oûi|C»ù’ÚéÓŒŽþB/þÊ+“ü%êtῈ~kêGý[q!ÚÁ89#¨÷þUÍ欞hDb¨sÉô$þ9¯/]Ñß{uÔúö_ý¦|wà/ø£àÆ¥«O©ü—OK­GE“a6ÈUÃËk#"u`ŽyÛòr3]?‡|%ÿ‚üyâ¿„:”íáVÓõ›f;u6é²K?´+1äF€üÄ’Û%e)ºN\‹IoùÕ§½`›Gñò|¸¼M«-½°um@¨¼îa°óÏ$Gq“ÁÇ5éóYGªø—ÁmtÏvc™ ŽråãŒýñ» “Ûµ{²·¼–ÇÍEE½Yú=ðŠÊdýŠ~5jP©y.u…°©Ü&{@ߌàð†9¯Å¿Û ãGÇøÃMƒÇ>8Õµˆ­ü¨m%Ôç3y@2G9›-Ç\ÖaNUå9-QÙVNiÂú4ôùŸ¡Ÿ±M­áT3üRñt âÿ5žKk«Áùy,€(ùÜœcžMc~Ô¶°j2ÿÂico›ás§J--$ ˜Û/ïâda #:ƒü Î3]Ôµ¨êMÙ~‡â¥IBš»‡càÿØ:÷VñWÄx/LÒ%š ¹öÑÆ 0–I(¢EÄL˜ø÷¯ÙŸø(ôörümð‡‚Œð˜´]LÒ*ÁÕvÇ ¾n¶òÜ8ëϯõ¤¼›ûÏEi†©ê‘õ7üya.£ÿý/YY­¡Ò¼C}o›Êßczƒ¾¢¿Ò9{úWl^²¿õ¡…?€}e…Q@ÖÎ8¯äçþ ô鶬áóö¯XÌA1æ/þË\¸¿á|ÍðÿÄ?*&¹/mä,lX•aÇ^?¥sSˆÙæVp#E9í€GóàWšÕŽí/sÍe”kwc%å³·%!¸œï¿UÿdKFƒö<ý¨~Ðí¥êNÇÉ»Oœ¨Šœ Æ¿À¯Ý~føM*>º?Èþ'’âÕõJXˆP×í BCfpA;ˆ=CÖ½2õ™õ¯ ¼ò«˜%gŽ%8ÎÖwnyàgí=.Ϙ¯nÇìü¯@ðÿÇMâìÃâ=~ÛF¶Õn­ Z´ÊV±ÜOmtÛÈ  ³·ÆrÓg€kèŸø(‡Ã¯Ø“àçÁ»¯„< ácãÓí¦Ô>Òº•ÕŸ’XNo/ã,ŠòŒÆm !W’üŒW™7Së~ÊÉësÛ¤¨Ëíj+´¬ç"ÓÄ_~ K¥øÒÓÁqÝ_ÚÀ°Ý1±†æ}>Hò#¸‡z1ÚW(~RqYkñ âí—­[x6â{­>[«“'ˆ5s3jwöÄqo ´cÌyä,jUñ#*#ÕSQ§íWC˧’KV~°~ÀŸ<ð_Ãz§Çè˧xOÁvÅ Û2ÝCThO˜?åä<±Ú6¤ a£ŽC_|Wø™©|Iñv¿ãz5:Ö¡~÷2C*ª«::Ĩ2 H"ªŠ½r¹:ÕêU]46«û¬=:ovÛ~»~î'ü7¦Iuûzü;‘£P,¼ª]ä S™"DÉ™è3Áî+ýŠíŠ÷§~æTþôU–PEP_Ëwü ÀzîƒñÏÁßäÓ¦o jÞLK´‰ÊEs’ŒÀ`Y<àÖˆ¹S²îiJ\³¹ømuâHZÜ“1±,rÎOB=ª£]ùlÁ\žrÇwSþ"¼ùG]Å%ÐâÓÂc*–%E”n8Îúz祢üeøë£üJ·øGá^úÓá>±¥ê²_Gkî¯çM6é˜Hàs„MÞY8ÇÍŽõ1Œe>Z›~¡)ÔŒoK{«ú7f9¥åÆ·«y‹‰5 %vªáA=¸Oð¯mµÔ$_øyUcŒÎ©*a€Ü$#“ß'¿#9¯Bwz÷jàÅÍS«mtÏO T¥(Çdî|±âo þÃwZ_Œf3ø¦Ûâ$xÊéc¿Ùù¼ ðþ=jòïFø•â­-ìo,lnlå²+ ϺâêU<‘²7–³$n6‘Šå›š‹U'hùÐ…9Éûûþ}(ÿ‚™þÏ>ý–> |Søe kZ–¯-Ƴ Þkµó™nuMFé'–æá‡ð–6ùÇlI¯æSQ·¹ðNÎ ]¬v1vÀ.Ä›œËŽ+³':ro«<üÆʪ‡dI?ðkÖŠbý·o§f[/†ráö¶¤ÓAà ŒeÈàóŒ×÷î¹ï^œùŸ›9à­>в‚Š( Š+Î~(ü,ðÆ_êþø“á‹][Â×ѧ¶¹@q‘€ÈÝQÇPË‚=hßFñûÿÿ‚lxßöUÕ¯ümà‹+[à¥ÌÌa½Dg“K,xŠëhù}œ+~+òyõvKGÞpÌ8ÝœŽsšóëAÆO±ÓJI­J0Þ´Þ*‚ïî›J Üñ’Ø5ú5ð §ø+­êÄdŽwRC¸nÇ™á_õÆJõéÈ‚¼ÜEÔnº†'QéÐþ;-B>·s†o-µ9 ò ™fR£ï‘ׯS^š6IªhI4¯s…ä2H9Á<÷‰8ãN85ìËEcç “Üõ߇ñWž ÒÒ’ïP†ÙN’]Âr2>÷=8=kýÿe­+Æðç‹¥·½±[=Ä:ž´·Y]•´In§iîÜå›ã=s^>hîá±ïdñWœ’=àßë ÖÚŠ|eå %dkK{&´áؙà ~EçŒw©-íoõH‹=æ³uray¢¸[­B5*!WìÂÝ aAçŒôÏœ¥w±íiØþtÿà¼V¾°øi§Úi:eˆ×f›EºÔÖÙbM2Iª'úS†yÀ<3³_Ɉ”Üéw7ܤÏöyv¾ÝÙQÚo¿ÏñÆï^æ\¯K^èùŒÕ'ˆmv?©ø5ûFqûWüFÔ¦i|È~Å$`F×žÓ §'#÷d{ƒÍsõéÁ+3’ *Ê (¢€ (¤ ¢€1µíFñ.“©øÄdº%ì-muisÉÄN0ÈÊÜ0#µ(¿ðRø$–»ðš=ã'ìå¤Üj_Ï™q£B¦Kyfd™ rÜ”·5•hsCШ¾Wt>vw3Eâ'ÒB”–+vϦìåŸÆ¾àýŸþ:x_áÇþ$xwÆis•þŸ47}·e4;2¯¹pØ;HúׇЧ*”Übö×ñ=L-ogQJKG§à*W\"Ö_4QjråÊÂ6PH8ÁÝ·;¨'½zM¬ik©øudòÒ¤ˆ8 |„©•sÇA^Äïkž Z»±ô?ìüVëã'Âh&2MâM=_lxT-s†ýÜøîy¯ôý˜fñ7Ä„—×ò¾–²hÚ•Æ‘m Ö)"MlÉÓ;¼„…m·mŸ”‚z’<\Íûôî}JܹÒG»Ê—VšJ™¼h$Ó4„:mü-ËBÌ’1@#eTî#hñ§¥xSÂ×Ó¼²Zßk) 2w¥\],ŠŽ Ä“j°IÏ À“žõæ©v=©GTåþ ‡{¦ÛØxžÒ X4ûCãí ©DAÇi¿hTùA_;¨àz×ó¡áo éÿ.“DM_û?M–?n»>]ºBä;³ € dãÐWÐeÎÔ`üÏ•ÌýìT’?«_ø6ÂÅ¿hOÚ6çO¼6~±µi\ÍÁRÀžpÆ2G¥iµéAÝÑVIc (¢€ (¢€ ŠHÒTxä@c ‚ÈaÜb€?ø(gü›LñÞ«¯|oý–´ä³ñ”Ѽš‡†#ׇؖ%Ùí²?w!=#)'ü½ø·A×¼3oâxƒOžÓ_±2Û]Z\ÆÉ,2¯ÊèêÜ©RHÁ¯?ME©¥Ôè¥);Åö?å‘Î¥ªÞ&Þ5I$Ü¿tá¸ôí]n¡,–Úö›,p\IFVXS,­å«¤‘Ü×¶{V—n:ìyÖ|×Hö…þ=ŸáÅ/‡_õ_ê7:V¬Zj×F¾A¼Ž £fDóHùŽÝ €yÇ×î¿ÃÏø.·ðÿÁáÍ#öfÐï碌kµ¸×µYî„lm­à*"…ÿ£–䟼zg‡…XŽ_{Dz˜lpœÜñ½ûžWâÿø-/í¯­™,¼)¢èv3Þ^›§e%ÁäHìyŒŒ€Np+ÀuÛëöøñäš\?|Qn/&="ítÙï000l’)˜ã’ÍÓž´é`h®—*¶i‰’¼eÈ¿¯SƒÑ?dÏÚ×㿉eÖnüâ{Ä÷“‰¦»Öí&¹»•É\3I¨9› £†cÀü>ÿøYÿý»þ$-—öÇ€eÓôÆ’9„𬦠»vã)*¦@Ú¼yõêSÂI$åh¥ÓþòyTnד}à½Ïë[þ QÿÆÐ?àŸ~ ñ.«¨êò_üZñ,0E®L® ¼I9"î~ù,I<ð8úâ*ãfît EPQ@Q@Öû­ô¯Æ¯ø)¯üÿÃÿµW…õÿˆß ¬ Ó¾9GlÍ(U"ñªçË” ~ôà(“¿²**AN6eAÚI¶¿Žÿ`ÚÛá6£&…ñCàO‰ô=^YZ_³êZäm Ï £ËÃ.G 8 dúàïüƒö»ø¹-¤^ ø+¯_HÅ´v2:¯n^=å[× qÖ±ÒéeÞèæŒ©ÅÛyvÔýUøGÿèþÜ>:6z§Œ´ë '(ÇûVü cçî)-žz+ôŸá?ü ¦X‹Yþ(ükˆÈ0^=.ÈÇmÎ0*Ú4iÇã|ßÿ}-U£ø³ô_á‡üöð!·›_Ó5=våH..î6G)ÿj1•#Û¿@þ~À?²ˆ#‹ÁŸô(qóIj²nǪŸ“ÿ­Tù?…@TUù¦ùŸž¿ðª4O xkÃVâÓÃ~°Óí€Ç—ei ùF Vø¥v÷fËEd:Š@PEPEPE„q@·ÚF›ªÆ°êºu½Ì ä%Ä)"Á«pÛCmpÛD‘À£ ˆ *`88´Q@Q@Q@Q@Q@Q@Q@Q@Q@ÿÙmod_perl-2.0.9/docs/user/handlers/filter_life_cigarrette.jpg0000644€ÿÿÿÿ00010010000001142611727205031024406 0ustar ????????NoneÿØÿàJFIFHHÿí ÖPhotoshop 3.08BIMéxHHØ(ÿáÿâùFG(üHHØ(d'`8BIMíHH8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIMyt_ snuffed_butt_t8BIM8BIM8BIM ©\pxÀÿØÿàJFIFHHÿîAdobed€ÿÛ„            ÿÀp\"ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I%)$’IJP¶ê©a²×¶ºÛôžòÑñs”rr*ÆÆ·&㶪ë,wƒX7¼ÿš=ƒFGS-êXcÎüLC¯· ­¾Ÿówåÿ„·"Ï¡þ ÓK­uMutßõ—¡°OÚšñ0][]`̺–½»”¯Ñ‘FEM»ÆÝSõeŒ!Í?Õs}ªžçAÜòtºtXý1µgÚÖ´3¨Xçµ €ðÛv·kwe~ü"dæ!(‰˜ð…Ñ‘¢-êL§¬RI$’ŸÿÐõT’I%)$’IL-®»j}V7}v4µí<áµÍ\u½W3êØ¯¥æc‹ZÆìÃÊ“¶ÚÙí¥ºîÛ›UÒYþùê×f²¾³ôãÔ:.M5‰½ƒÖ O©Qõ·úû}4ÙƒDÄÔ€Ñt.$êò_Zs2«uo&Šž!£·â­ÔúÍ5»Û½=®­ó®úýÕÿÔ{—=KÛkAçà;%±ÒÓŠküæ’ždå3‘Ô’z[©ÀGACg¾Æ½™õÞÏ£kC‡ÌJ*Äú»“í³óYõ*È'kÙÿ[³ÿ>­µ«‹'¹Ž3î?3$ '(ž…I$’zÇÿÑõT’I%)$’IJLyN’J|¿­a›Ö²±CKjõ´i¡®ÝÖzMþ­ž£RƶÌ{¥Ž#s|A]×ÜúXÝIƒôŒwÙî Hôß¹Õ9ÿ»éßÿŸ—-M‚5äG»ºÎæqÔŽ¿k£Ëd¸k¾ÏM‡—ölŠrÆ­¬‘lrXøkÿ­ù¶Ö×`†¡p˜Ä «[3Û^˪èYFìOEçô˜¤V|Û¢ù‰ü”èËøqÿºbç!´Ç÷K¤’I+Í7ÿÒõT’I%)$’IJI$’SW¨àÕŸ…~Ãôyº·yHö¸)Ž÷5y{kµ¶í][‹-ÅŒ>­ÿ Zõ“Âä¾²tlÚʲ·N`’ö¸¶Xmnú?é*ôÿí¥||`WMü™°d:õüÜl<ŸI—1ÙÙ!¢¾|›³þüºÞ“ˆü'6Ëé/kYsG q÷VÏú¦¬¾M%Ä­µ=ÇWq0!Û‹—D"Àv˜6´ä{ÒLåùqq˜/ÏœÌp•¶¨U`²¶¼pá?Þ¦¬µŸÿÓõT“nh䉵ƒºJf’`àx:%#Å%.’iJRRë;®ã:þž÷V&Ìr.¬s;~“µ^õ¢˜¤ ò¯·t >²ux[=>òZÐ>3ô\±òé=?¨ós5ù±òáÿmý{ Æ\Ðcˆ?ê xfÈuÍËm¨ý}JþúmþÍ›•…TØ=z Lî.iÿ7wýSU¥-…”ÿÿÔô<ËßY†…BÌÛDÿzÛ³«>×ÅV·¥Táí1äxOŒ¢7Ss.:>hg©ä4èý>+Qýt•gåtKÆ¢O„'ƒÚ2§¯8yŸ "¿GZ¡ú©ñ\åÝ5¿˜èî`¬ÛÛ“DpðÕn'b®Ъ˪Íç‚ËÊúÈÜLªª³ÃUûK.ii/ôþžæ;üâÖ3©k7ØK,†_¸l{œÐÆûío¹dÑõÓ+«>®{êÄé6‘WÛò÷ ±‰oÓûCèÔöl}xìÛÿb‹$xM*žãë_UÄc°2+#Áco¾¾Âe6Â{ÿ”Óïß·s·84áþƒÙÿR­gâàÛ‹UÆ·WeGcCšïV¶†4\68Æ·kžÿå®?­/%·`Qm½7äÝŒ÷7iêìG9ަ׷óù—Gg·Æ¹ŽÎÆ¥º»ßc‡‡´·_ó–ÒâºÖqÔº.Cm`°µúRóKÝ#vßUžæ{×6zMõ·ôS½¯¿~[Á}¶ºÀ—d»Óße¿¡Èßþ–ؽžÜjmlh#à€:N3èµ8Ê$܆«¸Ÿú»Ð¾³ô\öu®ŽÖßC\Á‹’KKËëÙnưí~;o©KŸk7úk¡®Ÿñ…׺uXc» d_S2\³ô¶2q˜ë›þÓ^˜ÌLzÈ,© Žñ¯ÞŠ˜D{}¨·šú¿õB®˜Ö> Œck­§ÜÖý®“kcliÄy)$U¿ÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop 6.08BIMÿîAdobedÿÛ„         ""   ÿÀt_ÿÝ ÿÄ…!1A"Qaq2B¡Rb‘r’¢Â#±‚CS!1AB"ÿÚ ?ìÈ0H¤Ð ¥œšÆ™!÷,«v€sËUš}­¯mnÙžÞVÈѶ‡â<Á"I‡ÝJÿÐìÈ0‚°û›fêARÍ6'±€Ó˜æš9ï?Ê«éz¦û-âŒÖ€à Iˆ¥.Qñ¶šß:1ƒFI©¼°ýÕÁÙÝÓ«W•¹®hpÄA]å—¥ €ƒÿÑìÈ)·—éÉÞÙb.²™îu¼ƒgÎcwÂæúV©ÇŸÕ´G4eÇZ—’ØY‘¿\½ŸTϧW_ͤâxÝ+¤æ=ä¹ÇÅpo\Qš]t žvžÖ¸ÕððÚ/¹zß/g,<¾üÖ’‹©ˆ€ƒÿÒìÈ55+oìf´™¡Í•¥¢»8\>éUÔ\Rs5.>èŒS>E‹>fœ«ÉÞ&%êõêÒZ6VJöbÂ[ê|-½?uȼå8Ñ“Œ¿Ýé]?ëS—'Õ‹Ï%¬/Yæ²€ƒÿÓìÈ0Ps.·ÓþY3´R;¶ófqƒ×~j]½;ð‰‚GÄöÈÌJáÓÐ0°Û\Ù[ƒÛB¬~ËôBÿÕìÈ>sDÉbtr Ìx-sNðp(DÓj–.Óõ)íOøžCkOá^onj^—V®-±a6RÑ.ŒkÞ¹fÝK6’$–vÜ@k.»·´-¾\LjÜÝó¹´‡FñzÏ1éÿÖìÈ)ýg¡ ™b¾Â7S—1íÿYý+Þ¾Mú{8 l´PMg—3éh +åå¼÷.ú{ ±ˆ#±¸…×ךrëS2‘¶ 0³á4¯,ßTÿ×ìÈ5uasg,4©sx|F-IL)¶Î!æ2)¸Žð°ÓOi­:╌Ÿb¶4BaŽË+éxÊOxÅ«ftÙP?ÿÐìÈ0PT5«_¤¾tŽS´íõ–á¦^­$ÚàvïYgÚÒŸ…ÅöÄŸN#ÙŠé‰fÜæ~×3åÍ_ÿÑë3Ýòö•1Mú˜Õã#ÀÖ‹{ÓŠhÿ¾Ñ´'ó)÷‹Zæ„€«9”6㼉ûðN#î$aØUG‰.aˆÒIÍüDê‚+©š[î a£ÃþSÇÚ«+D ,& rùNâ š'™pæÄá^-!ZIçW(ŸÊ´QÿÒê—VRK‹U¢DlÚlãqñZF’Õ}œàlSk4n"»Š½Í; b,¦¬\CÛ‚žä=\cRØÛÊfNð¦505 ØELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿî&AdobedÀ jñ%ŒÿÛ„       ÿ¾³ÿÄÓ0 @!1"2#3Pp$A5 !1A 0Qaq"2‘Á@¡±ÑBRr#3Páb’¢²âp€!!1A0Qa q‘¡ð±Ñá@PÁñ`pÿÚ ú <<<#Ð$†%i}K5‰ááx”` b®SŠ’ÆYLNI‡„%<©˜-„κ* Hˆ ‘V<%6³ ‚"¼RŠÀ˜ÙUú ‘b£+¢´ddnjÕ'1óS.²*ž¥xè–ågËâC•–¬N\³Igko÷)bÄnú@O:à1è¹ßÇÕcZÚäíÎw—£¡™ìzñÖâ×7Ý ùçm\ô˜•0¡ Š ‰ô^þ òUÿH>oÃÛî¹Èšb+#=,KfZ“Këæ‹9©X>U›iµ˜jDÄœµ/…Lß­Ýc… z®¹PºçnµÉ±Å‹ZÃzå'=.yó±!i$#©âÌû¦o™ºìºÎ° Kò\z6¾{w7afElØ:ÞwÑŽù±.'•‰lÅ,hƳ–K7š®ºä¯iðÒçtî±Î`œêtÖ»®«\FÕ^~Oi1Yϱâí g@B¼_B¹®´½}>rç·xç p±×ÕCŸ—$ ϧg]Š\ +G9{húío?Ó®“¯§Î\ðååLÁœÅ­k9ùò© ’hëW걩ª›ùO§Ù†­É™äÖozŽžœ±–9Gφ:¬âÄß?ÏÇåg ôvËÝÙ`T×˽ÊúÖi,”7Ó_Ó¿¸yËÏ[‹$ÉvMý+fOKFijY€Uy¹ö†Ú—TZ‹Ÿæ0’I›yÏe1ô{2ˆÔ5Ât£3 ÆçbMÄu'f—¨0*DeÄ’ÝfÿÚÚ¨W5^Õ{UíWµ^ÕQ¾àJ±ÊŽ_3H™ÅÏ=/µDûÙ¾Js“¤)Ó9wƒGUFfáõЧz¹ mîÝ:QNG\VùøœœŠn˜otú2xÝ¡NNE1=ÍhÆal{³˜ÞÌtoRÌZŸ–S²Ü™’âȲ.³ÔB ‰Ï’)"–ýÎJ§?ŽÓÉ9 Je*Äæ´G øÌynm«–Gž±Ï×ÚÊÊ9åvT°qÃ$“†Âü¨œåI«9"ãd­ÊÅž¢3Vr}ý®FC6[#*®i¼éR¯r$§´¦Õ†ëñ¹–¿µ=íÊb2ã9KžÆ;òkònC’}}û¨ìîZõÆàòGàÆ?èÚËÊk2»¬røtò^I²¹­tÌs!-÷µpæ¼o+öðÏú:2sñ1”¿´ñÍGöÖÖzIÿØdbgí˜=Ìò1ì]Ç‚2fC"`½Ì‹ÜÊ—ô‰$F ÿ™É‹›ˆÇ³+\ǽ˜ÃŽ•ÒGSa`Q¸ç0®Þ3‘ã°dY¿IŽõNù´î¸±GëÅdDÎ4¹Ò¿·Ï¯"+…•Ö»1ŠLØêy6ùPË”9<°ée’D !>9W*£ßí¦.?'`ŒGÖµ£Y›t0zOJNóhY¸Äö˾*éc»i‹i\5Ÿ&'ì8Ê9”Ä:?6±€]‘rwÒ…W@M¡q8>H±b£X¯%›í1¥šYÞ¡’‰ÒyLä}t*¾H9––¸/‰!Mƒ ¬N>w.:VA ×’ÂxòâOF´‘ W‚P¬l7Ë$\(gàqPàqS8ŒV¦bÄÅhêŸÆW (RÅÙ=Æ)‘¨µ‚íB…FÙ¸¼'^ÑA¶ú¬–wcÈâ¼ä©ÑLo%{|²™ÇÈT8Œn–‚ŒÂŽ e.¿ üT)¼dA3& Ð?ƒÿÚþÌ(nW¬NáÚ¡¹EjµZ­V«UE P颦•ÒÕM³Ô^«ÒPuwÂ-V.Ù]²¬*Åb¥4#ÁNƒv‡¤ëJªÐ)°UÚ;r½døôT¯5EOz½^®UþwÿÚþØX©ÔÖ¢Ýæ£»Uzî.âî.âî.âî ôï]Êø+UªÅo€UUG|iEEaVè@„æx‚v;FznjNÔ ¢Ä|†Ð tNAôUN¦Ø*½#G;À‡t\U»eZ¼•|‘wp«Ê¯ó¿ÿÚ?…ÿÚ?Yp‡ÿÚ?ÕÕVÚªªëëeØyîõ¯±˜?¯­_ÂÚ í¾Ez½_k@ÙäE Cvù9vÉ'É1*‡ö‚4 Þ;È;GŠg4~¶hnëû—({û ¹?ö•“<…Í“ÔüܸAÆ0\ N+©šÙU(“1:vÛøÿŠËh©)¡Ú‡,Áðå'iQü¢ï˜gjéÍï àwñ> Ì.ù¸ÂôlØ4sÆe RܬF`Q|ÇHŽg²Ù áüT1Dlt×ÔüvžR» ˆUÿúWÿ_ÝI¿ê<Zì'¿Ó%Çq\Ílö¨²J=‚Ü$8Ę[AÂòÙ®gËrƒi öíi¸ºØÜ1¬cè¹c`8³ž7¯¦ÒíæKÝ8ºŠ-u.* 7VÀüú\ÏZ¢•¥âoöB9™®Äãd5E˜êîÞ,*‹¥Dè–Qâm(µÂcU$ÚÞë‚h®õEEÒ¤4á˜Øì7¨åC5¾éª†fYË*õ'È]cκÇMñà,åhíš…Èl‘cÛˆo\‘jÚ¨¤`¹‰*ŠžCEEEEEOÑ?ÿÚ?!å!«;N »;ü7eÐsôºv›Â45½§Úµï1»Pzµø¸öK{MìyÂ^ `^‘Ƴ™—Ñ0ÎZ×Ý1ó:B"€sG»ƒ4°áëËü‡ì”ÜxGu@ hÇ€ÓÇ—¿ègœèðH Ç&¢Q>wœ.†±úú –:7ࢲÚ#¼§j_)g^nNStõ%²Çk Ý ^´c0™`}Q7L½D§w­&m똦:ÒØÄ©)ɨª jmSA;†Œ2ާ2¾ 1(w(jöÕc•^£?hûë_Š ýе–ƒ[‹¸hÛ §!ë*ôŽóIZî=fçlryiÓ>ºèKXÒ0#ææ»´‚YÑ«€«£rÎÍEêÓ0&©KÓ‰QãºWTõ]»ÀšÀNºÀY¥'Ãs5Ää£Ë_v5·XØ ‚š½æ6ï,Ôe-^ŽÙ4g]2{Ï„—%9Ñu‹5Ý«ó> ˜õTŵFªãÒhÓ׸Ç~DÂì¡ö‡V…Ÿ˜±³ç,ßt¢[ygî(hDKÙ.Ÿh‚ìÖ.q¦Ò«¡+¢25BÀrA¢œÐšW“ªdLÌlt˜ÔÓ§äŽîªü¢©oðÛ}mûÍW{òÇQÇ_ÂMCºf~qOò)H¾½"®³-É{KÁÖ×-¨y,ÿ\ƲNÂ=_‚7~ÆKB•TÃiÌÊ2̇Xh¾™G×u=Ü *ôðL-!€ùbÀÀuµ€cÏrüÜÑèò zÍbã„©øCåˆLSÕ¢ºoIò¸è³/< ³ñ 8ÒêwĤõ« EÛO§ÏÁæáöÏùŠz?0ÆO«¼3AúL‘J’¥wÿ\§O}aùŽ–]º¾#Šªâ,qÛZ4Ik³ìMãÑYÆ`­)¨i5’‚‚­GÌŠktˆl¨x?ïpC¿€Ôð#Áš×r^^˜%Øà8™p¦©—Qu¤ &¹•¸ÕïÁÐôÛ_#V C¶,½5÷—ÇZ陬%f´xi6aéÑèý1vòóp‰î}Ð,P0ÏYÿµ êâ Öc½×Ò! ó·bT¦ígQ,8µ@˜C[ôJïí“d‰9PëSÈûOð„oQ¶¾°‰Á#ൾA]U=˜Å÷ {8aÌ.ÑMP‚F‘ú6Äp“è^Ð)t2µ]×Íà"iÙÛÅUHÑÀòco–ߣ<†VÏk€ˆáéú€eí³íþÀŸñÿŸ€•ò’¦Ûø?1üãòGuv>%À`•'1Ò(IöjìêGjþ\¶Œ¿HòÈ÷ÓÚ[51Ét ð3ͨ6‘M&·‘ãÂQ¡~èÿÿÚ?!þ’åÿ"ÿ÷Py£á®'6^¿¼•€žx¹UÊ#àÕÌK‹/ˆÊçë‰(£€áÜ*ù¢0ðpYsR$84p4I$’I t¤’I$’A]õ¤’I$’L¼ô$’I$E€hÌ’I$?2ç ä’I$Pî@3$’I&ÛÚ˜Ù$’IXÛ?É$’I5¼BI>`´ló4òJC«—Ywõ’?-~ËŽ\.t“"D;.7ÀÏ$ëª8³5ç‰ó\V–`“¶HÛ>@ 7ü’H΢I$’H&ÊÙ/’I$’A?Û/$’I$’I$’I$’I$ÿÚ?åh‰æ‘É;O™Úû3èŒì¾`Ÿí‰ª$ç Ü t|ChÃÕB„A²¼F€u‘*눑kQîmëˆî£Ô‹4òÇÓÕ;)ÚyOù&ŒjJÈÕŠ5mjG¤ÓSp}Kë(•5¬é~°NÏ{{«¬ ‘¶c=L2ë[ÁaH 2[Í¡;eêF0®Ä*Fªü±Ø2ó¨úʰôL"´-Ú– èú¸n:L¹ µô&›@F9¶.¦I·øò‹Y««VÜü9߆’kʹq3ÑUÒ"Ölùu=r!@« ö4îcg=ê#ö—¸°Ë·0½æc´}s`µØ5f&Ú!šWÔ¼Ó-T) äY½2š5jø!Èj5kÚg(©§Ù¯˜Š%U²ÜÉ©E!×¼°±l…««ëÚ—k:vt¶Œ1{Öb¹V0+—;£h0Û½:aÌår[RÜ&Têk;%ÀÓz/Ù_ÄÔcÏäÆAËéÚSTF¤Z×y ¢­YÈ}`l[¼\±èc0/´H*Vª{> ¨CæÃCK²rïά?ªní(­^‡‹0e‚¥«L¢Ê;‘Ô0к;/8BÛi2ô4”¡×jnY–bAoV° 1LÃ\É0ÝaWºæÖÕ±·ý‰-ª= ƒ/Ñdùßž]ÿ+K€ÅW˜Êpý,J1œ€¤¾®:ŠŠ çH…•z˜‚ËP¡UB5ÛVÖĘ5ˆ_<Ĩªî)ÖÃ/Ñd³Îå”òk ç®X¦¾mèÓ²êºÞMewMî´ô&e>–“¯Ï`Å Õ5ÙÓFHÂ%EÉ£Fú?K·oÅBó§-³ƒe §þ%phn©6T¹=Hƒ^ºî(5<‰ŸG± º„¢kgÄsÊà,v蘂 uD¾C¨÷Ñ0fˆ4Ìì}ßi­õ¯¿‡^Ë Ûì0+¥ƒÔŸˆY±ªwì¿xˆ:,³ÿ".`úÖ¥Gm@|\Õ§.^¢£Ê!Á‡Éшª•À|àzç“î” W ÃWZB [ú6©¸ù,ME‰ (w*‹Vß™S;£¹¨¾RS@éTgÔFÅîKDð_Û넇Wd_ú·CxzûAÕ“`÷¬‚¯B¿Ä"[Û÷ Öô?2êÙ­ýŽ®Ó,wî=¡*Õ±eNömpÙj÷xëCn¥PŹJo&š&|Ùf³N <á¬Å™±E=b¼Àr×îÇèžmËŸS~Uàs‹@úÉQ?€…ä¸{Ë ­÷ÀKÀu Cbô‘­±|’Ñ˵9í­[¿Â`ÆMá1Jýjúµ«ÁéM¢ùÛ˜5$–/X×FÞkå侬·I–ƒ{DL°3o3çJ³£RÕ¥wîCA–´ÝÄ6º@ëÕêø0E¥y©þÊ ¯D”+„$òóšfa.ªËwGɾVíḆA¦¬jûÁ¸L¯°iL~ãÂhùĘÈÅÄáOŽóª{ '`†Rb‰MÆáæ%h ORk}%´ŒIŸ™41 ƒLº&v\ÖLÔyyš…¢ã;»W¬Ïµ ì­^‘MšÏ~][@.Å]뤯gƒiÚzMå3R\­A ×dÃ+´-Jµl ‚Œƒ¸vc,r–ÜYWYôÄk VìY\·ŒÇa<Ÿ©XÁƒõo¤"ni® –¡å5àöˆ€õüdB.‹Æ&³á^ÍꮩvìË芩³ë¬ÐôD¥2¢.µ©e‹]aNñõõ¹ÏB ÍÖûJ·„ØÝ¼&2OwD”ÕgºKeçé¶þѱº„);O(Ó šƒÑÌQu€Œèaî²úöú(ú0áH­Ø÷„phõmË ~ÆSj£¨§Ä J›Ô²(Yw,~"¹KµËå_0-ÚøépTô³NÏÌ,ˆ.š0¥è÷'MÜWÛsóŠ ÐDsgÉ„c÷oü!D'«÷@I\ö1.ò#Æ´O5±ÀŒÄMs4ÅŽ]¨ôG¤C5‚¦GÿÚ?þŽåºAtð\?‚²ø/‰üù‡ð“ÂsNjċ{Å—/‚K`\R©g1à+33*&%Á‰²,òÀ ¯1"-KáQfÁ.Ä&’kåÙÁrÞ6Ëâ¬M3W.ÊËu‡t¿Y~²ýeúÅõá)4¦™«–tðJŒÊ *išü)¢5Õ%Æ)ï hÜ¢$®5+‚¸YQ‡>CvŠwà[hÍ¿<Å z>üO “l2߃B~Š7Ñ÷!Ô^äz~çñý˜n'·î7«âR Þ’§ŒC.êÀ¯æ âFVÍ~&’Fš§ÞWÚy‘[פzCª\©D¢QÂåñ+<EŽÇCHn Éx?_€#ŒMÆÎä£Üšós˜š >fnñŒ¿ ¤šøÚf˜3àúÖƒ^HøtˆË‰F<1`ÖÑ[2nkê×Ä|é¤Ká0â\J%8•1p+˜Ý< àøèG‚_àÄÇVËX¿_ÄYråËñ®ˆ;â&†âà6‰!¯Î­{IJ&ÅEëÍ"+&°›ì{Dï5FfçܹråË—ý'ÿÙmod_perl-2.0.9/docs/user/handlers/filter_life_goggles.jpg0000644€ÿÿÿÿ00010010000000712111727205031023701 0ustar ????????NoneÿØÿàJFIFddÿìDuckyBÿîAdobedÀÿÛ„    ÿÀVÈÿÄœ  !1AQaq"2‘¡±BRb Ñ‚’¢ÂÒ#cƒ“$Áár²3Cs£³T´E!1AQaq"ÿÚ ?ìºAügE÷˜Y҃Ų8õnV¸ˆ1ìEë õY¡aªº‘è Ð~¨ @ P( @ P( Vzå²úuh£'/Äe&Ûãa#¼muбãȧOYòVD·jÝ~1z±›¹ø\µÀÚ’ÀÜC1QÄf Ó·Ù¬1Ù^f:¡ÔÌÛˆî÷.Zõœè±üTˆ ôG Qó-\3”“ Ñn«nc¸Ì>n[Y"cñY9VÑL‡Ýaß0%iÓRjÛMª_ˆðIÕ ˆÖLŽsbljZk‡2ªý5žÍõHm|îx—_þÜÄÿÕZ¾Ÿõ…NËÕ—….°cO6¨ÒFãÝ .b:JÔÉÕ‘ÿÇxÒÛ‡›¸,7IþêY™€ò‰ïÓƒ–L^$:ÁµJ¯Qz}w¢û/‘Æ+2 ;IÐÉý±L«+§½zévùå‹ —ŒdqÆÝAr˜#pÔ&¦•;¨¥@ P( @ P(>yx„¿Ï6öÍn ˜Ë+O$c¼RýÈiBrè}Ý#)ìàEtŽ6òÑôj ¬öwayoñÙ\„ùLr¤X]ôg_e‡75)@ö_K6϶X°‹{Y¶è ’á¥}_éÒ¹ºá&¢” ÛA]uïK÷´m5Þ9qÙ~-_½Â¿‘›”“ß®RÅIÝ}|è%Â.|¶öé÷0H²,X\[©:îyš6óæCä"¯œØ¹ºc×^œu þ ‘åæ“u¤WI§nˆIçÎ„Š–5.SªŠP( @ P( 9ñ ‡Œï •ݱXg2IÞ©¤€ž!”ð:ùAí­Jó]¹W½Îm=»Ô¬K(‡ãìîûéU¼:èÚ2$hÄ{'ä>Jµ¸ïìV[•°ŠÿsݜÚ)á`èÃÖ>ªÃ³*@ P( Û+;ÛIlï!K‹YÑ£ž T::0Ы)ÔE=ãV"ƒC’êwO1ÈZï?M;BÜ$û(XÕÂeÊøœèý†ºdåº#þÞÖm¨È¨§ç¦*vˆ®OÆ~„‘ÄänÈì.`…OüÇ?E^§hÔ¿kvÿaµ˜ÿÄ¿ê€Óªv~àñ‡“™]©'—LƒÿL’­­â‡ld®Vß1ŽŸ[@&.bñr…p?PÔÁÚ-«K»[»hîmeY­åPñK ¬§°‚*6õ Prˆû6‡u_pÐ3sS j¼žÏ.sKHåËGk0Ö f "ùÁ:V¯…Î5Êq²z‰Ô–fRL-ûK‡€6·:ÉnÚ}‰Pqõ:hÃÉæ©9=^ÞßÛ­z/âoõ^Áí߸íãï&ÇÈÂHåA i-å$@OÁ‡›ËRÇ¢\¬küŽ>ÂÕî¯îbµ¶ŒjóÏ"ÇK1TiUî¿ÛÒ<2g¿‰\FJ´X¸dºâ?ýº¸L y/ÌC¤–ìE¶7ra0Ã?µ1«Õ2ÕIù‘ì }©–#ÎÒÛ¯òL.^ ù”l¡Ù´rG×sÿ!¦›~e{H{»:üúï!È5?æ[„ú •rOõ™è€Ðjo?2Ì¡×á6\ æï¯Ý¿Õ„UFªëó!ê4 ­ž×ÅDǰ¼—‘ó2Uš™hò>;:ûFîž>3å¶µÖ“žµÖ1vE2~%:Ç™VKüýãÆçV&xÓ‡áB¢®--ÆóÜ7í —7 $ñOG+’Î5:0Õµ:'QDJpøË¬ž:,þXÅ÷YEíݺ£(gHõƒ«rèAhl¾†oì¹vÄ`&¶³˜™˜’Ù^24‡ 6š1Ô"ñÐVrÖ^ÐðYƒ¶T—sæ%¼—µ­¬C«Ã9ù©Ùz­]½Ñ.•à‚üß´2(Ó¾¹OˆséÖbÿELµˆ”AˆÅ@¼°ÙÁŽÀ‘" TV¿plm©²–×%Ž‚U‘HˆÕeB~Ò8”Š&×Iz™g±÷&c`n‹²±Yä®>é*VÑ9¾êÈ {­V%Âÿ¬ºýâ“ÿAG³‹S›ÜÙû«w“)’¼È÷`wkys4àÁÂFj«9MúoŽÅ\aÙî­ãžñw’H¡¸2†ÀƱ³Ãú6Ú^/ |XÜRöZ@?²OÑYËËÚý²–ÏF†Öî“ôTbÛö.ûl­Ï®ýÉÚý¿ƒn`Oþ¾Ôÿaè¦S¾ßuëÓÛ‡‰ÆÚì#þmLÓý›}ÖlSm¯ÆZè‚?æÓ5;íöÛÙ`ðñéÝÙ[©óˆcRÓ•ïý·V¶ðªòò'/a^Q§Í¥ ³:ó!Û›æUµŒGŽÈ§ÆÚ ÷P±"D…qÀyˆ®ÚÜÇÓôoÛVjfm”ä!ù€³×«Ðú1Ðý…·0?ÀÞG†²²ÌÜØ[Ïys ²´’F’çWÔëÇms®²,ŠP( ¿qøxÛù¾®ÛoÛ›Ù1ˆd»ÃÔÅqskÂ ë¨ ¢ó//;jå,Z ‚õ¿k’Ù3<¬©-»©„· ZB(ô±#J±ÏÙ3tq‹cutÌ4•Ü®¿…ÏJð{/Ã]¸nV<-ãÀDiýsü¢QáÃ¥ØÝù»­¬ó6)u†²·{¬§6«ÏÌ¥Q ) r4Ðö Ý}fkKâ·Ã,8Æ0M-ÖÓ¿c4¾Ô–sñaŒ=å`=†ù&K–¬ÅAzWÎÒG¯ mã}=(yO×RøxÿBÁFÖ°ðÖDtb²ceî‹ÆˆË…¨–³ J&YÖãÂuJ5•Iâf5íÉ~Ùˆ}Cº5ÓGÐü—Ê/Ò­±.àÝ8¬B.§#{±Óî3€çä]Mn½Ï¥ÐC0¤1(H£Pˆ£°*%rv~è @ Pj7žØ³ÜûW%€»% ÈÛ¼D$4lF¨êF„20 òŠ%pîÿÂõfee°Ý¶-?#ƒ*ˆc[•ŽX1ò•#Ò Ö±—“ÙêÏ„bÂÇpoŒ¤onãæ»»º‘D‚1Ì0ufv÷UG”“¥Y0ϯՋ—stS¥V=Ú+%fÊÝ0Ÿ'r&š*.¿b1À|§ËY·/f³ öýÙXmç´2[g,œöYZ&m5hßµ$_Å€ÃÕQl|Õ—éßTo6–y{››+‰-Þ $r{Ž¿…½–_Emå÷éÛUiÛX|¬²¢Te—‹Fk*"¦Œå•Fk6(ŒèYh¬èp¢¨ŸûŽýég‰¹—nDäy&¸!Êüˆºk8}_É®5ÏÚÕðU³ûŒ¼‰þ hò’F£¿¹$¾Rçä¦Ïn¾]ŸXu( @ P(<î-­î"0ÜD“DÞôr(e>°u6œU€aci¨xAG®ž~P(2¨oН –½SÄE–Â÷vÛÏœ¶²±ä[¨×¹‘¼ŒcÙØxvYRÇ Á¹öuómíûº°¿¶=ßÄI Ê8Ãí¦šƒWŸíüù¹Õ%Åg±YÄ–WQΧî0$zÇh¬¼kuòÚÅ5G6d3=¬¸§(ÎQ\å¢3"»DRò0DK1ДÑdEwŸZöÞ Îhq“¦K5¡X- <è®{ Œ¾È æ×Z²eëõ~}¶¼ñ¯MºOÔÿiìq×óÜÊg»»+Ë;¶¥žVÑk鮾ZOˆúÐÞ’Ûôëhÿy|­ã‹Œ•Âd¸^UD×$c³^Þ&¹Û—Y0ŸTh P( @ P( §tìͧºq縱v¹[3ÙÜK(R|ªXj§Ò((ãà ¤YdºÛ×y ·xIJ|<¿ä /·§ªJ×fn±[æ<õëÌÛoxYeaSìCyÞA!®³/ïS‡ùô¿õLJïv,Up¶7 }¸®­t?<±Ÿ¢¦#•üš,qÒ?ÜÜ‹´âS÷»Û]>sq¥\FãÓùl¬ü4xÃʲ­ËØaâoyšê Wû••¾jpé?/®|%ø?ËÿqädI7Öø–ê1¡{[‘Áô™‚îé˜í¯®O.‘á¡[T+Áƒ\ÊèEÆQþ$ê?‹îTÍo¬ZÖ–v––émi vöñŽXá…"0U =h @ P( @ P( @ P( @ P(ÿÙmod_perl-2.0.9/docs/user/handlers/filter_life_mask.jpg0000644€ÿÿÿÿ00010010000001046511727205032023213 0ustar ????????NoneÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀŸ–"ÿÄÿÄ@!1QAaq"2‘±R¡Ñ$BÁð#3Cbás5Scr’¢ñÿÄÿÄ !1AQRaqÿÚ ?÷ú(¢¤(¢Š¢Š*B«Þ^ÛX[5ÅÔ«KÍ›ûÜÔ:†«m¦Æ Ïï·Áø˜ø~õçZž±w«j,‘pMr¿sŽØóÔþ§Â­£ÍO¶N¸öRÅgVqLþIÝëŸJ_6»qq̉?Ú>/gûW~£™ß77mñÏ'3ä9à)¼q¡82F§§¡[jš££ýÔÜX\& Çs –9GNg¥1Ó{w"I÷}vÁìØ0C:ä¡=Hî:²úydÛÊ–Mg42‘$’ËlÀ¬¶à úUÊoÑÖE ¬<ˆ®«Ì,oµmvk ‘¨Ø§Çi'»$cý¹åôò­î­Ùë–Kshç£# 2„RŒ¨¢Š¢Š*BŠ(© (¢¤(¢¸’T†6’FUEfc€IÝ#×{A•DxÍà ƒ¶ýÃü úüF§‹N½ÕÀ’ü›{_åy·?¶‚+h–8”*¯%Z¤E1öv{…Íþ£<­Þð¯ÈU…ì~™ÅÄŠÊÙóá9ÔÈvó­H6© œ–$„KçìÏ |³W£x.G†ïY÷®9çµrŽ^,rð§Lì·QÒ˜)—á•/ZAsoì\Îë4 þ÷dÅ[Í”s­rµÕ±Ì/íSò9ßÐþõßrºn i;zgÓ‘ô¢Æ¥SÐ;W#ñG{s Ü ŒÝ¢ð2ç—Që[gŠxÄȲ!äÊr yö£¢Ï§Ý}öÑ•¶fQ•taÝFŸq YLÖ7¤alð¿†ÇÓzÉz-£OÖÒæQms‚àòáý§úSzP¢Š*BŠ(©XÎÓÜÉy<úo¶EUPxþ °ïò­]ÕÜv¨ Ï 9šÅIe`uIõ)§-s.ÄøGLO•póg5©yoA¢ØTw¸õ$I+îHÉÇAà)Ì6ñÜ›¹4¤8ŽËŽ•N ]§–g&JĽ_Z¿±± ã»ç[ÂÛ7Y˾>ò§rN9T¨ÁØ`ïU›î¯·´áÏ„6qËÆº3£äµßø—*¤·h@à û¼jxß‹çHÒú¶}«è&£Y¯*YNÄÖ€ÏθtI£ªºžjÃ"¤kã(" ­ø|-ŽAÿOŒðÒ›ý5I1Ì¡ã? ïGºŸr¥WsnÖùÉC\ü™LfëxKn™ã.±cq*c¼³,2îq" þ¸ëá[ÍTo-¤­þ< ŸçSÈÿCÿ5œ0Ú2o#f.»#\D“éý£Òï„ë%»æÚfQ±-Èø{Ø®>?/µÕtË tÞÑ_(®ì>ÑE|c¤ôÞ¤A¨GÇþ¡6ñÅ,+žƒsó¯:ÒC.“Åä$tf'èEz³>; s7y‡?3X=4cnÃá"•bIÙ1#  †Õ*Æ:š‰ÜðaFõÀwáØ#Jut¬ºO-‡ZŽ7yNxÀÜt¡ZC&8K8<©®™#°–\#ržïH.³ã‡.ìÓk¼†>kð4 ð;o¾Ä[yeuj8•” ø›åR<Š`zzÕ Æ+/é‰YxúøÓ›[¤}Ó¸çZ”Xb²âºöŒMVTªØåHJ£éuõ¥´ó†u<\81x¸ëUn\q)ÍVnj˜ÇêÖ³Å3Œ’<»«4ºÅÞ‰m{=·8&INêÀõb½üÇ2n7y¾µµŽ¼›ðˆáo^#ŠåqÊ÷mR][KŠí@Rà £¹†ÆŠÌý˜ÜµÇg1ÝdúŠ)Æî 9m«™‰u®«åh1^ØÞ}œ^'7ˆ:7£géY-/ÞÒmÿíŠÓé'†ÓéÎ6gQàAý…e´w…D¿•p+ôÕìÄ1( Ôm0B 8¢÷caU¤Es!s…îÅ çKá`×$ñ3ür}¤byÕ[%Qj¡NÁ•JGoË¥!2JÊrÝö¡"Û#˜ƒ.“<¼ÅW+ø©ÑVXÞø$&¤IaͪÆ8äØJâ#%¤Šbv~µ;¿·ÐäñGƒê SYŠn7éQhá½IcÈ>÷x©VRG1šAo/½ƒ°;mLb”méZƒK¯#“¥S¹-Åñê¶&UºeeâQU_U$óÇoÍ+„Y›¾;4ÔeKÛY1˜¢nJ:ŸM·àŸÖ R¾[]bêîÝÞ+‹ñÃìÀâ,9l1ߊC¦L®!ŒŒFØ*?”÷ŠÖ}¤Z½¬º^±n0ÖïÂqç•úÈܪZv›Pÿ•pEÄg¨aŸë\±ÇYs[·pÅ[ƒ‡|Š$PøÇ…Wã,5ÒKű؊êÁΗ81û×ÝòÇ/Ò˜ã¼s¬œ3½­Á¸æ¤nqN"ÕøÎZ#Âw<ǘ¥àžuñæ[xšfäƒ&—¾­–BÝ8qTƹs Hî#Ž0¼[Ÿù©iòiZ !ÑŽ$”…<š„"PNø¥ò]Ëw2Êrg…O1ãRñÄñáš’ü2pîyò«pÏËV&ÉÞ…¹»éMD)]Û5¡q´-!aðŽú[otª'u%ʵÄdá¸H'<¨ËzáH…îe‚Aʸ <³Ýé]èZq“Uà2{AqpŽANN}MÚÓé/-ª†”P÷€NçÓŸ¥Xì+:iZŽ­$†Kx#1Å#n\¨%Ž|ð>uçñܲçn™j}›7—¨?s^9T¿f°˜»(²7ú³;~¸þ”W|zc.Ýö–àêî™Ùô?áÌþÖäô]Âúâµ `VI?jÌ_¹\ÿÛÿö·taw±J»E¥.³¡ÜÙ8Ùr‡£ Åy+C%ÎŒ“ªw¦g2w´Dì}Gʽ¼×Ÿö—M“BÖF¹i{y²·1ccˆ>ëF|]™Ï Ts‚¡Õ²Œ2ï© ™Þ§£}Ä~!§›J¸%—˜›¼‡ëJý¶FU²:ŠÔ¨ÄËË‘#­|7Œd÷—ÕN1Ký°'rkµ»àH00á’!ñÅD¶ã‹33<™æÇ5WÛÆûœxú× £Ý“ˆrÞ¤ºp£ ‘Ö…“'UnÒ…=+ƒ$Ñœó#¤áÆãç_¦sÃJ’ñŽÀÔ«pÙî¨èÁdáß‘î®è[ÆÒ¹ÀäÕf¸P™lK¦jsÃj첸H¢OŠfÏw‡SB>Òµƒp­Ÿx5R9!ëý÷Ö³X»³Ó¾ÍV #¢ÛÇ<Ž}ïÓ'Ö¬è=‰K î;ÎÔo@2ºî#Ç«à?SšÍ[i“êš•®—; ¸,ñ“¶?›éú×§¦\}ns?Ç öfËðþÍØ[†Xo3¹úÑM”…Þq4äÅkkøn´Ûó´s¥»¹pŸ¨­°¤½¦ÑÿÒ™#ÄGïÄ|Gw­KÙýOñ=*)_iÓÜ™O5aÏ÷¬ãŰÞa­EqoÔÈ7e=õ-°ó„ŽNÇkZÞ!ŸF»Ø–.£¾«kÝYÁÔ4'Âã‹Ù£ úw­zE啽ý³[ÜIJFÜÃï•üVìä>‹/Þ­s—³”ïöžµÏWñ­íä×V·VnË,n®§u*AcP¸)q F,:2Ôõ¯vŠMµP˜®­x.Ðaá•x%Ë¿žÔþÌ#™4ëµWî¦QûV†Þ3¹ŠŸ{Þ'9îëšf—ñáãß¿bkGªv\´%žÍåQßnD€úcв×Z}Õ¿móVŒ«|%z;”gÀu$sÕ„ºáÅ,H¥"5ð-SCa¨]ooò¯þ»=I}¥ŽAœ`øTFä#³·%é–ØnÑßÈ1§Kþk©kêÏé[-'ìÇ€ñj×hÃÿ.Ñx3æÇ–([yý­î±s÷Kki/&'(~]¹ýï^³Ù.ÅÇ¡ÿxR}M—‡ˆn°ÊŸÔ÷ÖOÒìt«QmcmåAŒø“Þ|MYvXÔ³ ’y YPÖµHô.[·*0‹ù˜òçöv÷ÚcYkw,O·”±'Ÿ>ÿ<šzñ¿kõµ{ð›C±ä%nÿï§h5­9oôy­‘@`¹‘¿j唹ó>7.¸2V  ƒFE¯³—fïD·sñ ömæ6¢ºcw6Åâ›RÖÓ=…û^Ù‘’m4Ë/i•Ù´­ õ¼ò¼K 'ÅÙ‡¥YªŽ‘i©"ût"Dø%Œðºy0Þ’Ëj4­í'‡T·Ép8e£cFì-MŽÿ­ç³nOA¾ƒ«"ñ/Ïj¿kÛ}è€oD –u)õÚ¯hµM¯4Ë[îš!íà‘}×_&ŠúŬXÞä(çÿCúWp^ÚÝ/½ÌR¯TpßJŸcO£þ¥Ó£—Ù]¼–nN¹ŒÆ‘;CLU­®2˜¥CÈŒ05ÔöðÜÄbž$–3Í]AÐÖZ󱤆mòk Ï1àý7]Ã4Ò :Ä?³· ×ٌՌÐVð¾ÚÁîG¨Ç*õ/Ÿ¨¯£Hí´ûI«Ã øÿE¬û_Áõþ·ð°$ãβÖÝ‘½bPí¥1ïH¥1¯ïNí4[+1î#ÈßšiCÿØšÞèu. 2VÚ¸öl£ÍŽÕR}2÷S^ ë¹çÍàXÓ€  _hÖû[Com ¤ ªF£@©kíô ´È¾å¬j6Ê1•N,çõU«`%Ԯ檅ˆ’~´Vg¯ÑE°(¢Š“ጭq§Y])[‹H%SÜñ†úÕª*LÕÇatYX¼ËfÿšÚB˜ªÇ³ ±ÿÃ{C$Š9%âñ~»ÖºŠÏ¬;¬ÕûU¦ãôˆ®ãä´cŸ—üTö½»Ñæ<™­dïYS—ʵªWzFŸ~?г†SÕ”gçÎ_•n}|ƒYÓnFa¿¶(ÏÊ­,ñ7Ã*&™¹ì“1â„Íè­‘úÕ3ØŒÿƒ¨¹1ô4[œøu‹gíó¯Î¾ûDüËó¬bö2õ9^DGŽjü›ºŒ÷1‘ášÍÏ?ÕkËGícüëó Ë.¿:Nº¼ãÐT«¡Æ̕πکŸ“õZÇò·.©eÇs=dÕA}>¥”²â‹‘¸cÿˆï©âÒ,âߨ‡=_zº(ÀnL¯c„v¶ÉkÅ÷GS’OSEMEh?ÿÙmod_perl-2.0.9/docs/user/handlers/filter_life_player.jpg0000644€ÿÿÿÿ00010010000001403211727205031023545 0ustar ????????NoneÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ–"ÿÄÿÄF  !1Q"Aaq‘’C¡Ñ#23RS‚4BT“±Áábr%Dcƒ¢²ðñÿÄÿÄ)1!AQ2"Baq¡ÿÚ ?ßЄ !±BB€„ "é.€T„Ø\¤&ÀWÄ1ºÌr¶L#“wFÔÖÚíƒý-âï耵Ä6·  ©u/9-ES~´4Ñ:G =»ÁÃÚÚ¶ÕÑ_÷ª©ÜÆùÚÊÓÁi0ZÓÓ°._!sÉÔ“ÚTù"ŽfHƽ§PápPx¤®¥®ˆKK«»·Þ©)¨´ÓÉç¤l8ŽÛàXfóe­l’7#CxÝyzîVbi-¢Ãœî™öø ¬¨½#,^Wè톊 ¿'·©å7œžhÓÀ5êÆ wU5{i´{¼î)0ÛÀ05¢þà›/7Ëà8ÛÅQÎOÙ¼tø×Hº;IŒ>'Fq*’Ç^íç×TÝ&9‰PÄ"¤­žï}ØÝa~*¬\ †k¦Øw(ÜÉÙ¨ôPíÆÑÂE±IH ?Ô)ôü§m9>Xfñ"â,¼s²XÃò+n’*ðâ}£R£åu·kkpËqt2_à~kÔaÛ}³ø¡ \ÃÝû• Ýøè°0Ö˦½Íu³VYeìÆz¡4±í+¦‘âgîÓ’î2âß«r›©êÎ÷í%},4L¢q.ÁBÈÔBÐu¡*„U1 ©äˆèöù¬ö—h¿à˜Ÿ„bPOq’)¦1ï1í¾Fã·=޼O)XÅ=ΘNãª%u˜ ‰o¥+ðCt¬È6Ó~3‹Ë!y-i°^)•F'º'œ¯Õ*ÊW—¹Î&䪊ÆZC–º-¥ Å•ã–äZÅZY`î³T¶O·Üw¸¯.Ú‡Å`zÍaJŠ¡¯ú®Ï‡jáž6»=¬¨Mˆ.l“~åTÅ],cë\p*Kq&8 è@ïeµ[“,A$nÛ(B¶÷‚pVA½rõYy$ƒsÜ“KØ&zT'G¶É LVûFÙ@¡ÝþÎԜ톩—TÃlåà™ue8íq=ÁMà•¾oÜ—zê½øƒ»#'ĨóWJûçº8QaÎ(µ’¢8Y×pþê²§/»bÈqUÓNÖ’^üø]CtÏ”î¶íoÅkMœ¹µq‚šc#‹nN¥O‰»±À(t°uÁ!©Síb»a ¨ñ³fy²d}pû(ÁÅ¥YÈÀæä 6=÷[5¥öHR=¹\„íšØÓf‘sšHi+Lmp:§y¦Åf½ ܪâû%It>Ó|î,º¸ ¡Õ.ƒóPM"šPL¯yI ú&Îâ «‰°Ã4PÍ)o2[`ápn~El¼™ìžÈ×a‘b1Ñ ká;²6g—»ïéš„ÒØÏ#Tý¿§žÊnë ÃM;!kãEžáàQrɈÃ`ÖÕQµààß‘ZY·nÍTT| B B€„ Î “`3%|ñ·øñÆv‚rÉ àˆ–GŸ`+YåhÆ€9‘:ÕU_G÷ŸþñX+èje%åƒ<ó+|8ܼ˜eš^ ×ä£JÆÈÛ­†U¸äÁê ³…UþõÓÅ#Dyù"-vë›—˜’{x¯Hì"¨‹A÷…øK´a×  ?E¹¢Q5ó³Gï]Š×¯Z»g«Œø„ÙÙúïÿ½c-#~Žˆke¤Cm|'RGˆNЍ´o¼®ÎÏÖßìGšàìýoðÿ“ÑOÑÑ©5Ý ¡>ÑžhçâÈÏPMŸ¬:gy lý_m3”}”ËþQ|ªp>Õ¾i—×Ó œ{‚wô]ÿfrè`U åLT­Ê?©ßTC5ÎwÔˆþcdÛŸ<¿Yû£ƒU—èJë rì`µ}°¸x-c£kÑÏ=t¥Û*æ{î¥Aˆ¶à·“0ІôsïN>¬{-V /F2~È­``°J¤t*¯ÀrN…UøVá‘^HüŒ[$Ø ˆì¸ঠ*¯ÀzGPT¸`u”<2ø'’$ÂàðYgç«MÔ©›'47šntºláÝHœžexÍÑ8ª¼3±8h; R=á€q<‘CXt¦¼„ÑÃkw¯Ì:ê8eð9"$&Bw\2ã|—°Ø}¦“fqÈç$šiä̾­ã┎‚¹®Äë'Å-XvP¹8eð9#Ý›…tñ;–¦²¦†áÍÌ8ë¤Îû]SS¶,u/!ô·‰ÙõMÈò'⾇oÕ\²‹‹¦tÆJJШBK„“;¥Gb"å–)ÛU†U2Û¬kš/ÅdU5R:üéhàåÊô{Ø%+·n[!÷ ,!ò!müV5—"[†^ú’~ÝÞi²ú¾ÉßêR\Ôí ž²8äß“gj<Ö²›Jì¬cnˆ\Þ#͇ó¯ &ÁÅÖð\8âCÚI–_X¯I-D¨°:â[ÉqÒÙ隸‡¨-†Y3wãÞcÕ6[?zãZÙ?×ÉÛöOj‘à9úñíŸêHjq—<ÿRõõ|µ”ÛÑa. ˆË[‘=ÖÕVÁbd‰E ›€K›‘«Lz—8Ûðg“M(:h¢mF"}»‡‹×&£¾s;ÜåêdÙú€àÏÑÒ°œ‡UßÕØ<÷"*¿=Û˜®ár³zÏ‹:Ó¤Õ¶—û<±—hË ¾bî9 TbŒÿQ^ši9™ ÅuH|bãºë˜ÌFp÷C hµ ~õ_¾’íü^GúÓ<×LÄídõ$éøˆö²y«ìVŽš(¡ž˜õ7Km¡ ¤´p]XsrÇrgŸ“Ç'"?é,@fe“Í8Ú¬EÁ¤É-Ž„›]vZÒ ÆJ5AÅ ¹û uAË%º“]³&“éÅ{ ž¤àv.>ÿ¨*°Ê“£onUi¾ïR·'ù ]ìXê\<\‡bÿyÞ ªyº’~¹™t!¨"üç›Ó¬µÿœ}ãêÆ/`ñ÷…X ©>Ø1/EŸñ˜?òäKPq~ÙüÁ)ý-Û3}aTŠyŸÌ] yoûDÌQÈNÒÓþiøÍï뛸Ÿñ œ*î‹!ÿ©‹Ö—¢»øˆ}j7¥f$úK|7“q×W fÅEm1Ý$Ï­Ø™O¹â6¶íÐh91E¶ˆTÓbôø†éq¤<ïPì¾ Âq(1\2ž²œ“¬iX‡$xCqLf­óÄ ,§pppûÙ[ÊêÒ¿Äù/©—ˆ¶¯ ©Þ}#dwZvåÃ>ÍW&gr:q/Ò…ì·*µTˆq­ÇFçå4`ÁÙp5 Y§¨ŠªM ’7‹µÍ7x¬MšB„ˆHt²Åò‘N*6jG_8È Y|ûPÀÙ —Ñ›zÉNÌUsN°#¬m×ÎõfÎ7 £G>_؉l•–×ý9‰ ÈqÇ‚‚Æ9ì¸ÝÅÀ'é]-,ì•…—iÓœŽ«eƒœPÅ5 ©2e¬MõïV2cÏC-DÊ#ÉuÁo’ŒüI’›KNÇ4 ˆ‘·ºmÕÔàÚ;ößžy‹eý'¹ù Krè?Q p5±Fç@ Xò À>ôÑÆ+&Š8m”o/73s§‚­ulÁûÑÒSÀïêS¬Åëëôhn4‹{óVz|õá½v;QòZ·Ä…cêœÙiÝá§f‰¿ÓÕ1ÃÍÚÐ×6àÝ»¶·ôQ¡Çê·ØÙ(â ís ¸ٮߌÇ#Ï9C#Ù Í'Ådñj§ú#­Áî*ˆÕ3:¶¡ó<rCsº;{’ÓPºiÌ]fÐF~ ¨ë¢‚¡µÓH qÖÏß|”Ь~rYQ/Ó´nìì8“|ʤ°ê¥¦_Q£ü ¼yð1í¤ˆÇ™'°ðT‡U6±õÕÕO¨š^ósdÇF©×˜wÁ{lO5Ùó¹ro›“p½a’‹Qùà×?;ew^ÊÅÔõÎßônqÎy­ÙKDNˆàmÎÇëKÐóÎxÇæR ±˜G@xϘw¨(¡¹Å9ˆÇæJ(ÛÛSüÅ?Ðo±>°Ž€ò~Ä{ä5;FáJÎÚ¨¼ÏÉ/D‡ø¨þ?$ð¡xö-÷ÈßšèQIøQüƒæ›FäGèÐqSÅ/1Ϥ2þ<êI{‘0 QÈt0(ÚÆä3ÍCÚ¤®„ÜÞ£/ö”à£wýŸZìR‘©„~d¡bÁWk™&û¯˜¶‰ûÍcÅ6øÇUñø6éúHå’`-{÷#BÍç’L)´{;-am¥ª~DÝnCãuä9UÁqiq1_S¤…£u’36îÜ‘àsZÆÊaߣvc¦xúF@Òëñ9‘ñVòÂÉ¢tr±¯c…‹\. â“¶ÙÕI%QÅ3ë#Ž —¸€Ûq[&Ècçfƒ0œZ3 %“ƒv篻ÃE+h¹-¢žI+0bijulDÞ7êÕ[³õo}QÙÝ¢¢sg¿Ñ¼äàx‡äGzͧe¬Öb•’Ä×±ÁÍp¸ Ü(xN†ÅGJd2öç¼s7Õ A`‚B‚‹k |û7V#xeÚ8¯ž+ "W°ƒ}_PË&ÑÈÐæ8XƒÚ¼–#Éþ[1’9_ û-uxÍÄÎpÜ`ÅÿuÞ’ŽŠO³w¤­¼òaMÛŸ¯óIú¯¥9ôÇÞÍ_šEx‘ˆ'ŸdïI\š±w¤­½Ü—ÓXZ«ÆàüÔ:ÎI›4NækÙ?t›ÙO4‡1—Pɨ…þ’¸è2þýjôœŽÕ2Pj±K/£7³W1òW@Þ«·snœÒhà +†F'_ý¥'F?†}%o’Ø-•i¿x?4ŸªØµ‡ÈüÔsHž4a=ÚsNô”ßìÝé+w<–Ó_*Ç~h–SvÖ#óR³HŽ4a”çôn6ÿIIÑøgÒVñú¬¥þ,ÛÀüÒþªèòµQïÈüÓšDq#èÎíÞ’“£ý‘ô•¼;’ªB-ÒoâÍ’š!ÿP='æœòHÂ3¿úPi^=“½Ì+{g%”ëÏäßòýWá ~ÐÿOùNi$|ýÑßø.ô’^‰#„/ôôäà í˜÷uÊpre…c#¯þßòœòHùìÒÊßbïIIÑ¥í‰Þö¯¡ÿV˜@p;ηh- ÏÕÎ †õûÀNy$|äè÷MœZˆDm;£UôDœ˜àu–Ì×ö´¹Ã¹,Ùì:gH"tǰJN^E9¥ò8—Áóø¤–Ù2þðºSeÿ°ù¯¦á ãw€Ù¸œfÊàÌ$Š |ÿíî«Í?’x¢|ÊÚ݇ÿ`½~Åì^#‹â°ÈøLtq¸$:e‡·lîÂÃé®;y¦ü•ŒPÅb8cll5 £–OÁn(ŠÑºÐ2Èv.…™ &<”JèXd8´\{Ó¨@XX!@B„„!!@r Ñ-Є¡@B„„!!@B-t!!@B„t!BB€ÿÙmod_perl-2.0.9/docs/user/handlers/filter_life_shower.jpg0000644€ÿÿÿÿ00010010000001102211727205031023554 0ustar ????????NoneÿØÿàJFIFHHÿþ&File written by Adobe Photoshop¨ 5.2ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ¨´"ÿÄÿÄ? !1AQ"a2q#B$Rr‘¡±ÁÑð&Sb3C„¢²ÒÿÄÿÄ1!AÿÚ ?ÃÎ~/ãlÅ™G—åv,•å‘Îù5X¶úh°·ß“eßxS›ñÑ—<ì^FKWr<ÖÆ¨yeóÞgÃ1L6±•¸+á‹Ϥ’à¶hˆH ìA#‘¨_•ê~T9Ô“@.í%ÛŠVžæ6hïk¢¥€†lÃnÅUb ú)Ræê²«Kº4ýRδý[òÕMn›ªµòù¦­H ”Fj”G7U”éE‰DT»Š¬)P8RŒÑ J–õZ‹¢¸ˆ¯!ñ¦‡%ÑR×é©®ÃðIŒO{‹Á}š"í÷s½[Ýy– ³¼øƒ2é8L5!ó¸O!Ž)4ÎÜF¡ò¿ºÈÄü@©©–l¯ ‰ÑÒÑK…Pf–?wÂcsîMÈò[°¶åkqó˜*ó q*|Ï+¥ò>ÌÊ—ÂÚw1Žv§5Ìo¤òG6 #·oƒ×Ë nh§h°~Ó=¸ýUIðC;s˜èO¹©Ÿÿ•É~Rg©ïóH7ßMC†ÿ@§üg<Îu®÷2!ë¨>g3Æ?‡»ßí3íÿŠ x#ã$³õtÓ_8.öø2qlðHÿ:ןթ•Rìg<Äoùeˆ»Ûí4=t.g\'5ìÎôðSG;©ô;šei:™yZÈ<•²ü¾ñ3)†Ucø{k(N— ê if“Æ™áôïÜßä®d¿pJL¿. œÍD‚idšz‰©ÅU<Úœ5ißæ6î_’2î ‡UTâKløDñþu†2VÔDÙôIŽÖ?< ùOÅl2Ë‹ðìAüSÔ¹ºd=™ ÙÇ~ö]ûms½ÏSïü—ŒçÏ¡®¦–·-FÊj·æÑÛD3¸[àôÞm°øO²×x}âœøm`Á³Tò¶&¿Êee@>e#¸Ñ6®YÀå¼cpòŠÔ9®uîëî.H­ü~ªê3DD@DDT)*-tX©½UJ–‹]TµDDDAñ঩ƒ6Á‰yM™ð:*é".±paÿú•ßx9Aó&=†Hc©¢sßxŽfoñÈáE'‡X‹òû3#¥‘–I ¡òÏšÚrí‹HæãÕknWá\­Â±LZ²¦šh¡–6[# \I¾xP§¢¥¦…Á1CDq±‘†µ­`e}‘±·Òù4*¸°[dDAÔÞ¶ú£Qý3o¢©k+²þˆ±Â« ¤”¸\ø?0yä¸,wÁê8bYR®| fñKŽžú­ê¿¿È…éåEå†Ôø¹åŒ>³Í8;†? ka|vlS´Þzp.»\m¶Æü6:Ú\ÙæÅ*±–˜±‘®‡™š Ú4Õ Ü4  v»v¸‘ô&yɸvsÁ~ÅVs²î¦« »©ßn}Úlo_k\|£‹aئ[Ä+0ZøÌ25ÀK‡Úúdù6=‰Ãá¦|®À1OÈÌДÿ³ÓI?Ň¼ßÔÃËÒûZÞäÒKËo{ŸUò&á›)éðI帬lò°éæpvƒµ4Ž<Ðqà;-ì~x‡[Y7ä®<Ù†+NçÃò´ê“@õG/ikõ¶û‹•¶¨o[qÓr¥Fhˆˆ$ ©µ•7²n‚Qj,DD´ñ¶8™`1‘-kE€X;+ä¸ÍÕ¸øU¬‰ T(ÍRâv°•Àøáå>sÃèãŠV™ŸšÏÆ¡þ›û´÷éûW~U$\ÛMÅ÷µ“êÇÄ¿á²SbÎÃq2h rê3 òwÜ–·w[‘nvè½~/b™ÃÃq,>¬Ócø<°ÃQŒ1¦HjáMÅ(nèÝ»ƒšoeÜøð,ÇW†TUÈú:ÇÏgTSÁ©óÆ-xÉjÛbxߥ×]‚ÒQáØe=LÊjJvÅ{5­¹?Ry$îI7ÝZÔ^|óSÎé\\úsñ¶à–vsmÇr=ÕùñZfI+N¦Ý¡›êÕš¹ý6;¶ÆþþË“ lò‰$g¤›ýjø¼ÜR¦©ÿšR¶8ÿÔ”“û•ÊD\‘ÃÇé~ÿEzž²ž¬;ÈœK£â–¢/""ÔD@DD#áV¨…Z T*VhˆŠ" "" LF‚ F•Ôõ &3½Ú}M=ÞÄwZjc5 û,ïd³3g>!`î×ì{ê·uõ?e£{À»égÌ­]$l§¹”ÞA»‡º•¸Ì§¦ó !¼‹¬·¤[§c²VI gãøƒz•H{Ù8uØï…ÇðžÅEdæ  Tú@:Žüx%C˜c9¤_#o¢Õb8¬Â°aÑEUйÁ¯uÙLÃ{>SÐvhÝÖÚÀ#®l-m#b5SÊ ©ènpzžëØÁ;¸ñ°$j•˜…%<OWöІ XÂIøѸ`¶Ú·êw+?ÁcÃ!‘ÏžjªÊ‹:ª®që•ÂöƒEΖ…öÜ’oɻߢÔtµ1ÕÀ%ƒ±Zzƒî¯X‚ÑÁ$”Uш÷lÎ s{û­ç÷óDªK½A-ÕÙÝU\ž,ˆ€ˆˆ1£vÊà7TCð«ˆ$)P£4DDD@K‘b6ÞǪ",rYƒcBŒ¶ïŠ0öêmƒµrëõáE<òºÔG#d:´úíìîÀôù-®cÃ!¯¢d®dôî×ñ½‹©,ïÀ:zé·6ZcQ’V6Áh Ä ‰ßvæÄ‘÷c…ÜÞÞ¦óu+sÍMª¦mL.òš×j¾ñ*=…ÀèùGèð9w@vxF Fi)šóy ’Ë+µI3Ýk½î;¹ÆÜü€° pÚ\3‚‚ŽAMtÇš7ÞÃß›ÜÜÜ’MÊÎꈼ-m¿j±Pø ˆÉ+¬ÑÖö¿õ>Ê*+ ¡ÓTH“o—=9Z÷ÓÕÔÕÇUW^X¾ªSb[Æ—jêE¿z 0‡âGR\Dnk„-nÎnûÝb=ÂÝÑÍçErA XØÜ ÎßEcËù—õu¿eˆú™)*TÖê…ÀZӿ먭Ýìš•,4Áùûª‘‹¦¤DDb³€¯Ž‹3u:%Æ•…'€¡#4DDD@DDâZÓbà^ÅrØ«é° ÄΑŒ¸{â$yqyæÝ 8[{»«ø­6dÁÝŒaâz—SÕ4ÝÒþǾ“×Ümc+_—4ÓcÕ?Ÿ6Hp¦°ÒMfIVM½UDdî!åܼ`ºš)m¶ÚZm­`:؃§ksÄPÕºÉH|rÆòÉ#-pèG÷qe¿¦«ø¸ýŠJéÇQºŽý7Vk1:z)>cøhä‹ëý칺ÌÙME==jᎦy„ |‡Ðמöýç¥ÂÏÃèq"®¢ª¦wUy¶ó)C˜ÚÛú£=]¹çb-Ù¾2ðøÆ,ù$ÅiSnESgµ¹€6 €²ÛÀóH%îòˆû¹whýßçý‚URÁ#F‘ªš/¤Ÿå¶íYQ¹ïh/hênÐ}½¹ý¨ŠÜÁ}V°<³¥û­MK…f Ü9‡QqÕ+ÿEƒŸä>«Ì ¥&žÎuCŽ’Yß·ÍgeÜ2JY%ªªç!Ò[ðì>{•bünZ} °ŽÊRÖã„Z®tDE +%ü5cÀ²Ñ.4¨p¥ZwE_@TŠ”fˆˆ€ˆˆ kó·*Q9\Ù•ÿÅ®¡­Ä˜Ò'Kfhü.<ƒØüû¯7Ä걊˜°Ù©æ¡ó"óžï,É¢1øß ìËÚá— nm×ÜJÀÅ0Ú|NÇ;^ ¸å‰Úd…ýÇrûˆ¸;'•çx 8e<4XÔt¯©Ð<ŒR8Æ™Zíìâ61’lŸ ¤¤¨–Š)ã”¶#÷`Éû{¹O‘ ›Æ)krä~UM+C4¥¡í:aŽRG­–ÿ–.ô“Á²´qÊZvIW1Ðn"k¨ØlÐw·aÑFµÞSÉù@ Ö}e¤†ß¾“°>㟢çñŒÚÇÈi(¤hí’ràM–†9qüÝ#` ¦t4œ9Ï:Zû×ä9ýâÎ~É`™M˜¼sº§‘Ž·!•î ÒøH'Ò~wè§±¹Â„ttºI*ƒ›¦V³Ì° hÝîwç÷‘›‚ø‚ú¼Â0¬[¨Â<Ÿ˜‰Ü™k€ÇØzmp7Øû\øþ/‹fL·¬­”RÉNç>a'îZ[ê#âym÷ãrºêÚ™ó–FÄ'§m#ë0èù¼÷y­Õvmô¶íÕfÞüô°{sxþdn~jW9ó¹§%áØÌðˆe¨kµµ¦ãS\XH¾û–“¿uÑ­W10«ýU˜x*èå.4¸8D"FjA²J”AV¤Ô©DMÕ%ÚT¢,ûÝU©Rˆ•U!ªªX+i¤§©²C#H{.“É9o Ÿí0a±>b,;3€ì5o¢èQ• h k°Ë¢ÆÄ))±9i+"lÔó°Ç$Ni ÿ|Ùe)âŒåì;Ȇ¯ cÌc{ žž+·Ëdš½ #áóy"ÖÜXùµ_YJúZ N'QG•ôÑ2"ukÐç:ÆG †½Î“kôwŠ55þbÂŽy!šž#R4ÈZÙÍÞÇŽÒÝ^“±°ºù¾’ãQ .Mu=8ÚaŽÂ™šÉÔדfê ÚÄÞÝ, vðï9~}K¬¥Vá” ‡ˆd…¯k,tHÁ,,uÏ~6ßÒÛéÛk …—„cÑe¼Vƒ?â’b-®ÁM#b„9µ-`lÄ’~p±"ä^Å{u L5´±UA#d‚f5ñH×ji¿¸!^¤Túº" hþZ³¶*è7K‚¶õU+i«JÈ¸Š–»UÕKQš""" """ ¥R¤ ”KÝYª¦Ž²ÓLÐøfiŽF³šv!|kˆc˜ófnYŠU–ЇR±že´5¦Å£¶_g=ÚZOaüÂøïÄ:cIâ>bÜœBY>v¡üU‹ÿ†ÞVtðßÉR´TÓ^ª€¼‚XI¸°± í-—Aà~j—ȩʦ¨«(uvɳ´zã;|MuíúÄt^Káæc9_;áØ‹å,¤{þÏUê!¦'ìK­Èi³­Ý¡w#a5ùwÆ S-‘.#\[VÊjs©âP- -†8\Üówv*«èWE­m `t¢µ Ž1ÜýÕíé½í°¿ì7DAD\röDY¸$©DYy àá¢"Ôfˆˆ€ˆˆˆ€ˆˆ$)DAKø²ñ¼ÅsnoŸÂëðøã©d~k*^ö–¹­ ôéiÚÍÙ,aðõNÇ1øÎ94íËiOð^§€å\,FcÂpèá¾ÎšÅÒ>ý ‰$þÛv²"+rÖ|@︻‘ÿÙmod_perl-2.0.9/docs/user/handlers/filter_logic.dia0000644€ÿÿÿÿ00010010000000443111727205032022327 0ustar ????????None‹í]]sâ8}ϯ èWZèÓ–†I¦v¦jª¦jfvk·÷™2àï›2¦Ó™‡ùí«k;06Ë¢F¤º+¡Ëµï9çJºßÿðe>‡Ù&J“Û!Ax8“yºˆ’åíð¿Ÿ~þ(‡?ÜÝ|¿ˆ‚ïô¿e¬úÉþº>äùú»ñøññÅO› O3G[´ ÇqŒu£ñðîf0Øí`äy¾&¯77»¬¹ø²æ²Ëš‹6ÓušåYå‡&gi‡ARZͳmØÝÎfÄ:ÄŽ¹eàÅ}”çé‰ÏÄ›s(Ÿþж×"w™E‹ãÀÝkÑÒËc´È¦_,]®²÷'K½Ž6Ñ,›>}”ä½uÿÔO÷õ»S°÷ËÛ £¡ì­U2¡x½<,·Ñ"Üœ³ý6-==TÍÆ§®z½Ý¹¦|ª&Ö…‰8x ³ªû_dzPÝàŠqv®B:û_8Ï+÷þ“É"ȃƒÓ/׬CçÑâvøO¼yêéÎ4ó\Ÿuú5ˆ(ò±DIÝëCÎh³0›Õ dÚ… YÆá³Ï#ÄŸ0<%FT§M¢›Å0WÓyš%‡‰A~V 9ôí™>EJà3°õFˇ¼ÝQÈW»ÞÍØ,ÍavÊ5Œ°ÄûÚÍ^”è5ݧˆ’ïá§›‰ÍCú8mÈÏÈf6¿±32‰)2òɈê‘É ˜€• ãåïúÖ «Ð4uì,hb¤ÓƇ´ MI¶KÄ24ÉU@q?×¶‡DjŠD޼‘×Y¯ÎÂ!GÂ`„Š ÁZ(µv D©U šùu \] † ‘=5ƶRÔ’½ Ì´ð£$œnò§8¬“íª ˆKÀ‘™ÂQ ÌFIiJ‚&& IFŠìª¢©WçÀQ+¼·GÏ"òöñh7\ÌáçzT‹÷ ’"ˆ]˜0Â=€ :‚¹e”9õæPBä{"BJ^aŠB€èuÄlª X)p‚ÉD„(Ó;b*Æž¹Ï%x]0éc’"N òmB’"æ ˆ¤¬Èð˜ÕÏÔ/—â]—xùÆ“÷X¬‹Xy/ªS½Kˆ—±gN¼œxuÁ¤4Æ$A̺xi#´/Hr ñ2õˉ×u‰—2г/^Ú ®Ä‹1$ð%ÄËÔ3'^N¼:­9›—ƒÈjTdU½d%% Iä%ÔËÐ/§^ïV½Â?£0ûUC´ 0ÆU>bå­MÓF0WtÄ5Xôo­`Üóañ–K¿k˜ÍÂ?§…#¯uï°•BzLÈ=Ö†èˆ޶Ñ*Gš]Ù $‚)DÁ¦ŒñÁ‡h|íU MÓ ËÒÇv«Ä°çi&ËãºY¯Ùâ¦&O*uG‹óTóÎ<×`ܰÎó+ƒ b(‘ÔhÍÓ¢cðòj½þµå½¬z¯h}ïsgíõJ3Æ%(T£Ç ç)³Î%W€SN=9ayžïÑM@‰¦ÙÁ†vI6‚¬áx3‘I´#˜z» ÙPކam†ŒRéJ¦Žw®˜wüoÊÆõ2æªzÞ‚ GžžÆ&ã’{"a­^i»s.,rG³ƒ í„Îc4νÓ8:Ñ•âKº4ÅÑE.¾mªÁ{XTâ¡}î’ã‚<+Aý ÕxcW¦˜²™gz×ЈØ©F ˆâè¨Ç˜CŒFž]êðK+¤ ØNCqÔá¨ãX:î°Ê~‹-ú–é¡·Í´Ã+²m…M$ìÇi2ï ë ›üïHÄ6Q4#Š^ˆ¢mCö0‡Aà¦ÙÂÀJÉñáJÂöyŠ©‚HñE×ÕxïMõXõœiŒšƒ ¼hãu¦K*óuýC4?Óó´uÓ ½i®êaõ@bTÌæ3nwý€0Z¯`eƒ¤`×ël÷’òK“…“_yzKü9 ¶É÷P±Ûæ¥ÝjR¥ê–D™¬{oŸ,~ÿHYX ‹Ã s4a•&ÌO¹ÂȳM }e F Tñ}įÑ[a‰Ã˜s,a•%ŒË5`ùˆ(Ä-o/¿È&¸‡á½}šømçÑZ{ñs缿$ŸÓyP¬;ö°1 9ŒEGVéø’±b×f’Á(â_“ ŽÞÍHäS´ MØH2bα„ÍEÊÍùXbF_)A­žšÆ…À,I¥$”Jóâoa.¸åµƒV?Û´î[­ ô$½»©be3å[.[ñ‹ .´!¨\‘”ƒ]ÑÙîU¯Tj1øýïX¼Ò‘Nb¬2‰qñ›‰¡<»õ+`jWà4Nú*W~I"7Ñeƒ&Âí¿]†è£Äm¤ì¸ ݽ¶åmžÑÁ֗䈇Áâæ·tÝ?ÝüK?åÃR­[-ú\Fa•/då9ž„{fwo/C "ƒJ1!°™ÍèÈÇWX¤s…Ž:¬R‡ê¡BGاJápå’:(‡ƒñu¼£ÉK”ìGv¨£å xz9%CŅ݃iùÝ;R‰â¬@(Þáð­<¶ 4tÏ}ÏÈ{=/°EnY/•n̾܂ÒVrËŠoqrë2õQèäÖ*u˜Ÿþ§– |Ø6w€=Ö÷¨f¸õ0¶{ûôñˆÂvíHÃFŽÞn)á<Ö(ÿ.¾þîfï›âïnþca…OM†mod_perl-2.0.9/docs/user/handlers/filter_logic.gif0000644€ÿÿÿÿ00010010000004266011727205031022344 0ustar ????????NoneGIF87a”÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMþþþKKKIIIGGGEEECCCAAAòòò???ððð===îîî;;;ììì999êêê777èèè555æææ333äää111âââ///ààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLJJJHHHFFF÷÷÷DDDõõõBBB@@@ñññ>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,”þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠùQJ¨“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H 媩ӧP£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­[³KßÊK·®Ý»xóêÝË·¯ß¿WãL¸°áÈ+^̸®àÆ#KžL¹²åËŒcÞ̹³çÏ C'Ö,º´éÓ¨S«Mzµë×°cËž¶5íÛ¸sëÞÚ6ïßÀƒ n×7ñãÈ“+_þÔ8óçУKGí|ºõëØ³#®®½»÷ïàÕþrO¾¼ùóPÇ£_Ͼ}tõîãËŸ¯>ýûøó—¶¯¿¿ÿÿñçʆhà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–¸!!] hÈa´èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6)¤ )ÀW†„¡Ë•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçlzå”[U‰çŸ€*è „j衈&ªè¢€êÉ•ŠV2*餔Vj饘fªé¦yîÙ•Ÿœ†*ꨤ–jꩨêèV¦êê«þ°Æ*무ºªV­Öªë®¼öê믙ޚU®Àkì±È&«,—ÂbEì²ÐF+í´ÔZÚl`R~iµÜvëí·à¢y­Uφkî¹è¦›ì¸U•«î»ðÆ+ï¨ìRåî¼øæ«ï¾zJå¶ü,ðÀ“YïT÷¬ð Ï{°T 7,ñÄSûpTW¬ñÆïzqzÙþÛñÈ$— ëÇÍ…Ü'À&·ìòË”¢ìTÆ0×lóÍsÊÜÍ8÷ìóÏbêì Ï@môÏB}ôÒL·œ´ÊZÚôÔT¿ü4ŸQ³\õÖ\S|µ¶]‡-6Ã_‹<öÙhë[öÊi·í¶ºkgýöÜtwwVR×­÷þÞÇÞUÞ|.x­~_øàµqÌÚ žváV{T-€ð2yØW%ùæ°¾qÊ;qA‰3 WÝ9UŸ§þ*3h!.¸ã:Ó«OÕúí®òâG,xÄGðtîRín¼«Øp2Ž@ç” õò.#•òÔ§ZDF¤Ç-‚!éƒÌ±…øÙk=TØSÌ‹æÁŽ hÂ-Ëœ€©ñ£ˆÐ…°@Ž;¨1„y òX@1ƒ`ã‚JÈ • ”` °G„¡±õ=¥}+ÂÜGhÂ8HF8‚<Ør€ƒÎQŽo(áþ¡˜Ää±…vKòhÄ |ð¼„è×8šq-QÑŠUÓjPŒnÔ#!õ0C2dQ HÀê¨ü¦Õ„A˜ÇÇ1’Žhä  ØÙüÅ6†-°Á7¢‡/BDßð $°ô+ìÈ@Yz0!¤ÀD`‚v@—(Bš®q-‘Ò”¥</¦€Ž,¢¤ˆÅ1¾AÃÈ ¤˜À’p,_¨ã0ȆAð#xð ¨;–ù†f:ó ¼À'V!-ÐÁ f&þ€:™Ð)(T×Ô1DÃ±Š‹t €P‡4|q¥ ¡GþH”ÁŒ+Ä!‘ø„ ŒÐZ ¤½Á ¨Ñ+_¼a8pAÚ¡„SHÂYøA–€Ì@¦ ‚4Þ db8p‚ ¢,È ÅÓ•1±‰]n r°&ÀŽ+h´MO8C2A‹t$©h@Lóõͦ„Ó\køD0 J#€‚‹Ó²‡ ¼ sf°dÈ*|X‚b ^ú‚ B>ìJö°À)’qÍÙÍ F|0ÁŠ› ¥§`ÄÖx§.(À@XÇ@ì ƒFT_MuÅS½ŽLLC€Ó@Þ A1ã™°…þ,gItU?˜þƒ È0,”‚—ýÒ4qM7\ °¾âEa CžÃä@/è¡‚µ $!0€Yõq(‚4¬G00ð…xev³Ôú 0t @ÀE”7 0ƒx „ è„Q.Ôöe!¶qØ@cYÒÀ@3¼‡ŠÜŠÊÃ@–1‰,Xê ‰€…a¡‚¥žë»Ó —5$¡„¨a|p$¥ˆ‘HT ÏØ/35…”C ` :È$Ž\äs :F<:Lâ§™*B$( €llBœ"Æ ^`T¬#Ü@†Óõð` npAJË©"âεƒ*þW)bl‚0‚þ  &d”€h`›¥¥äÌÀT<Ðd4  @ÕqeÔÃ{0ה͌D÷“¬@€(MÅ‹¬‚†¿„ˆ5 H¶°¨Ã™Àa<ˆâ áêƒQÑWJí™ áÁæ\*r˜¢¯ËPĤíÆG¹k€ƒ@¾Q TÃ* Xí5,`ŒDñ!y…|ÓD¬šËÝc™ÕLÀ<õ¬œq ÚÀ  5´Ý-_0B B"¸<«$<¢³ÛÄ®% U ÐØrm+ ÞŽµÌÃü|?|ÕÄ‘Èa9³u\&íÔP=Ö-Õ®@ÉvÑ›¢ÖjÂÖcòϺ`ÑMÑd]×eÓP1Ëv¢Ò¼ÁÒ˜Â×»á×gغ!Øa×1=×3m׌=Ðf½Ó#ìÍi ΚRÔ¼qÔhbÙ»ÙAãÒ'„ÎL­ØbÝØ¤-Ífí TÄ¢bÏX½ÏUíÄIíkcÖ¥]ÛÓlÖh]'n)»}&½ &p-×®@×¶]ÜÎlÖz]'„†])ËÍM&Ïþ}Ñí%ˆÓÄmÜÚÌmÆs¢ÙºÁÙ–Þ¹!ÞeBÞ¸aÞ_ס=Ü‹]Ü:°ÝÔŒ×P‘Ú…<*¬½Õ®­ÚââÙà„δ½Ñ%@ R@ ¤pÒœÌ< ¥Û Öí¿À>DZ]“c"ÜٽѤ Ñ-ÐàôýÑ´,ÒWLÒ¢2Ý´QÝb‚ⳡâÌâßNÓØýÞÝáÉì ½*`€Ì@ 8°Ì @N `×ÝÍ’ÝÆ”)è}ê=&ONQÞ%ìmÃë\Ó6žÌ¶ÐQ 0 Ì[žÌNÚ§mßúŒßZ=YýÚn½J-&ÎÑc~Ì[^çu~ÌeÞØþ~ÄÉ‘Äþç ÉÞßΟŽÀYNÓy~çbÎÌ{ÎØÈ ÒqÂâ²áâ‹bé±é_¢é°ÁéYrÝP±á5¾ÌŽžÌy20fâ×ìÝr2å³QåŒ"ë²Aë`bë±ëZrå£Nã=àž& uÐ $pÌ¡@à>Él0 €_u}æõ¼æÂÏnÞ&ùÍæþ ãšàQAêò]Ü}¾Ð‚®Ä…Þ&¿½ÞäþTìé^Û“>â,Á$¾Å&Þ&žþ Ž%¢¾è÷nÜIÎÓKÇMŽ)º¼î%ÿOðóÚXÞÔ¯ÝÚn'áÞíVýílòñÁÁþÕí"–_M&s¾ñøîêgýàºýîœï*/óeÜŠ®ñ,oÛù¾×ýþÅÿÎ)ïž?oËA/ч£c’Øî=Ú;ä.Ùg¼ðÛÜð—2ñ®Qñ\¢õ«Áõºàëõ|îò¨½í"¿)$mÎßå¼ô;Ûçnïd?ÖëáíèÈèž÷° ç²mÀ9/Úußê9Ü |ôºœôš2ô«Qô[âøªù¯ó…/õ9MõßmõãŒõãÍù>íùç úB-úò÷»ÔOø—ùôìñÜ^ò!ïök²ö¿aòö‚òç Ös’ðûÀüÂ?üÄ_üÆüÈŸüÊÿû –Ó¹þM'4?)Ñ/ç6Ô€á‚ÿë¼ýqø”nÁŠïËŒŸ)’Ÿ¯%å”ñeâôMðß«¯Ó°'^¯`_(÷ŸùŸ%ûÑc.‚ DHЃ+† >l@(ˆ “P£® M,~RäH’%M2ܘRåAdkN¾„S¦É•5mÞTÙræNž=Oâ\©ÓçP¢E"\xR"Å“q…Uæ€(GJÅš5¤3NV½~E¨UìX†\Á&$›«Y°IM.}éôæ_jíE¢î¬JnœîþåÉ^Â8ûFSpa‚‡?.¹¸íK¸M3ÞDòf‘¶0þN¨ gÒ‚F­QtiÖO3^ݺõë¯nKV6)×fGÙ²S³tÙ»õoâ… / ú8rÎgm“Ä]RwM楩'X3[쩵oæ^ø;äðVŸŒNrúJºãçÅîØý_ÉÝAËŸo·>aüùÓî7²‰âºÌ¦Ìü»Ë3ìbC0-Úì+ŒÁÇzp/ 'Ԫ£Î)½‘ÖS‰·‡&y¥DOD1EWd±E_„ÅI ên9†Ž(Gwä±G2H!‡ìq!dÌFWˆ!²I'Ÿ„òI#R.8‡˜Œ2K-·$rJ‡œ©Ü ¤®¢¸D3M4_yè:ì*ÂQM9çlþÒKWÊCò¬Š°¤³O?w´O=!âóOCé ´«É”Ð2œÚ{èL¡´RK/Å4SM7å´SO?=„Øt¾âúsG3¢`µUW_…5VYg¥µV[oeÕì0ϯPerU\‡%¶XcmÕaW‡z X„=6Zi§5Y^[ô­FÇÄéÀH8„ZqÇ–QR°¸ S}–\wßµUW;5ôÕªuƒ…7_}[µÖµ`í!|÷%ØÝ~¢'CòP$SÑ¡3Ã-¸âiÍ%õKì”TÕb£•÷ÈzÁRràOÆõ` +¹]”_®Uå†ÀdTLéÈ\É¢‰aæ9VŒÛþ¬êMˆ:î¹èVCnHБ¯"Ôe£‹–Yé¯ötúiž£V´¶0 |´®o)¶æŸKÕëT¿":l˜‘fˆÙ¥orZµQ–Ùm¯âž溱պf®1Óìë¼Q»¡t‰[7íÁ=fÛ•„ß®éÞª¯XæÇí øÊÉ)'ØòûÖÖfõpÑ#Á9¯¸ð™7¶²!ÅQß·q” ·ªe¹a×WæÙYn!“qÏ]Y*³½mÛ›Ÿ2\à÷UÝ7‹ƒsóåÉm\jÚU¢úöéÉŵì·Ï·{â¡3~ô®!Ú|w›7•8T_WŸÚÆí¾~#¼ãç^ø¶ùæïl͵Ç_´öF³ÐýÍ@“˜òþH­æî7‰“Þ‹Õ¸ËÕ/4™kÈï$x,ÏFrÜà°:8>ô”ïC¤ƒ˜é¶«y®¨QïØÂÆK«³ MlWCÞpw„Ù!‹¥;’°C&t 7¢3 WÍ{q¢GCµuâ±»¡õr–¦Q1lVÜ—øó=Ø1x‰"`ñDwÂóuf„ûÊæ>ÿ¹.‚Çú„HA S à äj¯µE›Üo\yÜcÿ8®@žqYüÛ‹!Å…H>úa¼!ýj²04,$Ûˆ·Vè.J*ò’ùjàgÔ…ÁÝñX¤hU:qÊ|Qðs„LÉßKVÉ’–ða„Xþ¹$W‹—Qð%#19¯[ÈoŽºIÄ’>r3™âjdÏ5¼âp¬˜Å:fJÁª*„`+x 3R¼À®‚€)Rp Ed^²+".SÄjºjœQ(ç9Óéªu¶ó­Šç<ë¹L‘Q†¤V8ÿPtª“î„§<éiÏw1ä[c‘‡¾&ŽK¢ä4gE zу²*¡Õƒ½¡}“X¼„.À*M˜£Uø¬œñ‚V1€­Ê@0é-êSdìgrºÓ(ôô§A}ÕP‹zTV%•¡IËšxº¸KVM•§>eP…JTV©Ju$X?ZÂ~R‰Ô(Ý…þSžõªkÝê[cºÍ†´ï7ï³é°p@ TdlLØc"3PVÈs€á8biYŠxXpzÂ[9‹I¾½¸†8ˆ;ÌCa2?ZÄ6D5”C‹¡;õK6öÃ;È3–EtC8´ŽzÁÔÑ>“¿K¬pˆ‚XƒcŠ€ h„ŒR¨FòRx@WñR ‚=âö²A£‡€ù!?Á?EÅR<ÅVIÅUlE„Ò¨…Š‚XœÅV©Å[$…\ô°]œ2_¤–ÅS²“›¿(FSDEUdEW„©g”EX™F\ÔE^ÔÆiáFÑc¹¯Ãž—ERGd$Çet©f„Åtþ|•u¬ÆvÌÆ_”ø“³PBr rX(à%ЀVÑEh+®Z3¸bMä°Wé‚õJ.F4Ê<|B†tHˆd‰¤H‹Œ·ê*TÉXáÄl•ÜF£Dœ•@ɇŒÈ‰d•мHÁjŽ,EX±IVÁIxÔIÆ›DóY6K\ȆÊ•Ê( Ê—ÄH¯:JY©IɃ AÕKÃa $Q06˜ÉBl®ýÚH°Œ•Nxƒ(—¼ÚëÉ(PK¶ä%·d¸Œ‚õò0WAJNŒ»ÄK½Ìɨ+ ¿¤ËÀlËW1LÄŒ‚[̺¼Ë¼$¼‰ „ˆ ¬ˆ <ˆþ- ¾ZI˵¼LWÉL¹œIXaLÇÍ‹>UBãûÆZ ®ÁÄ̸¼®¯¤ÉX ƒx²4ØËæS>?ìÍIøMV!Ì(ˆÍáœËâ„•ãLÎÐdNDü90„ÎëœÎêT0â¤MãDNPÎÈô—*œ¾+´À,<ˆë[MEôMñ ÎÔÍÎÌÎô\O²|³íKî»ÄWá¥èJ—T36SLº4°7…q?©Æ¿lÐ(@P¤RP»² =ÏPîD?%o,Ð ÍЮÚÐ#3ÏWaÌ(—x”D»£ÄÇs#´4PVIÑ5[ÑmQWyÑ QÜ|³(ú š# Nè*Rh³F@þRh~Ä6acµP ="…h°Å=‚‡W9ƒhØ }J©3ÉZaR']3(m)¥R+ ¶U›4-åR/e0¥Æ1u•2=Seªc”ï–6}Ò(Ò*u•:Õ6<Ý#=>S25ÓMSy¤«–S‰ ¾ ”D}SEÓFͶ,ÝÒHýÒ0%?m@—Ô3›³\g0Ìå”L©£ÌűÕüÉÕHRÂù{š^ÅÔ_ÕTãÔ”PMP¥be Ü4;ZžD0êéN©[>Ü¡V_mO44ÔéÙÖbíÖ•ÛTzL!ªÜžp}ÖE‡`½Å1S˜†Ð4ÑÌ«ÐÁ‰×yþ­WAå&ÄûVÜÙWz×íºy$½zDWàØ~5R ™9iM»L¹5=¿Aõ¼€e>’$Wd5×ðT.”¼²œU…L:¾\»]Å7Ñ´ •u7–ݤõ“ÊZØš+»U’XÀ»VœËÖ‹E„ûŠžµ½=V+LÖ OfÅ7¾#}º Ź|ý7ý ©]Ù`ìX£ýXp¿½Ó7$õŽœm=Š8‹ZŽõ9{ºÐ«ÑÑ»ÑÒ«Ùì{3¦‹-±]8”ÕÕ`}:û£BvÓÛµíÛ¬}Ï£Õˆe}?hÅY“º:ÄVçÜÛH ZÇÜC„JÙšHÚÃe×S܃Z³Ú—ÅZ€UÛþ­݃-ׄM‰®E½¯³$µÛÎ ÿ[;³=°a[°°]ÙµšÜM™e£©ÌÑÀ§‘U:ŠÝM»Å(°ZC\)Ò{ ܼåÉ[ù„åmÞ祕轕éí¨êÖëU^R`^ç½ïµð5ñ-ÚÁÝZß[. œ–ì5ßíM_ba_r¹ÙÝLÞM4±PÈ—ÅÕqm\òà`x!`öüYçÓØmÃ~—vJÊE]U]¤Í;ú–l‚ v Іâ>¿;>u•T`•Å<˜R^‚Fuì…P(€Vj$x—ϸеÏVaá(pa€á=b•Ⱦþáf•Ž,nß{59fÍnáŽá%HZtbÖa¦bn5Ø÷…8êÑ^ Ž‚">â$–á/–Æ0†b%cs݈íÜcɦH°€ i€Ž´¶”Ò»B-[,â(dA&äµ9DVdk5GžH¶PId~äBö8L^äMvÏ4†ÏÓ”OƒÙúdÁV™dQ®du•CŽ‚D>åm›[ü6ÖW¹óUBxÍ ÒëœÍ¤¤4÷…½¿–a¶acvdVf ' gNBO–i.æc–Ž<¦l^°ÏR Ò|Ó„Ô4Ãfb¦æ³eó4gìþBÝ| ÞĦYAJrnQm>ÆåYÉý`çX)ç]&¢íCoÆN…NhR¾f6Èýݨ ÞJlãA”è¶äe¶húDÎu×fèVi{v2êµâð3Qj!àépré,#Ѫ郞hŠiœ~éðéÊuÛËu¹¸õh ^iej|v°ÍØ“æV±ßÀW9T%…ëVQk¶vë*ÆØœkW©k­æj½Ž¾k²6k´ì¶~k3. N¶ uvv¾ˆV.ˆþWVZZYì»nì¯æê¾þëÉìµ¶ìõ!Yäíã‰5ÖgNì‚Y pÙtËít^‘¥Y3Ôgîâç§uhsÚ…Ãh̹íjî˜ÕhàæèfÛ9¦=áÿu7 67!¾ºÓ= ïN9ðn[„}[…íèá†XÊ£ê½kœÛÝ©%ÛNŽ`ŸÍìTÖ=5ŽÏ6²n›íÔîtÃ[œÛíï®ín®ï³}$ü¦@ýfeåî…ëß}pq#h[î‚‹n ÈpùÆ`4ÎïUngÐ&ˆÌõÚÍí» ÿ>òîîžV<÷ ñ"ªÍhËÝhío¹]ïøkoäF[¹Npæžo¯ˆï«ýqopÿþlþ>½ëþï_VñËãæK+ðñ>ð»æ¿òÍþíä îô–pÄõßÙÖÙ¸7r†»çÞ  ÷íéöòêf.S„:·ó;Çó<×ó=çó>÷ó?tI0…’NñÊ£@ôDWôEgôFwôG‡ôH—ôIGôq€ñk™C§ôMçôN÷tI·ô¢îƦÑôO7õSGõGuFòÒtðgã:”YW“#}ݰ­[ך¶Æ5-]ÕbV&Sw :»{ìtj—¢1ºœ/ɉmXu®×'¼5!j­NôÖ«Ò½o JcR¤l!þ<ãUE+¬ðÂ!Beì ~åI/)¨`CAurKg¤`jŸØ¢É*)¬ uÉfèÖ²ÛUù¡NîëÕ¤ëm:sJªâ+ÓÍ8Ÿ¤ó[•öŠÔ H}+”&æÅÁD9ó‚P¶´…40ÕBPG#]–*h-wør£>¾ê³M²¢íÕÎyáºvJ»6¹ FÅ)y“bJ@AÃ))ŒÂƒÁQÖ@-ÃP‰ÿ¥@Sºì&»Žº·MÑ®‡9MÚ¶í,ç8%ÇíR¤„qÔá@Ñb(€å¸áY_-;P­ åÂ×* ä¹Léf´®FíºônèÉ«ž¾Å[Ôïç$%¯þI•uü݇ùJeÊÒ˜Í|É-ù˜Ë’ Nò%<*Ï‹xS$Ït2G§Ìh>ô™$ cõ,z&seT çVºbLq& TgmZ@œº„*EÓ;êÒZ¤þ£!±g ñ‰ Pd*JSþ¨Ö”*D´inr”ž!ùCÑ5>Ô%c5ãD]1ЪR£BÝæK»ŠRc†L#ÅfYKrW‘¦”­bé[·×¢zU"àä#M‘£Sò‹…^cGò¯gè ²–½,f3«ÙÍr¶³žý,hu0 kFö!Z­W 3LÎR©Á*ô°ú9Ø*O¶!y`Ar«ÛÝò¶·¾ý-pƒ+Üáa‹Ëi)’ÚŠU"`u¨Xgݼ†ä¬bL+6ö Ýír·»Þý.xÃ+Þñ’·¼Ý•.-‘[I0‚N™uÏ^©ëÑøÂט'Ir²\Š47"þ‡]cbƒóXå•¶m.^%ràÐ%8¿ ÙïB ¤òѵ©¡mñl»3 ‡NÃá0ç4ì`„@8!ý…ÈsgÙPËW"ÖbZ3ÙR¸•¹fÏ3ßK&ú¶ÇöÅk^L äޭו2ù¯œn„¢Ð ƒ“å'GyÊR®2–©¬å+oÙÊ^Î2—Ãüå.ƒyÌbÆr‚ñÅä2³™Ìn>ó›Í,ç6ùÎs¦rš!²æ8ÓùÎvî3 ù,è?ãy’lš\³b‚„¸bb(E£iH;šÒ’®ô¤3éM_ºÓ–þ´¦=jPsšÔ¢Æ´…E$‡¬v…«[ýêXÃzÖ¶þ–5®kkZóúÖºþu¯wíë`ûÖ¶Öª…­ìb/›ØÎ6´›mfS;ÖÇ~H²«=ígK»ÛÚö6·¿­kY¡2‰ÂtQ„*¤{Ýíf·ºáíîx¿»Þô¾÷¼ó-ï}Û[ßýæ7¾îï{÷¸à?8®pBŽ˜ ƒµñÂ#.ñ‰S¼â¿øC.#äÄÿ8ÈC.ò‘“¼ÅwÇâñ’³¼å.9ÌcŽßrÃTæ6¿9Îs®óˆŸ<åYù΃.ô¡½èÙ¤¹\®ô¥3½éJïùÃù{c§S½êV¿z¡^c©c½ë^ÿ:Ø›©õD‡½ìf?;ÚE3öV¥½ínþ;Üu±ö$ƽîv¿»ÓçnI¼ó½ï~·¹ÞÙû÷Á¾ð¼‘ ¯øÅ3^¾ˆ7wã#/ùÉãëñ5§<æ3¯ùÔX>é›ÿ<èCO’ΫVô¦?=èIqÔ³¾õ‘W=×]/ûÙÿö¦=îswÛ›xêºÿ=ð—ÎûŽû>øÆ?~·¯òâ#¿ùÎg¹òÎüçS¿ú;ËŠœè»èÖÿ>øW ˆ¡Ú ÷½þõ³_4%Èí7, Œ vë·o?þó¿ž÷£b Çz1 ÛéŸ`\|L ؃„`1+‘^ º €# =AAŒC$ÁTþ¤ßôe ²ßv Bȃh€1Ò] Þ zPEÀD9XÂÀ„ ßü// 0C01Cà C42<3D38ÃL4T4HÃPCXƒ5l6t6|ÁpC„7ŒÁ€CˆÃ9¤9¬:´A¨Ã¼;ÄA¸ÃÀCȃ<Ü=ä=hWð€ôÁøüÁ @ À  $@‚‚!0À!4"8€$Â(‚"@,B J2áF!ƒbáv!þ†áš!®ajÃÊ!ÞažÁú! b!²Ã!*"#>b$ÚÃ$Vâ%j"'z"(Šb)žb*Ú<‚EÄ„\2Q îKT&x@&|ÀhlBp'ˆ@'Œ€' |B ”(€‚ „ ˆ  À(‹ ”B)¬€)° œÂ)´*¸@*¼À ¨ ¬B °+È@+ÌÀ ¼Â+Ô,Ø@,Ä ÈÐBä€-èÀ-ð€Ræ‚ìôB/Á/A0 ƒlå10A28Á2,4ƒ<Ã3PA4XÁ4`[Vƒ\pA6xÁ6€A7tþƒ|„ƒôå8 A9¨œ¤ƒ¬Ã:ÀA;ÈÁ;ÐcƃÌÃ<àA=èq]&ff¦fn&gêV,Ä"ÜAD„æhŠfHl4ÂL€#PÀ#T$X@$DÂH‚$`À$d%h@%l€%pÀ%\B dA"¤B6¤CBäDV$F†‚FräGRÐHšBIž¤J²äKÂ@LΤMâäNÂBO¥PåQ&åR6åSJ%UV%Vj¥tåW‚åX–%Zª%[b[Âå\Öå]æå^ú%`&afb.fc>fdR¦ev&ƒ6¨ƒêV`„<àAAÈÁeÌÜ? žK´Áƒv¨‡~(ˆþr¦èA=àÁ<ØA<ăc¾ƒ´C;ÀÁ:¸A:°œƒ”ŒÃ8ôe8Á7|ƒtlÃ6xA6pÁ5hT[NƒXA4PÁ3HA34,ƒ$0Á1le1  ƒüÂ/A/Á.ø€ä‚RÞÂ-è€-ä-àÈ Ă €g ¼N¶B+È+ÄÀ*h§*¼@*¸* B œ‚IRç ”Â#Ä5œ@DTê¥ZjH@ˆvª§~*¨ú‰â‰¢èж(ŒÆèŒÚ(Žî(úh©‘"i’2)8i”N)•^i–r©—~©˜’陦é.¬©›ò@œÎiþÞižîiŸþ©$XÄXB:¼?"Z’Dx&t@pr€%l@%h€PBL`€$\ÀlZ€@B<8‚#L@#H#D@,èâ<@"8"4À!‚(!$*"‚ À€øÁôX"ÀØCÐ=Ü<Ô<ÌÁ¸C°C!¾:´:¬9˜Cȃ8”8Œ7ÌapÃhCt6l5d5PÃHC@CN3D3<Á(C Ã(cÃÃ0 /øBð°9‚àŒþ ˆÂ „‚ €BE~‚DzÂt‚pBlh‚Af¸Š+¹škºª+»¾k¼Òk½Þ«¾òë¿ò¢ÀìÁ*,,6,ÄJì T,)bìÆv,ÈŠ,Éš,Ê®lËÂÃËÊ,ÍÚ,ήÎöìÏ -Ñ-Ò*mÓ>mÔNmÕ†aÖn­2x-ØÃØ–íÙ¦-ÛºmÎqXiDÄ"]é#÷`@$ÐFœCAÜÂÐ ·Ú`÷®/ûm\À@à¨AAð@” ö®ûîoø€O¸Â\„Гò¯;Ÿ&&@Â8ØÃ¦/@.0ßèÖ/þý¡VÔÝ_pðm0¨]þÆ ·pîeÂ0#ç­°»° »6$GÞ0à·X°CqÛý0u‘@ Ì€LÞB@&C âõñóÉ‚z±|¥€Lp±Ý™Ã5 át@YxqèB tör( ÃK ±[&€B3|B?懆 \d3\$?d1 ÷žÁ™±CÌ Œ€ œ@*<'ôñE Ü çCrLX2èÀ ð‚C€Â%w&¿E(—…(8„2rh1uY²*ø‚Cü@$@*¿5ÀÇð@ ˜+ÜïC(€(|B $À,c(äAþ#tò'c](;‚E®€;<"+2#;2$ƒ‚$Ã…%˜²C±.d(Ô@DŒA2¨€°¸ 8‚C œ€&Àè 2ñrDìA ”B&üÁÛVrßA)ÌàCÜ@è0œÂC<„#êyò(0ƒ.x2L ³ÑÍò˜ÂC´ò+Dz>G(C4D¼ ÆÂª€CTB<ÄÀ†Z°†nqHðÂ8&È2ßùB(\èCx´GBD´ÂBëBx2DQµG„Dß±/D‚(” ÐÂCг=ã3MstHxôFŸ²C ÃE^¤( ³H¨r^Y2Ÿ½©»9èqq# €k›üåc¾HDº*d~ê?dO…ܯ~܇DìÓþT¾ß;D)$0¬@Î;>ð‡Ä`kýì«þChþî;Äa§7èË9äŸ%{ôðoÁ+À½D÷«CÄ.°üÓ“z¤;·ì§<îG„öC„ø—¿Ðß¼VÏÁ4B@Ä ´lG½.øâC(C"8„o;p7@ðÒ5à@P¢@p!‚ A°È(„1fÔ¸þ‘cGA†9’dÉ‹\¥T¹’¥JBµ”ÉÒP“7qæÔ¹“'AMÍ. tjAD+Lpâᩉ. œ€•©àŸSŸ8i€6ðiÔ©­(1jÁ®R©üa¡T‰MÄqÑ T fÏ~å mÕ«Y·êZÛöm\]ø‚JãqßgrrrHW™dš ¶zu‘)P)¤€ §GÀº3ªT§^Ÿž ´ŠUë^¯ivþ:òäÊ—¶ñÉD m=‘'W¾œ9N”3¡¿Œ }fÍæ×±gמâvïßÁ‡?ž|yŽÏ©·”ž^¦uóïáÇÙ]~}û÷ñç×ß=þ{—0ý£É¦ý,ð:N–ålÐÁ!ñÀÐCMTÑEmÔÑG!TÒI)­ÔÒK1ÍTÓM9íÔÓOA UÔQI-ÕÔMaàÑAUmÕÕWaUÖYi­ÕÖ[qÍU×]yíÕ×_ ÖUV…-ÖØc‘×MVÙe™mÖÙg¡e–Øh©­ÖÚk±ÍVÛm¹í6P6½ WÜqÉ-×ÜsÑ=vÚtÙm×ÝwáW^]××Þ{ñÍWß}«­—ßXà fÉß‚NXá…¶öà†!ŽXâ‰)nõáŠ1ÎXã ¾˜ãAYdr=Ùä“QNÙØ’UnÙå—a¶å˜i®Ùæ”g¾Yçy–8çžZè}Ú裑6·è¤™nÚéh_ŠZê©©®Ú꫱ÎZë­¹îÚë¯Á[ì±É.Ûì³ÑN[íµÙnÛí·áŽÛí€;mod_perl-2.0.9/docs/user/handlers/filter_logic.png0000644€ÿÿÿÿ00010010000005125211727205031022360 0ustar ????????None‰PNG  IHDR” œv¥sBITÛáOà pHYsÐй‹çŸ IDATxœíÝy\éÿ?ðë´+‘%£,11v•Jcß&  ëCÙI„rLIBšL’d0†ìk¢±Í”dlc«Œ%EÒ¢};¿?îïçüš6Õ}Ÿs®ëôzþ1Ó}Î龚û}yŸs^çºoB€)"BH§Núõë§è‘ÀçíÚµKDqpp Tô`àóD"‘Š¢Ç5ƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cм£ÆçÉ<ˆŽŽj(u‡ššÚŒ3jù\>;ŽŽŽnÔ¨‘‘‘Ÿ_P)¦yBŒŒŒŒyþ€ºFOO¯ÖÏEæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó^qqñ Aƒ~üñÇÿýWÑc%„æ ¼[·nýý÷ßÛ·o777·µµ½xñbII‰¢ÊÍ@xýúõ»råÊÔ©S544._¾|PôÐ@ yÈ„™™™¿¿ÿ£GÖ¯_ß¶mÛ—/_®[·®k×®óæÍ‹‰‰Qôè€mhÞ2Ô¸qãE‹ÅÄÄ=ztøðáEEE¿ýö›µµõÀ8››«è“мdNEEeÈ!‡ŠuttlÚ´é½{÷/^ܹsgWW×øøxEƒæ ?­[·vss{øða`` ¥¥ezzz@@€¥¥åwß}wöìÙââbE°b)))§OŸ¾}ûöëׯ©$@¢¦è€üp_xVQÁ+6y{ñâEZZZRRÒ»wï’’’¸¹¹¹zzzéééjjj‘‘‘‘‘‘5:v옙™™¢Ç[ÖßÿmggÇ݉D7nþ?¥oèëë«««+v´Ê§°°0))éíÿ$&&&&&¾{÷®¨¨ˆ{€D")ÿ,uuuCCCîè´hÑBKKK¾Ã™@óV*ùùùïß¿÷î]rr2÷_îw;55•{Û¤ªªªò_Ü nz¶lÙ’»Ñ¢E‹æÍ›ã_äêKOOòäÉãÇ?~ÌݨúKæÜ?ÁmÚ´Ù°aC­;wHHH»vízõêU»UÓÓÓ9rdRRWQ©©©©©©=*ÿH•&Mš”éèÒÛúúúxíøY×®]»yóæëׯ¹n’’Ra{® 4oÞ¼U«V]ºt177733kÕª•P¿äÍ›mŸ>}нsçNLLÌÝ»w“““«x°H$RQQ))))..®ìÃÏäää»wï–â_|Ѿ}ûÖ­[[XX˜››wîÜYUUU°?ƒqÅÅÅ÷îÝ»qãÆµk×=zTþ(¨¨¨tëÖ­tKkÚ´éµk×BBBrrr´´´–-[¶dÉMMÍZÁÇÇÇÚÚºLK®þƪYZZ8p€»]RR’ššÊ5ré Éÿ“ò?÷ïß/ÿ{êÕ«×¹sçnÿÓ¹sgšÿ­Ê¦¨¨èáÇ·oßŽŠŠº}ûö«W¯Ê<@UUµyóæ†ÿÓ²eKîý´ô%µH$*ÿkóóóß¾}›œœœ˜˜˜œœÌ¦·oßffffff>{ö,""‚{¤¾¾¾™™Y=zôèaffÖ´iS™þ½ 4oÆ>zô(666&&æÎ;qqq¥Ïþ¡®®Þ¬Y³/¾ø¢yóæÜ¹Üí¦M›ª©©BŠ‹‹Kþ‹ÛÂÍvîC¹7oÞ$&&r?JßÄBBCC !ÚÚÚ¦¦¦æææ–––æææ†††Šú¢(EEE<¸qãÆõë×ÿúë¯OŸ>IïÒÖÖîСC§N:wîܱcÇŽ;–þçõòåË«W¯æ¾§fcc³aÃþo}Ê¿äªÑÆêSQQÑ×××××ïÞ½{ù{‹‹‹SRRªhíwîܹsç÷`‘Hôå—_víÚÕÄÄdÞ¼yõêÕã30¶deeݼy3::::::&&&//OzW½zõzõêÕ³gOccã/¿ü’{ÍWa{®´´´äääׯ_ß¹s'666:::%%åÒ¥K—.]âкu믿þzÈ!666uê °EDqpp ¬Å“ƒƒƒMMM…”õàÁƒÃ‡s »ô›fMMÍîÝ»››››››[XX´iÓF{—H$oß¾ý÷ß=zÄáÅ‹¥?ÇÓÑÑxðàáÇOŸ>ÍÏÏçîÒÔÔ:tè”)S¾ùæ%Îh """Ž9ráÂiÃæ^ÄXYYõìÙ³gÏž:ts¸ðòåË»wïÞ¹sçîÝ»÷îÝËÊÊâ¶«««÷íÛׯÆfĈ_|ñ…<‡TGxyyyyyÕâ‰"îÕš7µž={vìØ±°°°¸¸8n‹H$266æ>»677ïÒ¥‹†††üöñãGî³ú˜˜˜ØØØôôtn»ŠŠŠ¹¹ù˜1cFedd$ÿɈD"‰‰‰9vìØ‰'Þ½{Çm466îÓ§O¿~ýúõë÷ÙÚrss}||¶oßžŸŸ¯««»zõj{{{%îRÕQRRòøñãØØØ'NDFFrŸ!éééMš4ÉÎήsçΊ `JJJþúë¯#GŽœ:uJúš¯ÿþæææ={öìÝ»7=/y%ÉÓ§Oïܹóûï¿ß¸qƒ{« ¢¢baaacc3räȶmÛ*zŒÊÍ[Ù¼xñâøñãaaaÒï5hÐÀÖÖvРAC‡¥ð_ü¸¸¸¿þúëÒ¥K/^,((à6š˜˜Œ=ÚÆÆ¦}ûöŠyyyû÷ïß±cÇË—/¹-ÆÆÆãÆ?~|‡ªùKNž<)‹ß¼y#‰&Ož¼nݺfÍšÉlÈLJNN>zôè¡C‡þùçBˆH$š4iÒºuëXÃ÷ðáÃßÿýرc‰‰‰Ü–®]»Nœ8qܸq-Z´PìØ>+--íÂ… gΜ¹råŠôs‚.]º >|ùòåøD?4o%ñæÍ›“'O;vLšJ6jÔhÔ¨QãÇïÛ·/_ËÉɹ|ùò©S§.]º$;vìhkk;wî\¶¾”’’üñãGBH‹-ÆŽ;aÂSSÓêÿ’'Ož¬ZµêÚµk„SSSoooKKKYX)ܿ߾}ûöí+..ÖÔÔ\³fÍ¢E‹L|å#??Ïž=~~~Òo/¶nÝz„ ¶¶¶;vTìØj!'''""âôéÓ/^ÌÌÌ$„Ô¯_êÔ©sçÎýòË/=:†¡y³M"‘üñǾ¾¾üñ·EWWwĈãÆ8p B>ç/???22òÔ©SçÏŸç>'TWW3fÌ‚ (\Ç\FNNÎÖ­[·oß^XXH±´´\ºté·ß~[£$233ÓËËk÷îÝ………Mš4Y»víôéÓ±Pªšþý÷_±X|öìYBȰaÃvìØÑ¸qcEªZ222¸&פI“±cÇÚÚÚöìÙ“¹— åI$’K—.pÿX©¨¨ 6lþüùýúõSôИ„æÍª‚‚‚cÇŽq—¯ „Ô«WoذaãÇ·¶¶æ³jˆ*%%%G½xñâÉ“'¹üì믿^°`Áˆ#(ü,¡°°000pÓ¦MYYY***Ç_²d‰••U-~Õ³gÏúöí[RR2kÖ,WW×F >Z¥wõêÕ™3gfff6iÒäøñãU|\ÛÞ¹sgFF!dÀ€'Nœ¶|øðá×_ æ¾Å©¯¯ïââ2cÆ ¥|½" hÞ,)** Ý´iSRR!¤K—. .?~<£×TvvöÁƒwîÜ™@ÑÔÔ\¸páÊ•+û‚=//oñâÅG%„{{{$—¶íÕ«Wýõ׊—\?~< àÞ½{„®]»nܸ±o߾и4o¼>’‰Drüøñ¯¿þÚÑÑ1))ÉØØøðáÃ7nܘ2eJéÜ„{{ûÛ·o‡††öéÓ'??ßÇǧk׮ܔ2¤'Ož 0àèÑ£ÚÚÚëÖ­»uë:7UÔÕÕ>|ptt}Ú´i‰‰‰=zôøûï¿Ož~ü8a„ÜÜ\ùì711q̘1«V­ÊÊÊâ>¶··Çwª«fiiáéé©¡¡qôèÑAƒ=~üXуR(>™8}ú´……Åõë×›4iòË/¿œ={–ÅÓ*É_Ë–-÷ìÙÑ©S§W¯^ 80((Hð½,_¾<44TGGç·ß~«³_;`—ššwIò‡.Y²D{<}út¿~ýnÞ¼Y¯^½ƒîß¿ßÀÀ@ûU"‘hþüù7oÞìܹóóçχ rðàÁÏ>kíÚµmÛ¶ýý÷ßå0Bv¡y ,;;{ñâÅvvv?~:tèŸþ9mÚ4ÄÛ5bff9wîÜüüü•+WΜ9³ô7+sýúu___éÙà+³k×®}ûö©««Ÿ8q¢N]ÑK™èêꆆ†Ö¯_ÿèÑ£>¦¸¸øùóçׯ_ç³£ÜÜ\GGG;;»´´´áÇ߿ÿÛo¿åó ë¦víÚ]¾|yÚ´i¹¹¹ .\´hQÕ™¤§§§¦¦Êm„,BóÒƒzõêuàÀ--­Í›7>|X___уb’†††——×¾}û4hpòäÉAƒ}ö J¿ÿþ»»»»ôZѺ|ù²«««H$ °°°tÈ W_}õÕŽ;D"Ñ?þxãÆòxñâEÏž=/^\ë]<{ö¬[·nûöíÓÔÔôöö>xð`Ó¦My ¹N«W¯Þ/¿üÂ}¹$44ô›o¾‘^)±<îT¸Ü5 2hÞ‚9tèµµõëׯ»vízõêÕ9sæà 7O£G¾zõj÷îÝããã­­­÷ïß_Ń?;á“““çÌ™S\\¼råÊñãÇ ?\/GGÇ¢¢¢~øáíÛ·eî522RWWýúuí¾ùxùòekkëÔÔÔŽ;FDDØÛÛc:ó']ÖñÏ?ÿ 4¨²%ûhÞÕæ-€ââbnÑQ~~þòåË###‘p åË/¿¼téÒÌ™3óóó—.]:gÎîªÏå5iÒ„RÙGm‰dÁ‚C‡]½zµ G r´fÍšAƒ¥¤¤LŸ>;ɶ”ººz›6mJJJªx‡W™;vLž<933säÈ‘W®\éÒ¥‹pC®ë:uêtýúõáÇs_ý‹ŽŽ.ÿ4ïê@óæ+==ÝÖÖ6 @CCÃÏÏO,Sx½ ¦ijjnÛ¶-((HGGçØ±c3gÎä.öU7á¹+˜•·gÏž«W¯6mÚô—_~‘ípAŽTUUƒƒƒŒŒbccËÜûÕW_BjÔ¼óóó-Z´fÍš’’—¬!œ¦¦æ&Nœ˜••5~üøòýÍ»:мy‰ïÓ§ÏÕ«WõõõOž<9}útEHiM˜0áܹszzz§OŸž={vùþÍ]ӥ ŸššêææFñññÁ·”L£F¸Zú.î¬;Ü•fª#77ׯÆ&44T[[{ß¾}+W®ÄGå2¢ªªºcÇŽÊú77—+{!4ïÚûûᅦ ööí[“+W®à䈲ֽ{÷ãÇ7jÔ¨Âþ]Å«õ-[¶dgg>ÜÆÆFNc9êÖ­›!dÕªUñññÒíÜ;ïj6ï”””¡C‡Þ¾}ÛÐÐ0<<¥" ÁÁÁÜm®ÛÚÚfeeM˜0¡tÿÆ;ïê@󮥛7oŽ=:55ÕÒÒòüùó-[¶Tôˆ”™ôš%¦¦¦ÒþýÃ?”îß•Mø×¯_ÿúë¯***k×®•Û€AÎ&OžŒ‹ÉÓ˜1c¢¢¢¾ÿþû‚‚þûï¿;wîTQQñööŽŽŽFóþ,4ïêºuë–÷ž{Μ9ŠNÓ¹sç‹/zyyéèèœ8qÂÊÊ*44tÔ¨QÜù[fÏž››[&öÞµkWIIÉĉ¹@i´jÕjÇŽ7nÜ1bDvvöæÍ›ÍÌÌvìØ‘ŸŸ¯¢¢²sçÎ&Mš\¾|yçΕ}áüãÇß}÷ÝË—/-,,Ž?®©©©ˆ¿£NÓÓÓÛ¾}ûÉ“'ÿùçŸaÆ]¸paÞ¼yEEEöööººº«Åª„æ]-÷îÝ›2eJ^^ÞÌ™3üñGE§ŽRUU;wîŸþimm––¶hÑ¢±cÇ:88tèÐáéÓ§®®®¥_­gff-W¬V­Z9r$((¨iӦ׮]}úÿðÃùùùþþþä¿ï¼KJJ¦L™rçÎ6mÚ„……qŸÖ€iii¹¹¹EDD˜™™½yó&..NMMûŽ!šwм?#--ÍÖÖ6==ÝÚÚš‹d=" „ &DEEMž<9//oÇŽ܉Ícbb!ÜÎwîÜI™;w®‚ rñÍ7ßDFFµmÛöéÓ§Ó§O¿{÷®‘‘Ñ¿ÿþ«ªªúîÝ;i(¾zõêëׯëëëŸ9s¦yóæŠ6HuëÖ-<<|Æ ÚÚÚEEEÜP\´ hEUá.X”ЩS§ýû÷cUU7nfddôöí[‘HÄ}lžššzìØ±W¯^µjÕjذaŠ&È‰ŠŠ ÷’nË–-Íš5‹}ùò¥ššš¶¶¶D"áÎp¤©©yèС-Z(zÈ𪪪 ,¸uëÖ Aƒ¸-ȼ«€æ]•ü122R__ÿ÷ß×ÒÒRôp ƒ ºuëÖÂ… UTT¸Ó6}øðÁËË‹²jÕ*|RRר««Ïž=ûîÝ»k×®mРAQQ÷žûÙ³gQQQ+V¬ „lÛ¶ÍÜÜ\Ñ#…Š………4iÒ›Wÿ´UêàÁƒÜµÂBBBð"fÚÚÚáááݺu#„Ü»w/!!¡]»v“'OVôÐ@1´µµœœîÞ½»hÑ"îewllìôéÓ æÏŸ?eÊE>còäÉ·oß¶²²Rô@è¥J177¯ÝYøïÞ½Û¼ys¥\‡kggW\\ìëë;bÄE‡ /_¾ÔÖÖÖÔÔ¤ívnnî€ Μ9S\\¼hÑ¢®]»R2¶Ên+úx ƒ†ÿ“ÞÖÓÓkÓ¦ÍÀUUUÏŸ?Ÿ’’bnn¾mÛ¶zõê)|lò¯ þ´š¾/¾ø‚žñÈâ0ݸqã›o¾©ÅÝÝÝ !ÄÁÁAR+»w‰I«¡K—.ØÙÙI$jo¿|ù²]»v:::”Œ§ŠÛ5ýÿχ£££¹¹ùµk×$ µ·ï߿߭[7zÆSÅmy;Ù¡áÿägoß½{·mÛ¶¦¦¦”ŒGþUAߦL·9(«V­ª°·~!DÄ5ïÀÀÀZ4ÿàà`SSSccã=KKK+--MSS³qãÆyyyÔÞþøñc^^ž––%ã©ðvdd¤‰‰ ÷]k9àN8 üÅÅÅùûûsWgªB(2­ &¡x˜¼¼¼¸/èÔ”H$Rã¿ûš:wî\ÿþý¹Ûµ´´ ¸í´Ý.Ð0ž o{zznÙ²E>Í;!!!$$dÛ¶mrØ—ÒËÈȸ~ýº¢G!T…€dW8L¢dò*à kžžž/_¾”ÿ~•Ò¸qãäö¶;33“†’UíÚµSŽIQ’]Uà0 ˆ’É«€æ=nÜ8\wO(®®®­Zµ’Ͼ¾üòKJV94lذ_¿~Š…P’]Uà0 ˆ’É«€æíêêjdd$ÿý*¥°°0¹„¨Aƒ4”¬rˆ‹‹[¶l™¢G!T…€dW8L¢dò* y‡……}øðAþûUJžžž¯_¿–Ͼh(Yå@IlƪB@2ͼq˜„BÉäEæÍ6dÞŒ¢$6ãU! dÞL dò*àÛæfÞ999?–ÿ`ØÒ©S'mmíÒ[\]]ÓÓÓå³wÄfâb3¹;ÙAUHvUÃ$ J&¯š·««kù?¶°°ÿ`ØSæœÌaaar[çØL@J³ÎU! ÙU“€(™¼ hÞaaaýû÷¯ð çõêÕ«é)_êˆøøøcG¢Ó IDATÜÜÜò۱ΛQ”Äfü¡*„uÞL dò* y{zzUؼOœ8!ÿ!ÑoìØ±>,¿™7£(‰ÍøCU™7(™¼XçÍ6¬óf%KEùCUë¼™@ÉäÅ:o¶a7£(Y*ʪB@XçÍJ&/Öy³ ë¼EIlƪB@XçÍJ&/Öy³ ™7£(‰ÍøCU™7(™¼È¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ɋ̛mȼEIlƪB@ȼ™@ÉäEæÍ6dÞŒ¢$6ãU! dÞL dò"óf2oFQ›ñ‡ª2o&P2y‘y³ ™7£(‰ÍøCU™7(™¼È¼+foo¯è!T 2oFQ›ñ‡ª2o&P2y•<óÞºu«‡‡‡‡‡‡‡‡Ç³gϪùD[[Û ·{zz 7: óf%±¨ !óf%“WÉ3ïåË—‹Åb+++±X,‹¿úê«j>qèСn¯ð¢Ú „Ì›Q”Äfü¡*„Ì› ”L^º®ç-7¾¾¾±±±:t())yÿþýÌ™3ÍÍ͹»‚‚‚Þ½{—˜˜PæY[¶l‰õððà~´²²²¶¶–ë¸ËAæÍ(Jb3þPBæÍJ&¯š7 ™·£££ƒƒÃŒ3Z¶lYXX(‹¥Í›K»¥º´+VdddˆÅb¹ŽµJ®®®éééòÙb3q±™ÜŽì *$»ªÀa%“WÉ3ï*´nݺeË–„uuu]]]E§–y3Š’ØŒ?T…€y3’ɫ䙷ÒCæÍ(Jb3þPBæÍJ&/Öy×LNNNII‰¢Gñÿ!óf%±¨ !óf%“WÉ3ï­[·æææFEEyxxˆD"[[[î ç›7oŽŠŠ:yòä˜1cââ⢣£·mÛÆ½2õöö.((àžBÑÕÕ]ºt©ôÚØØ¸¸¸4hÐ@SSSWWwüøñŠÍï‘y3Š’ØŒ?T…€y3’É«€æíêê*·}-_¾¼ÂíÎÎÎÎÎÎÜívíÚ:uJz×Ê•+«ø…8p pä+,,ÌÄÄD>o¾› (..ÎßßßÍÍMÑá U! ÙU“€(™¼È¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/ÎmÎ6œÛœQ”œ™?T…€pns&P2yëî:oå€uÞŒ¢d©(¨ a7(™¼È¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ɋ̛mȼEIlƪB@ȼ™@ÉäEæÍ6dÞŒ¢$6ãU! dÞL dò"óf2oFQ›ñ‡ª2o&P2yé:·yZZÚáÇå9V¤¥¥U¸ç6g%§GæU! œÛœ ”L^4ï°°°þýûWøæ;11Q,ËHìòôôܲe‹|šwBBBHH^¿ ‚’ØŒ?T…€dšyã0 …’É«€æíééiddT¦y7mÚÔÁÁAþƒaKùW<ȼEIlƪB@ȼ™@Éä¥åzÞFFFò ëp=oFQrI`þPÂõ¼™@ÉäÅ:o¶a7£(Y*ʪB@XçÍJ&/Öy³ ë¼EIlƪB@XçÍJ&/Öy³ ™7£(‰ÍøCU™7(™¼XçÍ6¬óf%KEùCUë¼™@ÉäEæÍ6dÞŒ¢$6ãU! dÞL dò"óf2oFQ›ñ‡ª2o&P2y‘y³ ™7£(‰ÍøCU™7(™¼´¬ó&„¬_¿>::ZþãaHÏž=×®][z 뼓’’ å3v:uÊÆÆFú#%KEù«¬*Þ¾}Û¢E ù‡-r« &>蜼ÛüöíÛgΜ‘ó`X‡s›3Š’Ó#ó‡ªÎmÎJ&/]ç6'„,\¸ÐÄÄDÎC¢ß½{÷üýýËo§çÜæúúúþù§†Á‡+W®”ÙHIlƪ¢vìíí¯^½Zf£¢ÎmŽÃT9¦¡åÜæR&&&ƒ–óè'‰*ÜŽÌ›Q”Äfü¡*„Ì› ”L^¬ófÖy3Š’¥¢ü¡*„uÞL dòb7۰ΛQ”,åU! ¬óf%“ë¼Ù†uÞŒ¢$6ãU! ¬óf%“ë¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ɋ̛mȼEIlƪB@ȼ™@ÉäEæÍ6dÞŒ¢$6ãU! dÞL dò"óf2o>üüüæÌ™£]S›ñ‡ª2ïêSÊÃT#ÔÛœE~~~÷ïßß½{·üwMϹÍeÁÇÇçêÕ«VVV„¢¢"MMÍåË—khhõû—,YRæ*mrCIlƪB@Š:·¹,à0Éuç6—%.#åμœœrrrÄb1÷ã“'OvîܹdÉyŽAF(‰ÍøCUH™2o&Y£èzÞ²£ÄeDÃõ¼å¦cÇŽGŽánrËòòò¬­­K_Ï&44ôßÿ•H$ÙÙÙ“&M255•Þuþüù¨¨(uuõüüüÞ½{ËùO¢ä’Àü¡*$ÿëyË “à(ºž·Ü(SÕëyïß¿¿C‡Ü»wï7nœ÷㯿þÛ£GîÇiÓ¦q7$‰«««ôÀ]½z555uݺuÜ¡¡¡ñññrûJ£ä’Àü¡*¤¬×óÆa’…:—y+Y)wæMILLôððÈËË»uë–X,–¾´ /}¶€¢¢" îÀq‡øåË—êêê"‘èýû÷Ò‡EFFº»»Kœ6mš¢.cLIlƪB@Ê”y&«™7QÞ2Rî̛ҢE .ï¸{÷nhhhïÞ½µ´´!úúúÒ¤ŒmÛ¶ 8pÖ¬YÜŠú:BÕ(‰ÍøCUH™2o‚Ã$cu"ó&Ê[Fu'ó633kРÁÏ?ÿ¼jÕ*Bˆ‰‰ÉÑ£G'L˜Pþ‘>|~vòôéÓ¤¤$é] 8xðàÔ©S¹CCCKß+O”Äfü¡*¤¬™7“,Ô¹uÞfffóçÏÿù矹¹2ªð‘Ÿ-#é ,#å^çíããµaÃîcccãV­Zíܹ“2oÞ¼¬¬,WW× 6lݺuß¾}ÏŸ?çž5yòä5kÖüôÓO®®®'NœÈÎÎÞ°a7Ó¬§§çîî¾a×¢¢¢FùúúÊóâP²T”?T…€”i7“¬Õ‰Ì[ZFöööÍš5“–ѼyóæÍ›·oß>WWW--­¦M›öîÝ»}ûöäeT¯^½¼¼¼† re´páB==½ÁƒŸ;wÎÝÝ]MM-++«cÇŽ\9::Êíâ(wæíäääääTz‹ôu·H$š9sf…Ï255-ýÕÂ2FŒ1bÄé3fÌ` 5GIlƪB@Ê”yã0ÉZȼ•¸Œ”>óVV”Äfü¡*¤d™·²¢dòâÜælùÍEÉé‘ùCUç6g%“·ÎeÞJF¹3o%FIlƪB@Ê”y+1J&/®çÍ6\Ï›Q”Äfü¡*„ëy3’É‹ëy³ ™7£(‰ÍøCU™7(™¼È¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ɋ̛mȼEIlƪB@ȼ™@ÉäEæÍ6dÞ??¿9sæ”Þboo_ÙƒŸ>}º|ùòµk×Ο?_öC«%±¨ ÕÍ̇©vyÿseÄzæ½}ûöaÆ>}ZºeéÒ¥ãǯéïY²d‰ô¢ì[[ÛÊêíí½~ýú€€€šîH(²ˆÍBBBÊ_š¶úkU! ¶2o&ÅR’s›oß¾ýÌ™3‹-²±±á¶,]ºôÍ›7ÇŽ«ÑïY²dI™K~¶ŒTUUk1`¡°žy/^¼øýû÷/^¼à~Œoܸ±¾¾>ÿß}ú8p@úchh¨ô£¿,,ÌÍÍM]]]ú0.0“…Òf̘ѲeËÂÂB±X,=v+V¬ÈÈȾȓ'JN̪B@Jvns&™ª™·²ÖQÆÌ›’””äáá!‰JJJ пÿÒ÷Öôõ_ëÖ­[¶lIQWW—à 竃’ØŒ?T…€Xϼ “)gæMêF e̼ !U¼*ýz‹]”Äfü¡*ÄzæMp˜äH93oR7jˆÔÌ[ÖrrrJJJTTä½f’’ØŒ?T…€”,ó–5å;L5R'2oYST e̼}||¸ïˆD"GGGé]›6m*,,ŒŠŠâ¢ &tìØ‘»ËÛÛ»  @z—®®.—B6oÞuòäÉ1cÆÄÅÅEGGoÛ¶MºLÓÆÆÆÅÅ¥AƒšššºººãÇ—O CIlƪB@¬gÞ8Lò$"„888ÖâÉÁÁÁ¦¦¦ÆÆÆ5zÖ•+W*̼G}úôé]»v <¸ƒ)­ôR±ÊjÈÊÊŠTRCÜ]ejèÚµksæÌájÈÉÉiРAÒŠŒŒ<þ¼LkèêÕ«ööö£F:}útéí[¶l155vwª,6KJJ244Ô××ÿóÏ?å0 æ888\¹råÔ©S666ÒwîÜ™;wîåË—80ATVoß¾mÑ¢ª¢2öööW¯^•[Uà0ÕŽ¬“—————W-ž(‰”3óvrrrrrªð®U«VUö¬*Ö’9;;;;;s·ÛµkwêÔ©Ò÷8pàÀµ(oJ™y×”Äfü¡*¤™w]@ÉäŹÍÙ†s›3Š’Ó#ó‡ªÎmÎJ&/ÎmÎ6œÛœQ”œ™?T…€êò¹ÍBÉäÅõ¼Ù†ëy3Š’¥¢ü¡*„ëy3’É‹ëy³ ™7£(‰ÍøCU™7(™¼È¼Ù†Ì›Q”Äfü¡*„Ì› ”L^dÞlCæÍ(Jb3þPBæÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ÉKݹͯ]»öþý{yއ Ož<©p;=ç6ÏÌÌä.Ëe}:66VðÝ)‡Ò[(™¼­ó†Z a7Ô%±¨ É÷™3gvíÚ%‹=* ssó2Í›’ÉKÑ:o¨dÞŒ¢$6ãU! EeÞƒ êÚµ«,öË´”””Ç—ßNÉä¥îÜæP#ôœÛj„’Ó#󇪢Îm>dÈÉ“' ¾SÖ=|ø°ÂæMÉäÅ:o¶a7£(Y*ʪB@XçÍJ&/Öy³ ë¼EIlƪB@XçÍJ&/Öy³ ™7£(‰ÍøCUë¼™@ÉäÅ:o¶a7£(Y*ʪB@XçÍJ&/2o¶!óf%±¨ !óf%“™7Ûy3Š’ØŒ?T…€y3’ɋ̛mȼEIlƪB@ȼ™@ÉäEæÍ6dÞŒ¢$6ãU! dÞL dò"óf2oFQ›ñ‡ª2o&P2y‘y³ ™7£(‰ÍøCU™7(™¼8·9Ûy3Š’ØŒ?T…€Xϼ÷ìÙóöíÛÄÄÄ€€YïK(™¼8·9ÛpnsFQrzdþPRÔ¹ÍkêÎ;'OžÔÔÔ”H$ 6LKKûñÇ !?üð!ÄÃÃC¨щ’ɋ̛mȼEIlƪB@LdÞÏž=;þüO?ý´fͱXk÷îÝãÆ300à~üõ×_ccc{ôèÁý8mÚ4î†D"quu•6oGGG‡3f´lÙ²°°P,K›÷’%K¸ Íš5[³fô³z''§ &èééy{{s[BCCÃÃí­­ùüÕ¥Q2y‘y³ ™7£(‰ÍøCUˆ‰Ì»¤¤¤Ï /½È¨¨¨HCCƒkÞÅÅÅû÷ïùò¥ºººH$zÿþ}é'¶nݺeË–„uuu]]ÝêìËÈȨôåɧM›¶víZ›7%“WÍÛÕÕUþ;UVaaa&&&òyótS@qqqþþþnnnŠ_¨ É®*Ÿœ'$$„„„àõ» (‰ÍøCUH¦™w‡éÀ²Ø/Ó>}úTávJ&/ÎmÎ6dÞŒ¢$6ãU! EeÞOžo¾› (..ÎßßßÍÍMÑá U! ÙUEe‡©{÷îÝ»w|wÊ’É‹uÞlÃ:oFQ›ñ‡ªÖy3’É‹uÞlCæÍ(Jb3þPÂ:o&P2y±Î›mXçÍ(J–Šò‡ªÖy3’É‹uÞlÃ:oFQ²T”?T…€°Î› ”L^dÞl“sæ=wîÜŒŒ BH\\Ü;wp»Ö·)‰ÍøCU0Q8LL¦QLæ½dÉBHxx¸¡¡áŒ3p»Ö·å™yݹsçþýû„ÿ¹sçâv­oS›ñ‡ª`¢*p˜˜8L5""„888ÖâÉÁÁÁ¦¦¦ÆÆÆ5zVjjªŠŠJ£FòóóÓÓÓ544p»Ö·kqÔ€^^^^^^µx¢H$R@ó>Í[›hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À@z=5IDAT4oÆ yTÊÏÏo÷îÝùùùŠÈ yT*))ÉÙÙÙÌÌl×®]ô´p4o€J‰D"BHRRÒªU«LMMwîÜ™——§èA¡y|Îäɓ۵k—œœìââbbb²cÇŽÜÜ\ŽÍ RÜ;oKKËgÏž>}ÚÒÒòýû÷kÖ¬111ùå—_rrr2*4o€JqÍ["‘ˆD¢Q£FEGGŸ={ÖÊÊ*%%eíÚµ&&&~~~ÙÙÙrš7@ Œ1⯿þ:þ|¯^½>|øàææfbbâë뛕•%·1 yTJúλÌöáÇߺuëâÅ‹}úôIMMuww711Ùºuë§OŸä0*59ì”WÐ’ÿ*¿½²ÇÔèYUü’ò7dý¬=E¨gµlÙrðàÁò9²P7UV™¤¥[æÞªPYµW/¤’9%ø.âãã¥û*oèСC‡ˆˆpww¿~ýº‡‡‡¿¿ÿüùóçÎÛ AÙ)¹6ïwïÞíÝ»·ŠÿeUl!Šû³š£åþÆí¨šÏªð5žPϪpü ǯºy‡„„´k×®W¯^µÛ(õúõ눈ˆÊJ¢ÌöÊPEQUó1¤ò«ìÁU<Œÿ.$ÕèIåï%Ÿ›t‚ïâ³{©bթú©êÿ9C† 2dÈ… F•––æéé¹mÛ¶¨¨¨V­ZÉh>>©©©„~ýú­^½ºwïÞòš7@¥¸æ••µiÓ¦-[¶|øðÒ§OŸÕ«W÷íÛWQ£Bó¨×¼¥K¥¾þúk—þýû+tPhÞÕгgOWW×(z „ yTA$YXX¸¸¸Pu~C4o€JM›6ÍÅÅEÑ£( &¨TëÖ­=„ ÔÝæŸŸ«èQÔXmÞb±˜;ã]MŸ%£ñ@?~|„ b±xãÆµø ^^^'N|`À4¼ ‡2&Mš¤è!TªŽfÞ„''§=+''G6ÃxøðáO?ýtíÚ5]]ÝçÏŸûúú®\¹²¦¿dõêÕ5=ú@¿“'OFEE>þÈ‘#ÒLŸ>]¨} ®Ž6ïÊܾ}ûرc%%%Ü]îîîQQQÒ¯-ôíÛwäÈ‘ŠiÝuþüù)S¦èêêBÚ·oŸœœ¬è-ÆŒ3f̘¢¢¢}ûö™™™­X±‚RͯÕî=TaÍš5„''§ 6õ;…}Õ¢E‹7Bœœœ¤7J?`Ô¨QîNXhÞÿ±k×®€€555BˆD"Ù¹s§ô.77·ŒŒ îƒ9;;Ko¿}û¶aÆÒ===£££;wî\RRòîÝ»yóæ•>Ûð‰'nÞ¼©¡¡‘››;pà@yŽäIUUuÒ¤Iûöí›5k–¢Ç• Ž—H$ÙÙÙvvvÜvy¾ƒjÞ¼ye[üüü’’’^¿~}àÀÒxþüùœ9sÌÌÌD"QÆ “““ëׯߩS§Ù³gB þùç÷ïßBòòòFŒ1|øp>#¬š÷ØÙÙ988èêê6oÞÜÂÂbÞ¼yŠT*??Ó¦M¥_Ô»ººNž‰D3fÌèС!äíÛ·¹¹¹ÅÅÅÜ''R¶¶¶‹/ÖÓÓÓÐÐhذáÔ©S›5k¦ ¿ îŠ_¶lÙúõë;vìHÉÊÊ*óæ»BC‡ýõ×_¥!èž={e;PP´Å‹Ï;÷‹/¾Pô@àÿ”””p7RRR¤ïGÿùçŸ7oÞHÃô;(ssóÐÐÐiÓ¦Éa_"Bˆƒƒƒô5ljjjll,ô¨*eaaѪU+®sB^¼xqøðaî¶»»{DDÄâÅ‹mmmŸ>}êàà0tèPî+¯„ãÇÿùçŸêêê™™™]»vˆˆ055-óO°ÎÓÓóÂ… #GŽäÞ®:uÊßßÿâÅ‹Ÿ}"÷‚ž[2Tú=Ôšt©˜ô\ÒïÅÄÄìÛ·O[[;//OOO/&&ÆÔÔtÅŠ5Z°`¡¡aéwPmÚ´‘þÎððð'NøêÁƒä©££#=™ÇºuëòóóoÞ¼Ù§OBHƒ ¸ü;..nÆŒÆ [»ví¤I“¦N:vìØ‰'r7$I``àãÇuttêի׬Y³Hÿ±*ÏËËKz±²qW:Có3>͛Ҡ2hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó…ñ÷÷wqqùþûïkñÜI“&Ém_µSáå? eUÓP2jŠ0ÏÛÛûèÑ£«V­?~<·eöìÙ/_¾¼|ùrÕO\¸p!!ÄÅÅ¥Â{Åb±‡‡GeÏ>}zYõ¾jaýúõ.\èß¿¿tK||ü‘#Gª!Ÿ?YXëׯÏÉɹyófŸ>}!vvv:u’Ï®«IØP2hÞÀ×Ê•+“““Ÿ?Îýøüùó&Mš4kÖŒç¯ÍÉÉ©âÞQ£Fñüý<­]»6--mãÆÒ-NNN¥P‹Vý' kíÚµ„—ÒU(/ÅBóa4nÜ8%%E__? ÀÉÉÉßߟÛîåå{äÈ‘ääd??¿W¯^8p೿ÍÝÝ=**Júµoß¾#GŽänûùù%%%½~ýºÌïñððxôè‘••Õ³gÏ5jTXXhee%ý0  ………?ÿüóû÷ï !yyy#FŒ>|xþö . >|Ñ¢EU°jUüÉUŒpãÆ™™™¯_¿vqqÙ½{·––·±Fã/ÍÓÓ3::ºsçÎ%%%ïÞ½›7ož••!ÄÃÃãôéÓcÆŒquuå~v옆†FAAAIIIFFF```­ÿÈš7ÃÆÆæäÉ“#GŽTSSkÙ²¥tûêÕ«¹·¤Í›7÷ôô¬æ×nnn6¡%K–Š>y‹ÅÖÖÖzzz;vìà¶Ÿ={Vú~e~ùå—)S¦´hÑ‚ûqÇŽÑÑÑ={öüì ß¼yà #>>~øðá_~ùeÕ#¬Zr#äö2iÒ¤C‡mÚ´ICC£F;-ÏÕÕuòäÉsçÎ522*((X¶l×äÄbqAA½½=÷0‡¼¼{öljjª÷cPPÐÉ“'ÇŒC9wî\rr²ôïúôéÓòåË¥»›={6wC"‘,Y²DÚ¼kQU£²¿‹²k×®€€555n;wî¬Ýÿ:yBóa¼zõj×®]Ò7 ò×¶mÛ™3gJœ={¶““Óg›÷¹sç¸7µœ¢¢"MMÍê4ï–-[rÝ…ûZv>;–-[ –·mÛÖÈȈ¢¡¡Ñ AéöY³fíÞ½›ëš{öì™5k–ô®ˆˆiË$„ØÛÛ;::r]óÒ¥K¾¾¾Ò»tuu¥ïk‹ŠŠ‚‚‚ÔÕÕUTT’““y޼ŠaTñwÙÙÙ988èêê6oÞÜÂÂbÞ¼y<‡ hÞ ˜¶mÛ>zô¨uëÖŠ€D")³¥¤¤ä³ÏjÖ¬ÏÜwýúõ|žþYŸ!ÿ7ÜÕѶmÛäääììlUUÕ·oßWçYåH$ânlذaذaóçÏç~,ó¥¹éׯ_¿~ý¸ÓÿøãooïU«V)d$Õ‡¥b ˜Y³fmÙ²¥üö¢¢"îÆëׯ߼ySÍß–••UÖ[ZrròÞ½{¥?}óÍ7Ÿ}–¹¹yhhhv$#•ýÉôŒðûï¿ß·oß¡C‡Ê¬Ô4hÐîÝ»¥?îÙ³gРAÜmKKËýû÷KïJOO?tèw;%%EúùÁ?ÿüS¦6jQU £ ܇***ß}÷]é9¨%"„888Ôî ÁÁÁ¦¦¦Õ|ÊjÆ çÎ;v¬³³3!$888...&&&<<œ{Ào¿ývóæMmmízõêݽ{·[·n+V¬hذáºuëòó󥫕4hP:È ?q℞žž††FÆ §NÊ}ƒ½Šg¹¸¸tîÜùöíÛõë×ÏÏÏïӧϸq㸻ªx–D" |üø±ŽŽN½zõš5k6`À€Ž;VýW{xxœ?¾ÿþ"‘hÅŠ7–ÞUžj÷'W1B77·‚‚é/üþûï»téR£Vz©˜H$š>}:·TÌÝÝ=""bñâŶ¶¶OŸ>upp:tèš5k¤Oœ1cFIIIHHH™_xôèÑ›7ojiiåçç÷îÝ»ôÖvïÞ}çÎ===---CCÃ3fpÄÄÄìÛ·O[[;//OOO/&&ÆÔÔtÅŠ5ªâÿFÕÿ+Fׂ sss‹‹‹ –,YÒ¦M›êü?àÉËËËËË«OqŸ_¡yƒr yá@|š7>6` š7( ww÷7n8;;K?®PVø¶9( 777777E@ð΀1hÞŒAó` š7cмƒæ À4oÆ y0†×IZêׯ¿gÏ]]]¡FPGÄÅÅÕú¹¼š÷¤I“Ê\d ›0Í€1hÞŒAó` š7cмƒæ À4oÆ y0Í€1hÞŒAó` š7cмƒæ À4oÆ yÈÒÿ¯«“£É!$KIEND®B`‚mod_perl-2.0.9/docs/user/handlers/general.pod0000644000177200010010000000167212540623200017712 0ustar SteveNone=head1 NAME General Handlers Issues =head1 Description This chapter discusses issues relevant too any kind of handlers. =head1 Handlers Communication Apache handlers can communicate between themselves by writing and reading notes. It doesn't matter in what language the handlers were implemented as long as they can access the notes table. For example inside a request handler we can say: my $r = shift; my $c = $r->connection; $c->notes->set(mod_perl => 'rules'); and then later in a mod_perl filter handler this note can be retrieved with: my $f = shift; my $c = $f->c; my $is = $c->notes->get("mod_perl"); $f->print("mod_perl $is"); =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/http.pod0000644000177200010010000020110412540623200017244 0ustar SteveNone=head1 NAME HTTP Handlers =head1 Description This chapter explains how to implement the HTTP protocol handlers in mod_perl. =head1 HTTP Request Handler Skeleton All HTTP Request handlers have the following structure: package MyApache2::MyHandlerName; # load modules that are going to be used use ...; # compile (or import) constants use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # handler code comes here return Apache2::Const::OK; # or another status constant } 1; First, the package is declared. Next, the modules that are going to be used are loaded and constants compiled. The handler itself coming next and usually it receives the only argument: the C> object. If the handler is declared as L
: sub handler : method { my ($class, $r) = @_; the handler receives two arguments: the class name and the C> object. The handler ends with L and the file is ended with C<1;> to return true when it gets loaded. =head1 HTTP Request Cycle Phases Those familiar with mod_perl 1.0 will find the HTTP request cycle in mod_perl 2.0 to be almost identical to the mod_perl 1.0's model. The different things are: =over =item * a new directive C> was added to match the new phase I added by Apache 2.0. =item * the C directive has been renamed to C to better match the corresponding Apache phase name (I). =item * the I phase now includes filtering. =back The following diagram depicts the HTTP request life cycle and highlights which handlers are available to mod_perl 2.0: =for html HTTP cycle

From the diagram it can be seen that an HTTP request is processed by 12 phases, executed in the following order: =over =item 1 PerlPostReadRequestHandler (PerlInitHandler) =item 2 PerlTransHandler =item 3 PerlMapToStorageHandler =item 4 PerlHeaderParserHandler (PerlInitHandler) =item 5 PerlAccessHandler =item 6 PerlAuthenHandler =item 7 PerlAuthzHandler =item 8 PerlTypeHandler =item 9 PerlFixupHandler =item 10 PerlResponseHandler =item 11 PerlLogHandler =item 12 PerlCleanupHandler =back It's possible that the cycle will not be completed if any of the phases terminates it, usually when an error happens. In that case Apache skips to the logging phase (mod_perl executes all registered C handlers) and finally the cleanup phase happens. Notice that when the response handler is reading the input data it can be filtered through request input filters, which are preceded by connection input filters if any. Similarly the generated response is first run through request output filters and eventually through connection output filters before it's sent to the client. We will talk about filters in detail later in L. Before discussing each handler in detail remember that if you use L all handlers in the chain will be run as long as they return C or C. Because stacked handlers is a special case. So don't be surprised if you've returned C and the next handler was still executed. This is a feature, not a bug. Now let's discuss each of the mentioned handlers in detail. =head2 PerlPostReadRequestHandler The I phase is the first request phase and happens immediately after the request has been read and HTTP headers were parsed. This phase is usually used to do processing that must happen once per request. For example C is usually invoked at this phase to reload modified Perl modules. This phase is of type C>. The handler's configuration scope is C>, because at this phase the request has not yet been associated with a particular filename or directory. B See the L for a description of handler arguments. B See L for a description of handler return codes. B Now, let's look at an example. Consider the following registry script: #file:touch.pl #------------- use strict; use warnings; use Apache2::ServerUtil (); use Apache2::RequestIO (); use File::Spec::Functions qw(catfile); my $r = shift; $r->content_type('text/plain'); my $conf_file = catfile Apache2::ServerUtil::server_root, "conf", "httpd.conf"; printf "$conf_file is %0.2f minutes old\n", 60*24*(-M $conf_file); This registry script is supposed to print when the last time I has been modified, compared to the start of the request process time. If you run this script several times you might be surprised that it reports the same value all the time. Unless the request happens to be served by a recently started child process which will then report a different value. But most of the time the value won't be reported correctly. This happens because the C<-M> operator reports the difference between file's modification time and the value of a special Perl variable C<$^T>. When we run scripts from the command line, this variable is always set to the time when the script gets invoked. Under mod_perl this variable is getting preset once when the child process starts and doesn't change since then, so all requests see the same time, when operators like C<-M>, C<-C> and C<-A> are used. Armed with this knowledge, in order to make our code behave similarly to the command line programs we need to reset C<$^T> to the request's start time, before C<-M> is used. We can change the script itself, but what if we need to do the same change for several other scripts and handlers? A simple C handler, which will be executed as the very first thing of each requests, comes handy here: #file:MyApache2/TimeReset.pm #-------------------------- package MyApache2::TimeReset; use strict; use warnings; use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $^T = $r->request_time; return Apache2::Const::OK; } 1; We could do: $^T = time(); But to make things more efficient we use C<$r-Erequest_time> since the request object C<$r> already stores the request's start time, so we get it without performing an additional system call. To enable it just add to I: PerlPostReadRequestHandler MyApache2::TimeReset either to the global section, or to the CVirtualHostE> section if you want this handler to be run only for a specific virtual host. =head2 PerlTransHandler The I phase is used to perform the manipulation of a request's URI. If no custom handler is provided, the server's standard translation rules (e.g., C directives, mod_rewrite, etc.) will be used. A C handler can alter the default translation mechanism or completely override it. This is also a good place to register new handlers for the following phases based on the URI. C> is to be used to override the URI to filename translation. This phase is of type C>. The handler's configuration scope is C>, because at this phase the request has not yet been associated with a particular filename or directory. B See the L for a description of handler arguments. B See L for a description of handler return codes. B There are many useful things that can be performed at this stage. Let's look at the example handler that rewrites request URIs, similar to what mod_rewrite does. For example, if your web-site was originally made of static pages, and now you have moved to a dynamic page generation chances are that you don't want to change the old URIs, because you don't want to break links for those who link to your site. If the URI: http://example.com/news/20021031/09/index.html is now handled by: http://example.com/perl/news.pl?date=20021031;id=09;page=index.html the following handler can do the rewriting work transparent to I, so you can still use the former URI mapping: #file:MyApache2/RewriteURI.pm #--------------------------- package MyApache2::RewriteURI; use strict; use warnings; use Apache2::RequestRec (); use Apache2::Const -compile => qw(DECLINED); sub handler { my $r = shift; my ($date, $id, $page) = $r->uri =~ m|^/news/(\d+)/(\d+)/(.*)|; $r->uri("/perl/news.pl"); $r->args("date=$date;id=$id;page=$page"); return Apache2::Const::DECLINED; } 1; The handler matches the URI and assigns a new URI via C<$r-Euri()> and the query string via C<$r-Eargs()>. It then returns C, so the next translation handler will get invoked, if more rewrites and translations are needed. Of course if you need to do a more complicated rewriting, this handler can be easily adjusted to do so. To configure this module simply add to I: PerlTransHandler +MyApache2::RewriteURI =head2 PerlMapToStorageHandler The I phase is used to perform the translation of a request's URI into a corresponding filename. If no custom handler is provided, the server will try to walk the filesystem trying to find what file or directory corresponds to the request's URI. Since usually mod_perl handler don't have corresponding files on the filesystem, you will want to shortcut this phase and save quite a few CPU cycles. This phase is of type C>. The handler's configuration scope is C>, because at this phase the request has not yet been associated with a particular filename or directory. B See the L for a description of handler arguments. B See L for a description of handler return codes. B For example if you don't want Apache to try to attempt to translate URI into a filename, just add a handler: PerlMapToStorageHandler MyApache2::NoTranslation using the following code: #file:MyApache2/NoTranslation.pm #------------------------------ package MyApache2::NoTranslation; use strict; use warnings FATAL => 'all'; use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # skip ap_directory_walk stat() calls return Apache2::Const::OK; } 1; But this can be done from F too! PerlMapToStorageHandler Apache2::Const::OK If you haven't already compiled C elsewhere, you should add: use Apache2::Const -compile => qw(OK); Apache also uses this phase to handle C requests. So if you shortcut it, C calls will be not handled. In case you need to handle such, you may rewrite it as: #file:MyApache2/NoTranslation2.pm #------------------------------- package MyApache2::NoTranslation2; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::Const -compile => qw(DECLINED OK M_TRACE); sub handler { my $r = shift; return Apache2::Const::DECLINED if $r->method_number == Apache2::Const::M_TRACE; # skip ap_directory_walk stat() calls return Apache2::Const::OK; } 1; BTW, the HTTP TRACE method asks a web server to echo the contents of the request back to the client for debugging purposes. i.e., the complete request, including HTTP headers, is returned in the entity-body of a TRACE response. Attackers may abuse HTTP TRACE functionality to gain access to information in HTTP headers such as cookies and authentication data. In the presence of other cross-domain vulnerabilities in web browsers, sensitive header information could be read from any domains that support the HTTP TRACE method. Another way to prevent the core translation is to set C<$r-Efilename()> to some value, which can also be done in the C>, if you are already using it. =head2 PerlHeaderParserHandler The I phase is the first phase to happen after the request has been mapped to its CLocationE> (or an equivalent container). At this phase the handler can examine the request headers and to take a special action based on these. For example this phase can be used to block evil clients targeting certain resources, while little resources were wasted so far. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B This phase is very similar to C>, with the only difference that it's run after the request has been mapped to the resource. Both phases are useful for doing something once per request, as early as possible. And usually you can take any C> and turn it into C> by simply changing the directive name in I and moving it inside the container where it should be executed. Moreover, because of this similarity mod_perl provides a special directive C> which if found outside resource containers behaves as C>, otherwise as C>. You already know that Apache handles the C, C, C and several other HTTP methods. But did you know that you can invent your own HTTP method as long as there is a client that supports it. If you think of emails, they are very similar to HTTP messages: they have a set of headers and a body, sometimes a multi-part body. Therefore we can develop a handler that extends HTTP by adding a support for the C method. We can enable this protocol extension and push the real content handler during the C> phase: PerlHeaderParserHandler MyApache2::SendEmail and here is the C handler: #file:MyApache2/SendEmail.pm #-------------------------- package MyApache2::SendEmail; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use Apache2::ServerRec (); use Apache2::Process (); use APR::Table (); use Apache2::Const -compile => qw(DECLINED OK); use constant METHOD => 'EMAIL'; use constant SMTP_HOSTNAME => "localhost"; sub handler { my $r = shift; return Apache2::Const::DECLINED unless $r->method eq METHOD; $r->server->method_register(METHOD); $r->handler("perl-script"); $r->push_handlers(PerlResponseHandler => \&send_email_handler); return Apache2::Const::OK; } sub send_email_handler { my $r = shift; my %headers = map {$_ => $r->headers_in->get($_)} qw(To From Subject); my $content = content($r); my $status = send_email(\%headers, \$content); $r->content_type('text/plain'); $r->print($status ? "ACK" : "NACK"); return Apache2::Const::OK; } sub send_email { my ($rh_headers, $r_body) = @_; require MIME::Lite; MIME::Lite->send("smtp", SMTP_HOSTNAME, Timeout => 60); my $msg = MIME::Lite->new(%$rh_headers, Data => $$r_body); #warn $msg->as_string; $msg->send; } use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => qw(MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub content { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->remove; # optimization to reuse memory } } while (!$seen_eos); $bb->destroy; return $data; } 1; Let's get the less interesting code out of the way. The function content() grabs the request body. The function send_email() sends the email over SMTP. You should adjust the constant C to point to your outgoing SMTP server. You can replace this function with your own if you prefer to use a different method to send email. Now to the more interesting functions. The function C returns immediately and passes the control to the next handler if the request method is not equal to C (set in the C constant): return Apache2::Const::DECLINED unless $r->method eq METHOD; Next it tells Apache that this new method is a valid one and that the C handler will do the processing. $r->server->method_register(METHOD); $r->handler("perl-script"); Finally it pushes the function C to the C list of handlers: $r->push_handlers(PerlResponseHandler => \&send_email_handler); The function terminates the header_parser phase by: return Apache2::Const::OK; All other phases run as usual, so you can reuse any HTTP protocol hooks, such as authentication and fixup phases. When the response phase starts C is invoked, assuming that no other response handlers were inserted before it. The response handler consists of three parts. Retrieve the email headers C, C and C, and the body of the message: my %headers = map {$_ => $r->headers_in->get($_)} qw(To From Subject); my $content = $r->content; Then send the email: my $status = send_email(\%headers, \$content); Finally return to the client a simple response acknowledging that email has been sent and finish the response phase by returning C: $r->content_type('text/plain'); $r->print($status ? "ACK" : "NACK"); return Apache2::Const::OK; Of course you will want to add extra validations if you want to use this code in production. This is just a proof of concept implementation. As already mentioned when you extend an HTTP protocol you need to have a client that knows how to use the extension. So here is a simple client that uses C to issue an C method request over HTTP protocol: #file:send_http_email.pl #----------------------- #!/usr/bin/perl use strict; use warnings; require LWP::UserAgent; my $url = "http://localhost:8000/email/"; my %headers = ( From => 'example@example.com', To => 'example@example.com', Subject => '3 weeks in Tibet', ); my $content = <new(%headers); my $req = HTTP::Request->new("EMAIL", $url, $headers, $content); my $res = LWP::UserAgent->new->request($req); print $res->is_success ? $res->content : "failed"; most of the code is just a custom data. The code that does something consists of four lines at the very end. Create C and C object. Issue the request and get the response. Finally print the response's content if it was successful or just I<"failed"> if not. Now save the client code in the file I, adjust the I field, make the file executable and execute it, after you have restarted the server. You should receive an email shortly to the address set in the I field. =head2 PerlInitHandler When configured inside any container directive, except CVirtualHostE>, this handler is an alias for C> described earlier. Otherwise it acts as an alias for C> described earlier. It is the first handler to be invoked when serving a request. This phase is of type C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B The best example here would be to use C> which takes the benefit of this directive. Usually C> is configured as: PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "MyApache2::*" which during the current HTTP request will monitor and reload all C modules that have been modified since the last HTTP request. However if we move the global configuration into a CLocationE> container: PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "MyApache2::*" SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI C> will reload the modified modules, only when a request to the I namespace is issued, because C> plays the role of C> here. =head2 PerlAccessHandler The I phase is the first of three handlers that are involved in what's known as AAA: Authentication, Authorization, and Access control. This phase can be used to restrict access from a certain IP address, time of the day or any other rule not connected to the user's identity. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B The concept behind access checker handler is very simple, return C if the access is not allowed, otherwise return C. The following example handler denies requests made from IPs on the blacklist. #file:MyApache2/BlockByIP.pm #-------------------------- package MyApache2::BlockByIP; use strict; use warnings; use Apache2::RequestRec (); use Apache2::Connection (); use Apache2::Const -compile => qw(FORBIDDEN OK); my %bad_ips = map {$_ => 1} qw(127.0.0.1 10.0.0.4); sub handler { my $r = shift; return exists $bad_ips{$r->connection->remote_ip} ? Apache2::Const::FORBIDDEN : Apache2::Const::OK; } 1; The handler retrieves the connection's IP address, looks it up in the hash of blacklisted IPs and forbids the access if found. If the IP is not blacklisted, the handler returns control to the next access checker handler, which may still block the access based on a different rule. To enable the handler simply add it to the container that needs to be protected. For example to protect an access to the registry scripts executed from the base location I add: SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlAccessHandler MyApache2::BlockByIP Options +ExecCGI It's important to notice that C can be configured for any subsection of the site, no matter whether it's served by a mod_perl response handler or not. For example to run the handler from our example for all requests to the server simply add to I: PerlAccessHandler MyApache2::BlockByIP =head2 PerlAuthenHandler The I (I) phase is called whenever the requested file or directory is password protected. This, in turn, requires that the directory be associated with C, C and at least one C directive. This phase is usually used to verify a user's identification credentials. If the credentials are verified to be correct, the handler should return C. Otherwise the handler returns C to indicate that the user has not authenticated successfully. When Apache sends the HTTP header with this code, the browser will normally pop up a dialog box that prompts the user for login information. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B The following handler authenticates users by asking for a username and a password and lets them in only if the length of a string made from the supplied username and password and a single space equals to the secret length, specified by the constant C. #file:MyApache2/SecretLengthAuth.pm #--------------------------------- package MyApache2::SecretLengthAuth; use strict; use warnings; use Apache2::Access (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK DECLINED HTTP_UNAUTHORIZED); use constant SECRET_LENGTH => 14; sub handler { my $r = shift; my ($status, $password) = $r->get_basic_auth_pw; return $status unless $status == Apache2::Const::OK; return Apache2::Const::OK if SECRET_LENGTH == length join " ", $r->user, $password; $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } 1; First the handler retrieves the status of the authentication and the password in plain text. The status will be set to C only when the user has supplied the username and the password credentials. If the status is different, we just let Apache handle this situation for us, which will usually challenge the client so it'll supply the credentials. Note that C does a few things behind the scenes, which are important to understand if you plan on implementing your own authentication mechanism that does not use C. First, is checks the value of the configured C for the request, making sure it is C. Then it makes sure that the Authorization (or Proxy-Authorization) header is formatted for C authentication. Finally, after isolating the user and password from the header, it populates the I slot in the request record with C. For the first and last parts of this process, mod_perl offers an API. C<$r-Eauth_type> returns the configured authentication type for the current request - whatever was set via the C configuration directive. C<$r-Eap_auth_type> populates the I slot in the request record, which should be done after it has been confirmed that the request is indeed using C authentication. (Note: C<$r-Eap_auth_type> was C<$r-Econnection-Eauth_type> in the mod_perl 1.0 API.) Once we know that we have the username and the password supplied by the client, we can proceed with the authentication. Our authentication algorithm is unusual. Instead of validating the username/password pair against a password file, we simply check that the string built from these two items plus a single space is C long (14 in our example). So for example the pair I authenticates correctly, whereas I does not, because the latter pair will make a string of 15 characters. Of course this is not a strong authentication scheme and you shouldn't use it for serious things, but it's fun to play with. Most authentication validations simply verify the username/password against a database of valid pairs, usually this requires the password to be encrypted first, since storing passwords in clear is a bad idea. Finally if our authentication fails the handler calls note_basic_auth_failure() and returns C, which sets the proper HTTP response headers that tell the client that its user that the authentication has failed and the credentials should be supplied again. It's not enough to enable this handler for the authentication to work. You have to tell Apache what authentication scheme to use (C or C), which is specified by the C directive, and you should also supply the C -- the authentication realm, which is really just a string that the client usually uses as a title in the pop-up box, where the username and the password are inserted. Finally the C directive is needed to specify which usernames are allowed to authenticate. If you set it to C any username will do. Here is the whole configuration section that requires users to authenticate before they are allowed to run the registry scripts from I: SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlAuthenHandler MyApache2::SecretLengthAuth Options +ExecCGI AuthType Basic AuthName "The Gate" Require valid-user Just like C and other mod_perl handlers, C can be configured for any subsection of the site, no matter whether it's served by a mod_perl response handler or not. For example to use the authentication handler from the last example for any requests to the site, simply use: PerlAuthenHandler MyApache2::SecretLengthAuth AuthType Basic AuthName "The Gate" Require valid-user =head2 PerlAuthzHandler The I (I) phase is used for authorization control. This phase requires a successful authentication from the previous phase, because a username is needed in order to decide whether a user is authorized to access the requested resource. As this phase is tightly connected to the authentication phase, the handlers registered for this phase are only called when the requested resource is password protected, similar to the auth phase. The handler is expected to return C to defer the decision, C to indicate its acceptance of the user's authorization, or C to indicate that the user is not authorized to access the requested document. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B Here is the C handler which grants access to certain resources only to certain users who have already properly authenticated: #file:MyApache2/SecretResourceAuthz.pm #------------------------------------ package MyApache2::SecretResourceAuthz; use strict; use warnings; use Apache2::Access (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED); my %protected = ( 'admin' => ['stas'], 'report' => [qw(stas boss)], ); sub handler { my $r = shift; my $user = $r->user; if ($user) { my ($section) = $r->uri =~ m|^/company/(\w+)/|; if (defined $section && exists $protected{$section}) { my $users = $protected{$section}; return Apache2::Const::OK if grep { $_ eq $user } @$users; } else { return Apache2::Const::OK; } } $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } 1; This authorization handler is very similar to the authentication handler L. Here we rely on the previous phase to get users authenticated, and now as we have the username we can make decisions whether to let the user access the resource it has asked for or not. In our example we have a simple hash which maps which users are allowed to access what resources. So for example anything under I can be accessed only by the user I, I can be accessed by users I and I, whereas any other resources under I can be accessed by everybody who has reached so far. If for some reason we don't get the username, we or the user is not authorized to access the resource the handler does the same thing as it does when the authentication fails, i.e, calls: $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; The configuration is similar to the one in L, this time we just add the C setting. The rest doesn't change. Alias /company/ /home/httpd/httpd-2.0/perl/ SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlAuthenHandler MyApache2::SecretLengthAuth PerlAuthzHandler MyApache2::SecretResourceAuthz Options +ExecCGI AuthType Basic AuthName "The Secret Gate" Require valid-user And if you want to run the authentication and authorization for the whole site, simply add: PerlAuthenHandler MyApache2::SecretLengthAuth PerlAuthzHandler MyApache2::SecretResourceAuthz AuthType Basic AuthName "The Secret Gate" Require valid-user =head2 PerlTypeHandler The I phase is used to set the response MIME type (C) and sometimes other bits of document type information like the document language. For example C, which performs automatic directory indexing, uses this phase to map the filename extensions to the corresponding icons which will be later used in the listing of files. Of course later phases may override the mime type set in this phase. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B The most important thing to remember when overriding the default I handler, which is usually the mod_mime handler, is that you have to set the handler that will take care of the response phase and the response callback function or the code won't work. mod_mime does that based on C and C directives, and file extensions. So if you want the content handler to be run by mod_perl, set either: $r->handler('perl-script'); $r->set_handlers(PerlResponseHandler => \&handler); or: $r->handler('modperl'); $r->set_handlers(PerlResponseHandler => \&handler); depending on which type of response handler is wanted. Writing a C handler which sets the content-type value and returns C so that the default handler will do the rest of the work, is not a good idea, because mod_mime will probably override this and other settings. Therefore it's the easiest to leave this stage alone and do any desired settings in the I phase. =head2 PerlFixupHandler The I phase is happening just before the content handling phase. It gives the last chance to do things before the response is generated. For example in this phase C populates the environment with variables configured with I and I directives. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B The following fixup handler example tells Apache at run time which handler and callback should be used to process the request based on the file extension of the request's URI. #file:MyApache2/FileExtDispatch.pm #-------------------------------- package MyApache2::FileExtDispatch; use strict; use warnings; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::Const -compile => 'OK'; use constant HANDLER => 0; use constant CALLBACK => 1; my %exts = ( cgi => ['perl-script', \&cgi_handler], pl => ['modperl', \&pl_handler ], tt => ['perl-script', \&tt_handler ], txt => ['default-handler', undef ], ); sub handler { my $r = shift; my ($ext) = $r->uri =~ /\.(\w+)$/; $ext = 'txt' unless defined $ext and exists $exts{$ext}; $r->handler($exts{$ext}->[HANDLER]); if (defined $exts{$ext}->[CALLBACK]) { $r->set_handlers(PerlResponseHandler => $exts{$ext}->[CALLBACK]); } return Apache2::Const::OK; } sub cgi_handler { content_handler($_[0], 'cgi') } sub pl_handler { content_handler($_[0], 'pl') } sub tt_handler { content_handler($_[0], 'tt') } sub content_handler { my ($r, $type) = @_; $r->content_type('text/plain'); $r->print("A handler of type '$type' was called"); return Apache2::Const::OK; } 1; In the example we have used the following mapping. my %exts = ( cgi => ['perl-script', \&cgi_handler], pl => ['modperl', \&pl_handler ], tt => ['perl-script', \&tt_handler ], txt => ['default-handler', undef ], ); So that I<.cgi> requests will be handled by the C handler and the C callback, I<.pl> requests by C and C, I<.tt> (template toolkit) by C and the C, finally I<.txt> request by the C handler, which requires no callback. Moreover the handler assumes that if the request's URI has no file extension or it does, but it's not in its mapping, the C will be used, as if the I extension was used. After doing the mapping, the handler assigns the handler: $r->handler($exts{$ext}->[HANDLER]); and the callback if needed: if (defined $exts{$ext}->[CALLBACK]) { $r->set_handlers( PerlResponseHandler => $exts{$ext}->[CALLBACK]); } In this simple example the callback functions don't do much but calling the same content handler which simply prints the name of the extension if handled by mod_perl, otherwise Apache will serve the other files using the default handler. In real world you will use callbacks to real content handlers that do real things. Here is how this handler is configured: Alias /dispatch/ /home/httpd/httpd-2.0/htdocs/ PerlFixupHandler MyApache2::FileExtDispatch Notice that there is no need to specify anything, but the fixup handler. It applies the rest of the settings dynamically at run-time. =head2 PerlResponseHandler The I (I) phase is used for generating the response. This is arguably the most important phase and most of the existing Apache modules do most of their work at this phase. This is the only phase that requires two directives under mod_perl. For example: SetHandler perl-script PerlResponseHandler MyApache2::WorldDomination C set to C> or C> tells Apache that mod_perl is going to handle the response generation. C tells mod_perl which callback is going to do the job. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B Most of the C modules on CPAN are dealing with this phase. In fact most of the developers spend the majority of their time working on handlers that generate response content. Let's write a simple response handler, that just generates some content. This time let's do something more interesting than printing I<"Hello world">. Let's write a handler that prints itself: #file:MyApache2/Deparse.pm #------------------------ package MyApache2::Deparse; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use B::Deparse (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); $r->print('sub handler ', B::Deparse->new->coderef2text(\&handler)); return Apache2::Const::OK; } 1; To enable this handler add to I: SetHandler modperl PerlResponseHandler MyApache2::Deparse Now when the server is restarted and we issue a request to I we get the following response: sub handler { package MyApache2::Deparse; use warnings; use strict 'refs'; my $r = shift @_; $r->content_type('text/plain'); $r->print('sub handler ', 'B::Deparse'->new->coderef2text(\&handler)); return 0; } If you compare it to the source code, it's pretty much the same code. C is fun to play with! =head2 PerlLogHandler The I phase happens no matter how the previous phases have ended up. If one of the earlier phases has aborted a request, e.g., failed authentication or 404 (file not found) errors, the rest of the phases up to and including the response phases are skipped. But this phase is always executed. By this phase all the information about the request and the response is known, therefore the logging handlers usually record this information in various ways (e.g., logging to a flat file or a database). This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B Imagine a situation where you have to log requests into individual files, one per user. Assuming that all requests start with I, so it's easy to categorize requests by the username. Here is the log handler that does that: #file:MyApache2/LogPerUser.pm #--------------------------- package MyApache2::LogPerUser; use strict; use warnings; use Apache2::RequestRec (); use Apache2::Connection (); use Fcntl qw(:flock); use File::Spec::Functions qw(catfile); use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $r = shift; my ($username) = $r->uri =~ m|^/~([^/]+)|; return Apache2::Const::DECLINED unless defined $username; my $entry = sprintf qq(%s [%s] "%s" %d %d\n), $r->connection->remote_ip, scalar(localtime), $r->uri, $r->status, $r->bytes_sent; my $log_path = catfile Apache2::ServerUtil::server_root, "logs", "$username.log"; open my $fh, ">>$log_path" or die "can't open $log_path: $!"; flock $fh, LOCK_EX; print $fh $entry; close $fh; return Apache2::Const::OK; } 1; First the handler tries to figure out what username the request is issued for, if it fails to match the URI, it simply returns C, letting other log handlers to do the logging. Though it could return C since all other log handlers will be run anyway. Next it builds the log entry, similar to the default I entry. It's comprised of remote IP, the current time, the uri, the return status and how many bytes were sent to the client as a response body. Finally the handler appends this entry to the log file for the user the request was issued for. Usually it's safe to append short strings to the file without being afraid of messing up the file, when two files attempt to write at the same time, but just to be on the safe side the handler exclusively locks the file before performing the writing. To configure the handler simply enable the module with the C directive, for the desired URI namespace (starting with : I in our example): SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlLogHandler MyApache2::LogPerUser Options +ExecCGI After restarting the server and issuing requests to the following URIs: http://localhost/~stas/test.pl http://localhost/~eric/test.pl http://localhost/~stas/date.pl The C handler will append to I: 127.0.0.1 [Sat Aug 31 01:50:38 2002] "/~stas/test.pl" 200 8 127.0.0.1 [Sat Aug 31 01:50:40 2002] "/~stas/date.pl" 200 44 and to I: 127.0.0.1 [Sat Aug 31 01:50:39 2002] "/~eric/test.pl" 200 8 It's important to notice that C can be configured for any subsection of the site, no matter whether it's served by a mod_perl response handler or not. For example to run the handler from our example for all requests to the server, simply add to I: PerlLogHandler MyApache2::LogPerUser Since the C phase is of type C>, all other logging handlers will be called as well. =head2 PerlCleanupHandler There is no I Apache phase, it exists only inside mod_perl. It is used to execute some code immediately after the request has been served (the client went away) and before the request object is destroyed. There are several usages for this use phase. The obvious one is to run a cleanup code, for example removing temporarily created files. The less obvious is to use this phase instead of C> if the logging operation is time consuming. This approach allows to free the client as soon as the response is sent. This phase is of type C>. The handler's configuration scope is C>. B See the L for a description of handler arguments. B See L for a description of handler return codes. B There are two ways to register and run cleanup handlers: =over =item 1 Using the C phase PerlCleanupHandler MyApache2::Cleanup or: $r->push_handlers(PerlCleanupHandler => \&cleanup); This method is identical to all other handlers. In this technique the C callback accepts C<$r> as its only argument. =item 2 Using C acting on the request object's pool Since a request object pool is destroyed at the end of each request, we can use C> to register a cleanup callback which will be executed just before the pool is destroyed. For example: $r->pool->cleanup_register(\&cleanup, $arg); The important difference from using the C handler, is that here you can pass an optional arbitrary argument to the callback function, and no C<$r> argument is passed by default. Therefore if you need to pass any data other than C<$r> you may want to use this technique. =back Here is an example where the cleanup handler is used to delete a temporary file. The response handler is running C and stores the output in temporary file, which is then used by C<$r-Esendfile> to send the file's contents. We use C to push C to unlink the file at the end of the request. #file:MyApache2/Cleanup1.pm #------------------------- package MyApache2::Cleanup1; use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => 'SUCCESS'; my $file = catfile "/tmp", "data"; sub handler { my $r = shift; $r->content_type('text/plain'); local @ENV{qw(PATH BASH_ENV)}; qx(/bin/ls -l > $file); my $status = $r->sendfile($file); die "sendfile has failed" unless $status == APR::Const::SUCCESS; $r->push_handlers(PerlCleanupHandler => \&cleanup); return Apache2::Const::OK; } sub cleanup { my $r = shift; die "Can't find file: $file" unless -e $file; unlink $file or die "failed to unlink $file"; return Apache2::Const::OK; } 1; Next we add the following configuration: SetHandler modperl PerlResponseHandler MyApache2::Cleanup1 Now when a request to I is made, the contents of the current directory will be printed and once the request is over the temporary file is deleted. This response handler has a problem of running in a multi-process environment, since it uses the same file, and several processes may try to read/write/delete that file at the same time, wrecking havoc. We could have appended the process id C<$$> to the file's name, but remember that mod_perl 2.0 code may run in the threaded environment, meaning that there will be many threads running in the same process and the C<$$> trick won't work any longer. Therefore one really has to use this code to create unique, but predictable, file names across threads and processes: sub unique_id { require Apache2::MPM; require APR::OS; return Apache2::MPM->is_threaded ? "$$." . ${ APR::OS::current_thread_id() } : $$; } In the threaded environment it will return a string containing the process ID, followed by a thread ID. In the non-threaded environment only the process ID will be returned. However since it gives us a predictable string, they may still be a non-satisfactory solution. Therefore we need to use a random string. We can either either Perl's C, some CPAN module or the APR's C: sub unique_id { require APR::UUID; return APR::UUID->new->format; } Now the problem is how do we tell the cleanup handler what file should be cleaned up? We could have stored it in the C<$r-Enotes> table in the response handler and then retrieve it in the cleanup handler. However there is a better way - as mentioned earlier, we can register a callback for request pool cleanup, and when using this method we can pass an arbitrary argument to it. Therefore in our case we choose to pass the file name, based on random string. Here is a better version of the response and cleanup handlers, that uses this technique: #file: MyApache2/Cleanup2.pm #------------------------- package MyApache2::Cleanup2; use strict; use warnings FATAL => 'all'; use File::Spec::Functions qw(catfile); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use APR::UUID (); use APR::Pool (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => 'SUCCESS'; my $file_base = catfile "/tmp", "data-"; sub handler { my $r = shift; $r->content_type('text/plain'); my $file = $file_base . APR::UUID->new->format; local @ENV{qw(PATH BASH_ENV)}; qx(/bin/ls -l > $file); my $status = $r->sendfile($file); die "sendfile has failed" unless $status == APR::Const::SUCCESS; $r->pool->cleanup_register(\&cleanup, $file); return Apache2::Const::OK; } sub cleanup { my $file = shift; die "Can't find file: $file" unless -e $file; unlink $file or die "failed to unlink $file"; return Apache2::Const::OK; } 1; Similarly to the first handler, we add the configuration: SetHandler modperl PerlResponseHandler MyApache2::Cleanup2 And now when requesting I we still get the same output -- the listing of the current directory -- but this time this code will work correctly in the multi-processes/multi-threaded environment and temporary files get cleaned up as well. =head3 Possible Caveats C may fail to be completed on server shutdown/graceful restart since Apache will kill the registered handlers via SIGTERM, before they had a chance to run or even in the middle of its execution. See: http://marc.theaimsgroup.com/?t=106387845200003&r=1&w=2 http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=106427616108596&w=2 =head1 Miscellaneous Issues =head2 Handling HEAD Requests In order to avoid the overhead of sending the data to the client when the request is of type HEAD in mod_perl 1.0 we L from the handler: return Apache2::Const::OK if $r->header_only; This logic should not be used in mod_perl 2.0, because Apache 2.0 automatically discards the response body for HEAD requests. It expects the full body to generate the correct set of response headers, if you don't send the body you may encounter problems. (You can also read the comment in for C in I in the Apache 2.0 source.) =head2 C Response Header You may encounter some issues with the C-L (C) header. Some of them are discussed here. =over =item * The special case of C Since Apache proclaims itself governor of the C-L header via the C-L filter (ap_content_length_filter at F), for the most part C and C behave exactly the same. However, when Apache sees a C request with a C-L header of zero it takes special action and removes the C-L header. This is done to protect against handlers that called C<$r-Eheader_only> (L). Therefore, C and C behave identically, except when the content handler (and/or filters) end up sending no content. For more details refer to the lengthy comments in C in F). For more discussion on why it is important to get HEAD requests right, see these threads from the mod_perl list: http://marc.theaimsgroup.com/?l=apache-modperl&m=108647669726915&w=2 http://marc.theaimsgroup.com/?t=109122984600001&r=1&w=2 as well as this bug report from mozilla, which shows how C requests are used in the wild: http://bugzilla.mozilla.org/show_bug.cgi?id=245447 =item * Not getting C header with C requests Even though the spec says that content handlers should send an identical response for GET and HEAD requests, some folks try to L, which Apache is going to discard anyway for HEAD requests. The following discussion assumes that we deal with a HEAD request. When Apache sees EOS and no headers and no response body were sent, C (F) sets C-L to 0. Later on C (F) removes the C-L header for the HEAD requests. The workaround is to force the sending of the response headers, before C was sent (which happens when the response handler returns). The simplest solution is to use rflush(): if ($r->header_only) { # HEAD $body_len = calculate_body_len(); $r->set_content_length($body_len); $r->rflush; } else { # GET # generate and send the body } now if the handler sets the C-L header it'll be delivered to the client unmodified. =back =head1 Misc Notes These items will need to be extended and integrated in this or other HTTP related documents: =over =item * front-end back-end setup: mod_proxy+X-Forwarded-For apache-1.3: frontend: mod_proxy_add_forward http://develooper.com/code/mpaf/ backend: mod_rpaf (reverse proxy add forward): http://stderr.net/apache/rpaf/ apache-2.x: frontend: mod_proxy backend: mod_rpaf: http://stderr.net/apache/rpaf/ =back =head1 Extending HTTP Protocol Extending HTTP under mod_perl is a trivial task. Look at L|/PerlHeaderParserHandler> for details. =head1 HTTP Status Codes The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. It is a generic, stateless, protocol which can be used for many tasks beyond its use for hypertext, such as name servers and distributed object management systems, through extension of its request methods, error codes and headers. A feature of HTTP is the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred. HTTP 1.0 is described in Requests For Comments (RFC) 1945. HTTP 1.1 is the latest version of the specifications and as of this writing HTTP 1.1 is covered in RFC 2616. When writing mod_perl applications, usually only a small subset of HTTP response codes is used, but sometimes you need to know others as well. We will give a short description of each code and you will find the extended explanation in the appropriate RFC. (Section 9 in RFC 1945 and section 10 in RFC 2616). You can always find the latest link to these RFCs at the Web Consortium site, I. While HTTP 1.1 is widely supported, HTTP 1.0 still remains the mainstream standard. Therefore we will supply a summary of the both versions including the corresponding Apache constants. In mod_perl these constants can be accessed the C> package (e.g., to access the HTTP_OK constant use C). See the C> manpage for more information. In mod_perl2 these constants can be accessed the C> package (e.g., to access the HTTP_OK constant use C). See the C> manpage for more information. =head2 HTTP 1.0 Status Codes =over 4 =item * Successful 2xx: 200 HTTP_OK OK 201 HTTP_CREATED Created 202 HTTP_ACCEPTED Accepted 204 HTTP_NO_CONTENT No Content =item * Redirection 3xx: 301 HTTP_MOVED_PERMANENTLY Multiple Choices 302 HTTP_MOVED_TEMPORARILY Moved Permanently 303 HTTP_SEE_OTHER Moved Temporarily 304 HTTP_NOT_MODIFIED Not Modified =item * Client Error 4xx: 400 HTTP_BAD_REQUEST Bad Request 401 HTTP_UNAUTHORIZED Unauthorized 403 HTTP_FORBIDDEN Forbidden 404 HTTP_NOT_FOUND Not Found =item * Server Error 5xx: 500 HTTP_INTERNAL_SERVER_ERROR Internal Server Error 501 HTTP_NOT_IMPLEMENTED Not Implemented 502 HTTP_BAD_GATEWAY Bad Gateway 503 HTTP_SERVICE_UNAVAILABLE Service UnavailableStatus Codes =back =head2 HTTP 1.1 Status Codes =over 4 =item * Informational 1xx: 100 HTTP_CONTINUE Continue 101 HTTP_SWITCHING_PROTOCOLS Switching Protocols =item * Successful 2xx: 200 HTTP_OK OK 201 HTTP_CREATED Created 202 HTTP_ACCEPTED Accepted 203 HTTP_NON_AUTHORITATIVE Non-Authoritative Information 204 HTTP_NO_CONTENT No Content 205 HTTP_RESET_CONTENT Reset Content 206 HTTP_PARTIAL_CONTENT Partial Content =item * Redirection 3xx: 300 HTTP_MULTIPLE_CHOICES Multiple Choices 301 HTTP_MOVED_PERMANENTLY Moved Permanently 302 HTTP_MOVED_TEMPORARILY Found 303 HTTP_SEE_OTHER See Other 304 HTTP_NOT_MODIFIED Not Modified 305 HTTP_USE_PROXY Use Proxy 306 (Unused) 307 HTTP_TEMPORARY_REDIRECT Temporary Redirect =item * Client Error 4xx: 400 HTTP_BAD_REQUEST Bad Request 401 HTTP_UNAUTHORIZED Unauthorized 402 HTTP_PAYMENT_REQUIRED Payment Required 403 HTTP_FORBIDDEN Forbidden 404 HTTP_NOT_FOUND Not Found 405 HTTP_METHOD_NOT_ALLOWED Method Not Allowed 406 HTTP_NOT_ACCEPTABLE Not Acceptable 407 HTTP_PROXY_AUTHENTICATION_REQUIRED Proxy Authentication Required 408 HTTP_REQUEST_TIMEOUT Request Timeout 409 HTTP_CONFLICT Conflict 410 HTTP_GONE Gone 411 HTTP_LENGTH REQUIRED Length Required 412 HTTP_PRECONDITION_FAILED Precondition Failed 413 HTTP_REQUEST_ENTITY_TOO_LARGE Request Entity Too Large 414 HTTP_REQUEST_URI_TOO_LARGE Request-URI Too Long 415 HTTP_UNSUPPORTED_MEDIA_TYPE Unsupported Media Type 416 HTTP_RANGE_NOT_SATISFIABLE Requested Range Not Satisfiable 417 HTTP_EXPECTATION_FAILED Expectation Failed =item * Server Error 5xx: 500 HTTP_INTERNAL_SERVER_ERROR Internal Server Error 501 HTTP_NOT IMPLEMENTED Not Implemented 502 HTTP_BAD_GATEWAY Bad Gateway 503 HTTP_SERVICE_UNAVAILABLE Service Unavailable 504 HTTP_GATEWAY_TIME_OUT Gateway Timeout 505 HTTP_VERSION_NOT_SUPPORTED HTTP Version Not Supported =back =head2 References All the information related to web protocols can be found at the World Wide Web Consortium site, I. There are many mirrors of the RFCs all around the world. One of the good starting points might be I. The Eagle Book provided much of the HTTP constants material shown here I =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * L. =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/http_cycle.gif0000644€ÿÿÿÿ00010010000006504411727205031022041 0ustar ????????NoneGIF87aX0÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôAAAòòò???ððð===îîî;;;ììì999êêê777èèè555æææ333äää111âââ///ààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷DDDõõõBBBóóó@@@ñññ>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,X0þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ48«¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨ÉŒ*]Ê´©Ó§P£JJµªUšH¯jÝʵ«×¯`Ê{2+Ù³hÓª]˶­[œfßÊK·®Ý»xgÆÍË·¯ß¿€Ý+¸°áÈß%¬¸±ãÇ#3e,¹²å˘3Ï¢¬¹³çÏ çrMº´éÓSG£^ͺµk›ª_ËžM›uìÚ¸së®|{·ïßÀýöN¼¸ñ´Ã+W‹£¹óçУKŸN½ºõëØ³kßν{õZ¢“þ.OW €=èÓ«_Ͼ½û÷ðãËŸO¿¾ýûøÝûsž¼ÿ·J¤ñŸS¥ð'Wr&hU€ .U`v­rKƒº1HaQ(žVÝέD K‘@ wXJ875T³Îö-[T~SE-S|C+#\6pÂI½Ð€F&9à‚6ƒHé¶pÍ,ešÔ‚µäÂG*' "Ç’  Ž+˜YÒ 4ÏBÇѳÉ-ÇLÒ±ÅDÏb´þÖ\{ vº?°êÈ3M³ LYÞí” èRG „•Ò•¬Q$¿Ì¤:ôÎ9ï´óZT²È,°@ë0%õInÈé̆g*éšTAô˜dƒ4Íp\儯û,:¼>Ë™|7¬Ïâºî¼Ó:¸ð2ÁÑöK‰oµ $ä !ËZÁÑ< Ü S¥Ñ¹O ‡žÓèj!8 ?ñ3MºÑ÷"I_Xˆ°¡2 U„›4VÒ€¤D<4Il¶ ª-¯yD\ÿþW’"ðƒ0ñC:d’8ÉQ¥‰(C Ä–e„ÀœhžKø/¸Ïs;‰ŸünB?ä(®$þ$€€I @‚t zC…Ó!»™Ä¬ð ”pˆäØ p (üàˆÆ«DÆ’¨`%@ Jb‚¹)AÏ;bM¢E.z1c„ ÊÅ’,(¹C;J‚yo*T0ÆÈ@–e¸€tˆ Û÷¾œèp‡5é!ZT¢TéÌxC+d‰:\ %25î@ÃaÑ-8¡{Ø¢%±Ä)Ø¡^ŠçΰG˜‘¦Yü‚ôF8JÄ€R”2œe-o‰/OÂ’ .±GAP @ž¤L`‡9âQ<¬AàA‹ZI¾—LÒ†•´É%åâf:F“gþÉ›bƒ2HŠ&4F0Úi“Z¦e0CS Ú’c Aé„É;o(O¹¤žñ*œ“*X%€F9¢¤„t¤Wñ¨ƒ 4%†631.…L Æ@§Ät%»ØgÂed ™ØÆ5¸ †s´C÷èG p€D0â‘ Ä>àÄ%E¸CNìi±«fµK±ÄÚW­ÂU¡à“,úäåMÛbMÒD`(¨@€º¶Ö¤ 7ù7*ЊX(ÒÒ¸‚6¼1s¬á ò¸Ãþ€ºDD%B'¶n€à•³(Ç Úà{˜£ %A´/‡™$§H?È‚èÍ"ððþÇòa' Â*‚lXK‚ZÕ²6z¶Å-VàŒ–ĸKíj[[ÍrÖ³ …hBZ¢œu,i-L‚×Õ¬ 8A¦€i0á [Å ¶KÆŠÌ8Bxa ¼‚*8)DðN€ ªÜóªVKâŠýôbþèAIÖ;è`o˜Bi9æÕX•¤Ä.è_ ¤(ƒIîAB›aŪ…ga sØÃ³ ±‰QlÚ·xÃ^pƒá åºbÉ.&» zì&Uð‚ €oP£[ß —I¼`Ï2„&Mð€¦ (<ÁMX‚2’pca†þš¥!ȇ/™',ý‘’Î"Ø0IØ4‹ Ú€#ráãjúÃ2DGA˜6 ,Csè¤x†;gD›DÑa´ˆ(ÝÕ cz Œö3 Mèÿ˜¥˜Zë¹r`äDñP3T ‡ MiŒÆck‚‰ð´†oØÐ!9w:%ôø‚Izd’| Y€. mÚNÈ£S%ˆ’(`Ç4™t; kc{Úæ¶µÆ½Ûc§[%Ά¶´©%TGKÕ«ÖŠ!\“" ý‡ `;ÙéSªn@%ZC÷‰ê(¶Eû©Vôa<€XQ’0¤ ¹°þÐ[c³ê´ ž,”à@/¼  o”$å•D‰d|br¯¼å/ùÌk^ò÷\yÊÍjožá;ßViuNN± uР €Û,8Àƒ«DÕ½vgÃ+‰¬Aâ/ )€Mò‹xCÜè½Æ ?´^¨m ú°Z`­ªÈ‰; `" }xÃQ¨£ ‘€áŠ>ò³˜|U-yÍs~¤7½xäP…<ä•”g}æ7_ÂÀðˆW<ãoÝ®“îë`§J‘l\ÁŠ(ÀF'–ØD·§¤]ÃÀChþR„1±d¢•Œ€îÂÄØ‘)+Z€!'ß*ß5‰hB , ®”0I)O©Ûmš¤L`) 42‘âpH(~pV ð0 Å@y1~¡~gÁ~`á~ïGoN ¸Ðz…F)ÞOpV6P³0  <ç7q¡wna_8 @úc³9µS)Q&¨§"`A/xƒ™d|õcPÖäIqMO8ð° ÅÔLÑ Za~ a§°ƒq:jáP…SPj)Ñ OÀ[ñ‚wJ84èTÒ=SFt‡z¨‡@°ÓöX³€™0)q=9aˆþ'Q»¦Z  øã}€ðŠ8ë 5”0}ƽ0‡/1‡]Q‡„“‡¨XF{x "ˆ³à¹6 ï/óR¿À âÀ T@n¦6‹ó{ú°)geþw^Ð}p- ¿§G°HôH‘”8äÀgI(Š1AŠ\Q‡þ—Šz˜‡zØ p܃<àj|Ó5_S¨p³p K†G²5îø7³@1p ½ .¸‡˜10€"y`Õà ðÐ(¤B,ô.ä C6Q jÈcµÜ8ŠLèC4a‡‹¨ŠÕ$)`;øÀ'±;ñ‰s°þ*Á ’{è’ñ‰³Áø[ º&h Œu£ð Y4l—»4 ß>ã³pÐ è£>9á,µ *)qÞ±•\Ù•^ù•` –¦ð‘›ÄP4)?i–%‘®`3 ¤1é† dâA+áP` ‰|vѸ u LP|‰ó€ ð'Á8º`cBOA9–ƒ9=±óW¹ ŒÅ–œÙ™žù™ š¢¹ !$¤k©b}§Y÷ D%QG]ô7¨póˆY¢"8Ð~FG[›&ñç0!Ycا}ñ1 nѰ]–0 9H)Q2'“2+Ó2/33þS8pÙœÔRh-muŒ-ÑV'pw³ M¶„KÆ„‹º˜%eB.ð ²DKíiÎàVÖ.À€øz¹W8 ¹€ P4 úà™¹`¹²+½ò+Á2,År,ÉR1?q 'H—}ðšaƒcÁ—Ÿñ §r¢a&ãY n'rB'v‚'zÂ'~(‚B(lˆR‹Ò(R5EÛ`Y "%¢™A¢ba¢§AhPŠ­p3’ p#9²#=$A2$Er$I²$n©Ñ@W'A¿ç¤˜¥`aWÆ‘ m¦˜%±¢•Œ•‰rút¨þÖ( ZzC´Uõðz("•H¨1¨’j©ØÀ-%Am¦nÑ  ø“¢•:©RZª4±ÙH€%q !vBp™(ŒˆªˆA©¶úb@b €TJ †Q«'‘°¦¹j¸z¬+![jg›`ÆÀG*!‰»»ÜÚ­Þú­à®â:®äZ®æz®èš®êº®ìJ®\¨!ʺ4 ™­(! 0…Ae@ª'¡M'ØÍ€²P°{°›° »° Û°û°±;±[± ŽšjñªЂV 4° ÌÂJ=*°¯’«'±÷öþ§š|l°Xÿâ4`­+išúͲ¶º²¦"+Q&w` #B¹q „’Þ´m6²({¬> ¯$„M2áŸOñ²™Q 9`%%› -s²ê;+µ,ëu5áR©‚ˆ@Ѷ¸‘gg ñ€’:˳¨:µ-µ¶*Ae`’Ç苵XãR.çKCl³p¸æ‚.?I¸'»÷ð#÷Pûx-QOµ*›¶Çç·ûô“øè7%á4P#5H˜rÐ:[À…¨5Sƒ='QºïèNàŒàUEð.Á€Yy‹¶?â%©™6é‰%Q;+QGP"³à¼/þ…Ë‹“«Ä9©Žñ© v@0q¶Ÿ[¼ˆ³kÉ‹vyÄ® P  8¿×{ïû07Â[‚K•f«·¥Ê·’ì;ºYÔ›w4 P$ETdE&Òà´Yà^à~à® ¼]¾-©÷]r 1Q ŠmZÅ`±¾áÞáþá . ‹jÞõ½^ã˺pÁ%aá%NÉ ÕÎÝJÀ%0ÌpÇØ‡óâËíã'q‑ ¢€;Þã@ŽÅInß3® Ý/ÁW,¹änŒåÔäž [ŠU~åZ¾Ðc¾v\~Å/7]a^æd>æBn¼Y¸…]x—o À5a þàžpÞÛ>çÆˆƒXˆ=±ß³©© ¡ ¯@Æ(Áç~þçAÖà„*èëûб(¹¶Ÿ»Øn%ÂédŒÃXŒWFÏë}UKMéígéŠéé¨ëX»}s»ñ8õØG÷˜ëúÈþž  bŽ­þê°^ƒ².§´ž’+Ù’Õ3 qé<öH=/i: <é“#‰ £½€ÑÔ¬úÁàìÞîîþîðïò>ïô^ïö~ïøžïú¾ïü>ïj~Ýr~æ8!lé–û[×>“sY—-—zéÙ8ðï,ñÇžçžî.áòPßñÿñ ò"?ò$_þò&ò(Ÿò*¿ò,òæÐŠ$ŽåÑ~ž&Ñšì›óÕ¼!éY6ìž·˜‹»øM{@Ÿö)]¯Ÿü #b Bƒ þSþQŸ«TOß>ŽõAñì4À+ü³*÷sŸñRªwÿãK®÷oÛêŒÕ°ˆ> †º=tø¥šø1¿øŸµFëâ*áˆà•õ˜_©šoõ2ßù} ì€Â7ámmÞu?õU¯ä¿Ñ‚A„ü Àâ,Aû¨o÷¹Ÿå»ßØP-Aü1þqûˆü”\挿å ‚0ñÕ, å0ý™/ýÆLý®Ÿ§/Ñß.ÁýÞùÆ÷/^ýjÁßRàþº ÉHÏŸúÄeÖ,,ü¸˜PáB…>tÈpá2Wòà C˜°Š5‰=~RäH’wá+™RåÊY'°„SæLš5m®ü€ÊMž=Gúñ0ò 2$=TéÐÕ@WU¾œåªGbð4sV¦áTŸ]½šDùUlK®cÍžE›VdÎjÝ2ÕÂÓ€rF‘~tÏŒxNgÅ‚çoK¾î Úã•“YfÒiKn Ž œ Cqµ%þŒ<¹òeÇ÷ØÃ°` ò·GC„ÁN¥áGŰ·)Oö¶éøpâÅa²5NÒŒ_’NÚì i'ɹ 6lâÔÉÇO Bˆ1ŠT ÎîztØ€/FÌg5 u C{‚fßٺЕ?½øëa ìAÇ“oro–ýúû/Àù¨On‚O¾YîÀ>{œ*@v¡_’‹D–„31E‰Cn,@¦¨ƒ'È‘©¬‘ê ) <¨€ˆ~’Ÿó:rˆ† €¡Á),€Ñ'³©{0?…âÀ&¡>êH(ÜñG)§¬r +‚R¡%›ô˩٠BçÇÁƒ ,©„ &$H xÀ‘FnR¢ˆžy&*¨¢`cÒÌ0J2ˢ狄ءg¡hçË„bµVWBUUVZs ¾’ÁS!9“í¨NfŸ…–$=½¢‰„‚YãA¨Bg D°Ùã hlˆ!$’@U¨%|j3ìJê¥[n1u 8˜FVë»O×YZéc €•ÈqF ;ØB!  f’ .øà„_ehß~ýšX ¡zñBoð\6Ú„œu9f™š¶«?<ÊAŽzÙBŠYþpÁ ŠA$jAZrá#•…U"&V)éŸ,8‡^¼*Œ¶Y P§H¼61R`¬1ˆ2šå—¼Ñ‡›Øý↠ì±F …œH¡5h ` ·á–ÑÒbl±Éæ;¶bg±“0úxcFXkf˜gæüÙš}òG‡ŽÊ9b 6è "ðb¨ˆ|UˆQ8¤ZªØk­oJPæ\ÈÜå–cÞ¼sãíü¼§(êñÈA Ð¦—ʰ=† ñH ÞBÒa’hHd ÐØÝ¦Þ]¶áVfÞåâ‡?Åäyr# +ff’"̔ƅ2+|@%¢G[È&þ …[@Ái Ñ…B"„’Ø ³ùFržŽm.ƒ†CÚ@vŬ}Ñz_üTXœùñä?X;J±½„ Â 15î@\ÆT?JÈ-8¡{Ø¢ ¡.DghP$ˆÇW¾Vq%'„V ­¸E´´ð,µ`FÖ€Ó j\p$¬ Ã,”€tP‘‹o,ç´G:öÄ‹fY@ ¼bètemÜ`Ôê8ÈY`ñYs$d"£“á<¤+ëÈBH˜p ‘ØÀ A—Þ©HE’Yˆäd(GrGÎ5£!ÙÀ(H²^`š EYGO& ”³Ä¥DH Çdƒ$\(Ê@þ€u¸1—+¬%žnyLfî2fpOd—as“ÌÜb2ï´LlâÒ™.»!B %Œ$Ü‚BªiN8Áï„g<å9OzÖÓž÷Äg>õ¹O~öÓŸó¬FðˆG¨nô›ÑÒA=¢†.˜1$÷¨ÁBŽ6äeÀhF5ºQŽvÔ£iHE:R’–Ô¤'EéGW&G‚›}V:Cbƒy‘ÄP ™hE]ºÓ,¶”§Þdd¯àH$tøCŒ€vüÔ©ÛôéS9 ÓdAÁÓìH:0”!˜ YjS¥:Vq“¬o¤j²°Ú‘"U$ÉØ„DŠ7œÕ®Ä1ë]«˜þV;Ù`"YëJæZW½6-y5,üø:§ì $ °ÁH"8¹Ò5±— b1˹ÅÂÉ”õˆÀÙÜb neHUÞAüÓµ¯…mle;[Ú:¡„Ýl";+³r$‚$P  V;’fô!¥ÇEnr•»\æ2·—Ó\Ts¿Ý¦Èb° nË!$i†9¦k§@Wfšo´ªk¢* ×#Ž lH.¡Št÷»ÄozWT^–êŽëMŽ ©[##!A[:b_ðæ×¿e5/n¼E3‹^ª‰0OÂýõð^ƒj<d ÉÅH€ ƒh˜Ãø qrøÝþ¯°ÂÄ€ƒ<2 d(I 3ׯvŸt̬‡ Ϊ%F"„´}DÈDIx—<œŸWÉ[¾S“{3@‘¤8$4 0ð×"ƒÙ-]–°›g&æ·P€ ‰Çv;r wèY"jfs–,g´À9É„žóˆ9çŠûvÄaÀHð J‘ºÃˆ.4’QøeL›ˆÎ*:†)zò¤±Íh)Í– ½éN»ìÓiჟWÂ&„Ô¦ôG “‘]Óä| 9œbªìÔU÷´ÕêUtÌr±†i|Ä É2Ú°™‘øÌ;µ¨¶Åé­±$"“j±Éíc³(Ù.[¥=b LþˆDÿ#‰µQ¡ ìtÀžø¾#ŠQ ¥`;êõ+ÛàF74\Í`òÇ9¥à¹ÙÚLƒW1'á­9b(>‹rÌ  þ°‡9º0‡\â:Mjl©ic—›Éç®"ª÷Ò–¤ètþxÔ " éЇB4"…T(!!Ù@‚"½*Bû6ðC¡ølåéYì ƒA¼a J÷Ó‰nª«¯Ä.ÇÓ«Í2Œ €¤æ Å RróSd@R”ª&‘©@àŽp%Ô1ð| ¤MyA˜ä$ŽÍâq‡H∠‡œ­Êgbü«0œà\0`„™!ïÉ—þé,7Ú“¥ö±L@©7|ø‘\°Y%Yª.žm'äX Öªž•Çýž! ê]ð™Ó»| WÓ…±p{Ê»õŸ$·êÝÂz±\µ)2F²Ä’´÷Ø=‘z?’,e+õ˜¿¦‚t§´e*k¼ÀôÅ/ùë? )H†\x˜3`?“¹¿•*¼,º>[Ê>íK î#òó(€²‘¨…œ@¿l[ˆ^S›ŒˆœÉ©èRœ±ášYhÙðš¤Ë99²ñ  DˆÃ!›Y‡øƒ6€·RÁlÁ4;sÀ9À®ø=ø(  8ðYØ«H¿!¤ qÃþ>*„“"ì `‡ \RБ¸™2 ˆÂÑ@,„ +d@5T-ì‰a“ˆQ˜½›¸pP]€ÖÈ57œ 6T¦ôî€Ã›(š¨XX FÑC> -ĘD¨ŠÄä(ÄšH†803‰ UP((…v+ A£FœÂJ,‰I$/ADE›¸Dš°Tøˆ~`‘¸…¤"‰`8MÊ@Â4lE&\À@ Æáxű8úl+ ­^üÅ>,F’PÅ9A¯i”‰cŒ‰jð,‰à‚5µŽˆ‡š\€}8Elôˆj„“kdG–ÐF˜MøQ€ˆ‡G(‰Z@ þJtTG`ŒÇ…pÇýbÅ‚T‰yd‰E¨°7(žPÀª>/t¨­ŽôÈÉt'FJTȳ`HŸÇ„nŒ ŒÔÈ‘X†æ¢Éš´É›ÄI:„³;I±HÉ”Ø9\ˆšú08£‰P†€ÉžÄ&xtʵ€¹9Ax C†Èìq;k‰l(ƒ``[€SŠÊ\‚ʲüˆŸ$‰_(€qú%øFˆ‹°K´Ä¥³ÄK]šJ.šß" ;ØÄ…¨ðƒ½%½DL…PK‘QøˆxH“   &XƒºdˆÂ<ÌÅT$ÅôÌYhÌøÔéhƒþé¸ )àÇŽ ø‡ÐL$ÐôÌщZXŽèE 3ˆ/‘0G‰xÍØ”ÍA¢ÍÅ´M¨5™È’Lˆ\àòˆád-‘´ÎëÄÎì”§•$Æâœ‰äìXH°ú Jx;¨Z‰ðð2®œ”Ïù¤Ïúô¨çâIï”Ǿ4øJ` |I‰Á”÷„uŒÊƒT‘ãDLðT‰ZøD†ˆ‰ àÎY­G4¼dÐqн„Ð…`•ˆs˜ËL‘èm°L‰ØÐ HDÌ-«„ÔÏM0‡àLˆ^`—„H’P®ü€@PP§ÄQQ¼äþÑðˆmŘ ‰Ü %eR‚ìÉ'•1õÎ) <¸‚ôôˆkpõ0mÒ1uNk4ÓâœR: K‰@±Ú±˜‰’ˆ€9=I25Ž(EË)}…ëƒhêB=T1MÔ:}Ç;•Í)ý†%”ˆQ…øf‰^°È’ˆV±T…TÔâ`Ô²DS˜˜iXÑ…èH‰TÝ<õÌVÅ+M M%†û‘ˆ]Ø8µ’ð™ X€|\Õ‚ôU.ÖÚäOâˆr`Ó8€ˆò08±Y g…ViÔ5ˆ˜ÌJœVàxÕ¨äQf] 6N„† D†q}VDþM€=€AEÅuívuJ½…p•ˆgR…(†W¨U…0'* €Jx‡z؇ €P€xI¨LØO8‘ÐC€ " è‚=Dx‚¸˜•Yš%¹Û€¸íé¸ ¹‘ã89‘+,‚} ƒíIí‡!ðx€â°Ø£Úž› €uœ3‚ðÀ€¤Ê¨èÚ¯…°;¡kºYȺ­ëº¯S[­ã:¯;ZLEHýÌÆk`€Ž¨j¸Ê…õˆr8 –HUn _ÀYx…P ð€ À€ K¼8è–6ÏYø8%ƒ‹ Ýþ]Ãs“è¼>ø¼ÐS]Ï=d 7ºmÐjEN¼ÀGü[P–°uà×Yx…QÄYp¤Lˆåeã[ˆæ{>ˆ¾^è›Ûü´Û”Ïx('‰¸…O @ /U .hBà×] ˆÚ°­è8  À5¨ÅY˜ßú½ßüµ¿÷ˆÿ À `@ @½BÚ7³ÝÅ]·P†h\DÈo„Wø ^‰õ]ÕÒ˜A¯ÑOƒ+Iâ….á:8áèA´AÔA·ºAÈÁÌ^!Ü^œxà´¨…hØYøedDÀ…‘@P` &hàþ`6W¥]m`íád±€@ O¸)•8…vkжŒÖx\`µPÚ“´ÍZ€ >Š^™`—0.^2žâÝáýôBâàƒ$èˆax4S8ˆ P·”Àƒ@cÙB˜cv,ãêb)½b³8?eÕ”p¬ rð%•‚5À²Endl|äB‹äFdàÈ…•' „‰ˆV€Œb´<å³8c…ÍF€€Ž8€ðÙe9 â’8µe\æÕÅÜe³èå‚MaÔ…˜Á‡CD±,°×”Ðr€×f.åiŒæ±˜æxMØVx‡,¸T‰fHæYþèž§ÆÆŸl€èa(×… €·îi›W’ø†X¨U·†k®.ìŒ6< å…¨†o¬v8¢êžX€¶Ã6¹žF i‰Hj‰PƒþP (ˆ‚…NˆÊ¾l̾hÕNˆ”„±Nˆc€‡.Vˆ`¨ÃŽ‚1@Ò‘PJ‰D`íÕn†¬…1ø¾„¨‡è XIÅ”°jnán/»n¾Ôh´°ë. No\ ?Ðb¨îìŽ3ô¦™¯ 6 Ò” Hî.e‡{öU€Ï‰Ö¢èþöïÿÞNâfíy‚4ØV`ã…‚ ˆØrPÓî´ üÖïGŒÏ™Æð ×ðŽÂO›VïyDàÄØVM8‘ m‘H£–€Ýç½LçÌêêƒeo𠾑ØïùˆFË’€nN ‡ñýP]îç2UþoƼñ˜0‚m‚ZØ8‡30裒HøÝ1vä$_Ô_Ú&‡ ø‰ ó\$pOíˆdÐàÛè•Øò.Ï岜ñ¯ÐìbÔÆOˆe†ÐLV7ßø[‘…ÂU‰:?çbÌs¯Øó`´M\\ $P‡CÿXL‰€²¾ósWs4&ó•8„_^À5…ˆ€íˆ~¸¤µ” Oõ—bWíW x¸íYðp€S&hƒå¬‰\XXZ T€hô`|ô®ˆôV|E&P9†øÆ]SGkéþ1pBþfwv/7åQÿÕ%oíS§‰a ¤…ÈÐH¨`µþ@X„gW‰T#´h÷‰iGÅK´+eIP† H(ª÷þˆj(£™¨÷{·TLרˆã+õ‚â÷žð÷J¼Ä ‰ðØž…[8’N.H €šxx~õW€XÂÓ¿%ËxžØøH¼Äf UYö<„–o_‰ùÝÛU]Ù–í¨Ð÷ÎxˆÏxG8{Ș…’‹¸Òˆ„4¸ƒ˜ø»ªù›¸ùATKSô‚HëA¸f,›‰ùMà€èOø…Pñ € !ÀZ­ý•a¡<9g8[±{‚w€&H¬¯Ž‹§fvçm4T-@‡þ=…¸ª #h‘_Cª­ZØÜÎÍïÁ>‹'PðÔE¼Á¿âüš{?„Cˆƒ ¾¶ˆG)ÐJ’ _špÖ!À€K° ¨J˜„ MáO<8^ˆH^ÂOÀWy}¨€ÞüûµÙÕuÌ.DUOÑ °’`õg‰ùP1e_÷-[ˆßY8ð™ ˆ`“¸ÍšÀ­‚ ‚À¡—UÞ(h°¢ÅŒ7rìèñ#È"GŠ<Áˆ$Ê”*3žÀ¸ò%̘2gÒ¬Ió *6Eê܉įkà@ÞÊ5’·`6õ,0 Éfæ>º;ènVUWåTÉþ“ƒÕ‚NRôYC+Ö°Y¯ÚÀ¦Ï›!'צպó.Þ&óò娲/àÀ‚óÅÙspµ566æx·18þ¡d"Æf1tbœB)•0èТaîmó¯éÔªWï4 ú^޵8Òàá‘S‹‘6¶í¤1‹È,EÊú8rÀ¥“«DÍü9tä®W±1Àl€‹,¥Â&…÷l<:úô!—«ÿè¼=üø6§ Ç%¨º]»¥ùå1áH4¤àCM:LqE¥à@qò9˜{Zôž„ZØ}© ÁF`@²Q9 xTHn"±“³ø–à‚ ^ø¢iVH!Œ5>˜!`þA8툴KfÔT8•€#.Ú¸¤r'ÁH#“QF‡ch̳‘)Z|´˜Hd¨R ¬$c$’JJy&M2J%šmªFe^¦4£ ÖÈ¡Ñ6æØÆQ8ñŒ¶GG&iž›…¾¤æƒlº¨`pÞE…:FeDCÑpmE8 ’W¬(S'Üp¹)<`&£©v„¨ƒŠªúê|9 ¶Ë=˜Ñ3£räÀ§¹²©Lø×Q©§ +²k¡«É:«’£6õjkLKKg ¡+H{ÆDÃ’zDD…Ž骻.»íºû.¼ñÊ;/½õÚ{/¾ù¾Ë²3ºô,À0E[“þ1l$Éáp„¸™°‰H†Ü9S'Æœø¹æŽ´L{ü1È!‹<2É%›|2Ê)«¼2Ë-—|HÍ<³GÓ4Ây’ KìR2m€AÓ5Ö4 м4š23ý´Í3ÑЋFhPQ:ýÐTŽL·¨rØÑI?=¶N“=sÔ1]“]FSØ¡Ñ"r´ÈÛ!=¢ÃL’Ø¢ŸHH+}6àkþ8ÙiÃôÃË´ù°Q/mtÒWÓb4à=Ò|H8èí™:¬†¯tË wtyGÙˆ´Ìä0íbËÄ$uþ9é¹37ºîŒšN“‘e$G}Ã÷G8Ü'“,Ü:þ’(DÐ;õ¬ñ^½›¿£DCÜv‚F! ÂÔR*¦Ät˰*E?=öñ‡v½üRjOÔl –rd„ú@Bƒ O%Á FÎV"D¢~ ýh£ûä„ÐÈ㠲ͭäg1a¦E’6P‚&ÔËàNh( ¾¤ ®³H>¬‘Á‚´b ñ5¦)&$$‰ ô%Ä!±ˆF<"Àº EP…b!Hd½²B=8Ân#f(L†aLÈ$àgúà²5²±n|#áX‡~ Ή©‚âGz@€ìL„Y"mdR IÌÄŒhÉgìVÉþ§‰Št=Â]%C)¡Á^¨pÇ#ßÈ‚EbøÍ$ ä±¹;:&*…ªŒR$e³ˆ"#b€†«ÁŽh€$ã[‰ ÌQš˜•ˆ<Ï+ÃÈø82™ê‰%°Ñ¿ŒH@“dAŒpA¨.%Zª (Àc:9Ë„O3Ë9%Yí¤UÉ9,©lnD~Z t1Ø„sœ!I¤:UsNѹ2 ‚¦F®fS\LEQ Ì<Á„0¡ ¼Y 8äf“~¢Ê óce« êQ !´ ÒŠ¬DçŒiQ«ØŽ8{8¥Hd›éz”¶Ï±ímƒÐ]Ô2#C³Hz°‘q°ã©¹E)º ’x ´/ÉMmFt al] "ŽƒDþ9ˆ#Î`lvàïAÞéDëî²ÙeÎ]-‚p°­÷ÌÈ>*Õ‘N¢äm˜)`<€ h!h€Ã=ü0€(¨D8ŠT°#$Bx®Ї]ä¿.¡.ED 9À÷-È8Ôñ8Ø‘ÁÉÁîƒM£W|ÔK‚±^¦Dh Œˆg€à1“ð Ð1 t@ÃÒ}s  ø##ïˆÃ.º`6ÒÁQ>4 ‹ÿ¸"ƒDPÆ> ‚†P¤dãMCbi,¼¨,X‘‚RˆÀš¸À$. Ž¼b̰ ˆS­9£º ý¸Ã”ðH'›ÓÏþ^ 4ñŒ B“ŒÐÅF>ÑÝ@¦ š!L;ààT¾³Ø=L5‹  ú9CN¼ —Ü‚A.2gŒb2¸ÚUö3[ß:5±Ì ʰë‚CϹEC5RŽ-¨„­ ºPŽNÀΦ ]¸â°Øec)ËYêrºøƒÌMæ33ÙÝn»²3&ÐXAvñ·YÈÓ"µÈGf°Í‘(â„áfCpƒ/wã1¡µ25nsÜv&Ȱ!Gt0Yg?å,Œ6’`x#¸I…7&Z™;{ç$Á¹õtnõFõü%,Ç© rƒiÄ™ÕH#˜Lý(/4¸þ×X¢ê[_ÆÑ©õ»÷%’éè)ší‘ÀZäìøíH*vÀc ®àÈÜë^s¾_=良tºž’]´Á ©Å°@ÚŒÌ#ñIp°&†· $üÈ \Àî˜÷‹å}º÷Û·Fó(ÉÆ*¼»¢^˜ijˆZ5²A’<:0^ˆ‚^;2ûÚOž÷îÉýU­ÿ&ß¿äc@ý,|`¬Œ¨w`ÆR?â‰. ½&óPH8—W_û¸_·ýME&ÔnÓ û üu„€ÍGЀäÛ]°Á”œGÈý‘Sþ•öÍÕîM ÀpŸHTBmD, dGìhþ`ìiȉÚ^þaÝj@†ÁÁLuƒÚÑÀœÝ,ÂóXV,|ÂHŒ3œ•M¨r‘Ä&€ðH` z„ Ô6aJ Ô)D`íá%Ý(ô GÀAùÍ„|A_¡D.á?¡K¥¡®!¶¡ð þI!× IhÂqYL”dQFd‚ pÄ1èF)pØN@ŠpaHl`IpL="$F¢$N"ÉÀÌ“D¡Žq^ee&Ä”eIÃ3l€Ã(†D'ìM^B€ŸJ("#f"ÍÀ ,jÕX„ @ÃÕ‚Ó}„tÂHA¢Å„ÖC1†„&ŒX-Î þ-6cAP®ø1tD ø±Ä.ÈÂwÝ…3ˆ"¢Ä2Š 4>Ë3BãýTԧЀ C°Í-”AÿÄ:„H0B „#LÈšãÌÄ8–£9b"@nÄýÀ)XD2d&œ€F¸bFØ ÜPAdáK4CŒ‚MhÑ@"Ë96#‰K)PŸ bAPyé#½CôÑÄlôB´_Jh$Gvä«|d-jÏ3,6ÈÐY00ˆFD€c€”‚L¢D80×ÜE&€Ø$¬à¤,j ˜aA ;,ƒEüB dP4¨—uÄ.xÞ]0€"$¥JTcFØÀtã, 9°Gˆ5 iHPÍx*_\‚Cªõ!ªh(*•Þè~DÛ=B"LÎÂ8[F°ApjD, BLLƒ1pijêÂh ¢êüÄi96êþGÌh ¼¨e}žGŒ•Z~„lB2Æ'˜*ï+h¨jü¬3±ª’fÄ.¸ÃåxÀžhŸD<Ø£F¸;@§H€A¨jlk·+‚kU!kà¬/ÔA˜'@Ãt ¤`(«dÄ/´ŒŠ€JéB>tÄ$¸AL|À"T«`XÄÀ–™Ã”ÀòÁž ìÁ4ƒ)5l¹Na«¢EVV ÃŠì—M*G¨A¶~xBt¬É>©G`„l¥¬:­ìö,Ù$œ' èªè)¤? `ç,Ä<øÃll]DBÜA´~1VVÂøþ*˜åõáì¹D9xC¯pýžET€lÄ=¸C©Ä.€Cq&‡ÒÚ]ºÉÖÄ©…UÄíÜÖ-½uí׆m9I-QíØðøæÖÄ‘Â.ÐøÂ}@øØÁ;@´Z]„=‚ À„Ä ¼7`Ã4Á/Ø‚ ¼+¤ „€'lÂ~åí,Ü*ÕCyàM4¸ƒQÁÌÉF¤Ã/’D7p¨Ž†€0ìèæÂ~¡Ô:ØÆAÜnîîî,”îé¦îæ¾iƒIç¢>Í!±‚åfƒ>Ìœý×ÐîÓzíz+ ¬À´ªEÈ €¤ÈAbþYÄ÷΂Jà:°z”¯*¼C=ìCÀ(@<‚$T&l‚'„‚ ÔIYÀA:DWÉ–ó;ç*‡ç>ÍXÄ:(ØÏ<@¼ZDÀ C·Z ñ‡UTÃ6„ƒ°A<ÜC?!¼p Ï0„Áa¾ÃKl9 ‹D-|@7¹AÌJd¨äqT£ì™íðààÀœôÁûRÄcD_qþÚgFXèØÌC\äÂ7\àMqC`K!XÏ‚®¨.$ Û0Áˆð,œâHpÁ xöh ô‚èv޶„.w­¹³œ2ôFÂâÙ@ä‚IA¸Á(Ï‚'ÜJĈ,^„Ão™À)èJœwz'w&¦6^¬¶›¶¶F”ÀYûrvœÂ þp ¨‚}Ä6°·LÐÀœ\<JLL€@^cžƒß„+·„kDB,1`¶ŠÌ˜že™¸(­Á™†Üâ+J ¸Š«÷¡‚xÖ¹w²ÂwFÁæè@,‚p(70è,°B$å<œH{ †¸@ü‘«„‘¯8åµ8 19”¦8À¿eÄdp”C-@ ˜\F@ygD!¬ñ† 4À ÔÂ-P@™¿Ä@]#ù©*ù v&< &¥Wº¥_:¦gz¦ÓôN;±Fä‚/ÌÆ ” PM˜0twyro0Áªç…Pp¤!Ä5L,z£3¸ªùi¸Ò0Ä&°»þ°;±»±›‚Ú6 èFä‚;‰%a9ð© Ü€yY ¬­ÇD9xž+”ÂmF+ƒg ¡sž;º§»¾Àa;ofLàÄNä°9À!4ÂâF6`æX«ƒÉD‚;$;hŒ{#ΧÁ<Â?¢%Ú4Ôv$NÐ\A1ÌÂ-hÍñ „€QèÀ+(ôF$ÃB`ì>4€†£¹û¢Pe&âÄÊ„ÔJ"€Ãåôƒ àÂlh@>"õ'l;JL,È‚m¹h¤|̳¼›¸¼âD+dÔÞ€ƒ ‚C ôBBìB(UCÔñNèÀ#œZ1$€Ñ›Ò+½¡0þ½â0X˜€ Ø6XC „Á—ÐvÄLÀø"RÜ‚ °‚ø`´¨}¡°}’¤A9€44Â'\ °5(já)øÑ5¨€o‹ ¨AŠðÂâs ¾â/}äãïA>È̃;P?üà t‚Pd-lA¾¥‡ TØ·Ge·~”0~ î× @è€$ Â7pƒ9ðî!AœõFTC_þGBÀªÇò7¿ó/ Ä¥¦Ç¿üÏ?ý×^fHìWX-œ3ì@üêQ‡E$P<ÌR¸pÖ8wzF”8‘ËŒT³¢ñ˜¸þ‘cG9B0äBNP¦T¹’eK—/aÆ”9“fM›7qÂôQ’gOŸOجŽ)£G‘&Uº”iS§O¡F•:•jU«L¯0ú9ÀU'˜¡Ñ&:>ÄLtcƒÆ±Ÿ³~E25ëÙ]oñæ 9²g³>e<˜paÇ'V¼˜qcÇ!®£UoåÊA‡š³¼™sgÏŸñž Ü“+¿%0¥èÆZ£daIlàÎÊO0hðpátï"Iòl¦ÙwqãÇ‘oÜ7æˆÃ™G—>=ïrŸ\ë¼Y·ÅÜzanØ(Y*³–Í §ƒ' 7>h8 Ñ‹ºqFõ%^ŸþÿþÖý«N¨çö ÐÀ›'®Üéƒ~H¦Œ3>™åv؆‡U ôˆ f¡%Šlí¾ü„ë°ÄYü À?rŽ!è`¬ÑÆŽ^,‰+uòÐ' |J`…Úyx 8ƒ\JRDAf¡ïÆÊ€ý¦Ì2˵\HÆ…hìR̹ühG~ÐI£Ž<ü°bzø±ÆxìB€8*çfÁâ®1ñªòÊ-ÔÀ2»üR¡0 mt:D;"€6R±ÆŠ1ø)F<úÐ…'4iƒŸ>ˆˆ *Ô‚öýéHÁ²ÕY“ƒtËgT‘Ö]=³u#Iéy— øy €>øþ™œ$ú裎L˜T¨œJfa¢”txuVY³í–3_oTtF½-74K’´8ú¸c€ þÈÃgópç&i(€†\²ð„s{z5VB.Ø'pm—\ƒæáˆ$Ý#?Ø9¢+xС§t¨E£#˜i¦až nGN9¢‡aTXW•Gfy!IõA§à yÚx„½ö¨g–`þ¨ä“ .f™YtY颙ž¥Œœç Ž9zž‡MÀpäMTðe‹ žÞÈJA¹l†£.ÑéµcF¤©s`:°q&oð‘§ \NÀD;²Ñn†ÎN;éà nÁ·ŸÎºþpǸ¨Í©û3f`OÄ¢€Cn™ÅDp˜ÅR? ‘ÔQ$uDH=ERO„‘Ôh õI}RgàÔy$õF HÝRw$’Ô u&`’I˜Œ€&#©€II*ar ˜œä&)¸„É –œ¥L˜Œ€$< ¥TXxA–€aŒ&Pc a@Çîð‡ÈÌq‚Ü¥“3ä¬à ÞÈ5œ‘bø"´€… V ŒØÄrö‡:äà.¨`Å]PÀ‚»œbw9*îbÜ¥)¸ËþîB Üe'¸ËLqQ˜€="({B@ ö€‚ìþÁ(Øó Q°Ç"`BÁžN€‚={8ð ölÂìـأ‰N°'œ`O8ÀLl‚IØ“b€9PŽ…¬[éò"A¶¨‡Â˜^¶Èâ(’!@èÄòÀ ¸eN@…?ö ˆœYî#¬0ä))wh_eTP‰`‘ ´A;"Ò£pÄ0Bèaí0Ã7° …eÁ ‘TÈäþðÌ« ¡¤$'71=›Ç¹¦B\áôbþèBîAÂßäÈ)*P -|£jxG=ôðÀÃ^%0œgBè<Œ‚xãÔxþ& 0Ã= sPÑÒÌ…!ÄØ6²0‰\ó‘Ýlš6UÒq9Ó¤qg°±g)D‘¢T©rPÚ‘/ ”!BÀÄTŒÃšx5ò`‰µ!`ˆF9ª{€¿)Kg!ARnµn a*1‹¯"cr*ë,Ê*ˆ=øNhé[ n¾4”$%=¾°vЃ¦²iI¢¶S‚2$Xà HÄa¬M¸èB€0d°GDÊMä›ðGÒñd¢¯ QdÎì±NÜ®Ëé­2ÓÚIâj@­èÃxpV Sìt'N"ØãêX…þh1J@V² ©Ç¤@tÕh•³*%D‡˜–¶Ê”²zSÙ·QsoeÊJH…üâÞÐ7:@4'¤”I`yÊ‘`\À¸È=\>°«Î‚8ÅB„¥b«¿-mDÑNzø»/x|Þ•½vJæÕp}r|–îG€p5ÈðpƵl`…кɬ5ÅÞˆLÂØÐ7ú …¨’ ^0ÁiZQ²öÃ8*qÂTzã&3Ç÷i‰ƒ›ßè ŒÃU­ZàÏ"¸€G¤ŒÖº‘ò™…´Ür&YL!gʘ…ª‡°a”^k Üþ:eòÊÂ>4rÖ`Ô#øìx‹`ÙY,(˜Å<* 4c96´—ž\£BšL¡fȉA²ŒA0nªì¥- \â#iNާIWÿŒšÔÙÌò£9² ôÁš>1¼ B™®5§“^6÷š!ºþO”¡Mmþ8Ú#\`Eìf#0Γz*~ €ÄÖÚþ©‰mw‹Þ AµDºÑ œå¡Ñ€`ea[èLìÎö¼¥címËá'ýõD¼à‚}“ ’|.= J²¼á/o”áÑ‘œä%7ùÉQžr•¯œå-wùËas™£|õžÅ½gñþpŠ˜Ï0i‚Û@ð’491úÑ‘žt¥/}é,°¹ÛT:Œ«LêU·úÕ±žuSÀáá Ã+p†QÚ¤4ÎiK²ŒÈ¬ímwûÛá÷2ÂQâê8¯„„]"km™á±Ø»Þa9&|£vêXü}Ãx±ƒèB9È.pqƒØ¢5 -f0YÈB2ˆE,bXÀ¯xÅ ^à W¸À­hE ZÀ °`«XÁ T¡ ¨ ©HA Pœâ'8QL`‚R”¢%  H0ŠQŒ`¢…DŠP„  >ñ‰|Àžð€:щþt€àÀ&6± hBPÁ*/WÆðpLvJOÄPi°ð!0p¯Ðî,P"A†¡dñîÀð òAô`öø üÀþá !@Öia€   ¡ À Áà! * A`€Aä¡ÀÁká  " "!$@$A&`&(€(¡* *Á,À.à.á002 2!” !ÑPÌ`:“ü#þ@&ñ¡yåj€ñæ Æ­?8ÑE±Îw N8 ø``q£CyQLÒárF6¨uñ•±9p³dr gâ`Œ1:ѱ±3|1³„ t!gô¡‘ã¹±C£ÍÑFÚa|A:È1áñ¾Ð1a„Ñ`èq ß õÑR!¶q Ë R 2!‹!rò!SÆ!%#²"æ€0Ò"ç±# F#9$Ëñ"I²\Dò$¹Ñ$U2[R²%‘%a’V^r&Q&m²îàéròîp²' %(x(îKþ€@2)•r)™²)ò)¡2*¥r*©²*­ò*±2+µr+¹ò)f +År,ɲ,Íò,Ñ2-±r‚ò‘ša1.år.é².íò.ñ2/õr/ù²/ýò/30s0 ³0 ó031s1³1îqÜ22‰²2'±Ýšf2-s3±3ÉD3934yÑ3C’Dó4]‘4%3WP³5?Q54]s66‰5i37 Ï6åJ6uó7ç7wÍ7³8IM8¯ 7s9 9_Ñ4™3:›Ì9ëãK¨S:±Se®óQˆ3;½›¶3áºó;É3r³dz<Õ³lΓ9¬“þ2×3>½¥=k%=å3>}`æôS一:è9Þ“9C@ë´@ Ôó‚poA´AôA!ÔA…æ@ˆÂ@›"+ü>{S9‹#?÷sæú³F<ôCc.DÑKH4EUtE]®lq3šá ’pFi´FmôFq”F}a(?ã?-:|ôrì³3*ÔB—Ck¤H4)½^t¼ÜáI+#H%Bá,ƒJ7,CÛ’C}K«GÃKAm3¢TÃÊF5®À”HÓÔEÖô'Äô34LÛÔµl$NgÁÚÎJ¥T/ðÔJ§´N{P‡NP©cNãOŸ,4Á©¤CQÉ´OéjOµßM-þUKQ‹R;0à i¢’ÃSÔL%/L5@V•9ðT‡”3Z•!| ‚z—ÕP±Ì2(µµ~5/f•?†•N·:•WïK›x`Ô!g„Aê£X}"XßÊZß‚Z§C[»TYÑ“K{£UuT Žàúƒ[K[MŠ]}B]]Õ[íRÕFK8µ[3U!rÁ$˜XU^,RQUVÖaèµRÝ3a õXå` $SoaÀ!g !þ%`óõTÏË]ëµ8UX!(–ã65V1Õ= º g¨a26"járazá‚aŠá’ašá¢aþªá²aºáÂaÊáÒaÚáâaêáòaúá@€ áF¶J!dlt|„Œ”œ¤¬´¼!÷Ù6Vcÿv[54î5\OwŽÁø!gÀmýôìäÜÔÌļ´¬¤œ”Œ„|tld!`á\AV7OK@àúaòáêaâáþÚaÒáÊaÂáºa²áªÁB7röׯ¾7dUõKVtO¶p·) ÚévÀ‚ázarájX˜`;6U³õ‚)”ƒwÕaW 9 U >ã@Þ¡ƒG7/ú÷pZXºJ×@×3ÎS Öà†q8‡u8‡“‘'R×p=ø8Aræè€tkåM_xm–8¶b‰t€7Í3¼€saPQöJ=X!ˆ@Du—ò!]·˜…5¸]Ëø]ÇXŒW¸T½µŠ³ à8ŽåxŽ+ …®°²Xa“x"„àn5 ü f4ߢ‰ŸÆ ¸7xƒ×X„Ûª€'^E¢þéŽc$ý”׫žš@Ù‘ù'¹hJùaGYS÷Øt©’%V ’å1‘Ù4•¢$A•öÀçÙ–yâ”U†]ãaÀLv•{Ã: üÖ˜{y#z¡‚{¢Š#¹$fbù,¹‘µS59"t:€•Ÿ˜Œ v"r! ì!Òƒ€™Ù3¸ gê ÈŽÁ|Yu9"Â`jé#¤ù• i “E¶žÕxœñ˜S[añV+˜`Š º3ÔÀ³Ë€-b#ÚX7‚+!”7¢Ÿ©Ù4  iÙ` Ú‚SÚ#zdÜU úšž3º3ÄÀÀTa`¸þÙ˜#já¸!gœ`=B¤ß"G:€WZ•£ƒùô#ôEà¡Ø§{C RaÀ^`²:ªÅ™#p úu¸Ž#ú'”º¤™ú¤SV«·›{¢¥æsõgî@ün›c‘'bJº‚ÖA®µQŠý$vaPn BÚ•ñâ­M°í¹¦eØ®ùŒ±iÃìV«ï4d;¤@¡r¦Ž8„9_K2€ˆÿàx:"ÚÚ'0;®Oû€cÛ?f¸#ðšaZøëøNd†»#p€~aŽA œ@ ª!¸ ÈàÖáä`ZµÀúÁ ¾ù `þ€ð`Ü Èà¶Á ¢ ŽA| Z2Ù'ŒàÒ©R@ b·{¢·µ•5š®U8¸Aâ…Ó‹­æÙ`æà+œï˜¯Â•ïÂQ!ÃQáøbF ¾W\d r€€aŽ` œA¬! º ÈØá æÀôÁr1»rFÎ :L sùáäÁÒ€¾@ª ˜á„¡pbÀX N –ˆ6,"áA öáä Ð`¼Xáuó`qœ'\9šš‘\¥ÿœ¥A›#$hÉR¦8ëf †œ9X Ñ þiî€àÒ  ÄÁ´á ¦à ˜ˆ!zÀgøáÐ`Ä‘¡`@n`€¡”á ¨º@ÈÙ!ê@ ½× ©:€ò¼$ö(úN=[¸“}Á}#l!‚áҀȯf  üÁÌ¡ ÔLÖª­Â’0I“Ü¢¬"! î ªAZ²}Û»]!¢}Ú«]"$À ½ ù] ý}~TáV¥aÈ;:ï `ÁÖ|à€ Ð ¡´À ¤à– ˆz! ™'ŒÀÚÉXà`Á;âx ŠA ž ²Á ÄàØ þì`þAFGÁ"@ä6 >AHáRa\fz Œa  ¡ ´á D%gÔá„`ØA¢Ø«ôØÑø©Ëš¬9ö' ]¢vÆÚqPÈt`Þ` úJÉV œÄ‰œÌ©¯>ÞÁ“¢îï>ïÂíá^îõ¢s¡Ä!g¦`*x¹+#4À¶aÁ ~[‘S»§yB e` "@JÀþ#Ä~[ѾE0"–¸nüÁˆYq)'¢O`€¢å» ¦dª,«h|¿€_øB÷ë†÷ɹ$"_ ` `ägÿ-zÁVsæÌþ£Y^¶Kâ& s@¿ñܲ“z© |å¹Ùì?8Љ»Ù«k:ARX!€d³ œàCŠ,t@ÐCé}1ÈŽÞDƒ &\ذ @‚Kš x@Àj£æÂ‡/žÕ÷oàÁjëât €Lš&áÆ]Úó5Ê[ ÄAL‚çéMþÙrcó~»'“s ëG¥V®g¿†]J¶ ëßÒƒS?9÷zÜéÚge/½Ò©;ˆîf%PÞ¦0}Þ ‰=âŸ6°¼L´Ç_ '}ð¦7ø0ËxèHÞ,ñ0_}©Çž{¾ueÚI80NL°v”uÝôoµ DQœnšâŠÕáDE ø@”C<9-§–sbE7 w¿ùx]‹.¢åáŠ!àJU8$J5ù“%#ÐVæ$uBƵ 9dQ‡*B¹å‡Ü!±Bøƒ>áØX;”åkuòV&”c6ù Ø0†#:ü$¥žñh(…átDþa§gžm V’9!”Üõ²Æ*l“œ]éE^w§l’&jj¤™Ò0È:hN…jଊ·¨IѤx)Ÿ™îú"¦¬úøM‰ê©;ñ˜j[ÑÆµ*±ÓºÕ"¬ÒÌ*(N· î’½J{jwÕym[çò–.NÌ6å,Jcµêb»g­›¨½]m©-·µšôm¸Û:®Zú:…¯™åj—ðv wõ®RñbíòÜTÚZü[žýÚmIL2ÀŸ…ñZÃZË1ž+×Ûr¨[å(g©eÅL®«%w¨³NÓzÐÈ;ï,4‘=œrRçÌ[ÄIMÌbÅèâLíË$'ýþÓ¹?‡\ôÐwìKS‡µOc£LµNNÿuIóÞ<µžA´NÝvßwÞzïÍwßu‘¶ºtû·:úø ¶×à&ŽeàjÍ®ã÷Z­ðoZ‘CHæšoÎyç/Ôü,½+–­“1ŽzꪯÎzë®§.ù¾¯»þÇš.LÃ¸â¬æ¾§Ø”JºX¿kGºV³Ïþ\èpì§ L}ôÒOO}õÖ_=ôjÄŽðóÙK¿Ž*yØn_'ë^2ï([Éìï4<ªÜ›ôÌ ößþúãOÈœË>?•¡¯GTZüfá„QÌÈ.(_AÔ7À!A°5ÌÚãf¬|UÐPo+¦þ¸÷Ékx \`MAÅM°&ìûZ(¼cÁORc^u'BìP®„äCÉ S¨þÏw/áÆ€5ÑUî†!œ!üPÂC:ð$BD"oªH@#‚+‡,º`ä¬xfц Ý6¬(ž``$ÏF/~‰Gl£wj8Ç2¢Ž Ê” "EBÏŽzz£GXD:6‰ZÂãõˆÃCêÐ$X£ .Cj‘e›$#ÅGFzGŽÀ“d£4HLJ0•J%ä.fJ4Ê Œå!ÙÄN6‹ªä,u©A`vG”xrä0mÙG3"³ ¯äe/ÅõKErRšž´b-1ˆKþ¯¹’”Tdå3ƒèÍŸlÓ}o8€9ωÎtªsì<§/¸ébªÊ˜Ä[æ(•)LB©Âüì§?ÿ Ѐ t -¨AŠÐ€æ!œo±GB*PlÀó:D`…E/ŠÑŒjt£Íh=fiÇkÖ«œí,©IÙùN3’ô¤,=iJã’€Èt¦4­©MoŠÓœêt§<í©Osú/·ôâ§DÕ)¨¾ Fy¾F¤+ªhGŸ Õ§~}NªU¯:U¤ju«\½š=‹©Ä®Šu¬d-«Y½šÔíA"cêYß ×¸Êu®âäYà¶ä·H”[é ØÀ v°Ï¬St°ƒ£à(à ‚aDþ`cW943‹'É.¬„í¬g? Úiâ„GÑ9A8 B‡Ä.°‚ Šˆ8pä dQÙèÚÜêv·¼uŠaik8(i:€GAΠ¬“öq¸í­sŸ ÝÜþ¶ BHlAâP«]Ève@‚“ bD­¥¹Ñ-¯yÏ{Öé¶c zUÁ> 2€Ä¬ð ”pˆd­8hG Ä«4ò¢wÀ.°³¤V½ÎâΰG˜±(PãäÁ1 ‚z¸àšÍ˜€ â‹iÜ£A0‚,rvÄ,n±‹±ùÉ¿xÆ4æm‡ãsõÆ5.p®ü þ ¬ ÖøÐ:xQ‡4˜þ€Ðr‘• `ùÑRÆ%9r’—ÜdÙIQÞÝé€,d-?¹Ç,éÈc"30Ë{XƒxÐŒtYOj.å”uŒ6»ÎrNóœwffȬÎdÖŒfƒqŠ4ðƒ(FAœ€ ¬•<zà“­hF;zå˜Aüast¡ ¶96¨“üà 4 FA€Ð‰-ä ¸°"‘†;ä ®uÍëY`zÑ.È-0Ð…=€O 5êNméÃZÖ´¶5D~½ëV~užx>IªW]V¿:Ö³®u¯±Íë[ç:ÛÂN4±7}ìd/»Ù³(5D ÝkDM»ÜÖöõºƒý›'ÚþÝš~t¤'žJ÷º Ã.8§= jQ;ÛÔ…6I ç`» |Q;DDöxtž¤qŽ{ä³Xì ƒA¼a ‡ê?Tƒ¸ÂèÅüу‰|ï@„Nt£$åÿxA< üb8y”o¼óžÿ<è™ÀЋ~t£…”ʹyÎ ’uŸé`g»ÒgÁô•?=êS¯zÍ¡\’´oÝía8Eƒñ¥o¼é,¹cJ^[« ^åNoùËc>ó»WÜâñ‡'¦^¡ .šyLâï®ùÓq~ÿíƒ6`Àˆ\Hž:µKqp±a>Ô³ ¢ý2ŸºÑº¯þ³ 7VO[DÅö‘½íµ}ç!ê¤õ'~ìgßuŽÜ>ú™~è!¢{ðÞ÷À¾ó‹}ÍÖž:_¾¼A®€Ñ?Éó´' úG_úÓ§¾û“~'äa‘ „òa?õ©?'ñ á˜E²B±Ìa¡ÿgrw€%QÐ x‡Ñ€‘í‡|c×m&€ È€Á(~Ÿ§xxü—a‚³Ðøg]Ñ÷—³À‚wç)¨$QXzÁ~‚r#‡xÇTà&ð$¡Ñ„¤Áˆ¡axÁ0 ¿ÇóWà¹ð WP þ’A–hƒK(N8 §”8 Ìà…†bh„“Q—‘q(vmôW9A†fˆ†jȆƒø††„ Á„£Qvˆ‡zȇO(|%!ˆnXˆ“èw³„{A‰sH†GrOrSX…WX‰t¸…žÑ‡†Gh åqé±íñ–’ærPyl Œð!ôá@N}°´ÔQ/€üP`þ B »Økî@ŽäÈŒR:à c {I@!Ôhùv:å1 à RŽýXWÉçA?‘ÛØßøû8Ž ²‹ç¸Œ¿¨ŽÄÕŽïÂHþט+÷Ø)ŽýHŽW” ½hŠŒ4ŒWƈŒÊx é8’ Ò Ñ8ÕxGè„F“Ñ„ˆdw“evƒ; .6é“L³+mp/:”%”G™(¹‚J‰“¯ÁJÑ“‚N4i•Y)VÑ’@í0s WHjò€ÒuÄXe`[V•Z)—s¹•T’0êà `]¤§µ | ‘ Ñ0 ø\›¥|tɘÉUÓR[}x:˜Y‰ùE—ŽÉ™A™™—YYfq˜)šc”ž©š«. )šÑ± ·ƒš·9 k5 À!þ—‹ÉšÁ)œÕaœdq œ ö` Ý0‰øñæßð›9œÙ©v‚À¹ß ž?²mK•šáižçÙ;ÖTžèɘXs0°p >±eqQŸŠãžð)Ÿô9fmqŸÕ„D‰ø!Ù”¿ñŸVD Úq r¹ î  ×p ÚàÙ IéÊ* ú :¡:•iõ¡ñ4žÔ²žm¡8¢Cs¢N±¢49ð^³À g£öÐf øf6ªp8Šo$ó¢1:£5ªp?úlÑÆ£Aæ£O¤ Dº"¦nÀÖkKÊGê¤IÚFTzmÿv¥ùÁ¤ZJO:—þô`Ñ x¤ÈcÑg‡ÿ74hú‚kÚ¦Šg„]§‚fˆtšG9ærcñuo§Žá§n𢀆(†šta—¨rú§-z„h•³°¦(¨§€ÚulsZ§©›:§o†Ö©–Š6yKPR¨'7}ª*ø§v«Òwª*y¬:y/ª¡4zªâE«¼*ª;¬ÂJ¬•j¬©J}ŒZG9¹™¼‘«ªZ«ÅªJ׭Ъ·:—ÛðØ`V€ o RH…V_˜‹|ª¨höŠëªYî ˆ#®äj®èª®±Ø®~ø®“ê§ó꯷è‰8¦žÕ*Üjr}*¯°Èþ®û®V݉ç°ý±œx°r‰±@sóy’ǘŒ B’yù±#›’&;294û±!k(Y²ºò²õø©*+d6«’ø˜³3yL®*J Ê‘ B«<˲7 ´1©³@d´ y I«=K²?K‘0ËžŸ¸[¾ºH#Š-%Ú$^{Vd»µHÙ¨pe¶š°ƒêg½µ¶g›oêYLID ¶:a·¹µ·rë·ƒ·+¸‚«T$ª°ƒ‹¸«Y¸a{¸‰ë¸Ž¹¸ê"¶K¹V¹ÌÕ¸•«¹Ny¹šé¶› ºrÙ¹Š‰¡kºs9º¨™¹§K“7–+„座£J©ëa««±·½þ„»ië™ãñàþÐ}Àµhk ŠI¾ ¼ÂK¼ôÇcÈ«My‹¹Ÿ+ ²¼Ã[¼Ù[ÐKHʼØë¼âެÙa=‰ª[U¾ú¬@D»ãe»Ù¾×‰Í#ÒAYÒY3¹)íÒ!¶Ò·õ¾/MÓÓrÑÒ5­ÓåuÓþ#Ë; Ô#ÖÓ6óÓAmÔ6ÔÊSÔGÍÔæ•Ôò’ÓM-Õ‚õÔTI½SÕÒeŤ{ÒYíÕ»UÕITì0emÖgÖi­ÖkÍÖmíÖo ×q-×sM×um×w×y­×{Í×}í× Ø-ØM[­ºq À Ø‹ÍØíØ Ù‘-Ù“MÙ•mÙ—Ù™­Ù›ÍÙíÙŸ Ú¡-Ú£MÚ¥mÚ§mÚ¯àª_ÍÚ~+F­ ÛìùÚ±MÛàp9ÛµÛÃyÛ¹ÍÛª¹Û½ ÜùÛÁMÜZ9ÜÅÜGyÜÉÍÜ4¹ÜÍ Ý…öÜÑMÝ36ÝÕÝ#6ÀÝÝíÝß Þá-ÞãMÞåmÞçÞé­ÞëÍÞííÞï ßñ-ßóMßõmß÷ßù­ßûÍßÝÝ;mod_perl-2.0.9/docs/user/handlers/http_cycle.png0000644€ÿÿÿÿ00010010000012447311727205031022062 0ustar ????????None‰PNG  IHDRX0Õ£‚¼sBITÛáOà pHYsÐй‹çŸ IDATxœìÝw\S×Ûð“„0BÂ"‚ (â@¨“ª¸­TÄ…Èp×VŠ{PµVëÆâž”JA´î…ÖY‹€ZÈ‘=’Ü÷Ûß}ÓŒ›› çûG?É=ã>I…‡sï¹ç h0BÃ0u‡¨AHH]Ý1ꉀFƒD@£A" Ñ Ðhh4H„4$B !‰€FƒD@£A" Ñ Ðhh4H„4š–º4 ê4_ ƒNoc'H„„*,,´´´d2™ê4G`ÿþýóæÍSw M!à_Ÿ>}Rw 9š?¾ºChB­sœ P¤‰pæÌ™|>_ÝQhŽšû¥Q†Â0Lé^¼xaoo¯¥¥²OÚø#99ÙÝÝ]¡¢££g̘! BL&3&&fâĉr[Ý¿ÿÀ555—.]¢Þª¥àóù>|ÈÌÌÌÊÊ*(((((øôéSYYYyyyYYÇãñxµµµD}]]]‹Õ¦M6›mjjjbbbeeekkkcccooß±cG5~"€Ò”O4­ÿþ|xuuµÒa«—˽ÿþ£G^¿~‘‘ñîÝ;[[[{{{GGGKKK777+++6›Íáp8Ž®®®®®®žžѼ®®ŽÇãÕÔÔTUU•———””¤§§_¹r%33óýû÷...]»vuwwwwwwppPãçP§|"üóÏ?===>>ëÖ­ëÒ¥ ƒÁ Þ‹Åb±XÄ" 𬬬ŒŒŒW¯^ýú믡¡¡\.wذa#FŒðõõÕ××WÅ4L)ß|óMHHÈ7ß|#zï055µK—.&&&³fͪ¬¬­0{ölssóŽ;þöÛo¢ÇOœ8áììÌd2;wîß¶m[Ñ>SSS¿úê+ƒÁd2ãâ∢ϟ?÷îÝ!dhhX]]-äàÁƒ?}ú$ÞÎ; >|x÷îÝ6mÚˆvXQQáçç×¾}{›±cÇVTTàÇ«««ýýýÛ´iÓ£G´´4Š_ù·A<Þ°¸¸xúôézzz!!!’=S @Ò³gÏîÞ½K¥¦®®®JÎøå•——¯_¿ÞÓÓS[[{êÔ©{öìIMM …_8Œâââ“'OèééuéÒeéÒ¥©©©éÇã©*6©>}údaaѤ§-×¼yó"##ÕE“V2¦¥¥¹¸¸WW×´´4Ñ"„PTTTqq1†a‡ -år¹B¡ð¯¿þÒÑÑ!FFFúúú¾{÷ŽÏç—””œ:uÊÈÈH´C??¿·oßbÇd2‰"??¿'Ož‚ººº+W®Ìž=[ô\±±±K–,‹O„¿ÿþ»¹¹ù”)SΟ?/Úapp0ñÛêÎ;Dð . ohh(**Ú¾};õ/äÛ !4xðàèèèšš©ÝR @TVVÖ«W¯¨GÞø3~I|>ÿ÷ß>|¸¾¾~@@Ào¿ýÆçóÕ†aþ~Ë–-fff...UUUŠvòäÉKKË;vp¹Ü¦ƒDHA"”búôé'NœÀ0ìôéÓÓ§O-B•••᯹\.›Í&Š|UŸ¬ˆ›9sfhhhEEÅ­[·DëÐétòÇd­váää$úyªªªˆ¢£GöïßßÚÚš¤[©w‰€ñ>%+’>ɉ~$ÁãTxïðòåË:::ݺukL'ùàMD(žŸ_XX¸{÷n…ú”õmÈ ^å.]ºdeeõÕW_áo%óÄW_}åáá!vPOOïÑ£Gøë¤¤$CCCÑ,Þdeeyzzîß¿ÿÒ¥KqqqÝ»wWwDTYZZîܹ3##ãýû÷;w&þÉ‘5jÔ“'O Ð$Hеë!”››ëîîÎáp¦N*z;$""B__¿sçÎÄoX¢(::ºk×®zzzmÛ¶]²dIQQ‘¬ÎEß644¬ZµÊÜÜœÅb=:##?¾yóæ   Y‘#‘‡ðÄ>NQQ‘››‹ÅÒ××www/))!†kÓ§O700èÖ­[jj*õïäÛ<&1 •uœb,‹¼ >Ý_ì ~;!djjjmm}ïÞ=*Ÿ÷‹¹q㆙™Ù®]»ºci”ÄÄDüß¼BWtñtˆÿßTÕÅRͼ4JÌVw Í]ë¾4ªújÿ'ÅçómllÞ¿¯\s¡PXQQQQQ¡’[Mjÿ6Z¥C‡ÙØØ<{öL-gWùÿÓ¢¢"OOÏñãÇ+šÔU›©'BÑÇHètúœ9sòòò”>/ÁÅÅ¥K—._æ\¢ˆDøÎ¥R¿¨¦Öº¡êI¡Ñhªí°EƒoCå/^|ïÞ={{{µÐÿOy<Þ¸qã•XüáêÕ«áááýõBÈÌÌláÂ…¾¾¾ZZZ õõõÄ%_ˆ½-//?zôhII •“ë+ÅÇÇ{{{ëéé5þ ­¬5›šâ\²ÎÛÔçR µ,n5þüîÝ»·ÊÝ'BBBR韷D×*ì³å‚oCå²³³Ùlö‹/”îøŸrúôi ÃNŸ>­ªÿM&&&i^UUåèè¸uëÖ©S§N˜0¡_¿~nnnݺuëܹsÇŽlmm­­­ÍÌÌ8Ž¡¡¡žž“ÉTáä CCCŠÑŠ~cbß^eeåŠ+œœœtttCCC‰;ÉÉÉcÇŽ511¡Óé,ËÚÚºC‡xQ»víD#騱#•sUTTYXXhiiµmÛ600˜¤aØ„ Øl6Nwrrº~ý:qv\\\\\q½1ç¢Ò¡ä[’•û¢š$Bš…ŠŠ b¹¥¹¸¸¤§§?~!tüøñ´´´®]»ŠVµþQzzºÔßA666’ I¹Øzõêµ|ùòãÇ»ººvëÖ­{÷î={ötssëÕ«—‡‡ÇW_}Õ»wï¾}ûöëׯÿþžžž_ýõ ÿéÖ­›¡¡!€¡¡¡B· š,Cœ…N§ˆÞK322rvv&Þ2 }}}üµŸŸBˆÁ`tìØÑÇÇ'**ª®®N¬Oòs-[¶LtÆ™¥¥¥Ø×N¬ÔñæÍ›Aƒikk·iÓ†$I*z.¹J=5I‡Ê}QM !ÍÂÍ›7 Ôø~¾þúë{÷îùûû»¹¹ùûû'&&8P´‚Ôõ²~dTò£´aÆ•+W*ÚJtÖ ‡ÃY³f BÈÒÒR¡N”H„R‹ ìí퉷¦¦¦¢‹E$$$„……têÔ !4|øp¹}ÇW¬XahhøçŸEl6!TXX(Ù œ&66¶¨¨HÑD¨è¹”K„$*÷E5©Ö5b?BÐ:YXX4¾“’’’ÄÄÄ7Þ»w¯´´Tô‚äÇÝÝÝuttæÍ›WWW×øÓ)Ä¢²²’zý«W¯öéÓgôèÑOŸ>Å'Žž>}zìØ±è¿«7|IcÆŒÉÉÉ9vìXmmí¾}ûŠ‹‹Ç‡µoßþÂ… ?üðÃÁƒ÷ïßÂWîÅáããã+++wìØáää$Öó¦M›:tè0vìØ·oßâGB555þþþ:tÀ‹ðU>zõê%zXìDñññ3fÌú):I‡VVV!|Av±™&$6ò‹ÊPw>€Uƒ‚‚Ö¬Ycnn. ;tè°zõjÑ5`ííí9RSSSZZ*õ§CÖŒJ~”¨IžÀp033SèÔÊ=>!y[±ªª*,,ÌÁÁA[[ÛÑÑqåʕĂò¶¶¶x+fbbâíížžN4ÌËË `0fffcÆŒIHH=~"bQ*ü-ŸÏß°aƒƒÁàp8žžžQQQxoÑÑÑæææ&&&Ä D¨ø‰Hæ¶(z.©âE‰‰‰...:::#FŒ žŸ–Û¡_TSkÝ#BH„ ÅPÕ=ÂåË—wîÜÙÏÏðÀÀ@ggç+V¥FFFOŸ>-//—µºº¬bk”²²²7n|ÿý÷JÄÖ¿ÿ+W®×!Iß~ûíË—/‹‹‹‘â3¶4óú¦Ð*­;Â¥QÐbNœ8Qt‰;|tE™˜˜¼zõjèС¡Aƒ½~ýZtˆ³qãF///|B ™„Iû±×„˜˜___:îââ=gÎEû믿rssñÀ¤’¼š™™¹téR|¦biié©S§¬¬¬Ôòœ-›ºó1TÏæåå-Y²däÈ‘êŽHeðç¯^½*µôþýûÄbª²‘áóù·o߯0¬¬¬ !$ºÕ 0"l<ò‹Æ-Zë~‰MØP•víÚmÛ¶­_¿~õõõõõõK–,QwDªÁãñ¼½½‡ 6räH©?~œššjaa±lÙ²yóæI®‹Â0ÌËË ©i倢¸.hn”¹4*v]Hê%#QbÕÈ‹8ÎÌ™3ñy ÃÐÒÒ8p`vv¶Ÿå 055Uw­Äû÷ƒ.\X]]]__êÙ³§ºƒRâââádzX¬}ûöɪóí·ß®]»6''‡¸*æåË—bŒ@"€"e!ö¿ù²Þb" ÄJ-=˜““3hÐ üyRŠaÔÖÖzyyÍœ9S²Nmm­y‡R'¬Ã‰÷Ï?ÿøûû;;;9r„Ïç3 ]]]„PFFFsÛJQ÷îÝëÙ³g¯^½âããét™?ººº6lÐÖÖ–UáòåË#FŒÀ_ãý´ôo€/J‰‹ªb­´$Gý…Øë††]]]…¨®®{öùóçÏøÌ:CCÃÀÀ@bwUUÕ´iÓÚµkçîîž™™)ú ˆ}boeuˆ‰ìX¤­­½víZGGGü¸ ÑXééé~~~ !Äd2ýüüÌÍÍB4M[[»oß¾)))êS¾¾¾mÛ¶½sçŽJ:$îâ›ýë¹P÷‰Ö}PùY£’W8U¢¦¦&**jðàÁÔ›ÔÕÕ=z´oß¾¢—,Y²gÏ@PTTäãã³hÑ"âøèÑ£³³³¯^½zïÞ=$moB©oeuˆš5kÖ˜1cÊÊÊÜÜÜðÉë!|Ý)$ñG âï¿ÿž4iR·nÝ¢££µ´´æÎûúõëÂÂÂÏŸ?÷ìÙÃ0WW×,\¸pìØ±ÞÞÞÄ>‘Íß§OŸ–.]êâââèèøêÕ+…þµK•™™Y__O\2…! Q~²Œèït"Jþ¢—•f$àúøøœ={–bx+]]Ý””Ñã/^ŒŽŽ&ÞàkKž?¿cjjêííM}_xY"„Î;çããÃd29Ž©©éµk×(ö ¤JJJÚ´iÓ¥K—0 ÓÓÓ \¾|yÛ¶m×®]{çÎKKKŸçÏŸ÷ìÙ“N§ûûûûúú>|x̘1ööößÿý„ TûÇ™ ýù矸víÚœ9s^¾|©’…rB«V­4h±pIcî644¨$$ÐÊ´î¿«šÑ¬Qå~nñV7nÜ?uꔎŽ~ÜÉÉéùóç‰G ˆ¾%épìØ±õõõ\.·´´ôÌ™3#GŽÄç¯E=zôhãÆø_úúúsçÎýá‡ðEª®^½ºyófƒ/šÕ£G¼•®®îâÅ‹,XpðàÁ3føúúŽ5ÊÛÛ¿¦ª^†={öìÎ;;vì077Ÿ;wîáÇ TxŠÌÌÌC‡o•–––êëë«00КôêÕKÝ!4%%.ª"÷IŽ5>Œ›7oΙ3‡x»fÍš½{÷æää444äääÌž=?>gΜ³gÏbVTTtêÔ)±ó⋃Ô××?|øŸ°#·C Ã8NRRRCCö¿û…’}b[pD„……áÿ Û´i³|ùrÑň³³³ñå@7oÞŒa>YôáÇRû)//_¿~½§§§¶¶öÔ©S÷ìÙ“šš* ¿ÐÇøŸâââ“'OèééuéÒeéÒ¥©©©_æÔø”Z±‡©”\bM,ƒÊz+™ee)—˜%ëë+644¬ZµÊÜÜœÅb=:##?.9YF´O<øúúæææŠö/«C ÃÜÜÜ"##ñ©1DÚë“F£Y[[¤¥¥Qü€šfóæÍl6{íÚµ%%%¢Çëêêúôéƒúæ›o„Ba]]¶¶6NÝ"GªºººèèèN:ééé 2dÆ ÑÑÑ/^¼àóùª ^(¾ÿþâÅ‹[·n8qbÛ¶m9Δ)SŽ=*:¯ª)lÚ´Iìáz>Ÿb0Mz^Z‡àà`MÞˆF£iòÇoVª««uuuµ´Ä/×/Y²$""ÂÎÎ.%%ÅØØøï¿ÿîÙ³g§N^¿~M½s.—{ÿþýG½~ý:##ãÝ»w¶¶¶öööŽŽŽ–––VVVVVVl6›Ãáp8]]]]]]|\]]Ç«©©©ªª*///......((ÈËËËÍÍÍÌÌ|ÿþ½………‹‹K×®]ÝÝÝ=<<ìííUó½zýúõ!CrrrD/ …BƒA§ÓÅ.ï$…„„4£{„@ÃI½mvþüùˆˆóçÏãëWáwj}”^__Ô¨Q£FÂßòùü>dff~øðáãÇ)))Ÿ>}*+++///++ãñx<Oô™Q]]]‹Õ¦M6›mjjjbbbeeåêê:räH{{ûŽ;÷§¿$‹µuëV±[¡ð@= ÑèDH¬†¿2š§7oÞ!„vìØáááüûï¿‘ÈLåhii9:::::6>Hõj×®äŽzøCMøeŸf;€æC£wŸ ®«; EMMÍäÉ“+++§NºpáBâ¸r#ÂVéÎ;‡–ZƒB¨ÓèDš³… ¾xñÂÙÙ9**Š8ˆaþà|#G„­ÃáÇe=öÏÔ@F_ÍÖ±cÇNœ8¡¯¯þüù6mÚÇß¿_YYiccƒ/´¦á<(«F„P‰4;©©©ø vèÚµ«h\%444É*…!ÔA"ÍKEEÅäÉ“kkkƒƒƒgÍš%VŠ'B¸.Š4hÐÞ½{ÝÜܤ–*1"äñx7nÜPMp 5êÞ½»º£hA3‚aX``àÛ·o{öì!Y!##Áˆ¡²²²ìììnݺɪ Äˆ°´´Ô××wøðá*ˆ´:©©©«W¯þw–V!hFöìÙóû￳ÙìóçÏã;йpáÂ?ÿücmmýåckV8NVV–äâåî'$$468Ð…„„¨;„&ÔT³Fáé% ¨Ç/[¶ŒF£;v¬C‡RëÐh4gggCCÃ/[³‚aXJJ ¾¦,pêÔðøD||¼¶¶6‹Åêß¿ÿ—?;B(99YåÛ(‚F*..öõõmhhXºtéĉÕN³vëÖ­¹sç’×Y£P§L"¤ý—Ô:$?¾¾¾111555>Tâì׫W/øѬ…Â3fäææöïßÿçŸVw8Í]MMÍ‚ Èë@"€:eîâ?]J¯LÖÐÐ ëOþÚÚZÑ•ŽÕ¥™„¡96mÚtýúussó˜˜ò+~!4~üx¹uàÒ(Ô©þÒhFF†¬‘¢¥¥%±¼§X¢¢¢>}ú°X,##£   .—Kº¸¸ÈúñûôéößÝt‰¢%K–ìÙ³G ùøøàÏS#„cƌٷo_nn.ŸÏÏÍÍ ÀoÛ¶í»ï¾ãr¹†ž={vÚ´i¢ 7mÚ¶~ýz‹E±•¢a•»páÂÎ;™LfLLŒ©©©ºÃi„B¡§§g]]•Êpê”|I›ó"zDêó²ŠÖ¯__PPàîîndd4oÞ¼°°0ü¸ŸŸßرcûô飯¯ïîîž””$¶ò–“““»»{nn®hª#iE¡¬0€j½ÿ> ð_~ù¥oß¾ê§e¸sçNmm­ŽŽ•ÊM1"¤É ÂS -þÏF¡PØ»wïÈÈHwwwuÇ(áñxýúõ{þü¹Ïùóçá7)EàåË—®®®T*·mÛ6???//úDÜ?zxxäçç˪@<1%:ÜTú1*в„„„xxx´ÊµFCBBšË¥Q¥8qÂÕÕ²` òí·ß>þÜÉÉéèÑ£)ª¯¯g0³ j𡱱±¬ƒ&&&Ä_:J__Ó¦MDµ‰'r8ƒÑ±cGb ¢Õž={,--Y,ÖÈ‘#333ñÒ”””qãÆ™šš2 }}}GGG~-{Ñmâ×è±cÇÔ  èôéÓ‡ÖÓÓ;þ<Évz@ÌéÓ§Ÿ>}E±>þ£qøða>ŸßÐÐÐÐÐ@¼õ–Ëåòx<’>KJJdÄÿ‹ŸtÆŒ111ÆÆÆAAAkÖ¬Á«ÅÇÇ#„>~ühcc3gΜ¼¼<¼Þ$??ÿíÛ·©©©žžžS¦LyöìBhäÈ‘EEE·nÝ0`ÀülbbBõû@Q_fŠ*†á«i·ÖyØMgÊ”) ÔëãûÆQ\G‚Àf³©t.ë÷~<..Nìø›7o ¤­­Ý¦M±¶’oñk­†ùùù!„ðA¤OTTT]]õo¨Vë~|¢eA‹ƒ_¬ƒgç£ÐuN ÃBsæÌÑÑÑa2™L&SKK‹)Bô-þº¢¢"00°ñ¡J. 8yòäÔÔÔØØØâ8Ê!tîܹ©S§>x𠸸øÑ£G¿ÿþ{llìõë×!b C\QÇD¦~ào¥Þ³«F^Äf³ÇŒ³gÏ©wÔ”óäÉ“^½z)´ kqq1BÈßßßÞÞžb“?6ÑÓœ>|@õêÕëôéÓÔ[µoßÞËËkË–-l6ûÏ?ÿ:thZZZS„@‹Ÿ,€¢°ÿ­+$ë-&²ðXC©E¢srr „_ÖS ¡P8uêÔ—/_*ÔÊÒÒ5Á„p|z þšF£7íÄŽ‹!„!õ΢¬&±mÛ6EŸ2dÈäÉ“lÀ" ÐavàÀ …Z­Zµ ¦É (H„4G4-22²Gë———·k×N ÍŒ !ÍÇ9r$õúÑÑÑ„á J€Y£4;ÕÕÕíÚµËÏÏ×ÓÓ£ØdÞ¼y“&Mjäyy<Þŋ٠h•²³³=<<ÔESD@³“œœüõ×_SÏ‚™™™íÛ·ÝØA‰K£ººº 8zô¨B¡ ¡««‹ïíÕ*A" Ù8pà€¨×Ÿ?¾¿¿ÿ´iÓsRccã„„„Æô@ ÷h^ KJJ¨ßíkhh(--». “e F„4/,--ݳgÅúL&3))©IC uƒ!Í‹©©i@@Åʵµµ’ÇaDuh^.\HýñÁ¨¨¨Ç7i<´zhFöíÛ÷ñãGêõ¼bÅŠ¦‹M‰´Äš×ZZZÌÎÎVwDÒ™ššÊ*âr¹ëÖ­Sè¡ønݺIݼ.@$BÐJà¿ô1 «­­õòòš9s¦dÚÚZÕž”¼C|›x1%%%²ê ‚M›6Q__tòäÉiii+dDZ&“ùÃ?üõ×_¢‹ŠŠúôéÃb±ŒŒŒ‚‚‚¸\.~¼ººzúôévvvYYY¢û(Iîµ$úVV‡¡øøxmmm¦§§·nÝ:'''üxÛ¶mÅ6lÛ³ÉÐÐpÁ‚?f^^ÞŸþIt.F„P‰´6uuuGÛÆoÉ’%{öìEEE>>>‹-"Ž=:;;ûêÕ«÷îÝC"ÉCr&*"„fÍš5f̘†††²²277·ââbüx^^1l•ܳ)77W¡'âÛ¶m{÷î]]]]êMRÁŸà‹rppÈÊÊÊÌÌ´··WyçÄKWW7%%¥sçÎD‘è ÍÀÀ ªª !dhhXXXˆ/fVYYidd$úã@£Ñd½•Õ!BèÒ¥K>>> ÇÔÔôôéÓ½{÷–Õ'aãÆŸ?Þ»w/•OZSSÃd2™L¦¬ ®®®éééiii]»v¥Ò!®²²’øˆ¡ÑhÖÖÖêŽBõBBBàzЪà9æÆááá§NÒÑÑÁ;99=þ¼1=;ÉípìØ±õõõ\.·´´ôÌ™3#GŽ,++“ÛÿŠ+ŠŠŠ(süøñ‡ž;wŽb}Š6oÞÙ¦MÕv Z ÃJKKU~—½™€DZ¡áÇÓéô KH3fß¾}ãÇ·²²*((X·nÝñãÇB“'OŽŸ6mZqqñÕ«WÅúa2™ñññcÆŒIJJÚ·oŸh‘¬BÆÆÆ7nÜèÑ£‡­­­³³³èÀ‘èsâĉåååIIIW¯^ݹsgEE…‘‘õ?·ËËËçÏŸ¯Ä7#תU«–/_Þ=ƒÇãq8uGÑTà!h%ˆy(øÛ¡C‡2 sssüíúõë ÜÝÝŒŒæÍ›†ß³gÏåË—íììF%¹ÎuLLŒ¯¯¯±±qDDÄ/¿ü"Ú¿¬BöööÏž=kß¾=Fóõõ‰‰‘ì“N§»¸¸DGGÏ™3!´téÒÇSÿ°«W¯öôô”ûmÀ]¨€ŸðE5é=ÂÆ“u¯Iafnnž––fiiI¥þîÝ»É/`vëÖ---íÅ‹®®®Ô#Y±b‡Ã!„[å¥Ñ f4­°°bÌÌÌܼy³––œ›0"€:H„üKìâê“@=céèèìØ±ƒúž½¹ ð/Égû¾€œœœ   >ŸO±¾ÔEsÄÀˆê  N%%%K–,!ó wìØ1•?2€D€:õìÙsÍš5+oÛ¶ÍÊʪIã@Ás„¨MJJJyy¹——Åú—/_vpp R.@ŒP›ÈÈÈäädŠ•‹ŠŠ(fA€B  6sæÌ¡2ó!”íììL}NM“Ži4“É|ûö-þöíÛ·L&“F£™˜˜(Ý¡Tr~úôÉ×××ÈȈÃá 8P,€®]»º¸¸(Ð(P›¾}ûR||0===88Xîãƒ_ ŸÏ'nm®Y³ÏÐ$[-Ê%:_—úÜÝÉ“'ÿöÛo±±±ÕÕÕbO•ddd¼|ùR逿€D€zøúúþóÏ?+óÍ7[¶l¡Þù¸GxãÆääääää7nˆMœ8‘Ãá0ŒŽ;¥&&&ø8߯‘Á`æçç#„Œ%û'VUU­\¹²cÇŽºººNNN?üð±³Ujj*BÈÅÅÅÚÚ:999//hngg‡¿ÀOÚ©S'¢HV‡D„Dúúú›6m"ÿ\¡üüüÀÀ@ƒ¡­­÷€O+++ƒƒƒ---™L¦­­mPPPyy¹Rß7hBpG|QÍ|‰5ê’““ÝÝÝ‘²?>ùùùÝ»wÏËË£²¡àíÛ·œœÚµkG½ÿ^½z¥¤¤„††²X, ÄB¡P(Ä_ˆþWìmRRÒ”)Sä.±†gÙC‡?!4eÊ”$ñU|üøÑÆÆÆÆÆ†ÈOxC‹uæÌ„···žž^MMXÏbýøúúÆÆÆî߿֬Y¿þúkppðàÁƒoݺ…:sæÌܹs gÍš5sæL±=§dý5@Ò¡XÆÆÆAAAÄE`YŸ‹ÅbÕÖÖÆÅÅ!„f̘"ü¼ ,ˆŒŒ¼xñâ°aÃ?~ìåååååuûömòo¸jÝK¬!ôßmBhRxþËÌÌüÂç½xñ¢«««¾¾þ˜1còòòÚ¶m«’nó㓜œL±f÷îÝoܸ¡Pçnnn!SSS…~#hiimÙ²Ençxe¡P8pàÀAƒ …Bü^úæÍ›Aƒikk«¡Š5Œ‹‹}+Ù³ØéŒŒŒœ‰· C__Ÿx›½dÉccc:NôLÒ›ÜÅ‚$Èý\øk<o%/}ëèèH†ÔüÕÖÖêêêª;Š&Ü\n9Ðt®^½úçŸ&&&²ÙìÚÚÚmÛ¶‰^Ck"µµµ$ ¡q¹\>^r)õÇçóçÏø–ô†††ÕÕÕb>|èáá¡’&K¯^½BÏž=S¨ÕòåË©1 khhhhhÀþ;$222BeeeíܹSì7 þ–ÅbÅÅÅá#'===©=‹š:u*ƒÁ8zôhMMÍÞ½{BÓ¦MËڶmëææöáÃü¦“““hCü‘¸¸¸ŠŠŠíÛ·;::ÊíPV 䟋8Q\\‹Å- E­^½šË妧§Ïš5ËÁÁAî7Ü µî!$BðE©%â›+É2bĈÄÄDü5—Ëurrúðá†a‘‘‘¾¾¾ïÞ½ãóù%%%§N222k+õÇÇÏÏïÉ“'ø°ãÊ•+³gÏ«I%ß`öñãÇ3fP©)êÒ¥KøÜ¤¤$…*”ñ·Ä¬üHtt´¹¹¹‰‰ÉîÝ»Åjâoãââ˜L&NÈËËëD¬ †aUUUaaaÚÚÚŽŽŽ+W®$þ¶°··5jÔ?þÈb±ºtéòäÉÑ8óòò †™™Ù˜1cðÅÍI:”œ³#ÉçÂOD§Ó™L¦Ø¥Q>Ÿ¿aÃ;;;ƒÁáp<==£¢¢úŸÒL´îD“eÀ¥–É2 £¦¦FÖzž)))‹-zôèB(<<\(nذ!dmm‘‘A¾+·Ôý Dw¥700¨ªª«ƒa•çäð‘ñ›— ¡PØ­[·úúú·oß&%%á3z(jêý5a½›úúz]]ÝV6¯¤uO–Ç'@ëçêêúðáCY¥nnn¶¶¶ñññ¹¹¹ÑÑÑ+V¬ÀÓétê°‹»@'–SSSËËË)nö´nÝ:"Šh4ZXX›ÍF­=å4C ** !4aÂulj´~û÷ï_ºtéû÷ïBååå;vì0`€h…M›6…‡‡‡……­_¿ž¸Ç³mÛ¶ï¾ûŽËåbVXXxöìÙiÓ¦Q9ݘ1cöíÛ—››ËçósssDK—-[víÚ5*ýTTTèèèP|â'0 ó÷÷§Þä‹!–}iÌ4ÍVÏž=i4š––VxxøÂ… 9¢îˆ€ ‚Ö¯ÿþûöí 677wrrz÷îÝü!ZÁÉÉÉÝÝ=77W4Õùùù;¶OŸ>úúúîîîIIIx‘è`’ë­_¿¾  ÀÝÝÝÈÈhÞ¼yaaaD>D£2³!äåå•””¤Ð'ŽŽž4i’BM¾˜’’b”ܘ5hš§çÏŸã­¸¸xß¾}úúúêŽ(ŸaÀ€wîÜ‘U* _¼x)v|êÔ©S§N•¬O~ÉQKKë§Ÿ~úé§Ÿ$‹h4ÚõëשüñãÇúúz|ò'uW¯^]¼x1ÒŒ»q¨ Œ@'NœpuuUh^‰ræÍ›'ùÈšTÖÖÖiiitºb?¡gÏž}ú4--M¡Mî߿ߩS'±,¨Ü¥QCCÜŸ¿iÓ¦»wïʪ Ü¥Q@ðéÓ'…šÂf³[åShBß|ó •j4-<<œÁ`PìVKK+99ÙÖÖ¶¡IQXXhgg§ÐVÀ@s”——ïÚµ+88Xݨ$BšJttt—.]ºwï.·¦›››èJ¡äªªªèt:yTz²Œ……E^^ž¢­€& QwMîÐT~ú駪ª*¹Õ"##>|H½Ûˆˆˆ 4".À@" I‚™3g0€¼ŸÏß¼y³BË„„‡‡7*8€¸4 @“`0¢;å’T‹ˆˆèÖ­õž÷íÛ'·þ|Ú´i­ru+Ô. b111r딕•1‚új2Æ 6lõZî¥Q“ÒÒRÔ2ƒ-ŒP¥«W¯R¹€ijjzèÐ!Š}9r¤   qq©Œ‰‰ F311‘ú¶ñJJJÙŽÁ`æçç«$6ÐZA"@eêëëýýý‹ŠŠÈ«eddœ9s†bŸŸ>}Z±b…¢Ã£¦≠´/Ÿ½TˆÃ°ØØØcÇŽ999©7$ÐÌÁ¥QT¦´´Ô××·}ûöäÕ"""Ú¶mK±O==½ˆˆkkk%â9{öì½{÷„B¡P(Ä0Lì¿’«ªª¨Ïb•ª²²244ôÒ¥K%%%–––#FŒØ¾};›ÍÆK'Nœ˜˜˜XYYÙ¡C‡}ûö >?žŸŸ¿nݺ'N0 ± ˲:$® "„âââ|}}™LæÊ•+׬Y#Ú_¬ ¶¶Vì d䦤¤„‡‡?zô¨¬¬LWW—Ífëéé½{÷®ñ‚æàKÁ*ÈÌÌTw ꔓ“óùóg*5ù|¾r§2dBˆú¾N6›-·s’ß!óçÏG]¼x±¶¶öÎ;!///±æø…J∞žB(.....ŽÅb‰öIÞ!^“ÅbÅÅÅ%&&:::ŠÇ0,..!¤§§'ù)$à éÐÌÌ !tëÖ-Ëáp\]]aK¥î(T/88¸¥ÞQ-”ƒƒCVVVff&•ÇìZ–òòò¬ZµŠ¼š@  žŸ/^uꔢܾ}»¾¾ß$VŒ ! {ñâÅ’%KÈë8p 33SnW</++kêÔ© PPPàçç—••¥P+€TPØ™3gÈ·är¹ëÖ­ÓÒ’?MWW7--MGGG¡êëëׯ_/k8ˆ`D€"`Ö( Û²eKEEI¶mÛ¶víÚ‘÷“œœÌãñú÷ï¯ÐÙ…B¡ÝÂ… j!Š)((°²²âp8$uX,V@@€Ü®V¯^íãã£P"¬¯¯÷ððøã?lmm©·¢H |úôIåÝ‚VƒÍf+ºòQ‹‰Å,Z´hüøñ³fÍ’UáöíÛ§N:yò¤Ü®† 2gÎ…ÎþàÁƒvíÚÉÍ‚Ê]-,,´³³³´´T¨Ðååå»ví Vw ª‰‚§OŸ?~œ¤ÎñãÇ©¬”Æçó).½&ÊËËkÀ€ж¢Îž©R…„„¨;„¦“ePƒÁÈËË#tïÔ©S$ãEÜýû÷GŽ©èÙùå.—K¾÷!&Ë@$BpäÈ>ŸORß#^î¼'Ožœ9s¦B§¾råÊÑ£G©ÌD(!T¥¥¥mܸ‘N—ùSSSS3jÔ¨œœ¹]=ztÆŒ ½W¯^'Ož¤ø Œ !T ‚•+W’$œœœqãÆÉÝAbçÎ|>ŸÁ`P?uYY™………˰ä‚DU=zô˜7oIggç£G’wróæÍ#GŽà#6ŠÞ½{çèèX__O½ €:H„Pr÷îÝ+W®THJJzôè‘Ü~ÌÌÌvìØ¡Ðp0%%eÍš5TæÈàÒ(ÔÁw(9pàÀðáÃI*lݺuÈ!ýúõ#ï§GŠn(wuo@cÀˆJÖ¯_Ož&L˜ ÷éx//¯>P?iMMÍ„ ”ØÁˆê`D%]»v%¯ whbbbII‰Ü©4¢6nÜÈf³º¡PŒÏÓÓóýû÷²Jy<^ÇŽåNf4hÐ¥K—ÊjkÖ¬Ù¶mõú@$BäÈÉÉùðáCûöíeUˆ‹‹ëر#ùd–´´´††¹ûQˆJIIÑ××733£ÞäK211¡‰ ²ù"Í$Bäh×®]JJ É>>Êý6`³ÙOQ^^Ž}º|ù2þ]=z¯ô}× IDAT”N§¯X±_"|ìØ±§OŸÆ[‘áãKÑ/êáÇø‹¡C‡FGG1¢C‡®®®[·nõ÷÷—[€Ôiq#ÂF …ÎÎÎׯ_§ÞdôèÑÇoÌIù|¾¹¹9Bèüùó 5ÌÏÏ·¶¶¦XyÒ¤Ib¿I¼½½ñ"|s.—+ÙŠ¤¿ ZXX(õt aaa:uB >œJP¡V<"„É2ÈtÿþýÂÂBY¥TvÖ¥Ñh'Ož$_’FÌ™3gfÏžM½¾¤7oÞà+ƒcMöøÇÃçþà—…ñ+œ×¯_çñx!???¼¨ªªª¡¡áéÓ§xC’¢ÀÀ@„PDDDMMMFF†¿¿‡ð¢öíÛ_¸pá‡~8xðàþýûBiiir‹P€ºó1Ð -kDøÕW_]»vMVé©S§FŒAÒ\(~þü™ú骪ªHN§É“'#„~ûí7…ZQã¿=Œ%ßòx¼eË–ÙÚÚ2 }}ýÞ½{cS’">Ÿ¿aÃ;;;ƒÁáp<==‰ñ‡­­-Þ?F311ñööNOO—[T«á!Ò …Â: 6LV…ž={:::’ôpæÌ™sçÎ]½z•â—,YÂf³GŒ¡X " ÆŽûôéS¥{ ¨¤¤„ä­ŽŽÎÖ­[·nÝ*Ù¤ˆÁ`¬]»víÚµ’E$[÷Rª¤¤$òNV¬X1hÐ *§¡­[·êéé)¦¸Ý»wKQH@"@ŠëׯçååÉÚŒ¾¼¼<66ÖÉÉIVs@B}@¶wïÞÅ‹+èÿܼy311Ÿ“‰`­Q‰)<<Y¥±±±ãÇ'i^__occãêêJå\÷îÝ{üøqc²à¹sçêëëE³ @!wîÜ9âQnIóæÍ“UZWWשS§ÒÒR*'ª¯¯Ÿ;wnqq±2Q"„º~ýúòåË+**”î—F‡¯ø,Khh(IiRR’««+ñ€99&“¹~ýú±cÇ*ŸWW×ß~ûMrs ¸4 uø×¯_;;;Ë*=räȤI“H¦É 0 oß¾TNôùógSSS|É1%…·oßvêÔ‰|(%ºÍÏÏWa‡ Õ¨©©QwM!ÿO  :411Qê’1Ÿ?^¶l™···¬æW®\ñð𠸧|HHˆ——×·ß~«\¨«W¯~óæÍï¿ÿ.µT¹!Ng0Ô§ùM3jÔ(u‡Ð$ ðÿ²³³;uê$ká4¡P¸iÓ&Y—=kkkƒƒƒ/_¾L%ÖÕÕUTTÜk”+''§1;÷Jeii™——§Ú>hþ ðÿnß¾-«ÔÒÒrÁ‚²Jëêê¾ýöÛ=zP9‘ŽŽÎÝ»w• ¡šš‹uöìY’:pê`Ö(ÿª¨¨HNN–Uwüøq’æl6›âÊ¢?ÿüó£GŽ!„ŸÏ>|8±c- ñ 𯘘©»"àöìÙcdd$«tûöíäC4§OŸvìØÑ¾}{%"D½~ýÚÌ̬_¿~Ê5H‚K£üËÞÞ~Ñ¢E²J?Žo¦(I(nݺõÞ½{TÎbiiyëÖ-¥§zvíÚ5>>^n5¸4 u0"à_Æ “µ>Kii©ƒƒƒ¬Å<étú›7oºté"÷OŸ>­««£xQLnnn=H6Ä(!!´oß>Y7‹‹‹;tèP[[+µ´²²²¸¸˜ÃáÈ=EUUÕäÉ“Ÿ?®\„k×®>}:ÅÅØ`Dupi$ ùåY[É¿xñbòäɲv ŒˆˆxóæÍ©S§äž¥ºº:88¸OŸ>ÊyàÀ‹¥\[ H„ Ã~úé'©¥^^^^^^²ÚòùüŸ~ú‰Ê)¬¬¬”Û5÷òåËúúú÷ø( !ˆÁ`Ìœ9SjÑãÇ­­­íììdµ —Û?†aC† Ù»w¯¬\K¢¬¬löìÙ/^T¨•r—FÁ§OŸj4 ›Í&6nM MWQQÑ©S§üü|ƒ!YºjÕªùóçKM„ãÇ¿{÷®ÜqŸ?Îår;wî¬Dx'!!âú¥TXXhgggiiùÎZœòòò]»v«;ÕƒD4Ý¥K—  5 bæäääãã#µáÎ;œœ¨ì ïææ–˜˜¨Ä¦ƒ'OžôóóSâ©A¥'ËXXXÀ*k@ªu‡ÐT`Ö(Ðt3fÌ8pà€Ô"%5G"„V®\¹qãF¹ý:t¨²²RÖ\/^ ¯®®V´!@!F+))æææ’Eýû÷—Õ0//OWWWîUÄgÏžýøãÊ=üçîî~þüyŠ[ŠÇ' !Ðh»víZ¹r¥Ô¢Ã‡ËÚ†¢¨¨¨{÷îTö…o×®ÝñãÇIö/”J(¾~ýÚÚÚÚÝÝ]¡†%À=B ÑêêêfÍš%µhñâÅ………R‹Þ¼y3gÎ’¥GqUUUæææ#FŒP4ªÐÐÐÂÂÂsçÎ)Ú H„@£mÛ¶MêñêêjƒvíÚI-íß¿?ÉUS\QQQ×®]ß½{צM…BÂ0¬¤¤äСC µ—F .ÍuöìÙÊÊJ©E'N”µ_`DDDVV–ÜΓ’’fÏž­h¬®®¦Ñh§NR´!@i†ª¬¬\´hQ}}½d—Ë}÷îÔ1_AAÁ† tuuåö?zôh’M¤ª¯¯÷òòzúô©B­¤‚!ÔA"ŠË円†šššJéëëgffjkkKq8œ£GZYY‘ô,¦M›VSS£hH¯^½rppøê«¯mh H„@CYYY­Y³FòxyyyzzºÔÇä¹\®®®îøñãÉ{Þ·o_ii© dwïÞý×_¥ò„¾\-hDhbbB£ÑTò©P$B ‰Þ¿ðàA©EÇÿù知-_¾|Ïž=r;VtªKff¦««kKÙkH]¸ÌÌLŠ »ví*¹ÚjII‰ª@1&:yòä›7o¤uìØqéÒ¥’Çù|~\\Ü´iÓÈ{~õê‹Å"Y¤[ªuëÖ…„„(±›Z”””DFF"„˜L&B(!!bÃŒŒŒ—/_6ad(¥eüà ZóæÍûöÛo¥}óÍ7½zõ’<®¥¥•——gffFÒíÍ›7GŽ)'**jñâÅŠ¶"ÑÔ—FãããBÞÞÞH$Š]ä{Küq€ìÔ©“XŸ‘‘‘ÖÖÖúúú#GŽ|ûö-~°²²288ØÒÒ’ÉdÚÚÚ•——‹v¾gÏKKK‹5räHêcSDÁs„@Y[[K=>wîÜÕ«WK>>˜]RRâææFÞmuuõÁƒe­M*U\\œ‰‰ÉÀ©7¡îâÅ‹ÙÙÙ† …B*ÿ­®®–:VLEEþlÉâÅ‹cbbüwñâEìw¶di×®Ýþýû©Ç°hÑ¢-[¶P¯OÑ‘#Gð™¢GåкA"šâÅ‹¯^½’<þîÝ»o¿ýV2¾|ù2$$„|íl>Ÿ?wî\ê¹ðºº:…'uuuøÍ3Œ !Ð;wî¼~ýºäñÚÚÚ5kÖHî¬Äãñ6mÚ„Ï”*&&F¡gªªªh4Ú±cÇôõõ©·’«¤¤DGG'55ÕÑÑQ…Ý 9 Mѵk×€€Éã®®®R—7sssÃBeÅŠR'šJÅãñ<==ñÕRTè—_~Á×»Û½F„P‰hŠ~øÁÈÈHìà¹sç%+Ï;÷Ÿþ!ïðÝ»wýúõ£xöW¯^uïÞ]µÏÎc–ššš””¤Â>Ð@F˜;wîÇÅböÓO?Iî„÷úõë?þøCrÅQ‹/îß¿¯Ðš¢={ö·¿|C!Bù¼ÿðµ;›™¬!ŸÌìì Òƒ@Z?CCÃèèh&’ÎçókŽvÉË˵åF"‘œœœ$ß>æçççåå%ߨ-,,Þ½{W¯&) 6ð@=hå0 SQQ;v¬HzNNŽ••Uqq±HˆZ²dÉ”)S<<<ÄæVQQÑ®]»Å‹K_“'OJ~Qz†ùûûoÚ´iîܹ’_)s‹P äççËX?ЪI~”¨Eƒ@Z¹§OŸîß¿?>>^$ýÊ•+‹-‰‚\.·´´tÑ¢EµåæããÓ¡C‡   iŠ>þ¼‘‘‘×ܰaÃÓ§O×®][³u+d2™B¡XYY5Fæ ˜0a‚¢«Ð( ‚V...näÈ‘5Ó½¼¼˜L¦H"•JMLL¬-+>ŸŸ””tïÞ=iÊýñãÇŠ+ðlåÅÕÕ500J¥ÖùJÙZ„yyy2V€ î‚Vnÿþý5{2ÿý÷ßêêj‘Ëׯ_ß¼ySBV åõë×5ŸÁ«cÇŽwïÞíß¿}+\Ç[¸paNNNÏž=¥‰‚€z@Z³ÌÌL ÃÔÔÔDÒ]]]_¼x!’¸iÓ¦šXŽ?þàÁ)Ë g³Ùø£î wàÀ’’¹OÒ ÀA ­™‡‡Ç•+WDétº©©©Húš5k\\\ÄæS]]íãã#e(:wî\xx8Ç“¡Â"ð$V­Z_s8 àñ ¤´Z<¯¤¤¤æIšššqqq"Ãd ÆüQÛz¶jjj‰‰‰}ûö•¦\;;»K—.5|BQ‹5uêÔ'OžH$ee忍 BÐj)))}øðAd€eqqñÖ­[E^ùäÉ“1cÆÔ–ÏÇY,V¯^½ê,‘Ë妥¥H2%{ûö­ŽŽŽµµµ çB‹éA ­†a5ç^ ýõë—HâÕ«W—-[&6.—;oÞ¼[·nIS¨‡‡Ghh¨ µÁãñªªª¬­­Ïž=«¤C»h\AëôìÙ³‹/Öœ{eÉ’%^^^"‰ûöísrr›N1bÄŒ3ê,Ã0*•ºÿ~Ù*,\âï¿ÿÙL E€ô ‚ÖIGGÇÏÏO$Q tíÚµK—.‰~~~l6»¶)ÐôôôŽ9Rgq$)22²^CZÄb0ƒ ª­z]@ëdnnnnn.’8tèÐsçÎ ßí»{÷n\\\@@€ØLæÍ›·råÊaÆI.‹Á`Œ1âÆÆÆÆ ©3“ÉLMM0™L‘žR\vvöŠ+*++ë,ËÏÏoãÆ YkÏç0€ÅbÉœ  k´*†õë×ïîÝ»"CCÛ·o/²¯……ųgÏÄÆ0--­C‡uíÚµÎâbbb¸"…Byøð¡™™YC2© Z„HZ„ UIKK£P("Q!´jÕ*áÁ¢oÞ¼¡Óéb{> †žžÞìÙ³%tòäɧOŸ6$ æääØÛÛ ¹GA@½@ ­Jß¾}_¿~-’èéé)Üωa˜››ÛÓ§OkžÎ`0ÌÍÍþü)¹”ÂÂÂ5kÖtìØ±!Uµ³³›={vm³›š t‚ÖƒÉdÖ\téÅ‹>nüUUUýöÛo5'ãF%%%ÙÚÚvèÐArA†††<èÝ»·lõär¹T*5--­áOß׺Fü­G|||Í.MSSÓˆˆᆗ††FTT”ØlllN:%¹”   6›maa![%߿߳gO‹ÕxQP/AëQ]]íææ&’ؾ}{á•%.]ºtöìY±§»»»———K.âèÑ£qqq@æJž:u*44´±£ ´t‚Ö£æœ[¶l111žP{ýúõ‡ªynLLÌÛ·o544$1eÊ”Q£F ?(½ÏŸ?›™™íÛ·O†s[7===|IˆÜ@! EZ‰k×®}ÿþ]8ðC‡‰ÌùróæÍqãÆÕ<}Ú´igÏž­¹ZÃᤦ¦H³0aMÏŸ?·¶¶þöí› çÊ ±[„zzz$!ÙÙÙRžhnnÞ¯_?‘ÄÒÒRyW€z€@Z ÃÖ®][PP œH"‘222úôéC¼&++Kìô™™™ªªª’WÓ]¸paDD„Ì5üñãÇíÛ·»uë&sÍJiiéáÇBT*!tõêU)OüôéSjjj#Ö €úƒ@Z6›=~üx+++áÄ””MMMb÷Ì™3žžž5ÏMNN>|¸ä¹]x<ž¶¶öž={d¨ÛÓ§O«««g̘1dÈNo¶._¾Œš9s& „DKQì.ñ;O¬ùåáÇŒŒÔÕÕÇŸ‘‘'’ÉdÒÿª¹® ÷Ak ¢¢"²"î¿ÿþëè蘕•EŒe2™5W(DíÝ»WÂ蕲²2¼T_Ïž=›9sæƒde*<ö0™ÌÏŸ?³Ùl6›Íb±Øÿ!¶EýúÅáp¤É¿¢¢âÑ£G¡+VÄÆÆ>{ö¬´´TOO¯´´Tx²‘Ýoß¾Iî³ýüùszzú»wïF=wîÜ·oß"„tttð¾Óääd{{{.—+Ûÿµ@Z<¼9øðáCáïÜ’’’uëÖ ?5!¶9ˆ?~¼„Ìétº••Õýû÷¥™q­¦þýûߺu«‰£ áÍ›7þþþõ:E[[[š—ݸqƒËåX[[ݸqCd;ìÙ³GIIiÔ¨Q¡ääd<‚Ïž=›>^EEEdÖÐ &Û<oþüùçÏŸ™Æ¥¬¬lüøñ/^¼0½ËçÏŸ'Mš$CŒ‹‹3118p ¥¥e}Ïm8>ŸRRR233SþŠŠŠÈ†È6›ÍiX×ï-**".ûÕ«W… ?£róæMssóëׯëëë˱BÐ L™2¥ÿþÂ)gΜ±²²"†wž8q¢¼¼¼f´Û¾}û°aÃ$DA Ã,--eˆd)))Ë—/¿}ûv}Ol¸ÄÄD>Ÿ¯¤¤„²²²Š—þÜ‚‚‚ððð:_Æb±ð·¾téÒÀÀ@ÿ;wîà³æääTWW8p@ä\UUU&“yùòå1cÆ=z4""‚¸X›óçÏ/\¸pâĉçÎç Âû`¥_Ô  ©tïÞ!”-¯ ù|¾H ‡ÃéÔ©SJJ ‘RQQ‘––Vó\.—K§ÓkËùíÛ·¦¦¦²ÕJ deeÉvnCܽ{×ÄÄäíÛ·¾¾¾¡;vÔëôüü|##£:_¦««‹uèêêÖÜ}üøq¿~ý”••ííí…a–——çììL¡P:tè0yòä«W¯Ö™¡Ø_*õ¼0@ÜÝÝ###] ùsww‡!hÙ‚ƒƒ544–-[F¤ðù|___b`!N×ÔÔ>ŠÇŽóððð}@@À¶mÛê[Ÿ'Nlܸ±Gõ=·!"""<==GýåË2™|ñâÅÆ+K¤5&²;jÔ¨?»ØÿŽ‹éÔ©STT”Èw’3Ä»yh<ðøhÙ®^½*òÈ¼ŠŠÊòåËñm6›mnn^\\,rÖ¡C‡bbb0‰Ï›ÇÅÅÕ¹“:¾uëÖ9sæÔ묆svvÞ½{wII •J…å,¨/ø›-Û£G† Fì&%%Íš5‹ØMII2dHÍá}úô ¯meù#GŽ$$$àŠKÅbijj¦§§÷ìÙ³^'Ê Ã°´´4„ЪU«222„Í€¹FBЂ½~ýZYYY8åøñãC‡%v‡ Rs´ŸÏ3f 1㌈¼¼¼M›6Õ«&ÁÁÁóçÏGÿÍ´Ò~ýúeaa€²°°€† 2ƒ?ÐR±X¬‰'ŠL«vàÀâ~a|||͹=?~}4hPLL ‰Dòòòª­w =„ ¥êÕ«×™3gˆ]7iÒ$bBg Ã6nÜXsJ—˜˜˜3fˆÍðÀ·nݪW|||š²áõóçÏU«V /,%´BÐ">yòD8%//oÈ!xcN ¨««/]ºTø%%%'Ož¤Ñhµåéèèxá‘›Ž`F"‘Þ½{×Ͳ/^Œ1‚N§=zÑ¢E]m BÐ">}úܹsÂ)ÆÆÆÄ¸˜={ö=zTä”Å‹çææŠÍÅb¥¦¦êëëãÏû× Ã°„ÐÎ;ë\ËW.Ž9âíí-ò4$@. ‚iĈ ¾ÔÔÔ„„|ð={öŒ9Rä”ùóçoذ¡fV†Í›7ïĉÒ—þ÷ߟ;wNòÊMrñêÕ«Ý»w#„Nž<éàà ý‰Ð5 €ô`fÐ"ÙØØ„ã‰$)77WxY%‹E¥Rk»5Èãñ:wî¼cÇéKwttÜ»w¯„^V¹(--7oÞ‘#Gµ ??¿)K-Euuµ¢«ÐX ‚–ÇßßÊ”)ÂëÜ.X°_š‡Íf?þÜÎÎNøõ»ví*,,»¾|IIIûöíkÎ -ŸÏ_¾|ùöíÛE°Ü]¹ríÅæ IDATÅÆÆFOOïË—/øôÙõ%[‹L&S(‘õ /êÒš@ - ‹Å wssN$"Spppff¦p Ä0,>>þÆ5³*++³´´LHHèܹ³4EoÚ´)77WUUµÕ¯Ûùóçׯ_ãÆ ===Ù¢ Ì òòòš²Dš¸GZvæÌ™.]ºà»|>РAD§¹¹ùæÍ›…_O"‘Þ¿/6Ô}ùòeîܹRFA„К5k®_¿.a-ûºyó&BÈÞÞ>;;»^Ï2Ö÷´A ƒa˜pÿÌíÛ·ÕÔÔðeêB"7¯^½ª¤¤$v* 쬬¤éd±XsæÌÙºu«Èª‡ò5xðà’’’¬¬,b"@Ó€!hI õõõ…:'NŒŽŽF•——8PxYs·lÙ2|¢/_¾$–í­Ó™3gÔÕÕk››´áðÅ1vìØ‘““ÓÄ}¡´, 3fÌ `ÿñã†aÆÆÆ¡ :Txîi%%¥;wîŒ5ªf>AAAûöí«³8ƒrww?sæLc„¨‚‚‚!C†lݺ!ôÇÈqâlè@zðó´$ŽŽŽÓ§O'výýý»té‚?¸aƲ²2âPNNŽ¡¡amwÚð.SÉeÑéôI“&yzz:99Q(yTÿÿ2™¬­­=uêT‘›š€&-BÐbäåå±Ùlá§÷?~ìêêŠzùò%…Biß¾=žŽa˜‹‹ËÉ“'kföìÙ3išwß¾}377ÇW’¯>XYY%%%©©©ùùù5Æ mÐ"@zA‹±sçN|šBZZš¾¾þÏŸ?'MšTTTD¤3 CCC‘rss·mÛÖµkWɱX¬üüüþýû>|¸1¢Ôëׯ—.]:hÐ ¹ç A­¿‹ >±llloüˆXUUUÎÎÎø6¾¸DPP…BÉËË[ºt©ñÊvíÚ‰ÌDŠëÚµëÓ§O%Â’’’1cÆ,X°`õêÕò­ÿÛ·oƒ‚‚âââD‚(V­°¢¢ÂÛÛ»1ú…@+@"‘š8 wuÞ¸qãÁƒÛ·oG 4H¸uååå5iÒ¤±cÇ Ÿ‹N333É¥¨¨¨Ìœ9SîQP ,^¼xݺur¿Ý(–l]£|>_¸a €mmmuuuE×Bþ$Ý)ÑÒÒjâyAKQ³×±±…††.Z´H[[ßíÑ£>Ør×®]S¦LéÛ·/ž^^^SsøÉÞ½{Ÿ>}*yXfYYÙóçÏ'Ožìïï/Çš'''çää̘1ãßÿ•c¶¡¸¸¸[·nÂmkååå!!!îîˆüÁ¨QÐ ÿöíÛ·oß¾………»wï^¸p!‘®­­ýùóçšË-X°`Μ9T*µ¶"ètú€|}}å[ó÷ïßOž<ùìÙ³òͶN2–Ñ×ׇYÖ€XMÿó·ÉÀ`Ð2ìØ±ƒè“ñõõÅ]Ò××%Z0·nÝ*--‰‚ÕÕÕ©©©;v$feKSS322rÙ²eòªð7¸\®……EzzúèÑ£å•-@î ‚ÀÀÀÀÓÓßf2™‘‘‘&&&$i̘1xzII‰³³³HkF 888ˆ8CÈÍÍÅÇàÈqfýððpOOO¼2b§¶ilðøÒƒ@𻤤¤ÐÐPbWUUõÍ›7FFF6lعs'‘N¡P‚‚‚,,,„Ïåñxfff[¶l©-s@0tèPkkkyÕöíÛ·!{{ûoß¾I¹Þ=@±à!hîNœ8ѱcGb·¤¤¤GàÖ­[¯_¿ÆY,–ŽŽŽÈmü?~tìØ1$$¤¶œ1 #“ÉŸ>}ÒÓÓkx=ù|þˆ#Š‹‹¿~ýÚ³gφghÐ"ÍÝöíÛ‰~ÑÛ·oO›6 !D&“³³³ñ©dð”’’"|ÖÏŸ?\XXX[¶ïß¿0`ŸÏ—K¬®®¦P(žžžYYY Ï­á kéA Í—ËÕÐÐ Z„YYY_¿~}øð!ñš”””:ˆ¬‘”™™éææfhhX[Î ªïëׯÖÖÖû÷ïG¹¸¸4Íc‚9‚®QЬ͚5ËËËë÷ßÇwñQnnnFFFÄ2ô¼}û¶ðY`øðáÇ›gyy¹¶¶v||¼\¦O#‘Hvvv>>> ÏJŽ E€ô E¨zzz¤ÿ(º.Í‹ÅzþüùСCñݘ˜˜_¿~!„&Nœ¸~ýz<1 àÇ—ñéÓ§¦yþü¹©©)ƒÁhà•OII9rä÷ïß»uë$Ç”M þzÑË—/Ç×®];ƒÅ‹oܸ‘˜ ¬´´~­×IEE¥¨¨|°ªªjùòå ƒÏçÏœ9SUU!ôäÉ“S§N‰<Ÿ°mÛ¶ðððÚò|ùòå•+W>MÔ™3gœ;wîÜÀ|I´Iµh¼h$KBB‚­­íû÷ïÏž=›““ãççÇd2“““]¯–äÚµkÄ\0L&síÚµ,«sçÎÄ÷»••Õ… ÔÔԄϺyóæüQ3·W¯^ ‚Õ«W7äa‰””¼488ØÕÕµïcFü_oв@ l,k×®år¹QQQÓ§OWUU522Ú»w¯¹¹y'Òétwww*•Ú¥K77·òòrâèŒ3ttt(J¯^½îÞ½‹'­û÷ï700PSS?~|vv¶ð!‘W o_¾|™F£Q(WW×üü|ù_ ™$%%yyyß­:tðññ9uêÔòåËñúûöMEEÅÒÒ’8%88811Qìp•û÷ïOœ8±C:Y,ÖÔ©S‡ ÒLZ ]]ÝÚ‰>"WxWò§Nò‡€Fƒe þ`õ¸q㈉$2Ä_,__ßcÇŽ]»vmܸq/^¼°³³ËÉÉyðà~ôòåË¡‚‚‚N:¹¸¸às—”––â±!???##ãýû÷666ŽŽŽoÞ¼!á„w‰m''§ØØX„ÐÌ™3ÏŸ?_]]]g%Y,–ÏÎ;i4•J¥Ñh57Äîòù|)/à¯_¿ˆ˜÷ðáÃŒŒ OOÏ­[·²Ùl„Pnnîo¿ý–­¥¥…¿>'''44ÔÉÉIlnššš¯^½’ùñ¾ÔÔT‹õÛo¿eff¶ˆq¡MÐ5ZZZZ[baa¡©©innî‰'B?~455ÕÐÐÈÎÎVUU•ð©“üá ‘@ l,ø7¾ðrêRÂCÝÔ©S‰”çϟ㉉‰ÊÊÊ¡š­·àà`„ÐÈ‘#BIIIR–xöìÙ3fàÛL&SšSø|~YYYYY™”E$Oø)lìØ±ÄRJû÷ïŸ2eÊÙ³gñ÷ž““³~ýz" "„ºwïþôéS###‘|®\¹2|øpbÄ îÝ»·`Á‚øøx„P‹ˆ‚„‚‚‚gÏžqÄár¹5ËÊÊ8NÃË¥Ñh7nôôô¼~ýúÔ©S ÆÖ­[ñ;»8±Ÿ: ~ÂÆbnnž’’’œœL yùò¥››ÛÇ%ŸÈb±BÅÅÅÂÓ©àfÏžýþýûK—.5ªC‡’óiÔÖ€ššÚ®]»„¿U‰ïV±»øÆ±cǤÉÿÙ³gêêêÄ¥‹ŽŽþòåˤI“¦OŸŽÿ¶5jÔ¨Q£ð£À××wëÖ­5|ÏŸ?_¼xñýû÷õõõex›>´³³ÃG‡*)µ¤?¼ÕuúôéÓ§O×ëDb¡«rvvÞ¹sç7ÒÒÒŽ?.<[¬>ü4ž–ô·Ý²„……?~þüùGµ´´üòå‹‹‹‹ð‚AµquuÝ»woXX؆ rrr‚ƒƒŸ={†ßÜúúõ+BhðàÁgΜ‘¾&†††………999ÕÕÕ¨ù'''b áßìH$=zH_ \TT”4/Û³gÏôéÓñ@XQQ¡¥¥¥¦¦¶{÷îvíÚ±X¬ñãÇß»wG³}ûö7oÞˆm« :ôñãǽ{÷®o=ñlÃÂÂ>~üˆÏ_Ó"”––ÆÄÄ]ôìÙ“&„诋Éd OëÚT*uÓ¦M®®®|>ßÇÇGä£%öS'áÃ@ãÂÄÉÏÏ722{HéíÛ·³gÏ600PRRêׯߙ3gðôÚFàGy<^```·nÝ(ŠŽŽŽMdd$~èüùó;vÔÓÓ#¾­ð³ˆ Åî>~ü¸_¿~ÊÊÊööö‰‰‰Â‡ðíøøx*•J&“ñÕ¤ykîîîD­êŸ‡:;;[òËÂÃÃY,†aUUUíÛ·///';:: ¿¸¸¸¸  @$‡˜˜˜sçÎÉPC þ~ýŠaØóçϹ\®l94±ÔÔÔ?b¶~ýú… ¦§§ïÚµ !´nݺzåSß¿z‘O2ñÆq¹\¼n``P]]M¤KøÔIøð…“ù¯¾™ûÿs‹=°-ðKH²Æ„„ÄÄD''§ääd<…Çãýøñß®¬¬üôéSͳ »uë–‘‘Qßê•••ÙÚÚNŸ>½¾'*Ä·oß0 ‹ˆˆÐÔÔ¼xñ¢ð¡¦ „u:uêB($$D8QæOP¬Váñ ÐìL˜0¡¸¸ß>|xppðÇ{õê…ŠŠŠ¢P(øýQ>Ÿ?mÚ´¸¸8‘ÓÁ‡ê;FT hhhØÙÙ]¼xQï£}øðA]]ŸàtÁ‚Š®”_¾|‘òî °í"V] ž÷j’““ÓÓÓñ±ïß¿ÿúõk÷îÝ=z¤ªªzéÒ¥‡¿’ÇãýöÛo7n>=88ØËË !$²N½dYYY¿ÿþ{LL …Bñ÷÷ožãbètº““>{\Ïž=‹‹‹÷îÝ‹j¹­«ð¹Fñç·mÛVTT$<ÿNóüÔ6aÛ…Oó†ûL˜BôïßÿÒ¥Kø÷ø–-[¢££Ùl6ÞìØ±cDD¥ŠŠŠ”••wïÞ-<É'ƒÁ¸xñ¢ ó_§¥¥M:uîܹò{rsâĉ±cÇ2™L Aƒ½yó!¤¦¦¦…ï¥WÛ§«y~ê@4#|>ŸB¡ <ßÕÔÔ|öì>ÐT ØÚÚâ³£þöÛoD÷).//O]]ýßÿ­ù(amÒÒÒ&NœXUU5yòd//¯æ3qöÏŸ?CCC¿ÿŽúôé“««+™L&‘H«W¯ÖÐÐ&…·hAšË_>¡þùgÖ¬YÄîñãÇ1 suuýôé>Ê—½råJáG}||<<<ê[܆ fΜÙð ¸ååÇø£›7oþôé>'Þ={æÍ›‡O#h A3rçÎI“&!„X,ÖèÑ£I$ÒíÛ·i4Zhh¨¯¯/þ>Ÿomm-ÜÿÉår‹ŠŠÎŸ?/e)éééGE]¾|ÙÍÍM±gcVPP€Ú¾}û¨Q£222BG566–9[h =„ 9tèЂ BÑÑÑ|>?&&OŒŒÄGÞ»w”8 Ãnß¾M¥RO:%<Ýš¥¥¥¶¶¶Ídâ’çÏŸ«««ã³í¬\¹²¬¬lüøñŠ®mBÐ\¼{÷ŽÍfãcaœœœ0 c2™ ãÈ‘#$ ¿·téR¢iˆ¿Ì××WÊvÏãÇ+++õôô¾~ý:mÚ´Fzu*..ž;w.>lß¾}þüéçç‡j>=´´5A“ƒ–ØÐåêêŠÏ°\VV¦¬¬æìììããóþý{â5Ÿ?=z4±;iÒ¤W¯^IÓ·ëèèˆ/M%²~aàóù‘‘‘'NzzzC† ¹sçBHGG§‘ât =IÏKUWWGFF6YU@ ’žž.¼ ôð/芊 ‘t‡£££ƒ9OOÏ1cÆà}¡öööcÆŒAŽ7nøðá!>Ÿ¿iÓ¦ÀÀÀ?ÿüSšªöîÝÛÖÖ6??Ÿ˜ž´iŸ9sÆÕÕUGGçÅ‹ÎÎÎ@IIiÍš5MY €dµB555GGG|Q=DôéÓG¶™¬qEEE")4 _vŽÃáŸïííOF£Ñ¶mÛ¦¡¡qäÈ‘»wïâ3¨™šš>}ú”áâíímbb"yiÀòòrmmíiÓ¦8q¢ fŠÁ0¬¤¤¤C‡«W¯>yòä•+W:uê„/<Û‚Éd …bee¥èŠ€fj„ Š®B£iì)M àîØ±C8ñêÕ«#GŽÄ0ŒËåÞ¸qOœ1cƇx<ž——›ÍÆ0ŒÅb988Ô¹>Fqqñ¸qã–.]Ú8ï@Œ[·n©¨¨„††bVQQÑdåJ‚Zµj•¢+@s“nÅiš™™ùûû#„¢££—-[Æ`0Bñññß¿Ÿ5kVZZÞ¤Û±c•J­s‰]faa·/Ïׯ_gÍš…>8p`iiéÊ•+Q=ç84ˆÜ#422zýú5B¿;•œœáéééìì'B¾¾¾ÑÑѵõsfgg;öÝ»wÚÚÚ»wïnŒîP6›ŽÏ}£©©9mÚ4ü)~ƒ¦‰ —æ8Ë>hõ„á±cÇÞ¼yS^^Žrqq±±±ñðð°°°HLLŒ·´´¤Óéööö!!!C† ‘ç•+W&Nœ8`À¹×¶  ààÁƒJJJ‰‰‰ýõ†aºººø³ÿÍ<>€ô Eš—ËE¥¥¥%%%]¸pÁ`DDD¼zõjÞ¼yk×®­ªª9rä AƒRRRôõõ?~ŒzõêÕ€ˆ™¸Edff.Z´H x{{{{{KA#= Ã^½z…/°p᪪ªÊÊJ …=}útÅÎÊ/„@~ýúURRâîîÎápöìÙ“››;`À€ÐÐÐôôô… fggß¿ßÎÎÎÅÅ…Ïç7.<<\lì'N1b„¼"†aeee!gggWW×ÜÜ\„н{÷ÂÂÂtttäRDÓ€!Òƒ@š>SÇ«ªªÒÑÑQSS{÷îÝôéÓ †±±±§§çùóç###õõõ½½½ÇŒsêÔ)±ùdggß»wL&§§§{xxÈ%^¼xQUUõêÕ«¡Ã‡üøqРA ÏÐ̉¿GÈ`0¢££›¸* ±±±éӧ̧“ÉäÏŸ?÷ïß¿{÷†Û¶m366îÖ­ÛË—/çÌ™3vìØ””‹5~üx—š§'''3æÜ¹sè¿È*³´´4==½'NXYY•••á ¾‹]ö½‘¹EÈçókNwA[[»õÍ‹+>VTTx{{ÏŸ?¿‰kZ„„„‰$[ Ä¿šAzzº¡¡a§Nòòòîß¿ïäädkk«¡¡1þ|ssó‚‚ ‹;wŠœþüùóaÆYXX|þü¹}ûö²Õ¿ªªêøñã©©©GŽÑÐИ;wîÌ™3B]»v•-ÃÖ¤¸¸¸[·nŠ®hŽÊËËCBBÜÝÝ]9«uÔ¨––Ì,Ä’a \ %--mݺu]ºtÉÉÉ íܹóçÏŸ¼dÉCCC ‘³"##ׯ_ÿúõk¢`JJJlllPP…ByñâÅŠ+B;w–fÂÒ6E__?//OѵÍQÃÿö›'¸G@YY933³sçÎgΜ¹sçÎСCKKK ÆÕ«Wõôô‚ƒƒ 4|øðñãÇçää ÿ·6lXAA‰‰‰ôaöüùsƒaØ¢E‹ª««™L¦ªªjLLŒµµuc½½fË =„@”••étúÚµksrr¦OŸ~óæM---‡Ó¯_? …Ò£G1cÆdffüõ×_ø³ PVV–& Ã*++BS§N]¶lY~~>‰Dzûöí¾}ûàÉw€„@””””””^¿~ݯ_¿¨¨¨ 6Œ5ŠËåš™™%&&þñÇUUU<ÏÕÕ5>>ÞÌÌ oJéĉ***÷ïßGÅÆÆ&''÷êÕ«ÑÞJ3-B¤(ŸÏ×ÕÕ-**¢P(QQQþùçË—/{öìioo_YYÙ£G55µÍ›7¬\¹òæÍ›ÿüó„Ü’’’&Nœˆ¯ó7räÈŠŠŠ3f E¬Á hq ‚&…·Qø|¾“““®®îóçÏuuuù|þðáÃ333ÇÏd2íìì~üø¡¯¯ÿ÷ßÏ™3GWW×ÁÁ¡¤¤D$«²²²={ö¬]»!¤®®îìì¼mÛ6„©©©ŠŠJÓ¿µfZ„Hæ Àf³«ªªºvíX¸ÿþû÷ïÿùçŸ$IMMíË—/&&&oÞ¼ùð჊ŠÊ¦M›Ö¯_O£Ñðs“’’îÝ»çããÃb±²²²œBffffff }O€– !P&“yïÞ½ªªª'OžÄÆÆfff._¾œF£q¹Üêêj@PXX¨¥¥äææF£Ñ0 »páÂìÙ³¹\îŸþ9mÚ4 à >¬è·hñ  “É***t:]]]}Ïž=/^¼ ‘Hªªª:::UUUÊÊÊ®®®T*•Íf#„¬­­¹\îÈ‘#ŒŒÒÓÓ]ýºFÜ# @"‘H$™Lþõë׋/BÚÚÚ€Ëåîܹ3??éÒ¥GŽQQQÁÞ»wïßÿ522RtÅ­´A“ÂÛ(çÇ$I ¨««“Éd2™Ô¯_¿mÛ¶ýøñÃÁÁJ¥†††>zôèôéÓß¿ÿþý»“““ŸŸŸ¢ßAË-B¤(¾è<•JEuêÔIMMíúõëûöí+((xýúu\\\—ÿŒ=šØVt­­ÂLOOïׯ_Ä®®®.¾ls&ÜF!‘HíÛ·2dHaaa×®]{öì¹k×.ccã;wîp¹Ü9sæ())ÅÄÄp¹\[[[*•zþüy.—;oÞ<*•zîÜ9|à •JŽŽæp8NNNT*õÌ™3\.÷¯¿þ¢R©§OŸær¹ , R©§Nâp8‹-¢R©'Ožäp8ÎÎÎT*5**ŠË庸¸P©ÔãÇs¹\üÞä±cÇ8Ž»»;•J=zô(‡Ãñðð R©GŽár¹žžžT*5""‚Ãá,Y²„J¥>|˜Ãá,]º”J¥:tˆÃá,[¶ŒJ¥e±XsæÌ¡R©Ïž=c³Ùx€|ñâ›ÍÆä«W¯Ølöüùó©Tê›7oØl6 “’’Øl6 ß¿Ïf³ñæiJJ ±ššJl§§§ÛÄvVV‡ÃÁ·¿~ýJ¤çææÛùùùÿß),,$¶üøÁf³ñí’’"½¬¬ŒØ®¨¨ ¶«ªªˆíêêjbaø%år¹ÄåŦ¦¦¾zõJ†ÿb§¤ÔÐ/èž-…øOjAA¥¥e~~¾"ªê§¶¯›ÊÊÊíÛ·ÇÅÅåæævéÒeÚ´i¾¾¾ø¢ ùùù~~~'Ož¤P(±±±ø"DÒ7(çÏŸ¯(CCÃÂÂBÿïß¿?zôèÛ·o ¥oß¾ìóŸîÝ»7ü[¸íàóù¯^½1b„pâ‘#G/^>>¯·±±yõêÕ“'O†.6C&“)M¹¥¥¥$ Ã0‘¾ná×@- VC~~¾‘‘QÍtÐ ÕöŸ¨¥¥Õ»wob—B¡¨««×<‡bs¨»»{dd¤lµÅã_vv¶pbyyy```‡,XðåË—êêêwïÞ?ÞÏÏoöìÙæææÊÊÊÛ·o—­ÄVoذa¡Ý»w '⋉zxx'Þ»w!Ô¾}ûÊÊÊÚr“þoŸøØèêêâ)Âb¿^ðª"„† &²Kœ"’ƒðv||<•J%“É...yyyÒTÈWCþö`ÉÒ) IDAT›-wwwxްµÑÓÓÃ7ø|>þ4:NGGGä{ó¡¥¥µyóæÌÌLSSSkkkOOO55µ¹sçnÙ²åÂ… ))),kÉ’%Š®f3€Ú½{7ƒÁ ÅvK"„V¯^Ý®];y•N"‘ˆ[D§Bii)&®9øâÅ‹ððp2™Ìd2_¿~>^¼x!Ò!!¼Kl;99ÅÆÆ^ºt)**ÊÔÔT^o„­ ñ­4yòäÜÜܨ¨(&“yðàÁ’’’©S§â‡ðnÆË—/_¾|™èU8MMÍM›6effš™™ÙØØüõ×_Ÿ?&Žjkk+°nÍ™½½ýðáÃüøqèÐ! /{øðaBB‚žžÞ²eËäX:ö¿í¿:-]º4&&&==ÝÊÊ*555::Úßß_ÊsÏž=;cÆ |])»pÂLOOhä‘þC=zô¨··÷¶mÛ´µµ÷ïß¿~ýúÈÈHüPFF†³³³ƒƒÃœ9sΞ=«€ª×NSSsãÆ}úô±µµ ‡@,¢QXUU…§ÔlnÙ²!´zõj ù–^߇vh4…BAQ©T---ùV@ lÁð¨šð£íÚµ ÎÊÊb³ÙÛ·o'StêÔ)**ŠÏçs8œI“&!„šÛºEššš6lÈÌÌìÓ§““<Ü&Áü1bĈŸ?†‡‡‹}Á£Gž>}ª§§·|ùò&®›ˆ½{÷Μ9³k×®·oß600˜6mÚðC†††¡œœœOŸ>-^¼¸æ¹NNNx7ú¯W¹€@ئñù|¼™8}útE×E 6|ÿþ}À€Í-T77x£pÏž=D£PÞôöö–Ws¸M"‘ˆmâp羿fèСkÖ¬4ÍÞÞ^UU•Ïçÿý÷ßVVV¡óçÏ÷ëׯOŸ>«W¯^¸p¡HA¡³gÏΙ3ÇÁÁÁÙÙ9##C.oÔ·Yƒ JNNFá7víÚ¥èÕJYYyݺuŠ®Es7nÜ8kkëçÏŸ~üHìÖn3cÆ böäZ„mÔ»wïð~Ô’’’ƒ ?‚Ö ÅÅÅ)ºÍÞ(Ü»woee¥p:ÑÔÔÔTHÅhæ ‚f-==ÝÉÉ©sçÎt:]ÑÕiÖÆŽ;räHü— Ñ"|òäÉãÇuuuW¬X¡è ÊHB7,r4SiiióçÏ777ŽŽ&“ÉøòôŠ®TsG4 ‰±ExsÐËË«å6……5ÿiåAK4;©©©óæÍ377?w’ÒâÅ‹333#"" 5P§1cÆØØØ”––>|ø!TTTôèÑ#–Û  @ ÍȧOŸæÎÛ¿ÿ˜˜*•ºtéÒŒŒŒÃ‡wíÚUÑUk1ðFá;wBïÞ½C­Zµ ×@‚ZGVWWÏ_ ,==ÝÒÒR¾y~üø1((èÒ¥K_•É××·sçÎò-¥-°³³³µµÅŸ,,,ÔÑÑY¹re½r°ò «ººZÑUhâ¡ššš££ãÛ·o›¸6 EÀW„Wn)))ñññxtssóõõíÔ©“¼òoƒìììðÛi+W®¬WsL&S(üÁ>jš0a‚¢« °`hR=zôÈÉÉÉÎÎîÞ½û‡/_¾Œ‡@###E×±5=zô“'O´µµsrr`šV$€õb¤¦¦®Y³æòåˆQ(”.]º§¦¦.Z´ýïB¯"ÿJ8/þ×ØØøÉ“'+W®„(@  »wïÞA¥R¿ÿþýûwEWªµ7nܪU«] Z„ I­\¹²¬¬lÕªUÙÙÙ[¶l¹~ý:‹ÅRUU:uêìÙ³ñgÝð)ö_ ‡ïÅÇOHHpuuµ¶¶V`5êû²Å‹CsiÀ=B Ho߾ݲeË?ÿüƒaX»ví–/_¾zõêöíÛ+º^ÿÃÅÅåĉQQQÎÎΊ® @Î<<<à9B Hƒ¾víÚëׯ'MšÄ`0vîÜÙ£G 6À"€&(Þ!CþùçŸW¯^Mœ8±²²rÇŽÝ»wß´iÓ¯_¿]5„Ä-r hM ‚æÂÒÒòƯ^½š0aBeeå¶mÛºwï¾yóæ²²2EW КA ÍËСCoÞ¼ùâÅ {{{:¾uëÖîÝ»ûùùA84„ 96lØíÛ·ÿøãŠŠŠ   ƒòòrE× Ð A Í×ðáÃïܹóüùóqãÆ94xŽ4w#FŒ¸{÷.ƒÁPT`° ­´AË ®®®è*Z'„Ú4„Ú4„Ú4„ÔËкA ЦA ЦA ЦA ЦA  0X€Ö !€6Mt®ÑÊÊʽ{÷*¤*4Ooß¾E]¿~=??_Ñu ¹ÐÐÐX½zµ¢k!¢}>½{÷n5o€ÜUVVž?¾uü4ôðð³ú„†††¿¿Ó×@‹PPPpþüyE×Bnà!€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6 !€6MÌz„$c0ÑÑÑŠ*ÝÆÆ¦OŸ>Š*½õ@ÃÛÛ›Á`(º­Ð¾}ûÔÕÕå˜aYYÙ²eËä˜a½¸¹¹ÙÙÙ)ªt ***¼½½çÏŸßôE'$$H$„r¤ø@?¬¤×š®Õ©S§6mÚ$߯làíí½cÇù^U&“yûöíððp9æ)¥cÇŽeee5Ï@ˆÒÒÒ:räHÓ—ëááÑô…¶nŠ„ðÃJz­ìZ-\¸PWWWŽ‚õë×7F¶ªªªóæÍkŒœ%{ôèQÓ Ú ÅB?¬ê®ÈŒЦA ”N÷÷÷ß³g¢+@žšE×h3WYY¹ÿþ}ûö•••ihh,[¶LUUUÑ• Ð"”„Á`ìÚµ«{÷î›7o.++3fÌíÛ·! @k-Bñ˜LæáÇwíÚõãÇ„­­m``à¨Q£]/rP›ÍŽŒŒÜ±cGaa!BhøðácÇŽUt½4 „ÿ‡ÃáDEEmÛ¶-//!4dÈÀÀÀ &(º^B„âñx§NÚºuëׯ_BܲeË”)SH$’¢« qµõ@ˆaØéÓ§³²²Bæææ3gÎ ÅçóKKK›ü ýŸˆˆˆ›7oÊå½,\¸Po„µÝ@(233¯_¿^TT„¢R©***nnn...b¿¾]e„222RTÑIIIIIIrɪ¤¤D.ù@õÝ@øëׯââbâY TVVJ>…¬hl6ûßÿmük#Þ’%Kþøã¹¼---ÎÂÚn lß¾½µµµ³³s~~~ddduu5‰D;v¬¥¥¥Ø¯oEWXZZ*ªôAƒMŸ>]Q¥@#Qü—»biii…„„dgg¯]»V]]ýÞ½{cÇŽ={vrr²šššŠŠ FSRRjQZ½ÏŸ?w”UTT”l…¶Ý¡0}}ýàààuëÖ…„„CC÷oß:::æçç+º^ÈèéÓ§UUUŠ®E³3iÒ¤ 6È|k ÔT]]­g¯—.]*C,„@X7555//¯œœœ¬Y³¦sçΊ®²àp8 ,Ð××÷ööÆç‘¡´´´›7oîØ±£{÷î^^^ðKW.vïÞÝ£G¨¨(×d…:tˆD"-[¶ Ã0 Ö/_~ûömiN„@(-eeååË—oß¾]Ñ@Ft:}ðàÁL&3$$¤G^^^ø+m\Ÿ>}^¾|9eÊ”êêêÐÐP“Å‹çää(º^-ÛñãÇ¿}ûæêêÚ¿ÿ‹/*êŽÒË—/¥yBÚŠöíÛÇÅŽ{÷næÌ™, ÿÒ‡pˆ²²²ºvíÚ»wïy<Þ‘#GzõêµpáÂôôtEW­¥úúõktttÏž=ÓÓÓ‡ rëÖ­Æ+néÒ¥Øÿ þt„´-qqqÉÉɳfÍ"ÂáªU« ZXXÄÆÆ~úôiÑ¢E$éôéÓýúõsttLNNVtÕZ2™ü矦¦¦9r¤sçÎIII'N´µµMHHPtÕÄ€@@[4`À€K—.ááÍfïß¿‡Š®š‚™™™8qâË—/K–,¡Ñh/^üí·ß¦L™"e'F¥R=<<222öîÝÛ¡C‡„„[[Û‰'Êkú~y@@Û…‡ÃwïÞ988àá°gÏž+W®„phll|èС¬¬,ooo55µþùgøðácÇŽ}ôè‘¢«Öò¨¨¨x{{geemÙ²ESSóÖ­[C† qttl>=Ï0ÅmÝ€.^¼˜’’éáááãã£Àe¿ —Ëåñx|>ŸÇãÕܨ™>uêTkkë‹/^¿~ýÁƒ<1bÄÆ-,,õx<ÞË—/544¨ÿQRR¢þ¯ÚRh4š¢ª­¡¡áçç·lÙ²]»vŸúôé†çC£Ñ8‹Å:pà€gSâóù/_¾”ïÍ9ü{™B¡())"»57ø|þׯ_sssBJJJ‹-òððPÔªdJJJÆ 366æþ‡ÇãqÿWm)ÿMÀd2^“   †gÂf³8õ÷߯]»¶áÊ!hñf̘þæÓé«W¯¾~ýzii©½½ýž={´µµBIII‰‰‰eee***ÚÚÚªªª™™™D3>>~Μ9|>_¸•YYY¹}ûö¸¸¸ÜÜÜ.]ºL›6Í××·}ûöÄY¡¡¡;vì Óé¶¶¶‡êÑ£‡„²$×°!¨TjHHˆºº:‘‚ÿ\f—D"ñx¼gϞݸq£´´!4`À??¿aÆ :´“ Fsqq3fL½‚–„WʰžZiiippðÁƒ«««Édòüùózöì©ÀÛ¨ÊÊÊ...îîî²NÄHéÃgÍ”ÒÒÒÐÐÐ5kÖÈœ—Ë¥Óéø÷êêêíÚµSä‚wÂÏ^äççaM¨éK$¸»»GFF*¤hÙ´¦k¥««[ZZÚˆOo||k]Ÿºz©¨¨ð÷÷×ÔÔD‘H¤™3g~üø‘8Úf/ ®!oŸÅb9rÄÄÄÿ°uéÒeÿþý ?úñãG„P¿~ýXCü9Bÿ:_ùÿR'A lÎZÓµ’W D‘ÉäuëÖUVV‡ D~í)++ã‡æÍ›‡¢P(½zõš5kVdd$›ÍÎ0>>^xßÖÒÒêÝ»7‘?…BQWW¯ù2|—D"ÕY–„6„ WÄh|<âZÓ§NJ cçÎzzzø5™0a›7oD^Ó/‹0ÙÞ~eeåÞ½{‰X½zõ:~ü8ñGSH „®Qвa¶~ýúC‡M™2eäÈ‘x"‹ÅBwìØQäõçΛ;wî³gÏJJJãââ.]ºtçÎÉ¥ðù|6›MìêèèàEÔV¥:Ë’PÃ&ÃápNž<¹}ûöoß¾!„ÌÍÍýüüfÍš¥Èî)Ec³Ù‘‘‘Û·oÇçb5jÔÖ­[‰ÏÙ¯_¿<†÷º8pýúõ³fÍ¢P(Š®Bð!h¶nÝjbb2eÊ”ŒŒ <ÅÕÕ!V]]ýéÓ§… ý0ÆÆÆW®\Y³fMDD>9}JJŠpnNNN—/_¾|ù2BHUUOœŸöìÙž={â×ÄÂÂâêÕ«@òY­þ²H&ÍÛÏÎÎ^²d‰ŠŠ ~aííퟟïã㓞ž¾cÇŽõë×»¸¸?Ê š›Ž;öéÓ‡N§oÞ¼¾î ***»wïf±XýõWóê¬k±ÔÕÕoß¾M&“œœ|}}{÷î­èÕþ€ìÈdòÖ­[û÷ïÿýû÷¥K—ššš>|XxPI B Ä»1[™Æ“’’2gΈ‚ÂæÎ»hÑ"ˆ‚ò¢¦¦U\\|òäÉæBÐ$iÖ¬Yïß¿¿téÒ€Zt8¾µ&ÒÃÙštíÚUä™zÃäÉ“utt] iA  …‡ÃäääVmB -B O-B -H›~|âË—/ñññÛ·oWtE¤ÅçóXúúõëe»V;v,//ÇÃ!ñ …Ü«h5***.^¼Ø>}ú$ý‹Ût ÄiYC¸bx¯>u~~þ“'O&L˜ ÇŠZ™¼¼Ëf³I$’££ãæÍ›ûõë×H5´tZZZ³gÏ–WnR~Û´é@H£Ñôôôˆy›?¦ÀÒëu­òóówîÜyìØ1‹E&“çÌ™!P§Î;_¸p¡‰ mÓ4€–!€–!€– !h€–!ŸÏ777///‡h¹ ÙQ(Ÿääd€– !h___EWæЦA ЦA×(È‚Édž;w®éËÍÊʲ´´lúr[1„@a¼¼¼TTT]‹V…Á`4F¶åååžžž‘³d Íö_UUu„ 7nÜhú¢ LLLš¾ÜV¬YBøa%½Vs­BBBX,–3¡Áƒ«««Ë7Ommíùæ)¥ÁƒÛØØ(¤è:éèèDGG+º@>ᇕôZÓµZ°`sGMMÍÃÃCѵ )>Â+éÁµ´ $‰Ø¦R©±±±3fÌP`}j£ø@ UÂ0 _‘!”ð×_!„Db!ÇC)))2ÁãÍ¿ÿþ;gÎ"…N§ÿù矦¦¦ÆÆÆS§N¥ÓéÄ¡S§NõéÓ‡F£õíÛ÷Ê•+]ºtÁÓI$’p+SdWf4…:p¹\bwÍš5¾¾¾999yyy^^^kÖ¬ÁÓ#""nݺõÏ?ÿ0™ÌgÏžUVVVVVâ‡ðÆ%Ax—Tƒô#‰äUPP`ii™ŸŸ_ÿ÷ M>R]£5wµµµþüI¥RBl6ÛÀÀ ¬¬ !dddôéÓ'úf(hh xØ#|Ã0"ž‘ÉdüÆaø|¾\*@£KLL´´´Œ%R¦OŸþèÑ#|ûæÍ›3gÎÄ·wïÞ½jÕ*ƒaXqqqttôŸþIœE¥R/_¾ÌårñÑ7 £F4 üFþoÍÇ'öìÙcoo?kÖ,‰Ô§OŸ;wîàéóæÍ#‘HÆ ËÊÊÒÓÓ›5kVXXqVllìœ9s”••'Mš´gÏžóçÏ7¼wî¨yE Ãð0rÿ)hP ‰¤©©©èZÀ=BhÉäõ,][ðÿÀç ´zzzzÄSV ÅÕÕµyÞ177ïׯ_ôòåËqãÆµk×ÎÀÀ`ñâÅ7n4hP”[/Mv5Ú,¹Bø<5*øþrQZZŠo`véÒ¥¨¨(SSSÅVI¬OŸ>¥¦¦6v) ¶¶¶ïß¿?{ölNNŽŸŸ“ÉLNNnìrëKòÕ~ðÈ’ŸŸodd„ÕÓÓ§O©Tj‡._¾\]]ŸŸïåå%’ssPóý¶ DåãããBªªªŠ®‘-ú ·ÂÿG"ÿ_nnnúúúJJJ;wvuu-++Ãåå幸¸Éd*•ŠBººººººÂ™ˆìJÈðíÛ·S¦LÑÓÓ#“ÉjjjFFF&&&ø¡®]» AõêÕ«‘.…••BèúõëDŠ@ 077Ç·étº¯¯¯©©©²²rÏž=W¯^ýóçOá÷ª¯¯¯ªªjooŸ••%ùä«Áårƒ‚‚LLL¨Tª±±ñéÓ§ TçÕ Š«ùG'CåëE¶HÑ<¹»»Ë'ÂçIæÏ“ôàû Èñ444ˆCK–,A]»vÉd>|ø!dgg‡RUUEÅÇÇÇÇÇ«©©Iø4 ïJȰC‡¡û÷ï³X¬K—.éèèôïß_l&Ÿè™Åb‰=êèèH&“>Ì`0Ž?N&“ÇŒ#\½µk×Òéô„„„ÐàÁƒë<$áj¬[·!TYY‰aØ–-[j»¤5‰=*[å¥P ø<Éüy’|¹ ~©ÉäuëÖá)8ô¿”••…Ï·‰_T5‰ìJÈpÞ¼y! …Ò«W¯Y³fEFF²Ùl±™4|L€@ {TKK«wïÞÄ.…BQWW[=ôßD_’I¸ø/K.—‹ï&%%õìÙS8“ú~qÉVyéA üíÝ_HSïðg;S™Î?sµÔñ5ÿ$›‘aT^ä…^4%•è!Ó4’dQxQY!FEA DQÅd]¤äÈÐnô¦-BÓ.´Bü“Zþmk¿‹‡ßá4uº³3÷ç¼_²sžóœóì³ÇóÙÎÙžg èO.¡ýió¸'‹óø‚{.^¼×ÓÓÃ%$$BÆÇÇ=ÔryÓ‘<ìÐårY,“ÉIJlnn.!¤¤¤dÍøO~~>!d``€[Ó××§×ëéc•JõßÿqEZ­V¥R­Ù<ߣC¡c©¬&àÄ%¬ñ›‡D¸ô§ wî;œ¿@Ükäp8víÚ•088H‹ššš!ÍÍÍóóó6›­ºº:33“y¸´ššJ±Ùlõõõü";Ôét,ËŽ///wuuBRSS¹Fr‡›mkkã¿QwwwTTT^^Þû÷ï———?~ü˜——wãÆ ZzìØ1†a|øPPP°Éh¬ùO'¬ñ›‡D¸ô§õª‹ç/ðw3811ÑårÑW[t8---:ŽaµZ]TTÔÞÞN+ޱ,ëv³™Y­V½^UZZÚÛÛ»Éòg˜Óh4•••6›k'=Ã0IIIF£Ñb±ø) ýýýGŽIII£¥›¢IDATQ(z½þñãÇ\ѯ_¿L&SfffdddVVÖ¥K—~ÿþ½:†üEEž£±´´táÂ…ôôtzÍ©°°ðùó瞣Áÿf‡HX㽊áÚП„õ§MÂù ‚ ¿#…Y"ÄX£ÒBïæò_qБ$.¨2…V«œœ\ó€wèØÜãÀ6ÂÏâ⢷U¸a"C"” œ¿@SSSÜ5%ßO@ t`¬[·nÅÆÆöööZ­Ö¸¸¸ŽŽnƒ‰‰‰½{÷FGGÇÇÇ×ÖÖÎÏÏó+>}útçÎ ÃDFFrµÒÒÒ¸™ž8Ú†D(8@qÒ=zTQQqÿþý‡=z”ÛàܹswîÜq:UUUgÏžåWììì|óæÓé¤óÒ¢±±1ZÊ¿ç' m¸GÞ–)¸te2ÙŸ? N]•JÅ} ¤‹tªB~ÅÍ,z ÷ èxd|ÙÙÙüv\ÜH„xF£ñÞ½{£££‡ctt”eÙMVŒˆˆ w gff:;;ÏŸ?ïí¡‘Àï¸oµðù._¾üãÇ‚‚‚øøø††“Éä¡"ÿK1ô®¡\.×ëõÏž=«©©ñºm÷Àá”)p¤‰$ ‰@º†††*++ãââââ⪪ª¾|ù²ÉŠƒA¯×‹ØÑwèWˆ[˜qÿki4šééin111ѯ¿û6 .—Ën·ûï[¡>þ¼ÿ~­V;00@9tèPaaa___NNΆuEõC¨;!ná‰ÿÓ€)¾ºI¡~ -ƒÐWÊÊÊ!¯_¿¦‹¯^½"„”——»x³Ð"·ÅŒŒ þ $''Çm3³Ù!—ËkjjèØÂvœ7Wd ‰9 “XVŸd¹×þöíÛÉÉÉJ¥²´´txxØšÈ:ðŠJ¥"¼Y¬é ±±±tÑ­;y^t[M§À$„(•J_v„7Wd …F"äVšL¦¹¹¹žžBÈîÝ»ùE!Ôü¡¯ÐúÂÂ]¤'t•JE}9¡›ÍæÕ›…M§BÜ\A)DTWWJ_–imm=pà!„^ç|X¥RÅÆÆVTT qEV«U¯×GEE•––öööÒ>˜˜HKÇÆÆX–e&))Éh4Z,ºžnÆÝxfY–Þx¼Ãà„¸>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø9þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É…®f©\9 5R0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJÕæ”,U •µ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·oZvX³nõK¸°áÈ+^̸±ãÇ#KÎ Øëàɘ3kÞ̹³çÏ C‹n[¹ëåѨS«^ͺµë×°ï–Ì5¶íÛ¸sëÞÍ»·ÚÙ,OûN¼¸ñãȓ׾R¸òçУKŸN]4s­µ«kßν»÷ï¿þϾ¼ùóèÓï¾Þ’¼ú÷ðãËŸ¯˜½súøóëßϬ}÷ý(à€r÷_j „¡à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âƒ\Àv j¼âÇŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”6rC†‹â5àg Æ—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öéçŸbZsåk/ŽÖ% ˆ&ªè¢Œ6êè£F*餔Â)(––méÙ¡•vêé§ †*ꨤ–jj ƒºV¨hœžêê«þ°Æ*무Ö:祄f‰]j­Úêë¯À+ì°Äº‰«ªº¶Ç«—§ ãª,øRì´ÔVk-µÇ¶¶jh½"à ,”Š£§”)ž'°€*hèɵðÆ+AfËÚ¶ µ á|‰‡³¾»¨ÀîÒkðÁ'¬§½«áË%³`¬¢F˜~|IÉ+,À`Á—&$Á+9 À±Ç ‹ F9%´Ò, €é +»ðå)ذ`s#_~í˜g¼1rš‰²Ê,ƒqŠ7¤ÌÌôÉ)¯Ü2˜E+lõÕXgͰjo q dFÒ˜›œ Fûœ,˜h«ýå(x€)Ê`\É—çÐBuþ™U‹M¶Ùm—³6šUÃ-7ݪÀñ%)¼÷—sïõä”WïÖ©uÝY«2銘`ƒAðè’Sc³Í®\Æç`öûeÕ’ƒÉ:˜¡“N8˜í€aú驃ñOÓ`”ÂÇ—»£®úë–'¯üòµbŽšæœµÊÂ;žƒŽüõ¢K ™³‹ ;ö_vFí±›IðçÛ“hÀfúd~Ïüüôשó£A¿Y«õÀÐ.óÈÁ;$Á ²I{¶ËFq¼0mg`@ƒ.ìð¥¸Î{b" H40½` S":Ñ€‰|³Ÿ WÈBDáÏ:ɺÏÃÂÔ¬‚«ˆÇ—,€±Wü,þؘ S€ˆB$¢ÃñX¬à¨X8BÑ‚VÐÂ`rD,V€‚ä.ê²YÀÄCøðKHbÍ”®šÙl``¢¡X±/õ€a’ã£xÄ0²@- ¤ i¬Ti+†šÚÄÉÈF:ò‘dzahô§™^Aò’˜Ì$ý$ JfÆ’š ¥(Gy0N~Æ“˜%)WÉÊVË”žAådTi+3œã–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4ƒYŽaÁ²3²” -ku|Üá›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøþ̧>ω.XÓ÷B䲈u†l ã M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HJ ëšœÉfd¶I«‚Žô¥0©LgJÓšÚô¦8Í)FKúOL™&‘Ñ[$°\ªÓ¢õ¨HMªR—ÊÔ‘òô¤m˜@a$Ô_µ©XͪV·ÊÕ®z•¡O J7£RȰtVWýªZ×ÊÖ¶ºõ­ ë+£Êµ©ªª¾J+\÷Ê×¾úõ¯N5©Xéš9»² ¯¶Ò+`‡Q‰RÔ`±¬dá*×_U3e}ÌYe¥Ø~LÃðƒ5>0Œ”¢Ö8ícM‹ZÕS(þE L %8¥˜ ˜ ÒRLö·À .S+ë«Ëf&³ŽÙl¬; ß4=Åsê[éºÍ¥.BÏÚ‡:··Â ¯xÇ+SâÚʸ˜Anc” +æ~»›˜î040Œø^÷ ôÍ.BOÑï48Å T!ˆa€B8è `8¡þ%¯„'Lቚ·y„}ža¹…Xnt¡58m)v Pì–X¡ß}Äú«Px¡šhÇ0H`…ƒfCu1Œe¬Ý ûøÇ@Æ…i…Þɨ—1ì}•{jbùž8¡!.)ÑïJaMq)Pá€aœ#ÁÃðÄ8šes¡²þš×<Ù!ϪȒ9òb’ìª%;ùÎLFqE¿‹ŠÒ6tL`‚ z‡¦™ÍˆNô^Ý,+8GFΊ¡ó©ì|ß„69ÏÞsž9Ðå…ò¡”ÐB9ÝÐC+úÔ¨î*£cåhÈ@:1’6•b=ñÙÐZ£`xmk×Pܦ–ׯ- –QÜÆö´$&ÂTA PTÀ ¥…,ªlf;Ú"Èíió›ên{{¸‚«Oi3Ða1÷ÛèN·º#ºjXµú1¯FL¬Kuîu§Ú Ͱ·¾ÚîW½Û1ñ>̼IUï}û˜rÀ€*Š |äa s€;°A‹N$‚·ïv¿]õïÆÜ0UÁþ3>^#@{ ÆcdeÝdqatâÃo‚6vÎóžûüç@ºÐ‡Nô¢ýèHOzϧ¡ÐŸªãŒùxaB.ª‘“<¸Í(>†`˜…p…;jˆ·’ùH»Ú×Îö¶»ýíp»ÜçN÷ºÛýîi‡GêtSA}1R' ÕCeõ«K¶˜Ã)ªÁ [˜G[É+Xþò˜Ï¼æ7ÏùÎ{þó ½èGOz˳cïü·e3œ¿ ç«Ã-ŹáÅÛiL.4€@>€„µR¾ôÀ¾ð‡Oü៾éª/.ëa˜©r «ð³ÿ+!Öº ÁΈ†Zþ_üî{ÿûàýñùžüó.’®Ÿ¡¹eýß>b ݰ :Àm|•ûáÏ¿þ÷üñ§¾§¹Ò|TEPì×~‘•à@yA S€q\…ü8VàÕw¥òwõ‘~^C€ø[çÐá°¨^˜‚*X|(då‡aã6Î,Ð÷mE ð506€ Tö€•·‚B8„¥×‚H*˜çƒ*5hƒjUSP Y ­€*Á 1pb!]Á ]YP @H„fx†g„/Hdç×I¨H…‹… †ýÀ‡€i!^A ¢¶U(ˆ†‚H„j€È"€þw‡rèWÏ@Ðbг@ `X L "€ë ’ ± "PŠz°˜0 e8ˆ¬Hˆ¨wkøfmxJoTЏˆ|ÅÄàDÀ4` \ TÈ4€ ,Á‡YŒYáI°Š—W À÷oð Ï8wÔ8|РÚÈfhØHz…U1¨%38Tˆ‹nµ­ð$ 0Õ€Œ· $  pÇØÊÈRj^° X`ÓÍ H@†E…‚œà˜@Ø|Šëpyy‘PU@|á pé#Y’DØ‘‰þŽ¯è‚†xHˆxX·o *@Ð Z ¢ ›ð+a™Œ^au` ñüw@qàkæ0àÐ[€ U OÐÊpÄ?À 9` 3 °ð­À« ¨p¥@ # à ÐAxy0iydà¤@ú°šð}0Ð@–ç Áð—V ‚i™à ü,`–7Q0}ð`y\@æÐâ  é‘–‡™d ™œé™ i©¹š_€ Žn° ñ‘›Ù™Ÿiy‹Ù˜™“9¢—ŽƒµŽ»2€ë§“{U Ä0_1 §þ ¥0”³pö”, 4Ð߀ðê0ækàq@wüpQ}iyyf@Q0× sp üP ‚ª —  `y0+¹ÛПhÀÞ@×0 ðP–âà –G1Âá`? Š ÷Ypº¡ú¡!:¢–×}0$p¡‰àr é¡ *¢$º  ú jZ¡ÛМ3y„£’„ˆ±„}Ñ„Ÿò„Ô¹TÇàšì𤰠*á Ÿ h€#p  !p ž ¤(°|!Ð 0 *A!¶žðPþÅ€JÐ P0 V€Ûàá@flðr@v|ð P€‰°Œà 0 ` —šÀ|™y9âý pyn°ê ¬ð jà—°ÉŸ‘ÿ`ð`÷`þà¸ÿ`«—÷¯9ÆŠ¬Ê:­pyÀ¹éV“ÉZ÷ ¼ê«À*¬19zÎ)nøSíhUïø¥\u À qcð „Á  ð¬ÐT(Ø‘` V `—§}` ˜P Ú0 9®Ãª±p3À`ò P²% p€Að‰`þ I—G ¯Ù±²#k²';@—‡®»9«³`ð [±›±–é®U‹6‹±T‹û{hU¯öšUFаfà~!ò€eਠL…‚`‘°¬Vp M  (°,wP‘Pİ``y Jàs°@ ù`ª°”°“À í0à (po Ø@¢ À›ˆ«¸Œë¸+¹”‹ÐÐsk øà‘†p БР¹“Ûx«·|ë·€ ‚K¸TŠ|5P7Éa9™µZE²ÐµÐ†ìþ }‘mDÀ F0 ð¬°T(hA —7)€{Ð €` eÐö€ ‡€y¦úp$@‘‹Z}ÀŸ È Û êÀšC-`çÐêàú@á¿XÀLÀŽiÀV¨ÀaÀ ™ ²°ü@Áþ\Àî ¿òK¿ö‹¿ú›¼ä·¼RÕ¼¯÷¼Ð‹U© ql€P Øã Pð ä€PˆðJˆ­8MëŠÊ«ŽñJnÒù|X»ÃI¥p’‡PFð Ë`ƒ0 Ç   ÀxTPÅû— ‰@¡ €†ïºzЩ,YLƒþ[ÌÅF…à°PNÐXxPDe¤o0fG5Çtœ‚°Azü´6\W8¬~Z,ÈXµy`‘ 座`u1m@ û• U 3Øð “¼Ÿ•œËù·ÇÊ×Ç2ÔÓ)ÊK%à¯ðPH S rq —PC ÅÜ=p˺¼Í»ÌÉV|ˆòúÇî(ÌJE7K Åk` Nà40WðdKm½·Pá0»`T”ÌÍþ,“UüœW,ƒâL¯äœT–ð`5 +ð牿àSÀ Ëõ\‰ËÿÒ]Ãßl“ᜈÁ|þÐEÕúðeWQÕpÞÐ!> 4à öð/½Pv€ …’âo9ÕÏ"Ô›ÇËæçË@Uµ:¬Ò4µ Y°µÀ uº @ –ð¬À wЩ€ÝëPˆÐ EM, SH­ÔvmzÞ,ÐàŒÅ(ÊRS%U`[Eb0À "¥ð Àt@ØEÅuаGmõ°ÙœÝÙžýÙ Ú¢=Ú¤]Ú¦}Ú¨Ú›ýy ¯{MÐ} ÈS÷à}lLÕ …™k }7uÞÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÃÍt$þ­×&Í×8™Ò³=SJpÍUÚ% À ÙSV**XzZÊ\ê)^ZÞõ ‚}ÏLEk@ßµ öàÒðmSç]/R‹MT[IVËYÜß…-Æ|u øà/õß ’Þ†±Þ{ÑÞòÞ.QI’Z…W6QDPÐÝSþ)^®^)žâ•ðP U™€c•p/Fã"µâžÒâ„ñâyã”2ãB®PË0°bZU °\Q-ð¸MRDÞ)FîHŽJ>)Lžåµ ð”½XTPdîQ[^)]Þ_~a.)cžåXÀ¿þ½Uˆ€QfoÞQqN)sÎunw)yÞä§3ÀUÙ°u äû烮Q…>)‡¾‰^‹)Nãã } ÉZE}†Q_°Ö0'0ë´^ë¶~븞뺾ë¼Þë¾þëÀìµnÔÿWÒÌ{Ò×í×™NQ.ƒö[D  ð2e£ÐØžíÚ¾íÜÞíÞþíàîâ>îä^îæŽíuÐÚ|<ÐìXÐyuàËŽPhÐy ]\ Q eá!eípן†êÞËì±=Îñ.Q0¦ÆT=ÆUâ1ðŸñ™ÇÔ0xð~œð½ðu}€þöÞUÀÐu þþQ¯ñ2ÏñlèÔóúî"QWnâEñR>R1/óOó²hóîžXð¾ì^Àúä\õ ¿Q¹)RA/ôOôQkô ó9ßP&«ðU e]ðRWõv­õ¬à)5àŸTàË•ôƒ> wàhðUtpåÆKÀöïöY_ðMíñ¿ ‡Øýõ@ ¶0aJ°àæV_ø†ÿöˆßñ¯Ýî]ôޝPÉ ÐjåÒÝQ2ô˜ŸùI ÷î&÷dE÷©d÷í…÷dÎpjU öà€…öéô0ÿú°Ò²ïo´Y¶þ?K¸¯dºŸåqÝi^¥—R,¡pù«Ñ®É?„ËÏqÍ\ϯMÑ_gÓ/ätmðòâ%ð/ÙÕö˜×‘@¡û¿±ã/„ÁÎÊ0‚Ét“PáB† >„Q"Dkdf]ĘQãFŽ=~ù‘+ŽH…D™R¥J ¨&¾„SfÃ3Ù ÞÄ™SçNž=}þTèP¢Eo²ÂèR¦Ãhªs € V®aÁ’MË6.ݼ|NÌ82å̘9‡&šuíܼƒ“¦ºuë&€F€uxÑä@´<.° ˆ2§ÏVȘñ†Ÿ´t5}é3»=þZôhÒ¥; ÄypæjÖ­ÁT\[öì#Kž¤[·Æ–®}ÿŽX3êpâÅ/ _ŸmÈL%y£ÀÕ­_Çž½º½¹ ¿Uݻ{#ӤΠ™F(¼â.€2" —MU.iÛÀ4$°@ÑP»I5à\¶Ý„#Û62)B WêA }î9?1Dœ(@‹ƒ 䔀€6Ð9Ü2ÈCœ0Àù›.¸ÙB›,°¹Âš*¨™Bš( yâ yº-<»ö嚺 ˆÂúàk/9èZ5ÔXCaXùD ÏD3MÐ,HÁ ß”ÉÁ çŒþmB*¤3OŽ2„³Ï—:<1PAj  4QŸŽ ãÌa24'ëšÔ 8ð â‘DLÉ’/ºÂûfD0)E›)°P3UU dÓ „ü„•"‹ô¤U$’(Ä­VZùŒµ×…U4XaC¤€4ŽV()Ny. àA¢8HGKÀ¼  «kÀv|Aá†7`Áº±‚IàŽ"©€˜=ÀXµ^{×(ÁW}åWN]ÿ½ÈÎŒð˜N^ùíØdf¸)T¡áŸð`æ¹dœYWÚH=û&ŽêÈ¡ËëÔ‘²uúgZ¹G:€@¬)£{9ä^wnu7þŽÕß‚k#‚‡¶ð` ýTXb§ŸÞI‰qËz'(ìp.™a$`w;l±ñMmߥýé<‹¾èhµTúì7›®ºn§ b»O<¥‘hòà ⦻pÃïíùg¹ßLûí ÙžÅmÇs‹{qéÞ;sao Jó‚V Ã¹%ÖF,|ãÃWg}ÀÄͶ\ÃÆ'‡rÉi—­òØÃÜsßOœf}ªù›s>4€'Ro½yçI{}wÆgÅýñ[ï̵úÙt—¾µÞßC®o ##Cëa>±²…á>~ù­ˆ¾{gמ6Û³ÏC—쿜MÂ7@ àqþf°‚ü#0UxŸêæ7AÃÕ€¿Á_ÿêt½ñOƒ(áÞcò½–p)XðÇ”ð;CÀ95 Þ0ŠáŒ!‚Äáê,(ÂÖdðƒ)ÙßýÇCÞ Ð„GN ði"!*E`ÚøåЊ`Û!gâC!‚$ˆ]áÿ´È"ÑŒ‹"ÀG) 'F†ã *JðŠwLUÇ.‚±#_ôãGB¸Ç‡”ñŒ‡ÄI6R¸ ðÃ9IÄMˆ€„¡ŽxÄd½ôHH‰ô1ä'÷$FNÂĈD%×f¾849°ˆÖMB˜ãD ŒðÃPÌ1†/ôÒ—¿f0…þ9LbÓ˜ÇDf2•¹Ì^ö!_m‚])#âIQŒƒFó`5/2Hi*䔨<¤/¾¾k¤áDíŒ&”€€X܃ È0OzÖÓž÷Äg>õ¹O~öÓŸÿh@ëy>}uó%Ô¬f(µ‰nô›àD"ôñ‡:|5Ž$Ì “1@ò°N-!:RWt"¥B:‹†vó¡$M #ªŽßIÁ¢ÇùB:nRŒ~ ÂùÃ"ᬦ#UœI‚ÒOªt¡-•æKzÑŽ¦¿3A%ŽS M„¤Y` Q‰iÌ 0ÇT‘M¥.„©tª6¡ZJ©ªUsD@J`þ üðP%ª£ Mp!#p€1ì Τ¶U!oõc\«9WNÖu±v+è‘Dà—ÅÉ)HGYúÁ›û@{ÆÆ:ö5Ô[©G$+JÊÒ²«uš'p‡yÌ‚  †ï’ñLâ1$ˆnùQhÀ­[ëXÈ‚q¶Ÿ¬íoÝ…]{ðÃEvч< KsrÆV‹uõYÀÝ#N·­Õíâu™Ý1n—¾ÁŠÀúP€Œd:ÕNp¢ùôA1 þ[Bû*¿BÔ¯ù«EÿNxP ðÇ¡dlµIPÃN,ñ4à""Ó‚‡ Xaþ“^ø‡ㆉØa‹È{ ×FœKGÍáÁ ÆiFÔ§ üáàÁðqÓÿŽÆµñqÜEóÇUö ò{|B6È ã¹*¸á8GîÉPÿðdÁ(ÏÈdžSÕÆ‚ºv©°-G¶,Ä.‹ðË`vÎ?X0®À¸ƒ…Â,¶€.xŽF%Ž€ò+•È(0˜;D=jR—ÚÔ§FuªU½jV·ÚÕ¯†5;â²ùù϶Õmp½MRÚ:!‡F´sŠqPP20üèÁüÑF^VýIþ€W|š3zÆ6Aë>û:!YÖà Xè ;ØÏ¡E`¨¡ëþÈ!sd`ƒq¬  ¡p•EÁµ³½oÒl»ÖÞþ6 w-¡k¶-›ríµ¯Í}î­ŽkPxFZÑ8 s(A°eX›ß¿»ímp÷OÜ$7Îðâ¸!0?Ø©þ‘¹CÀ8ÀôO²wPY(ùyÐ=#rh<àtÁ#wðÉ&ÜÖ+gyC ú"!TÊo¢]è_·ÑKjô’çïäL¹ý õ¦È"04 _&0•l°‚(H™¾õ v‹ÝglumÙµwöþ¥½{kgûRZ´…Rá Ãz` w¾ ÝïWî¦à«Gøü^zˆO€&ð?И?Ð+ЄÀðƒ€ °óP@ÏPƒ; †Iø„:hJñå»@€Ó<܉>Ü™>ËÁÌ @þ€+Á‰.4°$£`~ȃœû ¯½¸ƒXØtø©u@ Å` +PŽS oÀ+ð‹ðð / rЇ,È,0ºøW  o°~À=äC?DÀ Â0Œ6\ŒÆ°9ø|¨l€?8Lð~H0°YB’{¾]{BÚ‰ÂÅ™B*¼‰L€Œ 1 :â€A` i=˜†n08Ð8€ ЄO(Tp‡ä댽0…>0¾`÷€pàÍ…P…>ñ•ª†98~(/‡8 Nàƒº€mY„m°‚sLÇu,ò0ÄþJõh÷ˆmr°€ ©Ihx(KqpS”½±cÂTĵUœœV”›W„E‚˜" D¸·dQàDíÈŽ;€Æ'9ˆC\*±,Y‡½h€º|ÀG+˜”~8 ºè„<Ð3…#ð˜@´ \¡$JŸ€(™’*¹¾80º¸¾h‘븇9E_kBÚÑHÇáȳñÈ| 2 0èâHo˜;¢àpXƒ0À†' †…@ð„L¨€GXC†–\JMèƒ{Ø‹ÀMá”›ÔʺЀ>¨@©üAC°Ì>@  ‹k?ÈÌJáLþϤ‹ËD—J¹”LÙ¬ìLºÀ¾h8€ÜÌMzÑ™±´µ²œœ³|›´\šµ¤B,€7ð¹Õú‡%hŠw¨³¡ ÃÏp. `+øóð.prÙ xø„G0}`º¨–Ä–khx…H@=`R؃L°ƒvȺؠ˜GXÏö|O°mÙAn±oáÎq‘€msÀN˜¾à”˜†%ËŠü»ôNÇNµ!N 1ÎT³ H èâ ·dŠ¿éƒÕŠéôŒ°:+(ƒNä“A•i½“ñ@˜ ±‚qHt؃.è€lÈ„0þƒ>¸aÈÁº0…8Ї+ 2PR&uÒü «À +àÑ”Y+ˆ‡L|ƒ"à ,øqÈ h…üìMÅš?å—@µ¾$¿*†C +ˆƒåŠH…€[œQÅ,u©D@lãˆl¨ÖÁÔÀÃÈ@ãÔ‚ñT_UÞ€¶è €’\ "àšUø9Y%}ø‡lK‚+a†zðUÙ¨Sà£p‚0Ùa`–aÈ[GÙÛ¾%ˆ»†s@Z¢p‚3Xˆ1‚è(\³=ÛŽÚÑÊÚR ,Šy5 …¦@d‚ðHâ3>‘4æ¤5š6ž“'Ö8®²5÷Íœdð_¢0ƒû3Šs¨Ø›è’ äJWœå`M¾N Wöh€8H BÈaÙʼnx€ôÂe±dBÂä‚¡å¤yc¥òdÃWgH …¨PXŠbP†%»‰¬¨cþdÞ£e˜fŽ[^hö0™ú¬èºÖEŽ3€—í 4þh‡|Öç}æç~öçè€è&è‚6èƒÖg½%æXt†uvž°Hî„Z‡º, (€;¢ ‚Rˆ%pÓ:î‰4Ø‚+0é“Fé”Vé•fé–v闆阖陦é+ø FÅYö`\ƒè"gäp`„jâ>€ žX€€ŸH¦$ß+šÜÌûÝ”Úé@ëiåŸ6Š©¾jlˆ 0…¥øxâ çR Ÿxê¨Æ£©ÖÓªnª«Ž­¬v ‰þ/PNYÜÑuWfk¨vk›Åi²”k¸¢ë•²kïÙj®г¢‡‡½n 8# cô‰bYžÁ.l©>ìþßLìÈZì§zf“ÂkîbHê"1î^EŠ 0Õž qjÂþìùk5më*í÷K¿ÔŽ®äÉ]º„™cŠF€…¥H†æ‰ }ÏÞmÃVâœfâàn:ø#nÜ"‘þÃ-Kx£‡ ˜á.Þ‰¶®n êíKþíüÒîäîÇ†ì  ¸ž(äR8QøZÛœPG%"ƒeí \›iÝ^oçioe~o ‹oì:m‡¢ïúþ ÓfÜt¨hBÑb‚`ƒ+hŠmÈ^¢ø†#ŠSèœð Šðržð«ðýºp—Êp ï f€Ðá Õ]°dè„S8UÐE‚`þ„(Ð\€øål(©"7r$'=¨€€°òÐÚ§Ek‚Xèb Lï™'‚ñ—Ÿ#sþ‡†›ªçñ ¤­¾[#À€Hð‚‚Є)B„ (ˆ Л½M]‚ tCŸ"¨X (ˆ'ˆ$¢P‚÷‰Eð,ê†óç‘s-¢s]±óÝhl2Òó=Ç #ð}(e‚X^Uðoæ-T°¸ú}gG¿Û\g^^†x@RÀ(LG„æ ”GpVŸHØ"uÏxŒ<ЃŽÊƒ~@“°É±VÀaØ’Ê+u":u¢¹q ÃsºjuW/ˆoqþð‰»Ý‡V`¤¾â‚˜<½½t‚Ð÷›h6žbÚéÕ h˜¦€¬) >¨Û ‡jïŒùˆ„l؇kŒ4 HBÓèÆ pL l€½sç¡t§•T×U_î-<€$¨÷‚Pƒˆá‹Ã  Úa˜€!  8àH×ùç-ˆf@…‚Xÿ½Ì. RèªI;dP†%h‚$‰i †* ÿ”$tPER¤ J|C+à0”Ѿ0ûQ,E+€ÄÁ( ,˜”2P{K¼{IâÓk›{´·ûÀÀ{ ÈëFlöXžn÷Êzwx†Îb"ž…)(þ½žJ ‚ PR… €6XR(D¸ÛAp°€*ýÑ/ýJàÚTØh`R…Là³á‘ K ð (>• Œ;{©¼‡yмu‡„H‰¤‹l$Èp°‚‡tD~°þˆœH<€Ü‹{0ˆ‚1¸íßFôHuØ‹þø©þ‡4º(ôuV,hð ‚‚  kØL0'R¬hñ"ÆŒ7f´FfÈ"G’,iò$Ê”(Ù¹* €”ʘ2gΤ€Š#Μ:wZ<“Í!РB‡-jô(Ò¤J—2mê°€N•–šº” !«Z‹Yþ×t FõèÌ“ç]»ujЬY—Њ"r箃7wî=+¢øÐÀºüp÷n^¸F]#w®8@zùú<0.ãjÖ¨Æê“+v'ÆÜø-êÔ…Èó5ìØ`<Ò¬mû6I–.aâîí{¤MÙ‡kô©õ8òäÊ—#  ó U£­pB«BN‰hoꀣiÜ&ŒûàÀO€åACï |A%2˜€@)Émïþ—Yæ@6VÄ7_}ÆEžß,&¥h3ìý €ªö!B¬åq%–HÛo)ª’n$½´"Œ4g"ÂGŽþ9êˆ#+4‚#¥L!ÈŽõô£Õ+8…ÄT.à€xô d“(äc_ “p Œ<í €/(Üðdƒ 9D Š<4@—_†iE#P ÄÁž$6f™g¦‰§ž|ú™À%DR1{€Á¥—`¶ƒèž}‚¸©B Q¡ò„bŒ¥ÖÖâH/šºjI3Šú*N7î8+­µ&Å DÚº«RçXÑo0ÉTÎAWÔxo¥À|À`ñ‰8}Ì ( v¢Nâ @ VœÓ‚:þèól ÔZ‹m‚æÜ¥NcîÊE AÛvûm¸òÊ/ ֔ч=ÈbÅþ´Õ^›­ú/§œŠè‰°JŒ©¬Zlª"©z±Å®Nü1E²ò:2É8F€%+—Ê2#CS÷|qÁKQ6|3Î9ë¼sÎ?*ÈAWÌ1ѳdÒÆE—êqЋ¬2ÔQ7uXHmsa•%ŒLeDSx,°®ØÌ3Úi«½vj>qÓ­´ÅGƒ”4Ý+27¬O_ý7à¡?ÇΔPZMqqUÌÙl[~9æ » 7߯η©vÏ‚7è¿íÝy¨~¾ºÊRÐë¶"¡DS!ˆÐ j ÓSTž9ðÁ ¿9Ш‹úyé0ŠNzò¸nþ¼‰ªÇ>}­f  õGEÞTÍLÉ9LqÑÃd€9¿ ¿>ûi½ç5¿êò¼ÍïÛóð'}öýS‡Žà?¢ÌV)jE:4 ȃúÚ'Á nê}ú«òîç›úi7¹`ø7À§¨Ê*Q ZÅ-V)B<š²‰n0 `sHàdI‰‚>üáA,Âɯƒ+â o“¿!¾F„$|bS€UX( E)<0‚©L§d[[Šà!¦xB*ùÀÀC ²±"…“Á$žª%.²kòÁ8îï'Püãq,€-:%&ø¢tÁE«Œþã:Sí˜Â4%jtÈC¢$Ëž¤ ù›9æQ&H,¥L–(ÊXù®l •40•ìÐ!f† l†a¤Ã2hˆ%LaS (]lH2:qЍBWC1.¬ G”̲N‚mr³›Þü&8Ã)Îq’³œæ<':Ó‚x bÅ[娊ˆÊÛœrž)Q%<‹ÓÊWò)§HÓT(˜À!%ˆÆ0qˆ†,Ãl9æ08à‡h¢DqÂ.§ «-%=`Ê1T!XÀ€Dá„RªÒ•²´¥.})Lc*Ó™Ò´¦6½©J!Кwæ3'¤´çIê T“à³þ§qb?“ú(b*ÅŠÔˆP4@ùbC Ú„Rpµ¨PœÔ<@Õ¥[кµµ!­j…ªZ°V´¯Ýî«€tX… (()J¹†|ÃïœNp WÔ£!þ"We9 "\@¤En9¯LåÉ`Š ”´g08(€)Ðë×îz·"à-­xÇ[^½žWÃÙËq£c„°•S¨eRÈ@ ¬…`…‰ÙÊáOäÃw ±jGüÖç8vhzuáÌEb‘dJÂ7+êŘA‘“ºcÏFžã êi‘–Zï‘ËGåk–I¨?ƒ9 (ÅHá=© SÙÂ}—²‰'#%— ðƒ4ósË<ö±\\Z!•È„þ›PW–c*š`J;ÄÑf¥Ì D¡”Q”° Ô¦>5ªS­êU³ºÕ®~5¬c-ëY›º;þ53żüå’(ú®Œî©£-5*` €„ñ¬¾AÉ¥¤àÁDIª€,` ÚÖ¾6¶³­íms»ÛÞþ6¸Ã-îqcÀíü®¿«ë]¤×rýu>ƒ-l¨yàøã2ú`§”"ePû¾°ÆOœ}¡Lw—Ù½’0ßmÌA.3Â%"ïy— °ÆÍp‡È.Åm@sQ‰¥lã G±Ò0ð‚³ Å&Ã)ÄÈsR.«:øœ(y•Òɵ3¾gç~Oa¾n…ƒ$îóœ;ën÷Yà„#¼À䀄%„ )JpòR¦ø£0a ãHJœÂ.”Å7¾ö|¼¡;üöyZ•˜£æ7¯#DÐi„#ØBòp…Wh€4TÊœ“ mž(å(hRÖç…ö¶ÿ>jÚÎåÝ£²÷¥ü=ƒ/|-­á?’0‹[|ãxBØ”LãoÏù0xø  Aˆß¡Må™_¡ß©ßúE‡±Ø!°„D.0ƒ§E4øƒ¿!…ì›R ‚,…7þ¤'õ¦ ê*œÒ‚>àrD<ÕÅ"„„(üRRdƒ:TßP €0ˆ]ÂRd(Øì¡` à zù•Ò &Q ^Ð Ò`rL@Tö8‚ À ŽðA,Å"0…z±×PàB!îEÔµ »U¡]¡þd¡G%, a;ÜÂ4¨Ã<,ÅTŽžR@Êœ j€…\èÇ\¶Öæ‘vÂî¡UÐÌíPÜ3TÀR@Á$R8(Å?0CSÌÉ=8dÃ7”ƒÀ°ƒ„`øƒ L"%ÆaÄQÄ%ÒQ&jÐ&BOþ'z¢S`€Àu;`ÙRhÁ )…5èRT517ÆaÜA/D(ø*ØC8 „¼ÀôÁ´ÁXÁ;Æã<À5p@ðCœÂ7 „&|µDaXÁ@äAcˆã1JD2&Ñ2ÞO3Ï3B#S`×<€Ùá4À¬à<¬A|6PÃ$=œã@!2ÈÁsXÁ58C@>xHÂMæäNöd)´Á(X‚¤-Xä¨$\@D€RS:%T2dCÞÚC&åñÃŽÃ-ÄEÜEb¤RlxÀÅò-7àØ-%(¢b@h‰#¦þ$'A\øHÆ@„‚¦`ZaæÐ]üA7œ:tF €€ˆËc CdN¦U‘C>dDÑDÎOE¢ÎX’%RltÀ…Â¥-E5ü÷…¨CË E9¬Aô%Å%è1€7¶!LZ3Æ B`qæ@ȃ2lH6xÁ$”BHÃ58'tJ'uffnæ1vf}fó„fçŒ&i pÂ!‚[.…l€RèÁ6"$BSÌ|Ë>Üå[8@¨EÂ|>ø‚€ÃdÂ\‚3°€¨"( ü“+L;hÁÜA)H€ AÔ†j(‡þ¤v®wFœwjx&xò y–'Qœ§†É^R8ŽÌ¦0@~úfjÈ‹ $Œ\B;Ô<ø<ì@>XAi‘æC6„9ôA,A&ü¥¿ 2•þKÀ`鈒(Vr&îZŠ–ÎŠÆM‹º¨PÀè&4Eœ!RT"… Sü94~êg—2^%ŠÖ‰ÞϘ‚N™6Í™¢)P˜&jŽÐ9pS”ƒ?|¤Qd@*$Å1¸Ãó) €ànöföiíý©^êü jÞjÐ*¢6„Y¢åqÁÈ-Å3DRD%Åm6E]柂jÓ‰ê[‘jó˜*Ý *Ȩêªj$þz™×!Ç1ð*{j—C$m騯®°•°&±*±: ®ªŽH#5ŽÐTQ(uƒ=¬¥QLÂ7$Å$`£R¸ÀF:„2À­~굪]¶öÔ¶–N·Í·N ²"*(’3¬gQ =TÁ)p@TR(APRB!.Å:XWC̉ôj¿ã—vg˜~ÙÀMÁJÌÁ¢iŽ ’1D€ÄÂpƒ*4Ÿ DŽCF#v`÷ýæÈþпæSÀ‚NÊrÌÊöM¸Š+Žp¡öS`HЀ8Bà‚*ðBÿ)…%8VP¬¡È&­'--<5mÞ<íÅDþí«´¬‹Ú öPBRBˆ„$DA®:tARÀ0ÅÄkP(!-Û¶œÛ®ÜÒÜvLX"œÝ–gŽT*RP<ÔH9dªP`@ÞE1HÙq”`Ï*g¨íÖ®íÞ.îæ®îî.ïö®ïþ.ð¯ðºC‰"\å*Íå² ÝŠÊæ’fû½ß}ƒÑE€Á,ˆ!–ݯ„­Pð ÅÿÅ5dƒùž/ú¦¯ú®/û¶¯û¾/üƯüÎ/ýžïkæžžìx%ïª,oêL-ÕFñÁÌg©‚08˜Q`Á¦EüˆRÃB …ö½fÓ þZ¢þ†WWþ2ÏÃe¥Äð+Gç±ÿøBÙ"…Ø3dÂQ¨‚% <"Åœ Eìð®d0 n0ˆuðWúZæ¦[ó’%Þé]ÿ0=4ðQ ÅpÔr@Awâé°­ðð¨úðñVúo‰0k…Öqÿш­,Ô°Vˆ,… ”ëP˜Ú1Ë¡Ûqq¢y1å11FêÏùU1(@â Å2`€Œ ÜkR<Ò)ÏŠ«Ë+œGWrSXÆù&,—QðÁ EèC$ ÅdZ*Ê©(ëÈ%kk&KÝ&³['— Cc½Ý›ÿÄÀ(…þ ÝQP‚@5ìRXÀ \-çÈ-l.ÃÝ.ïZ/Ç/{"±›ÿ0ÁÌò ¬A³7<îP@›´M3ŽT3Ó^3ïeó—ms¹órDÚ¤õH˜Qh‚­Å @ïr€š¨…$´B/4C7´C?4DG´DO4EW´E_´B<¿­<—=“»Ö'ã3R¬Y,³N8aR$Ú2W†y`RèÁ$E ÅçìñÃä´Nï4O÷´Oÿ4PµP5QµQµ?ø³;ðñ ÿšŠ=ÛÈH“4sÀ8OÏ ñQA€B EÌ×QA(°QX½òkä~Ò (þ5ºeeSÍS/ÍãZ7{"ŠùOX#Ç9…xÞ…áØÚ¶õ½µPl4åv4~ôƒp^ï¡ÚfO+…¸jQ=tõEɱQ\ÃàÅ…aŸµ*¶1vÉš(dc¢dƒeHW¶ÊVµRO@ëQT€ E!èð$G HkR`q³µj³k‡–\¿¶2ƶÏöTS5Q­NOˆñ3¼^Ù!bQ @ #ÈÀl&gyVb'·-÷R7÷Vrån|ñ]›mÓàR5U‘-ƒN/3Ž •Z¥·z³{Ç5˜¾÷\ÅwÏ7—Õ÷þ“dÏ3dvPøA E%þloÀCœzoCPB8.I¡5ä88ä1µsK$t¿ƒó˜ƒ¯_,eÏ# öQt€' EàC@B —Q`“²ƒë*…5 yj›8¡¸c‹Ò\sL]ÇHTËFŒ Ÿ ]ìHBx#²9+,Â?¼<ÀBxlP¨AüuP”öQdÒ&%¹’¯7\§¸{#¸HD9ŒLylTùæIÑ3óÓ2rC|€Ä001Ä E?LRÐ:+Å®â!mœ[“ãñø­¸g¶8ͽx‡ñ¹Ý™ ÇŽœ´P(ÂZEœ€Hø:xªC8€™#ô$ÀTäP—W:j@b~¨´Aþ7„:€¯\zAdºŠÛù{:Õºw‰:Ö2PO2ÜApíP .„„!œÁ›;„ Rƒ /ÉE/£0ªF;At€¼#;A({3»Ñ8»ÜA{kI;ÎYöLO6ìr¬C€DŒÔxxQœOú¤ÝA¤ã:¶#üÅ: €\øJ Î…9Æ{ȃ>4Ÿìc?þc@º -ÀÃ@\+¾¸¾ï»‚s²¿›×tS·P¸ìðSsÈÃ,LˆQC  lyS¸¸ƒ*¬ °B ´‚+¼ À‚<œ£LÒdD(Æ;ˆ€¼þ‚ÚO‚$Â5Ä{`4Á\ÃPåQ&%0’ÃD0´øêÍ›lÎëüÉ·týq NáLÏ;hRXÀbÅpÀ`¬PhÀ? E2L›L9’£9¢F^îe_D¼»E¼ûëD¼_Š$Â*æ\0f¼¿Ã@Ø>föiá»öáã¹Þô<‰ý<ãÕDüá´Bˆ<}QX4l¯P A¼Â¬4ÃÀ<€4#0À(B"$"´Á9ç] ‚´þû×{ì³¾ü»r2çüÏ?ðÏy“óÑ“_ @°s5‹`ÁYHT¸aC‡!:¤€ LE‹1fÔ¸þ‘cGÏd6’dI“'Q¦T¹’eK—/aÆ”€™7qËÐ.'I' ¬ bså#=9» ³€pešuV FꀲH>àó妞5QdÕ¡B6F–<™2Fkd"fÖ¼™óB v=zóÄʧQ§®²gkׯaÇnÉ € Ù·]¶Ë·2BŒ•XZFk“ç;wÍàfhú´°9LXqŽ0›¬=üÈxÕ”¼<Ò<´ÐÇ@ö>²… ×'Î’LÒÇ Å÷ñç×/•±þcȪ p£ËH+ÐÀÌ>[(´,Ð4!Œ5Ü(¬ÐB Y ‘ {’–Bé`¥HQ‰€3Œhé(œH`p`¹ýh¬ÑÆqT¬?“‹ÐG lPHThÁ!‘ŒèÁ™¬lB¡ŒRJ•’›2&@†h)5zB–ÐP"'&HêA¬sLSÍ5ÙlÇ’zlRÎÈ‚LÒÎÍŠ4èÈ;ù,hÉ9ÝèI+ -” (ÅЖâ‘À5FÀX©œÝT2"ŠDpò$’¨€'•œjSÔQI½ïM’â TÕ‹êìÓUÏR0¡WûüsÕU]T×]eB€Xx퉀C*5 •(þ¸†%)VÀɈ$¬ ‰¨@³Ôk±%õÔ‘R½UÕVi¥5Ï‚ö I[½4×`Ùm·$<HÂÝ’"n%V"QI TÂb}*L‘$#dk³MXá·¦Ûtç×Ü>Ç%¨Ü‰Dâ&××c]½@œ‡!'ҕ̰÷&3Ø9f%U>”©™)ª!©›çøa)Ô…yޘI‰1¶³âƒf-ZH…ö±c’¡–Òô9Øã¬Æ)l²&“ÈTI rœ¸iJ¢ã¹*tfÎç·áv³1ÿkºI¢•òè‹ó&i»|:êÁ/D‘?‰‚T’à“pAÁŒaþ2Ѥ%1qêºç^h;îÏãºnÀ}Ä»o"c52éÓ¤ˆt&O\öؘ ÷!„¥ Q©.L²Å…8lG••^&?X8 ’çBñôéyýõMg½À½W×^´¿¯G-öÙÉïIñØWBó“¤èz¤ Ùe‘.¦hä듬XƒË˜ˆp†˜•„Ï™€ô¨—@lY/|Êž÷DÃ=úÍu âÊ—AØŒðˆ’’f¬dœ8‰ AäCm`ÀI–¡œ¼¯$s@tfì‡=ôáD!‘ˆE4⑘DcÌ N£³`j8A<¥NOÝ“þbfÀ÷DÉŒOƒ]l % “Áx0%¼(ÇIH‚ÜBØ8cI´€“Q%3xXÒ‚ì‘}ôãHA’…4ä!™È=þÃ?Zf®x F²4t¤ø0èEMÆÄ¸Á¼Ša ù™·‹É'.@"ð"A) Ä!™ÔeCIžcËMî2&A»¤d¢HɇLR˜J²ä/)ÃE^ò’ °Æ¼ÆŽ–Œr$ áI2ÑYlc ¢IŠáŽ"à$Ž)Þ°LuºÄ—ÈôH0‹ÉbÆS"Çtgd”¹N/:ô˜p¨1а$Õ€Ç3PBQìCBÉþ2df­ˆ‚>1Š’vÞs@¤'gæùÑ…d‘£ÉgF3¸(kv.€DJºÁ/”@Âi¸JÌ ŠsÈä (‰úaWBá9¾AéQ7ZRËxT¤¢"¹¬ØT‚T©«ÉäQ—é Ü´]èÇJHñ›Pb IA‰1â€Ð˜¤£kxìñšÀ(¸€¬ª3©U­<¥R©NÕž~ÍÈI÷š8b0¥]GøêMØ •„C¯)ñD]B/œ *¥Ç[AûV|”3±šì«_ÛTÁ–ªUEli£V»<Ð1Xd¸&JúaV4z %ÀCJޱ—ÁdìˆJþFäbë€4`]ü±¢gPÀ%%0= ,RsTÁ+æ•P(¨àÕ#šwZ %ÿ= :œ’L4ÁÈ'y|¡Ú -%°Ä•±œe-o™Ë]öò—Áf1™ÌeÆ2D›hØŽ¼8ž1þèŒïYcë*˜Ä,ⱇ?¼wQJЭ“ÿþg’d´A—%‰‡9R²Ž,¼ñ%Kœ@?T£ ‡À¦ª €Óöô§AjQšÔ¥6õ©QjU£àÑJ³š;:X§‚&ªÝ-,¬­:çòu|Þæ;/kи)ù„R²o$Ù$^[KVà‚ƒÇ/•Û˜íQ±ÃÕ¨r"®ÿÊTY7ÄÍô„³;å¬kBݬ µ(HË»(lüÙ$ ¦"’œa“Í—ƒF¾\ró8~€@m/|Mܦ¸3Âæb–;žçFfºÕ=%ªÀÀ »X"\¨dÜAß.‰Ç¨¹]RàXà ‚&2ý’gˆ"&Ø@?Þñþ|Aá ÷ùþjˆ[Dâ¤x1-þKŒgà%bÎ$À¾F"`&Ñ$ ¡\C`”Ñ¥"*àú $CÀm:¡ ¯QT²1·‚º‚¾1|ÂQ]C«€ú åp$–åLB O%"AW"žÙ\"€\B ¢AøQ*.À  jbžã)¼!þ€ ƒ ô *þ@0&R?ñûB Ò{Ò{"òz&’"{b†ÏP‚@–^"z%V fLBÐáìR¢:ï5´ŠbÀz`”! °ÁÌæ ÞêÒ ²¼ ̬ D &ä@2’«`¶ Ï€"`Ü ¬`fÀ>03)Qo))ðžžR{¢R{¦òuªÒ*q‚ °ÎPXAyLB6\Ä$ö¡ $Ì$Ü úX‚Òàÿr ô'AõÚÀúÒ`È þÀ¬€ Ýà:R;݆ å*` ­@Ê¡@®4ñc!ñ®4Yçþ4Y'5Ig5YS&°à% ¥Øa^ PÐ$z“%žABR&Þ°aaè Ì °@ –!k–Q0”!´R@;³“ ™D£BD¹*PFÀ/Õ34Nçpáótäpè³>c";x®P°€ÑJ‚ Ç$ àdzTÇà@GÂÒà^à Š@ b"C£¢  &à*` â` :á " ÆS¹(Àæ—$¡º.À ¢`ìaW1ØsèÜótb´ofÔnjÔF_ÂŽÀP¡s^Bìà$^à¥LbL %  6ò&0ÀTþ`%£)§ƒ¬ žƒªã:²ÃP*LA(¯€äa<¡p’¬à(ïOEsÕlOû¦OóæO›&Pµ%2ì±P €OÂÐ0 Gà$ŽÔê#YŒÀ s¬F`Q÷±VM/O!NWó†W•ÆW…Xƒu%!^Ü¥æ R]‚JÀH‡ìásbÞ`r˜€ò€^MBJ½UÀ•õ^”ɵhÌucÐ5]S úHoJá¨à>ò t$ @FLâ’%³àG[ƒìªT&v`©§`Ãï`ý.a1fa!¦a%:Å”¦Äî`‡avà$þ@Áø'ØN ØP&ŠáÒn$2 QT¶/Yös\–avïdvbh6]löfM¢Î*P  P–õHsô§šv$np$ˆ G‚ºÀ5.ή@†6uj}®jsõjÇ-kÍek½¥k½–$¨X‚Å Ô¡k¸ÐñN"ZÆ$ÒÁˆ"ì!ùnâÑ”@~¦em]beù6nüÖ°ÄUi7\÷V ÷pÑJþáN¢Á$6@>2 ò$ठ¸z ¼aŽÊà&DwtߦtQ pe-uieuqe]WJxL ¬d•%pØJB>É%Jaº!þ ÐAosâzÇÉœWj¡·g¤7»¨w°¬÷U°WUZ×uÏÇc¥ð•»`bUÂó¢Á¨éâa‚¡”6câ Í$`dê÷~³-l«‘fÿ7PøpEw…¨ ‘¢u$BAIOÂæTˆÌ‘b¢Î`rRâ `÷Öƒ„]L„U‹„ùÆÖš RØkݧd$ë$x” .³$ˆ@n—Ñr$Ö "˜!¬µ%®áqK"èC?O" ž@ìøŽñ8õxù¸ýø9y YöàV›òt‹¦]å„ÕE{·JÂÉð¤þdá$J @Á$š¡¼8|OÂX ¼€ÖÀȲ%˜ T%h'êah¹–mù–q9—uy—y¹—}ù—9˜…¹–›l4ÝI‘1†‘k%Õlнv-ø/JÀ }Jâæ@U– ÃLAÒAÎf¸%`°9n©0’k WM—‰·Ë‰OQƘٰœùfÁ(È åÂ’$ÀÀQJÂ8¸$ø S”! $ÁgI ¾‰%œÃˆÕyQŒ™yb”™OyNêÙaÕv¥ÄxÔmK‚"µ$fÀŸt%àœQ¢Ú€|Yb.MŽ#ÚB&ú—*Ú\.úNþ2ZN6:]‰Àp„˜C¾ ¤Ý1l±$–á}ÞÑTBd:&¶ÁER;nzWrú’v:\zÚN~šc 9«+TšC¡k²f”ì$N‰>rcav & F®ÉÚJ¶Ú‘ºZ\àÙ„çÙ¯‚:]_Ù År$X#GâÜ :L>á&! Úv%Œ ÷:JúZ‹þúU¾:IÂv2É T{µY»µ]ûµa;¶e{¶i»¶mû¶q{µ-&°àèAqC¶.%6ÛZÿH¢PA_‚ÀY‚Lˆ ƒ§²à³ %´Ÿh´]¥´Ïe°]+“òÀÄ{¼É»¼Íûþ¼Ñ;½Õ{½Ù»½Ýû½áÛ΀q‚&|ØB8 ²ŒHÂHMŠM&²á ˆÓ%<±¬›¯ÙyzGQž›OûG%쉧'èû&@E9d¼—$ì@Ê·k" ¨‡*õ¾@ºYBB'¢D\ÁÙ ìÁý.¼+ÜÂ?ÃsB”PÞY‡aÔ῜` Æ$@·$Áb¢ÖÑ>ý¡g{â Æ`˹¼Ë½üËÁ<ÌÅ|ÌɼÌÍüÌÑ<͹<Z”!mÆp|ït\BxÜÇAÈ3ç `©)„°›ïî²PH¢²6ðÀZY&ž¬Z# þ $}Ò)½Ò-ýÒ1=Ó5}Ó9½Ó=ýÓA=‚·ÍÛóÍÛ,ÎÇmÎ!dÂ{ÜÎßÏqÂÒ¹B¼ª9Ò„œ$DàSL"*ì%2 î'ìÈÈqây]ýZ!…®ÔœïdE°£˜Õ“n`ý&p ,ä0ëx$è€Jâ¨L³Ñv鋼noB êÀƺçª}a–ÔõÔÔ'ÕeMÕ/¨$(|Þ}æÚe ôaØýBÂá¾]€%IBÄ}Ô`SR¸UB†àlo¢+˜Á5àÛ¤Þ›ýÞŸ]!¸{Hø=@¨ÝãFàe€$e£r%ðàëFb@u”þÝöøÜ$êáì䀰À¦U"Ú2ãíWå×äïÎEGÞ J~i¼û»ê\é†åcg B‚@ƇA 69%0ᛆþ$Vp$hÂæèa¹]c³é­^a˜þé "ê3fê¬êëþZ°ž·¯Ü¹_£HOðyÒ6¬á`”€È4ÌæM‚ àajÀæÁ ¨Ù5þaÈé>ð±åî™2ïõžïää$åEŸT&Œ}pƒ® G¿2Œ ¸$¾$¶a+SÂFvà ä!³sb.x+ô[ŸTH»-H»)FßYËïi ð›¿M^ÿ%ÀHqeƒŽrKbþØM‚Æy¶@Ä€« /¶à×]£‹ø5:>û÷ãù\õ~琢›’õŠÀ <ˆ0¡Â…¯múÒGÝWVì`Ã7& 2,¤È‘$K†Äâ,[ŽDäBd¾!‰\é*^Èc,×¹Dd–P'â¸<:€,H›¦Ñ¸PÆ©¡v¼Š5«Ö­ A#I¦ ˜±dËš=‹6­ÚµlÕZ##4®Ü¹tëÚ½‹7o^v®ê ¥7°àÁƒ) j‹8±âÅgÏd™G ×É” ž’7áž„7¬l[4"cåÑ?6=J À‚Ó¬ˆÔ"¤e"­¨[6ŒQLþ’ ´ýQHn·6zX·L “ñ–OJ­ºhÒÔ«[/è¬XÆÜ»{K8¼øñtùúL>½ú¹†½»Ø1dÉ×ë#<ÇoÒÀM$Jµš‰7ü¤Á‚ Å}|ä0ÃüHS€ô€«T¥Ê(è & ™¶\I‘@S‰-ù6Ò3!=ÁHV„$½³†.•ƒN.³$SÈ)ÞÌ¡‚Š#%ãfIRs#€Æ‰pð€‘=Óá‡}„(P€h_™Öe7RXð­É&Yà­gœq™G×_rÞIX{mîùž|"Eff VÀ;ý'Ð(ð”` þâ8#@@Á+ü„“elÉðdŽÊ!JFœ@(¨ÒÇ }ô„3Ì(sDCŒ/¼è‚‹-´Ì C 0¼àB ,¬Ð‚?{TÃdIYø4Œ®•„E3"Sõ… /¡LñÆ ¤Ó¬HðD¹"9©Ð7XñŸ»PŠXÓG§¦ºj«Š2ê(¤‚¼š"©ÉgÂŒ½‰gÃáÑ9—O\—ž _ßcÒGðuS¶sètðP…Ñ=V…?`¸ŽTr´jÀ›!Í-ÐÀ@#àój$ÿ tÐL nMî$"¸„È7"‘"Ê0l @’• þ‡>Kd@Ç´E#žŒc†nÄC|üÈ …€ˆ"Œ8ðH$“T` &špàXѳ¢)ˆå(Ú5 P"¤[$ €üFbܰ„pŸýF àÃ[À5 ÑeC?à.h!X¸‚+HÅ)JAQ€ÂœØÀü—Dg!ÆâÐ HeŠU¼" mˆC™p”V Ch¹ zPsJW)'¢c#,!)¹‚…L`#ð¨D•?p ŸGæ Pdà PGÄ1´À+sÄ7â°%þ+dC{àǃü±ÈÀ™Þf‹> #8 J¢„ø=c%#Aƒ[¢eÜäD°‘6 ò±«]ØÄ9Bìš'9‡ILc"S™·4¡)·3ËT– kå,^ÉÑõÈ2£ «%Ç*ŠÒ«ôÎ# )ž”Ë«Æ$V1 #C¦•ˆÅ0Ha‚‘HÁƒh nrFû)¸`ƒ• PH^E}`—Ò¬^”¤ éæ< R¯’g¤\m“I³ŠÖ ±ˆÀKÉÎØOEmBÂ1!ÓÉ4*Ð’m`£¦ä;|C€a”€^öèUà€þÀYk[ÓŠÒ­–Uaª«œÀŠϪ‡¬›…ÏY1‹Zƒ”#úøÇ[¿F ì@]†(I2Ú)°dGBŒÞxŠè(Z#cCc¥º‘a$ Y-Z›ZRj¶´{ê¬h×ÚëŽö0ÔåÓi£ ^¬¨hÑÀG¶Ñ,,¬!$ëàC´®•6, #)€:dZ’zÂ~L¸@ †U‘4Ix£cËà…L·»k²®vɓ݇´ æÎwŒa„Œ·h,@l˜DU„ä °©)B2bc õ %Œk2¨ã_cÂ0°0ƒ%‘d  ïq3 ä~%M­ð{,á‡õþ¥N¡Mra¸kdÓjìt' r7¬®—¶!Àåúne’̯d4ÉJ¸ð5HÐcÌ%‘Ú@ϨZyÎYp”»ƒd' &Âz …ùÐÙÊXVWà&õ½$‘âqŽnŒäš0I2Zá¢A¡ @³XÒáP¼q4‚í èÅä¹Ï{YrÄšÌj¼ü9Õk¹°©\èr1W`/1 A%jì#† ‘PaqI7^ÑlõSÔƒK°~xaÔ¥¾utQMkĬ:Öœsµç`MîŠA9Ü‹±µ·£›ëf%£Cý0R$­ J# ]'” 2r™þ$Ó°v¹°rÌ)ç¨IÜwcÜì^˸Ó=>c\ÝgL-?à‹|ä$/¹ÉOŽò”«|å,o¹Ë_þ‚–Úo°E¹È ,¤ &ÍæÂlL/¬AM‘´™±0að)JXlÄíˆK­ï8Z.¾q¡h<ër™µÕÉ2B˜`ìd/»ÙÏŽö´«}ílo»Ûß÷¸£žÆü†uC&)‡9F‘ ‘4&) š2€/à—rEаYs¢»F}ê§òÁŠüu·l”ëzÙ:çgáõÌðá¤/½éO_€%R€O% (xbÄ›Mò€J7 þk†‡¡† ÂT0޼> ðƒóŸýèKúÔ¯¾õ¯ýìkûÜ÷ƒ,O9Ìgþê›ÿü]<ÏùÐ}ô¨o¿ûßo$/ìAÛ61 \$ ­É2ÎèêDpW°tG¡OóÅ`¼à³W"R±eöFÄ` ˆ¨Èè‚!(‚#H‚%ˆ1 ãÇX—uèÇuêguì3Hƒ58-'¦"ǰ Ý Ã0‰P?Çpç0Å€^è©Ð B¡ Ò  m§AU0Y6ˆ…Yhƒ§¤‚fÁ‚ç‚Yƒ'ƒZh†gX4fÐþøÀ"§ÁÓ`-"!î0c"1pRp¢v` ¿ ~ ·â°xhˆˆ‰Ø,\Ø…nR~æWa¸qcXqe¨ˆ—ˆ‰&ŒE…uÐ  ¤°_ß°S3`tþIup Z4E%mVø[™ˆ‹¹câ׈cñ…'‰G‰ìf‰ºhŒgˆ}§¡—|À:â2?à5fÐÆQ _0sQÆ`$  )‚xŒå˜ˆŒØ‹¿˜nÁ˜nÃnÅhŽñ8ƒ.E²Dà"@ PÑ Ïð…Àppòðk`â€|îuÿôò(‘hˆþލŽäÆŽäæŽ´鑤7úÐè0á° x0 D`CP á° #USæŰ$ŒðÅ Í ÚÔ b`ûd_ „‰”íW‘]x‘±–‘±¶‘©Ö‘II•êr Ò¨0«o`cd°’aà5!©pf0jÇ@MøW•oizK©‚MÉjOÉjQ hS —{ÉX0`H!b ‡@Ãpa6 H¶ [.¡œ`F £6Dàgz~ ›É™é™Ÿ š¡)š£Iš¥iš§‰š©¹™-~½H~ˆvÙgxyg#$±€›¹©›»É›½þ雿 œÁ)œÃIœÅiœ¸i¦GsOp”.‘ü€€x•§0ÐWGuðÕÙ~kpA žãIžåižç‰žé©žëÉžíéžï ŸO€™r9~tÙg²©g´e#! ÿ  * J j Š  ª  Ê  šê€zË0ð. ¦ÀPÐvph6 c@.!ž0 ïUz­(è~k”^UÇ”›rŸN¦ŸFÆŸ£Ñ¥Šzâø`Ävк  ð7‘ •9 Ð+á)Ф—Yßù¢=ŠZ2:—4ª»Ð 40 6þ6d7šd9Za;Ê¥¨õ£î—p- ùð‚`s`D„Q³F¥ð‡HzÅ`….ú¦7Ÿ¼˜Ž`Š6@ÿÀ€ÝP ³à¦¦Ʀ 榋ŠVqÚ~h0HaqÀ°0 ËGP€fà"íw EIަ§¨¢ªUêšgÁ‚»€áDîàL0 <€¦žÕ©ö©Ýª¾ŠR¤Ú~U ˆß`)à¸N‡ Nã5#ö ˜îÇöð0ƒ½J­å¥õ ©uÁB A³-p³@¦bõ¬Ú­Ô5­óJJÖŠzJNœ `@þ ;  u ÄðJ 3Ð$pc»jz¬@ƒòа£T¯™Ç‚£°?ö <à¬æÆAè–~ë¬cq°' A ‹z÷à}cÕÀÁ¤òàH0‡¨cp58°þ¯[ª³¬7누 B#e³çA½‹@€!U°¥•³U9<‹z‹Uô$²?$;ð+Yƒí PZ²T˶©“²_Ç‚V4ê 4 R`h0¶„q£>ÂÀ £°d€¦›ºJi»Yk¸ã¶§· Yð!A@3N3 Ûö²§tÒæ «gƒ&û¹3¸VþÇ‚â4Ÿ0 2_KÍP ðÇ‹¼É«¼Ç«™ ¹2ëJ4‹gkCKcX³ð  :œ[Vž{»º§ÇúðaÆA# ZÐ3 .Í  ½f$¢"qø·á9¹Ûq,øAS³À¸raBD° ¬À ÌÀ  ³àJ&¶á!*4u@×0 gÛ½6{³à‹¿ö1¾§g V‚^]ð3}PÅ0¬X"É@ è`ë¥"ÿàúu5h»!l&ú[q,XAÓ³€³@sá6Ð KÌÄMìÄMìfÀ Ìd„± >PûÓ‹AÞËU \µÊþÄ Â@:ƒD` â“  41Ù,Fða0` ð "á€` D`Ç J° ÍàP ÓP ×€Ù° \à`ã@fph lÐÈ#tPÌ£ûÐ~ =ƒ@tÀÃãÃìÆ‚®@2å`hûàG½0 P½ìË¿ ̾ ‚à Tüj„é+4*pÄ»A^LR`¬³zPÆJ`õ@ó ñnÐl°é€ç`f@ã áð ^Ð \° 9‡×`T0 R ÏàÍÀˠɀÇ@à¯P@LB þ?°BÑ ô0FÀ |î瀎Ӄq£Î…@Š0&0´Ð0ÝsÑ<ðèÛÏýÝ4Àto÷té³”÷¾*ÜT¡ãè°]ÐËYýAÜøñøíW ¼µ:6jJH† $Xp ¡>4dØÐáCˆ פ³RÑâE+Š<8$ã? Á»ƒÏ‘En2X§Ñ€E }0ΤYÓæMœ9ubÍ ™.`„%ZÔèQ¤I•.MjÌ,¨Q¥Î*7‹OYì 0KkÇf³1uV¯aLieÛV«„Y@y3[W*;Wþu²Ûw*­Öjh;¨—ÙA³f¸eœUÅìR@ÅÔòeÌ™žÉV0ŠÇ¡E&]Ú4btªQÑõkØÇ€xÃöíÛ üЄÛ÷ïqrP¡Ñ>‹ýwÐ %|cÊ9ó ŒC:]‚ R$ð>=2¡•iôéÕ÷üTó{øñúÝE#ã=õj¹PrØ.Zµc .¹èòË,¼ôâëÀ©t( R°b—/Ú2ãÄЭÇ"›¬²øB‘)Î<M=STq4>ˆ›*vb 8];Fìá£Æ3à xò!án*C+f,ƒ­?¼á‹Ë4³"ö jD6Ûj¾¾h@­±6&<Àµ6d‹À¹œ*A³öò3ª\ˆ€ ŠYl€¡­3lÈ%ÃÅôÔªÃ$«‹273±D‚>;óSPQL€>˜©GÆÖ†Tu b\É ”U_;FøA$V\‹ •&ÖÙõ×ôÒ$hMM‹Õ κÐáH­ÁÁ ¿ð”ô­¸ú*@§tP¬êa†±Å­ìJ,Òi)µÔ,Lu÷2NòXzëEqF\Uávx&߆¬°€9öxU]í%®DÈ´÷a›„ˆØw+F Y³hh@RþfÑ¡/i§€O¯ÍVªm´bBv`Šgn‰ô Ñ¡[HE@Ý-öù¨x‡™b¢‹® ߃y$ Ò¨'é6á€.ÆzÈ„ëeVŸŒöZâa(þùgŒÍWÒ¢M«uÚvûm¸¨¶äAOŽ*e¿jù…”¶ØÉ†fˆ`ʪë\y¾ıÇzh¯#'é«“¢‰EI`/F &*2kÉKl±¯¸lBo™cZv„Hç¿´® þÉå“ó tA¿pØÆƼ1‰Nfy´/ÄEVœ]ÆU·øñM·~WÊE÷ ¦F§€X‘è`ØéGûþÑ)º~}PQwOúÕŸªë6tæddþû÷Ÿä¢[«›ï´<»èÀ]jÌp€†k¨yé‚L¥z¿éu¦SÕc_S”=ôáæÒÈŠ4@áìøQ)B‘΃3,û0¿¾\@gaHT]–g;¨ð`·F0z§ á ;"Á,p A 9¯‚ëšJ»nè.êÑP‹è! aC„ ¼Ž6œˆÆoÌ â½L^ä‘ ·øÆ›ØðŠÆb]Tv ³ÔpˆÚFñ#‰qš õTMPRÏ«bô昩,ÂQ’9é"_C„C„!+þÀ…®"ÐÁþÜЊ1 `É6€«de+]ùJXÆR–³¤e-myK\æ2>QÓûé¦:Ú€oÀ#&ì¨Dc xE3ÙÌPQš‹Â,Ø Ìb~²Tðf–y@aZø‚ü’QDAëdg;1Å þ’”×êpO|æSŸûäg?ýùO€T %hAí‘*Tþ††¿²²`°€‘h€#,ЉZÉC)¾‘P5B#%iIMzR”¦T¥+eiK]úR˜Æt¤‡h<3UG:P`Æ,jÞ‚ˆÊ>,qT¤Zâb`*S À„Y`ÿ(€òÔÍY|³A‰þY+|ʼ=®c$ôl:Ï‚(¡kek[ÝúV¸ÆU®s¥k]ízW¼æu­/)p¦Ñp ÄØ3ô±¨@–A@¸E·b`œù«ZŠ Dö/D£/fDmm{[ÜÚV „ë¡Y˦ -V¸Ã%î0ˆ p 3$±cWºÓUlc{,ÑJ…8;õF/Üà]Ìb¡h00DÀ ”à þ!A,£nD^ñ‹]|L6àÝV‹À©üT:óÀÔ­aÄóºñ .uü`í‘[€þp…-a_.»vA“G8Q*<øÅ3¤ˆtPÁ fÑLñ€YЀZ€ú«Z¢ ÀR‘C5ðhûÐÀP †4‚ÜH ‡¨Áfr“Íl8YÊSŽu“Ì”:Îb6”݈@:|ã²›Æ;Ú1Œ,CϘÅ ‰&B…-ðØahPŒƒ›9¾ÛŽ£"Bìôš '†F,‹fô¢0ä‚§ˆJjgaÅ+gfÉTæ4§Ó€*tZÔ£îe¦7\—#P6+ƨÅ6•× ø@Ö>Æ/€ð(yd%¼:øÅ/f± ÿLå‡vù¯_:±Ó X:*\hAþ5 Bƒ}@ÚÓ6À;¶qík Í Rq¤Ó¦¶Ì¦I}î×Oèf·”­Lî£d٪ΠQT !l¦˜Š«µÉÔâ§þå³7ý•ìô ÃCXáƒw”`þp†á€‡Ã ÃÇÙ¸á­s·[ä‹už0r”?øÝ'J–«@ïð,ªféÅq€fÅRQ¶íŠ]—Ÿ®²%˜Å'pôã$pA¡R J!ŽðÁ"†‡q\H¨fˆ#ŸÅPñ8ËFÏ”§=±ñ@Ôþvá®Üì`Èr`ZŒg¿x”\P! ã Eþž8ä»<«÷A2Tí6ä/ÏbTÜà„gàÁ‡BÏ£hÜÛF& 5öK;rî›A;Ü]C:` ¯§=*ånvŒ…û§¢¸ûª‘ðôy¬âY‰x€3">*?7 tªjiàÀJ &è@†]øaƒ`Â;Єɟ@/xô,‚Á 0< ƒ~Šú²¯~(!¯}ýWe ÃþûÝíYž{,P`»Þ€<`fa$@å« æ› Ø˜«€º Zà¯[0<­ „]ØÔ«ÞÁYûè8Õ“¿ùk=þkA!É(œA\ñ¿Ã˜_hþ\hµ-+@ÆÐPè¼DÅc­¸˜³*h†ù˜Њ﫴Ó"Òa‹?¤?܇à. CÆÊ0 Ö)¨…^‡ #ܘªB"$³8‡Oƒ¹8‹Œq5+С¬øƒb@½°ë ,”?-CE `PDG„ „·²¡ð€<è–ZH€:ðA^¨ 9¤Ã:ü»¨‡çƒ9O '0¼l€ 9à€˜+0aP¨¸A9ÄÕKÄGÜ€ØE`tˆH$·²ÉA—á¤Ù‚M”X€p¬Ð i°ƒY(†žEk*Â{”iƒ¬l²8þÐtЊWÀÑ«<ÛÁŹÓÅ`lA]xGzœ2,Ã:"†¶@à*Iùƒå©4°„Qø'º1lüm¬ °ÃRxC¡³kôv4;w¬Çú›,\ÀÈwFScˆ·HIq‚|8…GШ ȇ³@Hl|Àg›˜…a>ˆl e3°Šd¹‹äÈ×+¨£FÌ4Öù&p­H€iÉ!È5À‡È X(„0C[Ô&P´É¸€| F 8‡ Hˆä† _°¸=Ê+Ê¥|»ì˜¼|Ħ¼²,·0X=©Y=éƒþ-°h5¤C³ìdà 5ø) p©é½5€„Ý6¡LÁ2Ä˾L9€X(MEüË$«#€·x‚Y˜€Ä‚gØÌiÉ„²\ÈŒ¡Í¬À‡`I/œ–*ˆ‡DxbÊŠ9Ð#:´Kx#MÕ9«„é CÖÔ°:ú…eJ­¸ HÎ ¡´åtØM;” x‡ DFˆ"=¡³§K‡L„¹ul@è$7é¼NtÓWðÏ-ÌÎ˲Y·à…YðIÁ%XÙƒÞR>³ ²Tc zH-hOéYhx–Ôë _C¼ý4µþÐQ[hþA½®,“·øƒm°ïl ØÕ“\H>īГ·…Y¨IY(­(‡ê8ÈB44 jÑL{Ñå´a0mÁý­,û%øQYÀ=Ñ„Y0!‚`;RÞl>'Ò9Ô“D¸ps‚SpΉT°2\ÁXIxxTHTITI…2G€¸Ô¤™QøTP UQUQ-„«9SÇ2Ðu‹7àÔ ôF­`KUÈ…‚¥Ð<-´Y0·Ø¹ÊÔj˜ Ðð£HÑü™uÀ"¬¦yCXq0<˜.|H…ú3)þS†7ô€T=+¥mu ¸:Ýyx¾?x…qXÞÑ7­è†lj@$±cm tØ…<Ñ“|xЙOèÒf‘P†mX‡U€`†A(0-¦AƒrÈXÝXŽíØr Íݨք…(Y“=Ù†5¨„-I92ðØ=(#&WèÝYžíYŸí¾!•q=\‡~8Z¤MÚ~ðƒÏx$ý…dpK¶@†YØ€ ñ („0X#H”ˆmðµiÕ 5ÈW^MÏ©ÈÁ!È4Ì /Þ™@ØwqRIq‡ДŠ%¦ñlû[À Ü¿ÕVg ‘µ$þÌaÆðVT*¥}\È\É\È%˜ÊÍ\ÍÝÜ£=³U±‡iá¸0p%Á=]Á=¬èƒ¡ÍÔ„iñ˜#U… `Œpˆ©u‹*˜#è–orPd¢±Í :0[ÈÐù¼/µ 'õfè^ïõ^lÈŠ=è´Z•¾E]ôÅ6mÍG0Ü„ÂP˜ùßùu•¬ -@%ø‚$è_ÿý_```g¸‚((`^`à+0†X]pø ®à ÖJi(ÒÓM_ô½1PLÖ˜×%p8aNáM*1¸!U­…`þ ¢£I…¸xf€O`Â^¸YЇ¶HÞ!Ü×·`%b=±‚{Й [wqÒ P*®â*v‚ÉŠ`ƒ6ÙÛ8_FÝõ݆ö€Ã…!ÌI+^câx‚‚u°$À€I"šC€àÏ€wXc+^®©©ƒÖ}°Ò cÔámá@V•~>®bý~Q:À U…ÚÝÍ yøhŒ°8 ð50H€§ûá¶å2"6F·P…Y°_ù"xÕ@ 7€ƒV¶(—uLX‘âF¦b,^ ȵ2(àŠVcBÜ1&c÷e£4f5 ŽÈ`õ‡Åþõ¢9®cˆ¹ãÖcj^.¸¬@%€°AnæÀ5äCڼǣ€]Ff݃Fx’6`ø©]-c ÈLÀ¶80(aê†øî!òa @â^µ }l‹;%=цY86àH°¨X"­X(6`æaVƒ@ †­ _ñâa`fvV_Èl+ã3ÖžifkVƒu…„À_êfo¶pÎã=æåú„jÞ¨ dŽiÀuçwáUYdj¾g5ЃÊôVÚ­…Lu X˜^`Œi5pVà—-V2e˜†jm‚¤Z„(/ÊéFÞi*f„48!¡jz)jUÝ£n䤦âT@v°u†êk“ê©Nä±j{Þ *fRHInœÚõ$¸äË\`Œ=ÄX¢>èÀZp‹²…hæMÛ¨t l ßlŒhµY ‚`h@€'Ê…h ê庀)6iÙ³âb€cf°ÉþÊŽétmŒy@cPcþ+Ææ-ÙfÑ9mÔþÕÖgPj*žstž®Ú¶íØûƒ>èðß?¸E–g£ ç«öí*ÎgØç±ñþçYèʶ°…&e °¸çÖ Þp‹(Ô׈–hÆ#°×#Þ†}p|Àj´_Û…õf p@lMQl>fì*N镆—ÞovWør0ÿrñòl>mGöiêÊQð•’Gêgc¦ÖàâÊp¨¦ès?ïs~™„¿ ïí=Xc­Þ’®¶®…~XF­ÈY •¶( ¨‡¨P"¶ø‚nà¶È8¹Þ#ºŽ1Øt ¯ZÆØ8€mÒŽã«qó7ÿ”8þç‘9wí:_ãØ€Ù&.=?öÀUuAÞnd¬^càîIÆ¡©&8r}SРèv°¸ŸJ8¶H“€0Ð3 É¹þq³àN6Õ$€ƒÆp†¯S‚¸€¬ _ÓÓd‹-òL¡ò5¶ò5®ïûÆŒ-¿wÔMvðÏvv>6pmf܃¡öj7“k¯‘lçã׿c ?çt®p'yl#÷A·ŒBGwçcgñwqqåù˜ax€%†Yx­@‡ ¸1 È·ØË %uU&øºL·€gh ¢ã­7Í J€Š\ðG­ÈŒw·bŽ_c,_'vÜ0vŸ7ùþ2pjFs>îéŸÎß—§ã˜‡s<^mq¦s ÿì;çù§öyÁzs'ñ¢úÂ/z>Nt®na:Ê®Ù臷RPÃ9ýJ³‚Z(€„H 0„f°­¸CAOQ<°9i A`‚Æ„jŠ 8…D¹e‹ÃvoÍ`4`Šº¿b_f`ïa_ŠyËGvPvœüjíÑ.m€ùÅW‘™§‘š_ã›ænÿöÄêyËÇ|!9÷Î?tj^wn€#p Á‚‚±FfÆ2,t‹F±†:¦ s¨c×,"|f5ûfc–%û äˆ._:dçÊ%R0þþRâ%O„’õäidžºPþ 4«V£ Ônº¤€ !U0¬æˆJWµ€ j¾‚ëÀ’°fÁR L¡ªÏd&w.ݺvíæàeß¾~ÿÜ· €{w#Nl—p‚³`9ˆáØl>cü}0¢x³]¬€-z4éÒ¦O£N­z5ëCÆ8öàÝd5­|ªýuÞ ”¨”À.œ®2Ÿ‚#÷»À¤á‡Étq;P€Wµ×Ø£ûk#uÚ0.ž B¨î:6ËF°ý¦1\ˆƒ€¨äzÉßðSOz€h4DC.æ½$M68 %²õd@1A¡¤‰CòÂÓþ'Ìòˆ…Ä(• CRGÐ (±ÃA9qåÕdc•µP“]nÁ%œfˆåµWr;F˜aÎ)bŒÕ™d.®3J£ˆyÆš”SRY¥•¤¹öä]²Ñ6Ùm¹¹È>HSŽ–gÖU!<²©shÊÝxÔY7vÚ¹¨2—•"FˆÒ•G ˸‘Ñ.ËÜÃ{<Ü2Ë3 @ÇRÌÂCC™!?´È‹-yÓLÕ”à3³äB@ ü tˆ £ƒ¤ éÐÍýõÐJîì°T/¡‚ø'±€JcXàgA)ÖÆ¢‹_¹ÁÊìÀU5w 7ŒÜXWŽm‚ëþ#œxEH1‹ÐØdF>û#iàŽÃ™×]Q^™¯¾ûV™eplLÜ–³Õöe»€@ Œ»)á¦&¸m.לrD íDçuÙµË)K*C‡°Tê‡7ýC+C>4㈠îÑ€G+'xª 4ˆáƒCÓ¨aP „ú¤"˜à.-)A‰5 üÂ:?lRË©ñ×Ó³l€.E7ìŸ\âG(eñȲ]5KV»_¥µV[a (m±È¹t};1â6<ƒØ0Ðí0D®ÙÛjTvYfÁÉcOËtö¿—cž9hþÂfìpR]\ŒÛÛ¼ù&pàv}þÁ+ãØ%±ß;V<.Æ­=¦ÀQÇv‚üvwß…w²AjâO XxX‹0€Â01 v´ÞC 0%ÍÐÑ• ö/ ¡ÃƒdĨ åRË--°Å#„3K(á(Øb‡(ÄR +8#a֊ܶ8Ɉnö²[O²°€½ £o³CàV7„%]xä‚8ǰkqIZR“8SŒ` ]ð¥¹âpJœãÌ;„bˆ Ž`^2ÝâÄD&3­®.!ÌŽ*¾Aãl9µ»Xt¢ žÔr˜Nu>†§·é‰OÊ2ž@Å ”ðãÑ0þf¡HÂ@p#NÀ“4a*1 '„O|£"_Ò”  ÁWµ˜ÜðZÀG†q>X (ÙC‚!<€À§†2†ÐƒÈà«@E)Dñ N䀟è€&.QI@ Š@„€}Ø!l80ІààÆ€0:ÆY‹SC´¦U­‚Ô3w3¸l(à\Œb “Äa¼Ã@ÄŽ5 %œð,)œæ»âe&&ºJŽ ‡¹ØÐJeàÉ‚ ‡"t5;ÜÌ9p†XL‹¯€ƒ\H7D0-a cØ9åB( y8Å6äþ";rfŠhºTÈ`ZøXA=Àð;ÇÜišjÉLFÆ„,d@–”Q(á%ð¡Â XŸf´àµÉM€€„XØ€tH0ÈYŒÏ!åKЯ°7 #Ð@*hÈ.N\À™ I/¤ƒ[À£'àðƒW×#Œî6°J”C|p¼ú£?`[[¤Ó¸•¡5˜,-î‹°‚,Øì*V  U¨ ©H*PÁŠ®'ÞÀ0N”ú…0±8E*VÀ‚V¼ ² Å tá‹ ÁIh¤QlpÃa ÇÖÐxÌaZBX !¦€’5|T](TœNÕpþÂì$kè€!‹U¢•pDÐ$ SþX†Ð*±È@ªÐÿžf¡vI°ð 3 ܘÅ6N‘—?ü uŒÁtŠ:¡Å<ÐMh"˜ˆk%(1 Dp@ ˆD â†(! €@´J B X…`ᤰuÓÚñŽxС÷Èüˆ@b„(„!€ˆD(‚ pÀ °5l‚ðÄ ‰YˆáámA(º¼/NsxmÀÅ J1ŠP|œÐD.a HhÀ"€C  ÀNL#KªCˆ þ5^#I€Ã,’1‹_ #x˜ Ò>÷}Õ%amÈX€YРQãCÖú«\b˜ã "„­Ê`† v5Äãý@±GD‚¸€*VÐ Ì=ƘklæX<ê°“x@D 1à ;Mv·‚wOÄÑ À %KÒÑcKï ͳ¸Å"–¸m¤«HÜÕi"*1ÍÛ ù'Æ$ ´ÀrWRÖI€ VÈ„7ø‘˜4šøBæ XÁ;ʘC¼ ÐxäÐG2€…Îà üFTÎr—Ã|ä%?yÊ­tˆ1þÈBAH4°ñ…3¸ãÓ‚9"„|€U]¢0uʆe<íÜŒÓàu70¼;`À-¸bZð°À.©…cµðUÿ¸‹LÍ©NõªÒjópD ‰”²V)tà†h”nq —¸°}¸­oÀñ8£ãé† nåšg‘æ4å@ ”èâÏ %à! 0€ h@#àG<àÚ‡ Î  þ` 9¼¶ß„EáBÃø… €à‡}àrxÒa†q€A7dÃ5PA48þÈÝ2 DÀá$\âÉ4}­0 ƒTÃ8ÄÃ?€#T'À üCÁ%x‡Â ÆY ÇÝ0‚7Ã5Œ<”€%€€88ƒ¨$\‚6l€œ=€B¨BŒ€Ã€œ?”B¬ÅDÂÀC6ü`aÞ`î`:ZÖ؃;œÁ`ƒu±Cè44 LØYTØ4ùaôÁ \À%`B&lt€|(„Â@ ”  @ ¨À*°@ ¸À+ÀB,Ì-Ø.ì@ô]E@Á(Œ‰?ÈBŒ¬ ÝÕ˜CPå½Ä퉇u•C¨A,ìÄÄB„ð™ñ½xÜA%D6mÆ6@|À”-PTé…)†9%ÑGµ$`"àS<™Å<µ‹øBù‘B mF!@,˜ @5@À2Üþ•pÜýƒäUP܃¬:+ä†p\„ÆàC À„F'ä#ÀAYÁÀW”åY¦eXöÄ=85€ ôC=¸|@TÒPÔôJ€ƒÞ CšÅ¾ ¸¨Ã>t”\´˜@ßõ ¬Ã0ݩԙ°” ¼ ìĤ@ïÜ4ÞÛ¼  D ¨ÁOCØ‘ìàDpD8¨ PÁ,°L¨Á,h€28ôÕ@&HA¤‡ì‚ü,À, öÀØÄùC°Àh@@£häFN…°`|ƒ“K®J†…J>‹à¤6þ‚ XÈ ¼ßô¤OnCN¸#`j—<-ܳ4ȃ!‡]š!?ÈB?” V Ç=À!Ì?<‚È4@ŒÆ(|Ã$&”‚6Lpœ„†ô€!ühŒ…Ç©eÇÕèæè޾¨ŒÎ¨Ó½†pøÃÖ±C%$C–ݳ°*ì/XAhÊEg. ?´€ÌÅjö[kj KÉJäÁ ÌÕÉßÁÙ³ BˆT&gU Ä J¨ƒ%pD'üÁÈõ˜ÇG89¬ª`§‡hg!yˆHƒ!È< €œÚMÔC;–ÀCA|ÂGJGK%þX*ì%,G Lƒ<´CÜA DBÀÇÁÃ'‘i^éƒ*ÀΕ¢Oºé“° €>´BMÄmšE4¶Ë4À ÀŸ*CØ9DÀ¯0„-0@-ôª¾„è ‚<À¤Rê ‰•¥šÇ?ìã\AôB-ÄÏäþØ€Ð6D-çW©ª[ˆJ ƒ'hÅAø§XÀÛv°¤KÂäµLglC,¤æ]¤ß ë¸D²ÞR†…RÖS:¥c†&HÃ#¨N ™(•d d`Aô#|‚8´4€B6‚5”AØ2B’Ê€:Ô`ŒC  ÃtAdC¦ô#|C9dîævîçbÁäVîå6¬p¬A 8ÉèÙaÔvp¦g‚&™ÎÅ €ÅÎÜ™bÉ K…À+äCÇ<ãËæ¦nìfoþ¦Íç,´70À€<„€MKÌCAQ íMTª‡ìC¥@Â¬Â©Ì ¬á¤ðãûþ>Ä×VÅb‰PÅÙ~€N†€ÒÈÛ¢IÝÂÖÝ*/ß>³:Ɔv(X+”$.€Ç!)÷Ë”‡óÌ–ff—NÆ—†é˜*ï\ÔWÄ@/k¾ Ä„ˆÌêÆžö)øD ÄC×ÂÚx†×VC4ÌÃDüšG¢ô‚$œ2DgA„ Á@À,˜;„S…„ƒt °(°YØ*àªt쪖H0JQ0™ZðWøíY8+´ž¶’0h@F Béö±”˜–P,XXìY`¬Ærl +›™ô:KUƒ…O†ÌÒ¬qPAøÀ ÀZ y•û‚±Ñ(-þ«1íCˆÞ/P‚:Ã!Ð@WÁÄ1ü‚.œB.$Õ)‹1pžqƒÅÚ¾äx¼ñ“Ä19ÍqhÖ±Ü1XîCÃlÃ+4Ã,,þj‚€A-„‚:tƒ¥8qD“ÑDÓ*X¬q‡H1ÉFoPGŸÓGc°ä1*oIŸt\£F!?ÉJ{ó"o¬LÏôÈF¯M»&N»…Nó´hr͵P;ñ1˜ÁÑ*õR÷³AþóÖ2Ds ºU ðò|¶WŸ…0·íŸµs˜õì u©õ~Å3Gs õ\»öhÐ5ØuKƒsòê5l3J™³p 3Bööª;Ãóa#6SUË4¶¨ÈM,ªC='sµñpvXXtžLhÇhûMi¯Îi‡…HËtk¿vyǶsÌvñ¾tLßö^;è6ìvpô6öÞ)næ©O5qwrþ'7S» |UZíótŸLu«AXçªñh·pp÷Äxwà€÷W´µ^“wy»öyGzƒ^7r{oFn“S|ÃÆ|ïpööpn¶~D ð7û·K4‚h-X#I·fuu{6p6xpP'dþHŠþìa§öô©’?pâÓPG¦‘0ôiÂ"†ÑFPLÀX2fÓNc•TSQU•UWaYZmÅUW^ýÕ©Kà¤È…ÒŽ;ïÀ°“G4Âá’ 0† RÐH‚ë½7_±¤JL XA Y ;0@‡Œ“NâHå ©d†6Àyä’ÁXEP4™!=Àx"‰ ØØâ˜$‚}À(DsÁظãQ&Ùdô„º” †ñBM8¡` $6Ù€d)‚…,éú騧ÈM2É ¯KÔ`‘¥hÌ&þ`¶¦o2À|Âæ‡8H`¡-©±š HÁn¼õÞÇ×~àç˜aàÈÄÅÄó‚ÞŽ{îºïÎ{ï¾ÿ|’Á•(üðÄAgÜÇ!—œr,ŠéK†C :p` B48;m’CÑ@)ªÞyM"§DQ>A¤÷ßÑwÝy/Š9 -ÄPC=Ѧ$§ÔhÞƒñÕw–…~8XFȤKp˜‡ ì·à–Y ÈÁƒ Q˜aÓˆ½Î7(I‰#)°@,&`ƒY ¢±fA&IÁ³È’5A Rð^ Á,ʱ‘ RlK 1Òá<@ Á=6Ä0þlÈ 5¼!Ì0‡^À~€ÌÀð 0dCjˆÌõ‚a†:ġ҂ ÔàFÆ*˜0@$b˜HÑív0ŒK™q \ô"G°]É gt› ÜÇ8ü°d€B9% ‹FøÀã6ÌQ†XtàVæ9 ±§ŽÃ¸c¯ò¸Ç>Ö$% iHD*ÒGP±".,¡EUØh‹ÈÇ0B †7ÄÓÆ4611R®:1V¾r§ˆ*±ç-†téK`Ó˜Êt¦4`MŽj”œèd'H€@F"pðG#"D?0dy@€÷’˜Äžƒ¶XÀL ".]¢¹LŠR•²”CTФ¢± ( cmAš  ¦25©Xj3àô#ŽN¡Ñ1‡ C¯øÇXÿñ 5`oÃXé}D£<ˆ•¬ßx""Èh ‹l$æ¶ÚÕ¯†•¬e=kZךɷV®tµ+^JÚ ƒ ¬8ꂤM0`Tµ* ‚ôò©LuÚ0F«Yp–þo•½l1r±Œ9„h™Èv2ÚªŒe.ƒ™Ìhf3œBg<óЄ[£ÝÖdXA—HºÐ†>ô¡Õ(G=:‹p$ÕH–¸«‘évT#hAÝšƒz$KËÈÀ,6 ƒŽLà‚5˜…&4’‹h¤½¹ÇF>°‘ €"¬xÃ&±‚ €! àÈ„'àñÊ}éăÁáA´B&¸À*Öp1€£ ˜@ ÜA0Ÿð€7žàMà#‚Ì`ÂêO.• ã¨$È%Æ] ÃI†)dƒðq ¢ Èœ ‚ ŠÀ‡^‘‡4¢þèh¢X‚5z$ cÀ^³˜±0wÐÕ0ЀKTB{ –•±¬e.Ë9Ìc.ó™Ó¬„5·ùÍqþr¢ë|ç<ï¹Ït¶¢… 9Ožò@j`¼ip+ŒEÆÄ@F;Z(y ž5Rd³Â6ĉ2¤!lˆC)òЇ½ "N‹xÄ—z¨‰0Ôõ¯Í \’¤w½ùåÈ~5ÒßY”šž¸'=)°]oςڳ°¶´IbÐ$ˆaÄŠ‘‰KT@í˜Å-*P‰ t€³00[,cí~w¼g!ŠHX€ï؈ 0?:¤b`)Б‡' óþÀEÞ Šs¤s(È}r‘“Ü ªpGÊ ƒ|€AA°GÄ"†°àòèÖÐ+jd|ãÿxÈGÍ÷„D H$°Ü‰Md«°-<Gä(2˜CÀÌÀhlÁŒÂ,¬% Ã4ŒÃ< ÄDŒÄL ÅTŒÅ\ ÆdLmìÁÙDíÃÜþÂ(¡"a@00c™Â2 ,À>Ø€r° ·*°´XHä(ƒ9&®â.è8ÎãL®èJŽèPNåXÎå`NæhÎæÀçtŽç|. …Ž Iþn9#A(ÁœäÙ0œð ÷" ¹ð'=ÌÁ'q) $‘éÂHq/àýâ?‘,‘Ñ¢3SQûcK-†Â'åq#9Ò!zâÀF2è"gÈjÄa†Á$“ àaŽ¡VE Z¥F¬…=°Å&##ú€ ô!‘¢&}â1çb,Ëò,y"-ëb(‰’œr$šò)£r*«r4BòÛŠ%L³0®’" Æ!Æ©çž@äAÆaö€C2ÁUÎ!P…PÂò)8` Š!xŒ2ØÒ-”ZA†¡EÂþ.aFàLu”`r*çr 2à Vd `á ü0•@0}å.ór/û²Y³WÓ.„sˆÓ85kÂle `"T’*ô\\¢»¸5 ƒ4%*K(a4"2æaÞ,Á,`þË|´`â!" Ò'€†õ‚5]Ó¶RÆd4Ê >Ra¯áŽ'yŽá‚D0ʆH#\ 8 ài$Ts"J”!X³…XS X³"äAW‹µ5!R”4€”µnév.­Â!â~,Œ¬ÀIÛr ž9Ù²;á¸U[Ÿ”K#£Ï¨€ ="G\ÝrØrà¡]ßU[!Ê–µY‹ ZBZ©ÕZ1[5?eB ÞÂØc,ÁU\S&’zô!P ò 5öX#–=üÈÑQEbTþKu Pu#²+VuZõUO5Vgu#j•%´@Åk’.Pa0#üé¹ k¼,ð»ªëVI²*t ŒuXÓgÀ@ðÁi›öXq1 ›âŒ> BËPm œj &@ ¤`ÕìB` Ì® ØR€Ú Ö AŠÖA*`a† \ÃØÁvÂ|ˆ]Çõ^íõ[Ãr×]ck»V޾¶ ÄvÈÖlÝ"PO à !”³5ÛáŽU¶2  ‡2ÀEQ¡Rwu]³u%áuMw&òñf¡ £t–g}h'*¼„·h;âhk6þ)£d)K¿Ü‹#<Á4ÂT•U3ˆ½¨—#,0ܬ-iÓ"+·ÒÈ&ýsp€5½:^A 4ö úDáT@t4k™âŒRz0¡¢µŒB >ádÉ.ðøAÚn ˆ íZ€-aãH ÔR ð ¥¢Þ ¤!×1  F``@ `oûöowp —níoõ–oýpõè† ·1¸€ X ¢Xt Ö"Pì‚Öj]“i­6XÁ`X«öŠE–@¿Ü4Âz±W{[–{ÃøÛ6"|—!IÃ)¡²’á Ž,á8þA*A úå:Á àêà&!b$tóÏ!ÑB¥äÜ!@NXì!T¡ÀÀòÀÚ΢â@°!*amzH‡ Žáj6!bz—5ÈU…‹ƒ¸Aœ³@˜æâ’„M…7¸ƒ?8„…yJø„Sø.P9HTÙN‘‡ø\yøby–‡¡–ýÉ+â`?¡!f€޵jwõmbj¹øjߘâxŽå­Žï8÷øúøyàäÊñ¯Cõyè(7W­¢‹OcGß"Žª5áÊÊ!— —A°¡¹¹*2ÀRn` §~þïwÆô—ý·}ß7~ç7¤ñ—¤û÷wd zßE¦Aâ «¶rýfc¡ÙÂ4aP‹5,o&z¯ $ú:¨1º*, ö€A“9Ù“AY”I™’-“«º“¡ «G¹”aº¦Ù˜¦Ëz$›äà;h£§®%ƒ¨syt¯"¡Ã(E2Aò¦9ò­ã°Û.êÚ*rZv3òú#÷Z$ûú!ÿZ°#[² öHÖº­3C±’±?Ò±²'´C›ÖºY3%"³r³²³ÿñ³EÛµ_Û'û O»S[!Wû[¶w›·B¶ÿ‘¶õѶû·ÝQ·{¹Eûþ·ï1¸×q¸õW%XPΡ<B àŠB@:€'.H A ÂÚ`]ëñ"“›-¾»WÂ{¼ ¢¼ÏÛ·Ó›®I»´;2¦Ñ$:z WUt"!tæ>ä!Ê×D§»ÛuäÁ¡ â%#wKÕ[)ÂkDÂ)&ÝõÂmr¹Ý±¹Íñ¹[âzW7Dš ãž`ð„ÆœM´7eNêäN‚\%ÌáÊ@ªÅ!*⸓ƒF†f²¾Þ» È5=MÀS eV(ÀU ` Ô!jåVrÃw"ÉaÉ›üÉBÊã³Êee °´œË½œZºþ13¥›=¨[h®;»ó—\$¿9âãÄOó•–"6’ëg‚"˜öF…+·^&f°©FÿŒA€(áú Á%âȑ㑞s æA œ ÈN-Çsgo®Ápþ zà~[çq.7Ì5‡=H}LÕ·õ^W] Zt†Ö@Öi½qnÎí"\À ÜÀÁ‚QñúÏ ã@ cÐWbÛÑÐ'bC$à ­Ñ×Y§‚MP<‰.!ê! ÐAHQœÁ¹F€ "~Ý^A<”&IP*J` :é3×"ß÷ úÍ-<àñ¨à¾Þ3“Å]|þ`üPÎÆ»éÆ­IÇyÜÇ\È©È+¢ÄŸMÐù»3$Á Ù7Â=Q9$jÏOÆ«ØÚ½ bЦjªÝ•h$á@€¦À"Bý82EN‡â — °â JQi®êê®Þ1käé£>Ê%•ª~¬ˆ$K‡!ë+ãý!]щ äâÑ{&Òw‹Ò‘ýÒ3}Ó;ýÓk#ÛÿBæ#Æ p£Û]^Åm>"(g¡!x0Æf  A+%ãHW Ã6¬ÃÀ€‚ Ø ø¡*áôÆÞWÑÊ‚$àá öíÊì` 2 ÐÑÄlÞ!v  * ÏôŒë "þõW ZÿõcŸÏhlŸÏü,÷wÂ}ßE€_ø/­ÙkbÜË}§â~èBÝÙƒÝwÞ=Þç½Þ)¢å: $, Ðm¢çà ¢þÙãç,=°¡!ò z4På®OùÀœÀÐß]ÎøûŒÅ‹-žÉ6¬£Ç CŠI²¤É“(;¦aÅãJ†œ €4¥ìÁ£%ˆÄ~aX}F¦¿Dx°‘ë³å@ʧP£JJµêÓ—-UÖ”IæÍŽ9wöüthцH•2ujµ­Û·#ÉtÉH7ã!çöaÔC®ã.Þ=g‘ž­ˆ$3Øâ:I@0›Rþ7£52³2kÞ̹³çÏ™-MÚ3;Wž*ͺµk×PUžM»¶íÛ·7ÂÝÍ»·ïßÀƒ N¼¸ñÞrq[Ì`¡‹Ž4á‹A@@dÈbŸ¨fž„Væfˆf&§ft&Jå…FšÑžVj饘f Ò ’Jz¨£p.šY£ Þi§’Rªéª¬¶êª…œ¢Jè§¥j)ê,¤ÖJੲzÆ‚+ì°Äkì±È&«ì²Ì6ëì³ÐF+í´ÔVkíµØf«í¶Ü&ûÀ\½zJ£®[Þš+¹ýñ.›®ðâî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'Œï ëFJ+º7š ĪÛðÅg¬ñÆwìñÇ ‡,äÃ(qÉË&òÊ,·ìòË0Ç,ó̸‘þŒr'ë7@XÂ6¥ ‚–ÓlôÑH'­ôÒLl³k‚èÒóÏ¥ 0´­¨é8ñkdVK¬u]eÑM—möÙh§­¶ÑO»†×`—&v•9ë'ö1›d†Ã|[pË-–XbÁ$d¶Ê4Ì¢,»ª¼öãG.ùä”CÙvkoÏ‚DÞ³ìÍ·%Wb%>K œdÆ 5ÖýZ `b ™Q EfRLÁ4™MCKf@dPû1WnüñÈ'¯¼Ò—³vBìG¼Sûí³äõ¾g6Ì%™YLëYc¹µksoðŒâ›i€ÉfhæÃPP#ÙË×oÿýøç?ò¸f>‹&Jþ@ŸfÔÇ>ÍH€ Jˆ€\G>Íâ³°î(°»ÞÙB3:ØÄˆ0?Çéïƒ ¡ó×¼Òø¯;¤ž(ˆ½ fƸ€¾95;ëÙ%*¡7¾]à8¸Å%~Ø W @3‰˜€è7Â&:ñ‰PœY Gµž]€‡ó!oÑ3 xÀÐÌ#±2ꆈªÀ÷:Å6ºñpôØß„”@¥’€%~@;6Æñ€ ¤ -Ç?]Iༀ ñx3þ0qŒ¤$Û8ÇFކ–dÍ#'ÉÉNzry•̤iÌ8*4Š4›ü¤*WÉʳ…ò”›Á$,?“ÊVÚò–¸tþÙ+g9 Yò²@Ì¥0‡IL‘ír–¾ü¥fjYÌf:ó™Q:&,“©ÌšØÌ¦6ƒ$ÍSRS™Ìܦ8ÇùÌnŠò›¿ '9×ÉN[š3“èä¥:ÛIÏzJò–Œç,çiÏ~úóøl¤>aIi à M¨BÊІ:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤ eG!«Išž2ˆ©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªMÈÒÖ¸´ªXͪV·ÊÕ®zõ«`íêUÃJÖ²šõ¬hM«Z׊²±²õ­p«½\çJ׺N“”¸2¥]÷Ê×¾úõ¯€ l/ñz.Áö°ˆM¬b«+·2ö±¬d'ËWÇRö²˜Í¬f7ëMÂꕳ  ­hGKZ*Y¶´¨M­jW+ÙÓ²öµ°­lßêÚÙÚö¶¸Í-2=«ÛÞúö·Àí,#ƒKÜâ÷¸<ª-r—ËÜæÊÖ\èƒt§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ»Àk@;mod_perl-2.0.9/docs/user/handlers/http_cycle1.png0000644€ÿÿÿÿ00010010000021026111727205031022132 0ustar ????????None‰PNG  IHDRø9[ôÙ¥sBITÛáOà pHYsÐ=ü4 IDATxœìÝg\SÙö8ü}!ô"U©ŠŒˆŠ{¿(:°*¨ Rm¯R±(¢XPÄP± #¢ãˆ(*("0" Rdj’çÅùß<üh’‚)¬ï‹û9Ù9g•pg²f—³às+W®¤÷fBÈÐÐЂÛ°"::º¯·†!„,,,"""~b>sõêÕ¾Þ"üÌ<~&(t ° Ð€À‚B ,(t ° Ð€À‚B ,(t ° Ð€ÀÆíÅ… ¸ÀeIII£GævÜ$˜…οÿþkbbbooÏíD®qwwommåv\&˜…BHJJJ]]ÛY\#,,Ìí¸æè@`A¡…:XPèðn§À¢+W®„„„¸»»s;àÿØUWÝdggß½{WXX˜F£IIIµ´´xzzr1ŸððpWW×^ßZºté Ýôĉ %33sâĉ..."""œ¿fÍ„PHHgÃ,…ΧOŸîß¿ïããƒaBèË—/AAAÜM©¥¥¥¯·fÍš5H7ݶmB($$dûöíƒt €§ ‰BçúõëÛ¶m넲²òÎ;ñãû÷ïgddH¤ÖÖÖ &,Z´!ñöí[mmm:^[[»víZ##£~Ú;::Î;WWW‡aX[[Û¼yó¦L™‚Ç-//Ç0ŒN§S©T___„Pxxxff&£çcêÔ©¦¦¦¡Ë—/WVVVUU………uûLåɬ^óÿûï¿çÏŸ¿eË/ÀS†D¡C¥RÅÄĺ¶àÏüûï¿ëêêþûßÿâW¯^}ôèѬY³¶nݺmÛ¶µkת¨¨tttàD_íÑÑÑK—.UVVÆãœ;wN^^^GG'11qäÈ‘k×®Eµµµùûûã'¸ºº¶´´ìÚµ«[žëÖ­C½ ý0›'³zÍßÕÕµ½½ÝÚÚo\½z5•JÅ‹ž¾>/ ·Õ(th4Z¯íÏŸ?÷óóc¼\¹repp0>r¤ªªª¢¢‚’`œÓk{JJJ]]ãœŽŽŽ‚‚œœF|‰´ÿ~Öòg!Ïjll”””ì+ÿ+VÄÅÅáÅÍÕ«WW¬XŸÐ×ù¬}:`ð ‰BgذaõõõÒÒÒƒ_^^¾g÷LOŒ±3Þqüøq??¿¾ò×ÐШªªÂ÷I©©©QUUÅÛøy®ËË7lØÆØØ¬¶¶vÇŽõõõ“'OŽ‹‹cœvõêUâÞ¹s§g»®®îóçÏñãÖÖÖíÛ·WWWã/) N`|NåÙžC_ù#„–,YrãÆ›7o.^¼˜ÑØÏùOÁBÎÎÎÜ΄“Ž9’ŸŸßõ.eee111BBB4@ 8::ÊÊÊ"„þüóÏÌÌL‰ÔÖÖ6~üx|’ohhè‹/çÌ™SRR²sçN —¾ÚétzllìÇÅÅÅI$’¼¼¼¹¹¹ºº:NŽŽþúõ+NojjZ½zµ¡¡!žÏ³gÏ>>«W¯ÖÐÐ@¥¦¦ZXX „𢡯ö   ˜™™aF£ÑDDD¼½½I$R_÷ jnnNKK³°°ðõõåìçÚ¼y3BÈÛÛ›³a*(t“©©©™™™ŸŸBÈÌÌlÒ¤I>>>!•àà`„§§'~€ }µûùù577ã-¡¢¢¢Ã‡ãa{…¿åíí4Èø1(t†eeån-JJJý´w£­­ÝÐÐÀÂ}ÛÛÛCCC¿}û†aX[[›••ÕŒ3ïÞ½ûÛo¿íܹ!Ôõe¯ç³p_C:«¬¬Œ1ÄS^^Žxyyu;ÍÝݽŸön®\¹2vìX’ _»v­ŠŠ þ244TIIiÏž=mmm7nÄ7oÞL¥Rñ¢§×óõõõY¸5€¡ ¥¦¦Æròôôd9^0a†aجY³fΜÉÔåõõõÒÒÒ÷ï߯­­e4¶··çääèëëÛÛÛŸ?/nΟ?oooŸÐ×ù, C:àºL,8zô¨¢¢b¯A´µµËÊÊZZZB_¿~ÕÔÔÄÛû:` |hhh ÓéRRR­­­Ã‡WTTÔÖÖ644ÔÓÓ›;w.Ç– ýƒBÀ*•úðáø¸¸{÷î5jÁ‚S§Nݸq£¾¾¾¼¼|×3¿ÿ^YYYXXøÏ?ÿܸqÃÉÉÉÄÄÄÔÔtýúõ3Þºxñâ¯_¿r; ðÉÉÉ222ÜÎp:€¢P(AAAÑÑÑ&&&NNN×®]êç|}}}+++„NöìÙ7¦L™2eÊGGÇiÓ¦ý¬ÜKqqqpp°ÀÔmiÕªUT*•ÛY®Bðc4íôéÓ\µjU^^Þ/¿üÂB æN:uêÔcǎݼyÓÍÍMXX8**еÇmó ‘#Gr; ЧaÃà—nHƒÉÈ€x÷îÝŒ3ÒÓÓKKKÏž=ËZ•Ó†aË–-+..vuuµ²²:pà@GGGR€n ÐôçáÇVVV^^^·oßæì, Ã\\\>|ø——7þ|Öö‹€þA¡èÓ•+W¼¼¼RRRlmmé wïÞ7oÞ¬Y³¾|ù2Hw Y0r è]bbâ‘#G²³³eeeõF†8p@VVvåÊ•ÉÉɰÀAУèEQQ‘§§çíÛ·»Êaرc‡‰‰É¶mÛ~ÎíC:€^xxxQ©T|„«³³3""âÇBBB¡ªªŠåTUU Þ¿/**Jü@ìÙspGØÙÙ8p $$DJJª¦¦&**jË–-wïÞe!TMMM]]]SSã¾kðêêꨨ¨­[·Þ¾}›ÍœÍÍÍ]\\Ž?nggwöìYŽÇgSÏBð477“H¤~N¸wïÞ¦M›ïܹC§ÓñFÿyóæ¹¹¹á/½;,èììœ9s&…BéÿL Ãú)ƒ8ò’q‹^ß%‰---=ÓÖÖFYXX((( „¤¥¥ÝÜÜ„……O:•˜˜X]]M&“W¯^mccC bbb._¾\ZZ*&&¦¥¥µfÍ|VÓܹs?}ú„š2e BhذañññÝ‚KJJzzz644HIIÅÆÆÆÄÄ”––ÊÉÉÍž=ÛÃØuvvv@@À§OŸ(Šººº§§ç‚ Bííí7oÞüúõ«ŠŠŠžž^Ïä¿kuuõQ£FÝ¿!D$©Tê³gÏNŸ>‹zñâ…‚‚B_q˜úŒŒŒXþÿR Ðüÿh4ÚÕ«W1 ëë Ã***ð=,Ä……ñö¯_¿šššâǹ¹¹eee?¼Wcc#Nïy¯ªª*IIÉ/_¾`¦  @"‘¨T*•J¥ÑhÔ.ð—,~ZNïë­¦¦&!!¡âââ .¨©©IJJ:::fffnÚ´ISS3;;;00°ªªjîܹ¶¶¶&Lhhhˆ‰‰aì†ú×_8qï_Ò××ñâœH$¾}ûöäÉ“ªªª’’’aaa±±±666jjjµµµ×®]ËÏÏÇçZ‘Éd''§ŽŽŽÖÖÖôôt qqñ­[·fff:::jjjfeeÅÄÄtM~àñ·mÛ–’’²páBuuõ7oÞàUއ‡F;~ü8BÈÁÁaøðááá᡾âäää0õ= Ò(tÿOggçš5kž={&//ß×94MYY?–’’b¬wttÜ´i“˜˜XKK‹¬¬lSS“§§§ÏáÇÛÚÚóŽG޹sçNü’åË—oܸQFF†D"ÉÊÊnÚ´ ÿÏúüüüñãÇ«©©>}º¦¦æØ±cöööý¤W<½–Aý¼döü¾^ž>}º¯ÄæÌ™ƒ¨««GDD¦¤¤œ?~Ú´i¡ Èˡ††®]»VAAáþýû%%%ªªª‹/^´h~¡Amm-êÒ¿Ò3¸’’Ò¹sç0 ‹ýþý{dd$ãœÒÒÒââb2™üþýûÈÈÈÜÜ\†÷²P(”ÒÒÒÇwÍGNNîðáÃÌÆomm}ôèÑþýûW­Z…·ïÛ·/66våÊ•ùùùx‹ªª*cú¾âŒ9’…B€B+V¬HII>|¸¨¨è?ÿüchhØó´ˆˆÆqHHãØÄÄÄÄĤçù]ÏéfÁ‚øJ7·nÝš;wîüùóÉd²···‡‡Ç¿ÿþëééÙWÀÅÉ:—.]êë­ˆˆYYYqqq==="‘˜››‹ê:Å„D"uvvŠˆˆ“¦¹¹Y[[;44TVVÖÃÃB¡,Y²äòåËׯ_733«««{úôéÛ·o“’’jjjZ[[‰DbVVVee%þ€€—/_.\¸POOÏÅÅÅÎÎNQQñãÇ/^D=~ü˜©øcÆŒ;v¬“““ººú»wïC`"""¡»wïJHH\¿~!”žž¾pḸ¸žqŠŠŠ˜ú²²²~úð%(têètú† =z„W9ZZZÎÎΦ¦¦®®®?9™½{÷®^½Z^^ÞÄÄäåË—óçÏÿý÷ßmll$%%~r>¬‰ŽŽFíÚµ !dnnކ;w.<<ü÷߯­­UWWß¾}»½½ýû÷ïÉdrbbâ—/_H$Ò˜1c¢££ñ_w„И1c6mÚÛÒÒ¢¥¥ekk‹÷!íܹsÔ¨Qþù§ŸŸßǽ½½###•””®^½š˜˜ˆOæupp——WRRÚ½{÷… žÃfàññÉÔøÌ›ÚÚZUUUssó¿þú !4~üøÅ‹=z”N§ã#žžžžvvvÛ·oï§¶¶–©ïáçÿYŸÂBÎÎÎ]»£À‘#Gòóó{>ºCðÌ›7/%%EQQ‘Û‰>æááqñâÅáÇ߽{wôèÑxã±cÇž>}úèÑ£Ÿ9pðöíÛyóæ½~ýº¾¾~Á‚øXBèÎ;vvv¡‹/.^¼ø§å3¿þúëï¿ÿŽÏθÔÔÔ 6à ¬¸ BMž<ùåË—]éBÅÅÅ+V¬èöKÁcmmkllÌíD‚‚ÂÌ™3ããã{¾cŸ iaaa/^MHH`T9!777 Ãüüü~Z&_¾|Y´hÑ©S§$%%•••ñ‘œ¥¥ehh(N߸qã«W¯~ZJ€Yøbr|PéŸþáv: …CÙÝ»wýýý B\\cQ ŽH$^¾|ùêÕ«Œ-<UYYÙŒ3¼¼¼fÍš…6lX· ­vvv®®®«V­*))ù )äåå9::ž8q!äïïÏít@ †¬‚‚|ÊKpp°……EÏÄÅÅ“’’©Têàeòöí[ccã 60öKß¹sgÏGñîÝ»×ÒÒ²®®ÎÆÆ¦©©iðò,3fL~~~QQQQQQJJ ·Ó!(tšêëëmllÚÚÚ–/_¾iÓ¦¾NSPPxðàAMM±±qvv6ÇÓèììÜ¿ÿŒ3N:åèèÈh/((>|x·“ ™3g´µµ ú²0@¡ÀC§ÓœœJJJLLL~¸AHHèâÅ‹®®®sæÌÙ¼y3c;IösHHH3fÌ£G222æÎÛõÝÛ·oã{‚vƒÏ%yôèÑ©S§8’ @°A¡Àsúô餤$™˜˜Æý[¾|yFF†¤¤¤¾¾¾­­í³gÏ»\1«©©)22ÒÈÈèàÁƒû÷ï¿qãF·µ94 Ã0!!¡^/ÇwP'þþþoÞ¼a-ÀÐ…CË»wïöíÛ‡aØÅ‹›9 „ŒŒŒŸŸ_VV–žžžŽŽŽ§§ç;wš››x-NÏËË;yò¤•••’’ÒãÇ>|8cÆŒž'geeõúÄdssómÛ¶µ··¯_¿þ‡†8x` CHkkë† ÚÛÛñŽ˜5|øpgggggç—/_fdd„‡‡ÛØØ(((èêêêëëKKKKHHÈÈÈ´´´455ÕÕÕUTTæåå9rêÔ©Ë—/?þ<þ¤à¾TVVjjjöŸÆÞ½{Ÿ={–™™¹sçΓ'O²ðAC: !ïß¿700øïÿËf¨É“'Ož<ÙÕÕ•N§—––~üø±°°°±±±¼¼üÝ»w$IBBBVVVGGÇÁÁA__ŸD" 0²¥¥åþóŸþÏÁ0ìòåË&&&W®\Y´hQÿ=@ƒ­¢¢¢££ƒ‹ €þ êšAÀû Ð`¨xýúõ™3gˆDâ¹sç^vü†a3gÎäHÀÊÊÊ|Ç0ìäÉ“}-Ûæ†zô(;V¯^^XX·fÍN%Ö?þøcÙ²e|1Ñ{È ßµk:C: >\¿~D"y{{s;&<}úT[[{Ĉ,GÀ0Ì×××ÎÎ.88xåÊ•?çéˆ666JJJ?áF€5gÏžåv €›`Ž($$„J¥®_¿ž¿~€?þîÝ;6ƒXZZTTTüñÇÉ À× Ð@ÐݺuKDDÄÝÝÛ¹0gúôélÁ0 ïÇ:zô(l €BAsìØ1*•jggÇ_Ý9!eeeöã,\¸ÐÀÀ ´´ôÚµkìGð5(t(×®]Þ¶m·saNyyù£G8 Ã0|™zXXFãHLŸ‚BrâĉÎÎΕ+Wª¨¨p;æddd\¹r…SÑ/^¬¥¥õáÇ{÷îq*&€A¡€àøþý{LL @puuåv.L#“É¿ýö§¢‰D¼O+<<œS1ü Ç… ZZZæÏŸ¯££Ãí\˜fll¼hÑ"´¶¶VPPxõêì~ÀP…¢½½ýÌ™3¡­[·r;V}úD¡PÔÕÕ===,X0}úôòòrKKËgÏž566êëëûúúŽ?!sùòåÒÒR111--­5kÖ,]º”ãß$| ø^CCCBB‘HÜ´i·saÑ£GŒŒŒ)øÆ_½zååå…?E³~¸'öøñã=:|øðž-Û·o×ÕÕ=qâ„§§§©©é®]»NŸ>ÝÐÐ@&“œœ:::Z[[ÓÓÓ=<<,,,÷îÝûæÍ99¹„„„Í›7§§§çååØÚÚN˜0¡¡¡!&&¦¡¡ãþ…|/>>¾µµuîܹÙ?+6lØ ##3HÁ­¬¬vïÞýýûw999!!!ŒsB?~ìÿ¢K–,éµ…L&#„\\\ÜÜÜ0 ³µµE½zõ*22277—F£‰D*•J¡PÔÔÔBW®\QUUEIJJnܸ±Ï÷ IDAT®®näÈ‘ ÷ïß/))QUU]¼x1gWéÀï Ð€ï={!dggÇíDX÷믿^p‰4zôè/^¬X±"88˜³ÁÙß…!´fͼlBUVV®_¿~Ò¤IáááÏŸ?ŠŠbœÉX˜†ŸO§Ó%$$ÄÛkjjZ[[‰DbVVV||<¾/éË—/?}ú„zñâ>«ïIzÿþ=>˜•žž.%%E&“ Z[[¹ò1àAУ‹EY[[Ưÿ8¾}ûvPoñàÁƒ ¼yóæÞ½{Ý’~‚––WW×úúz„Ю]»TUUSRRB•••x#BHQQ1--ÍÈÈh÷îÝ.\xòä‰ŠŠŠ¡¡áÓ§O322žF›1c~ljjŠ÷~Á& PèÀ—nÞ¼I£ÑæÍ›ÇxT.Ÿ*((ÔHcccC{aåÊ•¡²²²wïÞ ÞM¼ øÒ­[·BË–-ãv"ìrwwwww¤à©©©ÕÕÕ][#}·oߤ›x :ðŸêêêôôtQQÑ9sæp;vÑétiiéA ~àÀ÷ïßwm7n¾õi||ü ÝÀSàÉÈðŸ{÷îÑh´Ù³g‹ˆˆp;výòË/ïÞ½¤- TTT&OžÜµÃ0kkë°°°ÏŸ?ikkãímmm‰‰‰#GŽ433cö.|½ÿÆPPWWÇí7Á?œð|Qss3·a×·oßDDDoc¦óçÏ÷l\±bEXXBèÎ;ÎÎÎ>LHHHNNniiaáY‚÷ïßïììä@®`0ÉÈÈp;À5PèÀgŸ={†aXzz:NÇ0ŒÛ±N^^>//o‚GGG[XXhiiuk×××WSS+++ ëºKCCƒÙ»¨©©±›(`0ÁøÌýû÷ÛÛÛétzsssYY·ÓaK}}=0Xÿ:qâ•JíÚB£Ñž?îååU[[‹jhhhllœ2eJXX@ Pµ x G~B¥R/óóóÕÕÕ¹˜›‚ƒƒÉdòæÍ›9™F£­[·NWW™••uýúõ[·nUVVâ-cÇŽµ¶¶^µj•¦¦fEE…»»ûÈ‘#ù}­> '(tàt:ÝÍÍ­¬¬LZZzÖ¬Y7nÜÈÏÏŸ7o·ób]GGǨQ£#2@ðððÀÏœ9³{÷nüXWW×ÚÚÚÚÚzôèÑŒ“?}ú„ÒÔÔŒLÜCWð __ß+W®HHHò«W¯ãáÎ ¥  €L&÷u‚““Ó¡C‡ètú–-["""ZZZªªªDDDºÎé X^zúô©½½}GG‡˜˜XEEÅ“'OÌÍ͉D"ã~ïÑñðð8sæŒgʉ‰ååå ÷sŽƒƒƒ§§ç¶mÛ>þL§Ó544X~ÆtSSS[[kׂŸcذaƒ·w,àqPèÀ£0 [¾|ù½{÷êêêŽ9räÈ‘áÇ/X°ÀÒÒrþüùÒÒÒüÞ£C&“{jrÐçÏŸ2ÛÆÎÎnذa®®®‡FìMÐqwwðà~üxéÒ%kkk999ÄŸÓt’’’£GGNN.==©KÖ­[‡úúõ+Ç“ðº€äçç×ÕÕ!„ÌÍÍ%%%B‹/^¼x1F{õêUGG·dš††Æ`LÐùûï¿ÍÌ̘š.ƒ?q§¨¨ˆN§³<À³ Ð€àÝ9¡ tm'ƒô̽ÁÆxò!uttlذ!++‹©BGQQ‘L&tÛ `è >À(tøz¯ò®Ž?N¥R9³®®nÑ¢E²²²Ì^hjjŠzþü9góð(tà©©©!uuunçÂuuuÇïúL ŽPTTŒˆˆ`áÂ)S¦ „^¼xÁÙ|¼ x]qqñ÷ïßB–––ÜÎ…3:;;·nÝÊñ°'Nœ P(,\8yòd„ÐË—/9€û Ð€×1–u› Ã¿¼¼¼8³®®îرcBBB,\«¥¥%//_QQQ^^ÎÙ¬\…¼îáÇ! ‰qãÆq;θ}ûö?ÿüÃÙ˜»víb­ÐAásº_½zÅѤÜ…¼Ÿ$K$322¸ gÄÅÅq¼ïDAAaË–-,_>qâDÔ¥óŒãf̘¡­­ÍȰ­­ÍÔÔTGGçâÅ‹LÅIMMÕîMMMM_—¼~ýú·ß~ÓÓÓ›4i’½½}×¾´üü|“–––>ü xZss3þ,»úúúêêjn§Ã¶¶¶ï²µµmmmeùr„Ðëׯ9—Ñÿáàà€zôèQQQB(>>¾ººšN§ãÓƒ˜²mÛ¶®}ùöíÛúõë%%%<¸~ýú¬¬¬®%fMMM]]]SS 9À/à9:ð´7oÞÐéôÑ£Gëëës;Îàød£>äää°³áר±c‡ öÏ?ÿ´µµ Æöœjjj!‘Ó§OGEE‰‰‰Q(99¹ìì쀀€OŸ>Q(uuuOOÏ ˜ššVWWOœ81??ŸB¡hhhØÛÛ¯^½š@ „f̘ýYXXà€‰ÄÖÖÖS§N%&&VWW“ÉäÕ«WÛØØ|úô©¥¥eçÎøÿy0 ûüù3žÒܹs?}ú„þ·èlذañññFFF½Æ![·nMNNF;v,&&&??ßÊÊ*00077·gþ¡òòrÿ/^‰D55µ‚‚ ÃTTTbbbJKKåääfÏžíáá!##Ãñ/(tàioÞ¼AMŸ>}Ú´iÜÎ…3>þüàÁGGGÆTVV e'‚¨¨¨¾¾~NNÎÛ·oGE¡PZZZ( ~ÐÜÜÜÒÒÂ8 P(Œ …’››;ÀŽ™uëÖ?^IIéË—/®®®ááá!2™ìääÔÑÑÑÚÚšžžîááaaaáààpàÀwïÞmÚ´ICC#33Óßß¿¦¦fÓ¦MG>|8#æøñãñ‡ÌÌÌM›6ijjfggVUU¹¸¸¨««¯[·nêÔ©cÆŒ™1c†®®.~ahhè_ýuâĉ)))!!!¼rqqégûöíÛ·o×ÕÕ=qâ„§§§©©é®]»NŸ>ÝÐÐÐkþ¶¶¶4mïÞ½ åøñã¡Ã‡¿~ý:,,ÌÆÆFMM­¶¶öÚµkùùùW¯^eço@ÿ Ð€§eff"„;z €œœœ§OŸr¶Ð‘””œ1c›AŒsrrÜÝÝ ˜ºPTTt€g®^½úÖ­[gΜ™?þرcñÆ÷ïßGFFæææÒh4"‘H¥R) ¾?ÆÑ£GgÍš…Z´h‘´´ôÙ³g—,YÒíîK–,yÿþ}JJÊùóçñ‚xÁ‚òòò¡¡¡îîî7n܈MOOˆˆ8pà€££ã®]»Bµµµ! F2}Å!“ÉÆÆÆ!777 ÃlmmB¯^½ê™ÿ?ÿüSZZúÇàc‚"""¾¾¾fffAAAß¿ŒŒdä_ZZZ\\L&“™úÎ8(tàiYYY!üF0Œ;ß‹”SÚÛÛ§L™’‘‘ÁæÇŽ{éÒ¥ÖÖV111QQQQQQqqñžø»Œ–¨¨¨Þ‚D"mÙ²eÿþý^^^eee¡ÊÊÊõë×Oš4)<<\BBâùóç]£III1އÞÑÑÑÙÙÙëʲöövôK.‰ÔÙÙ™‘‘ññãG:~òäIWW׾г¾âP©ÔaÃþßïÅš5k›‚õŸ?NÇh4ã`ìØ±;vìèzS%%¥|q° xWMMMyy¹¬¬¬¦¦&·sá555| §dddÈÉɱÿœe¼ÛŒD"áÅåÀ%$$üð|f̳gÏæÏŸokk›ŸŸß%??¿µµ•H$feeUVVâ-|ùò¥´´4BÈÉÉÉÁÁASS3777::zÕªUx ’––†_Ž/Â222244?~¼³³ó† ÔÕÕssscbb¬­­Ÿ?~þüy ÃÌÍÍëëësssåää„……ñ¬ðÉ1±±±ššš¯_¿¾wï^HHH¯qH$Rff&ã¦RRRŠŠŠFFF555½æ?þ|MMÍíÛ·;99µ´´œ8q¿£µµuTTÔõë×ÍÌÌêêêž>}úöíÛ¤¤$111¦¾s xWvv6Bh̘1‚´«¶‹‹‹ÏÈ‘#9ÐÌÌìÌ™3ìÇQWW'‘HEEE …ã¿»gÏžEíØ±ÃÁÁa÷îÝ[¶l©¨¨À0¬¥¥e÷îÝ.\xòä‰ŠŠŠ¡¡áÓ§O322æÌ™ƒš6mZLLLmm­††ÆŽ;ìììB---®®®õõõ¡]»v©ªª¦¤¤`vîܹðððßÿ½¶¶V]]}ûöíöööüñÇÈ‘#ÏŸ?(,,lbbrñâEFQ8f̘M›6ÅÆÆ¶´´hiiÙÚÚNž‰ŠŠŽ1¯)9¾ ºmñ©+W®p;`è ^•——G§Óõõõñ‡á †ÌÌLv6jè)55•ýï'""">>!4zôh"‘˜ŸŸßÙÙɉìÜ'8ÿ@Àäåå!„ ¹'y{{/[¶ŒSÑÞ¿ïááÁ~œ±cÇ®Zµ !$**J&“ÛÚÚð)2CWð(|ÅÀÀ€µËŸ?¾{÷î¹sçúùù¥¥¥íܹsÑ¢E>>>«W¯ÖÐÐ@¥¦¦ZXX „ÊÊÊbccûj zðà™™†a4MDDÄÛÛ›åÝ deeY»°Wß¾}³²²b?κuëÇEEEïÞ½5jû‘\…<êÝ»w!–7ò455533óóóC™™™Mš4ÉÇÇ!¤¢¢‚¯îöôôļ½½ûi÷óóknnf,/**:|ø0–YÍÍÍ&&&øçâ3333336ƒøùùmÛ¶ñp^}}ýÛ·oçåå-]º”íÜCWð(|WjŽ/·QVVîÖ‚ÿÆ÷ÕÞ¶¶vCCk·þðáöO¥RïܹÃfªªª¸¸¸®»gã•e~~>›‘<ztàE•••õõõÊÊÊ]ƒ™UVV†÷Ê „ÊËËñ//¯n§¹»»÷ÓÞÍ•+WX~€¡‘‘—ᤥ¥:uÊÒÒ’ 222§OŸî:‡W–Ìîë àYPèÀ‹ðZ===v‚¨©©1†œ<==YŽƒL†a6kÖ¬™3g²Šƒ;?HJJâ[°CTTtöìÙ][455I$ÒçÏŸ[[[EDDçåË—l& ¾*² Ð€áãVl:œÒµ`b‡½½ýºuëº,366fsS÷W¯^…††þþûï]‰D¢¶¶v^^Þ‡~ýõ×Ä™|ø€ÒÑÑa9BpppZZZPPB(---==ÝÇÇïà òööNOO÷ööî:¥×ö   ´´4ooo???6Ÿõ÷äÉN•n)))÷ïßg3H```¯5Š®®.B¨°°Íø^=:ð"ö oooÆLd33³´´4Æ[}-ïµÝÏϵÅäÝ´·· qê)ÏÆÆÆªªªìD(**ÒÔÔìu:èÑ€ç444ÔÔÔHKK+**r;Žyüø1›#M]iiiMž<™;vìHJJêõ-mmmô¿ýÃü xNQQBHKK‹Û‰pR]]§Æ­Þ¿äÈv"Ðh4 …Ò×U--- Ã>~üH§ÓÙ¹ €ÀÐ<ïK°BÇÚÚšS¡=zT]]ÍNœœÜ×»âââÊÊÊUUU_¾|1bÄ£}øðÖ–ó8|3ng¸ xŽ@::::D"‘ýPëÖ­«««cùr:îãã $$Ô×9¿üòKUUÕ§OŸRèXZZJII ÿ:åQ­­­ÒÒÒ?æv"€;àŸLxNqq1Bè—_~áv"œôŸÿü'==]NNŽýP’’’’’’,_þòå˧OŸöSå „ÈdrZZZqqñ÷ÒŠ‰‰QPP`9%0¨rrr¸à˜£ÏÁ Aêi§P( ©rRRRvíÚÅN555ÿþÏÁ»Ó>}úÄμztà9%%%!MMM.çÁ9bbb/^¼àH¨gÏž±¹MUUõ‡KÓñ/ÿCø:ð–æææšš yyynçÂ1%%%œúD~~~ÍÍÍ,_~ýúõ–––uëÖõš††‚BCWð–ÒÒRô¿Zqîܹ¸¸8öã´´´Ðh4qqq–#ÄÆÆ>ü‡§á=:øßÀנЀ·|þü \¡3bĈ±cDz'11ÑÑÑ‘W¯^;wîO“•••””¬­­mjjbçv®ƒBÞ‚oG¥¦¦ÆíD8iëÖ­æææìÇù÷ßgΜÉòå%%%ÂÂÂý¯·bPWWGÿûsøÌÑ€·à=:ø¯l_‚‚‚>>$é'¥Ø›ÀÀÀ={öôúV[[ÛÛ·o'MšÄþ]œœœX¾–N§[YY%$$ ðEjjjyyyeee£Gfù¦®ƒBÞR^^Ž~Ô£ƒOÈ Æ_†……±¹èšM ¥¯·>}úäááñüùs6oñåË6räHÖ.¯¨¨9räÀȯÌÂÿþ…¼¥¢¢ýïWv€tuukkkBííí¡¡¡ß¾}Ã0¬­­ÍÊÊjÆŒø9×®]{ñâ…ˆˆÈ÷ïßutt222_¿~ýæÍ›¸¸¸êêê°°°ÒÒÒØØØ~⤧§gggËÈÈ´··—””à礥¥16KŸ={ö¬Y³éafeeÅþ7síÚµŠŠŠƒ²v¹ªªê½{÷~>^kÂÐü x Þ… ¢¢2Àó©Tjdd¤B(<<|íÚµŒkCCC•””ôõõïܹӨØxìØ1¼ýÂ… ß¾}›9sæÌ™3wìØRTT}zyy9‰Dº}û¶££cYY‰Dºqã›Û¹'''»ººR©Ô/^0»Å´iÓ5œˆˆÈĉ˜êG€_@¡©ªª¢ÑhÊÊʆõ¦ššÞƒòòåËK—.YXXˆˆˆ(**öÕ­Ò Fëçݾâèêê9r¿üåË—!!!>>>?¼×±cÇBCCÙ,trssÛÛÛÇÏÚå¿üò ³™ñÉ@éÑqttÜ»woHH™LŽŠŠJJJ —`3¬¹¹¹‹‹ËñãÇY¸ÖÎÎîÀ!!!RRR555QQQ[¶l¹{÷.›)Àƒ`y9<¤ªª !4³&OžìîîŽÏ\7n\¯Ïå³°°8þ<ãå… ª««ñ㎎ü 77·¨¨?î+£¬!cÇŽíÚëÓÔÔD§Ó{ÍpÅŠ:::ÿD½Š‹‹KMMeùò)S¦L™2…©Kðr³´´táÂ… ,˜7oÞܹsgÏžùMŸ>}Ú´iS§N577ÿᓚñé>“&M"‰:::øœ°°0B(66vîܹzzzfff{÷îýþý;~Ivvöo¿ýfll>>žžžòòò£FRSS;{ö¬——Wdd¤›››„„„ˆˆˆ’’Ò¬Y³´´´¬¬¬bcc·mÛ&%%E£ÑLMMñ9=!KKË-[¶ >\]]]HHhÏž=žžž}Å¡Óéûöíkoo§ÑhmmmŒ”–,Y²mÛ6iiiaaa{{{iiiü-gggö¿™Ù³g³ül¡ÈÈÈqãÆ1»¾]XXXNNîÛ·o?Ü¥KTTt ›ššðG0V¨………ÅÆÆÚØØ¨©©ÕÖÖ^»v-??ÿêÕ«!2™ìääÔÑÑÑÚÚšžžîááaaa!..¾uëÖÌÌLGGGMMͬ¬¬˜˜}º¡¡‘’Pqqñ… ÔÔÔ$%%ûºo¯qž={`kk;a„†††˜˜22277—F£‰D*•J¡PJKK?~|þüùiÓ¦!„,X ''wøðáøøx„P¯qÈd²±±1BÈÅÅÅÍÍ Ã0[[Ûž)©««GDD`Öë}ÅÅÅ{óíÛ7…û÷ï—””¨ªª.^¼ÿ*úù\ýçÀ`€B‚÷è°?o—w<}ú´¨¨ˆÍBçþýû†Í›7…k1 ;|ø0k˾ð1)…qãÆõs0 9222¡ìììC‡!„h4ÚØ±cñ…o JJJ•••ëׯŸ4i>•çùóçQQQ¡––„œœãdÆä^ãt}¹fÍšž¿"""deeÅÅÅõôôˆDb_÷í+ޏ¸øÁƒ‰DbiiieeebbbrrrBBB_Ÿë‡ù0 Ð€‡|ýúõøIଠ  æææ´´´Ç³ÜM2p&L044d3HBBÂôéÓY»¶³³“µ !4gΜøøx¼údÇ»wïðL&L˜PRRÒÚÚŠjhh°¶¶ŽŠŠº~ýº™™Y]]ÝÓ§Oß¾}›””TSSÓÚÚJ$³²²*++ñ%r/_¾\¸p¡žžž‹‹‹¢¢âÇ/^¼ˆ?~|fffÏ8bbb™™™YYY¡ÔÔT)))EEE###„ÐÇBMMMD"QAAH$"„úº¯¥¥e¯qÞ¼yãââboo?jÔ(‰¤¨¨˜žžÞÚÚÚ×çê':ð|ް¢¢âàÝÂÏÏoð‚÷Ô_ÈíÚµKVV–… ŒŒÞ¿?Àý­ºJLLÄ^1&n³ìòåË¡íÛ·ëèèlÚ´©¼¼ðÔÔÔíÛ·KII]½z511QLLLKKËÁÁA^^^IIi÷îÝ.\xòä‰ŠŠŠ¡¡áÓ§O322,--/_¾|ìØ±³gÏ~ûömذaŠŠŠ êêê3fÌè!äáá¯Çœ­¨¨˜––†aXtt4£ÑÜÜ/˜ŒŒŒúºo¯qdeeÉdrbbâ—/_H$Ò˜1c¢££ÅÄÄúú\ýäÃæ7 @? Ð€‡ÔÔÔ A.t~2àà`v‚àK„XðæÍ›éÓ§³På¼~ýzß¾}èÝlìHKKc§¤¤t}kË–-]§F1888àwïFVV600000°ç[½Æék©Z_í}Ý·×óõõõ{¶„¾>;Kç` ,/€‡ü„Ÿ©±±1!!ÍÝF###¯]»ÆÚµÓ¦M;{ö, Òét???|²Ô·oßX»;€@¡¯ ÓéµµµµaD :ÄæÀDrr2k_HUUÕ·oßðÙ'Ì211Y¶l>ÚÂþЀ‹ Ð€W444´··ËÊÊ26“âwâââììÛ€»víÚÔ©SY¸ðìÙ³'OždáB??¿÷ïß#„ðB§ës| x>DÒuñ0¿»téR·))Ì¢P(BBB¬ ~ihht}tÐUUUÅÅÅáÓ¡Ð@@¡¯ø÷ß‘`:=jlld'BPPctfÙÙÙ±0‹YYYùÚµk’’’!|È ø:ð ¼Ð>|8·AgΜñööf¡;¤SSSv"äääLœ8‘… =ÊÂÆã4 t/BHHHHZZº­­í‡»Yx–€L@à…›3‘_½zO"‘h4š´´4…B `6ÈæÍ›BÞÞÞìd‚bíyÄ]ݽ{·¯½BûQ__òäÉ^—I÷ïäÉ“`´ >¼¾¾þßÿg6€@¡¯Àwxf§Ð),,LHH8|ø0¾Ð©¢¢ÂÓÓ“cù1©¤¤äÔ©Sø^,G1b t„……CCC»Š\aaa·ºß´¡®®Žå-EÜ…¼‚ý¡«‹/îÙ³‡±œ[EE··ïèèØ·oŸŽŽNaa¡¿¿¿þ0ÜÈÈÈ’’ Ãèt:•J=räH?ñÛÛÛCCC¿}û†aX[[›••U?›H”••±üYB³g϶±±aöBQQQ+++îˆ?/¸+¼îÄkÐ~\¸pABB‚…;‚Ÿ€ýM<_ƒB^ÿšâ]¬éììì6¢¥¥…:qâÄþýûuttBººº»wïFýñÇêêêNNN¡ÖÖV77·þ㇇‡¯]»VEEª¤¤¤¯¯ßëÉS§NÅïÎ2ÖëŽèý+,,ôññ¹~ý:SWuvvzyy?~¼[;þ稯¯ïçÚ7677Óh4fS?‡¢¢"›sÅ_ƒB^ÿš²0àÂÐ×o­¤¤¤ŒŒLYY™ššZMM¨¨¨””Bèõë×GÅÏ9}útÿñïß¿ßu R{{{NNN_…ޏ¸8^Z±¬gÿÊ@ܸqƒ…}"ûÚ¼ÿsôߣÓm›nOB^Á~¡#$$TWW×ë,Ÿ7žÂXQQ188x€É¬X±"((hÔ¨Q<¿›gÏžikkã›00e×®]MMMÌ^5sæLÆb«®ð?GCC³<–—À+ð_Sv wwwÿ––üeuuõ† êêêB †•••ÕÕÕ1Æž =z„·´´¬_¿¾ªªªŸøãÆ‹‹‹`2™™™ìlÚòîÝ;f¯*//§ÑhøSp®³³sĈ½vM ¤GÀË G^?[Ùé®”””ÜÜÜöìÙ#,,L¥R‰Dâ¡C‡<«V­:sæ ã|{{ûãÇ'''Óéô†††mÛ¶1!´oß¾¶¶¶´´4|…¹’’’»»;BÈËË+22ÒÍÍMBBBDDDIIiÖ¬Y}MĹwï;+È”••ÍÍÍ™½ÊÏÏoΜ9kÖ¬aêªyóæEDDôºãƒø:ð ü×”B!D&“ûZ95bĈñãÇ2Z0 Ã+˜nöíÛ×k ܘ ›Ñaa×q:þéÓ'f×[···÷5Ćÿ9X ðº€W࿦l:ýHLL\ºté ïæÒ¥Kêêêmmm¬]STTÄìU†¥¦¦2ûd?2™œ’’Ò×ü$|Ñ8›Y¸ xEss3†abbbèíí}øðá¿þú‹B¡p<~OYYYµÍ8B'Ožlmmeöª£G2[Z–••‰Ä¾NÀ èÑ€ÁÐ<¡­­­½½]\\œ@àü~ìÙ³‡ã1ûæêêÊòå666]‡ØâÝ»w111L]daaÑÏfx¡Óÿ^W>>>0‰‡Ç©©©íÚµ‹ÛYî€Bž€w´ FwW477ÿòË/,_Îl½‚’’’ò÷÷g¶L”——·µµíç| ¬ÿBçÆöööðddžU^^~ÿþ}(t†,(tà x¡#;G¶¶¶jhh\¾|yÁ‚,\Žoœn``ÀÔUªªªªªªÌÞëØ±cýŸ€—ž?ï³²²RPP`öîàçÈÉÉIOOçv€k`ŽÌÖá¼]Á‚@¡€ˆî£+IIÉ#FÜ»wQâëë«­­Í#»‹ÖÖV555â½{÷î©S§ˆ×§Óéûöíãw}}ÂD:<ÐÝ„иqãnݺ…¿¾~ýzBBBPPñÓ544 ùz¥ªªºråJâõÅÄÄ|}}‡Nü„„„BV] ¢ Ð@(P©Tôß=UD3æÑ£GT*õóçÏË–-;w’ñÓ‹‹‹ùºâ!CÆG¼~ccãôéÓùºú/úü%stFeð~WÑ:„>` ...èŽtœººº¾¾~RRÒÌ™3×­[7hÐ âç666¦¦¦ò5;:::##ƒxýÔÔÔŽíîƒ)---?þ¬­­­¬¬,---...,,ÌËËËÎÎ&>Ø´gÏ„˜˜Xttt:à:üf)Ò#:¡±cÇÎ;·gÏž|ØÜÜ}úÓ§Oy—ð7íÿªÐeà_wn!4nܸ˜˜˜àà`~OìÑ£G||<ñú†ùøøðµ-!¿±ƒººúÇeddddd$%%¥¤¤¤¤¤ðøÿæççlŠF£EEEÙÚÚ.X°àܹsׯ_Ÿ7o†ad29$$¤{÷‰¬¨¨àV7wî\--­ŠŠŠ˜˜˜ïß¿åççïÞ½ÛÍÍÍÊʪ±±1<<¼©© !Ä­€¿:|)¨:âââ;vì ’Z…MHHˆ Áú†Íš5‹xûgΜ™3gŽ¢¢"_½¢Ñh¡¡¡ø—rãÆ [[[ŽÕŒŒŒ6xÿþýÊÊÊ¥K—*))ÆÄÄÌ›7¯°°ðÕ«W7oÞÄWœõíÛ—L&ÛÚÚr+ßµkW}}ý‰'ÍÞ½{—L&kiiijjÞ½{÷Ó§OÚÚÚ“'O6lBˆ[9 t †!Ñt®]»Æ×d\MMMQQ‘Áúd2ÙÜÜ<77—`ÆŒâââÇÏ›7ߎ:u*%%_†AŽÚ¿ÿþýûñ’œœöj^^^¡òòrŽå†ÙÚÚúøø0’••Ý·oŸ„„DIIÉ·oßnݺõðáëW¯r+çk¢ „~õ{¥¥¥¦¦&¿ga¶uëV‚õsrrLMM‰çSTT<|ø°œœ¿6lØÄ‰ñ¢óÎdz²²lmm]]]ÕÕÕsrr‚ƒƒCBB¶oß®§§çãããææ¦®®^[[oll¼mÛ6Žå³fÍ »qã†]MMÍ“'OÞ¿Ÿššš››ëåååææfhh¨«««¡¡‘™™ÙÚÚúúõkŽåÑü% Ðü2NNN8KNNníÚµÄëÛÙÙÅÄᝮ®>eÊ~{ÕÚÚŠ/ûUÑ'¾Þ*33ÓÂÂbòäɾ¾¾­­­‰‰‰FFF‘‘‘û÷ï?vìXCCƒ’’’Í‚ $$$8–ëéé)**ÆÅÅ]½zUAA¡ÿþ^^^ÊÊÊúúú gΜ‘––677?þ¼¬¬,·ò_ò¡~è~ ²jÕ*~O´°° "¸#NMM„„ñd;wî´¶¶ž}*&&6~üø¡ÿéÕ«·étúöíÛ‰ïÓC<$b´_TTľÍq×HCÀ_ þ€PÀï£"=¢3fÌ"5mllêëëW¯^}íÚµêêêëׯ<ØÇÇgÆ <ÖÉÊÊœ†ŒaØÌ™3ëêêˆv!„ÐéÓ§9®çjkkCIJJòÕ@H@ €PÀï£ø=Uåææž9s†`e;;»´´4ü5‰D255mmm522:{ö,·ÅMeeeÖÖÖÛüøquuu·nÝÖÇÕÖÖ2–”3ãO˜Œ €ˆ‚ÁX„èP(Aw¤ƒ²³³ß¾}K°²­­íòåËét:>ñ%!!áèÑ£÷ïßç±BêêÕ«#GŽ$ؾ£££žžÁÊ ›7oæXŽGŸRRR<Îuvv†õçB‹J¥öîÝ[нB¿ŠîˆÎ˜1cˆçWQQéÑ£G~~þ€rss—.]zùòe---§¬\¹²¦¦†HãeeešššÄS„"„222¢££ƒ‚‚8Å£Oiiin§§¦¦Šôr¹¿` º®¦OŸÎ×ä_<ͤ³³óâÅ‹ÛMºwïÞÓ§Oi¶­­­²²rÚ´iÄ{‚ºté%Zx C ³ÆÆÆû÷ïóî9èo T Ð@(ÈÊÊ"‘ t$%%ãââøÚRoÚ´iÎÎÎG%R933S]]½Ýj_¾|¹wïñ> „|}}_¼xÁ£†ad2YJJ V] ¢ Ð@(àOFZZZÝ‘Ž:t(ñút:ýÆçÎkw˜¤µµõĉÿ,ÁÁÁ¯^½"Þ „ƒƒÃ† xwÁs+D:‘Ñ މ‰!^ÿùóçÁÁÁDÆHÂÃÃ÷ìÙCp4ÅÓÓsÙ²eû@¥Rétº««+ï`«¹¹ý÷íD:| ü¶*r²³³ùšÂ"''·dÉ"5I$’››‘ÆÛÚÚúöíKpeB(,,ŒÈô |0‰ßèáËË ø­ôçÏŸ‚îHGœí¶Ú£G‚—&‘H.\à7™þu𕯠T Ð@Xˆb ÓÔÔD¡PVNKK[»v-ÇC§OŸ®®®Æ_:thÛ¶mD<}úô´iÓˆÔ‘r„°á_MgŒ5Êà?oÞ¼!rÊû÷ïíììÈd2£dèС¢õ @à Ð@XàwSÆœ\áG¡P¦M›F0¥euuõ˜1c¸ÕÖÖþúõ+ãmtt´»»{\\œKÍ‚‚??¿÷ïß¹(†aÓ§Owvv&R™][[[}}½´´4ï\WDíÙ³!$&&FpZtUUUuu5sžW"±€: ‘›£SWWgooO0ÑÕÒ¥K,XÀí(s ó¿ÿýÏÏÏïúõëæææ/J£Ñˆ$–jll÷ññ!Ò=Žð±UUÕ·À0`À€êêj11±… &$$às•ž>>t:c‚¿Åÿ*x£ÑhQQQ¶¶¶ ,8wîÜõë×çÍ›7xð`Ÿ£G"„.\¨  püøq¼þ±cÇ?~|üøñ#GŽÈËËËÊʪ©©áãXŸ?öõõ•‘‘‰‰‰Y¾|yzzz@@@\\Üܹsµ´´***bbb¾ÿäéé¹mÛ¶œœœU«V©©©]»vmùòåbbðO\ð@a¡¤¤$%%U[[K¥R¹­6*oÞ¼QWW'²e_||ü‡¸UPTTÄ0lëÖ­ñññwîÜÑÔÔäXíØ±cÖÖÖ#FŒh÷Š åõëׇj·&7mmmxTSSΣ¦¬¬l»­Ý¿¿²²réÒ¥JJJ†††111óæÍ“••8p ^¡gÏž–––Œú&&&øÐΈ#X¦BGEEásuuõ… Ö××GGG××ן8q‚QçîÝ»d2¹wïÞ¡èèèž={"„”••.\ØÐЋÈÀ_Eþc À_‚D"©ªª–••ÕÖÖ±¸“'O:88Ì;·Ýšæýñ IDATjjjÆÆÆ¼ëôêÕëöíÛ Üµµµ9räŸþ±··o÷ŠRRRÉÉÉíVã¡­­MSS3//ÏÆÆfáÂ…bbb$‰ýI$‘„ðPiÿþýû÷ïÇKrrr ÔŽIIIá/ð=„ð&[[[–‡tŒX™±4£~. €è‚@!¢¡¡QVVVYY)ޱ±1c@‚·3fð®ðóçO''§•+WòHŸ)))imm½zõêv/i``À>‘™¸ïß¿kii9::>|øÐÆÆ†÷†¾¾¾¼[{øðaVV–­­­«««ººzNNNpppHHÈîÝ»ñ(äÖ­[222ñññ¡ÒÒR|w¹té’¶¶vZZÚãÇG…zöìÙ¸qã¾|ù’““ƒjllœ5kVXXØ7ìììjjjžyò„¿NÐU@ €Á***Ý‘ö½~ýúðáÃD‘#Gr›\ÌÀ;ÊAÝ»wO^^¾Ý(çǽ{÷îÌC«–––‘#Gâ¯ËËËBív Ì`‘!B¿§–•• º#íSVVvqq!RsĈ†††<*ÄÅÅ1ïÈÑŠ+Nž<É»Fsww¿wï‘^qtàÀ-[¶0ÞâgçGtB_Œ$9ssó… ¶[íÑ£G·oßæQF£íܹ³µµ•G°°0%%%Þ¿BMMMæææS¦Li·WÜzòôéSæ@ÿ"ð/ ¢ Ð@ˆˆÐˆÎÅ‹ñýôx»víÚ?xT R©žžžýúõãV¡ªªjóæÍ?~l÷ZÊÊÊAAAíVãˆF£‰‹‹ß»w_ÜN£ÑÜÜÜ~üø!..»Î Ò Ð@ˆhii! tŽ9Â{·víÚ‰'ò¨ --íååÅ£BCCƒ²²²µµ5ï ùøø¤¤¤´ÛŽš››GÅœ|£¢¢âæÍ›!|§œŽ5 è D455ÅÄÄÊËË…W7'''v«õíÛ—Çž@ C† aù° …¥…ׯ_óÞ*º¾¾>11‘yga¾dddXZZ2§(gÌç=» ü Ð@ˆˆ‹‹khhP("O…kÿþýíu„……EEEñ¨offÆÒŽ››Ûúõ닊ŠBÇ l7Ç‚²²rVVV‡sŒ=:00¹„±ÂßÄĤcm„:|˜¤´´TÐáåÙ³g>l·Ú½{÷Xò4±X°`ÁîÝ»Y ÅÄÄšššF=oÞ¼cÇŽ}þü™÷UnݺUVV&--ÝnØ¥¥¥áÎX‚-F Ã#)@$@ €pÁï¬ß¾}tGxyòäIvvv»Õ¢££¹­¯¯'‘Hìkšäåå§M›V^^îâ⢪ªš}ùòe–çY ÕÕÕk×®mhhà«ÿ8 ÃÜÝÝgÏžÍ~ˆñèªW¯^h <`Ã@„ ~gmw_Áš0a#µ$7ÍÍÍrrr<*(**²'Š’““kjj’‘‘Y²dÉâÅ‹>|°eËöœYòòòìØL‰”Íq(ˆè™‡„JJJRRRê@Àï&äÿf:—Þ½{#„JJJÝ^,,,Ú­ãïﯩ©¹bÅ n <È^.//ÿóçOü5‰Drtt¼}ûvII û\㊊Š=zL›6Ÿ¾ÿŸmÛ¶ÍŸ?Ÿ[¦¾Ft;™)ü>ÊÊʺºº‚î$t.øU˜:>þüˆˆÞ“‘óòò¦NÊ£B\\Çr|D][[;kÖ,qqñ°¤ü >~ü8#cq¯^½zôèÑÆ¹U`ÌÑÁãNÞBBBøíà9:ü_Ÿ_¾|tG¸*))yûöm»K®®]»Æcà'66¶¹¹™ã!<Ðy÷Idd$K”C§Ó8ЫW¯D9!KKËëׯóX¥…oe¤¢¢Òá•\!ÂEø]©ªªr|äÄìË—/d2™[0TSSãççG§Ó9•——oll¼wïÞˆ#Ö­[·k×.ö\žbbbùùù·nÝâ·ó ÞÞÞè¿ü©Üà#:D†sB„‹¼¼¼ººzSSïÌ ¤¨¨8nÜ8Þu8Ëíhkkëºuë8•––¾sçÎÂ… ###9.‰***òññéØ üåË—³$éÌÍÍMOO/**jllÄKñMŸûôéÓK„ ÌÑ@èôêÕ«ªªêóçÏjjj‚î ‡²··:t(:ªªª£FâvTKK‹GÚ‡ÖÖÖÆÆÆ¤¤$zôH]]}çÎ<ÎÝ·oŸ££#ïÇy@€¢¢¢fÍšÎ_ „KJJ BOúíàààíííééùèÑ#~ÙüÒÒÒÜV}ãBBBNœ8Áñ””Ô»wï$$8ÿg'!!aÕªUÜšõöönkkÓ××'ÞÕoß¾uïÞ}̘1D*ã)Ó/]ºtîܹ½{÷"„jjjÖ®]‹Ú¿·nÝxŸîíí­®®N¼oàOºqㆠ» æè D¾ÿ^TT¤ªª:pà@¼dÕªU .lll’‰ÉC† á±¢ !4sæLnk²®]»Æ¾Ç1Ö-[x<·Ú²eKZZñçVd2ùßÿå±i!»  „.^¼H£ÑB7n¬¬¬5j{Êt€@!‚'Á9r¤˜Øÿûÿfhh¨0LL¦P(_¾|á6•·zõjŽáÈëׯ÷ìÙÃí¬«W¯þüù“1ØöáÃü5†aäëÑC[[›ƒƒƒ››ñS¬­­ŒŒJKKïß¿Ÿšš&##@¼€‚@!‚:øs+™«W¯jhhà“Ô5„’’’*,,äöì !´uëÖÜÜ\އZZZ¼¼¼8Æ@6l P(Œ’ÔÔTŸªªªíÛ·:tˆÇP»ÒÒR…]»v?‡êœ:uÊÃÃÃ0___¾–„:<ÐaŸíÛ«W¯›7o’H¤#GŽÜ¾}[]C!2™Ì’Eœ†a±±±Ü¦ªØÙÙqÛ>‡N§oß¾]EE…QÒÐЭ©©9tèÐôôô£Gò¸.‹¬¬¬#Fà›.òkæÌ™’’’ FFF<òTD:‹âââoß¾iii#„0 ûðáCDD„···ƒƒ†a†yzz jÇä'NðÎ[~úôiŽS•“““™s)°èÙ³'Ë3¦ÆÆFƒ>þ\WW÷ðáÃÄ•×ÕÕ>}ºcKlÔÔÔŒ¥¤¤:Ð@¨Àª+„¾ÞJ[[{çÎÏŸ?OKKcÞ±FBBÂÜÜÜÊÊÊÊÊJ^^^ =¬®®fÌ’fG"‘¸­< 6mÇCÁÁÁ}úôaY<ßÐЀgÖìÓ§O||üÓ§O½½½CBB9.\ÇaF&“ .³â¦OŸ>/^¼0`ÀàÁƒ;Ó@H@ €°ÀwÐyñâÅ‹/˜Ë—/_>eÊ”ÊÊÊ ¨kÿgÿþý†q;:mÚ´;vp\r5þü±cDz—Óéôàà`ö‡qŒâ!eee‰¤¢¢Â{™÷Ö­[Ï|¢D´´´ „<<<:Ó@x@ €PÀ0,55UIIÉÂÂÂÊÊÊÚÚº°°ŸN«¯¯/ £ †Ñh4n3‘)ÊË—/¹íôÃ-«ƒ˜˜XzzºššKyCCƒ²²2B¨­­mïÞ½§OŸÞ³gÏÌ™3yt¯­­-777**ªýOÂÓÛ·oB666l $ Ð@(´µµ%$$ôïߟ±.‰197++KÊËËGÇìðYÇœ#""Øçî`öîÝ;|B3*•ÚÖÖ&++›½páÂ^½z%''ó^ÓN¥R%%%‰Ïãᦥ¥åÓ§OÒÒÒ}ûöídS!“‘ RRR†††Ì«¯MMMñ·/_¾\¿þŸÊÊJtJJJ8F9>|hhhèÙ³'û¡+W®pÌÚÔÔ$--½yóæ &¬Zµ*""‚w”S__?lذúúz¢4ÍØØ˜Çústt4øÏÉ“' öÇÆÆš†:t¨AUUÕ/ï]:)EEÅÞ½{#„>}úTSS#èî FGGs;:{öì¼¼<öò~ýú=zôˆãö9âââëÖ­c/ohhhllÌÊÊJII!²+qzzúèÑ£ñG]ôúõk„™™Yç›btðàA‰$..ƒï¿Ì[UUUmm-sÆPnKôÜ@ €ðRUUEaöêÕ+A÷}üø‘Ûæ4­­­d2™=> “Éd2™Û b—ádz—?yòäÌ™3±±±¼rp»ví>|x'' 3àŽ¹¹9Áúd2¹¡¡Çmffffµµµ†y{{—••%&&"„îß¿ohhh``P^^¾sçN|¼°7nÖ 2ÄÀÀÀÈÈ(77ŸµqãF+++“3f0ü ØÀÀ„>‡WSSSž^­_¿þÙ³gÉÈȼzõŠ}ØæÞ½{óæÍãxŠ··7ÇaªÜÜ\ÿñãÇéÒæÍ›ÃÃÃ%$$ˆçÀâ ßÖùÁƒ‹/ž7oÞŒ3œÇ?räÈ!C†XYY™ššöëׯwïÞššš***šššºººÌ»ð@£Ñ"""úôéãéé©¥¥‰²··glK¸téRoooFýÀÀ@<ËéÁƒCCCO:ebb‚zÿþ½——×áÇ===ñÄ ’’’NNNx„‹‹ (ð—ƒÉÈ/|NŒ¡¡á„ ݤ­­Ím›¤¤¤Áƒ³ïÑ×ÐЀ'U`ñìÙ³ôôtŽ#=øý»Ýþ`Ô±½Ùµµµ½yóF\\üÑ£GDêKIIIIIIKK3Ï¡ááñãÇ¥¥¥^^^MMMãÇ¿páÂçÏŸõôô3Ÿttt˜盚šVWW#„Xö›ŽŽŽÖÑÑA)((,Y²¤¦¦FMMíòå˺ººaaa/^¼pssÛºu믊ÿiè ¼ð[`nn.ñ‡)¿·ù³t:ÝÝÝ=%%ESS“åÐüùó9žbeeÆœ¸”Ñ”©©©©©i»ijjzñâEnn®´´4¾RXXH¡PŒŒŒÖ¯_/%%%##ƒÇ1 ,…Œ0ÂÈȈHû.\@8qâĉxIddä–-[:ÐUƧÆû€?;377?pàÀÙ³gW­ZåããC£ÑøJ@WÂK]]]GG§´´ôóçÏ‚Í.YUUÕØØØ§OöCõõõ#GŽdrîÝ»gjjÚ«W/–òÚÚZö}ëêê^¼xÑnìB£Ñ¬­­¹mÄ̯êêj77·Ñ£G#„ 4}úô_Ò,³GeffZYY¹ººjjj–––†……ÅÇÇOš4 ‘ºuë–‚‚•+WBÏŸ?wppPRR½"""ôôô²²²îܹƒ?½ÊÈÈÀŸîáÀß¾};bĈ]»v]ºtÉÞÞÞÄÄäÂ… G}þü¹À7™@à`ŽBÍÂÂ!”-Øn$%%qKœ®¢¢ræÌöò;vTVV²—ûùù]ºt‰½üêÕ«'N$2Bsÿþ} ‰Ý»w·[“ èèèaÆ}ùò!diiù«še†÷öåË—/_¾´³³ËÎÎþðáC}}ýêÕ«­¬¬œvîÜùãÇ„ÐÚµkññ3sssˆˆˆ-[¶¼~ýzÁ‚!__ß§OŸ¦¦¦!„vìØÂÿª©©©žžž{÷îmnnf^®À_ FtjVVV YYY...솢¢¢ƒƒÇC¡¡¡óæÍcÎØ€¢P(ãÇ·²²b©L¥R_¼xqôèQöv–,YB&“ÛíÉ‹/ÆokkûK¦æäåå™™™áÓGŒ~[ ƒç¥gØ»wïÞ½{o=Êño‚Ú°aÆ o׬YÃ|´°°ñúãÇ¿¦¯t-0¢€PÃï»_^>a„ÿý—½¼¹¹ùÀìY¾¥¤¤8ޏHHHdgg+((0b¶yóf2™Üîp΋/¦NZ\\Ìž5¢§L™R\\Œjiiyûö­´´ôoÚD (è Ô,--ÅÅÅsss)Š»qùòeŽÃ-d2ÙÏÏep…L&;::âkž™566ÆÄİ7õêÕ+öh‰ÝªU«&NœØ¯_?~úÎ•ŠŠJJJ ží!''‡J¥š™™ýÂÙÍaBM^^ÞØØ¸µµõÍ›7‚êFcyb ¢¢²råJ–ÂÛ·o«©©±/ª:vìÇÉF&L jw-tQQÑÅ‹9Îâ Nß°aCii©………¶¶6^ˆgŒ‡\žt=è 쬭­Ñwbhnnž={6Ç¡ŽeË–544°N™2åàÁƒì•ñð˜UTT¨ªª²¤=Ç0Œ%w•——×ìÙ³¹mä×S§N}øð%eDff&BÈÖÖ¶óí„ :;;;;„·]‰ÿEEÅÀÀ@öòoß¾%%%±lî×ÜÜ,..ξðâÛÜ1¼~ýÚÞÞžJ¥²Tþðუ£c~~>þöýû÷×®]ÃWu<-Y²$>>ž¥ÛÏŸ?G0¢@WÂtð;±@¤¦¦r|p¦¢¢ÂòÈéÔ©S;wîd©I&“-,,ØSe}ùòeïÞ½ì©Âsrr”””&OžW__ß§OŸ«W¯:´3Ÿ¢¨¨ÈÑÑñÝ»wÌ{ý1ýøñC[[›%tè ìôõõ544ÊÊÊð^þ¼Ë—/sœ[#''‡o²ÇìÅ‹S¦La)ÌÈÈ011a_îää4{ölö–³³³çÏŸŸ––0xðà„„„Áƒwâ „лwïöîÝËqc|´¬ó—!tC† AeddäêãÆcètºµµ5ûZ°èèh|“Cf#GŽuêTYYY‡ûçΟ?Nš4éŸþáXÿÃâd@"j“––&«;99±¯èÎÍÍ•••eY~÷î]ö —ÙÙÙMMM,Ã9¦¦¦WZÑh´7oÞàÑ’’’RBBÂŒ3ÆŒ“ššÚÎ?xð`ýúõååå<ꤧ§£ÿþÈ€.vF@ 6 ýw?þÃêêê®]»¶hÑ"–r ‹‹/2—´´´xyy={öŒ9¿†a«W¯Þ¾};ËC®-[¶pKúýáÃmmmÆda‰äææ;cÆŒ7oÞð»U ¥¥eVV–œœ· •••Ÿ>}RUU%˜›“£+VHJJvøtð[±¬àtÆÆÆÝ»w/...++ëٳ矼ô»wïbccÙ2™Ì’㳡¡aáÂ…êêêÌ…---¦¦¦ÌQ†aóçÏgY÷Ä““ÃÈߟàÀ,Z´èòåËÝ»w'Øí––ww÷õë׳ge‘””„2dH»ùp%ØíA»XR”€¿ :ˆ11±¡C‡Þºu+%%eÖ¬YòÒÚÚÚ+V¬`)ljj211)..f^0Õ£GmÛ¶±Ô”““ a.‰‰‰¹téÒ¿ÿþË-°ÈÎζ±±ÉÌÌÜ¿ffæŠ+üýýY²F´ëÆÝ»w'’ÏÏB5|øp¾Úgö›Òc~ ˜£€hÀsj²ä†üzõêåääÄRøîÝ;[[[æ(çëׯ.\`©öòå˳gϲêééð>ÉÊÊŠŽŽž5kÖˆ#²³³½¼¼øŠrŠŠŠh4Úœ9s‚‚‚Ø®³{òä ê\ fè ð@'11ñ_×ßßO{ÉÌÚÚ:..޹$&&æÝ»w,ÕŽ?...Î\B£Ñ† 2`Àn—KJJzûö­››[VVÖ¢E‹øÍ<õêÕ«ñãÇ¿~ýš`ýÏŸ?ÿþ]]]½3t DCÿþý555ËÊÊŠŠŠþäucccÙ SRRX†dÜÜÜØŸpýïÿ›;w.ãí›7oÌÍÍy_îÓ§OwîÜquu%2ÃNKKëüùóìëÛ¹yúô)BhĈž rè H$ÒÈ‘#Ñ“gÿ˜]»v±äs())ñðð`ÞÃ0 Þ½{3Wûö훌Œ óÌÅ‹7oÞÌíBd2™N§/Z´ˆx˜ÂlÏž=?~ÔÔÔäë!>B†ÿa]:ˆŒQ£F¡?þôÊÉɉe´£ªªÊÅÅ…¹pÕªU=b®SZZêàà@&“™ >ìêêÊíB~~~èX'¯^½úøñcn˸¸¡Ñhøœ'ü è’`ÕUWó‡Ÿk~ÉÉÉux}ø¨Q£H$Rrr2…BaÙ©ï7IJJ*..^¼x1s¡•••••ã-F»}û6K~«ÏŸ?{zz2†sš››·mÛÆc2™Lþüùs––YYY— &ÈËËóuî«W¯êêê µ´´ø½.@T@ ÓÕ 6L[[[нœµ´´ôïßÿúõë;]]]ÝÜÜ<77733ÓÞÞþ×ö£¬¬,–Q ÃBCC™§ãˆ‹‹ã™2™«ÙÛÛ3÷p÷îÝ<&ÁP©TiiéüY*++çÌ™³nݺI“&ñå „ðQ(öt]€®.èÎ;›È ~·ÔÔÔóçÏw¦…Ñ£Gçææ>xðàÏ:ÿþû/K óêÕ«Ë—/3:III#FŒ`®>lذ¾}û2JfÏžmllÌñ?~ü7n\JJJ"•²²²‘#GNš4‰ßq>D7®c§DÜ%ãÆ;zôèÇwïÞý.§©©ÉR"--íîîÎxûùóçeË–½yó†‘áçÏŸ{÷î}ðà£Nii)ùÅiii3gÎä7ÊIOO7118pàÀù:‘¡ªª O×Õù¤åŽŽŽ?~üèd#à·211‰‰‰t/€`@ €(±µµUQQy÷î]II Ë*§_ð¡C‡¦¤¤0HyöL IDATš™™1o7üãÇeË–1§y’””>>Œ·§OŸ~óæ s…›7oΞ=]XX¸víZn‹‹‹çææIºÉðòåK•'Ož(++?‹£§OŸþüùÓÒÒRCC£“M„:ˆEEE{{û¶¶6|ÑÐï³yóf–¹5½{÷f^íµdÉ’3f0WˆŽŽ2dþzûöíç cæááQRRÂm+ W¯^5662—äææŽ;¶OŸ>7nÜPRRêØÇavëÖ-„ÐäÉ“;ß@ÈA €èÁÓ‰ó˜áûK¼}û–yìäË—/{öìa®`cc£¢¢ÂxÌœâĉÿþû/{³ñññ_¿~å±kb`` ‹‹KKK þöãÇ“'O677WWWÿ%©h4ZBB‚@€¿:ˆžI“&‰‰‰=zôˆ üñññŒá„PbbbEEãí¬Y³>}úÄxûôéÓ˜˜111„™LNNNæ—¸¸¸DEE1/ÔbVVV–ššjddäîîN£ÑrrrTTTBBB~ÕçÊÈȨ««322bÞéÐUA €èQWWÇý UUUy\”J¥FDDxzzJJJ^¹r¥©©ÉÕÕµG¿àóü‡N§C À_ 20 »páÂØ±c ‡êää´yóf„Pvv¶±±±AUU• »ù‡L:ULLìþýû,)~•ÒÒRæ _¼xÁH<ŽaØ?˜x/[¶ìõë×øk*•êîî®  ÀÞfxxøÒ¥Ky\ôÞ½{x²%%¥'OžÜ¹sç×NEJKK«ªª244ä–’â·JNN6àäïùÝðçA DÆÁƒƒ‚‚¼¼¼îÝ»·iÓ¦òòòòòr„™™YhhèªU«ÝÁ?J]]}èС---·oßþí;99xð ***::!”’’¢¯¯ÿ•BÇŽ“صkWAAAYY™££#s;4-,,lÙ²e–––¼¯˜——1pà@•ãÇ›››‹‹‹ÿÂO„ÃóW;öóçÏ4J¥R©TÖ™×T*•ø4)YYY–IÐŒ{{û¬Y³¦±±1++ËÅÅeذa4 qú™‰‰‰577süyÿª¿]:@4èëë“H¤äää™3g©O§Ó Äœ~!Ô£Gïß¿/Z´ÈÎÎ.((HAA!==ýÿû£#‘5¾Lšyû;Ž˜wéíÞ½;µ+%%…N§Óét Ãèÿ4½[e:þêÕ«³gÏFGGÿÚ@‡D"1ÞÖÔÔŒ3½gÏž72¶¶¶5kÖ „Ö­[ÇHþÀ°mÛ¶ââbv7úÓ×׿{÷n»ñPg444à Â:tèС_ز¬¬lçñññ™9sflllee%…BY¹r%ãûÏLLLŒãÏ»óÝ ë@ˆmmí ìØ±ããǃ jmm½wïž‚‚B@@@AAÁ·oßòóóBÉÉÉݺu³°°˜3gÎÿþ÷¿+W® 6¬¶¶6%%%''çîÝ»UUU­­­âââÙÙÙß¿öìBèÙ³gx~㌌ŒñãÇKKKã·ùÂÂBuuu|öÉ­[·®\¹‚bÌõôô\ºt©žž^^^ÞùóçÙïôñ•à‰·éÓ§ÇÇÇgee3`:ïÇÒÒÒŠŠŠø[777ü†afff#GŽdÔdD 7n>|8K;Çß¾};(ðC‡ijjº¹¹ýÖ(!H¡Pddd´´´ÄÅÅÅÅÅ%$$$$$:ó{âÄ ¾z’––†êá‹°ð!C {{û   …2cÆ F(‰8ýÌ8þ¼åää~í €. 2¶lÙ¢¯¯!++;lØ0|ÅŠ§§gii)^ÇÏÏD"mÞ¼yýúõJJJ±±±7oÞ”““ëÛ·ïÒ¥KÕÔÔzôè±qãÆsçÎ=}úT[[ÛÌÌ,%%%33óéÓ§!___™áÇ㷮­[·&%%YYY9;;`¦©©‰Z»v->ÉcĈáááÕÕÕººº¾¾¾Œ€à‘––vqq9{ölxxøÎ;U³ÑÑÑUUUø^8xhˆ?Ú#‘HGÅëÉd77·èèèŸ?JJJ:880·ðáÇ^½zá‰Öyxÿþ}bbbddä¯ê9; Ãrrr,,,îܹƒ Å· ú…˜ÛÕÒÒâíí'dõóóÓÑÑIJJÂy{{Ïš5KRRrÅŞ̌pü™qüyÿ²@bbbÿþû/{ú$Æ}‚ÅòåË—/_Î^¾téRÞ»¹ „^¾|Éx-..~ôèQÆ —œœ¼xñâ7ª««éüï3oÞ¼³gÏÆÄÄlݺ•y¿Î””dÌFºyófNNNpp0Fsqq¹zõ*~• .ÈÊÊ’H¤Ðh4ÆéõõõsæÌ9tèc Avmmmõõõ†††÷îÝû%¬8"“ÉfffÖÖÖÛ·oÿþ}·nÝ&Mšô›®E¬¬,󯋙†††¸¸ø¬Y³´´´˜Ë9þ̸ý¼,`:¶•œœœžžN§ÓØ ‹~ýúUTT}ú4wîÜ_¾ º¥¥ïö³gÏ–,Y‚by>uöìY„ТE‹~íu"ºüNp/ôõõñ Bø¦äädF2s==½„„11±ŒŒ Æšð––:îîîÎmÔ„L&ëëë'%%Y[[w²‡Ì.]ºÔ¿ÿêêjuuõððpö-sss_¼xÁ˜iøÛÀ£+º ++«—/_^½zuΜ9i*==½OŸ>ø#0{{{¼ðâÅ‹øö‰ÙÙÙââârrrrrrÌ‹ƒ¼½½MLLðÍYP(]]Ý7öìÙ³3}chll ÕÓÓëÖ­[nn. gΜAÍŸ?Ÿ±$à¯#:tøbc<Wgæåå!„ždRWW—››«¥¥uæÌ™Î¨TUUM˜0ÁÜܼ_¿~%%%)))Œ4dÜœ?žL&Oš4I[[»“Wˆ(xtÕ={–xòKð'ÿ¾Æ¥¤¤–-[¶gÏž“'O:´Ãíx{{ã/V¯^-//_[[;qâD<¿†aÞÞÞÒÒÒŒ]˜ËÊÊÆÿüùsö|Oß¾}5jÔÁƒÛ Gpß¿gÙ(L&744LŸ>]EE%!!‘G72™†"’iÐUA ÓÕ,]º´¡¡AнœuïÞÝÆÆæ÷µ¿xñâ#GŽÜ»wïÇ,ë¡úþý{aaá¨Q£BŒTØø®ÐÅÅÅNNN...jjjŒÐ!%%ÅÝÝcVËž={ž={–=G‰‰‰ëׯÏÌÌdY±õéÓ§U«V½xñ"""ß`¸˜˜˜ªª*[[[ ¾Nt%èt5{÷ît€ÀtëÖmÁ‚§OŸ>~ü8¿™&q™™™7nÜ5jÔ… ÄÅŧNzâĉM›6!„bbbæÏŸƒ/8ÇÍš5‹½‘¨¨¨ŠŠŠ5kÖŒr¾~ýº|ùòž={^½z•±+OaaáÓ§O‡ véÒ%¾>Fç+á Ñ~·?âyaúòå‹ » º”U«V;w...nÓ¦M˜˜¢««‹¯'¿ÿþܹs£££KJJðC›7onmmÅÓ¦"„¢££ Ù3‰ÖÕÕ8q"**Šàñä [·n577_¾|ùÌ™31 ›3g>Æ3|øp‚Ñ‹›7o÷ë×±*þ÷éׯß~÷U@g º @` РKÑÖÖž1cFtttPPÐÁƒù=ÝÂÂÐséÒ%*•ZSS3bÄ„ÐãÇ›ššzõê…oœC¥R÷ìÙƒ¯Éb Óé•••ššš©©©Äg‰mܸÑÐП¤¬¬õíÛ·¾¾>66vèСmmm4J¥2¿ R©üFN QQQïß¿××ׇáFtèšôôô,X@£ÑˆÏ›yüøñ—/_>ü¿ÿýoöìÙ---$éÖ­[7oÞ$‘HÎÎÎŒ‹1 Û¹sç† B£œ¢¢¢>}úܽ{!4sæL{{{111iii999%%%UUU ---]]ݾ}ûª©©uà#S©Ôýû÷#„víÚ›ƒp0¢@—µaÆ˗/'$$¼|ùÒÊʪÝú ,èÖ­[IIIß¾}]]]eee7lØ0iÒ$}}}‰týúuÆÈP]]݇BBBÚm“L&­]»VOOïæÍ›æææüP<?~üû÷ïƒ rrrú}Wá(--B¡üá‹┕•ñÀ_®fçΰ ¨0SVVæw1T‡©««¯^½zÏž=¾¾¾=jwOJ…ï8iÒ¤7nœ?Þ××722rܸqx”ÓÒÒ’——gkkI¤³gÏVSSkllìÖ­ÛorjkkI$Rvê¼E‹HIIýùKƒv544`öäÉAw:]MRR’££c¯^½ÝÀAccãÉ“'ÿX ƒZ±bÅ… ²³³cbb\]]yÔlhhØ·oßÔ©SÛÚÚ¤¥¥íììZZZNœ8QRR²oß>GGG„P]]ƒƒƒ···­­-¦êëëCBB444–,YrùòåÎç-'bóæÍ?þœ6mï¾ý>ÇŽSUUÈ¥o¯_¿Þ½{· {.ÈÁÁaÀ€‚îààÇ'Ožü“W”‘‘Ù»w/žcÁÉÉIQQ‘[Í>¼|ùòóçÏ!›¶¶¶1cƨ©©Q(”˜˜˜ž={"„ºuëvèС &pk„L&KKK¿y󦪪ÊÍÍ !ôg¢œÌÌÌË—/ËÊÊîÙ³ç\€¿Akk+N—••%‘H4­¹¹YNNޱâR„À|=º8ggg;;»ÚÚZÞA@¿~ýöïß?pàÀåË—O›6ÍÕÕ5++ëÚµkRRRæææ?Þ±cBˆ[”ƒaئM›Œ©Tê°aÃŽ=ʘ¹ü»Ñéôµk×b¶víÚ¤÷°£ÑhÒÒÒ‰‰‰aaa{÷úúõ+¾QÖÏŸ?Ý;þÀˆ]_ppððáÃÃÂÂ\]] ıޒ’’­­-þÜçåË—bbb·nÝjii™6mZkkëúõë/\¸ÀñÄÆÆÆ¦¦¦ž={öë×ïõë×~3âÐÐÐüü|}}}| @'µ¶¶6666ìÇÌåÝ»wwww÷ññ‘——oii‘’’‰Ñ ëëׯŸ··7†a^^^mmm,GKKK«««×®]ëïï?wîܼ¼<##£ðððþù'$$¤´ôÿcïÌÃjÚÞ¾ÏÜ< 247®ŒE$ºJ 7!$M4I“nHƒ„JW(D*%¤Pš ) \)cª¯”)Ji$gÞ¿?ÖsÏs~§é4ÜõùóÏÞk¯õ÷»ßñ_^^Uî@JJŠ‚‚Âû÷ï±²²b7sàß¿÷óóÃ`0§OŸ†!ÓÞÞN¥Rµµµ;h9‚üøñãøñãrrr&&&oß¾Åáp(Š‹}Zt ÿ{÷î½uëÖÛ·oOŸ>íêê vVTT¤§§ß»wïùóçmmm|||8nÿþýFFF›7oFdÇŽ‚‚‚çÎëðÞVQQ‘””´{÷îÅ‹ùòe5 ;;»¶¶6uuõá’K€º………Ý  Óé±±±·oß...–””äççç¥xýZt ÿ$)44‹Å?~üÝ»w`§  àþýûïÝ»×ÜÜÌd2[[[›››_¼x±ÿþ¼¼<,K&“Ïž=Ûa**•ª«« R©%$$†Q˹téRNNŽ„„DŸ:]@ žÉËËëᨬ¬l```uuµœœÜ¨(©0ŠN[[{EÑæææÎ¶q2ì,\¸ÐÖÖ–ÉdîØ±ƒJ¥"2nܸ¥K—rŽAQ”F£555EFF„dzcn ·lÙòøñc‰TPPààà0 ×ÀÁ÷ïß<ˆ HPP»+8ÍÍÍÝ’””ÌÉÉÙµkW{{ûׯ_»‹Ñyùòå@àÔ+΀\W4H$~ýú5--­¡¡¡©©IIIiÁ‚ ,Xkk«  à É @C‡=xðàíÛ·‡Í/×­[—““Óydffæ·oߤ¥¥©¬¬œ2eJQQѺuë/^Œ ÷]Ê»¤½½}€ænE·nÝÚÖÖfjjÚCº;é=(:fffrrr6l8|øðÔ©S»SUU¥¬¬Î`0úº´µµ5@èë‰=ÐE‡N§‰ÄØØX33³###ãèèhccƒ HKK‹  ào‹dPàã㋌Œ\¾|ù¹sçV­Z¥¡¡¡««ËÙ᤹¹ÙÔÔ4>>^WWwÖ¬YÑÑѦ¦¦ ­­-<<|غuknnn—€šòúõëäää¾®Ê2”.Èâè蘟ŸoccC&“ |}}¿ÿ¾k×.333‹åååÕÖÖvæÌAú43Ÿªª*ú/l ‚ ìí‡ØÛ‚tw¨;º‰ ™L.--e;ï:0qâD`YQRRjmmÛË—/§ÓéÀ½qãF‹BwìØ6ðx¼»»;‘Hd0'Ož´²²rssÛ¾};ˆ§Áãñ #$$ÄÃÃD2&&&ÖÕÕÉ“’’šššÀ¶ššÚ»wïÀB:::¶¶¶gÏž¿~ýºœœ\ÿþ[‡ˆßÿ›Þ^~~~džýââbÎ2E~~~C("Â8nåÊ•ñññ555wïÞÝ´i“¶¶¶¿¿?§–ƒ ˆíÃb»Žôe0---Ü/:¤¼ý·èôlM?~|VVÖ‚ îܹ³víÚYWT*•F£Q©Ô3f¸¸¸ôii,+ €¢hNN¬… \ÚÛÛ333õôôJKK>|xñâE Attt&L˜¨ªªZ^^»hÑ"Aøøø<==ÕÔÔú´Ê”)SÒÒÒ†äúާ§ghh(‘HܳgÏ›7oþÜÉɉÉd>~ü8,,ìêÕ«‚<{öLOO¯¶¶VEEåÝ»wmmmrrr}z«†@imm¥P(T*ÕÑÑA'Ožxzzv¶jÕ*:>*ú®ôߢ###Óy?‹e±X$IPP‡Ã8q¢¨¨¨¦¦fâĉœÃH$RuuuŸ¬ýl¤¥¥ÌÍͧOŸÈà’ŸŸ¿wïÞeË–Ñh4A8k½H$ƒì´ìö.ƒ4Ç{Ž9ÒÞÞ‘’’ÙÖÖ6X]l/_¾üñãÇÀÀ@2™looÅbétz—Q8]’œœìììŒÁ`.]º´páÂA‘jiiiyÿþ}]]˜˜Ø­[·™2eJpppYY(n^¢¢"&“)&&väÈQQÑ?þøÃÑÑX­­­Ç¶ýüüŠ‹‹mlläääòóó}||êêê`¯S÷TUUñóó{zz¶´´|ðññ™5kVvvö„ êëëQæd€- V¯^}éÒ%°=kÖ,›¤¤¤U78ÐÖÖÖ]Q/CCÃ;wîp¿bccc¿¥…@:Óe÷€°°°§§ggÏô”)S"""ÀvZZÚ“'OF~óÞ^Áb±±±±>\¹rejj*;€f(àÒ–“˜˜Š’:th÷îÝC'Ïøôé‚ ---8޳èNiiiEEEEE‚ ÷îÝÃb±JJJÙÙÙ‡’øçŸvìØáèè¸{÷n Êš’’"$$”˜˜ˆ ;íÃÞÞÞÚÚšL&EFFÃuBF eþüù––– ‰ÑéôÍ›7§§§:t¨¤¤äÌ™3ài>a„a´¿ô_Ñ¡R©vvv¹¹¹¯^½òôô¤Ñhnnn†‘Éäâââ1àV‡@ؼÿþëׯ4íܹs³gÏn‰<Ÿ`jjš™™©­­˜˜¸dÉ’a”'((ÈËË ƒÁZXX £$ƒxóáÂ… ¯_¿öÛÙÙ-A{{{ ãææI¡PP­©©a±XgΜ‘——_½zµ²²òúõëOž<‰¢(ˆ€tvvY0ÑÑÑ rrr®®®æææÃr¥Q‰D é®\*Nß²eKnnîåË—GiI¼~*:4­­­mܸqãÆ›8q¢££#“É444,++ã6iÒ$Pºt0D…@F >>>¹¹¹8nþüùœÕ&F;x<>66ÖÞÞ>>>~Íš5ÎÎΠ=8a0Û·oONNÆãñ—.]q9€ììì.÷geeuÞ¹cÇŽîNÄáp§NêPÏ:''ÇÊÊjß¾}*BA =pëÖ-cÇŽõ0¦¡¡aýúõoÞ¼ô.T¼¡?½®@nùóçϵµµ·mÛ6aÂ„ÆÆÆõë×'%%u©  €Ãá`Y?ÈãÚµk?~,--]‹ ß»w/ƒ9uêÔ–-[úT cà444hhh$'' ß¹sg,i9C ð‹åää<}út äBxƒžž^TTg¸m—[ZZΞ=›J¥òF°A¤ÏOŸ>ÉËË'$$ßRAAÁÝ»woß¾½iÓ&pƒÁ`V­Zeii¹aÃEû—]@†‹¨ªªnݺõÞ½{ .Œ‰‰Y°`Ö=yòä±cÇ †¼¼<;ÉÂ%l¿‘HLJJÒ(+ȘƒÁܾ}››‘×®]ÓÒÒâ²ù‰D’””ä^Œ!íÎÛ7E‡ÅbIIIíܹ344”½³¨¨hþüùOž<‰‹‹SWWÏËË;}ú´““Skk+‡Z2ÑÖÖ.--Õ××ÏÏÏ×ÖÖþ믿<==‡Î:[YY¹}ûvQ»qãÆ1âÍcºó‹A ÝA£Ñ°Xì£G¸ïî¯_ZZª¢¢ÒóÈ5kÖÔÔÔôC$ sæÌ Ø`µïÃ,t:ýÓ§Ojjj?~üèp¨¾¾^GGçÅ‹·nÝ vrr¢Ñh°E2ª½wï^HHˆOPPP||ü™3gÞé³t:=00ðĉt:}„ QQQK—.Ü% H—”——×ÕÕqßJ³¾¾Þßߟ³¬egBjjjÿ–ÿüóÏ5kÖ C¥Ry­è€%ׯ_ßYË|þüÙÀÀ ##cÓ¦M?~ì²£)]`0GGÇ?ÿüsûöí………†††óæÍsww×ÑѸ±–Éd^¿~ÝÛÛ»¾¾ƒÁØÙÙ:tr ž1mÚ´øøø>ríÚµ#GŽt. ÀãñD"ÑÔÔ´ò´··ƒymmm×u(z…Û`d,ßsÓ†¬¬¬={ö,Z´hŒ…gB ÿq¦M›öðáÃ#GŽ šššÊËË455õoÂOŸ>y{{ÿþûŽõõõsçÎÍÊÊ:zô(Ôr óðáÃ>ÿúõkAAÁû÷ï»<:@ï6ƒiooß³gOaaá@æéWP±çô3@HHȲeË`‰*dŒÁ`ìííïÞ½ëééùõëW??¿cÇŽ­ZµJOOO[[»×b(оyó&==ýÆ?~;—.]jllÌ®.?ªñ÷÷ܦÁ¢¡¡a¸E‰0™L,›——×ד““»+„Ç (:ª« b0]]Ý5kÖ¤§§Ÿ?>;;;=====A ‰Ù³gO™2…L&KHHðóó3™Ì_ÿòîÝ»çÏŸƒîÜ‚H$KKË;wJKKë ¾¾¾íííÃ-¤[`m¡ÎäääÉä~4ŽŠ‹Åb?h¨T*ÐògÍšåéé)##cgg'++«¯¯Ÿžžú v@DD¤Cá=aaá¶¶6QQѧOŸJKK§¦¦¶µµmÙ²…F£ ÐPÄ•¢³dÉvÏ^¡P(ûöí‹åüº4àí@ËSPPprrêë¹ÿ222`…Æ‘ÌÈCÄ`0::::::/_¾¼sçNmmm¯6p55µY³f©ªªnذaŒéâÐŒ u())=xð 'æå奧§¯X±ÂÀÀ€Éd:;;/Y²$$$¤¦¦&--­°°°  €=XJJÊÃÛiÕ£¹¹yêÔ©‚¬]»vÓ¦MãÇ×ÒÒꇜp¥èH¤. wvG\\Ü„……eee»C&“ûÔåŠ HÍ÷òòì.ê¿ 4žCx†˜˜˜¡¡¡¡¡á‰'ÊËË êêê~üøñéÓ§ëׯ ›˜˜ðññÉÉÉÍœ9sáÂ…ƒ•C@ޏ¸x—¶nعsgQQ‘³³³ººz{{{FF†ššZTTÔôéÓžäJ{?fú¤è (zåÊ•žcz”•••••¹Ÿ³Ãü‚‚‚bbbý› .²²²ì›²²²ëׯOœ8‘›À>2\ô;æ÷óçϾ¾¾G½~ý:°RÏž=;00= ½½Éd666ŠˆˆL:µ²²róæÍD"Q__ öCCC*•úåË—ôôtMMM!!!E) F#‘H—.]š={v¿U6½[=zôùóçòòò>Í ¬5(Švy”F£õi¶`0˜¦¦& –€@ è™­­È‡û :9yòdQQ‘¶¶¶¾¾~VVVii©««ë¯_¿^¼xñåË—üüüÂÂB!!¡¢¢¢E‹UVV„)S¦„††^½zÕËËËÑÑÌC"‘ªªªš››¨Tj{{;???@øñã…B™>}úÀ-Á½Ÿ¯¤¤”™™Ù×y‹‹‹?~üØØØØ¹o9Š¢ì;`AAÁóçÏ/^¼ØÝ×íééÙ!#ÃÎÎ.(((33Tfº$l4Œ@”Tt Î@WÑét;;»GQ©TMMMAŽ9Â`0æÎËb±ØÑßêêêX,V[[„Uxxx€² ô(•J¥Óé‹-ÒÔÔ,))‘••½ 0̸qãÀ$ŒGî]Ñ}õêU?¦NNNÞ³gOçý æýû÷¾¾¾ÿý·¢¢¢¢¢¢MFFFcccçÁÒÒÒ%%%œ{À·³téR}}ýÖÖVGGÇ;w*++C]!@E °CçÓ§OÏŸ?ogg>‰ÄÔ‹õë×/¶?t²#‘Hì¸R2™ÌÎ$§P((Šb±X€ ¸<W¡þÅ+8qÂÊÊêëׯºººçÏŸýúuLLLKK˵k×”””Øùç æÏ?ÿärZâôéÓ'111AAÁÀÀ@}}ý””,K$¡® ;ÐuŒ ÞŠÜÃÃtïž4iRç£mmm@ Ðéô/_¾,]º”]c¢CË^E9ëå ¼v'½Äè€Vÿ,:߿߿¿¢¢¢±±qLLÌ­[·-Z´víÚ3fØÛÛOŸ>3‡žÅb¼~ý:33óܹs­­­/^lll|ôèÑ›7o>~üxöìÙºººµk×z{{#ÒØØ( €¢¨˜˜Ø?ÿüŠv€¢Ñdx1–@Œ=žÐÓØØ¸cÇ„#d¶¥¥Xn˜LfJJеµ5…B‘””œ6mš¸¸¸ššZ`` ‹‹ NgÏ3¤FŠ^,:ííí­­­uuuý›=<<|Û¶mÞÞÞJJJ+W®¬««ÓÔÔ\³f {À“'OÈd2Š¢ïÞ½svv¾~ýúÚµkW®\‰Á`¶oߎ ȲeËÀH==½’’’ÊÊÊË—/ýúuݺu‚Ðh´²²²¸¸8'''qqñÖÖÖþÉ @¨è@ # ŽÇ²²ò“'O8aJJŠÐÒ¥KoݺBsrrr.^¼˜”” iæå奥¥=xð€è4ìƒ< w‹Î@´‹eggG$ÅÄÄP2eʱcDz²²^¿~M¡PRSSÕÔÔž?ŽÃáøùù_½zµ~ýz*•ZYYiccãååµeË–«W¯‚©ÄÄÄÒÓÓ£££EDDäääèt:øš¨TêòåËEEEû-$\ ë É|üø±®®®µµ•ì=pž>}*###!!!--Ãá455¯^½Ê.^PP ¬¬ÜÒÒÂî8ÁË’o½Çè ЇWXXèææ>rö¶X³f ‹Åî=  f‰ÄÔÔÔˆˆ0ÆÀÀ¸ôp8h Ïb± ðùµ¶¶N›6 Çc±X:¢µ!Èðƒ‘!Kkk«   ……EjjªŠŠÊòåËûÚ׳;¨Tjw ‘H466&‰±y@ï¶å+ùøø”••UUUuØÁ`°X,‡Ããñx<ž@ °X,‰ÄÙcŒL&Óét>>>AAAä_›Ȫg±XL&ÜRi4@€‘ÈÈH*:ȈEHHhòäÉÍÍÍVVVÀ²ðúõë“'O ÅrX,ÖÔÔ´´´ôäÉ“Ÿ>}–Çt/ŠNiiéÀ¶¶¶;wNž<¹Ë`aPlûöÍÏÏïèÑ£à#ƒ‘——ïàég$‘H""""""$i€¹gd1:ÈHEQƒ¨¨(££¨¨èììÜØØl ƒ…¶¶öË—/Ù!( ,Äɹ§—;QSSÓ 4}MKKswwŠNee%N§Óéïß¿GƒÁäææ8pÀÙÙY^^ÞÐÐpòäÉêêêæææ•••ãÆãççgÏm6ÈÈÆè@ #™ÖÖV,ûæÍ›U«Váñx¼¼<33³wïÞq¯ë`±Ø‹/†‡‡vˆ”7oÞýû÷ïÝ»ò:$“ó˜nct@!B555‰4~üø†††®äïïïïﯫ« ºvÕÔÔ\»víüùóÕÕÕ`LEEELLÌÓ§OA‰Çß !ÑTt ‘ŒÈ“züø1‚ ,+=====ÝÊÊêÂ… !!!Ü̃¢èÖ­[‰D¢ ‹ÅÊÏÏ¿ÿ~UU•­­íœ9sèt:ƒÁ7nÜÐ^ t«è‰Ä;wî¬[·ŽN§„…… Êz©©© á¾K BLL (sÌiË@ £躂@F8À{6—.]RWW733ó÷÷/..æf’ººº·oß&$$())ikk{xx ÒÜÜ|úôéY³f­Zµª­­Édb±X‰4ð®Uý£Û;Š¢ïß¿&GåΡ¢¢bkk‹ ƒÁàÁrd(€ÁÈȇí½ê°ßËË‹Åb¹»»s9ÏÛ·o/^ïè訠 ÀÏϯ¥¥%""²gÏžðð𸸸ÜÜܯ_¿¶µµuX‹›ËºUtZZZ¶lÙâêêúÏ?ÿˆ‰‰ÕÔÔ¼|ùòàÁƒCtóš6mZ\\ÜóçÏ•••™L&ho@F#ТŒp„„„&M𤦦Öaÿׯ_ãããedd¸™'((HTTøE„B¡deeí7niiiÍ;WRR’H$þþûﺺº»wï>þ<‘HäY3ƒnïDBBB222ÀåååU\\¼`Á‚ÇÿüùÓÐÐp PAAAo߾ݴiN‚/‚ȨZt ‘ð^uÞ@ vïÞÍÍ$wïÞýðჳ³s¯Z“ÉüðáÃÝ»wÏœ9ckkëëë˳ÒwÝ*: †ý->|XUUUPPpÍš5UUUׯ_ONNæ~Ù³gggg_¾|ÙÀÀ@\\œ½_XXØËËëãÇýõ×Ý»wñx<̇@Æ0ùtç½zýúõýû÷wìØÁù¼îEýýý¥¥¥7oÞܧÕ+ð—z²-ï;£›B¡¤¥¥Íœ93""BGGt›â†yóætñøøøúúúÜÜ\ooï7nÔÕÕy{{×ÖÖ¶··oذa —@FТŒ|„„„&NœøÇt>tüøqaaá;vp3ÏÕ«WkjjvíÚÕ§ÕA*7¸W 5=):BBBÒÒÒªªªœ;Quvv®­­ ಪMmm-‚ &&&FFFaaa¢¢¢^^^kÖ¬¹s王‹Ë´iÓøøøÚÚÚš›››››[ZZr=dØdTÐ÷êŸþ)))±±±á&ÒA”””úTèŽN§Óh4Þ$õt œÞ+NZZZŽ?>cÆ Î>ä=PXXH§ÓõôôâââvîÜ©   --ÍÏÏo``pòäIðððôôô7oÞ|ÿþó›BQ”7êD`022*èÎ{…¢hXX˜¼¼¼¶¶67ó”••ñññMš4©¯«óæßKôð^íÝ»4™bqðàA77·ÔÔÔ^ר««‹‰‰155%“É_¾|A¤²²’}ôرcÆOžzô¨­­mfff¯ó€bÊž&Lpvv^³fÍ©S§jjjîÝ»l½lZZZx“aÝ‹¢#$$$,,¼dÉ’§OŸrîonn>w‡‡ªªêóçÏ{]æÄ‰æææ»víÚ³gO¯ƒ«ªªªªª²³³/]ºTXX(//ÏÇÇ×ëY#Ð'v¸¥è3ƒ«è‰Äƒ✼áåË—Ó§OnAFÐuÕL&s,}3ñññ/^¼Ä ƒƒƒ/^¼£6yŠ¢[¶lé¬èüüù3..nëÖ­“'OîÜ“»***eee ìƒÁèëë{zzΚ5 $]¼xÇóóów¨ÓÜÜÌ›[k/ŠÛ{ÕAÑA$((hÏž=nnn›6mêu™ÿýï™™™Û·o÷ññilläR8‹uùò倀.Ç󘲲²?~ô<æýû÷÷îÝÛ·oßï¿ÿΩ‘/^ üŽüðáý{÷b±ØS§N!2¢t//¯OŸ>õ<¦¢¢âû÷ï{÷î¥,!ÜðŸ F.++ë`üîLXXØü±|ùòjÄ:ÌÍÍûê¶èLSSShh(‹Å²¶¶Fd¤é:­­­½ÞðQõôôôöö–——çTx¯víÚÕÙ‹naa±}ûöžíñX,VYYùîÝ»rrrܰaÃøñã™LfjjêåË—ýüü¤¥¥…„„:ÿ4š››ùbº¡÷r8­­­[¶lqvvî euuutÛh ¬ IDATt´µµµŒŒLEEE¯óœ7#÷ïßßÐÐàîî>BÞŸ?fwˆ€~½µµµ_Fbbb³fÍÜ9ÿøãnj EDDhkkÇÄÄŒ™Ê¨ºººsçÎà$ß¿ ýõë×ÔuÒÒÒ>ÌÍH}}ý¤¤¤Ñ¢ë°½WÙÙÙ=þ¼°°ÐÚÚÚÏϯ‡`š™3g kkk—••a0˜ÿýï~~~ñññZZZÞÞÞ  megxV0°wE‡ÝýëÉ“'…„„ØØØ888€ö=óÏ?ÿÐh´¾þF~Öo¿ýÖCÓ²–––’’’?~lÚ´ÉÅÅÅØØ˜—²$$$Μ9³k×®‘¦ë âìì}*))9Ü‚t NŸ9sfyy9—ÞÓÔÔ$..Îå‹J_!“É=„644455Ý¿_[[;22ò·ß~ F/"""VVV#P×ADXXxüøñ= øòå ‹ÅÒ××·±±±³³‘j,kË–-AÂÂÂBCCuttRRRº;}Ñ¢E‚‰ÄÐÐÐË—/üøÑÆÆ&77wòäÉmmm, ¼îöjì:¸*p ¼WÂÂÂgÏžYZZzyyÑh´ž'a2™}íÕ>òíÛ·¯X±¢»£¯_¿¶··nnn>zôh^^ž/%!hjjŽL]GQQqÆŒÝÆêùóç—••=~üxéÒ¥/^\¾|9ïäë++«ÿ¬Þ}º¸¸øË—/ÁÇiÓ¦%$$üøñ#00PMMmÙ²e¡¡¡ŽŽŽÎŠ‚ Ë–-‹ŽŽž3gNeeå¶mÛbcc‡[¢áaôê:¢¢¢'OžtttÄ`06l¨©©n¡ £~~~///OOO>>¾K—.­ZµêóçÏÃ-ÔÈbTë:JJJÑÑѪªª ¶¶¶ Èz¸…ê à½êòPFF‹9sf—GI$’¢¢âï¿ÿ¾yófƒA£Ñ îÝ»‡¢è«W¯À Ít~9Äb±¼©íᨻú‰íííQQQË—/ïÁøn¼7oÞìÞ½»¤¤äýû÷›7o®ªªrqq=2º¬8fA&NœfbbÂ`0Ž=ºwïÞ±tu=SUUuó_ŒŒp8Ü©S§¸‰î9`0˜­[·ž;wNJJ ¸±>|8ÜBAF1ëÖ­»xñ"™Ln¬Q÷8jFµ®#&&vêÔ) fccS__?ÜBuK{{ûæÍ›»L¶ Óé‚t׳SKK‹@ ‰DG"‘8õ¹·oß¶µµQ©TEY,VgUg¹Ü*:=x¯ÂÃѽª= ¢¢Âb±nÞ¼())yîܹE‹™šš*))ó‹ÅêlÅâYT6oÀãñNNNþþþÿ57VQQÑ~®\¹´û°°°7oÞ ·t}cÞ¼yÑÑÑÐäåå###¡‹Í·oßæp„Åb™L¦••U^^ÞpK×7°X¬™™YHHÈÈwc JHH¨««w>Ôsµˆõë×3™Ì. 3L&sçÎ$‰Édvy“Y1:‚ Mš4©KïUIIINN޹¹yÏeý-Zôþýû‡Nž<ùÎ;ÇŽ{ýúµ±±1øawiÙ“5‘ÿSn¬)S¦lé£Ç›^'ƒ tcAèÆb|èÿù·¢[AAÁp ØF‹‹Åb¹¸¸t®pÛƒ¢3eÊSSSÎt­†ŸË—/ÿöÛoŸ?îpŸ'‘HæææS§N4é{„«¬+¨Ÿøøñã·ÂÂÂbcc ®\¹Òå¹AIIéæÍ›VVV&&&yyy³gÏnnn>uêÔÊ•+A*øSîpâ¨ÈÍëÀ;¶³±|||º<ôéÓ§‘lËíàÆš7oÞÁƒGT6d”²nݺY³fyzzþg³±&MšôöíÛ.ùùùu÷p7ÖÕ«WÃÃÃGl6Vssóš5k~ýúuïÞ½ÈÈÈäädPȸ;E‡ŸŸ?>>^@@@KK ìa±X!**ŠsXYYY^^g苜œÜ«W¯ÆG§ÓGVŒÒ£÷êÆuuu=´tŸ;w.??¿°°ðׯ_/]º$++{öìY™½{÷Ö×׳/µË¨lî%]ügÝXc èÆ‚ "Ð5†ùn,QQQA˜L¦¦¦f\\Ü÷ïßCBB-ZŒ1œ¦š‰'êêê¾}ûvÉ’%œOíÖÖÖ÷ïßgddt˜YEEåÎ;ì¹¹¹ þ@è.ôgp郢#$$4qâD55µÎ‡h4Ú³gÏz0C-^¼AuëÖ£…°°pJJ ¨zœ——vb0˜.£²¹—p4òŸrcI  2ˆ@7ÖØfä»±ˆD"‰D*))!ööö/^¼¸~ý:‚ óçÏwppxþü9ƒÁøþý{JJ (XÊÖTP­­­6mZ\\°PXZZÄÄĈˆˆpêCÍÍÍ<ŽX蛼W]ê¹SŽŽPk:ûÿ@‘x&“‰Åb;_<ïÜÜÜdžšÿr6ÖØfcA˜5†ÙX )))L&EQ`}ñðð QRRª¨¨ +7†J¥R(P*/##cË–-åååEEE...›6mÂáp>|`OnooßÜÜŒ¢(Èçâ}S#zð^1ŒîmmmPº3·oß¾}û6‡ëRÑá½ë*++kÅŠ.\è®=ÇPÝXcèÆ‚ "Ð5†Én,öŸ™¡¡!§R©ÀæÄd2›ššnß¾]\\ÌîÌýúõkA°XlJJÊ®]»²²²lllÚÚÚ„……åää@Ò4‰D’’’úçŸØKÜ¿öìÙ)))œ~+E{í¯Ðoú¦è III;vL@@ Ã!&“Ù³ÍÅÅ…ŸŸŸ“LXl{Š¢7n´±±é è`0˜?þøãï¿ÿî“„‡N§777éêêÆÅÅñLåDxèÆúï<€¯^½ÊËå  2ˆ@7ÖØfdº±~üøQ]]ýäɶ6Ã`0îß¿ÃáDDDÀ)))ð°–ðöö¶··?~ü™3g6lØ €Çã………………Áé(ŠÆÄÄp®ÒÒÒ²~ýz"‘¸nÝ:==½7>}útè“ûìúö훫«ëÏŸ?tuuÙÊMw®+uuõýû÷³KA#B£ÑŠ‹‹9ÒPÕÖÖ {Ƨ­­ýèÑ£uëÖñ¸”Ðl&NœX__äÈ‘ 6¤¦¦òìï7n¬Ÿ?.Z´(!!aÌk<...Ë—/¿sçÏþËåîî^[[;ØÒAÄ»wï.]ºÄcËʰ»±<==ËËËy¼è°ÞÜÜ̳yìÆJMMýúõkÏcòóóA0.???‚ |||³fÍ:wîûyÁÇÇ—••ell|øðaƒ .¨©©j:3gÎlmmç¾}ûöâÅ‹ªªªÎk1Œ”””äää[·nݼy³‡q¤ÏŠŽ´´4‚ ,KOO/%%åÛ·oþþþ³fÍê èLœ8QSSóÀYYYuuušššìC$)22²ƒ¥D\\üþýû&&&࣊ŠJff&‚ X,¶³õhH‚>}:%%EQQ±¢¢ÂÃÃÃÐÐ0''‡7ðÀ…¢(h0»dÉ’¤¤¤‘ð1Dàp¸‚‚33355µÄÄDž)vwc]¿~}þüùþþþ<Žƒô@[[ÛÞ½{çÌ™º½ò†áuc¥¥¥)++ïܹóË—/<[tXhjj Y½zupp0Ûž1ÔðÒõâÅ‹ß~ûÍÄÄ„3b¦k×®ìhAAÁ‰'nÚ´ÉÃã©©éÆ³gÏ~ðàÁ©S§ÎŸ?Ae䯯FEEÅõÈd2gÊU—,_¾üÈ‘#Cgÿîg¨/P¾]]]ß¾}«§§G \]]þüùýû÷øúú2™L h4‹Å:zô(h¼<}úôààà›7o‚Ψl×Щ¿}û6ÀËë@"‘¨««ûêÕ«k×®ÉËË—––:::ZXX—$àëÇÖÖÖK—.½qãÆ˜Tw€ò-''WRR²cÇŽÅ‹_»v7îȸ±X,VKKK[[ÛÑ£GUTTnݺśÖwž·þúúz??¿¹sçîÛ·g¦Žatc±X,ƒ£¢¢²k×®a¹-ó~ÚÒÒrþüyÓ§OóLå‹Á`°X¬ØØØY³fíØ±ƒË¿ÞOŸ>oæóçÏÍÍÍYYY¹¹¹G;eddØ.'qqq¤«ÈZNã´”””ššÚºuëÌÍÍ÷ìÙãëë{õêÕ¬¬¬úúz))©A¹ÌÎô?…F£„wïÞ-Z´” "þþþt:ýÅ‹ì,t ±X¬òòr2™Œ¢((ŠÇã…„„ØáN¥¥¥à¬/^8;;{{{ÿúõëÅ‹x<¾¡¡áýû÷ …D"9èð‘H$æçç744DGG©ˆD""‘ˆÇã9?r¯JàŽ†ÅbMLL """|}}_½zenn®®®îääôûï¿ð«ï•¡.*8yòäãÇûøø”––nß¾= ÀÝÝ}ýúõc)¥¸Vß¼ysçΣG¾{÷ÎÑÑñøñã»víÚºuëP¯Þ¹¨`ppðŸþÙ«+º¥¥…Åb ‰‹‹WTTXZZ.Y²äèÑ£ŠŠŠƒ+¡††Fee%ØæççWQQñññá|3p^U'Mš´xñâÛ·o‡‡‡_¼xqÆ NNNsçÎåÃRT#Ï;·mÛ¶½{÷Nœ8q¨—æ1à‡ikk[]]œœ|éÒ¥˜˜ ‰¡^EÁ;ÞâÅ‹óòò.\¸påÊ[[Ûýû÷w§a|ùò…L&c±Xb|âÄ 2™lhhhkk{øðáß~û­çlk@ssó‘#Gêêê233ÁÓ¹C#ô¦¦&‹ÕCwôÓOE§­­M@@EQЪ³¼¼\XX˜ŸŸ¤¢EDD° …‚Åb‰Dbss³§§'HH»uë–¢¢"???“ɤÑh$‰J¥2Œ€³ètz``àÍ›7ƒƒƒuttV®\ ö3™L---.½HiŒB$ÙÛÁÁÁÁÜÜüÌ™3999?ÖÑÑáAðpcÍŸ?ß××÷Þ½{ÅÅÅd2YLL Å`0îîîüüüà'Ê~‚bþ…½Í¹¼!8nëÖ­ÆÆÆ×®]óõõ-))±´´œ9sæ¾}û†úº8 ™0aƒÁ`2™, tEéõ#{»ç  ƒÁlÛ¶ÍÔÔ4))É××·¨¨ÈÅÅåøñãÝe.óæÍ»zõê¾}ûòóó·nÝÊb±H$’È¿ˆŠŠrnƒà~$%%õáÇ+W®xxx<{öLKKËÔÔôàÁƒƒxÏ577÷óó;~ü¸ˆˆHmmíùóçwîÜyûöíÁš´C£Ñ@ê,•J¥R© ¾APPðæÍ›%%%'Ož¼råJbbbRRÒòåËwíÚÅ‘€Ëßß?--ÍÒÒòüùó , X,ä®rn€m Óy?']î;1 È?=pà€³³³¯¯ï•+W.\¸põêUKKË={öðà’ÙÔÔÔƒö ó™½ÍꆆÕÖÖ655ÅÇdz÷€ 3f„……9r$))éÊ•+ñññ›6m:{àÆš7oÞ¡C‡€kÑ¢E2228ÿ/8|Äý Øæü—s?•J-++Âãñ?þDdë֭ׯ_÷ññ¹råJPPÐÅ‹œœ\]]=AE+**dee †••Uqqq@@À²eË€aFDD$44ÔÒÒÒÁÁaåÊ•‰‰‰ -ww 3™Ì›7o²÷ÐétÎpvŒóÐÑOEG@@ 99yýúõ(Š2™L2™üæÍ›ŠŠ %%%ö  a±Ø¤¤¤»wï*++ïÛ·OXX8&&Äâp>f(Jvvv·è—/_Ö®]‹Ãᔕ•Y,ÖìÙ³ÃÂÂþþûo"‘H¥RitøøàÁƒêêê Ðÿ…F£Ñ»‡óh{{;‹ÅâTt‚‚‚Û·oÏËË»yó&‹ÅJMMåYïeË–™˜˜„……UVV²ß¿Ùô;8(=8ÎÌÌlãÆÓ§O¯©©y÷î¹¹9/³úy\ Ü‘,«©©©©© ì$“É ¶¨¬¬¬®®FDHHˆF£Q(”ººººººžÏÅ`0fff›6m:zôè©S§®\¹rûömWW×Á2kO›6 Auuu < ;;;755‰ˆˆ\½z5::º¼¼|üøñÚÚÚ{öìvttô•+WÊËËäååMMM7nܸtéÒÚÚZ•wïÞµµµÉÉÉYXX€Ÿ9…B MNN®­­:uª‰‰‰±±±––Ö·oßÖ­[÷øñãææf`¥PVVîn~Aº“§ßTTT˜››%¦ó¿ííí ¥K!xOPPPˆˆˆ8qâÄŒ3jjj²²²²²²xS敟ŸÿàÁƒ¯_¿®®®~öìÙ³gÏx°(‹:uê¥K—¼½½ÍÌ̲³³Ï;É~:ò€€€€€€€Á³sb/øq)**ÆÇÇÿïÿSTT¤R©±±± C„’’RDDÄÆÒÓÓ>¡¾¾>çG<O&“###÷íÛwèС„„„£Gž;wÎÝÝ}÷îÝ S¦Lioo733ËÊÊòññÅV˜L&¨($$TYYkffVTTäìì\PPг±¹ÃOu肎»£Ÿ?K …²~ýz*•J"‘ðx<“ÉTRRzòäÉíÛ·õôôÀ˜ºººððð7oÞlÛ¶-22Çgdd¬X±BEE¥ó„¢¢¢7nÜèr-&“ùâÅ A^¿~}àÀaaaNuªK0Ì»wïvïÞÝK³°°xõêU‡¿éââbÿ˜˜:ŽÅb555·oß~íÚµÔÔÔ~,Ñ'(ʉ'@ ÓªU«4559+Qúùù:tdñ±àq6Ãco ÿ&ö£(úëׯƒE§®®îäÉ“!!!--- FGGÇÍÍmõêÕ<‹Ûurr’——¯ìöv¯9é}õêUccc™†††„„„wïÞÅÇÇ>|ØÌÌláÂ…MMMÑÑÑ@q´¶¶öóó+..¶±±‘““ËÏÏ÷ññ©««Ûµk—££c~~¾ ™L.((ðõõýþýûŽ;¼¼¼^½zåèè8~üø¤¤$[[ÛÜÜÜ·oßv9wò äªýú•œœÜà # ÀÇÇG"‘À¿¡¨¨ˆž‘‘±oß>z¥¨¨èíímjjʃ’¯õõõ^^^ÕÕÕ8nÓ¦MJJJ]-ØÛì ð^Ú³µ£óÎGÑh4ðòSQQ¢e±X,úþýûP_2`òäÉÝYžz0eqÂ`0`»¥¥%33síÚµìÓ_¿~]PPââbooo«!((hjj*&&æïïσË|ðàÁ‘#GX,–¬¬¬–––¸¸8ÛV lÛœÿrnpŽaïÿðწ¬,g0ÕÕÕMMMì'HMMͯ_¿P°³³³°°àããûõë—««ëíÛ·œœŠ‹‹Á»Y‡J¿S¦L)--ݹs§¹¹yxxx}}ýHkÝÅI?à«f›dp8‹ÅRSSËÉÉ hiiÑÓÓc2™ÎÎÎ~~~4 TÙY½z5Š¢rrrÕÕÕœþ]E1 x–w‘H¼~ýú´iÓ†ú ¼lE'77÷رcÉÉÉ iÆ –––<ë¹ZVVæééùùógЏfÍšuuu¢Í=ÕÕÕ¤P(nnnÁÁÁííí fíÚµnnn¼ 5àdݺu .¢ÉÁÝYMM Dn*((ìß¿íÚµ¼é$×ÒÒâçç÷àÁ ãàààíí ^ep8ܸqãÆ×݉@ÑÉÏÏ?{öl\\x¸Î™3ÇÖÖvóæÍ...ƒ('Û5,%%uá sõêÕÆÆÆsçαǔ———••'Mzzú—/_¤¥¥×¯_¯««‹ük:yòäŠ+ÑÕÕˆˆX±bÅÇ/^¼¨¡¡ ˆŽŽÎ„ Ïž=‹ ȵk×@<°°ðöíÛþüÙÝüÝÉ3_¢¬¬¬‡‡???[ÿ‚ v¾'4MJJª½½=??ßÝÝÔ@#“Éظq#o‚Û^¾|éååõãÇIIɨ¨(UUÕ¡^qúôéõõõ_¿~Ý¿dd$Pzôõõ]\\V¯^=Ô°qvvÞ¾}û`ÍVVVöêÕ+wwwöž‚‚‚OŸ>mݺ566–ÅbñóóYZZЉ‰%&&ÖÒÝA§ÓOŸ>””„ ˆ®®îÁƒžtlddtõêÕùóç#bccÇãÓÓÓýüü=z„ ÈâÅ‹>|ÈÇÇWXXèää”””´qãÆÿýïS§N}öìÙ’%KºtñϘ1#777,,ÌÛÛ[CCãÆt:hx(C+…B!‰ ããÇ÷îÝ322º{÷î­[·@CrNëƒ!¢Ø ‹mmm±XìÊ•+'L˜0î_$%%7oÞ LGCíUa+:ÇŽEPøùùõõõÍÌÌx—––æïïßÞÞþûᅢ(°Áš˜vjjj0̺uëÜÜÜæÌ™3XóÀ»ËçÏŸåååÝÝÝõõõyö;,))ñôô¬¬¬ ÓÑÑáþ\`Æxðàðëáñøõë×ÛÚÚ.]ºt(D ‹‹KKKûúõëÌ™3Y,–’’’««+ç0))) sìØ1W^^^UU•œœœ‘‘îËÈÿ÷µƒÖÄ ¼ƒ³¨‰D/šÇ›Ð;QêrþîäÈU‹ˆˆt~sè"‘ˆÅbÛÚÚ€j>aÂKKKÞ85X,Ö… ._¾Ìb±´µµÃÂÂÆÏ›uY´hx_566Þ»w¯¼¼<–æ1àï0<<A‰´eË+++Þ|É‚|ûöÍÓÓ³´´”D"yxxlÚ´iÐ—æÆ½{÷‚l2IIÉÝ»wïÙ³‡ÏÃÃãøñãJJJ<ÐÐШ¨¨@dÉ’%=̶xñâ´´4ooo)))UUÕ„„UUUÆ3÷ Tѹuë–žž‹½páµk×ììì2220Ìo¿ý¶cÇ`±ïÕ•ÞœRSSÿúë/ƒ±bÅŠÐÐPÎÍÍÍ쀒 Ü+  µžž°ˆ‰‰™˜˜ 0  Opº«ôõõ÷íÛ7a³X,víÚµîîîƒèiàp8777###ÞÄO:»«út:PtšššÆoff¶}ûö!JIøôé‚ ­­­Ó¦M ß³gO[[›žž³USSûùóç£GÞ¼y“––öñãGPgaÆŒ$IRR’³7œ½½½µµ5™L.**ŠŒŒ444\¸p¡²²²ƒƒƒ•••¬¬lQQQtt´‘‘5{öìÙêÕ«I$£´´ƒÁt9¿‘‘Ñùóç;ËÃã"[‚H¤ööv'''à5æÀ]•ŸŸÃá¼½½œœxc•DþUtp8œ©©éž={ñk¤ž/D"qÓ¦M;vìàA¦à®jmm:uê‰'¦OŸ>«EçÇÒÒÒ®®®ÖÖÖì_Paaáùóç­¬¬( “Éäò–¥££C¥Rííí%%%W¯^Ñ]7Ìá¥ÿ·þ””]]]sçÎ¥¥¥ñññÑét<¯¡¡!..®¯¯îÜ9p/èYGa±Xššhn¾± IDATšoß¾íò(Ïî&È¿ Ÿ?ž8q¢™™™¾¾>çû(èÕ]5p0̆ ÜÝÝ}ò…“““‰‰ /UœîÜU}¢©©iÞ¼y666›7oÒÔ°ÈÈHAÜÜÜf̘‘ššzàÀOŸ>yxx€ÊÎñññÉÉÉ (ØÚÚz„ S§NMNN®®®&‘HóæÍ‹ŒŒdß+544¢££äää\]]ÍÍÍ1Ì… ‚‚‚bbbdee]\\,,,@QWWW>>¾eË–#ràÀÐÐÐ.çwqqé,ÏÐ}3Ý!$$dddäîî΃6¼wWqB ¶oß¾{÷î1_w€H$nÞ¼yÇŽ“&MâÙ¢Cá®êƒ1mÚ4www33³v—ÔÔTÐe³¯«“H$:®¯¯?~üx###Сfà°ÓŸ@zzúŸþ¹bÅŠààà€€ ÌÌLii鬬,MMMðõ¡( ŠF›šš9rDSSD.w7çÈqìÑéô©S§ZZZêêêò>8|èÜUœLœ8<áÆ‚ êêêòòò111 W®\Eö8û<€XIIÉÛ·o{zz“H$ÎÛÙˆÅÉÉéÖ­[6là±–C¡PþþûoŸööv}}ýk×®añ˜$11qÇŽ••• .•–ú=ÕÖÎ €ï)''çéÓ§CQÑuäÀK-§¾¾þ¯¿þºtéƒñööŽç½–ƒ ÈDËAxþ¾ýàÁssóÒÒÒ©S§ÆÄÄ µ–ƒ ˆººz-§½½¸ª83‹EQô·ß~“••å½ W¸µè{Œªªj@@À‰'ˆDb@@€‰‰Iss3‹Åê.0MPP°½½=33S__¿   $$¤¦¦†—&ß~²£111nFª««~ü8¤]@¶‰‰Éð Ðo‚¿¿¿¿¿ÿp 2Š ‡¨§Ú+ çñ ¯R6mÚ´~ýznFâñx÷…ô Tt ݲaÆáÒ5Ã-¤#\vÅ{8p€ŸŸè毪ªºÉ¹„û®G‘Tt ]0wîÜ!µís#õ ÑÎû÷ï‡[¤[ ¢é‚{÷î ·dÒÒÒ›µ¤¥¥y³dŒô“iÓ¦ ·H/À€)@ c¨è@ ³@E@ Ș*:@Æ,ÿ9E‡Á`œùä{{{PWWg0¡¡¡ýq˜H"ÉÕ%º90™Ì°°°C‡õÇ^Þ+ƒ6å/ñ޾_½Û{t*++ ªª*99™Á`´µµ©ªª®_¿ø|~ll,…B/^¼¨¬¬|úô©®®nFFp¹Ü›7o’e±Õ nݺ%++K¡Pîß¿ŸššJj³ÙlÐÒÒrssëÍÑVUUµ¶¶“š™™™™™@ppð£GBBBš››÷ìÙÓÚÚêëëöüù󨨨’’’ððð¢¢"±…qqq—.]òôô¤Ó饥¥>>>ùùùL&“F£‘ãMLL|ôè°ÙìË—/'$$p8*•ª¯¯±±±wî܉ïØÔn6©7Ÿ†ØÏ‡N§ÀþóŸo¿ýVEE¥­­Á`¬^½ø|~RR9¿uuuUUUÏž=ÓÖÖÞµkìÙ³çöíÛdYlõS§N•••ÉÈÈP(”ŠŠ r¼{öì¹rå —Ë€1cÆ,Z´¨o¨®®îÅ‹IIIcÇŽ•‘‘ ?}úôúõë•””®\¹²dÉ’«W¯jjjzyyýþûï^^^/^¼8|ø0p8œÖÖÖ-[¶€³³3Ç‹ŒŒŒˆˆ¸xñb§êÿþû¯··÷Úµk­­­³²²nܸ!äääÒÓÓÏŸ?Ïb±233i4é‘4TW×ÇÉKÌ«ªªÒÓÓ Fkk«¦¦¦««+œ9sæöíÛ Eô×––VRR¢§§§¬¬Ìãñ•••€Ïç'''“mR(” 6ÈÉÉíÝ»÷ìÙ³†††4ÍÄÄdîܹb·ùº½÷!LùÃÛ:ú®=uRRÒÅ‹G5lذ!C†´··Q©T>Ÿ¿sçN²M™   99¹]»v8qÂÌÌLFFÆÔÔtÙ²eb·ùº½÷L·‡²Ùì«W¯N›6-((X,Vrr2¹îÏ;wôèÑÅ‹'&&zxx|Wee¥Ï… X,Ù“É-‹­~éÒ¥•+WN˜0B¡üþûï¢Z/^¼è«ï+dÖÙN3WWWÿòË/¹¹¹äÍW 111äƒNII¡Óé£G.((hmm%‡Ö©0??¿¡¡¡c˜RTT4mÚ´ÒÒÒS§NihhÀæÍ›¯]»†††­­­0cÆ Ñu¢›Mz§ÃïfGßµ§öóó;}út@@€ŽŽTVVîÚµ+ 11ÑÝÝ]$&&nܸÑ××÷ï¿ÿŽŽŽ–‘‘Ù¼y3 tÄöþb÷Þ³3Û­@GSS344´®®.00°©©III©²²2))I´‚’’466Š~ÕÓÒÒ211yÝÅVg±X999ÙÙÙ óçÏïÙñ¼ÙèÑ£eddJKK;¦I¸ š­mèС|>Ÿä‡;Î0LJº …ÂÙ³gwLEŒ=ºÓ;ѵ´´Þé÷ÎwmR/=šÉdÖ×ׇ……577+**VUU¥¥¥‰V Ñ}SS“høÎ˜1cÞð%RlõÐÐÐãÇ;v¬±±qöìÙ}Òò·ÊÉÉáñx•••¦¦¦B¡pñâÅ+V¬­ ­­ÝÔÔººº¤DOOïu[[N§³Ùì!C†Ü½{÷Ô©SgΜÁ 4‰Ápu‘›Ç ÝöìÙCþW …Bkkë   ãÇçåå566:;;“ÿ544TQQ’Ü%…n#¢[¥ªª*ù *ŠÛÄnSìÞûê`yÊ¿›½ØžÚÔÔ”D9 ¥¥U__]B‚††²¬ªªJfwk±Û»÷žy‡Ÿ®”••¿ùæ.—»uëÖÉ“'tú&A>QøF¾²ˆ:ãÖÖÖçÏŸ“e±Õ/_¾ìééI–CBB¦OŸN–ûð±WW×Í›7¯^½ZMMíÆ>LNN655õõõ]¹ressó·ß~;oÞ¼û÷ïÀ7¬­­+**ÈÝ»w¯káœ9srssÇŒ£©©YVVvúôi&“éì쬭­½qãÆ¥K—Òéô{÷î9räèѣÇ'½þ‘#Gdee³³³•••׬YS]]ÝÖÖvþüy …¢©©©§§×Í&õÕ'JJJ{öì ±¶¶^·n]§Dîq¢¯bwîÜÿ=¿<,‹­~íÚ5Qž922RköÓc#¤yMMMvvv‰‰‰k×®mnnþüóÏ tttôôônܸ‘——Çb±–.]jjjºtéR__ߎɹ!C†— ]«Óéô/¿ü200pìØ±êêê'Ož …ä–MrõééérrrW¯^í#Eo°]] cëÖ­{÷î ´²²òññé4wÇ¿îèèh[[[¸{÷n]]²²ò‹/HÇ o# ¯Û©ØmŠÝ{_‘¾”>¨·vôb{ê›7ovìýI7G§Ó;’qb‰Ý¦Ø½÷L·žº*..ÎÎÎ^²d‰ººúÇœ››Ëd2Ùl¶œœ•J¥ÑhÖÖÖ“'Oöóó‹ …---¯^½255CCÃíÛ·“Ü÷ï߯®®VWW[½  àöíÛ/_¾lllœ7ož¨æææÛ·o§R©ííí6663gÎìÍ«¨¨ìß¿ŸÇãM˜0!88¸\nLLÌÎ;i4Ú¼yó6lØ0gθpáùE9%%åöíÛ] ccci4Zvvv]]ººúäÉ“---eddRSSwìØÓÒÒ2jÔ(OOÏáÇ€ŽŽŽ»»ûîÝ»©Tª•••‡‡GHHHmm-_pŒ<ØÍ&õæ£ RSS¯\¹rìØ1—‘#Gª©©¬[·ŽËåÊÉÉÉÉÉÑh4 kkëµk×îÞ½[(¶¶¶¾zõŠ|ïÑ××çp8䉭òòò'OžŒ9RlõS§Nýõ×_¯^½jlltrr5ÀÄÄ„ÃáÈÉÉ …BKKËiÓ¦õþ € ôöôôܶm›¯¯onnîúõë#""ÔÔÔ¾ÿþ{7jÔ(;;»)S¦P(”ü188888XAAÁÚښ䫌Œ<==7oÞÌçóÉýHYYyõêÕª?~üXOOïÀ?ÖÕÕMOOÝ(ÇçííM£Ñ¦NÚ'Ç…Þƒäê"7‡“'OΞ=[MMmذaÅÅÅk×®‹‹£R©T*U^^~Ú´iFFF§OŸþ믿š››IÀGªëëë§§§ËÊÊ>}ú”ÜiÀÛÛ[4FG(úùùÀîÝ»‹‹‹ÝÜÜÔÔÔ®^½ºwïÞ5kֈݦؽ÷Õñæ”÷;z±=µ©©iZZÚ!Cäåå) Äíïï/£# ÉÓÓñññÅÅÅ$ºråJRR’ŸŸŸØmŠÝ{÷¨# øøøìÞ½»gõ߀Åb‰å 0‡SVVÖ#?Þ.\9räÀïšÍfKå“Dׯ_···¯®®Æ5¨Ï ª«ë=¿E”——/Y²$//¯c!›Í.,,ì”òÿâ‹/êêêDùu{{{###‹•žžnmm}üøñððð£GÞºu«káÑ£Gsss½¼¼:¥ü]\\º¦üËËËçÏŸÔ)åËf³E)ÿn6I__ßÕÕ5++‹Œ:ê?ìîEFŒaggwäÈ‘®ÿÕ/³— µõÓ+Rd‘'ê¯\¹’ššJÆ'J²²2òÜþo¿ý†¯pD}kP]]$D^2$é¶¼)Kù“ZûÉíܹ300PVVvöø®ú1£#A˜ÑA=ãäätåÊÐÐÐ ·-„ú ^]ï±é30÷Á@gtú@‘ñõ¼º’ˆA7×B!„ tB!$µ0ÐA!„ÔÂ@!„BR „BI- tÐàbllÌø¯aÆåçç÷ÉfËËËÇßOÓY „ê1 tÞîóÏ?7ù/33³¾šT¯ªªê³Ï>îq€¥§§oÛ¶ ~øá‡ƒΚ5«O6ûìÙ³êêj>Ÿß'[CœüÑÊÊJ]]ÝÞÞþÍÓNõ2&Æ¡wõö@'99ÙÞÞ¾¡¡¡¡¡ÁÞÞ~×®]=ÛSnnîªU«zVW²bbb6nÜñññ‰‰‰S¦Lé“Íòx¼ÚÚÚ÷¼k±··uuuƒñ>¿öõ‡}ûöùøø|þùç)))£Gž7oÞõë×_·r/câ÷0¤–¾»Ä '}þÛ 6L™2EQQQQQqÊ”)=¾4.\¨©©Ù³º’ennnii 3gΜ1cÆG}äàà`bbÂd2­¬¬ÉkÝ?ûì3“+VXZZN:5..N üóÏ?&&&---¹¹¹¦¦¦dÙÅÅÅÃ쬬LLLÈï¡9sæØÚÚ2™L&“E&[~+ggçÑ£G÷wÛúJxx8ÔÖÖ&''Ož<™¼±ž+ÕÕÕ;wî Ú·oß×_­¯¯/šÏÅÙÙY´œžžN–3338°nÝ: ’>ŸñÍ7ß,\¸033sΜ9K—.ífL,!õ`¸Kˆuâĉ¹sçZZZº»»—––¾aÍ^æï8ý/}~ߌ\UU•œœÌ`0ÚÚÚTUUׯ_OÊ“’’x<ŸÏŸ5kÖ§Ÿ~ÚÖÖF&/¥P(dúñ7Tçr¹7oÞ\¹re^^žŽŽŽ““Ó¸qã nݺ%++K¡Pîß¿Of¢—8__ß°°°çÏŸGEE•””„‡‡ùøøDEE=yòdË–-©©© Åßß? 66ìììêëëããã€Íf_¾|9!!ÃáP©T}}}IÓÛ=þ\4 ŸÏMAL¡P6lØ$ð …rrr¢s½zõj--­ˆˆضm[UUÕ·ß~+Ö¿žžždgg+))ikk>|¸¥¥…L‰œ‘‘1iÒ$PTT ûú믭¬¬H-UUUÑtE'Nlii''§Á0Y#êèÞ½{<oùò墒åË—çååmß¾=,, œy<^dd$¤§§Ÿ?žÅbeffÒh4##£ñãÇ3™LR×××ÇÄÄP(”­[·²X¬-[¶¼µº„úµ¤õ.ÑUNNζmÛÜÝÝ'NœxöìÙÕ«Wgffš˜˜ˆ]Y”¿ïÙý¡—ÕûÄÝéw+Ðyøð!›Í& ¤„Åb%''ôÑGpîܹ£G.^¼üüüÈ QQQŸ~úiJJŠ›››¶¶6TTT ýuÕ™L¦««kyyyBB‚h×—.]Z¹rå„ (Êï¿ÿÞûº––6tèP--­‚‚‚öövCCCˆ‹‹›0aÐéôøøx‡ØØØÒÒRYYÙ{÷îÅÇÇ“e@@–%|0oSQQÁårù|þÙ³gE9ŒÔÔÔ%K–Œ3ªªªRSS©Tª(~øðaHHY“Ë妤¤e•÷p†?r ÈÕH–eeeɰaÃÈ: C ”––ÚÛÛ×ÖÖÊÉɽnYrÇ$ƒœôާ^NNN(†……‘KâÎ;‘‘‘d¹­­Åbu¼TH×øý÷ß›™™€’’ÒÖ­[,X°eË–îTOHý]¢“ööö¤¤$&“¹råJptttuu%IúÒÒÒ°°0¡PHîðS§N­¯¯+++™ÐÐн{÷ÖÖÖš™™Ý¹sgèС‹/ž;wî²eËZZZºSÝÕÕµ¿PÊ:ýnýµhjj’©è ®¬¬LJJ­ ¤¤Ož}ÖÐКš* wìØÑêp€RÖé÷ðkÁäÉ“:¥Ñâââ¶nݪ  ÿâ ¬¬\QQ! înÞ¼ù†êb]¾|ÙÓÓ“,‡„„LŸ>½g îÒÒRÒò¢¢¢!C†ØØØÜ»wnÞ¼innN:EQØ»~ýz//¯æææ={öÌ™3gÈ!ŸŸßÞÞ~òäI¨¨¨ÐÓÓ#§933SMMíï¿ÿ.++KOOøC{W555 UUU¢ïj äB}Wë89³»»;‡ÃQQQùâ‹/$Öôÿòòòzüø1xzzÊÉÉ8qâ›o¾!ÿ¼{÷nTT$$$¬Y³ŒCBBh4ÚòåË·nÝJ£Ñ¼¼¼BBBø|þ¨Q£`ûöíYYY: ÿôIDAT::¡¡¡»víjnn600øòË/%zˆh@ÉÊÊFFF2™Ìšš33³“'OÄÅÅmذ¡;11¹ä¤)¤–‚»D7Q(ÑrÇܼ¢¢"ùÉ› ñÜÌ™3Eë± §cú?--­›Õ%âƒîôßèp8œ’’òí¤¤¤$&&ÆËË‹Éd²Ùl999*•J£Ñ¬­­'Ožlii™””ÔÞÞÞÜÜ\ZZ³råÊôôt …" étznnîÂ… ÅV‹‹+..&é2›O?ý nß¾ýòåËÆÆÆyóæõþ€{ 88øÉ“'(++›‘‘A~f(**JLL€ï¾ûÎÍÍ ôõõwìØA¥RçÏŸïïïO¥R—.]ºcÇ>Ÿ¯®®ÉÉÉ\.w̘1ëÖ­Û·oßË—/uuu Ù3W®\ár¹ dee-ZÞÞÞ¢_ß…B¡ŸŸ…BILLìx® æÎ òòòºººÏŸ?'·iɺsçN§’Žw[Ñ2Z˜––Öé7‚øøx2ʪ“M›6mÚ´©ÛŠ>òòò±±±iiiÆÆÆÇ޳µµýý÷ß»Ð!µôÝ%ÞJKK‹Á`äç狺äãÇÓéôÆÆÆîoä½MÿK_§OŸÝ»w÷ÉæÞ§¬¬Œ¤RÌíÛ·ÝÜÜx؃ƒÃ… FŽ9`{ì™ÄÄÄU«V)**Jº!ÝuàÀ__ß~øÁÈȈ ÉB¨?”––ÚÙÙ½‡ÃnÞß%ÊËË—,Y’——׳êyyyQQQžžž&L(**:{ölxxxdd$‹Å"ùûëׯçååéééUUU9;;ûùù‰ò÷nnnººº¢ôÿ¬Y³ÜÝÝ,XÐêï”þwuuÍÊÊ277ïÙa~@FŒaggwäÈ‘®ÿ5Øÿ´úÞQTT¤¯¯ÿžØ³gÏ«W¯ŠŠŠ¬­­mmm%ݜŽOOϹsçþðÃ’n’Z$ÅXXX8˜Cêñ.±`Á–ššzàÀƒ½{÷Nš4éöíÛÝÏßKYúÿ}†>coo_SS³fÍûëFøP2:!±ŒŒŒþý÷_Àz€õ2£Ó™þÇŒ`F§õÕÔ¡Á£ã14H`ú€á\W!„ÐÀ!?¡’ܨ¿aF!„8˜þ`˜ÑA!„ÔÂ@!„BR „BI- tþ‡ƒƒƒI---gΜMUM´··OŸ>¬ DåUUUŸ}ö™hÊV$A'NdtÑÒÒ’ŸŸ¯¥¥ÕqM@0vìX²B[[›¨¼¼¼|üøñx6QWxu!ô¡À@ç|õÕWÀáp¸\.—Ë  åFFF›7oŒŒLbbâÆ;mÇãÕÖÖòùüi0zƒ   ÈÌÌÌÊÊÊÊÊÍNgnnÛqMYYÙ¬¬¬mÛ¶uÚ³gϪ««ñl¢®ðêBèC1@ŽØwø¼‡ÆÆÆÆû÷ï·³³›7ož¹¹ùÂ… ɼ²™››[ZZv,qqqñðð+++“˜˜@°{÷n;;;KKË+Vy³àðáæ¦¦&&&yyyŽŽŽvvv×®]+((prr²°°X¾|ùœ9sD3¢£ž122 ‹””ggg777[[[SSÓN+ÛØØL™2¥cÉ'Ÿ|booêêê #44´­­-::ÚÀÀ@]]ÝÉÉ©¸¸˜¬™žž®ªªÊ`0²²²LLL .]ºtäÈ33355µY³fYXXàÙ”2xu N˜õï¦Ã‡Kº ÿo€//++˜õ GGÇaÆÀ°aÃöíÛwçÎ;wîtçeÇl6ûòåË ‡J¥êëëÇÅÅ]ºtÉÓÓ“N§—––úøøäççkhh888¼zõ*>>žÅb­Zµª¬¬,))éæÍ›îî¦yyyeeeííí’®V:˜˜˜7G9²°°ð?þøã?"##ßZ1==ýüùó,+33“F£mݺõôéÓëׯWRRºråÊ’%K®^½ª©©éââÒÜÜéçççïïÿçŸnÛ¶íúõëk×®µ¶¶ÎÊʺqã†@ ÀÉŒ¤^]ƒÍW_}ÅápÈ^YY™¯Ïúß¼y3..®c¹(ëß©¼?\ýõ—¤›ðÿðoCŒ„„„ŽÉç &¨¨¨t'Ð144$“ÐΘ1ƒ\Äùùù ë¹»»3ŒI“&À×_=þ|¨­­]¾|ù¹sçjkkÍÍÍׯ_QNŸØ¿Ç™™™ªªjwº¢‰'¶´´€““9›¬««ëX·°°píڵÇ'_ævíÚµ|ùr¨®®þì³ÏNœ8QSSccc³eË쇤^]ƒ(ë–™™ùìÙ³ .,\¸°ªªŠN§“™ØEÌÍÍi4ZÇ—€••¸»»¥¦¦æääÔ××ùúú’ÿ:|øðŽ;„BaTTTZZZkk+›Í®©©IIIyòä‰A}}}AA…B¸ƒÿ`õûŸGBBBKKKשØßgS§N544ì“M …ÂÙ³g/Z´HT2zôèŽ+8::’…>úhÓ¦Mòòò<¸xñâÏ?ÿ|àÀ>ià goo?qâÄ>Ù”P(\¼xñŠ+D%ÚÚÚWh:Îf³‡ r÷îÝS§N9s_&•ðêœ0ëÿ:}{{{ É6©ß2ž÷Õ«W¡¡¡ý½¯Þ»wï\¼x±ãü#ÅÅÅÕÕÕmmmçÏŸ§P(šššzzz•••PTT¤®®nll ŠŠŠpäÈYYÙìììÆÆÆ³gÏŽ3FSS³¬¬ìôéÓL&sîܹwïÞýí·ßȾh4š¥¥åµk×BBBÖ¬Y£¥¥5bĈ¢¢"¡PˆÑzoˆæ…ÖÓÓž={öÑ£G|>ÿ§Ÿ~¢P(ººº†††ÿüóϽ{÷îß¿OÖ×ÐÐ ™ÊÊÊžž.''—‘‘A¾Béèèèééݸq#//Åb-[¶ìÖ­[%%%¤®¼¼üÔ©S/]ºôå—_Ž;V]]ýäÉ“x6¥ ^]ƒfýßà=ìô(á9dÈÙQ/‘)H‚‚‚Æ/@Y[[ d:tccãƒz{{“9‡ 00ÐÐÐðÇww÷Ý»wS©T++«M›6•””dgg×ÕÕ©««Ož<™Œ_öóó{üø1Ù—ŒŒÌÎ;GŽ©¥¥uìØ±šš--­˜˜¼sõRtt4xyy™šš^¸púúú’IæÉ°ñI“&;wnÑ¢EUUUdOOO“‹/À¸qã¼½½£££i4ÚÔ©SÙlö¹sç¾ÿþ{7jÔ(;;;2ÂÔÍÍíÑ£Gd_222zzzxüø±®®nzz:žM)ƒW×`†Yÿ·z¯F QÀÇLJtðRƒÃᔕ•‘¸Dº988\¸p ‡D!ÔMåååK–,ÉËË{§Z¹¹¹,‹ÃáhjjŠb’õe³Ù]³þqqqñññ¢¬yyùüù󃂂HÖÿÁƒ4ÍËË«kÖÿ—_~!?r‰²þAAA$ëñâÅ¢¢¢«W¯¾5ÆuuuÍÊÊ277ïÙ§ô1b„ØG¼qB!Ô-˜õÿa ƒBu˹sçºYxêÔ©×mdÓ¦M›6mýÓÖÖ–¼²£Ó§Ow­ø®ù'Dà›‘B!$µ0ÐA!„ÔÂ@!„BR „BI-ŒüÁ+..f0’nB}HÈ3Mh0À@çÃ6mÚ´C‡Iº!ôáé4ß8’Vè|ØÂÃÃ%Ý„Bèý…ctB!$µz•ÑÉÍÍMII™5k<}útõêÕÝ™þ#77÷ĉ½Ù5B!„R^^^jjêÌ™3á]:ýcÇŽ?~\‚~¯… Þ¼y“ÌPÚÞÞN&ºëN­Þì!„BlÁ‚·oß~×NßÅÅå?þèÿÖ½VŸÑyþü¹hÊx>Ÿ¿sçN²,##C^nMJ( •Jmoo'ÿûÅ_|üñÇd΋õçŸæääôU“B!Ôž={&¶Ó§P(ÁÁÁ' …BaÇNùòå:::ß|ó „……UVVfeeõwS{è<|øÍfóùüS§N±ÙlR˜˜˜èî¥•••‰‰‰T*ÕÍÍM[[***6lØ@ÖLIIIHH 3“Ñéô´´´^¶!„BýDÔéÆÆÆ’B±¾««+)éÔ铉Q@QQ1%%eÚÜÛÁÈššš¡¡¡%%%gΜyôè466’Ã--­†††ºº:倶¶6™­GŒQ^^þâÅ >|x/ÛƒB¡~"êôùå—3gÎÔÔÔÀk:}QIÇN_EEEAAáñãÇ555}ô‘’’Ò´¹/Ÿº?~|uu5ÐéôÊÊJRXYYI§Ó•••+**HIEEEÇ1:«V­ÊÈÈÈÈÈøòË/û°1!„ê?†††Ož<×tú¢’Nþš5köîÝûÝwß X§ßÛ§®Š‹‹É/V@NNÎÍÍ üýýE?× … …Bâ…ÂÆÆF:ž››»páB——;vì³gÏðõ¾!„Ð{+//ïçŸ&~{{»¬¬ì:}‡mmm¤Ó?v옋‹ ((( 6ŒB¡((( L³{ûÔ V:¡R©[¶léTöºíÔÔÔx{{÷¦%!„êW ,X°`A×r±>y8K,·qãÆ>nÜëIøÍÈ\.÷åË—gΜ±µµ6mšdƒB¡þÃår›šš.^¼èèèhii90;•p Ãd2`óæÍ’mB!„úéôßð OÀ) B!$µ0ÐA!„ÔÂ@!„BR „BI- tB!$µ0ÐA!„ÔÂ@!„BR „BI- tB!$µ0ÐA!„Ô’ðýçúõ뉉‰’nB!$1Ož<‘t$O:éÓ§···Kº!„$khhHº&޵µµµµµ¤[B! Ã1:!„’Zè „BHja ƒB!©…B!„¤:!„’Zè „BHja ƒB!©…B!„¤:!„’Zè „BHja ƒB!©…B!„¤:!„’Z P(22ñ „Bèƒ$–.]zäÈ‘®ÿõÊ6D„1îAIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_access.dia0000644€ÿÿÿÿ00010010000001314311727205032023344 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬µ1œ'máë9j£ëÇpàÆe¹V"7»£Þ[~sµkMMÕÛ{c'ÅÏ{ã~k£ïcoÔ!¼ÐÑjǺ= ©t¢ä¥vëM2‚ˆ ÛRn¾Kvf²¡not3dÝ|½ºz²[£^½$ ú–Õ*…Û°ZÛ3–Ö¬ŠOQÅØ— ©Ùu‘H”Ê(µÇ—fKÊØµ&ÚèD ^)ܽ ¨1«ãëUG%ûÒG´è¸õIÜÞƒÛÑÇö¬åÝ1«ã“ÔQõ¡Že6rxàWMTàVä6Î<ºq×P#åmÔ:«äëUÉΩ˜l¢œVÐ2BÐF£k,¯rF-½’Ö:üOeU}ªú©ø¾ªÒÕι™U0Ò9íHiüâT /Nií9a)Aˆ%ŒXÜòqŽˆ²“m“ÄOç³Ùq1'ŽZñù€ ȶ‡¿(<§›Ÿ§ªªíI–Àl|äP£I­”ˆAzf9 Ö%J2„5u.•ºí‹'Éa%Ÿ5:{‡‡v7r¨erè'äðI"Á¡‹7x(·…‡•|ÖË¡ÜC< ;’ÃA¸kO^:V/%£ SlÃ*K R½ž©ŽËêz&i¡ ÁÈ=ö`5ôàÁ‰ºëÒM3¼¬¶Ê , K+·JÀïÀ‘l°{µlÖv!Þ»mÒ1ÃSÍé¢î| @®£7f@ÕENrÆ×®)Ð) qrøRví)oó¨ñ·OŸ>þ^|-¦¯1!нuC­$¾„ƒDùlµéÁÂIlZDÍ{˜bñ ô¸Êø ÃGþ½‰üN5—M~Š®õä§ÝíezG¦vç“"¼íiŽ%Õâñæã!%ãR÷4²Õ7±hMªç÷Ö+fY¬e´"37YÓReÊņ©26Þ}öbÖÛE³Ýnèî“VüºKO—"Ùfá‡hR>ïÔ¨SfY5ìw7 Z.+–RÇyÙ±#B®Þתáúó€(˜Q Î;í~´ê˜KþŒ0×%žªÿÜ^$½þ¨ÓÉÕ9Û«ñs¹6§'§ô×É´X^-WÅ9b½¨ÂŽÎâ^h Ñо.y"½{MIK?Œè¥‚Ô,ëá^˜lÒDX A{8d¢ãœŽ&Ž4.X4nµ=Ì¢uúø>®6 Du Fš|ù` áMý~ ‰Ï“é´‰±§ç³èRüнJ»G½Í(ï™8•ÁÈ'Ý¿éäâøË|1ùni£éƒÌ}M—E2ˆh«ÉiDz²Å:'v¡x1÷£f: »?¦XYؘ-±­Yb›‚˜M1Nà03q$/l¼Q?|¸ô¯}iµPâFî´°‘?z“åéÁãã‡Ã¿fUðÑ9 õ[ù8©as^(ÑNO¤¤Q0$¯'Õ‡Qj³dÔÔ›M\9MEŽÎDg¬1>Ã9?ÍàE¶¬öÚ([ÏN|¥®ÜçôÈ®ÜëqåGÔî%@8‚ÃÛË:A¨Ñ=uÁrV–çã4'vä.#hFÐŒ /$V“ž`:§ÍZae\Ü·N«i¤[J‰Né 2©)©¡Ã…” ÀiTËçG)A!ç'¼®üס«¹]Í?\h* î, ¦oPŒŠ³Åh…~{"˜Æ—cz@(æºÇ&%…”†IádrR•ítØdšpw&›7¢×Nki½­óòšÍ,í‡Ø+µ°N=³…õŠ|Ô'A«í¡Ï*H(/æ>«b!ƒ~VÙgÕY• 4k&G/LfhÍК¡õõ@k÷9{×å!hЩ¶UâÍ‚¬‡”©¦ÒÐÒx=HIrÊXÇìƒÉ ­Z3´¾¸àO‘ú²24è{èWi#P³•‘·c¥5‰’±HiRX«"5ሦmbCkµ&›@ªQFKç,­´ÒGNHõ4 >€ Ê«ÛÆR&3¼yÇ›)"÷¨øLÏ­Û Ý;Í]W¢¥ PäíJ‚»ŽtÅ¡F à:ÒY#]}0™m†l3d›aŸm†&¥J¦{ÏÄë‰À@:Ãzv`Ñ +)ÑfJU©é5"ªV¼¥J½0™K•r©RFÔ—a;WDj«¡S*B#8 ©÷kÊÍÐZ )†@r3´á9_Çåg ¸RkŸs3^Un†]zGØÝt±Ý¯ÚrnB§*Íâ0HÉ„ÔxÕY‡0„“*M•1–ªLŸ•=Ì~,m=1ƒš™?h²Þ}h¾=½e–ír5Z¬ƒ4ÝùÚÛµÛD{‡µž°zÀ GÍýRKyÅŒ`ÁRo@ kV¨‰²r>ðcE5ŸÕý¡ÞŠ`¤ÊP‘¡âE@…î*Ö{(÷Ô) ˜èHs¢3,͉4>_n)*Ù¬lwj(*Os ­¹“¡"CÅ3ƒ ÓTÀ¶<ð²…£h$“VÙä@Ðz XÍ<Š ÊY8Öd¨ÈPñ" ÂîTDÓô6¯J«¬)­ mžTè(˱r2›+^V¸>›üÁŠh\šäéu2+”:aEŒ[Œk†G=åÔ¶YA(2P<3 ð}l-T‘zTÄ †t¢e+a @ÍB4K;P¨‚‚›*Û*^T„=;‰iô  1TXe¨‚½ÅSÎ?¢0Q*úœ&úŒ)v‹ÆyŽ p)ö‰Küqì€Îc]H®Ž>Á´ÍVm…K‡E”tô9b>˜ÍÀô2L×9éSy!uYäkX‡ÿ)'bP)bŒ³C"}ªR‚ì)5lV¯4>9a!ú½™ø~¶¨ CK©ÍÏõ½ãÕWº>2C´4çTYŠwÓ >MTUà e.*¤80tø¼¤}0Ù¤„ú©€ÔJ%XAÔ¬õu-c 'óŸX0ìžý pÐ:GŸfõ"&y^xVDI ÿóϱ¤ìÚSÞæh€&«H—uæéL] ¤¤ 7 ê}Ьú‚‚‡~‹H‰!Š\ë¢mB~ûôéãÁõ ÄW§Ó"‡E8Â"u™Ã"½@Éûù÷*$霳ã(é5Fj;  hÖÉÌ2Æ5%åuj‹žúœàì<ë4¯^˜lrLàÑnõ|4¤tN¿®s‚n­,ǧô|mœúQÎØƒr*KÆ*nº†Õ,&å”kJTûGÊiȪ »處³;“Y9³r>Í÷ÝsEÈâ1f ¨N²&‹ü ¤) £€H¯AØö”·i„~¸É²ø½øZL³ Îaƒ× äK°Áåîmð:$Q=Œ};0‚CJZX;„€´ÂóGóåêb4^{ï»ÇŒ° oÞϧ〘1ƒ3 Ì0-t'X“û®ÉXa ‰ôh¶= Þ&||ZŒfË œ Q!7XqC÷€½_ è+£™-ŽDÉ çRj_RŽí)o@þ6ºø4ÿÇj¾G8q¤Z"3”°BIÓª­¥Ž}àxa©PÞÕœˆ‰`p{pðˆžK±ø8Z,‹EFNô¸/„9X‘Ãöa„à—Ü—šRÈÃîAØã—ÓÓb™^ƒcSú2b°"†ëÉÖ0ìÑ¢¢S°ÃPLŒRk÷ ÖñËåêK1˘Ámf˜ëØhø>Ì Ê†çöOeß’¢åL¸½ðO2þ“ƒÕÊØ¾ ¬€z O9O`yÃS¶S:OI)VÁîÁi ^-£'ZÜ“¼Œ¬h{‰bÐ0Z*ì‘Ü6Q¢JÕ pÄ4W Ùšò6Ñã×É÷Ë‹ ¼!*Q̉!¡{)$¿_ÙȈ Q²9¬³qøƒfhMs›Øñ²ƒ3zp&ŽV áKÀx¾Ø¡zÀæk^ðPdf$ëíñcM7î€ü>?ËàÁ •R˜Ñƒ³Õi裙^4!¤Jn£X;ûP͸ƒDIÉH "¥²†ÎYð¥æïuZÍgåRGmäQ¤c”y²C[äçÑib£=±öNO¥ØJtFaðžtU‚^”0ÑøRùÊ6²ZÅ@gn­n”¨ã³%‚O½Y”<Ô!ƒÄÎ@¢Ë84Õî4·–[çLä¤MÃ'xfÃÅùd§øh"9R'3pø©šÍÊ¥4_&õMó!¯Ë´Ÿ¤wI¶HòÚ—Éb¼}É‘Ò0M#¼Ž É{•Z>XÏI•lV#’5e+Ji!#RF¤½D$³#Dr= RP¡lºjØm$ïËN°)¶¬V©›Oô[°‘*¹¬$Ò˜ÔÊd@Ê€´—€dwH¾@²Î§Ä7ã9mA::O·ÊÇ-8mUlV"’µB—m¤ŒHû‰H~Gˆ{@$ém9ÁŒã…$itêˆìŒ6if£T*åšm„¶«ù¬·F#Nh©Ñ!cRƤ½Ä$µLнLD6 |.jÞ™›VÒ)R2RÓ¨ À õ¢ÞÂHäJ>+–:¥OiBÒæ €ŒI{ŠIГÊ×ÓÑU±øù |ΣóŸþäwGxummod_perl-2.0.9/docs/user/handlers/http_cycle_access.gif0000644€ÿÿÿÿ00010010000013352411727205031023361 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§X”.¥¥¥£££ŸŸŸ›››™™™———•••“““‘‘‘Cq#‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooo…àEmmmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôòòò\š0???ððð===îîîììì999êêê777èèè555æææ333äää111âââààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾l¶8 ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®/¬¬¬ªªª¨¨¨¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVV  TTTPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷0PBBBóóó>>>ïïï<<<ííí:::ëëëéééççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&××× $$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠXN©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœOÑšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=ò "ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîgiíAL d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("4PX^gÀ@ÆDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb L¦þ ¼àË©´Öjë­™¦š£}"¯¸ðB)­à¹Š’ˆyÊ \¸Ð†˜/à*í´ÔVK§®Ã­ŠÙ§‚D;äIà)CãŽé­µè¦«îºRbû¯Š}úÂE@ä$2¼0%D¦°+/ì‚H¿ÿ<ðe 3´:$$/°C+® ¹/d ‘¡ÈŠ$¾úò;¤¿ üd¹E&¼pÃCªàE -ƒs*3ìð粫óÎ<[ë®gð&ö) IBò‘P@$ö„Ž,E2í4ÔCŽ’‘!D¶q‘(™óÃG™ôÒM?}ò‘Vc}°*r ùαU_=dÖEŽÝóþÞ|÷+£»j{Ù§1$ùŠ‘3yn΋IEÆ»Âu‰Ù ØJê}x‘•‡Ñ¸“(?ÆãK>d>¦ ‰ÂŽCþ‚éŠû-ûì´#úsgA#&/HnNdçŸãû³"Ùù‘a©9âÃ{¾ö.¯ä kŒs|ñIê]ûöÜwÏæíœå~اñÈbŽÜ>¬F$ɉÒÂÇ/ÿ¹£`‚d&™ùÆ%DÞ0FöGbŸûàç<ù1 eÞª_’N(¢H  ÷&HÁ ê pÙêÓ¶n†?¼"c«h‘(‹È@daH5.PãCR! ]Ã0t3`*@ "u¢þ/HÅÂA¤ÈÂ+Å;†Ä‚P#c©a OH$¶ð…LZÆ2V¼æp‡=$’€`$/ê‡Lt"-ÈÆ6ºIàÛŒø ã«7ÚñŽxÌã¢ø$êñ€ d㈙9¦Ž‚L¤"¹3B^Æ„A$#'IÉJžÊ‘–ä`$iÉNzò“ŠÂde4)N^Ê4H¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌ\Æ£T¢¤ )cJKM@Šˆ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎo–Ã^¤Jæd– ˜fVj5þ†>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠ"” ð•<%CϿؓRø´¨HGJÒ’šô¤(M©JWÊÒˆb™|—à,óÑI…´¥8Í©NwÊÓžúô§'}i t§ Å1 Ζ¢$5þ…agKÛÚî± RìcËÇ ²Á`Á>…«OT蓸Ä5np;Ü}šƒ%nlmKÝêZ×¢¸ý=åGPWºÒåsƒñ}Šw¹ämî>W]*Á*P  OX³¥å~ßßùöS¶× °€<Õº&ö®rÌ«d|k(àú`³£õ§tû9áñ#ho?7ñ…}Z¢ú4AôYì“Ãñ>Là»xÀÙu‚ ©àÈ0¸PßU/?+¬ã}>) „A¥ Û` ¦@…$ôY†OègØç‘!¬d~²øÅXÎòlc|)Ý:†·{¹1¡rláïX •nþ)ôy‹€® Çp?ÛÐ+kùÎx~+—-å寀/b™Ñ{æò˜Ç•.€9à€æÁ‘ø?]ç<[úÒ`Ýs¥ú¬˜?ß%Ђ‚l&[Yi  ú„gMAÙ}ªº³­.mgK±Œ‚¶V´Õç.° „‚èàç,jÑÏ]÷ú×Á LA…Í:ÓÐŽöO5M)N'ÆÓvu €+ín{ûÛ ¥ö¤¬l×EÛ€â6¸/mŒ;4@(á€lãëÎ÷>Å-)rÆÜtAwžÔ­ï‡£³0žðS„à0 ˆ yãõÀ·[€Ž{üã ¹ÈþGNò’›üä(O¹ÊWò+ø“ß‘ò·a>ã‰àp&Á q° ËàÊ/òð%°¡Ékè‘„¦;ýéPºÔ§Nõª[ýêXϺַþtuзŸ0åŒYc u7S8Ïyu«Š9Ì ¶K38!Ž\´CéÞ¸‚Þ÷Î÷¾ûýàOøÂþðˆç»/¾Îϰ'JæÜ)»šÎŽ©´«¶G€„TÐ ´ðh˜A­½Z†¼'þô¨O½êW¿úÅ¿ÜÀ¹{&%ÿ(Ê_Êò—/lšÀŒ-°å¤8GHozÖÿøÈO~á]vØk—Sœí™ÏÜ 8Üø@ÜÝþrw8 «¥W¾øÇOþÖ3~ßΗñvYe*Ü[_®ipä²o|?ªá/¿þ÷Ïÿ¾3¿ñé×e²7J´×+ÓwOÕ÷~ÔÕ \@t± l øW|ýWˆ|ÿ‡~0µ~Ô~ ¨€µ% ¤`í0ÕUùw*¸‚§—úäx¶3€ÊT€ñr€ õ hXùÀ º7à" (H,X„Føw. 0x(G4'6w'î—ƒa•P4à 0à 3à‚€¡`G ¨æT)x„j¨†I¸„†Ò„ƒñ„q…v2…TèUaÀ8P}ðUñ}`)p¥ O•†þk¸z–à ‰xxm€|&ƒóDƒBcƒ6…ƒw8W” Vñ@ £0´Ða@ $°è@“@²pž@$P‹0wЇH„Wà >°ª'ìP|'AÀàˆÆW9ЈÈ(ÊÈŒkHŒÆ¸w‘¸Ð×G¸‰…Å¡XBÐ ´€ ƒÈ Gp6à‰UAX1ˆV ð°‹~ »1ðsªçÈwà ¬ÀZ€|þ(9y‰˜Šw~/(‰›F‰e‰ºƒ‰I¥‰ÞW9WA ßàP'@¸0' ¡VáŽWþV¡¦@Ð  ˆP„ ðöñðpÕc° ]P ÓPÍgÆ€ …ˆz‘gpYààXà|§`Àˆhz— £ wŽñp—é wŠÀ | ²Ð{—ÂÀby{— ø ²ðq9—uy—W—{Ù—{7 `éh`‹(—WðŒÿ(™|é—{g–h©–WÀ–á–WCÅÒ×éWD’VA —ð P€ ¥@ž°T!“S“V!œTÁ%áz@vàêÀç€fà `àÖ€ÐÀ Qþ€ Ìp‘ ßp­ÂÀV wMÀ± w”°Ð )` —r™ÄÀ]pVŸî`Ý w¡ DÀÔà× w/`žè)ŽØ˜þ  J Š zǪ` aÎ虌`Ÿr0  š WОïŸóyõyŸù¹Ÿ®YU°IS¹U9›bõsðWa¨0)ЛSÁÛ·ð’XñÛGG0slà ­±@Ö»D ÂM  Ì@Ò Ùàbhpl î`ô ŒHnðø8|@WÐþ€€ zW ÂÀÕp†G6‰ {‘|—‹°–ìœzÀ {·!` 3ppr* wYà Œ9˜ª©œšž ªp / w[Оésy ™ ›Ú©Ÿªwú¨‘:©ÿˆ©„Ym‰V9>?ÊVA*¤_ez­p¤0˜¤S©€¤! #0 ´ð $À µ¸ U‘ª0ž@ L@ õ  `£gQH` ÇÍPÓP ]° cPg`m°r@ó fà§À>`Œ }°w“m w+   ¬ÔÈŸ0 hþ²W€ÑzG{j¡WÐ`{ ¯º²-«w0[2»°Û«ž ¬´!³"K²`²(‘¯§ª}>*›Ø:V ³/ะ)€Á  ^Z?…•J›²õ" wÓ ð¡õ` ÕP‹à~ЕJû}טáQ°¨Õ¹ ÇV`×°•Ž€{7¡*—ƒ[¸Wp¸~÷¶oé•9—þxzdzr ¹›‹·zË·~ë€Ë¬UûšÛÈ]Z»µ`u0kˆFxQ ê  #vZâàr=…• ÷Y°wžJ©@ð z 湬þà q€¸W !š 9 -ö© ]`€ Š@›ù- qp²W Þ ¹@²¬àW ~ +@ á)0¾å{¾é»¾íû¾zW`Ï+s ¹@ÀÂÀˆ ¾àÀ¾î ¿Ô+ Ö‹½Ú˽Ià½à»£vÕ£GU­|u­´ëTó ú”fÀ wa§ ^0Á0 ÔÔð¯:…•Ñf¸w[0d Ô`{Gç³ð@Àw!Àø ¨ÐÜ î Œ²;pŽ Ëé± ºWP\ x¼h{Û°j ô¼ú0]|_Æc\Æg¬«þ£ ø`³´p€X2ÛÇô`ÆhìÄP,ÅTlÅXÜ$|`&œU(üX*¼ÂKEÈ)gûô âJyàÓ€x $@®¼SlûˆGؘý—ɱ·ÉzÕÉ¿õÉ ìSÛÀP§OP á(U ùðOaàÉSµlË+H¤ »ºü|WË¥b‡Á¼RË à ³ÌOe  a Š OS`•ü´.lˆAÌ‹ÖÌ‚—pÇ Ïâ×Íê»ìÎÀ<Î9u·ÖPdþ\0aëû0 °O]ýd€ ûÏûÒü'ÐÈË æË vþÐÝRv0UÀ ÝÀB füðOœìð 9UÍ"]Ôæ÷ºà^à~àžà ¾à Þà.àQÐØÏ:nѺXÓJGl=fnÞuO±ÀTæ Uî °R×Àu,Þâ.þâ0ãM—H]ÂJ›LÍá-ÜîPLEBFPnàã:žSŽM(’ý”M'–}ä µ'ÞÞLÛ`Pûí RŽSI>(KMîO>'QÞå µ˜9 W×@€ðÑh®R_.(aþcÞe.'gçþ¹|åLughP?í›Íç%5çRç~qçl‘çq²çˆPÅp¶øÌTŒ05 gk “nRŠ(ŒÞ޾'’þéþt@ÆàTˆP E0Ü­ê"êy2ê|Qêjqêo’긮OU@̳MX÷¨ ÃŽ]Þo¾[~H.h¾ì…± Uðê µ |€mí¥ëxÂë¥í‘4í¡VíâÞOc°­éðTH@]P+kÞîEîwbîxáëiìn"ì¸ÀåOõ ì®OYàÂ*6RÓ€ ?ñ_ññŸñ¿ñßñÿñ oñkPãš|þãY›ãúžPèàøÐa´ð%uêà 6ó8Ÿó:¿ó<ßó>ÿó@ôB?ôDóÙ áãAàL*ÿé…¬Qõ0ÍPR$u`Þ\?x¹ ­»=yçòõú #U.0µ Y¿õ]?÷~÷õöµ7ödP‹‰R5 w×PP@ÌX/RZO÷ˆÞ˜ô2UÞœ¬÷{ïOæpö'X]- #uø‰øvïìxo€ùü „Q%‚QÍpâó`ør¿ùsßù1÷ì_†î›¤îÛ¶ðÖþß>õPeºQ¡Ø]Qšû]/ûb÷ù5ú¢þ ¥â]µ”Q ¯:lü¯üà­üGû~fû¥„ûé¦ûÃÞ YZݦ  ìÚÏýÉô°ûͲ‹òÏïO–í]åiQãÀÆ-Ø@‚ Dì ˜+ >„QâDŠ-^ĘQãÆ‡¾ ä ÌH’%MžD™RåJ–*¢SæLš5mÞÄ™S§NNíTèP`ZEšTéÉ 5>…UêTªU­^Åšu*1 i«Õ˸°wØTöàBŠŽz¾í)‡ã\ºuíÞ…è¤È¥}ýþ}9Tð`Â6{þ,œXqÍ¢?>ÚTídÊ•-_¶z·a˜=»þ@RY3Å,³èV†1XËÅ[öl¼z †„œ[7ÉÀ‹}ÿžyøpÁw,ÙóræÍ?%àÂsêXx€è4ÃÔâ9 |»+XzNPÆg‰¹+ „±óƒåPC2|ÁçlßC `ü@Ú$Ð!Û Â 9—ê8îA o2nA #sª: 7ä°ªq§™³z'€Ë,€ˆ¬Ž‰b”0† &ŽyƒŠ‰ãðä€n®˜„5@ðœE®E"X Æk®`|ji¡5ªi(š`!–8„)0ÌÙ$(Á ÏL©Á ×Ä)B6Ù¬M9KRþnD;ïÜVÁÓ*F¸¬;p‡8Ü™;äÁƒ=å?ô.K{:ç¢!r‹ØÚ#SfŽ+ÀK ! ÂkÈ1e‚D³Ö»ÈÈÌ9çTóM_cró×ãÜUÎ:ûD6YÊ”`'Þ²±!oàâÀ† áB<´èI‹®e<6Sõ|€‡ˆ?'>"Ã#O&Ç'l|ùÁ G²É7§¾COx¥úi"Yî>ü¸fkîŠ'¿üÂ?ºíðèwSÜùÅšw_(è×ÿkúêïî00ÿË´IE0jLˆÏ|D`CþŽG?ö)/~Ãßw2?.Å~þÃàeìAšÎPïrÀŒ#f @L` ‹·À B¦}„O`H ¶)Ì`Õˆâ~Df˜ð`(Á xƒZH§B&ÚŠ…6Œg¨˜NÑ&5„"Kp¨C.bE ê@:îGXÆjÁЀ…2‚e‰M„#ž˜EIÑŠ„©âg‚E:¦d‹]äT `Â@†…* Æ0ØÐ“0”åq„dlæØG¤¼P<‘á%'hJöå…åAbÜÏ“À P@ô¤n_$e)Iô!H}<Š%5y“1 ¬L.•&í¤G?šÁÑxÁ¤Õ+=˜@ý©a æø„Àa•g`À¬gEkZÕºV¶¶Õ­o…k\å:Wºª™éC*K”ºþTZª””êTý— ÐC÷SÂ.óŒg „,…Æ[„!Øþ,¯%Ù+Fû:Å¿ö1°”¥ÞÎÑK€ö)ÁA¶¸èa xiÅiÙËŽ$³úÜì ;KÇÏÊVj®êIl«ç\ÅHŒtÁ£ÐÅõ:áÛPÒ¶¶·Ýfna¸Û,ö–º «W§Œû½ Ë©Æ~=ÈÂ?É(ñÝBZ÷²ØÝ¥v%È](z—¾Êª‚4ð„gÀë¬\¶`™1˜ƒ è xP“& ÿ¤}óŠ_Mê÷üµ¡1Œ§e<Á„Å …8@DúzàÑôÑ€þš,²#梆‘ÊáKz8~ n¡ˆqÜ¡c^HFLÎRÔ¦M—QÄ… b @Â3ðÏ!ãOÇå±}ì> WPÈ]®ŽÀf†hÈ$¤¤^>–@ Ty2¨æ ~ùža¾ã˜Wfž™ÏÍA©Ø ™(#Üà`™;Ø#!‘Ð,“ÑìàÐþó36mEA/Ðô3ô§1sjÅ!4I!¿‹ <™¾-VMUW/ÔÀõKí¸S¯/Õ½®L)zòšsJØ\ è`„*øÏ&ZYZdoî׸ ö ‡½¸bGïØÝ.‹=Ö pþ˜âðI6€ŽÍqã ZÄïŒÉ䩤BÿxÀ>p‚ÜàGx¾p†7\à\þv'à Ãq­ÜÈ;7ºÃ„B°@Å=±ƒ,qŒ»)bsÕ eA€© "]bÄ 8:! š×Üæ7ÇyÎu¾sž÷Üç?zÐ…^s@ 8_G­m&.ÁŠíâ‘˸ÆËr„ \ꈠ n @— Yǧ :v‰èÃè§äÒØô€=qQ—zXö€R@bôèÉ *—€PXæ mŒJV¾˜‹ì‡oˆÙñšô¤^Ô©5a»¿Üž4¸Ç]+IèÉ´ƒá¬" •û€îÄ€þÝðˆ'»âmÉøÆ?~'‘ÖäVyË_åz€¸Ìe‡1a•±D¬‚ ´Àô¨G¾ê'Êz“¨=~°ÿ•ì FûÚWe=1þˆ—ðÊ©ÜÖ8>ò¯|£2³Žw½L ï+éï‹úÕŸ „ÀoÊ[¥Ì3ðO%È€§Š°¿ñ;;¤».ôK?ZX¿7i¿by?ø‹ a`¯cðŸm@ƒ>‰á» ÀÔ+@óã L¿„NÁ0x@L$À=„ m¨ŒÐ«øx± <½¬&ò;ºT:t=\“Ü•TÁƒX‡ž8/ÿá½°à‚6ÀŠÑh‚«ˆ®þ“+˜p€sœp‹KÉÁ‡„(-ð†ihA`‡2H¾‚Cç‘C ¡CcÉ;ì§D "î ‹ßÓ ó`(«àÀ‰p+¸¸h÷ˆù¸ÚbÐv 4l—+ȇøp‡p´hˆÀ,‘··„Qhˆf|F,ˆÆ†0¨IõèEø‡€kÀ‡rÀPY »ðD¼/ |¼QþA;DÅ`#2 … 2ɨäŠUn«ŠZ”ð@;=pVI’%i’'™€\?˜è…+À ù‘Và°éh8ðe„v؆6hJ›VHS Æ+`IapI˜!!#A%a'¹‚Uñx­º‚+èw0ƒ±‹|ôÁP\tRD¼Ã£‡„ÄŸ”£ u¸*¬€€G«ŠeÈq(ÄS,ÐK`•+•Q)•†’¼‚\p,̾¼‚vThˆj6@ÌH£5úI»;ÆtÌ+€LÉlˆN1¼¿$Sñ,肆¸þ¹ÈvHÖÜENÀG7A¯t°$±<²<€Ïà;@†dIðKà„0…Uˆ…ð…%p†luÀ=«Ë…MA¸€ 𨇆¨:œLÌOa臘ÀÉjØ‚j€N‡s@LN,ÏólˆôÏr9—táE|P‡ˆVY··hØ\¼ÙäG§²MHóÓMôh)ÿA„왌tÄ«@‚ݱ–j6€‡ê B€Ø•a—éNÈ€†p=8ÍñtˆzhˆiÈxx"Àļ„yKÌwxµQ,ÌÑ'¹”ymVñjІ†þ ¹/èBÙàÊ7LP¾jªôÃÍ‚9ŬŽ[€EÈ!£‹&pÅ«ˆ¨à€ ˆF8A°‡v‡/¨‚ý“ȈxØb„©›X›¶yˆ»Ä›½¯Ùɱiˆ]$‚T ø„†P#0hY 0pÄÑH‚TÈu(PJµTLÕ³Aµa·GpÊU@^\px†8 —­”Mó£ÍÅYPàøR yPT±{à¶,‹a°c =áZ¬ËÕI‘+@ÞÙF-°K`‡9`-hÓA‡Ø‚ =  pˆ[°,à;ر 6À‡l@œþL×umW‡°Öžh׉٩+˜.Àp8 Øphð/ˆsñÕÖ-Õ¬.u½b]c­¾+ ”&Ük 7di¾ S©èÓØàDÔs™q“,EÐl}<ŽUš”Óæ ¾É aÀƒ ÕŠh,°˜… NjÉÈÄ“ƒH°d™½Xšå%›u*œE­½ÇšÐÿƒ5‹€‚x™‚ˆ¬Ë¹à†žÐ‡K@¼ ø<È…5¸Ú_e¾`5šaý ¯=°µ¼»q€ šhS‹c˜…ɨ°@`[;¬Ý[ŒÅ-®]*À•ÝÙåÀŽ=ôŸL8Hdy*þ‚H•m[È…#Ée=¾¿=še>Á•ºdÀhÅ N(\µ f½Št‡Î¨º'#DÕ}(Öe<× Ø] ÌÕ ÚÕ8S‚8¸°€‚þ¡Ñr*^ã'äM:åõæU çÍ èE·GÀž«Øi½†ˆ0S†ú` _ûÅßûES  ¼Šx˜ŒeðÊ€@Ð4Mˆ•õ^HßÔZð\Œ2_éÑÜͽŒ`Q¬`‚á@…á.áÒ5a&s «È7@=‚èŠ4èÞž¥ ÞÇ †¼ Ö§ NŽ æàʈŽBaˆiUá`øþ€%^a'Vâà«hƒ˜ŒTð]«(°™Á¨€`n"Þ0ÊÍ. Þ&!v ôí¶Ñj¤«ðú5…ü-ˆ><žâx„©wÀÝDQOÈa2–`½m]4Î/5Þ%6®".bµ˜àY¨Àc=Žâ<>ˆ9F ¬Xƒ¯+‹dH7â²FÀ]p¸W†åX–åYžå¢³ØÉõá}rd_’]Ösã^Û †IâMžbƒÐä&Ö (€>¡‚}0ˆg:¡©H€F æj¶ækÆælÖæmæænöæoçpçk†8}<ã\Ž]ö¦^f¼_V5õu…¬ÈdNFˆc>f«þp1P dXÛ¬xfà²d``µœäåøD:_a!ßÇaç¤sçOk¥´¸Špß`€_ˆc8àß¾_Žþ_S(…?ì4«Ëh§»*hƒ6çcäSç~jèÚzèCã º %Ð<¬@&>ˆèXæ•fé®|é‹éšé˪i>ÃŽ’õŸ['ˆS%ðP¨F`p Pæ`ѹxð"êöo¯¥èûƒˆE’‚œ”„`0ÃÔBÈÁˆ"2IQưˆÁBÓèñ#B A’,I’€sMž(‹ÂÌ4+X¨Qså&ΜŽÀH‘€xW²Â"–;3Ýn†’G„5w×n¾ Œ…ä5þŠTéÍI@á‘nÑM[¯€ôíJÓ§Q§^ €¬Y´49GØÐ¢G“.­;¶ìÙœŠ3Ö—1"—a&S®lù2æÌš7sÖ ,­Ð¢G“.mú4êÔªUk=µú5ìØ²Aèlû6îÜ—'Ô0éû7ðà‡/nü €rEPA±…`$ ÁŽ\X…"%t#°*•â „\¤E„Ô”éÕ¯g'C„wß"jUJ”†jÆ#ÊD<Ë Ã Èc8íd PÙ°ãS 7À N{„`Ê Àq…€¨pS¾lå „RxÓNÌÈ¡˜Z1ÌÀ^˜á†( bNþ†€Œ)$"È$úd¢‚7®˜ ’=†Pdº9ù$”a|&•UZiZkWj¹¥i´Eù%˜›ñ¶™ešy&šÀÝ@iFž›É!@œ¿mgpt@FwÄCÇ;í¬óFè F’; u…¢Wàc -ÜD®ØöàÉV(©w,¦|øPƤ•x$£ˆªØ òh…ŽB j«¯&¹+NŽiÔd˜Á;%—Å;Z–Ç*;[mÂ:ûå˜uJ;-µn@.ÒâIí&£ì7NÅMÑÍpp¤TÒ`$”BáÅ6Œ±a…=×d°V`€SUr¼/c²¸VþNóÖ{/«ãT%ÕÔ³ˆ~¤ o‚ 󺫯Iö,Ǻ»,ÈU&2É]6Û1ʶE[-Ë-»lJ-Ä) *ÔÂòöìg‰EÃ!Qœúøñ3Hé&y/8G.°Ð Jà¼Ð‚0qÔz…8Þ¤’‹¬¬8r0~ä²1Z¹°RSmõM ÕÓ(gÜAÓ­„NYoÝõ×nó”BÜm[µ+ÞıMÔSW}µßpË}1’3¹qÊ•göqÉ™£6²æ™{i9è»õö2饻 Ÿ˜¾:He¤CÜ* ×E2l _Ñê" †V^8P©û0 ôxË«…p¡Zh¥þÅÛ¬ †>ô8¯O)Žo<ò7yS Ü$ê„“òÌ;ôßþ¤ç<  ¸ýñ¯º¯ü'(9A€ºb®s ç²Ï p€+c#h` ÜO*ŽPºa°ãÃiÁ'¤€uÄhþ;! S¨Â²ðb †h¹*Ps ¬á±(CË=ð‚>üáGjDq8[`Ã~þ€‰â08Dx@§Üµ°ŠV¼"WøÂîe4Ä!ÉnF.é°‹(ëaÓxÁ% jN4"±|€8ûØO,Àˆê.‹~ü# ­¸EÊ™±c_ã²ÄˆÈ+•þ±ÏBã#Y:/ ’¬–ž#œ0¸¡‰ÁYÆHLKð1¦<%*“4HGz4‹,™"_I¥F²2X¼$.©ÅT!— J·‡‰‡0 'ŠR¦²™Î ä*kù¬CÊ’K±¬&lh)MhΗޔV1á‡%}“ ¾ €qà —Eƒ\Á˜VÁÌgÒ³ž,Œæ6‡åJl*ëšüT6óù¤[–³ ÅÉhP‚bÆy$ÊLáx’ ˆ@7=bB{r´£¼Â§@¿DÍŠ ®!i•ÒÜt¡.õÍÀ^Â7`Ý’1œ\B8ÅàF²aÌÓþ£F=êM@ºÒ'¥±ñ§SK£Ò¥ª,£/½êoì€%g,(…)>p 2™Â8ã eqtJœB58íFDÞi©vµ§R©š›¦Fu5Pí«h¦ªW1Y«†É€v0œ6”u!¾ «q! ã`.#§6€†²žý,hC+ÚÑ’¶´¦=-jS«ÚÕ²´€ ' 9XÜð°›3©m_#ØÙb¦¥‡=¬Z\1S@!"– †,r¡tä€9„)P ‚S ""ˆ< ¸À éÆŒƒï çaN<´¡‘d$ÙB-â+ßùÒ·¾ö½/~ó«ßýò·¿þþýo}5¨1ÞzlŸ¹•Í_m»[WÆ·¿Åê‚á¨$RAP ‚ À‚Á‚ ¬ë‘M|!–¨G œ1°ÁÂI‚<¢¸øÁ6þ¼™Ú˜4 ì‚ußx¡žHÝp0üO”!YBdãºá‘)²Œ G¤šœÝ1|†âà(¡° †íÚZä5çXȘáqEóã¾YÇD^s9Q0ÊáF$Ѱ,ÔK…Äʹ…o†µç•ËDÉ3à™Í²uó› g¿âvÓ&Ãtgî\i_²Î5^ ÖjÈ¢—AN‘G„‹ Ïþp€ˆ5ò“CÆÅDˆÇg Rö3ìQÿ¶Í ¦ œ7=ç¨Ö™Á¢fö%g€Dç ,0E NàP„\ íÐH\a QL¢Æ$0²¬:‚PÇ:ØÑNIqá¸b‰1€í;ûÙRÒ´§o{Ò„¦Ú¾öÀß(¢¸éǦ– éß´CЩ1p˜PÜ܈øa þìhÇyÚNu8o!Žò"²1¼iJ@!Z& 7GN@þ›m”ähÄ̱ªrP³¼Ç.G)Ìg+ó¤û0+o@Í´ ‚f°,{$Ž%Jœ$÷7Y`ÇÈ?BA €d xþ;Üã.÷¹Ó½îv¿;Þó®÷½ó½ïsôÒ1Ýô?¤QìÔ©.An`>ŠÿM1’Ðàô%!…¾ŠFŽp¾óžÿ<èC/úÑ“¾ô¦?=êS¯zÏw¶wóàs[ø^¯‰<ël‡»rV!$Ž!Ì!AÔ hبò“¯üå3¿ùÎ>ô£/ýéS¿úÖW>?\iƒO&ö¶=?kOÕÛãÞtðÀ2 Z=4y8D¸pŽ€‚“„”. &`ã_¿ÿþÿ? f߯l÷y`6‰ßR‘_ù‘Ž>Ñ”S2@ý™Ä%T”o3”Ãë”Ä$@uþ}ÄŸ¦  ® R÷]ö•V®”>`Ë0è–PÎ…ÜøÆN¼ÿµ &¡à NN Ê Â1\iÔ ,Ý`HåàRK3€;,TˆqL¹IËzÄ"À á®!¶!öißZÆ F¾’ f¡´TùxÓLž;Ì›pPò™D#Äp(BϘDÀHh º¡$N" 6a ÁÍ¡SÕá"Ýa>塯IìÉ7-xÁ,¤À|C~Ä´¢F4AÌ¢oø€R"/öâõYblÅaeh"Jq""yâ6b(¦É€þ|'BB'ÜèÁÜŸIäA˜,F„G¾À• F¢/ž#::0¾ž#Iã!£4)ã2žI:|S;pi¸Â1ý†;øZÈ "|#AhÕA”c:.$C"ß:bâÊE¡"K§M$-Èc-Ñc=–‰ÜÈ78dh 50ZI>ˆo 8\pÌ7LžoÄ(Ã.6$NRâC #´I¤EÒ<‚F²’Fnä~¬É”S @Bht´Aüùp¤2G>4€[€3ܤóa AN†%Â!OÜOžFPâÐP:RQeq d9‚ÐÂXDþ¸dpL`œÜ#])¤ô€ô‚Xæ/’%Oºã?¥e ­e!µ¥[Ç>XE9AÁü WpÈG3¨™oŒ€6þFÈW:_¦&”€òI6l, B$lÊ&m"_ Â=ÀB¸fò@l6Ô&ò ç§q"¦ÿídY2&?9¦A¦IædG¾AA hAÚù†àCúý¤áЩCzG3ÎÁ+È ìC0C6˜#ôõ9”À=H@òõ@aJ@/À Ÿö€ h% A ‚à'6çj2(~f%Dhƒ’…2gÿ9çbú¤EJçþQgYçuþƱ}ÓàAÇ3‡Üo Á Ç8@ŠÀÂôégmö€VB hméVçU ƒ4i€€n ¨ AÔA”2(•Z©†n¨b #tbˆˆî‰–¨I@.T8œšp8€ã¹I2dDC7€4‚"$@ÀäÁ;‚}:߈•h©ò*¢&Ÿ&@Ê‘¦Vh£&Hê–ri–¥YžåVäDŽ© •©™’.êb9©À]‡,p8ÂG€¡p¨ê€Cj26`C“J€oV(@éò­&°*6 p+”ÖÁþô¸f$ë²6ë¥Z‡z©‡Nd˜v¨6¨ŽêGèˆb•‚pH<(ä©Á8‡´_È‘Á=šÁ­¾¦€‚å,)”‚&(€æ§’î«“æç êj¿©ü'lúëÁò+6øë´º`—Æá—VS¶jζ:Pay«Ë€«AÉdüÇ1ôÔÇÇ0d–­&ôy%‚‚V_ Ü&9 °¾llÆ,°Þë=Ümj©p6*†ò,6øl/,êÃF_µJìµJaÅzÎÉðd·jlDpì7ñ%¬¾CœC' "@ef‰Ã¼-تcÄ>áÄÊÒÒ–ÌņÎÓB-AH­7½C›ì%>þ‘o<ƒpLX-rÈ+ʆ­àBßÑ’mÒ2ÜÙ’LÚ‚ÎÚ²m©–˜'ptt£ILBˆýF<ăp ÝnCÚ|íànáÆ`Ù¾Râ†ÌâòPƲ-µèm9É)qÑÕI¨XzƒèŽnØ–înÂ¥î5­06.Ô Š–Ó—‡ ¡IŒçoJúÆ,"Cô®ï-ðf¢ðzñ.ËêVòjlv–üI0 $@3,ƒ”]I €¿™DPí^ƒ/,I3>cà~ï÷†oDrj§.ܧo¦¯·V&QyÓÀƒå’„ƒX8€þ™„„p¸kq˜Xƒ÷ð¥0Ó¯´yªžoÊ8ð¨ÂåÁ@à@8LÀÎy x¬Fäø°I|B‹„_ž0 k¨  ·œ 3 ŸQ뺮´ å7=ƒÐ‘D¬ÂhÁ9p™F€D T@p„ôxä'±à.1ì5±Ó=qÂEqÇȰ™väVzÓ%X–o ƒˆ.øÀ„Ä4°ƒô’(C›ÄŒaDXq9%W²%_2&g²&o2'w²'2(‡²([rëeêsÊ1áѱ§Ù1Çàq‰¶>~Ó&¤jI ƒ:0Ah˜Â.PmD¬1¹ ðr0ô$¤þGlÁê%³2/337³3sàAä #°©ò¦±ò#M1ÇI¯Ù.-@‚$²q\ZýF3”ƒûFÄúnsé°£Žî"•¯²`³³¸òu‚îÉúR‡ˆB> Áy‘„¡üF)ÈÚŠßG<®;“<3˜<#=ç?!>O&B)T.];‡$;̃I¤À:ùÆtp™\”67tœ<4EôM´±Ø³°\´[JÌ7™C¶G7ð@–Ä;T/H3H/”¦F0ÄK¿ŒKóLƒ‘L MÛÒJ?5™C©àÙ! I2”C8þ† DÁ™!+huËDõlMþ5U5Ut Ú´[VŠQ§Ñ3I,Cò8¬3HÂ,‡hz„@…±uµ¸õ`Áu Éõ–\u˜ØµQÎlX.í‚ý–Ä!¤(I8>˜äûÇ"4²GÜ‹·06µ8¶^A¶I¶–P6˜XöFž4¯$±€—„@¥IT®™Ä<ð5H¤‚ 1ÔkO‹kSll3]sŸm×#ï€0ÕqI ƒȨo„Ý–Òˆls×És/UtÐt[ msÓy» 4hH.EƒR“Ä73I„Âf™D3ü£o ëo¨ÈÑG¸ß%¸‚/8ƒ7xƒâ%jêzwN{§TuÜuþ/#é .!Â#š$¸sæ™H·GÈ€˜‹¿8ŒÇ¸ŒÇ8ˆ¸ž25S¤¿ð…?[†‡":á’!PBpöG(ÁGD> ·o¡ùFÓt6BlÔ]]y3a€G8Žç8Ysœ½w”ü¸Êµa!Á7þ—вIäµFa9ž£’–ã˜43±—ùŽCqƒ™g¡ @­]Ò! öGÔCU–ÄàüñY{„)Œõo$›Õš`å¹§ûÑž{Dz¯Ô„Û˜÷˜˜CI¡ÿ`)€yGÒs·I8 ˜D7¸ƒ~„«ù#0ƒœkDvßùþ§û…º)wèŸå©XªTVÇwpt@Ù%AÁ‡;²™„ƒ:ü:ADÃÕ‡À¸iT§»¹«±Ã ²ÿy…ÏÒ cÚªë`b/¶a%i{D1ø¦ƒ"”´I ¹#?Š€“û¹<ºoy0v¹—·;³hê=;´ÿF#À+àÒ;Ü÷G ‚©j)L×q€< I¨ÃÀÿÆ2€Ô•Á¯|’¤û¯ûÂ/{n5»“ÄûêÈÆG*¹o8€k D<Ì‚ „€I4À{„ ¡p€.àr:ËGý®¸<—Ã|Ž3|lмnØ|ùÕ_àÒ#@¸p€B¨ç~þĨÃíÖ‰¹@ƒÊ°‹Ô›Õ'¼ÕS3ÖgÓ»»×ãÞi 0VUÆ$¬€h$¸A9dq0TD2øí"D¾ÁÜçãiÅ@Ž °ªàD†,ÊÝRÞzH•zæô½ný½þã]¨Ã%%•„$áGÀ.ŒF”ƒx%¸“IïG"@a {‚\*œß@ŽZ°J«˜þéƒ:«¾@±>,ɼ‚Á¾A|Äǹ>è·CüµI$Â{D`h88ŸF<ƒ<œóIêåp „*l>@\xeøÒ´ä@¼+9s%[Ĉ€F]qþ =Mò TÄŒ:Yí’à >eûÆ”9“fM›7q漂F0Ÿ?ƒq †hQ£G‘&Uº”iÓ¥ÀÑ’:•jU«W±fÕºukÄS\Á†;§gѦU‹tB  oáÆ•;—n]»wñæÕ»W®:Óø¼Æ’àŸÍæHµfLÜdêîØ¥c¸PsÏ€ÉCÞ=žÖƒèщW(™n•ÂÔíXÅÆLµ+YaË™nWXÀW«E95¶u&W¾|9ϸB×F—>= Ô±×±g¿êU{wïWËR?ži[ÃçѧW¿/kØÇÏ»fÝ9Á>P»÷Hþ°+vÁ¢¿ÀX€ e¢`†* ± jÀP§2ðå _¼ȆÚp¢+<Œi#Hš8(b'…o€H@ NcÎÆqt.èÈë±Gë¾ RHª¸ÒH²ÌòQIñÌ“ÏÉ'¡„2 þˆ=º°+„è²ffþ‹‹‘îB$Á Áâ5Ùd'Ø, Caü0Ä6rè5‡ða€ê(O -4'ßâqÉEÕòÈG±+ÒIÁK’ÑKÏjÒÊM9í´®HÄS¾´HÇ.Aà Ë‡$𙋠16Í" &‰‡Žwä€c7Ú@‡1nš†1VLæþ¼C HjÜðé /¶™éÎA ÍV[JQLÁMÊQJÉÍJÒrÉ /ÜuÙrkÔwáµrZãÅË&ÐSÂ|çb$ºÌ±B0cÖ †L•+³›F  G®€Ä <0¸"€`A†H’H%uZpVêé#H¸‚Fp^hA˜8@¸âV©' YaÛŸ íö§oÙ]w\t‘–êܤU·è¢5­Wê©ûÀ2ªÑ ÀºØ…®¤K–I;B–‚ñ 0…5³IŒˆ¢¸™ˆ€½Bƒs‹? |²A¥·@¨Ûhô Ç‹X”%”=þÔäèËmÚ'¢ŸÆôh¦Ë]ô!î<ܨ±N]õ¸˜uaõ·Ú!Ä®U(¡‹æ nìj&l½ŠAA cácÌÚÆ\ù噿Ió †2=ÜÏGŸTôê¿+]úKQÝ{¬ ÀëïƒÁ¤»ÚÑÆ°FæàW.& 쌟¾ ºn^ÿý—žóí•D=ìézÔŽö¸¤î‘Á@{ô=Žh]’€º˜ ùÂ9Âá“; øKÿP˜BBù/z \” (¤Æð:taØ@nª 8ÇéòÌå`xÇ\‘ªºD¢U|™Gí|’Ž˜P…U´þ¢rXxÃF…†šaÃbC-2É]@4£•€}(|,`#]r1D¹ ÁsQ‚2Q—bæ@A„ *^‘…”IÇè#‚Q;_däVĘHéäðŒ•T°ïeAv©Æ2ø8‡,ÐE±Ì#nDă4ä+¯ˆHIŽg‘¼Ž#m‰•HÎR-”´ä/óÔã{UˆÄy `$ @Æé"ŒúìåÐP‚ ¸–ÝD¡,y9Zæ2,¸$gUvÎL•˜í<Ï, ˆv‚¢sa@ÞÒ‚\"x‚] ™ž]DDƒÈóæAùNu®eœçì þ¾âÐ0Zj¡Ññ¥;1Zhó{Žˆ ]”‘ºì(¦…8œ†Î% ÜK1|Ѹ0#"ó3(BqÚ¿žì¨…m%šs5>UÊE3šT¸X¢ßóê‚„€¾e Ç{K(.a{A ˆ†\ˆE½üÁË|K9`ÓǛ攭?S¨QÒРn¢såJQáz¤*•¯Á@nñ½Œr.M”Ë'H—M|`*_`;V`U X@²z1\†Á6Ôå l€ÄgAZÑŽ–´¥5íiQ›ZÕ®–µ­ý¬ vš¨žæµ)rµ+‘êzÛ¬à•¶DÙk_“ú@*ó˜‹)þ”8YRPÅjØÇ[œPY¼œ!rÉÜê²…Zl—»ÝõîwÁ^ñŽ—¼å5ïyÑ›Þî^à9³í­Rl«[Z U¢¼íío‹Ñ+ Þ;Ã6éâ ›æÅ,ŠN!Æe q@_È๼!"²Èï…çò¿÷%¾º¥¯CíK[üb˜ðÀ3^§vÆEº@Q@3á¢ТÀÈ(ßò‚rV/<†ËÇ`yhîÝ0‡*_®|øœ!Î눉|FiHäuÛ˜¦\Ê`V¸H!azKv° 0Œ ÅÁ8ÂTï" ÞÍeC @”‡¬á#¥Ã·e29 W(Ãy‡·",þé@Ç¥ ŸËÔEÄ ­Ä^èP’C XC~’ˆàŽÏ–óœël×;ç2ÏFÝs§X äqu­ÈÒ\¼0¾ìgŠ ôàÒ¼ á o¡BDô@†'p#"8Ä<Âà>TcôÓGõ\GmËRûôÔËö&àŒÕA8ÞK81—iHa.õ8„^”à·˜ÈO~¤µÝÙì ?;¨Ñ~ä´+Zmx«4Ö G¹äÅqÁ ä’{Ì¥—Õ L —*ÐCY¨Bá€M¨ ÄÆÇ÷ Ly¿—Þµ7#ñ½P}‡œj&<ÐaFf,<.aX3\\±þ ¹´AØË!— VÁAp>–ÿrä½-¹COÆ”«såK¯×Á„k¬5@ÂrFYùµ¥Ðв]Ö¡l¸\Œ¶¨Ê#[ýŒM§íÓÏõ.N=œU§û¨²;aV>(ó¨RA6¾¼â¹9{]ª!]³ømó  ܨÆe ðüçAzÑžô¥7ýéQŸzÕ¯žõ¡Ÿt‘çü”$+Y+z§!ßyé÷¿wjÈ-¦Àˆ€jÛxý[°…¸0Á˜†ËÄQæb$Az©Æ›ëRWPeèµÀŒÔ~ñŸüå/ÿ96ï-#Ǿ:³§=VlCþÜÏR÷»ßÔ*h%•xàÿöÞР ä¢à–J䂸@ùðB}îâ ü€†A*áå0.ò§­00[|!ý`ýïÈ)þ hþ$©þì/JÀÆa*"áåb.^šÁÂÞGäâ èBÖâ"æ!/@~GU h!ÞF¬,ð„20 mdyÊ?ÐýÞÏ*Dp€H0‘Lð$ @p€*^´^î`¥ô" ΡÌî@ËaÒöÜòB® /þŠha•¢àñÞâ•p•ƒ eË ‘, *¢‘ªpŒ® ãc#d¡*~ ð/JŽ¡`äB*( âÂÄþƒaôঠü ñì"øÂ„ðÁ䀳eÑ&üPýÑ(@0—¦{Q‹Q×#à¬"ø†ïu˜` « ð'V`ãÔë.†a/TMàÁ`q½ñ&j±o±ý Ñ\r«{ñ†~Ó“¾`*ªÀDô6üSZæà !.Ú!„î"€Æ€¬  ê"|Íî" ¼m­¾q""7gýb/mi«']hÙÑ0ÆÜa0 Ü`M `@TFÅdJ/dá˜à¢8í'n!¦B¼àòIêûº‘"‰òBþ8ð"ǑΠ°çëÑ#$C20hÄO´Àá%Ò'jAßâP.¢ÞBÞa*t âà_ä"²!ëâÀ~mŠ’(-z’’™R 2 ¡€¤r*÷žèa P`"b( Ø¡+ç¢~Ê@* n,ã"h20ò aºbqy0IOòR[öÒîòJ#‰#Gg0·§0 3/áÌŠ  ¦Æ¸.ŒÁ¢¼ (Æ(4C<àÁ.Ôn/LÄuîBk‚Ø"b’CØ¡ bbèP35 e51Ô–²atdSzh³6C "‚þ3ß%+/ÐAðî.Ôa¬àª¡.,!Ã Ž¦³4eâPÁÄv 9îDPè<Ãó(ù2)]“‘ΓiÒÓtÖ“=÷bèÀ,륊ó'Ž@ æî'’Ÿà ô-ô@À.ª€ Â=feò¸É& â â ‚C â4*Â"0â5:â#BB×Ä$)”5áêBÁ(C“fC;§C=4/ú ¸Ä{ÚÀ àâ. .´ë?ëb ˜ÀÇOa,í‚:k‚3<4®@48¤4N#5`5Zã5bc6jC  OS|æIkB<û’J»ÈJ‘KŸFK·ô.ôþ¤FR(¾. ¡ƒà‚àô'œÀŽ/.²`â=( ¡.>L^ j`ˆ ¢€ Ê!'(ÄB0DCèäNô5Hä LE®`fà"ˆSQ5JÇÓÙʳ!]$jV¬R§†.åÁÏ Þ'.\¡ßBÔÁù€"\á.XÀ Èt/ ¦¬ÝøÕMÞ$NæDOµF TO°E v! ¬õZ›ÐB·U»µ\¾•](U\ëâm^0^"ò'Žžóž3 >“/®¡ ‚î ,!¡ èÀêÆ&„…XVäXþ’eYšžO¢%B š@´v&bÿ0 ñ))ê/c瞺^ˆ.Æá^ã‚Ø4.,@ðÐd-ant(m¢a&b&¦b.&c6f=dD†dLeT†eâ2RÀÏÚ jcbjÇÑQihbÓ%kqk¹6.2h0^P¼n¦â62@vÞÂ´àæ¢ âÒC ÔÜtå¶&Þ†„ä†nânòfoE üpGr'q˜tM>„qòa7b£Pr)¥b×År/÷-&Pê%Zõ-vð-ޤK Ü`À~B 6ö}ŠaFÑc®Aþ ôBN‘¡÷!7†œwR ÷tÂuzßeARvTr Ø/nî'l­.ˆ€½Ðã¼/h$ÞAã·›æë×€îRò\¤—bo¶wT€LçáÞ >³à3Ê@¾Š. €ÐÔ0Œl0`|./à·‚-[•yßoƒ›†rðƒA8‚ƒGFó.`l‘Ïàbz˜.ò`2 £Ø'*âˆ|˜‚Ø.Ø 3x€ŒøH:S”„óUG¥äØD.è –*tí¢¨ €÷  €"P÷@Ë8§ÎØÓ{ÖØHÚ˜{öþw‰;e €7áå.áÀ}ãš € pì¼` Ðã.àw ¨xŒ§™ý¹z"™tØߘ 2é]R5î ÞÂB7J5,àâ ð€ àC já9óB4.DÁK÷â‡c™f9#‰˜önYH&™Qv™M}=… ĸ.¬@8ƒaâò-†!†bfØ (T/˜€ n(¦${I³›ê›É³j«bœƒ¤œ圧7s«kTâ S!à‚~°â6Èô.€ Ñ`Y/¾*™}‚ ô@d7NÉØ U¡µU¡qëj3—Ù¢/·€þ°†Þí'Zì. À9„Áòhán€Z8ªN™å¢D“/¸¦cZˆ©–¦•&0ßÏ¡¨’-™SŒam8åž\Ò'ŒA œà-fžï J0kŽ`*lÀÔ€˜ò ^¡cN6÷}=˵;±{±{±­@«——«»Ú¦¿§cO§/—þÌS,áì¢Z (– R4ÓÀ ¦" V@Là©9téB³ïñ.´Ëülû¶q;·Ñëÿp«¹š¡³Ç²ç ³¹–°=Øõ'®£¹w=5úä‚fl ^ >^íb Ô@ñæÂÜ­ÇZj¤Ô¨jyt€Ûþ;ÀZIˆc÷ §§æ¤Ú'Ôú-ö-N€Õâ^àÄá:õ.ª¯.BSÂkÆÛ§Êtλ;ÒÛGÖ[\‘À¡†­$~0F80€ÞÂL.Jú'Š¡¼a¨™.á7ë¢ß>¼À§æÀ+*Á™fÁH¸ìÁÅÕ 97åðº.0àÊ|bjX D.. $ƒ¼ ×îbJúÙÅ=ÆJÆ“†Æ³£ÁqH¬¥J˜JT­ä và-ÖAöÂê³´/ŽÀÛ6.¤€øÀ »^¨\¬i°;´œÁ§C@S­äÄ—¾T.:Ö|Tó.  m›·P.ÏÝI6—:=t¼ºÝCý½àý°ú•þ@ßùâü@NJPÀÌ}" V(Ž@<‘. \[.úCù‚©dÀ0þ:¯õx¾ç}þç>èà'~–*ž\Œ],ÜŒ\Œã;¾>Þ0¦äÚ×£ âP¨µ2*ý'ÊàŸ|â:a.¢ÁÜóBPÁ04[­üž½íÝþí½ ¤«è%éè)%é' Ù7þé¡äù"sQJŸ~Bí–á€ßâtÄÛù.Ž ’ ˜ïB ôÀЪ_šïõGæ^ØIŽØå ïÁbé©cï5ߊ¢^0’ Þ0À‰ƒ¤3Ь®>p³3ÿ.¢! ¾˜/þê•ãªO¿y8¿·#[²Eÿ®2þ¾ØIœ¾øS(õ#ýšSXàŽ}Büo<7ÀÑéþJþ-¢ ˜áÍñâfÔmø3_ú1çømÑ·izù!©ùEìù£þ÷‡úc£bT° <ˆ°`'‹ ¦®KASJvŠ…0\Â`îq’i£È‚JØ83rä0WZº| 3¦Ì™4kÚ¼‰3§Î/õu,È%@˜¡D‹=Š4©Ò¥L• D+ªÔ©T«Z½Š5«V­œÚ 6¬Ø±À 4=‹6­Ú£jTp‹§Ü¹tëÚ­û‡ZJ‘ùxÙ Ø »*¯8$hl#‘k· Y“ð¥‚äÑ ¼1½˜®¼ :´èÑ:} º6µêÕažŽ} ;¶Õ®_eÛ¾]µ,ëþݼ—¶}—´ðáÄçæíl é§tR« 'ì¦%å; }ÉC4°™:JΦª<ÁÏÅÛ»Ó4P¡½ë×w;¿þ©´÷û­›}îöApÁ‡`KøÑU< ÒuœzÁ´æ‰}¡¡Ê@<‚Ð1"…Æ9lìQJ8„]ÌçÐÎ…ì=ˆcŽrÉGjþ¸~ÿ [DyU€@.yV¨#hˆ4¡QXÂr”âF™S„ê @v0$G Í#BAH4#8Ô€/"-õÌáFgÓ70Þf¡†¶Äã@>2ÉhþRB" )VFF©’^Z”“Á@y(O‘‚ ±,—‹KŽxÙiMb–müIP “ tÆ ½SDQñjBL°qET‹ˆá癨 Ê ,ÝtjWÎ GªÒΕh0‹bŠé£”nÕ¤Üi)¶—jÊé´6mã2Û´†:²˜ŠªKŠ0Ç»í¸”€0ìøÅ!-‘€/ðà£Ì>-Y ƒ9t%‡]£;¤LcÓªåQ˜¬Á8rA*d0Ð:$…ÚóÅ‘R»LÅ2 ]¨Êâtª ]ÆÐe´æþ|Sµ×ŠË¨¶ßFêíÑþ…K4“ä4MˆÀK¬þï—W<ˆ,ÄâŽÝ´ŠÁ]~Õ žõR€=í5±8AT"ŒvDÿ1•°I¢)yÃÄQº$xðÁ\òRdÍ%…\WLØ`{\#ç‹äQw‡–@¢˜È@K\¡‡. ‘Þ‡8Êqþ6¸Aq˜ƒð =økty¡qÌ*³pÀ@^1† Á {'ÜYoØi$Õp‡ÐÈ?)à°D8ðO„b¥0*TÁŠV¼b³¨E.|@`c Ê`4 É.¶äT ƒXàÔ‘ñ fl«xEY§”¯*Y™ŸUâT,®¬éjb)Ó+Pd€ œ€\)è Lñˆòô-F@Ðqx#¹XáˆW`õƒ,‚–h,ƒ¢Š:|È@o1áƒ%0áÉXF3žÁqi€ŸºÁ£†Øƒþ€"9‚‘£Kåì¬g,D²%Óð‚^¡‡6¤´™ÏŒf/ƒêšú´77Ý©mtjÛ­ôt¶kjP! ;ð )üQÅ&ŒoôB,’y…BpAx Ä@€bx7\¢sXÀQGvÌ·D㟈é–39à FPÅæJ$RðEÆ4èC¥E(>ñdÀ¨À ð€, 0€|Ô#ïXG!Ä“pŒ@o­ÀÀKÌ€¼$®s5¯TÁAU«b¶£‘-oYSÛÜÉ+:ŽÍnoŒßÒXZ£½‰ÅÔ³|àþãE²Âåq™#’7F4R`y#W8ÅO4f 4#ˆï#qr>8ë».©F9ð¾Õ¦w½íuséá\è46rjrÜc±à6ÐVù±Ÿ™"ä=*}{A>Ât× émšÄÌ’ ˆ`ü‘˜àçØÆF¶ñͤ·Ø†PX‘n.rðƒ `RdE·§Ï‡N   ½•A{*†îuR­ë(±NÀ—€4¬Q&Ä1Â!¢ 4Œ1 ÊÁa#ß`Ç`5¶ N„À±š@9¾|³ºX"K€+äwF§øÑÉÞ5º­sþü;íI¸Ù›dæMAmì£ìyy¶=«@œãIž‘›(¸›„Ö›8õ›¼œå Ÿ–Ù ¡ {ð Ô€7 p-@i {± f`Bðº_ @‰]ñŸ:žçyéhëÉJí9[ïI¡ê’c ú€ÈÑFÀñ„Yñ^P‘|°Ms tä^g΀y ꣖i¡Xø•`Is% –êSú£Kú+U¶/° 0 ¶òh£‹á!°)L€+„ +nÂP þÈ~ oÀ¤mŠ–Az‰CJ¤jWsФ5¥¤nª§0R v¾XYspq€²#Ñ ÍÀXö ÂP€ôPˆ#V¹§—Žpzr:§Ýb¤&y§¯”§˜Jª˜ñ € ºG9‰P 2ÀÐ ÐpŒÓ°^6SP H0 *Š8è z°—ภ@¬Åj¬ÇŠ¬Éª¬ËʬÍê¬Ï ­Ñ*­Çº•Ù•­Á©ª¡©ª¦¤)×à á*®ãJ®åj®çŠ®éª®ëÊ®íê®ïJ®ªª1P ðŽ˜! Ù€, Btð@{¡) …ª– ãxv• ˰ ë°hØþ‘&x­)Ø©aù©#Ù­J¤)gpŒà± ²!+²#K²%k²'‹²)«²+˲±áx*np¦ÁŽ@ ‘ Äð¡° ì°"ñ-@"ñ§1 n0°â8‰Ô¨#ÖhvÚcÛzD+D;N[(Õ¢YG`È"*° sPiP&Š¥wP † —ŽJ ,Ù´Zû P‹sùgA ?6 cTKDV»ÑÙZ8þ0PÏâ [ÐR@ èÐ šSà ÃMÜÅmÜÄm ´` f=ûG¸TNÖÀüÉò ×+×Z›k— àÀ/à` øP ¥eð cÛðø³ú³?ÑPÏÐ R° fz L @J «Ê\Ë´„ËQEåÀ̘1Q  {º  1 Ç€NvÀìÐMð ôNÇé½D â¥wA Û1Qͽ†vAU”º° ]p]! Va°ÇË}Öæ¼º` ^EÜ ¶P &më ?`Á¹qÝךÝN»Ýó) ,ðµ U^Àí†,¥q !îåþæÏNô€q4îì t¤ú Ff`¹Á0#° Áð (`!UÀ$ ÑÔq40Q @¸Qa€°z€ Áú@Á €`Ð×àK ]€ÈŬGÄú€cŽvpæjîlpj€fÞÀ …ä\ Ô Ð@ÌQðMà xp`°F_3pâñÕ Œv?ÀaLã´ÀÆÏYUqã²Õní׎íRãÌ­Ê<®? u´à Wð V16ÐŽÀîíîîïÎîY`ÁBPhMÞ•ON¹Ö€€ -Q ÂÀÕàX MWpV>ƒþúp `À b@à`פÙ¤Mê ìàsv°ááTÅj ä þjk¤Ÿ0R° ‘ Ë` Ž P ‹ ÉààáŠ` Ì ÕM øÐ ˆPOSÐlªm Åô…ˆÀ ° Ñð þ³ ɰ߯P Žy »T+°@=Ånì²Õ´m° 7p BàÌÞ€ÀK>7Þ^^Û¾ãcñ?ÐY €` Õ@¶PB Ç ø‹Ïø¯øÃpÇG@ïLžÆ9w M‚‘”BßÀÐ.1 ®‚*à RAÃ˘1 HP JÙÇà}þEÙSð –ý&a ­0#&w!ÃÊ ðÍxà #^u°‰™À¨cçÐ ¾ü Â0)ôûÐ]^pƒ* -´c;#ƒ)~hh§ Á2¾´  ø,Ipv÷zßÜh]„åTº@¶TÁ 6Ó$X ]v®¡ÕÐ!-`ÂL¤XÑâEŒ5nä¸qB`!ƒsÅäI”)U®dÙÒåK˜1Y: Ǥ#têarZ.x×¼PÓf²FM™Wô ÙÔéS¨Q¥:=#@ $ ¤87Õ«SFÌ8°#åkÈolÌ`zÖíÛ§$cÒ Ý4DþWäœØÔ$z€ЇGÕz9ύ¯œ ¹ø™A¨¤™5oÞ¼Ô)—E&]Ú"°@U«ÖAËÀˆu´®¹PÛv¨Õ ÐjbÛ÷oÛUÒÐ2¥"÷ñ†µO!G¾Õ÷¤,èp¼©F‡É–‡•j'¾*ƒ °HÆTXC:´%š¦ 75 †Ú\@)G“x¤©“&  E“²Ó`’ôYöœdÎK]>ùíZÑ€Fú—/ySÌ2‹ÛÓ!5Ïm¨ÛIãµl»ð¬&5òÕw_~Q¡¥ÏòT"h N¯PYKRva†‡Ì€q’b6V •†¶(~Ë5þX¢D?u&]qÔUœp“ï0 ¤hÊÀ$WôÀµaœ9Í8$g ö¹#i™›G1'¡å‘MhÑ…90Ç®Ü3ÏM÷Üx€ ƒ$ Å“ßDYM»jÞqú·XþõS`ÕýymIáœã–¥½RxÁd2›8d¸öÉÒùžªž8F \p GV)É^Èdš“.Iá>S ¹‚æ@Kb)㊂aüà‘ñ‘¡¯æv=%f{f{vŠ‚Îí™*ðÓ?èmãɦÇn8sÕzÏfZK¦¡z¶õ-pí[øÚÊøÏ´ ¦}û0ÜVüuðÀt„© ,ÊR¬rF£(þmŠ@±-w@â¤žÒÆ jŽ=p.*Íj[U’Ϊ2‰Y !ö äðB¯{åk_ýJ/[ÔëeN5 @´qÍ€`ÎSu(Ȉ:d¢q]ÒUÝzY—lU­"IèôŠnhhXÅ ù In6BáÄlkaçR RvIì¤Å$ìÊî飠@iÉ/¬DŽc Y©J–ª²]e]û\#ªÖ-¨KmžPiœåH…UÈ9ƒ,H7¥l€DyÍ{^ô¦W½ëeo{Ýû^øÆW¾ó5/ `ËÜÙ¦æ83°+3hñÏÕ|ƒÓC> p`#Ñ`0ƒé€m°^~4þ*aS/4ßàEq‹ùPÈS™øU’÷ðà §XÅ+fq‹]übÇXÆ3¦qmœbûŠ7B.Ð]mœ¡L4 á¸Æ6ÒAh Þ"q8{e µ r•­|e,gYË[ær—½üe0‡YÌW®"’bKâô˜òŸ`°+ šÆ`CÛÐE1±Œ†ÜdàsŸÉ c:Ð78BQlˆb0ôIGuÈ7º°FeØBÄĬ†piLgZÓ é“x¡è©¢™=nK†L}jT§ZÕ«fu«]ýjXÇZÖ³¦uªËe¯$ã5È%õ¸àZØÃöKE=Sþà3´ëþhAˆÄfé€X`Â6Ø0ŠOæ0º!¶x áá@Ýëfw»× ØÜ¡>öÁ@Bl|ç¥G@G$V±ƒ$ˆHVH @aˆcè[á Ϥ±ëÍS.#v­¾Œrè e¨…‡b8 €C;öÑ |£ïhG ÂÐâ­áE†QµE[ø8±$0£ àBèC'zÑ‰ŽƒzÙ/Ûþt¨‡,hBÔ­~u9œéa§$(^aØ@M²4]ð`º0Ǥ°Œ_ !žº-žP€†è€¶HFp‘ÜÕˆ»^ñ¢>þ0 çVæ6h†%Ž3Ù­{äÞX§|åÏb$Áò›çüT´ùÓèw5Öú:qvœÉhÆî BèÁÐ'ò0ކƒ&f<Óqƒ;ý"ç¿]ͦAqD€Ú!Û¶AâD_úÑODƒœ%Ð"õÁ¼!²\ÐcÄé'?Öÿb”_ýœÿ|ø'ÂÎà–^L¨ÂÅx]¬߀Â3Â` ^Úp8\ ³3! kˆ 7S (Š“‡X†Ø‚‹­¡^*ø@¤e$Á}è°!Hyƒ<÷³ˆñ[?Ô·@#˜AŒþºös?v2…Ò«V9!B",B!ø[8Û°‡ ‚_8¹{åË qÛŠÃ(8†˜„)(‚7؃ À‡cpˆhP—$!R°€ìyAÉËA7Ä·Ð!‚7œC|ÛÁðc')úAÈà…_øC@¬!À[(ƒŽ©-(‚?äIË­*ÔŠ»Zh ÀxpЇRpˆ#€3(„1(9˜Aè†B˜I虣…¿ sA6lÉ£C[T«_¸E^”.;=vZ=<’#‡8üZ8=Ò;Å ¼<%Z <»Ò6UHšÕ ƒa80†?àE þÓp€føV¤$˜†F”ÅYŒÁ^ŒGø‘@G{”¦_Œ¼²]°F V‡‡PJH`)x¶30»|Ƈ`´Ö`6ŠCƒ"Øz1 P‚h:(†w€‚1ˆ‡d°,ˆtP€è±f¨†ÐXÃY¿Z¼Gœ €\ÈIŸTŸ|Ü:ÛÑø»kÈÚ(‡…XŠ´$:9¥ƒÈ4‰Æ†à]ÐÃM¡bø‚_è‚g¸‚D †@HpZø…"è‚1tŇ(FåªI›üI»„%¼»ÜKX J¦³ 8&Ë@J§á¥¡J*´Jþ!ÔC}@‡ø@œÌ@\JZ€!¶œ)Õø‡ü>º¼xäKÒ”Š)¹ÉÒLͯðˇ£è–"àÄ2LßX‚v qTLh$¾‡‚bFfÀ…và…È,ÎH»"ðÁÚ˜…ÌŒLÎ|wdÃÑTMëTëÜN¯`Ízë [P@è/±)x$Ú̆Bè>ÁÒͪäM‡ø!H5¤…Ë»aÂBÀ,(‡ÚðtÈ­é|ÁêäNÒ\€µ0PýŒ3 Í ‚` qX¨  êñÀPß° @º)tÏäˆFø…ª¤aÜJhO\؇Ø–À…cp»ÀZþÀ5P÷+еKF¨ÄÝQï<6Sj-9·X#Hø¯|À`àdÀ´Qä8*²0L"PRÈj^Ø!°Ñ=ÁÑðÓÑÍIšp…3UÐ 50²ìü ž¤i„¦ê-ZX¤“Òã8ª @[ØÚ—9@Fˆ$SÐ3Ó5µGœxFåÎ6E30‚ÐÙ¬ 5Ð= ãÐ.@øiƒèqø…À6Ý„£_¸60@#pžBxÐá€D¿šdÔHíÅGøUëœTc§‚ò `Iá9‡Ø1¡/X‚@L8s¡¢¢J8òhþ0sh\èQ1L|0…1üªTÔÈóUbµEcQ…wMMcÅ/S²…D0À ž°l$bÀï{FFÃKZH  @baxÊ)º=ÑMvÝ:w×7ôºÐXÒ¬WæJ¶"¸ÔÚ0\'§ñèQ@ê÷<ª_ Tßp†0°Ï=W j€‡PXXÑ‹eºŒõX´€Y2Ú½YÙ¢-_ú( …ž@à…CäT=*/]ú4X£9kƒ¢*9ðÓ¡}¸¢UÚõ³0µµK¦¥,vÂ):‚ › …<¤ÈZƤ ޤé ᩆþ,˜ aЀE¸=.ÕÀ#T¼³­·´}[òcÛRÀ\ŸŒÛ¸b'ù$ÙJ¤T4\@ªÀ…Oo©àP‡ ˜8;¥ “9ð‚$˜¸BèšC¡Ê=¶Ë… ' ã=^äM^åUÞwà\$BXp^Á9&¨^ë½^ìÍÞì=¢ñܪ¢-Z8Šßà&8áÑ`ààÿ_XÝãø'gŽáªS§aƒÈ@Ò‡CP^}GÔ<‘Ä¥M=H+…«»Ôéå›2(T`øñ^˜¢-ºdzß1qZÛð–Ñ!8Pø%€_ä¸àð@á!@:Yþ#vÐ+u ^&é†D0˜á}ŠÄHVøa b!bV_;0`®*sXb&nâ%V…¨‚½äž°Gà^…{`@Ð.îb/þb0îâÚØ Fœ¸5€q¨`Ñ[Ðn°õu€†@`¸MX„ßÎ_àß@[ð§±[@P@ºá;æ IždJ–dôƒŠ `I\7¸OþdPeQöäó›8bµr]ê!(ÃÉÔ˜eZ®åYƒ%˜«{`2e_öe Ô26ãÕˆV˜dNfežfK (ð¥…Y&,œqix„)þhˆ201ˆ¹=þ oøãÕø'f, vžz8»*ÀcŽGÞˆ¾,øƒgÙa§àä_îgP>?/8 TF)×õn8h„Nè^“†4à*t¸1ˆ†hj˜-ˆh‹¦±††•tX#7€¨ãei äu€aæ›|4e ûu_H1‘Z8§ù†ºS‚Hp.x€ò§8¶ 5 çÜPaà@‡b]à Z°fêƒxFŽyÖ)º ¨j«¶êH° ;BÑd áçîg€þFbir]7Xµ^k¶ŽÉ<À¤ê.`»¾k¼Îk½Þk¾îk¿þkÀlÁ¶kþ/ȃXÙèsèÅ^lÆv}ø,6ë_–@*€’>é¬+æŒ0åPøÐíÐ6\ð6 %ð•Ïrõ |€‚0<À…h>Aض`(F–µ qjÕø…㎠…Vg³à Rà胩¼Ñÿ])*¶žnt@8gˆ3`}n °¦ìQèk ëS6kFBëéžn·6ÉVH8iꃼ.¹‰ÃÖèIo¶ÖaØ"¯…›lðe˾Ì6é2¦˜”€;Ðoµ¶i 20„BŠfZp'àÐZ †1!Z@XXƒÌTh€á[Ùßß~/ÁþnßÀƒ`háA€ £ÚÀ‚=0»bøC®BøL4‰êŒˆn_ƒê„52ºçÊòjùîÿçñdòèLBï"wëX †Žïù¦ïœ±ïÃÎï"×Lp„’îèo²('p O>pÍîKÎÆSnp·–j>`éŠfPBà`V1ñš¦â0‚Úx¥k€ßƒW ¶Ž  ç—ih¨‚ †d>-ø EhOçþ"wð#WkD‘­.1'(óko*/ë³€´ÎrØò5@ý‰ëL’o12Ço/(ò5@ó5ÈyìÈþ/×õk(ð9Ïì7•×sýæó5Xž+íÓæžhVm1á|“BˆLûs€\Z(7߃Kwˆ_¸1Átu8´u¡"p€$È…hXšT÷GÞçV’W×ïXWëx@Oín®[‡‹\ó󣇤‚šâƒÙ;o`‡v-_ëwhï÷¶"e_vœivSÙèg?sÀµnƒTðo'¶l×u ‡KúK0 †o÷”p/rrWkKÈ’ W÷5F ÿ€iàЃÉuz'¦©µ /Ø÷q£…(“v8&Ž]·<€8PŒ´pAn߈wunX·îéVòþVÁg{£˜Žòó¸ò“vb_ë.·£Œ¶Ÿ—‡y†‘ùO¡yh—öµVs`÷hŸwsm÷d“Hˆ•¥ßóµ`k?tAÿ¢©Ï èWàø…ŽZX z€ñ k {‡Èôßø[UÄœ2P‡C$È)’òM¯áˆg‰OïŠgëY?e®6î‰Âðo(ññw§Ä7ù`wð”Ÿnc‡k¹†ŸÉ§|e±|OÁ|›Çy¶¦vr‚lÉýП€˜!p Àl,K¨p!Æ ¹#q"EŠsÜY£qãÆOfp\³.>ÚTL©r%K`hÁŒ)æ#þž”ÌY¤@Μz¶üŠÉƸž^h-`†,  JfB*µä)©2]é鳨­=ñò(-m,\Èä¢5‚U©À °Œ+Wb*¥BrDÞ5ñ|•Œqf.Å 5"N¬0 7×CŽ,y2åȧpP¬y³ÃjûnŒ`Dßw¹J²:ÆyµÃ>È®ÀŽ-{6íÚ¶oãέ{7oØQò°Öœ€ÐwÀ„·M*}ˆd .}ºÂ2ÈTή]2«ƒÔB$æbFÐAâµïº!ñî+ºl3(­m¡Î•6@+;t´lȉVÔX@DIOLBËò1U ¨ŒWP@‹þpL38ÐòË€°„L^håHƒ2½õÞ{uÝš^|`ñ‡{†}çcŽm×ce—e–ãtž¹aÜ¢‘šz MBjæZoSRY¥•Wú” WœqÈ)×—#ê4À–g.dv>²YwaäwhP¨ø^|'ÚB.ЀD{!ƒJ# Ú2S(Z%AK%½p¢¥6xÁ„£ÐbÅ„GÙƒ‚”DºÀÄVX SŠ}Æ¢q/‰8Ø!‰x8¢¹c›¿^$š«i$’F" x40,CRb­´ÓNùš] ¦qù €> ãþ,”jÛæ›hÊ9æ}dÜH%ë\ž8Ô/:ÀtM=´…L:,HKШ°‡´\@´ðÛªU˜Ê÷Kž@‹3Š"Ó¤–´Ï´ÜÚS¿úžt#—¬.îe¤_€ Ø\¼žék¹> +®bÅw¬‘¦¡¦š¸ÐR[´ÑF[{&¶_&g$sÎA§ówäÞÜã¹qF4'Fu¶k¤zìɽârÅS8Ü›…- Ì”Ãû´"ÇÁ´ð19Ó -Óð ªÃ3AÜ€8ie -QL8ÎS4q €<ÀTŽV‹hiÉîÑÐdq­Ü­.¯!#6ÆEó–6W­]ÎRwþöYÏ£¾Æ’M>é,ÑGãž;•Io¹4hÚºZ¬c£¨Lþ<C%ñBèó·ûYøÂ…d1#Ð" Z¹š! A+„p@N40]à‚dpQÑbf‡½ø"kÁ`H4º¿f0*áfAT£!%l¢e0£3G –HCxŸÅhHMp\1‚6‡;¦{¸Q¨`  "^†è²§=':H "|‡0‘•y¢Ò…€8œ *©bH®º¯‘¡=\”ÈŸ c´e ƒI$ç!Z¸@ð…žb *0ÞúÙUið5ŒH\‚Â2b‰{^A&¼€‚7z¢<ØDÃêþAÂFÁèÄ%õ!‹zlÒ.³jYì6"ºò0Á9DIðP i&d•Ú –+ÅÅÈ’°aRPˆ-û‚ËšÎÎI¬L9p„g½†˜Z-¦–V3 àcr`3CâLÐ Ï fB¢ö’‹v0$›CåfŽÒe€’Àãp¨99bNÐEoOë ßxx 'Ð. ,8`Aá‰9 “†úAŽâ0‡ *wG…þ H LÎà7†5Œ]€É/fЄ|ŒïÁÈ "Ê‹1t!Ë`áæ•“ÎÅøLŽq&éí ‹LY£šj„ƒ¹J )5“ð'¦Pµ‰þB41‚¢;>Q…`4/O­© ™µ@óXˆ0w£¬RC[ݯlŒ©ä„PHY9rVÐñ[?”Ú"rˆ´¡:×*w¼ƒµ‰L ä0‘¾v¤kÐÍb¼¨÷§äD–°cTpPZ˜ã‘0À<Ûè‚vð„$8\ã?6våä@Ø`(<°…9Ì‘…ÕÂDdqÂ&f` TÑL€CNôØ0@(ØÑe<Ä àð5œ wp Ì,bƒU¤Â£'8€‰ H"yš‡L¢ñçØ¡èàd^h ]€2f¢”HucØþ|C ’‡ ¦Ñ]V~1H0†–1…hdá_èFƱ†tÀáwøxvmpÝ-a÷hè² ØG;¾«6Ä ~ñŠ.$¤¾º¡€ V°C üݶ³ ¨Bë€3QŒoäÀ ƒfÔ¤Þ[€ÞšÁ“äªMº~']3ÚƒR¹ ãÙ»ÐóktªS^j€„’œu› „@‹tÜÅ€ITñ ‹3è1˜Á#`bc\C‘D(LŠl•bðâ)ÃàA:lPZ8b «õ-ú@ŠGB`1-F a(âBÕ/¼€‡ÌþÊ1êRoTÂðoì ²Ežsô¯C7#>ÄAêpÃô †r  â0ƒÀA2xC bà¼àÉÍ&eÐ4®TÐ ·’ ^ƒ7ÌP6¨#ðÀƒ .õ Å"&]÷Œ\ØkvýEƒšàƒ¨â’P'ä-CÚºe<®p ¤6Š`Ô!‹vÈF`È,`p-”„z`)¦›,€~€,lÈ_ÀÊØGîw€ÞËžö¶Çýî´4 (\Aáhì!$¢°À¿3Œ $Þ0º—~×´®¯!­``FžÐ„$ƒ/øÀäÀ þÔ€,ÐÀ È€+´Â ¸€*¤*œ ”)ŒÂi Å1Œ=€¸Â¡¬ à]CwÌ‚%\Bhx€'|(„‚(˜À  €)¨À °@ °Â À@ ÈÀ È<$/0 Ž3ÀÄ8ð¸Âz”‡óˆØ¯V9PR,1æÂ ÈÂ+´@*¤À ŒÂxÁ)<@¸€]ÐÒu0ÂüàYÀø@l-pÈø@Ø‚oEȱ\[¸œU\Á/,È3ð@,HÎÁD1X€ Àʹ–… \ˆÉ€LØÂ1,C4\C7Œ3ŒB#@@$Pl€ ”þ*´@+È€,ÜÀ.øÂE„QLØ!\ŒÖe×ýšÄÁ^<^2æ"~\ßß‘ Q%ãêÀCرA9˜7ÔHC*ƒZÐÀÌ‘$ðšSùZ×q‚Šƒˆ:ˆÔ„Ðàš7tBVU ë¥1°C\Á‚°@,¸ƒtlJdÃLÀiøÁ (ÀF+€0°€§\Àt>ÔB ”ƒTC€CÆDdAdB.ä”dƒâáÃ4–„áä‹G¶Ü_×ÉÁØäPjE ÄÄ1ÈCIdÖ^w%QBCLlƒ²“<¡Eᣡþ <åãq L†!Ã,DÐÂ0x– àÀ4,A<ÐÂi býb‹IA@ÑÂè%$CεÁ*Ð\âÀPЂLquEÔá¤|—\`LV”-ð5 ¤£m„'A4%A´ƒÈÁ;`Â.lÁ5tAhÃ|Á6HD7ŒÁ7|C„C8XÄ.(Àxy\4’àe˜Â”A7|Á5dA4LÁ281 ÁtÜÕ,Ø‘Cz…ÄzåÒÕ½€4Ä2h:Ô,B€€tƒ $%ˆ)(ÕÀ^-ld;¤@}Þpld2˜Â$‚ À#aäþä‚;TC;*ÀF5T#%lPè×ìgþçÌg}¦À}æ§Lv™¸8xDSì€,ÄÀ*œBµ©-lÁ €\€ô$ӄɯBGáÄÜAØC>ìCÀ€!À! B"(Â"0‚<€#<ÂP@X€%XdÂ,@*hYŒ SRXw ¡(„(€Àxh&\‚%\À$HB$@8‚4#,€ 'DŸr@“ÐÂhÌÁ  ˆiÄ_ÕT=L À "(4‚#D@$LÂp)|À'ˆ œ@   €Cþ-”Â)4„-è#8$BÝä0Ä$@ÒüÌ/C”œÞÌ%]‚Ö\â ¤€¨Â6æÊѪ¿Ì„%È‘d‚-à!cNÒ{´þ„ŒxÀ80—0v1ÆÎHˆ>œÀTD¥%†aÌQ#C0|Z…Ú–ðDMÆR°z¥£z­cM,‹¬FV¨Ãàš>ø ƒêå,Á€4 AÀÀöD ÄÆ ¤'>€@€@=ÀÆ@0ôAlLÂÊ2R…²^ÈŽlÉzlN€ì”0,ƒqŠù@ Ô¤<ˆÀR¡Ûqü$t}“XÁ8OÉ x ìþÂ|Ù+áu¤ © ßÙÁ)¼D@êH*è0€@8ý %€ @BÈ<¨ôAøA <Å´E0/¬lܱY²ÖOæ¼ÀœÂÐà„WIøÂ,€´Ã6Xœ64HcÆEGµÁ&ð5PÂMfj„f‚Î# (BNI‡•D64@s•o^¿B ! Õ%MBX'G`§‘´#Pð†uäĤÀ(„Åâë…8DÁIÖÝ6ÔF=XB5ÔÃ"ø€œÁ0RÀ†+èAÔˆlLC.ÀÃ5Ì,lÔì`¯ör¯÷Vo´t[bðTIàƒ*lþݨýåh.U¬BïJ $8Ø ¼ƒ„™é\Y˜òhÒä°À^}ÁA¡ÁÅ:˜@M2C¬ÓŸ¼^N8ƒ4Š(<ŸÞP«|$Ä1 á¢á¶ŠÛƒú„O)-P][ä- B+´€!Ù€laZN·ºG"͈Â8BÊT„é®êg¾ÃJÈ+b´•50í.†íRî I°',CCünhìÏh'w²†@6X@Ó?NIT’*tB.(„‚à ´¯–ì€ÂF®+xCX/#რTÒÎÞ'¤‚9~¼‚Ô,@ÀF# Ã#Gòþ62"+r÷‡î>Ô.DÒ®ºÆŽ. #LS0ˆK½A\MX4nít¤K>h+t1_i0Vr°ËPê^¨B ÖŸdBI,’ÅD-A [E5ØB)¨CÀ“ 7H]FEx$ÈO$ |€'Ø‚!µÅÄÁ>KRŸð$ "°kq_°«·¼ëékôÁ,ØBì« ¡qŽTÃÀºqÁ^gƒFÂ.ìt샲a••¨ ¸Ã\¦íÀ84è=xA,Ü„žCMÂüÉÒ;Ì lllÁl( €ÂÈ7È4MÛ4ü²´Kô+³þÆ>Ã|5-Û2^4-<í.ü‚9`S0“à0KGºä+ÐÁJ”íÙöEÚ®mÛa½-p‚/ÜÁLbƒ¸ &€9Ÿ:Ë„Þ ¨Ã -WLÈ-@B-Áa öLp.K¸Á ‚Ê4×Ö=—‘¨îN¶né$ôé˜ñPE´Î¼±FoH oñRH·o›ÉVhmïFþ"“U ÑÒ‚Æ;ð{u0440?ð½E0ió,s9e¥ç|0¿‰ð\Ó5L¼˜^/ˆ>· ßBYeßðBÉGI)ÌÁ.””æBÅЂ8ÃØ€´‚7-\öJÌC¬tö0~v_þpñÌ”6”<ôñ¤¶¸¬ö‘`4G¼ÃKóSœÆ änçvWA V7^à2èrqkFÖ6‘YÇòÄE[GwH<3 D³u³S]KÅDâÖ|Ï÷TàpTÈ1ˆ€XƒÇ 7þä8ô-xÌŒ×wØ´ºrDA»+¼ú÷°xê ¸³xk¯FãòƒïÐHëÃ%H¸nè¶tXøkµÓÊ2‡+†‡›ˆ³†ˆSÑsûU‰o\³­ŠO„Ñ-´ÂP¶ÃÀAëŒNCE >°C$ÈÏ KÅ¢Ø@öÌ÷‘ËK’ï7G„6ëÞÈ I”WÍ”K•øþ¼¶ñ—‡ùªÇƘG™÷pó¶šurkírwSs¸œ‡X3gæt‡0žç9‹KÅŸ[ ‡à[zT sߔ‹ ùbá@x ùø\Z:¬`:7$A2ç¨ßŒ¨£ ©c°)8©:«¯º«³¬c8n8­w8Y7%®×•®ÇùUB·¯¯Á‰§¸°¯ø²¬Á²C:óKÔ°2C2¼A¥C±Šo{H0ùA¿ÇK¹—‹¹Ÿ º‡–kù4µ»»K8¼¯†¼sÄVwµ½o››¯œ³5¯GjtÛ¹\|ÁÏøjE¦ÂËD]¾„ ÖOð½9g{Ÿ\þüFlúh«Ç‡Ç Èo‰ÈoÄ©÷É£|m«1‹~J8zì|êñ¯þ²×åËx«@€à€% ¶í¯H~§+_D=%þjø>›¿D[4ðŽ×þ?mÿ×#¿b”yÙ€UÇ‚4xaB… 6DX™k)V´xcEV,8ôhK€0#I–,9À5+Y²ü`:ø0ËcgN;M D hP¡C‰5ziÒ¤œRúô¨”)e V O­ZS(Õ,:€RéäÝÖ­j|t›€›ŒséZ<€ƒ[½«Å 65L_8Ù{¸adW7vürdÉ“)W¶|3ã(y/LÀËß–»´ð£Î«Y„(±nìŒ;¶)R-J•¢×¼’d¬ª2j‰÷iyråE™:].Ï“b-þ~=L׸w÷΀¾c°ëdkû \¹²ÙW¼›½Þ¾ôbÕ·?S<â¯VœÀ@Í8‹ï3/àXÁÏŠqú›°¡×Ú»ðÚú ‰8”ìYÄC¼8)EœŽ£ŽÅ™kÊÅ•³.E®À»G¦ØP¤FœÎëO= Û{BúÊIjÖ(ò°ÿ |Ê(ܬ¿ÏDr &µ4ÈB!eÓ0>s»2G›zìqEÕ\®¹5ݬ.«3u œ:í¼ÓNb೤ã ÒËØˆÜR!'*8ÑD¥ BÝêƒs$”ÒJ-½ÓL5Ý”ÓN=•”ŠÑkCRþM=ÕTvptË.¥ LôÄÜJTm-U•oøL1Í7}] Æ_…ŠÆ]­ÑOôàŠÃf}Úh¥}V¼X½vËyÜØ–Ûn½ýÜpÅ—ÜrÍ=·[:°]—PW_£ q;–Þëz_ ÚÌ××bëýw­¶€$“à‚s„Ý„^˜á†î">´˜˜âŠ-¾ãŠÕ‰7Ìyþ8§{ùvß‘×ôä”IJÖ¶*yæ˜ež™æšù{çœuÞ™g&!2h‚k“Õc•SÙä7KN:F”™åž¥žšêª­¦Ú˜7´Þšë®½þì+ä}Úh¤™Vsé³Ytšì£¾îþ¸åž›îº›µm€ÍVÛÅ´ù^Ží¼}Ûî ?ñÄÙÅ[pz÷þ›:¿!G.ðÆù$\ñÌ5ßœóÎ bÜò]Ÿ\9ÉI‡ªòÐ{ÄÜóÖ]vœAWýÌÑO·ÊôÛá¤^Öcÿøà…gmvÞyýI÷ýîD1Aˆ³1A=În:áŸr˜©AðØ'^ Îw…B‰ÂNY†áNl#Ô%´¡ 8øð§€ûÝó~…rÀ„+¼áîF¼ßTËþ¡ìio{ãï¾÷¿>ñß­Ãë랦ÕP>óqÎk´˜ /Hê²úÖÇø ýø,O_ƒ¸ŸÆìï &±ØÆ>6²&‹³0K³~«³ ´D‹´L+ PKµX˵`K¶h˶pK·F‚·Ð-àäŒ"‚ÊîìÞî(äŽî€"„"ѲníúJ(LPÌàîøìÒháD(8¡Ì†BðŠì€B€¢b (t(¸ (xAÏNÓ€ô $Á|aºA ¼!BÀf! >" 2à Ãp Ë0 \@^ÀJˆ ¾Á¨A"¼F¢ïD‹Øþ!!rë` °P ¹Ð Á0"¯¸‚áP  @ÁÆâ + ‚ bfÀ ,1!\ª ˜àãPÁ6bh¶aZ ôÁà¨`‚a°€ À6f‡|$¡ @f±o1ƒÁ Ø€aô€Ÿ‚a`½|A¢jXÑaQiÑqQyÑ1„‘Ãq›ñ£q«ñ³‘5^h+ñƒ ‚4‘nFÇ b|Läö±ƒWƒ ,aÓLÂ×FØJMÕR"[íÕn$Öf Ôl ×$¯$$/"CmÔ(ÒàŽþ° (n0wP(”˜(€Àí¡ÍAÍ"­Í®Žëh&e’p­(˜‡€âT¡p L!2à‚âHÁ$!ËNáBa (˜Ò)¡(Jáœç¦ (þB¢ò(hd @€ ô÷D"vÀÔáÒ€•@ÁŸÐ`/ûò/ç0ÔÀÜÀ`$êÁàAØ`¦¬àž ºAnD\«.ï2/ó^ öâ|@¡ ¡® >€NàT£ÅTà0`ÅTNº  V³5_³ V€ÒÂÀ `N`ó0Ì€)` ŠÁÄ þB@ðá|€ ¢ nØ`8/èò㦳:¯3;ƒAØ@ôA à Haä @§†9À9¡S:©Ó:±S;¹Ó;ÁS<ÉÓ<ÿ3=׳=ß3>ç³>Y£4O35yÓ5a8…“8I T@2@Q¡C ‚¢ÀRvéBQ`8w“5+ô0¸ ôŽïüð¯ðFèFÃññÂÀñ '@r×.°òj4óFè$Gp(Œ)•Ò+Ÿ’-Å’,Íòê*€Ha^ò°4(>Ö!(›@‹¤Tʲ+›J_„(©Ãîò%u”¨8ÊgB^Ïp ï>ï!ìTqèþ4gB" §° ¯0 ·° ÏP ÉÐ 1 Í ÝåíõÀQ Ñ‘P ­ÚáMÚ”_r'9HuXÞNÕBNûƒOëæ<À¾ð”V"Vgµs^õaBâ-ãr.à3ñR/I00‰Õ/•0 13 Ó1!S2)Ó21S39Ó.…50¡¾¼aTÕÆT«¢ D< iTuUµ¢Umc P D qÀ)Ôak•Våuê5s΂Œg(]·Âv”ƒyDÎ’&\Ÿè*â$`Qd]íb#Vb™`v'Va"a3–ÐÕb}…&VdG–dþÇæcíåÊ8whPe‹ÂcOveB¶dg–fk–!*fKc[6(66c_6gÖf‡–hïgsv$v–giÁghaVh‹Vj§VxŽi•–g›ö‰žöd£–j¿l;Çjsk[Vk“^AX¸öc½VK.€ÂVn‡nfla¶l©#m‡Åo8¶€˜gØtmE2<^ÁX†ª<Ü–! }R €O/t•]ö‡)ˆ¬?hnƼ@”a‚sW£trMAr)×-,WKîödmÇoWp —dXÖíPµ*t×EØ–$aŒEHOˆI^H R órÆd•þ ÀâCO;—P,Lafò¡!¦÷#¼—UWy+×n“iC&e™¨'Ÿƒwûwy²íÐJ‚¢FR ²ŠBa,H~›JŽd  V@ jwz$é‘FŸˆÁðÁ 0áÔü@„N žFèç˜"茷H^h BáCQaƒ!Tà à…|`vÉœA¹Ø…ߘs ø@`)Éà¨ÁÞí¡âi‡ü <ŠzY… àá ¢a‚ØÝˆ˜)J‡y؇X‡ jˆ3Ja@X„Wª¥ô…U¸ XØ…axK`¼A a´‚qS$ŽÕb`]ŒÒþ€i¡~ï7Âö·—j~x€ ø€Í XÖ”üŒÐÔöθÌˈ"€vÐraË+(hà¢'(À¬°¸F@r=+ dFa^ÀDaDA„è ¶FHg Ô<˜B-²¦‚a ƒ¡Ç‚ï  âÜçÝ @aøm€!†+bÈ8`L4`æ`¿ÜÍÄdÅŽ˜Uè¶Á –!¿¸¹Ã œŒš­›µy»y‡¾™ÁF—yÙ ~9˜ƒ¡†¹˜ƒá˜!N™ÓØ|wÂá&ÁðÁ w¢x¯c¢/6}‚‘IÀ‘ñ,’‡b’i¡’þó “Y“ݬ“…”í ŠÞ׎Ð ÍáH`b(þéÓ>÷\K t£`t ãÉ“ã$žâ-Þä TãSÞã&ß÷½ß=ôßO!à¾àYel;²G¨`¹Q}ʘ›$œÛÔ›ú”^]EL{(€v‡½ØÑôØ“}Ù›ýÙ£}Ú¯þ+­½yH ÛÃr,Ë”JWZ‘—¶c½` ~W¨ÛQÂà‡«F½A~nîžsèè;'6º(¤E0ÊHc8êÈcéãy9ø jòfat2Â…©Í¤â°Ñ3ßÌ3ÞŠ$©Xþ^`lçMcˆ"^€PR .‰P<¤‚:¨ÃÆ)µ%B@†!‡ß4QŒ6>édA\lçE0Ãh@†ÖPRЉ``Æ$°Q‡—è¢>éA“T©v—fºi§Ÿº$*©¦¢ª*«­N$åIÙ½WÞwá¹fç¥áYÒm‰%Ef-oʤ¢våáÀ‰Ï†¡fI…|È¡a° † ™° Ï$Íó!µ¬E…Â$ÂèaN¡Å›Ú 8 =ÒÊ$5ÊxG0$ˆÃI$Ø1 AÚÔÀ+'$ „°€z$cðlã‡)ÃL6ùpćLþ\ñÅoLÇ.,2É&£¬òʵ”á†~Xžˆ$šˆæ¹¸U¹Û¶¼e —$€ !Ø\—Þú¤aÔ)>½¢;ï1“6(&É1‡V°ò‡J†® ¤!’èã„AµøL²ó^‚p‰AYÄAO(„C´l{÷ýwâ’Æ¸áÛ!.óâ5þxä“MÓ—aŽY¦³'¡Ý¦voÆ9gwæ¹gŸaüè *I-ÖZsíõnV#FõiÝ®¤æ„´Ž¦¹j¯9‡ T¿»i¢ùN¡Ô Ž7Ý\:àó†Ã™ûx>ìãþ>t`nP5r`âŠ7^1¾kNšþÿòþ#ûÞ¿„~ößþö·cm;á×óЖ.¤±Ë]ð’½Â`/—äk_ýúWÀ–jEçx§)ÞaP8šä©DCˆ@J"ˆœèC`à å$¼ˆÁŽ\èã–(5ˆ@Ü0} ‰7Ô ä@ã‹„€/¤ Ð#1Œ` #Œ1"#AÖ€‹ùB3Ї)ð*ì€ w#¾A/°‹˜ˆÅ@ÌpÑ‹£ÕxÆE–1lt#åHG;âQ| †)HBò LÛØÊöÀr¡ zkbÛvÜ–=¸•Dnt³ÛJ|gŽF…pÉþ—œÒ—¤ $Ér‰¢L óNðÀÃ2P†¨Án0‚H‚†íЀ$ÈP‡>ôá…à­`ã3ƒvBP¹„|ôÆvÐù©9ȃPBÄsø€ÇvXAa°a›Z@À'3#N—“ æ;Õ©v„î„§<éiO|CŸÚág0ü P!¡Ì^:˜çó§Oýê¹ð¨÷ ôS+}ë{ÿûÁw¾r·oÚîƒÿüè_½øKþË#¦ˆ¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€ú'Ø—}l‘x˜ Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒr䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ1[I²ID„ìÚw馔J¥n‹-·º7Õ­îÕª¢ýV·ÛJH m–¢R’‹J’5kRbÂŒóûã|šß|gó”÷õüãó˜9ïsÞïÃÜ>ór¶—¼¼ººúرcñ NÒÒÒnnníøYضlÙÒŽVñññŽŽŽ¢¶:t艉‰ «øCÁ‘(@"@ €ØÁ9Úè „ôõõÙÛËyihhØÙÙ™››s•/]ºtéÒ¥¼õwìØ!èV$iÅŠmö',,ìĉIIIíÛä’••Õ§O® PDÐétQ[:tˆÁ`ºŠ?vR€øƒ©+ÄþåÚ<ÕYîܹãââò=î,H|||eee»·ò;v,!!AÔV¹¹¹BöF RVVF¡P„üæ•””Œè Q`D±óõëWôí;µýñÇT*õñãÇcÆŒ±··oß vظq£³³s»›[XXL˜0AÔVëׯ÷óó›2e ñ&555£GÎÉÉèàKøâ‹J¥ÆÇÇ‹ÔUÐUÜÜÜà(ÿt;ø{´ÓGt¶oßÞ¹7$ÈÄÄDȪ—6ùøøˆÚ„Á`°X,QD~÷îÝüùó…ÿÚñUöZo^ÕÕÕ>k¼`O–¸{U9}úttþ Ð@ìà@§#Û”ÄÇçÏŸÏ;gjjÚŽæqqqzzz†††"µ’––މ‰õYÇ>|¸ð:8оF§§eþéåi?ÀË誮îøA`bçèîN~~~iii»G§þú믢¢"‘š°X¬Í›7‹zŒòÕ«W Ú¬Öæˆ@Ü@ €ØÁߣòòò]Ý‘N`jjzðàÁ´¯¹ƒƒÃ¸qãDjòèÑ£””‘¦$h4Úï¿ÿN£ÑÚ¬‰OgÆ‘(@"ÀÔâ…F£µ¶¶ÊÊÊ’Éä®îK'PPP˜?~»›¯ZµJÔ&:::›7oµÕo¿ýFd!fƒ@ #:ˆ<®Ð޼NâiÊ”)üñGûÚþý÷ßYYY¢¶Ò××i2‹Å¢P(‹-"R.ÍÍÍ¢ö ÐU Ð@¼à/Q‰t222Øgî½~ýZÔÃlØÎž=Ëd2Ej%R“¨¨("©Ú1 …‚¾£‰â‰â/T µyófMMM//¯¹sçêêꋺ:!äååea!Úö¥þùGÔEÜ.\˜>>YYYYYYwïÞÝ»wouuµ¥¥åñãÇõõõ‰Ü$--mÑ¢E¢srôèQQ÷¢‡……_÷?—vd–tÑ@¼à‰tâââŒ=<écáÿÒf- ·<GÐù`Dñ‚Gtdddºº#âààpûöm„Pccã¬Y³vìØallL¼yBB‚¹¹¹HO411‰©Éˆ#fÏž-R“Î t&¬8n•ž\i„PjÈûN¹'€‹ÿÕ@·Ô FtBãÆ[¹r%•J]½zµ™™™§§§Hͽ¼¼>ìîîN°~}}=FSSaDäÏ?ÿôôô$¾fÃ(F;ÎÎS»âUÃÃãE¦Î¯ã>PkéJªÿ›²d¶°î|—Q^_Ù,§,ÝSC®Ÿi¹'† ¿ô&±æÞþweYõrJÒƒ'©9m¤¢óÿ×Y'Ÿ)yr¦¤¶¸±•ÉêÕOÎx’Ú̦m^@ÒIöÿ™Ðýà%#’~,²¢¢¢……ÅêÕ«Ÿ>}š RÛ¦¦&:îääD¼ÉÕ«W“““ÿùç‚õËÊÊ.\¸€gÖD"%%…ªªªòöö¦Óé------øþ_*•JoaÑOò?%EòÌCvYÔ¤‡—[¥‡Ë#×e§G”ž¨f>UãCþ×7 5E²ðKÙ·«/þü¼¯YÏ‹û7×3rîV¦|Ú4Š¢$*Ï®¿áÿZo˜Š±ƒZÓFNLuméÿÎwr €nÄK÷tBÎÎÎþùçýû÷EÍè)//ŸŸŸ¯¤¤D¼‰‚‚‚——ñúZZZ.\PVV©c!|PCCÕ+WÕé¡Nô ¤¦/-ϯV˜¹hôP£Žïóoè{è|*mJ(wXo0yÓ \3Ü7‹Ao~)vï[ù^2†ãú „”ÔdÆ÷ÉŒªü÷rÙèåBÿ ¿XHZŽlhÙËÒMK¾×ÿ¦G…\ €@ñÒÚÚŠ¾H4GGG%%%" ¤¸„‡‡6¬W¯^ě̙3‡x寯FyyùQ£F‰Ú±ææf¼ëJUUu×®]²²²222²²²ì222ÕÕÕ¾þ?¼aZXyKóùÕŠçW+pIñ¿ŸØ©T¿¥"„†N×bלsì+–„\úXø•ÙÂzp¤óµÅÿK´®g¯2ÖGïÙ…Ò¢ÔÏ!² iÊf#Keá—è Ð@¼à1QÊC'Ož:th;®]»öøñãÄž‡††Ž5JWW—`ýC‡µ´´lß¾]ÔŽmÛ¶­wïÞ!yyy¾u HR„>; ==WÚGOÁÌU—¤†¼O½ô~€JO B¨ôyæ`îa-!—z÷W"“ÖÜ!«Àg8°ú-U}bÀ;‡Eµ%Ï.¾¿»3ÏÎS[AEFÈ%"?bÄK·Ñ),,$žZ­¡¡L&O›6`}ƒ€wxtùòå[·n‰Ú1¾oß¾v¤³àuoþǯzÃTt,”Í]53oT*©Ê¾¼YÕßFe¸—ŽþˆÞW×缎ÿÐg€³…Uý–ú>ó‹êØ~f=]rØ`pyåË£ž¤&E&}x÷õý‹/×èóÕC½º[}w×Û—ÑUZ&=´ÖªÜJi9)á—è Ð|W¯^mÇ6ì=z”••Ðb0~~~đݎ3 …’™™YUU…:i¼ OW=ûÜÊd™»j&ÿSò!ÿ+BèÑñÂá^:‹C¬cv½Í¾Sõ:öƒ4EJÃPÉåw#…Þ2!A—¬ÜûJS¤þRF’"©èÈ™NÑ0uVÇSî'ßSƒR\ûöáG¹Òzö*οÉÈ“…_ €@Ðù˜L&™LnÇ&ùÝ»w;;;Ïå)''·jÕ*‚• FppðÆEíÕ­[· ØGáQ·ÚôïXη«nã|+×CÚm¯‰Û^>+œ„\2wÕ4ÿ6ÆÅzV_ëY}E½@7ƒ“€Î—=aÂQ[1™ÌàààÒÒR‚õëêêDZSžšš*j¯¾|ù²qãFœƒ¬Û¬ à¿Ft/xuN§Œt¡ŠŠ ===Q[}øðÁØØØÑÑ‘`ýÈÈH‘vu™˜˜´c˜’’Òþýûñ :Ht/Ý#Ðqvvž2eЍ­´´´’’’ˆ×_¼x±HO±²²µK•••ššš®®®øm·Y*Àüs@¼t@§ºººÃ«W¯¾wïÁÊT*UZZZ[[›`ýiÓ¦•——‹Ô‹µxñâèèhvI·9΀ÿt/Ý#ÐqssËÉÉi³FÛ¼yóíÛ·ëëë©TêåË—q$AÄîÝ»=J°rJJJMMMß¾¢-¹­®®VTTäÜë#:H˜º@¼àÑâß÷bˆÅb½ÿžÈ–o …ÿêÕ«%K– 0ÀÐÐðóçÏUUUššü·qº~ýúÝ»w viøðá—/_uISSóÚµkœ%0¢€Ä¿K/xKv;N $éýû÷rrrD*ÛÙÙyzz666†……-_¾<>>~Ô¨QÖÖÖ«W¯þKÈÍÍ8p ‘G”——3 QGïÙ³çõë×\…Ý#·<ÿ)è ^dddB---]Ý‘ö«««£Óé+6,99™L&[YY­]»öÆEEET*uèСBâ‰ØØXâƒ^þþþçÏŸ'X+,,~ü¸råÊììl"ΙLfyyùüùó‰t†MOOïêÕ«8³'"#:4*#óF¥H] 3òx‰âçÇ–è@‡N§2„`eCCÃOŸ>UWWkhh „üüüH$Ò®]»„4©­­]²d ‘(!D&“v{ñâ…¹¹¹¹¹9ï%M¼×®]knnVSS^ è@ €@±ƒ¿G%4ÐéׯßàÁƒ‰×Ÿ0aÂÎ; Öt===KKË®îøA Ð@ìHn óäÉ“ÈÈÈK—.¬ÿèÑ#‚Ã?ÑÑÑc—ž={ž8q‚`†þìÙ3‚ %ð‡"¤ruuõêÕ«ÇO°àÇ+))155%þ tè vð÷¨H{—Ä…B5jñú^^^ÎÎÎDj¦¤¤9ãøéÓ§%%%Df¸Øõ'L˜@0ÊA544 ¡BH]]ýСCo~<‚Cƒ Û€@±Ó£Gôí;U²Lž<™xe&“)%%ÕæF'„Prr²±±1‘ÍYAAAÏãÁ&OžLðe GŸÄ#@—ƒÅȈÉ tîܹCü¨ÃŒŒ GGÇ6«±X¬Y³f]¾|™È=wîÜI|8Çßß¿©©IxQ.øCÁ@"@ €Ø‘Ð@‡Åb­X±‚xÞõüüü‘#G¶Yíýû÷222Ë–-k³æçÏŸ,üÄ?¶ÈÈÈgÏž‰šž³¾¾!Ô³gO‘ZºL] vzõê…ª««ëꎈ¦±±qܸqăOOO‹Õfµþýû—””´Y­°°ÐÁÁáíÛ·Gh&Nœhbb"Òp‚@ #:ˆeee„З/_ºº#¢QTT$¾ßª±±±±±±ÍõÅ cæÌ™DRVåää,_¾œ`àRSSÓ»wï!C†êë7, (øHt;èdff OýÍ)!!ÁËË‹ï¥ßÿýüùóxìäÈ‘#Ïž=#’raÚ´i¿ýö‘Gçææ6¬¥¥…`WÙ¾~ýÊ`0eddDm è*è vðÔÕçÏŸ»º#¢ ½ÿ>ÁÊ_¿~´±¼¶¶öâÅ‹ÆÆÆ^^^uuu«V­jónW®\©©©!øè¼¼¼ßÿ½Á žLÄŸ@RÀÄŽŠŠ ’À5:æææ¦¦¦+Ï™3GÐ%œ-kÍš5‘‘‘/^ÌÍÍ­««›3gŽ••ßú_¾|ñ÷÷ôèÁGOŸ>`M.8ôÄŸŽX=zteeeBB‚®®nW÷±#:ˆüUúéÓ§®îˆh,X@ðXý>™äÒÖÖ.--UVV^ºtiRRÒË—/û÷ï?{ölccc¾[ºZ[ƒ•Ë© IDAT[7oÞ¬­­ÝæsgÏžMd4_èLš4Éàâ!B(++ËÆÆÏë±1¢ã] »‚@±ƒOÆ“¬©«ÆÆÆØØX‚•oݺ,èj¿~ýÞ¿Ï~Û·oßÈÈÈ„‡‡óî?uêTCCÃ’%Kˆ<700P]]È Ë|ub ãíí½téR|ðà•+Wˆ7¬®®®««ã t ãB@ €ØéÕ«—””T]]“Éì꾕——·wï^‚•ûôé#dþˆ+Ð9yò¤¿¿ttôСC¹jÖÕÕýùçŸwîÜ!øÜM›6ýñÇ+óª­­EßÂК5kÖO?ýD¥RØ£wFFFxG½ŸŸõ)++C999­\¹!4nÜ8ƒAƒ9r„}Ï >ÜÄÄdîܹyyyìò¤¤$wwwccc[[Û 6”——ãòñãÇ,_¾ÜÂÂbðàÁ³gÏÎÍÍíø€¸@±C&“{õêÕÚÚ*Aƒ: +ÿôÓOB/ôëׯ#„oß¾mhhÈ[SVV–B¡ØÙÙyè‹/äääTUU v’túôéÓî;p QPP’’º~ý:.´±±á<-ÚÍÍ3«ÆÒ¥KñÛyóæy{{{{{s&:µ²²š3gNQQÑòåËq”·dÉ’–––ùóçOœ8111qÞ¼y85)n›””4nÜ8OOÏŠŠŠ¥K—JPl A°q¤ªªúéÓ§ÚÚÚÎúZýÞŒŒŒŒŒŒˆÔÌËË«««³··TÇWWWxãÆ»wïjjjòVc±X iiiDb—k×®£FŠŒŒ\ºt)BH__Ú´i111¸Ú„ ˜Lf\\~ëî¬·|ùrÞ5IÁÁÁS§NE™ššþúë¯ÕÕÕ}ûö VVVÆ™VUUUG}çÎÈÈÈE‹92$$äܹsÇG™››¯_¿¾²²’Èj'$:ˆ£>}úäççüø‘`ôÐåÂÃÃÇŽ«¥¥ÕfÍk×®1 !BHKKkΜ9ÕÕÕ·oßÇ\½z5##ƒà|™ŒŒÌáÇ;åÄÅÅ…‡‡#„Þ¿Ï9³Æ‹HšÒk×®555EGGGGGã’ŒŒ kkëvw!dff†_((( „ðAAÅÅÅ ãÔ©Sœ59û¯££ƒ_P(„Œè€îÄÈùøñcWw„¨C‡™›› t†Þæ0Uÿþýëë룣£…$[8zôh}}=Á@gÚ´iDª aee5xðà/^Z[[“¾‘’’â|QVV¶aÃá·b±X¡¡¡ºººNNN¸$""âÊ•+œ{kFã{‚ÝÖÑÑ‘’’ŠŠŠ"rè"Ý:ˆ#uuu„Їºº#Dyyyéëë©Ùæ¡––ccã-[¶à1Aüüüˆ|y¿}ûöçŸ~òä ‘¾ñE§Óß¾}kjjŠ3QŒ9ÒÄÄDPe™6³Š=z´¸¸ØÖÖÖÌÌÌÉÉ Zݽ{×ÂÂbîܹ8XܳgOÿþýß¾}ûìÙ3„PVVžQÒÐÐ@mÞ¼ÙØØ¸²²255ÕÕÕCçÎ[°`“ɼ}û6BèæÍ›~~~¾¾¾ëׯŸ2eÊØ±c¥¥¥ ²³³W¬X±lÙ² „Ξ=ëéé©¥¥uïÞ=„Pll¬··w»Wˆ!XŒ €8’¸@gåÊ•Âã,))‰½âD7näåå ¿[bb¢»»;^’"ÜîÝ»åš ‚Åby{{Ÿ?}û8ðGÓxº*--íŸþA…„„4559s!djjº}ûöìììóçÏ¿|ù¯ÂÎÈÈÀmÍÍÍ7nܘŸŸñâÅüüü3fx{{§¤¤ „BCCïÝ»—˜˜ˆÃQQQ¡Ÿ~ú騱c½zõŠŒŒŒˆˆ¨¬¬tppppp@¥¦¦"„.]ºtïÞ½ŠŠŠøøx„Pddd:Ä Œè ŽðîÕÕÕ]ÝB²²²jjj&NœØfÍk×® ÁTUU…*Ο?ÿÙ³gýû÷oó‰GŽéÑ£G›Õa2™ZZZüñNÿüù³ŒŒLÇ·—'$$p¾ÅK8-X°`Á‚‚šãýVBn¸bŠηNNNì92!­²³³…öIâH²GUUU t–,YÒæ6ï“––&--EBÐh´GqîÖUAA¾¾þîÝ»Bååå,«OŸ>mÎLÄ :ˆ#É tlmm .577^!44ÔÌÌLx5WWW--­6gÊvíÚU[[Ûî@§¼¼ÜÙÙ9&&fàÀ¡ªª*„ßîqš Žð*>¸Eü 6 ŸÅ"ÜåË—ñÂAX,ÖÁƒ[[[…Ô¹téRAAÁ˜1cÚ|œžžÞž={Ú¬&Heeå/¿ü‚£ôí³€@‰âH]]]ZZúãÇø41÷Ë/¿éç­[·„Whmm]±b…………  ---þþþ‰‰‰m>‹Á`,^¼XÈîtáš››mllØKanݺµcÇ„PCCCûnè*è ŽÈd²ššZkk«øÏ^ÕÔÔDGGËÈÈ´YóðáÃB2? „ÈdòòåË…T`2™RRRóæÍþ ¨¨(œª}.]º„Ï)f{ùò%N·Þ‘#]ÄTß¾}B]Ý‘6HKKoݺ•HMuuuœ¯›¯¯_¿šššrÌ‹³2±ÉÊʶyôð™3g¸"âX,ÖéÓ§ñø ;ÜìÈÒf@—€@1Õ¯_?„;×´ØRQQY¼xq›ÕvíÚuåÊ!bbbÌÍÍÉd2gá–-[æÎûøñc„ÞB%-ÝöЍ¨(á)&„ ‘H?600à,dhÄN³è ¦$%Ð eg'Dbb¢ðl‘îîîAAA\…òòò eÅŠcÇŽ]·nðuÊ¡üüü””"Á/ƒ1sæÌÜÜ\ÞKìHx €Ä@1…³- Ï)¢££kjjÚ¬ogg'èê—/_Z[[y÷4)((ØÚÚ–••íÛ·OWW·¢¢"((èÓ§O‚î³qãÆ¬¬,âç„O Æ'sÁ‰DÂÑ'@‚À9:ˆ)ggçv¯Î9r¤­­-×ÜB¨µµGr}úô‘““kó>T*g›â)++«}c~@BÁ‡ €˜ÂŽøè9ÒfóæÍÆ ›?¾  õõõ|÷R)**rþ† bmm}÷îÝéÓ§sE9MMM Eø¦-A Nœ8qðàAYYYÞ«µµµx‰4‘y+%%%{{ûû÷ï·£à‡9rdWwü8è ¦p"§ÒÒÒ®îˆ0111¾¾¾Â«egg¯[·NHA'û)**²7^µ´´øúú>yò$..NWW—³Z^^ÞäÉ“çÍ›‡Ó5ˆÊÍÍmóæÍ‚®²W"I­¥¡¡qéÒ¥vôð@ €˜RUUURRúòåK]]]¯^½ºº;üeggÿûï¿mV{ðàQQQQŠŠŠ¼—©T*BèãÇ3gÎTTTŒ‹‹ãÝ£~ôèQyyyá±” B¶¬‹èÄ ,F@|áoÖ’’’®îˆ@666«V­^§¨¨HH&¬†††µk×677󽪠 P__Ÿ““cgggmmÂ÷$ž£Gfgg·y¾¯þù§´´TxCö–«ˆz@—ƒ@ñ…¿YÅ9ÐÑÖÖnóÄšß~ûíÎ;‚®R©ToooUUU¾W333‡¾eË–mÛ¶ñ 1™ÌU«V=|ø°ËK_¼xqàÀÎu9---IIIyyyŸ?f²Gt Ð@ÁÔâ ³uuGZµjÕÖ­[µ´´„Ô),,;v¬ «ZZZþþþ‚®JKKùòåæÍ›¶¶¶|+üõ×_×®]²ÌYssó«W¯rîi—‘‘Ùºukvv6BˆB¡¨«««««×ÖÖâ«éééMMMêêêm¦OˆÑ@|áïàëׯwuGøc±XQQQ=zô^-==]YY™ï¥ÂÂÂÐÐP!mõõõß¾}+(ÊAÙÙÙýóÏ?Dr§sjii9vì™L2d×¥ à4íýû÷ÅÅŸdÏž=óçÏwpp077×ÔÔtuué¡€.#:ˆ/¼á(++ëÖ­[bøµÚÚÚzüøq!é«BOŸ>511´˜úòåË‚Vç „òóókkk‡ &¨Bii©……ß=á­Y³FPºuww÷mÛ¶Ñéô7oÞHKKWq¨¬¬¬ªªÊÎÎ...–––Þµk—¨Ïüxè ¾Ø«s||| 4xðà®í2™<}útáu6oÞ¼wï^AÁŠ———uÊAAA†††‚ÚæææŽ?~çÎí8!ÐÅÅÅÁÁï%—k×®………mÛ¶MOOó*“É>|xqqñòåËÍÍÍE}.àǃ©+ÄWff&BÈÚÚšJ¥ÎŸ?ÿË—/]Ý£ÿãÊ•+áááB*´¶¶öîÝ[ÈÄ“ŽŽŽ=Û'N\¹r¥ «§N4h‘|¢œrrrh4š‹‹‹q <{uîÜ9ÞÔZ'NœHKKÓÖÖrî@¬Àˆbª¦¦&//OQQ1!!aüøñ/^¼X¶lYxx¸i~°ÔÔTáƒLRRRBy{{/X°`Ô¨Q‚*¸»» ¹ù¡C‡˜L&oÆ!>|øàááqæÌákzF­««[\\œ˜˜8iÒ$vyyyùÖ­[B|OýAQ©Ôøøxâ]]eĈ¼¹Õ@·bêñãÇ,kôèÑÊÊÊ7nܰ±±¹wïÞîÝ»ñw­8X·nðMÝáááãÇ×ÐÐà½D£Ñbcc÷îÝË·ammí˜1c²³³ùFu cÚ´i¿þúë¸qãDíóúõëÛ\¹,%%åéé¹{÷îþù‡3ÐY½zu}}ýÔ©S§L™"¨muuõêÕ«Ç/jÇÀôï¿ÿ>|ØÉÉ©«;~tS=BM˜0!¤««1yòä   ¡C‡ŠÉÂdṟX,ÖŸþ)è” …òòåKA‹”#""]>|8==½ÍL¢\***úöíûóÏ?©>>oÞ¼éÒ®!„P}}ý¢E‹„T ÓéS§NåZÌËV^^.$¯…ÏŽ;]2eÊÝ»wù rõêU! Ÿ¹ôë×oüøñÍÍÍ!!!¡¯_¿úùù!„¶nÝÚ·o_âÏt9tGïß¿/**RQQ±´´d®[·ÎÓÓSL&ççç O8J¡Pµ0aïR_,##ƒÉd²ÞIHH¨ªªb_}òä‰ŽŽŽH½}õêUtt4‰D"Þ/I>{ö,Bhûöí%%%–––íØáèZè Ž’’’BcÇŽåZlû÷ß[ZZ,[¶LP ðc 2äÈ‘#B*ìܹ³¢¢‚異¢"///¾3St:}áÂ…¹¹¹ì’äää¡C‡nݺõË—/ÏŸ?Ÿ>}úË—/‰÷³±±!´}ûvâ­BNNN}úôyùòå™3g>L&“ƒƒƒEZû è Žð¼^ ÃI^^þÆ}úôÁ “»¢kÿ#''gjj*è*F;}ú´ ³mÏ®©©qttä¼s}}ý¦M›ètº½½ýü1yòd!µ¸´¶¶.^¼8""‚`}N²²²³gÏFy{{3ŒåË—:´÷t-tGxD‡3Ð)** _·nݼyóBAAA·nÝꪮZµêÙ³g‚®¶¶¶îÚµ«gÏž¼—²²² 5ìׯ_pp0g •J4hÐéÓ§ãâ⤤¤JJJð2m"Š‹‹ ÆÌ™3 Öç‚g¯Z[[UUUáà$ìº@ì¼{÷®²²²gÏžeee7nÜHMMMIIa§–D‘H¤AƒÙØØtáìUzzº¯¯¯ «òòòì¤Q\‚ƒƒÇŒ3pà@ÞKñññÒÒÒ\ãX 8`:tèƒnܸñË/¿ <8 €ïM8 8ðÚµkmÿ0 hêÔ©qqqááá¯_¿èzxx¤¦¦vä|źº::N&“E= > Ð@ìà©999ssskkk55µ?ÿü!dddÄt|º _555Ož½oß¾·oßvVÆÍªªª7nà`nÖ¬YcÆŒ!Þ¶  €Èá=G-..¶µµ533srrº}û¶ªªêÝ»w-,,æÎ«¥¥…¾Q½}û§ÚÈÊÊÂsUxkýæÍ›+++SSS]]]q0tîܹ 0™ÌÛ·o#„nÞ¼éçç‡*..^¶lYSS“Á‘#GÞ¿÷îݧOŸ™@ÒÁbd$ž½zþüyWwmݺõÂ… |/YZZòM¿µtéRœ¦”Ë‘#GxËcccÓÒÒønDçòùóçÝ»w¯]»¶³¢œ–––#FP(”ììl‰daaÑ)·å‚§«ÒÒÒþùç„PHHHAAASSÓ™3gB¦¦¦Û·oÏÎÎ>þüË—/ dž;ssó7æçç_¼x1??ÆŒÞÞÞ)))¡ÐÐÐ{÷î%&&â5=QQQ¸É›7oðvô°°°S§Nݽ{!Äw€ €îFt 8ЇÅÈEEEãÆã{)==ÝÆÆ†«°¹¹™D"ñž¬ÓÒÒräÈö2[N'N0`€ŒŒŒðžÐh´=z8p€Èž," †ŒŒÌÓ§O«««i4š4ÁÞ…‡‡sUX°` da!¼ßJÈ W¬XÁùÖÉÉéÝ»wíì+Ft –––$)''§Ëÿ 㻼£ººÚÃý¥™MNNîÁƒ¼:222‰‰‰úúú\åiii222DfèæÌ™sæÌ™ÎŠrNž<‰'Ñ455q@ÙÁ¥Áq’AIIiðàÁt:=++« »Ád2Y,ßôïß¿Ÿ2e ×“É ä­ÜÚÚZ]]Ý¿®ò¢¢¢9sæ°OÏ"$$$99yÆŒ¢t_ :»wï^üŸWÄ;:8è 1ðCמøúõkA‹smllŽ;ÆUÇ7‘SDD„¯¯/où‡üýý…d e322"xÄŽp #--MVV6**ª_¿~¸0-- A @·ÃÞÞ!”ššÚ…}¨¬¬älB±X¬Ë—/ó–kiiñÍíPWW‡7q±··ç{D2§ÒÒÒ1cÆ :´ãé6¿~ý:~üø°°0ÎÂOŸ>ÈËË2¤ƒ÷t9t¶¶¶èÛ`CWqtt~üøÊ•+\…­­­îîî\³B,K]]kuNllìñãÇ…//_¾Ä»Ÿ†úêÕ+6}úôêêêvtžÉdþöÛo6l@ßÒ^òzþü9F311ùNG~08Ibaa!//Ÿ——÷ñãÇ>}úüà§×ÕÕÉËËóN©««/[¶Œ³„N§›››¿xñB^^ž³|éÒ¥‹/æ:%YMM-((ˆïââÖÖÖ—/_²îSQQ¹uëÖ¼yóÆŽ{ñâE;;;‘úßÜÜ\WWwäÈ!u’““Ñ·€²}¨T*N5ÄVûe ¡ Ð@’ÈÊÊÚÙÙ=zô(%%ÅÕÕõ?=,,¬¸¸xß¾}\åffffffœ%†††\Q•J}üø1WœÑÚÚ*äâ‚‚555vnóüüü}ûöÅÇÇ{zzêêêï9•JMMM8qâ©S§„×|òä BhôèÑÄoÎIIIÉÞÞþþýûík~ ===œ9ü@ €„5jÔ£G?~üã&“ijjÊUXUU¿páBÎÂáÇóNf)))½|ù’3ú)..vqqÉÎΔñ;33‡Ax“Ôƒ–.]šžžÎ}ˆøò勽½ýúõë'Nœ(¼&Nöì‰Da" | IDATj÷ˆŽ††Æ¥K—Ú×ð=@ €„Áƒ |“o|Ï2NLL|øð!g ƒg¸¸öUÕÔÔHII©ªªrž9sfùòå‚¢„Ћ/dee]\\233}||‚‚‚xWµIYYùäÉ“‚‘rJOOÇ t~ü´ à;@ ccc£¨¨˜——÷áÇŽ'@IZZš ×úâaÆr–„„„äåå=z”³ðèÑ£---{öìá,ܹs§-T ãÆ²²²ëÖ­;{öl;¶”ߺu+%%e÷îÝD¢„PRRBHPŽ €$‚]WH2™ñðáÃùÐÚÚÚ#Fp çäää:tˆ«¦¯¯/ï±ÂÛ¶mã ***þÄåË—ÇÄÄðÍ”.‹Å*//WPPø÷߉ç«jhhÈÈÈ‘‘á=û ¹ Ð@òà@çÁƒ,ë‡=T__?<<œ«ðþýû\;u#""jjj8Kð1Ä­­­œ…nnn»víô¬’’’óçÏKII)++‹ÚÏÆÆÆ¹sçîß¿!Ä{.³OžÝ¶m»DYYyýúõœu¨Tª’’ÒÀÙ%·oßö÷÷ô”ÈÈHWW×vD9_¿~1bÄÁƒEmˆ©¨¨XXX´ïñN÷Ô·oß©S§vu/€@oÞ¼é` 3~üx2™üìÙ3ÖÁTÞñŽ?%&&r®/®©©Ù¹s'çh"‹Åš{ö,>>þ‘üùóçÚÚZÎÂ;w644°ß^¾|™ëk£¸¸X^^žåTUU]ºtiãÆ‚žbnn¢¡¡!Rß:T^^¾ÿþvG9è[ ãèèØî;`ÕÕÕ«W¯†…>âïÎ;Ó§O‡@ç¿$•““Ó³gÏâââ~@ “œœ|ùòåË—/³KðH箨%K–|úô‰³•žžgÖ§ 6JkÕÒÒòêÕ+ Î?mb±X?~Œ?{ö,ñV¼ž>}J&“;eŽºº:ï–{ nîÞ½ÛÕ]?ìº@RMž<!ϵsû{““ã:/822rõêÕì· CII©ÿþì’¬¬¬wïÞq6Ù°agN~~~gΜ©KŸ>}rvv...¾{÷®¦¦¦Hm¹lØ0öÛ7r­:ÚµkWrr2~Íd2ËËË-,,ølÓÚÚÚ»wo‘ÖúôiܸqMMMVVV"üܹs!4eÊ”Žß n Ð@‚999¡oßÓßÕíÛ·›šš8K‚‚‚fÏž_·¶¶FGGÛÚÚrV8pà¼yóØ•wìØÁ÷Î………RRR»wïæ»¤šï`U^^ž¼¼ü’%K>|(Ò‘€|µ´´à:èÐ-A €Ã{ë~@ ³jÕªææföÛÚÚZƒÁNÎ %%õæÍ---Î&{öìaç±JNNà½muuõÔ©Sóòò=7&&æÄ‰œ%!!!&LxóæÍš5kÚýãpzúôi]]ÝàÁƒõõõ;冱ÌÞÞ^MM­  àõë×ßï)MMMcÆŒQQQa—œ?žóøœ¤¤$YYYöÛÒÒRÎY-„PTTße4•••>>>FFF‚}öìÙ]»v±'Åêëë·mÛ¶mÛ6KKËvÿ8\ðÍá8º+t€¤º{÷®‘‘‘AIIIWw§kÉdgggôíÛú;‘——¿tég ƒÁ`ïÄ.//_¼x1gÚ‡“'Oº¸¸à×÷ïßçjËÖÜÜlaa!äÀÃÂÂÂìììlذ!55uË–-?~ÌÈÈàL:ÑA,ëöíÛ¡°s Ð% Ðâ.99yîܹC† 133›5kÖO?ý„W­š››{{{;88tu»ØôéÓBQQQßï/_¾ÌÏÏç,ùí·ßpbQ„PeeåâÅ‹9WØày%‹µnÝ:¾9­®\¹âéé)ü¹.\X´h‘]HHȬY³"""zôèÁ9°Ôq)))>|0`@;ÎbH8Gˆµ›7o®_¿^SSsÆŒ---=ª©©ÑÑÑAikkÿòË/±±±÷îÝëênv¥1cÆôîÝ;///77÷;å½ ÓÕÕ4h~[PP ¤¤Ä>ÖÏÆÆÆÆÆ†]933Ó¢gÏž!‰ϵv;vìØ©S§„<”F£………¥¤¤ „ƒƒƒù®òé 7n oÁâËw@ëáÇ\ùÂí#:@|555íØ±ÃÚÚ:>>> `ïÞ½ ½{÷n3ãARR’»»»±±±­­í† ÊËËÙ—RRR-ZdcccddäêêúìÙ3\>~üxƒåË—[XX >>---¡±cÇ"„’’’ÆçééYQQ±téR&“‰²±±áÌ àææ†OêC­X±oðNMMuqq±°°hs â{˜1cBèêÕ«ßéþžžžœ'ëéé±g O:õôéSö¥ÒÒÒ3fôíÛ!´iÓ¦óçÏsݪµµuîܹYYYm>ôܹs>>>œ%ÅÅÅË–-ßKÇ=~ü¸¦¦ÆÀÀ kç­V¬X1sæL„ÐÊ•+ñ ‰4iÒ$333}šà7qqqqiiiYYYEEEUUÕ‡jjjjkk?þüåË—†††¯_¿655Ñh4:Îd29RSS³¸¸øùóçDž+’¦¦&®íë+W®dÆÌ˜1ÃÃÃ}iÈ!!‹Õ«W/Þs322¹² ózýú50+..>{öì¼yó455]]]]\\fΜ‰cӎá!Ž-ºDß¾}•••9³^ôíÛ·W¯^½zõÂÁ«½½=þïÔ¨Q¡#Fhkk ¯…Gùü7Á ¾p ëúúz‘Z3 ®a•÷ïßãÑÑÑ¿þú+g Ây$^ýƒ³cÄGØ#“'OŽ­­­åLë-HûöH“Éd))))))‰$õ ÞôtåÊ•N9)˜ÓÛ·o÷îÝËÞEõôéSUUUö†pÎì•7oÞÄ«zY,‰D:zô(ïÝlmm¯]»Æ>€GíÛ·ËÈÈ}ýúu̘1cƌٴig~‰ŽknnÆ[ÕfÍšÕ‰·‰¹¹9çÄBhÈ!øœkŸ˜˜˜ŠŠ <œùéÓ'yyù½{÷*++»ººÊÉÉÅÆÆ®[·Wíëë{úôéeË–±£|„Žòïܹ¹hÑ¢.øñèñeii)//âĉ£G²¿·oß®¢¢²víZA­ttt¤¤¤¢¢¢Ø^œöìÙ3xðà 0àÊ•+Û·o'Þö€ çVjìÙ³gx5Ijj*…B!˜2iÀ€­ÿ‹Åjå‡Åb1™Lö AØõëרÇôu EEEöÇ¡S§NM™2:ÞÞÞ›7oÖÕÕE1™Ì?þøîÔ¯_¿9sæpÞ§¸¸xýúõ×®]k³{>|ø÷ß—-[æîînddôòKÇÄÄ444hkkÇÅÅ1¾a2™ì×­­­íxÝØØØØØØ)=\µj•¯¯ïÝ»wÍÍÍãââ.\È•ñ”7¼åðß_ÊÊÊÛ·o÷÷÷wpp5j”œœ\FFFVVž+ ++++,,D9sFYYÙÄÄÄÙÙÙ××wýúõS¦L;v¬´´tAAAvvöŠ+–-[†’••mhhˆŒŒ¬¨¨HJJÂm‡ †_Ÿ={ÖÓÓSKK ïäŠÅG¶àɲ={öôïßÿíÛ·x sVV{kL@@@NNN}}}\\œ——çéyB¼xñ¢¿ñðFEŽŽŽùùù‰‰‰ì%D/a¿uqqÁ£8¥¥¥‰‰‰GŽÁå,kÍš5ööö---'OžLLLäºÏŒ3Ú<˘ÅbÕ×׫««çççü¶[XXB¨¬¬lË–-{g55µN¹ÏäÉ“õõõ=jmmM&“ñÀœxÃkáQ>ÿMè±æî¥uúôé›7oÒétmmmooïU«V!„þþûïÒÒR\ iÙÚÚ:;;ÿôÓO åäÉ“‘‘‘RRRýúõspp`ÿí{èС-[¶œ?žB¡ôïß?///$$$-- ç7¸té’ººú¤I“pò£ÈÈH蘚šnß¾ý¯¿þJLLTTT444ÌÍÍÍÈÈÀ‡õ!„\]]ïÝ»Çd2/^üÛo¿}×ß ™Læ›àiþüùÛ·o íÜ@'<<|ôèÑì³pØù­´µµ/_¾ŒçøX,–´´ôÂ… B222999¼;ãîܹ#|qUCCƒ———µµõ–-[¾w”óþýû{÷îIII-\¸PAAAú2™Ì~-%%Վו••7n$Þ“/_¾„„„àƒ­OŸ>mll}ÊyÈ^DDÄôéÓi4šŸŸžLdËÎÎÞµk—ðš²²²äädUUÕ}ûö‰%ˆjݺuÙÙÙõõõ8+…Èõ‡6lXnnî»oîß¿Ïyµ²²²¦¦ÆÍÍkï!¶fÍšôôô/^lÙ²…½ˆÍÉÉ)**êõë×999qqq{÷î0`ÀøA[èÐ~ÁÁÁ±±±¡°°°ö-¸é\ø›ûÂ… xÏeË–±|üüóÏ£GFÝ¿ŸsÌìôéÓnnn$ÉÛÛ›ëÈ»!C†\½zUÈ9¿ÅÅÅ£G¦R©ØgNT*õàÁƒ»wïF:t(44´¤¤¤  @SSsâĉßé¡wåÊ•ýû÷ã‚d2™sù¹X…׈?˜º ý¸þþîrNNNjjjyyy)))Çïø ³³³+++Ùç%²wboß¾N§ã×7nÜpuumllìÙ³'çZƒqâĉիW›™™ y„®®nttô÷8²F£Q(”êêꜜ¼½oøÂÇ.\¸ð»ŽuЩS§Ø©jãââ6mÚ¤¤¤„ß#„ÂÂÂŒ…ä~ Ñ ;!“É^^^¡sçÎuÊ ?~üàÁü:00ðßÿE½~ýšF£áÙ¨¼¼¼M›61 __ßË—/s¶Ý¸qczzº CY,Öž={>L"‘¾G”³cÇCCæ¦&}}ýsçα§o>~üxëÖ-‰$óVB$$$°ç³ÒÒÒØQBèþýû¸üíÛ·\{ø¼ Р[ñòò"‘H7oÞÄ'>w­­-N¤…ŠˆˆÀ_·¿þú+{(‹N§oݺ•Édr1|Ð×׉‰é¬#g°˜˜}}}¼UÛËË‹wë“É<{ö,BhéÒ¥ø\€8ƒ@€î/”9{ö,ƒÁèà­6lØÀ>gõ"“ÉwîÜÁ{|öîÝ›™™yþüyÎ%±µµµì´ð\ªªªÆŒsíÚ5„Pgy\RRâáááììlmm]\\,d7ulllii©¾¾>gæ @÷ÝÍØ±cŒŒÊËËoݺՑû|þüùêÕ«xTféÒ¥©©©,kÓ¦MxÙͧOŸNŸ>M&“pV2ŒÅbùùùálð¼ÝÝÝW®\Ù‘Ž±}üø±±±qÒ¤IÕÕÕ'OžTWWç;†ÄvòäI„вeËÄy2 sÁ¿vº‰„s=?~¼#÷‘’’Ú±cBˆÉdÞ¿àÀIII)))x$FEE%$$dÈ!gÏžÅé®Bååå}úôá{ïóçÏããã{ôè±aÆŽô {ýúõÈ‘#MMM‹‹‹sss>|ØfÊϬ¬¬'OžôìÙÓÓÓ³ãH Ø^Þ=eff I{ º\CCÃw½¿‡‡ÇÎ;322RSSíííÛweeeœõšL&§¦¦ª©©õïßÿ÷ßG577ËÊÊjhhH$öàÍ­[·6nÜøúõkÞñ¼?($$„ࣅt»²²²   ==}̘17oÞTUU%xÏcÇŽ!„æÏŸÏ¹ƒ ÐíA Ó ÙØØüùçŸ]Ý ÐeeåïwsyyùŸþyÿþýGŽ mßMBCC dggG§Ó544Bzzzzzz¡³gϾzõêßÿ=qâ;Ä«W¯¢¢¢x£&“ihh˜˜˜Hp£Ó­[·–/_þâÅ MMMÎò’’’Ÿþ9++ëĉ¢Æñeee7nÜ‘‘é¬Y3€¤€@§ÒÖÖ†­³`Ù²eG‰‰ÉÏÏgçpÉíÛ·çÏŸruuÝ»wïÛ·oÉd²»»;BèÙ³góçÏg§»jjj’——ß´i×ètºŸŸŸ™™™¯¯/Áÿ&ß½{·nݺɓ';vlçθðÔ©Sééétuu‰‰iGÊÏcÇŽ1ŒÙ³gÿ€T*õöíÛßû) ƒðºtèžÔÔÔæÏŸæÌ™ƒâE¸¢òõõ544¤ÑhoÞ¼111ñ÷÷g£\¼x!„OLf±XÞÞÞ'NÄgr*))¡ÑhÄ÷r766zyyíÝ»wÊ”)æææ¿üò‹²²²µµueeåŽ;äääÚ7![[[{ቴfÍšv4‰’’’½½½¸™ x¹¸¸tÖ¾? æ РÛZ½zõ… ®^½ºeËQ›³“Æ’ÉäãÇ8Åb|üøqõêÕ¡²²²úúzΜÛ¡úúú/_¾ 4ç[ híÚµööö80š>}ºµµu@@À¹sç,--Eí<§cÇŽ577O™2ÅÄĤ#÷!BCC£SN0tØu@·¥££3{öl&“(jÛ¢¢¢C‡!„Þ¾}+%%ÕÜܬ¯¯O"‘nß¾ÿøñc9±X,¨¨(Î餂‚›ììl‘žxúôéüü|öN±-[¶ „¦M›ÖÁ(§®®îÔ©S¡7vä> ÝÙ/¿ü"--VVV&RÜœœ´´4„‡‡Gnn® Î)add´ÿ~|¾Îû÷ïíììx%ÔÖÖ>~ü¸³³3ñÇ¥¥¥~üxâÄ ‰äïïßî›$:ts¿þú«¬¬lDDDAAñV}ûöµ··ïÕ«WJJÊàÁƒãããBÓ¦M[´hΚ‰ äÜ­ýêÕ«Ý»w‹šŠ<::ÚÊʪ¹¹ÙÇÇG[[[MM­G$IZZÚÚÚúÇxásûážVVVí¾ @¢A @7§««»`Á‚ÖÖÖÿÇÞ™ÇCõ½qüÌf†±F$%™B%©H»Ri‘­B{QQIT´ˆR”´IÑž¢MÉ^ø¶%d -$e+»aö¹¿?ΫyùÙÛ„îû^wî=÷œs3sïç>ÏsžçСCüŸekkûãÇØØØŠŠŠòòr,[\\üåË—}ûö 6ìÆ±±±¼¸.—Ë`0ÆŒíüƒñþý{€¨¨hFFÆ—/_òóó‹ŠŠŠ‹‹ËËË«««ËËË¿}ûöýûw¸Ä½|ÿþÝßß‹Åîß¿¿s=   ôP¡ƒ‚Òÿqrr"“É0ìæ òäÉaaá7Ã9ƒNHHؼys]]Ý‘#G”••aãšš###¸ÔH\\œŸþóòò”””àdæÌ™#//ß² ‡#‰d2YDD„ÏËlÆ‘#G8βeËÆŒÓ¹PPPúèòr”þ¬¬ì¶mÛ¼¼¼œŸ>}úÇô!‚œ;wŽÃáèëëËÉÉ­]»¶¨¨ÈÂÂâþýûqqñ¤¤$ظ²²r̘1ëׯÿã4jkk½¼¼ÜÜÜTTT’““y²z‚¼¼<1-xs•J…ž>”^Ž©©)šJç_:ý²²²mÛ¶ýíY ü™ì> sê¼{÷îáÇ0»q;`±Xccc€¿¿?ÜchhH§Ó¸k×.¨rÒÓÓ(Ч§'?s˜?þ¬Y³h4š¨¨hªÀ®]»¸\®µµu'u‘òòòíÛ·Ïž=[Àã¢tˆˆˆTèü  B§ÒÐÐÍKŸÒ;±¶¶FD`÷Y2™|àÀ[[Û½{÷.Z´¨}Ѓ •JÒÕÕUVVær¹?öðð(..†¡9YYYK–,¹uë–¬¬l;]Ÿ8qbâĉVVV‰‰‰-+aõ!!!IIIÒÒÒ+wެ¬,ÌB„Òk‰ŒŒüÛS@¨ÐéŸÉd==½¿= ”öü«äªU«üüü>|øpâĉö“ß¾}+//ïããC&“§OŸ~ùò凒H¤µk×ÊÊÊB±¢¦¦ÚΫ††2™œ=pà@###€`T‹Å‚%Ö]]]ÑBå((Ý ‚ d2~¤Ñh\.WDD¤7ÛÆP¡ƒ‚ò¯€Á`Ξ=;oÞ¼³gÏ®ZµªJŸ;w¨`±X¢¢¢‡š8q¢¤¤äðáÃqqq™5kÖ¼yóÚR9vvv¯_¿ÎËË›?þüùó{ìšZÁÍÍ­¤¤dìØ±‚¥ßË÷fgggddTVV²Ùì)S¦L›6 ƒÁ°X,@øÛsltÕ Ê?Ä„ àRóíÛ··S½yðàÁNNN[·n}ùò¥ŽŽÎ† RSSéééïß¿×ÒÒjõÄ_¿~Q©T ŒŒŒžºŒ¶ùòåË¥K—p8ÜÙ³g{ó+& JŸ£±±‘D":thÊ”)ÖÖÖÎÎΜ7o™L^°`A||<G„F£ýí™6:((ÿ®®®LNN ly´¬¬¬¬¬lêÔ©›7ož>€ÃášvøòåË   ÀÂ… P!¼-|}}ÓÓÓååå;”å`±Ø˜˜˜€€€vÚäääX[[÷Âr+¨ÐAAùç055ÕÕÕe0MX999gÏž-,,¤R©,«±±1..®®®nÇŽ555x<ÞÎήe«¼¼<;;»”””nÜ*ÅÅÅGœ;wŽW¥[À`0oß¾m¿¹¹ùÛ·o}||xåêz ÝpWjlläm#B¥R{ÛE¢  4ÃßßÀ€±±±7nÜ€{ šµa0,«ºº:!!AAAaõêÕ¼Cqqqúúúµµµjjjééé7n ‚ VVVt:ÝÂÂbΜ9w2((ý’úúúvŽz{{©©©q¹\^q˜–466²; ‡Ãáp8˜yWW]!B nÞ¼YRRòëׯ‘#GN˜0aüøñà÷âÒ.ö‚‚ÒÈÊÊúúú®\¹ÒÉÉiÆŒ eøð᪪ª?~lÖ’Íf_¿~}áÂ…8A††QQѸ¸¸;w‚]´â0™Ìvn‹|räÈ‘ôôô!C†?~¼‹]¡  ´J;BGJJÊÞÞ>:::44ÔÏϯÕ6l6Çûö-))©£C‰ÄeË–u:ì¯KBAÌÌL==½ªªª¦û%$$Ö¯_¿sçN2™L§Ó B3§> Ê_gÁ‚fffwïÞ]½zu||<‘H411i5Çq\\\@@ÀĉW¯^½sçNkkk®O€ÉdÞ¸qãÚµk‰‰‰]éçÕ«W>>>8. Mœƒ‚ÒC´e.‡Ã š4iRvvvqqqWºúõë—¥¥%‚ »w‹‹KKK“““ët b”žcݺu¯^½Š533£P($éoÏH ˆŠŠÞ¼ysΜ9W®\™6mš©©©ˆˆHÓ¨; ¼SUUUUUí∂„‡‡=zTNNîöíÛššš>ìtol6{Íš5uuu“&Mrrrúc{îoAnðþmú±ÙÞ¯“– x‡~üøÁ`0:}Q((½‡£  Ðl§¢¢âÓ§O«ªª† ˜>}zvv6‡ÃiÕ}éÒ¥êêêN -&&æììüæÍ›Nœ é¤Ð5zÒÓÓÛi£¢¢âèèhiiI"‘à]¥·aaa!++»eËø[m —˽råÊíÛ·KKKUTTìììôõõá¡ððð .ÈÈÈ())%''2äùóçA¯_¿Â·,Ë{ƒiº hëï# Õùa̘1žžž;wî´±±QUU%“É-…Žœœ\«‰s:J||ü‘#G0Ì™3g ùšÉd„ª­Âår™L&‡k+Ýê’’’Èdò§OŸ(JKÕÒLÍtýø¤»VŸ­^½:11ñË—/ÝÒ J§¡Óé- ñ>xð`øðá,‹J¥ÚÚÚúúúŒaIàf(**òó6Ò’”””NœÕ”N ‹…Çã©Tj[ ”””¤¥¥«ªª¾ÿÞ–_-!!aúô雀F£a0˜í-E`¸ººÞ¹sgúôéóæÍ{ûöíÖ­[;¶|ùòÐÐP …beeõáÇäädÀK‚·„ÅbM˜0¡&ÀÿË£f´TKD"‘Á`,Y²¤U-‡;}ú´¨¨èÖ­[kkkÏœ9#&&foo_SSãåå%..¾wïÞêêjwwwqqqWWתªªýû÷KJJzxxTVV:::b0˜¯_¿~üøñÆK—.åé0Àb±vïÞ8vìØgÏžÙØØÜ¿̘1/_¾Ü°aChh¨ššZbbbYY™ÁÀ£££KKKçÌ™C ŠŠŠ‚®®.Ÿ±¿izíðcÓvñ:iÙ€wˆÁ`|þü™ŸùÌ›7ïëׯ-÷ÇÅÅÁ‡ÊŒ3 ÄOW((= ‹6m‰D¢Óép‰‰‰¶¶¶»»ûÁƒ›¶tww¯©©‘””lµ“ÌÌLþÇ}ñâE§çÌ£“B‡Ãá0ŒvÞ¬­­¨§§ //ßj›oß¾M›6Íßß¿Wº¶Ð××:t¨°°p}}=*tPz‚âââ   7îÝ»Àáp6lØàíí½dÉ__ßQ£F=|øZhBCCMLL:1 ¬ÕÔcÒlÐÖ¡¦†ŠV;éÐL(J~~~«‡9ϼ$&&ïbx<~èСpí•ÐØ±cá6‰Dš1cŒ 144†¡{GÅãñFFFP`0·}ûö™3gÊÉÉ<==׬Yûñ÷÷wrr‚K-dddîß¿·eee===×­[¸xñ¢¾¾>“Él*Sšª™¦û;ñêùùùË—/ç§¥]ttôÓ§OÍÌÌàWaaa\\¯Á¦M›zj–((æ¦ JOOOMMEäæÍ›¥¥¥ÍÖ%`0•v´AIII«â¾-Ølv§çÌ£ó1:x|{çÊÈÈp8œÂ—/_N›6MEE¥éQ.—[__?`À€ÚÚZXÖ¸C III544TWW·? ”Ž’™™¹nݺçÏŸúô A%K–Àý8ÎÈÈ(!!¡²²²¨¨hݺu}zMMŠŠŠ––VllìÏŸ?y½ñ²B[Üݲe Ü&“ÉPyDDDV®\ ·………MMMáöòåË###ÝÝÝ]\\öíÛgnnŽÇã ‚¬¬,ï> !!1eʸM F·ñx¼²²2Üþüù³ ‡ÃÙ¾};ïÔ122~úô©©©éöíÛŸ={–““G$###íííaÖçÏŸóüªsçÎ-,,$‘H÷îÝÃ`0+V¬ ÑhÊÊÊOŸ>½{÷îÁƒ94ÙÙÙEEEÁÓ­­­a
S§¦¦¦ [ZZîØ±C`⥯Ãd2¿ÿnbbÝR †Åb-Z´ˆgàLž=''çÝ»wù2º …òòåK]]ݰ°°­[·^¼xÑØØ8""âúõëÝ;ЬY³fÍšõîÝ;ooïÆÆFþ…ηoß +**¦OŸER÷NìoÁ{``0˜©S§† booÿìÙ³˜˜˜¦-׬Y£¦¦¶iÓ&KKK,+,,|ùòemmm…B122‚V€žž‡Ã§’H¤èèh{{{€­­­¿¿ÿ¦M›Ðô(í³×ܺu æF?wîÜÅ‹7lØ1wî\^¨®””Ô¦M›¶lÙÂår{Û³K~%%¥œœÞÇ3f8::~þüY\\<00ðĉ>|¤¥¥µŒÖlÛ¶­™K‹O ;;e”ÿãÊ•+ðëtçΖG½½½UTTí7O&NœlnnÌ`0._¾Ü£·->ͺŸ>}222*//Ÿ4iRXXXR9 …Â+:öGΟ?¤¡¡ È­[·dddš}Ey¡ -Óù$''S(À›7oˆDb[KcPPX,666vñâÅ-¿HûöíÃápŽŽŽ§OŸ®¨¨°¶¶†µ\zgjòÎ ÆÆF;;;‰TUUemm­­­½oß¾¦*–·ee2™åååüZSSÓé £ t#?~ü¸ÿ>›Í¦R©?ÖÒÒê–L3½]]Ýû÷ï¯\¹òÑ£G555ÁÁÁWX¼}ûvÅŠµµµÓ¦M é7*'""zšFŽiaaÁ‹þþý;47úûû‹‹‹«©©-^¼ØÕÕ500PLLìÒ¥K fîܹ>>>ß¿wvv‡K\;¦¨¨øéÓ'˜ø 33“Ëìîîž]WW³fÍš~ó?‰Òí"²pá¶Ö=íÛ·oôèÑvvv'))©wFç@:/t***äååmmmKJJà2ú§OŸò¬[Š¢¢âÿý§§§Ç`0–.]º{÷îN¤÷ì_¾|™4iÒÕ«Wñxü¥K—`íÁ Ýÿˆˆˆ€©ž`B”v;vìƒøù±çääØÚÚŽ=º7z꘡¥¨¨HQQñöíÛ[·n­««ƒ;srrtttbccoݺU__N¡P^½z%//Ïb±˜Lf/L„‚‚Â'bbb<8}ú´‡‡Ç•+Wþûï¿7n¨««÷܈\.×ËËËÛÛ›ÍfKKK‡„„hhhôÜpÿ>>>0Ü'((hÔ¨Q]/ΊҿÁ`0ÿý÷Ÿ¯_¿¾fÍ~–O†‡‡·¬mÞƒ ‚¿ ÆÊÊŠÍfãp¸Ž¾ót@èäåå1bñâÅÍ•——Ï;÷íÛ·zzzáááÒÒÒ ûòŒ¡  üE0Œ½½½¡¡¡™™YAAÁÌ™3·mÛæììÌç²ð‘žžnmm kEíÚµkß¾}¨ã»ëôΜ–(½‹…Åb;Tdjûöíí/,¯««‹ŽŽîèd²³³kjj´µµ===EEE1 —ËíA¡£¦¦¶cÇŽ–*R^^nllœðäÉ“¶Š[¡  ô]FŒ‘œœìååuêÔ©óçÏß¼yÓÍÍÍ¢»„HII‰‡‡ÇíÛ·C† ¹|ù²ŽŽN·ôŒ‚‚Â?………µµµZ㜕••šš*##£¤¤ÔV˜o°sÐét111Xq¯BZmÁoŒÎ§OŸŠ‹‹ÛOþþýûÕ«W+((t®î J/‡@ ¸¸¸$''ëèèÔÕÕíܹS^^ÞÚÚº¨¨¨Ó}r¹ÜØØØ;v¨««ß¾}›@ ìÞ½;-- U9((…‘#Gòï·âñäÉ“vT€Ô5wíÚÕ¹œ^ü¾Š©¨¨ìܹ³eÖ f„„„øøøØÛÛ÷Â܈(((ÝÂÈ‘#£££_¾|éååõúõë{÷îÝ»woâÄ‰æææ&&&|&D$111$$$88¸±±€Åb—,YrìØ1>÷f¨TjxxøßžJ{tÂ0ðïðæÍ›Žžæææ† H«~¥÷ïßkjj~ùò¥¡¡¡¸¸˜W8¢%òòò M÷|ûömæÌ™………AAAgΜ°X¬Æð%t8‡»wï?÷ìÙ3{öl555‰Äÿ<: º¤«UÊÊÊ6oÞü·gÒ}ý>;sæÌ™3gæççŸ9s&(((55555ÕÑÑQCCCGGgèСrrrJJJ222"""l6»®®®¤¤¤¢¢¢¬¬,555>>êÀСCííí-,,úÇÏYTT®ÏøÛAit_K RIKKëè‰EEET*®3g±X 8îÛ·o***C† ñõõ5661bĸqãâââlmm[-XéààÐ,XÞÛÛ[SS””„ Hddä”)SÄÅÅù¿]ð%t²²²ˆDbii)?Y,Ö† RRR Æ×[M›6­Y&åöiza EAAý¦¶D^^¦AéÍlÚ´©|{)ÊÙ³g?~óæÍÄÄÄ/^dfffffòsîÈ‘#µ´´V¬X1kÖ¬ž¦@‘““»uëÖßž Jg Ñh £%¹xñ¢‡‡ÇÇß¼ycdd4}úô?~ÀäÍ›7Ï›7oëÖ­°ñœ9srssùìGccca©A•¥K—>yò„Íf‹ˆˆðÓ_BGCCãâÅ‹|Î ––vûöív’VAž?ž——Ç·<ÔÕÕ………322H$FëDý‘ üíY üCˆˆˆØØØØØØ òñãǤ¤¤÷ïß———×ÖÖþøñãÇBBB#GŽ“––5j”–––®®®`Œ¾(((üSUUõéÓ§ÎÙ›½½½-,,æÌ™ckkëíí]TTôëׯcÇŽåææþüùóáÇ>>><×vqqqZZš¤¤$‚ uuuŠŠŠJJJ¥¥¥ÂÂÂX,¶¶¶VAA!;;›ÉdnܸÑÀÀ€Ãá„aÆ]¿~nócO| ,ÛÑФ˗/·#t0 ‹]¿~}‡úlz:€L&744ô›JŠ((ý £¦¦¦¦¦ÆÛ“’’¢¯¯?nܸ~Sà¥3dÈ»wïvî\&“iccóòåË .;vŒËå*))………ñŽ 1™LA²²²444äääˆDâ€0Œ¤¤¤‚‚‚°°0ôR1™Ì?Ž;vóæÍNNN‹E§Ó…„„ˆD"‘H¢Ñhü?Ç ÃÂãÍòŽÿ‘ÄÄÄÊÊʶ¼ÔÐ…ï,L&‹Å={¶C³BAA0ðÒVY_”ÞÆÏŸ?;}nBBÂåË—MMMß¾};tèP2™üàÁƒÔÔT:^QQQTTôùóç„„99¹°°°ñãÇ×ÕÕ‰‰‰ 4(77—N§¿~ýúÝ»w!!!yyù€€€©S§®X±‚ÅbÑh4@"‘’““7oÞ KKñéýÿ³E'99YNN®C‘46›iffÖêQ¸& A'Ožˆ‰‰•••µ•*ƒÁ̘1£éžÊÊJ%%%aaa'''¸A:Þ¹ËPPPº:èL”¾Â—W·Ïž={ŒŒŒ‡N TTT¤¥¥?|ø0vìØôôô‰'„„'NÌËË›6m“ÉŒˆˆ011§ûùùMœ8±¼¼\FFfÊ”)kÖ¬IMM5j´è„©S§ò–4ò™ÄëÏ455###;qµaaaM½W?~ü0`À÷ïߥ¥¥eddâã㋊ŠÖ®]  Óé®®®­ŽB šÕ,//OKK³¶¶666677¯¯¯þü¹¡¡!FCµ JoVÀA-:((}…. êêê]»vݾ}»±±‘Ãá > ..Î`0FM£Ñ( l)-- ƒlš®6WRRjll$“Ét:}ذagôèÑðáÞ,rçgJ:d2¹+ÍáááÅÅÅ8ÎËËK^^ZŸ*** ß¼yãîîþýûwØ’D"mÞ¼ùøñãüt;tèP¸qöìYccc11±§OŸæææB7 J¯ Ô¢ƒ‚ÒWèP-ªV¹sçÎÚµkõôôX,›Ínv‹Åâp8ƒ!""‚Åb322xG‡ ZßQ.¼(œfëÉ»yyyç„FÛ¼ysDD„ªªªMJJʽ{÷Š‹‹½¼¼ÊË˹\®»»»¯¯/l,%%õäÉ…‚‚•OŸ>ÉÊʲX¬úúz …Ël}ýúUBB"##cÞ¼yqqq0?‡‡‡Gii)•J%‰hu-”^£ƒ‚Ò·è–´[¶lÉÊʆf^Ÿ©©©'NÀšcÆŒ¹xñbyy9ÇÛØØ(++s8œî]’ù¡s¥§§w®÷ÈÈÈû÷ïoÚ´)99YQQ°bÅŠ+V4móßÿ7ŽÉdr¹Ü¡C‡–••©ªª*))áp86›-!!Á`444`½ø†††[·nmݺ5334Æ`006™@  *¥· ”>‚ 0>[»H~~þ€–-[foo?aÂÞ~EEEOOÏÇ'''ËÈȤ¥¥]ºtI___IIIYYYJJŠN§w{â‰?6›M :‰Ü”;vèëë;88¨««s8œÊÊÊÀÀ@++«úúz™ÔÔÔ±cÇfffŽ9røðáÙÙÙãÇ'‰ß¿Çáp?þÌË˳´´Äãñaüøñ&L¸wï›Í†Ò‡Åb‰ˆˆœ8qBEE¥Ó‹ÕQPPzTè  ô~X,Çb±T*U__¿[ú¤Óé0Ñ‘HDäõë×)))¼P›ŠŠ eeå§OŸ.]º´±±îï‰ôZ:\.®zïô¥¥¥ÎÎξ¾¾0X‹ÅΟ?_XX¸¢¢¢ªªJQQ±²²rüøñùùùcÇŽÍË˃uØ×¬Y“””_»v-•Jåp8%%%QQQƒ ¿4á?~æ’o«Ê Êß:((½&“I¥R7lØB¡Ptuu_¼xÑ-=—••ñbTZÂf³ãããgÏžÇã{®Ì"¹\n°/^LNNF¤±±‘D" 6 0tèP999§¢¢Â`0( Ts¼ñ°*@ÀápC‡f±X§Ù¢2 C§ÓQ•ƒ‚ÒÛ@ƒ‘QPz?d2º.]ºD BCC8ÀO.¾® ££óâÅ ww÷ššš<„Ðár¹666BBBïÞ½ƒÆ±f ‡«‡nÙ²…WƒWö¶„AÚ-ß………Ñtò((½Ô¢ƒ‚Ò'àr¹Ë—/ß²e‹‹‹‹˜˜˜››F+,,œ={v·5bĈ{÷î%%%iiiq8IIɵSüAè`0˜n±&eddœ:ujæÌ™$©±±Qä7ÐT#$$„ÇãcccEDD ?~ ÏRVVÞ·o€H$6mßõù   Ô¢ƒ‚Ò' Ñh¦¦¦ÁÃÃcèСkÖ¬¹qãÆ!Câãヂ‚¤¥¥ùï ‡ÃÍ;·ÕSÈd²§§g^^Þ’%K`”­žémÞ}¡R©ÂÂÂâââpÁTÙ³gÏ‚ <==¥¤¤x;1̳gÏŒŒŒ„„„–-[fjj:|øðôôô÷ïßÃ\ÑÚÚÚp½€B`: IDAT J_µè  ô Èd²¤¤äܹs%%%7oÞ\·n¬¬ì­[·ÌÍÍ/\¸ÀWÞÞÞÏž=ûõëWDD„››ÛÌ™3 ‚–––»»{UU•““ôÞô\PN3Ú FÆüA]]Ý[·nu}°˜˜˜˜˜˜¨¨("‘˜ŸŸÿîÝ»_¿~ñ„……Íš5+66¶¶¶VRR–'Eo‘((}Tè  ô ÷ªi•‚ªªªÕ«Wìx'Nœ€…¨þHUUÀßßñâÅ‹-:pàT6€„„„)S¦ø†Ðž=ÙÛÛ»¸¸tã/^¼8þ|TTTS•ÉÌÌüðცªª˜˜š¥¯ƒ ”¾F311iih9xð ‹Å:räŸý”––BBB† ¢¢¢²uëÖ‡îÙ³g̘1–––‚4»!p8*•Ê[aÞí´)t¨TêŠ+ +**TTT’’’f̘ѣŽvQQÑC‡•””Lœ8‘¦ƒ‚‚Ò§ActPPú Ð{5oÞ¼fûËËËaZ?MMM~ú ¥Ñhvvv€ÏŸ?ûùù™™™yyyåää|ûöMLLŒB¡Lž<ÙÈÈhëÖ­‡ÎÉÉN$xÇè^Ú¼ûˆˆˆ¨©© 4h„ )))“'O~ùò%ƒÁˆŒŒìþ¬…x¼ÍçÏŸ]]]³²²¼B¦(((}Ô¢ƒ‚Ò‡€Þ«–ûO:ÅápùéäçÏŸ·nÝ2001bDË£t:½  àÍ›7aaa~~~®®®–––:::"""Ó¦Mãr¹4­«—ñÿ´)tàØŠ+Š‹‹§M›¦££³sçΨ¨¨… R©T[[Û £©©9}úôV×mÛ¶­¼¼ÜÏϯ®®0eÊ”^ Jï:((}:Þª÷êëׯþ<›ÍFDEE¥.¥7 ”>„ˆˆˆ„„D«U ¼¼¼ðx¼½½=?ýäç燇‡[YYÉÉÉuh©©©jÏí UUÕ±cÇ6Ý™™™9oÞ<:~þüy>Ç`0õõõÙÙÙ)))FFFçÎËÍÍ­¯¯÷öö&“É/^¼••E“£ ôK ÐActPPú §UïUzzúÿý·víZ2™ÌO?¾¾¾$ÉÀÀ C£S©Ôµç‡öî><ïU³ýåååÇ×ÖÖž?>ŸÃ”––‰Ä©S§ MŸ>ÝÕÕõÊ•+²²²iii-Ûs8œúúúnwÔ¡  ¸Œ:((}ƒabbÒjý???qqñ•+WòÓOff&`øðá½'„ΊzBïÕší?w““““SLL ?Ãܾ}ûðáÃsæÌ‰‹‹{ýúõëׯy‡víÚuèÐ!YYÙÊÊÊÊÉÉ)++9räÈ‘£FôDÑv”?B£ÑnÞ¼Ù½}êèèð´Òo@]Wÿ‚0™Ìîí“@  BYˆˆˆôõõÚzüøqyy¹ÍåË—ÿØOyy9‚ °w3‚´´tYYYËC šu{üAèÉd (ÍxTWWûûûÛÛÛkiiñ“AèÂ… {÷îݵkW\\\Ë£õõõõõõùùùÍöc±Ø›7oZXXü±”n‡J¥îÝ»·{û$‰¡¡¡:::ÝÛ­``³ÙÍJÉ¢ð*tþ) 'L˜Ð½}Î;700°§ L¢4z¯Z ‹uåÊggg~ýêêê &//·‡Ãmß¾}Û¶mŠŠŠ4íóçÏÁÁÁ'OžlzÖ_°èÀЙ+V4:€Ó§OÛÚÚ:99µômµ¤¢¢âÆÖÖÖcÆŒùð៓ãr¹¶¶¶K—.ô]£‚ éééÝþã $iÙ²e]ï§¶¶6,,ŒÁ`,]ºôáǽJë°Ùì‚‚‚?6óóó›1cÆìÙ³›Ö0Aù#¨ÐiŸèèh}}ý~f±è®"‰Ð>»zõê›7oöQ­“=räȾ5yƒallL$[VõØ»w¯µµõ…\±”’’PWW÷ðð˜5k–˜˜‡ÃyýúõÌ™3'L˜ðþýûfgý¡~{¯öïßßlQQQpp°……Űaþ}ûöÇ~|||6oÞ¼k×® 6ð?¿šššââ⎆m ŒÐÐP~œw S§N½páBŸ»‘ÉänÉ‹ŸŸ&&&V__ßÛ´NUUŸ“¹~ýú¬Y³îÞ½+°-ý€Vè”””?~üÍ|||Ž=ª¥¥%€Y †!C†<}ú´ëýdee­X±Ç?}ú´wjãÇ·”ÍÈÏϯ¨¨ØºuëâÅ‹3«®½WóçÏòäI³C………OŸ>]¹råîÝ»kkkÛéD[[›Ãá,[¶ìæÍ›Ã† ¤§§_»víÉ“'û÷ïŸ9sf«gý¡C&“GŽ9nܸŒŒŒf‡Ž;feeekkËO¡OŸ>ÅÆÆšššvHèêêêdee;tŠÀøúõkBB?-W®\yâĉn©ÚG‘••5kVXXXoÓ:7tèÐvTUUÕÕÕ=þ|öìÙׯ_9r¤ÀæÖyyyÝ[¡¥Û))) å³JÎßâøñãÝû7­©©á³Dàׯ_ÍÍͯ^½ÚÖ­ÿgøðá•••½Së„……Õ××óÓòСCõõõ|†ñö ÷ª¥Ð\¼xqÁ‚–––¾¾¾íô0iÒ¤œœ;;»_¿~ùøø\¿~F£íܹÓÓÓSXX˜Ífãp¸–5þ(;ÁŸ…ô^-_¾¼¥ÐÉÍÍMNN^»víþýûù™\vv¶¾¾¾„„Dû2°=¡ïºXñµUÙµk 77×ÌÌìðáí¦(øG8vì jIIÉàààvøøøÜ½{‡Ãåääèêêž>}š§mOS]]ýýûw>Ó•¢´ÅñãÇkjjz¢gYYÙ7¶ÓàñãÇ999•••¦¦¦{öìÙ½{wŸ³ûö4$éÚµkëÖ­ëZ°k×®v¦”––Ãb±Ž;öîݻÇ‹ŠŠ rzz¯H$Nov(""¢¸¸ØÚÚº¡#,,¬®®^TTdjj1iÒ$WWWccc €°°0‚ -…NOXù ®¤R©fff-½W€‹/^¿~}éÒ¥wîÜùc?99¹–BgÑ¢EM+¦6½—ÿò‡ ÖNBgø‡Ä`0ãÆ{ÿþýîÝ»ÍÌÌÿM÷‡ëµZ‡6mÚTXXmmmýêÕ«'Nüõè1 ==½¿;‡¾ŽŸŸ_õ,&&fddÔNƒwïÞåääLŸ>=11ñرc‰‰‰ì¡ùôQTTTz³ÖY´hQ;Ú…ÃáÄÄÄŒ=:??ÿÙ³gyyy'Nœ=z´ gØ xÞ«ÐÐÐf‡Ølv@@€««ëÔ©S[=}üøñx<þäÉ“x<þÕ«W::: ãÆ§NŠŽŽngaGO<îùêQDDdĈ­. ¾wï^MMµµ5?ý¨««Óh´¯_¿òöŒ5*::ºªª*""âׯ_éééГ×*•Ú?ü/^ttt$wïÞµ²²***úÛ3ú;@­chhØÐаtéÒ7oÞüíuaaaWWW"‘8gΜϟ?ÿíI¡ôyôõõÏž=;`À€/^L™2ååË—{F½¨u µNO88z55µ;w©}ÿþÝÊÊ*((èoÏèÏ´•9páÂAÌÍÍÛ:F"»¸¸Ü¿ܸqgÞ¼yëׯÏÎÎ.,,„ž" #‹_B*¬V/˜F£]¿~}æÌ™üèÓI“&½ÿžÅb‰ˆˆìÙ³§  àÇóçÏÇ`0%%%$ISS³åû1•J%ü̳÷³téÒË—/2º±º%^¯/Ò§µÀÐÐðêիÆ ƒn¬{÷îýí¡ôy´´´nݺ¥¥¥ÝX^^^=QƹOÓ׵ނ‚B@@À²eË ËÁÁ¡—f0 ##£VÖ¿~ýb2™âââm;uêT&%%… ‰DÂáp¿~ý‚‡Þ¾}ËË­Ìf³›ø×,:à·÷ªÕCþþþ‚üѨ3`À …RQQñêÕ«ŠŠŠãÇ0àÒ¥KS¦LY¹r%NoË•Óo,:UUÕ7nèéé544ìÞ½ûèѣݞ_«×R\\¼â7+W®,,,”””lhh044„Uëû åúõë , ÑhÖÖÖvvv-=Ù((BZZúìÙ³ëׯ;vlÉ’%¼gÿLuuõÃßdeeYXXÉä§OŸ.]º´Ïi°{÷nQQÑgÏž™™™åääüíIµ‰ˆˆˆ˜˜Ø‚ Z=ÊápÚz4 ÍŸ?A‘–õ݈¡¡áèÑ£{Õj,”> tc:tèÝ»wÿòj,)))˜0¶%_¾|a±XžRwÝXgΜyðàAo^Åd2.\xöìÙ7n4«+Þ–EGHHèäÉ“T*•w9 CHH¨®®Ž×Æ××7::úË—/’’’ãÆ#x<žD"Í™3‡ÏßÑ”ö0s ³³sËC!!!666ímmíêêêóçÏ;::®_¿žL&çää8;;³Ùìök*õãŸ7tc=z4>>¾¯Æ"‘HcÇŽmõP¯M’Ä?ÐåééÙ«Vc¡ôi ëòåËׯ_ÿgWc 2äÈ‘#­:zôè—/_<Ÿîº±&L˜àááÑkWc s8;;;;;»ìììk×®þüùÀápZ.ž’””ŒŠŠRUUmj³ ‰>>>%%%M[//¯ÈÈH˜¹fâĉK–,qttlllìö«è€† “É ¥ÕR ãæÍ›::: m>iÒ¤úúú?ÚÙÙ!òæÍuuõk×®}úô©i³–ñwýÕ¢ùgÝXý Ô…Òí n¬ÞïÆ‚†.—;|øpooïâââÐÐPSSSAàÓƒÁhiimܸñâÅ‹%%%“'Oær¹ÍBs~üøÑ¬[III'''èꨩ©Á|`íÇÀtŽ^æÀVÂ*’’’­¥P(ƒ 2dtÈa±ØŸ?BÅ—‘‘Áb±x80aüÿM±ÿZtx «±úèj,”n]Õï髱°X,G„N§/\¸0$$DZZZUU5&&†Íf§¤¤X[[ÃuÞS›ÅbA ··÷¥K—ÔÕÕ7mÚ”——Çf³“’’¼¤z0(»‡¾ÛÓí¬½j¿¢¡¡!‹Å¶ÌòD§Ócbb„„„ îLhRûܸq#&&¦e´Pò/¯ÆêO «±Pºt5V¿§÷¯Æ‚ö›‚‚F 8•J¥P(Ç\½z6SUU…°–'‡‹·°°xñâņ ²²²üýýUUUyÁUÙÙÙp#==}èСðã—/_ F7.©ë˜Ð!“ÉÇŸ8qbËCí  ‹v~™fffwîÜ£V…Ž€5GAA££ãÊ•+¡ä¨«€º±PºÔõ/ÐkÝX‚`0˜òòr …=YŸ?†™_FŒÅbŸ?[²ÙìêêjÀ°aü¼¼¤¤¤´µµšÊ‰”œœ\VV–œœÌÛùãÇI“&:t¨ªªŠ·> ´¶D©£tLè`0˜ÆÆÆ;wîìܹsÀ€Mµ#tÌÍ͵´´¤¤¤x{„……«ªªx-,,üýýêêêÓ¦MÓÕÕ;w.tâ¬[·®C“ì:PlæääX[[C*ÈÑæÆúúõ+\¥Ù‰¹zõª€-dÝåÆês™BþïBê n¬¾»Ð©ÔÖÖ¶Œ¦èQz§  ¾ÿf±Xjjj_¿~ÍÈÈh‹ƒÇã?|ø°qãÆ£Gš˜˜øøøL›6màÀ‹-jÖ§ŽŽÎýû÷›} †›››ŽŽŽÐˆ#²²²ºþœêpø‹ÐðáÃ}||ÊËË=zdll ÓÃÿˆ–1Øׯ_/**âb0\.wß¾}ÍZJKKûùùÅÆÆ¾~ýúŋӦMóôôÔÕÕmÖÔÓÀ_²™™™LNII±´´Ü¹sgAAÀ& 7VNNΈ#œa}?¦¢¢ÂÁÁaܸq~~~=ÒßÝâÆÚ¹s§››Û?"IûîîîNNN0zô¶©¯¯÷óó›3gNllì±cÇΜ9#)) 1-UƒÁðÎm‹²²211±®?¡:,tðx>>ZZZÁÁÁöᢴ—Ë ÐÒÒÚ°a\"+þ®‹ËåÆÇÇÏ;wåÊ•™™™÷¯€Åbkkk}}}çÏŸþüù*qß*scQ©ÔÓ§OS(”ýû÷·s° %Ï“çÎ+..~üøñ¤¤$Xž9,,ÌÕÕÚ~deeáýóçÏOžtè±±1—Ë…’››K"‘>|ø°dÉmm툈ˆªª*‡3mÚ´ÚÚZÞ­<33s̘1999t:=###77·  àÇ?þ¬©©illì9‹":BBB’’’0[ömÛðxüãÇ ½¼¼ Rô¨ þWKIIÑh´ .Œ7nÿþýýRîðô÷ˆ#***ÜÜÜ444Ž;&°¿cWÜX0ËVYYÙ–-[æÎûîÝ»nœØœ9sFüF]]}ýúõ-W¢´L•Äf³CBBfÍšebb‹TËo¼‚DGGÏš5kõêÕ¹¹¹÷¯ŸÓBBBT*ÕßßáÂ…>>>Mã.zÁ¸± 7†J¥=zTYYÙÃÃã£p8œÚÚZ óöíÛk×®‰D77·Õ«WÛØØÀÅáÍÒÐLš4ÉÈȨY'‚HHHÀm2™¼wïÞ“'O^½zõñãÇ/_¾ÌÍÍ-..ÖÖÖ¿ÿ ]¡óÆ’¼¼<55µÄÄÄÅ‹ü‡L&süøñðF,%%Åf³G3™L‹E&“%%%:ôáÇ{÷îÁäxО___ß4§ÎÚµk?|øpôèQ C£Ñrrr0LJJÊÕ«Wyª.ã‚Î<ÞäÓ§O¥¥¥AAA„ß ñ¶ñxêëë{íÚµ 6lß¾½ëý÷œŽóõëWÀˆ#‚‚‚âââŽ9òüùs//¯ .¬_¿¾¼ÝH³¤‚áááK–,‘‘‘ÿ””T«¿g(tŽ?~êÔ©´´4}}ýåË—»ººÊËËw}VÛ·oŠŠŠ]¾|9‘H ·¶¶ŽˆˆèzÏÿPè¬]»VZZúÒ¥K/^¼xñâ…††ÆöíÛ0¿’TÊ©E‹=Ú××7,,,""ÂÄÄdïÞ½#GŽìÑ¡|G=zô… ÜÝÝ£¢¢®]»´|ùòµk× £’ B¡3gÎ@\\œ‹‹Ë™3gœ­­­[f=åp8bbb>|ðððPTT<}ú´ŒŒ àÙ³gëׯ?wî‚ bbbí ¯¯_¿vuue³ÙºººvvvA~ýúUUU¥  Àf³»ËŸÓÉ^***”””~ýúehhXUUE&““’’¦L™RXX8iÒ$___---X×499yòäÉx<>...22REEe÷îÝÖÖÖT*‹ÅÂ6üß”““óôôä Áår===_¿~½~ýú… Ž=šH$š››>|XSS³¤¤„Édr8F£ÑZd]]]WV»4ÊÊÊ{öìÙ³gOTTÔ… ‚‚‚xKézèÆzøðáéÓ§ïÞ½"""ÂËÔÄd2™L¦ššƒOÊ?nÀm­‚Á`455=z”žž~øðá'Ožœ;wîêÕ««V­À¥ñ€UD¸\îUK§‡àýžçÌ™“››;iÒ$*•zöìY??¿î»Žö€n,,Ö¬™Læé ¸Q\\ °´´´µµ=~ü¸··÷½{÷ÂÃÃííímmm»8%ccc"‘kcc3lØ055µýû÷———ËÉÉ^¾|yöìÙ>ˆŠŠêêêÚÛÛ7ÍzëÖ­›7oq8yyùY³f¹»»|üø0uêÔÔÔTaaaKKË;vÀ¯—˽råÊíÛ·KKKUTTììì`ٓٳgÿþ]OOïíÛ·t:]CCãðáüפ¶Æúã ;—Ë¥Ñht:Á`4û·ÙG¸€VRRòäÉ“û÷ï¿xñâÙ³g3337nÜèææÖVí‚&L˜pðàAèÆ‚_ ×­àp8ÞFËÍ€ûa³¦mšž _G¥¥¥Oœ8áààpìØ1ÿÐÐÐåË—¯\¹RWÍãõë×Þ7¸¿iºÝô#‚ Íš!Ò¬YiiéñãÇI$l}Ü\.wÊ”)‘‘‘ïÞ½;räÈ“'OnݺuïÞ=˜4O—©§§§ªªêââ’——gee%--=pà@‡Çãq8\Ë–ûq8|ÇÛ?~üÿþý;OHH¨ªªúúúþ÷ß...III;wîôöö>pàÀÚµkya¸ ƒL&¿ÿÞÍÍ pêÔ©±cÇæååÉÈÈp8œyóæ 0ÀÔÔÔßߟL&óÒ ¶ƒ‚‚BpppÓ= FVV¶ÛÓåwRèÈÈÈäççËÉÉ5660 °°pâĉ·oß^²d ¯ ¼O1ÂËË VlñññÍÀÀ@\\¼i€-›ÍÆáp-Mú ðÏY¾|ù½{÷x™¿¹\.ƒÁ`2™ðߦlÚ´iæÌ™£Gf±X0!!«­îd±XïÞ½«¯¯oi5ár¹Ÿ>}â9w˜L¦ #[•••EDDjkkÙl6/Éòòò.ö¯¡¡±dÉ’¤¤¤Ÿ?644„‡‡w±Ãñë×/>½f¸?[5ýX__ÿùógžÉ=44ôàÁƒÐ}š’’I&“999‡ÖÖÖž5kV}}ý³gÏ WÞÆÆ&&&&::úÍ›7ÆÆÆUUUçÏŸ'‘H666WW×;wîLŸ>}Þ¼yo߾ݺuë±cÇ–/_®««øòåË HKKÇÄÄlܸñåË—ðFÙÖXíϰCÔ××/_¾œÃáÐéô–.Ú¤%%%÷îÝkbb2~üx:^TTØÑituuõ‘#G¾y󦲲²²²R#ÂXAƒ9sfß¾} ¥±±188øþýûÇ“'Ošt–YEx>A--­#GŽäææ~úô‰Á`„‡‡ l ÚàÁƒÇŸ——Çb±ÊÊÊÊÊʺØ!\æÌ>šgÏž˜˜¶|ùòïß¿oÞ¼ÙßßÿÁƒ²²²Â¯^½rss+..>yò¤‘‘QUU‚ jjjàwMMM???ssócÇŽééé1Œ–™óšòGÃOwÑI¡Ãáp„„„X,¼'*))åçç›™™:uŠçÐIJJºxñb}}½­­­““‡ÃjÖ0§Ñh¼+**¾}û_^ÛAZZºéG,+,,Ü´âââ#GŽœ:uj'®ÎÌÌ,77·©Ða2™^^^ðmUZZÚÒÒrÅŠW®\@8—Ë…Öiøb±wï^^4;‚«’ IDAT ¯^½JHH8{ö,‚ ¼­n4Û»gÏ Ãf³yµc(ŠƒƒÃìÙ³›¾R÷46667n„ïŽíӉΣ¢¢V­ZÅáp¢££8½«C‡urr277¯ªª€Ð¡Ñh^^^QQQ ‹'N´üÞR©Ôº&ÔÖÖVWW;::âñxøðÎÌÌ<þüÛ·oa{ SUUÕ-‘Ðp-**zúôiøÍ÷ññ‘˜>}:@ZZzÆŒ÷ïß_»v-ømD„H$jhh,^¼Zp I$Rtt´½½=7¶¶¶þþþ›6m*++ Ú¸qãÞ½{gÆ ÞÞÞK–,™6mZ``àµkצL™ÐÐÐppp(--2dH;cµ?ÃŽÂ{y€w‰D$›þ 7 p»   66 ?:;;?zôA‡)S¦Ìš5«+>ùò勳³sQQ4N™2¥©­‚gÃhug3à~جUã‡ÃIKK{òä ü%–——{{{ó3Κ5ËÊÊjÆ ¸jÈôéÓÇŽÛÒþÔÒL-Um™©x͜׬Y#//Û———»»»ÃŸXjjêÁƒ###bbb«W¯¶´´Ô××@ˆÚÚZ77·×¯_c0ssóÅ‹à#Ú¹›m´º?>{öLSSSQQ‘Íf§§§§¤¤@¡Ãd2oܸáééÉ`0`¡1333‰ôìÙ377·¬¬¬ØÙÙa±X‹Õ,Å üï2dHhh¨‘‘‘•••]ff¦††FOÿÿü‘N 7tèЦ{`ıƒƒÃöíÛ¹\®ÏŒ3ÕÕÕëë롳 þ6˜Lfiii3§Ï Aƒx©[…H$îÛ·ïÀYYYm•‡ì.xÁȃæããƒ4Ö®]kbbÒ¾PíF***<˜––†Åb·mÛ¶iÓ¦f51ÄÄĈD"ô5txʇ` y…Bqtt\ºt)pTòÀ›­w/ð‹ _þ äàà°zõjÕO-((pqqùúõ«°°ð©S§ÚŠ y>éªÐIIIÑÖÖ=zô‘#G¢¢¢\\\ ]Ú××wÇŽ3fÌ077ùòåEhllì¦M› Ñ›@ ¸¹¹)**"RQQQUU5xð`hXL {hÑÑÕÕ…ãÇß°aÃŒ3ùwjæ®òððhæ¶ë:Ð¥¢¢âèèhjjÚ/%ÇKJJÚÚÚZ[[wôaÖøqWµ:€#FlÚ´iÕªUÝ;ÿˆˆhŠ¿uë–““Ó‰'V­ZµcÇŽ+VØÚÚ:88,\¸PWWÇçççgeeÙØØlÚ´ ðìÙ³“'OFFFªªª2ŒOŸ>‰ŠŠ65sº»»ggg×ÕÕÅÄĬY³FHHˆB¡x{{§¦¦*++§¤¤dee999„ÿþûpõêU yyy(àò´vÆj† ³xñ⃠ÀšÂ£©»êíÝy}ú4þ|œ¥8{ÿþý¸qþüùó›6mš1cÆ¢E‹pý¡C‡>œ‘‘A&“æÏŸO$¤&Mš$++[VVVRR"""bddäççÇÆÙÙÙýñǽ½½...Û¶mÃ+cbbÔÕÕÏ;wãÆ©S§FFFâ–ª¿ÿþ!”’’"++kee…Ç‹ÊÈÈÀ³}áGƘÕ~üñÇ]»vFSk?XŸ®bD"‘–/_îëë‹[æ¸ßÊ•+]]]Yœ|t3===óæÍ Æõt:ÝÕÕ÷éùf³ë—ÔÕÕoݺuèÐ!yyùC‡ÅÆÆŽ\•m(î^¤¤¤´cÇŽßÿÝÁÁáæÍ›ÒÒÒW®\Y°`ÞF__¿¨¨è·ß~£R©‹-:uêT[[Jˆ™ÏÚ]Y™\øL__ß‚ \\\ØòŸÌ‚t†;~ެÿ%1œt#SSSÜÙv”\½zõ³5{÷îÝ»w/^¶±±±±±ùê-ZÔÿP1^^^ÑÑÑŸ­äååuwwwwwÿl}AA㟟Í.×Ͼú©! ±xÌ!v¥«­Y³fhݽÇ"yyùíÛ·³r¬IW1òóóÃ5|Vööv!!¡îîî!Ÿc3fÌÈÏÏ aû’ƒ t>|¨££3iÒ¤ÀÀÀøøx<ô8¿XZZšˆr0ssóóçÏ{yyÉÊÊš™™={V]]½··—õS: VZZËíŒX®£møé*FlÌjÍ•+Wð±'&&:::²f )vaqÁÆt#®of#–¥«Ã3"‘HóæÍ;sæL}}ýp~ãV"V>ÀûUýñ,íÒÒÒ~~~‡VPP8}úôÂ… ét:³®3K—.íîîvpp˜8q¢••B;;;?DZØå°&]FÕˆ¤«Æ4"væÌ---îtX‰½é*À¬LWõ÷?™6mš¼¼ü0G`çåå½~ýzGGÇܹsþ<ãˆh ÓÖÖÖÑÑ¡   &&†‡díîîþf“3OåíííïïÿêÕ«á`ÊMX–®£g¤ÒUcÚ—¹00Lœ®£Šõéªþáf¤ÔÔÔ¶¶¶á4H÷ööòððXXXÄÄݲóÜ—èðòòŠˆˆlÚ´é·ß~ÏÍ͵µµà{‰1‹ŠŠlll?~|ìØ1ÜD4ÔjsHWq‘MW@àt=lIW PÿÝj¿ ?É›ššºlÙ²¿ÿþOoÎý@ùøøÈdò¡C‡ž>}*..>ð(Ãc&N™2¥´´ÔÖÖöõë×ÕÕÕ¦¦¦ƒ¯0Wt€t%®âzœ“®%=Z¾|ù?ÿüÃÆ( 0й|ù²Ý§OŸDEE‡3?í„ ËÊÊššš8aXhö‚t€t ®âzœ–®%¸ò÷ßÏÞj (Ð133ËÍÍ=qâDzzú0÷×ÕÕ%...''Ç‚ùA8¤«¸¤«À(t×ãätWЇ+..ÎÏÏ¿xñâa½½§§'66ÖÛÛ›°Ù ÒU\ÒU`”@ºŠëq}ºŠ (Ð)..ÆOÃã§Î†¼3AAÁ¤¤¤;vlÙ²Ï>䢯(HWqHWÑé*®7NÒUh ©«ÿn=¼æµÚÚZ;;;SSS.žY‰™„„HWu§OŸ®¯¯G®#êùóçG…tknnÞºuë_ýé*Öcé=eÊ”žž…îînnJ]577¿zõªÿmètú±cÇ ]űZ[[‰©¾êÞ½{¡úúzHW£Óé]]]ýlÐÛÛ‹JNNFAºjŒêîîÆ3@þŠñ<'®b VG”\榦¦¦¦~s3HWq²ŽŽŽsçÎ}s3HWA©ªªà] ÒUc×Ç[t»paØÁJŠŠŠÙRIIiÏž=£]%0X¢¢¢_N?ùUd2yÍš5œ¬÷ôô466²»c[OOψ—I"‘²¥  `LLÌÒ¥KG¼`´ñññ °³©£££——×8ì³Á 8ë’=æ¬]»–»'òíéé¹ÿþ¨î¢¡¡aTËÿ&AAÁ 6°·CÆÇÇW[[ûóÏ?³»"cވǯZZZoß¾Ù2§ùóÏ?Ù]ðmè€þ477CgNfddôìÙ3v×€ÿñöíÛáGÒ?¶ÿ@c:àëxyyYÙh˜sä8Gww÷“'OØ] þ ðu’’’üñ»kKJJJX¶;èØ #ƒŸŸ_GG‡ÝµàÀh.àZè€kA ®¸ÓÎÈÁÁÁ4ÍÔÔ”D"õööR(QQQVÖìKaaa!!!Cx#NOOO?}út]]Ýĉåää”””(ʈ×pપª6lØŸŸÿåœ_zzz«V­Ú¶m ªvíÚµ™3gâo9$$DDD„ûíGtt´¿¿ÿðËÑÓÓ«­­ÅËBBBsæÌÙ·oßäÉ“‡_òpTVVÚÙÙ=xð`€£©N6NÎ1¼J€QÅwÿabèP(”ÞÞÞ={ö „Þ¾}ʺz}MkkëÐÞxðàÁ'N899iii={öìäÉ“l¿Í466¾ÿ¾££ãË@'44”e³ú…„„ôõõíܹ!ÔÐÐpðàÁÀÀ@Öìš™¶¶¶)ÇËËËÏÏ/!!AHH¨¡¡áÀk×®¥Ñh#Rø544444´··³ý Ã7NÎ1¼J€QÅwÿaÐãåòòòÄí§­­-<<¼µµÏÈ&))‰_ŠˆˆxõêN{ò䉆††´´ôÍ›7Ïž=ÛÖÖôæÍ›³gÏö_Naaaff&_oooWWב#Gðö---!2™&..>Êúô)99ÙßßðûÓO?IHH¼ÿ!ÔÔÔ}íÚ5%K–lÞ¼™ÏÚÚúíÛ·åååÒÒÒ–––!fëûúúNœ8qöìÙwïÞM™2ÅÞÞ~ÕªUx׸ü?ÿü³½½]AA¡µµ5++K\\|Ñ¢EÕÕÕ!SSS„’’Rvv6B¨¾¾þ—_~iooG•––Atÿõ|ðà_vvöÂ… ò0#++‹wjooŽŽnkkÃßNpp01K×þýû_¿~M§ÓEEEŸ={6mÚ4))©þùçøñãííí»víª¯¯?~üxÿå_ºt ËÝÝÝû÷ïÇÛïܹ³¨¨ˆø–ƒƒƒÅÄĆv8xÞMkkk|žLœ8qÍš5|||8vìX}}½ŠŠÊºuëÜÜÜð[}}}óóóyxxtttnÞ¼)))™˜˜¸råÊžžžššš„„„ˆˆ:^SS#**ʬ„PxxøÉ“'ß½{'##ÃÃÃsïÞ=ccã§OŸ"„TTTBS§N½sçÎÐŽp‚qxŽ ä*ñÕÿî]»v={öLCC£©©‰‡‡G^^ÞÛÛ›D"ᢨTj]]BHQQÑËË‹8À{÷î)((477oÚ´ÉÐÐYùýÔg @ÈÝÿ«wíÀÀÀÊÊJmmí?òððLš4)00øÆ£¢¢^¾|‰RRR À+wìØqûöí)S¦L˜0¡©©ÉËË ZË,*è'ùÌ€sçÎSW8pÀÏÏOJJ !ÔØØ¶oß>„ÐñãÇŒŒ‚‚‚Byyy%%%çÏŸÇG‹¢R©Œ¿˜•“‘‘?ŽÄÄDbû¨¨¨ÀÀ@cJuuuWW—••±†D|||êëëýýýÛÚÚâããÛÚÚ]]]wïÞ- @¡PŠŠŠBBBæÍ›G&“™­§R©999Ë—/—––~ñâE\\™Lvpp@yzz¾{÷ÎËËKDD$//ïÏ?ÿüô铸¸xddäõë×ãââ"""eeeq}dddbbb***<Èxý×ÓÑѱ°°ÐÝÝÝÖÖv83Æ]¼x‘hu?räÈ–-[ðIóáÇèèhüOžššj``àããƒ*(((++KIIAíÚµ !$((¸gϼÜ9.\ˆ‰‰Áßrrr2±ý®]»víÚ…;ŽˆÿýO×¥ªª* š‘‘±nÝ:™ªªª°°02™¼qãF„ÐêÕ«_½zÕÔÔ‰ë?{öìàà`|PÎÎÎd29<<!´{÷nfåCIÂ@îþ_½kïÙ³gΜ9fffÖÖÖ¡¼¼¼S§N999!„’““uuuq|“››{òäÉ5kÖ „ÂÃ×.]¬¢¢ÒÝÝíéé‰fQ³ú|©¿@§ººÚÛÛû?ÿù¹¹9qïÉÎÎfœ©®®®ŽN§“H¤G¹¸¸à•666YYYý|ÌÊY²dÉêÕ«edd´´´ð4LÝÝÝ¡/OŽêêê;wîàÿ1¼Attt@@€²²2B(&&FLLlâĉ999mmm"""ÌÖgffþûï¿qqqDÉ999ÏŸ?¿wïQ¾¹¹yBB¾îhjj~úô !dffƘû$“ɳgÏþlÆãoÖóÖ­[ÏŸ?¿qãFkkëÚ?^¼xôðáCSSSâ7A^^^}}=± nÂ!‘H•••D˜hii‰¢úÁ¬œ… ºººNœ8Q]]_øF‰žž^˜4iRzz:B(99¹©© ßH°ŒŒŒ7>~ü¸¬¬,''gÖ¬Y!~~þÀÀ@cccb* YYÙ™3gâefå „äååÅÅÅãââ´´´LLL"##…„„BºººÍÍ͈¡ pñpŽ ê*Áì¿[SS“øÓÒÒ’øET^^ND$VVVŒ¿s¦M›¦¤¤„âãã#‡YùÌê3؃mmmåî$@yy9Ï_ýeggÇìCÔÝŸÙ][[[›øÓÆÆ†hé¸ÿ>‘ØÚÚ-:!uuuÜÉø3+ŸY}¾<œþUUÕ={öàöƒ¦¦&Ü 8uêÔØØØ~Þ5@Ìʱ¶¶¶¶¶niiyðàARR’²²2þÇ2%%%2™ü×_ÙØØ0®ïêêBQ…  `oo/NÇ2~XÄʯ®§ÓésæÌaœÃ_q:::BDä!,,ŒBkhõ8eeå;w¶··‡††677ãsKEE%""b¥}†Y9­­­)))S¦Lqvvþî¾”––ÆÇÇwðàÁ’’’šš]]]:>þ|OOObaaa„Pgg'Bˆhëþf£7³rðK/^,..®¨¨¸rå F»uëÖ.¸`LçØ ®Ìþ»?«^__ßÐ*ìü‘ºjÕÕÕqw€B¡ÄÄÄP©Ô°°0fI€AÝý™ÝµGêgVþÀ£‘o?^.$$„ øOeeå¯ö¶ÓÖÖ&¦FÊËË{þü9^îééÁ /_¾¬©©!¶gVNTTBHDDdÖ¬Y;vìxôèñîº1X222ŽŽŽ!!!±±±4íòåËÞÞÞ~~~êêêÞÞÞçÏŸOII‰ŒŒüùçŸyxxð\зoߦÓéø‘ŠÊÊJ„³õ‹/.---,,¬¯¯¿sçNttôáÇBšššJJJ¾¾¾™™™W¯^MMM]¸paNN®€ÒÒÒΟ?¿iÓ&33³wïÞ={öìÚµkwïÞE—––öõõ ¤ž¸›öLJðù`‚‚‚AAA¸-!4eÊ”ÂÂÂ/7ÓÐиví^.((À?2÷\WW‡3¯ý—C¥RBÂÂÂ3fÌð÷÷ÇŸ$6´oùKxNÁ––uuõsçÎÙÛÛ»ºº®Zµª  àÊ•+¯_¿¾qãÆöíÛñQëêêjii9;;Ÿ>}:!!'a1ü;)---))i÷îÝ¡ššfå „lmmíííùùù­¬¬f̘¯›ø%|½8zôèÉ“'—-[¦¦¦6" Øb¼c¼J0ûﮪªb¼zhiiáe]]Ý«W¯âåÂÂBb=3ÌÊgVŸÁÂW3fI€èèè%K–¬ZµÊËË+33³¯¯h\·µµ]¶lYKK îÔÂl}fff}}}\\\hhèñãÇÛÚÚð}'öîÝ»|ùòŸþ9""ÂÅÅ…H „ÌÌÌ,,,¦OŸŽ«„“8£7¨zâž7ß¼ØðîÏì®ýìÙ3ƨ€¨¶Ann.^¦ÑhÄzf˜•Ϭ>_êïñò‚‚‚ÜÁÇÈÈÈÅÅ%:::44”B¡dee ‰‹‹«©©áhwíÚµ{öì¹té‰DRVV&ZbMLLÜÜÜøøøššš^½z¥  €bV΋/¶mÛÖÙÙI"‘º»»Ÿ4¶µµÝ¸q£˜˜˜¦¦&e“ŸŸŸ‚‚ÂùóçSSS'L˜`llìîîN"‘âã㣢¢¢££ùùùíììp’w¤õ÷÷?wî\jj*BhûöíùùùÌÖoݺUHHèÂ… iiiÚÚÚ¸Á“‡‡'111:::&&¦­­MZZzΜ9sæÌÁUÒÐÐpvv>~üxoo¯¶¶¶Ïĉœœ^¿~7 ÈÊÊRTT쿞¾¾¾8àpss{ðàÁ?,,,¬¨¨ˆB¡àŽ{†††îîî»wï Œ‰‰ÉÎÎSUUµ··G9::ÆÆÆæææ’H¤)S¦ÿ`FFF>>>¼¼¼¸Ûà›7oðläÌÊ©­­ %¾eÆß¬óçÏ÷òòTWWÇÛaÇøøx*•Z[[»uëÖÛ·o §¦¦=zTJJJ__ÿ8 “É™™™~~~¾¾¾¢¢¢ÆÆÆùùù¸(}}}77·ÐÐОžܬèС¯–ƒš4iÒ§OŸ¶oߎúî»ïŽ;F4ÈMŸ>ÝÃÃJ¥ööö0ögcÎ89Ç{•`ößmhhX^^ŽïpŠŠŠÄú•+WR©Ôüü|‰Ä¸>44´¸¸¸¬¬ÌÄÄ„B¡ã¦få3«Ï`Mžpà@IIÉO?ýÄø¼‹A‹Î¨zñâÅ‘#GÊÊÊ,,,vìØÁÊ]³€®®.ÕCRRòÑ£GŸ=Àð·s ¯lbb²iÓ&ü gÂ-:ªªªì®Èèòðððóóëç©«áÃÃ+Ïž=ÛËË gcÙeTZtTUU‰œ·RVVþí·ßØ]‹Ñ2Ø®N Öx;ÇBBB†6£( {‡Xd“z€kA ®¸:àZè€k±4СR©xºZ0N>|xݺuì®`l€+ÆxÀúH€i ó믿Θ1Oæ|H"‘:::Ö¯_?cÆ ¼>**ª¶¶–ŸŸ_GGç›åÔÔÔDFFR( [[[KKK„Paaaff&_oooWW׈OÎÅŒ¡¡!žÌÖÌÌ Ï0Œ²¶¶~ûö­Ayy¹´´t`` ®¤¥¥å»wï~üñÇû÷ïwvv*++;;;/^¼øÖ­[®®®½½½¥¥¥§OŸŽ§Ó饥¥¢¢¢‹-ÂSrššš"„”””²³³YshƒõáÃaaaÆ5T*¨ˆG'Ö¿zõŠŸŸ_SS“X¹|ùrQQј˜ ‰_ýµ¨¨èÂ… ÄÉÃJ&&&ø;µ¶¶&¦š>}ú«W¯ŒïÞ½+##¹páB„––ÖÛ·o-,,nÞ¼ÙÙÙ©¦¦æáá±jÕª’’’%K–ôôôÔÔÔ$$$DDDÐét>>Ä홪ªª 6äççó÷íH•3Xc+è/Щ®®öööÆËoÞ¼Á ðóó“’’B566†……íÛ·¿äêêJ¼×××^JJŠþçÏËËËÈÈ远¨¨¨¥K—ÆÄÄìß¿Ÿ,BñññxæÕÄÄÄÛèquuݽ{·€€…B)** ™7o™Lvuu¥P(ÿùÏÖ¯_¯¨¨xÿþý]»v}øðaÕªU[¶l‰E-[¶ŒL&ÇÅÅá¢"##¯_¿!(((++ËÖ#ûŠ/^uuu'$$ëÏœ9£££ƒ¯VW¯^MKKÃ3¶¤§§ëêêâõ.\ÀÛ8p %%EBB!dmmýã?rÔ5ËÏÏÏÇÇGPPð÷ßÏËËsww·µµåááñóóóóó»}û¶ŠŠÊ­[·¼½½ß½{·yóæàà`<5´³³3™L&ÒšIII4-<< \ ô訪ª­Žx!;;ûíÛ·Ä6uuut:D"õõõýþûï=âåå¥ÓéÄLcNNNxÙÆÆ&++«ÿrB***ÄGFX²dÉêÕ«edd´´´¬­­xx£g‘cbbÄÄÄ&Nœ˜““ÓÖÖ&""2uêT„Ptt4nž±±±‘––NHHX»v­®®.~ïĉ ˆ¢455?}ú„þ·Åˆ£(++ã†è®®®­[·îÞ½Ÿ”åååÄßVVVļÄ?&:šYZZ TòòòMMMÅÅÅøŒç¸=öĉrrrçÎkmmÃm¶ÇŽÿ'–.]*++»wï^OOO###ü^YYÙ™3gEéêê677£ÿm1ã“€€À Î.8߯ɃÐÙÙ·yóæM›6!„lll|||öíÛçíí=¨†|ŽMpA$0èÔÕÔ©SqËÄg(ÊܹsÝÝÝñŸÄÇ1ØrB_M3[[[[[[·´´MÜÓÓÓøá‡¡ýÎæŽóm<\1BÏž=kmm]´h±æ—_~ñööÖÖÖTCþØJŒ­H`Ð§Ž²²2Fû2’jhhÀA%B¨¢¢‡™!mmí?þøcþüù¡¼¼¼Ç÷_3QQQ"""³fÍ244ܾ}û`k>4wïÞ½{÷.B¨¸¸wF–““ÃÝÎoß¾=wîÜÚÚZ„Pee%ÑPéîîîâ⢠ ððáÃÔÔÔ•+WòòòŠˆˆ „.]ºÄËË‹ƒîºº:ܵYLL !”––&--M£Ñ***Š‹‹YstƒU^^N|eºººW¯^µ²²BÝ´555¯]»6oÞ<„PAAAee%ñv}}ýS§N‰‹‹ãî/ìRVVVVV†¢Ñh¸3òäÉ“ñã!¥¥¥¶¶¶øì}øð!Ñ“tÅŠ[¶lQVV¾wïÞáÇ7lØÀÇLJ[àÒÒÒxyyÓÓÓB555¸k3no?zô¨ŒŒÌÅ‹ïÝ»÷üùs6.`   ¦¦&##£Ë—/çääà,̠Γ¨¨(ÄEçw\1†F@@`P ùc+!0¶"¦N@@Àµkמ>¾±±QMM-,,lýúõ!}}}77·ÐÐОžÜ4>>wŽ›>}º‡‡•Jííí500À]+wsuuŠMJJÒÑÑÉÊÊÂWüA'øGùØ=߸òŠÑ¿iÓ¦ _¼x§®B—/_ž>}úК 8-!À‘ !äêêʲ‡˜XÆÜÜÜÞÞÞÜÜœ•;½uëÖúõëqö”e;-(((,,Ž ‰Ä¡YÏ1ªªª !T\\¬¤¤D46FgÏž%~÷Œ x¤,¦ªªJô`”Àùö™1qÅpttLJJJOOWWWOHHÀßÝ ò¥¥¥w%8´èŒ$<¾BH\\¼°°5Œ•°°°¶¶¶ÒÒRGGGοrðø:!IIÉdz}@6ÀÝà|#°åŠ1´ÁÊ„´è€¡£Ñhì®ç aw†¢¼¼œÝUãœo„1zÅ2HŒt6KJJB±2!0N@ °$FÓÙËÆ:tÀµ Ðׂ@\ ÿ²±±ÑûžF!¤§§ɸ}CCÃÌ™3?Û «ªª²°°èîîf]íÁ×èééI~Ï󌒔”ÄÕÞ¼y£  ðÙfXee¥††FWWëjÆ8Çà|¬ töïßϲ} ‹‹ B("""66666vË–-Œ¯†††~6¯ŒŒLll¬‡‡Ç—E566¾ÿ¾££cT+ ¾ÉËË !”pêÔ©S§NíØ±ƒñU*•ºlÙ2Æ5òòò§N þ²¨††††††öööQ­0sà`PØ °.Щ¯¯gÙ¾†Ïkhh8iÒ$ …bkk«¯¯/$$T__?sæÌÐÐÐÕ«W3¶ÜH$<{êgå,Z´ÏÀgjjª§§‡'Ýíëë;vì˜Í?ü°xñb<(ƒ›…’““­­­üñÇ´´4üR\\ÜܹsõôôæÎkii ?õKCC!dbb¢¨¨èëë»lÙ²3f ¿~ýZAAÁËËkþüùŒ¿ªI$Ò¼yóLLL>+ÇØØ!ª¢¢"))‰§©ïëë‹ÕÓÓ“““›9s&ãØâ!!!ø'ûÁƒ§OŸ®¤¤tôèQüRxx¸ººº¤¤¤ººº––Vggçh`TÁ96nA`hØ À8:ÿÃÆÆ/ˆ‹‹§¤¤ „dddbbb***<8"##¯_¿!((ˆç"¦R©999Ë—/—––~ñâE\\™Lvpp@­^½ZLL,...&&fáÂ…RRR¹¹¹+W®|üøqbb¢›››ššÚ¥K—nÞ¼ÙÛÛ;jÇÍÍôôôð‚¤¤$©B^^>99ùÞ½{ e %$%%Ñh´ððð„„!!!yyy„ÐîÝ»322Ö­['##SUUF&“7n܈Ú¼y³„„DxxxHHÈòåËedd2337lØðàÁƒ˜˜MMÍ3gÎ\¿~¾SîçØ8äââB¡Pðu!ôüùó¸¸8âÕÐÐÐiÓ¦1n“<øòVB$`ÀQ2êÎŽ;ZZZB¥¥¥ÞÞÞüüü‘‘‘$i´÷;4qqqoß¾ˆˆ N82™<{öl– ©©‰£u333bÊ’ÌÌÌÿý—ñß '':rrr!??¿5kÖÈÊÊŠŠŠž8qbÚ´i†††øß VZZZ]]]@@1m™L¶²²š0aÂKÐÕÕÅ?Ê­­­‰9¥“““›ššÂÃÉÍ222ðMhòäÉ3gÎD…‡‡»»»ÈËË‹‹‹ÇÅÅiii™˜˜DFF Ä!6ƒsl"’ÍÍÍÉÉÉÅÅÅ8 ðË/¿à$ãÄU8 ÀËûù=wÑ¢EÕÕÕ!SSS„’’Rvvv__߉'Ξ=ûîÝ»)S¦ØÛÛó·ÇÄÄ$''#„|}}SSS[ZZ<==W®\‰Š‹‹ËÌÌüðე”Onn.çÌ•ÆÞH`Ôâ¿400pÏž=£½»aúþûï……… ~…:>gΜµk×k¾¼ú,Y²ä³·=zôï¿ÿ~úôiaaaqqñåË—96@äd&&&¢¢¢&&&#)Òéôùóç{zzk„……?ÛfõêÕŸ½åâÅ‹ÅÅÅW®\¡Ñh·nÝ‚ï” À96nA`€Ø @ê꿈 Õ„„„´´´ˆõÏž=«­­}úô)~UBBbÖ¬Yd2ùùóç/_¾ür=BHLL !”––&--M£Ñ***LMMi4š’’’ŽŽN]]]aa¡œœnà)//¿{÷.±ëï¾ûNQQ!äììÜÒÒ²qãÆÙ³g÷ôôtuu ¼a „ž///##oŸ˜˜˜””$))‰Z°`™™D9çãüH`Xã訪ªÆÆÆÆÇÇ?xð >>¾±±¯¿ÿ¾­­-^¶µµ-//ÇËÖÖÖxÙÆÆFII /Ož<ùãÇ¡ÂÂBâ½àdœ ŒÌ€üüü+W®,--r «W¯>}útgg§°°0//<ôŒ% ŒØÈÈ÷ïßWSSÃ˹¹¹x™F£}°µµµÿøã¼œ——÷øñcâíßÿý?ÿüsåÊ•%K–ŒT•À2œ ëñò‚‚ooo„Pww·ššÑ«hÍš5QQQW®\!‘HJJJþþþx½““SDDÄ¥K—H$’¼¼¼¬¬ì<==ñ«–––YYYK—.Þ€ÆD$0¬ÇË7nÜÈìUÆþÕŒ‚‚‚˜½åûï¿ojjr}ÀJc"à I=O:eooÏîZ€=F#àˆn¿ÁÁÁ­­­EEE"""^^^ì®Xjô"Žt( »«¶½H€ƒRW# p-tÀµ Ðׂ@\ p-Žx¼|”äää<|øÝµ8È‹/Ø]–âÚ@gÓ¦M•••ì®ÀY\\\444Ø] ÖáÚ@ÇÁÁÝU›Ap-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@`¬ùÙ 'Ö®“ŸIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_all.dia0000644€ÿÿÿÿ00010010000001313211727205032022651 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ{•4-û!X¡mR·&ײY±?—,ízdÌšüº4Ùt°ëM¼ûËÐ7 Ô… ;烡²¦LSÐØ¡£"ܶ'jÛŒ~øñEüuvq¹:øu2]ám½±A)b}³ žhá]¡Ì!BÖ“†îyl0à.»pk¡ðñ¾ ÉÅÿ^ËÕÁß/WGvƒ#’™„H sž6BóB‰Fd %ÚŠ˜šøØý9 <ø­ñ¾ü×Áûùøj÷X² %/Eî‰eÆVéÞL )$gDŒ¼iJÔ8«¤d ÀPQЗ&JëÜ¡])Ù×ÙºÔ kFV”éœ ©©'î ‚5;9$"FXKéßÿÞ«8Jv€vgºTÈhÆÎŒ+è£ ›²Ê ‚PAiÃX‘1%µN©2Jªž­ÛvFk~2SÇg}­=.5­kí{9™yÒÑÂõé€ßMÒô‘üÒ)*‡‘ÆoòŸ²6R=LŒv¨¬°Þ¥:%åÏý«f³b)~0p.-µNïB{Ûƒp(Kµ‹ü¢‘PJy (/ÔzO„Q4<¿hT1Y™šƒ–î·`¸RQyÓ­Pš·ò)¡Ýô¨‡eQ])øS«Ù¬/¿Å•jß6/%w´{ù> © =5°”ÙŽRt"$ƒ+ÅÐz­´5[°£ªØ¬C\¸w6”Ù‘†>¤P¡™‹„TV3›óNiêºmôk4Ô‰²³n bXÉg½ÒÊ}“ø#9Œ}È¡F“Z)ƒôÌr¬K”dk8ê\*uÛ1O’ÃJ>jt÷ínäPË>äÐNÈ-à!"’D‚CoðPn +ù¬—C¹‡xv$‡Ý ƒpמ¼t¬^J GA§Ø†!)T–:¤{=S—ÕõLÒB‚‘{ìÁjèÁƒ5u×¥›fx=Xm•X–Vn•€ß#Ù`÷jÙ¬íB¼wÛ¤c†§šÓEÝù€\GoÌ€ª‹œäŒ¯]S¡#Râ6äð ¤ìÚSÞæQãoŸ>}<ü½øZL_cB{ë†ZI| ‰òÙ$jÓƒ…“Ø´ˆš÷ 1Åâ èq•ñ/@‡ü{ù-œj.šü]ëÉO»ÛËôŽLíÎ'ExÛÓKªÅãÍÇCJƤîhd«!nbÑšTÏï­W̲XËhEfn²2¦¥Ê:•‹ 7Rel¼ûìņ-)¶‹f»Ý4ÐÝ'­øu—ž.E²ÍÂ7Ñ:¤>|Þ©!P§Ì²jØ)în@µ\V,¥Žó²cG„\5¼¯UÃõç P 0£@wÚýhÕ1—üa®Kþh:Üj{˜;Eëôñ}\m@‰ê@Œ4ùòÁ›úýŸ'ÓicOÏgÑ¥ø¡{•vz›QÞ3q*ƒ‘OºÓÉÅñ—ùbòÜÒFÓ™û<š.‹dÑV“Óˆôd‹uNìBñcîGÍtvL±²°1[b[³Ä61›bœÀa:gâH^Øx£~øpé_ûÒj¡ÄÜia"3~ô„&ËÓ9‚ÇLJͪà£sê·òqRÃæ¼P¢ žHI£`H^Oª£ÔfÉ:¨©6›¸ršŠ‰ÎXc|†s~šÁ;ŠlYíµQ.¶žøJ]¹Ïé‘]¹×ãÊ=ލÝ;J€p3†·–u4‚2P£{ê‚å¬,ÏÇhN íÈ]FÐŒ A_H0¬&=ÁtN›µÂʸ>¸oVÓH-:¶”ÒdRSRC‡ )A;Ó¨–ÏŽ"R‚BÎOx]ù ®CWs8ºš¸:)ÐT@ÜY"Lß g‹Ñ ýö D0=Œ.Çô€PÌuL J ) “ÂÉä¤*Ûé °É4áîL6;n >D¯ÖÒzZçå5›YÚ±Wjazf ëù¨O‚VÛCŸUP^4Ì}VÄ4Bý¬²Ïª³*A+hÖLŽ^˜ÌК¡5CëëÖîsö®ËCРSm«Ä›X)SM!¥¡¥ñz’ä”±Ž5"Ø“Z3´fh}!qÁÿž"õeehÐ÷ЯÒF :f+"oÇJk%c‘Ò¤°VEjÂMÛ"ĆÖjL6T'¢Œ–ÎY Zi¥œêi|”W!¶¥LfxóŽ7SDî!Pñ™ž[·ºwš»®DKA ÈÛ•>wéŠC>Àu¤+²Fºú`2Û ÙfÈ6Ã>Û MJ•L÷ž‰×t†õìÀ¢VR¢Í”ªSÓkDT­xK•za2—*åR¥Œ¨/;;Ãv®8ˆÔVC§T„FpRï×”›¡µR  åfhÃ=r¾ŽËÎp¥Ö>çf¼ªÜ ºôް»é c»7^µåÜ„N#TšÅa’ ©ñª³a 'Uš*c,ÿT™:>+{˜ýXÚzb 43Ðd½ûÐ|{zË,Ûåj´X=iºóµ·j·‰ök=aô€Žšû¥–òŠ+À‚¥Þ€Ö$¬Peå|àÇŠj>«û:C½ÁH•¡"CÅ‹€ ÝT¬÷Pî©S0Ñ‘æ D fXši|¾ÜRT²YÙîÔPTžæ @[s'CE†Šg¦¨€my àe9 GÑH&)¬²É õ°šy „A•³p¬ÉP‘¡âE@…Ý/¨ˆ.¦ém^•VXSZÚ<+¨ÐQ–cåd6+2V¼¬p}6ùƒѸ4ÉÓëdV(uŠ·× z Ê9¨m³‚2Pd xf@áû ØZ¨"õ. ¨ˆA é$D9 ÊV€š…*h–v P7U¶)2T¼ ¨{vÓèAb$¨° ËP{;‹§œDa¢Tô9Mô)2Rì):ò 6àRì—øã".ØǺ\|‚%h›­Ú —‹(éèsÄ|0›ée˜0®sÒ§òBê²È×°ÿSNÄ RÄ4g‡D8úT¥ØS8jج^i|rÂBô{3ñý:mQA‡–R›;žë{Ç«¯ u}d.†hiΩ² ï¦|š¨ªÀAÊ\THq`èðx+Hû`²I9õS©•J°‚¨YëëZÆNæ‹q±`Ø=ûà tŽ>ÍêELò¼ð¬ˆ’ÿç žcIÙµ§¼ÍÑÿMVyÂ8CÛÿZÌzóéUy×=ïΠCÝ€´Ùðz‚ZPzà„5š"TIF…—4­)_à½9~ܸ«c²r©l¾Ôàö‡ ù¶çèÏ£NÇml~‘½Nç©{Ô˜îégQx¥ ~íÆËÀjFF0ˆD RJ?óÑ£l¢"YV…©ã±r©k¾4F§ñó[Z·9Í*³m•±=ôî‰Ê“h½áÝde7 6@›Œö*eZè¶„ªLÕKƒii¼k0U,õ^Z*eÛ HV™­«Lçl$ÊÔˆýdd ƒÅ»Ë8Š|'sƤl¤ ¤%‘£.Aœ:SËduÚbó¥¸]&|.ëÌ3Ò™º@HI9(n@Õû Yõ=ýB  ¸ÖDÛ „üöéÓǃëA‰®N§E‹p„Eê$2‡Ez’÷óïUHÒ9gÇQÒkŒÔv@Ь“™eŒkJÊëÔ=õ9ÁØyÖi^½0Ùä˜À£Ýêøh,Héœ~]çÝZYŽOéù,Ú8õ£œ±åT–ŒUÜt «YLÊ)×”¨ö”ÓU„wÑ3+gw&³rfå|šî»çŠÅcÌ@Q œdMùAIRF‘^ƒ°í)oÓ?üp“eñ{ñµ˜fœÃ¯È—`ƒËÝÛàuH¢zûv`'†”4´°vi…ççËÕÅh¼öÞwa4Þ¼ŸOÇ/9*0c+f@˜a¦U[KûÀñÂR¡¼«!8Áàöàà=—bñq´X‹Œœèq_3r°"‡íÃÁ/ ¸#.5 ¤‡:܃°Ç/§§Å2;.¼ǦôeÄ`E ד­aØ£DE§`‡¡˜¥ÖîA¬ã—ËÕ—b–1ƒÛÌ09Ö±=Ðð}˜” ÏíŸ8ʾ%ÿD Ê™p{áŸdü'#«•±)|0X#ôžržÀò†§l§tž’R¬‚݃Ó¼ZF N´¸'y-XÑ"öÅ a´TØ#¹m ¢D•ªA&àˆi ®²5åm¢Ç¯“ï—>xCU¢˜1„CB÷$RH~%¿²‘A¢0dsXgãðÍКæ6±ãegôàL­—€ð|±Cõ€:$Ì×¼à¡ÈÌHÖ‡[ãÇšnÜ ù}~–Áƒ<*¥0£g«ÓÐG3½hBH•ÜF±vö¡šq‰’’‘DJe ³àKÍßë´šÏÊ¥ŽÚÈ£HÇ(ód†¶ÈÏ£ÓÄF{b ì&žJ±'”èÞ1Âà=骼(a¢ñ¥ò•mdµŠÎÜ4ZÜ(QÇg%JŸz³(y¨C‰D—qhªÝin-·4Î!˜ ÉI›†Oð̆‹óÉNñÑ$Dr:¤Nfà ð#R5›•Ki¾Lê›æC^—!i?!Iï’läµ/“Åxû’#"¥ašFxA’÷*µ|°ž’*Ù¬F$kÊV”ÒBF¤ŒH{‰HfGˆäz@¤ BÙtÕ°ÛHÞ—`Sl'X­R7Ÿè·`#UrY H2¤30©•É€”i/Éî|€dO‰oÆyæ@’u!Ò*!’“šN7j›ü@ªæ²:ŒdË&c6‘2"í)"¹!RèÃi3>) õ–´%!£|rÚ‚ttžn•[pڪجD$k)…2.ÛH‘ö‘üŽ)ö€HÒÛr‚/Ç IÒèÔÙmÒÌF©TÊ5ÛmWóY=nFœÐR£CƤŒI{‰Ij7˜{™ˆlø ]Ô¼37­¤S,¤d¤¦Q:€AêE½…‘È•|V,u"JŸÒ„¤Í“ö“ +&•¯§£«bñóAùÿœ-Fç?ü?ƒK>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠWL©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœMÍšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=2‰ ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî—iíA&Œ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("5€PX^gÂ@ÆDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜L Óãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb*L¦þŸ°àË©´Öjë­™¦š£} F®¬À)¬à©Š’ˆi [¬À†˜,à*í´ÔVK§®Ã­ŠÙ§‚D;¤GàùBãŽé­µè¦«îºRbû¯Š}Ê‚E@$%/°C%DšÄ*,è’@¿ÿ<ðdŒÒB °´:d$,¬Ò+­ ‰Â,d ‘ ÈŠ$¾úò;¤¿ üd¹E&¼pÃCžà -3*3ìð粫óÎ<[ë®gð&öi IFÒ‘L@dû€QŽ E2í4ÔCŠ‚‘ 2dÉF D¢|dÎ=dÒK7ýôÉGZµÖ`¤"Çó[õÕCf]$þÙ=÷í÷ß¹2º«¶—}êB’® ‘çæÜ8‘Sdœq+]ƒ±x‘á„­$߉y9;‰ò³`D.9åCöSÊ%ø¹ä, Î8à´×n;¢?w4bòÂdçD~:γùC’°()¶‘œ+^<èl¹‚ñJ¢Æ9Éyüæ·wïý÷ræÎÙî‡}ZO,éнÃ;`H ‘›(MüüôŸ+ &Hf’ ‘n\Bd bHßÜ?ùA~LB™·î—$|`Š(¾ Zð‚[ßfÈg_ùÁSE<ˆT‰W°à"*°a0¦Ò [øÂ‚!€Å*Ná‰þ3`*:P"=@+@A(æ1¤°[ MˆB"ÍÐ…0dÒ²0–±YÝ0‡;ìa‘xÑ#áP‡<ô!œEHƒpŒ£¤AÌp°0¾š£÷ÈÇ>.ŠO@º™IÈBb°Ž—¹#aòhÈF:ò‘;C¤e9FBò’˜Ìä©$YJ Æ’š ¥(G©(NRÆ“å¥ ƒVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜Èìe=JeÊÉ 0ª´”œ¡ˆjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóð':ìEªfJæ™þ‰f¥$0ƒaøóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢Í(C·@ÏQÙ32øô‹>)ÅOšô¤(M©JWÊÒ–ºô¥0­(G™)¸lõi[‚ UIcÊÓžúô§@ ªP‡ºÒ™Ö³¦ï"œeF:©õ©PªT§JÕª&Ô¨E*ДZ¦JÊ©V «XÇJÖ²šU¡XÕG!Ò¾x5R`=«\çJ׺ڵ¨U«VuÇUʼUQq½ëA/QŠö°ˆMìXÓªµ>¦­|ùk¢;ŒXÄ5>àÏ”¢Öøì:ûÙЖb´ÃAhK`ŠQ,ã Ÿþ-)¢ÒR(ö¶¸ÍíO *Ç:²{‘,¢(;ŒüÓ¸þ<…?‘‹\åw¹Çýg:DPäÖV·ØÍ®v5ÊÛÀÒS9q­kÝM@wð§yŸ‹ÞèþSÕ(8p‚¬Àþ68›Ú-ðw¾õ½o@m»ÝøÀWÍkc÷:¾¾NF¸‡"î>{ZZ7 >ï0"‰øT^øçòáÏ`ÁŸÙ Á?A,bÿ“ÀޱŒÜ]W1xƒ– „ 5^÷4Ã>þç„K`‚A(Ôº´3(\ŠSLŸdð„?=`†.™ÂN(ŒgÌå.ß¶Æ—òmc€‹—ªÇòþ-ìPë’Ÿ¶(¨*œ°Œ4Îݲ—÷Ì繂ÙRbV ™ïbfB¡™½k(ŒPëx (. ?Òy7MÖ?W*Љ´] =(Ê~ಙµF ÀàO8€¶˜ý§«CëÔ†–ÏHhlM[XÁª((*±€Ê‚ýu°‡]ìaˆ Sø¬”9MíjÕÓ”5bD]R ЏÖ·¸ÇQlOJÛ‡á6]¼(p“{ÓɰC&‘l Ä7ˆðî~ÿÓÜ’B·aÔ=vÊÝþžq9( ‹2ì¡ nüÀ%81‚Ãö0†'òÁo¹.# ¹ÈþGNò’›üä(O¹ÊWÎò–»œäV(À#%pîä82ÏÂn`*PæHžÁ•_à¡I`)š]V2àãPºÔ§Nõª[ýêXϺַÎõ®{]êoÀo@g^ÊÛñæ o¦vÎóìRs€j1–hl¸ˆGÓÅa…¾ûýàOøÂþðˆO¼âÿw_ˆ dOTÍ Cp¹äOlo;n‰‰6œ hÑ΃\‹• |g¼êWÏúÖ»ÞõŽ—¹‚{köD¢]MjÇTæ5ŸX,,Z`K/F¡>œ>õ¯O¾ò—Ï|ÄÇ~ì³÷.§nZ¸Ü_j÷¼l9ÀþѺ»ÅòpDXQßüò›ÿü°ü¿£oãï²ÊTØÏ~]Ñ ÈE âUÉþþûÿÿ€÷|Ç~aV{“t{b}ÒÔOò—]Ѱ@ÏÀ°È€˜Ë'€ëGSî‡SðÇ€ ¨[20 vs TÅØ‚.¨zèO‘‡;ØIØ+ ¸O"8‚·Õà iQ^¨°‚ø‚H˜„‚ƒÃ0ƒ‡2yƒQyqqyw+œÛ¹zË·~ ¸)¸Îzµ²éàŵ]KV‡ ³‰8‰€ÇðÝpbV`1T[¸Ÿ€~ªÀ€ SžÐwŸ€ž(þ° âŠk‚0¢¨pî €Ÿ©Àð¸ à™, Ä)kæ ¨€ &» `Âи€Æ +`äk¾è«¾ìë¾ðÛw3C½a—=Eðˆ°¾äоï¿ÕK ×›½ÛÛ½Gð½áÛ£zõ£]u­€•­µ;U÷ àþ„e° w1¦0 ]pÃp ØØ°>µ•ÔièwZc ØP~7ê ³ô ~ðwÀüÀ §Àà òPŒ±ð9`@ ÍÙ¯0ºV@[àw ¼jk߀iàø ¼þ0_la<Æe|ÆþiÌ«¢üP²°´ @W4ûÇø€Æj ÅRLÅVŒÅZÌ&¼`(ìW*ã4ux°Ô'ÜÔ´ùÔSÄ-TUA`d ÐAÞã=Ù„2Ù€QÙnqÙt’ÙJþPZ âñ U-ð õß­På<Åäƒâäåm!åsBå`ÎPŽyvµ øð"½æ.%æ‚Bæ~aælæþr¢ætŽP¼\UV † %Ô]ðÙžRv(xÞz¾|'~¾èu ] ÏRŰÀPÅé`é*Õè€òè|éj1épRé¢Pc R•ÐPsÞ­nR¤ž'¦^ÞAnh¾ë(nÌ·Xú˜ ÆÎ]pÎVÁŽGÃ^jÅÞìU³LU† ë õ {À„íÕëxòëxêi¡êoÂê».yðí0UF€`ÝP(nNî2õì4í5í‹TíßvíüP._>UÓ`ðþ„0ìb'u §PññŸñ¿ñßñÿñ ò"?ò¯þ8ÎÉ:¾µ<~ð µ}À!†[MRfàó:¿ó<ßó>ÿó@ôB?ôD_ôFô;Ï ~Þ6%Τâî¢~È'PUó0Óô€Rfðäýõ†×ÛÒúÛ¸·Þ,PnàypbTµ QšOÀõ^övxbádŸ€fö%PVE zQN`Ì[oR]÷Œ_ÞÈôI•ÞžÜ÷~/Pé ö*˜]0- 'µøÏøyí{ƒ”_ùÕP„U‚@QÑ â÷ øuÿùvúÿ>úšXú¦? ^îVOUûЋ ÀÝåù´ö¶_v¸Ï‘ºþoú¤0âaõ•PQXþÀÃÇ?ûÉOÞË/yÿ[_IßnßìѰ¥Ùm`©Ì¾ýݯüK»á<»+¿ûubålOQqÎßjà D˜PáÂaf¾XQâDŠ-^ĘQãFŽ=Jôe@á–`LžD™RåJ–-]¾l) Ð,š5mÞÄ™SçNž={`ÊçP¢E ƒSéR¦MUJ˜ÁPêTªU­^ÅšUëV®V„P¨ëØ®ÞΑM¨ €&´ ^|T.P9íÞÅ›WïÄ#K:X°L£… Î T(bÆq"Y²R¨m-_ÆœYsÖCÀþÛz…Ì‚”9–ù­Å¸/xpñºî^Úµmïí›ädÞ½Ov\¸MÅÆì[¹äÊ¡?‡]j¤_ßJ¤ Dª²PÏ9ããY¹T‚³=IÒYA@ ^Ÿ+‡ Žà‹?gÿ$jø¢Îhá6Œ(7„v[®A§€;.BÊ“°B’s0Cʢ®C?Äêì‰D®æ @³ ‚+"Š1â$’QB‰eÜç"Aâg<9€'+(Ù€?îxœE¬Åž RÀFžm¬X~hQ4²–Há•8ˆA°LÛ<ˆA ×d B ß܉B8áÄþM;QjÎD=÷ô°Tá3+BÐ,š:ž8䙃ž:칟<òÐg~úðç¹6J|œ(.hf‹HJ8¬ˆ& ¢B`¦ ÄL]õBÓ 5ï¼ÓÍ9‡¥INb%¬X;ó ´Yg/Còž­*=6[Smµýß>øÙCŸIñÁÇÓŒ@•(.;&š@@¹êB7®z"BÁ øñ`W}íêu˜_•]SØcá4v`ã’XCf©e¸a«à ‡?Ôx¬"(žq¢&–©1$Ž1¢"¦Z #t#’w"vªØg› b7<ˆò±$›|á¥3öþz£~ÿMØA ®°`¤ƒC¸èž8j©…@©"┓5#äÐ.K¹¢rBÈV0ˆè“"[0A”Ÿ­0GTp±w•G\ù30dàˆ>€V'Žo‚Fü¢¡ÿr:ã—>NiÈkºqß ¾:sgÃñ'g47È tBÃÂO^Àþ΢Cö+GˆÄ™k "d‹²* °þøD;<{U~ ?Gž¢Å-w|¦É-”üyÃ*g~2ÌAÇÄNp%ûk$qnš=úØÆ²°“G?ýŠ–¯~¹Ç¥w,zø‹¢¾}Á®Ï>éˆø€@ôßL7P1ŒæKúþ¨@öÙ¯7ï›bäAŸÔÏNÁ5¨™}œ4؃„6óX ð¸Bõ5ð‚’  3AîÄ‚/\J7¸Ã¶¤¡È_±%ŒcHhÜЖó±Ð‰ûr!Ã…†U|LR¤ÈñЋ˜A‚;ÐŽü  ™ÙÚ0º±\áŒciâåX¦(n±)TÄâO‚’GúiÑŽÑáy• pd¡C‹†QŒ5 h‰ã%y&‘è†q¼£óøx˜+nr7ÄäJyHR.ÄØ@þÒA‰Í` !PRD–HNÒ–y©c(_‚GO⤓›¥.ñþÔÅR“*ǘÈ¿F¼"4%2€bH&ð–×Äe%tIaîR“½,Ê/ùÌn‚a”Æ,¥! ýãZ™IÆR´!\©%6õ©‘\–S%¼gMÄ™Grvóœè<ä)5€P¬â ùPð@KkîÓ¢üÔfš¸éÏ•4 ³( *̃2Ô‹Ñ@8ô×,hfHˆ€òJ„ˆ+fˆÃ)tºSžöÔ§?jP…:T¢Õ¨GE*OÅ‘Q_m”£)ñh@CZő겤&Ý¡iºÐÒìJ¸NÿÒ`tx¢ äÈÊ40°V¶¶Õ­o…k\å:WºÖÕ®wÅk^ߺþLK>Õ%QçTkXÕP^«Dð!€ü!aš™Æ4²™RC.E8,B‰æ×ß|ó£z\ÌgoBXL6³Ù#‚:€b‰Ó2/Pˆ<0—<(,hm17ËY0¶—‚•!iÿhÚÜfnV@Ámö¡Í@€¹¡$„á.z°¹Ø'ŠKÊÝrÖ·ž.…kGânwbÙx`çŒü± ÎÉF†€<Ä¢½¨É)aÞAvׯßÝdx#8Þ-–—¿Ô¢‚5Єi òÔ´1¤ã œJt€“% þ¢Ÿ `> x~–¢A¨g4…ǘ…9`Dþór€ÑüÑœ°ÙX1EÌQçÑÄðC1Ud-cðF3h¢C`ï-ÐŒ">Œ üá°I0p‡{29Cög‘±xdé%ù…K6s‡P¶2T£& @%öú‘„ëTÀ˨‰€8kÍåTsÙü<7_Î…ŽŽRÅŽnØD€öœ‡ÌØa ‘„?Pš˜&Öß¡»™è.zrvà£Q"d+å¸  ¹ÝS`@*õ%f+jÎ{ª&«eèjÈÁÚ~²6vfH”àÄþÐ@ç:dF嘊¤‰X²6ÚšC¶.•MAfþ/ÍÙíƒö¹Û²ù€¥ðj ¬tà0Ç1¼dVy+¨ˆE¾p†7Üá‡xÄ%>qŠWÜâgx™ÓÊuG°ÝH{wõâ-o´()1Pê ƒE,#Pè²AšË ‚VI€»È¸rpb?zÐ…>t¢ÝèGGzÒ•¾t¦7耰¿œÊÛŽÏïã 9óFNò¶AœJâ'Š;ƒ\efpWÈAª‹¶ý"þˆúÆ1Yuø]}`Y·ÜÖ¹ŽÀ€‘È>€RÍ!™qÃ)øòñœín‡¼DàÞWÞþÓ³¢Õ‰Ý…÷Æé}ïc9Pº= &þ@GÐ\@°§"1@í|ä'¿ÍÊ[ó>Ñ<±8ï4Ï~+ËÐÒPæ2OL ×ÀÌL@¯}ô!2{Öª—¿ýMr?¬Ý­÷¾ÏÊ?€ò|'áX±´}éÇžúMµ>Jè.½íÏ©û û>ø¯‚a0tD€°ºŒiÀ«@{øŻеk?÷‹»©ó.ìË>Ú£ ü$?Š?s"&ýÓ“"}Xú†3êX>­`À„¼÷“º 4‰ù{žú£ Œ¿üãÀ©0‚<È êÌ@îÐ O€CAØSA}bA¹û#œ|“û¼A†x xþ/*>²Ø6Ø ÓXÇð +¸ru8ˆ N1B‰„'¸”,‡k€A€2¾$„Àÿ’@ tB Be‘Â)TˆJŠ% ThÌøœ­ˆ†Î)ÀlCˆÈ–?À+H :TCp Ø Œ(‡8Pð HÕ‘½tÁÞêà üà D`DBDªñD ‚ók äëŠô˜¨¬HA‹X+¨º€ù û°ÜcÈx:”1+À úp„ˆ¸´€X¸.á7¹øQ€ˆmìÆ+øFˆHªa÷XÆù¨ˆˆmàt@{ƒEþ€†=xƒX8½ÐÃVdBȉEd¡Aë«E[41ƒQØ Ô° Zx®­P07¬ÆŠf¨9Ðiˆ•&y’(™ ÀèXø+Ø‘! Vœ¨‚ê€8èg˜„xø6€ˆJ(V0RG+ÐIbàIŸ’"9’$Y”„)±Xé‚°­²‚øƒ*y(!É‹ƒtÁ„\š…ŒY¼“‡´ÅËԚ» wભ€(¡«x,0‡Id`€?¸}¸€X±SAUˆñ˜I+Àyà’ÈdL+ˆ‡?8ˆÈb`‡Ë”1j£¦,L¶ÛÌþδ‚Ï Mˆ•ÇsÌTYo¸.€¾© n€àÍd܃dŵ|ÅìsËã€ËeÙ@ˆŒŽdØ ;`giõ²„MRP…W¨HiàsxT9Âô‘€X•v™‹Ù|€ˆ¯3JÌ$>ˆJ£Ì-ȆàrP‡ËTEú´OˆÀÏøTvqe䇈ˆˆ•z“ NÊË@¶Dšâ<˜†¬=¹$Dš DèËh‡HÔ #ømÑzXz OòPy™˜™ö€ €ˆVÈ۔ψȈ¸\ ‡) ‚+¸ÌKè7Ìœ‰þÒ"%C$+h‰¸Q™‰oÀ†n€ˆª‹/è‚4¬ µ¼Ðá¼= ŽãdB[€EØ¡¨‹%˜¥®x Ø ˆF8A؇x8/ ‚üHŠ`Ûb„°,›€¹¡°›Âä‡( µ‚±IJ´ˆdT˜ðˆ`£/PÀ‡/àDÓ8T¸w PQ%USý›µi›·‰›¹©›G€oPfPFX!Pbˆƒ|IËàLS ̼ œ@7]8½A 8 ÚK´(†*H²ð“MF„±žÚ¹Ü)Ì€‡9H-€ˆÕiˆÐ‚}À† þˆ[¨‚+؃:жûvàn8£¼×|Ý׈(W Ú±;€Æ,° Ø~ µ˜G }À‡.x…uiV ? 56jU˜äTNç°DÉBÐÑk–x°pY©XTÚPÅè›™s(4=Y5Å<•e­œ_í«_Ì»ßËY]Ö½ ØÑ­Hƒ˜aƒ8ƒ¨á¾aÛÅa>ˆt­À‚6hCX½ƒ 4°ÞƦþ±íý¬î=Œîü•7ê öaƒW†àâþâ-6@É 6¸Ë@…çÍŠ€„(›¯± fâ'rb"ƒâ’âé^βâsS­GÒŠ0`Vˆ>äD6ˆ€¡yH^‰ÄP€NXâ:¶¥;N³<–ª-*æ?66) ž™ DFd2NˆT6B.„­Pƒ´C‹fH8*³F€X@]À¸_æ`æaf¨3YµåäÀòäÏeëiaF‹’-c„`eU®f®è”)ø‡„¦² h„r6çsFçtVçufçvvçw†çx–çyFgÛÃ'þ>aâXæjf.‚fçØßVà TV䂯f­X1h fà[®˜†((³fð`¼üçÐPB;úÝaÙcäèc¿åY‹%¶ÐŠøßaàd88àR8bƒPiné.RhDA´Ò z⫊¶è{Æã|¦ÀЂ܎~ªFµ²B²# $½­0‚.Vˆ˜äfžîi„LæßÚç€êçÈ0jHÛ› >‰†8Ž´ê«N .–­§®¾Ÿg^k¬0‚KÉ\:V"‹dp‡H¾à,^C¼æºF‹‹Þ¢Œž“> ¢æ¨¯Ž33ÐZþÒöÚŒU¤©x†àìÎöìÏíþÐíÑ&íÒ6íÓFíÔVmжg¬vk‚ë^’k@¢kî B`Ø¡˜Ú­˜0®x„Ïe2°·ª0ƒ: …äVîåfîævîç†îè–îé¦îê¶îë^nc¦½¶vkÆî£VÔ@ÛF C *{ å±€‚±°†~ŠcØèm„È'L^!MF´¬¯Øö¤Ù È63¾„ ŠZ@ +® "XÄ©ð°0”©(û¶ãÅEæ×ön¢ðo ªmñ–в9þêÂs‘ªø¨j©¨o Wü^5ý0þ&Çö'g2Üy]ý™‡þ%H – âkŸp¿o ']/þ1'/'_1"øõÖ T˜´`,®ø‡Ì–Š™¡Û…Xq#OO6%72&'('7¨÷p…Àp‡’„y 5ƒ±h†ªP¥Š0óÄ!su3ó5Cs‘Rs’bó6Gˆôc'óòQpèùNˆz€ö•ð?—£@ç¸AW´B§ªC·ªDWtƒÈÄä)0àSIï"Dˆg¸9É3¦Š7óKÇt'Òô¹ãôVóôÁõÂõQÇ€]ˆR87ð€f¹æ{˜æ®0ÿ» Fª ÁËs"Ïu]Grßíõeûõà öÒvE7µVd?S0$à€8ȨFþHh ØæaðÞ† ñ#z÷x×&<00(Ña….…†v°Ž±€/ŒŽíˆp†ðs¹ñ[ûÞõ%üvv wñ÷á*÷6§ã„Pw#°„H0Mð‚ƒ¸€-S„ 8ˆ xvDV÷ayšß²W°H"ÀÝÂF =¸B­h_´ ê"m¿ˆFoh„áq½È‡ÈLxØ;à…Ä]ÅcNr ù+yò:yßS;Xˆ(…Tø›†Z)äS¸òa uƒàÜjîyºOõ»„PO „{ºfømQwèÁ«hx\· €Vˆ€xP ¿ñÙ­ïþIP `9@{o'{¡¶ß³/°´ï4.8vƒÀ°`[`ˆHˆ.âùƒ°}©(.pK>hn¸Û®°‚à *Ø`¬c¨yÁR›±€H‚Œˆø°GgÔÆO ~È‚—« ëÈ‚Dõ˜Ç÷8M+˜™ŸÑþfŒˆx\öPùÇ€,ÿøGú¯Ðí0,hð „ hĈ'R¬hñ"ÆŒ0¥ñ#È"…A`hò$Ê”%Ìæò%̘2gÒ¬ió&Μ:wòì鉿>Çf–z™N”Ë f.šô’Ò‘—+\‚¡õRéL/• ‚þù¢XLPC}ºd`•lÏ Ô-iâì 4iÔª\Áö%•¼z÷>Є‰êYyð§JŠWòÊ„Ë Ê^ØämË˱U8Ê1ŒX1ã¼”ÿ¹ó‚Ü¢¼ȱòéÏ8+#O®le4€Ò§S°$qb…'^Üø6iÓ¨÷2oîÜX˜[¨¬ný:‡"·sï^‘£GïâÇS$‰ýÛdÀš€^—ÉñpÄνÊÜjpæ5qÅ;Ëð^ùX’M>‹ðÒGÂË8²·Þ‚û’ðúœ¹ì }‘ºCíîÏI$¯½M;Ý´Z*(Ê)ØB¯û°wAW=AP}|MSÂr’ À )„£9,¨@LÖZaŽ8¨à2í*X!L¸ ` G+ @Üs××'‚ý%ŠyEÀ6+`¡Þzóíwã~™9㘡°Š8q|·ÜtÛÝùã‘ççÎ.õ¬4íA};DEãŽ.Ò´'ÍôÓÁ Ÿ¨x2<ò0‘ÑŽOª ÐþͰ‰d+çuáÀ­yüã*5úàÓÅ+в…?wdÁQV|ƒBþà³¾?¤<þøåç%Ž‹{WZä0èå|é[ÚÇ¿ù¯Vêˆ=€á‡(á|ÐZ Gø:Ån³óÝÏl·»¡én„€êá¼ä±°…8IœâB² ‚O+<¶ÑxÂxGMʶÁ!±ˆF<"sÖÁ¦ð]"4áºJÅ=¡°‰ãZá ³˜EZZä‰ÖÀ?`‚,JðI¦XÊzI|#ã(Ç#.Q\VtâC¦HÂŽèñ„%¹£ [òÅAÎ0 à!sR I°þgðÉ?Øó 0"ˆ×›#&3©I8Öxì£Ð¤ÊîTÑ“éÁb"Si¯. ª¼òÃ0´áŒ;yÆYJKXr“¾ü%0åÔISꉣܓ(9’?“P¨|%4P!š3ž¦­ðd-pÉ&Š^³œæÜä0›y'c*S<ÉlçGJ©Në<ÓšölÏ1þЇèÜÓ%? ZÐ {Uƒ`ÃTAÎs2´¡HLç<ÏÃNx¦‹åŽ<#š’zö³£;ÁØáQ—âhaA$ –MžØÒ%ˆ€ g"D‡Ò´¦:ã§ìì¨ÑëLô¢!y§OÛÅÌ^‡þ£#=*MÔ€- 泌ÁðˆÐŒž°à<98°ð’Þa¡6ý*XóQ¢–+Au§EÏÏ¡’U%FE*\_²(Ã'zH)JÑS´§(d9/É2UŸB«;‰‡0`âXëa}¬CÇÚÖ“ôT­ªe#’ÑÉ&ä­q…«ƒž°Á¯ÃÃúŠ–EÄ-(½pÚ œ!ˆkˆns«ÛÝò¶·¾ý-pƒ+Üá·¸ÆÕípêArÖ$•ÍìwÒ ]¡6×­1ý,veâ´¢'¥pL\9 à‚@í¸A ^rˆR”à¦8LLû$pà'Xh= ¥þ†è‰+ÀÀ“zt#&ÍÀj¢Z0¸Á~0„#,á S¸Â¾0†3¬aÛ0\ÕEÉs§ë'éŠx"›ýðÒ®›ÝÃ0AON@(¨È%%€‚K Ãa@áñ•‰&¼ð’ äcQÖ‰Ö ž C2Ñ–Ìâ)óŒ¹(FHˆK< ÌB÷ÄWƒg©lÏN¯'5žI'È0 ,|â%RƒÉ‘‡!_—”©v>ÅŽa YBo^+òN åcz†3‹™øeƒd¹Ä\ά—¯fDC³¸€w«A“jÀvvÉTj2çaØ'ŸÃ`{Bð$ÎîñÌ@éD[yÑþi´ˆmÙH£xÒ³Nå*žlƒƒÍ† ªé’0DÀ\2 Gü8&X±É1–O¬T'€HíNÔðf™@Ýþu\mëàzººV+¯?ìktRH„OÌ‚R˜€&}É6®˜P ¥%¤,‚RLÁÎÇs‰$ %oàI+Ê8“! ôþ¬º×³jy#$.ù,â]Ýy<‹¾ÀE„q_ÊÔpuNâñižHY'JïLl€´®!_w»¡û¼¹,/z •þ" „¨W,Ú@–@‚'lèyN¾aW P?êÑmôÌ.=¨MçþìÓÏŽ¼Í¸!>TË ¢A¯vTÒ'òNŽð_`@Ÿ '@“g, ñŽ<ä#/ùÉS¾ò–¿<æ3¯ùÍGÞÕi_ôÚ-ÛvŸ¾}²q—»ðÀ€¡þ&Ç@ÆXr‡QØd#[6¬ûÝó¾÷¾ÿ}rëTk‘‡^­£¿héÛzúÖ;m Ôë(¸Äž",,žÜÙí7T²"9Ê5r|Š&Ÿ¬Ëg¾½è€gt4úPsO‚p5¡8¯ dmL`Úç>“÷É…_t…‡¦[}Ÿ@œúÑ‹?ÀØÜS3@ÀýÝÄ%´N4ì„ óØ%|þÉÔ% jÒ"]&àˆ! –Q9àNŠ€>Ô L]ÏINô ü_ ¡­ Úµ  æÎÉ•œ î ê ¢DȃG!C(ø% £\ L,À€¡>”r}Þ—ßY<5¡F=!"J6Œ5ÙÁXÈÃÃñ6œÛM4‚“é„"tÍM œ…LÌÔb!è!aªa;±aD¹áÂtŠ=)Ct,˜ÀŒ΄|bL,AìD”"NðB"¢+Þ”ð1`A aP9¢2Aâêc>*âþcä( $1¤Aö„£4Á=©@$@°Ð߉èD;0ÃNôCHÃH2‡êqÄ$ šä•Ñ¢O©$(±¤)¹äKî„=ÞÓ!ðÂ,ôB,…N€FîÄ*J96–5z‹œ‚úå€R S¢˜S^Tö‘TzUVþeNüfÜ“ÌÁ/¤@wí„=0€NDááD(cN ÁR%sèåðè…Œ‚9ôÆb? „mÂnN‘nÞoöfM øB?YÀ„àNLÃN8€Çå„DOœƒ¬¼HŒx ÜÁfúBþäBŽyÒB‘‰ª§‰®‰ŽðH^ŒI™œIšXŒš šèç~zX‚_7ND€BÑ€ZQèLÀ*öS9 O8ë%J3Ð#L,C8@4‚" @€àÁ<‚ªx ¼HXò s”is‹‹d‹´P‹ÝXA›@µà¨XñãŽþg;ý¨ i )‘Æ„*î@?€WîD,‚N<‚èÄ\!Oœ@ñƒcæÅ5€Cä<À€ô†4§6È8‡ËÀŒÌÐŒŒjÌÌŒëè'mVž*“žŽŸ¦ŸþéKŒÉhÝS O@= ANCœƒN”üùÜ”cþLªˆ‚oøM$tÁp &êÂ)¤ÝDNµ^k¶¢Žâ¬ŽèŽé¸F¸–NȰªöç«S¬îά‚P­Úê0àjGydN@é2XýùD1Ì–¤ž¥œУX3p„ªˆÁ*¨CÜÁ\B^ ¬Â2¬Ã‚øXA],DÐÑi«6׺ŽR»âλúN¼Ú*½ÚÓX2ê<(Ê1pBO BNΖ90+.eºöcÈ‚ÒÈÞNÉÒÎÉþiÊZÓ<@ŠXòCäÄ4TN@@ð„¤AËÎDzìͺâÇrÖÎöQÏÍÏ*MÐi ÞÓ0çNpÁ4ãMP‚åD=ÔO þÃ7 ŽÍ^-÷eídm­uíÑ, †­<í=A©OƒØ- Ù”ŠÃÝâ-dém[ñíù­Ð|í礼¼Ò‹ ¸YŸéÄ ðàM$gN Eâ$AÀD®ä†å’•åB沋æþŒàöæoÞÓL_M(A @4øÆ+A‚vóÄ'd€0À°Ã ÀíLH;,î¢ 5°û&ËLZDÃ@D|Á¢ÊD3¼àDÉë¥[ºÄ3Çw†'@t²b%ß õ¬0Ê@Ž•J Y™(5ÀÊ#r¨bWþ&›•ª¤x%¯L8+«ð£¥]šŽaÆ”9“fM›7qÚÄÐbXOŸÃ¶3”hQ£G‘&Uº”©Ra€fE•:•jU«W±fÕªS[Á†;V„¦gѦU{TÂŒŸoáÆ•;—n]»wñæÕ»Wîjø|Wºs†uÀ¶-.‘aVì.ºâ8p cœ=e µ*W°}Iƒ“ÌV|uéàà@Ö ­¼Ži1Ò@JàXáÏDï6Å€`à†9‘'W¾\æÎ¸A×F—>ÌÓ±×±g·Úõ«vïß«–¥>žüÒ¶ƒÑ§W¿ž=Þ#ü´—?Ì»BÐÕ–þ丌L¸+<+䎮LÁ5pâ@Á\kM8ØdƒÉ"„*jPaÂ.dNÄI´Â9¸ +OE­ÏÅ§âÆ¯oÅÇ;o¾yì±ÇHÄÇô²hÇ.Aà ‹—#¢™kŠ0†‹' ¤:摎wÜ`c¸épÂèÍx`ˆÐŽ"9N¸yf“0Ä/ºøf¦ C,QÏ=k:ñ­q T­i,; Mô*mô,£ŒTÒIãB¡JJ÷²D‰ôaÓ¹A ®tª,™w†Á#å2ã‹›D`‰G¬ˆ¤‹;0°"zH¡ˆ>€d A8•ÜþQ¡Vɇ\Á ãÈaAbâðÀ WP%0dà>É-×ÏŸuT]¤UÔ]¬}÷]F×­·(H1ÍWßù:à“}Ù  ºÐ…®(£KJ#"†q€kærõ¦0ºz fº Ó Ôùƒž+:„évøáæ60þã“OþÀãG¨ÑŸ.^Y³åOô8œrÖó\ŸÒµ·ÞvåM:ªx•6”^£ëÅ੩֫ͪ–+žAìR¥º`®rîÇ®hÖë˜Hæ=Š©øÕ é®Ûî‡î©h¨Eºéw™þ{ƧùvTê¬OÜ'0XqŸ0!Å®xþº¬‘9>•K‰3Ã'/8ƒ.‹ï.ÝôÓaÊ(¡ _×oÁ v o=ÐÃÏ`:ˆB÷aöá#½Gâ¡«™ê•À¼P§œžìà‰ÑçFÝúëÉU}oÛo|}veÿÞ»Ú¹_÷ßÑ—” ÔI¿®˜‹ˆ/æ™ ’$ë’¤I¾îùº'pêa€‘öXW¾@yO|/ _±C>’ç|î³àŽŒÀ Aw)à ]p?¹¡sAB2Q—cf?AD@Œ†5ìOP”À ®ˆüÎ}( îp:¼àÙs|#wXp‡]²ñ Î tQþÀ+‰ü] mF"ˆÝƒJÁç4ŽÏ,e4Ÿ[Ç5ùÈ$'”Á?qÂOбBºÁ0{!5Îñ”`ã# HF7–§‡k¼-™•!N2-F”ã'÷" (”ŸhÀ\ ÀŸ¨€F š`AªG] „#!™ËÓI’“Ô©d&ÂI`Ze“½lŠ'A™L»”€‘¹{„êâŒ~Ð…1?)… Ì!/Lo.hÞ^Žá 6À% ]ñœÜt™Î]âðO:4æZ~9L®¨Qža)æ;•‚Leî3.–ðJîv`€ºa–o‘BÜÞŠKÐ`ÀHÃþª!— øO/~ðE߂ދ´êôhÝx‰ÏA±žÙfI£rO‘²Žüté][ä.UœËþäâ‰QÀEŠR  ô' ª^’—bk u1Ã"U©N•ªUµêU±šU­n•«]õêW£úv¢Ë+mJ_êRÞMá“,€À\J¿¢Žb*HÃ?Þ„£âÅ ¨ 2V-Ђ±uìc!YÉN–²•µìe1›YÍ:ÖÏ)«[BÒ´Še­%m+há×}ZqxœIiœ3/HATp` kˆá-jˆC ø2ÈÅ ]‘jþ‘[—í–]¢-XJ[ÏÓº5µÉ%=0 Å) ¥rìOðG¸(à³8†0n Å·°6Õ‹{áB,ŒÀºõm'sÏ‚Öç.žû OñË”êÚ‰Ö`ˆâ¾QH¹£pBüó–äà_Áw‡A„‚Þef› k0x¹&Š~÷]yN׬±m€Äq3Ž s邸¢|(.ÈÃ7ób7¼e ]ÉÃšŽ®tà÷Cæ¼þ¼O)›ÅÏUñ0·,Ò.:w˜€4G{¨w/åxÄ\®…¹äãzABlßrqH†ŒVæ \èј‰Æç¢M8tˆ3‚åÒíÆ$ ö1—p$U/-À"\¨€` l„#4q‚è™Å‹5(Q_U§•Õ™tõ;a}íª- ôXÇ£츀ÁÃpi…&䆊@”›øq!ÝG¡_._ˆž¬¤/½é³‚zªÞ¬oý¾€sHEå>·¾¢q\Í@.^  šãÒŽþ{\ÜiS"0 `Œ¢Î¯^ô°D¦/‡¬ï(ÖNž´‚¸¯Œ¼ïûx à l`*X ._쀛ô ÔÃì ÁÁÈþAÓò" / wf¡‹ž è~âù0™cG¯O¬Ê°/F°ÌôˆÐçÃ"b*x`çzÎG–Uäšï' àâ"ÌA ‡!ô¤ ú`èì¢ø"òŽø¡äÀ©þOÑ0'h°úlðsðʺ#{p‡~ÛÂ¥*ðNïG æ§ŠÏ÷|¢- „a¦î¢t¡øÌü€Ë ÓpÕúή Ýð ·c³þl'¨íp=”È ¤‚ Œ!.¢ö&…Ô .˜â"žç.\fA €¡ nÉ.ÊÁ6ì.Ö¡+Ú€Ò:Š‘q&Öð1‘Ê4qãûh.¨ 0A=à &ÀDQ/&c6¦cdD†d93CÙôF™FJGôw­Ö°(%®4".Àþ²‡‡!8”, Ï’X/"*‘{B òÀÞ6EEø˜ (™˜Ž¥¢™ 0š7ªfŠ –7. @€xˆ¡éfjÀÒw L‘å‚®’/8YžçYŽ—ÕžgŸaä™o„Ÿ©6îà(FR¦0á`{"Ò€ ÞbÙâC©æ€¤‚Z! þì(/œÀ°õ'kWªÀ*©•z©™º©™º 8úa—9Ë@úEDúP™j‚X1J,Á삾(w× ; ¼A*°Üa":.ž!léb«»/ëóð:¯õz¯3« kðp§ÚʪšvôÙúHšj‹zR0ÀT}b²saKO.¡¼ÄÀÖ TÕ.¤ €n.’ÁDS:«©fiWê‰gg°ÁãªUä°/Vþyj€¢{b¥ßÂXß‚Ä,.J€lÁ.áJï‚ñêÂ*­´³Æ´E µaGµ¿ƒµËõ§ÕêàâwHðÀþÊá{‡Vá-F àâœ}âÐAþ$€’éè².fM¼‘»´ÿ7ÕÛ¿œ›d ¤{Zw3J¦!§ë¬'B ~‘ è®à(Çæì.|9¾)E¹ñ‰¹ç¾µº)è”-à~à ¾àÀþ°}’´]^¸]ˆ¼ÝÄÀ]܉ÜcÂ9½=¨à}¢2²Ü'È –zb8a.ªAÕóBNa0€V£3Òe~æiþ±þ`°Þþpb}¿f½ˆºKÂ]âÈâÃjÉ·G@•Öù-žaxߢàm¼]ù.ˆ Žï ô¡v£ã™è­Çp¾Õ îÕ ­çŸëç¥#➆Œ>0†q ª}0`‡s6,4~ÚR*“þ.ª:˜/RÐ#£ßuÈþ¯aíWMíG‹í£Ãí¿€â>0Âï§#%l¸'RÁÆzB¶vŒ@Êk¹Ôý-ªa ¢`Æï‚[@mñÃ>óïæñÙPª=ú£)?­,-0÷¯góù‚™DAéeú'©Þ Ìz¢>ˆŽí-èQ©àB ˜`· à<ì‰ßþ€tŸyߣÞž>À†üOÇø÷Â*5”GÏ'¬  º'‚`Lµà #.âÐ…a‡A°G§ Â… €­¡D‰f¾X¹ˆ1£Æ;zü2¤È‘$KfôWlá–`Zº| 3¦Ì™4kÚ¤) Ь<{úü 4¨Ð¡D‰`ª¨Ò¥L› ƒp3ªÔ©TcJ˜¡P-“\»zý ö«ŸˆË4²@;³l2¡¥pS‰‚†ËÂv†‰¾ì% íM¥¶lQøDxbŰŒ;~L¥J–U+[¾œ³©æÍœMÚ9´èŸO/›>õjÖ­[›„Ôçh=×Ç&–¨€‡þÛ¼ v@Ћ;%K€"HRÃeeË­I·F©rTz7$¢@<ë Óþ>¼GÉ W¢>ÞeæÑìÛ÷üì>¾æÒéëŸV]P«øï –ä¹óD%X!);0Û~b‘ÅÝ0€WƒɆD÷€ Ñ C90Ô€/e‰òÁ,ùÌÑ*Ôà¬8Œw ÎH#cädž}:Vµž|>nßBEߎF¦†U~¬ÕȘ$œÑÂ+iá‚Ñ#2i’mãlÀ¸ –d†Í£ Mñ¥DJ¬aÅN‹„¡"˜§ Œ2~dåQ~ –‚‚w#A9‰èL=ɨþPA6Úh‘‰Nú~é7¨WßÈÃÌ7ᎠU^‰‘"ÐìñF,ñ`„1ðôqÅ!€/ôðãÌ?]Ûl7%GG“<£\’–憘=bGA'd@Ð;ÑEÝ ã… ÁVºô´3LÀˆ–vzZ’•/ð€ ðši½Ž:Ì¡”Rº(¤þîôè¿?Jºï¤–ƒ©½%%òΨ ZñÀU¤ðж‘Ð9qƒa³ÃE"!Hdà"­ÈHˆ pˆƒæ@‡:ÖІ7Äau¸Côч?œÐOkð!ŒÎ1&‚ÈÂq…Îâ = c¬TÈ8Dd–lÈëࡳr\ è€'@! R”â©X+\ Yм†0Œ¡ þg@ƒBlb/b¥HС)ÀHØ@h²‚œ $Æ5îˆohŒÏë¹5Ê5m|çG*ñ‡1´ Òˆ—0`‚µ ð\0Y bÄÁ1‡8P {`pT‘0ȸÈCz‚"Ħ¡aãÇ fæNÖõŒ0F@‚–ÑŒgDc[@!‚¦¨(ì Î0Ža `XÈ"Q"HaɪB4ʬjp"‰/r.tÁú`ƒ9ÉHGæqþ cJʳ¿}¦‡žødÏ=ëÊ}Êõ2ýlkGP„:ìá &ƒÄÁ%€“úÀG^aH+þb þ¸CÛ²üáz¸ƒ‹0¢uüWÀÃxÌ!s„¤³™$9À )âK£¦©,PøA³¬J0À© …(@á‰l °$4` @€ €ô#õ˜Ç;†‘”#3c2ò9° #-}©iJˆJ”¢~%Ô[q×½¢†®x Í]û[½ê·*}­¯_¿e­H üàGu`T¨1"!Dàá j0 >”c!ØpY¬`Šû-ˆF&Ûuä{ð82’ tðCsgMíj[ûÆ:²þN<¼_ÿ¸=ÿ²P d©þ¸ÇnŒ€ÍXБ(xE3KåŠ(q®a CÃðƒ0 ò(¡ PÔñ‰|ÃÀ-+lñ.€AëZWäЇhÁLvëd’d#)‚žT}Ÿ®Ï ,Ûp/!å™Jè²*#ž +ÃÉ DÓà0‘qÀã§@}Æ&> Ô."^‘Kb (­Xœ¬Þ(3ÚÏpE´iø[è¥9Ø=A²¯i²ä]+û"S–Pºø°"8 !U†"ޱ!…ƒZQ…š³ˆc†XŒ£ ¯€'€új’dö(oFíH/{??>6U€Ml£:ß>´½ ¬hÎ[þÙÍ–Ð'ð‚] é@>†Ñ£ªA˘Á’Šø² DðD&¬*yd¹ ×ÈÃÒ\gð |ÞõþwTðÍï  ›ßÆvy¥¾òy¼AßøCêÄ<ôƒ ÞXKŠ7 8@ UÐí0 àôî$è+jm#ñ`…œVMwÎ{Ür›×æ1ÿÉÌó]s±ƒ!Ù_7ðÎd lÀY‰Ø´1ž'6D½ É@ÞÆd|й!F@ì º®ò¶÷9ìj— ÙËþž}C(i;ÛßÖ·sçAeÀ»uP°w‚x`À!A¬0†@4dYÐtƒÄ ‹#d#ô¡tZ­bÌ3šñþ‡Éã'?‹³»ò6¿¼îݨyëAXŠàâ@è&W5Þw¼’ ×ðtC À]£숂ËB ñÇ_|«óÖû˜ü~òÂ6ñ]nüöã/ùÖa¸#°iq€ ¸ÕÅ zÁ!õ0m+ÒÖíày Ï\^§ Ä{ñ×óyõWh÷÷o…c´ ‚+È‚-è‚/ƒ1(ƒ3Hƒ5hƒ7ˆƒ*’#LÐ Kb&dPfËP fÀCˆ¸ÇAÈ\ðP ÞÒ/¤Ðf؇ó (‚eG‚‚f‚öv0ß°i¨†þkȆmè†o‡q(‡sH‡uh‡w¸†e\¶`ðpÕVÀ Üp[¢·¿3 (gˆ€Û°bà üÀ·ñ ü°Œˆn‰×…nô…ñ†17†FV†Çv0m†Š©¨Š«(X€P!¼ Å£ tÐ @3P,@#§Éà {ÑçÐ2@Q ¯  ˆ„aà ¨hk Õh׈٨ÛÈÝèߎá(Žãxð~ù‚/Šü6ŠCVоvЬ(óH+r'.Ð~€J Jð-3U 2°=fÑ ÖÀNàÕ`a –ÐŒ„aþ¯¸m¦9¨‘ɑ鑩‚é‚B|ú'YlþF’0õ“1)“ {ÐMeXƒ„D+pÁÍ 8I/; ð Á¡70“Q)•S9’$¹ŽùÖŽöŽˆö’Sé•_ Tݳ ·A0 é@ÛƒUÄñwÓx‰QÐÀ;Q ðmÖ1 žÅ”`é—4U™ŽWIlYÙ_[ h] ˜‹É˜QüК؈~íP*’|°D`À 8 J0xmêP =ÁÇ!¼Ð˜­éšl!˜`h’*)s’G›³€˜I¦˜¯É›þÉ Ð‰Ñ z0 ذÿ7 €w* i Pw‰ñ ePÁÐ ¹°^y%÷õЛßÉ›± гy›>a˜x•›@¶›àÉž2)úàKÔ)1ð°}Íè]@‰‘{Ðî0ö 7cr`%\מ ú—âÙ{„lçYWé9`ëÉ ºŠ(Ö,ð p fâg` ‘ ‡ÃP Ä‘—e¡h2j²F NÐ ½}àn€¡;•ÚxZhŠOª_Ê£Gê,ÙPpˆQ5V R à ìàaÓP@ë€ÞgUHJ¦òè£þj¤‚&¤õD¤{e¤e §½á À ×4‰ /ÀÔ‰Ãp dbf!¤`Ű}VµþD©ŠÏ°‘*©“J©•j©—Š©™ª©›Ê©ê©ŸJ©"‰Ž-™¦F¶¦hÔ¦ru0Ûà ­êª¯ «±*«³J«µj«·Š«¹ª«» «v TN€‹·A Ü`)°=t€@CF®D²kd²Hë‰*kUõàþ‹ Ñ ñÐP±ŸD@ ¡ÉÍ i@£Sà«[x²ZË±çø­àªu© ` ˜pu‰8Ð_Uû?W;FY‹·øƒ/©˜ÈP·A ?ð¸XÆu ˜ ´\ç`“hb´wÛ¸I«·{«L ½@š J~ò9 4@u‰Oˆþ 8Š[@Œ{º ó¸¨8 i¡ ± Ûp/Í ãÐT€5XÖ9Dð1“Gû»ô–ºª ¿g³pYe ° u¥»}ûüã»Ý{7\ \ÀäH1¢ô°ö` m`à ÜÀ¶Ž0 ã ¿m†p¾(Ü ¿öå­àû{4 […'ê+²*Ù¾ƒó¾œ? lUA°š¾³À’{°ÓàIµë ¤“^€pxÛkº 콬ºó‡ Yõ­€³`õÔŽ½À4ð Eœ¸,©º¬Ã¼6ÙÐ%8 dpBü€ 1K0U"ÜfØ«^þ2 ÁQ J‹¦¬û|8J’0 @P BÑ ·@ÇulÇwlÇ60¾L1Š4€ ` àé`¸O»»N¼·PlÆ;\{ ŸmA=€5D %p“ËÉéC[e¼ÈÆb7¥0Jo0 ûP Aq ³À z:$\4 ]ò'qÑ0 »°ÇþÒÁz£È£,Á0é` Äá£dx€ë'!v Ðû0“¢lÌ`QÊ67zBÚ0 Ÿ` ÛðNð ¿° NàÎï Ïñœ;u‰šA‚8€?ˆB0Ðì‹ÈßZÌ¿ëhÀlåc`lUÏà €þÃà'4T €°"Fàa  òÀX Þ³Í9ÜÍgü½=¬Æ>qÂ&Ô³@µðLÌBÐ 1-Ó3MÓ2m³ '`϶L°Uð@H,ÌÿÜ’}º/.À qsÌ0é0Ô|A`&BˆÂà>PÖq Ѫ \ Ç 7Õ N;U V€Ù \àßã@f`h ëÐïr@t`x æÒð4Ò{+¾Àô'â l³°á05?Q`Ù—Ù™}Ù0 ¥ ÓMQS›D£¤ ¾q<ÔàëF}º|ÆÖ@°â ÚþÀè€ ÁF@ã `ð ^;Z0;´S T0 ÑÏ@£Ë »ƒ‡ªÉ HúÐiAèÀÉ·1Oà z°¹ Q Ë`J Êuð°Iô`øðI»LßYåaa PØ ñÍ.÷{>P„¹ð \@G!@a›1Äž½Ó)©¹P óAà€µp õ ïÐ<¾¤AÔ$ÉÚëÚ¿I )вàP]³†'‘± õ-ãÃÕ˜¨+t-4òðà0”þ`BeP¶Ã !  Ã0 %°T"0 ÕÐsa1 O`0µ;A€þyÀ Ãàþ0à PÍÛà I0 \pˆµq‡ÁþÀ7ŽwP;îãm°êgPä àG]°Y€ Ö@ SOðM°Òp!ñ'”  ûýýýo¿Ç:PÃG ³ðÃÒT?±à2ð«Îê­îêPÐàŸÍÇ<<Ye³ðVð @!4Ð ìÃNìÅ.ìX¾@@y!žŽ#Ž·|p ‘ ÄÀÙà WðHV0Rô"þ° _a0äP•”—„Iîðð s@uðÞyðI6éNßrvBoà cš Ãð –ðÃà’°þÃÐ Ž€ÃÀŠ`Ð ¨= ü KRÀ:Šl°aÇP´eˆ ð Õ0 ·ó ÍàÜÉp ½³Š+ º/(€=°8š¾é‡ý­"(šP¶LêGñ:ðá=±àK ãTëÞ<ÀYÅ6ðŠ >Q Bð a/öcOöa_ JLÊâªÝήµN$>ãÀÀA ^Â'€ðM!¼+R Fp HPÖËÀ9•ÖR0 kíðÚÀ ÙÁn€Î` ðÊw f±5­^y´aSêŽì°,ïøÿàYÞ`¼þr%¿(mó6Ç‚²œno¿— qb»³€é÷'GMÿôQÚ´S£D¹@µà>± 4p ×ýÙ¯ýÙ ¹PV ö>1ÌãöH;H@ù V¸@jŽ Ýp3Ð÷üЩh5F ÖêÃ$XÐ`ACÊ8ªåàÁqìÀ*öÐâEŒÍ|±ÒÑãGï"+rHä Çã|òwGƒ•|7Գˆ¥ ¸ô À'I•.eÚÔéS¨ýU$¸%¬YµnåÚÕëW°a¿ 4ËìY´hqÌ2âݬmmÌ¥ *íYþ³–ÐåÛ—.4³J¸[í\S†ϲ֗–u6Üd££D Z8DaâÜÙóçÎÙ~°¤°0bU¯fÝš«„7F¥]ÛöíÛX²2abÇN+5C5€'+xSÅl®Ë¨S3N§nÑL®ˆAУúô{¸þT›.†ÜÈdßÕ«ŸýTäÜx EBïxÀž=zu „ne¾ÿ£:ÂEžlp3ð@­®ª«\sðAÉZì,,fAd.~™E zèzÓij),¯½ü2À#l´cñ.[øb,ºI¤Š¹È(3²y1­iF+í´Ô 4òH±`“£›tÒIpLþäI‹ÆÐ› <’` ~ÈÑ¥%Ú\oÌ‹ìÀ€Vˆ 3£k˜ÈˆŒ1¸¢™5ë|¨=§DZ .äó£æZá#‘xÐ%‘òéHØxòQH;S «´ôÒ¬$\LÄ\<éË‚Yñ€FÌúå–õ:ÑÄûñ,_5‹ºþ@ã‰èªax̦4‚vXbO™%HÒL» 5L›ERÉðŒtZj!Í€s¤ÊNn‡ ä̶íö»tÒ@™ôÆíVZ¦þKÊÝŽB@ãBàÏŽŽ"S¤ :j%>«ضI‡©ÔY„]Ót±{ò0‘’Y Ñd–\#qU¿Z]ñÕXþ_íE2@FY:é+”»2ËfŒûzåX!•M‹Ù„k^ ZØxgž•RÉê`¦¶‚ÕóŸH×èŒò‰€"–fzM“Š@(2¹Æ£KLØ­”H¬X€9Öá€WȰ"zH¡ˆ>€@~^`I…žófªàƒmöÛ«… ›† ~NìÃ^Ù˜ðâ–ÿ ÌUY;þ1šµš1+ŸQù U_Yn|®—‘rÙ"ÿ6}+œ‡©ZoÖ©• î;pQƒhq§^/‰¬‘Âv‹Ñ€Žá½ÎÕ? ÃC1<:ž¯'¬8oAþq8@:Ò@?è¹¼EŠž9RТuò¬½ïþÓO¼°0®‹^XdüseErsINtø¥ƒ?øE >H‹Ê<÷¹ÐÅŒHéc RW¼òE°|EuÂÑäaˆP1¨‰ƒc‚`Þà%AÖñ­A üÛúÐ'ì¡eÖðA7§ªÏ¡èqûþC(!NÐ …¡QÀké\ѳd-…¦{ “PxÅRp„‚/æ‚$Tðâ?°E2•gW úE½©pŠ-,‹ah ¯Æ¥b"RÌüW¿È 1,ŠÆ,!¾¤á6 ºÀ„Yà@)ëÑ—À(’nŽ«"=™ÂÚ¡1#þDÐDá¼ñÛÃ…kCÉ39n²f.D‹ r8XlÉxF1yLdÞ"0%€Ã-hÀ1A²h·Ž_Ò !8ƒ 3ŒˆÉÑͬtºDX'oyNiñ•9‡7ð‡Q¸I]tØÂ\@!¼u²'–èäç“rINgñ2’6€G§@>¦û`hCúІæÏL(‹|XQ¬ >p„¼™CpÊ -4¨³ÌÙO”6Iù<>1*yDŸuê æB=°t=jLiO›òÏ’^J X8‡±5 ÅìB©KejSÊ«Zôª‡Ñ\L6œà°UÁbþXÌGÅpŽtœAµÔI}zVméô;hH†\Ž1ƒªà>Fµ~‡§hå«ù ‚>²I ³ „Q7`¿õB¼‚æ #‚ÆIbŠñê%Á*Ò³4°ÏŠM´öÙWЂd¥y5HŠ@—&PàÓ!‚Pa¹øX -{Ö ÜæV·»åmo}û[àW¸Ã%nq›Û?œo…›5Ò`a`ThÌâ™wÇ,®!†~@»ÛÝ.ªñÝïÒÁÝX¯˜hQª¦WghÜƱ ÊVò›`¤&™ËYÙÜÁûåoýû_XÀ&p |`'˜¿É­­^WP¸¹Hã˜hþ@>ʱo´ƒÐ-`;—1HBj žŽhqb§XÅ+fq‹]übÇXÆ3¦qU,Âö¾ «cZžù£þ!6Œä0€ð\ãÏ0‹°1(Gy ‘HF•«\"tà 4Ä1¸9¡‹že\È¡3jQ_JfF`s›ÝüfÓ© »ø²Xw|¤Ô5Ã{æsŸýüg@ZЃ&t¡ }hD'ÚÏ8&ñtša òs[h}iLgú :¾ójxÙ "Ш˜Å >ð–g´#iXÅtíGˆZÐ@ ÂBüÀœÞÂÔâNDD|`[ØÃv5l@À`Ú·ÓJþ¦ýla’PEq}T5øD!–mp‡›¥œ^vXxùŒzu.úðÂ0Ðá']øÃŽq'ñøG80>Ì#€(G0‹^¬eT(ÆÇníXü‰ÂPL.lp Œg\ã׸ zE@)–»5ÍwÉMn;<` 'gyËmGn‘®Çi™„ºçB b P ÂY*– œ#éžñ #Ø:`˜E `ì¢ÍðÁ-0{—036WŸã‡î¡^Ä΂4ˆ†% £Ù˜'©³.g{Û¿³ Ãís§ût`žö­ÔS6#|N3ì¢Ñð‚þ 0ÀaÊtÎa–c0b‘Lv;j°£_<\1n¸†ºQç³Äš¨ÇpzÔŸ>àý.0 H–ÉÎìXñþ’×]÷m÷Œ±{àïþî·ÇŠ@!Ë÷7( Ò…¡r¡†[ŒÃ ÓC-vÁ¶¹8€˸’Ϳ󚾋ɺ¡î å½Ð½ëA²YìÂS ý§à (ä?ÿÿ(•!h„² ½Y@;âëŠÜ > 7@€!H@t¹á#>*¾› V@8 È@ Ü@ àZ8ºØ‚_èÀd«3Ð+Œ¬+u»'X† )7Ѓ à‡e8þ‹jdˆŸQ¨q*À°8À,ÂFc› 0B%·¼=ú  <°]ø+¼Â †[¨20—¹Ð!°B@3ÄZÁ/Q7[˜…F€ô+€&  …³ ‚0BBƒ{„p(€r„{˜„p@¸Y°:Ñ8/B­ Â%lÄ|ðGœÄFkB¼(ˆBG & : 3?/˜S@¢¨ ;¬Ã5´x¦5à;XK…‰¹ :(†e€dðƒ]Ãa˜.(8ˆD^1‚k ÃDTD¬`DJLÆá9¿PFg·å2ÆL™9éʈM|X…r@ $¨dvþ€‚R3ƒž?S< T<‹µ5u;!ø^I† @‚j:8†yp1¨‡f ,¨†uPΡhÈÓÀøñ€Bi|µ{F‰ä\˜HŒä KL»ÀÁ°ºmÈÆ¹@…Pw,#:@8KÇYG³Ð\ˆB9 ¦cð‚_à‚i°0,ƒ`˜…#˜ y˜…_.ÈÁBD‹øqµb4FdÌH©ü¬©¼JuÙȘ  ‚ˆ¤ É–ÙŠqI„I±‚(ô‡uè…^¸B¸ÄŠٞy™ÿ9Jª³àt@Û{ȨÄJÁ<ˆ ‰ÈÁ<ÌêÐJ‘s¡þ(!جK¾H‚x˜…\4ËS„8´ðcÐÄ(¸…xØ·Í^:! À¹»t˼d‘§TÄÀDÌÃTˆÚÌM»‹Æ‡\ŸZP„?à¡)øÉn è½ÄLuÔ̳è…`ÈF œ…{ƒºI²A°,@‡¹ð†u@¬ØÂÙÔÍ«\€‰0OõÜ4Þ”ÆõñaøsPè‹Ïé^ÀO¾¨ƒ ð¸tN³ð!ø…g"#MÌJÐË[ø‡•¸…e(º¨ ¿Ï,ÏõÄHF`à ýPƒiOc䥡 wèµÈ¡H®~ÀaØfÀ€ŸPŸþ(¢Ë 8Q¸Uä‹"Ø- ý %> Qg‰VPÒõTÌrs¡Z°Í¾h€YpŽÆ™˜Fè(Æš…wð85Œ‹Ê€u¨-8ΙƒOLÇ#½½$uRJ|„6‚Só„Òes!øüDÂ=øÂø’-(ðkÎ9 ø…^p5Ìô¡_ØvHX‡!È4¥ È<`Ó¿”Æ7¥ÓF„XPÍM;í4ª&¾€ƒluà0|ð†$˜È„CH‡`ª(—ô!¡†2H³¸>8±ä‡RÈAÅqÉ6Å»O-U#d”T€VÄ<Õ;ã¥ZH¿ø‚[8€Ïþià'2†[Àt 3L(#e²°Qp"h †”¡ñÌlÖ´{VjuÀšC}LkݱO=å ¸…Y˜. u¢Rq΋ú…3å iP†ÏɃa€QÀzË‘TÅטÓ× ¾ ¤“ÅÊ€½¯Áj¤¾x‚YÀÆÆ„]ðB?ЋãH$@ƒ:26¨(!ƒ0%Y‘3Ù•Õ=K€RXÚ©lYæ(H¡ƒ`ÀŽ–ÉY€ÂÏiEËYÀ¿˜–hœlÀ‚¡( X[ÐÉJ èÀ°CÚrSZ¨» RÈÛŒ”ÚÍ(éŒLºH¿Shœþ3['š°…NSÉ¿xH·,…0‘9èd…°€A…³»]6¼&¨ÔM]Õ]]ÖeÝyðÛJ×€]Û!%¸]ÜÍ]ÝÝÝÝ %¦ÜÀ¬Y˜¿Ø%0ƒÆñ`€âõN¿ð…Ƶ£Y¿,,Åvà~p"8ñìT¨4Ì:Q[É̃œ ·™ºJ €P Ý©!ƒãä%¨ à%«Á² ñ‹ ¸Ò–‘†Yºè{Á`0ƒOè eˆ^Ÿ¿8¿ÆÑ>É!xP*Y]K ‡DH˜ÒµÝÆUaa.áU ^¨ƒóU«cH~avþáTX*ÀÊMxFðÝpƒß?È b!b"b=Õ…ùåà5„s(©Á\¿‡Z`^Œ1ajӰʤEè kPàÂøòí D¨…åÁm¨ôt"+ȼWÁà°Àb¨c;¾ã:ö=10)ñ]µmƒmdAdB.ä@î½9Háf)Èý`±‰ì€ãpÀnXK¾dL¶ä/P†{h9øCåP>¿ÂAb%Q®`XeVne€r°€ÞYÁ§Y•°H³ ƒƒƒóâ¾1¾‹gŠ¿¸‚Y •ÆÉ"0*2¸ºÅc°ðÚ–¹?þh–†?epäÞëâUaµ‚Ü>u^gv–4k@µZ›çyƆ9ÈzÎçƒçni‡jƒ`¹Og‚>¿-p0婱ÄDn¯ 'áµ0˜À˜q`:$iØ‚&g¢bºHƒc. ö‹u8Â=‘ ˜…\þ8 fÅ°æ¯ø œÎ霖º¨ƒIÀ”nþf‚çqö‚r^äW‚Ü6P¦nj§v¡€;8#–âƒ-`¬Îj­Þj®îj¯þj°k±k²ÆjoÀƒqñguà¶nk·n ZêÖ´jQ>¿)„Vh£ah…lÁìþ³€`ƒMÞ^cå ~p0X•;¸…jˆ…=(AˆµaàĆ¥ s(é´ø…Îó ˜VhRÓ¿(Q¿àƒ–¼PðE’"§®íux'h˜ 0ƒ²êc2j»6äqÞ£VdF€¥®í§vZ¡€Uø¶u⃡ -Öy´îgGRn§þb•  -q«ëà.d¼Þ½Nè$ÎJTÞŠD¶ífjO±‡ƒB˜#Zž_ò ˜c8c˜…x5°KE 'È<†í rm´‘Üî‹;†xhœàš‹+Ѓž;†qHã¹ „¾„ÍØ>’Ù~o5¸í?Pƒ!mÆþ¯qîñgG äâ6çuRjW¨5à‡yçèžnêÎëNëì6ñ/Á„G@h€oå'äò6ï½Nïnñk÷~oO…À؃‡f!Z¶ô‹5 Q5”é¨]°!˜ 7¹è‹0`ð´Ø[¿Æh™k`° ‚g†fȼ,è EhN·™ogê8ŸÆ3ßòmn?êGîßq¦>€ã™êW’î!×›"Çî.Èñ$Wƒ~pkpoL߆)§rôVïÕhoßr5x‰3lÄf Z^ìÆæ ÐV!XT³ðrˆÛYØ5¾ø;þ?‹_°¹‚kÄwà²w&!pdÀ…j¨˜Cç HÝ7’F×îGgêzð"Øm jä®uAî=|°¿)(¨=PŠͶªV¯bͪõª) ‚ +öi¶©@º⬚y¸®Z6vîX>̬àÍ«w/ß¾~ÿ,x0a¼OðÐ¥Û@¶:uÀt– *‚`I¬ysX2Æl -ë*8‡ÝàhÌ9ì8Vã ,¶–è}.Äz7o0©Løëà7Pê°ÞºY4JÚˆ­B‡M(Íê|{Çܟ;Ûèp¬2â.‹fcÖ/5$IØeã#î YöÎÓ&NÇ=:öÁ\á‡~I¡–TTÖàV]}• „eµ›þi­åy` ÒeWa#’X¢‰'†ˆM-ÖXlIÆÖ#îLÀŠ7‚åhòxUi§á8Œjù¹›c³ÕÆÖذGúAéÒoöTKH·ƒøÄÌ)ð0K- ²2³|à T²éDöYpž(³Tq^bê áƒC.³‘#l„_”ùñÛ&@uL’‚A³`—n!¥‰Qh!†w4°©S"¢˜ªª«Žx¥-Zclý0€?cê:bÚã”Ù[‘±!Û;¯8´‡ö6%›:Ðð m“Ϙi‘ÚÍÒ5'h±þÞ,]ð„˜„nç¦}¿Pq ³Hs^( õ²§Cÿ87‹£5€®¡P‚@A8»%êŸOª!QFí6i–öê ¦ºŠÕilŸZè\réŠ*«ƒ ²«AÂúbdRffKÈkÄ þd°¼ {$mß–³»9k ·Xa ÒbQË ¡!æ?¬È!î,»dLEä„3Ë5:ä‰nwon÷\â•2ËçcÐAõVdÏ¡³Ñ"ϱù¯~1tØk³µ(ÂjH ¬9Œ#Ä/‹61ËPYìÆoØá‡¦z²ä““82Ž%;&+Â3Öx8g.ZÌ8μ[Íl‹ð’M>þ¹3M=w=‹³„¹Í2µE¨Äqþà .,»‚™/ð‚UÀ# ßÝuxÅ¢ ¤¸€4q ô>ædq~åÊX6\[|â¶‚Ňì›Kü‚hf4Øp>­ `°NLQd*sgÎjzЇ¨#PSˆ €0‹vÔ Ç8Rñ {sg.€$BƒdloDçAN¼cì ÅÐA;h@…Y@´B PØþUEiÈ‚%\BhÀp@'xÂ'€B(Œ ”@)œ ¤€ ¬ ´€ ¼,Ä=Á0Œ4Ä9päA+à†‘ ÎWõœX¡Ã@3$1Ãð.Ô€ À ´À*¨*˜ ˆBxƒ)<@¬ÀMÌCŒ#8Ï-„ð/€Á,ŒØz˜/PA-€CÇÃm‡ü‚vLƒ €vdÜAC¼€!,ÜéØîЀyŒÓ $D-ð€$Ã3TÃ6„Ã9@ƒ(4HB%`€&tÀ'ˆ)œ‚ °Â ÄB 踆!D- ÂöÔA¼èýð\œ9@øDþÜÉbÖÍ‚ $ÀqìØ! ¹ÈbèÃÐCЭ:”8|Ad5è 3œD 8‡LCtÁ$tš%}Zœm‚šÃÁ„ÁÔyL‘dšõqN•䵃1ÀXÁüA¤À+ÈC„^ìÉÌcƒHÀ[ô,dÚ'à+1¤@X€”?Ђ  Cd>€>¾?¾c<Îc=ÞãˆpÛñƒ,VDØP‹À0F¬l_œÉAˆäKž‡ Ä2؃CìÕŽ `iÀäN5 Ä7¨ZZq Î ÆÙ:´OÆÝœ pÈlÏ@À1,×N¸ÍÃͱ<Å3tÃ:ä,üÔs„à Ô$„A)8É<V-^p<˜@yÖl^ì3”‚$‚ à…I¤à‚ôÃ?‚ ‚!"$‚",#8À<$HÀP@XÂ`@&È }À°ƒ‚ádØ•1”†(|‚tl€`Â%X‚PÂ$HB$@À#8B#0Â(ÀtB´étÈ,˜AßÀÀ:[N˜åƒ<ýA À ‚"0@#XB6äÃ"ðB˜˜TàE+ää€^\.ÐÃ6˜,^ ¬8/ôJ/õ.oªôZXl”CðC*hÁy¡¨ö©(rΨÂì²L$þÄW ÌC}`Nîéô’TĤÀVXWÙL’PÔ:Œ@HB•³L^EHƒŒI(Ì^Õëv4ƒ¼‚1,ƒ ”ØÝ¶aÞ²IÒñì)À,Ð\pàÁ, +¨ÀÑhÔåã>«~œÑ€”Ë# Ì~hëÎqëÞ(æ< Åè&Si¤.SÚ"½ëŠ” ÀàE!Ã!'ò7ø1 rðmÆëÊ×þвÈýzÐJ" ‹Ž #ÈÒ0DGC¹T0–pUõR?Àà*P1We1i­…ªO¤•o˜U&8D¨B4€Ì¬°JdC-‚;`4±°}¸aph€7DBó¼‘Ð@tB-ŒQpÌÛAÄ3 Jþ0$ÀQh.ç²…·ÚJ¸ê‡È¸WStq }1ˆdƒ½–1ÞyÇ¿ú+jüà ªÝ”‰ ȃXÁžå€<5è>tÁ+Ø€ªCHÒ0øAÆÆ<ÌA h^hAŒ>L^ˆÊ|‚H8¨4K»´ù’´I£´)kÆ?ƒu=ϪϲþЀÐÎò0H€+¤Ã-å²T9m‚Ì ´ÐÖ*[p­×‚í23óAlÂØB<‡ ¤¡}$ &ˆÀ7SI83DÕ¸ Á,˜BÈÁ,D-·èuhq~´A Á<1+Fqlx.€nÃôŠt%4ÅÔnNÜ.Päîî&FCñŽRùîZa¼/XøïP±2+¹2[ÌÃþöïUCAãò•zõ.çW/™× +Js³u[ÏB„ɵvÌ3¡¼­Œ5v ëªJxÀèA9îB À,‚4hÁÏ\wB@îQÜCoìs+NFeÀ3àt6ˆ|vè„¶®þŒö…è+P¨1,'˰öEÀ[°@?¼6aÄ6g@µTë,ß,óöX0m }5j”k˜u1Å1ÿA27wY‡2TÃÞBÏÂ¥7vÇÎ2€@h¾Á5Ä´à9ðÁ,àËŠ¯w½÷e…?ƒ«¸ò¹¢F~Î~›J—¶Hôüëá¸m´?\‚FƒoƃßöNPµUW¸…wõ} w¶7‡wQ"÷Y¤õ׎83™ÕB¼+ôBk àA¬®øÖl‡?Àƒ$4ž?˜žžAÐÀì¤w»Îcö熮¤Ü·„ ùË(ù¦0ùçÄió®çL9–ƒ:xñÔpyþþîDn;Än‡¹˜7™ Išóšó„r_ð›Ãùv06º¬?¤Äž3_ÖB„åx[ÙxCÑ8X2úÎ8z|[}C‰‘sF¥GÌ¥SJ¦Ct[('{:‡ú¸†–kF©³…„Søª³:&`™?í™Ç¬ ˜‡ƒ¸ˆã:‰ïyØ€ûBû4aôÌ*44ƒ,úc7w´ï„tµOz‚`{¯h{p;P]Ì>Ô¾B›±qªÔç>âï>¹÷¾X”ºÖ«zðÏÅä‡NåþkÆå#æ+?, ýr 4x!Aa€f5tøbD‰)V´hS9R„"…LG‘…AHx¥@TH©qùòå:Pùpd^Ê”f óùhP¡B±h³ iR¥K™6Uj À†¡S©VšÍ(L­j\H“‘«cÉåÃÌJZµkÙ¶uûn\¹séÖMûOÙ±ítÙ SâÜa¤qâ²dŒqúòÒU*(žº%€N0sØùëÒ€Gf¦"£uÊ…#Y·v-1ãÆ×oÝÂ1ÛbÉÔ©W²ðxðŒü‘³!OËS‹üÜ)T©Ë-cÅþ÷ {víÜ2Þq@¼Ï³vÉ—7ýݼá}òõ~|ù=†W9ÇÿâÆÐùK¦œ3Í8Ûç 4„áâx¹ Z ·%„M£ -tM7QZi¸=€E44H¹üšëÅm¤Ë¯,¬>|5X´l¼ôl¼Gòðʯ_Te™…Š1ÇRäo²Êð P'Î|ô˜à7þ ÷݆O2wÝXÕøÊv¾x \ã‚™Ž=þäEÙM>å”UÖ–±z]žWIö˜Ä˜fˆ)Þrâ›-´˜f‡5^è …šè¢JƤ•^šé¦~ÚŠO{®™!%†Õê yžÚÝŸþì°Å›lÅfæú]›³¶0çµgÛmþ[½.›îºí¾o|ÏŽ{\µÝްí¿[ƒ›o4çÎñÄ_œqŸö.\U¿ÇëÉïòqoœóÎ=ÿüäÇ3ŸRrËY ÜtŽÝÁÍAöØe§NtÖW­:uÀ+oˆfDe ¬Æ¤£ Ãá~Љb†¸a§ƒ`A3ׇå‰RJ0å~9 oŒáìÉ¡~ÓQ'™ÙÉ?£ñËß÷üôÃÃ^{î¯ÝväÔîý÷às¯uhÈ24`5ª®K'Ø*(`‚;,!n @; ’‰CT/^‰ …O²á~m<“#! p,_ÿ€Ô76’Є(Ü— YÈþvð~âÊ•p‘ð  C>Ð^t@$ b ¢1è^0‹^ˆ¢ŠFD¢™8‹zB£Í,>à %Ž@ÑM;ôÁ‰x`€Ã èцSD€?Ò äq}ˆBaŽ=xÙãøv¼ _è8r;d„‚™cï@öP ‡! Ÿ0!&8Å)¦ñMœ¡ E(0‹a0Á¶´Q‰ŸXAø¨ƒ2ð†Aðc…œøÃ £9ÍjkÀС„alþ¡CÞh!ؘ9 gBSšÔ´¦O°©MnzœR'9óyΟ¤sí|g<ÃCJSÞ’—¬ô 0…IÌaÈ(0…&ˆð“L¬2í*NàŠlý2˜Ãü *U)QÄ`æxÉ[^óÐö¼èdz¨ñÛɨÅ$.±!_ £l<b– C* Ä 8„98Å(VqŽ ‚QŒ9âO»‘!΂hˆŠÑ#„ !ŠÀCCöAŒ†ð”§d5+ZgQŠ¥Î‚á)—ÀpÐÁ M G<0V€AHBlAã$v±=N Ò0‚L¤À4ʰ‰J|!F DÂþƒtÄ(&8ÁÖ°ˆUì Ê #hÐ'‰Ø§¨à“jÂ'„O Ÿ’”¼õ-p‡‘‚Ž#@!årT+ €_†̱‰ˆ ”ð 2Æ LÔ„P‚V˜M¬»Þ¯x‡|`¼ÈC3êû^Úaž_«îu³»Ýî~7¼ã-ïyÓ»Þö¾W ñE0}í‹_ýòþ=€ÁBÝúD¹Ãø­Oœë“èŽwÄm„OAŸà;>¡E8†„ø¹'FˆGüÒ(„ Ú$˜I‚XP§=„ÈÃ:Ö²Î⬠±kCòÚb䃭ˆhH"øÐ>$À!þ1˜Æ,pP )ߵʳ+”éêÕÝ5Ä"øA&RÜY0XjBT‡ðÔÎxÖó,òÁ 4‚ z-žIH$0€@6‘1HÐ ` 4 €Lo òðPÀ I d)8M§<" $Ò“C¥/íi ÊDL J1„Nü$ ¥v)dÑчúÄ¢Èö°‰ÝѼ¢’ƒtãÂáœÀ‡‡P(>ø¤+3i¸íÉ qÀÇJPŽŸÔ3ÀF³vF°­mnÃÛà7¹Whîá [Ýìv·Oà ^ûzÙÃ.ö0žíi#›ÚÃ`®OŽ­l†C[Ú þöÂõ²C´ñqܤñ¨G>úÑ“&$iHD*rŒt$$%9J‚Á’˜„9'K¾ÇÁ%ßÐ[ZÞ'ŸJèGOb á4£ 2¢†á† ŽáÌÔaÁ'¸Àþða r@òLø;\A9™Ó9¡sŠ` üÁ²à€bæÀŒžQh†Šó8“s9›ó9£s:«ó:³s;»Ó>ÁS<ÉÓ<ÑS=Ù“:8Ó3As6Kó4o37wó¢0áN Þñ(ô'Dà ö ¡•´tS6G“Ac îäŽîìïöŽ‚\t3þ.ð¯ð¯µïFE‚<!¢w|r€R(‰Ò(Ç2+·²+›ŽFa(Á$IàI˜ápr ˜(IC+©ÒH¯2"Pç5Ø]Vg‡PÃzX¤ôêÆøÜÓMƒ¢MófMQ3Œ •  ¥þ ¯0 ·0½p Ãp Ëð Óp Ûð ãæ°ï0÷°÷»P ¶„L×EL]cSeÅLÏT'Ò4?æ”lì€ÒëMW5(PUUÇTM3Ì-Õ (ó-ã2æ².ï²W÷²/ÿ20Á`0 ó0s1ó1#s2Û2Wï½ÄAS³¦SG‚ B8àfBUTQ‚TÃC Jà @oÈ!#ÞYuU͵›Òq°§hleð§[UCÉ,¤wBaÌn¦Zƒ"¸µ^“#ƒÔ•` Ö`÷…^6!JÇ_u²aHaä[–b+ÖbË"a#öAîõa9¢_;`56cöbþKÖdO–*2Vd‚a;6LSÐe"dWvbQÖfoÖMUveÁ ecÖ!>öagVdkg‹ÖheGgW¶g}v€¶a…Vc‰öh§–j'iEvi}Öi_#\!V 6b¥N, ªÖlm–lõåj56k%¤ke%p6€´`zçpãSws2‡ÃjŦCl©"²Ç\Àöô"Vñ…}2âÆò#~Îv_¡ òÀþÁ*"w94W_ ·7qËbqádm#–aå–níoá6Gpu]l"òî¡V,MI?@ L`òPfR• á}ð#N%S*àJadaþú¡*Ž—,¤×Xx×wWmuhg–c}Hê^×U¾Š&·Š‹¢DAL ˜j@aˆ|ŠŒ^€ Pìàª†Š¯FÄ"éäBŒ¡ø¡ 0AÓú`‚H`œ(¨æ2âæ0hH@H @ÁBO‡!N€ „vZi¤¡·ðÞ†SöÀDiòÈèa°áÆ- Š…ài8ä yE è¡~‚˜áfxœj˜¡XØ…aX†Ãiˆê†÷E‚)Ø£@ê5˜ƒ}ƒAX„õdm1Aô%×AÄX'ZÖuã·«Î7}×·!* }ß×§Êw~ë÷~ó7«^þe'á ϼVÍž,Ê"`ppÁÉæ*ÌH@xbÊðj5Ä"óO²À UéA(ú Î!&ˆJ‹‚ð´R+w‡„×PNjZìÅb¬qzÀ'¶á{ÆÍôÞ$‚`^Á¶†A„äa øAL ÜKÜ2l„6,‡…à~âþàØ+™!¬¿šÀ‚y˜‹ù˜±Y™Yˆ™ÿk_N9•‚•‡Æn–eyh™ànY‹µ%:áX€x¶0!pw7úaº"âìÎøxÍþ"y™­ ¹¹!b@‘¢‘ÓLˆZ÷{íέþD@^¡!:á!dƒ£®!žnê ­êÚnJ,²!k¯Ó† DÁjíEoT á%‚}"X |"ýjº,JâÜéò$_àM…ZI…”I…Às4¡ŠßjˆzŸ9?¢yš}¢š‘ «¹¯†¦ª­«¥oúÊZ_@(¨‡ZâÎ︀©IA©™ští9!ΡHa z` ÛA[«€’x€ ø€x#i’ʘ mìRÚ£AZ¤IzLºÏ² Í¥•Îa½wìNð!0¾—³Å.CòìÒ£#"v]íFY ·%ˆ”Á@ø `·wcp©‚”ÀˆZ®ùñþ'Z `½f¨ûÆZ…êá'"aÄZ­·š«Ùc‡{Ø'dÖZ¼Ç{ú¨ÛÄ®{¬É»­¸‘»˜æz¹¢¹ŸS’–ðòa "àÖ¡“Ûá“[K”°’/9“7¹¿ÿ;”Kk”%›#\µBµYû¤½®c›K{ɾ7'bj¡!º%…$a"l2´Ibo‘cvM«vûTP;í @aP!V <€±ÕQKYHH)ÖÁ'ðÑ'À•ëÑ€âá>ò%xGˆx‡aþ€ ¡Uˆ2 B±uQ|â# ·[O*ÀJ`bü€þÉÜÌ—ÍÝa@ÄËÁ\ÌéÜË<ñ<Íó…È|\oÉÊ3ž¿B¿›ïxú¶%ȦqZ§ƒ»§ÂŒ5¼$¢Ã?<ÄG¼ÄMÛ$â&3:?`në–ü`ªòH LAP *Ÿ¡!,a)/àÄÊÖÁÖï,bK»”,W|7òh8^ÀWó²Óf` ú  8!‚ò Âha “13@ÈYÄsK.ÁB1Ô•Rsd`Ÿ†ào[àÓq‡a8ó ¬4S…Z! ø! (๰S;À~"=׳=ÕN   ôá 0×'~;¾@!þ@à Þà/ž?^ã>_Ò}ÝÛ½BßÝâ}ÞëÝX’–¯ýZ xa rÓL·¢·-}§3éÓ‚aa=ug½Ö¿t,s}×{ý׃}ØÞ*ÇòØE Ù±R+¹tI]i%¢¶S#èke¸3 b˜h´âÅÆìgìc^¯¢üa(Aú@DtœÇ}È3+ ›hÜÆqÜî{~ äPïáÁ^·ÞcaÖg»5RÕàbÂS6Á Šæ…îáì'ógÇòÙ~72@ö  À˜Û½ÜÅ] Ƚ1÷ÜÚ±]ÛOÿÛÃ}Ü“ÕÜQ¢m]vkƒÈñ5Úãà¦Þ…ò‡Jaþ , hàó ägóíFù™ÿsŠÿøA¿g¾žt&[ñÓ…ñc¶÷Ïtø›üßvÚÞ] _òÝ%÷;v÷ÿ§ûwèûÅþãß*JWC~?øm%ývýs§ýóçýå † H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹·ñ£Ç CŠI²äHa€f©\ɲ¥Ë—0cÊœ9S4sêÜÉS“@ƒ  R ŒH“*]Ê´©Ó§P£JJ£F¢X³jƒ’§×¯`_ÚͬY—>·ª]KÒhÕ·pãÊK·®Ý»I¯²Ý»·ëÙ¿€YŽ LØkZ¾ˆÕºÅ˸±ãÇ#K®ªþ7±å¡~ kþ:x³g˜‡/‹ºx²éÓ¨S«^=µòè×!3ž³3mÚ¡Kš³É@;ŽXx´sÇæïŽØ•ƒ]šuÒ1½mJ A.ö¤L§.™óïw¡GŸ>¬úõìÈ äî|j×°ãs”}»¾JÛ›%ÕÏM’ ‘D2‚oerˆGá40 -Ààh͹WÑ$0rÈ!›¤'P÷D„ þ©7Ì?JhbUZˆa‰zb‰‘(â‰Á'lôѦ_}øiæÁ~?å ¬ÁGãÜS܃9x_ô&b„bÎÞxБ 6€=œpt‚;¸³†!EHþ#D$‚!Gã,qL7èÍ(ã@[ôæÍ0Åh0†>ÚT2Ђ`PÆÂ¬ŽkFJP›oÆ9gÝ)Pž¼íÙçŸj“¡ˆ*ʨ£JŠ” íÝqÁ ·ä“`$·Ž)Ù7Ë<Þ4¯¸i’ƒ¼'†# Ò †“2 €†€‘B#d’‚=ptπТÊ`€ ”£O:i¥*›½‘W !f #ZhÇ0"˜³I"ÔA‰@Ýd€+$ 3 |°/y4³n¤$òæ.¼0Æ8o½‡Ü›ï¾ýþ;LÀ6l0 3ìðñú‘ È *È$³¸êþº«}=Æ"0#Â4ÌÆßHBÀ?hxDsƒ3?(OtQ0ý‰GrÌ‘G«ø!’š(#Db!“øÃĤX±¦ÃÀÝ‘x AXÄÏ%”Ó5_‡=vÛe£m¶zj÷ƶÅo÷Üuß]‘ÊJ@¤‘H*iÜGKGÉÛ”U^™å–]~&c–y¦H9n¶sÏ?=[΄+´°%9)Æ ”3¹lÓOÎ1ļ/`Ó´ÎS(3˜#N8é*¾ŒÅ¸!¯gÃÇÿTÿ|‹˜˜´"ND(ïóΓ ½ˆhOoýõÙ´}÷߇/>DŒ3],GÇ&[û“ÎþI´ÓþªÖµ²†mÙÄ[à¹Ì…®ØäÊ>®[¯>AÏ M$,‹:"ˆ,ÈàÁÿ„#@µŒ\øƒ– 6‚ÀC|0|àˆ8Üá Ü@çHÞü’¢xa l8€1ˆb cJ¬PòìË?JÑ€L!±Ã0xc •X òª!®¦ˆGH—8E(Òщè⳸Å.~1Œc,ã0ΘÆ5¶Ñ ©_“`4¤5NYK»Ý“žÖ›¨-rj©ÚÕ²v’Ö§‚ža]`2¤  ƒ7&舫l’‡®­Ü=îЄ ÁièþC†àŽœ¡71à3Üát![S"RÞ|` â± >Ê(ŽÞLsPs°‡1 €„˜ƒêØÁ BŽÞ¬B EXC1³p€e®¦™6y¦@¢ €kV“7×È(²¹Ín~3œãF9ysÎa¤sítg"7;ßÌn^Gt×;ßI´#Â#žñç@›‘²Wd±™f.x#)S¡(M©J•§H0dpƒéàOH™Š )\a _ÃÖð†9Ã{øÃ vT¤ EêHaWRæœt¥PªT¿ÓÒSÚ$•ye,µT0¨`–µ¼e.wÙK0ü’7ÁÃ0‹yÌN*õ6¢|+þXHÚTËpmªxÍ«^íÒÒº®¥tr L\Û¦úõ2wÝ«bËX¦ôõ°Z,aÏ2ØÉæ„®eKbËÙÎz–!Í,Q$kÙ°T¶´2Á¬h·²ÙϺöµ íjƒBZÔzå´¶}‰jg‹•ÖÂö·Àªly[’ÚæV'¸=.KvK\¡H ¸ˆ®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞïÖ¡Íý«'• –äÒw̯Iêþú÷¿°€LàøÀN°‚Ìà;øÁް„'Lá [øÂn°ô+ßû–žg‰„+6“_›øÄ(N±ŠþWÌâ»x´óµ™ˆC9Á0Âg¢XÁ7xʳ”øÅ@²‡Lä"yÅÆÉEãï¤Ç”­ñ“U‚Qð˜Ä†=²–·Ìå.{ùË`öH’g«*_y3 V ¯˜À –T€$¨€›GŠðÊ. Â,>ñ„b”åÇa´ MèB31þÊšÛ¼’7ÇyÎu¾sž÷Üg³¤y®A ´qŽ•$‚*áCT‚ˆ|¨d¸PI30¡’y$z'€>´¬gMëZÛZÅc–I¦7Ýi•|:Ô£žE©OêY¬ºÕ¯ÞÉ¥y•‹A%!`ÉTÒ –„4»˜Åna–XßúÛà·¸Çþ½•\Ç„ÙΆ¶´©mí•`[Ûܶ´”u¬|@Ý+™ö,ª½’–c:¨„³Lî‚üà/¸¹aRï{Ï"Úùfw¿Wòï€ÿeÙ+¡„T’PÏ"ÁFN- –`ÙxÂWÎò–»\Ð  °4ÎqƒœÔ#ŸÅ>J¾’“§<Ê!ÕÉ’E@Š ¸™£ K,1Š\àX‰ Vðo¿üêXϺÖoó– ½èGOúÒ›þô¨«dꀹt`¤ ˆª|ëp»ÜçÞáÒ²=íó¶Ù%~ávºûýï€õ°½ì›ºzå¶¾´¯Ÿ½îwÏ{µÔþ¸··lî{Oüâÿ#¿Ïmð';üã;ÿù²O¾m—OØæCÿúØç¼ôQKýÀ 㥿øÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€êÉ–y2Ñ}re™°€ Ø€ø€8Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚øsÈø‚28ƒ4Xƒ6xƒ8˜ƒ:¸ƒÊ–w<øƒ@„B8„DX„F8„1x„J¸„LØ„ÔNø„P(ƒI…TX…Vx…X˜…V8…ZØ…^ø…`†bˆT\8†fx†h˜†j†e¸†nø†p‡r8ƒm8‡vx‡x˜‡zˆy{؇~ø‡€ˆ惂Xˆ†xˆˆø†u˜ˆŒØˆŽøˆ™·ˆ8‰”X‰–ø’x‰š¸‰œØ‰.‘‰žŠ¢8ŠˆФxЍ˜ŠrhŠªØŠ®øŠ]ÈŠ°8‹´X‹F¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ;mod_perl-2.0.9/docs/user/handlers/http_cycle_all.png0000644€ÿÿÿÿ00010010000021445111727205031022706 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæñP}o?³™a¬•’ŒPI›’6Ri‘µE…ö¢¢’¨h%”´‰hQíÉ^ø¶HJ( ©$e+»aö¹¿?ΫyùÙÛ„îû^wî=÷œs3sïç>Ïsžgÿþý륀 ”þ““™LŽŽŽ†a7A‡ oܸ1<<&È2dHrròæÍ›ëêêŽ9¢¤¤×ÔÔÁ¥FâââüôŸ——§¨¨'3gΜÁƒ·lƒÃáˆD"™Láó2›qäȇ³téÒ1cÆt®”~º¼¥ÿ#++»mÛ6oooggçGý1}‚ gÏžåp8úúúrrrk×®-**²°°¸}û6@\\üåË—222°qeeå˜1cÖ¯_ÿÇiÔÖÖz{{»¹¹©¨¨¤¦¦ò*dõyyy0bZðæ*• =}(½SSS4•ο*tú!eeeÛ¶mûÛ³@ù3wîÜØ}æÔyóæÍÝ»wavãvÀb±ÆÆÆ€ÀÀ@¸ÇÐÐN§8p×®]PådffÊËËS(///~æ0þ|]]]&**Ú£*°k×..—kmm݉B]¤¼¼|ûöí³gÏð¸("::ÚÄÄ:ÿ¨Ðé‡444¼ÿž—>¥wbmm ˆÀî³d2ùÀ¶¶¶{÷î]´hQûþ ;wî0 *•*$$¤£££¤¤Äår{öLKKkÆ ééé€ÌÌÌ·oßjjj¶zâ¯_¿¨Tªˆˆˆ††Æ»wïzê2ÚæóçÏ.\ÀápgΜéͯ˜((}ŽÆÆF‰tèÐ!mmmkkkggçƒΛ7L&/X° )) Ç#B£ÑþöL›ƒ ” WWצ¦¦†††¶|(%%Õò\ÿÉ“'vìØA${übþA6oÞÌb±6nÜ8~üxŽ‚Òáp8"""ÖÖÖnnnÍÞ‘‰_°`ººzPPP/|Á@… Ê¿…¤¤aGÄD IDAT$\$åèèXZZÊÛŸ””tèС… Nž<ùóçÏÑÑÑ ECC###CQQQKKK__?)) €ÃášvøìÙ³°°0ÀÂ… P!¼-üüü233ܡԈ(((‹ÅÆÇǵÓ&''ÇÚÚº–[A… Ê?‡©©©ŽŽƒÁhêÀÊÉÉ9sæLaa!•Je±X‰‰‰uuu;v쨩©Áãñvvv-+XåååÙÙÙ 0 ¨¨(˜pãV)..>zô(àìÙ³¼Ê (((݃yýúuû V¬Xñúõk___^¹º^B7Ü•yÛ‚P©ÔÞv‘(((Í 0`@BBÂÕ«Wáƒfm ‹Åª®®NNN–——_½z5ïPbb¢¾¾~mm­ššZff¦€Ã[‚ ˆ••N·°°˜3gÎß J¿¤¾¾¾£>>>aaajjj\.—W¦%ìÎÂáp8N'fÞÕUW‚„k×®•””üúõkäÈ‘'Nœ0aø½¸´‹ý£  ô²²²~~~+W®trrš9s&…B1b„ªªêÇ›µd³ÙÁÁÁ .Äáp‚444ˆŠŠ&&&îܹ|袇Éd¶s[ä“#GŽdff:ÔÓÓ³‹]¡  ´J;BGJJÊÞÞ>...""Âßß¿Õ6l6ÇûöíåË—šH$.]º´Óa]:‚deeéééUUU5Ý/!!±~ýú;w’Éd:N š9õQPPþ: ,077¿yóæêÕ«“’’ˆD¢‰‰I«9Žƒ‚‚&Mš´zõê;wZ[[{xxt}L&óêÕ«W®\IIIéJ?ÏŸ?÷õõÅápAAAh┢(ãòòòÔÔÔš5(..–HIIuÔŒÅb%%%‰Dâ§OŸÚIŠÑ^8Âb±>þñ3Ÿyóæ}ýúµåþÄÄDøP™9sæ Aƒøé ¥GÁb±Ó§O'‘Ht:î111™“Él*Sšª™¦û;ñê_¾|Y¶l?-íììâââ=zdnnÿ» y 6mÚÔS³DAé07UXXXfffzz:‚ ×®]+--m¶.ƒÁ¨¨¨´£ JJJZ÷mÁf³;=gÑÁãÛ;WFF†Ãá>{ölúôé***Mr¹ÜúúúÔÖÖ²ÆBHHHJJª¡¡¡ºººýi  t”¬¬¬uëÖ=yò$??A333¸‡Ã%''WVV­[·Žç‡ÖÓÓ‹ˆˆèÄXBBBÝ6õÿ§™$j)š}¤Óé3f̨©©QQQÑÔÔLHHøùó'¯7^¶ShËÛ¢¢¢[¶lÛd2*€ˆˆÈÊ•+á¶°°°©©)Ü^¶lYLLŒ»»»‹‹Ë¾}ûV¬XÇã ‚¬¬,ï> !!¡­­ · ¨Q£à6WRR‚ÛŸ>}²±±áp8Û·oçýú"FFFÂÂÂ=255ݾ}ûãÇsrr‰DbLLŒ½½=ÌòäÉž_uîܹ………$éÖ­[ fùòå4MIIéÑ£G7oÞŠŠŠ999¼3gÎtttüô铸¸xhhèñãÇ?|øÈÈÈh­ ضm[3—ŸvvÊ((ÿÇ¥K—à×éÆ-úøø¨¨¨Ü¹s'%%EIIÉËËkÉ’%ccc,{þüù7n 4H__ÿÑ£GžyA¡P"""/^|ëÖ-x‹/^¼xqOŒ¥©©VQQÁgiª¯_¿ÿøñcÔ¨Q7oÞìz>åÞÃ¥K—._¾ ³®ý---cccXHÕÊÊ ª>áU+›?~\\\ee¥¬¬l'&Œò/%ËðáÃ÷ìÙãíí w²Ùì7þúõkïÞ½7nÜ011ár¹0ÕJíoBgöìټŠÆÇLJJ¥N›6­¢¢‚ׯÀÀ`„ mÕ§HIIé‹ÝÐаýê©((¢}¯ß¶mÛ¶mÛZ244ä¥×»~ýú£GúMÁ“I“&…‡‡¯X±"<<œÁ`\¼x±Go[|šuóóóŒŒÊË˧L™ÙŸT€B¡ðŠŽý‘sçÎ………ihh "##Óì+Ê m™Î'55•B¡^½zE$ÛZƒ‚Àb± ‹/nùEÚ·o‡sttÈÊÊâÅ2»»»¿ÿ¾®®.>>~Íš5ýæ¥Û),,DdáÂ…m­{Ú·oßèÑ£íìì8ÎË—/{gt¤óB§¢¢bðàÁ¶¶¶%%%pý£GxÖ-³gφ¥¼º4M”^Ffff@@‡ÃÖÑÑquuýÛ3êff̘½dÉ’ÿþûÚnÛY|Уܾ}ÛÖÖ–ÉdΟ??44´?ÝLNž<ùíÛ7Àõë×¥¤¤LLLx/ÄAAAðøíW0aÂâÅ‹aRJ:^ZZ ³"##---ÕÕÕÕÕÕ:äï”D&“UTTrssÓÓÓ-Z»244|üø1‡ÃY·nÝž={~Å(}EEÅÍ›7·³º›Ãᘛ›gffÊËË÷f•:-t˜L&‰DÚ»w/‰D:xð •Jõðððôôl¹z^KK‹Á`ô§{ ø×UECC#11ÑÌÌ,''GUUõÆzzz‚œƒÁpvv¾|ù2`Û¶mîîîýl9tÓ”9|j–}ÆA6ÅÊÊ .Âj•;vtº`Ê¿CVV–´´ôW!444˜˜˜¼~ý:''®ÐìtØõoTWWkjjž…OÄÄÄîܹsêÔ)K—.ý÷ßW¯^UWWï¹¹\®···›Í–––¾w†FÏ ÷/àëë Ã}ÂÂÂFÕõâ¬(ý óßÿñÙ888xÍš5ZZZü,ŸŒŠŠjYÛ¼ 1Œ••›ÍÆáp}çé€ÐÉËËSVV^¼xqttt³CåååsçÎ}ýúuhh¨žž^TT”´´4è¾lGåH]£±±q×®]ËéÅï«˜ŠŠÊÎ;[f jƽ{÷|}}ííí{anD”naäÈ‘qqqÏž=óöö~ñâÅ­[·nݺ5iÒ¤+V˜˜˜ð™A”””{÷î…‡‡766°X¬™™Ù±cÇøLÜ›¡R©QQQ{(íÑ ÃÀ¿Ã«W¯:zJdd¤››‚ ­ú•Þ¾};~üøÏŸ?744ó G´dðàÁòòòM÷|ûömÖ¬Y………aaa§OŸ°X¬Æð%t8‡»uë?÷ìÙ3{öl555‰Äÿ<: º¤«UÊÊÊ6oÞü·gÒ}ý>;kÖ¬Y³f}ùòåôéÓaaaééééé鎎ŽZZZÆ “““STT”‘‘a³Ùuuu%%%eeeéééIIIP߆ foooaaÑ?~΢¢¢p}ÆßžJ{ ëøZ•JFFFGO|÷î]QQ•J…ëÌY,VCC‡ûö훊ŠÊСCýüüŒ•••Ç—˜˜hkkÛjÁJ‡fÁò>>>ãǼ|ùA˜˜mmmqqqþo| ììl"‘XZZÊOc‹µaÆ´´4ƒñÇõVÓ§Oo–I¹}š^…B‘——G¿©-~üøòåË·oß–——×ÖÖþøñãÇBBB#GŽ“––5j”¦¦¦ŽŽŽ`Œ¾(((üSUU•ŸŸß9{³……Åœ9slmm}||ŠŠŠ~ýúuìØ±ÜÜÜŸ?Þ½{×××—çÚ...ÎÈÈ””D¤®®NAA¡  @QQ±´´TXX‹ÅÖÖÖÊËË¿ÿžÉdnܸÑÀÀ€Ãá„áÇÃm~ì)€O¡ƒÅb;štñâÅv„ƒÁb±ëׯïPŸMOÉ䆆†~SI¥€Á`ÔÔÔÔÔÔx{ÒÒÒôõõÇ×o ¼£ ôc†zóæÍÎËd2mllž={vþüùcÇŽq¹\EEÅÈÈHÞQ!!!&“‰ Hvv¶†††œœ‘H0`ƒ‘”””——†^*&“ùñãDZcÇnÞ¼ÙÉÉ ""Âb±ètº‘H$‰BBB4¡óçxaXx¼YÞñ?’’’RYYÙ–—z ð…Édb±Ø¢¢¢3gÎthV(((Þ@Ú*ë‹‚‚ÒÛøùóg§ÏMNN¾xñ¢©©éëׯ‡ F&“ïܹ“žžN§Ó+**ŠŠŠ>}ú”œœ,''9a„ºº:11±AƒåææÒéô/^¼yó $$4xðà   iÓ¦-_¾œÅbÑh4@"‘RSS7oÞ KKñéýÿ³E'55UNN®C‘46›cnnÞêQ¸& A‡Љ‰•••µ•*ƒÁÌœ9³éžÊÊJEEEaaa'''¸A:Þ¹ËPPPº:èL”¾Â—W·Ïž={ŒŒŒGŒA TTT¤¥¥?|ø0vìØÌÌÌI“&Á„„“&MÊËË›>}:“ÉŒŽŽ611§ûûûOš4©¼¼\FFF[[{Íš5ééé£F‚0mÚ4Þ’F>“xý¹Ñøñãcbb:qµ‘‘‘M½W?~ü0`À÷ïߥ¥¥edd’’’ŠŠŠÖ®]  Óé®®®­ŽB šÕ,//ÏÈȰ¶¶666^±bE}}ý“'O i4ªuPPz°jÑAAé+tQèTWWïÚµëúõëgĈqqqƒ1zôhF¡P`KiiidÓtµ¹¢¢bcc#™L¦ÓéÇçp8£G†÷f‘C°¸8?Sú³Ð!“ÉXiˆŠŠ*..ÆápÞÞÞƒ†Ö§ŠŠŠÂÂÂW¯^¹»»ÿþ¶$‘H›7oöôôä§ÛaÆÁ3g΋‰‰=zô(77ºñPPPzPè ”¾B‡jQµÊ7Ö®]«§§Çb±Ølv³£X,‡Ã1 ,ûîÝ;ÞÑ#FÀ‚Vàw” / §Ùzòn^^Þ9¡C£Ñ6oÞ­ªªjcc“––vëÖ­ââbooïòòr.—ëîîîççKII=|øP^^¾  @EE%??_VV–ÅbÕ××S(XfëëׯïÞ½›7ož††Fbb"ÌÏáááQZZJ¥R‰D"Z] ¥WÆè  ô-º%íÅ–-[²³³………¡†×gzzú¤I“p…æ˜1cÊËËx<ÞÆÆFII‰Ãátï’Ì?˜;(33³s½ÇÄÄܾ}{Ó¦M©©© €åË—/_¾¼i›ÿþûoܸqL&“Ëå6¬¬¬LUUUQQ‡Ã±Ùl £¡¡ëÅ744„„„lݺ5++ 4Æ`006™@  *¥· ”>‚ 0>[»È—/_ °téR{{û‰'òö+((xyy=xð 55UFF&##ãÂ… úúúŠŠŠJJJRRRt:½ÛOüAè°ÙlÐÑHä¦ìرC__ßÁÁA]]ÃáTVV†††ZYYÕ××ËÈȤ§§;6++käÈ‘#FŒxÿþý„ ˆDâ÷ïßq8ÜÏŸ?óòò,--ñx<@˜0aÂĉoݺÅf³¡ôa±X"""ÇWQQéôbu”ž:((½‹…Çã±X,•JÕ××ï–>étzhh(LôG$yñâEZZ/Ô¦¢¢BIIéÑ£GK–,ill„û{"½Ö„—Ë…«Þ;=@ii©³³³ŸŸ Æb±óçÏ®¨¨¨ªªRPP¨¬¬œ0a—/_ÆŽ›——ë°¯Y³æåË—qqñµk×R©T‡SRR;hÐ ð[Aާ§'Ì%ßV• ”¿*tPPz?L&“J¥nذáÞ½{ EGGçéÓ§ÝÒsYY/F¥%l6;))iöìÙx<¾ç*Àü!BËåv1ššŠ Hcc#‰D>|8`ذa222rrròòò8NEE…Á`P(¨æxâa5T€Ãᆠ&,,Ìb±8N³Ee †N§£*¥·#£ ô~Èd2t]¸p@ DDD8p€Ÿ\|]AKKëéÓ§îîî555=y"¡Ãårmll„„„Þ¼ycÍ"Vݲe ¯ ¯ì;l ƒ´[¾ £éäQPz!¨E¥OÀår—-[¶eË111777VXX8{öìnKYYùÖ­[/_¾ÔÔÔäp8’’’=j§øƒÐÁ`0ÝbMz÷îÝÉ“'gÍšE"‘E~M5BBBx<>!!ADD¤  àÁƒð,%%¥}ûöˆDbÓö]Ÿ Š`@-:((}fjjJ <<<† ¶fÍš«W¯:4))),,LZZšÿ®p8Üܹs[=…L&{yyååå™™™Á([<ÓÛ¼û B¥R………ÅÅÅá‚©.²gÏž xyyIIIñvb0˜Ç -]ºÔÔÔtĈ™™™oß¾…¹¢'Ož ×[¡  ôEP‹ JŸ€L&KJJÎ;PRRríÚµuëÖÉÊʆ„„¬X±âüùóüwåããóøñã_¿~EGG»¹¹Íš5‹@ hjjº»»WUU9O‹{á IDAT99AïMÏå4£Í`dÌoÑÑÑ éú`ññññññ±±±***D"ñË—/oÞ¼ùõë¯Add¤®®nBBBmm­¤¤$,OŠÞ"QPú.¨ÐAAé+@ïUÓ*UUU«W¯†YñŽ? Qý‘ªª*@``àâÅ‹-ZtàÀ¨lÉÉÉÚÚÚ¾!´gOöññAÄ...Ý8äÓ§Oƒ‚‚Î;ÛTå@²²²>|ø ªª*&&†æÅAAéë B¥¯@£ÑLLLZZ<Èb±Ž9Âg?¥¥¥€{÷î :TEEeëÖ­wïÞݳgϘ1c,--ivCàp8T*•·Â¼ÛiSèP©ÔåË—VTT¨¨¨¼|ùræÌ™=êh=tèPIIɤI“xa:(((}4F¥¯½WóæÍk¶¿¼¼¦õ?~{öŒÁ`ÄÄÄtÖB<ÞÆÆæÓ§O®®®ÙÙÙ^!S”> jÑAAéC@ïUËý'Ožäp8ŽŽŽütòóçÏeeå–GétzAAÁ«W¯"##ýýý]]]---µ´´DDD¦OŸÎåri4ZW/ãÿiSèÀ7°åË—OŸ>]KKkçα±± .¤R©¶¶¶füøñ3fÌhuýضmÛÊËËýýýëêêÚÚÚ¼”Þ *tPPút:½UïÕׯ_ïܹ³|ùr^Ηöñööt´ØvJJÊ¥K—`­òn¤={2ô^ØlöëׯOŸ>mdd4nܸœœœ3gÎL™2…Ï1ˆDbffæóçÏ™Læýû÷mmmÕÔÔDEEwíÚU\\|îÜ96› ˆŠŠJ7\ Jo:((} ‰V«@x{{ãñx{{{~úùòåKTT”•••œœ\‡&žžÞ¡öüОÐQUU;vlÓYYYóæÍ£ÓéçÎãs ƒQ__ÿþýû´´4##£³gÏæææÖ××ûøøÉä§OŸÊÊÊ¢IQPú%Pè 1:((}‡Óª÷*33ó¿ÿþ[»v-™Læ§???‰d``СѩTj‡ÚóC{wž÷ªÙþòòrOOÏÉ“'ÏŸ?ŸÏaJKK‰Dâ´iÓ„„„f̘áêêzéÒ%YYÙŒŒŒ–í9N}}}·;êPPP \F ”¾ƒÁ011iµþƒ¿¿¿¸¸øÊ•+ùé'++ 0bĈÞBçE=¡÷êÀÍöŸ={ÖÉÉÉÉÉ)>>žŸa®_¿~øðá9sæ$&&¾xñâÅ‹¼C»ví:t謬ìÀeeeåää”””FŽ9räÈQ£Fz¢h;Ê¡Ñh×®]ëÞ>µ´´ø ÚGé7 ®« A˜Lf÷öI P¡,HDDDúúú‘‘‘Í=xð ¼¼ÜÆÆæâŋ짼¼AX‡»AZZº¬¬¬å¡†††Nͺ=þ tÈd²ŠŠŠ††”f<ª««ííí555ùÉ tþüù½{÷îÚµ+11±åÑúúúúúú/_¾4ÛÅb¯]»faañÇþQº*•ºwïÞîí“H$FDDhiiuo·‚Íf7+%‹Â¨Ðù§(,,œ8qb÷ö9wîÜÐÐО.0‰Òè½j)tX,Ö¥K—œùyô«««c0˜¼¼<Þ·}ûömÛ¶)((Ðh´OŸ>…‡‡Ÿ8q¢éYÁ¢Cg–/_ÞLèN:ekkëääÔÒ·Õ’ŠŠŠ«W¯Z[[3æÃ‡|NŽËåÚÚÚ.Y²Ðw:‚dffvû_0H¤¥K—v½ŸÚÚÚÈÈHƒ±dÉ’»wïö*­Ãf³ þØÌßßæÌ™³gÏnZÃå B§}âââôõõû™Å¢»Š$BûPBBÂêÕ«¯]»ÖGµÎû÷ïGŽÙ·&Ï`0Œ‰Db˪ÞAAA{÷îµ¶¶þ£Ð+–ÒÒÒêê꺺ºbbbçÅ‹³fÍš8qâÛ·o›õ„øí½Ú¿³ýEEEáááÇÿöíÛûñõõݼyó®]»6lØÀÿüjjjŠ‹‹;¶-0"""øqÞ%''O›6íüùó}îvF&“»%/ö—/_"##ÅÄÄêëë{›Ö©ªªâs2ÁÁÁººº7oÞX‰–~À?+tJJJ<==ÿØ,99Ù××÷èÑ£ššš˜•`:tè£GºÞOvvöòåËñxü£Gz§Öñôôl)šñåË—ŠŠŠ­[·.^¼X0³ê:Ð{5þü‡6;TXXøèÑ£•+WîÞ½»¶¶¶N&OžÌáp–.]zíÚµáÇ233¯\¹òðáÃýû÷Ïš5«Õ³þŽÐ!“É#GŽ7nÜ»wïš:v옕••­­-?I„òóóLMM;$tuuu²²²:E`|ýú599™Ÿ–)))+W®<~üx·THí£ÈÊÊêêêFFFö6­ÀápÆ k§AUUU]]Ý“'OfÏž|XTTTÓëÐ{E"‘ètz³CÑÑÑÅÅÅÖÖÖíaaauuõ¢¢"SSÓèèè)S¦¸ººc0(„……i)tzÂúËWp%•J577oé½/Y²äÆì§¢¢ ''×Rè,Z´¨iÅÔf£÷ò_þðáÃÛIè ÿ fܸqo߾ݽ{·¹¹¹££ã¿éþÀáp½VëðæM› ãâ⬭­Ÿ?~üøñ¿=&!!¡§§÷wçÐ×ñ÷÷ÅÄÄŒŒŒÚiðæÍ›œœœ3f¤¤¤;v,%%%((hàÀ=4Ÿ>ŠŠŠJoÖ:‹-jG»p8œøøøÑ£GùòåñãÇyyyÇ=z´ gØ xÞ«ˆˆˆf‡ØlvPP««ë´iÓRRRZ=}„ x<þĉx<þùóçZZZ ãêÕ«'OžŒ‹‹kgaGO<îùêQDDDYY¹Õ…Á·nݪ©©±¶¶æ§uuuöõëWÞžQ£FÅÅÅUUUEGGÿúõ+33zòšB¥Rû‡ƒ? ÀÑÑ‘@ ܼyÓÊʪ¨¨èoÏè﵎¡¡aCCÃ’%K^½zõ·gÔ„……]]]]\\ˆDbhhèœ9s>}úô·'…ÒçÑ××?sæÌ€ž>}ª­­ýìÙ³¿=£^Ô: €Z§'=ŠššÚ7ÔÔÔ¾ÿneeö·gôgÚÊ8þ<‚ +V¬hë\‰ìâârûöíqãÆq8œyóæ­_¿þýû÷………ÐS„Á`cÑáKè@…ÕêÓh´àààY³fñ£O§L™òöí[‹%""²gÏž‚‚‚>ÌŸ?ƒÁ”””H¤ñãÇ·|?¦R©Ÿyö~–,YrñâÅ¡C‡B7V·ÄëõEú´Ö^¾|yøðáÐuëÖ­¿=#”>¦¦fHHˆ¦¦&tcy{{÷Dç>M_×:òòòAAAK—.…n,‡^˜Á`0ŒŒŒZ5Zÿúõ‹ÉdŠ‹‹·uî´iÓh4š””‚ $ ‡Ãýúõ zýú5/·2›Ínvâ_³è€ßÞ«V"òG£Î€(JEEÅóçÏ+**<== páÂmmí•+WÒéô¶\9ýÆ¢QUU½zõªžž^CCÃîÝ»=Úíùµz-ÅÅÅ˳råÊÂÂBIIɆ†CCCXµ¾A¡P‚ƒƒ,X@£Ñ¬­­íììZz²QP:„´´ô™3gÖ¯_8v옙™ïÙð/S]]}÷7ÙÙÙd2ùÑ£GK–,ésZ‡@ ìÞ½ÛÃÃCTTôñãÇæææ999{Rm""""&&¶`Á‚Vr8œ¶ÍBBBóçÏGDDD¤e}§;wî ÿv½K興ˆP(” &´<”››ûüùs+++èÒk MMM chh8mÚ´äääU«V >üÕ«WAAA±±±ŠŠŠðòZ²úŸ “Éÿ ‹N§gÿ?0”Åb=~üøoϮàn,”n‹ÅnÞ¼uc5åÇû›pöìY˜<÷Å‹üĆöBôôô®^½Ú'ÜXíx¯¸\n[BG___\\¼-I’’bggÏm)tþZ02hâ½ÊÌÌly4 àÆË—/n«è±;uêÔÉ“'©TªM^^Þ Aƒ*++¹\.‹mKèô'sNS–,Y¢®®îââò/¬Æ’——oË¿sãÆx>݈¡¡áèÑ£{Õj,”> tc:tèÍ›7ÿòj,)))˜0¶%ïÞ½ûüù3‹Å𔺠èÆ:}úô;wzój,&“¹páÂ3gÎ\½zµY]ñ¶,:BBB'Nœ R©¼Ëa0BBBuuu¼6~~~qqqŸ?–””7n@Àãñ$iΜ9|†üvˆ¤´‡™[ºwï^EE…M;BgòäÉÕÕÕçÎstt\¿~=™LÎÉÉqvvf³Ùí×TêÇ?oèÆ:zôhRRRÿ^E"‘ÆŽÛê¡^›$‰ ËËË«W­ÆBéÓ@7ÖÅ‹ƒƒƒÿÙÕXC‡=räH«‡Ž=úùógϧ{n¬‰'zxxôÚÕXÂÂÂÇÎÎÎÎÎîýû÷W®\ ýùó'€Ãá´\<%))«ªªÚÔfA$}}}KJJš¶$ÞÞÞ1110sͤI“ÌÌÌ»ý*: !Èd2…Biµ”ƒÁ¸víš–––¼¼|[§O™2¥¾¾þãÇvvv‚¼zõJ]]ýÊ•+ùùùM›µŒ¿ë¯È?ëÆêg n,”nucý ô~74Ìp¹Ü#FøøøGDD˜šš"ŸÎ FSSsãÆ%%%S§Når¹ÍBs~üøÑ¬[III'''èꨩ©Á|`íÇÀtŽ^æÀVÂ*’’’­¥P(ƒ :t(tÈa±ØŸ?BÅ÷îÝ;‹Å Ä ãÿoŠý×¢Ã]Õ?@Wc¡t;èj¬~OŸX…Åbñx<‚ t:}áÂ…÷îÝ“––VUUg³ÙiiiAAAÖÖÖðE÷Ôf±XÐBãããsáÂuuõM›6ååå±Ùì—/_xIõ`Pv}·;¦!ÚY{Õ~ECCC‹m™å‰N§ÇÇÇ AÝ#˜Ð¤ö¹zõj|||Ëh¡å_^ÕŸ@Wc¡t;èj¬~Oï_í74@ p8*•J¡PFŒ¸|ù2l¦ªª 7`-O—””daañôéÓ 6dggªªªò‚«Þ¿7233‡ ?~þü™Á`tã’ºŽ 2™yò¶d³ÙÕÕÕ€áÇ{{{;88HIIMž<¹¡¡¡©< ‘H©©©eee©©©¼?~ü˜2eÊ¡C‡ªªªxë“@kK”:JÇ„ƒill¼qãÆÎ; ÐôP;BgÅŠšššRRR¼=ÂÂÂUUU¼uuõéÓ§ëèèÌ;:qÖ­[סIv(6srr¬­­¡äèsc}ýú®Òì÷ÄÇÇ_¾|YÀ²îrcõ¹L!ÿ‚w!õ7Vß]èÔ jkk[FSô(½Ó ß¿ ³X,55µ¯_¿¾{÷®Y,ÿðáÃÆ=jbbâëë;}úô.Z´¨YŸZZZ·oßnöf0nnnZZZBBBBBBÊÊÊÙÙÙ]Nu8üEHHhĈ¾¾¾ååå÷ïß766†i‹áDËlƒààࢢ"Þ!ƒÁår÷íÛ׬¥´´´¿¿BB‹/ž>}:}út///–aM= ü%›››“Éä´´4KKË;wl‚qcåää(++;;;Ãú~LEE…ƒƒÃ¸qãüýý{"¤¿-ºÅµsçN77·D’ö-ÜÝÝœœ`x¢Àøën¬ØØØ%K–dddrпEQQ‘®®î… ø,QÞ-ØuïÞ={{ûöŸáÛ·o0Ê~d³ÙÚÚÚ•••÷ï߇mêëëýýýçÌ™“pìØ±Ó§OKJJBcLK•À`0¼sÛ¢¬¬LLL¬ëO¨ <• ‡Ã100xðàAYYÙÉ“') ømÑÑÔÔ477wuu½wï^TTÔ?x= RVVÖ¬ª‹·±±áiSSS*•*$$ÔNõ¯‚'t~üøáìì,""’””dffvðàÁÒÒRÁÌA0n,:îïï?~üx—~ìõ‡_˲²2ggçqãÆùúú ì¶Õu7ÖÏŸ?}}}555ÃÃÃìÃEi.—¤©©¹aøDV0ü]7—ËMJJš;wîÊ•+³²²6î_‹ÅÖÖÖúùùÍŸ?ÿܹs=Tâ¾UæÆ¢R©§N¢P(û÷ïoçaJž; &Ï;W\\ÜÓÓóåË—°|Ø´7ƒÁb±ÚÿÞ2$))iøðá0 ¨+t~A‘HÄ`0•••D"ÑÞÞÞÅÅpúôi:ž––~èÐ!ccc.— 5$77—D"ÉËËøðÁÌÌlòäÉÑÑÑUUUgúôéµµµ¼[yVVÖ˜1crrrètú»wïrss ~üøñóçÏšššÆÆÆž³(B¡#$$$)) ³5lÛ¶ Ç?xðÀÐÐÐÛÛú @º±àµ””F;þü¸qãöïßß/åO+++WTT¸¹¹ihh;vL`Ç®¸±`–­²²²-[¶Ì;÷Í›7Ý8±9sæ(ÿF]]}ýúõ-W¢´L•Äf³ïÝ»§««kbb‹TËo¼‚ÄÅÅéêê®^½:77WãþàsZHHˆJ¥.\¸Ð××·iÜE"7ôÆP©Ô£G*))yxxüq‡S[[‹Á`^¿~}åÊ"‘èææ¶zõj¸8¼Yš)S¦5ëA ¸M&“÷îÝ{âĉ˗/?xðàÙ³g¹¹¹ÅÅÅ“'O¿ÿ ]¡óÆ’¼¼<55µ”””Å‹ü‡L&s„ ðF,%%Åf³G3™L‹E&“%%%:ôáÇ[·n………ÁäxО___ß4§ÎÚµk?|øpôèQ C£Ñrrr0LZZÚåË—yª.ã‚Î<Þ$??¿´´4,,Œð!!!Þ6‡Í­ö¼bƒ :wîÜ®]»<zÿþý5kÖXYYuúz.© :³gÏ>pàÀáÇ#""üüü®\¹²aÆíÛ·w½ÿ‚Óq¾~ý PVV KLL«íÛ·ÇÆÆ&$$,[¶ŒH$FEEY[[GGGw½ç(tÖ®]+--}áÂ…§OŸ>}úTCCcûöíÆÆÆ˜À_I*åÔ¢E‹Fíççmbb²wïÞ‘#GöèЂ¾#=úüùóîîî±±±W®\ [¶lÙÚµk¿QI¡Ð™3g 11ÑÅÅåôéÓÎÎÎÖÖÖ-³žr8œÆÆF11±>xxx(((œ:uJFFðøñãõëן={A11±ö…×/^¸ºº²Ùl;;;‚ ¿~ýªªª’——g³ÙÝåÏéd/ŠŠŠ¿~ý244¬ªª"“É/_¾ÔÖÖ.,,œ2eŠŸŸŸ¦¦&¬kššš:uêT<Ÿ˜˜£¢¢²{÷nkkk*•ŠÅbáþoÊÉÉyyyñ†àr¹^^^/^¼X¿~ýÂ… GM$W¬XqøðáñãÇ—””0™L‡C£Ñh4Z«“¬««ëÊj—fbBII)44tÏž={öì‰=þ|XXo)]ÝXwïÞ=uêÔÍ›7ïÝ»'""ÂËÔÄd2™L¦ššƒOÊ?nÀm­‚Á`ÆÿþýÌÌÌÇ?|øðìÙ³—/_^µj•.¬"Âårÿ¨Z:=ï÷ˆŠŠêèèØÛÛ7ÍríÚµ¢¢"‡3xð`]]]wwwƒ?¦M›–žž.,,lii¹cÇø•ãr¹—.]º~ýzii©ŠŠŠ,{2{öìïß¿ëéé½~ýšN§khh>|˜÷šÔÖXœaçàr¹4N§3Œfÿ6ûÐJJJž8qbÿþýgΜÉÊÊÚ¸q£››[[µ ºèÆš8qâÁƒ¡ ~y0 \·‚Ãáx-w6î‡Íš¶iz.|•––>~ü¸ƒƒÃ±cÇïÝ»±lÙ²•+W àªy¼xñ‚ÃáÀû÷7M·›~D¤Y3Aš5+--õôô$‘H°=ôqs¹\mm혘˜7oÞ9räáÇ!!!·nÝ‚Ióp™zzzªªª...yyyVVVÒÒÒÄápx<‡ÃµÜh¹‡ÃÁ7|¸ýãǨ¨¨ïß¿ãñøääd€ªªªŸŸßÿýçââòòåË;wúøø8p`íÚµ¼0\ƒA&“ß¾}ëææ8yò䨱cóòòddd8μyó `jjH&“yéÛA^^><<¼é #++Ûíéò;)tddd¾|ù"''רØ8`À€ÂÂÂI“&]¿~ÝÌÌŒ×Þ§”••½½½aÅ___(Ð ÄÅÅ›زÙl×Ò¤Ÿœœ ÿ e˖ݺu‹—ù›Ëå2 &“ ÿmʦM›fÍš5zôh‹²ZÐêN‹õæÍ›úúú–V.—›ŸŸÏsî0™LAF¶*))‰ˆˆÔÖÖ²Ùl^’%ååå]ì_CCÃÌÌìåË—?þlhhˆŠŠêb‡âׯ_|zÍp&¶jú±¾¾þÓ§O<“{DDÄÁƒ¡y–B¡lÙ²e÷îÝ={y¿‰ŠŠJJJ 2„B¡p¹ÜºßÔÔÔ444444´&!!A&“ÝÝÝmll,--Ÿ{ölÁ‚ÒÒÒñññ7n|öì¼Q¶5Vû3ìõõõË–-ãp8t:½e†‹öiIIɽ{÷š˜˜L˜0N§…††vtF]]}äÈ‘¯^½ª¬¬¬¬¬Àˆ0VcРA§OŸÞ·o…Bill ¿}û¶FçñðáÃfÁ]§eVžOPSSóÈ‘#¹¹¹ùùù #**J`kІ 2a„¼¼<‹UVVVVVÖÅá2gðÑ<{öì”””ÈÈÈeË–}ÿþ}óæÍwîÜ‘••~þü¹››[qqñ‰'ŒŒŒªªªQSS¿³ÀŒ?ÞßßÅŠÇŽÓÓÓc0-3ç5冟B‡Ãá ±X,xOTTTüò勹¹ùÉ“'y—/_Ô××ÛÚÚ:99q8¨f` s&,,Ìë°¢¢âÛ·oð嵤¥¥›~Äb±ÂÂÂMûá!..>räÈiÓ¦uâêÌÍÍsss› &“êíí ßV¥¥¥---—/_~éÒ%„ãq¹\h†/{÷îåE³#òüùóäää3gÎ ÂÛÙêF³ {öìÁ`0l6;44”W;†B¡888Ìž=»é+uOccc³qãFøîØ>è<66vÕªU'..îÀл:lØ[‹™ IDAT0''§+VTUU @èÐh4ooïØØX€……ÅñãÇ[~o©Tj]jkk«««ñx<|xgee;wîõë×°=ƒ©ªªê–È h¸=uêüæûúúJHH̘1 --=sæÌèèèÛ·o¯]»ü6"B$544/^ -¸†††$)..ÎÞÞŠ[[ÛÀÀÀM›6•••………mܸqïÞ½‡³aÃ33³éÓ§‡††^¹rE[[ ¡¡áààPZZ:tèÐvÆj†…÷òï*$‰H$6ýn@àvAAABB:?~tvv¾ÿ>‚ 222ÚÚÚººº]ù£ðÉçÏŸ‹ŠŠ ÉP[[»©­‚gÃhug3à~جUã‡ÃÉÈÈxøð!ü%–——ûøøð3êêêZYYmذAW ™1cÆØ±c[ÚŸZš© ¥ª-3¯™³³óš5k Û———»»»ÃŸXzzúÁƒcbbbbb«W¯¶´´Ô××@ˆÚÚZ77·/^`0˜+V,^¼©ÐÎÝl£ÕýøññãÇãÇWPP`³Ù™™™iiiPè0™Ì«W¯zyy1 XhÌÜÜœD"=~üØÍÍ-;;ûÀvvvX,–Åb5K1ÿ{‡adddeeegg—••¥¡¡ÑÓÿ?¤“B‡Ã 6¬éqìàà°}ûv.—ëëë;sæLGGGuuõúúzèlƒ¿ &“YZZÚÌé3hÐ ^jÅV!‰ûöí;pà@vvv[å!» ^02Æ ùúú Myyùµkך˜˜´/T»‘ŠŠŠƒfdd`±ØmÛ¶mÚ´©YM 111"‘} žòáÃXC@¡P—,Y‚Çã•¿|ù²yófX±ÀËË+--Åb>}úĉðI7iÒ¤/^‰ÄØØX77·´´´7Þ»woàÀñññóçÏo«gø&`bbòîÝ;??¿ŠŠ ÄóéžH S__ïççWWWgoo ÈÖ­[ÕÕÕ[Æ% µ mA¤i`—žžÞ¼yódeeüføðáðÞÑÓ*}jõõõ‡:wWQQY¿~ýüùó;gTè¯_¿vuu­ªª’‘‘ñööÖÔÔìö!àŠ eee(qyu^›Í–‘‘Ù¹sç† YZ<**êĉt:]MM-88¸Cq]0¹ºº|ˆ‰‰­ZµjÓ¦MÝ. 7nÜ())ill¼mÛ¶ððpø&ƒÅb ôÕž={~ÔÐÐØ·oßòå˱X¬½½ý©S§ôôô222444>~ü8pàÀvTDRR²¤¤$66ÖÒÒROOïîÝ»ZȺ}ò|ÒU¡“––6yòäÑ£G9r$66ÖÅÅÚ¥ýüüvìØ1sæÌ+V<{öì"4!!aÓ¦MÐèM ÜÜÜ©¨¨¨ªª2d4¬ ¦„=´èèèèÀ &lذaæÌ™‚ü;5sWyxx4sÛuèÀRQQqtt455í—‚Çã%%%mmm­­­;ú0ë ü¸«Ú €²²ò¦M›V­Zս󎎆¦ø''§ãǯZµjÇŽË—/·µµuppX¸p¡ŽŽÿòåKvv¶Í¦M›?>qâDLLŒªª*ƒÁÈÏÏmjætwwÿþ}]]]||üš5k„„„(ŠOzzº’’RZZZvv¶““@øï¿ÿ—/_¶°°ï÷ܮ޳T>ãÆ“““cÃ#|ŸÁ_|OO……źuëŒÙ\o¦«†…‚‚Brrò¢E‹x~~x'Ož°-Q…õ3]Õ·?Λ7g©F"ÎÞ¿?nœ?þüƧM›¶páBÜDèÐ!!!¡Ã‡gff’Éd%%¥yóæ © &ÈËË————––Љ‰™˜˜øûû3‡q¿ÿþ;NwssÛ¶m^«©©yîܹ7nLž<9** ·Týõ×_¡ÔÔTyyy<^Tff&tXí ?2ƪ†l $$4sæÌ]»vDSkØŸ®bF"‘–-[æçç‡[æx›€€ÀŠ+ÜÝÝÙœ|‰t+===sçÎ Áõ ÃÝÝ÷éùf³ë—455oݺuèÐ!EEÅC‡ÅÅÅ _•l0î^¤¢¢²cÇŽß~ûÍÉÉéæÍ›²²²W®\™?>ÞÆÐа¸¸ø×_¥R© .|¨§§7a„   „„<ô8¿XVV–ˆr0KKËóçÏ{{{ËËË[XXœ={VSS“N§³J‡JOOg[¢ÒU`¤ =]ÅŒƒYíÁ¹rå >ö¤¤$gggö 4Å)l28˜®bÆó ÀĶt3bxbf$iîܹgΜihhÊObÜJÄÎx¿ª¿"ž¥]VVÖßßÿðáÃJJJ§OŸ^°`ASSƒÁ`ÕufÉ’%ÝÝÝNNNãÇ·±±ÁChçääà§ã¸G¢ö¤«Àˆ–tÕ¨FäÂΜ9£££ÃÛ;q6]؀骾áþ'S¦LQTTâìüüüׯ_ïèè˜3gNÿŸgvý tÚÚÚ:::”””$$$ÂÃÃñ¬ÝÝÝßlrÀc&≢|||^½z5ôLy ÛÒU`ä WºjTû2†ˆÒU`D±?]Õ7ÜŒ”––ÖÖÖ6”i:ÎÇÇgeeËÎÎs_êo ÃÏÏ/&&¶qãÆ_ýURR2//ÏÞÞ¾Ÿï%ÆL,..¶³³{üøñ±cÇpÑ`«Í; ]ņ7]KÒU`äp$]ÕO}w«ý&ü$oZZÚÒ¥Kÿúë/<½9Gô÷ “ɇzúô©¤¤dÿ£ ™8iÒ¤²²2{{ûׯ_×ÔÔ˜››¼Â<ÒU<ÒU`„@ºŠçqOºj„}º¡¡Aº «çÏŸ=zÒU<¬¥¥eëÖ­þù'¤«Ø­ô¤I“zzz”””º»»y)uÕÒÒòêÕ«¾·a0ÇŽƒt×jmm%¦>øª{÷î!„ ]úÁ`tuuõ±NG¥¤¤ „ ]5Juwwã ¿ ÅxžHWq»#JžŒaÓÒÒÒÒÒ¾¹¤«¸YGGǹsç¾¹¤«À€TWW÷ó®éªÑ«Ÿã­@ºŠSx0ì`')))eeåþl©¢¢²gÏ))©‘®(qqñ/§Ÿü*2™¼zõjn Ö{zzššš8]‹Ñ­§§gØË$‘HBBBýÙRXX866vÉ’%Ã^0ÒúÙÙÔÙÙÙÛÛ{ öÙàÜuÉuÖ¬YÃÛùöôôÜ¿DwÑØØ8¢å“°°ðúõë9[‡A¨««ûé§Ÿ8]‘QoØãW·oßo™€ÛüñÇœ®ø6t@_ZZZ 3 7311yöì§kÀÿxûöíЇ#éÇ QðuüüüììN4Ä9rÜ£»»ûÉ“'œ®ÿø:iiéßÿÓµŒ&JJJ¥¥¥lÛtìý€á!((¨§§ÇéZð?`4ð,tÀ³ ÐÏ‚@<‹egäfnnN"‘èt:…Bgg;:ˆ72ŒŒŒŒÓ§O×××?^AAAEE…B¡ { û¯ººzýúõ_Îùe``°råÊmÛ¶±¡ááá×®]›>}:þ–CCCÅÄÄØ°ß>ÄÄÄ ½ƒºº:¼,""2{öì}ûöMœ8qè%EUU•ƒƒÃƒú9š*àfcäã«Q\x÷"–…B¡Óé{öìA½}û6666,,Œ}õúšÖÖÖÁ½ñàÁƒ'NœpqqÑÑÑyöìÙÉ“'9~›ijjzÿþ}GGÇ—NXXÛfõ íííݹs'B¨±±ñàÁƒAAAìÙ5+mmmÃRŽ···¿¿bb¢ˆˆHccãÖ¬YC£Ñ†¥ðAkllllllooçø†nŒœc\x•#Š ïþCÔ¯ÇˉÛO[[[DDDkk+ž‘5<<\ZZ¿ùêÕ+ƒ!!!ñäÉ---YYÙ›7ož={¶­­-88øÍ›7gÏží»œ¢¢¢¬¬,:ÞÕÕuäȼ}```aaá§OŸBd29<<\RR²?•ÿøñcJJJ@@á÷Ç”’’zÿþ=B¨¹¹9&&æÚµkBBB‹/Þ´i“€€€­­íÛ·oŒŒ***deeƒ‚‚¬­­B¬Ö÷ööž8qâìÙ³ïÞ½›4i’££ãÊ•+ñ®qùüñG{{»’’Rkkkvv¶¤¤äÂ… kjjBæææ!•œœ„PCCÃÏ?ÿÜÞÞŽ*++#‚è¾ëùàÁœœœ ôçaE^^ï!ÔÞÞÓÖÖ†¿b–®ýû÷¿~ýšÁ`ˆ‹‹?{ölÊ”)222ÿý÷ñãÇÛÛÛwíÚÕÐÐpüøñ¾Ë)))¹téþ–»»»÷ïß·ß¹sgqq1ñ-‡„„HHH îpð¼›¶¶¶ø<?~üêÕ«;;;8pìØ±††55µµk×zxxà·455ùùùðññéééݼySZZ:))iÅŠ===µµµ‰‰‰‘‘‘ £¶¶V\\œU9¡ˆˆˆ“'O¾{÷NNNŽïÞ½{BBB¦¦¦OŸ>E©©©!„&Ož|çÎÁàcðëÏUâ«ÿÝ»vízöì™––Vss3Ÿ¢¢¢‰DÂEQ©Ôúúz„²²²··7q€÷îÝSRRjiiÙ¸q£±±1«òû¨Ï @€ÐŸ»ÿWïÚAAAUUUºººÿüóß„ ‚‚‚ˆo<::úåË—!•ÀÀ@¼rÇŽ·oßž4iÒ¸qãš››½½½ñ µ¬¢‚>¢‘Ïô+Ð9wî1uåüýýeddBMMMáááûöíC?~ÜÄÄ$88!”ŸŸ_ZZzþüy|´!*•Êü;€U9™™™ øãHJJ"¶ŽŽ Â1æ€ÔÔÔtuuÙØØkˆ@Ä××·¡¡!  ­­-!!¡­­-((ÈÝÝ}÷îÝBBB ¥¸¸844tîܹd2™Õz*•š››»lÙ2YYÙ/^ÄÇÇ“Éd'''„Ж-[Þ½{çíí-&&–ŸŸÿÇ|üøQRR2**êúõëñññ‘‘‘ÂÂÂòòò¸>rrr±±±•••d>„¾ëéìì\TTäééioo?”ã.^¼H´º9rdóæÍø¤ùðáCLL þ'OKK322òõõE–——§¦¦"„víÚ…Þ³g^ .ÄÆÆâo9%%…Ø~×®]»ví¿‡Å¿ÿþ‹§ëŠŽŽVWW ËÌÌ\»v­œœ\uuuxx8™LÞ°aBhÕªU¯^½ŠŽŽnnnŽŠŠÂõŸ5kVHH>(WWW2™Ú½{7«r~üxMMM|á!xa„ ¡”””ææf|#Á2337lØðøñãòòòÜÜÜ3f „ƒ‚‚LMM…„„ˆ©0äåå§OŸŽ—Y•ƒRTT”””Œ×ÑÑ133‹ŠŠAéëë·´´ ¦6ÀÆÂ96 ««ÿnmmmâOkkkâQEE‘ØØØ0ÿΙ2eŠŠŠ BH@@€8V峪Ï@¶µµ•·“|||þù§ƒƒ«a@wVwm]]]âO;;;¢¥ãþýûDDbooO´è „455qc$ó7Ϊ|Võùòpú tÔÕÕ÷ìÙƒÛš››q3àäÉ“ãââúxW?±*ÇÖÖÖÖÖöÓ§OLXX888·¥#„&MšTTTôåfZZZ×®]ÃË………øGbú–ëëëqæµïr¨T*BHTTtÚ´iø“Ä÷- Ï)øéÓ'MMÍsçÎ9::º»»­\¹²°°ðÊ•+¯_¿¾qãÆöíÛñQëëëëè踺ºž>}:11'a1ü;)===99y÷îÝ¡ÚÚZVå „ìíímll¦M›†¯›ø%|½8zôèÉ“'—.]ª¡¡1, 8b¬cý¼J°úï®®®f¾zèèèàe}}ý«W¯â墢"b=+¬ÊgUŸÂW3VI€˜˜˜Å‹¯\¹ÒÛÛ;++«··—h\···_ºté§OŸp§Vë³²²âããÃÂÂŽ?ÞÖÖ†ï 8 °wïÞeË–ýôÓO‘‘‘nnnDÀÈÈ!daaaee5uêT\%œÀ½Õ÷¼ùæÅ¶ŸwVwígÏž1GDµŒŒòòòð2F#ֳª|VõùR_—†††â>&&&nnn111aaa %;;[DDDRRRCCG»kÖ¬Ù³gÏ¥K—H$’ªª*Ñkffæáá! $$ÔÜÜüêÕ+%%%„«r^¼x±mÛ¶ÎÎN‰ÔÝÝÍü¤±½½ý† $$$DDD´µµ‰(û›üýý•””Ο?Ÿ––6nÜ8SSSOOO‰”#((èàà€“Ä¸#m@@À¹sçÒÒÒBÛ·o/((`µ~ëÖ­""".\HOO—’’ÒÕÕÅ ž|||III111±±±mmm²²²³gÏž={6®’–––««ëñãÇétº®®®¯¯ïøñã]\\^¿~7ÊÎÎVVV~~~8àðððxðàA??,<<¼¸¸˜B¡àŽ{ÆÆÆžžž»wï ŠÍÉÉ‘PWWwttD9;;ÇÅÅååå‘H¤I“&ÿ`&&&¾¾¾üüü¸Ûà›7oðlä¬Ê©«« #¾eæß¬óæÍóööÖÔÔÄÛ~ýz''§„„*•ZWW·uëÖÛ·o‹ŠŠ¦¥¥=zTFFÆÐÐÿ8 “ÉYYYþþþ~~~ââ⦦¦¸(CCC°°°žžܬšpèС¯–ƒš0aÂÇ·oߎúî»ïŽ;F4ÈM:ÕËË‹J¥Òét###æþL`Ô#çØ@¯¬þ»+**ðNYY™X¿bÅ *•ZPP@"‘˜×‡……•”””——›™™Q(”’’Ü´Àª|Võ¨‰'Žñ$À@ïþ¬îÚ&&&÷ïß¿téBHEE…X¿zõêèèè+W®H$æõÛ¶m+***--5kVhhhQQÑ?ÿü#--ͪ|Võù !äîîNtc.ƒë8<Œ,-----9Xö(,,,**:yò$ûw=¼‡¹Jii©ƒƒCmm-t¦#d¬c£ârajjºwïÞÌÌÌÌÌÌ•+WêêêvvvòóóÇÄÄ,[¶¬½½}íÚµ­­­GŽ™3gNDDÄ™3g"##©Têœ9s²³³q;Í?üÀj}LLLZZš“““žž^}}}QQ‘‚‚B||=xð`dd¤””ÔŒ3H$Ò7ëéèèXUUU\\laa1r&ÇÃŒD"Áìå|îÎ;ååå¡›7oΛ7ÓÕ<Î1nÆÛI€sçνzõ !äââòâÅ ¶º0ü-:555(--?6ŽNlIDATýñÇ™Ÿ`3hÑQ/^¼8räHyy¹••ÕŽ;عk6Ð××Ç£zHKK?zôè³çັvŽáá•ÍÌÌ6n܈¤âN¸EG]]ÓY^^^þþþ}“‘¨ººÚÊÊ Ï²ÎmRRR¬¬¬‚ƒƒƒ‚‚6nÜÈ<õXlܸO°ÂU ¤™lݺuØwQUU¥¥¥EL?ƈ´´4EEEkkëÒÒÒon?\ç ÷œoˆŠŠ2¯¡R©xtWeee<Ê8±þÕ«W‚‚‚ÚÚÚÄÊeË–‰‹‹ÇÆÆJIIýòË/ÅÅÅ.\ Nv233Ãß©­­-1ÍÐÔ©S_½zejjz÷î]99¹¨¨¨  „tttÞ¾}keeuóæÍÎÎN //¯•+W–––.^¼¸§§§¶¶611122’Á`ày‹LMMŸ>}ŠÂãNž<ùÎ;ì?LÀNáááAAA¡%K–¸¸¸ìܹsçÎ:Oxé|ã™+F\¸páèÑ£oß¾ÕÔÔôõõ%n¬TWW¯_¿¾  `ˆ¿o‡«œ]‘@_NMM^~óæ ^8pà€¿¿¿ŒŒ B¨©©)<<|ß¾}ø%wwwâ½~~~øðRSSŒŒð?~~~fffßåDGG/Y²$66vÿþýD`ÊÌÌLHHÀ3¯&%%õçØFŽ»»ûîÝ»…„„(JqqqhhèܹsÉd²»»;…BùÏþ³nÝ:eeåû÷ïïÚµëÇ+W®Ü¼ys\\BhéÒ¥d29>>uýúõøøøÈÈHaaayyyŽÙW¼xñ"88¸«««¤¤$11‘XæÌ===|µºzõjzz:ž±%##C__¯/,,¼páÞþÀ©©©RRR![[Û™3grÕ5Ëßßß××WXXø·ß~ËÏÏ÷ôô´··çããó÷÷÷÷÷¿}û¶¯¯¯ššÚ­[·|||Þ½{·iÓ¦<5´««+™L&ÒšÉÉÉ4-"""11QDDDQQ‘£GØ¡²²òÓ§OÎÎÎÄ''§U«V è<áómŒ\1˜>}:**ÊÙÙÙÐÐF£yxx$%%ýðÃ}¼e¸òÙàH ¯@G]]hu  999oß¾%¶©¯¯g0$©··÷·ß~{ôè???ƒÁ f«¬¬tqqÁËvvvÙÙÙ}—ƒRSS#>2ÂâÅ‹W­Z%''§££ckkÛÏÃ!8‹+!!1~üøÜÜܶ¶611±É“'#„bbbp󌬬lbbâš5kôõõñ{ÇoddD¥­­ýñãGô¿-F\EUU7Dwuumݺu÷îÝø¤¬¨¨ Fø¶±±!æ%~üø1ÑÑÌÚÚšh RTTlnnîìì*))Ág<÷Àí±'Nœ’’RPP8wî\kk«„„n³=vìþ=±dÉyyù½{÷nÙ²ÅÄÄ¿W^^~úôéDQúúú---è[ŒÀØ$$$4 ó„η1rÅ tvvÆÇÇoÚ´iãÆ!;;;__ß}ûöùøø ¨!Ÿk< 8u5yòdÜ2ñ …2gÎOOOü'ñq ´„ÐWÓ̶¶¶¶¶¶Ÿ>}zðàArr²ªªê† X÷a†¿ ŒÁ`ËÌ×iié®®®ÞÞ^¶Öld .Y²ä¯¿þ²··\ Ë–-ËÌÌtttáçþyÖ†ŽÕwÊüSRFF¦«« 7´€éêꊉ‰>}š¸gddüðÃûÍçÛX¸b „ž={ÖÚÚºpáBbÍÏ?ÿìã㣫«; †üÑ•]‘À€OUUUöe$ÕØØˆƒJ„Pee%3Bººº¿ÿþû¼yóBùùù?î»V¢££ÅÄÄf̘all¼}ûöÖ|pîÞ½{÷î]„PII   €»ß¾}{Μ9uuu¡ªª*¢¡ÒÓÓÓÍÍMIIéáÇiii+V¬àççC]ºt‰ŸŸÝõõõ¸k³„„B(==]VV–F£UVV–””°ç誢¢‚øÊôõõ¯^½jccƒ***"ºikkk_»vmîܹ¡Âªª*â톆†§N’””ÄÝ_8¥¼¼¼¼¼!D£Ñpgä‰'âÇCÊÊÊìííñÙûðáC¢'éòåË7oÞ¬ªªzï޽ǯ_¿^@@·À¥§§óóógdd „jkkq×fÜÞ~ôèQ99¹‹/Þ»wïùóç:\ÀBBB¡¡¡ÁÁÁÍÍÍ&&&—/_ÎÍÍÅY˜'ÑÑш‡Î7Þ¸b ŽÐ€òGWB`tE,ÀÀÀk×®=yòDKK+$$¤°°ðÊ•+óçÏ £P(ÙÙÙ"""’’’+W®D­Y³fÓ¦MãÆkmm•””lii©¯¯WVVvqq‰ŒŒ¼té‰DRTT”——?pàÀ–-[X•ƒ÷‹3‚222¿üò ®Ï‹/¶mÛÖÙÙI"‘º»»úù¹ ѶmÛpÃZpp0BÈÑÑ144ôøñã¡€€€sçÎ¥¥¥!„¶oß^PP€ß2kÖ¬ÔÔÔ>¨©©ùùùáVY•+WÆÅÅõôô(++#„RSSñàZZZ®®®Ç§Ó麺º¾¾¾ì9´þHII)..ÆÇÞÝÝ­®®Nô\±b•J-(( ‘HÊÊÊ[¶lÁë—/_¾ÿþ¼¼<‰¤   ''wäÈüª¥¥eNNŽƒƒG[¿~ý«W¯ÐÿÏ%»¹¹íÛ·J¥"„Ö®]{ýúõÇ#„<<<ˆ)¦mllššš444ÂÃÃ×­[‡244ôðð ëééÁý@p縩S§zyyQ©T:ndd„»VÞæîî.""—œœ¬§§—¯ø:OðòÑ{¾ñä£oS¦L½xñ"N]!„._¾mÙ²eÅŠ¡øøø¬¬¬>ÈÈÈðññåååqÏ\iœF<Ð!þKƒ‚‚öìÙ3Ò»¢ï¿ÿ^TTÔØØ¸ÿW¨þ`0³gÏ^³f ±æË«ÏâÅ‹?{ËÑ£Gÿú믧OŸ•””\¾|™kDnfff&..nff6¼‘"ƒÁ˜7oÞ–-[ˆ5¢¢¢Ÿm³jÕªÏÞrñâÅ’’’ÊÊÊ+W®Ðh´[·nÁwÊà³ ÐOœ uõ_Ä„j""":::ÄúgÏžÕÕÕ=}ú¿*%%5cÆ 2™üüùó—/_~¹!$!!JOO—••¥Ñh•••æææ4MEEEOO¯¾¾¾¨¨HAA7ðTTTܽ{—Øõwß}§¬¬ŒruuýôéÓ† fÍšÕÓÓSXXØÕÕÕÿ†%€zòä BˆF£‰ŠŠë=zTSSSYY‰_•‘‘™;w.™L~üøquuõ—ëBRRR¡£GÊÉÉ]¼xñÞ½{ÖÖÖ.\ÐÐÐ066®­­ÍÉÉ™8q"î_uçÎòòrb׺ººjjj!{{û?úùùÙØØtwwçääÀw:ÚÁ96ÆA`T`_ Ãå:1¡BÈÃÃh öòòzýú5^ÊÎÎVVVöôôüêz„–––««ëñãÇétº®®®¯¯¯ƒƒƒªªê… ÒÓÓ¥¤¤tuuqK#BÈÏÏïÍ›7Ä®/^¼k×.„¼¼ü§OŸbbbBêêê111pµ(ܽßÝÝ!°}ûv¼~ùòåuuuxÙÝÝ}ܸqþù§ššÚòåË_¾|ùåz„ÐÔ©S½¼¼¨T*N722Úµk×òåË544ÒÒÒŽ=*##chhˆs ¡5kÖÔ××»^µj¾`M˜0áãǸß}÷ݱcÇà;íàã 0P‰H!wwwæþü¼ÁÒÒÒÑÑÑÒÒ’Óq………EEE'OžätE`t355Ý»w¯ººú7·ÌÈÈÀ‘q÷GLI€ƒFFF~™øl=BèÉ“'ŽŽŽ›7o&’fff4ÍÉÉé«I€7nàB˜“ ,ÀI™?þø£°°°¬¬ŒU˜ëåååïïôãy$ RWÀÀ@`@<ŽÀ—òóó´óóóóóóc^ãééÉü<¡  à«%;v¬òÇ8˜< ð,tÀ³ ÐÏ‚ÎȼàæÍ›x,)ƒF<x :£žÁŽ;8] õæÏŸ¯  ÀéZ€aƱ@‡J¥Þ¸q###ƒSàrrrca\D<†=‘Àत¤ÄÄDsssƒñÏ?ÿN:µÿo÷ööÆ£`4‘Àà 6<þOCÚÝÝíïïO¥R‡¯bàj£"žÔÕû÷ïÅÄĘ×DGGã¹ëTTT™××ÕÕ êéé+çÏŸ/..þÛo¿IKK^½zUFFfXꀑƵ‘ÀššŸ®®®Â´´4b}JJо¾>>ª¼¼¼“'OâÙäSSSŒŒðúüüüÌÌL¼}RRRrr²´´4BhþüùåÜû#!££®®—ðàÁƒ„„„¦¦&¼þþýûöööxÙÞÞ¾¢¢/WVVÚÚÚâe;;;¼|øÓµ¸È‹/8]¶âÙ@gãÆUUUœ®À]ÜÜÜ´´´8] öáÙ@ÇÉɉÓU‡Að,tÀ³ ÐÏ‚@< ð,tÀ³ ÐÏ‚@< ð,tÀ³ ÐÏ‚@< ð,tÀ³ ÐÏ‚@`´ùv ´ÁDÝMIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_authen.dia0000644€ÿÿÿÿ00010010000001314311727205032023367 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇæêN‹“¶!°ç¨ŽJö¥hÑqë#’¸½9¶£íYË»cÞŸ¤Žªuô(³‘ûÀ¿j¢·‚¬ ·qæÑ»†)ok¤ÖY%_¯JvNåAÃQj Pš pæ %ˆ¶¤„ÞõÄ»à`„Š>²fÝõÁdå´Â€–‚6-Xcy•3jé•´Öà*«ê³PÕOÅ÷U•®vÎåA[OÒ-ŒUšSW)_€(Réa2gK]•­)¯è¾ž³³‡÷~swço»Ü|ÔÚhI‘„e5fyo§¹þÉáÔ1‚fT©ÕœùìÑáÍ7 k~Y­Mð;¿¬ïWÙm|¤žp s¾àh¦vúf8…‹@0àm Ct”Á©hº:n¨c³ÒƒW1$Pø3 ¼*ØÔdó0æî/ËmÁ@çD+B¯ãµÐF@Jh1ú„Q™¡FŠRÇ„Q3Ã@-›KÑp0T½«©J/ÃÀ+³B­5À«ÉÝ“´Pn½ï¸}5‹°“aïUÒd´ì‡`…¶IalPÜš\ËfÅRü\²´ëU1kòëÒdÓÁ®7ñî/Cß0P&윆zÈš2MQ@c‡ŽŠpÛž¨m3øáÇuð×ÙÅåêà×Ét…·ýõÆ¥ˆõÍ.x¢…w…2‡YOºç±Á€»ì­a„ÂÇû‚$ÿ{Y,W¿\eÙ ŽlHfN Î xÚÍ %]5”h+bjâc÷ç€òà·b4Æû~ð_ïçã«ÝcÉ&”¼H¹'–GXq¤{s0%|¤œ1ò¦)Q㬒’1CEA@_š(­s‡va¤d_gWèR+¬eXQ¦s2¤¦ž¸/Öìäˆa-u¤{ü{¯â(ÙÚéR!£W83® &lÊ*7B¥ o`EÆH”dÔ:¥ZÈ(©z´nÛ­ùÉLŸõµö¸Ô´®µïådæIG ×§~7I?ÐGòH§¨F ¼ÉÊÚHõ01Ú¡²Âz—êp”t–?÷¯šÍŠ¥øÁÀ¹´Ô:½ IìI8l¡,Õ.ò‹FB)åQ4L ¼Pë=FÑðü¢QÅdeRh Zºß‚ázHDåM·BiÞʤ„tÓ£–Eu¥làO¬f³¾üWª}Û¼”ÜÑîåû0¤‚öÔÀRf;JiЉ ®CgèµÒÖlÁŽªb³^ qáÞÙPfGRúB…f.nRYÍlÎ;¥©ëF´Ñ¯ÑP'Êκ-ˆa%ŸõrH+÷MãŽä0ö!‡Mj¥D Ò3Ëa°.Q’!¬á¨s©ÔmÇXòïMä·pª¹|hòSt­'?ín/Ó;2µ;ŸámOs,©7)º ‘­†¸‰EkR=¿·^1Ëb-£™¸Éʘ–*ëT.6ÜH•±ñî#°¶¤Ø.šívÓ@wŸ´â×]zºÉ6 ß8Dëúðy§†@2˪a§¸»ÕrY±”:ÎËŽrÕð¾V ן4@ÀŒuÞi÷£UÇ\òg„¹.ùóTýçö"éõGN®ÎÙ^ŸËµ9=9¥¿N¦Åòj¹*Î;èEvt>÷BKˆ†öuÉ{éØkJZúaD/¤&`¨X‡ ÷Âd“&ÂJxÚ›àÀ!³çéþM'Ç_æ‹ÉpKMdîóhº,:AD[MN{ Ò“-Ö9±#ÅkŒ¹5ÓQØý1ÅÊÂÆl‰mÍÛÄlŠq‡éœ‰#yaãúáÃ¥íK«…7r§… ˆÌøÑ~|˜,Oç?þm4«‚Î T¨ßÈÇI ›ðB‰v2x"%‚!y=©>ŒR›%ë ¦~ØlâÊi*rt&:cñ!Îùiï(²eµ×F¹Øzvâ+uå>§Gvå^+÷8¢vï(ÂÌÞXÖÑÊ@î© –³²<w 9´#wA3‚f}!Á°šôÓ9mÖ +ãúà¾uZM# µèØRJtJOqHMI .¤îL£Z>8ŠH 9?áuå'¸]Íuàèjþáê¤@Sqg‰H0}ƒbTœ-F+ôÛ+Áô0F¸Ó@1×=0()¤4L '““ªl§3À&Ó„»3Ùì¸1ø½vZKëuh—×lfi?Ä^©…uè™-¬Wä£> Zm}VAB xÑ0÷Y Óô³Ê>«Îª­ Y39za2Ck†Ö ­¯Z»ÏÙ».AƒNµ­o`=¤L5…”†–ÆëAJ’SÆ:Öˆ`LfhÍК¡õ…Äÿ{ŠÔ—•¡AßC¿J꘭ˆ¼+­I”ŒEJCÂZ© G4m‹Z«}0ÙRˆ2Z:gh¥•>rBª§Qð\P^…Ø6–2™áÍ;ÞL¹‡@ÅgznÝfèÞiîº-"oWúÜu¤+5úHב®ÈéêƒÉl3d›!Û ûl34)U2Ý{&^OÒÖ³‹nXI‰6SªzLM¯Qµâ-Uê…É\ª”K•2¢¾ìì Û¹â RX RÁiH½_Sn†ÖjH1|‚”›¡ ÷Èù:.8[À•Zûœ›ñªr3tèÒ;ÂŒíÞxÕ–s:Pi‡AJ&¤Æ«Î:„ œTiªŒ±üSeêø¬ìaöcië‰,8ÐÌüA“õîCóíé-³l—«Ñbõ¤éÎ×Þ¨Ý&Ú;¬õ„ÐV8jî—ZÊ+f¬ –zRX“°BEH”•ó+ªù¬îwè õV#U†Š /*tP±ÞC¹§NQÀDGš+5˜aiN¤ñqør HQÉfe»SCQyš+mÍ *žT˜> ¶å€—å(E#™¤°Ê&‚Ö[À hæVUα&CE†Šv¿ "º˜¦·yUZ`MiUhó¬ BGYŽ•“Ù¬ÈXñB°ÂõØäVDãÒ$O¯“Y¡lÔ +bÜb\3<ê((ç ¶Í Ê@‘â™…ï(`k¡ŠÔ»( "5¤“å€([ [ hª YÚBÜTÙ¦ÈPñ2 "ìÙHL£Uˆ‘ Â‚,Cìí,žrþ…‰RÑç4Ñg¤ÈH±[¤è4Ès4Øh€K±O\⋸`tëBrutð – m¶j+\z<,¢¤£Ï óÁl¦—a¸ÎIŸÊ ©Ë"_Ã:üO9ƒJÓ`œáèS•D`Oá¨a³z¥ñÉ ÑïÍÄ÷ë´EZJmîx®ï¯¾‚Ôõ‘¹¢¥9§Ê*P¼›^ði¢ª)sQ!Å¡Ãà­ íƒÉ&å ÔO¤V(Á ¢f­¯kS8™/ÆÅ‚a÷ìg€ƒ>Ð9ú4«1Éó³"JZhüŸ'xŽ%eמò6Gük4Yå ã mÿke0Oè<>ΧWuæ]÷¼;ƒYtÒfÃë j@éÖhŠP$z\Ò´¦|÷æøq㮎ÉÊ¥²ùRƒÛ2äÛž£?:·±ùEö:§RìQcº§ŸEá•6øµ/«QÀ %@J)ýÌG²‰ŠdY¦ŽÇÊ¥®ùÒÆÏo}hÝæ4«Ì¶UÆöл'* tN¢õ†w“Q”Ý€Ø m2Ú«”i¡Ûn¨2u¥ç³hãÔrÆ”SY2VqÓ5¬f1)§\S¢Ú?RNCVeÞEϬœÝ™ÌÊ™•óiF¸ïž+B1E5p’5Yä% HiDz ¶§¼M#üðÃM–ÅïÅ×bšmp¼N _‚ .woƒ×!‰êaìØœRÒÐÂÚ!¤ž?j|œ/W£ñÚ{ß=f„MÐxó~>¿ä¨ÀŒ¬˜=`†ñh¡;ÁšÜwMÆ ëhH¤‡D³íIð6áãÓb4[fÐà ̸ÁŠºÜpèýR@_Ílq$J^8‡”R›ø’rlOy›ò·Ñŧù?VóÅè¬È8‰#Õ™¡„Jú˜Vm-uìÇ #H…ò®†àDLƒÛƒƒGô\ŠÅÇÑbY,2zp¢Ç}!ÌÈÁж#¿4àŽx¸Ô$BFèDp¿œžËì¸ð›Ò—ƒ1\O¶†av‚†bb”Z»±Ž_.W_ŠYÆ n3ÃäXÇö@Ã÷afP6<·â(û–ü-(gÂí…BñŸŒ¬VƦðeÀ`ŒÐ`xÊyË ž²ÒyJJ± vNSðj-8Ñâžäe´`E‹ØKƒ†ÑRaä¶1ˆUª™€#¦1¸JÈÖ”·‰¿N¾_^døà iT‰bÆN Ý“H!ù•üÊFF‰ÂÍaÃ4CkšÛÄŽ”œÑƒ3q´Z_vÀóÅÕvè0_ó‚‡"3#Ynkºq/ä÷ùYNð¨”ÂŒœ­NCÍô¢ !UrÅÚÙ‡jÆ$JJFj)•5t΂/5¯Ój>+—:j#"£Ì“Ú"?Ní‰%°wšx*ÅžP¢{Ç<4 ƒ÷¤« 𢄉ƗÊW¶‘Õ*:sÓh}p£DŸ•(|êÍ¢ ä¡$v]Æ9 ©v§¹µÜÒ8‡`z€$'m>À3.Î';ÅG“Éé:™3ÀHÕlV.¥ù2©ošyx]†¤ý„$½#H²=@’×¾LãíKŽˆ”†iá}pIÞ«ÔòÀz~Hªd³‘¬)[QJ ‘2"í%"™!’ë‘‚ eÓUÃn#y_v‚M±`µJÝ|¢ß‚TÉe5 ÉÎÀ¤V&R¤½$»#@ò=’u>%¾ç™IÖ…DH«„HNj:Ý4ªm"ðS©šËê0’-?˜ŒÙDʈ´§ˆäv„H¡§Íø¤€Ö[^@Ò6–„ŒòÉi ÒÑyºU>nÁi«b³‘¬¥|ʸl#eDÚODò;B¤Ø"IoË ¾`/$I£SGdg´I3¥R)Ôl#´]Ígõ¸5qBK“2&í%&©Ý`Rìe"r°iàƒtQóÎÜ´’N±’‘šFMèt©õF"WòY±Ô‰(}J’6gdLÚSL‚®˜T¾žŽ®ŠÅÏå üs¶ÿ|ðÿA_‡ummod_perl-2.0.9/docs/user/handlers/http_cycle_authen.gif0000644€ÿÿÿÿ00010010000013372011727205031023402 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§W’-¥¥¥£££„ßEŸŸŸ›››™™™———•••“““‘‘‘Cq#‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWW  UUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôòòò\š0???ððð===îîîììì999êêêèèè555æææäää111âââàààÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzz2xxxvvv#tttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷/NõõõBBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&××× $$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½lµ8 »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠVL©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœMÉšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=ò‰"ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîwiíAöK d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(b4~PX^g¿DðÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LþÒãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbúK¦þŸ¼ÐË©´Öjë­™¦š£}ú!®¸ð)¬à©Š’ˆiÊ Z¸°†˜/à*í´ÔVK§®Ã­ŠÙ§D;$Jà9CãŽé­µè¦«îºRbû¯Š}úBE@ä#3¼@$D¦PÌ*/äBH¿ÿ<ðcŒ 4´:$#/¬+­ ¹‚/dÌ‘ ÈŠ$¾úò;¤¿ üd¹E&¼pÃCªÀE -{ó*3ìð粫óÎ<[ë®gð&ö) I2‘ T@dù|!,E2í4ÔCŠb‘",ÁD®‘(™óÃG™ôÒM?}ò‘Vc}p*p ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§1$銑4yn΋ùLÆ·Âõ‰é ØJê}x‘•Ѹ“(?ûÅãK>ä>¥ ‰ŽCþ‚éŠû-ûì´#úsgA#&¯HnNdçŸãû³"Ùù‘a©9âÃ{¾ö.¯$ is|ñIê]ûöÜwÏæíœå~اòÀrŽÜ?°óE#š™‰ÒÂÇ/ÿ¹¢P‚d%•ÙÆ$DâFöGbŸûàç<ù1 eÞª_’ ‚L¢H  ÷&HÁ ê pÙêÓ¶nö>¸"cªp‘ ñŠÌ@d_@E50ðTÃCR! ]Ã/x#4XÅ)B "iÂþ/@ÄA$ÀÂ+<†Ä‚T#c©a OH$¶ð…LZÆ2V¼æp‡=$Ò‚`$/ê‡Lt"-ÈÆ6ºIàÛŒø ã«7ÚñŽxÌã¢ø$êñ€ d㈙9¦Ž‚L¤"¹3B^Æ„A$#'IÉJžÊ‘–ä`$iÉNzò“ŠÂde4)N^Ê5H¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌ\Ê£T¢¤ )cJKQ`†ˆ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎošÃ^¤Jæd– ˜fVŠ6þ†>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠ"T ð•<%CϿؓRø´¨HGJÒ’šô¤(M©JWÊÒˆb™|—à,óÑI…´¥8Í©NwÊÓžúô§'}i Œt¦2ú Î’Â$-þ…agKÛÚî± RìcËÇ ²À`Á>…«ÏS蓸Ä5np;Ü}ž£%nlmKÝêZ×¢¸ý=åGPWºÒÍs}Šw¹ämî>U].á*P  Ï\³¥Õ~ßßùöS¶× °€<Õº&ö®rÌ«d|k(àþ`³£õ§tû9áñC‹ho?1Ñ…}Jâú4Áôiì“Ãñ>Là»xÀÙu‚ ©àÈ0¸PßU/?+¬ã}>)„A¥ [`$Â¥8…#ô9†Nè3eØç‘!¬d~²øÅXÎòlc|)Ý:†·{¹1¡rláïX •.þ)ôY‹€ªâ Èp?ÛÐ+kùÎx~+—-å寀/b™Ñ{æò˜Ç•.€; €ÚAà?]ç<[úÒ`Ýs¥ú¬˜?ß%Ђ‚¬&[Ùi à útgKAÙ}ªº³­.mgIÁŒ‚¶V´Õ'0  €éàg,fÑÏ]÷ú×ÁF JñŒÍ:ÓÐŽöO5M)N'ÆÓvu €+ín{ûÛ ¥ö¤¬l×EÛ€â6¸/m :8ÀA ñ€p ëÎ÷>Å-)rÆÜtAwžÔ­ï‹Ã± C’ñ‚Rˆ`š0 Š0z £÷À·[‘€Ž{üã ¹ÈþGNò’›üä(O¹ÊWò*ø“ß‘ò·a>ã‰àðÑŒq° ÌàŠ/ì‚b¨Éëì¡„¦;ýéPºÔ§Nõª[ýêXϺַþôuзŸ0åŒYc u7S8Ïyu§Š8ÐÀ´‹321Ž[¸Céߨ‚Þ÷Î÷¾ûýàOøÂþðˆç{/¾Îϰ'JæÜ)»šÎŽ©´«¶H`Tà ´ô f A­½:†¼'þô¨O½êW¿úÅ¿ÜÀ¹{&%ÿ(Ê_Êò—/ìšÐŒ,°…£@‡HozÖÿøÈO~á]vØk—Sœí™ÏÜ XÝAÜÝþB‡w< «¥W¾øÇOþÖ3~ßΗñvYe*Ü[_®gxGä’…o|?ªá/¿þ÷Ïÿ¾3¿ñé×e²7J´×+ÓwOÕ÷~Ôå Z@tÁ j øW|ýWˆ|ÿ‡~0µ~Ô~ ¨€µ £`îÖUùw*¸‚§—úäx¶3€ÊT€ñr€ õ hXûÐ ¸8à#€ (H,X„Føw. 0x(G4'6w'î—ƒaU P5Ð 0Ð 4à€ `H°¨æT)x„j¨†I¸„†Ò„ƒñ„q…v2…TèU_ 9PzÀUÁz`)p¤P O•†þk¸z’°‰xxm€|&ƒóDƒBcƒ6…ƒw8W€ VÑ ¢@²_@ %°é@P°pœð %P‹0tЇH„Uð Q?ª÷í0|a¿àˆÆw:ЈÈ(ÊÈŒkHŒÆ¸w‘¸Ð×G¸‰…Å¡XC  ²p ƒ˜ Hp7à‰UQX1ˆV ñ°‹~×¹1ðqP ª÷Èwð0«ÐX€|þ9y‰˜Šw~/(‰›F‰e‰ºƒ‰I¥‰ÞW:W1 à 0'@¶@'   VáŽWþVq¥PŒ `„P€ Àù`òn Õ#aÀ [` Ô0ÎgÆ …ˆz‘ePWá°Vð|·^Àˆfz§ Ñ¢ wŠòP“ê w†Ð y°°à{—ÁÐb9{wŸú€°ðq9—uy—U—{Ù—{G `¹fp‹(—UðŒÿ(™|é—{g–h©–UÀ–á–UCÅÒ×éWE’V1 “ O@ ¤@œÀT!“S“V!œT‘%±ø`sðë è`dð ^À×`ÑÐ Pþ Í€‘ŸÐàP¬ÁÀT w~MÀ¯ðÁ wÀÀ )P —r©ÃÐ[PÐTŸï@Þ w @EÀÕðØ w/`žè)ŽØ˜þ  J Š zÇ ©p aÎ虈`Ÿp0 ú š UОïŸóYõyŸù¹Ÿ®YU°IS¹U9›bÅqWa§0)ЛSÁÛ÷µð’XñÛGHqjÐ ¬¯Pæ¹Eð ÁP M° Íð Ó€ÚÀ`f€j°ï0ö€ŒHlðøHyPUàþ}p zg Á ÖP‚GF…ð{‘|—‡°–휊 {‡"P 4nPpÐ* wWÐ Œ9˜ª©œšž ªnÀ/ wYОésY © ›Ú©Ÿªwú¨‘:©ÿˆ©„Ym‰V9>?ÊVA*¤_eøÐ¬p¤ 0”¤S‘¨€¤"ð $ ²Ð %Ð µˆ U±©@œ L ÷P °@£gQI` ÈðÎ0Ô` [À a0epkÀp õ°dà§?`Œ z°wk w+@¡! ¬ÔÈŸ00 fþ²U ÑzW{j¡Uà{ǯº²-«w0[2ËÐÛ«ž ¬´!³"K²`²(‘¯§ª}>*›Ø:V ³/À¶°)À° \Xð?…•J›²÷# wÔp ñ¡÷ Öp‡ð{ЕJ }טâP°¨ÕÉ §Tذ•Ž{7¡*—ƒ[¸Up¸~÷¶oé•9—þHzdzp ¹›‹·zË·~ë€Ë¬UûšÛÈ]Z»µ`50kˆGPxA ë° #VXãàr=…•p ÷)W°wžZ¨ð Ð z÷ 湫þð o€¸Uð!Š :°- ö™ [`}p †P›ù- op²U0߀ ·@²« Uð {p +0 á)0¾å{¾é»¾íû¾zgpÏ+s ¹AÀÁÀˆ‹ ¾áÀ¾î ¿Ô Ö‹½Ú˽Jà½à»£vÕ£GU­|u­´ëTõ€údd  wa¦ \@À@ ÕÕð¯:…•Ñf¸wY@b€Õp{Wè³ñP|Àw" ú  §°Ý ï Œ°Ðà^à~àžà ¾à ÞàþàŽý¬ã­‹5­tÔÖcöÖé]QH ð LuÊ@PSðÀ+… \×â.þâ0ã2ÞtvÔ%¼Ô±ÙÔÞRÁýSÀTE dµÀ?¾ã9õØ„Ù1ÙoQÙtrÙHÎPY€âîÍT0À Åß­0å8¥äƒÂä€áänås"å^žP‹©r… öÐ æ*æ‚"æAæmaær‚æþr^P›ZÎTUp†Ô\ÀÙ}^Rt(vîxÎz'|žèE g›ÏL…4€PÂp¶’@é&µè€Òè}ñèkép2é îOb` NEPqÐÝ«.R¢ž'¤Î¦®¨þ&ªžëú4ÄLÛ„u©@ìØEáýfá»…á‡¤á‚ÆáÌP(ËPe°žPÜú Ø×.Q»Ž'½^ÒIÔjÖ>îýwÐêðTI`^P+lîîUîwrîxñëiìn2ì¹ÐåO í®OWàÂ*6RÔp _ññŸñ¿ñßñÿñ ò"ñi`þ㚌ãY«ãüžPé°úÐa´%ŽZRe°œpó8Ÿó:¿ó<ßó>ÿó@ôB?ôD_ô9¯ NÞΤbð ^È*UðÓ ñ@ReàáÝõƒ§ÛÐÊÛ“‡Þ+?PmÀw0bPåàP˜P õ\ïõtïw`_áb_{d_öµ˜( Upw õÄœõ"µõuŸøâ €J/SæÍÉ{Ï÷þth‚ÕåÒ¿0Rˆ¯ø‰÷Ïž÷ù’ÏO0BUQðå (^‡?÷œO÷žsÐþeé¾Ië¾m í]îTUù ‹ ݵù±ïõ³/v _ƒ¢þ?úÀ@ !ÞUì uwÀ:|ü°Ÿüá½üWû~vû¥”ûé¶ûÄî YjÝ– °ìÜïýÊŸô°ûͲ«òÐïO’ í]õjQAŽ_iÀ D˜PáB`e¼TQâDŠ-^ĘQãFŽ=Jìe@¡–_LžD™RåJ–-]¾lùË,š5mÞÄ™SçNž={`ÊçP¢EþŠSéR¦MUR°ÁPêTªU­^ÅšUëV®V“€ ¨ëØ®\È‘M˜ &´ ^TT.P8íÞÅ›WïÄ#K:X°L£… Î T(bÆq"Y²R¨m-_ÆœYsÖAº þÛÚEÌ!–ù­Å¸3~ˆñºî^Úµmïí›ädÞ½Ov\¸MÅÆì[¹äÊ¡?‡]j¤_ߊ„ Bª² ï8ãÝU±”²<ÅÎUI¬Ý+ƒ ŠÐ+ž¾eý$nðbÌ€á6Œ(7„v[®A§€;.BÊ“°B’s0Cʢ®C?ÄŠèqD®à @³ (‚+$„I‚˜%Œa‚ dÚèæ¢?Þg<8hÇ›*y­:fç*@¡§ªy›*V@ŸYZ0 k ò€&Xxå`$Ó6bPC5Y‚ÐB7w¢ðÍ71\þ³N”š31O==DUöÌê4sfÞiçwâˆgzê°çŽ;ðÉCŸ=øéc.MBG#'Š«™Ù"ÂC„RhÀ*ÆK¢ ȃH’)…‚Bþ(3W½Î4(M;ílSNaiŠsX éüµN<e¶ÙË–h‡>Á£Ï\EGâ)‚ħHñÊŸIr #wÞ0Ê—Ÿìòϯ‘\ÁžšFœƒ&=°ùú;äÏG?q‘t[œzßÞ1èã/jz÷³{ý¥C RÜŸf¶ `Ø”(_úþ¸@ˆ(ï~ïkýŒ3? úÄ~tJþ¸AÍäã4 ¹Þ"à°EÐÀ4È@"Ïœ ü*8¡ Ìð0„áR4ÈA¶……þŠð‡Í0ÀXІ¶ ®…OÔÕ s8˜Ú°1´bNp8Å—ì°‡_ÜÊÖuèɌր± -À h‹¡8ÇI‘‹ªbƒE=Úd‹wd‰Á8H« …„$‹Z a¨(_@‹é8IÚØK‘aRCMZ0)—Œ 9J…ÄÐß9±™  à ' ãh>JÖ²’ë[Pû@©”LvR'|ìäwþyQ’ҘĈÆ ¿D¼"4%2ˆ€’‚HÒÒ–×¼‹%‡“<úr(ÀÔ¤0·YLcŽ…ÍØ8¬•c€ð dÔÈIbÓžÑæ6WÒKoÞœ}ç0ÉYNBšrÍŠ z‘Åd©ç=%š<\¢I—údS7ûÉ“ê1 »(B{-xc0¸‚f¡„¤(®DˆX°R†7œÂ¦7ÅiNuºSžöÔ§?jP…:T¢âôíÕE1ª~n”XœtêM> ÊŠ”ƒ¦áBJ±G {0á:þCƒAÎÑ .„#+ÐÈ@ZÕºV¶¶Õ­o…k\å:WºÖÕ®wmë2Ù·þÔ—4Õ©ÍâT/YU«°‡ô·hÐXH^ ¹£°"_Qâ×ÖŠ‚$a/{=$ (’­T1…d!s¹Ã1ð‚Ô–3³š5 gûéY‚öŽ¢­­ÕdÚbï ÐLk),âíŠ+ü€ íi"¸¤¼-nuëMÞÎз\îuf1¾nú{œc w€… xQS"B¼ˆÌ®f·ëËîVð»S ï}5…iÌ ˜ƒ;37†,d& ç8ˆ&€„ठ¸‡€™_¾î·“ý•às` ï‰ÉH!1d1ñ¾8B6þ~8'Ž´F‰¿Èá¥zX“ ¦ŸˆaHbƒG”Aµ 5jÔ€f ‘a„H¢}P„M†€:̳Èûã1F}ÜG ÇOÈ$ò—±³²‘A5Å)¯·b\çW¦@M€j¨™ƒaÖç˜õXæèùiö3t’€*5lÃ&†€ ?÷7d†ù`H#ø€ ÐÄ4–ð¹È!3ÇT LÀµÊþ\°w9lûqǦ^²Á–|þ¸á(€Pm ŸëF>tá%ÓÉVA,>p‚ÜàGx¾p†7Üá‡xÁ½,nP’{†æVº—§îu“… `‹2X{3Äç¬AšË‚V!D»Ê¸•phÂ7ÇyÎu¾sž÷Üç?zÐ…>t¢ç}Pp¿”ŠÛ/X¼‚?šÆ+ÇñŽ£ Ø”?q]8à*2À¸ŽQMÔìáGÒ)~I§Kê“:ã¨^u²ü ¤`ìd. ÈLàH®€|4/ûÙ‘´ï•éLÕhTqòvŽis§{W”kà P…2‚èþé5 {âöÆçòñ—¼O(o,Ë ó™× 2ð4xÙËc50#‰d…hAêW¿üÖ[ôõ)i;ýf?¬Ú#ìö¸ÇJ?€’üC–V¡®¡üå/¾ùI}þf#ûšL_XÕÿ×õ±o àߘCB;¼zhìÿ*K ‡>¼« »ò3?µ[:íZ?ö“÷“øKù›?ªÀd n0@¡ŽâÓŠ4@ÖCÀôûd?œ“O"Á/À dˆ$¸ƒüà mÀŒðš¬èˆ±T½ĦóSºl:Œ=tü•tA…` P¯ú=²Ð‚5Ø ÓhþÄð“* †pt0ˆ‹MéA‰ø(°,øj€ˆ?h‡1`¾\Áè‹#´$´%\B„€ `"ÃJÌðœ­pÎñ?,CˆÀ–>°ƒ*( (6Cp Ø Œ‡7@‡è C•Q< \;@¢Ãè±Ã ÁCeá=‘©¡Ä *‚ï# áëŠôx¨¬A‹p*Àº€ù û¨‚Û€a¸ƒv6Œ1*¸‚úx€ˆ€´€¨ƒ-©7¹èQ€ˆhœF+¨FˆHªa÷Æù¨ˆ`„kÐs(†wƒCh†É\ÌË×a‘*¨Àß¡ÛÁ½¬vˆÈˆPÖ‰ˆ, 1À‡j¸€ˆ¨*°‚<˜ƒ\(;þP}ІSàIw…WynŠØ™Ú©cÄ‚* -ЇpP‹ÙP„hÀ{à‚WPb]PcýÒÎ ÓØ[ViVì«‚C‰ÂϹ†{cwÌ2­Š@¥ P\=™!2éRe@8 YÉY§Y3…†:èЮ(È‹XäÔV‘’|}X<88x9H†2ÉYÝÙ_êÙ¨úÙå(YÜ“¬ 00H²'¨)¨È¼´‹n ~˜„Å£©ƒ[H¯-Öç;V¥IVá([å8ÛÌÛ›à )˜¶¶@†X°Œ óƒ¹õA³ûZÁýØÝ[§:\Ë Z¡uŽíøÃþª„…d–˜`ø!ŠŒYº½Ü9ÊÜ×Ü£)Ü¥‰ÐçKܪS†h³Ö ÒÆm HV­P‡p ¬‹2DŒ]‰šÝǫ݂¹]ÇøÜÞØÝŽ ¿h(±%xƒ*‹' E'æm^{z^¦‹^™Þƨ^Þ¸Þu[„íÑŠ~˜†Ò €iƒÐR(…ià_Ó†ýíßÿ5ˆð_0…QÀ@­Ë`†¸Œ'èƒ;`S†Ùò¤óUÀ°MŒÎݨö­žÐ]ÍHÝ 86ˆS0VafÝNáƒ8‡Њ+`f1€Ò;°8òÅ`[ÒàäàÉóà~aæáÆ êþ„žaƒÈÖb®â(6ˆ?ÉŠ5ÐË@…âÍŠˆ„ ›¤Š b(âÛ\î:boJâÈx_p3-HÒŠàßR`„Pa…øc-–€E0‘)x‡ßu‘C à ^ã \Ú}cþŠc_šcüYb&n )ž”Š?d,d…ÐcH@ØŠ4;´P†Bˆ#/K¨Ì…ˆ³å[Æå\Öe]FºŽÕÜ"ö§J¦Ü}½:þ5Š(e-NˆP¦â®‚”g臄&²ŠH„mæænöæoçpçq&çr6çsFçtöæ‰óG7fâæp"æÇ3fV‹ßVþà På…pfgÎ ƒ¶H¹å hh/S† vKMvŽQ¼£ô5–õœyfºz5Xb ­ú†ûEôg°n ‡æ"ˆ‰FŒKŒ´.²2€ZÃóÚ ]¤©`€ìÈ–ìɦìʶìËÆìÌÖìÍæìÎölÊfçþ¦ë§Z ìPÊd½ÎŠ@`B€¤ÝŠã E¨\†ƒw«Š2˜ƒYàíÞöíßîàîá&îâ6îãFîäVnßîe×ëÑì:ë¥"lëCÚ a ‡U‹(‹iØ© †<àØFˆˆzdjãší,ëÏšnŒªî+áIà g˜´¨‚w¨àª@‚@œŠí€°“±¦ôfãH†^§&³÷î­øÖ§ùÖ0²Û‡¾s‘ªèD¥– ô6ðôYo1SðAcpïrðqJmÕ¾ŠÛ)Ýý‡˜þ&@ƒ–Š‚ë /ðg¡´7µ÷¯¨Gqª@ßñî JG@þ ÅâŠ~hl©µ]ÇqäÑqRãqbóñrò!—Š+€uà¡F€²H0 e¨Š€Ô¦ò*Gœ+¶,/·-².§ª/ó…¿ñ/>…‚6ï„t†ˆs9:7;¿8<73=,>ïó„xÄ gàßS…BïDfx9Ñ.¦ 1'sgô'rôŠƒô§“ôB£ôвôK?ˆ °Ð…(…ƒhƒ`g®‡dîŠ$¸¿ªØ€[$ò½csoõzu¶‹u·›uT«õߺu\Søj…èõƒ0ƒX‚PpŠJ@VØ€h†0l@ þG"r7w\²ƒ0P †Pð_þp`P닸ÂèpV?IØ}äh'Åi—¾j7¶k¯lÇõYà^7ˆ$F0L肃*3„ 8ˆ ö?þv` y“§²WhH$pݼ& %T7Éå—?ûNW{?¨Uè„@˜'g~Ùö&X¼ E`x‹°h pµè›™múŽhµˆˆƒb8@_–äöŽnéÑúþãú>GØ;ˆ®†p„XE—?ˆÔ— aØ‚hdf6mhÛ®¨àŠ)€`¬°b¡yiÒš©{ÄG}Œˆø`Gb„ÆO}À‚ÖLþ{ÌÇ}DõHÇ÷àÌ*ŸqþaŒˆs\öð~©Gìg~sä~ôWPçÖYèÆúŒëü!ûü!_‚naK„ˆRÀž5°ƒ¢ r¤ð‘….~™¥áB…#2Aµp†°Œ ˆe,iRa‹'W²\Yº&É–Aiö,+Õ¼ ©âó'PE`¤Hñ€¼*úPañêo>AÑ+¢Ú;l>_þÆ‚ p–6}Õ磣}êÌwÈç±U>õW…ªU¬Z«¤°¶í[?š8}L)S§P¥òUËÖ-ÐÈ’'ó ¹PK€/š7sîìù3èТG‡þåGêÔªW³níú5ìØ±Ãš’mû6îÜ¿"îíû7pÏl´,nü8òäÊ—3oÞ€9“#ž¡È2°Ñ`H0¨B R:…V‘J1ˆ…ÂD.R„*2JŠvîÞÁ„1¢< p ±"jƒ5Í-ÇË]±‚r„µ ƒ ª1ÙOB5˜”6í•dò"”BnTG*øtE/bUxa†ú$T3pDW 4äQ‡þ‚(â‹Ä” $S …üQÅŠEµ¡2Bø$e–)„YpUZyå¦å¶%—]¶F›—aŠÙÚnXšy¦hà ¸&›mºùæqtœ ¡W§Ip€§q˜Ü‰œˆaòÈ;ì´±F:€¥PIUiú4@ >U°ƒ2:@>?1"–¥ fÚ#’Å@?Œ¡)§ :9)©F¶=aéB¥—žJ«­P ûSeQ‰&²Èj9&³Íª¦³ÑêÆ[²Õš©&ŸÙj»mƒpK¶n‹‰AÍ‘#sRx£œ0±T†"ÕcR^pÁÍdjP‘6ÈüÄþöâ;¥3Ê”¾üú;kÂ?Ý#‰5÷òÃðÞ aÄà [ìe™Y;rpËJ{2—Т¼2™Ô’üroØr;3Í5·ôR x†rJ5‚ÌÌG>Jâ‘rI0·?{}¼PžÀ Џq ,xóR8/´Ì¼V1Î7¨Ü’ë*ŠTñË·¬0LX.¬@Ö[wíÓ'G%J>I@5+"\ñØb“mvÝC¥€7Ý]­°Ê7opƒµÖ\{]øÝy{ü$ÈSŠ 3ç ™Ì2诩:èev~ºpÄÙ¼:ë5‡@'­Ë~Òê,§JÊm¡ŒÈt¼OzpzG?“Fƒ=\¼bþk ZðSaaQ7+ Á=ÕóCŠ"Ë7ÿ¼Oß0˜‡>±à:_üýôÕp½ù ¢¯):–ÆS/Šï¼­ê–û]B™ȱP§ÀÏ‘®¨Of:*Pf³» ›Ã8$ƒBX'Œv`C9-èÄ4ÀŽ•4­€.|! c(Ãzì€ÀH ;ÇÀ†‚pŒåà¤(L±&0‡«dNP—¤"Ç¿XH0 ¦>µ¯ýŒêVCU¬Ê檄MV›¦®~µ±'Q”³¶ã ½Xks‹æd5[ç6`ª¦=-jS«ÚÕ²¶µ®}-lc+ÛÙÒµ}Xç ©Øß ö°¢k©om“ØÝ~†¦Žul\Z¡œR ¸À'ñšƒó&Ç_HŽ<¶‘e +ÉÂ,ò«ßýò·¿þþý/€,à¸À>pC2â–L ÁÍa};\sƸÇý*å¨à$Q@Ð@P…  ƒÀˆÂ ¼[LtA!’¸Ÿ|œ0¨ÁÉ)ÆJ‚ØøÂ>6É),šÞ>x5>ì„…ü ÿX¢œ€r@lNŒWø„Br¶ã»R)Â| /„¡Ô2Šcä,¡¸FïèÚä9YÉŸ!r‘SsdÂ&YÈLž3;Q ÊåJã$Òðlä;‰¬ÄËÀ¨Eq„Q‡¸*çH—Ù´É2šÎºµóœçÂwÔ-5iþÜéb®P6^WkÀ‚˜þ!ÁN°E k Ðx€Š3‚–ÃÍù„Fã‡Ë"' Z.I3ìU·Î¨Þ žG½g¬ö™Âª¦¶'c€B,§ ,(E NPQ…`à îȈZQŠP<¢Ç%(Å3»l§;ß Gä´BŠ&9î [ûÚYµ©ëÒˆ«¦Û þöÂ혢Ô ÏÞÖ¢‘iã¸CÑÉéñq˜Ð\“Ôȸc~ílçyÛUµ8q1s&é…SA3X°93XDrÖ€rãpƒ%®@"vþU™£šæE¶ùKq¾[K½ˆ`iÛv†8cfêär$Ñbä(½Æ¹þB;Vn’ Và$Ì`Þó®÷½ó½ï~ÿ;à/øÁ¾ð†ç{¦©j«?ë+Õºb¹Þõ vú™¼qˆQ ’G£`É(Æ´9 ¸ô¦?=êS¯úÛëÓ× ãƒëxƒB>°’Çüìz÷;vNA+TŽ Î‘Á×…`‹~=>?ûú‡SœÔo¾,j¿ÕÛã¾uñ3z|TY9EðÙq€‚‘¯¤œf %`ã#¿ý°TþëcïÛÙTúR¥~õWÇ,ʈùµÄ$pTq@3 ˜ƒí°Ä#@w™„H¹Ÿü9œüý}“ýÉþåÍ0àƒ²Ðþ¥‡P¼ûM ~QÎÄAß³”š n Juàn‹3À;HT1„Âr<»eK–Ä! ¬` .¡?á–âÙÙVr“ &æ`¶Xƒ»”pÞ;ì[rTôµD"äØqÑ´D€J„!1!ÂÐ V] ÊàÑ ôU!@]!âÉŠ9ÃpA,¤€Cš$bF4A G¬]q$Á8TÁqÔC7p^qÈ,Ã8–#9Îáây¢ ²ã#¹ã,Ác< ˆœ$;µ# Æ¨Á„_‡:päqìƒÔpÂOÔX5ƒO8'túb”Åbø„`Æ+†vFagšcë¡c:âdó‰&‘&™æidz™ÔÁ"4 Ç(œq$%9\Jƒ<ȰŒAf/pOÌã(4ç,Œ4èt>h’`ˆ†øD I‘Id(‘Éxþ’ç‚™'ì¡'Å©g±§¹ç{¶T"C‰Ã«%Ç\^(Ã7.2x°A"B€ðÀƒ <ʰ|@ƒ@a¨D†“JF©0È¯àŠ®xMX)ìJˆBÕ9’(hŠ:Šæ‹¶èJP¢%²“ %rÜÁ!‡"„Áqˆ&‡ ¼N8à¥OPC7€Á…´ T``€dªdÌdLLÅ\LÆT£Z ÆXÎxz&……é@i•))ššDD; $GÐÃdÃqA÷¥œ@#ðiˆÂ`˜ #pAŒ æÂ)¤×äM¯þj°BŽÜLŽâ0ŽþãÌE²6ÎÁTê—š'¦~“¦’§Vc}jÍ„jC!dø2Õ·*‡0„ÖžF¥°¬ÏœTA2„Å£„Á* ÃÔÁ3L‚OÀ«¼Ò«½*óþèÿü+ìOÿt©¥2Ø´rSµ†Îµ¢Ž§jëBp«95ežƒ&(!Œdh­viMF+:&l.-lé¸ ‰>,ĄĖ<Ð SêÃ4PÁqD@$‡ Å>Ǭ¢+ÈfâÁÉڒɲLÞŽÊ®¬š²ØæqlÁ3ÜbKTDS´r8‚´C=´D ÈSq”ö²‰G520ã‰0_*1_1›2÷’73›DÄA9¸‡7äÁ6²ð#ëÇ!,qIøK¹(u¶õß5õƒ!5–¤tF¢,n&±þÀ÷²„ŒdKX°µD=¼ôI¨Ãƒ0ðX‡u!à ÇðóÍð£ZÇãðtoו]Kðgq|Á̲ÄÓˆk`ƒó`Óaa³F"¯Qb/ßb;c4„0Iƒ?¯8ˆcK€Âhµ„3`cq¤ªq¤ä‘IÜÝáõ¶oÿ6pwp!uvD~¶‘™up¡õ•”v)ÎQÐü!´aK0mOïZºI^—Ä Ó”ƒŒ7y—·yŸ7z§·z¯7{··{¿7|Ç÷xo‚™qß$rÏàa£òh¿žs÷aÀ;ý’ @rì´I,/Ä>Üuq£ÕDµB”A6D†þg¸†o8‡w¸‡8ˆ‡¸ˆ8‰—¸‰cøÔwIˆõç’µ*·„õ·Ãý7ÂÔsc%A.òÁ ³D¤qK°tFøÓ\ø‰'¹’/9“7ù’§¸}»ð ç·,„¶˜0·B¥óf#‡ @¯yÒ pµIÜJ®ìjktI”‚EG´Y,"¹“Ï9×¹‡8”¯ø}“2•ßá~³Œ_ç )€fcôBvK(B ´„7¼š„­"4ƒgDcùo:§wú“«x sqŸW9Œ#Y £Ú  &–yÒP7·‰8¬Ã¥„4€r°¬[Hɹ§ÿ:°{þ$äy¨K«‹#c©óÙ©ƒZª{`Oÿtc)V—1ôB›Ÿ!`sK 8[Šm÷º°‡»¸Û9±o±±º•‡ –WI³ç_"€+ü<¬¶IšfÄ(P@Ùu=¼É¬Ã·3À°¯;Â'<‰—»æHùGPºOÒ²ÛY»W_Ü;&‚ÇèvFÀÐC,˜€´„p{I,À &‡×þlœ+<ÌÇü‡3|q;ü±¯c²sÛÄ+YÅãÞ= Æ/-q'Ç'h€4À¨ h­IHÁ:Ô-Ÿ´K4|¸g(€Ìg}‡Ó|nÙ<ºçüÍí¼Ÿiù–×%*:–5Ð;00þ ¤†2d˜ƒÃt°I(ÃÈ­BÌP=ˆ[}X̉σ `}†ûÀÕk½âg8׳8ñÞ†ÏÃ&X@Èð¡ R¤lv•³´i^A‡!F”8‘bE‹ø¶þ‘#0-¾„9’dI“'Q¦T‰ò—Y/aÆ”9“fM›7qâÀTNŸ?ýaeQ£G‘–¤`£cS§O¡F•:•jU«W±f…º5­_¿¦‘–£³8//x óTÙ::TåÕàSÔ2Ù.ú(§ÀÒ„‚óv H$0Á}L˜Ð»&ÈÀ‰ˆ‡Môf#8€¥ÄÙ&_=št釟~Lºšuë/-ƒÆ–=›æÎž´qçž9Ôuoß)—’>œxqãVµHsœùÕ4x¤Æ¢¶§H€U¡zÈ ö¯,ˆY¥Y³gѨX©æ%ôD¾>"íòä°1AÊ‚ ÖؘHþÁø=)G1Ì8྆î³Ï´d5§TûMB aÓÍ c² à cãmÂ{ ®¹I,±D%àÃÄáØ‚*HêšÑî)DR¨Š;À¤Ž€ H0AýÌ?ú–ÔÏ!ð I$¬ÒÊŠl*B¹DªBÁ”MÃ0ɬÉÃ.Ñ,JÄÙlÓÍ©l 7µÂBªþpCª”p&ªgÀ`ó (xD9àà vÚX#Ú“´RòÈ&—TÒ>ý²ñDA&7ÍôÊQIͲ£-ÓLÕ¤/ËlÕ¦1]uõLUiiM:q͵Ä ÕÕ*I˜n ‚ ‘¦þ:‡ °Œa˜j¸ª»*âl“þˆÐÀyš`“Kè/n/ÛE,Êû²Q,!¿|ˆrâõ‹Ô{¯4•#Tk¥•ÕX~ րܵ_ZoõUá…¿.†‡ @©ÈEª¼“ –G¾B–€áÊ«i#…è 6‰d“&; ÊYÙÞH"³Ä“ 8ÈÅ<`2"6±ÄfÒy±'KÆWéÑô݈߃Óü—`WžzCƒ¡N3aˆ¹îÚ)FpÁë¦Ü„*U ‘ ¢§o¨r&c¬ˆAa cúÈC»’^Úï¿§¨i@ÊZU©­&³êÄ-ÄÚp.·[r†þ ÀâÉ¡„ªÜÙ†¬Dâ(*& « ŽºÀ ©¨ Üõ×_üéÇ?Dœq¿7ÇiŸ0ŗSš>=†SÄ©” `*Xùª tÄÙˆ `½oعïÞA ,¼w.m×ýÂÜÍ—÷ñ}û=ø÷WÜtà— ‚¢B x¢ZDÏ©á'­Ô#mIt =ï- ’øØ7¡ò¥/7è£ PÖÁÖ¸¯~Ÿ– øR•¤T¥0a©=]ªÖ˜ÊôŸÃ{Æ_¨”âHEL†~4Å JµJP•+ìDœQÉ‚Y!YÉN–²•µìe1›YÍn–³•ìR“Vµ²DˆmÊ[‘חΕ®Î¬Þ ¹2LóOí¼Š"Xð’˜bkéHÞ€­ˆáPiÃNþ`ÑZåNev£- [M‹Úbªö¤¬]îãhŒmþ„Ša;²B:e31~¡ƒ+6åæÈ)VÞë”?ìÄ×µ/Z‹ÒÒšÖ'Òõ$uùiÝûzp€Ãظ¡H¨Œ£N‰ÂlÔ”ð€^ x„„VÅp‹ÊvR¸¹ù tÛêßMxž1üjB4ñ3~Ê:> !‡xJXñ‡¬ÈÁÛÆ†)pD;aÛ‹¯[b¿f¿ü5æm¬,/ÓÅP)C¯±ÂEQá‚´‚{ðè)¸C9¯’„64å;¹ƒ’Ñ€`õø‚è¼þüL)›Å*U1·,Ì.Zr”À]»†z¬7+âPDT¨…¨ÜcXYm;ò(:‡Œvæ ó[è|º‰å¢MݵìÄÆKB ¡²í>e'€Êòo0+0è¢S¦`~\a køÃ0¡èYË‹5)Qí\UÛ“ÕFt5&a}m†µb'ñHG›ì§|ÁÃNi& ²†;X +ƒ ¶Sh Ì$MÀæÄ}ÇlvÛÈìö¿=ÇpÜWÐÊã™!æ€â~w£Zi@HÒ‚h4˜*ì´S€nÐB&‹@8ÆËp&\­/æÁ/˜p5.\åtºBæ`þBýÃtBÇ´âŠÁ~…ãS±Æ8àüa€õˆÉÞƒ>… °úÕ±žu­oë]÷ú×Áv±ìY7ò¾D;åW9Ë÷îH„}?ëîAUê%òÐGj-9$˜a PÙµS$‘ ¨d"„·ŠçªÒ…=ØC/ñâý§”Á Uðþ÷Á~ñŸüå7ÿùÑŸ~õ¯ŸýßïEëÑ~ûþç²ön}»ìåDºç~E^9`¢°ïÜtÅ’ktT*º@*Ðì)Ô¡®¢Æanö$@„€é0jûº¯ý<ðA0E0ß/|ä$\Γ`Ž‚òOƒöÿHä `r &^ .Wè ±®â ÐÃè ÁÁÈúAÓ®"É*hªdAŒ  èš‚ûFp ©° ­PýJ¿NpíêÏí° ÿlo ¿àa°9`A&€`çzÎDÁY b´¯# @žÂÆðá¤@ö`è¨B´Âø®ôaŒu:ð ñ!ñ³ÐõÄ0$Rp“V0}Z0‚Èþ° #`fbïúnl˜ v*ú”#V ÚÐàlª*„!A+ÀŒ@¸¤ª#±}ñ½oã¯/Ž2Ñ|6‘}:ы㉺&¦ÀBaîࣂ¯MXAݜ á)Ü¡zª"@ ¨€—¦Bzaê"v‚ (Í.xé±§PæõÔ®Ûèu'Çg™Q8ÈÞ2`Ø Hú@ ``NèäÒ +`Áœ¢žŒ#j!`⸠À‘Dð$oíñ$QRá/+1öºp&üñv²wr Á¢F >@0W¤7bœ¯)@€þ  )‚`bRà *ÄAÚp* ö€§eS²+½2üð‘pZ’(&g&i§&mR+NÉŽ0a'bx® €2*›a ^Bž¡†ò)bÀ"¿b ‹+#ñ‰äá+süÂ’å^Š,‡È,-G-×+8Š žŠ FtÑ)ŒA;‚"¬#0®#º>*>.+DMlªB ÏOÏv‚ÔïÚa À/ßó13WR,‰‘þºÐ2­3 G37,°`'W*Á§®"Æ å`uœbð€ pÀ¦âÐ,\X(73þü0ಋÔÄàüΰ8ó1#S§Œ2/È9§:³F:§S+ò ’ÒWˆa59 À å8BfÉ). =›Ö¡¨b Ôà †ƒP’ŽÓ¯àôá ¼Ožª1u`'îSRªà u@ ð¡ öáûÎ0HŽ`?}±?Ç’9ëO@ †@¡Æ@+f bDrÖ€ œB+ É)²`Ìs*Ò€ â‹èî Œ’*tóüb€Ò8ÁûîáExÀÀªÞ”R  F?ŠTA ÈÀ¼€NoH€´…t9_&ïîô`”tI­bà~AaÖAB;þœB¢Ç)!L9 ¾!ðžâ â t†ã¸Âa,`: J Xà^Ár¡Š ´ÀÐo ꪠ¸àû@¬8íÓûŽ•G€¼OÔÜÀûذ¡ú@5 5U ”‚Œ4`µ_R©â*éamŽ Fç)Z¡›bÖñ:BZ¡*X€ ¨4+" lÔøU ÐŒN« Y½/?–`Áô!®àZ±59%ó¤¶5}º`¾µVÂU\§‚éPWâ‘#!j jó S+°a îM8NVÁN@*AA€ ô@þ κ R iÛ–¼lîó`ð“añT?  š`¶$ö³u /Ö|26V6a¼Ëcæ”&.WzN†Á)Èá^Ÿbºô).` e%!ÒÓ$ÍO  ¡  ê ª ä‚€‚á©ÁûæK PAÖ¡ÈmîAnJÀûè ê` bl ¾ö ÃöÇVwÊVVÂp ;Vm¡¢ uá»ÔéoA̦) L(*¦à (8–`*àKSpËé°§ òˆ¶ 6ú ¬ZàûD@ ôANa ˜®>áú€zVþH¢öt©0uåouo§u[ålU%ve×)®o|åPµ) °)¡ k ØÀ¶8b BvtˆC‡C†°@°bLÝ÷‚Ibý“Ј”öè·Lì7Uð7;‚ú^–NØ1 ôÖ*Ú#Øl*Šˆ0p2*ø=1¸‡Ñ~oO~çƒÉ$„µ&mIXW¶7€é$ ¨´^ )’šê:a Ö¡¢¤"ò KÉŠ`€Þ®Â‚}8Xƒ‡4QWjQÛΈÑd„“x# ‰†qÅ ³* nïœÌX*ì .È‚bx#d”Θ‡Õø‘ÝÕíþï õuOŽë8_N  “œBùx—*¼áR8+ž X #¤¡ê`xÝ’m™ü€ö„8qˆ¸`0Yþ49‰ÓD3W´Ò (ø+¡ R b`½€ Ša8æFÀù–¹üry;XözLä¸K‚™„‘à  WHè@šBx7@$¡œ¢ ê@ –# f¡6¯ìÐ)BÁI³»’¿ù?ÃîÆ™CÊr¸ŽqåMøMž‘§‚ Pú*›B´¸#A H!9±‚ Ô #;Eþ71º›šƒ)¹’»0¢AäœI˜vþ‹NÞSAœ¢(ÐþV¨ô0€Í€h+*ªž7‚ WLy¦/¸¦S­¡Ûæ—o§ó÷  J#ÀK+ àV‚Áéd p`¬ø LŸ¡BS+š«}Ø«µ ¬³L¬1D§?Ĭe×ê F¦M ¡6Ý"7ÂÐÀ š‚:šT¤©â `âZ öè*žÀF¶#Öv+X a¶i»¶mû¶q;·u{·y»·}û·;¸i› $Y[ÛÊûB[‰(šaŠ@ÆÞDL*ô€ŒJX $´ Ï€ `â V`L`¯©îw¥â¹¯±þ*®TõÔ{½Ù»½Ýû½‘'ù¦“»qÈö[v_ûM2€]9ˆZ€·1S*Á¼ÂÀÔà•*¤ €.*ŒáK'»¹¦bùi—­¦¾uc¹%$¿ÕÒza À¯7¢²›"b›âÄì)Pàja&S«âñ¦Â0§Á¹ÃçIç†ÃsÃÃÄ=6 æ ¼xEì€ʼn!V¡)L œ"ª9‚Ìá( ¥‚Js*fÊuœax|™|œ`€üˆZr 'zÌÛä`6ÙF{*2@Á6‚¼x BA*0À î’y¸`Ϊ¢¤ÎÍ/|ƒ¿ú¦޳LÈÛþ§ÍÝDªSW¤ x )Øa²‚@¹©zÒ*`÷ö)¢ òÀ'=WÊ\˜Î<`Òœ6 =D$}ÕGDT‡nMdÄ|#!¾˜ ”êÄØ)€´Bx °¢r¦ÙÖY]Ñ›Ñe!ÖgcÖ]ƒÈ= ïõ~~ŽžžjÝʰ}ƒ¼k¬þêÕ8ëÉÂÐÞ8¦ ݺ'+Ù9b li#°A¢B<þ*6àÈâ¹/Z°5ïàQ?õU¿½ûÀ°þ^¿U¢ƒ¦>¿ª^ñ_뵂v£¸Dà•ªº)˜á…›à­Ê5º*à ” «" ðaŽO°·÷¯•\?ä[nä£kðù«ðYãö­¿þ‡,ÜQ ”ž,7"p6Ì$ŒøKÉœŒ;f9³æãÉ”WîLŒ9sÈ¡Eþ :4Ó¨yµ¢ ª´j` œL%FQغ-EK-¡¨éUUþq['NMã¤ÒjªKÚ(3¼è^ÑÌ›;78¸haÍÔ©/®Œ={ÊÈÚ»3¾\= å„a4b•$™ôa–2Ѥe—²„he˜•hRP¶È3És¦B,²×! é'PÔÅ:mQ„(°HUÈp%Žç¨)âЇ$þèàN“|µIéƒRS¡˜bfèe§²tèé†`j&™'VÚ!MÜQT P¤ü›¨BÅ`|À#EÁq†VõŒPT΃D8På@/\‰"‚,÷ÄÁƾº× ’NÞÊ-h—fJj•œ†ª%¨äv7j¸#šjf· 5Ò‡0¼òâ-)R«»½™œl¬ákE) HQYhOQ´Qõ ÀZ1¡F'†µtž@(ÚNº¾3} úŽ<зTª+.–ç–ËåÊèò„²•ì’l7ï$Ã@_¬˽ùdH3yðìÎ@ ÓÎV "ô>Ëô#$j²©þÃLp`1Ó0w´3 5 ñ›\œL Œ"tT¤‚±³6EQ°± 0]TAn9KJ$㚌.BºqCøÎ@k ´ŠL³¾&Çœ²Ë,K&9véBÞÌD ä;>ÛZ}PÁÂ+ïá@ ÐS Õ¼ƒM« Ï,-˜ƒ†5UÜ“5›ˆð2·° E,9v®ñ)˜-ÚSIâð*”TÔ† Í’ÉTÂð)WÅRjà0‚»jCç¶ á+Ï!ËïN7Ô‘OöÛ×x 6±U!hCƒEÑ6ç-ßPèd˜ϸ*×sAð1—k f4‡@ø½ïgUÐF;RþB ÁƒJA¸¡ òû\*2ÈÏVò™ü>![¼Ãw ‰ 8¼Ám`ÃW¨Â¤…'8 ÆH‚Þ¨’sÔ*`N„Vþ`¼­â6E±Ãî£u„ÃÐ` Ðà…bPzœÚÇ1…üá à¨aÚá P ­»]/Äa<ä)y¦CêX‡ÀÏ<΂TÙ#زGRfŒÌQÊÓ®ÍØ éô²™´@ PÓÇlÃ*h…?«!+ï! üËMÕ¥-o¹‡<ÜÁôˆÇ;î€ ѨÈ>DBDê‰UáâV~à. að†¯‡þãÀ"®ˆ®QÄZÔá 2d^th ‚0"$a"³ÈJZÇ‘’ÄŽ뉓 Êó0Üœ8êðƒ, ä£Ý@¢™3ƒ¨ ùÀ†bØÍUÊaD ´â[ e7¾Žq˜j`Ã:Þ‡9ÔáøØCnù158SFä 0bñЏ" gထ‰œÎêŠ5Þ1‚t0ÓW†@8$¡€  )JqŠT¬‚® A,fq‹áÃ8Æ2š ir3•Á#ä° D~°¬‚,×ÊPŽò‰ç>1ó@|>æž‚‰>ÿ ”~n} Xð þÄ  H­`PŠE¼Ð©/hA0ތ㨸=° EØE÷ø, ((,†š4+?}Ì€x{í¡óò’„%0Ê`†3 ¡Bzq€µ¼¡†=CÀX‚¾0/˜e+H0òÃ\`Ð ¦ä-/"ön „\à‚+𱆹bT£E(_CãWÄ&°…e aûë’Ãê—D—4Q&Hˆ`Ì!^HÁªðP6¡­ÑÀ‡=¸ð ŠV!ZàGü‡0 ŸÀCÐl}ˆ‡0JùÕ q`@i髇XFH‹÷ì@‘¥îIa\‰B/ÎÞ/þ€© …(@Ñ t@’À€(8€„H€ €ìãò€;‡ˆƒÄcEC¼€ ¹Ý-Œ7ŽÎ~6´÷íK~Œ!zØ¿‘4L èÍìøT}>“zB6ödAú`”Œ¨>D Ì€¡ÞE¢ÞJL¡À€#Ψv,)‡ "Kñ@¬a}¬P¾3®ñQá g¸ÑOùs¢{Â_CÇä¿ÊN ¢íÅ;E8Þ öáH³‡x6EÐ#WŒ?ƒ¿¨È À. (n@7¶Â >„—"¬¨7¸€@Ì}KÃfPGO;þ„a ´‘-èf/»Ð · %îiBö[ò$²ý[ ‚WÒClBÑí$ãÞsÃVÀю墙AuÇ s¤:ÖM‘D Ž€Vð° Õ–3¶'Npéâ!IvÃ!Ãð££äÙDψĮ/m'gpz‘ Pð‚Ç* 1ÜÆ$„ÏWm),ÀQ‘W hã7DD<“u„a çÇÅ¡c7½#FWúv’îw¦7ýéxç–Ô“ó Ì@F’(E@uì) è@† À,µ"Hè„pÐV‚w®"Ô¸CÞ½ï8ždzßûFúî÷“0»á‚':áW_©Ã‡þ}¸ƒÅØc‡}P„ 1 †á†E< CFš¯œbü^FÊH #,]WßBznÇ=·ZïúŒÀ>ö³Wxí!~{ïŸI÷é:à«B# Ã#UÖ}üdqóñ1€=ô]Ia€À}ª§~ß7sà~1~~W~Ív~—~¨"ì·»Bö·+ð@È U PØ€Ýa J` HÇ3W8è.à~ ¨t¨lmhƒbª\cì1o@4€Hz# ëàrGz$WQðHB Ê Í`M\ p$„Ý‚ƒ®§ƒGǃþ†æƒÇ„e˜C¨²” ì!0opð A¶Â`‚x¢ò€u2¢Ópê UáðÌÀ\݇*r†{—† ·†ƒÖ†‰f*ã0 ŸŠ¡(Š£HŠ¥hЧˆŠ©¨Š«ÈŠ­ø‰EqHâl?… 3ë† ÂPÌDh@ƒ‡’na‹T±ý°¥€7t1@ á%‰“ˆ"•Øt—¨p™`›hd ‡àߎá(ŽãHŽåhŽçˆŽé¨ŽëÈŽà¸nÌ%P É¡Y^! ¬  @æéEÀ€z]AöÀEË ˆ Ü ymg€ÒH‰ 8þt ¨ÖØlØØ_Ú8`d2o ’!)’qöÐÁ²·`EÇ ‰Ðað1zEa ®ð#nAl 'Pð ΰ÷˜)®0oe ŒÀ”Mé”O •Q)•SI•Ui•W‰•Y©•NÙi‘‘ʦ‘…Å‘úå‘#‰–i©–É110|pLðLP 76°]Eq°ÀF]¡ ÓÐO°Ò`€’@”yQ&#á•®™‘)™“I™•ù‰›§€_© {*1–‚U–ˆu–kIš¥išñy°Ø5uÀЋH@.@¨YDé ¬™3À' íþ¡:pšÅiœ¦™™_–†ö™øš5šÇ)ÓI'n´ ª1 ç€lDTÐ mÁJ‰¥qÍ'! íÐuÉ 'œÔ)Ÿó‰$Éi‘Ë9hÍYOϹOÑIŸÿ  T!ú°)óØ ê@Örz€_  ÈHv€Ò/ðyÉAð ¢!ºö¹€ø `ú)Iü)Oþ)¢-:¬0PÛ€ÐP éP‡À÷ÑÝÆòWÜ@‚0¼€ 'ÑhЗªQz} . ¥ J¢9È™‰(úH*ZI,¥]º–a€ü€Ã1GÐþ<õ]EÑ\0¥Qy`Rq@ø€<¦wÉqÛç¥{:SІUj¥ŸxJ§¥ŒÄ¥|Ѝ¹ðitñÜ@Ôp0]`wÊï ÂÐíÉL0€°0ÅÂO  Ãñ{Àm¨«Zš~j‰€j¥X:A…jA‡Êª·Š$Ö0ÀaUð È" D¢¢ Á`y‘ö`…ÒcH‰«Ó’®Z°Ú™² A´Ú@¶J­ßªÉÀÞSÖ0ˆÞ I Q¨ÖR@ I h*=éÀw€› É °+°K°k°‹° «° ˰ ë°‹þ™©œØJ~ƒztÜŠ9d‚ ½À±ë± ²!+²#K²%k²'‹²)«²[®hóh/©Á  IÀl$YDX8oJ€hYs`™Ek´G‹´¦Ø•§™|G±h±´÷pMët;Vè€Y«µ[˵]ëµ_ ¶a+¶cK¶ek¶g«µK’øÂ¥º  Ð¼1 ] ¹0nÐýÀ]ÐBƒhÃÀ>+’Ñ(‘éADg¢ý¥­•ƒ±C&ˆ›¸çq)á…T1\¡˜æp0(_°'K0vTñÀ Ÿà] ¹ã–”[¹Î±¸g7þ (Bpøô¸’¹13¹Y»Š¸Ì%üÀ(YÛà ‚` mФ@¡T¡ 4€i9 ð - Æ{¼–ë•T{‘OË»² ”Pé¹; IÁë2Ë2Å[¾)r¹ó'Å ¾A ½à/)À}$ ‰•ƒÌEª™0³K¾ûÛ·{piÈ 7€ /õ1}Àxp7žd¿+ƒ¿ê¢¿ !ý^Ðð"2Ø€ V0X  Y0s‘>Óó‰–HÁ´–´«Âyw¾è»™8‘² ä5   TÂçrÂá’ÂGŒ,^MÅQ1¢Ð þñôP l`—a  ÙKS༙`59’F¬Å~aÁЦƒ7€æ•1Tµæ7µT›Åyl»q^ËóO4Ç sy ÐÐÔ5éð *·–]`@€E<Áˆ OIŒ¾iH äÕ­p²p¤•Óœ¼€7à ­lÅ…Ü´‡,Ê¢ÁÅáe ëx cpKúSMà]Šü‘B,g¥‰Ç¹Ì{|li0Õ²0´à¼` ÝìÍß ÎßœMŒŸy;@ pô»»ärŤ‚ËЬHÊÌ\y0¦þJA0H‰(€ì‰¹z†«–ÏLþÏI!͉–†¥Së ùP -a ²°;=À!ƒÌ7¾ 2o@Î º@Î^Ïš2Ï ÝWöÌ\1ÓÐ!S`æ0†2rV~Ð{¦ÉÐ0í hix·t ²ð ’€ +ñ¾à ÈðY­Õ[ÍÕJ”žW@h”s;p´ˆK4 ¡ÒÒbòÒ‰[qç•P̱ËóÆ ø¶ÀзS~ 8ªðìqïðFFÊH-!¤LµiøÈ¶” ²`´Ð´ŒF  ™­Ù›ÍÙš²°*Öñ æÕSË,mËšÙÖ©‰£ $×2Í\mþLGxZ¡Ôƒ H@Xð m sÄ´Ç ÌÂ@ Æ0\ÊðQp\ÒPW` Y°]À ÞcPepiêÀnr t`†0Š]ÏL«ÄK|9ÐT ó Y°Q éà ä³À ÿ à.à. ²P ¢Øø»ÙS×ÐS¬ÍªýÞU«‰ ‡7Ý!JóÁ× æP N%I0à_À ] DY@DE$ S ÎÌ@ªÈÀL´öJÐEaQø /Jæ`Ъ1P° xp¸€j 3U0íÐ(ô`,E  È]N^þüðÃì]2ŒÝ´:(òJg€ ܰ'0°ÀЫ|ࣸ@ \Jݰ´@ `Íìð@0Å7á_ÐÚ‰á0 , ¹°Y\À8—1‚ ^®éK¶ ‰»T½ïðí°À„ü`Kd ½À $€ À (0'SÀ% Ò8R5@P@ð»'q}°wP‡1À} }ÔØÀÅ [`–îÈü Ÿnu0£nêl è€f@áð ÝM\ XP Ó ÏÐ PÉÐÏP q¶d+!@d.J=`:=ÐÉq.þ § 2صt ^ñ/ñvŽàå Ò)C@^ ½P¾ÀRp 'ò)¯ò'S<,±Ö¥bµ^†ç}p a Á ÖÀVÐQUðZŒÈàÝbd Rh@R%µëÐïñ0X~,¥šüÀç]Žo·´0 Q€ Ì Š OЇ Êðcá†`‰€Í . úà „ðSR ªºkÀÄ i‘„ & À Ò HÄ Ê€ãÆ@ N’”Û¹ Y+°AÀAðf®™—(˜€µ0Npð3Ñ=pè)AçMþ éS`ñx~@äÕ9à†` *A F0À€ ÅoüÇüÅ/ ²Œ/è¾èÒØMs z0ð/ú !lÅsÝ/I@ KÀÜÈàÅÝR ÒÝÆq ¬ð(q'#ÂË0 Ñu°¤]‘§¢€ $XÐàA„ ,ã¥ÊCˆ!> 7Ú,ÚˆÝØóÓ¯.U$u”WE‡G8X<»Ón5‰9uîäÙÓçO ù 3¨%À¤I•.eÚÔéS¨QŸþò#ËêU¬YqU‘uㆬÁ<ŽU’õªYMÆ®e;vÊY¥T˜¥‹Õ£©ºþu¿¾ië1.´ždÕuƒÚaĉ'‚kN•!tEZÙòeÌL)Ø`è0ègСE‹¦²Š"rîñÚ­xظTÛöÐÆÇÏCîæÝXzl$Y0 :ß¼!ó`NßàÔ A4ùuì R뎡*pNðÀý°ƒ½>𫳡ʽ—-‘‡Cá€=4Šø4ÚÿÒ­ £23ð@¿ *¯¬vÅØ‘6Ú¥.´Ôꫯ·âš‹A³î‘.ãÖzäŠtrhÃ9˜È«v…k´ñÆ­ñÈ$£,A ƒ|j³Î4òH$3 •Rø€–pþ Tž “**@I•d`ÊÍ:ìÂÜ­Œ9p $BL…ê¹¥iz #‚1†M<Òî'Š­ŒW¹ÞZ— Y°*/mÄÜ,mǺ8CƒxÇZÐÀÌ%NKRG,@¶N±a:ŸÆLsF´bÑô&B€‰rËFÈwTÔ“‹¼?&!QСӡÎZçU`ÁAxÁr²03lzSœæÔpAlñ•{ÖDذ…”Ú‚gaN¨\]þHÌ…~°i+ÝDQzÕIQT¤þ!‡$û0 zuMZð(z¸Õ䀫k ŠJ©Ê©Sše9hŸqyÒÅùàk_ýú×¾¢e_ÉëˆðIQ¼ªB ƒžÊÁ¨™†|«¬ÊVÌZ †hMÈ>a²w0â¬yÚÆ <£%qóR‚Ö5"žyyl ¡{LéRV¾ºì{,”Ͳ!þ‹G’ajô |@EpÀ\AÂiU#L|b§XÅ+fq‹]übÇXÆ3¦ñ‰û 6ý-Ø@ô¥m›Ñº€CÔÃ> pd$#Ù Ò`2“åƒm¨ÁgÂ4¬Pëò33´.àÐ Yètª:NP"ëÐ 4§YÍkfs›Ýüf8ÇYÎs¦síœæ¸½. Gž¡J8àâÀ7ÔA€l`€¡<=ó& ³ t¥-}iLgZÓ›æt§=ýiP‡ZÔ—æ$ArLæË¬ó+^°mœñJ°cÜÀ1Á «Ð¡bàu¯ÅÀc;Ø8@Bmnàb4D‡½ þ8¶ÀÁeÐB̵ƒpmlg[Û‘At¡ìÉ¢A$T†Ì}nt§[Ýëfw»ÝýnxÇ[Þó¦wºKéÝ(6ègµà[àø©Å-•uò z´-dHˆêVT‚7ÈÂ/Œ°Æe[™.´€1 áe@å+gyËW.ôQ¦c>8fHHpœç¼¢HHG#TÁƒbÐ T(>!dè\éK÷¦Ák>•¸b…ò°­GðÑ`˜ƒOÃ,¸Ð‡:ã*OðƒÜÑoz€‡;ü B4@¼p.¦ ŒÏ…Ü¿ty1‘\äÀƒ'|áþ _øü¬ }ºenÎtÈG~lv@$yÌÍégJKQuãhBp•Êá¢äÀÅ9Âfø" ÇÅd‘ŒXeº …2„` ‡HäYùÙΨ$ÔãÊù•nà IÔeºœ‡Êã3}ì+$(Fö½ÿý…lžúIiiÈ@D žeÐ…2œÑ:D;p0vú;Ã*Ä@„ À2suÀañ½Ë‹6 †ª#p»Š»X œ@ ,„&c²3XYˆ»™K°ñ“ ë?¼<>€a(Aü>ñ Á–°ó[&˜‚®H¥2À…4°þpxhøZÐ…ôñˆ¸d°Z+ƒ5¢2«è2a6Y‚@¨º:^ȱ“Ò‘]ºéBºY†(Ã0ì”1€‚ªø@Y˜¾¼|CÉó88¬CÉkÁñk©R8?`…¹@ DA  …A‹|‚!ðBœ9p[@ºpÂÒ©º:xd G#h<Ð}@†«™)†5… (¤6¬>ë²CV¸ô)‚VŒEœÃCêk©LâC°ƒÐ_èE_üœ!°Z³ñˆ,0‚^ìiË/I,—ª«YH˜ÂH†pàR¸ $€2„08¨‡?þð†@¨Gð†¹“àÓ*cÃTLŠ”Ez¬¨€^¨G}”0Zä¼–Z\D ™òŠ«(ƒ%ìY0_Ú=æ¾½c'Y0>ÛÒ¸T˜³a@0>Ðd Úqpƒfuô™$ †e„Çx¡UÜG˜´¤(ü˜¬ÉŠêÇÆëŸÀ…€€‰U¬XH/5ˆ‚‡+ƒÓc†´‹á» a¸ª3#àŸ1† Xi9 xx‚0e¸+†tX€ ºf°†ÈØ5 @Å–tC›¬KèɈ[°K½Œ!œ|ºÅÙ>løI0‡8©Œþ9˜»ÅkJZyJ«è\ÀÅl”)bè_Øh¨‚c‡ø‚ÈPxYð#ØPdG¬X#ŒcÉxœÇ½œÍë8D MÜŒ—¾¬¹Å$¨°ØÂt™L ÈŒDÉl¾!ÀE~H^à_ŒÎ_¬+šY¸#Ôœ«¬¦\C›KÙÌMñDˆPyÉñÔ%…éÕËÖ}«–‚Ñø‹)<…Ö1ß%&à]=Mkh‹uªkÉ ‚¾ˆƒ‡À@ð†ºc è7é5'€``&`x¸ÞG"Z@àåA&x`Ž` žà ް®É^ª¢/Y¸ ¶È&(ƒÖá‡h€¶Èm‹^0_½Ì] ëÌQþ Øbâ‡AR|MóÄ“â•Ï;H-¥-ÚÜ.ž1Ö`‚Âà•¢/Øí‹èƒáWyY±Ø»Ù!(ƒO`‹cPἘ„¶ø†ˆÂÖÂ_á vÐ-™Ù_!ñ†B¨ªf“ⵇUÈc=Þc>îã<æà9bÎ"†s(dC>äBN˜ÜÌÖ¨I°àœKâ>¸K¾dLÎdM¶djÍ&†Ä5rÈà¨Ë îm‹n v¤ùˆ?ˆŒ¨Ï8¶˜1¦ _èa¶ Z0"—¹Z0Rbª48ŽŠ fnfgff géß‚(^6ÀlÎfmþÞfnÆæŒdÕJß*H³K¸8Ühgw~çvö‚c¨‡ËKb1èf|Æç( Oå%… V h‚¦fIxâR6‹Xè‹Dä‹Wq€X)°Š100»Zf‹oÈe³øŠfh +›i{@Ûƒàcd†ŠÜÅ+àƒf¡f‚°æ|¾im>A.¸ qF«ô݃nj¡ê~›†3à¬t¸3¥Vêjˆ,Xj¨¦³£Žuà 6ɳgœÞê(Ô‚u€~.ž~g-‡ÒàH€¾€Y8—Û[‚Fx-€™ú©U 4ðhº ã¶HbèÞ ©þY€èrƒ•΋–~ŠL xlȆìF‹9p„M¡é°é­¾iîžäŠJ_6HÒ.mÓŽü€:覭Ò-@ØŽmÙžmÚ®mÛ¾mÜÎmÝÞmÞ†m.°ƒ}©jtÐâ.nã.~IÆ7­Þì|ŽÂg€¯kÍûç§gPíÞîí^ø5P& †Ñ] }x‚/x•:°i€…<†?Ø8`H´‹qàë¬ðl‹Vh‡»†¶ԶЃǴÓ’L"Ónðt€>iˆ2°¬:ÍvînÖilðìpmiíopÔ.…û€UHºŠÒáyþ0Áà¦j”qÓ.—`0™"±¥kn çfèÆéëO¾`ëv p¦'í™ÇA(% ¶Š—j‹ …aØax…4¸NCˆ†' À³e‹pÀo¬` _‹:wh‚Uò+ÀƒÓ#pf¿èÎYl§Xð$Oƒïƒ4UŠéêêš ïñœF löðžö&ÿsÔ&4øÇ1êoq·îÿór¡Eøê«ÞñFStŸlrêÖÍ"oŠ#ÿó¡¨È³£(ÏCl 5¸~í Ô ]È#ðˆ6X<` 00ó¬@ݶ Y(‘W¡†5þz)ø `P”‰µ0„Ep¨ñó$tÒ&:©l Ál`HtTÇoôÏmmIJO¢Õö&ßô«étç‚?OƒPOƒ}è’ä^nöâñxdž_õéruk@ò$Ÿõ4`‡¾ûîð¡('ï¾èší‹@‚rµ [æ•…’[ /pö«ð…*è +èI—Y‡cc™2‚(†[†Ê÷±XýMp 1wGwÒ–‡¥ðq»ð0wT?A{ðÂg¨«<¨¿¿÷ƒŸôÒ†‡OñN x¯‚W—ª6xPJ í5@×q‚ƒøxÂp˜¾Ÿ(“þ`°ø<Áx§qŽ'mI8'ù…¦‹)g ^Pë¶À‡!9–Ÿ‰0¨Ç . y«`(è w@Fk‹\ø|;€7H«¤…•ðµp„¤/w`ðs‡ð't|‘iqw«Wô|•€t°Ï÷}/mK×¥©ö!´O{ŠYûtiûƒOøÒõ{Çê»?õˆÇf4ÞFØ—uê0íZ¿õ\¯(÷™œm _Ȉ¶˜³hy8•Ñ’µ¸Ï¿ hg‹ÝM…W)N€  fd²’Ð’¥P €† )(Œ(qbÄ_¾`̨q#ÇŽQ •f$I’éô)9’P8syŒù…‚ `6þoâÌ©Sçl° *t(Q à!MŠ€;ŸBªÓšO•*c auH +VO²*fÏ¢M«v-Û¶nßÂ+×,;bŪÀÅjÉ\(©Ü— ?Âî"Nu 1E?®Gc2åÉÚ\P UK™ã Ãwd'4T²{ÕðÇÏ®]ÿòC‘"$‹;`¤@î†ø²øŠØãƸÜ\d1h–¬X‘ KfC®°¡)é }UéÝð±4Ú@Âe‘YÛX¸È0·ë-¾Ž¿¤ÈÑ'SZ•׫aŒ2ògÖ¤ÙS=ý™bcJS2 UlŒ6VZYÏþ- ­‚Lƒc•5—‡‚¢ˆUÔµ!Nyí¡_€©´*üPÄ&Ò¸cŽ!˜#Q«`V#0œÅšh£•všU’ÄÓ˜ ÿ1ùElîÉœ,Ü€‚NC Ð[;éÈrƒDôVÍE4”Ì#²ð%”Ô¹çå2ßU ߀Œ39D™F#½)¢fE5ù}Þ¡y`òÑä#0êXiP :%iXF˜Æ„~pÓœ¡iNd˜ªª«~Xb(vºâhЬãS¦Òx£¥–ò˜Y@¾&d„EŽ6@5äB¡ñ=©&-åÙ@ I€R2§$„, IJo}ŠÐþÐ ‚ªÉ&”|'Š,T|w-= éGCö쀋BÝôö¹²À·¬g‡Ú‡R§,¹Ók‘úHé®:bŠkTœFøi„\y–貚±Æ»J#¬*þ¡`„æ0ƒº.œc¯>ëš°Dšaj«µæoLͪ9œ/;(„Í=ÜÊ’…D;¤)‹Ѩž²(Ûî+¹Öù2Åw'ÈòÌw¡HÄ‹¼ õÓ¥,-åæÀ¾ýþ7‚Þü¢wªþy†p §|`Ã&ïñhGh!†šŠñƇ#bÇ&~<š¬º£Œ|+†rÞ®ükgÁ†6lÌ"©¤Íáܦ-U<—ÃÎWÐþÂÀDglÛ+p,-‹. ãP8ÞÈBMðF-ÑÔÒy‰[n¥ÈÅwä<§×у€Bæôvˆ—‚¢-_ £: À|%ÚéH‹6ú¨LvÓˆ÷åíM9N~óx§¡ŽZª¦†'ž¿þl-¾aã|=®S´²•ûîb¹õ%s4j™g^Æb‰ÏXÈRÖè6R:âÉâ ²Ð6A /¥G¶@‚,ŒqP´û˜H:#‡ÜçØÏļáI‡ÖE­¢YÏ!­aDnPˆÞ˜íÁ(Âb`‡’+{ñ™…Cš€|Ï*á_ö’ó1cx€|‚@È´OR‚¨€1þúV•ˆe…‹#¡ØW4èàozÜ_ÿ¤r˜§üÏ*ìÔÈ óG÷-*<£Ph¢–±1q U (¾™€5ÌÈ£Ã3.É‚gkƒBB( v¬@ÖPÈ (rƒEЩ!\ø‚”¢†ÃèØ‚g¶,ÅY£78è3„“3ôpȤ€ [œPÿáb0”ôbsq[Àð#G¹U“nAŸXaXƒ'fd$QÒè#EÀ’PFNàgù‰OpÈPbZA2ê${èáú•P¨ ; ¤JÙ©ÈÅhFî#D/äa£Æ°sG=Ò\Fð†¨£#”T‰%¹þ:1,i“Í@(Œ!)@ˆõøƒ,\0„ôbÏ1†—HH‘ýÄrÐFðdqKëô€gÂhÄ$d $#• i$¢‹'|#7ü°Ã ö€0t!xR|Í~þ M\“°¸Ç6ë>¸Éq|ŒrTGÈ–A4¤¤¨MÔ—Ñ-ÈTËlˆ0…›Øó*qŒëHèG*ÄìÇ@©:DÐËrÌ.ˆôA8ä„¡} cȆ[Qn(¹…;r²ÈŒ:rC-3@Câa 7ld¤%))%˜,•ÊF„@<> 5y‰І&qHäHR÷Ëqœã׳%ª³þ/[$¡< )ð¶4Ylá:4hÂ>HÈ `8„æÑE¶ f´‘µ{4åsðA!È8>€U¸#YTÉëEƒiÄ®RIzX‡HÔ¯ugÕË ˜‚ƒÞø·Å26 t´XXŒ·ŒzàD qéʼ~ÌâØ P)CŠ €›ˆ–$åb!Kf²C8¤6XÃM^ËÎØ6¨e‚0pCæÀ8dD·$á-1©I›5‹Y‡$j9›AçxA# €íJ§¸èá8áCÀ Øèœ÷uTéìÙ7NhqŽs\!½ ÁEyœ€ ÐÂ^¶“Üàþ~„ ´H‡ Šv\ºoPC8¸Pg$ãZu‹WÀ@¨(…(FÀ‰PŽÀ±ê!i¼Fs E:\’3œý‰pï2\€{¢‡ ¨¡avrx'I0†˜!i\]ðÆÈ‘u¸t†H2Wk0qüPœb}Ú`ýp8¤AY\°R\±›È.øf°Šv`ǘÕñS0€TŒ IxÆ!ˆä‘ ™‹œÃ<\‹OÔ04(•“ eµŒhÆt0/Èã Z&ÍçRœ†“¦tYÍr‚„† ƒ·›H† uþàÄPˆRá §»1 Á"rc`cÐ,êtºK.bèâ9Âè:n0Y(" éå-ô0ŠE C0³,HЛ`C€—/¸PëÆ2ñŠwE¾`ó Ó­Z„«ÏÓ@¾<¼aë`Cî€s˜Á ã Â!1| `膸ÀêÑ@!c¶KT°Î¿EAjà‚¾As¨aoˆGðxÅçÙ‚Æ!8R¨òi¨æ`,4á4HÅ5Ÿ „L¤œ@FÂáOyTaP‡Y ÑŒ<¬î@˼`]3À  XhÈ0îÐŽQPƒY\A„Ã4—YþˆôB<èÃ2ôýÙà_û½_üÍ_«h–0ÔA ¤C OÏ`!¨^ÄŠ úS\ú¥v´@D =4„uu!îñÈ_*&DCDpCÀ—¨$b%-bŠ¥ ,&ò©‹Bø¨@•h‹gÈ‚0l× ä5ƒ<ÈByõâ ý¢šä@ø”,TÁ@‚2ÄݨB °f ‡, ¶¦w$Þ\ZÇX¹†t-ìŸO”€:›Iøc\A”€;ÀÀ%äB`ÃlÁ6tApFxC€8Œ8ˆÃÀ+ØÂ€<6,ä_)H)”ÁxC`ÃþHƒ0ƒChmÅB>à†D1$VIà“ÁÃã½€è3lC:Ü‚t–—xƒ &€A),ƒˆÀSm‚YhC;¤ÀŒâd‚YLY2”˜Å2MeÜÂ;Xƒ;ôÁ)˜…5ƒXÃ2%€YTÜXäèŽöhÄ茦@Þh[^Ú°Á8p@sð,Ä€*˜Ã¥BÐÐÀž¨À^‚ ‹øÜ dU\@ºÉØA>ìC?€ ‚ !‚!"<(Â"P@XÀH‚$d@%Ä ¥‰€Æ˜æ_ñH0 @'†(|B€ÀþtÀPÂ$H<‚#4#D€"<@" ,€p‚äjŒŠ,”õ@œ@:ì\p™ÝÃSõ ‚!4@"(‚4Â#`@¦vt”À ¤À)°@8Ì)˜B(È. Ÿ„C!ÜŽÃ8Â3ÕÐDè24A×ñÎk¦wõ¢- @ pA*pƒpŽ]¼ ÍDHB,ÝA%Ђ,&gÅÇe4¬/TÙÁƒ‚qÓ[ycñÁ›ðà „ÁFHXT‘°,%1LÊ~nX`i oÀe«ø4À(Âè4 $€ 0Ù$¼èA1ìA <H0 A/¬@LÁúYlFÍ'¼@˜BØñxXCô0€¸78Ý6@‰rzFV­&ôÐ5@‚$eDu޲qÑ"ÔŠB]5›XQChƒ(h_á,¶é¬¤aMáØÄ„’D…v Jþ@5¤åF¤@ÜÄÔºÅù‰C8@X¶7¬Å=H‚5ÜÃ!üÀ”A,“˜E+ÜÁÜŒ€YPÃ-Ä6À­YÈmP°c°GpªPÜNàUCèC*dÑi Ú©…R¨‚þ: #$ÀC“a”~áF-6ñCÔ àV–uÌI\¥ƒ Àe3ØA5‹ú9Ä3@B„‚òNÄZ‡2ôÀ+ 2ä@Ÿ¯/,¹ÀŽdÀ0¬‘‚ÈãI‡+´@1ÝÀdÁpbƾ21ŠÓ(ÛÌGÉNÞÉŠOvƒG¼,T¨Ö54@üÞĵ1R¶™H´C&0ÃþT¤bm§\¨¸h(bÌ)härŒÝä\H5¥Â@Ü‚!Di8¼@ 䫨VÁ'Xå ¬Â7¼/“>Ì5ám*hM'T+1[1…˜…23;37 s13&Æý*YãžH^Šžz"˜¨U¸Ö{!æjFËìÜÁ*drn]±"f1E+J¤Â—BTBCƒ E„€, G‡5Ð)¬Ã¸Ô¯‰ðB )!Áp#Ð4…Á €'ÐB1IÇÒ)MGS“Üeü!Ä„ø¦ùŽFÊËÆÄ&?…0À!á„(Ÿ)oˆ5­* þm½µòh-ÒjF?ü ü[e…¾À;¤AHT"D>ؼ@):Àe<Œm ´C°@˜E€àƒ˜˜EWôÁ'àAÊuÃ[Çõ\³pZ¯u[«3bôÃ0À˜N.âZ…âã0P€+œÃE*l9ñ#i“´‚x„èVf„”îé¦î&9IpeB/ÐÁDxIè"”À%”€H— IKï$Á¬Ã $,XDÀ,0Â,AÑø65 à ´ ?Ûuò…ùÚeú‚‘¤059µÃ𯄘$_° HWï„ïÑ Kœ\Ô°NqhÁ³ É3_ÀCþñfƒRïsh?ÙhË–65ÐASfBÛÏÜÃvl+DšÙvšØ4¹à®¢E7CIX-AÄA.„•õRÄÈ‚Äw\Ì7bTv~«=×=û·TX.ù³b0L¨¶‚[ÅB÷AC?8Ft’Dƒ4oð¨øŠCÇŸ‘, ÃÌÁ5„Mh´BðŒ„ƒÈBذ9öVO5Iõʶ¬¯ï†äøå츩ô¸ÿŽÄU×AÒšŒ{ïXóÃ$,9\4ù]<ù_öâºs•/þ?#&G™s9‚“Ôj—Dk£î˜sRpQ4±/gð¸ô+›O„›+„$?´C#ÐP¯CG-šÁÜ€­8 Ž k÷Hp7úBJ¢7È¢çM£kÊ£ÿx¤÷ó¥oz¹ŸE§ãÅ}7”§Á~7D“º•›:©¢:Ì©ú$±ún¹úO3¸Ëú¬[tï žèC{øúl{kö)¤Ÿ#W\üÒ¿&´ÛŒ´ÏxÔøµƒ÷üŽrý·Wu9廹—;º‡Å§ó…”Sy¼Ë»€»\½gî½§v¾o™«ƒ¹˜ÿ;™ÓúŠ@¤ÁÁSDÂsËÏ¿6ƒ2´Á³·þø&a¼U:QÿÇ'†¶§ ·KŠÈ«„¤Sºûœ<Ê/¹ÊKË«fk6̇ŕ¯O–'Æ–ãûd¶º—Ãúk÷¼Ïûzz9'Ñ pK„lðbðA0Aà‹´ÅûKÔ—Dµ{7“X=b`ýÂh½p=I„»‡½ØKÙG…Ù„» q}«ýS°ýå¸=bÀýÍ˽¾'ôw±ƒß=ÞóýìG°¸B/6kþÓzŒg·7m|“<þ]Dþ®L~T>ÉÇòfg¾æOœfyŒº–ºüèм‹¶¯%ÒìÓVIS5%6᜕V75ì¢V[V5Q餕^:h9x~ºÄˆ%–IXæˆ]k©D>™d“¹¶4å¬Å†ªåá;í´=-ê¶Ý~îþ¸å†h¥<°¸ï¼õÞ›ï¼[nX‹Ç¼§­¿ŽÖëà ›ð±ËnŠd$ŸœòÊ-¿ó4çÞœóÎ=ÿ¥•ÔmÀ­¼q± WüÒÄYï‘ñÔ±~ôÚm¿÷Ü{5¦Þ}ÿøà…¾ŠŠe{õ×%u]yób?dÚuŸžúê­¿~ú«¡ÿ6ùæ}dÞûðžß^Yé±?ýôÕ_PÔɯ¶ûð×_þ¸ÆÿQóÙߟÿþý¿^{ø{Tüê'ú0,÷`Žô÷?>‚äY˜#"P.Ä WXA÷4P‚!áI˜ z0d;Ú \§‰d” &Âë(a¿LþyCÝЇ9šaè@  ƒžBˆ€ ¥@)˜Ñ6M0G Q¢¶Ñ¶s Ã%¤^É2Å*BíŠYd•ÈDö…ÜIž a(Ã~…y!À 26ð:9bª'*È*,‚:4z €: R‰AQ1¦ EC¬‚¶-r8Ž"шn4¡mý€´8=IRÒ’˜„š&9ÙH6òŒîK£~ºwG:¾Ñ+qÌŠ°Â ˆâ'@BV$qRp¢œ°À dÁ Q³–·Ìå.e!R”`A’…–‘K,íQ>4ᓬà n°A<Øp !š#;ú@z‚Îf¨þ“_C(Æ‘.„À'⌃>À v|Á úFOêQ²²'â$§9¿àÎ=Ø#Štˆ(â¤à§€†C0qŠ„b¡ ,€á„´¢ÍèF€”B©˜h32j gœ†” !˜ Œ ˆ×€„Cª {ÌáX °#Môa“>ªP25ÆL†:Å…Nâ.§ÀØiOÔ¡6¤¨GMêR›úÔ¨–•ª±*VµÊÕ(yu8EKªR6Ä¥0•)0@:‚˜HpH%2Z ¹A*p…ÓZúÒ˜¢Ë¯,]ÌNp¨Cúðx@"PˆøœVÎ2þ™¸Ô%Vœ Í …  … $qƒ¬\ —ÈÊxpŠQ¬‚¬}f4³bKÕ2³dåáÊ ¬`@XI °b;`%ÁÀÊeÁ]èJ—º²(…me­p7uä•d„C!ˆ+¾€ 㵈G•ì‹_ýV‰h0A%X@ô¤dÈ$Š=|!&a€ž„ᣤOÞßùÖ÷¾. Ã;’€H⬘BC¤AІ(â D1¢W½ª˜Å.  Fr’—Üä'GyÊU¾r–·Üe)|ÙÎb&³™Ñ¬f7°ynÎkCPܣŠáqC~åÈ8 yBÍcÞÆX éWŽôev¢G>úÇ$BbH5ªp¹Xiîs£+‹ébe¼X1/V‚qì+…ÐVô€l¬Ô²ØA)€MÞaË⻾or¥©W” •ÈJ0JPîÐÀ¶´ÌÊk³Â]r›ݲ¸+Jˆ)œ×†_Xþù“ÀÂ_ÈÄ È6|Ak@8žð/¼Y_À{’Ühá´þöɬ{òï€¼à §À0pÓËÔ Gà„CŠQ ——"ŠåkCkc–¿æŠÀ+Jш0™9šŒ’ÜŒvx “~ÑCC ±I`ä””Gï”(¯ð{@âpHXßl;¡“…èFG:0”Ît§C}“RÕ­Žu­7„ëÃA¹Êoþò˜cç=ÿ9Í 7dæ6Ç;Ï}^w—ß}³à¦7Á©Ðrž3ëlgäã9ÏzÞ3Ÿ6Øg?ÿÐ( ô =hæ ùwÞ_ùv¸ÇmîsÛvÞõ¾7Vº}ÇmO³Ý¹—7½íÝzx“W+²ä… €tEÝ´ß®îeq|¯øb ¸þ6z³Yyðã@!þÐIèÿ†9‡#0ý °°°¨p(ðß~÷¿ðýðräN¿Ì"`ŠRÆ@"fjÎ!ô Iâ ì`P-Èp az!ÞàúûÁiàÖ !áìBP ,05‘à€ZḠÇâ®ë>G“ P)3p;ðEðé6©1²¬UáNÿ˜ƒÿü¯!P"p%í!øêïöª§Ð!˜°Ò”ð4´àØË½àK¾è«¿òk¿@Ì¿Æ0À¬Àì lÁìÁ"lÂ*ìÂ2lÃz¢Ã¾ /è!¼Bކþ¯øšï+ Oú°"´BÝn/ù¸ ½qØœïG”k+î B+2Áضb®Kò!°b°Âb +0‘+t +taÛN ß¾`îAz!¼ ¾¡Dàbá @$À* 1‡ñ \€^@H¡Šà Àáªa!¾zbûlÚAþ@4  lu‘}Q¡ÚÏÄP !>áÒ b ¡b‚hÀ!è1"«!˜àïN9$é¸AXÁ€ø¡ž€A¬@ àƒ“8¡ "r"+ò"þ Ôî@«€€Éza^ðs’!"%’"-#5’#=@R$IÒ$2%W²%_2&g²&oR8 )籂 Á ¢ð4gÓb>Mð²r+A kC $߀Âãzä náN.â:¥$Žâ¾Àâ0þ~þÞRàN.Ÿ°©+(ÑeÁ·eA±"81œ–MÞœ­»tï1#“13Ž$1+\(°bRr@J4`²FÁ¹Lá@ž+T“5]+H¡`è¤ +øà@!^ó+’$ B@ îÀyBþx`ÖáΠ¡ü€«Ì ;·³;£1Ð`Øà 'îáâÔ€h­â¡’A¼a:ål:«ó:¿ ..‰>¡!ª @€NHÄÑTÀ2àÄRáN ¶ !tA´!V ”è¾À! @Nà3È€,`ˆáÀ€D`ô~b jÁÔÀ7J)ìAÌÄbtFkôF!Ô€ø à!F!èa"'=GE€E]Fe”FmGu”GõïGƒ†”K´!’tI›ôI£tJ…c@ ô@5”AÔCATD ‹Tþ@4+O¡O¢  Ðr6êNQ D3TAë3´ °Oû¸ÏûÀoüéR¡ãüÒoýÚïýê0ëpþ*õþÉ0q+HÓ4Q“7[S9S8‰³»,`Fá´·l5+:!Ø1›`—`5†s7WÓU»BƒÀƒúN¦ƒVé.ŒÈ@{\°J«uëŠp¤Unvâcqkñsq‹…‘Õñ‰Q™Ñ¡Q©Ñ±Q€½Å‘ÍQ\ÓѯÐâR–•k’U.vdšÕY©ZMI}èà®ÌZ#Ö!bûG[ãf'šó9£ó öÓ:±À¼3dþ¹sdÅ“<Í=¿@=ÙÓ=áS>éÓ>ñS?©óc¿Ó¬ìšÅ`»F4×c B!>@q6a¥ba…# P F }Â,Ö!&%¶Z¡V©¦v}DsÐèh§â‚ÆÃ…B!Ú‡`aIŒök"i©ÖmßngmSmÍãlaImçvT)nûÖoÿötôöÖêv<îöòVoÛp—qßÖk×'–p¹mr«r©q3Ws÷q/Wr++ w…wnwsOuC¨s!÷sAWt7ˆt×ÖtS—vkwVWp[·r_<Á¤%v¿vv½jÀv7s‹÷ipWou·þG|wd\§’! dÁ…¨GzVH‚·'î3J\¡ZDK?†W"!‰R °!žèé àiþ¸Ž áH $é:€JA6€Ï¤€ËœîÐ&)Ñ:¹Wä¸Á! ˜AËdÚÏÖ̦ÝL¥YÚ¥a:¨gš“jºÍ ¢%Ú!*ú¢!2z£¡£á¤¹;8¡^à~@ˆq*6Ø=К*ÂVœK€œ³íœ·"ea±ËËžŸmžµÂž¯-4Á‚ïèÝÊ-ÞhAN Dá°‚´"Hûõ°âö°"özÏróTë²ne¿@è!ä0µÕúY;8B É^@" ù*ÈËï´Jà…g¸N“6J“nJ“Ž0a„íJé†qºDtš§§— þ¸‰°”v·}¸up›ûiP[µYû kì!`›d›¶ùwÉaHÁ'‚à€ÕÁ7,Ž` ÊøŒÓxÛøJ ˜×¾"ˆe² û°{±e¡±×Ø\/Þda²wOöÄB–µ‚Ü@÷\ù11Ÿ/úüš+(8ã6Žü>¼¡7@Æ S;üƒL;ZbººµµÛ!`" ËF©—[“äÁ!!”[º‡›¸ ä“C¹!b!¦ÛÈ|qœÒv|¹‘¼ºUœÅ³›°¶Û!b|ÆUwÙï|Bú  ZzÃZý š Á\ÌZ¿×b¿<+"þ|ÂÛøüà 1Ûˆ¸1µbh+¶œ 2áAß3+<“ƒ¨G,xÂ0˜\ÓuáÖ*î`¾  >  `^땃ÕD¯4 4ÓðNsÁ+‡á!NF‚gHx’N¶`ÜQ“Ô@ !ìAr$á ! RlòÇûäøôŠB2Ù—&›}0†½Ø=ÛRÙe²ÛgR}Õ)ºÕÇòc}ÖkV²¶¼'ºœÄ?¡þR:û³CÛÄI[kòÏøÏ³"нÐ=Ñ/œÑS1Á)w+D€z­7ø@ZÕ7þe¡ LAV7™+$A6%ᜋã•ÓâËM²BX‰u9!]?Ð)JfgÃSl@ ö€ 4Ázâî`ÀfÁ'âs>5àÔMäKa&áO•£ ´`ᬀ!°ða®ô}AEïà ¦T“Z ô , ÇÆTHJ¥”JŸO"€ ð ò·!ܾLáÞM#ÀíÕží÷Hßžÿžgž>ê§ÞO«Þ®>ë·¾WÂ{¼}âž¡ÃáÏß÷ò D|ßE»ßAõ..Èâ8ã7ÞX;þãC~äKþäS^õ{“å_¨^þ7ƒsXeõ¯A÷Ñ ‡à¿…|Uå *¹þv|œî©ùû§ø+?˜¥‚øa!öÀ0>=ÔG½Ô+¡/@©2}Ó;ûEHý ¶‘ûÛ¡ô Þ÷c©ˆ}ŸÃŸãa1Å7'žÀv>©’}ø € H° Áƒ*\È0a¦' #"Ôà‹Å‹3ZÔð-_ÜÙÀ¬‹-âÕI¦ájöpÑäÍ¢H’&Qªd©Qã/?²‚ J´¨Ñ£H“*U €©¥P£Jú+BÏ«X³^4×ô8­`µR°!±¬Yƒ J=Ãp¶­[2M×sK·®Ý»xóꕀܽ€õ¦]¸ ŰˆÁ2 .±c‹?§JžLþÙhÓ§•3k.Zõ±çÏ -Ž-Lº´éÓ¨S«^ͺµë†‡C?þÙY#oÞÍ{èåÞÀ%wÆM¼øÅѯ“+_μ¹óçÐõÆ6®•+¯Ô1êÎ}òïîàÏNþ1òèèÓ«_Ͼ½{ÃËË»=¼}¤ßïß?¿ÿÕóï(à€hàAÓù§àEõéç`Pù=Ø .àf¨á†–`…þ5(á}Ž… öwa‡,¶èâ‹~˜¢|"š^‰6î†âŒå­ã@)¤r2ò˜]9‡c’™íØÓ8MEɘE¼€u4ÕØE¨ñ•Šd ‰R6%…@”BþÐô˜IÐ9èÌ%朑Yæ™À¤¹f›à)œrÒ¹Z‘F‡$“¼-Ù[#:©m0ˆ S~QÉ yãÀ(•Z´Ø–óù8§# 2È ™ô)õ„Ä´ù L?ª j+©¦¢Z+«®ÂZ«@´Êjëi„JÜ¡Ý1ê ¢¼…ШUa-†GjèÑ 8õdÙ©§z!å7_„Ê8ypJM`N<šX¤Â:~©QFO¢ŠIëp NÄlç°Á¤…”\#Ìbàs $q @dÄa@#¨€æ01ì{÷æ»o¿ÿ°@GYðÁ /ÜpSKL±Åk¼qBÅ^þe™[Vy¥¶ ~Ñå—ý!˳Ë:eÑûA«˜”[†ñ§=ñéEP©_°€† •°@ÕC©Iª@ñE ¤ðH0øœCo˜Ó%žÂ«È¿º‘ª©tSÂ8™HP´Mª¸rB1À¸€ üp‡23·'·›Ûý+°yï=Hß>xáÀÞ”âŒ;¹ä”WŽ`|YA*)¥[^šé¦ÛN"P"M¢ÑÜ}PB É”  ö9šÑb|ÀÏé~‘ôRwúN™ÍLÀ'ÁÇT¬ÂÇpK« ŽðãA#Ôþ¬¿¶Sfî0 AW¼a(ˆã:{çþKßúê°ÍµO~R¢çî7üí¯ÿ{ÝÒ¦U­keKKËëÖ·Â5®rË"-H׺Úõ…wÅk^=o„G<ã!Ï>ÌÚè1& €È`Ô¨'½8@dÖ¸Õ3x6Ç7j¢‘z )XÂhÞ («ö½áýÈb?ä@@‚X”hÅ7¸€„¦ŠRdßæàWÅ_]Q‹[ìâ@¾Æ1–ÑŒƒV¥¦=m[ÕUÕjìik^ÛÄÖ”Y”íli[[Û®¢BàÌ0<1ÜÌ%'¤4­@Jv¸È$À) < _)ksJ‹\F;nÁH‚Õ(þ‚E PJ èÁ"ßXG. |ãm•ú05 €6ˆ„0€‘Žg–Jša׋uЀ¥pžÁК‡@¸ H‚wŸ£Lf Ä™ÐÄf5ó9M`h“›Þ§8ÉiNtªìt'<å‰Çšq«yϳásg=ìi{ñøÄ‡•Jöf“Ýɤf*ñ,ÄX'm6“Ò~y³¦¬T'+ÑÀR€†=°á°ˆ¤T‹$cüà$@¾Êõåq±SSì¡ÎoH‰© ‹=†%ˆ`ú@Ç!pHi †‚ŠÌ3:GARŸÚT¶FuªU½jþV·ÚÕ¯†u¬ü(ëYI¦Ç«| ‡: ¬ö@åà q°1"•ÈDŸðîA$-fµ™+4NÜ«f7ËYbõµ'Ÿ ¥EFYÊVª²´¨üÂ+c9ËZÞ2—»ìå/¿Ìaó˜)|,e•¼Ý6©“—¥Nf;KÜâ÷,ýÂISÒ(½´¥x)w"SšÚ§:å©O*T¢RR·¾MToÃ;Ë×3Ã=®z×Ë^`$÷¼Žñ(y¡"ÒùżðMLzÛËßþžõ½ù¥xí[™úx(ø 0Xöëß;xXVpn|`ɸ²H°„±Âà{øÃ?Šð†s‹áÌ\¸ÂqþËâ»8H"V±v(\búŽ·Æâ®Œõ‹†[øøÇ@²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXÎ2“çðÙƒE¾8ʉœb/AH³š×Ìæ6»ùÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ Mè<§ÁÌñ¥q˜ñscû0œD´¤'MéJ[úÒ˜ÎtyÀœGߨÑJADñDánL¤š)³¦WÍêV»úÕ°Žõw7#êÚÔRAµfÆ, ¢í@§Ž´¬‡MìbûØÈ¾,§âk`çúÓ“}¶,œ ‰¡\à'¸€µG ­1@‚,>þaü6ÙèN·º×Ínu/»(D£¶µ±­m¡\€ÛÞ ¸ÅMns›ÔJqE Pp r¥zŠBÜ#(ù¸EP”A‰ ÀCÑPQu»7ÎñŽ{üãóy7QNpƒá g¸,q‰Ë‚âǸ£¢á‚I †"‚ pb(“%.dÑ[¤ZÇ OºÒ—Îô¦wTæP±9ÎuÎsŸ](B'ºÑw ð¤ í ºPz.‹Ÿ e²â`@ QY¤;ýíp»Ü‰-ò¡|=ì²ØùØ­~v¡¤}í»á5ÒÑ…†'\÷P9!ìñ_ å°FÛçNùÊ[þò’®»P_þø•>ñ g¼,òáx¡@^ò›s­K@Š Ì{Š$FaI¼BBùƒ tävÌûþ÷Àþ‘ êâ±Þõö>ìeO{Ûã>(º/ÍG$Cð^øØÏ¾ö·¯Í§úÒgÒ$|q}î›ÿü迼÷3þðÛH%h#ÊŸþúÛÿþ_ÿnà/÷/ú¾½‡8€Èjúg_¼f_W€ Ø€h,8_ 8_ ø€xHH^H^˜ ‚"8aÿ'^8‚*¸‚¸áu‚¾•‚,8ƒ48€.è[0¸[2Xƒ<؃Üwƒ»•ƒ”õ :P Fx„H˜„J¸„LØ„þNø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fø„`@|%( Bˆ(P p‡r8‡tX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽøˆ¸‡¨·†LÑu”x‰˜˜‰š¸‰œØ‰žø‰Ö† 8ФXЦxЍ˜ŠªX`–¸Š®øŠ°‹²8‹´„­X‹¸˜‹º¸‹¼Ø‹¨(оŒÂ8ŒÄXŒÆ8ÀxŒÊ¸ŒÌØŒÎXŠÉøŒÒ8ÔXÖh#ÑxÚ¸ÜØÞè·øâ8ŽäXŽÔ˜æ˜Žê¸ŽìÈ‰èØŽðò8ˆòŽôxjø˜úHö¸þø‰ýYùy ¹ ©Œ Ù‘9‹9‘y‘é‰e²‘Ù‘ù‘ ’"9’$Y’&y’(™’*¹’,Ù’.ù’0“29“4Y“6y“8™“:¹“3;mod_perl-2.0.9/docs/user/handlers/http_cycle_authen.png0000644€ÿÿÿÿ00010010000021467511727205031023432 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡\ûÇ_cì”J¶"‰ˆÙÚw©”R©ÔiÑ¢íTç´ê­Ú×SN«5 ‘­(J"”$K–HL˜1c~\Oó›ïlîA™q>ï×÷õ}Í\÷uÝ÷…çyîO×ö‘“SUU?~<^ÄNRRÒÙÙ¹? Ë®]»ÚÑ*66ÖÎÎNØV§N222âwÿQp$  è rpÎö:!]]]ÖörnjjjÖÖÖ¦¦¦å+V¬X±bwý}ûöñ»‰DZ½zu›ýñ÷÷¿páBbbbû6¹deeõíÛ—c^^^4MØV§N¢Óéü®â? +)@ôÁÔ"¿G96Ou–û÷ï;::þˆ;óQÑî­¼ç΋‹‹¶Unn®€½Qü”••ÉÈÈøÍ+**"Ñ@¬Àˆ"çÛ·oèû;µýùçŸ åÉ“'ãÆ³±±iß vضm›ƒƒC»››™™Mš4IØV[¶lY¿~ý´iÓˆ7©®®;vlNNŽ€@_ ž(Jll¬P]]ÅÙÙŽÒù/€@‘ƒß£>¢³wïÞν!AFFFV½´iíÚµÂ6¡ÓéL&Sؑ߿¿hÑ"Á¿v|•µÖ›[UUÕ† :žØ üh÷ïߟ5k:ÿè rp Ó‘mJ¢ãË—/vvv×®]366nGó˜˜}}}¡ZIJJFEE û¬‘#GŽ9Rpè^££ªªÊow:‘‘‘]Ýð“ÀDÎÑÝ=üüü’’’vNýý÷ßEEEB5a2™;wîöå;wî´Y­Í€¨@‘ƒß£rrr]Ý‘N`ll|üøñ¶¯¹­­í„ „j’œœ,Ô”•Jýã?¨Tj›5ñéÌ8ˆ˜º@´P©ÔÖÖViii2™ÜÕ}éòòò‹-jwóuëÖ ÛDKKkçζúý÷߉,$ÂÃlè F`DÑ‚ÇÚ‘×I4M›6íÏ?ÿl_Ûþù'++KØVºººB-Cf2™222K—.%Rÿ]š››…í «@ €hÁ/Q±tÒÓÓYgî½yóFØÃlX®^½Ê`0„j*T“ÐÐP"©Ú1ô=ˆt-ø%Š_¨bjçÎêêê–––îîî ,ÐÖÖ...vu0BÈÝÝÝÌÌL¨&ÿþû¯°‹¸oܸ1uêT‚•ñßFt#°FÑ‚³´{DØÙÙY[[¯]»6++++++22òðáÃUUUæææçÏŸ×ÕÕ%r“ÔÔÔ¥K— {ÌÉÙ³g…Ý‹îïïO|Ý7þ»´#³ «Àˆ¢èˆu ckkchhèêêzàÀˆˆˆ’’’Ù³g4ˆ`”ƒrqqö,*•j`` Tl.Ô,!Ñ@1¢¥¥¥‰y cbbòíÛ·üü|VÉÍ›7333;FðÍÍÍÖÖÖÄÊ`0†^SSC¼IZZÚž={„Z#:ˆt-x¯¤¤O+“H$[[[Öɳ¹¹¹[¶l¹zõ*ñÕ3222·oßîß¿?ñ‡æååõë×OYY™x¶cÇ¡~Õ¸²€ôæB™2eŠÞw rOt-xDGJJª«;Ò!¶¶¶¡ÆÆÆ¹sçîÛ·ÏÐÐxó¸¸8SSS¡žhdd-T“Q£FÍ›7O¨&èxxx¬X±go½}ûv§ÜÀDK7ÑAM˜0!%%…B¡xzzš˜˜¸¹¹ ÕÜÝÝýÑ£GÄë×××WWW uÄâ_ýE$ç€â`´ãæÎ;sæL …bkkW[[˺D§ÓO:5nÜ8KKKÖx—]\\ ­¬¬¶nÝZ^^Îþ¸[·nÙÚÚèéé;ö?þ r q'Þÿc @÷ƒ—Œˆû±È fff6lxöìY\\œPm›ššh4š½½=ñ&wîÜIJJú÷ß Ö/++»qãÆÆ…êBHBB!TYYéááA£ÑZZZZZZðüÿ)ŠPç&ûøøÈËË{yy7îîÝ»+V¬Àå;vì ?~üÔ©S Xü.ÅÄÄxzz-Z´¨¡¡!66655522ççzóæÍŸþiee5a„†††”––â ¸@7¢¥{:!‡¿þúëáÇÂfô”““ËÏÏÇ:ÉËË»»»¯¯¡¡qãÆ %%%¡:†§544˜iRQQ!x·úúú{÷îÙÙÙõíÛw̘1AAA8Ð)++ ñôôÜ´i®¹mÛ6<Œ$àÒÉ“'•””ÆŒƒRVV;vìýû÷ƒ‚‚ð¡Ï8>ÚÔÔtúôé={öÄwp €nDKkk+ú>r Öììì‰$â0bĈ^½zo2þ|â•åääp@ ”ææf¼ëJYYùÀÒÒÒRRRÒÒÒ¬RRRUUU¿ÿþ;Á755………………á’ôôt ‹÷ïß#„Y5=Š?¸T\\L§Ó/]ºÄþÖØŒ¥¥åòåËýýýÓÒÒB’’’[¶lÁ ¡\ €@Ñ‚Ç „=(O]¼xqذaíh¸iÓ¦óçÏOxîëë;fÌmmm‚õO:ÕÒÒ²wï^a;¶gÏž>}ú „äää\]]yÖ)(( ¤2™L___mmmÖ$]``àíÛ·-,,TUUB™™™ƒæh%à’–––„„Dhh(Ïó tuu322Š‹‹KKKŽ;6wîÜ^½z ¸Dä@ÄA €hé6#:………ÄS+°444Éä3f¬O§Ó½¼¼ð/‚üüüÂÃÃ…í•JŽŽ8räH;ÒYp;{ölqq±•••‰‰‰½½}DD„²²rdd¤™™Ù‚ ¬­­wïÞýèÑ£Ðéô÷ïßgggÇÅÅñ»äéé¹eË–iÓ¦?^RR²   ;;{õêÕ+W®D=xðàØ±c‘‘‘T*õÝ»wŠŠŠøüC—è ÐüwîÜiÇ6ì=z”••ТÓéëׯ×ÓÓ#þˆìììv ˜ÉÈÈdffVVV¢NoÃÓU©©©t:ÝÞÞÞÇÇï»råÊ‚ ._¾|ìØ±ØØØ¸¸8iii==½mÛ¶á!~—fΜ)##sñâÅ   ‰þýûÛÚÚ²¹khh¨ªª>þüéÓ§ŠŠŠ–––[·nÅc?.Ð @ è| ƒL&·c“üÁƒˆçò”••]·nÁÊt:ýäɓ۶m¶Wááázzz¬£€ð¨[qlF `ÿª¨¨¸oß¾}ûöq7pÉÞÞžßnµ™3gΜ9SØKtb?<AÙÙÙ“&M¶ƒÁ8yòdII ÁúuuuB­)HII¶W_¿~ݶmÎAÖmVPðß#:ˆ¼:§SÆ ºÐÇutt„mõéÓ'CCC;;;‚õƒ‚‚„ÚÕeddÔŽ]`ŠŠŠGŃLè v Ð@´t@ÇÁÁaÚ´i¶ÒÐÐHLL$^Ù²eB=eøðáÂv©¢¢B]]ÝÉÉ í6KÅøï€ÿº ZºG SUUÕŽa 6tèЛ7o8 »GnyþS Ð@´HII!„pšF1UWWG£ÑV1bDRR™L>|ø¦M›BBBŠŠŠ(ʰaÃÄÑÑÑĽvìØqýúu‚•±ÂÂÂk×®q,á¿ þÄü»Ñ‚ßîbèøúú–——}úÉ“'ÑÑÑ‚WûìÞ½›ÈÍkjj×®]K¼?õõõ . 266æ¾Úf £¦¦vëÖ-âühè ZpÖhœp@L¥¦¦ZYY¯oee•˜˜(##säÈ‘˜˜ÁC5oß¾-++›2e ‘;Ÿ8qBصùòÅÝÝg”ƒ:Q¢EÜšššyóæoÒ»wï›7o^¿~=((HKKKpåëׯ÷îÝ›` óË/¿(((ï BH[[{ûöíü®677#„n(ˆØu€hÁ/QüBG555#FŒª‰­­meeå‰',--Û¬<þ|‚+‹ †®®.‘#y0&“9{öì‚‚upŠƒQ€X€@Ñ‚_¢âèèëëûûû ÕdÀ€×®]svv&RÙÌ̬ÿþmVkll466njj"ÞÇ×ÕÕ >nFt;è Z¤¥¥ÉdrKK‹˜Žœ——G¡Pˆ×§P('Ntttl³&N711!’Y!”œœlmm-''G¼''N œÞ¡±±!$Ôm] D޼¼<úþN;{öìyòä ñú ÜÇÕðtçÎÊÊJ‚§!Ož<ùòåËÄ»ÜÜܬ¢¢"¸Ñ@1"¿GÅ4Ðéß¿ÿ!Cˆ×Ÿ4iÒþýû Ö~üx‚}hiiÑÒÒjs[;†ÿ(F•(Jll,ÁGƒ®¢££cnnÞÕ½? :ˆñ tž>}Dühà„„‚Ã?aaac—ž={^¸p`FŽùüùs‚ %ðE@媪ªµ= mÛXëºÐç¢F­aJ‘毺º#à'@‘ƒß£Bí]222cÆŒ!^ßÝÝÝÁÁHÍääd"g?{öìÇDf¸Xõ'MšD0ÊA544 B¨§šÌ¢Ëfo~¾ä%³ººàç@‘Ó£Gôý*^¦NJ¼2ƒÁhs£B())ÉÐÐÈæ¬'N<›:u*ÁC–1}Œ]# rÄ7йÿ>ñ£ÓÓÓíììÚ¬Æd2çÎëççGäžû÷ï'>œ³cÇŽ¦¦&Á D9à? þÄ:ˆ1 t˜LæêÕ«‰ç]ÏÏÏ=zt›ÕJKK¥¤¤V®\ÙfÍ/_¾ 2Dð‰,AAAÏŸ?6=g}}=B¨gÏžBµt!˜º@äôêÕ !TWW×ÕNccã„ ˆnnnL&³Íj øðáC›Õ mmmß½{Gp„fòäÉFFFB ç tC0¢€ÈQRRB}ýúµ«;"âû­Û\_L§ÓçÌ™C$eUNNΪU«.ÕÕÕ}úô:t(¡¾~Çd2ñÿbDŽ˜:™™™‚S³‹‹‹swwçyé?þ¸~ý:;9sæÌóçω¤\˜1cÆï¿ÿNäѹ¹¹#FŒhii!ØU–oß¾Ñét)))aÛº :ˆ|H°ò·oßøm,¯©©¹y󦡡¡»»{]]ݺuëÚ¼ÛíÛ·««« >://ï?þhG°‚'ñ_ .`"§wïÞH ×蘚š¬<þ|~—p¶¬7ݼy377·®®nþüùÇçYÿëׯ;vìHHH øèY³f¬É‡žø¯#Rö›=ª+oÞþb|_¶ð_#:ˆü*­­­íêŽgñâÅÕÿôé“€I.MMÍ’’%%¥+V$&&¾zõjÀ€óæÍ344ä¹¥«µµuçΚššm>·±±qÞ¼yDV@óÔ‰Îa›Ä­*QøÿÞÆ‹B•f|Ýcð°éëÿ™w<¶í,]ügA €ÈÁ'ã‰×eœ9å IDATÔUccctt4ÁÊááá'Ožäwµÿþ¥¥¥¬¯ýúõ8p ””T@@÷nðK—.544,_¾œÈs½½½UUU‰œ°ÌS':“6 š°NG¶‡$B(ŧ´Íú,_+šk[šêéì…†vªïÝL] rzõê%!!QWWÇ`0„ÝÿÜUòòò>looO¤rß¾}Ìq:/^Gͺºº¿þú«µµuÍš5Dž»}ûöŽd«©©AßÃвvÓüøºáñù"cµ71Ÿ(54Eei„PÊ­Òàm¯[L<ukyÆ«{•¡/'ôÑ’;:æIU!tpøc„‰„l·êÙý6ß3j^áó/Mu-ZÕf{Õ0üß©†oã«}_–U/«(9dŠŠýöÁ½µäB‡,j>4MU-|VÛÒÌÐ2ë5ÛÛ¨Ÿ1ìœÝ Œè rÈdr¯^½Z[[ÅhPG^^ÞÕÕ•`å™3g H¼Ð¿ÿ²²2üÙÛÛÛÛÛ;""‚;ÊAIKKËÈÈX[[yhFF†¬¬¬²rûgyp Ó·oßvß]Ò¿dÈsŽ %‘Hiå¸p MoG5V‹yýM¦ÿÿ¯Öéà¯#—˜¸aÐĺC&ÿÿYá•­{X¢õ¹ ñª[z+ƒ‰Êލúw~Ö:jÙ£©ªob>]˜™B¥ÐBC¦¨ „ò⫇LQ¹tÀ—ò¦¦·ÒÛ9¯€È‚D‘²²rmmmMMMg½V4"5óòòêêêllløUÀÇñÕÕÕy{{‡„„DFFª««sWc2™òòò©©©Db—àààãÇ'%%µ{Þ !TQQ Œg~×ÚÚÊþJ¥ÒšmÞªékËË;MÕz¨ÈèOìû·tÂ:„š¾¢ùœ~x!d4Uµ•ÁÌŽ¨Â_­hÊ)IeGTMÜ0¨ç–{·KffÎ!ÍaJë³ê+š{iÊE~'×KJB_„¢Š´Áľ™¡/üÊÆ®8xœrÒ¿VZéUF ÞËoÍ«ºÍ}´½™1¢¨oß¾ùùùŸ?&=t¹€€€ñãÇkhh´Y388˜N§ tBóçϯªªŠˆˆàÇܹs'==ýðáÃDº'%%uúôéŽD9111¡ÒÒRö™5n=ÕdÚ¼[ªyKãå/ï|Ä%Å/¾ ´îÐêM³ÿc(­@FÑ[˜¡Ï…ß-ÌGg ÙkÖ7²>÷ø¿Z’2!<@w¢ä|þü¹«;BÔ©S§LMM‰:#GŽls˜jÀ€õõõaaa’-œ={¶¾¾ž` 3cÆ "Õ>|ø!C222¼½½-,,HßIHH°(++[óïƒY˜LôìZI_y§ÿT¥ø”¦Ü*ý?Î÷­atj+;´ Gú — “6>%-/‹½ètè ŠTUUBŸ>}êêŽåî«K¤æÄ‰Whii144ܵk—ŒŒ ¡‘õë×91ùÝ»w¿üòËÓ§O‰ô'öîÝ;cccœ‰bôèÑFFFü*KII‘$Ú7zp4ÿsá7½µÌ”LÔ3C*•¥_Ý«`Ù{¤»V¯þ²¡ð½o•ÊWä6$Õ"„J_Öá¹*% Y„PÐæœþÆ=ëÊ› ’jÍfkà`èÉ¥âQ¿ `2˜™!¡Œà¶[õl·êù­yulì“!ST$ȤOï¿•f|¼Qw‚§Nîƒj„Pâ…¢Q¿h+õ“͉¬Be‡WNÜ0¨Ý¿+D,F@‰] ³fÍÁq –˜˜#¸NHHH^^žà»ÅÇÇ»¸¸LŸ>½Í'å£52Î"„4‡)92*ÍüúäRqé˯ꊡ¢”ÿ-K×2Wrüàê-åé•âÊ<Šåüþ“6ê¾RƒzvõÃë¨Oob«³#*Bé·ËBÃ]ú-¹j.ß[ú…OYÊ­²º²&ãijƪ¡‚¤üôœÈªº²¦ìûU¡ß²þtˆÑ@©©©!„ªªªºº#„deeUWWOž<¹ÍšÁÁÁ†C0eee -Zôüùó´ùÄ3gÎôèÑ£Íjü0 ?ÿü“F£}ùòEJJªãÛË·¿Ïþu]ÄŽ £Wh^¡Í¯ùÄ ƒ8]8n8iãÿ¹jê¤nêÄc57G«C%v{ €¸‚@Q$^NBBBee%‘@gùòåm.Ðió>©©©’’’øW$•JMHH°³kÿû»  @WW÷àÁƒ¡òòr&“Ù·o_ @œ@ €(¯@ÇÊÊŠ`^SSSÁ|}}MLLWsrrÒÐÐhs¦ìÀ555ítÊËË¢¢¢ „ª¬¬DñÜèeðOD~¡âƒ[D߈#FŽÙf5??¿ÐÐP˜LæñãÇ[[yì3b¹uëVAAÁ¸qãÚ|œŽŽÎ¡C‡Ú¬ÆOEEů¿þŠ£ôýobD‘ªªª¤¤äçÏŸ[ZZÚ®ÝÕ~ýõW"ý \¡µµuõêÕfffü*´´´ìر#>>¾ÍgÑéôeË– Ø.Xss³¥¥%k©Pxxø¾}ûB í»! «@ €("“É***­­­¢?{U]]&%%ÕfÍÓ§O Èü€"“É«V­PÁ`HHH,\¸PðƒBCC f¿âéÖ­[+V¬`/yõêN·Þ‘#]DT¿~ýB?~ìꎴARRr÷îÝDjªªª***ò»úíÛ7cccƒÁQÈþUZZº°°PEE tåÊŽH…8&“yùòe<~à7;²´Ð% Ð@Dõïß!T^^ÞÕiCïÞ½—-[Öfµܾ}[@…¨¨(SSSŽlí»víZ°`Á“'OBx •¤dÛ[(BCC§˜€D"=yòDOO½u ‘‰‰Iûn è*è ¢Ä%ÐñõõMOOo³Z||¼¦¦¦€ ...'Nœà(”“““‘‘Y½zõøñã7oÞ,x2B(???99™H0ÄN§Ï™3'77—ûkDGðAè ¢´´´B‚óGŠ‚°°°êêê6«ÅÆÆZ[[ó»úõë×ÖÖVî=MòòòVVVeeeGŽÑÖÖþøñã‰'jkkùÝgÛ¶mYYYÄ;Ï.%%!¤¯¯Ï} :$ GŸ1çè ¢ðàAY™¨Éïééihh(¸N}}½à P.\hllôòòâ(WTTüöí‰D²·····ýúõñãÇÍÍÍçÎëííÍ}vŸƒƒC»WçŒ=ÚÊÊŠcî !ÔÚÚŠ#¹¾}ûÊÊʶy*…޳MÑTšñ•, ÿÈÿ@…ÑÑ!r¤ÍÎ;GŒ±hÑ"~êëëyî¥RPP`ÿ :ÔÂÂ"22rÖ¬YQNSS“ŒŒŒàM[ü\¸páøñãÒÒÒÜWkjjði"óVŠŠŠƒFõɉõ½rÿqúã{·] tè ¢p"§’’’®îˆ QQQžžž‚«eggoÞ¼Y@~'û)((°6^µ´´xzz>}ú4&&F[ûÿ¤‚ÊËË›:uêÂ… qºa9;;ïܹ“ßUÖJd"©µÔÔÔ]}ÓŽ>~tQÊÊÊŠŠŠ_¿~­««ëÕ«WWw‡·ììì/^´YíÑ£GRD…††ÚÚÚ*((p_RPP P(¡ÏŸ?Ï™3GAA!&&†{úÙ³gåääÇRÄÅŠز.T 50O €èÂoÖ>tuGø²´´\·nà:EEE2a544lÚ´©¹¹™çUyyùúúúœœkkk ž'ñœ={6;;»Íóu¸ýûï¿%%%‚²¶\ 8PØûº:ˆ.üfå@GSS³Ík~ÿý÷û÷ïó»J¡P<<<”••y^UPPÈÌÌ9rä®]»öìÙÃ=,Ä`0Ö­[÷øñãvl)ÏÈÈ8vìûºœ–––ÄÄļ¼¼/_¾° Y#:è Ž`ê х߬EEE]ݾ֭[·{÷n u ÇÏ惘†ÆŽ;ø]•””üúõë½{÷¬¬¬xVøûᅢƒƒ,sÀÔÔôÎ;ì{Ú¥¤¤vïÞ’‘‘QUUUUU­©©ÁWÓÒÒšššÔÔÔÔÔÔTUUÛLŸ0¢€èÂïà»wïvuGxc2™¡¡¡=zô\---MII‰ç¥ÂÂB___muuuß½{Ç/ÊAY[[ÿûï¿Dr§³kii9wî™L:t(ǥŋãT*µ´´4==½¸¸—:thÑ¢E¶¶¶¦¦¦êêêNNNB=Ð%`DÑ…7eee…‡‡‹àkµµµõüùóÒW!„ž={fddÄo1µŸŸ¿Õ9¡üüüššš#Fð«PRRbffÆsO¸`7nä—nÝÅÅeÏž=4ííÛ·’’’•l****++³³³‹‹‹%%%8 ìs?:ˆ.Öꜵkטº@teff"„,,,(Ê¢E‹¾~ýÚÕ=ú?nß¾  BkkkŸ>}L>~Ê”)¬òòòòÝ»w#„¼½½yžúƒ¢P(±±±Ä»ºÊ¨Q£¸s«n DÔ“'O˜LæØ±c•””BBB,--}ú´iÓøµ­ªªÚ°aÃĉ…íø™^¼xqúôi{{û®îø Ð@D%$$ „&Mš„ÒÖÖ œ:uê‰'† &" “ç~b2™ýõ¿Svddd^½zÅo‘r`` ¿±«Ó§O§¥¥µ™I”ÃÇûõë÷Ë/¿©¼páÂ#GŽ„††ÖÖÖöéÓ!~÷î]EEÅ#GŽn«ªªzêÔ)¡ú~²öåDbJTÆÀž}šL&Ÿ}ª¬¬Ìóêo¿ýƯ¡‡‡÷Y| ¬¨îåË—K—.ÕÒÒJII¼½ÜÛÛ{íڵǮ¹¹ÙÕÕ•;¤À#:4m÷îÝÓ¦M[¿~½¯¯o›‡èœ>}ºãÃ0¯_¿F±ïðïDS¦LÑûŽøª#„PVV–¥¥e}}={á¨Q£:»ƒtè r/^lffÆÚÉ,##ƒ·F———WUUui×þçíÛ·6ZKKKóÜõöíÛÇó<'0##cøðá<ïöõë×÷ïß><33óÉ“'sçÎÜ·Ë—/'$$ÈÈÈ®FDvv6BHÀ沎ðððX±b^úsûömâ «ªªêêê8H:?è XïZÔY·nݦM›x^b2™fffß¾}ã¾4`À€‹/òŒRSSùÝB¡,X°`Ó¦M>>>ªªª‚;öåË—cÇŽµ¹H™ œœ„‰‰I§ÜÃܹsgΜI¡Plmmãââjkkqy`` žžÞ‡Bëׯǣ>eee!{{{œÑ}„ zzzƒf?ÍèØ±c#GŽ422Z°`A^^«<::Zïÿ‚UGà¿Äë°»´´´®í &))Éo ÎÛ·o%%%¹“{3™Lyyù±cÇòlµjÕ*ž‡WUUÙÙÙ=þ\p&s,//O^^>))IKK«ÍÊmb0oÞ¼!‘H?îøyyy///ö4ï–––vvv¬:ÎÎÎS§Ne}]±bþºpáBñãdz®FGG>|þüùEEE«V­b0¸Oâ&8 1bÄú¡5°1`mm’‘‘‘]]ݬ¬,îh!dhhxçÎîòØØØ{÷î?žûRPP£££¼¼ÜÂÂBFFFZZZVVVFF†õYZZZ† .¬ªªÚ¾}{›7g2™¾¾¾ÚÚÚ¬£’oß¾Íè°r­S©TžwêÇIOO÷ôô477?yòdKKKRRw‚º%tÆ ûðáCffæ!Cº¶'­­­üŽ ÎÍÍ555åŽrÞ¿¯««Ës'”––Ï…±ëׯ߳g‘ё˗/9räÝ»w•q³²²2$$ssçÎ7nñ¶Dï9{ölqq±•••‰‰‰½½}DD„²²rdd¤™™Ù‚ 444Ð÷1ªwïÞáTYYYx® o­ß¹s§¡¡aEEEJJŠ““†®]»¶xñbƒºwïÞúõëBÅÅÅ+W®ljjÒÓÓ;sæLiiiddä³gÏˆÌ  î`12âÏ^½|ù²«;‚vïÞ}ãÆ ž—ÌÍÍy¦ßZ±bNSÊáÌ™3qqqÜåÑÑÑ©©©<7¢søòåËÁƒ7mÚÔYQNKK˨Q£ddd²³³I$’™™Y§Ü–ž®JMMý÷ßB>>>MMMW®\AïÝ»7;;ûúõë¯^½Ò××GlîLMM·mÛ–ŸŸóæÍüüüÙ³g{xx$''#„|}}Œ¿âóЏG§bÄ`èÚ3ß¼yÃoq®¥¥å¹sç8 cbbx&r ôôôä.ÿôéÓŽ;d e100 xÄŽ`t:=55UZZ:44´ÿþ¸055A @·bÃÆÆ!”’’Ò…}¨¨¨àžlB1™L???îr ž¹êêêð† 666}×®]III·nÝâyö qT*ÕÅÅ…_bK<9i/è Ð@œŒ9!„O‡ë%%%ƒæ(¤Ñh7oÞ䮼iӦѣGsêëë?~œc·ùÍ›7I$Ï5È–––K–,yøðaHHHPP+…SûÔÖÖÊÈȼzõŠç&y*•úòåK tè Ð@œà@çÙ³g]ÕââbîtžOž<¹}û6Gakk«‹‹ Ǭ“ÉTUUåX}þüy~áË«W¯ðî§aƽ~ýšJ¥Îš5«ªªªg0¿ÿþûÖ­[Ñ÷´—Ü^¾|I¥RŒŒ~ÐQ€Ÿ NF@œ˜™™ÉÉÉååå}þü¹oß¾?ùéuuurrrÜÓFªªª+W®d/¡Ñh¦¦¦rrrìå+V¬X¶lÇ)É***'Nœà¹¸¸µµõÕ«W¬ƒûz÷î¾páÂñãÇß¼yÓÚÚZ¨þ777×ÕÕ9sF@¤¤$ô= l …‚SM‘Õ¾@ˆ)t'ÒÒÒÖÖÖ ÉÉÉNNN?ùéþþþÅÅÅGŽá(711111a/IOO×××çˆr(Ê“'O8âŒÖÖV¨¨¨°r›ççç9r$66ÖÍÍM[[›xÏ)JJJÊäÉ“/]º$¸æÓ§OBcÇŽ%~svŠŠŠ666>l_sðsèèèàÌ©à¿Ä̘1cžu<‚PRSS---9Ö1B__Ÿ½ÄÇÇ'//ïìÙ³ì…gÏžmii9tè{áþýûl¡¢Óé!!!ÒÒÒ›7o¾zõj;¶”‡‡‡'''ñøñãŸùКššQ£Fq çäääœ:uŠ£¦§§'÷±Â{öìa:qâDQQ‘à'®Zµ***Šg¦tÁ˜Lfyy¹¼¼ü‹/ˆç«jhhHOO—’’â>û ¾ Ð@üà@çÑ£GL&ó§=TWW7 €£ðáÇ;u«««ÙKð1Ä­­­ì…ÎÎÎà÷¬>\¿~]BBBIIIØ~666.X°àèÑ£!îs™xúôiKK‹……E=„}(@dA €ø144TWW¯¨¨xûöíO{èÛ·oëëë9 —,YâááÁúJ¥RwíÚE¥RÙëܺuKVV–}ÅqCCƒ¾¾~ÿþýy>ˆN§;99ñ;ЯMd2YOOg6 ÁâââB'Nlßs¢ #wCiii§OŸîê^€6ôë×û@‚H$Ò¤I“üüüâââ ;·cüxyyÍŸ?ŸcO{Ÿ>}Øó6477¯Y³FSS“½Ž››{²…ØØØãÇÇÄÄð{¤¤¤©©©°=üøñcJJг³óþýû…m‹ŠGM™2¥m" n¨¬¬¬¬¬léÒ¥]ÝÀ×Çïݻב;L™2ÅÏÏïÁƒ<·|ÿšššFFFì%>|öìÙž={X%JJJ[¶la¯C¡P Ä*‰ˆˆØ±c¿§999µ#ÊùöíÛ¨Q£Ž?.lC¬   ¨¨¨wïÞfffí»@4A Ó=õë×oúôé]Ý À×Û·o;èLœ8‘L&?þœJ¥v0•7AÜãOñññìë‹«««÷ïßÏ>šÈd2§NzéÒ%öcd`xüøñÞ½{ÇÇÛ\0&“©  ðèÑ#¡²ÄÆÆ"„¦L™"àP"( ¾}ÎÎ΋ëA·b©W¯^VVVÏŸ?ý G$ùò¥¦¦FOO½pÿþý ¬¯~~~¯ââb999V”SYYyëÖ­mÛ¶ñ{Š©©©šššP};uêTyyùÑ£GÛå ïŽ]»ï€UUUmذúˆ¾û÷ïÏš5 ÿtWöööÏŸ?‰‰ù NRR’ŸŸŸŸŸ«$±ïŠZ¾|ymm-{+ö¬O[·nå—Öª¥¥åõë×fffì+~ÚÄd2?þ{õêUâ­¸544<{öŒL&wÊUUUî-÷@ÔDFFvuÀO»®WS§NEÅÆÆrìÜþdee9Î  Ú°aë+NWTT0`«$++ëýû÷ìM¶nÝÊÞ„Ýúõë¯\¹"T—jkkŠ‹‹###ÕÕÕ…jËáÑ£G4ÍÆÆ¦W¯^¹@A €¸2dˆŽŽNuuuZZÚ~Ö”)SV¯^Í^òòåË#F°¾nÛ¶cÕÑ’’’ðgƒQ^^nffÆó`›ÖÖÖ>}úµŽ¸¶¶v„ MMMÇâÇàãþýû¡iÓ¦uüVQbÌÞÞ}OÿPMMMì%'Nœ˜7oþÜÚÚfeeÅ^aРA .dUÞ·oÏ;JHH«… 幌¦¢¢bíÚµü}õêÕ°&Åêëë÷ìÙ³gÏssóvÿ8ðÍá8º+t€¸ŠŒŒ400ÐÓÓÓÓÓûðáCWw§kÉdôýmýƒÈÉÉݺu‹½„N§³vb———/[¶Œ=íÃÅ‹ñç‡r´einn633pàaaaavvö£G¶nÝš’’²k׮ϟ?§§§³'è &“ú ;×] ê’’’,X0tèP“¹sçΜ9¯Z555õðð°µµíêv±Y³f!„BCCÜ#^½z•ŸŸÏ^òûï¿ãÄ¢¡ŠŠŠeË–±¯°ñòòÂóJL&sóæÍ}ÚÌx˜˜èââbhhheeµuëÖòòrÖ¥äää¥K—ZZZ899=þ—Oœ8QOOoÕªUfffC† ™7o^nn.¾ˆçÈðÙúõëñ|YYY™££#þ¼dÉ’¡C‡ZZZž:uŠÉdþ˜ßoxÚåîÝ»?è&&&ÖÖÖ¬¯—.] ÄŸsrrÒÓÓY—\\\>~üˆ*//¯©©áŽrðï'11QpXfnnÎZ ¼|ùò%K–,\¸cóWG0Œ°°0„³³sgݳæÎ‹*tuu…”¢t:t€èzùòe}}ýÆåääp‰¼¼üõë×·nÝ* ULLÌòåË[ZZ-Z4yòäøøø… ~ûö _ÍÈÈxùòå°aÖ,YÂd2×®]ÛÒÒ‚?~ÿMèÑ…ó(á·&‹‘‘Ï©–“'O*))3FZZZYYyìØ±åååAAAøêÚµkïÞ½kmm-##cddT___]]=z4BèÚµk§Núã?¶mÛVUUUQQÒÕÕ1cëþ“&MbÍt899Íœ9!´yófooï+W®ØÛÛ_¾|™à›¸¸¸¸¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùòåËׯ_¾}ûÖÔÔD¥Ri4ƒÁà7V4zôhuuõâââ—/_y®Pššš8¶¯¯Y³†53{ölWWWÖ¥¡C‡z{{#„˜Lf¯^½¸ÏANOOolläÈ‚ÎíÍ›7xÀ¬¸¸øêÕ« .TWWwrrrttœ3gŽM;‡†8¶èýúõSRRbÏzѯ_¿^½zõêÕ ¯666ø?ÿcÆŒA5JSSS@x-8Êà¿ ÖèÑ…SX××× Õª¸¸˜N§s «”––âaaa¿ýö{ Â~$^ýƒ³cÄGX#S§NŽŽ®©©aOëÍOûöH“Éd ‰$ñÞôtûöíN9)˜Ý»wï>ÌÚEõìÙ3eeeÖ†pöì•÷îÝëz™L&‰D:{ö,÷ݬ¬¬‚ƒƒYðð³wï^)))ƒoß¾7nܸqÛ·ogÏ/ÑqÍÍÍx«Úܹs;ñ¶B155eŸøC :Ÿs½víÚ¨¨¨?âáÌÚÚZ99¹Ã‡+))999ÉÊÊFGGoÞ¼Wíééyùòå•+W²¢|„Žòïß¿´téÒ.øñ èÑenn.''wáÂ…³gϲ^{÷îíÝ»÷¦M›øµÒÒÒ’ eMx±;tèÐ!CŽ;6pàÀÛ·oïÝ»—xX*ì[©±çÏŸãÕ$)))222S& 8°õÿb2™­¼0™LƒÁúÀ/»{÷®——똾N¡  À:à!téÒ¥iÓ¦á@ÇÃÃcçÎÚÚÚ!ƒñçŸâÃýNœ8Ñ¿ÿùóç³ß§¸¸xË–-ÁÁÁmvïÓ§O/^¼X¹r¥‹‹‹ÁÊ/ÕÐР©©CÿŽÁ`°>·¶¶¶ãscccccc§ôpݺužžž‘‘‘¦¦¦111K–,áÈxÊ^ Žòøo‚@ˆ.%%¥½{÷îØ±ÃÖÖv̘1²²²éééYYYx®Äßß¿¬¬¬°°!tåÊ%%%###OOÏ-[¶L›6müøñ’’’ÙÙÙ«W¯^¹r%BHZZº¡¡!((èãlj‰‰¸íˆ#ðç«W¯º¹¹ihhà\ÑÑÑøÈ>žã>³gÏnó,c&“Y__¯ªªšŸŸOðwØnþþþ¡²²²]»vuîUTT:å>S§NÕÕÕ={ö¬……™LÆÿfÇ^ Žòøo‚@ˆ4 Ë—/ß»wF£ijjzxx¬[·!ôÏ?ÿ”””àjø¥eeeåàà0sæL™‹/IHHôïßßÖÖ–õoßS§NíÚµëúõë222 ÈËËóññIMMÅù nݺ¥ªª:eÊœü(((:ÆÆÆ{÷îýûï¿ãããôõõsssÓÓÓña}!''§0ŒeË–ýþûï?ôwB&“y&xZ´hÑÞ½{}}};7Ð ;v,ë,V~+MMM???<ÇÇd2%%%—,Y‚’’’ÊÉÉáÞwÿþ}Á‹«ÜÝÝ-,,víÚõ££œÒÒÒHHH,Y²D^^^ò;2™Ìú,!!ÑŽÏÛ¶m#Þ“¯_¿úøøàƒ­/_¾lhh¸`Á|‰D"­]»vË–-nnnÜ“¡Üáµà(€ÿ&t€¨=z4^)Ì{Ì€ÅÞÞ¯Öä6|øð¨¨¨6šÍQ²xñâÅ‹ó«¿qãÆ£G¶yÛÊÕÕÕËË+**êË—/xªÞ¹s猌Œp ¤§§gnnŽWá°²xÆÇÇ_»vÍÇÇ'99YMMmРAìw¸yóæ˜1c8 ¹Ñh´Áƒïر£³zÎó'NœÀ ÒBŽŽŽ'OžìÜGÈÉÉIH±É#77÷ܹsxyµŸŸßÀYBhúôéGýüù3Ïà¹ÃkÁQ>ÿM°ë €ö»ÿ>>ˆåŸþ™òçPSS›d¿ZQQQ]]íìì̱÷Û¸qcZZZFFÆ®]»X‹ØìííCCCß¼y“““søðáþ„‘íwòäÉèèh„¿¿ûÜt.üæ¾qãF'ÞsåÊ•¬¿üòËØ±cB>d3»|ù²³³3‰Dòððà8ònèСwîÜpÎoqqñرc)J'ö™…B9~üøÁƒB§NòõõýðáCAAººúäÉ“ÐC;îöíÛGÅ;Éd2ûòs‘ ¯}0u@ûqüû»ËÙÛÛ«¨¨äåå%''9²ã7ÌÎή¨¨`—ÈÚ‰½wï^†?‡„„899566öìÙ“}-N¿pᆠLLL+55•å „>|ˆËß½{DZ‡À ºwww‰tïÞ=|âsYYYáDZ¡ÀÀ@üºýí·ßXCY4m÷îÝ £°°ãˆáiÓ¦ýóÏ?üNÁ),,LHH`?¡§S466â¤:::™™™Ü»¬}}}©TêÔ©S!k&ÿèЭhjjN›6J¥âõ¶dee5jÔ(üyÏž=FFF8k»‰‰ÉâÅ‹ž>}ÊÚRž››K¥Ríììx¦_¥ÑhŸ>}ÒÕÕŠŠê¬#g°¨¨(]]]¼UÛÝÝ{ëƒÁ¸zõ*BhÅŠø\€(ƒ@€î/”¹zõ*Nïà­¶nÝÊ:gõ"“É÷ïßÇ{|>œ™™yýúuö%±555®®®¬´ð*++ÇŒê¬#?|øàêêêàà`aaQ\\,`7utttII‰®®.{æ @÷ÝÍøñã ÊËËÃÃÃ;rŸ/_¾Ü¹sʬX±"%%…Édnß¾/»©­­½|ù2™LöòòÂYÉ0&“¹~ýzœ ž›‚‚‚‹‹Ëš5k:Ò1–ÏŸ?766N™2¥ªªêâÅ‹ªªª<ÇX.^¼ˆZ¹r¥(/Ct.øo;Ý ‰D¹ÏŸ?ß‘ûHHHìÛ·!Ä`0>|8hРÄÄÄääd<Ó»woŸ¡C‡^½z§»B•——÷íÛ—ç9¼/_¾ŒíÑ£ÇÖ­[;Ò+ìÍ›7£G666...ÎÍÍ}üøq›)?³²²ž>}Ú³gO77·Žw .`{y÷”™™) í%èr ?ôþ®®®û÷ïOOOOII±±±ißM”””pÖk2™œ’’¢¢¢2`À€?þø!ÔÜÜ,--­¦¦F"‘Xƒ7áááÛ¶m{óæ ÷x ÞäããCðѺ]QQQPP––6nܸ{÷î)++¼ç¹sçB‹-bßÁèö Ðé†,--ÿú믮îhƒ’’Ò»¹œœÜ/¿ürôèÑ3gÎøúú¶ï&¾¾¾ƒ¶¶¶¦Ñhjjj!„ÐÕ«W_¿~ýâÅ‹ .°A¼~ý:44”;Êa0úúúñññ7:…‡‡¯Zµ*##C]]½üÇ¿üòKVVÖ… „ãËÊÊBBB¤¤¤:kÖ . Ðé†455aë,X¹råÙ³g£¢¢òóóY9„±hÑ"„““ÓáÇ߽{G&“]\\BÏŸ?_´h+ÝUSS“œœÜöíÛ9î@£ÑÖ¯_obbâééIð?“ï߿߼yóÔ©SÏ;·ÿ~\xéÒ¥´´´ãÇ;99EEEµ#åç¹sçètú¼yó~Â5(JDDÄ~ è ~'<îº'•E‹]¹råøñãx®°<==õõõ©TêÛ·oŒŒvìØÁG¹yó&BŸ˜Ìd2=<<&OžŒÏ*d÷áÃ*•J|/wcc£»»ûáǧM›fjjú믿*))YXXTTTìÛ·OVV¶}²5557nÜ ‘H7nlGs¡(**ÚØØˆÚ‘Ù€›££cgíû"º­ 6ܸqãÎ;»víÒÒÒ¶9+i|aa!™L>þü Aƒ˜L¦——×çÏŸ7lØ §§‡*++«¯¯gϹª¯¯ÿúõëàÁƒq¾‚6mÚdccƒ£Y³fYXXxyy]»vÍÜÜ\ØÎ³;wî\ssó´iÓŒŒŒ:r"ÔÔÔ:å#@g]Wt[ZZZóæÍc0ÞÞÞ¶-**:uêBèÝ»wÍÍͺºº$)"""66öÉ“'8rb2™ZZZ¡¡¡ìÓI–––ÙÙÙB=ñòåËùùù¬b»víB͘1£ƒQN]]Ý¥K—BÛ¶mëÈ}b º³_ýURRÒßß¿¬¬L¨†999©©©!WW×ÜÜ\KKKœSÂÀÀàèÑ£ø|ÒÒRkkkîc 555ÏŸ?ïàà@üq©©©Çf%m4h££cÇ“v9s¦©©iÊ”) ˜b º³AƒáAƒ ÕÐÂÂbÆ uuu²²²êêê8]CEE…•••®®.Bèøñã¿üò >%»{÷nXX˜ŒŒŒ€ã‰¹•••-[¶ìÌ™3}ûömlldåEß±cÇßÿÝÜÜ,TÏÙ}þüùÂ… $iÇŽí¾ @¬A @7÷Ûo¿IKKoÕ¯_?›^½z%''2$66!4cÆŒ¥K—⬙!oooöÝÚ¯_¿>xðÿ±wæñP}o?³™c¨H2…JÚHÚH¥E¶6-´•D¥M”¢¤MD‹Ji/Ù ß¡„Hh!‘­ì†Ùçþþ8¯æågklºï?zݹ÷ÜsÎÍ̽Ÿû<Ïy÷ö–" ?~<ƒÁزe‹¢¢bÿþýÅÅÅ1 Ÿ0aÂÏŸ?aàsÇ8uê,á9~üøw‚‚‚Ò«A… JgÈ!VVV<ïСC‚Ÿekkûãǘ˜˜òòò²²2,[TTôõë×½{÷2äÚµk111ü¸Çd2Gíü&“ùþý{€˜˜Xzzúׯ_sss ŠŠŠÊÊʪªªÊÊʾÿ^XX—¸w€ÂÂB,»ÿþŽõ€‚‚Ò@… JßÇÉɉB¡„‡‡Ã°›?‚ È“'OÈdò† nß¾ ä 4(>>~Ó¦MµµµGŽQQQ«««MLLàR# AúÏÉÉQVV†“™9sæÀ›·ÁápD"‘B¡ˆŠŠ x™M8rä—Ë]¼xñ¨Q£:Ö J]^Ž‚Ò÷‘““Ûºu«§§§³³óÓ§Oÿ˜>AsçÎq¹\CCCyyù5kÖ¬\¹òÞ½{ ‰ÄÄDYYYظ¢¢bÔ¨QëÖ­ûã4jjj<==]]]UUU“’’ø²ºƒœœ1-|sFƒž>”޹¹9šJç_:}ÒÒÒ­[·þíY ü™û÷ï í> sê¼{÷îÁƒ0»q`±XSSS€¿¿?ÜcllÌ`0ú÷ï¿sçNwww¨rÒÒÒ¨Tª‡‡‡ s˜3g޾¾>NëV•عs'dz¶¶î@¡NRVV¶mÛ¶3fy\”vnff† TèôAêëë333ùéóQz&ÖÖÖ‚í>K¡P8`kk»gÏžùóç·íºÿ>“ɤÑh"""zzz***<ïñãÇîîîEEE04çÇ .¼q㆜œ\]8qb„ VVV Í+au>LLL”‘‘ù[¹säää`"”KDDÄßžŠ@…Nß„B¡üíY ´…ð_%W¬XáëëûñãÇ'N´˜üöíÛz{{S(”©S§^ºtéÁƒ$iÍš5rrrP¬¨««‡„„´±Æª¾¾žB¡dfföïßßÄÄ •Ãf³a‰u´P9 Jׂ HCC…Bét:Çíɶ1Tè  ü+`0˜³gÏΞ=ûìÙ³+V¬h£ÒçŽ;ÊËËÙl¶˜˜X^^Þ¡C‡&L˜ %%5tèPAöíÛ§¯¯?{öìÖTNCCƒÝëׯsrræÌ™3gΜn»¦puu-..=zôÊ•+…9. JŸ–ïÍÌÌLOO¯¨¨àp8ºººS¦LÁ`0l6@ þö[]u…‚ò1~üx¸Ô|Û¶mmTo4h¦¦¦““Ó–-[^¾|©££³~ýú””@ZZÚû÷ïµ´´Z<ñׯ_4MTTTSS3==½».£u¾~ýzñâEwöìÙžüЉ‚Òëhhh ‘H‡ÒÕÕµ¶¶vvv>xðàìÙ³)Êܹsãââðx<‚ t:ýoÏ´)¨ÐAAù·pqqé!R#û IDATß¿RRRPPPó£¥¥¥¥¥¥“'OÞ´iÓ¤I“¶mÛvêÔ©={öÌœ9“ËåŽ?þÉ“'ÒÒÒÍÏõõõÕÖÖ.((lß¾H$vûÅü?‚lÚ´‰ÍfoذaìØ±B¥ÃårEEE­­­]]]›¼#!=wî\ €€€ø‚ ” )))¸HÊÑѱ¤¤„¿?..îСCóæÍÓÖÖþúõkxx8•JÕÔÔLMMUVVÖÑÑ144Œ‹‹àp¸Æ¾|ù2880oÞ¼¼¼I]]]G½¼¼‚ƒƒÕÕÕy<¿8Ls8…Ëår¹Ü̼³«®!ׯ_/..þõë×ðáÃÇ?nÜ8ð{qi'ûGAAéäää|||–/_îää4mÚ4*•:tèP55µOŸ>5iÉápçÍ›‡Ãᩯ¯‹Ý±c,øÐI+‹Åjã¶( GŽIKKSTT<~üx'»BAAi‘6„Ž´´´½½}TTTHHˆ¯¯o‹m8ÿþý{bbb{‡&‰‹/îpØ_§„‚ •••÷KJJ®[·nÇŽ …Á`„&N}”¿Îܹs-,,îܹ³jÕª¸¸8"‘hffÖbŽãØØØ€€€ &¬ZµjÇŽÖÖÖîîźvíÚÕ«W:ÓÏ«W¯¼½½q8\@@š8¥›h#ʸÿþ€ØØX%%¥œœuuõ& ŠŠŠ$%%ÒÒÒí5c±X)))"‘øåË—6’b´ÕCΰÙì¯_¿Îœ9³‰ÊÔÔÔx{{«¨¨,^¼855U9(=–Y³f ûͤI“zàÂÈnåäÉ“***YYYûöí·ØL\\ÜÂÂBBBÂßßßÚÚºóãr¹Üààà‰'fffu¦«_¿~YZZ"²k×®I“&u~n(((-2hРÖ‰‹‹äååwïÞýõë׿á+ \.·¶¶–ÇãaÚ‰ˆˆ™L >>SSSX¸ JJJ‚¼4'99¹g5¦ƒB‡ÍfãñxÖZeeåøøx™ÊÊÊÂÂÂÖüjñññS§NíØt:ƒÁükoá(BÃÅÅåÖ­[S§N={öÛ·o·lÙrìØ±%K–„„„888P©T++«?&%%þX¼9l6{üøñÝ0qþ_5¡¹Z"‰L&sáÂ…-Úhq8ÜéÓ§ÅÄĶlÙRSSsæÌqqq{{ûêêjOOO ‰={öTUU¹¹¹IHH¸¸¸TVVîß¿_JJÊÝݽ¢¢ÂÑуÁ|ûöíÓ§O×®][´h_‡6›½k×®   Ñ£G?{öÌÆÆæÞ½{£FzùòåúõëCBBÔÕÕJKKŒŒú÷ïURR2sæLPPP@ ôôô,ЈýMãk‡o´qˆßIóüCL&óË—/‚ÌgöìÙß¾}k¾?66>T¦M›6`ÀAºBAéV°Xì”)SH$ƒÁ€{ÌÌÌ´µµÝÜÜ<ظ¥››[uuµ””T‹ý˜™™edd>î‹/::\.—Éd¶ñ†dmmÝ¿ƒ€€€¶Øæû÷ïS¦Lñ÷÷oã•®5 L&“ëêêP¡ƒÒoذaÏž=.—»~ýz//¯… úøøŒ1âÁƒÐBëààbffÖQ`õ¨Æ“&Û€Ö56T´ØI»fB¥Rsss[<ÔÐÐÀårùæ%qqqxÃãñƒ†k¯DDDF ·I$Ò´iÓ`\°¨¨¨±±1™L†¡{GÅãñ&&&P`0·mÛ¶éÓ§ËËË<<ÊãñêêêúõëWSSË· iiéúúúªªª¶§‚Ò^222Ö®]ûüùóÏŸ?#²páB¸‡Ã™˜˜ÄÇÇWTT¬]»–ï‡600 éÀX"""©©©]6õÿ§‰$j.š|d0S§N­®®VUUÕÒÒŠ‰‰ùùó'¿7~¶ShËÛbbb›7o†Û *€¨¨èòåËá6™L677‡ÛK–,‰ˆˆpssÛ·oßÞ½{—-[†Çã ‚œœÿ> ))©«« · ˆ#à6WQQÛ_¾|±±±ár¹Û¶mãÿz#&&&d2ùéÓ§æææÛ¶m{öìYVVVll,‘HŒˆˆ°··‡YCž?Î÷«Îš5+??ŸD"ݽ{ƒÁ,]º”N§«¨¨<}úôÎ;är¹Ð dgg O·¶¶†‰&Ožœ’’B&“---·oß.4ñ‡ÒÛa±X………fffÐ-…Á`ØlöüùóùȤI“„_ûåtБL"‘Èd2\-Ö"’’’\.×ÓÓsõêÕͳé°X, ‰²²²òòrZûÁãñl6{À€Í|¡ t’âââšššªª*%%%ÿõA¸¸8111iii%%¥W¯^ñNcbbþÚt[‹Åâp8¨$DDDˆD"üÙŠŠŠŠ‰‰‰‹‹KHHHJJJIIõë×OFFFAA!&&FTTôóçÏuuuYYYW¯^…õºª"1‹]°`AllìÑ£Gýýý•••}}}±Xl»lºùùùÆÆÆ .ì3¥Ο?ÿóçÏêêj--­ëׯ0@SSÓÆÆ¦ùB\+++‰Äd2aþ4&“I&“­¬¬ZZZü2€¹¹9ÿt›¹sçÞ¼ycdd4vìØóçÏ_¼xQXׇһa³Ù"""ÉÉÉ;wî|ýú5ƒÉÉÉ8p`|||“–ü·”EÍ!ð=@AA¡¦¦¦ñ~OOO33³ŠŠ mmí¤¤$MMÍ/^Œ9òÓ§O×k`0‡sîÜ9YYÙŒnaa1hРúúúŽM…Opp0ü­úûûÃ’yyyA¨Tª‘‘‘——WJJŠŠŠJrrò‡œœœÂÖ­[Œ§Nš••õîÝ»¿|]•J}ùò¥žž^hhè–-[üüüLMMÃÃûv }}}}}ýwïÞyyy544.t¾ÿnll\^^>uêT(’ºvb þƒÁLž< ¨¨hooÿìÙ³èèèÆ-W¯^­®®¾qãFKKK,K&“/]º¤­­  R©&&&Њ000àr¹ðtccc‰eooocc°µµõ÷÷߸q#šþ¥m`öš7nÀÜèçÎóóó[¿~}xxø¬Y³ø¡ºÒÒÒ7nܼy3Çëi?ÌNù}”••³²²ø§M›æèèøåË ‰   'N|üøššÚÈÈÈàÇ2»¹¹effÖÖÖFGG¯^½ºÏüO¢t9ùùù‚Ì›7¯µuO{÷î9r¤—ËMLLì™Ñ9Ž òòòÚÚÚÃeôOŸ>å[·øÌ˜1–òêÔ4QPziii~~~\.—L&ëé鹸¸üíu1S§N _´hÑÿým·m,>èVîÝ»gkkËb±æÌ™Ô—n&§Núþý;àæÍ›ÒÒÒfffü xüö«Ž7nÁ‚0)%ƒÁ())Yˆ¡¡¡–––‡òõõ‹‹£P(ªªªÙÙÙ)))óçχ]?{öŒËå®]»v÷îÝB¿b”^ƒ²²ò¦M›ÚXÝÍår-,,ÒÒÒz²Ê:,‹D"íÙ³‡D"E@ÄÅÅïß¿úôiww÷Ë—/ÿ÷ß×®]ÓÐÐè¾y<ž§§§——‡Ã‘‘‘yøð¡¦¦f÷ ÷/àíí Ã}‚ƒƒGŒÑùâ¬(} óßÿ Ø800põêÕ:::‚,Ÿ k^Û¼  1Œ••‡ÃÁápí}çi‡ÐÉÉÉ6lØ‚ ÂÃÛ*++›5kÖÛ·oƒ‚‚ ÂÂÂddd@×åCAAù‹`0{{{ccc ‹¼¼¼éÓ§oݺÕÙÙYÀeáí"--ÍÚÚÖŠÚ¹sçÞ½{QÇwçé™9-Qz&l6‹Å¶«ÈÔ¶mÛÒÓÓÛ^X^[[ÕÞÉdffVWWkkk{xxˆ‰‰a0×BG]]}ûöíÍU¤¬¬ÌÔÔ4>>þÉ“'­·BAAé½ 6,))ÉÓÓóÔ©SçÏŸ¿~ýº««ëÊ•+»Jˆ»»»ß¼y ¨¨xéÒ%.éEpòóókjjÚµÆùÇ)))²²²ÊÊÊ­µù;ƒÁ‡÷Ú(¤Õ‚Æè|þü¹¨¨¨í”áïß¿_µj•‚‚BÇêþ   ôp¾}û’’’tttjkkwìØ1pà@kkë‚‚‚÷Éãñbbb¶oß®¡¡qóæM°k×®ÔÔTTå  ü†.¸ßŠÏ“'OÚP9RçhhhعsgÇrz ú*¦ªªºcÇŽæYƒšððáCooo{{û˜¥K>|xTTÔË—/===_¿~}÷îÝ»wïN˜0aÙ²efff&D$!!ááÇ·oßnhh`±Ø… ;vLÀÁ=ö·gÒ0 ü;¼y󦽧„††ººº"Ò¢_éýû÷cÇŽýúõk}}}QQ¿pDs¨  ÐxÏ÷ïß§OŸžŸŸ|æÌ›ÍnW`Œ@B‡Ëåâp¸»wï Òx÷îÝ3fÌPWW'‘H‚ϣàKºZ¤´´tÓ¦M{(mÑÛï³Ó§OŸ>}znnî™3g‚ƒƒSRRRRR555utt,//¯¬¬,+++**Êápjkk‹‹‹ËËËKKKSRRâââ ¾ <ØÞÞ~åÊ•}ãç,&&×gü퉠´…‘‘ºŽ¯9P©¤¦¦¶÷Äôôô‚‚×™³Ùìúúz÷ýûwUUUEEESSÓaÆ3&66ÖÖÖ¶Å‚•M‚å½¼¼ÆŽ HLLD$""BWWWBBBðÛ…@BçÇD"±¤¤DÆl6{ýúõÉÉÉL&óë­¦L™Ò$“rÛ4¾0*•ª  €~S›3pà@˜z¥'³qãÆ>ðí¥R©gÏž=~üøõë×^¼x‘‘‘‘‘‘!ȹÇ×ÒÒZºt©¾¾~7OS¨ÈËË߸qãoÏ¥#Ðét&“Ù‚’‚øùù¹»»?xðàÍ›7&&&S§NýñãŒAÞ´iÓìÙ³·lÙÏœ93;;[Àž¡q4&&–TUU]´hÑ“'O8ލ¨¨ =$t455ýüüœ 55õæÍ›m$­‚<þ<''GðnùhhhÉäôôt‰D§Ó;ÐCßFTTtîܹ{(ÿ¢¢¢666666‚|úô)11ñýû÷eee555?~üøñ㇈ˆÈðáÃÅÅÅeddFŒ¡¥¥¥§§'£/ ŠàTVV~þü¹cöf//¯•+WΜ9ÓÖÖÖËË«  àׯ_ÇŽËÎÎþùó烼½½ù®í¢¢¢ÔÔT)))Ajkk•””òòò”••KJJÈd2‹­©©QPPÈÌÌd±X6l022âr¹aÈ!p[{ Pè`±Øö†&]ºt© ¡ƒÁ`°XìºuëÚÕgãÓ ¥¾¾¾ÏTRDAé`0uuuuuuþžäädCCÃ1cÆô™ï((}EEÅ;wîtì\‹eccóòåË .;vŒÇã)++‡††òŠˆˆ°X,A>|ø ©©)//O$ûõë‡Á`¤¤¤Èd2ôR±X¬OŸ>=zÓ¦MNNNQQQ6›Í`0DDDˆD"‘H¡Óé‚?Ç ÃÂãMòŽÿ‘„„„ŠŠŠÖ¼ÔÐ…ï(, ‹Åœ={¶]³BAA2ðÒZY_”žÆÏŸ?;|n||ü¥K—ÌÍÍß¾};xð` …rÿþý””ƒQ^^^PPðåË—øøxyyùÐÐÐqãÆÕÖÖŠ‹‹0 ;;›Á`¼~ýúÝ»w‘Lž~ü8zôè´´´ &À„„&LÈÉÉ™2e ‹Å 733ƒ§ûúúN˜0¡¬¬LVVVWWwõêÕ)))#FŒ€0yòdþ’F“xý¹Ñرc#"":pµ¡¡¡½W?~üèׯ_aa¡ŒŒŒ¬¬l\\\AAÁš5k ÃÅÅ¥ÅQB“:‚eee©©©ÖÖÖ¦¦¦Ë–-«««{þü¹±±1NGµ JOVÀA-:((½…N ªªª;wÞ¼y³¡¡Ëå: !!Ád2GŽI§Ó©T*l)##ƒl¯6WVVnhh P( cÈ!\.wäÈ‘ðáÞ$rdJ: ¥+ÍaaaEEE8ÎÓÓsàÀÐúT^^žŸŸÿæÍ77·ÂÂBØ’D"mÚ´éøñã‚t;xð`¸qöìYSSSqqñ§OŸfggC7 J Ô¢ƒ‚Ò[hW-ª¹uëÖš5k Øl6‡Ãir‹Åâp8&“)**ŠÅbÓÓÓøG‡ ZßQ.ü(œ&ëÉ»xyyÇ„Nß´iSxx¸šššMrròÝ»w‹ŠŠ<==ËÊÊx<ž›››l,--ýäÉ…¼¼P¡ƒ‚Òóa³Ùx<‹ÅÒh4CCÃ.é“Á`ÁDD"Aׯ_'''óCmÊËËUTTž>}ºhÑ¢††¸¿;ÒkýAèðx<¸ê½Ã”””8;;ûøøÀ`a,;gÎ2™\^^^YY©¤¤TQQ1nܸÜÜÜÑ£GçääÀ:ì«W¯NLLHHH¬Y³†F£q¹ÜâââÈÈÈ€ß špŽ?sÉ·Veåo ”ž‹Å¢Ñhëׯøð!•JÕÓÓ{ñâE—ô\ZZÊQi‡Ã‰‹‹›1cï¾ 0ˆäñx Àøùù%%%!ÒÐÐ@"‘† &&FTT4//ïñãÇð,•½{÷ˆDbãöŸ Šp@-:((½:nnnN ÜÝݼzõêk×®)**ÆÅÅËÈÈÞ‡›5kV‹§P(œœœ… Â([!<Ó[½û B£ÑÈd²’ \M IDAT„„\0ÕIvïÞ=wî\iiiþN óìÙ3‘Å‹›››:4--íýû÷0W´¶¶6\o…‚‚ÒA-:((½ …"%%5kÖ,@qqñõë××®]+''wãÆeË–]¸pA𮼼¼ž={öëׯððpWW×éÓ§---77·ÊÊJ'''è½é¾ œ&´ŒŒù ‚ zzz7nÜèü`ÑÑÑÑÑÑ‘‘‘ªªªD"177÷Ý»w¿~ýâ7 Õ×׉‰©©©‘’’‚åIÑ[$ Jï:((½è½j\¥ ²²rÕªU0+Þ‰'`!ª?RYY ð÷÷_°`Áüùó8• >>^WWWÈ7„¶ìÉ^^^0ˆxß¾}]8ä‹/Ο?ÙXå@222>~ü¨¦¦&..ŽæÅAAéí B¥·@§ÓÍÌÌšZ<Èf³9"`?%%%€‡***ªªªnÙ²åÁƒ»wï5j”¥¥%‚ Mn\.—F£ñW˜w9­ ¶téRccãòòrUUÕÄÄÄiÓ¦u«£]LLìСCÅÅÅ&Là‡é   ôjДÞô^Íž=»Éþ²²2˜ÖoìØ±‚ôB§Óíìì_¾|ñõõµ°°ðôôÌÊÊúþý»¸¸8•J4i’‰‰É–-[>|ûöí¬¬,èD‚wŒ®¥Õ»¨¨¨ººú€ÆŸœœ|øð#Fº£h;Ê¡Óéׯ_ïÚ>utt ÚGé3 ®« AX,V×öI P¡,LDEE†††¡¡¡M=~ü¸¬¬ÌÆÆæÒ¥K짬¬ AX‡» AFF¦´´´ù¡úúúͺ-þ t(Šªªª¦¦&”f|ªªªüýýíííµ´´É táÂ…={öìܹ366¶ùѺºººººÜÜÜ&û±Xìõë×W®\ùÇþQº¶gÏž®í“H$†„„èèètm·ÂÃá4)%‹"¨Ðù§ÈÏÏ?~|×ö9kÖ¬   î.0‰Òè½j.tØlöåË—yôkhh`0˜œœþ·mÛ¶­[·*))Ñéô/_¾Ü¾}ûäÉ“Ïú :³téÒ&Bpúôi[[[''§æ¾­æ”——_»vÍÚÚzÔ¨Q?~pr<ÏÖÖvÑ¢E€ÞkÔA$--­ËüÂD"-^¼¸óýÔÔÔ„††2™ÌE‹=xð Gi‡“——÷Çf¾¾¾Ó¦M›1cFã&(:mehhØÇ,]U$Ú‡bbbV­Zuýúõ^ªu233‡Þ»&Ïd2MMM‰DbóªÞ{öì±¶¶þ£Ð+–’““îîîúúúâââ\.÷õë×Ó§O?~üû÷õ„øí½Ú¿“ý·oß^¹rå!C¾ÿþÇ~¼½½7mÚ´sçÎõë× >¿êêꢢ¢ö†m Aœwñññ“'O¾páB¯»Q(”.É‹››*..^WW×Ó´Nee¥€“ Ô×׿sçŽÐJ´ôþY¡S\\|üøñ?6‹÷öö>zô¨–––f%Ÿ>}Úù~>|ø°téR<ÿôéÓž©uŽ?Þ\ 4!77·¼¼|Ë–- ,ά:ô^Í™3çÉ“'Måçç?}útùòå»víª©©i£mmm.—»xñâëׯ2––võêÕ'Ožìß¿úôé-žõw„…B>|ø˜1cÒÓÓ›:v옕••­­­ I„>þcnnÞ.¡¨­­•““k×)BãÛ·oñññ‚´LHHX¾|ù‰'º¤Bj/ENNN__?44´§i‡cÆŒÀÀÀáÇ mnm““ÓµZºœââbqqñ«äü-Ž?ÞµÓêêjK~ûömÙ²eW®\iíÖÿ3tèÐŠŠŠž©uBCCëêêiyèСºº:Ãx{Ð{Õ\èüüüæÎkiiéããÓF'NÌÊʲ³³ûõë—··w`` Nß±c‡‡‡™Læp88®y͇? Çðg¡½WK–,i.t²³³“’’Ö¬Y³ÿ~A&—™™ihh())Ù¶ lBwè»®ÅÈÈV|mAvîÜ ÈÎζ°°8|øp‹) þŽ;èZGJJêöíÛm4ðöö¾sç‡ËÊÊÒÓÓ;}ú´ NÛªª°°PÀt¥(­qüøñêêêîèYNNnÆ m4xüøqVVVEE…¹¹ùîÝ»wíÚÕëì¾Ý ‰DºzõêÚµk{¦Öìܹ³)¥¦¦FGG³ÙìcÇŽ½{÷îðáÃbbbœ^Ç€Þ+‰Ä`0š /**²¶¶nCèÉd ‚‚ssóððð‰'º¸¸˜ššb0(Èd2‚ Í…NwX ®¤ÑhͽW??¿ÀÀÀE‹ݺuëý”——äåå› ùóç7®˜ÚdôþË2dH áƒÁŒ3æýû÷»ví²°°pttü7Ý8®ÇjAظqc~~~TT”µµõ«W¯Nœ8ñ×£Ç$%% þîz;¾¾¾ÝÔ³¸¸¸‰‰I Þ½{—••5uêÔ„„„cÇŽ%$$ôïß¿›æÓKQUUíÉZgþüùmh.—=räÈÜÜÜgÏžåääœ8qbäȑœaà{¯BBBšâp8...“'ONHHhñôqãÆáñø“'OâñøW¯^éèè0™Ìk×®:u***ª…Ýñ¸¨GQQÑaƵ¸0øîÝ»ÕÕÕÖÖÖ‚ô£¡¡A§Ó¿}ûÆß3bĈ¨¨¨ÊÊÊððð_¿~¥¥¥AO^ch4Zßpðûùù9::„;wîXYYüíý Ö166®¯¯_´hÑ›7oþöŒÚ™LvqqÙ·o‘H š9sæ—/_þö¤Pz=†††gÏžíׯߋ/tuu_¾|ù·gÔã€Z§_¿~Pët‡ƒ£[QWW¿uë–ººzaa¡••Uppðߞџi-s àÂ… ‚,[¶¬µsa$ò¾}ûîÝ»7fÌ.—;{öìuëÖeffæççCOƒŽEG ¡V‹L§Ó§OŸ.ˆ>8qâû÷ïÙl¶¨¨èîÝ»óòò>~ü8gÎ S\\L"‘ÆŽÛüý˜F£AæÙóY´hÑ¥K—¡«Kâõz#½Z댯\¹2dÈèÆº{÷îßžJ¯GKKëÆZZZÐåééÙeœ{5½]ë(((,^¼º±zx`“É411iÑhýë×/‹%!!ÑÚ¹“'O¦ÓéÒÒÒ‚H$÷ë×/xèíÛ·üÜʧɉ͢~{¯Z<äïï È:ýúõ£R©ååå¯^½*//?~üx¿~ý.^¼¨««»|ùrƒÑš+§ÏXt jjj×®]300¨¯¯ßµk×Ñ£G»<¿V¥¨¨héo–/_žŸŸ/%%U__oll «Ö÷"¨Tj``àܹsétºµµµ]sO6 J»‘‘9{öìºuëÇŽ[¸p!ÿÙð/SUUõà7>|X¹r%…Byúôé¢E‹zÖ!»vírww{öì™……EVVÖßžT«ˆŠŠŠ‹‹Ï;·Å£\.·µG³ˆˆÈœ9sm^ßéþýû‚À¿]Ï:¢¢¢T*uܸqÍegg¿zõÊÊÊ ºôZCKK ƒÁOž<9>>~ÅŠC† yóæM@@@dd¤²²2¼¼æ†¬¾§(Š»»û?èÆb0þÊf³Ÿ={ö·g×nP7J—ƒÅb7mÚ„º±óãÇý8wîLžûúõkAbC{ ×®]ën¬6¼W<¯5¡chh(!!Ñš$HHH°³³ƒç6:-4ò^¥¥¥5?êççwëÖ­¥K—¶ÖôØ>}úÔ©S4ÍÆÆ&''gÀ€<‹Å¶&tú’9§1‹-ÒÐÐØ·oß¿°KAA¡5ÿέ[·?~,äùt!ÆÆÆ#GŽtvvîQ«±Pz5ÐuèСwïÞýË«±¤¥¥aÂØæ¤§§ýú•Íf yJ]tc9sæþýû=y5‹Åš7oÞÙ³g¯]»Ö¤®xk‘“'OÒh4þå0™L‘ÚÚZ~Ÿ¨¨¨¯_¿JII3†@ àñx‰4sæLC~ÛE;RÚÃÌÎÎÎÍ=|ø°¼¼ÜÆÆ¦ ¡£­­]UUuþüyGGÇuëÖQ(”¬¬,ggg‡ÓvM¥>üó†n¬£GÆÅÅõíÕX$iôèÑ-ê±I’º±<<1Œ––Ö† üüüŠ‹‹'MšÄãñš„æüøñ£I·RRRNNNÐÕPWW‡ùÀÚŽéí:üÌ-…U ¤¤¤Zèj¬¾º ¥ËAWcõyzÅj,,‹Çãa0óæÍ{øð¡ŒŒŒššZtt4‡ÃINN°¶¶†/êü§6›Í†//¯‹/jhhlܸ1''‡Ãá$&&øIõ`Pv7}·Û§!ÚX{ÕvEccc‹mžå‰Á`DGG‹ˆˆ@Ý#œÐ¤¶¹víZtttóh¡nå_^Õ—@Wc¡t9èj¬>OÏ_í7yyyt:@ p¹\F¥R‡ ¸rå l¦¦¦7`-O·råÊ/^¬_¿þÇþþþjjjüàªÌÌL¸‘––6xð`øñëׯL&³ —ÔµOèP(”¡C‡N˜0¡ù¡¶…ÎÊ•+ÛøeZXXܺu ZŒZ:BÖyyyŽŽŽË—/‡’Sh n¬¾êÆBérP7Ö¿@uc!‚Á`ÊÊʨT*ôd}ùòf~6l‹}þü9lÉápªªªC† ñôôtpp––ÖÖÖ®¯¯o,H$RRRRiiiRRç?&NœxèСÊÊJþú$ÐÒ¥öÒ>¡ƒÁ`nݺµcÇŽ~ýú5>Ô†ÐY¶l™–––´´4™L®¬¬älhhX¹r¥¿¿?@CCcÊ”)zzz³fÍ‚Nœµk×¶k’ŠÍ¬¬,kkk(B…9ºÐÜXß¾}ƒ«4û<ÑÑÑW®\²…¬«ÜX½.SÈ¿ƒð]H=ÁÕ{:u€šššæÑÝJÏtcADaa!€L&³Ùluuõoß¾¥§§7‰ÅÁãñ?~ܰaÃÑ£GÍÌ̼½½§L™Ò¿ÿùóç7éSGGçÞ½{M¾ÀL&ÓÕÕUGGGDDDDDdذa>|èüsªÝá/"""C‡õöö.++{ôè‘©©)L[ ÿ#šÇ`ð1™L·wïÞ&-edd|}}cbb^¿~ýâÅ‹)S¦xxxèéé5kênà/Ù‚B¡$''[ZZîØ±#//OhŽ+++kذaÎÎÎ0„¾S^^îàà0fÌ__ßîéo.qcíØ±ÃÕÕõ‘¤½ 777'''ž(4þº+22rÑ¢E©©©ÂôoQPP ¯¯ñâEK”w Bvc=|øÐÞÞ¾í§@øþý;Œ2†9Ž®®nEEÅ£G`›ºº:__ß™3gÆÄÄ;vìÌ™3RRRÐÓ\å0 ÿÜÖ(--ïüªÝBÇCeÃårŒŒ?~\ZZzêÔ)*• ~[t´´´,,,\\\>|öãÇ%%%~‚”––6©ê€Åb%$$llløšÆÜÜœF£‰ˆˆ´Qý«›à ?~8;;‹ŠŠÆÅÅ-\¸ðàÁƒ%%%™ƒpÜX Ã××wìØ±ûöíëÃ^øµ,--uvv3fŒ···Ðn[wcýüùÓÛÛ[KKëöíÛBöᢴ Ç ÐÒÒZ¿~=\"+þ®‹ÇãÅÅÅÍš5kùòåB÷¯€Åbkjj|||æÌ™sþüùn*qß"BscÑh´Ó§OS©Ôýû÷·q° %ß“gÍš%!!qüøñÄÄDXž944ÔÅÅÚ~äääàýË—/OžÀ™3g FrròíÛ·:djjÊãñ ‚dgg“H$…?.\¸P[[;<<¼²²’ËåN™2¥¦¦†+ÏÈÈ5jTVVƒÁHOOÏÎÎÎËËûñãÇÏŸ?«««ºÏ¢…Žˆˆˆ””ÌÖ°uëV<ÿøñccccOOOèƒÝêÆ‚ÿÕÒÒÒt:ýÂ… cƌٿŸ”;|ý=lذòòrWWWMMÍcÇŽ íïØ7̲UZZºyóæY³f½{÷® '6sæÌa¿ÑÐÐX·n]óU (­S%q8œ‡êëë›™™ñ#„ÀßrcÁ/‚ QQQúúú«V­ÊÎθøœ¡ÑhþþþóæÍóöönwѭǽ14íèÑ£***îîî…ËåÖÔÔ`0˜·oß^½z•H$ººº®ZµÊÆÆ.o’†fâĉ&&&M:ADRRnS(”={öœ^_¿~íââÂápôôôììì‚üúõ«²²RAAÃát•?§ƒ½”——+++ÿúõËØØ¸²²’B¡$&&êêêæççOœ8ÑÇÇGKK Ö5MJJš4iˆˆPUUݵk—µµ5FÃb±ð ÿ7ååå=<<øCðx<ׯ_¯[·nÞ¼y#GŽ$‰Ë–-;|øðرc‹‹‹Y,—Ë¥Óét:½ÅIÖÖÖvfµK1¡¢¢´{÷îÝ»wGFF^¸p!88˜¿”®[n¬œ>}úÎ;>ågjb±X,K]]ƒÁÀ'å7à6ŒVÁ`0cÇŽ}ôèQZZÚáÇŸÌMjm¬?ΰcðx<:Î`0˜Lf“›|„ h¥¤¤Nž<¹ÿ~??¿³gÏfddlذÁÕÕµµÚ] tc?þàÁƒÐ¿< ®[Áápüæ;›÷ÃfÛ4>¾ŽÊÈÈœ8qÂÁÁáØ±cþþþ> Y²dÉòåË…pÕ|^¿~Íårá}ƒ÷›ÆÛ?"Ò¤‚ Mš•””?~œD"ÁöÐÇÍãñtuu#""Þ½{wäÈ‘'OžÜ¸qãîÝ»0iž.ÓÀÀ@MMmß¾}999VVV222ýû÷Çápx<‡Ã5ßh¾‡ÃÁ7|¸ýãǰ°°ÂÂB<PSSóññùï¿ÿöíÛ—˜˜¸cÇ//¯¬Y³††Ëd2)Êû÷ï]]]§N=ztNNެ¬,—Ë={v¿~ýÌÍÍýýý) ?`(((ܾ}»ñ #''×åéò;(tdeesssåååúõë—ŸŸ?a„›7o.\¸ßÞ§† æéé +¶x{{Cfdd$!!Ñ8À–Ãáàp¸æ&ýøøxøg€,Y²äîÝ»üÌß<Éd²X,øoc6nÜ8}úô‘#G²Ùl˜ÝŒw²ÙìwïÞÕÕÕ5·šðx¼ÏŸ?ó;,K˜‘­***¢¢¢555‡Ÿd‰OYYY'û×ÔÔ\¸pabbâÏŸ?ëëëÃÂÂ:Ùa»øõë—€^3ÜŸ€‰­¬««ûòå ßärðàAhž¥R©›7oÞµkW÷^ÞoÂÂÂââ⃠¢R©<¯ö7ÕÕÕõõõõõõ-ÆIJJR(777KKËçÏŸ=zôÆ–––]5·²²²ˆˆ)))¸@2::ÚÖÖväÈ‘–––uuuOŸ>MNNŽˆˆ P(€¬¬¬Ã‡kkkëëë×ÕÕ={ö zåmll¢£££¢¢Þ¼ycjjZYYyþüy‰dccpqq¹uëÖÔ©SgÏžýöíÛ-[¶;vlÉ’%zzzAAA/_¾œ;w®ŒŒLttô† ^¾| o”­Õö ÛE]]Ý’%K¸\.ƒÁhžá¢m AZJJjÏž=fffãÆc0AAAíF‡ÑÐÐ>|ø›7o******„0"ŒÕ0`À™3göîÝK¥Rnß¾}ïÞ=!ŒÎçÉ“'M‚?:Oó¬"|Ÿ ––Ö‘#G²³³?þÌd2ĶmРAãÆËÉÉa³Ù¥¥¥¥¥¥ì.sæÍ3fÌHHH ]²dIaaá¦M›üýýïß¿/''G&“_½zåêêZTTtòäI“ÊÊJAÔÕÕÁï,0cÇŽõõõ]¶lÙ±cÇ ˜LfóÌyù£á§«è Ðár¹"""l6Þ•••sss-,,N:Åwè$&&úùùÕÕÕÙÚÚ:99q¹\¨f` s:N&“ù–——ÿþ¾¼¶ŒŒLãX,–L&7„ÄðáÃ'Ú«È? IDATOžÜ«³°°ÈÎÎn,tX,VPP§§'|[•‘‘±´´\ºtéåË—…ŽÇãñ u¾XìÙ³‡ÍŽ È«W¯âããÏž=‹ g‹MvÆÄÄìÞ½ƒÁp8œ   ~í*•êàà0cƌƯÔÝ͆ à»cÛt óÈÈÈ+Vp¹Ü¨¨¨@ïêàÁƒœœ–-[VYY)¡C§Ó===###+W®{ölìØ±JJJ'---99 ‹uíÚ5&“ YXXH¤gÏž¹ºº~øðáÀvvvX,–Íf7I1ÿ{CBBLLL¬¬¬ììì222455»ûÿçtPèàp¸Áƒ7Þ#޶mÛÆãñ¼½½§M›æè訡¡QWWmð·Áb±JJJš8} ÀO­Ø"D"qïÞ½øðáCkå!» ~02Æ y{{à M…5kÖ˜™™µ-T»òòòƒ¦¦¦b±Ø­[·nܸ±IM qqq"‘} ížòñãGXC@¥R-Z„Çã…•Ü¿ÿÆAë] üâEDDÀ—¿888¬ZµJhõSóòòöíÛ÷íÛ72™|êÔ©Ö¢‚ÄÄÄÄÄÄ ÄßSQQáèè(..þèÑ£sçÎÁXW,;kÖ,kkkƒ7oÞtIxòòåËÓÓÓ«ªªøîÿüü|‡sñâÅÆÍ )—ÃÑñx¼ƒƒCã;ÚìÙ³áÆœ9s¢¢¢***>þŒ ßè‹ÃáLLLâããùþ-þ¸ønÊÖÆj{†íBLLìÞ½{“&M"‰M„¶ÁÇcbbŠŠŠlll._¾ÌápDEE7oÞ¼}ûvqqqád¶ 9uê“É5jT``à°aú{Ä7nùùù€ªª*ssóA(ÊÊ•+W­ZÕ¶øðát(KJJ=ztúôéï377wÓ¦M°b‡‡Grr2›Í>sæÌÉ“'á“n„ ¯_¿&‰‘‘‘®®®ÉÉÉ6lxøðaÿþý£££çÌ™ÓZÏðM &&ÆÌÌ,==ÝÇǧ¼¼ñüEº&ÒèÔÕÕùøøÔÖÖÚÛÛ#²eË æqI"""ÍC[iØe``0{öl99¹~¿2d¼wt·Ê@ŸZ]]Ý¡C‡ÎŸ?cìUUU×­[7gΜŽ:ÆÛ·o]\\*++eee===µ´´º|¸bbذaPâóꄼ(‡#++»cÇŽõë× ³´xXXØÉ“' †ººz```»âº`$rUU ø_±bÅÆ»\nذAJJÊÔÔtëÖ­·o߆o2X,öñãÇ-ZLsss©TjZZZ~~~aaáíÛ·Ož<¹dÉ~µ»¤¤$8É7oÞ‰D)))˜c"66VUU€ H\\œ˜˜XãT¢-ÒÚXmϰ]`0III˜òUp  {öìǯY³fÏž=xåèt:ýøñãÑÑÑ€U«Vyxxç[ Í!!! cdd´k×®±cÇ aháß*KJJà×lÙ²ek×®m­¤c—ƒ È­[·|}}9ÎØ±c=== Ðå£@_í¹sçàGMMͽ{÷.]º‹ÅÚÛÛŸ>}ÚÀÀ 55USSóÓ§Oýû÷oCå@¤¤¤Š‹‹###--- )q x<^JJÊÖÖÖÚÚº½³Î ˆ»ªm Ð 6lãÆ+V¬èÚù‡‡‡CSü7œœœNœ8±bÅŠíÛ·/]ºÔÖÖÖÁÁaÞ¼yzzzx<>77÷Ç6667n<{öìäÉ“jjjL&óóçÏbbbÍœnnn™™™µµµÑÑÑ«W¯ù_{÷Uþ?ü=ã–û-—"—´„ˆ]I«(dÙj»=t“¤ õ%—\"Ù³BS&e‹T’"I³6ÑÚ.[}H¥BÑ…RlîŒùýñþüÎc>ÕÈufŒ×ó¯ãÌ™÷yŸ™ãœ×¼_ïó~‹ŠêèèÌ™3‡J¥Þ½{wüøñ·oß.)) ¹víBèÈ‘#ÎÎÎcÆŒÁ¡~<­‡}õ\C.À‰Dš;wþÊ…Ö{ºŠF£qšky(à@‡L&ÿòË/†††\Û5÷ák¾˜˜˜““ÓÚµký"ÜötÕêÕ«½½½‡hH9¢SÚÔ©SCCCçÎKÜéôõõ³³³,XðñãG‹ÕûicÇŽ-//ÏÈÈØ´i“¡¡aqq±¬¬ì w1î½þp÷îÝ3550aBxxxjjª··7nWÇYª‡îß¿?44ôÁƒ ååË—ìc~iöìÙmmm...DŸ¶¶¶Q£F)))qá¾Ïà/¾««ËÊÊjíÚµ¦¦¦\®À7ÓUƒBEE%99yÁ‚??¼¾¾þ“'O¸–¨Âz™®êÙ§OŸfÏž³TCgïÝ»7Ο={vÆ S¦L™?>n¢?pà€˜˜ØÁƒ333Éd²ššÚìÙ³‰„Ô˜1c”••‹‹‹ ¥¤¤ÌÌÌØÃ¸yóæýñÇL&ÓÍÍmË–-x%•JÕÕÕ=sæÌÍ›7Ç[ªþþûo„Pjjª²²²/*33:œö…ãTC.ûñÇwìØ1M­=à~ºŠ‰DZ²d‰¿¿?n™l"""Ë–-swwçròe(ÒUœtuuÍš5+44wÔ#°X,wwwܧç›Í®_ÒÕÕ½}ûöTUU87xUî³þ:¸{‘††Æ¶mÛ~ÿý÷å˗ߺuKQQñÒ¥KsæÌÁÛLž<ùúõë¿ýöF›?þ‰'ZZZðPBœ|ÖîÊÍäÂgº»»çÌ™ãææÆ“ÿd.¤«0Üñs$àþ/‰¤«ØYZZâζCäêÕ«Ÿ­Ù½{÷îÝ»ñ²ƒƒƒƒƒÃWß8þüž‡Šñññ‰ýl¥°°°§§§§§çgë ûŸŸÍ.×þz¨!˜™™qyÌ!^¥«Ø­Zµªݽ‡#UUÕ­[·rsÜIW± Àƒ5|VÖÖV ‰ÎÎÎ~ŸcS¦LÉËË ãù’} t>|hhh8f̘ààà„„<ô8¿XQQ‘ˆr0kkë³gÏúøø(++[YY>}ZWW—ÉdrJ‡¾JOOçZ¢ÒU`¨ <]ÅŽ‡Yíþ¹té>ö¤¤¤+Vpg )^árÁÃt;oæ!®¥«ØÃ³#‘H³fÍ:uêTmmí@~ãV"n>ÀûU½ýñ,튊ŠTSS;yòäܹsëëëY,§®3‹-êìì\¾|ùèÑ£íììðÚ999øé8¾Å“(‡;é*0¤%]5¬¹°S§Néëë v ÃM¼MW.àfºªg¸ÿÉ„ TUU8»°°ð7ÚÚÚfΜÙûç]o–––¶¶6555™ˆˆ<$kggç7›DDDð˜‰x¢(__ßÀÀÀW¯^ |SAµt:ƒ•®־̅â‡tRÜOWõ 7#¥¥¥µ´´ ¤AšÉd ÙØØP©TnvžûRoaaa))© 6üöÛo²²²W®\qttìå{‰1¯_¿îààðøñã#GŽà&¢þV[p@ºJ nº Ÿ¤«ÀÐáIºª—zîVûMøIÞ´´´Å‹ÿý÷ßxzsžèí*""B&“8ðôéSYYÙÞG93qܸqEEEŽŽŽ¯_¿®¬¬´´´ì{… ¤«¤«Àt•ÀãŸtÕyôèÑ’%KþùçF9¨—ÎÅ‹çÍ›÷éÓ'iiéÌO;jÔ(qqñââↆ~š· ]% ]†¤«¿¥«†î†üý÷ßó¶½ t¬¬¬®\¹rìØ±ŒŒŒ£CVVVEE… óƒð-HW HW!é*ÇÏé*Ô«WVVVTTtÁ‚ÜYkkkWWW\\œ¯¯/;`󤫤«Àt•ÀøtêU SPP€Ÿ†ÇOõ{gâââÉÉÉÛ¶mÛ´ižÿ¼ßE S®®CÒUo„¤«øPoSWÿÝz`ÍkÕÕÕóæÍ³´´à™•8ILL„tÕpwòäÉÚÚZé*0¨ž?~øðaHW °ÆÆÆÍ›7ÿõ×_®â>®~ÐãÆëêêRSSëìì¤ÔUccã«W¯zÞ†Åb9rÒU|«¹¹™˜úà«îß¿ª­­…tè=‹ÕÑÑÑÃL&!”’’‚‚tÕ0ÕÙÙ‰g€þ*üãyN ]ÅÜŽ(2†MKKKKKûæf®âgmmmgΜùæf®}RQQÑË»¤«†¯^Ž·é*^À°ƒ›äääÔÕÕ{³¥††Æ®]»ää䆺J ¯¤¥¥¿œ~ò«ÈdòªU«ø-Xïêꪯ¯çu-†·®®®A/“D"‰‰‰õfKqqq*•ºhÑ¢A¯j"""½ìlºbÅ ŸØgƒð×%{ØY½zµ`OäÛÕÕõàÁƒ!ÝE]]Ý–ÿMâââëÖ­ãmúMDD¤ººúçŸæuE†½A_õõõß¾};¸e~óçŸòº àÛ Ð=ill„Î(üÌÌÌìÙ³g¼®ÿãíÛ·ޤg<ÿ†tÀ× s³;ÑçÈðÎÎÎ'Ožðºü:àëäååÿøã^×0œ¨©©rmwбô:‡¨¨¨¡¡!¯kÀÿ€Ñ\ ° ЀÀ‚@ ,Ž‘CCCétº¥¥%‰Db2™ EZZš›5ûRDDDXXX?ÞÈb±222Nž¼ûÇ@‡B¡0™Ì]»v!„Þ¾}K¥RÃÃùW¯¯innîß÷ïßìØ1}}ýgÏž?~œç·™úúú÷ïß·µµ}脇‡smV¿°°°îîîíÛ·#„êêêöïßÌ]sÒÒÒ2(åøøø$&&JHHÔÕÕíÛ·oõêÕt:}P ï·ººººººÖÖVžŸ`àFÈ9ƇW 0¤øðî?@½z¼\UU•¸ý´´´DFF677ãY#""äååñKQQQ¯^½b±X222Ož<ÑÓÓSTT¼uëÖéÓ§[ZZBBBÞ¼ysúôéžËÉÏÏÏÊÊa2™‡ÂÛ1Œ¦¦&„™LŽˆˆ••íMå?}ú”’’ˆGøýé§ŸäääÞ¿jhhˆ½v횘˜ØÂ… 7nÜ(""booÿöí[“ÒÒREEÅàà`[[[„§õÝÝÝÇŽ;}úô»wïÆçäääììŒwËÿóÏ?[[[ÕÔÔš››³³³eeeçÏŸ_YY‰²´´Dihhäää „jkkùå—ÖÖV„PQQD÷\Ï’’‘œœœ¹sçöæáDYYï!ÔÚÚÛÒÒ‚¿ÐÐPb–®½{÷¾~ýšÅbIKK?{öl„ ÿüóÏÑ£G[[[wìØQ[[{ôèÑžË)((¸páþ–;;;÷îÝ‹·ß¾}ûõë׉o944TFF¦‡ƒçÝ´··ÇçÉèÑ£W­ZÕÞÞ.""²oß¾#GŽÔÖÖjii­Y³ÆÃÿ¥¾¾Þßß?//OHHÈÐÐðÖ­[òòòIIIË–-ëêꪪªJLLŒŠŠb±XUUUÒÒÒœÊAEFF?~üÝ»wJJJBBB÷ïß377úô)BHKK !4~üø»wïöïè?çXo®_ýïÞ±cdzgÏôôô„„„TUU}}}I$.ŠF£ÕÔÔ „ÔÕÕ}||ˆ¼ÿ¾ššš˜˜XccㆠLMM9•ßC}ú’„ÞÜý¿z×.//700øøñ£Ð˜1c‚ƒƒ‰o<&&æåË—!    ¼rÛ¶mwîÜ7nܨQ£|||𠵜¢‚¢‘Ïô*Ð9sæ 1uå¾}ûBõõõ{öìA=zÔÌÌ,$$!”››[XXxöìY|´! Æþ;€S9™™™ øãHJJ"¶‰‰ Æ1fŸTVVvttØÙÙkˆ@ÄÏϯ¶¶600°¥¥%!!¡¥¥%88ØÝÝ}çÎbbb åúõëaaa³fÍ"“ÉœÖÓh´Ë—//Y²DQQñÅ‹ñññd2yùòå!ooïwïÞùøøHIIåææþù矟>}’••ŽŽ¾qãF|||TT”¸¸¸²²2®’’•J-++Û¿?û!ô\Ï+Väçç{zz:::dƸóçÏ­î‡Ú´i>i>|ø‹ÿÉÓÒÒLLLüüüB £¸¸855!´cÇ„¸¸ø®]»ðrÏåœ;wŽJ¥âo9%%…Ø~ÇŽ;vìÀ¿Å¿ÿþ‹§ëЉ‰ÑÖÖ ÏÌÌ\³f’’REEEDD™L^¿~=BhåÊ•¯^½Š‰‰ihhˆŽŽÆõŸ>}zhh(>(WWW2™‰Ú¹s'§rJJJ¨Tj``àĉO:uãÆ ü˜œœL§Ó###qŒu&FÔ9Ö›«ÄWÿ»·oßîèèèææfccƒb0§OŸ^ºt)BèÔ©S†††8¾¹zõjzz:þQºmÛ6 ÎÎÎ-[¶à@‡ÓÕƒS}ú’„ÞÜý¿z×Þµk׌3¬¬¬ìííB¹¹¹'NœpqqA¥¤¤áøæÊ•+Ç_µjB(22rÑ¢E¡¡¡ZZZÞÞÞ8ÐápªÏ—z t*++}}}ÿóŸÿX[[÷žœœö™êjjjX,‰Dzôè‘››^éààÝóÇÇ©œ… ®\¹RIII__@ÔÙÙ‰úò䨬¬¼{÷.þÃÄÆÆijj"„¨TªŒŒÌèÑ£/_¾ÜÒÒ"%%Åi}VVÖ¿ÿþO”|ùòååË—?þüþýûDùÖÖÖ‰‰‰øº3qâÄOŸ>!„¬¬¬ØsŸd2yúôéŸÍxüÍzÞ¾}ûùóç7oÞlnnîGûÇ‹/BBB>|hiiIü&ÈÍÍ­­­%¶ÁM8$©¼¼œmmmqCT8•3wî\ww÷Ñ£Gëêêâ ß166Æ cÆŒÉÈÈ@¥¤¤444à –™™¹~ýúÇ_¾|yÚ´i!QQÑàà`sss111b* eeå©S§âeNå „TUUeeeãããõõõ-,,¢££%$$BFFFˆ­ €‘pŽõé*Áé¿{âĉğ¶¶¶Ä/¢ÒÒR""±³³cÿ3a „ˆˆq8œÊçTŸ¾lss³`'JKK…„„þúë¯yóæqúút÷çt×600 þtpp Z:..®‡wõ§rìíííí훚šJJJ’““555ñ?v¿ihhÉä¿þúËÁÁ}}GGBˆˆ*ÄÅÅ™L&‹Å²XÄʯ®g±X3fÌ`ŸÃ_qÚÚÚBDä!))‰Búªõì=MMÍíÛ··¶¶†‡‡766âsKKK+**ª¥}†S9666666ÍÍÍeee©©©ãÆsuuøî¾”žž.""²ÿþªª*###‹5{ölooobIII„P{{;Bˆhëþf£7§rðKçÏŸ/(((++»téN¿}ûv?.¸`X çXŸ®œþ»?«^wwwÿ*éüÁºjÕÔÔv€B¡P©TÁ) Ч»?§»ö`}ãœÊï}4òíÇË%$$pBÿ©©©ùÕÞvÄÔH¹¹¹ÏŸ?ÇË]]]xáåË—UUUÄöœÊ‰‰‰AIIIM›6mÛ¶m="^Â]7úJIIiÅŠaaaqqqt:ýâÅ‹¾¾¾ºººzzz¾¾¾gÏžMMMŽŽþù矅„„ð\ÐwîÜa±Xø‘Šòòr„§õ ,(**ÊÏϯ­­½{÷nllìÁƒB'NÔÐÐð÷÷ÏÊʺzõjZZÚܹs/_¾Œk… ôôô³gÏnذÁÊÊêÝ»wÏž=»víÚ½{÷BEEEÝÝݽ©'î¦ýðáÃ~|>˜¸¸xHHnKG7.??ÿËÍôôô®]»†— þ‘ؾ嚚œyí¹†’””œ2eJ`` þ$±þ}Ë_Âs 655éêêž9sÆÉÉÉÝÝ=??ßÙÙ™Á`\ºtéõë×7oÞܺu+>j###}}}WWד'O&&&â$,†'¥§§'''ïܹ!TUUÅ©„£££“““¨¨¨Ý”)Sðu¿„¯‡>~üøâÅ‹uttå`OŒ´s¬—W NÿÝìW}}}¼lddtõêU¼œŸŸO¬ç„SùœêÓWøjÆ) »páBgggŸ¬¬¬îîn¢qÝÑÑqñâÅMMM¸S §õYYYµµµñññáááGmiiÁ÷œؽ{÷’%K~þù稨(777" `bb‚²²²²±±™4i®NàŒ^Ÿê‰{Þ|óbÛË»?§»ö³gÏØ£¢Ú&&&W®\ÁËt:XÏ §ò9ÕçK==^Î`0ÂÂÂp33377·ØØØððp …’-!!!++«££ƒ£ÝÕ«WïÚµëÂ… $ISS“h‰µ°°ðððkhhxõꕚšBˆS9/^¼Ø²eK{{;‰DêììdÒØÑÑqýúõ222'N$¢ìo PSS;{ölZZÚ¨Q£ÌÍÍ===I$RBBBLLLll¬¨¨è¼yóp’w¤ >>ÒÒÒââ⺺ºxû~À]×­[·|ùò„„V]]½yóæ;wîHJJ¦¥¥>|XAAaòäÉøÇ™LÎÊÊ ð÷÷—––677ÏËËÃEMž<ÙÃÃ#<<¼«« 7«&$$8pà«å „ÆŒóéÓ§­[·"„¾ûî»#GŽ r“&Mòòò¢ÑhL&ÓÄÄ„½?vFÈ9Ö׫§ÿnSSÓÒÒR|‡SWW'Ö/[¶ŒF£ååå‘H$öõáááÅÅÅ ¥  7-p*ŸS}újìØ±#< Ð×»?§»¶™™Ùƒ.\¸€ÒÐÐ Ö¯Zµ*&&æÒ¥K$‰}ý–-[òóó §OŸ–ŸŸÿñãGyyyNåsªÏ—H!www¢ó`é_ÇáAdmmíäädmmÍÃ:pƒÁÈÏÏ?~ü8÷w=¸‡ùJaaá¼y󪪪 3 "#í— ssóÝ»wgfffff:;;´··3 aaáØØØ%K–´¶¶®Y³¦¹¹ùСC3gÎŒŒŒÝ¿TT”œœÜ´iÓH$Ò7ëéääT^^~ýúu++«¡û0y`$ f/àswïÞ-..FݺuköìÙ¼®@pŽñ3ÁNœ9sæÕ«W!—/^pýÓåÁoÑ©¬¬Ü·o_aaáO?ýÄþ¼—A‹ÎzñâÅ¡C‡Š‹‹mll¶mÛÆÍ]s‘‘ÕC^^þÑ£GŸ=ÀÀ´s ¯laa±aÃü Â-:ÚÚÚ¼®ÈÐòòò èá©«ÃÃ+OŸ>ÝÇÇgcyeHZt´µµ‰œ€ ÒÔÔüí·ßx]‹¡Ò×®NôÕH;ÇÂÂÂú7¦( o‡Xd“z@`A :Xè@`q5СÑhxºZ0BØÒÒÙÜÜÌd2BxÒ/üRbbâÇI$R[[ÛÚµk§L™‚×ÇÄÄTWW‹ŠŠ~³œ   ªªªèèh …"''çèèhkk‹ÊÏÏÏÊÊa2™ƒ>9'¦¦¦x2[+++<Ã0BÈÞÞþíÛ·&&&¥¥¥ŠŠŠÁÁÁ¸’¶¶¶ïÞ½ûñÇüöí[]]]???âöÇIEEźuëòòòøûv°Êé«á ôèTVVúúúâå7oÞà…}ûö((( „êëë#""öìÙƒ_rww'Þëïï/55ÕÄÄÿóçææfffö\NLLÌ¢E‹¨TêÞ½{‰À!”™™™€g^MJJêͱ ww÷;wЉ‰Q(”ëׯ‡……Íš5‹L&»»»S(”ÿüç?k×®UWWðàÁŽ;>|øàìì¼iÓ¦¸¸8„ÐâÅ‹Édr||<.*::úÆñññQQQâââÊÊÊ<=²¯xñâEHHHGGGAAAbb"±þÔ©S†††øjuõêÕôôt|˜––¶lÙ2aaa)))„Ð… „……qÐ]SSƒ»6ËÈÈ „ÒÓÓétzYYYAAwŽ®¯JKK‰¯ÌÈÈèêÕ«vvv¡üü|¢›öĉ¯]»6kÖ,„ƒÁ(//'Þ>yòä'NÈÊÊâî/¼R\\\\\Œ¢Óé¸3òرcñã!EEEŽŽŽøì}øð!Ñ“téÒ¥›6mÒÔÔ¼ÿþÁƒ×­['""‚[àÒÓÓ………322BUUU¸k3no?|ø°’’Òùóçïß¿ÿüùs.à11±°°°††33³‹/^¾|gaútžÄÄÄ :ßãŠÑ?bbb}jÈ^ á p t‚‚‚®]»öäÉ==½ÐÐPƒqéÒ¥9s愇‡S(”ììl YYYggg„ÐêÕ«7nÜ8jÔ¨ææfYYÙÆÆÆššuuu—¨¨¨ .H$UUUeeå}ûöy{{s*ïg~ýõW\Ÿ/^lÙ²¥½½D"uvvöòs -[¶à†µ„““SXXØÑ£GBgΜIKKCmݺ5//¿eúôé©©©>|ÐÒÒò÷÷Ç­²úúúÎÎÎqqq]]]êêê¡ÔÔT<¸žžž««ëÑ£G™L¦ŸŸw­7RRR®_¿Ž½³³S[[›è-¸lÙ2–——G"‘ÔÕÕ½½½ñú¥K—îÝ»÷Ê•+$IEEEIIéСCøUkk뜜œyóæñäp°uëÖ½zõ ýÿ\²››Ûž={h4BhÍš57nÜ8xð BÈÃØbÚÎÎ.!!¡¾¾^GG'""bíÚµ¡É“'{xx„‡‡wuuá~  ¸sܤI“¼¼¼h4“É411Á]+€`sww—ˆ‹‹KNN644ÌÎÎÆWü>'øGùð=ßòŠÑ³ &HJJž?§®B/^œ4iRÿš ø-! ‘ !äîîε‡˜¸ÆÚÚÚÉÉÉÚÚš›;½}ûöÚµkqö”k;e0ùùùÇçÚ¢ººº  ŸÊÃBaaá¼yóðã-¼® |p¾}†ËW ssóÝ»w÷u”—“'OÆÄĬX±ÂØØøêÕ« #))ÉÌÌìÑ£GK—.ݲe nÈðàAFFnÊzò䉓“Ó¦M›ˆ†ü-[¶ÈË˳'œœœ‚‚‚úTNo^^^ü>"‰Ä§YÏaª¢¢!TPP ¡¡A46v§OŸ&~÷ x¤,:®­­Mô`ˆÀùö™aqÅX±b…¸¸xrrrFF†®®nbb"þîúÔ¯¨¨ˆ+!À? Eg0áñuB²²²ùùùÜØ`¸´èDDD´´´­X±‚ÿ¯\<¾BH^^þñãÇ< 68ß<¹bô¯EgPp3!-: ÿèt:¯«À¿ÂÂÂx]…þ(--åuÀça˜^1ú C€Ç’““B!!!ÜLŒè< ¡Ãqör€á,t ° ЀÀ‚@翌¿€§AGGG³o_WW7uêÔÏ6Ã***lll:;;¹W{ð5ÆÆÆò_Àó<#„äååñ@õ„7oÞ¨©©}¶V^^®§§×ÑÑÁ½ÚƒáÎ1ø÷½{÷rm_ýàææ†ŠŠŠŠ‹‹‹‹‹Û´iû«áááŸMÀ«¤¤çååõeQõõõïß¿okkÒ ƒoòññA%&&ž8qâĉÛ¶mc•F£-^¼˜}ªªê‰'BCC¿,ª®®®®®®µµuH+ †8ÇèžDÜ tjkk¹¶¯~À3ÇšššŽ3†B¡8::NžžÏÒÒÒØØOºÛÝÝ}äȇ~øaÁ‚xPŒJ¥âf¡””{{ûü1==¿?sæLccã™3gÚÚÚÂO½¾ÒÓÓCYXX¨««ûûû/^¼xÊ”)’’’¯_¿VSSóññ™={6û¯j‰4kÖ, ‹ÏÊ177ÇCˆjiiÉËËãiê»»»ãââŒUTT¦NÊ>¶xXXþɾÿþI“&ihh>|¿©««+//¯«««¯¯ßÞÞ>ÔRpŽXèžD0ŽÎÿpppÀ ²²²©©©!%%%*•ZVV¶ÿþÞ”}ãÆøøø¨¨(qqq<1F»|ùò’%K_¼xO&“—/_ŽZ¹r¥ŒŒL||<•J;w®‚‚•+W–-[öøñ㤤$ .ܺu‹ÉdÙq 2ccc¼ //GªPUUMII¹ÿ>…BéM ÉÉÉt:=22211QBBBUU!´sçÎÌÌÌ5kÖ())UTTDDDÉäõë×#„6nÜ(''¶dÉ%%¥¬¬¬uëÖ•””P©ÔÀÀÀ‰'ž:uêÆð 8ÇF 777 …‚¯ó¡çÏŸÇÇǯ†‡‡O˜0}{œ())ùòVB$`À!2äζmÛšššBEEE¾¾¾¢¢¢ÑÑÑ$i¨÷Û?ñññoß¾ŠŠ"N82™<}út11±^–0qâD­[YYS–deeýûï¿ìÿ—/_ÆŽŠŠŠ‰‰ B( `ÕªUÄÊÊÊÒÒÒÇŽ›0a‚©©ipp0þw}•žž^SSDLD&“íììFÕËŒŒŒðr{{{bNé”””†††ÈÈHb³ÌÌL|;vìÔ©SB‘‘‘žžžÄªªª²²²ñññúúúÑÑуqˆ€Çàˆ$@cc£——WJJJAANüòË/8É>qN ~Ï?~ee%BÈÒÒ!¤¡¡‘““ÓÝÝ}ìØ±Ó§O¿{÷nܸqNNNÄüíT*5%%!äï–ÖÔÔäíí½lÙ2„P|||VVÖ‡„„„®\¹Â?s¥ñ6ò@‡ø/ Þµk×Pïn€¾ÿþ{IIISSÓÞ_¡zƒÅb͘1cõêÕÄš/¯> .üì-‡þû￟>}šŸŸ_PPpñâE¾ ù™………´´´……ÅàFŠ,köìÙÞÞÞÄIIÉ϶Y¹rågo9þ|AAAYYÙ¥K—ètúíÛ·á;pŽXè%ÞFºú/bB5 }}}bý³gϪ««Ÿ>}Š_•““›6m™L~þüùË—/¿\’‘‘A¥§§+**Òéô²²2KKK:®¡¡ahhXSS“ŸŸ¯¢¢‚xJKKïÝ»Gìú»ï¾SWWG¹ºº655­_¿~úôé]]] ££££÷ K!ôäÉ„N—””œ77733oŸ”””œœ,//š3gŽ••D9ÿãÿH`@ãèhkkÇÅÅ%$$”””$$$Ô××ãõ>>¼®¸jè"¾t( ¯«žºH€RWƒ ,t ° ЀÀ‚@ ,¾x¼|ˆ\¾|ùáǼ®ÀG^¼xÁë*p•À:6l(//çu-þâææ¦§§ÇëZpÀ:Ë—/çuÀcÐG ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° Ðnþ:0/ ‡7IEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_authz.dia0000644€ÿÿÿÿ00010010000001314311727205032023236 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&ful¬Žá´8i{Þ£:Ú¾ÔQá.¬Žèþ•ꨤ¸EnEÛ³ÖP­ࣱ ¥s&kã«Ý]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ{•4-û!X¡mR·&ײY±?—,ízdÌšüº4Ùt°ëM¼ûËÐ7 Ô… ;烡²¦LSÐØ¡£"ܶ'jÛŒ~øñEüuvq¹:øu2]ám½±A)b}³ žhá]¡Ì!BÖ“†îyl0à.»pk¡ðñ¾ ÉÅÿ^ËÕÁß/WGvƒ#’™„H sž6BóB‰Fd %ÚŠ˜šøØý9 <ø­ñ¾ü×Áûùøj÷X² %/Eî‰eÆVéÞL )$gDŒ¼iJÔ8«¤d ÀPQЗ&JëÜ¡])Ù×ÙºÔ kFV”éœ ©©'î ‚5;9$"FXKéßÿÞ«8Jv€vgºTÈhÆÎŒ+è£ ›²Ê ‚PAiÃX‘1%µN©2Jªž­ÛvFk~2SÇg}­=.5­kí{9™yÒÑÂõé€ßMÒô‘üÒ)*‡‘ÆoòŸ²6R=LŒv¨¬°Þ¥:%åÏý«f³b)~0p.-µNïB{Ûƒp(Kµ‹ü¢‘PJy (/ÔzO„Q4<¿hT1Y™šƒ–î·`¸RQyÓ­Pš·ò)¡Ýô¨‡eQ])øS«Ù¬/¿Å•jß6/%w´{ù> © =5°”ÙŽRt"$ƒ+ÅÐz­´5[°£ªØ¬C\¸w6”Ù‘†>¤P¡™‹„TV3›óNiêºmôk4Ô‰²³n bXÉg½ÒÊ}“ø#9Œ}È¡F“Z)ƒôÌr¬K”dk8ê\*uÛ1O’ÃJ>jt÷ínäPË>äÐNÈ-à!"’D‚CoðPn +ù¬—C¹‡xv$‡Ý ƒpמ¼t¬^J GA§Ø†!)T–:¤{=S—ÕõLÒB‚‘{ìÁjèÁƒ5u×¥›fx=Xm•X–Vn•€ß#Ù`÷jÙ¬íB¼wÛ¤c†§šÓEÝù€\GoÌ€ª‹œäŒ¯]S¡#Râ6äð ¤ìÚSÞæQãoŸ>}<ü½øZL_cB{ë†ZI| ‰òÙ$jÓƒ…“Ø´ˆš÷ 1Åâ èq•ñ/@‡ü{ù-œj.šü]ëÉO»ÛËôŽLíÎ'ExÛÓKªÅãÍÇCJƤîhd«!nbÑšTÏï­W̲XËhEfn²2¦¥Ê:•‹ 7Rel¼ûìņ-)¶‹f»Ý4ÐÝ'­øu—ž.E²ÍÂ7Ñ:¤>|Þ©!P§Ì²jØ)în@µ\V,¥Žó²cG„\5¼¯UÃõç P 0£@wÚýhÕ1—üa®Kþh:Üj{˜;Eëôñ}\m@‰ê@Œ4ùòÁ›úýŸ'ÓicOÏgÑ¥ø¡{•vz›QÞ3q*ƒ‘OºÓÉÅñ—ùbòÜÒFÓ™û<š.‹dÑV“Óˆôd‹uNìBñcîGÍtvL±²°1[b[³Ä61›bœÀa:gâH^Øx£~øpé_ûÒj¡ÄÜia"3~ô„&ËÓ9‚ÇLJͪà£sê·òqRÃæ¼P¢ žHI£`H^Oª£ÔfÉ:¨©6›¸ršŠ‰ÎXc|†s~šÁ;ŠlYíµQ.¶žøJ]¹Ïé‘]¹×ãÊ=ލÝ;J€p3†·–u4‚2P£{ê‚å¬,ÏÇhN íÈ]FÐŒ A_H0¬&=ÁtN›µÂʸ>¸oVÓH-:¶”ÒdRSRC‡ )A;Ó¨–ÏŽ"R‚BÎOx]ù ®CWs8ºš¸:)ÐT@ÜY"Lß g‹Ñ ýö D0=Œ.Çô€PÌuL J ) “ÂÉä¤*Ûé °É4áîL6;n >D¯ÖÒzZçå5›YÚ±Wjazf ëù¨O‚VÛCŸUP^4Ì}VÄ4Bý¬²Ïª³*A+hÖLŽ^˜ÌК¡5CëëÖîsö®ËCРSm«Ä›X)SM!¥¡¥ñz’ä”±Ž5"Ø“Z3´fh}!qÁÿž"õeehÐ÷ЯÒF :f+"oÇJk%c‘Ò¤°VEjÂMÛ"ĆÖjL6T'¢Œ–ÎY Zi¥œêi|”W!¶¥LfxóŽ7SDî!Pñ™ž[·ºwš»®DKA ÈÛ•>wéŠC>Àu¤+²Fºú`2Û ÙfÈ6Ã>Û MJ•L÷ž‰×t†õìÀ¢VR¢Í”ªSÓkDT­xK•za2—*åR¥Œ¨/;;Ãv®8ˆÔVC§T„FpRï×”›¡µR  åfhÃ=r¾ŽËÎp¥Ö>çf¼ªÜ ºôް»é c»7^µåÜ„N#TšÅa’ ©ñª³a 'Uš*c,ÿT™:>+{˜ýXÚzb 43Ðd½ûÐ|{zË,Ûåj´X=iºóµ·j·‰ök=aô€Žšû¥–òŠ+À‚¥Þ€Ö$¬Peå|àÇŠj>«û:C½ÁH•¡"CÅ‹€ ÝT¬÷Pî©S0Ñ‘æ D fXši|¾ÜRT²YÙîÔPTžæ @[s'CE†Šg¦¨€my àe9 GÑH&)¬²É õ°šy „A•³p¬ÉP‘¡âE@…Ý/¨ˆ.¦ém^•VXSZÚ<+¨ÐQ–cåd6+2V¼¬p}6ùƒѸ4ÉÓëdV(uŠ·× z Ê9¨m³‚2Pd xf@áû ØZ¨"õ. ¨ˆA é$D9 ÊV€š…*h–v P7U¶)2T¼ ¨{vÓèAb$¨° ËP{;‹§œDa¢Tô9Mô)2Rì):ò 6àRì—øã".ØǺ\|‚%h›­Ú —‹(éèsÄ|0›ée˜0®sÒ§òBê²È×°ÿSNÄ RÄ4g‡D8úT¥ØS8jج^i|rÂBô{3ñý:mQA‡–R›;žë{Ç«¯ u}d.†hiΩ² ï¦|š¨ªÀAÊ\THq`èðx+Hû`²I9õS©•J°‚¨YëëZÆNæ‹q±`Ø=ûà tŽ>ÍêELò¼ð¬ˆ’ÿç žcIÙµ§¼ÍÑÿMVyÂ8CÛÿZÌzóéUy×=ïΠCÝ€´Ùðz‚ZPzà„5š"TIF…—4­)_à½9~ܸ«c²r©l¾Ôàö‡ ù¶çèÏ£NÇml~‘½Nç©{Ô˜îégQx¥ ~íÆËÀjFF0ˆD RJ?óÑ£l¢"YV…©ã±r©k¾4F§ñó[Z·9Í*³m•±=ôî‰Ê“h½áÝde7 6@›Œö*eZè¶„ªLÕKƒii¼k0U,õ^Z*eÛ HV™­«Lçl$ÊÔˆýdd ƒÅ»Ë8Š|'sƤl¤ ¤%‘£.Aœ:SËduÚbó¥¸]&|.ëÌ3Ò™º@HI9(n@Õû Yõ=ýB  ¸ÖDÛ „üöéÓǃëA‰®N§E‹p„Eê$2‡Ez’÷óïUHÒ9gÇQÒkŒÔv@Ь“™eŒkJÊëÔ=õ9ÁØyÖi^½0Ùä˜À£Ýêøh,Héœ~]çÝZYŽOéù,Ú8õ£œ±åT–ŒUÜt «YLÊ)×”¨ö”ÓU„wÑ3+gw&³rfå|šî»çŠÅcÌ@Q œdMùAIRF‘^ƒ°í)oÓ?üp“eñ{ñµ˜fœÃ¯È—`ƒËÝÛàuH¢zûv`'†”4´°vi…ççËÕÅh¼öÞwa4Þ¼ŸOÇ/9*0c+f@˜a¦U[KûÀñÂR¡¼«!8Áàöàà=—bñq´X‹Œœèq_3r°"‡íÃÁ/ ¸#.5 ¤‡:܃°Ç/§§Å2;.¼ǦôeÄ`E ד­aØ£DE§`‡¡˜¥ÖîA¬ã—ËÕ—b–1ƒÛÌ09Ö±=Ðð}˜” ÏíŸ8ʾ%ÿD Ê™p{áŸdü'#«•±)|0X#ôžržÀò†§l§tž’R¬‚݃Ó¼ZF N´¸'y-XÑ"öÅ a´TØ#¹m ¢D•ªA&àˆi ®²5åm¢Ç¯“ï—>xCU¢˜1„CB÷$RH~%¿²‘A¢0dsXgãðÍКæ6±ãegôàL­—€ð|±Cõ€:$Ì×¼à¡ÈÌHÖ‡[ãÇšnÜ ù}~–Áƒ<*¥0£g«ÓÐG3½hBH•ÜF±vö¡šq‰’’‘DJe ³àKÍßë´šÏÊ¥ŽÚÈ£HÇ(ód†¶ÈÏ£ÓÄF{b ì&žJ±'”èÞ1Âà=骼(a¢ñ¥ò•mdµŠÎÜ4ZÜ(QÇg%JŸz³(y¨C‰D—qhªÝin-·4Î!˜ ÉI›†Oð̆‹óÉNñÑ$Dr:¤Nfà ð#R5›•Ki¾Lê›æC^—!i?!Iï’läµ/“Åxû’#"¥ašFxA’÷*µ|°ž’*Ù¬F$kÊV”ÒBF¤ŒH{‰HfGˆäz@¤ BÙtÕ°ÛHÞ—`Sl'X­R7Ÿè·`#UrY H2¤30©•É€”i/Éî|€dO‰oÆyæ@’u!Ò*!’“šN7j›ü@ªæ²:ŒdË&c6‘2"í)"¹!RèÃi3>) õ–´%!£|rÚ‚ttžn•[pڪجD$k)…2.ÛH‘ö‘üŽ)ö€HÒÛr‚/Ç IÒèÔÙmÒÌF©TÊ5ÛmWóY=nFœÐR£CƤŒI{‰Ij7˜{™ˆlø ]Ô¼37­¤S,¤d¤¦Q:€AêE½…‘È•|V,u"JŸÒ„¤Í“ö“ +&•¯§£«bñóAùÿœ-Fç?ü?š6ŽÏummod_perl-2.0.9/docs/user/handlers/http_cycle_authz.gif0000644€ÿÿÿÿ00010010000013350711727205031023254 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££„ßEŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{3.NyyywwwuuusssqqqX“-ooommmkkkiiigggeeecccaaa___]]][[[YYYWWW  UUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôAAAòòò\š0???ððð===îîîììì999êêêèèè555æææäää111âââàààÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾l¶8 ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvv#tttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&××× $$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅBp#ÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠYP©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœQÕšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=2 $ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî‡iíAŒ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(¢4‚PX^gÀ@ ÆDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb L¦þ¡ÀàË©´Öjë­™¦š£}*"°¼ƒ)®àÉŠ’ˆ‰ ]¼à†˜0à*í´ÔVK§®Ã­ŠÙ§ƒD;$MàICãŽé­µè¦«îºRbû¯Š} E@ä$4ÀP%Dª`L+0ð‚H¿ÿ<ðf”C ²´:$$0´ƒ+¯ ÉB0d ‘¢ÈŠ$¾úò;¤¿ üd¹E&¼pÃC®ð… -‡³*3ìð粫óÎ<[ë®gð&öi IB‘ L@$úˆ1Î,E2í4ÔC’¢‘"ADº‘‘(™óÃG™ôÒM?}ò‘Vc}ð*s )ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§2$ ‹‘5yn΋ Mƿµ‰ù ØJê}x‘•‹Ñ¸“(?+ÆãK>$?§ ™ ŽCƒéŠû-ûì´#úsgA#&oHnNdçŸãûE$)‹’a©9âÃ{¾ö/¯¤,l”s<‘Åg^ûöÜw/çíœå~اôÌ‚ŽÜA¸#F$ɉÒÂÇ/ÿ¹¤`‚d&™ Ç%Dæ@F’zcŸûàç<ù1 eÞª_’ N(¢H  ÷&HÁ n |›Ÿa|XdŒð %bˆL ª°†Ä k bH)\a _(†o„@­HE@¤NÜþªÁ8ˆô€Y¼€£ÇZkd,u"$¡ ‰CºIËÂXÆfUÃæp‡E ÂŒdCê‡b`¢aE ºñp41£ÁÂø*ŽxÌ£÷¸(>éf| ¤ iÁ9^¦Ž„¹#!ÉÈFîÌ–Aä`éÈJZò’§‚de$)Jbò“  ¥¢4INÆ“—2€ VÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbs—ô()'cJÀ ÒR`†"¦IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvº3œç°©–)™fþ噕þ’À ‚ÁÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ í‚1JÒ’šô¤(M©JWÊÒ–ºt¢U&à²Õ§m2T#}©NwÊÓžúô§@ jJc:Ï™¾Kp– é¤r*Ô¦:õ©PªT§zP¢rÔ¨@Cje”*)¦Rõ«` «XÇJV„ZUT…ÌGûÂÕHyµ¬p«\çJסn­XÅV)ÓVE½µ®½Ä)rØÂö°a=k¨Òú˜µò¥¯‰úk0üA#Ô?ypŠSP£³AØlg?{ŠÐcŸM*J‘Œ‚†Â³¦xþ†IOØÚÚö¶=U,¨ëÇ’l0ZÐOâò3ü4®q‘;Üä·Ÿè0ÁA;[ÜZ÷ºØÅ¨nÿæGOÝTÂ¥.u9áÜ`€€Ÿäm®yŸÛOVL NèÀ VððsØÐìi» ßøÎ·¾ÿ¤mvLàWõ®‹Íkøö:àJ¸AèliJÝV¸¼ÁˆÀ#ÞûÏM€¡Ÿ–À?O ~^ýô0ˆEÜOøÅ0.ðv]¥à 2X26TxÙëÏ ó¸ŸN PêÊ6Êð)R! ~šáü ú™d 3ÙŸ.ޱ–·\Û_Š·ñ-^r\¨cøÇ=¦0þC©k ~âb ¬B2^àÏ74Ë\γžãêeKY1b¾ ™ efõ¦9 >ö±A©+à 8B z°D$áOGßyϘδXû\©?'&Ðvô $+‚Ê^–)?ãàÙSX¶Ÿ¬þì«OûYS4ã ¯%í`ù¹ °"¢ „:üI [ü³×¿ö°ƒa‚S@£³PÖ´´§TNSÊÓˆu]D-(áRûÛà÷C­=)lFÛtáv ¼-îL F°J8 ÝXB»÷ÝOrKÊ܆A÷\Ô (vó;Æã -ÎÐe°Q—èÄ ^PrÔƒŸÀ‡¾ášŒxüã ¹ÈþGNò’›üä(O¹ÊWÎr‘c þŽÀ¹sãÈ»Ë*SYÿúsUC< .€üS¿ù÷Ïÿþû½ùާ~_6{‘T{B}дOðw]ÏÐ@ÍÐÆçxÉ€é'SìgSî§€ ˆ[³P vtp R¥¸‚,ˆzÈOg;¸IØ+˜O ‚µÅÞ° i‘^1ª‚Ø‚Fx„€÷‚Áƒ‡yƒ1yqQywò~:(VÆ`Ua¯€Sq¯ ^1X! V±í jP¥‚H¸†k¨„Lh(N(PRh'TX…_%m°Uá€P€àf¡Wa ™UþjȆ¬g s ˆˆç†èg3XJ5/7(R9ˆ‡€E ª``àµ@ $P Tñ£`, T1 &0 Wá Ð`¶(SP€ˆEˆà0yl°zƒðfÐwc0÷ x|øÀŽ˜Œ±ŒÍȆÅxŒ|'‰}ôœxX- ŠUaP ©@ˆœ°WŸX&€„hÁ0¼øw‘À 0@ưzàˆ}7A4Ð ï°É÷s i©ˆ ¹x胓Øi•ÈL—(4™¸T›øsÅp¥Žàf€T‘ €£ <`ïxþñh{p  ðÀŠ€`@€ z@òëP=ã@Ýà×P Vð rv LàP‰¸w‰€X ! Ðw˜1°wÛ@@ {ç@Xp °{§ÎÐí0 ðÀw ï0–‡ÀwZ â°[0 )—ti—x‰zÉ—~ÉwÕ–JâÀˆs‰Ð“Ù—Éwg™–k‰m9o‰ÚXT8}Þè‘€…!i¥p Ñ ˜` Tá î@391iÃI}P÷pñÐmipà_€ Y Îþ0Êà éx Xà -p`{'- r {G >® §0q9—ë@ ïàXðpñgð {' õ€-` ñ {癞ñˆŽùŸ: z  ºw-M° Ø 'ðŒŸÉ÷9j ±€  Šî ŸòIŸX`Ÿø©ŸüùšW›Iµ‘]Õ‘´YV€@p' S¡¾9-À}b€ 0‰0À}T±t@Яà 2 6Pl<À CPÀ ÆÌà Ð@ [° _0âéÐíwpùЈñà™5ÐE€þð©°w× mp X`dƒÀwÙwr)ó°lù*Щ9œÀw| § X0°{§EИ‘©›Ú©*ð©¡ý{ÇPð™ÿH—X ÛÀ©ž ª{ç¨*©” Ù8‘KX‘×v‘õ”‘º¤n%¤C*Và H S J:ê  I*À@ÃP Ÿ`Î`‹›Pü° $à ”ðµ€Æ íW@zÅÇ Rð VP ×àÝ@f€èàî0u` p }ÇÈà|7 à{Çõ ûËZýÔþ"‹û`.°wÀ§Š úÀw«,ë²{³1³ þð±¾ú™ÁêˆBK3;²% '›² {Û¨*Ò÷£³™­eµ1 o {¡ Üð°RTY¹´*‹0{W º0Š–p ø°Að^¹´òàwŽ9â0ŒjÝxmpú \ùˆÀwŠ¡sI¸†‹ˆûwp —_9tùx°w=;›Ë¹y»·}û·ÿ¸Íjµ°ÉÞµµ\+V‡³‡¨‰€ÅÐÜPbX°@/÷SYº€Ÿ" |÷©E  П°w¡pž,þÐ à ‰‹ƒ ¢ªÀíàpŸ«àº À™0à (‹äª  %Û Ž€ÀðºÀÄ / äk¾è«¾ìë¾ð»w7J½A—‘;- øë+íû¾ñ[½Âp½Ù»½ÝÛß¾<ŠW>ºUÖêWØZ»Qeù!ÀOzp½p'€ Áðå Õ` ` ËSY)p†|Ç$Pù` Àw1;E}'m°Û nà Ã8 àXàÒÀœ_ £‹…Ðý›¶XÐ ,°ýpÂÛáÅXÆbLÆfŒÆþ»J k°W@ J›éó0³~|gœÆOÅS\ÅWœÅnP vÂ|•‘µÂ,ìTuœtÖO°0®t¡ñP LN`baEðÊ=Õ¶ˆ„Žéš,{œÜ`ž\ ÊAÕ ï7°qü$Ô ŽraíÀ%o@>eË·Ì‚uP é¹ü·ËЇµÝX*w(Ì,Õ Ô Ë´ìOfÐ b@ŠÀOUp•þä{‡(ĽxÍ-x x û<~Þ¼~²Û~âÌäÌSK€ € GPbÐ$ ¶nát ý´ÒõO†ýàúÌÏ"Ý=€½Œc¿üþ`Ð:µpd@PV [ð laªpôàO"ÐÅ ðá°SÖ<ÒF}~°Û£íÍÒN¥hP 0 hAð®ÐZµŸ* O SE}Ôf­x%M‰'ms)­c+íÔ+U çúuPÍÀ ï€ @ÑaÁ¢6€eõ kPdÐg½Ø‘è¬oX(qsøuX'ã × çIÏ Õ Ž@ m Œp \ñ `Ðp#@Øåé@PòÐP/UÖŒ}Û—Ö¹ÖgG»˜½S‘õàåŽ Û0–6À (Ð ¬XÈíþ0™„EPvÙÕàR¶ÛàýºÎwµ“µ(ìÛ¿íRáp€Åë€0 ` €øP¼…0Þà>à^à~àžà ¾à Þàþà>Ž ­å&­E­ãÓÖeöÖéQK   N…Ë`PV°-• ]×â.þâ0ã2îtzÔ&¼Ô²ÙÔþRÁVàTH@dõð?¾ã;õ؄ـ1ÙnQÙtrÙHÞP\€âîíT1Ð Å߯0å:¥äƒÂäáämås"å^®PŒÉt• ÷ æ,æ‚"æ~Aælaær‚æþrnP‘ÛZîTX€†Ô_ÀÙ}~Rt(vÞx¾z'|žèU h›ÏNŲ PÀ¶–@é(µè€Òè|ñèjép2é þOep P…°PtÐÝ«NR¢ž'¤^¾ANhžë&^Ì´mXø¸ Ä®]þo®V¿nGÁ>jþ앲,Uë Õ }°‚míµëxÒëxaêiêo¢ê¹N{ëULp^½P,l.î0Õì2÷ìí‰4íÝVíúîO2]UÑ@ðü¤/Ìb%U ©0ñ_ññŸñ¿ñßñÿñ òÏ6¾þÉ8®µ:^ð ¥°f["ð¨'…íà 6ó8Ÿó:¿ó<ßó>ÿó@ôB?ôDóÛ0áäMSáL*ìꆼS%1íPT0&…aÞ\Oxº­¼m{è­òý°%&U/ µ 0Y¿õ]?÷÷õö8öd?PŒ™T5 x÷PRPÌXORZO÷ˆ/Þ˜ôGeÞ¬÷{Pèpö(x]. %uø‰øvïìxoƒùþ0„SEƒ QÏ€âö`ør¿ùsßùýþù˜ú¢ `ðíS/Uú°‹% Ý¥ù°ßõ²?v´¯‘¶/ú¦â_þå”0QZ°ý°ÃÃÿúÅÞÇyþÞ[?I¿n ¿ìÏ ¥ÖM`«Ê~ýÙoüH»à<»)ûe €`åi/QåÐÆÓÀþEà@‚ D˜PáB† >„8З`-v FãFŽ=~RäÈÀÕB™RåJ–-]¾„3&¨dÞÄ™S'0$}þÔ£„EšTéR¦M>…UêTªI™Œ`¨êV®Á¾”ëz”€Ma‘¢ “ÐM¶4çD„Wî\º'"Å(Tï^¾bLêXpKš6FÌ’g_ÆE5YòdÊ•¥àm˜eÎ/˜LþàL1ÊhÕ € Õo뾆»îÝ£yß¾ý7ñnÞ* ÷x1nâŒ!sFž\ùò¥HX`ê’/•N‹p-=æt‡‡% M ÌúC‡°w²X€¯yû˜ù#˜!ÌibÈ0@‰(ª-£âJ·à ì7ti8'ôé8é.Ä0C¨Ê žg4¬Jž*«$ªZb&Šqâ˜'žHoDŽpº›#€w¾ÁbÕɃqÁB”zhÁšx²Á¢ö±Å…sÖ¸F A€¢…XäF@/c£Í(Û($$!Dó%ÓLSÂ2ßäÈBç¤þóÂ`¥N©: ¡²gî žw䈇Žyî¨'{öØ#Ÿ>öù£Ÿ@Ú¢”¦t± µœqm >D8EâÀ¢;šÀ; @™S$Hd/g¥+Ì‹ „3×3Ùä¥5{eÐÍ\ß”SOc̉w¼CÖ©ø°ì…J§6~þا|½çžKÊ” µð(hþØz+Üíb¡šö Vyá²µ¢1‡-sW`Óüu_à„Å—Âb›%¸`§` ƒ3ä€w°¨â*š‘b™(’yñ'Šab˜%˜2 \UÅ€ž‚Ú¸BŸl0PUÝ’ÂÇ’kðY$ˆ?И7ç†ê æÞ€'þÔ×ßûz7€>pà…—^$`ú¨%Rù¸²B½.²‡på‚BQ-HÁ rÀQEw[q<ñcD(„a¡päèFgÁâÙg¤‹ ºèàˆVü°£ÇMé¨'7ö›~öh†òŠÀ8‡3-î B²­:¤¶fœ¶ú0@ Bºè'-hÚ«@Bá#ÌPMgæ)Á‡7¨p\!Gü¤Æ!d|ùÀG¾1É5§>CO€¥új"A.š>þÈFëìˆ'¿| óøèsSÞù›w?'è×çkúêï_n‰0ÿʸQE0nLˆÏ|D @þŒG?â$.~‡ße2? Å~þà eô!šÍPïs°Œ#d €L` ‰·À :ÆlPM`( ¶ð'Ì`ÃÒŒâ~H„ežŽ`8á €ƒYF§B&Ê‹…6ìË g˜“N±%5„âHp¨C.NÅ íÀ:îG€iT¦jÁàF…2ve‰M„£€ž˜E½HÑŠ2©âU‚E:‚d‹]¤S `Â@v¥' Æ0Ú@1„åq„$læØG ØQj’á%'ØJêå…åQd€ Ü“°ÌR`Ф\yd$e)—Iv’$–Ô$Kò¨I>Úr#Ÿ e(‹þA˜á~ˆg>T‘:ÐDŽß,¥IKôÝÊ—•l_.©˜ImFˆ“׬PQ‚9Φ”Ðø ´(sŒZä xëËiÖs!µçGpÙM_q“Ÿ+éå5IN@Ž2Š!ŠpÐDnŒ¦=%zÏjÚK}ùÔg6ÿ “]^2 ¾(Bs¨,|1ÐBe$£°&«4ŠV¢‚9¤Â¦7ÅiNuºSžöÔ§?jP…:T¢âíÙE1Ú‘}ò³£zü¨-C*R †æ )­^1îñ„èìo AÇ'¾ ©DãgEkZÕºV¶¶Õ­o…k\å:WºÖu­Æ,ÐREÒþÔn>õŽQíäT©Š?UฟP™hD#)x©4Ø"ŒÁÔpzÝ_µéW+–’‚­¬æ–šX"´Jy Â…´eÈ NÌËbÖ/ݨK8;EÏö´³e«h"Ûê9@•Àq+b…Gã\óp… vq½N”µÅ¬fs¹Ûö–Ž¿µnÁ®FÕ1ã~0ˆr®áß`³0„R2JF„7ØÕ«v5É]z7‹àµï±¬@VEwh'åÌÀÊéM†ð–@øpñ»Tý^’¿ô/œa:5C&,F-È"†·(0JÐþ°d‘× ±7ŒÑëñà ± Gœã %C øÂ2P2¤.­1¨Œ"0lK"ŽP‰yù~;Îgïøãø¹…Cörtœðµ3L#%¢ %õøaŒèTÀÊH `4cÌà³Éì>3WÍ}NDÕn¨D¨õ¤ÊàAJ‰D?P”„ƈÆßŸ¯è)Úy…fà¡AmFiÉa+Q!­›Š ,š¾D-RõÌUSOÔ¾$õ M½p‚ÜàGx¾p†7Üáï2¸;)n ’[q掺ÓÍ•'¢+¦Éf±ˆdØMš»Æg$ƒ<ç#UÄÑ IÔÜæ7ÇyÎu¾sž÷Üç?zÐ…>t›"ÁIµmFs‹G.ãÈÓøÆ»² Tꈡî –@ UG§&:öƒôãè§$Åhñ¢=rQ—:WôS@Â÷ I(‡QPmtŠV>™‹ì‡ˆÙóšt¦âvé+a»ÐÜ~8¸Ç½*M  µƒ°¢ ”Á褀þÝðˆ'»âÓÇøÆ?ž£MÏíä‘VyËK%ùÀºÜå…=¡“±¤‚ ¸Àô¨G¾ê­ÉúÌ:Þõý4Œëeÿ3Ú×*þ ‰ñ3lŒW>ÀÆñ‘xå[”ù;na¿Ñé¬úÖwJ„Ðï¨-á\•L4ð'Ô#€Š°?ò;;¥²-µ‹ŸÈó—ö×÷ƒ?¦ȇdðŸnH=qá› ÀÔ+ÀóÓtÜ|@«ØƒùÈ n˜ È©ø€± <½œ¦òC:Aç!A`1Á\AÁ< w ‰ôòÞëŠ.pª ((<…ÀŠ.Á‚jþH‡Àˆµ¨”$ˆA˜HÙp¨„w0ƒäû@t¾çûÁ^ B8B"´J ‰$òUh„ÉȪx†ËÙ?¨à@„–@Ð,Hš02ÜBÔP Ö®‘ƒt€_  - \¼óëÁåyC^‰Cb':̧A B‚îëŠßÛŠñx(©ăèx,È·PöpøÀ‚Ùb؃w(…2Ü,Ђ÷p€x´Yȃ*™7¶Rˆd\Æ,hF§1ôÈÅöx€l؇s0†vEp†>h‡YºÐA´ë£NlœOd“P,“9$E0þ*ƒRÈ Òˆ [P.ª`è¶ôBèe¸ƒ9ÈhP#A%a ÐøY(,¨‘ñáWØ›¸‚çˆ8øfxè7JøWPS€F,@IaPI–ì‘ ’!)’#I’%Á‚Tù‚€­‚„+Ð’x8™‹z4ÀìjC×ÓÇ6ù¦óóG"4°{ HüQ9Éh¬¢ €‚ŠfÐrhÈR„,ÈK™O •QqH]ˆ‡*ùËN‡@H¸ahÂŒ0Z£¤K±;ÌÄÄ‚ÅlLØÃãKQ!•/È/»y‹mx@Íþ[äz\CNÜÊÇëJ4áG2 Ë 3 Âe8–up°N S`…XÈ"0hØrh‡ ¹¹Ä‘!€YÈsi ×è|ˆª£ÉÂ?ˆIš¼.¸†èqHÂÌD,OñòìÎq)—sÁÅ}XˆUa7¶pÖÜDæÃGʼnM™MER”Ž˜òDÈžÈX‡@œ &Ðj™–yhƒy€Nï €LA•aì ˆWØÑôN˜€ˆjÐ…y`$ȼzûKy |ˆÑ­Q&Á‚u!ˆ]Uùkà ·ƒ/ÐþBØÀJ¼­ô#Œõû§Ú|@\€EÈ¡£ã (PÅ©˜°…Ø ˆF8„AÐx(0°‚ý‹Eƒ€Øb„§üP¶q€ºÜøšÅ‚®¹I±ˆ[,U ÈO5 ˜…{F &Ph‡…TIJŲ³AX›¶yGPJV81UIq€9ˆ—«lM}Í¥;ÐáRñRø[1|à µ ‹a¸‚cèŠ;áXœKÕ1,ˆÀÝyØñÅ- Kx:h.ˆÒ9à(ƒ|°† \¸‚,èƒ;à±6؇mHš<×tþ]× Vš`×Ù¡,€.Øq ×piȇ{ø‚X ^PÖ+Т Ö`ùJæ+ÖÚÂ@QBÍÁ†z3xÐËuŠ<}÷D=–)/©R6ÄR]ÒR~Ö¤AYUØ› †<°Ð­(Çâ Zß”V‰€„~@¼9@€;P†/‰YלYÈ«ÙnºÙâèX˃,µ¯1`ƒ®)p—*`Hñšè‡K@< à<Ð6°Ú^µØ_Í­Œ]®%ޝ;»q€ ª‚h3‹d …Ȱ0AX[œ¨«õÕ¬õ­Õ&¿œœÕYä¨<ôŸLHc+ZÈþ”KÇ#ÈÍ[ÉM ¾ ˽ Àݸex6gÅ N\³ eŠu‡Í¨:(ÄÓEÝ&R]Æ»X¡qÝÙXÖ“Ýtû>iÈ0',à )è =§á-^{:Þ¤K^YÞÞ€]Çx^o{ì™  Ñ jŠàS8j ßÐ †ù­ßû­ˆ°ß@…R À© ‡Èh† )„= S¥PÙî…¤ï=@½Ý¨ñåò•ÌÍÜÊP¥Š°®ˆT¨aÝa‹@˜ -xc1ѳ¬Pî…`i’`­d]èK? 6 ÞàÉpŽBøà®ˆhMá`$Vþa&FâŠÈ©pˆ Uà]© 0Н‰Á¦xà6^¼E^ þ' 6šæe¼óE6Òj¤©ú=ü5 F ;Žâx±‚x°] ÄQOÀa1ޤÎ/3v*ÊÍ% î 6^µ*øe ;Æã'¾c¤ˆãPB  6øº°X†D€¥.k°Aä…‡cåVvåW†eX6ºŠ-ã®4N G®!b³Ø …9bLŽâ£¸ä%ÞŠ!(=8Šf:¡§@€Fæi¦æj¶ækÆælÖæmæænöæoçjޏ¬Ld[ÆeÄÐå½€dPKßW¨ KÎä¤(æb–Š ³þPµ­Šhp†.[†>Ë^F{¤£ðÝ—sv5NºuF´V*‹©ö †÷M7Žƒý¥áЏhûÍhÿ=SèC Q²ªŒwÂ+hræ0Eî+Fæ%…¶-†î3/Î ,h±®pÍ£ &Pb¤øÈdFé”¶Rƒ„Œtö$^ꪨ’õŸ˜…:Y¥X…\jÎ è,"ê^1j‚iÌ’i/cH1\ÿ9TêŠch‡?&`#N ;¤ç«‹¬†¢­æ•®~ž¯Ö«°&24@Zûâó²ŒE$¦h†@ìÄVìÅfìÆvìdžìÈ–ìɦìʶlÆç¡féÍriÒë¥âëþ+X¨ :€ ¥ « G`\¥0ƒvs 4¸[ íÚ¶íÛÆíÜÖíÝæíÞöíßîànÛžåÕ“ÙÆkáølŒ m³Ã a¨‡Pæ *à jà‡¥(†>èÔ6 z2äBä•6çΆªåΧæÎ°¾„ z[ ,ˆ‡vŠ%ØC¦¨Ž™ˆ ï1¦eðÝìí2ï¿BopRïûšC°/~Ð;qŠŸn ðîïo ðýðÎ*pRj¹†ŠÙá\ü‘‡“Î'Xƒ^ Bë¥ð /Ÿ ³ ÷° ç­ ©÷ð¦Xݱn ZI Ī (ì¥`±MŠwþqâq@“q£ñî²q©Âñ_ -€vÈ¡H‡®`ƒ1àŠep ¥Vò%œ&µ'³(ï¯)¬*·ò¤ø¾íµ.@ …}ö°s¥8s4×5664718ÿ,9Ÿó£HÄœh ßT(…=¿4Šfh9Á€)n ,×òýt&"ôp3ôRCt StßbôF·ˆ xФ8‹€ƒ0–b¶`Þ & ¿¦È€WÔq¼sçïQq2ðò޾ÇCj juWT°j¤˜u‹@…Šp‚Xxjj„HWÈd†lH/"mçvôÑ8X þ †Q°_úUð`XèàŠ€ÂåÈoQKàâ5äRŸ¸S¶T/³Uÿ®gwu[°Y¯&°H¨ˆM‹°„)S„ °ˆ Ðu;®ö`ÐxŽŸ²X È%(ݸî >@©hV| ç"bWˆFà/hßAºÀˆDˆø×<»=<„O;…7†'4‡ÿ/ˆoô4ѤÈSX…0©`p9N O¯ˆÄÅä’ïúI{A°Vø„B§bvÕÆ'h„ŠGx„ x…€‡±À›•ú‡ˆ„± cÐDãÆZävúSƒz“ú9_ðŠ=þÆ¥x£E’·ˆÏ_Šað äa®ˆm(Û­À‚¨ +@à¨hbœ? “)Ò—Áw„Gyˆõ G^DÆP‡}ØÒüýwŒÇyòÇô˜L,`œ!þ]ˆo,ó ~ýàÿhGç~o”~ïPÇ\È_v§›|!«üw‚k)K£(ytÈó`ؽGŠEû`ˆIM‚|APŒ-‚Á68Rèp„Â'ªÒæ0˜¨b7rTÈ aÇ"CNŠ2fSœA“v%‹µ0k°Ð¬iÓ€*T@˃@WZÄŠwæMQõ´°/M„µ¸Àœ C‹¥þ9©g <4Ä-¢é+–PÂaQÊÔ)T,_„[V(Då*”¨Q¤rÁŠ%kó0âÄý,:ì@ äÈ’'S®lù2æÌ— ªåù3èТG“.múô髨P³níú50šgÓ®m›²„#wóîíû7ðà‡ƒpŽãh)¸Œ”!Ø ¬Rˆ¢¤Na„V¦Tj¡°Ñ £”ª]:uëcŒØÞ"œÃB®LÊpm¸Ã9ƒ‚kaÜÀU (`‰Õ„Ó€?móÎN*ä'5ñ!Â)²s²MZÕ‚ >!M893ÇagÉPCEHH¡…–À‰6€2þ§HÈ X„¸ÓˆÒˆ¢E*ƘBŽÝ¶$“MŠÁÙkQJ9åhªQy%–£Åæ$—]b–~aŠ9&™eö†S˜éwkr4‡nò¶I›¾Õ@zàAOòÀãn¨CÀFâô‡b±Ï€¸@ÓˆbèS$X1:à£3âØYô„J ‘‰ðéa,ÔsÕ>!,Úh§ª²j$®5-v‘’^úê+”Y ;,hV{,l²ýº,—`Êù,´Ñ®yº<[g´›‚_9WÅ7ÀÅa’Hh„a¨O3þÆÝ$ÖÆúdƒZpAMRÍÁ®»‰)š"Z6Á+/þ½©þ[>–\ƒÏ"Aüan»œ+®»6ö³ß,²Ki¬Ç!k©¬Æ%Ïæ¬´)«¼òH%¹àæ(©XcHʀ胟%Ç„pNôóÏ™k$ ÀàHºÐÂ7%‰ƒ ÂÈ!+䀣Š.¯¶âÀü¡ Ä\õ <õÔ4…Ò“N¤ ASJ»"‚5YµÖ\¯“ n«= ­€#G7NC-5Õ{·ý6ÅEZœ$Æ&KnÇ"[^È—[¾åäã¦Ë¡‹¾r|2:ê™±Np¬ œË´À}BŸ[dW}ဤ{ø“¨4ùÜóE,¬ÒE?ylqÕXtÃþÂýܳ|?¦8üðÅÓŽ€}@Ó¶#FMÇ'¿<Ís ÷¦Ãè«ø’¸I"`8 ðÄʦ®`H¬H&3ã)Ï:›ÀZe5EÍ|žæšöd-Å)PáhE(AQáÀâòåo6ID@›á<3ªÑ\ÕóŸ\Š&??€Õ„TJþô¨mŠÐ•î† èB/qФn Ë .ñ›bxC Á‹0à¹Ñ¡•þ&E)“@ZR×ìs©¢9)ROfQ–R•7ú2‚ǘâ @E˜N1œr„R87 N!|êxÃ!p5„ZÔ¹Îó¨QµRŠš¦êõ3P½ë—¦ZÕÁv@>ŽÄz"„u8‹˜Åp.‚•…“HƒÛ‰Ír¶³žý,hC+ÚÑ’¶´¦=-jSÛÙ@„³…lmòÚWÌt¶¬ù+l+£RÂö,¯Î)¤àIcº¸Î:x`…â)X*RáÅ:Ä XÁ ^`€Ž|ƒÃIÁv 1ü†ܸÈ2‡pÁî}/|ã+ßùÒ·¾ö½/~ó«ßýòW¾þ¼Xn7†OÛ¾†¯³Åm€%³[ÞVÕPpVÐ*ø‡ ) A0A‚PÓÝÈ&À KàCNÿí ÚpŒßCÉVÌàs$‹ ÆŒl ÷Á7ÂiŒPO˜8æˆ'Ì -„B!/sȉƒA]…äèVNņ/âŠKÂ.;+±oœà‚Öcvj2šmüãÊäXÇŸá±^}|ã £Yœ)%p§Ñ‘iLvç-ˆH¦L\ìfy8+pPÐßDYL‘DCÓüÚ5³yÀnÞkm/=2Jk†Î‘Þe+àdg½Æ,tI˜y„· |ø" þI11œP@´7‚`¬oØðä8½þ4oÕÌéÈ´ùÒpvªœìidS’HDpÐЂS¨ UH6²‹Pà§Å$dl‚S@Ãʧ#Ht¦Së8°øÍ+È% Ôf°²—ý$Kkš¶$-8h¢àiÿ›¾ÀÖ´„aGËÒh4oàñçßȸ7O.Gp€4œ°_v³Ýüì¥*<· /¹‘ïš …PÙ,Þ <â7nè8oº!X 0¯êÉ9r¯¼¤-‡í˾C«À¡L1Û ž‘²uà18–±oš^Þhá çH'Бf, ínþ;Üã.÷¹Ó½îv¿;Þó®÷½Ç½ÑI§ôÒ Üô>°Q—ú½ø ž7Å0†Fzã‡Rˆ¤÷Úú«ùÍs¾óžÿu³«8­°Çèx`éBEºò^žv%ýÀŽéƒ ¿ª*ë[?ºy ÅG>” $Ь7KHÆCÂH‹8Áî{/~Sþžô¦Ÿ-êóy|¤&_ù¡ë‚&Îe@ û#¹„Dw#gøæ ç`HLHG`Ôø`•ŸÀ__¥_5­JµŸû©Ì@>L ÝœÇIÀnà „†`) Êþ\ñK¦ z”b`´<ÄBÃ(Ç$ŒÛ³ØßF,ÔŠ ÒSkýÝš1 ^9 4­à?µ  >Ë5Ë6áAäÅûý†5ÛH4‚‹õ†"èÌH €ÄEéQ–¡ ‘ Ò™à P ŸÚ6¡›ˆžp2üÁЂ <@8è GX€^€o !îF!@ü 6"G á號®!¾ÒbSÊ¡™ |7qB)x!tB”A>÷„xY°¢CDAoØK[ :¢-:$e¡SU"+]â3e¢&’É:@p¨AMpA)üþ6ÌMÐ¥]â¥^b"8C´Ã,ÀƒMd@HJÄ@M ¦b2&SÚ„SÞT†”TÖUŽ‘U^¥oØ ”´ÀœÝnDÁ>8oL€,ôF7´ƒyø'Ò,ÌBðB8Ã6œCãÈ@=°A>xBMØ0…9M§qÒˆ_lE`Ð^èE,ðtæÅ^ôEdn£èu£7¶¤ð]¦ e¦m&gòÆ€/”äúF4ø†øo0ýF94Ê€H®˜Aè¥/|M c) §-d hrè8„ÐÄäÈŽô<¨ŽðHvj'€qgéy'Âç‰'þ‘gyŽ(¢@èý†0Þš,5:D2|¼A#(€‚ȃ!J®tÀ€ð॑"ƦH­¸ ¬P 0)ÄÊ…7jheò“‡ˆ¾ˆŽhH$â"ŠÓ ô¤oìÁ"ô†#Aoˆ@ þÆ ”Ž8´%MTƒ7ŒAƒ¼C `^Xbì)bðKb$ÌÂ4ÌÃ` 2ŒÃ0NvNf‚]i>eém©u©—rÄ–8 !üÔƒ8Þ”Coœôy\ãÈ)B^p $|AàËòB*¬‚ԼͬÖê­Ú$àá¤Å¯N¿,j•r§£Vþ¤jޤ.`UêÊ\ê@õ£õõF2èTµÇ0XVœ%®„Oš`2\E¡A+¤Ãä4\M˜+ºª+»ðØûÀüÔ+ÄÏüL)£X²JÓ²^N³z¥B«CH+7 åšÊƒ›C'"`¤e‘ƒªN©Jk7þë+ìæŒ†¬ÁÂn“<¨IPîCíF4\Ao@ÀüF¬ÃGªz«Å:b¿æ–ƲÇŠÌÀvȆ,˜ŠÓ¬¦ox4°âHL‚‡ñ=ÐÃo0AÊvƒÙTìÍö^ÎÂÖÎ"RφÌÏæÐ³†l´¼¬8½hpƒÐɉœ˜Œ‚ƒÕ^-]eþ-`mm!u­Ç|­ä­ÁÛ6qYo¼€Žjò†Ôãn,A‹)„@Ä­ÜÝÞ•Ý‚Þ"Çr'ßB«gŠSÐ^H
`C8ÀÄŒCo”ªp `ƒäâîFé.Rñn ùî±/…­Ø>‹MÒX 4ÀŒƒäܼµ^5‚ÁüŽÄ'´'AåöroFy/J¯ ‰¯ mn7 ¯—B$7EÐ…D°hA:dÙFÀýrÄ P€oŒCþèY~¤ãíúïÅn§†ßVI ùj (:Žä6]Âdí†:|ÁgäB@XGTÃ;nH03$ïH,:„ f©–/17±;qèe¨•rhÁð°¬pÆ´pyº1rÓ&©H C;ÄãèöÆ"ñFÐ˶5´àtÝêtò4ù´“€´C¦î#µ€õŠD`äH\­„=˜þtG¬Cà/È‘U? V[®V!WÛ–W7 X›cîP¯ÔiÝH ÃÈçnˆAÊŠDÑ`ë]_3—à £0ñ©°ëb`£4\ˆ-MC=‡D8\ãHˆfÄ34ãn|*o¬¼G°ßÍ6m×¶mßömc¡ÿLvV¶hre6ðm¶&¦ÑÍÔ"ˆáH@‚j+/X’ œ\o Üæå1vg·vs447ä”° ûö›õõ 7é·”S-%øFLs„\°CðC[ï†!o(ÍQ+„Špï]€wï6x ð7–ü5@sdûÆ,;¸" x°H þÄH_„0€ ô/€+“€×o¤x£àe²y z7á @¬QÒ!H5GàCG†ÄÄ* GôFœBCóF±1l‡ø\øFäõîîu/’w­ø²µ¸ š@¶#¯a„#˜ÀH|C<äG¨Ún0‚3løE 6ˆ9)9 Oñ‰wŠû²“s”c`'@“Q’(÷É8´™Ä4To¼|Û¢y€¸k¸’ƒ#“ÇYœSÚœOàL×ô`-ƒSoD1øÂw"<óHÄ÷3 k:¢Ó•šK1²6zT>:´EúšMºû5ÀB-ÉChs"„éE”‚hÝÔCþ™¸A;”:o4Ü\úF¥úw—°‚_‰‚/‰¬+ßðº#¥Â{ï†ÀöEÄÀÔ-œ€ŒDˆúF(þÕÖì3{F9;C;«[¦«³¬ÿص·>äE-=‚nÿF(`@0€´Á @-GTA;¬­œŒ‹4,»¥AºÈ;bÐû¢Û{›³á›wó¾Ïƒ7¸Zv"a]C®$°Àg,üÁ94p0XwÄ2Ú*„½(ÅÛ„IJRÌ ¼C©ÔD \<ÆÛ„Æ#ù÷Þ;–æ»Ó…¼´<É@;PÒ2ô7GHÂrðh À9ÌÁFPÂ:„ |þ=p$¼´œ"¥R6ÎY¤Šª JÒ×ÄÒ—8Kv|-L{"IýÂQ}Õÿp?ôß7P¤ôH${o„dÁg8€8ÜÞEDC=D²<%p”Ä*ô¼M¼e\Ò„%HÊOðÀU È6H ‚ªð@äðCMæ`&M”zÎÃ>0ÃïXìÞ3ºßþ”Tûmô{ëµC¡?h¾p<xF„šnÄ2´ìÆÀ÷Fßy¼†o§p*êÿ#øZPú»‚ œÂ¨J ø+´Á\CsFW„Ú>Ø‚ œÃØ?@`8`Aƒ&T¸á…Á F Ö%€‹1fÔ¸þ‘cG;T‹dI“'Q¦T¹’eË– r9“fM›À €Ô¹“gOnH:”hQ£G‘&Uº”iS§E»`ó”jU¥lø¥ „µlD—Ã’tQ–°T[(ÃlŠ3gФ]Éb-Ìš…fòÌÂâëË@è ü;G0€$p€8X¶½S19NXþ"8Á0CÏŸA‡.è(EŸ§Q§#ÒfkׯS” ›vm”8UçÖí¨Uß¿¾´ @Ñsà%©G±ùp6–(#Jé©j(Lïß½·YØ|Â1wNX`bôî±ìÀÅúö€Eç׿ þ顦w 0@Öl+Ð@“d;PÁÖpÐÁÜzKN )¤ð©ð·-ÖIj8Ž ¢‰gŒ‚f ƒÑb &¡§yæˆÃ8ÜP‡€1ªÆ›1&Sá ÃC HÔûK‚àþ0¾èÆ ÁîC¿)©<È?¡|PËž\ÐK×üRL•ÜÒL"DQÍ5Ù$ŠÛtÊ’'~sâ:b¤Ð¹¢ªcÜ Æ:, 0"(Á’/ò¸‹¢aþà  UxhÇ…Wh?tÀ,8„‘#,`€|ĘªìÕ×+%ÊòÌa7êrÌcWþ YdË$ÖYŒÒŒSÚi“€P¨.CŽj€—£8ë¨Y&¡j‰YX¦ª1êP…Æ€i ,” G,2H'y² o ÚØg›T܈7PB €{‘&Ÿ{¾ˆEHƒCá£;o|ÍxJ`#öYg]Vd’”ùËf?v6ÚlYn¹)"_p¹(xIŠJŽ"d£ÆÉ㛤ž·©bRpâ˜@úÆ]D5nÚé§õã"S>3d“‘-kQ®úÌ•e[ìˆ àÛ±#ÂÄ”¤àáÆªFèÀ³¨' ¨ ˆÀ £Þ…Úï¿Hê‰*ò𨫷SëÄ ìÚp-ÁF[òlþëÀ™ÉƒÑÇßç¨e@êW¨#q €)øf:ð×aïupªwqÆ\wÚ¯]ÀÈ1~M/HGx¤PÀ¨%ÂǨG@D*Ÿ²gˆ€‡ÖcïÞûüf/Üw-oßÝ@ÝÍw­÷ñuþø÷%dbŸ~œ˜¼…úÒEù¢˜¨À('î ¤£*É"¾apï{ t`Còñ±O@åK_mÐwÁ𬂩qü@(œ4 ’ÓB;’rfZ8ŠbA•Gä@"#€‰ø@>0|´ÝH4˜»˜‘w9ñáï‚B%J¨^øœ"á)œ ‘þ‚D†AÀ£#+NY‚4Ê!‘VÀä9Üá»×Ã#îÆ‚DlMÝÈ®‘'\âB (¡h€Q°=‰¸@‚F”‘-‡0 ÝÒÐÉØ©‘ŽªiciGL¦dŽ•‰ñʤ¤eD›#ð€fðã(_‘È)fAh„uFQÃæœR _¸a(΀ÉÝ )Iaþ’ž<Í%7ù’!&“&4fG@)JiÅ1‘\ €&,R(UPšPDq è£kØÀ4Š‚„ë5¾¨¢P΀@0˜Ã´gÓŠùLž “™*Ñd?IâL}þ$‰Ó4(v€ ÉÀ…F¡^þQ>QŠ¡l%C âÁ‚oJ¤mÊ1†2ŒLµ)hh$PšR•®”¥-uéKaS™Î”¦5µ)JiA,Mp :á'@OòO€ ´§‰æA Z9hÜ0Ê)¢ÇÑR˜Äkð‡P¢àÑ¥ AEÑ‚¼Â[Œ•¬e5ëYÑšVµ®•­muë[áײZ 4<-ªG~ Ô’µŸD½ëQ‘*M,@hCƒ)KL¦8¢$é*¨A¡°A)xJP8Àdõ,Rhw×bQ¯5á+3ýZTÀ~ó@4Ʀ€‚E«QÀ‡¢Ô¢ÀàÁ …ƒs4´)ÄJ§þpÖ.w§¢õ)iK;“Ó&3µ=]-sCH ÃŒ­],ŠÞ9*È:B)€ºÔ6Kà¦R$ñ3£üÀ.vCë\Œäµ´ÓÝduzÝû¾@„ƒp`¢xáEÄæ±¢0ÁƒpJÎáÊ`8!l°BD0“ ˜µùÕ¯Eø«WÿbÀú0‰ƒg Pl®`ŽQ¾P…§ðáÚ!Êö€K¦0BLöPex& 8„=Ä 7KÓÄ'N1PWÇ?óÅS–&°Ô°-¡ÀuÊ8a”jPÁ(ø8DSœ€X‰4f>óY —EYeý^ Yvã–þÙe<‹-0Q°Ë˜°¿¢ð¶D Š¢}å mJ b8+Ü£Z°‚á€M¬àLÞ‡çG=;—Ïýô3íIA§Úe¤À<Ô?gLš(bïP^±‰¢¸apÊ!,=”(Ù°6ZßqÕ¢m53_ÄXWrÖÓÎÖ ê•c—5 ³´-Bx™ÂzÅÒ@7RÜ!å¡PÊ·8É# Üz;„վ뵓™m n›ŽÝæwœ´ˆ;$aEA`o›TQ®§ÀâªTy÷Q®A!eñ²‡I¤d“(ÍXÀÉQžr•¯œå-wùËas™Ïœæ5W¹†;fþ×ïºÑUæl|~‚¯ÑàgÓ ‹ZT¡ A˺s¡8€ DyB<><,ƒ½Åh‚šr û"¥x…Id[¸Ë@pûÛáw¹Ïîu·ûÝñžw½ïïo×Ƀ¥ó£¸çA÷ç2 _’¡±èFW+XDzì#‡FÛÒ`†¢4z(–XEQ8чª/ÅmJÃî1 ’âÖ¥' ´Q ÙÏžöµ·ýíqŸ{Ýïž÷½÷ýï?û>çƒçÀ7)ð .Þ‡w¼†Â€r”$·Îõ´žÑÙ¹­ (`8ŠŽ‰²{¤›B "P "Äk¯}ðáþùÏŸþó¾?ÚÄÿ|ÿŠ7bþ3ÂùžoBÄÚaL@ܤj©)Ô Ø ‹4ÌØŒ)F!Œ–,§lh .N"`¯þLðQ0}ïþš y®ÿ’ñöù:H09cNBîá*$¥(FÀõ$¢D€(Ž‚0H P  èá*.)–á)Ž¡é`þ`JêýTð Á0 ãÏ_cC)Èop8d@SP‚éœnlž€Êô>/"X`ÔÖJ)†á)d¬À²ºP ±±öȰøÌðÐ0 nÿoÝð ƒþc„À $¬ÀFö@ž,OM\׆" (àu”B È ®à‘b|á½”B`â ÌÌ]¼ð‰±O0§Fðù0IùÒ‡ Ùg9Ñ7Êâ.ÀÞà;¡ b CÚx©)f!І¢F,"p!Jb¾`qBò¡¾”¢ññþ‘p&‘+1¨ÔÐð q|¤q«‚3æc :@ÀOZ¦!ÂFO(@  ‡b @(„AJ¢T@ö¤(Æa|)¢þÀü eó±%]ÒööÑߊŠãÈÍg }§ ò)ôè!6&hs´àþ Ò(ÁüœÁ Hb &’(dÀ©‚@¶Š%QÀ^ò+o/&•qçhÒlrwp²vtr'›âäáž S΀e A‡â¦P"\¡¼$bÝ$Qv¡Ò’BÞœ¢1b¦µÒö¸&ŽÀ÷ì`€ö€ +Áò2…ø’±W£ð*ñ,q'-g-Ù²*¶&¢2N2A¢˜BÈáâê`o†¢øà rà¢p±*^üG1y¯ØÁà|ï`2g9½3/S,9³,‰4G4 ‡4Kó)– 2’ZŠ/#b Æ`ß"b i(*à7…"Ú’Âþ Ú@ ~cE6ŽoÓöì 85A9K@,ó`b2Aá;8€*9?`tÀšó@ÁÃ8“¡³¥3ˆ¨3q¬Ók°3;›¢Ðà9ÐÆ ¾`(T‹†B¬p)Øà ŒËâö ,2)ìq÷€À@ ´ì@½òt2K@€Ø¡G€>€fÀ ‘sH¹2G#4 't+Tƒ.tk2´j6”C—b`€![Ú<%"†ÂHg(!F#" ÀAêˆB è n~c³Äá(à6àLàZbáx Œa ºà>iïF >–Ó2T9‘S9e9³Jþ 9e/õ8`Q£T §Ô «ô‚®k²4e¶”K“â$ë¡ýÚD Þ`nˆâZQ(¸¡²N"èᔢ® D@»êìXg 8Á£9™³R55Ri¯Y´AT 4T¥T3ù‘B= OÕdRõcV•U‘"^®oZ‚1"’a s S ¨ò)²Á ’Í7R¡T^ LA@ ,!¡ÀêÀuö´AˆTIAUZ'ÕY)uZµAí`A .[UpT]°TÓç[G&\Ÿe\ÉÕ(ô¨Ü¤åáꀆ¢„•(Z¡E‰¢Úa",¡^vsuÀþó@ÁJ@G‹“<@àRóÓØ!AÙ¡2‹tG Gí€8‡ôG9¶cµU&{ dÍGdE†dUf¶N–e2¸oZRh«—z60 f„¶ŒÂ ä€Ã Úa^4}6÷Ó*Á`âýJ@8ÀJ•T@€+ ”8Þ9Ácb»¶þ<ÅvwÈvYÌ–XL6m‡‚õ˜ZtN…bü„"œA«œà +"œà\ç¦Üó7(æ¶¡)f4t•×þ¾v,­¬[aðt™%ÍpuYW"š!ò¡^Û„¹àf—â×"ÂÇ¢èê7,`í‚þ3dyvyáW÷F7ÿJw¤÷XRwX¬÷z#¢_h·M˜ Dí„‚ @ ¤R3Ì Ðé(  RÔ*Ž ¼/bŒ)’7~9˜÷æ×øê—qîwLò÷kЖ¥eŒÎ·Mâ+•â\vê‚`(ø ƒBêÀ7Š|!bÀy4ø};xˆµy£zûo„Ť„ÍdQ˜Xµ¯M ŠÃó†¢ ¡óæ6)¾¸×)¤@Z@"¦!ò@o“ˆÕ8,˜[ÿ /q ©×˜ÙæRZT2Ž—*’ ¸w d¸–à Œá7–À„Æ †ƒx!™ö>x‘þxÿ”ødæëøz—@H(Nà4ð„ÂæVØ4,Á† ò  ¦‚ lÁ0™bŽp(FáCbƒ#™ˆ'™,+9ñ.ÙK˜xK6ùz}‚—M ˆ‘â ò2ü$…bX"¡¡ LA[›â Ú %¢8d7+{9’ùyßA2èŠrN…UºªMä€L!†‚Ìïz6J,€Ó@и)Ð)•!â ö WF…øœ»6÷,˜ o˜ää˜YÀ\†î,"jK% ¾8„áãja r€X›P•‹Â®ò)xY¢ã—¢YÍ¢þƒ£¹&“ó£Óöò ÚeM¢Á0ã!âÖ „B¢Ž#¤è` J^a œˆ)¤ÒU"È£m‘wŽ ­Õz­Ùº­Ýú­á:®åz®éº®íú®ÕÚÚ˜J}Úç€ú@4ÚAˆ:m‘ÀÀØÄP!)ü‡°· ÈÓÕà JB X N ¦KÎn¢°OQ)¸ ï@;´E{´I»´€ [¯×y¯ÚÙç‰ä¹eÊšM.àV#"ô¹vW±L¹®(a·ÈÚv5)ª` $Î(ŽáE“:¶[l*„ç¯ äµd°O–>še€¦!b©…B ÀhŒ(Rþp.L•ìÂ*©Á¹eºõIº·†ºG¨»É• î "XCôÀüÆáƒáZA(Nà†â #¢Î$€–ì) Áåû¹·¢W›dZ;º¬{7ø›\ƒE¢!«‘â¼ "H ‚`ŽÂ²à(?ç ŠL)Œaä6œÃøÃk¿mcÄÛ'žEª)M5 |@(Ü!œÂ¨8¤r)–ÀûpV¼ú 20ɧ…¾ŸÉ¾±†ÈkÃÈ!ÉÁœBÖAob¶B2@Ã!¢Œë †À£Ð¡‚‡‚ $à)–Á\ )Êæ×<Ì;¼§…ÜÌ‹ˆ3Å ÄYu âþi+DwÌt¡ß „"‚h("¾|(Š¡ þÈ)žpÜMà€ ]ZÄܘÈÜd6Ð\5¢ÅäêÖq=×u}×y=±©ÂJ Ep¡³%¢ 8«â±á(P)¸ž"úèaÕYýЭ­¯£+Ö_cÖ=h¶Àn*ÜÅ}ÜɽÜÉý@š*ÂTCPaw D‹"]_À½ÕÔ/•B ä@ÂvÙK’Ú%¤Õ=éÕGFÛÕG¿/Zî©á3Òý)¢áòÂ)$¤"´€$b ¨a BÒ³‹",4ï)ª‰¬Âäl®å]þåa>æe~ÌOà+‰àEÆàþáwNáÞá~J Þ*zœØ…à 8¤2="Ì ‘ ":Á(¦aÚ™"RÁ*Š@™­ î€×Á>ìÅ~ìá*´Êæéç—Eço‚çOÌçƒ>îõcè«bm ˜B@Z(šA|…"„­ÁY)–@ š ”•‚ òá8§]Gî!ÿ3úáì­ýß°½¿B¼´¸5à>ò=_!èž*|± þÝ*`…ƒ3Þ ’>ÞR*ï^)¦Áxø)<Б©¢o>¿÷bòS›T/_Å2_¯6ÿ4:ß÷• BŸ*¢ï«Õ¤¬"VÁòxnƒ ô¼šSÀâ…bÊÀ¶\þ)jEÎùÑ €¿ ÝøÃÙ~ƒÜ^¿’?ý=¿ùŸ‚”Hï¥Z"´hÚáÆ"X°SNvŠ%0¡Àq kŒM”L+Zèä4;&D‹È‘$Kš<‰2¥Ê•,[º| “d¿‡ »ƒ3§Î<{úü 4èO`‚j=Š4©Ò¥L›:}úTP«Z½Š¡\»zýÊS … pÅ<‹6­ÚµjYóè‘€/pëVŒg%!–b ]D’ "—4l,²¤B½:v;ð¶qEl+[¾Œùå̆6Ázþ Z Q¬¤K›^*•êéÕ¬•j ;6P±dÍf¾;7Zþ·’!2i`]ïºQl)ä”"a…ß¶À•w᢯zˆ>kGixEUBiWHY·øñäKn®yS¶zõ£[»45üù¤_¯¿›v²åû‹|ô‡Tôø—oß ä!ؘ'F;O$”‚(ðHEÉt4Nè´Á‡)ãäÅ @K¤<%†G`‹.žu^BáG#XíчciòåÈ#SöÕ$Wú Äß‹•!ÅyLqE XÌaJ h¤K(ΕÑjXdÏ 1ñL0Kˆ3D øÒ)"Ô‚ohÁ¥@ryÃ%‹UîɧH1 4c‚útc†6µã¡‡þ8hþ£: L‘}ÆI iÄ pºŒäÈ”“ªtåwô€u*¤b¡Á…Eò(äEEИjÑm`aÔ"cÐYg*Œ’gH,u*U±Ìñi²hýL Ž:Z¨¢Ò•è´92úl£JªìJÝÄ£L7"‰ÑÎ,œz:’"ÎôQ.<#! Ì;dqˆHeàË<û0ãH–8 Rͱ…TÄìñN)Õ¬êw zwª@Žà‘Ð äÅQñ7Á€DKÀÕ/Hm L\þ–b°-uJƒ”2H‰l·6³Ä¬³Ù ­µ‡Vëó|Øîä¶¶Ýœ" @’ îœK%rE ±ÄsþÆ7"‰R-XO6X´À>¶¸pÎ×`À2âñèÀ²ÑÑ1øžCd ­­`’+d 'ù bGÆ€mäÀD‰YnS§ž)uJÇz7ä¡¢ß@ÁœðÂX¨Ëî,î"Ý_ÎéÍsQAK ôîî ;FÓ¾9º'q>Ò6ï¨À|p2"œ" q`á9ÓXLp¬HžSé9²ž‡"’.ñ¬’[á|Ó 7Ù\£VTA…Q²î’ŠžÃƒH ¡K`@$¯Øƒºè pˆƒçHGÞÐ9ÐáyØC>þþ0« w,Q9T Z8@ ° ƒ@˜ð>ƒãTH8Øä‘kÄcê¨ã©qXÁ'DA Sœ"«h…+`! ZØBA(0ˆ f8C{,¤EÒ)HÔá-‰ç²ˆ…-º!‰Jdâ)q£IRÞ§“¡t([z•Qª4¦<)(ˆ2Ä Ѐ °pH)§xÄöò C! 9À¡ ]Ô­p,À |ˆaH3„#@FõÜ>h7“¦ooa‚žŒe4ãÑè ñ·„4€NßhÄ‚QŒà mCC‰Ž,¡ ÁðK^"%mþJv²¸ÕK )’j|á °È‡<*LbS–6OJg*–Ât5/]-TdŠZ°ÔÔ¦ˆÆúˆ àP"0*|Üã ±ð% Ñ…~äAu[ >äÞIÒˆydLôœ ÞA‡°²‹§ÊåXêä0@dz0‘Bþ «ŽP¡{l0Ä€~¬Â¤Å'@° XÂЀ  €À|ÐCî(Ä\2ÄÍ ÷’˜­Ü=ª8’ºÔ¦–3§mhTëZM%Ʀ­‹»2Û' ³,iظ°}¨DWh#³„:þ"ÁðC'_ ¨ Éߎ‚gdç%dKчbUw$×8Ç>®Úï†w¼Žîp‹«ãË´øÆž1¯ÒÚ;/ÅÆtJŽã̧Ð ü°[K7p2h* †1 @#!4`À¾@…Ä!ݸH7a_¸Ýø 1Í¡e AIx hñ̹Ï^±³ž¡’ç[#…Ï´öÉŸcm$Ñå÷†ŽØ!´”WFðeŠfÂ1&á8\$ïÀëßšÁ  6Ò8‡•]¦K¨xú° hزþv³n×ë¯ØZ׈š1½_»•x{æ×ì¢Ä2?”(þ¨ˆcQŒ2)¤SlãN5!4Ì" ‰>ñ7UÃĹRiF"ì~»ß¹™µ¾2ï{+%×÷æõÉsÂo’Óîß hP"KœB ÀG0ÖñW6¤#7x€BVq{&d Ÿ ÈßLF'¤{D§SÍA™ÛÔä/ïIÊU{ƒÝGù©£i“4ÿN7±^}GüÈ„#Œ#ÂàŒ<Æ{‰–¡^H 9![ÖE^5¾vâqÝì:ùúØkÁrz»¼ë1¼²Úþ\`§JD0˜@ŒVÄ ƒOÈ1¨ôਮzKˆÇgÝóþ4œ<åqbù±g^×›yçy?)Ðk'KgPýpXÐz„@ˆc0°P†å@$ôÈÀ‹&\#ú9öÜ nä÷ÞÝ:û=O‚öáߺø'?¾ú÷¤üá,¡`ŠøŽä 5ÀK #3 í7uÐVTÐ\R ËÐÎðG! ºwëÇðæ~ï§;—Wò§gô§oö·/’ñEÊðU §'ZÐ`"ü0 Ú÷1AW"ë@ {°ÎgðñÐ y)8)¾÷{ð§r$xg&oÛB¶€…Y¨…[È…]è…_†a(†cH†eh†Xˆ‡V'þQð N Ò*fiÉ0 hPGˆ°è÷!>o^àp !S4¦`_KÈ„|â„”…÷&…4F…½)ݰ—ˆ‰™¨‰›È‰è‰ŸŠ¡(Š£HŠ¥˜‰™öX"¸ ŽàsŽ•–à ÛÐ^Ò§¾ Wçˆp¡dÀ ûÀ’Ñ ûк˜q»·ˆŸÒˆf÷ˆô‰16‰´)¡f׈٘Zpð%½¡ „ uÐ 7P0 R×°uQo0 (” ϰh*°jhÐ Ii‰ © É é ‘ìçþXy!(‚Q!vyÓØgÕ¨!)’#©¾"ÃZðñðÆ`"s‰Õj0 äË@ í0 L0ù` úhXÐÂa_\p†I©”KÉ”Mé”X¨tíg‘À‡‘ÉÑèZIg I’]é•_)bÐ`XÚQ9v¸$ðå–H ÏP–vA-`ªðÀß1 À`é—ù•R9•ϨkX¹ZZyc\ ˜‹É˜u’A­ fÁ€KpAˆpÞ0!±Ðà B`Óð §Ñ0]yÙ˜«Éš\"˜I˜·f˜0…˜.¦˜­‰›¹ ã°þ€Œ»ÈŠÞ°g@'èà!Û@„OP{u¡é0 HN§$A ›Ù©ñš›z6›-U›±u›ÛižŒé Á | Ö . °@. h `zÑ g`F »``°6)Tôpž šÝé~ßygáJã‰Zå© J’dýÀÃñJðæÔX _`‘}MtPùP7UWÚ‘àxJ£ŒÉ OX•V¹ri•:SZ£Aj,LV0Ð P ­i𢀊Á0 bšñ¯B±ÒLðR° Ã!Ðp ¤eê•þ7êˆ9ª£a§kê£*¤f*§\r wµ¨Xt€rp³`&Ó ÏÐO Â@v¡÷À€yuUþ8§ŠhêŒjº¦Ô£ù¦¤§Ê©’ñ   ±ç‰p 4Àð Òà‹ÕðUæU` L0 šWêÐ{—ר À«½ê«¿ ¬Á*¬ÃJ¬Åj¬ÇŠ¬Éª¬¿•9•¢A©• ¡ž”©›)Ùà Ùª­ÛÊ­Ýê­ß ®á*®ãJ®åj®çÊ­¢ú7R°`Ž’! ÛÀ-pAu@@u±*„¡Ö@ !‰wð”K°k°_8‘ø¬ X©Wy©Yþ­?)hŒ`±‹±«±˱ë± ²!+²#K²›°ØØ)oð¥ÁŽ@ ‘ÀÄ¢À ïà.!è÷7 o°¯Ù¨ˆËø"ÍØuJcÓÊC{C«ŒF»'Ìb_Kp¿Ò+° tpj@"åR † ŒuN@"Y´RK Hûrð‡DpB@8cL›CNƒÎŽ¢Îr+l•5KíÖ•Í`j, pFt`l %Â0¬ß¡ñ A½ÅÍÊÜg–—Ä_¤ µ@·ào|I° SMÕUmÕT͵ +ÀÑ¡ÜÀ@Yï`k¼(­LÀ'-µ 3à:,Ý•pFý7UJ­Â K€[ p@w ÅЯÈ@ÄÃP ÇWË T@WÓ€Zp \à`Ð ßf€h l ëàq0uPx Š@D-À +ÇÐz;€OÆ\àTP êð þ£à ¹­Û»ÍÛºm µp \òÇ·‚¤MØÀ \ÉçlÖ ‹ÖR kâ0/0€ ûpÆOšÁfd ÝîÃð?Ó`Ñð TÐ ^š O€?N «¿¬À”ëJtÁ,0ÌÀF± ù`à ݤÍ|ïðÒ4õpÖÔ›Ö«Ã.YýÀĦmFMg_Gô Dj° Ýà( ³°PfÜ]½ÍP± ·`áJä Np ŰÑKá§! ìÍý¬Ïm´ÑžÂÐWkGõ-@n¿¢É€áUž_`Œù@Fy`FtþrðíFkÐ_tŽ U@› Ñ b-`Á0 1X`²0õ@|k8,°.(ý`ƒ³ûœ _` ÁàiÐ[} z:Üû å÷wàåaþmkg àà zô]°Ö@ Ò Î0S  P yÀaFT²àáæQÐ_üuBðW¼âµ ÆÆbXJáâ³ËÎìÍîìTã Ê3þB`’eµPXð KQ8ÐŽ îãNîå.îZÐÀF°gD>•F¾Œ° "q ÂÐ×ðYpLXÀU5Óý aà cPâpÌ´þÎôLíÐït0w á{`McÙ7~á¦Fíð ˆA› ÁÐ –àÁ ‘°Á° PQ Ð[à °Üµ°߀êT~@¦Nà Q ã ^L€²Í0 Ñ@?Ͱ ñ} Å ?Ø·‘À >Å,0Ƴ뼎Ú­L!›¸`Q ìR? äHáâPPåVí2ŽB ’Å;Šp Iq I`Á /øƒOø? m¼ê>ä©†äAáÀà#1 ¥²+0pQ8SȽ1 LP N`ØÉr¥ØU Œ  ®€"þW"ÀÌ@ @Íy@ ¡Sõ¯€ Àžcéð ³ 20 ÷ þ0]_€ÿâ)s,ªÃ: “‚ ~c_· ¸²½µÐh,MÀmÿöq?Ü^­|+ÚT»@· IÑ 8P ÷ÿù¯ÿùo»pXFj $X 1 .dØÐáCˆ%F”p#ØÅ`hÂ`áØÑãG!EŽ$YÒäI‘Ìáè@|Fp¬¦k^¶/Ö¸q¼±%–~Ã0%ZÔèQ¤DÑÔpƒ‰jÒ%¥JT€’3îP©z1\²„v%[¶¨Æ“*…€W –9(|øä¸á^ AþúåÉ€ô°0š;G‚.dêçcÈ‘#%Ú%ÀDÌ™5ofLPAР{Ô2@Â]­lo¬f-*ô@µ °¦]›µ5µN­xÝ{àjT¾}G¥=I‹ºp®ÕyÂ¥à¤0M§^Ý:õk¿`ú gðáÅ'¬8­dôéÕÿ¼0ו AcÉ ˆ*h>a™à +eVc %ÊÌ2,4î–%–@`ˆ“²G—@¦éŠ qæ˜;¤ê¼’TZ žT£ê©gž; èH%Á°0QÆÆ8Ò%žkÖÓqÇ’ ÄȲñ‚"Ï„#H‹ZYmŸEjacÖÚþù$š[^‹m6Û²7Ýx34ྠÚ”¨E n¹b53†y®‡kÄ-í¸{í»!óÔ³<Œ@äñO@Qò&KÁ¸ ¡Œ|¬© # ºØG^è:ÉG+Å{xe K‘ª&ŠªÌ(€,–éôÔ‹üI¥„ñ¢DI9Šaµ<‚‘£U‡# p#P`u¤4 õ4v¼"…«r—Oj³ Aú ‘~ÉÅJÙ´Ì’ËÝä$(Lo¢€µ@Ôø,Ör¨e‡7¯Yg xã•wÞTj¡s»î@ÃóX~9ã3Õ‚x`1 œŸ†E5Â2µa¬…ËBg á0bKUM)Öþchò#¡c<8‚Ä'•0àè•=^%øåI!¾¨Ø~kž(YáìÙ#ËIjyd“ZvîJmmãÖKoÁõVˆ ÀÀjñ¤¶QBƒîyŠ®-{ëÌ· }mû¡3 f´Óö(.`¸C™ÇÆØ, ,â⹓ÂG ñÎ;BAŠ12©¦£KTpïH°h:Ôy€XÌÀ"†hA˜?x„Æ}h˜ËµKÿhXšÇV]!œ_‹ÆŠ}´üuÝ0’h­oË­Ûp•–ó™Ñ–ii àÚv³Î}5®ïµÓ;„V—ž<‹ú<Ût샕 óª|ã ØÃ€Œ'¨b5(àÔ ´CµÍ¨‡ _êpX3 äRèƒÖ¨AnÜ.[ËÛÒî&§ú8x¨`¾ÌjI¥ˆF“<2R®kø²ásX=€MQü¡B_¬†N@_9À€}4À‚"Úðci“ Å–E‚ààdþ¹[E-ªä愽@p¾ôŒZ"´YC7v` ÿD¡=øÕà$ÃÜÑÐó¤Øtx½M&“`…œdQ–°‰Ø}ÁyFb÷x4ó‰ÈÄÞ ÐK(óe,f¿@IYQDe-ŽÑ xÆSžóÌEnR‡\à i­üR6rQÛ¬áI`F„Ö›æQ˜ÏÓ× Ëy¬cŠS¢c¦6‰RŽ!¢ ZXº°Q¸Ï¢e©äDM r>ÔXçìÁÞAFhàà”¯i€>lzSœæô¦±1‚>gú¥4¾†Úr¤`¤„’q¡_#HØTš§ˆžTªë©èH1â„PH+þi¥¸ƒÕˆƒV5KI§zV‘¤ô©C:§ʑǃEÃ7½ k]ízW¼®ëìB#?…s )ìL[²¨E„“Ôî‘¡`sèZ…U´F–@á#+RÔ`Œ%ÁâXÁÂ>„‚‘•E7%{Z¨Õ±ÈúLo&× „PNB źöéJᘠw‘0¥oLÅ2u N]­x ‹Z䞎²¤=JÖ²eP ]Y TÁ”oÖ@ Ì%i ñ]ð†W¼ã%oyÍ{^ô¦W½ëeo{Áˆ*N°¸¬õM àêŒZè34á¨E5ÈÀXÀŽÃ4 là:ì€mX×ê×Þ°+ ¹ëþC8záÛ_*T±½$æ|ƒ¤Ã<øBÄ#&q‰M|b§XÅ+fq‹]üb¾ÜEÐ b·h¬ ÀÇ8²ÑuÀ°vP†HøÆTá‚-œüd(GYÊS¦r•­|e,gYË[ær”›ø#ùz< Ôgàˆg„q—Á0B7vQ G4c x°Fì|ç2@â{Þs–°¢5RP /‘·à°/¯Ñ&DZÒ“¦´@èô…^š±bOÙ–aP‡ZÔ£&u©M}jT§ZÕ«fu«]=ê//™*˰À f¹¼.Ä@²æu¯{mENg”BX á ‚ZB§iÆþ:°†Vè7„…¸¸Œ$°S8†È-GD`¸ w¹Í}îrOc/Ôö¦ƒ ž²ùZÞónæÔ VøÀÊÇŒ‘ƒP"ô&xÁ' ìwK”Í \W“0ãý‚lñ…@ä¡‘‚ â|Cáðƒ<à!ˆq ‚µÂhza…a0­ÐîM,ò ßìb¹àyÏ}þsŸï€]/ìcÂ7oƒ']éÓ °t¨G=b7úCÎ) ‡¯F8¨°‚m?(Ç.ÐA*4ãL`ç.ÄP e` =èÅ-–A„\L4 »Ðµ¼}0Á–-Ëþqð Kô†¸U‡Ò¥þxÈ#E0Fä-ù¤Pñimhš•u0"ì@C/–ñ 0à „èA‚QO)è¡)#N°Kv®#núÅÌq8TÃáˆÐ4AªƒÐã `~󙟈X N¨… x‹ƒv¤±›' 1ÿ}ÈÄù/¯yî'䜺};ž`…ün »`C.Â!…hˆá½ÀÜj€ƒdÈ7Cr°¸°m㻂 ‚Bp8(ˆf.Ø8zˆšZè… f ô@ À#øŒv[¼ô[Ç3?œ7A%hA\:ôK¿s:Ð[þ W`9#èAüA#‚[8ÖÐ"0‚_¶+ˆâ{ n“‡Ë)H˜„*H8à ؇d ˆicà R¨€†JAŠð¾LCYÃ$PC7”·ä¾sR¢=Ø^ø=ÜC¦1‚\¸3 ˜Õà‚$ÐÃh4ÙzÂHq8\¨…F€,e‡~0‚X‚@ƒB ƒB˜{„o(€q {„o`¹ZÈ»ìp04C1XÁ7ŒÅfðY¼EæŠÃÍ;'¨Cÿà 5"48@0¨T˜#º+¼Ð04}ú;¸¢¶UšÐ¨ƒaH8@è…B ýêqˆg‚Sþ\&¨DlE3„E\\Ç¿iÀ `Gxl&]d< Â]ÀðE¸‡V‡‚pJÀ¬6 ‚dC°C@e,C cs¸4H‚nX—c˜'˜#¨ƒb) zXЂiP@p†kˆà X€2tE‡PÇxŒIK1Й¼Iñ™ÇªkÀ¼Ë}\s@Q dhHHª–#º„Ü»ß{Ž]¨CKä bƒ_ð‚hÀB‡h‚Õˆ‡Zø…$ð‚.LłƦÚ>—|E4ÄI¸ì"̸¬ËSÑI£k"XØ%$J­á„ iJ'TÀ#¨Ã~Pþ!‚=|L>š™ZH!²l)ЄԾ¶l˜´KÐ, %yËÐ,MªÀË„Ë" –$ØÁLÚ0x¨n$Ìe4ÌZ ‚bðEgÈxè…Æ N!»$0‚ÀÁÕ …ÊlLÌ4tLÁÏ4ÍÐT˜é¼ÎÓ ³Î´ [P„@è„*Á*` ØÜ†BÀ>¾²M§ì ÄÔG2¬…›»^ÚBØ-8‡Õøu­çL¿èÄθ\€°P­ ílK "‚`Xr``Påùƒ PÚ¸ƒ º&TÏßP@ø}z$_ôJHÏ\ð‡–È…d@»½2@1éOîûÏ•þIF€Ä­QÔ|7P"“( · #HÈ/~À`èe¸±ãPߪÂL$XRàgÔ^à#€Q9‘ÑͣхG•x…0%Ð ¶,ºê¬€»åšF8*Ûªw:&í Âu¸.€Mm¡ƒaLH/e<0-S\t 0TìXÞˆ”.Højä!ˆø!6ÛL£_Ȇ68P%(?€yÈ€ÞAeK—,TEÅG€¸UédT1;'€¢ (ÉÜI!ð‡,¹‡/0†HL8tà ŸjÊ4ªi8tˆ\ðƒLÌ}þ8….´¦Ôª³U^UÃ^Y…s-M_õ0Pº…D°0È…XžÀmÈ#bÈ…ìSFCÃHBøŒ(…K€S[¸$ÚÕ:§PÛ¨#P­ñZ Ã剩ÅÍZ¸Ûš¹ÈkЂÄ† X\ÈþÞê» ,<° 6±E[Ë+[S€Ü›T[Ç:'Ä|MÖxÀTÈ4ØÛ<º¼}J‚ø…k°v ‚†Ë ‚,¡ƒe¥…°Bø— ¡Æå´ÇŠ( ßý]à ^á^y \ Ø0Þ¼Y‚'h^ç}^èÞè]®©;P—4ÚZè‰Úèƒ'@ƒÜé`Ûèü´ _ÝÞЧª¥ Þ ­i!à‡<ê‡CàOZuÅÝÅÁ…Í=+‚몸Ìå3ðÓ xô±Üµ2Ú¶Í’Äs_m†ZÖøƒ‘é#@ƒP¨ d@_߸Û‡hÀÜù¿5!£w «pÉ]!ù†Dèþ—ü½ÁåÇV¸aÎaÞáVÐÞ;ð_«*tb".â!^…°‚ºä™€G ^z;à@Ø*®b+¾b,¦bHåþË5€rP)£Í\Ûð†[ߢ©`iØÙÄE¨ já×ø…ý­ D¸…û)l¸Í#,è=oqሸaHdE^äD?2€(ÒìÁ}ƒl¨dK¾dLÎäJ?:€&«Ó]ž»‰KÐä†HeU^åTd°¨;à2ÐdZ¦åŒ.öbëuW¨_þe`®gKx(ì­ZÈ#ämi€x„*381X99® p°ãÐþÐ'g°,¨…qÉ|X¸2½ó C†»Õš,c™á`˜äZžçK¿/è‰O©Óýoègþç[£5°*uˆ1ƒ6hk ƒ-8h†v±>•u £7€¥“ez¾èì‚v€\ž›yìd rÂÞ@€,™…Z@¢ ‡·s‚H€†.xÊ'4f5Ðæ×aÛP‡bÐ\-™€Z`æå‰ƒsV¼û%Ê Xj¦fêH`;„=‰ä‘狞g{|âf:Ý7`°k±–Ä€<$‹òƒ.`¶nk·~k¸Žk¹žkº®k»¾k¼fë/ÐT‰ètèÀlÁ&Žþ~(æ5‹¾êZn@h€îèêÍŒN¨l˶ì¿€ pOÂ^ÄìVÚØ)mɃ\˜†Yèa„j `$YÖ œ_>ÛpZp…ÜA6l° µ ?`Ê=ê Q"SkäV„n@ƒ!g«VlM¶çlÐjOæjCòjäFn²>Ä€V¸fò¸I.µ™¾†hÿèn±Ža$Ø®‚KlêÎdÆÎÇæè.^˜þ»b‡>^BØÌ/Iç‡0ngå6.jçÇ¢ê™îû®gÿ¨dìÎçIâî'k`ƒØ.ïóFo´Qï¾nïLp„žèú>²"Ço©äý†ì»Üå†èäðf‘…°è‘Æ¡cÞ"´6À\Í’ª9ª^Ø%X 8 º¨1øpÐ([Û€Z m©7€z+Ч`X†ÞÛ‚ÚP„ôn›Áqßq°F„ ‰êr!ò1ÏëFò­îjøê&€'gƒ˜Ÿ³ž$ó¶ò´Áröþ‚g.g~Â>læ²ïVφü6óÇîïNùï6wï7þgw°9Íæìé9æÏÎ’ˆ×,)„ÆÔ/9€Ä­…o£0PôÒÅ‚,É|,šv4wà $pcÐ…iN§GÀ]âQwoRkzH$ç†îðîYovK¿{Ø@hx©>p½ížõawò°–‡ðo'êu_‡`ö-Lk7Pù¦o_cöVo@q¸›¿„PaöJ¡ö¿v°¶(9ðnï<á`ðÚ“¶|X\‚8wbÀ^bZÖøwï¶Z˜‚,‡%02Ûà…nÓƒƒUˆÈ[¸–Þ¦ IøP€ãõåFn'w†7U7 VsñÓ– Xr¯õþ[ë(£‡~‘y‚)yK9ùa/ö°öòY§è˜sˆwö¢‰Tñy7 ±Žó9¯sÕQð¨WÛøš´ [s¸–þ  l¸z‚`ôÚÀÛUÐÁ”€2hèB&˜©¢ Goá‚ïîƒkS÷d©ö—»/‹¼/òp(ê¯~êO§¾ÏxZpŽGî\7k´FŸÃG|QüJaü”_y±>öo2ì^“ù1·‡`þå|­€ÌWs†`óŸç|±ÎöÕØl€#p Á‚&¨Æ YòH€Š“°h1—_ à §ñK­Δ+rÁÉÖ._VDõÒá/,þ-î)Ææ¦ÆK¾<"R‹[‹»ÜŒ0ó%0ŸB-¨ €)6V¯^U Ö«ô|U”&jA 7‚¡M«v-[¶Z¼É&w.ݺvïÒE`CÛ¾~ÿ²½·kWHf#OWÅVÉCìG–Ê–/cάy3çΞ?ƒ]yŠžÈ‘×ø’ø*/˜»QÕ-¦oãök@¼¾×m Bn¿]HžÕl>•ØÒ<Þ†’cO¸p)Cµº‰JWqØ€›ïÔÕÂá0ÒMkTT6©–îöÆ´¯žOjÑÉ<³C-¿°Æ8ôÅMŽÜçPSÙQ(ÆþTU­¦W«‰ÐY’YÅùõV\À¡ˆ—^|‘Ø¢`o8džaˆ­ÖÁP£F‹‘M&š?¤£•¶£Z¨©æ\k¯%æH;p`¤”}íÖ[ŠWÒ%qSsvË5·tÒ%6€5ôB…*a-·•K60ÀVʤÒH}·<$ÊM ŠP nF˜ß}ôGJ-WôGÒ-?Ð'HE÷ô° CÞÜ䡵L¸fr:§aŒˆˆÀ’`7"—Á˜ˆ¥«Ù¬¸ªi/Æ8cŒŒ@ ȺVC¬°>’¶*’1.é?õÂ0½JYå«Xj¹ª—ÉéܘιKEA¸áþ)Ymº Ò/=0” >|2Ä…C=ÔWKÒ¬À…µèÀonº”¡ÜýbE(ÔM£8$„¤ù“^-¥jÔÀ¦R8ßDj†[ÅÈÆWa•ª\¶:mбBû­ÎÙãb=í¯ÃÒ\sÍÅry¬’®ÅÛlµ¥Ü¢´&£X-—×’•­˜ÑuLuâBEî}8ä‚K;œ«Å- <¤Æ›þ¸2ǽµôÂ1‰óM-Õüi¿ý»”zÝtJ-SôWK- @=0tÎM‹¨ç&ÅÙÙ€cPiœ˜¨³Ñá‡!B5ò”%ýÊA·µòj-wl#Ž:ö:³Í§£þ#ÎSêþ¼Z²; %ç¹ ¹oFO‰tTJ'¶mÇf¢©&ÔÚE¨žôÕ’M2·¨gT-¹,QË1Œ‡ü<¤N2³á´ := ëðÛq/%Ä5£ãp:à~þAŒä@ wFÈdS¹`‚P‚·½‰] ñBwd~DOÁ°"†Ò 2xaÍÈ ÆÖ‹’E C’‚| ­€‡@‰•G’4§¢äYpƒ¤/(fLeJS.1b Û¨È;>a…`ð´0$éU@¸þ+Ó´öPË,A“«IcJ]ïen èX H U±bUÈͰ†³[„Eq7¤%¬2%«‘fˆÜVä-˜Ã@Úz•·B.‰ɵ‹´ÃftÉ’P tÀ °€c—òƒ]¤ïž„"‡l¤§Ä›ÒçR`,€ä·@:´ÀY†ìB(QØD na)²Õâ q°H?B°ƒ[¨ÃÅ;˜œ9´A_°4”.<˜E,bÀ Uœ‚#ðÄ0aIDàLöpÈ4`0›;˜B¾ÍÊH¹k•HŠ… )ý‹]eŽY(¨'¨Fs—ùܶ0áQhF¦¡…þl€áf(ÖyàxæyWR¸aƒŸÛ®ŸÃÜ@þ€G8¦aT¶`”O `á´”÷3hЊwl½Êvï_6€UŒ :€Æ"ŠQ_Öð¬ÕÁZТ‹‹P䆲Б€—Ià!p†x0©ÐC ¶ „=˜ÍmŠ‹\ À†P‘t@¢lÙj±Ž¤  ÑÃ*~QpûdC5xCppŒl!ød_RŒ^°d?X¬P G°³è¹…Jñ#ÄÀ® n" E$ÃúÅòXz]Œðh‰Ü\9bÈq}nuä<Ô9þ´£o ÃÖpŽ4¤g8ƒ8ÊPpŒa Þþ ¸0Ä ˆ6Õ 8)Ö¹è¥ _8ÎpŽ6´CóÈC>~tžÄ¢!^¶‡`ÄA1 ¸ÐÒ°(A«@¤ˆÀ‰p×£ÉögBI,\먌"œÑ‡vÌ—É@›†`a !ÆÞQŠjTF !Ç[™2ÀóØ3ü±úÖàõ¤7=êU¯º" C XàÆ8ÜP}À‰hD*àn„Ãy8jž$×e›éX ƒ3¦  (ƒ÷+‚/‚àäà³°A hð WÀÀ ¬‚*¤*¤€)þ”)0†Q$)ÜüÁ+؉•¼ÝX-XÂ%`@l@xÂ'„‚(ŒÂ  @ œÂ °@ ¸@+À@ È ÈÂ,ÌCÞ@C”ÃÚíÁ+TG˜ôÓ$^\4œDüC.äÀ,È Ä@+¸€*¨  |*<@¼UÔB4AE”#„O.EAˆAòÔ‚ AXÁ-¸–K<ÜÆù dm üB}Dà @} CCЀhœÙóà@€ˆ 8Ä-AC3LC6|C98)4D%\À&€@(˜€)¤‚ ¸ ÌBðB,G5Ä-þÝÜÁ$-]«9€lÅßÚµ!"ˆGò¹]æËßýA>äÁ<@]œÃ€Ùm5!3 … ¤‡LjH‚ª¡«µ'< 9(0@ôCDõ‡wH©C' xÞ:Ã;x<@ \A ÄB<œÁ7T†¤@>Ê0`0ÆÈÂ<…Be¸C 0Š`pìƒ-¸À9¬Á5ü#d, ¤=â£>ò£?úÈ6èÝ>ðbEØMº< ´Aj KúµÚÈQJÚ¤F¸@C$C=TDbQàÛ ÇMÞ¤44D7äÚ]Ý‘2:Ä€P¢0„ ÜÈ@UA}ÔAþG- ƒcáÀT2ÐC-`–ŽºÉPA<Õô%,ʹ+ØÀXîHÔ‚ÄKmí=­$wÀVTd -€ìÁ… ¬ÃžYp‘T05AÀÃÌ<`/pA6xp€A7Ä7A8„ƒŒÃ8TÄB.(Àt¥†dÃ0¾^œ˜Á7€A6hÁ4TA3DÁ10Aqœ-èÝ”Cva…Oy< D[47¨>À"PÀS©Ç7¬OÀœ3I(¡Õ"TÆ6¼ƒ ¨g'TÆ)Ã)H@" BeðÑBb.ÄÃ5ÀC ¤Be\ƒ0´Á5þðTÆ€za|Ê'}bzª§ °§{–$“ÝÁÃdÁøÀ,È+ ±­B-p,(HXÀÀäÎ0I«CåA|Zàè?øCÀ€!À! B"(Â"0‚<€#<‚LT€%XÂd-€*$™H[\ØOŠ•pC Xá(ˆB(„tÀd&\‚%XÀ$HB$@8‚4#,€¤'D€œnŽÔ,Ð ¨Ã¼=Sú>T ÄÀ"(4‚#D@$L‚Hé€À'Œ€  € ¤B ˆƒ-˜*@ˆB-ì#8ˆþ8$BÙè0È$RøXÂ5àÃ"Á ðTÆ+ìàŒ@eTƒ.ÌC6 le¨,8/ôJ/õ./°0›_¬TEìÃ*p}µ(ú½hs°Âì $þôWÈC€íPZà–äÎ"‚EäA ¬UƒiíÒ I©Ã  ¤3è7‘KèY4ŸŒBð©²rÇ2ü@,C2쀌åíþ*¡xM\1`Ïó˜‚ÔÂÐ-…Ô"¸‚ Ø8è¥áLkv䑇è‹#`ŒTx«Ò+ä@¦< Ä ùWa¨nZ4Z'Í«‘À;pB3ƾjâuŒs JtÞ‹À6T“×;úHÒ*x‚.(‚Š ¸€¬j,„‚C²@+€ƒ0/í Ìb{*Ì'`,ðïG͈@e²0r"wƒ² ?nÀ®þí‘Ü/ ÉdÇĨ®01{t€UW Ô’ÒðìA+P1[EpN0ä(êV¬‚̹dBEÃ5D@-, ÏÄ5Ü‚)´ƒ„S ßGǽD-A|$€O ‘€€'Ü‚-…À1„< Òš¼d "<Åævnbˆ+ •+‘.,€ ©EóÐïÈ5äkÞª¡±sükÀ‡?!ÜÚQ ¦@<° š`#HC>ÜÃÄh: ä< l¬ ¼´T@äƒ{TF®B(ðA¸yÃJ·ôK›oIŸtJŸòmø1Œ[ø,þmb---ƒÀ:$“.e3%ð@èÁ+ÔBj½%†×‚­ØÎ]m'<„zìÀÞ‡×`‚ €s¡ì­}¨ t@; Ôm5ÄÔ$ØBìå^?Dä>Åä!dÌÛb;Ç纤èVÎ@ BOB§LíZÅívEîî.‰dt[o-•¯²‰Æûö…ÿNU+ûÒ+'†<ìoÿbu0t.sé€uY-ÒîóRs†Xðºep[»5CxØ\×=JÜþ˜c»ð}P”„ðE=nK @-4pÕ`·„1vØÃ§X¶#Ý"lÈ4Á0w¶¬€¶íˆ6´þ¶ŒôkW¨1@gдv EcÀ?ÀvhÈvnDõT_E,çÁ,÷6`8-ñrqèTœ5×F2Â2;w7mÇK Ã4ôíÛ kzÏ„8;L2ŒÀ`CÃ063ºè8øA-4 ‹Cöððs|cÅ?“«¹’…G~gÎ~÷J›6Lt,ç8 qt?\‚ƒFƒãƃã6VTõUW¸…{u—w7‡·5y8V¨uØŽø@8‘C’+AcoJè­²øC¸80A?¼C$€Ÿ¿„¦AàÀñ¤÷CMc6Vhv芈g “ËŠ“ÿ·U 6ïÎN•kù¨·þSI‰—ç/VèvEðö˜“yp›Û™£[šÑš»U›sîrcpœËy‰¿ž§e-ìƒRô¹K¸xÛ˜‚‡íxñì€|Ù¸Y:º¸@zbL1… yn`ºÉhúªpzD+Æs²q¨Ó1©›{gpùm zbH8…»ú«ðÿЗØúƒµ9ˆ‹8¯“x±À°A±·„‹³‹¼ ®:Ã2ÀA£¯·sW{Wy@c»¥·È¶OK·sÉ·wE”O91‰ú¹kyº›ÆºwE˜¯ò»Ã»gxnlx­+%›'7¼9[ëû¾³8g&ÀÃM_·ÄBÔáÛ$Á–¾‘`¼Æ»zÕ3¾R9>`ˆ<ÉO>å‹}¬“=š›ýÖ’Ĩ~A̹è÷¹8ëðŠo ÜÁ$â^·~…T;Ò3à›Fí_Éí/´/çaLýî+~ïŸûïÿªw}«?dT¾í\þmþd>5mþ¡Ê‚Ú3wó„ ªuaB… 6tø"DPE´èJ39&a`H‘#I’TÀ•+WªHU?Mä•´IRÂ`;yöôùó§o²5ziR¥GQØjT©?¯ ey• k&ˆ2lX ~”a1{mZµkÙ¶uûn\¹f§è v€/XYòà€<Œî6,Ö €2K7FÚ @…ÃP»¸’<|U~0¤ÉËUf.—6-²`GÕ«Y3œX±õÅ\¹zĆøñtî'a ðýøDýPÑm3çd¨B‰:v¾´éSå“«Þ‹þu{ömó8˜þ}'Ù¹ãÉ—7ž®]ð;ó~‰ó~ü!¯”[±âçûGÆ_ù´Ìôq‡À A899ŽÁ’R³ Â]£H YíÁÒNŽÃhC‘ qÒ ?æø;1›èð«*]´†'½m¼q¼ºðËËEYIFÆ Jl1÷ƒL²û4-³;tF¥ãA ­líµ+µ¼ ¤)KEœ0ÅSLbâð2¤äJÊÈýT2ª((˜“Î:霠8 óÃtüüÐ@”ÐB =ÑDõõÖscH%TÒwÐÓ`ˆló9$ÿ³Ì´vò•ÔRþI]%43¬rËV%¢ÐÕXÂPÕZETó>¡ä0„×^}ýØ`}Å©LÍÔž7”]–Ùf}Úh¥–Új­e¶Žcµ5vSNóTIPmW7Ve=÷ ,Ñm•VrÝ- ×õ„r’Þz;”nÛ|õÝ—ß~ýÅ4±>¶˜à‚ >á‚Ûñ/Üw¾ÉÜucUWâ+Û}ãâÏ e<þäE™dïþ=å”U^ùØÄì}™Þ$×[2ãš#®xKŠq®ðâšޘ堅šè¢îé8”^šé¦~j,>õÙfƒvžÖ«%ì™jw>ì°Å›ì²£¹ëwoÖºBÙŽëþ´mýÚìºí¾ï¼óE[îq×~B·_-î¾Ñ¤[ïÄ_œñÆwâÛpUÿˬ)'¼ËÈÇEÜñÎ=ÿt”!×|ÊÉ/WMðÓ-*œô 9öØeŸ}ºÑ[_ÕjÕ·ü N”1a”Œ¸“‹0ü¦oö9Ç™ä qF†Ó^J”)NI•fúí¼2„«ÇnúE'ch/[ü‰È7Ÿ_ôÕ/ûí»WÜöÛ\Ûwà…×ý!© ÁA’‘« pu]ZATAä r[Ö1’LÂz$2Ì(vrô‹ƒß‘qˆHx ýòª°>²°„'L!¿VØÂõþ„Ѓø—þ¤ô7€ BDp!€€(@Áb ˜Â6ðhP !¢ŠFD¢™X z˜Â¥€M-DÀ %ž ÁÍ:òщ„€bˆÃ æñ†THïpÆ>Ö äq}FAŽ>|!™#ö1†6¸C aà8b°A ž`a÷¸2ÐB샅 £9ÍjödmøÐ9žŒ.pþè . 3ƒáLhJ“šÖÜ 6µÉMo‚³ â$'>ÏÉ“t®³ïN<¿CJSÞ’—¬Ü 0…IÌ`Èr,@Å&–À“L¬2+V‹lý2˜Ãä *U)ÑÂTyÊcžóÒ=鉄z¹ñ!µ˜Ä%ä‹a„MlÐSœÀ8@H”X„tÀ©(E+ÊT0Š!Gôi2ÄZ ±À0ÂDz8ˆ>„qÖâ­c-ëYkq ¥Ö‚ y+—ÄpÔa$ÊB@Wˆa0Fp1ã$v±5N Öp‚L´  ˆ3ÎÀ J~C!N @Âþƒt@)(8ÁÖ°ˆUì Î&lp'‰Ðg¬°“i˜b'ŽÄNaŒ’”¼õ-pƒÑ‚Ž=!¥rV(, @a† ÈÁ‰˜à“؉1ÊðLÜ…xBXx N°»Þ¯xƒˆ`AØÃ2êûÞâAž`«îu³»Ýî~7¼ã-ïyÓ»Þö¾· ñE0}í‹_ýò7þ=€šÛÝö6¿Ý‰swÝñ€¸Ø‰°˜,¶øF0œÐ‚?×ÄÁPnˆ™{—Ê,°Œ`Ú&˜É\P§¹[Á*V²Ö¬±ëAòzaàc­ˆ8H"üp?hù þ6ˆF-zp )ߵʵ+”éÚUÞ&(B&" ÜÙ5Pj2T„¼ÕÎxÖs-ðá 4 z5HH†$H­8±2Lb˜ 4 €LoZ ñx’ i¨£¤é´‘RdDzÒ•¾´§%@ (³068…<Ácœا EGº‹"××ÁvG‹SD‚ ÒÏ …“†8ãJ¡Kü°J°0̬a¶94C-ÈáSHÁ8xBÏÚ±6¶µ n{Üâf!¹…cnt«›Ý;q÷wtÍëd{ØÁhö³£mli£Ç¥ä ²îlhØ þ÷±ÚøÆ8nÒŽxÔ#ýèÉ‘ R „4$"yF:’’%Å`IL¶œ“"ßã@à8ϹÎxγR }èDdŒp=H›Éøg§ÚЈº ïš! áÁ8È Âg¤»õéµàzC~ᆤy¯j =ú1 ‘ƒˆ%öWß½µ®¦ƒÐ÷¤ÖàI\-’ÂÃ]îb »Ý)Xkp†ƒQ@… e”bãØçIå¡"=Œ ÇÓ]& 1€"ôÁCüÑzdkpÃN‘oÛWaõ®}瀉W€ã Ïø»‰¶ÂÒŸ>õ¹w=ìeOûÛ‡›…ÊoþýI¯Ñûß_àOä'¿ÎÅó qOñbS|'á7ñ÷'Ó…Iü5°ƒ-ìa!ËXÇÊ6²÷§¬e1«Y1pÖ³@K´HË´PKµXËÈ^kþð¯Ò¡v !ë´Nì¢ìÎî T !øŒé¼î­öê«lìèÍ”®–`‚°L!@­jA†à Fà žAb©¢Ú M ZaTA,Áxá¶2AâÄ ¾!@ P ©Ð Åàú,Á¬ Ä ÀÁ2 B(A àβˆáèa"€µ,ÀÈ —° Ÿ0 # œþAðp+¢!v"PÌ'`¸‚`'Ja'ºAxâ"¤vâ z,Àc„¡†ÁîaL¡N¡@| †! ºà*`aZ(ö(A æ€MU1¾  (aj`Ú)ܼËÚøˆ¦?1G±O1W±_1ƒakñsQyÑQ‰Ñ‘Q§#„ѱ'.12q'` ÁdXl'Æ(ŽÝ1*Q9ºÀM$`M d Ó:Ó ÔDCœÔLM PMÕ /$ O )ÍÒ  PPY0!v°zð †àõÌþ¡Ë ÌLÐE’$k!I0ézG8á aŠa0àD!, N@˜ P@|@ ¢'2(Â>xP  RA8A(CÈ º`VÏ2èÁî `@ L.áÒ€-Ýà2T` þà ”À‚`ú¡ dÁÈ\`ò@0àÈCö@´Ì-Õ’-A@ÔÄ¡0²'v‚\ ˜Z@€0v"V. „aR†À v‚3=4w‚L`{RA x¢XB!4 ã &"‚¡”` ŠAÈaÒ!a'¼î¡ |àþñTàöa;`Á8‘S9™3„¡ ú¡¶àz¢è ˆ–qh~‚s8‹ó8“s9›ó9£s:«ó:³S>¹Ó;ÁS<ÉÓ<Ñs:,35ó5?34g³6oó¢0aVÖ1 ”'L` ôa™¡•4lÓ5;A £ ¡íÞ.îæ®îð®‚TT öÎïþN oðFB"[­µÄñP”ñ*(#)P!|'kA'yÒ'²+§²*¯®( JaBœ!>AÜA&¡€‰t¬Ò)‹4*"uZ#íÐ…ux(7®gEDÏn†O=ÛÔ'ØToÔ4e*C‰Ð‘P ™Ð ±þp «ð ûP ¯° ¿0 ǰ Ï0 ×° à ãpëðóPOù0 ±àaKÆt]”54UVÊÔLMMñCNË: ½ÜTU}âTSµqJõd*,Å’,ÅÀ1Ór-ó¨-ß2.yµ.ï2/÷R úò/s0 ó0s1ó,q5.Ñ 2Uk8µ#¬`”¡pTCõ2F<È ¦`òF&¢ˆqUUµ\» ]'{R`ÆX&¸µ4L§5|gÆ g¨5ˆb[éµ$¼5]–` VHæ`mÂ^ûUˆJaâ_V$Ö`+Öb/6,VbGbaLÖc"b7V þ(cOe/VcIv :6d‚_=vdIÖdSÖfoÖMW–e©DÉ^6"böagvckg‹ÖhiGgYÖe}hVh%–hVj§Öq’–d—öe›¶5 båi6jƒÄl€j˶hÇv_¬vc±B¸VVg” jÁwªÁ6<•g2§AS8`¡VlŠAÂ( A{T@fï.`5_Úg"l ?äÇlûž`˜Á¦r•#s÷…pOÁpW,NÔVbí5nç¶nïömKð!o·Foêðì¡Vj4ƒ„$„œ@ /eôUÁàç>à4r3¥á€ú€þ¤ÂxÃ"zew{7qÓv‡vVa{6ÃNLW·&ÁN|µŠ‹¢HÁT@ –ªDaˆ|ŠŒhÀ X`ðÀª„Н¤D"‰äBˆáöá 0AÓþ€‚P`œ*Hæ&‚ær7HBˆ DABSƒ!V „‚@Zé ĶÅÝ~ú€D)òÈæ¡¬Á  ª…j"êxå æx”ÁfxœjžVZø…c8ˆÃiˆÝ©ˆ÷E‚)Ø£@j5˜ƒwƒAX„õDm1òAà27CÈØ4¶u­h‹ä·Î7}×÷ * }ß·§Êw~ëþ÷~ó«^%|k!Îî¬kÕìÉ¢l!Dá õAœl®ÂP`xbÊðjED"ëO²ÄUç&þ`Êa(¨J«‚ð´& ‚eD×TaN*è1^Œö‘†`'²|ÂÍöÅÝ$`bÁ¶‚a„âaàö!¬ Ü Ü2Œ„6,‡¥ xâ¡Øë™!¬¿¦ÀŽ9™—¹™½š[Hšÿ‹_Zù•yB–i9Á–q9tYàz™‹³÷2’¶— !b²!¾V f×´j—OµÓÚA&@ö Ä  : `QõL…šTyÔaÅZLáL¦â‘z"Á>ôxIhxƒáý` !W¨ 0 Fá 1mqvb# ·S* R`faþ€ÉÜÌÍÛa>ÄËÁ\Ìé\˼ñ<Íõ…”ŠüÈëQÉ™ÜÉ¡œ¾ûº$쿸óî§s{‚rz§{Z¸š$Ð8ÃA!8ÜÃA\ÄIÃ&KûcÃWä–n•já)ô ÐH–²ÂŠÒb!¬jýK_ýÎ0!´”K½2v#„ƒzu.;íÚྠ¾A ``þ` À‚0 ‚ÌYláΠk&ÎLºhãʨS«^ͺµe¥c³tº¶Nž¶s×­’ÜÎßÖ…c$ž<;…‹ ÐfœìÓ®1–¾³Š@§z©W ºtÇ¢‹Ÿ;ºõ`صsp^à÷ðã+_–M_äfÝøk}I7ï”`$œ\H™2Ò7 ”r H è°É«øÛyÃ@â¦3ÆÁa†xc9œD`Â“Ä ‡À‚‚1ÁÄ€ ±Ç2ìªènwÊ;#õÞ{H¾ûöûoÀÁ ¼“Á+̰ÃG\‘«%8`&¸`ƒO6þ«+møkƒu`‚ ʘ µ {R„tÐ#Ù aÍÆC3O‡2ÒtìqE+€œÔ¦Êhˆ$ýDA§¡mâŒïPEÚ\BrÜ3E ã€]¡Ød› wž£Ý6poc,÷@tÛ·Þ±L’‘H*Éd­KHåoVb©%—^‚)&™b˜‰¦š'íÚ™Ï@ Mtm<¦shF›%„T¾¬ÓÌJH‡ ô¾€´P>)O¢Ü@8ߨ˸B5½€—ˆ¶Aøc½?uüMÐ5s`ò 8_,±|tÍ?öÅkK?#õ×c¯ý@Ü{¾øã?äxÓÀ›ì“¹Kù¬€þµ¬…-m‰[;ùV¸ÆU®s¥Ë$¦~Zg˜×&v-Pô ’ADÀApÄ € H„!!¬EŒwè¢0°„)¬„„ðCHÀÑŽT€ù(‡òêg qÃÄB #êX"†œ(w _¾h‡,úqŠ€>˜x€pä m Ä"j°‡UQ5FD¢@”ÈD*F±ŽO †±¨E.zŒb$£ƒF5²ÑoTÈýž–´¥áïvP“’Ô€CµàYM$XÓ×f“ŸZX4L&†d”süF"ÕNö CU€•^šG”3¨` xþƒ’4Ç!QF;úÑ/DÀkëJ¤@Îð ¤<;¹‡ÁiŠõ œ rì#A „@ÄœVDm æ LÕ0s'Î4`MjþÆš)6µÉMo‚SœÁ çoÌ tª“íT$lR2»Ú=Òv Éî|÷»§ÙjxÅ;^ò ˆ3ÝŒÒWgé$g0¨£Ì|-¡(M©Jݴȸlƒ4aGXB¢P *d¡ a(CÚ‡:}D!rT¤üR CÒ’.æ¤+ªT§J™–ŠÁ”;AeH\ K®U .%-m‰K]òR ¾ü 0Å Lb““KÝ™þR㘦:Õ/P¥ª^÷Ê׫Xõ®n‰ ]ÊÁ"†H€M^ûÊØÆ:ö"MlWkØ´¶²?±«d½²ØÇzö³ 5Hd7›Êbv,—=-N4KÚ­t6´°m_GÛZ£˜VµAI-nEƒØÚâ5™² ®pg»P߾嶻õ‰n“+Ö×4kÐ…t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞö‚÷Å}®WËÜ›,·¾/q®|SBø÷¿°€LàøÀN°‚Ìà;øÁް„'Lá [øÂΰƒÙ°ßÀv¿a¹o` ‹Îè·Ã(N±ŠþWÌâ»øÅ0> };CbPÎÕ'Œ)^Р|R-'ޱ‡Lä"ùÈH^ñŒk’cì¸Ç@ù±ZD “^õ€>6qo“Ìå.{ùË`³˜K²äšXËQ¶qHÓ\‹(t"&@ *çRˆb½Â… –P‹PLah ò˜MèBúЈ¶í‡ÇÒ+7ÃYÎt†IìŒç—è™Ï~4Z¨üX˜ Ø(Lᇗø/A>^¢]¼d˜x‰<-”-'úָε®wä2ÓÄÓ õKHmjT×BÕ¬vu-`-kZçöÆ>éÕ.ZÀ„— &"x‰'bRô¢ÈEZþÍër›ûÜèN÷dåZL»Úµ¸6L²]‹mäÛß÷”¡“`á#ÖÆ¶¶¹ “q,à”²­ÕÍð†;üá ÷õLü ðx ¼Þ‰ÁN{&“CªK] |z`50b‚‚\Cá¹ÌgNsBK\&Á ùÈ_bòT§¼úX9LZþò}¯ÇA3)&ðèRL"&–(Å ,‹Àd/¨ëÂkÎõ®{ýëÆ½9Lš¬t¦KN‡ºÔ©nõ—`°üÆO¡u°ÛýîxÏ;iÄΙ¹Ãýè¼Ä/ê®÷Âþðˆ' ß#ø¿/µ&p$ŸøÊ[þò3_¼` /þyǃ8'䯼èGOz.k>¹ßmèKÏúÖ»>ŧßmêq»ú×Ûþö¸/iìq;{ÕÖ>÷À¾ðçËîÏÛ7îÆ‡Éï‡Ïüæ;$»WmïO»üç[ÿú·þi§ÙêcÿûàǼö1Ëýʃ§H¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ò7Å—|e|h™0Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒXtøåwƒ:¸ƒ<؃>øƒ@„Bøƒ98„Fx„H˜„J¸„LØ„àäN…R8…TX…Vx…BX„X¸…\Ø…^ø…`h…Z†dX†fx†h˜†Ixj؆nø†p‡rhc8‡vx‡x˜‡zÈ\u¸‡~ø‡€ˆ‚bP8ˆ†xˆˆ˜ˆ‰Ø‡ŠØˆŽøˆ…Œ‰”X‰–x‰ø5‰˜¸‰œØ‰žØ𸉢8ФXŠ„Qˆ¦˜Šª¸Š¬ЬøŠ°‹x芲X‹¶x‹aH‹¸¸‹¼Ø‹LHÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÊ¸ŒÌØŒÎøŒÐÒ8ÔXÖxØ˜Ú¸ÜØÞøàˆ;mod_perl-2.0.9/docs/user/handlers/http_cycle_authz.png0000644€ÿÿÿÿ00010010000021467511727205031023301 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡\ÿ‡_cì¥,¡ˆÙÚw²¤RJE©Ó¢…–S“ê´­Ú×SŽ6BRYŠJ J){"1aÆŒyþ¸¾Í3¿Ù܃2ã|Þ¯çõ¼fîûº®ûÂùþîO×ö‘“SUU0a^ÄNRRÒÙÙ¹? ËöíÛÛQ+..ÎÖÖVØZ'Nœ044äwÿQp$  è rpÎö:!ÖörnjjjVVV&&&×—/_¾|ùrîò»wïæ×‰DZµjU›ý :wî\bbbû6¹dgg÷éÓ‡c¾¾¾4MØZ'Nœ Óéüîâ? +)@ôÁÔ"¿G96Ou–{÷î9::þˆ–ù‰‹‹«¨¨h÷VÞ3gÎÄÇÇ [+//OÀÞ(~JKKeddüæŒè V`D‘óíÛ7ôýÚ‰öìÙC¡Pž>}:~üxkkëö­j‡-[¶888´»º©©éäÉ“…­µiÓ&ooo{{{âUª««Ç—››+ ÐÁ·ðˆ' …'TWAWqvv†£tþ Ð@äà÷h§èìÚµ«s$ÈÐÐPÀª—6­Y³FØ*t:Éd { ò»wïÜÝÝÿÚñ]ÖZonUUUëÖ­ëxb/ð£Ý»woÖ¬Yèü@ €ÈÁNG¶)‰Ž/_¾ØÚÚ^¾|ÙÈȨÕccc ¤§§'T-IIÉèèhaŸ5jÔ¨Q£F .ƒÁktTUUùíN¢ãþýû]Ýð“ÀDÎÑÝ=‚‚‚?¶{t꯿þzÿþ½PU˜Læ¶mÛ„=FùÖ­[………mksD j Ð@äà÷¨œœ\Ww¤=ztàÀí«ncc3qâD¡ª}ÆŽŠÒÒÒððp//¯ 6à’[¶lÁÃHn?~\IIiìØ±!•qãÆÝ»w/44úŒ¨ác MLL¦OŸÞ³gOÜ‚€[tè ZZ[[Ñ÷‘±fkk«¨¨H$‡ààà‘#G*++¯2þ|â…åääp@ ”ææf¼ëJEEeß¾}ÒÒÒRRRÒÒÒ¬RRRUUU¿ÿþ;ÁÚšš"#####ñ•ŒŒ ssówïÞ!„Y%>Œ?¸U\\L§Ó/\¸ÀþÖØŒ……ŲeË‚‚‚ÒÓÓB’’’›6m ¡Ü €@Ñ‚Ç „=(O?~øðáí¨¸aƳgÏOx8vìØ,âĉ–––]»v Û±;wöîÝ!$''çêêʳLaa!Á •Éd0€5IróæMsssUUU„PVVÖ!C8j ¸¥­­-!!ÁóüÃÂÂBÌÌÌâââ’’’ààà#GŽÌ;WYYYÀ-"?"DK·Ñ)**"žZ¥¡¡L&Ϙ1ƒ`y:îëë‹wxtãÆ¨¨(a;F¥Rcbb‚ƒƒ:ÔŽtÜNŸ>]\\liiilllggw÷î]•û÷š.X°ÀÊÊjÇŽ=êß¿?N÷î]NNN||¼¡¡!¿[^^^›6m²··Ÿ0a‚¤¤daaaNNΪU«V¬XzðàÁ‘#Gîß¿¯¯¯O¥Rß¾}«¨¨ˆÏ?p €nÀqëÖ­vlÃîÑ£Gii)ñ-:îíí­««Kü999í0“‘‘ÉÊʪ¬¬D4Þ†§«ÒÒÒètº]@@ÞvéÒ¥ \¼xñÈ‘#qqqñññÒÒÒººº[¶lÁC,ünÍœ9SFFæüùó¡¡¡ššš666¬Dª)))Ïž=STT´°°Ø¼y3ûp €n@çc0d2¹›ä÷ïßïàà@<—§¬¬ìÚµk ¦ÓéÇß²e‹°½ŠŠŠÒÕÕe„GÝ:ˆc3Zpp0ûWEEÅÝ»wïÞ½›»¢€[vvvüv«Íœ9sæÌ™ÂÞ ûáq€ÊÉÉ™hÐ ak}úôÉÀÀÀÖÖ–`ùÐÐP¡vu¶c˜¢¢âáÇñ :ˆt-Ý#Ðqpp°··¶–††Fbb"ñòK—.ê)#FŒ¶KêêêNNNøk·Y*ÀüÏÑÒ=ªªªv {¬[·îÁƒ S(III---‚åg̘Á‘¡ML&séÒ¥¬CnP7:΀ÿt-Ý#ÐqvvÎÍÍm³•JݶmÛÝ»wëëë)Ê7p$AÄþýûOŸ>M°prrruuu¿~ý–ǪªªØ÷ºÃˆb¦®-x´€øû^1™Ì’’"[¾eddâââ^½zµlÙ²êéé}ùò¥²²R]]½Íº·oß¾ÿ>Á.5êÆÂ2©««‡……±_Äü»Ñ‚·d·ãÑA"‘JJJdee‰¶²²rsskll Z¹re\\ÜØ±cÍÍÍ×­['ø———7xð`"(++£ÓéÂ.Ž>pàÀëׯ9.vÜòü§@ €h‘’’Bá4bª®®ŽF£,\@<C|ÐËÇÇçÊ•+ cEEE—/_æXÂü7ˆøw ¢¿ÝÅ:Ð ,++Û¿?‘ÂVVV§Nb}¥ÓésæÌqvv^¶l¿*Ÿ?^½zuNN‘ ç £¬¬ÌÝÝHgX tëÖ-œÙŠ‘ …"TJ Ð%:% è Zp~l±th4Ú°aÃÖÓÓ«­­­ªªRSSCy{{“H¤}ûö ¨RSS³lÙ2"QBˆL&sœAܦÌÌLžé»ñHþñ¤¨¨hmmýðáC¡ž~>GGG8é?D ~‰ŸúA7n$^XBBÂÒÒòùóçÎÎÎ'Ož|úôiLLŒàÕ¾úúú;vì ÒxMMMHHÈš5kˆ÷§¾¾~áÂ…¡¡¡FFFÜwÛ tÔÔÔ®_¿Nüq€ D Έ©´´4KKKâå---edd:+x¨æÍ›7¥¥¥S§N%Òò±cÇ„ýWû—/_<<}J¼ü“'O¸«áéÖ­[•••OCž2eÊÅ‹‰w#,,¬¹¹¹oß¾‚‹át#è rð{TLMMÍ¡C‡/?yòä½{÷,yêÔ) –žžN¡Pˆ¯¤yýúµÏ·oßÚ,‰Ë»ÀÐ… Ð@äà÷(‘÷®:vì˜PY¥äää ˆ””••]°`A›ÅZ[[½¼¼222ˆ÷¡GGUQQi³$:ˆØ^€Èß@§¶¶öË—/:::˯^½:::ºÍ’¾¾¾AAAÜY6¹Q(”#FL˜0`ZZZ´µµÛÜÖŽá?Š€Q% …GðÑ « 4ÈÌ̬«{~t9âè<{ö,44”øÑÀOž™áb•Ÿ>ÞÃÃç­?þøãÊ•+xìäÔ©S)))DR.̘1ã÷ß'òè¼¼¼‘#G¶´´ì*Ë·oßètº‚‚‚”””°u]DžºúòåKWwD8>$XøÛ·oü6–×ÔÔ\»vÍÀÀÀÃã®®níÚµm¶vóæÍêêj‚ÎÏÏÿã?Ú¬àÉDü׈ X£€ÈéÕ«Ã5:&&&FFF ÏŸ?Ÿß-œ-kýúõ¡¡¡×®]ËËË«««›?þˆ#x–ÿúõ«Ï“'O>zÖ¬YKrÀ¡'þ눔qãÆUTTÄÇÇ0 «û€ÈD~•ÖÖÖvuG„³hÑ"‚ÇêúôIÀ$—––ÖÇ•””–/_ž˜˜øòåËþýûÏ›7ÏÀÀ€ç–®ÖÖÖmÛ¶iiiµùÜÆÆÆyóæYÍS':S§NÕýŽxˆ†ÊÎζ°°Àóz,£Gîx—è® Ð@äà“ñÄkꪱ±1&&†`ᨨ¨ãÇÔKÜ IDATó»«©©YRRÂúÚ¯_¿JIIsï¿páBCCòeˈ<×ÏÏOUU•È Ë}Ìq:çÏŸ÷ññ‰ŒŒ>|8Gɺºº?ÿüóÞ½{Ÿ»uëÖ={ö,Ì­¦¦}C;hîܹ3gΤP(666ñññ¬Ñ»}}}]]]¼£ÞÛÛú”––"„ìììV¯^š8q¢®®î!CN:ÅjóÈ‘#£F244\°`A~~>ëzbb¢‹‹‹¥¥åæÍ›ËÊÊðõI“&éêê®\¹ÒÔÔtèСóæÍËËËëø€¨@‘C&“•••[[[ÅhPG^^ÞÕÕ•`á™3g H¼ ©©‰ßë!?????¿»wïêééq—”–––‘‘±²²"òÐÌÌLYYY‚ä†>}ú´»vòòò¾¾¾·o߯-,,ØO‹vvvfϪ±|ùrüuáÂ…žžžžžžì‰NcbbFŒ1þü÷ï߯\¹Gɱ±±Ë–-kiiqwwŸ2eJBBÂÂ… qjR\711qâĉnnnåååË—/£Ø‚`12¢HEE¥¶¶¶¦¦¦³^«?š¾¾¾¾¾>‘’ùùùuuuÖÖÖü àãøêêêüüüÂÃÃïß¿¯®®Î]ŒÉdÊË˧¥¥‰]ÂÂÂŽ=š””Ôîy+„PEEB($$$!!ù]kk+û*•ÚØØØfSõõõwîܱµµíÓ§ÏØ±cCCC—/_ŽÒÑÑ™1cFtt4.6yòdƒ‹¿º¸¸())ÅÆÆ®\¹’{MÒñãǧOŸŽ222úí·ßªªªúõëwüøq%%%œiUEEeܸq÷îÝ ]²dɘ1c._¾}º¾¾ž` 3cÆ "Å1bÄСC333ýüüÌÍÍIßIHH°(--ݼy³à¦˜Lf``à€ìììð•›7o²:¬­aT*•g »­­­-!!AäÐEº%tEªªª¡OŸ>uuGˆòððÐÑÑ!R²Í-B---Û·oÇc üx{{yy¿}ûö—_~yö쑾ñD£ÑÞ¾}kdd„3QŒ3ÆÐÐ_a))©6³Šž>}º¸¸ØÒÒÒØØØÎÎZÝ¿ßÔÔtÁ‚8X}ú´93)è ŠÄ+б´´$¸<ÖÄÄDpÀÀ@cccÁÅœœœ444Úœ)Û·o_MMM»²²2‡èèèÁƒ#„*++B<7ºDüÓQ„_¨øàÑ7räH|‹`7nÜÀ Gøa2™GmmmPæúõë………ãÇoóqƒ :pà@›Åø©¨¨øõ×_q”ƒ¾ÿ- Ð@ì@ €(RUU•””üüù3> EÄýúë¯Dú%¸@kkëªU«LMMùhiiñññIHHhóYt:}éÒ¥v§ ÖÜÜlaaÁZ µ{÷n„PCCCûttEd2¹oß¾­­­¢?{U]])%%ÕfÉ“'O Èü€"“É+W®P€Á`HHH,\¸Pðƒ"""pN¨ö¹~ý:>§˜ååË—8ÝzGŽt tQýúõC•——wuGÚ ))¹cÇ"%UUUq¾nž¾}ûfddÄq2/ÎÊÄ"--]TTÔæÑ×.]âˆTˆc2™/^Äã7,¬p³#K›]D”¦¦&Bˆ•kZdõêÕkéÒ¥mÛ·oßÍ›7ˆŽŽ611!“Éì·oß¾`Á‚§OŸ"„ð*Iɶ·PDDDN1!‰Dzúô©®®.ûEÖF¬4 q"J\ÀÀ@Öqv$$$ÎéâârìØ1Ž‹rrr222«V­š0aÂÆ¯SF$'' †¸Ñéô9sæäååqßbè@ÂKÄ:ˆ(œmQpþHQY]]Ýf±¸¸8+++~w¿~ýÚÚÚʽ§I^^ÞÒÒ²´´ôСC (//?vìXmm-¿v¶lÙ’M¼óìðIÁø$b8Ð!‘H8úˆ8G…JKK»º#mðòò200\¦¾¾^ð¨sçÎ566úúúr\WTTüöí‰DÂÇû¾zõêèÑ£fffsçÎõóóã>»ÏÁÁ¡Ý«sÆŒciiÉ1w†jmmÅ‘\Ÿ>}deeÛl‡B¡àlS@4egg·ö)øc ¢p #ú#:DŽ´Ù¶mÛÈ‘#ÝÝÝù¨¯¯ç¹—JAAý70lØ0ssóû÷ïÏš5‹#Êijj’‘‘¼i‹ŸÂÂÂsçÎ=zTZZšûnMM ^"MdÞJQQÑÚÚúáÇíèøiÆŒÓÕ]?:ˆ(œÈéãÇ]ÝA £££½¼¼ËÉÉÙ¸q£€üNöSPP`m¼jiiñòòzöìYllì€Ø‹åççO›6máÂ…8]ƒ°œ·mÛÆï.k%2‘ÔZjjjׯ_oG?:ˆ(EEů_¿ÖÕÕ)++wuwxËÉÉù÷ßÛ,öèÑ#)¢"""lll¸o)((P(„ÐçÏŸçÌ™£  ˽GýôéÓrrr‚c)âããlY*ЈXŒ €èÂoÖ>tuGø²°°X»v­à2ïß¿ «¡¡aÆ ÍÍÍ<ïÊËË×××çææZYY™››ð<‰çôéÓ999mž¯ÃíŸþùøñ£àЬ-W¶}@—ƒ@х߬¢èhiiµybÍï¿ÿ~ïÞ=~w)Ч§§ŠŠ Ï» YYY£FÚ¾}ûÎ;¹‡… ÆÚµk?~܎奙™™GŽa_—ÓÒÒ’˜˜˜ŸŸÿåËÖEÖˆ:ˆ#˜º@tá7ëû÷ﻺ#|­]»vÇŽÊM˜0ß] ~w%%%¿~ýzçÎKKKžþú믰°0Ëœ011¹uëûžv))©;väää „dddTUUUUUkjjðÝôôô¦¦&555555UUÕ6Ó§DŒè ºð;øöíÛ]ÝÞ˜LfDDD=KOOWRRây«¨¨(00P@]·oßò‹rBVVVÿüó‘ÜéìZZZΜ9C&“‡ ÆqkÑ¢Eø•J-))ÉÈÈ(..ÆW8àîîncccbb¢®®îää$ÔC]Ft]xÃQvvvTT”¾V[[[Ïž=+ }Bèùó熆†üS߸qƒßê„PAAAMMÍÈ‘#ùøøñ£©©)Ï=á‚­_¿ž_ºu—;wÒh´7oÞHJJV²©¨¨¨¬¬ÌÉÉ)..–””Ü·oŸ°Ïü|è ºX«sÖ¬Y3dÈ¡C‡vm8ÉäY³f .³mÛ¶ƒò V<<<¬S>v옞ž¿ºyyy“&MÚ»wo;Nttt´±±áy«W¯^ŽŽŽaaaAAA;wî4hû]ƒ1jÔ¨âââ•+Wš˜˜û\ÀÏSWˆ®¬¬,„¹¹9…BqwwÿúõkW÷èÿ¸yófpp°€­­­½{÷0ñ¤­­-`Ïö”)SV¯^Íïî… † B$Ÿ(»ÜÜ\*•êèè(`Ï^]¾|™;µÖ¹sçÒÒÒ´´´œ»)0¢€ˆª®®ÎÏÏWPPˆŸ4iRffæŠ+‚ƒƒH󓥦¦ d’°ÀÈÓÓsÑ¢EcÇŽåWÀÅÅE@ã'Nœ`0Üøôé“««ë¥K—¯é7n܀Ћ‹¦Nʺ^VV¶cÇ„ŸŸÏSB %..Žx—@W=z4wn5Ð-A €ˆzúô)“É7nœ’’Rxx¸……Ńöïßßµ¢`ãÆ‚7uOš4IMMû•J‰‰9xð ÏŠ555ãÇÏÉÉáÕÑéô3füöÛo'N¶Ï›6mjs岄„„››Ûþýûÿùçö@gݺuõõõÓ§O···çW·ªªjÍzO¡Oô?SQrí…ãWìì캺#àg€@õäÉ„ÐäÉ“B  ™6mÚ±cdž." “ç~b2™þù'¿Svddd^¾|Éo‘rHHˆ­­-¿±«“'O¦§§·™I”Cyyy¿~ý~ùå"….\xèСˆˆˆÚÚÚÞ½{#„¢¢¢nß¾­¨¨xèÐ!Áu{ªÉ¸_4ªoà'ówÏèê.€ŸGTÆÀž>}Šš4iþ:yòd???&“¹fÍš7oÞti×B¨¾¾~É’% Ðh´éÓ§s,æe)++×bÍš5»wïæw×ÞÞþþýû<Šø¹uë–€…Ï455'MšÔÜÜ€úöí›··7BhÇŽýúõ#þ\@—ƒ@QTRRòþýû^½z™™™±.nܸÑÍÍMD&N8*##ãççǯîäÉ“¹—úb ƒuôN|||ee%ëî³gÏ´µµ-,,„êí«W¯"##I$ñ*xI²¿¿?Bh×®]>|033kÇ/@ׂ@Q”˜˜ˆš0aÇbÛ¿ÿþÛÌ̬°°pÅŠü…Ÿcذa§NP`ïÞ½ååå}ú¼|ùòÒ¥K'Ož$“ÉÇjí3@@ €(ÂóVx;99¹ððð>}úà…É]ѵÿ‘••522âw—J¥^¼x‘ßY‚¶¶¶ü¶gWWWÛÚÚ²·\__¿uëVfmm½gÏžiÓ¦ بšµµuéÒ¥!!!˳“––ž7oBÈÓÓ“N§¯\¹røðáíhе Ð@áö@çýû÷ÁÁÁ7n\¸paCCBèØ±cQQQ]Õõkצ¤¤ð»ÛÚÚºoß¾ž={rßÊÎÎ.**âWQSSóøñãìW(Ê!C.^¼+!!ñáüL›ˆââb:>g΂å9àÙ«ÖÖV881»®9ïÞ½«¨¨èÙ³giiixxxjjjrr2+µ$BˆD" 2Ä¢ g¯ÒÓÓ½¼¼øÝ•““c%âpüøññãÇ<˜ûV\\œ¤¤$Ç8VCC˜†þèÑ£ððð_ýuèС¾¾¾<a7xðà°°°¶>†*--M£Ñ¶mÛ&8Ó@dA €ÈÁÃ9õõõç|èë뻸¸XXX˜™™ñK“ùÓDGGó°Á-ZtäÈž£ \]]yÖ:xðàæÍ›9.Ö×׳?húôé±±±ÁÁÁ¯_¿è¹ºº¦¦¦vä|źº:F&“…= : Ð@äà©YYYssó¾}ûþùçŸ!}}}î8 «àÓexª®®~öì™ŠŠ Ï»¿ýö¿ŠžžžÜgñ544°¢º/^,Y²D[[;55Uðör??¿5kÖtðéׯ_#„ „Ú®Õ%öš>ª+kÞúï„>ƒä»º/ˆX£€È™:uê£GJKKccc÷ïß¿fͼÙ'#CTN9‹°fEIIéúõë<M^»v-û»ææfWWWîèÐh´;vØÛÛ{{{¶yˆÎÉ“';> óêÕ+„ûÿNtÐ:qsßhüÿÞÄW¯X’ùu§þæ¯ÿ'ûúq¼ÃJ:ˆœE‹™šš²v2ËÈÈà­ÑeeeUUU]Úµÿyóæ€ÖÒÒÒ<7F½yóæñãÇ<Ï ÌÌÌ1bÏÖ¾~ýúîÝ»#Fdee=}útîܹ‚ûvñâÅ'OžÈÈÈ.FDNNBHÀ沎˜¼nðĵƒd{H"„RJˆWüZÑÜXÛÒTOg¿h`«ÚÉý »€©+Ä€‘‘Q~~>B(##ÃÁÁ¡«»ƒÖ®]ËïÄB&“iff–””Äö²ÿþçÏŸç!¥¥¥mذgƒ eÁ‚~~~‚s|b_¾|9räH|||›%‰ÈÍÍEwJk¬Ü´Ê_5<>ûÞÈAíuì'J MQE!”z½$lË«VÏC]_–ùòN%BhÛ‹‰½µå}Z•OAíñ!D"!›Íº¶¿ ÁmFïÍ/JùÒT×¢=Bi¶ß0 ƒøzvTåµ_2ÙŸ®?©ÏŠ›|³ÊÐÀˆb€uØ]zzz×ö“””ä·çÍ›7’’’ÜQ“É”——7nÏZ+W®äyèpUU•­­mJJ ‘('??_^^>))I[[»ÍÂmb0¯_¿&‘H?îøœ¤>È(çF"‘ÒƒËðÅÖ½ŒÿÿÄœù|ø0a„®î êÛ·oVVÏ[ÍÍÍC† y÷î÷ZàsçÎÑh4î* cÇŽ½zñxÁ1⯿þ"Ò¥ÊÊJoooMMÍNÜŽ3j1ÂÜÜ\FFFZZZVVVFF†õYZZZ† ¾XUUå½mY›3™èùå}É;ý/ŒK (I½^òï¹ÖéTÇB2[‰fbÇŠÿýruifse÷ ¦ŒæÛÇÕ†Ó`ý2øO€@ñ0|øð>dee :´k{ÒÚÚÊï˜à¼¼<î(çÝ»w:::½P\ò⫺¾"Bè}ê\WÛLÉñýª7”g—Š+ó)ó5'¯×y÷´!ôÜÿëèO¯ãªsîV"„2nþosù«|îNòÕ’G§Š^FV „è´.ËÀÏ#:ˆèˆÂbä÷ïßOœ8‘ç­ôôt Ž‹ÍÍÍ$‰ûd–––S§NÅÆÆr·3eÊ”JII î •JíѣǑ#GˆìÉ"‚N§KII=þ¼ªªŠJ¥êêê HsÑ[ÿý?SkïŽä(0fù€1Ëð«>iÝ`ŽÕÄ N^ÿîš8©©æÁ#v£ÓéiiiÒÒÒšššøbZZ‚@€nƵµ5B(55µ ûPQQÁ=Ù„b2™7nÜྮ¡¡Á3·C]]··7÷ukkkžG$³ûøñãøñã‡Þñt›ß¾}›4iRPPûÅÚÚÚÂÂB99¹aÆu°}@—ƒ@±aii‰¾6t[[ÛË—/s_ÏÍÍ=~ü8÷u333ž‡ø­^½šcd¨¹¹ÙÖÖ–{“É\µj…Ba}={¶¼¼¼´´t;6òòònnnGe¿˜––†3vµ¹ ú Ð@lèéé)))••••––vU*++yÊG£Ñ-ZÄq100ç¼ÕÖ­[9.úûûkiiq‡/EEEwîÜ™}ûöíIIIׯ_çyö qT*ÕÅÅÿ2¹áÉA~wâÄɨQ£BÉÉÉ]Õ?2„ã"F»víwá 6Œ3†ã¢žžÞÑ£G9v›_»vD"ñ\ƒœ™™iaa±xñ⇆‡‡‡††¶´´täG¨­­•‘‘yùò%ÏMòT*õÅ‹èÐ=@ €8ÁÎóçÏ»ªÅÅÅÜé<Ÿ>}zóæMŽ‹­­­...³BL&SUU•cuNLLÌÙ³gù…//_¾Ä»Ÿ†þêÕ+*•:kÖ¬ªªªvtžÁ`üþûï›7oFqçÅ^¼xA¥R ÐQ€Ÿ NF@œ˜ššÊÉÉåççþü¹OŸ>?ùéuuurrrÜÓFªªª+V¬`¿B£ÑLLL233åä䨝/_¾|éÒ¥§$÷íÛ÷رc<·¶¶¾|ù’up_¯^½¢¢¢.\8a„k×®YYY ÕÿæææºººS§N (“””„¾”íC¥Ðqª) ²¾V4wuÀÏâDZZÚÊÊêÉ“'ÉÉÉNNN?ùéAAAÅÅŇâ¸nlllllÌ~%##COO#Ê¡P(OŸ>åˆ3Z[[@\XXØ·o_Vnó‚‚‚C‡ÅÅŹ¹¹ À7C7 …’šš:eÊ” ..ùìÙ3„иqãˆ7ÎNQQqðèÞ¹Ñíp?M_ ®îøI Ð@ÌŒ;öÉ“'OŸ>ýùƒÁ022â¸XYY·xñbö‹£FâžÌRTT|ùò%{ôYâê› IDATS\\ìè蘓“à ËÊÊÂaÞ$õèÑ£åË—§§§³B"¾~ýjmm½iÓ¦)S¦.I£ÑRRRH$R»GtÔÔÔù¿n_]Àb6ðLþ£ñ<Ë8!!áñãÇìžáâØWU]]-!!¡¢¢Â~ñÒ¥K+W®äå „233¥¥¥³²²Ö¬YsìØ1îBmRRR:þ<¿D¤ìÒÓÓñŸ?-øA Ð@ÌXXX(((äççúô©ã „’––faaÁ±¾xäÈ‘zzzìWòóóOŸ>Í~ñôéÓ---`¿¸wï^[¨ètzxx¸´´ôÆýýýÛ±¥<***99yÿþýD¢„Pbb"Bˆ_Ž €8‚]Wˆ2™|¸r劄„„’’’°ýlll\°`ÁáÇBÜç2 ðìÙ³––ssó=zûP€È‚@ñc`` ®®^QQñæÍ›ŸöÐ7oÞÔ××s\\¼x±§§'ë+•Jݾ};•Je/sýúuYYYöÇ zzzššš<D§Óœœøè×&2™¬««Ë3›„`ñññ¡I“&µï¹Ñ‹‘»¡ôôô“'Ovu/@úõëÇ} A$iòäÉ7n܈700èÜŽñãëë;þ|Ž=í½{÷fÏÛÐÜܼzõj---ö2nnnìÉâââŽ=ËïA’’’&&&Âö°¼¼<55ÕÙÙyïÞ½ÂÖE%$$ „¦NÚŽº‘N7TZZZZZºdÉ’®îૼ¼üÎ;iaêÔ©7nÜxðàÏ-ß?‚–––¡¡!û•‡>þ|çά+JJJ›6mb/C¡P̺r÷î]~O urrjG”óíÛ·Ñ£G=zTØŠXaaáû÷ï{õêejjÚ¾¢ î©_¿~Ó§Oïê^¾Þ¼yÓÁ@gÒ¤Id29%%…J¥v0•7AÜãO ìë‹«««÷îÝË>šÈd2§M›váÂöcd`xüøñ®]»ÆÏÛ\0&“©  ðèÑ£Aƒ U‘%..!4uêT‡úA¡PpS@ô9;;s,®Ý:ˆ%eeeKKË”””¸¸¸ŸpDò—/_jjjtuuÙ/îÝ»·¡¡õõƯââb999V”SYYyýúõ-[¶ð{Љ‰I@@€šššP};qâDYYÙáÇÛå ïŽ­­m»[ÀªªªÖ­[ }Dß½{÷fÍšÎ:ˆ+;;»”””ØØØŸè$%%ݸqãÆ¬+x$‰}WÔ²eËjkkÙk 4èáǬ¯›7oæ—Öª¥¥åÕ«W¦¦¦ì+~ÚÄd2?þçïïO¼·†††çÏŸ“ÉäNY £ªªÊ½åˆšû÷ïwuÀO»®WÓ¦MCÅÅÅqìÜþdee9Î  ]·në+NWTTìß¿?ëJvvö»wïØ«lÞ¼™½ ;ooïK—. Õ¥ÚÚZ‡âââû÷ï««« U—ãGh4šµµµ²²rGÚˆ tWC‡4hPuuuzzú~ÖÔ©SW­ZÅ~åÅ‹#GŽd}ݲe Ǫ£}ûö%%%áÏ £¬¬ÌÔÔ”çÁ6­­­½{÷jqmmíĉ›ššFŒ!ÄÁǽ{÷Böööo j Ð@ŒÙÙÙ¡ïïéêîÝ»MMMìWŽ;6oÞ<ü¹µµ522ÒÒÒ’½ÀàÁƒ.\È*¼{÷nž-IHHìß¿Ÿç’jžƒUùùùrrrË–-{üø±PGòÔÒÒ‚è@ @·b ï­û ÎÚµk›››Y_kjjèt:+9ƒ„„Ä›7o444Ø«8p€•Ç*))É××—»ÙªªªéÓ§çççó{nttô¹sçØ¯Lž<ùÍ›7ëׯo÷ÃîùóçuuuC‡ÕÑÑé”"ʵµuß¾} _¿~ýãžÒÔÔ4~üø^½z±®\¹r…ýøœÄÄDiiiÖ×?²Ïj!„"""x.£©¨¨X³f¾¾>¿GûûûïÛ·5)V__¿sçÎ;wš™™µûÇဇãè® Ðâêþýûúúúºººººº>|èêît 2™ìàà€¾¿­99¹ëׯ³_¡Ó鬨eeeK—.eOûpþüyGGGüùáÇuYš››MMMxXTT”““óèѣ͛7§¦¦nß¾ýóçÏìI':ˆÉdÞ½{!ôv®º:@Ô%%%-X°`ذaÆÆÆsçÎ9s&^µjbbâééiccÓÕìb³fÍBEDDü¸G¼|ù²  €ýÊï¿ÿŽ‹"„***–.]Ê¾ÂÆ××Ï+1™Ì7òÌiuóæM777ÁϽzõê’%K¬¬¬æÎÒ£Gö¥ŽKNNþôéÓÀÛq3@,À9:@¤Ý¹sgÓ¦Mêêê³gÏniiyòäIuuµ¶¶6BHKKë×_‰‰yðàAWw³+?¾wïÞùùùyyy?(ïUPPЀ† ‚¿***²Žõ³°°°°°`ÎÊÊ255íÙ³'BˆD"ÅÅÅq¬ÝÁΜ9sáÂ¥R©AAAÉÉÉ![[ÛãÇó\åÓAáááè{°øóÅÄÄðÐzüø1G¾0@»Áˆ]MMM»wï677‹‹óõõ=xð`|||ïÞ½ÛÌx˜˜èââb```ii¹yóæ²²2Ö­äää%K–XXXèëë;99¥¤¤àë“&MÒÕÕ]¹r¥©©éСCçÍ›———‡o…„„à92x“ÀÓ.·oßþA066¶²²b}½páBHHþœ›››‘‘ÁºÕÐÐàââR^^Ž*++«©©áŽrðï'11QpXiffÆZ ¼lٲŋ/\¸cóWG0ŒÈÈH„³³sgµÙsçÎźººBJQ::@t½xñ¢¾¾~ýúõrrrøŠ¼¼ü•+W6oÞ, Vllì²eËZZZÜÝݧL™’°páÂo߾ộ™™/^¼>|øâÅ‹™Læš5kZZZB&L@%&&Nœ8ÑÍÍ­¼¼|ùòå !daaÁžÀÙÙŸÔ‡ZµjÞàššêèèhjjÚæ@Å0{öl„Э[·~Pûnnnì'4ˆ5cxáÂ…çÏŸ³n}üøqöìÙýúõCmݺõÊ•+Mµ¶¶.X° ;;»Í‡^¾|yÍš5ìW\]]‹‹‹W¬Xÿ.÷ôéÓêêj]]Ý®·ZµjÕœ9sB«W¯ÆH$ÒÔ©Suuuñ¤!þjddôêÕ+Ááµ€(€ÿ&t€èÂy”ð[“ÅÐÐçTËñãÇ•””ÆŽ+--­¢¢2nܸ²²²ÐÐP|wÍš5·oß¶²²’‘‘144¬¯¯¯®®F3!tùòå'NüñÇ[¶l©ªªª¨¨@éèè̘1ƒÕþäÉ“Y3NNN3gÎDmܸÑÏÏïÒ¥Kvvv/^$ø&...þøñciiiyyyeeå§OŸª««kjj¾|ùòõë׆††oß¾555Q©TÆ`0ø3F]]½¸¸øÅ‹Dž+”¦¦&Žíë«W¯f ÆÌž=ÛÕÕ•ukذa~~~!&“©¬¬Ì}rFFFcc#Gtn¯_¿ÆfÅÅÅþþþ .TWWwrrrttœ3gŽM;‡†8¶èýúõSRRbÏzѯ_?eeeeee¼Z[[ãÿþÇŽ‹=z´–––€ðZp”À¬Ñ¢ §°®¯¯ªVqq1NçV)))Á"##ûí7ö@„ýH:¼ú!„gLj°F8¦M›SSSÞ֛Ÿöí‘&“É$Iâ;¼ééæÍ›rR0»·oßýûï¿+V¬pqqÑ××ÿAù¥£££´´´bccéß1 ÖçÖÖÖv|nlllllì”®]»ÖËËëþýû&&&±±±‹/æÈxÊ^ Žòøo‚@ˆ.%%¥]»vùøøØØØŒ;VVV6###;;Ï••––!„.]º¤¤¤dhhèàààååµiÓ&{{û &HJJæää¬ZµjÅŠ!ii醆†ÐÐÐòòòÄÄD\wäÈ‘ø³¿¿¿›››††ÞɃlÁ“eèß¿ÿÛ·oñæììlÖÖ__ßÜÜÜúúúØØXöÓóÈÌÌlǯG<ÜQ‘­­mAAABBk Q§ÀËAX_ñ(ÎÇN:…¯3™Ìõë×[[[·´´œ?>!!£Ù³g·y–1“ɬ¯¯WUU-(( ø;l·   „PiiéöíÛ;·å¾}ûvJ;Ó¦MÓÑÑ9}ú´¹¹9™LÆÿ³ã¯Gùü7A Dš‹‹‹††ÆÅ‹ïܹC£Ñ´´´<==×®]‹úûï¿?~üˆ‹á—–¥¥¥ƒƒÃÌ™3eddΟ?*!!¡©©iccÃú·ï‰'¶oß~åÊ™þýûçç礥¥áüׯ_WUU:u*N~Š##£]»výõ×_ zzzyyyø°>„““Óƒ ÆÒ¥Kÿý÷ú;!“É<<¹»»ïÚµ+00°sàààqãÆ±ÎÂaå·ÒÒÒºqãžãc2™’’’‹/FIIIåæærwïžàÅU æææÛ·oÿÑQNIIɃ$$$/^,///ù™Lf}–hÇ犊Š-[¶ïÉׯ_ðÁÖ/^400X°`¾E"‘Ö¬Y³iÓ¦ÂÂB777îÉPîðZp”À:@Ô3¯æÀ=fÀbgg‡Wkr1bDttt›ÍÉÉḲhÑ¢E‹ñ+¿~ýúÇ·ÙìåêêêëëýåË—Nd¿[QQQ]]íìì̱÷[¿~}zzzffæöíÛY‹Øììì"""^¿~››{ðàÁþ„‘íwüøñ˜˜„PPPPûÜt.üæ¾zõj'¶¹bÅ Ö‚_~ùeܸq¡‡²™]¼xÑÙÙ™D"yzzry7lذ[·n 8ç·¸¸xܸq ¥ûÌŽB¡=ztÿþý¡'N~øð¡°°P]]}Ê”)?è¡wóæÍÇã‚d2™}ù¹H…׈>˜º ý8þýÝåìììúö훟ŸŸœœ}úèÑ#üÙÏÏïßÿE½~ýšJ¥âÙ¨üüü­[·Òét//¯7n°×ݲeKzz:¿C™LæNžþE"‘DaÞJ€øøxÖ|VZZ+ÊA=|ø_ûö-Ç~7tèV<<~ü¨££Ãž¹нA @w3aÂ}}ý²²²¨¨¨Ž´óåË—[·náQ™åË—§¦¦2™Ì­[·âe7µµµ/^$“ɾ¾¾8+Æd2½½½q6xn ...«W¯îHÇX>þÜØØ8uêÔªªªóçÏ«ªªòCb9þoÞ¼Ÿð? …r÷îÝýÐAüNxÝ:tO}ûöuww¿téÒÑ£Gñ"\ayyyéééQ©Ô7oÞúøø°ÆQ®]»†Â'&3™LOOÏ)S¦à³ Ù}øðJ¥ßËÝØØèááqðàA{{{“_ýUIIÉÜܼ¢¢b÷îݲ²²í›­©©¹zõ*‰DZ¿~};ª EQQÑÚÚZÔŽÌÜ;kßqèÐm­[·îêÕ«·nÝÚ¾}»¶¶¶°ÕYI㋊ŠÈdòÙ³gÌd2}}}?þ¼nÝ:]]]„Piii}}={Îm„P}}ýׯ_‡ ‚ó-´aÃkkkÍš5ËÜÜÜ××÷òåËfffÂvžÝ™3gš››ííí ;Òjjjr‚ ³À®+º-mmíyóæ1 ???aë¾ÿþĉ¡·oßJHH477ëèèH¤»wïÆÅÅ=}úGNL&S[[;""‚}:©°°ÐÂÂ"''G¨'^¼x±  €µSlûöí¡3ft0Ê©««»páBhË–-i ¦ Р;ûõ×_%%%ƒ‚‚JKK…ª˜›››––†ruuÍË˳°°À9%ôõõ>ŒÏ×)))±²²â>–PKKëìٳė––vôèѰ°0VÒ†Áƒ;::v>ž—Ããñ˜Læ¨Q£a¢?Âd2ß½{ËÈÈøúõknnnAAAQQQYYYUUUYYÙ÷ïß á÷PXXˆÅb÷íÛ×±PPPú¨ÐAAéû8;;S(”¨¨(vóGyøð!™L^¿~ýÍ›7a‚œAƒ%%%mܸ±¶¶öðáÃ***°quuµ±±1\j$!!!Hÿ999ÊÊÊp2³fÍ8p`ó68ŽH$R(QQQ/³ ‡ær¹K–,5jTÇz@AAé ËËQPú>rrr[¶lñöövqqyôèÑÓ‡ ræÌ.—k`` //¿zõê‚‚KKË;wî$$$^¾|)++ WTTŒ5jíÚµœFMM···›››ªªjJJ ¿BVw““#¦…oΡÑhÐÓ‡ÒÃ133CSéü  B§RZZºeË–¿= ”?s÷î]¡ÝgaN7oÞÜ»wf7n,kbb „{ŒŒŒ FÿþýwìØáááUNzzº‚‚•JõòòdsçÎ1cNëV•رcdz±±é@¡NRVV¶uëÖ™3g y\”vejjŠ TèôAêëë³²²øéóQz&666‚í>K¡Pöïßogg·{÷î ´íº{÷.“ɤÑh"""zzz***<ïÁƒEEE04çýû÷‹-ºvíšœœ\];vlüøñÖÖÖÉÉÉÍ+auaaa/_¾”‘‘ù[¹säää`"”KttôßžŠ@…Nß„B¡èëëÿíY ´…ð_%W¬XáïïÿáÇcÇŽµ˜üúõëúúúR(”©S§^¸páÞ½{$iõêÕrrrP¬¨««‡‡‡·±Æª¾¾žB¡deeõïßߨØ •Ãf³a‰uWWW´P9 Jׂ HCC…Bét:Çíɶ1Tè  ü+`0˜Ó§OÏ™3çôéÓ+V¬h£ÒçöíÛËËËÙl¶˜˜X^^ÞÁƒÇ/%%5tèPAöîÝ;cÆŒ9sæ´¦rìíí_¼x‘““3wîܹsçvÛ5µ€››[qqñèÑ£---…9. JŸ–ïÍÊÊÊÈȨ¨¨àp8ºººS¦LÁ`0l6@ þö[]u…‚ò1nÜ8¸Ô|ëÖ­mTo4h¦¦¦³³óæÍ›Ÿ={¦££³nݺ·oßÒÓÓß½{§­­Ý≿~ý¢Ñh¢¢¢šššÝu­óõë×óçÏãp¸Ó§O÷äWL”^GCC‰D:xð ®®®‹‹ËæÌ™C¡PæÍ›—˜˜ˆÇã¡Óé{¦MA… Ê¿…««k¢6 IDATÿþýSRRBBBš------”––n~®¿¿ÿ„  Û¶m#‰Ý~1ÿ‚ 7nd³Ùëׯ×ÒÒòè((}.—+**jccãææÖä A¸¸¸yóæihhõÀ Tè  ü[HIIÁERNNN%%%üý‰‰‰œ?þ„ ¾~ýE¥R555ÓÒÒ”••utt 8®q‡Ïž= ÌŸ??//OÂ[ÃÏÏ/==}àÀíJˆ‚‚òG°Xl\\\PPPm²³³mllz`¹Tè  üs˜™™ééé1™ÌƬìììÓ§OçççÓh46›ÝÐÐP[[»mÛ¶êêj<oooß¼‚UNN޽½}¿~ýÊÊÊ 7n‘¢¢¢#GŽÎœ9ï Š‚‚Ò%`0˜×¯_·ÝÀÂÂâõë×¾¾¾üru=„.¸+544ð·¡Ñh=í"QPPšد_¿øøø+W®À=†††MÚ0™L6›]UU•””¤  °råJþ¡„„ƒššuuõôôt!‡7Akkkƒaii9kÖ¬¿;”>I]]]G}||BCCÕÕÕy<¿8Ls8…Ëår¹Ü̼³«®!W¯^-..þõë×ðáÃÇ7vìXð{qi'ûGAAéäääüüü–/_îìì5iÉáp‚ƒƒçÏŸÃᩯ¯KHHؾ};,øÐI+‹Åjã¶( ‡NOOWTTôôôìdW(((-҆Б––vppˆ ÷÷÷o± ‡ÃÁãñß¿ùòe{‡&‰K–,épØ_§„‚ ™™™úúú•••÷KJJ®]»vûöí …Á`„&N}”¿Î¼yóÌÍÍoݺµråÊÄÄD"‘hjjÚbŽã„„„   ñãǯ\¹rûöí666Ÿ‹ÅºråÊåË—“““;ÓÏóçÏ}}}q8\PPš8¥›h#ʸÿþ€„„%%¥œœuuõ& ŠŠŠ$%%ÒÒÒí5c±X)))"‘øåË—6’b´ÕCΰÙì¯_¿Îš5«‰ÊÔÔÔøúúª¨¨,Y²$-- U9(=–Ù³gûͤI“zàÂÈnåøñã***ÙÙÙ{÷îµØL\\ÜÜÜ\BB"00ÐÆÆ¦óãr¹ÜÐÐЉ'feeu¦«_¿~YYY!²sçÎI“&u~n(((-2hРÖ‰‹‹äååwíÚõõë׿á+ \.·¶¶–ÇãaÚ‰ˆˆ™L>vìXÇfÞq‹@X¿~}EEEk ¸\î½{÷ÒÒÒäåå;\‚¥ûX³fÍóçÏãããÍÍÍ©T*‰DúÛ3*bbbW¯^5kÖÅ‹§L™bff&**Ú8êïÔÔÔÔÔÔ:9"‚ ‘‘‘GŽ‘——¿~ýº––Ö½{÷:܇ÃYµjUmmíĉÿØž÷Aül²‡¿Áï¤yþ¡?~0™Ì_ J„Ëå*((4Ù©¤¤ôèÑ£ÊÊJEEEÀÔ©S³²²¸\n‹ÎèóçÏWUUu`hqqq—W¯^uà\H…¬Ñ“žžÞFUUU'''+++‰ï((= KKK99¹øøøM›6Áßjcx<ÞÅ‹¯_¿^RR¢ªªjooo``EFFž;w.//OVVVYY9%%EQQñÉ“'íAoß¾Á·,˃i¼ híÿ# ÅaÔ¨Q^^^Û·o·µµUSS£P(Í…Ž¼¼|‹‰sÚKbbâáÇ1Ì©S§ ùšÅbÁ„ª-ÂãñX,‡k-Ýêþýû_¾|I¡P>þL¥R›«–&j¦ó— ]µúlåÊ•ÉÉÉ_¿~í’ÞPP: ƒÁh^ˆ÷îÝ»C‡e³Ù4ÍÎÎÎÏÏ`bbK7AIII·‘椦¦và¬ÆtPè°Ùl<O£ÑZk ¬¬œ””$##SYYYXXØš_-))iêÔ©›€N§c0˜í-Eh¸ººÞ¸qcêÔ©sæÌyýúõæÍ›=ºtéÒððpGGG*•jmmýáÇ””ÀK‚7‡Íf7®&ÀÿË£&4WKD"‘Éd.Z´¨E-‡;yò¤˜˜ØæÍ›kjjN:%..îààP]]ííí-!!±{÷*www WW×ÊÊÊ}ûöIIIyxxTTT899a0˜oß¾}úôéÊ•+‹/æë0Àf³wîÜ2zôèÇÛÚÚÞ¹sgÔ¨QÏž=[·n]xx¸ººzrrrii©¡¡aÿþýcccKJJfÍšE  ‚žžž€±¿i|íðcã6ñ;iÞ€ˆÉd~ùòEùÌ™3çÛ·oÍ÷'$$À‡Ê´iÓ  HW((Ý ‹2e ‰Db0p©©é„ ÜÝÝ8и¥»»{uuµ””T‹ý˜ššfff >îÓ§O;:\.—Éd¶ñ†dccÓ¿}}ý   ¶Øæû÷ïS¦L lã•®5 L&“ëêêP¡ƒÒ…††®_¿~÷îÝ.—»nÝ:ŸE‹ùùù1âÞ½{ÐBëèènjjÚQ`õ¨Æ“&Û€Ö56T´ØI»fB¥Rsss[<ÔÐÐÀårùæ%qqqxÃãñƒ†k¯DDDF ·I$Ò´iÓ`\°¨¨¨‘‘™L†¡{GŽÁãñÆÆÆP`0·uëÖéÓ§ËË˼¼¼V­Zû tvv†K-deeïܹ·åää¼¼¼Ö¬Y000`±XeJc5Óxþ@ 77wéÒ¥‚´´··}ô葹¹9üïÊÏÏOHHà7ذaCwÍ¥=ÀÜT¡¡¡éééoß¾EäêÕ«%%%MÖ%`0UUÕ6´Aqqq‹â¾58N‡ç̧ã1:x|[çÊÊÊr¹ÜüüügÏžM™2EUUµñQWWWׯ_¿ššXÖ¸]ˆˆˆHKK×××WUUµ= ”ö’™™¹fÍš'Ož|þüAE‹Áý8ÎØØ8))©¢¢¢  `Íš5|?´¾¾~xxxÆIKK벩ÿ?M$QsyÔä#ƒÁ˜:ujuuµªªª¶¶v||üÏŸ?ù½ñ³B[ÜÛ´iܦP(PyDEE—/_·Éd²™™Ü^ºtitt´»»ûÞ½{÷ìÙcaaÇã ‚œœÿ> ))©«« · ˆ#à6WQQÛ_¾|±µµår¹[·nåÿz#ÆÆÆd2ùÑ£Gfff[·n}üøqvvvBB‘HŒŽŽvpp€YCž}útäÈ‘Ÿ>}j¼^ƒÁp8œ3gÎÈÊÊv`tssóAƒÕ××wlò((|BCCáo500®ÌËË B¥R }||Þ¾}«¢¢’ššúþý{ggg°eËGGG##£©S§fgg¿yóæ/_FA¥RŸ={¦§§±y󿀀“¨¨¨ààà®hÆŒ3fÌxóæOCCƒàBçû÷ïFFFåååS§N…"©k'ö·à?00ÌäÉ“ŠŠŠ?Ž‹‹kÜrÕªUêêê6l°²²Âb±d2ùÂ… &LP©TccchÅèëës¹\xº‘‘‰DŠupp°µµØÙÙnذMÿÒ60{͵k×`nô3gά[·.**jöìÙüP]iié 6lÚ´‰Çãõ´f§ü>ÊÊÊÙÙÙüÓ¦Msrrúòå‹„„DHHȱcÇ>|øHKKk­ زeK—–€äççwtÊ((ÿÇÅ‹á×éÆÍúøø¨ªªÞ½{799YEEÅËËkñâÅ,{îܹ7n 0ÀÀÀàÑ£GBžy7A¥RÃÃÃ.\xûömx .\¸pawŒ¥­­Z^^.`iªoß¾™˜˜üøñcĈ·nÝê|>åžÃÅ‹/]º³®ýXHÕÚÚªáW+›;wnlllEE…œœ\&Œò/%Ë!CvíÚåíí wr8œõë×ÿúõk÷îÝ7nÜ055åñx0ÃFëkBgæÌ™üÅ ÆÇLJF£Mž<¹¼¼œßÆÐÐpìØ±­Õ§HNNn—‹ÝÈȨíê©((í¢m¯ß²eË–-[š222â§×»~ýú£GúLÁ“ñãÇß¼yÓÂÂâæÍ›L&óÂ… ÝzÛЬûùógccã²²²‰'FDDô%• R©ü¢cäìÙ³¡¡¡ššš‚\»vMVV¶ÉW” Ú|¸¥¥%?:øæÍ›………ÐÜ(!!¡®®¾páBWW×qqñóçÏc0˜Ù³gûúúº¸¸HHHÀ%®GURRúüù3L|™™ÉevwwÏÊʪ­­‹‹[µjUŸùŸDéròóó™?~këžöìÙ3räH{{{.—ûòåËžé¸Ð)//8p ]qq1\FÿèÑ#¾u‹ÏÌ™3a)¯NM¥‡‘žžÀårÉd²žžž««ëßžQ3uêÔ¨¨¨Å‹ÿ÷ßÐvÛÆâƒnåÎ;vvv,kîܹ!!!}éfrâĉïß¿®_¿.--mjjÊ! ‚‡Ào¿êرc.\“R2Œ’’˜…aee¥¡¡¡¡¡qðàAÿÄÄD …¢ªªúñãÇ·oß.X°veddôøñc.—»fÍš]»v ýŠQz ÊÊÊ7nlcu7—Ë577OOOWPPèÉ*tXè°X,‰´{÷n‰tàÀæáááééÙ|õ¼ŽŽ“ÉìK÷&ðÿ®«¾Š¦¦fBB¢E‹²³³ÕÔÔnܸ¡¯¯/Ì 0™L—K—.¶lÙâîîÞÇ–C7N™#à¡&Ù·adc¬­­á"¬Ù¶m[‡ ¡ü;dffÊÈÈüqB}}½©©éëׯ³³³á ÍžI»]ï0ñFUU•¶¶ö‰'<<<ÆWQQáîînaaÁo†Çãíììž={&''‡ZGQPz)JJJÿý÷Ÿ¾¾>“É\¼xñÎ;;Þ³c|ýúuâĉ—.]ÂãñçÏŸ‡µ#„3tß#** ¦z ‚ uPPÚ`ôèÑwïÞäÇžmgg7räÈž\è©}†–‚‚%%¥ëׯoÞ¼¹¶¶îÌÎÎÖÑщ¿víZ]]]dd$•J}þüùÀÙl6‹ÅêéƒPPPD\\üîÝ»'Ožôðð¸xñâÿýwåÊ î‘Çãy{{ûøøp8™°°0MMÍîî_À×׆û„††Ž1¢óÅYQú6 æ¿ÿþ°qppðªU«tttY>Ù¼¶y 0þb0kkk‡ƒÃáÚûÎÓ¡“““3lذ… FEE59TVV6{öìׯ_‡„„èëëGFFÊÈÈ€®Ë3†‚‚òÁ`0FFFæææyyyÓ§Oß²e‹‹‹‹€ËÂÛEzzº ¬µcÇŽ={ö ŽïÎÓ3sZ¢ôLØl6‹mW‘©­[·fdd´½°¼¶¶666¶½“ÉÊʪ®®ž0a‚———˜˜ƒáñxÝ(tÔÕÕ·mÛÖ\å@ÊÊÊLLL’’’>|ØZq+”Þ˰aÃRRR¼½½Oœ8qöìÙ«W¯º¹¹YZZv•)..öðð¸~ý:@QQñÂ… :::]Ò3 Šàäçç×ÔÔ´kóû÷ïß¾}+++«¬¬ÜZ˜o°c0 qqqXq¯BZ­!hŒÎçÏŸ‹ŠŠÚNþîÝ»•+W*((t¬î J‡@ ìÝ»7%%EGG§¶¶vûöí´±±)((èpŸ</>>~Û¶mׯ_';wîLKKCU Ê_aøðá‚û­ø<|ø° • uކ††;vt,§— ¯bªªªÛ·oož5¨ aaa¾¾¾=07" J—0|øðØØØgÏžy{{¿xñâöíÛ·oß?~¼………©©©€ INN »yófCC‹Å.Z´èèÑ£&îÉÐh´ÈÈÈ¿= ”¶è€aàßáÕ«Wí=%""ÂÍÍ AýJïÞ½ÓÒÒúúõk}}}QQ¿pDs¨  ÐxÏ÷ïß§OŸžŸŸzêÔ)›ÍnW`Œ@B‡Ëåâp¸Û·o Òx×®]3gÎTWW'‘H‚ϣàKºZ¤´´tãÆ{(mÑÛï³Ó§OŸ>}znnî©S§BCCß¾}ûöí['''MMMÁƒËËË+++ËÊÊŠŠŠr8œÚÚÚâââòòòÒÒÒ·oß&&&B}|¸¶¶ö²eËf̘ÑÍÓ*òòò×®]ûÛ³@Aét:Édv  $‚ ÷îÝ{õꕱ±ñÔ©Süøc7nÜ8gΜ͛7ÃÆ³fÍúøñ£€=Cãh||<,5¨ªªºxñâ‡r8QQQAzHèhjj8'@ZZÚõë×ÛHZyòäINNŽàÝòÑÐÐ “É$‰N§w ‡¾¨¨è¼yóþö,Pþ!DEEmmmmmmùôéÓË—/ß½{WVVVSSóãÇ?~ˆˆˆ >\\\\FFfĈÚÚÚzzzÂ1ú¢  NeeåçÏŸ;foöññ±´´œ5k–OAAÁ¯_¿Ž=úñãÇŸ?Þ»wÏ××—ïÚ.**JKK“’’B¤¶¶VII)//OYY¹¤¤„L&c±Øšš…¬¬,‹µ~ýzCCC.—K †  ·±§…‹mohÒ… Ú: ‹Å®]»¶]}6>@¡PêëëûL%E”>ƒQWWWWWçïIMM5003fLŸ)ðŽ‚Ò‡QTT¼uëVÇÎe±X¶¶¶Ïž=;wîÜÑ£Gy<ž²²rDDÿ¨ˆˆ‹ÅBäýû÷šššòòòD"±_¿~ FJJJAAL&C/‹ÅúôéÓèÑ£7nÜèìì e³Ù CDD„H$‰D:.ˆÐùs¼0,<Þ$ïøINN®¨¨hÍK =PøŽÂb±°XlAAÁéÓ§Û5+!o ­•õEAAéiüüù³Ãç&%%]¸pÁÌÌìõë׃¦P(wïÞ}ûö-ƒÁ(///((øòåKRR’¼¼|DDÄØ±ckkkÅÅÅ ðñãGƒñâÅ‹7oÞDDD4yòäeË–±Ùl:N H$RJJÊÆai)½ÿ¶è¤¤¤ÈËË·+’Àáp¢££ÍÍÍ[< ×d!òðáCqqñÒÒÒÖR%b0˜iÓ¦5ÞSQQ¡¬¬L&“áTA Fwä.CAAé$Pè k0QPz \^Ý6»ví266nhh:t(@PUU•‘‘ùðáÃèÑ£ÓÓÓÇŽ?>''gÊ”),+**ÊÔÔžîïï?~üø²²2YYY]]ÝU«V½}ûvĈТC &OžÌ_Ò(`¯?7ÒÒÒŠŽŽîÀÕFDD4ö^ýøñ£_¿~………222²²²‰‰‰«W¯0 WW×G!Mê–••¥¥¥ÙØØ˜˜˜XXXÔÕÕ=yòÄÈȈN§£Z¥§+à ”ÞB'…NUUÕŽ;®_¿ÞÐÐÀår‡ `2™#GޤÓéT*¶”‘‘A6W›+++744P(ƒ1dÈ.—;räHøpo9‹‹ 2¥?  …Ò•f€ÈÈÈ¢¢"çíí=pà@h}*//ÏÏÏõê•»»{aa!lI"‘6nÜèéé)H·ƒ†§OŸ611ôèÑÇ¡¥G…jÑAAé-´«U‹Ü¸qcõêÕúúúl6›Ãá49ŠÅbq8“ÉÅb±ŽŽŽü£C‡…­Àï(~N“õä]¼¼¼cB‡N§oܸ1**JMMÍÖÖ655õöíÛEEEÞÞÞeee<ÏÝÝÝÏÏ6–––~øð¡‚‚B^^žªªêçÏŸåääØlv]]•J…e¶¾}û&))™‘‘1gÎMMÍ„„˜ŸÃÃ㤤„F£‰D´º JÑAAé]tIÚ‹M›6½ÿžL&C3 ¿Ï·oߎ?WhŽ5*  ¬¬ €ÇãmmmUTT¸\n×.ÉüƒÐ¹ƒÒÓÓ;Ö{ttô;w6lØ’’¢¤¤X¶lÙ²eË·ùï¿ÿÆŒÃb±x<ÞàÁƒKKKÕÔÔ”••q8‡Ã‘””Ä`0ššš°^|}}ýµk×6oÞœ™™ c0›L P•ƒ‚ÒÓ@… J¯AŸ­$77·_¿~K–,qpp7n¿’’’——׃RRRdeeÓÒÒΟ?o`` ¬¬¬¢¢"--Í`0º<ñÄ„‡Ã!íDn̶mÛ 544¸\nEEEHHˆµµu]]¬¬ìÛ·oG™™9|øð¡C‡fee;–H$âp¸Ÿ?æääXYYáñx0vìØqãÆÝ¾}›Ãá@éÃf³EEE;¦ªªÚáÅê(((Ý*tPPz>l6Çc±Xf``Ð%}2Œ˜èH$"òâÅ‹ÔÔT~¨Myy¹ŠŠÊ£G/^ÜÐÐ÷wGz­?W½wx€’’???,ŒÅbçÎK&“ËËË+++•””***ÆŽ›››;zô蜜X‡}ÕªU/_¾HHH¬^½šF£q¹Üââ☘˜€ß šp<==a.ùÖªl   ü-P¡ƒ‚Òóa±X4mݺuaaaT*UOOïéÓ§]Òsii)?F¥9'11qæÌ™x<¾û*Àü!BÇãu2’’‚ HCC‰D2d`ðàÁ²²²òòò 8NUU•ÉdR©T¨æøâa5T€ÃáL&“Ùl6—Ëm²¨ ƒÁ0 Tå  ô4Ð`d”ž…Bn£óçÏ„ðððýû÷ ’‹¯3èèè<}úÔÝݽººº[#O„!tx<ž­­­ˆˆÈ›7o q¬ """ËåÂê¡›6mâWÁà—}‡-avó·C2™Œ¦“GAé ”^Ç[ºté¦M›öîÝ+..îææF§ÓóóógΜÙåc 6ìöíÛ/_¾ÔÖÖær¹RRRÝj§øƒÐÁ`0]bMÊÈÈ8qâÄôéÓI$RCCƒèo ©FDDÇÇÇÇ‹ŠŠæåå=x𞥢¢²gÏ‘HlܾóóAAA¨E¥W@§ÓÍÌÌ‚‡‡ÇàÁƒW­ZuåÊEEÅÄÄÄÐÐPÁ»Âáp³gÏnñ …âåå•““³hÑ"e+„gz«wAh4.Ž. IDAT™L–€ ¦:É®]»æÍ›çåå%--Í߉Á`?~lll,""²dÉ33³¡C‡¦§§¿{÷択0a\o…‚‚ÒA-:((½ …"%%5{öl@qqñÕ«W׬Y#''wíÚ5 ‹sçÎ Þ•ÏãÇýúåææ6}út ­­íîî^YYéìì ½7ݔӄVƒ‘1¿ADOOïÚµk,......&&FUU•H$æææ¾yóæ×¯_ü3f̈¯©©‘’’‚åIÑ[$ Jï:((½è½j\¥ ²²råÊ•0+Þ±cÇ`!ª?RYY  \¸pá‚ öïß• ))IWWWÈ7„¶ìÉ>>>0ˆxïÞ½]8äÓ§Oƒ‚‚Ξ=ÓXå@233?|ø ¦¦&..ŽæÅAAéí B¥·@§ÓMMM›Z8Àf³>,`?%%%€°°0EEEUUÕÍ›7ß»wo×®]£F²²²B¤É ËåÒh4þ ó.§U¡C£Ñ–-[fddT^^®ªªúòåËiÓ¦u«£]LLìàÁƒÅÅÅãÇç‡é   ôjДÞô^Í™3§Éþ²²2˜ÖOKKK~ÂÃÃétº½½=àË—/þþþæææÞÞÞÙÙÙß¿§R©“&M266Þ¼yó¡C‡nÞ¼™ HðŽÑµ´z÷UWW0`À¸qãRSS'MšôìÙ3&“ÝõY ñx[[Û/_¾¸ºº¾ÿÀ/dŠ‚‚Ò«A-:((½è½j¾ÿĉ\.×ÉÉIN~þüyíÚ5CCÃaÆ5?Ê`0òòò^½záïïïêêjee¥££#**:eÊG§Ó;{ÿO«B¾-[¶¬¨¨hÊ”):::Û·o‰‰™?>F³³³k×0ZZZS§NmqýØ–-[ÊÊÊüýýkkkºººí¼”ž *tPPz £EïÕ·oßîÞ½»lÙ2~Η¶ñöö´·ØvrròÅ‹a­ò.¤-{2ô^8ÎëׯO:ell|øð#Fº£h;Ê¡ÓéW¯^íÚ>utt ÚGé3 ®« AX,V×öI P¡,LDEEM=x𠬬ÌÖÖöÂ… 짬¬ AX‡» AFF¦´´´ù¡úúúͺ-þ t(Šªªª¦¦&”f|ªªª´µµÉ tîܹݻwïØ±#!!¡ùѺºººººÜÜÜ&û±XìÕ«W---ÿØ?J—C£ÑvïÞݵ}‰Äððp®íV8p8œ&¥dQ:ÿùùùãÆëÚ>gÏžÒÝ&Q½WÍ…›Í¾xñ¢‹‹‹ ~ “““Ã߃Ãá¶nݺeË%%%:þåË—›7o?~¼ñYÁ¢Cg–-[ÖDèNž½Å³þŽÐ¡P(Ç3fLFFF“CGµ¶¶¶³³$‰ÐçÏŸãããÍÌÌÚ%tµµµrrrí:Eh|ûö-))I–ÉÉÉË—/?vìX—THí¥ÈÉÉ͘1#""¢§i‡vìX<üøq<ÿüùs&“yåÊ•'NÄÆÆ¶±°£;÷õ(**:lذß¾}»ººÚÆÆF~444ètú·oßø{FŒYõëׯôôtèÉk Fëþ€€'''pëÖ-kkë‚‚‚¿=£¿Ô:FFFõõõ‹/~õêÕßžQ; “É®®®{÷î%‰!!!³fÍúòåËßžJ¯ÇÀÀàôéÓýúõ{úô©®®î³gÏþöŒzPëôë×jîppt+êêê7nÜPWW/,,´¶¶ ýÛ3ú3­eœ;wA ‹ÖÎ…‘È{÷î½sçΘ1c¸\îœ9sÖ®]›•••ŸŸ=E F8„TX-^0Nž>}º útâĉïÞ½c³Ù¢¢¢»víÊËËûðáÃܹs1Lqq1‰DÒÒÒjþ~L£Ñ‚ óìù,^¼øÂ… ŠŠŠÐÕ%ñz½‘^­uFFF—.]2dtcݾ}ûoÏ¥×£­­}íÚ5mmmèÆòööîŽ2νšÞ®u‚‚‚–,YÝXŽŽŽ=<0ƒÉd·h´þõë‹Å’híÜÉ“'ÓétiiiAH$‡ûõë<ôúõk~ne‡ÓäÄ¿fÑ¿½W- DäF~ýúQ©ÔòòòçÏŸ———{zzöë×ïüù󺺺˗/g0­¹rúŒE¢¦¦våÊ}}ýúúú;w9r¤ËókõXŠŠŠ–ýfùòåùùùRRRõõõFFF°j}/‚J¥Ï›7N§ÛØØØÛÛ7÷d£ ´ ™Ó§O¯]»pôèÑE‹ñŸ ÿ2UUU÷~óþý{KKK …òèѣŋ÷:­C vîÜéáá!&&öøñcssóììì¿=©VŸ7o^‹G¹\nkf‘¹sç""**Ú¼¾ÓÝ»w»ž%tDEE©TêØ±c›úøñãóçÏ­­­¡K¯5´µµ1Œ‘‘ÑäÉ““’’V¬X1dÈW¯^ÅÄÄ(++ÃËknÈê{:€B¡xxxüƒn,ƒñþÿ l6ûñãÇ{víuc¡t9X,vãÆ¨«1?~üØ×ˆ3gÎÀä¹/^¼$6´¢¯¯åÊ•^áÆjÃ{ÅãñZ:­I‚ääd{{{xns¡óׂ‘A#ïUzzzó£7nÜX¶lYpppk=@ÝÉ“'Oœ8A£Ñlmmsrr PQQÁãñ°XlkB§/™s³xñb ½{÷þ «±ZóïܸqãÁƒBžObdd4räH—µ ¥WÝX|óæÍ¿¼KZZ&ŒmNFFÆ×¯_Ùl¶§ÔU@7Ö©S§îÞ½Û“Wc±X¬ùóçŸ>}úÊ•+MꊷfÑ9~ü8Fã_“É©­­å·ñóó‹ýúõ«””Ô˜1c'‘H³fÍ0ä·]´#¥=ÌèââÒüPXXXyy¹­­mBg„ UUUgÏžurrZ»v-…BÉÎÎvqqáp8m×TêÃ?oèÆ:räHbbbß^E"‘FÝâ¡›$Ip ËËË«G­ÆBéÕ@7Ö… ‚ƒƒÿÙÕXŠŠŠ‡nñБ#G¾~ý*äùt-Ð5nÜ8»‹L&s¹\{{{{{û¬¬¬Ë—/‡„„üüùÀår›/ž’’’Љ‰QSSkl³ ‰¾¾¾ÅÅÅ[ooïèèh˜¹füøñ‹-rrrjhhèò«h‡† P(T*µÅRL&óêÕ«::: ­>qâĺººOŸ>ÙÛÛ#òêÕ+ Ë—/þü¹q³æñw}Õ¢ùgÝX} Ô…Òå n¬žïÆ‚†7tèPŸ¢¢¢ððp333AàÓƒÁhkk¯_¿>  ¸¸xÒ¤I<¯IhÎ?št+%%åìì ]=uuu˜¬í˜ŽÑ¡ÃÏØâQXBJJªÅ£T*uÀ€ŠŠŠÐ!‡Åbþü _FF›ÍæâÀ„ñÿ7žkÑხÆê «±Pºt5VŸ§W¬ÆÂb±x<Aƒ1þü°°055µ¸¸8‡“ššdcc_ÔùOm6› -4>>>çÏŸ×ÐÐØ°aCNN‡Ãyùò%€ŸTewÓw»}¢µWmW´122`±ØæYž F\\œˆˆÔ= Mj›+W®ÄÅÅ5êVþåÕX} t5J—ƒ®ÆêóôüÕXÐ~“——G§Ó —Ë¥ÑhT*uèС€K—.ÁfjjjpÖòÄáp‰‰‰–––OŸ>]·nÝû÷ïÕÔÔøÁUYYYp#==}ðàÁðãׯ_™Lf.©kŸÐ¡P(C‡?~|óCm KKË6~™æææ7nÜ€£…Ž5G^^ž““Óòåˡ䨫o€º±PºÔõ/ÐcÝX‚`0˜²²2*• =Y_¾|™_† †ÅbŸ>þèÑ£§N’’’‚Ƙæ*€Á`øç¶Fii©¸¸xçŸPí:x<*.—khhøàÁƒÒÒÒ'NP©TðÛ¢£­­mnnîêêùãÇ%%%~‚”––6©ê€Åb%$$lmmùšÆÌÌŒF£‰ˆˆ´Qý«›à ?~¸¸¸ˆŠŠ&&&.Z´èÀ%%%™ƒpÜX Ãßß_KKkïÞ½}Øë¿–¥¥¥...cÆŒñõõÚm«ón¬Ÿ?úúújkkß¼ySÈ>\”¶áñxAAAÚÚÚëÖ­ƒKd…Ãßucñx¼ÄÄÄÙ³g/_¾<33Shãþ°XlMMŸŸßܹsÏž=ÛM%î[Dhn,vòäI*•ºoß¾6.–¡ä»“``òìÙ³%$$<==_¾| Ë3GDD¸ººBÛœœ| ùòåáÇ{c2™l6»íïí Aƒ‡ À:CÇ4‰D SQQA$öîÝ 8uêƒÁHMM½yóæÁƒMLLx<Ô@?’H$…>,Z´h„ QQQ•••\.wÊ”)555ü[yffæ¨Q£²³³ FFFÆÇóòò~üøñóçÏêêꆆ†î³(B¡#"""%%³5lÙ²Ç?xðÀÈÈÈÛÛú …@·º±àµ´´4N?wîܘ1cöíÛ×'å_6¬¼¼ÜÍÍMSSóèÑ£Bû;vƳl•––nÚ´iöìÙoÞ¼é‰͚5kØo444Ö®]Û|(JkÀTI',,lÆŒ¦¦¦üH!ð·ÜXðÆ‹ HllìŒ3V®\ùñãG!ŒûW€Ïi8þ|__߯qÝŠpÜXÐC£ÑŽ9¢¢¢âááñÇQ¸\nMM ƒyýúõåË—‰D¢››ÛÊ•+mmmáâð&ih&NœhllܤA$%%á6…BÙ½{÷ñãÇ/]ºôàÁƒgÏž}üø±¨¨h„ à÷_¡3tÜX’““£®®žœœ¼páB˜÷Åb;Þˆ¥¥¥9Έ#`c‹Åf³)Š””ÔÁƒ?|øpûöíÐÐP˜ÚóëêêçÔY½zõ‡Ž9‚Á`ètzvv6ƒIMM½té_uÂe\ЙÇ߀|þü¹¤¤$44”ðþ6‡Í-öüb 8{öìŽ;8rÿþýU«VY[[wøOpº/© :3gÎÜ¿ÿ¡C‡ÂÃÃýüü._¾¼nݺ­[·v¾ÿn‚Û~¾}û6lXhhhBBÂáÇŸÕÔÔܺu«‰‰‰&ðW’ B9µ`Á‚‘#GúùùEDDDEE™ššîÞ½{øðáÝ:´ðïH#GŽ|ðððPRR:yò¤¬¬,àñãÇk×®=sæ ‚ âââm ¯/^¼puuåp8zzzöööA~ýúUYY©  ÀápºÊŸÓÁ^ÊËË•••ýúeddTYYI¡P^¾|©««›ŸŸ?qâD???mmmX×4%%eÒ¤Ix<>!!!::ZUUuçÎ6664 ‹ÅÂ6üß”——÷òòâÁãñ¼¼¼^¼x±víÚùóç9’H$ZXX:tHKK«¸¸˜Åbq¹\:N§Ó[œdmmmgV»4***!!!»víÚµkWLL̹sçBCCùKéºèƺwïÞÉ“'oݺ&**ÊÏÔÄb±X,–ºº:ƒOÊ?nÀm­‚Á`´´´îß¿Ÿžž~èС‡ž9sæÒ¥K+V¬Â¥ñUDx<ÞUK‡‡àÿžgÍšõñãlj'Òh´Ó§OûûûwÝu´tca±Øèè興ˆˆˆˆ& ( _÷HJJ¢¢"€•••§§§ÏíÛ·###ììì:9%"‘okk;dÈuuõ}ûö•••ÉËËž={vúôé>ˆ‰‰ééé9884ÎzíÚµ«W¯p¹ÜΘ1ÃÝÝÝÐÐðÓ§O€É“'¿}û–L&[YYmÛ¶ ~åx<ÞÅ‹¯_¿^RR¢ªªjoo˞̜9³°°P__ÿõë× CSSóСCüפ֯úã ;Ç£Óé ƒÉd6ù·ÉG¸€VJJêøñãûöí 8}útffæúõëÝÜÜZ«]е@7Ö¸qã8ÝXð˃Á`àºÇßh¾³ p?lÖ¸Mãsá먌ŒÌ±cÇ=¾téÒåË— áªù¼xñ‚ËåÂûï7·D¤I3Aš4+))ñôô$‘H°=ôqóx<]]Ýèèè7oÞ>|øáÇ׮]»}û6Lš'„ËÔ××WSSÛ»woNN޵µµŒŒLÿþýq8ÇápÍ7šïÇápð nÿøñ#22²°°Ç'%%ÔÔÔüüüþû�{÷¾|ùrûöí>>>û÷ï_½z5? —ÉdR(”wïÞ¹¹¹Nœ81zô蜜YYY.—;gΜ~ýú™™™R(~:Á6PPP¸yófã= FNN®ËÓåwPèÈÊÊæææÊËË744ôë×/??üøñׯ__´h¿ ¼O 6ÌÛÛVlñõõ…ÍÐÐPBB¢q€-‡ÃÁápÍMúIIIðÏYºtéíÛ·ù™¿y<“Éd±Xð߯lذaúôé#GŽd³Ù0!!»-îd³ÙoÞ¼©««kn5áñxŸ?æ;wX,–0#[UTTDEEkjj8?ÉŸ²²²Nö¯©©¹hÑ¢—/_þüù³¾¾>22²“¶‹_¿~ è5Ãý ˜ØªñǺºº/_¾ðMîááá€æY*•ºiÓ¦;wvïåý&222110hÐ *•ÊãñjS]]]_____ßb˜¤¤$…Bqww·µµµ²²zòäÉ‘#G®]»feeÕUs+++‹ŽŽ–’’‚ $ãââìììFŽieeUWW÷èÑ£ÔÔÔèèh …ÈÎÎ>tèЄ f̘QWW÷øñcè•·µµ‹‹‹}õꕉ‰IeeåÙ³gI$’­­-ÀÕÕõÆS§N3gÎëׯ7oÞ|ôèÑ¥K—êéé…„„<{ölÞ¼y222qqqëׯöì¼Q¶6VÛ3luuuK—.år¹ £y†‹¶i))©Ý»w›ššŽ;–Á`„„„´wFCCcøðá¯^½ª¨¨¨¨¨ˆ0VcÀ€§NÚ³g•Jmhh¸yóæ;w„0:Ÿ‡6 þè<ͳŠð}‚ÚÚÚ‡þøñãçÏŸ™Lfdd¤ÐÖ  4hìØ±999l6»´´´´´´“ÂeÎ|à£yæÌ™ÉÉÉK—.-,,ܸqc``àÝ»wåääÈdòóçÏÝÜÜŠŠŠŽ?nll\YY‰ ˆºº:øFKKËßßßÂÂâèÑ£úúúL&³yæ¼ÆüÑðÓUtPèp¹\6› ï‰ÊÊʹ¹¹æææ'Nœà;t^¾|PWWgggçììÌår¡š5Ìét:™LæwX^^þýûwøòÚ222?b±X2™Ü¸>ÇÉ;] IDATŸ|XQQ±}ûöóçÏ3 c``àä䤭­ ãᄆ‘‘ÑÆ»°C]]]þ2Ÿüü|@UU•™™Yxx8‚  ÅÒÒråÊ•Pm ÷ïßC‡²¤¤ä‘#G¦OŸÞù>sss7nÜ+xyy¥¦¦²ÙìS§N?~>éÆÿâÅ "‘ãææ–ššº~ýú°°°þýûÇÅÅÍ;·µžá›@||¼©©iFF†ŸŸ_yy9 âù‹tM¤ Щ««óóó«­­upp@dóæÍÍã’DDDš‡¶ Ò8°K__Μ9rrrý~3dÈxïèn•€>µºººƒž={ÆØ«ªª®]»vîܹ3*tŒ×¯_»ººVVVÊÊÊz{{kkkwùpÅİaàÄæÕ xQGVVvûöíëÖ­fiñÈÈÈãÇ3 uuõàààvÅuÁH䪪*ð!..¾bÅŠ 6t¹(\¿~½”””‰‰É–-[nÞ¼ ßd°XìƒZ´˜æææR©Ôôôôüüü›7o?~|éÒ¥üjw)))p’¯^½"‰RRR0ÇDBB‚ªª*AÄÄD11±Æ©D[¤µ±Úža»À`0’’’0å«à@Aöøñc_½zõîÝ»;ðÊÑ1ètº§§g\\`åÊ•^^^ÂùVCóFxx8ƒÁîܹSKKKC øVYRR¿fkÖ¬i­¤c—ƒ È7üýý9Ž–––··÷€º|è«=sæ ü¨©©¹gÏžeË–a±X‡“'Oêëë§¥¥ijj~úô©ÿþm¨ˆ””TqqqLLŒ•••¾¾þ½{÷¸\.´uù䤳B'55u„ #GŽ<|øpLLÌÞ½{¡]ÚÏÏoÛ¶mÓ¦M³°°xöìÙEh||ü†  Ñ›@ ¸¹¹)))!R^^^YY9hÐ hXN {hÑÑÓÓƒcÇŽ]·nÝ´iÓ„ùwjâ®òððhâ¶ë<Ð¥ªªêäädffÖ'%ÇKIIÙÙÙÙØØ´÷aÖqWµ :€aÆmذaÅŠ];ÿ¨¨(hŠ¿víš³³ó±cÇV¬X±mÛ¶eË–ÙÙÙ9::Ο?_OOÇçææ¾ÿÞÖÖvÆ €Ç?~<::ZMMÉd~þüYLL¬±™ÓÝÝ=++«¶¶6..nÕªU"""T*ÕÐðíÝy\Lûÿ8ð÷L›öM ¥En«R÷†Ü(B·.]Û#T’,Å7Z´(銚›ÊЈ.%$Q’,i™kr¥Ü®åâSB¶(Kuµ×4¿?ÞŸßy̓֙iz=ÿ:9ó>ï3s:ç5ï×û¼ßó¨TêíÛ·ÇóæÍ²²²   ‘+W® „Ž9âââ2fÌ:àÇÓzØWÏ5äXH¤ùóçÿúë¯\hM!°§«h4§¹–‡tÈdò/¿ü`ddĵ]s¾æ‹‰‰9::®Y³fÐ/Â=`OW­ZµÊÛÛ{ˆ†”#:¥M:544tþüùÄÎÀÀ ;;{áÂ…?~d±X½ÿ‘6vìØÊÊÊŒŒŒM›6•––ÊÊÊzãÞëÿwçÎ33³ &„‡‡§¦¦z{{ãvuœ¥ºÿþþýûCCCïÝ»G¡P^¾|É>fà—æÎÛÖÖæêêJtñikk5j”’’áû þ⻺º¬¬¬Ö¬YcffÆå |3]5(TTT’““.\(ðóÃ::·Týý÷ß¡ÔÔTeeå9sæàñ¢233q Ãi_ø‘1N5ä11±üqÇŽCÑÔÚî§«Ø‘H¤¥K—úûûã–9Á&""²|ùr.'_†"]ÅIWW׬Y³BCCqG=‹ÅòððÀ}z¾Ùìú%]]Ý›7o8p@UUõÀqqqƒWå>ëO ƒ»ihhlÛ¶í÷ßwrrºqㆢ¢â¥K—æÍ›‡·™4iÒÕ«Wûí7¶`Á‚'N´´´à¡„8ù¬Ý•›É…ÏtwwÏ›7ÏÝÝ'ÿÉ\HWa¸ãçHÀý_IW±³´´Äm‡ÈåË—?[³{÷îÝ»wãe;;;;;»¯¾qÁ‚=ãããûÙJaaa/////¯ÏÖ3 ö??›]®‡}õPC.077çò˜C¼JW±[¹reÿº{Gªªª[·nåæ¹“®b€kø¬­­­ý>Ç&Ož\PPÆó!%ûèÜ¿ßÈÈh̘1ÁÁÁ xèq<~±¢¢"å`ÖÖÖgÏžõññQVV¶²²:}ú´®®.“Éäþ”}•žžÎµD;;.¤«ÀPxºŠ³ÚýséÒ%|ìIIIÎÎÎÜhŠW¸dð0]ÅNà€yˆké*vÄðÄìH$Ò¬Y³N:U[[;ŸÄ¸•ˆ›ð~Uo?DÊÁð˜‰ãÆ+))±··ýúõóçÏ---û^aé*é*0D ]%ðø']5DIKKd~ÚQ£F‰‹‹—––644ððмé*é*0 ]%ðø-]5Dp7äï¿ÿž·ÕèU cee•——wìØ±ŒŒŒ£CVVVEE… óƒð-HW HW!é*ÇÏé*Ô«WVVVTTtáÂ…ÜYkkkWWW\\œ¯¯/;`󤫤«Àt•ÀøtêU STT„Ÿ†ÇOõ{gâââÉÉÉÛ¶mÛ´ižÿ¼ßE S®®CÒUo„¤«øPoSWÿÝz`ÍkÕÕÕ–––BBB<³'‰‰‰®îNž é*ÖØØ¸yóæ¿þú ÒUÜÇÕzܸq]]]jjj‚”ºjll|õêUÏÛ°X¬#GŽ@ºŠo577S|ÕÝ»wBµµµ®½Çb±:::zØ€Éd"„RRRB®¦:;;ñ Ð_…¿b<Ï ¤«x‚Û¥@ưiiiiiißÜ ÒUü¬­­íÌ™3ßÜ ÒU Ož={ÖË»¤«†¯^Ž·é*^À°ƒ›äääÔÕÕ{³¥††Æ®]»ää䆺J ¯¤¥¥¿œ~ò«ÈdòÊ•+ù-Xïêꪯ¯çu-†·®®®A/“D"‰‰‰õfKqqq*•ºxñâA¯j"""½ìlêìììãã3ûlðþºd;«V­ì‰|»ººîÝ»7¤»¨««Òò¿I\\|íÚµ¼­C¿‰ˆˆTWWÿüóϼ®È°7èñ«ÁÛ·o·LÀoþüóO^W|: 'Ð…Ÿ™››?yò„×µà¼}ûvàÑôŒç?À0ø:aaanv'à¹þÑÙÙùèÑ#^×€ÿ‚@|¼¼üüÁëZ†55µââb®í:ö‚Þ€@Àà522âu-ø0š :Xè@`A ű3rhh(N·´´$‘HL&“B¡HKKs³f_Šˆˆ ëÇY,VFFÆÉ“'kjjF­¢¢¢¡¡A¡P½†½÷ìÙ³µk×|9ç—‰‰‰‹‹Ë–-[¸Pˆˆˆ+W®L:ËaaaRRR\Øobcc^މ‰Iuu5^–˜1cÆž={ÆŽ;ð’¢²²ÒÁÁ¡¬¬¬—£©~6BÎ1>¼J€!ŇwÿâèP(&“¹k×.„ÐÛ·o©Tjxx8÷êõ5ÍÍÍý{ãþýû;æêêj``ðäÉ“ãÇóü6S__ÿþýû¶¶¶/ððp®ÍêÖÝݽ}ûv„P]]Ýþýûƒƒƒ¹³kNZZZ¥Ÿ€€€ÄÄD ‰ººº}ûö­ZµŠN§JáýVWWWWW×ÚÚÊó3 Ü9Çøð*†Þý¨W—«ªª·Ÿ–––ÈÈÈææf<#kDD„¼¼<~)**êÕ«W,KFFæÑ£GzzzŠŠŠ7nÜ8}útKKKHHÈ›7oNŸ>Ýs9………YYY"""L&³££ãСCxû   ƒÑÔÔ„"“ɲ²²½©ü§OŸRRRñ¿?ýô“œœÜû÷ïB ±±±W®\[´hц DDDlmmß¾}kjjZ^^®¨¨<{öl„§õÝÝÝÇŽ;}úô»wïÆçèèèââ‚wËÿóÏ?[[[ÕÔÔš››³³³eee,Xðüùs„¥¥%BHCC#''!T[[ûË/¿´¶¶"„JJJˆ ºçz–••‰ˆˆäääÌŸ?¿7'ÊÊÊxסÖÖÖØØØ––ü턆†³tíÝ»÷õë×,KZZúÉ“'&LPPPøçŸŽ=ÚÚÚºcÇŽÚÚÚ£Gö\NQQÑ… ð·ÜÙÙ¹wï^¼ýöíÛ¯^½J|Ë¡¡¡222ý;<玲­->OF½råÊööv‘}ûö9r¤¶¶VKKkõêÕžžžø-õõõþþþBBBFFF7nÜ——OJJZ¾|yWWWUUUbbbTT‹Åªªª’––æTB(22òøñãïÞ½SRRº{÷®˜˜Ø”)S?~ŒÒÒÒB?þöíÛý;:ÀFà9Ö›«ÄWÿ»wìØñäÉ==½††!!!UUU___‰„‹¢Ñh555!uuuâïÞ½«¦¦&&&ÖØØ¸~ýz333Nå÷PŸ~€$¡7wÿ¯Þµƒƒƒ+++ ?~ü($$4f̘àà`≉yùò%BHCC#((¯Ü¶mÛ­[·Æ7jÔ¨††>>RRRùùùþùç§OŸdee£££¯]»%..®¬¬Œë£¤¤D¥R+**öïßÏ~=×ÓÙÙ¹°°ÐËËËÞÞ~ 3Æ?žhu?tèЦM›ðIóáÃ‡ØØXüOž––fjjêçç‡b0¥¥¥©©©¡;v „ÄÅÅwíÚ…—{.çܹsT*Ë)))Äö;vìØ±cþí8(þý÷_<]WLLŒ¶¶¶˜˜XxxxffæêÕ«•””ž={A&“×­[‡Z±bÅ«W¯bbb¢££qý§OŸŠÊÍÍL&GFF"„vîÜÉ©œ²²2*•¨¯¯êÔ©k×®áÿÃääd:‰Û`¬3Á0¢Î±Þ\%¾úß½}ûv{{{www„ƒÁ8}úô²eËB§N222ÂñÍåË—ÓÓÓñÒmÛ¶¹ººúûûkhhtvvnÙ²:œ®œêÓ ôæîÿÕ»ö®]»f̘aeeekk‹ÊÏÏ?qâ„««+B(%%ÅØØÇ7yyyÇ_¹r%B(22rñâÅ¡¡¡ZZZÞÞÞ8ÐápªÏ—z tž?îëëûŸÿüÇÚÚš¸÷äää°ÏTWSSÃb±H$ÒƒÜÝÝñJ;;»ìììž?>Nå,Z´hÅŠJJJø ÎÎN„З'ÇóçÏoß¾ÿÇð±±±AAAššš!*•*##3zôèÜÜÜ––)))Në³²²þý÷ßøøx¢äÜÜ\''§§OŸÞ½{—(ßÚÚ:11_wôõõ?}ú„²²²bÏ}’ÉäéÓ§6ãñ7ëyóæÍ§OŸ^¿~½¹¹¹í/^¼ ¹ÿ¾¥¥%ñ› ??¿¶¶–Ø7áH¤ÊÊJ"Lœ={6nˆê§ræÏŸïáá1zôh]]]|á"&&&xa̘1¡”””††|#Á233×­[÷ðáÃÒÒÒÜÜÜiÓ¦!„DEEƒƒƒ§L™"&&FL…¡¬¬]%8ýwëëëΞ=›øET^^ND$sæÌaÿ3a „ˆˆq8œÊçTŸ¾lss³`'ÊËË…„„þúë/NBŸîþœîÚ†††ÄŸvvvDKǽ{÷ˆˆÄÞÞžhÑAéêêâÆHöoœSùœêóåáôèhkkïÚµ ·444àfÀñãÇÇÅÅõð®^âTŽ­­­­­mSSSYYYrr²¦¦&þÇî7 2™ü×_ÙÙÙ±¯ïèè@Q…¸¸8“Éd±XøOö‹XùÕõ,kÆŒìs˜ã+N[[Bˆˆ<$%%qCH_õ¯ž½§©©¹}ûöÖÖÖðððÆÆF|niiiEEEõ£´Ïp*ÇÆÆÆÆÆ¦¹¹¹¢¢"55uܸqnnnßÝ—ÒÓÓEDDöïß_\\\UUellÌb±æÎëííMl#))‰jooGmÝßlôæT~éüùóEEE—.]¢Óé7oÞìÇ #áëÓU‚Ó÷gÕëîîî_e8•?XW­ššÁNP(*•J£Ñ"""8%út÷çt׬oœSù½F¾ýx¹„„N(à?555¿ÚÛÎÐИ)??ÿéÓ§x¹«« /¼|ù²ªªŠØžS9111!))©iÓ¦mÛ¶íÁƒÄK¸ëF_)))9;;‡……ÅÅÅÑéô‹/úúúèêêêééùúúž={6555::úçŸÂsAߺu‹ÅbáG**++BœÖ/\¸°¤¤¤°°°¶¶ööíÛ±±±Déëëkhhøûûgee]¾|9--mþüù¹¹¹¸V8JOO?{öìúõë­¬¬Þ½{÷äÉ“+W®Ü¹s!TTTTRRÒÝÝÝ›zânÚ÷ïßïÇ烉‹‹‡„„à¶t„иqã ¿ÜLOOïÊ•+x™Á`àˆí[®©©Á™×žË¡Ñh!IIÉÉ“'âOëß·ü%<§`SS“®®î™3g=<< ]\\ Æ¥K—^¿~}ýúõ­[·â£666600pss;yòdbb"NÂbøwRzzzrròÎ;BUUUœÊAÙÛÛ;::ŠŠŠÎ™3gòäÉøº‰_Â׋Ç?~|É’%:::ƒr°€'FÚ9ÖË«§ÿîgÏž±_= ð²±±ñåË—ñraa!±žNåsªO_á«§$@llì¢E‹\\\|||²²²º»»‰Æu{{û%K–455áN-œÖgeeÕÖÖÆÇLJ‡‡=z´¥¥ßp`÷îÝK—.ýù矣¢¢ÜÝ݉$€©©)BÈÊÊÊÆÆfâĉ¸J8 €3z}ª'îyóÍ‹m/ïþœîÚOž§úôÕØ±cGx ¯wNwmssó{÷î]¸p!¤¡¡A¬_¹reLLÌ¥K—H$ûú-[¶OŸ>=,,¬°°ðãÇòòòœÊçTŸ/‘BD7æÁÒ¿ŽÃƒÈÚÚÚÑÑÑÚÚš‡uàƒQXXxüøqîïzp;ó•ââb‡ªª*èL†ÈH;džÅåbÊ”)»wïÎÌÌÌÌÌtqq144loog0±±±K—.mmm]½zussó¡C‡fΜyêÔ©¨¨(6sæÌììlÜNóÃ?pZ›––æäädddTSSSXX¨¢¢Ïd2,X !!±lÙ2YYÙÚÚÚS§NýßÿÚ¦fÖIDATýßÏ?ÿŒzôè‘££ã¦M›étzEEEVVVcccuuõãÇ÷ïß%''7mÚ4‰ôÍz:::VVV^½zÕÊÊjè>Lž‡‰D‚ÙËøÜíÛ·KKKB7nܘ;w.¯«œcüL°“gΜyõêBÈÕÕõÅ‹\ÿty`ð[tž?¾oß¾âââŸ~ú‰ýy.ƒ!õâÅ‹C‡•––ÚØØlÛ¶›»æccc<ª‡¼¼üƒ>{€iç^ÙÂÂbýúõøA*þ„[t´µµy]‘¡µqãÆ€€€žº8<¼òôéÓ}||p6–W†¤EG[[›Á *MMÍß~û×µ*}íê@_´s,,,¬ø€aŠB¡ðvˆEv0©':Xè@`A W†§«#ÄÁƒW¯^ÍëZ†¸bŒÜ8:¿þúëäÉ“ñd.¡¡¡“'OÆ“+ „ϰŸÀÎÎ΄ÍPŒ ôìÙ3<Ë:¿III±±± ^¿~=ûÔc½±~ýz<Á _111‘g³yóæAßEee¥žž1ý!ÒÒÒÌÍÍUUUgÏž]\\üÍíë<áŸóM ¯#™`DÇÑÙ¹sgGG‡žžBˆB¡0™Ì &p±bü"**êæÍ›x€mIIÉoN8×õõõïß¿okkûr9žsss«ªªÂ·wvv†……ñÃÞ”˜˜X\\L¡P¥¤¤&Mš4軨«««««kmmôÂJLL öôôœ""bÏž=ø%â½þþþøðRSSMMMñ?~~~fffÏåÄÄÄ,^¼˜J¥îÝ»—,B™™™ xæÕ¤¤¤ÞÛÐñððعs§˜˜…B¹zõjXXجY³Èd²‡‡…BùÏþ³fÍuuõ{÷îíØ±ãÇ...›6mŠ‹‹C-Y²„L&ÇÇÇ㢢££¯]»%..®¬¬ÌÓ#ûŠ/^„„„ttt%&&ëO:edd„¯V—/_NOOÇ3¶dddãõ ãܹsxû}ûö¥¦¦ÊÉÉ!„lmmüñG¾ºføùù‰‹‹ÿþûïùùù^^^öööBBB·nÝòóóÓÒÒºy󦯯ï»wï6lØЧ†vss#“ÉDZ399™N§GFF&&&JHH¨ªªòôÈ7TTT4559;;kœœœV¬XajjÚ§óDηrÅ`wòäÉèèhggçI“&ÑétOOϤ¤¤~ø¡‡· VC> ôèhkk­ŽÁÁÁx!''çíÛ·Ä6555,‹D"uwwÿþûï<f±XÄLc®®®xÙÎÎ.;;»çrBZZZÄGFX´hÑŠ+””” lmm{yxCg‘©TªŒŒÌèÑ£sss[ZZ¤¤¤ÆŠÅÍ3vvvŠŠŠ‰‰‰«V­266Æï=z´©©)Q”¾¾þ§OŸÐÿ¶ñMMMÜÝÑѱyóæ;w⓲¼¼œá{Μ9ļÄ>$:šÍž=›h RUUmhhhoo+**Âg<ÿÀí±ÇŽ“““SQQ9sæLss³ŒŒ n³=räþ=±xñbeeåÝ»w{{{›››ã÷*++O:•(ÊØØ¸±±ýo‹™ÄÄÄútžÀù6B®„öööøøø 6¬_¿!dggççç·gÏ__ß>5äómB@">§®Æ[&>C¡PfΜéåå…ÿ$>޾–ƒújšÙÖÖÖÖÖ¶©©©¬¬,99YSSsݺu}¬û Ã_Æb±ˆeök¼¼|GGGww7Wk64DEE/^ü÷ßÛÛÛ÷¯„¥K—fff:::JHH þ|ÐÒÒò÷÷Ç­²...qqq]]]êêê¡ÔÔT<¸žžž››ÛÑ£G™L¦¡¡¡ŸŸw­7RRR®^½Š½³³S[[›è-¸|ùrVPP@"‘ÔÕÕ½½½ñúeË–íÝ»7//D"©¨¨()):tÈÓÓ¿jmm““ãààÀ“ÃÁÖ®]ûêÕ+ôÿsÉîîî{öì¡Ñh¡Õ«W_»víàÁƒ!OOObŠé9sæ$$$Ô××ëèèDDD¬Y³!4iÒ$OOÏððð®®.Ü4!!wŽ›8qâÆi4“É455Å]+€`óððˆ‹‹KNN622ÊÎÎÆWü>'øGùð=ßòŠÑ³ &HJJž?§®B/^œ8qbÿš ø-! ‘ !äááÁµ‡˜¸ÆÚÚÚÑÑÑÚÚš›;½yóæš5kpö”k;e0………ÇçÚ¢ººº¨¨ŸÊÃBqq±ƒƒ~¼…×u‚ηÏpùŠ1eʔݻw÷u”—“'OÆÄÄ8;;›˜˜\¾|™Á`$%%™››?xð`Ù²e[¶lÁ ù÷îÝËÈÈÀMY=rttÜ´iѲeËyyyö„€££cPPPŸÊéMB`ãÆü>"‰Ä§YÏaêÙ³g¡¢¢" ¢±°;}ú4ñ»gXÀ#eÑétmmm¢7(CÎ·Ï ‹+†³³³¸¸xrrrFF†®®nbb"þîúÔ¯¨¨ˆ+!À? Eg0áñuB²²²………ÜØ`¸´èDDD´´´”””8;;óÿ•‹€Ç×AÉËË?|øç²Áç'WŒþµè n& EôNçuøWXX¯«Ðååå¼®Aà|# Ó+F¿AB`è@ ðXrr2B($$„› €Ç !0t8Î^0ÜA :Xèü—Éð4"!“èèhöíëêê¦NúÙfسgÏlll:;;¹W{ð5&&&ò_Àó<#„äååñ@õ„7oÞ¨©©}¶VYY©§§×ÑÑÁ½ÚƒáÎ1ø÷½{÷rm_ýàîîŽŠŠŠŠ‹‹‹‹‹Û´iû«áááŸMÀ«¤¤·qãÆ/‹ª¯¯ÿþ}[[ÛV|“B(11ñĉ'NœØ¶mû«4mÉ’%ìkTUUOœ8úeQuuuuuu­­­CZa0ìÀ9@Ÿð$à^ S[[˵}õž9ÖÌÌl̘1 ÅÞÞ~Ò¤IµµµS§N _±b{Ë ‰D³§~V΂ ð |–––&&&xÒÝîîî#GŽØÙÙýðà .Äó€bT*7 ¥¤¤ØÚÚþøãéééø¥øøø™3gš˜˜Ìœ9söìÙðS¯¯ôôôBêêêþþþK–,™>ÞÀÀÀÂÂ"::ZBBb0ðœc#‘hllܸqcJJJQQNüòË/8É>qN ~Ï]°`ÁóçÏB–––! œœœîîîcÇŽ>}úÝ»wãÆstt$æo§R©)))!ÿ´´´¦¦&ooïåË—#„âãã³²²>|ø    $$”——Ç?s¥ñ6ò@‡ø/ Þµk×Pïn€¾ÿþ{III33³Þ_¡zƒÅb͘1cÕªUÄš/¯>‹-úì-‡þûï¿?~\XXXTTtñâE¾ ù™………´´´……ÅàFŠ,kîܹÞÞÞÄIIÉ϶Y±bÅgo9þ|QQQEEÅ¥K—ètúÍ›7á;pŽXè%ÞFºú/bB5 bý“'Oª««?~Œ_•““›6m™L~úôéË—/¿\’‘‘A¥§§+**ÒéôŠŠ KKK:®¡¡addTSSSXX¨¢¢‚xÊËËïܹCìú»ï¾SWWG¹¹¹555­[·núôé]]] ££££÷ K!ôèÑ#„N—””œ4i±þÁƒÏŸ?¯¨¨À¯*((Ìš5‹L&?|øðÙ³g_®GÉÉÉ!„>¬¤¤tþüù»wïΞ=ûܹs:::fffUUU999cÇŽÅý«nß¾]ZZJìÚÐÐPKK !dooÿéÓ'ÿ9sætvvæääÀw:ÜÁ96ÂA`Xà^ Ãç:1¡BÈÓÓ“h Þ¸qãëׯñrHHˆ˜˜Xvv¶ººº——×W×#„ôôôÜÜÜŽ=Êd2 ýüü455Ï;—žž.''ghhˆ[BþþþoÞ¼!v½hÑ¢;v „”••›ššbccBÚÚÚ±±±pµê+ܽßÃÃ!¸uëV¼~Ù²eÕÕÕxÙÃÃcÔ¨Qýõ—––Ö²eË^¾|ùåz„Ðĉ7nÜH£Ñ˜L¦©©éŽ;–-[¦££“––vøða…I“&áœBhÕªU555Ä®W¬X/XcÆŒùô鮯wß}wäÈøN‡;8ÇF8HôO"BÈÃý?¿`°¶¶vtt´¶¶æuE†ƒÁ(,,<~ü8¯+ÃÛ”)SvïÞ­­­ýÍ-322pgdœÀýÇ[`ÿþýQQQ_&>[zôè‘££ã¦M›ˆ$€……Nwrrújàúõë¸ö$Àüùóq@AAáÏ?ÿd0%%%œÂÜ7àý‰D‚ÔÐ7F Ðú#ð¥üüü>­ÇüýýýýýÙ×xyy±?OG(((øj GŽé¡ü¦€€À‚@ ,t ° 3² ¸qãK @¿FAΰgbb²mÛ6^׆½y󿩍¨ðº`ñ,СÑhׯ_ÏÈÈàU†’’ÒH€€áN$Ðÿ@')))11ÑÒÒ’Åb}üø1((hâĉ½»õÃѰˆúè¬[·îéÓ§xÒÎÎ΀€6x_‘Àम޿/%%ž&&&Ï]§¡¡ľ¾ººZTTÔÈȈX9oÞ00Á`\¾|YAAaPꀡƷ‘À€çÏŸûúúvtt0Œ´´4b}JJб±1>ª¼¼¼ãÇãÙäSSSMMMñúüüüÌÌL¼}RRRrr²¼¼Ø†††üñ^ÎÏÏøð!ñöï¿ÿþŸþ¹téÒ¢E‹«JàþŒôx9ƒÁðõõEuvvêè轊V®\séÒ%‰¤¡¡ˆ×»ººFEE]¸pD"©ªª*++ïÛ·ÏÛÛ¿:{öììììÅ‹ìˆÀ Ã"ÐãåëÖ­ãô*{ÿjv!!!œÞòý÷ß744ô»>à¦a ðѤž'Nœpttäu-ÀC ðE·ßÐÐÐæææ«W¯JIIùøøðº:ડ‹ø"СP(¼®xfè">J] .t ° ЀÀ‚@ ,t °øâñò!’››{ÿþ}^×à#/^¼àu¸J`õë×WVVòºqww×ÓÓãu-¸G`'''^W<}t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ €áæÿÉì)³\´áIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_cleanup.dia0000644€ÿÿÿÿ00010010000001314211727205031023530 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ{•4-û!X¡mR·&ײY±?—,ízdÌšüº4Ùt°ëM¼ûËÐ7 Ô… ;烡²¦LSÐØ¡£"ܶ'jÛŒ~øñEüuvq¹:øu2]ám½±A)b}³ žhá]¡Ì!BÖ“†îyl0à.»pk¡ðñ¾ ÉÅÿ^ËÕÁß/WGvƒ#’™„H sž6BóB‰Fd %ÚŠ˜šøØý9 <ø­ñ¾ü×Áûùøj÷X² %/Eî‰eÆVéÞL )$gDŒ¼iJÔ8«¤d ÀPQЗ&JëÜ¡])Ù×ÙºÔ kFV”éœ ©©'î ‚5;9$"FXKéßÿÞ«8Jv€vgºTÈhÆÎŒ+è£ ›²Ê ‚PAiÃX‘1%µN©2Jªž­ÛvFk~2SÇg}­=.5­kí{9™yÒÑÂõé€ßMÒô‘üÒ)*‡‘ÆoòŸ²6R=LŒv¨¬°Þ¥:%åÏý«f³b)~0p.-µNïB{Ûƒp(Kµ‹ü¢‘PJy (/ÔzO„Q4<¿hT1Y™šƒ–î·`¸RQyÓ­Pš·ò)¡Ýô¨‡eQ])øS«Ù¬/¿Å•jß6/%w´{ù> © =5°”ÙŽRt"$ƒ+ÅÐz­´5[°£ªØ¬C\¸w6”Ù‘†>¤P¡™‹„TV3›óNiêºmôk4Ô‰²³n bXÉg½ÒÊ}“ø#9Œ}È¡F“Z)ƒôÌr¬K”dk8ê\*uÛ1O’ÃJ>jt÷ínäPË>äÐNÈ-à!"’D‚CoðPn +ù¬—C¹‡xv$‡Ý ƒpמ¼t¬^J GA§Ø†!)T–:¤{=S—ÕõLÒB‚‘{ìÁjèÁƒ5u×¥›fx=Xm•X–Vn•€ß#Ù`÷jÙ¬íB¼wÛ¤c†§šÓEÝù€\GoÌ€ª‹œäŒ¯]S¡#Râ6äð ¤ìÚSÞæQãoŸ>}<ü½øZL_cB{ë†ZI| ‰òÙ$jÓƒ…“Ø´ˆš÷ 1Åâ èq•ñ/@‡ü{ù-œj.šü]ëÉO»ÛËôŽLíÎ'ExÛÓKªÅãÍÇCJƤîhd«!nbÑšTÏï­W̲XËhEfn²2¦¥Ê:•‹ 7Rel¼ûìņ-)¶‹f»Ý4ÐÝ'­øu—ž.E²ÍÂ7Ñ:¤>|Þ©!P§Ì²jØ)în@µ\V,¥Žó²cG„\5¼¯UÃõç P 0£@wÚýhÕ1—üa®Kþh:Üj{˜;Eëôñ}\m@‰ê@Œ4ùòÁ›úýŸ'ÓicOÏgÑ¥ø¡{•vz›QÞ3q*ƒ‘OºÓÉÅñ—ùbòÜÒFÓ™û<š.‹dÑV“Óˆôd‹uNìBñcîGÍtvL±²°1[b[³Ä61›bœÀa:gâH^Øx£~øpé_ûÒj¡ÄÜia"3~ô„&ËÓ9‚ÇLJͪà£sê·òqRÃæ¼P¢ žHI£`H^Oª£ÔfÉ:¨©6›¸ršŠ‰ÎXc|†s~šÁ;ŠlYíµQ.¶žøJ]¹Ïé‘]¹×ãÊ=ލÝ;J€p3†·–u4‚2P£{ê‚å¬,ÏÇhN íÈ]FÐŒ A_H0¬&=ÁtN›µÂʸ>¸oVÓH-:¶”ÒdRSRC‡ )A;Ó¨–ÏŽ"R‚BÎOx]ù ®CWs8ºš¸:)ÐT@ÜY"Lß g‹Ñ ýö D0=Œ.Çô€PÌuL J ) “ÂÉä¤*Ûé °É4áîL6;n >D¯ÖÒzZçå5›YÚ±Wjazf ëù¨O‚VÛCŸUP^4Ì}VÄ4Bý¬²Ïª³*A+hÖLŽ^˜ÌК¡5CëëÖîsö®ËCРSm«Ä›X)SM!¥¡¥ñz’ä”±Ž5"Ø“Z3´fh}!qÁÿž"õeehÐ÷ЯÒF :f+"oÇJk%c‘Ò¤°VEjÂMÛ"ĆÖjL6T'¢Œ–ÎY Zi¥œêi|”W!¶¥LfxóŽ7SDî!Pñ™ž[·ºwš»®DKA ÈÛ•>wéŠC>Àu¤+²Fºú`2Û ÙfÈ6Ã>Û MJ•L÷ž‰×t†õìÀ¢VR¢Í”ªSÓkDT­xK•za2—*åR¥Œ¨/;;Ãv®8ˆÔVC§T„FpRï×”›¡µR  åfhÃ=r¾ŽËÎp¥Ö>çf¼ªÜ ºôް»é c»7^µåÜ„N#TšÅa’ ©ñª³a 'Uš*c,ÿT™:>+{˜ýXÚzb 43Ðd½ûÐ|{zË,Ûåj´X=iºóµ·j·‰ök=aô€Žšû¥–òŠ+À‚¥Þ€Ö$¬Peå|àÇŠj>«û:C½ÁH•¡"CÅ‹€ ÝT¬÷Pî©S0Ñ‘æ D fXši|¾ÜRT²YÙîÔPTžæ @[s'CE†Šg¦¨€my àe9 GÑH&)¬²É õ°šy „A•³p¬ÉP‘¡âE@…Ý/¨ˆ.¦ém^•VXSZÚ<+¨ÐQ–cåd6+2V¼¬p}6ùƒѸ4ÉÓëdV(uŠ·× z Ê9¨m³‚2Pd xf@áû ØZ¨"õ. ¨ˆA é$D9 ÊV€š…*h–v P7U¶)2T¼ ¨{vÓèAb$¨° ËP{;‹§œDa¢Tô9Mô)2Rì):ò 6àRì—øã".ØǺ\|‚%h›­Ú —‹(éèsÄ|0›ée˜0®sÒ§òBê²È×°ÿSNÄ RÄ4g‡D8úT¥ØS8jج^i|rÂBô{3ñý:mQA‡–R›;žë{Ç«¯ u}d.†hiΩ² ï¦|š¨ªÀAÊ\THq`èðx+Hû`²I9õS©•J°‚¨YëëZÆNæ‹q±`Ø=ûà tŽ>ÍêELò¼ð¬ˆ’ÿç žcIÙµ§¼ÍÑÿMVyÂ8CÛÿZÌzóéUy×=ïΠCÝ€´Ùðz‚ZPzà„5š"TIF…—4­)_à½9~ܸ«c²r©l¾Ôàö‡ ù¶çèÏ£NÇml~‘½Nç©{Ô˜îégQx¥ ~íÆËÀjFF0ˆD RJ?óÑ£l¢"YV…©ã±r©k¾4F§ñó[Z·9Í*³m•±=ôî‰Ê“h½áÝde7 6@›Œö*eZè¶„ªLÕKƒii¼k0U,õ^Z*eÛ HV™­«Lçl$ÊÔˆýdd ƒÅ»Ë8Š|'sƤl¤ ¤%‘£.Aœ:SËduÚbó¥¸]&|.ëÌ3Ò™º@HI9(n@Õû Yõ=ýB  ¸ÖDÛ „üöéÓǃëA‰®N§E‹p„Eê$2‡Ez’÷óïUHÒ9gÇQÒkŒÔv@Ь“™eŒkJÊëÔ=õ9ÁØyÖi^½0Ùä˜À£Ýêøh,Héœ~]çÝZYŽOéù,Ú8õ£œ±åT–ŒUÜt «YLÊ)×”¨ö”ÓU„wÑ3+gw&³r2+g8-NLÜGå¬1Â}÷\²xŒ(ª“¬É"?(i@JÃ( Òk¶=åmá‡n²,~/¾ÓlƒsØàuùlp¹{¼ITcßÀŒàÄ’†Ö! ­ðüQãã|¹ú£×Þûî1#l‚Æ›÷óéø G…fÌ`Å è3ŒG Ý Öä¾k2VXGC"=$šmO‚· Ÿ£Ù2ƒ'hTH`Æ VÜÐ=à†Cï—úÊhf‹#QòÂ9¤”ÚÄ—”c{ÊÛ¿.>Íÿ±š/FgEÆN©–È %¬PÒÇ´jk©c8^A*”w5'b"Ü<¢çR,>ŽËb‘у=î aFVä°}!ø¥wÄÃ¥&ò0B'‚{öøåô´XfÇ…×àØ”¾Œ¬ˆáz²5 {´ƒ¨èì0£ÔÚ=ˆuür¹úRÌ2fp›&Ç:¶¾3ƒ²á¹ýGÙ·äŸhA9n/ü‚ŒÿdÄ`µ26…/+`„ÃSÎX^Àð”í”ÎSRŠU°{pš‚WËhÁ‰÷$/£+ZÄ^¢4Œ– {$·A”¨R5È1ÁUB¶¦¼Môøuòýò"ÃoH£J3†pbHèžD ɯDàW62"H†lëlþ ZÓÜ&v| ìàŒœ‰£ÕBø°ž/v¨°C‡„ùš<™ÉúpküXÓ{ ¿ÏÏ2xp‚G¥fôàluúh¦M©’Û(ÖÎ>T3î QR2RƒH©¬¡s|©ù{VóY¹ÔQyéežìÀÐùytšØhO,½ÓÄS)ö„Ý;æ¡Q¼']•`€%L4¾T¾²¬V1Й›Fëƒ%êø¬D‰àSoe uÈ ±3è2ÎMµ;Í­å–Æ9Ó$9iÓðÉžÙpq>Ù)>š„HN‡ÔÉ œ~Dªf³r)Í—I}Ó|ÈÃë2$í'$éA’í’¼öe²o_rD¤4LÓïƒ#Hò^¥–ÖóCR%›ÕˆdMÙŠRZȈ”i/Éì‘\ˆT(›®vÉû²lŠí«Uêæýl¤J.«I†t&µ22 í% Ù’ï¬ó)ñÍ8ÏH².$BZ%DrRÓé¦QmŸHÕ\V‡‘lùÁdÌ&RF¤=E$·#D }8mÆ'´Þò’¶±$d”ON[ŽÎÓ­òq N[›•ˆd-Eà£PÆe)#Ò~"’ß"ÅIz[Nðãx!I:";£MšÙ(•Jù£f¡íj>«Ç­ÑˆZjtȘ”1i/1Ií“b/‘ƒM¤‹šw榕tŠ…”ŒÔ4jB§0H½¨·0¹’ÏŠ¥NDéSš´9 cÒžbtŤòõttU,~>(_àŸ³Åèüçƒÿ‘9äÆummod_perl-2.0.9/docs/user/handlers/http_cycle_cleanup.gif0000644€ÿÿÿÿ00010010000013344411727205031023550 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§g­6¥¥¥£££„ßEŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywww[™0uuusssqqqX“-wÉ>ooommmkkkiiigggeeecccaaa___]]][[[YYYWWW  SSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEööö/OCCCôôôòòò???ððð===îîîììì999êêê777èèè555æææ333äää111âââààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄ1RÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª:a¨¨¨¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzz2xxxLq>>ïïï<<<ííí:::ëëëéééççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&××× $$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠYZ©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Sœ[éšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=rŠ"ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî—iíAFÌ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("5ƒPX^gÄD ÆDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbJL¦þ¦Ä Ì©´Öjë­™¦š£}*†"µÀÃ*³à‹’ˆÙJ ]Àð†˜1à*í´ÔVK§®Ã­ŠÙ§„D;dJàYKãŽé­µè¦«îºRbû¯Š}CE@d%µÄPƒ%D®À„,1£H¿ÿ<ðf¨"ƒ ·´:¤$1È"Ã,´ ÙB1d, ‘§ÈŠ$¾úò;¤¿ üd¹E&¼pÃC²ðÅ -‡³*3ìð粫óÎ<[ë®gð&ö© IJò‘P@dúˆQ.E2í4ÔC¦²‘",D¾‘‘(™óÃG™ôÒM?}ò‘Vc}0,u )ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§3$¶5yn΋YEÆÓÂ5âF†¶’zž8Ί¯=ä³b<¹äCþÁÊ*â8ä1޹߰Ç.û¡?w4bòΤ毋Áxï³"y‹’‡ç}$ïœ'ß$Ê0 ¼ðmœ3<‘Ï#©÷ìØg¯=›µsvûaŸÒƒK:rÿàŽ“€Bä'J+ÿ»ò©h‚ä&›G&Dæ@F’z§¿~û¾ë“Pæ­ø%)"ø#Šd@þmïŒà–º·™ïÆWÈW b"YÂ1¨…ÈÄð l\@ ÀF+†T¦p…bn! W€@DÅ bðŠ”ƒHþÀ Z€ y É1ÀFÆNçAŠH-D¡ ™´,Œe,x2¤¡ qH¤¡r3¬á ˜Ä%JðŒhL#’(ˆ ÆWjŒ£çHÇEñ H7«£÷ÈG ²ñ2n$ ûHÈBrg´L 3ÈC:ò‘÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡hÖ9ªvFæ~‰'¥æÑŽzô£ ©HGJÒ’šô¤ è0—­>m+¡â(JgJÓšÚô¦8Í©NEªRv²ô]‚³ŒF'%Óõ¨HMªR—ÊT€ö´¢?ZP+3TIµ©XͪV·ÊÕ®ô©¢²(d0Ú—ªFêª^M«Z×ÊÖ¶ò”¢aªí¦J³* ­nõg&X‘ƒ¼úõ¯€Õ*XC%ÖÇ•/vM^‹ÑkŒ °†ê¹V°Â–ýe-‹YVh¶#À¬ Z¡ŠeøÓ—]E4>ÊŠÀºöµ°µþé`AUXÇv/‰EÔb‹á{ö¶ž®¨ço\Þ ×·öLÇ ú[ÖÆö¹ÐnDgû·;z ¦ Úms›û‰ããõì®q¿‹\{Æ‚¹ù\‚XÀ ž#ÐÆdAÛ…ùª—½îÅgk¥Ëßþúשp%¬\½G×ÉäöP»ýe=›ÏæâÓÁÞ-†"^|z öÄ>ê‰-Ô3)°ç…3¼a{î÷¿(N±©ëªW°À’9°¡´[Þ{B¸ÆöT° VPˆ€6wµÅ`Æ‚Yá JÔÓ ¤¨'Ð`O!/¸È÷<±Š§LeײøRµmÌmñ"ãBÑ8Â8¶qƒ ÚÜUÔ³¯ûŒEþ–ƒ{¢yŸR®²œç¬Ö+[*ËŠÙò]ºL¨/WÌú¼ñÿÙÜýrûÜ&&ˆ{šŸq¦³¤'ÍT;W ωѳ]ø<¨ÅŠÀ±µ† ÄPÏ9\–µ§©1›jÐbvÏ(j;Ë×z"á±PÁ),±Ž{æbø¼u®wÝëbœ€U°l’)ÍìfëÔÒ”Â4b4]N j·Îζ¶·PhOJÚ‡¡6]¬(ls{ÒÊȃ(‘pÀÀ7pîzÛÓÛ’·aÄ=rÊÜöVq9*‹3ø 1`…2 À æ¨2Hz§uȸÆ7ÎñŽ{üã ¹ÈþGNò’›üäÇB>ñ)}sÆ‘ñwžðþZ¡Ð0‡ ð ® c`‚VQl®šáJHºÒ—Îô¦;ýéPºÔ§Nõª[ýêKoÇ{ñÉrNº¸0·v3EóšC× §°Ã-öÀ‹±Dãæð<Œ.,ØýîxÏ»Þ÷Î÷¾ûýàOx¼ cë÷ìz¢\N~ËEæx*»Ù_‹IÀÑ@‹"†Ä:«f¨{áGOúÒ›þô§?üÊLÛ¯2ìj;¦$?yÀjÁ Ðà[€  uüô¢G½ð‡Oüâ^õ\g}u9åÒÁÉþR´¯}^ËŽ´Ý-yˆÇ°þzã{ÿûàO=âï­ü[—U¦Š¾ôÙª†x4@.\Çö™ÚýðÛÿþøÏ;ò_~,»^‘°÷(Ï—Lô´~Ð ]@tñ n ô|ùH|ûG~+u~/•~h€±… ª`ð`Ù°Tõ7&x‚£Wõ¤xˆÂxƒáxqyw¢~ÈU¿9à#ð $(„B¸w*X ,H;ÿGIØ+(OXƒ¥P6@ 0@ ·à„€§`HФ–T%8„fh†Ex„†â‚‚ƒp!ƒvBƒPˆUbà:PU`+p«° JU†gxz˜þP…8xiØw–„ž´„ñÒ„õ„s˜W–ð V  ©@ºðb@€ 'Ðë@•p¸p¢P'‹0yàƒ„X ¡?ЦGï`x7qÄ ˆÂ‡;ˆÄ(ƈŒgŒÂxwẋGx‰€åXD ºà ø Hp8 ‰UqXñ‡VQ óp‹z7 À3v ¦÷‰ˆwðP ²ð[@|úXýø9…X†7~+舗‰Å$‰BC‰De‰ÚÈV;W¡ ã `)@½0)€ §°V¡ŽWÁŽVÁ¬@þ’ð ÀŠP… ú°ô sÀÑSdð ^ ×`ѰfÊEˆvÇh€ZäYðx§a€ˆi v× !©`wô€™ì`wŒ ~иw—Æð^™w§¦@û°¸°mù–q9—XP—w™—ww \ ip@‡è–X°Œûè˜x©—w'–di–X€–¡–XP>…Η™WEÀ‘V¡ ™0 Q  «@¢àTá’SÁ’Vá›Tá%ùpxíàêg aðÚÔ RÀ Р{þǦ 〳ÆàW`wƒNà¶@Æ`w–Ð0 +À À–nÉÈð^€ WÀžñpá`w§PEàØÛ`w1 žä)Š˜˜úÉŸþ  J vç °  ʨ™Ž ŸuðŸj Z XžëÙžï‰ñ9ŸõyŸª U¬)TiUùš^vW®0+›Sá×';˜ŽX×GH`vn@ ³0¶`¿¶À E@ Æ Nà ÐPÖ°Ýðc@i nÐñ€÷ˆHp°ôX~PX‚à v— þÆàÙ€ˆB6‹@wÇx×–1p–ï°˜šð w×"À ·s€u ,`wZ ˆ9”j©˜ºšÊ©sÀ1`w\àš©o‰Ù —š©›jw‰º¨ú¨ûHi„méN‰;;zV=ê£[eù ³0¤0šP¤S±¯@¤"@ $p º@ ' ±è x $ –к€J°íWðy•ʰ Q Vp Ùàß@f€éðîPw` pz ~ðÂØðwW ðv×õ ûÆ ø)Ö‹û`/`þwp§Šúpw’°ª&‹²v·²Ѳ ý±¹ª™¼šˆà^à~àÎßRpØËúmÍzQÏ >fíeh-Þ…P¶pTéÐ ÿdñ `RÛ€u&~â(žâ*¾âI·B ÂDÝšFmá(¥Ûñ`GU=öO‘p€ã4NSˆM(Š ŒíŽM'äÅ!~ÞG%ßPõM L>SC>(EþGÞI>'K~åu˜;ÐVÛp‚Ñb^RY.([î]Î_.'a¾æÿ´¸~0åG…þcP9ý•mç Õæòæ}çk1çqR炾OÉ ¶ô|TŽp u b‹ R„(†Îˆ®Š'ŒžéøtPÊTŠPE`ÖMêµéyÒé¥á4á}Vá²þá¿ÜÚ5°ÐëÓÕàùöàc…ëo¤ëÆëÄÎO*ÀÊKe©NPßàû°×ÏÞP´Ž'¶ŽŸž¡þ&£.ëdÀ‚ÀJ•÷pÕÕPæÛžRÆÞrÈnXÊ.HÌ~mÎ>ï÷4`åJ5 ý^OZÂ%æQ×à ßðÿðñ?ñ_ññŸññmðâ•ãT;ãþNPëþû€a¯% …í 0ó2?ó4_ó6ó8Ÿó:¿ó<ßó>/óÝÀàÝÝRÛL*åžé€ÌL%*}PS0…a ÝVÿw³Í¬µ{á=òþüÀ¶T00 å S_õWßöz—õ¾õØõ^ÏO‡©MU s‡PQðËRßQTïö‚¿Ýü7ô@õÝ—L÷uŸOéö#]'M øƒ/øpìrÏ„Š¿ø÷$àƒL5„°PÑâöøl_ùmùöžù“¸ùœ_ `€íM¿Tú`‹ u ÝEùªõ¬ïu®_‘°Ïù« áXå–ÀPZÀüþPÃåû¿¯ÝÁ¿x÷n[ùÎHû^nOìÑP¥ÏÝ_°Ãý©?ýÙ]ý-xýZ–ý–´ýÿÖý½Ž ÒŽU0ö ug\ æþV¯þ!Fà@‚ D˜P¡@bƒt=„QâDŠ-^Ĉ€V=~’X„…%MžD¹pÂb-]¾„SæLš5mÞÄ™SçNž=_&‘O¢E‹}9g&0ž”ÆDËTªT!mĺ±NU®]½~VìX²eÍ~f f—)ݾ…[°aHºuíRÜØñî^¾GÆØäʧ… Fœxg"àŽ)† #ÉaBÎ$CìÕZ?Ìþð¼õìhÒ¥MŸ›vm[Á­]3tØWöìˆyiߦû÷õîÀ„!ÿ\8Í". GÞÉŠ2Kýz•Þu¨ÃÃ’eãg~˜¤Ã’ÀØ;@YM-@ؼ}ÎúUÕ€42PßÇOZ5L¶¼ý¿ 7í²m@+Òí?c)9„P§s¨'š}’'€Ä, Ÿ8&‰d–P¦‰&–‰°¡cêêàp°¨Ä3Aô¨…œF°8¥ž"\À&žm°€}vy6²™jœpÁ:ŒÉ¯J+ÁÚï¥þä2¡ó¢à 3Á.Ï$È· ×dóAˆ¥Í< þ!±hð žwèˆÇŽyð¨G{øà#?ö„A²bt#uÆz‘«« ª>D`åæÀ‚º¦¢ º©€V&X„+We5K—¶D3Ö/ɤ¢1kÐÌXÏTSN_5l‰wªö¦úP †F—]V~ÙÇ|½çžGÅŠ´ª«òàŠ‚ù°Ú*[é¨j¡žöUu«tµ%XwírV\ɼuÞÛt…wÁ^‹å·_œ@ !ì€w° "š)ž‰¢™'–1Q™%’Iâ$jÒ [Qµ€®Ü¸BŸm2UÜŽ§Â“lðiä@ÐX7æÓÚ-æÝ|”×ÞëÕY6|oþöo߇&š& &$\¹81Cðt®°Œ¿*‡„˜ªLñL†R sÄyÅse¤8ñD˜ÊŒiAqèøFf½G£Ùf y˹gy|¯Ÿÿ~Mè¤ÿ5~øx†ñ–À@2-ÞüÁ°©½JĬTœJœ¬ü0`*CºàG-6Ú"(ALéCÆ@Ugæ)"½w/«oÖ÷/ðÂi#|øº^0Å%g>BQ¨¥ùk&ùm?ÙFjèxç¾û™Õâï÷ä_Þø¾Š7$äÇkùæß‰0Ðþļy¥˜ÐD{ïÿ`ïÀ§%ñ±O0åKß]þЗÀŒ¬Ï€nqŸý$˜}Xæ1Ì‹D‰[ð†ÿ8BVÅwt H—®Ð"DáI"8A>Å@ÅûŠ@Å4aÅX‡§l®„GôÞ cºð#-t¢_H²ÄÞ4¨†W<ÌÚv¼ÕHLÓŠá. `4Š‘¸Æ½)‘Špib5Â9ªoŠo„Ë ±¸Çœ„|4Ê2³¬]©6²Úæ=`‰‰Ào[b…Hã[ó˜Å ~ñ– ¹Ü1(GM0O ò³Âf\®g¹kóõºg¿f_°±ý}”ä`E Ôûnþ`’ ÔÛ ÓÈ7y.ô½o~÷ÛßÿxÀ>p‚ÜàGx¿­¬mLrÛxÞÖ¸Ç'îq+¥ †p‰7‚\4bnc„ä²1Ã(‚8QÄ·ºØr€‚/‡yÌe>sš×Üæ7ÇyÎu¾sž÷æ‚°P_‹ÏØhó‰Ù4º‡žÉ^VXH˜@£„h ÜÞÀ9!¢àrTê¡_' ?‚ÎðG:|x·—Ä“Gq§?EnX…$zpä€q 8bâ€Æ›LÙc¹×Á>ø¯ˆ]®K/jÑ“>G½,>"jÛÛn%lÄÙÅx‚b¡Æ}`lòL¸.x—þž*†' âïøŒ }^Gœä'ï“eäl°²•Ö„k ؉&ð‚Ñ›ÞøUA},U/Yų/Hw>ìÿ&ûÙó¤!¾„™ JœäÚ(þñŸüz.6ÎôY/} Q¿ú:Q0î4$¼£ª†™Æýs²„z‚ï:é:ñ¿±ªèj>ô« õs<ö»÷{?œ0ȇe°ŸoH9)àã‰@Ó#?¡3?³+×ÃÌ|ÀšH>P ò†Ãh¨Ù R€Û@ÒëÀ‡ú@²Ã#¬„LÁ™p‡/ûÑ=£è‚7è‰Êp‚À ‹  ,¸þruÈ›³¸ŠFÁÁª )@”-‡k˜ Bx3¿,Àø:@| ¤!Ü",˜°„ "ûy…G8ŒÈé‰hxýË ü e„=À‚E؈0C.„Ï¡:P‡†ØÂl1>64?ØzC8”C2¡ÃX±Ã;| £ *î3ŠÞ# íX¨0D¯ €,È­ñ(óÀ‚ÕdàƒwP3”޹,Ð ‡òxª@´˜Š[Ð&i7¬„T˜Šf|Æ,ˆÆ©ÐŽ£éŽïèEò0ªmØt¨(MñD©¸_˜‡!)‚,8ÌLp·À”‡ªÀµQ,—ª@Ñ‘•/Ào˜ŠýÙþŠ0ø‚-Ì­T=Ù´—Í•D¼-Â]l º¢pWä )€]¸ p„D }€‡s+пZìŠP-GÊ«!±!³´±Ë}¨…«)P,¨Ôš©ØÅ"x…*R˜Š2 ƒÀ…{ƒG¬ %x…h‡ÔI­Ô¸é𝠛±)›³„¦ŒfàÅP!‡xc ƒtÑJØÔG8|¾Æ‹>/]:0MA“7 bK¥8†+P£x“O ÅºÁ‚œÓIaÜ»´w°à‚©èœÏ¡ . 2Èl°ªÈ+È?À`ð:pƒ}èW¸IsEWuþ¥ŠiÝÒ1ÔQÖÁ‚ è‚} ¦ H †|¸‡/°nÙÕÍÒu>.åb}?,È“%”mx7_¾ÄÍšÐSü˜Ïã#™sP,E<-ŒÅ Õ—“ÍMÈ €¹™ cЃ %Š8¬¢È…Îh½ øÈ°ÏÒ«ƒXÀfX˜]:™Åš½a:Ž­¾ÄšP÷ƒ60 ˆs¡ˆ¼pØ~È㛀ùÐ_hƒªåUõÕ‰ÐZÚ°YñÚÙs›˜ *X¶§X†\(ŒµÍA³ڡÃÚZÙÛÙèÛÿøÛÉcŽ=´ŸM0H_‰+(†zÈ›HÙþÆ•§Ç}­È¥•Éõ®}­ËuºfH¶f• Pܧ°„då v ‡Çˆº$+ĺ4ÝVB]ÌÛ[RÀūܠÁÙœu4  [:À‚¢ˆ‚úÒq Þá»âuÃãM@`]?×,Ø­¸HXÅèkø¼°h‰`V°†ùÍœb_úµß–úUVP ä z(ŒgðÈAàƒ2‰Òå^WòÞ ³XÖcݾX^Þ0ßq[í p n Wh aÝþ`—H‡à -€_1€Ïs‰ Pƒí}`‡Šà›`Ç«`¾¸àÝÈ`l+Cèàn h=ábø€#Fa%6þâ–ˆ“xƒ(ŒWÐݨ…x‰«‘A›pà^¤Ö²^¼6ò« ¶ÎB$žøùe…û} Ž :~b ˆ„ ±‚x Ý!DTQ°a0Ž&1Î32N:3¾‹NœæuÞ ‚ÛÙš c;nâ:މ7V(„žhƒ­SŠfX„U²²G(D`H¸UfåVvåW~e £Ø˜Ed£Sd»`d×PcR« )âK~b˜°ä$& !(9©‚~€‰e !œH€G€æh–æi¦æj¶ækÆælÖæmæænöæi^¸6”`ðÅ&ñ]@4&ª]Î4ô¥Ÿ¨dL–‰aæ€2x fþH[Ÿ˜h°²fPà´|dààÁ7R]zIÞ¤ËåÖPç@C%§à `ßbp_hã9Ð_n ‹®_Œî_VX@Œ5èªÄX§¸ hg&ç8`"–‰<œç«~Š¡^¢¢“®‰¯ö§˜–k–:Z÷êïR ¤šx@ìÄVìÅfìÆvìdžìÈ–ìɦìʶlÆçجe}jimzé*êëþÂ0„¡!Úž(0Ÿ€„Å 38·›@<؅٦íÚ¶íÛÆíÜÖíÝæíÞöíßîà®mYN½^]i¼¶£Oƒ°î±<Ì :†z墘‚¢°†? ‰dð~8í—€'B^#Cæ´Í®¨Î¾¦Ï æ–± ΄ І]P ,ˆ¾ $ðÚ`؆oFo]#ï£2o[BïöáëI÷ú»û›ÈD ¦‰ïîïúïm p»ðJ*ð<:p¯‰ÕÑ\ø‘“†&`¦‰Bë çï ï»­Ø­Fîèð·Po CÙ©n ‚JPŠÀò‰~(lš ™°• ‡þñºð†ËpÊÚð\ÒëŒúp— -€v ¡I£hƒ1(Šf¸‰€˜Vò%ÿŸ&/»'—­(ç§)_ª*·r˜ð>íu®@H}în˜ °ó™8s4ï5ïA6Ÿ.7¿(8×+9Ÿs—`DÜ*˜_WP…=w|‰g8¹ É€(¶ ,×òýô0–qZ¦qDO*EÇ,FoôbÀ • Vp‰8_f{ðe¢H‚ù³ ˜E›@ºsu6"t‚6ôùBu¼RuÛbõFo«Ž Yw‰Vh‰%ð`€¥Gp  0æbÌÙpp Êöm =XX°PTþ¨ßù]ðb`‡ã(ŠˆBáÈoQ÷L˜áíïc'êd¿°e·¬f¿®gŸó]hŽXo‰$ÀIh O—À&c p Èu:¦öbÀxg2[@H$ݸ6Š>HBžpXĉâà!b‹G˜/xÛÔÀ‡ Ä³ðW=øºõÀR¿Z„¿1…§-†¿/‡·r5Í™ÈV€…0X©b08v /Oo Ľä‘ßúI÷úA°X Cp§a~€Ô~&h‡Ì Hø¯¨  €¦€• z³˜¦˜°%èD¤‡\¥ç2¦¯.§ß0¨q6/øb؃àþt‡ € +y—ðü˜8/xAæ–è²% ,@Ÿ°‚Ö‰€%¶ùè8$Ý}y¤G{¤ ñ@G`dFS ‡}Ø‚ÓÄ߯Ç{ÌŽí(Gð°L, ˜þ_¤Šqäïþø˜úˆÇylþì‡~î7ÐâÆÛã†üú’ü£üÐ^‚g9Ë—ùtÈób༉Fðúb¨„Þˆb0г‹`12°É+†µŽ1,v*YÅŒ68¸ñ#ȨsÅ™hÒ¨]É‚- ,2gÒ„@ÆŠ?ÐÃAжâ 'óT½".°ÅÛ&3c.®PçgСEeVÚþ)HO-rd>°ŠÅ” qX*eêKW_ÃŽÀ‰P:Æ|JÔ(\¯`ÅÒ,lø0?Š »ãø1äÈ’'S®lùrebƒtqîìù3èТG“.]ºj+ÓªW³nM,æØ²gÓ–<áFÈܺwóîíû7ðà` Ó8¢Š .'i(†äB,§,­C(AÖª‰\ |cª"ª¨8‡.:A#²»ÇÐЬU¨4d ΰ¡ßZZø6Põ?€ºqØL6ØS7ïä´B|2S"°r s`Q‡ ,Ȥ…0V%¸`ƒÊd4uVÖ 5øQ„RhሔH"0ÃÊþ‹‚Ň9…X Œ&8$bŠ!ÄXmI*¹¤šµö$”Q††š”UZÚkLj¹¥e·Ù÷%˜aŠ9æny ™ q—¦FuÀ¦nž¬ÉÛ”±GôÜ!<îÄñÆ:ŒA¤M=aQ(ûÀ 2Q€&:€>3Ib•¢6c†•€?˜á(¤ÿ y(ÖB=UíB¢‹nŠªªDÚ:Sb!É%¯¼:y%°ÁzF¥°Åº[¯Éjé%œÍ:ûlš‰àK³s>ëI*ö#pT„ãÛ$„F„òcOa|ñÍan\¡Ï6˜ÌUê²{¢'šE“»ðÊ{jþ¿3áƒI6ø4ò ä®K`Á·Úšëb){qm¿»1”Ärü1–Èböa‘oI·?€è¼¹D¦@ Ìá .„391¼` °baŽ8¯øÒª,`A ¾´€LU0´@ÓOG-“);á” 2I€ô,"h1ÕVc­uÚ7­À6ÚQµ ‹8t|ôÓPK÷ÚmK<$ÅGZL2ä”i 2å£y\9åYF¾¹m¸©ü9è)ƒ)¡›¾‘ìüK¾yÑŒÔt¹C†QÕ@ÊG?‡R“Ï=_Ø¢ª!]ð£ÇUmÅ7-°ÁþÏ=Éó³ $¿?¼Lâè‡2ñ_;bÌTüñɰ¼öÿqï¨:ŠÎSD #Z/¼ªéWµþâ6NЮœû?9æÈ™Ë pcšóŸÿLvº208.%ø¥W tÇxÇ6|óRXîøHÐò'Â’°„&<¡ÄöWŒþ!0r,`åCa°…‘S s¨CìŠØ¡o¸àûBÀiÂoŠ0"àM´C!£(Å)šP…,´áÈ^8ÃÉp‹Wª!G†C ’Q‚LÀʸ›jLÂ>(øÀoúa[À ¬ó¨Ç=FÑŠ #Æ´èEcuqR# •5F52þt_€ ­)(§7b€yó °˜¸#C)ÊQɉÌâf ²BªòIˆ<%¯)ÉY>ë°-7;€®é d@Oà $%2“ÉGSÂRY‚lå•X ÍÕ¼²™Ëò\.³Ù¬dFÒ&A„A€à8@)«Æ·Š1Äâ˜Ê|'•6Heªi–Š×Î8µ®]ŠêT»ÿôÀ7o+AÄ Œ¯§¸T²ozi¡$¡ÙÍr¶³žý,hC+ÚÑ’¶´¦=-j9+ˆo®ð~Í]÷j¹ÊV5}}ídP*XÁ–…¾aEÉbàÂÕaÇl€D°B,h…+‚X†,Á,` °‘pô!8*Ðnoj!†ÞÐÃiôð.좽î}/|ã+ßùÒ·¾ö½/~ó«ßýÆ·‚þÃmÆìYÛÖèU¶·0dt»Û©^+ð 62þDS "H)ÔBºñ‚ |ÀÉ¿»!ƒ”Ñ%, #ù€Š,c\Á–‰í€?Sà½ØÆbPðŒ * Òù†Â…Š¡S ¤e 1q1¦‹±¢Ê®ÐpEfQI×-#g$æÍ^ÀÚbÄ­A>s}<ç¸3;Ækm ä3ƒSžüm56R ÉrÀ¼ÈG¤L™†äz(«oRàÞ@LDÑìZ5¯YÀmÎ+m/2JcfΑΥ,ßl#eÍ.pI˜! ‰·2x¸" þ I2S8t7ƒX,oÚàäŒ@½þônÓÌéǰùÒofjœìidK2XÄoÐàV¬  EÈ6²ŠT€¬@E%b|VT¡Ê¥#Ès¢3ê0Pè -Œ¨‘# Ô^°²—Ý$Kkz¶"-¸g¢ àiÿ[@š0ìg=€Ö <üÜ›ï¦ ÁÕHƒÐpÁ|ÙÍn󳓪pÜ2|ä@yŽS>Ò•¿¶åDÏ!Uâ0¦—mÑ8;ìøL„˜7J¯n´ðŽkäØÈ3 öµ³½ínþ;Üã.÷¹Ó½îv¿;ÞÝÞh£SéVúG™îW§?½à€{ ¯›d(#»ùƒ*@¢Šz ü½<æ3¯ùÍs~µºš´Àã÷Ú^Ÿ‚¯+áºØÍœVèÆ}ƒˆt4pt x¢\sOº†~àÇôÁ¯‹Ó?5õªÝ<ðŒ€â#IöMd¶$¨àâi¤A¢  ÷ºÿ>)yúÑ˶ô÷$¾QüÏñ?g3"`ýd¢¹4xÓt¨$•@ti„Eî‘ø ùí•ùMú™”ú­Ê4ä‚ÍuÜä†MÄ€÷ NÑšÁ ß°þd 6 G=`>K4@<” ÂoT¸5ËüeD#@ tàö <±ß©YâÕB ö“ ®`³dƒ¸dS8^<¼[o`ñ…Ä#´Øn0΄D€GTù ’PÝ’à™ ð!=%¡²‰؉61 |A.¬ŒÃ jÄìaE8AðFbnüŽ¡"j‚Þø!a+±¡5¹á’ ÀhÓ'¨‚ (ä@äd_HìA—›2Ä콬•†á"Î"ã4bïIÆ2•$ª%6“%^¢˜°d6ÁC|-“nă®u\þo(Â*DU)A"Ò¢5âŠ-Þ"däbRí¢!õ",ý"0‚IȈ6!9hAg(6 H,Ã>t]n$9`ÁnØ88^nÐ8C5^£5–aßA" zã ã)‰ã8Ú‡™@8½€$p†¸ÁL_~ì;0oü¤HÃ?ÆáU$ ¤¤ð¤!d")äBÇ4‚S"ü€.Á,Än€=òÆû±‰0¾U,J̸Bòõ€I‚Jú7ŽKn‘KLƤoôCT€SØÁ0¸€oñF=4ÀnDƒ™å ˜¢n¨AK…daXåìƒÌ¨‚9Â;h.ÈþD\Îe]Þ%04øA;à<Є„¤¤ ÌDafb&%M,¥5åG=å EeM%Uò½@ lÙåÆìÃòéÜÂn|C;od¢Ô.ä0184t:,Î ÔCäƒ(Ì„ €R04ÈDp§ŒðEVü…LØ^Ø‚^4ç]äÅ^8&6~ž6n£JþeÂebff¦n ›6]€ôoLo<€¿éFÈQoœÃ¢Ȁ܊èÁ] ÃÈD9ªpîÂ…€§€öƒ8ˆLÔÈäÈŽ`ƒâˆŽXçuþWvŠÞv"\wÐwÚPxŠgHþÀ!T9ŒZo<@â¥I3D#C,C8<#$@@ ì<  ܊H`AVJa©ad €Ì «¸ŠÔ`A’À«P(Qeã…J¦>m¨uh }(ˆ~„!""8±€Nò4Ân@ì†È`o°ÀèƒZÊÄ5€Ã,È;ÔØÅž†¾ÆÁ$ÌÂ4 ü©Â0ŒâX'd"•Þ“•–"–n©FÔHa“BoLA=,Áâ±Á9ìÆ<_Ç•0žÁ›bA*Ü…ÖHÂè½Ð!0¸,@MÛÀª¬Ò*á˜Íáø àÎYðjàì ¢Jiv.ê45*æNßn,NI«oCe¹éPÚÊ÷œ 0CU È‚:‚TA&Èĸ–빦«ïý°ûÀ¼ÀûÄ”&*€+4!kå(+çDj³2ijjÓO¢©<°I2€‚o(BEV–9œ*”ž$±j#¿¶’¿fŽÈ\¨À,Al6Éšøä>üPnLÃìFAoP$ìp˜ê¶Nì"ê+n]¬*e,Èìæt¬Çv)8!jò†TA*†D%t˜nÐ=ôF˜ì7ÄÒ¬îÙìká¬!éìÇðì 1«Ç>K!Ë‚‹þF2üœx‰½¨8L-ÕÊ•ÕúÖþ’Ör ×BŽÏ,!”'8mÙnÀÀ†DiêÆÈcn `a1˜„Û¾íPÅm]Í­Õ­mlvæm³n&8eAì}D¨@DÃ3Ø„ è[Hü6”í6ƒ‘dâ&Î,äö ä>ån‘åËÝ’ŒæJªUþT6!Á<íG|1äƒ6dÁdPH°A9솨G:€6ßì>“^?·Ù?oI@Ç$¤¸3µÁ"Ä3䮑ƒ$oD!äBoŒeFXDØDCKE_íE—_FçØF_ÓL7‹À…Ñ0œ.H$‚y~Äìƒ;‚în4Âg„¼dKO;KMËíM+`NØN3IG/¤:€ß6’ L/HÝÕÚ¼gnˆÉ‚ÄÐT+]Ss‹ —pððߢ_#5T-Uƒ<Ä8¼1HœÂe…D4(cnpªnÀ´‘F¤]Þ½6lǶlÏölW!ÿ<¶F6hôñUvï]ö%žQÍÌ’"|aHH‚ioWŠÉœA[gDÐi]EYžW·u_7æUAr;ްn»™^˜o‡p¿¡À8Í"Xo¸´F,3Ĩun  åÒ5B àël÷mw÷ÿo[ _ûS776oà¤s`%Á*ƒ„tqH€tEþ ‚þö72ý7áö@~w N6'·À•·ÂÄš$%ÂSk>h$H «Æ°Cg+(´n[Âz°‡Çˆg„]ã.^ëbxóŠ/›Š¯à*c3ñvH@ „D8ăýi„ªå†#@†W`wx‹Ò‡0“8x›ø./9§5y‚0™$Eqq˜”C;„9ATƒÔñÀ·a™û7€·–€y7&9œ¹9¥Á9´LV3,uF$ƒ0ðøF(3‡„{±¢ 6¡º\ù«¢;%£C›£«¤¯ß#€Ò6’8ÁÌ„_¦`ÊD”ç<ìƒ3ôÎÄâ}¢ï}ßG‰´×†¾«^;z#µÁåG4ØgX@œiF4C;äAnünÈ9»{aìfoþæ –~O8B˜…%”ÿ,¬+ ªBÄ‚œA6(§_lE¨íÃ.¼:°ÁüC©ïg<@è8`Aƒ&T¸P!­F”8‘"±b0fÔ¸þ‘cGA†9áF1“'Q¦T¹’eK—/aÆ”9“fM“]´±¹“gÌ6}\Ú)öÛ¶•HŠaÙ( Ò.”q&´*Ô®dÁ† ¯_Áb1£a_¾>@Ï«Ú:m¼ý €$¯•ÌÁÒíÝ ¿9|¢6W qÃ&V¼˜qcÇc±²K‘—1gÖ¼‘Ø ŠŸA‡>è¢hÓ§ ZܼšukŒ${Æ–=›vm™J²½»Ø/0Ep©­4¥+­ˆ©hODzF—ÝcÓ Àe;1w¹^éneßt/¼ƒ_ ™}{÷ï%S¶ìš~}Qç×_ôþ~ÿŸU³OÀaãÍÀDðIP¶-؉9\úA‰hZªb ‹ÑB *¡çyê˜Ã8ÞX‡€1»œ1üZáàÊÃ+IºSK°ÆÃb¼0¾ø&1·ÔÛî½#‘D2>•*ÐIúðûOÊÐú›ÒJ„|RËÍ äÐË/Á\©ì “&d[4[r$—Ò¹‚'eÜ)"d 0K' ÁB’/ôÀ‹Âc ¯@‰WvhçZŸ?|à,#'†Œ¡,j |ÄÀ’ŒUÖÇ–L©É-q½,Ê+ymè¡^Õ%Ë\‰õ¨Ë2‘þM–·0EÙÚ@Ä%€qi§\Â¥’À¥…bÚàš–öll ‡¤À‚‡XÄBu™'‹ó¾Á}ºqås1ÅAhjò¹ç [lä×”> gÖ‡!þªV”n-Öbv Vc]ªÜxÊa/¾øØgI.™&a0™%x )K\*d€–ÊÑ#˜¢Á–¦dTXBAü8†\>#.Ú裋žø¤ŠC¶8c{íjÿ@nšØ‘UÎZë“  Ú­OÒd˜àñ¦§Gì`“¥& à “À —ÊEÚî»ñvL雿³ºØ§§¶RêÀó«Úï-±[ñgïšÅ‹ÑçÙþ Ç¥fx …YvCrLÊ)è&:ïÓQ·{ïb˜>|KÀ ÿoðØM3Üu'‡\÷/½@Ý_‚`–Cž–"¡ð¥I0´É˜MJ€JOÝúë^½õÛ„výfÿ4Û¹·/wàÑ70‰}øYbqÜwÉ—áYJ‚––Àc“—’ái”ñ£zØ3àÙ£½¾•¯{žŸ”Â÷À‰®9_ú0X›4àŠÓB;`’gøÏZpÉl±“Hä%#pÈ ˆ@Î, ¬à“¼'AÑDP‡ ¡à WsÁ ±'P>g…IÄ& gHJ¢€’côÏ%ÆþJM@s DÁ@ iÆÚˆÊa?ÃC4&ä‡eÌŒ‰GšäŒ£)Ð’P%/ðÅ Š(À„г†C2741.Ò€dt#”¸ÆÓ¨Q’©¹È#ëG9nò%*ÀÁ‰<¼Ä“k‰QP \˜Ca ]KÔ`Ê ã *†CÞ¦HFîuŽÄ$kÎXI†PR˜iã/GRN.Ó&˜xˆâ~`€—$¡)¡‚ÐRrŠLà@E`ªÁ’"@&ÆS‚âºäå;U7&-™š f1BL|³žÑ$3jE€…` € [Ò<–B*ñÄþÄ£ØD‰,Je¨ärÃKÐàIŒ”¤%5éIQšR•®”¥-uéKaÓ‘ÖBž¶¢g?uI|RDŸÅä'N5òÏ€2³qUˆc "ÐV( $ØÐ”T &‰ ´Jj€ DNÀØdÇTŸvÕtmµ_ýËXG[Yw2âMæ€Ê²äç´IÚ©’Pã»0q”U‚(p𢠑9lËí NÛ³ÕÞ鵘mLn[ßaÒ‚ ð`„ý@½azŶlR ©î¤Ý/Ɇ9€ÌÑsÙƒ Qˆ¤¹’g0€ä%7ùÉQžr•¯œå-wùËas™ŸÃK»i‰3âþo|\|$Á þ%Àº ‚0‚’}£æ)yVÒ„xtX%X0‡z“¡Ð$ô} (@ ‚Ü» Úšvµ¯ímo»:BN±›ã\ :/&Ï¿çs7=芈B}¢Ð`CBÌÀ’E«°`É'üu™˜-&`Ä=Ž!AÔšò+©OúI¨o¹¬/¿ö+"´p¸ï†¼ïûvƒ.p¡ €`á.A–¡NXb:% @VBÌA‹ò!¨€aâ`¢lB®öꤠoq= Pîp!0p°‚kcÅ Ž.鶦 ì@¡*ÏñN¢B ˆ¡ `â€álÆø$Ësp uôø¦sN¿~ ‚pj†ŠÐgcƒÀ` ¬ÀPø` ÏKfA×Tâ "a%àtbb@È ® ‘^¢„¡½bbÈÌÈ0cKþ ëN ×P ÚjÞ°|âP{â úv¤Cº@$L´¡–h–H% ÄN"` á rÀ$æ+&P™Ñ+8ñ =û$i=¦¹çQq'Ã<¶Àø¥$Ñ$vAòRâ\P%¤RÂäa x`èàMX¢ºá_bŽOOn°5ñYgîpN׈7Æo³±&èè˜@<Á!rr´àƱ%áø Á ¢ª Ìq%f`w‬êïfƒŒ #F ù-¯ RcÒu²!g"äš Q΀d! þUBX%fa¼P"ÝP‚O~ÁÔÁ`Þj/RFY2,”Ì!€=áÌ,’í%aòad’ © Cñ&ƒ%'g'yr'¶À!F²L6¡¡fbÌáÿî`nT¢úà r ^‘'`îG+ã\µz€=ˆd.Öã,cÒ Ò?1ói´B.ýF.ç²&’ ØQY’)O Æ ßN¢I%, 1S"Ú¡` Ü@ dãC2£àöA ¼…-vÀ!Þ¢b1|dzÜ œà,S:Ž3#-9³&{È-E4­†4Ks& „lÞà T¢þ¥H%ºÊ0_¢ š€¸(Ž!abcê¡ òA¼š“-¡ÃtV€`:¡bÁ Î ¼ÀAV¸³1¼3Ùr ųWȳiÌók"»æ,R«Ã:°C;àB.¼þt:Åã2½‚ö´`MÙ´úDÔ3ù 4×NE&¶îTeÎåö’åObæÁ*‘À*ÅÀ$mbÌàØbÃ2\aNá6&@ þà  ]ÃE`Ä/f¤Fn$G`G,sS¤ôÀ ¼ÁAT#DÑN%HN¯DU-ÆN[µ%èhÜ¥áîTâu%d?WÂÚáÿvÖ%1ŰOþ$P¥P%Q¥Q "eR*åR2eS:åS° >NV0ÞÀ\]{P]ˆ]­Ä]‹^ãu%6x/YT@ÈÍ– ¶2 eR¶ ~Z è@þfc Úô –1ÎetÔ…]¼â]âe^ÐÃ+ì_ôEaþ%`Ôc:¾Cd±MÕ2ÏFôQöcL Y¶eSbóœAY|AHSbøRb ¡ª– ë$–V×&tS6úgêº&üÓká‰dÐdŧl¥De¯†UÕVYžAòÁWÃD¹ `e¢×N‚Ç^¢ÞJ6.ÀìŠá0fÀp·qwIq­q¿Çqÿrs%m'÷$æEnÃ$ àÓb %’à8ê.‹Á Ú!œ\"ü€>{BŠÀ÷ŠA€ØfâpY·uÁö;Ç6e—jζm÷v‹¡‹F7Læ@%cðÕþé~@%ú€z]bî 6’tM:§zW÷zÅÈuMvi§{÷ƒvq%|o×Qu/L [Tâ ñn&¡ 0·&¢€\%ªAôÀg“AÏé€cG€õƒ€GrÅ·LÚ†Yúq w'–Á 0 fÀ·à ˜@6àt`}õW„G8{KÕT … ç{Ѐ' 考ÊÄG‹!2 % áfW@G‹l@%Ð@º@'¦`¬r&êUÔ³&¬‰iˆ„ r{Q UP…µDŠ'WAÿLª _â ’²úáSâ%¡Á VA3iþ¢ ÜÀQ7àv%éøìx-™¸‰õ8ùøIüXm_«Â„dT$@%àø²Á`%>Sà1 n„i"œÀØ$š€øiûs;ù€>YlC™?Fy¿JwX¸…ÃL¦êì$f« @.¸Œãt rˆwšZaŒ-%mbŽ™•8]ñØÊšù¹ž™@¢Yš¿Dô@ÆåK¦Á*ç MBØà Râ9tƒ£ì h h&¢ d%®#f W¤dê£A:¤Ez¤Eú â¹dçyÏê™´îY@NYm‹ú0A0¡`â`%žÁ `óþÕà B Z PàœENg]"¦g&ºÊíœú©¡:ª×ª Pž—™ W:´ZÚ|òYŸ½d£Áõ$¶á•ç6gôêXÂr‹ jÁ > Pa‚ ØâZBôóŸ½úYܨL˜pœ5¶:“ºz¯¤ª™d @M" S"TS"dl%T rÀ2AFcbë^%­Á°I¦¯qê¯'°Oc°éã¥[6 ð@˜×AöàøÊAw‹d!%P€T‚—O"ÐA&`]BŒò%M·A[YD»ŸH{jL»v ØúT»e¨’C¦á¡_¸Ë$H€y—\â² #/çþ †,&pƒ’“ÛK–»žšjž[4PÛ‚ »½yÙnÔAРRÂ4 &D9 e |O`Wb üÀê¿Ã佑)¾=f¾C£¾[cºã•äf_DÛ$¸š@2* W%È`l¢zàh¢k”‘E‰Â7ÆÂÇ'ºMOÃ[ Ô d¶h˜á ƒN¢°°\%’¡ ò¨&š Ì[L@xi<ÂÃVÕRšÕ²š®0œ5ŽÅäàÌÑ<ÍÕ|ÍÙ¼ÍÝüÍá<Îå|Îé¼ÎÓüxb>‰Cr`©O‚ >aªŒ±~¸%Lm&¼ÁŽl"öèa˹\{¯þºÂ|§Æ<ˆXuB!4}Ó9½Ó=ýÓA=ÔE}ÔI½ÔMýÔQ]ÓG!x‚àE¤ò–Ö“%d8G2&¢€ LŽÅ}7l“p\ct@xœîŽe‚à =Ú¥}Ú©½Ú­ýÚ±=Ûµ}Û¹½Û½ÚM€Õwb!„AT ÀMB b%ÀHÐ% Œš%"ñš j¡'Fnæüýß>à~ààøŠý‘Ž=X’½"–çšýÙ¿=â%~â)¾â'>Ü{7üœ6¬ÿ´7ÆO É$¶Z¢}&4Àz"¦¹ÑNªi¾æmží¡ªþÞX~‚¾ÄÞ≾èþè·ãyâeA€€9%žÁsS"€m· 9&@ ”‹cb ò¯ù±‡t¾Ë©íË­mÒ÷)èñkè‘~îé¾î%^éw‚Ý@Ø{‚Ê·" +‹¡½àÁã‹á'I²éc¢”À~mb Œx'ÜÙìÏ>í!=Ò9Æí} î™KîíþóA?ôÁ]Üy"ö*ÚK\ÀM h¶’ ÅYÎ=%ª¡  AÁe"UàŒì)‘оªQó3¿4B“óOËóEù™Ÿèñ~'<)œ¡Q‚ŠŽ¡jÌ$X!~@áÒRÂ9J%Úàþ &›'–à o}ÿ÷Ã(øyp‰#ýç%¢Ò¹äÒ!¾ùñ?ÿ½ýùm%Ýó@"ž•b±$#HPÂ…‹lcXŒKš6 &´0B½;;z ›Ç‘ Ñ„Á‚2¥Ê•,[º| 3¦Ì™4kÚTÉïÃ.Äøü 4¨Ð¡D‹=Z”Ø ]L›:} 5ªÔ©T«V •Õ­\»z%©Ø±dË pcá‚ —Úº} 7®Ü¹tëÚ½‹7¯Þ½mM„"I2‰ìfød×ÂO*Xn `y< «§ˆ`´v–“|À”çŽ&oš>:µêÕ9wö4 ;¶l¥^kÛ¾«Vþܼ{C+;¸p±hÕ²å‹<¹ò°šP¯ßÑ_A={1Q‚iסŠS Dª¸ld97éÜôYUn v†HÔ€7aéÕüûûÿOSk ñ4\þD›o .è”n >XpN(\q­]†Ñ 'k„Ê!—˜pH<§aŠsM—_1 Y‹Õ¡FGöŒ°Pу9@ä€0#¥"‚.øØ‡2"ôà,¹€RNI%j"D …Zš• „^Úæà—bJ%á–f—օǩȦ]!tÀÍ!rÐÀš!œØfž#þÕâ1íðÆ’ ­€AhpÑ‘< yQQþvÔ„X0ÕÈJ ê ¨@y’L`*VuTIj©§]IP–g®JT—c¾:U˜°ÂZ&«¶e!AêÉ«[ |¨@[ Ð ‡[w¢Ø‡œ‹ìAÐÐI(´ÅMkp Š%4÷œ‰'†‚U‡4ˆh‹-Z'š A’B,d@;í4Þ!˜À8Å3O,)Ø}œÎôi-?0ãš qÄ/¡ZŒª·Þêê¬3%ëÆ_Öz±­¹³k¯¼À´n™€ì±Æv¢kpì%£¬Ä!¡¬ÑÖ!p"Ç!ÜpÓ—‰Ï9{b&n ‡‰£”Ëg‹ =©nE˜<*þ‹&ÅÁA»|ÂÐ1=à7’8†9$!ã‹Ý%LŸÒóuÔ 8è¡zßÀX!ÃÇ;ª\ƒ#ÐøÑ.ðH ¹M[òª{ kǘ?rågŽ\²Éyº<é—”2î!%PÂʣȉç*“N{ì<}I<×å×8á|ãÍ6Ùh…TLÅM(“¿%ôTýD"’;²,ÁÐGä;äô2 2°Æ Œ¤×b ×ÁÝiL„Ð1NÝuðN8§PD8XÈa”c¾ nQ„Ð`‚¸‚ l3ø/r„Éä^ã9Ë-esÓÔþ¹ j tk]›P¦2¹˜Ž¡Â ¹˜ªçÔE3¼Díj¶"pµp‡;„øpzÌ#|À ªVj0‰"Q~œWîäaøjp¨kvàgû©$ Ú ^ô ”ÔÍ(ñE<²Ñw¬`Ž9À'*ˆÇ–\P„üà¬<èGÞ„"¡ õô«ªÎXx¢V)pødë%° YÃ;µî‡à$ãâpˆƒæ@‡:܇vÐÁxÐòAðTnâ’ÎQ¨bäâ©’„/ô¡ŸàåBÆ!$’d##XÕÅàÀHqŠþT¬‚®€…,fQ‹[äb¾øAˆ &8Ô°bí¦’OIâ€pAJꆔLPûØá òДì‘[º\ ȃÚfŽ!™§ÀIuàQ V§ºØq*Ñ694à!ðÙ!L 9Ü®/uÒY' Ñ;q£PËN–Єe4ãјF€ˆª-ÄJ ‡ÂSŒdH KpƒIŒ T(†B„Š…Ír«\€¤j"Æ”\ã _¨E>ÞpOd%´àƒªø€Ê':z ƒ*TA ÝkWŠWÙ<¢'Ü'â¬j…*m A‡8Q 9þ è¥ðLJÂU­ŒÂkà¨[JÀ\VDwšÓÈÅ»¨É(HÓ’ˆcy&R5’)#]X%ˆÀX¬"§ Å8L\ ˆÀE$À@þ€zÈÆMÊA‚`P °•Ômµï?ÏK޼ÀtÁ\ó8ÐÀH¯~åM_ûkÀê×,ƒ%¬lº»˜KF\ØÇ>ä#£+ÍA ‘ƒbü¡ ‘‡G‚…VÔU¨ÊA46ÑڪŠ&‰ð¨À¡’l csP/lð;¸€ (5òq/Ø"÷Åc~,þþLYYòmŒä±øÀTÒFЬšªK¼¹lQ%V %¢ BjÑ€&| ™ƒ:¾á‘o¢·™E¾ñBÅñKMQ‹•„µÈ„FÉ‘£%;¹+ÿ]tT Œè£L¹Ê”Γbý±I«VF‰€VqTt9 ʨDØæà‘q¼#¨B}Æ'DÀT2#>Xj0±&€ÙH‰ ƒ?ºÐ‡ŽtYíh«4:ÙN´±‰2éJK›Ò –QÁþ £9 "WeD2v´dÀkªdSWxЀ‹q Ä …PW|“1€ªdH‰Þ€›‰aºØÏ ²™«&<þÀaé7l¢=í„¶Ú22j!#L°‚ ÀG1ØÔ6¨c7€ÀB`qƒg" ¤ØVO0#ä|œù¬ï˜S‰ß7Ê¿•eÜÙ5ÿ Ât“1¼Eß.5Ÿ=`»_(Œ1¬WŒ9D" W¸m1 `õ’0é2jFl%a„ ØX…·ÌÏžš÷|(7Çyƒîv2|íh2NÐïÑ¡·¨ŽP×"Š‘d€¯"oÈ:B”‘=‘çÇ÷ØsE’ ¢ì}F»åOUëŠÝ•îIÙ`ܹ¢s€ó|í?Ç»é5¤÷ü¼è ƒÏN OÈcL,Êðˆlc þ]΀¡„lÀÞ"øBæm}ùäßDíœGç?¯l¸C¿Ùso~QJúì''õóA‚à1+Ð 5èVÀ¯j´cô^¹©+2,éÍp4´8c 3”W¾ÿkÂ|Ö×vŸzÌ6z=‡}Ú§€yÁ}ó±OP0T0€GZÒP[p ¹‡/AÛ&#ì` |À­×ðñð ½evÿç‚tåÖgsÏ7}·5ØXs Ã ràƒ?„A(„CH„Eh„Gˆ„I¨„KÈ„>›&(O0L-‚(fÀfËp hEŠÀÇ×U^ÐÀ úbþµ«@g-ø‚/€Í7€qW€É¦ƒ72ßÐ}臈(ˆƒHˆ…hˆ‡ˆˆ‰¨ˆ‹ø‡lÖ["–`qW…˜0 Ý@[±·ÏS /GŠp±dà ûà£ñ ûà øn•‡±8‡œW‡nw‡Ž–‡ý62tÆ‹½è‹¿ØZp‚P#Ôá ÖÃwð @7P1@*·ÊP •aç¸a ¶ `‰‡±Ç‹hà’€Žé¨ŽëÈŽíèŽïñ(óHõhê(™G92µˆs·¸h¹øl»Œi)#™2ÙZÐñÐL`ûrþRÅj€ ìCÍ` íP I0ù€ áxX0Œ…Ag\° -é’/ “1)“3I“5i“7‰“9©“;“"·üèþ8pédil‰I©”K bà€ðTÚÁ6\ˆ$çà[EŽÑ•‡Q .À¯ðÀó °L©–kÉ–? ”B pD¹dFiHÉ–w‰—Bå>²0f ÅHÀ>ŠpàŠgŽà @ÀÕðà¦Ó P–y‰™™Y5nÉpÉlr `t‰hv©™¥išQû®ŠìpJ’ðEbÐ &ØŽg{ Õþà1`róAð§iœÇ œ)ƒž™l Ù_¢e¤‰œÓ™™³2àÞÐÓ€ ëÅàó]Æçßpˆ@@ð Ll ‘£Ár‚0=ÔiŸÈ©œHƒ8˜sÒ‡ƒÐ‰dÒyŸº”düðEÙ¡Gð¿dU _`ž±~JvPù`@-gÚ¡@v*¢™™Ÿt¸Ÿüùv7ÈŸ:`:¢/ú‹-‰‡ß@×€(`* ŽX Ç’9M (…À( ‘MÍbü0*¥jY¢´x¢(Ê1þYƒ,ª_.:¥_ª.Ù€°‰SeþX@€ w=†±+°‚¼¨ ‰xÀ“ï ¯ñ*¯ó:¯ùƒ»ºh¿ªPÁÚP#ƒêàK°k°‹° «° ˰ ë° þ±K°öú‹ŸLê –0 † `p À sðý0`ðçq|BÅç Œp‹Ê7‹€Ú«(ʯ寰°8³ÿG1t†W )#Áž`è b€TKPnÅ€¦PU¾¸æp2û³–W³kW‹80MC€K–³´³„Ô³_+‹+Û[ôÀüPŒá ðð˜€1¡H° º Íp lpªU`­oè³p{yaÛsuè˜mà˜  öà˜<Àýµ¶~Ô¶|ô¶Žë‚Aˋ֡‹‹« aÀŒô€ a‡Z°‚›0|½uO©(]þÛ¸¢{v[s8à ²*‚Ð}€8à˜ Õ¹ô¹"º¼K³rÛ[Ó0çÁÛ° YP [Ð \0`lÃ6 t ’‰R`DIéµÒKlú¨«»Úv:  ,°UÖàÁ°WÍËAÏ›AÑ ¿`K½½Mn… à0~P9IÝ ¸¼4Lgi ù¾|_¾kpm‡}ÐUšÒ¿Z:}ì9,Â2Gº½˜@?à<*|àn0 `°T ±âÀjI ÷ yJÂ1P$Üo¨ [%´ ºÐž%—Ë« 80 Uü¿Õ‡¯>ÃJÀd*Ê8@*t@Ñ  ÁÐȳÉ!ÓÉ·,W Ì‹3Ö 0K°èÀ-RjYƒ € LiËÚ,1¹iø¡<¤ º` ˜° PÃ0 ËMÐmÐÉã˜ZP·ÈþZ0…<5À˜sÍ“Íòlo´W¥ÂÍtö yÖÅðŒÇËòûÅýx³PÃ;ºP¼Ð\ÜFÐ EmÔGÔFº°,°ÐLÄÐUï`XL+^üÅMÓ°03 ˆÃÑrLgqPDàW;$ˆÒ"H [@ q0x É®L ÁÇ ÊSÍSÐSÕ€Z \à`ð á0f€h m°ìàsPwpy°Œ`4ýÉ6}Ó¼Ú:M¡"\ðS  ëg ­íÚ¯ Û® ºÀ Nþíw˜¶]4KÚÐü;ÈÖŒÕøªÕ4=h)¡ @€’  û€éJ˜f0d ßÁÃÃC<Õ`Ó Sð Kº M°çZÅÏyVó3 †•ÀO,àkú>­ I K ×Ëð;å×T0 € ïÚ0 öí #ÇÎþ` 0ÌzŸ$±g½®wÂuƒê¢‘ô˜ÿ7ƒÐ•ùX€ A?ë; *¦L8†ÖbœõHÖv¿0)É« < ¡¢RöjÏö· ÕQ‘¶t0K†ð À QðÁ€×@ÿõoÿ÷oÿDð x€…ÿ b$XÐàA„ncX M,%N¤XÑâEŒ5näxñ€:!¸ƒÀˆˆ×|ÍÛö›·ˆ7@vÄÂïXCœ9uîäÙ3'šzn$Y` €:ŸIs 8ræž)JŽsàÖM©Yµê|Èñ£1ð®)ÂR'E™9ÜD(?=°àÛ€GþhëLðЭ"LÑ$\ذa›9»@ØØñcÈ‘!¤Ëòe̘yè2@®mpŒ&}*óeºœfÝš´5ºX±8]óèV¶uë2ʺ’–u:âd»Ó„ fº Y,"_âɦ<kÔ迆ënG»£l·Ë´ÐE‘ÑöiD—6æ!­R¦á¥¶ÔVþsmJ`“6 3Ã-ËÓÞ#í]´ðf‘+F3ãäxȆË̦™®ºë²ëqN:û®! mÔsÏŽÀ™ò..H(#l,h‚.ö!˜´8ÂCHÊãhA"Òž®yB)3Ê ‹f0•¡<1úˆc¼ø°Ñˆd †‰TŒ¨Åð‰hÞàsW-FÇ:ƒ öÇÝžü…”Ö.Ðe~xIJazR5*§´r66/Û2[Ë* M5†©Š´tÑ!ÍlØac]vÛu×]ܤκӰö^:ï$"^ûõ—Æ 8‡&_G]0JmÀÊ`­Òa&,d8ÒR=b5EVQ@šùþHÀ8ˆ$™é£ "¢…UÿUÙÑ…_˜·#v7{ø˜²]"ñD—_v‹²Z×®Å2Ûm³‡2Pb]Di •Ó’ËF [³%Þ7éÍÌÞ˜»ön!<ù]yl²'2k…ð`†°‚'Þª%…‘ØmŸð¡ƒÂ¹é^°âŠ$è+†M®‘(“ÐcE,dÀŽu’À3°!\0"qqŸZÐz¡lÐ)òõe¯K?hæÚ¦±b* ÄÜ7€ü¹ê×bÖٌۢf³f,çYÖ]ªiíjyá¬WNÓ›/H_‡Ä}z^'À\_Ú`»e½·‚§*k¨è~'Gò ‡þdÆ¿oŠÆX’ ‰ÜgM ,&ôƒ~læ#€ˆ4PGydŸûˆ Þapz¡cœ÷@1 ®6,´„,ÍÎxBã–.r—¥_(ã ðÁ0> ×4a™‘ZñŒ‡¼¬Å ‚„ûxÃéµM}I ÇÀ‡ì°MxÅhRp)!ȆekÈ=ÒÍÐkÄL8¢à‡ªYcÞµŒW%Û MÔ pÐO |:pU‘T1l†x_|Öæ%C)6¯†ÒsbA§Ã$òd ÂM –0¾sˆûp@ ´Ä±ù 1øƒÉÖÀ<šŽŠ—ÁÈh ]È€}X†Ë¨nQ R 8(| tA2<®É)‚2LCwƒAò §"¢A؆a¨C;<"è^0ƒ‡ .0‚:ôDc-%d”…+—G(](( ~X…Ë@‚@C C¨{ „p(€r({ „pH9]°;éP° ÃC5\EGVŒÅãbÃë §€CüÀ 3º 4@0Ð…Vp£¸ <¼+@NÒ…½[+hƒ…9;8†ee„`Äb°/(‡9€ EsI‚kÄSþDE1PEYb4MX$&8ÊÐU #h0£4"4YÚ @¥ ¥Ëý­Óš¥Ö]¨GÚ„`èÃKíÐz’ùx% Pƒ/J³7È)#¨=õÙ¡Ú¢â"†°ºü„“`G¸^xS`Aà+¾b,Îb-¶âI†Ö¶5€sHªÓâ\×^(_ bjëÐØÄFh káÚÿm Eàùmà…¥#,À½l‰áÇÀcXdFnäEö>2P*ф…ƒm¸dLÎdMÞäKî>;€ öªÔ5ž"0²—üú@Ao€VneWfå0`{h:.N¾å[F@Öñb0Î^„˜…faæ€rÀ’Ú^]È…) »©ÐH Ë0”£ãÖþ<> z‚×È]ðÚÁ$X+3¸»Ý@dÇÀ۪ɂ@¸KÆe{Æäîû™åŽJ]@€hž5kP¨Z‡Kè„Æ;Ø…~h3hQa‡/‚ƒ@ºZ¾gFÀ.hàe·yÇO†°H¨íÕ˜\Ð…šq`»%˜ièÀ yRcÒ`ƒn®vuH†Î¥ Ð…g6ž9PgÝ`çÆ(¢˜§~ê§žÒÀJ–y®gÆå|ƒ}âcJ]8h±k²ž¿=h$ˆúƒ.p·~k¸Žk¹žkº®k»¾k¼Îk½vë/؃Q¡huÁlþÂî ~ø)ƵŒÎj\FÀ*i알O>…¸lÌÆìÀ€x`Ú^ÃWÖØ‡(ƒjу^¨\ðc „h+]ˆO&ðG–[l?(i)RføA×pàÕ)š  8‚шƒ s€ÖÏŒ³u હ†7€z+ §bhÜÛ‚Ö`„ó,n¯Ùñ÷q±V„ ¡êL£î 1ò2ÇçìVò®þjzæñ6€r±F÷IkGJo,'-ï/°u/oƒôÎ&Äžb2uLæï4lLJóø–ó6þp‡™ãlφ eí)ñzCXLûªsX\]Ø6ÖƒF¿ŒaÀ‚)Ézšvè3wÀ #x%ð…jèOgHØ]ãžRoSkzÏèæ‘«fvX¿ ¬‚”òƒÔóîZrˆr±–ò6ï$òõ__™`ÇŠö.Më7x…ú¾o]ËofG@rÈšÏ cˆvH™v·v±Æ%QpnOPÛxðÖ‚”v|pÜË0wdÀ\rZÒø‚vÏ6]‚)$2׆lÛ XxH^–ßf JøQ€ä.õæVî ÿ”xwømè¾já€&¿øÇu²žrþ5’hõùÿ—‘”’'v”'k0§ç‹~ùewø¦’Ižs« k:·sx²FuP®jî¨{‡Cx~èþqÒ{‹kŒ×x²Öu´Vëñ!üÂï—Ç”Ä?ù”'ëc?ìĆ*˜u{ faæW °ü67ˆ7ïùÌ'klÎö|¢? `‹€€`à@#ÌÇe˜®†>p˜CøEhÌ”Á°¤!ÇŽ?~Ø ¤ÇaX䓬 J„|‰4D—70þ:vA)$ObÄ *t(Ñ¢B_XÕf)S¦ëjÊ”ž°3Ð5:áF±®^¿‚ V 8Û΢M«v-Û´­p+w.ݰÙÊJ•:‰¼mäù(kYÝÂuÿ0âx1ãÆŽCŽ,y2åÊ–KÙcØ0;_ü2@SÞ7¯ø(¢e3ëÖsÍ(Óv6mµ²Xp=·K€¬CíȺ )·übš‘ïæÎÅij#C]ßN©xlÊwëtáè8 %6 EB©¤ ÈôöEºï¬% ºÎа,š]ÃÚ}$îyäÓs …”R =h"ø@þ0¸•ns‘eVm¶õV\’xõ±W_ yÀÖ¨A¢aˆ]V£7â˜#fšÉøUgŸ 'i~AÒNYô˜¤\°É¢“iÝ–›’Åð¶ pÂVÜq~ € ~|À ˜@E‡`C¼ÌÔK6$T̸ò{¼xt JJè"Â@1˜Ù'|^@_*º\AßD¼ø°Þ ÝÃÃ/ ƒÒ}6¤à˜ :8\„(*BxP² †SÓá“§n#"©›™ˆ¢Š("0z8°*X4ꘫ®»Ö˜©?¢(äpˆÀÏÇØš$“¨>%©U>wåpZçŽ-ýðƥϕÙçCÃðÐþÐ6øÐÙñÀž.PÃýéòRèR.¥<ýÙÞ0VЗ‚.ÒЇJG@,:P?àéâ)BÜk©˜#TNs™BŠmPeVÍ:¥©Ì‚¨j²tµ:Ü«(&aÉâÊ«Ë/¿ìë”À9Ц¡¦ÚÈ$. ò‡ÎN ­sÒfiÜÅÉ-·msÝ"ˆC/Xl¤¸Zð€GjÔÛÏ,uÀ«K0 !C9áèr‰Þû#ŧ‹@(±¢‹ô³QCT ¡ƒR#áõé0ƒ6¼è€oûµéÅmPh!†¾u¬äÇ>Ó&òÎb• ÚÉ·øbŒ¶¶ ³è£Û(³’4ƒ&ìÅEþy¹k=S>ÐJ ÝÑ~Q{q—_†©´QL·^ëé²Í2¼„w“.½ ¡‹2 Çx´Î2¨¥äI:<„‹pÚºäÛÙ b$A,èÂLK´,Ï‹ ÄðÆñà { O©à îBqyQÜâ:õ©Pe%r†1Cä2¹Ø±År«B”9¼˜Œ/‹[J¬fU+×4a.¡# KøÓYrA_Tw1bK…®ëÊ^Ê7Ïê PÜ1ެÜ./¹»˜µ°¥-ß xÓ ×wt®7˜¡!ÊÓ…;ZŠl4$ÁA$ò3/ˆ¡:i ßtz®^r.þ”€’ø ñÒ€’B<€  Â/zѰŸŒ©˜ " %)š²Ø1V•AnŒ( ,L"î¡‚lŒ¥,8 \F  ÍKæü²¹Å¥ ƒi -HÐÀ°ŒÐ„²,! ƒ A,,Ì‹ /†³Ô¬f†ÅP„0è!ØmJ: "@‡°£(A”ʇ´20‰AéÖP¡ŒéP¡^ ñ£=¡ áÂÐÀF”žæ}ä‘ùÁÃ4ªñ=ð­í^>×1&‘ ]̘Á&̉…Ž# â@?ö€ƒ€ `øÞþžSB…ä.ð‘È%Ž‘d\….þT”IÖ%ÑÃ*‚Ù•&ó,$UâOLÁ+¥ÌË)7Ø9±¦*èxn•˜Y"•–<ÚL*°[Ô,»”J/Ç:8 i† €Š/àdÆt³K’Ð 0y´b¿ δŒ6ÒÝI›d’Ž.€yx f O.Ð,<€=åèH:Б}‹æH7Æ|Þ«I˜ICЀ¶zÙK^hÈ0ná„?4Å ˆ"h 2x¡ϰ ºö‘Š:çDC–‘‚| ²€P(ŽÔ€ ’$WZ“˜O)&Lc:Ó)9B ÝÈ;Ha…bìT/)eEþ«Í¨o ΰÇWbYY1ŠuH*{S˺‡ E€W¦Ú”ª.†Çr]#"ˆ¼Á+`éX{$4Däv xpA‚2ͦTsƒE@¶´Ù-¤˜#Ht`]¤#“0À;üÂ|x%€9l<&¾ÝãAàà!>àE:Ò¡…Í6ä3y‚'jÀ‹GyMM˜Aøðb0À)ÞÑd=ÐÁ äø6¤ÁŒxtõÛ.l!ƒX¼‚©(8 ‰ PB^²GGªÔàaëðmS€;ÒŒAR((¥‹]o1\¨(¸Fs“ù\±$AOxª¡…þm€!f8GØ1yäá`_Îs×T¼ƒšÛ.wÿÜ`ý€Ç8ªQÔ°h–ÈŽ já…®˜—2øj!‹wl¡½Ê~/]<XŒ@9F#’aßÐØ¬Õ¿ÔÙ΢›Sè¡X·ˆÑ€“Y` €ÆvÀ(ÐC fJ„yÍl*­[€„0uHâkÑtÁލ  Ù,†QpÏ ‘h”± "øñž ©ñt’ŒÃìÀt‰6lö;¼øƒ*"Aú JŒÁˆe!QÃø‚ëÅŸƒ»‘ëFP¤­&é—èÐŽvþÀÁ|`:Òsœá ä(CÄ1†1€# _øBßjÐ3 úS,ÐdXÑò7|! â8:ÜÐ:ÌCùð9Ðéc ŽxAÚ:QW´ô6ä`žiØ‚~p X2 CøD¸ëáe›2Ÿ¤2v(†ÐðC;pÆh ‰Mƒ °°… ƒïPÅ5£€UL ŒyìÃý@½êÀúоô§/Ž,x£o¸ƒ>`€EèÁ<8 ÃˆƒØm5 ¡3ä„ €‡TÁQ‚ª™«µÚ'0 91TÁ´DÑGuD©‰(Õl; Ã;x@€ \ ØB<œA8(Æ¢8=Ò1`Á ÜÂy˜‚b̃ Ê`ÁmìÃ.¼:°A6ì#ô£-ü£<Ò£=â£>ÖH7àÝ>à"Aĸ0 ¸g‹ùµZ0AIÊ$}¼G,C= DbE`ÛÝÆLú$PG|C®Ý•‹ô ý`«­ƒ üdß JC ‚‹°ÇoèÂ18þèÀ50=èÂeÉá÷Ð!IèÀÀ“.`XB3œÜÄ‚ €¥<„.ºÔKüÜI¶l5GÀ`¼^Yœ;ð™SÌb#ý’<ÔAȃ&lƒx7€|P„ŒÃ8˜A9”ƒ€-ôÂL—g<À6übÛ½+ „lƒT<Ã(Cè†Yå‚>„WD@2dWSôÔÉCÑÅÀ„Å3xÃ:à4B8Ux„ à$Œ+8CŽ|ÒY5‚btÃ;¬Ày&Þ'(‚1+LÀ"‚bäÑAb/ÄC6Àƒ ¸‚bdƒ1¸A6äQ(þÀza{º'|bAyžç ¤§¬f±à˜Ãd`Dà ÄB+,èÜB€¸ÁÔKÖÌ´Z",”XÀ§ÝAì>üA?€  ‚$‚",#4‚#<@B$LT€`&`À&伂’‰€´†ídX݆1¨À¢Â)˜|€p€hB&`ÂT%L‚$D$<À#8,@ˆ‚´)¼ˆ. A․À:ÌÛRÔÛáC@ ‚ (#4À#@‚LB%\@“rÀœ@ ¬€+¸9ìÂ*´‚À)èÂ/8BÃ"|ÍþPBuGÃ28ÁÄ‘ÍX’%dÉa/¨À |,|ƒ]f\©ž‹G`‚ñÁ&ðÂö% ‰Étë0P€ÂœœCo)RÅHwÂ|ðC ÁP Ú\ÀOÀÁ=B2”Êk†Õ£%ÉA$(U€a6ò”6n„Á¬<ÀfœD; €©ñÃÀ1dÞd|’ XC¼bÄ+B¼Àb´ÀvîÈ'àƒbL¼AÀ,F%plèæI,ÅZìÃDÄÖ4À3Ôa`جIÖÃäÔµ-~-θȜƒët.œ 0W¹mÒ¹‘ˆÐ,J¤´BE þGR6R°Ð$X]Y €$( $Ê( ¬ÀFôÁtC ø€Âá*éjÚ¼]^@  A+÷LD×@Ã0€ÀÃ7œ7 ˆ_úÆB½'˜6XÂEb.…Ÿ-N$‰0ÂIkÀÏ@tƒøæK±«suR²‚MeÂÊtÅq2Er¢76´kÀAØÁ  W¬dl^9ƒX¤Ø}Ãcà&d>4Â`Ae€bÐx>À(Æ5øÂÀÔŠ–ŸŠ*§ @,ÀîÎH‚å€<þØ IàJ í R „¸€Z9[Í–4Ò: IBÃÈU·xAHƒÐ *øÙk{4ƒØ2,ƒÌXÝÎáÝö Ö õ,Ï*€.ÝtìA]Í È,Üeà8+ƒØQ…Ì $HLƒdkHmëâ4¦”‡bÈŠ ˜B„8 ´J³ôøŠ4I›´(³F? y……ζÏú…Ïþоr1L@-¤Ã1Õ2O.“ÅÐÂ…Õª_h-×z-2'sC|‚0äG„‡¼!‚`&œ7›‰7{Ù$´C $.ÐGÔ.HÂ.^âu‚ ñ‚ÀAÂÄ,qÒ5ñpp®J~.ät4ôÈÈîRЮTØ.înˆE‹EðÎ’ø*Ûe°¯\ì¯T¡2/©²_ÈþêoUÃ@Óò•XW“"ÙŽû kʯ›«õZë‡Á5{À3¥´--ö ³M{LÔ€€ÃD1îG €.€4pÓTwG8nVØÃsà³>7Å;ǸêFgÇÎg'Kh§¾J…þ@sîŒj›F €lkWÆk»†SC5S°²¸²n×…ÒâÐ-ëFíøY ³T³ órÏÕt0A5äí÷ ëyã o‘.,Ãà6LPsC„ËõŒ‰§7µ÷b6?k¸Æ÷fË}SŽ}Û ~v@´ôëåx e4?d‚øR%‰‚×vSH5UCx„o5–· ÷…7Rw^œu×zø6ÑÕGøÑ,bßËìA¬š¸Ú\7I AðÃ;L÷عYêiX Ïyç¸ïìxe7Åe{n†9‰¹Ïùª ¹~/Eiç®ë<9•{º{Yy`¹ý6ÅþmDnw¹—û¶¹…9º9•y0Ÿ¹S w¯9›‹Ï=õÇ>ìă„^ŸÍ*|˜ 7hÁ°QŒe¢+Í¢û|CúªL:ÈT:©\ºCÿs¢1§Ãñ§{»d xkŒº_4øƒ§ºª0ï•Ä:„eø†wø­ø€´¯‡Š{D¹hÁ÷Ì*44C zc/·³K…û³˜È·kL;³Tû”\»T,y“ S§;•‡;kŒ»Tl¹)Ÿ;º0…»†…Ã:0»û¬§yZËû¼Ÿ÷f &¾w„7KG~ø@Ð<73û¶Ö³ºÖ‹9×·Õ–¤üå'Q›g>¾{ó —ø½Dè@!â5鉳ÿ¼6©¾a°¾“¸>B‹1rò…ÒË>àÓþ·Û~]ŒúÔ£ºîãÇŽã³äK“ä ªq€}rñþÙëõXNDŽD1 4xaÁWVµqøðá:‚^ñ D^B'Ü(ödH‘#Gjg[J•+Y¶t¹²$iÖ´92ÛIˆ;ÛÌÀ€On5Jò3,K™6uújT©S©Vµzu©”=G‹²ð…'D`^ˆ ÇWµkšPæe\¹,e°À–f— Ú'¬CR„(™Ë _Å‹ ¤ rdÉ“)W¶|sæÌA[iöŒ¹W/ŸIG&&qê c pývPüRQ­±#^š&QÎõý2æLÝxsÞ³uyònAõ<þücR¬Ó©W·þ~=ëVè½~™ó|x!²¯œÛ~¾íÛßëéÚE¯—±_}îèׯ?B6H·ù't\À¬Œ³ <°²Óú[l!Ù|7Y#Ðã½ · ½£r‚DlÚè/é°;Å§Ó =¯@1–eHœ‘$·àÒp½ºî:¾ÅüzñAhö H1þCÉ$%+PÉ&KS°È„N!‡Ê*­¬™9¢,(· OÂq=i¬é‰ Ì<Í3)HfLµþ€&8圓Î:í¼Ï<õÜ“Ï>ã¬B»íÞàƒÐB -ôÚ\´ÁüMÇ÷öZ¬|,½ÓKagËtÔ™ •ÔþQëU »<Ï$:yÖXe•ÖXq‘‰Ñ\µŽ^}ýØ`…–Øb=Ùd½C×fsuôѹ"åqÒT­UíÓRµ½lÔmµ…òÚp[u;“€<Ý…s–ÝvÝ}ÞxuË-ì½ß|õÝßvÜ£VÜ€7ÊÖÛ‚!ëÖ`PÁ˜a.-<Ï f$ž˜âŠ-¾cçäݘãŽ=þXW·ÒùÜ·ë±á” Nx[„YVrá”&äšm¾çœuI™8|þè …šh,$•YåÇ^.Øå¥Œiqiޙꪭ¾ë¬ñB9jqWvÔ¦Áê®­Zë´Õ^›í¶ÛåÚlþk¿[I±é°ì¸;EÛí¾ýþðÀA‚[ïNç¾A»ÿ,ï‹ä[ðÈ%ŸœòŽ w¼ÈÃPñÍ3kó!¯œôÒM?ý¹ËC÷TiÏ“tfN@"ÀÖ„qÔœ}Ðæ³p£œƒ„bltšN‘‚Zy^P +C¶zzðÞtÔQõ¬©ÊzìßÕž{è–oþy¿U_¿¹cŸ½v×5kÈ–Ñìú=ƒ’?^©`zp‚Ùvd‰@ÞÃÔ‚Šdðràs(G$bàp¼ú*tk¼`7ø®~p;„ úªÅ>"N÷“ßfÐÊþèO"€ >Ф ‘ÁD V! ˆ¢µÐR¡Äöð‡AÔ=VqUØ0‡Îø! Œ€±#  Z †9Ü`ppEñÐhìƒ HßÇæðÃ@@3Úacpƒ;ĉc öÐCP83¦qb # î‘¶L°©øÈH°W¸b ñ„+Z€Š] B¸(ÆV ÊMvò“¡,FZÀ À$©€Æ'[ ¼œð#Š@Ž¡2äC– pq<0í(Ä>< Ax°˜ÇLfHFà†¡£ Å肃¾Âª³Â$¦1‘©Ì0þәД&5©`Ml²s› éæ7Ã9NÙ”ó9˜Ôä*a ÊÐÒ–¸,†)GЂVx ÙÄ'7¡O!Ä‚µ`Ö,kyKpÒ“U‹^v׻߯kÃ+žAŽÇFF‡K„"!CE+Ú6ðÀ*P€ DÆ?´@d<ÐW¨Bç¨i¯ú¦”¡d È\àI È=@FÆ€ qˆU­rU¬ø©.!~N ‰Àrdv˜…<&X ó°M_ÿXÛ¸€ (Ø„ êñ@ã Ÿ°Dð1¸€$ pǨ€±+^õÊW¿Âàþ ñHÂZ&¸wjÀ ©Æ*> B|¤Jø&1 [ÙÒ¶.ˆh1$LꦃbÀ¨†bœÀŸÀ ðP‰(¡ ‘Ð`ˆ&hÀƒÙø„¡+]êZ·s€ð>4#½ã½`ÌIµä.·¹Ïît«{Ýìn·»ß ïx©P^þ¢W½ìu/|ç ßDÐ7 qíG|[ŒÙ~D¸)îu€ÛG|äø4VŒ]„£Kp†‡»ábTøÂ# @ÿþÀv­€,HSóR]TõªYÕÅV!£VÈ´2ÆÀX™Eü2h2dl0 ]ð€E^+’uaÖ!£u2þM«Å „±‰Èãi>A ~SÈà428D³šÙ¬ |Ìâ°‚[s'†€ :+†O𠌃 øF`ÑC<‚$z ëpAb­c‚äx ƒ.ô¡ é ¾T‹ XqQ€„ ¬5+rÑ~D¡¼…õ¬iÑØ‚“ ƒq¡ÓAÙ¤aÅxǃ6(‘?|Ä,0O¸l•P t¸‡TP ³¾;3vP­lfÃÙЖ6µ=hmÙ`[ÛÜööGÀýV»z׳®u1~ìaãšØÅîGn­k~[Øù–õ¾¹Ò„qŒe|¤ÙèF8ÊQ’þ·£ð¨G>úñ€$! )DŠA‘Œ9$+þF>|à2c.ó™Õ¼æŸÞ9Ï{~3ŸuæÆèvƳžiNçµ.©†•©PP ÈÀ 2n֜Ǩ[foð—ßêEЃ•0@ˆ`bãõÚC j;qg@g PY„€Ú x'»ÙÅ€vµðÔÒnà*[ÂäÖÅÈ5H0yxšDa#pñq D @~PD1èðƒ~|¾̪Þð‘G¬õTè<èCÿÀ:h‚âøÂpënœuðò™ßüêA/zÒ›>õÓö ï?¿Ñl¼>ö³§·à¡ãÀ'þ#Ž'þ ä%á tà™düöABý Kk•˜k]ïš×½°‚5maÕXÅ2Ö±b€¬d)kYÌj–³ž­ŽGkþõ[@êA,céšîé.#ë¶2V@2bÊçÜŒ¬$#‘ìê0cªt P2>aÉ&c¾JôA c #f 282† 2‚ÌR ÏÄ@øà(„Âa ÄaD rA >$ 6 ‡°P `€bVŠ@ ÆA°A&ÄÁ‚ì ÞA@ë€ t}…P&*‹µ>bTà#L¡ÃDn« ¡>þB>ân$ðp$*ê#š`à\:*¨¾áfá`øàª Šá²  ÀüåƒFÏ(Á  *ñ3q‹á ÜÀ¡ø œŠÁ@º„¡lg%‘-5‘=E±HÑQQ‡±_1g±o1wq8&¨ï0C‹A?¢ø°4&Ä>bJÌàºñ‹Áu£ 0Ð BÔ‚ÔíÑÍ%Ò, ÓÄ@Ó8 ï ïæÑÐÍ¥ºHé #7°%ƒuÁ!C@P¦L ÌΦL"P&²"uA-0é&#vþ>2’A2€N!!2.@P€ô‡Z!N¡¢2^2&g2Vf'¨ 2ÁNáhò2 „ @  ø óö‚zÚ!Ô ãòaÆ) ¾2,`,ÇaØàà` ðáæÜàtìæA  ÂÁ„,++·²+¿ò(ÔbyLá#a° >ÀRàÒ‚ÂX 0 µ`ÁR@¼à#32'ó#ZàšÇÄ$ RÀ(s-Î (d ’áÆ DÀöA~ > ràÜ oîa–£n37w³7‹ÁÜ€øaþ  $TÁê"€o6@6iÓ6qS7yÓ7S8‰Ó8‘S9dz9Ÿ3:§³:¯3;‡#1³1AS2)“4M5JX€2€]!@Aâ¤@ØÑBi?Uà4?2ós-º`ÂnìÊîìÒŽíhCÅàíänîÄ î,ë òÓBK ö.Cÿî€Òé(#%W²%…R&¡Ò(‘R)?²TA*A"S G#ƒ˜ÁHÒ ‚èFQ!)ƒ&k”@N2IºÎ`@Ç…R#yH„òÔ¦ö¶“KEbKÝ&K-'f°o0w°0 ‰Ð‘Ð —  ¥ ­ µ ½ÀþP ÉÐ ÑP Ó´ •PHEJ¦sJ#Q½…J«t\(WÂ4kòÀº«K3U$,S‡R7F/¦²*¯R “+½²ÀR,ÉrUÑR-ÙÒ-Å.å’.í/õ’/ý0µòTÉ’»ÄQÇfQ=à P<`iRùâJσ T@ F mÈ!(Ú¡55S©5š®µo–GP dÖgYCs $vPÁÊ–fXgH2”u\¢Y±U^ç•^ÛD\ßU#Ê•]çJ÷U3Ü_ "^ë•` Ö`®…v1ôÕ_¹¥_6*OEaè`+Öb/Ö(îub ‚a!VªÖc)`7v`þ1ÖdO¶K5vc¢cC62ÖÕ_GvbKekÖfQGeW¶e]V`v_eVaiöf‡–h'g7vg]ÖgDœ¨T€6`…¶M.ÀŠÖjM–jÝåh'6i¤i½Åe8€¸@bç¤QaFbù£/e£PE¥øCjmB˜gf ô¸âSÙå{‚bÅЃ|®ö] á øÀúá&W7×]ê–î6oboÇdkV_Å–lÍmÁd?2è $m“j BÌ0ìUL”bgd‚–`côáRÁÄç<¾TpÅ üàÙjwbx'õ#\vÙ¥r–aAþt9‹xÎse ª¤H N`Ô¨Tá@ž*Š CjÁ Z`ò`©n ®Šd éèâ›öá 4ÑÁ€Ràš¨ä‚âäVK?‚ Na@]¡‹aX "`‚~àB ¤!¶ØÜ`“ üÀ,©ÚHæÁ°¦žìéƒü)(*w¥ æá@b˜¡JøšN˜œ:>8„Gx†«©†Åé†Ýe‚ ø€xø#¸&¸‚i¤r5Aò€/âvA¬xa[3@R|£êz³w{»÷{Ãw¦¤¨|Ï7}×·©h(z#cÌÒ̉¼ŒÈ(ã C:þP|!ÈÎ*2l l'2ŒŒ­Ú—Hý K .uR¡bPáPÁ€î ³èþ6«Ð¸CXíºa£Š¡‹ÄL/ A>b¤gÚ À]Àm ÁT«*(8€Xa4@À¨@¼¤­Á,èÁV8Wî¾$@ž¼|™ÀâK˜éË–qY—y¹™ùƒ‚y¾Þ…“=$By”‹áJù”‹!•é•í5aùB!*áö 5BuU£žóU‹cNÍâXÈæx2êXî¬ô¸ËúÌüµìÈøµ«Î¡ç,ÍêŒ !N l2DA2l¢m2|2þpŽè¼Î}QôÑ"ô-VÅ ê¡Ô8Eï™Y%õ<&Hb >"ûê¸JàÂIؤ]À­ƒB©ƒ|©ƒš³<ŽÝP¨x‰=Œ™?B™—à©—…„O©™Ú©ƒOø¶Zˆ?â¦sZà®o·B§W¨…šr×Y#ÎV „  @ÙCë‘æ·~ï7÷· 鲨3@²£%š¢-£uA£#ƒ£k®ÎzŽ2DZçL²¡§wz+P24a‚.²wN<[z'cIºMºC (“5`Ì C;Mni:…@bÒy§Ó$|º"à»Lˆù²ºƒè$$Á°þ¬£Zª·£…_ø#ršº«[øŒ[Ã’;«­{¬ÍQ·Ñz¡Ô$~;¸åhëBa$™(9´.9ÿ™‘’ݾ-9³0±5$M2@[´7ú²2R[³ |zKR2T ÜH0’ RÁ*2FÒ2Fw JW³NwMáôÑÚá(àø@Ä <  @OùÔJm»ù@"ÖÄDŒß4æÄBÂÁ<ÚEv-¨v‹Aü "A;È 2`PáìPO±>‚%@›»M,€T€pa! ­ËqQËÛ¡"Ê¥œÊÍ|¯þÜÕ|ËÛ“n<ÇÍ‘Ç}È…œQÎÒ{ Ö[¶Û.¦YVº¥_š¶½¿3$<2Â%œÂ-ü†V0ÃAúcZƶl™!tF‰RРR¡|ò nlÁªN*C=Í2 2’tI#–HÚÈmYÕ,íܾÂa b€a `â.ó2f|F—Z ´@EÉ29Ü©üœ¥;ý¶`“ÔÀà0;ˆØ`¶ †«8j$¬;µ“ËÇ$¾ ¤q?âÞ‘sßå3â}ÞëÝàÓ3ß¾ßÛÛµÛÔÛ[ÜþÅÜsåh嚮⪀¶ñn ]› `ûÐaº‘d!ô5Ô3—ÔM½IQ]ÕYÝÕa]ÖiÝæ‡òÖeçt½(RIsÔa7›guÃíÙ¤fnuE F8g˜û߯ÆêgêA®5BøA*aBV¼Å_<Æ7! - šJüÄSÜì]`5€VJj _^Nªàt¦;Û¡|mv¿÷)Çöq?òeþæ£Dõ!–õåÇõ!5ê}ú£`d&ð?\’¿a—ßuš¿JŸ_ú¿üi`_öSûýUû=‡û]ÈûÃßýß_$–_Ï_ÓsÖŸ}Úþ÷?üåÿ]é t H° Áƒ& •‡#JTH,‚˜‹3jÜȱ£Ç ?N¸Q¬¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@gv ²¨Ñ£H54±©Ó§:„JµjŠI³jÝzqdЯ`ÊK¶¬Ù³hÓòʵ­[K­Ê‹P*Ý»P±¾ÝË׫ڿ€ L¸°a²lù*æ¯ãªvK¦hþ±¨9†˜°» FÆ[&3C*%°:é¥Þë“éÔ)[Í»7ÍÖ®a“MÛ6á%sïöÍ\fbÔÐ6žLbäÉ“ªÔÒ€ ’$¡Ð|qS¢Œá¨"‘ûèbT7K €£D‰>/)ÁÞI$„x‡\1ýì7ßóÕw_~ö÷_€–Tà€VXÒsðeÈÑtÚ ”]‡º\' r’{}àÆÐŒcOhï]äÞhb„‘™8bŠ9~|F/04:ó€r íÐŽhp$Ÿ…=(FlŒãD2ÞGá„&u‘ÙÅ£Aùhc‰Ië€þÁvTPÒnà:M@igNRRi%–Z¢Äå…_†9f™g–”æšm¾çœuÞ)†]æÚh}#b”vš†vH"ˆ">ö©v&~äf£‘ñÀz˜Š1#F†Œžb¸À ›¸PÏÙ3»Ä"…†°B%Æä“Ž“$9ÊS˜ w úáúÝ—G1'˜ó‰'àQIIÞè@-)(Q̈ÀÀ|4ãì¼1A{[˜ÔF(áµÙ&²m·ß†;n1å2„®ºìº ¯¼ô)GÞ'{æ¡§^Œ¯rʈª]¨typ ̜ Õ•ê‘{xÀeÜÆïÅþã43›’Qvðq…,tôdÃ4ˆ%ü)$‘FФ’LvÔéd"“l2ÊÕŒ—ÇÔ©ÜÑŒd¢wŒ®ÒL£G0 :´Ê£<œrƒ9â„ÃlÜ5MxLÖ–= ÓtüÐÏîýÜAöIÙÔ¡ -â|ìqËNûÒú>}{„¹óÞûï&?|ñÇ#¯ÓÜ›£z‘ª¬nNc¬ßIB«­¸êÊ«¾2ì°Å›ì²nÌ1åÔI~þ’YñwþØF!õ\àdƒ ø^„À2Þá ~Ä«ÀF.bJàG;@`äã¯Ó^L„0˜ä ðŽ# qŒb¬#†ö¡aIÜ€o £·à+ð*ô $y!ÆQ’/¸Á¨¥Bz±Ð…%¡ uxÃ-Ö°<ô!…HD#"Q‰L,†¡(E*V±&Ü‹Zö29¶Jf£‘Í2ƒ3Óé #<óÐàb?ñO2ú£Ë&JT™ 3+Àˆ¤ÂN•Ò<ô… ˜alŽð€‹¤!36¸3ÚÁ~|ABkÖ̈À$ÀaþÈ=˜(ŽÌìMv¨2"°˜cêøA!JBŽÌÈ¢$ÆpC+·€€YÒ«– ¹eIr €_ö3¿4T0‡YÌc&s™Åh&fžYŒhN³šÖ„#QN¤™Ì‰ïž3û\èFWºîê”þ‚d{ ÂÖ±ÒÕr0À–˧§MïzÛûÞЮöAFUîs $ÝëH»ßo¹äzT•ƒ¤­ |¼Z{¨41’‚dCÞÍÆ·Æ7ÎñŽ·YßA¸ÂaÍp‡K:âºÐÇÄRñ‹¼ÐÁñ VA<«¢Á„*P€ [H` „€Á\æíñ¢ýèHw,È "sšÛçÑ9Ï}t¡Ï%×w¡#†žñ¤{ýë`ûb–.­æ ÍÄ0¸.ö¶»ýíp Ù£ö³‹»  84$Áö¸ûýï€GúÜï’÷½Û}Á!zàÏøÆ3yðàÅ:iïøÊ[þò†¼m%þZÊcþó ½Òoøð¢½ôñ¼èWÏúÖ¯•ô¨Wç)«z×Ûþö¸×jìi{úÝ ¤ö¹¾ð[¯ùÙÎ>²À¾ò—_ùâ“öø‚%ÆXAýê[ÿúØÏ¾ö·Ïýî{ÿûà¿øÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿîö¾7ôÿj€Møÿÿ€8€X€x€˜€ ¸€ Ø€ø€8Xx˜¸Ø˜€.—ÖÑ{"X‚&x‚(˜‚*¸‚,Ø‚"¸.ƒ28ƒ4Xƒ6xƒ8ˆH$˜ƒ<؃>øƒ@„B¸`08„Fx„H˜„J¸„-X„½Lø„P…R8…TørwW…X˜…Z¸…\˜…NØ…`†b8†dY_X†h˜†j¸†l;؆p‡r8‡lx†tx‡x˜‡z8ƒv¸‡~ø‡€ˆÏ÷†‚Xˆ†xˆˆøW}˜ˆŒØˆŽøˆ‹øˆ’8‰”ˆ‡‘X‰˜˜‰š†—¸‰žø‰ ¨„ФXЦXƒ®‘Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¸˜‹º¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÁ;mod_perl-2.0.9/docs/user/handlers/http_cycle_cleanup.png0000644€ÿÿÿÿ00010010000021531211727205031023562 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡\û€_3c§(…B*[„ÈÖJ‹59¥´RꤴÐrÚ—Ór´ŸJû©žöIÙ²•’„ˆ"ÉB²O˜1cÞ?î§yç™Í=Rfœß÷÷3sÝ×ußטç¼óëÚ~ÒÒJJJÖÖÖØ Vbbb...]ø,L;wîìB«øøx;;;A[>^ ®‚žâââGéü@ €ÐÁ~G»}DgÏž=Ý{Cœôõõù¬zéÔêÕ«mB£Ñ † "üøÑÝÝÿŸ»Ê\ëÍ©ººzíÚµ?žØ ül<˜9s&:ÿè t°@çG¶) úúz;;»k×®t¡y\\ܰaÃtttj%&&#è³ÆŽ;vìXþu°@‡ÿ%%%^»ÓðˆŽŽîé.€_Öè t°ݽ#Ð)((øôéS—G§þùçŸââbš0Œ;vzŒòÝ»w ;­Öéˆ@Ø@ €ÐÁ~G¥¥¥{º#ÝÀÀÀàøñãC‡íZs[[ÛI“& ÔäéÓ§)))MIP(”?ÿü“B¡tZ;‹D"¦®. ¥££CBB‚D"õt_ºŒŒŒ»»{—›¯Y³FÐ&êêê;vì´ÕÖ­[ñ,$†٠Ð@„ÀˆÂWèB^'áäèè¸oß¾®µýÏþ“-h+MMM–!3 IIÉ%K–ੌ}/mmm‚ö ÐS Ð@¸`?¢"èddd0ÏÜËÍÍô0¦«W¯Òétš‡…… Ô$,, OªvŒ¤¤$úŒD:ìGûAQ;vìPQQ133óððX°`††FII‰ «ƒBÆÆÆ5¹r加‹¸oܸaoo³2ö½Àˆ"Öè \°¬]vvv«W¯ÎÎÎÎÎÎŽŽŽ>|øpuuµ‰‰É¹sç455ñÜ$--mÉ’%‚sræÌA÷¢ß¾}ÿºoì{éBf @O„ 6¢#ÒŽ­­m\\œžžÞ¼yó8õéÓ§Y³f >g”ƒruuô, …¢««+Pl)Ð,!6¢"„K{{;ñ@ÇÐÐðÛ·oÌ’›7ofee;v çÚÚÚZZZ,,,ð?”N§=º¶¶“ôôôÝ»w ´ Ft9è \°e¼bb"<­L lmm™'ÏæååmܸñêÕ«øWÏHJJÞ¹sGUUÿCóó󬨨ˆ¿ •Jݾ}»@j¬2Ÿôæ±±±ÑúîéÓ§ÝrOt.ØˆŽ¸¸xOw䇨ÚÚFEE!„ZZZæÌ™³wï^===üÍŒŒŒz¢¾¾~ll¬@MÆ7wî\što ãåååéé‰eo½sçN·ÜÀ„K/ÑAMš4)55•L&{{{º¹¹ ÔÜÃÃãñãÇøë755ÕÔÔtÄâ_ý…'ç,Å‚Ñ7gΜ3fÉd[[Û„„„ºº:æ%vòäI+++]]]33³iÓ¦1÷Àó¹”””äêꪧ§gnn¾iÓ¦ŠŠ ÖÇݺuËÖÖVWWWKKkâĉþù'žKˆ:Ñþ¦ô>Ø’Q?YVVÖØØxíÚµ/^¼HHH¨mkk+•JuppÀßäîÝ»ÉÉÉW®\ÁY¿¼¼üÆëÖ­¨c!"‘ˆªªªòòò¢R©ííííííØ ìÿ’ÉdÎMö÷÷—‘‘ñõõµ²²ºwïž§§'V¾}ûöû÷ï[[[ÛÛÛ=}ú”9ñÇëR\\œ···¾¾¾»»{sss|||ZZZtt4–Ÿ+77wß¾}æææ“&Mjnn~øðaYYvC>—è Ð@¸ôŽ@!4mÚ´¿þúëÑ£G‚fô”––.((À&tp’‘‘ñððÀ_РA7nÜ——¨c!ì4 ææf>3MÄy·¦¦¦ˆˆ;;»L˜0!$$ tÊËËïß¿ïíí½~ýz¬ææÍ›±a$>—üüüäåå'L˜€RTTœ8qâƒBBB°CŸ±jØ1ÐFFFÓ§OïÛ·/v>—è Ð@¸ttt ï#"ÍÎÎNNNO)6AAAcÆŒQPPÀßdþüùø+·´´HKKc@ÚÚÚ°]WŠŠŠ—`¾¯®®Þºu+Ά††¶¶¶†‡‡‡‡‡c%¦¦¦?~D9991kþý÷ߨ >—JJJh4ÚÅ‹YÁ›133[¶lÙíÛ·ÓÓÓBbbb7nÄBñ¹@/Â3ô B„K¯Ñ)**ŸZ©¹¹™D"ýöÛo8ëÓh4___l‡N‘‘‘‚vŒB¡ÄÆÆ9r¤ é,89s¦¤¤ÄÜÜÜÐÐÐÁÁ!**JQQ1::ÚØØxÁ‚»vízüøñ!Ch4ÚÇsrrôõõy]òööÞ¸q££££µµµ˜˜XaaaNNÎÊ•+—/_Žzøðá±cÇ¢££uuu)ʇäää°óù\ €@ðSܽ{· Û°ûôéS^^Ž@‹F£ùøøhiiáDNNNÌ$%%³²²ªªªP7·aÓUiii4ÍÁÁÁßßÛvùòå \ºt騱cñññ ZZZ›7oƆXx]š1c†¤¤ä… BBBˆD¢ªªª­­-3‘û Aƒ”””^¾|ùüùs99933³M›6ac?|.Ð @ è~t:D"ua“üÁƒ§M›†?—§””Ôš5kpV¦Ñh~~~›7o´W‘‘‘ZZZÌ£€°Q·Ķ-((ˆõ­œœÜÞ½{÷îÝËÙÏ%^»Õf̘1cÆ A/Ð ˆüð8@åääL™2EÐVt:ÝÏÏïÓ§O8ë744´¦8(((55UÐ^566nÞ¼ËAÖkVPðï#:luN·Œô ÏŸ?6LÐV_¾|ÑÓÓ³³³ÃY?$$D ]]úúú]Ø&''÷÷ßcƒLè r Ð@¸ôŽ@gÚ´iŽŽŽ‚¶4hPRRþúK—.è)£G´K•••***ÎÎÎØÛ^³T€øÏáÒ;êêê. {¬]»öáÇ8+“Éd111555œõûí7¶”b0K—.erƒzÑqŽü{@ €p鎋‹ËÛ·o;­F¡PvìØÕÔÔD&“±Hƒž9sgå”””šššÁƒ㬩®®–••eÝë#:ˆ˜º@¸`£øï…ƒÁ(++óå[RR2>>þÝ»wË–-:t¨ŽŽN}}}UU•ŠŠJ§mïÝ»³KcÇŽ tIEE%44”µFt9ðï„ ¶%» 'ÐPVV&%%…§²………››[KKËíÛ·W¬X?aÂSSÓµk×òÿ#äåå >Ï#***h4š ‹£:”››ËVØ;rËð¯ÂE\\!„¥iQ T*gå1cÆ$''“H¤Ñ£G¯_¿þþýûÅÅÅd2yÔ¨Q|â‰ØØXüƒ^Û·o¿~ý:Îʘ¢¢¢k×®q,aß öDü»á‚ýº‹t PQQqðàA<•-,,NŸ>Í|K£ÑfÏžíââ²lÙ2^M¾~ýºjÕªœœ<ÎétzEE…»»;žÎ0 6ìîÝ»Xf+VxFtÈd²@))@è–<@$@ €pÁòc‹t C¥RGމ³²ŽŽN]]]uuµ²²2BÈÇLJ@ 8p€O“ÚÚÚeË–á‰rB$‰í âNeffqMßTaßWrrr–––=è‰à×srr‚óþ% Ð@¸`?¢ø§~„І ðW&‰æææ/^¼pqq9uêÔ³gÏbccù¯öÕÕÕݵkž›×ÖÖ¯^½ššš.\b``ÀyµÓ@GYYùÖ­[øøÙ Ð@¸`Y£±„"*--ÍÜÜ}ssó¤¤$IIÉ#GŽÄÅÅñªyÿþ}yy¹ ž;Ÿ8qBе×××{xxprŽ@ l Ð@¸ˆz S[[;wîÜââbüMúõëwóæÍëׯ‡„„¨««ó¯|ýúõ~ýúá t~ÿýwYYYü=AihhlÛ¶×Õ¶¶6„Î ea»®.Ø(öƒ*ŠjkkÇŒ#P[[Ûªªª'N˜™™uZyþüù8WÓétMMM}Ž?®¨¨ØiMt9°½¡#ºN]]]}}½¦¦&Îú%%%«V­Š‰‰é´¦¯¯ïíÛ·9³lr"“É£G¶¶¶ÆÙ‡öövuuõN·µc°/…Ϩ™LŽÇùhÐS† fbbÒÓ½¿:Ñ tž?‚ÿhà§OŸâþ Ç»ôíÛ÷üùó8;ÐÜÜñF€‹‘:¢èà¡™:uª¾¾¾@Ã9DŒè täååB=ÝÁÈÊÊâßoÕÒÒÒÒÒÒéúb6{öl<)«Þ¾}»bÅ œKMMMÿþýGމ«¯ß1 ìKÁ¾ €H€@¡#¢NVVÿÔ߬<<<¸^úóÏ?¯_¿Žœ>}úåË—xR.üöÛo[·nÅóè¼¼¼1cÆ´··ãì*Ó·oßh4𬬬¸¸¸ m=„6uU__ßÓL@@À£GpVþöí¯åµµµ7oÞÔÓÓóððhhhX³fM§w»sçNMM ÎGçççÿùçŸ]V°ÉDìÛˆ X£€ÐéׯÁ5:FFF8+ÏŸ?Ÿ×%,[ÖºuëBBBnÞ¼™——×ÐÐ0þüÑ£Gs­ßØØ¸}ûö§OŸâ|ôÌ™3qÖdƒ…žØ·#T&NœXYY™ ¡¡ÑÓ}@èÀˆBû)­««ëéŽfÑ¢E8Õÿòå ŸI.55µOŸ>ÉËË{zz&%%½yófÈ!sçÎÕÓÓ㺥«££cÇŽjjj>·¥¥eîܹxV@sÕŽÖwøC4„Pvv¶™™6¯Ç4nܸï½:ìd<Ñšºjii‰ÅY922¾oD¢ IDATÒÏÏ×UUUÕ²²2æÛÁƒ:T\\<((ˆs7øÅ‹›››—-[†ç¹GURRÂsÂ2WÝèxyyyzzbÞ¹sÃêêꆆ¶@2NÀ:"‘ØÐÐ@§Ó{º/xåçç>|gåð™?b t.\¸°}ûöðððQ£F±Õlhhøë¯¿þìéé)B±58Ábd„‘¢¢b]]]mmmwý¬þlººººººxjæçç744XZZòª€Ç×ÐÐpôèÑû÷ïGGG«¨¨pVc0222iiixb—ÐÐÐãÇ'''wyÞ !TYY‰ NLLd|×ÑÑÁú‚B¡´´´tz«¦¦¦ˆˆ;;»L˜0!$$ÄÓÓ!¤©©ùÛo¿ÅÄÄ`Õ¦L™B§Óãââ°·®®®òòòqqq+V¬à\“äçç7}út„Á–-[ª««ìçç'//eZUTTœ8qâƒBBB–,Y2~üxÿk×®;!ddd´qãÆÊÊJ<«!è Œ PPPðõëWœÑC ²¶¶4hP§5CCCi4Ÿ@!4hРùóçWWWGEEñŠcîÞ½›‘‘s¾L\\üÔ©S?åÄÅÅ!„ÊÊÊXgÖ8áISÚÚÚŽ•ddd˜ššv¹{!CCCì…ŒŒ B;(¨¤¤„F£]¼x‘µ&kÿÕÕÕ±’’’!ѽ:#l çëׯ=ݼNžF=bĈÌÌÌ£Gššš¾#‰¬/ÊËË7mÚÄÿV # @CCÃÁÁ+ ¾sçk ÃÜF¡P¸Þg·ÕÕÕ‰DbXXžCè• Ð@)))!„¾|ùÒÓÁËÃÃCSSOÍN·µ··ëééíܹcàÅÇÇÏ÷‡~ÿý÷çÏŸãéWT*õÇX&ŠñãÇëëëóª,..ÞiVÑ3gΔ””˜››:88`£VÑÑÑÆÆÆ ,À‚ÅC‡ 2äÇ/_¾Deggc3JÊÊÊ¡;vèééUVV¦¦¦:;;cÁеk×-ZD§Ó£¢¢B>>>ÞÞÞ7nttt´¶¶+,,ÌÉÉY¹råòåË?~Œºzõª››Û Aƒ>|ˆŠõòòêòß !‹‘F"è¬ZµŠ\‚IJJb®8áåþýûùùùüï–˜˜èêêŠ-IáïàÁƒ¼rMàÁ`0¼¼¼®_¿Ž¾ØWó#°éª´´´+W® „üýý [[[/_¾Œ200سgONNÎõë×ß¼yƒ­ÂÎÈÈÀÚmÞ¼¹  àæÍ›³fÍòòòJIIA<|ø011û ‡……!„f̘qöìY…àààÊÊJ[[[[[[„Pjj*BèÖ­[>üüùs||}útZ:>hР}ûöQ©Ôúúzqqñß^žÀú[úÃjÑ¢E‹-âÕÛoÅç†+W®d}ëààÀœ#ãÓ*''‡o¯Uè ŒD+ÐyúôiUUž@gÙ²e.Ðéô>iiibbbØŸˆ …òôéSÖÝÚ‚*,,ÔÔÔ™B$iÅŠ|*Ðét"‘¸páBþ ÃrBuÍ­[·°sŠ™Þ¼yƒ¥[ÿ‘#=„ÔàÁƒBŸ?îéŽtBLLl×®]xj*))aùº¹úöí›ÛɼXV&& ‰¢¢¢N¾|ù2[¤‚ƒÁ¸té6~ÃÄ 7di3 G@ €RUUE1sM ­~ýú-]º´Ój¸sçŸ 111FFF$‰µpçÎ ,xöìBÛB%&Öùа°0þ)&ø Ïž=ÓÒÒb-dhÄL³è ¤D%Ð `gÇGbb"ÿl‘®®®'Nœ`+”–––””\¹r¥µµõ† ø¯SF¤¤¤à †8Ñh´Ù³gçååq^bŽè@ÂKD:),Û"ÿü‘ <<¼¦¦¦Ójñññ¼®666vttpîi’‘‘177///?r䈆†ÆçÏŸOœ8QWWÇë>›7oÎÎÎÆßyVØIÁØIÄl°@‡@ `Ñ'@„À9:)lð ¼¼¼§;Ò ooo===þušššøo€:þ|KK‹¯¯/[¹œœÜ·oßv¼ï»wïŽ?nbb2gΜ£GržÝ7mÚ´.¯Î?~¼¹¹9ÛÜB¨££‹ä  %%Õé}Èd2–m §ììì®ù_6B t„DÏ‘6;vì3fŒ»»;¯ MMM\÷RÉÊʲþFŽijj=sæL¶(§µµURR’ÿ¦-^ ÏŸ?üøq ΫµµµØi<óVrrr–––=êB7À/3~üøžîøu Ð@Ha‰œ>}úÔÓá§°°0&&ÆÛÛ›µœœœ 6ð©Àëd?YYYæÆ«öövooïçÏŸÇÅÅihh°VËÏÏ···_¸p!–®AP...;vìàu•¹Oj-eeå[·nu¡€Ÿ„”¢¢¢œœ\cccCCƒ‚‚BOw‡»œœœW¯^uZíñãÇ|RD………ÙÚÚÊÊÊr^’••%“É¡¯_¿Îž=[VV6..Žsú™3g¤¥¥ùÇR|$$$ðÙ².P 6°á…ý²–––ötGx233[³f ÿ:ÅÅÅ|2a577¯_¿¾­­ëU™¦¦¦·oßZXX˜ššúûûs=‰çÌ™3999ž¯ÃéÊ•+Ÿ>}âß¹åjèС‚ÞÐã Ð@xa¿¬Â訩©uzbÍÖ­[Ëœù022º{÷.ëžvqqñ]»våää „$%%•”””””jkk±«ééé­­­ÊÊÊÊÊÊJJJ¦OÑ@xa¿Á÷îÝëéŽpÇ`0ÂÂÂúôéÿZzzº¼¼<×KEEE|Újjj~øðW”ƒ²°°¸rå žÜé¬ÚÛÛÏž=K"‘FŽÉviÑ¢EØ …RVV–‘‘QRR‚•:tÈÝÝÝÖÖÖÈÈHEEÅÙÙY ‡zŒè ¼° GÙÙÙ‘‘‘Bø³ÚÑÑqîÜ9>é«B/^¼Ð××絘:00×ê„PAAAmmí˜1cxUøô铱±1×=áü­[·ŽWºuWW×Ý»wS©Ô÷ïß‹‰‰U±¨¬¬¬ªªÊÉÉ)));pà€ Ïüzè ¼˜«sV¯^­­­=bĈží‰4sæLþuvìØqøða^ÁЇ‡ŸuÊ'NœÐÑÑáÕ6//oòäÉû÷ïï NNN¶¶¶\/õë×ÏÉÉ)44ôöíÛ»wï6lëU:>vìØ’’’+V ú\À¯SW¯¬¬,„©©)™Lvwwollìéý;wîñ©ÐÑÑÑ¿>Oêêê|ölO:uÕªU¼®^¼xQ[[O>QVoß¾¥P(NNN|ư٫k×®q¦Ö:þ|ZZšššŸswBFtR555ùùù²²² “'OÎÌÌ\¾|yPPŸi~±ÔÔTþƒLD"‘Ï#//¯E‹M˜0WWWW>7?yò$NçÌØÀÇ—/_æÍ›wùòeþkz&Nœ¨¡¡QRR’˜˜hccÃ,¯¨¨ØµkBèèÑ£\OýA‘Éäøøxü]=eܸqœ¹Õ@¯BêÙ³g câĉòòò÷ïß733{øðáÁƒ±ßZa°aÃþ›ºƒ‚‚&Ož¬¬¬Ìy‰B¡ÄÆÆ>|˜kÃÚÚZ++«œœ®QFûí·ß¶lÙ2iÒ$Aû¼qãÆNW.‰D77·ƒ^¹r…5ÐY»vmSSÓôéÓyµ­®®^»víäÉ“íø•^½zuêÔ)‡žîø Ð@H=}ú!4eÊ„††Fpp°½½ý‰'F%$ “ùç~b0ýõ¯Sv$%%ß¼yÃk‘rpp°¯±«S§N¥§§wšI”ÍçÏŸüûï¿ã©¼páÂ#GŽ„……ÕÕÕõïß!yïÞ=99¹#GŽðo«¤¤tòäIú~±®åD"JXÆÀlž={†bŽ L™2åèÑ£ cõêÕïß¿ïÑ®!„PSSÓ’%KøT R©Ó§Og[ÌËTQQÁ'¯ÅêÕ«÷îÝË몣£ctt4×"^îÞ½kkkËgá3UUÕÉ“'·µµùûû#„¾}ûæããƒÚµk×àÁƒñ?Ðã Ð@•••÷ë×ÏÄÄ„Y¸aÃ777!Y˜\PPÀ?ᨤ¤äÑ£Gyµ2e çR_LFFNg½“PUUżúüùsuuu333zûîÝ»ððp€¿ ¶$ùêÕ«¡={ö”––š˜˜ta‡ gA €0JJJBY[[³-¶ýÏþcbbRXX¸|ùr^¯1räÈÓ§Oó©°ÿþÏŸ?s½T\\ìááÁufŠJ¥.^¼8//Y’œœuê‰Dòóóhí3@@ €0Âæ­°:¬¤¥¥ïß¿?`ÀlarOtí¿¤¤¤ x]¥P(—.]âu– ¯íÙ555vvv¬wnjjÚ¶m•Jµ´´Ü·oŸ½½=ŸZl:::–.]Œ³>+ ‰¹sç"„¼¼¼h4ÚŠ+FÕ…ûz:#lD‡5Ð).. Ú°aÃÂ… ›››B'NœˆŒŒì©®Y³æåË—¼®vtt8p oß¾œ—²³³‹ŠŠx5TUUõóóc-!“ÉÚÚÚ—.]Š‹‹#‰¥¥¥Ø2m¼iÓ&¶Â¦¦&ÖMŸ>=...(((77—O STT4oÞ¼ÔÔÔ9_±¡¡J¥’H$AÏ_t:ØÔŒ”””‘‘‘©©éÀÿúë/„®®.gÐS°Óe¸ª©©yþü¹¢¢"׫[¶láÕÐËË‹ó,¾ææffT÷úõë%K–¨««§¦¦òß^~ôèÑÕ«Wÿà)Ò¹¹¹!===¶kõˆ‰'VVV&$$hhhôt_.°F¡cccóøñãòòò¸¸¸ƒ®^½Ûì“‘‘ÑÓ]û¯¸¸8>kVäååoݺÅõÐä5kÖ°ÎÁ±jkk›7ogHèP©Ô]»v9::úøøtzˆÎ©S§~|æÝ»w!ÖþÝÈÆÆFë;ü«ŽBÙÙÙfffMMM¬…ãÆëîÐK@ €ÐY´h‘±±1s'³¤¤$¶5º¢¢¢ºººG»ö_ïß¿ç³ÑZBB‚ëÆ¨÷ïß?yò„ë9™™™£Gæz·ÆÆÆ?Ž=:++ëÙ³gsæÌáß·K—.=}úTRR’5>>""âܹsœ—BBBœœœdddØÊ[[[íììâââ:ÈAÕÔÔØÚÚ^¾|™5Jøïß¿§P(jjj¡¡¡n¨T*g!™LnmmÅsÿ¦¦¦ˆˆ;;»L˜0!$$ õ455ûí·˜˜¬Ú”)Sètz\\öÖÕÕU^^>..nÅŠœIUýüü¦OŸŽ200زeKuu5–™ËÈÈhöìÙþùgLLÌ¥K—°ˆ§[þJ?tØú‰4mÚ´žî ª©©!\£„…B:t(gyXX׳Ÿ?Þ¶m› g “——7nÜ8<½:tèÐ!ClmmñTÆ#33!Ô·oßµk× ÔpàÀxª…††¶¶¶†‡‡‡‡‡c%¦¦¦‚ö“s– ûc¶··co täÈ‘§OŸnÙ²ÅÖÖ–OÂTzt ¥¥¥¬ó=eàÀYYY\/µµµikküø‘s-ðùóç©T*g:¾k×®~ýúq^=zô?ÿüƒ§KUUU>>>ªªªÝ¸˨5zôhSSSIII )))IIIæk IXauuõ¶mÛ:½9ƒÁÐÐÐ`•|çÎÖ@‡™kB¡p½ƒ@'##ÃÛÛÛÄÄÄÏϯ½½=99™3Á½:ˆ†Q£F•––fee1¢g{ÒÑÑÁë˜à¼¼<###Î(çãÇššš\wB©««s]ëãã³{÷n<£#—.]:räȇº+ãfUUÕýû÷±`nΜ9VVVøÛâ9¼çÌ™3%%%æææ†††QQQŠŠŠÑÑÑÆÆÆ ,4hú>FõáÃ,ÕFvv66W…m­ß±c‡žž^eeejjª³³3 ]»vmÑ¢Et:=** !áããƒ*))Y¾|ykk«––ÖéÓ§ËÊÊ¢££_¼xgNQ‹‘ ØìÕëׯ{º#h×®]7nÜàzÉÄÄ„kú-OOO,M)›Ó§O'$$p–ÇÆÆ¦¥¥q݈Φ¾¾þàÁƒëׯï®(§½½}ܸq’’’999ÁØØ¸[nË›®JKK»rå BÈßß¿°°°µµõòåË!ƒ={öäää\¿~ýÍ›7:::ˆeÑ‘ÑæÍ› nÞ¼YPP0kÖ,//¯””„P@@ÀDZ5=aaaX“÷ïßcÛÑoß¾}ñâÅèèh„×6zÑ@4`Ž0,F...ž4i×Kéééfffl…mmmódöööÓ§O3—Ù²š:uêСCÅÅÅù÷„B¡ôéÓçØ±cxödáA£ÑÄÅÅ_¼xQ]]M¡P´´´ø¤¹ølá]PP[…E‹ñJ†Âö[ñ¹áÊ•+Yß:88|üø±‹}@ÄÁˆ¢ÁÄÄ„@ ¼}û¶Çÿ!~ûöm®Ë;ª««çÍ›ÇÜÒÌ$%%õøñcÎ qqñÄÄDMMM¶ò´´4qqq<3tóçÏ¿|ùrwE9.\À&ÑTTT°€ò—„:ˆ99¹#FP©ÔììììNg0\Ó;”••9::²M!Ñéô£GrVîè訮®2d[yqqñüùó™§çñáïœ}²²²5jÔ§ÛüöíÛäÉ“oß¾ÍZXWWWXX(--=räȼ? ÇA €È077GßzŠÝµk×8Ëß¾}ëççÇYnbbÂõ¿U«V± µµµÙÙÙq®@b0+W®$“ÉÌ·³fÍ’‘‘‘èâg`!##ãæævüøqÖ´´4ƒabbÒéjh€ðƒ@‘¡££#//_QQåwìUUU\å£R©œ»„¸Î[mÛ¶­¥¥…­ðêÕ«jjjœáKQQQDDÄ”)S°,•d2YOOyšp—½yóæàÁƒaåÊ•lŸ;·?ˆ:tËňý÷ˆ¹sçr=ÙÔÔ”3UÂ?ÿüÃy¼ÍóçϤ¤¤ØÊW®\yìØ1Î;geeM›6m×®]Ó§Oß¹sgrrò­[·¸ž=ˆ…Bquu啨›„´—ôè JÆŽ‹ÂN‡ëŸ>}ÒÖÖf+¤R©7oÞ䬼~ýúñãdzêèè?~œm·ùÍ›7 ×5È™™™fff‹/~ôèÑýû÷CBB˜)œº¦®®NRRòÍ›7\7ÉS(”ׯ_‰Dtè Ð@”`΋/zª%%%œé<Ÿ={vçζŽŽWWW¶Y!ƒ¡¤¤Ä¶:'66öܹs¼Â—7oÞ`»ŸFõîÝ; …2sæÌêêê.tžN§oݺuÓ¦Mè{ÚKN¯_¿¦P(úúú?é¨@À/'# JŒ¥¥¥óóó¿~ý:`À€_üô††iiiÎi#%%¥åË—³–P©T##£ÌÌLiiiÖrOOÏ¥K—²’œ3'”»»;[‰˜˜Ø† ˜oÛÛÛ÷íÛ‡âsúðåË—ûõë—‘‘±dÉ’.D9---{÷îussÃßû“Z[[ ú,€Ð‚@уO´¶¶vܸqlÃ9oß¾=yò$[MoooÎc…wïÞÍ:þtâĉââbþO\±bELL ×Léü1ŒŠŠ ™W¯^áÏWÕÜÜœ‘‘!..Îyö@tA €èÁÇ3Œ_öPMMÍ   ¶ÂG±íÔ ®©©a-ÁŽ!îèè`-tqq9pà¯g•––^¿~H$ÊËË ÚÏ––– üý÷ß!Îs™ùxþüy{{»©©iŸ>}}(@hA €èÑÓÓSQQ©¬¬|ÿþý/{èû÷šØ /^ìååÅ|K¡PvîÜI¡PXëܺuKJJŠuÅqss³ŽŽŽªª*×Ñh4ggg^úuŠD"iiiqÍ&Á_BBBhòäÉ]{.@8Ábä^(==}Ë?‹;¯z”‚ªô½¿2ºÖ–@ L™2%000!!AOO¯{;Æ‹¯¯ïüùóÙö´÷ïߟ5oC[[ÛªU«ÔÔÔX븹¹±&[ˆ?~üx\\¯‰‰‰ùûû ÚÃÏŸ?§¦¦º¸¸ìß¿_ж¡ÄÄD„MÚ„:½Pyyy]ië„C{º#€§†ŠÖ×w?£¿º~›ÀÀÀ‡rÝòý3¨©©éëë³–|8³$**jûöí¼žâììÜ…(çÛ·oãÆ;~ü¸  1………ÅÅÅýúõ366îÚ ÞIAMÚdœû)¼*s›_ßýü#w˜>!dccÃçP<Èd2v+ ü\\\Ø׃^ D’‚‚‚¹¹ùË—/ãããÁÉõõõµµµZZZ¬…û÷ïonnf¾ dûÙ())‘––fF9UUU·nÝÚ¼y3¯§ùûû+++ Ô·“'OVTTüý÷ß]ŽrÐ÷@ÇÎήËwÀTWW¯]»ú¿Ìœ9tU/_¾Œ‹‹ûNrrr````` ³IbݵlÙ²ºº:ÖVÆ cÍú´iÓ&^i­ÚÛÛß½{gll̺â§S ãëׯñññW¯^ÅߊSssó‹/H$R·,ÐQRRâÜr„MtttOwü"°ë QeooŠgÛ¹ý3HII±²víZæ[&''7dÈfIvvöÇY›lÚ´‰µ +ŸË—/ Ô¥ºººiÓ¦•””DGG«¨¨Ô–ÍãÇ©Tª¥¥¥‚‚ÂÜ „ Ð@T1bذa555ééé?ûY666+W®d-yýúõ˜1c˜o7oÞÁZáÀÉÉÉØk:^QQallÌõ`›ŽŽŽþýû ´Ž¸®®nÒ¤I­­­£GàcððàÁ„££ãß l Ð@„988 ï¿Ó?UTTTkk+kɉ'æÎ‹½îèè777g­0|øð… 2+ïÝ»—ë‹ŠŠˆDâÁƒ¹.©æ:X•ŸŸ/--½lÙ²'Ožt$ WíííØtè• Ð@„MŸ>ý’@gÍš5mmmÌ·µµµ4™œH$¾ÿ~РÿÙèwèÐ!f«ääd___ÎÛVWWOŸ>=??Ÿ×scbbΟ?ÏZâïï?eÊ”÷ï߯[·®Ë‡Õ‹/FŒ¡©©Ù-7ta–––,,,ÌÍÍýyOimmµ²²êׯ³äúõë¬Çç$%%IHH0ß~úô‰uV !ÆuMeeåêÕ«uuuy=úêÕ«`NŠ555íÞ½{÷îÝ&&&]þ8l°›c!# ÷]W@T½ ¯ ðzÓAg „¶½²0¬‹D‰Dš6mÚ7"""ØNóëFÒÒÒ·nÝb-¡ÑhÌØK—.ÍÍÍeÎ=]¸pÁÉÉ {ýèÑ£ÊÊÊE‹qÞ¶­­ÍØØ˜Ï}EEE999?ž>}º²²rDDIJeË222XC®Ä`0¢¢¢B¿`ç GÀˆvOkÏ9¿Ü¦·}Hü™i)~S“c|@©›(LY;Ü`š`g®ô>3gÎD………ý¼G¼yó¦  €µdëÖ­XbQ„PeeåÒ¥KYWØøúúbóJ cÆ \sZݹsÇÍÍÿsoܸ±dÉ ÿ9sæ÷éÓ§£„PJJÊ—/_†Ú…³˜"Ft€PË ý¸êü`)óùª4*ã}BM󊢆 B¨ÿi‡:Ù‘Uo£«;½O/feeÕ¿ÿüüü¼¼¼Ÿ”÷êöíÛÚÚÚØÛÂÂB999æ±~ffffffÌÊYYYÆÆÆ}ûöE„øøx¶µ;˜³gÏ^¼x‘ÏC)ÊíÛ·SRRBvvv~~~\Wùü û÷ï£ïÁâ¯Ë5ƒÇ“'OØò…º  ¼¨-ô{[s‡Zô[b..MBQ¾Ñ™>—êd$ò}bÍÿ?–g7Iɉ°è°M»Ÿº4véã³ÚÄ3EåoÛšh*#úüæ;Bk‚"BèÙÓÚÒ}{¥¢uímtuc…YGõôE¥Þ* Ýü®ƒÎÀ&Èn-Ë|Q…ÚñzÒ5·ŒÊ¼f„¶•bqj½„,iüR »­Ú¿ò´U"‘èìì|ãÆ{÷îíܹóg<ÂÐÐpĈÌ·/^TSSÃNÄyûö-…BaØÜÜìêêš””4xðàŠŠ )))Î(‡Á`„¤¤$þ 711a.^¶lYiiéÂ… #""¤¥¥»åsÑéôððp„‹‹K·Ü°kæÌ™S__ÿèÑ£yóæÕÖÖ²±øq0u„WiZCkc»ýVm,ÊAIÊ’–‡˜;îä¹v!”U}e~:Ú1né}{¥Ü¸/çg¤RÈ4ìjIzCé«ú!& <5ŒK2éԄЛ¡üÄš6Ç.R_ÑzeaFjÙÏÐéÿ'ÈLçªNÿïÛ)ë5¦« „ “ëŒ]iŒVxxüããS…Ýÿ·àkÖ¬Y¡»wïþ¤û»¹¹±žhôÚµk«W¯f-™7o^IIÉòåËétzW?ÊÿxöìYMM––VÏÎ[­\¹röìÙ¡U«Va/‚–––¡¡!6iˆ½500x÷î“““–––––ÖâÅ‹GŽiffvòäIƒÝ-))ÉÕÕUOOÏÜÜ|Ó¦M=øÑèáÕÚÜŽRPûŸ¾«öUPå—ñ1öðiqIÄ$‰r%t'¨/k}XŽ]µÙ ¹6nœæ¸þb’DU£¾­íÍ_(!m+E„Ðò`s÷KÆ3ê;ý©ÛXÙÖð¹ !¤¬#g2{0óþúöJ¦sþ»èÄdÖ Ñs#„¶iÏ?c´ì¶™‘³Êã³ÅØéN•””|úô©¼¼üóçÏUUU_¾|©©©©­­­¯¯olllnnþöí[kk+…B¡R©t:ùcÆfüøñ***%%%¯_¿Æó\´¶¶²m__µjsŽlÖ¬YóæÍc^9räÑ£GB CAAó䌌Œ–––N×Mçææ–——;99•””\½zuáÂ…***ÎÎÎNNN³gÏnooï†ö=4Äb‹1xð`yyyÖ¬ƒVPPPPPÀ‚WKKK,jœ0aBhܸqjjj+W®ÄÎOJMMurr266fÎÆÅÅ-[¶¬½½ÝÝÝ}êÔ©‰‰‰ .üöí[Ï|<„L]á%.EBµ6 ö«öµè½ñøtkamI öâõÝÏAÞÙ¬HKðÐè·n‰IB8ã„ÐÈïk¢ §«dGV‘¿Rû*wžQ¼k{¤I$‘H$‰ø…BAݹs§[N fõáÇÇ3wQ½xñBQQ‘¹!œ5{eDD¶ª›œ:sæ çÝÌÍÍCCC™ðð²gÏqqq]]Ýoß¾YYYYYYmÛ¶5¿ÄkkkÃ6–Ï™3§o+##£ŒŒ Ö’‘#Gbç\¯^½:&&æóçÏØ<]]]´´ôáÇåå奤¤bcc7lØ€Wííí}éÒ¥åË—ûùùÉËËcQ‘¢¢âĉìp¿'N¨ªªÎŸ?Ÿõ>%%%7n í´{_¾|yõêÕòåË]]]uuuR~阘˜ææf55µ¸¸8Úwt:ùº£££ ¯[ZZZZZº¥‡kÖ¬ñööŽŽŽ622Š‹‹[¼x1[ÆS梽½}lllmmmII Fc[å]VVÖ-ý@DA „—´‚ø¬#úwÖ囤3IQLŠTòª¾,³Ñr‘:B(åFYݧ–šßBOÏI+ˆ«ö5cí&­ÀUoŽM|6Âf ‘Døòñ[YfãÔu𓼇!„H’Ķ&ZZ`y}yk~b Bèé¹bÍ ýó¾"„’Îû]C~°¶“+'²jòÚá!l²,rÏ{Å¡2•yÍ…Éu¡²× ý¿¯qß•[þ¦±µ©='ªzÂr 1 \“™™™]ø³`gTdggWPP˜˜ˆ%ûì.Øræ['''lçÓ§O‰‰‰§OŸÆÊ ƺuë,--ÛÛÛ/\¸˜˜ÈvŸY³fuz–1ƒÁhjjRRR*((`=ðg¸}û6B¨¼¼¼ÛWp8°[îcoo¯©©yæÌSSS‰´|ùr¶ /_¾Äk§¦¦JJJ*((¨««‰Ä°°°îZ¯ @/jæ ÔK'ž)|ZI£vôW—ž¼v¸ÍZ¡'g‹˜R)7ÊBÃÆô5cÐh×Áb’ÄÄSE¯üË DB?u)GeƒiJXM÷K£îþñ6éb‰¸QQC¦2¯9ùJ)¶Ó !”|¥´¯ŠÔH¥œÕ¡Ô€r,ÐQ%ïrH?áTanÜI91]¹Ïïš‹SëGÍøï–"“YƒßÆTwÐV+‡:íÁñ9º‰DâšàÉÝÝ}Ïž=ÝèMœ8‘y3¿•ššZ`` v|ƒÁ[¼x1BH\\üíÛ·œ‰«|8ënÞ¼9a¶BNT*U[[{ûöíÝÕs®8qâÄêÕ«ïÝ»‡rrròóóëÞGHKK‰lòÈËË;{ö,¶¼:00pèСÌ@!4}úô¿ÿþûëׯ^^^œm>|H§Ó—.]ºuëV„ÐŒ3$%%/\¸B$UUUmmm™3\ü;Á®+º.+¬òuÈg„Г3EØ:=HYYyêÔ©4-((¨oëááÁ<*ðêÕ« ¡/^°²B º.öPAvTB(åFYiZCOwç¿¿Ü7nÜèÆ{._¾œ¹àã÷ߟ8q"BèÑ£GØgÌ¥K—\\\‚——— kó‘#GÞ½{—Ï9¿%%%'N$“ÉÝØgVd2ùøñãD+--å „=z„•øðm?€:ô*!""¢¦¦æÇïfnnîì쌽Æ~n·lÙÂ\JB¥RwíÚE§Ó‹ŠŠØŽvttüÏþÃ뜢¢¢§OŸ²žÐÓ-ZZZ°¤Æ ËÊÊâÜe@¡Pìíí!k&ÿèЫ¨©©9::R(l½í2777nöz÷îÝúúúX& ævCCÃE‹ÉÊÊ>þœ¹¥ Ì Ð ·ÁÊ\½z•F£ýà­6mÚ„%—@͘1!D"‘»©ccc?}ú¤©©Éš¹лA @ocmm­««[QQù#÷©¯¯¿{÷.6*ãé陚šÊ`0¶mÛ†-»©««»té‰Dòõõ•’úÿ4« ÃÇÇÇÚšû)G²²²®®®«V­ú‘Ž1}ýúµ¥¥ÅÆÆ¦ººúÂ… JJJ\ǘ.\¸€Z¾|¹0/Ct/ø¯€Þ†@ `¹Ï;÷#÷!‰{÷îEÑéôG ><)))%%‰éׯŸ¿¿ÿÈ‘#¯^½Š¥»BUTT 0€ë9¼¯_¿ŽïӧϦM›~¤W˜ÜÜÜñãÇ”””äåå=yò¤Ó”ŸÙÙÙÏŸ?ïÛ·¯››Ûw *`{yïTšÑà•ÕÓ½<µ6þè¤óæÍÛ¿FFFjjª¥¥e×n"//e½&‘H©©©2dÈŸþ‰jkk“PVV&ÌÁ›ÈÈÈÍ›7çæærŽ—`ûƒüýýq>šO·+++ ÓÓÓ­¬¬"""¹œšÍÕÙ³gBîîî¬;˜½:½™™Ù±½gzº òòò?ïæÒÒÒ¿ÿþûßÿ}úô退€®Ý$ @[[Û‚J¥*++#„† 6lØ0„ÐÕ«Wß½{÷êÕ«óçÏ3A¼{÷.,,Œ3Ê¡Óé:::‰‰‰87:EFF®X±"33SEåòx”––þþûïÙÙÙçÏŸ_¿~½@Ÿ¥¼¼üþýûâââÝ5kèôBjjj°u,_¾üÌ™3111Ì‰ŠŠrwwG9;;>|øÃ‡$ÉÕÕ!ôòåKwwwfº«ÖÖViiémÛ¶±ÝJ¥úøøz{{ãüßäÇ7lØ`ooöìÙýû÷c…/^LOO?~ü¸³³sLLLR~ž={–F£Í;÷ü§A&“£¢¢~öSÀâuÂè} Рw8p »»ûåË—?Ž-”···ŽŽ…Byÿþ½¾¾þöíÛ™ã(7oÞDa'&3 //¯©S§bg²*--¥P(ø÷r·´´xxx>|ØÑÑÑÈÈè?þ——755­¬¬Ü»w¯””” 9˜ÚÚÚ7n„uëÖu¡¹@äää,--ÙRV!äääÔ]ûþ€ƒ@€^kíÚµ7nܸ{÷îÎ;ÕÕÕm>~üxìEQQ‰D:wîÜðáà †¯¯ïׯ_×®]«¥¥…*//ojjb͹jjjjllÔÖÖÆò-à´~ýzKKK,0š9s¦©©©¯¯ïµk×LLLí<«³g϶µµ9::êëëÿÈ}ðPVVî–ŒÝv]Ðk©««Ï;—N§=zTжÅÅÅ'OžD}øðH$¶µµijj„¨¨¨øøøgÏža‘ƒñìyw޳gÏžS¦Lét'(((ýTè   pFŽinnÎãñŽ=*øYVVVEEE111åååX,¶¸¸øëׯ9rä7bbbø~9<ÉdŽ?>..&Úù-L&óÇ‘ôôô¯_¿æææ———WWW———ÿþ½°°†¸w‚ÂÂB???,{èСÎõ€‚‚2@… ÊÀÇÞÞžB¡DDD@·›ß‚ È“'OÈdò–-[‚ƒƒa‚œaÆÅÇÇoÛ¶­®®îĉŠŠŠ°qMM 5¤ÿœœ8™ùóç:´eG$)а°°€—ÙŒ'Np¹Ü+VŒ?¾s=    Ððr”ŒŒÌÎ;ÝÝÝ¢££›>A .p¹\]]]YYÙ 6¬]»öþýû11±ÄÄDiiiظ²²rüøñ›6múí4jkkÝÝÝ•””’’’ø²z‚œœè1ÝûË94 ZúPú8ÆÆÆh*¿Tè @ÊÊÊvîÜù§gò{„ÙÛ‹Åüüüà}}}ƒ1xðà½{÷º¸¸@•“––&''G¥RÝÜܙâE‹æÎK§ÓEDDzTåöîÝËãñ,,,:‘@¨‹”——ïÚµkÞ¼y½<.J‡ˆˆˆ022B…Îß*t ™™™üôù(} Azí>K¡P>leeuàÀ¥K—¶ozðà“ɤÑhBBBsæÌQTTäñx?vqq)..†®9?~411¹uë–ŒŒL;]Ÿ>}Z]]ÝÜÜýÓS@é%P¡30¡P(:::z(íÑû¯’ÿüóϧOŸNŸ>ݾcò»wï†êééI¡PfΜyåÊ•‡’H¤ 6ÈÈÈ@±¢¢¢ÚNŒUCC…BÉÌÌ—Ë2eÊ“'O$%%[žëã㣩©YPPؽ{7‘Hìñ‹ùÙ¶m›ÍÞ²eˤI“zyt” —˶°°pvvnöŽ„ HTTÔâÅ‹UUUýýýûà *tPPþ.$$$`”]ii)\\ÜÑ£G—,Y¢©©ùõë׈ˆ*•ª¦¦–ššª   ¥¥¥««ÀápM;|õêUPP`É’%yyy½P!¼-¼½½ÓÒÒ†Ú¡Ôˆ(((¿‹ÅFEEùûû·Ó&++Ë¢–[A… Ê_‡±±ñœ9s˜LfSVVV–——W~~>Fc³Ù±±±uuu»wﮩ©ÁãñÖÖÖ-+XåääX[[4   Ð;îÆ­R\\|òäIÀ… ø•AQPPº óîÝ»ö¬^½úÝ»wžžžüru}„n¸+566ò·¡Ñh}í"QPPšáçç7hР˜˜˜7nÀ=zzzÍÚ0™L6›]]]/''·nÝ:þ¡ØØX]]ÝÚÚZ•´´´^v7n ‚ æææ cíÚµóçÏÿ³“AAÔ××·sÔÃÃ#((HEE…Çãñ‹Ã´¤±±‘ÓY¸\.—ËíÄÌ»u… @¸yófIIÉÏŸ?ÇŒ3eʔɓ'ƒ_Á¥]ì¥'‘‘ñöö^³f½½ý¬Y³¨Tê¨Q£”••ÿûï¿f-9N@@À’%Kp8‚ """±±±{ö캸ŠÃb±Ú¹- ȉ'ÒÒÒäåå]]]»Ø J«´#t$%%mll"##CCC}||ZmÃápðxü÷ïß;:4‘H\±bE§Ýþº$tÉÈÈÐÑÑ©ªªjº_\\|Ó¦M{öì¡P( ƒ@ 43꣠ üq/^ljjz÷îÝuëÖÅÅʼnD##£VsÇÆÆúûû«««¯[·nÏž=...]Ÿ‹ÅºqãÆõë׺ÒÏëׯ===q8œ¿¿?š8¥‡hÇËxðàÁ€ØØØ#Fää䨨¨4kP\\,..””ìè0‹• ‰_¾|i')F{=tâ›Íþúõëüùó›©@mm­§§§¢¢âŠ+RSSQ•ƒÒgY°`Áè_L›6­Fö(gΜQTTÌÊÊrttèëë·ÚLTTÔÔÔTLLÌÏÏÏ¢ëãr¹Ü   ©S§fffw¥«Ÿ?š™™!²oß¾iÓ¦u}n(((­2lذ¶‰ŠŠdee÷ïßÿõë×–î+rrr\.·®®ŽÇãa:ˆ™L8}útçfÞù°eË–ÊÊʶp¹Ü‡ÆÆÆ¦¦¦ÊÊÊvº1 JϱqãÆ×¯_ÇÄĘššR©T‰ô§gÔ«ˆˆˆÜ¼ysþüùW¯^1c†±±±°°pS¯;t¼SVVVVVî∂„‡‡Ÿ~ü¸˜˜˜““SUUÕ¡C‡$$$\\\*++íìì0Ì·oßþûï¿7n,_¾œ¯Ã›ÍÞ·o_``à„ ž?niiyÿþýñãÇ¿zõjóæÍ¡¡¡*** eeezzzƒŽŒŒ,--?>@((( sæÌ°@#öM¯~lºÑÎ!~'-ð1™Ì/_¾2Ÿ… ~ûö­åþØØXøP™5kÖ!Cé ¥GÁb±3fÌ ‘H î122ÒÔÔ<~üø‘#Gš¶<~üxMM„„D«ýedd>îË—/;=g>:\.—Éd¶ó†daa1xð`ÿ¡C‡¶Úæû÷ï3fÌðóókç•®-tuu‡N&“ëëëQ¡ƒÒmÙ²åÀ.—»yófooï±cÇ>|ø®ÐÚÚÚ†††ubX=ª©Å¤Ù6 ­CM*Zí¤C3¡R©¹¹¹­jllär¹üå%QQQxÃãñLJ±WBBB&L€Û$iÖ¬YÐ/XXXX__ŸL&C×½“'Oâñx¨ 0 ‡Ûµk×ìÙ³eeennnëׯ‡ýøùùÙÛÛÃP iiéû÷ïÃm77·7|}}uuuY,VS™ÒTÍ4Ý߉?P'ÈÍÍ]¹r¥ -­­­###£££MMMáW~~~ll,¿ÁÖ­[{j–((æ¦ JKKKIIAäæÍ›¥¥¥Íâ0Œ’’R;Ú ¤¤¤Uqß§ÓsæÓy<¾½s¥¥¥¹\n~~þ«W¯f̘¡¤¤Ôô(Ç«¯¯4hPmm-,kÜ!„„„$%%ª««ÛŸ JGÉÈÈØ¸qã‹/>þŒ ˆ‰‰ ÜÃá âãã+++ 6nÜÈ·Cëè脆†vb,!!¡ÔÔÔn›úÿÓLµ”GÍ>2Œ™3gÖÔÔ())ihhÄÄÄüøñƒß?Û)\ËÛ"""Û·o‡Û *€°°ðš5kà6™L666†Û+W®|úôéñãÇ<¸zõj<O dddø÷qqqmmm¸M ÆŽ ·ñx¼¢¢"Üþòå‹¥¥%—ËݵkÿÔ100 “ÉÑÑÑÆÆÆ»vízþüyVVVll,‘H|úô© ÌòâÅ ¾]uÁ‚ùùù$éÞ½{ fÕªUt:]QQ1::úîÝ»GŽár¹pAÈÚÚúÙ³gðt ˜8`úôé)))d2ÙÌÌl÷îݽ&þPú;,«°°ÐÈÈš¥0 ›Í^ºt)2mÚ´Þ¯ýò[:iH&‘Hd2F‹µŠ¸¸8—Ëuww_¿~}Ël:,KLL¬¼¼¼¢¢‚Öqðx<›Í2dHË€/”.RRRR[[[]]=bÄÿõA¸¸8IIÉ#F¼~ýšïpóǦÛ6X,‡ÃA%!$$D$áÏVXXXDDDTTTLLL\\\BBbРARRRrrr111Ÿ?®¯¯ÏÊʺ~ý:¬çÐ]‰±Xì²eËbccOž<éçç§  àããƒÅb;´¦›ŸŸ¯¯¯ßØØhbb2`J=\¼xñÇ5557oÞ2dˆššš¥¥eË@\sss‰Äd2aþ4&“I&“ÍÍÍ|2€±±1ÿtKKËŋ޾}«§§7iÒ¤‹/^¾|¹·®¥Ãf³…„„’““÷îÝûæÍ “““3tèÐøøøf-ùo)}ŠN.‡À÷99¹ÚÚÚ¦ûÝÝÝŒŒ*++555“’’ÔÔÔ^¾|9nܸÿþû¯i¼ƒáp8.\––îÄ覦¦Ã† khhèÜäQPøÁߪŸŸŒÌËË B¥Rõôô<<RSS[zkvîÜṲ̀% ùùù2 ÊÿqõêUøuºsçNË£JJJ½¢¢‚ßFOOoòäÉmÕ§HHHè‰]__¿ýê©((¢}«ß¹sçÎ;[Ò××ç§×»}ûvttô€)x¢®®¼zõêàà`&“yåÊ•½m ¸¬ûùógƒòòò©S§†…… $• R©ü¢c¿åâÅ‹AAAjjj‚ܺuKZZºÙW”ï Ú2ORR•J¼}û–H$¶ƒ‚Àb±111Ë–-kùE:x𠇳³³;wî\EE………¬åÒ7S“w^è466Z[[“H¤ªªªgÏžYXXhjjÈÈÈàû2?~<33³®®.**jýúõæ¥ÛÉÏÏGdÉ’%mÅ=À¡›¦ÌðP³ìÛв)æææ0«UvïÞÝé‚A(RRR¿Bhhh022z÷î]VVŒÐì›tØôoTWWkhhœ={ÖÅÅeÊ”)•••Ç_½z5¿·²²zõꕌŒ º:Š‚ÒO1bÄ¿ÿþ«££Ãd2—/_¾oß¾N¤÷ì_¿~:uêµk×ðxüåË—aíˆÞzàS=ùûûÄ:((í0a„òcÏÊʲ²²7n\_.ôÔ±…–‚‚‚#Fܾ}{ÇŽuuupgVV–––VLLÌ­[·êëëÃÃéTêëׯ‡Êf³Y,VL„‚‚" ¢¢¢<8w‹ËÕ«Wÿý÷ß7n¨ªªö܈<ÏÝÝÝÃÃÃáHII…„„¨©©õÜpžžžÐÝ'((hìØ±]/Ί2°Á`0ÿþû¯€Ö¯_¯¥¥%HødxxxËÚæí0dÈèø‹Á`ÌÍÍ9‡ëè;O„NNNÎèÑ£—-[ÑìPyyù‚ Þ½{¨££.%%º/Ï ÊƒÁØØØèë뛚šæååÍž={çΆ…wˆ´´4 X+jïÞ½D ß]§oæ´Dé›°Ùl,Û¡"S»víJOOo?°¼®®.22²£“ÉÌ̬©©ÑÔÔtssÁ`0<¯…ŽŠŠÊîÝ»[ªHyy¹¡¡a||ü“'OÚ*n…‚‚Ò=ztRR’»»ûÙ³g/^¼xóæMggçµk×v—)))qqq¹}û6@^^þÊ•+ZZZÝÒ3 Šàäçç×ÖÖv(ÆùãÇ)))ÒÒÒ mµù;ƒÁ…÷Ú)¤Õ‚úè|þü¹¸¸¸ý”á>|X·nœœ\çêþ   ôq‚££cRR’––V]]Ýž={†jaaQPPÐé>y<^LLÌîÝ»UUUoß¾M öíÛ—ššŠª”?˜1c·[ñyòäI;*@ê{÷îí\N/A_Å”””öìÙÓ2kP3BBB<==mllú`nD”na̘1‘‘‘¯^½rwwóæÍ½{÷îÝ»§®®¾zõj###"’ÜØØÀb±&&&§N0Ap_†F£…‡‡ÿéY ´G'þÞ¾}ÛÑSœiÕ®ôáÇI“&}ýúµ¡¡¡¸¸˜_8¢%C‡•““kºçû÷ï³gÏÎÏÏ :þ<€ÍfwÈ1F ¡Ãårq8ܽ{÷i¼ÿþy󿩍¨H$ÁçÑiЮV)++Û¶mÛŸžJ{ô÷ûììÙ³gÏž››{þüù   ”””””;;;555--­áÇËÊÊ*((HKK s8œººº’’’ŠŠŠ²²²”””¸¸8¨oÇ·±±Y»víÀø9‹ˆˆÀøŒ?=”öÐÓÓCãøZ•JjjjGOLOO/(( Ñh0ΜÍf744àp¸ïß¿+))ÉËË{{{Ž=zâĉ±±±VVV­¬´µµmæ,ïáá1iÒ$@bb"‚ OŸ>ÕÖÖüv!Ðùøñ#‘H,--¤1›ÍÞ¼ysrr2“Éüm¼ÕŒ3šeRnŸ¦F¥RåääÐojK† S ôe¶nÝ:¾½T*ÕËËËÕÕõæÍ› /_¾ÌÈÈÈÈÈäÜ1cÆhhh¬Zµjîܹ=<Í^EVVöÖ­[z((N§3™ÌN”DÄ×××ÅÅåáÇoß¾500˜9sfQQôAÞ¶mÛÂ… wìØÏŸ??;;[ÀžáâhLL ,5¨¤¤´|ùò'Ožp8aaaAzH訩©ùúú 8'@jjêíÛ·ÛIZyñâENNŽàÝòQUU%“Éééé$‰N§w¢‡°°ðâÅ‹ÿô,Pþ"„……------ùï¿ÿ?|øP^^^[[[TTTTT$$$4fÌQQQ))©±cÇjhhÌ™3§w}QPP§ªªêóçÏ[oöððX»víüù󭬬<<< ~þüyêÔ©ììì?~<|øÐÓÓ“oÚ...NMM•@¤®®nĈyyy ¥¥¥d2‹ÅÖÖÖÊÉÉeff²X¬-[¶èééq¹\0räÈ€€¸-Èz Pè`±ØŽº&]¹r¥¡ƒÁ`°Xì¦M›:ÔgÓÓ ¥¡¡aÀTRDA`0þžääd]]݉'˜ï((yyù»wïvî\‹eiiùêÕ«K—.:uŠÇã)((„……ñ ±X,A>~ü¨¦¦&++K$ „Á`$$$äääÈd2´R±X¬ÿþûo„ Û¶m³·· ³Ùlƒ!$$D$‰D¢NDèüÞ_o–wü·$$$TVV¶e¥†(|ga±XX,¶  ÀËË«C³BAAéeà ¤­²¾(((}?~túÜøøø+W®¿{÷nøðá åÁƒ))) £¢¢¢  àË—/ñññ²²²aaa“'O®««2dHvv6ƒÁxóæÍû÷ïBBBC‡õ÷÷Ÿ>}úªU«Øl6N'$)))iÛ¶m°´”€Öÿ߯è$%%ÉÊÊvÈ“Àápž>}jjjÚêQ“… È“'ODEEËÊÊÚJ•ˆÁ`fÍšÕtOee¥‚‚™L¶··‡¨‚0ŒžÈ]†‚‚ÒE ÐAc0QPú ¿ ¯nŸýû÷466Ž5Š@ ())III}úôi„ iiiêêê0!¡ººzNNÎŒ3X,VDD„‘‘<ÝÇÇG]]½¼¼\ZZZ[[{ýúõ)))cÇŽ…+:aúôéüF“xý¾Ñ¤I“ž>}Ú‰« kj½***4hPaa¡”””´´t\\\AAÁ†  ÃÉÉ©ÕQB³:‚ååå©©©†††«W¯®¯¯ñâ…¾¾>NGµ J_VÀAWtPPú ]:ÕÕÕ{÷î½}ûvcc#—Ë5j@LLŒÉdŽ7ŽN§S©TØRJJ :Ù46WPPhll¤P( cäÈ‘\.wܸqðáÞÌsdJ¿: ¥‘f€ðððââbçîî>tèP¸úTQQ‘ŸŸÿöíÛãÇ–$iÛ¶m®®®‚t;|øp¸áååehh(** Íx(((} (tДþB‡jQµÊ;w6lØ ££Ãf³9N³£X,‡Ã1™Laaa,›žžnkkË?:jÔ(XÐ üòrá{á4‹'ïæðòÎ :¾mÛ¶ˆˆeeeKKËäää{÷î»»»———óx¼ãÇ{{{ÃÆ’’’Ož<‘““ËËËSRRúüù³ŒŒ ›Í®¯¯§R©°ÌÖ·oßÄÅÅÓÓÓ.\¨¦¦ ós¸¸¸”––Òh4"‘ˆV×BAéS >:((ý‹nI{±}ûö?’Éd¸ Ãï3%%E]]#4Çïëë[^^Àãñ–––ŠŠŠ\.·{C2#t`î ´´´ÎõþôéÓû÷ïoݺ5))iĈ€U«V­Zµªi›ÿýwâĉ,‹Çã >¼¬¬LYYYAA‡Ãq8qqq £¦¦ëÅ744ܺukÇŽ° 1ƒ¾ÉU9((} Tè  ô N0ðÙÚErss ´bÅ ›)S¦ð÷1ÂÍÍíñãÇIIIÒÒÒ©©©—/_ÖÕÕUPPPTT”””d0Ýžxâ7B‡Ãᄎz"7e÷îݺºº¶¶¶ªªª\.·²²200ÐÜܼ¾¾^ZZ:%%e„ cÆŒ5jTffæäÉ“‰Dbaa!‡ûñãGNNŽ™™'“'Ož2eʽ{÷8”>l6[XXøôéÓJJJVGAAé9P¡ƒ‚Ò÷a³Ùx<‹ÅÒh4]]Ýné“Á`ÂDD"A7oÞ$''ó]m***£££—/_ÞØØ÷÷Dz­ß£Þ;=@ii©ƒƒƒ··7tÆb±‹-"“ÉUUU#FŒ¨¬¬œ|¸´´´¬¬¬œœ‡SRRb2™T*ª9~xX •@ àp¸áÇ“Éd6›Íår›•a0ƒª”¾ꌌ‚Ò÷¡P(ÐltùòezøðaArñu--­—/_?~¼¦¦¦G=OSÿHy IDATzCèðx|øsEkjjÂx+”þº¢ƒ‚Ò/ P( ,”””ܼysãÆ222·nÝZ½zõ¥K—ïÊÃÃãùóç?þŒˆˆpvvž={6@ÐÐÐ8~üxUU•½½=´ÞôœSN3ÚtFÆüA9sæÜºu«ëƒEEEEEE={öLII‰H$æææ¾ÿþçÏŸüaaasçΉ‰©­­•€åIÑ[$ Jÿ:((ýh½jZ¥ ªªjݺu0+ÞéÓ§a!ªßRUUðóó[¶lÙÒ¥K> • >>^[[»—oí­'{xx@'bGGÇnòåË—þþþ/^|öìYS•ÉÈÈøô铲²²¨¨(š¥¿ƒ ”þN722j¹ÐräÈ6›}âÄ û)--„„„ÈËË+))íØ±ãáÇû÷ï?~¼™™‚ Ín\.—F£ñ#Ì»6…F[µj•¾¾~EE…’’Rbbâ¬Y³zÔÐ.""rôèÑ’’uuu¾› J¿õÑAAé/@ëÕÂ… ›í///‡iý&Mš$H?¡¡¡t:ÝÚÚðåËSSSww÷¬¬¬ïß¿‹ŠŠR©ÔiÓ¦ìØ±ãØ±cÁÁÁYYYЈïÝK›waaa•!C†L™2%99yÚ´i¯^½b2™OŸ>íþ¬…x¼¥¥å—/_œœœ>~üà2EAAé× +:((ýh½j¹ÿìÙ³\.×ÎÎNN~üøqëÖ-==½Ñ£G·<Ê`0òòòÞ¾}æãããäädff¦¥¥%,,îîÛNHH¸zõ*¬UÞ´·ž ­W‡óîÝ»óçÏLœ81++ËËËkêÔ©ŽA$ÓÒÒ^¿~Íb±=zdee¥¢¢"""²wïÞâââ‹/r8A”””ºá‚PPPú¨ÐAAéG ‹‹‹·ZÂÝÝÇÛØØÒOnnnxx¸¹¹¹¬¬l‡&’’Ò¡ö‚ОÐVVVž0aBÓ .d0/^p &“Y__Ÿ™™™œœl``páÂ…ìììúúz …òòåK4©1 Ê€ ÔG¥¿Àår[µ^¥¥¥ýûï¿6l P(‚ôãííM"‘ôôô:4:FëP{Ahïî÷^5Û_^^îêꪩ©¹hÑ"‡)--%‰Ó§Oš9s¦““ÓÕ«WõôôdddRSS[¶çr¹õõõÝn¨CAAée`*tPPú L&ÓÈȨÕú>>>bbbkÖ¬¤ŸŒŒ À¨Q£:4zOßõ„֫Ç7ÛáÂ{{{{{û¨¨(A†¹}ûö±cÇæÏŸûæÍ›7oÞðíÝ»÷èÑ£222ƒ–‘‘‘••UTT3f̘1cÆŽ 艢í(¿…N§ß¼y³{ûÔÒÒÐieÀ€š®þ*a±XÝÛ'@@…ro",, ÐÕÕ kvèñãÇååå–––W®\ùm?ååå‚À:ÜÍ RRReee-544tjÖíñ¡C¡P”””ÔÔÔ 4ãS]]íççgcc£¡¡!H¡K—.8p`ïÞ½±±±-Ö×××××çææ6ÛÅboÞ¼¹víÚßöÒíÐh´toŸD"144TKK«{»í8N³R²(‚€ ¿Šüüü)S¦toŸ , ìé“(MÖ«–B‡Íf_½zÕÁÁAG¿ªª*ƒÉÉÉáïÁáp»víÚ¹sçˆ#ètú—/_‚ƒƒÏœ9Óô¬?°¢]gV­ZÕLèÎ;geeeooßÒ¶Õ’ŠŠŠ7nXXXŒ?þÓ§ONŽÇãYYY-_¾ÐuIKKëöï@"‘V¬XÑõ~jkkØLæòåË>|ا´‡ÃÉËËûm3ŸY³fÍ›7¯i ”ß‚ ö‰ŒŒÔÕÕ`+ÝU$®ÅÄĬ[·îæÍ›ýTëdffŽ3¦MžÉd‰Ä–U½ýýý8`aañ[¡#–’““ªªª...sçÎår¹oÞ¼™={ö”)S>|øÐì¬? tÀ/ëÕ¡C‡ší/((^»víÈ‘#¿ÿþÛ~<==·mÛ¶wïÞÍ›7 >¿šššââ⎺m÷¡¡¡‚ïâãã§OŸ~éÒ¥~w;£P(Ý’;777,,LTT´¾¾¾¯iªª*'0wîÜ»wïöZ‰–À_+tJJJ\]]Û,>>ÞÓÓóäÉ“½0«ÞA^^>::ºëý|üøqÕªUx<>::ºojWW×–R ¹¹¹;vìX¶lYï̪ë@ëÕ¢E‹žüV8v‚ß h½Z¹reK¡“””´aÆC‡ 2¹ÌÌL]]]qqñöe`3zBßu/zzz°âk« ²wï^@vv¶©©é±cÇZMQð—pêÔ)@Ô:ÁÁÁí4ðôô¼{÷.‡ËÊÊš3gιsç1Úö4ÕÕÕ………¦+Ei WWךššžèYFFfË–-í4xüøqVVVee¥±±ñþýû÷íÛ×ïÖ}{‰týúõ7öM­Ø»wo;SJMMŠŠb³Ù§Nzÿþý±cÇDDDzszZ¯H$ƒÁhv(""¢¸¸ØÂ¢¡C&“UUU Œ#""¦NêäädhhˆÁ`  “É‚´:=±ú+s%F355mi½øúú,_¾üÎ;¿í§¢¢ ++ÛRè,]º´iÅÔf£÷ñ_þÈ‘#ÛIè ÿ fâĉ>|Ø·oŸ©©©ÝßiþÀáp}VëÂÖ­[óóó###-,,^¿~}úôé?î=&..®££ógçÐßñññ類EEE Úiðþýû¬¬¬™3g&$$œ:u*!!ÁßßðàÁ=4Ÿ~Š’’R_Ö:K—.mG»p¹Ü¨¨¨qãÆåææ>þ<''çôéÓãÆëÍv¾õ*44´Ù!‡ãïïïää4}úô„„„VOŸE&“¹\®µµµµµuffæõë×üøàr¹-ƒ§$$$ž={¦¬¬ÜtÍ‚H$zzz–””4mI ÜÝÝŸ>} 3ר««›˜˜ØÙÙ566vûUt@CP(*•Új)&“yóæM---99¹¶NŸ:uj}}ýÿýgmm ÈÛ·oUUU¯_¿þùóç¦ÍZúß ÔÈ_kÆ` f,”n5cý ô}3\˜áñx£Fòðð(.. 566F>1Œ††Æ–-[|}}KJJ¦M›Æãñš¹æ5ëVBBÂÞÞšz***0Xû>0£B‡Ÿ9°Õ£° „„„D«G©Tê!Cäåå¡A‹Åþøñ*¾ôôt6›ÍwÄ ãÿoŠwE‡50@£±Pº4kÀÓ/¢±°X,G„Á`,Y²$$$DJJJYY9**ŠÃá$''ûûû[XXÀuþS›ÍfÃË—/«ªªnݺ5''‡Ãá$&&øIõ Sv}·;¦!Ú‰½j¿¢¾¾>‹Å¶ÌòÄ`0¢¢¢„„„ îéפö¹qãFTTTKo¡åoŽÆH ÑX(Ý5àéûÑXpý&//N§.—K£Ñ¨Tê¨Q£×®]ƒÍ”••á¬å‰ÃáâââÖ®]ûòåËÍ›7üøÑÏÏOYY™ï\•™™ 7ÒÒÒ†?~ýú•ÉdvcH]Ç„…B5j”ººzËCí µk×¶óË455½sç\1jUèô²æÈË˳³³[³f ”œ½jÆ f,”n5cý ôY3‚  ¦¼¼œJ¥BKÖ—/_`æ—Ñ£Gc±Ø/^À–§ºº0räHwww[[[IIIMM͆††¦ò€D"%%%•••%%%ñwM:õèÑ£UUUüø$ÐZˆRGé˜ÐÁ`0wîÜÙ³gÏ AƒšjGè¬^½ZCCCRR’¿‡L&WUUñ?666®]»ÖÏÏ ªª:cÆŒ9sæ,X°q6nÜØ¡Iv(6³²²,,, íÍÑ{ÍŒõíÛ7¥9à‰ŠŠºvíZ/¯u—«ße ù{è}R_0cõß@§NP[[ÛÒ›¢Gé›f,¸QXX “Él6[EEåÛ·oéééÍ|qðxü§OŸ¶lÙròäI###OOÏ3f ØzzzüCL&“Çãzô¶©¯¯÷ññ™?~LLÌ©S§ÎŸ?/!!cZªƒáŸÛeee¢¢¢]BuXèàñx¨l¸\®žžÞãÇËÊÊΞ=K¥RÁ¯ SSS''§ðð𢢢#Fð{@¤¬¬¬YU,+&&fiiÉ×4ÆÆÆ4MHH¨ê_=_è988 ÇÅÅ™˜˜9r¤´´´wæÐ;f,ƒáãã3iÒ$GGÇlõ‡_˲²2‡‰'zzzöÚm«ëf¬?~xzzjhh÷² ¥}x<ž¿¿¿††ÆæÍ›aˆlïðgÍX</..nÁ‚kÖ¬ÉÈÈèµqÿX,¶¶¶ÖÛÛ{Ñ¢E/^ì¡÷­Òkf,vîÜ9*•zèСv.–¡ä›“ cò‚ ÄÄÄ\]]ayæ°°0'''¸ö###è_¾|yòäIÓÞ˜L&›Ínÿ{;lذ¸¸¸‘#GB7 ®Ðù€&"‘ˆÁ`*++‰D¢££#àüùó #99988øèÑ£†††<j Hvv6‰D’““ûô铉‰‰¦¦fDDDUU—Ë1cFmm-ÿVž‘‘1~üø¬¬,ƒ‘žžž——WTTôãÇšššÆÆÆž[Q„BGHHHBBfkعs'üø±¾¾¾»»;´Aö=jÆ‚ÿÕ’’’t:ýÒ¥K'Nðiܸq—.]:~üø³gÏ®_¿´råÊ 6ôBþÆ^H*…Îüùó±±±ŽŽŽçÏŸwpp°°°h™õ”Ëå666ŠŠŠ~úôÉÅÅeĈçΓ––<þ|Ó¦M.\@DTT´ýAáãõÍ›7NNNgΜ9ÖÖÖA~þüYUU%''ÇápºËžÓÉ^***~þü©¯¯_UUE¡Pµµµóóó§Nêíí­¡¡ëš&%%M›6 ÇÇÆÆ>}úTIIiß¾}4 ‹ÅÂ6üß”••ussãÁãñÜÜÜÞ¼y³iÓ¦%K–Œ7ŽH$®^½úرc“&M*))a±X\.—N§ÓéôV'YWWוh—fbBQQ100pÿþýû÷ïöìÙ¥K—‚‚‚ø¡t= 4c=|øðܹswïÞ ægjb±X,KEEƒÁÀ'åo7à6ôVÁ`0“&MzôèQZZÚ±cÇž‰ˆˆÌ™3ÇÆÆ¦iFÐ[·nݼy³  €Ëå:tîܹÇ×ÓÓûï¿ÿÓ§OOII!“Éfff»wï†_9wõêÕÛ·o—––*))Y[[ò'óæÍ+,,ÔÑÑy÷îƒÁPSS;vìÿ5©­±~;ÃÎÁãñèt:ƒÁ`2™ÍþmöÐJHHœ9sæÐ¡C¾¾¾^^^[¶lqvvn«vA÷ÍXS¦L9rä4cÁ/ƒq+8Ž¿Ñrg3à~جi›¦çÂ×Q))©Ó§OÛÚÚž:uÊÏÏ/$$$44tåÊ•k֬酫æóæÍ.— ï¼_4ÝnúAfÍiÖ¬´´ÔÕÕ•D"ÁöÐÆÍãñ´µµŸ>}úþýû'N|xÆ |7\&“I¡P>|øàìì 8{öì„ rrr¤¥¥¹\îÂ…  dllìççG¡PøéÛANN.88¸é ###Óíéò;)t¤¥¥ssseee ”ŸŸ¯®®~ûöm~xŸ=z´»»;¬Øâéé šžžž˜˜XS[‡ƒÃáZ.éÇÇÇÃ?dåÊ•÷îÝãgþæñxL&“ÅbÁ›²uëÖÙ³g7ŽÍfĄ촺“Íf¿ÿ¾¾¾¾åª Çûüù3߸Ãb±zÓ³UQQQXX¸¶¶–Ãáð“,ñ)//ïbÿjjj&&&‰‰‰?~ühhhïb‡âçÏŸZÍp¿&¶jú±¾¾þË—/ü%÷ÐÐÐ#GŽÀåY*•º}ûö}ûöõìåý"<<<..0lØ0*•Êãñê~QSSÓÐÐÐÐÐЪ˜¸¸8…B9~ü¸¥¥¥™™Ù‹/Nž}J¡PYYYÇŽÓÔÔœ;wn}}ýóçÏ¡UÞÒÒ2***22òíÛ·†††UUU/^$‘H–––''§;wîÌœ9sáÂ…ïÞ½Û±cÇ©S§V®\9gΜÀÀÀW¯^-^¼XJJ***jË–-¯^½‚7ʶÆj†¢¾¾~åÊ•\.—Á`´ÌpÑ>pAZBBâÀFFF“'Of0F§QUU3fÌÛ·o++++++{aDè«1dÈó¯Pi IDATçÏèüÙ³gÿüó—ËŒŒ<|ø0´®>ÜÞÞ~õêÕUUU½ tètº»»û³gÏk×®=}útËï-F«kBmmmuuµ‡Œ‹/¾{÷¶Ç`0UUUÝâ™®EDDÎ;¿ùžžžâââ3gÎHIIÍš5+""âþýû6l¿–!‰jjjË–-ƒ+¸úúú$)22ÒÆÆŠ+++??¿­[·–••mÙ²åÀ.—»yóf“3f^¿~][[ ¦¦fkk[ZZ*//ßÎXíϰ£ð_à]…D"‰Ä¦ÿ ÜÎËË‹‰‰Bç¿ÿþsppxôè‚ ÒÒÒ¶¶¶ÚÚÚsçÎíÊE@¾~ýêààPPP— µµµ›®Uð×0ZÝÙ ¸6kuñƒË妦¦>yòþËËË=<<øÁŒsçÎ577ß¼ys/\5dæÌ™&Lh¹þÔr™ ®TµµLÅoæàà°~ýú¡C‡ÂöåååLJ?±”””#GŽ<}ú **ºnÝ:333]]Ý^HQ[[ëììüæÍ ³zõêeË–à#®s7Ûhu?~|þüù¤I“FŒÁápÒÒÒ’““¡Ða±X7nÜpssc2™°Ð˜©©)‰Dzþü¹³³óÇ>lmmÅbÙlv³3ð¿W^^>44ÔÀÀÀÜÜÜÚÚ:##CMM­§ÿ~K'…‡>|xÓ=ÐãØÖÖv×®]<ÏÓÓsÖ¬YvvvªªªõõõÐØ,«´´´™ÑgÈ!üÔŠ­B$}‚5äT*ÕÎÎnùòåx<¾—½’ÜÔi½{_¼§OŸÂ—¿!C†ØÚÚ®[·®×ê§æåå9::~ûöL&Ÿ={¶-¯ ‘aÆñ÷TVVÚÙÙ‰ŠŠ>zôèÂ… Ð׋Å.X°ÀÂÂBGGçíÛ·Ýâž¼fÍšôôôêêj¾ù???ŸÃá\¾|¹i3¸”€¡FAAApt<okkÛô޶páB¸±hÑ¢ÈÈÈÊÊÊÏŸ?#Â_ôÅápñññüþ-þ¸øfʶÆj†BDDäþýûÓ¦M#‰ÍBÛ!$$$&&¦¸¸ØÒÒòêÕ«GXXxûöí»wïí̶¡¡¡gÏže2™ãÇ=ztOxëÖ­'OžTVVîÙ³çòåË ƒÁèêêÚÙÙihh@¸^C__Û¶mÝØ¡‹‹‹¶¶6?Ì'??P]]mllŠ …BY»víºuë Úî>~ü Êâââ'Ožœ={v×ûÌÍÍݶm¬Xàææ–œœÌf³ÏŸ?æÌø¤SWWóæ ‘H|ö왳³srrò–-[BBBµhÑ¢¶z†o111FFFéééÞÞÞЉçÒ=ž>ÐA§¾¾ÞÛÛ»®®ÎÆÆA;v¨ªª¶ôKjéÚ‚ HSÇ.… ÊÈÈ úÅÈ‘#á½£§UÚÔêëë=zñâEèc¯¤¤´iÓ¦E‹unQ¡s¼{÷ÎÉÉ©ªªJZZÚÝÝ]CC£Û‡€£G†§7¯®×€Åáp¤¥¥÷ìÙ³yóæÞ,-~æÌƒ¡¢¢Ð!¿.è‰\]] >DEEÿù短[·v»(ܲe‹„„„¡¡áÎ;ƒƒƒá› ‹}üøq«+¦¹¹¹T*5---??¿°°088øÌ™3+W®äW»KJJ‚“|ûö-‘H”€9&bcc•””‚ÄÅʼnˆˆ4M%Ú*mÕþ ;ƒ‡)_ ²çÏŸðxü† 8ЉWŽÎA§Ó]]]£¢¢ëÖ­sssëo5\Þ `0==½}ûöMš4©†î}à[eii)üš­^½zãÆm•tü_{wÓþ?ü=Ó¦}ÓB)ÉmUêÞEèÖ¥k{¥$´ø–-Jº¢æ¦’R’,iÊ•r»ââSB¶(KuiošßïÏï<æƒIëÌ4½žΜyŸ÷™9óš÷ë}Þï!Ç`0ÒÒÒ8ÐÝÝm``­¨¨8ä{Á¹Úøøxü§¾¾~pp°­­-™Löõõ‹‹377ÿçŸôõõ=z$''×K”ƒIII½~ý://ÏÁÁÁÜÜ<++‹N§ã²!¯| 6Ð)//Ÿ6mšŽŽNDDD^^^HHn—Þ¿¿··÷ìÙ³W®\Y\\üÝ ôÊ•+...¸Ñ[@@`ÇŽ*** ãýû÷>|?~}Z°`ÎR Gœ½gÏÜ8öìYww÷iÓ¦-^¼7Ñïß¿_HHèàÁƒ™™™d2YIIiÁ‚DBjܸqòòòeee%%%bbbFFFþþþÌaœµµõåË—étº³³óæÍ›ñÊØØX 3gÎܸqcÒ¤IQQQ¸¥êï¿ÿF¥¤¤ÈËËÏŸ?•™™‰VûÂŒ±ª! ýüóÏÛ·oަÖ^°?]ÅŒD"ÙÚÚúùùá–9Þ& °råJWWW6'_†#]ÅJww÷ܹsCBBpG=ƒÁpuuÅ}z¾Ûìú5 òòòýû÷+**îß¿?..nèªÜo tp÷"•­[·8pÀÎÎîæÍ›²²²—.]Z¸p!ÞfêÔ©×®]ûã?¨TêâÅ‹Ož<ÙÚÚŠ‡bå‹vWv&¾ÐÓÓ³páBgggŽü'³!]…᎟£ûI &]ÅÌÄÄw¶&W®\ùbÍ®]»víÚ…—------¿ùÆÅ‹÷>TŒ··wLLÌ+ùùù=<<<<<¾X_XXÈüç³Ëõ²¯^jÈFFFlsˆSé*f«W¯Xwï‘HQQqË–-ìÜ#{ÒUÌüýýñ` _T£­­MDD¤««kÀçØ´iÓ BCC9>¤dÿû÷ïëêêŽ7.(((!!=ŽÇ/–••%¢ÌÌÌììÙ³ÞÞÞòòò¦¦¦§OŸÖÐРÓéìŸÒ¡¿ÒÓÓÙ–hgƆtnƒOW1ã`V{`.]º„ýðáÃöööìhŠSØdp0]ÅŒç€9ˆmé*fÄðÄÌH$ÒܹsO:U__?˜ŸÄ¸•ˆð~S_?DgΜ¾?Ï8äúè´¶¶¶··+))IHH„‡‡ã!Y»ºº¾Ûä €ÇLÄEùøø¼zõjð˜ò¶¥«ÀðªtÕˆöu. 7¤«À°bºªw¸)55µµµu0 Òt:ÏÜÜ<66–ç¾Ö×@‡ŸŸ_LLÌÝÝý?þ””ÌË˳²²êã{‰1¯]»fiiùðáãGâ&¢V›w@ºŠ mº —¤«ÀðáHºªzïVû]øIÞÔÔÔåË—ÿý÷ßxzsŽèë* @&“÷ïßÿøñcIIɾG93q„ ¥¥¥VVV¯_¿~þü¹‰‰Iÿ+ÌS ]Å ]† ¤«x÷¤«†ÉƒlmmÿùçF9¨ÎÅ‹­­­?}ú$..>˜ùiÇŒ#,,\VVÖÔÔÄ ÃBs¤«x¤«Àp€tÏã¶tÕ0ÁÝüñGÎV£OŽ©©i^^ÞñãÇ322¹¿ÎÎNIII6̵ ]Å ]† ¤«x7§«xRŸ>\IIIAAÁ%K– rgmmmÝÝÝqqq>>>ì€ÍY®â®ÃÒU<çÓU\¨ONqq1~?u6à '%%mݺuãÆxþó5BAºŠ@º HWñ¼Q’®âB}M]ýwëÁ5¯ÕÖÖZ[[›˜˜ðñññðÌJ¬$&&Bºj¤KKK«¯¯G®CêéÓ§GŽtknnÞ´iÓ_ýé*öcë=a„îîn%%¥®®.^J]577¿zõª÷m ÆÑ£G!]ŵZZZˆ©¾éîÝ»¡úúzHW¾c0½l@§ÓBÉÉÉ!HWP]]]xèoÂ_1žçÒUÁ'cØÔÔÔÔÔÔïné*nÖÞÞ~æÌ™ïné*Ð/Ïž=ëã] ÒU#WÇ[t§ð`ØÁNRRRÊÊÊ}ÙREEeçÎRRRÃ]%Ð_âââ_O?ùMd2yõêÕܬwww766rº#[ww÷—I"‘„„„ú²¥°°pllì²eˆ¼`¸ ô±³©½½½··÷(ì³Á ¸ë’=â¬Y³†·'òíîî¾wïް¡aXËÿ.aaáõë×s¶& P[[û믿rº"#ÞǯÚÚÚoß¾Ú2·ùóÏ?9]ð}è€Þ477CgnfddôäÉN×€ÿñöíÛÁGÒ;Žÿ@#:àÛøùùÙÙhsä¸GWW×£G8] þ ðmÒÒÒ—/_æt-#‰’’RII Ûv{A_@ `h êêêrºüÍ< ð,tÀ³ ÐÏbÙ9$$„F£™˜˜H$:N¡PÄÅÅÙY³¯…‡‡‡††à ####--­®®nìØ± *** eÈkØwÏž=[¿~}AAÁ×s~éëë¯ZµjóæÍl¨FxxøÕ«Wg̘¿åÐÐP1116ì·111ƒ/G__¿¶¶/‹ˆˆÌž={÷îÝãÇ|ɃQ]]mmm]QQÑÇÑT7%ç^%À°â»ÿ ± t( Nß¹s'BèíÛ·±±±aaaì«×·´´´ ìûöí;~ü¸£££¶¶ö“'ONœ8ÁñÛLccãû÷ïÛÛÛ¿tÂÂÂØ6«_hhhOO϶mÛB ûöí bÏ®Yimm’r¼½½ýýýEDDöîÝ»fÍ6$…XCCCCCC[[ÇÏ@0x£äã«V\x÷¤>=^®¨¨HÜ~Z[[#""ZZZðŒ¬áááÒÒÒø¥ÈÈÈW¯^1 ‰GijjÊÊÊÞ¼yóôéÓ­­­ÁÁÁoÞ¼9}útïåeee ÐéôÎÎÎC‡áí ?þŒ"“Éááá’’’}©ü§OŸ’““ð¿¿üò‹””Ôû÷ïBMMM111W¯^Zºté† ,,,Þ¾}k``PYY)++4oÞ<„«õ===Ç?}úô»wï&L˜`cc³jÕ*¼k\þŸþÙÖÖ¦¤¤ÔÒÒ’-))¹xñâçÏŸ#„LLLB***999¡úúúß~û­­­ !TZZJѽ׳¢¢B@@ ''gÑ¢E}ù@X‘——Ç»FµµµÅÄÄ´¶¶âo'$$„˜¥kÏž=¯_¿f0âââOž<™¼råÊîîîšššÄÄÄÈÈHƒQSS#..Ϊ„PDDĉ'Þ½{'''ÇÇÇw÷î]!!¡éÓ§?~ü!4qâD„ФI“nß¾=°£Ü`žc}¹J|ó¿{ûöíOž<ÑÔÔljjâããSTTôññ!‘H¸(*•ZWW‡RVVööö&ðîÝ»JJJBBBÍÍÍîî†¬Êï¥>IB_îþß¼kUWWëèè|üø‘oܸqAAAÄ7ýòåK„ŠŠJ`` ^¹uëÖ[·nM˜0a̘1MMMÞÞÞxÐZVQA/ÑÈúèœ9s†˜ºrïÞ½þþþ222¡ÆÆÆðððÝ»w#„Ž;fddŒÊÏÏ/))9{ö,>Z„ˆˆ•JeþÀªœÌÌÌ„„üq>|˜Ø>:::((ǘýòüùóÎÎÎùóçkˆ@Ä××·¾¾>  µµ5!!¡µµ5((ÈÕÕuÇŽBBB åÚµk¡¡¡sçÎ%“ɬÖS©ÔÜÜ\[[[YYÙ/^ÄÇÇ“Éd;;;„——×»wï¼½½ÅÄÄòóóÿüóÏOŸ>IJJFEE]¿~=>>>22RXXX^^×GNN.66¶ªªjß¾}̇Ð{=íí틊Š<<<¬¬¬3cÜùóç‰V÷C‡mܸŸ4>|ˆ‰‰Áÿä©©©¾¾¾¡Â²²²””„ÐöíÛBÂÂÂ;wîÄ˽—sîÜ¹ØØXü-'''Ûoß¾}ûöíø·ãø÷ßñt]ÑÑÑjjjBBBaaa™™™k×®•““{öìYxx8™LvqqA988¼zõ*::º©©)** ×Ö¬Y!!!ø œœœÈdrDDBhÇŽ¬Ê©¨¨ˆ ÐÒÒ:uêÔõë×ñÿaRRF‹ˆˆÀm0ÖoUçX_®ßüïÞ¶m›•••³³³¹¹9B¨°°ðôéÓ+V¬@:uJWWÇ7W®\IOOÇ?J·nÝêèèèçç§¢¢ÒÕÕµyófè°ºz°ªÏ@€Ð—»ÿ7ïÚ;wîœ={¶©©©……B(??ÿäÉ“ŽŽŽ¡ääd===ßäåå8qbõêÕ¡ˆˆˆeË–…„„Lœ8±««ËËË :¬¢VõùZoÎóçÏ}||þóŸÿ˜™™÷žœœæ™êêêê ‰Dzðà³³3^iii™ÝûÇǪœ¥K—:88ÈÉÉikkãhºººB_ŸÏŸ?¿}û6þÃÄÄĪªª"„bcc%$$ÆŽ›››ÛÚÚ*&&Æj}VVÖ¿ÿþO”œ››kgg÷ôéÓ»wïå›™™%&&â뎖–Ö§OŸB¦¦¦Ì¹O2™}zãÆ–––´¼xñ"88øþýû&&&Äo‚üüüúúzbÜ„C"‘ª««‰0qÞ¼y¸!ª¬ÊY´h‘««ëرc544ð…o˜èëëã…qãÆedd „’““›ššðËÌÌtqqyøðaYYYnnîÌ™3B‚‚‚AAAÓ§O"¦Â——Ÿ1c^fUBHQQQRR2>>^[[ÛØØ8**JDD!¤§§×ÜÜŒ˜Ú çX¿®¬þ»µ´´ˆ?çÍ›Gü"ª¬¬$"’ùóç3ÿΙxð€x wÝè/999{{ûÐÐи¸8vñâE MMMŸ³gϦ¤¤DEEýúë¯|||x.è[·n1 üHEuu5BˆÕú%K–”––Õ××ß¾};&&æàÁƒ!---??¿¬¬¬+W®¤¦¦.Z´(77× @ééégÏžuww755}÷îÝ“'O®^½zç΄PqqqiiiOOO_ꉻiß¿Ÿ&,,ŒÛÒB&L(**úz3MMÍ«W¯âåÂÂBü#1}Ëuuu8óÚ{9T*!$**:mÚ´€€üIbû–¿†çüüù³††Æ™3glll\]]‹ŠŠV­ZUXXxéҥׯ_߸qcË–-ø¨õôô´µµœœÒÒÒqÿ“ÒÓÓ“’’vìØª©©aUBÈÊÊÊÆÆFPPpþüùÓ¦MÃ×Mü¾^9räĉË—/WWW’ƒ1Úα>^%Xýw?{öŒùê¡­­—õôô®\¹‚—‹ŠŠˆõ¬°*ŸU}ú _ÍX%bbb–.]ºjÕ*ooשּׁ¬žž¢qÝÊÊjùòåŸ?ÆZX­ÏÊʪ¯¯ ;vìXkk+¾/à$À®]»lmmýõ×ÈÈHggg" ```€255577Ÿ2e ®NàŒ^¿ê‰{Þ|÷bÛÇ»?«»ö“'O˜£¢Úyyyx™F£ëYaU>«ú|­·ÇË CCCq###gg瘘˜°°0 …’-"""))©®®Ž£Ý5kÖìܹóÂ… $IUU•h‰566vssjjjzõê•’’BˆU9/^¼Ø¼ysGG‰Dêêêb~ÒØÊÊÊÅÅEBBBDDDKK‹ˆ²¿Ëßß_IIéìÙ³©©©cÆŒ™>}º‡‡‰DJHHˆŽŽŽ‰‰´¶¶ÆIbÜ‘6 àÌ™3©©©¡-[¶°Z¿iÓ&‘sçÎ¥§§KIIéèèàO>>¾Ã‡ÇÄÄÄÆÆ¶¶¶ÊÊÊΞ={öìÙ¸JšššNNNÇŽ£Óé:::¾¾¾cÇŽutt|ýú5Þ 88XHH(;;[YY¹÷zúùùá€ÃÍÍ­¢¢¢Ÿ ~íÚ5 …‚;îzxxìØ±#(((666''GDDDBBBMMÍÆÆ!doo———G"‘&L˜@üƒùúúòóóãnƒoÞ¼Á³‘³*§¶¶6,,Œø–™³.X°ÀÛÛ[\\\XXXCCo?¸‹âúõëíìì¨Tjmmí¦M›nݺ%**šššzäÈ™©S§âd29++ËßßßÏÏO\\|úô鸨©S§º¹¹………uwwãfÕ„„„ýû÷³„иqã>}ú´eË„Ð?üpôèQ¢AnÊ”)žžžT*•N§0÷g#Î(9Çú{•`õßmhhXYY‰ïpÊÊÊÄú•+WR©Ô‚‚‰Ä¼>,,¬¸¸¸¬¬ÌØØ˜B¡ã¦Vå³|_ IDATªO?~”'ú{÷gu×622ºwïÞ… B***ÄúÕ«WGGG_ºt‰D"1¯ß¼ysQQQIIɬY³BCC‹ŠŠ>~ü(--ͪ|Võù !äêêJtc*ë8<„ÌÌÌlllÌÌÌ8Xö(,,,**:qâûw=´‡¹JII‰µµuMM t¦Ãd´c#âr1}úô]»vefffff®ZµJGG§£££°°ŸŸ?&&ÆÖÖ¶­­míÚµ---‡š3gNDDÄ©S§"##©Têœ9s²³³q;ÍO?ýÄj}LLLjjª®®n]]]QQ‘‚‚B||‰Djoo_·nÝ´iÓðúèèèÚÚZAAA]]Ýï–XSSE¡P¤¤¤¬¬¬æÍ›‡***ÊÊÊ ÓéC>9+†††x2[SSS<Ã0BÈÂÂâíÛ·•••²²²AAA¸’óæÍ{÷îÝÏ?ÿ|ïÞ½ŽŽUUU''§%K–”——»ººÒéôÒÒÒ´´´„„ƒQZZ*..¾xñb<%§‰‰ BHEE%''‡=‡Ö_>|e^C¥Rñè®ÊÊÊx”qbý«W¯µ´´ˆ•¶¶¶âââ±±±RRR¿ÿþûµk×Î;Gœ<ìdllŒ¿S bš¡)S¦¼zõjúôéwîÜ‘““‹ŠŠZ´hBH[[ûíÛ·æææ7oÞìèèPWW÷ôô\µjUIIÉÒ¥K»»»kjj### ž·húôé?Fáñ@'Mštûömö&`§ŽŽŽððð   ÀÀ@„вeË·mÛ¶mÛ¶~'¼t¾ñÌ£/Î;wäÈ‘·oßjhhøúú·?Vž={¶~ýú‚‚‚Aþ¾ªrúkdE½:ÏŸ?÷ññÁËoÞ¼Á {÷îõ÷÷—‘‘A566†‡‡ïÞ½¿äêêJ¼×ÏÏ^JJŠþçÏÏÏÏÌÌ콜èèèeË–ÅÆÆîÙ³‡,B™™™ xæÕÇ÷娆««ëŽ;„„„(ʵk×BCCçÎK&“]]])ÊþóŸuëÖ)++ß»woûöí>|XµjÕÆãââBË—/'“Éñññ¸¨¨¨¨ëׯÇÇÇGFF ËËËsôȾáÅ‹ÁÁÁÅÅʼn‰‰ÄúS§Néêêâ«Õ•+WÒÓÓñŒ-zzzx}aaá¹sçðö{÷îMII‘’’BYXXüüóÏ\uÍò÷÷÷õõ>pà@~~¾‡‡‡••Ÿ¿¿¿¿¿ÿ­[·|}}'NœX^^îããóîÝ» 6„„„à©¡œœÈd2‘ÖLJJ¢Ñh‰‰‰"""ŠŠŠ=2ÀUUUŸ?¶··'ÖØÙÙ988ôë<áóm”\1˜¥¥¥EEEÙÛÛO:•F£¹¹¹>|ø§Ÿ~êå-CÕφ„D½:jjjD«cPP^ÈÉÉyûö-±M]]ƒÁ ‘H===xðà???ƒÁ f«ªªrttÄË–––ÙÙÙ½—ƒš8q"ñ‘–.]êàà ''§­­maaÑÇÃ&8‹+!!1vìØÜÜÜÖÖV11±I“&!„bbbp󌥥¥¬¬lbbâš5kôôôð{ÇŽk``@¥¥¥õéÓ'ô¿-F\EUU7DwvvnÚ´iÇŽø¤¬¬¬$Føž?>1/ñljŽfóæÍ#¨›šš:::„„„Š‹‹ñÏ=p{ìñãÇ¥¤¤Μ9ÓÒÒ"!!Ûl=ŠO,[¶L^^~×®]^^^FFFø½òòò3fÌ ŠÒÓÓknnFÿÛbF'!!¡~'>~Æ îîî!KKK__ßÝ»wûøøô«!Ÿk< ô;u5iÒ$Ü2ñ …2gÎü'ñqô·„Ð7ÓÌŸ?®¨¨HJJRUUuqqég݇þ20ƒA,3_k¤¥¥;;;{zzØZ³á!((¸lÙ²¿ÿþÛÊÊj`%ØÚÚfffÚØØˆˆˆðóý>>:::ýjÈY ‘ ôûÔQUU¥Ñh_GR 8¨DUUUá0!¤££sùòå  „òóó>|Ø{9¬DGGЉ‰Íœ9ÓÐÐpË–-ý­ùÀܹsçÎ;¡ââbÜYAAw;¿uëÖœ9sjkkBÕÕÕDC¥‡‡‡³³³’’Òýû÷SSSW®\ÉÏÏ/&&†ºpá???ºëêêp×f „Pzzº¬¬,F«ªª*..fÏÑõWee%ñ•ééé]¹reþüù¡¢¢"¢›¶––ÖÕ«Wç΋*,,¬®®&Þ>uêÔ“'OJJJâî/œRVVVVV†¢Ñh¸3òøñãñã!¥¥¥VVVøì½ÿ>Ñ“tÅŠ7nTUU½{÷îÁƒׯ_/ €[àÒÓÓùùù322B555¸k3no?r䈜œÜùóçïÞ½ûôéS.`!!¡ÐÐÐààদ&##£‹/æææâ,L¿Î“èèhÄCço\1FHH¨_ ù#+!0²"–N``àÕ«W=z¤©©RXXxéÒ¥… †……Q(”ììlIIIuuõU«V!„Ö¬Y³aÆ1cÆ´´´HJJ677×ÕÕ)++;::FFF^¸pD")**ÊËËïÝ»×ËË‹U9x¿8#(##óûï¿ãú¼xñbóæÍ$©««+  ŸË mÞ¼7¬#„lllBCC;† 8sæLjj*BhË–-ø-³fÍJIIùðáÃĉýüüp«¬¶¶öªU«ââ⺻»•••B)))xpMMM''§cÇŽÑét___öZ_$''_»v {WW—ššÑ[påÊ•T*µ  €D")++{yyáõ+V¬Ø³gO^^‰DRPP““;tè››~ÕÌÌ,''ÇÚÚš#‡ƒ­_¿þÕ«Wèÿç’wïÞM¥RBk×®½~ýúÁƒBnnnÄÓóçÏOHHhllTWW_·nBhêÔ©nnnaaaÝÝݸhBBî7eÊOOO*•J§Ó p× ÀÛ\]]EDDâââ’’’tuu³³³ñ¿_ç þQ>rÏ7ž¼bônòäÉ¢¢¢çÏŸÇ©+„ÐÅ‹§L™2°&(nKðF$@B¹ºº²í!&¶133³±±133cçNËËË×­[‡³§lÛiaaaQQщ'ضÇÁ¨­­-..ƧòˆPRRbmmoát]ïƒóí l¾bLŸ>}×®]ýå%---::ÚÞÞ^__ÿÊ•+………‡622zðàÁŠ+6oÞŒòïÝ»—‘‘›²=zdcc³qãF¢!?88xóæÍÒÒÒÌ ›ÀÀÀ~•Ó—„€§§§¿¿?7‡CˆD"qiÖs„zöìB¨¸¸XEE…hlÌNŸ>MüîðHY4MMMè À0óí #âŠaoo/,,œ”””‘‘¡¡¡‘˜˜ˆ¿»~5äËÊÊ"ÞJphÑJx|„¤¤dQQ{6)-:ááá­­­¥¥¥öööÜå"àñuBÒÒÒ>äø€l€·ÁùFàÈc`-:C‚ hÑG£Ñ8]îÊé* Dee%§«F8ß#ôŠ1`>è–””„ fgB`”€@à0H –³—Œtè€gA žx:ÿeii©ÿ<BH__?**Šyû†††3f|±öìÙ3ssó®®.öÕ|‹¾¾¾ôWð<Ï!iii|øððáÃnnnêêê.\¸yó&N¶ãæeúúúxAZZT¡¨¨˜œœ|÷î] …Ò—’’’h4ZDDDbb¢ˆˆˆ¢¢"BhÇŽ™™™k×®•““{öìYxx8™LvqqAmذAJJ*"""44ÔÖÖVNN.++kýúõ±±±ZZZ§Nº~ý:|§¼αQÈÙÙ™B¡àë>>++ëÇ222|||yyyÜ3Wg#atˆÿÒ   ;w÷îéÇ544ìûª/ Æìٳ׬YC¬ùúê³téÒ/ÞräÈ‘¿ÿþûñãÇEEEÅÅÅ/^äÚ‘›‹‹‹m¤È`0,XàååE¬ýb‡/Þrþüùââ⪪ªK—.Ñh´òòrøNyœc£$úˆ³‘¤®þ‹˜PMDDD[[›XÿäÉ“ÚÚÚÇãW¥¤¤fΜI&“Ÿ>}úòå˯×#„$$$Bééé²²²4­ªªÊÄÄ„F£©¨¨èêêÖÕÕ)((àžÊÊÊ;wî»þᇔ••BNNNŸ?vqq™5kVwwwaaagggß–BèÑ£G!&**:uêTbýƒž?^UU…_•‘‘™;w.™L~øðá³gϾ^’’’B9rDNNîüùówïÞ7oÞ¹sçÔÕÕ kjjrrrÆûWݾ}»¬¬ŒØµŽŽÎĉBVVVŸ>}òóó›?~WWWNN|§#œc£$Fö:\þ¡ª!„ÜÜ܈Ö`OOÏׯ_ãåàà`!!¡ììleeeo®Gijj:99;vŒN§ëèèøúúZ[[«ªªž;w.==]JJJGG·4"„üüüÞ¼yCìzéÒ¥Û·oGÉËËþü9&&!¤¦¦W«þÂÝû]]]B[¶lÁëW¬XQ[[‹—]]]ÇŒó×_Mœ8qÅŠ/_¾üz=BhÊ”)žžžT*•N§lß¾}ÅŠêêê©©©GŽ‘‘‘™:u*Î) „Ö¬YSWWGìÚÁÁ_°Æ÷éÓ'\~øáèÑ£ðŽtpŽrè/ŽD$„««+s~Þ`fffcccffÆéŠ »Â¢¢¢'Npº"0²MŸ>}×®]jjjßÝ2##wFÆIÜ1%öíÛùuà‹õ¡GÙØØlܸ‘HÓh4;;»o&nܸ aN,Z´'dddþüóÏÂÂÂÒÒRVa®§§§¿¿?~Ðç‘H$H]ýI€ ð8_ËÏÏï×zÌÏÏÏÏÏy‡‡óót„‚‚‚o–pôèÑ^Êå` ð,tÀ³ ÐÏ‚@< :#ó‚›7oⱤ ñ`à%èŒxúúú[·nåt-`Ä[¸p¡‚‚§k†Ç*•zãÆŒŒ NU€gÈÉɆqðöDt>œ˜˜hbbÂ`0>~ü8eÊ”¾¿ÝÛÛz€‘hDDt\\\ž>}Ч!íêêò÷÷§R©CW1pµ Mêêýû÷bbbÌk¢££ñÜu***Ìëkkkuuu‰• .?pà€´´t@@@aaá•+Wddd†¤nn\ *Ðyþü¹Ogggaaajj*±>99YOOU^^Þ‰'ðlò)))x}~~~ff&ÞþðáÃIIIÒÒÒ¡… šššB”p?î5ŽŽššZ\\\BBBEEEBBBcc#^ïÞ=+++¼leeUYY‰—«ªª,,,ð²¥¥¥ŠŠ ^?~üÇÛÛÛBEEEÄ{À͸?šW®\YZZ:àÒÒÒ:::DEEùùá¡w`$áÚH`ÈFF¾wº:^600ÈËËÃË4胭££sùòe¼œŸŸÿðáCâí?þøã?ÿüséÒ¥¥K—U•À6Ü êñòÂÂB„PWW—ºº:Ñ«hõêÕÑÑÑ—.]"‘H***x½££cddä… H$’¢¢¢¼¼üÞ½{½¼¼ð«óæÍËÎÎ^¶lÙàŽì0""A=^îââÂêUæþÕÌ‚ƒƒY½åÇljjp}ÀN#"à¢I=Ožµ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ{•4-û!X¡mR·&ײY±?—,ízdÌšüº4Ùt°ëM¼ûËÐ7 Ô… ;烡²¦LSÐØ¡£"ܶ'jÛŒ~øñEüuvq¹:øu2]ám½±A)b}³ žhá]¡Ì!BÖ“†îyl0à.»pk¡ðñ¾ ÉÅÿ^ËÕÁß/WGvƒ#’™„H sž6BóB‰Fd %ÚŠ˜šøØý9 <ø­ñ¾ü×Áûùøj÷X² %/Eî‰eÆVéÞL )$gDŒ¼iJÔ8«¤d ÀPQЗ&JëÜ¡])Ù×ÙºÔ kFV”éœ ©©'î ‚5;9$"FXKéßÿÞ«8Jv€vgºTÈhÆÎŒ+è£ ›²Ê ‚PAiÃX‘1%µN©2Jªž­ÛvFk~2SÇg}­=.5­kí{9™yÒÑÂõé€ßMÒô‘üÒ)*‡‘ÆoòŸ²6R=LŒv¨¬°Þ¥:%åÏý«f³b)~0p.-µNïB{Ûƒp(Kµ‹ü¢‘PJy (/ÔzO„Q4<¿hT1Y™šƒ–î·`¸RQyÓ­Pš·ò)¡Ýô¨‡eQ])øS«Ù¬/¿Å•jß6/%w´{ù> © =5°”ÙŽRt"$ƒ+ÅÐz­´5[°£ªØ¬C\¸w6”Ù‘†>¤P¡™‹„TV3›óNiêºmôk4Ô‰²³n bXÉg½ÒÊ}“ø#9Œ}È¡F“Z)ƒôÌr¬K”dk8ê\*uÛ1O’ÃJ>jt÷ínäPË>äÐNÈ-à!"’D‚CoðPn +ù¬—C¹‡xv$‡Ý ƒpמ¼t¬^J GA§Ø†!)T–:¤{=S—ÕõLÒB‚‘{ìÁjèÁƒ5u×¥›fx=Xm•X–Vn•€ß#Ù`÷jÙ¬íB¼wÛ¤c†§šÓEÝù€\GoÌ€ª‹œäŒ¯]S¡#Râ6äð ¤ìÚSÞæQãoŸ>}<ü½øZL_cB{ë†ZI| ‰òÙ$jÓƒ…“Ø´ˆš÷ 1Åâ èq•ñ/@‡ü{ù-œj.šü]ëÉO»ÛËôŽLíÎ'ExÛÓKªÅãÍÇCJƤîhd«!nbÑšTÏï­W̲XËhEfn²2¦¥Ê:•‹ 7Rel¼ûìņ-)¶‹f»Ý4ÐÝ'­øu—ž.E²ÍÂ7Ñ:¤>|Þ©!P§Ì²jØ)în@µ\V,¥Žó²cG„\5¼¯UÃõç P 0£@wÚýhÕ1—üa®Kþh:Üj{˜;Eëôñ}\m@‰ê@Œ4ùòÁ›úýŸ'ÓicOÏgÑ¥ø¡{•vz›QÞ3q*ƒ‘OºÓÉÅñ—ùbòÜÒFÓ™û<š.‹dÑV“Óˆôd‹uNìBñcîGÍtvL±²°1[b[³Ä61›bœÀa:gâH^Øx£~øpé_ûÒj¡ÄÜia"3~ô„&ËÓ9‚ÇLJͪà£sê·òqRÃæ¼P¢ žHI£`H^Oª£ÔfÉ:¨©6›¸ršŠ‰ÎXc|†s~šÁ;ŠlYíµQ.¶žøJ]¹Ïé‘]¹×ãÊ=ލÝ;J€p3†·–u4‚2P£{ê‚å¬,ÏÇhN íÈ]FÐŒ A_H0¬&=ÁtN›µÂʸ>¸oVÓH-:¶Ñ»2=AÆ!5%5ò:A;Ó¨–ÏŽ"R‚BÎOx]ù ®CWs8ºš¸:)ÐT@ÜY"Lß g‹Ñ ýö D0=Œ.Çô€PÌuL J ) “ÂÉä¤*Ûé °É4áîL6;n >D¯ÖÒzZçå5›YÚ±Wjazf ëù¨O‚VÛCŸUP^4Ì}VÄ4Bý¬²Ïª³*A+hÖLŽ^˜ÌК¡5CëëÖîsö®ËCРSm«Ä›X)SM!¥¡¥ñz’ä”±Ž5"Ø“Z_´†Óâ¤mÑ`†Ö= þ÷©/+Cƒ¾‡~•6Õ1[ y;VZ“(‹”† …µ*RŽhÚ!6´Vû`² ¤:e´tÎÑJ+}ä„TO£à¸ ¼ ±m,e2Ûw¼™"rŠÏôܺÍнÓÜu%Z EÞ®ô!¸ëHWjô‘®#]‘5ÒÕ“ÙfÈ6C¶öÙfhRªdº÷L¼ž ¤3¬gݰ’m¦Tõ˜š^#¢jÅ[ªÔ “¹T)—*eD}ÙÙ¶sÅA¤°:¥"4‚Óz¿¦Ü ­Õbø)7Cî‘óu\>p¶€+µö97ãUåfèÐ¥w„ÝMÛ½ñª-ç&t¡Ò,ƒ”LHWuA8©ÒTcù§ÊÔñYÙÃìÇÒÖ3Xp ™ùƒ&ë݇æÛÓ[fÙ.W£Åê1HÓ¯½=P»M´wXë + ¬pÔÜ/µ”WÌX,õ¤°&a…Š(+ç?VTóYÝïÐê­Fª *^Tè> b½‡rO¢€‰Ž4W j0ÃÒœHããð墒ÍÊv§†¢ò4WÚš;*2T<3¨0}@lË/ËQ8ŠF2Ia•M­·€ÐÌ!¬ªœ…cM†Š /*ì~AEt1Moóª´*ÀšÒªÐæYA…޲+'³Y‘±â…`…ë3°É¬ˆÆ¥Iž^'³BÙ¨VĸŸfxÔQPÎAm›”"Å3 ßPÀÖB©wQ@E jH'!ÊQ¶¶Ð,TA³´…*(¸©²M‘¡âe@Eس˜Fª#A…Y†*ØÛY<åü# ¥¢Ïi¢ÏH‘‘b·HÑi çh°Ñ—bŸ¸ÄqÁè<Ö…äêèà,AÛlÕV¸ôxXDIGŸ æƒÙ L/Äq“>•R—E¾†uøŸr"•"¦Á8;$Âѧ*%ˆÀžÂQÃfõJ㓢ߛ‰ï×i‹ :´”ÚÜñ\ß;^}©ë#s1DKsN•U x7½àÓDURæ¢BŠC‡ÿÀ[AÚ“MÊA¨Ÿ H­$P‚DÍZ_×2¦p2_Œ‹ÃîÙÏ} sôiV/b’ç…gE”´Ðø?OðKÊ®=åmŽø×h²ÊÆÚþ×Ê`žÐ x|œO¯êÌ»îyw²è¤Í†×Ô"€Ò'¬Ñ¡2H2*ô¸¤iMùïÍñãÆ]“•Keó¥·?dÈ·=Gu:ncó‹ìu:O¥Ø£ÆtO?‹Â+mðk7^V32¢€A$J€”Rú™eɲ*L•K]ó¥1:ŸßúкÍiV™m«Œí¡wOTèœDë ï&£(»±9@Úd´W)ÓB·%ÜPeêx¬^lLKã]ƒ©b©÷:ÐR)ÛA²Êl]e:g#Qþ Fì'#,Þ]ÆQä;™3&e#%-‰u âÔ™Z&«Ó›/Åí21àƒtYgž‘ÎÔBúHÊA±pªÞͪ/è!xpè·è€”(©HÀµ. Úf ä·OŸ>\Jüpu:-rX„#,R'‘9,Ò ”¼Ÿ¯B’Î9;Ž’^c¤¶Ú€fÌ,c\SR^§¶è©Ï îÀγNóê…É&ÇíVÀGcAJçôë:'èÖÊr|JÏgÑÆ©åŒ=(§²d¬â¦kXÍbRN¹¦Dµ¤œ†¬Ê ¼‹žY9»3™•3+çÓŒpß=W„,cŠjà$k²ÈJÒ0 ˆô„mOy›Føá‡›,‹ß‹¯Å4Ûà6x@¾\îÞ¯CÕÃØ7°#81¤¤¡…µCH+<Ôø8_®þ(Fãµ÷¾{Ì› ñæý|:~ÈQ!€3X1zÀ ãÑBw‚5¹ïšŒÖÑH‰fÛ“àmÂǧÅh¶Ì Á ˜qƒ7t¸áÐû¥€¾2šÙâH”¼p)¥6ñ%åØžò6äo£‹O󬿋ÑY‘q„Gª%2C +”ô1­ÚZêØŽF å] Á‰˜·è¹‹£Å²XdôàDûB˜‘ƒ9lF~iÀñp©I …<ŒÐ‰à„=~9=-–Ùqá586¥/#+b¸žl Ãí *:; ÅÄ(µvb¿\®¾³ŒÜf†É±Ží†ïÃÌ lxnÿÄQö-ù'ZPÎ„Û ÿ„ ã?1X­ŒMáË€Á ¡Àð”ó–0Ü?Ötã^Èïó³ œàQ)…=8[†>šéEBªä6е³ÕŒ;H””ŒÔ R*kèœ_jþ^§Õ|V.uÔFE:F™';0´E~&6ÚK`ï4ñTŠ=¡D÷ŽyhïIW%àE /•¯l#«U tæ¦ÑúàF‰:>+Q"øÔ›EÈC2Hì $ºŒs@SíNsk¹¥qÁôINÚ4|2€g6\œOvŠ&!’Ó!u2g€‘ªÙ¬\JóeRß4òðº Iû IzGd{€$¯}™,ÆÛ—) Ó4Âûà’¼W©å#€õüTÉf5"YS¶¢”2"eDÚKD2;B$×"ʦ«†ÝFò¾ì›b;Áj•ºùD¿©’Ëj@’!I­L¤ H{ HvG€ä{$ë|J|3Î3’¬ ‰V ‘œÔtºiTÛDà§R5—Õa$[~0³‰”iOÉí‘BN›ñI­·¼€¤m, å“Ó¤£ót«|Ü‚ÓVÅf%"YKø(”qÙFʈ´Ÿˆäw„H±D’Þ–|Á8^H’F§ŽÈÎh“f6J¥Rþ¨ÙFh»šÏêqk4â„–2&eLÚKLR»Á¤ØËDä`ÓÀ颿¹i%b!%#5šÐé R/ê-ŒD®ä³b©Qú”&$mÎȘ´§˜]1©|=]‹ŸÊøçl1:ÿùàÿn}ŒTummod_perl-2.0.9/docs/user/handlers/http_cycle_conn_filters.gif0000644€ÿÿÿÿ00010010000013334511727205031024606 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{.Nyyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôòòò???ððð===îîîììì999êêêèèè555æææäää111âââààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚe«5'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄAm"ÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®® ¬¬¬ªªª¨¨¨¤¤¤¢¢¢ƒÜD   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇ! ÅÅÅÃÃà /ÁÁÁ¿¿¿ ½½½ »»»ŠéH¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠTJ©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœKÉšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=ò !ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîGiíAÖK d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(â3~PX^g½@àÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LöÒãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbÚK¦þž¼°Ë©´Öjë­™¦š£}êE­¸ðÂ(«à™Š’ˆYÊ Y¸ †˜/à*í´ÔVK§®Ã­ŠÙ§€D;dGà)CãŽé­µè¦«îºRbû¯Š}úE@¤$2¼0Ã$D¦0Œ*/ä’@¿ÿ<ðbˆ ¯´:ä#/¨Ã*¬ ¹B/dü‘ŸÈŠ$¾úò;¤¿ üd¹E&¼pÃCª€M -w³*3ìð粫óÎ<[ë®gð&ö) I>‘ L@¤ùxñ ,E2í4ÔC†r‘"2d©Æ D¢|dÎ=dÒK7ýôÉGZµÖ^ Çð[õÕCf]$þÙ=÷í÷ß¹2º«¶—}C’­9‘çæÜ8‘Pdœ1+]{±x‘Û„­$߉y¹;‰ò³^D.9åCîCÊ(ð¹ä/ Î8à´×n;¢?w4bò¾dçD~:γ9+’¯()¶‘œ+^<èlé‚ñJ¾‚F8Éy|’|ßîý÷à³™;g»ö©<°CwëxÉ&Dj¢4ñô×n(— ‰ &D²a ‘7÷Žô¾øÍzõcʼ…¿$!@šHD‘8ÀðYð‚Ô“à²Õ§mÝÌ |hEÆRá"MÂ/ȼpŠiXÀ ˜F)†ÔÂÆp†^ØF^¡ S„@þDÚD ^p |ƒH€… V x ‰/˜FÆVgBªH5„¡ ™´,Œeìx:ä¡H¤üÀHaìáŸÅ)fðpŒ#’Æ·™òÆWrÌ£÷ÈÇEñ Hì£ IH Ò3v,  ÉÈF:rg‡¼L" ³ÈGZò’˜Ï|δ¦ÇêçJZ1‚¾ ¡5YX³Ñ@úù†Ï’â²þl5haZÐŽB…mi ÛÏ"X (øÄ$ÌñÏXÌ ¾¶°‰í‹ žò¦§Mm¡všRŸNL¨í2ê@ ·Úà·¸!zíIe1Û®K·õíqkšuh@$00LÂÈFÜÍo–[Rç>Lºé²î<µ»ß2þb1|ã¤%6aóF'î±ï¸# ¹ÈþGNò’›üä(O¹ÊWÎò–»œäSè¿#pà |.ÇÓÁ^à(Hbà`”Á^ÜÃ@Ç(˜MV1ØãPºÔ§Nõª[ýêXϺַÎõ®{]ên¸/@gNJKÇo¦vÎsìFárxÅh1fh·pGÓ¹1…¾ûýàOøÂþðˆO¼âÿ÷]ˆýŸdOT͹ƒv5©Sloûm‹ðˆ5¨€háÊ0\‡U |g¼êWÏúÖ»ÞõŽ—y‚ykvNVþQ—¿Tæ5Ø*(aX`‹DQ=œ>õ¯O¾ò—Ï|ÄÇ~ì³ï.§:X¸ÜG“Ÿ¼/ð7´þº»¥ïpXQßüò›ÿü°¼¿£_cï²ÊT»Ï~]ÍðÈ Ü?UÉþþûÿÿ€÷|Ç~`V{¦t{½b}ú„}òw]Ì@Ê€°È€˜Ë'€ë7SîçAðÇ€ ˆ[° vár@ SÅØ‚.¨zØO‘‡;ØL/ 8R"8‚‰µÚ€ iq^1§°‚ø‚H˜„‚ƒ¾0ƒ‡2y„qsr‘swAúVCJ¤beøÐ«¤ 0—°¤Sa§ ¤"Ð $ ²Ð %° ¸˜ U±¨@œ0 I ÷0 à ¦—QF@ ÆÀÌÒ@ Z ` d@j°q0ô c¨€=Œ zàw’jÐw+0¡!À¬×èŸ0þ e0²S Ñ}7}Š¡SÐ~÷±Ú²/Ûw2[4»Ð û«¡)¬8´A³$k²€²*K‘²×ªB}@Z›ÚjV ³/°¶°)p¾p ØWÀBµ•L»²÷#ÐwÒp ñ0¡÷P ÔpŠÐ{–L €™ßà MШי ‚‡RÖà•‘p~W¡Z—…{¸S¸·r–i—Y}ç³qÀ¹«·|ë·€‚ë¬W+›Þø]\ÛµcU2›ˆD€x! np &6Wàs@µ•p ù)Uàw *§Ð }ç èþ¹ªÀ p ¸S#z 9 -ø‰ Z`}p ‰0žù-ð p²SÜp ·`²ªÐSÐ {p + á)P¾ç›¾ëÛ¾ï¿}W@Ñ+vùð,ð èìë î ¿òk½¿€½Ú˽Þ{à+¾=šW?ªT×úWÙj»QEÊýtc  wa¥à [¾ ÓÓ°=µ•ÔièwX@a€ÓP~7å ³ñ |ðw"€ú¦ Ú ïPŒ°Ð;0ð ͹®@ºS0YÀv0¼j;Ù°gÀö0¼ü0_<a<Æe|ÆþiÌ«¡pú ±°´P}T4ûÇö€Æj ÅRLÅVŒÅZ¬'¬`)ÌU+,Y-ìÂN5ÊYgþÔ äJwðÒ`v€'Ö °ìSn+‰J™¸É´×É}õÉÂÊ¢TÙÐP×OL ä(Q û P^°ùS·ŒË.8¢PŸë¼,}Yû¥’‡ÃìRÊ ° µüObà ^‰ÐOO•ÿ´x‰8Ä¿ˆÍ/h y ý\~ßÜ~³û~ã,ÌåÌSEP P HP^$0¶nÑr þÄÓP„ÐüÐüìÏ$ý]€¾ìþ`À a ½Ð0Å@`PPQÐ W° l§0òðO"À¥ ÐÝÀS×\ÒH~±ë£ ‚ íÒOu{ÐxP P/Ph°«àZU ú I°SGÔhÍx'm‰)c+½c- Õ+% ãû…PÊ  íP `ÑaŸP4@%Å gPf=ÐiÝØ“ø¬qX(s(uwX'ä,×%Õ èiÏ ¥  è‹@ \Á PP0#`Ø¥åPPðÀ}P0uÖŽÛƒ·ÖÙÖiW»šÍSó ¥YP–4 '° ®8Åþà—?€ o`PoPX…—i /…ÛºÞ° }X;8Z«ÂÀÜ/Õ t PQF†ð’À•à pÆkQB0Áß]à>à^à~àžà ¾à ÞàþàÞ­æ6­ŽU­wôÖf×êQEp à OEÈpPQð°.e _×â.þâ0ã2uw°Ô(ÜÔ´ùÔSÃýQðTBPdå°?¾ã<Ù„2ÙQÙoqÙt’ÙHþPX€âïýT0 Õ߬0å;¥äƒÂä€áänås"å^ÎPŽ™ue öÐ"æ-æ‚"æAæmaær‚æþrŽPŒZþTS † %Ô[àÙ}ŽRt(vîxÎz'|žè% [ ÏQµ¯°PÀpé•@é)µè€Òè}ñèkép2é Pa@ Q•ÀPràÝ«^R¢ž'¤Î¦®¨þ&ªžëýÆlÛ‡¥¨@ìÛEágá¾…áŠ¤á…ÆáÌNP(0ËSe°ÎPÙ€ú@Ø×^Q»Ž'½^ÒNIÔNjÖ>îxÐé UF``ÍP+lîîUîwrîxñëiìn2ì¹ÐåRå íÞOU œ-fRÒ` _ññŸñ¿ñßñÿñ ò"ñh`þ㜌ã[«ãüÎPæ°úb·%ŠRd œpó8Ÿó:¿ó<ßó>ÿó@ôB?ôD_ô9Ÿ^Þ$Τbð ~È*@Uð0ÓåñpRdÐâÝõ†ÇÛÒêÛ–—Þ+oPlÀx`bSåQ™M õ\ïõtx`_áb{d_öå˜(PU’ wÅÆœõ%µõuŸøã=€J_SçíÉ{Ï÷Eh¯‚ØÓ½`Rˆ¯ø‰÷Ïž÷ ù’ÿO0EHUNÅ (N‡?÷œO÷žOsÐ.féîIëîm í\îT?UùЋõ  Ýµù±ïõ³_v ƒ¢þ?ú¾0 !Vë0 UxÀ<|ü°Ÿüâ½ü’Wûvû¨”ûì¶ûÄÎ [z݆ °ìÜïýÊŸô²δ«òÐP• í`åj?QŽŸh¾ D˜PáB_dºLQâDŠ-^ĘQãFŽ=JÜe@a–^LžD™RåJ–-]¾lÙË,š5mÞÄ™SçNž={PÊçP¢Eö‚SéR¦MUJ¨ÁPêTªU­^ÅšUëV®V|@¨ëØ®ØÂ‘M˜ @&´ ^lT.Ð8íÞÅ›WïÄ#K:X°L£… Î T(bÆq"Y²R¨m-_ÆœYsÖB´þÛÚ…Ì€Œ–ù­Å¸2zˆñºî^Úµmïí›ädÞ½Ov\¸MÅÆì[¹äÊ¡?‡]ª¤_ßZd Cª² Ï€8ãÝM¡TB2|ÃÈMAð«Ý*… †°+ž¾dý$jèbÊ€á6Œ(7„v[®A§€;.BÊ“°B’s0Cʢ®C?Ä*æaD®à @³ ‚«"€1B$ˆI" cØÐæ"@àèf¼8hg›)$y­;dðF‘)>™G¦yÇš)T@ŸYZç j ò%XpŽ_$Ó6bPC5Y‚ÐB7w¢ðÍ71\þ³N”š31O==D€TöÌÊ4c†ÞiŽw䈇Žyì°<ðÁGŸ=øéc.M*G#'Šk™Ù"ÊCR^à)ÆC¢ ȃˆŽ!ED)3W½Î4(M;ílSNaiŠsX éüµN<e¶ÙËh‡ÛÐÄ=6‘1ˆl ƒ&jI*Ô¤Í$béDúЛv '’ï÷ã}ÙŠC†^‘[xd1w c4jò SZoøN´,š€Óh3Éfþ»-ù€/¼A >Ô—&j4‡ç´A†)"xÇŒ²UN ‚ÜàGx¾p†7Üá‡xÄ%~ð0—û“ç~`º¶îéµÛÝhI Xàb ÐŠ0†Þá9jæ2† €UÀ.1nÅ›ˆDÎu¾sž÷Üç?zÐ…>t¢ÝèG×y̯¥æãñÓ8Á8®<¼-EÀ¦Žè áÖ W‰˜ÀoŒŠ¢g¿?–nqK>Ý}QØÔ)Wu«£ÅoÅ#v` ÜsøDfØÐÆbò}|67;Ú/µë5·üÜìguwcÉ}qt¯ûXŽ”lûb HÅ0‚èþé5 {â¿øÆgóñ—¼O(?,Ë3 ó™ßŠ1Tw†0‡9bIf*€¬\-Hýê•‘Ö_ôõM|ìo2{aÕ~h·Ç}VúäsxýÃJPä/õÍWêóQâvèQ_NÖ?ö³  à—+B;ºzgìÿ*H˜‡> ¼«(;ó;¿µkºíŠ>éû§JÁÈYA7?yAdˆu öòß#‹,Pƒ­0þ %@<Œ‹1™ið(‡Âñˆ¸Ø””@hK¹nˆ„vƒåÂä¯|À#´$L–%dB…˜ H"ÿ9FÀŒÎÙ fØÿ#@3„léƒ;˜DŠhÃ1×€ ÙÀˆo€ƒrx] 1LÖCÀÔ-;d@<¬=ü>ìC„šKÄ !¿¶¾®HˆÊ ´ˆñ˜‚  øú°)°ˆ Fk¤l„ˆô˜öpbœúˆˆG¨}‡a7ˆH„eÀ7€…óЋ9þ4Å"tU<–|>W|Eƒ£0… J ˘æÚŠTqà ^¬ˆñ8:ˆ|hXa')‘€[€=xêð„)Ø‘! ’Uø‚ꀈ7؃dˆwÈ5€ˆI›UHRØÆ)É_ I›’"9’$Y’&y’(™‚WÙ˜­š‚è)“w!É € |¨X™‚R9•TˆñXÉ)¸…wØ’Ä$Ì)p‡>0ˆ †_@‡Ç„0Z£¢ìK³›ÌÊœ‚ËÌLˆ•Ä3LþTQl -€½©‹,h‡ MaÔ„,űDEé3Ëã@Ke¡À„ŒŽ<à:8†fI‡óªM RHW¸]†fÈppƒ,9¾ô‘Xø”u™‹Ù{€ˆ¬óIÈ=ˆIŸ¤, †Øo(‡ÇEötOˆ€ÏôDua—aÔˆˆ€•x“‹ÀMÇ“@²4šÞ,ƒ|=µìC€˜òCØËHEÔ #èmÉ–xHƒxàNò€Oi™—‰ò €VÀ×Tψ¸ˆ†[ˆ)*xLKs€LxˆíÑ.R)™‚•‘þˆ…XÁ†i¸ˆ ºè‚-ÃÚËÝÍØ“ÐáøÍ5±P&¬P„Zº±P‚XêŠ&€Y°€X„B„|p‡pà‚(ð?Œ¤ˆ ­EÈʱ!·¹ºéK}±aÐ)› 4ˆF!8(€N€5ê‚€{è‚J4#8…PÝÔNýÔ¾I›µi›·‰›¹i„WÁ†TP1Xyoxø8¸—°ÌM1}ÀÉs@Ñ„]äK×a‘)¸@ߙڹ¾¤vÀˆHÕ‰, 0À‡i¨€ˆ¨)L:ȳþtЇ,0Ÿ„Wy¥×ˆðV €Ù¡;HÆ+˜ È}ðµ˜Fx|°‡-p…t1VU?%˜2ŽfE˜àN瘂C‘BÏ©†|cwL“• B¥QT¾˜ 2 ÓSÉY¥¡ÐÇ{Öù#€¿É `°íŠx¬±ˆ8/n50É؇ՋƒH ƒc(“}> ˜Ÿu ’͡;ÈÒÐüú4 `zy‚‹äK»Ð àKX= ;¸4øÚcåÙdMŒe•>³u´Å=½q€ zkk cˆËÈ0? [ D;°}=±5²m Äm™=YÍØŽþ@ôLhHfy(ð²Èª YÌ­&Í}<ÎÏ•œ Í-Å­;d 6lÅ Mhܶ˜jÕŠtðÐÈ:*[DÙ¥(Úuºžý,ÜE Ð]Þµ:ñ{C8˜‚±`‚XÚÑtj^çÅ'èU@Âå%Ã=ëUìý8GЭè‡h(½?ˆ0ˆ Rˆ†þ-_à_ÿ`ƒÿER Ô y° eð€Ë`‚>Àƒ7eˆØ5_HBß:Tßéc_ÉsßÊÝѽŒ˜Ñ­`ƒHaƒ0ƒXánáÖua>r(­¨‚5`(½ƒ 3(ß ž]Á [éå,ê=Œî øu7êþ¦aƒØVöâ®â(6ˆ?É 5ÈË8ãÍ €„›®± â&Úà3bŽBâèÑÝÌbâq;­FÒŠè_R`„Xa…øc-ŽG0‘(xàuEà„ ^ãHjc {ã§úàÏRbÞ¨ca{áYÙ©øã@Æb@V=F„­@ƒ±C d@7 3F À\˜¸Z¶å[Æå\Îe¥óØ"î`â¨dκdêaF‹ ‚(e-NP¦â®ø(臄€¦² `„mæænöæoçpçq&çr6çsFçtö抣C7þåô¬Ãã½ÊäW“_VþàŠOå…pfgÎ ƒ¶8†¹å gX†0C †KcvŽ!¤#Û–8FŽyfªz&µWb ­ûõüE<~îaƒéÿé&…Q0D1ƒ²ÒŒxÊ+†nèv–äw&–`æ¨aÖ"™ÞŒ±ÉAÿ™# $è¼­0‚)Vêfž ‡Î"ˆ–‰> ŠÎ(‹f´ípYÿYXØ“ø`¨H¦njš.³Iö+œö'Ž «n3#°ÈõŸBP%² u@ä~â…øCk´pj(‚jAkoRëú)æ¾¾ 2ˆÚüʃôÚŒE¤©P† ìʶìËÆìÌÖìÍæìÎöìÏíþÐmÌfç€4kÞì]*l?:lÄ®ŠA`‘:¥ÝŠãŠF°\†y« 2 ƒYîàîá&îâ6îãFîäVîåfîævnáæe×ÓM›î¨Ôæ¤Õ ¶³? †yPå±p‚±ˆ†} aÀ~ m„°§GN¡H.kê–ê=2Å tm´0aKÈ f˜´˜‚w°àª(Bœ l 3‰ro6&âÍ=íî²n_¢ê}Òn$›Bȯ}ð;© P\j©hïGø&´÷¯§ § ï1Û1]ü‡˜þ$8– škWpï¯]1(¨Ö¾o†(‚Þþo B…H@‹ÄâŠ~ˆl©ˆ™µ]ˆçñã!ñSr!ò"ò2ò#Wˆ*uÈ!H€²@ƒ/ d¨ €bÆò,?œ-/¶.?³/ª0Ÿª1's„?òÅ.>…‚^ï„ t†¨s;ÿ<77=74>,?,@tƒÄà(è_S…DïDeˆ9Á.¦ 3Gó‡tïe—oK÷-L-Mßô ÈÐ… …ƒ`ƒ`g¦‡dî #¸¿ªÐ]¤Š"à;8×ñXg"I¿8JO5[ÿ.\.]ôRk…øõƒ(ƒ@Pp‹b@VЀhö…(kþ@ /"sGwlºƒ0PõPøßþÅp_Hë‹ÀÂèØwôוJºuojo;k?6l0m/n'óY4Nˆp7‚JxƒÈ.8ˆJ¸²D˜€ƒ¨cÿãp÷…”_ù+s…‡,‚×åk²È(ÔŠ¸E« Ž Šö‹`ÁFÖÑ‹{ÈÈôˆƒµƒ\Rœõ¯õxn_Ž0?r:­ƒ…¸R@….˜)_ •=6'÷V7ˆÉ eš_ûPw{? Tè„A 'gvÛö$P¼ €F€õ‹ `…pµà›š•úŽ€µˆƒa8À¬Þþ­OVì¶ °¿ï3-ðuƒ¸ƒ`àZ`Hˆ-šùƒ`}©-p€Ffæ^qÛ®˜‚àŠ(ˆ`¬°â£x‰Rš™‚|ÜÇ~ŒˆøxÇcœFOð}¸Ø\~}äGDõ`Ç÷øÌ)ˆ™ž~cŒu\öÁGíwþtô~õoPéFV›žo¢ý¦`qC‚na¾ôEŠ ¹P94*HPQ$‚’Žt1ÐË,‚ A0É©‚2€9ü$#J” 2¦lé²åå”KÖdY³gR¨Lërf РB€‘"Eò¦<è#……«wc¶ý4O‹iï¬}þà )Äiú4êT ’’ö±#Û" ÈNñÔ§Û«Xµr²@Û·qýPÎ/¦N¡J¥ê—­[¸B'S®ÌdÁ,¼pîìù3èТG“.=º—YªW³níú5ìØ²gÏ[Š6îܺw÷‚`ú7ðàÂAK¨ñò8òäÊ—3oîü9ãPŽ€‚Ë@H|± ŧIæFP5*E!¹HJˆ¨'ܽƒ?ƈó,º´j(Pó\AqÒ\+0gÀX :è`•EÔƒKeÑÎQ)Ü€&Aå!)¯ðÆqô¡PUìBÖ…nØ!PD-ÇdsÅ0>þBx¢ˆ$ÆÀŒBÀ1¤H€ S´xÔ‹I£„QZ†Aš w%–YzÚn]zùåk¶9&™¯õ¦%ši’Vmºù&œq&WMÈYzw¢‡z"—IžÊÍ@wÔ!Ïð¸³j˜CÀRµÔ“N¡Ïƒ´Ô{8HcäÔ#daúà¦?ÖAÙ\àÓƒœzÚ ”•°êd+Ì3–>!\šiª¶â*%±A]æ•j*«,—e:û,kbB;-o¾-{-šlú¹-·ÝÞY·lh·™(ô\88÷Ä6̽!“Kdt!©R?.ÕÅÙT†ŽùXƒ]pAþP^ů¾•YZ#]Bñë/Àµ.Ô=•Ps"=ì!o¾N\,±Çf¶¶%×,µ){)­Ê-›i­É1ÿ¦­·5Û|óK1µ '(¦LCHÍ|äC`%!1g„sHð³Ò)É+å ¼ÐÈ·ÀÂ61yóB ¿ÀáëàpsÊ-»ªÒȽìqË ÁŒå lÝõ×@y’”Q¡TV¯"BA‰M¶Ùhß]T zÛýÕ ªpG6Zsí5؇ç½7ÈQŠ\%É2{.Ê.‹Ë£‹~æç©gέ»~stò:í)‰‘Ns© ÀœÈ À€NÏecmဧxôSé3øØ³þ…+¸’?v\1ÖSd³ÂüØs=?£4ÒüóÑŃøÔ ªãEPÓW=٣ߠúœ–ƒi φ^ü"ÃHCêˆ1ëa[Ä4–iˆfŒ™(Gz˜cr  ™Íé\€E¸pxb<$"ùE2vþî&C#©µÆH‚ÉŽÄVñ¨I×mfؤ·œ€åxa VTŽ2XB T¢Š|%,c)%F^òŒ©¡¤Ë&‰Ë.Y²–ÊÊ$(ƒÙ­v ÂL æàº0‚üߎ̸'#èpwƒXà×ÁžAnrÃj¤€9*H‰48a ø /œ ðr$\ H%îá'' i Ær†¡Žà8Î0QRF “æ·nÍ„[a"{ÃA¦('dÇ£„bðE=êS¯úÕ³>·È 5Ä9ãøáB¡’,å5_»4ï¡QÈB ™Crl0v!è"`“ïOÁÆ>â7uÅŸ/‹Ûw5÷º]< Œ‡ÞWfŽ€–œ"  ä-a€§]r ˜ùÊ¿,™ûÙ·ö¥>U­ýÖñMs'2@€ù½„%xÔqÀ2(GŒ$Àw¡IÁ&’üAý%–ý…þÑ”þíŸÍ$«€  þÝÊIÀqÅ ¸_¶`]`ÍIœôEË©Í`ªÔ’`·0¼E (4‡$ÄÛ¶ G(Ì º ”n1Þe am 7ÝàBå n 5ÀË9ÕÁI¼C¿-Ç4TÛK0ÂŽ%G"ÍK °ÄHRÆ¡ ÁàÕÉà FP JŸ f¡žx¡ S1ìÁÄB <@7!JX€":„€r$Ç @,¡f"J=!ìÍŸÞ!îÒ’Sú¡œl:i‚(h!l „> Cú½Ä¨Ù³5bA,Arüä•¡&£æpbó†jU(âÒ(nSþ)š"œ¤P:¹C´+@r¼²­Ür‚.ÄX &£9‹1£g$ãU-#%5£/=#4ºI :8TÁj$À4TšKƒ>´Ýq8LArЃ6xÞKÈ$C9ž£9Òaã}â ºc$Ác-Éã<ƒ;µÀ#¨† ƒŒß$G:xdrìCÜ4ÃCNÆåÅ@$JdR¤ôY$aä%iäF:Ç8ºS!ô€,ø€4Dr€A*Çÿé‰4öU0‚Œ˜Böí€MÂN2;ÆO¦‘O:P%sôÃW¸È/°s)Ç<0@r0Ü Ô"r˜þÁNÅäd˜e胈8ìA;T,E`faæ$Â2àƒÀ‚;…t§” Ee^fff¥Pl%‘ueK}e…å%Y*‡/ C \ÝÇèÃö!ǼBrdƒ:ȇr ¢´,Ü@.Á/(Á2dÁ8dN Ìà' VhÑ2EtN'(ÆY4P†a¸btgaFbx&:¾ž:®£N>iúišj¦&r 8:Y€4 r8ƒr8Ã!‡Òr„C¦šZš®)J Éd¹ÓÂr8Á< ÁæA8$Ç|ßÊ…4ŽÁŸNA(Ú<ÂØÁ b.˜*xÍÞ«°«äÐMþå0Žã@N]0ëã$ ¦Šiznj8uªé|ê9–¨Þ ©>”B"ƒQ_sÃhùéTKûÔÉÃXD ¨B9ì@%żÖë½æ+ó8éÿøÀ@ÿü˜fªƒY«7aëèh«ê„j·Ä·¢ÓSâ)<è‰0lsBIŽ8Ü*˜Þ$µª#Ãî’ÞÌœ¨ÄNì@Tì9Áƒ8¥>$r8ƒ$üÀr<ÁdltØêºŽ¬&*¬q,.¥¬Ë@l괬˶©;n*‡@.¾„$¬rȃ<,‡4‘/dƒÜˆ,Ñ*ŸÑöÒR’Ò¶ Ó·ºl·ðþ¬;ñhsÃÓù‰ÐØrÙ–-`-c¥m$­­Ê´­ç8íÄB}ºš%‡ ˜àKÔ&r@GèAˆtÁßnT î`..­lz*n·®¦;QAðµD 0ƒ2ìܹ ÜKèÁ4Ø­5ì• ¢*-è2¡èv馑éR âʌꊪY6Õ9A<\mKlA/àC5PœÐKœÁ7$‡¬:9@5|nñžÔñRUòÑòNKóÂÑÛÂí¶ eÁ@àÀ7H€Ñaƒ „k—!°Kt‚~DT¢oú–ÔúÒTûúÐû êªãó®iG¢“34]KD@*þ°F”C™9„0GÔ(Ç7¤¡ˆ=ï“,zž¨óÝa˜äáóůÉT0ŒÖ#Lž“%€Öq˜Ã¬†-ô@‡¥„4´å¶„$ƒõ¾DaA\°žÖm]1g±oñ»ž‰ŽiŠN\? —Œ˧L#:eBœº0¸A¨)äÂÅ4ÓÌAû‚E „~±ž 2!r‚-^'b`£Ú;KcÒüÒ¯ž/å ÈÂ#HÁ?ÇÄr0Ã8¼nA°®$»rå"s› [Ü#_˧¦Øªë1Ýrx(ìCÄWK< rŒ¯ÕØñ¡Ô–rëœrþh¦òÍ­òĵò²¼2YFTÓ´ƒrDB´=¼D ÐÓq÷º HE21ë‰1k*2g2£3ÿ’8³›8ÈÁ9‘ƒ¸$Ç6àC7º<\nJìqJÁ.Ø¥C0¸‚;ßL9/ì9?^:—Ú:«‰3%1Œ Bœ Ã8ð"rBÀA@¨ÂAÛLBíBÓ^CëÙC§ID¥§ø³¡Á&·„2$àKƒ7ˆrJB,,Ç\rDÀ‡´·”4Úžtý¥ô‘­t9õ¶È”˜0åÂíºD!ØgK8€>ø#ì&‡"<1G̹8õ¶õà"µ*u„1µ–´ôF–þ<î&±ÀøºÄ”äKPƒ°½=ÌtJ¤C„¼D'€‘uY'r Òp Gß Oð1ºõ<Oø~ÝÙ½0\Á$‡€­KDM¹69#v*¶k4r9vóA64>È4tKt9¾Ä'”ÖK0ƒ6«"*À¡DÞ%žp7q·q7*hO$i#™Z[g‰j›b M0%€¾Ä#äöõ¶%œ8Áø5GÈÀ •ž!Ÿ7z§wêAwsŽ Ïpsã!c³2jÇÞtûá@<!L‚rü4J  Ä>ìõqB£‡ÕT5ALà +ß´·r¿÷Oi“Itþ3T;ƒ¶rÀäóc.òÁ »Ä´ñKÀ´Cüø?¸5E¸-wNÆ÷ž=7…Õ7ÄÝwºü(X£Ä=¨dK¯±Gs)h4rL[ƺ0Œÿ•Œs„Y.ZO!Ž+™Žgëà(ÀgkõVöK4B ¼Ä6¼ƒ¢®Ç",ƒŠ;„d¿ø”ÃR•Ç0Û¸|Óp†_É—“à&€–d7¿É7¨Ãœ4ˆr¬´ÛÞ9„KønQx–+ã–÷Y—«Z ƒ`Põc!Ws„0ì‚“§DpóK8cÊnWº¥Vžqµnz;vº·}º¨…úþ1þ´B0Ál£„!¸©Cˆ‚œÌCœ¨:Ì:r(Ð_ÕúIݺ{Ëp…CÐ…ÉŸ°_ß(»&™‚‡ü¶CÀ@ÌC,˜€¼DÀ:G( .‡Ø ­”k{Iqû„{»®{%¯çœ¯ßY¹ëÞ=F09Br/‡'`À0 ƒ t-J<:ä­Ÿ¼Ë3d»"•A½(Á>…cB¦dEÔg<èC2,ÏÈ&¾¦3¾×G؃[äK¾K¨Ã¤oœ¾s0ƒ¨FtÁr2¸AGÄ'Ç ú¿OÆr6çsNjí/Å"ì]L‚ý¯B ÂØJì@¤B7†Ú”}¤°põn̶)ªè›ÕbÜ™‚S0fÔ¸þ‘cGA†ôx†/“'}e à…eK—/aÆ”9“fÍ™½üÈÒ¹“gOŸ?:t(¥ˆ&Uº”i/6¡F•:¦„(±fÕº•kW¯_Á†;–ìÖ,ДU»,š<]åø1ÍšÖ"¾¦|UDå®ZÂ$k²l”gR¨Lër&¤;°¦ìÚ’Ñy+ÇÁ @sÆFa”àÍ”,íR¤¾@Ó”Ê0Nà,’vmÛ·7’Ôª’joß¿½àd:œxñŸF‘W¾Ü§SàϡӴʖzuë×±‡=€Ovï¾hù*‚D×j;–åÕº(ØwÖ²c”~}úiBz°_`óþe׳ÿë £Ïü#p }ì …´ ·!Œp ݲâ-º /޹ 9ä ¹AÎ9 I|nºïPLQEk‘«»"¯y£«Ž`†+(¾€Ñ—*š@yæ€'Ž7ÖaC sø$i´ù"µÚ™a³:0zÀÊàÑÈÀ) ìb‹l8ʬAÿ$LSÍŽ(ÄÊÂáœJÃé$îÃ:ñjÄ8ù„êD TP­VrP²*I¢:$LP”«EðŠ)Ö"f_¦`Æ­Èè¤PP¢‘)ÙÂŽ ¦ø€XøeÁŽ8%uZ`UîÑãJ˜B6o^há8Bþ˜¢R¹Ç XaÍi©m¥7ûÌ6¦9óì6¨;½õvOmÉuéÏCÑM÷;ðD]ì ¤«réj€¾º‚EµŠ€e_Ô@®:é £š˜â£œœBƒrúˆ‡ 3}²0EƒûðÄ“>h¸‘gð±g W°äØ“<æÓ†Ú—Ó´ö$lË%—ÛpqÖ Üœë·frÏ}Wè¡ÇÒÒ¢·rG¯R™¤+Aàê;¶ùŠ|Ç$ˆé`öæ±É.B™M¢ùç>oæÙÛÝÑçµû é»ñ>ÉêÍû¤KFùÊkØbDG·J¢€µÈ8‰ Êèª`³þ)¯ÜòŒÐNi%ºµm;n<áþ|ù9‡Ón¿Qw–IÝ—|ô¨®wºB&¯LXE-.ÊùƤ:hBr±//Þøi3W»t==ÄÐWŽôå1<ÝõëÕ€r°÷ê¸*¢ x¸rÄF¯ ѱ,zœ6 rþøùé0ùÍ©‡³ùè9„ž⦗?èX¯{D‘ôÁ$¤Ž ìÊ-À·#T€+H &¼"Œµ%†Ø~!¿ú„#)I…ð'@ íïËñ_ —@þ†€´!vÊ€l ® êø 5”±A9T¡+ p…Zq”ŒÀ(Da ¡XÂûÍy9þáóŽrEé=…ŠÕ»Ê Áˆ¢…ÝuQ€u˜0# „ (†»ò‹·¥ÏJ € <1Š}œß»jq8/$¤PdH©Ô0Œ$K,Gz¢\a@üPÒ‚[øÁ8ÆWàh\å|ôã)-HEg‡TŠ!]ù“D®Ò&Œtä-¿‚=¢®uðJ2öÑ•º „°G3º <®˜!vdÆ.Ô•e¥qaCå5SyB7¥–Tie,‹’Ep*e–Ýœ‰-q™N­Tâ(¨ë¼b„Pbå `ÃÊ',aƒ|á €ÆV„о±ðakÄÊ8ÐZ› %›þ*Í)'+޳8°¤¨NÊѪ|Q‹!P Ô€ˆ\QßV:!Ьd;á Þ±{¢¤3 1²ŒW¥Á+dHÃ#€T¡•¨E5êQ‘šT¥.•©Mu*Pe ÍkqS£6ùæE}bÑ‹f´ª-A§G;º:(4òà )ÎGSQð¤gèV–`Ó°á[©¼‚…Y앯}õë_XÁ–°…5ìa›Ø¾Z`7TíêM&ŠÕ¥h•¢\}ìWÁšÎ)~#ûҌjŠ¥,ЉJ 0` p@AYÂà€­°Á(°Èìm½¢¼Çn+²’M eÇiÙ®b·ŽŒþœ‘7pt+rE‰Ú˜È@ÂèE‚ˆ•Œ£¤cénVf—¼ÛÜ-T®ê[‰S½ÍáâykBÜòÞ0œÉ[6æ¸14+N€ƒz°R€d£ $p®/Š0O°D¢j\© &0ßùê¾-I¯z NáVU¾.`-0ö@ÄZÑB'¶Â‡3ÄCZ1Â*A–9Œc˜¾@BÐ…“`À(Qópq)\áàô¶½ßbo‘w²avøÇ×0ˆ·Uˆ‡+[xBYò`øhåxh¦XŒÀ¬@Á(xÃ1´a‚^@\“Óä _Ø·Ž¥’#Êd8£îhÞŠþ0ì’åàŠ4œÀ•{b,H-VF“ …pϸ”3|é,Y;»ÏæÔs¥ñ£ânFˆàVö‘\­Œà[1C>¸² œŽGÌJìÁ*DA €p@&TPƒ4ëƒv vä¥Ï›i¬núîæ§M4] æ0à2`­/48+¬ÈÄVÔ€ ¥³ÎÊ €Ÿà@ \´‰ìÝ*û¢Ì&¤³i mx¿+S ³2Ñ Ûæ´, XhVZð þ~eoΊª´A‹ž8Þˆî¾o(ïÇÒ›¢öÖ"¾W©oŒª } Ã‚Ôƒêû*K+Þª–…{…àø²V€qþ0zð„ ï<µ¢Œ èE7úÑ‘žt¥/éMwúÓ¡u£×xfŽ2K8>N_äŠùȵÜBO@F0´lP+À‚V’ðge à8°0Ž €±P#Â^ÙXÁ“W`£ƒbŸxÅ/žñŒ/Чzu™dœ[‡a×ùu°*BÒ‰<ôÑR§®eÃVT•J b+šÀÇÛÃB8°paö†Nü@mÙkerõ=µvùªKž·H&Šå[ˆù.j~ó0ê±HPÛÚéb†m§‚­p¡+WÖJ:è!€k7@d„ƒ ”÷Äûýû%|þ&”%òÿ§|*2¿ù)òÜxâàßÐ¥”i,Ì ¬øKj¬M,@áŽÂ"XG˜¨ f+zþ@7äϼèÏ%ìÏ•ðôo†ø¯ÿ¾ã3`¡'| åVnEŒáR¶bv% @´‚À}ðáž@ö æ¾Ê‚ÎŽôaâ §Ü/­P$F0òJÐÂˆÌøz"£gU¨]0;bV|ÂìÐ.o’@NjöXï$VØÎ D ,€!¡,žŒ൨ð  …/m¬îêNðÀÐyÄP€È° ¯#‡¸`'¢À@!ð ¡FOPVþ!Û²b A+ÜÁwÀ"@À@¤ ”¾âvAÁÀÂŒb ¡ñ9" ‡o ±® ½p'Qt1©#àòàfa ꣲ^dPª!šÆÎ(+ ÀÇN¢`'jS ,>ÕQ ‘{ñ,9~q©§q-d#A®ÀÀûÐ`Ñ$fö°˜0+šà°âàa't à R¶â² ½Â`ÊSªPo‘5LJ "?‡—Çï±, ÉŠ2Á(bÁuª ’+¡ü–A tâ  R+b Õbþàæª#Í&‡ÐÄ#¯CÒ‘L2nP²tTr%ÇÂàÁ ’àUÆ@h³‚”%VÀPâàPÂSpÁÊa¾ÂáÈb4Ž•r#ÒÌ( 6¡Ä@#Э)rM@Rãºj*µ¨*Ýæ*9'+µr-®À(‚òP0A¥ÄÂÀ¡ç r²Bò@ n€¼¢X‘-\(/EÂLá¸v 6ÌÄ3¤0Ÿrþ¤Òá‘1yÆ1é2#³,Ð R]„A-O¢¾àâN8)+*`5±Ü€¾" ÒÀ ª#HnΔ<¢ ôÁ 0¢^å2rÀ(4ã,è£BþLà' ðA ö6ëƒl“q“óŠx3g|sm€38ÇBÔ <üF ¶ +6Ò²B¯HÓ+Ð ¾Kæð ò+ÒÑ#b`Ð8#î!=/cv`6&áDW!Haà³v@ #V¢%?Câ0QÈú†þgôg”@Ãbzá]Ô9Q¢²‚t'+!COb ¸í´¢ ä`qªƒ¶¼Á(À8 J€Xà\¡rA†¡ ²`DÂ1 C2(£6gs6$4¦`4Jc Öa¬ú -u$xT$´…‚4\†´fŠÔH¿#çý¥ Öþ q´‚B+®Aæ%äÀ‚¤ AÉ ¾$­Uñ#?ö£?6£3ô> ¤61bô!ªàP*³ªõU\Þ‹#UR½â`ª/]jñ$Œ!è²èÒ ˆ²,¬A Ì:LaW\ÀFá@* ¡þ@æÀæ# DJR£J®$K¶º„6oM À”à®a|Õ#57Iò8ŽÌøµ\’UY¹’]Vn‚!+ÂUµB*T+*@:[+aan')CTD…TLUT…U\Vd…VlWt…W|X0¢|RÄÔ``sX{tÎþtó‹µ[h˜Ëa…@ûÒ¡¹¤idQ–+ à ˆ+¢.Á:À &àBß0 a†a0âa"fb#,c4Fe>&dÄ>Äg1¢`ùsh½°hóähµ¥a•6+r/Ôå¼+Â+Œaä Ö`´N š5q„Á:«Cƒ¬! ÆbCõ¶¡øv ‡•O7[·pQB¼f[±ÀcÂÛNb˼B«:, ð|A6b tórtQ©tKðt£'u{æX·°u]÷$&¦qÅ”^+Œrª2}A Ô៺ð!BÙ‚„€û|þ`ÜÄBt÷xVQýÖø˜—NV·n’6zÑ"zwPÞ)Áâ*¶íz +òÀ}»âæ€:„AwÓ_‰7~yéOyç~C$ùzùWU±oP „“ó²bAõ¨V,¶ d—,˜àX% ¡ì`kY“‚Ê‚‰ƒEGƒåÆyKЃ£ ,Ñe#ßtÕ”@v‹ ²«¶`ª£,k ø}‹W‡¡ˆ‡%χ?ˆ;„ƒã„ˆ]·à@‡EK}¡0+á4O"¬Ô*²‚ ì Ò f.Å"|0+@á@É~Á8Œç×`ö ÉÐþØtö—åD5WP €|¾B ÎÒú¡"±Ä%aF*Ç" ÐQb;—dùšÄëÉ̘C*¹DÔØu™¶®œ”" + ü¨a…}!ô,Ëàpx,þ)M" ð€ÊVC¿ø–ë'—}t—‹¬—GGˆé/˜ ÷`ˆF(í$œk#  ^Ø~açd¡n ¼7žJ·B޲,YœÇù‘û6’%Y½ð—I„•–ì &Pœ.ß`M‚Î` °âB¹º#§ä vÂXá ÈH,˜ ž%ôÃiC÷§ž*§uz§yº§þyZ Út͹½Ð™9$Ú‹0yh„6ÑG*¡¾BœèuÓ€9kÐ °a'ª`ÔÁ:è®¶+–º©ÃB¯ï¬Ñ:­Õ±¦Ú¡q’‹ì¨/„¢•¶¦å:õ$¬!™÷ŸÔî¶b¨ Z! @ T¿â ÎÀ市.4£“zh‚U£È8nŠz9è::ìÚaóà…æÚ$6+z+N Ê´^ ÀÁœ,ôÎ+Œ2&i*;¢.Ûm2{‹DÒ :[Y€úÀ|aäÊï¨×.@°ÂH!+®ù$„a¸A¹+ ,½BÔ¢û¶);h1m¨1L®Ûkþ³è’ÁPzäÒGœ!¥½âòË$HÀ|‘ºÂ¨à&kÄ ,†áçÖ[hrÛœv›gzÛ8ÐÛDÔ»ÀW„¦FÈ`°b4€,8„sÊâ¸ïcµÂ ð&ÂÑåÀ»)ÁsfÁ‹£Á#¸•5 cWD¾Û$á»’àlŠÔ7+À@Êv Æbo¬ÅÓEÅi‰ÅqÆÅH‰OÆ%µÊWÄÊ t›×`‡N‚”è$N<+„! *‰,’àü›P€{™<ÅÅ;ÙÈ»ÎÌ[½`œ†˜‹ÖúÏ=ЪÕbv Fj¬éIàŠ  ºþ¢ØÄâ$©,žOæœÎé®ã¢–Ê%ï\`|ºÔMýÔQ}©:žÕ"`Ia¤(—t+žÕf›JÙ,˜Zl‘Ð"3Eœ|• <\¤\D@ýêD½Úø€ÕËÂö²[EP ÃM¢ R%Š „°+  ¾z+îâôÊ‚d€-„NêÜýÝá=Þå}Þ üŠ]‘ŽýmòÜ·öÜ7šýÙû(ÚÙbÀ=;¢ÀéÙ1ÉOB >É$¬a¸0],4ÀØb©7¡OÐ=þãAÞ¯ú@®î=ò½[’½)–]Èþà¡Hàׂi³WE“¶+”wþ±â¾Mº=ùëàà,H|R¡ÃÙ勇H¾ÎçíÎ5mß%«ß{£å•~„`^-d1 „-à}îÒÌÞºR(g, a ¸,0°‹Õ"¡¯þr˜Þ­…šÓ×ËÓ)yå+Ìêë~~²^-žï¥…LØ$P¡ÄL"¢ÖŒ ÈK®+ ! –AÄÃbYmî“>ðÍæîµð­9=åcÈïá ðA¿x¿,t)h^¤QŽ€Á ¨Ì$HÁ6ÁÖ°‚s*+Ð` T{- €r‘~õëGôw‘ôáÚôÉ õÏKõ•¿rZŸ,ŒrASDîNb æ)ŸMB´þ Ê -´¢*% `¸:TEÚçó«ÿe˜¿!¹ô¥«¨ž*¨þËæú—À ú2’@:ƒ :\2‹ &ÜvÅá@xîš—@ 37“4š$x €§“&Ét™3¦Ì™4kÚ¼‰3§Î<{ú”ÉXÁ,¼=Š4©Ò¥L›:}Ú´—YT«Z½Š5«Ö­\»v ”×±dËšíªÚµlÛ*•Pƒ ‚Z?ëÚ½;ÅѰòðúíÉgK-„Œ˜!'¹¨K2Å'14¦ñ[riòŒú%±Ã"å¸mÐåßÕ¬[»îthQ·´kÛ–j6·îþÝYÁŠå <8V´¶‹W W.Ý×Ìo&P‚ÇN)(¦ÄÕ@ßæ®£.(@Æïã˜iHoA#Ì|ñ6À`ƒ]C‰uOΚ*ä î M©Æ]xSlu\ƒ…›pNh•o^˜qnh\rÍ… wôQ ®$tKLh¢_Þ Œ:¨! C)T2  ÁC AAcCI¤1UŠ|Á_™(J˜ÓŠ`M @-^‰%PB-8‡^¶!†bêfá˜fj¥á—j"ׇËeùW6ï“ L^¨‹Š,Æ”È2ø¸‹;1!ðK;{PQLa°Kþ<ú$ÓL•ìÕW`ÅqXÁàÑŽ(Òäô¢€…­¤$AÔ1 ´ª9±Æ5¾p1…AEœÔ@.VqpÌJ"dÚ“/é´¢ ÙÅ•p.{ ‚1¸f´QMufµ_…em¶²¤)m·Hy(ˆÌâ•ÈäÇ:zn7Å}HÁ‚+ LŸÌ# Ó¼cͪ Ï,-Œs5SÜci_‹ìP¥·°Ç+B¨ª`5`©U¤*— Ć Í¢IAÀìpšFÃüaèÜ`DáeQ*”8­(UêìŽ6Ø‘Ï>Û@¦lÚé§Sôùg ã>­¥lÞNmT˜Ú^-þK™XÉ-Õ҂닸Pÿ„óMeÔE;)¬}šÄ”‡¤¼ÀSè|îT “ÎÛél¥ÎžÀtË;ßX7Ûds5ÔT1EO8ÁÄIcÄ­1Žvû²D! B­ª QÐD£Q:ÞØâÌ0œÑE ‰`&à †ÕöØ‚+Ò8…Adv0Ú¾€>x"vPL4PŽ>ă ŸÎhÐ9þ°ÀŠrÔÇZ#pÁ À¸ƒ@B©ÒiÄ » •Nâð£Å':`  € ð€, 0€}ÜCðXÇ ¾À“o€a«¸€Lö€È$¢ml<½1ÏzÞÓ¬!’æUÃÚ ­z58]oYÀ ÞÚ|“»ì¥ÉPwªaAú’¤²EÌÁ=Ä |¡‡o$ÖÈJQÕÏ#ÌÀ0[#›á¤ø˜’6dBqèÃnK…¬d)Ûˆ¹Öõ®ímV‚…øÝôG¼æÝMy[ìôª¸-ë-q{#ð°ìƒ'ñ­ÃY#IøÊÄ/øÐ‹Èþ€IØò†rdÃ!ÙàÃi²ŠZdc Äç$l—8ìA3y¯©*µ‡Å06ˋۼ«™MÊ9s{}¦ZKðø¢J*„xtºÖÈ!†$Lö‡t£#%©24!—ã8±€Àì“J¤ `ÅᦀãèîØÎpòîœÃf8åͪNZN]œ“zÖ6é±€€¥‡½¡ É©/!ŒöD«ªiÊ42À¢q:ARL÷°`qb‚g~è™ÖW25¬k“êVs…Õ⮊œ¿ÍYs{ÝS°µ€<Ô¨¤îá‹t¨ å0F @TÔ þ”)B'0¡Ó¼cÈ‘ú0å/÷ŽÝ÷6ºÁD­r“ [ïʹ/žuS|ÖîîO6ú€‡$‘çû6ò Ñùâ Ž`‚Bë‹àœ d†Êk„ŒÍ>¾qð-t*í‘ÛÙâ WK¸;~rküãM7ŠÈ•~æ’÷§à€Æq`°®!jØù@ˆQ:‚÷Çöð2CŒðVA }âXŸ5Ó«î”§C½*R/7Õ«~õº·Wëä ÏÆþ˜] !€‡.()„á ±ÆÝ0äâÔX¼@ü¼KG˜î‚?óÝñνï=k_½«QOg7•žÔ„ÿN2•òDþ™AŠ‚[Aà oPG$"C3Ä P’4Že”P#¿@Iæ>{»Ÿxš°WŠê÷Þwqÿ½éÏ>8kÿƒ@ÐÐÂöÎPX7¹”i©–Ÿ”è„ÚØ­—F9gH¹–w‰—ñ ú°‰È‡m¨ é0üAz B^è Iàv,qå VñG$=—™©™'Ñ– (”âF”-F—jf—›išj¹ ˆq yà Ó`ëç 0v-@h vˆ‘ c@Aþà¸@\pö˜×òpšÉišÙ}ŸÙj¡i^£9c¥©œÕé‘`€ü B¨!DÐÇÇ‹l°b€ˆ€k r0¶WßptÖIŸjÉœ°çœªã%*Fõ  š¸ð_,ñÙ@Ò #\Pïùiè Àd©IÀ#‚à#aIÀÈ€^°üÀJ¢6cTªMÐÚMÒºˆ3[=At‰òÀüŠ q î•@ó0äY£Ð˜ ¯pã( ¨z„Ek´PS³øy³Z–hЕp ô–: æ´×$´ÔD´e«€«S…1 b;£° ]pŠò DGU`€˜ày§‚Ä#1K¶zK³Öø°Êj>`™@HSÒ;6``¹Uu«DwÛDyK¹?„´—è aa Ö@2pÈ€ÝþÐQ31c•)ŽEÐÄ‘2»ºÝe¹—›d² =   ^eºG„ºD¤ºÉk°|«S£G1¡  ñ€óP kðŽ`Y+àHÝཧuP­ŽÈ˽r¶(š¶WayðSMb½Îú„Ù;>Û»¿ãÒº˜81= 9õK%”ÎÀ-UæÀ Æ‘\` wÇ;¹ ¬¼Èz¹ªw =Õ¬`²œÚD”¤+ 6À / >¬= LÂ¥6¿$E 2â~¾ ¤P‚ 7ÕçE¼Ñå‘ú»Ã¯Ñ¿Qú¿W±†… ²´°>` _ Æa,ÆþaŒÏ[i:ð @s«³ÝƒÃ^£ÃQÜmKü9ø°F??3E`€(p€{)Æã KŽPlǬ1ÅU§z¤PHn ù@ Za ² ‰Z<°q K62B%p@Ì º`ÆÚ2ÇTSÇŒ œ‰1Ñ!PHpãp}bhTÐ~Ð{éȲì‘ÜtªŸT ²à •` XÁ¼À ÆÀÛÌÍÝìÍ•–U’¨U°‚4é°5¯<5±Ì½xè UB˘¨ Ø+à l`@rhà5bð©ðäQï°;È<þÂÊ,ÅË˼ª'Át ²@´Ð6\C€ íÑ Òm² *0Îìq?ÕQ ÃÖÂÎÞâÎÉ‹Dz JÿxLRlð@¹×OðÓ:" E`WÐ ltð°«Åà½À İQÈÀNðQÐ0U@ X \ ÛÐ b@d`h`é°os0up‰}Ç&ü°z‡£D%Ü€jà²`ÛÀ2XQœ ؃MØ…=Ø• ¤`Òn†ÒZá³(THÕÀÕËÅ®ì°ÌÓÉkf0Q!à ‡â1ñÕ ã0 ¤F Ý^ \Ð8Xð8 Qþà ÌàÊСÆ—ƒpjȱFø ?ã€È‰1M y@¸€  Æ€HAÉtÐíÐGñ0öH|Ù¹,Þ=Å ×:ÁÌ §w@ ðc¸ Zp` YaºÑŠ}Ңܸ@ á ?Ú€´ âœëÀ>P½¯Ç¼V± ­·›=©ù ,€±O[ÀœÖ$°a ã-⪵‡˜@ö` $ïí tüP@cµ¾ð$ ¾à (pQÀ%à Ð14ð M0à³Ta}°x°~1ÀPà °ÐÂl Ø0 ¾ eðVþøÀu̇¨@v@+îâkåpe0ÞÀ ÚÀE[W0 Ñð P° MÐÇ Í`:Ñ´!ð éë}qzç<ðÁö- )L%1…ù ]€é™®é›îû½ØgÜØYáAÐS »0¼O` Яë±.ë¯^ÕYñÒÝ’Ù«»ÙîЦÔð è@ Ø@q4¥,;ÁÆÐÚðaà cpGgGz¤nÐï ñ@Ý$Hü àâÍeä€#N à ÊP à L Šà Èà†:‰`ŒpË •- ú° PIO þ#Šj `Âð ›e†°   Ðà “£ ÈÀÛÄ ™£‰ ¹€N+°?Ð>ˆžè}ÂU| 7P A°}À nù­"žÞß™ë=Å8Љ@ WA C¾` MïôOõM 4\·îà¾ë”;T¿Ó z’ÀL* LêÓƒ F HÕÆ°EÕOà VÍíÕ° ¥Qm5  Ñ€›lÄiæÐO½š”«3„PÛ Çl —‚m`~Ð…… S0),b)Ub4Hã)3«èè¦w¸P$¢+ :P}TrZ¡ó<þïóŒíß8+ pPHƒ€ @ Lpº`Ò üÃOüÅOüA€ t0V¹þ5.ËCµ"sp00! ·Y> ×5pö)ï“dÐO5`  P#D0@N0Ý€ð iŒ®3ÕçÒ`Ö'vˆ3Å {}ýágGÔ{9È›²h` ·ìy%€'ƒ!EŽ$YÒäI”)U–äÌ×Ë—Yx¡YÓæMœ9uîäÙsg/?²„%JT‡,$Öɲ¶ÀS¨ŸŠ5 K T¬Y¡F1#‹”Š©a‰>-%Ö¬¬hY%U1‡ƒ µ9I°å¡#Ô%¼þyõîÍK€)AÂö‚àÓðaĉqJ¨Ó™.+%O¦\ÙòÈ W¥HÑc┄œ‚ Ó” °¥:ö´ ä–ŽeϦ]Û¶m2t´*RÁÛÁiÓ»Õšp_`¼øE ùsèµ!¯tÕÝÈê¯ ˜7/!«Sœ’½üGƒ·ÞQ»ÜÞýû)±ËT\ßþ}/@Ï­"ËÐS}‘x r£gh «ª«´r®¼k¿¢È¢pªZ°"B–*®ADЧĆ.¨¹°(gþ l°ÂðsñÅsl:øj´ÑFm¤ ÂÀgš B’ }¼É… Éä‹nÉçê°VŠþ`ò9i–NŒ0 ™)»ŽÆ”ª[à-°CR$žrA¤ñ 2¯º{ ’5n´óNƒ”Œi&ûìS¿³Ä¥“¬,Å~`D(^lYЪŒð«‡²°R¡(€ª3xA«dÁDjÒ9ãTTSUÕYRL°©ósÖe„ LÌVi#[wd’SŠã„^ ãÊÚ¶Ë~ ÜåÙ—‘»æh®YØiKŠ@£0‘&$KRÐŒ”G¦P9Ì!WĘâ~`á—=pä<}d¨…’Ã>©Ýw=6[§yÃr& }܃QÕØïߊ·êŠRL >‘™£êžD± ÀQR)®û©‹]]1ÖÏvü&YlÊI– k;nA£edwîÒO£yÂóÛÁ€„!}ØžIúÂ@0Bz«&¦X@ú±? Ò œ>â¡°«£¡9XÀ¢ræãëÜ]>—>í°T˜Ž*| îÃÆT½)Ä…˜O6áþúÐ* Š’ØðÃϘEéë÷"òÖ›×—W‡n›-ðŸc’pЧœ@JìRþ(w­ýQŽlѳŸÙ¨G”m0át‹®17HBw؉ÂgØ Y€èp&‰â 68JáD5Œ½Š~tþ&A 6¯ Žvñ” ¡€áàôÑ"zÉaû^° Šm‚<<Û‡bqÕ ²PY¸W7ïå e¡3dQˆw`å ÙÀÁ,°…%ÈB<ˆX‰àW7ùéq\<›³xH >/ŠÈ)B&Ú†u!hÛܱÈþ°y9?,H’m‘þóâP`!BxhÏŒ² †2\ùJXÆÒ]AÁla‚­‘BÖ°Eh´rf !Kè—XÞwÃ@.nc%¼ Jhªkˆ˜¼M8°€>ˆÂJ/›Cžò ÕQ“ISŒf9Û#ÊfÒª”:ÀA;D”1, ÈG=íyO|Ú³*AÀ¥<)t°„"RËösL&ScDáX:iõLsF´FÓgmà‰D½ãáÖ5^ðoä¡¢S"§DMšt:ôOA KÂqC_9Ã,º iMmzSœŠŠ£2¡.ÏB &Ø+R¯ÅÎ‚ÐøåP™ e¦JaÑ“FX#]’† VlcJÀþ @*Ô‡O(‘ªK*©TÍš§ç•Í©/*¥,$S|ïD>…¨rÉÆ³” n £Y H¥.t( ]k­s+MžU±#¡èXi€_@å#ùpŠy<…3¨‚cÇ™†G„V´£%miM{ZÔ¦Vµ«emk]ûZÑö!­,ì}Ú:˜.C¸œJ7d! 0ì£Ã%.qß ä"w8¸FDUÃúT,£*CÝðÑ ]øÕÈT*Y[ÃÎÈ» oyÍ{^ô¦W½ëeo{Ýû^øÆW¾å•­gÉê‚¶=¥*¸Dîñ kd#p€f‘Ù§„:³ïs°0 GX¦þp…-|a gXÃæp‡=<áÂD­à­qÙ˜öÔ£/‚ \£ÊJ¦ç8 F{|ƒ"\c 6ðƒ0й€¥Za2háÝ>RCF r•­|eÁ¤h º82SIì¢È!Ãc&s™Í|f4§YÍkfs›Ýüf8ÇÙÌ!nðsaÄñpY€êüg@:8#þ2b¼èƒ"¨¦ … D°e¤#gPo¿7ZØ ½‚*Ï’d¡Ðâ74„vT§ZÕ«N54pÐ>O{¹Ðö‰œ m}kÏÁHņq;) ãž „1p}ld;–гö‰þ•!˜>\ðÅ8øÁ1Ìb }°ƒ0†Â?¼Áý؆º¡x¸ÃßHdუè" À8’¥+WܰfÁlño€\àÇÁ¨Ú·Cf'¦ÖÉfxà x(Áá§x—ðŸ°t*‘ˆöS~a@(Á EJ¿pÁƒpà‚`p‚2xaUâ ²8F„¢]Ð@°…`§êQ}J„ú0=¦+×wÛ€• a1î“…W\êS‡N>0 ªg]ëѹøÓqRJBu‹(9È  d0ƒ up‚ tð_Ì’ w‡P„±èQ•é¸Áˆxao¼N… Òˆ¶!þº<”LÛàò8€ÿxÇ#"¹È5d¾Ú Ö²pº×ctØ­‡^ô¾à‚1zԾ랯I)õ*v7$! »Í p[tƒ Îð-tAµ§8ÀưŒÉ =è %»Ÿ¾wQ€0ˆhË€(Êð¼-†ÉB!€B÷½…d8AüâïÇ¢ `ƒ %Ögýb@ŸzøOÜ Büí/õÕ·¿”¤ûSVñî @À ðZ(¨È ^(À˜#ŠÃ Pk˜h³&0„'6È Ðc hÀ”aÐQ¨€ej¿žˆºûkA@£!pAD¶üc½RB þþ€;À]àüÁƒ [ 1`–§À‚!ðA€2¹šÀ#‰¶ZFé+€cð~…¡(‚ ƒAƒAˆz„m(€ozˆ„mx7Yè9¿€.öSÁš`Á¬Ã‘Ø;ÜÃ?«AÏ+¥ÈÁ;Òž 2P>.…Rˆ!œCºŸk¾/’…4;LC…}™Š9cbà]HB_à-ø†7XXCQ1i`Â8”Ãûy?>ŒEL‚¾E[)?ô:ê±\°D°Uø¢@‚I¸*tp‚F#’[>G H¼9YP´h+ƒ!ÈQ!† @h‚9x`0þd°*€sP±e ÁÐí HAWÌ :¼E|Œ€[ÈGd \|º´Ñè9kƧ‡ø(jt¢9x·ƒ{Æ ‰FYà\ÈA-Ôaà^Ðg˜$üðÁ8‚§xYà…!ЂlC¢ ÄÁjªz¤‰{üGœ\¼œìÉ— HŒK (Ð#@H€Ñ~¡H ´H‚äsðøA«Â~m¹Hv* pFΣɚ¼IŸ<ËÚøXDK¶| L¸ ÊE*¤ÄŠapYE¦|ÄÀ# A\[p] JÄô“‚þ Àþ{ŠX¸HªüÊýhE94˶lKXÈLÏDŽ·d6ê¡…DèƒMPx‚#ºË,Í㩾¬È¿ЧF”o»9>ÂAÀ*‡§Às+ËTAÌüLŸ\xälNÚÍY£ ð…Ó‡TP€Q1§8œ=èíÄ :¨€‚‹ÀØŠ²^À¥&Ęش…~¨D©[0–Û©ä»âl¿ãtÎ\*ôO…žš¼ /ʨP‡R+z„ÝÚ‡Kè|8† 0¹ò4 €jp¤…˜D¬ø]À‚ ÈÏÙOÖëϽÅê`…uNè,´ ¢þ…ÍÌŠ ¹ÃÙF0(»’…u(¸  €Âs ,¸ËH‘ƒC|Fõ<ÑXl+’RäœÑ/» éÜ ¨8ȃË#É(€Nˆ†/ œ¡À^ðKëËâk@b°s ‚ÀQRˆ ø;pR²¬Ç(µR;tpBõL,%±Rò%¬€v¬›rð~p{À†a¨À„B íñ'Š`V…Ó:PÞ±rˆ` žàF…ˆŸÔ[4€ÐM¶éí<a.a>áÞ \°ÞÕ±Y‡jþ+³Õ m …×Véx? ÐKP„¬ˆ†ö ^8Þ¬0Z˜€©ZPΚ‚¿«”ýí‰ ø,Îb-ÆbÓƒ‡ZK/qÚ5°2.c3>c4&ãÒ“và‘šÛÃËG0 û»Èc=Þã<î‚b ‡Š›Þ0HcB&dèk›naìÕ‰U˜G~dHžeð†JH§Ò•…XpÄ™Hip„' 10/p· Î n(â©À¥eÐ *M©›{(˜Ÿ;‹*æ ¡­*àƒY`_ãBf3.½-8Ý«¹Ýmhfg~f=‹3+s˜/k¶æiƒ+þ¸fn†¯i†–t¡5Šdb>gèËu€Döœ\dãºÉh¦ÒÅpX…˜n˜9$€„fÈ‚О[ºá.Uå°x_­0a8Û™YàäÃyƒ[6‹\Þ ú+ØhŽîh¨‡Hð`æsfcædvcjšÛ5@—~i˜Ž;€¢‘Òƒ,XÞižîiŸþi j¡j¢.j£Öil¸ƒh çrا~j¨N‹N¶5s.éB†>(€unçšyghƒŽë€ŠPB*ݧTU¬Ð&ð‚H±[€XÀ‡_„LóBŒW¨„. ^ <­hþYX…ºa´jÐ Õ =˜HýÞA 6 Ê®lË€`‡§ˆ2x*0î’Æê46fk@é6~chi˜^m™&U06qÒ–Y,Êi¥ç;ZíÕ>’_H!è,†»jÑFc­¶®fgþÉEÎ 6>ËŽî6vBà¢K–…SÒ …`x`p4¸ÈDx&ø;xÍ oøk¢PVÎ ;ðw¨›ð.¥‚< 9aè&~ŠAK ¹hìèŽn̦„6È-ñe0ûì) íâ.æ;"cÓNfqbiÞŽi 4ð{‘æÙ®mÛÜ^êÝîp—>þ’Kh„uçá¾î 7n€2Nn¯†°†î§ìénƒCÐlyæ¡KÆÔŠ4°Cuˆ1(]À"x 68¸ÈŠ/€ï¢ˆY­´¨iP˜‡ˆ\òdø»+ÈŠD€ÍÇöÿqÊ^pJ°‚sŽð—¡ð·ÒÆð”ÞðÔfq—–iGƒxš¦&Ú>q±IqÝÞBGGƒ}h ~ jd#î>·†ãÎñ®^îdéq9g𰦄z˜n8kû¹äµvðUªä­ixŠª•…QÊ.Ðò¡à…)p*ðE€Q"[í†[€†~Ys¬p„Â…l‰s9þ§sJ8„²ξ‘NíN/ãÒ³‡ïƒw¸Ã$'tCixxíØ^¤Fwô’ôd gI'ôJG58àî[ãô>‡>o°ƒ·Ð_ua!u9òʶëÆîúÙnîv¸gÔÅÚ¡¸uÓ³>ÂX¨Ø_5Yhq‡"@0É…P»€TÀFZp”ÄÆŠH˜v8?õRÇv wð^¦5 g>¯ñÒ‹XéAg÷_mo¡of y§÷‘±÷aÁ÷Ißw—†ñÔ&瀧ñp÷t€„hqø‡øÊr(òÇÙnV­à…}ÔŠY˜ €p”ÔÀŠj(ù¡àòþ¬ ZTˆ¥”€0pA#'c… /×_jÇkÿqŸ§l;ÇóVŒoã°ï†Aø|ÐÿüSJzu_zo÷ÕNtš¶éšzªW«¬×w¸„Õ¾ô©®jÇø§‡H~doª€²onœxîRGûÊNõ§`õ.Ò8³@4GøÞ§Í |À‚)¾H¬ ùX†c!¸Ë£W£ýõ`× <4ˆ”(‚-p„ö¹p¢hü§ˆï˜ÉOðʧl€8ô€d¼ L¨p¡ 5|AŒ(q"EŠU¬±¦q#ÇŽ?r,€CÅ’&OR¤† Ë–.c á²%¼[þUC©¥žcS~ *t(Ñ¢F"MªtéÏ&wvîL`ËÌ™¹\ªªæ?Bª@ +Ö¤a@¢MÛQ€ cMf Àp®9QÊ«Womöêµ"Î,!º†ÏíåGãÆŽóbœíS9‚ÀÌÜΜ,Ž!e&8­‚‚Ç$Éòñx5ëÖKµvì9YèÌd©Ù3²x¡é`˜ã-µÅnÝ âæ†Où @é|3 ÂÇ9B‡oM^̨vÇÀÀê`„uRhaœ:Ç!š ¢YO_ô †˜Ü­ø%6ð¢cÖÜÃ#cX8¦ƒj²4ðŒ Xø&‹H4!å—DI$/Q,y‚,Í, Šc>XIP?ÉâMm +K˜bŽ@þÁ6ˆ‘‰&%gš+A5'†srJÞ™ž¤g}î‰FM7å”é¡‹pÀbøh‘¸UW_ыަñŽç)† 6'ª‡¤š+a«6×j‘6Ø2²àk´,ð˜Rö³JÁÊ¢ cÁdæÍ6²HÕÝ>–,‹žQZ)²4±d8#3FmfóÀØ8µ)âٗߦHÃ| V.šèšû!vÚ!æîƒðBœÖ¼ Wdï{øæ‹F|óÕWè¿Ó]·~?hð{ï© ƒhõpÙhIü ňYlÆé’h"LJyü³,L¤&‹5ÆÐâ™ ŒÙR„,ÄT ìó˜9Æt•™þ£ƒ¬Øò,‹Ï,ú@ ( f¦‚,A‡Æ ŒÙ€È¶²ôð‹=ÄpGæÇRâ,™)q]Z›Y]×i®Ùæabï$%‘=øGgãIÈĤ½Ò½îµ ‚:V&Ím·ý÷…÷N˜–¤7{|ïiR•ºà$‚²˜E|„k˧ä‚utÃ0‰“ÎâÌe*‚¤êq‰YL‘dÅYÈJ b`Ìæ³Ž„‚Œ)Äjlàˆ%ef ^ˆLìf—[ÈÊ€>ÀY £67à3Ô¡6‚p@f4ð\Ø¢[ÍãÎ Bíâ ¡žu¸v=uä sážN aPÃ"Q`yþFB¯F`•@ÆDÔÆ¶µo_À‰XXA‚ïQ¤~øäýô§P¨ ñ_U¸'…y,ôEv!ŠŽbàÄè…Àáé˜ËSÁ®i, …Ñ Š88P#9O0ÖïèY¸ Ø…FF Ïxn5»€!Aèà hÄNv€Í±x +`@²øŽLÜr ŽÑ¸~ÜÁ¸»):g˜€ðÅ&®¸XÜC!\”ޝçµìl‡!dDI!b‡QH"áÓ¤FÈ'&™pBDìX<¶Ïmò¡OX†9ÁP>!$G ¨„úxE&þÂH«`%¢,ñÛT@Øèî˜H& jÂ9ˆb H<ç_dƲ¸†.À h(}>€ÙjÐÙ"€Œ1Æ zˆU¸!óœŽõì˜ì¹i!û< àž@’%¨A1´ˆjf íèD|áЙ@4¢ïTx— zHDJ Ô•z‡Ž7(†DI'B#Dä¤.qdÛh)þ5L™éC Ô‘š§¢!ÐþCÐqHHPùËæå‚¨R+[µ€Ì¸¡4l † r¼°ÀX“Ã\àŽœˆD"þðkt¦¿Ý*+‹ì¼Š´ 9ªWÆàâEKÈÄ h¡¥˜É" oÈ ?B€Z˜ÃøD;Hl8¤ÁؘF3ŽñŽ,ãx9€…+`ŠS"#à.aHD` ‡c ñ‚®Ðaæ˜ì^êiY0²+!›5‰!ð 0ÀB8ó04F«ÉÒVÄÄX‚2ž*Xƒ ÛC8ÐŽ7À£ €ïêP¦†B ê[ûTÊ=Ö@ýpG7 ‘QŠT“¨LZ¡þˆè6)èd Šv\!¸¢îI2TŒ i†"„¡Ü–0·mdXÃN[ OØ¡R¯¨v5©]ûPŒX†rp%È£.wÕyÑ›¦Á¨²½l~ð‚”ã2{ ‚ ‹tÜÂ`ÌPÁ oÉ1˜#cbX#QL&caèbdÀàA:lY4 på -ô GA˜/cHP›_$ÂA /¶`¯3ãwÇj¼`lϱL]¬¬³óÒìàêPÇ䀇3ŒceÇÆà0„_ø‚6º€ l œ ‚ ¬ ´€*þ¼ Ä€ ¼,ÄÃì‚ôBÑ4c„CÑá+¨Z‡(N³•\QeÀ8@Á2CóõBôíÀ ÀÂ+È ¨B œB œ@(6”Â4[Œ‚,ÌÁD,ÂëØÂ‹¼Aô€XÉÈô@Ða±ºÑ[rØ[lL/¨†3ð¨FÀ1†0T€ À¼±Ð‡Áˆ ä1É€cЂ 1(4XÃ6„Ã2„#@$LÂdx(Œ‚)´À*È,Ü@.ì‚]|PcЂ  @‹ÈÑÉ•œ‚d]& É$@eŒÒÅß°dâàƒăʥÁ8Œ7tÁ\A4Œ`þ2¤ t†@AlA$€ÝC‰¡iÂúü|ŒÓ’Ðü7lÂFíÞ¥C0´ƒLÁô°€+¼ÃlÃOX‰d#üÂH€MìÁ+”†'üÄ*À/°À“XÀ°…>ÌB ŒÃPƒ78º‚8Vã5fã6vc~dÕéC&fÆÐÌÊú@L¤ ñÅA!dEêF 4†1ÌAx•„Ä[XdHÀ34F6DSÉR–Ü©ˆdÆ5 cø|TÓ¨ÆA\È0Œ• à€4ƒ<È[Ma -Ó±à€“,LL2œ¤ %¼Š,Á®,þhœB²ˆa!VaØ0F”ÀV°$e•\zµ?À€;ÄAÀÃ%äh„\pA6 Ä6€tƒ|Ã7T¸‚-(@jM…X(&HˆÁ6p5T4<2,1Á[ìT,äCЄÃkµ‡Ÿ<|Ü ,E(Ã5˜Ã=€"P€HyÆ6¨ÀFÀB2ôñ”"üD´C (ç €&üDw)H"ÂO0‘:NÁ-¼5¸C˜ÂOPÃ/ 50üÄÀoMtJ'uNr*g 0§s$‰ÑÁ€6PA ƒì,Ä@*”§þ¡‚,`Á+:X@<äÁD¤¡‚7ÙAàÙÔÁäÃ>ôÃÀ!@!"$‚",‚<@#8‚LT@%TÂ`B,À)„˜x¼—G&[ü Ì (|‚'„xhÀ%XB%X€$D$<4‚0Â",€”'D€”rÀ|,aÙ€œ€9”—É­¥=©KÀ€€!$0B#D$H‚È(€@'Œ(œ@ ˜ xÃ,ŒB)(|‚,àÂ"‡7 ‚ÌÜÁ/ÀA$@Ñë<†.ƒ´ÛÍ¥Q2ÓÚ ¤À B6`å¼!*® $Wƒ ‚DŒÆOJxBäš60´CCtñ4B+4!‡E?nQ„Ç#ˆÈÉF²/H@+&a²MÁìwP̰ÂЅΕ‡øíÏ®rRq&ìB<þ†gàÉÊ\B ü2’ócÜŒx€:œ€È‚b5FÈÂ#ÌÂhåV?ÜÆÜÀ 7ó­u,uànÏ8;H:‹Ï:Ó å²„åVæjîwèsEŒ.!¯¨1…ó–„÷š”"7MW…öD÷æ´/œó%ó(PkòvyâŒòJ–²âЯý65+3†}MµjLó±<í…¹5wjr˜„€ä‚9¹íj €,@3`ÈÔ¶cÀ5]Ѓs´ð¹Üõ^Äp\†ò^ã‰_`gŠ`ó ·º„k ‰û‹;vØÄ ìƒc/d…LƒlK8²@òf£„Ë*PP¿ÅáRË/%þ¤i*¯¶S'G1@ÃÖÆŽ©wltµgÃÐA5\‹Ü2cÈÊxƒȵxrkPsw3ë°:‡ …u— vŠv6Kг„+Ú,6þô3?Xz+…z‹{[vKØ4NË÷|ÿtv…6°v~—¶)ÉïRí8kDÑ*ø@[wËÜ¥xÏ4pkðC;@‚ëP9}-aT€ PÎqkøãpøsSB^£ˆˆ‹‰CŒ‰ã Šs7öæÎ‹Óøž …‡ŽcïL`6÷Jvûôgù… ï†¹PñìÉ ›j+9k'”‰oèCT¹k\9kèÌ(Ø—…CTþ6üP„å™sLš[GtÏpЏyXÀy¼ÈyœÐ¹<ZO’žóy¯û9T:{¼w|º#º¯y̹5ºyv«ò¤/ù Á¦I§¯†­TAìXê2 ˜y5ÿ7«Æ7ƒ8¬óu€Ì:§Ô:†ÜúL¬x‹ïºx÷ú½çÏG9H°ÏÄŽ#r±{üÉ_² õ²u³›i)#¹´·R•ÃYb»cóbHaì $AÅÿ²ª¯Š¹†Ï굘Ä:T´{¼ûƒÄ{KÜùfó:¾£÷¯Ge£T ºf¼NзøØ÷Xà7³«¤‘K"¤×/Ã7|Ä}cóèA+L!Òþ寓ûj{¼«O·È¯»}”<œ¼ƒ¤¼wlÊwË»ü¨é{€ð; ûÍCEÎÎ΋EÏüÏ;z™@;ÑýÑ}W×'“,Ð’[s¼˜˜;º‡3ÇŒüNd=…l}€Äû¼ºØ=pÁ¼N𻿫ýÚÿ8²+ú&3ºÜ;{šøl’Û}BDÞoz0c°w ИáVþ˜Øõšƒ;qåÆÄÊG¾½O>¾W>JzÍzæCÈæ¿,Áß·Á“Âïì_½¤—þ´£~êkûV;ÁŒP†G}S§ù[J÷ýæ>Jì¾¼4îfÓù|7ÀK~ñÒñŸŽþ·€„;óã¼ó×7ô„/ ˜%€… 2”à%‰'¶ðဨÄ4ôødH½üÈ2yeJ•+Y¶tùò%¥`ÖtiË–›;Oö‚ (ÐSÚ2z©LN€ úTB ƒS©¬`5­[¹võú•k)ª–5[–{®Ø¶u›E¦géÖ5¨çؽ{ùöõûp`Áƒ 6¬·É»fÓÀördÉ?”J ·sæ³b„ûtWU*hžŠð©—‡‡êµvíÚ¢Ì@R×NM’gnÝ»WʤÉxp•>mÛªyrÕôÔ«YCWþ+–lôÌi•wŸ†F{x_x—7}zÄŠÅûjܽ{*cíéÓåìÙz~®£K·Gýô!ø’[æç ü7á\%ß|07âêo,¼à ƒyc £o:ýD´»úèZ‚‚U\QÅ „1Q3=–!‡Æm¼ÇuÜ‘Ç}üH¡`O<5ð8É$‘lgœê¾õã¾ÿ‚RŸ,µÜRKTºéÌ!S7É<“% Á\“M…>lï*8™“Î:í¼Ï:aëÉ>ýœŠž5”ÐB =ÑD]”ÑF%tŽ?%t (¥´ŽJÿj“Ó ÅDÔ–Ì 5T5þ;=Õ¶7Å»JÀV]M.;Je•ÖZm½•VÎð¹‚×^}ýØ`}uƒ´*7EÙ >%•Y“Fm–LS“ÖC©è‹â˜lµÝ–Ûn½ýv.\Å—Ür͵•³WÕmµ?ñ¬¤Þ…–…6Ôgé}PÚxáUõÜ~ýýà€>‹6 >á„^˜á)ŒÕâyï=ÓÞ‰Ìâdù˜ãŽ=þäÎ^‰-†°â“ØäS7æ˜ež™æqßmU“U^0åucç6_®™è¢>éªnšS}®ç§wši0‡N묵Þúߥ«^Ói©w‹Zl˜¨þúÀ«¹^›í¶Ý®Ïkþ´=-©l+Þä˜@1!ˆ“/±IÂm6ÑFŸq–©ç?ÐùÆ#^HMmª>i‚JQæÖM C©yv¸æVrÊ!æm˜9—ÉsÐmôð&¯ür£ã–Û@“ñÖ›ïºaJ9“ŒÑàäÞk’P|N¡ ;”ÀyÒñ“B ·3P¢&„[­×.)m”¸µž(]äî¿|[Ë?_¼í±—ýXÚä{%á×=¦™ò?I&ñBq‚á$•8Á(8ANP@²ðA("(@²Ç(J ŠßÈBÉ0  †à⤛XHVà…7Ô k0ãÆ€eþèã PH o˜C…€àÀ6B°ÊA_@Ç:¼ÐäpC!ô°ƒLž§Æp†^àáì€ÌlÏ¡ÈHS˜ÂÉ„)VŠY€â°ðÅR Ç1–ñŒiôEV@  b ¡XÆKÁ ͼO †@€¡0࣓È`a:n„>Ì·‰>˜¯‘Œ$AF¤aIð\”‚ ô} ‘¾P$# II „’–Ĥ&9ùO‚²–£H)O™ÊU"ǕڣçˆG4 „~¤/Ü8‚”"E&Έ‰aþ *hE¤öØÇ?„Œf|æb"8Âþq-Sãâ¸ÚèLx ´`h’ vð7! Fa‚JØà$0`Nâ˜Bª‡?9èÁ“ ŸL ïLB€˜ÄÀ0‰H`’DÜÁ$ùø…Iò™ÏŽ´¤² Be±”äó%Ä)æà‘cx!Ã*¼ £µˆ‡SŒŠT¥:…g0&X0(dcÐÄ$„=xa&€a€:@Î[ÈOƒ:Ô¢Õcx‡ª'DÜRQ4F!FB ‚†@ÀƼ¾`6}ñ‚€Ñ4åóÂðŒ.ø¢àÐDJ@IdapÄ%è€A$Aþ棆&Ì—ÙÍvö³¾xD°€à²eí÷êðJI–²–Ŭf9ëYЊ–´¦E­jYû×7¶³­ímsû†Ý¢·Ê´+^õê ¾ d±q,hXFÄÂå‹YlÃH`x;^_Ö»‰µ BŠw¼ä-¯eÍ«"C¢wOü©Dx©HeAR“ÌÔ$65É/î‘RC˜z0‰p8C: Ńi*aY¼´Á1ݨÿTÒŠì'ùE h\‚ 4€' èIò9ãßX÷XE …›î' ˜Õ šÀšÇ/4O W€•±ì…w È þx²BÌÁ‚ŽhyÀ °Bœ e)SyË ¹‚œÈ0HÑgRÄB›ÌÈ4 »g?ÿY›p) †Ç†§|J)Ã|ÑŽäŒÏ^È$Ìç D¾ÏÒÈi_à`& à‰¥o;i™LºÒ—öE¦õ°éNÚ|¡VʨK}êT dÕÚ¹sž íg@ûBÑŒvô í ý†q …Fö¢]ì>{¿Há [xEÒІ8Ô¡ÃíC/QˆD4b ¨D&:Q)Pô‚©¸n,‚û†xAK\ cרÆ2‘l’ÊBx*Ö'Kyl’ùß?¦iƒXœ’ÞùÀ¾þ0‰ V’cƒ3ä²à8Kx¡˜§&ü‰<ø!‰†€PH%ôÑ5ß\­k–Ðó˜ÕØÇGÖÜ¢Ã\æ^ ¹Í'çN/ÆzK(üb0Aû‚ÐÑHթ„;ŒÀ¾=$1€]àþ€CúÑö~D*Pƒ@qk»?aínûõâp Vpc Œ 6«V¾²Ÿ=íyw;ÜåN÷»{Ú|Šo;9©Ñ÷¿ØOOÔ§.®OÅë`/A˜ùlAK[ ¡ïç5“IðÔ§@*Q›šÔ¥¾Õ©·êT«zU/du«]ýjXÇZÖ³¦uÀl=î+PŽyà€%ÏþøÆ[Rò“›$(ɱÂ=ÞR”X_Â#w GeQP˜DN‰P*‹|üÀ$#0 3bp’ô«„¡&Ñ…ŠO€d…¨N!*ara®€0AÞ!¼ ¶@%½Àøá*a¦A¼ ¸a4B€&A!`nª‚¡ä" ­,ÀÀàpð#–AèêÊœÂÊ« °|A„@ DA ²á¢ ›" ôË£{!€aìaFH¡@ vÀ€ ²à*€XÎ'î&!”â@ ÉÐ Ñа! &AfþTÉÖ6kÔðf »ð Ãp Ëð Óp Ûð }!ç°ïõý‘ £c{„ ªÐ®P „ !\ÒK  ½¤MYѦÐ4² –¬!ÚL!ެʴ,ˆ±Ë¾ 9–!ÌÆÌ ÊìÌŠŽ!Š£lʆ± „þ§üÎOî/%òOöÏ$~ ýò¡Ãd!4,ÈÎáNÀQ»QýD¥âNo4Á$ „0€> á$,@L ¬Nàv€ L¢ÿ1 Mb:AoNà N‚Lá4A [BBÀ ²Ö.!äaèÀ þ^À È ü.Ê€%]`²Rà ö` ˆÀâz ø! ^aÀZ ìà0`À9ðà«L%U’%Aà˼a1&ÇbVa ŒXà@`BT .`{Lá~@ ‚+½,bJ rLÁ ¢Rá‘=™îy®QãTâóq ;r"+ò"ŽDA$%*AO¢ŽaºQ h@AÁ"Ò´7êQ8R®YÎÆ~j#rLDìdfðTE§âD‰¦DË!P ÐPÐ#p+p1°7°?0G°O0WZðcpkðkT/°ÀÎÄC¡…lr£JIDC*¨gRZTdêÀL+EËt*Ä”L“Lm&@R$IÒ œ2%W²†Zò%còNkò&sþr'½ '2(‡²(2)—²)OrNc²´¸JUæJm" @á<`b¶”KbDÛ P  F f¼A&Ü@Í”TA5“Fµh&à«_fçRŸ"lxo@Ä&æQù'%,õUA"SIÕWX'ÅUwU$bWûçàŽ5§~‚X ¤WƒZ£UZ[¯~šõ6LYsãV³UW­u!žuZÃU\Çõ ªÕ[ÂX³uC“U]W¢[Ï\ÉU^ç•T‡õ\"]Û•âØU_Qâ]½5^éU`ö•ìõ^"_ûU¶UYÿÕZ–`#VbµÆ`6aû•awãZ¡T˜õ`ƒbŸÄh`bþKV`G¶V*ö^/V86–T*†Ž do¤!8²”Av!”R)ZSæÉ9B¶*rR æÎ.ÖtVNG&æ‹>XÇdo¥¶’¡ÌjM#kk…hIÁh‘¶.”öITö\c5fg¶foöe94äpÖ&Üöb<Ö@`8EÔKéc{  ®\òaLÁT§=V4jÿ¤ú€ ðaÊqébr%¥oÿ6iSÖ\?v$°5úÜ8àVAȯ%è‚úÉ$ J Ì ¡Dá@x0 ƒLBd V`ꀢjYÁyHÜ”‚ôa .áÊöÀyNàþ“žÞdBÞ¦ÇI¶ >A:MA}Tà `{zàÒÈš¡»deÕþ²ð¼Èjh⦡<­—~é|XI&’)q%% âbŽ¡î÷“ò™Þâw~ë·€;逩•lÅz±w›º)½|B|É×|û„l½à¸ža€h$…aÕsµ±tiueAuY×uM¢`Wv÷©vAwu—w5¨¢øuÅøÕÅhŒcOŒÁL%>Á$ Aýòá ¦<ìúæ$ ¬¦~·C ±öžÊ Æ4BA^`@!@Áyæ@¬ž‡øÈ ʨFîì²€œ|A}þ½èÎáÂ4ÇÓ  VVM@ÁæÊºç8`HA4`¹ž`µ:ͺ¼»úwRæ²a  ”!µ(¹¹t “{‹‘’%y”+ù|.™·lEŽéx î8}ö¸}áMAxsC‚úà$¡ô¡C"o‹c™‹µ…[¬ÆŽÅ”8%˜Xœ8¥¢‰§Ø$h ŠQ‹MŒùÕûdÁÇh Èh¡N BÁL‚Pâ7Î9àLBánÈ Nå€w>µŒËäNËúÔ Baàl=ç³™AvoÛc{ˆá A L°bšœM•DàEheÕÊ'ÊÇʇ3þ}!èp ~*W“냓=Y @ L:óàòBz¤Kúñ O¦k¥¡:¢Io¢¢¢Gá¢3zlƒù#ÂFa!~ €yÓÁyÕ*zŠŠ÷x“wy›÷y›è‰X¸&Ê™žÓyÛùe!žulÂÈdឃ,Ÿ nüضtKWüPâÞÀÏúãDîsWüöy‹û™=›ç5@Ä€=Ñ,h:~b~Y¢©‰¢" µÜGó`º|äa ^ú¦Q:¥ÛãX bápZµWò8[¼>¦Y[§²}Z²š²-[þDeƒî"úÀÐ8ÔX­ÚØøÀXþŒÉØŒ‰Û¸ÙX¬ÜØ«a¢œëú$î:¯å™ú\8%þ:®ÉÙ½%DLâŽØʱÐoìO"ÓDnƒnÇÊno”GµÌ >aNTÁ BÀ|°ŒIõ¶zÌ½Ô ÙÂ…^1 á2hEp½§p}áõ áË0@Á†ðé0"#àGÛO*€P``AøÀ@YÜÅ ÆÕA ÄO<Åw¼ÇëðÇEq¶¢Á|%œÂ-ÃyÛ¨=·»;çZ°@  Ú ›Ì§û%ÊY¼O‚¼Í½Õ›½¹Û†á»­‡þX%D@fiöø@4"e J!V`!•Á$*¡ +Á>ŠÏ;ÒÎi N¢B/Ô#ç»8jH)dOgRËj ö` 6aâð`¾fa!ˆÒ(1@ÁM¤kIa,A:©SÈ’`á–|XOVX³i}á/ñÀ ¢¨²|Xá ôá (€±(Ó2 ¢4O35e¼O ` ð¡ ®V œý2¥=8!Àٕٻ7¡Ü©V^=Ög=:k½n=×w]RT©•Z!z »è ‘°°¹ü «(¡A"Vímó|Ï3´Ïÿ<нÐ=Ñ"=oJàÑ%’"þ-´@ÇYaå[_¾S„VR¼ ~ Oó¬½hD;iPþÞ¯Ü#8TArašCÀ ÜÀ\°2‰¿ýÀw¾ÀàÀ½€¾”å™C^%2Wu¶8ÆÔ`_Û\4 F}èåæëK‡ëc¾80€„¥à„EÔMÕBÕrÈ9ÝÓAíKýÔS}PY]Ÿê÷õïs•Ò‘ÅÒသ4FëÇåH ,``XÓ Z'ìiò%Ÿk¿ñÍbHlü>ðV®CžêwÕä'ßôOnd¾S¬ë‘…eÛUêùgô_µôQßöo_ô!ó™ø‹3ó¥hN󟼩æ6JЂT›Ý¬H2Ńdq‹§ZÐÅ/†qŒe<£ÒH5z¡oŒ#“ÉÏ&Ìñ'@WÊô¥0©Lu”P–Úôž(5âIs:•Þô§qéL‡JÔ¢5(5êO‹ÈÓií´©tñ©R*Ô£ZõªX-jR§ÊR¦B5JOý*[¤ÊU–V5«hM«Z¯¹Õ²þÓ«beNþXãš²ºõŸg]«^÷Ê×~µõ®Í‚+]€· ¶§xìT%p†[8ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M-gé€ÅU°‡¥Ë\cK»ºö7ò€€nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝê* ·]*Ii›œÙFé­è]b³KÞòš÷¼èM¯z×ËÞöº7+°µxæ]±,b[¡pA6ê‚Ä%Ùö½°€LàøÀëïZî[‚üî—.ý]R}ÅÒ$„‚¿âE°†7Ìá{øÃ °‚×Rá C˜¾…N“þ–° ²Tà'¨€‹Eñ‰4©1(‚,<Ñ`¤t¼!²‡Lä"ùÃ#VËŠ[<–ÇxÆ5¾qŽwÜc §X8­( ªޱ BbÑCÄbˆ{ˆ%· 2.!xl±G޳œçLç:ÛyšINK–·Üe±|9Ìc–E™ÏœfY¬¹Ío&¬a1, \°Àb!YD NeÑ$Ð…,8` ÿùΠµ¨GMjç-Mr4¤e!é±PZ– ¦5Íi'Møˆc¹G"=éJ_z,ßX&á¤ÿ–úØÈN¶²—Í›SŸeJºæµ«}-k` ›Ø¶¾2£e! .ˆ%`–Å=þmˆ;œ¹d9Á¨QìO3ûÝðŽ·¼“íl³L©Ûß÷¸ÉlnYäÝcQ7»³½è¸0¸£˜€‹O I¥¢0A%\±Âýt÷¼7ÎñŽ{ÜÃõ&ËÁ¾ð†?<⯸X.N¥[Cë ‰ÈøÇgNóšÛ\½!GÌ[®í’Z‚2¿¹Ð‡Nô¢ã9Ñ<ý9Ï ŽÏM”`ºÑ§NõªW=çÓr:Ô—ÎݨjÜê`»Øáuîº|°Æ»Ú×Îö!—¶g§kÚÛN÷ºÛ]ÀomÜã:÷»ûýï€wmÞ»w±ö=ðˆO¼âÞu¹ö¼ñuýúâ'OùÊûfðƒ-üWoþùÎ{^ñ˜§«æ¡Ú‹âô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡Oüâÿø°ÿÒ!Ï–Ñ7Õ˜ˆ¾ô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûà¿øÇOþò›ÿüèO¿ú×Ïþö»ÿýð?÷Îüº8¿þøÏ¿þ÷Ïÿþûÿÿ€ö÷xX€x€˜€ ¸€ ¨€÷×€8X˜x¸Øø˜ 8‚$X‚&x‚(ˆR"˜‚,Ø‚.ø‚0x‚+ƒ4Xƒ6xƒ8¨3˜ƒ<؃>øƒ@-;„DX„Fx„98„H¸„LØ„~NxJø„R8…TX…H€V˜…Z¸…\ØQØ…`†b8†m…dx†h˜†j([f¸†nø†p(†_‡tX‡vX‚sx‡z¸‡|Gñ‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽøˆ‰’8‰”X‰–x‰˜˜‰š¸‰œØ‰žø‰—;mod_perl-2.0.9/docs/user/handlers/http_cycle_conn_filters.png0000644€ÿÿÿÿ00010010000021462611727205031024627 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæq1}o?³Ï4­J‹H’­$!kø¦/¡²S($…l}‹T$[¢ì";iOeKE*’J”DíMÍ>÷÷Çy™W¿6Ó6*÷ý‡×{Ï=ç\ÍÜû¹ÏóœçÙ»woÇz@AAé B¥ïãììL¥RÃÃÃaØÍoAäÑ£G eݺu7oÞ„ r °aÆÚÚÚƒª©©ÁÆÕÕÕ&&&p©‘¤¤¤0ýçä䨪ªÂÉÌš5KII©yG"‘¨Tª˜˜˜—Ù„ƒòx¼ÿýwÔ¨Q륀./GAéûÈËËoÞ¼ÙÛÛÛÅÅ%&&æ·éC9uêÇ344TPPXµjUaa¡¥¥å;w’’’IIIrrr°qEEŨQ£Ö¬YóÛiÔÔÔx{{»¹¹©««''' *du9990bZôæ:=}(=sss4•Îß*tú ¥¥¥›7oþÓ³@ù=wïÞÙ}æÔyóæÍ½{÷`vã6Àb±¦¦¦€€€¸ÇØØ˜ÉdöïßûöíP大§+++Óh4///aæ0wîÜéÓ§3 qqñnU9€íÛ·óù|›$ê$eee[¶l™1c†ˆÇEiáááfff¨Ðù@…N¤¾¾>33S>¥gbccƒ ˆÈî³T*uß¾}vvv»víúçŸÚöݽ{—ÅbÑét"‘h`` ¦¦Æçó>|èááQTTCsÞ¿¿páÂk×®ÉËË·ÑUQQÑ‘#G&L˜`mm˜˜Ø¼Vwpÿþý¤¤$YYÙ?•;G^^f!Bé±DDDüé) ˆTèôM¨TêÌ™3ÿô,PÚBô¯’Ë—/÷÷÷ÿðáÑ#GÚL~ýúµ’’’¯¯/•J2eÊùóçïÝ»G&“W­Z%//ÅŠ††FHHHk¬êëë©TjfffÿþýMLL¢Q9–XwuuE •£ t-‚444P©Tø‘Á`ðù|11±žlC… Ê߃9yòäœ9sNž<¹|ùò6*}nÛ¶­¼¼œÃላ‹ççç8p`„ ÒÒÒC† AdÏž=Ó§OŸ3gNk*§¡¡ÁÞÞþåË—999sçÎ;wn·]S ¸¹¹=ÚÒÒR”㢠ôy`ùÞÌÌÌwïÞUTTp¹\===}}} ÃápáOϱÐUW((ãLJKÍ·lÙÒFõæhii9;;oÚ´éùó纺ºk×®MMM¤§§¿}ûV[[»ÅþüI§ÓÅÄÄ´´´Þ½{×]—Ñ:Ÿ?>wî‡;yòdO~ÅDAéu444ÉäèééÙØØ¸¸¸ìß¿Μ9T*uÞ¼yñññx<Aƒñ§gÚTè  ü]¸ººöïß?999((¨ùÑÒÒÒÒÒÒÉ“'oذaÒ¤I [¶l9vìØ®]»fÍšÅãñÆÿèÑ#™æçúûûëèè¶nÝJ"‘ºýbþA6lØÀápÖ­[7vìXŽ‚Ò‡áñxbbb666nnnMÞ‘‰ŽŽž7ož¦¦f```|Á@… Êß…´´4¶(· IDAT\$åääTRR"ØàÀùóçëèè|þü9<<œF£iii¥¥¥©ªªêêêÆÇÇp8\ãŸ? ˜?~~~¾*„·†ŸŸ_zzº’’R»R#¢  ü,ØF›¬¬,›Xn:((æææ,«±+++ëäÉ“t:Ãá444ÄÅÅÕÖÖnݺµººÇÛÛÛ7¯`•““coo߯_?€ªªªhÂ[¤¨¨èСC€S§N *ƒ¢  t  æõë×m7Xºtéëׯ}}}åêz]pWjhhl#B§Ó{ÚE¢  4!  _¿~±±±W®\{ŒŒŒš´a±X§ªª*!!AYYyÅŠ‚Cqqq†††555ééé"7n‚ ÖÖÖL&ÓÒÒrÖ¬Yv2((}’ººº6Žúøøkhhðù|Aq˜æ444p; Çãñx˜ygW]!B ®^½Z\\üóçÏaÆ?~ܸqà×âÒNö‚‚ÒÈËËûùù-[¶ÌÙÙyêÔ©4mÈ!Çÿøñc“–\.÷òåËóçÏÇáp‚Ô×׋‹‹ÇÅÅmÛ¶ |複Íf·q[’ƒ¦§§8ÐÓÓ³“]¡  ´HBGFFÆÁÁ!***$$Äßß¿Å6\.Çýú5))©½C“H¤ÿý·Ãa:‚dddÌœ9³²²²ñ~))©5kÖlÛ¶J¥2™LÐÄ©‚‚òÇ™7ož……Å­[·V¬XO"‘ÌÌÌZÌq8a„+VlÛ¶ÍÆÆÆÃãó`³ÙW®\¹téRbbbgúyñâ…¯¯/‡ Dç  tmD÷ïß§¢¢’““£¡¡Ñ¤AQQ‘””@FF¦½`,+--M"‘>}úÔFRŒ¶zèÀ9‡óùóçY³f5Q9€šš___55µÿý7-- U9(=–Ù³gýŤI“zàÂÈnåèÑ£jjjYYY{öì·ØLBBÂÂÂBRR2 ÀÆÆ¦óãòx¼ààà‰'fffu¦«Ÿ?ZYY!²cÇŽI“&u~n(((-2`À€ÖIHHvîÜùùóçæá+ÊÊÊ<¯¶¶–ÏçcÚ ‘H¤P(—/_>räHÇfÞq‹@X·n]EEEk x<Þ½{÷âââÒÒÒ:\‚¥ûX½zõ‹/bcc-,,h4™LþÓ3)âââW¯^5kÖ… ôõõÍÍÍÅÄÄGÝA`àÝðáÇÞÉ ;tè‚‚Âõë×ÇŽ{ïÞ½÷ÆårW®\Y[[;qâDggçß¶çÿAAà†à߯›ìl:iÞ@pèû÷ï,«Ã…‚ÒáñxÊÊÊMvª¨¨ÄÄÄTVV80eÊ”ÌÌL×¢3úܹsUUUZBBÂÅÅåÕ«W8ÒA¡kô¤§§·ÑF]]ÝÉÉÉÊÊŠL&û JOÃÒÒR^^>66vãÆð·Ú>ŸáÂ…ëׯ—””¨««ÛÛÛÂCaaagΜÉÏÏ—““SUUMNN8pàÓ§OÛ5:‚ _¾|o-X,VðÓxÐÚ!ÁG@‹' èQ£¼¼¼¶mÛfkk;|øp*•Ú\è(((´˜8§½ÄÇÇŸÍfãp¸ÖÒ­îÛ·/))‰J¥æææÒh´æª¥‰šéü%IW­>[±bEbbâçÏŸ»¤7”Ãd2›â½{÷î!C8N·³³óó󘚚’ÀMPQQæm¤9)))8«1:ÇÓéôÖ¨ªª&$$ÈÊÊVVV~ûö­5¿ZBB”)S:6ƒÁÀ`0Û[8ŠÈpuu½qãÆ”)SæÌ™óúõëM›6>|xñâÅ!!!ŽŽŽ4ÍÚÚúÇÉÉɀߖo‡Ã?~|7L€ÿ—GMh®–H$‹ÅZ¸pa‹6ZwüøqqqñM›6ÕÔÔœ8qBBBÂÁÁ¡ººÚÛÛ[RRr×®]UUUîîî’’’®®®•••{÷î•––öð𨨨prrÂ`0_¾|ùøñã•+W-Z$ÐaÃáìØ±#((hôèÑ?¶µµ½sçΨQ£ž?¾víÚ ÄÄÄÒÒR##£þýûGEE•””Ìš5‹@ ! 4bÑøÚáÇÆmtÒ¼à‹Åúôé“0ó™3gΗ/_šï‹‹ƒ•©S§*** Ó J·‚ÅbõõõÉd2“É„{ÌÌÌtttÜÝÝ÷ïß߸¥»»{uuµ´´t‹ý˜™™edd?î³gÏ:ÍÍÍEdáÂ…p?‡311IHH¨¨¨(,,\½zµÀ=sæÌŒE$ÓÒÒºlêÿOIÔ\5ùÈd2§L™R]]­®®®­­ûãÇAo‚l§Ð–·ÅÅÅ7nÜ·©T*T11±eË–Ám …bnn·/^áîî¾gϞݻw/]ºÇyyyÁ}@JJJOOn„#FÀm<¯¦¦·?}údkkËãñ¶lÙ"øõFLLL(JLLŒ¹¹ù–-[?~œ••G"‘"""`Ö§OŸ üª³gÏ.(( “É·o߯`0K–,a0jjj111·nÝÚ¿?ǃ!{{ûÈÈHxº L0yòäÔÔT …beeµuëV‘‰?”Þ›Íþöí›™™tKa0‡óÏ?ÿ >^\\\FFFEEåÅ‹‚€ÓØØØ?6ÝÖÁb±8* "‘H"‘àÏVLLL\\\BBBRRRJJJZZº_¿~²²²ÊÊʱ±±bbb¹¹¹uuuYYY—.]‚õºª"1‹]°`A\\Ü¡C‡TUUýýý±Xl»lºÆÆÆ .ì3¥NŸ>ýãÇêêjmmí«W¯***jiiÙÚÚ6_ˆkmmM&“Y,ÌŸÆb±(еµ5@[[[C077œnkk;oÞ<À«W¯ŒŒŒÆŽ{úôésçΉêúPz7‡H$¦¤¤lß¾ýåË— &''GII)!!¡IKÁ[J¢ƒæø ¬¬\SSÓx¿···™™YEE…ŽŽNrr²––Ö³gÏFŽùñãÇÆë50 —Ë=uꔜœ\F·°°0`@}}}Ç&‚" 88þVà Éüü|‚ 4ÍÈÈÈÇÇ'55UMM-%%åýû÷ÎÎÎaóæÍŽŽŽÆÆÆS¦LÉÊÊzóæÍ¾Œ.‚F£=þÜÀÀ 44tÓ¦MgÏž555 ¿|ùr×4}úôéÓ§¿yóÆÇǧ¡¡Ax¡óõëWccãòòò)S¦@‘ÔµûS fòäÉ€:88<~ü8::ºqË•+Wjhh¬_¿ÞÊÊ ‹ÅR(”óçÏëèèh4š‰‰ ´âfΜÉãñà鯯Æd29**ÊÁÁÁÖÖ`gg°~ýz4ýJÛÀì5×®]ƒ¹ÑO:uöìÙµk׆‡‡Ïž=[ª+##³~ýú7òùüžöÃì”ßGUU5++KðqêÔ©NNNŸ>}’”” :räȇiiiÍ£µ›7onâÒ’‚‚‚ŽNåÿ¸páü:ݸq£ùQuuõ»wï&&&ª©©yyy-Z´`jjŠÅbÏœ9sãÆ EEECCؘϼ› Ñh!!! ,¸}û6¼Æ ,X° ;ÆÒÖÖ.//²4Õ—/_LMM¿ÿ>bĈ[·nu>ŸrÏáÂ… /^„Y×~‹®®®©©),¤jmm UŽª•Í;7**ª¢¢B^^¾Fù€’eðàÁ;wîôöö†;¹\îºuë~þü¹k×®7n˜™™ñùü³gÏ [t:½¯ 3f;`0:>yòäòòrA##£qãÆµVŸ"11±].vccã¶«§¢ ´‹¶½Nx<~óæÍ›7on~ÈØØX^ïúõë111}¦àÉ„ nÞ¼¹téÒ›7o²X¬óçÏwëmKH³nnn®‰‰IYYÙĉCCCû’ÊÐh4Aѱßrúôéàà`---A®]»&''×ä+*mžÎ'99™F£^½zE"‘Z[ƒ‚Àb±±±± ,hþEÚ½{7‡srr:~üxyy¹ ¬åÒ3S“w\è444ØÛÛ“ÉäÊÊÊÈÈHÝ»w7V9¸°¼5ë(›Í.++~ÐêêêO¥ ùþýû;w¸\.Nøð¡¶¶v—dšé!ܹsgÙ²e<¨®®¾yóæŸ¯_¿^²dIMM¾¾þýû÷ûŒÊ ‡ž¦ÀÀÀaÆYZZ ¢ƒoÞ¼ùíÛ7hn ””ÔÐÐX°`««kPP„„Ĺsç0ÌìÙ³}}}¿}ûæââ")) —¸>|XEE%77&>ÈÈÈÄ2»»»gffÖÖÖFGG¯\¹²ÏüO¢t9‚ÌŸ?¿µuO»wï9r¤½½=ÇKJJê™Ñ9Ž òòr%%%;;»ââb¸Œ>&&F`Ý0cÆ XÊ«SÓDAéa¤§§Ÿ={–ÇãQ(WW×?=£.fÊ”)ááá‹-zòä ´Ý¶±ø [¹s玛͞;wnPPP_º™;vìëׯ€ëׯËÈȘ™™ ^ˆá!ð˯:nܸ À¤”L&³¤¤f!„††ZYYijjjjj8pÀßß?>>žJ¥ª««ggg§¦¦þóÏ?°+ccãÇóx¼Õ«WïܹSäWŒÒkPUUݰaC«»y<ž……Ezzº²²rOV9 ÃB‡Íf“Éä]»v‘Éäýû÷ÓétOOÏæ«çuuuY,V_º7¡ €ÿw]õU´´´âââ.\˜••5|øð7nÌœ9S”`±X.../^lÞ¼ÙÝݽ-‡nœ2GÈCM²oÃ8ÈÆX[[ÃEX-²uëÖ Bù{ÈÈÈ••ýí*„úúz33³×¯_geeÁš=“v»Þa⪪*mmícÇŽyxxŒ?¾¢¢ÂÝÝ}éÒ¥‚fx<ÞÎÎîùóçòòò¨u¥—¢¢¢òäÉ“™3g²X¬E‹íر£é=;ÆçÏŸ'NœxñâE<îÜ9X;B4C÷=ÂÃÃaª§ÀÀ@˜P¥ F}÷î]a~ìYYYvvv#GŽìÉ…žÚgh),,TQQ¹~ýú¦M›jkkáά¬,]]ÝØØØk×®ÕÕÕ………Ñh´/^())q86›ÝÓ¡  ‰„„ÄÝ»w?îááqáÂ…'Ož\¹rESS³ûFäóùÞÞÞ>>>\.WVVöþýûZZZÝ7Ü߀¯¯/ ÷ 1bD狳¢ôm0Ì“'O„l|ùòå•+Wêêê ³|2,,¬ymó6PTT„¿ ÆÚÚšËåâp¸ö¾ó´Cèäää :tÁ‚áááM•••Íž=ûõë×AAA3gÎ “••]—g å‚Á`Œ-,,òóó§M›¶yóf!—…·‹ôôtX+jûöí»wïFß§gæ´Dé™p8,Û®"S[¶ly÷î]Û Ëkkk£¢¢Ú;™ÌÌÌêêj///qqq Ãçó»Qèhhhlݺµ¹Ê”••™šš&$$55UNNNUUµµ60ß`Ç`2™°â^…´ZCØÜÜÜ¢¢¢¶S†¿}ûvÅŠÊÊÊ«ûƒ‚‚ÒÃ!{öìINNÖÕÕ­­­Ý¶m›’’’Maaa‡ûäóù±±±[·nÕÔÔ¼~ý:@رcGZZªrPPþÆ Þo%àÑ£Gm¨¹s444lß¾½c9½„}SWWß¶m[ó¬AM¸ÿ¾¯¯¯ƒƒC̈‚‚Ò% 6,**êùóçÞÞÞ/_¾¼}ûöíÛ·'L˜°téR333!"’˜˜xÿþý›7o644°XìÂ… >,d‚àž N ûÓ³@i‹þ^½zÕÞSBCCÝÜÜiѯôöíÛ±cÇ~þü¹¾¾¾¨¨HP8¢9JJJÊÊÊ÷|ýúuÚ´iÁÁÁ'Nœp8œvÆ%tx<‡»}û¶0wîÜ9cÆ 2™,ü<: º¤«EJKK7lØð§gÒ½ý>;mÚ´iÓ¦ååå8q"88855555ÕÉÉIKKKWWwРA ªªªrrrbbb\.·¶¶¶¸¸¸¼¼¼´´4555>>êÀ Aƒ,--ûÆÏY\\®ÏøÓAi ###t_s RIKKkï‰ïÞ½+,,¤Óép9‡Ã©¯¯Çáp_¿~UWW8p ŸŸŸ©©éСCÇŒggg×bÁJGGÇ&Áò>>>cÇŽ$%%!¡§§')))üíB(¡óþý{‰TRR"Lc‡³víÚ””‹õÛõVúúúM2)·Mã £ÑhÊÊÊè7µ9JJJ0õJOfýúõ}àÛK£ÑNž<éééyõêÕÄÄÄgÏžedddddsî°aôµµ—,Y2}úônž¦HQPP¸víÚŸž JG`0,«%9{ö¬‡‡Ç½{÷^½zebb2eÊ”ïß¿Ãä 6Ì™3gÓ¦M°ñ¬Y³²³³…ìGccca©AuuõE‹=zôˆË劉‰ ÓƒPBGKKëìÙ³BÎ ––výúõ6’VAž>}š““#|·455)Ê»wïÈd2ƒÁè@}11±yóæýéY üEˆ‰‰ÙÚÚÚÚÚ"òñãǤ¤¤·oß–••ÕÔÔ|ÿþýû÷ïD"qذa²²²#FŒÐÖÖ600ÑEx*++sss;foöññ±´´œ5k–OaaáÏŸ?>œýãÇ{÷îùúú \ÛEEEiiiÒÒÒ‚ÔÖÖª¨¨äç竪ª–””P(,[SS£¬¬œ™™Éf³×­[gddÄãñÂàÁƒ/_¾ ·…±§!…‹mohÒùóçÛ: ‹Å®Y³¦]}6>@¥RëëëûL%E”>ƒÑÐÐÐÐÐìIII1443fLŸ)ðŽ‚Ò‡8pà­[·:v.›Í¶µµ}þüù™3g>ÌçóUUUCCCG‰D"›ÍFäýû÷ZZZ $©_¿~ FZZZYY™B¡@/›ÍþøñãèÑ£7lØàìì ãp8L&“H$’H$‰D$ †0Bç÷ñ°ðx“¼ã¿%11±¢¢¢5/5ô@á; ›ÍÆb±………'Ožl׬PPPD ¼´VÖ¥§ñãÇŸ›pþüyssóׯ_4ˆJ¥Þ½{755•Éd–——~úô)!!AAA!44tܸqµµµŠŠŠÙÙÙL&óåË—oÞ¼‰D%%¥ÀÀÀÉ“'/Y²„Ãá0 @&““““7lØKK éýÿ½E'99YAA¡]‘4.—aaaÑâQ¸& AGIHH”––¶–*ƒÁL:µñžŠŠ UUU …âìì  "Âd2»#w J'B]ƒ‰‚Ò[øíòê¶Ù¹s§‰‰ICCÃ!C‚ººº¬¬ì‡Fžž>a˜p„ 999úúúl6;<<ÜÌÌ žîïï?a„²²2999==½•+W¦¦¦Ž1ZtÂäÉ“K…LâõûFcÇŽˆˆèÀÕ†††6ö^}ÿþ½_¿~ß¾}“•••““‹/,,\µj€Édººº¶8 @hRG°¬¬,--ÍÆÆÆÔÔtéÒ¥uuuOŸ>566f0¨ÖAAéiÀ 8¨E¥·ÐI¡SUUµ}ûöëׯ744ðx¼!C†$%%Y,ÖÈ‘# Fƒ-eeeaMãÕæªªª T*•Éd<˜Çã9>Ü›DÁââÂLé÷B‡J¥v`¥ ,,¬¨¨‡Ãy{{+))AëSyyyAAÁ«W¯ÜÝÝ¿}û[’Éä 6xzz Óí AƒàÆÉ“'MMM%$$bbb²³³¡¥G…jÑAAé-´«U‹Ü¸qcÕªU3gÎäp8\.·ÉQ,‹ÃáX,–˜˜‹}÷£àè!C`A+ð+ÊE…Ód=y//ï˜Ða06l>|¸­­mJJÊíÛ·‹ŠŠ¼½½ËÊÊø|¾»»»ŸŸl,##óèÑ#eeåüü|uuõÜÜ\yyy‡SWWG£Ñ`™­/_¾HII½{÷nΜ9ZZZqqq0?‡‡‡GII N'‘Hhu-”£ƒ‚һ蒴7n|ÿþ=…BfAŸ©©©&LÀš£F:{ölYYÇÛÚÚª©©ñx¼®]’ù¡s¥§§w¬÷ˆˆˆ;wî¬_¿>99YEE°dÉ’%K–4nóäÉ“1cưÙl>Ÿ?hРÒÒÒáÇ«ªªâp8.—+%%…Á`´´´`½øúúúk×®mÚ´)##4Æ`006™@  *¥§ ”^‚ 0>[;I^^^¿~ýþý÷_‡ñãÇ ö«¨¨xyy=|ø099YNN.--íܹs†††ªªªjjj222L&³ËOüFèp¹\ÐÞHäÆlݺÕÐÐÐÑÑQSS“ÇãUTTY[[×ÕÕÉÉÉ¥¦¦Ž=:##cذaC† ÉÌÌ7n‰Dúöí‡ûñãGNNŽ••'ãÆ?~üíÛ·¹\.”>GLLìÈ‘#êêê^¬Ž‚‚Ò} B¥çÃápðx<‹¥Ó醆†]Ò'“É ‚‰þH$‚ /_¾LII„Ú”——«©©ÅÄÄ,Z´¨¡¡îïŽôZ¿:|>®zïð%%%...~~~0X‹ÅÎ;—B¡”——WVVª¨¨TTTŒ7.//oôèÑ999°ûÊ•+“’’’’’«V­¢Óé<¯¸¸822RQQüR`Єãéé sÉ·VeåO ”ž›Í¦Óék×®½ÿ>F300xöìY—ô\ZZ*ˆQi—ËŸ1cï¾ 0¿‰äóù Àœ={699A††2™}zlllMM´´4,OŠÞ"QPz/¨ÐAAé-@ïUã*•••+V¬€YñŽ9 Qý–ÊÊJ@@@À‚ þùçŸ}ûöAeHHHÐÓÓñ ¡-{² "Þ³gOùìÙ³ÀÀÀÓ§OGFF6V9ŒŒŒ> >\BBÍ‹ƒ‚ÒÛA… JoÁ`˜™™57´ìß¿ŸÃáJŸu]ýU Âf³»¶O€ eQ"&&044 mrèáÇeee¶¶¶çÏŸÿm?eee‚À:ÜM ²²²¥¥¥ÍÕ××whÖmñ¡C¥RÕÕÕµ´´ 4PUUààà ­­-L¡3gÎìÚµkûöíqqqÍÖÕÕÕÕÕååå5ÙÅb¯^½jiiùÛþQº:¾k×®®í“D"…„„èêêvm·¢Ëå6)%‹" ¨Ðù«(((?~|×ö9{öì   î.0‰Òè½j.t8Î… \\\„yôkjjb0˜œœÁ·eË–Í›7«¨¨0ŒOŸ>ݼyóèÑ£Ïú:³dÉ’&Bpüøq;;;ggçæ¾­æ”——_¹rÅÆÆfÔ¨Q>|rr|>ßÎÎnÑ¢E€ÞkÔA$==½Ëü¢L&ÿûï¿ï§¦¦&44”Åb-Z´èÞ½{=Jëp¹Üüüüß6ó÷÷Ÿ:uêŒ3×0Aù-¨Ði›¨¨(CCÃ>f±èª"‰Ð>»bÅŠ«W¯öR­“™™9lذÞ5y‹ejjJ"‘šWõ ܵk—Ío…\±”’’ÐÔÔôðð˜>}º„„Ç{ùòå´iÓÆÿöíÛ&gý¡~y¯öîÝÛdaaáÍ›7---üõë×ßöãëë»aÆíÛ·¯]»VøùUWWµ7l[d„„„ã¼KHH˜|˜••UQQann¾sçÎ;vô:»owC&“/]º´zõêž©uf# äVÿjy‰•iw‹¹lþáÇ߼yóßÿ‰‹‹‹rzz¯Èd2“Élr(<<¼¨¨ÈÆÆ¦ ¡C¡P455 ÍÍÍÃÃÃ'NœèêêjjjŠÁ`  P(‚4:Ýaý*¸’N§[XX4÷^Ξ={ùòåE‹ݸqã·ý”——š þù§qÅÔ&£÷ð_~ÿaâ³ú·vþ1 ª+ó%¹jÇŽNNN§û‡ÃõX­# ëׯ/((ˆŠŠ²±±yñâÅ‘#Gþxô˜””ÔÌ™3ÿìz;þþþÝÔ³„„„‰‰I Þ¼y“••5eÊ”ÄÄÄÇ'&&öïßêýäïD]]½'k KP¤Z-AÍç!iw‹UÆK•dÑ?~œ““säÈ‘‘#GŠr†@འirˆË庺ºNž<911±ÅÓLJÇã=ŠÇã_¼x¡««Ëb±®\¹rìØ±¨¨¨6vtÇã^¨ÅÄĆÚâÂàÛ·oWWWÛØØÓ¦¦&ƒÁøòå‹`ψ#¢¢¢*++ÃÃÃþü™žž=y¡Óé}ÃÁ¿9tÒBïQx"öÖ­[ÖÖÖ………zF¨uŒëëë-ZôêÕ«?=£v@¡P\]]÷ìÙC"‘‚‚‚fÍšõéÓ§?=)”^¡¡áÉ“'ûõë÷ìÙ3==½çÏŸÿéõ8 ÖéׯÔ:ÝáàèV”µ¤v¼˜2pŒÔ·o߬V,þÓ3ú=­eœ9sA¥K—¶v.ŒDÞ³gÏ;wÆŒÃãñæÌ™³fÍšÌÌÌ‚‚è)Â`0¢±è%t Âjñ‚ ÆåË—§M›&Œ>8qâÛ·o9Ž˜˜ØÎ;óóó?|ø0wî\ S\\L&“ÇŽÛüý˜N§­ŠåÞÅäÕ*ö‘zrCÄ «Kâõz#½ZëŒ/^¼8xð`èÆº}ûöŸžJ¯G[[ûÚµkÚÚÚÐåííÝeœ{5½]ëȪŠÙELÒ_;º±{x`‹Å211iÑhýóçO6›-))ÙÚ¹“'Of0222‚Éd÷óçOxèõëׂÜÊ\.·É‰Ì¢~y¯Z<€ Èo:ýúõ£Ñhååå/^¼(//÷ôôìׯ߹sçôôô–-[Æd2[såô‹DYKr[œ¾–‰"³Ž»cÇŽC‡uy~­KQQÑ’_,[¶¬  @ZZº¾¾ÞØØV­ïEÐh´Ë—/Ï›7Á`ØØØØÛÛ7÷d£ ´ YYÙ“'O®Y³pøðá…  ž 3UUU÷~ñþý{KKK*•³hÑ¢^§uðD¬¹çÈÇ‘%ñ?¶°°ÈÊÊúÓ“j111 ‰yóæµx”Çãµöh&‰sçÎEDLL¬y}§»wï"ÿv=K舉‰Ñh´qãÆ5?”ýâÅ kkkèÒk mmm cll]ˆ±±ñÈ‘#]\\zÔj,”^ tc8pàÍ›7ój,˜0¶9ïÞ½ûüù3‡Ãñ”º èÆ ÝŸóòÂמ¼‹ÍfÏŸ?ÿäÉ“W®\iRW¼5‹‘H1Œ¶¶öºuëΞ=[\\Ÿß$4çû÷ïMº•––vvv†®€††ÌÖv LÇh‡Ðdlñ(¬!--ÝâQ¦¨¨8pà@èÃb±?~ü€ŠïÝ»wGˆÆÿßû®EGº«o€®ÆBérÐÕX}ž^± ‹ÅâñxA˜Læüùóïß¿/++;|øðèèh.—›’’hcc_ÔOm‡-4>>>çÎÓÔÔ\¿~}NN—ËMJJ’êÁ ìnún·OC´±öªíŠ6ÆÆÆ,Û<Ë“ÉŒŽŽ&‰P÷ˆ&4©m®\¹݃Á <N§Óh´!C†.^¼› >nÀZž8.>>ÞÒÒòÙ³gk×®}ÿþ}@@ÀðáÃÁU™™™p#==}РAðãçÏŸY,V.©kŸÐ¡R©C† ™0aBóCm KKË6~™7nÜ€£…Žˆ5G~~¾““Ó²eˠ䨫o€º±PºÔõ7ÐcÝX‚`0˜²²2=YŸ>}‚™_†ŠÅbŸ>} [r¹Üªª*ÀàÁƒ½½½eddtttêëëË2™œœœ\ZZšœœ,Øùýû÷‰'8p ²²R°> ´´D©½´Oè`0˜†††7nlÛ¶­_¿~µ!t–.]ª­­-###ØC¡P*++,--šššúúú³g϶°°ˆ‰‰Y½zu»&Ùy ØÌÊʲ±±"T”£‹Ìõå˸J³Ï}ñâE[ȺÊÕë2…ü=ˆÞ…ÔÜX½w¡S¨©©iMÑ­ôL74@|ûö @¡P8ކ†Æ—/_Þ½{×$Çøðaݺu‡233óõõÕ××ïß¿ÿ?ÿüÓ¤O]]Ý;wî4ù³X,777]]]"‘H$‡úþýûÎ?§ÚþB$‡ âëë[VVöàÁSSS˜¶þG4Á622º|ùraa¡à‹Åâóù»wïnÒRVVÖßß?66öåË—Ïž=Ó××÷òò200hÖÔÝÀ_²……•JMII±²²Ú¶m[~~¾È& 7VVVÖСC]\\`}¦¼¼ÜÑÑq̘1þþþÝÒß]âÆÚ¶m›››Û_"I{îîîÎÎÎ0Ÿ¨­­½víZ¸DV4üY7ŸÏŸ={ö²eË222D6î‹ÅÖÔÔøùùÍ;÷ôéÓÝTâ¾EDæÆ¢ÓéǧÑh{÷îmãaJ; &Ïž=[RRÒÓÓ3)) –g uuu…¶yyyø@ÿôéÓ£G÷Æb±8NÛßÛÄÇÇ<†u†Ž/h"‘H ¦¢¢‚D"988ìÙ³pâÄ &“™’’róæÍ˜ššòù|¨ ÙÙÙd2YYYùÇ .ÔÑÑ ¯¬¬äñxúúú555‚[yFFƨQ£²²²˜Læ»wï²³³óóó¿ÿþãÇêêꆆ†î³(B¡C$¥¥¥a¶†Í›7ãp¸‡{{{C¤èV7ü¯–‘‘a0gΜ3fÌÞ½{û¤Üèï¡C‡–——»¹¹iii>|XdÇθ±`–­ÒÒÒ7Ξ=ûÍ›7]8±Y³f ý…¦¦æš5kš¯Ei ˜*‰ËåÞ¿úôéfff‚Hð§ÜXðÆ‹ HTTÔôéÓW¬X‘-‚qÿð9M$étz@@Àüùó}}}Ç]t+¢qcAo N?tèššš‡‡ÇoGáñx555 æõë×—.]"‘Hnnn+V¬°µµ…‹Ã›¤¡™8q¢‰‰I“N‘’’‚ÛT*u×®]G½xñâÇŸ?ž]TT¤££~ý:CÇ%999‰‰‰ ,€yÙlö¸qãàXFF†ËåŽ16f³Ù‡J¥JKK8pàÇ·o߆Éñ =¿®®®qNU«V}øðáСC †Á`deea0˜”””‹/ T'\Æy‚ HnnnIIIpp0áD"Q°Çãa3BKÀ‡½`˜¢¢âéÓ§·oß¾ÿþààà   ¬\¹ÒÚÚºÃÿ{ÂÓ}I¡Ð™1cÆþýû]]]CBBüüü.]º´víÚ-[¶t¾ÿn‚×~¾|ù:thppp\\ÜÁƒŸ>}êíí}æÌ™5kÖ´Q€· i’T0,,láÂ…rrr’¿‘‘iñ÷ …ާ§ç±cÇÒÒÒ /^ìêꪤ¤ÔùYmÙ²%22266vñâÅ$),,ÌÆÆ&<<¼ó=ÿ @¡³jÕ*YYÙsçÎ={öìÙ³gZZZ[¶l155ÁþHRA(§þù矑#Gúùù…†††‡‡›™™íÚµkذaÝ:´èïH#GŽ|ðððPQQ9~ü¸œœàñãÇkÖ¬9uê‚ m ¯/_¾tuuår¹öööA~þüYYY©¬¬Ìår»ÊŸÓÁ^ÊËËUUUþüill\YYI¥R“’’ôôô &Nœèçç§­­ ëš&''Oš4 ÇÇÅÅEDD¨««ïØ±ÃÆÆ†N§c±XøÀ†ÿ› ^^^‚!ø|¾——×Ë—/׬Y3þü‘#G’H¤¥K—þ÷ßcÇŽ-..f³Ù<Á`0Œ'Y[[Û™Õ.MÄ„ššZPPÐÎ;wîÜyæÌ™àà`ÁRºnº±/>Ú›}ëÖ­û÷‰ 25±Ùl6›­¡¡!(|l7߀Û0ZƒÁŒ3æÁƒéééÿý÷ߣGN:uñâÅåË—‹àÒÀ*"|>ÿ·ª¥ÃC~ϳfÍÊÎΞ8q"N?yò¤¿¿×]G[@7‹ˆˆ mÒ€J¥ t””Ü(**XYYÙÙÙyzzúøøÜ¾};,,ÌÁÁÁÎή“S255%‘H±±±¶¶¶ƒÖÐÐØ»woYY™‚‚àùóç'Ožüðჸ¸¸ƒƒC㌠׮]»zõjaa!ÇSRRš>}º»»»‘‘ÑÇ“'ONMM¥P(VVV[·n…_9>ŸáÂ…ëׯ—””¨««ÛÛÛò'3fÌøöíÛÌ™3_¿~Íd2µ´´þûï?ÁkRkcýv†ƒÏç3 &“Éb±šüÛä#\@+--}ôèѽ{÷ž={öäÉ“ëÖ­sssk­vA×ÝXãÇß¿?tcÁ/ƒëVp8œ`£ùÎ&Àý°Yã6Ï…¯£²²²GŽqtt<|øp@@Àýû÷CBB/^¼lÙ2\µ€—/_òxn>Ÿ¯§§ñæÍ›ƒ>zôèÚµk·o߆IóDp™ZÆŠÊ£%¯­{ûíÝ7«ËåúÉ÷ï߇Ãáñx×xn·¸¾áÃíïß¿‡……}ûö Ç¿xñ0|øp??¿'OžìÙ³'))iÛ¶m>>>ûöí[µj• —ÅbQ©Ô·oߺ¹¹Ž;6zô蜜9997gΜ~ýú™››P©TA:Á6PVV¾yófã= F^^¾ËÓåwPèÈÉÉååå)((444ôëׯ  `„ ׯ__¸p¡  ¼O :ÔÛÛVlñõõ…ÍÈÈHRR²q€-—ËÅápÍMú ‚‹/¾}û¶ ó7ŸÏg±Xl6þÛ˜õë×O›6mäÈ‘&$ä4‚ËåÂfœ–xóæM]]]s« ŸÏÏÍÍ8wØl¶(#[‡‹©8.›ÏårI–”••u²--­… &%%ýøñ£¾¾>,,¬“¶‹Ÿ? é5Ãý˜ØªñǺººOŸ> Lî!!!û÷ï‡æY¶qãÆ;vtïåý",,,>>0`ÀÆçókQ]]]_____ßb˜””•Juww·µµµ²²zúôé¡C‡®]»feeÕUs+++‹ˆˆ––† $£££íììFŽieeUWW“’’A¥RYYYÿý÷ŸŽŽÎôéÓëêê?~ ½ò¶¶¶ÑÑÑQQQ¯^½255­¬¬<}ú4™L¶µµ¸ººÞ¸qcÊ”)sæÌyýúõ¦M›>¼xñbƒ   çÏŸÏ›7OVV6::zݺuÏŸ?‡7ÊÖÆj{†í¢®®nñâÅ<Éd6ÏpÑ6Ð ---½k×.33³qãÆ1™Ì   öN£Ãhjj6ìÕ«W"Æj(**ž8qb÷îÝ4­¡¡áæÍ›wîÜÁè=zÔ$ø£ó4Ï*"ð jkkšg̘‘˜˜ºxñâoß¾mذ! àîÝ»òòò åÅ‹nnnEEEG511©¬¬DDCCüÊ3vìXÿ¥K—>|xæÌ™,«yæ¼ÆüÖðÓUtPèðx<"‘Èápà=QUU5//ÏÂÂâØ±c‡NRRÒÙ³gëêêìììœy<T3°†9ƒÁ P(‚ËËË¿~ý _^Û@VV¶ñG,K¡P÷#@RRrذa“'OîÀÕYXXdgg7:l6;((ÈÛÛ¾­ÊÊÊZYYYXXœ?^áx|säsœoÂGôôôvíÚ%ˆfGäÅ‹ 'Ožì¶›oÀíØØØ;wb0.—$¨C£ÑgÌ˜Ñø•º»±µµ]·n|wl›t¹|ùr=)“ IDATµoß>è]4h³³óÒ¥K+++E t †··wdd$ÀÒÒòÈ‘#Í¿·t:½¶555UUUNNNx<>¼322NŸ>ýúõk؃ÁTVVvId4\‹‹‹?~~ó}}}¥¤¤¦L™••:ujxxø;wV­Z~™!‘HZZZ ,€\ccc2™åààÅ]@@ÀúõëKKKƒƒƒ×­[·k×.Ç[»v­ÏÂ… õõõƒ‚‚.]º¤§§ÐÒÒrtt,))8p`cµ=Ãö"xy€w2™L"‘ÿ 7 p;???66 ?º¸¸{{{,Ëápš¤˜ÿ½ 111±¶¶¶··ÏÈÈÐÒÒêîÿŸßÒA¡ƒÃá ÔxŒ8vttܲe ŸÏ÷õõ:uª“““¦¦f]]t¶Áß›Í.))iâôQTT¤Vl‰´{÷î}ûö½ÿ¾µò]… cÐ|}}a¦²²òªU«ÌÌÌÚª]HmëºÍÛ¼—•XfÓæÍëׯoRCBB‚D"A_C»€§|øðÖÐh4''§E‹áñxG%÷ïß¿qÐz׿xðåOQQÑÑÑqÅŠ"«ŸšŸŸ¿gÏž/_¾P(”cÇŽµ$.....>`ÀÁžŠŠ ''' ‰œ:u ƺb±ØÙ³gÛØØÌœ9óÕ«W]ž¼lÙ²wïÞUUU Üÿ\.÷ܹs›AS .5 †£ãñxGGÇÆw´9sæÀ¹sçFEEUTTäææ""0úâp8“„„BpK?.›²µ±Úža»¿sçΤI“H$R“¡mpÿþýØØØ¢¢"[[Û .p¹\11±7nݺUBBB4™mCBBŽ;Æb±Fuùòå¡C‡v÷ˆ×®]{ôèQEEŶmÛÎ;Çd21Œ¡¡¡“““¶¶6Œ‡ÆÆÆ6lèÂ=<<ôôôË| UUUæææ!!!‚P©TKKË+V@µ- Rª‚Ö¿­.bŠÉ¼Ý}§M›Öù>óòò6lØ+xyy¥¤¤p8œ'N=z>é&L˜ðòåK‰éææ–’’²nݺû÷ï÷ïß?::zîܹ­õ ßbccÍÌÌÞ½{çççW^^ƒxþ ]étêêêüüüjkkÙ´i“¦¦fó¸$"‘Ø<´AÆ]3gΜ3g޼¼|¿_ <Þ;º[å O­®®îÀ§OŸ†1öêêêkÖ¬™;wnÇŒ #÷YyðÆŒºŸ,IÒñÃþÚÚÚ]>\11tèP(qDyu"^—Ë•““Û¶mÛÚµkEYZ<,,ìèÑ£L&SCCãòåËíŠë‚‘ÈUUU0àCBBbùòåëׯïrQ¸nÝ:iiiSSÓÍ›7ß¼y¾É`±Ø‡¶h1ÍËË£Ñhéééß¾}»yóæÑ£G/^,¨v—œœ 'ùêÕ+‰$-- sLÄÅÅ©««‰oœJ´EZ«í¶ #%%S¾ d?àñøU«VíÚµ«¯ƒÁ`xzzFGGV¬Xáåå%šo54o„„„0Œ‘‘ÑŽ;ÆŽ+‚¡E|«,))_³¥K—®^½ºµ’Ž]‚€gg¾DúÈã cÇŽõööVTTìòQ ¯öÔ©S𣖖ÖîÝ»—,Y‚ÅbŽ?>sæÌ´´4--­?öïß¿ •‘––...ŽŒŒ´²²š9sæ½{÷x<´uùä…¤³B'%%EGGgäÈ‘ŒŒŒÜ³g´KûùùmݺuêÔ©K—.}þüùoEhllìúõë¡Ñ›@ ¸¹¹©¨¨ R^^^YY9`ÀhXM {hÑ100€ãÆ[»víÔ©SEùwjâ®òððhâ¶ë<Ð¥®®îäädnnÞ'%ÇKKKÛÙÙÙØØ´÷aÖ„qWµ :€¡C‡®_¿~ùòå];ÿððphŠ¿víš³³ó‘#G–/_¾uëÖ%K–ØÙÙ9::Ο?ßÀÀÇçåå½ÿÞÖÖvýúõ€Ç=z4""bøðá,+77W\\¼±™ÓÝÝ=33³¶¶6::zåÊ•D"‘F£ùøø¤¦¦ª©©¥¤¤¼ÿÞÙÙ™@ ê]ŒoøÜíÛ· g̘–žžîåå…ÛÕq–êþýû‰‰‰!!!wïÞ¥P(ÏŸ?ï?fàç.\ØÑÑáììLtñéèè˜4i’ŒŒ áûþâ{zzÌÌÌ6lØ`hhÈâ |5]5*äääRSS—.]ÊõóÃkii=zôˆe‰*léª}øðaáÂ…8K5qö¾}ûpãüÙ³g7oÞYO§ÓûÿùÉìrìk€²€‘‘‹ÇbWºª¿µkׯ»÷x$//¿}ûvVî‘5éªþüýýñ` ÿ®£½½]HH¨»»{ØçجY³ŠŠŠBCCÙ>¤äÐ~Êß¿!4eÊ”   UUÕ7n”––&&&âg›‰(377?{ö¬···£££™™Y}}=ƒÁ꣛l‘™™Åú(§¯—Q¸ûqÊÊ›ÞtΙ3ç|f!‹)‚‘kooŒŒìèèprr*..É`KlÌjÏ¥K—pï””üˆ"cqñäÉ—¢¢"AAÁääd*•Ê–_ƒ\ßÌFmwqº™ö°¯‡±nݺ#GŽŒu”ƒ"†'îD"-X° ¦¦æöíÛ#)·±òÞ/l‹ž¥]ZZÚßßÿàÁƒ 'Ož\¼xqss3ƒÁ`ÖufùòåÝÝÝ“'O¶²²ÂChçåå-^¼xôaô±¬;a¬IW15*éªqÈ…:uJKK‹5#jNìMW`eºj`¸ÿÉŒ3äååG8;°££cþüùƒžqÔ 6ÐikkëèèPPP‹ˆˆÀC²vwwµs3OåããðâÅ‹‘`ÊMX–®cg´ÒUãÚç¹00Bœ®cŠõéªá^Ïmmm#y¤±··—‡‡ÇÂÂ"..Ž•ç>7Ø@‡——WDDdóæÍ¿üò‹¸¸xAA­­í ßKŒ™XRRbccóðáÃ#GŽà&¢áV›{°àé*0ÖFþt_ÄÆ§«k°ìéªa¸[íWá'y322V¬XñçŸâéÍÙb°(™L>pàÀãÇÅÅÅå`xÌÄiÓ¦•——ÛÚÚ¾|ù²¶¶ÖÔÔtèæ*®â®cÒU\sÒUcäÁƒ+W®ü믿Øå A:/^´³³ûðშ¨èHºèNš4IPP°¢¢¢¥¥…†…f/HWqHW±é*®Çiéª1‚»!ûí·ì­Æ 33³‚‚‚cÇŽeeep]]]ââârrr,˜„cAºŠ @º ŒHWq=NNWq¥A}¸âââüüüK—.áÎÚÛÛ{zzâãã}||ØØ›½ ]Å ]Ƥ«¸×§«8РÒÒRü4<~êlØ;LMMݱcÇÖ­[ñüçÃ.jœ‚t€t ®âz$]Å›ºúßÖ#k^«¯¯·³³355åááá♕˜)ÜýÒUãÝÉ“'ñ𘮣èéÓ§‡†tkû»;ÕáæC:¤«Ø€¥ô´iÓzzzº»»¹)uÕö®«ùYÓ—!Ä` ËqO ]űZ[[‰©¾èÎ;¡ÆÆFHWÁc0]]]lÐÛÛ‹JKKCAºjœêífôtõ1}µ‡º{þBÒUlÁꈒ+cØßÔþ~ ö«›AºŠ“uttœ9sæ«›Aº IMMÍ ïj®¿Â´è_ß!HW± †¬$!!¡¨¨8˜-•””vïÞ-!!1ÖUC%**úùô“_D&“×®]ËiÁzOOOss3»k1¾Å|$I@@`0[ ÆÅÅ-_¾|ÔëÆß ;›:::z{{OÀ>œ€³.Ùãκuë¸{"ßžžž»wïŽé.šššÆ´ü¯ܸq#{ë0l|||õõõ?üð»+2îzüª¥¥õúõëÑ-pšßÿÝU_Èû÷ï¡3 '322zòä »kÀ¿¼~ýzäÑ Œí?À8ø2^^^Vv'á¹ÎÑÝÝýèÑ#v×€ÿ@|™¤¤äo¿ýÆîZÆ…²²2–í:ö‚Á€@Àèàçç×ÑÑaw-øÍ\ p-tÀµ Ð×bÚ9$$„F£™šš’H¤ÞÞ^ …"**ÊÊš}."""44tod0YYY'Ožlhh˜ŸóKOOÏÉÉiÛ¶m,¨FDDÄ•+WfÏž¿åÐÐPìw±±±#/GOO¯¾¾/ Í›7oïÞ½S§NyÉ#Q]]mggwïÞ½Aަ 8Ù9Ç8ð*ÆÞýGˆi C¡Pz{{wïÞzýúu\\\XXëêõ%­­­Ã{cbbâ±cÇœµ´´ž=êPx{{ûûû''' 555íß¿ݺu4mT ¶¦¦¦¦¦¦ööv¶Ÿ`ä&È9ÆW 0¦8ðî?Bƒz¼\^^ž¸ý´µµEFF¶¶¶âIw#""$%%ñKQQQ/^¼`0bbb=ÒÐЖ–¾~ýúéÓ§ÛÚÚ‚ƒƒ_½zuúôéË)..ÎÉÉáããëíííêê:tèÞ>00N§üø!D&“#""ÄÅÅSù>¤¥¥à~ÿóŸÿHHH¼}û!ÔÒÒ{åÊeË–mÙ²…ÏÚÚúõëו••ÒÒÒAAA–––!fëûúúŽ;vúôé7oÞL›6ÍÞÞÞÉÉ ï—ÿûï¿···+((´¶¶æææŠ‹‹/Y²¤¶¶!djjŠRRRÊËËC566þøãííí¡òòr"ˆ¸ž÷îÝãããËËË[¼xñ`>fdeeñ®Bííí±±±mmmøÛ !féÚ·oßË—/ †¨¨è“'Of̘!%%õ×_=z´½½=<<¼±±ñèÑ£—SZZzáÂü-wwwïÛ·o¿sçÎ’’â[ Þáày7­­­ñy2yòäµk×vvvòññíß¿ÿÈ‘#***ëׯwwwÇoinnöóó+**âááÑÑѹ~ýº¤¤dJJÊêÕ«{zzêêê’““£¢¢ F]]¨¨(³rB‘‘‘ÇóæŒŒ Ï;wŒ?~ŒRQQAMŸ>ýÖ­[Ã;:À &à96˜«Äÿ»ÃÃß&&&((ǘCR[[ÛÕÕeeeE¬!__ßÆÆÆ€€€¶¶¶¤¤¤¶¶¶   77·]»v P(”’’’ÐÐÐ Édfë©Tj~~þÊ•+¥¥¥Ÿ={–@&“B^^^oÞ¼ñöö),,üý÷ß?|ø ..}õêÕ„„„¨¨(AAAYYY\™¸¸¸ªªªÄÄÄþ‡0p=‹‹‹=<|@™™™õÏ}’Éä¹sç~2ãñWëyãÆ§OŸ^»v­µµuíÏž= ¾ÿ¾©©)ñ› °°°±±‘Ø7áH¤êêj"L´´´Ä Q`VÎâÅ‹ÝÜÜ&Ož¬®®Ž/|cDOO/L™2%++ !”––ÖÒÒ‚o$Xvvö¦M›>|XQQ‘ŸŸ?g΄??PP±±±€€1†¬¬ììÙ³ñ2³rBòòòâââ ZZZ&&&ÑÑÑBBB!]]Ý÷ïߣ~m€ L„slHW fÿÝšššÄŸ–––Ä/¢ÊÊJ""±²²êÿ;gÆŒJJJ!>>>âp˜•Ϭ>C=ØÖÖVîNTVVòððüñÇvvvÌ>„!Ýý™Ýµµµµ‰?mllˆ–Ž»w­-Ñ¢ƒRWWÇ‘ý¿qfå3«Ïç‡3P £ªªº{÷nÜ~ÐÒÒ‚›§OŸ?À»‰Y9ÖÖÖÖÖÖ?~¼wï^jjª²²2þÇ6%%%2™üÇØØØô_ßÕÕ…"¢ AAÁÞÞ^ƒÿìÿa+¿¸žÁ`Ì›7¯ÿæøŠÓÑÑ""aaaÜ2Tëçà)++ïܹ³½½=,,ìýû÷øÜRQQ‰ŠŠFiŸ`VŽ……………EkkkUUUzzú´iÓ\\\F¾»Ïeffòññ%&&–••ÕÕÕéêê2Œ… zyyÛ #„:;;BD[÷W½™•ƒ_:þ|iiiUUÕ¥K—h4Ú7†qÁãÂD8džt•`ößýIõúúú†WfåÖU«¡¡»“ %..ŽJ¥FDD0K éîÏì®=Zß8³ò|ýñr!!!œPÀ*++±·¶¶615RaaáÓ§OñrOO^xþüy]]±=³rbbbB"""sæÌÙ±cǃˆ—pס’‘‘qtt §Ñh/^ôñññ÷÷WWW×ÐÐðññ9{ölzzzttô?üÀÃÃ炾yó&ƒÁÀTTWW#„˜­_ºtiyyyqqqccã­[·bcc<ˆÒÔÔTRRòóóËÉɹ|ùrFFÆâÅ‹óóóq­p”™™yöìÙÍ›7›™™½yóæÉ“'W®\¹}û6B¨´´´¼¼¼¯¯o0õÄÝ´ïß¿?ŒÏ Æmé¡iÓ¦¾™††Æ•+Wð2NÇ?2P¿o¹¡¡g^.‡J¥"„„……gÍš€?Ilxßòçðœ‚?~TWW?s挽½½››[qq±““N¿téÒË—/¯]»¶}ûv|ÔºººZZZ...'OžLNNÆIX ÿNÊÌÌLMMݵkB¨®®ŽY9![[[{{{~~~++«Y³fáë&~ _/>|üøñ+V¨©©ÊÁ¶˜hçØ ¯Ìþ»kjjú_=´´´ð²®®îåË—ñrqq1±žfå3«ÏP᫳$@llì²eËœœœ¼½½srrúúúˆÆu[[Û+V|üøwja¶>''§±±1!!!,,ìèÑ£mmmø¾€“{öìY¹rå?üåêêJ$ Bfff3gÎÄUÂIœÑR=qÏ›¯^ly÷gv×~òäIÿ¨€¨¶AAA^¦ÑhÄzf˜•Ϭ>Ÿèñr:Š;ø¹ººÆÆÆ†……Q(”ÜÜ\!!!qqq555í®[·n÷îÝ.\ ‘HÊÊÊDK¬‰‰‰»»;Ÿ€€@KKË‹/BÌÊyöìÙ¶mÛ:;;I$Rwwwÿ'mmm7mÚ$&&&$$¤©©IDÙ_åïﯠ pöìÙŒŒŒI“&{xxH¤¤¤¤˜˜˜ØØX~~~;;;œ$ÆiΜ9“‘‘Ú¾}{QQ³õ?ýô“йsç233%$$´µµqƒ'OJJJlll\\\[[›´´ô¼yóæÍ›‡«¤¡¡áâârôèÑÞÞ^mmm__ßÉ“';;;¿|ùo, ››«¨¨8p=ýüüpÀáîî~ïÞ½A~&XDDDII …BÁ÷ =<~ü8ëw=º‡9JYY™]]]t¦cd¢cãârall¼gÏžìììììl'''mmíÎÎN:ÎËË»råÊöööõë×·¶¶:thþüù‘‘‘§NŠŠŠ¢R©óçÏÏÍÍÅí4ß}÷³õ±±±::: ÅÅÅrrr ½½½K–,Zµj•¸¸xccã©S§þïÿþï‡~@=zôÈÞÞ~ëÖ­ÒÒÒ4­ªª*''çýû÷õõùeøÁÙIDATõ?NLLŒŠŠ’˜3g‰Dúj=ííí«««KJJÌÌÌÆîÃd{€‘H$˜½€Oݺu«¢¢!týúõ… ²»:€ Á9ÆÉ¸; pæÌ™/^ „œŸ={ÆòO— F¿E§¶¶vÿþýeeeÿùÏú?/ÀbТ3¦ž={vèÐ¡ŠŠ ‹;v°r×, ««‹Gõ””|ðàÁ'ÏÁ0ríÃÃ+›˜˜lÞ¼?HÅ™p‹Žªª*»+2¶<==ýýýxêjäððÊsçÎõööÆÙXv“UUUb'À­”••ùåv×b¬ µ«C5ÑαÐÐÐáMàÆ) …ÂÞ!ûƒI=Àµ Ðׂ@\ p-tÀµXèP©T<]-˜ <¸~ýzv×0>Àc"`}$À4ÐùùçŸgÍš…'s ™5kž\i$¼½½ÇÝø666zýŒÅÈ@555x–uN“––faa´yóæþS ÆæÍ›ñ+EOOO²ŸŸ~úiÔwQ]]­¡¡AL?&ˆŒŒ ###yyyKK˲²²¯n?Zç çœo\yŘȸ#`:ŽÎ®]»ººº444B ¥··wÆŒ,¬§ˆŠŠºqã`[XXø«Î CssóÛ·o;::>ŸFŽí\\\êêêðÀíÝÝÝ¡¡¡œ0¤÷%''—••Q(”ääd}}ýQßESSSSSS{{;??ÿ¨8SrrrPP»»û¬Y³ÎŸ?¿|ùòsçÎ}ÿý÷¼e´ÎÎ9߸òŠ1‘qG$0äÛÚÚ"##[[[{{{BxÒ/üRrròýû÷I$RGGdž fÍš…×ÇÄÄÔ××óóóëèè|µœÀÀÀºººèèh …"!!akkkii‰*..ÎÉÉáããëíííêêõɹ˜144ēٚ™™á†BÖÖÖ¯_¿600¨¬¬”–– •´´´|óæÍ÷ß÷îÝÎÎNeee—¥K—Þ¸qÃÍÍ­···¼¼üäÉ“III £¼¼\TTtÉ’%xJNSSS„’’R^^km¨Þ½{',,Ü •JÅ£»***âQƉõ/^¼àçç×ÔÔ$V®\¹RTT4..NBBâçŸ.))9wîqò°’‰‰ þN­­­‰i†fΜùâÅ ccãÛ·oËÈÈDGG/^¼!¤¥¥õúõk ‹ëׯwvvª©©yzz:99•••-[¶¬§§§®®.999**ŠÁ`ày‹Œ?~ŒÂãNŸ>ýÖ­[¬?LÀJAAA¡åË—;;;ïܹsçÎC:O¸é|ãš+Æ`œ;wîðáï_¿VWW÷õõ%nÌÔÔÔlܸ±¨¨h„¿oG«œ¡_‘À@Nmm­^~õê^Ø¿¿¿¿¿””B¨¹¹9""bïÞ½ø%777â½~~~øðÒÓÓ ð?aaavvöÀåÄÄÄ,_¾<..nß¾}D`ÊÎÎNJJÂ3¯¦¤¤ æØÆŽ››Û®]»(JIIIhhè‚ Èd²››…Bùïÿ»aÃEEÅ»w‡¿{÷ÎÉÉiëÖ­ñññ¡+VÉä„„\TttôÕ«W¢¢¢eeeÙzd_ðìÙ³ààà®®®ÒÒÒäädbý©S§tttðÕêòåË™™™xÆ–¬¬,]]]¼žN§Ÿ;wo¿ÿþôôt „µµõ÷ßÏQ×,___AAÁ_ýµ°°ÐÃÃÃÖÖ–‡‡ÇßßßßßÿæÍ›¾¾¾***7nÜðññyóæÍ–-[BBBðÔÐ...d2™Hk¦¦¦Òh´ÈÈÈääd!!!yyy¶`…ªªª?:::kÖ¬Yc``0¤ó„ η rÅèïäÉ“ÑÑÑŽŽŽúúú4ÍÝÝ=%%å»ï¾à-£ÕÏ‚„D:ªªªD«cPP^ÈËË{ýú5±MCCƒÁ ‘H}}}¿þúëƒxyy 1ÓXUU•³³3^¶±±ÉÍ͸„ŠŠ ñ‘–-[¶fÍ---kkëAÞÁY丸811±É“'ççç·µµ‰ˆˆLŸ>!‹›glll¤¥¥“““×­[§««‹ß;yòd¢(MMÍ> ·qeeeÜÝÕÕõÓO?íÚµ Ÿ”•••ÄßVVVļÄ>$:šYZZ Tòòò---¥¥¥øŒç¸=öرcrrrgΜimmÃm¶GŽÁ¿'–/_.++»gÏ///###ü^YYÙÙ³gEéêê¾ÿý»ÅLLC:O¸à|› W BgggBB–-[6oÞŒ²±±ñõõÝ»w¯Ïò96!À‘ÀSWÓ§OÇ-Ÿ P(óçÏ÷ððÀÇPËA}1ÍlmmmmmýñãÇ{÷¦*++oÚ´iˆueøËÀ ±ÜÿZ#))ÙÕÕÕ××ÇÒš ~~þåË—ÿù矶¶¶Ã+aåÊ•ÙÙÙöööBBB¼¼£?ÏÚÈ1ûNûÿ””’’êêê ­`ÚÚÚ"""'Ož$îÇYYYß}÷Ýð~gsÇù6®¡'Ož´¶¶.Y²„Xóã?úøøhkk©!|%ÆW$0äSGYY™F£}I555á !TUU…ÃL„¶¶öo¿ý¶páB„PaaáÇ.‡™˜˜˜ÀÀ@‘9sænß¾}¨5žÛ·oß¾}!TZZŠ;#ËÉÉánç7oÞœ?~}}=B¨ººšh¨ôððpuuUPP¸ÿ~FFÆêÕ«yyyEDDB.\àååÅAwCCîÚ,&&†ÊÌÌ”––¦ÑhUUU¥¥¥¬9º¡ª¬¬$¾2]]ÝË—/[YY!„Š‹‹‰nÚšššW®\Y°`BˆN§WWWo×××?qℸ¸8îþÂ.!†;#O:?R^^nkk‹ÏÞû÷ï=IW­ZµuëVeeå;wîeÓáV nii122ºxñb~~>Πé<‰‰‰A\t¾qÇcx†Ô?¾ã+`è^¹råÑ£G!!!t:ýÒ¥K‹- £P(¹¹¹BBBâââjjjNNN¡uëÖmÙ²eÒ¤I­­­âââïß¿ohhPTTtvvŽŠŠºpá‰D’———••Ý¿¿——³rð~qFPJJêçŸÆõyöìÙ¶mÛ:;;I$Rwww@@À ?—Ú¶mnX FÙÛÛ‡††=z!pæÌ™ŒŒ „ÐöíÛ‹ŠŠð[æÎ›žžþîÝ;???Ü*«¥¥åääßÓÓ£¨¨ˆJOOÇ€khh¸¸¸=z´··W[[Û××—5‡6iii%%%øØ»»»UUU‰Þ‚«W¯¦R©EEE$IQQÑËË ¯_µjÕ¾}û H$’œœœŒŒÌ¡C‡ÜÝÝñ«æææyyyvvvl9lãÆ/^¼@ÿ?—ìêêºwï^*•ŠZ¿~ýÕ«W<ˆrww'¦˜¶²²JJJjnnVSS‹ˆˆØ°aBH__ßÝÝ=,,¬§§÷MJJÂãfΜéééI¥R{{{ p× ÀÝÜÜÜ„„„âããSSSuttrssñHç þQ>~Ï7®¼b lÆŒÂÂÂçÏŸÇ©+„ÐÅ‹gΜ9¼&(NKpG$@B¹¹¹±ì!&–177···777gåNoܸ±aÜ=eÙNétzqqññãÇY¶Ç‘¨¯¯/--ŧò¸PVVfgg‡oaw]÷ƒóí,¾bïÙ³g¨£¼œ}šøÝ3.à‘²h4šªª*Ñ€1çÛ'ÆÅÃÑÑQPP0555++K]]=99wCjÈ—––FÜ•àТ3šðø:!qqñââbÖ l0^Zt"""ÚÚÚÊËË9ÿÊEÀãë „$%%>|ÈöÙwƒóÀ–+ÆðZtF+Т†F£±» œ+44”ÝUŽÊÊJvWL p¾ÆécØ !0v ÐØ,55!ÌÊ„ÀÀf;Lg/ï Ðׂ@\ p-tþÇÆÆFï3x„žž^tttÿ훚šfÏžýÉfXMM……Eww7ëj¾DOOOò3xžg„¤¤$¨žðêÕ+…O6ê««544ºººXW{0À9çc] ³oß>–ík\]]BQQQññññññ[·níÿjXXØ'ðÊÈÈÄÇÇ{zz~^TssóÛ·o;::Æ´Âૼ½½BÉÉÉ'Nœ8qâÄŽ;ú¿J¥RW¬XѼ¼ü‰'BBB>/ª©©©©©©½½}L+ Æ8ǶD¬ tY¶¯aÀ3ÇN™2…B¡ØÚÚêëë 566Ξ=;,,lÍš5ý[nH$ž=õ“r–,Y‚gà355ÕÓÓÓîöõõ9rÄÆÆæ»ï¾[ºt)ž‹‹‹ÃÍBiiiÖÖÖßÿ}ff&~)!!aþüùzzzóçÏ·´´„ŸzC¥¡¡211QTTôóó[±bŬY³„……_¾|©  àíí½páÂþ¿ªI$Ò‚ LLL>)ÇØØ!ª¢¢"))‰§©ïëë‹×ÓÓ“““›={vÿ±ÅCCCñOöÄÄÄ™3g*))>|¿©®®.))©®®®¥¥ÕÙÙ9ÖSpŽMX¶D0ŽÎ¿ØØØàqqñôôt„ŒŒL\\\UUUbbâ`JˆŽŽ¾zõjBBBTT”   ž‹˜J¥æçç¯\¹RZZúÙ³g d2ÙÁÁ!´fÍ11±„„„¸¸¸Å‹KII¬^½úáÇ)))îîîjjj.\¸~ýzooï˜77ÓÓÓà ’’’x¤ yyù´´´;wîP(”Á”ššJ£Ñ"##“““…„„äååB»víÊÎÎ^¿~½ŒŒLMMMDD™LÞ´iBhË–-‘‘‘¡¡¡+W®”‘‘ÉÉÉÙ¸qã½{÷âââ455O:uõêUøN¹œc««+…BÁ×y„ÐÓ§OˆWÃÂÂf̘Ñ{œ¸wïÞç·" ƒŽ‘1tvìØññãG„Pyy¹??tt4‰DëýOBBÂëׯ£¢¢ˆŽL&Ï;W@@`%hjjâhÝÌÌŒ˜²$''çŸþéÿoŸŸ999„¿¿ÿÚµk‰ deeEEE;6cÆ CCà  üï†*33³¡¡!00˜6ˆL&[YYMš4i%èêêâåÖÖÖÄœÒiii---‘‘‘ÄfÙÙÙø&4uêÔÙ³g#„"##=<<ˆ äååÅÅÅ´´´LLL¢££…„„Fã›Á96I€÷ïß{zz¦¥¥•––â$À?þˆSý'®ÂI^ÞOï¹K–,©­­E™šš"„”””òòòúúúŽ;vúôé7oÞL›6ÍÞÞž˜¿=...-- !äçç—‘‘ññãG//¯Õ«W#„rrrÞ½{'%%ÅÃÃSPPÀ9s¥±7ó@‡ø/ Ú½{÷Xïn„¾ýö[aaaCCÃÁ_¡ƒÁ`Ì›7oݺuĚϯ>Ë–-ûä-‡þóÏ??~\\\\ZZzñâEŽ 9™‰‰‰¨¨¨‰‰ÉèFŠ cáÂ…^^^ÄaaáO¶Y³fÍ'o9þ|iiiUUÕ¥K—h4Ú7à;åpŽMX$öFºúbB5!!!---bý“'Oêëë?~Œ_•˜3g™L~úôéóçÏ?_CeffJKKÓh´ªª*SSS¦¤¤¤££ÓÐÐP\\,''‡x*++oß¾Mìú›o¾QTTD¹¸¸|üøqÓ¦MsçÎíéé¡Óé]]]ƒoX¡G!„h4š°°°¾¾>±þÁƒµµµUUUøU))© Éä‡ÖÔÔ|¾!$!!:|ø°ŒŒÌùóçïܹciiyîÜ9555CCúºº¼¼¼©S§âþU·nݪ¨¨ v­­­­¢¢‚²µµýðჟŸŸ••Uwww^^|§ãœc$ÆÖ:þ¡ª!„ÜÝ݉Ö`OOÏ—/_âåàà`ÜÜ\EEE/®Gihh¸¸¸=z´··W[[Û×××ÎÎNYYùܹs™™™ÚÚÚ¸¥!äçç÷êÕ+b×Ë–- GÉÊÊ~üø166!¤ªª W«¡ÂÝûÝÜÜBÛ·oÇëW­ZU__—ÝÜÜ&MšôǨ¨¨¬Zµêùó矯GÍœ9ÓÓÓ“J¥ööö„‡‡¯ZµJMM-##ãðáÃRRRúúú8§€Z·n]CC±ë5kÖà Ö”)S>|ø€«ñÍ7ß9r¾Óñα ’CÅ–H€„rssëߟŸ;˜››ÛÛÛ›››³»"cŽN§?~œÝ€ñÍØØxÏž=ªªª_Ý2++ wFÆIÜõK$&&FEE}žød=BèÑ£Gööö[·n%’&&&4ÍÁÁá‹I€k×®áBú'/^Œ“RRR¿ÿþ;N///gæzzzúûûãý¸‰D‚Ô04G І#ð¹ÂÂÂ!­Çüüüüüüú¯ñððèÿ<¡¨¨è‹%9rd€ò'8˜\ p-tÀµ ÐׂÎÈÜàúõëx,)ÃF<¸ :ãžžžÞŽ;Ø] ÷-Z$''ÇîZ€Qƶ@‡J¥^»v-++‹]à222a\D\†5‘Àð”””äädSSSƒñ÷ßΜ9sðo÷ööÆ£`<‘ÀðM›6=}úOCÚÝÝíïïO¥RG¯bàhã"ÔÕÛ·oEDDú¯‰‰‰Ás×)))ö____ÏÏϯ££C¬\´h‘¨¨è¯¿þ*))@§Ó/_¾,%%5*uÀXãØH`DNmm­OWWNÏÈÈ Ö§¥¥éêêâ£*((8~ü8žM>==ÝÀÀ¯/,,ÌÎÎÆÛ§¤¤¤¦¦JJJ"„-ZdffQÀù8?Ñ8:ªªªñññIII÷îÝKJJjnnÆëïÞ½kkk‹—mmm+++ñrUU•µµ5^¶±±QRRÂËS§Nýûï¿;::BÅÅÅÄ{ÀÉ8?ùùùW¯^]^^>ìÖ¬YsòäÉÎÎNaaa^^xèO86µ‘‘ïÞ½«¦¦†— ð2F#ú`kkkÿöÛox¹°°ðáÇÄÛ¿ýöÛ¿þúëÒ¥KË–-­*€e83Ñãåt:ÝÇÇ!ÔÝÝ­¦¦Fô*Z»vmLLÌ¥K—H$’’’R@@^ïììuá‰$///++»ÿ~///üª¥¥ennîòåËGvD`…q ŒèñòM›61{µÿêþ‚ƒƒ™½åÛo¿miiv}ÀJã"à I=Oœ8aooÏîZ€=Æ"àˆn¿!!!­­­%%%"""ÞÞÞì®Xjì"Žt( »«¶»H€ƒRW£ p-tÀµ Ðׂ@\ p-Žx¼|Œäççß¿ŸÝµ8ȳgÏØ]–âÚ@góæÍÕÕÕì®ÀY\]]544Ø] ÖáÚ@ÇÁÁÝU›Ap-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@`¼ùœ|&ËX· IEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_fixup.dia0000644€ÿÿÿÿ00010010000001314411727205031023236 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉÆ*N‹“¶‡DÏR%;§ò á¨µ(Í8óD[RBoˆzâ]p0BEY³îú`²‰rZa@ËA¬±¼ÊµôJZëð?•wÏg¡ªŸŠï«*]íœËƒ¶ž ¤1Z«4§®R¾Q¤ÒÃdΖº*[S^Ñ}y¤€ccMÝ÷›*Þî¬Û(Žû£X^ÌgË¢¦Dº"¥ùlUEÞ?ü<:ŸL¯¨`är1¡²ˆâÛÑáruEu¿ÿòÊŸ¾y?ŸŽo—l<ýÃÜC†Çj€žNâ®$>IÛÛ„ƒÚzL)»M'g³ó¢úË,f—çO»{•…4ýÀÈï“YQ#ÓŽ”Æ/Núâ”ÖžF„XˆÅ-÷áh€(;Ù6Iüt>›³q⨟Z€l{ø‹Âsz±ùyªªÚžd ÌÆÇ£ÅbþmóÂ7² ¯|<-fgïýæîÎßv¸!ù¨µÑ’" Ê jÌòÞNsý“Ã/¨cͨR«9%ò٣Ûo Öü²Zÿ2šàw~Y߯²ÛøH=á@ç|'2ÀÑLí&ôÍp `ÀÛ†è(ƒS ÐtuÜ0PÇf¥¯bH0 ðfxU0°©Éæ)0`ÌÝ_–ۂΉV…^Çk¡7Œ0€”Ðbô ¢2C¥Ž ¢f†Z6+–¢á`¨zWS•^†Wf „Zk€W“»'i¡Üzßqûja'ÃÞ«¤ÉhÙÁ m“ÂØ ¸5¹–ÍŠ¥ø¹di׫ cÖäץɦƒ]oâÝ_†¾a .LØ9 õ5e𢀯á¶=QÛf,ðÃ/ê௳‹ËÕÁ¯“é oûë Jë›]ðD ï e²ž4tÏcƒwÙ…[Ã…÷Iþ(þ÷²X®þ~¹Ê8²ÙÌ $œ@ð´šJ4º k(ÑVÄÔÄÇîÏåÁoÅhŒ÷ýà¿ÞÏÇW»Ç’M(y‘(rO,3ްâH÷æ`JøH!9#bäMS¢ÆY%%c†Š‚€¾4QZçíÂHɾήХVX3ʰ¢LçdHM ëkíq©i]kßËÉÌ“Ž®Oün’~ ä?NQ9Œ4x“ÿ”µ‘êab´Ce…õ.Õá(é,î_5›Kñƒsi©uz’Ø“pØ„CYª]ä„RÊ£h˜@y¡Ö{"Œ¢áùE£ŠÉʤÐ$´t¿Ãõ*ˆÊ›n…Ò¼•H 5è¦G=,‹êJÙÀŸ*XÍf}ù-®Tû¶y)¹£ÝË÷aHí©¥ Ìv”Ò !\)†ÎÐk¥­Ù‚UÅf½â½³¡Ìޤ0ô!… Í\Ü ¤²šÙœwJS×h£_£¡N”u[ÃJ>ëåVî›ÆÉaìC5šÔJ‰¤g–Ã`]¢$CXÃ!PçR©Ûޱx’VòùP£Ó¸wxhw#‡Zö!‡ŽpBn‘ô ºxƒ‡r[xXÉg½Ê=Äð#9ì~H„»öä¥cõR9 :Å6 I¡²ÔÙ EØë™ê¸¬®g’ÊŒÜcVC¬‘¨».Ý4ÃëÁj«ÌÀÒ°´r«üÉ»çPËfmâ½Û&3<Õœ.êΧä:zcT]ä$g|횑ҷ!‡o eמò6ûôéãáïÅ×bú¢Ø[7ÔJâK8H”Ïö Q›,œtÀ¦EÔ¼‰)¯P@«Œ:|äß›ÈoáTsùÐä§èZO~ÚÝ^¦wdjw>)ÂÛžæXR-o>R2 u@#[ q‹Ö¤z~o½b–ÅZF+23p“•1-UÖ©\l¸‘*cãÝG`/6lI±]4Ûí¦€î>iů»ôt)’m¾qˆÖ!õáóN :e–UÃNqwªå²b)uœ—;"äªá}­®?h€ê¼ÓîG«Ž¹äÏs]òç©úÏíEÒë:\³½?—kszrJL‹åÕrUœ#vЋ*ìè| î…– íë’÷ Ò °×”´ôÈ^*HMÀQ±î…É&M„•ð´7ÁCf!:ÎyàhâHã‚õAÓáVÛÃÜ)Z§ïãjJTb¤É—¶ÞÔï§ø<™N{z>‹.ÅÝ«´{ÔÛŒòž‰SŒ|Òý›N.Ž¿Ì“ÿà–6š>ÈÜçÑtYt ƒˆ¶šœö@¤'[¬sbGŠ×s?j¦£°ûcŠ•…ÙÛš%¶)ˆÙãÓ9GòÂÆõÇKÿÚ—V %näN ;@™ñ£'üø0YžÎ<>~8üÛhV¨P¿5“6à…ídðDJCòzR}¥6KÖAMý°ÙÄ•ÓTäèLtÆãC0œóÓ ÞQdËj¯r±õìÄWêÊ}NìʽWîqDíÞQ„#˜1¼°¬£”ÝS,gey>î@siGî2‚fÍúB‚a5é ¦sÚ¬VÆõÁ}ë´šF@jѱ¥”蔞 ãš’:\H Ü™Fµ|>p‘r~ÂëÊOpºšëÀÑÕüÃÕI¦âΑ`úŨ8[ŒVè·W ‚éaŒp9¦€b®{ `QRHi˜N&'UÙNg€M¦ wg²Ùqcð!zí´–ÖëÐ:/¯ÙÌÒ~ˆ½R ë4Ð3[X¯ÈG}´Úú¬‚„ð¢aî³ ¦2èg•}VU ZA³frôÂd†Ö ­Z_´vŸ³w]‚j[%Þ, (ÀzH™j ) -׃”$§Œu¬Á>˜ÌК¡5Cë ‰ þ÷©/+Cƒ¾‡~•6Õ1[ y;VZ“(‹”† …µ*RŽhÚ!6´Vû`² ¤:e´tÎÑJ+}ä„TO£à¸ ¼ ±m,e2Ûw¼™"rŠÏôܺÍнÓÜu%Z EÞ®ô!¸ëHWjô‘®#]‘5ÒÕ“ÙfÈ6C¶öÙfhRªdº÷L¼ž ¤3¬gݰ’m¦Tõ˜š^#¢jÅ[ªÔ “¹T)—*eD}ÙÙ¶sÅA¤°:¥"4‚Óz¿¦Ü ­Õbø)7Cî‘óu\>p¶€+µö97ãUåfèÐ¥w„ÝMÛ½ñª-ç&t¡Ò,ƒ”LHWuA8©ÒTcù§ÊÔñYÙÃìÇÒÖ3Xp ™ùƒ&ë݇æÛÓ[fÙ.W£Åê1HÓ¯½=P»M´wXë + ¬pÔÜ/µ”WÌX,õ¤°&a…Š(+ç?VTóYÝïÐê­Fª *^Tè> b½‡rO¢€‰Ž4W j0ÃÒœHããð墒ÍÊv§†¢ò4WÚš;*2T<3¨0}@lË/ËQ8ŠF2Ia•M­·€ÐÌ!¬ªœ…cM†Š /*ì~AEt1Moóª´*ÀšÒªÐæYA…޲+'³Y‘±â…`…ë3°É¬ˆÆ¥Iž^'³BÙ¨VĸŸfxÔQPÎAm›”"Å3 ßPÀÖB©wQ@E jH'!ÊQ¶¶Ð,TA³´…*(¸©²M‘¡âe@Eس˜Fª#A…Y†*ØÛY<åü# ¥¢Ïi¢ÏH‘‘b·HÑi çh°Ñ—bŸ¸ÄqÁè<Ö…äêèà,AÛlÕV¸ôxXDIGŸ æƒÙ L/Äq“>•R—E¾†uøŸr"•"¦Á8;$Âѧ*%ˆÀžÂQÃfõJ㓢ߛ‰ï×i‹ :´”ÚÜñ\ß;^}©ë#s1DKsN•U x7½àÓDURæ¢BŠC‡ÿÀ[AÚ“MÊA¨Ÿ H­$P‚DÍZ_×2¦p2_Œ‹ÃîÙÏ} sôiV/b’ç…gE”´Ðø?OðKÊ®=åmŽø×h²ÊÆÚþ×Ê`žÐ x|œO¯êÌ»îyw²è¤Í†×Ô"€Ò'¬Ñ¡2H2*ô¸¤iMùïÍñãÆ]“•Keó¥·?dÈ·=Gu:ncó‹ìu:O¥Ø£ÆtO?‹Â+mðk7^V32¢€A$J€”Rú™eɲ*L•K]ó¥1:ŸßúкÍiV™m«Œí¡wOTèœDë ï&£(»±9@Úd´W)ÓB·%ÜPeêx¬^lLKã]ƒ©b©÷:ÐR)ÛA²Êl]e:g#Qþ Fì'#,Þ]ÆQä;™3&e#%-‰u âÔ™Z&«Ó›/Åí21àƒtYgž‘ÎÔBúHÊA±pªÞͪ/è!xpè·è€”(©HÀµ. Úf ä·OŸ>\Jüpu:-rX„#,R'‘9,Ò ”¼Ÿ¯B’Î9;Ž’^c¤¶Ú€fÌ,c\SR^§¶è©Ï îÀγNóê…É&ÇíVÀGcAJçôë:'èÖÊr|JÏgÑÆ©åŒ=(§²d¬â¦kXÍbRN¹¦Dµ¤œ†¬Ê ¼‹žY9»3™•3+çÓŒpß=W„,cŠjà$k²ÈJÒ0 ˆô„mOy›Føá‡›,‹ß‹¯Å4Ûà6x@¾\îÞ¯CÕÃØ7°#81¤¤¡…µCH+<Ôø8_®þ(Fãµ÷¾{Ì› ñæý|:~ÈQ!€3X1zÀ ãÑBw‚5¹ïšŒÖÑH‰fÛ“àmÂǧÅh¶Ì Á ˜qƒ7t¸áÐû¥€¾2šÙâH”¼p)¥6ñ%åØžò6äo£‹O󬿋ÑY‘q„Gª%2C +”ô1­ÚZêØŽF å] Á‰˜·è¹‹£Å²XdôàDûB˜‘ƒ9lF~iÀñp©I …<ŒÐ‰à„=~9=-–Ùqá586¥/#+b¸žl Ãí *:; ÅÄ(µvb¿\®¾³ŒÜf†É±Ží†ïÃÌ lxnÿÄQö-ù'ZPÎ„Û ÿ„ ã?1X­ŒMáË€Á ¡Àð”ó–0Ü?Ötã^Èïó³ œàQ)…=8[†>šéEBªä6е³ÕŒ;H””ŒÔ R*kèœ_jþ^§Õ|V.uÔFE:F™';0´E~&6ÚK`ï4ñTŠ=¡D÷ŽyhïIW%àE /•¯l#«U tæ¦ÑúàF‰:>+Q"øÔ›EÈC2Hì $ºŒs@SíNsk¹¥qÁôINÚ4|2€g6\œOvŠ&!’Ó!u2g€‘ªÙ¬\JóeRß4òðº Iû IzGd{€$¯}™,ÆÛ—) Ó4Âûà’¼W©å#€õüTÉf5"YS¶¢”2"eDÚKD2;B$×"ʦ«†ÝFò¾ì›b;Áj•ºùD¿©’Ëj@’!I­L¤ H{ HvG€ä{$ë|J|3Î3’¬ ‰V ‘œÔtºiTÛDà§R5—Õa$[~0³‰”iOÉí‘BN›ñI­·¼€¤m, å“Ó¤£ót«|Ü‚ÓVÅf%"YKø(”qÙFʈ´Ÿˆäw„H±D’Þ–|Á8^H’F§ŽÈÎh“f6J¥Rþ¨ÙFh»šÏêqk4â„–2&eLÚKLR»Á¤ØËDä`ÓÀ颿¹i%b!%#5šÐé R/ê-ŒD®ä³b©Qú”&$mÎȘ´§˜]1©|=]‹ŸÊøçl1:ÿùàÿB…¶Ÿummod_perl-2.0.9/docs/user/handlers/http_cycle_fixup.gif0000644€ÿÿÿÿ00010010000013341111727205032023247 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££„ßEŸŸŸ›››™™™Dq8———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôòòò\š0???ððð===îîîììì999êêêèèè555æææäää111âââàààÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼{Ï@ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨X“.¤¤¤¢¢¢    žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||4zzz.Mxxxvvv#tttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVV  TTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóój²7>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠSP©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœQÙšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=² !ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî‡iíA& d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("5|PX^gÂD°ÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜L Óãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb*L¦þ¡¸ðË©´Öjë­™¦š£}ºÅ °´à‚)®àÉŠ’ˆ‰Š W´€†˜.à*í´ÔVK§®Ã­ŠÙ§}D;¤Gà KãŽé­µè¦«îºRbû¯Š}ê‚E@$$°¸C$D¢€L+.ô2H¿ÿ<ð_”ò ³´:d#.´ò‚+¯ ©Â.dÜ‘¢ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¦€ -kó*3ìð粫óÎ<[ë®gð&öé I6ò‘P@¤ùlA-E2í4ÔC’B‘!,D¢Q‘(™óÃG™ôÒM?}ò‘Vc}ð*m ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§0$ö1yn΋)MÆ¿Â5âF‚¶’zž8Ί¯=ä³[<¹äCîsÊ'èá8ä.޹߰Ç.û¡?w4bò®¤æ¯oÁxï³"9‹’‡ç}$ïœ'ß$Ê- ¼ðf˜3<‘Ï#©÷ìØg¯=›µsvûaŸÎC :róÐÎŽpB¤&J+ÿ»ò¤T‚¤%–©%DÖÐE’z§¿~û¾ë“Pæ­ø% !Є!Šd@þmïŒà–º·™ïÆWzÈ— Xñ"EB.€…ȶ  l\` À*†T¦p…[fÑŠT€@DâÄ \ ŠƒHþ E T0Šx i.ÀFÆNçAŠH-D¡ ™´,Œe,x2¤¡ qH$ø r3¬á ˜Ä%JðŒhL#’(ˆ ÆWjŒ£çHÇEñ H7«£÷ÈG ²ñ2n$ ûHÈBrg´L 3ÈC:ò‘÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡èÖ9ªvFæ~‰'¥æÑŽzô£ ©HGJÒ’šô¤ è0—­>m+¡â(JgJÓšÚô¦8Í©NEªRv²ô]‚³ŒF'%Óõ¨HMªR—ÊT€ö´¢?ZP+3TIµ©XͪV·ÊÕ®ô©¢²(d0Ú—ªFêª^M«Z×ÊÖ¶ò”¢aªí¦J³* ­nõ'%NQƒ¼úõ¯€Õ*XC%ÖÇ•/vM^‡Ñkˆ`°FêyƒSœÂ–åe-‹ÙShv"Àì PQŠeø3—5E4>zŠÀºöµ°µþé`AUXÇv/‰EÔb‡±{ö¶ž©¨ço\Þ ×·öD ú[ÖÆö¹ÐnDgû·;z ¦ Úms›«‰ããõì®q¿‹\{²‚¹ùD‚R‚ ž"ÐÆdA{…ùª—½îÅgk¥Ëßþúשp%¬\½G×ÉäöP»åe=›ÏæâÓÁÞ†^|f" öœÄ=êY*Ô3&°ç…3¼a{î÷¿(N±©ëªW°À’9°¡´[Þ{B¸ÆöTð Pà‡€6wµÃ`Æ‚O‘ŠGÔó Ÿ¨'Â`O!/¸È÷<±Š§LeײøRµmÌmñ"ãBÑ8Â8¶qƒ Ú\SÔ3üdþ–Ñ‚{¢™ŸR®²œç¬Ö+[*ËŠÙò]ºL¨/WÌú¼ñÿÙÜýr`û¤Ã$¡‡{ÎtŽ´¤·jçJá91z¶ ŸµØ8²Ö8Á깆˞â±ö,5fQ ZÌšâEmgùZÏ"\€'E$ÔqÏZÜŸ¶Æµ®y= œB–Mò¤—ÍlVšR—FL¦ë²iAí¶ÙØÎ¶¶úìIEû0Ó¦KµuímK:qhÀ#2 DâðFÌMo{v[Rß6L¸ç2n@•»Þ*&Gj†;0ç%8Q‚¡ô0Æ'î1ï´.#ϸÆ7ÎñŽ{üã ¹ÈþGNò’›œãRÈç½#•oîÀ82ýÎÓ¿Þ_(@åXžÁ`ÐáÈ8ƒ)ˆÍÕ/ØãHOºÒ—Îô¦;ýéPºÔ§Nõª[]éìx/>WÎI·ñåÂn¦fNsèBAn˜p1–hh¢»xGÑÃ!…ºÛýîxÏ»Þ÷Î÷¾ûýà÷_hýž\OTË ³o¹ÄOd/ûk‹Ðˆ4¤ hÑAÄXgõ t'¼èGOúÒ›Þô†Wy€iëu@‚]MbÇTä%X*(V`KJ‘<|>ô§¾ð‡O|À§~뫯.§\:¸Ø_jö´Ï+9¾ñ¶»%ðPVAþ_üî{ÿû¨?¼½“ßbë²ÊTÐ>[ÇÈÅ áÐ>S¹þúÛÿþx?>âÉåÖ+òõâ|ÉDOê]Ñp@Ïp0À‡çã·Ræ÷RèG€[´P vñn KEX‚&(zXO‰‡(‹7w'é·\µßÀ iQ^!ª0‚x‚@„z—‚ð‚´ã”€½"€ò¤4XÈ`U!¯S¯0 ^ÑX! VQì0jIE‚BX†eH„Fh(-(/1h'3ø„Xµg`UzPz€fWa – Tdh†¦7 yþm@ˆ‚‡†üwgHèIJ/L¸QN(‡y ª`Yð¶@ #` ‰°T£@* T $@ Wá Ò@°(SJ ˆ?(á0sÀfPz}à_pw\0ö ‰|÷pˆ8ŒQŒÇh†¿ŒvLj¸|x”–X+ Vœ` ©à‡šPWA™X$€~hà ¶˜wŽÐ .àÈPz€ˆwG<°Ð îP×mÀþIˆYxâ§‚hiXL‘(4“HT•˜lup¥ ‹ð_`T¡ `£ 7`éxëhup Ðþ‰À†0`àzt0ñ°ë=äÐÞ° Ùp P k– FpPƒXw ™R@ 0y0Špw ‡(/PwÜ@{@ u·0R@ °ugÐpì@ ï`w@ îЕ‚`wT ã U@ úÈ–n —r)ti—xiw×°•y Dã`ˆm)ʨy—yiwa9–e)g9i)ÔèSØ|؈‘y%i¥@ ÓÀ•` Tá í@-9+i½IwPy€öðÀgbá X  S@ ÐÐÌ é w þ { Rà @ +puÇ + l@ u 9®€§0kÙ–ë` î° R{ë `u' ô +€ ðÀŸRàá9ž‘ˆˆ™ŸûÙŸÿ Zw+G° Ú %Œ™‰ñÙþ  ²  *詞ìéžRŸòIŸö™šPµšBU‘Vu‘®éUzàp% S¸9+`}[ *‰.`}TQnàp¯à 0 2àk7Ð > Â@ È Î Ò` UÀ XÀã épìp`øpˆ‘Ú91pB ï°©PwÙ@ þg R dP}`w ywl)òpfé(p©5š`wv§0 °RÐ{uG¿p˜1©•z©(©›ºüàugJ™ùè–R@Ü`©˜ª©u‡¨ŠÊ¨ŽªÓØEøÐ‘î4‘¸££gÅ£=ºU€{à BúSQ D:ê  CÂ0Å` Ÿ@Ћ™Pû° #à ‘¶pÈ ìQàyeɰ L Pp Ù° ÞÐ_è€íÐoP y wÀÁÈ€v €u§ô úÅúŒ÷ùÖ +ú`,Pþw`§* ù`w ª&‹²u·²Ѳ ý±¸š™»Šˆ` kàOkþÐWý—gp 'Û³½Ý©‹|Q8S+¹­Û'%pƒÐPF°ƒÀ“Àƒp¿ëPB>Ýé€üÝßþýßà>à^à~àžà îßMØÊêmÌzQÎ >híejMÞU̲pTèÐ ÿð `RÛpu(žâ*¾â,ÞâHGD ÂFÍšHá(ÅÛðG%=öOŒi ã6NSŠM(Œ ŽíM'’=äe#žÞGõÞP÷ý N>SE>(GþIÞK>'Mžåe˜7ÐVÛ`{°Ñd^R[.(]î_Îa.'cÞæÿ´¸wPåþG%bP;—ç õæç}1çkQçqr焾OÇ ¶ô|Tˆ0 U b; R†(ˆÎŠ®Œ'޾éøtàÉTƒPEàØmêÕéyòé¥1áTá}vá´â¿üÚ%«ðëÓõàøác¥ëoÄëœæëÆÎO'ÀÊKe«NPÞpúÐ×ÑÞP¶Ž'¸Ž¡ž£þ&¥Në]P{°JeöÕ¥pæÝžRÈÎrÊnXÌ.HÎnmÐ^ï÷€åJ5 ÿ^OTÂ%æQ× ÿðñ?ñ_ññŸñ¿ñ/ñfã•<ãT[ãOþPêú€a¯‰ RaÀžó2?ó4_ó6ó8Ÿó:¿ó<ßó>ÿó3Ï þÝ-µÍ¤rî›È)ÀTñÀÒåòðQa Ü}õ~WÛËzÛ°7Þ%ïOjÀuàaKÕP™M@õVõnŸwZá\€^ÿõüd˜'ÐT wÅ¿<õUõo?øÝ½DTá}Éuo÷ù„b/‚ЕÒÂàQ‚Oøƒ÷É>÷K¸øŒO/=ÈTNÐ  #^ßö–ïö˜ïš/‰œßùÃÚîôK•µ¸P¢Ô Q•¿úXßú]÷úûo ŽUí EuþÀ5ìûªüÜ-üŠ—ï¶µïŒÔïävðÆ TÝýµ PìÒOýÁ?ô««Í­Kò²ŸO“@íXõd¿PæpÆÕpþè_ýê_ÔìбEà@‚ D˜PáB„f ƒQâDŠ-^ĘQãFŽ=~)Ñ€BžD9 ‹¹”{ÈÔ’b-RlÞ¼¹ÀNžÚàTèP¢EEšTéÐ_(^ ÀPêTªU ãcKëV®]½~VìØ±;Q‘E›VíZa¬¾…W C™uíÞÅ›×£ ߊéÜÂÈÝ>ÀÃK“¨NX<ÀpüsédÊ•-_.ÚôiT¹=#þĺVôhÒ_Í–FúkÛÏ­]o¡ XölÚµ/ pÁönE°”¸æPóø<þNÊ”œÝA†N bîòLdÓ €_òô9ë‡Sƒ–<ļÀœ^=eÍ¡¾†7´júõ¹ž¶ŸŸ­Ûøý«Ææ-@äÈ艆Àâ / "¤"Š1â$’I"‰eÔø†¨>Øç¸6p) ql9`ç)D¡Gˆ°g)Z@Ÿ[X8§Œllâ%V… bÖC2I¢Ú“è=ÿž\h>ý¦ ?*¯\?(·<@¿3À`%L<!¯hàwØ€Ç yà þg{ꨟ;ôɃŸ=zt§tŽ( ‘ì&;B8eÖâ8l¢À'›€™S&(¤%?•Ɉœä²T¤Ä2Õ°¬T5UÖL…ÕK3g¥µ.$Üñ©V°C¯Ø=øÉCŸ;ðÁÓ{5ªPœtŠ( Êãé'g‹»IzvÒP¿ERTˆH…uKT[EW+VÓòÕr¹”UWyçÕèš w@;pGŠ'¢qâ&šYb™ “Aâ#Š)#ÅšµôYæêŒ(òÙ&K¯Ø¦{&ÉæžCxÈ# pO¾LÜaÈ}׿sÙUu]˜ís·å'ãÍ7眅`'þ*"•†óúƒÍàêzx(rFÈW0¸)Ç^@“¥('UvÙ¶•E`!óž-h ›B€Z ‡ oP†{2•Y¶¾—g¾Rf¼U«¹îøpþ9ðYÁá§Žg‡(‹s£bLìJZ(Aîà©C›Âéélúã ~æ¨b§*HÚ#;æè‹Òtô@!ôˆ;ö¤ææÌïøîÞ[?½s/­oÛ]qáôX†¿ÆÙ¦¹#mNvé§OÙ)÷jÿÝ5Üy¯owîEó={Ï‚¾üڊЀÍÏ«U†™€J §¾~ûg·¾IìÅ÷lûïSóÞÿÒ>þÅ…|ìC ^þòa˜¿mÐË"f1 Àô»_5ˆÚ°5þ i±ЃV9`UØ’`åBô’q  i€d¹ özT#/CF7®€)X1%<ôaãD%ÂeˆGD‹ÑØ•$–q!Ltb5R Ê1%oˆÐ0Šq†l¡%`c ¿EF7VåŒk‹©•6²!±c$Ap |耄^0p‚ˆ˜`'ëC 9ÊpåoTûs$C¹HÓà,¬$K#SY8JÒ–Çp¾P¾DÈ0 ‚Èvþ‚‚?F”Ç,åffI•UÂò>®tf µ´L†ÔÒ–‘¬ 4Ì'Ž^á% Œ,†D”ÈD§ÜL9.TRó ÍŒ¦-¹HYºÓš×”#%5€Oâ ÁNèðEc¦Ó êT¦;£”•xªežˆ¬'5ïÉÏÞ à0ß ¨—Gd`"fØ '%b’Ž„ ©@iJUºR–¶Ô¥/…iLe:SšÖÔ¦* Ç:WÖN…žÑ|è#ºÌ‰R4…ÁÂF‡w {$a7é+DÐñ ,ŒÃ#ÓÀ@VµºU®vÕ«_kXÅ:V²–Õ¬gíê.¯×S…üÔ™AEãPgYT£²O°‡Ê‡þ„äeÓ¨BJ ž£®¥[âVXÂõˆrM%]+¼"¤c'“˜ìEq¼‰X=©ƒ2à‚Ì^3±ŠÝcYéX"BÖ‘’-íÏ0µÒO ÈKp (0BÔ’‡+øÀ‹âq"¶’<­bU»H֒е…„íqé•(bÎåsd“°u  z°J"BºvL.[—‹Èæ†ð¹nŒîykkdj€8÷+ॠèˆ'vâxE ¸‡|ã˜Þž®wíà{Ë_‡ḛ́à1lQÔð¼0D4~4À+|ÌF…›È`…:þŸ„•HaþhDš¡•—è4g×xA^ ‘`‰Lb{XW€€9”³Ææc±;]|DOÆA¤ñ“yƒ„¦¡[E%…·dìÆGžÀVºlh9Q¦æ”‰Xeî]ù„Yv3mŒà¨3tƒ+†@ „Ç„5à%ù°ˆ#ø h¥09È3ûà¼L9“μ³³ñi½áWl GWÆPG馉À¢)a‹J“ÓÛô,+ÂKç.ÓÜô«ïbŠ|À+?à>€8¼/ FPžLx³ºF\¬S9kÖzo·æ_®¡Ý’|xã8…Æ«n@ˆûFtÖþåÒÇQ-ä=oz×ÛÞ÷Æw¾õ½o~÷Ûßÿx½,mGRûÖÆ¶Å§ím§$ X‡wZbd3â²1» ‚µ¦’qpâ'GyÊU¾r–·Üå/‡yÌe>sš×å{ÐïNQûN†64Ðô¹Wž=†7¼%E˜@ pŠãΠј’q$ê WG ?rNðBü{ŸÙÐWt£§m0E#r`Ô@p^ÔàE0Ï#¹Õ±¾÷¡h}­;¿JσžH ~+b·ÙË~’#ìÄØÃX‚XqÁ}@`r ¨®w¾wþ&~×àoø²þžôˆ÷›âÿ‘eàep²“ó•„kÜeðH%À‚Í{Þ÷8ý)EïSÁ“Þ+`‡êë¦úÕw¤;á}…‘ÊÄÚèýï|v±Å7þ3_i|åÛŒùÍ߈€ðîŸÁNµË4àÏ$ÐctïHÕµ¿ý­óT¹à?u1=Ã+¿–9?ôËb|Xöñ10ÜÀ½Ð¿ýó<îÓ9ïK- @äc—|—D@‹0‚:àŽꆻP£ñˆO€£@γÀƒÂ@®s#¯ãL,AŠh‡Ð.ö‘½”¸4‰ÂP‚¼+ ’8)¸†q€tx›¥Ðþ‰@‘Aœèƒ&à“*‡k°‰>p‡/оô?õâÀðÓAtáÁX¤THØ ²«D¸‹Ã‰h(œù㈠Š_Ù:‚BØ C+4Ç€ŒˆQ6Hø…¨Bgñ=3ÔÀ ÀV¿Ó›¦áóA8Œž1êK‰Ú; æ(ðC¡8h)¨ø ê°ì°‰Ðc¨w(0,I) ‡ëP„›´°‰Y˜ƒ)7žØR°‰b<Æ)HF›`ŽžyŽè˜Žê¸Žì°‰FÐ}8dø6›0h¸v åÀ KÔ@ä5l•64•OÅaˆ"/(…þBŒº¸…Ý V€gË¿,´‰ã`8h|K¡™€]€<˜Ü)øñ 1WH›ˆ‚ܰ‰5Ègx„wð4°‰HhW@S`F) Ib0I”<‘Y‘y‘™‘‘‚JÁ‚-’؃( x¹ yô>zÌ{T|,}„Ãû²‡€4޳ vP*ˆ˜ Žx*(…Œ`€=˜|˜„ˆY”Fy”…€Ž”‚]€‡ÑËDy‡=H›Èb8Àt„(⢛|K«Ì”‚ÃLL›8½»KG,˜‘²ù np ÍYÔ„xì¿þK´Ê½ÁJWéDÑãÊ(3Šf •u€p˜MS`Y¨_@ià†r`œ8·Z(”ié É8Ž{°‰¤ƒÉÀ¼ <¸ H˜Ì+Ȇà„qHÀ¤D)àNï´ ðÌNh‘j¡E)Ї¸ °oã @Í¿«Ê44¾ÖÄ­„—7ÜGÞð)öÎ’‰uàÃ0Ô `‘‡3æô ?€(‹Á¡NÈ›x…:ðÌǼ‰{°‰kØy°!˜À¤sÓËxÀ …Q(œQÏĜь±,À†n°‰øù -À‚*\ªþ¾ÕĽݒØÁ\€CP¡œC %0Åh¸à€ D„>ȇw0‡,€‚ùkÅ pÑB„¥lšÀ­áðš·ÔXhÿ”‚¥™I¨±‰YUˆÈO°‰-Ò {ЂC,Œ#P…`ÿdTGH•©ª±›Èš­éšE0JVÀ0K©”qp 6ð–©LÍyPÒ³R*ÁR(ÑRä0uC ²l‰bˆ‚dH‰1ÑVtKÌ)PÀÔéœÏÑÅ*xKp7X+°‰É©œ›°‚ð|À ¸‰\ˆ‚)¸8è« 3ÐnH˜×r=×›€ÖþÐÎñÐ)˜€+Їqx ÉXjÀ{ÀYˆ\Ð)ÝUÃëÕvyMÀ Öæ“‚6)BÄцs›•w¨KÕˆ:Uõü=1‡o‘RÑ£Ò™©XýøÕ›!Ù¥ H›*†9˜Ð“(ÀB‰Zø€ÝtV%‘Œt}ð½60p8`piYÀ{Y˜‰Ùü˜YÿÈØÕ¬•/.0ƒ”&Ø–'HH%ù†àJð½ (9Ø3Ú\ ÐL<¾¼¬í­]<²y€z‚a“‰e¨…º80>8Û仩ݹªe—«¥™‹Ý9¾-»ß Cö±„œ€‚ah!„,Y·T\Rb\þÔrÜtÜúÐÛ¿©Y›Œf6eE NP„ºˆcýˆu‡¿Hº ëCÑ]A*Ýÿ³Û®H]úX]ø Ü†³>j¨0$`)@ &XÕ¦ß ^¬^4,^ñ Àä}åÝ6FEèk¸¼°†€ˆ8…S°†÷}œap_ø•_ˆø=T(…üˆy¨‹gð»`‚=¨0µ“ÍÞcÚÞ›ØÁ;^¾‘\Ô_hC‰ˆ †ˆT€æ`öÜÞàˆ@ø*HƒY1€Ë‹’ì]`ƒjà{à ‹àÔ_ài]×Í Üøƒ .aˆhÖ† b>â!†ˆ2ñþ4¸ºPÜõXˆ‰hÌžaá¥[‰íÞ­ÈaÔØáÖ¨`]³,?úxßS˜_‰à`Šˆc&–FP(€Ù•>ðîbdªa)»aŸãÞ™`Å:cN{‚ÖéXŒˆã9Vb9¦6>ð0ƒ©k‰f(„Pr²DèÃ^¸SFåTVåU^eœ‹X—-ä†:dÒ(ãÏXäH[ |âIfâ‰d#> (3‘†~˜aº @€D`æfvæg†æh–æi¦æj¶ækÆælÖæg¸3tà0ÀM$ÀDf«[Î3ò}…ˆdJ®ˆ_þeh. f0Û˜hþp²f0`±ôaÚ°Á2:]t™åѨåñéá~® OЉôõ=5^ûuaˆ˜èø­èü=SÀC«Ê qR+„žV¢€n•rî)sv³,N )ð°”@‚Ç #(bŠÀa&é’öfgyÂÛ +èÎpi-û eŸ …0¡‹HƒìiŸVÍXŽ'•ÞK„ƒžê0>\ö„LJ‰d`=þß ®9|ç®– “"”Ž™¡ö¹¢–‹£®±0 Zù²ƒëÒ Í#Œx† ìÂ6ìÃFìÄVìÅfìÆvìdžìÈ–lÄîæªj¬V »6 ®vkøQ¡þèYè¯Xĵˆ/ø68¸…×†íØ–íÙ¦íÚ¶íÛÆíÜÖíÝæíÞŽmW=]½lºn(͆ ¼V19|*zàd”p”°†}¸ˆc¸~m‰8§@£AŽ3«*âŽ'ã~ ä®° ¦„І[h )€Öˆ"°CŒø s˜‚ân/~eªï·ïh"oâìÎæˆ¦ùÚ·“ˆDž¾ˆíÎï ònJëïÆúog ðÿp׈й\󉇑$(ÿ½ˆ"ëÇïïî/†åáç¼ei…2où*Ô‰nZ…Gh ½ ‰~ì‹Ð¯­gñû™pY«þðÕºpXÊpª¨ñó¢`r„xH 3à”hPàl#?òúIòi[ræjrVzò%Úp¿ë»^éÒR°ç있y€8·1óé)ó‚;söJszšq{js7¯B¬Y†÷M…R°óA‰x†S p⌘ò*¿ï>¤?ïº@°A‡¨B—¨CGô‰À­ˆSˆ5YùåzÐå“0öË XÅŒ(¶ër÷t1õõ#u¡2u¢BõTTjŠpõf‡$ð€H0¥DXx æaÇÙ†PpªökÏ:@@€ÐQˆß÷=ðaþXÝ@‰XÂÚ¨ïN§žI(àåîaèb§²c«dŸ«egöa¸àhuˆ0‚IhˆÈ„,ˆˆI 2C €ˆ°€Zãh†Š¿x"“…€,Ðmë”°ƒ!üˆ@ÅÀ v¢H„òÀ‚D`ËÁŒ{¸F\Š}Û tqþ†ñïEøÈRxf/Ó8¨ˆ8…UÐ’MiãTàñaÈtˆ(ÜIy«wô¬ç`…Oøƒrúå(mIvHAŽxX~Š €W€wx ³9YŸW Gx p7@†J,úÆ%ø93øÇJú×ZúT/ƒ»{øa ðß\°ˆ˜ˆ7üøþˆÀü‹(†mx€?îeˆà†°= )8€€‚î$žyâè)ÒulÇw¼ [ Ç› ‚P}¨ДÜwGx\ŽæèFé`Q1ÞÇEmT~è`þñ(óPGv<þ›ØFç þÿ îºg̠Ƈ®Çws$ °”G:˜{Š8„¬H <ˆÐüaØö†ùˆa10‰*‚°Š&êXÈ2¸5ñ"FŒ¤SÂÌYhÒ¨E™‚MK)*W²\à <Ì“aO”²à§R=!+°ÁÛ¦Òb+¢ÐæfÎ=UBš¹g¬q‡T>pþ*%ÔqR€ %jTJUW³nå@‰N6ÄlâÔÉÓ'Z«Xµ²ìë÷/?†¯Øbø0âÄŠ3nìøqca|lQ®lù2æÌš7sîܹ)*Ï¢G“.-,äÔªW³V~ügþ®t™¿&7îÄ„B h²’!œ2 kHÑÆ)¨DÅ/N8`ªä4môÕ 1Ü!‚ 2èà†tÈ 0sÊ…ô!Å…1eØŸŠþò·#`‚ DXkA 9ä’•v$’Ifš’M:™ÙiDJ9¥c¯¹w%–Yj¹ålqЗQ¦Dm@¦l™ŒIÛxAGó¼Ï;í¨†:pÁ£K5Iѧúä *Q~6@>+5â” ùšb~uÀ<|a(¢÷éø'•ö¥=MéB ƒN ª¨<ººR` I%­´ù$®¹ZƤ®½š†Z­ÁJi%šÅ{l˜‚°K±k› )î™#nO€cÛa†|Ò”bMZ`áÍ_gD‘Ï6x¬„Tâ’û zÅ’¹èªûi½+Ý3I6÷ÂCþÜŽË_¿¯ºë`… ûpk·ú:1’¼R|1”ÀB¼qjÄ"û1È!g´ dŽ’ 6€|¬G>îM’mFà†?yÈ<·<š€ ‹¬± +€³Ñ8.°@ ¨JQN8ªìRj+‹H!L»¨`LS-¨@ÑG'­R(3ÁDJ*I´+!P±ÓNC-uØ/¡@6ØI©ÐJ8lxC´ÑH+÷Øe+¼#Ã?:Ì1âŒIŒ1ã›YÜ8ãQ&>¹k°‰|9æ!ƒÀ'™{>ÑëÜÆ ¶mÓÌ´‡s·;jÑ ZG?Rƒ=XÈ"êWð3GMU!…7*”Á=ÁócÊ"·ç¾þ»Jáàw‡*qq;[¬ÔûïÁ0¼ô÷Qoh:‚Ê#„:¯»¨á75þàü.Ь”Û¿8äùSö¸þKn¿ý<ö¹07+À# x%UsÅpÇ6lÂOXí¸HÎâ§Á r°ƒü Âæ7Œú0qøë_ãø‡B]ý¯„‰ c(C‰Üƒ˜¡m¬p÷衸IÂm„0 !àL¬!“¨Ä%zP„$táÆN¸Â‹©pŠOj!7CrQȺ8›j8Â=%øÀmúáYlã(Ç9&щ‡Ë"ĤhE_UqJÂ"…µE1sXÀ ‰,'þ§6[Hió ‹ ã˜Äé¨ÉMr’Gv d'ãGŒõq”G$(i5HE²òXîZ9‘¼sv0Hm8ðh¢Èd'ƒ)L:~2•ÂÒ£)ŸTÊdŽ•Æ–åd)ÍbcyðÑ4ò 䦞Y5®5Œ €À&:ÓùÁb>ÓV¢df¯– ÏÎ8³BZe6ó‰*`‡úH®‘4[µ¬M$2D3"T'D#ú*vÚSJÈœgÅŒ"©že >ÿ)ÒØ˜W %NQƒÏ¡¶q%jsŒoPa n!Æ9%ªÓª„¢ÒE9Jy þ3ýiÇ:Ò¥Ê&PÆmì°Sœâ¨¸Ò)rcLâÆ¥·ùCMióaD °FNyªVuú©¬ jQ=CÔ¸Væ¨n­’R™ª×‰Ø'¶ACV²…_`57‡ En0p‚a³ÏЈÉR¶²–½,f3«ÙÍr¶³žý,hC[Ù=`s„w¼ëjàJWÇitµ¢±+jÒ½îUx…mNÁ‚$r´ØEsÖq D§8A P‘ ‚– Hð@ RÐLvÈÍ ¨[Xl¡6óèFCš€9\Ä ·8/zÓ«Þõ²·½î}/|ã+ßùÒ·¾ëm`Ãb±wº¶4þs]-lõ‹˜ÙÒ–© l“‚‰8>9r€ Ä °`nD2‘…LâhÂïlºp†dÔ ˆ>@â³X"O°cTÛßËü—®†ñÜâz‚s¶q°D<ñ…aP!)A@\Ɉ¼èNN…âŠFšn1ó0mÀ‚Ò#uaÝ1˜_ŒãÅÈxÆ•©q\o cƒ9›'¸dn«1‘j,–àH 0ÒÜä"6ŘƒWmcÔFÉX:dÚæÓŽ™Ìü5³\[ éŒ52lV´,[€˜Î^Í-b)|Áaµ2 E`¸!XDFŽaˆÜ„â ³þáaic$G°5¦i+æJ¦ÌFsQÕ,àK[‘µ@!n†œ&è@¶1…w4¤¯8Å( ±bœBNîœ@Ž“œå4‡€¥¸@m^áC‰hv‡Mì"=zҬݨ¿-£lý2ßb¬ÐÂT^KÔ0´lÞqçÚ¬x6IØ­Dr€|¯ú&¶±ÍŒl¡<¶ï8•€ër -Ò€X0¢6h¨¸l¼X (gêÇ+òœ£%GíÉC¦¨aK'«B ¢ñ±u¸ñ6“Ø0mŽ ]ÙPÁ—È)0‘g, ìf?;ÚÓ®öµ³½ínþ;Üã.÷¹§ÝÐAoôÐû[tŒý®IWz¿ó^6Ç@Dfƒ‡R`¤íÂì+ùÉS¾ò–¿må<¿i€ëÞ¢G*éKŸ9yàú¼>†l!¨l6E8Ä/€Dc¤(Áìk¯ýNÞžóž_-èáùûŸ_ø—ãn–ÍfD ú¡DBc#hÐ& çF €åJä¡Ûÿÿuß¾}]…3ßG•ŸùL>, ½œÅM@l¸„ dfà Èõ[ï튤} V”þBà±DÀÃ?!Ã(Ü$p[±¸_DÄj ®SiÝݘ`\`2 =•  K6h‹4ÅAâÁºÕ6[F$‰͆!ÀLF P’CÁQv!q ÐyàîOöž¶!™l›L“2äÔ @€8È D\€6„mÆÆÜ âDíàæyŸŽ!šÒ>Sª!—„`Á4iB)l pB x> õeX™®å!A,Ál° Yõ¢+"âžbø`Q5â(=¢1E¢$jÉ:ÀLÓ;\Áe¼Â.É<ÌšÅÕÆ ˜¢@8þ2â+F#¬Ä¢,"- •-ú.¦’.î"–´ŠLS”TÆ `C aÄ2èÖņ”ƒÌF=|CâÅÆ<€3@£4F#âÝ"~`6îÑ6‚R7z£{x 3d 4elàóÅÇl¬CBÎÆ>4€X€4èc_^S,À>þ_?öà?ö^@ZÑ@RA$n8c6 ØBD¬ÍÄ#m¨™ô"Z±¢Â\@*_„äö$Ž]#Gä¥$­$KÚF?$E61à àmÐÌF4|YlŒ@(ÊÆ˜GöETò€>ŒÁJXA)”C¸ƒ6ЂJ°¥[Â¥\Jþ!@ð-¼Kh€ мÀJ¦`&Q²„QÂRb”R®Sf‘S>%m°‹ä¬@|]l,>ŸlPÀ,̆7°wÐ%º,ÐB ô‚ƒ@7œÃàÀ=˜>xÂJÈAƒJð¦oª]DÅ]¨„[À…,Èr¾E\ÌEbN£æU£5–¤î=& E&M&eÊÆ@®MÓÌþÑÆ4ÐÆÜ›lÕ†9 J~ìÇ«|ÁÈå/`J€c)ìæ-<ìgpögˆ¨D‹¼HŒÌˆ(ŒÈHtJg~QgçYgÀagÿh§ qgwfb>‘§þÕÆ^˜43Ä2€¤A"€èÄ ìÉ«x@~€Ð`£ôúE¤àÇªŠ©()œÊƒö5JhcΓ…ê†–†nèEâ fS Ô$mÔÁ!ÌÆ"tÁl„@ ÖF lÎ8”¥J\Ã7pÁ€¸C H[\€_Ì©_ÈË_üKÀ LÁHž ÁNt.¦€=)Õ£óÍÆ2ÄT³ÚF18Všú¤«\Ï—H34ÅžtA+¤CÌ4P‚Jx+¸Š+¹Úî°ù˜ú´+œOú,)¡êW°&Ó°6N±R£"+A(ë4éä˜Æ™'ØÆ @¤c•ƒ¨.©Hþj5Þ«)åkähŒ„ö«¿ ÀJS<€INêÃ ÅÆ4DÁlD€ÔÆ”ÁîF¨Z«Ãb½Æ–ÄŽÅb̾NÆf,–fÓŒ&mlƒ4bF@Â…ÉÆ<ÌCmAÈz×4ìËÖ^Ì¢ÖÌúQÍ^Ì;бfì±øœl6èmƒÎ¡É6€˜Š†ƒÓ>íZEí]MíU-Å\-âäþ¬¿öxf•ÍF H`F€¦lA;ÆF˜Ø@|hAÚª-O±­[¹­Á­ÿX,uÒ-²Zf6Më]DœDÃ3äÁÖaÄ Ì[Fà6€í6ü‚P¢%º¬ââ ã"•ãNäúŠÜr å6jTâ”4<íE`0àƒ6L"DPF”9ÌF§â:€6$îëJTìþÔì®PíöÊíjQÖjm±¸d‹½@Ø9L@ÌaA 0kC0c¨oF|By OJïôBTõ~Ôõ¢Pö²äVcîZ)BNÓ4àÜEH+X¤C”E„¸¯DÌ@Ð9œœ½G8ºný>ìtJhîþá’”¡îm/ÄüãFJ%,Vl¨T†.ð@‚MÄ5¸ƒß^„8ðfDÀ ApÿI–h±1qg^„:)…úÛþæŠ? w'øâ4e—bD1°CPÆ)ô‚À„àR˜¼ÁÀL„y]·±¿q}Ù]"àOZãÊ R÷z/™°.˜õBØB#DA ç†p•lDÃ9d.AX.ce\KS&ÓV«,ÑmxÀ(ìƒt×Eä‰l˜‚©…˜ìIÄÎ>òåD2cN²ÈU²¿]r­dòSò“?µ’¸m<‚¸C=d |Sþl„òbÉBí±+“ ,ª,-Oš-«373–8¸4¡³Ì8Ü2bD<îD”ñDÁ/„eC0È6‡Ì3Ûk4ëÝ4CZ5S .³d2`J› –4Ã9 ¢lôApÙ@D´B<ƒÌ<Ël=Þ=›Y>OÉ>³$¢ 3™A!_Ä3Ð_¬#O„ÔBmxeDX,XC#ËCKmDƒßDÏXECSK‹@„µR/„.FBx^ÄèC:jîlBG„ºDËMËK·mLàL÷WMÉEd:@ÞÒ 4/F,DfD6°ZFÔCGOÄ:ìÇû5u±<þuãFõNµkUõ\µ7¾Îò*ÔeD1TzÆÆ„,Fì ´ºµ3Ïqzðó^÷¯,âõ.RCƒ´R5°óEˆÃ3f„(@VFDC1ÆÆ¥ÊÆ*@IÙÑj¯6k·¶k»6Òb‡!ccÆ_dãždKâµ + ‚fD#„vðb¥–8œuDð\Õ9TäÁ1tG·tOž4·ápp×ö™Ñ5€å6çí¶úp+B$ÐJK80AìYÇ ä™lO„ÿepía€uË6vçoÿܶ“Øõ=]3bÓ-À8땘¢T0FøÀg„F71Ð/~þ“~»Ølû£vƒ c[²wïxa @ª)’ $µDÜCE^D¤ê #tDœAˆ¯,g¸ZmxDÀµìÊu-r·8±•¸ š6!ùn_gÄ"@F€<ÄŸDˆZl 4LxCè5†óø&ùø+ñ‡owˆ×²‘W’C '€‘)·g 9°— D54m¤`Û‚y~ï·iõ·c#‘§Yš7Úš/ J³´^5CQGÄ1üÂOÄ sF¤· Êhÿ9 ¯•˜'1°zRz²%ú˜-ºù%m!ÅfKÄ diC”ÂHÐÖ ;tºl<ÀAþZ}ºD…úus°ë€7‰€‰ª _‹Ð:!¥ÂyÇÆœvC¼@ÐC-”@dDhzD(ÖÓ¶ìŽ;D;#;©;¦©“ªãس—Þ=¼+1Bl×F(dÀ0œA ­D<;Œ-šd 5 ;‰Á·¨»_°û »{™“á™S󼯸XVâ^eC¬C#¨@e4¤Á9ð0@ÁOD3ðØ»ó„GH*L¸Ã¦¬D <<ij„Ĺõ¾;”Æ»Ñeü²m<Çg„;(R3Ô·D<ÂJô‚e À9´ADD‚8e \½m˜´š¥PþNW| ¨øIЯÄÐw8IV¼-,û)=Á1}ÓÛ0?ðÃЀtFyGLAe<À8¼^CL= ²:â¤mlÄ*Ô8Cí8ìܺÝã}’4{kÔ{é±CŸ’H>nDƒP†h˜FD3°CÄÆ¾ÏF›¿yº÷…mâ¦nú)è×"ä€WDø» œÂ€Êä+œdCqÚÅThš>Ü œC¸ÿ’æ>ÅW<ïw”Þ›@Ì6`Aƒ&T¸aC‡!F”8ð 31fthþÆÎB7Ã>`Û†°È0) M)‰q/Κ@ƒ&Z”)Ø´”‘²“gO)_æÐ’ò Ïæí<ÚF)¦<h´€5R¸¹C±µMRŽ"ØIÁ©O³gѦU»–íY /^ °…n]»wñæÕ»—oß½ÂøØ<˜paÇ'V¼x1¨G–<™²°~1gÖ¼ïA‡=š´Ã#ô”V=ìÁH†!F,Ô–ÚI„ˆP8D'# 9Ž~f­áš&[vùÓQ•C—¢O8ÍŸ#m»{wïoãÎå<ž|yÀ”ѧWØ1äõïá¶\ž~}ÌžWç׿Ÿÿþ …ø ­Šuêc…x8"…¤á"Àa¨hHæy#ž6ÖhG 4Ô!€ µ®ù†‹­Pp'†¦âØ©掊§'é¤N ,¼1k©ì”óNÇwï ¹ì RȺ΋ÏÈ# kÉ%Ñ›oÈ'ëÃïÁ)©¬2!&´R¢I’ ‰ºTB'ŠŒ’igl 0¡0´P‹”XDŠF°˜)À‡ˆÉFvê€#T¹^ •{ðØ¤ kX † ¤€VîÙ‚BàÑÔSÙòÑ ¡l•³"™Œ5=%e­1']Íõ¾Ï´ìÕ×ü> ”_I …þèe¡VZˆH0*‚†a€k‚S-.kB fûP ÒÙCž)¬ã)„3ôá&4¸Ý#”Pö@ÜE¨ÁÇ,dI1ÞPìøíT .˜'U bU×…õ‚ÕÖ‡£bˆqeØb»¤$Vã'Z±ŽzdžX‰d!?Pˆœ9Ài(šf#:æ$’ÙãŽb²Óàyîyg„ Røâ‹žØhÁ$>ZÖŠ‡¶8c¡ŽÚ PVj‚*1¥¡wºÑ(7ÂL(‰2 ƒ ,c!m}nÛí·×š"ñš¶¸h¥!Nï%™®[×§¯|ã7€FðaòÁ#´EÞY¨™*ÁŒþ²H‡œâ ‰µu†ÛóÏÛ–{¡ýÎõî½kÕu#û.½UÀÝÊmHGv† P@¡"´ˆG!FdÈ‘'ªÇäàÎAoÞy‚E'Ýu(O_IÕ­¯õ釄ýöï÷3B~|…òÚE÷„Œ°@!$à°„¡c2Z¦ A°€æŸïßÿí¢G7îQ/0Ù³ö ˜ží Ð>ÞßU#x#pT`GC²ñŒú¹ Q€,0ˆDŽ!ÿþ—Bö$€ lUõÆp2 tayA†\÷&€ÁaBAŠA¿…£#)5ÌQV8(\þáý× †4\Ï ½Èn‘39Üá'R ¡h€B°¼‚°`|F˜Ñ%ЦŽ\ΰÈþi‘ŒöébÑFD&fŒ…ÌŒÑI‡œU¼Ú"âÀgìc!®!È)hQihas ƒâ$rŒ_ á ÐpŒÙ)HY~ŽŽ4O)ÃÇä²I—±e”x%IaFd  À#ìÑ OÀ™ADA äCeà@5"„ãED¿(¢A΀=Ø/–³4gèàò#þòU¸äåwùNÉ4’{ä0ñy?ä"pè Bˆ—O”â ™øÀ`²°x¨à™±@þC#’ŒƒCPg`HÎÐn”£õèGAR‘Ž”¤%5éIQªQX¤sUë¬gf)OÅ(R¦‚¡çK;Ì|î!„“Æ]…œ"x-aQ†~d }HT‘*t‹!V¸ÅU±šU­n•«]õêWÁV±Ž•¬eÍêƒÓvÖT=4­éMÕZ—{òt˜R®K2–YÄ ƒTX£ 1N0/< !jp -èY…H/®q'[%ãV™Âµ²s•l$å€iHM:¨Bpă(¶8†0n Aƒ¸àÿŒˆmb(”à³½ šK+Û°Ëb–1š•'gþãêYßêÐN‘š7š˜/|ó N`ƒm R€xC #pê@ŠÀL‡<¢e 9 (°ÜÞR6¸x‰)q“OøÊÇ—íí‹rÕ ¾\`:äA²O$DeÇ!bWôA"o8‡'‘3@ pLÊòYöÚ—HÃ/bŒûN䪿–) ¿¨¹Â“ÁÂ&b{ð!¨*!b5DŽ©ƒ˜ñ Ç|@õØBØL,É sx ïýpˆy9bœ–8É‚«~ µ"ÐC¶!Ç"r '(䂈öZªT§:û«r$—Ìa'Ïʹ”òK©üf©À1æ˜Öþ—}Œ!"0ABÆ…€C¢y{ðƒ P@C‘‰Ì@ÈúhœžÏgûξu^äë™gPƒ¬Q‡:À E#d å=È+2‘4Ô¡D£dÀ06P´¶êŠº½¤&®©‰jvªZÙc¸^̱06!ÅðæD@΃°€ÔmH;|>}…aÆ¡Új?ÙÁu6f¡Fiÿ’Úóîö‡!HˆßÕ’* 5X,#æfH6Êc„ƒ[õ à€d"ä ðøÇAr‘œä%7ùÉQžr•¯œå!oñܘlÙG&ß^Ü·-ûíþo+-»°ÅÎlÌ//Ȭ€$ÀƒÂ‘B9 ~Œ# "ÙH/C8€Wf¸E¶à`V±ìe7»ÙÓ±ñ„7æMöðÌ SsÞÜ‘9×9•X1!ÁÌC{ðóÕŠ †/$„ЙÄ*¢‰;$ý!]sHò`b†®vd…³E ›àpƒdžùýß‘ó[ úîBôjªú èú¶(û´/?¢‚ £ÎàdÔ$!Dàò ¢B!’¡*pFLà æ!®!ša"’!è@ò  .Jùüo·×Ní‚eʳoHP5``P è„Nj’À êñ T@ÓÊ@øÉ!Š¡a"PŒ ±b½°=æp.tPžxÐz|Ð…€0IC‚²`0 ÀFÁê@œþnJ\aÖb !ÞárÀº@¢à‚~A¼B# º¬œ¾pÏÂ?o ÝnúfJ¾¦þ/ h Ù04ÌàÁ0àÒ 8öà ^@¬DX)"h!ˆ¢0Œ r!£° Q?ð½‚ÿ(±wÂÅp ËðÎpu ¢ À ˆ!P€ È$!È$°!¦ò øÞD‘‘qtØ.æ–‘—šuž‘{¢Q1BìAN £‡ Ü"‚¾@0ÈAráh#ö¨á©ðÑm$(GòÑ`ö±Þ*ës) ÷f §§ R"!¾)  4¸ð ’á °« þÄ­ â„< ¡!ÒM"ªâc†±$}BÈc¶£Üá zBØP2% f%û‘É\r‘`odÒuh²&5¢ ƒ#µÄ "Ô¡ôï Ôæ ØÁ¢ ²!,3¢À}¦’-. B+¶ãF B;ÀR%Ã115Ä8îÒ²tÖ’-1Bؠ劒 Š€ ä šÁŽÂ Ó ð ! à ¶ 4$Dâ¬(-úx@Æ`'&AP’âƒ)¸AI!F”ç ðA öá1ƒƒ"“-IJ2Ë‘ÎRi6Óo:Ó3%‚Ï 6® °à 쉪þ’!Ì þ p«áê`ı!ˆ-`€ÌNa\@f „šà Î-€B(ˆÂ( Ó13;¦B ªâ*¤ b`aˆC3t2Y2®8Ô‹<Ôh@´iDtDbéù¬„ Ò@lâúÐ ºš® æáb¢ =%" ¹ØlQ‰£8Ž#9šâ)®”9£2wbôþ¡¨€LËôù6Tú4qM'¦M‡æMá´!¸%ö|% bäá)‹à)·à#'b¾Ø@#¥RÁDá,aa` ðà @\Ò"DFd+LET„EÀE³Rs¤æ@ º¡SÑBC•T§OT)¦¾ÆÐTOu!ÔˆÛzEßÀ !Z!>ÂØAÿjuÀE0»PNèÄNðDOøÄOEPE Q…QR$…R¤ 2îP`¿Ð\ÍB\q0MiÈ\†T/F]×5!,lÏWN º­•v2`d¦¦ ÐG! € *A4€(`>—0`þÓ‚[4ç[Âe'ÈÅ\Ðå:vb]Úå]þ…^ì%;„Ã98öÍt,åŒ\áNdm…dÆ´N¶W*Ï~evÔ zÏ –œ Ò ¯ TUlŽa6Cƒ~¶¡ €"â>¯öœ`¢àr¾€°i!"àÚS#’Apo^z "·tM7k±“kgnuc%qæuaw ¦ˆs­d FÒ!@^ Bxà ì y‚þÞ4Ž!s"9}ÇyIz±ètA/u Èz™{ÿFl·—J•ö¬¤Ø4!à Þà /f¤!r%‚ ¨a ¢ö`nö0íWóð·íô7{ø—oZWµw{Íx²Wìq ü#–A "·`@¶Š !4Šà`€|é·ƒ=Xz?õ21Ó=4Ñså„a·Ø`‚´äFã  bbft&A" æà . ná)!¢ 6ð Fa<%ây…x…>Ø©÷É2sæ”ØU˜vo«Dæ—!¢@(‡¡àÑ Š!x âb`ÎÀ&3"’à n± N#mIþ²ÍéÉ2ŽélŽ?¬Ž_€xJR6ª¬„ V4$à  ø²`% =MàQ faƒ#›²x ’ ø!hí³~-Ù0yk˜=8y¾<Jî˜qï°cüÀÍâ»ìÑ´A‚‡,Ί Œ¡w• ¸8!ð@$'‚ƒY˜‰x\‹Ù0FI’ùI–yl“aö[¨džr \q ’¡ –À fã 5&Ê Š`0hàÊÀ‡ ‚ `U Â8Vöo3*¥0:£5z£9z££`?V“Kí˜á+ž»”CùA„€¿ªdP¡!ðà„ âÎ 5ãq °`0¨@Ø¡þÀ™ãhv!VúªÎ:©•š¬`0‹¸ã ‰;±„¡ožÇ–¢«ö” ¶!•ÙvYêZ« `á >àOâ Ê á"æŸSšXÎT­BØzÞùHLZH¬údíÀ™5Æy ôÙ 6Õ L@Åâ\ ÊVÔ!¨Ž!BÒæzcê§îzuòšu¨ôúz]ö x„‚fw0  ¢Ná l™ ŽáÂaÈx!á'‚Ïbû²éZkGM¤Ÿ¤‰k¯ƒ$´×• )dš!0 ºbŠ Fa!.` $Òq°`Ç4¸ƒ{z¡:þª¹¥É;?Š F$ rÀ ÚA$Âx¢²ñ!Š÷ø!œàîþÚ[K2û¥6u:;>Ô˜ ¼JÖ!mê•?4à·"p+ |¢Ð!y¢ &`"š!X "¨&‡ÜÀ…»Ùˆߌ³œ>”ûT‹ œb‘?Ô!h«¡Eu9 (ˆ *`„‚Àâ¼à$" L »Kv7Å­äÀë)Á÷fÁá#Æq(˜êa©¹¼Ë½Üì^#\¡’$ˆº ž@˜ê @âÓ ¢Øh"Vo <ÊWÜÞZ|ô^œ­°œ<žF ¡£ ½Ð ýÐKêž# P4@PþAn €<‚U[`²cô(‚ ØÁÖ¸ûâñÎWCÊÙ‰ÊñÆÊµç³Û.Ðs!I}"¦!ð!·÷ãì{ ¨€ ¢¬áBÄà§¢$o"Š 4¢ãZ®ÙýÙ¡=Ú¥}‚ÔÉÔ•Õ×ãÏǃÕ]‹`]#ÄûÌI æoš³ÑJœ ¾ b8A!ªÁÎ!BRA#VZÏ9ì¾¼ßýýßµjœÊÚm ÛFÛÕƒÛË(˜ Õ¿}…Â=#Rw÷äH—÷r ¢rM¶ûØ!Š€ ŽàF ð! ïœùáA‡>Ï[rÏ °ÏßJÕcÎÛY>…þ"#ñ B4À{‡!¤rÄëÎ}p²#)Þ!ªàw"êˆ1sþs\Þ©Ùù¼‘†æ7Ëæ™ 篾v#VÏ¡§dx VáïzÁe‡Á<œOÀÖ ¢¼þû!<%ÍT~ìS(ëoð©¹áì9Lì¿yÊ~"(‰*>  B‰ŠZìЇ Í ~ñ´ k ;#À@nÿ~ñûGð/që ßë ñíKñQßs_"Bò<õƒéB ˜ ›BŒÎ Äà"B&¡ "€Ú74ú$ÖËfågŸgT?Cšë»^ª5öÛKö£ßmj?"Œ èÜDþ5–àsB~R0Á¡ "ü¾ ~,ØN3B„%4¬¾ûwfú)“ð–À <ˆ0¡Â…@Å0¢Ä‰…EØ‚1£Æ;zü2$È 3†™¦ —”•,[º| 3¦Ì™4e2Êãp^Í<{¶Ôƒí¤Ð¡D‡²¢¨Ò¥LMz`2 »$'Oˆ2I€QÑeLÉAwÆŽ)rPšš5Y$€wg™†Ñâ3®Ü¹tëڅɯØÐ+Dúý 8ðFa|(>Œø Cˆ‰;6hQ°äÉ”1’šò®fºƒ”Ô™Ó$Ê )mLñ s³ê—@Û. Šk×mÆ(­'B¨‘þhÊŒ@´Á/¦¤Bغç& •ÙL÷øÆ¼èÛÕÔ«[WwoßÊÜ»{$ü8¼ø‚‹Ç›7Ù»úõ—Of¾¥£=b^È:`ËE¨ãonPŰ2…Â$'…a…RñµMQÒ¨TgH!Ð!\,wàP©0J‡ ÂU@þ­ÈâNÙ Å×z2rÞy6"VÞ:"”ÞŒ> ÖžIﵨš7ð0ãÍJ[°CË~ý±d4w0ùKãNS²’ü">Îô³Ò$8étƒCmTá1u¸SÊ54(âQ¡ˆXÔ"qœ”B&µ³§IN¤ÑÍ0YHATf5Ð þA0³žÃ[xNW"°œÃi* j¨/žã¦úU㎪*”㪫öxj¬‰’J¡j6´ÄG;N¦&{D±‚,ð€ÎJ¢Ð#Ä ØÀ³­ Ï-,œSF6RÜ“¦Nˆäâ»Ç,BÊœAáÀs’25 …­Tr’)˜t‹&C“ƒ¥K!AYœQƒxÂÆÍ»˜ÒÄß<¤øð;ß0G>RLlOlà&œrJå”´TykÉ2jR©²®¬Qª®¾WMõÔß³ÒÎTòÞŸÇuØC<ðÔ vÓ5'ícFQƒ°wQ3ŃX”KàØ½ 7 “óÉÕZ2mœ-sCõ´ÆµlMh( šÑ€§3ØÉŽw§ª]îv„þ»†gwü‘ï0rÌV`‰ Jñ+–è/I/9Cò± X/zÓ@VÒˆf`%¯¨C´¾†o„cå8G:Îv°Á p˜Cð‘‡=|ïDg¸Ÿ¤Ì¡ “Ôâ&ELb,Øaš £PÄ1œ¦d"PGýìfŒcàÀ>! R˜â©XE+\‹YÔâ»à„a e8ÔØŸ£·þ4â yXK®—½!/yËCaÉ4¸v°0"\U[ÙªRF'4eO"±/¼`Ò ¤€œæ§`DÔôèƒ XI9¡Š]ЭX,ÀŠþ{lÁJÚåƒ'Æ|˜>`®R"1:F@B–ÑŒgDcW Ö'”,g Ê0Ž!a á [ŠÁ”"ñd`¨À",`0€}þÜcñhǸÀrŒ\®À@K¤´Äœèäê1Ç‘Ìe6“¦DBiL}äA—Ч¥²L_[™™²v·1¹èNè„'+èCe‘T,…ˆ7ô¦~~¨Á0ð@Ž¡H ºL‘*ôâÐd€ –Z ¸AÜáDßhI6Ρ¦}ô«aë"„JT£ò–E®Åízb[[ÇÐ6¿ ¹­}%£Ûù XãrÁ>x\<+Œx‚D¤†Œ> CÂ8 ,,@(kH‡7–â =Üõ$®È…7°€?¬oauiC`áß 8ƒØ%U*ÿÛüòGÙ1bü‹cÀxÆ»˜^)à²JþJ±q("7 O*Ø×–"wÜŸÏÐD:aœ£Æ’b±\&eà^“C{`"›¬¾A®ŒŽ}L‘ýâù @®³H†,ç@¯Ón”𴆥¡Ã0Ä1x#”cø)¡þzUÂ@ qœDø>Í—§:„]`‰‘ùdA‹ŠÌ±»±Ÿ%sç=GDϲ&HŸ_ý@«z×+I0žB¡)¼bÊñzÜ-¡3®ëZ³ªÇêîïEÎ=]“;о‘7öPˆû0 Ö1 bämþk`¢×a áB 2ô§f¬µÅJwwáPPÏ{׿†7ªXÙnÃкݷö¸Fä½ñ×[D¹ìVˆIcpJAÃO’ ¾M»C°‡Š‹bŸú!ãâN9ÇY½A“‡$Ý!7ÈÈÕ]r¥oåFçíÊ;0Ð<@*¸¹I@ ÄÏ$RðBв*H¹C]èŲáu“0 ¬.sÑ«èŽKý; oºDž^ë¨+êx§éÕT6â@P`ƒIb`‡" @QÕ`ÇHÍí*Å Ô5šqhü)Ä@$îªñ Xï{çÓý3vÃ2ïn}H¯zSþ@þÚcÆž0I± ZöQŒ³GE)óP4žÖa:¬cëKyàñ Ôß=÷óe½í3òúÙ^Ö‚79ÎÊq‹ô«ýìo¿ûßÿøËþô¯¿ýïŸ~!(ÙnKHÖ(" ò¶ Åõ3ePw`qlf€D± ý §€(gqM¦0b©Ç}¬å}ß·á{ã·gåçq´â ‡€‚)¨‚+È‚-è‚/ƒ1(ƒ3Hƒ5hƒ*¸aw ²ÇÆh'1 ®À nõuê 7ÃnM1ö!BÑΠˆ0Þ w°„Ÿ¶}ÈHçjØ2}7{ëÆchkµ†A+þ#Ɔmè†o¨T`{`̱ y£ o `3P.p7‹ Ðæ´`' ² „mÁ–gЕh‰—ˆ‰™¨‰›È‰è‰ŸŠ¡(Š£x‰{à…iØ èw"ˆg$ok‡±(‹³ˆ'Ñ¡TðÈ`‰25c@ ÓÍ` ÀìP FÀø0 ØR0‡7bV€Ù¨ÛÈÝèé7mI‡ŠªØt¬èc®xn°H‹ëÈŽíH[pyPPb0X#Ðæ`[  󨰰¡ îÊu £7àŽ é)ŽiHŽ!gþŽ;†Ž¸¦Ž©‘‰O‘Ó ³ñ0 èP3Qð T±sapà = Õà Ó@UÉ‘;É“ë‘`8‘íV‘üu‘¯–‘=‰”I¹ä y…L؃߰`°è€´Ü@}Ã?wtÕ@.pm2ÀJ©–ki?éA©nC™_EégGÉ–wÉ“®/àÝ`Ó€ êà{Ã4ÇR¶1çÞ€=À ‘e`Œ³Ñm{0x©™wé–ß—µ&—µE—uf—›išíØøÀzAîpF %j€_à…pQäô€äþâm '§Iœ=Ù™¶÷™²š²5šAVšÅ o¨à\gáÞ@×Ð Y ÀÙ98 Å@6ÉIð ~ð„º‘LРѱyÀjóÙÇÙzɹgËéR͉cÏIŸÿi7Ù`„ åRÀ@ ½Q à g@]Ó@ Ðê`šçP× Ê¡²hŸ{‡Ÿx¦Ÿ+ÅŸÿ埊¢Ññ À ;·/… °€Ôð„×° ×ÕO` FP ±éPêÀunø €¤Iª¤KʤMê¤O ¥Q*¥SJ¥Uj¥KŽ_8Žbh†Š!{]j %j_´² ¿`¦þgЦiª¦kʦmê¦o §q*§sJ§iê¢øÄe|8ÄÀ F°ó|sU€ÙdžG¤ ‹a@;©‘*©“J©•j©—Š©™ª©›Ê©ê©‘Ú§ˆŠƒÁ¥`J# KbŠ[´é€¯ «±*«³J«µj«·Š«¹ª«»Ê«½ «¦‡ü‘í¹ °‘àÑe Y ½ kàýÀYÀZQwø´ˆ ‡a@’®á*®ãJ®åj®çŠ®éª®ëÊ®íê®áê¢:ªàWª¦*¨ÚJªúZ¬º…\hK°3bE Â) npcP\±þ„•6þL0 € å†HP³è­ïê± ²!+²"¯Ú1¯ax4ðÑ?@;†¯"¤¯1ůþºz×zWóÀüP‡EÑ ïð“ôð¶Y¦à•DÑ ³P³X wšß:²UkµW‹µëZ²0¢¥Y¯ !“fГP õ “8€ù³4³)U³6Ë[ˆG R{¦ð ZÀ‡ó` 'T}–wweñø KµY«¸‹Ë¸»µ6v²ôJ=@™ E'²9`4@2éRk›;m;Ko ·](‹Ó€Z1Û° S UÐ V  c0D1 lþ`²XM>ëØ±+¼ÃK¼âú¸)Óµ@ùµa¶e à ²º¶#ºªDº¥kRrˆydD'1¤ð òpô ið‹]À Ik à 8Û†b°mš¸Å«¿ûkµÇÛj‘‹áGv0Q B½_Ú¥×[BÙ«½¦Ä½lx.<7ô‹"upg0 YPC¡á°eë˜öC¼ùË¿'ŒÂíê¿*u X µ¯0¶™+U‘žk 4 5̶hx² ÜÀôÀ#– |Ãðߣ0~  %¿nØ»¡ÕŽÁ›ÂWŒÅæºÂÉû–Ëk;¸EŽ` þ@€ `« gŒÆi¬ÆilÍ;æH80 €i»²¡ëÃó ÄA|RQ`0E}'pvkÒÈ3ÜJ‹VœÅ—œÅ[ ÀèÅq [ͧ€º` Ûp¥‚ ‡ÁŠ4Ђ"l0Ñ` ¾àÆ/£ÀÔÇ~Lcì` T[ttp§‡'T6Â{ùàŽ–ŒÉÓ|š À (œß£ ¶ “° ÁÀ ËÀålÎçŒÎl#“T rÌ8@þ>1°ֻǣºË¼|1\DCñ1Älø (¦àßãP`|€'F þ\À ðp T’Í&LÍM¼Ö¹ HÁÞà ¶P¸Ð<<CÐ 'Ò)­Ò(m¶ )ÐÎeh[åP€Ã¯rϨ˜Ï¼œœÂ ãπ̆j€>‹7Mɳ ""E0U jðp Ç ¨ÊÈÅp ÉðNÍÀN0OÕ T V° Yà à _a0f ëÐkÐoðq@†`ѭ׋«Ñ'~6G(V€N` êcà íØ ÙŽ= ¶p 0gî¬/+@[¤ 0½eŒË9†;ÍË2¶Tã %ŠÀ  úpÈ G=ÁFþðâÐ[à Y@6V`6gS P0 ÑàÏÀžËnƒ>êÈBDø°ø‘<çɳ1Mà v ¼€JQ ËàECñÉpàî0Eò@öpEMy¹ìÞå#» °×õ]®}=¯á÷ósP>nlàì€>eÀÞA; O0™0 ÓpI+@ÃP /pà 20 M@ð²A{ uà{þ0ÀÆG {°ÌÛ€È0 Û >u-WÀü 4ns8¾ãipéPbãß ?XpU€ Ö@ Ò MÐÌ Ò@êJß#àê;`ß—¯òê×̲: Ân /Œ"eN Z€ê©®ê«înÙoŒÙ` u¶ð R ñ4Ћàë¿ìÁîëT0½@Àg¢ †¤íǦý{ +‘ ÄpÙ€SpDÜô).² Zð \àãMTOEìÀîn pÞupEñÈîÞ(ö=ìð â™àÃð “°ÃÀŽpÃÐ Š0ðþ†`‰PÐ  m úƒ°FO€ò‰h]Ç@keƒ€ ð Õ0 jó Í€ÜÉp pó†Ò\®AÐ °à1?阎óàŠß£ªŠ 5 @°Ÿî{ N®/®®àÑ=Q `Z`ÙP¸0@0 Ëàõ_öaïõÅ ÃE`ì¾ÉÊÄe9âÀ†Æ J)À€I5ñÏR Fp H Õ˰ñäÕO0 `îÚà j1jxR à Ö€¦<•Ùê0MŒª‘.ÿò „Ár˜à7/ ‘~ Á dßþ0ú’ó£ ± — óW»ó[:¼€!œk 8Pz(r¡ôLïô—-Ó ñ²l°EÀ € LP¾@×ÀýÝïýßïý@À p g_¹Ì;jßÀÅop +q » fŽ Ý°3p÷4‘÷-?M3FXnØA„ .T(€Epœ0d(î €YÅ(n䨱cB’DŽ$92€MäH &IŽƒN*GºÔ!X0d¹Œ¹2HÏŸ6ìˆé äQ¤I•.eÚÔéH^ °ÅêU¬YµnåÚÕë×®ÂøØ"[Ö¬Y¶ Œhgk[qåŠ:[Ö€-%þrõî• eŒ­S)ê6aĶê…DE 5ÙÞ$±bVR•4oæÜys6`¤,,XÔ©U¯Ö:aFÂ0Z¤Ì¦]ÛömܹuïæÝÛ7n 9¸B‚€yRj¢J€OR(ÀŠYÜ6¿¥ð“êÑûw†aà€U¤à½×Ûµ§š÷.ãK¦Þ¾}NOÆ]Iòd‘‚!c@2Zé¿e:É(I:!ã)#”pB’¢Rˆ*Ö2ÔpÃ-ÄJ¬,*l$.}±Å yäbç“ip쮼ø’¿ìó ñ®\ô"Â*º)$Џ¾(Æ2²Ùñ¬iB­´Ó8þ”rÊ®\ƒM6í²ÔrK.{ûFÆä¬Á |°±€¶ ®Ðgœ^Èî7îî“Ó£8ìà•"æôèš%<ú ¦hFOB)ʯ©“‚Ù$’$i‡¸vðO&ItÔQ 3ÕTS §ªŠJPAõ01yùd¯ láƒ! ]^ÄkFk lɲtÄ•¬ äÚc `.’«[l@2›uÊPvYf›MÅ–&E#­.ÓBµvJ+Š­Kn»õö[Þ2Àíâ,ô܃°S†îÐU2P¦>wÑ=”)L'PPJ‰ÁJ)µ€$ÙáF7Uxa§:EÃk#fmÔÄê©CFHla$[þxI FZù²õF\uŵ"Èlñd¯Qêº,›xBÞKhœö¬j%ö9µlÚ\¢‹6z·6L@Á8˜ÉÒÜz í'Å_èÚ£{ؘÏê«õ¼W© v(X¤@``‚02䃌³ €NØÔ>é¢ÎføoÀrø ˆ6œ+Š› }fÌCbÑød›ûúëÖ]M^2š´š!ëVõ Öck®<.œ£}’Ú(w=« ‡úhÚkw‚<˜c3žn·ëû޹Ț'€ß|Èáã ý:)BäŠ%aI¢×k“ê¸ä¦K´70B: #%IOÚ!þ2|}†¦ð×_O|°B†ƒŠp¤üô‘wµEsñ"¢à„€ñ=ð% ?8ËÌLwºÔé Jñ£àb7;ÛePƒœ Ôšgp`uÀ’UÄÅy2¡œžÇ>ýP †3T˜ûàWÁŸÍÏ,à`Âlftcr³:.G²%14 AâÙàrÑG)Ö@ƒ´”®ˆˆ ´&ˆC×]K$c‰æÁ~Ç ¿ˆ‹ ðAs„úh@çôB&%lûÊcŸbÃO1‡c! qºUØÂEˆÙ_åú—9GѰ… à¡—2x÷ ÎlÈ,Iþ¬\WÇ³Ö Ògb4c+]É%4ÚÑ#EÈDã°ÐàKÃ;déÂøq)ÖóÇØ„yL¥R•ƒL -Šü1ÒÉxF5­yMlêâ/'Xƒ.hP²HâhºX_Ê!8c #Œ·hÊ™¥gË”+_yO|ê&–¿ìˆ9D¸‡Rô©^o¸B\DÁ<~â'˜ÈdhC%¤LzFL‡dÁ ÜQDiÐ`‘ƒi@><úQ†ô£wÂ77Š#%†´‚Ƙð!wž_Œèµì™OœâtŸ ÝBÁ*x4¡„ê† â2;ðô>xthS •ßݰ¦Sš(̱ÅqM1¾þàjW½úU° ÆJb8“ &\ŒV³°ESæÌ‹¬›ªM_£­1æT¯®Ü©R)2dàS1ÀŠÞ!oô«z˜úTÈ2¢u¥RUm ¬rÀKê)ŠNI&†•s„"×RÊõ”òL%e¥tӽƖŒ}m,C@ ¹0£×ðNô  zÄ…1 Bmñ‹ $W¹Ëensû\èFWºÓ¥nu­{]åv ªt-‡,¬BÃ߬‹8lq.ì£ëe/{×P øÂ÷ 6èÆŠ•E”š•0ÆCåî _œv”ïTm(éÚ]lÝUhsøEƒü`GX¦þp…-|a gXÃvð~gÜ´ qq‘F *Ñ€{cÞX [7.^p×@ì+ì@Ç;æq}üc YÈC&r‘|d$÷˜…ã.‚34Ñoj«{ˆ†?9 xƒÇXÄ3ÈlxAÌcöB#’qæ3× Ý øp v~(¥eÇ6Šè \X”ÙÀüüg@š4M‚/âÌZ'¿VÁÃh†ýhHGZÒ“¦t¥-}iLgZÓ›æt¤—|cï4ã3¸äé®ð€ZÕ«f5C¤šèÔL´EH V?` ?„ -ÏXGÊÐ òú︠„1„h&fÎdÁþ¶87 Ó¦vµ­MíjØ€ÉF4¬5»V‡[ÜJ-‚:ÁŠ C>øˆ2j @,cÜó¦7O_íí¯LôóÀj\ð‘…aœƒLøÂ-°°‡9£,LàÃÞÑp@xˆÇ;ø@ŽA0À=H‹/ P ”ÉY¿„‘Å…^Ø@+gyË]Þr‹4Å·jÀ]oœçxt€tþs ïÞ5G!ëòˆ~Ç…4胜P„²xŒ:0/ÐÑ'<Fˆ&/¶` f€¢¾ÀE3~ ‹xfÙÆÖéôa„zìw³§A4&A˜y57zßýî‘|'|áþ½3t½g¥ª§J:u„Á͈Fâà?à` ÃÐ&è`²%ød4×Qƒ#Cä¡­‹®ÑïAº,ĦAæqä^÷¹/D|á;$Ø¥¥·m‘÷Ä{…ï†g~ßõc4_úÍG|ò­RÕÑ6žI€Âxy^˜Aâ`Â4¶€ _@. Á2t¡å0ä¿d °²G~–ü¡ß°0Ë3z`…›‡–±_i8@”gpdÀ~p   nC>ëÛŠå›> œ7>"Ø@ ºê³¾ª:…Æ‹ WØ8 XAlA è\¹È‡`xÁ®3þ ÙS»û;‹—Áª9`‚eHx‚!P;È}X†²¨†]A†ü) @¥ üŠ A,¼1õ‚,ìÂyÁ䫪:A ð`HC5D Ð\ø‚x‰ +‚4Ô=Û¬e³…6é·\°…D [(f~0…²(‚ƒ?è‚?hƒzèp(rðƒzxpØ8[@;ÐÀ/ ¬B¬¸B/ E~øQ²JM¢Ü˲è¾tÅ)´…£¨P²?°*8‡¸Àuجà¼ÀáTN³\Œ Oüt5æäÆùùaHžr`0€‹ÓÉ0P½€ ˆ¹äN²P"†o’#WÌHØN]è‡`•Ð…eÀº±š¿‰Oë›ÏüDID mÑ÷ÙOOœ¨Qh+þ€"j„ñÚ‡J†;` :EŒ”b hº‚(…Æùð+]M>uQp|€;±ÒüÜL|Ó!\0νh°;ŽI„—ú,[h‡˜ RÂH© P\°‚Ѥ7˜EœÒÄ«R-=ÅEØSúäRoÓ!ÿLLÂ;8Áh“+8økàÒ) †¶ÔT¢¦<ƒd u ‚ЙS P=¸ÓÖ"I ºL@-KF€hÕäTX«ªrÒ‹ØÈÊI‡è±,@†8KtÈŸ“J%rjt ]À;©K}8&”œ¡ÄS½ÓSYÍ þ€UèÖ̤ÕD›(\(¾Ð]8€Óià†-2]0>^œ³J˜#e ±°RØ"h ŸT¡#Q’ÔÔV¢ãVqA¤S„¥Lru2YCÕ Ð…/±, Ý"WáΔ9Õ iØP†Ó©h€RÀyÏéT5ØšC؆> ˆ¤š]ˇE0Ë⤽h[pÇÊá_ˆCE…Дr‘çÀ¤ƒ"Ê248©!h6•Y|£Ùœe¾I€SÈZ³ÜÙîª*¾x ›É[ÃÓy¤H[À¾à᨜l ÈbЀCÈ|(­³°œ;«õ6¬õZþÂÛZS@\—[ת*ðM¹à¿T¨1ˆÛ-š·õÎWɾ`‡à·Êá7ÖZH ðpè8ÿ)\X;\„X‚H¨]Û½]ÜÍÝÜÆm¡{-Þž"Hâ-^ã=^äE޻ǥ,˲…à‹;H‚0¨~ ^öä‹_ØÜB²…¥Õ‹Òº›9ƒ؇-âA€ÏT%IÙ=¼Í:H*z*µÔ…àíš/˜SH‚jÞº²¬±•‘»#_Z‘[¹Èƒ‚0…½PïE Jà‹pÀý«ö#’"r®ÚØp(„zbÕ9ÁÛxl~aŽþan…è8 _¿:tØaîá^…€‚µÔr4€å¥·þ݃:hb'~b(Žâ&6Ô^`ãi^0‡š²¬Èå‹oÀ…ì ™g > 0M8„½°†  `ˆß½\à‚ÊÑ\°Ï-’ÕÕö AdBdè뻪¼MƒmhdG~dHŽäF~>7°aæ)Ï=!°1”üèÁnhQeRe-P†zºþõInåVÖ¿Æ©â+†Ñ¬p…¸e\Î倆q˜„ˆz^[¨¡A­¡•°Fx²ø‚à[㽇7®‹o‚¾˜[è•Êþ¹‡"Àª/H;àl_Pa[›™=°–÷†Evev~äçÂè½a¿òÜ<ø{¾g|.5k¿RûçÆ7¨€.è ãgtY‡"Jƒø¹UngˆÖ¿+`å®QÅJö¯ §çµZ°qø:$pi¸Èo c¹(ƒiŒ æ u8É °…b>5çÄøã®H¡˜¢.ê¢v¹€ƒG•t^gˆfçw΂x¾ä_òÜ40¬Îj­†¼Õ:â)<¸Dk².k³>k´Nkµ^k¶nk·~ë±Æ:p…NN¸k¼ÎëÅà‡HâV{è§veý“†þ h‹ŽŒQøÆnìÆ®[à4P¥çÏiÕ }`‚- •9Ð…j …; †> ¶a€Å•‹rˆé³†×ã °W¨œ[Ó¾˜Q¾À¡,Qq¦’2­þmu€=°f€0 ’¦FìV~çmjKÆdåþíßæêSØ…¸hyã'•Yl€;ØhfA¾8xU‰™—ò ‚¸Pƒ™k€½à ?‹­å‹ P ›¹4z(ø&FS½*Ø CØNÝþ™ßoÇêA¥V´_n.wäòè®êé–q#Çê°ã9øj;ên'o('o, r*7ƒ}¸¾öësïPß/ÿrú¶ïÔÈo7s3h‡’‹ìɦ `¶lÑt•‘?LòþJs\[p6½Ð‚@/ `™‚v vp³vÈŸ!xdØ…jð˜H× FxÝÝž’K7ïLÇêy°NãÞäõ_>{H@i¸¨;ØNL(½@z€X2!ØJ¨p!Æ @å!0)/B¬sÌ ÆŽŠ`aôÃV·-^é(a"Ka¶ÀŒ)s&Íš2þU0ef'OžêìéÉsÞ/ˆ0ÂØ´9aư¦NŸB• €4Û®bͪu+׬¨p*v,٨٪  Àˆ´fâí‚ØjYÙºeñ0“¢w/ß¾~ÿ,x0á†õ6¡c×î:XÜòì RZ4ªøBe1çÎc¿ðÒu4i­­Xð<öJ€¤3݈ÙÌ'³ÜN’ëÞ¾·ãÃr!°„ÞD¥ƒXl@GwêlÑXè¨#6 B 2ƒd«Çðî#zî¬#D ¶À‡¸,š [ÀÌì€l!–Ž‹¼3tù{ÿLœ:!ÿd!ÜÀzð·”jcQeUivõUX RxVþ³™±V[yPÖŒA¡]xV¢‰'¢˜"bЉøTcÍ&en-ÂNU´˜£X ‰¡Y–šŽÃ°¶l²AVÛmn € w|ÀŸ”0‡_B¸Œ¤K2P̤’w¸0$JGó…‘ V² ‘Dø])¶D‘¶à¢Ãv|@d¼$ôMGа™~Sîçßlb8È8ÀñÈ~ 9Lƒ?bº„•.f!†bxÌѧP‘¨¢ª«²Zbb•¾ˆ¡Œ³íà ü|PÌ©9ò˜éAVZäoGΦälíÈh ú[•lê@08$´Í=d&dÅB8pgKÔ¤`þE{¶|@xÚ›øEz&Ø"Mz£,ÔŸõ-bÔ@º‡J)Bàô¦(€@ahQF!Õ¥C^ê+„›îJ–§³Š!\rѵkª­‚rȯkŒ“ahfšULa¯?ìÂúFl’¶%œÛnÍöö,~4è"B6LK. 04žý¸ÒƸ¶ø’1Ž-×è gºß½Ù]t¶vtŠ-M¤gB Ù{=$tNG‡DÇ&ÀüÉða®ì£ ›A ºö°ŽÃLÅ-Ku1d'Üá‡!žú±È“Sn"É:š Ù¬ ×x#âž½\øh2ëHso6»elÂM>þ%Ï6ùìµ-LlgË6ËàÝI¶èR„-ÉX0ŠìÃ:Ë`vQ™ ƒµúnm˺øõÍ(6^”‚-`cô ï ÑPHGþò@Œ<À@Gî…νß-)q€My§µ7ߎB*iR‚ÛõbNt\9§Ad$-c ßv"*R™Ê3I‹ä*gÁ þårvÑ•X2ç–Í%¬V·ÊÕçž‚„Ï„F€£CM°Z“vˆ#)¨K‹ê†,e1ëu3‰Ýp¨õ[P _HÈîlÑ" DChÀˆô\ [(Nô¦ç]PK EV` dt¤:ˆ†Bt`1tÄЏˆþžÀ ]üë%SÊ` üÂ…7ÉÉ¢Ö@…¥Ž £ ÿê"{œ S©Š #–Š-ç˜D3 ¢8·0ŽoÀ\:óŠü/*Ä )/¨ÁºŒ"]ŠÓ„©,3›)á0ñ‹yH%t g¦Ç°Áë¨É …RC¾éÌ ¼ÑaLž5€Q$c8O@×÷êÑ[´Šø…’Œèø®!„"¦QèI<…ÒµŠáJØ‚` ,qM),ÄLFøAÄ]ÈBôÚ÷›¢ôaœ¸#?hq=þGo~ücß t š²,‚€ÈL1˦p—W!`¥þp‘3d N¹dZ2Ù@Lj3E9ÇŠ€ª¼”2§¦dÑbH}Ì¢ Pi¥P^É·Î¥G%TPvñ¨èR¤Û ]ŽhfˆÈkxMlŠ…3вJ̤’pl1ÈÃðRtâpnLAÜ!ÇBЀ…°3P@9ÐAƒ¸mÍŠlÒ…F’0h OتVB€1 %ìÃw=ÆEA_taÕx{ð´†Ô7D€² àøhÅ;`B?¡Ø¢ø‹!™Ò{s0Á,C*R’ óäDÜñ ( ƒ¥ja E8ªR-†{ΨÇSFY˜QõImÐ)wùrþÊ²Ôæ"B€SˆÚ£òM„¸â`Ëq‘=Ì N‰ªH©Ú"šBµà Ú“böä˜ ¼!–ÅÌg-à"ì˜'bƒ!Ø.p„.Øáè€؃ƒ'aˆ¬aйpº‹óÑÒ.Ð*ˆ8!¼É2\ j¶HÂ.ÂØê0€DáÏ g°! fÀã Æ8ß h!‹°B§ …<ÁJ\àpR=R `¦PÇk{[Š.L2É(YÎ: qÐ">ô(Á5|»KàJÅÉXÂ3žP g_0‡Ö±†xÄáð^®ƒVþR A‹cnsßÌ@ýx‡8ªaÓ¨h‘HÎ`±¦X—0à`Ñ wT¡»ºþ.Y2€Uˆ@7Æ!ŽaÞÈ ¬Ó±dYË„›‹PÌáV³}wi_ÑŒ€nЧÌc 所ÿ˜ÌeòìY €|‘t4"j ±l±Žœà ¡Ã*€Qoïl1`DBhŒmŽèLˆ‰»s _ ¤:X  `‹E˜AÄÏÁJÁ ¼ NÈ:B C,zæ ×½Â<æïhȼ[0F´~ítEŸÄv°# n¨CÎ!1” `‡¼.þpáZÀ܃„|!ÏJ#¥Š•¯œ ZÎqv°AsÀÇËcžY(dÂ.Ð…¸!ž›!äC”ÀƒY¬âŽLø&¢M,#Ö„‰ä<¤@ ¬C/†€ÆØA‹wðEZЫ^ …*@ÄupG)®¡*€`yˆ«^¼€_ÈCÎèGæ7€ÎKžò–ǼåXT &H¡ä@Ãò!"°€·é5Œ  á(9Œ4—lž#U Ðh3”€ c˜O¿àAnPƒÐB1€Å+\ႬB©@Å LQ RÄå$Ë …=‡WxIxÝT@-L%þd€p€xÂ'„‚(ŒB ˜À œB ¨À °@+¸À À,Ì-ÈÃü‚ÙHCB˜ƒÖÕÁ+è’¤ÎWñ\Xƒ4 Ä÷ ÃøíB ÐÂ,À ´ ¨ ˜)Œ 4@ ä„-¼Á@„ ÂóèÂH¬ðÀØŽ-´GðàÂg9Ä¿-Üp4\wH0pÇ4èpÆ%Ä1X,€Â1QŽñ  Ç^ÁÂBàB A2Ü œCd;€;Ê<Žc9žc:®c‰pCÚéC*^„ØTKÿÀ8†¬\_§µYäH’ (Ä2ÐDè•zÝiäK5(„7¤Zyˆ Ò vš:¼LºÝœ$xÈ<=w¼°†-`Ñ€ \ƒ2̃-$ÖV‘:Y‰ 8A8Ùþ‚à@$4Æ¡+È@TÚ@´Øt‹iqÌadw„VoLЕŒ-èU ¬C›ù)þQ,A¼C´AJÁ.ÀC6¼Ã¤‚^d1œA6˜èÀvIwz'xJuZ' `§vJ¤ÁAþ”LADÐ °*ÐÚ*Ø‚ÌB|œÁ´AGžÌŒtš ðÓXÀ£½AÐA>ìC?€ ‚ ‚!"<,#LT€LÂ$`€%ԨŽ…€° A‚±¤T1œÀŽ‚(„|€p€T%LÂ@Â#8B#DÀ"(B" Â(€x‚t)|ˆ-„Þ€˜€:ŒÛN”[݃<íÁ À ‚!0@",‚8$\@rÀ|‚€  @*¬À8Ü‚) ‚€(Ø/ B}ŒC!D <Â=CøÂ2(ÁY UVe×,œ.œþ `Á*xÃY*\¥j CLÂ^Õ%ລI qÅ*0P¿€˜ƒkñÑÁHséÁxðƒ tÁLÐÙXˆÏ¤D`A"ƒ¥x¦TZŽÀOAÄ9T%W2¶Ô26h©<ÀbX; €¥ñ@1(Þ`DÒ Xƒ ^TdG°À^¨€rêˆ'܃^L ì$8¬IÙ'ã¬Á"lÀbÄÀ–4À3œ]$ @EÒƒ¨Ô±ízñÍxH˜Ãç<-@ÿíA/PWµ5ÒµQÍð‰h ‚ÀDœÒ†Nþ”°Á"XYE”@#ðþ 3è  C BØÁp ü‚ 耾¡j‰YåÖ ÁY^€ „*tô  DüÂ,€¼ƒ7Ô[7àÇ[º?¡A&`6DB Å„^îÄ›ñ #ØÈFÙgˆDpC´&Huëo=Ò®øDœ%tLSØ&Oà&†4#`ƒph\„ @8E¾ ã‘Ã84ÁAN7üÅ=LB6ÜÃ!ð@„˜TèÅ+Ôµ€èÅ5사‚”†ZŸ†æ&+ŒnË4Â{Õ@<ÌW  Iéè‘\ĬÀVýWWþÝÌ’ü‘:”@EBŒÕ³<ÞEHƒÉ(¼žÕÔjw4ƒÈ‚1,ƒ ØÙ’aÚ²‰Ò CñðŽ)€-ÌÜpÐY¹   ¥Üø* Q˜Ë"L$«D-+ßøe<(Åä.Sid®SøY#}k‹€;hÂ3˜º.×Ý%ŒnªIorÆ…7X€W7–ˆÐÑ*lƒìÁ.}Žƒ °@§"¬„Â>ª@+„ð®Ié,БÇb§¨‚¼|‚ÀÂú>-@èÅCß±7°±ÃqïuÆçÂ×̺ˆù~ÐG& ‡’ "ÐÒ0LGC©TÑïúìþ‚ÐÌ>@´‚sN“ÒbHÅ*|ÁXGYYD CŠ)D€-Á³D6à‚)°DãGÇ`A#8u |€'à ‡¼%8Ç¢päà $…âšãBF³Þ ´îȰ×S,± 5±ˆdƒ¹NqÝmšÏ»º«jôøÁ©ÝŠ ÀƒHAžå€,5àƒ=`,ÄÁ|¦CEʃèAÂÊ€;¸Á X^XÁx>T‡^ŒÊ„‚DÛ7h4G{tõR´Ec4%sF?uE˚˺̀̆ò0L, C.rKöþƼþÂØÒΩ[0­ÓB­.ïrBhÂ/ÄCD‡ €!~(M%€3[ 4;„Õ°ƒ -”–B´-4Â- AZªu~Ôð~¤A øAÁô°Îýðl8îFFnàÈs‹Ü³åsÅ”îNœ®P¤îê.BKí–õêÚax¯X´ïPi²+q²[ăú²ïQC=›ò‘Ö×SW•¿ /JosuWÛ„‰5wˆs¡|mŒõu«*K€€ôAùmC €-€4XÐ÷BnRÔÃo¨3;÷DûÆ´ªÆc‹NdïÊdgˆº o¶ gcÄ… ìÃgFh{Pþ 5Oxò€2k—ϪP*«†é¸†UÓ²PØòàro“Õp(C5¬môÌjv³[œ-,ƒÀ6ä‹sBP ŒØB¾`øvëÐwóeO¸ó³Fëx7¶ˆ˜wá ÷©¨we›@ÏÁ»"Ž|_ÐBó%àwaèwgð÷i÷Qµ€xS#©lßm'¸mç$n§EV?-„7SY5¹Bðuº¬„*†sMwü€ðƒ;8‚󤹃©©X ÐNv³øë¸øa÷DbCn‚Ô8…Ü8Ìä8§ì8{ïÄe³îçù‘CºwñTŽ,9úöDjCÄjCy”öµQ9¶Y¹ aù,k¹þOèö{ù—wG™³I{èÃJ¨¹Ch¸Tê€)@г• PxшSåžóLŸ»…x :§ºÄz¥$:@¿Ånj±£‹q¤K»`$9gTº[üw€o:§×¯ý¶‘Œz€-xƒ?xªG¸š€ ˜A¬7Ĭc DϨBC3¨žÿuo »PÄ8g >1¾œÚÕïöíã¾îgý¬S¥<Á­xÙërŸ_þ,ëò×óOLçÄ0 4x¡ÀlÒ˜qø" ep±$aF‡áa&dH‘#I–4yeJ•+Y‚lB‡#Çu°@´i¦áÌAhP¡_xÙviR¥K™&mÀ‚ЄWl±z+V7âÜ|ø €#ö¬ú’mZµkÑ ãc n\¹séÖµ{oÞ¼Qéõ‹W—. ÇmâĪ,pürEüLtQ|y © ©0lú´RT8l6=l¡=Y«Y·æVq΃ӳzlywnÝ»]¤-p&–5É÷!9йßËc5zÓ§Q—S½þ¼ek¾vÛ¹s!™Í¢ë㯻-|}úº|Õ·w_÷0yòŒ%×·àŒ!ùl33Ö9è4ÿ8Zè¾±1Ã@©lã Â%¼í%æfJ0AV–iœÄm¦cκ˶ÂÐ>hèØÅ´Ì{ÆåbOÆ ‹¯ÅÄD‡Ç}ìј5rL«?æ qÀÑJë¡%*xÊ(¡¤à&Ât´Ü’Ë.½üÌ0Å“Ì2ÍÔRß~C£Ž6Ý|ÓMw°ÒÊ‘ŒnÄꪺŒ|üüÐ?WgÈB_´QôhL”Qø+ÒH¯*r¹ÎØÓL5Ý”ÓN5¥¥@:Eµ²ž4þL=ÕTU]•ÕV]}ÖXeEõQmÕÎ;CËó·%ýµÅCö®E‰G`••Òß:CÚhí[òÖj­½Ûlµ­€;ªøÜpÅ—ÜpÙŠÄ=—]W1a}.cáE4YvíU«YÚ `†ß~ýýà€VdÛ‚ >á„m%JÚ†¡¥®Wuïø*wç%VÞ‹e¬—bŠóUäE™ä’ JF”U^™å–]~YŠt;žÙbÍØæ÷8žÙÞMþè …šh©|åÙÞšs¶ç¥ÕÛée}.šêª­¾ëjŽzY¥Ž±é¯Ïƒšë_§Îí´Õ^›m¶.ûWþ¯Åv/ì¹ÿ"nHÏn›ï¾ýþÛà·ó†Tn»Ó«Ûð¼ð<ǽòÈ%?MpÆs,<ñÂ2æ„F)ˆ¥+¹ûQp8ùFŸs ™ëÎ -‹®sü Qš8åTžÉ–Ú¼ŒžºÉt’™œèß+ ~xl‹?ž6Ûq×=íÊ-gQiÎ==s½p®e4X|¿pLáU*@a%¸^€uвDÙ5“j…@È6ÿÙ‚pÄ7”­~à ÈÚÿ8Àbë€ üMÿ²±?´YïzòñZùÄ×½½ /t)Ÿ-B—|€&0Aâ2 ˜Â2ðD`a‹þ¢†&D¡ Yh‹y˜‚¥! ¡Â /ñY>8q¨` k˜<Ò ØÐÐG&`,j‘‹VéÂ(Êq,€à*Rtƒ>¸p†vlA õ ‡Uê1‡ŠÈÏ*R¤¢·ðÅ<Øø)²„  ©˜Æ@2‘ Œâ£¨-†±P²‡Lä"‡œ"«$4‰Šhl&‚’P xÚˆÄ@¤@ {ÀA`‡ô@N쮄¥, "‚3àçIÆêƒ-•ÃXe+_ËY ¤–·Ìå.{ù„_³šÄˆ1‘©LfJÆ™³éß0YIM*þR ž¥(‡I¨™(Â@,‘HKŒÓ¬H,jÕÉO†r †D$<ƒBÓ¡Nu¬‹šë`—Ù•ç-va m¸ÃÂå‡A !dàS”`4ˆ‹Th¸x ©(E+ÌR 1.'LáGéò=¸@p¹@1àb„ÀÅt€K>ˆ—Žp¨E=ª-N¡R[ B.#Tb€7 …ãÈÜàŠ-dȰ@.äa´ª•­–YAJ`‰ÐãV4 ![øC pF@ŒŠ(Eü®Ö±–õ¬imàa¡ô¯×ÔR Sd}ˆ!u®sþ³ýì0V°Ïa4‚ ë4Í· …PC à A94!ÀA†Q 8àIг¡ î¶·¿ î0Ö€,€uhuÀ8<óg´µ-nuË[ßW¸Ä5.r•Ë\ç>ºçnu¯›Ýí®¡»‚ø®:’Y¤vžHk[á`´‰ˆ" ÈF ·Ç0°‚»ÖÀð€ô©}î‹üðˆúgƒ? ª-¢j £Â¥ªpÁ*\ˆq¥.…À\ð€c¸È`¶ÀÁ)`lÕ³˜¨.žê\p üÂq! ¨L‚¨”£pi\F8å*_Ùþ÷p …¬’n À± v š¨C৆-À w€ñ¼x¤h x³UÔ±‚³è¹ÄW!±UÜ g9ÓyÏ0Nœ‚ž2NÑéSÔbŸí=O»iOzŸÅ)Ñ…ØÒ怒ÆáûP€H$8ŒTFÐÖõy Ø`&œ€‰&xMëŠÌºÖ·F®ñ°ë^ÿÁ–̰‹}ìd dÙ³¹t¦MíiPCÕ¬võ¨_=ŒÕ DÔ¥F÷ª[]îNŸ(W0E=VñŠYÜbû(ð0naŒeñ™w<ä%OùËûªo|A³ÑùχÜo§MÜç.¾Äï€0AÚùnvêù ¾¿™+@«`þ+YÍúÖµ¶5²pÅþ\ëz×¼na¯}ýk`[ØÃ&v±%v,õ³otÐõaÎw~—¢.( GUžå§Êåþflèð§l¡F.4ÁÆæB”ÊòÁàBà"` ..\ .|aÉLͶ ê@a~¡À¡ ÂÁBja >$,àcpkp Z€\`L„` Ä!°AÂ!¬êêÊÜaú@ë  PPYÐaPÄî²bN@ BÁ Dkü@¢Âfa ÌÐ þI ’àÝR6þ缡\þÁÀøáà¤!†¡¦à ÀÎ%"/A   ±1‡ Î !ê@™†¡ ·~HodøÐQ ÑQÑ!q$‘-cq;ñCqKñSñ4úg Ëð ‡BÔÐ ì Ý ¬ž’o›qèÐ4®`Ö,+Í*­Îô,ÏʱÏþ¬> !Ðm íÐÊ+ÊNãlÎÊQ‰l.0P.4Ð8.|ÀóÁÇaÇÂÌÇláÿlA Ò0kn.8GàBVál NA2@ââJ¡¡|þL@r€ àÂ#AR$áÂ>ÁsLà âBRA4a$ïGº® ¯*æ!à€\` ø€™ÄÀ)¡¤RP  ò ˆà¬âx@øá f¡ÄX@æ€2Ê¡>ê °R)™Ò)?àÏÆ!(l'\A ŒàVÀ>à'þ+P0kRÁ|`Â/S0BHwRa ¢XÁBa0… *â†áˆ€ Ž!ÊAÒü@ ¶!ìá ràíPÀôá5`Á4QS5Ysˆá øªà¢Ü€Œ!TQd>Bs4Kó4Ssþ5[ó5cs6kó6sS:yÓ7S8‰Ó8‘ó4ðR/ùò1s0'³2/³ž*!R ”1às H  òaa‘Ôó,Ó1ÿ=…â ¡éž.ꦮê°N~;¸ÎëÀNìÈŽ±ÌnBÑAÙN~òQçè#5’#c2$²&o2'²J¡ ! M Eã☡&R XhDG'aò#Ct=,2F’^'ƒÈƒvüCðªfô”I âH³¦H†*BpKðSp[ðem sÐyÐP‰Ð‘P ™œ ¥ ­ «t qPàÅGçq £NHƒþÔ~ª¥I‰&<¹’”P "P•mþ´`¨B(‰Ò(·.—²)±è)£r*-õ*³r+»r ¾2,Dz,Ï2-ײ-ß2)%u*+èÔiîÔ/ `˜ÁlfOùT1†ô7ºàš@°f*‚F±P õWuIXÑÆvN`ƒlµ]2 Q8g‚Ìf\Õƒä¢Vu-puX»Õ[¿µCšU[×s®õƒ†È\õ"[Ç-¸\ß^ã5&Ä•]ÛZÓUQx_•®^÷Ã]å`V^éµ_+æ^÷•0¬5]×µ`·à_b#–P ¶aËa™L_/–.¶`Vb?d‘‡b Öbþ56^2Öd ãQ3î'd_f•sdûµdMVaÓ£r¨Q8¶_=¶C.@bVh?h¯efëµfa$g%c8€¬À8çÜ#O7feY„-%~…¢üÕe™£n``ò€BQ«Ey*˜ãy†6[ êÀúA#ÚÖ4ìöZÂöƶlcâlÃUbX–\¶.œj¥–j™e²åÚ£jc„g±b¨êáWäq<|6#ú Pî&  y–cIÝ–N,`Najáö!#N—#dWT8×sÍÖhWp]„pù1èc÷!uЇâ¢HP` VªDaþʇxy*` T@âÀ¦Dj« E¿hà¬â˜Œô *áÎò ~L˜ä'â*bâú´AúÇ DA>Sa‡ÁRÀ" x`©¤³ªeÙ>Sî i°èäá°a|­›¾)Ω"Ò uE% äá☡&˜*¸™ø#8„}i„—©„¯E~é—ŸüIõ—ÂX€™df+!ð 1º¶Eˆø2Êux=ª‡láx“wyáš÷yuh§zhz«÷z³§Îµ.œŒÊr¨Å^Œ.D.aóa„*ÉÄØdÀB'.b쪶wHäÑúâþj UH\ FÁF!~Þ€°ä§ü Îà×@.M¸¡ †Á Âá ýÀZ³w|Í®eÙ&„àd¡²†áààôAÚë š«×ð €ô+ƒGå Àâöà–«•ß‹»bù»Jù”Sy•yÙ•–½ [Ù‘"’‡áÁ(¯’/y¶!“ûa“yXwÙÂöÀ ôÁ×s壜٢\½˜ÀxU..ÈØÌx©Òɤ*.ÜŽ‹LƼGx[Î˨ ÌpaL€HAàÂä"„þYäàÂ]®äè8Gä%OÏ8u H mA'ôœoõkþ™£’ÁªA Œ¯d‹žÜM™B J¬eÙh‘蔈7‡!à °M‚hw–ý£–oY r x:÷$ön:§wúõ`©aX HÚ¤ÝøL‹ VÚZú¥w<ÌLá*|@}×A}«}`ŽÂw|Ë÷|Ów}áHŽŽ¸wEÈŸC. º Ú:.¯­ê¡Iæ¸Ø®wå¢Ö åüúäl!±QŽ._ëxB ³á'‘5@¾€A1›YBz9Öi²¥­z Vº "@¹ H÷Œú€æa ኺ©}ú§—cƒ;X jœ¸ƒöd»ÀjÛ¨…ª¢þ´Oºª¯1µbµ[ÛJ(6ìîá*$`ÔA×ëÏOùØy»»Û ‘éÚ/2²áb±[¡ëÏw'ÛèŽÌ. q' ã¢p.º!‡á …áç{¥âB"í"r¯br «r¯”KõŒDT¡Za @À¾°ÌM3W´'h 2@b•{’¡Ñ"A9¬%tˆt‡ú  è 2 FÁÈ+± B%sÛJ,€N`hAôà`‰ÜÈMÉÙáðÃÇ\È©<‹œ±<É­eLÅ©qV|´Z| ^<Ƶy<ªþûº÷À³³Î£/~0Z£9´?Z-¸å(R.úû¿|À ü°ÁcÑ.Bài£–ôÀ@t&m! PT %Ÿ.&Á$'A‚ ÓRÒ©,â¢Fo(¯v?°Hk/µ*õlÎ °€ÀÁ*\ ò€ à®Â,Ñ2D¼AôöT€ä“>©09€®i ùn…9Õv>³ÆÀÀ.èÊ@ª \‹6m`a Šó8“SÉ™$°š€n"Ýo³ÝÃ3øÆ½ÜÏß±sÝ÷ýÝ­EÙ™ÝÙãÚQAÚ©ÝÚE…b½¬­‚¤!³ó¼Ä4û*þ8ûÎ;wõBÒ·Ò/=G3}Ó;ýÓC}ÔKåeÕ;‡V&mÒFK´X7eÜœ/»gFa¶ ‚I·ã}hŽ~mˆ^â·y-<Zz!ôCÃ9ÜÃAÜžÐt‰Â-ï¾Ãà÷  ·Þž5eÿâf¯ÕçÉCP/à&FsEE˜ d¨>mô~rî¾éå#Âá¢@ˆ{ý׃}Ø­¢ØÓrËo=×wñ]؉]T=1’öbÛÞƒÞ~=¬wêèÓ›´Ž]ûyïàÅŸ—hž¼úû/cFßoSöî ºýÇÖQîB=õÖÐsvpЈSÏ_Ðô\`[hqW8[t1J9w`BA,%Â9òpBP ìÀÎa$4~Y™·Eeˆ£Ä1Ý”f_}]qãøhÉDÌ€nT ‘gpÆ9IШ¥V6â¨#>V¤DBÚE¤‘H*Éþ¤QOF9e•Wf¹åW®1TWcíÕ…n1Xaüä‚<HèN·!hè¡ 2ôœ]u¡s}nqaAœ[¬PF –¬@ÏÕC·°ÒÄ€$ÄàƒŽŒˆÍY•yv…V ã‰9ßÛaÇ0$”£‰$À‰DÝl,& 3Ì„°u4cë¶,ájY‘¼ÎG߯Á 2l±Ç&»ì0Í­´ÔZ‹­¶ÜnUçB¿7\sÇ%·\…—ZР‡Ú²è¡‰îæ $0CB4ÚèBÏEà?c°sCOcÐpŠAm¸QG­è¡ÐŒõªd ð³EcNþTsyó¹Ó˜6@ ET°aO'ÓòÑ%½óÌ=ÿ(nÍ:ßÅó¸?OôÐE#Õ½ 1è „òyÐÆÚÅ¡‡ ŠH¢‰(ª¸‹.¨Á.ÜðÚ°€#8q×xuáÇØZÚ1†n±Àâ pja…ñ Ê å„­Z§T_1jøê4y5³ÁC?¤÷óFÓeÓF%¯„ƒE™ÇÎÑæÓ,.ΠÏ'z馣>‘ꬻ»ì-qУ€$)¥„c˜)ppê)¨¢’º…©F¥ºj«¯Æ:kBtÚ7‚{ÿ7¾€'”¯tÔ‡Ì]ð@[?póD ãÎ.üþpÁ$L !Äñ“v€À7À‡90G<’°çY˜ðDø¡ÃP¯óA‰´Çú;fÁS4àÒÈDâÐÁˆC"X8C$ƒ:È©‚@”È3(‘ v°„"<"‡q®°…/Œá kxÃaäp‡=üaOb<„TìbãX¥6f8 }ì.!{ÜÈ R²“¥Ì,9)˜äh‹òíÆrLBÎaäNF©Ã A’Hs`F¾€‚2ä! DxAÄp„ìà?° •Õj‹ƒ]B0‘ÏÅ7 Ç]PÉ$7ÐÃ@BÊ¡tðÀþÇ]Z!bœA“U8(ƒ(J£R"¦+UiVJ¤®„¥,iiK\C—váå0| La“‹úqTৱ‘qc‰c\ãÄhÈM®r—_éˆG9Ú‘Ž¸Ñ£Àö9•O~óŸ ¨@;ÓѬ¯}y_üòg¿…Òo ûëßÿ8À0 ÜBÁ ÊŸ ½'Hg£O~ ŒeM©JWÊR“Ô |4Š BHCÖ4£[`"ÉHGBR’[ ¤],¹Lj’“p)EªÔ·”Ô¤üAiK§JÕª¶ô¥PåOøšº¦r5-OÍ*l¤jÕ²šõ¬ÄêXa³Õ¯ÒÆ«n]JþX×Z²¢õ®xÍë}ÔJײ´5®p+`‰2×¾JÅ®zM¬bk¯pV«ólm+YÞ ä±'õ'c7ËÙ΢„¯˜…Ê_+‹Ê’V.— í~&P†]¸öµ°­lgKÛÚÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM.oáàXÕf´§UŠi£»“Â:w&óˆ€v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúª× ×ekd©«–鯥°@_jóKàøÀN°‚Ìà'•«.m‡‘¢Þ`Êùâb]{øÃ ±ˆGLâϺC©0 þ.œá¥l8.6˜Np@ ØÄ8αŽwÌãûø5(Š¡hlcÅØPKàO,`X`ɥŠ• Á¡hB1œ:à{ùË`³˜ÇlØ ÉJÞ “ e)SÙÊXÖr` „XàÚ0ÇN àa:Ä=t’]褕ÐI<ö‹–“ùÑŽ´¤'c3ÅÎxÖ³Nøìg@ÛBЄ6´-­hF—–ÎEæÅ Œ “ð$:ñOÜb‹øÂÐ\Mé^ûú×Àö>- C©šÕµ~u¬g½[ãZ×s¦µ‹wr´ZÙ¶õNhMŽè î²°ÇþMîr›ûÜ !öOUíkïÖÙf¶NºýíÙy'ÈB ûl‹{xzt ´0xb‚d#ÜèN¸ÂÎpH«Û'‹Ê÷¾uâï@ÜùøN ~p£Z)*&)(°d”<™D)J0 YH`'}hIÅÝðšÛüæ8OðÃyò‘—üä)_yË_®“˜¿õã#}‚!fžó¦;ýéP‡êΤô£K{¤”Ó£Îõ®{ýëé65W³nõ¦r‚ÐhÄÖÁÎö¶»ýæSÇÍÙÓ^vþ*…×oÏ»Þ÷þã¸ó7ƧÅ;ßOøÂ;ØïÔ-ŸlèKÏúÖg^ò§M=`WïúÚÛ~ð°'­ìã*Œœâ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùоô§Oýê[ÿúØÏ¾ö·Ïýî{ÿûÈççO/”ݻՖH¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ô×qäÇæ×€8Xx˜ˆtØø ‚"8‚$(‚X‚(˜‚*¸‚,Ø‚.'ø‚28ƒ4Xƒ6xƒ5ƒ8¸ƒ<؃>øƒ@ØT:„DX„Fx„HøƒC˜„LØ„¢Nø„P(K…TX…Vx…X8Y˜…\Ø…^ø…`¸W†dX†fx†O8…h¸†l؆nH~jø†r8‡tX‡z³…v˜‡z¸‡|X0q؇€ˆ‚¸†8ˆ†xˆˆH……˜ˆŒØˆŽØƒ‹øˆ’8‰”ˆ‚q‰˜˜‰š¸‰œØ‰žø‰ Š¢8ФXЦxЍ˜Šª¸Š¬ØŠ®øŠ°‹²8‹´X‹¶x‹¯;mod_perl-2.0.9/docs/user/handlers/http_cycle_fixup.png0000644€ÿÿÿÿ00010010000021461711727205031023275 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæñP½ïÿ¿g3cÆN$…ŒPI›’(R©Þem¡}ST´‰¤M”PÒ&Ò¦Rz·(ÙR¨d+E$i!)[YÂ0ûœß÷÷=?[c_:Ï?zœ9ç>÷}ŸÌœó:×uÝ×µoß¾Žõ€‚‚2@… ÊÀÇÙÙ™B¡DEEÁ°›?‚ ÈÇ………mllnݺä 2$))iãÆµµµ‡VQQÿþmjj —‰‰‰ Ò^^ž²²2œÌÌ™3ååå›·ÁápD"‘B¡Éd/³ ‡ær¹‹-=ztÇz@AA ËËQP>²²²[¶lñññquu}üøñÓ‡ ræÌ.—kll,''·fÍš¢¢¢åË—ß¹s &&–šš*##WVVŽ=zݺuœFMM»»»ššZZZ¿BVw——#¦{ÞœC£Ñ §¥caa¦Òù@…Τ¬¬lË–-½= ”?s÷îݻϜ:¯_¿¾wïÌnÜX,ÖÌÌ ÷˜˜˜0ŒAƒíܹÓÓÓªœÌÌL*•êíí-ÈæÌ™chhH§ÓEDDºUåvîÜÉãñlmm;@¨“”——oÞf;rö ¥]d=(577G…Îß*t õõõ999üôù(}[[[Azì>K¡PöïßoooïââòÏ?ÿ´íº{÷.“ɤÑhBBB***<ïÁƒžžžÅÅÅ04çÝ»w–––ׯ_—••m£«âââcÇŽMœ8qåÊ•)))Í+auaaa©©©ÒÒÒ½•;GLޏ"h\¯ " Yáe½=”: …bddÔÛ³@i‹ž•\¶lY@@Àû÷ï;Öv`ò«W¯äååýüü(о¾þÅ‹ïÝ»G"‘Ö¬Y#++ ÅŠ††Fxxxk¬êëë)JNNΠAƒLMM=£rØl6,±îææ†*GAéZihh P(ð#Nçñxd2¹/ÛÆP¡ƒ‚ò·€Á`NŸ>={öìÓ§O/[¶¬JŸÛ·o¯¨¨`³Ù"""œ8q¢„„ÄðáÃÙ»w¯¡¡áìÙ³[S9 ÉÉÉyyysæÌ™3gN·]S ¸»»—””Œ3fùòå=9. Ê€–ïÍÉÉÉÊʪ¬¬äp8ºººzzz †ÍfBoϱÐUW((&L€KÍ·nÝÚFõæ!C†hii9;;oÞ¼911QGGgýúõoÞ¼dff¾}ûV[[»ÅýúE£ÑÈd²––VVVVw]Fë|ùòåüùó8îôéÓ}ù¥ßÑÐÐ@"‘<¨««kkkëêêzàÀÙ³gS(”¹sç&$$àñxAètzoÏ´)¨ÐAAù»pss4hPZZZHHHó£eeeeeeS§Nݸqã”)S¶nÝzâÄ —™3gr¹Ü &<|øPRR²ù¹“&M***lÛ¶H$vûÅü/‚lܸ‘ÍfÛØØŒ‡†È  t\.—L&ÛÚÚº»»7yGB$66vîܹššš.\èƒ/¨ÐAAù»bÍR IDAT€‹¤œœœJKKùû<8oÞ¼I“&}ùò%**ŠJ¥jiiedd(++ëèè'$$p8\ãCCCóæÍ+((è á­áï™)//߮Ԉ(((‹ÅÆÆÆ^¸p¡6¹¹¹¶¶¶}°Ü *tPPþ:,,, ˜LfcVnnîéÓ§ i4›Ínhhˆ¯­­Ý¶mÛïß¿ñx¼ƒƒCó VyyyRRReeåž 7n‘âââ#GŽÎœ9ï Š‚‚Ò%`0˜W¯^µÝÀÚÚúÕ«W~~~üru}„.¸+544ð·¡Ñh}í"QPPš$%%wõêU¸gþüùMÚ0™L6›]]]””¤  °jÕ*þ¡øøxccãšš ÌÌÌ7n‚ +W®d0Ë—/Ÿ9sfïNe@RWWׯQ__ßÐÐP Ç/Óœ††NGár¹\.·3ïìª+Aµk×JJJ~ýú5bĈ &Œ?ü·¸´“ý£  t²²²þþþK—.uvvž6m•J>|¸ººúÇ›´äp8ÁÁÁóæÍÃáp‚Ô×׋ˆˆÄÇÇoß¾|複Åbµq[Çgff:ÔËË«“]¡  ´HBGRRrÇŽ= h± ‡ÃÁãñß¾}KMMmïÐD"qÑ¢Eûë”ÐA$;;ÛÈȨªªªñ~qqñuëÖmß¾B¡0 ÐÄ©‚‚ÒëÌ;×ÊÊêßÿ]µjUBB‘H477o1Çq||ü… &Nœ¸jÕªíÛ·ÛÚÚzzzv~,ëêÕ«W®\IIIéL?/^¼ðóóÃáp.\@ç  tmD4¯¨¨˜——§¡¡Ñ¤Aqq±¸¸8@RR²½`,+!!A$?þÜFRŒ¶zèÀ96›ýåË—™3g6Q9€šš???•E‹edd *¥Ï2kÖ,Õÿ˜2eJ\Ù­?~\EE%77wïÞ½“›‰ŠŠZYY‰‰‰ÙÚÚv~\.—:yò䜜œâââÎtõëׯ+V ²k×®)S¦t~n(((-2dÈÖ‰ŠŠääävïÞýåË—æá+ \.·¶¶–ÇãaÚ‰°°pppð±cÇ:6óŽ[t‚Meeek ¸\î½{÷âãã322äää:\‚¥ûX»ví‹/ââ⬬¬¨T*‰Dêíõ("""×®]›9sæ¥K—ôôô,,,Èdrã¨; ¼SWWWWWï䈂DFF9rDNNîÆãÆ»wï^‡{ãp8«W¯®­­~ü¸ªªjèС}}ýœœ.—Û¢3úüùóÕÕÕZTTÔÕÕõåË—8ÒA¡kôdff¶ÑFMMÍÉÉiÅŠ$ ÞPPúË—/—••‹‹Û´iü­6†Çã]ºt鯥¥¥jjjÆÆÆðPddä¹sç ddd”••ÓÒÒ†úìÙ³vŽ Èׯ_á[ ‹å¿Á4Þ´vˆÿÐ≂0zôhooïíÛ·ÛÙÙ©««S(”æBGNN®ÅÄ9í%!!áðáà æÔ©SÐ|Íb±`BÕáñx, ‡Ãµ–nuÿþý©©© åÓ§OT*µ¹ji¢f: ‚ÁvM*‘ó _}N¬<þk^—ô†‚Òa FóB¼wïÞ>|8›Í¦Ñhöööþþþ333X¸ ŠŠŠ‚¼4'==½g5¦ƒB‡ÍfãñxÖZee夤$ii骪ªïß¿·æWKJJÒ××ïØt:ƒÁümoá(=†››ÛÍ›7õõõgÏžýêÕ«Í›7=ztñâÅááᎎŽT*uåÊ•ïß¿OKKü±$xsØlö„ ºaâü¯îóçÏ;:\.—Éd¶ñ†dkk;hÐ ##£ .ÈËË·ØæÛ·ozzzAAAm¼Òµ†±±ñ°aÄ……ëêêP¡ƒÒ‡††ÚØØ¸¸¸¸\îúõë}}}---ýýýGŽyïÞ=h¡utt 777ïÀ(°zTcI“m@k‡*Zì¤]3¡R©ùùù-jhhàr¹|󒨨(¼‹áñøaÆÁµWBBBcÆŒÛ$iÚ´i0.˜L&›˜˜ Ãн#GŽàñxSSS¨ 0 ‡ÛºuëôéÓåääÞÞÞ«W¯†ý9;;Ã¥222wîÜÛ²²²ÞÞÞk×®³X¬Æ2¥±ši¼¿ ŸŸ?ÏÊ@–ÆNªYe9Qå:+‡‘Dñ€Š‚ú÷~òÚï®Y¢ ´˜›*44433óÍ›7‚\»v­´´´Éº £¦¦Ö†6())ùúõ«àãr8œÏ™OÇctðø¶Î•‘‘ár¹………‰‰‰zzzjjjòx¼ºº:))©ššXÖ¸] IJJÖ××WWW·= ”ö’½víÚgÏž}úô AKKK¸‡Ã™šš&%%UVV­]»–ï‡622 ïÀXBBB]6õÿ¥‰$j.š|d0úúú¿ÿVSSÓÖÖŽ‹‹ûùóÿ?qùÙN¡-n‹ˆˆlÚ´ nS(¨<d2yéÒ¥p[XXØÂÂn/^¼8::ÚÃÃcïÞ½{öì±¶¶ÆãñAVV–×ÕÕ…ÛaäÈ‘pÇ«¨¨ÀíÏŸ?ÛÙÙq¹Ü­[·òÿ@ý‘ñ ‡„q9QåÚV ×m2w§N/É©{ÿè'ˆÍ /½a—Åã × C©aÿ—ÑK'±¢ ž@ÂÙGOÁ`1g楲éÜAª”Ý©Ó_^ÿ~Ïé=‹@ƒÐõõ™YËàéW–¿)ýP1]úëËj! No­’ñî}/Y?J…Åb}ÿþÝÜܺ¥0 ›ÍþçŸøÈ”)Sz¾öËéàª+‰$,, W‹µˆ¸¸8—ËõññY½zuól:,KLL¬¼¼¼¢¢‚Ö~ðx<›Í>þÈ‘#AAAÊÊÊX,¶]6ÝÂÂB“††KKËSêáÉñ/µĕj¶²Ž¤í½ÉâCHÃ&HmU³@®IK}% Çary„Çáq˜<‚0N½@YGrÌüÿß~âþéFÛ©Z ò“«ÆYÈ+Mxâûåé©– x((M`³ÙBBBééé;wîLNNÆ`0yyyòòòIIIMZòßRú4‡@#°‚‚BMMMãý>>>æææ•••“&MJKKÓÒÒzþüù¨Q£>~üØx½ƒáp8gΜ‘‘‘éÀèVVVC† ©¯oÁ·‚Ò.BCCáo5((®,(( B¥RçÏŸïëëûæÍ•ôôôwïÞ9;;„-[¶8::š˜˜èëëçææ¾~ýº—/£‹ R©‰‰‰›7o 433‹ŠŠ îÚ _¿~íëëÛÐÐ ¸Ðùö훉‰IEE…¾¾>I];±ÞâÓ³ ¸Á€Ó¥RÄçîQˉ.YÞ¸¥þ%ùQ¢——¿´x‰Áb„ȸõ7'ªèJäÔDÆ/­8€Qsdy\ž>ÞRž@ÂfG–Íua´ ¸¶.óéÙ¯†*XjÕAi ˜½æúõë07ú™3gׯ_5kÖ,~¨®¤¤ä† 6mÚÄãñúÚ³S~eeåÜÜ\þÇiÓ¦999}þüYLL,$$䨱cïß¿ddd4ÖlÙ²¥‰KK@ ;:e”ÿáÒ¥KðëtóæÍæG}}}ÕÔÔîÞ½›’’¢¢¢âíí½páB€™™‹=wîÜÍ›7lllüøñãžy7A¥RÃÃÃ,Xpûömx ,X°`AwŒ¥­­ZQQ!`iª¯_¿š™™ýøñcäÈ‘ÿþûoçó)÷lni?ø**'ÍŸª'5aÑÔ«ßz6JPåÈèþÏÆ3fÁàìˆ2ZKL°AQþB dQRRÚ½{·ÜÉáplll~ýúåââróæMsss3lÑh´&tf̘Á_ì€Á`|}}i4ÚÔ©S+**ømæÏŸ?~üøÖêS¤¤¤´ËÅnbbÒvõT”vÑ¶× ÇoÙ²eË–-Í™˜˜ðÓëݸqãñãǦàÉĉoݺemm}ëÖ-&“yñâÅn½m hÖýôé“©©iyyùäÉ“#""’ÊȪ‰ØÞ,`ã'¾_R¯~6^ ùâ7ÑAÄY;©ÿÓâ¿PP³i@z~R•œš ?¹OÄ’%»Æ)‰2 Áb±qqq ,à»éùìÙ³‡Ã9993fÌ€¥¼:5M”>Ffff`` —Ë600pssëíu1úúúQQQ .|úô)´Ý¶±ø [¹s玽½=‹Åš3gNHHÈ@º™<òüTñµr¥ˆ"%4q‰\dxv¶¤”&IŒ³ÿðø'€Íàý.fà‹È +Ñ[¯8t¬øÐ±âGGÅŸÊÏýIÁV)y_÷õeõX³ÿËñ1ÞrHNL9‹L·Sž iA">ÊÊÊ7nlcu7—˵²²ÊÌÌTPPèË*tXè°X,‰äââB"‘8@£Ñ<==½¼¼š¯ž×ÑÑa2™éÞ„‚þ×u5PÑÒÒŠ·´´ÌÍÍUWW¿y󦑑QON€Édººº^¾|°eËË…Ó3¸¼j5ÝNk‡\3 ôúÑ´>¢ž’žM 1‘ãÝ#¬ÏjµcŠ(%ÙÙÙÒÒÒ\…P__onnþêÕ«ÜÜ\¸B³oÒn»%L¼Q]]­­­}âÄ OOÏ &TVVzxxX[[ó›áñx{{ûÄÄDYYÙcgFAùÛPTT|úô©‘‘“É\¸pá®]»:Þ³c|ùòeòäÉ—/_ÆãñçÏŸ‡µ#zfèÇÛ¥wJÏÎÀ„:((m0f̘»wï òcÏÍ͵··5jT_.ôÔ>CKQQ‘¢¢â76oÞ\[[ wæææêèèÄÅÅ]¿~½®®.22’J¥¾xñB^^žÍf³X¬>˜>E@DEEïÞ½{òäIOOÏK—.=}úôêÕ«šššÝ7"Çóñññõõåp8ÒÒÒaaaZZ¨¢S<:ú†û¤^ý>DSL~¤hoÏ¥OƒÁ`ž>}*`ãàààÕ«Wëèè²|222²ymó6}ú–-[\]]\Þ.233mmm?þ عsçž={PÇwçqy9½·§€Òo`³ÙX,¶]E¦¶nÝš••ÕöÂòÚÚÚGµw2999¿ÿž4i’···ˆˆƒáñxÝ(t444¶mÛÖ\å@ÊËËÍÌÌ’’’>|ØZq+”þ‹ªªjZZšÏ‰'Ξ={íÚ5ww÷åË—w•)))ñôô¼qã`èС/^ÔÑÑé’žQPP§°°°¦¦¦]kœß½{÷æÍeeåÖÚÀ|ƒƒÁ`ˆŠŠÂŠ{mÒj Act>}úT\\|þüù6Ú¼}ûvÕªU «ûƒ‚‚ÒÇ!{÷îMKKÓÑÑ©­­Ý¾}»¼¼¼­­mQQQ‡ûäñxqqqÛ¶mÓÔÔ¼qã@صkWFFªrPPz…#Fî·âóðáÃ6T€Ô9vîÜÙ±œ^‚¾Š©©©mß¾½yÖ &„……ùùùíØ±£æFDAAéFŒñèÑ£ÄÄDŸäääÛ·oß¾}{âĉÖÖÖæææ&D$%%%,,ìÖ­[ ,kiiyôèÑAƒuót;LçíýÒÞžJ›´ß0ð÷ðòåËöžáîîŽ H‹~¥·oߎ7îË—/õõõÅÅÅüÂÍ‘——WPPh¼çÛ·oÓ§O/,, =uê€Íf·+0F ¡Ãårq8ÜíÛ·i¼{÷î3fhhhH$ÁçÑaÐ%]-RVV¶qãÆÞžJ[tÀÛ§˜>}úôéÓóóóO:úæÍ›7oÞ899iiiéèè 6LNNNYYYFF†L&s8œÚÚÚ’’’ŠŠŠ²²²7oÞ$$$@}6lØŽ;–/_>0~Î"""*S¥rbÚ‘ ¥çk.®ãkT*í=1++«¨¨ˆF£Áuæl6»¾¾‡Ã}ûöMMMmèСþþþfffªªªcÇŽ···o±`¥££cãʘ__ßqãÆRSS‰ŽŽÖÕÕüv!Ðy÷î‘H,-è…Íf¯_¿>==Édþq½•žž^“LÊmÓøÂ¨Tª‚‚úMm޼¼šššÂÂÂYYY$‰N§w ‡ ™Lž;wnoÏå/‚L&ÛÙÙÙÙÙ!òñãÇÔÔÔ·oß–——×ÔÔüøñãÇBBB#FŒ•––9r¤¶¶¶AÏ}QPP§ªªêÓ§O³7ûúú._¾|æÌ™ööö¾¾¾EEE¿~ý:zôè‡~þüyïÞ=???¾k»¸¸8##CBBAÚÚZEEÅ‚‚eeåÒÒRaaa,[SS£  ““Ãb±lllæÏŸÏår ‚’’Rpp0ÜÄž:X,¶½¡I/^lCè`0,»nݺvõÙøt…B©¯¯0•QP FCCCCãÿ×HOO766;vì€)ðŽ‚2€:tè¿ÿþÛ±sY,–]bbâ¹sçŽ=Êãñ”••#""øG…„„X,‚ ïÞ½ÓÒÒ’““#‰RRR FBBBAAAXXz©X,ÖÇÇŒ³qãFggg™Lf³Ù CHHˆH$‰D!!!:.ˆÐùs¼0,<þìÙ³v]pJJJeeek¥¡¡ ßQX,‹-**:}út»f…‚‚ÒÃÀHke}QPPú?þìð¹III/^´°°xõêÕ°aÃ(ÊÝ»wß¼yÃ`0***ŠŠŠ>þœ””$''1~üøÚÚZQQÑÁƒøðÁ`$''¿~ý $$$//áÂ…©S§.Y²„ÍfÓét@"‘ÒÒÒ6nÜKK èýÿ³E'--MNN®]‘4‡meeÕâQ¸& A‡ŠŠŠ–••µ–*ƒÁL›6­ñžÊÊJeeeaaaggg¸AƒÑ¹ËPPP: :èL”þ—W·ÍîÝ»MMM†N ÔÔÔ¤¥¥ß¿?f̘ÌÌ̉'„„'NÌËËÓÓÓc±XQQQæææðô€€€‰'–——ËÈÈèêê®^½úÍ›7#GŽ„0uêTµ0‰×Ÿ7.::ºWÑØ{õãÇ))©ïß¿KKKËÈÈ$$$­Y³À`0ÜÜÜZ…@ 4©#X^^ž‘‘akkkfffmm]WW÷ìÙ3:Žj”¾¬€ƒZtPPú :ÕÕÕ;wî¼qãFCC—Ë>|8@LLŒÉdŽ5ŠN§S©TØRZZÙ4^m®¬¬ÜÐÐ@¡P †’’—Ë5j|¸7‰‚Åřҟ……BéÀJ3@dddqq1‡óññ‘——‡Ö§ŠŠŠÂ—/_zxx|ÿþ¶$‘H7nôòò¤ÛaÆÁÓ§O›™™‰ŠŠ>~üøÃ‡Ї‚‚Ò§€Bµè  ôÚU‹ªEnÞ¼¹fÍ###6›ÍápšÅb±8ŽÉd’Éd,›••åèèÈ?:|øpXÐ üåÂÂi²ž¼‹——wLèÐéô7FEE©««ÛÙÙ¥§§ß¾}»¸¸ØÇǧ¼¼œÇãyxxøûûÃÆ’’’>TPP(((PSSûô铬¬,›Í®««£R©°ÌÖׯ_ÅÅų²²fÏž­¥¥ósxzz–––Òh4"‘ˆV×BAéS 1:((ý‹.I{±iÓ¦wïÞ C3 ¿Ï7oÞLœ8WhŽ=:00°¼¼€ÇãíììTTT¸\n×.ÉüƒÐ¹ƒ233;Ö{ttô;w6lØ––¦¨¨X²dÉ’%K·yúô騱cY,Ç6lXYY™ººº²²2‡ãp8âââ FKK Ö‹¯¯¯¿~ýúæÍ›³³³aAc c“ ªrPPú¨ÐAAé ƒ`à³µ“äççKII-Z´hÇŽ&LàïWTTôöö~ðàAZZšŒŒLFFÆùóç•••UTT$%% F—'žøƒÐáp8¡½‘ÈÙ¶m›±±±£££¦¦&—Ë­¬¬ Y¹re]]ŒŒÌ›7oÆŒ“=bĈáÇçääŒ?žH$~ÿþ‡Ãýüù3//oÅŠx<ž@ Œ?~„ ·oßæp8Pú°Ùl2™|ìØ155µ/VGAAé>P¡ƒ‚Ò÷a³Ùx<‹ÅÒh4ccã.é“Á`„„„ÀDD"Aäääôôt~¨MEE…ŠŠÊãÇ.\ØÐÐ÷wGz­?W½wx€ÒÒRWWW,ŒÅbçÌ™#,,\QQQUU¥¨¨XYY9~üøüüü1cÆäååÁ:ì«W¯NMMˆ‰‰­Y³†F£q¹Ü’’’˜˜˜Áƒƒÿ4áxyyÁ\ò­UÙ@AAé-P¡ƒ‚Ò÷a±X4mýúõaaaT*ÕÀÀàùóç]ÒsYY?F¥9'!!aÆŒx<¾û*Àü!BÇãu2˜––† HCC‰DRRR 6LFFFNNNAA‡Ã©©©1™L*• Õ¿@<¬†J p8ܰaÄ……Ùl6—Ëm²¨ ƒÁ0 Tå  ô5Ð`d”¾…Bn£óçÏ„ðððýû÷ ’‹¯3èèè<þÜÃÃã÷ïßÝyÒB‡ÇãÙÙÙ ½~ýÇš $$D ¸\.¬ºiÓ&~ ~ÙwØi7;FÓÉ£ ôAP‹ J¿€Çã-^¼xÓ¦M{÷îuww§Óé………3fÌèò±TUUoß¾ššª­­Íår%$$ºÕNñ¡ƒÁ`ºÄ𔕕uâĉéÓ§“H¤††ò@S‹‹#“É<€g©¨¨ìÙ³@$·ïü|PPPzÔ¢ƒ‚Ò/ ÓéÁÓÓsذa«W¯¾zõêСCBCC¥¥¥ï ‡ÃÍš5«ÅS(Š··w^^ž¥¥%Œ²ígz«wAh4š°°°˜˜\0ÕIvïÞ=wî\oooIIIþN óäÉSSS!!¡E‹YXX ><33óí{7ÜI IDATÛ·0Wô¤I“àz+”þjÑAAéP( ‰Y³fJJJ®]»¶víZYYÙëׯ[[[Ÿ;wNð®|}}Ÿ,`?¥¥¥€°°°¡C‡ª©©mÞ¼ùÞ½{»wï=zôŠ+irCàr¹4¿Â¼ËiUèÐh´%K–˜˜˜TTT¨©©¥¦¦N›6­[í""",))™8q"?L¥_ƒÆè  ô ÷jöìÙMö———ô~ãÆ¤Ÿððp:îààøüùs@@€•••Onnî·oßDEE©Tê”)SLMM7oÞ|èС[·nåææB'¼ct-­Þ}Èd²††ÆàÁƒ'L˜žž>eÊ”ÄÄD&“ÝõY ñx;;»ÏŸ?»¹¹½{÷À/dŠ‚‚Ò¯A-:((ýè½j¾ÿĉ\.×ÉÉIN~þüyýúõùó竪ª6?Ê`0 ^¾|àææ¶bÅ 2™¬§§Çãñètzg/ãiUèÀ7°%K–ëéééèèlß¾=&&fÞ¼y4ÍÞÞ¾]ÃŒ7N__¿Åõc[¶l)//¨­­èêê¶óPPPú.¨ÐAAéG0Œ½W_¿~½{÷î’%Kø9_ÚÆÇÇÐÞbÛ)))—.]‚µÊ»¶ìÉÐ{àp8¯^½:uꔩ©éرcsssOŸ>=yòdÇ ‰™™™/^¼`±X÷ïß···×ÐÐÙ¹sgqqñÙ³g9‚ jjj]pA(((} Tè  ô#Èd²¸¸x‹U |||ðxüŽ;é'???22råÊ•rrríšÀ›7oÚÕ^Ú:d2Y]]}̘1wfggÏž=›Á`œ={VÀ1˜Lf]]]NNNzzº©©é™3g>|øPWWçëëK¡Pž?.++‹&5FA@¡ƒÆè  ô¸\n‹Þ«ÌÌ̧OŸ®Y³†B¡Ò¿¿?‰Dš?~»F§Ñhíj/mÝ}øÞ«&ûËË˽¼¼&Mš4g·)--%‰S§NÒ××wss»téÒüùóeee322š·çr¹uuu]î¨CAAéaà2 Tè  ô˜L¦¹¹y‹õÄÄÄ–.]*H?ÙÙÙ€áÇ·kôî:(ê ½Wû÷ïo²ÿÌ™3ÎÎÎÎÎα±±‚ sãÆC‡Íœ93>>>99999™hçΔ••4h¬¬¬œœœŠŠÊˆ#FŒ1räH@wmGù#t:ýÚµk]Û§ŽŽŽ€Aû(ÔuõW ‹ÅêÚ> *”{2™ 066ŽˆˆhrèÁƒåååvvv/^üc?ååå‚À:ÜM ÒÒÒeeeÍÕ××whÖmñ¡C¡PÔÔÔ´´´ 4ãS]]´cÇmmmA2;wÎÅÅeçÎñññÍÖÕÕÕÕÕåçç7ÙÅb¯]»¶|ùò?öÒåÐh4—®í“H$†‡‡ëèètm·=‡ÃiRJEP¡óWQXX8a„®ísÖ¬Y!!!Ý]`¥1Ð{Õ\è°ÙìK—.¹ºº òè×ÔÔÄ`0yyyü=8nëÖ­[¶lQTT¤ÓéŸ?¾uëÖñãÇŸÕ :³dÉ’&BpòäI{{{ggçæ¾­æTTT\½zÕÖÖvôèÑïß¿pr<ÏÞÞ~áÂ…€þkÔA$33³Ëü=‰DZ´hQçû©©©‰ˆˆ`2™ .¼wï^ŸÒ:§  àͦM›6cÆŒÆ5LPþ*t򾄣GÆÆÆÌbÑUE¡}(..nÕªU×®]ë§Z'''gĈýkòL&ÓÌÌŒH$6¯ê}áÂ[[Û? ¸b)== ©©éééihh(**Êår“““§OŸ>a„·oß69«„øÏ{µoß¾&û‹ŠŠnݺµ|ùr%%¥oß¾ý±??¿7îܹsýúõ‚Ïï÷ïßÅÅÅí Ûî1ÂÃÃqÞ%%%M:õܹsýîvF¡Pº$/v~~~DD„¨¨h]]]_Ó:UUUN&88ØÐÐðßÿí±-€¿Vè”””xyyý±YRR’ŸŸß‘#G´µµ{`V=ÃСC?~Üù~Þ½{·dÉ<ÿøñ㾩u¼¼¼šK&äççWTTlÞ¼yÁ‚=3«Î½WsæÌyøða“C………?^ºté®]»jjjÚèdÒ¤I\.wÑ¢E×®]SRRdff^¹råáÇûöí›>}z‹gõŽÐ¡P(#FŒ;vlVVV“CG]¹r¥½½½ I„>}úgaaÑ.¡¨­­•••m×)=Æ×¯_“’’i™’’²téÒcÇŽuI…Ô~Ь¬¬¡¡aDDD_Ó:7lذ6TUUÕÖÖ>{ölÆŒÁÁÁ#FŒè±¹µA^^^×VhérJJJDEEÃÃì’Ó[xyyuíßô÷ïß–üúõ«µµõåË—[»õÿå >¼²²²ojˆˆˆºº:AZ .¼xñâСC¡«Kâõú#ýZëLLL._¾¬¤¤ÝX·oßîí¡ô{´µµ¯_¿®­­ ÝX>>>ÝQƹ_Óߵނ‚Â… -ZÝXŽŽŽ}<0ƒÉdššš¶h´þõë‹ÅkíÜ©S§ÒétIIIAH$‡ûõë<ôêÕ+~ne‡ÓäÄ^³è€ÿ¼W- BäF)))*•ZQQñâÅ‹ŠŠ ///))©óçÏëêê.]º”Á`´æÊ0ˆººúÕ«WŒŒêëëwíÚuäÈ‘.ϯÕg)..^òK—.-,,”¨¯¯711UëûT*588xîܹt:ÝÖÖÖÁÁ¡¹'¥]HKKŸ>}zݺu€£GZZZòŸ 3ÕÕÕ÷þãÝ»wË—/§P(?^¸pa¿Ó:a×®]žžž"""Ož<±²²ÊÍÍííIµ ™L;wn‹G¹\nkf!!¡9sæ B&“›×wº{÷.‚ ðo×·„™L¦R©ãÇo~èÇ/^¼X¹r%t鵆¶¶6ƒ111™:ujRRÒ²eË”””^¾|yáÂ…˜˜eeexyÍ YOP(OOÏ¿ÐÅ`0Þý/0”Íf?yò¤·g×nP7J—ƒÅb7n܈º±óãÇ}8sæ Lž›œœ,HlhÄÈÈèêÕ«ýÂÕ†÷ŠÇãµ&tŒÅÄÄZ“)))ðÜæB§×‚‘A#ïUfffó£7oÞ\²dIpppk=@ÝÉ“'Oœ8A£Ñìììòòò\YYÉãñ°XlkBg ™s³páBMMͽ{÷þ «±ZóïܼyóÁƒ=<Ÿ.ÄÄÄdÔ¨Q®®®}j5J¿º±<øúõë¿y5–¤¤$LÛœ¬¬¬/_¾°ÙìžRWÝX§Nº{÷n_^Åb±æÍ›wúôé«W¯6©+ÞšEGHHèøñã49L&SHH¨¶¶–߯ßßÿÑ£G_¾|‘;v,@Àãñ$iæÌ™†ü¶‹v¤´‡™]]]› «¨¨°³³kCèLš4©ººúìÙ³NNNëÖ­£P(¹¹¹®®®§íšJøç ÝXGŽIHHØ«±H$Ò˜1cZ<Ôg“$ tcy{{÷©ÕX(ýèÆºxñbppð_»kèС‡nñБ#G¾|ùÒÃóéZ k„ žžž}v5–°°0—ËupppppÈÉɹråJHHÈÏŸ?\.·ùâ) ‰˜˜uuõÆ6 "‘èççWRRÒ¸%@ðññ‰ŽŽ†™k&NœhiiéääÔÐÐÐåWÑ A¡P¨Tj‹¥ ˜Læµk×tttZ;}òäÉuuu?~tpp@äåË—šššW®\ùôéSãfÍãïªEò׺±¨ ¥ËAÝX}ß 3<oøðá¾¾¾ÅÅÅááá‚À§3ƒÑÖÖ¶±± ,))™2e ÇkšóãÇ&ÝJHH8;;CW@CCæk;¦c´Cèð3¶xVhñ(•J|¸ŸŸ_yyùýû÷ÍÌÌ`ÚbøÑ<{þüùÁÁÁEEEüCL&“ÇãíÙ³§IKii退€¸¸¸äääçÏŸëééy{{4kênà/ÙÊÊŠB¡¤§§¯X±bûöí=6žqcåææªªªºººÂúLEE…££ãرcº#¤¿5ºÄµ}ûvww÷¿D’ö/<<<œaxbÑën¬˜˜˜… fddôä ½EQQ‘¡¡áùóç,QÞ%ô°+,,lÇŽm?·oß`”1üÈáptuu+++ïß¿ÛÔÕÕÌœ93..îèÑ£§N’€Æ˜æ*€Á`øç¶FYY™¨¨hçŸPí:x<*.—;þü”••8q‚J¥‚ÿ,:ÚÚÚVVVnnnaaa‘‘‘?~üPTTä÷€ HYYY“ªX,VLLÌÎÎŽ¯i,,,h4šPÕ¿º ¾Ðùñ㇫«+™LNHH°´´>>ÐÙt« þWKJJÒéôsçÎ;vß¾}Rîðõ·ªªjEE…»»»––ÖÑ£G{ìïØ7̲UVV¶iÓ¦Y³f½~ýº '6sæLÕÿÐÔÔ\·n]óU (­S%q8œ°°0CCCsss~¤BÐ[n,xãEäÑ£G†††«V­úðáCŒÛ+Àç´F š7ožŸŸ_㸋n¥gÜXÐC£ÑŽ9¢¢¢âééùÇQ¸\nMM ƒyõêÕ•+WˆD¢»»ûªU«ìììàâð&ih&OžljjÚ¤AÄÅÅá6…Bqqq9~üøåË—|øÙ³g>>>çÎ[·n]x»&I###---eddÄþCRR²Åß3:^^^'NœÈÈÈ066^¼x±›››¼¼|çgµuëÖ˜˜˜¸¸¸Å‹‰ÄÈÈH[[Û¨¨¨Î÷ü7…Κ5k¤¥¥ÏŸ?ÿüùóçÏŸkiimݺÕÌ̬&Ð+I¡œúçŸFåïïennîââ2bĈnºçïH£F:w‡GLLÌ•+WBCC/^¼fÍšÈߨI¡Ð™9s& >>~ïÞ½§Nruuµµµmžõ”Ëå644ˆŠŠ¾ÿÞÓÓSQQñäÉ“222€'Ož¬[·îÌ™3‚ˆŠŠ¶=(|¼&''»¹¹q8‚ ¿~ýªªªRPPàp8]åÏé`/ÊÊÊ¿~ý211©ªª¢P(©©©ººº………“'Oö÷÷×ÖÖ†uMÓÒÒ¦L™‚Çããã㣣£ÕÔÔvíÚekkK£Ñ°X,|`ÃÿM999oooþ<ÏÛÛ;99yݺuóæÍ5j‘H´¶¶>tèиqãJJJX,—Ë¥Óét:½ÅIÖÖÖvfµK1¡¢¢²{÷îÝ»wÇÄÄœ;w.44”¿”®[n¬{÷în§««ýúõëÇ?|øðúõë·o߆Iózà2ŒŒÔÕÕ÷îÝ›——·råJiiéAƒáp8<Ãášo4ßÃáà>ÜþñãGddä÷ïßñx|RR@]]ÝßßÿéÓ§{÷îMMMݾ}»¯¯ïþýû׬YÃÃe2™ åíÛ·îîî€'NŒ3&//OFF†ËåΞ=[JJÊÂÂ"((ˆB¡ðÓ ¶‚‚­[·ïÁ`0²²²]ž.¿ƒBGFF&??_NN®¡¡AJJª°°pâĉ7nܰ´´ä·÷)UUUX±ÅÏÏ ´ùó狉‰5°åp88®¹I?)) þ ‹/¾}û6?ó7Çc2™, þÛ˜ 6LŸ>}Ô¨Ql6&$d7£Ål6ûõë×uuuÍ­&<ïÓ§O|ç‹ÅêÉÈV2™\SSÃápøI–ø”——w²---KKËÔÔÔŸ?Ö××GFFv²Ãvñë×/½f¸?[5þXWW÷ùóg¾É=<<üÀÐðÑ|øÐXè°X¬ø¶*--½bÅŠ%K–\ºt©Âñx‚ 222ŽŽŽººº†††ù£È—/_\]]‹ŠŠ ÉPWW·±­‚oÃhqgà~جEã—ËÍÈÈxøð!ü%–——ûúúò3®\¹rýúõ=pÕ}}ý1cÆ4·?57SAKUkf*~3WW×Õ«WËËËÃöåååð'öæÍ›DGGDEEW­ZµbÅ ccãHQSSãîîžœœŒÁ`¬­­,X€Thçn²Ñâ~üøäÉ“qãÆ)**r8œÌÌÌôôt(tX,ÖÕ«W½½½™L&,4feeE"‘žxð E‹i~~>•JÍÌÌ,,,üþýû­[·Ž?¾xñb~µ»´´48É—/_‰D ˜c">>^MM € HBB‚ˆˆHãT¢-ÒÚXmϰ]`0qqq˜òUp  {òä ǯY³ÆÅÅ¥¯ƒN§{yyÅÆÆV­ZåííÝ3ßjhÞ`0˜ùóçïÚµkܸq=0tÏß*KKKá×ÌÚÚzíÚµ­•tìr¹yóf@@‡Ã7nœÏàÁƒ»|è«=sæ ü¨¥¥µgÏž%K–`±Ø;vœyé¬ÐIOOŸ4iÒ¨Q£>³wï^h—ö÷÷ß¶mÛ´iÓ¬­­ÿ(Bãââ6lØÞÁÝÝ]QQAŠŠŠªªª!C†@ÃZÏ”°‡¸1~üøõë×O›6­'ÿNMÜUžžžMÜv:°ÔÔÔœœœ,,,¤Äàñx {{{[[Ûö>Ì:ƒ B ªªºaÆeË–uíü£¢¢ )þúõëÎÎÎÇŽ[¶lÙ¶mÛ–,Ybooïèè8oÞ<<ŸŸŸÿîÝ;;;» 6žìââ2aÂ:àÇÓúØWß5dXH¤ùóçÿúë¯lhM!0§«¨T*«¹–GtÈdò/¿ü¨§§Ç¶]³¾æ 9::®Y³fØ/Â}`NW­ZµÊÇÇg„†”#:¥MŸ>=,,lþüùÄNGG'77wáÂ…?~d0ýÿ‘6qâÄŠŠŠ¬¬¬7êéé•••IJJ{ãþüwçÎccã)S¦DDD¤§§ûøøàvuœ¥zøðá¾}ûÂÂÂîÝ»G¡P^¾|É}úúõë“'Oމ‰Á-Uÿý7B(==]^^ÞÆÆ•VûÂŒ±ª! ýøãÛ·o‰¦Ö>°?]ÅŒD"-]º4 ·Ìñ6åË—{xx°9ù2é*Vº»»çÌ™†;ê †‡‡îÓóÍf×/ijjÞ¼ysÿþýŠŠŠû÷ïOHH¾*Ø`ܽHEEeëÖ­¿ÿþ»““Ó7dee/^¼8oÞ<¼¡¡aQQÑo¿ýF¥R,XpüøñÖÖV<”+Ÿµ»²3¹ð™ÞÞÞyóæ¹»»sä?™ é* wü ØÿKb(é*fæææ¸³í¹råÊgkvíÚµk×.¼lggggg÷Õ7.X° ï¡b|}}ãââ>[ÉÏÏïåååååõÙz:Îüçg³Ëõ±¯>jÈ&&&lsˆSé*f+W®\wïÑHQQqË–-ìÜ#{ÒUÌñ` ŸU£­­MDD¤««kÐçØ´iÓ ÂÃÃ9>¤äÀ‡êééM˜0!$$$)) =ŽÇ/–••%¢ÌÒÒòÌ™3¾¾¾òòò§NÒÔÔìééaÿ”•™™É¶D;36¤«ÀHzºŠ³ÚƒsñâE|ì)))ÎÎÎìhŠSØdp0]ÅŒç€9ˆmé*fÄðÄÌH$Òœ9sNž{öìþ?Ï8ìúè´¶¶¶··+))IHHDFFâ!Y»ºº¾Ùä €ÇLÄEùùù½zõjè˜ò¶¥«ÀÈ®tÕ¨öe. 7¤«Àˆbºªo¸)##£µµu( Ò===|||VVVñññìì<÷¥þ:üüübbbëׯÿí·ß$%%/_¾looßÏ÷c&ÙÙÙ=~üøðáø‰h°Õæ®âÛ®€À%é*0r8’®ê§¾»Õ~~’7##cÉ’%ÿý7žÞœ#úû Éäýû÷?}úTRR²ÿQ†ÇLœ4iRii©½½ýëׯ«ªªÌÍÍ^ažé*é*0B ]Åó¸']5B=z´téÒþù‡ƒQêg sá‡OŸ>‰‹‹e~ÚqãÆ —••566rðМé*é*0 ]Åó¸-]5Bp7äï¿ÿž³ÕèW caaqùòå£Gfee q’’’ l˜„kAºŠ@º ŒHWñ|ÒU\«¥¥…˜úà«îÞ½‹ª««ƒtè?ƒÑÙÙÙÇ===¡´´4„¤«F©®®.<ôWá¯Ïsé*Ž`wDÉ“1lFFFFFÆ77ƒt7koo?}úô77ƒtÊÊÊ~ÞÕ ]5zõs¼HWq †ì$%%¥¬¬ÜŸ-UTTvîÜ)%%5ÒU%..þåô“_E&“W®\ÉmÁzwwwCC§k1ºuww{™$IHH¨?[ ÇÇÇ/^¼xØëFš€€@?;›:;;ûúúŽÁ>Ü€».٣ΪU«x{"ßîîî{÷îè.êëëG´üo^»v-gë0h555?ÿü3§+2ê {üª££óöíÛá-p›?ÿü“ÓUßèKSStFáf&&&Ïž=ãt-øoß¾úp$}ãø$0Š@ ¾ŽŸŸŸÝ‰†8G.€{tuu=yò„ӵ࿠Ð_'--ýÇpº€ÑDII©¤¤„m»ƒŽ½ ? Ð0<õôô8] þŒæžx:àYè€g±ìŒF£ÑÌÍÍI$ROO…Bgg;>ˆ72Œ¬¬¬'NÔÖÖŽ?^AAAEE…B¡ { û¯²²ríÚµ_Îùe``àââ²yóf6T#22òêÕ«Ó§OÇßrxx¸˜˜öÛ‡¸¸¸   ¡—c``PSSƒ—EDDfÍšµ{÷î‰'½ä¡¨¨¨ppp¸ÿ~?GSÜlŒœc\x•#Š ïþCÄ2СP(===;wîD½}û6>>>""‚}õúš–––Á½qß¾}GuuuÕÑÑyöìÙ±cÇ8~›ihhxÿþ}{{û—NDDÛfõ ïííݶmB¨¾¾~ß¾}!!!ìÙ5+­­­ÃRޝ¯o```rr²ˆˆH}}ýÞ½{W­ZE£Ñ†¥ðA«¯¯¯¯¯okkãø†nŒœc\x•#Š ïþCÔ¯ÇˉÛOkkkTTTKK ž‘522RZZ¿ýêÕ+ƒ!!!ñäÉ---YYÙ7nœ:uªµµ544ôÍ›7§N껜œœžžžÎÎ΃â탃ƒétzss3BˆL&GFFJJJö§òŸ>}JKK Â#üþôÓORRRïß¿G566ÆÅÅ]½zUHHhÑ¢E6l°µµ}ûö­‘‘уdeeCBB¬­­B¬Ö÷öö=zôÔ©SïÞ½›4i’£££‹‹ Þ5.ÿÏ?ÿlkkSRRjiiÉÍÍ•””\°`AUUBÈÜÜ!¤¢¢’——‡ª««ûå—_ÚÚÚB¥¥¥DÝw=ïß¿/ ——7þüþ| ¬ÈËËã]#„ÚÚÚâââZ[[ñ·FÌÒµgϞׯ_3 qqñgÏžM™2EFFæŸþ9räH[[ÛöíÛëêêŽ9Òw9ÅÅÅçÏŸÇßrWWמ={ðöÛ¶m+**"¾å°°0 ‰ÁžwÓÖÖŸ'ãÇ_¹reGG‡€€ÀÞ½{>\WW§¦¦¶zõjOOOü–†††€€€‚‚>>>==½7nHKK§¤¤,_¾¼»»»ºº:999::šÁ`TWW‹‹‹³*!uìØ±wïÞÉÉÉñññݽ{WHHÈÔÔôéÓ§!555„ÐäÉ“oß¾=¸£Ü` žcý¹J|õ¿{ûöíÏž=ÓÒÒjlläããSTTôóó#‘H¸(*•Z[[‹RVVöõõ%ðîÝ»JJJBBBMMMëׯ766fU~õHús÷ÿê];$$¤¢¢BWW÷ãÇ|||&L !¾ñØØØ—/_"„TTT‚ƒƒñÊ­[·ÞºukÒ¤IãÆkllôõõÅƒÖ²Š úˆF>Ó¯@çôéÓÄÔ•{÷î ”‘‘A544DFFîÞ½!täÈ“ÐÐP„P~~~IIÉ™3gðÑ"„DDD¨T*óïVådgg'%%á#%%…Ø>666$$ǘRUUÕÙÙiccC¬!ÿººº   ÖÖÖ¤¤¤ÖÖÖ;v Q(”¢¢¢ððð9sæÉdVë©Tê¥K—–.]*++ûâÅ‹ÄÄD2™ìää„òññy÷¯˜˜X~~þŸþùéÓ'IIɘ˜˜k×®%&&FGG ËËËãúÈÉÉÅÇÇ———ïÛ·ùú®§³³saa¡———½½ýPfŒ;wîÑê~ðàÁ7â“æÃ‡qqqøŸ<##ÃÈÈÈßß!D§ÓËÊÊÒÓÓBÛ·oG ïܹ/÷]ÎÙ³gãããñ·œ––Fl¿}ûöíÛ·ãߎÃâßÿÅÓuÅÆÆª«« EDDdgg¯^½ZNN®²²222’L&¯[·!´bÅŠW¯^ÅÆÆ666ÆÄÄàúÏœ93,, ”››™LŽŠŠBíØ±ƒU9÷ïß ÒÖÖ>yòäµk×ðÿajj*F‹ŠŠÂm0ÖoSçX®_ýïÞ¶m›½½½»»»••BˆN§Ÿ:ujÙ²e¡“'OêééáøæÊ•+™™™øGéÖ­[]]]TTTººº6oÞŒVWVõHús÷ÿê]{çγfͲ°°°µµEåçç?~ÜÕÕ!”––¦¯¯ã›Ë—/;vlåÊ•¡¨¨¨Å‹‡……©©©uuuùøøà@‡UTÀª>_ê+ЩªªòóóûÏþciiIÜ{òòò˜gª«­­e0$éÑ£Gîîîx¥]nnnß«r-Z´bÅ 999ü QWWBèË“£ªªêöíÛø o¬ªªŠŠ—?~ü¥K—Z[[ÅÄÄX­ÏÉÉù÷߉’/]ºäääôüùó»wïå[ZZ&''ã뎶¶ö§OŸB̹O2™477'~äçç×ÕÕÛà&‰TQQA„‰ÖÖÖ¸!ª¬Ê™?¾‡‡Çøñã555ñ…o„à… &dee!„ÒÒÒñËÎÎ^·nÝãÇËÊÊ.]º4cÆ „  `HHˆ©©©1†¼¼üôéÓñ2«rBŠŠŠ’’’‰‰‰:::fff111"""!}}ý¦¦&ÄÔxÀX8Çt•`õß­­­MüimmMü"zðà‘ØØØ0ÿΙ2eŠŠŠ BH@@€8V峪Ï@¶¥¥…·“<àããû믿X}ºû³ºkëêêÚÙÙ-÷îÝ#"{{{¢E!¤©©‰#™¿qV峪ϗ‡ÓW £®®¾sçNÜ~ÐØØˆ›'OžœÐÇ»ú‰U9¶¶¶¶¶¶ÍÍÍ÷ïßOMMUUUÅÿ؃¦¢¢B&“ÿúë/;;;æõ!"ªîééa0øOæ‹XùÕõ cÖ¬YÌs˜ã+N{{;Bˆˆ5qâÄ1žèÝŸÕ]ÛÄÄäÞ½{çÏŸG©¨¨ëW®\{ñâE‰Ä¼~óæÍ………%%%3gÎ /,,üøñ£´´4«òYÕçK$„‡‡Ñy¸ ®ãð0²´´ttt´´´ä`؃N§;vŒý»ÞŽÃ\¥¤¤ÄÁÁ¡ºº:Ó€2ÖαQq¹055ݵkWvvvvv¶‹‹‹®®nGGNççç‹‹[ºti[[ÛêÕ«[ZZ<8{ö쨨¨“'OFGGS©ÔÙ³gçææâvš~øÕú¸¸¸ŒŒ '''==½ÚÚÚÂÂB…ÄÄÄžžž ˆˆˆ,[¶LRR²®®îäÉ“ÿ÷ÿ÷óÏ?#„ž{€¡kç^ÙÌÌlýúõøA*î„[tÔÕÕ9]‘‘åííØÇSWC‡‡Wž9s¦¯¯/ÎÆrʈ´è¨««#8^¥ªªúÛo¿qº#e ]¨±vŽ…‡‡n0JQ(Î±È &õÏ‚@< ð,tÀ³ ÐÏbk C¥Rñtµ`Œ8pàÀêÕ«9] ÀèWŒ±€ý‘Ë@ç×_6mžÌ%,,lÚ´ixr¥¡ðõõuãØÙÙ0‰‘*++­¬¬ð,ëÜ&--ÍÊÊ*444$$dýúõÌSõÇúõëñ+\ÅÀÀ@šÉ¦M›†}ZZZÄôC`ŒÈÈÈ011QTT´¶¶.))ùæöÃužpÏùÆ“WŒ±Œ7"–ãèìØ±£³³SKK !D¡Pzzz¦L™ÂÆŠq‹èèè›7oâ¶EEE¿9áÜ 444¼ÿ¾½½ýËiä8ÎÍÍ­ººÜÞÕÕÎ CzQrrrII …BINN344ö]Ô×××××·µµ {á€;%''‡„„xzzN›6íܹs‹/>{öì?þØÇ[†ë<ážó'¯coD0°µµ5**ª¥¥¥§§!„'ýÂ/%''?|øD"µ··¯Y³fÚ´ix}lllMM   žžÞ7Ë ®®®Ž‰‰¡P(RRRöööÖÖ֡œœžžžÎÎÎaŸœ‹ccc<™­……ža!dkkûöí[##£ÈÊʆ„„àJZ[[¿{÷îǼwï^GG‡ªªª››ÛÂ… oÞ¼éááÑÓÓSZZzâĉ¤¤$ƒQZZ*..¾`Á<%§¹¹9BHEE%//=‡6P>|e^C¥Rñè®ÊÊÊx”qbý«W¯µµµ‰•K—.—’’úõ×_‹ŠŠÎž=Kœ<ìdff†¿S[[[bš¡©S§¾zõÊÔÔôÎ;rrr111óçÏGéèè¼}ûÖÊÊêÆÞÞÞ...%%%‹-êîî®®®NNNŽŽŽf0xÞ"SSÓ§OŸ"„ðx “'O¾}û6û°SGGGdddHHHpp0BhñâÅ®®®Û¶mÛ¶mÛ€Î^:ßxæŠÑgÏž=tèÐÛ·o555ýýý‰Û+•••k×®-((âïÛá*g FW$ÐW SUUåç燗߼yƒöîÝ(##ƒjhhˆŒŒÜ½{7~ÉÃÃxo@@>¼ôôt###üÏŸŸŸŸÝw9±±±‹/Žß³gX „²³³“’’ðÌ«)))ý9¶‘ãáá±cÇ!!! …RTT>gÎ2™ìááA¡PþóŸÿ¬Y³FYYùÞ½{Û·oÿð჋‹ËÆBK–,!“ɉ‰‰¸¨˜˜˜k×®%&&FGG ËËËsôȾâÅ‹¡¡¡ÅÅÅÉÉÉÄú“'Oêééá«Õ•+W233ñŒ-YYYúúúx=N?{ö,Þ~ïÞ½éééRRR![[Ûü‘«®Yþþþ¿ÿþ{~~¾———½½=_`````à­[·üýýÕÔÔnÞ¼éçç÷îÝ» 6„……á©¡ÝÜÜÈd2‘ÖLMM¥ÑhQQQÉÉÉ"""ŠŠŠ=2ÀåååÍÍÍÎÎÎÄ''§+V è<áómŒ\1˜8q"&&ÆÙÙÙÐÐF£yzz¦¤¤üðÃ}¼e¸òÙàH ¯@G]]hu Á yyyoß¾%¶©­­e0$©··÷÷ßôè???ƒÁ f+//wuuÅËvvv¹¹¹}—ƒRSS#>2¢E‹V¬X!''§££ckkÛÏÃ!8‹/!!1~üøK—.µ¶¶Š‰‰Mž<!‡›gìììdee“““W­Z¥¯¯ß;~üx###¢(mmíOŸ>¡ÿm1â*ªªª¸!º³³sÓ¦M;vìÀ'僈¾mllˆy‰?~Lt4³¶¶&¨;::„„„Š‹‹ñÏ=p{ìÑ£G¥¤¤NŸ>ÝÒÒ"!!Ûl>ŒO,^¼X^^~×®]>>>&&&ø½òòòÓ§O'ŠÒ××ojjBÿÛbÆ&!!¡'/^¼Ø¼ysGG‰Dêêê êçç2D›7oÆ k¡¡¡!GGÇððð#GŽ „‚‚‚NŸ>‘‘Ú²eKAA~ËÌ™3ÓÓÓ?|ø ¦¦€[eutt\\\º»»•••Béééxp---77·#GŽôôôèêêúûû³çÐú#--­¨¨{WW—ºº:Ñ[pùòåT*µ  €D")++ûøøàõË–-Û³gÏåË—I$’‚‚‚œœÜÁƒ===ñ«–––yyy9líÚµ¯^½Bÿ?—ìîî¾{÷n*•ŠZ½zõµk×8€òôô$¦˜¶±±IJJjhhÐÐЈŒŒ\³f BÈÐÐÐÓÓ3""¢»»÷MJJÂã¦NêííM¥R{zzŒŒŒp× ÀÛ<<zÏ7ž¼bômÊ”)¢¢¢çÎé+„Ð… ¦N:¸&(nKðF$@Byxx°í!&¶±´´ttt´´´dçNoÞ¼¹fÍœ=eÛNétzaaá±cÇØ¶Ç¡¨©©)..Ƨò¨PRRâàà€oát]ïƒóí3l¾b˜ššîÚµk £¼œ8q"66ÖÙÙÙÀÀàÊ•+t:=%%ÅÄÄäÑ£GË–-Û¼y3nÈ¿wï^VVnÊzò䉣£ãƉ†üÐÐÐÍ›7KKK3'ƒƒƒTNÞÞÞÜ>#‰Ä¥YÏQª²²!T\\¬¢¢B46f§N"~÷Œ x¤,¦®®Nô`„Àùö™QqÅpvvNMMÍÊÊÒÔÔLNNÆßÝ€òeeeo%¸´è '<¾BHRR²°°=Œ–ÈÈÈÖÖÖÒÒRgggî¿rðø:!iiéÇs|@6ÀÛà|#päŠ1¸aÁ΄´è€Á£Ñhœ®÷ çtãÁƒœ®Cà|#ŒÒ+Æ AB`ä@ pXjj*B(44” 1€Ã !0rXÎ^0ÚA žx:àYèü—Áð4"!ƒ˜˜æíëëë§OŸþÙfXee¥••UWWûj¾ÆÀÀ@ú xžg„´´4¨žðæÍ%%¥Ï6Ã***´´´:;;ÙW{0À9÷c_ ³g϶íkÜÝÝBÑÑÑ 7nd~5""â³ xåää¼½½¿,ª¡¡áýû÷ííí#ZaðM¾¾¾¡äääãÇ?~|ë̯֭R©Ô%K–0¯QTT<~üxXXØ—EÕ×××××·µµh…Á¨ç‘H€}N]]Ûö5xæXccã &P({{{CCC‘ºººéÓ§GDD¬X±‚¹å†D"áÙS?+gÁ‚x>sss<énooïáÇíìì~øá‡… ây@±øøxÜ,”––fkkûã?fffâ—gÏžm``0{ölkkkø©7PZZZ!333ee倀€%K–L›6MTTôõë×JJJ¾¾¾sçÎeþUM"‘æÌ™cfföY9¦¦¦xQ555iiiÈÈÈðññ]¾|™{æJãl$0âñ_²sçΑÞÝ}ÿý÷¢¢¢ÆÆÆý¿BõƒÁ˜5kÖªU«ˆ5_^}-ZôÙ[:ô÷ß?}ú´°°°¸¸øÂ… \ r3333qqq33³á ÆÜ¹s}||ˆ5¢¢¢Ÿm³bÅŠÏÞrîܹâââòòò‹/Òh´›7oÂwÊà³ ÐOœ uõ_Ä„j""":::ÄúgÏžÕÔÔ<}ú¿*%%5cÆ 2™üüùó—/_~¹!$!!ÊÌÌ”••¥Ñhåååæææ4MEEEOO¯¶¶¶°°PAA7ðÊã` ð,tÀ³ ÐÏ‚@< :#ó‚7n౤ ñ`à%èŒz[·nåt-`Ô›7ož‚‚§k†Ç*•zýúõ¬¬,NU€gÈÉÉ…qðöDƒtRRR’““ÍÍÍ ÆÇƒƒƒ§NÚÿ·ûúúâQ0ŠH`ðκuëž?ާ!íêê ¤R©ÃW1pµQ Oêêýû÷bbbÌkbccñÜu***ÁÁÁÌëkjjõôôˆ•óæÍÿý÷ߥ¥¥ƒ‚‚ètú•+Wddd†¥ni\ )Щªªòóóëìì¤ÓéÄú´´4}}}|T—/_>vìžM>==ÝÈȯÏÏÏÏÎÎÆÛ§¤¤¤¦¦JKK#„æÍ›gaaQÀý¸?Ò8:êêê III÷ïßOJJjhhÀëïÝ»goo—íííµ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­¼ªN‹“¶>÷sTÅØ— ©Ùu‘H”Ê(µÇ—fKÊØµ&ÚèD ^)ܽ ¨1«ãëÝ•ìKÑ¢ãÖG$q{s "lGÛ³–wǬŽORGÕ‡:z”ÙÈ}à_5Q[AVÛ8óèÆ]C”·5R묒¯W%;§ò á¨µ(Í8óD[RBoˆzâ]p0BEY³îú`²‰rZa@ËA¬±¼ÊµôJZëð?•UõY¨ê§âûªJW;çò ­'iŒÆ*Í©«”/@”@©ô0™³¥®ÊÖ”Wt_)àØXS÷ý¦Š·;ë6Šãþ(–óÙ²¨)‘{ ®¤®Hi>[U¤÷?Î'Ó+*¹\L¨,¢øvt¸\]QDÀćò§oÞϧãÛ%Oÿ0÷á± §“¸+‰O’Æ6ä6á ¶SÊn„FÓÉÙ켨þ2‹ÙåùÓî^e!M?0òûdVTÁHç´#¥ñ‹S¾8¥µç„¤!–0bqËÇ}8 ÊN¶M?ÏfÇÅlœ8jÅç‚ Ûþ¢ðœ^l~žªª¶'Y³ññh±˜Û¼ð¬BÇ+O‹ÙÙÃ{¿¹»ó·ÝnH>jm´¤HÂ2ˆ³¼·Ó\ÿäð êA3ªÔjN‰|öèðæÇ›ˆ5¿¬Ö¿Œ&ø_Ö÷«ì6>RO8Ð9߉ p4S» }3ˆÂE ð6†!:ÊàT‚4]7 Ô±YéÁ« (ü€^ lj²y s÷—å¶` s¢•F¡×ñZè # %´}¨ÌP#E©c¨™a –ÍŠ¥h8ªÞÕT¥—aà•Y¡ÖàÕäîIZ(·ÞwܾšEØÉ°÷*i2ZöC°BÛ¤06(nM®e³b)~.YÚõ*Ș5ùui²é`×›x÷—¡o¨ vÎC=dM™¦( ±CGE¸mOÔ¶ üðã‹:øëìâruðëdºÂÛþzcƒRÄúf<Ñ»B™C„¬' ÝóØ`À]váÖ0Báã}A’?Šÿ½,–«ƒ¿_®2ŽìG6$3 '@çRHΈyÓ”¨qVIÉ€¡¢  /M”Ö¹C»0R²¯³+t©ÖŒ2¬(Ó9RSOÜkvrHDŒ°–:Ò¿=þ½Wq”ìíÎt©ÑŒ+œWÐG6e•¡‚Ò†7°"c$J2jR-d”T=Z·íŒÖüd¦ŽÏúZ{\jZ×Ú÷r2󤣅ëÓ¿›¤è#ù¤ST#Þä?em¤z˜íPYa½Ku8J:ËŸûWÍfÅRü`à\ZjÞ…$ö$¶áP–jùE#¡”ò(&P^¨õž£hx~Ѩb²2)4 -ÝoÁp=¤ ¢ò¦[¡4oåRB ºéQË¢ºR6ð§ V³Y_~‹+Õ¾m^Jîh÷ò}RA{j`)³¥4èDHWŠ¡3ôZik¶`GU±Y/†¸pïl(³#) }H¡B37©¬f6çÒÔu#Úè×h¨egÝİ’Ïz9¤•û&‡qGrûC&µR"é™å0X—(ÉÖpÔ¹Tê¶c,ž$‡•|>Ôè4îÚÝÈ¡–}È¡#œ[ÀCD$=ˆ‡.Þà¡ÜVòY/‡rñ0ìH»á®=yéX½”@Ž‚N± CR¨,u6Höz¦:.«ë™¤…2#÷؃ÕЃk$ê®K7Íðz°Ú*3°4,­Ü*¿G²Áî9Ô²YÛ…xï¶IÇ O5§‹ºó)¹ŽÞ˜U9É_»¦BG¤4ÄmÈáHÙµ§¼Í£Æß>}úxø{ñµ˜¾Æ„(öÖ µ’øå³=HÔ¦ '°i5ïAbŠÅ+$Ðã*ã_€ù÷&ò[8Õ\>4ù)ºÖ“Ÿv·—é™ÚOŠð¶§9–T‹Ç›‡”ŒHÝÐÈVCÜÄ¢5©žß[¯˜e±–ÑŠÌ ÜdeLK•u*n¤ÊØx÷Ø‹ [RlÍv»i »OZñë.=]Šd›…o¢uH}ø¼SC N™eÕ°SÜÝ€j¹¬XJçeÇŽ¹jx_«†ëÏ @`F:ï´ûѪc.ù3Â\—üyªþs{‘ôú£N'Wçl¯ÆÏåÚœžœÒ_'Óbyµ\çˆô¢ ;:ˆ{¡%DCûºä=ˆôì5%-ý0¢— R°@T¬C†{a²Ia%<íMpàYˆŽs8š8Ò¸`}Ðt¸Õö0wŠÖéãû¸Ú€Õiòåƒ-„7õû)$>O¦Ó$ÆžžÏ¢KñC÷*íõ6£¼gâT#Ÿtÿ¦“‹ã/óÅä?¸¥¦2÷y4]È ¢­&§=éÉëœØ„â5ÆÜšé(ìþ˜beac¶Ä¶f‰m b6Å8ÃtÎÄ‘¼°ñFýðáÒ¿ö¥ÕB‰¹ÓÂDfüè ?>L–§sÿ6šUÁGç*Ôo ä㤆Íx¡D;<‘’FÁ¼žTF©Í’uPS?l6qå49:±Æø çü4ƒwÙ²Úk£\l=;ñ•ºrŸÓ#»r¯Ç•{Q»w”áf o,ëhe F÷ÔËYYž;М@Ú‘»Œ A3‚¾`XMz‚éœ6k…•q}pß:­¦Ztl)%:¥'È8¤¦¤†R‚w¦Q-ŸE¤…œŸðºò\‡®æ:pt5ÿpuR ©€¸³D$˜¾A1*Σúíˆ`z#\Žé ˜ë˜@”R&…“ÉIU¶Ó`“iÂÝ™lvÜ|ˆ^;­¥õ:´ÎËk6³´b¯ÔÂ: ôÌÖ+òQŸ­¶‡>« ¡¼h˜û¬ˆi„ úYeŸUgU‚VЬ™½0™¡5Ck†Ö×­Ýçì]—‡ A§ÚV‰7  °R¦šBJCKãõ %É)ckD°&3´fhÍÐúBâ‚ÿ=EêËÊРï¡_¥@uÌVDÞŽ•Ö$JÆ"¥!Ha­ŠÔ„#š¶Eˆ ­Õ>˜l©ND-³@´ÒJ9!ÕÓ(ø.(¯BlK™Ìðæo¦ˆÜC â3=·n3tï4w]‰–‚@‘·+}î:Ò‡}$€ëHWdtõÁd¶²Ím†}¶š”*™î=¯'é ëÙE7¬¤D›)U=¦¦×ˆ¨Zñ–*õÂd.UÊ¥JQ_vv†í\q©¬†N©à4¤Þ¯)7Ck5¤>AÊÍІ{ä|—œ-àJ­}ÎÍxU¹:téawÓAÆvo¼j˹ F¨4‹Ã %RãUgÂ@Nª4UÆXþ©2u|Vö0û±´õÄ hfþ Éz÷¡ùöô–Y¶ËÕh±z ÒtçkoÔníÖz è+5÷K-å3V€K½)¬IX¡"$ÊÊùÀÕ|V÷;t†z+‚‘*CE†Šº¨Xï¡ÜS§(`¢#͈̰4'Òø8|¹¤¨d³²Ý©¡¨<Í€¶æN†Š Ï *LPÛò@ÀËrŽ¢‘LRXe“Aë-`4ó@+‚*gáX“¡"CÅ‹€ »_P]LÓÛ¼*­ °¦´*´yVP¡£,ÇÊÉlVd¬x!Xáú lò+¢qi’§×ɬP6ê„1n1®õ@”sPÛfe È@ñÌ€Â÷°µPEê]PƒÒIˆr@”­„-4 UÐ,í@¡ nªlSd¨xPöì$¦Ñƒ*ÄHPaA–¡ övO9ÿˆÂD©èsšè3Rd¤Ø-Rtä9l4À¥Ø'.ñÇE\°:u!¹::øKÐ6[µ.=QÒÑçˆù`6ÓË0a\ç¤Oå…Ôe‘¯aþ§œˆA¥ˆi0Ήpô©J "°§pÔ°Y½Òøä„…è÷fâûuÚ¢‚-¥6w<×÷ŽW_AêúÈ\ ÑÒœSe(ÞM/ø4QUƒ”¹¨âÀÐá?ðVöÁd“rê§R+ ”`Q³Ö×µŒ)œÌãbÁ°{ö3ÀAè}šÕ‹˜äyáY%-4þÏ<Ç’²kOy›£þ5š¬ò„q†¶ÿµ2˜'ôçÓ«:ó®{ÞA‡,ºi³áõµ ôÀ k4E¨ ’Œ =.iZS¾À{sü¸qWÇdåRÙ|©ÁíòmÏÑŸGŽÛØü"{ÎS)ö¨1ÝÓÏ¢ðJüÚ—ÕŒŒ(`‰ ¥”~æ£GÙDE²¬ SÇcåR×|iŒNãç·>´nsšUfÛ*c{èÝ•…:'ÑzûÉ(Ên@l€6íUÊ´Ðm 7T™:«—ÓÒx×`ªXê½´TʶA¬2[W™ÎÙH”?¨ûÉÈ@‹w—qùNæŒIÙHAIK"G]‚8u¦–Éê´ÅæKq»L ø ]Ö™g¤3u>’rP,Ü€ª÷A³ê zú-: % „@*p­ ˆ¶ùíÓ§׃?\N‹á‹ÔId‹ô%ïçß«¤sÎŽ£¤×©í€6 Y'3Ë×””ש-zês‚;°ó¬Ó¼za²É1G»ÕðÑXÒ9ýºÎ ºµ²ŸÒóY´qêG9cÊ©,«¸éV³˜”S®)Qí)§!«2ï¢gVÎîLfåÌÊù4#ÜwÏ!‹Ç˜¢8Éš,òƒ’¤4Œ"½aÛSÞ¦~øá&Ëâ÷âk1Í68‡ ^'/Á—»·ÁëDõ0ö ìÀN )ihaíÒ Ï5>Η«?ŠÑxí½ï3Â&h¼y?ŸŽ_rT`Æ VÌ€0Ãx´Ð`Mî»&c…u4$ÒC¢Ùö$x›ðñi1š-3hp‚F…fÜ`Å Ýn8ô~) ¯Œf¶8%/œCJ©M|I9¶§¼MùÛèâÓü«ùbtVdáÄ‘j‰ÌP %}L«¶–:öã…¤B5÷]‡¾-$¢QÚ=8}D÷¥X|-–Å"C'„Ü—Ä ¬ðaû°DðKî°‡K)îa„N÷ öñËéi±ÌÞ ¯Õ±)}1XÃõdpöQÑ)âa(0Fùµ{ðøårõ¥˜eÌà63Lxl4|f¥Äs;)ŽRp¢ )%N8Ü~@Æ2b°Z›Â—ƒ0B€á)ñ ,/`xJyJ‡*)Ï*ìA8ã^-£'ZÜ“¼Œ¬h{‰bÐDZªî‘Ü6Q¢rÕ pÄ4 W Ùšò6Ñã×É÷Ë‹ ¼!*Q̉!¡{&)$¿_ÙȈ Q²9¬³qøƒfhMs›ØñR„3zpfV áKÀx¾Ø¡zÀæk^ðPdf$ëíñcM7î€ü>?ËàÁ •R˜Ñƒ³ßi裣^4!¤rn£XÛûPḃDIÉH]"¥²†ÎYð¥æoxZÍgåRG½äQ¤cë“Üùù·›ØèQ,½ÝÄS)ö„ÝÛæ¡Q¼']•`€%L4¾T¾²—¬V1Й›Fëƒ%êø¬D‰àSƒe OvÈ ±3è2ÓMµ;®å–f:Ó$9iÓÊžÙpq>Ù)>š„HN‡ÔÎ œ~Dªf³r) ™IÍÓ|Èì2$í'$éA’í’¼öe²osrD¤4QÓïƒ#Hò^¥¾ÖóCR%›ÕˆdMÙRZȈ”i/Éì‘\ˆT(;¯vÉû²lŠí«Ujéýl¤J.«I†t&µ22 í% Ù’ï¬ó)ñÍ8ÏH².$BZ%DrRÓé¦QmŸHÕ\V‡‘lùÁdÌ&RF¤=E$·#D }8mÆ'´Þò’¶±$d”ON[ŽÎÓ­òq N[›•ˆd-Eà£PÆe)#Ò~"’ß"ÅIz[Žñãx!IÚ";£MÜ(•Jù£f¡íj>«g®ÑœZjtȘ”1i/1Ií“b/c‘ƒMS¤‹šwð¦•tŠ…”ŒÔ4oB§0H ©·0¹’ÏŠ¥NDéSš´9 cÒžbtŤòõttU,~>(_àŸ³Åèüçƒÿ%´1zmmod_perl-2.0.9/docs/user/handlers/http_cycle_header_parser.gif0000644€ÿÿÿÿ00010010000013370711727205031024727 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££uÄ=¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘Cq#‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWW  UUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôòòò\š0???ððð===îîîììì999êêê777èèè555æææ333äää111âââààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨X“.¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzz2xxxvvv#tttrrrpppnnn…ßEllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷/NBBBóóó>>>ïïï<<<ííí:::ëëëéééççç444ååå222ããã000ááá...ßßßÝÝÝ***ÛÛÛ(((ÙÙÙ&&&d¨4××× $$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠWT©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœUÝšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=r‰!ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî‡iíA6Ì d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(âPX^gÃDðÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb:L¦þ¢´Ì©´Öjë­™¦š£}ú…²°Ð*°à銒ˆ©J [°À†˜-à*í´ÔVK§®Ã­ŠÙ§€D;dHàCãŽé­µè¦«îºRbû¯Š}Ú‚E@¤$1´ Ã$Dž Ä+-ø¢@¿ÿ<ðcœâ‚ ´´:ä#-¼â,± ™Â-dü‘£ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¢ÀÅ -{ó*3ìð粫óÎ<[ë®gð&ö© I>â‘T@äù|AN-E2í4ÔC–r‘ 2¤Ɇ D¢|dÎ=dÒK7ýôÉGZµÖ_´Çñ[õÕCf]$þÙ=÷í÷ß¹2º«¶—}úB’²)‘çæÜ8‘Sdœq,]±x‘à„­$߉yù;‰ò³_D.9åCî“Ê&ô¹ä- Î8à´×n;¢?w4bò¾dçD~:γ9+’´()¶‘œ+^<èlÉ‚ñJÒ¢†9Éy|’|ßîý÷à³™;g»öé<µ Cwí|I'Dr¢4ñô×n)— ‰ &Dºa ‘6÷Žô¾øÍzõcʼ…¿$!œHD‘8ÀðYð‚Ô“à²Õ§mÝì }EÆ\ñ"Mb-ˆÈ¾À k\à °†*†ÔÂÆp†_ÇhñŠU|@þDê ZÀ ƒH¨ R@Šx I-°FÆVgBªH5„¡ ™´,Œeìx:ä¡H¤üÀHaìáŸÅ)fðpŒ#’Æ·™òÆWrÌ£÷ÈÇEñ Hì£ IH Ò3v,  ÉÈF:rg‡¼L" ³ÈGZò’˜Ï|δ¦ÇêçJZ1‚¾ ¡5YX³Ô0Áúù†Ï¦â²þl5haZТÂ…mi ÛO#\À&Å$ÔñO[à ¾¶°‰MŒ¤b žò¦§Mm¡všRŸNL¨í2ê@ ·Úà·¸!zíIe1Û®K·õíqk:up@$2‚ Lâð†ÜÍo–[Rç>Lºé²î<µ»ß2&G$lA=8¡©%:A ¡ô8(î±ï¸*# ¹ÈþGNò’›üä(O¹ÊWÎò–»œäVè¿#pà |.ÇÓÁ^`*HâåPœÁaÜÁJX*˜MÖ1Ø PºÔ§Nõª[ýêXϺַÎõ®{]êì¸/@gNJKÇo¦vÎsìRar År1hp¢¼xGÓÃa…¾ûýàOøÂþðˆO¼âÿ÷`ˆýŸdOT͹ƒv5©Sloûmðˆ6 hÙAÌ \‡u |g¼êWÏúÖ»ÞõŽ—y‚ykvNVþQ—¿Tæ5X,0áZ`‹N‘Ž=œ>õ¯O¾ò—Ï|ÄÇ~ì³ï.§:X¸ÜG“Ÿ¼/09¾þẻ¥ðxXQßüò›ÿü°¼¿£_cï²ÊT»Ï~]ÏÈE á?UÉþþûÿÿ€÷|Ç~`V{¦t{½b}ú„}òw]а@ΰ°È€˜Ë'€ë7SîçAðÇ€ ˆ[µp vñrp SÅØ‚.¨zØO‘‡;ØL/ 8R"8‚‰µßÐ ia^¬°‚ø‚H˜„‚ƒÄ0ƒ‡2y„qsr‘swšW@ªTØúWÚz»QUøÐOw@¿p$  ÄÀæ@ Õ` ` ÛS[I†~§" ø` àw3+CÐk ܰ lð ÅX ~ VÐSàœ\0 ¥k‚°ü`Ä»¶Và )ü`ÄËÆV ÆdlÆþh¬Æ½Z i U` L‹ éàòpP³€li¼ÆQ<ÅU|ÅY¼Ålp –Â\µÂ’ÕÂ.ìTs°œuæO²P®tqðP G`Ipb^CË>õ¶’¨„ €œL{žÜW ,\¢<ÊAå î4ÐqýôÔ@ŽrAì°õm`?…˹ì‚sp  ºþ×ËÒ§µßX*yHÌ.å ÔÁ`Ëÿ4ì rñåý$YùO퀈Dü‹Ùü‚– ÇàÏåÎíG»ïGÎÃlÎã4^ãPwLÂNM›P â0EÜð@O5EvPŽm ä>ÎS’M(”–ý˜M'š½ä¥+ßOåÞPÿ V¾SM>(OQîS>'Uæ å˜8PWÚ`~0ÒlÞRc.(eþgÞþi.'k^ç5¹zÐåOej˜PCÍŸ è(uç’ç~±çlÑçqòçŒNPÈ ¶üüT‹@ e j[ —žRŽ(Þ’¾”'–>êu ÉU àd E àíê%Uêyrê|‘êj±êoÒê¼ÞOTpÌ·}XúØ Ç¾]pî[®H^hþìe´Qè~'ꎞÄî&ÆÎë/`.UÒïý„1Üb&U «pñŸñ¿ñßñÿñ ò"?ò$_þò¯9ÞÉ;ε=þï ¥|  v[ N€ReÀŸ°ó<ßó>ÿó@ôB?ôD_ôFôHŸô=Ï ~Þ4Τ’ð£ŽÈ(@Uñ@ÓòpReàäö†×ÛÓúÛ–·Þ.oPnÀx`bSÅQ›Pàõ`/öxxdáf{hŸöå˜&PU’ wõÇÜõ%õõyßøå=€N_SéýÉø…l¯‚ØÓÃ`RŒïø¿÷ÒÞ÷ Xù–ÿO.EHUQ +^‹÷ ÷¢OsÓ.fìîIîîm¯í]0îX?UùЋ5 ÀÝõùµ/ö·þ_v¤ƒ¦úÄ€ $Ví0 …xÀ=¼ü´ßüäýü’—û¶û¨ÔûìöûÇ \šÝÖ àìà/þÎßô³+εÛòÔP•ÐíALà@‚ D˜PaÁX>hŽŸi- ,ãÅÊFŽ=~RäH’%MžD™²c0·øSæLš5mÞÄ™S'ÎanýTèP¢EEŠUI>…uX„U­^ÅZ“‹]½~VìX²€0¨ìÚ‡\̱%æ À&¸5†l´TïÒ8*ýþX°G–.afEœXqϨ?&º´)dÊ•‡NUœYsÕ­u=þz­!ߌ‰®Ëâ\@È «›QdÞ=¼°ÝwðnÞ½.ørópâ2[Fž<¨dåÍc.]sgÔÕ­_=ÀìÝ-áàPì» óÎ{ NúwV®,¥ÐLtVsÇ犡b“GŸfúé/øÀ |c°AŽ€#H8é&Ìê8ç.tŒ9 7, : ?äŒ+ïF$±ÄƒÌ€hLô*ž<³€!À2˜#I"™%–PÆoDqÒ‹#wÀ±BÛü°#†q±bz†PÁx´±âôÁe…sÒ¸f£?`B…Yà(ÆA5{ƒp A„ó& 9¤þÓ( ë¬ÓÃ8÷œ‰:ÿ5p%P‹:Á3hèwà€Gyè Ç{ðÀ=ôáƒ?öu©tJ"Ò£¼žÑ£<@H…Þ°"=6ª@½`™T(@5¬MÞä“Ï9ñDö§;“ÅPÏb÷ôÓPi§ + wÔ£V¡òøŒ…P¿ýÖ~øÐG|0µÇžQI*µ£¼êð¨õê«Ýó8Jž¥ôùXý–bŸ…óXfë\öàæœ%Äh³…8⃠‰»Ëw¬š(œy‚™&”Ù1™$9Â#’][Ý`Ö¨"m2°ÕÞ˜7º§’kîþQ¤>Êø·h“¸a VxÄ›FŽa¥'|øb«³ ®ȈUVöLF`«åÈA`Á€#Qlsá„Rˆ¶¢œpXáEßW‘…Ð{¾¨6€bRx%8¼1ºq‘>lꙆڹ§+§LjÉ‹«škÏY‡<œù¼‹s@ÃbÐÊ.$CôÐëÇÂÙK6d‹‰²X* ´ü%;J£5}gˆ>gþ#È7ŸÜ'Ì9¼|zÇ4‡~³Î?çÞ»O…ûj M=øÐf-³›g¿ýžÏ^:Ê­·¬zú¡Â>~Ŷï¾ÔŒð^俺tƒÄ þ.¡¾Ö¹Ïþˆ3¿ûAÆ~LJþ$˜þЃpɇkNó9GÄá3 1 j0ð/„`K‚¹ j†‚lÌqh ÖÐ*ü`Ç¢¢{CÄg– b$¡ pCYÖC*-‚>\ŒôvX?¦lñ9TÁâtD$D2®% ìÀ:ºG€ŠÔlÄèÆp…6ŠeŠUÄãš®Æ iÑ‹ìâŸÒC>âˆeDäC ÀÂDŠe3"†1Ö°”/åŽyĤoöXH«ÜPGÑá'BHNjeŒD¥E^€ t’ø L0,e€vl`&u¹›M–R'žedþL‚Ñ—W9d*•‰ 9` ÝcÄ,@³"Ìa)'°d.w¹Í¿ôò˜rò#1JQ’ò›_H¦2QY<£âàV]’1Âmx#X.ÉM~žÄ›ç¤ 0Å r~ÒœßL§:¹JL(ô"ƒFA@°”;ŒeŸýÄèãd!œ…JAyÐc&Ô¡B´ÀÑ?8¤.‘È@AÔ°”YD-)V±SžöÔ§?jP…:T¢Õ¨GEjR{Žº©£­‰@A*Ò?’Ô—&=é[×~öXÂu˜ \GW¤¶¶Õ­o…k\å:WºÖÕ®wÅk^õ þ×gΪ9‘ê@©êE«–«Y% +`t/ ðŒ4¤q Ðt z)bš´¿'œ µÓ0A ”Ârò°šåžÒ±”J !ŽˆA´ð½àA hkSÉÙÎ~!°âìK[ÈÓêöj¸ZJn¹÷€x&Í1ŒyÉèÅ÷:aÜFò¶³¿%fpw8\>—»»i׌îµ@¡¹†Ž<Ôb>Ê*q^Dz÷¯à ¦xqHÞ0š—¿Ó¢5ài€ôäÚ´P—0 c XÊv0&à&£¡ `Q ƒÆ¢A (g8…ȸE9ÀÄþóv Áøá€¡Lò+¢ˆ=JâOš¸‚(ö¡Š\"e\`ÆOäRˆÏUÞIć R ?ø¡A ìÏ%wOÈ%² |?$×PÉeîNÔF†ie¬üÜ>”p t™@ ¬gžùœiþãšé׿ ¾™ÐÕ9‚«ÖР$2øÜÞP—:ä!à,ð“ÖèàÑý3ô7íEE[Ñtô©AcoÁB9#¹» $$¡¶Ä-j…MY.ÕÇ\õ[=½Wë/ÖÅ® *–â¡øH‚ç^0‡º€ y‚6QËÖB›kÇöe²w¸lÌþ5;~Ï6wYò1_Œ#}ÀïO¸uxîe‘"Ž×L*…µ@x¾p†7Üá‡xÄ%>qŠWÜâ '3ºK©n²»rîμãM–%B2^ j¡e.ž»ÆjØr@DóRãWÆÑ‰HôÜç?zÐ…>t¢ÝèGGzÒ•¾tŸûÂ{jo}ûÙÑÅãP9ôD>ò²¡z¢(ŒKXgxXÆ‘ªŒ¶]$üxºÆ9Éq ^½iYßÜÖ¹N–ÂÐ=–b®!`uqCòU¤Oçlw{ä;w¿J= T¯úrD[u¼KNï{ –Âmb4þÁ®@×<Ù¦j‡¼ä%OyŽZþò™åæGÛù©}ô_Q>2“9bK¨\*€®\+€½ì¥¿Ú;Õö3¡{í®0Þ+Í÷¿ïJ?–}+á–©°ýé˾úÊzo³¿í¬û û>ø-‚a4õsFp‡°b i@‹Hzðųˆµk?÷‹»øû.Ìý[¨?f¹?‚É?ý{ˆb|Pÿñ3í`>¯`ÀŒ¼÷ƒºëó¬ ,Š L– |– ÔÀ„8<øê¸Hñð P€3ÁØCA~RA¹+¤ù£D,¬Áƒh‡¥x/ÿ1þ¾±Ø6øŠÖ`‚Ç ´H+¨†q€t`œ”È‹P!ÂŽ(à”,‡jØ@p‡1˜¾#„Àÿ’@ÜcBÂ(,ˆIXŠ(òV`¸ ¯€Ñ)À\Ãð?¸+@„¥9DC¨ÛÈ‘ 8H‡†¥8ÃvqÀÊcA%´ž>ÌcbÁ@ÄÈN$ !8¿±H¾°xŠêŠ ‰ô°à ûÀýà+à8h†Hxo`ƒ˜µ…H…o´‚›,†œÜÉ$Y’&y’(™’*¹+¨.PÛ*"+€?¨32@’À È‚ãŒB]Eø § &ÈE¯€À…Ø€ €E0@ȇw0‡. ‚ìÈhÜZ¯T¨›»ÉØÁÔ‡P µ´1ʶÙcV¸,PØ9ò‚¨{ðMl $`` UQRµ‚·€¸™›°¼Ñ›FÈJWX†c¬•qh(8è³ìM´DÓªSÓ ÑÐqÓ”1€# ¼ c¨‚d‹Aá„_ LÚ‘+à@âÉÝéÁœwЂxØá-1Àk°ŽþÐ…*¸= _`;X}à†UJ{ÅW}år] ÛÁݱƒfÌ+ €-Їq Ýh„)À{à‚Y€f¥PÛ³P¨‰Vç˜V ©Vý³‚F¹BÏÁ†~ ”w@LUˆDÝ •>œ151Ó }ÖÑJÙ…aSÛkYð#Ãñ c°ƒ ‹˜,±°€Nqe XÉØÙ‹ƒ8 ƒeX“ 5Ù¡­¢UŽ•¥œíPШ¬å/0Pƒ±'Ð)àÈÀô‹oX ~°Ù£±^Pƒ²mÖ3N«Ó=Ðb[éHÚß œð )ȶ²P[X‹ûƒ½-B·3[Ë;Ù¦QÛþäxÜèˆ\Ð CôLÈ@i* "ÚȇÐÙÏݦЕºÑU˜Ò𣵼Ôå:f¸6o% N Ü²˜míŠu‡Óøº+ƒDÜÍ(Ý•?´ªÆ©Óå·}[N€)±$€+‹' !u§é¥Þ~²Þ\\¡ð]Ëà^âÞ‘sðñŠ~ Ö jÀTHj àÕ!†.àˆ0`P…Sø@¯˜‡µp†`‹'ð< S„¸ÝöŤ÷ÕÃøÕ<á̼úŽû·ÐѯPxaXˆážáÙ¥at¯À‚6”B`½@‹3`_ÎÝÄZ&(íþ(Öïý^¶ÐApaˆpÅabð€,Îa.Æb(”®`X V`Þ‹ˆ µ!ˆø`$®"1ì,''(£)FÕª$¯èN&ˆ6Cc p„¡x0^yDR€O8b9Î$:2;.<&&=Î †6)@ž˜UCFä/>dƒd8@ø 5H;²`D°#2c˜ô…‹ãå^öå_f`vº’]M/N&OÞ)æã±!‹¹bTã‚8å-‹(@™‚~(kj!ˆ@Fçq&çr6çsFçtVçufçvvçw†çrθ<¬c&Vdþ.'à•:P.¶ü°0åT>ˆj®æ®`0(‹eÐ[°†g 3fØàºlfÐ@B>â݃™ßÊPæÄàgY«%ºð è_bø_øã7Xà!”6`•vàT@…E$‘3H+ϰ§¾šhЦçL¶g ÄgƒÒçÞêèSSô+ ±±HÒûŠ#ÐbƒÐŽlÎiöÍ‹f–ŒÎœ î¬¡~´ð Yÿa€Zø“û@ÐÈ©¦jgíi¬†ŒF ®†³#à”ËõC€¥±Hvxd ¶âƒ Ä‚Fk²¨è0²êdaëÇpkbæÀ¶ˆ2¸ZþÊöú …$…pÀìÌÖìÍæìÎöìÏíþÐíÑ&íÒ6mΞçª6æûé‘Òê¿‚ë2ù €Ú¯˜0°h„ÎEˆ1¨·‡(4àá&îâ6îãFîäVîåfîævîç†îè.nPâ³]ëÖ®ª×†ªØ^2B< 2zˆe±ˆ± †}HdÐ~¸m‚(ƒm „ø–ïù¦ïú¶ïûÆïüÖïýæïþöïÿžo¨îb¾næ<íö(î2¶‚\ +€‡~#HD… cøð÷ðñq'æÝ]íÃnÂBp€RðSCà¯} <yˆR”ê„xo×ñçñ÷o¯=µ¶çþž?§1ÞaþÝþ‰œ‘%Hƒ N"ºkçpÇò,×òrër&&ò/òMtZlÆ^#žò& Vˆ²h,°è‡ÊNœ‘ÛƒÈñ-Çó<×súîrøSíwÁÄÆ $ç/,vø Hˆ‡±P0 fxˆf¾ó=·ôKïñ>_Á/'á0— #G¨27ó„H¿õå®>(†n‡vZˆJÇôX—u×ôÁÆ¢ÂFOÇP/)Qõƒ¸D ) àU8…Uï!$g¨¹É€1^CGô Ÿõj·vý®õF³/².^¿*_ÿõ‚À=ˆT7ø€@©æz€æ°8ÿ»LþðÅ3VBaG¬vnï2×M DÆM`ŠHÛ ×nã7àÖ A 0¼·q3ýxBÅ0ÜÞ!7Pƒ‡†á ]NÜsø1„ߎo~­ä”Ï|4¦§å»tÖ±û[5í[ \;ÀWÇ»Â^ûþû« ðÅß5Æ:…¹‚aÚ0³þWÎ-òPÛlŠš”+QO™„r‘M¡øƒKžPb Cþ8€?wSä=ø”Xf&çÍ ?e#>ù™¹ÎCP+:éÞ÷0Àú±8I#†¾v×´Ùá®j·«`©t'Á¦õÎxü `T€Ê€p5¬0‚׌ámf  ÚÁº5°†6¼!s¨C¡<0‚<1H° TüáÁ:XÂ%28£…5|¨—XÍ 3i »šÞÃ(Æ1’‘u=„ùÄ"þ‹ˆl¬ÐÓ¨*%F±ŽÅSö`GÀL" ÓÍ‹˜!õʨÈE2þÒ†g”#Ÿöƹq’Š#$9EÇ=rÒa\À:É«(°h0_hCã פ•@d#c)ËYòÐuJËä¾ÖhIPUr—jÁ$.Wµ5Q³a—ÌÁkyÍ`6à‚£p£€%-³©Í2>2˜Ò¥/+ÔËp’˜ÞTÐ&•©Î!Ã|°å:ƒA€×8à›LjA¸›Ûü'@ OžsAà$gÀ¦†Ð™³ rIç:#º%PQ¢GD5^Ó‚Gt¬™ƒIåQ€aæ…†=)J‘6P4:TA]¨ZÆ Ó‚µtCµ(Ný¢l¡x–H… €gf¦þ– 2¾¤üÅðgJ£ÕnÖÔ¥’œ©„dŠU®4´ªU¹iNÚ—|@ …Ƀ P‘ ¨DŒY9^¹¢FKÌ;†q7€P•*`JU¯öëª[}V{‹®V*`+d‰aè€0lx+1¾ ·¾Fµx Là0[vf˜! „ ÚÕ²¶µ®}-lc+ÛÙÒ¶¶¶½-nYË•6v./U,X{XÆöö)lX€X&O¸K(‰Q ^Üh8˜R ‘  @«¸ f‘’„ ,0À^À‘‡×˜ „‘Å3nà…°_´ ¨ýò·¿þþý/€,à¸À>0‚ÿ‹BM±´¸Tù-p½"Ü­×ÁL9.rqzœ€0(ØKºtDá( !1¢ðæe]@J%î«& kHÆ`°€¼à8Î0õBP G•B – [ÃA^ç'†Gëåc D”°Ý…ÆÄïQ–‘Š1§b(¾ ,JÙö³¯ýís¿ûÞÿþôùq{ÜCE÷[åý.}ßRàŸkò€3$z|\™0C0[`Œ`‘ó¥ŸîË% <ø  & Šßˆù™V¡Ÿ%©ŸC±_û5 ?€Ü¬3Dÿù…%€Ô_À3þÆœCòô…$ÀwéE@ŸÆ  Î v2ùY©™Ú„$n”^ ¯,àÎСüE#@ ` N!V!Þàëä`ùíà"ÕtábŒ6Å&!¬@ÀƒE!)†$À[¬|`^(È€Z!æ¡†ßøaƒp!ö™važSš¡«\ÃÇ(S¨<ðÛ`Xµù#ìX`$Ûø€k” î!(†" bá-ùa¶"Jà$¢7""’È‹:)p-œˆƒêÅì"^0AÆã_ôÀŠ¢2.#ø‘"þ9 îAàL©â±b0¹â+ŠH¨'œ‚6 B'Ø€àƒüŸ_Ü›9›/ÞEF€^¹à'2£=Þãõ9câY˜4Â5²‘5â6f#ˆ¬\:½ÃtE,L`Àñ¡Ü`B;Ya=â£Fndôé#4>*vá?Q@fÒ@äkÄ” 2A9`ÁV(€5\Z_(ƒ>¨Ý_A9XA`ÔÃ7lž_Ì4C2r¤QŠ¢Gšâ)bp â–$$$JƬ8Á:­À#h…6¬䟖Æ:,ƒ`ìƒàDCQ^åm¥[^aŽa?.ÔH TÊþ‘TNå`\ä:BÜ‚Tdð¤`l૤_eäö]À*¼Ÿ¼¥d6c\já\"T]bÐ]¦Q^êe`ôƒS­ÓÈ0¨s =4@`@Cý… #`œO¥åõfèÃHŸœB9ð;`C-Dßnöæo§$Â3è;ÔÂ;L&x˜– HßsF§Lçd`R*åe’SfVÐf"Qgzæ_ÄãDT¨@ÄÝ_4>Ä`T-†7°ƒ‘Æ6Ê,Ô‚ øÂ<7œC÷½=¨>|‚ôÍ tÑ3Dƒ:(„ZøA¨À,À€Cô5þh(Ç@ˆÎˆf§vVfvg8}'î„ç'yöÅ@³©ÓØA †4Æ,`Á †9T‹˜¬÷g0pAô©ä),(.X”R©pƒ;œ—ÚpBô ˆ  „阦B™ž©Šàvš¢‹úŒÖŽŒnÖè^À1F9ÄÚ`<€å¹ 3Tä](8@0B" @@ÜA< p_ˆIXæCõejõéCµ¬€ô¥=l„>|@¨Ž*”j›º)‹>`HþàœÒNJÐâi^#2® ¦`à"F#„A`€@ Ï8Ð&þõUÃ7€—ž€;È€4ÕTµVŸp7Xß=TÂ5܃"ô”t뷆븮ê÷½©Æé.ŪՈ¡Öª­Þ…˜VÖ:ý@ FÐC`^˜C`Aý¡œ$(ëô•‚‰6‚<ØX-úÂ*´B1À¹VìÅflÄÆ8´À d¬©Z(8U ¼B8ÀÁ¶žl1¤ìÊn«ºÚ`«Fã«ò ¼Fͬî½ÖëQÜ«D%`ª2Uþ†1”V²2föÁF@,ÃFLj¼B:ðL%D_Õ^mÖn­4Âàƒ=pÁ,ÔAôU@:xª< A¤íÚ@Û¾þíÌÒl*å2e~!!Êëö¬Ï­:!æ°ÆÃ« C'Æ!tei•ƒÂÖ-äæcÍ‚¤ÞJ˜SòàÎòIù,×®2ÅC­¦>(`HCFüÀ`HA®‰$,ÓF®ìf»ÊåÍšZÎBMæf àÖ+®®Ó̧`hì£_HŠÆ<ÌÃ`ƒ7ÀÒzâìV/öÕ®eÞ.Ÿå.Áì.Öô®­¨î:ja ÃÒÁŠ6ÐØ¡†ÃãZoäbo‹jï¶]®©y/m.ç6 àè:©Y`°Àú|Fàä_X"1ŒxÁûÂoÝʯ«VnWpïÀà/Ó€/žþšç:]òñŘ@ƒ3ðzý… œ_ì5˜¯6ƒëlc7Æ®[/Û¬{!Sj0Âpp‚æSµ¤</_pÁ0à6\Á°_¤9FÁ®:6Dð ¯jSîkçŽßj!“'_™ 8À °€Ðv`tÁ÷(ôèQ(&g±Šn±ÌÑoÄÙ/Ÿùpéïþ.LUª“4$_H€+pE¤Ã™á…Ìq^Ð@$÷9¬¢åÊJæ±O&OÓ +™ óË{¦J¢¥2Y‚hý…:pÁVìBtØ^Tƒ;0_A3±_ÞÅ!»à<‚þ132'³2/337³3?34G³4O35#³íÝ-wŽrÕ•ò‘ò¾¤²^²ÁAªÓ&ðj_;,V¤‚/î]¨4¹Ê¸31ì`d^híí3?÷³?ÿ3@—â}dw±ss„yór!ã Û™/Â-˜A|ñE³*ìZ9Ÿ^ü.H{HIO’I› JwŠJ£$P”2Y;F$ˆ;Ôƒ_œ€=ýE8qˆˆCÿ4®uo õu…q&5AFÈ2¡ƒÄþ8èADöE< ð^Ðó^A0À&^4Ì‚Ww X7–X³Y‹ÊQkRWöˆ$èÁ ‰0Ã9¼#`ÈRD¼c;Ì`VaÑa‡JbsZdtâu©Eó…3°d±CGïE ØÂ`´f^X|Øg3Lh{Õh Qi‘Y“_jg£@‰“/´Ý_BŽòÅèMŠp`(‚/çE€Åü6¯wU 7÷…œ¶M-6xH:s’ Lq_4AWúÅ5›_ÔÃkïÅ:(©_€Òz5A‹²A "ß>åqã^r¿¢@oÙù…1dþÅþóÅ(œ–_@ƒCþÅ¿F+€é…Ýž9‘¹‘ù$–"œj3ã!4p8ƒ48"âQÚˆ’t¢_à÷_ £ý/tãÅ ~òìb@›+y»2ùî9¹bAù‚ÔyÖÌ5dA;öÁ&÷Ř³_°6^ü';ºQBº¸âQúùYúpÍù¨i:²øZ'ÂvëÅþ=ˆe_IJfçE*X6`H›áÚ°«¯*¬çEˆ·ÔˆãNœK¦£“z§ø` B‡‹’ÈÄûE#Œ€_€<ˆ ^ÜÚ_,Â3 :^íþƒl{‚€|ðÉf ‹Õ5=1¼×Xâ" ­LºëDþª•ðCWÖ ã+ ð£ f‡ p¬x}pYáœ4tMà 7‚m*ÙŽ 1DÜ„+ÑD›|;QÅ܈ÑÅâ’«NÆi¬Q¤-PÃÆ­Ëã*9ˆñÀm¨2‚½°Rä #ËR1šâ™g¦˜¢Š+¬ñ" ŒÆ°£+‚á!†$²‚!‡ÌÄ!ˆ9HÞ°‚wN¨Ó8IƒøB“Ã?MÈC©@|ÑЦH\QQÝR\ÔQZ°B\¹ç‹Z!äÁW¤’a–å–¯e™q_N|R™þs®Üò<@ïò¯ä*|¹j&¯ªE’²Œ¨%b¢›Îéõ*((¬X(ƒ­À$?ä¹ÂX„@XCnVaCv?DÅpod |ìábˆ%Y¿!\ûŒ )ZɯöñƳò¤ÀŸ–òÍÙOWbÚ'æ@²re’«À*rì'+hH×d˜ ÉðƒŒ¡ží- ìâÒ÷¢Å™OQŽ£`p"A­/~¼”ºö]YyG7”Ã9­*K(€YÊ’.À WyZq˜Cf=ð{” ø.XÁòƒèó¡¡8èA%ÖhHKûò±æ4âWaþF°BX”¥ é Hê(Øv:4ã9ÂÃ#j‚D,‘ÝÈ"#®QDI\â©£ ¤TÀ¬b/ÄÃ*ŽxV 1¯¯Ôã~ Ap@F4N’’Q#EÔÆ8Ž›$J1Y;ö‘”f9‚>ø‘„ö©@•Wá «r X% tÀVaeˆä\@1$YIa ó’¡4Ž&=ɨ!&³( 4¦SFYJivÅ ðû°Àެ\ú”®²€Y”Å6I€R„`“g,æ3kƒLf¥“ó܉3á¹”hN“ŸXqîÁ>*@b9O YBò‘#—W)†þ¼b„)˜C$ÖÙN:ð#êa>"O{ú¤ž#ÎA ͨô“¥_±1MQ8À* ˆ¤HVÀ‹?#NÈJC›ã  `Q5êß™R¦ˆÔ¤;)iSk‚O¥¶dŸ-µ*HLpQö5b®ª¤¢分Æh•3HÑ+Ȧò  Ä°¨GµkÈ’:U˜0ª8yj_¥ª×§¬ôª…ÕYPØ×`å@•Š(•QX¢ùB60ª ¡‘]éC0*’sh—u½ëi•WÁR«¯¹ù+T»Ú“TÕ°ý<tÁ¾€Ó*Ь (N1•Mx &]P<þRY‘X@¹]IÆTŒ¡˜5`¥ kxÄu±›]ín—»ÝõîwÁ^ñŽ—¼å½n :J¨Ê–%|mmM^ÛÔØ²—¶µf§ ÍDÀ*©8ärOa“F¤¡RiBs·RVT ³ÃŠpa O˜Â¶ð…1œa o˜Ãöð‡'|ج—½*qï{W¶LG¥%^I}í[J+›+F¯ ºr¥* ITAïˆD p0ÁWÄð€ª¸(µˆñ“Õëb—œø½ñ5é|e c(ã‘ Ò¸Ü[‹d Êbp d Ý”J ÎÁÛ®Èy*c ¶¼eJù$Tn­•GþŠåÕj9ÏJ¤FC.ç ˆVe ¡•Jà*‘@Þð‚ÆL #8V+‘ðŸU€ úÉ{æóm€¸b§ªXÕ‚,¡I?]@¤ìA­©¢ PT¥i‡"À @xeçk *„$@Ñ_¬kkj>û¹¯€¶§«õ kho¸¥å`!VªpA _Ƀ=^E à­\9‚¤2 àA NøP<`ˆz|…Ûæ§´¥Lm¨Z{žØžª¶ý]¹K –3=Üìr4Â*Õˆ‚Uîaˆ®$ÇRyS±ŠÌ„Oà.xS ÎLƒ+á#§Ù€rˆÊ–UÙ‡—©þ‚Tå ù° 8žÛŒs*T°?°@6â›@ î­*º¼”%/ñÉMšòd®<¥-§:¹Ôy¨ãŽÏð9U¾ðé©ÄbmÁC$¼bˆ OEÈNnÀ”ð뤴:{±>R­{’ë õzß=µ´’»fP²˜Aû•”v*+˜‚£±ÒŽ~OekßÈÅM€q˜ñwü»loÏÁo²ðù<|é-…?ÐùêA¦3ÅŠÓ}E. æ¯rr´›*Æ]=lòx Uq }éOŸúÕ·þõ±Ÿ}íoŸûÝ÷þôÅ}8Ÿ:õó\}[Ï×Ã~G /n!…þ5 4óFøEò-Pe ðXöT¬ 2 @ºâF +Î#l‚þ‚@l)°-ð/0+ÊNÍÄRMÕzƒÕV,ýžiýدF\A_hbôÁd®}ŒÀ Æ *pn**Á/¨‚ô`ÿ¶…´¢ øÀŒ&þ@ì|*nµ”C‚a¡¥=±å7¤[Z MðgÄ ÀjÄŽìÆœ¬…P *ºà*Ê*Ö¡¸¢Ê!€à$à€@v: Ëh ùp5šÐ£ 0%Ê™ÎÏHИ²P ©ã €nÀ&ZO\ê ­ºâ Ò!Óê ´þA¬úá⸂(j+À‰n øD" û°5â90Mb“©‰èC)Ñ9 ¢nÂl÷lD’¦*Bà' ¨"Ê¡‰Að¡¤`øÀ÷²‚¾"æ¯ô›öÐÅ‘"`ñ eq?° áKQ 1Iw‘9^'äþ.g äÀ·~A"œ. †!·´Â|¾¢ÛøŽ Çñ!+¢Ifü¦-Õ1ŨP Ý‘Žà1•£šº &¨ÀHáð @^S`á즢 *Þá‹´âàÂ`ª€¨°‚‚Ó´B€¢ "δ ²(þ%RüÎ/237r:Ò#¿Âòp¡ fŶÀÐ%S°®º¢j* àÙBB & tA&iDM+X±(!ò(½')Qm)ýŠßë)(*¥²+ø¢X² ` Åe|$p¥Â°q* à¤¢â¡&ràà`hª‚¸A±B€äðuì25ñòôV‹=Ƀ0}H0s+^Ê”À6(l!~°ÀÓ*AŸa h‚¦@ “*^ ,Ëb ¿è2µ§š–%5e5)2à,Raó‚dSƒh³6³Ââ¡–@1È`f¡!§"þ¬Q$`AÒB‚òD"0z¡Òa²bó¼âMàg:3âÞ€‚6Üa ¢î®;ÿD;õÒ57é;)(<#h<ɳ+²(–ÓS0!¸¸BÊøæ †¦‚ò  là°ÂtÒ,XfI@1B  4Âcc4;p"#´;«BÍÇBÓC3t+ê,“\>AÂÀ€ôB‚vj*,`F¥Ø¡²‚ Öà ˜#_ˆ/£,b0 ã0¬ 1£1ð2"c2ä22c3v”VŠ G1B“RBãˆHÇÇHÁI“4+`HesØ€ ¦â4j* ŒE±B –€Î~üþ`2³¢.+¢=Þ#>¬`>Ã>ðC?€?ü@„@ ä àTOÀ—GO-‚OÏÑOÝPGP%‡P Ut†!]ØJEB¦b¶HU45$š ðo*°@^ˆ9˜l!,a@aRAZ`hÀ†  ` Î!#ºäKÂdL‚Åct@ÚÄ Þ$N¬ d@ Áæ“VkõG‘²O…T u•qx5q|õWiè!3 Ú …¨"^R*ºþO$æ!´BªÀQ½"àÐ@®dmåVr¥WÊ^ÕäN/&X‚ôÁ°À_ÿ–/o¢`[æ`a&a–*þdG Çe(ëSüÓüó œó+´a æn9VamX`Pa<*¡¡`æÀpÇ"Faê¤a&b&¦bÖ$XxÔ À˜ ºal–6/sVg×±)[í ;hƒV*^êñÄ÷æà¦Â@–*^ÁR©ÂØA½B*Áv^Ô!¡Fj¨Æj°Fk¸ÆkÀFlÈÆlÐFmØÆmàæ ê`ù\àf òV!lUq•ˆxVe|Öd·pCà ÇÅAÌâjs‰!èG* ZÉ*¨.¡9’€*Sù‘s-BvĨvnç t‡w|çX"x†§xªGþy˜çNiÅOjLö–5+wƒhwS¦w¿åw—аÈ…ªU*ÜP*”á, Ú`ÇB" ˆ¶…ÁK™#—´!€º‚Sã÷¨n7í÷‚ðw[ô7f¬ÅÅü¢6S|R *w+Ô.$Ò +†@Ęã øâ2˜:7x£: ?˜‚BX[FX}JØ„=Åw 8SŽÀQ롤â<º:”Æ€4ë*"@$U9’aÒ\àŽ+4ø‡5*ˆ;pˆÍ§ˆ¯åˆ¥…ûWBl8SÞ@:³âW* ¦"Îø*î <”f$ ƒÐ؇՘ؘüáþØZäxr’X‰1EdË0S  “C `*æ@lPy³¦`…½â ¦@DbüÀ¢—F™ƒçw;Mn’U­’å’%…ŽW `=Åå4߃ËB˜`…àÜ̸@ ˜Ã. €ú¸‘oÙ®"¹"ýöo/˜E˜ ×àÀš<%Zë ¤¢”÷š•*a¦¢ ì` t$ pÁ?¹"”q*HQ½"»¹’¾™;Ù&|ÙQȉ2Y“/å>$S¦€‘±¢ â“ú!4¥Â¶X$A` Pao»b Ö-EbS8Áù ')¡wy¡1rœ÷Ô̹p…wÁþ2Œ5$`*@¯as%ÀQKàlÒ h¡–»B³æ$–øa{75¦eúŒhúêxyÅÚeršÏv:hﬡfAäBbÌNÓ°•‰¡ïŒÀŽáŠKì¹*ö :¿Â ·š«s9Hm:¬å¡_¤¬6ìÀ\ÇR¤Á?ßà+A"Ò  ¤‚6º:ºäÀj¢b! Š+ž@ŒV$p…x3غÌ+¶e{¶i»¶i» »oñWD±7(¢%ÚR†R’G*A²bÔI$œa ¨TÏ€ j R€H@¯©Âš÷*†»¸·Â00¼Å{¼ÉÛþ1þq÷«QŒ·ÏG/¿€±¶µ1*6$´a¨ ¸%U«bÒ, da < c³B Ò`÷¬"05²ƒ›\èW¯Üx|ØûD|»Ž€»Ám$Ðzf  ¯Ab²¥¢f¥¢¾*L t¡,ÁXµÂ±:©ÃgæÁ§*ÂgÂM¤ÂC¾õèÀ¾xGî@É¡‰‰^A*H ¦ªCÎ!(ÀŸ¯âÜ+`ŽÉeÜÁuÙ«Û/[Kǃǵ€?yDB+0`Ñ@B¾8 Há*.à ‚ÓŠ¸Þ´bSPzË-…Æ•ÊÆÇKDÌƒÌ µNÕRÊ@¤¢Jþ|+>”¡K1·ÂÒÐr§" ô@@ÑÏ=ÐSJÐ[†Ð…ÃÐaäÂA½:Ö†×F0AËA‚èl ~ ¹ÐaŒ§" (à+˜AV + lV]\D¤H]eL½ˆÜÑ“ÔFK,mD¶w•ªÛàšB"Ì)$>}*A hÊ+– îœ*n¦Š‹=SŽ=Ÿ’=e–8PÝ6Â¥ÊûÞñ=ß/¹Ë´jGtÁ»‹ . €š­b긢bê+¸pÖÝ»ðÔ»ÊÀ°ÆZÊÂežÁ¶=þãA>äÅ Òº,†uGT QO*XÀÅUÅ>µâ àØ ºþE3â«£ÝáéÝ·%ÞycÞE)Ì@›ú ä¿Bø¨¼FL Ä±ÀD¨Á¯BÌ»«ÂHfð+=”ãù¾ïìÑ>íÕ~íÙžäÐçŸ èµEèwƒèicã‘>é…ié•cSž:¨`ÛZ11!ØCb | $´¡¬b ž+0a”c¸+:°%Pß1?ó5ŸÂüÁàÞ˜äž|w3ÞÅð^ï÷žé¿Bx¥¸FনZ*œ!†¥ÂÚ®É1Z+Œ Zµ" ðj0°µõˆ<âQ¯âÿìâa«ôKìô’øÞ,€r v^9àŽ‰!”8íŸþΓ9[_+¦ ù+Jq›ËB°§Ÿ½=˜ù«Íùå úéËèó>þͨú‚˜À ôàžÁ… 2Ta`+}=x¤ Cc&–8$8M̳#?Ê€¡¤Ã2^¬¸| 3¦Ì™4kÚ¼‰3§ÎUvãjFþ©Bš„J$ Šu þ@ êI—LàaU˜`E¨ô”Ö4åsð!–ÅqCõ„@ÐÐcÄ8ä@0•Â-÷ÈѦ2÷ÍŠ1~Jì‚6 „ã¢Ê zh³Rꬉ*«h£Ä¼cÔ釛ùH¼À…4Ä à0•2äà0òÄ“/¹6j¨ ;œA„¼³‚ ¯á@þž@‚LäiöhÈþEe>$9ÇRÈpº‘‰$‡z …—´à“{ 0M&“5T!ÚÈ@™¹IñÕÁ%ø'2à’Xà¡t-üF8ÆQŽs¤c m`ä@;à|ðÃ)¶&®Èï"†- Y„#\È18R‚ˆÃV¹à’rþ„ƒ¼ ^ш“¸â_¨@àôü@ÅpRbŧÐN­-Í’°e0ÃÐÆ0á ľǾ„ # køÂA.Ò#H×Ñ-18õÑèJüÚ 3]R .pAø`ƒXšÐ…Þs­Çië]WºÆf®êÍŠ]Ï›–¼&RÅ ƒ¼p‚/X!‘dW§€{paµ‚ ¶À;¸/ `€D‘;à/ÁD:ü +`’â›;ä ‚x’Òwò'’Vô8ïÑé—êå(ƒjÎýøÑ T”b ðÀ2P‰ D‚€€ þ€À>î1x´C`Ð 9D@;X`& @ `‚ZÕnX±ã`¬c!K^Ò˜¾¯g{uÃÞ7ïæ,l6Љ¯¥¸4êº8‰Ús´ }À‰BUˆÞ"Êc^ÂÄØÃd"G7Ä ªà»’ñh`w¶“N ¡…Qø%×8‡>6ø]ƒXİ€ ¬çѬ¹Î;r³œåú•[£“δn|c' Ü®ûЉŸŸC»’®GnC ˆÑ‡a $ X@7¤Ã ñFœ+XèÂ\€ Øå=ºÄ1ˆ Ÿ­GKKŒ½VKzu­•8ãûï­wR~ o™ïþÆ–06‰)dR o‡!…² I8ï ‡;r[5gpÃ…6Î!ïõ¤›'•8 ZAØ^.vÀãÝ7¯åÞû®M®k®•~ËœQwÙËxlåÀmzCÒÜD ãUAÆÖb„è™Ê#e¨…82 €¢j#ßIƒ½ÂŽ0¼dàü(øÏ‰3ë3…æ8÷ÏÍÛ~«ý ?{È‚®Q ªD*â…¬ãKjH‡2h‰Ð@§1(2SµÀÃm©üÀmt‡ÑîøKûÜ“Âv¸ßBßø–»ÚëÎùrá4Þðöœ;ìC \˜P1ŒHŒ78â þUx11 à{‚”A °§34òˆAdÓ¼^×Sï0Ïþ(¡‡;éumú£úÄZ=ht€ ˜ Ä8Â1 h6ß:Id¼y as/äü „ó7Ïý‡Iúù±µèóývÿ7Ù'sÛ—zâ}š1*d€~š‘ë'€KÄ`bÀ!¡ Y l澀בp\ržv€z³ü÷Õ×v×wkèo˜‚Q’€‚aI“ÏAp 2Fpg3 ìðaWy·QÐ+R ̰ÏPLQ  "÷Wƒ!³‚üç‚8ƒr&ƒõFƒY8#7(¢äÏ!þP~p€ -¶ÆcÃópt²Ô€ëЀ ñΠ[ÏG†x²…Ó×…5÷…o†½ö1å€ “H‰•h‰—ˆ‰™¨‰›È‰è‰ŸŠ¡8‰CppXÒm.µò2ئ ÆP¼tirk¢%¡ŠØ˜ e£1¨à\†xˆK’ˆŸ·ˆûÖˆíõˆ´f-Þ Ñ(ÓHÕh׈٨ÛÈÝèß8ئ[ º  Í5• ÜÀb¨@D ™÷‡`ö"aÐ ú°‚á ú ôÈuøWŒyrŒs—Œø¶ŒêÕŒuf-à‘)‘9þX`~*šÁ F¤sÀ 4P- ”GÉ "RæÐµP1 ³ iêÈ'²ne°À“=é“? ”A)”CI”Ei”G‰”I©”>éò¶?,h ©k IW ÉfI‘Y©•[©ó ÑX°ð°J`fCÈEgP \ôÌ@ ðì0 GøP 4ÉVp‘â\Z Š)˜ƒI˜…i˜“ÈxO •D!•·F•qe•ð…•\I™•i™ñzÀÆ%tì‘h"À怙C@“ÐÀ™|* ¬àPÏA €—I›µi™Š¹˜)gyN‘þy^“i›Á)œXâE¯ cè`\tUð á~:yaÏàR1 îÀtÊ! öšÃ žá¹"¸ •ºùf¼IN¾yWÀ)žíéžAúÀYæø ë@¾‚{ð_À ¸ò§wÓ@-yÊ!Ðïé ÚäÉ‚æÙ^è9HêéVì ¡*œ°.ÝÒ` ê†ÄÕ±ÊÆäÞ@ƒ>Ð RÑià–‚ay~0ê£*¡\èhs·A¤R¡ê¤¡?ʤ\øÀŸ@Qî°RÌEnÀcˆ %ô€¸sy þ~Ñ|Mª¦Â¤Š8¤GêvFz¤INKº¦w ‘)Œ¦-à P òÒf`¦ ŽÄ` ±±ôøˆKðÌ_Àüàxª©•Ù¦Èø¦pú,H¤tjHvº©§º"×@ðŽP'VP °2 '²& Å |¡ö „Âs8‰ªÃ*‘ŠŸ ª H¤ÚG¦J¬Ï* Ëà~΃׋à0ÚQ Q•öR€ G` W*<êÀxpšé ¯ñ*¯óJ¯õj¯÷Нùª¯ûʯýê¯óš˜ô¶˜Œ‰¬pª¬Ĭd-Ú ë° þ±+±K±k±‹±«± ±ÕZ5O’‚Q Üp*ÀEsD*‘'@ˆà†‘•e@‡i³7‹³9«‰Ms•{¤û? Ë?ÖRé°I«´KË´Më´O µQ+µSKµUkµW«´<+‘ãÒ”Ú Ð“ “q ]0 ¾oàýà]°er‚ìÂÐ/;‘ÄX rjG¡ê%´„C´‡c´™·41ÎeU@0› çp‘p&_ð%I uñÄ0¢°\™å •x[¸ñ±·;×…5Sá@P~+ª¸~3¸¥«'‡ë\óþÀü‘ Ñ ïà•0äÁ¥F€ jÌ@ i •§Sà±ÃH¸¶k,N)°ë‚שP —P×™9W8³Û1µK½Q‚»ÎU%H½ Áà 9Ç |Iˆ˜0‚ºešI/£;½é §+sÕç5° ¥0~ yP5pƒD¾c¾ƒ¾<#ë«[Ò!eRÚ  WYÀ Z @$‘=Ã~™•F±Ä•¤‹Áhg½>K}@K7p (]Ôà¿@N|1L-\ÃÕ«•<µP1¥ð ò ô  mPÄÜ€¼(%q ‘þf`’IÃI\ìo¡Wy0]3ıûF¬,HŒÆ ÆÎµ;=ðCb¼0x k ] \¡á€q\Ùöö7Ã|ÇßtÃ8Üdq Ñå±p·P£€´| 5 \¾¼FÉtwggÉw¡ÁÎu ìlH cpJú€L°\y ‘0ìe•©Ê«\j\oÕGŽ ·¹>° Ï ÍÑ,ÍÑ|<<ËX9 0 €⻺lÊ”lÇÂ\­ì\z ¥îI?@F@ˆ&pï[z©j4v»•ÁlÎ=A̽V}©ðQìp ù X± · þ ÿj;ð#r¼5°¼0p Ðp ¿`ÍÍBÇ‹RÎÿÌV¼ì\/ÔàðQpçp…ëqW`à|–éÏ"­MkÕç§„ · •  Vñ ÊðKÍÔMíÔ:tX°^9€¨ˆJ2°E<Î8Ò…;pÔ…OùCÒºå å–Äà§$T ð6®ÏððE8 É:=Ì“|ÊÕçǦä· ¹Ð¤<DÀ ‹ÍØíØŒ}·°(0Õr*Ã0]î@ Œ(]í³_·`7 ?d]™nK;hY‘äò²FpY0 ntþ È³JÀËÆ€ É[ÌðQP[Ó`Xp Z  ]à à cPepj ëÐos0up‰P|}Î~MÉ¡w<µ0á l· à@=VaŸßñ-ßóß•p ©@Ùdƒ¯‹L… ÄÌìÑž=° ·ïVÜ07ó/ñØ ç³ã€G0â_à ] CZ@C54 T ÐÎ0©Ê°<”æjÏQPø°Iç€Ï‚1PÐ y ½€¡ "UMîà%ô`%Ÿ üÆM]ü€ÇÞÍ7ôq½¹©ÃSóIgÐ þÞ  %àµp ›Œß•M½ LIß¹€ R}í@> ÄsvÊEaà‰àZ * ¸ X\ 'G0¨¡ NÎè7Ɖ«d­$ðîÀ°”ü`Jd¼Ä "° Ä &p%T #@ Óàb3@ P@ðºRQ~x° ÄðüPKµà2­ \ Ä  fÀ_z~oÌúéö`tPé˜Þki`d0áð ÀÄ[Ö@ S0ÏPàL v€aJžò´@å/ÁÓuz>°Œ<æ·pÉ c\VaæµàOðoðQ€þæù}ÍT}>Ñu· V W!5à ñÏñ¯ñX ÄAw¾˜}^Œïö~° .q Ű×ÀWÀPž•79ÁÊàßb0dQi0QÅìàð ò@HŽ¥™üàæM^n§Ä Q° @ ÎP @ O Š@ Ìð‡@ MÀYð  à· à .%{©IÀ“ ä GpNÂÎ0 Ò€CÎÀ (ž ÈàC‰·à •)ð 4ïôÞ8ì‚° 6  AÐúî~°yNfÎŒN ¯æcá>] p^×þP¹@A@ Ê€û¹¯û»ûÆ ÊF òz¾ç¨,|{}ˆÌ4Fâа/! ê¢(ð°U8ÎèrȾ­ M0[Â-Ò@Ü]ÐØ svb Ð Ô€ m9úê`Y€a›¤+>ƒà ÎnÐ$GV~`ïO?;¸X©ÄÀ<+8ˆ“eâ1<îNUØÑãG!EŽ$YÒdH~ƈ­\¹%À˜1eΤYÓæMœ9oûsËçO A{Y¹U£Æ­Å&.Eô§[L–N¥º”Ê™[©P8å t¢ª®]©:QP/¹žýU£Ú[¸qåÆ Ò‹Ž• þ\‡EÐÙ×ï_À4)Ð`I¬Œ—“‰/fÜ䊘s@ÕxÉÓÆÅZ74"'NYØôiÔ©U§.C# ¨H·Ú¶iEÈ< åöJqkÐRùÛøñÓ‡OBVú®Ú!+qJèmeƒ=?€ð³ƒÉÊ=‰QC>´†åØý{øKvØþ}ü_x† šã–Ú¹E›6ª¥+¨¤*«¬«²ÚŠ?§¾‚«Ù¦’ unpãš9–Шr(åK4ñį¼ôâ+?c¼i°Â”‹ïFqÄ€:XN8¡‡‡¬°€!X™P¬¨@!W–™(ÅæþCnÊßÊ YŒ0¨\­^ü˜æ·0Æ ˜d¼TÓ6K‚l¢w>‚ ÊŽ ‡yè0 #È ²bÎ?Ùˆx®ÉñPDå+Ž¥údtÔÑý&Äâ–C&ÒG‘[Ôg)v@‘&®\A¬´š0( OJ—©Š¸‹n©b¢1Œ1‡kTJš[tj¯Gƒ‘F–ÚLôXd?"¨*ˆ´A |¬± # ¶Ðg_ª3IÊ5»e©{ˆÅoU«¦‰ÛÆ€+˜)÷Ý•Œ 2ŠÑFNm­pa"<êS @!»G `#Y„ã–˜F…u°HõP¨ºà–?ø€Ÿþ„Ù%Ô¨F­ªASu½%U“#YÊ3„n)n¹áÖkÖIãfœsÖy•[xe1¯__|x辈±„“VZ± 0'ÊEá]3€pgˆZêßÐI%ÒÄÚ[yEô1mI š#Eà€:z$2È2(<î]ún”®n˜h¾kŠ8¬zð(K’[Ùä–^øUä©H~PW”Uõa‡2@b[>¡Š§B¼&Ƨš¥ç^ ؾSŒ°b‘Æûu¥¥;¡:–YlᯧìgÓ`¼Î}µ{ÈBó÷nÃI‚óZÀ„#,9ÇT±âäPGSfÊøA…br$P}b nþØÓ·bá½UOýo§¤¡BŸùèCf6 \l“@©ÅãáEtÞ"Î`iK]úÒ]`ÅoØÅQØ™JicCªJ A„f4!q]‘#.*Á …ôaõhS•ЋžÆ…ôÃ)Ð%µ9la"£þ€aTSM§†õ$ Uj°FŠ”¸ãS¨Á9¹â€|ÄU®s¥«\¡„£¸uBíäJ)Fõ ¬…?E}àQïÈË<–UFLkc6B¯¦& ¢Ð<ÑÕnu£G"‹°:V´!«betV,˜—N“FX~ñZØÆV¶³•Y.fvS†åOܨhq‹ ¶ŸFàaÒKÓ‹uGms·ÙÏ¢æ J°”,Àá%cÀmÔƒ(˜]ã„Ö¹Ž-mrósÖ[HbµøŸäJ!3Tæ6,#$ÌÂÒ±¸»“ÚâüðÑÁàr—½üe0‡YÌc&s™Í|f4§YÍ]^ñ…ÃËúM$(¸„îAmxcx&p!aˆ¾sóm´€ D'ZÑ‹ft£ýhHGZÒ“¦t¥-½èG2 “XÌHâ…Õú£D 1‚à^ £ÎðI¬!XÇZ HF­km#€¦@ÆP!ÄןˆClF.¬ÌÏkäàËfvþ³^qá¾F,§ñsAf@ÛÛæv·½ýmp‡[Üã&w¹Í}ntw;Ó…¶ 3.@yòo .»í}ï{·ÏÚ}©ŒÐÆÕzà€œ±Ž¤á6ýŸ rQ- ƒ(å°}’ àòRv@<þq‡üãÓ¸)^í}æ‚øfyËju@Â:@‚™ðQ$Ø@ƒP†Ë}þóiê;å8©3æ±Ú‰à£ Ä8?ž0\pÁv@ÆOžð‡7¼£à€8öwü hÀ-|àŸ_PÁ“ûµ’»2 \#,½¸Á.ì~w¼çï7˜:t¿¬èƒ'<Öþî&^ñ‹ÇšÐï·EeH?S Á„(á'‰ëÅÌÑ t„! ÎÆPÚ‹/Ü ðI~‘ faüÛƒ2³—ñOG¨Ç’Ûkö@£]Aîãq"xÆ'_ùªÉ°|èG5Ž7¾LÎZ1Ê`›'@~Á ht¡QDÞ@Œ˜>áæð 2A¤ t6°•0Ú.ß ¸¡H?µòð€y8€(@,@D2 ;ƒ$¸…°¯8¹[(¾ê« ä“> T¼>€cÈ@Œ>ê«@ýˆ¼Ÿ ¯ìc‡% ‚¢è¤2è5Øqxiø‚\ø…¨þeØT+/B2Ÿˆ²Š³= A@º gð-¨ºyÀœ[ø…˜*¬Â)h†(ÈÂ,ìŽ)„‚ž89 A™¸À<= ð?®°¸ÌA:;xeI"pƒ<È}P†Ÿ˜“A/: À#2œ‘årCR´·î‚RLE–ƒÃê;+F¢C¸ƒøa¨E[œœ Ø…\ƒ­™- ‚ZÜck/E̤Ӆ[`HÂp‚qàTø #€2„0„8¨@‡ ‡@¨‡H³þ»…ÙS$ÃP´ QTEvŒ¬€`hGy40V4¾³JXT/2ŠŸ(ƒ ì‚[PYr½ß«=üû‰£È½Õr¸V8§˜cPH†>ø`$›Êrxƒgðq”™#¨†aDÇP4Ãyè& :°¾CDõ‰vªa8ŠgÊG˜„éÜ…~ ¡]Pѳ- <­@Ò¹\„e„S8RN)Vá”+€z„¢Ø‡K=X à¼+ ¾‚£`Ý8PÈ3ù-‚5U•6­¾7¥Ó–„ŒXàÔµS,Û¤\pPªp€[p’Ð9F¬Ûj¾;ԮૠP‡\Ђõ9ðÇ¢ÌTãÛTP=ÉÉh`•PQm±M*Òš§ÈþÙŠlÙ(P 0` Ÿ¸að†‹Ïvþ¢Ì5H†P‡"H \yÀû€^ÅÎtÖbmGGˆW=Öÿ:+žšŠËÐI臲°.P0L0tð"½JÌv•) tð‰]؃pÙM}HLÌŸÄôÕǃW{MÅ‚i…O|5¯‘ÊD¨ /Ø…à¨nÀ¥cØ ,H`»hR‚è‰8\z†b ÌF²•\‰O<-Y7T™`Úí<Ùäê7"XÖ©0€]X‘á‚S\âå+aÀÕ©ˆ†/¨ê < X8k‡Q0 q½Ò¤º¥…Ú3´€Â[Ø”ZÓB¯{¢ (¸…š ?ø…þ^|Ö+å+ˆ¥Š4ð3x Sc½"‚8ÕºM¹»åÛ ¬HÎ]M¿U¬³º(‹9‚+a¸…WäXÜż ¨ŠÃ¡ŽÐ¹,@bÀEÐ|°¯ÛãÃßËÜ}ÛÜÐ>ÏE…äËÑ-«³Nõ\Š$\…Ð1ÚÅ%]Ík¨ v‚£[Õ[ø².@[@ p@»ÿ1^kC^Óh‚I¸_üÍ_ýÝßý‡æ$%ÿý#X>`N`V`è’šçU*ôºÑ  =X‚2~¨¨ =˜Ñªî‹[ˆ†ª°/U™5ð}À%~0„u×’üþÎ5ÙÝõÄÏò9ÌbMLRà܃\í%P¡)ôºJ©Šá;ቆ[¥àµÉ (Q  %á°°„ª‡8ÂÐÉÁYy wx-“‘_DX*V“ݵ‡Wˆc9žc:®ã8ž`:¸áÈBtèc?þã>n Øä„Ë`Ihà–b?ÀG~dHŽdIväeõ…!&¿-s€`¤Î ˜Þ‰ø†\Ø`‘á™a€)øƒ¼¸÷¬E  jÐb®¦ŠCÈ…lÈ…Å%+°?]AãœÀ€b(fc>æbæÀ0ú-ŒÝmmˆfižfj®æhÞ@9€<þþ¬ïåŸ! 4·ô$AÃn`s>gt6g/P‚zP< kŽçx>Bú±dLÞ4œ€Øg~îgx†q¨#îd °…²D²¸GŸƒ²seªYvŠ£x†ª¸‚[˜<ƹ#X­1 =þfœx]ƹ‚>–ff‰g–g˜žæ äÑØf¯ú^>øÞižŽ7j8ƒÈR‡5ê¡¶9È¢Nj4êwY‡jƒ(¼wŽiª>Â-`°çÜyÉlv2¨¾(‹Z¸…qH½$€„hØð¢š"å¥Hƒ‹æ .® u@P.‹ ¸…„æŸ7 é°0éþ›`$ ÄNìĆ„¥ ƒHx”–^‰—¦j˜žé.¨i=V¨ïm5èlÏþì@°iŠª=Ø‚EHmÕ^mÖnm×~mØŽmÙžmÚ®íÔæ‚;€§N‡Nèmßþí áPdv›jÊ–ç#œ‚Àj­n<|¾‰l˜nê¦nÜ€`_Š`á¼Ø©Ð‡'ø‚Q±ƒ]˜†ZЃb„‡#†}ôÚ¥(‡º aØ¿ªX[€…Ð8l¨Š<­Š=@L6…áa$TølWð€(ƒÅjc/™ìã¶æ™Ö†ËÖæÌ6¦Í6píT8x…žS¨=°»(Èí¦Vÿþìl) û9ãžðjNnmXd~n›Èæ:hñήj1„LŠ`Ÿ(©ªÀ„[8†9†[0YPÆL„)xûëZª‡ø PYð©°bx‡Ð9ø¤‰¸‚<Ðg—•¶soúAßÀQÙ€D¿zy§wÏ~tWbêúz°G±÷²x÷lN‡÷¨v{PWøhãxÙû‰§…ÏvuX—õ+šxÙª†B( \p ’€ø˜%™ l¨üŸHvªˆÝV•Þ¤1`ÀÄ#p+­š € pk Á‚‹ðe!ÆBlÈ *5/^TÀF‹ Æ )"É/hK©r%Ë–-±h£m&Íš6þoÎ'h'ϵlp)t(Ñ–×bvìø€ˆ¤À°ã (Õª{–Yɪu+×®^¿‚ +v,Ù²Y¡Ü©Zu.I1úp©ã¾eøy0¦v/_¢cˆÁ)Xp=†æÀBß¡[”l(@·A Õ±Ý,z°‰,Zô°?ú0âȉçÖD ´nO‹0‚;j”‹ÍåƒgË Áä4ñâ=«2>P˜•Ø­ñ SãÕTwªÃC<*Š¥z(WuÝ•×À¾ p‹²ÊX«h·â˜YœyÚ¼% ëåmÂä06÷@;åÐå-L‚mÞâPÜR3¼Äm«œ0TYÂ-ÑIJA>œëY?QÞRlÀ+¯y!DNdõ¾å§¤îÁ'_dý¦ø¯Çû ¼±K[vp 2èঠCÜ·ßJ¬!Å–Z ˆ$š(w_¿­È´Bf+e¸š,)>®QËaîbÅp7ÀŒE. tFÑýÀзüþ2Ð1­Î-ÕìPîÑ%mœ”¬9—Ê-PiÎpQÝ= tŽsŠHy§×åÍ€©ôRÔç½’Z¨ „–Ä6Šn7.XÜŠ¯D÷[vKj)¦š>Ê÷ßïÃÿUàþVá’¦º*ùj1>N£Hd‘!Ù[r…½]õêW™sÈætw‹'péÚPF.¤Ô[ì·H†Há ìà êP‰ž³ tä fX»]îŒãƒkBU­AÁ-ìâœX` 5@„s¸Öƒb ¡/¸C³õ¼Ñà¢5L8@DÈ–³aO ùI÷ê³—1<á>1ñß`Æw¨AT sCŠÁ˜E‹$L*YÂPþÜ¿7Æo~EÑ‹Pê—”ûI cx¡#ù’0”þq±&ÔÈÚ!’0)ÄÊ>š.¤Å‰”n36Œa ¼E;RPŠk Ä©#Òä.|ÁHGkaqv³] RÁ-àì¶¹œˆ´RèÅ.º¦ é/ ÃF‚9‰TÏ^ì9#Ú”©¶‡x¯*†°‡ ®ñ’-ò&^”Q#pŽJ0ƒ%æK ú°‡74ˆ/±A[âF8â³or$ )P—ر#x”ÔáJt"ò) óP`Âù¢AŽ!€C Ö‘Dvd‘Q¼œ~Ia €É0ŽŠþ6bÖ·`A L 'RÒàAÞcJ:Hc·»+•³ƒ˜–¸E1°Œ`B¥V(È/žŽØðã5€ÂÐ…ÛQ4ï1:ÁL~ÔâÐLOÙ®wÆìjPÉ&U á; â )ŸCûóŸMÓ3kØDT²N¥˜ñ¬Q_¦öòžs<ÀœŠP>±´ì¥Ð-âÀ’€ÂÅb‚Í_X¥¸l„ï` :ȉ̞‘‡*ÞàŒbD£QD ¯>jš[(òè1¼$¥:\€Wx@—ÈQt  ?åƒ)ËŽ4o•H¼vq„ì ¤ ¶+šÑ$¸þZ0aô1Zsíü" Ú˜†3ÄèƒÕç˜ó)ú0e”ÀÇ+Þ±'vŠ‚â¾ÂÖ¢ 2´C JW‡Ž3E‹0ªbàPPA@d¬[`«†4.Œ*6@3ê±’{’*èFëâ}3­‚T‚Ù‹ 4ŠzÔØÆÑ?Ѐ *)m8O ‘ b¿ž¡ƒ âÀØ^D¶Ql¤ÊV&,´†•Påin@„[ £(Ä¢kœôB†tøD$€7h#Jf†WOç?Ôà6;È:Ð…8¤ÙiÂ&d‹u±îKxCkøñäB…0À(ÜÑhþ;Àa ãà‚5¢± xláAÄA-fáW°"¥Á'6p‰ DB¼ªGA¦ÑÑê0F,ØjÆÇÀVTË!2#ŽZÀ‰$¨ÆƒÃa—!Mp†¦ñç.€c æPÃ:Þ:x8¬–t[ 6lø|öð;i°€~¼CÓPlK°€I(ɲÐFJP<– ô1x…;²àbÇÂX(›@+BÐ#DCȸ±ErÅ‚&n`Ö…(ìpZhŠÈ42€DF<ƒ 8@ æñ(_¦rVG= ,a9?øgÒñˆÖäA¸Å:l`d ä­ÆÐÅ£þÈÀ©A2´„bîô8ÓÍ2~1cì`5 Â-¡†8C){8…#‚à‚ pù"pN1¡Œ ”K\°sMé÷¿¿ã _X¹‚mIÖ'šuæjОàÀv´AxHÃ9Ì`†r ãƒÂ0|à \à‚òd01 ;$(g]gâŸ5pÁ á Ã9ÖÀ8ÈÃøèûßÉ4 ‚hãá"P¤x5è"Mt0C˜ÐZ´‚™O'4C?¤ßú@ûþ‰ù™ú‰ dÃXA7ÌA>€ #H€¬œÔÃô„ÃÜuáh–âq–<8 Á1ÑCèØ Ô È@ Ä,´ ´+¬‚*˜*œB),Hw(C)ØðA,( ‹´ž6Àˆ-T‚%d&l@|(ˆÂ( ”€ ¤ ¤€ ¬À+´€ ¼@ ÐB-Èà ðDÃ@˜CêáA,ôÈÌÍmÃø†Ã0Ì /Ø@-ÐB ¸À+¬+œ@ ”‚p*@€°EÜÂØ`,‚ íBv¼AôÀxW›”APA.À×i4]þÖG‡C—Hà @—˜Ý@ ƒÄ@!`(!Õš˜R D.ø$ƒ3Lƒ6€ƒ9à œC\O€OÎþPÎdMÞdNpîé>¶†ïÈLÀ´…©œàÌŘå\’É „2Ѓg0—¶ŒÐå_À„7Ø›n]Š* z˜:¸`öÞ· Ä\ŠQIA—ÌÁ<Æ-CtÕÀ TƒÌÃ-l—,²ÐÖÝÉ DMÝ‚äÀ$0ƒÙ±+Ì@hÞÀmÜBèÌ}I‡ß¡¥rdUd\W 1üÅĬ¯eÄ<žUA!A¼CÄA<\‚/hMtCt7,8„8ˆÃ9XÌÂ.,@…qÁh@Ö•¤BŒ8t6`Á4H34A2AcØB>ØþD2üF´ÓÅáµ@´„3tƒ:Ü(Fꃔ€ ä%€A*4ƒ…”Ój)BVpƒ;œÀ‰ÚpBV$Ù2¤  d0!¥ð<\Ã;øÁ*dÅ5Ã\0!@VT´˜´è‹Æ¨”艞@Š®¨X6´A9pÁ@pè@-¼€+¨BÀµÂ-h-ÀÉ\@´eÅ€ÈÌÂSÙxÛÔÁäÃ>ôCÀÀ ‚!"$‚",Â@@#8T@$X@%T`‚-+(<Ü`_ÖŒƒ P")Œ‚(|€tÀ`Â%XB%\€$D$|þÀŒÀ=d4ìVHB×Ó‘rßÔVíÕBmkH­„<8ƒU–õÀ ”%=„@_QœXöxÀ¥T9ÈM)ÕÂ4¡ø‚‰‰‘œ}ˆÌ¹˜AêÑ*¸ÁB+±bO¤ÀA#dްLÀ#h”Ë œÀpäqCC ìÒå+™æí°Ám^@ ”*„Á é΄yF0\À;xÃÐu‘üfI<l‚ aÃ$C(§EøZ9‚ª¬A"¬Õ°Uy78@ÎUË:ÛËJ è•%èMJèE$¨¤t$Xƒ\QlÈÁ ”J mXþp9Œ\¥èyƒWÜC%\Ã=(BðAX0e@VÄÌ „@VT/ȃ6”mVœ­$ð7ð°§$œK¸•gèC+h¥© ®©‚&¸ÂûÌ#ü˜ ÄÃ5ÔR!DÐ3õAkØ ¸Ö“MNÉèÈY© ”å3ÜÁ Ë÷µF4´ÂÿÉŽÁ*3ìÀ,ƒ2ÜÀœÕî,Þn¶˜`À1„¡‚ÜBàÇÜÂ!À èR $à¦ó¼‚#¿ÖÿaG‘±nD+Œm &x†àA8€Ü‚˜qq\C. ;`ÁHñ—¤1‘d’`XIV@…ˆBxÜ7µY£5{5X‹õ7ïE?ƒ‰µÄÞömRü-îþÈ:0¦š–Ò3ÝA,ÌAD\®bˆær®çB’Ü'C„”ÜÀ+‰é\Â\´¶d´qÈÎt;”ÀÜ‚}DÜÂ#àäælDó’DØ@ ŒM"Ëã"[Æö®¥÷VÑ¡µÿ õÀįlä[ÔïýÚ‡T»ÄÿÂÑ\Y¤pKàðe•óó[ÄC ß0dÃOóef£Ö3þ ?'¦?«£Ü—¶iÄ—­v—¬t¶´. 7ï«q\U|€øÂU-ïA À-B4hA ìƒÇK F=ì‰s÷s†Èˆèsuû úb²úîÏvOJwc)@ƒ2Œ+»˜,H ìÃy“Ezï…b¿wG¤³¬3}ÅâúÏ<÷…•ÄgxR´tGÒm‡LCîÞNˆ‹8ÒÔöjß‚2„`ÃÕÁCDÌÜÁ8ìÁ-\M™#÷ÊÌtM_ÄMƒ¬ÈŠÆN÷Åu‡Ov·ŠÏ¯E0µøìÆwüT5?X‘…‘«’Ï0cî8;¹_Äs_ê÷‘ñw•ûwþF6Fˆvçr9CHÒIÝ,ø@qÃËܼ–¹AÐâ@Áðƒ;@B Ù:q¨¢X@ @ˆçù¼ì¹Š[„two¡€ïƒzãú¦ :Ž«Áwã¯Ü<:¥{»VXúZ´·@%¹Ä·gÌw§?ù§gj¨—ܨ#R©ÇÖ©Ó´€Kñª³º—‡¬Ÿæ-èCxÜúiäºhî*|YûÖ `М“f²˲C·4ò|:_LûÛTû£\»Rë8+N·»·‡;U`ú[,y“«ûºã÷ȹ»ã»gË{”z–o9¾wyÀÀ ¨AÀÄÀ× Ü½>3¸²“xiK|RøyN[þ|´HÆ{ÌÆJÇwÄ¢7:ùˆüÈyÉÅÉwDc?öÊS”‡”ó•Ç;bšú•§:iã|Ηyœ §ÏãΙ„iÄâíÁ,ÁÞ_4ÄëÉÒc„³S7\ü^H=ÀP½ŒXýEh;}o=×œ×Ø[ĹÛðz“½P˜}ã ý^¨½Ì³ý¼ûóG1ǽÜÛ}ëk]„ì,ÈâðŒfà'=$>ų¸‹Kâ«ÅâÃJã§Èã¼)CöäS>ÂAÖÄŒ{f­iÊw>ÿ°ûeÏÊ×ÈÌÇ\Ûü@¯~¾»~ø|BÖù@Dwá~Ü~ÓºžUÿ¢?ŠX=Öþ«»ò/>YþP€½Ø„9b 4xaB… Ž F[D‰)V´8ñ 9ÜàKH‘#GÊPGMJ•*A •²Ap‘´ygΑÃþÜòùhP¡C‰5zô(ªŒ¾ó¹ iÑtnôŠzè°:¹reÕJ±êøQ㈀5‰ºr¥@£c\,Ú\´{—¢*âöex®X±/ˆàd€55~+ܳÌJdÉ“)W¶|sfÍ›9wŽ åNã„ëp¼Ò€Kñt(u¥LtlÙ!âµ}1ãFÙ?¶ýbåi5-i©#¡À³;¾™så‰ztéI—NÇþEÊëQµ6oþ5¬p²~Xñ€$ž÷›owœ[÷vü‰zù¶÷ ¸ð”„ehÑÄ>ÑóŒÀ <ÁÏB 4ÓôKm…p°c‘-dˆ6ù4Ô&7 {k 8ýZú‰²ZC½wêi»]4J)¦^4j—]r˜q¨îTôÊ¿|üH¥à§„0v‰= ßÛP>ú.ì0{f™’Ê*¹QÊŽždlÀ½üLA³°Á7Ì<Í„¬B -Ý$(C&oë0À»2)ŸvôÜsÏ„¤éȟÑPc,Qî¶ §¯„|RµØb4¤$\RNÛœ|3!À"ýT1Nãê2ÌRþM5uL?]õ5Qߌ3Ó»è´ÏN®LZRå(MqÐD}½êÐ_…ÍjÑ]Geœd•]VÙcÞ0ö KíÃ4V»6uµ &"Ù–Ûn¹­l9ÚãtÌ=ÝtÕ]—ÝvÝ}Þxå5wŠíc|õÝW_w×MX«µhÖöjÕ‰|^˜á…[Zïz–â ‚­øW#Þ˜9iÛ› ŽAD™ä’M>™äZö˜å'ëiæ˜ež™æšm¾çœuÞ™g™çhè-˜¢‚w;˜ã¤ošãŠ/nQ•žÚ&w› ׬µ†´¾ ½þì°Å›#‡ôÈí´Õ^›í¶ÕNK7þZA¢šn‘˜†ZاñÆQ꺩¶Z6*–œð ?ñĵ$›ñÆòÆÚšò¬ã6xn¿©¾{ïDõîÜž5OðÈM?õÔU:7\öØeŸv+<Ì|ô¤9ÐÏy·NôÜ#.}õâ?ùä•iáÝý÷}>ºàß•øåµßžû÷ëŸg‘úB§/ÿ*ëÅ4ûïÝþø•o~ý#¡Gºóñ?JýúUl_~à 4úùWäÛŸ¡ª³Àê Œ`)XA ^0.Œ`sîç@`5(XÆHA‚ €îé[8:ñ }œã4^Ö@›þøÇ74È(  ¨Â_ëD{Ä $zè _CG:’ÁãQ)GL¢×–ØÄöðЇ@üž7è›Ý‰„&ô`Q|÷Ÿ( 3£¢B‚=°"'°„ǬÃ&˜0DáÒR äøÚw ,Âø¾ÖHÁ‰Æ3$"ÉH¯9’ö!d ·¾.ªzkDã‰RÆŸ€À'>ð@)JP#ü¤%@Å'fð‰HÄà>(.S¹ÊV¾òó@ÅN!£[€ ­$ŒÒuà£"ù@ ¾ðÈ£ «°á9’£4P $Ü|†7Áù…0¢zàÂDbM9èþ khǼð¨p„¤vP CbMljó âäƒ=àG‚”b MÁ V± id«H)pAŠKÔ‚M8FºÐ†>”HA*PЊƒ>£¡ª€†h09C` ÆÀ„ðIÄ µ°”v9Rè„)SšÚ´ !XƒZαbláQ\ˆ¤êZJŒ—Æt¦5½é@rºÓžþ4¨C-jV‘J¥2Õ©P’TwCHb 4£uè@DJR“ƒ¢!H*6a‚`¢¡˜0ë\Yü,¤#-)AÊйúå#,t! e˜;Ú$8ô¢ƒ²Æcö’•®ô‰0‰)£Ì þ¨ A%jð ´Ò?é€VqŠW˜c´Ã,æOTZ`Z „@Y#$à“ Ã'GOqŸä£>ñ¬g›ÜåÞ"­½Å"„«Â/s°‰Æ‘È_Ø”`]ÈÃHëmï{¤‚4* ‡Bò 2pbCÀ¾ à(DHÂð€SÜQ$ä5/zÕË^G` !±ULPa Ó@Å@ˆ q«[?âC~%Æ# âÖØ8ò VÀ¼@Œ”ƒ$1$ˆÁ— ±L<òœxäƒ<ä"ã z€f`YÊþˆ¬ÃTS‡cóØÇ@2‘Œd%3ÙÉP–²¨¼æ+gyË]þòÂlˆ1·u H‹‰!âÄx 46òN̈<€!À∠p# *8´ŒM B²p#åHÇÜÙ‘Ÿ#Ñ#sBéâ¹·P®O²ëîú¤÷xî!|‚ˆ=ød øÉ ¤q‹¤‚ÖÚ½õ-ª+ëëט@‘Å‚‘F\Û#AkQùÓþijÅȶ¶[{XŒ€Tè.€yŽ$0@H8‡0ØÑ _°#ô €|ïû ðÈÕ ï¨C(êwªE‚êÄ{Þ_¨÷½ýMc`¥~þ™A*Šð ‚(!!O…-ü ×ÜuÅùÈý:€Y¤a¨q{)$3¼î€#ɲ‡Lâ‘Äh)&uþ(Kbö€‚ ÈAª’u5WÊÍs¾sbôüçAú#‹.¤£'}éMÈÓw³ñŽ«\ä$'†Ëa.ó“Ïœ/ˆÉS¾ö—Çí!W{_¶PhJ“šþÌæ6»ùÍp¾œçLç:ÛIƒwÆsžõÒ=¿Ï}6þŸ„'nâp’˜?úÓÿBõ¯G‹Ý/l‚*2ù„˜œ('ˆ[íŸ'Ü!:ÍÆX a‚Aà úÁûágâØ` Aë.P ð!âàb!¸@ÆÈê"Ç‘ P0'°1Pèi±®ÁAPÇþÚCþèo ú!þ/­ àJîÞjÿ’ „PÑ€P4¶@Âk¼Êë¼ÒK¾Ü ¾*l¾²Ð¾ðK¿øë ü ÀŒÀ ÁŒÁ ÂBBªP - èáˆ÷t÷ŠÂøÏ'N(ºõ~þoº€"oø`$¸^|‚t-(À¹n!~À'BÀ' á~¢…"¶|âž­¼ë ^ਂÁÀ! Â@lá <$žlbqkn‘ø¡*¬a¾@ÂÁ0> &!$¢¿ŽÁæ$àÁ.àÂ@YÑaQ%žaü6l ¤ÁBÍ ÀĈ!†` Na ¼âB°b änÚÃÁŒìaPRÁ<` t€Œá ¶, - I'!˜â€ !’¸` &AdœŠÚ‚,þØ¡#§ÿ1 ² 2!²!2"‰a"+ò"3R&9Ò#AR$IÒ$QR%eƒÈÑѱ î‘òq †`aq m €ÒêŽ)’ê16¶ Ü$ ŽÞì ßúßÊàîQžà î NáÌo$ÌO,%Ž,ýí ¢˜éö|BÑ¢oá}â"1„íà×JO1o!oa0 ó6Ñ£Í'Dˆ|ÂZn Ra2À~âN"a¸T¡FAžÀ'@S4IÓ'PH¨¤à'ú`FJ³(t$ >` ð€Abt€Ø¡Î  þþªÌà9£s:‰ñÒ€Ú  $î¡äÖ€RmäÁœ À¡,9—³9«Ónü‚‡Da ¬à<@JÀ*dÐP@0€ÃZaJà´a þ3@t R`|h¾€ ÀJ@”1È@)\€¡À@ ô!z BtÁÖ 52éìA®DN4EW´E‰¡Ö€ø!   NAèá"`%!D@DIÔDQTEYÔEaTFá¯ForTJyt ~4H‡´H4Ie#?÷³?!T@ ”B-CñêP2`)WaN b  ¶þ²ªMMàB@×”1¶œú¤ú¬/ûð¨Q£û¾/üƯüÖp.×0ýµýðH/wO(4“3=S6G8m7u2#áNA³Xõ'@aÚ¡2™à•L•r36C“T‡B¢Cùš¦>©-t(@pyHpI—ÕévÐ}•l>‚M³±_iѳUyÑQ‰Ñ‘Q™ñ œ Q©Á®ÑZ·‘[±œ"Q‚j~:ìµb†•XÝ¢Z‘§:€É˜Õ` b` ~Vl>b8‹ó8¿ >™Ó9¹É:€:-V:1;µ“;½ó ÀS<ÉÓ<þÑS=ÙÓ=áS9)¶:ÿ`ÉÂÁWôcð5*¨€–¡ö†_û5'Œu7ÂÀ  ¸g”‚Hò`—µh} i½‡‡LàÒ‡‹x':È:DˆŠmoh–”nag©¶jþ5iÇ–lË–e¦lIÂj»¶”‘ms‚Ò¶XÅÖlëÖnïV6ÐVnCbmßÖöü68ãvouÂgñÖp×lõvoûp}‚kIék·p—r+w%Wn·qwŒ"wo'×rCWt+sÓVs—s=ÈsåtG×u_÷}JlO×oS7:A†euÓ¶uÝäfvƒ—r7hd—ji·Ep—b>g–Aþ nA„ª¡Ed–o·9ÚSHdÁX.K=z7!¡‡Nà(°/¶e H)4ÍBªHx½¦¸š¡‚}c£~ƒ|SA|É7.Ì÷MŒ—g­¶yŸ7z§wyÝ2q;¨wFvw$ ¡ŒE.;†nu ’àâlò`¡¦(@”µ}]Åü Àô`‚„ãâ…Å…4˜ƒ È“wi8‹Ø:xFL)øzë—~ÂJaNà \ëFÖHˆEë˜b€ R ê ·JkùE.ʼnœBb©Žô .AßøàŽJ€¨ðHò”‚òøÈMI F¡NW)= Jþ ©há¡H @¬ežD•@Ê¡ ˆ›‚AôÀA芨 I­”‚­JØU–@<€ paú’ƒn’K‘@‘Ù‘=ù‘ÄJ’£ÊkàXŽÿ*°–òŽóx ö¸ÿ˜SJ÷¦€¸‚{U$˜Ûbm#󉫈8‰}–¸‰Akˆ£xŠ«øŠw‹:0Ó'¦ Ûr—ÙbmÖ„b|â1xÖ¬kØJà„~¢Ö¶+‹D.¯¾¾€`å¡$¡ø€Ìîh Ì0ÁÌ‚ÝdãX‹¨’&­Ñ1~ÀE‡Hè hžŽ`a2Œ þ6€RA0!Τ Ê‚ŽÏÉÏ,[æ¼ ÀœáÉPzÎÀŒ¥Ç ¤Eš¤Mú¦S’VZ̼æ š Ú¡‰ Z¢‰A(º,:—o8'>ÁZ@z@n1'*Ø;ÀZ'ÖV›G€››í›ƒ"œoaœŸËœ»}bÔ(ÚyÙÈ#Sô°ôr¡J`Ja|â€BFöšÜ|‚õ`ïÜd¯™¬·9ä-'°ß@ö J(ÎQ×P¬»Â{‚’¡¦a Ž®lì®âΩ@ \€æéé¡i¥©G‰aèÀ¶.“bØ¥/¦ez h: t[3)kû¶sþcиƒ&´G»´‹PÅ "µQaµ[û­ú&ÌPA$~À—ÍxÐÂÖîé‹ÃxŒËøŒÓ˜žì‰˜u¸/ƒ±ûú¯{°o¡°½íÚFO»»ôõ.s¾xø†âÞ÷ø¼Àƒb[‹-õQ툠¿ôa uáº÷‚5‰  ¢û ¦› R;"ÀÉ.i‰Û‘æ A†{¹y»·“5y la˜ÛÇ<a<Ñfœ¸Ü¹C|ÄãNºñŠº "ÅW\TWüîA$$ÀÔ¡Ÿ×áŸ!L Ñ°žï9Ÿ÷9Ë·< l ã;*"³"ÁܰïðÁñøîþÚWó-(N!|¢¸ùs3Î%ó'(“(X$ Á$˜[·ÕŽØa*€ðྠà:  àÝ¡ ·Ä­2@-ÒÖnq!*¡ VáÚ¤e<øB˜¢ðŒÀÂÑ‘Ö ì¡sÒ"ã` †RRòÆ9ÅøÁ ô¡p(rØ‹ý$A-zý׃}Úu’ØKòÚ‘hF½ÔúÔ­²W½Õ_ÝU¤¨<$¬|õ³),³5»ÃûÍ‘"2ñü'ôœÏýÐ](ìu2üoûÐy¡wúàF•6o¡ T¡RÀ5Á'þ*5+aŠ‹âFh2à'pUW÷H¸IHb e¯ÓŽh` ø€ :B¢ð€ÀpA$Î3=3 Ô/$S!,¡Nï¢ tja«ˆœeš4}‰Dñà ¨îÓ‘b! ô! "AƲG ÂH‘TI“ýM"€ ð æw Ì~KÑžL#àìÅžìçÞFÏþïhŽ>é—žN›^ž>ê§[—»½;$z` :Üü$.<Ãë}³ù©³«V¾ƒ¢ä 8â'žW+þâ3~ã;þãCžôg“äMåkó6sUñ›×'=¬-Ui>[T¾À‘OÇÆÙþx†þ~€¿ñµû&>^A|ØâÒ3}Ó;ýÓ-À§"}Ò+}ú58ý\==]AÝ9>÷…ÂvH÷›ƒ`/àþæÃ‡žu&©ˆß{ìÿ‚æ?ù½# ôTað¥` <|ÀÀUðË yvœdP€Æ>\:3ˆP!Â#fhH²ä°?·Rª\ɲ¥Ë—0cÊ” €ª™8sêÜ9,BÉŸ@ƒ -x®&rC“*ýB±§P£JJµªU«£RM¹pµ«×¯]ÉÔd— ¬Ù³hÓª]˶­Û´b}K·.V­\íRÝ`©_¥ ¬ûK¸àɈ+vYóæâÇ[ö,Lþ¹²å‚MõjÞ̹³çÏ C‹Mº´U¾—)wpá@ꡇ#Ëž½²1íÛˆ'¿ÞÍ»afÓÀƒ N¼¸ñãÃQ÷VZÀÑå$cãžžØ6õë/uCß^ø7òïàËO¾<[åÜÓ+•޽=LëîÝkWO?¨wóøóëßÏ¿ÿù¾õhJñÈ|R7Ÿ€Þç߃F(á„À¡Ç`€ì%‚Þ¶à…ô9Háˆ$–hâ‰RY¢zvˆ‡.ÊöáŠÜ‰ˆâ8æ¨#r*Ò¸]‹1NcÍT95%)XA´@RvÔ4XC¬TˆNíh•JÖ$ÅS¤•6ôx:锥þåšUqÙå—Ä„9f™Àùšj²YZ>.$‘´ I$ùÓj<ò K~‰!$ãÀ)Ø”êÙÈf$,bˆ!œÔù”õDe «ÙIL?¢êéêSœz j«¤šŠj«O±ªê« ñÙ'o^Gh‚ÎöA¡>-X¬±Ç3âÔe¥–Vê…’á|)åèÁÅ ­PSçÈÓIA(°#×e¥éš¬~Gâ0L7tîª+T[(É1Æ`">ØL¥`@†‘<¬qμæï¼õÞ›¯Tû>Õo’ÿ–D…ö@a9¨—þøå¿¯oåçþcŸ’Üg¹øAe~õ»_þRW4f9 ZÒ’Rñ¬…-mqË[àɸÊu®/¤k]íŠífÃ;ßOxíÑ]dp‡â-O0aÄ—æ<æÉ¡ È! @½›Å££ A9±‘Ÿ¼KKº2†äö?U=è‡û1ÿEåq¸D,ÂÁ#,P'â ŠS¤¢¡‚E-rÑ‹_ä—ꂘ$-iÔz¦žÆšGHjVÚ־Àµšàâka[ÙΔކ…/v © ¢%Q¸CC!J]àaø‚:ÉP„°Ú1ÜÁ ~´ ¨°Æ ROJ` þ;>`àÃi{\¬Ð¨°á«YD ŒA u ³SË|J;°·`°ƒüH…<0<¥É<€8žÂ…5LB2ÀË∜aó)ÇLf4)OfcšÕ¼f6·ÙÍo†sœÄ(ç9Ó¹Î8úê…ÇKÞ i8;èIzÖkö´Ç=¡8’6”¤Ž !ƒ dù¥9ckHÌj‚\Ž% D$2†¤m( b%Í  Ë`?øÁ xïqqITÜT{Œ3J2êÁä@cD (‡>Òу@ûyÎjÈra¶Ìe/?沨¤ ÍèF;úÑŽ´¤ADèÙ ú:^^ÄïJÁoì$£ó¤GMêR›úÔ¨NµaŒM€ÓžÖ ¨!chŸå ŸV´ªwÍë^ûú×Àvp¥Wbk\ËÓƉϚЉ•X %°€³O1 øL/0Â-Dcä6Øà·¸ÇþMîrG‡ÕˆYv³UòìhO»Ú×Îö¶»MëdÏD#06Ì¡Dì!%{P@Jq”äƒ)aÆ%RtçDÔæŽ¸Ä'NñЧgØ*Á·¾ù\à· ¸Á~ …3Üá9©uJz¡‚#¤D+AJ>±’ÆŠà·ØÀ.B­[‹ûüç@ºÐaƒòœøŒå.¿ÌU"ó[Ð\%6ǹÎ#£ò”Ü#/ùÌk®r0`“xlχNö²›ýì¾ÆxJ„võ¬3}ëPïú×ÃNu{ËDh’èBJðï[Ü䇸ƒÁ‡±’ àbG»âÏøÆ3Zí·À»ÞoÁw«^ð·ÈáUbþxÄ×½±9qõPQg—à’XI%NA‚JÌB* d4vÇÛþö¸ÏýŠ>Ñ“Þô¨W=ë]û”È~6†¦A{Ý;ÿùо–yŸ å#ß0š/ýî{ÿû‡off¶yófüñŸþ177Ç@ÿB…•Jî¸GUUo$$$TWWÿúë¯øchhh\\œ™™BhóæÍ[¶l±±±QPPhkkûý÷ß鵃CW®\Y°`œœþüêÕ« & „+**víÚ…544:tooÛ¶­®®Ž~¨£uëÖ¡^ñ0—mÚ4Vî5nܸˆˆˆnéééݹs‡þ±®®îÞ½{ôMMM ZžºÅö仢§Äà¹B‹/¾}ûvddäüùó;îg|Ð!‡€€NgÂf&&&ÖÖÖ:½ñóó#„H$ÒÆ¥¤¤ð¡èèè/^ÉäÖÖV}}}z^??¿'OžüòË/–––ùùù{öì™1c—ÄàF»~ýú‡„……¥¥¥§Nª®®Žc†……effŠ‹‹“ÉdYYÙeË–á”B=Š[¸p¡´´4Bèĉ­­­éééúúú!111ü’ˆéä /744Ä{è ?BÈÍÍF£8q¢c@W1~.lçâââááaeeÅéD¿4:…0Ä µBg½ºÀP…x:àYPè€g ¡ytxUVVÖÍ›79ð—#Fp: ÀNPèp½²²²ÏŸ?ÿpÐ8Æ<==×­[…B‡(((,^¼˜ÓYwóññát €ý x:àYPè€gA¡ž…xŒº<åìÙ³ÅÅÅEEE!!!œÎçA¡ÃË?~¼k×®¹sçzyy%%%yzzZZZzzz"„V¯^=jÔ(„PrròŒ3BùùùáááŒy{{?xð`ÆŒB¡ìÝ»WPPq‡jhhHNNž9sæ®]»ÄÅÅûï‘7oތڳgOÿÝB‡—M™2ÅËË !dbb2eÊ\å „ðŒnnnôòòòúöí}ª‰ÜÜÜ?þøcÿþýŒÓØ»w/rèÐ!6?!À:C”œœ\O{êDSS³ººš•4ÚÚÚNžœššêí퇗§¦¦zzz:99)))!„233¯_¿žššºgÏ<8 ëé··7ÞI$÷ìÙ#**Ú›4ððr|!ÞSTT„7¶oß°mÛ6!!!mmm|ÔÀÀàÌ™3T*µã{+ÆWíß¿¿¥¥%%%ßK\\†šÀPF@988p:6311±¶¶611át"ý.>>>!!!((ˆÓ‰w344ôõõUUUåt"ýËÅÅÅÃÃÃÊÊŠÓ‰ -:vjmmÍÌÌÌÏϯ¯¯oll¬««‘9r¤ººº‚‚@àtš€¡ «>~ü˜ðèÑ£ôôôòòr===mmm111111))©¦¦¦’’’·oßåææÖÔÔL˜0ÁÈÈÈÔÔÔÀÀ€—ŠžæææçÏŸs: Ð+cÆŒ‘––æt` @¡`Ruuõ­[·®_¿^^^>gÎkkë³gÏ***2¾ª¡¡áéÓ§‰‰‰¿ýö[~~þòåË×®]Kï˜ÅÕ¾|ù²bÅŠ‰'r:ðïÞ½ó÷÷‡‰F‡(t}V]]}æÌ™ .˜™™=zÔÔÔ”HìíNQQQ333333„Paaá… –.]ª§§·gÏ==½þÌz ÈÈÈs: ðœN ^èvõêUƒúúú¬¬¬Û·o›™™õ¾ÊéDYYùàÁƒ?~´´´\¹r¥]CC{ qPèz«¢¢bΜ9W®\III TVVfKX2™ìââ’——7räH}}ý§OŸ²%, (t½ôñãGssóÙ³g§§§kii±=¾°°ðéÓ§¯_¿¾råÊÐÐP¶Ç MÐGðc>|˜={öñãÇíììúõF¦¦¦ÏŸ?777G­Zµª_ï  Ðü@]]Í¥K—–-[6·ÓÒÒJII™8qâÈ‘#gΜ9wð0xuø­[·Î™3g`ªLQQñöíÛ¶¶¶—©&@¡`äÉ“'¯_¿>~ü8»Ο?¿7§Í˜1ÃÁÁáÈ‘#ìº/`h‚BÀÈÁƒ>, @ß³dÉ’U«Výþûïø£··÷ªU«–.]ÚË€7nìv¿»»{§={÷ / L€>:€áÉ‹;î´··§R©–––ø£——WTTTï§ÒY¼xq·û;í‘’’Z¹rå;w¶mÛÖÇÄA¿¸qãÆo¿ýF¡Pþý÷ßN À -:€EGG[YY‘H¤Ž;•••q+˶mÛÜÜÜBÅÅÅÿìùûûoß¾ÝÕÕÕÎÎîÙ³gôýÇŽsuuí¶ÐÙ³gÏ“'O\ÿ÷/Y²$**ª?m Íš5Kã?ãÆstt¬¬¬d1æ›7o&Ož\WW×q§©©)ýFcǎݰaCqq1‹7êhòäÉx@ÜÜ‹]ºý¢À-:€½ÿÞÀÀ ÓNz¡ÓÔÔ„k N…޳³3Þ ÑhvvvS§NÅwìØruuíz#Ÿêêj??¿NûõõõsrrØó0œãêêúðáÃØØØ+VðññÝ»wÏÕÕ5$$„•˜eee555uuuâââô[·n}ðàÁ?ÿücmmM&“ÿþûïM›6±±RTWW_°`Áƒà^ìÒí†(t=úúõ«‚‚B§bbbuuu¯^½š0a‰DÊÈȨ®®–’’ÂGÛÛÛÏœ9“——ÇÏÏO$¿|ùÂJ’’’mmm{öì=z4‰D"‘HD"‘ÔA|d%án-X°@HH(66ÖÉÉIQQQSSsß¾}555’’’T*õÒ¥K×®]ûò勦¦æ–-[èM&¡ààà   ÂÂB …‚Û}ú4 ++«¾¾^SSsïÞ½ôò”J¥†……}ýúU]]]GGïgú^4íâÅ‹ø‘edd444=z¤¨¨èää„ß‹ÅÇÇ5jË–-¸¢Â¯Édâ‹bûO 3(t=jjj¢ÑhÝŠŠŠ²±±áçç¿|ùrÇs~ýõWKKKz³££#‹9P©Ôóçϳ¤O”AôÝmkkknnþaüúúz€+ªýû÷_¿~ÝÈÈÈÌÌìùóçÎÎÎ>>>ÖÖÖ¡ìììÌœ9³¾¾>..ŽÞ/ÛÎÎ.111&&fõêÕbbbÁÄĤÓ]ÊÊÊ¢££%%%q ãâ⢫«»fÍšúúúØØØ´´´èèh„PFFÆË—/ ÔÔÔž>}êì윚šÊÏÏ:pàÀµk×èÒß*2}¯Ã‡ÿõ×_?ýôÓìÙ³Ÿ}ú¤¢¢‚*))éØ RVV6mÚ4¼™™Ùû1S T*µS§æêêjAAAAAÁúúú#FàeÒ)P©Ô~úÈÜ—&--Íàè¹sçÚÛÛïÝ»gbb"&&VRRjgg·{÷n„…BÙ¸qãñãÇ—,YB"‘šššB4L&ëééÍŸ?ŸþòeÙ²e111Ýv 655E‰ŠŠúùùás'Nœ022ÂIGEEݼysݺu!gggssóøøøúúz]]ÝwïÞUTTÈËË_¿~ÝÞÞ~×®]!*•ºiÓ¦ÄÄD¦ïUZZzõêU› „ÚÛÛ×®]›––¶hÑ¢Q£FÑß‹!„fÍšE¡Pp¡Ã8yV¾(0@¡èƃ֭[×ÖÖ–’’BïsÓш#ð†‚‚Baa!}¿ƒƒƒ½½½ˆˆÈ÷ïߥ¤¤ÜÜܼ¼¼† ¶k×®–––¤¤$ÜÞ#!!ÿÚa«W¯Þ¸q£””™L–””\·n¬¬lZZÚ˜1c6mÚäææVQQ‘™™ùðáCQQÑ~}ö–AT*µÛ£ÅÅÅ^^^ "߸qƒŸŸæÌ™x~ ÜÜ\¶dÉ|”D"-X°àñãÇUUU222“'OÞ¸qchhè‹/B|||îîîzzz½y„U«V½~ýºººZWWïùôéS{{{@@@ÇÓèehddäÎ;;–wT*!ôþýûމą v*tút¯>P©Ô•+Wâ|||ÖÖÖiiiŒ‡qò¬|Q`(€BÐÙ;w6mÚÔÞÞnccóðáÃööv>¾ÿù·âÔ©Sôí_ýµã¡©S§Ò»wtÂxö¿yóæÍ›7¯k&–––‹-244´²²zûöíìÙ³ãããñ;‹~ÂtOiiiÆv•—×ÔÔDÑh´„„QQQü(??_]]=##ãÓ§OEEEaaa¾¾¾ÖÖÖ’’’ô=½X´³³“””\¸páæÍ›ÃÂÂH$’’’‘HŒˆˆêz¾¶¶¶¯¯¯ŠŠJxxø¾}ûð~999„Ћ/F÷t-Jút/üøqqq¸¯•J‹‹ëtý¡ZZZðãäYù¢ÀP…àDEEá*gÿþýÛ¶m[°`Áµk×~ùå—Ϥ²²2<<üñãÇø5Jll¬¥¥åû÷ï “““¿$T¢¢¢ð™ÀÀ@{{{ü†N]]ÝÒÒòøñãéééjjjiii™™™;wîÄcâââ|}}£££µ´´ZZZrssEEEÉd2މûüzzzêèè|ùò%55ÕÊÊjÒ¤IÑÑÑ¡ààà;w;vlõêÕÛ¶m[¾|¹‹‹‹»»ûܹsMLLøøøòóó333íííBõõõ7oÞ,--MNNF]¼xqêÔ©3fÌØ¿JJŠ‚‚BNNΓ'OB—.]þôéS_葉®neeuêÔ©ŒŒŒÑ£GãG¦Q#GŽDùøø(++çææâ¹ Þ¼yÃ8y&¾¨ùÙÁ`ABéëëóÞåÊ•1cÆà>¼­      §IØè“/^¬X±¢­­m×®]! ­[·:;;wjÔ»wïÖÒÒZ²d‰‰‰É¬Y³-ZWPP»råÊŽó5555aaa]‹B''§ôôt„Pffæ»wïÖ¬YƒK„™™??JJÊÓ§O%$$vìØ±víZ|¨¤¤äÕ«W>|HOOÿøñã˜1cŽ?ŽK„¬¬,™LŽOMM¥R©sçε··ß±c¾ÑÇ—/_>zô訨¨ææf777MMͬ¬¬Gegg„éÓ§¯X±7{Œ?>)))11±¸¸XYY¹ªªêÍ›7ùùù666æææÍÍÍÉÉÉ)))åååêêêUUUYYY/^¼ÈÏÏgâ^³gÏ&‰ÉÉÉÏž=“––þé§ŸÞ¿ÿË/¿HJJÊÈÈHIIEEE=yòäÛ·ojjj•••222 2ñE%$$èëëkhhtú¥.\¸`nnNBÈ«¢££§M›¦¥¥ÅéDÂ!‡Nï>y€‰‰‰µµõPè`ŸÄéD×ËÈȘ3gN[[ÛÚµk;¾œÚ´i“¸¸ø… 2™¸¸¸eË–¥§§KII)))}þüååå3gÎ §W ƒAAAÁ¢E‹87yøð¡‹‹ R>`7Å=É,,,:í744ôõõUUU°L8ÂÅÅÅÃÃ÷8ºE `fdB/Y²¤­­ÍÊÊêäÉ“ýùçŸOž<9wîÜ€%SPP°råÊÐÐÐáÇ“H¤ÒÒRzA###)--ýï¿ÿnÞ¼yÀRlWXXèçç‰Âÿ€þ…544¬X±¢¦¦æçŸ¾té@èxTDD$$$dïÞ½›yúOff¦‘‘‘¯¯/¦^[[Ûi°·’’RDD™L¾yóf§š p‘'OžøûûãÎÈÝNÏ[@¡ÀPG£Ñ6mÚ”­©©yåÊ•n_©ªª&%%9sÆÍÍ­½½½ÿ’ùûï¿§OŸ~èÐ!z·³K—.áYn;;vìÕ«W Âï¿ÿþøñãþËôŸ•+WææææåååååÁû>РÐ`¨;qâžd6<<œÁz@JJJ111ééécÇŽ}óæ ÛÓ¨««Û¸q£££cDDÄ¢E‹èû›››éËt4gΜ½{÷R©Ôµk×âá?Ð: iiii‡&!!!?ì *%%éææfff¶fÍš>°%‡ÆÆÆ£Gª©©577¿xñbÒ¤Izzz®X±¢Û ÝÜÜ,--kjjÖ®]KŸs:‚B€¡«²²ÒÖÖ–B¡xxxàU{cùòåéé骪ª†††–––‘‘‘L¿Ìzÿþ½»»»ššÚ³gÏ¢££Ïž=+((Øéœ‚‚‚ž.'þþþ²²²YYY¿ýös9x: ]7nüúõëôéÓñJF½'**êîîž™™9oÞ¼£GŽ9råÊ•.\ÈÍÍýáµ………‘‘‘®®®zzz¦¦¦ááÇ—/_ƳwòåË—®c€; #‰.\ˆíÓS†˜€!꯿þJNN¾pás+ˆŠŠÚØØØØØ|ùò%!!!>>þèÑ£šššÚÚÚbbbbbb 555EEE¯^½™4i’±±ñÙ³gÇÇø•••ŒÏ™0aÂï¿ÿîåååââòäÉ“áÇ3ñ,^…CѧOŸðUçΣÏ!Ë´‘#GâŠ!D¡PÞ¿ŸŸŸ___ߨØX__/++«®®.!!!''§®®Þ§¥ÆòÃÓ6oÞ—””äèèxëÖ-柄eÍÍÍOŸ>å` 7ª««98Pè0äÐh4;;»ÆÆÆeË–-X°€½ÁI$’®®.}!kåææ*** ÿðÌ¿þúk„ ñññwîÜ¡¯¶=À„„„ÔÕÕýýý9rwÐ{‚‚‚\´V`: 9W®\IOO?zô(§sù;wnÙ²ÅÔÔô‡gJIIy{{oݺuçÎ?ÿü3G–+’““ÃkjèŒ ÀÐRVV¶ÿ~„ÐéÓ§ÿâ…òòò½_zpíÚµ&&&UUUžžžýš€‹@¡Àв{÷º¹sç²ý¥Uð÷÷WTTìýùçÏŸ¼qãL— À Ð`IJJŠˆˆàççü/­BUUUEEE}ºDNNÎÃÃF£¹ººvZ! 04A¡ÀPÑÞÞîîîŽÚ»woŸšI8%!!¿eë“íÛ·«««çççôCR.…CÅÅ‹óóó•””œœœ8K¯ÉäŸ~ú©¯W‰Ä?þø!ôÇTVVöC^n…CBuuõ‘#GB¾¾¾œN§W,X`ggÇÄ…³gÏ677¯¯¯?tèÛ³p(tŽ;VSS3sæLsssNçÒ[>>---+W®dׄÅ ¾¾ÞÌ̬ëbæ½·k×®ààà<þÜÐйõ¤²²¿ƒŸ]ï§h\ xÜ»wïnݺÅÇÇçååÅé\ú@RR2((ˆ•#FŒØ¶mÛ±cÇ<==ÿùçv%Æ@mmí;wà^€·nÝ255…Bgˆ€BçããC¡Pìíí8K¼zõJJJjÔ¨Q¬Ù²e˹sçÒÓÓ“““g̘Á®Ü`®5HÏŸ?çt `à@xÙÛ·oÿþûo2™¼cÇNçÒ7—/_NLLd1ˆ˜˜˜››Bzê0dA¡/;vì•JݰaÈ#8Kߌ7nÒ¤I¬Çqpp””ÌÈÈHNNf=€ë@¡ÏÊÍͽÿ>™Lvuuåt.}foo¯§§Çz‘-[¶ „Ž?Îz4×BžåççG¥Rmllddd8KßÔ×׳þÞŠÎÎÎN\\<99ùÅ‹ìŠ àPèÀ›JJJð`«­[·r:—>{ûö­»¢‰‹‹ãÂ~~~ìŠ àPèÀ›üýýÛÚÚ-ZÄâÀ%Ž]ºt):::’Éääåå±1,`ðƒBTWWŒâÆæ„ÐØ±c7mÚÄÆ€#FŒXµj•J={ö,Ã?(tàA!!!õõõ&&&ãÆãt.Ì «¨¨`oÌÍ›7‰Ä7n|ûö½‘ƒ:ð …ˆrrrât.L:vìXmm-{cjhhÌž=ûû÷ïW¯^eoäÞ{øð¡FwŠ‹‹9•< xÍÇ?þ¬¢¢bffÆé\˜4}útUUU¶‡uttD]ºt©½½íÁ{ÏÚÚzöìÙ¡+Và @ÿB^sá„ЦM›ˆDnýüÔ©S$‰íagΜ©®®^RRòàÁ¶ï=GGGÜÕÚÉÉ o„••nà¹ÿþòåËuttlllªªªBOŸ>]·nÝäÉ“µ´´¬¬¬ž={†CýüóÏ&LÐÖÖ^¾|yNNNÇ{›™™iiiihhÿúë¯ý´p·þ;èV^^^RR’°°ðêÕ«9 “^½zÕO³¼âæ¥K—˜B£Ñ¨T*…Bioookkkmmmiiiiiinnnnn¦Ñh ®•———6lXÇ=’’’K3g7 IDAT’’’¡õë×ãF877·œœœE‹•””dff"„222^¾|9~üx[[[æììÜÖÖ†211A%''Ïœ9ÓÆÆ¦´´ÔÎÎŽB¡ààÙÙÙ>|¸­­í²eËšššŠŠŠ˜~p¸,ê O¹|ù2BhÙ²eâââœÎ…IÿüóOSSS?­Á¹råÊßÿ=))iÔ¨QD"‘Ö3„POû`<7£žž^zzzÇ=cÆŒ¡Oc¸dÉaaḸ¸ñãÇûùù)**ÒOsvv677¯¯¯×ÕÕ}÷î]EE…¼¼üôéÓCBBþú믟~ú Çwwwÿòå ¾¶©© ?™LÖÓÓ›?>÷þLƒBÞÑÖÖŠÚ°a§saž¡¡!™Lî§àâââK–, ®««c.¡;è¿×OláëëÛ±ÊAEFFîܹ“ÞTƒ¢R©ôm%%%¼¿7úi“'OÞ¸qchh(®¥øøøÜÝÝÙ²°\ xǽ{÷jjj&Nœ8~üxNç¼~jË¡³±± –””|ñâ_·… ½vévOòóó­­­Yϰë]|||´µµ}}}UTTÂÃÃ÷íÛ×›8ùùùêêêŸ>}*** óõõµ¶¶ÆoÊ" Ð€w!„lmm9óh4ÚÎ;=ÊÆ’NêêêDDDjjjRRR,XÐOwéImmmHHHvv6B(00PGGgÕªUøÐùóç_¿~ºxñ¢¸¸8™L¶µµÅE‰€€@}}ýÍ›7KKKq¦‹/N:o_¾|ÙÆÆfäÈ‘qqq¡‡âéãââ|}}£££µ´´ZZZrssEEEû¯µ €Á :#À# ?~L&“—-[Æé\˜WZZú÷ß÷_•ƒš0a®ñäÑ,''çÌ™3111¡ëׯwìŽ+•ÐÐЀ€€sçÎ}øðòóó#“ÉW®\IJJÂ/ªBBBNŸ>ššŠ$..®´´466!tóæM|ÕÈ‘#eddž={véÒ¥ˆˆ55µk×® ìÀaТ ¥R© .åt.Ì#“É;wîì×[Œ1bçÎ/^LLLüúõ«œœ\¿Þ®“©S§vN—ÐÓU“&MêÍx:p+† æææžÖ‰ä"üüüý÷îþýûÝ®ZVVÖÚÚŠ·Ï;—••E&“ Bx^A·ƒBn[^^Ž·ß¾}ËÙdXÑOÁ ¼yóè«««ƒƒƒ.\8f̘#GŽ „DEEW¯^}ïÞ½ºººY³f!„FÕOɼº€+•——;99!„”•• y E'%%7¥ô‡5kÖàòòò­[·ÆÇÇ···#„Èd²••ÕÊ•+­¬¬„……ñ9xþ@hÑ€7@¡÷©®®^¼xquuµ¾¾þ­[·TUUß¿O¥R¹zEOwwwz©Á^Ÿ?niiÑÔÔDÉÈÈèëëã¡j¦¦¦QQQ]{}üøA‹¼‚‹ÿY`hjhh°¶¶ÎÎÎÖÕÕ}øð¡ŠŠŠ¼¼|cccaa!§Sc‰ªªª¬¬lD¾yófPPýãŽ;öíÛ‡JLL¼zõj×ó¡E^…ܤ¹¹yõêÕéééjjjqqqÇG;!ÄÕo¯*++û)¸ººú‚ :îquu=tèFstt<{ölÇCuuu•••BBBý4`€A¡×hkk[·nÝ£Gâââäååñ~(trssñ £þ°xñ⮽œñÌ~[¶lñóó£ïÇÍ9£F"ý”` A¡w P(ŽŽŽ111ÇUSS£Â…Nvv6ç²cÕøñãñ Ål—žžþìÙ³n988?~œ@ lß¾ýèÑ£x'tЀÇ@¡ ÑhÛ·o¿s玄„DLLŒ®®nÇ£<Т#""2nܸþˆÆ`«õëן>>ÁÁÁóçÏŸ?þ¬Y³ðW"""jjjyyyùùùÚÚÚM–I©©©;vìèȽYcåÊ•üüüŽŽŽ¿ÿþ»˜˜b­EÇÝÝýÛ·oL_ÌåË—¡'ÖP…ƒÝÔ©S‹‹‹“““xð`DÞµkWošsèœB¸]À Ð€Ë¤¤¤àeË–ýòË/aaa?~ µµµåÒ®!ÙÙÙýôa̘1}z…ÄÇÇgllŒzüøqäxðê nÒÜÜœžžŽ’••0aÞ)$$daaaaaA£Ñ8š“¶mÛÖ-(þþþÊÊʽu…ÇÅÅ=~üxÙ²elO 0ð EnòâÅ‹ÖÖV„……E×V.íYI&“ñZìuïÞ=<„ªO¦M›†zúô)Ûóp:pú` ÎfÂ.4MUUµ¥¥…í‘æNÚ׫ôôô„……?|øÀ¥ï@¡7IJJB ôfz®PRR"$$D&“ÙYRR’‰°üüü4íÉ“'lO 0ð Ð€kP(¼š‘‘Äÿù綇õðð¸ÿ>s×N™2!ÔÓ Yî…\#''¿âY¸p!§saF_†’““544˜»¿ðzþü9[3ú¦¦¦ëÖ­Ãi4ÚÌ™3544¦M›öýûw&>|øP£;ÅÅÅ?¼öÍ›7ÖÖÖÚÚÚZZZ–––³fÍ¢÷jóæÍäÉ“ëêê˜H €A ¸}`¹¾¾>g3a#7n°=lBB‚ŽŽs×êëë‰Ä7oÞôGÏ!lÆŒ¡””¼XzJJ ®HV­ZÅJ[µµ5ž7hÅŠ½œ@¨¶¶výúõ%%%+V¬011yÿþ}aaass3>ZVVVSS…àjPèÀ5¢££ñÆÉ“'9› åççËÉɱ7fee¥¨¨(Ó—‹‹‹kiiµ´´¼yó†Yu„ÇvÑh4¼VëÍ›7ñþÅ‹„§OŸ®[·nòäÉZZZVVVô—h–––¸ÆÖÖv̘1“'Oöóóë8§€££ãÒ¥KBNNNxÄ£R©.\˜9s&K¿äõë×µµµçÎ;pà@``à’%K„„„BNNN!ÜÚ4zôèS§Ná«´²²ÂIÞ¿ùòå:::666xBËžž !ô÷ßÏ›7O[[ÛÈÈhÍš5ô^hÉÉÉË–-ÓÑÑ100ððð O˜ @/A¡×ÈÊÊB)))ÉÊÊr:¶‰ˆˆ˜>}:{cnß¾=""‚•!Ü#ªÿLž<ùÎ;ÅÅÅqqqzzzôý/_¾?~¼­­-FsvvnkkC9::âÑv©©©–––&L8sæL@@BH^^^BB¢ãìˆòòò’’’’’’¡ýû÷9rDEEÅÖÖ–H$:;;ÓK+ ‰tèСˆˆˆ’’’ÄÇÇ“H$„Ýœ9sB«W¯Þ´iÓ¦M›LLLðU ®_¿ÞÌÌ !äææ–““³hÑ¢’’’ÌÌLÏéêêJ¡PÖ®]«¬¬Œ ŒkáÂ…d2ùüùó7oÞ$‰ fffô7wô:pªªªÒÒRqqq¶¿èá¬ùóç_½zU[[›]‰D"n,aÑ›7o”””B¸q‚í:~¼zõjÇ“&MzðàƒË·mÛvìØ±N;§Nš““Óíù|||›7oÞ¼ys×Côã=Áã­z°Ó£uÄ๬¬¬¬¬¬ðöµk×bccé],,,xfe7ÀPèÀð{+===.]Ÿ¼[T*µ¨¨HUU•1ccc ÷YéãÇ3õ[¡Ãœ¨¨(\(\¸paõêÕZZZœÎˆmŠ‹‹oÞ¼ÙÞÞÞÐÐ1yòäN=~`Ì£À{Óùƒ‹‰ÄÒÒRö.ç¹sçβ²2ÖãhiimÞ¼YXX¸°°°¶¶–õ€lqâĉ‡"„BCCqíË3222Ο?pçÎccã3gÎp:#À; E.€ ŽsÊñ€ÚÚZaaa܃•-š››ÇÏ–v<Øj̘1iiioÞ¼166f=&ëúcõÓA¢ã«+Ø ZtàxNdkѹråÊï¿ÿÎÆ€‚‚‚:»0ÇÅÅ¥ºº!4vìXôß—àRPè0Ø555Œ=šÓ¹°Skk«®®.TTT°$;;;))IBBýׄ†—/p)xuÀ`—““C¥R555éSÇò†;v°1Z[[›^ ‰£F:{ö,‘HDá: ÏLàRPè0Øá?´Ì5~<~üx×®]sçÎõòòJJJòôô´´´ÄPV¯^=jÔ(„Prr2ž^/???<<œñ!ooï̘1ƒ@ P(½{÷ 2‘ÛË—/ñJ lÑÒÒâââ"--ÍbúdƒcÆŒ!ïÞ½£R©¸ôp(tìÞ¾}‹£ûÊÈÈhÊ”)^^^!“)S¦Ð×4PPPðññA¹¹¹Ñ7~x¯€w"„rssÿøãýû÷÷5±ŠŠŠåË—çåå1ñPÝÅËR²âÁƒéééøëB‰ˆˆ(++þü9??ŸÇÞ0tÀÿF`°{÷îBHGG‡½aåääzÚÃàP'ššš¸ßn_UVV2qaOÜÝÝYï s÷î]•Ž{ðd†=MÄü E€Áÿ•ezúàâââ={öзéû»®l°sçÎê$((hòäÉLd¥££sýúu&.ìVuuõ­[·èíLL hmmí¸GGG'&&&''gÁ‚,p: jµµµåå墢¢ŠŠŠÌEPTT¤Wô7P¬À•@ R©fff¦¦¦Lyÿþ½¢¢"}š‘ÉäS§N±ØY;??_MM­Ó†¸¾|ÿþ}ŸB>|XXX˜•d@ë´$;àaPè0¨áæœÑ£GžÅ:VNLÛ»w¯ƒƒƒ¹¹9[R^¸p!‹AÖ¯_øða##£Ž;555Q ŸÆÆF“ýÍÂÂbðü7ú: j>|@ñÒªF˜¼¼<ÊÌÌìÖ­[xòæÔÔÔ‰ÄéÓ§wÚ¯¥¥E òóó) ‰DêM¨ùóç3€í 32ƒnKÀí L8|øpjjª··7B()))55ÕÓÓ³¨¨ÍÌÌܳgOjjêž={ð9t=òööÆ;÷îÝÛÐÐÀäS!têÔ)<‚u>|øúõ++UBHRRòßÿíú?ñ………ååå[ZZ Y‰àhÑ`Pð544˜»ÜÓÓ“>žÜÄÄ$%%¥ãÑqãÆõôª§C^^^ôÑ×L«ªªª¯¯ï4¾‰i***AAA¬D P(~~~]»`c£G.))ùðá{Z hÑ`PÃ…Mâ’””ÄÄÔ;=áççŸ8q"+}jooWVVæçççt.ìdiiÉ®P***,,g¼~oøñãÇÞ„jhhˆe%0`/^ ¯†(t¼ðW555N'ÂfÑÑѦ¦¦f¬aΔ)SXœxðÚµkÊÊÊÆÆÆ=€¿ÿ^¾º*++sÞ¶IÇl+)ð:âË¢E‹ Ð  Ð`ðâÉB‡J¥ÚÛÛçææ²¥Ð©¯¯—••e%‚¿¿ÿ±cÇœ ¤¤ÄÏÏ_ZZÚÒÒÒ›œÅeÉk'°’¯#¿r:0@ ƒWAAâ¹B§¡¡aÖ¬Yl™¹ªªjìØ±T*•é4mëÖ­Ó¦McpŸ’’•Jýüù3Ó7p : ^Ÿ>}B±kö !..Ì–Pïß¿766&YúwlÅŠ?<OùƒwB€Á‹' W¯^á–*ÖM›6-$$„éË[ZZtttš››x&þ  En…ƒFóñ*++s:vºzõjBB[B1˜ü¦7ÒÒÒ´µµx&.tØUŸ: R•••ß¿6l˜˜˜§sa'===}}}Öã¼ÿÞÕÕ••FFF½±…kÍââbVnàuÀ Å“Í9¡õë׳%Nee%++–×ÔÔ ÷ædü+ÀrWp#(t¤pû’’R×CÞÞÞ±±±xráöövAAA///¶ŒÖf#//¯N …"„ž={6{ölÖãOŸ>•镃‚‚òóóOž<Ù›“ñ¯@_ ÀE Ð`ÂV»òòòjll¤/ºùöíÛ'NìÞ½{@óû‘¦¦¦®;ß½{wøðaÖ  …gaaÁt*•ºfÍš^ž<|øpAAÁoß¾555õ²0H@¡À … n[t:3f }ùî¶¶¶“'O–——#„š››çÍ›×±¸qãFjjª  `uuµ––ÖãÇÌÍÍÿøã—/_†‡‡ýúõÔ©S………ôÑL ¦¥¥Ý¾}[@@ µµ•J¥ÖÖÖàCHMMݳgþhdd„—}^¾|9ë_NJJÊŸþÉJ¡Ó§þ=AAA!??¿¸¸XSS“雌Ôà¢Û;ÞR)4Ï—3‡) q:8 ©ÒÒR„‚‚ãÓ(J`` ®®.þxæÌ™U«Vѯò÷÷þü¹¡¡!BèîÝ»þù'>øíÛ7sss„ÐîÝ»ÝÜÜBrrr‡¦(Œž;wŽ!D£ÑΟ?O¿jß¾}µµµô6':]]]zª¬ “ɽoé*<<|Ö¬YÇïý%ŠŠŠùùù%%%¬:o”]ÝAm§Ð™ÿ›VÐÆ Jm¸šÈîÔ,FÆT¦H³”}}¥™} ’ª>ý_›¿IsæðeÇLj\¯Gè (t¤JJJPÏ…NQQÑž={š››“’’|||æÌ™ƒ÷GGGãÖ¬½½L&ãºäßÿíØ%ÅÁÁ!%%å‡i0hkkëàà &&&''7yòdGGÇF ûùçŸY\´!4eÊ”)S¦0wmKKËž={=zÔ§«äååÑÕ'‹¾×µSÛiSm•4Œ¥åÇŠë˜ËdE•M±éæ%sd5E'.•g±Ð±Ø=úõý¯YQeSÖ*‘ø /o•^sxíx×]I0` Ð`ÂSñß×®”””p{IZZÚ¥K—LLLð|0222]ÛQ0öÃ=]1hlllllL¥RËÊÊ’’’Ž=ºk×.ÆÑŽ?>qâD ªªªÔÔÔyóæ1wySS“““SO_lOðù¸úd‘€0 !4ÓEm¸ª0BhÒRù¬¨²qVrøè»„ЏcyÅoêEù´g°Ø=Zê¿×OyªN,~]Û\×.§-¶à ¶†‘4>D£ÒT ? IDATO<»ZXûµYFCT~œ8ýv þ9óqéÛz„MÀ„”‹Ÿ‹^תH®½8Qt¸ÀÄ¥òüB¤¬¨2ÓíêÔ„ä´ÄîìzÛô­Mx?ƒ4D¥\üüøâçªOMT MRAPgöˆ¥¾c™Îõ 0ƒQ[[[EE‰D1âë`¸¹¹Ñk}}ýk×®u{¦‰‰É¥K—è/\¸PYYIÿØÞÞŽ7ŠŠŠ:Nà TE$G޹xñ⎠?¡†††®«P-X°@]]ñýPbbbhh(Ó—KIIyxxôõ*\è\ºtÉÜÜ|öìÙ¦¦¦³fÍúùçŸMLLŒŒŒ¦M›öÓO?Y[[·6Qz0éìǨƒï£¾yëÿ·eþ]viå‹öVê´õʺsd²cÊý¦¶4üßOóéEÍççÕÊ%ìFѨ´«ë2(­ÿ÷ ßÝíý~¸ºÈô£ˆü„ôð’Þœá¨:vž,Bèºã«’¬:ýeòÕEß‹^ÕvͶ¹®@@D>ã4,ɬ»»'[t„€‘ý(ƒUŠ-”ªÂïlÌ€ž@‹ƒQyy9•J•““Ã=`:ñööNIIñôôܶm›¬¬¬¦¦¦ŠŠŠŸŸŸ««ëöíÛ¶mÛ&"""$$$##cbb¢­­ZºtiPPЖ-[ÄÅÅ)б±1ÞMŸ>}ëÖ­ÂÂÂBBBõõõ¿þú«‡‡‡„„ƒ€¥¥¥ÞÞÞß¿§P(­­­[·n혤µµõ–-[$%%$$$V¯^-##ó믿²þåŒ=zÆ Ì][QQqäÈ__ß¾^8räH„Pyyy§z®+qÙ^udyzµ›ÁêÿÈ’äל9!$:B@ëçá¯"¾<¿^lì ‚š½]}Ü<Ùì˜òïum zâ_²ëëË[$…¾~z¥p¦‹êü}Ú!•vyMzN\ÅN^© BÊŠ.SÖ—´ œÐmÏåøùÔ6êË;_´MGŠó1HƒqÀÿ«ÿhˆO¤9Qrââ‘B’ülÉÆ Ð`0úúõ+úïkW^^^^^^÷Ðgá# úÊØÚÚÚÚÚÒ?ÆÇÇÓ·W¬XÑíò– úûû÷ø™™™™™™uÜóúõëêêê™3g2¸ª7ÆÏôµ!!!Ì­v.''‡RRRºté‘H$ü‡H$âøÿ;íü¥7w?7Á¯®ÞÜÿ´!ï¬üØHi£%žúØñLz§à—·JÃ\ÞP)ÿÿ…#•†B_²ëi44yÅÿõò! úÖ ¸ÐanÕY½žjˆÔà"’Qgöˆ§Æ1Nƒq@Õ)R&ΪϮ¤V#„Hü„¹žZJ%XÏÆ Ð`0Â…ëv•„„„šš ¼¼¼'Ožt,×údÆ µµÌ¼øÀMk--- Nãçç' Ì冦,L$¶ÅMÃýx:¹ÿÛ»‘cÄV?BM8õZñoñ~IyA„PAjµœ¶(ÞóñÙ·Þüÿ=æÜuŒzOi0X–Û 3Zä`žYeASÕç¦gAEÑÞï mYÏÆ Ð`0*++CýYè8p ¡¡áéÓ§111ô[ýÍÐÐDbøÇ¬bccóóó™»–B¡HHHHHH0q­¶¶6‘H¬ªª¢P(,>EiVB(ù\Æ iå ¯î~A¥\úl±{´™‡Æu§×¾Æ´g ’åyEµ¦ÛÔgº¨"„Hdbs]{Úõâêâïï*BIg Ô†éÍ—Óž5âî®·’*¥”„J³ê>$W!„’ü tçÈ$ùô0Á/¿0£!”tö£ ?¿ Éhã(áaü¡W_ÞÜûŠJ<õq˜’ÐLUzÇ ßF—EÊ}ùu¤®X{ õkN=YŒ_Èø‘ — Ð`0ÂAú¯ÐÙ·o_?Ef€•èæÎûýûwæ®uss333›?~_/üòå‹„„İaÃ*++«ªªddd˜K{ù!ôä¯Â¼ÇUó¼´²”!„ž^)4X©0i™<™˜pòãób‘ ¥$8v®ìØyÿw»5ão¹e%|â$Jþ’SŸréóÇ'ßôæËýreâÃ?>¼ºû%3ªŒO€8RGìKNý“Ë…¦ÛÔl/Oì)`êµbü’w" GK«N•B=<œ[YЄ•˜¶qY„ôÃ4”P—%ç§Tåþ[)(Ƨ:EjÞ¯ZüB$ÆÌ ½…ƒ.tXüƒ:ظ»»ûúúX{¡ªªÊÜ…T*õÞ½{çBì½#GŽÈÊÊÊÈÈTVV–——³ø»ìzö?ýò?ó;ëYÉéý7Ô¼)GÆÝâ"Yж: ÝíÑžîI3é)ÉÝÏ{<Ä õ­åõ­»ÒÏà‘ —`x9ƒQEEâ­B§¬¬ìþýû,V9)))§OŸfîZ"‘øîÝ;ܧ¸¯>}úää䄇úw“ü Ð`0Â…NŸÖ(äøùù™kMé(&&†é÷V?fz÷ˆˆIII\èàŸÀ- Ð`0ÂͼTè 6Œ>ži;vìøå—^ Þ¨hݺu---}½°¡¡aíÚµxÿТwB€Á¨ªª ñV¡’‘‘Áb111æ:h—––®[·Ž‰ÀÀ@111¼ …Ü:#0è´··×ÖÖ’H$æBNwîÜa® ]xxxAAÁ—ÓêÓ‹€®[·®¡¡oKKK#(tà6ТÀ S]]M£Ñ¤¤¤ˆDÞù/tË–-&L`%Brr2s¥Rff&sI---Æ SVVÆq¡S]]ÍD(§@‹ƒÎ·oßBRRƒb²³gÏ…„„°ççŸf1“Ó§O3×9 @GGgâĉ}ºª½½}êÔ©±±±ôuU%%%Ñ¿€[@¡À ƒÛ ˜.tRSSoܸ!$$D¥R¥¤¤ªªªŽ9Ât2›7oF±8`*///..ÎÉɉéMMMÂÂÂÂÂÂL\»páB&“²³³•••;®?lØ0-:p(ttjjj³…NNNNDDÄŸþ‰?mÛ¶É1åõë×ÏŸ?g¥Ð¹|ùriiéáÇ™¸¶ÓÚ¢½¤§§w÷îÝŽ{ð/òÃB§¥¡¯ê5Z—•H‚B€A‡•   Ž ›+))Ñ›sðøê}ûöikkggg{{{ ^¾|ŠŠzüø1@hoo'T*õرcŒïÕÖÖvòäI<‰sssó¼yó,,,º=ÓÀÀ@QQ‘‰Ç¡+--56î~6^Æ6mÚäå奤¤Ô§«^¾|)'''/ÿ?3ùâWW¸ 퉨¨¨Ú´axU0˜_4’Åé+·€B€A/¯ÍÜ+ …"""ÒqÏèÑ£ñÆéÓ§8 ­­ÒÕÕUQQ¡¿ŠŽŽþúõ«þX__ïîîþÃ{9sfÕªU ø£¿¿ÿóçÏ »ž©¬¬LïÒ˜ÇÓúþ?Á?þœ˜˜ÈÄdÊ{÷îÝ´iÓ¢E‹:îøþý{kk«€€@·ÊÊÊ&^Îîëíý V *•ÚÓ!11±#F¨ªªVTTˆˆˆÐgˆ‰õóóëxf@@Àï›s°ööv2™Üm¡³yóæß~ûé5J¿|ù"%%%((Ø× CBBz*JzÒÖÖ¦¥¥µ`Á‚®‡ÄÅÅ+++kkk;öÝ fPè0è°Rèðóóûö w›íÊÞÞÞ××÷ðáÃÁÁÁç)îZõ¦U_FF†ÞÄ•J½{÷î_„1pöìYIII>]E£ÑH$R·…cüüü˾Žp¡SWW…Ü‚wfé€gÔ××#„ÄÅÅ™¸vÛ¶m¿ýö[SSþX^^¾nÝ:zÿÙaÆ |ûö­cƒ   úÇšššÐÐÐÞK__ÿÚµk?|8kÖ,Q[®Y³FÐUüG©««õ¶€Î#:ˆüeÏ+‰DMMmíÚµ[·n¥P(,KZZúàÁƒœëš½¼¼fÍšuêÔ)ÎV .<}úôŠ+zôè!''ׯ_?vJ©;vÐh´ôôt¼ §{÷îì•=k×® Y½zµ¢¢¢¼¼¼ªªêøñãñ NÒÒÒÎÎÎmøYضlÙÒ†VÉÉɶ¶¶¢¶:|ø° «ø‚#Q€D€@±ƒs´-ÐAikk³·—óêÛ·¯•••±±1W¹§§§§§'oý;vº‰DZ¾|y«ý‰ˆˆ8yòdZZZÛ6¹äååõîÝ›kt:]ÔV‡f0‚®â? ;)@üÁÔb¿G¹6Ou”[·n9::þŒ; ’œœ\QQÑæ­¼ÇOIIµUAA½Q‚”••Q(!¿y%%%#:HÑ@ì|ÿþýx§v ;wR©ÔŒ7ÎÚÚºmk€Ú`Æ mnnbb2iÒ$Q[­[·ÎÏÏÏÞÞžx“êêê±cÇ>þ\H ƒ/á?_T*599Y¤®‚Îâìì Géü@ €ØÁïÑÑÙ¾}{ÇÞ !«^Zåãã#jƒÁb±D=ùÍ›7îîîÂíø*{­7¯ªªªU«Vµ?±øÙnݺ5sæLtþ Ð@ìà@§=Û”ÄÇׯ_mmmÏž=khh؆æIIIƒ ÒÕÕ©•´´tBB‚¨Ï9räÈ‘#…×ÁŽð5:ªªª‚v§ñßÙ]¿¬Ñ@ìàÝ]#Ð)**zÿþ}›G§þþûï·oߊԄÅbmÞ¼YÔc”¯\¹R\\ÜjµVGtâÄ~ÊËËwvG:€¡¡á¡C‡ضæ666&L©Éýû÷322Dš’ Ñhþù'Fkµ&>G¢‰SWˆÖÒÒ"++K&“;»/@AAÁÝݽÍÍW®\)jMMÍÍ›7‹Úê?þ ²³A €Ä WhC^'ñdoo¿sçζµýßÿþ———'j+mmm‘–!³X, …²xñb"•ñߥ©©IÔ^: :ˆü•è@'''‡}æÞË—/E=̆íÌ™3L&S¤&QQQ±±±"5‰%’ª£P(èG0 è ^ðK¿P%ÔæÍ›ÕÔÔ,,,<<<æÏŸ¯¥¥UZZ*êê`„‡‡‡‰‰‰HMþùçQqŸ?~êÔ©+ã¿ Œè A`âg-hó(ˆ8°µµµ²²òññÉËËËËˋ߷o_UU•©©é‰'´µµ‰Ü$++kñâÅ¢srìØ1Q÷¢GDD_÷ÿ.mÈ,è,0¢€xÁ#:èØØØ$%%éë뻺ºîÞ½ûæÍ›ïß¿Ÿ5kÖàÁƒ F9!QÏ¡Ñhzzz"ÅF7nÜi–è@ €@ñÒÜÜŒ$<Ð122úþý{QQ»äÂ… ¹¹¹$x‡¦¦¦††+++âe2™fff555Ä›dggoÛ¶M¤e@0¢€Ä@ñ‚—ñJKKð´2‰D²±±aŸ<[PP°nݺ3gÎ_=C¡P._¾Ü¿â-,,ìׯŸŠŠ ñ&t:Ýßß_¤_5®,$½¹H¦L™¢óÃýû÷;äž.è ^ðˆŽŒŒLgw¤]lllnÞ¼‰jhh˜3gÎŽ;ôõõ‰7OII166鉉‰‰"55jÔܹsEjÒ±Ž···§§'ÎÞzùòå¹'€ :ˆ—.0¢ƒš0aBff&•Jõõõ522rss©¹‡‡ÇÝ»w‰×¯«««®®éˆÅ¿þú‹HÎ.8ÅÁhûÍ™3gÆŒT*ÕÆÆ&%%åË—/ìK ãðáÃãÆÓÓÓ³°°ppp`ïr)--ÍÅÅE__ßÒÒrýúõåå圻xñ¢žžžŽŽÎرcÿüóO"—t’ýÿLèzð’I?YQQÑÄÄdÕªU=JII©mcc#N·³³#ÞäÊ•+éééÿüóÁúeeeçÏŸ_½zµHCIII!„*++½½½étzsssss3þ€ÿ/•JéÜä°°0…€€€qãÆ]½zÕÓÓ—ûûû_»vmüøñS§N-))¹ÿ>{âOÐ¥¤¤$___ww÷úúúää䬬¬øøxœŸëåË—;wî´´´œ0aB}}ýíÛ·?|ø€o(ä]:ˆ—®è „þúë¯;wÑS^^¾¨¨O褠 àááA¼¾ººúùóç•••EêBŸT__/d¦©OŸ>ïVWWwýúu[[ÛÞ½{3&:::eee×®]óõõ]³f ®¹aÃ<Œ$äRpp°²²ò˜1cB***cÇŽ½uëVtt4>ô'PÃÇ@O›6­{÷îøB.Ð@ €xiiiA?F$š­­­’’‘R\"##GŒÑ£GâMæÍ›G¼rCCƒ¼¼<DÒÔÔ„w]©¨¨ìÞ½[VVVFFFVV–ýAFF¦ªªê?þ xؘ˜ÆÆÆ¸¸¸¸¸8\’““cnnþæÍ„££#»æð!—JKK FHHç#Øc3K—.ˆˆÈÎÎFIKK¯[·/„r €.Ä 3õ <1têÔ©áÇ·¡áš5kNœ8A<áyxxø˜1c´´´Ö?|øpssóöíÛEíØ¶mÛzõê…’——wuuå[§¸¸˜`Êb±ÂÃõ´´Ø“tQQQ—/_677WUUEåææ2„«•KšššRRR±±±|Ï?,..ÖÖÖ~úôiiié‡"##<8gΜ=z¹Dä@ÌA €xé2#:%%%ÄS+°Õ×דÉäéÓ§¬Ï`0ð/‚.]ºtãÆ Q;F£Ñ###÷ïß߆t¼Ž;VZZjiiidddggwóæM•øøx“ùóç[YYmݺõîÝ» `0oÞ¼ÉÏÏOII100tÉ××wݺuöööãÇ—––...ÎÏÏ_¾|ù²eËB·oß>xð`||¼žžF{ýúµ’’>ÿPÈ%ºt?Å•+WÚ° »[·neeeÄ´ †ŸŸŸŽŽñGäçç·aÀŒB¡äææVVV¢oÃÓUYYY ÃÎÎ.,, ï;}úôüùóCCC<˜œœœ’’"++«££³aÃ<Ä"èÒŒ3(Ê©S§¢££¥¤¤ú÷ïoccÃNä®®®®ªªúøñã‡*))YXX¬_¿ý¹@ ã1™L2™Ü†Mò{öìqpp žËSNNnåÊ•+3Œààà 6ˆÚ«7nèèè°£níĵ-22’ó«’’ÒŽ;vìØÁÛPÈ%;;;A»Õf̘1cÆ Q/ÐHüð8@ åççOš4IÔVL&388øýû÷ë×ÖÖŠ´¦822233SÔ^}ûömÆ 8Y—YAÀŒè ^ðêœ3èD?~4h¨­>}ú¤¯¯okkK°~tt´H»º Ú° LIIéÀx $:ˆ—®è888ØÛÛ‹ÚJ]]=--xý%K–ˆô333Q»TQQ¡¦¦æää„¿v™¥âüwÀÿ\/]#ЩªªjðǪU«nß¾M°2•J•––ÖÐÐ Xúôé\)ZÅb±–,YÂ>äu¡ãøï€@ñÒ5ggççÏŸ·ZF£mÞ¼ùæÍ›uuuT*õÒ¥K8’ bÏž=ÇŽ#X9##£ººº_¿~ëcUUUŠŠŠœ{ÝaD‰SWˆräȃ…¯öÕÓÓÛºu+‘›×ÔÔDEEùøøïO]]Ý‚ ¢££ y¯¶èôíÛ÷âÅ‹ÄøÙ Ð@¼à¬Ñ8ငÊÊʲ´´$^ßÒÒ2--B¡ìß¿?))IøPÍ«W¯ÊÊʦL™BäÎAAA¢þ«ýëׯ|£D Јt/’èÔÔÔÌ;÷íÛ·Ä›ôìÙóÂ… çÎ‹ŽŽÖÔÔ^ùܹs={ö$èüöÛoŠŠŠÄ{‚ÒÒÒÚ´i“ «MMM!‚Êâv] ^ðK¿P%QMM͈#DjbccSYYdaaÑjåyóæ\YÌd2µµµ‰Ƀ±X¬Y³f ©ƒPŒ$:ˆü•Ü@GWW7""B¤& 8{ö¬³³3‘Ê&&&ýû÷oµZCCƒ¡¡acc#ñnÜ»w¯¶¶Vøq;0¢€Ä@ñ"++K&“›››%ôpäÂÂB*•J¼>•J8q¢££c«5 †‘‘‘Ì¡ŒŒ +++yyyâ=™8qbTT”ðô !‘n è\è vÐwªÄÙ¶mÛƒˆ×¿ÿ>ïq5|]¹r¥²²’àiÈ“'O %Þ˜˜˜¦¦¦>}ú¯†Gt Ð@‚@ €ØÁïQ tú÷ï?tèPâõ'Mš´k×.‚5=Š£@á²³³©T*ñ•4/_¾ô÷÷ÿþý{«5qQ8::ˆü%òÞCAAA"e•’——×××'RSNNnþüù­VkiiñõõÍÉÉ!Þ‡nݺ:tHEE¥Õšè q`{9bGr/_¾|ýúU[[›`ýÒÒÒ+V$$$´Z3 ""‚7Ë&/*•jff6~üx‚}hnnÖÔÔlu[;†ÿ(BF•¨Tjrr2ÁGƒÎ2hÐ SSÓÎîøE Ð@ìHn óðáÃèèhâGß¿ŸàðO\\ÁØ¥{÷î'Ož$Øúúú‘#G>~ü˜`B üGR¹ªªjÕªU'N$Øðë½{÷ÎÐÐø$@ÒA €ØÁïQ‘ö.‰ …2fÌâõ=<<ˆÔÌÈÈ rÆñ£GÞ½{Gd†‹]Ò¤I£„P}}=è „TUU>Lð†à×#84º t;ݺuC?Þ©’eêÔ©Ä+3™L))©V7:!„ÒÓÓõõõ‰lÎ "x6uêT‚‡,c8ú$:,F@ìHn sëÖ-âGæääØÚÚ¶ZÅbÍ™3çÒ¥KDî¹k×.âÃ9þþþˆrÁüHt;è°X¬åË—Ï»^TT4zôèV«}øðAFFfÙ²e­ÖüúõëСC…ŸøÇýøñcQÓsÖÕÕ!„ºwï.R+@'‚©+ÄN=BµµµÝÑ444L˜0xàææÆb±Z­6`À€wïÞµZ­¤¤ÄÆÆæõë×Gh&Ožl`` Òp‚@ #:ˆeee„зoß:»#¢QTT$¾ßª¡¡¡¡¡¡ÕõÅ cöìÙDRV=þÜËË‹`àR]]Ý«W¯aÆêë, ÿQð  Ð@ìHh “››+<õ7§””¾—þüóÏsçÎ᱓£G>~ü˜HÊ…éÓ§ÿñÇD]PP0bĈææf‚]eûþý;ƒÁPTT”‘‘µ- ³@ €ØÁSW_¿~í쎈&<<üÎ;+ÿþ]ÐÆòššš .èëë{xxÔÖÖ®\¹²Õ»]¾|¹ººšà£ ÿüóÏ6+x2ÿu’Öè vzöì‰$pޱ±±¡¡!ÁÊóæÍt gËZ½zuttô…  jkkçÍ›gffÆ·þ·oßüýýïß¿OðÑ3gÎ$X“ =ñ_G¬Œ;¶¢¢"%%EKK«³û€ØÄ~•~ùò¥³;"š… °¿öë×oàÀ222‘‘‘¼»ÁCBBêëë—.]J乪ªªDNXæ«oooOOO|ðàåË—‰7¬ªªª­­å t ãB@ €ØéÑ£‡””Tmm-“Éìì¾UXX¸oß>‚•{÷î-dþˆ+Ð9uꔿ¿\\ÜðáùjÖÖÖþõ×_·nÝ"øÜM›6íܹ“`e^555èGÚNsæÌ™1c•Jµ±±IIIaÞEEEééééèèàõ~~~xÔ§¬¬ !dgg·bÅ „Є ttt† rôèQö=<8räHƒùóç²ËÓÒÒ\\\ôõõ---ׯ__^^ŽË'Nœ¨££ãååebb2tèйsç´ÿG@Ü@ €Ø!“É=zôhii‘ AWWW‚•g̘!$ñBÿþýñ{!xóæM]]]Þš²²² ÅÊÊŠÈCŸ>}*''§¢¢B°“¼p Ó»wï6ßSXX˜‚‚B@@€””ÔÕ«Wq¡……çiÑÎÎΜY5<==ñ× x{{{{{s&:MLL433›7oÞÛ·o½¼¼p”œ””´téÒææfww÷É“'§¦¦.X°§&ÅmÓÒÒ&L˜àææöñãGOOO Š­ # ŽTTT¾|ùRSSÓQ¯ÕŸMOOOOOHÍÂÂÂÚÚZkkkAðq|µµµ×®]‹WSSã­Æb±²²²ˆÄ.111‡JOOoó¼B¨¢¢!•ššÊú¡¥¥…óFkhhhõVuuuׯ_·µµíÝ»÷˜1c¢££===BÚÚÚÓ§OOHHÀÕ&MšÄd2“’’ðWee夤$///Þ5IÁÁÁÓ¦MCnܸ±ªªª_¿~ÁÁÁÊÊÊ8ÓªŠŠÊØ±coݺ½xñâÑ£G‡……={väÈ‘!ccãuëÖUTTYí€@qÔ»w¢ÏŸ?Œ:]ddäøñãÕÕÕ[­Ã`0„:!uuõyóæUUUݼySPsåÊ•œœ‚óe222GŽiO”“””‰úðáçÌ/"iJcbbãâââââpINN޹¹y›»‡222ÂBø  ÒÒRƒÂY“³ÿšššø…BAÁˆèz Ð@áœÏŸ?wvGˆ:|ø°±±1‘@gäÈ‘­S 0 ®®...NH²…cÇŽÕÕÕ t¦OŸN¤šfffC‡}úôi`` ¹¹9é)))Îeeeëׯ~+‹®¥¥egg‡K¢¢¢._¾Ìè°·†Ñh4¾w ØmMMM))©ØØX"‡.Ð%A €8RUUE}úô©³;B”‡‡‡¶¶6‘š­njnnÖ××ß²e cÄÏÏÈËûõë׿ýöÛljô/:þúõkCCCœ‰bôèÑ‚*ËÈÈ´šUôرc¥¥¥–––FFFvvvxÔ*>>ÞÄÄdþüù8XÜ»wï€^¿~ýøñc„P^^žQêÛ·/BhóæÍúúú™™™NNN8:{öìÂ… ™LæÍ›7Bׯ_÷óóóõõ]·n½½ýøñ㥥¥‹‹‹óóó—/_¾lÙ²»wï"„Μ9ãææ¦®®~ûöm„Pbb¢··w›Wˆ!XŒ €8’¸@gÅŠÂã,--½âDk×® ¿[jjª‹‹ ^’"Üž={åš ‚Åby{{Ÿ;wýøsà?M{à骬¬¬þù!V\\ÜØØxúôi„¡¡áöíÛóóóÏ;÷ìÙ3¼ ;''·566Þ°aCQQÑ… ŠŠŠfÍšåíí‘‘ ¿}ûvjj*þ ÇÆÆ"„f̘qüøñ=zDGGGEEUTTØØØØØØ „233B/^¼}ûöÇ“““BÑÑÑíüé70¢€8Âÿp¯ªªê쎒——W]]=yòäVkÆÄÄÁTTT„*”””¸»»?~üxÀ€­>ñèѣݺukµš L&S]]}çÎt:ýëׯ222íß^ž’’Âù/ýá´páÂ…  jŽ÷[ ¹áòåË9¿ÚÙÙ±çÈ„´ÊÏÏÚk$:ˆ#É tîß¿_YYI$ÐYºti« tZ½OVV–´´4þ A£Ñî߿Ϲ[[TÅÅÅÚÚÚ{öìA•——³X¬Þ½{·:3+è Ž$+б´´$¸<ÖØØXx…ððp###áÕœœœÔÕÕ[)Û½{wMMM›òòr‡„„„Áƒ#„*++B|7ºÄüÓq„_¨øàñ7bÄ|‹p—.] Ga±X‡jiiRçâÅ‹ÅÅÅãÆkõqƒ Ú»wo«Õ©¨¨øý÷ßq”ƒ~ü- Ð@â@ €8RUU•––þüù3> EÌýþûïDúyãÆ áZZZ–/_nbb"¨Bss³¿¿jjj«Ïb0K–,²;]¸¦¦& öR˜7nìØ±!T__ß¶: :ˆ#2™Ü§OŸ––ñŸ½ª®®Ž‹‹“‘‘iµæ‘#G„d~@‘Éd///!˜L¦””Ô‚ „?(66ç„j›‹/âsŠÙž={†Ó­·çÈA@§€@1Õ¯_?„ÐÇ;»#­––Þºu+‘šªªª8_7_ß¿744ä:™geb“••-))iõèáÓ§OsE*ıX¬ÐÐP<~ÃÆ7Û³´Ð) Ð@Lõïß!ÄÎ5-¶zöì¹dÉ’V«íÞ½ûòåËB*$$$“ÉdÎÂ-[¶ÌŸ?ÿÁƒ!¼…JZºõ-±±±ÂSLA"‘Јf ) Ð@LIJ Î>ÎNˆÔÔTáÙ"]\\‚‚‚¸ ååå)ÊòåËÇ¿víZáë”BEEED‚!^ cöìÙ¼—Ø#:ð‰b g[ž?RÄÅÅUWW·Z-99ÙÊÊJÐÕoß¾µ´´ðîiRPP°´´,++Û¿¿––Öǃ‚‚¾|ù"è>6lÈËË#ÞyNø¤`|1èH$}$œ£€˜ÂƒeeeÝ‘Vøúúêëë ¯SWW'|ÔÉ“'¸Ê•””¾ÿN"‘ðñ¾/^¼8tè©©éœ9syÏîspphóêœÑ£G[ZZrÍ!„ZZZp$×»wo99¹VïC¥Rq¶) žòòòÚ6æ$ü±S8Ðÿ"GÚlÞ¼yĈîîî‚*ÔÕÕñÝK¥¨¨Èù6l˜¹¹y||üÌ™3¹¢œÆÆF …"|Ó– ÅÅÅ'Ož~tS***JJJß¾}«­­íÑ£Ggw‡¿üüüÿý·ÕjwïÞ’"*66ÖÆÆFQQ‘÷’¢¢"•JE}þüyöìÙŠŠŠIII¼{Ô;&///<–"%%EÈ–u‘€¸ÅȈ/üf}÷î]gwD ‹•+W ¯óöí[!™°êëë׬YÓÔÔÄ÷ª‚‚B]]ÝóçÏ­¬¬ÌÍÍÃÂÂøžÄsìØ±üüüVÏ×áõÏ?ÿ¼ÿ^xCö–«Šz@§ƒ@ñ…߬âèhhh´zbÍüqëÖ-AW©Tª···ŠŠ ß«ŠŠŠ¹¹¹#GŽÜ²e˶mÛx‡…˜LæÊ•+ïݻ׆å¥OŸ>=xð çºœæææ´´´Â¯_¿² Ù#:è ‰`ê ñ…߬oß¾í쎴råÊ­[·ª«« ©SRR2~üxAWÕÕÕýýý]•––þöíÛõë×---ùVøûï¿cbb„,sÂØØøÊ•+œ{Úedd¶nÝšŸŸ¢P(ªªªªªª555øjvvvcccß¾}ûöí«ªªÚjút€8€Ä~_½zµ³;‹ŊíÖ­›ðjÙÙÙÊÊÊ|/•””„‡‡ i«­­ýúõkAQBÈÊÊêŸþ!’;SssóñãÇÉdò°aø.-\¸ Ñh>|ÈÉÉ)--Å%{÷îuww·±±166VSSsrré¡€N#:ˆ/¼á(//ïÆbøZmii9qâ„ôU¡GZL}éÒ%A«sBEEE555#FŒTáýû÷&&&|÷„ ·zõjAéÖ]\\¶mÛF§Ó_½z%--]É¡¢¢¢²²2??¿´´TZZz÷îÝ¢>ðëA €øb¯Îñññ2dÈСC;·?\ÈdòÌ™3…×Ù¼yó¾}û+BÖ)éêê j[PP0qâÄ]»vµá„@GGG¾—zöìéèè±mÛ¶Aƒq^e2™#GŽ,--õòò266õ¹€_¦®_¹¹¹!sss*•êîîþíÛ·ÎîÑÿçòåË‘‘‘B*´´´ôêÕKÈÄ“¦¦¦=Û“'O^±b… «!!!C† !’O”ÓóçÏi4𣣣q <{uöìYÞÔZ'OžÌÊÊÒÐÐrî@¬Àˆbªººº°°PQQ1%%eâĉOŸ>]¶lYdd¤i~±ÌÌLáƒLRRRBy{{/\¸p̘1‚*¸¸¸¹ùáÇ™L&oÆ!>}úäêêzúôiákzÆŽ«¥¥UZZššš:eÊvyyyùÖ­[B|OýAQ©Ôäädâ]eÔ¨Q¼¹Õ@—bêÁƒ,kìØ±ÊÊÊ×®]³°°¸}ûöž={ð»V¬]»Vø¦îÈÈȉ'öíÛ—÷FKLLÜ·o߆555ãÆËÏÏçÕ1ŒéÓ§oܸq„ ¢öyݺu­®\–’’rssÛ³gÏ?ÿüÃè¬Zµª®®nÚ´iööö‚ÚVUU­Zµjâĉ¢v üJÿþûï‘#Gììì:»#àW€@1uÿþ}„ФI“BZZZQQQS§N >|¸˜,Lžû‰Åbýõ×_‚NÙ¡P(Ïž=´H9**ÊÖÖVÐØÕ‘#G²³³[Í$ÊåãÇýúõûí·ßˆT^°`Áþýûccc¿|ùÒ«W/„Ð7®^½ª¤¤´ÿ~ámUUU>,RßÀ/Ö¶œh@B‰Ë8€ËƒBì±I“&²X,ŸW¯^uj×B¨®®nñâÅB*ÐéôiÓ¦q-æe+//’×ÂÇÇgÇŽ‚®ÚÛÛÇÇÇó(äÊ•+666B>séß¿ÿĉ›ššÂÂÂBß¿÷óóCmݺµ_¿~ÄŸ ètè Ž>|øðöíÛž={ššš² ×®]ëææ&& “‹ŠŠ„'¥P(‚ÚNš4‰w©/–““Ãd2ÙG襤¤TVV²¯>|øPSSÓÂÂB¤Þ¾xñ"..ŽD"o‚—$Ÿ9s!´}ûöwïÞ™šš¶a‡ sA €8JKKC?žk±íÿþ÷?SSÓâââeË– ~aÆ=zTH…]»v}üø‘亮oßzxxð™¢Óé‹-*((`—¤§§>|ëÖ­ß¾}{òäÉÌ™3Ÿ={F¼Ÿ ¡íÛ·ëèèo…²³³ëÝ»÷³gÏNŸ>}äÈ2™,ÒÚg€8€@q„ç­ðNòòò×®]ëÝ»7^˜Ü]û?rrr†††‚®Òh´ÐÐPAg ÚÚÚ Úž]]]mkkËy纺ºM›6Ñétkkë;wN:UÈF-.---K–,‰ŠŠ"XŸ“¬¬ìܹsBÞÞÞ ÃËËkøðám¸ sA €8Â#:œÎÛ·o###×®]»`Á‚úúz„PPPÐ7:«‡+W®|üø± «---»wïîÞ½;良¼¼’’A û÷ïÌYB¥R‡ š””$%%õîÝ;¼L›ˆÒÒRƒ1{öl‚õ¹àÙ«––88 »®;oÞ¼©¨¨èÞ½{YYÙµk×233322Ø©%B$iÈ!8{•íëë+誼¼<;i—àààqãÆ <˜÷Rrr²´´4×8V}}=˜†~÷îÝk×®ýþûïC‡ à{Nƒމ‰iý‡`èС²²²t:}óæÍÂ3]Ä:ˆ<œSWWÇu·žžž‹‹‹………©©© 4™¿LBBßláÂ…ä»1J__ßÕÕ•o«}ûö­_¿ž«°®®ŽóAÓ¦MKJJŠŒŒ|ùò¥@§¤¤ÄÕÕ533³=ç+ÖÖÖÒét2™,êùËñbOÍÈÉÉ›››÷éÓ篿þBéééñÆŸ.ÃWuuõÇUTTø^ݸq£ †ÞÞÞ¼gñÕ×׳£º'Ož,^¼XSS333SøöòÀÀ@Ÿvž"ýòåK„¾¾¾HÛµ:ÅØ±c+**RRR´´´:»/ˆX£€Ø™2eÊÝ»wËÊÊ’’’öìÙãããƒ7ûääätv×þORR’5+ÊÊÊ/^ä{hòÊ•+9çà8555¹ººò†xD‡N§oݺÕÞÞÞÏÏ/<<¼ÕCtŽ9Òþa˜/^ „8wøw )S¦èü@|ÕB(//Ï¢®®Ž³pÔ¨QÝAºt; .411aïd¦P(xktyyyUUU§víÿ¼zõJÈFkYYY¾£^½zuïÞ=¾ç>}úÔÌÌŒïݾ}ûöæÍ33³ÜÜÜÌ™3GxßBCCïß¿O¡P„W#"??!$dsY{x{{{zzâ¥?—/_&Þ°ªªª¶¶–+Ф€ý®“A•+W®Y³†ï%‹ebbòýûwÞK 8uêß)++KÐ ©Têüùó׬Y¦ªª*¼c_¿~=xð`«‹” zþü9BÈÈȨCîÆeΜ93fÌ R©666)))_¾|ÁåQQQzzz:::ïÞ½CùùùáQŸ²²2„Îè>aÂ!C†pžftðàÁ‘#GÌŸ?¿°°]ž˜˜¨óÿƒUGà¿$û°»ìììÎí &---h ΫW¯¤¥¥y“{³X,…±cÇòmåååÅ÷Ð᪪*[[ÛÇ ÏdŽ*((¤§§kjj¶Z¹UL&óåË—$é矦  À™æÝÂÂÂÖÖ–]ÇÙÙyêԩ쯞žžøë‚ ¼½½½½½ÇϾš˜˜hff6oÞ¼·oßzyy1™L\Ž'qŽ1â'ýPˆXŒ €°²²BQ(1ÑÑÖÖÎËËãfBúúúW®\á-ONN¾~ýú‰'x/EGG;::*((p•766ÚÚÚ&%%µ:ƒª®®¶±±9}ú4g”Я^½¢Ñh1114~èt:o!•Jmll$rÿºººëׯÛÚÚöîÝ{̘1ÑÑÑ8ÔÓÖÖž>}zBB®6iÒ$&“™””„¿º¸¸(++'%%yyyñ&U ž6mBÈÐÐpãÆUUU83—±±ñìÙ³ÿüóÏ„„„ÐÐPñtÈo ñ¯_!“ÉÝT]]M"‘øF9!6pà@ÞòØØX¾ f?~ü¸iÓ¦)S¦ð:£FRSS#Ò«½{÷0ÀÆÆ†He"ž>}ŠêÞ½ûªU«DjاO"ÕbbbãâââââpINN޹¹¹¨ýäÄžeÃ¿ÌææfüU]]}ÿþý÷ïß߸q£„©t=è zôè¡¥¥õîÝ;ÎyŠÎÒ§OŸÜÜ\¾—ššš† òæÍÞµÀ'Ož¤Óé¼M˜LæÖ­[{öìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ??¿þýûwà>pœQËÌÌÌÜÜœB¡ÈÊÊÊÉÉQ(ögYYY \XUUµiÓ¦VoÎb±ÂÃõ´´ØG%EEE]¾|™3ÐaçZ§Ñh|ï Ò“““ãëëkjjÜÜÜœžžÎ›`€. $ÃðáÃß½{—››;tèÐÎíIKK‹ c‚ Œy£œ7oÞhkkóÝ ¥©©Éwa¬ŸŸß¶mÛˆŒŽ„††îß¿ÿõëוq³²²òÚµk8˜›3gθq㈷-..&rxϱcÇJKK---ŒŒìììnÞ¼©¢¢obb2þ|uuuôcŒêõë×8ÕF^^ž«Â[ë7oÞ¬¯¯_QQ‘™™éä䄃¡³gÏ.\¸ÉdÞ¼y!týúu???„Piié²eËuttŽ=úáÇøøøG™@ÒÁbd$ž½zòäIgwmݺõüùó|/™ššòM¿åéé‰Ó”r9zôhJJ oybbbVVßè\¾~ýºgÏž5kÖtT”ÓÜÜ}º£¢œS§NáI4555P¶si0@@ €dPRR:t(NÏËËëÄn0™L‹Å7½Ã‡ìíí¹¦˜Lf`` oå–––ªªªp•¿}ûvÞ¼yìÓó„ KOOŸ5k–(݈N§'&&îÛ·ÅçñŽN$:H <Àйg¾|ùRÐâ\ ‹ãÇs&%%ñMäåëëË[þéÓ'!CÙôôô±#ƒÁÈÊÊ’••íß¿?.ÌÊÊBèÐ%@ €Ä°¶¶Feffvb***x'›B,ëÒ¥K¼åêêê|s;ÔÖÖâ A\¬­­ù‘Ìéýû÷ãÆ>|xûÓm~ÿþ}âĉœ…_¾|)..–——6lX;ïètè 1,--ÑÁ†Îbkk{öìYÞòçÏŸ󖛚šò=ÄoÅŠ\#CMMM¶¶¶¼+X,ÖòåË©T*ûë¬Y³deeÛø3pPPPpss;tègaVV‹Å255mu54@üA €ÄÐÕÕUVV.//Çù;Eee%ßCùèt:ï.¡ððp¾óV›6mjhhà*·Ÿ$:H ‰„s1â7q§˜;w.ßc‘ÍÍÍyS%üý÷ß¼ÇÛ<|ø0%%ENNŽ«|ùòåä½snn®ƒƒÃÖ­[§M›¶eË–ôôô‹/ò={8æââ"(±%ž„´—t è IFމ§ÃuŠ÷ïß2„«N§_¸p·òš5kFÍU¨««{èÐ!®Ýæ.\ ‘H|× ?}úÔÂÂbÑ¢EwîܹvíZtt4;…SÛ|ùò…B¡<{öŒï&yöäÉ)))tè Ð@’à@çÑ£GÕÒÒRÞtž<¸|ù2WaKK‹‹‹ ׬‹ÅRUUåZ“˜˜xâÄ Aá˳gÏðî§áÇ¿xñ‚F£Íœ9³ªªª g2™üñÇúõëÑ´—¼ž•——ç,÷ôô\²d ×)É}úô ⻸¸¥¥åÙ³gìƒûzöìyãÆ Œ?þÂ… VVV"õ¿©©©¶¶öèÑ£Bꤧ§£eÛP©Tœj ˆ­¶Ê@BA €$‘••µ²²ºÿ~FF†““Ó/~zDDDiiéþýû¹ÊŒŒŒŒŒ8Krrrtuu¹¢*•úàÁ®8£¥¥EÈÄÅÅÅ}úôaç6/**Ú¿rr²›››––ñžS©ÔÌÌÌÉ“'‡„„¯ùðáC„ÐØ±c‰ßœ“’’’µµõ;wÚÖüƒ ™SÁ:H˜1cÆÜ¿ÿÁƒ¿>Ða2™†††\…•••ÉÉÉ‹-â,9r$ïd–’’Ò³gÏ8£ŸÒÒRGGÇüü|A¿sssq„7Iݽ{×ÓÓ3;;›úñíÛ7kkëuëÖMž´¦¦fÔ¨Q\Ã9ÏŸ??|ø0WM___Þc…·mÛÆ9þôöí[áOôòòJHHà›)]8‹U^^®  ðï¿ÿÏWU__Ÿ““###Ã{ö@rA €äÁÎÝ»wY,Ö/{¨¶¶vdd$Wá;w¸vêFEEUWWs–àcˆ[ZZ8 wïÞ-èYïÞ½;w””²²²¨ýlhh˜?þB¼ç2 ñðáÃææfssónݺ‰úP€Ø‚@É£¯¯¯¦¦VQQñêÕ«_öÐW¯^ÕÕÕq.Z´ÈÛÛ›ý•F£mÙ²…F£qÖ¹xñ¢œœçŠãúúz]]Ýþýûó}ƒÁprrt _«Èd²ŽŽßlÂ¥¤¤ „&NœØ¶çÄ,F³³9ÒÙ½­èׯï4‘H¤I“&]ºt)%%E__¿c;&H@@À¼yó¸ö´÷êÕ‹3oCSSÓŠ+4448븹¹q&[HNN>tèPRR’ IKK‡……‹ÚÃ?fff:;;ïÚµKÔ¶¡ÔÔT„Д)SÚÐ ¶ Ðé‚ÊÊÊÊÊÊ/^ÜÙ}üøñúõëí¹Ã”)S.]ºtûöm¾[¾ Î’;wî~ü899ù‘üõëךšÎÂ]»vÕ×׳¿^ºt‰ëµQZZ*//ÏŽr*++/^¼¸aÃAO166 ëÛ·¯H};|øpyyùÚå Ž­­m›ï€UUU­Zµ úˆ¿[·nÍœ9ÿtTvvv?NJJúNzzú¥K—.]ºÄ.Á#Iœ»¢–.]úåËÎVƒ âÌú´~ýzAi­š››_¼xabb¹â§U,ëóçÏÉÉÉgΜ!ÞŠW}}ý£GÈdr‡,ÐQUUåÝrÄM|||gwü"°ë I5uêT„Prr2×ÎíŸANNŽë¼àèèèU«V±¿2 %%¥°KòòòÞ¼yÃÙdýúõœM8ùùù>}Z¤.}ùòÅÁÁ¡´´4>>^MMM¤¶\îÞ½K§Ó­­­{ôèÑžûÄ:Hª¡C‡4¨ºº:;;ûg?kÊ”)Ë—/ç,yòäɈ#Ø_7lØÀµêh÷îÝéééø3“É,//711á{°MKKK¯^½DZGüåË— &466𙙉ðcpëÖ-„½½}ûo7è ÁìììÐ÷ôOuóæÍÆÆFÎ’   ¹sçâÏ---qqq–––œ¼`Ávå;vð½sII‰””Ôž={ø.©æ;XUXX(//¿téÒ{÷î‰t$ _ÍÍÍx:tIè ÁðÞº_è¬\¹²©©‰ýµ¦¦†Á`°“3HII½zõJ]]³ÉÞ½{Ùy¬ÒÓÓxo[UU5mÚ´ÂÂBAÏMHH8yò$gIXXؤI“^½zµzõê6ÿ8œ=zT[[;tèPmmí¹!@¬@ €³¶¶îÓ§OqqñË—/ÞSÇ׳gOvɹsç8ÏIKK“••e}ÿþ=ç¬B(66–ï2šŠŠ ===A>sæÌîݻٓbuuuÛ¶mÛ¶m›©©i›.øæp]:@RÅÇÇëéééèèèèè¼{÷®³»Ó9Èd²ƒƒúñ¶þIäåå/^¼ÈYÂ`0Ø;±ËËË—,Y™öáÔ©SŽŽŽøó;w¸Ú²555™˜˜9𰤤$??ÿîÝ»ëׯÏÌÌܲeËçÏŸsrr8“N´‹Åºyó&Bèì\t t€¸KOOŸ?þ°aÃŒŒŒæÌ™3cÆ ¼jÕØØØÛÛÛÆÆ¦³;ØÉfΜ‰ŠýyxöìYQQgÉü‹"„***–,Y¹Â& Ï+±X¬µk×òÍiuùòe777áÏ=þüâÅ‹­¬¬ÂÂÂæÌ™Õ­[7Î¥öËÈÈøôéÓÀÛp3@"À9:@¬]¿~}ݺujjj³fÍjnn¾ÿ~uuµ¦¦&BHCCã÷ßOLL¼}ûvgw³37®W¯^………?)ïUDD„––Ö!Cð×ââb%%%ö±~ìʹ¹¹&&&Ý»wG‘H¤ääd®µ;ØñãÇCBB„<”F£EDDddd „lmmƒƒƒù®òi§k×®¡Á⯗˜˜Èw@ëÞ½{\ùÂm#:@|566îØ±ÃÜÜ<999 `ß¾})))½zõj5ãAZZš‹‹‹¾¾¾¥¥åúõëËËËÙ—222/^laa¡§§çääôøñc\>qâD///“¡C‡Î;·  _ŠŠŠÂsdx‚ÌÏÏÏ—•••9::âÏ‹-6l˜……ÅáÇY,ÖÏù}ð'%%…§]®^½ú“adddeeÅþ…??þ<''‡}©¾¾ÞÅÅåãÇ¡òòòššÞ(ÿ~ÒÒÒ„‡eqqq¦¦¦ìÂK—.]´hÑ‚ ¸6µ“ÉŒ‹‹C9;;wÔ=Û`Μ9ø BWWWH) @‡ƒ@ˆ¯'OžÔÕÕ­^½Z^^—(((œ;wnýúõBZ%%%-]º´¹¹ÙÝÝ}òäÉ©©© ,øþý;¾úôéÓ'Ož >|Ñ¢E,ËÇǧ¹¹!4~üx„PZZÚ„ ÜÜÜ>~üèééÉd2Bœ™œñI}¡åË—ã Þ™™™ŽŽŽ&&&­Tü ³fÍB]¹rå'ÝßÍÍóDãAƒ±g CBB=zľôþýûY³fõë×!´iÓ¦sçÎqݪ¥¥eþüùyyy­>ôìÙ³>>>œ%®®®¥¥¥Ë–-×ö{ðàAuuµŽŽNçÎ[-_¾|öìÙ¡+Và$iÊ”):::FFFxÒ544|ñâ…ððZH”À:@|á>> ?~ÄÙ_¾|‘——ß·oŸ²²²“““œœ\bbâÚµkñqÕ¾¾¾¡¡¡Ë–-cGù!åߺu+::zñâÅðã  ÐâËÔÔT^^þäɓǎc¿·oßÞ³gÏ5kÖj¥©©)%%Ëžðâ´wïÞ¡C‡¥¥¥ëÖ­‹‰‰iµ{Ÿ>}ú÷ß—-[æâ⢧§÷“òK'$$Ô××khh$%%1~`2™ìÏ---møÜÐÐÐÐÐÐ!=\¹r¥¯¯o||¼±±qRRÒ¢E‹¸2žò†×£|þ› ÐâKYYyûöíþþþ666cÆŒ‘““ËÉÉÉËËÃs%eee%%%¡Ó§O+++888øúú®[·ÎÞÞ~üøñÒÒÒÅÅÅùùùË—/_¶lBHVV¶¾¾>::úãÇiii¸íˆ#ðç3gθ¹¹©««ã\‰‰‰øÈuêTjj*×}fÍšÕêYÆ,«®®NUUµ¨¨ˆàï°Í"""Beee[¶léØ;÷éÓ§Cî3uêTmmícÇŽ™››“Édü0'ÞðZx”À:@¬¹¸¸¨««‡††^¿~N§khhx{{¯\¹!ô¿ÿýïýû÷¸~iYZZ:88̘1ƒB¡œ:u*::ZJJªÿþ666ìû>|xË–-çΣP( (,, ËÊÊÂù .^¼¨ªª:eÊœü(:::†††Û·oÿûï¿SSSuuu rrrða}!''§Û·o3™Ì%K–üñÇ?õwB&“ù&xrwwß¾}{xxxÇ:‘‘‘cÇŽeŸ…ÃÎo¥¡¡qéÒ%<ÇÇb±¤¥¥-Z„’‘‘yþü9ïθ[·n _\U__ïááann¾eË–Ÿå|øðáöíÛRRR‹-RPPþL&³?KIIµásEEņ ˆ÷äÛ·oaaaø`ëÐÐP}}ýùóçãK$ÉÇÇgݺuÅÅÅnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff–ÐêCóóó¹J.\¸páBAõW¯^}àÀVoûS¹ºº$$$|ýúµOÕ;~ü¸t¢££uttLMMñ*vÏÔÔÔ³gφ……eddôíÛwðàÁœw¸pá˜1c¸ yÑéô!C†øûûwTÏù>"((/HG9::wì#äå奤DØäQPPpüøq¼¼úÒ¥Kd:¡iÓ¦8pàóçÏ|ƒæ ¯…Gùü7Á®+ÚîÖ­[ø –ÿýïB2Sþ}ûöþ|ÞsÙ²eì¿ýöÛØ±cBwîÜá3 uvv&‘HÞÞÞ\GÞ 6ìÊ•+BÎù---;v,•JíÀ>s¢R©‡Ú³gBèðáÃáááïÞ½+..VSS›}úfddŒ9²ý7ÌÏϯ¨¨`Ÿ—ÈÞ‰½}ûv:Ž?_»vÍÉÉ©¡¡¡{÷îœkA ÆÉ“'W­Zedd$äZZZqqq?ãÈ>F¡Pªªªž?Ž·×á _øÃE‹ýÔÑ£v a§ªMJJÚ´i“’’þ\ZZŠŠˆˆÐ××’û€`D€®„L&{xx „Ξ=Û!7|ðàÁÝ»wñçÀÀÀÿý!ôòåK†g£ 7mÚÄ`0|}}/]ºÄÙvÆ ÙÙÙ‚9d±X{÷î=rä‰DúQÎŽ;tuuµµµÏž=Ëž¾ùüùó7H$’8Ì[ ‘’’žÏÊÊÊbG9¡;wîàòׯ_síáð‚@€.ÅÃÃD"]¿~ŸøÜN–––8‘B(** ¿n7nÜÈÊ¢Óé[·ne2™%%%\G ÛÛÛÿïÿt NIIÉýû÷9Oèé 8éÁ AƒrssywY‡‡‡Óh´©S§BÖLþ# РKÑÐа··§Ñhx½m;YZZŽ5 Þ¶m›ÎDÁÞÁndd´páBEEŇ²·”Ðh4[[[¾éWétú§OŸ´µµ:êÈ,!!A[[oÕöððàÝzÆd2Ïœ9ƒòôôìÀçÄ:t5x¡Ì™3g F;oµ~ýzö1Ð8«™L¾uëÞã³oß¾ÜÜÜsçÎq.‰­©©quue§…çRYY9nܸ˜˜„PGyüîÝ;WWWssóÒÒR!»©ß¿¯­­Í™¹еA @W3~üx==½òòò7n´ç>_¿~½rå •ñôôÌÌÌd±X›6mÂËn¾|ùJ&“pV2ŒÅbùùùálð¼]\\V¬XÑžŽ±}þü¹¡¡aÊ”)UUU§NRUUå;†ÄvêÔ)„вeËÄy2 cÁÿÚèjH$ÎõxâĉöÜGJJjÇŽ!&“yçÎÁƒ§¥¥eddà‘˜ž={†…… 6ìÌ™38ÝB¨¼¼¼wïÞ|Ïá}òäIrrr·nÝÖ¯_ßž^a/_¾=z´¡¡aiiiAAÁ½{÷ZMù™——÷ðáÃîÝ»»¹¹µ¿IÛË»¦ÜÜ\!i/A§«¯¯ÿ©÷wuuݵkWNNNff¦µµuÛn¢¬¬Œ³^“ÉäÌÌÌ>}ú 0àÏ?ÿD555ÉÊÊöíÛ—D"±onܸ±aÆ—/_òŽ—àýAaaa-¤ÛÅÅÅÙÙÙãÆ»~ýºŠŠ Á{?~!äîîιƒ ÐåA ÓYXXüõ×_Ý Ð eeåŸwsyyùß~ûíÀG oÛMÂÃÇ beeE§Óûöí‹4hРAƒBgΜyñâÅ¿ÿþ{òäIv"ˆ/^ÄÆÆòF9L&SWW755•àF§7nxyy=}úTMM³üÝ»w¿ýö[^^ÞÉ“'EãËÊÊ®]»&##ÓQ³fIN¤¡¡[gÁ²eËŽ;–PTTÄÎá ’›7oº»»#„œœœöíÛ÷úõk2™ìââ‚züø±»»;;ÝUcc£¼¼ü¦M›¸î@§ÓýüüŒŒŒ|}} þ7ùæÍ›µk×N:õøñã»víÂ…!!!ÙÙÙ‡rrrJHHhCÊÏãÇ3Œ¹sçþ‚ÿiP©Ô›7oþì§€vtÂèz РkêÓ§»»ûéÓ§:„áŠÊ××WWW—F£½zõÊÀÀÀßߟ=Žrá„>1™Åby{{Ož<ŸUÈéÝ»w4ø^}ûöÙÛÛÿþûïÊÊÊæææ;vì““kÛ„lMMÍùóçI$ÒêÕ«ÛÐ\$JJJÖÖÖâvd6àåèèØQûþ€˜ƒ@€.kÕªUçÏŸ¿råÊ–-[455EmÎN_RRB&“Oœ81xð`‹ðùóçU«Véèè „ÊÊÊêêê8sn#„êêê¾}û6dÈœo 5kÖX[[ãÀhæÌ™ææægÏž555µóœŽ?ÞÔÔdooo``ОûÑ·oß9ÁÐQ`×]–¦¦æÜ¹s™Lf`` ¨mß¾}{øða„Ðëׯ¥¤¤ššš´µµI$ÒÍ›7“““}z;£œÚÚÚ„І Ús€„‚@€®ì÷ß—––Žˆˆ(++©áóçϳ²²B®®®8§„žžÞðù:>|°²²â=–PCCãĉÄ—••uèС˜˜vÒ†Áƒ;::¶?i×Ñ£G§L™Ò΀ ¡ Р+yò$‰Dò÷÷oóM º¸7ÊÊÊFEEoÕ¯_?kkë=zddd :499!4}úôÅ‹㬙¡ÀÀ@ÎÝÚ/^¼Ø³g¨©ÈãââÌÌÌššš|||444úôéÓ­[7‰$--mnnþéÓ'¼ð¹m‚‚‚p O33³6ß Ñ Ð ‹ÓÒÒZ¸paKËÿcïÌã¡úÞ8~f3ÃX#’’L¡’T¤]©´ÈÖF¡½¨¨$*ZD)JÚ¤hOѦd/|[„²„’²•Ý0ûÜßçÕ¼ülmB÷ýG¯;÷ž{ι™¹÷sŸç9ÏÃ=tèÿgÙÚÚþøñ#66¶¢¢¢¼¼‹Åùòeß¾}Æ »qãFll,/.‡Ëå2Œ1cÆÄÇÇÃD;„Á`¼ÿ **š‘‘ñåË—üüü¢¢¢âââòòòêêêòòòoß¾}ÿþ.qïß¿÷÷÷Çb±û÷ïï\(((ýTè  ôœœœÈdrDD »ù#‚@\\<))IFF6®¬¬3fÌúõëÿ8ÚÚZ///777•ääd^…¬ž //FL ÞœC¥R¡§¥—cjjЦÒù@…N?¤¬¬lÛ¶m{(æÁƒ»Ïœ:ïÞ½{øð!ÌnÜX,ÖØØàïï÷ÒéôîÚµËÃêœôôt …âééÉÏæÏŸ?kÖ,&**Ú£*°k×..—kmm݉B]¤¼¼|ûöí³gÏð¸("""ÂÄÄ:ÿ¨Ðé‡444dggóÒç£ôN¬­­Ø}–L&8pÀÖÖvïÞ½‹-jßôàÁƒA¥R…„„tuu•••¹\îãÇ=<<Š‹‹ahNVVÖ’%Knݺ%++ÛNWÅÅÅ'Nœ˜8q¢••UbbbËJX=AHHHRR’´´ôßÊ#++ ³¡ôZ"##ÿöP*tú'd2YOOïoÏ¥=ÿ*¹jÕ*??¿>œ8q¢ýÀä·oßÊËËûøøÉäéÓ§_¾|ùáÇ$iíÚµ²²²P¬¨©©…††¶³Æª¡¡L&ggg8ÐÈÈ •Ãb±`‰uWWW´P9 J÷‚ Hcc#™L†i4—ËéͶ1Tè  ü+`0˜³gÏΛ7ïìÙ³«V­j§ÒçÎ;+**X,–¨¨hAAÁ¡C‡&Nœ())9|øpA\\\fÍš5oÞ¼¶TNcc£ÝëׯóòòæÏŸ?þü»¦Vpss+));v¬……… ÇEAé÷Àò½ÙÙÙ•••l6{Ê”)Ó¦MÃ`0, @ þö[]u…‚ò1a¸Ô|ûöííTo>þСC .ÔÖÖþòåKDD…BÑÐÐHKKSRRÒÑÑÑ××àp¸¦¾|ù2((°pá‚‚To __ßôôtyyù¥FDAAù#X,6&&&  6999ÖÖÖ½°Ü *tPPþ9LMMuuu FSVNNÎÙ³g ©T*‹ÅjllŒ‹‹«««Û±cGMM ·³³kYÁ*//ÏÎÎnÀ€%%%Á„·JqqñÑ£GçÎãUEAAé0ÌÛ·oÛo`nnþöí[^¹º^B7Ü•yÛ‚P©ÔÞv‘(((Íð÷÷0`@llì7àƒfm ‹Åª®®NHHPPPX½z5ïP\\œ¾¾~mm­ššZzzº€Ã[‚ ˆ••N·°°˜3gÎß J¿¤¾¾¾£ÞÞÞAAAjjj\.—W¦%ìÎÂáp8N'fÞÕUW‚„›7o–””üúõkäÈ‘&L?~<ø½¸´‹ý£  ô²²²¾¾¾+W®trrš1c…B>|¸ªªêÇ›µd³Ùׯ__¸p!‡C¤¡¡ATT4..nçΰàC­8L&³Û"Ÿ9r$==}È!ÇïbW(((­ÒŽÐ‘’’²··ŽŽ õóókµ ›ÍÆãñß¾}KJJêèÐD"qÙ²eûë’ÐA$33SOO¯ªªªé~ ‰õë×ïܹ“L&ÓétÐÌ©‚‚ò×Y°`™™ÙÝ»wW¯^O$MLLZÍq0qâÄÕ«WïܹÓÚÚÚÃãë`2™7nܸvíZbbbWúyõꕇ @ç  ôíD8§¨¨˜——§¦¦Ö¬Aqq±„„@JJª£`,+))I$?þÜNRŒözèÄ9‹õåË—9sæ4S9€ÚÚZeeåeË–¥¥¥¡*¥×2wîÜ¿™é®Õg«W¯NLLüòåK·ô†‚ÒiètzËB¼<>|8‹Å¢R©¶¶¶¾¾¾cccX¸ŠŠŠü¼´$%%¥g5¥“B‡Åbáñx*•ÚV%%¥„„ii骪ªïß¿·åWKHH˜>}zçæ Ñh æ_{ G®®®wîÜ™>}ú¼yóÞ¾}»uëÖcÇŽ-_¾<44ÔÁÁB¡XYY}øð!99ðÇ’à-a±X&Lè‰ðÿò¨-Õ‘Hd0K–,iÕF‹ÃáNŸ>-**ºuëÖÚÚÚ3gΈ‰‰ÙÛÛ×ÔÔxyy‰‹‹ïÝ»·ººÚÝÝ]\\ÜÕÕµªªjÿþý’’’•••ŽŽŽ æëׯ?~¼qãÆÒ¥Ky:Œ@ °X¬Ý»wŽ;öÙ³g666÷ïß3fÌË—/7lت¦¦–˜˜XVVf``0pàÀèèèÒÒÒ9sæ„¢¢" ««ËgFìoš^;üØt£C¼NZ6àb0Ÿ?æg>óæÍûúõkËýqqqð¡2cÆŒAƒñÓ J‚Åb§M›F"‘èt:Ücbb¢­­íîî~ðàÁ¦-ÝÝÝkjj$%%[íÇÄÄ$33“ÿq_¼xÑé9óè¤Ðáp8 £7$kkëêééÈËË·ÚæÛ·oÓ¦Mó÷÷oç•®-ôõõ‡*,,\__ ”ž ¸¸8((hãÆ{÷îp8œ 6x{{/Y²Ä××wÔ¨Q>„Z‡ÐÐP“NŒ«G5õ˜4Û´u¨©¡¢ÕN:4 …’ŸŸßê¡ÆÆF‡Ã3/‰‰‰Á»:t(\{%$$4vìX¸M"‘f̘ã‚EDD ………aèÞÑ£Gñx¼‘‘T ‡Ãmß¾}æÌ™rrrOOÏ5kÖÀ~üýýœœàR ™û÷ïÃmYYYOOÏuëÖ.^¼¨¯¯Ïd2›Ê”¦j¦éþNü:A~~þòåËùiiggýôéS333øßUXXÇk°iÓ¦žš% JG€¹©‚‚‚ÒÓÓSSS¹yófiii³u  FEE¥mPRRÒª¸o 6›Ýé9óè|ŒßÞ¹222§°°ðåË—Ó¦MSQQiz”ËåÖ××0 ¶¶–5îBBBRRR ÕÕÕíO¥£dff®[·îùóçŸ>}BdÉ’%p?‡322JHH¨¬¬,**Z·nÏ­§§Ú‰±„„„ÒÒÒºmêÿO3IÔR5ûH§Ó§OŸ^SS£¢¢¢¥¥ûóçO^o¼l§Ð–·EEE·lÙ·Éd2T‘•+WÂmaaaSSS¸½|ùòÈÈHwww—}ûö™››ãñx ++Ë»HHHL™2n„Q£FÁm<¯¬¬ ·?þlccÃáp¶oßÎûõEŒŒŒ„……Ÿ>}jjjº}ûögÏžåääÄÅʼnÄÈÈH{{{˜5äùóç<¿êܹs I$Ò½{÷0ÌŠ+h4š²²òÓ§OïÞ½{ðàA‡ BvvvQQQðtkkk˜8`êÔ©©©©Â–––;vì˜øCéë0™Ìïß¿›˜˜@·ƒa±X‹-âx “'O|í—?ÒIG2‰D†«ÅZEBB‚Ãáxyy­Y³¦e6&“)..^^^^QQAí8x<žÅb 4¨å‚/”.RRRR[[[]]­¨¨à½^#/***%%¥¨¨øêÕ+^Àillì_›nÛ`±X•„‘H„?[QQQ111qqq IIÉHKK+((ÄÆÆŠˆˆ|úô©¾¾>''çÚµk°žCwU$Æb±‹/Ž‹‹;zô¨¿¿¿’’’ŸŸ‹íM·°°ÐÐа±±qÉ’%ý¦ÔÃùóçþüYSS£¥¥uóæÍAƒihhØØØ´\ˆkeeE"‘ ÌŸÆ`0„……­¬¬ZZZ¼2€©©)ït› Þ¼yc`` ©©yþüùK—. êúPú6,KHH(%%e×®]¯_¿Æ`0yyyòòò ÍZòÞRz4‡À÷…ÚÚÚ¦û½¼¼LLL*++µµµ“““544^¼x1zôè?6]¯Á`Ølö¹sçddd:1º™™ÙàÁƒ:7yAAAð·êïïWH¡P(ÞÞÞ©©©ÊÊÊ)))YYYNNNaÛ¶m†††Ó§OÏÉÉy÷îÝ_¾Œn‚B¡¼|ùRWW7,,lëÖ­/^466Žˆˆ¸~ýz÷4kÖ¬Y³f½{÷ÎÛÛ»±±‘¡óíÛ7CCÃŠŠŠéÓ§C‘Ô½û[ð fêÔ©€!C†ØÛÛ?{ö,&&¦iË5kÖ¨©©mÚ´ÉÒÒ‹Å _¾|Y[[@¡PŒŒŒ  §§Çápà醆†$)::ÚÞÞÞÆÆ`kkëïï¿iÓ&4ýJûÀì5·nÝ‚¹ÑÏ;wñâÅ 6DDDÌ;—ª+%%µiÓ¦-[¶p¹ÜÞöÃì’ßGII)''‡÷qÆŒŽŽŽŸ? ÉÉÉ ðæÍ"‘ØÖÒ‹]¼xqË/Ò¾}ûp8œ££ãéÓ§+**¬­­a-—Þ™š¼óB§±±ÑÎÎŽD"UUUEEEY[[kkkïÛ·¯©ÊÀ…åmYG™Lfyy9ÿƒÖÔÔtzÂ((ÝÈ?îß¿Ïf³©Têãǵ´´º%ÓL/AWW÷þýû+W®|ôèQMMMppðßoß¾]±bEmmí´iÓBBBúʉˆˆ€ž¦€€€‘#GZXX𢃃ƒƒ¿ÿÍþþþâââjjj‹/vuu »t郙;w®Ï÷ïßÅÅÅá×cÇŽ)**~úô &>ÈÌÌäÅ2»»»ggg×ÕÕÅÄĬY³¦ßüO¢t;………‚,\¸°­uOûöí=z´‡ÃIJJêÑ9Î ŠŠ yyy[[Û’’¸ŒþéÓ§<ëÙ³gÃR^]š& J/#==ýâÅ‹GXXXWW×ÕÕõoϨ›™>}zDDÄÒ¥Kÿûï?h»mgñArÿþ}[[[&“9þüÀÀÀþt39uêÔ·oß·oß–’’211á½ÀCà·_uüøñ‹/†I)étzii)ÌB ³´´TWWWWW?t蟟_||<™LVQQÉÍÍMMM]´hìÊÐÐðÙ³ggݺu{öìø£ô”””6oÞÜÎên‡cff–žž®  Ð›Uè´Ða2™$iïÞ½$éàÁƒT*ÕÃÃãøñã-WÏëèè0ŒþtoBAÿïºê¯hhhÄÅÅ-Y²$''GUUõÎ;zzz‚œƒÁpvv¾zõ*`Û¶mîîîýl9tÓ”9|j–}ÆA6ÅÊÊ .Âj•;vtº`Ê¿Cff¦´´ôW!444˜˜˜¼}û6''®ÐìtØõoTWWkii:uÊÃÃc„ •••îîîæææ¼fx<ÞÖÖöåË—²²²¨u¥¢¨¨øßÿééé1Œ¥K—îÞ½»é=;Ç—/_&MštõêU<éÒ%X;B0C÷?"""`ª§€€˜P¥ÆŽûàÁ~~ì999¶¶¶£GîÍ…ž:fh)**RTT¼}ûöÖ­[ëêêàΜœØØØ[·nÕ×ׇ‡‡S(”W¯^ÉË˳X,&“Ù Ó¡  ð‰˜˜ØƒNŸ>íááqåÊ•ÿþûïÆêêê=7"—Ëõòòòööf³ÙÒÒÒ!!!=7Ü¿€ ÷ 5jT׋³¢ôo0ÌÿýÇgãëׯ¯Y³FGG‡Ÿå“ááá-k›·Ã Aƒ`à/ƒ±²²b³Ù8®£ï<:yyy#FŒX¼xqDDD³CåååsçÎ}ûöm`` žž^xx¸´´4è¾>>ööö½07" J·0räÈèèè—/_zyy½~ýúÞ½{÷îÝ›8q¢¹¹¹‰‰ Ÿ ILL nll`±Ø%K–;vŒÏÁ½*•þ·gÒ0 ü;¼y󦣧„……¹¹¹!Òª_éýû÷ššš_¾|ihh(..æŽh‰¼¼¼‚‚BÓ=ß¾}›9sfaaaPPЙ3g,«C1| ‡ƒÃáîÝ»ÇOã={öÌž=[MMD"ñ?Nƒ.éj•²²²Í›7ÿíY ´G_¿ÏΜ9sæÌ™ùùùgΜ JMMMMMuttÔÐÐÐÑÑ:t¨œœœ’’’ŒŒŒˆˆ›Í®««+))©¨¨(++KMM‡ú0tèP{{{ ‹þñs…ë3þöDPÚÃÀÀ]ÇרTÒÒÒ:zbFFFQQ•J…ëÌY,VCC‡ûö훊ŠÊ!C|}}GŒ1nܸ¸¸8[[ÛV V:884 –÷ööÖÔÔ$%%!9eÊqqqþo| ¬¬,"‘XZZÊOc‹µaÆ””ƒñÇõVÓ¦Mk–I¹}š^…BQPP@¿©-‘——‡©GPz3›6mêß^ …röìÙãÇß¼y311ñÅ‹™™™™™™üœ;räH--­+VÌš5«‡§)Pääänݺõ·g‚Òh4ƒÁèDAIA.^¼èááñðáÃ7oÞMŸ>ýÇ0yóæÍóæÍÛºu+l{†ÆÑØØXXjPEEeéÒ¥Ož›ž “É ý¦’" J?ƒÁ¨©©©©©ñö¤¤¤èëë7®ßxGAéÇ 2äîÝ»;—ÉdÚØØ¼|ùòÂ… ÇŽãr¹JJJaaa¼£BBBL&A¬¬, 999"‘8`À #))©   ,, ½TL&óãÇcǎݼy³““@DD„ÅbÑét!!!"‘H$…„„h4?BçÏñ°ðx³¼ã$11±²²²-/5ô@á; “ÉÄb±EEEgÏžíЬPPP ¼´UÖ¥·ñóçÏNŸ›pùòeSSÓ·oß:”L&?xð 55•N§WTT}þü9!!ANN.,,lüøñuuubbbƒ ÊÍÍ¥Óé¯_¿~÷î@HHH^^> `êÔ©+V¬`±X4@ H¤äääÍ›7ÃÒR|zÿÿlÑINN–““ëP$ €ÍfGFFš™™µz®ÉBäÉ“'bbbeeem¥JÄ`03fÌhº§²²RIIIXXØÉÉ .@E„N§÷Dî2”.…º¥¯ðÇåÕí³gÏ##£ÆÆÆáÇiié>Œ;6==}âĉ0!áĉóòò¦M›Æd2#""LLLàé~~~'N,//—‘‘™2eÊš5kRSSG-:aêÔ©¼%|&ñús#MMÍÈÈÈN\mXXXSïÕ? ðýûwiii™øøø¢¢¢µk×ètº««k«£„fuËËËÓÒÒ¬­­ÍÍÍëëëŸ?nhhH£ÑP­ƒ‚ÒÛ€pP‹ J_¡‹B§ººz×®]·oßnlläp8Lj‹‹3ŒÑ£GÓh4 …[JKKà ›¦«Í•””Éd2N6l‡Ã=z4|¸7‹‚ÅÅù™ÒŸ…™LîÄJ3@xxxqq1‡óòò’——‡Ö§ŠŠŠÂÂÂ7oÞ¸»»ÿþ¶$‘H›7o>~ü8?Ý:nœ={ÖØØXLLìéÓ§¹¹¹Ð‡‚‚Ò«€Bµè  ô:T‹ªUîܹ³víZ===‹Åf³›Åb±8ŽÁ`ˆˆˆ`±ØŒŒ ÞÑáÇÂVàw” / §Ùzòn^^Þ9¡C£Ñ6oÞ¡ªªjcc“’’rïÞ½ââb//¯òòr.—ëîîîëë KII=yòDAA¡  @EEåÓ§O²²²,«¾¾žB¡À2[_¿~•ÈÈȘ7ož††F\\ÌÏáááQZZJ¥R‰D"Z] ¥WÆè  ô-º%íÅ–-[²²²„……¡†×gjjêĉp…æ˜1c.^¼X^^Àãñ666ÊÊʧ{—dþAèÀÜAéééë=22òþýû›6mJNNVTT¬X±bÅŠMÛü÷ßãÆc2™\.wèСeeeªªªJJJ8ŽÍfKHH`0 X/¾¡¡áÖ­[[·nÍÌÌ„1 ŒM&¨ÊAAém B¥O€  ‚ÏÖ.’ŸŸ?`À€eË–ÙÛÛO˜0·_QQÑÓÓóñãÇÉÉÉ222iii—.]Ò××WRRRVV–’’¢ÓéÝžxâB‡Íf„ŽF"7eÇŽúúúêêê§²²200ÐÊʪ¾¾^FF&55uìØ±™™™#GŽ>|xvvöøñã‰Dâ÷ïßq8ÜÏŸ?óòò,--ñx<@?~ü„ îÝ»Çf³¡ôa±X"""'NœPQQéôbu”ž:((½‹…Çã±X,•JÕ××ï–>étz`` LôG$yýúuJJ /Ô¦¢¢BYYùéÓ§K—.mll„û{"½Ö„—Ë…«Þ;=@ii©³³³¯¯/ Æb±óçÏ®¨¨¨ªªRTT¬¬¬?~|~~þرcóòò`ö5kÖ$%%ÄÅÅ×®]K¥R9NIIITTÔ AƒÀoM8LJ¹äÛª²‚‚ò·@… Jï‡ÉdR©Ô 6„„„P(]]Ý/^tKÏeee¼•–°ÙìøøøÙ³gãñøž«ó‡A.—ÛÅlÀÅ‹“““ill$‘HÆ  :TFFFNNNAA‡Ã©¨¨0 …Õ¯@<¬†J p8ÜСC………Y,‡Ãi¶¨ ƒÁÐétTå  ô6Ð`d”Þ™L†n£K—.„ÐÐÐ𓋯+èèè¼xñÂÝݽ¦¦¦G#O!t¸\®Ð»wï q¬BBBÃáÀê¡[¶láUÁà•}‡-avË·Caaa4< J/µè  ô ¸\îòåË·lÙâââ"&&æææF£Ñ gÏžÝíc1âÞ½{IIIZZZGRR²Gí: ¦[¬I§Nš9s&‰Djllù 4Õ áñøØØX‘‚‚‚Çó”••÷íÛ ‰MÛw}>(((‚µè  ô h4š©©)@ððð:tèš5knܸ1dÈøøø   iiiþ»ÂápsçÎmõ2™ìéé™——·dÉe+€gz›wA¨Tª°°°¸¸8\0ÕEöìÙ³`ÁOOO)))ÞN óìÙ3###!!¡eË–™šš><=þIÅõ IDAT=ýýû÷0W´¶¶6\o…‚‚ÒA-:((}2™,))9wî\@IIÉÍ›7×­['++{ëÖ-ssó .ðß•··÷³gÏ~ýúáææ6sæL ¥¥åîî^UUåää½7=”ÓŒ6ƒ‘1¿ADWW÷Ö­[],&&&&&&**JEE…H$æçç¿{÷îׯ_¼aaa³fÍŠ­­­•””„åIÑ[$ Jß:((}è½jZ¥ ªªjõêÕ0+Þ‰'`!ª?RUUð÷÷_¼xñ¢E‹8• !!aÊ”)¾!´gOööö†AÄ...Ý8ä‹/Ο?ÕTå@233?|ø ªª*&&†æÅAAéë B¥¯@£ÑLLLZZ<Èb±Ž9Âg?¥¥¥€!C†¨¨¨lݺõáÇ{öì3fŒ¥¥%‚ Ín‡J¥òV˜w;m *•ºbÅ CCÃŠŠ •¤¤¤3fô¨£]TTôСC%%%'Nä…é   ôiД¾ô^Í›7¯Ùþòòr˜ÖOSS“Ÿ~BCCi4šàóçÏ~~~fff^^^999ß¾}£P(“'O622Úºuëáǃƒƒsrr  Þ1º—6ï>"""jjjƒ š0aBJJÊäÉ“_¾|É`0"##»?k!occóùógWW׬¬,¯) JŸµè  ô! ÷ªåþS§Nq8GGG~:ùùóç­[· FŒÑò(N/((xóæMXX˜ŸŸŸ«««¥¥¥ŽŽŽˆˆÈ´iÓ¸\.Fëêeü?m ø¶bÅŠâââiÓ¦éèèìܹ3**jáÂ…T*ÕÖÖ¶CÃhjjNŸ>½ÕõcÛ¶m+//÷óó«««L™2¥ƒ—€‚‚Ò{A… J‚N§·ê½úúõëƒV¬XÁËùÒ>^^^€ŽÛNLL¼rå ¬UÞ´gO†Þ+›Í~ûöí™3gŒŒŒÆ—““söìÙI“&ñ9‘HLOOõê“É|ôè‘­­­ššš¨¨è®]»Š‹‹ÏŸ?Ïf³QQQé† BAAéM B¥!"""!!Ñj///<oooÏO?ùùùáááVVVrrrš@jjj‡ÚóC{BGDDDUUuìØ±MwfffΛ7N§Ÿ?žÏ1 F}}}vvvJJŠ‘‘ѹsçrssëëë½½½Édò‹/deeѤÆ((ý(tД¾‡ÃiÕ{•žžþßÿ­]»–L&óÓ¯¯/‰D200èÐèT*µCíù¡½»Ï{ÕlyyùñãǵµµçÏŸÏç0¥¥¥D"qêÔ©BBBÓ§Owuu½r劬¬lZZZËö§¾¾¾Ûu(((.£@… J_Á`˜˜˜´ZÿÁÏÏO\\|åÊ•üô“™™ >|x‡Fï ¡ó‡¢žÐ{uàÀfûÏ;çäääääÃÏ0·oß>|øðœ9sâââ^¿~ýúõkÞ¡]»v:tHVVvàÀ²²²rrrÊÊÊ#GŽ9rä¨Q£=Q´åÐh´›7ovoŸ:::|í£ôP×Õ?‚ L&³{û$¨P$"""}}ý°°°f‡?~\^^nccsùòå?öS^^Ž ¬ÃÝ  --]VVÖòPCCC§fÝ:d2YEEECCJ3ÕÕÕþþþöööZZZüdºpáÂÞ½{wíÚ×òh}}}}}}~~~³ýX,öæÍ›ì¥Û¡R©{÷îíÞ>‰Dbhh¨ŽŽN÷v+Ølv³R²(ü€ ŠÂ &toŸsçÎ ìé“(MÞ«–B‡Åb]¹rÅÙÙ™ŸG¿ºº:ƒÉËËãíÁápÛ·oß¶m›¢¢"FûüùsppðÉ“'›žõ,:0tfÅŠÍ„àôéÓ¶¶¶NNN-}[-©¨¨¸qㆵµõ˜1c>|øÀçä¸\®­­íÒ¥K}רƒ Hzzz·ÿø‰DZ¶lY×û©­­ c0K—.}øða¯Ò:l6»  àÍüüüf̘1{öì¦5LPþ*tÚ'::Z__¿ŸY,º«H"´ÅÆÆ®^½úæÍ›}Tëdgg9²oMžÁ`‰Ä–U½öîÝkmmýG¡W,¥¤¤ÔÕÕ=<kÖ¬»wï ¬DK?àŸ:%%%Çÿc³„„Ÿ£Gjii `V‚aÈ!OŸ>íz?YYY+V¬ÀãñOŸ>íZçøñã-¥@3òóó+**¶nݺxñbÁ̪ë@ïÕüùóŸ|xeeeïÔ:aaaõõõü´>>ׯ_§Ñh;wîôôôf³Ù8®e͇? ÇNðg¡½WË—/o)trss“““×®]»ÿ~~&—­¯¯/!!Ѿ lFOè»îÅÀÀV|mAvíÚÈÍÍ533;|øp«) þŽ;è…ZGRR288¸>>>wïÞÅáp999ººº§OŸæÇiÛÓTWWÿþÏt¥(mqüøñšššžèYVVvãÆí4xüøqNNNee¥©©éž={vïÞÝçì¾= ‰DºvíÚºuëz§ÖìÚµ«)¥¥¥ÅÄİX¬cÇŽ½{÷îðá⢢‚œ^ç€Þ+‰D§Ó›Šˆˆ(..¶¶¶nGè «««™ššFDDLš4ÉÕÕÕØØƒÁ@ ,,Œ HK¡ÓÖ_¾‚+©Tª™™YKïàâŋׯ__ºté;wþØOEE@NN®¥ÐY´hQÓŠ©ÍFïå¿üaƵ“Ðþ!1̸qãÞ¿¿{÷n333GGÇÓýÃáz­Öá‡M›6FGG[[[¿zõêĉ=zLBBBOOïïΡ¯ãçç×C=‹‰‰µÓàÝ»w999Ó§OOLL}•Þ¬u-ZÔŽváp8111£GÎÏÏöìY^^Þ‰'F-Èvž÷*44´Ù!6›àêê:uêÔÄÄÄVO?~<?yò$õꕎŽƒÁ¸qãÆ©S§¢££ÛYØÑ{¾z1bD« ƒïÝ»WSScmmÍO?êêê4íëׯ¼=£FŠŽŽ®ªªŠˆˆøõëWzz:ôä5…J¥öÿÅ‹ ÂÝ»w­¬¬ŠŠŠþöŒþPë644,]ºôÍ›7{F@XXØÕÕÕÅÅ…H$Ι3çóçÏ{R(}}}ý³gÏ0àÅ‹S¦LyùòåßžQ¯j@­ÓŽEMMíÎ;jjjß¿·²² úÛ3ú3me\¸pAssó¶Î…‘È...÷ïß7n‡Ã™7oÞúõë³³³ ¡§ƒÁƢ×Р«Õ ¦Ñhׯ_Ÿ9s&?útÒ¤Iïß¿g±X"""{öì)((øðáÃüùó1LII ‰DÒÔÔlù~L¥R ?óìý,]ºôòåËC† n¬n‰×ë‹ôi­044¼zõê°aàëÞ½{{F(}--­[·niiiA7–——WO”qîÓôu­£  °lÙ2èÆrppèå ÃÈȨU£õ¯_¿˜L¦¸¸x[çN:•F£III!B"‘p8ܯ_¿à¡·oßòr+³Ùìf'þ5‹øí½jõ¿¿?‚ 4ê 0€B¡TTT¼zõª¢¢âøñã ¸téÒ”)SV®\I§ÓÛråô‹DUUõÆzzz »wï>zôh·ç×굯øÍÊ•+ %%% aÕú>…B¹~ýú‚ h4šµµµ]KO6 J‡––>{öìúõëÇŽ[²d ïÙð/S]]ýð7YYYd2ùéÓ§K—.ísZ‡@ ìÞ½ÛÃÃCTTôÙ³gfff999{Rm""""&&¶`Á‚Vr8œ¶ÍBBBóçÏGDDD¤e}§ ÿv½K興ˆP(”ñãÇ·<”››ûêÕ++++èÒk --- chh8uêÔ„„„U«V 6ìÍ›7QQQJJJðòZ²úŸ “Éÿ ‹N§gý?0”Åb={öìoϮàn,”n‹ÅnÞ¼uc5åÇû›pîÜ9˜<÷õë×üĆöBôôônܸÑ'ÜXíx¯¸\n[BG___\\¼-I˜˜hggÏm)tþZ02hâ½JOOoyôâÅ‹wîÜY±bÅõë×ÛêzìNŸ>}êÔ)*•jcc“——7hРÊÊJ.—‹ÅbÛ:ýɜӔ¥K—ª««»¸¸ü «±ÚòïܹsçñãÇžO7bhh8zôhggç^µ ¥OÝX‡z÷îÝ¿¼KJJ &ŒmIFFÆ—/_X,–€§Ô]@7Ö™3g}jÚ¬eü]µè@þY7V?uc¡t;¨ë_ ÷»± a†Ëå>ÜÛÛ»¸¸844ÔÔÔAøtÆ`0ZZZ7n¼xñbIIÉäÉ“¹\n³Ðœ?~4ëVRRÒÉÉ ºzjjj0Xû10£B‡—9°Õ£° „¤¤d«G)Ê Aƒ† rX,öçÏŸPñedd°X,^ LÿSì¿èj¬þº ¥ÛAWcõ{úÄj,,‹Çã¡Óé . ‘––VUU‰‰a³Ù)))ÖÖÖðE÷Ôf±XÐBãíí}éÒ%uuõM›6ååå±Ù줤$/© Êî¡ïvÇ4D;k¯Ú¯hchhÀb±-³<Ñéô˜˜!!!¨{šÔ>7n܈‰‰i-Ô£üË«±úèj,”n]Õïéý«± ý¦  €F£‡C¥R)ÊðáÃW¯^…ÍTUUá¬å‰Ãáâãã-,,^¼x±aƬ¬,UUU^pUvv6ÜHOO:t(üøå˃ÑKê:&tÈdòðáÃ'NœØòPûBÇ¢_¦™™Ù;w Å¨U¡#`ÍQPPàèè¸råJ(9êÆê n,”nucý ôZ7‚  ¦¼¼œB¡@OÖçÏŸaæ—#F`±ØçϟÖl6»ºº0lØ0///)))mm톆†¦ò€D"%''—••%''óvþøñcÒ¤I‡ªªªâ­O­-Qê(: ¦±±ñÎ;;wî0`@ÓCísss---)))Þaa᪪*ÞÇÆÆF €ººú´iÓtuuçÎ 8ëÖ­ëÐ$»›999ÖÖÖP„ rt¹±¾~ý Wiö{bbb®^½*` Yw¹±ú\¦Á»zƒ«ï.têµµµ-£)z”Þ鯂ˆïß¿„……Y,–ššÚׯ_322šÅâàñø>lܸñèÑ£&&&>>>Ó¦M8pà¢E‹šõ©££sÿþýf_`ƒáææ¦££#$$$$$4bĈ¬¬¬®?§:þ"$$4|øpŸòòòGôÅð?¢e ¶Áõë×‹ŠŠx‡ —ËÝ·o_³–ÒÒÒ~~~±±±¯_¿~ñâÅ´iÓ<==uuu[†5õ4ð—lffF&“SRR,--wîÜYPP ° Æ•““3bÄgggBß©¨¨ppp7nœŸŸ_O„ô·E·¸±vîÜéææöHÒ¾…»»»““ OݵtéÒ´´4Aú·(**š5kÖ¥K—ø,QÞ-ØbooßþS€@ |ûö FÃl6{Ê”)•••=‚mêëëýüüæÌ™{ìØ±3gÎHJJBcLK•À`0¼sÛ¢¬¬LLL¬ëO¨ <• ‡Ã100xüøqYYÙ©S§( ømÑÑÒÒ233suu ÿñ㇢¢"¯AÊÊÊšUuÀb±âââ666,Y²D[[;""¢ªªŠÃáL›6­¶¶–w+ÏÌÌ3fLNNNÏÈÈÈÍÍ-((øñãÇÏŸ?kjj{΢…ޤ¤$ÌÖ°mÛ6<ÿøñcCCC///èƒ=êÆ‚ÿÕRRR4íÂ… ãÆÛ¿¿”;<ý=bÄˆŠŠ 777 cÇŽ ìïØ7̲UVV¶eË–¹sç¾{÷®'6gΜ¿QWW_¿~}ËU (mS%±ÙìY³f™˜˜ð"ÀßrcÁ/‚ ÑÑѳfÍZ½zunn®Æý+Àç´•Jõ÷÷_¸p¡OÓ¸‹E0n,è¡R©GUVVöððøã(§¶¶ƒÁ¼}ûöÚµkD"ÑÍÍmõêÕ666pqx³44“&M222jÖ ‚ p›L&ïÝ»÷äÉ“W¯^}üøñË—/sss‹‹‹µµµÁï¿BWè¼±$//OMM-11qñâÅ0ï!“É?~<¼KII±ÙìQ£FÁÆL&“Åb‘ÉdIIÉC‡}øðáÞ½{AAA09´ç×××7Í©³víÚ>=zƒÁÐh´œœ “’’rõêUžê„˸ 3·ùôéSiiiPPá7BBB¼m<›Z>ìy Ä tþüù]»v-##xöìÙúõëÏ;‡ ˆ˜˜XûƒÂÇëëׯ]]]Ùl¶®®®A_¿~UUU)((°Ùìîòçt²—ŠŠ %%¥_¿~VUU‘É䤤¤)S¦Nš4É××WKK Ö5MNNž|xúôé»w„ˆˆˆð251™L&“©¦¦†Á`à“òpF«`0MMÍG¥§§>|øÉ“'çλzõêªU«pi<`.—ûGÕÒé!x¿ç9sæäææNš4‰J¥ž={ÖÏϯû®£=  ‹ÅFFF†……………5k@&“yºGBBn,--mmm?îíí}ïÞ½ððp{{{[[Û.NÉØØ˜H$ÆÆÆÚØØ 6LMMmÿþýååårrr€—/_ž={öÇ¢¢¢ºººöööM3‚ÞºuëæÍ›EEEG^^~Ö¬Yîîî?~L:555UXXØÒÒrÇŽð+Çår¯\¹rûöíÒÒR;;;XödöìÙß¿×ÓÓ{ûö-N×ÐÐ8|ø0ï5©­±þ8ÃÎÁåri4Ng0Íþmö. •””}b0ááá[ƒ6xðàñãÇçåå±X¬²²²²²².v—9ó€æÙ³g'&&†……-_¾üû÷ï›7oö÷÷ðବ¬°°ð«W¯ÜÜÜŠ‹‹Ož¼333ÏŸ?ÿöí[؃ÁTUUuKd4\‹ŠŠž>}~ó}||$$$¦OŸ––ž1cFDDÄýû÷×®] ~›!‰‹/†\CCC‰mooÅ­­­¿¿ÿ¦M›ÊÊÊ‚‚‚6nܸwï^‡ÃÙ°aƒ··÷’%K¦M›xíÚµ)S¦444JKK‡ ÒÎXíϰ£ð^à]…D"‰Ä¦ÿ Ü.((ˆ…BçãÇÎÎÎ=BDFFÆÁÁaÊ”)³fÍêÊ…O¾|ùâìì\TTM†S¦Lij«àÙ0ZÝÙ ¸6kÕøÁápÒÒÒžyòäòåËyÕî’““á$ß¼yC$%%%aމ¸¸8‚ ñññ¢¢¢MS‰¶J[cµ?ÃÁ`$$$`ÊWþ‚ìÙ³g<¿víÚ½{÷vâ•£sÐh´ãÇÇÄÄV¯^íéé)˜o54o„††0ŒÁîÝ»5550´ào•¥¥¥ðkfnn¾nݺ¶J:v;‚ܹsÇÏÏÍfkjjzyy 4¨ÛG¾ÚsçÎÁûöí[±b‹µ··?}ú´žž^ZZš††ÆÇØŽÊHJJ–””DEEYZZêéé=|øÃá@ Y·OžOº*tRRR´µµG}äÈ‘¨¨(h—öõõݱcÇŒ3ÌÍÍ_¾|ùG»iÓ&hô&nnnŠŠŠ‚TTTTUU <ÖSÂZttuuáÆøñã7lØ0cÆ Aþš¹«<<<š¹íºt`©¨¨8::šššöK‰Áãñ’’’¶¶¶ÖÖÖ}˜u~ÜUí…`Ĉ›6mZµjU÷Î?""šâoݺåäätâĉU«VíØ±cÅŠ¶¶¶ .ÔÕÕÅãñùùùYYY666›6m<{öìäÉ“‘‘‘ªªª ãÓ§O¢¢¢MÍœîîîÙÙÙuuu111kÖ¬¢P(ÞÞÞ©©©ÊÊÊ)))YYYNNNá¿ÿþ\½zÕÂÂB^^J¸<­±ÚŸ¡€ÂƒÁ,^¼øàÁƒ°¦ðø_{wÕþ?ü=c˾e)²¤kÍv¯¤«(ärËm{¨(I õ%K–HnйBʤÜ"•¤HÒ"ËÜè]·åVŸ¤R¡h¡7û6¿?ÞŸßy̧YgÆx=ÿ:ΜyŸ÷™9ÎyÍûõ>ï7cºŠJ¥2›ky4à@‡L&ÿòË/~~~:::,Û5ëák¾€€€½½ýúõëGü"ÜÆtÕÚµk===GiH9¢SÚÌ™3ƒƒƒ.\HÜé´´´²²²/^üñãG:>ði“'O®¬¬LOOß²e‹ŽŽNYY™¸¸øˆw1¸¡pwïÞ544œ6mZhhhJJЧ§'nWÇYª‡=ßlvý’ººú­[·:$//èÐ¡ØØØ‘«ò  %ÐÁÝ‹”””vìØñûï¿;88ܼySZZúÊ•+ ,ÀÛèëëýöÛoT*uÑ¢E§NjkkÃC 1óY»++“ Ÿéëë[°`‹‹ [þ“Y®ÂpÇÏñ€õ¿$†“®bdjjŠ;ÛŽ’«W¯~¶fïÞ½{÷îÅË666666_}ã¢E‹ú*ÆËË+::ú³•¼¼¼îîîîî/((`üó³ÙåúÙW?5d###9Ä®t£5kÖ ­»÷X$//¿}ûvVî‘5é*F~~~x°†ÏªÑÞÞ.$$ÔÝÝ=äslÆŒùùù!!!lRrpÎÇutt&Mš‡ÇãKKKQfnn~þüy///YYY33³³gϪ««÷öö²~J‡ÁJKKcY¢ ÒU`´ ?]ňYí¡¹rå >öÄÄDGGGÖ 4Å.,2ؘ®bÄõ ÀlIJt#bxbF$iÞ¼ygΜ©¯¯ÎObÜJÄÊx¿j "ž¥]ZZÚÏÏïðáà §OŸ^¸pacc#NgÖuféÒ¥ÝÝÝ'N´²²ÂChgggã§ã8[¢Ö¤«À¨‘tÕ˜FäÂΜ9£¥¥ÅÝ+±7]X€•éªþáþ'Ó¦M“——æì¼¼¼×¯_ïèè˜;wîÀŸgq tÚÚÚ:::ÄÄÄÂÂÂð¬ÝÝÝßlràããÃc&≢¼½½ýýý_½z5üL¹ ËÒU`ôŒTºjLû2†‰ÒU`T±>]Õ?ÜŒ”ššÚÖÖ6œéÞÞ^ ‹˜˜VvžûÒ@^^^‘M›6ýöÛoâââ¹¹¹¶¶¶|/1fbQQ‘ÍãÇ;†›ˆ†Zmîé*.0²é*’®£‡-éªê¿[í7á'ySSS—-[ö÷ßãéÍÙb (™L>tèÐÓ§OÅÅÅå`xÌÄ)S¦”––ÚÚÚ¾~ýºººÚÔÔtðæ*®â®£ÒU\sÒU£äÑ£GË—/ÿçŸØå :—/_¶³³ûô铨¨èpæ§0a‚  `YYYSS' Í^®â®£ÒU\ÓÒU£wCþþûïÙ[:fff¹¹¹'NœHOOæþºººÄÅÅåääX0?Ç‚t€t%®âzœœ®âJúpÅÅÅùùù/^<̵··÷ôôÄÆÆz{{³±6{AºŠ @º ŒHWq=®OWq :ÅÅÅøixüÔÙw&((˜””´cÇŽ-[¶àùχ\Ôé*.é*0 ]ÅõÆIºŠ 4uõß­‡×¼V[[kgggjjÊÃÃÃÅ3+1“骱îôéÓõõõÒU`D=þüèÑ£®âbÍÍÍ[·ný믿 ]Åz,ý §L™ÒÓÓ£  ÐÝÝÍM©«æææW¯^õ¿ N?v줫8Vkk+1õÁWÝ»w!T__é*0pt:½«««Ÿ z{{BÉÉÉ!HWQÝÝÝxè¯Â_1žçÒUlÁꈒ+cØÔÔÔÔÔÔoné*NÖÑÑqîܹoné*0(UUU¼«Aºjìàx+®b. ;XIBBBQQq [*))íÙ³GBBb´«KTTôËé'¿ŠL&¯Y³†Ó‚õžžžÆÆFv×blëééñ2I$’€€À@¶Œ‰‰Yºtéˆ×Œ6>>¾v6uttôòò‡}68g]²Çœµk×r÷D¾===÷ïßÕ]444Œjùß$((¸aÃöÖaÈøøøjkkþùgvWdÌñøUKKëíÛ·#[&à4þù'»«¾ ПææfèŒÂÉŒŒŒž={ÆîZð?Þ¾};üáHúÇöH` @|///+» sŽ\çèîî~òä »kÀA ¾NRRò?þ`w-c‰‚‚BII Ëv{Á@@ `dðóóëèè°»üÍ\ p-tÀµ Ð×bÚ988˜F£™šš’H¤ÞÞ^ …"**ÊÊš}),,,$$do¤Óéééé§OŸ®««›8q¢œœœ’’…Bñ\UUÕ† òóó¿œóKOOoÕªUÛ¶mcA5®]»6sæLü-‡„„ˆˆˆ°`¿ýˆŽŽö÷÷~9zzzµµµxYHHhΜ9ûöí›     ¥¥!D&“ÃÂÂÄÅÅRùOŸ>%''ûûûã~úé' ‰÷ïß#„ššš¢££¯]»& °dÉ’Í›7óññY[[¿}ûÖÀÀ ¼¼\ZZ:00ÐÒÒ!Äl}__߉'Ξ=ûîÝ»)S¦ØÛÛ¯Zµ ï—ÿ矶··+((´¶¶fee‰‹‹/Z´¨ºº!djjŠRRRÊÎÎFÕ××ÿòË/ííí¡ÒÒR"ˆî¿ž<àããËÎÎ^¸pá@>fdeeñ®BíííÑÑÑmmmøÛ &féÚ¿ÿëׯétº¨¨è³gϦM›&%%õÏ?ÿ?~¼½½}×®]õõõÇᅵâââK—.áo¹»»{ÿþýxû;wßrpp°˜˜ØÐÏ»immÏ“‰'®Y³¦³³“ïÀÇŽ«¯¯WQQY·n››~Kcc£¯¯o~~>ŽŽÎÍ›7%%%W®\ÙÓÓSSS“A§ÓkjjDEE™•ƒ ?yòä»wïdddxxxîÝ»' `llüôéS„ŠŠ BhêÔ©wîÜÚÑN0ϱ\%¾úß½k×®gÏžihh455ñððÈËË{{{“H$\•J­««C)**zyyxïÞ=æææM›62+¿Ÿú $¹ûõ®XYY©­­ýñãGžI“&ßxTTÔË—/BJJJxåŽ;nß¾=eÊ” &455yyyáAk™EýD#ŸP sîÜ9bêÊøùùIII!„ÃÂÂöíÛ‡:~ü¸‘‘QPPB(//¯¤¤äüùóøhBBBBT*•ñw³r222âããñÇ‘˜˜HlˆcÌA©®®îêê²²²"ÖˆO}}½¿¿[[[|||[[[`` ««ëîÝ»(JQQQHHȼyóÈd2³õT*5''gùòåÒÒÒ/^¼ˆ‹‹#“É!OOÏwïÞyyy‰ˆˆäååýù矟>}ŒŒ¼~ýz\\\DD„   ¬¬,®ŒŒLLLLEEÅÁƒ¡ÿz:::º»»ÛÚÚgƸ‹/­îGŽÙ²e >i>|øÿÉSSS |||Beee)))¡]»v!„÷ìÙƒ—û/çÂ… 111ø[NNN&¶ßµk×®]»ðoÇñï¿ÿâ麢¢¢TUUBCC322Ö­['##SUUF&“7n܈Z½zõ«W¯¢¢¢ššš"##qýgÏžŒÊÙÙ™L&‡‡‡#„vïÞͬœÄÄÄøûûkjjž9sæúõëøÿ0))‰F£…‡‡ã6ëŒ;Œ«sl W‰¯þwïܹÓÖÖÖÅÅÅÂÂ!TPPpöìÙ+V „Μ9£££ƒã›«W¯¦¥¥á¥;vìprròõõURRêîîÞ¶mt˜]=˜Õg @ÈÝÿ«wí={öÌ™3ÇÌÌÌÚÚ!”——wêÔ)'''„Prr²®®.ŽorssOž<¹fÍ„PxxøÒ¥KƒƒƒUTTº»»===q Ã,*`VŸ/õèTWW{{{ÿç?ÿ177'î=ÙÙÙŒ3ÕÕÕÕÑét‰ôèÑ#¼ÒÆÆ&++«ÿY9K–,Y½zµŒŒŒ––þ€†©»»!ôåÉQ]]}çÎü?†7ˆŽŽPVVFÅÄĈ‰‰Mœ81''§­­MDD„ÙúÌÌÌÿý7..Ž(9''ÇÁÁáùóç÷îÝ#Ê777OHHÀ×MMÍOŸ>!„ÌÌÌsŸd2yöìÙŸÍxüÍzÞºuëùóç7nÜhmmBûÇ‹/‚‚‚>|hjjJü&ÈËË«¯¯'¶ÁM8$©²²’---qCT?˜•³páBWW׉'ª««ã ß(ÑÓÓà “&MJOOG%''755á –‘‘±qãÆÇ—••åääÌš5 !ÄÏÏhll, @L…!++;sæL¼Ì¬„¼¼¼¸¸x\\œ–––‰‰Idd¤BHWW·¹¹1´.0αA]%˜ýwkjjZZZ¿ˆÊËˉˆÄÊÊŠñwδiÓ”””B|||Äá0+ŸY}{°­­­Ü(//çááù믿ììì˜}ƒºû3»kkkkÚØØ-÷ïß'"[[[¢E!¤®®Ž#¿qfå3«Ï—‡Ó_ £ªªºgÏÜ~ÐÔÔ„›§NÛÏ»ˆY9ÖÖÖÖÖÖ---|ø0BHSSSIIÉ××733óêÕ«©©© .ÌÉÉÁµÂPZZÚùóç7mÚdfföîÝ»gÏž]»víîÝ»¡âââÒÒÒ¾¾¾ÔwÓ~øðá>LPP0((·¥#„¦L™RXXøåf×®]ÃËøGbø–ëêêpæµÿr¨T*BHXXxÆŒþþþø“Ćö- Ï)ØÒÒ¢®®~îÜ9{{{WW×ÂÂÂU«V\¹råõë×7nÜØ¾};>j]]]---ggçÓ§O'$$à$,†'¥¥¥%%%íÞ½!TSSì„­­­½½=??¿••ÕŒ3ðu¿„¯G=yòä²eËÔÔÔFä`[Œ·sl€W fÿÝUUUŒW---¼¬««{õêU¼\XXH¬g†YùÌê3XøjÆ, ½dÉ’U«Vyyyefföõõë¶¶¶Ë–-kiiÁZ˜­ÏÌ̬¯¯‹‹ =~üx[[¾/à$ÀÞ½{—/_þóÏ?GDD¸¸¸I„™™™……ÅôéÓq•pgôUOÜóæ›ÛÞý™ÝµŸ={ÆÕ600ÈÍÍÅË4XÏ ³ò™ÕçKý=^^PP‚;ø¹¸¸DGG‡††R(”¬¬,!!!qqq555í®]»vÏž=—.]"‘HÊÊÊDK¬‰‰‰››Ÿ€€@SSÓ«W¯BÌÊyñâŶmÛ:;;I$Rww7ã“Æ¶¶¶7nÒÔÔ$¢ìoòóóSPP8þ|jjê„ ŒÝÝÝI$R|||TTTtt4??¿N㎴þþþçÎKMMEmß¾=??ŸÙú­[· ]¸p!--MBBB[[7xòðð$&&FGGÇÄÄ´µµIKKÏ™3gΜ9¸JÎÎÎÇïííÕÖÖöññ™8q¢““ÓëׯñAAAYYYŠŠŠý×Ó××nnn<àg‚………Q(ÜqÏÐÐÐÝÝ}÷îÝ111ÙÙÙBBBbbbªªªööö!GGÇØØØÜÜ\‰4eÊâÌÈÈÈÇLJ——w|óæ žœY9µµµ¡¡¡Ä·Ìø›uþüù^^^¢¢¢‚‚‚êêêxû!À]7lØàààO¥Rkkk·nÝzûömaaáÔÔÔ£GJIIéëëãd2933ÓÏÏÏ××WTTÔØØ8??¥¯¯ïææÚÓÓƒ›Uããã:ôÕrB“&MúôéÓöíÛBß}÷ݱcLj¹éÓ§{xxP©ÔÞÞ^ÆþL`Ì'çØ`¯Ìþ» ËËËñNQQ‘X¿råJ*•šŸŸO"‘ׇ††—••™˜˜P(”ââbÜ´À¬|fõ¬É“'ó$À`ïþÌîÚFFF÷ïß¿téBHII‰X¿fÍš¨¨¨+W®H$ÆõÛ¶m+,,,))™={vHHHaaáÇ%%%™•Ϭ>_"!„\]]‰nÌ#eh‡G¹¹¹½½½¹¹9ëÀ………'Oždý®G¶ã0G)))±³³«©©Î4`”Œ·slL\.Œ÷îÝ›‘‘‘‘‘±jÕ*mmíÎÎ΂‚^^ÞèèèåË—···¯[·®µµõÈ‘#sçÎ ?sæLDD•J;wnVVn§ùᇘ­ŽŽNMMuppÐÑÑ©««+,,”““‹‹‹ëíí]´h‘Њ+ÄÅÅëëëÏœ9óÿ÷?ÿü3BèÉ“'ööö[¶l‘––¦Ñh™™™ÍÍ͵µµOŸ>=xð`DD„„Ÿ‘^ðÍIDAT„ĬY³H$Ò7ëioo_YYYTTdff6z&ÛÃŒD"Áìå|îÎ;eee¡›7oΟ?ŸÝÕ\Î1NÆÝI€sçνzõ !äääôâÅ –ºl0ò-:ÕÕÕ())ùé§ŸŸ`1hÑU/^¼8räHYY™……ÅŽ;X¹kÐÕÕÅ£zHJJ>zôè³çà¾ñvŽáá•MLL6mÚ„¤âL¸EGUU•Ý]~~~ýƒÑ¨ªªÊÂÂϲÎi’““-,,‚‚‚7mÚÄ8õØ@lÚ´ O°ÂQôôô$lݺuÄwQYY©¡¡AL?ƉÔÔT###yyyKKË’’’on?Rç çœo\yÅϸ#`:ŽÎîÝ»»ºº444B ¥··wÚ´i,¬§ˆˆˆ¸uë`[XXø›Î Accãû÷ï;::¾œFŽíœkjjðÀíÝÝÝ!!!œ0¤÷0%$$”””P(”„„}}ýßECCCCCC{{;??ÿˆ8SBBB`` ››ÛŒ3.^¼¸téÒ .üøãý¼e¤ÎÎ9߸òŠ1žqG$0èÛÚÚÂÃÃ[[[{{{BxÒ/üRBBÂÇI$RGGÇúõëg̘×GEEÕÖÖòóóëèè|³œ€€€šššÈÈH …"!!akkkii‰*,,ÌÌÌäããëíííêêñɹ˜144ēٚ™™á†BÖÖÖoß¾500(//—–– Ä•´´´|÷îÝ?þxÿþýÎÎNeeeggçÅ‹ߺuËÕÕµ···´´ôôéÓñññt:½´´TTTtÑ¢ExJNSSS„’’Rvv6km°>|ø ,,̸†J¥âÑ]ñ(ãÄúW¯^ñóókjj+—/_.**#!!ñ믿]¸p8yXÉÄħÖÖÖÄ4CÓ§Oõꕱ±ñÝ»wedd"##.\ˆÒÒÒzûö­……ÅÍ›7;;;ÕÔÔ<<>ϼš˜˜8c=®®®»wï P(EEE!!!óæÍ#“É®®® å?ÿùÏúõëïß¿¿k×®>¬ZµjË–-±±±¡eË–‘É丸8\Tddäõë×ãââ"""eeeÙzd_ñâÅ‹   ®®®âââ„„bý™3gtttðÕêêÕ«iiixÆ–ôôt]]]¼¾  àÂ… xû¤¤¤HHH „¬­­üñGŽºfùùùùøø þþûïyyyîîî¶¶¶<<<~~~~~~·oßöññQQQ¹uë–··÷»wï6oÞŒ§†vvv&“ÉDZ3))‰F£…‡‡'$$ ÉË˳õÈ+TTT´´´8::kV¯^m``0¨ó„ ηqrÅ`túôéÈÈHGGG}}}æææ–˜˜øÃ?ôó–‘jÈgAB€ "þUUU¢Õ100/dgg¿}û–ئ®®ŽN§“H¤¾¾¾ßÿýÑ£G¼¼¼t:˜i¬¢¢ÂÉÉ /ÛØØdeeõ_BHEE…øÈK–,Y½zµŒŒŒ–––µµõo”à,rLLŒ˜˜ØÄ‰srrÚÚÚDDD¦NŠŠŽŽÆÍ3666ÒÒÒ k×®ÕÕÕÅï8q¢Q”¦¦æ§OŸÐÿ¶qeeeÜÝÕÕµuëÖÝ»w㓲¼¼œáÛÊÊŠ˜—øñãÇDG3KKK¢J^^¾©©©³³S@@ ¸¸Ÿñœ·Çž8qBBBBNNîܹs­­­bbb¸Íöرcø÷ÄÒ¥Keee÷îÝëééidd„ß+++;sæL¢(]]Ýææfô¿-F`|ÔyÂçÛ8¹b:;;ãââ6oÞ¼iÓ&„Ͼ}û¼½½Õϱ .ˆºš:u*n™ø …B™;w®»»;þ“ø8[Bè«ifkkkkkë–––$%%)++oܸquaøËÀèt:±Ìx­‘””ìêêêëëciÍF??ÿÒ¥Kÿþûo[[Û¡•°|ùòŒŒ {{{!!!^Þ‘Ÿgmø˜}§Œ?%¥¤¤ºººpC+˜¶¶¶ˆˆÈéÓ§‰ûqzzú?ü0´ßÙÜq¾‡+BèÙ³g­­­‹-"ÖüòË/ÞÞÞÚÚÚƒjÈ[ ± úÔQVV¦Ñh_FR 8¨DUTTà0!¤­­ýÇÌŸ?!”——÷øñãþËa&*** @DDdÖ¬Y†††Û·ol͇æîÝ»wïÞEãÎÈrrr¸ÛùíÛ·çÎ[[[‹ª¬¬$*ÝÝÝ]\\>|˜ššºråJ^^^„Ð¥K—xyyqÐ]WW‡»6‹‰‰!„ÒÒÒ¤¥¥i4ZEEEqq1kŽn°ÊËˉ¯LWW÷êÕ«VVV¡ÂÂB¢›¶¦¦æµk×æÍ›‡*((¨¬¬$Þ®¯¯êÔ)qqqÜý…]ÊÊÊÊÊÊB4 wFž$z’®X±bË–-ÊÊÊ÷îÝ;|øð† øøøp \ZZ//ozz:B¨¦¦wmÆííG•‘‘¹xñâ½{÷ž?Φì ÔÔÔdddtùò圜œ…Ôy…¸è|ãŽ+ÆÐ ª!l%ÆV$À4Ð ¸víÚ“'O444‚ƒƒ ®\¹²`Á‚ÐÐP …’••%$$$..®¦¦¶jÕ*„ÐÚµk7oÞ|PQQñõõÅ­²ZZZ«V­ŠíééQTTD¥¤¤à À544œ?ÞÛÛ«­­íããÚCˆää䢢"|ìÝÝݪªªDoÁ•+WR©Ôüü|‰¤¨¨èéé‰×¯X±bÿþý¹¹¹$INNNFFæÈ‘#nnnøUssóììl;;;¶¶aÆW¯^¡ÿŸKvqqÙ·o•JE­[·îúõë‡F¹¹¹SL[YYÅÇÇ766ª©©………­_¿!¤¯¯ïææÚÓÓƒûÆÇÇãÎqÓ§O÷ðð R©½½½¸kàn®®®BBB±±±III:::YYYøŠ?¨óÿ(»çW^1ú7mÚ4aaá‹/âÔBèòåËÓ§OZ§%¸# !„\]]Yö˘››ÛÛÛ›››³r§·nÝZ¿~=Ξ²l§………'OždÙ‡£¶¶¶¸¸ŸÊcBII‰~¼…ÝuÜηϰøŠall¼wïÞÁŽòrúô騨(GGG==½«W¯$&&=zôhÅŠÛ¶mà ù÷ïßOOOÇMYOž<±··ß²e Ñ´mÛ6IIIÆ„€½½}@@À ÊHBÀÃÃÃÏÏ“ÃÇD"‘84ë9FUUU!„Š‹‹•””ˆÆFÀèìÙ³Äïž1”E£ÑTUU‰Þ Œ8ß>3&®ŽŽŽ‚‚‚IIIéééêêê ø»TC¾´´4⮄瀑„Ç×A‰‹‹²f`ƒ±Ò¢ÖÖÖVZZêèèÈùW._!$))ùøñc¶È¸œo¶\1†Ö¢3"X™€0t4ÝUà\!!!ì®ÂP”——³» `ó0F¯C ÑÀfIII¡   V&Æ t6ƒ„Àèa:{9ÀX¸:àZè€kA ó_666z_ÀÓˆ „ôôô"##·ohh˜9sæg›aUUUÝÝݬ«=ø===É/àyžB’’’x z›7o>Û «¬¬ÔÐÐèêêb]íÁXçœuÎþýûY¶¯!pqqAEDDÄÆÆÆÆÆnÙ²…ñÕÐÐÐÏ&à•‘‘‰õððø²¨ÆÆÆ÷ïßwttŒj…Á7yyy!„N:uêÔ©;v0¾J¥R—-[ƸF^^þÔ©SÁÁÁ_ÕÐÐÐÐÐÐÞÞ>ªcœc ["Ö:õõõ,Û×à™c 'MšD¡Plmmõõõ…„„êëëgΜºzõjÆ–‰„gOý¬œE‹áøLMMõôôð¤»}}}ÇŽ³±±ùá‡/^ŒçÅbbbp³Prr²µµõ?þ˜––†_Š‹‹›;w®žžÞܹs---á§Þ`ihh „LLL}}}—-[6cÆ aaáׯ_+((xyyÍŸ?ŸñW5‰Dš7ož‰‰Égåã!DUTT$%%ñ4õ}}}±±±zzzrrr3gÎd[<$$ÿd?xðàôéÓ•””Ž=Š_ WWW—””TWW×ÒÒêììíŒ*8ÇÆ-H ["GçØØØàqqñ””„ŒŒLLLLEEÅÁƒRBddäõë×ãââ"""ñ\ÄT*5''gùòåÒÒÒ/^¼ˆ‹‹#“ɡիW‹‰‰ÅÅÅÅÄÄ,\¸PJJ*77wåÊ•?NLLtssSSS»téÒÍ›7{{{Gí¸¹™žž^””Ä#UÈËË'''ß»wB¡ ¤„¤¤$ž $$$//Ú½{wFFƺuëdddªªªÂÂÂÈdòÆB›7o– Y¾|¹ŒŒLffæ† |’’âááÉÍÍåœ¹ÒØ Œz Cü—îÙ³g´w7Lßÿ½°°°¡¡áÀ¯PA§ÓçÌ™³víZbÍ—WŸ%K–|ö–£Gþý÷ßOŸ>-,,,..¾|ù2LjœÌÄÄDTTÔÄÄdd#E:>þ|OOOb°°ðgÛ¬^½ú³·\¼x±¸¸¸¢¢âÊ•+4íÖ­[ðr8ÇÆ-H {#H]ý1¡š––±þÙ³gµµµOŸ>ůJHHÌš5‹L&?þüåË—_®G‰‰‰!„ÒÒÒ¤¥¥i4ZEE…©©)FSRRÒÑÑ©««+,,”““à <åååwïÞ%výÝwß)**"„œ[ZZ6nÜ8{öìžžž‚‚‚®®®7,„Г'OB4MXXX__ŸXÿèÑ£êêꊊ üª””Ô¼yóÈdòãÇ«ªª¾\’@=zTFFæâÅ‹÷îݳ´´¼pá‚ššš¡¡aMMMvvöäÉ“qÿª;w•»ÖÖÖVQQAÙÚÚ~úôÉ×××Êʪ»»;;;¾Ó±αq’cëÿЉ ÕBnnnDk°‡‡ÇëׯñrPP€€@VV–¢¢¢»»ûW×#„444œ?ÞÛÛ«­­íããcgg§¬¬|áÂ…´´4 mmmÜÒˆòõõ}óæ ±ë%K–ìÚµ !$++ÛÒÒRUUŽŽ†«Õ`áîý®®®!ÿíÛ·ãõ+V¬¨­­ÅË®®®&Løë¯¿TTTV¬XñòåË/×#„¦OŸîááA¥R{{{ víÚµbÅ 55µÔÔÔ£GJIIéëëãœBhíÚµuuuÄ®W¯^/X“&Múô鮯wß}wìØ1øNÇ:8ÇÆ9H ["BÈÕÕ•±??w077···777gwEF]AAAaaáÉ“'Ù]ÛŒ÷îÝ«ªªúÍ-ÓÓÓqgdœÀýÇCààÁƒ_&>[zò䉽½ý–-[ˆ$€‰‰ FsppøjàÆ¸Æ$ÀÂ… q@JJêÏ?ÿ,(((--eæzxxøùùáý¸‰D‚Ô08C Ð#𥼼¼A­Ç|}}}}}׸»»3>OGÈÏÏÿj ÇŽë§üq¦€×‚@\ p-tÀµ 327¸yó&K ÀFnΘ§§§·cÇv×Ƽ ÈÉɱ»`„±-СR©7nÜHOOgW¸†ŒŒÌx—aM$0ô@'111!!ÁÔÔ”N§üø1 `úôé»——õcјˆ†èlܸñùóçxÒîîn???*•:rG‘ÀȤ®Þ¿/""¸&** Ï]§¤¤À¸¾¶¶–ŸŸ_GG‡X¹`ÁQQÑßÿ]RRÒßß¿  àêÕ«RRR#R7Œ6ކèTWW{{{wuu¤¦¦ë“““uuuñQåææžµ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ—ŠŒ†ý¬Ð6é‹ Š[‘k¹¬XŠŸK–f½ 2fE~]Šl:˜õ&ÞýeèꢄÓÁPY3¦)hìÐQ nÛµm†?üø¢þ:»¸\ü:™®ð¶¿ÞР±¾×O°ð®Pæ!ëAC÷46pW]¸5ŒPôx_äâ/‹åêàï—«Œ#»Á‘ ÉÌ@ $Ð9ÿN¡y¡D£ ²†mEL=|ìþœOüVŒÆxßþëàý||µ{,Ù„’‰"÷Ä2ã+Žtï ¦„‘3"FÞ,%ê›UR2`¨(èK¥uêÐ.Œ”ìëì ]j…5£ +ÊtÎ…ÔÔ¿÷Ášœ#¬¥ÆƒôoïU%;@»3]*d4ã gÂôуMYåA¨ ´á ¬È‰’ŒZ§L %σÖm£5?™©ã³¾Ô—šÖ¥ö½œÌ<éháútÀï&çúÈýéUÃHc7÷OY©&F;TVXïRŽ’Îò§þU³Y±?8—–Z§w!‰= ‡íA8”¥ÒE~ÑH(¥<І ”j½'Â(ž_4ª˜¬Ì M‚AK÷[0\™‚¨¼éV(Í[x€”€PƒnzÔò¦®”ü™‚ÕlÖWßâJµo›—’;Ú½|†TОúWÊÀlG) :’Á•bè ½VÚš-ØQUlÖ‹!.Ü;ÊìH CR¨ÐÌÅ B*«™Íy§45݈6ú5êDÙY·1¬ä³^iå¾ÉaÜ‘Æ>äP£I­”ˆAzf9 Ö%J2„55.•ºí‹'Éa%Ÿõ9{‡‡v7r¨erè'äðI"Á¡‹7x(·…‡•|ÖË¡ÜC< ;’ÃA¸kO^:V/%£ SlÃ*K R½œ©ŽËêr&i¡ ÁÈ=ö`5ôàÁ‰ºëÒM3¼¬¶Ê ,ÍJ+·JÀïÀ‘l°{µlÖ6!Þ»mÒ1ÃSÍé¢î| @®£7f@ÅENrÆ×®)Ð) qrøRví)oó¨ñ·OŸ>þ^|-¦¯1!нsC­$¾„ƒDùlµéÁÂIlZDÍ{˜bñ ô¸Êø ÃGþ½‰üN5— ~Š®õà§ÝíezG¦vç“"¼íiŒ%Õâñæã!%ãRó4²Õ7±hM*ç÷Ö+fY¬e´"37YÓReÊņ©26Þ}öbÖÛE³Ýnêÿu÷A+~ݤ§K‘l³ðC´© ŸwjÔ(³¬vŠ»P-—K©á¼ìØ!W ïkÕpýy@Ì(Pçv?ZuÌ%F˜ë’?OÕn/’^ÔéäêœíÕø¹\›Ó“SúëdZ,¯–«â±ƒ^TaGçq/´„hh_—¼‘^€½¦¤¥FôRAjˆŠuÆp/L6é!¬„‡ ½ 2 ÑqŽGG¬š·ÚæNÑ:}|WP¢:#M¾|°ƒð¦~?…ÄçÉtÚ€ÄØÓóY4)~è^¥Ý£Þf”÷LœÊ`ä“îßtrqüe¾˜ü·´ÑôAæ>¦Ë¢D´Õä´"=Ùb;‚P¼Æ˜ûQ3…ÝS¬,lÌ–ØÖ,±MA̦'p˜Î™8’6Þ¨>\ú×¾´Z(q#wZ؂Ȍ=áLJÉòtŽàññÃáßF³*øèœ@…ú­|œÔ¯9/”h'ƒ'RÒ(’דêÃ(µY²Îiê‡Í&®œ¦"Gg¢3Ö‚áŸfðŽ"[V{m”‹­G'¾RWîszdWîõ¸r#j÷Ž ÁŒáí€eM  Ô瞺`9+ËóqšH;r—4#hFÐ «IO0Óf­°2®î[§Õ4R‹Ž-¥D§ô‡Ô”ÔÐáBJPàÎ4ªå󣈔 ó^W~‚ëÐÕ\Ž®æ®N 4w–ˆÓ7(FÅÙb´B¿½LS„Ë)= sÝcˆ’BJäp29©Êv:l2L¸;“ÍŽƒÑk§µ´^‡ÖyyÍF–öCì•ZXá´8i›~-¬½ôQŸ­¶‡>« ¡¼h˜û¬ˆ*¥S ¥ÔgÕY• 4k&G/LfhÍК¡õõ@k÷1{×å!hЩ¶UâÍ‚¬‡”©¦ÒÐÒt=HIrÊXÇìƒÉ ­/ ZO=3´¾Ê¸àO‘ú²24è{èWi#P³•‘·c¥5‰’±HiRX«"5ሦmbCkµ&›@ªQFKç,­´ÒGNHõ4 >€ Ê«ÛÆR&3¼yÇ›)"÷¨øLÏ­Û Ý;Í]W¢¥ PäíJ‚»ŽtÅ¡F à:ÒY#]}0™m†l3d›aŸm†&¥J¦{ÏÄë‰À@:Ãzv`Ñ +)ÑfJU©é5"ªV¼¥J½0™K•r©RFÔ—a;WDj«¡S*B#8 ©÷kÊÍÐZ )†@r3´á9_Çåg ¸RkŸs3^Un†]zGØÝt±Ý¯ÚrnB§*Íâ0HÉ„ÔxÕY‡0„“*M•1–ªLŸ•=Ì~,m=1ƒš™?h²Þ}h¾=½e–ír5Z¬ƒ4ÝùÚÛµÛD{‡µž°zÀ GÍýRKyÅŒ`ÁRo@ kV¨‰²r>ðcE5ŸÕý¡ÞŠ`¤ÊP‘¡âE@…î*Ö{(÷Ô) ˜èHs¢3,͉4>_n)*Ù¬lwj(*Os ­¹“¡"CÅ3ƒ ÓTÀ¶<ð²…£h$“VÙä@Ðz XÍ<Š ÊY8Öd¨ÈPñ" ÂîTDÓô6¯J«¬)­ mžTè(˱r2›+^V¸>›üÁŠh\šäéu2+”:aEŒ[Œk†G=åÔ¶YA(2P<3 ð}l-T‘zTÄ †t¢e+a @ÍB4K;P¨‚‚›*Û*^T„=;‰iô  1TXe¨‚½ÅSÎ?¢0Q*úœ&úŒ)v‹ÆyŽ p)ö‰Küqì€Îc]H®Ž>Á´ÍVm…K‡E”tô9b>˜ÍÀô2L×9éSy!uYäkX‡ÿ)'bP)bŒ³C"}ªR‚ì)5lV¯4>9a!ú½™ø~¶¨ CK©ÍÏõ½ãÕWº>2C´4çTYŠwÓ >MTUà e.*¤80tø¼¤}0Ù¤„ú©€ÔJ%XAÔ¬õu-c 'óŸX0ìžý pÐ:GŸfõ"&y^xVDI ÿóϱ¤ìÚSÞæh€&«H—uæéL] ¤¤ 7 ê}Ьú‚‚‡~‹H‰!Š\ë¢mB~ûôéãÁõ ÄW§Ó"‡E8Â"u™Ã"½@Éûù÷*$霳ã(é5Fj;  hÖÉÌ2Æ5%åuj‹žúœàì<ë4¯^˜lrLàÑnõ|4¤tN¿®s‚n­,ǧô|mœúQÎØƒr*KÆ*nº†Õ,&å”kJTûGÊiȪ »處³;“Y9³r>Í÷ÝsEÈâ1f ¨N²&‹ü ¤) £€H¯AØö”·i„~¸É²ø½øZL³ Îaƒ× äK°Áåîmð:$Q=Œ};0‚CJZX;„€´ÂóGóåêb4^{ï»ÇŒ° oÞϧ〘1ƒ3 Ì0-t'X“û®ÉXa ‰ôh¶= Þ&||ZŒfË œ Q!7XqC÷€½_ è+£™-ŽDÉ çRj_RŽí)o@þ6ºø4ÿÇj¾G8q¤Z"3”°BIÓª­¥Ž}àxa©PÞÕœˆ‰`p{pðˆžK±ø8Z,‹EFNô¸/„9X‘Ãöa„à—Ü—šRÈÃîAØã—ÓÓb™^ƒcSú2b°"†ëÉÖ0ìÑ¢¢S°ÃPLŒRk÷ ÖñËåêK1˘Ámf˜ëØhø>Ì Ê†çöOeß’¢åL¸½ðO2þ“ƒÕÊØ¾ ¬€z O9O`yÃS¶S:OI)VÁîÁi ^-£'ZÜ“¼Œ¬h{‰bÐ0Z*ì‘Ü6Q¢JÕ pÄ4W Ùšò6Ñã×É÷Ë‹ ¼!*Q̉!¡{)$¿_ÙȈ Q²9¬³qøƒfhMs›Øñ²ƒ3zp&ŽV áKÀx¾Ø¡zÀæk^ðPdf$ëíñcM7î€ü>?ËàÁ •R˜Ñƒ³Õi裙^4!¤Jn£X;ûP͸ƒDIÉH "¥²†ÎYð¥æïuZÍgåRGmäQ¤c”y²C[äçÑib£=±öNO¥ØJtFaðžtU‚^”0ÑøRùÊ6²ZÅ@gn­n”¨ã³%‚O½Y”<Ô!ƒÄÎ@¢Ë84Õî4·–[çLä¤MÃ'xfÃÅùd§øh"9R'3pø©šÍÊ¥4_&õMó!¯Ë´Ÿ¤wI¶HòÚ—Éb¼}É‘Ò0M#¼Ž É{•Z>XÏI•lV#’5e+Ji!#RF¤½D$³#Dr= RP¡lºjØm$ïËN°)¶¬V©›Oô[°‘*¹¬$Ò˜ÔÊd@Ê€´—€dwH¾@²Î§Ä7ã9mA::O·ÊÇ-8mUlV"’µB—m¤ŒHû‰H~Gˆ{@$ém9ÁŒã…$itêˆìŒ6if£T*åšm„¶«ù¬·F#Nh©Ñ!cRƤ½Ä$µLнLD6 |.jÞ™›VÒ)R2RÓ¨ À õ¢ÞÂHäJ>+–:¥OiBÒæ €ŒI{ŠIГÊ×ÓÑU±øù |ΣóŸþutÐtmmod_perl-2.0.9/docs/user/handlers/http_cycle_http_filters.gif0000644€ÿÿÿÿ00010010000013344011727205031024624 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôòòò???ððð===îîîììì999êêê777èèè555æææäää111âââ///àààÞÞÞ+++ÜÜÜ7\)))ÚÚÚ'''ØØØd©4%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ$ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®1¬¬¬ªªª¨¨¨Iz&¤¤¤¢¢¢„ÞE   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||/Ozzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó>>>ïïï<<<ííí:::ëëëéééççç444ååå222ããã 000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠTP©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœQÕšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=2 ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîwiíAŒ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(b4PX^gÀ@àÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb L¦þ¡°àË©´Öjë­™¦š£}êE°¬À‚)®àÉŠ’ˆ‰ Y¬°†˜,à*í´ÔVK§®Ã­ŠÙ§D;dEàùBãŽé­µè¦«îºRbû¯Š}ÊBE@$%/°C%DšpD+,ð’@¿ÿ<ðb”ÒB ²´:d$,´Ò‚+¯ ‰B,d ‘¢ÈŠ$¾úò;¤¿ üd¹E&¼pÃCž° -w³*3ìð粫óÎ<[ë®gð&öi IFÒ‘L@$ùx!Î,E2í4ÔC’r‘ 2d¹F D¢|dÎ=dÒK7ýôÉGZµÖ^¬Çñ[õÕCf]$þÙ=÷í÷ß¹2º«¶—}êB’° ‘çæÜ8‘Ïdœñ+]{±x‘Þ„­$߉y¹;‰ò³^D.9åCîsÊ%ô¹ä, Î8à´×n;¢?w4bò¾dçD~:γ9+’²()¶‘œ+^<èl¹‚ñJÊ’9Éy|’|ßîý÷à³™;g»öé<³œC÷íx!‰'Dr¢4ñô×.)™ ©‰&D¶ ‘5÷Žô¾øÍzõcʼ…¿$!àœXD‘8ÀðYð‚Ô“à²Õ§mÝÌ }€EÆXñ"U",xȼ ŠjXÀ ¨*†ÔÂÆp†^ð†dÑŠTx@þDò„ X ŠˆƒH˜Å P0Šx ),¨FÆVgBªH5„¡ ™´,Œeìx:ä¡H¤ôÀHaìáŸÅ)fðpŒ#’Æ·™òÆWrÌ£÷ÈÇEñ Hì£ IH Ò3v,  ÉÈF:rg‡¼L" ³ÈGZò’˜Ï|δ¦ÇêçJZ1‚¾ ¡5ÙX³Ó(úù†Ïžâ²þl5haZКb…mi ÛÏ!X€%E%ÒñOZØ ¾¶°‰ œâžò¦§Mm¡všRŸNL¨í2ê@ ·Úà·¸!zíIe1Û®K·õíqkÚuhÀ$0‚ T€àÆÜÍo–[Rç>Lºé²î<µ»ß2h1= ƒ§ø&<1‚aô (î±ï¸# ¹ÈþGNò’›üä(O¹ÊWÎò–»œäRè¿#pà |.ÇÓÁ^`(P¢ãH–Á•_Ü¡GP‡)˜MV1Ø£PºÔ§Nõª[ýêXϺַÎõ®{]ên¸/@gNJKÇo¦vÎsìBArÅn1gpbºxGÓ¿!…¾ûýàOøÂþðˆO¼âÿw_ˆýŸdOT͹ƒv5©Sloûm‡ 6œÀhÑÊ\‡U |g¼êWÏúÖ»ÞõŽ—y‚ykvNVþQ—¿Tæ5Ø*$¡W` JŽ=œ>õ¯O¾ò—Ï|ÄÇ~ì³ï.§:X¸ÜG“Ÿ¼/°8ºþѺ»¥ðpXQßüò›ÿü°¼¿£_cï²ÊT»Ï~]ÍÈå ß?UÉþþûÿÿ€÷|Ç~`V{¦t{½b}ú„}òw]Î@Ë °È€˜Ë'€ë7SîçAðÇ€ ˆ[³P vñr` SÅØ‚.¨zØO‘‡;ØL/ 8R"8‚‰µݰ iQ^ª°‚ø‚H˜„‚ƒÁ0ƒ‡2y„qsr‘swAúVCJ¤beøà®¤0™°¤S‘ª ¤ !0 µ "Ð ¸¸ U±«ŸP HP ÷P গQD` ǰÎÔ` ZÀ ` dpkÐq0õ c¨ ;Œ {àw”kÐw(@¡À¬×èŸ-0þ e0²R ¡}7}Š¡RÐ~ ±Ú²/Ûw2[4»Ð û«¡)¬8´A³$k²€²*K‘²×ªB}@Z›ÚjV ³,À¹°&pÁ  ÛV°Bµ•L»²÷ ÐwÔ  ò0¡÷p ÖpŒ°|–L€™âLШ×É ‚§QØà•‘p~W¡Z—…{¸R¸·r–i—Y}ç³qÀ¹«·|ë·€‚ë¬W+›Þø]\Ûµcu2›ˆB xQ n  &&Vãs@µ•  ùùUàw  ªð } èþ‰­ð p ¸R#ª 7À*ø¹ Z`~  ‹0žÉ* p²R0ß  º`²­ðR |  (@ ±&P¾ç›¾ëÛ¾ï¿}' Ñ+v Ð)  ìî ¿òk½Â€½Ú˽Þ[à+¾=šW?ªT×úWÙj»QUøÐOw0½p#€ Á°ä ÔP P ÛS[I†~w!øP àw€2+@Ð÷ê Ù kÐ Å8 ~RðÑМ[ ¤+„ü`ë¶RÀ (€ü`ÃËÆR ÆdlÆþh¬Æ¼J h Q@ K›èàò@@³€li¼ÆQ<ÅU|ÅY¼Åkp –Â\µÂ’ÕÂ.ìTs œuæO°@®tqð@ D`Fpb]@Ë>å¶’¨„ €œL{žÜW ,\¢<ÊAÅ î2Ðqý´Ó@Žrì°ål`?…˹ì‚sP ù¹þ×ËÒ—µßX*yHÌ.µ Ó¾`Ëÿ$nráã°ýôYùO퀈Dü‹Ùü‚˜ ÇàÏåÎí7»ïGÎÃlÎ<5¸×€dåYcëý  àO0]U~ÀýÐÏÿ\ÒÿgÐøþË̶РStÀ`ÞÀ?  c0ÿôŽ Pœî<…Í&Ôé»>ŠÐ ¨Ð/ýTwÀ~PÕèÀU€>Plà ®…PCªÑ€;…ÔJÖŒ‡Ò–¨Ò9ÆÒ;æÒQ½RÔ`°_µ œà¸W èç Pb@P΀åqÖ­ÖŽ=‰Ï‡…2‡‚Q‡pq‡uRÎs]RÀ€ž÷¬PËðÄ .ÐÖÀÎ"ð c‡-PZ€üàShýغ=xl‘nvµ»Ù<% @ZQZð. e¬@žàŠ0þpøà=  o`PoPX…—j@ /•Û»=Þ° }X;8Z«ÂÁ-Ü/t PQD°ˆð”°— pÆkQ@0Áá0à^à~àžà ¾à ÞàþàáΑ­æ6­ŽU­w×f&×ìQC€  OuÉpPP°.… _÷â0ã2>ã4uwÀÔ(ìÔ´ ÕSÄ PðT@Pd ÀAÞã<%Ù„BÙaÙoÙt¢ÙJþPW âñýT-À õ߯På;Åäƒâä€ån!åsBå`ÎPŽyu… öà#½æ-%æ‚Bæaæmæþr¢ætŽP¬\þTR † 5Ô[ðÙŽRv(xîzÎ|'~¾èU [°ÏQÕ²°PÃé—`é)Õè€òè}ék1épRé¢Pa` Q•ÀPrÞ­^R¤ž'¦Î¨®ªþ&¬¾ëýÇ|Û‡¥«`ìÛeá‡á¾¥áŠÄá…æáÎNP%@ËSe²ÎPÜ úPØÙ^Q½Ž'¿^ÔNIÖNjØ^îxàë UD`aÍP(nïuîw’îxìi1ìnRì»îðåR ïÞOUÃ-fRÔ ñŸñ¿ñßñÿñ ò"?ò$¯þñi€ã¬ã[ËãþÎPéÀúb·õŠRdÀŸó:¿ó<ßó>ÿó@ôB?ôD_ôFô;Ÿ ~Þ4Τ‚ð¢ŽÈ'@Uñ@ÓÕòpRdÐäýõ†×ÛÒúÛ–·Þ-oPmÀx`bSµQ›LÀõ^övxbád{föå˜%PU” wµǼõ%Õõw¿øå=€L_SéýÉ}ï÷uj¯‚ØÓÀ`RŠÏø‹Ÿ÷Ѿ÷ 8ù”ÿO-EHUMå *^‰_÷žo÷ OsÒ.fëîIíîmŸí\ îV?UùЋ% ÀÝÕù³öµ_v¢þƒ¤_úÁ` #VíP UxÀ=œü²¿üäÝü’wû–û¨´ûìÖûÆî [šÝ¶ ÐìÞþÌ¿ô²+δËòÒP—Àí`åQ%Ø@‚ 4HŽŸi>4H¦‹Š-^ĘQãFŽ=~R¤E_f àEåJ–-]¾„SæÌ˜ÀþÔ™SçNž=}þ4(¨„EšT)04>…Õ¥­^ÅšUëV®]½~…Hä €B`ÍvÝFîlA^6­8Qã#¢u‰Æ™Wï^¾}/–<™Rê`Â…m*EœXqO¢F?†Ì“iaÊ•R…›YófÎ!þÐm˜çÎ+ˆh`L±Í7Ò}±€ ÙxýÞÆÛ/`ƒ(-ÿ¾òpdâÅu66žñäàÍ+c&]útê°P]ûÖ![ j-7#ÝyÄ1ÿN ¢”é9rN aîøP9D1 _òô)ëÇ¢ ºà€2ZÐ-A+â­ ßœƒPªá”£01ä*ÄÐ'æ"ä𲪶1D­"zœ±«x଀ðjˆaˆ(Æc@â˜6ºÙ(8À1/ŽÜñF JdóÃŽÂaD Qè"…jàÁFŠVÐÇÌAÊþ ‰bC˜ÏÌ­A‚ì°M˜&Ì0Ο.”þSÎ ÝÄ“%èRä³ÏêJ€?µâ Μ¡xÜ9䡃;ìÁ|ôЇ~ü°«S¢Ðñ(È‹èjƶŠòøàYxC ó h‚ó(*dN‘@‘@Ðäµ/5b3Ï<ᬳXœè4¶Â;…ÅsÏAŸ…ö,#Ü9/Z«È£4O·ÝÖ~øÐG|*µÇP;Õ"ºê¸h‚ëÂ+]ò*B¢ôñ W}óú5˜`™m“ØdåDvàä–¸Cg­e¸aˆ€ ‡AÌw¤x™&–Y"%ŽÁÑ#Š!b˜! r ÝYÕ`ž‹Ô‰"l0˜UÞ–)ºçkîad>ÈþØ7èúý7á6“&a£!\xb© ¦.hˆTNæŒDÈ,eÄ !\¹ ¢PdkÁR€–bœoTÑÅÞV%Ð{¼˜€( aPhå8¸:ñˆìi‘fZ¹¥#Ìiǃ‹kÍýô†<–Ù<.Ìñ¬ @w[¼ŒÑ£.)úÆ.=  ˆ,²‚(+Æò#”<ì-Vtô@ úP}õ5bÞzç Ÿ>2éãOªz÷ Ã^{ý¥¢ Ùg´¡Š`È™8ŸêþÖ·Àõµï~Àý3? Å~”Jþ¸AÍäC5£ $âЙGÈ"À4È@6Ð$½i+Á "†‚5üÉeø rЇfIF¡= ¢3HG0ŒÀ´a-èkaƒæÀæy8”_Q°¸œ¦Tñ9úaábv`Ú#@C6õ`h#  ‚ÁE)ÖMTô¢„®¸Å j‘HÑacÒC1ò*H¡!Á2cj ŠÎBG;VR7xäShøG Ü“8 d&§FE–2+.À´wJtæ%  ˆÂ"³PÒ’·ôÕ CQ:e“ŸdŒþ™Ã.ö*„4e2‹!ˆA{Žˆ…gP49Å“T .µ¹L³&{æQ<ùÉPzÓ ÈLf)QØ ý#[›1 2°^±å6õ94]®‰—æ|8Ã9at'åô&:ÓiHTf`¡Z)„/ ò¢Ü¡–ÙÜgF;ÒM€¶ä—­Å89‰Pc*ô¡?œ¼¡¿d3“À€AÒ@X¤,Z!R±SžöÔ§?jP…:T¢Õ¨GEjR{ú~ëŸõ¨@ALÇL5'$í¥IOÊÁÔlÁ¥¡+†=Pÿ¡a çűh\À­o…k\å:WºÖÕ®wÅk^õºþW¾ÊÕ™0„ªL>jP‘þ«¢ÔêV¨ ØCÚ3Â8 h d4F]„¡Ø…-°Â‘ªUSP«6“‰ålö†€¢\"µÄ rØG ^kJÏ~Ö ƒhaùhZA¢v·X«Qt›=(€3pî@  `¼K®øÃ.¸ç‰ã*²·Ÿn8…»EâæÑ¸Ýu˜5Ü€Ø)C{,ˆi¬‘â³(r‚ÊF ·ß lx‡9^,–׋çõo´ 0 [At§æÄp…Í€áñQz ž$÷Hp U“À84pb?-),F-Æ€þ$¢—$(HÀðD°‹}8⎖ø“'®aŠw¸b!èBÀ6’“¶4UjÔhgâ‚\Â~x„N~;ܳÉÚ#2@ÌI$WPÉ2dò™·c³A9E*C·#T§_–@NÀ€jÈ9€i6çšÿØf ¾ƒq6ôtˆ°*uhC'‹ B·„7l¦ùpˆ$ø€ à$59ˆ´þíMEó‘Ñôsô!jÏ a€ƒ8vb†Dv7xF‰ZÈêš´ݪÙê-¾:~±¾ß¬‘½S¥<ñ?ða„͹`›€8 â€mB–®¶æ”ÝKfþcÑÙÓƒ¶û¤îµä£¾Ç)ú _œdéØ\7È"F™VÆŠ*f±p†7Üá‡xÄ%>qŠWÜâÇxÆnæu‹²Ý8|7ôâm½yÓû,H D fL:Ì‚ÇèÛ"6gÓdÀJÞuÆ®„ÓzÐ…>t¢ÝèGGzÒ•¾t¦7ÝéA÷C„ýõTß~¼†!§ÜÈ›Wr“¯eðCq\4 +4À¼SiÔíá‡Ô;žI«Wë‘Óúå¸Þõ³¦ˆDìA”h¢ØLäh•°À|=oûÛ%o‘¸Ö·.©»ïδ¼;nï|Kˆòí`(þÁ¬(‚æ:>Ɇküä'_ù]^ó¡í±H;ÕÎ?íó ïÊ1ð4˜ÙÌC54s l%Pìe?}ŠÐÞŸ¶jîç´{öÞh¿þVúA”è‡øÔJp éS_öÖw*öY’yúm>iÞOøÃŸ• áXw«Ì€†Ì # ?X¼¬`;÷{?¹£:ð½ܳ?ƒÁ?€Ñ¿ý» a|8†ýá†2ð“ëh>®h@”<ø›:ù-íó‰ ˜ d– ÔÀ‡ <à ÒÍ@ðà P3ÁØCA}RÁ¹$ú‹L¬A„h¢ˆ¯ý9þ>³È‚5èŠÔHÈ㈱0) †pt@‘  O!B‹&È+øj ˆ@p1 ¾#ŒÀ›@ÑbBcqÂ<Â(4ˆJ 'ÚUpÍ®pÏ1@\CЏ5?¸)P¢9DCˆÙ¨ Ž8@ð¢8Ãty@ËcA%œž>,–?lRÄí¨N @¿µP¾¯`‹ÚŠÔ󀂸‹ù¨ûÈ)È P†IxnXЍ³q8…o”‚›†œÜI#A%a')¡)•-HÜ")x?ˆ‚1‡1(¾ È‚.>C〄x8ÞyÄQ€O@b9¾%:V3;>2<&§àµ=>ž¶'(™…CFä/>äƒä0AèŠ4P»³HE˜#3sˆäãå^öå_f`Ž:“]Mf3N)O¾‹Šö"«6¬®œ·¬¸>32ÈZÿÊ÷êŒm$ˆX†ÀìÌÖìÍæìÎöìÏíþÐíÑ&íÒ6mΖçª6æECfÃRl¨bì&#„á Ú® 0¯x„Îu1À·« :°…á&îâ6îãFîäVîåfîævîç†îè.îa®=µ^kÄ^ ­Î }ì¬ D  a ‡X‹&‹i؇‡(=à‡Û.ˆ|²äÂäD[mWkíáz펊m!kaLØ g°…³xèà«‚D„ˆm€ CŒŠï(šoV«ïf»oòÊo€Úo3›Cð¯}(¼¹ŠR”ꇀï_ _¶ w· /° 7§ ±Üi]ý‰œ$@ƒ ~ˆ Âkwpg g79G1O(îîþn«à1ïZ…I8‹ÇòŠ~¨ì‡ ™¹Eˆòôr#ò«3ò$Cò’Rò%ˆ*và Iˆ³Hƒ/‹d¸ €}æò.Ož/§»0·»1w³2Ϫ3Gs„P?vB¯> †voƒ˜Xß×ó:âó$ôsÍôFtÄ"ôB7ˆKÜPxN…Rhôí‚Xœ c«Ps6—ôI‡pÅÚµ©L‡µM?­N÷t‚¸€EˆS ˆ6ð€A¡æzxæ¯ ‚ÿ»Š ðE&<:÷qZ¯ubæÝK¯?]6^/._ÿõ`@…³>b'T#à€8è'GHx… þ¸æ`ðÔÁ†øp%Z÷v×¥;00Ñ`&`†uȰ€.œï`p‡Ès¹„éÛø®t‹Öö%ävxóvó÷_·xcƒ0w"¸„HˆMà‚¸.[„ ˆ XvC6÷`py˜ç²X È!°ÝÀ6‹<¨B®h€]ÄŠë0¢jßG(mpây¾¸‡¨L‘xX;ØÄ=[O[\ÇnÅÐqÿÊÓ:@ˆ8…Uè‚› †[äTò`xõÐ\TÎy¸'õ¹ÿƒ`P „{¢fÈmAvØÁ¬hx„Y× €Wˆ€wh‹¿áÙ« Ih `þ9(‚T¬îŽî¹?°‘÷t4-ö¸˜`\pˆ00Ây‚ý‡-pJ–æÈ»ý )8¯€ Ö €.fú¹¸+}þ~üÇ€¬ú˜Çe¼ÆP}°Ú”éH\ö€GùM)  ±~e¬wtø0ÿ)áG ÿö'ø—ÐпõÑokÞ^,hð „ 2\(AF°ˆ'R¬hñ"ÆŒ7rìèñ#ȈFøñ)fñ”Äs¤"nxd‘Ñ$‰”ŠH\Ñ‹-‰--‚ˆDÕÄÃ(Š22"ƒœGAN€. 2eLš=‹…Jµ.h¤píþêõ€&Lì0OÊ?QRÄ‚7ÆWQô€¤¨W„¥ˆ@œ´kÛ¾åJ©¬;/Â1âê°”P~ÀI‘K×.^)‡$^Üø€$láC«–­[¸š+fìõ5ìØü†NÌ !îܺwö§ðà‡/nü8òäÉÿ¢Rîü9ôèÀò®nýº—‡K·sïîýûR.Ìñ|VâJDI‚ ±Àª„¨Jé$FheÊÄ¡­01 H)O°ç|òEÔ÷¥ÎD„¸bÊ(Xã]„T ð‡v¨Fl]åáYÙ¸3– 5ÀIWy|pŠ,¼!E~œÀUþ¾f"Š*²ÈXÍÄñÚc.À -¾ãŒ@ ¤W…€Ì)(ˆ<Žå£ˆO"˜²Ñ&‘mØ™y¦B¾E·&›mÇœ›qÊYÜthÚygv·'Ÿ}úÙQ0ñ§~N‡†f´I¡Í@wÔ1Ïñ¼ÓNk¤CÀa‚u–ŸJ¡‡¨ÀÕ|t8däÓU$€‘êá©NÖÛc豃¨ªÊá—¡pëk(Ðó—>ŒZj­Â&´]ÍFQ™xZkšsj»­pprû­tÔ];®nÚ)z.ºé~tºšî&+-ENG=á Ho8•]xj–“gu±þ7±©E>Ø`Y\Е^q \pl¢ ™W'¼p°wuÏ%ÖÜÃÈ|ôKpˆG í´µÝF.Ì e .Ílz[3ÎtŠ3Ï™«.ÐAÝ” }Ž’J5… ÛG>Û]HD5R_Ôo˜$ÀÂ#oè@ Þ4 *‡²RŒó*ºÛÊ#RÇ.(ó× (@¶ÙhsJYb‘BW|íÊUtµvÛoÇ xX& þ÷^(´ò ÜŒ]öÙiC.8á+ƒÙ2™/÷|ú@3ç¼úq7³¾z¨Ëþ³ÐµÛÞ§€r;NH¬ ’ɨÀ„Wû fmáþ€ªxôj4øØ³E,Ä’?vXñ—RpƒüØó=?¦p„ä!¦8EPÁ”…´0‚¬à3¸Á~0„ ¼B—1W7Æ=.q’ ÙåV˜ e…®E-€äiB†"R‚&Dä' F^pÞŠl‚ ¹Ä=ü4ᎀA ÆøHP|àÇ >ré:\\_b¸¦Žm2D%«ä„|Éîü„î@’b‹|B Á¨B($R´‰ì8è•N¡æT¼x"®P%ñ޵{Ä*n0ŽÇW+ƒ˜S>È…¡œÁ' §Rþ³AªÌgd–`–Ô•ÆE¤qÚ ì7"6ÁÈ™ƒ‹ Ãy 8ð‘2wg âû<\D$ЂÖ0c9¬dE§:”­þ@‚ äÕ³hfDB LõŠ40cŠì$#ÅXÄRB1ÒŽü´IØ+Ò L»Ögõ3«SÇäB+Ö`•u‡iíí<ÒŠ Rp À£ÁÞA ¼â£ „‘EpŠg¨ywiÏ{â3ŸÞ•ÂyÅ-"`Ý–w¸] eswÝV·ÅŸ¨£ðiÙV”¢Aj޼£Ò1rG`]‹à¹Y1Îj7™ã7õ8sAŽsòQ¾{B!Ò5 6åøÈ`ÎndpÄÐ{ªsDóÃ>§)Љ+ô¬óÎ/mÏѬpg k‹ þÉ%lì‘"Ô—#UpÇÌ-R \d ø;à/øÁ¾ð†?<â¯øÅ3¾ñƒ'õÖÿÜõã~ý¡aŸìØÉn»n€Aš×H1Š`Žì¡)…îF‡³¾õ®=ìc\j­:Ü^˜¼  (­#C(ÁÊ1ÂTg$AóŸ/ÿ\F?ãã&7rª_Îëk5ûÚG?€Õ¼S2@@úi&”ÔF@3x˜ðd%€y©T#ÍBRýíÜýáršÿé”ÿþýŸ¡ àƒ ªTÒÅœlX°@üe ¢Ñr]†àpèŸ0`L•à ö‰3æ#H 2¼“ Dph:¬ùYHG¬CIvÄ>4@_À3X$lpÞ_,ÀEb`F*YvUG&ÑGzRHФG¤ã;ÂÔDKt4¤G `Ÿ`ã`­#´X@*p_ôäüýd‡åM ¥e%%RrD?ìÅ;-üB L—GÐtþ„3ìÙF„/r„NÂF[î€>˜AW\A)Œ¸Ã5ÌW ¦b2¦cJÁ"4ƒ¸Á,¼ƒWd@¨J´@Wp¦g‚&Xz…XVYÒ”YnZÚ‘Z®¥F#Ô“¤€äÝF(>xGL€,t7°ƒ€xÄ+Ê,ÌB ðC4C6˜ƒè¸=¤>|BWÄÐE5W`§v>‰i FjphˆF,y†Æh”FiJË;£¸™â>–¶f½&lbÄ€µ¹“ØAz4x„TGÁ!}9”Ї€H´ˆ8¦/lWìc)\§-Ð\hwf¨–¤ÈŠþp…”P‰•`‰Œh•\I{º'íÁ'A¤æC­&Ù'ág~Ztb=‰C®}„xŸ$Ã9NÄ1x°#,€ôÁÄC!tJ´p€‡€<᫼–ÂÆ¬tH³ ²¤€)$ËŠbÕ{Â'Œ2”Œ^‘Þ(Ep¢'¾Ó D¥Gà#tÄ#€AG|~Ä äN8fWPC7|Џ HhXl<*lLLl€ŒÈŒÉH¥ŽLÉ„N{ž&s­):µé뼩Å©œJ„”hÖ;õÀ |DЃpD1 9tĈ_Ì…6Ž¡r)„FÜDÂØÁÃ("/¤Âþ*œ á «²2ëæôçTÎådNdP+æP̧¦)<Šj9‘*ë˜*¡jªêVTDrÄS™_H ƒjªV‚IýŠ Ã_t ´:ð<&pžöë¿,õX Â@Й‚*qy«0+ìší‘kªž«;YåŸÆCŸƒ'€"°¤jïžiJìdQì/YlΈëì8W¹¢ Ç:S< JUêCp4DAG@@|Ä ÈŠ‡¯Î«Êæ!Ë&–ËnÌâŒÌ¢ŽÆÊ)¾Óü¦GhÁ3ü¢FP‚ŒqÄ<ÌÃG7ìMÊ.­ü5íX=-&EmÍLþíéTí í; iHÕù‰옑~ÃÚ²­ó¹­VÁíÉ-al¸Ùm~¾œuÄ ´ Fð&GABnă@®áâê”âÂã‚ Ý~ÍÖ¬¢Èæ;Qña”8Ã2ðAÝeD DœFìA5ð-6øÂ˜¼b,*íéÒ`êÆÔê&Që~Ëëò äÂf[N•3 Þ¤3aÂimD:lApäÂØEPƒ;h.F2x¯F ÁN„«”kù–1‡±‹ñìQ˜‹ÞÞF† ÓQþ"‹äd£;mžfÄ0¸Ç)ð‚ÇNDPŸÌAÀ:VD€Åž"/2#72„A)r |¾ *† “Ëç£ò"/B-DBHñRHÁ]q„3˜ÃíNí±Ð\!P¦±®±œ\ò¸d²5¦­¼&ÓxŒÂ>”~aĦp„)þ1ŸE\-++%,ãŸ,Ç -ß/óž`%“¸ƒGLB¸C=h„ ìÓFùvÇIU³5÷I3£æ3“[4sRÿ™-·b€8Ó9¸KGxƒŒcFÄCç^Ä _ÄøB_R@,¬³º´s¨¾s¡Ås›L³µÔs!ƒ®XÙ!€G2˜Ã0rD 0žI@+8tº@ôÄJô«U²Z4ž`t!ªJAWQˆ2F,C‚^8¤òE -|„^VD€‰©ô¹°t˺ôÆÁ4þÉô'©³Ro‡‹!/ünFBb„èCAânG0‚WÄÂÈKUÿ S;­S÷þT“›TÛ Mƒ!:@å†R ¬oF(Kj„5(›FÔƒN_Ä:€ˆF€ÒZ³u$ãà$gX\Ú\£I]aó¤ïбF ƒBGxÁÙf„Ö´kc³ócóadïàd ZeUŸöGDƒŒ “4$4F€Ã!c„(°–F88nĬrÄ*€ Y„ß9žr/7s7·s;÷JPjkäjwKkCÙk›Ée¯ 5Í)%@jD$÷÷Òåw4ÁvE¼€"©ž#¿7|Ç·ë=y'ÙëðQ4›d7vl· öàÓ)B%\”p¯°Dìƒ`oD!\ÚF| WKÄÚðó]@}K÷þ£quÿáu7³SlËvGÌôYA0ö gDÔ±FÜ4EüA Sx7Y¸E´õÛ¾µ×u8†}¸uø÷ÿ­›(ÂY[Ä=Ä$F ±"qIWÄ)„4G8€,óÚøUáxEèxâò8åù¸rÍó” ¹ö™˜öq/gkÄ#ˆ€Fx<( EÛF4B3À8Edvkù-qy‹Þ7˜çž˜o™ÏZˆ‹øFx„™(-Ax_±wˆ;èyDHÃÙy€½Ùáúù–_¸pe8~¿Ž~Ó¡§[¢+zFuRŸU2ŒuEƒ/PùE$9kDQ{.© ·§ƒºóºþ»h©Q¡ÇZªܪ³úE8ÀÂ)Ån["Ô)E”‚°ÝÐx¬;ø:G,Ða»K »}û Sß±Ÿ[²ݲ3{EH‰µÿQ*øF8ÀqSD 0=ÐÂ|€F4À®[„¼àG¤mÒf¹¹ºc¸ oø Ñg*¾»ØÅ»¼OÄ=„Æ)ABtD(`@0€¨Ã ­E<;ü­ŸèK4”{$•À4(Ãô¨lå“zÚ åÚÿ\Û÷ÞÛÃ=;pz(¥í…3ÈpT@øiE$ƒÔÁF||G0º£3¼WH'uZ§¦ ?@Ì“Ò(€8R*teâÔ)øÉÁJÝkRø‰’þ"¼1Þ¤´ Ï– sh.JQ¹’eK—/aÆ”9æ…Ápæ –%€Ÿ?:”hQ£G‹ûS‹iS§O¡F•:•jÕª ²º•kW¯À ;–lY¡dèT»–m[·oáÆ•;—n]»m³Hs—o_¹iò¼•¬C5ll‡“—•Ä|S£ŒI3'Ï¢E¡R­ š™bìÌ’âkËJJ9}PµA–#©¤à”lîL䮀Sk*'¸¦9œxqã,m²åi–ysç^”z•>zT¬Z«g×ìsïߢõ;ž|yóççÐ}û`´ÄýâíµÍ³mdBnþ‚;} ±« P™8(°•NKm5…S ¢Ô&”BŸP¡5Ö*<ÎÃALn­åÀ+±Äè¶KQE§®[ÑEéº3QFïÄsÏÆqÄQÉ‘<+Ö‰+7ÞÚ¡gÜzæ ƒ©‚ (™gŽxâx£6ÖH‡€/d¢¦›/r3Á ¬C¥H„;-ž×P“°Í.¶àÆ¥jÄ;ñœIDµHœÑϲP|QÐéZÔP©büSQ±jdÒÑG!e (#µë$È3bLÝj¸Î‰¢/cÚ ¦‚l‹Œ.d"€$‘"’-ì¸@ @è!aø• Un`G…Wþhåž=t@)‚ ‡„Ã)`€•{¼˜€ò WÜ•öÔ©ÏEÑ*ÐCÙªÐvÛM4Ýyj´Ò{ñu¯BÉ÷¼ y«^Þà±·f¡„¯!fA!v Æ­Ueú+&¤@+.¥È?ä¡"Õ>PGŸlRYÃb?B Å8~$|ìÙ"3W%»×g<ËÍé\zç]Þ£™zéAå%z^{ýZêºÐ\aê¶Þ$.V*ykÜÇoâræàºŠ)ÁcüÐc˜‰YýYî¹éþ0hœ†vzQ£—nWé¾]lZïE¡¾ÚðÃs2‚Ï)SâzG¿þ‘ƒÓ¶( /2râ€2Þ¢¸îÑI/Ü›FìiðtùÜп]OQðÕý,¼ñÛý'p&Ÿ=È{ä·’ ®\á‹ tÄÁ©˜=nÓ©¯^Ü»wRvE[ýEؽÏnöíM´½÷óÕtЇëÜ¢‹xÜ‚„H¸$Aò®zºÆ n =ë €Â^ÞÈw¢¥„ïPàcàtÆ—À}´ôÁ#à.|‹.à×"TÀ-F ƒ&àRŒ¾C'ˆØ„!ÀΆ5AŸ´'AuïÛq`»A:‡‚4âyÊnÜ® 숋5–±B9Tá- ˆþ_ Q€+Ba ÁXÃæpˆßá!«óC4ZEˆe4KG¿hì·ƒ‚$Ƴ„1A'KÐÉ0TøaÆ.Cˆ9t"\à‹atäÇèF®ÑEj¤äTÚ(ɱÀQެ -°O†¢na@u¢]ü!€@F\Y^`|ä-KIMz猗ìŠ%}ɰì’Fiñä1ÇS‚EÞîu€‹2öñ–Ãèä³Ç3º=·˜xv)†/Ö°'`…spÃå9syCs‘‘˜€Z`0³Lx6%“í, '‘™O¶\"+·ÛàB„Xªå oS‹(01ƒ| Fþ[€Ð¿ºôÁ|T‹9"ÂBs¢“£sÓ¥=ÍÒËyREž#­'HÏbL}®T.ˆ.n*ºEmE)Ö²‰4… )€ ª“ µ.ÆXË0z¥¸A ‘pêS¡U©N•ªUµêU±šU­n•«N}:…ÆN”E¤#•JIçyÒ±þŸ,]©îžÑI@À-§¸ŸPKá”G ¡jQQçBU´¥ ƒËl‘XÅ.–±uìc!YÉN–²•µìekåˆu­D)«Y¡‚Vxªµ³muk>¥84Ž Œ|Ë3ÊI—G¤€)8@Å4À –4À¡w ƒÚÒ¬Ìâ´Å… þ;«®w‚ö—Ya.UH»VÓדò4§•¶°:Q€×¢€Ô¢À¸AÕÂsÌ´.ì]K°0ê·ÉËgŸ›4çæ7*Ñëté{ÄiqÜ d[Ä`ѵ4ùQKrÀ.„ »ÁÂ@å2 ²¹å4˜@€Œ\û¿ùm0ý‹Rƒ¸‚¸@⸳E  hKÐ F°…®„]æ`ŽiÃHr‚¬€ÅÔñˆ}RâçžØ—)銛|>S…‡sE|ܲ…'Ü%öø[.€‡nÒ…mPË3°‚‡0 £XéÀ!êá…Ëe9ŸO†²”™þKåKZÙžXæóí2€¸nô@¯]Äñ·P£ n¹Ç!êbתe6ÂP L?Р4% ÝNC‡úpÀ " G„¶eØe HÐ3äÃ-Þ0j]Zpŵ@Áü¨Ölâ2¨³>†ÇjOŽÚ¾¥6ë©×˜jb®ZÚSCä‘ :×lñ†×òŠM´e x €]ñëµÀ€Š ’Èu»“ÔN®µGŠm4j{—Üæ·¿N¥11O­ÀånEï®EÑPp\Ú±çµàª·x $ðüˆþî,Àç)p \“'y¥ªà:áI;¨p¤T¡þ°»À¢¯|¹8\¬1Ž5³e«‡S–”-ËXÀÓ¡u©OêU·úÕ±žu­oë]—úà e£ ž*ï!Ë%éò—CjÐE-ž €@jÜ»Zp¶ H^‹ÆQábAu±Æ‡áâ ¼Â)²€-&FÌNžò•·üå/¦¯SìIY.Iº_Ð;ínTûÚÅ (1eúð¬q7„2ˆ¡-¶^Ë%VÑNèAïs™œ\¸À{ ƒ)÷ïÙ"ºŽ.\¾Ø|Ø;¯ÜÑ[Åì,}OzuähŠ$À-n|9ƒ¸˜;A[¸ð–1³eõ  Æq¶þ" µðÅ$šüé1Ÿÿwr~ê¢Oú¦/ô°ckáú†(û´ïF¼ÜÀœ‚`á©.Ì*¬l†¬*.F‘æ"v§¸ˆ ~N-”¯ÿ\ð8þ¯¾0(È.˜ªP‡pÝ"fá)x æn.GŽ¡TÚO' àØÂÆÁƒ!ðž`ø çâ"îÂäŽôâ`©öïÉ&bófÄ>ÏYDô0%hy=\ÀW "îæq@j ør/'P€ÙÐ`J.†á.¶Œ ·Ä° !Ñ Ÿo8«ójЗn0|à0äþpÍ#‰¸ ) ÀFð "`R\¡ÜÖB -Þ¡yä À¢ –âB|Ãä"°‚ m£"±]â ¡/ £l ÙP¿ ð ‡I}¢=q<Èà!.ÀØ€@ü Z G"å©.fÖ¢˜,'p!š"¶dñFðÁÃä¢1‘‘¥q›Ñ:Üpú6‘|¨±û"80Ä 8@Öï^¤ÁqÂzO-:@ ׂ @-„!šL>¥-Ä!†. ø@þTe ó±÷1{ú:˜±3Ñ{r{ Ò ï”ìáJ`°‚z§ Ü"þÝÂäÏ Ä€)Äápa"ÙÂБ/ö¢!°X²n’(5ZÒg^ÒäÖê/©&cç&i''u². !, ze ¢¦q-Œ uÂL'&N'Xe8!.4Î.fÃjî1+[¢Î°bˆ#ÜA X‚Þ¸²+Åå++QìÄ’’ÈÒuÌruÐ2-û °*+EpŠ.ÒaVp@g-Ø!¢ ¬.*@ýb€„“&, ¬+ˆƒNÜd2)3O,3&3s6p:sp>4ï‚Þ #ó¥ò2'†à F.'’•Ö¢tS-ðÁ  . @ ¼€<ždèl &úþv@Ì@%.¡Wâ°â ²ÁI¡Nn@ ð! öa% ‚@„ 8%û19Ñh9û¦9õæ9¡³.\ è£qÖ` ÖB%ÿh-k6á" À½|üÀ"ãaÂè! ðáTâðS Â5¢!êD"(Â"TâpÔ¶á[t&ŽsAg’ ti Ôi$tBçb€Á_Øa;uÖ¢’g-EsB ¾áîØ¢ ä@sÈC¸Â(6DàR€bAxŠ€ ²Àh4Dƒ4LÃNèD8ë$6¤`6jC Ú°Aü/‹T&ŽTˆ–išþ”hžJãâ$é!ÿ"¥ ØsØâ^Q-´üN'æáä"¢€Cí`À<íVAB$M"¤N(ÄNTbôª R%uaIÿ1´rô2•^6•SáÂbÄ_†1'ŽAsÓ ¦ò.°A ämïv`-ò ßâæ`<Š¡xqb?éG¡—iz£¯zcg€™†q•ñ€˜VË/R à…±óÖbáö¼–.¼áz×.– R@'¤Áì lwS„;Š„-1€…¥€ÿ„…¹7 .ïE%ß@uùâ’ w‡ÀÐk¶àÈc,àl "„‘8‰ý9™xúœøE ¸v¶#eà@‰*…Lƒ¡0@-Á6sÂÀ4.!Ö‚ ì ö¢ la0é"˜þp-FÁBíbÛŒ”3ãxôæ8pT8 ¥˜{ ‚t!å>.¢À.ƒ¡HR-†¡}u‚` ÔÁ”µ.@ÖQ'Ô£r]v“Ï©“¸YŸ"”W¤Žg¤”q×j+RàK!Ö‚äÏr8"€CIÀl± dÁˆëâ¡'øámS4„‰¹€Œ™Ô>ô”YE˜YFœùqïªajÔr¢»TÒ®¡‡ƒAŽ®† ˆ!} ¹-öÀ*ïB“ߞߘY‘¹)êYvFyó™jÁü@bó Ä'Œ ”@-dÁ•ë€=ŽJ† )fàРŽèb þ`![u"A°vu›ª«Œú¨‘:©•:©£ £)užù«£·ãžËçŽñ8R€R‘I.âb¼(wÕ`;‡Ð ¶¡)ªØaºéÂö-²z«ç±0¯®íú®ñÚ²ÂPŸz£9úYAªK$¤©V¨!åN5'°Áš1·³4ðÚ¢Æ `A :`Uãâ Ð@çÜÂLÔ¤¯Zj–¥LØu¤Z;<c󀟣æ"'PZ-ŽU-H ËØ¢XưT. .ªrBûjF¤JpN[|>:W›Z‰€ü ~}ääO¾7. ÔbNa-È9'ŠÁ¾A$ùþ-a.áÂÕ¾»¸EûåÙ¯±S{‚¬Ú½™d 0™l..àÀp"â×Fá-,€ Œ’x¶ÁÍäB=v¿!å¸í)¹ûf¹«£¾‹IÂï…ŸºÔGÈ Ô¢2À.>A†ª!çbÒ/eÙ¢ ô@BÃï…ÂÛÉ—éCß㹩u>Gds$Ú'Á½ ˆêêw-À@î"r@êBqŠ€ÆóÅÆ‰ Ç‘FÇ!¨¹£ÏÇ9u0ªs$ÞV´Ù`‰r‚´('f|-Š! JÉ.€\Rà|±¼Æá»Ú ÚÄ›¿xœˆ¶«òzѽÑ/Ï«ùþ–ÉGpA® Šüj €ŒÝ"ÚèBDé.¸oþÐáX¾kÁËaÌ;Ï^ –:Öe}Öi=«@¡Ÿùb J}<—.´-²u‚ÛK÷R.–v,“°$KÝF´|—¸ühTý+X]ì\.ú‘ú×ïøÎGJ Äq¢ XA'†` ð-  Úº-ƒö^À/œÎëô}ßù½ßýýß@þ¢]“¦^ª=ˆ®ʲ}Û©ÛýB=,= €º!5ÊsB ^ '°ÁÜBH.2 ü"«Q¹¢%ÏÑU~åYž±ü°^’ Þo =¿½9žáþÁÈáûÂjÉG•ÐY-–axÕ¢Ö ¼WY.†  ŠÀå¢ ðl¯¢ÝY穇`>ÐÿmЧ¬æŸëæ™#ç±~†xž/€Q œÝ/`ƒ 30ì(>Ø2*^.¤¡8ø.Lpù¢ËÞt´ž¯!Öë ì™Kìßh»@Û¿€Îž/¸§%h'VaÆp‚¶6ˆ Ée¹Æ]-¤! œÀÅç"[6-ð¯>òë¦ðѰ¯åûโñË‚ìa¿z&ÿ.”‰€þ¥u"†Á À 'NÁƒt¢@€ý‡bŠ‚e7Ðv뽈xçÍYy4ÞHSz0îèÙRî…¦b`’øQF ±t¥ËBôdF«8 ;¬Q¢A&\2WdAZ`õ •Y!¡†.1òŇU“ £TyâDKêD'q4‰gu, ä"~š$#Ž‚Ödã ƒêøg¢"µ'Ðþ{yFÅ <Èp£ìÌ¢$“ -ÒŒnÌòÎBãT¢Pø">Êô£Ð%¦¡vƒNqX¡1x¸S 5= ¢k}­9Ð#u tµs¬@M°¡M0\HaÐm5À L £D•\=çtrð.ðwç£ê¶g0}*ªh †ÎëR¡ôÒˆ(¼‰2Œ£ëb”0ôG;™ú'Å~D‘B,ðŒáB¢ÐD ÕÀƒ­ -*˜ƒ†5RÜS+jä`§ºÀ‡,@ðõk€ 0"±Y]"f+™ ÔÆ ÙÂIAÃäXEêÔ@D‰f³fœ-9vZýþN7Ø‘ZÛ®èÊ«¯Rpê)¨ÿ>Úî»úú)cÚ+·yù¾Í#¿þ®]Õù­P6î˜@x p²Pœ" oHaõÀRL`§BVûgõV‡¢.ðˆ‘UàxÃ6ØXS…P<ÑÄJ a ÖD„9ýÙ¬Ä!YbMµ­QÐBÖ:áäÍ- Ñ… ‹" ¯E-®DÀNæ¸ã(ñƾˆ£2Ë.ì0ÃCÌw“m'†7Ü-Õ=/Ýô‡wwü/ê dû1üMSRÐGt¢…LÀ4tÒ\夸ËY®rV»‡B$0%‰Xå€ì ô€þ{ÐCðÀL`³8Dc ûHVÙax`ÙA¶†@ÀÄ:†@êa$s ¡Â5R‡ ;˜a‚œ“‚ç¬!8™Àpˆó_ŠÞ§?ùÝÏPöÛ¢eò—EïðÏŠ‡vp……° [H¶@)‡¨# ùÀ(øÀ  ‰1 WàA ¬F7¾Žq˜j`ƒà :Øøàƒ:H'5аJäÀ’@háÀ !Â6ò N„’ à¸PX¬¤C†ÄZÂq l  )LqŠT¬¢®€…,ha ]ìÀ ƔьhàpˆTÈ’"1þ>¤`!¼à” xÀ’ñ?X #ŒâæEót1£9;3ÆqJ¤~C Rð ¸@ 0Zp HLî–,P0àà…ŒãªÐ=ЊGÀ¬¸‡f€(èA „aZM/@™8C'3ÖÁH8F2–á hd…°Að!o¨#7Á(F‚aux¡ ]ˆX†ð„`æá&Ÿ U”é"D\5¶°Xàc Ü ¥ H-¼1Žò¼"G´¿wzì Ï:Ûúwª•1ñ,+D :è¡ &ð‚¾qÀ$X3ø°ÇbÁG)" ü°ƒØ¬ðþø!y°Ãˆ’tøAT@­wÈ!i,$±îè£*9€ ÆBKžz ,MðŰ˜*/€«0)DŠl—°$4` @€ €ìãóˆG;ñ‹ˆ#(sÅB9°€!#-©gŽ‚4¡vÕÓY[”Ö¹v†­pµÌ[당Ê)um¯]«Z`•è úЇrª…¢5b’á jŒ=ˆ£ ˜0X¤€Š÷ÚÌp†&ÚpYäz S7b sèãq] íhKû±þ¥N9÷;ßùáW<÷ÝqMô‹ã¢ô·ÆdŒÀÊX°‹þ¸D(ód‰(Ñ­`!Áè0ò a  ÈÐÁ ­p£¸ˆ+pÁ-€6“ZTâÀ‡4ÀDVуÜûø2=Þsf†‚gö„xouöŸÖv‹ %§´D‡(SA¼Q8y+Æ „ÐÞ p¸£¦6]'>Ô*À.‘›3r ¯Œ,Þ$Ú¬ˆ ôfèëgŸô9×/²­O2äY [!KÑ·öP¢7+K Æ"Š!‚CYG-±rC†Y€c ±(lzjŒDV'nÃBÍD>wþµQpÍëœì$Þ=ñµ»“2èþ­[ØÅQ(ÈU¢KœBþ ¸G0ÖÁÓ4 ã2xAV!Zd ÐSE(„xðC˜Û\½}»Ý÷V ¼éM“]ÇÛÞ%I°ENä~ˆ~Àƒšt‡}d_†î‚ñH,! ² FŠN2áæ%Jk#q`‚|XL 7̉Lò–¯DÏ(×õ¼»þc@k½G ¹:¿]%\`ÄRÄVˆA¼¬¬é1Fï$~ ؃ÍX!`Qõ›ë¥vÛØÅu°Ë»2ŠÿóáÉþ£ÁZæ"ÐâÐ] ˆ‡\()„XÁ†&} 0ð¢Öؼ@½…R‹Xò…ÎúãEròÆ×ëëþº‡ ˵þrÚ“ò®! (ÀA 0ÈÃL`-i¸á ì ¥@¨ai¬4U¢F2Ôá‚EÀKà…_gÛß$¹×½Êyýû–ýþ#¾€0ˆ =A[Cñ °µÃ@z¶‘ó°l%²Ó€ë€yZñË€[VGV¤~ë×~÷~¹%§7ã` #H‚%h‚'ˆ‚)¨‚+È‚-è‚/ƒ18‚@€vU¢l¨"["]v Ã@2„h {Åapm¡ƒ¡ý§@-yñ` efØ>x{¨xègxoü Œ †cH†eh†gˆ†i¨†þkȆmè†o‡dØe¸õ€ Ññ×lq ® ¯Åyé@;Áðqaö€ Ê Ü zPˆà&xVˆ…_ë‡{‰×{2Á…{æ…îÆ/eFŠ¥hЧ˜U`~  ²¡ ºssà 2P, GÆ p‘äÀ³@Q ±à °‡~a ¤Hj Ñ(ÓHÕh׈٨ÛÈÝèß8~€‰šˆx¸xæØkbGŽ#1ЍèŽï%Ò&.°}PHHpP-2`Ta³=a‘ ÓÀKÀÒ@_€—Œ~!«øevþ2h‘‰‘©‘9‚gx먅`÷‰>Š¿ÖŽñˆ’)©’ázÀCM„C+@¹Éè 0é/.¡ î & £7°’I©”Kù‘ä’]7’;V’¶v’Ki•WiSÒÓ ±! ç0ЃQÐ ¹wÏx¬QÍÀ.! îmÑ –E”Xi—wi3M©‰O‰rQ‰_ShU‰—ƒI˜Z!úÀ“hˆwØ ë0r{D^  HÀwyqè 0Á' !;P˜¥išm¡—ȉè¸{ŒgŽ€‰g‚yš³y—®-ÀÚÐP éþÁq§“¶nÇÜ0…ð<° .Áh0±Áq~0´i³™šY¸š¬é—õ›A&›×)ž* øÀA´!î`}ÉØ[ ¬¡zÀì ô€,Óq%T7žz—Ùùx|IoÝ W߉cá)  zŠ(–,À @ [ÂeÀŸ‘0‡Á0 ¹—`]2_RD€K Ëá|Àmà 1š”zxoÚV º_ *£=J,Ö@ˆG%R0 " Áà ê`aÐ àé`ÙÇTÕŒ>ª¥îH£cg£¼†£ì¤£òÅ£[j¦þË € x'4Š` /Ѐà шÁ@ Y’aañ¦@Ã`}L•ü€0;f±÷ƒ±æ¤±o ·ì´0Á3° —D'~y03ЖìÔ·uó·Y¸œû/P[fÐпþQØ€ TðV W MÓ4q p0‘ï8LpB(¹³´KNžû¹hµpO5 Ð mõºr»ú3»Òë¶ðhKƒ4@ Ý z@¸ÀüÙ¶¡„[Še ‹î½äk>륡ë3Qå&ÞË{¯©ŽŸ;¾ܹñø2;0;ü['x j \ðS‘ßÀi(Éö€½›+Á×AÀZ§…™ðT~ð fP Í™NQÙºµ0¿`Ã~ûÀpÁ+Lkðh RÂÁ ¤PƒI¥¿¦Ø¼â¥’,Ä¢ÑÂ-§…uˆI’P ?p 5Áþ¹@ÆelÆglÆ6p½?1’3€ `¢àç°·C »?\­A|ÅìÅef è)6ÔM3X€¸mñ²á=áаñhÅ{Ì.Ô ·Zx ˜äµ§@¹P Z`©‡ 5ÒÀ>1` %u!à µÐ k@ÑQ Çz}< Å` -• KÐ1% RPÖpZÀÜà à d@fé°íðq0sPw°ã ÑÓK­ŸëÖkKuò W°MP éà H#ð …m؇؆} µp * x´?„I×ÀÝƳ<ÓšXÓœKg Q¦â  × æp¬á`D à^À \`:W€:©þ# P ÎÐË ¢Ç€°c}ºÈáGø°]q@æÐȱ1L  yເY1 ǰI‘ÉtàîIò@ö@Iˆiº LÞOÅTA 0×AÑî¶>0d»À Z@:1 3aAýҮ‰»p ã}@Ý`·P æ<í <нŽg× ±Ù‚ÛÙR`›Â!kµ)°jnbÇPÞ#¾[|‰øBv0Brpàì`BhÀ4Y O› ÐP°) Á -pR²Àô@G{À~€x.À8 ~`ÌØ° G ZP€¥þj§Àü (nv@,þâl è€e0áð ÝðF[VP Ó ÏàLÀÈÏ`Ñä ë-íýkÈ:`Âø] 0\'C%û= ]€é™®é›ÞýíØlÌÒ6Á?ðTP ¾ ¿0O0 ð¯ë±.ë¯^Ýû3AËx3ámÛÙïà© Ö ê` Û@„$•.ÁÇÐÝðac HhÀHÄnàð ò@ß”ä’ü@àä­fä €%M° ’ Ëp  K Œ Éàˆ J°àVÐ pÙµ Þ¨ôþ{£F°V âÀZD€¦±Ë ÐÀ:Ë ¾m Å ;§¸³’À ú„(Єè‰nÉÕ’° 5€ ? ®~ û#žþß@Á<ðT `]°Ö·? ÇàôOõQïôðÃCpëá»î´Uu=àÀ° A ßt ÕD¶ %DP F0ÕÇ /uÕO YÍî×à ÎAn%2   Ó€ lÑéðPÉj•Ñk5…€ÞðÇmP¶rn`Жµ R +LR+v"6dÓ+«è¶¶»`&«[ 8@~uR4¡ó<þïóê5q´p€I„° p K½0Ô üÃOüÅOü?° t W¹þ6ZϳUµ$sp A º X^ Ú 2€öìÏ ÿP2@ 0 €Ä"B0@Màà  ãï° 9@~ï@ ˆRâÈ Ž„ìù ˆŸ RîÝ0OJ£‚q$èÀG¡Ž$YÒäI”)U®dy’ß°`1cf àÅæMœ9uîäÙÓçÏžÀþÔ"ZÔ¨Qµ „hW Q¥Š:ZÔ@­$Rµn• ÅL­S'ªŽ5Y´µ¦m¥T%6Öæ ¹bTRþ™ôîåÛw¯µ_¤ü Pĉ/Ö)A†Ì`dº´¤\ÙòeÌ%/teÂÄŽŠRj¢êPR&ØÆ YÔƒ”_B¦]ÛömܸÉÐkÈ=r·]O—iă @˜1åѥߖÜÒÔw%¯ÇFx€=yt Œ¼nQÊöó!ê‚g-ó{øñ¥Ì†L“ñ}üù½M[´J-D¢Ò‡‘ZÒG*7@æ–±®ÊŠ+ð ,±ú;Ê, «ÂE+!j©BE¢ˆJŒaìÂÁš ‚&°Á ;L?cìÉ1Ȫ“ïFqìB‹®! |ª©`$ ²Ð'^ ªŒ¾éšŒ®{þxe'££F âÄ*’©òKâl\麄ÑB;%Ij!ªH*!ô®»! X#G<óDˆÉ™j’ñÏ?ùK‹Á]@ÙÊ‚ZþàGˆú%—±Š ÃJ±( /%Š©ü0ãu´ª¡L´f4RUuUVS©eEÁ«Ê0@k‘F™ÄÔsW^óÄr–„ Lbk$ʆ-¶ÊsÐàè–•6&]SBϤk€gN <ê@(%¯Ã¡Wð8³Wv/ã3ûl•—1AÓª)©’MjÙ%-'åªÒ /ÍôRt€ƒ"¨å“­F©ê.kâx«X^eQÖ£þh÷ãÄp¥v²vK6y¥L`d,{wÚ/û9ЗhaVî8œ«Ùfb«=)ŽXЄš‘01³S"‘¢äHÇ@bC @è!aø’ôôy¡ N;¥wãùlžê (ô‰>H]£¿€/îê+K5=8Eg’J†¨{Õ*HMµØî¨2†µÅY_DûñœDŽŒä±+7Y­íÐ% —•åùËwBæ‰Ïskr(¦ôb}6é Á v­˜¢9=é_<A(tü‡ ¾.wäHá Ë›ŸÏsxý„|zµÇ:A`:ªàÁº'XÓZö¶pcDñD‡þ_:ðƒ+$|8ŠâÃW|c§·ß É]w~þ_f]:olxÀÿ ƒUD…T2à—ôW¹lñ¯re“ÞýÎV=£xc z¸Ø4|  ºI qÂ[ÁR$>´Ì`HØFgƒ5 ¨o˜AR 7¨i,Võ³àãòG9 Ñyþk qšà‹¨ À$Ç7 LÐÀ‚}qlì!Ú0X”Ën«¨ƒÐÒ=»}Oo8‹…œQ‹CÀC+hà† l€-(¡8ÐÁÄN?»Ío‡ë"Ú~¨EDNzRTÎ6á¶m´£tÃð€ÛØðF:ˆÎÛø‰DšŒ‹þ…üØ‹2‹Æc{g¬…1–ñJXÆR–¹øJ Þ‹ŒÂF.FÃ48#ÊP¿È? ’qs)åuÈPF“]DÌdnȱ ø¡X‚Ù²Q¬®šN¢¢4ÍùžQ:ÓV¦Ä Ü1ÂgÌÀŒci@>ìyO|æóžWùA.çi!Ž…“j†–ÐdŽP™3ŠÇÔi+hžS¢7¢æ8oc„P, ‘'±´Á‚¨„#­R9'zÒ•¤ó¡ÊXª@ héEMmzSœæ”T·(Õ w™k,_“’E-‘–„ÊO‡Ëlh3W*£ˆ¢TªÂ"i“ÌpÁÂUþX±>=„b‰Um’I§zÖ=AÏlO‘)kA‰˜n|)â)H¥Ë6¦Ev“DÑ’Ô@.•¡Eq([oõ˜\m­‹-IEÉj›C*È 5ÙUÐ#*ü€AKN5DB´£%miM{ZÔ¦Vµ«emk]ûZØŽÖj­ aóãVÄ´µÈeUÀQ j€a nq‹ûi$7¹s°6Ô@*ô§d)Uì¦pôâ¯LæRûHHÛ¶FvðEyÍ{^ô¦W½ëeo{Ýû^øÆW¾ó5ïl?[Ö¸-*Ï8A&pq`ƒë €2` ÍF% ’ØÙ}£s[DX¦þp…-|a gXÃæp‡=üa 3P&k ï}¾˜Ë.ÄÔÎáƒñnì¢XQêP0äXÇaˆ„1|ìã AR˜ÁŠaÌþ´(àЕq‹ïúÑ8 B•­|e,fE[è’›ZbI. s™Í|f4§YÍkfs›Ýüf8ÇYÎg±ƒ£“ È@ŽˆËB `g@ZÐÃ!1˜óE a}1í@-ñ¦,c@C+z >BÜbWFV™%åÀ!"¶Û€¤ZÕ«fµª¥a÷}úˆÆä}k\vé+rP„æà# E¨A( qŒ\'[Ù-4þ­òÅeÌ#¦QÁ‚a~,A ¶Ø‚ìPŒ¢,áoxG?¼!pì!ïøƒ8À€Zð )½€Â0–äé’%8Zvaƒ\\à'øÀmP*÷ñÐÙ‹±õ²þpÞI€xÅ-nÀf/<(-­Ê$¦aÌ IhŠò¯]耻8š°Œ_a•»ðB-Q¢à ·H†r1ت„ºT¡¡>ˆPêÎ5Þ3pÆ%ÈRX¥á§zÕ¥“Áê[çút2u˜ÒP@#NN2ô"ÎàBš0¼!´\ÂÈA”b4b{\å:jP¢_à;¯Ui5þ¦/EÓ3Ä< ÈGòŠPnrÍ`„Z¸ ¯3u- ö!¶ë£'}0úb”^õ¥ÿ:èobʽ’Ý H€o5H†]¤!àX4¼p‹^T-*˜Á1rc2l/ºDÑ.¨ó}bÚ/0Ê2xppÏÃaµè…ºõýn)£ ã?e€ü`(²þ¼ë#úÕÇ¿â€äª·Þý¦<Ù£âŠxû@ü¸…CŠ|ðøœ9£H¼±µ‡™6;X‚cJx‚ hƒ<À}8†¢M)‚í)… `&÷û‰©Ã? ´ª‚œAeÓ?×3¥òþ?¸è…_øA L˜È…[g‰Š+‚Ô(›+ L’iÃ…Zp ¾@†pàS(Š!2 0 „8¨‡@ð†‡A¨‡Ið†x«…ŸŒèj¿¼‰¤A;$©_¸C>4=SBÄ£íQ¡¢ æã‚Z@Ò9¥ ºç£ZP²Ë´Uè—ª˜ƒa80†>è% †ÞÂqx'à6$" †&”Ã9ÄøëCYÌ$éÛY¼E’úC°«žØ…ˆ€A{hq0 #¨„"uhG#“k¾G,‹H̹ZX´i+ƒ àR1† 0iø9(†xþX0˜‡d˜*†tP€Â™f°ÂÀíñ€PÁW܉:ÄE}œ]ØG€l ]Œ:µÁø9lƨ0…8k|¢9ˆ·„‹Æ ™ÆZÐ]ÐÁ-Üžbà‚_Ðh‚$ðÂHF€‡Zø… ÐtC£(DÂrª{´‰| Hl’¬üI˜HS‚Ø#PHá±È ÄHøä‡tàB¬ Â!nÉÈ ‚v: €FϳɛÌI LËÛXTK·Œ¡\8 ºF ‚ *¥ÔŠ#x‡ZE§„ÄÁ3 (†At‚\x‡^°JÅäþ” ‚°þ‹ ZÈH« ËþpÅ9DË·|K€YØLÐTޏt¶ê¹…EðO`x$ÊËl Îë©¿¼ÈÀ,Ѝ Ƭp˹>²A°*0‡¨Ø†t˜+Ì\AÍ M \å|NÛMZ«ÔVP€R1¨@>ØîÔ :¨€ƒ“ÀÙ$ š_È%'ĨÙÌ…~E‘\8—ã©åËãt¿ä„΀l„*Pž›Ì‰/Ú©`S+€ŠÞÚ‡L=@† @¹óD‹€rŸX¥‚(… D­†^¸‚ØÏéO×ûÏÅÅëx……Né4þ4 º…ÎÜŠ°9ÄéG8¨»ª…v8¸ %‹€Â€t¸…+ÈËI‘DŒF=QY|„+¢Rå¬Q0àêD9Â<@±H’,(…iø‚Â) ø¸´¿D¡_Àu0†H!&yÈ€À(5Ë{œR,½CH€(TÐÔÒ3¥_Ò pG»A豇m8(M8„sØž²Hbhƒs Š\؃(QJ}8œ‹ŒR°#TEÁ:Y…Z}KF ¯/ºEàŠ.È…@œ˜lÀ!bÈ…Î{D%Ë„': (jaˆH*ùKY:ZþÍUüó8WµÜUÛB´ ðR­0€\è$Ù‚Pj”Ù ¨_XR­x/˜¬²<@U(…jQø;=ÏnÕ¸o%×ø«6bX 4WÃr«;Ú &¨`´›?è…#Óó (99â3![ƒ ‚8(Ò„]¸……ØÒ»8˜ÝI‰e+S²€9øÞ¸˜¨…DœøXŒ¬… àŠ~)»±†*èaÈFÀ|è«£°Tº–u¶—­Ù®“YSðÚ€¼Ù§2¥¨ÄK© ¾T°›2@Z’£­MG±®p6»é—€9Ø‚" …°€Að†yŸ­¥µþ®… %¨Æm\Ç}\È…ÜxÛ"rÖ ÜÒ$Ø\Îí\ÏýÜÏ]$ž!Û•r«Z®Ð$ »á‡`€ÔN®ð…¸%‹\Y­è«×¸uà}À!~8ãÔWL\™xڼă‘Z¶ŽúÉ €QÀÜÏ&Ý$À¸ÚºI·²á §ÛÝIy†Z©àƒoÁ ƒPØŠ#¨]´À®ø>»!>!w¨)M9\ñE˜㉧ÆV(`>`NàV@] ƒå%«b8 ž` –àUX(JNÀEÝe£^?À.a>a&a/å…ëe›5rxþ(·:[®è†[€]q`€hø°¾œFØŠipß±øäÝ D¸Ú˜k¸æÄ!)¼Káߟ¸aÈb-Þâ,F=0€¨¶“§el(c3>c4Nã2>=9hà&)ºE h°}ìÔ¸?mX=Þc>Öã.8‚z¸8ê 5.äB–>·aaÎ^žpxdHŽdh†p¸u2ÝZ YÀœ™”°Hx¢ƒøxâ­ø#®Š\r® ‚Z໹‡!ˆ)1º´°bŸÚ‹¡‚>¨•†16db>ãÓÛÔu`²¢[ 8g~fhf†¨˜3 «t /lÆæjþ+Èfoޝj––u!f‹äbNgéËvEþ]lãëêg2]@™…Z ‡š3Ix†,x€íÁ%– 4Xå±€_®H‡b@Û™€ZèdÄy\F ] èhöhI :˜@ æaNgb>f.Hæ7®&ºeKˆi™žé) €rˆ"’Úƒ,hŸþi j¡j¢.j£>j¤Nj¥öém¸ƒigf0©žjª„¨Ð€á[Cg”6dé{†hçw¶™xQè´Në´fZØ5($ÓÊUÕ }X/˜;Èi˜=†@д`(Dy•ŠþqPè£øÃã ¨W°›F»®PP®ØƒŠäOâ‘2…4ØlÎæìtȦfˆ  ¨ ã/9é®VãcƆ•vc8˜žiÙ®iC脨hd§=hƪ&pjq€3mÙ¶íNðÒð,‡ãêÔNã¯Æ†°vçJFÞ‰6®ƒÎÎnC™| ƒBè"L®T⊠¨bˆb¨…ˆ…4ÈÈEˆ†%¼xÝŠp0l£`ÐÞ ;†w°›àŠ *È“+ph⨠²´Œæ‰ÌÎîÎþl?Hƒà _¯iAíæ6f<*ãÖVæqziâ¦i0K0p¡pΤÝîþmßîeçáñ˜¶m,Ài.çåBÞp4~nèëé––²ÆnßlC‘…¨Ðz¶ L¶ä 5˜C…‰9¨^°!ˆŠ6H¸ØŠ/°ï£Y®µ¸jX €‚\ †d<+ØŠEMË™?ò4ðÍN€æé03í*ÑpdžÕöp–qئñ˜¦í˜Æ‚3Àif¤wq±ùí§nG··„D°j¬Öj;cîCÇ ré¦îĸn>Oƒ$OƒvØ·¶~kûÁd¹†øU!«ì-&«­RÓŠ. ó¢ø)€*øEa‡"k‡í (]þ†©s­€ýlÙó#÷óÍž‡Öíü0i ãS_ca¿gx'=»LqG‡ô˜NÛܶtÞÆt“Ñôàžqÿô˜6äåÆ5S?té LxxLÞ†!'–"õXßìK8ï¾uŽK‹ñÞ Àg®À‡¬-Š`'†裌•Š-@vQ«&€w‚ƒ^µ;h8Xm¼Hl­˜„n×sÐl>wήp.ùåû@wu_÷Ó›” péF¯÷—mWq)ºt/€qNwt‚ô7g…çñu/cúI˜–‹çóŒßì%oò'œð¶aåŠ_èG®°…þªv HY ­¸˜/ 3ߊ¢]…IaJ 7è$‚yú&­@óýõvýwWzÎô&iÆ€úµÇp Õ_}ÕG¥ªŸ÷«§q{ŸiI§ô"òú¯g—°/ïô²¿wQÏê­Vûµ¯I†äc­¸¯npu¹oÎìžõ¨pk¼ÿx²H4HߨÝ |¸*ÎÈ­xùpd( ¸Ì«×£Möeç <(†4˜”‚-€÷цX£À|€ 0B­‚", ‚—†BŒ(ñ¡*¦Ò`̘1?3Îó%Й‰%Ȧr%Ë–.]VÀÍš6þoâÌi€ / êÒf–Ž"M:€¡¤HuØê˜ÐªB÷ “¢u+×®^¿‚ +v,Ù²fµ2¹cÕê:gœ:Š®%Cþ©²v/_ b„Ñ)xðÍV*ôš%€IˆrÔù¨Y’Ó\’¸PãΞ½û“pô¯‚ÜD¡8l€ÀÖîÒÕšqPRkÕ*ˆŒR-£/(Uð‚²•Õn=¡Ö˜ä­9³QëW?ŽÜ’üQñ„ ?ƒ‡Xñâå4=–ÿ •>áQ&s&áú:yúŒ¯Ÿ¨QºG—6åŸ!40úY…ÕY 2Ø ƒ¢¥‚,µõ–þ–ÈåÌÀ„þôW`ö‘h“aˆÌbà=Yy”YvÙÕ GááØPhÝt‹µä@ DÒ2©8âÛ-‰’\µ|  ¥s ?µá±É98{nÒµ,ÝÖŒÂNm'Ôâtr¯iÐ Š$·î±ƒ wœþfØáÙÒZLt¶di«­'Ÿ~š·Ub,ñ“ÜçT7¢L`ÌÝE-ª÷ÞF:i_H…aƒ ÁR8«œê'‡£Kâ.$*R™ªq,1‚_¿ÈÆUŒiH;ÀaËIsöªÕ­rÕ9ˆ|.8Á‚M-‚µ1$ui Ha‚"!3€Ä–Z³/”æwÁ+N.‚• Ìb=)¨E’S8à :°A’3´&OØE.Ø'å. CG|ˆˆˆï#äS¾þĨ¯ˆ¨¯*‡°G ¬™\ð>=Ø#`ŽK$£%x£‹þö†0L…/¯Aû\"ÀB²€¬Ê(N†—,. \ÔÅò"A•$ÀóxÉãòh¢ ‚lƒ^8H°‰€ð#"TÛÉÂÀ™:„W…1‚ó„j5¯¨Å ~à_dfÆ ë"’ò Òøð®d-k’ÀD-„d¸@ÔÂAz±„oÔ†w˜u.ün{àI ‚á 2òc÷ ˆEê´Fµ­m=í‘H…rØÁSÉûLIù ‹QÇ&š°’AÂ¥{ã[´‘˜ÃC¨à"þiÒNR(¤€>d‡–d2.˜ËF‘²8fxH‚ ˆ.ÞÑ’R:’ûPÈ y â ŽŒ¬JPŒhÎF¸Ô‘hj‘ȃÁ ’lê`lPÁ¾ÇA΀ƒ`“ÐÇ9f𵤠‘J¹  B¤‰©XÑBA~!‹$ìƒu<FkQ mô ZÆ2ìǃžyç‹áúPcÀG+ÞÑ4jäŸ5_Ÿà˜¾ n@( 2ÖP‡B4Eøf6âP@!uŠF7Ê?I­EyPF=XòH³|¡5öFNê\®¤4(”i °’˜&e“†U©¨þ1F´Æ2XÃJ€êСN(d…ج@è‚88$–“qêSÓ@Bà —¼Z@kÜp‰ þÆA¨Å9X Xà­ÁÑÁ.ŒÇ§OLb€x6b£`kŵ;þà |¥ƒ[œãUàkAvñ#%l·P“Ïj„7´†°Á-ÒaˆÂ1¶ÔŽmTãÈ€GˆQ½Ì"-`…*NA |b™°À$"@£zD,¸L‘ÐnäNõÉ3Iò‚•Ç,¬CP㵦ŒíKˆ` %,ã Ò¨6¸à 1# ëxC<êÐ0¯¹Á*)Ö€¿‚1¥¦p9¤ Ðþw€C#uÉ5P‰ÔøZPÉqË2à­p‡žëêèeX4€g0¢ØEŠv7ÚÉ…¢j¶¸…ÀYȼ¦D/‚BF4c 78Ó æáùfd–õ­å-SÆ« =:"ñ3„ØàµXG JPŒ‚Üa¿P·†]HÇØøA©i%,Q©½€Ù0t°Ž@¡H_as‹=”?hÁ\$G‹8ÆÈô‹-ØA­Ð9Éß‘/L[µM$ÚÄ<挰Mp`;Ø < Áe(Ã8Æ0†p„! ßøÂºÑ…mlƒk0(ˆÚ̧þà1¨5ቶЅoŒÁj`äa|ˆœä[Š…A´`ëõô'o‘–tF{H‡2X! ;Å*ȸp¢ØôàÀ1J]–>ÎC ˜À:´²ˆfèÁ ³xW2е–¡R°‚@ˆw”‚Z©‚ÂÁ‡°j% ð…<ô¡Œ~4þñˆ¼á¯xÆ3(bÃX‚´!Ž5Ìa0€" L;\Á°@ð Œ[q3e»SnÚ…f0I(1„ øb¼¸A d0‹Àà¯p V° U¤%0E)H¡ ¤î¤°øðŠXPê41 -. dÀpÀ'€B(ˆÂ(þŒ ”À)œ ¤€ ´ ´€ ¼€,Ì‚</0HÍ398¼‚f¸ÈåÐ×ËE•9Ø‚ ˜X:€:Æ;~c8Žc9žã‚dC×éC(¶Ô ý€¸Å§,ß1ÅIäG:‡ Ä1Ѓ@¨ÕˆèŸa€äJ@47tVáS‘LŒpb:´KŠ]—ÄÌä7=oÌ,F- Ã[Í€ PÃÌC-àÕ ‘5U‰ 4A3Õ‚à@%$þí+Ä@SÚ€¯ÔÂ(Ëe¥ÉQdqÈÓgPU‰-åÉ„¬˜a„hÔ¨ÂíA¼CÄAìC?€ ‚"(Â"0B#8À<$HÀP@\Â%\Ш‚‹}€­¡¤Ô†0”Ž‚(„‚tl@d&\‚PÂ$HB$@À#8€#4Â(@|BtéÈâ‚@È ¤¶a„¶=Õ=x“´À",8Â#D€$P‚\€&l@€ˆ ˜@*¤@8Ø‚) B€(ÔÂ.4‚v„ƒ"üÌLõBôÂ1$¾ TF%Àù[.”€þ lÁ*pÃXö[¥ B\4á&ܪ¥dGmÅê/L@ºŒÃgõ½lâSõrð €D P@°@l#ƒ xfPÑÙ‡K „9P€ýè1nJZ"@J98ÀZHj À¢ñÃÀ0øYôQ LC¬VDdr¨ÀV Àrꃌ'܃VH¬Àl%8,Ý'à¬Á"lÀÖÆÀ.H3À2PUðט@DÒC(XÔ®E¯qD94Í‚ПðBq)[1›~„Œ™”ÓÑ*´ACÀiÈ©Ú0<‚~UU%ÀDBº þ™ìAð ÀLG0ü€/ €¼ªb˜TþÎŒ¥° øNpÌÀl „/XÀÀ;pƒºi¬¥g Ól‚ƒ]C%xCØ¥ G}A‚ñ¨Ã"ÔiíôD64@k2T·ÂÖ¡Ê L&(ŒJØ&Rô–âH5¤Á^üEkÈ ÁJäëXž8„ dl7|Å=\‚5Ü#ì`hÅ+àÜ€€VPƒ.È6X¬V`¬ð®ï¯ðâ®îB¬ýÄA „>¬Â\—†*M­kT+„®ÆDBxÕ@<”Wþ¥$*MŽ*õAkØA (U|Ѥ þÚ$@¥ÃDd3ÜÁTñÊàµÆ3À’ŒÂèM­G2è@,Ã1ØÀ…™-¢í›àL\1̘‚Ô‚ÉÇÔ"¸‚ DÑ Á%ØøêgTÑzLË#Ä‹x$kË-®Úè%_ÆÃIHîZìÔ50殄œåÑ·N ¸'4KŒî¨ëÁìfoòE†@6TÀ2”ƒD@­‚€èÂ"Ôg8°€ t*ÂJA(Ü# ´Â7Àîb‘>¼@ylv*| (H,¬ï>Í|€Vȱ0бs÷ñÇž„¬…犗ÌRˆù2‡úV»6Â'mäSüý"©ý•þ*íàA+ ñR•` ½ÐiG¬‚LhT•&Äp˜A4€ÔÂh0pXÃ-˜;TA/m0tapÀÐdÀ6DïtÌ@|Â-DQpœ[A|³É Fú0$€I$.^^F³´¦O'ÈxK0ñ91‚Xƒ¹º¶1L»¾k_ôà ¦…qƒ° ÀCHA›å€܆V$—„B[7`´Fs4õJ4E[ô$óE?Cq¹Ëb'¿,Ä,(ƒÀÂ9’)UÏÆGÈÜÁ+ÌÁDþmÒ^ÆÒ6íÓæ².'øB „lØòÎd‚43•<óh p;Ô‚eDÔB$ØB”åY#ÄßvÔÀ ÈKkâ×IãÀãî P@ú¤ËþZÐþÜØþ^àþáëþÆËBÕã¶ïÿ~ðk}«Ceþ< ¸ÙO•ŠûºÚ„ 4(P‚Œ` 6tøðal°U´xcFQØdH‘­`f eJ•SLÀBÉH™3!îA&gN;yöôùhP¡C‰âdr‡¦ÌuΨtj©Cg”k”kVšb„Ùø,ÆV*h™%ÀÁƒrÔIó.\Pzàg•µ{ùöìO-Áƒ 6|qbÅ‹»DŲâ\¹pD¶<¿›ªz9thÑ.ð#†sß„fAJ¤öÆŽY›-IcJnÝ»©VuPøB›E‰7~¹Q¤Á.=“ztéQ]F!þÇûÖ®±¹‹%›-g¶ùÚ•7oi8R·÷ ør|ùó;¦ÿáÌîS{&ý@ÔY„¿½VËεîÄf¶ìh*)À«IÃA³†Kà 5$î¨ì–Š0BVŽ©Dˆ¸òjAîÆ* »ð6c D›¹£À ‚/¿u$̾}¼l?ù%œ"<ÒHbÞÒ ±K0ÅØ,1$%(¸Ë,±œ *±Ú£™sÄ“Ì2Í<Í4Õ\“Í6Ýó™å˜[:í¼ÓNwð’Ï`NŒ2¶ÁKk3vð9ÑD]&…ÄñÇHåëQÒJõÓÌÑL5u’9‰à(ÔPE•ÔRþEÅ£>Uí³6\}ÖXe•ÖZm½×\u…uŽU}UõO@ôEB5=¶FH-]61J™]6Hd¥uÓà$ŠÛl¤í×n½ýÜpÅå“+=¬8ÝtÕ]—ÝtÝø®ØiååLÙgíÌÙ{#vÞ~Õª8(˜à‚ >á„—á†~âU¹Ò–blYdÎE5&¨^}™Í×ãùÝxc€#>å”U^™e†Œiæ˜ež™æšm–bP’uî8äJAî9¿‘uî×ä–>餕^:«Œ‡î—g üYjú„~zÚ¢™Þšë®½þúW§±ž6êªu¤Úìø®ûX­Á~îþ¸åž;±Ù>¶ì´ñC[ïÈÖ¾ÛQ·éœð gØnÀÍ»ïùøn|±¿·QðÃ-¿óÌYK|r‡ü2=AF„QFøAêLüÆÔOºÑÇ'duÄ1è%Î*H&N)•eÂõ$¸0H£'mÂ=c4_Úx—W\æ®÷߃‡›óÎ ŒzôÒO±Ÿ=ì˜ ¤>² OÐC L°#‰±`ƒ49Dw…´e!Öð@¸œI ‡D7’®~à ÏSÚ¸À‚ëdNÈ=cyIec_úÈ×<Æ0ì«ÅÂ$Â`.ASþ|"Ÿ À jÁRð°…/Œá k1Sˆ (\¡2b8‚ (f?ëÀ‡'âxá 2Rq;s ú@ƒòÅ0ŽQ `Å8ô°  $‹rÐÇÔÑ/tá?ßH=ìà’ü $‹[ì¢ÌÈ{ à !ÅB”¤"Ð`È&R‚QØb™˜E0”`‚M2Ò‘”d0€‚Sœ`Št$Qá ³dp!ˆ†‘0àã•`ˆfa:n„> è ?@°–·ÌeC@ ¨ÁH¨Û¶!Á£Á2²¤¥-q©Ë…ðÒ—À&1Ÿ`Ldrs™ iæ3£9MÒTþ8 Æ"9ÊH.¤”§Le0.  bC`ˆ& © uö€'€E¯HiJT2¤‘¼'VÐÒº×ÅnvX«Ýí ’;z1*da…(CÁ‰(ô@ 8`Š\bƒ©@ +0ä ¥h9NzÄ$Æ…04©aÌ'D@0†`ˆÁ,â‚ɇ0£B*•©N­Å)bZ‹FF…‘ÓÌ!0ƒ #ð€\á…MàÀ…];jSŸZ ˆÅ)$Üç¤)Âá50‡]H%  XfÐ×ÿ¹`à`&”@ Áæy[–k—ìº×¿F°÷0ìb‚É&Ͳ›ýìh/dÚÀùt¨]mjTCÖ´¶õªo Ù.DÕ­†÷¬kÝîR¿;)Y0À«xÅ@rÑ‹`# ©p4zAlt#e G:Ú¤þÑ£øèGŠ 2áaÄCSå+g™Ë]Žiš×Üæ0»¹R^á˜iŽf5³åfî*Nx˜óñ`ÁÌ æZˆ¹ªƒ!:b~±89¬PÔÌ<øA‰‚È%ôŽI}²“–ƒPö<ÖØÇA&]¶c]ë^àº×ñ§ébc€J@…]UƒÕ ‘gßA²„;€Ä¹}% 1_èÁ€ÃúQù~ô*XÃBñmÏ?aò–¿|ã‰W|c µM7µUöÀÆ?>ò¡·<æ5ÏùÏ‚²¯hÁ :"À4àsp{Ð V€XàL¡€À Àáª!$Á¾¡ëøŠÜa!$Ë `PiÐq0$Á ÔγJ`!BáÁâR+¢‚d!Üð! j!þàÞR!8ˆ¸a\ÁÀøá ž!‚a¨  Þ%‚2¯&! ±1ƒaÔ ð@š‚¡€¸|XOeÑQÑ!Q)Ñ114‘=sqKñSq[ñc±6 h Ûð ƒäpfÂb.Lߦ±ƒ7çä¬ *M .Ï ÐÖ‘Ð í?MÑî¬Ñ­í¢íÐÏôlŸžÈçã#p Ck£,0Ь@ÈÐÌ!káká ²@{®0F‡ãV¡lNA0àþÃJa&}H@r` ƒ$M%Ã@¡tHà £RA8!%#HÀÀ²&/-æ!èÀ XÀ þ   ¨Ò*±r M ø€ „Àâv@øA dÅT@ì0ÀÆá?ð±œ*¥’*;ÀÐÂ+z'¢\A ˆ R€:à* ìPá>kRz@ ‚0 1DàwRÁ ¢XB!1³b \¢‚¡„à ŠáÆAÐaa!´ìA ràîLÀô!XÓ5aS6ƒAÔ€øÁ  !JAè @S¦þ4à4Ss5[ó5cs6kó6ss7{ó7±S8¢839—³9Ÿ³6ü0³2313s3;“Ÿ2áN¤1ð“!D€ òA•A’ä³8“2 >›Fªîê²nëºìò'B½`ìÌîì¼ íÖÎ îQÒ&Ë àîAé.üQè Ã#AR$oò$‹r'{ò')’J¡(Á I`F¡22 f¨EGÁ'm²$W´>8RG¢î^$„Úcw²Cñ¸fõ¢SJ"JÁæI-Rp[ðcpkðu} ƒÐ‰Ð‘P ™Ð ¡P ©¬ µ ½ ¿t ðþà*Iõåq.ãOŸEI—´ºåJ—¦8๦ÔQbQunq)•’)½À.£r*¿¨*¯2+=u+³¼,Å’,Í-Õr ØÒ-áR.Iƒ.5õ)9U+ëü´j2 `z¦P Õ/š48À ˜¾&\ VñQµYƒ ZߦwJ@Ã"¦{ˆu3>g>Fg¬gxµ„cX¹Õ@ü'Zו]Û5\¶]ùÂ[Ëu#•ˆ^ã\ãµIÔÕ]ûÕ_ÿ5gôÕ=æõ^‹Ô^ Ö(1E`™”_ÖabC^öF@ aãƒ\ï5_)Ö Œ5b?d§tb9V þöb#céuc)ÖcCÖe_VsF–dMödk!eËue¶ea–g{–nd–ciödo6>"˜%gvg½ÄbÀgŸöc›ö[€–b…?ŒöY@fá jat¨?Ud¶@bÕ%`áX6Š?–V$"ÁwLÀ6/)(µ[¢Ç%:,;¬jÁå¶”¡FBoYcp¿ÅmOnå–&è–J¨va?gk»ökÃ6kæ(2?ÄVG’v € !¡Ž…C•D ÈLï&µ €z°£J÷–O*ÀNahAöA$bw&xWULuçvj?ˆd÷Â[+ò>4÷l,·æ0—þ¤„Šˆj¡HALÀ dªDaØ'¨†H0>à @ z*¥ÄŠIîÑŒN œ‰è@¶ üŒð‡Ž)2Î%6Žt+¤€®@ô3¦14áH hdA’FàF«[¦­4@Æ‘‚á‹|Aô ÁØÈÉœ"è*ßIvW ä¡Â¡@ø˜D˜š04˜ƒ=¸…‹é…ÝÉ%àÉ[þ7€ª ¤ñ€x!¸ØK7¾¢aúBmk$Š»Õb£"»w¨¤—z­{µ—{KŠˆÀW|É×|Ê„V0ªlËŽöɲê0DA0aóA’ ÊlþL0b€Pg0pÌ«ÐWHîÑûðÊ UHX€FFæ`±ò§ýëÎú×A>M²¡‚aƒÁÂ8ï ¡ˆÇØ à[¦M!8+6`NA2€¾ž€ºŠí¿(ÀJXUæ¸!À–AºtÙ¾ÆË—ÍK–iÙ–q9™w9‚z¹¼À“5™!:ù“ƒÁBy”ƒ¡”Ñ •“˜xûâü€(aôÁ÷btÛ#ž·ŠKŽËؘÆð¸0à¸äXªê¸£ÌÈö˜0üØÉš…y“N¡ËlËÎìD€bA0>0Pˆ¡UN0dN0Xç¤.}þ=4ÐMóm,‚èÓ$ÔCçY5; ÈX@Âùè)·öÉÞ¤éºÄ[¦í$é\é†36†Ü4Èw9;„™˜˜`©ƒOƒpϨ‘Z©o÷®ú[dš¦mšùZ«!tÚxÚ§÷œ÷‚èÀ¢žaêwîw²ôôÈ}áW~é×~ñ÷ŽòˆŠ!£"3Ú¡!Z¢)º,z00:åÎ,æ ã]®^R¡02á jޱ_®0ûr #A:EzBï§’3@Ä`B!mmazƒbÊù¦Éš!t: º0Høªúæ!"A¨š«›Ú©™ã„Sxþ!hºÚ¹Ÿ÷€›Á†»ª¡û«e›¶ÇšŸÊš!r{·ùhÓî"ü y y²&ùý ‘™‘Ñ[½%y±(y°£"A[04›³/ºÿ,Û0F»²S¨æ4’0JáCØÀej0018W <—±@7LÍ4ÐÜ@&@ð ¼ À8à Nå45ØV$ä ÒAÂ( ÞÆ°‘"á:¼euÈuƒû`  H0@FÁØ;1B#ÛK*€J`fAúà`¡\Ê]‘ÊÙDÉ™ÜÉÁ<£œɼÊ{˜!bþ|Æ¹ÑÆq\Çy¼OÂÆ[ Ê›µÃ®¥MNÚ Rz¥][Ñï{1*ÒÀÁœÁ ¼0.’£‰*¡?€k½ú T4'k PP`&—A0.%/!JÔ‹’Ó· ãGƒ4a…ä‹Hã´TMÔ€¶À¼A Xøà ÀZµ-ß²Åa8÷Pô“?'i17`¼) ú~e:ï6JÌ`€/èÐ@¬€jK7yÓ7‚9:­œJ ` ð w!æ<í==!à Ýß=Þþ;ëÝ Þ[¨ÝÚ±=?µ¸ÝÛÁ]U€¶­þßZ và\»íîµBµ¥ÿÈ¥âs8]r?=Ô‡tÔKýÔS}Õ[ýÕc'etD Öu’'ôEk3ȶ_V¾m¤Ýa¼ÀƒWƸõ=i¢^nœ~ã×z/>Zx¤ÄO<ÅW\®°‚éÃC|ÄÃÅ@Å?4NËÞÞ£ž~Àí¾0,¼=Õ@c\\U8a X†‚êAêߦð5Gð¯Þ=0àô žøØ“}Ù›] \õ-Ï<؇½Ø'_Ù™ÝÙ_•îñ2ˆ–|ô>5v8j^ßKDážÁXf:Ýàz¿kjÿö öeŸñuFéC¨îI_Ó‹ÞþîQŸX]÷—ŸùƒÃq…„ïý^^¬aMtßP•¿ù·ŸûgâùmDõYY¨¿`­r°Iµ¿ûןýâûã•üïÕüýAHýÛÿ·ÿýÑ5þéuþû €AðB° Áƒ*\Ȱ!C 2‚IœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ%È,ÊœI³æA`jéÜɳ§ÏŸ@ƒ :TD“*]ÊT Í§P£„貪իX³jÝʵ«×¯)aJKv!N¦hÓªýiéÚ·p}:-K·.U°xóêÝË·¯ß¿ZÅÖ,õlÜÈy¶MÌí\‡ãŒJ°þŽ ëØ1Z¹ uâ#¼ ¸k˜ÉFŸHpŠ¢z©)žCg¬´íÛ!O£VŒµkØxKœ]·ñ‚E+Ÿi¸±ó´‹Ÿë”$½çã†Xˆie‚šôÖ Ô÷‚ Î/÷Bú¸ÕI:Ä)¸Äõ( ”]x°~ö¹' {ðÉG_€øéÇ_€è߀J”Üz&Ô\u0ÝÅIüþÆdpI&9Ѓ0ÂÆ¡tì` ÇdZ!a¨A•V8,ã%K£ÐR"¶/u)^ Ê—À&1‰Ì`(S2Ì †3¡)Íi¶1& ©Üåæø=z¤s  Ì(UºÓ¥nuò˘NÉ)C ô0ЬÐz€æÎ†:ô¡%‰ Ò¿ÿ$€\ 3j@/4ðœ`/˜Á vÐ  áKЃfÌ .}KBª†Fô¦8ÍéC'JFÅ‘¡¤%…zR/¨“šä¤'A)J/R2¦ô*UÉÊ@Æ´ G¹jcfJSÂØT§` «XãÅÓ®qZm LÓÚ”˜µ«_«þ\çJ×Ò”õ­eA+[³Ö½&…«x%K\ëJØÂ6+w laé×Äôµ±B¬b£2ØÃZö²˜}çd×£WȮ属ý‰d7k“Êfö´¨Mm0KÚšt6´h-ly2ÚÖÎDhÐ…nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®t§KÝê"—ð´m]^;[¥È¶»µ¨­v2˜÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°}Ó0Þí2¼±ÍjÆ" ý¹µÀް„'Lá [øÂÆ0w1Ä`é|·)VÀ ¦.âͰŠþWÌâ»øÅ0ޱC6<”‹`Ä%^ʉáòáZl ¤0±ƒeLä"ùÈHN²’ |˜YÇV°k¡Oð¤$ A®\ Q,`S¸pÁj & C¦^²š×Ìæ6»ùÍ“¥ñP6Uå+gyË;©@—¿¬“0¹Ìg~Ka!‚\ƒ;QÄt²‡è÷ÐI>t¡“ddB'ñ8p[áÌéN{úÓ ö´œ…BhC#Z'Šf´£kiISº–Æ´¦™ÒãMí"DÐIxò|‚'n©EzQ‹ äÅiµ²—Íìf;Û¶£Š­q­k^ûØ;v±Íc)CY'÷@µwþÒëZüz'ÁÇtP‰¸¤øÙðŽ·¼ç ïhTá·NÊ}n¤{ÝíŽK­wB .è$‹®Å=Vˆ;Hr䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæa1}?³O3­JI$M*$¡$[„,iµ„ÊN})$…l)¢H¶DÙEÖH¢¨lI¤Ò¢%ÑF‹jªÙïïó˜§_˘¶Q¹¯?|øÊ•+ÿ8êêj___OOOuuõÄÄD~…¬® ''zL‹~9‡N§CKJ7ÇÒÒM¥ó/€ ^Hiiéúõëÿö,PþÌíÛ·EvŸ…9uÞ½{wçΘÝXX,ÖÜÜ÷˜šš2Œ¾}ûnÞ¼ÙÛÛªœÔÔT%%%æãã#ÌfΜ9eÊ”††qqñ.U9€Í›7óx<{{ûv$ê eee6l˜:uªˆÇEi‘‘‘¨Ðù@…N/¤®®.33“Ÿ>¥{boo ˆÈî³T*u×®]ŽŽŽÛ¶m›3gŽ`{ÐíÛ·™L&N'‰†††ªªª<ïÞ½{ÞÞÞEEEÐ5'##ÃÊÊêÊ•+òòòº***:tèИ1cìììšWÂê ÂÂÂ^¿~-++û·rçÈËËÃ,D(Ý–‡þí) ˆTèôN¨Tª‘‘ÑßžŠ Dÿ*¹dÉ’ÀÀÀ>:tH°còÛ·oýýý©TêĉÏž={çÎ2™¼|ùryyy(V455ÃÃÃÄXÕÕÕQ©ÔÌÌ̾}ûš™™D£rØl6,±îáá*GAé\©¯¯§R©ðcCCÇ£P(Ýym :((ÿ  æøñã3fÌ8~üø’%KTúÜ´iSyy9›ÍÏÏÏß³gϘ1c¤¥¥Œ ÈŽ;¦L™2cÆŒÖTN}}½““Ó«W¯rrrfΜ9sæÌ.»¦ðôô,..1b„(ÇEAéõÀò½™™™iiiÇÀÀ`„  †ÍfÂßžc  QW((ÿ£G†¡æ6lP½¹ÿþÚÚÚnnnëÖ­{ñâ…¾¾þªU«’““©©©ïß¿×ÕÕmñÄŸ?Òét …¢­­––ÖU—Ñ:Ÿ?>sæ ‡;~üxw~ÅDAéqÔ×דÉä={öØÛÛ»»»ïÞ½{ÆŒT*uÖ¬Yqqqx<A†††¿=Ó¦ BåßÂÃãoß¾‰‰‰!!!Í––––––Ž?~íÚµãÆ«¯¯ß°aÑ#G¶mÛ6mÚ4.—;zôèû÷ïËÈÈ4?700POO¯°°°qãF‰Ôåóÿ ²víZ6›½zõjŽ‚Ò‹ár¹ ÅÞÞÞÓÓ³É;‚ ÑÑѳfÍÒÒÒ î†/¨ÐAAù·––†AR®®%‘—Ž IDAT®%%%üýqqq{öì™={¶žžÞçÏŸ###i4š¶¶vJJŠŠŠŠ¾¾¾±±q\\‡Ã5îðÅ‹¡¡¡€Ù³gççç‹ Bxk¤¦¦***¶)5" ÊÁb±ÑÑÑÁÁÁÚdeeÙÛÛwÃr+¨ÐAAùç°´´444d2™ XYYYÇ/(( Óél6»¾¾>66¶¦¦fãÆ¿~ýÂãñNNNÍ+Xåää899õéÓ ¢¢"wã)**Ú¿?àĉüÊ (((ƒyûö­à‹-zûö­¿¿?¿\]7¡îJõõõümAètzw»H”&õéÓ'&&æÒ¥Kp‰‰I“6L&“ÍfWUUÅÇÇ+))-]º”(66ÖØØ¸ººZSS355UÄîÆÍAÄÎÎŽÁ`ØØØL›6íïN¥WR[[+ਟŸ_hh¨¦¦&Çã‡iN}}=§½p¹\.—ÛŽ™w4ê ApùòåâââŸ?2dôèÑ£F¿ƒK;Ø? JW //°xñb77·I“&Ñh´Áƒkhh|üø±IK‡sñâÅÙ³gãp8AêêêÄÅÅccc7mÚ >tp‡Åb ¸- ɾ}ûRSS pðàÁv…‚‚Ò"„ŽŒŒŒ³³sTTTxxx```‹m8ÿúõëëׯÛ:4‰Dš?~»Ýþ:$tIOO722ª¬¬l¼_JJjåÊ•›6m¢R© ƒ@ 41꣠ üufÍšemm}ãÆ¥K—ÆÅÅ‘H$ ‹sÇÆÆ3féÒ¥›6m²··÷ööîøX,Ö¥K—.\¸Ð‘~^¾|éïïÃႃƒÑÄ9((]„/ã¾}ûbcc•••srr455›4(**’’’ÈÈÈ´u‹ÅJKK“H¤OŸ> HŠ!¨‡vœa³ÙŸ?ž6mZ•¨®®ö÷÷WUU?~JJ ªrPº-Ó§OWû͸qãºa`d—røðaUUÕ¬¬¬;vLMM[l&!!amm-))dooßñq¹\nhhèØ±c333‹ŠŠ:ÒÕÏŸ?mmmÙ²e˸qã:>7”éß¿k‡$$$ [·nýüùss÷%%%.—[SSÃãñ0m„H$Љ‰]¼xñСCí›yûWtÂêÕ«+**ZkÀårïܹ›’’¢  ÐîÄ((]ÇŠ+^¾|cmmM£ÑÈdòßž‘H¿|ùò´iÓÎ;7aÂKKK …ÒØëï444444:8"‚ <Ø¿¿‚‚ÂÕ«WuttîܹÓîÞ8βeËjjjÆŽëææöÇö¼ß ‚ ÜàÿÛøc“=ü ~'Íð}ÿþÉd¶û¢PPº!\.WII©ÉNeeåÇWVV00qâÄÌÌL.—Û¢1úÌ™3UUUíZBBÂÝÝýÍ›7í8ÒN¡kô¤¦¦ h£®®îêêjkkK&“á]¥»acc#//óßÿÁßjcx<Þ¹sç®^½ZRR¢®®îäädll =xðàÔ©Sùùùrrr***‰‰‰ xöìY›FGäË—/ð­‹Åòß`oZ;ÄÿhñDa>|¸Ï¦M›444¨Tjs¡£  Ðb✶·oß> sìØ1¸|Íb±`BÕáñx, ‡Ãµ–nu×®]¯_¿¦R©¹¹¹4­¹ji¢f:~ BÒYÑgK—.MHHøüùs§ô†‚Òn FóB¼·oß:x¼ såää¸\nAAÁ‹/&L˜ ®®Þø(Ç«­­íÓ§Ouu5,kÜ&ˆD¢ŒŒL]]]UU•ài  ´•ôôô+V<{ö,77A+++¸‡Ã™™™ÅÇÇWTT®X±‚o‡622 oÇXD"1%%¥Ó¦þÿ4‘DÍåQ“ câĉ¿~ýRWW×ÕÕ‰‰ùñã¿7~¶S¸–·ÅÅÅÿûï?¸M¥R¡òP(”Å‹Ãm111KKK¸½`Á‚‡zyyíØ±cûöí‹-ÂãñA^^ž’’200€ÛaèСpÇ«ªªÂíOŸ>988p¹Ü 6ðÿ@=33311±Ç[ZZnذáÉ“'YYY±±±$éáÇÎÎÎ0kȳgÏøvÕéÓ§Éä›7ob0˜… 644¨ªª>~üøÆ»wïær¹pAÈÉÉéÑ£Gðt{{{˜8`üøñÉÉÉbbb¶¶¶7n™øCéé°X¬oß¾YXX@³ƒa³ÙsæÌá/ð@Æ'úÚ/¤†d2™,&&£ÅZDJJŠËåúúú.[¶¬y6‹%))YVVV^^No;x<žÍf÷ëׯyÀ J)..®®®®ªªRVVð_¯‰‹‹—‘‘QVV~ùò%ßá4&&æ¯M·u°X,‡ƒJ‚H$’H$ø³¥P(âââ’’’RRRÒÒÒ}úô‘••URRЉ‰¡P(¹¹¹µµµYYY.\€õ:«"1‹;wnllìþýûƒ‚‚TTT±Xl›Öt LMMëëë­¬¬zM©‡“'Oþøñãׯ_ººº—/_îׯŸ¶¶¶ƒƒCó@\;;;2™Ìd2aþ4&“)&&fggÐÕÕåû,--ù§;88Ìš5 ðæÍ“'Ož9sFTׇҳa³ÙD"1))ióæÍ¯^½Â`0999ŠŠŠñññMZòßRºí\ïJJJÕÕÕ÷ûúúZXXTTTèéé%&&jkk?þ|ذa?~l¯Á`8Ή'äääÚ1ºµµuÿþýëêêÚ7y>¡¡¡ð·#$óóó‚Ðh4??¿äädUUÕ¤¤¤ŒŒ 777°~ýzSSÓ‰'fee½{÷î/_F'A£Ñ^¼xahh±nݺӧO›››GFF^¼x±sš2eÊ”)SÞ½{çççW__/¼Ðùúõ«©©iyyùĉ¡Hê܉ý-ø 3~üxÀ€œŸ|¤¤¤4÷Ö¬_¿¾‰IKH Ú;e”ÿãܹsðëtíÚµæGýüüÔÕÕoß¾ ªªêãã3oÞ<€¹¹9‹=uêÔµk×úõëgllüøñcϼ‹ Ñhááásçνyó&¼Æ¹sçÎ;·+ÆÒÕÕ -//²4Õ—/_ÌÍÍ¿ÿ>tèÐ7nt<Ÿr÷áܹsçÏŸ‡Y×þˆ¾¾¾¹¹9,¤jggUŽð«•Íœ93**ª¢¢B^^¾Fù€’eРA[·nõõõ…;9ÎêÕ«þü¹mÛ¶k×®YXXðx¼Ó§Oà [t:½· ©S§òƒ0ŒŸŸN?~|yy9¿‰‰É¨Q£Z«O‘Ð&»©©©àê©((mB°Õ ǯ_¿~ýúõÍ™ššòÓë]½zõñãǽ¦àɘ1c®_¿¾hÑ¢ëׯ3™Ì³gÏvémKÈeÝÜÜ\33³²²²±cÇFDDô&• Ñhü¢cääÉ“¡¡¡ÚÚÚ‚\¹rENN®ÉW”ï Ú“ÉìM÷&ðÿ¦«Þж¶vll¬••UVV–††Æµk׌ŒŒD9&“éîî~þüyÀúõë½¼¼zY8tã”9Bj’}úA6ÆÎÎaµÈÆÛ]0åß!==]VVöQuuuoß¾ÍÊÊ‚šÝ“6›Þa⪪*]]Ý#GŽx{{=º¢¢ÂËËkÑ¢Eüfx<ÞÑÑñÅ‹òòòèê( JEYYùéÓ§FFFL&sÞ¼y[¶liGzÏöñùóç±cÇž?ÇŸ9sÖŽÍнÈÈH˜ê)88&ÔAAÀˆ#nß¾-Ì=++ËÑÑqذaݹÐSÛZ •••¯^½ºnݺšš¸3++K__?&&æÊ•+µµµ< Ñh/_¾TTTd³Ù,«¦BAA ‰Û·o=zÔÛÛûܹsOŸ>½té’––V×Èãñ|}}ýüü8ެ¬lXX˜¶¶v× ÷/àïïÝ}BCC‡Úñâ¬(½ óôéS!_¼xqÙ²eúúú„O>xð ymsôë×:þb0;;;‡ƒÃáÚúÎÓ¡“““£¦¦6wîÜÈÈÈ&‡ÊÊʦOŸþöíÛ##£ÈÊÊ‚ÎË3†‚‚òÁ`0ÎÎΦ¦¦ÖÖÖùùù“'O^¿~½»»»aám"55ÕÞÞÖŠÚ¼yóöíÛQÃwÇéž9-Qº'l6‹Å¶©ÈÔ† ÒÒÒ–×ÔÔDEEµu2™™™¿~ýÒÓÓóññÇ`0<¯ …ަ¦æÆ›«HYY™¹¹y||üýû÷[+n…‚‚ÒsQSSKLLôõõ=räÈÉ“'/_¾ìééiccÓYB¤¸¸ØÛÛûêÕ«€œ={V__¿SzFAAž‚‚‚êêê6Å8gdd$''ËÉÉ©¨¨´Öæl CBBVÜPH«5„õÑÉÍÍ-**œ2üýû÷K—.URRj_Ý”n@رcGbb¢¾¾~MMͦM›ííí ÛÝ'Ç‹‰‰Ù¸q£––ÖÕ«W –-[RRRP•ƒ‚òW2dˆðv+>÷ïß räŽQ__¿yóæöåôöUL]]}Ó¦Mͳ5!,,ÌßßßÙÙ¹æFDAAé† õâÅ __ßW¯^ݼyóæÍ›cÆŒY´h‘……… IHH »~ýz}}=‹ÅZYY8p@ÈÁÝ:þàÁƒ¿= A´caàßáÍ›7m=%""ÂÓÓAíJïß¿×ÑÑùüùs]]]QQ¿pDs•””ïùúõëäÉ“ BCC;`³ÙmrŒJèp¹\wóæMaoݺuêÔ©šššd2Yøy´4¤«EJKK×®]û·g"ˆž~ŸÈk×®1cƺuë`ãiÓ¦egg Ù3\‰‰¥ÕÕÕçÍ›wÿþ}‡C¡P„éA(¡£­­}úôi!çHII¹zõª€¤UgÏžåääß----11±´´42™ÜÐÐÐŽz7 eÖ¬Y{(ÿ ÅÁÁÁÁÁA?¾~ýúýû÷eeeÕÕÕß¿ÿþý;‘H2dˆ„„„¬¬ìСCuuu E³è‹‚‚"<•••¹¹¹í[oöóó³±±™6m𣣣ŸŸ_aaáÏŸ?8ýãÇ;wîøûûóMÛEEE)))ÒÒÒ‚ÔÔÔ(++çç竨¨”””ˆ‰‰a±Øêêj%%¥ÌÌL‹µzõj.—K  tñâE¸-Ìz Rè`±Ø¶º&={V€ÐÁ`0X,våÊ•mê³ñé*•ZWW×k*)¢ ô0Œ¦¦¦¦¦&ORR’±±ñÈ‘#{Mw”^Ì€nܸѾsY,–ƒƒÃ‹/N:uàÀ§¢¢Á?J$Y,‚ ÚÚÚ $©OŸ> FZZZIIILL Z©X,ÖÇGŒ±víZ777…Ba³Ù ƒH$’H$‰D$„:ö†…Ç›äÿ# ­Y©¡ ß^X,‹-,,<~üx›f…‚‚"bà ¤µ²¾(((Ý?~´ûÜøøø³gÏZZZ¾}ûvàÀT*õöíÛÉÉÉ £¼¼¼°°ðÓ§Oñññ £Fª©©‘èׯ_vv6ƒÁxõêÕ»wïD"QQQ188xüøñ .d³Ù L&'&&®]»––ÒúÿçÄÄD…6yÒ8ÎÇ­­­[< c²¹ÿ¾„„Diiik©1̤I“難¨PQQsssƒ¨‚0Œ®È]†‚‚ÒA ÐAc0QPz  ¯ÌÖ­[ÍÌÌêëëL ÔÕÕeee?|ø0bĈÔÔÔ1cÆÀ„„cÆŒÉÉÉ™0a‹ÅŠŒŒ´°°€§Ž3¦¬¬LNNÎÀÀ`Ù²eÉÉÉC‡…+:aüøñüF!“xý¹‘ŽŽÎÇÛqµ­Wß¿ïÓ§Ï·oßdeeåääâââ —/_`0-ŽB šÔ,++KII±··777_´hQmmí³gÏLMMP­ƒ‚ÒÝ€pДžB…NUUÕæÍ›¯^½Z__Ïår ””d2™Ã† khh Ñh°¥¬¬,t²im®¢¢R__O¥R Æ Aƒ¸\î°aÃàý‰ç,..Ì”þ,t¨Tj;"Í<(**Âáp¾¾¾ŠŠŠpõ©¼¼¼  àÍ›7^^^ß¾}ƒ-ÉdòÚµk<(L·„Ç777—xüøqvv64ã¡  t+ ÐAWtPPz mªEÕ"×®][¾|¹‘‘›Íæp8MŽb±XÇd2) ‹MKKsqqá|øéÓ§ËÊÊx<ÞÁÁAUU•ËåvnHæ„Ì”ššÚ¾Þ>|xëÖ­5kÖ$&&*++.\¸páÂÆmž>}:räH‹ÅãñXZZª¡¡¡¢¢‚Ãá8Ž””ƒÑÖÖ†õâëêê®\¹²nݺôôtXЃÁ@ßd€ª”î*tPPz‚@'ølí yyy}úô™?¾³³óèÑ£ùû•••}||îÝ»—˜˜(''—’’ræÌcccUUUƒÑé‰'þ t8@h«'rc6nÜhllìâ⢥¥Åår+**BBBìììjkkåää’““GŒ‘žž>dÈÁƒgffŽ5ŠD"}ûö ‡Ãýøñ#''ÇÖÖÇ„Q£F=úæÍ›J6›M¡P:¤®®Þî`u”®:((Ý6›Çã±X,N766î”> FHHLôG"‘yõêURRßÕ¦¼¼\UUõñãÇóæÍ«¯¯‡û»"½Ö„ǃQïí ¤¤ÄÝÝ= : c±Ø™3gЉ‰•——WVV*++WTTŒ5*//oĈ999°û²eË^¿~ ””\¾|9Nçr¹ÅÅÅ=êׯø­ÀàÎÁƒa.ùÖªl   ü-P¡ƒ‚Òýa±Xt:}ÕªUaaa4ÍÐÐðùóçÒsii)ßG¥9'..nêÔ©x<¾ë*ÀüÁCÇãuÐpúôéÄÄDAêëëÉdò Aƒ”““SPPPRRÂápêêêL&“F£A5Ç/«¡7pà@1116›Íår›•a0ƒª”îꌌ‚Òý¡R©ÐltæÌ¾k×.arñu}}ýçÏŸ{yyýúõ«K=OD!tx<žƒƒ‘H|÷î\k‘H$\.Výï¿ÿøU0øeßaKè¤ÝüíPLL M'‚Ò AWtPPz<oÁ‚ÿý÷ߎ;$$$<== ¦NÚéc©©©Ý¼yóõë׺ºº\.WZZºK×)þ t0L§¬&¥¥¥9rdòäÉd2¹¾¾žò¸TC$ñx|LL …BÉÏÏ¿wï} ´¶¶öõõÍÊÊúúõ«„„F7nœ™™ÙºuëöîÝ{ýúõ¬¬,hD‚wŒÎ¥Õ»…BÑÔÔìׯßèÑ£“’’Æ÷âÅ &“ùðáÃÎÏZˆÇ;88|úôÉÃÃ###À/dŠ‚‚Ò£AWtPPzÐzÕ|ÿ‘#G¸\®«««0üøñãÊ•+&&&jjjÍ2Œüüü7oÞDDDzxxØÚÚêëëS(” &ðx¼†††Ž^ÆÿÓªÐo` .,**š0a‚¾¾þ¦M›=z4{öl:îèèØ¦attt&NœØbüØúõëËÊÊkjjm¼”î *tPPz £EëÕ—/_nß¾½páB~ÎÁøúúÚZl;!!áܹs°Vy'"h=Z¯çíÛ·ÇŽ3339rdVVÖñãÇÇŽ+ä$)55õåË—,ëîÝ»ŽŽŽšššâââ›7o.**:yò$‡ÃAD]]½.¥; ”…B‘’’j± „¯¯/wvv¦Ÿ¼¼¼ØÙÙ)((´iÉÉÉmj/ ‚„…BÑÐÐ1bDãééé3fÌ`0'Ožr &“Y[[›™™™””dffvâĉìììÚÚZ???*•úüùsyyy4©1 J¯ ÔG¥§Àår[´^¥¦¦>}útùòåT*U˜~Èd²‰‰I›F§Óémj/ ‚î>|ëU“ýeeeÔÓÓ›9s¦Ã”””H¤ñãljĉ'zxxœ;wÎÄÄD^^>%%¥y{.—[[[Ûé†:Ã(P¡ƒ‚ÒS`2™-Ö ”””\¼x±0ý¤§§ܦѻBèü¡¨'´^íÚµ«Éþ'N¸¹¹¹¹¹EGG 3ÌÕ«W÷îÝ;mÚ´ØØØW¯^½zõŠhóæÍ{öì‘——ïÛ·¯¼¼¼‚‚‚ªªê!C† 2tèP@WmGù# —/_îÜ>õõõ…tÚGé5 ¦« AX,VçöI P¡,J( ÀØØ8""¢É¡{÷î•••988œ={öý”••!ëp7@ ÈÊÊ–––6?TWW×®Y âB‡J¥ª««kkkCiƧªª*((ÈÙÙYWWW˜ B§NÚ¶mÛæÍ›ccc›­­­­­­ÍËËk²‹Å^¾|ÙÆÆæý£t:t:}Û¶mÛ'‰D ×××ïÜnE‡ÃiRJEP¡óOQPP0zôèÎísúôé!!!]]`¥1ÐzÕ\è°Ùìsçι»» óè×ÒÒÂ`0999ü=8nÆ ëׯWVVnhhøôéÓõë×>Üø¬¿°¢]g.\ØDèŽ=êèèèææÖܶ՜òòòK—.ÙÛÛ>üÇBNŽÇã9::Λ7ÐsuIMMíô¿h “ÉóçÏïx?ÕÕÕL&sÞ¼ywîÜéVZ‡Ãáäççÿ±Y``à¤I“¦NÚ¸† ÊA…Ž`¢¢¢Œ{ÙŠEgI„ëC111K—.½|ùrÕ:™™™C† éY“g2™æææ$©yUïàààmÛ¶ÙÛÛÿQèÀˆ¥¤¤$€–––··÷”)S$$$¸\î«W¯&Ožxðà›ÅÇÇûûûïß¿_WWW³  xüøqÇûÉÈÈX¸p!üøq÷Ô:l.š——W^^¾nݺ¹sçŠfVZ¯fΜyÿþý&‡ ?~¼xñâ-[¶TWW èDOOËåΟ?ÿòå˃ ¤¦¦^¸páþýû;wîœ=kÖ,[[Û€€=Œ;6++ËÉÉéçÏŸþþþ/^lhhØ´i“˜˜‡ÃÁápÍk>üQ8¶ƒ? h½Z°`As¡“˜˜¸|ùò;w 3¹ÌÌLccc)))Á2° ]¡ï:XñµEÙ¼y3 ;;ÛÚÚzïÞ½-¦(øG8pà jj¢Û«I„ïÈ~T€Åc²²²&M58~ä”0FÛ®¦ªªêÛ·oB¦+Eiƒþúõ«+z–êO6vm!9,Ÿ7W¾¦T×þ`ZZYluÛ¶eË–·îÛÕÉä .¬X±¢{jÀæÍ›L)%%%::šÍf8pàÝ»w{÷îåôÚ´^‘ÉdƒÑäPdddQQ‘½½½¡#&&¦¥¥UXXhii9vìXsss €˜˜‚ Í…NW¬þ å\I§Ó­­­›[¯§OŸ¾xñâ¼yó®]»öÇ~ÊËË ͅΜ9sWLm2z7ÿå4H@Bgø‡Ä`0#GŽ|ÿþý–-[¬­­]]]ÿMó‡ë¶ZGfº )Ë¥§Ü.¶··ùòå¡C‡þº÷˜”””‘‘ÑßCO'00°‹z¦Hôm hðùeEaJõ°™òÙO~8p !!!88¸oß¾]4ŸŠººzwÖ:sæÌ ]¸\nttô°aÃòòòž!!¡ÅÓG…Çã>ŒÇã_¾|©¯¯Ïd2/]ºtäÈ‘¨¨(]ñ¸ªG …¢¦¦Öb`ðÍ›7ýúeoo/L?ZZZ _¾|áï:thTTTeeeddäÏŸ?SSS¡%¯1t:½wøOŸ>íêêJ nܸaggWXXø·gôw€ZÇÔÔ´®®nÞ¼yoÞ¼ùÛ3jD*nIàÈ…GGȸiÓ¦}úôéoO ¥Ç3ʪÿÚ[z}IÏŸ?3qÄ‹/þöŒºPëôéÓj®0pt)ššš×®]ÓÔÔüöí›]hhèߞџi-s àÔ©S‚,Z´¨µs¡'òŽ;nݺ5räH.—;cÆŒ•+Wfff@KƒÍŠŽPB*¬/¸¡¡áâÅ‹“'OFŸŽ;öýû÷l6›B¡lݺ5??ÿÇ3gÎÄ`0ÅÅÅd2YGG§ùû1N'Â̳û3oÞ¼³gÏ0š±:Å_¯'Ò£µ`¬Í€ ä‡P¡ëæÍ›{F(=ž!“e7?› 6Iš±|}}»¢Œs¦§k%%¥àààùóçC3–‹‹K7wÌ`2™fff-.Zÿüù“ÅbIJJ¶vîøñãddd!“É8îçÏŸðÐÛ·où¹•9N“ÿÚŠøm½jñPPP‚ \ÔéÓ§F+//ùòeyyùÁƒûôésæÌƒÅ‹3ŒÖL9½fE¢¡¡qéÒ%##£ººº-[¶ìß¿¿Óóku[ŠŠŠþfñâÅÒÒÒuuu¦¦¦°j}Bq¨ÄÆ'FÏïϬãÚÛÛ;995·d£ ´ yÒÚ[z3¶¨!8pà€••ÿÙð/SUUuç7666T*õñãÇóæÍëqZ‡@ lÙ²ÅÛÛ[\\üÉ“'ÖÖÖYYY{R­B¡P$$$fÍšÕâQ.—ÛÚ£™H$Μ9A …Ò¼¾ÓíÛ·»î%t( F5jTóCÙÙÙ/_¾´³³ƒ&½ÖÐÕÕÅ`0¦¦¦ãÇ_²dÉ AƒÞ¼yüèÑ#xyͲzŸ R©ÞÞÞÿ ‹Á`dü?ДÍf?yòäoÏ®ÍP3JgƒÅafn‚š±óýû÷8qâLžûêÕ+a|C»!FFF—.]êf,Ö+ךÐ166–””lM$$$899Ás› ¿æŒ Y¯RSS›=}úôµk×.\xñâÅÖz€»£G9r„N§;88äääôëׯ¢¢‚Çãa±ØÖ„NoZÎi̼yó´´´vìØñ/Dc)))µfß¹víÚ½{÷D<ŸNd¬Í€£¥®¬JíVÑX(=hƺêöùeÅ¿%##Æ6'--íóçÏl6[ÄSê, ëرc·oßîÎÑX,köìÙÇ¿téR“ºâ­­è‰ÄÇÓétþå0™L"‘XSSÃoõùógiié‘#G<O&“§M›&¤Ëo›hCJ{˜9ÐÝݽù¡°°°òòrBGOO¯ªªêäÉ“®®®+W®¤R©YYYîîîGpM¥^üó†f¬ýû÷ÇÅÅõîh,2™Ú tø™[< «@HKK·x”F£õë×oÀ€Ð ‡Åbüø_ZZ›Íæ;âÀ„ñÿ7ÅÞ»¢ÃÆê ÑX(ÕëéÑXX,Ç#Â`0fÏž&++«¡¡Íáp’’’‚ƒƒíííá‹:ÿ©Íf³á ŸŸß™3g´´´Ö¬Y“““Ãáp^¿~ à'ÕƒNÙ]ôÝn›†{%¸¢©©)‹Å6ÏòÄ`0¢££‰D"Ô=¢qMÌ¥K—¢££›{ u)ÿr4VoÆBétÐh¬^O÷Æ‚ë7ùùù ËåÒét6xð`Àùóça3 ¸kyâp¸¸¸8›çÏŸ¯Zµ*###((HCCƒï\•™™ 7RSS?~þü™ÉdvbH]Û„•JqV¬XѦIv(6³²²ìíí¡åè"3c}ùòFiöz¢¢¢ÎŸ?/â²Î2cõ¸L!ÿ¢7!u3VÏ tjÕÕÕͽ)º”îiÆ‚ ß¾}ˆ‰‰±ÙlMMÍ/_¾¤¥¥5ñÅÁãñ>|X½zõþýû-,,üýý'L˜Ð·oß9sæ4éS__ÿÖ­[M¾ÀL&ÓÓÓS__ŸH$‰D55µŒŒŒŽ?§ÚìþB$ìïï_VVv÷î]sss˜¶þG4÷Á611¹xñbaa!ÿ“ÉäñxÛ·ooÒRVV6000&&æÕ«WÏŸ?Ÿ0a‚¡¡as·¦®þ’­­­©TjRR’­­í¦M›òóóE6ј±²²²ÔÔÔÜÝÝ¡ }/¦¢¢ÂÅÅeäÈ‘]áÒßbÆÚ´i“§§ç?"I{^^^nnnÐ=Qdüu3Ö£GæÍ›—’’"ÊAÿ………S¦L9sæŒ%Ê;›±Âœ?Âׯ_¡—1üÈáp ***îÞ½ ÛÔÖÖN›6-&&æÀÇŽ“––†‹1ÍUƒÁðÏmÒÒR ‰Ž?¡Ú,tðxìùbýúõ;yòäæÍ›wïÞr÷îÝeË–ÙÙÙµûOxº.© :S§Nݵk×Þ½{ÃÃÃ.\¸°jÕª 6t¼ÿ.‚Ûv¾|ùPSS Ý·oß³gÏ|}}O:µråJx;‘&I|¨®®¾eË{{{:ŽÅbáþo*((øøøð‡àñx>>>¯^½Z¹råìÙ³‡ F"‘-Z´wï^ââb‹ÅårZœdMMMG¢]šˆ UUÕ­[·nݺõÑ£G§N å‡Òu)ÐŒuçΣGÞ¸q#,,ŒB¡ð35±X,‹¥©©‰Á`à“òpz«`0»w簾¦îÝ»÷þýû'Nœ8þü’%KDpi|`÷GÕÒî!ø¿çiÓ¦egg;–N§?~<00°ó®CÐŒ…ÅaÞÝ(ŠˆˆˆˆˆhÒ€J¥òu””Ü(**ØÚÚ:::Âa­´´ôáÇwîÜyúôéãǧ§§¯^½ÚÓÓ³µÚ 4c©ô¹æÍXrÔþRRR Æ­àp8lK´¸î„ç6n€ÃáøÂ×QYYÙC‡¹¸¸8p (((,,,<<|Á‚‹/ÁUóyõê—Ë…÷ Þoo7þˆ H“f‚4iVRRrðàA2™ ÛC7Ç300xøðá»wïöíÛwÿþý+W®Ü¼y&ÍÁeihhìØ±#''ÇÎÎNVV¶oß¾8Çãp¸æÍ÷ãp8ø†·¿ÿþàÁƒoß¾áñøøøx€††F@@ÀÓ§OwìØñúõëM›6ùùùíÚµkùòå|7\&“I¥Rß¿ïéé 8räȈ#rrräää¸\îŒ3úôéciiD¥Rùé ¤¤týúõÆ{0Œ¼¼|§§Ëo§Ð‘““ËËËSPP¨¯¯ïÓ§OAAÁ˜1c®^½jeeÅoïSjjj¾¾¾ïÞ½³´´ô÷÷‡ÍÄÄDRR²±ƒ-‡ÃÁápÍ—ôããã៲`Á‚›7oò3óx<&“Éb±à¿Y³fÍäÉ“‡ Æf³aBBv3ZÜÉf³ß½{W[[Û|Õ„Çãåææò;,K”ž­ªªª ¥ººšÃáð“,ñ)++ë`ÿÚÚÚVVV¯_¿þñãG]]݃:Øa›øùó§V3\Û’Š$AÂÃÃwïÞ —gi4Úÿý·eË–®½¼ß$…~O»_ èß¿¿šš—Ë­ùͯ_¿êêêêêêZô“’’¢R©^^^¶¶¶Ïž=Û¿ÿ•+Wlmm;kneee>”––†’ÑÑÑŽŽŽÃ† ³µµ­­­}üøqRRÒÇ©T* ++kïÞ½zzzS¦L©­­}òä ´Ê;88DGGGEE½yóÆÜܼ²²òäÉ“d2ÙÁÁàááqíÚµ‰'Θ1ãíÛ·ëÖ­;pàÀ‚ CBB^¼x1kÖ,YYÙèèèÕ«W¿xñÞ([Kð ÛDmmí‚ ¸\.ƒÁhžáB0pAZZZzÛ¶m£Fb0………!!!mF»QÑ“V.QûŒYûƒY ¾ˆ`Dè«Ñ¯_¿cÇŽmß¾F£Õ××_¿~ýÖ­["Ïýû÷›8tœæYEø6A]]Ý}ûöeggçææ2™Ìˆ,­ÿþ£FÊÉÉa³Ù¥¥¥¥¥¥ì†9óæ©S§&$$DDD,X°àÛ·ok×® º}û¶¼¼¼˜˜ØË—/===‹ŠŠ>lffVYY‰ ˆ¦¦&øFGG'00pÑ¢E022b2™Í3ç5æ ?E;…—Ë%‰l6ÞUTTòòò¬­­9Â7è¼~ýúôéÓµµµŽŽŽnnn\.ªXü¡¡ALLŒßayyùׯ_áË«deeÄb±bbbûá#))9dÈñãÇ·ãꬭ­³³³ ‹âëë ßVeeemmm.\xîÜ9¸ãñx¼³gÏ^¼x¾XlÛ¶ïÍŽ ÈË—/ããã?Ž g‹MvÆÄÄlݺƒÁp8œ~íæââ2uêÔÆ¯Ô]ƒƒÃêիợ`ÚÑù£G–,YÂår£¢¢víÚ­«*t–z IDATtss[´hQee¥„«ž{ÇõCòÍ"€Í¡C‡šoétzM#ª«««ªª\]]ñx<|x§§§Ÿ~üèîî~÷î]Aäää\\\ ¦L™Ò‘?Š”dÕ^^•úós‰ŠóÜím``Ðx­¢Éò†€üýðÜÖ?’““ïß¿‰eee~~~ü`Æ)S¦ØÙÙ­ZµJW ™8qâˆ#š¯?µ¸v…Á`Z[¦â7sww_¶l™¢¢"l_VVæååbÉÉÉ»wï~øð!@BBbéÒ¥¶¶¶ÆÆÆ"HQ]]íééùêÕ+ ³hÑ¢¹sçà#®s7Ùhq?~|òä‰ŽŽŽ²²2‡ÃIMMMJJ‚B‡Åb]ºtÉÇLJÉdÂBcÖÖÖd2ùÉ“'žžž»vírrrÂb±l6»IŠøß;`À€ððp333;;;''§ôôtmmí®þÿù#í:8nàÀ÷@c— 6ðx<ÿI“&¹ººjiiÕÖÖBcüm°X¬’’’&FŸ~ýúñS+¶‰DÚ¾}û®]»222Z+ÙYð‘ÐÍßß:i*))-_¾ÜÂÂB°PíDÊËËwïÞ’’‚Åbׯ_¿fÍš&51$$$H$´5´ xʇ` yFsuu7o±Wrß¾};­w.ð‹÷ðáCøòׯ_?—¥K—Ь~jéGú•U©eéD î˜ßÉÖ¼‚ÄÅÅÅÅÅû÷ïÏßSQQáêê*!!q÷îÝ'N@_W,;}út{{{##£7oÞtŠ{òâÅ‹ÓÒÒªªªøæÿ‚‚‡sæÌ™ÆÍàR †…††ÂÑñx¼‹‹Kã;ÚŒ3àÆÌ™3£¢¢***rssá/úâp833³øøxøÝðo)ðÇÅ7S¶6–à¶ qqñ[·n7ŽD"5 @XXXLLLQQ‘ƒƒÃ¹sç8…BY·n݆ $$$D“ÙöÍ•o÷ܳ٠îðáÃ/^¼¨¦¦ÖÕ#^¹råþýû›6m:sæ ƒÁÀ`0ÆÆÆ®®®ºººÐNd˜šš®]»¶;ôöö600à‡ùªªª,--ÃÃáR©666K—.…j[ddd@ƒ²””Ôþýû'OžÜñ>óòòÖ®] +øøø$%%±ÙìcÇŽ>|>éÆŒóêÕ+‰ôèÑ#OOϤ¤¤Õ«W‡……õíÛ7::zæÌ™­õ ßbbb,,,ÒÒÒÊËË¡Ï_¤s<} ƒNmmm@@@MM³³3‚ ëÖ­ÓÒÒjî—D$›»¶ ÒØ±ËÈÈhÆŒòòò}~3hÐ xïèj•€6µÚÚÚ={öœ///##ÃÁÁaÍš5€'Ož>|øáÇL&377W\\¼ñ2§——WfffMMMttô²eˈD"F311ñóóKNNVUUMJJÊÈÈpss#OŸ>œ?ÞÆÆFQQJ‡¨¨({{{c ž¡€ÂƒÁÌ;w÷îÝ"XMáÓØ\uÂ?°µZË]:X,ÖÌÌlË–-ÇÙТÞóI$Ò‚ V­ZÕé7a46W-_¾|Æ ]”RŽï”¦¯¯¿cÇŽ¹sçòŸtC‡½{÷®……EUU‚ ¿¤õïß?77÷ÆNNNÇOLL”’’êtãÿµwçñP­ÿÀŸ[ö-K‘%][Ùî•”ÒB¾Üê¶½THÒBýÈ’%’›b®2‘[¤’IZd™Ûè]·åVߤR¡h¡t¹Ùóûãù~ÏË·YgÆø¼ÿ:ΜyÎsfŽs>ó|žó<ý7øîÞ½{FFFS¦L IIIñððÀíê8KõèÑ£¸¸¸   P(”W¯^õ3ðK .loowtt$ºø´··7NNNŽ ð}ñÝÝÝæææ7n422bs¾™® IIIË–-ãùùáuttž>}ʶDÖÏtUß>}ú´páBœ¥‰8ûàÁƒ¸qþÂ… [¶l™>}úÒ¥KqýáÇ…„„Ž9’‘‘A&“•””.\H$¤&L˜ //_ZZZ\\,&&fllìëëÛ;Œ[²dÉo¿ýÆ`0œwìØWFGGkjjž?þæÍ›“'OŽˆˆÀ-Uþù'B(%%E^^ÞÒÒ•‘‘VûÂŒ±ª! Íš5kÏž=#ÑÔÚö§«z#‘H«V­òññÁ-s¼M@@`Íš5...lN¾ŒDºŠ•îîîùóçáŽz&“éââ‚ûô|³ÙõKššš·oß>|ø°¢¢âáÇcbb†¯Ê6˜@w/RQQÙµkׯ¿þjggwëÖ-YYÙ«W¯.Z´oc``PXXøË/¿P©Ô¥K—ž>}ºµµ%ÄÊgí®ìL.|¦§§gÑ¢EÎÎÎùOfCº Ã?Çöÿ’Jºª7333ÜÙv„\»ví³5û÷ïß¿?^¶¶¶¶¶¶þê—.]Ú÷P1žžžQQQŸ­äççwsssssûl=Nïýçg³Ëõ±¯>jÈx¼Svî‘SéªÞÖ­[7¸îÞ£‘¢¢âÎ;Ù¹Gö¤«zóõõŃ5|V¶¶6‘®®®AŸcÓ§OÏÏÏæø’û)ÿèÑ#„Є ÔÕÕoß¾]TT‡Ÿm&¢lîܹ.\ðôô´··777¯©©a2™}t“#ÒÒÒÂÃÃÙåôôô$$$xyy}üøqæÌ™lþ¥†®³•qÖíßé»ÚCl‰ƒYíÁ¹zõ*˜˜ˆQäal{"{[þ)Ʋä¯óo„Dù¨T*G~ ò|0555ùúúÆÆÆ2Œõë×?~|¤£„1]؃mOW BßÝj¿ ?É›ššºråÊ?ÿüOoÎýý@ÈdòáÇŸ={&))Ùÿ(Ãc&Nš4©¤¤ÄÆÆæÍ›7UUUfff¯0Ot€t!®âyÜ“®!?^µjÕ_ýÅÁ(õ³3ò•+WÈd2žÞl(óÓŽ7NXX¸´´”†…æ¬[·n­[·î¯¿þ?~ü±cÇ\]]!ÊunŸ­¥.¼Y÷´Y[[»¨ ¢0,:Zg¶>ÈØ^ÖÕÎX·nݵk× Êá1L&355uëÖ­uuu†††¼å ÿvCþþûï9[~µè˜››çææž]Å…úèá§áñSgƒÞ™°°pRRÒ®]»¶mÛ†ç?tQ£<]Åàé*0àé*žÇmOWýM]ýgë¡5¯ÕÔÔ,Y²ÄÌÌŒ‡gVb%!!ÒU£]á¯ÕµmÒU`X½{ü‰ùìý HWñ¬¦¦¦íÛ·ÿñÇ®b?¶~Г&MêîîVRRêêêâ¥ÔUSSÓëׯûÞ†Éd?~ÒU\«ýSwÖŽò>6¨,ýˆj¬mƒtè?&uwôô±A!„è1/B®¥ºººð Ð_Å`0Ðç9tG°;¢äÉ655555õ››AºŠ›uµ1JŽ¿üæf®òîɧåüþl éªÑ«Ÿã­@ºŠSx0ì`')))eeåþl©¢¢²oß>))©‘®(qqñ/§Ÿü*2™¼nÝ:n Ö»»»8]‹Ñm$æà#‘Hýœ KXX8::zÅŠÃ^0ÒúÙÙÔÞÞÞÓÓs öÙàÜuÉuÖ¯_ÏÛùvww?xð`DwQ__?¢å“°°ð¦M›8[‡A¨©©ùñÇ9]‘QoØãWwïÞ o™€Ûüþûø6t@_ššš 3 7366~þü9§kÀÿx÷îÝЇ#éÇ QðuüüüììN4Ä9rÜ£««ëéÓ§œ®ÿø:iiéß~ûÓµŒ&JJJÅÅÅlÛtìý€á!((8uêTN×€ÿ£¹€gA žx:àY,;#Ñh4333‰Ä`0(Џ¸8;kö¥ÐÐÐàààA¼‘Éd¦§§Ÿ9s¦¶¶vüøñ *** eØkØ•••›6mÊÏÏÿrÎ/}}}‡;v°¡¡¡¡×¯_Ÿ1cþ–ƒƒƒÅÄÄØ°ß>DEEùùù ½}}ýšš¼,""2gΜLœ8qè%EEEÅ’%K>|ØÏÑT7#ç^%Àˆâ»ÿ± t( ƒÁØ·oBèÝ»wÑÑÑ!!!ì«××´´´ îqqq'OžtttÔÑÑyþüù©S§8~›ihhøðáC{{û—NHHÛfõ îééÙ½{7B¨¾¾>... €=»f¥µµuXÊñôôôõõMHH©¯¯?tèÐúõëi4Ú°>hõõõõõõmmm?ÁБsŒ ¯`Dqá݈úõx¹¢¢"qûimm kiiÁ3²†††JKKã—ÂÃÃ_¿~Íd2%$$ž>}ª¥¥%++{ëÖ­sçε¶¶¾}ûöܹs}—SPP™™) À`0:;;=Š·÷÷÷§ÓéÍÍÍ!2™*))ÙŸÊúô)99ÙÏÏðû¯ýKJJêÇ¡ÆÆÆ¨¨¨ëׯ -_¾|ëÖ­VVVïÞ½344,++“•• °°°@±ZßÓÓsòäÉsçνÿ~Ò¤I¶¶¶x׸üßÿ½­­MII©¥¥%++KRRréÒ¥UUU!333„ŠŠJvv6B¨®®î§Ÿ~jkkC•””Atßõ|øð¡€€@vvöâÅ‹ûó°"//wjkk‹ŠŠjmmÅßNPP1K×Áƒß¼yÃd2ÅÅÅŸ?>eÊ™¿þúëĉmmm{öì©««;qâDßå]¾|Ë]]]ÄÛïÞ½»°°ø–ƒ‚‚$$$w8xÞM+++|žŒ?~ݺu‡:~üx]]ššÚ† \]]ñ[|||òóóùøø¦NzëÖ-iiéÄÄÄ5kÖtwwWWW'$$„‡‡3™ÌêêjqqqVå „ÂÂÂN:õþý{999>>¾û÷ï ™˜˜<{ö !¤¦¦†šƒIBîþ_½kTTTèêêþý÷ß|||&L ¾ñÈÈÈW¯^!„TTTüýýñÊ]»vݹsgÒ¤IãÆkllôôôÄƒÖ²Š úˆF>Ó¯@çüùóÄÔ•‡òõõ•‘‘A544„††8p!tâÄ ccãÀÀ@„P^^^qqñ… ðÑ"„DDD¨Tjï߬ÊÉÈȈÇGbb"±}ddd@@Ž1¤ªªª³³ÓÒÒ’XC"ÞÞÞuuu~~~­­­ñññ­­­...{÷î¢P(………ÁÁÁóçÏ'“ɬÖS©ÔœœœU«VÉÊʾ|ù266–L&ÛÙÙ!„<<<Þ¿ïéé)&&–——÷ûï¿úôIRR2""âÆ±±±áááÂÂÂòòò¸>rrrÑÑÑåååqqq½¡ïzÚÛÛ¸¹¹ÙØØ eƸK—.­îGݶm>i>~ü…ÿÉSSS ½½½Bt:½´´4%%!´gÏ„°°ð¾}ûðrßå\¼x1::ËÉÉÉÄö{öìÙ³gþí8,þùç<]Wdd¤ºººPHHHFFƆ äää*++CCCÉdòæÍ›Bk×®}ýúudddcccDD®ÿìÙ³ƒ‚‚ðA999‘Éä°°0„ÐÞ½{Y•óðáÃèèh???mmí³gÏÞ¸qÿ&%%Ñh´°°0Ücñ†1uŽõç*ñÕÿîÝ»wÛØØ8;;/X°!D§ÓÏ;·zõj„ÐÙ³g§NŠã›k×®¥¥¥á¥»vírttôññQQQéêêÚ±ctX]=XÕg @èÏÝÿ«wí}ûöÍ™3ÇÜÜÜÊÊ !”——wúôiGGG„Prr²žžŽorssO:µnÝ:„PXXØŠ+‚‚‚ÔÔÔººº<<>><ô;w˜L&~¤¢¢¢!Äjý²eËJJJ êêêîÞ½uäÈ„¶¶¶ŠŠŠOffæµk×RSS/^œ““ƒk… ´´´ .lÙ²ÅÜÜüýû÷ÏŸ?¿~ýú½{÷BEEE%%%===ý©'î¦ýèÑ£A|>˜°°p`` nKGMš4©  àËÍ´´´®_¿Ž—ét:þ‘z}˵µµ8óÚw9T*!$**:}út???üIbƒû–¿„çlnnÖÔÔ<þ¼­­­‹‹KAAƒƒN¿zõê›7onÞ¼¹sçN|Ôzzz:::NNNgΜIHHÀIX ÿNJKKKJJÚ»w/B¨ººšU9![[[AAAKKËéÓ§ãë&~ _/Ž;vêÔ©•+Wjhh ËÁŽkçX?¯¬þ»+++{_=ttt𲞞޵k×ðrAA±žV峪Ï@á««$@TTÔòåË<==333{zzˆÆu›•+W677ãN-¬ÖgffÖÕÕÅÆÆ†„„œ8q¢µµßp`ÿþý«V­úñÇÃÃÉ$€¡¡!BÈÜÜ|Á‚Ó¦MÃUÂIœÑP=qÏ›o^lûy÷gu×~þüy切¨¶¡¡ann.^¦ÑhÄzVX•Ϫ>_êëñr:Œ;ø;;;GEE…„„P(”¬¬,III í®_¿~ß¾}—/_&‘HªªªDK¬©©©«««€€€Pccãëׯ•””B¬ÊyùòåŽ;:::H$RWWWï'mll6oÞ,!!!""¢­­MDÙßäë뫤¤táÂ…ÔÔÔqãÆ™˜˜¸¹¹‘H¤øøøÈÈȨ¨(AAÁ%K–à$1îHëççwþüùÔÔT„ÐÎ;óóóY­ß¾}»ˆˆÈÅ‹ÓÒÒ¤¤¤tuuqƒ'_bbbTTTtttkk«¬¬ìœ9sæÌ™ƒ«¤¥¥åäätâÄ ƒ¡««ëíí=~üxGGÇ7oÞà …„„²²²”••û®§8\]]>|ØÏÏ -,,¤P(¸ãž‘‘‘››ÛÞ½{¢££³³³EDD$$$ÔÕÕmmmBööö111¹¹¹$iÒ¤IÄ?˜±±±··7???î6øöí[<9«rjjjBBBˆo¹÷oÖ… zzzŠ‹‹ kjjâíwQÜ´i“]||<•J­©©Ù¾}û;wDEESSS;&##c``€ÉäÌÌL___qqq“üü|\”««kHHHww7nV?|øðWËAM˜0áÓ§O;wîD}÷ÝwÇ'ä¦M›æîîN¥R †¡¡aïþL`Ô#çØ@¯¬þ»ŒŒÊÊÊðNYY™X¿fÍ*•šŸŸO"‘z¯ )***--555¥P(EEE¸iUù¬ê3P'NãI€ÞýYݵ}:ž\i(<==GÝøÖÖÖú½ŒÄÈ@••• ,À³¬s›äää lÙ²¥÷Ôcý±eË<Á WÑ××—îeûöíþ‹ŠŠ ---bú!0F¤¦¦+**ZXXsûá:O¸ç|ãÉ+ÆXÆ‘ËqtöîÝÛÙÙ©¥¥…¢P( cÊ”)l¬·¿}û6`[TTô›Î BCCÇÚÛÛ¿œFŽãœœœª««ñÀí]]]ÁÁÁÜ0¤÷%$$S(”„„111ƒaßE}}}}}}[[›  à°¸SBBB@@€««ëôéÓ/]º´bÅŠ‹/Κ5«· ×yÂ=çO^1Æ2Þˆ<``kkkXXXKK ƒÁ@áI¿ðK ="‘Hííí7nœ>}:^YSS#((8uêÔo–ãïï_]]A¡P¤¤¤lll,,,B™™™ £³³sØ'çbÅÈÈOfknnŽgFYYY½{÷ÎÐବLVV6 WÒÂÂâýû÷³fÍzðàAGG‡ªªª““Ó²eËnß¾íââÂ`0JJJΜ9Ïd2KJJÄÅÅ—.]Чä433C©¨¨dgg³çÐêãÇ¢¢¢½×P©T<º«²²2eœXÿúõkAAAmmmbåªU«ÄÅÅ£££¥¤¤~þùç‹/';™ššâïÔÊÊŠ˜fhÚ´i¯_¿611¹wïžœœ\DDÄâÅ‹B:::ïÞ½[°`Á­[·:::444ÜÝÝŠ‹‹—/_ÞÝÝ]]]Îd2ñ¼E&&&Ïž=Cáñ@'Ož|÷î]ö&`§ŽŽŽÐÐЀ€„Њ+wïÞ½{÷î'¼t¾ñÌ£?.^¼xìØ±wïÞijjz{{·?V*++7mÚ”ŸŸ?Äß·ÃUÎ@®H ¯@§ªªÊËË /¿}û/:tÈ××WFF!ÔÐÐzàÀü’‹‹ ñ^|x)))†††øŸ?///##£ïr"##W¬X}ðàA"°@eddÄÇÇã™Wûsl#ÇÅÅeïÞ½BBB ¥°°088xþüùd2ÙÅÅ…B¡üûßÿÞ¸q£²²òƒöìÙóñãG‡mÛ¶ÅÄÄ „V®\I&“cccqQ7n܈ –——çè‘}ÅË—/;;;‹ŠŠˆõgÏž:u*¾Z]»v--- ÏØ’žž®§§‡×Óéô‹/âí:”’’"%%…²²²š5kW]³|}}½½½………ýõ×¼¼<777>>>_____ß;wîx{{«©©Ý¾}ÛËËëýû÷[·n ÂSC;99‘Éd"­™””D£ÑÂÂÂDDD9zd€ÊËË›››ííí‰5vvvk×®544ÐyÂçÛ¹bôvæÌ™ˆˆ{{{æêꚘ˜øÃ?ôñ–ájÈgCB€"¾uuu¢Õ1 /dgg¿{÷ŽØ¦¶¶–Éd’H¤žžž_ýõñãÇüüüL&“˜i¬¼¼ÜÑÑ/[[[geeõ]BHMMøÈË—/_»v­œœœŽŽŽ••U?o„à,rtt´„„ÄøñãsrrZ[[ÅÄÄ&OžŒŠŠŠÂÍ3ÖÖÖ²²² ëׯ×ÓÓÃï?~¼¡¡!Q”¶¶ö§OŸÐÿ¶qUUUÜÝÙÙ¹}ûö½{÷⓲¬¬ŒáÛÒÒ’˜—øÉ“'DG3 ¢JQQ±±±±££CHH¨¨¨ŸñÜ·ÇžBˆN§WTTo7008}ú´¤¤$îþÂ)¥¥¥¥¥¥!†;#Oœ8?RRRbccƒÏÞG=IW¯^½mÛ6UUÕû÷ï9rdÓ¦M¸.--ŸŸ?==!T]]»6ãööcÇŽÉÉÉ]ºtéþýû/^¼àÐáv  lll466¾råJNNΠè<‰ŒŒD/_¾Ü±cGGG‰Dêêêòóóëçç2D;vìÀ k![[Ûààà'N „üüüΟ?ŸššŠÚ¹sg~~>~ËìÙ³SRR>~ü¨¦¦æããƒ[euttbbbº»»•••B)))xp---''§'N0 ]]]oooöZ$''âcïêêRWW'z ®Y³†J¥æçç“H$eee¼~õêÕÌÍÍ%‘H rrrGuuuůÎ;7;;{É’%9lÓ¦M¯_¿FÿÍ%;;;8p€J¥"„6lØpãÆ#GŽ „\]]‰)¦---ããã444BCC7n܈200puu éîîÆý@ãããqç¸iÓ¦¹»»S©Tƒahhˆ»VÞæââ"""“””4uêÔ¬¬,|ÅÐy‚”Þó'¯}›2eЍ¨è¥K—pê !tåÊ•iÓ¦ ® ŠÛ¼ B...l{ˆ‰mæÎkkk;wî\vîôöíÛ7nÄÙS¶í”N§œ:uŠm{Šššš¢¢"|* ÅÅÅK–,Á·pº.€÷Áùö6_1LLLöïß?ÐQ^Μ9ioo¯¯¯íÚ5:ž˜˜hllüøñãÕ«WïØ±7ä?xð ==7e=}úÔÖÖvÛ¶mDC~``àŽ;¤¥¥{'lmmýýýTNîîî¾¾¾Ü>#‰Ä¥YÏQª²²!TTT¤¢¢B46‚ÞÎ;GüîðHY4M]]è Àóí3£âŠaoo/,,œ”””žž®©©™€¿»5äËÊÊ"ÞJphÑNx|„¤¤dAA{6--:¡¡¡­­­%%%öööÜå"àñuBÒÒÒOž<áø€l€·ÁùFàÈcp-: hуG£Ñ8]îÌé* FYY§«Æ8ߣôŠ1h9è–””„ dgB`Œ€@à0HŒ–³—Œvè€gA žx:ÿamm­ÿ<BH__?""¢÷öõõõ3fÌøl3¬²²rÁ‚]]]ì«=ø}}}é/àyžBÒÒÒx zÂÛ·o•””>Û «¨¨ÐÒÒêììd_íÁhçÜ}ÎÁƒÙ¶¯ApvvF…‡‡ÇÄÄÄÄÄlÛ¶­÷«!!!ŸMÀ+''ãîîþeQ >|hooÑ ƒoòôôD%$$œ>}úôéÓ»víêý*•J]¹reï5ŠŠŠ§OŸ ú²¨úúúúúú¶¶¶­0uà`@8 °/Щ««cÛ¾Ïkdd4a …bccc`` ""RWW7cÆŒµk×ön¹!‘HxöÔÏÊYºt)žÏÌÌL__OºÛÓÓsüøqkkë~øaÙ²exP,::7 %''[YYÍš5+-- ¿;oÞ<}}ýyóæYXXÀO½ÒÒÒB™šš*++ûøø¬\¹rúô颢¢oÞ¼QRRòôô\¸paï_Õ$iþüù¦¦¦Ÿ•cbb‚‡USS“––ÆÓÔ÷ôôÄÄÄèëë+((̘1£÷ØâÁÁÁø'{\\Ü´iÓTTTŽ;†_ ÓÔÔ”––ÖÔÔÔÑÑéèèéŒ(8ÇÆ,H G"GçX[[ãIIÉ””„œœ\tttyyy\\\Jˆˆˆ¸qãFlllxx¸°°0ž‹˜J¥æää¬ZµJVVöåË—±±±d2ÙÎÎ!´víZ ‰ØØØèèèÅ‹ËÈÈäææ®Y³æÉ“'‰‰‰®®®—/_¾uëƒÁ±ãæeúúúxAZZT¡¨¨˜œœ|ÿþ} …ÒŸ’’’h4ZXXXBB‚ˆˆˆ¢¢"BhïÞ½6l““«¬¬ %“É›7oFmݺUJJ*,,,88xÕªUrrr™™™›6mzøðatt´ŸŸŸ¶¶öÙ³goܸß)o€sl rvv¦P(ø:zñâEll,ñjHHÈ”)Szo“>üòVB$`À2âή]»š››B%%%^^^‚‚‚$i¤÷;8±±±ïÞ½ 'N82™<{öl!!¡~– ­­£usssbÊ’ÌÌÌþù§÷¿ANNt B¾¾¾ëÖ­#6——?yòä”)SŒŒŒð¿¨´´´ÚÚZbÚ 2™lii9nܸ~– §§‡”[YYsJ'''766†……›eddà›Ðĉg̘ sss#6PTT”””ŒÕÑÑ155ˆˆŽCçØD$šššÜÝÝ“““‹ŠŠpà§Ÿ~Â)ÈÞWá$?ÿç÷Ü¥K—VUU!„ÌÌÌB***ÙÙÙ==='Ož™L~òäIeeå—ëBRRR¡cÇŽÉÉÉ]ºtéþýû/^ÔÐÐ022ª®®ÎÎΞ8q"î_u÷îÝÒÒRb׺ººjjj!›OŸ>ùøøXZZvuueggÃw:ÚÁ96ÆA`T`_ Ãå:1¡BÈÕÕ•h vwwóæ ^ ÊÊÊRVVvssûêz„–––““Ó‰' †®®®··÷’%KTUU/^¼˜––&%%¥««‹[B>>>oß¾%v½|ùò={ö „äåå›››£¢¢BêêêQQQpµ(ܽßÅÅ!äçç·sçN¼~õêÕ555xÙÅÅeܸqüñ‡ššÚêÕ«_½zõåz„дiÓÜÝÝ©T*ƒÁ044ܳgÏêÕ«544RSS;&##c``€s ¡õë××ÖÖ»^»v-¾`M˜0áÓ§O¸ß}÷ÝñãÇá;íàã 0P‰H!—ÞýùyÃܹsmmmçÎË銌8:^PPpêÔ)NWF7“ýû÷«««sËôôtÜ'pÿqÔ+ þeà³õ¡§OŸÚÚÚnÛ¶H˜ššÒh4;;»¯&nÞ¼‰ éX¼x1NÈÈÈüþûït:½¤¤„U˜ëîîîëë‹ôãy$ RWÀÀ@`@<ŽÀ—òòò´óñññññ齯ÍÍ­÷ót„üüü¯–püøñ>Êã` ð,tÀ³ ÐÏ‚@< :#ó‚[·nᱤ ñ`à%èŒzúúú»víât-`Ô[´h‘‚‚§k†Ç*•zóæÍôôtNU€gÈÉÉ…qðöDƒtÌÌ̘Læßÿíïï?mÚ´þ¿ÝÓÓz€ÑhTDƒt6oÞüâÅ < iWW—¯¯/•J¾Š€«ŠH`xRW>|ë½&22Ï]§¢¢âïïß{}MM  àÔ©S‰•‹-ÿõ×_¥¥¥ýüüètúµk×ddd†¥ni\ )Щªªòòòêìì¤Óé©©©Äúääd===|T¹¹¹§N³ɧ¤¤âõyyyxûÄÄĤ¤$iii„ТE‹ÌÍÍ!ʸ÷GCGG]]=&&&>>þáÇñññ xýƒlllð²MYY^.//·²²ÂËÖÖÖ***xyâĉÿýw{{;B¨  €x/¸÷GÃ3`   àš5kJJJ]ÂÚµkÏœ9ÓÑÑ!**ÊϽ£ ×FÃ62òƒ444𲡡ann.^¦ÑhDl]]Ýß~û /çåå=yò„xû÷ßÿ×_]½zuùòåÃU%° wFCz¼œN§{yy!„ººº444ˆ^EëÖ­‹ŒŒ¼zõ*‰DRQQñóóÃëÃÃÃ/_¾L"‘ååå:äáá_µ°°ÈÊÊZ±bÅÐŽì0*"!=^¾yófV¯öî_Ý[`` «·|ÿý÷ƒ®ØiTD\4©çéÓ§mmm9] pÆHD\Ñí7((¨¥¥¥°°PLLÌÓÓ“ÓÕ[\$À…BátÀ1# pQê `xA žx:àYè€gA žÅ—œœœGqºyùò%§«ÀV<èlÙ²¥¢¢‚Óµ¸‹³³³––§kÁ><èØÙÙqº à0裞x:àYè€gA žx:àYè€gA žx:àYè€gA žx:àYèŒ6ÿºÛ+äzñ}gIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_init.dia0000644€ÿÿÿÿ00010010000001314211727205032023045 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöEéf8-NL|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fulnÕžÒó娣íKî"Ìêˆî_©ŽJú0P€[äVÔ±=k ÕÑú> R:g²6¾Zmtý®ܸ,·ÑJDàfwtÂ{Ëo®v`­©©z{oì¤øY÷[}{£qà…ŽV;ÖíQH¥%/µ[o’qDÙ–ró]²3“ uÓèx£›!ëæëÕÍГÝðê%Qз¬V)|؆ÕÚž±l´æˆÎST1öåBjv]$¥2Jíñ¥Ù’2v`­‰6:ƒW ·F/êcÌêøzwF%ûÒG´è¸õIÜÞƒÛÑÇö¬åÝ1«ã“ÔQõ¡Že6rxàWMTàVä6Î<ºq×P#åmÔ:«äëUÉΩ˜l¢œVÐ2BÐF£k,¯rF-½’Ö:üOeU}ªú©ø¾ªÒÕι™U0Ò9íHiüâT /Nií9a)Aˆ%ŒXÜòqŽˆ²“m“ÄOç³Ùq1'ŽZñù€ ȶ‡¿(<§›Ÿ§ªªíI–Àl|äP£I­”ˆAzf9 Ö%J2„5u.•ºí‹'Éa%Ÿ5:{‡‡v7r¨erè'äðI"Á¡‹7x(·…‡•|ÖË¡ÜC< ;’ÃA¸kO^:V/%£ SlÃ*K R½ž©ŽËêz&i¡ ÁÈ=ö`5ôàÁ‰ºëÒM3¼¬¶Ê , K+·JÀïÀ‘l°{µlÖv!Þ»mÒ1ÃSÍé¢î| @®£7f@ÕENrÆ×®)Ð) qrøRví)oó¨ñ·OŸ>þ^|-¦¯1!нuC­$¾„ƒDùlµéÁÂIlZDÍ{˜bñ ô¸Êø ÃGþ½‰üN5—M~Š®õä§ÝíezG¦vç“"¼íiŽ%Õâñæã!%ãR÷4²Õ7±hMªç÷Ö+fY¬e´"37YÓReÊņ©26Þ}öbÖÛE³Ýnèî“VüºKO—"Ùfá‡hR>ïÔ¨SfY5ìw7 Z.+–RÇyÙ±#B®Þתáúó€(˜Q Î;í~´ê˜KþŒ0×%žªÿÜ^$½þ¨ÓÉÕ9Û«ñs¹6§'§ô×É´X^-WÅ9b½¨ÂŽÎâ^h Ñо.y"½{MIK?Œè¥‚Ô,ëá^˜lÒDX A{8d¢ãœŽ&Ž4.X4nµ=Ì¢uúø>®6 Du Fš|ù` áMý~ ‰Ï“é´‰±§ç³èRüнJ»G½Í(ï™8•ÁÈ'Ý¿éäâøË|1ùni£éƒÌ}M—E2ˆh«ÉiDz²Å:'v¡x1÷£f: »?¦XYؘ-±­Yb›‚˜M1Nà03q$/l¼Q?|¸ô¯}iµPâFî´°‘?z“åéÁãã‡Ã¿fUðÑ9 õ[ù8©as^(ÑNO¤¤Q0$¯'Õ‡Qj³dÔÔ›M\9MEŽÎDg¬1>Ã9?ÍàE¶¬öÚ([ÏN|¥®ÜçôÈ®ÜëqåGÔî%@8‚ÃÛË:A¨Ñ=uÁrV–çã4'vä.#hFÐŒ /$V“ž`:§ÍZae\Ü·N«i¤[J‰Né 2©)©¡Ã…” ÀiTËçG)A!ç'¼®üס«¹]Í?\h* î, ¦oPŒŠ³Åh…~{"˜Æ—cz@(æºÇ&%…”†IádrR•ítØdšpw&›7¢×Nki½­óòšÍ,í‡Ø+µ°N=³…õŠ|Ô'A«í¡Ï*H(/æ>«b!ƒ~VÙgÕY• 4k&G/LfhÍК¡õõ@k÷9{×å!hЩ¶UâÍ‚¬‡”©¦ÒÐÒx=HIrÊXÇìƒÉ ­Z3´¾¸àO‘ú²24è{èWi#P³•‘·c¥5‰’±HiRX«"5ሦmbCkµ&›@ªQFKç,­´ÒGNHõ4 >€ Ê«ÛÆR&3¼yÇ›)"÷¨øLÏ­Û Ý;Í]W¢¥ PäíJ‚»ŽtÅ¡F à:ÒY#]}0™m†l3d›aŸm†&¥J¦{ÏÄë‰À@:Ãzv`Ñ +)ÑfJU©é5"ªV¼¥J½0™K•r©RFÔ—a;WDj«¡S*B#8 ©÷kÊÍÐZ )†@r3´á9_Çåg ¸RkŸs3^Un†]zGØÝt±Ý¯ÚrnB§*Íâ0HÉ„ÔxÕY‡0„“*M•1–ªLŸ•=Ì~,m=1ƒš™?h²Þ}h¾=½e–ír5Z¬ƒ4ÝùÚÛµÛD{‡µž°zÀ GÍýRKyÅŒ`ÁRo@ kV¨‰²r>ðcE5ŸÕý¡ÞŠ`¤ÊP‘¡âE@…î*Ö{(÷Ô) ˜èHs¢3,͉4>_n)*Ù¬lwj(*Os ­¹“¡"CÅ3ƒ ÓTÀ¶<ð²…£h$“VÙä@Ðz XÍ<Š ÊY8Öd¨ÈPñ" ÂîTDÓô6¯J«¬)­ mžTè(˱r2›+^V¸>›üÁŠh\šäéu2+”:aEŒ[Œk†G=åÔ¶YA(2P<3 ð}l-T‘zTÄ †t¢e+a @ÍB4K;P¨‚‚›*Û*^T„=;‰iô  1TXe¨‚½ÅSÎ?¢0Q*úœ&úŒ)v‹ÆyŽ p)ö‰Küqì€Îc]H®Ž>Á´ÍVm…K‡E”tô9b>˜ÍÀô2L×9éSy!uYäkX‡ÿ)'bP)bŒ³C"}ªR‚ì)5lV¯4>9a!ú½™ø~¶¨ CK©ÍÏõ½ãÕWº>2C´4çTYŠwÓ >MTUà e.*¤80tø¼¤}0Ù¤„ú©€ÔJ%XAÔ¬õu-c 'óŸX0ìžý pÐ:GŸfõ"&y^xVDI ÿóϱ¤ìÚSÞæh€&«H—uæéL] ¤¤ 7 ê}Ьú‚‚‡~‹H‰!Š\ë¢mB~ûôéãÁõ ÄW§Ó"‡E8Â"u™Ã"½@Éûù÷*$霳ã(é5Fj;  hÖÉÌ2Æ5%åuj‹žúœàì<ë4¯^˜lrLàÑnõ|4¤tN¿®s‚n­,ǧô|mœúQÎØƒr*KÆ*nº†Õ,&å”kJTûGÊiȪ »處³;“Y9³r>Í÷ÝsEÈâ1f ¨N²&‹ü ¤) £€H¯AØö”·i„~¸É²ø½øZL³ Îaƒ× äK°Áåîmð:$Q=Œ};0‚CJZX;„€´ÂóGóåêb4^{ï»ÇŒ° oÞϧ〘1ƒ3 Ì0-t'X“û®ÉXa ‰ôh¶= Þ&||ZŒfË œ Q!7XqC÷€½_ è+£™-ŽDÉ çRj_RŽí)o@þ6ºø4ÿÇj¾G8q¤Z"3”°BIÓª­¥Ž}àxa©PÞÕœˆ‰`p{pðˆžK±ø8Z,‹EFNô¸/„9X‘Ãöa„à—Ü—šRÈÃîAØã—ÓÓb™^ƒcSú2b°"†ëÉÖ0ìÑ¢¢S°ÃPLŒRk÷ ÖñËåêK1˘Ámf˜ëØhø>Ì Ê†çöOeß’¢åL¸½ðO2þ“ƒÕÊØ¾ ¬€z O9O`yÃS¶S:OI)VÁîÁi ^-£'ZÜ“¼Œ¬h{‰bÐ0Z*ì‘Ü6Q¢JÕ pÄ4W Ùšò6Ñã×É÷Ë‹ ¼!*Q̉!¡{)$¿_ÙȈ Q²9¬³qøƒfhMs›Øñ²ƒ3zp&ŽV áKÀx¾Ø¡zÀæk^ðPdf$ëíñcM7î€ü>?ËàÁ •R˜Ñƒ³Õi裙^4!¤Jn£X;ûP͸ƒDIÉH "¥²†ÎYð¥æïuZÍgåRGmäQ¤c”y²C[äçÑib£=±öNO¥ØJtFaðžtU‚^”0ÑøRùÊ6²ZÅ@gn­n”¨ã³%‚O½Y”<Ô!ƒÄÎ@¢Ë84Õî4·–[çLä¤MÃ'xfÃÅùd§øh"9R'3pø©šÍÊ¥4_&õMó!¯Ë´Ÿ¤wI¶HòÚ—Éb¼}É‘Ò0M#¼Ž É{•Z>XÏI•lV#’5e+Ji!#RF¤½D$³#Dr= RP¡lºjØm$ïËN°)¶¬V©›Oô[°‘*¹¬$Ò˜ÔÊd@Ê€´—€dwH¾@²Î§Ä7ã9mA::O·ÊÇ-8mUlV"’µB—m¤ŒHû‰H~Gˆ{@$ém9ÁŒã…$itêˆìŒ6if£T*åšm„¶«ù¬·F#Nh©Ñ!cRƤ½Ä$µLнLD6 |.jÞ™›VÒ)R2RÓ¨ À õ¢ÞÂHäJ>+–:¥OiBÒæ €ŒI{ŠIГÊ×ÓÑU±øù |ΣóŸþ-@‹åummod_perl-2.0.9/docs/user/handlers/http_cycle_init.gif0000644€ÿÿÿÿ00010010000013325711727205031023066 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§£££ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ }}}{{{yyy-Lwwwuuusssqqqh®6ooommmkkkiiigggeeecccaaa'B___]]][[[S‹+YYYb¤3WWWUUUSSSQQQMMMþþþKKKüüüIIIúúú!8GGGøøø0QEEEööö?j!CCCôôô\š0???îîîìììêêê777èèè555æææäää111àààÞÞÞ8^+++ÜÜÜ)))ÚÚÚFu$'''ØØØ%%%###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈ$=ÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®ªªª¨¨¨¦¦¦¤¤¤¢¢¢„ÞE   žžžœœœššš˜˜˜”””’’’ŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb( ^^^\\\ZZZXXXp¼:VVVTTTRRR PPPNNNÿÿÿLLLýýýûûûHHHùùùFFFBBBóóó@@@ñññ>>>ïïï<<<ííí:::ëëëéééççç444ååå222ããã 000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿]œ0½½½ »»»{Î@¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠUH©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœIÍšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=r #ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîWiíAöË d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("4~PX^g¿8àÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LþÒãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbúK¦þ¸°Ë©´Öjë­™¦š£}ê!­´à‚(ªà‰Š’ˆIŠ Z´°†˜.à*í´ÔVK§®Ã­ŠÙ§D;$Ãà9CãŽé­µè¦«îºRbû¯Š}êE@ä#3¸@$Dž D*.èBH¿ÿ<ðb„ ¯´:d#.¤ƒ*« ™‚.dÜ‘žÈŠ$¾úò;¤¿ üd¹E&¼pÃC¢ Í -w³*3ìð粫óÎ<[ë®gð&ö) I6‘D@¤øxN,E2í4ÔC‚b‘üÀD®‘(™óÃG™ôÒM?}ò‘Vc}° p ùαU_=dÖEŽÝóþÞ|÷+£»j{Ù§2$ÙŠ‘4yn΋éLƯµ‰É ØJê}x‘•{Ѹ“(?ëÅãK>¤>£ iŽCî‚éŠû-ûì´#úsgA#&ïHnNdçŸãû³"ùŠ’a©9âÃ{¾ö-¯ä+hˆs<‘Å'©wíÜwï=›·s–ûaŸÆK9r±ŽhB$&J /ÿüç‚B ’•TBd“‰Ú;RûÞ?çÍI(ó–ý’t€`âEZ`¿GÁ ZPO€ËVŸ¶u3/ð¡CE;ˆ W¸`"ó‚)¨A/€¤Ò [øÂzxE*JáIþ6p)8"5 -HÁ'Þ1$¸€K MˆB"ÍÐ…0dÒ²0–±âáP‡<ô!‘€0#}q‡=lâ£xÁ6ºñH ßfÆg_ÁñŽxÌ£Å' up€ ¤ -(GÌб0v¤"ÉÈò2‡$L"IÉJZòT´L$3ÉKzò“ TT&+³IÁtòR‚¨*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbê2¥%eJ˜SZ É8„4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎv‚“ö"•2'ÃLÀ8³Rþ°0öÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZ4¡Zˆç¨æ)™zþåž”ÊçEGJÒ’šô¤(M©JWÊÒ–J4£ÉÌà»gNJ¤.Í©NwÊÓžúô§@E)Lå)S Ñ´26•NƒÊÔ¦:õ©PªT :ÔwG¥LR#µÔ©zõ«` «XÇzÐªŠŠ£‘ñ¨_¶ª¨®’õ­p«\ç*TžõªâËêdØš(·Ò• “þJØÂ¬f Z!£Ö¾ðQ~?¤`@اF1 ipšå¬gGZ`€À³& E(ŒAÐNtVÍ(þé(KÛÚÚ–§‰ÕbÓX¾<öP‘† ø9Ü}–bŸÅ-îq…‹\âò³#0hqe{ÛêZ÷ºÍíßúè©?‚*¸Ó.&š ìs¼Ì-¯sù‰ éþ3 @ Z`€}‚À™5­ò _ùÒן³Å®€L`ªÚU±x£^%ó[Cœ%í?§ëO “`„{ýy.ðSöØ' ¬°Ïj”€Ÿþpˆùà»øÅÖ®«lÈG¦Á…ïzûiáóÂ&8Á:ÝØãE)±O1pbŸ ?‘á%÷³Å0β–i+ãKíÖ1½Ý Ž ¥ã û˜Ç^èþtE±ÏÁN0F ú鿀byËxÎ3\»l©/7&Ìxó Êœ^4´Ç=.ètœEÔ’€úÙhÞYϘδTù\)?+Ðw´ "ûÊZV&ðÂ>ßÐÙQT–Ÿ¬öì«MëYQ(à®­`÷y  Âž€Ä9ú) Zø³×¿ö°1‚Q8ƒ³OÖ´´§ TNSÊÓ‰µ]D¨àRûÛà·C­=)l#FÛuá6 ¼-îLƒ p„@H0 Û8B»÷ÍOrKÊ܇A7]Ô'vóÆà€,Ƈc¸`˜„&HЂ^„CÃà„=ôýVcàã ¹ÈþGNò’›üä(O¹ÊWÎò–œ ÿôw¤nÏ…àx2øÁ…G0#*8€2¸Â ;p@ èŲÅ*[¤áéPºÔ§Nõª[ýêXϺַÎõ®G}õõ§ÌEIcHÚØBÞÍ”ÎwnÝ(x"¯°C-ÆÒ L„í`:"Á÷¾ûýàOøÂþðˆO¼âýÞ°÷s쉢9wή¦´cjíl¯íÁ4->p@hp믊aï‹O½êWÏúÖ·¾ñ1?°nË®IÊ?Êò—Â|æ k&0# l B(̡ӣÞõÈO¾ò—xØ‹]öÛåÔ‡ûgês÷G8þ0w·ÐÁ ðêé™Oþò›ÿõŽï7ôgÌ]V™J÷ØŸ«Ü¡¹d¡á—êøÏÏÿþûÿïÎ÷xëçe´GJ¶×+Õ‡O×ÕÕ Z@t¡ è úw|ÿw¨|¨~1Õ~ô~ È€¶ ¡`íÕUû—,Ø‚©·ûy¶S€Ët€ñ’€!‚"xXúй8à ` *h.x„Hx0 2x(’G6'8w'ð·ƒb¥‚P5° 0° ¯à€ž`G ªöT+˜„lȆKØ„†ò„ƒ…q1…vR…VøU^ 9PzÀUÁz`'p¢P þPµ†mØz/p @‹˜xo8€}FƒôdƒBƒƒ7¥ƒyHW` VÁ 0  ³ ^@ ð #ç@0±p›à #p‹0tÀ‰h„‘€1‰«Ç ËP~Œa +@Œ®Ç ðˆÊÌèŒlhŒÈØw“ØÒçG ؉†¥£X¼  ³P …ˆ Gp7ŠU1XQˆV qЋ€WÑ(R iÀz1ðˆ~‡ Ëp Ê÷ô i‹ˆŒ—~1H‰f‰…‰º£‰JʼnàW:W Þ° %@·%ð ž VW!Vqþ£à   p„p‚P Àø`ñðoÕ`° ×P ÓÍgÅ€ ¥ˆ|ç/Ùxp §~÷§àˆ™ |w ¡WÀwðYIŒ1À–° ?àŒ"°Ëà•"àw\i §ðÙ–ø–W)—ti\y ™°€Ñq9—u–c ey–i¹–ÛHTH}߸‘ei¡0 Ïà” T± ë@09.i±IyP{põ0îàè`e0ÝÐ[` U ÌðÇÀ Ëxy€ŒR+ hù|Ç þÀB°+Àw/Bp¬À–HiМ‘p Ý °•ãP§ }7ô)(˜è©žìéžûŸ|'Ö)ä úŸï) ‘ Üéà)žä iUŸYSÉU)šcÅqÐWA¥0'ÀšS¡ÝçAøŽXáÝGGqj° ª ®PŦº0½ð Á L Ìà Ҁؠ _ð e`èàî0õp{Pêùwÿ¨–ðô BÐwxÉw"°WP"PžW ~×–1` §° Bp§€‰ÙyÝ a:¦|ǘûŒþsZ§w*y ôÐfÉw< ™nІЧ §gÊiº¦}çÚ‘L(‘×F‘ie‘äÓ¡mõ¡ V‚p}  %ÊSA ':ç` &ú¿Â0 œ0Ìp‹Pú !° °³`J€nSPz…Å` NÐ Q0 Õp Ûb@å°ër0à‹‘ð` €ŒÿȦ‘Pn*ã –°–mjë9§ Äh ¨Eàˆ± à®ð:¨R°¯ýú¯çZ°}w° —诨‘ ¯ôj¯û±Çª2}š©JV àlp {qþ Ù  €NTV¹±}§ÛãØI z ÙÈ©}'˜…€e• ©±‘˜Õù¨özÔÙ Ù¨Úv*c*Ð1¯ B°°`¯™€B ³ ‘°—ÐB¡¹Ñ8¹•{¹©¹œk¯„+ Ú‰ºiàˆð€¹²Û¹|‡¸Õ)‹Û¸ºvz¶–¶Zµ¶Õ¶nëTópàûþdcàwA¤ [ À0 ÔÔ­;e•ÓxŒ|‰~Y» þ:Ÿî W¿îIÊ ø•»ž§` ¶p R@Œ¬p ý0h YB ýÀС¿ƒÛ¿ðð¿<À}w™à—€IŒ/ €À0¦ Àܵð òË—ö+ô ¼³Ç¼{å¼À½ÑTrp›sÆO­0«taî0 HPIPb]½pÄQj~'lŽZž\î&^Nå`p}P…õ Ï •þ瀾ÒÿÖÒ¼åæ’ç£&ç–ÞO2ö UÏêûdÔ»b$5 ¥ðê°ë²>ë´^ë¶~븞뺾ë¼Þ볎Ͻ¼Ñ²Óê u{V[Ç`Rd ›0íÔ^íÖ~íØžíÚ¾íÜÞíÞþíàîÕŽ °]ÎUœÇÅnì% €RõÌÜPÊp£PRdÐTïú¾ïüÞïþþïð?ð_ððû¾ å.Øç~Τ’è/Þûp$U-uðöŽïÿñ ò"?ò#¯þðÁ>ÃÃNÛé®îEà&0Uwå\\ï#uï$Ÿó:¿ó„QâDŠw–Q£–^<~RäH’%Mž,ùËÏ,–-]¾„SæLš5k@ÊæNž=}þr€RèP¢EEB°¡QéR¦M>…UêTªU­^ÅÚÔ Y½~ûôÈ„Â.%ÓÅá"ñ|ÛŽJœ’åQRŽÊ`ìöTt0 €]qò%ã—ðB—=ÊÀ¨YòäÈ™r4šYóf/*}~þ:&N¢MŸ† ”ójÖ&‘ž…[ölÚUÅ׬öîwhO`$ëaHˆ%)¶d‰±6jþaçí-œì¸QyD°OßQñ$ψ jî®QI -äÎT;è®Ø£œ_ÿ~*–—bn-À=C­@]"í@?SM@W{m7 '¤°B§L cÛ Úš™wØaÇ8â˜Cž:ê¹ãŽ{òÈg}úÀ©Fq2'¢éb‹ƒÂãƒQ^à *Þ:à  :(ŽCþà¯J+#òO)ä²(´Ã$S¦»DS¨7d³M7¯J‚‚Þüþ*8¨‚I!•nØÙ]™óSvïõ]zOwgíþÅ9Í|&ºè¨¸ÙçeŒvŠ rv³C b[¸¡Aò¨Ñ9*º±1D‹}êÀ',¾ Nð¨ç"0'â腙曃îRgŸÉìùïæ›Ë¡™FœéMh%q¦¦x·gòØã…µÆ;sÍ­Ô;ÔÂÑô[ðÝ4Â?ðpÇW×õˆ.ðu ³1 äòÍwç²ÎQ½ÔÒÃ$}xÐNž5ÕegÞM|C˜æ£¶E^Ƥѽwï¿è÷ä ÝxÔŠ7¿'äÇßlùæß¯P>y߈?j[Â`’`€6Ϊø(@ñ±o@ÂKŸþЗ@›¬Ï€Fqü$H›$¨éx¢A›‚#Z@6–Є¼+àWS>Š)U-dPPTØšNІg)Àön(9ÂPN¼–žÐˆxKá 5ÃBödMŒ‰•ˆ’îЊW‘2ð¾r<¢60FJ€“Ø}¥ˆGDã¹’8E/!Š.,Í(C6j¦ŠWÄcTˆˆá}ŠpÅnt“9àäDÄ\É©5ÖQ(L”#MžI–HÑ‘#¹c5ÉA€ðóÆfS é)e `C³rÆE¶R?¼¤I IÉѼ–f¢c,‡’ÉMöY¼€/±þˆ],å8± éJfú#ÿñœ.Q2Ë["È–Õ|‰%¥é^ q7à+ÐÆX pF¥Â*d`G)ä9OzÖÓž÷Äg>õ¹O~öÓŸÿ(=»ñL-Es›¤Â&O&IImn³›Þ´â°…r6õX†^w†Œ”ƒ[ø†UžQ’–Ô¤'EiJUºR–¶Ô¥/…iLeŠR?Bó ÓtcBe²ÐH6Tš…è M€zà}IHmžñŒ¦d`ШQ0‚:U›ô¦"¡fBy*GŸê¨T}ßÌI€*Œ˜S²àÝA pY½¹·«‚$«ØÜê»þ˯ʕuNÂI\›ÇÐÆ…ÍHñ‹GÅA~ÈÅâ4áW_Òµ®¹k5ó Ž^²¯”E\5Ü®%ã}.x€„ªÑ¹à±DZ’ÅD€v“–½lfo¹Ù&vÖ‘Ÿµ-Ñ¢ '=s(¥ìÄ…Ù€¡ÑN†à˜0önq[WÝÒ’·0ôm›]})ãÛ#Æ,Âýw%PʰÀ¨y¯¸Ý«v—’ßmaxÙ8^ýÎÊþÒ2X¢ ‚yÓ€m]¥H¢}X„K|€:¨²ÀäïMýI3PÀS$ð‡Ý”„‡!-ñ„™§þ%lh†@KÀj¨ø†!>èˆåXâžX‰)ö±…@$tdÃ%‡ ˜ç„7̆øp ö€ °D¢=Hò¼M!¿‘Èé3ò ‘f !OìÇKÌ CÛ–¢OqÀ–'1‹%’Íï³4Ë Å3›/Í*\óŸi# œp&DØÇ=’ ;Èa6TИ Œ±¬Šf^ u9è&Úx‡~`¢A |´ßdËlà²ëj%7>:+¦ˆE°…=lbÛØÇFv²•½lf7ÛÙÏ&¶‡EKRÃÐÔÃCµU½ê³,*X/Næ DÃd‡]5 Bþ`*„x±ò M8ÂÞ÷Æw¾õ½o~÷ÛßÿxÀ>p‚ß»É]—U/‹Ùœê&×.]¶Ù·mnÃæÐSÿ:Z,€*Ú€²ò5Óä’Ù«ºð‘T»…ÄÇGñŠŸEeE#zPœà€uðÄlÚ0B©\–›wÉO¾t‰¤Ü¦,‰ËsÁɽ*$G}òUŸpÖdòé‹ýÎf_¸ÚÛ~*ÁÀ=Œ!Ám”AW[9üUŸüÓ/åÍïŒë_}zMŸoÕ·>TpÂØ0²IA¬ ÀWüj'?¦3¿Ès¤ç3ö‹÷ ø‹?§XœH- <°Ð‚5À ‰b‚¤{´Á*˜†osˆ™Š` =@…øƒ'ˆ,è†i8èåƒ<…[84„Äl@¦€œø 2E¥ÁŠfHšà£Šñkˆ<é; CÀ‰pAþ€ ˆ–†v0ØœÁD)¿D¿ô{½™ÀÁUÑÁ{áÁT ¹Â 2‚Ð Âó ºH&«`B†x h*Àœ0¾ð À8ˆ²€a¸vœ”éˆ *°ø†¿`„€²8ˆW¨ø¨µéP8ˆJ¼Ä*Èă ‹¹‹¼Ø‹¾ø‹À8ˆF°†| ‡·ú†ƒ8fÈ7ˆ¹Ð¤ÁÜR¿¹[CUiÃvyC8Ì ƒP°!bˆ Z@,¬@ø´ã;A„x‹c˜8¸g`’ðò8À؃Wèè*€é(ˆê¸UX˜®8ˆ7؃dp„vþ؆58HxU8QàD*°Ç`ÀG}Äíàïñ ó ‚%Ùx«ù¡‚èƒ)¨wƒëÈa¨‚{i ’!)’ tǃÀw€¦,¹vèƒR8ˆjtˆJ° JÈ#ÙB* J«¤¬ÔʃèµKJ"1m¨‚ó “1l`‡°ËAÄ„`4CôCÉÒQISaI|I f|“€› :8†}IÒ’LQ@WÀ]PgÀ†ppú7 K8ˆ…qù‘·°‡þƒÀ8”J„PЄxÈjÈ‚jMøsˆJ2¤‚׌̓˜MÖ\”FyB¤‚|@„x&qµa½|ºæëKÑùË2 ÌQqÉÜ`' "„ÆtP«@‚¶á“=‰5ˆÏœÃ€±lÑ–Ó 8ˆU¸¸üL„°ƒ˜\ˆƒó0‚*ˆÊI°5¦|‡„øÏõ@…ËI©–kÉ&ÑjȆƒ¸ƒè‚-Á*1I¾,F‡»N2ÉNQÙÎDD¸!•û &°Ã«x È x€D„?À‡v.ˆ‚àëÃ…p¸J„Ž|˜ÐŽñ°Ìþ‡x˜è¤‚†)H‰9ˆAìSGN8ꈅzè‚*”¨a0P‡èäR/0¥Š‹Á˜ƒØ˜Žù˜EXm@…ób’%ù`¾Ð”’ÜKê,Q:ÑzÉ%Ö[Ñø[/]› › a˜‚b Á>ôL® *À>·¡‚°EݬvˆÈ‚ƒ¸š¬Aˆ,0¸j˜„À)¨‚<˜]Pº@‡|À†RHZµU\EPÅ ¯±!³¡Ђ|øû‘E€†{¨‡-pFAÔéd½êœF“šÁ$L6¡™@Ù±†[Ó—v8JuŠ"åßD=mþ‡sQEMú&‡CW4‰TÛ#€•±!a¨ƒòôŠ`ª¯ -OÝ”HGЇӃƒ8˜ƒc@—×EÕªÕ©‚í’ƒÕ<§úÎìú4‹p‚KmÜ”×™¯I8=hŒ:À4ÙD-Ù€­¥º#ØG…;–Õ;“a‚‚I; cذ.?ÀÙl<’…;rýs]•5{]× !‹ ” J€F}q(ùÉF©ÀW­59®…:¯õ°ý¥…:¦­9dˆ4M MxÚ³€K½ŠtøéÁ¸[BϤÛE²[–ÃÛÑÛÛñÛŠ=hЯ8¡‚¯p‚ØùÏþOzÜÈ]»É­A“Å+”M¨ÌuÍå6F`œÍ“†² iø€ŒÐQiðÝ©†ÞýÝàÍ^ …Pؾ«ˆØP† ˆ 'èƒ;€Q§˜[Ôm%Õ%F£}8×Å&ØM²-[ 9ûÄ Ðõ͈RÈöe_÷}Û÷]_(‡¸ +`}„²Ó´1ƒÓÕÞ“ã^îb]Íßjß‘ÝUÛ @Hßú͈N_`à€ ¦_ –àŒÐ«X€ S@\«˜PŠ‡Ñ¿¨ÈÞN£î¯Þ­¾¥¦!ò-ßÚ«!º ðÝQ^¥`_¦â ~F•(pÁ%üØþfafraƒaï’aZ¢aå±á– (˜›w…Š â b¦àa8À 4¹°@C0#S¨%ÔhÃã<Öã=æc>>8qíÚ*þ¯+f(¾e¹V´çÁ•&ã ^Š1®`¯‚Ðgà‡¥($P„NöäOåPåQ&åR6åSFåTVåUeiFöÞ—¸\ÉbÙb.† Ú]…¬ã2n H†d«h08‹c¸Ù¬xfð0d¨^šÄå !À:ª\z™åÁ1ä…Cä?£`ºŠ¸]`È]Ðá7(^ÿÍr^sFÞQ#¤3)Ú8¥šzf ‰f6þšæx©fÔ¨eÎÈf6Ca¢‚ö‹$è:¬@ fŠv¤äz¶çW~áX¦»€íçö¹e‡ö ²W J€XȾp ÀFŒÞ{ž¢|†—}>ж£‹&i«@‚‘Z /‹bP%v^nŠ æ—¦@ˆ¦b‰n •6k¾¬N22¨ØìÂÓª Ãô!¨P†°ê«Æê¬Öê­æê®öê¯ë°ë±&k­vå“d#äžBêºRj腇ŠæÊŠEÀZ§ƒW“ 2‡ìÁ&ìÂ6ìÃFìÄVìÅfìÆvìdžlÂÖ¢ d¢†½µæª¶¾ª·V±¬ þyhã¯pg¬}x bȃ}°k¥ ƒSˆ„Ø–íÙ¦íÚ¶íÛÆíÜÖíÝæíÞöíßží~ ì»Më!Ãl½Òì›âì;ßI°¡f …° w¸^!B¨Ðx®gmàöîïïðoñn@&nË–—ãæ¬ä>¨å.°‡„ìÒŸ©Æ~Š×ïýæïþöoß.ï·#Qô6jÑ`éÌpoý*´…Ÿw ç7Y‚3hÞ§›Îïîþï ×ð ï_½·ì‡ —ji›Ò~p„°0ª¬à‡©~ myÙ¦ÐoÇñ×qÚöpæq¢ñãao‡2ñ‡ +u¸þ!x°@ƒ/ø d —¾ñÇò,÷ï??€ qõî­!ÿ©"7r§=Óµ->dní¥ˆOŠŠ+×ò9§sàær“V"”^• ¡3ô‚Ï.)$_pß-…Phó6ñ?¥Pw“ èà¨@r%çî:·ôK×í;ê +n3sðs¯"ó2gŠ ðΦhÐHž‡Eö $Ð=«¸€=ŒŠ#à9)¿pLçõ^mMGkÿô u¾uRW Ri¦Hu …ŒH‚ @hÝS0U¸€I˜šk0úÞi§v‚²ƒ @ñ†O^ßo`H‡®þ¨“ 4[í®t:Kzðu^ö—h>ÿ‰b÷¬cGöŒ …²@õŒ@Ih„Œ¸.ÐI °Cˆ˜Xâf†‰¯x s™<‚¸ýi°Àƒ¼ŠÀé؊ûÙuÜŽ~?…°À€ýf…è÷ïÆ€‡ð÷÷î€÷r v3øßBø„¯Q:h èwÊ(éáRhq`ˆôŒ¨Z2öx¬7ô­÷ƒ@NU‚dÀk7Yu¸?ª€X„|¿í")(zàù+àïèyï.ž—)€…4 ú¢nÊítBKú"[zñjzd?ƒ£kx`°h^q_ŠþX uíxà|¦†k`€'väŒÀ™õ *𵫈é­ € ŽùÛ†‡ÀÏý¡°„eø¡Xe¸„SÙ¾ °„Søžïýß~Ù>œ(ßOƒBˆmÀ÷÷í'~ãG~ê·~ì×þHxSà÷L‚í÷}àþê€ë·„ì'ïÅ_]aGÚ”ü›ü2ˆ$ûöfð °QË2˜aƒˆ|4ì` ƒ^h|Ñ ˆƒKL!œ!,¢§‚W®TÀ‘%̘0#0ÇäX²'ÌœA›R…Z—L‘†- €!B:  ž†SB¤ÀÂPhè•q+„œ‚þET €­§4…*•ªÕ¡E˜j'CŒ¡1šFº¢ájV±^Õ²u 7+<¦ÂZñ4*á´‘Öhû6nÑÈ’%÷;‰PK/š7sîìù3èТG‡þågêÔªW³níú5ìØ±É’’mû6îÜ¿îíû7pÏlÈ,nü8òäÊ—3oι• œ™ÈbÂ`G( 2á Ò¹ƒR‰:1HÅAE-N|2 ŠvîÞÁ„¢¼ o©õéB5Í!ÇËY‘‚r‚µ ƒ .3QG5èÔ)Ë(%ļ@+WLE=AÔ MUxa†uN5—RXbØP~èâSþ‚ቂ]Q„¬Dr¢R)F¨#„IBXYD˜÷$”QzaZnUZyek´a¹%—­í&%˜aŠ6œ€ešy&šiGO¨‰zo®‡rwAœÈÉ@vÐï´³NkœCJå⢑XÒ #.v ƒNÍ%¤ZM=Ú ¤9î(Y–tpÕ¤•ùi$BŒêŽBÚi£JÊZ“—e&&®¸RÙ%¯½ª¦¥¯ÁêÆ[®Å‚I¦É*»ì›ƒ€K²y.{AC͉ósPp£Ü5ÅDÆ)ŠÒåé§Ù2§ù]© Xôœb.„±¾8.Q鮋¯½5nHO \RÈþ¼çFÖï¬JÖz“Æ:Ü®ÂJl%°[ì%±kܲÌzü1È2ÑÄ‚œŸ”BM ó€’¤Ì ´GÌ,«äHÁCSBR$µ,­F’ K­*<‘¬pIB¤AVRA]4VL%u©ŒIaôPH+­s]Z Á5VaM…,?[-ÑF_a6Ú '¹°A o¼7h_ü÷kþ÷—|.q!+¾8ÈÀ 㑳$F:Ë¡r€r× ƒÚn’cpJ ”Ú"$<§XbË)R¸ÈÊ)ýŒ#z¸…‘I?¬ÐÏ©¯Þº‹0h‰C OÖ2çÂ.;í‘þjñ‹-ó¨V˜úκëÆ½Ý“á ŒÞ‡î÷àå£&¸ù.¾øKþ>üÍ©Eñ hÊ‹ ÃÎ5ʱÀ‰4°˜Ü¬{< ¨À&ì{ácßÞÈ—>À¡o‚¾Zùæ>ûq°ƒ+¡áAådA â%˜³„åáF@>ÇÀÒ°†6T o•ÁžÆ‚å« »„Ájlƒ#<¢ý”= ñ8Ñ€€€HÀåðC@®@"ºr±‹^¤a‰Èà ˆdÄÒÅh,#6±‹ÛÌàFf)Ã:ÉñVˆe¼d„¿(ÈARa–a˜Õh, žþ1Xfld•Ò¨H\±qŽ–\;…K²ÄrXB’œ ÀÀ ˜€'YÈU²ò‹aœä"{I‰=r–·‘$,•8Nò2YÄèÃÙKƒì‚ÍYÀ&@m@…*[)Íi.ð•¹Ô•,mé«Zj36¸¼&”*9Ìq2Ç @9ò‡i4ÇàÖ'“£Gƒ»üH©©Ï}ÎÊšà#»‰%n Ô5ßü'pę΅ ÐÂû&1 HîÈPŽ &‘btÁ ñ‚M~’´¤Cñ'B¡ЂV‰ ,]ÍASʱ{2´¦ÆÁ”°<¨@£à)ʤæˆþ̹èráQä´ãi¤1R“R•š(•)pVúÒÛ¸t«¨‰)VÇDS›’•%@”³†¡à »js‹æTÀ f6P.£~ý+`+ØÁ¶°†=,b«ØÅ2°&øÖßhÕ«³@m,+°Nö3 -kY€U(gN@ˆ \„':¨ÁA1  €¥@[’„  -0K¸‡æ˜@Êi…’lD¨L²ðƒéR·ºÖ½.v³«Ýír·»Þý.xÃ{ÝüÙª³˦fqÓU¯rÖ¼œù,hmJœ@9(`‰2d(à þ‚¨0”1Ü~ä\8ˆ$ìa'ò j(Fr”€€ÜŽ/†Wò@÷Ц²éÍf? ›örØ ðÍp:7ñ8åèw%›0¬Ð‰ƒ ! NÈGŽ1Š¢Fˆ*ì˜9cÀLÁÈI Î-ÅNÞp‰?ãaÿ*ÄTÆX”gêä ›à¥K¢a× 0× In BQ™£HUN 6œ›I ÖŸ,Ù,{fÊWžÅz·JbŸ8ϼL9 µ±Ø¤AB † „Ø2È3@àˆx$&Ä8Ds:Ïãøá­ÈAC? ŒÚР…2Ÿ7ãç+ú¥ƒþvo¡]mIYÀË!ƒ Fq‚°ó רB;""UŒâ¸ðFáŒCÎ ÛéÎw¿PP 9«HáJ~€è:¾°Žõ”Ðûg×Ôš¥·6o®ËÝÆ]`o:Bª—ÅhÐÙ8í(sr.|œ%œv%8€qåMÖsÇzÖTnwAßÝÙx+üˆJ®šˆÅ‚ Ì™#’³g1iQq›2œÏ1Ä*ñÉR|åœÚ&“aÍðX:²¸I9ÃH¸q¬ÀŽ‚¯d~Ào¢.õ©S½êV¿:Ö³®õ­s½ë^ÿzÕéÜò,¿üÃ1ïæÌÃZs›Û¯ ÐþÛC %¨Ä8zELB€ Øl´ø;à/øÁ¾ð†?<â¯øÅ3¾ñïdÇå²§÷ìÚL;V×÷÷©¡säŒ6¨œ@”#~Žó€Íº@…Õ³¾õ®=ìc/ûÙÓ¾ö¶¿=îsßú}D~ÏèÖ å5ky[b^¦šß|äâ€þŽÓ÷€±rŒ²ãÁý†‰ðJ€©×=øÃ/þñ“¿ü¼o’ï|Ë–ÅOéñ‘¿¸} fÃD†®/“I̳8`r,9TNL<ÜÖJê•6 >àí_yý^Ÿ©Ûº±FûAÒû!TüÉÈ,܃ÐÆþ ÉÄ"€ |¶  ¾àøI "Q`^àee– ÎÂþSŽ ³4¸C:)Á',Ç#$[²èßG Ð Â F¡î^ïÑ`g¬ŸWe`#í 8õ *K5x /ÑJ¸Cµ%5´šL(„Ç!¼ŒL¼>-àÞ!>  æMú¡n•ž^“~¡xŸô’ìÁÈ 4€7(áJP€$Fr& ]q A8PÁqÌCÔLÄ$(ΣGæa=ž¢¬ác>Z£õ£"ý#@– ›Ã0±@# Æ5 ÃP_G:¸äqèÃ08CGÆžÛ‘E|¤QÆ`Šdºå#»í£ ¢¤©äJ6‡;Ó Á,Á@ÄqE"‡ýÉI7J<Ö”‚òõÀQ®%)&¥HRcA™¤A¥IåTRþQH “Ä/¨i!‡<(Àq4C“Gü¢q˜ÁCeìñƒ'惰^„B8ì;XC,¬ÞdVæef&3äÄB;´ÞtÁè °Þi¦f¬&[Š_H*%\ ”\N]‘]Þer £ŒÓ/¨0]q4A>0_qDÀ+Ç6¨| ‡,ÆA+ÄèB/06ÃíÉ€< Á=lëÕ ¼3¬yš'zRAôÁ¨€+¸ÃpÃêÈ';Ã}@~ºÂ~Ʀlºå)Öf7Ýfúäæí&oÇ€©õÔ"Ç3 ›q A%‡8@Jƒþ¨í‰Adæ.lÁê d(Œ'-Pв(`;œ&¬^ €ŽA€!üŽêè(ð¨ (øÍæ[’d"¨ù(h1hƒxâ8ƒ¢%ÀÝ› ;"„1p°"€ð¼C |ím@ƒ0!>¼œ¾^>@ °^ ÈYäƒਫ਼Ÿi‘¨¨6)iù0)9铯D'~â0¡W"Ç Âq,Çar €ã|cºÞ4tÁÐè ° PHQÀë­êëuÁlìÙƒ$Tƒ= ìP­Ú*®êª æž‘(’Ú ¢Ž¢²þ£6*KähZ ÓØÛÉCÈ݈ÃqŒô \tã„jë‚.4ÂÔAPÁ"êB)¨@0°Ã®®k»¾+ÐÄ7¸ ¼kŸRA'„T ¤B7°ƒ¬ök0ükÀÊj°F ¡Ò ¡ÚÒ±N²¶ÏX1+È8+9a¤ql©1hõ-‡0䨖åì}Y<Y¨)¤‚9ìA8Ã$¬ÞʶìËÆ,,4ÜC=l+ÐÁêE€9ÔiôülÐÀÐmÂ*,ú)åR2%:åFìá,+ÅF„ÅöRXjê;È 1h‚rBMæU8€ëÒž-4.,6ì,=,ádŒHZíÕþDÖòÒ;¸ XæƒÇ3LÁq8À$œA×>Ç·Š,Ú&îì k¡ëºíÅP­áÈíÜã“ ,'r\ƒ3£L<€G<ÄCr ÁÞn„l*.ëÊã2¬ã®äZŒäjÐÄV®²”ArÁÄ¡‡(PZƒ¡ÞJ\®=‡ >»—>7?‹?ç @ó¦9™'Q; ‡#„;̃Lœ@2”°™Ô“-Wô›\´yeômô…3 ~ô]*ÒòR9@ËqpC cL¼ƒ÷F2rÁ. fD(¸MƒŒMwN“‘N÷JGSÒLWµ€äÁ– Bš 9£qüÁ(ÙA8þ¤X{ÌUOVVÑVóJW‹‰Oßej.3¡;ãAzÚ7Ì3K €,$Ga~ÄÀ}Íõ²ÔuXݵåµñ4öõT*ß`#‘. L B„ÂäCÞïq %„@µHv²P6VY¶a6—ìu˜pöJšX¯©€ ÇDÔ¤LTƒ¦ÉÄ<|öG¤ƒˆÊ'ÀÉölo3ws•ÙðÔjöïñ6@º ÛÜϱhhqxÁÞÆD ÇR·œÐ¶LÙöáö–è¶.¹·š@¼Á%ETÄ7¼cLxÂ^ÉD3”cqT«qÌÏ ~„2€„G¸„O8…W¸ò¡ÓþÊwúÐ7q7ºy÷6*ËX!СL4‚{ð_¢‰2Œs—õ6Ï8׸ž3¤ø ¾2v§‡_‰}K ˆÃâ€1YR @r4öJ$„>$wq™. ×ñGV€Žc8÷8 Éò‡y” ¹!Æ 5Y!1òAÇÄô²LöGøA–kùvd“2¤öGÃ.`:KBKË“Wr*ø·ƒ»§w¹)~y›û°8­‰ú¡‡"@+XÒ;ü÷J¤FD(@ÀÏe€<¤É¨¿PÏ1£¿Ç¦¸ï8¹¼ kÖ©‡º{`ŽN|•‚’48BÀÀȃ,ÀÈÄäûG €Í—.§üQ–¼—Ÿ{Ý}”©þæ!Á>ìõÃvL‘ÄTAj0À7”^D<ƒ<¼sC~¥rЄ´D„Öžcd®ž$¤¦Ûë@‡ 6û€¢²€5÷˜è£2ñ³—>=éÕä×±ûüŠ—{wïßÁ«ÕMxókÑà1jׯF-¢*òçª&ÙþfÌœfŠ*¨é⌕Ĩ#*vÙb$,›B‚¨˜$†™èÞ(ˆ@ÄL*à€‰"Ø,¸Ylq8±ŠËNF—£ÎÆŠÇ­ÂjƯÛî¼!‰,²ÈaàÃÈî€ï¬B0Ëš˜¡o¬DNH‹;è ¤ŽƒÀ S•6³ #,‘B Gbè²Ñ.Ë'LXPs"7[ÌSO–^ +F åªF mNÇB­ÎÇ@ÍJÈ%!TÒ³lÀIÝÂ"´þxÃ, †i¦,g¾€ÔŠ'x$9ÞãuÚXã¾Piš.¾ñvh@“މQÂw.LÏ.¶þØÆ$6ñÜÓÙg'êS¦?­v§AÍv©CµÍÖ:kÁõ ,LÉ-wÉR5W-I–è. Ú-+‘Î*g ºŠYjØ”¬ÅT&¡¢‘-ꨀŠB…`ö€‘‰þ`StP‡…UHÅ=p`*RüÆ‚aÇ*Z{¼ˆ€ ­YOic¢6\p±íÖg¢¸ý™ÐowÞùQu‘Nš.Sº»1k]Ì?³byd®#bI¸äú—±”¾è *ލV*.0§8ª s¤ÐÉ›RÖ(»N:逵æžz¶påW½;Áã˱mn8œaÒ¹èFþ{ZÛ -Ç‘èÉ­=ÚéÏA+ØB«ÐB’ªQ' œ:¸A«™«Ù"Æ„$Šé#acÜñß>%Ègª‰sk+ÏQÌ•§nóãõ¼ôé6ª©†QÐj'¼‰#^²–(€.2bâ€2ÌXø÷ážxÉ¡ÿ1ùæydÿ瞯Hé³@rÉÌ >ôÐE´Ã,ÈÀYH Š¹pÁà€ ð„öù.~ô ‹^#ãùP÷ÛßôwBæô„2 a©kÀ14KP–#táea„§ÎQ¹e«ƒÉ²Á.‘‰¿™ß[8#ªp:)¤þâTXŠˆ]\ò±$dOc4 .rH$L ,I˜C%ÎB ºC&„Ø‚¡Ä&î‘%y¢í7”+æQ$ÿÈì¼Ð‹üN° êYAh©†2æ+˜®˜ #p äzìã)›øGEfgЇdŽ]¹”,®²+Œtä-é’6{P/ àŽÆ€™8A&£Y‚¡ž¶âImPS¢’šT%-“ÓÊXN–ÛDÊ,±©[â’œk‘AÎN, , ÐAXX€ ?#Ç@Ë1½£ <°wÕôgü®NãhÓ›O)dA©Nþdœåt¨þYLMê-b0fI†>Ì⤘Œ"ápF4X3$°-ÄØÅÄ  ¯Ÿÿt©üBè'(.t+E¨RºyÓY(”¦ìB˜a!ièØÒ—޵fíiVlªÓ£äô¦<=kN~T¹¡œ^6Y–!’…¡Ë8P.¨À)hªL&pX¶C,ˆ˜ÎB54‚²•µìe1›YÍn–³õìgAZÑRv1ÖLßê“´ªµ(lE¨[Sk“¸Ê¨t.]à€²Œˆˆ …Qq~„¥ ŠU þLA+˜í,Y Ås¡]éN—ºÕµîu±›]ín—»Ý.ˆƒÚØ^K¬¥Šk ÛØÎ–¶¥Ø1=2HÓ,Î`éZ¡¢ì€Òø‹LÐÀ¸% K‹ö.ø,ôoNVk^ôzS½©e/ƒq<£tà"YŒ+S,˜Á,ˆñ `2,. G^Ùc±T $ÀðeúàŸD˜µÞf…ßza{Q)Ý6”I1tU,Ê`‡•ÂR€l£ !10Ž Ô´8"ve"0ä!;XÇ6á±Z}K ŸUÈbŽ¡ˆáH Äy,×àYøp†8 b,HPÅÚþ"rh4 @Cbb´ÎÍ &s™Ï¬Ó4»rÍ=ms£( À1tªÐèX¶·à¡\Kî@Òµ ¡ aq†@î†ctA Ä<¼0>L?ôÑ:ŽôM'}ÈJÓôÒ»ž%p[ÐA,n 8Q–i8[,ö[’@ß°lhNsÊ£±Úëÿ¡Áä°ZlpƒÎ¡³ÓF²èƒÃcA Èb|”…Œe <)–(ÔcVˆÂþÀ€  À´Î×MNq—Ü5÷Ñ-PuG\i@ÎÑEfì{,^è²XVq²¬áhË ü-ÀHÉÀþ=Žãrâ±­¸7/NÅŒ‡sã;W¿Òj§-ÀÀ æª[V±°LFË:t-†u¡Ga¾Ab£7²ç©ýù6ƒ®Â¡c³ècÇ”ú0_  WÆ”)´æ–V w.V?K5¡ê±£ló0ŠÜAE püã!yÉOžò•·üå1ŸyÍožó‘ÿtäÄ[f3—×¼RIû ×N˶»]R .ftJÛÆçe€,Œe î@´X¨Ž+c`K5Â|–ìÂ(¯-3ïNŸúÕ·þõ¯oŽ£æXôä-ýyúýo&²û8Y=ë!…ŠT%ùèû§w„þ2ˆ,õ‹$T@Läa÷jù^Z¸`êAˆÂ>îÿÆÂ}Èje¶ï´ÊO'Î.–NoRo•ÎýŒ„ÖÄ¡( àãBÎ\šAÁÈÈ‚ ÌBÔÆ"æa- hçSàfÊ&«ƒpƒÃE(!ŒôÄo[Âo‹â)5pH¼Ü ŒÂ@éÊ…BŠ-ÌÀ®Œ˜l4Ѝ ->Á™Ô‚®˜aFé ü.,Ýð7|û€pôŒÐ  ©wŠü€P —Ð<"Ž"èÎîŒÄô…,@e¢>`,Š!BàJ âaø-Á-Šþaö ö"Kß°Q"!péqªë ‰ûaî€4à/RTäÄ¢ a,ÚÁ‚ÒB`À ¦€ŸÎvAËÒâ‚ Â0£± MbAOW‘‘"›g£¨½/ÄÜ*€ØLú@ `àR0ÅPŠ-bÁ—Ä¢ &p Šâ´ä‘HîÌÒ¢ ² ²xR9„!Æ"[H"'r.þRdN°`@Ë%ü&h¡ÿ‚6Q,ž`ñd"Þ¡(v`WèÅu°Ïâ`bPln2-s²ìÞêÉ!•G(Iˆ(‹²-Ω”À.@ d!€¬€ž²,!™A ˆœ¤r,dÀ$çBŽ‹’Þ$-¡e-«ÒzÒ'á2säÒè².ׂÞ¡«– bÆ iÁÅ¢2Q&TÊdBêd‚1raÌ!Ð"ëÚbCH§&)“$hM À7þ€Ä€$fî21³wÒ-é3-'4ëg4Is.°@ “\*Á¯ÖâÂa å€}ÄBð` p Îbþô‘.ZØH8Y‚JAÃzÀ7ØäNÒä9¡ó’:¯È:…;¡G;·³-fNñ†h3&Žà Ä.&ažÄbê3,îÁ -¢@ ¼ ;PEð¦)%ø€ Ì`"$!b.£26à "!FÃ! B"üL~@WB3§³3Ò@AGAt-Ú ¢dzÖ` Äâ,‹I,œË=Ï –@Æúîú *ÑÂ&QÂ1 C2¨€2"$36£3à3Bc4Jã4Rc"`MO@fÆG¥1:r@…”‰ÔgŒ”s4IÓbàJI]Ô¡BeÂÄ"$H,ÁKc¢ º÷Äþ âÀ|ºÁ¾$`2€F`TÀ\ÁtÁ”à ´€X"A¤A$Mؤ?G#C¨`C:„ Ö®ú`6ñ4%€”O}²!rur•PÇäߎ Èg,VáÃ"Ôá÷d"V!-T` ¤´-ЬÛÔuLÈÄLÐäMnUEüóMše" tÁ ŠÕXõT'‘5YsdYůY‹æY¡Õ,Ê&Íe ÁÄ'J}Ó Ó-®A bŽ;J¡cZ DÁ8 $A¡@äÀÖ&%n%W@„W|X„ˆ¥MŒå?  ˜ ²!öõ$ŽUþ ”Šþ´[Öh>ì`•朚®\ìN†A,Ä¡\Ç"´t,&@Öb%!mâóf` æ`faæa"fb¨ b.&c6¦c>&dF† è ñ`àDd ~¶$‚v‡V…ŠV[Ž6\ ViÇ¢ÀÍÅÄRêkÁR& ̨,¢€(Á;’À "€K{lÉÆlÐFm&¢mÞ&nêd"èÆnðqúæovL(do'¢oðoO(p½E#°p 7, 0Ô85,Z0,ŒŒ+ Øà¾b" –|ˆáC»CŽ®ØLm×¥p7uwx7Q\€7xcBþúà.Sü1 ´V-N.&Lí,z¼ºƒ RDºw8¿—šÂ·üÆÊQηs’V}Í%n’S@JçÁ 8 ±¾Ä@¬Ê, ¬/ŠÁP`\n-¼w€«©€»ï€›' e«%}jC1å $3-!j€@,ð`…Í /ˆá~a zˆ…Ø…û†­±Oñ†‡Æwˇø\IS Œ%´ÄBáþ -¸ÁÞ·-œ~&¢¡êàr퓊_ÊŠ9`ö_‘‹»Ï‹Õ `5Ëå,߀{ç˜à}@Xì¶þ@ ºã(€vÁbÚ¢…õ¸Šû•-ÏJ†•G‹yĆ…ƒ÷Ø!’ÈSéÀÂb ÷($¡Ä‚ ê@ ÊChÁ7×Q,>I;yŠ?™‰øØ×°¸MyGP9z8‡ÉE3¬wRœ!ŠÏb bø!,ÃB>X&D¡_Ùb ÐaraIŽw2—ùŸšyÜžÙ£YsYôT9x7¹0…µ@, «ák@JK€ì± ^Ùªn&–àö!t¿T™ëÙƒî™âòy÷ùF¦9PþÙpí¨ÁiàÛb"ÄÎÒ¬á! oކaƒþ‘Št™,ô 2Ý“?z‰BÚçFZüJÚFNPRZi‹¡ú l"å|ó @&Šá š ,^á›é@I+Ž (n`Î`—Ö Zaa¢L·{'k´ìú®ñ:¯õ:¯§ ”7Ó™ý¸µöûžúªÙš1Å DH-ô Q×W *”Í@ŠÂ R@HÀ§ÇBàY,›±Ñ¹°ï´Q;µU›»DQýv©¿¯©§ŸË,ª•V®'¥´5&®á •·UøÈ"N ZA 8À[Ñ Î ïÊ¢¸Ôª;iD¹§H9sd{: ûGlû`ñ€¥“¦‚&°:,ô5þ,J€ÓÆÂ\Âa5-Œï, S¦ûsª›¦®Ûr²[:¶{FºZ‘`ú`„—Äb"* ‚FA,(:&ˆº„Ù,Á5Ï¢Ý"ü¾•&¿j¿…¦¿i'%ö°AR€xRžÁ¬Ï¢’ &B`„“àÌ‚ª 0HZ--”ØyÅ'EÄŠÄÆÄã¿]HżH†*R—„ z ,ÖAåØbȸ±˜R-Ž·ö³ó à:Ê!ÉÃIÉ}†É›ÃÉ ÊÑü<Òa}¨ÖH.àÃaBdl †@±Êá„Å &V-¡X€-,yÎËEͱþ‰Í»ÅÍWˆ¶u,À¡õ¾j$äB7£Ù@’bBŠΜ€Úb JÀÇÇ]2ØÑÉÒiIÒ/g°Kαãhæaµ=Ø…ýú{.TA¢–H;& ˆ+&  ÑÉâÖ"ÒÉ-h-h½ÖÿŸû'9(-ýÁŽ˜a¯Ñ=ÝÕ}Ý?‹Zz.$»HHz  I/,Z`¾%Õ6Ó ØÏ:Ù ÅrÛÏÃÖW ׳…Ò{ÅËŽ•øàÝÝâöà2¼Hô2&¬dâ¤!ÍBÊÀ³ÉB>èÏ-†jð¢ñ:ïåa>æe~æi>báIáþ…ájÜÇëá#þ”&/†|Ù¿# È0¦™²=&ÄÀž`â4¡,¢AÛ×âJ/z²¹¨¥oØÁ>ìÅ^ºúÀ¸pt~ytݼx}‹D ⃞†ž.ׂ‹äÞ)&²Nê7,p@ËÃ" ¸9-ŽÀ †SÓBîa쯨=:î…g̾ÛEúÛgç±Èç×ëÃî!Ÿ‰æ~.R /€‡Á‚´¬’N“1í>-¢A œØ-èJˆÏçñ?ÿw$ßµs¶Kó¥¢í“è{‰B.h­#EÌ&Tþt¡q }œM ãÃ"€Æ\-ZFþÛæÂ¨“?x~?…Vø%líYËø‘ùÏ¿ƒ–ß-" îþ«e☄Á >m" 0`š\ <8Â…ÂCÓ¤’É&a€LÅÉt¡2¤È‘$Kš<‰2¥Ê•,[º¹¯!B-¼Ø¼‰3§Î<{úüÙó—ŸYD‹=Š4©Ò¥L›6€”Ó©T«Zýå¨Ö­\»ê„`!/Ëš=‹6-Z>Ô8rÔ`‹Û¹ÝE9H…Âb\s˜¥ Šƒ$!t OÝ´]<Ñ£ÚÉ”+[ns!M¯œ;{ö"ÔªèѤ“B•Z:µj¤X?»~í¬X²—kÛ¾m–-dþ‡HÔH·{nZ1™8!7,nßU¨¸K¡ÍÜ@ >Ñ€NØJÆ >¼ø‘™gÖ„}èÕìÛ=í>¾èÖéë»–}pìøý ígéÖÝ@,àA‹m"À@\¨³ÄA&x2ŒLdÌFà¨QŽxˆÎ] t„9´3âw®ÈbYå´™}2zµž|6Žß:*Eߌ>j…ß@úµ8!LÜQÇS˜@¢@€D²D`À܈ÁaEó€€ÍsÄ78´À.òÁ,öÄÁ†ZWZª8ežz‚ôâ@1þ(O5îHèR9Zh.ŠSþÀ ¹çKôQ ®ø†KH‹D)JUv'Œ:¬1'B'6YPôB9ä ©-¡D!ò…œs–À'w~¤Ò¦P kVŸÀüÉ(£ƒ" -Q‡F{£¢Í.ê(¤È¦´;Çl’êÄ¢)§!ÂLnÄÒNHÃÎU RìG>Éð’$ÿ¨Tp`Õ0w°Ê4)}ÚÝÜ•:Ð"t„‚­3ñ@ʰ‘ 0\PáÐn- ‹QÓ„–½øëJ›Î¥ P»mÍ*)Ëìµ€>Km¡ÓöŸµ:ÿ˜-m6ŸDˆäÇ:åJIE}L¡‚+îŒÁþ HžÈc„ Ô¸s ©-,sF5TØp€‰ôP,¸°Ç+½l·ðc 6f'ÄI"k*”Ô Ñ‚ C= ¸‘Å:8 1â•ØÌ‰çI›ÆÃ@±·ÓuàCEèõ@0#¬0èªËîÑüá|ÞÐ;4´?çΞжËX´ìš›[Òæ!aÃÎ Êã&!áñÁ(¯ð/MEłԹ”Ûy' áâŽÚ'±å 7ÛdsM5VPÊ8ÑÄÅ !2oäD qƒPô‡j„,Aˆ~¡—Фã·xF`p†.°àR „9`¥äìðÆ÷Àþnx½ÈÚØv¹ÑÍnx“Õ¬†5ቇv¿»ïµ»¦Æw5LOðdHD@ÃZ>ˆ€$ÿø¶GãYÏ\ß›¢=@QyŠHì¢÷‡;ÔCqpÇpˆÁÑÇ`Båo"¬º 3ÌÀÜ(•1â‘ º¤Š!©‚5Þ‡ƒ:˜{x£ùª<å€yÎ"nhØÃñL‡ñÉ!'GÃÃL¾æ‡– 8ê„,„Ä¡xZHº°p‘SÀÇ5,°=BJ±stI#r €dwÛù¨Ñ…n|#ä0‡ØàvÄau¸Ã=öÐþ/K u‘8P Y0` ­Ã@  <ãDˆ7ÔÄ‘j¸ç˜c©€oHÂà'< QŒ¢*H…*Zñ YÐ@èÅ/†¡„d0y$A²©FÈa*Iç®H…,®áˆHTb)mƒIQÖg“Ÿd'[Z•PªÔ3¤<) ч0À@΀ ¨P@ £`DöòéÀË G7L y ‹hPa/ÄIc† ‚`üǨËÇ àfÒc IX‚1¡Œfò!¢Mq‰PÌæ8þC AÈš\*´+†šQ ˜W+D†¥A*Tƒù¨žg¿‡ðw¸Å=.Ž'³âwÆÅ2®ŠkëœËù'7~³ž07èƒJzÓÜÀ© G¤ Jø0øð‹ƒÌ@KØòsl£"ÛàC}¢ lc Ä2g8ìa#ѱŸÁç=w…ÎxvÊkm=Ëš'}~5‘B‡ßIbƒÀÒ]¡—O  ÅxCÞPo°Ã®~S&>ØG€TNQ˜Ë"‰(«0ýáAûÖÝÎÙ®·Bk\*Æò†mVÞÍ™^¯ˆ<.ÐÊô0¢7`þ"Œ=1Æ„bX ±Œ+U„È oÄà„ßPí’çBÅ `x%Tö!ì}ß&ÖøþI¼ë”[×[×%¿‰¾E.»~¨˜Áˆ$1ŠpÀÀHG_Ñ`cØ Q ìy#pB"~;}iÜ¡›>õ·a^J’·\P¸C¹UT.o–oýåX¯™Ì»³>ÜAWݱƒ>¢ àãÀx#œ0…÷£z÷ŽØ>"d¤·A>H–qqWŒ—]xZߺNNîõ¢€×bo9Ù¬³w‡y(•!€„a$p"kèûAŠ!@¤Hõ0õDàÛ3]üꘗ]ãÈG~þ“¯uåK~ùÚïIóعÒFœ˜~ xÞ *„!9¹] 0èbÕXþ@н…n·Lø@¼=îm¢ûÈ÷Ï¿ÇwðÉ?%âç;Dw¢ÀŽÐG8È¢áo æ4Óàl¡  %Ó€ èÀ }´Áבx´Èb~ç—~^·~uÖ~ïö~È"òYt Ýzì`à $¢Â@}Cñ0p#’Òpé€|ÑàÊÐXŠ'‚‘’¸·(×2ö»–-á@ Q(…SH…Uh…Wˆ…Y¨…[È…]è…_…FPh¥Òlê¤ «"þ—f Â@sDg ~Âsn†ÕÇ0 33¢P_DX„zr„Ž—„õ¶„/Ö„²æ(Û€‰‘(‰“H‰•h‰—ˆ‰™¨‰›È‰‰—ÖXJ‹ÀsŒu’  ØÀ^Ìw¼ UÇ„P¯r` ù± ù²8{ƒh3…¸u‡(o‰øZ‹¸gŽòiÍèŒÏaõÐ]²¸ð?J Š aàu{Ñ Ï1âÀ±P ®Ð €ŠtqÐ ŸFjÐù¨ûÈýèÿ)Ii¹}Ðn¨u~;aŒ¸†Œ¬¥ŒrÆþŒÑh‘‰‘ØÁ+2|`KàK 26pX a±PA Ò N Ñ€_p’tAÔõ•`è“? ”A)”C…Hçn ™{]·{¶FoKyYc™‘SI•U9^{@XØA9ox!Ðâp•FͰ•t1*@¦À Ýñ  VI—uY•G‰”è§”N9o¨Á—E•,&•vI˜…9'” ! åpDSТz÷(‹1ÌD ì€pØñ Ôõ–†Iš¥©%x™—Yk S)[ƒiš±)›ù°À8‹JÖé0rþRz ^€ =¸®7v`Ñ`.Àtس)ÓY¨‰”ª‰g¬ÙR®™Z°IßY˜ª0°Ù€Ï@ çp‚À Ĉ–Ÿ·Û0à A DÁg°’!u}à) Òi ‰u¦ŸÄ3åê  ÷° ñ ì@€ñØ[ ‹ayÀêòpt3u€&ˆ÷ -Z˜ª{ù—)×”3º *Õ .ª£Í˜£H.° 0 «Âe€¢ŠÀ ò™±­2¶xH°N€ Áá{°m°£]J•0Š„2:£ïQ£y£þ¢”£^ª¦ZR s­ˆXq@ìP±@&Ñ Í€Mö Á tqõp€weUõ¸¦‡úŒ`jˆb:¦ÒR¦|y¦™”¦ˆJ©Á p ªÇ†P 3À Ðð*ÓÐSÆP H xWç°wp–Ψ @«µj«·Š«¹ª«»Ê«½ê«¿ ¬Á*¬·j” ™—7q 2– œ©=ä(×° Ñ*­ÓJ­Õj­×Š­Ùª­ÛÊ­Ýê­ßJ­šê7NpР؀*PAr @s' „Ÿ6 Is@”ûʯýê¯X¨ša¬Ç ŒÚ¨ËªCÍZCŽBæ þ±+±K±k±‹±«±˱ ±ûŒ›ÂWZ ° 1 \à ºÐoÀü°\À"~~“Àó ‚(Œ-BŒ-—¬/†°7¤°¿Ã°ø³D¢,õuSÐ+ä`!^ÐWIÐpáÀ XΘáp‘>»´´%·7@EDpDû¨Ny´¶“´kÛ)M[_ñ°û`‘ íÀ’‰Ñ¡G ÆéÈð gp‘¡Î ®¨´|˶ I°g°J±™h°’@ ó°™;°¬U´¼“·C³·šKˆ7[_¢—{¢° ]þÐñ0 …'BX Þ×Xâ•­’¶™ »ãѶø¦{ApMÃÒ=€7p›ùI«›;­«3¯›¼L+»õ ¾q! q ×P3€ÈÞ°Q@9”ó7ì°“yO€F©¶ß[ZÛ¹9y90 (YÒ°>ÐRÚ 4Ü{-ÞË¿+â·Ÿ†OÅt ]y 8À— Øà¸ãä áûie0ŽÑ¸¿\Ëûnwx Y½’Àw»” Ü,ìÂûÁŸfЙ?(L,wjð \X qÝ@mÉõ²‡‘-ÜÕû¦{”Y}° f0 ùÉIþ‰ˆ½³p¼ ÆÛ{oÿër[ V|ÅpfÂU ¢¢‚À ^”°ÀŠ5ÇŸv¿F•pÇi‘Ų¦{¢¨M0 ¼P K·@É•lÉ—lÉ9 Àv†ÃMq;@à P©· ¼Ælì<|Èý‹‘y@¡©ƒDC@9G „& ¶ë7¹#ô <[ÅÈÛÊ”‘È{¦{£ Mn0 ø0 Jq ³p Ã:,x` *ÄÂ!Ð ³à› -:Ì(¬\Ì/È% âÚDv@¨ ÍVâ}°øP•†|Î/qÌr¦{*êEÖ0 ×€NÀþ ¼` NÑ-ÑM?›i×ÜÉJ±V`†_DéÐ3äŒ-nìÏÂl€£åÊ© Ú) màEqhà#‚ ð¨àÝaî€AýLÌÿŒ]cºGÄ]t ³ µÀi\¾€ SMÕUmÕT³€(€Ñ~S’ÅQPƉ’ÊllÎ|k1£ ­ÃnTÙgdR…D}°* r„€¿ÐD0ØA õªs, ÄP n… NWÏ T`Õ×ÀÛÀ Þ d@f€çëðp r@vpá@Ô+í'{¬ŒOÄÒ Y°Ê0 çÀ ƒþ° ·Û¹­Û¸- ³0 \ýuu HÚd €À‘<Îeý¿gÍ·®ÆØð òÂ!ÑÖä0n߀H Þ^° \À>Yà>ï Qð Í  óƒ Æ°ö“ªÊËñK÷¾DäàË1O x@¹p! ÆÐM¡ÌsÀ #ZÖd›Ñ[ÃYû õZÚ$aÔ,yDHd¹° ×PP Ia£Æ¿ÝÕV‘ µ@áHÔIP ÄpÑI±¥Öü”Ìݹν¶Ð-žÁ PKGµ*0n½‚Æ`áQŽ_{à‹÷ Fu@FeÔàêpFg°þ]4‡ PŒù & Q # ÑÇA5ð O P·Dq}wp‚2°/ }pÏ×  J ×P¾•ÌSÃûV^u0Z®l æpe0ßÐ ]K[ X@ Ò ÎÀ OðÇÀÎP*qÒÄ"%ð Nœ«Ê[=.Å(> \L,„…+ žNìÅnì]  -ÜœìÕN¼Y0 »@¼Pp °ÛÎíÝîíÛnlí¬ä+äKëjíÐ¥Õ èP ÚPÆ´U4³û` žþað cÀLgàLϤÑä>òþáÖ”•û0ãNj^äœ`Êp*¨ ’°Àà€À€ 0Mp XÀ  Ü³Ü@êzÀ¥I° A à^H@ÿ‘Ê Ï ?ÊðÞöC øóŒj ºàS)C@<´^ëþ{ëé'€8À M°ëPÑ>àãE±âLåQ ì/žëAY ]pÕpµà ¼ Æ ÷sO÷u/÷ÂpÆG0î?~ë6qî?KHä z0*ù€!ñu3鼀ąm MWqŠM\€Ö  &²q#"  ÒpÑ\ýÉç U÷j—ûþÛ9`ÜËmàãqõàü@]Ú@þÂ)S,©³: #‚.[— ¶b½³°H,à_öcÜÍîɳ€^¹@µàGá70 çþé¯þéï ¹0Õžgå~¬/Œºr`—… q@èÔÙ¨P±Î@„ RÙ' ØCˆ%N¤XÑâC2òØ@‚@sEJðk ƒ9ÊF>ô†À+‡+eΜH¦ËBœ Ðn!*pJô0ˆ0C½>ì«sŠ=âQID\ö¼ê N°aÅŽ%[ÖlC‰ZxaÛÖí[¸qåÎ¥[wî/?þ³ôîåËwÇ,!ÖͺÆÀaÄžúî50‹ bÈ‘G13kŠÅ™ù&¥Ùó¬Y9—£M59K²ðõ±%رeÏŽ]*¼2ÿr`×÷oàÁáB°ѦYäÉ•/_^¨ª'€H¥‚@/SÎp¢€6TÇ<“æù•dæhuäÈ!è/ÎÃÕ'ÚJ0ßv“ß_äq²t:¬…t"o Aä‘'Ž9 @H§©¨0PB¯ÂÅj˜ÓpC2ï!µ„qD½Àë³½¬˜…ÃòAd4â@Ì Nž©%³Æ“lG(³ 3ûâ,ÈŬCì—Y¬ÈÆ)CÖvþ¨†È¾ž¹-·Ýz+qK.ç"θ›:sÌ1»Øqª,Bãj&@-òùF—¢ÊóïΉè¨€UŽÀÓ¢išIŒ0¨™?Å(̱tJ ˜k ¬!k!!šP'{‚€5ÈuÔЊ(Ä.SMõÄÏnÌ…“È(˜Å}PD/^nÁÑ1wôñ2*÷2X½$@¬3xq 1fÉ!ÊjÒ9cZj«µ¶”Y¬ÄM·ÅxSõ[.¿„@RË5—T 9S½3€=køÐÝ•Ê9%ø£OrÅšp¡úg´ áA訑¢t²` Uîˆô\Š•kĵÀÕX8Vþ?›çŽ™…‘ fÉå³{•ìW ƒ6Ø |pÀ%˜e“È>Y¬µjÞQ92W²½’Û¾¼ÝøèßÄ]´b¦›&K¨\˜ã˜ä.Þ=~dÜEß«/²‡ýº¾³_°ÈÊ…J¦Ah’ž¥*R ŽsbÀ1¨€!Tf¡0ŸˆbÁiÄòU¤—«ãÌž‰"÷àÃÙ5PLùçÉ*–Ø—©læ/dô²§VÈÐZŸ9?,hm±ìVKÇkKi`ÈN|wŠ!¼\Шz^±gjÇ%i (ž¢Dî b–ïO÷…¾˜ „¬‡ì *ôËã~@¾#€.0§þ8ªàpj`'²à}~ÓÊØvü!Ï •ç°"ˆ mÎu,#Ö,B¤\Úð/8ÐÉ,}áYë\»¡e ôî¨G?†ÐjÒ[ 7¶€; €„ÀX‚)S?­ð<Ü]ÀB¸»Å݃Ó_¸á„<üLDȆæxåºy®eT: gnpƒ% ÉËA¥ZŠ7Üà/¬CâÝ„¶- î°vdÔ ÍH¿Êð"ÊØÅaR„剣ÈÇÔˆ"Îlp>Θ¸ŠÑq=ÜË Æ9ÌâFž ç:t&H͘ŠÜ™3l#´Àš0‹ø`gþR² ç0ÆÙ Òqdüc+qH¼;Zä œ6ÖÑ5ax€rlhG,gXFú™ û˜„+›HU{‰ß@F΢Ê f5­yÍ[TÆo¸Å \É ]ãFŠÌšá‹d4ádš©`O)»¢Ñ.™c¥1íI±4ú²"âÐú A¹KZ8Œ'¢§Ï™äñž Õ2ç ®eî `s3n°ÈÌ,åhG=ÊÑÆð› R3Š^1ƒN@Q;‘øN¢ñÅhW=zS1å¡IB'jåŽFôNÙpÁa¾‡ÒD¡8eêXJÓUå%3VGÕõ Ïø@«[þåjW½ê¬Z<‹‰àüL5œ²^½bøŒK/øExÊTžPí’M›zWvÁ2©1ƒZÔ nÈG@óÐ 8îU&KÅkcK5/ÆÑ•KËœÅ#¬šR) pÖ7%ù™pŠÌ*)Ý ×˜îe¦’ WqÆLÇÆV!:U¬DÀ“ÃCÓXÉø` “V¨mBÕÐä&W¹Ëensû\èFWºÓ¥nu­›Ü>@V‡¬%ei`UfÌ›‹ñÆ,¦}@½ë]ï¢ñÞ÷Ê!ÙPƒ³¶XR²jæYeà\¼!Jvšö¥pp<¹[W×b¤»`pƒü`GX¦þp…-|a gXà ÎnqÛÊÆ( ÄìŽkl#`Àh\„\óðH²@ çXÇ;æq}üc YÈC&r‘¼ãB$²!½)L$ö¡E%0x±\cÊÐ ¨0‡9 (F™ËŒƒ#ä~ Æ:QdÒ½xãHLF- LA)í {æsŸý¬+mÁn–+“·„;d@Ñ‹ft£ýhHGZÒ“¦t¥-}iL7:É5 2(`ƒKºN 0§M}êS/ÙÐÀ!dŽA«r`øÀ`”‘Žœ!ã- jqƒ,üÂÐü œõR‹t‘¥]@þœýlhGûÙÑÈÁ‰]èUw¨æv·cy„s@=P‚~î1%à 0†·Ýýî;ª:Ûv!¤2âaÕÃ܃ À Ç>œ Zl¡u Æ^œà‡7´ƒÜ€7ôðŽvø„PÀ,‚ðDA1{s~5ãŠ."I3¹ÈÁ-L~r”§å9xÖÃ8ïàlÞ3§9½ì&Ô\ç;§—¼a~©.Æø>L0nð&(ã{9Y.| Ž\” Ôä ™ /ÌâÐK(k "Ü"µ‹1ö³–åº| aúͬÅoÐ Ihfµ?·‹Ìy~w¼[øÊ{ßý~ŸÓ.Ë„Ñþ¦€ >@F3¸@e `oF6`qè…‰ (¡™@iìBòx_Ú0 |‚Ð{ùõ A @ö³—½!àû^3$a2í ®=‹¹ ÞK þ{ññÎ ÃøË÷{à…ß–e†ÖðnXBÄûC2ä ·ð†žá;ïí0 ¸1ne2ð¾z¹sfŒM@à{|QF²PðxØl>ð@Áü_°d¸&~¸A¸^È‹k ¾çâc>|7?€_x@ ¬9ç[ÀeÃ; U°8^ø@ A^‚ZÄÀ"Á ¸:¾X=÷+½¾À«ª'0†x(ðþ…6À ÈcØ‹h % P˜[@º°» \ÂâÚ#`B(ä¶ |¾er¡ ;ÈÁ˜ñ…[¨1¸—ÃÈ_ø@­j;½0¶Y |kE€ù+€cø†}…½8‚ @@€ƒyøn(p€ypn°¸Y;Û¸/D¶PÂ(ŒÄXØI¼ÄÚšBá[¦¸ÂN 'Ú 2`?.˜R¸¢PBCÒû¬¾ð&50<_S’Y 9c€bà(C`¯‡7`† 8DgA‚i¸³FtÄj@LlFŠ? pFiŒ%M<ý¹\¸ðD¨‡T¾HHþð+tಠƒ¥k?U„³¿€5|+_Øg)†H‚hð9 †wp0ˆd¸+ˆ†s@€Õ¹f° Ï›H€#TFœFˆ,\ˆH‹,žj¤;ÈÙ»9ãF ‡ð„Pw¤#9°8—SÅUd§\¸B; bà^¸†g 2‡ð_˜…a8 w˜^ð…køÁDä PT­¹rH¶€Ä‹|Jš0A€JªL”Œü9È!‚#¨P2üL0–|AVDÊÛØÀ}8‡A.<õ!˜ýû@_¨¾à8¥dʇ¬J½¤ aƽüK‘¸J˜ë!¸_È´úJÈP‚þv˜…^K²ƒA½ bðDf¸…vðÜÌ pº2Ì < YØ¿¤KIFGtJÀL€XXMØ ÌíbJý©…CèM¸‘€‚6RLlß+ÈlÉÌ_àF#œ…‚ë:QÊÈ+ ‡ÃІsÈ,ÔDBՌͪL€—ÐNï´¼t ý!`pžp@x0 ×Ù `OȘƒ `9Î4„Aô¦9òÄ€á¼~°Z±[0†© «õ#’ë\Àìü΋L8tPÌy#$ruX¶@¢F/} „_ȃc¨€¦³OÏ0© ºøJ#@PÐW„Œ`ð,àþ…¥’}¾•PˆÔ‰UàQï¤Ðlë¡ZhÍÈX­s’Q–ê¬YX–3QÍ0) 8‡ZÈÅì•8EUÌQáÛQ uÆEà£0M!]µ"OçÁ¤À×Á :Ñ(N†/X½Èä5Èl¢šD‡b¸søÔÉÒ¹¹Ý€.]J¦Ó2½DF€xÔÕø–†6vdf†cäÛ‚‚¸c„Ü=èk¾fl5iþ0ƒ:‡ ûæonX,grÆ0nN”t@"6€š[äf~çøÓuI¾šj”‘þâ€y’Ý8€‰…Y(•ñ†¬Kp-hê&!FŒ3˜åÌà_É8b[‰€Y(eÎy`–»èåÂi’.iĘGP•d~ˆe~gf~f.ˆf Ž%Àe4¸iœÎiÐ ¨;Ò'=ЂDj¢.j£>j¤Nj¥^j¦nj§~ê¡Ö;P”t6M¸j¬ÎêÐØXaNsg—väøs†˜çzî9JŽ ñhk·vk« XU’Ý à…Z…Œ|p/è•:¸…hˆ…<†þ?ø5`E~EŒp€è¾àÔ“ ˜UàY³ÉÈTÄЃ•$[¤q!QÈiÐ>²e2@0wié°žãg¾†˜i¦i°iÐÖéžÍ H…v‹%= ÙÚ'˜jtî¤ÚÎi: †Z1âz7°^m9ëk(kzÆá×Mk¸:(i™0AåYh&ªõI†Y0W@ƒý;hpÝØ×ÈøÆæ‹!mȨ`h΄ ¢Ã¨ @PÇÏfºðlíFÑî4ø€ 2æÖJíÙvnÖî$7~íØV£š~p4Øé@ƒ ™mæmßþmÄ þnª&î§JX„y^gæŽ1 n‚qcé>k«´î·ÀWj€<Ðçå0AÉPƒˆÔÑ–ò(bh—[€Èø‚úî ž•ŒÑ ^™†5yð€(ð&`@ÝÀ‚È8áäì£qpíŽð›&ý@éCScùPí§cïp™–mÚÖn¿iA°Ÿ¾£ÞfñÄqñáÞ—q4Ðñàj¯V¬æôk€n7kêþ“{N˜! 4X“kºÞ P¾ë¼† HÖ„¯#°…dƒŒ.ør¿¥‚©mTuX³u _`%À…h88‡ FÜÞ;þ/n<¿éxèMÓ&‘•@t䫇ÿs°ÉÊñÙñD¿éwÀmÝ–¡G‡t§‘ô?IgJq „›^SHîåFµNôøû†I8øI õ†Q¿“RÏní&rœ–ùnWºÏ ïÈ–Œ{6¾Èõa¸QYÄØ`?¶Yx‚i‡#€1ÉÐ…c³`ÇZЈ G ö΀Ͼsm 7”c‘o÷G¾^É€; ñowœ>ñ):gé™wzg{Ç|¯ô}ÏiŸmvx÷t7`EyøS…œ6r$WòÚïhVÉà» ZXŒ\€Ðþï€ kHù½óÈxZè•°„€0pøA$À(‚2^Ÿ¯s ðlÏi=‡í”ޤÏp³¿oÒ/}Òo&§W÷C/n©ÇéEïéŸ^¬ÏzŠÙú;éz}ç÷œÆôaêêSøŸMÆäh€µr·òˆGõœVõØë¹ÇxÍp5F`ßÃð… Œ{¨Ñ½ðÈ@ù`†cP‚^¨Ýûרå ^vɸb@ƒ^ €#ØF˜ lPà‹ÉGŒ¨|€ð"p Á‚ 4@š†žÐç¡Ãx»A!B6€ )r$I’V°¹¦r%Ë–._²$ CÉš6þo’¬†’"EBðDóÆTÆp"ũ畦NŸB*u*ÕªV¯bÍÚô‰¤IÓØÔ¡.”x®1µ€+^ßµ)@˜vï¶L`B\›Zp,±h8xTÒà0CŽìå—ŸY–/c¾ÌËò6Oæ0 €q4»s³n`†0#µ F0{4+HæÚ¶oc$u3êd«GG˜5æ÷hcÍrÌâ…¦%˜·ü^´ûö/’¯TÈplĉc?äP…v}mžL‰w=L™4ÏÃ×ÉÆ0Ÿ@Çn¸@šøI—j €XàV]ù'XbVÖYA-¢J$XaþMsÕÅž†,éÅ—…ÀüuÝ`……˜bA @ yp€‹Q6]fµ1Ë-Ô€DSŠ"´Õ’™'¿9÷F.Șdm¹)9 ÄÊ,S@¹Å,µø0›Õ³C.–uñM^VÝ‹ØigXwôò s8ry“Þ†w^ã^ÉGŸ}ô òu,°çH˜¨¢‹È Òç aúÀ>ch…â¹a‡t†(Ùˆ†™hØ:®`ÄgJ#™>ÜÀË–]cO–eٴͲ4(dÜ,2ðÄ•d&Éd’¼De ³8å'˜±%Füœ6‹›«-€ì,f¾þ‚Ü@–&wч†EiÙœÚÙ){zjzSŸ†ýIßPE¥)¢ŒpÀŽ~iƒfÑ—ÖZmÕ §ò®÷釡F6j‰‰¥Ë]±˜«JÞp IÌ’ƒ¬VÔ’@ff\É*p;K–³ 3Ú7ÜÌ23{‹™²2¢Véo£Ìò”âlYµ£É#ˆeäü†jd‚ëb û-˜¹A­™.à‰G^`ïZ/ÄwÑÛpI÷Ž•oºùíן¡ÿ \·Ýl¡ÁcIšn„ª×ÃgÛ%±…CfqP¥¦›âŠ-vŒÐÇ@ÏâÄl³\cL-¨µ`Ù-GÌRÌŸ´>™cÌZ£ÝþqA9;Ìšmϳü,cÕ|"áh(Ì"ôj«ØxÙ †üÖ-Á„ vlŽlÕØÑ2‚ ´5O]{Ýæ›qrDvRb8Q“Ù„¿”öžDPÌÚ;áû“× :h¡q-aÝw㟿Ty'•iM{¥o颔¥08‘$A.t!_áö*ÀdÞàˆâx¸t*U«Š\A&7Y™f³Zƒ,Ó9ˬ# ¨†eQ›0J£Ù‚63»ÚM糺…bÌB ¿Ášqä  ¿Fs(äâÞzÞuz‘9Hd$ˆõ(‚=¯­+#9ˆ÷2ˆz˜ &A þÛ3“z-ä2F¶ ¸Íkû€Qಊ„$÷Ó!óÇ?¤|`( y"Àt)Œ-n9 0±‹x”dpmä'¶EA°£é8H)rA¯iÌ1$ˆ«ð‰bL Ç Þ<þ0‹ð‚»¸ÉŠÐÕæ"2|Ó3¢1;Ú@7ÈòÁ¬„IÌ"8† *aK*`ÆNèÆjöa‡0`àÂì¨(™‹üšÀâ>ba..DMèzŸCÀ62~.ƒÀHD1IŒo“*1šˆt\@!¹#Oòø>¸ñç-!Žp(¦2£†DW@€|¼#i$Eþ鵿±BD€DpÑŽ‘hR ×0\…(fŒÄo aH…1z¢Áq,Z%Œ*3 B F“PC `£   80SŽds{f8Êqƒ©õ ‡Jºjd2𬷢•exñ &ètAÆh1‹lø ׈†2Ô„˜ÕÆœ‘ùø`c”à¸G*Ú‘xžË;@Eƒöàd2âäp?K0É€ ” JÄ4±vp" À`hOÜ7Y4ÄP^ñ]2æ!’AbEP\ú4êÛ§'ˆ’>Ĥ^#à¥ü×0DŒ¦6XCHb*Pš&ˆbX,Fæ þ8 ¤”9åû2U­ÒU $aÃÛäÀ³(‡  €u:>È…îæ° G"o¸Æiòë-±ÊˆÀ~¸¬|P‹r”à ¶L.jÔ„ Р_’Ù,–ð†ÑìÃ9¨Å9aO°Äu`‡¾¡ j8ãîÐÂ0’§ƒX¸¨0Å(@‚Md€pÄT4ÌDÃk™ƒ(ÎÑŇ|¨al×@0{¤¾Â±`ŽÐ ÃTƒ34º‚4ã1&ã26c€`CÒåC"ŽÑЊ÷€„E¤àÞkÁácA \†1ÈFlÕøùœ^dD4\Æ6$ZRé‰,ÎOmÜ9À€D:”X†èÇ4AmÈA/üÅ,XÝ@LƒÄ‡ ¡º¡mä€2Ó,PÁ@2ÜÛ B ÌdÀÊ,ø¯@œ>ʈ`AF@UQXJŒ@:<þD"PEÒ0@;À¼%èB¬D6plƒ@pxƒ7ˆ8€Ã€+ܘVX0À5@¢ÏÉÄ(p\ƒD(Cô… ˜>M81°ÖC8Ôû¼CŹ@„2dÃ9Ø ‚|jp ,$|Á($CÄN!BSÔã Ø¦ÖaBSl×1ŒÂ4Ei#à‚;TC;ôA)4E5:TC@SDôìfoþ&Ôæm@nÒ#ˆÍ„ƒ6TÁ(ô@,È*¥Q¼s ÀÁ?̃¼Ö pSL@œÉØ>è?þ€ ‚ !Â! B"0@,#@@HÀH‚$T@%ȘB‡}€¨õÂz9¤LéE0˜ ~‚'t‚pÀdÀPÂ$H<‚#@@#8À"0€"$B @lÂìhìÇj]R•À98àapädÙƒ4õ ‚ Â!(€",Â@À#PÀ†fpŒ@ œ@)¨À7Ђ(€'ÌB.$t|ƒ!d‰;8BÅNfø€10Á¸áLMÞP2ê-˜À l lCr¤[œæJfHÂ0ÝA%Ô>¥u¼ˆi5*/DÀ¶ŒÁˆÃc ¢uåûðoìC €AþAX™MO°Fl"Cü¥L‰Y…ÀGa9H€ú¬Ö*6T+¾ „I0€WPÁf À.î€0¬UÄ HC¬ASÜão°€S¤Àjæƒ'ØCS¨Æ(èS<¬AUgÛ«¸’k·®Æ·3€2$PR¬œÀ=Ê(Ô©5„ry èLjCàÄP,Œ€÷õ.ØV­µÑ­ÁÅlIèÜBD“B`º(À;,Bz$ 4¶C–èìÁ L0øÂ.¤€d¡˜¡Ó$¸ÈÎtÜiaÄ.P@@;lþÃfdƒ’@e`pÓ\€îX$LÐ@leCD™×0‚„ Ã!àS\F`Ã8&@åjh½‘¦ˆ Ã$ô H\¦Cd&}¼"P¼Å\ŒFœ„DµVEÛÃ7aD>¨@—}Þ~j¦*ômÃ4BtáÀ;Tב_ùyÈálŒF¨ÀN…WO]̉ÐÓ9À=2ƒ•«ÀÝh8ƒÉ'@ÎDªŒ ƒ¸Â0C˜ÐNÇMîËøB ÃéØˆ(þÀ,HÜtØÁQ© Ñ $A !Õhª‹(QxË"Kv@VÆI–×|å;tD>½KYƒÌmH€Yíj‚;`‚BÙ±¶ÖÕ¥Ëf‰g¾E}6L 7®/ÈX‘ \ƒô.Ât~ƒ °@ž’+tB7¦@*t;Xnåà X‘¾j]/˜B´p´Bñ¾S,À4EÃGñ61+±çÁ…hH×Ã*ðP@¦‹~J"P0¨F;µL9/ùiìyPŒ>À¤ó”FZГ¦K”J„ ˆQM†QUF(Á‚]ÆÀ,AýîF5Ô‚(¨ƒÀ’ý* þþÖF ÁhC#ÀŽÁ pÀ&Ô‚éW6ÓÖr„?öÁ/G”-œíX¤ª¥°j÷x°WèA8—H”0°Tƒ°æ„ c¦±Ž²ʲÆ?ÁÚEH˜€; lYPÁ"@Ã=ÔøH§9Ücô”k $]ï6E„@ÜCk4… ôA'àA¬uA=ßs>¿î;Çó<»ñ[ðÃ0ØI ,(lP0,8ìóq+”C&òCv’ô„¬‚ É:²aœlÊ®,%W²e`Â.ÐAf F¡’° %Œ*7‰*_Î Á¨C Á,ÖeÀÁ,4-$þ¥PSÇcàÀ”ËbFÚê-ÛŽÍ2WH4“Ï4×Ëß6DàRÄàîyŒsI8n!¹®¦iîÖÄñŽ;’Å;¯ñ‚40<3 —èutMmQâhïFr¯š|ﮉ/M×4R¾mH²èì„Qõý­ŒSx@è9emm À,‚3dAÈt6fð2B̃d s1?Ä» Y'ˆYZkŠZׇ6?„ @g6Ì\ëÏ… èƒ]g^ÇEFo´Càqèñ`ãÆ2Ð ÷â†K?vP@rH2eÕt(A4íì<êkïþ¢†1€ÀX¶ ([ƬØÁ7þèÁ,`‹{ÇväÔö©>Ä1¯j«æöžðöÙø¶¡7[ÃV²zóqó°]›ó>L‚sctÃ…tûõCtôGcwv—´‰&vv-öw7v#‡7EÄ´Êš÷@xÐeH‘*RöÌØAŸºwfà/ Á>°ÀÃ×–ÁÜ€å¼v€wÌ€{õC€õÚ–‡nûÇ‚CLƒïɃ 7¸µárkø˜C‡¿…‡ ïp¶^8I¶­8®¥8­¸)½´ÙFvøÆ¸ŒÕnà8² G><@ãÆgßÆÎˆ‚|õwSå€háwM:9«@yPàv•+x݆ÙÝ6—ÃpC·q˜“yþ©›¹W yPT÷u·9‰¿yÆÆùÆÎyK×ùxÝùx—÷žŸw@ ¡/‰¡ÛÆ­XÁìü)3 C4¹U›w¥S„'³‹¼j_`¹¼h9x:Ep³²‚4©—ú˜ŸúWðuIùuˆËq«»úóBï‰H­ÛK¿øLëú®¿6Q%°ûŒ°gFe!²$Üô;¡Nú™8»CL¹X¿È´ÇEµwʵH¶;Ä—¶·»s‡;R¤ºC6F6º#…v“wÇ…wÓ9#Ûùc{/øNö¼Ó;¾»<2)Ómø‚´Â&MfÛïÀ¿HÁ_ú™(<\0<ž8¼…@|¨Óp·WxÅ+½S\œ>Š'¾O½BÊK¶ã?~ä»5c3àÊ÷Ñ8ë·~!½þÿŒ{r ì'«×þÇß>¬ç¾œïþÅ AÍ·×?Ø ¿äþë;Uß‚!ÿ¼+„ Ä 0¸¯/ 6tø°!À(V´x#F+Ø\óødH‘#A’!cJ•+1VPÏUL™3±¬Ã€eN*õ£òhP¡C‰5ziR¥K>±³3g:ÚÞTµzuˆASÄAõúªaH–52€ `Sj bøÖÕµk„Vv‹àöõû×á/?³6|qbÅ‹7nl”cÉ“)Wþåpfˆ¦´völÝ!Í™%²M¹±ãYÕ$M¢4ÍÖågÙÔм¶]±'SÝ»y÷öÝôémŠReËFeLxò°cW7G«V¹[Ír‹{fþfgtöÌ‚+w÷þ=1dðãÉ'¾¬}´§oëÙ·g?ì z¿¥•£v~ÿZkå;›HðÿÀÿ" f?Óô`¦œ\Á|Â%œÂ t&8áÖ¸ƒÃ=ì Q%±È¯¹´ÖJNºÌÔ¹ÆeŒQoä»ñ!îÊÛ‘GÃÄëHË0ÑÈ"û¢/¹Ø „É&|Ê(Œå$­¼r¥yØØ’Ë.½üÌ0Å“Ì2Í<³K9°\“MŒLD1EèX|ËÈ:ëÔ1È<½ûQÏ>ÍÒÎ@qDR¸ª;QÏ\k“ÑF}ÒH%µH¬<°¸ÓL5Ý”ÓLÝS¸5;<þýQ=õç-¸<{^6_€~âˆ%îUÔ…_%á Î<…-&µá‰E™ä’Mn«ÝGŘc7n¹;U4ä“m¾眷­xæ@Y†™¼—žL枬Y礕^šiv^y°¡5 ²Ã49f„OHà%cJˆ’MºØjlø8tÀy€{`è+þOžÅR”‘T“ÛÂÐJž²‘´sŠiÚá½ êûïHü6¹é¶›džŸ.㫳ÞZêÉö€0c.ȘsÉZEGôpD&>N€tª¤‚·Ùú„¢j<”vÛ ‘A è‚ Iù ÂÞ½÷߃tøâ…ËÝöÈSžœH–C÷Üí ƒíɯ´®µ­oë\ëz׼ ì`¡PXÎ"Vþ±Œu,d%;ÊÚ¦©O*0¦J±R¤¬wVA€"à0hÁ `$!•·%+g[Ûa€t¦Cê,Æ:×9vÎŒZbBGO{âsú$ŒB ÓPÂÃÿ$a ¡Âèa½„©Á3f±ƒQŒw¡æ…AËÐxR-1­Á.*Q˜`ŒÁ# 7»W˜kf Nð‚gaUŒ@Qpè×¼€Ä§!€‚‰;€upðëÖ°b¨˜Å^p‡u¼ Щ¦ÃB¬ûUÄ$ö‚‰Qüb `ôJ Fñ‹MTD £ò(dKQÚv«Ña”§\e` Àþ£€Ìz›ái¥ o;<¼s Ùñ€!Ææ±¹3Ë‹9ºð Ø£"‰¬ì¾Îl4¯¹ÍÀxsœ1çâÙ™xxÖŠžùìg@SDжa²“¡T€˜‰Ç>$áà ‘D>¼Ñc‡·ÎÅ®‹Ã/PñØþðDzì3äà ÷ÂÂÞº#ÓÙ+´k)œ'ƒŒ\9¬Y–90\ž'عU¥™á<€]äk?ˆÎ5Áf "è i(°cèEß% ˆJ0Fù õ5¼@øèB/ºÑt¥ƒénz¤£Nô©WýêYÇôÖaÛD–S¤æ¹yÎIjS[$Õ¥®ÈÞs›w¶há­èE3ºQ’‚T¤F-iäQªR–ºÔ 0•)MmŠSòÔ§@mÈP/ù ˜cµPŒ»á-ïÅðÛß„9aîzô¡°7¯¾#Ï#|‚0˜HïaàÏYàc„aš!ƒÂ1â$þŒü[{!wP#$± ]p ݨÄÜ!‹!àÜè(Οþõ{¡ûp$DA #xÁݰÆ àn@b!N¥†â!@ò¡ ÀOüÈÏüë €@˜Š"žÁ(¢vë"ાÌ("(b^¡":#h‰"–àÔJá6v¶AT¡@öa€œ¡€Aª@ AØ€Îæ$”àÅrp{ða âàîa (b@®vA¸î[dmu}…°xP ™œð £p «ð ³¶° ¿ð5rG9þÐ-‚Á)ÂBpxå·°j¸T ±AMC $áæ@Î*b2-0 4%td4XÜ"û¶¯û¾/üƯüÚOý€ý$°BÙ/þæ¯þî/ÿö¯ÿþ/` ðp0B!B­a¢úd?§Ehº#FW¥?ýS;t?Ôaè`ÎÁ@ƒ4#|€ôdxôWÜ"÷±½%’ #È R!©Ô!!R")Ò ,#5’#=$E’$µÂ$ ¡T!çºF9fF'# >á6 `nGGCG… Lþà @`b¾Á Ü…”PÕdäÆŒK[$çNµãgÆãj>¾ æM³çOµHò”P;ÕS?•MUS5#R1UsòÓTEPF=8T_Vc,D•Uÿ¢TSõ1PW®VÿndXƒUX¡‚V{µY¶kW÷DW“5S5;\uX£UZ µX50•Y)ãR“ÕN­5"~uZÃU\AµZ½u!n5[ÿËÛÒ1ºÕ\½ZÇU^ç5gÊÕ\Ñ•]£eY¤ZUÜÕ\ãõJ( èÕ`Õ`!Å^½_y¤_We^2à²`®fÈ£FëeUÑcL ¢E™Z\“£þææd` RX Ç R)9ç`%e¶à’XfM#g!¥dGádS*KÖZKUb)Öb1b—÷Ê#cy`á‚BA§a:ñtd“#w’àTöWðaÎA'94fÙdú`@òàUmwbnÛ¤k¿6hvzÞõZ%£i•V^˜–Ü܉~ c@aNÀ ¾)A>¡uä §\Çóvª§dwD˜Ì°a—€aA¸(B¡6Ð —ðÅ´ À ÷K&`L b!ø |™î¿|À+< 0\ÁùÐQtȼћ±¸½ß;¾)”!²1»ÀZ«É9]Ì›ÁYœÅšÇWÛ1t £· ¸Wx¸‹»Ý¢¹‰1æå&¶bf¡;ÕqÈ€@!ÈQC¼Q\¡žªÜŸÁ, 0ä“>ï‘s³£yµbª”!]þÌÔ`¶@¸Á ÀÀî¡„€LCr¼•£gG!&¡5_“'I!bá‘€á ¯Q³ePïÀ ¤\rxVá ò $– Ó-ár/ûò/K` îá nÙòÔ[!Õ9ÓÔEÔg=2QU½3åÐ}ÑY³Ñ=Ò'=T_ü!>:¤œA¬;.«¹Ú«i|œ¯«œÕ1ži¥œÊíÓʱ\˹ÜËÁ\ÌÇ=ËkFÍ×±çS<ƒ9©óu–«oœa¶VX¼`z¿E¯Y`þd¾Ù³cö!Aö@4´›»½¼½@+'àP©Ûºþ±[â»û»ÃãÙ¡¦ßc[wUßodÎ(€«_åœÛœ\gždlžpf>á³Ãº!¦À€÷¼Ïÿ<ÐbÐ-€éêüÎóœèýœ$¾#?’ÐmÕäO¾É÷5_W^>Þœ– æýýWðòoðÅëÁþðïïõUïÙ•ñYÕñ#ôC_%ØX?]?U;T?_ô[¿õI¿WM?[QßTU_SYßõsòa¿VeŸYiSmÿQq_÷‹ŸþíyŸU}?Y?{„ÿN‰ßø£¯‘T•W™?s¶cµâºš‰!è  ‚#½@]ú ç3œîÀ"®A B ag¥_oÒŸ"Ö¿ýߟîæ?f©_S­ f H° Áƒ*€”‡!@œøð—/3jÔ¸…FHH‡±RÜ„©1Ë0cÊŒ Á°›8sêÜɳ§ÏŸ@ƒ æ@¢Aƒ0€róAƒœGþtdŠ“ßÒ¡X³jÝʵ«×¯C‹Mz˜S¨RËÞ´J¬Û·pãj 0³®Ý»xóÂü凢_…ÿ ÈÐá`Š ¶˜×%:Sæ1óVþ.€{0]’ÄØ…!Ãn^À| —G›‡Œ,JÚGFNæò8 Ž¦Í¸¸só´êåÚ“lLˆ!càÎN¶8µx  ˜° aîYƒ„s%EXâH¸)©Ì½caŠéO¾0âþ#ŸùЧ¾F¥M&.‘­·]Å­f½ZίV&¬ŒËXÈšIá 'ÆLq«I¢y†!gî;2„…¨‰CŽa1œà {`Ã/€‘2,§Q4Ô°m@ g4O<ã œ,Ñ3õ_7–ÅêÄAÃp@>Ž|˜¸É7–“Š›á8´!’ÈÆñ<M¼ÉPÅ)BñÀų¸Å.~1ŒÀ£gÊŒ3¦qm„Ócr²”e†e™rYÌdF3Ü,g;Ó`_F8r„œ¼˜ã8EÊRêeY‰L¥*WÉÊV¦r‘0‘T#"‡‘ÉUîr™Ûþ\ç>ç…Юt§KÝêZ÷ºØyavµ»]î·ÉP:”Î Õ(MIÍjn•®Ì¦6·ÉÍn–q! 1âÂâ´p90Ä dHCâP‡<ô‚=D/‘ˆFÔd4ŸÙ}vlšÖ ¨)±éÍ‚ô u%8ÊмlПì'DIІZô.M¨F7ÊÑŽ. )^:ÑVA³¤‡©¨HWš‘Œzô¥0©LR–ÚT#$Eé§NªÓ¿¨ô¦!uéL‡JÔ¢vt¡@µhN{Š!ž2u"?MjC…jÔªZõª¬DªTºÔ§Æ©^UHT·PœhM«Z×ÊÖ¶ºõ­p«þ\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`k×9Ô”¬!íjXÿÖÅd¬ˆ¥f<@ÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jWËÚÖºöµ¤ECdEªXÇN¤±¡jD+þYÂÙúö·À ®p‡KÜâ÷¸ÈÕçDuQÃø%©E ¶ñn²ÉÍ®v·ËÝîz÷»à5nmÝH—º~±î†p[ íÕåmxçKßúÚ÷¾øÍ¯vÇË!¼7¾cïáÒMd%(Á O$àB8Áfщ'£BØÕ¯†7Ìá{øÃÜå¯B.Tà'xÁ™@ƒþ,O¸Â®€ÒŠ˜Àâˆ!ô =B „°‡@ð ƒyG3SÚ[;ùÉP޲”§lJ'¤Æ7α@vÜãÏ"ÈC.ò,Žœä%U¢Î… äÙAœÌ"·ÀP†©Ìç>ûùÏ€>®•r!5³ynœg!çÐÙÎx^/šÓ;{ ÍoŽóœŽø×mr GMêR›úÔ ôA:diL+ZÓŽæ´§A-içRZ ày< {x™vò/R‚T#Ô¨N¶²—Íle«Ú Êõ®âk {øö@Š}ìZ ¦¼#ELþŠGD¡ $\ñ€ü¡Ús³çMïzÛ;Äf ¸ÅMnsÝêf·»áí¡· ‡ˆ·¨ïÍð†;üá¾}6ȾÓIïs¼P8Ä7ÎñŽ{œ«ù.)Æ+nkgjbÌh„Æ?Îò–»üåoÕÉSNrÛútá/ϹÎwîìÛøƒ@h<„DX„F¸‚Cx„J¸„LHHIØ„P…RØO8…Vx…Xˆ~²…\Ø…^ø…`†b8†dX†fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡s;mod_perl-2.0.9/docs/user/handlers/http_cycle_init.png0000644€ÿÿÿÿ00010010000021474411727205031023106 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy<Ôùÿð×Ì`ÜGr䊔«Ù"JJI·.e;¥è¤ƒ´»mºµéN×–t¬.:6-¥RIE”Hîû¾™ùýñÙŸ¯˜˜ÆŒ×óïã3Ÿãõy}Æ7^ûþ¼„B!E}}} ^g‚B!ÄMgΜ!€³³³¿¿?¯“A!„â&‰Dæu!„B] „B ,,tB!$°°ÐA!„ÀÂB!„B „B ,,tB!$°°ÐA!„ÀÂB!„B „B ,,tB!$°„x@WqssKLLäu!„PsàÀSSS^gÑM¶ÐIHHÐ××2d¯A!„zÿ‚‚^gÑ}¶Ð€!C†XZZò: „B¨¹qã¯SèVØG!„B „B ,,tB!$°°ÐA!„ÀÂB‡Ÿ¸¹¹ñ:. Ø¿ÿ† xB!Á$È£®¾ÿàÁ*•J§ÓeddÊËË·mÛÆë¤þ‡¯¯¯‡‡G{GgΜ٠9?~¼¦¦æÕ«Wfff«W¯–””ìº{999Àþýû»î!„z³^T褦¦†‡‡{{{ssswîÜÉÛ”¾WWWÇ⨵µu7ä@´íÚµkóæÍÝp;„B¨ëô¢BçÖ­[k×®e~TQQiÙœóèѣׯ_‹ˆˆÔ××›˜˜L™2…ØâĉwïÞ 4ˆÁ`9::ÿðPssó… JJJ ¡¡aܸq-gô‰ŒŒ|ýú5‰D¢Ñh$‰N§{yyÀ‘#GÞ½{ÇlÞ011?~<±}ñâÅ‚‚‚¼¼]^^>ÜØØ7bÄ’’"^±< Ìá妦¦Äf'hÖÏ›6mb0‡nÅU¬Ÿ !„×¹¹¹yxxØÛÛó:‘î@"^šôžB!„êåz[¡Ó‹^]!„B¨·ÁB!„B „B ,,tB!$°zÑ<:‚*11ñƼÎ!„›››‚‚¯³@Ü„…ß+((ÈÈÈøá q„B¬yyy-Y² ƒ…Ž PUU9s&¯³@!þ¶wï^^§€¸ûè „BH`a¡ƒB!……B!„:!„XXè „BH`á¨+$PNœ8‘••Èë\Bñ:‚ìÙ³g[·n¶wB!Ô :.;;›ù';;›¹ßÝݽՙ[¶lùá¡VFŽÉIzÇ_°`ªª*ññäÉ“¯^½255õöönll\¹r%±ßÙÙ¹¾¾žÙÕÞUœd‚BH a¡#àÔÔÔ˜oš˜o 8ATN$‰N§ÛØØX[[³¤²²’è©J4Ìš››©T*Q²,]ºôܹsD•váÂ…¥K—2OcqB!Ô:¨sZVNlÛ¿?Ñ_GQQ±½hZZZùùù555 %77W[[›yˆÅU!„PK8â:NlŒ1âÊ•+í¶hÑ¢K—.]»vmÞ¼y-÷³¾ !„bÂA¶gÏžØØXbxyll¬——×êÕ«ÕÕÕ !!áêÕ«±±±žžžÄà,B{‡|||ˆd2ÙÓÓSRR²#iÃˉ ‰=YYYÄÆÆýýýׯ_/!!!&&¦¨¨hii©§§G5119~ü8NoùÞŠõU¿ýö[CCCLL q/iiijŽB½ œýýýy —YZZ:88XZZò:‘.÷øñãÈÈÈ€€^'‚BüÍÔÔÔ××WKK‹×‰t-777{{{^'ÒH$¶è „¸©±±1!!!--­ªªª¦¦¦²²R\\\BBBFF¦_¿~ÚÚÚªªª$‰×i"„z ,tBœúúõkddäÓ§Oãââ õôô¤¤¤¤¤¤äääjkksrr>~ü˜•••’’R^^ndddnnnmmmbb"HEO}}ý«W¯xêÁƒËËËó: Ô°ÐA±©¬¬ìæÍ›W¯^-,,œ4i’ƒƒÃ‰'ÔÔÔX_U]]ýâÅ‹'OžüòË/iiisçÎ]¼x1³c_ËËË›3oVY^'‚~ ïcÕ¹—p¢Ñ^ „P§•••?~üìÙ³666°¶¶&“;:„SRRÒÆÆÆÆÆ233Ïž=;{ölCCCOOOCCî̺;H+S]nã”N=Ý…Eq¼Nu^ŽêƒqéÒ%“ªªªÄÄÄ[·nÙØØt¼ÊiECCc×®]_¿~µ³³›?þŠ+ª««¹›0B¨—ÃB!ÔQEEE“&MºxñbLLÌ™3g444¸–J¥º¹¹¥¦¦öë×oĈ/^¼àJX„,tBôõë׉'N˜0!..NWW—ëñÅÅÅ;võêÕùóç_»vëñB½öÑAýØ—/_&L˜pèС+Vt鬭­_½z5qâDX°`A—Þ !Ô`¡ƒúÊÊJGGÇóçÏÏ™3§n§««cllܯ_?++«n¸#BH€á«+„Ь[·nÒ¤IÝSåÔÔÔnݺåääÔr™z„b:!Vž?þþýûC‡q+àÔ©S;rÚØ±c÷ïßÏ­û"„z',tB¬ìÚµkÏž="""Ì=³fÍZ°`Áï¿ÿN|ôññY°`ÁìÙ³;pùòåmîwwwoµgûöíÁÁÁÌ%`Bˆ ØG!Ô®¬¬,bòâ–;W®\I§ÓíììˆÞÞÞ<èøT:3gÎlsMMM«=rrróçÏ¿}ûöúõë;™8ê±—³nmþH§1¼ÞZõQãu:u:¡v…††ÚÛÛS(”–;544ž>} ëׯ§P(üñGvvöèÑ£™'œ,0uT¥ÄßÎýÓ1Î=Úœã'ø—’ޤñl¢Ðéê{qK›_êU°ÐAµ+??_UUµÕN))©ÊÊÊwïÞQ(”øøø²²2999âhssóñãÇSSS………Édr^^' ÈÊÊ655yzz4ˆB¡P(2™Li¡+>r’p›Œg«‹QXoÔî£.¦¬+u{ëÇÚÒ&ñ> :#êä·ç2Êóê•õ¤&z b§Ä¼0æ\Ƴs%ßjé4†¬ª¨þ…Ù¾Cà ùÓ‚ÏÕ°gø?@"ÇÀ‰[ Ÿ£"D%|X0~½v_-ñ~R7Ý+òêeú‰À§È¢ˆƒ©Ù*E%…ô&(Øn$÷_LêÓ’Èc_³ßWÔW6+ëIMÛ¥7Ðüß•½tÆ“cé//eVä×+”T*Mìgû^ DH~!£<·^Z™ª¤#ùùIq 1ë ÚÄ{±m¯,ûj‰_^OTTÄk2Ùø¢¸þ#F=:¡vÕÖÖ2Œ6=xðÀÑÑQXXøÂ… -ÏÙ±c‡³ÙÆÅÅ…ÃètúéÓ§9 Ò),Ê æÎ66555ÕÑ~¿¾²‰D² noMzq1SǪï;¥´ç¥—¼ë7ÔÔQ r*ïx&i™ÉéÛ(ÔU4'>,(ɬ#"X¹j%…&Ü/øi‰†¨´‰LÒ³Vhu—мú÷!yârÂò"p¿ `Ù[•¡Ò£—jÔW6'†|}QêmN•€ooÊ3^•i™õQ$ñ%ºäÒ’øß’ÆSDÈpg[Òó?ÿ?ø œïŸ¨S÷º÷Krôéo-äOVúò´äó“b1Wµå{1bÎH¸_ðÀ~QHàa¡ƒj[LLÌÛ·osrÚøÃF"‘¾}û¦©© 999-[A ˜ýu:>fªººšN§·êÔ\VV&*****ZUU¥  @,“NkN§wÑGö¾4IGN£7ÑßÞÎÓ³V•*˪{y)ÓÊUkêoz@§1Î-xópwÊÈùªd ©±–À!QŠŽ±¬ñÌ~b²ÿ¾|1Y &&#œp¿`ܺmv‹Ùg¢RBŽgŒ„DÈðh_Š˜¬°ŽU_"IÝq}ß罺šmᬠ6j¢”VXWÙ¤j(—TUUØ «&VšY÷âb¦•›ÖÔ_õ€Ag\X—QÄö½Ê³ëžžÉ½LcÖþÁ@kbøÏ~õõE鈹ª}µÄ™ïÅÀ`’"öo¡Ã:yN¾(Ô`¡ƒjÃÇ—,YÒÔÔÃìsÓ’‚¿ÿe¬ªªš™™ÉÜïìì¼råJ ‰ºº:99¹êêêM›6y{{÷éÓgëÖ­ QQQD{ŒŒÌÎ;™.\¸pùòårrrT*UVVvÉ’%JJJ¯_¿n…õìS¦L™2eÊ÷™ØÙÙ͘1ÃÔÔÔÞÞþãÇ&Lxüø±„„Dç©3Øî©#//O¦XœÐjTvŸþbð1¬PY_  H /•’è# )ÕŠƒ$v¥Ú§×–dÔ¾ È õùlê¨&.÷ÿjô¶_,Zº>lsiÙ[×»fd!R q2…´>b´ˆxvï—OýK-81La€xì•ìÛ[>ûeUD =¶LYïßâòëËÖEI§îEt¬I|¯2XŠÈ?ñaAëlþ{ÚÜ@ÿ÷‹b™<'_ê °ÐAýUÎo¿ý¶~ýúiÓ¦]¹råçŸîþLŠ‹‹ƒ‚‚ž={VTT¤¢¢ngg÷ùógSSÓèèhyyùîO‰=ï‚ó>ÜÍ€'G¿öQ³rÓ"‘I ¤#i4£ßÃÝ)ßbËI~}Qšõ®Âî]¢sÌÇЂÐÝ)ïCòûH57Ð󓫨RB¢ÿ¾Ú#úüÞØ˜¨:Dº<§.-¦ÔhV?MS¹÷!ys.ÃîWÝùÇ OM \ùÎt±šÇÀ««ßûZ<Õ› @¦ Sk²â+¬×k[¹i…J®¯l~}5»,»îsdDH×6ïc8UYo¼Â­¿DË©‹å&V~‰.€¨“é"â”â¯5½—’ޤñ¬~áS3Þ”+ëIÌü¢dUEàÞ¯Ÿä5Åó’«ÒbJ ëm9ëäÙø¢ºççŽzœ!ôÿÞ¼y³lÙ²æææ­[·³×ìØ±cûöíõõõÝŸÌï¿ÿîàà ¢¢2yòäÔÔTyyùû÷ïëééåææN:µºººûSbÏ£=)îåÀ‹‹™Q'ÓëèÌC N³õÔ)üRs>£¹‘>ï˜á¸µˆC2ªbÒJÔ´˜’¨“éqA9Š%Ö„Œû·ICÝXÆn‡nÁ§êgç¾å®9_uüzíG{¿ZÞü•SWÑ4à§>ÃTäÇ^Î>GÅ邱¸œÈ«ÀìØËÙåÙuC&+ ™¢HD[tf˜°(9ÚÿÛ§ÇE}4Ä æ|FÄTøù¢±Å*ÍŒ7åѧ¿}{UÞO_ ž_È|rô+{÷š|ØÄÍó?U?;÷NgÏVa~jÃdfî5ÈzWñÔÿ[ÖÛ e]IH-c/ªK~̨§"€³³³¿¿?¯3á2KKKKKK^'Òå?~ÀëDß‹Ÿ4iRSSÓâÅ‹[¾œZµj•´´ôÙ³g»3™ˆˆˆ9sæÄÅÅÉÉÉ©««gdd @aa¡­­mzzº••UPP±³‡HOO·™eîùZðípч{ùËâ‰!åÝvÓ ‹âv,9bkkÛj¿©©©¯¯¯––V·eÂnnnööö¼N¤;H$lÑAdggÏš5«©©ÉÞÞþÈ‘#-ýñÇÏŸ??uêT·%“žž>þük×®õíÛ—B¡äææ2 EEÅyyùþùÇÕÕµÛRB\Wò­6lß—·7sàí6÷!ÄXè „ ººzÞ¼yåååãÆ;þ<‰ô?=j%$$·oßÞ²™§ë$$$˜››ûúúÃÔ+**Z öVWW¦R©7nÜhU“!>ò%ºäïÃi‰¡w#—×é …‘êí ƪU«’’’ttt.^¼ØæË --­¨¨¨Ù³gûöíÀ­aqÑýû÷.\xôèQb­+8þ|eeåo¿ýÖò´!C†\ºt‰XD}Ĉææ=nåôCfNêfNê¼Î >lÑA¨·;|øphh¨„„DPP´´t{§©««‡……ÅÅÅ 2äÇ\O£²²rùòå...ÁÁÁÌ*êëëõõõ¿?Ò¤IÛ·o§Óé‹/þöí×óA ,têÕ^¿~½gωؿÖ'ËÉÉ…„„lÚ´ÉÆÆfÑ¢E_¾|áJ5550`@}}ý›7o†Þò¨——×¼yóÚ¼pÓ¦Mvvvååå‹/nhhàJ2!ƒ…B½Wqq±““Fóðð°²²êàUsç΋‹ÓÒÒ255µ³³ innf/ÏŸ?»»»0àåË—¡¡¡'NœmuNzzz{—“H¤“'O*))%&&þòË/ìå€lXè Ô{-_¾{ölxxx§ž!Ô`gd„z©?ÿü3::Z\\üìÙ³ì­x ))éèèèè蘗—ùøñ㤧§ëèèèééIIIIIIÉÈÈÔÔÔTWW———gee½{÷NBBbøðá'Nœ:t(ë[›˜˜°>ÇÈÈè÷ß÷öövss{þüyß¾}Ùx„ ÂB¡ÞèÛ·oÄU§Nê×ÓñûõëGT<@£Ñ>þœ––VUUUSSSUU¥¤¤¤­­-##£¬¬¬­­Ý©¥†øÃÓ\]]#""¢¢¢\\\nÞ¼Éþ“p¬©ž–ú´„‡  Ž¨)iäu ¨û`¡ƒP¯Ã`0V¬XQSS3gΜiÓ¦q78…B100000àJ´””555qñÏ™ûçŸ=~üøöíÛ³fÍâÊÝ;KLLLqä߇ÓxrwÔqÂb>Z+ q „z‹/ÆÅÅIKK8p€×¹üÀ–-[Ö®]kmmýÃ3åää|||Ö­[·eË–qãÆÉÉÉuCz­(++¿¾›Úý÷E±€‘ê] ˆÉ÷Ž;Æ“j STTTtuu;xòâÅ‹---KJJ¼¼¼º4+„ÁB¡ÞeÛ¶m•••“'OæúK«®pòäI55µŽŸúôiQQÑ¿þúëÙ³g]—Bˆ`¡ƒP/,,,Üó_Z@IIIVVV§.QVVöðð`06lhµBB¨wÂB¡Þ¢¹¹ÙÝݶoßÞ©f^‰ŒŒlµÄUGlܸQ[[;--Íßß¿ ’Bñ,tê-Î;—––¦®®¾zõj^çÒ!T*õ§Ÿ~êìUd2yß¾}°oß¾âââ.È !ÄO°ÐA¨W(++Û¿?øúúŠˆˆð:™6mÚŠ+ظp„ 'N¬ªªÚ½{7׳Bñ,têlldsb·C‡ vdU „ÃB!Á—‘‘qá‰ÄG-4mÙ²et:½ËÕÔÔœœœš››Ùèåƒ$8a B‚oïÞ½ óçÏçÖ„ÅÝ ªªÊÆÆæûÅÌ;nëÖ­—/_~øðá«W¯LMM¹˜[{Š‹‹‰÷ƒ¨ç[±bEǧhB| „ܧOŸnÞ¼)$$äííÍë\:AVV6 €“ ëׯ?xð ——×ßÿÍ­ÄX¨¨¨¸}û¶³³s7Ü qâæÍ›ÖÖÖXèôXè $àöîÝK£ÑV®\©ªªÊë\:áÝ»wrrrýû÷ç$ÈÚµkO:=vìXn寂ŒŒ {¨Qwzõê¯S@Ýûè $È>~üxÿþ}*•ºyóf^çÒ9.\xòä ‡A¤¤¤6mÚØS¡^ „ÙÁƒétú²eËxKç :tøðáœÇqvv–••ŽŽæ<Bˆï`¡ƒÀJII¹wï•Jݰa¯sé´•+WrGBBbíÚµpèÐ!Σ!„ø: ,???:îè訨¨Èë\:§ªªŠó÷VL+V¬––ŽŽŽ~óæ ·b"„ø: ¦œœb°ÕºuëxK§}üøqï޽܊&--MtöóóãVL„¿ÀB!Átòäɦ¦¦3fp8p‰'$%%gÏžÍÅ€...T*õáÇ©©©\ ‹êù°ÐAHUVV^¾|ø±9† ²jÕ*.TPPX°`N?qâÃ"„z>,t@UUU–––C‡åu.ì¸~ýzQQwcººº’Éä¿þú«´´”»‘B=: væÌX½z5¯saÓÁƒ+**¸sàÀ&L¨««»téw#wÜ£G¶%;;›W)!$ð°ÐAHÐ|ÈõàçââBtµ^½z5±A"‘ÀÞÞžhà¹wïÞܹsõõõKJJàÅ‹K–,9r¤®®®½½ýË—/‰PãÆ8p ³³³‘‘‘žžÞܹs“““[ÞëòåË666ººº´°°Ø±cGw?-B¼Æ¯¿BmJMMŠŠ_¸p!¯saÓ»wïºhc‰D¬¸yþüy¶ƒ0 Ää IDAT:N£Ñš›››ššêëëëëë ‹kUTTdddúôéÓr¬¬¬¬¬,,]º”h„Û´iSrròŒ3rrr >>þí۷Æ srrb0kÖ¬ijjKKKˆŽŽ¶²²rttÌÍÍ]±bF#‚'%%íܹ³oß¾NNNsæÌ©­­ÍÊÊbûÁâS¸¨'BåÂ… 0gÎiii^禿ÿþ»¶¶¶‹Öàœ?þï¿ÿÕ¿2™Ìh´·ŸÖs3ÆÅŵÜ3xð`æ4†³f͈ˆ6l˜ŸŸŸššó´5kÖLœ8ññãÇUUUŸ>}***RQQ3fL``àŸþùÓO?ñÝÝÝóòòˆkkkk‰§ R©†††S§NåßÿW Ä6,tMMM×®]€eË–ñ:ö™ššR©Ô. .--=k֬˗/WVV²ÔøïõWøúú¶¬r $$dË–-̦ ÓéÌmuuubƒøÞ˜§9rùòå×®]#j)!!!www®,¬ÁB!Áq÷îÝòòrccãaÆñ:öuQ[“££ãåË—eeeß¼y#$$Ôfá¬]ÚÜßž´´4Î3üþ.{÷îÕÓÓóõõÕÔÔ úõ×_;'--M[[;>>þÛ·oYYYׯ_÷õõupp Þ”!ÔK`¡ƒà'''^'Â>ƒ±eË–p±¤•ÊÊJ ‰òòò˜˜˜iÓ¦uÑ]ÚSQQ˜””gΜÑ××_°`qèôéÓïß¿€sçÎIKKS©T'''¢(©ªªºqãFnn.ÑéܹsfffÄö… ûõë="¦[Œˆˆðõõ ÕÕÕmhhHII‘””ìºÖ2„z&쌌€ÈÌÌ|öì•J3g¯sa_nnîýû÷»®Ê###¢$&îfÉÉÉÇ €«W¯¶ìDT*×®]ó÷÷?uêÔ—/_ˆC~~~T*õâÅ‹QQQÄ‹ªÀÀÀcÇŽÅÆÆ‘››7nÜ ®êׯŸ¢¢âË—/ÏŸ?<`À€+W®ˆ‰‰uï#ÄcØ¢ƒ€¸víNŸ>}º¤¤$¯sa•JݲeK—ÞBAAaË–-çÎ{òäI~~¾²²r—Þ®33³V#À™"##Û»jøðáO Ñbš>}úôéÓ;›!B[t 㯿þþUNèÛ·ïÒ¥K».~nn®»»»¬¬¬­­-Fc6~ „: ‚ØØØôôtUUU ^ç‘˗/ýTºÈ“'OÊËËῊðúõë]w/„PO€¯®AAAàààÀ¿³!nݺÕjd5wÍ™3g̘1`mm-//Ÿ””ôñãÇÁƒwÝB¼Åß¿BÐÔÔ\ÛÌ[nnn]76ž˜:OSSŠŠŠˆŠW®\‰ë™#$À°ÐAˆï=yò¤´´ÔÀÀÀÀÀ€×¹pj„ -WHà®wïÞ͘1ƒØVVV&Þa%''×ÔÔtÑB<‡…B|ïöíÛ@,É×RRRˆI»HLL ³$“ÉsçÎ%¶ÓÓÓ»î¦!ÞÂB!þÖÜÜ 3gÎäu.œŠõêU×ÅwssÛ¶mó#³4$¾@„@ÂB!þQUUedd¤¥¥Åë\85jÔ¨+VtQðÆÆF:ÞrUKcccUUU¸yóæWëDñ),tâoD7dÁ˜NSSsÔ¨Q]üÉ“'ßÏM 2/))a.!Ž08¼!>ÖÔÔD,&0kÖ,^çÂkÖ¬Ù¹s§‚‚BWÏÎζ²²jµsöìÙ€;w˜´<6iÒ¤ÎÞ¥´´tß¾}¤‰ºCjj*¯S@Ý „øØ³gÏÊË˵µµ`£æææ;wî>|¸‹â/_¾üûºººZZZééé·oßÞ³g¤¤¤ÜºuëÖ­[ -täåå=<<¸“.êJ+W®ÔÕÕåu¨›`¡ƒ»ÿ>äää|üøñûæ þÂ`0Nœ8ÑEkk#ɉ•À[Y´hÑ®]» ¼¼¼ž>}š˜˜Hì'æìYYY777SEqöÑAˆ_1 ¢Ð©¯¯ooH>",,Üu/àîÝ»×æZ¡Äö©S§©Tª©©)ó "„ø:ñ«ðððÂÂBbûãǼM†s×®] î¢à$iÊ”)Ìeee—/_ž>}úàÁƒ÷ïß’’’ .¼{÷neeåøñã ÿþ]” B¨;á«+„øRaaáêÕ«@CC#33SZtbbbˆ¦”®°hÑ"b£°°pݺu?nnn*•joo?þ|{{{qqqâbþ@lÑAH0`¡ƒÿ)++›9sfYYÙˆ#nÞ¼©¥¥õùóg:Î×+zº»»3K îÊÈÈhhhÐÑÑEEÅ#FCÕ¬­­¡n†…B|£©©iÉ’%OŸ>UUUˆˆPQQ!ö @¡“’’B¼0ê 3gÎü¾÷Ïš5kˆ™ýÖ®]ëççÇÜO4çôïߟD"uQ>¡î„…BüF£¹¸¸„……õíÛ7<<|À€ÌCD¡“””Ä»ì85lØ0b†b®‹‹‹{ùòe›‡œ:D"‘6nÜxàÀb'vÐAHÀ`¡ƒ`07n¼}û¶ŒŒLXX˜AË£Т#!!1tèЮˆ|ýúuëX-]ºôÈ‘#d2yëÖ­»wïì ƒÀÁQWñooïË—/Àš5k†ÞꨙLNMMmjjæE‚œrqqYµj•±±1×#ÛÙÙihh°8aÑ¢EBBBnnnÞÞÞ%%%€-: ,têé^¾|yæÌb{ïÞ½—/_ž:uêÔ©SÇO,q%!!1`À€ÔÔÔ´´4===ž&Ë¦ØØØÍ›7wE䎬Œ1þ|aaa—ßÿ]JJ 8kÑqww/--eûrÔm.\¸€=±z,têéÌÌ̲³³£££>|–}úôéÓ§OKHHL˜0ÁÞÞÞÎÎnÈ!©©©ÉÉÉ|Zè„……ÉËËs=ì½{÷ÄÄÄ&L˜ðÃ3gÏž-,,¼lÙ²ªª*à¬E'<<ÜÉÉ©OŸ>lG@Ý`óæÍ  Þ „ø•Jµ±±±±±a0—.]Ú¸q#ÔÔÔ„„„„„„Q%$%%Íœ9“ǹ²EQQ±+ÂÞ¸qcêÔ©Œ9²²²’”ê!°ÐAˆo0–1‚·™p‘‡‡Ç_ýÅõ°‘‘‘úúúì];bÄ2™üáÇ®è9D;v,ÄÄÄ‹¥ÇÄÄÉ‚ 8i«spp æ š7o^'ª¨¨XºtiNNμyó,--?þœ™™Y__O-(((//ÇBñ5,tâ¡¡¡ÄÆ‘#Gx› ¥¥¥)++s7fqq±¤¤$Û—KKKëêê644|øð‹YµDŒíb0ÄZ­7nÜ öÏœ9“D"½xñbÉ’%#GŽÔÕÕµ··g¾D³³³#Úiœœœ}ºaÃâ§Örºuuu2™,&&Æâb „øC||<Öx+°···³³ãnÌ 6x{{ÚØF¡Pôôôâãã§Nª««+þ11±ö6˜¥ÕСCŸX4ôìÙ³–––©©©aaawïÞ€WWW‘ªªª7näææFGGÀ¹sçÌÌ̘ÓaïÚµ+11±²²2,,ìçŸ&ÚB***“’’àÌ™3úúú ,mmm;;»C‡ÅÅÅ 0àõë× [¶l€ÜÜÜ/_¾ØÚÚŽ;¶¼¼<,,LKK‹¹"ÑÌËËK__?///66ÖÞÞ~ÇŽ,ž>}úýû÷DÎÒÒÒT*ÕÉɉ(ÅÚ{.WWWwww{{{ss󤤤–o ÝÜÜÜÝÝ'Ožlii)$$”–––àââ²råJN~¾¨WÁB!þðîÝ;`.ä)ŠŠŠZ¶pŽN§×ÖÖ²±òÃ÷ÌÌÌâã㌌ÜÝÝ9ÖÊÓ§OàÊ•+ÙÙÙãÇ¿zõ*1wÀ;w\]]ýüü¶oß~ñâE*•ª¡¡ñùóçÀÀÀׯ_3 {{ûˆˆ¶téÒ­[·;“““?Ntï½zõª¦¦&QèÀ¡C‡tttnÞ¼ùüùóìß¿Ÿ“ƒ ¡ÓéW¯^;v¬——³1ÆÐÐpóæÍþùçëׯ555gÍšµlÙ2Öƒ‚‚233àÚµk ,,üÓO?»Û{®Éä“'O^½zUYYyâĉÌa\Ó§O§R©§OŸ¾qã™LVUUµ±±a¾¹C¨#°ÐAˆ”””äææJKKsýEoM:õÒ¥KzzzÜ H&“‰Æ}øðA]]ˆÆ ®‹ŒŒlùñÒ¥K-?>üáÇ,._¿~ýÁƒ[í433KNNnó|!!!WWWWW×ï1GŒ·‡oÕñ€­­%ÏeoooooOl_¹r%<<œÙÕÉÖÖV`VvC<…B|€xoehhȧ듷‰N§geeiiiq1fxx¸©©)ë>+qèСÁƒC—:ìyðàQ(œ={váÂ…ººº¼Îˆk²³³oܸÑÜÜ\]]|øÑ£GpíÚ5¢öñññ§OŸö÷÷¿}û¶……ÅñãÇyØ¢ƒ –sÊ €ŠŠ qqq¢+WÔ××6Œ+íÄ`«Áƒ¿~ýúÇœÇä\W¬~ÚC´|u…wa‹B|€˜YÀZt.^¼øûï¿s1 ¨¨h«Î.ìqss+++€!C†À_>BˆOa¡ƒPOW[[›žž.""2hÐ ^çÂM\ èïï_TTÄa¤¤¤¨¨(ø¯ X¾!ħðÕB=]rr2N×ÑÑaN+6oÞÌÅhMMM{÷î%HâDÿþýOœ8A&“€¨Ãˆ™iB| „z:â-{Ïž=ÛºuëäÉ“½½½£¢¢¼¼¼ìììˆ( .ìß¿?DGGÓ륥¥±>äããóðáñcÇ’H$&""²}ûvQQQ6r{ûö-±ÒW444¸¹¹ÉËËsGBB‚9ÙààÁƒI$Ò§OŸèt:Qú „ø:õt?~b´sg™››5ÊÛÛ,--GÅ\Ó@UUuïÞ½°iÓ&æÆë; %%eß¾}¿ýö[g+**š;wnjj*Õ&IIIbYJN<|ø0..Žøº@BBBCC####--MÀÞ"Ô{࣠ÔÓ}úô ôõõ¹VYY¹½=,µ¢££CôÛí¬ââbSSS6.l»»;çtîܹ£©©Ùr1™a{ñ!„z>lÑA¨§#þʲ=}pvv¶§§'s›¹ÿû• ¶lÙòÃC­Œ9’¬ôõõ¯^½ÊÆ…m*++»yó&³‰mþþþ-÷èë뇅…%''O›6Ãà!žÀB¡­¢¢¢°°PRRRMM½jjjÌ €ùŠDåD"‘ètºµµ5A>þ¬¦¦ÆœæŸCT*õèÑ£vÖNKK0`@« ‰úòóçÏ µgÏqqqN’A]­Õ’ìH€a¡ƒPF4ç 4¨ç,þвrbÛöíÛ'NœÈ•”ÄÅŧOŸÎa¥K—îÙ³ÇÜܼåNèd¡³wïÞšš“A]ÍÖÖ¶çü›B] „z´/_¾€ ­jDPQQáâCÙØØÜ¼y“˜ü†=åååd2y̘1­öëêê’H¤´´4F¡P:jêÔ©l§â:쌌PF´%í lسgOll¬DEEÅÆÆzyyeeeG<==ccc===‰s˜Ú;äããCìܾ}{uu5›OpôèQb;ç¾|ù’ŸŸÏI•²²²ÿüóÏ÷ÿ‰/..®¢¢ÒÐЙ™ÉI|„¯`‹B=1{àÀì]îååÅOniiÓòèСCÛ{ ÕÞ!oooæèk¶•””TUUµßÄ6MMÍ€€N"Ðh4??¿ï»` ”““óåËî.´ŽêØ¢ƒPF:6‰KTTSï´GXXØØØ˜“>üçŸÚ;J|ùiiiœÜ!Ä+Xè ÔsÑh´ŒŒ …¢­­Íë\¸‰J¥~߆=ÚÚÚ­Æ„w–ŠŠÊºuëÚ;J|ùDg)„ßÁWWõ\ß¾}knnÖÐÐæu.ÜdggÇ­Pñññššš,g½ñÞðëׯ U]]ÎI2¨ÛÌœ9^õXè Ôs\ ÀëD¸,44ÔÚÚºÕŒ5ì5j‡^¹rECC⽈ᅢ¯® Ö¬_¥o£ÀIJ¨¼Λ1c:½:õ\YèÐéô•+W¦¤¤p¥Ð©ªªRRRâ$ÂÉ“'<ÈâuuuaaáÜÜ܆††Žä,­D]tƈ“”P7x’ÏëP7Á>:õ\ééé p…Nuuõøñã¹2'rIIÉ!Cèt:Û ƺuëFÍâ!!!uuu:ž‘‘ÁöB¼‚…B=×·o߀[ð{iiéË—/s%ÔçÏŸ-,,ÈdŽ~Í›7ï‡çSþ?„ÁB¡žK wïÞ-Uœ=zt`` Û—744èëë×××ÿðLâG€-:ñ#,tê¡ 1¯††¯sá¦K—.EFFr%‹Éo:âõë×zzz¢¢¢?<“(t¸UŸ!„º:õPÅÅÅuuu}úô‘’’âu.Üdhh8bÄÎã|þüyÆ œD077ïàˆ-¢ÖÌÎÎæäv!žÀQWõPÙœK—.åJœââbNV,///ïÈÉÄO—»Bˆa¡ƒPE´¨««ÈÇÇ'<<œ˜\¸¹¹YTTÔÛÛ›+£µ¹ÈÛÛ»ÕB¡P]]ýòåË &p̘1œL¯––väÈ‘ŽœLü˜‹¡"„ø:õPÄŸU55µïy{{×ÔÔ0ÝüøñãáÇ·mÛÖ­ùýHmmí÷;?}ú´gÏÎ akkËv:¾hÑ¢žÜ·o_QQÑÒÒÒÚÚÚ6!„z,tꡈB§ÍVÌ\¾»©©éÈ‘#………P__?eÊ”–ÕÀ_ý+**ZVV¦««ûìÙ3ggç‰'îÛ·ïíÛ·AAAùùùGÍÌÌdŽfbðõë×·nÝill¤ÓéþþþÄ¡;wÆÆÆzzzÍÍ͉eÄÅÅçÎËù—óÇpRètª‰DRUUMKKËÎÎÖÑÑaû¦Ý#örÖ­Íé4†×[«>êb¼N!ÃB¡*77TUUYŸF£ÑΜ9c``@|<~üø‚ ˜Wͼê×_­¨¨`¶910Så•Jíx{Ì÷‚‚‚Æß·oߎ_¢¦¦––––““Ãy¡óñaÁ¥eñôf†Â@‰©¿è,§51úØ;–ÃÈÍQrCí”Þßåhæß½&Q%ßþm“£èXõsh°”BÏz=ŠPG`¡ƒP•““í:YYYžžžõõõQQQ{÷î4i±?44”h}!477S©T¢.ùçŸZvIqvvމ‰ùa,:999;;KII)++9ÒÅÅå‡Ñ®_¿>nÜ8m€Q£F5нk<==Ÿ>}Ú©«TTTà¿ê“Cu•Íôf†™“ú@ y•!ÒúŒrlã%{”t$g«pXèØnôþ^~⃂Q‹Õ)¤·7s¯8¿w¹cÊ­$ê6Xè ÔCS‰¿¯ßSWW'ÚK^¿~}þüyKKKb>EEÅïÛQ ã‡{¾Ç" ……………N/((ˆŠŠ:pàÀÖ­[YG;tè±±1‡…NIIIllì”)SØ»¼¶¶võêÕí}±í!Î'ªO‰ˆSÀÊm@_-q>[%ñAÁPÆÑ€ç IDAT{eâè§È¢ˆƒ©Ù*E%…ô&(Øn$÷ßë§Ô§%‘Ǿf¿¯¨¯lVÖ“š¶Ko ¹Â,Ò`bÎe<;—Qò­–NcȪŠêOP˜í;„í 9ÿA ^çÑA¨'jjj***¢P( ?XÛÄÄdÓ¦MÌZdĈW®\ióLKKËóçÏ3?ž={¶¸¸˜ù±¹¹™ØÈÊÊj9a ‹€Ä *2™Ü¯_¿™3g¶lø€êêêïW¡š6mš¶¶6ë'ú¡'Ož\»víËåää<<<:{Qèœ?~âĉ&L°¶¶?~ü¸qã,---,,ÌÍÍGýÓO?9884ÖÒ:0êÄ×»>?ØõùíÍÿo%J¸_p~þ›æFú襓“ ONm¨þ÷GóíMyÆ«2 cYóýtÆ¥%ñ´Æ¿á;Û’B}>÷Õ–³¼?Y˜”Ó‘€c]´†LQ€«.ïr+GÌQ)˪ËzWñ}¶õ•M$…H¬Ó`0'¡òŽg’¤‚ˆùÊþ& Ôjh%™u\Ì¡ö`‹B=Qaa!NWVV&zÀ´âãããååµ~ýz%%%MMM??¿ 6lܸÑßßýúõbbbŠŠŠ–––zzz0{ö쀀€µk×JKKÓh4 b?a̘1ëÖ­«ªªÚ±c‡‡‡‡ŒŒ ‹€¹¹¹>>>uuu4­±±qݺu-“tppX»v­¬¬¬ˆˆˆŒŒÌÂ… wìØÁù—3hРeË–±wmQQÑþýû}}};{a¿~ý °°°U=÷=i¥udyq©Áêö¥ˆÉ ëXõIÝq}ß罺šmᬠ6j¢”VXWÙ¤j(—TUUØ «&VšY÷âb¦•›ÖÔ_õ€Ag\X—QôÀ#竊HPC 4FÈ:ž1j³çòãÃiô&úÛÛyzÖ ¢ÒB,Ò`ðßúB¢cYã™ýÄd…¹’!B¬a¡ƒPO”ŸŸÿýqýž·····wË=ÌYøH$‹¾2NNNNNNÌ?fnÏ›7¯Íå-YÂð.8ïÃÝ|xrôku1+7-fÇ" ?†„îNy’ßÏ@ª¹žŸ\E•%³~dê ,tê‰ˆŽ ]Wèüúë¯]™NVl`šÅÅÅ%%%ŠŠŠì%@x’ÏÿÌL}V2Å[7ña¼¸˜i2_uø!*9òÈ×WÙ$2IN]tÈd¥!Sþ½Ý¢3ÃnnJŒöÿ&,J–ï/ž—\s>ãëóRéÊ?_4~´ïË»;y  „DÈýô¥ò’«ž_È´^?Àé‚q{c¯d/‰ˆCò y-39x´'¥8½–HLR^dôòþT ÊÓ`PFULZ‰šS’òO±¨”Ö(¹);t…Å(¬™E@„: „z"¢ÐáðjOãîîîëëKâì„––{Òéô»wï¶œ ±ãöï߯¤¤¤¨¨X\\\XXÈáÏeëËÿ™ð@ÞÿÌïlh¯løßPóV4Mä<žZ´yHXŒb¿SÏ~§^›GÛ èùÚ²½$·½j÷‹4Xá 2¡í!ý,™E@„:‡—#Ô`:÷îÝã°Ê‰‰‰9vì{×’ÉäOŸ>}Š;ëÛ·o«W¯&†ú·“êù°ÐA¨'" N­QÐà ³×šÒRXXÛï­ž={ÆöïÁÁÁ²²²D¡CühBü „z"¢Ù@ >}ú0ÇÀ³móæÍ?ÿÜ¡ÁÛ­dee-Y²¤¡¡¡³VWW/^¼˜Ø&~Ø¢ƒÁB¡ž¨¤¤«Ð Œç0ˆ””{´sss—,YÂF‹Î™3g¤¤¤ˆm,tâGØ¡§¹¹¹¢¢‚B¡°7ºgº}û6{ýc˜‚‚‚ÒÓÓ¸œV›Ø^tÉ’%ÕÕÕͼ¼<`¡ƒ¿Á„zœ²²2ƒ!''G& οеk×q!::š½R)!!½Æ¤†††>}úhhh‰B§¬¬ŒP!^Á„zœÒÒR“ë“…œ8q";;;+++00“8ãÆã0“cÇŽ±×Ùßß___ßØØ¸SW577›™™…‡‡3×U•••…ÿ~:!~…B=ÑfÀv¡û×_‰‰‰Ñét99¹’’’ýû÷³Œ««+p8`*555""bõêÕlG¨­­gãÚéÓ§³Ñ˜”””¤¡¡Ñrõø>}ú¶è Äo°ÐA¨Ç)//v äääààà?þøƒø˜••µ~ýzn&Ç–÷ïß¿zõŠ“BçÂ… ¹¹¹{öìaãÚVk‹v¡¡á;wZî!~"?,tª›‰UPÆøn%R$ °ÐA¨Çá¤E'  åÂæêêêÌæb|õ¯¿þª§§—””äãã#**záÂâ胞={F"‘š››I$N?xð ë{5559r„˜Ä¹¾¾~Ê”)¶¶¶mžibb¢¦¦ÆÆã0åææZX´=/k«V­òööVWWïÔUoß¾UVVVQùŸ™|‰WWDÚIIÉ£û«: žlØŒ~N_‰ø:õ8ÄòÚì ¹¢Ñh-÷ 4ˆØ8vìØÎ;õôôÀÀÀ@SS“ùB*444??ïÞ½ÄǪª*ww÷Þëøñã ,PUU%>žwîg«E‹]¼xqåÊ•=zô““ëׯ;¥Ô®]»h4Zjj*^ÐÓ½{wöÊžõëן?~íÚµŠŠŠòòòªªª&LÀk€8IKK;99µágaÛ¶m[Z%&&ÚØØˆÚêøñã‚®â? ŽDÄÎ9ж@!¤­­ÍÞ^Ϋoß¾–––ÆÆÆ\å¼õwíÚ%èV$iÅŠ­ö'$$äìÙ³)))mÛä’““Ó»wo® PDøùùÑétQ[?~œÁ`ºŠÿ(ì¤ñSWˆüåÚ<ÕQîܹãààð3î,Hbbbyyy›·òž>}:))IÔVyyyBöF RZZJ¡P„üæ•””Œè Q`D±óýûwôãÚvïÞM¥R=z4~üx++«¶­jƒM›6ÙÛÛ·¹¹‰‰ÉäÉ“EmµaÃ;;;âMªªªÆ÷òåK!¾„ÿ@|Q©ÔÄÄD‘º :‹““¥ó_b¿G;|DgçÎ{C‚ „¬ziÕªU«DmÂ`0X,–¨"¿{÷ÎÍÍMø¯_e¯õæUYY¹fÍšö'ö?Û;wfÍšÎ:ˆè´g›’øøúõ«Í¥K— ÛÐbcc;» à5:ˆœ£»k:>|hóèÔßÿ]\\,R‹µuëVQQ¾~ýzaaa«ÕZшt;ø=*//ßÙ醆†G8p`Ûš[[[Oœ8Q¤&>LKKiJ‚F£ýùçŸ4­Õšøtf‰$L] ^h4ZKK‹¬¬,™Lîì¾t77·67_½zµ¨M455·nÝ*j«?þøƒÈB"<ÌFt/x\¡ yÄ“ÝîÝ»ÛÖöÿû_NNލ­´µµEZ†Ìb±(Ê’%KˆTÆ—¦¦&Q{è,è ^ðKT¢¬¬,ö™{¯_¿õ0¶€€&“)R“°°°èèh‘šDGGIÕŽQ(ô#Ht/ø%Š_¨jëÖ­jjjæææîîî ,ÐÒÒ*))uu0BÈÝÝÝÄÄD¤&ÿü󨋸¯\¹2mÚ4‚•ñßFt °Fñ‚³´yDØØØXZZ®Zµ*''''''66öÀ•••¦¦¦gΜÑÖÖ&r“ŒŒŒ%K–ˆzÌÉ©S§DÝ‹B|Ý7þ»´!³ ³ÀˆâèHt cmm ¯¯ïââ²wïÞÛ·oøðaöìÙƒ&å „œE= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïì’«W¯fgg9r„àššš,--‰?”ÉdŽ1¢ººšx“ÌÌÌ;vˆ´ Ft8è ^ð2^ii žV&‘HÖÖÖì“góòò6lØ@|õ …B ïß¿?ñ‡æçç÷ë×OEE…x:îëë+Ò¯W’Þ\$S§NÕùááÇrOt/xDGFF¦³;Ò.ÖÖÖ·oßF544Ì;w×®]úúúÄ›'%%‹ôDƒøøx‘šŒ=zÞ¼y"5éØ@ÇËËËÃÃgo ï{¸@ €xé#:¡‰'¦§§S©Tooo###WWW‘š»»»ß¿Ÿxýºººªª*‘ŽXü믿ˆä|à‚PŒ¶ßܹsgΜI¥R­­­“’’jjjØ— ÆñãÇǯ§§gnnnooÏÞ/äRJJг³³¾¾¾……ÅÆËÊÊ8wíÚ5kkk===qãÆýùçŸD. é$ûÿ™Ðõà%#’~,²¢¢¢‰‰Éš5kž|Èžøt)!!ÁÛÛÛÀÀÀÍÍ­¾¾>111###66ççzýúõîÝ»-,,&NœX__÷îÝ?â ¹@â¥k:!{{û¿þúëÞ½{¢fô”——/((À:)((¸»»¯¯®®~åÊeee‘:†§Õ×× ™iêÓ§Á»ÕÕÕݼyÓÆÆ¦wïÞcÇŽˆˆÀNiiiTT”··÷ºuëpÍM›6áa$!—üýý•••ÇŽ‹RQQ7nÜ;w"""ð¡Ï8>ÚØØxúôéÝ»wÇwr €.ÄKKK ú1r Ñlll”””ˆ$â:räÈ=zo2þ|â•äååq@ ’¦¦&¼ëJEEeïÞ½²²²222²²²ì222•••üñÁFFF666ÆÄÄÄÄÄà’¬¬,33³wïÞ!„Ø5>Œ?¹TRRÂ`0Ο?ÏùöØŒ¹¹ù²eËBBB233BÒÒÒ6lÀ ¡„\  €@ñ‚Ç D=(O ;wnøðámh¸nݺ3gÎOx4vìX---‚õ?ÞÜܼsçNQ;¶cÇŽ^½z!„äåå]\\øÖ),,$¤²X¬   ---ö$]XXXxx¸™™™ªª*B(;;{È!\­„\ÒÔÔ”’’ŠŽŽæ{þaaa¡¶¶öóçÏKJJ>~üzäÈ‘¹sçöèÑCÈ%"?bÄK—Ñ)**"žZ­¾¾žL&Ϙ1ƒ`}ƒáçç‡wx|ëÖ-Q;F£ÑâããCCC<؆t¼N:URRbaaadddkk{ûöm•ØØX“ XZZnß¾ýþýû `0ïÞ½ËÍÍMJJ200tÉÛÛ{Æ vvv&L––.,,ÌÍÍ]±bÅòåËBwïÞ=räHll¬žžF{ûö­’’>ÿPÈ%ºt?Åõë×Û° »[·n¥¥¥Ä´ †ŽŽñGäææ¶aÀŒB¡dggWTT oÃÓU ÃÖÖ600ï»xñâ‚ .\¸päÈ‘ÄÄĤ¤$YYYM›6á!A—fΜI¡PÎ;!%%Õ¿kkkv"wuuuUUÕ§OŸ>~üXIIÉÜÜ|ãÆxìGÈ%ºtÉd’Éä6l’ß·oŸ½½=ñ\žrrr«W¯&X™Á`øûûoÚ´IÔ^ݺuKGG‡}uk'®Íh¡¡¡œ_•””víÚµk×.Þ†B.ÙÚÚ Ú­6sæÌ™3gŠz €.@â‡Çb(77wòäÉ¢¶b2™þþþ>| X¿¶¶V¤5Å¡¡¡ééé¢öêÛ·o›6mÂ9ÈºÌ *þ;`Dñ‚WçtȘA'úôéÓ AƒDmõùóg}}}‚õ#""DÚÕe``І]`JJJ‡ƃLè q Ð@¼t@ÇÞÞÞÎÎNÔVêêê)))Äë/]ºT¤§Œ1BÔ.•——«©©9::â¯]f©8ÿð?WÄK×t*++Û0ì±fÍš»wï¬L¥R¥¥¥544ÖŸ1cWJ„V±X¬¥K—²¹A]è8Gþ; Ð@¼t@ÇÉÉéåË—­V£Ñh[·n½}ûv]]•J Æ‘ûöí;uêÁÊiiiUUUýúõ#X«¬¬TTTäÜë#:H˜º@¼àÑâï{1Äb±>~üHdË7…BILL|õêÕ²e˨««ûõë×ŠŠ 55µVÛÞ¸q#66–`—F,ê “ššZdd$g Œè qàß%ˆ¼%» 'Ј‰ôñãG999"•---]]]BBB<==ÇŽkff¶fÍá¿„¼¼¼ÁƒyDYYƒÁuqôþýû_¿~ÍUØ5rËðŸâEFF!„Ó4J¨ÚÚZ:N°òÈ‘#SSSÉdòˆ#Ö­[U\\L¥R‡.$žˆ'>èåëë{ùòe‚•±¢¢¢K—.ñ,á¿ þ$ü»ñ‚ßîè•••íÛ·HeKKË“'O²¿2Œ9sæ899-[¶LP“/_¾¬\¹277—H†s&“YVVæææF¤3lƒ º~ý:ÎlʼnȈ•J)%è’ÇHt/8?¶D:t:}ذa+ëêêÖÔÔTVVöíÛ!äããC"‘öîÝ+¤Iuuõ²eˈD9!2™Ìuq«ž?nllÌ7}7©Â#¾”””¬¬¬îÝ»'ÒÁ¯çààç!ýG@ €xÁ/QâS?bhýúõÄ+KIIYXX•J4i’ƒƒC«5 †‘‘‘Ì¡´´4KKKyyyâ=™4iRXX˜ðô !‘n è\è vÐwªÄÙ±cÇ£Gˆ×øð!ïq5|]¿~½¢¢‚àiÈS¦L¹páñnDFF655õéÓGx5<¢Ä~Jh Ó¿ÿ¡C‡¯?yòä={ö¬yòäI —™™I¥R‰¯¤yýúµ¯¯ï÷ïß[­‰ëˆºÀЉ Ð@ìà÷(‘÷®:vì˜HY¥äååõõõ‰Ô”““[°`A«ÕZZZ¼½½³²²ˆ÷¡[·nGUQQiµ&:HØ^€Ø‘Ü@§¦¦æëׯÚÚÚë—””¬\¹2..®Õš~~~!!!¼Y6yQ©Ô#FL˜0`š››555[ÝÖŽá?ŠQ%*•š˜˜HðÑ ³ 4ÈÔÔ´³{~t;’è<~ü8""‚øÑÀ>$8üC0véÞ½ûÙ³g v ¾¾~Ô¨QOŸ>%˜PÿQ„T®¬¬\³fͤI“vüzïß¿744$þ tè vð{T¤½Kb‚B¡Œ;–x}www{{{"5ÓÒÒˆœqüäÉ“÷ïß™ábן%’raÆŒüñ‘Gçåå9²¹¹™`WÙ¾ÿÎ`0eddDm è,è vðÔÕׯ_;»#¢ ºwïÁÊß¿´±¼ººúêÕ«úúúîîîµµµ«W¯nõnáááUUUŸŸÿ矶!XÁ“‰ø¯°F±Ó³gO$ktŒ Vž?¾ K8[ÖÚµk#""®^½š——W[[;þü#Fð­ÿíÛ7__߇|ô¬Y³Öä‚COü×+ãÆ+//OJJÒÒÒêì¾ v`D™« IDAT±ƒ_¥555ÝÑ,Z´ˆà±úŸ?2É¥¡¡ñáÃeee”””/^ 0`Þ¼yúúú|·tµ´´lݺUCC£Õç644Ì›7È h¾:0Й:uªÎÄC4„PNN޹¹9ž×c=ztû»@WbŸŒ'YSW ñññ+ߺuËßß_ÐÕþýûüø‘ýµ_¿~”‘‘ åÝ ~þüùúúúeË–yî¡C‡TUU‰œ°ÌW:^^^øàÁððpâ +++kkk¹È8€è vzôè!%%U[[Ëd2;»/Dåçç8p€`åÞ½{ ™?â tÎ;çëë3|øp®šµµµýõ×;w>wË–-»wï&X™Wuu5ú†¶ÓܹsgΜI¥R­­­“’’Ø£waaazzz:::xG½õ)--EÙÚÚ®\¹!4qâD!C†œ}òðð Ø‚`12âHEE¥¦¦¦ººº£^«?›žžžžž‘šùùùµµµVVV‚*àãøjkk:«¦¦Æ[Åb)((ddd‰]"##=šššÚæy+„Pyy9B(,,,99™õCKK çÖÐÐÐê­êêênÞ¼iccÓ»wï±cÇFDDxxx „´µµg̘‡«Mž<™Éd&$$à¯ÎÎÎÊÊÊ žžž¼k’üýý§OŸŽ244ܼyseee¿~ýüýý•••q¦U•qãÆÝ¹s'""bÉ’%cÆŒ ¼téÒ¨Q£BÆÆÆ6l(//'²Ú â¨wïÞ_¾|!=tºÐÐÐ &¨««·Z322’Á` tBêêêóçϯ¬¬¼}û¶ 8æúõëYYYçËdddNœ8Ñž('!!!44!ôñãGΙ5^DÒ”FFF666ÆÄÄÄÄÄà’¬¬,33³6w!ddd„?((( „ðAA%%% ãüùóœ59û¯©©‰?P(„Œè€®ÄÈùòåKgw„¨ãÇ tFÕê0Õ€êêêbbb„$[8uêT]]Á@gÆŒDª 1bĈ¡C‡>þüСCfff¤¤¤¤8?”––nܸQø­X,VPP–––­­-. ç tØ[Ãh4ß;춦¦¦””Ttt4‘Cè’ Ð@©ªª"„>þÜÙ!ÊÝÝ][[›HÍV·577ëëëoÛ¶ 1âããCäåýöíÛß~ûíñãÇDúÆNûö­¡¡!ÎD1fÌA•eddZÍ*zêÔ©’’ ###[[[%&&"„"""ÚùÓ n`Dq„ÿá^YYÙÙ!$''§ªªjÊ”)­ÖŒŒŒ2‚©¨¨T(**rss{úôé€Z}âÉ“'»uëÖj5A˜L¦ººúîÝ»étúׯ_eddÚ¿½<))‰ó+^úÃiÑ¢E‹-Ôï·rÃ+Vp~µµµeÏ‘ i•››+´×H*tG’è<|ø°¢¢‚H ³lÙ²Vè´zŸŒŒ iiiü+‚F£=|øs·¶¨ µµµ÷íÛ‡*++c±X½{÷nuf V Ð@IV caaApy¬±±±ð AAAFFF«9::ª««·:S¶wïÞêêê6:eeeöööqqqƒFUTT „øntˆ3ø§ â¿PñÁ-âoäÈ‘ø,ႃƒñÂAX,ÖÑ£G[ZZ„Ô¹víZaaáøñã[}Ü Aƒöïßßj5AÊËËÿýwå  t8è ŽTUU¥¥¥¿|ù‚OCs¿ÿþ;‘~ÞºuKx…–––+V˜˜˜ªÐÜÜìë뛜œÜê³ ÆÒ¥K…ìN®©©ÉÜÜœ½æÖ­[»víBÕ×׷톀ÎâˆL&÷éÓ§¥¥Eüg¯ªªªbbbdddZ­yâÄ !™Bd2ÙÓÓSH&“)%%µpáBáŠŽŽÆ9¡ÚæÚµkøœb¶/^àtëí9rÐ) Ð@Lõë×!ôéÓ§ÎîH+¤¥¥·oßN¤¦ªª*Î×Í×÷ïß ¹NæÅY™Ødee‹ŠŠZ=zøâÅ‹\‘ q,ëÂ… xü†n¶gi3 S@ €˜êß¿?BˆkZlõìÙséÒ¥­VÛ»woxx¸ qqqÆÆÆd2™³pÛ¶m ,xôèBo¡’–n} Ett´ðBH¤Géèèp²4b§YH tS’è±³"99Yx¶HggçcÇŽqÊËËS(”+VL˜0aýúõÂ×)#„ ÒÒÒˆC¼ Æœ9sòòòx/±Gt á%Äζ(<¤8ˆ‰‰©ªªjµZbb¢¥¥¥ «ß¾}kiiáÝÓ¤  `aaQZZzðàA--­OŸ>;v¬¦¦FÐ}6mÚ”““C¼óœðIÁø$b.8Ð!‘H8úH8G1…JKK;»#­ðööÖ××^§®®Nø¨³gÏ644øùùq•+))}ÿþD"áã}_½zuôèQSSÓ¹sç:tˆ÷ì>{{û6¯Î3fŒ……×ÜB¨¥¥Gr½{÷–““kõ>T*g›â)''§mc~@BÁ1…ñÑ!r¤ÍÖ­[GŽéææ&¨B]]ß½TŠŠŠœ¿aÆ™™™ÅÆÆÎš5‹+Êill¤P(Â7m RXXxöìÙ£GÊÊÊò^­®®ÆK¤‰Ì[)))YYYÝ»w¯ ݿ̘1c:» à×@1…9}øð¡³;"Laaa\\œ···ðj¹¹¹ëׯRAÐÉ~ŠŠŠìWÍÍÍÞÞÞ?NHHÐÒÒ⬖ŸŸ?mÚ´… ât ¢rrrÚºu« «ì•ÈDRkõíÛ÷Úµkmèà'@1¥¢¢¢¤¤ôíÛ·ÚÚÚ=ztvwøËÍÍý÷ß[­vÿþ}!)¢¢££­­­y/)**R©T„З/_æÌ™£¨¨˜À»GýÔ©SòòòÂc)!’’’„lY)ЈXŒ €øÂoÖ÷ïßwvG277_½zµð:ÅÅÅB2aÕ×ׯ[·®©©‰ïU…ººº—/_ZZZš™™ò=‰çÔ©S¹¹¹­ž¯ÃëŸþùðáƒð†ì-Wõþ€Nâ ¿YÅ9ÐÑÐÐhõÄš?þøãÎ;‚®R©T///¾W³³³GµmÛ¶;vð 1™ÌÕ«W?xð  ËKŸ?~äÈÎu9ÍÍÍ)))ùùù_¿~e²Gt Ð@ÁÔâ ¿Y‹‹‹;»#­^½zûöíêêêBêM˜0AÐUuuu___AW¥¥¥¿}ûvóæM ¾þþûïÈÈH!Ëœ…066¾~ý:çžv™íÛ·çææ"„(Šªªªªªjuu5¾š™™ÙØØØ·oß¾}ûªªª¶š> `Dñ…ßÁ7nÜèìŽðÇb±¢££»uë&¼Zff¦²²2ßKEEEAAABÚjkk¿}ûVP”ƒ²´´ü矈äNçÔÜÜ|úôi2™|011á»'\¸µk× J·îìì¼cÇ:þæÍiié ååå¹¹¹%%%ÒÒÒ{÷îõ¹€_Ä{uΪU«† 2tèÐÎí2™}úÔ¯_¿ß~ûHå… tè‹ÅZµjÕ›7o:µk!TWW·dÉ!ètúôéÓ¹󲕕• Ék±jÕª]»v ºjggËw Hëׯ[[[ YøÌ¥ÿþ“&Mjjj D}ÿþÝÇÇ!´}ûö~ýú. ÓA €8úøñcqqqÏž=MMMÙ…ëׯwuu“…ÉÂŽR(”C‡ j;yòdÞ¥¾XVV“Éd½“””TQQÁ¾úøñcMMMsss‘zûêÕ«˜˜‰D¼ ^’€Ú¹sçû÷ïMMM۰à й Ð@¥¤¤ „&L˜ÀµØöÿûŸ©©iaaáòåË ¿Æ°aÃNž<)¤Âž={>}úÄ÷Rqq±»»;ß™):¾xñâ¼¼]†¯ªªªÇ«¨¨ð½ºyófA ½¼¼xÏ⫯¯gGuÏž=[²d‰¦¦fzzºðíå‡ZµjU;O‘~ýú5BH___¤íZbܸqåååIIIZZZÝÄ ¬Ñ@ìL:õþýû¥¥¥ ûöí[µjÞì“••ÕÙ]û? BÖ¬(++_»vï¡É«W¯æœƒãÔÔÔäââÂRà:¾}ûv;;;Ÿ   VÑ9qâDû‡a^½z…âÜáߦNªóñUG¡œœssóºº:ÎÂÑ£Gwtè" Ð@ì,Z´ÈÄÄ„½“™B¡à­Ñeee•••ÚµÿóæÍ!­eeeùnŒzóæÍƒøžøüùó#Fð½Û·oßÞ½{7bĈìììGÍ;Wxß.\¸ððáC …"¼¹¹¹!!›ËÚÃËËËÃÃ/ý 'Þ°²²²¶¶–+Ф€ý®“AÕ«W¯[·Žï%‹ebbòýûwÞK 8wîß)##CÐ ©Tê‚ Ö­[¨ªª*¼c_¿~=räH«‹” zùò%BÈÈȨCîÆeîܹ3gΤR©ÖÖÖIII555¸<,,LOOOGGçýû÷!<êSZZвµµÅÝ'Nœ¨££3dÈÎÓŒŽ92jÔ(ƒ äçç³Ëãããuþ°êüw@ €`v—™™Ù¹=Á¤¥¥-Áyóæ´´4oro‹¥  0nÜ8¾­<==ù:\YYiccóôéSá™Ì±üü|…ÔÔTMMÍV+·ŠÉd¾~ýšD"ý¼ãsüüü8Ó¼›››ÛØØ°ë899M›6ýÕÃÃ]¸p¡—————ׄ ØWãããGŒ1þüââbOOO&“‰Ëñ„ n‚£À‘#Gþ¤ q‹‘–––! …"&#:ÚÚÚ999¼Ñ BH__ÿúõë¼å‰‰‰7oÞܼy³µµµ„©t=è zôè¡¥¥õþý{ÎyŠÎÒ§OŸììl¾—ššš† òîÝ;ÞµÀgÏž¥Óé¼M˜LæöíÛ{öìÉ{iĈÿý7‘.UTTøøøôïß¿÷ãŒZ#FŒ033£P(²²²rrr …ýYVV–ÂVVVnÙ²¥Õ›³X¬   ---öQIaaaáááœ;×:Fã{‘~œ¬¬,oooSSSÿæææÔÔTÞ#tIè †þþýûììì¡C‡vnOZZZœ——gllÌå¼{÷N[[›ïN(MMM¾ c}||vìØAdtäÂ… |ûömGeܬ¨¨ˆŠŠÂÁÜܹsÇO¼maa!‘Ã{N:URRbaaadddkk{ûöm•ØØX“ ¨««£cTo߾ũ6rrrð\ÞZ¿uëV}}ýòòòôôtGGG ]ºtiÑ¢EL&óöíÛ¡›7oúøø „JJJ–/_ÞØØ¨££sòäÉ?ÆÆÆ>yò„Èœ ’# ðìÕ³gÏ:»#hûöíW®\á{ÉÔÔ”oú-œ¦”ËÉ“'“’’xËããã322ønDçòõë×}ûö­[·®£¢œæææÑ£GS(”ÜÜ\‰dbbÒ!·å‚§«222þùç„P```aaaccãÅ‹B†††;wîÌÍͽ|ùò‹/tuudž;ccãM›6\½zµ  `öìÙ^^^iii¡   »wï&''ã5=ÑÑѸɛ7oðvôóçÏÇÆÆ"„ø°ÐõÀˆ’:â°¹¸¸xâĉ|/effš››s655‘H$Þ“uš››Ož<É^fËiÊ”)”‘‘ÞÖ­[·#GŽÙ“EƒÁ‘‘yòäIee%FÓÑÑ’æ¢=¸Â»ÐÐP® ‹-”, !„÷[ ¹áŠ+8¿ÚÚÚ¾{÷®}@ÂÁˆ’ÁÔÔ”D"½|ù²Óÿ!ÂwyGee¥‹‹ {K3›œœÜýû÷y'tddd’““µµµ¹Ê322dddˆÌÐÍŸ?ÿâÅ‹åœ;wO¢©©©á€²Kƒâ$ƒ’’ÒСCétzNNN'vƒÉd²X,¾é>~ühggÇ5…Äd2:Ä[¹¥¥¥²²rÀ€\åÅÅÅóçÏgŸž'D```jjêìÙ³Eé¾@t:=>>þÀø+>¯ˆwt q Ð@bà†Î=3ðõëׂçš››Ÿ>}š«0!!o"§°°0oooÞòÏŸ?ûúú Éʦ§§Gðˆá FFF†¬¬ltttÿþýqaFF‚@€.$†••B(==½ûP^^Î;Ù„b±XÁÁÁ¼åêêê|s;ÔÖÖâ A\¬¬¬ø‘ÌéÇãÇ>|xûÓm~ÿþ}Ò¤I!!!œ…555………òòòÆ kçý$†……ú1ØÐYlll.]ºÄ[þòåKÞrSSS¾‡ø­\¹’kd¨©©ÉÆÆ†w‹ÅZ±b•Je={¶‚‚‚¬¬l ®®®Gå,ÌÈÈ`±X¦¦¦­®†ˆ?tºººÊÊÊeee8¿c§¨¨¨à{(NçÝ%ÄwÞjË–- \…¼áKQQÑÍ›7'OžŒ³TR©T}}}öiÂmöâÅ‹}ûö‘H¤+VpýDøÜ<~tè 1H$ÎňßÄbÞ¼y|E633ãM•ð÷ßóoóøñ㤤$999®ò+V9r„÷ÎÙÙÙöööÛ·oŸ>}ú¶mÛRSS¯]»Æ÷ìAâh4š³³³ Ä–xrÒ^Ð5@ €$5jBŸ×)>|ø0dÈ®B:~õêUÞÊëÖ­3f W¡®®îÑ£G¹v›_½z•D"ñ]ƒüüùsssóŋ߻w/***""‚©mjjj(Ê‹/øn’§ÑhÏž=“’’‚@€®$ tž>þÌ™3‚—/^àÝOÇõêF›5kVeee:Ïd2ÿøã7¢i/y={öŒF£ü¤£¿œŒ €$111‘——ÏÏÏÿòåKïÞ½ñÓkkkåååy§TUU—/_ÎYB§ÓŸ?.//ÏYîáá±téR®S’ûôésìØ1¾‹‹[ZZ^¼xÁ>¸¯gÏž·nÝZ¸pá„ ®^½jii)Rÿ›ššjkkOž<)¤Njj*úP¶ •JÅ©¦€Øj[  $:HYYYKKˇ¦¥¥9::þ⧇„„”””|øèÑ£_è0™LCCC®ÂŠŠŠÄÄÄÅ‹sŽ5Šw2KIIéÅ‹œÑOIºÖwä IDATI‰ƒƒCnn® ŒßÙÙÙ8 ›¤îß¿ïáá‘™™É}ˆøö훕•Õ† ¦L™"¼&Núô)‰DjóˆNß¾}¯]»Ö¶¶€Ÿ$ là› ügã{–qrròƒ8<Ãŵ¯ªªªJJJJEE…³ðâÅ‹žžž‚¢„ÐóçÏeee²³³W­ZuìØ1ÞB­RVV>wD¤œ233ñ_?-øI Ð@˜››+**æççþü¹ý D’‘‘annε¾xäÈ‘ºººœ%ùùù§Nâ,|ñâÅž={fee-Y²¤ QNCCî]»\]]‰7Á¿Ò &ˆú,€Ø‚@ɃÇ'ˆÁ`8:: :ЯUd2YGG‡o6 á’’’B“&MjÛsâ #wA™™™'Nœèì^€Vôë×÷@‚H$ÒäÉ“ƒƒƒ“’’ôõõ;¶c‚øùùÍŸ?ŸkO{¯^½8ó6455­\¹RCCƒ³Ž««+g²…ÄÄÄ£G&$$z´´t`` ±±±¨=üôéSzzº““Óž={Dm‹JNNFM:µ mb .¨´´´´´tÉ’%Ý ЧOŸnÞ¼Ùž;L:588øîÝ»|·|ÿ œ%÷îÝ{òäÉŽ;Ø%ÊÊÊ6là¬C¥R•””Ì.¹}û¶¯¯¯ §DDD8::¶!ÊùþýûèÑ£=*jC¬°°°¸¸¸gÏž&&&m»@âïÎ;³fÍ‚@ç¿$•­­íÓ§O~A “ššÌ.Á#Iœ»¢–-[VSSÃÙjРAœYŸ6nÜ((­Ussó«W¯LLL8Wü´ŠÅb}ùò%111 €x+^õõõOž………¯_¿þyOill?~|Ïž=Ù%—/_æ<>'%%EVV–ýõÇœ³Z¡èèh¾ËhÊËËW­Z¥§§'èÑ{÷îeOŠÕÕÕíØ±cÇŽ¦¦¦mþq¸à›Ãq tUèI«§§§£££££óþýûÎîNç “ÉöööèÇÛú'‘——¿víg ƒÁ`ïÄ.++[ºt)gÚ‡sçÎ988àÏ÷îÝãjËÖÔÔdbb"äÀ⢢ÜÜÜû÷ïoܸ1==}Û¶m_¾|ÉÊÊâL:ÑN,ëöíÛ¡_°s Ð) Ðâ.55uÁ‚Æ 322š;wîÌ™3ñªUccc///kkëÎî`'›5kB(::úç=âÅ‹œ%üñN,Š*//_ºt)ç ???<¯Äb±Ö¯_Ï7§Uxx¸«««ðç^¹reÉ’%–––sçÎ ëÖ­çÀRû¥¥¥}þüyàÀm8‹ à ÖnÞ¼¹aÃ55µÙ³g777?|ø°ªªJSS!¤¡¡ñûï¿ÇÇÇß½{·³»Ù™Æß«W¯üüü¼¼¼Ÿ”÷*$$DKKkÈ!økaa¡’’ûX?ssssssvåììl“îÝ»#„H$Rbb"×ÚìôéÓçÏŸòP’––†²±±ñ÷÷ç»Ê§¢¢¢Ð`ñ׋ç; õàÁ®|a€6ƒ ¾wíÚeff–˜˜èççwàÀ¤¤¤^½zµšñ %%ÅÙÙY__ßÂÂbãÆeeeìKiiiK–,177×ÓÓstt|úô).Ÿ4i’ŽŽŽ§§§‰‰ÉСCçÍ›———‡/………á92ø“’’ÂÓ.7nÜøI022²´´d=þ|XXþüòåˬ¬,ö¥úúzggçOŸ>!„ÊÊʪ««y£üûIII–ÅÄĘšš²/[¶lñâÅ .äÚüÕL&3&&!äääÔQ÷lƒ¹sç⃠]\\ ¥( ¾ž={VWW·víZyyy\¢  pùòå7 i•°lÙ²ææf77·)S¦$''/\¸ðû÷ïøêóçÏŸ={6|øðÅ‹³X¬U«V577#„&L˜€JII™8q¢««ë§OŸ<<<˜L&BÈÜÜœ33€““>©!´bÅ ¼Á;==ÝÁÁÁÄĤՊŸaöìÙ¡ëׯÿ¤û»ººržhôÒ¥K«V­â,qqq)))Y¾|9þ»´ß£Gªªªttt:wÞjÅŠsæÌA­\¹ ‘HS§NÕÑÑ122“†ø«¡¡á«W¯„‡×B¢|þ› Ðâ çQÂoM6¾S!lþþþÊÊÊcÇŽ•••UQQ7n\YYYDD¾ºjÕª7nXZZR(ƒºººªª*„И1cB—.]:~üøŸþ¹iÓ¦ÊÊÊòòr„¶¶öŒ3Ø÷Ÿþ\UUU]]ýõë×oß¾Õ××ÿþ½±±‘F£Ñét&“)h¬h̘1jjj%%%Ïž=#ò\‘466rm__¹r%{0föìÙ...ìKÆ ;tèBˆÅbõèу÷䬬¬††®,è¼^¿~ÌJJJ.\¨¦¦æèèèàà0gΛ¶ qlÑ)úõ맬¬Ì™õ¢_¿~=zôèÑ£^­¬¬ðÿcÇŽE=ZCCCHx-<Êà¿ Öèñ…SX×ÕÕ‰Ôª¤¤„Á`p «|üøˆ‰‰Ù¼y3g Ây$^ýƒ³cÄGØ#Ó¦M‹¯®®æLë-HÛöH“Éd))))))‰$õÞôÞ!'szûöíØ»¨ž}ŠW“¤§§S(‚)“Øòÿc±X-ü°X,&“Éþ (»q㆟Ÿû˜¾¡¨¨È>à!tþüy;;;èxyymݺUKK !Äd2wïÞ÷;vìXÿþýçÏŸÏyŸ’’’ 6DFF¶Ú½ÏŸ?ÿûï¿Ë—/wvvÖÓÓûIù¥ãââêëë544?0™Löç–––6|nhhhhhè®^½ÚÛÛ;66ÖØØ8!!añâÅ\OyÃkáQ>ÿMèñ¥¬¬¼sçN___kkë±cÇÊÉÉeeeåää๒ÒÒÒ¢¢"„ÐÅ‹••• ìíí½½½7lØ`gg7aÂiiéÂÂÂÜÜÜ+V,_¾!$++[__ñéÓ§””ÜväÈ‘øs@@€«««ºº:ÞÉlÁ“eû÷ï0`ÀÛ·oñ朜öÖ??¿—/_ÖÕÕ%$$¸»»sžž'ÄóçÏÛðkÁoTdccSPPœœÌ^BÔ!ðröW<ŠóáÇäää“'Oâr‹µvíZ++«æææsçÎ%''sÝgöìÙ­žeÌb±êêêTUU þÛ,$$!TZZºmÛ¶Ž½sŸ>}:ä>Ó¦MÓÖÖ>uê”™™™LÆÿsâ ¯…Gùü7A Äš³³³ººú… nÞ¼I§Ó544¼¼¼V¯^úßÿþ÷áÃ\ ¿´,,,ìíígΜI¡PÎ;!%%Õ¿kkkö¿}?¾mÛ¶Ë—/S(”äççfddàü×®]SUU:u*N~CCÃ;wþý÷ßÉÉÉŠŠŠºººyyyYYYø°>„££ãÝ»w™LæÒ¥KÿøãŸú;!“É|<¹¹¹íܹ3((¨cÐÐÐqãÆ±ÏÂaç·ÒÐÐÆs|,KZZzñâÅ!™—/_òsçŽðÅUõõõîîîfffÛ¶mûÙQÎÇïÞ½+%%µxñbéÈd2û³””T>———oÚ´‰xO¾}ûˆ¶¾pႾ¾þ‚ ð%‰´jÕª 6ºººòN†ò†×£|þ› Ðân̘1x¥0Þ16[[[¼Z“׈#âââZ}hnn.WÉ¢E‹-Z$¨þÚµk>Üêm*??¿¸¸¸¯_¿và©z§OŸ600ÀNDD„ŽŽŽ©©)^…ÃÎ♜œ|éÒ¥ÀÀÀ´´´¾}û<˜óW¯^;v,W!/:>dÈ__ߎê9ßG;v /HG988øûûwì#äå奤DØä‘——wúôi¼¼:88xàÀì@!4}úôÇùò…ïaмáµð(€ÿ&Øu@ÛݹsÄò¿ÿýOHfÊ_£oß¾S¦La0¡¡¡x[wwwöQµµµ¡'Ožp²6kÖ,æããƒ'Ùrss÷îÝ+|„¦´´455UEEåàÁƒ"E ¢Z¿~}nnn]]ÎJ!$rýeFŽ™——÷î‡{÷îq^-//¯ªªrrrâÚ{ˆ­]»633óùóçÛ¶mc/b³µµŽŽ~ýúõË—/80pàÀ_ðƒ ¶ РíüýýãããB!!!m[pÓ±ð›ûÊ•+xÏåË—³|üöÛoãÆCÝ»wsÌìÂ… NNN$ÉËË‹ëÈ»aÆ]¿~]È9¿%%%ãÆ£R©ØgNT*õèÑ£ûöíC?~<((èýû÷………jjjS¦LùIm¿ðððÇã‚d2™sù¹X…׈?˜º í¸þýÝélmmûô铟ŸŸ––6jÔ¨öß077·¼¼œ}^"{'öÎ;ét:þåèèØÐÐн{wε ãìÙ³kÖ¬122ò--­˜˜˜ŸqdF£P(•••/_¾ÄÛëð†/|ŒáâÅ‹êèQ;?žª6!!aË–-JJJø«¿¿II B($$D___Hîw‚º2™ìîtéR‡ÜðÑ£G÷ïßÇŸ:ôï¿ÿ"„^¿~M£ÑðlT~~þ–-[ †··wpp0gÛM›6eff :äÅbíß¿ÿĉ$égD9»víÒÕÕmllÔÖÖ¾té{úæË—/·nÝ"‘Hâ0o%DRR{>+##ƒå „îÝ»‡Ëß¾}˵‡À ºwww‰tóæM|âs;YXXàDZ¡°°0üºÝ¼y3{(‹N§oß¾Édq1lgg÷¿ÿýOÐ)8EEE>ä<¡§C444ः ÊÎÎæÝeD£Ñ¦M›Y3ø€@€.ECCÃÎÎŽF£áõ¶ídaa1zôhüyÇŽ8{»‘‘Ñ¢E‹?~ÌÞRž——G£Ñlllø¦_¥ÓéŸ?ÖÖÖŽ‹‹ë¨#g°¸¸8mmm¼UÛÝÝwë“É @yxxtàsâ º¼P& €Á`´óV7nd³z‘Éä;wîà=>ÈÎξ|ù2ç’ØêêjvZx.ãÇŒŒDuÔ‘Çïß¿wqq±··733+))²›:>>þÇÚÚÚœ™+]:t5&LÐÓÓ+++»uëV{îóõë×ëׯãQôôt‹µe˼즦¦æÂ… d2ÙÏÏg%ÃX,–ÎÏKQQÑÙÙyåÊ•íéÛ—/_¦NZYYyîÜ9UUU¾cHlçÎC-_¾\œ—!:ü¯€®†D"á\gΜiÏ}¤¤¤víÚ…b2™÷îÝZH·ËËË 333ÇóæM‚÷<}ú4BÈÍÍs Ëƒ@§ 277ÿ믿:» ÊÊÊ?ïæòòò¿ýöÛáÇOž<Ô¶› 2ÄÒÒ’N§÷íÛ!4hРAƒ!„^½zõï¿ÿž={–âÕ«WÑÑѼQ“ÉÔÕÕMNN&¸ÑéÖ­[žžžÏŸ?WSSã,ÿþýo¿ý–““söìYQãøÒÒÒ¨¨(™Žš5H tº Ø: –/_~êÔ©¸¸¸‚‚v‘ܾ}ÛÍÍ !äèèxàÀ·oß’Édggg„ÐÓ§OÝÜÜØé®ååå·lÙÂu:îããcddäííMð¿ÉwïÞ­_¿~Ú´i§OŸÞ³g.<þ|ffæÑ£GãââÚòóôéÓ cÞ¼y¿àT*õöíÛ?û) ðºtèšúôéãæævñâÅ£GâE¸¢òööÖÕÕ¥ÑhoÞ¼100ðõõe£\½z!„OLf±X^^^S¦LÁgrzÿþ=F#¾—»¡¡ÁÝÝýÀvvvÆÆÆ¿ÿþ»²²²™™Yyyù®]»äääÚ6![]]}åʉ´víÚ64‰’’’•••¸™ x988tÔ¾? æ РËZ³fÍ•+W®_¿¾mÛ6MMMQ›³“Æ‘Éä3gÎ <˜Åbùùù}ùòeÍš5:::¡ÒÒÒºº:ΜÛ¡ºººoß¾ 2ç[ hݺuVVV80š5k–™™™ŸŸß¥K—LMMEí<§Ó§O755ÙÙÙ´ç>DôíÛ·CN0tØu@—¥©©9oÞ<&“yèÐ!QÛ?~!ôöí[))©¦¦&mmm‰tûöíÄÄÄGáȉÅbijjFGGsN'š››çææŠôÄ .°wŠmÛ¶ !4cÆŒvF9µµµçÏŸGmÚ´©=÷H(tèÊ~ÿýwiiéÒÒR‘¾|ù2##!äââ’——gnnŽsJèéé>|Ÿ¯óñãGKKKÞc 544Μ9cooOüqGŒŒd'm%»qãFLL …Br<1¯ÒÒÒ¥K—ž¸»»··yXXØøñã Æ–-[Ü¿qqq ƒÇã'L˜ðóçOøÜ1Nž< KxŽ?¾Ã   ôjP¡ƒ‚ÒÇ:t¨••Ç;tèàgÙÚÚþøñ#..®¼¼¼¬¬ ‹Å}ýúuïÞ½C‡½zõj\\?.‡Çã1™ÌÑ£G'$$ÀD;mÂd2ß¾} ËÌÌüúõknnnAAAQQQYYYUUUYYÙ÷ïß á÷PXX€Åb÷ïßß±PPPú¨ÐAAéû899Q(”ÈÈHvÓ&‚¥gbmm ˆÐî³ åÀ¶¶¶{öìY°`Aëþ {÷î1™L&""¢«««¬¬Ìãñ>|èîî^TTCsÞ½{·hÑ¢ëׯËÉɵÒUQQÑñãÇ'L˜`ee•””Ô´Vwšœœ,##ó·rçÈÉÉÁ,D(=–Çÿí)  TèôM(о¾þßžJkÿUrÅŠ~~~>|8~üxëɯ_¿8p …B™6mÚÅ‹ïß¿O"‘Ö¬Y#''ÅŠššZXXX+k¬êêê(Êû÷ïû÷ïoll ŽÊa³Ù°Äº‹‹ Z¨¥kA¤¾¾žB¡Àt:Ç㉊ŠödÛ*tPPþ0Ì™3gæÌ™sæÌ™+V´RésÇŽååål6[LL,//ïСC&L’’6l‚ ûöíÓÓÓ›3gNK*§¾¾ÞÎÎîåË—999sçÎ;wn·]S3¸ºº3fåʕ¥ÏË÷¾ÿ>33³¢¢‚ÃáèèèL:ƒÁ°Ùl@øÛsltÕ Ê?ÄøñãáRómÛ¶µR½yРANNN[¶lyþü¹¶¶öúõëÓÒÒoß¾ÕÒÒjöÄ_¿~Ñh4QQQ ÌÌÌ–ùúõë… p8Ü™3gzò+& J¯£¾¾žD":tHGGÇÚÚÚÙÙùàÁƒsæÌ¡P(óæÍKHHÀãñ‚Ðéô¿=ÓÆ BåßÂÅÅIÔÏ IDAT¥ÿþ)))ÁÁÁM––––––N™2eÓ¦M“'O®¯¯ß¶mÛÉ“'÷ìÙ3kÖ,.—;~üøGIKK7=×ÏÏoâĉ€íÛ·‰Än¿˜ÿAM›6±Ùì 6hjj yt”> —˵¶¶vuumôŽ„ HLL̼yóÔÕÕ{à *tPPþ-¤¤¤à")GGÇ’’þþ„„„C‡ÍŸ?âĉ_¿~ŒŒ¤R©éééJJJÚÚÚ ×°ÃçÏŸ‡„„æÏŸŸ——'„ á-áë뛑‘1pàÀv¥FDAAi,ØJ›ììlkkëXn:((ÿfffºººL&³¡+;;ûÌ™3ùùù4Íf×××ÇÇÇ×ÔÔlß¾ý÷ïßx<ÞÎήi«œœ;;»~ýú”””„nÜ,EEEGœ={–_¥KÀ`0¯_¿n½……Åëׯ}||øåêz]pWª¯¯ço#B£ÑzÚE¢  4"  _¿~qqqW¯^…{ µa2™l6»ªª*11QAAaÕªUüCñññÕÕÕjjjB7n ‚ VVV cåÊ•³fÍú»“AAé“ÔÖÖ¶rÔÛÛ;$$DMMÇãñ‹Ã4¥¾¾žÓQ¸\.—ËíÀÌ;»ê ApíÚµâââ_¿~1büøñãÆ—v²”î@NNÎ××wùòåNNNÓ§O§R©Ã† SUUýôéS£–'((hþüù8Aºº:11±øøø;vÀ‚´â°X¬Vn‹räÈ‘ŒŒŒÁƒ{xxt²+”fiEèHKKÛÛÛGGG‡……ùùù5Û†Ãáàñøïß¿'''·wh"‘¸dÉ’‡ýuJè ’••¥¯¯_YYÙp¿¤¤äºuëvìØA¡P @häÔGAAùëÌ›7ÏÜÜüöíÛ«V­JHH ‰¦¦¦Íæ8Ž œ0aªU«vìØammíîîÞù °X¬«W¯^¹r%))©3ý¼xñÂÇLJâ‰sPPº‰V¢Œû÷ïˆWTTÌÉÉQSSkÔ ¨¨HRR --Ý^0‹•’’"‰_¾|i%)Fk=tà›Íþúõë¬Y³©@uuµ²²ò’%KÒÓÓQ•ƒÒc™={öð?Lž<¹.ŒìVNœ8¡¬¬œ½oß>€‘‘Q³ÍÄÅÅÍÍÍ%$$¬­­;?.—Ë ™4iÒû÷Š:ÓÕ¯_¿,--Ùµk×äÉ“;?7”f4hPK‡ÄÅÅòòò»wïþúõkÓð.—[SSÃãñ0íDDD„L&?~¼c3ï¸E‡@ lذ¡¢¢¢¥\.÷þýûñññéééòòò.AŒ‚Ò}¬]»öÅ‹qqqæææT*•D"ýí 11±k׮͚5ëÒ¥KS§N533muwªªªªªªAˆˆˆ£GÊËË߸qCSSóþýûîÃá¬^½º¦¦fÒ¤INNNm¶çýAAàÿ߆íáoð;iÚ€èÇL&³Ã…‚Òár¹ v***ÆÆÆVVV<0mÚ´÷ïßs¹ÜfÑ.\¨ªªêÀÐâââÎÎί^½êÀ¹ X£'##£•6***ŽŽŽ–––$ ÞPPz+W®”““‹‹‹Û¼y3ü­6„Çã]ºtéÆ%%%***vvvðPDDÄùóçóòòdee•””RRRüôéÓvŽ È·oßà[ ‹å¿Á4Ü´tˆÿÐ쉂0zôhOOÏ;vØØØ¨ªªR(”¦BG^^¾ÙÄ9í%!!áÈ‘# æôéÓÐ|Íb±`BÕfáñx, ‡Ãµ”nõÀÉÉÉ åóçÏT*µ©ji¤f: ÒU«ÏV­Z•””ôõë×.é ¥Ã0Œ¦…xïÝ»7lØ06›M£Ñlmm}}}&&&°$p#yiJjjjÎjH…›ÍÆãñ4­¥JJJ‰‰‰222•••………-ùÕ§M›Ö±9èt:ƒù×ÞÂQ„†‹‹ËÍ›7§M›6gΜׯ_oÙ²åØ±cK—. spp R©VVV>|HII´Y¼)l6{üøñÝ0qþ_5¢©Z"‰L&sÑ¢EÍÚhq8Ü©S§ÄÄĶlÙR]]}úôiqqq{{ûß¿{yyIHHìÙ³§ªªÊÍÍMBBÂÅÅ¥²²rÿþýRRRîîîŽŽŽ æÛ·oŸ>}ºzõêâÅ‹ù:Œ@ °Ùì]»v3æÉ“'666wïÞ=zôóçÏׯ_¦¦¦–””TZZjhhØ¿ÿèèè’’’Y³f„‚‚ ««+`Fì^;üØp£•CüNš6àb2™_¾|d>sæÌùöí[Óýñññð¡2}úôÒ J·‚Åb§NJ"‘ Ücjj:qâD77·ƒ6léææöû÷o))©fû155ÍÊÊ|ÜgÏžuxÎ|:(t¸\.“Élå ÉÚÚºÿþúúúl¶Í÷ïß§NÐÊ+]K 2„L&×ÖÖ¢B¥;(** Ù°aÞ={\.wýúõÞÞÞ‹-òõõ9räýû÷¡…ÖÁÁ!,,ÌÔÔ´£ÀêQ =&¶-jh¨h¶“vÍ„J¥æææ6{¨¾¾žËåòÍKâââð.†Ç㇠×^‰ˆˆŒ3n“H¤éӧø`QQQ###2™ C÷Ž=ŠÇã¡2À`08nÛ¶m3fÌ——xzz®^½öàää—ZÈÊÊÞ½{nËÉÉyzz®]»àïïo``Àb±Ê”†j¦áþü:@nnîÒ¥Kiiggknnÿ»òóóãããù 6nÜØ]³DAi07UHHHFFFZZ‚ ×®]+))i´.ƒÁ¨¨¨´¢ Š‹‹›÷-Ááp:ÑÁã[;WVV–Ëåæçç?þ|êÔ©*** òx¼ÚÚÚ~ýúUWWòÆíBDDDZZº®®®ªªªõi  ´—¬¬¬µk×>}úôóçÏ‚,Z´îÇápÆÆÆ‰‰‰k×®åû¡õõõÃÂÂ:0–ˆˆHzzz—Mýÿi$‰šÊ£F Æ´iÓ~ÿþ­¢¢¢¥¥÷óçO~oül§Ð–·ÅÄÄ6oÞ ·) TQQÑåË—Ãm2™lff·—.]úøñc77·}ûöíÝ»×ÂÂÇ999þ}@RRRGGn„‘#GÂm<¯¬¬ ·¿|ùbccÃår·mÛÆÿõFŒÉdrll¬™™Ù¶mÛž‰DºsçƒY¶lNWVV޽}ûöÁƒ¹\.4ÙÙÙEEEÁÓ­­­aâ€)S¦¤¥¥‘ÉdKKËíÛ· Mü¡ôvX,Vaa¡©©)tKa06›½`Á¾2yòdá×~i“:’I$™L†«ÅšERR’Ëåzyy­^½ºi6‹%!!QVVV^^Nk?x<žÍf0 é‚/”NR\\\]]]UU¥¨¨à¿^#’ &&&--­¨¨øâÅ ~Ài\\Ü_›nË`±X•„ˆˆ‘H„?[QQQ111qqq III))©~ýúÉÈÈ(((ÄÅÅ‰ŠŠ~þü¹¶¶6;;ûÊ•+°žCWU$Æb± .Œ?zôh@@€’’’ŸŸ‹m—M7??ßÈȨ¾¾~Ñ¢E}¦Ôùsç~þüùû÷o--­k×® 0@CCÃÆÆ¦éB\+++‰Äd2aþ4&“I&“­¬¬ZZZü2€™™ÿt›yóæ^½zehh¨©©yîܹ .ëúPz7l6[DD$55uçÎ/_¾Ä`0999LLLlÔ’ÿ–Ò£è 9¾(((TWW7ÜïååejjZQQ1qâÄ”” gÏž5êÓ§O ×k`0‡söìYYYÙŒnnn>hРºººŽM…OHHü­À’yyyA¨Tª¡¡¡··wZZš²²rjjê»wœÂÖ­[ŒŒŒ¦M›–ýæÍ›¿|]•J}þü¹®®nxxø–-[üýýMLL"##ƒ‚‚ºv =====½7oÞx{{××× .t¾ÿnddT^^>mÚ4(’ºvb þƒÁL™20xð`{{û'OžÄÄÄ4l¹zõj55µ7ZZZb±X2™|ñâʼn'¨Tª±±1´âôõõ¹\.<ÝÈȈD"EGGÛÛÛÛØØlmm6n܈¦ÿ@i˜½æúõë07úÙ³gýýýׯ_9{öl~¨®´´ôÆ7oÞÌãñzÚ³S~%%¥ììlþÇéÓ§;::~ùòEBB"88øøñã>|¤§§7Ölݺµ‘KK@òóó;:e”ÿãÒ¥KðëtóæÍ¦G½½½UTTîÝ»—””¤¬¬ìéé¹xñb€‰‰ ‹=þüÍ›7 ```+ä™wT*5,,láÂ…wîÜ׸páÂ… vÇXZZZ!!!ååå–¦úö훉‰É?FŽyûöíÎçSî9\ºtéòåË0ëZ›hkk›˜˜ÀBªVVVPå¿ZÙܹs£££+**äää:0a”(Y†º{÷n///¸“Ãálذáׯ_{öì¹y󦩩)Çó÷÷‡¶h4Z_:3gÎä/vÀ`0ÞÞÞ4mÊ”)åååü6†††ãÆk©>ERRR»\ìFFF­WOEAi­{ðxüÖ­[·nÝÚô‘‘?½Þ7bccûLÁ“ &ܺuËÂÂâÖ­[L&óâÅ‹ÝzÛЬûùógccã²²²I“&…‡‡÷%• R©ü¢cmrîܹ A®_¿.++Ûè+ÊmšÎ'%%…J¥^½zE$[Zƒ‚Àb±qqq .lúEÚ»w/‡stt|¨¥¥Õ%™fzºººwïÞ]¾|ùƒ~ÿþ}ëÖ­¿+,^¿~½lÙ²êêê©S§†††ö• =M#FŒX¹r%?:øÖ­[………ÐÜ !!¡¦¦¶páB—àà`qqñ .`0˜Ù³gûøø:;;KHHÀ%®ÇŽSTTüüù3L|••Åevss{ÿþ}MMMLLÌêÕ«ûÌÿ$J—“ŸŸ Èüùó[Z÷´wïÞQ£FÙÙÙq¹Üäääžé¸Ð)//8p ­­mqq1\FË·nñ™9s&,åÕ©i¢ ô0222üýý¹\.™LÖÕÕuqqùÛ3êb¦M›¹xñâÿþûÚn[Y|Эܽ{×ÖÖ–ÅbÍ;788¸/ÝLNž<ùýûwÀ7¤¥¥MMMù/ÄðøãW7nÜÂ… aRJƒQRR³ÂÃÃ---ÕÕÕÕÕÕ:äçç—@¡PTTT>~ü˜––¶`ÁØ•‘‘Ñ“'O¸\îÚµkwïÞ-ô+Fé5())mÚ´©•ÕÝ\.×ÜÜ<##CAA¡'«Ða¡Ãb±H$Òž={H$ÒÁƒi4š»»»‡‡GÓÕóÚÚÚL&³/Ý›PPÀÿ»®ú*ñññ‹-ÊÎÎVUU½y󦾾¾0'Àd2/_¾ غu«››[[Ý0eŽ€‡e߆q ±²²‚‹°šeûöí.„òï••%##Óæ*„ºº:SSÓׯ_gggÚ=“v»Þa⪪*--­“'Oº»»?¾¢¢ÂÍÍÍÂÂ‚ß ÇÛÚÚ>þ\NNµŽ¢ ôRÿûï?}}}&“¹xñâ]»vu ½gÇøúõë¤I“._¾ŒÇã/\¸kGgè¾Gdd$Lõê  ´Â˜1cîÝ»'È=;;ÛÖÖvÔ¨Q=¹ÐSû -ŠŠŠ7nÜØ²eKMM Ü™­­­wýúõÚÚÚˆˆ*•úâÅ‹²Ùl‹ÕÓ¡  ˆ¸¸ø½{÷N:åîî~éÒ¥ÿþûïêÕ«êêêÝ7"Çóòòòööæp8222¡¡¡Ý7Ü¿€ ÷ 9rd狳¢ôm0Ìÿý'`ã   Õ«Wkkk ²|2""¢imóV0` üÅ`0VVV‡Ãµ÷§B'''gøðá .ŒŒŒlt¨¬¬löìÙ¯_¿Ö×׈ˆ‘‘]—g å/‚Á`ìí파ÌÍÍóòòf̘±uëVggg—…·‹ŒŒ kkkX+jçÎ{÷îEß§gæ´Dé™°Ùl,Û®"SÛ¶mËÌÌl}ayMMMttt{'óþýûß¿Oœ8ÑÓÓSLL ƒÁðx¼n:jjjÛ·ooªr eee&&&‰‰‰=j©¸ Jïeøðá)))^^^'Ožƒ.éj–ÒÒÒM›6ýíY ´Fo¿ÏΘ1cÆŒ¹¹¹§OŸ IKKKKKsttÔÐÐÐÖÖ2dˆ¼¼¼’’’¬¬¬¨¨(‡Ã©©©)...///--MKKKHH€ú0dÈ{{û•+WöŸ³˜˜\Ÿñ·'‚Ò†††è:¾¦@¥’žžÞÞ333 h4\gÎf³ëêêp8Ü÷ïßUTTìëëkbb2|øð±cÇÆÇÇÛÚÚ6[°ÒÁÁ¡Q°¼···¦¦& 99AÇëèèHHH~»Hè¼{÷ŽH$–””Ò˜Íf¯_¿>55•Éd¶¹ÞjêÔ©2)·Nà £R© è7µ)„©GPz27nìß^*•zæÌk×®%%%={ö,+++++KsGŒ¡¥¥µlÙ2==½nž¦P‘——¿~ýúßž JG ÓéL&³%ñ÷÷www¿ÿþ«W¯Œ§M›öãǃ¼iÓ¦9sælÙ²6ž5kÖÇìGãââ`©A•Å‹?zôˆÃáˆŠŠ Òƒ@BGCCÃßß_À9ÒÓÓoܸÑJÒ*ÈÓ§Osrrï–ºº:™LÎÌÌ$‘Ht:½=ômDEEçÍ›÷·gò!**jcccccƒ ȧOŸ’““ß¾}[VVV]]ýãÇ?~ˆˆˆŒ1B\\\FFfäÈ‘ZZZºººÂ1ú¢  NeeåçÏŸ;foööö^¹rå¬Y³lmm½½½ ~ýúuìØ±?þüùóþýû>>>|×vQQQzzº””‚ 555ŠŠŠyyyJJJ%%%d2‹ÅVWW+((¼ÿžÅbmذÁÐÐËå„¡C‡ÁmAì)@@¡ƒÅbÛštñâÅV„ƒÁb±ëÖ­kWŸ OP(”ººº>SI¥€Á`ÔÔÔÔÔÔø{RSS ÆŽÛg ¼£ ôa|ûöíŽËb±lllž?~þüùcÇŽñx<%%¥ððpþQ‹… È»wï444äåå‰Db¿~ý0Œ”””‚‚™L†^*‹õéÓ§1cÆlÚ´ÉÉÉ **Êf³ †ˆˆ‘H$‰"""t:]¡Óv¼0,<Þ(ïx›$%%UTT´ä¥†(|Ga±XX,¶  àÌ™3íš Š7–Êú¢  ô4~þüÙás/^¼hfföúõë!C†P(”{÷¥1Œòòò‚‚‚/_¾$&&Êˡ‡‡7®¦¦F\\|À€?~d0/_¾|óæ @DDdàÀS¦LY¶l›Í¦ÓéD"¥¤¤lÚ´ ––Ðûß¶E'%%E^^¾]‘4‡óøñcssófÂ5Y‚|3fLFFÆ„ `B &äääL:•ÅbEFFšššÂÓýüü&L˜PVV&++«££³zõê´´´‘#GB‹@˜2e I£€I¼Ún¤©©ùøñã\mxxxCïÕ?úõëWXX(###++›PPP°f̓ÁpqqivШŽ`YYYzzºµµµ‰‰‰……EmmíÓ§OŒŒèt:ªuPPz°jÑAAé-tRèTUUíܹóÆõõõ\.wذa &“9jÔ(:N¥RaKdÓpµ¹’’R}}=…Ba0C‡år¹£F‚÷F‘C°¸¸ Sj[èP(”¬4DDDáp8//¯BëSyyy~~þ«W¯ÜÜÜ aK‰´iÓ&Aº2dÜ8s按‰‰¸¸xllìÇ¡¥G…jÑAAé-´«U³Ü¼ysÍš5úúúl6›Ãá4:ŠÅbq8“ÉÅb±™™™ü£Ã† ƒ­ÀŸ(~N£õä]¼¼¼cB‡N§oÚ´)22RUUÕÆÆ&55õÎ;EEE^^^eee<ÏÍÍÍ××6–––~ôè‘‚‚B^^žŠŠÊçÏŸåääØlvmm-•J…e¶¾}û&))™™™9gÎ øøx˜ŸÃÝݽ¤¤„F£‰D´º JÑAAé]tIÚ‹Í›7¿{÷ŽL&C3 ¿Ï´´´ &à ÍÑ£Gûûû—••ðx¼²²2—ËíÚ%™m˜;(##£c½?~üøîÝ»7nLIIQTT,[¶lÙ²e Ûü÷ßcÇŽe±X<oÈ!¥¥¥ªªªJJJ8ŽÃáHJJb0 X/¾®®îúõë[¶lÉÊÊ‚1 ŒM&¨ÊAAéi B¥W€  ‚ÏÖN’››Û¯_¿%K–ØÛÛ?ž¿_QQÑÓÓóáÇ)))²²²ééé.\000PRRRVV–––f0]žx¢ ¡ÃápB{#‘²}ûvuuu.—[QQleeU[[+++›––6f̘¬¬¬#F 6ìýû÷ãÆ#‰………8îçÏŸ999–––x<ž@ Œ7nüøñwîÜáp8Pú°ÙlQQÑãÇ«¨¨tx±: J÷ ”ž›ÍÆãñX,–F£tIŸ #88&ú#‰‚¼|ù255•jS^^®¬¬»xñâúúz¸¿;Òkµ!tx<\õÞáJJJœ}}}a°0‹;w.™L.//¯¬¬TTT¬¨¨7n\nnî˜1crrr`öÕ«W'''$$$Ö¬YC£Ñ¸\nqqqTTÔ€ÀM80—|KU6PPPþ¨ÐAAéù°X,¶~ýúÐÐP*•ª««ûìÙ³.é¹´´”£Ò‡“0sæL<ß}`Úˆäñx Àøûû§¤¤ R__O"‘† 2dˆ¬¬¬¼¼¼‚‚‡SQQa2™T*ª9~xX •@ àp¸!C†Éd6›Íår-*Ã`0 U9((= 4¥çC¡P ÛèÂ… !,,ìÀ‚äâë ÚÚÚÏž=sssûýûw·FžCèðx<‘7oÞ@ãX#DDD—Ë…ÕC7oÞ̯‚Á/û[ í¦o‡d2M'‚ÒA-:((½·téÒÍ›7ïÛ·O\\ÜÕÕ•N§çççÏœ9³ËÇ>|ø;w’““µ´´¸\®””T·Ú)Ú: ¦K¬I™™™'Ožœ1c‰Dª¯¯ý4Õˆˆˆàñø¸¸8QQѼ¼¼‡³”••÷îÝ ‰ Ûw~>(((µ蠠ô ètº™™@pww2dÈêÕ«¯^½:xðà„„„Á»Âáp³gÏnö …âé陓“³hÑ"e+„gz‹wAh4PêÛ IDAT™L–€ ¦:ÉîÝ»çÍ›çéé)--Í߉Á`ž{ö,00ðܹsQQQ U$++ëǪªªâââh^”Þ*tPPz t:ÝÔÔ´©¡åàÁƒl6ûÈ‘#öSRR }z·:ÚÅÄÄ:T\\|øÖ­[ÙÙÙЉï]K‹wQQQ55µŒ?>55uòäÉÏŸ?g2™?îú¬…x¼Í—/_\\\Þ½{à2EAAéÕ ”^ô^5ÝòäI.—ëèè(H'?þ¼~ýº¡¡áðáÛe0yyy¯^½ ÷óósqq±´´ÔÖÖ:u*Ç£Ó齌ÿ§E¡ßÀ–-[VTT4uêTmmí;vDEEÍŸ?ŸF£ÙÚÚ¶kMMÍiÓ¦5»~lëÖ­eee~~~555v^ JÏ:((½ƒÑ¬÷êÛ·o÷îÝ[¶l?çKëxyyÚ[l;))éÒ¥K°VyÒš=z¯çõë×§OŸ666;vlvvö™3g&Mš$àD"1##ãÅ‹,ëÁƒ¶¶¶jjjbbb;wî,**:wî‡ÃADEE¥ .¥' ”^„¨¨¨¤¤d³U ¼¼¼ðx¼½½½ ýäææFDDXYYÉËË·kiiiíj/­ QQQUUÕ1cÆ4Ü™••5g΃qîÜ9Ç`2™µµµïß¿OMM566>{öìÇkkk½½½)ʳgÏäääФÆ((}(tДޗËmÖ{•‘‘ñßÿ­Y³†B¡Ò¯¯/‰D244l×è4­]í¡µ»ß{ÕhYY™‡‡ÇĉçÎ+à0%%%D"qÊ”)"""Ó¦Msqq¹té’¡¡¡œœ\zzzÓö\.·¶¶¶Ëu(((B.£@… JoÉdššš6[ÿÁÏÏOBBbùòå‚ô“••6lX»Fï¡ÓFQOè½:pà@£ýgÏžurrrrrЉ‰d˜7n>|xÖ¬Yñññ/_¾|ùò%ÿÐÎ;:$''׿999yyyeeå#FŒ1bäÈ‘€î(ÚŽÒ&t:ýÚµk]Û§¶¶¶€Aû(}ÔuõO ‹ÅêÚ> *”…‰¨¨(ÀÀÀ <<¼Ñ¡‡–••ÙØØ\¼x±Í~ÊÊÊu¸A dddJKK›ª««ëЬ[£ ¡C¡PTTT444 4ãSUU`oo¯¥¥%H¡óçÏïÙ³gçÎñññMÖÖÖÖÖÖæææ6ÚÅb¯]»¶råÊ6ûGérh4Úž={º¶O"‘¦­­ÝµÝ ‡Ó¨”,Š  BçŸ"??üøñ]ÛçìÙ³ƒƒƒ»»À$JC ÷ª©Ða³Ù—.]rvväѯ®®ŽÁ`rrrø{p8ܶmÛ¶nݪ¨¨H§Ó¿|ùrëÖ­'N4<ë/Xt`è̲eË À©S§lmmœœšú¶šR^^~õêUkkëÑ£GøðAÀÉñx<[[ÛÅ‹z¯QAŒŒŒ.ÿñ ‰´dÉ’Î÷S]]Îd2/^|ÿþý¥u8N^^^›Íüüü¦OŸ>sæÌ†5LPÚ:­m``ÐÇ,]U$Ú‡âââV­ZuíÚµ^ªuÞ¿?bĈÞ5y&“ibbB$›Võ ܳgµµu›B®XJMM¨««»»»ëé鉋‹s¹Ü—/_Θ1cüøñoß¾mtÖ_:à÷jÿþýöܺukåÊ•C‡ýþý{›ýøøølÚ´içÎëׯ|~¿ÿ.**joضÐ Äy—˜˜8eÊ”óçÏ÷ºÛ…B钼ع¹¹áááâââµµµ=MëTVV 8™   ==½Û·o ­DKàŸ:ÅÅÅm6KLLôññ9zô¨–––f%Ûù~Þ½{·lÙ2<Û3µŽ‡‡GS)ЈÜÜÜòòò-[¶,\¸P8³ê<Ð{5wîÜG5:”ŸŸ»|ùò]»vUWW·ÒÉĉ¹\î’%K®]»6tèP@FFÆ•+W=z´ÿþ3f4{Öß: eĈcÇŽÍÌÌltèØ±cVVV¶¶¶‚$úüùs\\œ™™Y»„ ¦¦FNN®]§oß¾%&& Ò2))iùòåÇï’ ©½999==½ðððž¦u8nÈ!­4¨¬¬¬©©yúôéÌ™3ƒ‚‚FŒ!´¹µBNNN×VhérŠ‹‹ÅÅÅì’ó·ðððèÚ¿éïß¿,øíÛ7 ‹Ë—/·tëÿÇ6lXEEEÏÔ:áááµµµ‚´ÜlŠ‚„cÇŽz Ö‘’’ºuëV+ |||nß¾Ãá²³³uuuO:%ˆÓ¶»©ªª*,,0])JKxxxüþý»;z–““Û°aC+ >|˜]QQaff¶{÷î]»võ:»owC"‘®\¹²víÚž©u;wîleJééé111l6ûرcoÞ¼9|ø°˜˜˜0§×1 ÷ŠD"1ŒF‡"##‹ŠŠ¬­­[:d2Y]]½  ÀÌÌ,22rÒ¤I...&&&  2™Œ HS¡ÓÖ_‚+i4š¹¹ySïÀßß?((hñâÅ7oÞl³Ÿòòr€¼¼|S¡³`Á‚†SÞÃùC‡m%¡3üCb0˜±cǾ}ûv×®]æææŽŽŽÿ¦û‡ÃõX­#7nÌÏÏŽŽ¶¶¶~ñâÅñãÇÿzô˜¤¤¤¾¾þßCoÇÏϯ›z766n¥Á›7o²³³§M›–””tìØ±¤¤¤ÀÀÀþýûwÓ|z)***=Yë,X° íÂårcbbF•››ûäÉ“œœœãÇ5J˜3ì|ïUXXX£C'00ÐÅÅeÊ”)IIIÍž>nÜ8<âÄ <ÿâÅ mmm&“yõêÕ“'OFGG·²°£;÷õ(**:|øðfß¹sç÷ïßÖÖÖ‚ô£®®N§Ó¿}ûÆß3räÈèèèÊÊÊÈÈÈ_¿~edd@O^Ch4Zßpðûûû;::„Û·o[YYüíý Ö122ª««[¼xñ«W¯þöŒÚ™LvqqÙ·o‘H ž5kÖ—/_þö¤Pz=gΜéׯ߳gÏtttž?þ·gÔã€Z§_¿~Pët‡ƒ£[QSS»y󦚚Zaa¡••UHHÈßžQÛ´”9pþüyA,,,Z:F"ïÛ·ïîÝ»cÇŽår¹sæÌY·nÝû÷ïóó󡧃ÁÇ¢#Ð «Ù ¦ÓéAAA3fÌDŸNš4éíÛ·l6[TTt÷îÝyyy>|˜;w.ƒ)..&‘HšššMßi4@dž=ŸÅ‹_¼xqðàÁÐÕ%ñz½‘^­uFFF—/_:t(tcݹsçoÏ¥×£¥¥uýúu---èÆòòòêŽ2νšÞ®u—,YÝX=<0ƒÉd7k´þõë‹Å’héÜ)S¦ÐétiiiAH$‡ûõë<ôúõk~ne‡ÓèÄ¿fѼWÍ @¤M£N¿~ý¨Tjyyù‹/ÊËË=<<úõëwáÂåË—3Œ–\9}Æ¢QUU½zõª¾¾~]]Ý®]»Ž=Úåùµz,EEEËþ°|ùòüü|))©ºº:###Xµ¾A¥Rƒ‚‚æÍ›G§Ó­­­íììšz²QPÚ…ŒŒÌ™3gÖ­[8vìØ¢E‹øÏ†™ªªªûx÷îÝÊ•+)JllìâÅ‹{Ö!»vírww{ò䉹¹yvvößžT‹ˆŠŠŠ‹‹Ï›7¯Ù£\.·¥G³ˆˆÈܹsmZßéÞ½{‚À¿]Ï:¢¢¢T*uܸqM}üøñÅ‹VVVÐ¥×ZZZ ÆÈÈhÊ”)‰‰‰+V¬:tè«W¯£¢¢”””àå55dõ=@¡PÜÝÝÿA7ƒÁx÷ÿÀP6›ýäÉ“¿=»vƒº±Pº,»iÓ&ÔÕ?~ìoÀÙ³gaòÜ—/_ ÚÑ×׿zõj¯pcµâ½âñx-  ‰–$ARR’<·©ÐùkÁÈ ÷*##£éQÿ›7o.[¶,((¨¥ ÇîÔ©S'Ož¤Ñh666999 ¨¨¨àñxX,¶%¡Ó—Ì9 Y¼x±ººú¾}ûþ…ÕX -ùwnÞ¼ùðáC!ϧ 1225j”³³sZ…Ò«n¬C‡½yóæ_^%-- Æ6%33óëׯl6[ÈSê* ëôéÓ÷îÝëÉ«±X,ÖüùóÏœ9sõêÕFuÅ[²èˆˆˆœ8q‚F£ñ/‡ÉdŠˆˆÔÔÔðÛøúúFGGýúUJJjìØ±Ç“H¤Y³f òÛ.Ú‘Òftvvnz(44´¼¼ÜÆÆ¦¡3qâĪªªsçÎ9::®[·ŽB¡dgg;;;s8œÖk*õáŸ7tc=z4!!¡o¯Æ"‘HcÆŒiöPM’$8ÐåééÙ£Vc¡ôj ëâÅ‹AAAÿìj¬Áƒ9r¤ÙCGýúõ«çÓµ@7ÖøñãÝÝÝ{ìj,2™ÌåríìììììÞ¿åÊ•àààŸ?¸\nÓÅSRRRQQQªªª mD"ÑÇǧ¸¸¸aKàååõøñc˜¹f„ ‹-rtt¬¯¯ïò«h‡† P(T*µÙRL&óÚµkÚÚÚ ->iÒ¤ÚÚÚOŸ>ÙÙÙ!òêÕ+uuõ+W®|þü¹a³¦ñw}Õ¢ùgÝX} Ô…Òå n¬žïÆ‚†7lØ0oo¢°°0333AàÓƒÁhiimذÁßß¿¸¸xòäÉ<¯QhÎ?u+%%åää]=555˜¬õ˜ŽÑ¡ÃÏØìQXBJJªÙ£T*uÀ€ƒ†9,ûóçO¨ø233Ùl6?&Œÿ¿)ö]‹t5Vß]…Òå «±ú<½b5‹Åãñ‚0Œùó燆†ÊÈȨªªÆÄÄp8œÔÔÔÀÀ@kkkø¢Îj³Ùlh¡ñöö¾pႺºúÆsrr8Nrr2€ŸTewÓw»}¢•µW­W´122`±Ø¦Yž FLLŒˆˆÔ= Mj«W¯ÆÄÄ4êVþåÕX} t5J—ƒ®ÆêóôüÕXÐ~“——G§Ó —Ë¥ÑhT*uذa€Ë—/ÃfªªªpÖòÄáp +W®|öìÙúõëß½{ ªªÊ®zÿþ=ÜÈÈÈ2düøõëW&“Ù…KêÚ't(ʰaÃ&L˜ÐôPëBgåÊ•­ü2ÍÍÍoÞ¼ -FÍ !k޼¼‹Å>}ú¶äp8UUU€¡C‡zyy988HKKOœ8±®®®¡< ‘H)))¥¥¥)))ü?~ü˜4iÒ¡C‡*++ùë“@sK”ÚKû„ƒ©¯¯¿yóæŽ;úõë×ðP+BÇÂÂBKKKZZš¿‡L&WVVò?Ö×ׯ\¹2  ®®>uêT]]ÝÙ³gC'ÎÚµkÛ5ÉÎÅfvv¶µµ5¡Â]hn¬oß¾ÁUš}ž˜˜˜Ë—/ ÙBÖUn¬^—)äßAø.¤žàÆê½ :@uuuÓhŠn¥gº± ¢°°@&“Ùl¶ššÚ·oß233Åâàñø>lذáèÑ£¦¦¦>>>S§Níß¿ÿ‚ õ©­­}÷îÝF_`&“éêꪭ­-"""""2|øðwïÞuþ9Õîð‘aÆùøø”••=xðÀÄĦ-†ÿMc° ƒ‚‚ ø‡˜L&ÇÛ»wo£–222~~~qqq/_¾|öìÙÔ©S===uuu›†5u7ð—lnnN¡PRSS---wìØ‘——'´ Ç•=|øpgggB߇)//wpp;v¬ŸŸ_w„ô·D—¸±vìØáêêúHÒÞ…›››““ Oݵxñâôôtaú·(((ÐÓÓ»pá‚€%Ê»!»±BCCííí[ „ïß¿Ã(cø‘ÃáèèèTTT-%%1MUƒÁðÏm‰ÒÒRqqñÎ?¡Ú-tðxÍ`0RSSoݺuèÐ!5äãÇ$IAAáÇ‹-š8qbdddee%—Ë:ujuu5ÿVž••5zôèììlƒ‘™™ùñãǼ¼¼?~üüùó÷ïßõõõÝgQ„BGDDDJJ fkغu+øð¡‘‘‘——ôA nucÁÿjiii:~þüù±cÇîß¿¿Oʾþ>|xyy¹«««††Æ±cÇ„öwìŒ fÙ*--ݼyóìٳ߼yÓ…›5kÖð?¨««¯[·®é*P”–€©’8Nhh¨žžž©©)?RAü-7¼ñ"­§§·jÕª? aÜ¿|N‹ˆˆÐh´€€€ùóçûøø4Œ»èV„ãÆ‚ÞvôèQeeeww÷6Gár¹ÕÕÕ æõë×W®\!‰®®®«V­²±±‹Ã¥¡™4i’±±q£N‘””„Û eÏž='Nœ¸|ùòÇŸ?þñãÇ¢¢¢‰'‚?…ÎÐqcINNŽššZRRÒÂ… aÞC‹5nÜ8x#–––æp8#GŽ„Y,›Í¦P(RRR‡úðáÃ;wBBB`r|8zô(ƒ¡ÓéÙÙÙ &55õòåË|Õ —qAgòùóç’’’ÂDDDøÛx<6#4|Øóˆ 0àܹs;wî>~ß¾}§OŸvvv¶¶¶nšõ”ËåÖ×׋‹‹øðÁÝÝ]QQñÔ©S²²²€'Ož¬[·îìÙ³‚ˆ‹‹·>(|¼¾|ùÒÅÅ…ÃáèêêÚÙÙùõëWee¥‚‚‡Ãé*N{)//WRRúõë—‘‘Qee%…BINNÖÑÑÉÏÏŸ4i’¯¯¯––¬kš’’2yòd<ÿøñc•]»vY[[Óh4, ØðS^^ÞÓÓ“?Çóôô|ùòåºuëæÏŸ?jÔ("‘haaqøðaMMÍââb‹Åårét:Nov’555YíÒHL(++ïÞ½{÷îÝQQQçÏŸ á/¥ëV ëþýû§Nº}ûvhh¨¨¨(?S‹Åb±Xjjj >)ÛÜ€Û0ZƒÁhjj>xð ##ãðáÃ=:{öìåË—W¬X!„K㫈ðx¼6UK‡‡àÿžgÍšõñãÇI“&Ñh´3gÎøùùuÝu´tca±ØÇ‡‡‡‡‡‡7j@¡PøºGRRn,--mmm=<<¼½½ïܹaoookkÛÉ)™˜˜‰Ä¸¸8›¡C‡ª©©íß¿¿¬¬L^^ðüùó3gÎ|øðALLLWW×ÞÞ¾aFÐëׯ_»v­  €Ëå8POOÏÍÍÍÐÐðÓ§O€)S¦¤¥¥‘ÉdKKËí۷ïÇ»téÒ7JJJTTTììì`Ù“™3gêëë¿~ýšÁ`hhh>|˜ÿšÔÒXmΰcðx<:Î`0˜Lf£}„ h¥¤¤Nœ8±ÿ~ÿ3gÎdeemذÁÕÕµ¥Ú] tc?þàÁƒÐ¿< ®[Áápü¦;÷Ãf Û4<¾ŽÊÈÈ?~ÜÁÁáØ±c¡¡¡aaaK—.]¾|¹®šÏË—/¹\.¼oðþÐp»áGA5C¤Q³’’‰ÛC7ÇÓÑÑyüøñ›7oŽ9òèÑ£ëׯ߹s&ÍÂeêë뫪ªîÛ·/''ÇÊÊJFF¦ÿþ8Çãp¸¦M÷ãp8ø†·üøQXXˆÇ㪪ª¾¾¾ÿý÷ß¾}û’““wìØáíí}àÀ5kÖðÃp™L&…Byûö­««+àäÉ“cÆŒÉÉÉ‘••år¹sæÌéׯŸ™™Y@@…Bá§l…[·n5܃Á`äääº<]~…ެ¬lnn®¼¼|}}}¿~ýòóó'L˜pãÆE‹ñÛÀûÔðáý¼¼`Å(Ð %$$Ør8×Ô¤Ÿ˜˜ÿ ¥K—Þ¹s‡Ÿù›Çã1™L‹ÿmÈÆg̘1jÔ(6› ²›ÐìN6›ýæÍ›ÚÚÚ¦V÷ùóg¾s‡Åb 3²UYYYTT´ººšÃáð“,ñ)++ëdÿ‹-JNNþùóg]]]DDD';l¿~ýÐk†k ˜ØªáÇÚÚÚ/_¾ðMîaaa„æY*•ºyóæ]»vuïåý!"""!!0hÐ *•Êãñjþðû÷ﺺººººfãÀ$%%)Š›››¥¥åÓ§O=zýúuKKË®š[YYÙãÇ¥¤¤àɘ˜[[ÛQ£FYZZÖÖÖÆÆÆ¦¦¦>~ü˜B¡²³³>pàô®2ÄÉÉÉ¢²²RB‡N§{yyEEEV®\yüøñ¦ß[VÓ€êêꪪ*GGG<ÞYYYçÎ{ýú5lÁ`*++»$2®ÅÄÄN:¿ù>>>’’’Ó¦MÈÈÈLŸ>=22òîÝ»k֬̂‰D … B ®‘‘‰DŠŽŽ¶··‡âÆÖÖ6 `ãÆ¥¥¥!!!6lسg€Ëå®_¿ÞÛÛ{Ñ¢ES§N ¾r劎Ž@CCÃÁÁ¡¤¤dðàÁ­ŒÕú Û ÿåÞUH$‘Hlø/Ü€Àí¼¼¼¸¸8(t>}úäììüàÁAdeetttôôô:óG¯_¿:;;@“¡ŽŽNC[߆ÑìÎFÀý°Y³Æ.—›žžþèÑ#øK,++óööæ/fÔÓÓ³²²Z¿~½®2mÚ´1cÆ4µ?55SAKUKf*~3ggçÕ«W8¶/++sssƒ?±´´´ƒ>~ü ..¾jÕ*KKK!$€¨®®vuu}ùò%ƒ±°°X¸p!>R¡»ÑF³û!ðã“'O4559NFFFjj*:,ëêÕ«žžžL&377'‘HOžÀò*•êèè¸xñb</ä¨äþýû7 ZïZàïñãÇðåoÀ€«V­ZýÔ¼¼¼}ûö}ûöL&Ÿ>^EE€ HBB‚˜˜XÃT¢ÍÒÒX­Ï°]`0III˜òUp  {òä ǯY³fÏž=xåèt:ÝÃÃ#&&°jÕ*OOOá|«¡y#,, €Á` wíÚ¥©©)„¡…|«,))_3 ‹µk×¶TÒ±ËAäæÍ›~~~GSSÓËËkÀ€]> ôÕž={~ÔÐÐØ»wï²e˰X¬½½ý©S§ôõõÓÓÓ544>}úÔ¿ÿVTDJJª¸¸8**ÊÒÒR__ÿþýû\.ZȺ|òÒY¡“šš:qâÄQ£F9r$**jß¾}Ð.íëë»}ûöéÓ§[XX<þ¼M·qãFhô&®®®ŠŠŠ‚”——WVV4Ö„SÂZttuuáÆ¸qãÖ¯_?}útaþ¹«ÜÝݹí:t`©¨¨8::š™™õI‰ÁãñRRR¶¶¶ÖÖÖí}˜uAÜU­…`øðá7n\±bE×Î?22šâ¯_¿îäätüøñ+Vlß¾}Ù²e¶¶¶óçÏ×ÕÕÅãñ¹¹¹ïÞ½³±±Ù¸q#ø_{wóö?üÌhѾiÑžÜV¥ÈÚ•-ÝB7ÜoeWù ¢)­”JÚhDh‘$ÚÈVåJÜîÅÅ¥RÊRDÝöešßçó{?æƒIëÌ4½žM§÷œ÷yϼç=¯9¯ó>¡k×®EDDääähjj¶··—•• 3vs>yòäßÿÍÍÍ]³f Ÿººú¢E‹"##ïß¿?nܸ»wï>~üØÃ×—÷Æ¡ãǯZµjìØ±8tÀ·§õ°¯ž[È8° ‘H‹/Þµk zSŒé**•Êl­å¡€2™ü믿R(]]]–íšõð5ŸŸŸßÚÚzÆ ƒ~îcºjíÚµÎÎÎC4¥1(mÚ´i>>>‹/&¾é´µµ³²²–,YòåË:ÞûiòòòeeeiiiÛ¶mÓÕÕ-..ô!ƽ×ÿîÁƒ†††ãÇ÷÷÷ONNvvvÆýê8KURRrèÐ!ŸG¿yó†qÎÀo-X° ­­ÍÞÞžâÓÖÖ6zôhiiiÜÂ÷üÆwuu™˜˜lذÁÐÐÅ øaºjPÈÊÊ&$$,Y²„ëׇ×ÖÖ~þü9ËUX/ÓU=kll\°`ÎR Eœ}àÀÜ9îÜ9''§)S¦XYYá.úÇóóó=z4##ƒL&+((,X°€HH;VFF¦¸¸¸¨¨HXXØÈȈB¡0†q–––×®]£ÑhëÖ­Û¹s'.ŒŒŒÔÐÐÈÌ̼sçθqãBCCqOÕŸþ‰JNN–‘‘155ÅóEeddà@‡Ù¾ð-cÌZÈüüü3gÎ Š®Ö°>]ňD"-_¾ÜÍÍ ÷Ìq7^^^'_†"]ÅLWW×ܹs}||ð@=NwppÀcz~Øíú- »wï>|XNNîðáÃQQQƒ×ä>ëO ƒ‡)++ûúú9rÄÖÖö¯¿þ’’’ÊÎÎ^´hÞfâĉ7oÞÜ»w/•Jµ²²:uêTKK žJˆ™¯ú]Y™\øJww÷¢E‹Ö­[Ç–O2 ÒUø9°þ—Ä@ÒUŒŒñ`Û!rýúõ¯J""""""ðcsssssóï>ÑÊʪç©b\\\ÂÃÿ*äááÙ²eË–-[¾*ÏÏÏgüó«ÕåzØW-d###Ï9Ä®t£Õ«W÷o¸÷p$''çííÍÊ=²&]ňB¡àɾjFkk«  `ggg¿Ï±)S¦äææúùù±}Jɾ:%%%ºººcÇŽõôôŒ‰‰ÁSãù‹¥¤¤ˆ(›={ö¹sç\\\dddLLLÒÓÓ544h4ë—tè«ÔÔT–%Ú± ]†ÚÀÓUŒØ˜ÕîŸììl|ìqqq+W®dÍDSìÂâ ƒé*F\ßÌF,KW1"¦'fD"‘æÎ{æÌ™šššü$ƽD¬¼÷»zû"âUÚ¥¤¤(ÊÑ£GNŸ>½xñ⺺::Îlè̲eË:;;mmmÇŒcjjŠ§Ð¾|ù2¾;Žc±%ÊaMº ©AIW kD.ìÌ™3ÚÚÚÜè°{ÓU€X™®ê2~üx99¹ÎÀÎÃÃsëÖ­¶¶¶9sæôþ~ÆA×Û@§¥¥¥­­MAAATT400OÉÚÙÙùÃ.^^^]Åzèâ»áñ]gýÞ™€€@BB‚¯¯ï¶mÛðúçý®j˜‚t€t ®âz#$]Åz›ºúïÖë^«ªª²´´4665j¯¬ÄLll,¤«†»Ó§O×ÔÔ HWAõêÕ«øøxHWq±†††;vüñÇ®b=–¾ÐJJJ]]] Ü”ºjhhxûömÏÛÐéôãÇCºŠc577K|×ÇB555®½G§Ó;::zØ€F£!„’’’B®¦:;;ñ Ðß…ßb¼Î ¤«Ø‚Õ%Wư))))))?Ü ÒUœ¬­­-33ó‡›Aº ôIyyy/¿Õ ]5|õr¾HW± †¬$..®¨¨Ø›-•••÷íÛ'..>ÔM}%""òíò“ßE&“W¯^ÍiÁzWWW]]»[1¼uuu z$‰ŸŸ¿7[ DFF.[¶lÐÛ†//o/›®\¹ÒÅÅeŽÙàœuÉvÖ®]ËÝ ùvuu=zôhHwQ[[;¤õÿ€€ÀÆÙÛ†~ãåå­ªªZ¸p!»2ì züª­­ýáÇÁ­pšßÿÝM?èICC FádFFF/_¾dw+ø>|øt$=cû$0Œ@ ¾‡‡‡•ɸF.€stvv>þœÝ­à¿ Ðß'!!qíÚ5v·0œ(((±lw0°ô:Ÿ®®.»[Àÿ€Ù\Àµ Ðׂ@\ p-¦ƒ‘}||òòòŒI$F ae˾èçç×'Òéô´´´Ó§OWUUIHHŒ3æ§Ÿ~ ôö^yyùÆsss¿]óK__ŸïÞ½{,hF``à7¦M›†ße???aaaì·áááîîî¯G__¿ªª ?œ5kÖþýûååå^ó@”••YZZ>~ü¸—³©N6BÎ1¼J€!ÅßþÄ4Ð ¦ÑhûöíC}øð!22Òßߟuíúžæææþ=ñСCÞÞÞ&L(--Ý»w/Ûß¶ºººOŸ>µµµ}èøûû³lšp??¿îîîÝ»w#„jkk:äééÉš]3ÓÒÒ2(õ¸¸¸P(”ØØXAAÁÚÚÚƒ®]»6//oP*ï·ÚÚÚÚÚÚÖÖVt¸À9Ç8ð*†~ûP¯n/—““#¾~ZZZ‚‚‚š››ñЬø_!!!oß¾¥Ó颢¢ÏŸ?×ÔÔ”’’ú믿ÒÓÓ[ZZ¼¼¼Þ¿ŸžžÞs=gÏžååå¥ÑhÇŽÃÛ{xxäçç755!„Èdr`` ˜˜XoßØØ˜””´wï^333„¢¢âçÏŸkjjBõõõááá7nÜàçç_ºtéæÍ›yyyùå—÷ïß›šš‰‰‰yzzΟ?!Ĭ¼»»ûĉééé?~TRR²¶¶^µjÞ5®ÿ÷ßoii‘••mkk»p႘˜˜••ÕëׯBÆÆÆ!eeåË—/#„Z[[MMMùøø¬¬¬ˆCè¹………d2ùòåË‹/îÍ ÂŒŒŒLkk+~ÜÚÚÞÒÒ‚ßb•®¼{÷ŽN§‹ˆˆ¼|ùrüøñ’’’ÿýwbbbkkk@@@MMMbbbÏõ^¼x¿ËÀÛïÞ½ûæÍ›Ä»ìãã#**Ú¿ÃÁënš™™áód̘1«W¯nooçåå=xðàñãÇkjjTUUׯ_ïè舟RWWçææ–››+**:eÊ”ììl))©cÇŽÙØØtuuUTTÄÆÆ†„„ÐéôŠŠ fõ „Ž9]WW§¯¯_SSsïÞ=>>¾©S§¾xñ!¤ªªŠ7nÜýû÷ûwt€ŒÀs¬7W‰ï~º^¾|©©©Y__?jÔ(999WWW‰„«¢R©ÕÕÕ!EEE\ôðáC~~þ††'''CCCfõ÷О~€$¡7ßþßýÖöôô,++ÓÑÑùòå˨Q£ÆŽëééI¼ãaaaoÞ¼A)++{xxàB__ß{÷î)))=º¾¾ÞÅÅOZË,*è!ùJ¯ÌÌLbéʃR(III„P]]]``àþýûB‰‰‰FFF^^^¡«W¯;w-BHPPJ¥2þ`VOFFFLL ~9âââˆíÃÂÂ<==qŒÙ'¯_¿îèè˜2e QB¬i°}ûöššww÷–––˜˜˜––OOOGGGÿ?ܼys×®]sçÎ%“ÉÌÊ©TjNNÎòåË¥¤¤*++£££Éd²­­-BÈÙÙ¹««+::ZHH(===##£±±QLL,44ôÖ­[ÑÑÑ!!!222¸=•••Œ‡Ðs;W¬XQPP°uëÖ… ’Éýtuá¢×ýرcÛ¶mÃ'ÍçÏŸÃÃÃñ‡<%%ÅÀÀ`ûöí¡üüüâââääd„P@@nÿ¾}ûðãžë9þ|dd$~—“’’ˆíðoÇAñï¿ÿâåºÂÂÂÔÔÔøùùýýý322Ö¯_/--]^^H&“7mÚ„²³³+))Y¿~}CCCjj*BhÇŽ?ÿü³>¨5kÖÉä   „О={˜ÕSRRâíííî¡‘˜˜X]]ÝÑÑÁÇÇ———„û`®3î0¢Î±Þ\%¾ûéÞ½{·……źuëæÍ›‡ÊÏÏOOO_±bBèÌ™3ººº8¾¹~ýzjj*¾DûúúÚÛÛ»¹¹)++wvvîܹ:Ì®ÌÚÓ ôæÛÿ»ßÚûöí›5k–‰‰ îb¸zõê©S§ìííBIIIzzz8¾¹råÊÉ“'W¯^ Z¶l™ªªjgg§³³3t˜EÌÚó­žׯ_»ººþóÏ?³gÏ&¾{._¾Ì¸R]uu5N'‘HOŸ>]·n.477ÏÊÊêùåcVÏÒ¥Kíì줥¥µµµñ 4@!"d<ºû÷ïãÏBˆ——7<<ÜÃÃCII !D¥R%%%ÇŒ“““ÓÒÒ",,̬üìÙ³ÿþûott4QsNNŽ­­í«W¯>|xþüùqãÆ!„(Šˆˆ¾îhii566"„LLL¾úü̘1ã«kÓÛùàÁƒW¯^ݹs§©©©ý•••^^^%%%ÆÆÆ;wîÄ…W¯^Å^îÂ!‘HeeeDÕüùóqGT˜Õ³xñb‡1cÆhhhà ßÑ××ÇÆŽ›––†JJJª¯¯Ç_$XFFƦM›ž={V\\œššúË/¿ „TUUƒƒƒW­ZÅÏÏO,…!##3mÚ4ü˜Y=x_rrr™™™†††ø³ƒÇ4èéé544 †>ÀFÂ9Ö§«³O·––ñçüùó‰_DOž}û3ûÖÖÑÑ!þ477'z:=zDD$DBHCCwF2¾ãÌêgÖžo§§@GMMmß¾}¸ÿ ¾¾wŽ7.**ª‡gõ³zÌÌÌÌÌÌššš?~œ ¢¢‚?Øý¦¬¬L&“‹ŠŠ¾Êìttt „øùùñŸ4N§ã?£f¢ð»åt:}Ö¬YŒk˜ "„ÚÚÚBD‹€€€««k?Úß¿vöžŠŠÊîÝ»[[[ýýý𹥪ªÒھ¬žyóæÍ›7¯¹¹¹´´499YIIiÍš5ßÝ·RSSyyy:TTTTQQ¡§§G§Ó,XàììLl#$$„jooGá¨!¤¦¦ÖsÍÌêA=}úôÈ‘#---/^¼ÈÎÎÎÉÉ%޹ØH8Çút•`öéþ꨻»»aVÿ`]µp÷'"##<Ä, ЧofßÚƒõŽ3«¿÷ÑÈ3‚‚‚8¡€ÿTQQùîh;bi¤«W¯¾zõ ?îêêÂÞ¼ySQQAlϬž°°0„°°ðŒ3|}}Ÿ>}Jü Ýè+iié•+Wìß¿?//ïÒ¥K®®® ECCCSSÓÕÕõܹsÉÉÉ¡¡¡ .5jœïÝ»G§Óñ-eee!fåK–,¹}ûvAAAMMÍýû÷ÃÃÃ=ŠÒÒÒRVV¦P(™™™×¯_OIIY¼xqNNnîzIMM=w““‰‰ÉÇËËËoܸñçŸvwwuww÷¦x˜vIII?^L@@ÀËË+44ÿ©¤¤TPPðífššš7nÜÀóóóqû\]]3¯=×C¥RBBBBS¦Lqwwǯ$Ö¿wù[xMÁ¦¦& ÌÌLkkk‡‚‚‚U«Våççggg¿{÷îÎ;ÞÞÞø¨õôô´µµW­Z•œœCülE=!”‘‘qâÄ ü󺢢‚Y=!GGG{{û²²2yyyYYÙ§OŸâo8„¾^ÄÇÇŸFFFëÖ­ ÷÷÷ÎÊÊSWWÇÝnk׮ݷoßÅ‹I$’ŠŠ Ñ;}útGGG^^^~~þúúú·oß*(( „˜ÕSYY¹sçÎööv‰ÔÙÙÉx§±……ŦM›DEEµ´´ˆî¾¢P( çÎ;sæÌèÑ£§NºeˉÎÇÇgii‰“Ä !ww÷ÌÌÌ””„··wnn.³ò;v ž?>55U\\\GG‡ÿ£FŠ‹‹ ß¿KK‹””Ô¬Y³fÍš…›¤©©¹fÍšÄÄD¦££³}ûö1cÆØÛÛ¿{÷oàêêÊÏÏŸ••¥¨¨Øs;ÝÜÜpÀáèèøøñã^¾&X``àÍ›7ƒƒƒñÀ=CCÃ-[¶ìÙ³ÇÓÓ322òòåË‚‚‚¢¢¢jjjÖÖÖ¡•+WFEE]¹r…D")))á”9BÈÈÈhûöí<<>žè›0aÂÖ­[©T*F300`φrŽõõ*ÁìÓmhhøäÉü §¨¨H”ÛØØP©ÔÜÜ\‰ÄXîïï_XXX\\<}úôàààÂÂBܵÀ¬~fíé+yyùžèë·?³om##£G]¼x!¤¬¬L”¯^½:,,,;;›D"1–ïܹÿÂÿùçŸýüü ¾|ù"!!Á¬~fíù !äàà@ c,ý8<ˆfÏžmmm={öl6¶5òóó Nž<Éú]îÀaŽRTTdiiYQQƒiÀiçØ°¸\L:5"""#####ÃÖÖv„ íííùùù<<<áááË—/omm]¿~}ssó±cÇæÌ™”žžD¥RçÌ™“••…ûi&OžÌ¬<<<<%%ÅÖÖVWW·ººº  @VV6::šFL©Œv'IDAT£YYY=ÚÆÆF\\¼¦¦æÌ™3ÿùÏ.\ˆzþü¹µµõ¶mÛ¤¤¤òòòJKKÏž=ÛØØXYYYSSÁÇÇ7sæL‰ôÃvZ[[—••ݼyÓÄÄdè^L¶‡‰D‚ÕËøÚýû÷‹‹‹Býõׂ ØÝÀ…àãdÜÈÌÌ|ûö-BÈÞÞ¾²²’å¯. ~Îëׯ%:,#íÃÓ+OŸ>ÝÉÉ ßHÅ™pÎljw[·n¥P(=Üu5pxzåŸþÙÅÅßHÅ.CÒ££¦¦FÌà¸•ŠŠÊÞ½{ÙÝŠ¡ÒסNôÕH;Çüüüú·€¦‚ƒƒÙ;Å"#XÔ\ p-tÀµ Ðׂ@\‹¥•JÅËÕ‚âèÑ£ëׯgw+Ã\1FÖGL]»vM™2/æâãã3eÊ”—/_pg...Ãn~sss}C13Pyyù¼yóð*ëœ&))iÞ¼y^^^žžžNNNŒKõ†“““ŠŠÊµ­ßôõõ%ìØ±cÐwQVV¦©©‰çb#GJJŠ‘‘‘œœÜüùó‹ŠŠ~¸ý`'œs¾qåc$ãŽH€é<:{öìéèèÐÔÔDÓh´ñãdz°aœ"$$äîÝ»‡ úá‚sýPWW÷éÓ§¶¶6ÆUH8Äš5k***ðÄí~~~œ0¥÷ÅÆÆÇÆÆ Oœ8qÐwQ[[[[[ÛÚÚÊÇÇ7è•΋׈ž2eÊ… –-[vþüù™3göð”Á:O8ç|ãÊ+ÆHÆ‘@Ÿ' lii jnn¦Ñh!¼èþWlllII ‰DjkkÛ°a±Ì}XXXUUŸ®®îëñð𨨨 ·°°˜?>B¨  àìÙ³¼¼¼4­££cÐçbÆÐÐ/fkbb"""‚ ùå—÷ïß›šš‰‰‰yzzâFΟ?ÿãÇ“'O~öìY{{»ŠŠÊš5k–,Yr÷î]vûöíÓ§OÇÄÄÐéôÛ·o‹ˆˆXYYá%9BÊÊÊ—/_fÍ¡õÕçÏŸ…„„K¨T*žÝUQQÏ2N”¿}û–OKK‹(\¾|¹ˆˆHdd¤¸¸ø®]»nÞ¼yþüyâäa¥éÓ§ã÷ÔÌÌŒXfÏTkiiyýúu ‰ÐÐP¼¤Ÿ¶¶ö‡fΜùÏ?ÿ´··«««oݺuÕªUEEEK—.íêꪨ¨ˆ ¡ÓéxÝ¢©S§¾xñ!„ç7nÜýû÷Y˜€•ÚÛÛ====<<BË–-³··ß½{÷îÝ»ûtžpÓùÆ5WŒÞ8þ|||ü‡444¶oßN|ý1S^^¾qãÆÜÜÜþ¾¬zújxE=:¯_¿&VO}ÿþ=~pðàA …"))‰ª«« Ü¿?þ—ƒƒñ\777|xÉÉÉøÃõêÕŒŒŒžë [¶lYddäˆÀ!”‘‘C"‘Bqqq½9¶¡ãèèèïïÿñãÇ€€€›7oîÚµkîܹd2ÙÁÁ!88øùóç6lPTT|ôèQ@@ÀçÏŸW­ZµmÛ¶¨¨(„Ðo¿ýF&“£££qU¡¡¡·nÝŠŽŽ ‘‘aë‘}Gee¥——WGGGaaall,Q~æÌ]]]|µº~ýzjj*^±%--MOO—çççŸ?oðàÁäädqqq„™™ÙÌ™39êšåîîîââòáÇèèè«W¯nݺuáÂ…d2™B¡P(”'Ožlß¾]UUõîÝ»®®®?~ܼy³^zÍš5d2™Hk&$$äååÅÆÆ ÊÉɱõÈ+”––655­\¹’(±µµµ³³300èÓyÂçÛ¹b0:}úthhèÊ•+'Nœ˜——çèè7yòäž2Xù,HpA$ÐS £¦¦Fô:zzzâ—/_þðá±Muu5N'‘HÝÝÝGŽyúô)N'V+--µ··ÇÍÍͳ²²z®!¤ªªJ¼d„¥K—ÚÙÙIKKkkk›™™õòð†ˆ’’BˆJ¥JJJŽ3&''§¥¥EXXxܸq¡ððpÜ=cnn.%%»víZ===üÜ1cÆUiii566¢ÿí1â(***¸#º££cÇŽ{öìÁ'å“'Oˆ¾MMM‰u‰Ÿ={F 4›?>ÑA%''W__ßÞÞÎÏÏ_XXˆÏxÎß»””iiiYYÙÌÌ̦¦&QQQÜg{üøqü{bÙ²e222ÎÎÎFFFø¹222Ó¦M#ªÒÓÓkhh@ÿÛcF&~~þ>'\p¾+¡½½=::zóæÍNNN!ssóíÛ·ïß¿ßÕÕµOù›à‚H Ï©«qãÆáž‰¯Ï™3gË–-øOâåèk=¡ï¦™ÍÌÌÌÌÌššš?~œ ¢¢²iÓ¦>¶}1FÐt:xÌx­‘èèèèîîfiˆß²eËþüóO ‹þÕ°|ùòŒŒ kkkAAAžÁ_gmàÏ=Æ÷”ñ§¤¤¤dGGîhÓÑÑ>}ú4ñ}œ––6yòäþýÎæŽóm$\1B/_¾lnn¶²²"J~ýõWWWW>u䯄ÀðŠú|ꨨ¨äåå}IÕÖÖâ !TZZŠÃL„ŽŽÎµk×,X€ºzõê³gÏz®‡™°°0aaá3fz{{÷µåýóàÁƒ „ ñ`dYYY|t÷îÝ›3gNUUB¨¬¬Œè¨Ü²e˺uëJJJRRRlllxxxFÊÎÎæáá¹téB¨ººmE¥¦¦JIIååå•––²æèúêÉ“'Ä[¦§§wýúuSSS„PAA1L[KKëÆsçÎEåçç—••OŸ8qâ©S§ÄÄÄððv).....FåååáÁÈòòò¸·oß¶°°ÀïoII 1’tÅŠÛ¶mSQQyøðáÑ£G7nÜÈËË‹ßÓŒŒ žÔÔT„PEEÚŒûÛãã㥥¥/\¸ððáÃW¯^±ép+ðóóûùùyyyÕ××]ºt)''gaútž„……!.:߸ãŠÑ?üüü}êÈ^ á 0 t<<$$äâÅ‹$INNNFFæàÁƒÎÎÎÌêÁûÅAIIÉ]»váöTVVîܹ³½½D"uvvº»»÷òu ;wâŽ5///„µµµŸŸ_BBBÈÝÝ=333%%!äíí››‹ŸòóÏ?'''þüYUUÕÍÍ ÷ÊêêêZZZFDDÐh4YYY„Prr2^\SSsÍš5‰‰‰4MGGgûöí¬9´ÞHJJºyó&>öÎÎN555b´  •JÍÍÍ%‘HŠŠŠÎÎθ|ÅŠ¸rå ‰D’•••––>v옣£#þïìÙ³/_¾liiÉ–ÃÁ6nÜøöí[ôÿsÉëÖ­Û¿ÿBëׯ¿uëÖÑ£GBŽŽŽÄÓ¦¦¦111uuuêêê6l@Mš4ÉÆÆÆ××—F£ÉËË#„bbbðภ&lݺ•J¥Òh4<´p7AAÁ¨¨¨„„]]ݬ¬,|ÅïÓy‚”ßó+¯=?~¼Ð… pê !téÒ¥ &ô¯ ŠÓÜ B,»‰‰efÏžmmm={ölVîôîÝ»6lÀÙS–í4??¿  àäÉ“,Ûã@TUUâSyX(**²´´Ä··°»-€ûÁùö_1¦NÑ×Y^NŸ>¶råJ}}ýëׯçççÇÅÅ=~üxÕªUÞÞÞ¸#ÿÁƒiii¸+ëùóçÖÖÖÛ¶m#:ò½¼¼vîÜ)!!Á˜°¶¶öððèS=½Ilݺ•B¡prø8ˆH$‡f=‡©òòr„Paa¡²²2ÑÙ¥§§¿{†}úÔÖÖ÷²—‹‹ …B‰D={ö,((ˆø/•Jýj199¹S§NÝ¿?88ø«ªjkkkkk[[[Gònà[pŽÐ'l‰X×£SSSò}õ^9ÖÐÐp„ qqq¿þúëĉ[[[ýýý·'‘Hxõԯ걲²Â+ðëëëãEw»»»?nnn>yòä%K–àu@±ÈÈHÜ-téÒ¥¥K—Μ9¯KŒ:uꔩ©éäÉ“íììÌÍÍ¡‹¨¯455BÓ§OŸ4iRdd¤­­í”)S„„„ZZZTUU]\\vìØÁ¸=‰Dš;wîôéÓ¿ªgêÔ©x QUUU ¼L}wwwTT”¾¾¾¬¬ì´iÓç÷óóÃ?ÙÓÒÒ¦OŸ®¬¬ÿuäÈYYÙ èëëÃÏ÷áα ’ýÖHæÑùæææ!aaaYYÙääd„€€@DDDeeeDDDoj ½uëVtt4îÂkS©ÔœœœåË—KIIUVVFGG“Éd[[[„¨¨htt´ÏâÅ‹¯\¹bccSVVæè訦¦–‘‘ñþýûŽŽè"ê}}}„¨¨¨¼¼<ž©‚‡‡'11ñÕ«W¾¾¾½©!!!!///((ÿpÇɈ={öddd¬_¿^ZZº¼¼<00L&oÚ´ !´yófqqñ   ''§åË—›ššž={vãÆ%%%ÞÞÞîî‰ÕÕÕðó À96A`ò@Ç××·©© !tûömWWW>>¾ÐÐP‰4ÔûíŸèèè®®®={ö0Θ1ã«D{´´´p´nbbB,YröìÙÿý—ñc““ƒYYY„…BY½z5±ŒŒŒ´´tNNŽ®®î´iÓ\\\„„„vp#TjjjggçW¥sçÎUTTìe zzzx8…™™±¦tRRR}}=cž"## ÉËËO›6 !´eËbƒ±cÇÊÉÉeffΞ={÷îÝÂÂÂ;8Ààˆ$‹‹KTTTaa!N˜šš666òññYYYÛã$ÀW©L„••ÕëׯBÆÆÆ!eeåË—/wwwŸ8q"==ýãÇJJJÖÖÖÄúí‘‘‘III¡àààãÇ×ÔÔ8;;ÛØØ „N:uâĉ/_¾hkkúôéÒ¥Kœ9±7ò@‡ø”zzzîÛ·o¨w7@“&Mùé§Ÿ·Z:>kÖ¬µk×%8£ÏhéÒ¥Œ¾|ù288¸µµµ¢¢¢  àÆiiiƒÛªbúôébbb:::ƒ[-N_°`³³3Qòm$jggÇøçÓ§O9ÒÒÒòâÅ‹ìì윜œßÿ}p[Øα ’½ÄÞHRWÿE,¨& //ÏX^YYYSSÓÝÝ]PPÀÇÇ7sæL2™üêÕ«7oÞ¼xñ?K\\|ÆŒd2!$**ŠJMM•’’ÊËË+--566ÎËËSVVÖÕÕ­®®.((••Å>^RRrâĉ8§€Z»vmuu5±k;;;|Á?~|SSÓÑ£G?}ú¤®®ïépçØI€¾bK$@B9880Žçç³g϶¶¶ž={6»2äòóó Nž<Éî†Àð6uêÔˆˆ55µn™––F F–——×ÒÒÂåD ,,,""âÛ$À¡C‡BBB“ÏŸ?·¶¶Þ¶m‘˜>}z^^ž­­íw“wîÜÁ•0&ÌÌ̈$Àõë× ïܹÃ,Ìݺu+…BÁ7úq=‰©+ o 0Œ@ ôÍÕ«W¥ssssssc,Ù²e ãýt„ÜÜÜïÖ×Cý#,®¸:àZè€kÁ`dnð×_Ṥôqcà&è {úúú½\8@-Z$++ËîV€Aƶ@‡J¥Þ¹s‡3§n^¤¥¥G¼ˆ¸ k"þ:qqq±±±ÆÆÆt:ýË—/&LèýÓ]\\ð¬GކE$Ðÿ@gÓ¦M¯^½ÂËvvvR(¼ì F‚a NêêÓ§OÂÂÂŒ%aaaxí:eeeÆòªª*>>>]]]¢pÑ¢E"""GŽ‘pwwÏÏÏ¿~ýº¤¤ä ´ Cc#:¯_¿vuuíèèÈÏÏOII!Ê“’’ôôôðQ]¹råäÉ“x5ùääd\~õêÕŒŒ ¼}\\\BB‚„„BhÑ¢E&&&åœó#Í££¦¦óøñ㘘˜ºº:\þèÑ# üØÂÂâÉ“'øqii©™™~lnn®¬¬ŒËËËùò¥­­ !TPP@<œŒó#Á™0ÏÆÆæöíÛý®ÁÎÎîôéÓíííBBB<µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸÊªú,TõSñ}U¥«syÐÖ“4F c•æÔUÊ J ‚Tz˜ÌÙRWekÊ+º/pl¬©û~SÅÛuÅqË‹ùlYÔ”È=PWRW¤4Ÿ­ªÒû‡ŸGç“éŒ\.&TQ|;:\®®¨"à÷_^âCùÓ7ïçÓñí’§˜{ÈðX ÐÓIÜ•Ä'Icr›pP[)e7B£éälv^T™Åìòüiw¯²¦ù}2+ª`¤sÚ‘ÒøÅ©@_œÒÚsÂR‚K±¸åã> e'Û&‰ŸÎg³ãb6NµâóA mQxN/6?OUUÛ“,Ùøx´XÌ¿m^øFV¡ã•§Åììá½ßÜÝùÛî7$µ6ZR$á@DYÞÛi®røuŒ Uj5§D>{txóãÍÄš_Vë_FüÎ/ëûUv©'èœïD8š©Ý„¾Dá" xÃep*Áš®ŽêجôàU ~À ¯ 65Ù<Œ¹ûËr[0Ð9ÑJ£Ðëx-ô†ZŒ>á@Tf¨‘¢Ô1á@ÔÌ0PËfÅR4 UïjªÒË0ðʬPk ðjr÷$-”[ï;n_Í"ìdØ{•4-û!X¡mR·&ײY±?—,ízdÌšüº4Ùt°ëM¼ûËÐ7 Ô… ;烡²¦LSÐØ¡£"ܶ'jÛŒ~øñEüuvq¹:øu2]ám½±A)b}³ žhá]¡Ì!BÖ“†îyl0à.»pk¡ðñ¾ ÉÅÿ^ËÕÁß/WGvƒ#’™„H sž6BóB‰Fd %ÚŠ˜šøØý9 <ø­ñ¾ü×Áûùøj÷X² %/Eî‰eÆVéÞL )$gDŒ¼iJÔ8«¤d ÀPQЗ&JëÜ¡])Ù×ÙºÔ kFV”éœ ©©'î ‚5;9$"FXKéßÿÞ«8Jv€vgºTÈhÆÎŒ+è£ ›²Ê ‚PAiÃX‘1%µN©2Jªž­ÛvFk~2SÇg}­=.5­kí{9™yÒÑÂõé€ßMÒô‘üÒ)*‡‘ÆoòŸ²6R=LŒv¨¬°Þ¥:%åÏý«f³b)~0p.-µNïB{Ûƒp(Kµ‹ü¢‘PJy (/ÔzO„Q4<¿hT1Y™šƒ–î·`¸RQyÓ­Pš·ò)¡Ýô¨‡eQ])øS«Ù¬/¿Å•jß6/%w´{ù> © =5°”ÙŽRt"$ƒ+ÅÐz­´5[°£ªØ¬C\¸w6”Ù‘†>¤P¡™‹„TV3›óNiêºmôk4Ô‰²³n bXÉg½ÒÊ}“ø#9Œ}È¡F“Z)ƒôÌr¬K”dk8ê\*uÛ1O’ÃJ>jt÷ínäPË>äÐNÈ-à!"’D‚CoðPn +ù¬—C¹‡xv$‡Ý ƒpמ¼t¬^J GA§Ø†!)T–:¤{=S—ÕõLÒB‚‘{ìÁjèÁƒ5u×¥›fx=Xm•X–Vn•€ß#Ù`÷jÙ¬íB¼wÛ¤c†§šÓEÝù€\GoÌ€ª‹œäŒ¯]S¡#Râ6äð ¤ìÚSÞæQãoŸ>}<ü½øZL_cB{ë†ZI| ‰òÙ$jÓƒ…“Ø´ˆš÷ 1Åâ èq•ñ/@‡ü{ù-œj.šü]ëÉO»ÛËôŽLíÎ'ExÛÓKªÅãÍÇCJƤîhd«!nbÑšTÏï­W̲XËhEfn²2¦¥Ê:•‹ 7Rel¼ûìņ-)¶‹f»Ý4ÐÝ'­øu—ž.E²ÍÂ7Ñ:¤>|Þ©!P§Ì²jØ)în@µ\V,¥Žó²cG„\5¼¯UÃõç P 0£@wÚýhÕ1—üa®Kþh:Üj{˜;Eëôñ}\m@‰ê@Œ4ùòÁ›úýŸ'ÓicOÏgÑ¥ø¡{•vz›QÞ3q*ƒ‘OºÓÉÅñ—ùbòÜÒFÓ™û<š.‹dÑV“Óˆôd‹uNìBñcîGÍtvL±²°1[b[³Ä61›bœÀa:gâH^Øx£~øpé_ûÒj¡ÄÜia"3~ô„&ËÓ9‚ÇLJͪà£sê·òqRÃæ¼P¢ žHI£`H^Oª£ÔfÉ:¨©6›¸ršŠ‰ÎXc|†s~šÁ;ŠlYíµQ.¶žøJ]¹Ïé‘]¹×ãÊ=ލÝ;J€p3†·–u4‚2P£{ê‚å¬,ÏÇhN íÈ]FÐŒ A_H0¬&=ÁtN›µÂʸ>¸oVÓH-:¶”ÒdRSRC‡ )A;Ó¨–ÏŽ"R‚BÎOx]ù ®CWs8ºš¸:)ÐT@ÜY"Lß g‹Ñ ýö D0=Œ.Çô€PÌuL J ) “ÂÉä¤*Ûé °É4áîL6;n >D¯ÖÒzZçå5›YÚ±Wjazf ëù¨O‚VÛCŸUP^4Ì}VÄ4Bý¬²Ïª³*A+hÖLŽ^˜ÌК¡5CëëÖîsö®ËCРSm«Ä›X)SM!¥¡¥ñz’ä”±Ž5"Ø“Z3´fh}!qÁÿž"õeehÐ÷ЯÒF :f+"oÇJk%c‘Ò¤°VEjÂMÛ"ĆÖjL6T'¢Œ–ÎY Zi¥œêi|”W!¶¥LfxóŽ7SDî!Pñ™ž[·ºwš»®DKA ÈÛ•>wéŠC>Àu¤+²Fºú`2Û ÙfÈ6Ã>Û MJ•L÷ž‰×t†õìÀ¢VR¢Í”ªSÓkDT­xK•za2—*åR¥Œ¨/;;Ãv®8ˆÔVC§T„FpRï×”›¡µR  åfhÃ=r¾ŽËÎp¥Ö>çf¼ªÜ ºôް»é c»7^µåÜ„N#TšÅa’ ©ñª³a 'Uš*c,ÿT™:>+{˜ýXÚzb 43Ðd½ûÐ|{zË,Ûåj´X=iºóµ·j·‰ök=aô€Žšû¥–òŠ+À‚¥Þ€Ö$¬Peå|àÇŠj>«û:C½ÁH•¡"CÅ‹€ ÝT¬÷Pî©S0Ñ‘æ D fXši|¾ÜRT²YÙîÔPTžæ @[s'CE†Šg¦¨€my àe9 GÑH&)¬²É õ°šy „A•³p¬ÉP‘¡âE@…Ý/¨ˆ.¦ém^•VXSZÚ<+¨ÐQ–cåd6+2V¼¬p}6ùƒѸ4ÉÓëdV(uŠ·× z Ê9¨m³‚2Pd xf@áû ØZ¨"õ. ¨ˆA é$D9 ÊV€š…*h–v P7U¶)2T¼ ¨{vÓèAb$¨° ËP{;‹§œDa¢Tô9Mô)2Rì):ò 6àRì—øã".ØǺ\|‚%h›­Ú —‹(éèsÄ|0›ée˜0®sÒ§òBê²È×°ÿSNÄ RÄ4g‡D8úT¥ØS8jج^i|rÂBô{3ñý:mQA‡–R›;žë{Ç«¯ u}d.†hiΩ² ï¦|š¨ªÀAÊ\THq`èðx+Hû`²I9õS©•J°‚¨YëëZÆNæ‹q±`Ø=ûà tŽ>ÍêELò¼ð¬ˆ’ÿç žcIÙµ§¼ÍÑÿMVyÂ8CÛÿZÌzóéUy×=ïΠCÝ€´Ùðz‚ZPzà„5š"TIF…—4­)_à½9~ܸ«c²r©l¾Ôàö‡ ù¶çèÏ£NÇml~‘½Nç©{Ô˜îégQx¥ ~íÆËÀjFF0ˆD RJ?óÑ£l¢"YV…©ã±r©k¾4F§ñó[Z·9Í*³m•±=ôî‰Ê“h½áÝde7 6@›Œö*eZè¶„ªLÕKƒii¼k0U,õ^Z*eÛ HV™­«Lçl$ÊÔˆýdd ƒÅ»Ë8Š|'sƤl¤ ¤%‘£.Aœ:SËduÚbó¥¸]&|.ëÌ3Ò™º@HI9(n@Õû Yõ=ýB  ¸ÖDÛ „üöéÓǃëA‰®N§E‹p„Eê$2‡Ez’÷óïUHÒ9gÇQÒkŒÔv@Ь“™eŒkJÊëÔ=õ9ÁØyÖi^½0Ùä˜À£Ýêøh,Héœ~]çÝZY†ÓâÄÄgÑÆ©åŒ=(§²d¬â¦kXÍbRN¹¦Dµ¤œ†¬Ê ¼‹žY9»3™•“Y9ǧôÜGå¬1Â}÷\²xŒ(ª“¬É"?(i@JÃ( Òk¶=åmá‡n²,~/¾ÓlƒsØàuùlp¹{¼ITcßÀŒàÄ’†Ö! ­ðüQãã|¹ú£×Þûî1#l‚Æ›÷óéø G…fÌ`Å è3ŒG Ý Öä¾k2VXGC"=$šmO‚· Ÿ£Ù2ƒ'hTH`Æ VÜÐ=à†Cï—úÊhf‹#QòÂ9¤”ÚÄ—”c{ÊÛ¿.>Íÿ±š/FgEÆN©–È %¬PÒÇ´jk©c8^A*”w5'b"Ü<¢çR,>ŽËb‘у=î aFVä°}!ø¥wÄÃ¥&ò0B'‚{öøåô´XfÇ…×àØ”¾Œ¬ˆáz²5 {´ƒ¨èì0£ÔÚ=ˆuür¹úRÌ2fp›&Ç:¶¾3ƒ²á¹ýGÙ·äŸhA9n/ü‚ŒÿdÄ`µ26…/+`„ÃSÎX^Àð”í”ÎSRŠU°{pš‚WËhÁ‰÷$/£+ZÄ^¢4Œ– {$·A”¨R5È1ÁUB¶¦¼Môøuòýò"ÃoH£J3†pbHèžD ɯDàW62"H†lëlþ ZÓÜ&v| ìàŒœ‰£ÕBø°ž/v¨°C‡„ùš<™ÉúpküXÓ{ ¿ÏÏ2xp‚G¥fôàluúh¦M©’Û(ÖÎ>T3î QR2RƒH©¬¡s|©ù{VóY¹ÔQyéežìÀÐùytšØhO,½ÓÄS)ö„Ý;æ¡Q¼']•`€%L4¾T¾²¬V1Й›Fëƒ%êø¬D‰àSoe uÈ ±3è2ÎMµ;Í­å–Æ9Ó$9iÓðÉžÙpq>Ù)>š„HN‡ÔÉ œ~Dªf³r)Í—I}Ó|ÈÃë2$í'$éA’í’¼öe²o_rD¤4LÓïƒ#Hò^¥–ÖóCR%›ÕˆdMÙŠRZȈ”i/Éì‘\ˆT(›®vÉû²lŠí«Uêæýl¤J.«I†t&µ22 í% Ù’ï¬ó)ñÍ8ÏH².$BZ%DrRÓé¦QmŸHÕ\V‡‘lùÁdÌ&RF¤=E$·#D }8mÆ'´Þò’¶±$d”ON[ŽÎÓ­òq N[›•ˆd-Eà£PÆe)#Ò~"’ß"ÅIz[Nðãx!I:";£MšÙ(•Jù£f¡íj>«Ç­ÑˆZjtȘ”1i/1Ií“b/‘ƒM¤‹šw榕tŠ…”ŒÔ4jB§0H½¨·0¹’ÏŠ¥NDéSš´9 cÒžbtŤòõttU,~>(_àŸ³Åèüçƒÿ/¸&Íummod_perl-2.0.9/docs/user/handlers/http_cycle_log.gif0000644€ÿÿÿÿ00010010000013360411727205031022700 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘Bo"oº:‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa'B___]]][[[YYYb¤3WWWUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôAAAòòò[˜/???ððð===îîîììì999êêêèèè555æææäää111âââààà*GÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%% ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®1¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢„ÞE   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvv#tttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷/NBBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠVR©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœSÙšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=r "ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî—iíA&Ì d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("5PX^gÂ@ðÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜L Óãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb*L¦þ¢¸Ì©´Öjë­™¦š£}úE±´àÂ)¯àÙŠ’ˆ™Š Z´°†˜.à*í´ÔVK§®Ã­ŠÙ§€D;dIà)CãŽé­µè¦«îºRbû¯Š}êBE@ä$2¸0%Dž€Œ+.ô’@¿ÿ<ðc˜ò ³´:$$.¸òÂ+° ™‚.d ‘£ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¢ÀÅ -{ó*3ìð粫óÎ<[ë®gð&öé IBâ‘P@$ù|A-E2í4ÔC–r‘ 2d¹Æ D¢|dÎ=dÒK7ýôÉGZµÖ_°Çò[õÕCf]$þÙ=÷í÷ß¹2º«¶—}C’±9‘çæÜ8‘Òdœ1,]±x‘à„­$߉yù;‰ò³_D.9åCîƒÊ&ô¹ä. Î8à´×n;¢?w4bò¾dçD~:γD’³()¶‘œ+^<èlÙ‚ñJÎ’†9Éyüæ·wïý÷ræÎÙî‡}J-éÐ݃;_Dâ ‘(MüüôŸ[ &Hj¢ ‘m\Bä aHßÜ?ùA~LB™·î—$€ Š(¾ Zð‚[ßfÈg_õ!k<ˆD Y¸@"ûÂ*°q/©Ò [øÂ~˜…+TñÉþ5pÁ*<@"=€-H)ä1$¸[ MˆB"ÍÐ…0dÒ²0–±YÝ0‡;ìa‘zð#áP‡<ôáœEHƒpŒ£¤AÌp°0¾š£÷ÈÇ>.ŠO@º™IÈBb°Ž—¹#aòhÈF:ò‘;C¤e9FBò’˜Ìä©$YJ Æ’š ¥(G©(NRÆ“å¥ AƒVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜Èì%=JeÊÉ 0ª´”œ¡ˆjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóð':ìEªfJæ™þ‰f¥$PƒaøóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢Í(Cµ@ÏQÙ32øô‹>)ÅOšô¤(M©JWÊÒ–ºô¥0­(G™)¸lõi[‚ UIcÊÓžúô§@ ªP‡ºÒ™Ö³¦ï"œeF:©õ©PªT§JÕª&Ô¨E*ДZ¦JÊ©V «XÇJÖ²šU¡XÕG!Ò¾x5R`=«\çJ׺ڵ¨U«VuÇUʼUQq½ëA/Šö°ˆMìXÓªµ>¦­|ùk¢;Œ~X#À5@àÏ Öøl:ûÙТb´ÃAhM S,ã ¢þí)¢RT(ö¶¸ÍíO *Ç:²{‘,¢(; üÓ¸þT…?‘‹\åw¹Çýg:FPäÖV·ØÍ®v5ÊÛÀÒS9q­kÝN@wð§yŸ‹Þèþ³Õ¨:€´Àþ 68›Z-ðw¾õ½o@m»ÝøÀWÍkc÷:¾¾NF¸‡"n>{ZZ7 >ï0"ðˆø”]ø§%ðáO\ÁŸÙ(Á?A,bÿ“ÀޱŒÜ]W1xƒ– „ 5^÷4Ã>þç„MpA(Ôº´3(Œ UHŸc…??P†.™ÂN(ŒgÌå.ß¶Æ—òmc€‹—ªÇòþ-ìPëžÂŸ¹(h+œ°Œ4Îݲ—÷Ì繂ÙRbV ™ïbfB¡™½k(ŒPëxŽ è,‰>Òy7MÖ?W*Љ´] =(ʂಙµ† ¾àÏ7€˜ý§«CëÔ†öÏHhlM[Xá­0Á((±€Öâýu°‡]ìaŒÒø¬”9MíjÕÓ”5bD]R ЏÖ·¸ÇQlOJÛ‡á6]¼(p“{ÓɨC$‘l€€7Žðî~ÿÓÜ’B·aÔ=vÊÝþž19$Q 2ènÁ%õ¯O¾ò—Ï|ÄÇ~ì³÷.§nZ¸Ü_j÷¼,9¾þẻ¥ñp@XQßüò›ÿü°ü¿£oãï²ÊTØÏ~]ÏÈ% áUÉþþûÿÿ€÷|Ç~aV{“t{b}ÒÔOò—]Ñ @Ï °È€˜Ë'€ëGSî‡SðÇ€ ¨[´` vr TÅØ‚.¨zèO‘‡;ØIØ+ ¸O"8‚·µßÀ iq^«°‚ø‚H˜„‚ƒÃ0ƒ‡2yƒQyqqywªW@ÚUØ XÚz»SexàOw@¾p$ ÃÀæ0 ×€ € ëS[I†~—" x€ àw 3;AÐj Ü  kð ÅH ~°UàÔàœ\ ¥[ƒ ü`Ä»¶Uà )€üpÄËÆU ÆdlÆþh¬Æ½Z h TP L«êàó`P³€|i¼ÆQ<ÅU|ÅY¼Åkp –Â~µÂ“ÕÂ. Us°œvöO±P®tqñp H`J€b^AË?õ¶’¨„ €œL{žü` <\¢<ÊCå ï5ÐqþäÖ@Žr1í°õl`@…˹ì‚s`  ºþ×ËÒ§µßX*yHÌ.õ Ö@˶ Pcà _PŠàOQ•å1œˆDü‹Ùü‚— ÇÀÏåÎíG»ïGÎÃlÎ>u¹ÚdõZ dëý  ðO@]E~Àý°Ïý<ÒÿGÐøË:þÌ–Ð ÍSt5€àÀB° d@0Pï =…Í$}Ôé'»?jÐ ˆÐ- UwÀ~PÕêàW€@`l𠯕PGªÔ°à^à~àžà ¾à ÞàþàNàOðØÒznÔ RÖZ>n}fp­Þu̲UéÐ 5ñ ðRÛðu.þâ0ã2>ãPwJÂLM›Níá1%Üñ0PEF†Plä<ÞSM(’ ”í–M'˜ä•)þÞPõÞ Pý TÎSK>(MþOÞQ>'Sþå å˜9`WÛp~ÒjîRa.(cîeÎg.'þi>ç5¹z°åPUj¨PAÍíç)Uçrç}‘çk±çqÒçŠNPÇ ¶ú UŒ0 U jk •®RŒ(ŽÎ®’'”êu É U ðd E ÞÍê&5êyRꥑá´á†Öáº~âÇ\Ûˆ¥¬PìÜUáwálìx$ì¥FìÌ^P&@ËTU±ÞPÞ ú0Ø×nQ¼Ž'¾Ž§ž©þ&«®ëaà­ì0UHp_ÝP)m>î2åì4í%í‹DíßfíúP1^>UÓ@ðþt1ìb'u ª0ñ_ññŸñ¿ñßñÿñ òŸ7ÞþÉ9ε;^ð µ| !†[ ©)Uíð 6ó8Ÿó:¿ó<ßó>ÿó@ôB?ôDóÜ@áåmSãL*íꈌU%2 QP0(U^ Þ\ox»=­½{é­òÕü€'FU- Å ðY¿õ]?÷÷õö 8öd_PŽiV5 zQNpÌXoRZO÷ˆ?Þ˜ôIuÞŸ¬÷{/Pépö*˜]/- 'uø‰øvÿìxƒùõP„U€@QÑâö`ør¿ùsßùýþùšú¢? ]îSOUùЋ5  Ý¥ù°ßõ²_v´Ï‘¶/ú§ âaþå”PQÏ=<ü¯_üâ}ü’çï¿ð•$ðíÆðÌ \zÝÆ °ìÖýÆô³+ε›ò·/P–D Vöeo\ ëÏþQEà@‚ D˜PaB`†=„¨%ÀŠ-^ĘQãFŽ7 ûcKäH’%MžD™RåÊ•¤bSæLšÂ xÄ™SçNŒj@TèP¢EEšTéR¦ME¡§U­ãbîjÐ^8mZÆKBG.ͺŒ³PíZ¶mݾ…k°¡P‰<íÞÅû$M¾}ýžt óï`Â&mæEœ˜£O°?†™©!ߊIÆÜÉc@Èþƒ,–,=Ä06îjÖ­]»´®bÚ´÷Æ›d`ݽù®1cÌÅG^”€ É;=ÂÀ¡Ðc–¥ç@íðªXq)Á™déª öŽCÅ6OŸ³~5xáÀÌ‹×ýý« ¨Ù„#p§Û|C°/Þd%à „'➣°B •2€z¢¹ð)yˆÌˆxêˆb8F‰d–Xb™6¾I8ÄÑ.ŽÞ§ŠILóÃÆY¤ŠQê!BlâÙ¦ WÐçÐA#þ€ dƒ˜ÿ¶är #š(B1? ©A3[zéL5mypL7-š°C9ç¤þÐZ¡“©Dˆ,:ˆç8â‘c:ê±ã<ÕC>øñã,I]RG­ * ÕÊTfà*´C@ ¶ˆ˜AE‚Dé2Vÿ¾|hÀ7ßFˆvà Å´N(Åæ*Ê g•]ØuÅ‘XîÄç ZA Q &WÂÜÿ^Kç0‹†Ðg¡} úðÁˆ&¼¶£†œXpøÁã™ÈêÌ®°³‡«­CÈ=Ì‚Q pÎÒÃÑ‚;°p ©ü%;*3U}˜'ˆ>^!Á/¼LÅLüø¾'>±Ç/‡ÞÂOˆ%úk")n=øØ¦1¬ƒ?|¶†o^8Õ/,yôgb¾|¼ž>~äŽð嬛U†©L¼ø8À‚Ï}¶1Þúþr£>²¤}ä üð7AÈäÃ3—Þ#â GÌb€5H@’ЀDÌù¨ 4­ð77A¡b$HAnE EüˆÉ,AÃPа|¯„GÞ cxºp& tâI¸D̰†WlŠÚvÄÕˆŒÔ†Ñ -À `¼Š‘¸Æx)‘ŠJ`Y(9:†o¼‹±¸G¤ „|¼ÊH4Œb¨Á%_؊ٸH.¹8ibUEIŠdŠÌˆ¹É Äˆ_:&! ˜"%pÉý¬¢HF¶ò5ŽÄ$G"YIÀ´–ºc,s¢INròrÀâþ×Y`†C™ƒKNȺҙ®¥.32Ë[îÆ–Õ,É%¥I^ö…4ä'gA&„À1>…•Ï„g[¢¹M‹P›¼ºæ=-™Kzn¤›ÞÜ£'5P¦"AKîÆfÆÓ¡ãsˆl×OØ›”¬¤6·ùO‚ÒY‡ü^p…ÈH"AIƒKL ª,¥ pPELe:SšÖÔ¦7ÅiNuºSžöÔ§?i8"* ‰R#­&F%©Qir´£ì H½cÜc Ω’PpaL™Ä:V²–Õ¬gEkZÕºV¶¶Õ­o…«Y…)Q£’IŸ,Qj™ªþK§>U~«À=?%, 2Ó˜ÆP6 Rj˜…~íèÎêJ¤Þ2¯rÜk,û ÙËA.±g‹ò% 8 ”ˆÖ›’leiyÙ(f“›umÒTå’ÖFÏ ˆ €û)ö»GùR”¾u´ï ñûFýNxNÏ`Fa‹rà‡ðí@ €¢ð£&1d6<|Åþ ÷óÂrÌp7LÅÏØBË0¸Ð ‘t¥Ð»Æ "£ Å~ðƒ#H"Ø¡>–_éyã(æX;^b±ì%p ÕÉ(> ½} Ã9€²F`cÌÔò6¹ìD/¯Ì1óƒP©¡$Qf='¼2uÈQ"ÁX@$Ù ñ—giîÙ…}FߟQhM‡Zp GIÎðGíªE¥/a‹S-³ÔÑã´.=½BP+OÔ$õ­s —xÀ$@ œ.ƒ9@Fä0Šòà T†VØ—Ëu,wÝÀ^ï× öµ¯’ó`¨è{E þ¬ãrß(ƒ…±;`Ù)« E¾õ½o~÷ÛßÿxÀ>p‚Üàç÷•³Ém+°ÛŠû¶ûÂ-n«,a*(±Kè@‹E,cnЏ\66ã˜C ) (W2OHÂå/‡yÌe>sš×Üæ7ÇyÎu¾sž¿Ü¦WQ'KÙ8ÞÕ$?\ÄË7qŠ_嘔EñÜ4@)*€ž2ŽM=Ôë áÐþȆ¯éBSzó˜Þt«Ü §€Äîá’D£€LЈ”ª {+ïú×o°Óuè);úÎþ³´oílJ\Òìa4Á­HBä<‚9™†[üàE_…Âþõðˆ/ºÑ­IG£7¾q‡æC?_Q?ža¿ö3 b@¯eÀo0ƒ•1‡X‘RÝÕ{ªØ~ÁÒÃËXÈ#¼¡ b°ƒ ­ŠH,«¨ð®gÝ’ÈH؇ыƒ8 f•–•Ø—½¨|Ò§‹-še»ÅjÐýƒ4¸ pv‰…Ü’op ~¸„Ñ“€ü°ƒ]Hƒ¨ÍÕ)µÇZb½»ÂZ£!YaE޹q Še‹e¨…Æ€°?0Ûü:©=¼‰Í—˜Õ¼­m:é°CüÑ€$˜‚a¸¡„D “UÜgbÜþò£Ú¤²Ú{’Üà \qkÊYÖ ò„¿ J8Ö¦`‡q¸ ¨S2@ŒËÑ]¤Ò%Àº=ºÔŦÕuœ½åÛâà>jð0%€ƒ*° '¸'ßÞ‡^5$Þ’€ÜÜ@^ÚhÝk{êiŠ~°Î k‡ÈT@k€_φ÷ßù}ˆ_HS€À¦ ‡Æx†p 'ð<S¢Ýìe¤í¯Óµ,ã­¦ð•!å]^É8u €~Uxö`öÜî`ˆH‡hŠ+`b)΃©8ìe`xr` ƒàÙ’à[¢`ç±à †Œå„ >á‡pÖ0bNâ"~þà! :Œç«F“ã”n>[Ö«¯¦¨°Æ²2ÚýÊð’ $£x†@ìÄVìÅfìÆvìdžìÈ–ìɦìʶlÆgÖÜê5éê¿@j»àkþ8( :žu { G@\¢sCŠ2 ƒ[ íÚ¶íÛÆíÜÖíÝæíÞöíßîànÛŽeÓÓU»Æ§»½Z½î§Ðž1:ÜŸ *†zød«€«°†}(ŠcÐ~@m x'B>"CÖ3ZÆ1¼Æ,æ¦'çö° ¾ І[ØŠ*ˆ‡FŠ#ÈC£Žó˜†ï5"ïN3ï.CïÚRïRj¹N ®1„ýÚ‡º+¤ðé£ïÿ& ×µç³·®oªWð£€Ë•y i Y4øß¢¸!´.Š ·pÂpmÓðOãðûòp¾ñ'Š#¸ëž V„­¬§è‡Â. •éþÚ¡€ñŸg¸çµ×°׬çq¡¸hŠy¸Š4«h¤PPê&wòàr²“rn£r³òÛÂò, î»^íêƒRÀçï z' ÷ï5 6ÏÁ7w¸8ÿ²9Ç®:·ó‡8Då i€_U0?§Šg0¹É(>Š-ïòþ&tŸ[—EîÎö‹ÏŽ Gt `С@ˆhƒ a¶‡^® $ˆ?¦Ð€V<Š#˜»2ñA/õ'?õ©MuE÷3FÏ/W·óT°j¡˜uˆH…‡P‚@høk0XЀb†ðœm0"mçö¡ºƒ @þR_ømða`‡æ°ŠhBäØoRKÈ/&dChD7;f5gç0hÏò[.ŠjGK€„‡à„.€Kh2E ˆ°]§ãj†ïø&“<Ðë«Èƒ"lŠPŤX*v…h„üà‚FØÒi |ÈGt ~µƒˆ[ÑCø¡VxÅcx_sxƒx/Ó:Š@Vð‚–VcUòaõ‡(\K6y¯¯ô°ÿhP„vfPí Y‚vXA¥xpGIXˆx芺9Y¢o‹HèŠp9@L4nºµkU_ž¨³©q4ð;Yˆ;ˆþÿÍ¢h Ö’‡ˆÏ/ŠbØd`~nÛª¨‚xŠ) à¥P✠’©‚!eGw„Ç@qÔEc…qÐ,Í*øýwŒÇïo4U›þ\ˆnò˜þûÈýXÇvtþì~îÐÇGõÈzo£|@³|¹V‚jK 0ùtàóaØ€½ŠEûa˜„̈aÃZürKà° Ž2 pÉ*†2Š16êXÅŒ28¸ñ#ȨcÂÌÙhÒ¨Q±‚Í š*2gÒtàʼn=ЫòÀ²â‘'sT="*°ÅÛ&Ób*¨çgСEeNÚþéÇŽŒq‹d:°ZE”qU*eê´JW_ÃŽý€‰P8Ä|JÔ(\¯`ÅÒ,lø0?Š µøâø1äÈ’'S®lùrealqîìù3èТG“.]ºj*ÓªW³n- æØ²gÓ–,¡FÈܺwóîíû7ðà] ÓBš‰,#iväB+£(­CÁÕ©†T lÔâ)"¦¢8‡.ºÀ!²«ÇpЫS¤4d Î0 ßWRø.Tõ?€ªqØL6Ø7ïät t2S  2 oT‡(ÈtEV%¸`ƒÊd4qVV 3è„RhሔH!0ƒŠþ‰RŇ9…X Œ&8$bŠ!ÄXmI*¹äšµö$”Q††š”UZÚkLj¹¥e·Ù÷%˜aŠ9ænuð™ q—¦FqÀ¦nœ¬ÉÛˆqGôÌ!<î´±Æ:€A¤M=UQhú 2QÀ€&6@>3Ab•¢6c†•€=Œá(¤ÿ y(–B=UéóA¢‹nŠªªDÚ:Sb!É%¯¼:y%°ÁzF¥°Åº[¯Éjé%œÍ:ûlš†°K³s>ËI)ö™pQ€ãÛ$T†„òcO^páÍajP‘Ï6˜ÌUê²{¢'šE“»ðÊ{jþ¿3ácI6ø,Òä®K`Á·Úšëb){qm¿»1”Ärü1–ÈböY‘oH§?|è¼¹D–€ ޼± *€3Ò8.°@ °VQN8«ìÒª+ŽT! »¤`LU-¤@ÓOG-“(;áTJ2E€ô+ \1ÕVc­uÚ7À6ÚQ¥àJ8pxôÓPK÷ÚmK<$ÅGZL2ä”i 2å£y\9åYF¾¹m¸©ü9è)(¡›¾ÑìüÖ ¾mÓŒÔt¹CzQ@ŠG?‡RƒÇ=\È¢ê ZðcUaQ…7) ÁþÏ=ÉósŠ#¿?¼Lᨇ2ñ_;_ÌTüñɰ¼öÿqï¨:ŠÎD#Z/¼ªéWµþâ6.Юœû?9æÈ™Ë pcšóŸÿLvº208*€$ø¥UtÅxÇ6|ÃPXîøHÐò'Â’°„&<¡Äö7Œþ!0r,`åCa°…‘S s¨C܇ءo² ûôÀYÂoˆ0 "àM´C!£(Å)šP…,´áÈ^8ÃÉp‹Wª!G†C ’Q‚ÈÀʸ›jDÂ>$ðÀoúaY€ ¬ó¨Ç=FÑŠ #Æ´èEcuqR# •5F52þt\À -((§7_`yó  –¸#C)ÊQɉÌâf ²BªòIˆ<%¯)ÉY>ë˜-79€.éÍ^ N` $%2“ÉGSÂRY‚lå•X ÍÕ¼²™Ëò\.³Ù¬cøFÒ¦@‚@€à4à)«Æ·†!´â˜Ê|'•6Heªi–Š×Î8µ®]ŠêT»`¾YX „¯g´L²ovf¡ ¡ÙÍr¶³žý,hC+ÚÑ’¶´¦=-j9ë‡o®ð~Í]÷j¹ÊV5}}ídP*XÁ–¾A…ÉaÐbÕaGh€C Â(H…*’X†(¡(@A °pä!8&(„obñ…ÞУiìð‘,Ü¢½î}/|ã+ßùÒ·¾ö½/~ó«ßýÆ·‚þÃmÆìYÛÖèU¶·0dt»Û©^'ð 6þÄPÈ"((È@ºáDb |ÀÉ¿» ƒ’Ñd( #x€Š,c\Á–‰í€?Sà½ØÆ_PðŒ ú Òù†ÂùĆqQ ¤e 1ñ0¦‹¡¢ÊªÐpE^QI×-#g$æXÀÚaÄ­A>s}<ç¸3;Ækm ä3ƒÓžüm56R ÉnÀ¼!ÈG¤,\ä¦v(«oJÐÞ@L,ÑìZ5¯YÀmÎ+m/2JcfΑΥ+×¹ ¬Ù ."‚1”€!à–@¦áWD!!þ9†"‚# ‡îæ‹åMœœh€×ŸÞmš9ý6_úÍL3‚=}lIÖ‰øMT€Š” ¡Ù†àQIÀ¤˜DŒG€ iT¹tyNt¦Sšâ½…5b`Ú N¶²›diMÏV¤÷ ´,m«@šŽ ìg9€Ö <üÜ›ïf ÁÕH.p† àÊfv›Ô„ãvá$¢2Ð]2!`(£€#ƒGôf ×7@ 4âåS59§Qžc•”å¯u¹ÑsH•6ŒéeX@A4NÆ;þÆ!æMÀ»›+¼ããy 6òŒ°½ínþ;Üã.÷¹Ó½îv¿;Þó®w¸7é”Vú€™þQ§ûêQoà7àžÃëæÈÀÈnö` ˜¢^@£3¯ùÍs¾óž_­®&pǾ¶‚×'áëjxÆŸ.v³ç¸ñAß" Ýž(×ÝÓ®£øÁ1mðàÛ"õO]=ëC7<# øÀC’}C™íæ&¸øGi`$Ð=ïÃOJß¾ô²=ý=oTä'ÿsüÀÏÀÙ `?$—€hn Þ,ªÉ$@ti„E‰ŸîùœùíúM“ú™ûµÊ,à‚Íuœä†M¸ø NQžÜÀþß°dš > GEà>K4@<2ÂoL‚¸5KýeÄ"À |`þ <±–ß©ÙâUB“ ö ¶`³dƒ¸dS@^<¸[o`ƒ±…D#´Øn(΄€GT!’Ð&] šà¡ ñ%!=-!²É؉6)pA-œÀˆCjÄôaE0Að bn ô€–!#j”Š^ù¥¡a+¹¡5Áa’IhS'˜Â6‚'Ü€à2l_HÜA— 2D콬Ža#Ö"ã<âïIF2%ª’%6&f¢˜°X6Áƒ|,“nÄCþ®u\oB+ DU!Ã"Ú"6â .æ"dìbRõ¢!ý",£0‚IȈ6A9\Ag$6 H,ƒ>|]n A9TÁnØÃ7@^nÐ8Ã5f#6žáßI¢ ‚ã ‰ã)‘c9Ú‡™08±$pÆ6¨ÁT_~ì;@änìC¤HC@FâUŤ$$ñ!¤)d"1dCG5‚“!ô€-ø,Än>òFü± 1¾Õ,J̨ÂòíJŠŸJú˜7Ž”KnL’LΤoôCT€“ÈA0¨€oñF=0ÀnDƒ™å† ¢nœAKda`eèÃÌD˜B9ðÁ;hþ-ÈÄ\Öå]æe(4èÐ<Єx¤˜Á ÌÄa&æb.%M4¥=åGEå MeU¥Uò½@ `ÙåFèCóéÌÂnxC;ol¢Ä-Ü@/104p:,N ÔCàÁ'Ì €R04ÈÄp§ŒðEVü…LØ^È‚^<ç]äÅ^@¦6†7v#KŸeÂfb‘fn¦n @]€üoLo8@¿éÈQo˜Ã¢È€ÜÊØA^ÈÄ9š‚pÞÂ…€€"'öƒ8ˆLÔÈäÈŽTƒâˆŽ`gvþ×v’^wÜwPxÚÐxþ’gH@"9ŒZo8Àâ¥I3L#C,84‚" @@Ü< ÜJHTÁVJa ©ad €Ì «¸ŠÔTÁ’À«X(Qmc†R¦>u¨}h …¨ˆ~"*"8¡Oò,Ân8BìÐ`o ÀèŒ[ÊÄ5|,È;Ì@ØÅ†ž†¾ÆÁ$ÌÂ4LªÂ0Œâ`§d"˜•Þ––"—v©FÔˆaÓBo@A=(Aã¡9ìD_lj1’AœVA)Ü…Ö@ؽØa/¨+@MÛÈ*­Ú*á˜Íáø àÎYøjàì‹¢Rév6ê4=*þæDj¥¦Œ¥?Vßn,NQ«oCeÁiQÚÊ÷œI0CU J¸‚:ðHÃ%ÈD¹žkº®«ïý°ûÀ½ÀûÄ”.*€!+4)kå0+çLê³2D´jSPª©<°É1x‚oÂEVV9¤ª”¦¤±r£¿¶ÀfŽÈd(Á¬@l6Éš¥>$€nLìü@oD,ìp j·Vl#ò+ne¬*m,Èìæ|,È~)8€jòÆ6HÃ*†Ä$t˜nÐ=ôüÐ0xÙP¬Íòξ–ÎÏ~ŒÏÞ³‚쳸,8¹èoCÐÁÉ6˜XŒ†ƒÕ^­\eþ­_mí u-Ç|-ämÁüZ6mÙn´@†Äiê†Ðcn‹!ĀĭÜÝÖ•ÝzÞPÇn'ß>kg‚“ÌÞG, @4<hWn˜@¾…Ä`Ún0É&vbÍNîVîS]îe®±è-Ét.¥båOeÓÌCÒ~hƒ8@…Ãn*p¤hƒäânFé®Qñî ùn±¯…­Ø6KMÎØ 4ƒà´À´VÄ4vÁü†(°§@ åörïEy¯I/ ‰/ m.7 o—>¤6MÃÏ}D´‚g:`YFÀýjD PpHƒþäÙ} ãíú¯Åjg†ŸN ùb ‹è9Šd6]‚dåÆ:pAgèB<ØF\Ã;îG 3$oHÁ 2„`f¥–/17±;1èah•n(Áp°¬ðÅ´0y®A1j'Œ)Hƒ,g B/$,C¤Á/¥É ñ0ì$ÁF°—çÕ±ß1ïWßA¢R±¦Y1°`±"™ïù²IížY/‚-@øppTÁXéF4 ƒè2Äç2è ¡Súq³¥ðÁ r²hñfR-·æÒðFÂ>˜Áx}D èÆ)´Ú‰åžF-&Ž&O&'§œ'(÷Š([å@-UÁþ;ð†$ˆÁ;ØCHœ€9åFD/˜H!ß2›ä2£îòÒõ²¦ýr,U³5ƒ €dS:PËn€ƒ<#Hȃân„oÄZV€,„sÊ`s¿jsàqó¥y3—óL&¨Ð™!ŒI3 Ã+ê <Á˜!€+è3ÊðsÎú³ét› ô–ôLBJ<“Q8òG<ÃþÝÚ8TòFB-ôFYf„@„Y4´`´ÖjôùqtŽyô5Ùt³È\-õ‚Øå†! gH8€>ÀãèîÆ"qFÈK¶µ³àtÝê4òô€ù4“€tCªn#©€õ‚D\dHdì…„=˜þôF°Ã€à/À‘U7 V[®V!W×–W/ X—ãíPoÔe]HÄgn|Ô‚ÄÐ\ë]_3“à £ðð©°çb` #5T-UC=„8XcHŒÂe…D40cnxªn°´‘F¬ÝÞÍ6m×¶mßöm_!ÿL6V6hòeöïmv&žQÍÌR„aH@‚j+ïWŠ \g„ ÔÑåå1vg·vož44·ã”° û¶›õµ ÷èwþŒÓ,%ðFLk„\0CìC[ç!Zn ÍQWDŠ0ïa€wï6x p·•üµ?sdó-;´bx0Hüþ‡ÄHW1Àô/€#“€Óo¤xŸàe²yz3a ¬I’!HµFàG~ÄÀ* GtF BCë±-l‡x\xFäõîî5/’7­¸²µx ž@6#¯a‡„#Œ@H€C<àŸF¤Zn04lxE 6ˆ¹(9 Oñ‰wŠû²“s”_ '“I’(÷‡ 9´™ D5Po°x›¢y€xk¸’#“ÃYœSÚœKàL×t`5ƒSgÄ1ÃoDú³EºšMzû5ÄÂ,ÉChkÄ!€iE˜‚dÝÔÃþ˜¬A;”ºn<Ð\zF¥úw—° ‚W‰‚'‰¬'_ð:#©Â{ç†ÀvE¼ÀÔC-„DˆzF(ÀöÕÒì3ûE9;C;«W¦«¯¬ûص³>ÜÅ,=‚n÷†(d@0€¨ <­FDA;¬-œ„ 5,;™Á¹È»aÐû¢Û{›¯á›wó¾Ëƒ7xZr¢`eC®$¤@g4°:4ð0LkD3ôÚ"½ÅÓDIÀIJ ¼Ã¨ÌÄ \<ÆÓ„Æ#ù÷Þû•æ{Ó…|´<ɇD@;HR3¨nHH‚jô‚g :ÄAFPB:…Ä|þ½o$¼tœeR.NYœ ªJÒÏÄÒ—øJv¼-Lû!I½ÂQ}Õÿ0?ðß/ФtH${gÄXAg8À8Ø^ELC=Dr<þ¤oŒ+ô8CïTìÞ3ºß~”T{mô;ëµC¡7Rh>pDƒp†xAšfD3¸AäÆÀïFßy¼Foþfp*ê÷#ì€YPú¿Â  Â Šì@+¨dsúÅV„š>Ü  Ø?@T8`Aƒ&T¸!†à F¦%À‹1fÔ¸þ‘cG; ûc‹dI“'Q¦T¹’eË–¤r9“fM›Â €Ô¹“gOjH:”hQ£G‘&Uº”iS§EµHó”jU¥iò•3̶mD «’t‘•°TUãì 4hÒ¨Q±‚Í š…cìЪŒË@è üG0€$p€7U¸½;1ù€NUþ"HÁ0CÏŸA‡.è(EŸ§Q§þ"ÒfkׯS” ›vm”8UçÖí¨Uß¿¾4 €>Ñsð)Gµí€6–(£JÜ©JÈLïß½«YØ|Â1wNX`bôî«è€Åúö€Eç׿¿ þ顦w 0@Öl+Ð@“d;PÁÖpÐÁÜzKN )¤°©ð7,ØI 7Žê!‰hŒ’ ‡¹â &¡gyâxÃ6ÖX‡0ºæ0&;á «C HÔûK‚à«>/¸ðÆ ÁîC¿)©<È?¡|PËž\ÐK×üRL•ÜÒL"DQÍ5Ù$*ÛtÊ’%~S‚:b¤Ò¡¢ªdÜ:,ª /*&©.ìÀ ŠøAbøà ‰Urh‡XpŸ=v`„*8Ljãƒ*b |¾ ªìÕ×+%ÊòÌa7êrÌcWþ YdË$ÖYŒÒŒSÚi“óQ¨.BŽj —£8ë(Z&¡êZR¦®1êP…À€é‰*˜ Ç*4PÇy¬ o ÔЇUÖˆ×QDñ€{¡{¸EHƒEÉ£»o|ÍxJ`#öYg]Vd’”ùËf?v6ÚlYn¹)"[p¹(xIªJŽd£È±œ¤¢·©cLP"?ô(Æ]D5nÚé§õã"S>3d“‘-kQ®úÌ•e[ìˆ àÛ±#Â䔤àéÆªFäÀ³¨% ¨ªŒˆºÀŒ£Þ…Úï¿Hê‰*ò𨫷SëÄ ìÚp-ÁF[òlþçšÉ‡Égßç¨f@Š„W¨êBr ª€'øf:ð×aïupªwqÆ\wÚ¯]ÀÈ1~ÍmPGx¤PÀ¨#¼Ç¨G@D*Ÿ²gˆ ‡ÖcïÞûüf/Üw-oßÝ@ÝÍw­÷ñuþø÷%DB~”˜\…úÚEù¢°À(%è  ¤£*ËÈ!¸bpï{ t`Còñ±O@åK_mÐwÁ𬂩qü@(3À’»B;’’gPW8ŠdA•GÜ@"!€‰ø@>0|´ÝH4˜»˜‘w9ñáï‚B%J¨^øÜ"á' qþ‚DŠAÀ£#+N95Ì!WÀ9Üá»×Ã#îÆ‚DlMÝÈ®‘'\âR (¢h€Q°=‰°`F˜‘-§0 ÝÒÐÉØ©‘ŽªiciGL¦dŽ•‰ñʤ˜eD›#ê€gìã(̉*hQixuF9Ãæœr `¬a(ЀÉÝ )Iaþ’ž<Í%7ù’!&“&4fG@)JiÅ1‘\ €$,R(QPšPFq ä#hØ@5ŠB„ë5¥À¨¢PÐ?0˜Ã´gÓŠùLž “™*Ñd?IâL}þ$‰Ó4¨R€\H..4 þõŠ S …(IT|S"àhS’1”bdJ H)ƒ ‘R•®”¥-uéKaS™Î”¦5µéMS*ƒbi‚Õ ?z’T >½H4jÐÊIãŽ.€€QP½ŽšÂ$Ž@C?„Ò„.¥ «(Êä…”,Ü‚¬e5ëYÑšVµ®•­muë[áW¹šõ¥é©Q=Ô –d¨ý,*^‘šTiVp@[LY"`2Å* ‰Ra0% p0ÁSÄà€¢´&´ìg‘B;¼ ˆ{­I_™ùW£´xœ¦16´([•ˆ®8ÈÀÇFV( Ã¡M)îPþ:´–¹<íOKkÚ™ 6™ªõ)k›BkflÞèbQÆðΡ@ÔJvà /ˆÀ¶Ã87•"‰Ÿå/ @v³+ÚçbD¯¦¥î&­;Pìâ÷}¹@”Øe (JÐ0E ¯„Sæ€W*!i˜BD2“¸µúݯEú»×ÿb2Àú0‰ƒw Pl¯p%Q¸…§äáÚ! ð€K¦ ¡ B‘Lð f|&0„=¾ 7KÓÄ'NqPWÇ?óÅS–&ÀÔ°¡Áu 9a”k@Á(ø0DS”X‰4f>óY —EYåý^ Yvã–þÙe<‹í09Dذ¿¢ì#¶D A Šr†|!mÊ b8”)܃W˜ÂáN  LÖ‡çG=?—Ïýô3íIA§Úe¤À<Ö?hLš(_˜ïP`Á‰¢¬’pŠ!,=” (Á°6ZßqÕ£m53_ÄXWrÖÓÎÖ ê•c—5@³µ ‚x™Âz…Ô@7RÜ!å¡Pê¸8É#0ŽÜz;„ÕÆëµ“™m n›ŽÝæwœ®à:aE=ho›VQ®§Ä«Ty÷Q²Q!¥ñ²‡Iœ¢(ÏXÀÉQžr•¯œå-wùËas™Ïœæ5Wù§vþ×ó7ºÒUæl|~‚¯ÑàgÓ° [DA A˼s‰8 DYB<><”*”£½ÇH‚š’û"Å€…If€[¸‹suûÛáw¹Ë]ÙtîÎ9ðM ü‚C?bÑ®¦V°ˆ$ôЇ=¹#˜a EiôP,ÁŠ¢tBU_ŠÛ”Ò>Ü£$ùí1O”¾Ý“ô¾†Ýƒ¥s¼¯¦çA÷ç2]_¿ûð×`Ž’DâÖ¹žV4<;7¥ GÑ1QØat—Ch!@l„x­Sô®+ýõùsz ®ž´±ÿ¹÷eoDîg¤ö¶ŸÐà˜Ä·´êPËþ¦œAí­ƒxáÊ~°™)¤ãRÀrlÁ†žàâ$bô°/ECûînü.Bï0‰ïÒgö:¨üÌ/9ƒNÂîá*d¥(B ô$¢@€(’¡BpDJ è*.)šá)’¡é@ø LÊúð‚SÏyü’ö¼)È/p8b@SP‚éœnl–@ *ó$/"R`ÔÐ@J)Š¡á)dŒà²zÕ0Q¯cTï 0Ž$Ð|”}˜° ƒc„º $¦ÀHÁð@žM^׆¢ (àu”"À ¨à‘‚€¾”b`‚ Ìþ¬žÖð BݰõŒd0öêp|î}à òn ¾Ã´à2¤M´—š‚¢h( `Ä"" $ r'$Ç. A1BsŽQÌOqwg}§]±*8c>° àø¤¥0"nÁò„Âjp(žà„‚ä¡$tàà`OŠ‚¸Á‘b€šÏP|P× ÇYïc#]kÇ¿ñ)ôè”Á8&js®àÒÑ(¡ù a H‚¤!Ø‘(b ©b€¸ª ¡f„¤Ä {!ýͨâдw òq$r"›âäáþ– SÈ€e ‡"fP"^Á¼$bÝ$Qx¡Ô’BÞœ¢1bF)!˜ &à3áÆ€ –­&m’Jpò wn'‰¨'ç' '(…²*°&R2N4a¢˜bÊáâæ`o†¢ò€ n Â(±*Zü,e² .@^k>J?Úò&Û°­Q.ƒˆ.Ç.½/óò)– ä‘ZŽA*#âÀ`ß"¢ i(,`2…Ü€’b Ôà ~cE6ÎŒ¢ ôá Â2%0r&ƒn±”D{Ô˜`:ó;Œà3â-’45È4·5«F5W³) þžmÖ€ †b ±h(ÆŠ1‘" –à¸,üà“","ê! ðà¦30a:ƒ ôN ;ý`ZA È â€BˆWÄ3!Ès4±ÑÑkÔ3eس=—b„![ÚÁ6%B†‚Hg(A@#¢ ÂAê†â ä n~ƒ³Æá$á6FTÀd¡zá ´/ô‚/üÂ39“3ïc1ª 1£ Üa¶!ü *KÔDC3!Q”!QbEM¦E?æEa4)²¨¯M®€ æ†(`!…¢Ú!ë$‚`A)T€ ìÓ) ¶«Î0þU<Æ£<Σ0ƒL³ó=Kà Ñ f!…›Ð"–øj”€KÙ{NYm[ÕU. [yü^Ynñ°ÁeáÎ"¶Ò´„‡>ÎŽàŒyµ)Ö¸(öà%ŸbŸšÃ—U§ÙVù@ÙA²¹f“Áü ]Öd¸ò v"’ š@(fá‘ëà8DJŽ $lÐÀ‰˜Â b!W%‚òs¸ È”€“»MNû™RÛd¨6Z»}´x¾w:DÕ¤ v@(ÜAœâ*X¤Ìq)Ž øv¼ô@øÏ¿§¥¾é¾G&¿_c¿!¤¿)œBØAo¶B4 ¹!¢Žk ~à£Ò{‡" $à)šaX ) ŽøÃ+ºYMºýëU}ŽÃU»ûôâÉ+d ¶t™Ù „"Bh("&|(ŽA þÈ)– ÖÛM@yu\Z,Ü“0\d4\}Äzõ¢Å²ºÍÝüÍå®§©âJ ErAª»©²Š @ŽÕ˜¢øè)pÂ\ÌyÜÚ|\Å€\º„܃hþK a¥)½Ò-ýÒi º™*jTCR!p >KN(Z ´}”*• à`Âô8ýüñÐ%dÌ+©Ì—åÌ$Íñ.Z îùŒú`ÓŸbøŽ›BLÀÀ!â ZA"ŽÀVð(À ˜º(¢ñž¢šdÀ*LÎæ¼ýÛÁ=ÜÅ}Ü ùhŽl=kÝ´5xÝ×]‡‚Ý*àχc þ/œÍQj<"Æ ‘ b<Á(ªÁЙBTÁ*‚¹žÛÎ!>â%þ¬ü`«Î}ÒýXpý&t}çÞ=Þå]ØŸâf—B@Y(žÁt…â„ ¸Y)Žà ’€H• ð€þ¯žä‡,>ÑÿmѱlÝ÷ªÝOãã}¾æ½*4Q bÝ* }‡¾rà ò}ŠR%K^)ªþ÷)Љ©Âž—p€ž«o—èûÌèƒ é}BéÓ¾{š¾*p£ÕD."XaÁ ¢xvÀÅ'ÙŽ](ªA  áÁ•¢VäŒçë¾Ö~õyš7~ƒ:þÄè~ò_çî©‚”JÁäZ"´¨ÜàÆP'ë"¢ ¸Éœ!‚¤. Ì`*ˆÂ,A"  ø÷7(EäϾþç?c|_4_zŸQ±šU‘øŸËøËÿi’ß) é 9šÀu!¢˜ò1Á b˜ÀÊÃP °z FsC)¡Ä‰WE1#Á2^ªxü2¤È‘$Kš<‰2¥Ê•,Aò+VPK€/4kÚ¼‰3§Î<{îöǖСD‹=Š4©Ò¥KHÅ4ªÔ©T…Að‰5«Ö­8%Ô ¨ W˱dËVyÄÇ)=³lWöÁ¦1. âÚÕøI€À.í– 41J G—e$§&š<§ÈM¹«ñˆ:ð OäØ6³æÍœW¾Œ9“«èѤR=:õQ§PU»~mÔ*éÙ´±z+¶³îþ’ ˜à±ó„Љ*qNõ°v7ç·–% €¥¹Ý8g&Ú AI´aGÆ HØXÆR lá“ÃæŠô‰û|[_³òùôë—üLPfíýükš† `€D±&`§ÉÖ_‚´Ý6PXö)‰f¼ ‹ìò‘#È=Èsð TL;¬ñáD'X2PYL$AÛH$ ‰-¡FB-†z%¤ ¤ì8Œ|'ièT‘ÄÁa’JºS~¡)åVÿH%jV‰%RFÉ¥m_5˜Û’my3ÞxôE;´d¸áGŠ@£‡´Àóļdžx$ÀÌ£3ýxdIZkåàTX8e þï˜rÍI–8F@äH¡@îh*lt3LU$tD\ ôBÔÌ4$V¶£&i(Ãq1‡¤˜¾Ö‡ß@úuIìOAe‰lSO%ˬ-[ ­M äà¯f% ýá›ÉUñ€T¨ KioÆ9§µB3 Z´FÓ4e³JÛråÒU>{t±ÓSíÐ-­¬þr›UpóÎ ^ß@'å*³ðF-k[GzÔrr-#Ù²(íO¾%½%8Þt³M6WT1EP8ÑÄÉ ‘jBH ƒ\ÃÃ4aÈD€dƒª+Jt‡ÇdÄÎ8ºL³À hxÁ‚"†•è](w„ pˆ3wï€3 A +/0äbþm .v8ÜV¼eƒk^;ØÄ¦=_)o̳—ž7=,I/‡ªž „½0Å%ä°C²ð˜Â[‘à™D¢*äcxÛÙײ:xV@< <ÀkoØøF8ÆQt¨C lpä@;à|ðþФ†É(H- X„A HàB†Ñ @DâÑH6â‚u4°aŠÀ8,‘ x£(Å)P¡ V¸â±˜E-n±‹AÆP†3 A zP}Ñ$æÀ|¤eñ«ÂüÖ>ñ‘oˆKša ¨ òÐ@;\¦k|ˆLþ‘˜*¡„ÄðþH1¨Npœ âm³¤ X@ 8|À#åÇ*vQ¸Â±@+ðñZYØT@Œ´³eúÁ¿†IFé A KXF3žih„A p¨Á/Ã8F†¡5|¡ ^€DFŽ…a$â9Î_ SÔh%ôÈ5¸À…Xàa »ô"ÅèDjZ˘OŠf‚”éÌ53©¨¦Qô%j Q¨¼!ôà…|¡ ájI þqAZ¬Â ´À;ä `€D‘;¸ç#P‡æa¯e4x‡T€Äú% HUŒêŽÐ…„ã™$G]”(þÁR,ÈÀVœ¢£…6K\@€À°€ À@özÈÃJÈ!‚½ q\‚T¯åÇ9Ó¹Nª>ˆ¨OM汘ÊÌeA÷™Win‚¦©Ü스¦(™Ô޲ }<HT #æÀ âÃØ9 ÷f¤ ©h’E“ñhh†­ìPb=é É:ô‘¶žöõ¯uDXï1Ö²jw>̵.:]Õ,5ÃQqª…¹‚Ý k7sÁ>TâÝý«;𬆠@ £Âˆ °.€ oP‡7(â>Tv ¯È…7¸€AHþ.ed‰dîŠXLþ0m0ÌáÓl8ËJñ°•³â)S5f˜½Š $C@‡¥Œø)X< $$c{EÄñŽŠZôHg tØHLf‰%N  ÀBoU ñoO,f*š†Eý²h°Ìe©l9ÓGñ²¥{æH‹z$).‘¬°‡½¡Yé0qŒíä:)Ç.å—2ÐB‘@aÑB¯¤­NqC>Bf~˜yÔIªò§¹‚iN+«5ÒfЧŸ­“P3{Û¥.‘( ƒYñ>†ÁަA˨ÁŠLr G…&X:‚x¼x ×Àƒ~¼äÿn{þàq6¶³íj#eÓ ʵ~m<ÒÝþ7ü€ÁçûØ1 bTnox„¨ðØa åA†ÆwÔŒÄBb¼Ùï.X*쉋ÙàïIÂ^†7üá=§‰Äu.âŠ(Ø@Ãgc|n"k`ù@’¹y¨÷P²DÐUAà\àH5Ï‹®“Ÿ}(BW8Ñ‹~ô²gWéðy¦¾žX] ‡(*ˆ!Ùàü¡0ô" ÙØ»@ÔÌ…IšìrŸòÙÑŽµ¯iÒÝ|lª‹yP6{•Ÿ0Ý×s„E)>S€ƒ@f‡#œ UÕpÃÚ1H\ƒÎþB€tf¨Ì1‘±—Þì“>fè3ÿ\ÏO[úŸ¾èq³ü)Ÿ~=óc|¢ 8Ãá Fc÷Q Âïe"ô`õŽØa <°ïâñŒÊæ<ûÔ¼¼õ¿ yk×vÕöv=‡=åp ¨€ È€ è€(Hh˜€D€f Ól‡T"+2;¶ ÅP th yŠqnq‚ ± ý ¨p*v!p C¶ü7Dþg}t(mqSã ‹€„I¨„KÈ„Mè„O…Q(…SH…Uh…J¸c• ëáçæja ¯À ŒÅwëà8Ãpþq÷ð"ΠŒ`Þ z°†ÁFy<(T>ø|@ØpBÈiDxpS3d‡ˆˆ‰¨ˆq÷àÕÑ»P9Ê0ÀQà±o‘ ±€val@ %0” Ñ ax'±pˆe @‹µh‹·ˆ‹¹¨‹»È‹½è‹¿ŒÁ(Œ¶èÍWiÿçÑG} ×yËè, ‡Œ×_‹HÕh;Ò#1 }pKK€ €*5`Rq´°:Ñ ÖÀNÐÕ€`€–ÀŠwQŽrC–Èýèÿ™€óæ|ш 'ˆ™FˆØfˆ×è ‘ñzÀþ#µ$s‚G -`–E¬ y2 B± ïè¤9‘/ “1YÈxÕ–\¶ÏÖ1É“=ÉR­ã –10 ép«sTð ~¡u²xaÐàBQ ï kë1 r¥’>É•])93ù5)m7™e9ùi;é•i©–‡¡|‡lØ…ßÀd é°ôÜ@ð^gw Õ@.poð!Ðk©˜‹`ùƒÊèŒA׌Ëh––†–Œ‰™^ù ðÑ y0 ذÞ7 0u,g uá d@B༠]€éhýæô™»‰™Žþù‡™l7™ÔW™_v™¼‰œxÀ$0aï{¬Ø\0‘zÀí õ@|ào°&p!Éiž^雡'–œF–VœVvœç)Ÿ‹˜À^váÞ@×°"]`â Y8 ÅàW™KÐ"‚ð†Ù±NÐ Òñ|Àm0Ÿú’é‰yë™ií™aïùañi¡!*9Ù@`†'%U@ ÜQ à j _Ó@ ’pëp¼ÇRõ‹"ê£Ôˆ¡h§¡\Æ¡Óå¡¢?ª¤ë À Z—1‰ 2ÀÔð†×"õ¥Qp HP ¹ÇRëÀx ’þ‰ø  ¦kʦmê¦o §q*§sJ§uj§wЧmJÇhÀœœGmÎx¤Ö55Û ‡Š¨‰ª¨‹Ê¨ê¨ ©‘*©“J©•ª¨PjQN€p‰–A Ü€*°:s€9v'‡˜P ÕXt ±*«³J«XŒE71¤YV¤Ð5¨Í55e°0@¬Åj¬ÇŠ¬Éª¬ËʬÍê¬Ï ­Ñ*­ÅÊ’WYÂJ à” ïe ]0 ½oðý]À„a­’³À©ºˆ;ȇVã‡êé§ÁÙ«Lõ«O¬[P +°K°k°‹° «° ˰ ë°+þ°þЮuTà#œ èp’`_ÀQJpkáÃ@¢R‰¨å`ôZ¯ÉcŒ¹ª«ùš6Cá@`¶¯IÕ¯Fõ¯K´Ek´G‹´H+±ÔHüÀ(Ý` „PspGp ~™Í0 h`¦Ò€©:¸‡1«=÷š¡6{S™ ` ˜`S©:0]?ëLAMC›´}ë· ¸ »´Ô8ÈP¶q Aà—HÆ@sqù§ ŽWYæ@‘-ò²g‹¶ö:³4›ŒTá6À vT$~°y`60•I…·Ë¤·ÈÄ·+»³K»E;¸‹8 þB± Û`2€ÍâÐS@2$“–ùXGðä0»¹’†«ž €lK8` (ðRÖоÀT­ËC¯ûC±[»ç‹¾é°·»ˆ•$F1¥ð ó õ lPÃÜÀµ€${ˆfЉÔ(½Ó«$j+¤Ø;61å#á;œÒG¾6d¾ê«Áܷ컈D€˜CÀF‚z ÓÐUëzæ]p vÑ«¹ ü+ \tš‡ /å°p¶ ›ÎÔž«k 6 A<=l=ÌÁMìÄ ëÁŠ˜ "~Ã0ø£P‚À)%Àˆè¼¿‘þ lÃËÕ¹Ö«y[xG‘` B€ IẠÇsLÇuLÇ8 ½SA–6  p£àé`·9 =JÜ~°"%r‡€ÂÐ@@ëq «ª _\ Ç Õ NU UpÙÛÐÞâ0ePgëÀîðq0sPw å@Òœ[½§ìÀB•d$ák¶°àð1FaŸÀÙíÙŸÝÙ–` ¨ÀÓT!ˆ=«Aw¤ ¾o<ÌÐè¹HÔM þ°Ð;[° ;° [°°PŒc aðÞЀ“‚38Õ0Ó Pð º K 8J¦›L\$">èÐÉ–1Oà y ¼€Q Ë G‘ÊtðïðFóP÷0GmIºìß/Åma ØfÃ=§v@@âs¼à ÛPNA Ga¨ñäÝÓTÁ ¸Ðßâó J€ Ç€ÏGáªáà[}Ökt†%¬³Ôµ}Û;°0•0 0ÜðÔP¼ ÿMä˜Åw8G÷`þ#ñïЄüp?d@µÃ"À Ã0 &PþS #0 Õð&0 U@³ðõ@=+6à)€Þü`~´àؼ \€ ð fÐUzÀtÌúäv@Mål ê€f@ãß A\ X€ Ö@ Ò OðÌÀÒ`(áø“0 ^qjç<Ãn ;l$#eN ^ ë»Îë½^Úz¬Ïm+/u¶U G6ÐŽíÑ.íÓíW¾BÐi°M³²íâ ã‹ä•°» °¿`ÛëËàßb0dFh°FlÔnðñ ó@ù=G%,¡îßH†?nþ (œ Ãð –àÃà‘°ÃÐ p“£ÐX àÚ¶ à‡{@¡J°ïu äXHpi±ÏP Ó`8ÏÐ Ù ÇÀ8ŠH¯‘Ð Ü”)ðZ£ê«nÒ}zÀ 7 Bбî~À(NÎD>ÀžáSá>ðR €^ ÙP¸PB0 ËÀömïöoÏöÅ`ÄG€í)®âÜÞíéûí•P瀵]¾mÛ›0î;ã ÕðQ Hp JÖËÐÕÖQ0 oÝïÚð “Ql;R à Ö€°l¶©ëO­Ê“0Û2„ àðÈmþ€‰‚lpÐrÅUP(‚(G’3;)hËê§v¼`#©k :p|F’HõZÏõ¦=ìFѳppGƒÀ € NP¾`× þãOþåOþBÀ tPu_F-xŸ÷ç»÷;^äé~•p°‰Ã$XÐàA„eê¨D5êNœ(Àt P$(N €YÅ8Ž$I²Œ—*)U®Té1𮪧ÄqTn¸çP~v4TÁ—½*ŒpÆ‘° ŸYAˆbYÕêU¬Yµn媒ŸH‚Z|![ÖìY´iÕ®eÛv­°?¶äÎ¥KW‡-þ"ÜÙÚÆÀ_À£êÎ5`‹ `ĉO9c ŠÁ‘éþM%Ù²-ˆˆ']Y‡£M¶9K²Ðå¡£&Ô©U¯N-€*B" ƒàÖömܹÑJ¨A°Ì–JÁ…'^ÜøqäÉ•/gn|È/¤KP¡ôE¯4Àí5¯älIô釕¡ Ö‘#~¨çho—Ÿj$ÃŒ{™Œþ“PÚÊ¥¿àaÉ%T: žzæ¡Ã€–ŽJ Á*\¢ªŠ]âɦ+;ôðC¯ÎH,ÝJ4ñÄ/àºl®+l9ä/}±%ys”ip‰¬°Ãóƃlź(#r°\3–+ºI„Š¿Æþ(†4²9²®i^‹m¶ÚPôò˵xó 8òÊ4óL4—ÛÂGë*™`‹LB¸!Ùd èÆkÎ<ûD¨Ž{€å?)º¦‰‘Æ+š)ôQßÔÊ¥ˆÙæÀœXzá¯Vr © 3u Ÿ”$` SUuÕ*¾*ˆD0cUÅËtä”Ä.°å~hD®`tÙѰ} ò±+ç22Y¹$Ì3‚ù°lÁÊlØAc[n»õV[²„M¶Áh“õÜ/Åè·4Ûu÷]x•óNOæø„ôÑ¥AÄ{KJ ”ñ¯ßGOâŠÂªN‰¤‘"¬#%HD ƒ”`ÁãRVþ;ö8+Wà ]’u£õ2{ððq[áÄ^.ã±XÅŽ2Ùe“õ2@F[>IŒ”ÁJËFš“%\-É­ËÜ’£¾M]Ø÷j¬³Né&8'2í%¸Ï~j bà±9ÂŽþÒ.Ô`­"pÊM®Qé’pzHªp9Ö¡Yƨ"~P>x$T}dÀ‰…+·<ÄWG–zsµNŽlš)ôù‘>¬]cÅ™“^¬1d™ÍùÊhîjF.|zE,a±EZõ¿–wËr»ä|ø³¨^L­“W>Þ!6 “_è­—_·Óƒç#k¢¨!FTÞá˜íû„;+0l C¥þò{¢ þô¤•ñ % Ôñc+ Ü%Þ‘C…,\N€ Ù@`E<z.2( ®à"¥Žw6c–-^G$^$cžàA0<àÅ,u1Úîx绦q +ü‚ñ¬¶<ÆP†Â[øÒ.°¡@–°Š¿”€P=¤ÏøØ…Q‰©*àˆ4ÇÂÍ).àp‚’f tuÄâXw³+]Ð26°Á€ìá`S02ÅlpÝu‘pL— ¡8<"o†{äc¼jHD’@IÂgŽp@ 䌸D¬È .Ø$-Ù¡&ã€wŒšçbƒŠ©Žþ¶Ð‘e$¨: º•!R4laˆx  ÞÀÁ-À…&ØB<(Z•L¨:Ö1xœä\ûxLd¢éäÈ8!:.¸ÃmÅø€èØfQR—´Ê7þÂKpSœ ã×&‰‰.OÎ…]”Mi‹d±ª`JçÌ!G˜c–ñE_ýúWÀÖZ¸¸Výy™l8AeÅš…-p™§žŽ*Dç ¦«fU³ÈܪZrdÀ(àøO1Ð êA†ô,zØúVØŠ³¥r½,ŠÒi‹Iàu¼’Ja­~²ò2#P]$Hi™Ès²R Uk›®Þ¬K›¥î ;ÛZƒ&a†$®A’#ôa ?fpìžT `o{Ýû^øÆW¾ó¥o}í{_üæW¿íõC\ŸKטFfx…†-ø9qØâaØGüà¿¡žþðpÐ 5X ŽF=¬d®eÕéA¾@®/:Y^ó¿ÐõÍ9¤ðbÇXÆ3¦qm|cçXÇ;æqaÌê¥w"ehèþ" `¢ø Ç6¼Á8@· /Ä ´ ™$Y¸E—½üe0‡YÌc&s™Í|f4§YÍkó HÛçÆ“üô^ý -êrBð/ŽáˆgÈ¥ØC¡ -H$CÑŠ¾ÁºQüá ]ÑQç"ŽmtѸHq/³¡$„ZÔ£&µl²Ä_Pº²qö’ñšaXÇZÖ³¦u­m}k\çZ×»æu¯}=k7ky$͸@ bÉ;-¼@Âfvþ³ýfVŸÈ“>8ñê[{y;€W¸‚ƒÀ… ² Œ"¸ó2–– . ÇC”¸ w½í}ïzW#T÷ª£m"ã=[àÏæÖ‰VìüÁqQb§xÅ™éһœϠ^ÿ‚‡. üpÂnÁ?ØásqÂÞ~€CâØƒ<àñr$€¶ðÁ]|1…bì¬Ò–Œ,ä( Ëðº`zÓþt§ãàZ#´cÆsp‹g]뻘°u°‡`·ú[\gyü%6 p„¹ÄŒ<0/Ò(<#Hp'/¾` f@.:ð.þš]0w0ì¾Ö´x§$ØÃÃ¼å¹ ¢a É8·ìnÁºØ=ÿù‰äÈ}éMO²o-éÄ•ÚÀˆ¸  ¾hF4ºP(BoÆ=psÈåŒ .ÝÉŽL)Cî`Úp BÕs)· @(@ûÛ×~"(<á3(Á10® úm Í«>LÑ=}ûAßÃýó7}êÕ_–t×õnX LÅ2à…4Ðqp‚iø\ðÄù °eÐ…>+Ú0¹ ±u#ºº‚Að8 ‹gð,X9z[ð…ptg€dÁ~ø•B°!ˆ‹~K¿ûÛ ö£þ?´¸?#ØA Ü:û»ÁtB×û‹Wà9!XB&lB!ð\0ÀÈ ‚`x¾£‹é‹ v ³'X˜„((‚6ȃ Їe˜‹j`d€ S°€‡ºÁ¶è¼ ¼C!C"ÀC>¸!¼¿t¢#€;À_DLÄ]À…1˜¿È‚"@Dè4ÞêÂ^P»\°…F€,f~8…¹8‚(ƒAƒAˆ{p(r{pà9[H<ר0¤Ã²°Ã>üÅl`,ÆôúCõK§Ä[‚ 2š‹2¨À.°…T`#£¼ÅÃÀO²ÇÃ+rc…—Œ9þ(†e€dè_˜Äa80 ‡7€¨EkA‚k°Ä]äÅÊAcÜG"ÚÀàG€Ì&dT=²^°`F¸W ºPJ-5€‚l+¸³@lœ m<[°63ƒ"ðkI P‚j‚98yp‚0 ‡f°+¨†uP€Ü±hÈÙÐú€˜C|L _ H¡|€]J¤ÜžÜ<ÏÑH¼LSH@‡PT¤9à9ªËÈ"ÙH[à^DR„ cè‚`؆i¨I$øÙH‚¿ˆ[†"؆5¼EºpÆæ²¬Ÿ$‹ LJÁD)¼Á¨T×üILíÔ_|heÏO³t¨Ä€›Tuð~ð‘{àdþ¨ÐCH**¯#¡2H¹Ð…=ÉÔTXÃÓñJKU½d}V<4VÐWÛŒÖó$\HÅð]8Þià92]8?l´4LP$e¸ÀS#h †¬ ¢)±’ã¼×ÍËWBgI’M€ý¯i+‚Qý ÐoJ.°$•£_ÙÏ£ HE iøPÞÁƒvSÀ†y…ÙÙUÙ²#Ù”¥? X¥¨=Ì•}®Û²¥Äx[HHÕù_€DTuÑ£Ò‘‡‘%8ƒ.â³5(ª"ˆEuZ«ƒÚªm?KT¨[Á¼ÚÚJ'H™!h¤Ù[DþÞy²K[ÀÅxœPl¸‚§  X„\À㪠xBʓی£[½-½»=…ÑEJ¾½¬tÊÌ—õD[PÕ1ƒÆ•£XÜþ–lP 7‚ŽS—ù‘o­¸AŸ« Ðý7Ñ%ˆ& è^é^ê¥^y8ÝšXÀ^·9‚%ø^ð _ñßñ ²±ƒ3|¼-[¨ÅЃ%(Õá`€öUPÅÛ• ~:[Ä0.fP5ð}#~0=V|lÞ Üàă´¢¸±L RàÞ´ƒHí%ŸÔ«ÛÂQ Ìû_š‘[ÀàƒˆÑ!(QH eÈþ_˸ÅØ@Õi@(é¢wè+fY^0‡D(ÊeHWHb%^b&nbW`_ ƒV«cH+¾b,¶bVX€)8ÌN€H0_‚Ã`?À4Nc5^c6Nã¿è… ®¾-s¨ªÛb]Åø\ _šajøÙÀâ´EH káÈNŒCÀ…ô¡mÀ •£*X¾dâ¶ÀbèdOþäNŽ¿0°ªÚìÊeƒmHeU^eVnåT†?9ˆâ)6©Üå³LPØÁnh_þe`öe/P{; WNædÞ@Ñc9F_´x…˜fj®æ€†q°„—þR_[¨¡B¶)–ÀGˆ¹ƒ3äÄE ~‚Ű[H»¤Á‡#À«1P¼ËÐd¶@ܤ±‚>8—"†SVf„^eøãö•bµÊ]>ø‰žhŠ>6k8µZ`ØhŽîhþhi‘il,i”Ni•iŒ†vè"6€­;æ„®é Ô‚vgN›Œåó€ˆR_@¡[(š‡¿S‚H-xÚ'> 4xçÈ aÅX‡ch]Å [gÞy~¶ ^ º HkµVëH :Y)胮i„^è.hèYf¦Üeƒ4èk¿þëx °þF2©=ÐFHlÅ^lÆnlÇ~lÈŽlÉžlÊ®ìÄæ‚;¸——VOèlÏþìÌà ãf£iºVæ ”†Èé>ßÛˆåQðÙžíÙŽ\è5 &õÍLxE }p‚/(;Ð…j = @(·apÆ›Œr°êºèS °…WPlÓÅ€RÅØƒ®Rþ :…¿.ïu?gˆ2À¬R¹>mW^èm¸kY¦eàëòl¼u p…‰Ë¦=`†Ø*ð¬x‚Ìvé[Úï¿ÎDbè"@¯Š3mùnåÔÞ†ÕÖé8î—ž€:`ð¾ÆkP1 Nâf[X'ÅÐ[0þ†1[0YHƒ°Tjp‚å³ÙÄè¦ Qo݃a€Õ9°¢¿°‚<€»c‡Hþ‹A`M")kµoOƒóöƒ4+h»—ø®p…¾¥T¶o‡Î¦½¾ò4lHƒP™‹p7p:g ×ì¿òLÄGÈ阞p+s o˜TÎðÖNLh>‹XþpÇ•Yl=j(âfBÅP`V!š¦ò0‚¿hªk€Äƒ¯‹»U ÀŒ¤¹†5€zø€)à§ah†åÂÄPýo©±rÏò¾NþxëV{ïÿsAßú.s¼FóüVs6ïë(Âþf¦¯smO‰;Wp.Pó=Oƒ}ø_Ñ&íô¢ðe߆ /tÖÞðGépFgpGOw0ºÛÎíâfÞö XÏ<°H€Íµ…wC /Hõ¹†*ð+@Hši‡Hs*@†]¨†˜ÑuÄxå o/vö¾¦‡AZïö8d§etø»‡”†šÒÞk¤4¿òiïkyðo¤lßö:ïöGyéo×sÀ„¾^ƒU€p 6t_ö ‡K˜úK ö w÷x¿òyïkK¨‘Ï÷³³ O  jÅÀÏ‹7à%¯ .Pøv³…'ðx8‚*SŒ^h·;xþ8`‘ÄaÑnÄ„ÿu ï`GïòærFè‘ëüNwU†¿bÙ½Žvœ‡˜ò~s4jiúy 7p¡/¢÷£ÿë>Ïo™vú@·|u§™H¸—­otøkH—tJÇ„UŒ`(¹…Áx(a¡€ÄкŸ‹UO Åe…b¡L 7ð€5D‚œ)Ähõyùý&ù¿&ö(†kÝ |T–}qøø_'Í·yÎñœÿëjìÂÒ/}€¨"p Á‚"L8ðÉaBŒ(1";\Ò`̨±LÓìc€Ÿ‡bO¢L©2åb¶ÁŒ)s&M˜öþfà̉“ +Óà Ñ¢FÊPç£FPf}t' €kŽbͪu«°?¶¾‚ ûÕÇ‘G"©R-R-Z|3…Ö¯cÏ®}ûv†ÒOV¼x< G׬â€È•ïîm·|Ù{~oW=ßG*ûKÒ¥ÇBÅ”%ó¸DÈ~Õg`Áe‹7£¨CU1$öÎþ:¶ØV$‰acT13‰->,X"Xƒ•˜¡3@-d°À2Ñà`K0iø2aq‘˜#&†å‚’fÚq©­vz`EÒ†_D¸éFŸ•4ýœ”ÂÇÆxi$·Üqà€5gl‰uܱ٦›o^ç]šá}YÞqŽ´“[iòéP|W“}>¥©Ÿlýàq`€ ‰ ‚@â2™.ЀDª1£J#$â"Ö(‰íU.™*Š&^Àb)¶PÁ¢]¸ð0âTÝ£/_}“˜©~%d¤²9’_&0tH²_”|Rh YöùS—_†ùå``GÕB´þ&œã’[nœ ÍiQÒH%‹ßŸÒ^9(Ÿ†Š†èO'UV +Ú¤@ÊŒ_mƒO¨_e–$ÚÒ5(dQ£-¿ð„- [ت 3‹%Ø" ‹¤„åíTõƒ¡-ʲÕ@ÇÂ"‚$à„V쑪}™Fk¯ÅÚ³iFK¯•ÔÆKœqãeûesÏE®¸æR]5¹rnIçxvއžzì%ýݼFÏgo¡CªT¢ü~9`ƒ6pŠºTá_Ëb±q?¯Äa±-¾|e Zã€cË5<ÔÚ±Xs–áYl¡bË,šã×X+PÏ_¡“Ø"¦Jó4˜Ùh:ŸþvlÏi,Ùä“  ½eÑd÷†tØ]Ë´r¯§A¦™hV;µÕÇ#ŸÖRj}×_â©çîÂûnfo‰ohúž¦hÏŒ: )ÜYɹ-NŒhË6Ëà’áe¶èr„-ÉX@Jì#Ö:˨×'éèà`.sœ- ÇdƒyB l19´À~`±A"#³ƒ=ˆÁÚ,Óíçha´Â:¦¸îuÉZV³¶R»ŸŒÁ '¹õj¢»>‚ɘHïŽÓ´×m«[ßÎÔTä!1‰YÞJLum]¯sIœ8½a(%Õ«áL°'%|¹C[áS¼×3Uå*ã3Jùþ s° Ùâ`kÃWÞg w¤ ÙøŠ!þbƒGĈ*\øBƒgÀÂèâ`º-˜¤[ #17àA4â‚3$F@‹¢À ]Ìì3CÚb@ÕmF9áGRøºŸ•2hXyáJ qdC"4ä¢LnÈ'G–hFDzxš¾îi€Žp`!JÄxJœfò˜¨R  iÞiž×3¯­§=WL0è1‘-ò&^ľ‡°#+düˆ_ç61hD™ÔH‘ ÎDac_¥=a‹ÁÀЀ_’‘!ùý%\Ö4ªAÀ€0ÀâÁÁЉKØ‚`F 4þaÐ*„ÅN[øqäaèA(×bž8%?hU–ÆX<^Fb礬ÐR%† ŠN!N‡ì2Ûðeš6I5p 1&S <áÉ6®A‡ŽiR3­T³fJJ}Ì"¢ó¤HÔè±aOÓS€jvˆ 3ë|¾ @•y¤â G™gSØFTð=JŸ_˜T0 HªÃ¸aˆaIGÂÂQ>²é°é ™QÇé “ùJ·1Ž©ï+Á˜ö!? -‡ Œ/°jÜ_l*# _YF Ê„WÀc4AÝY’ˆŠþ‘2k–µà¦–@œQM'U·Äˆ‘òïņÁÕxxAôP&ç {„ëˆÜᮄµ"X lE‰SÐB<„›Lñ&𨯰--~¨ÁX^Ö=ø"Ê´,Ä¡(ŒÍH=‡F€oR @‹,QHÀà ¶H‡ "Qˆ ´–3<àÅéð I("o؆‚ܱC.ˆÉ°\x€‹t¤ã Lþ /&ÓNÌ»œ-–ð´ðã8ÀÅ: a€Q¼Ív€ƒÆÁlHƒñЂ14˜ZÈâ­X*J‚OlDe°TÃê¡Ã)ÖÁJþ¸Ò»°„ÍlÆk›CÌÅ_4Ö\µ€üQÛ¾tì4Ü3Ÿ›TðƒPE œXp [°ã&8ÆWîÀŠ`|¼DÛˆÁ ñ$cBåE¿åÂÃ~)Øaƒ)ØÂi`ò…p±SÜ  dƒFGÊ‚GFäDVäEfävpåéC5REå L €ÐU7ÙÕÃÅA$eT² €Å2ÔU – ¾þ }H¥TRXxƒ´YV™haqá±­Ã tåÖ½ÊWü‰1CÈPØB1´– àÀ5(=Ø‚m="E"ŽADÙBè%4ƒÐ­A+Ѐ_â€\Ø‚@Ìt1ÆDå‚8WhXˆ—-óåÆ°Ã¥¡4z8%AÀCÄ<`B/dALtCt78„8ˆÃ9XÈ‚.(@|qlC7zão BŒ8tÁ6\A5DÁ34A2 tB æÃYˆÃ}iD~%ع@HÄ3tÃ:à,‚=êC†€ \%€*8ƒ›Óa-‚@pÃ;œ@€Þþt‚@3 ‚$ Ä&™dìBìC?€ B!Â!$‚",#8À8Â#HH‚X‚%`€&Ô¬B™ÀºÁŒieâÙ1˜’Â(ˆÂx@l€`Â%XÂL‚$D$@€#8@#0Â(€|B$ꘉ-”A途À:¬F´QáƒHùÁ À‚"0@#8BDÂþ$\@šn€€BŒ@ œ€*¨À8ÜÂ)¤À(Ø/0BŒC"ÎHÂ' XøÂ20Ë%N` æk¦.˜À p+xÃdÒ\°6ŒXXB á&àB!j¦(!Otk0PÌA˜ƒv9c+¡&ðôÁŠðC „ÁQ$UJT° 5Â1 ªq‘ªáÇZ e0IÂÙ×=vU>U!xA·8P † °ñC@1ØÞuÓ Xƒ¬@4ìTD Ô§>|@ƒ>„À0ìÁ@LÂÍnRˆâ^˾lÌ®,Z°w@™µÐLæ¸@¤B Pä¼UÃ,€Àƒ7|\7˜Èf‚K­',6P‚…ibD¦½Î#ä‰(RyPTUpCd'T)ç *ì{ÂU]BÔ8„x"žÎ>6¤|°…œ@<ÄÈZî‘Ã8XB6àÃ"ô”AlR,àAÂ@Ä5ì°BD‘ÆÛÕ: )@+(oÒ@‚†Ý€ÂÖPñºG¼C'<ïH,~9ïxȃy¢§m )pƒìq€µI+lƒøÁ.(Â‡Žƒ °@²ÆlˆBJ¦€+„ˆï&éƒ ÒÑVÁ€Áþ*˜ (TA,DðOÑ€€@l21tò'{%[2&§ºÅñn×BDÕf„¼’v #\Ñ0lHOµ`iðŸípàË>”˜+¬ñb™°Y¢pÏ„ªj°ÂHÖ¤hU ÔE€-AF6àÂ)´Ãü“›È`p$(… xÀ'àB%qÇ}B‡R¤(¥Cl›ñiäëHð« íîOìÁXDбõØñwdÄò1è›è}‰Åb¬tôC´•BjG¯@<¤AŒÚT#PÜÈBx¨: å<AÈ, ¼ƒ¨@Dˆ€àþA‡·ø(ä¾}ÃPõQïoOÿtP÷²pôƒ1˜D3Fóid-lí2ƒÄB:œS4{ã4 ¾Ü,ÌVÄíÜžFÝÞmÞJÖdy…-tBÔXd0¢‰ô &Œ€= >‡Eâ A´C -HXÄ-@Â-AeR¶X îV°Á BÎlÙu×—ØnRæ.íd4~|4î„tµ0/FçG@¯ô~LO„öR“þŽ›òøòOLð\ S C°Ãõ0t44Ï©TáµmhhüõY¶Î œ ¶a…Ž16‰(4° î–ökԂД|€ôM™î_ €-þ‚4d |ë{ÛBjk…=Ëk?clŸ†jf³m÷In“Ín÷IoƒÉkD ŸÊ KL'X8‡ ìCrc GZ“‡k2Û2W·J”­õl7Pt÷m3=÷G|³„syïÓa†2TåP€ ¸`1`dÈ2„hCË ;ÅÁÜÁ8ì-´L‘8ÜHô½jDEïk¿ŠFK„„ó …ÿv¨´dlØ·Ñ4?\‚ˆŸ Ÿ˜øZcD[¿u‹»¸]oå}œÍ~|w7„`ã-E ”-¼‚˜vǼÁ4k‘?Αÿ ?¼C$ФÆ!šØúxþ–Ì–+¸FÌ6îBÉm¿™Ó‹™§ š[x÷ôîΛÓù®‰ÛÆ£¸/ÌгBC3´A©s1¯ûGxùE¿»«»‡¼O pð¹½Äš·9¿s¸¿ã|¯/7~>×A!Ôœ4Ô{{ýœ|ʃù°`>PhþÑÀ|‹Ë<ÍûÛ>¹íü{ÐýÏ«þêç½vï=aõ=—¥ÓÛ~‚P;îoû`>1‘ Ј"e?‘ ¸½®†Øþ¯Qò߯ð&翇½D§{°¥vaB… 6\¸‡Y‰)V´xcF9vô(ñɇ#²À%MJ•+{À$o­–‘´yçÈ1ÄlóùhP¡Cº`!'I-¾4uúô©uVV`Ö:ú@»lX±c¡ ûc mZµkÙ¶uûnܸ2SɵûJ”1wùªlàÀ«œªºr?«øH"O°` 5’’¼€ QÍ›ƒ¦°¡rh…Ù0^™.šˆvâGÙ³i×¶ Räë„&QšNÙ’E8vé6^ygOÎˉEz|ØÒÈ_¤Rõþ}õGŬÆL÷.Øl_ñãÉ·¥[ž¯.]:ÐÇýûý;aè×·/¿aà‹ ý Ë2cŽ@ < À›H»G–|™ìp ÁÐb» à 5”-$y{ÄEü?*̩Ņ’+ÅmœPºÈ¤ÊÇm´1üàp¤¿Á ¯½ …4€º†餕¦ä¦~ê¨Ûiãª3~ÎØ™ÞúæÕÙë!{Þšæ ¥>í´Õ^»édÚxîþ¸åž›îº«™l®Ï ;çjù>rì¼6›í ?ñÄé`Áîúï#Á޼¼À×–ðÅ5ßœóÎ=³ñ˵…œò '/]<ËE74óÏ]öØ?}uCIGP¿q'OõÚ—l]öà…žø‘i÷}ÉÛwïôååêùþ€/žúê­¿Þµã£ïOyçïšÜfF …!øÆä.%Áñä}Ц†ËPƒ°paºéå TLHå ó„qÄ€Ÿzì  K‡:’½ÄP&LàÇØ@ãðÏtö¶÷È…o|åó\N÷´,C|3¡]”„=¬B'°.·þ°,š0Dþ(R$Ùu# 0‘ø@ÖDÁˆ3"•ÈÄ9ŠÇ!b7¨µòiomY! Gø–¦hñJQ‚!-–(Á)>AƒOHB¶ðA)ò¨F6º޶ Ç)F` #ÙÎp# Š@(À°žpÊRð…7Ô`lPEýÐÑ} AMé$4>Ê/„åÐ>à”KÊA`Pƒ;¾à…&…£)ö°ƒLpØ”Kfr“_%î"¤i‚N  UL!œPE Hq R`‚Ãh ²©Lf:šÃ@ PV ÎLE4DƒÅƒþK(†Ä€mP!U Å=è  ¸A\‰‚'üðÄyÖóž  t,!:MâB çÎaÀSžô´'>¢O~ú %¨A5šP„,´¡(~&ª"#™Úüæ32ÎržsÕ A RÁ‰# DÎÔÄIÐ ÄÂ_â$§9²ÌfÒ4)KY_ûÞ?Çͯ~P¹ŸwH·BDú±oDË i¤Р§ %l ¸ÑiéÀTa W˜c¬„4dZÖÖ@®åŒ¶ @Ðrb  "@‹"|-^õªa«X[ ¢­¶`„Z¼êÀs 3Æ‘Èáþ_àa\̃?«míkù£4@*¨‡š 2t‚AÀ¾0à(DSÂàSÜÐ)¤5-jUËÚ!H¨ ÁQ Lá Õ8ÅAˆƒyéK¿ÞñC?$òR×8ñ U5¼0Œ”£&qdˆá˜ ± <1xâ<àã Áz€‡f`XÂH¬EÙ†_ýò׿0 Œ`3ØÁ–p(¼â gxÃþðBlˆ»ô Ý=H{‡!ÞƒÄ÷ ô5ðÎÛˆƒ8€!Ó†q p C *8²|•< "9ªþp! eHCÇÙ°—OÑ!WÃÈ–¶°‡µEbÑ‚Y´l-ÄÀ‡c–Dì-{H@Zh0 [èuÎ,žmAÙ9[°ºSK,FM¤…#ÐôfÐÖ4¦Å¬iñj¦7Ýi[àã#hÄ8›>À(´|J`€¦ta°a¾`Ã5ô¼öõâ‘§/ ÖMY‡ ºì4;ÍM¡µ­¿€k][Æ;“BTáA*ÈŠZü4¦ÁézÅ]nsÿt²@E$ÂP_ã8?fxÃ0Þá$&&f¡Ä‡áN,ö»IV¼îñ!%ñÚð-}óÛßÃþ¸À nð'"? g¸Ã!~‰ëÆÛànw¹Ï=ŒxÏ»Þê¶÷0Þ{t³Ûåò¦÷ÊÉÝòœh¡‘œd%©INz”¢Dº)Q©JVº²°”%-m‰\~A—¼„:0NJó¹ýéWÿúÚ/øÛý¤füâ'¿ÉeoÚÛþ ~!‚oøŽ,!bªæ`ª÷!PÉP4´`Bk´Jë´RK¶\ ¶ªk¶6жpK·xë | ¸„‹¸Œ ¹”‹¹œ ºšBº.-@êÜ„ö®ï ï-OñÐâÔâÓÞ.ð$K-xÏ „$MîláH-:aÏÖBËòáÐ"Ð"b - -â -|ÒJÀÕšÂð†,z° 4⡾À ÀA@èÐñP¿þ øÁ,á°¾@Â4 > (¡)&·Œáè"à¹.À  ß0ç°#  ¡ô¶ë ¦ÁB˜L!À¼†Aˆà Lá ¼abb¨b jNŒÃˆÁŠáîaNP¡<@v`ŠÁ ´à,f ˆú(A˜â•‘q¸@ (af jÜ ÚáüÐ&‡±1—±Ÿ1§±‡á³q»ÑÁQÉÑÑQÙÑ_ƒˆPQY1!vqzñ ˆài ì €Êp"%rr1{,!Ö bÚn-×v Øþ~ %‡­ØšŽ-Ù¾`Ùš õžõJ²ÚN2ؾ@ ‘Ä-šð £P-ÀÐÄ-~€ óaÐl!íÔš²í–Ð(‘Ò¼0 Ù-§ÐÂXáp Pa2ÀÒâL$áÍR¡Faœ-Ä’,Í-NƧ¢ -ú@F¡Îò-”$ >@ ðÀù˜‚v€ÜÀÎ@˜þ@ À "s2+ó2ÅáЀØÀ )ð¡æÔ`ÒŒæÁ˜!À¡šˆk1ó11ÓŠm’‚Dá ᪠<@JÀŠcÈP 0€»XAJà¶áþ †³8ó R`üG¾!  J@³2È@&^`ŽÁÀà@ ôAz@bráÔ &²èîA"$Ö³=ß3>‡Ô€ø  !LAêÁ àφ<À<ÑS=ÙÓ=áS>éÓ>e/?÷úÓBô ´@4A´A_£738©Ó8‘;µ“;s P2à!UáFbž >Ò )FM`;§“8_´2´  Oò(Ïò0oóp(J©ãóBoôJïôZÐ&[põžôõp¨'sp-¸Ò+Á’.ËR0ñR/ù²í$ÁLaвà4-@Üá*™ŽÔþ”ör.ÇM‰D+Ûƒñz¾(2ô@ŠOsÌïAU!Õsµi–â Óp ;åï0÷0ýpq ñqñ#&±/17QS?±SÁA¥P!¦yÈcW¯åPµbzh](5qê  R—U!UYcÇX' ó0ÓñÓ1!³“2Ó21“2»•3=4Eó HÓ4QS5YÓ5aS6i[os[ÿ`ÁÂAWÿ¦Wûb H:Àk‚UXÇBQ# Là B sÆA&Ü™uYöŸösøÇ® j8è_É¢{È#|HÁмæ^Ëh-üõb©„XþÖdOe?ÆbG6,2dÝâc_-D–e"`SgsVgqbekö)\Vf#mPƒ6dÃg¿ãfwVi—vg{öh¿h‰Öa”PjýÂhŸ6QK–i·–k™Öi6j¥6fe–f}6i»mÓ6оÖgÖhÇöe˶fÏVmëÖn…‡mkÖmƒnËbÁZä–eévK.€îqÑÖp=&oYvoÑão¯er6€²ÀÂç5p¯¶Gb?bA[°Jz´ö8 ¡N ¬/'¢õ_ H&´ @*(qAƸœ¡HBv]cw=ÆtQuU'XwKwd»‡r-s5·o†–þ™WZ·) Á´¥&½ƒpG‚ˆ”àf¯iò!Y¡&:$uv1Åü ô`F}ob~E¥{¿wu׋°ÖfÚì-ž=~Ik*õèÄ - FàÎÀ­La`…ú Ðd` R ê ¯Êʳö¤&G©”š‚¡Œô 0¡×øà†J  p¨êdâêx(Eˆ( F!GU"‡AP  €ˆz` ‰¤¼þEâÈSô Œi: æA°Á N¤ Š*“¥Òw]–`<!núአN‹eb¢ XŠ©ØŠŸh¤²X¢>Ɔq¨„ê!}þˆBˆ‰ØˆAg¨aCt}ä##cŸ—‚ؘ-,‚%¬*‘0Xƒ9Xôjh…¶-(MÓ·ÑäŒÎØbÐâ¢0v!Î*‹ÐJÀ|ÒÂÎ4냧¤&3¶¾ Yç¡&Áø€ÌnhŽ ‡P0¹–K{I÷8¼m¸!©†#‡aÊ®áäs€ ÎÁþ\`z@öp,²>Pcý×-DyHÙÑNy-RÙVÙ±\¹”a-h@–Õ¢–ÍŒ¨¶€ ˜Ô4ÍÔpÁJ`JAÐâÔÂHŠÚìÐâíæ.Õê®ñpYKW²ú€\¿ êáÚ¤´UZ2œÙÿ"\ "cʾpŠæ B`$Ή É‰ØÉ‰t8ŠÁ㲨~ï9AòyŸ¢Ÿ•`°ù/‹æÏ¯[°åoþÛcˆh­ÛšæP½B®O®íºxÿx,ÌNÁ)~@€…ÙÁ…¡+†—Jø„Sx…[ø…ké–™¥rð¤ú¨“z©›ÚžÔò¬ìLÍþªúÔ®Zí²Ò·  ÕÞ` [ðt0º×³zIjrJmˆ™¿@ôa ¦ÔÙF·†b Á­9;§<!âìŠú¯±ˆô€±)»° :¼Œ¢˜¡²\Áço¿“Ì¿{Á/›½Ý{³‘©³B®éÛ¾ÝÄiIœ"ü`Š™Žº”Y{ù—ƒy˜IÜÄ“ù¸–™·íây§;-ªûº¡Úïlðð¨5ºW+ÕÂp-º”a)…a(·{’ÓÂ*ÝBz¿€z‘ËzkõSÍ FV\á > H±XÕU›y½"ÖáÉ¢Ì嘦*þÒBáDF|¨|‡aà¡H 2 HáR±µ1â # ÜM,€L`hAú€ÝÑ×ÒÛaÊÐ]Ñ9Ý=A=Òæ¥ÚüÍ3RÎéÜÎñS:>¼)Bü¼9¯¬·¾:¬Ç:½‹}Æåây‡<-ŠüÈ“|É›Ü;Ê™”×*÷r™¡láLíÒÊ J!àòÐÂÔÒd°º]0¯]Ó2 -øÔO“sû£“ðC¼U3­Ô€¸ÀÀ¡)\ø àœb5[3Ô¼B~RàrtG£I97€8jþÙ%B_wÈÎÀ`7Ð@°@ä«Cù!”ATÒÃl÷ r÷ ^þCcE!à åW¾åw^?a~` ^â)G->0^ã9^TœÖ´Q»)z@ÒõÀÆ»¼{¬{ɬŢ{®]yµÛÕÛÁ]ÜÉÝÜÑ]Ý×¾.Û]|FÞï2/û”Mƒú“«vʽ£ì·e{Eå ª8m¼æGñaç𫞴ÇâøÁ&¡ø@JÄœÌÍÍ5-àŸ¸ÜËÁ\óËÎü $Ñóßá›bá]sÔûýßžù á^]>0÷eû¶Œf?2brKF¤áÔ&BÝÀ‚€ŸsÞ?þ‰GýÙ¿øÉfðmÇõ_Ÿ-À l H° Áƒ&á‹Ã‡#JœH±¢Å‹%ÔƱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›*µÀȳgôúPØ…H“*]ÊT ©šJJ•!Ñ«X³JÔˆ³«×¯`ÊK¶¬Ù³3ujÍŠî)rk-¥J·®Ô§QíêÝk5®ß¿[7¢L¸°áÈ+«°c¿s÷Jžlþ /åËLû>Þœ•ëâÏ C‹Mº4ÊÆœS÷ŒŒ¹uSË®cÔ¬ºvFÁ¦sëÞÍ»·ï”¨m ÈZ¶ñƒ°Ë¦=¼ùÏ¿£KŸN½:ÙàÎ…WÎ=9÷Ö̳ۆn½¼ùóèÓÃ.^õöïÆ½Ã§žb¹§ø°sÀÄ:v<µßC¨×x¸©W’ù=G âÑ6õ8èQ:ê$£à†+1ØàƒÃD8a…€È†rX{íqöÞ|®ÉwY$ÊÕ7ÑO@ ú9¤‰!Ó€)=>´@‘µ‘§"H’Àˆ!†tR"GØãÑ€üdâ0ýL¹ä—"5ùd”^Vye–^rÔþå–`^·S‹¶½ÊÉHÙ56ÄÓ‘y ÆЈcO€H:tä€_x‘_8_„AJ9zpñÁC,<:óxâ íÐŽeL¤d›\ðEhˆÃÄ1ÝÈæši‘ãxhCIGD€rHÂQj :Kº[—§¦ºj«z+G²âG«­¸êÊëS¿;l±Ç&«lI,Ft_ƒö÷¡ˆ~QàqõžuB%½ÆÙ(Ñ‘ø †D¶ûÅ¡ ÂcŽ…|¡$h¢B=8dÜÒÊ_ À “ƒG:¢&¨l—øX Z~4í0oHùdÃŒPN'Œþ@Ç$u#%±”€ Ë€°@x43nn$G{rÊÒ¦Ù²“†À,3Í6ã<ŒÎOõüóA]ôÑ$• Ž:ò8àAY(ÁÚÉ˾ñÙ‹Y#ŒÀÌ ذœž AüœÛF®d< BS¸(Å!T¸ÒE£¶Ù%!’ðÓDÓ¯¦Yª‰ï4ÈDG]^âÑpÜó„ ä€mÚå™oNºçŸsÞQèù®&¦w„ºê¬»>’Ø…÷ùg ƒ áŠâǨ£JJ©¥˜jú§ž‚J‘œ—Ñm7ÞzËfçdpǦïòú…!ú>0’r±Àü Px»ò0J å„NÈ®þ[S1Ú 2Ú­¬vCúÁÀ~Ìav[ÊF0‹ppá h»îÎD l !è RЂÌàGˆg¨üø `…z¢ H$la {Xľ0±§X cã˜Ç@6|±Ÿd¾]G¸ÃC"]Àaø‚ª,:„h˜1Þ± ~¸À§ÀR+F` G;>`àÁ›˜Ð…ެá?a„ Š1ŒuÒIƒäˆ;@3`´cü@E< p¤<€88Â5Pb3Àƒ¸Tø™=ö‘# d" ©JBc‘|d$'YÉKfr“Ãèþä'C9JR®çMñàw?ö îp‰[\ã¹ÉmÏmÊabk”¸Mä©'myÊ r®§àŽÝÀ7)5;0#c8øÀ#8À!fÈ ÂŒvðƒ\ˆåDF*2àñÐSî±Ép䇠¼’C=Œ%€ úPGÁ‘qäÇ!†ø4þ| @9"P Ô øA(GL¡P†:¢¥è0,ŠŒC£õèG©ÌŠJ}ÆU»¶E.zOËÝò^å»â¯|ÑC^÷JĺëMHvók ÝÚ·"@Ã.LàøÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{8Ât@ì‰{^þ2e¿ùõïˆþ%B¸øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²Ó°âÙ–ØÄJA±] ‹&6ùÊXβ–·Ìå.{y¸øÅ •c¤^¥0ân¥h7š"M»¨øËp޳œçLç:Ûù1a>È™Gæ53¥Ív‘²-襃R°ÙÊwN´¢ÍèF;úÊy>¡ ýg2OµÒ¶h‚'b”Àœ6Å(@¯\Äà¶ÅŠQ—7?úհ޵¬gýêH„^šæ´§A= ˆšÔ15ªUÍêº:#06Ì1DìA {H€@äci&"'³—Öà·¸ÇþMî-Ûº ÈV6³âlhKÛÔ¶6¶m¡mn{»eV ½x¡$D@>A©ŠÀ¶Ø€.ÜÜÞr;üá¸Ä³rn‚ì»ßÿøÀ >ƒ'|áÎwRð…d| ·Á2Ur,€”Ћ«'NóšÛü挮ø@Hnr[ågù@\ó½_“è‚@ðl[àã݇¸ƒµ…A 2o8ηÎõ®{]Ë:Ò•n ¦ äéÓ–º-òAõX뤹Bö<‚SP@צ˜A,a XB ZÀ­ýðˆO¼â›vºÛïzßýxÁÞèrWNQþøÅ{þó ýZÂN™ÍKFГ¹D0:/úÖ»þõ¡'}êWùKÇ#€$XûÞûþ÷5—½^p¯ûÓgÊ™9ð—ÏüæËYø×Eýu•ïüê[ÿúî…~r¥Ÿ\êcÿûà?ãï|„p߸Þ¿ú×Ï~Š“¿ü9?nÓßþúÛÿþѾqå_[úãÿÿˆ}ú‡[ügZþ€˜€¾7€µU€£% 9€ 8Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ2¸`ð~ðGØW…  <؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„þNø„P…R8…TX…Vx…X˜…Z¸…\x„pwƒQv|`8†dX†fx†h˜†j¸†k˜ƒlø†p‡r8‡tX‡vØbx‡z¸‡|؇~ø‡€xƒnˆ„Xˆ†xˆˆ˜ˆs8ˆŠØˆŽøˆ‰’xŒ8‰–x‰˜˜‰šø‡•¸‰žø‰ Š¢}y8ЦxЍ˜Šª7¶·Š®øŠ°‹²X8‹¶x‹¸˜‹pX‹ºØ‹¾ø‹À¸¥ŒÄXŒÆxŒ}ŋȸŒÌ،̨ŒÎÒ8³ÔxؘžhÚØÞø‡Èà8ŽäXŽrØ è˜Žê¸ŽìØŽîøŽðò8ôXöxø˜ú¸üØþø9Yy ;mod_perl-2.0.9/docs/user/handlers/http_cycle_log.png0000644€ÿÿÿÿ00010010000021455111727205031022720 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæñP}ÿ?³™c'’5B%©ÈG©´ÈÖ‚Bõi£¢RQÑ"JRÒ&E‹JѦ$[¡M(!*i!‘­e˜}îïóûÌÃ×ÖØ&tŸ=îÜ{î9çbî}Ý÷û}ÞïÝ»ww®”~*tPPú?®®® %::†ÝüAîß¿O&“׬Yä 4(99yݺuuuu1bl\SScjj —IHHÒ^^ž²²2œÌÌ™3[¶ÁápD"‘B¡ˆŠŠ x™Í8pà—Ë]¼xñ˜1c:× J?]^Ž‚Òÿ‘——߸q£¯¯¯››ÛÇ›>AS§Nq¹\###…•+WÙØØÜºu !!‘šš*''WUU3fÕªU¿Fmm­¯¯¯§§§ªªjZZ¿BVO——#¦…oΡÑhÐÓ‡Ò˱°°@Séü  B§R^^¾hKëµ£QzÉayB»Ïœ:¯_¿¾sçÌnÜX,ÖÌÌ ÷˜˜˜0ŒlݺÕÛÛªœ¬¬,%%%*•zøðaAæ0gÎ:.&&Ö£*°uëVgoo߉B]¤¢¢bÓ¦M3fÌò¸("::ÚÜÜ:¨Ðé‡444|Ï®]|TãOO¥=.Ùe "´û,…BÙ³g££ãÎ;çÏŸß¾?èöíÛL&“F£‰ˆˆèëë1‚ÇãÝ»wÏÛÛ»¤¤†æ¼}ûváÂ…W¯^•——o§«’’’#GŽLœ8ÑÎÎ.%%¥e%¬ž """55UVVöOåΑ——‡YˆPz-111z (B:ý"?zN{”?Ð_%—-[øþýû#GŽ´˜üêÕ+EEE …2uêÔóçÏß¹s‡D"­\¹R^^ŠuuõÈÈÈvÖX544P(”wïÞ 0ÀÔÔ •Ãf³a‰u´P9 J÷‚ Hcc#…Bét:ÇíͶ1Tè  ü-`0˜“'OΞ=ûäɓ˖-k§Òç–-[*++Ùl¶˜˜XAAÁ¾}û&Nœ(%%5|øpAÜÝÝ fϞݖÊilltrrzñâE^^Þœ9sæÌ™Óc×Ô žžž¥¥¥cÇŽµ±±æ¸((ýX¾÷Ý»wÙÙÙUUUGOOoÊ”) †ÍfŸžc+ «®PPþ"&L˜—šoÚ´©ê̓ ÒÔÔtuuݰaógÏtuuW¯^‘‘ÈÊÊzóæ¶¶v«'þüù“F£‰ŠŠjjjfgg÷Ôe´Í—/_Î;‡ÃáNž<Ù›_1QPú$iß¾}zzzööönnn{÷î={6…B™;wnRRG„N§ÿé™6:(( HKK my´¼¼¼¼¼|òäÉëÖ­ûçŸ7mÚtìØ±;wΜ9“ËåN˜0áþýûÒÒÒ-Ï ÔÑÑ)**lÞ¼™H$öøÅü/‚¬[·ŽÍf¯Y³FKKKÈ££ ôc¸\®¨¨¨½½½§§g³w$AâããçΫ¡¡Ü _0P¡ƒ‚dí« IDATòw!%%I¹¸¸”••ñ÷'%%íÛ·oÞ¼y:::_¾|‰ŽŽ¦R©ššš™™™ÊÊʺººFFFIII×´ÃgÏž………æÍ›WPP „ ám••¥¨¨Ø¡Ôˆ(((¿‹ÅÆÇÇ·Ó&77×ÞÞ¾–[A… Ê_‡………¾¾>“ÉlêÀÊÍÍ=yòdaa!Fc³Ù‰‰‰uuu›7o®©©ÁãñNNN-+Xååå999ÉÈÈ”••…nÜ*%%%œ:uŠ_¥[À`0¯^½j¿µµõ«W¯üýýùåêz ÝpWjlläo#B£ÑzÛE¢  4#((HFF&!!áòåËp±±q³6L&“Ífÿúõ+99YIIiùòåüC‰‰‰FFFµµµêêêYYYB7n ‚ vvv ÃÆÆfæÌ™v2((ý’úúúvŽúùù………©««óx<~q˜–466r: —Ëår¹˜yWW]!B ®\¹RZZúóçÏ‘#GN˜0aüøñà¿Å¥]ì¥'——Xºt©««ë´iÓ¨TêðáÃÕÔÔ>~üج%‡Ã ™7o‡C¤¡¡ALL,11qË–-°àC­8,«Û¢€8p ++kðàÁ>>>]ì ¥UÚ:ÒÒÒÎÎÎqqq‘‘‘­¶áp8x<þÛ·o©©©šH$.^¼¸Óa]:‚äääVWW7Ý/))¹jÕª-[¶P(ƒA š9õQPPþ8sçε²²ºqãÆòåË“’’ˆD¢¹¹y«9Žƒƒƒ'Nœ¸|ùò-[¶ØÛÛ{{{w},ëòåË—.]JIIéJ?ÏŸ?÷÷÷ÇápÁÁÁh┢(㇚——§®®Þ¬AII‰¤¤$@ZZº£`,+%%E$?þÜNRŒözèÄ96›ýåË—™3g6S9€ÚÚZÿ#F,^¼833U9(½ÝgÛÄÂûG'±;cí»=ztĈ¹¹¹îîî“V›‰‹‹[YYIHHÙÛÛw}\.—6iÒ¤wïÞ•””t¥«Ÿ?ÚÚÚ"²}ûöþù§ësCAAi•AƒµuH\\   °cÇŽ/_¾´ _QRRâr¹uuu<ÓADDDÈdrHHÈ‘#G:7óÎ[tš5kªªªÚjÀårïܹ“˜˜˜™™©  ÐéÄ((=Çt{åO*ßÇVèÚ ‘I!ÿ.Q.&&våÊ•™3g^¸paÊ”)¢¢¢M£î 0ðNMMMMM­‹#"òàÁƒƒ*((\»vMKKëÎ;îÃá¬X±¢®®nÒ¤I®®®¿mÏûAüÿ›~l¶‡¿Áï¤eþ¡ïß¿3™ÌN_ J/„Ëå*))5Û9tèЇVWW<0uêÔwïÞq¹ÜVÑçÎûõëW'†wss{ùòe'Î…tRèÀ=YYYí´QUUuqq±µµ%‘Hð.€‚ÒÛ˜¼j¨Ä@âûØŠ™ÎT™!Í—ê <äé™Â”‹ßjÊÕŶ«h+ÀCoî–%øçÿüB@0‚ò%¹JfÙ-Ó C£#òõëWøÖ‚Åbùo0M·mâ´z¢ Œ3æðáÃ[¶lqppPSS£P(-…Ž‚‚B«‰s:JRRÒ0̉' ùšÅbÁ„ª­ÂãñX,‡k+Ýêž={RSS)ʧOŸ¨TjKÕÒLÍtý¤»VŸ-_¾<%%åË—/ÝÒ J§a0- ñÞ¾}{øðál6›F£9::ÌÌÌ`Iàf :T·‘–¤§§w⬦tRè°Ùl<O£ÑÚj ¬¬œœœ,++[]]]\\Ü–_-99yêÔ©›€N§c0‰ÔéPPÚ!bGnjH‘ªœ†±B~JuÈÊLËãc'٠θU¶![AUlòªa¥oë¾$Wtlw´6›=a„˜8ÿ+šÑR-‰D&“¹páÂVm´8îøñãbbb6l¨­­=qℸ¸¸³³sMM¯¯¯„„ÄÎ;ýúååå%!!áááQ]]½{÷n)))oo着* óõë×?^¾|yÑ¢E|F ØlööíÛCCCÇŽûèÑ#‡[·n3æÙ³g«W¯ŽŒŒTWWOII)//7660`@\\\YYÙÌ™3 BQQ@Ð××°@#ö?š^;üØt£CüNZ6àb2™Ÿ?d>³gÏþúõkËý‰‰‰ð¡2mÚ´ Ò J‚Åb§L™B"‘ Ücnn®££ãååµwïÞ¦-½¼¼jjj¤¤¤ZíÇÜÜ<''GðqŸ>}Úé9óé¤Ðár¹L&³7${{û+**¶ÚæÛ·oS¦L jç•®-ŒŒŒ† B&“ëëëQ¡ƒÒü*¦§].2Ø8|‡:€ÇEÎ/}{ð“¶µR±/ƒÆˆoz8/‚\_Ÿy»t¢es»® ÀêQM=&Ͷmjj¨hµ“Í„J¥æçç·z¨±±‘ËåòÍKâââð.†Ç㇠×^‰ˆˆŒ;n“H¤iÓ¦Á¸`QQQ2™ C÷<ˆÇãMMM¡2À`08nÓ¦MÓ§OWPP>|xÅŠ°Ÿ   WWW¸ÔBNNîÖ­[p[^^þðáÃÿþû/àìÙ³FFF,«©LiªfšîïÄ/¨äçç/Y²D–NNNqqq>´²²‚?®ÂÂÂÄÄD~ƒµk×öÔ,QP:ÌM–•••‘‘ È•+WÊÊÊš­KÀ`0ªªªíhƒÒÒÒVÅ}[p8œNÏ™OçctðøöΕ““ãr¹………Ïž=›2eŠªªjÓ£<¯¾¾^FF¦¶¶–5î"""ÒÒÒ ¿~ýj((¥8«6È2Ý=à<† @Ûêÿå ‡™°pPøãÚOVõ·ÆiöÊPåFϑϼ]Ú‰±DDD233»mêÿK3IÔR5ûÈ`0¦NZSS£ªªª­­ðãÇ~oül§Ð–·ÅÄÄÖ¯_·) TQQÑ¥K—Âm2™laa·—,Yãåååîî¾k×.kkk<O äååù÷III===¸M F·ñxüˆ#àöçÏŸ¸\î¦M›.\Ø?|haa±iÓ¦Gåææ&&&‰Ä˜˜ggg˜5äÉ“'00kÖ¬ÂÂB‰tóæM ciiI§ÓGŒñðáÃ7nìÝ»—ËåBƒ““Sll,<ÝÞÞ&˜}úܹsº>”¾ ›ÍIOOߺuë‹/0L^^ž¢¢brrr³–ü·”^E'Í!ð=@II©¶¶¶é~___ssóªª*´´4MMͧOŸŽ=úãÇM×k`0‡sêÔ)99¹NŒnee5hР†††ÎM…OêåâOO~Ÿ, Ià?¿4(¨Ši™+ÆüTøò—üH±‚Ôêâ7µÆ{Õp"ØY[UÂ6dû$«È•¼­ûú²3K z!T*õÙ³gúúúQQQ6l8{ö¬™™YtttHHH÷d`````ðúõk??¿ÆÆFÁ…ηoßLLL*++§N ER÷NìOÁ``0˜É“'ìììüèÑ£øøø¦-W¬X¡®®¾víZ[[[,K&“ÏŸ?¯££ R©¦¦¦ÐŠ044är¹ðt‰çìììààptt Z»v-šþ¥}`öš«W¯ÂÜè§N:{öìêÕ«£££gÍšÅÕ•––^»víúõëy<^oûbvÉ¬œ››Ëÿ8mÚ4—ÏŸ?KHH„††9räýû÷€ÌÌÌ–ÑÚ€76si Haaag§Œ‚ò?<=óµ² RÔòèÒ3ãŽO¿þýó³ª*«Sš:ÖJ€‰Kaq˜Dÿ/©—‹$IÆ ï¢{£Q§P©ÔÈÈÈ ܼy‹Åž9sfÁ‚ ,艱´µµÃÂÂ*++,MõõëW33³ïß¿5êÆ]ϧÜ{¸páÂÅ‹aֵߢ««kff ©ÚÙÙA•# üjesæÌ‰‹‹«ªª’——ïÄ„Qþ d6lØŽ;|}}áN‡³fÍšŸ?îܹóúõëæææ<ïìÙ³0ÃFëoBgÆŒüÅ ÆÏÏF£Mž<¹²²’ßÆØØxüøñmÕ§HIIé‹ÝÄĤýê©((bçËéíÅ0³¶Rgm¥¶<4~¡âø…ÿeŸr±è]t‘ÒOÞŒ'NœnmmÎd2ÏŸ?ߣ·-ͺŸ>}255­¨¨˜4iRTTTR9*•Ê/:ö[NŸ>¦©©‰ ÈÕ«Wåää6nÜØ´?´e:Ÿ´´4*• xùò%‘Hlki ‹Å&$$,X° åÒ®]»p8œ‹‹ËñãÇ+++ííía-—Þ™š¼óB§±±ÑÉɉD"UWWÇÆÆÚÛÛëèèìÚµ«©ÊÀ…åmYGY,VEE^…kjj:=a”n¤º˜þ*´˜ËA˜4NÆÍÒáºÒ™þóèÕ×׿uëÖÒ¥KïÞ½[SSþg…Å«W¯,--kkk§L™ÑoTNtt4ô49񮮠^\\ ­×AAAêêê ,ððð ?w5k–¿¿qq±›››„„\âzèС¡C‡~úô)-- ““Ãeöòòz÷î]]]]||üŠ+úÍO¥Û),,DdÞ¼ym­{Úµk×èÑ£œœ¸\njjjïŒÎt^èTVV***:::–––Âeô>ä[·øÌ˜1–òêÒ4QPzßÒk’Nð8Œ5s€…ïè?=£nfêÔ©ÑÑÑ‹-züø1´Ý¶³ø G¹uë–££#‹Åš3gNhhhº™;vìÛ·o€k×®IKK›››ó_ˆƒƒƒá!Àõë×ãÇ_°`Á“'O £¬¬ f!DEEÙÚÚjhhhhhìÛ·/000))‰B¡¨ªª~øð!##cþüù°+“Gq¹ÜÿýwÇŽB¿b”>ƒ²²òºuëÚYÝÍår­¬¬²²²”””z³Ê:,‹D"íܹ“D"íÝ»—F£y{{ûøø´\=¯««Ëd2ûÓ½ ü¯ëª¿¢©©™˜˜¸páÂÜÜ\55µëׯ sL&ÓÍÍíâÅ‹€7zyyõ³åÐMSæx >0²)vvvpV«lÞ¼¹ÓƒPþrrrdee» ¡¡¡ÁÜÜüÕ«W¹¹¹p…fï¤Ã®w˜xãׯ_ÚÚÚÇŽóööž0aBUU•———µµ5¿wtt|ö왼¼ùàÁƒ–µÍÛaàÀ0ðƒÁØÙÙq8×Ñwž¼¼<• DGG7;TQQ1kÖ¬W¯^…††>xð@VVt_ž1”?ƒqvv611±²²*((˜>}úÆÝÜÜ\Þ!²²²ìíía­¨­[·îÚµ u|w„„„?=”>›ÍÆb±*2µiÓ¦ìììö–×ÕÕÅÅÅut2ïÞ½«©©ÑÑÑ9|ø°˜˜ƒáñx=(tÔÕÕ7oÞÜRå@***ÌÌÌ’““ïß¿ßVq+”¾‹ŠŠJZZš¯¯ï±cÇNŸ>}åÊOOO›î"¥¥¥ÞÞÞ×®] <øüù󺺺ÝÒ3 ŠàÖÖÖvhóÛ·o322ää䔕•Ûjó vƒ!..+îµSH«-ÑùôéSIIIû)Ãß¼y³|ùr%%%è FAAégww÷´´4]]ݺºº-[¶(**ÚÛÛµ’nQ@x<^BBÂæÍ›544®]»F ¶oßž™™‰ª”?ÂÈ‘#÷[ñ¹ÿ~;*@ê[·ní\N/A_ÅTUU·lÙÒ2kP3"""üýý{anD”naäÈ‘qqqÏž=óõõ}ñâÅÍ›7oÞ¼9qâDkkksss"’’’ÞØØÀb± .~Ÿ>}úôéÓóóóOœ8–‘‘‘‘‘áâ⢩©©««;dÈeee999QQQ‡SWWWZZZYYY^^ž‘‘‘””õ `È!ÎÎÎ666ýãë,&&×gü鉠´‡±±1ºŽ¯%P©dffvôÄìì좢"×™³Ù솆÷íÛ7UUÕÁƒ˜™™©¨¨Œ7.11ÑÑѱՂ•Û¶mk,ïçç§¥¥HMME$&&FOOOBBBðÛ…@BçíÛ·D"±¬¬LÆl6{õêÕéééL&ó·ë­¦L™Ò,“rû4½0*•ª¤¤„þ¥¶DQQñò…Ð?= ”ß±ôƒ¿^*•zòäIŸ+W®¤¤¤<}ú4'''''GsGŽ©­­miii``ÐÃÓ* W¯^ýÓ³@Aé t:Édv¢ $‚ gÏžõöö¾sçÎË—/MMM§Núýûwƒ¼nݺٳgoذ6ž9sæ‡ìG-ZPUU]´hÑýû÷9ލ¨¨ =$t455Ïž=+àœ™™™×®]k'iäÉ“'yyy‚wËGCCƒL&ggg“H$:Þ‰ú7¢¢¢sçÎýÓ³@ù‹uppppp@äãÇ©©©oÞ¼©¨¨¨­­ýþýû÷ïßEDDFŽ)...++;jÔ(mmm}}}á}QPP§ººúÓ§OóëùùùÙØØÌœ9ÓÑÑÑÏϯ¨¨èçÏŸ‡úðáÃ?îܹãïïÏwm—””dffJII!RWW7tèЂ‚eeå²²22™ŒÅbkkk•””Þ½{Çb±Ö¬YcllÌår °aÃBBBà¶ ö  ÐÁb± M:þ|;BƒÁ`±ØU«Vu¨Ï¦§(JCC…Bé\'(((݃QWWWWWçïIOO7227nÜÇÿàÄPPPaðàÁ7nÜèܹ,ËÁÁáÙ³ggΜ9tèÇSVVŽŠŠâa±X‚¼}ûVSSSAAH$ÊÈÈ`0)))%%%2™ ½T,ëãÇcÇŽ]·n««+@TT”Íf3 "‘H$EDDètº Bç÷ñ°ðx³¼ã¿%%%¥ªªª-/5ô@á; ‹ÅÂb±EEE'OžìЬPPP„ ¼´UÖ¥·ñãÇNŸ›œœ|þüy ‹W¯^ 2„B¡Ü¾};##ƒÁ`TVV}þü999YAA!**jüøñuuuâââüðáƒÁxñâÅëׯ"""ŠŠŠÁÁÁ“'O¶´´d³Ùt:@ H¤´´´uëÖÁÒRzÿoÑIKKSPPèP$ €ÃáÄÄÄXYYµz®ÉBäþýûâââåååm¥JÄ`0Ó¦Mkº§ªªJYY™L&»ººÂ¨‚0ŒžÈ]†‚‚ÒE ÐA×`¢ ô~»¼º}vìØajjÚØØ8|øp ªª*++ûþýû±cÇfeeMœ8&$œ8qb^^Þ”)SX,Vtt´¹¹9<=00pâĉrrrzzz+V¬ÈÈÈ5j´è„É“'ó—4 ˜Äë÷´´´bbb:qµQQQM½Wß¿—‘‘)..–•••““KJJ***Z¹r%€Á`xxx´: @hVG°¢¢"33ÓÞÞÞÌÌÌÚÚº¾¾þÉ“'&&&t:Õ:((½ Xµè  ôº(t~ýúµuëÖk×®566r¹ÜáÇ$$$˜LæèÑ£ét:•J…-eeeaMÓÕæÊÊÊ …Á` 6ŒËåŽ=>Ü›EÁââ‚Lé÷B‡B¡tb¥àÁƒ%%%8Î××WQQZŸ*++ _¾|éååU\\ [’H¤uëÖùøøÒí!CàÆÉ“'ÍÌÌÄÅÅ>|øáÃèÆCAAéU@¡ƒZtPPú ªEÕ*ׯ__¹r¥¡¡!›Íæp8ÍŽb±XÇd2EEE±Xlvvö¶mÛøG‡ Zÿ¢\øQ8ÍÖ“wóòòÎ :¾nݺèèh555‡ôôô›7o–””øúúVTTðx}’——g³ÙõõõT*–Ùúúõ«¤¤dvvöìÙ³555a~ooï²²2F$ÑêZ((½ 4F¥oÑ-i/Ö¯_ÿöí[2™ Í0ü>322&Nœ€+4ÇŒsöìÙŠŠ wpp1b—ËíÞ%™¿:0wPVVVçz‰‰¹uëÖÚµkÓÒÒ† °´´´´´lÚæñãÇãÆc±X<oÈ!åååjjjÊÊÊ8ŽÃáHJJb0MMMX/¾¡¡áêÕ«6lÈÉÉ1 ŒM&¨ÊAAém B¥O€  ‚ÏÖ.’ŸŸ/##³xñbggç &ð÷:ôðáÃ÷îÝKKK“““ËÌÌ|¸hÑ¢ÆÆF¸¿'ÒkýFèðx<¸ê½Ó”••¹¹¹À`a,;gÎ2™\YYY]]=tèЪªªñãÇççç;6//Öa_±bEjj*@BBbåÊ•4Ëå–––ÆÆÆ8ü§À  ÇÇÇæ’o«Ê ÊŸ:((½‹E£ÑV¯^A¥RõõõŸ>}Ú-=———ócTZÂáp’’’f̘Çã{®Ìo"y<^°gÏžMKKC¤±±‘D" 6 0dÈ999%%%§ªªÊd2©T*Tsüñ°*@ÀápC† !“Él6›Ëå6[T†Á` ªrPPzh02 Jï‡B¡@·Ñ¹sçBddäž={ÉÅ×tuuŸ>}êååUSSÓ£‘'Â:<ÏÁÁADDäõë×Ð8Ö ÀåraõÐõë×ó«`ð˾Ö0H»åÛ!™LFÓÉ£ ôBP‹ JŸ€Çã-Y²dýúõîîîâââžžžt:½°°pÆŒÝ>–ŠŠÊÍ›7SSSµµµ¹\®””TÚ)~#t0L·X“²³³;6}út‰ÔØØ(úÐT#""‚ÇãDEE îÝ»Ï1bÄ®]»D"±iû®ÏE8 ”>N·°° ÞÞÞC† Y±bÅåË—œ””&+++xW8nÖ¬Y­žB¡P>œ——·páBe+„gz›wAh4™L–€ ¦ºÈŽ;æÎ{øðaiiiþN óèÑ#SSS‘Å‹[XX ><++ëÍ›70W´ŽŽ\o…‚‚ÒA-:((} …"%%5kF†” IDATÖ,@iié•+Wþý÷_yyù«W¯Z[[Ÿ9sFð®üüü=zôóçÏèèhOOÏéÓ§mmm//¯êêjWWWè½é¹ œf´ŒŒùAôõõ¯^½ÚõÁâãããããcccUUU‰Db~~þëׯþüÉoe``P[[+%%Ë“¢·H”¾ *tPPú Ð{Õ´JAuuõòåËaV¼#GŽÀBT¿¥ºº´`Á‚ùóçïÙ³*@rr²žžžoíÙ“ýüü`±»»{7ùôéÓàààÓ§OÇÆÆ6U9œœœ÷ïß«©©‰‹‹£yqPPú:¨ÐAAé+Ðétssó–†–½{÷²ÙìØOYY ""bðàÁªªª6l¸sçÎŽ;ÆŒckk‹ H³—Ë¥ÑhüæÝN›B‡F£YZZš˜˜TVVªªª¦¦¦N›6­Gíbbbûöí+--8q"?L¥OƒÆè  ô ÷jöìÙÍöWTTÀ´~ZZZ‚ôI§ÓœœŸ? ´²²òõõÍÍÍýö훸¸8•JýçŸLMM7lذÿþðððÜÜ\èD‚wŒî¥Í»¨¨¨ººúÀ'L˜žžþÏ?ÿ<{öŒÉdÆÄÄtÖB<ÞÁÁáóçÏoß¾𠙢  ôiP‹ Jz¯Zî?vì—Ëuqq¤“?~\½zÕØØXEE¥åQƒQPPðòå˨¨¨ÀÀ@[[[]]]QQÑ)S¦ðx<:ÞÕËø_Ú:ð ÌÒÒ²¤¤dÊ”)ººº[¶l‰7oFsttìÐ0ZZZS§NmuýØÆ+**ëêêzzz¼”Þ *tPPú £UïÕׯ_oß¾miiÉÏùÒ>¾¾¾€ŽÛNII¹pá¬UÞ´gO†Þ+‡ÃyõêÕ‰'LMMÇ—››{òäÉI“& 8‘HÌÊÊzþü9‹Åº{÷®£££ººº˜˜ØÖ­[KJJNŸ>ÍápQUUí† BAAéM B¥!***))Ùj___<ïìì,H?ùùù<°³³SPPèÐ222:Ô^Ú:¢¢¢jjjcÇŽmº3''göìÙ ãôéÓŽÁd2ëëëß½{—žžnjjzêÔ©>Ô××ûùùQ(”§OŸÊËË£IQPú%Pè 1:((}.—Ûª÷*++ëñãÇ+W®¤P(‚ô@"‘Œ;4:FëP{AhïîÃ÷^5Û_QQáã㣣£3g·)++#‰“'O™:uª‡‡Ç… Œååå333[¶çr¹õõõÝî¨CAA2p*tPPú L&ÓÜܼÕúK—.¤ŸœœÀðáÃ;4zOßõ„Þ«={ö4ÛêÔ)WWWWW×øøxA†¹víÚþýûgΜ™˜˜øâÅ‹/^ðmݺuß¾}òòò ——WPP1bÄÈ‘#GŽ9jÔ(@OmGù-t:ýÊ•+ÝÛ§®®®€Aû(ýÔuõW ‹ÅêÞ> *”…‰¨¨(ÀÈÈ(**ªÙ¡{÷îUTT888œ?þ·ýTTT ëp7ƒ@ ÈÊÊ–——·<ÔÐÐЩY·Ço„…BQUUÕÔԄҌϯ_¿‚‚‚œµµµÉ tæÌ™;wnݺ511±åÑúúúúúúüüüfû±Xì•+Wlll~Û?J·C£ÑvîÜÙ½}‰ÄÈÈH]]ÝîíV8p8œf¥dQ:………&LèÞ>gÍšÚÓ&Qš½W-…›Í¾pá‚››› ~ “——Ç߃Ãá6mÚ´qãÆ¡C‡ÒéôÏŸ?‡‡‡=z´éYÀ¢Cg,--› ÀñãÇ]]][ú¶ZRYYyùòe{{û1cƼÿ^ÀÉñx¿ššš’’’ކm ÈÈHAœwÉÉÉ“'O>sæLŸ»Q(”nÉ‹ŸŸ%..^__ßÛ´Nuuµ€“ 100¸qã†ÐJ´ôþZ¡SZZêããóÛfÉÉÉþþþÔÖÖ¬„ÃàÁƒ>|Øõ~Þ¾}kii‰Çã>|Ø;µŽOK)ÐŒüüüÊÊÊ 6,X°@8³ê:Ð{5gΜû÷ï7;TXXøðáÃ¥K—nß¾½¶¶¶Nttt¸\îâÅ‹¯\¹2lØ0@VVÖ¥K—îß¿¿{÷îéÓ§·zÖŸ: eäÈ‘ãÆËÎÎnvèСCvvvŽŽŽ‚$úôéSBB‚……E‡„ ®®N^^¾C§¯_¿&'' Ò2%%eéÒ¥GŽé– ©}yyyƒ¨¨¨Þ¦u8nÈ!í4¨®®®««{òäÉŒ3BBBFŽ)´¹µC^^^÷VhévJKKÅÅÅ###¬’ó§ðññéÞßiMM€%¿~ýjmm}ñâŶný9ǯªªêZ'**ª¾¾^–ûöí«¯¯0Œ·7½W-…àìÙ³sçεµµ h§‡I“&åææ:99ýüùÓßß?$$„N§oÙ²åðáÃd2™Ãáàp¸–5~+;Áï…ô^-Y²¤¥ÐùðáCZZÚÊ•+wïÞ-ÈäÞ½{gdd$))Ù¾ lFOè»îÅØØV|mA¶nÝ øðვ•Õþýû[MQð—pèÐ!@/Ô:RRRáááí4ð÷÷¿qã‡ËÍÍÕ××?~ü¸ NÛžæ×¯_ÅÅŦ+Ei ŸšššžèY^^~Íš5í4¸wï^nnnUU•……ÅŽ;¶oßÞçì¾= ‰DºtéÒ¿ÿþÛ;µ`ëÖ­íL)333>>žÍf:tèõë×û÷ïæô:ô^‘H$ƒÑìPtttII‰½½};B‡L&khhYXXDGGOš4ÉÃÃÃÌÌ ƒÁ@@&“i)tzÂú+Pp%F³²²j齜={6$$dÑ¢Eׯ_ÿm?•••…–BgþüùM+¦6½—ó‡ ÖNBgø‹Ä`0ãÆ{óæÍöíÛ­¬¬\\\þN÷‡ëµZGÖ®][XXgooÿüùó#GŽüñè1IIICCÃ?;‡¾N```õ,..njjÚNƒ×¯_çææN:5%%åСC)))ÁÁÁ è¡ùôQTUU{³Ö™?~;Ú…ËåÆÇÇ=:??ÿÑ£GyyyGŽ=z´0gØ øÞ«ÈÈÈf‡8Npp°‡‡ÇäÉ“SRRZ=}üøñx<þèÑ£x<þùó纺ºL&óòåËÇŽ‹‹‹kgaGO<îêQTTTEE¥Õ…Á7oÞ¬©©±··¤ :þõëWþžQ£FÅÅÅUWWGGGÿüù3++ zòšB£Ñú‡ƒÿìÙ³...áÆvvvEEEzF¨uLLL-ZôòåË?=£@&“=<<ÜÝ݉DbhhèÌ™3?þü§'…Òç122:yò¤ŒŒÌÓ§Oõôôž={ö§gÔë€ZGFFjžppô(êêêׯ_WWW/..¶³³ ûÓ3ú=meœ9sAkkë¶Î…‘Èîîî·nÝ7n—Ë={öªU«Þ½{WXX=E F8„TX­^0N ™>}º útÒ¤IoÞ¼a³Ù¢¢¢;vì(((xÿþýœ9s0Lii)‰DÒÒÒjù~L£Ñ‚ óìý,Z´èüùóƒ†n¬n‰×ë‹ôi­011¹xñâ°aàëæÍ›zF(}mmí«W¯jkkC7–¯¯oO”qîÓôu­£¤¤¼xñbèÆÚ¶m[/Ì`2™¦¦¦­­þüÉb±$$$Ú:wòäÉt:]ZZA‰„Ãá~þü ½zõŠŸ[™Ãá4;ñYtÀÞ«V!ò[£ŽŒŒ •J­¬¬|þüyee¥ŒŒÌ¹sçôôô–.]Ê`0Úråô‹DMMíò分† Û·o?xð`·ç×êµ”””XþÇÒ¥K ¥¤¤LLL`Õú>•J ™;w.N···wrrjéÉFAé²²²'Ož\µjàСC .ä?þf~ýúuç?Þ¾}kccC¡P>|¸hÑ¢>§uÂöíÛ½½½ÅÄÄ=zdee•››û§'Õ&¢¢¢âââsçÎmõ(—ËmëÑ,""2gÎADEE[Öwº}û6‚ ðw×»„ލ¨(•J?~|ËC>|xþü¹téµ…¶¶6ƒ111™Ýˆ‰‰ÉèÑ£ÝÜÜzÕj,”> tcíÛ·ïõë×ój,iii˜0¶%ÙÙÙ_¾|a³ÙBžRwÝX'Nœ¸}ûvo^Åb±æÍ›wòäÉË—/7«+Þ–EGDDäèÑ£49L&SDD¤®®Žß& ..îË—/RRRãÆ#x<žD"Íœ9SÀßÑ”ö0s ››[ËC•••í_¿~>}ÚÅÅeÕªU %77×ÍÍÃá´_S©½¡ëàÁƒIIIý{5‰D;vl«‡zm’$Án¬Ã‡÷ªÕX(}èÆ:þ|HHÈ_»kðàÁhõÐÁƒ¿|ù"äùt/Ð5aÂooï^»‹L&s¹\'''''§wïÞ]ºt)44ôÇ.—Ûrñ”””Tll¬ššZS›‘Hô÷÷/--mÚ’@ øúúÆÄÄÀÌ5'N\¸p¡‹‹Kccc·_E4…B¡R©­–2`2™W®\ÑÕÕURRjëôI“&Õ××üøÑÉÉ A—/_jhh\ºtéÓ§OM›µŒ¿ë¯È_ëÆêg n,”nucý ô~74Ìðx¼áÇûùù•””DFFZXX ŸÎ F[[{Íš5gÏž---ýçŸx<^³Ðœïß¿7ëVJJÊÕÕºzêêê0Xû10£B‡Ÿ9°Õ£° „””T«G©TêÀ rX,öÇPñegg³Ùl~ Lÿ?Sì¿>èj¬þº ¥ÛAWcõ{úÄj,,‹Çãa0óæÍ‹ˆˆ••USS‹çp8éééÁÁÁöööðEÿÔf³ÙÐBãççwîÜ9 µk׿ååq8œÔÔT?© Êî¡¿íŽiˆvÖ^µ_ÑÆÄÄ€Åb[fyb0ñññ"""P÷'4©}._¾ß2Z¨Gù›Wcõ'ÐÕX(ݺ«ßÓûWcAûMAAN'\.—F£Q©ÔáÇ.^¼›©©©Á XˇÃ%%%ÙØØ<}útõêÕoß¾ RSSãW½{÷ndee 2~üòå “ÉìÆ%u: eøðá'Nly¨}¡cccÓÎ7ÓÊÊêúõëÐbԪвæ(((pqqYºt)”œBucõP7J·ƒº±þz­ A SQQA¥R¡'ëóçÏ0ó‹ŠŠ ‹}òä lÉáp~ýú6l˜¯¯ï¶mÛ¤¥¥uttšÊ‰”––V^^ž––Æßùýû÷I“&íÛ·¯ººš¿> ´¶D©£tLè`0˜ÆÆÆëׯoÙ²EFF¦é¡v„޵µµ¶¶¶´´4™L®®®ælll´±± hhhL™2E__Ö¬YЉóï¿ÿvh’]ŠÍÜÜ\{{{(B…9ºÐÜX_¿~…«4û=ñññ/^²…¬»ÜX}.SÈ߃ð]H½ÁÕw:u‚ÚÚÚ–Ñ=JïtcADqq1€L&³Ùluuõ¯_¿fgg7‹ÅÁãñïß¿_³fÍÁƒÍÍÍýýý§L™2`À€ùóç7ëSWW÷Ö­[Íþ€™L¦§§§®®®ˆˆˆˆˆˆŠŠÊÛ·o»þœêpø‹ˆˆÈðáÃýýý+**îÞ½kffÓÃDËlcc㢢"þ!&“ÉãñvíÚÕ¬¥¬¬l```BB‹/ž>}:eʔÇëëë· kêià7ÙÊÊŠB¡¤§§ÛÚÚnÙ²¥  @hŽ+77WEEÅÍÍ †Ð÷c*++·mÛ6nܸÀÀÀžéo‹nqcmÙ²ÅÓÓó/‘¤} ///WWWž(4þ¸+66vÑ¢E™™™ÂôOQTTd``pîÜ9K”w BvcEDD8;;·ÿ ß¾}ƒQÆð#‡ÃÑÓÓ«ªªº{÷.lS__8sæÌ„„„C‡8qBJJ cZªƒáŸÛåååâââ]BuXèàñx¨l¸\®±±ñ½{÷ÊËË;F¥RÁmmm+++ˆˆˆ|ÿþ}èСü)//oVÕ‹ÅJHH888ð5……Fi§úWÁ:ß¿wssMJJZ¸páÞ½{ËÊÊ„3ḱ F`` –––»»{?öúÃ?Ëòòr77·qãÆùûû í¶Õu7Ö?üýýµµµÃÃÃ…ìÃEi¬­­½zõj¸DV8üY7ÇKJJš5kÖÒ¥Ksrr„6î‹ÅÖÖÖÌ™3çôéÓ=Tâ¾U„æÆ¢ÑhǧR©»wïnçaJ¾; &Ïš5KBBÂÇÇ'55–gŽŠŠòðð€¶yyyø@ÿüùóýû÷›öÆd2Ùlvû·ƒ JJJ6l ê _ÐD$1LUU‘Htvvvwwœ8q‚Á`¤§§‡‡‡ïÛ·ÏÌÌŒÇãA ùðá‰DRRRzÿþýÂ… utt¢££«««¹\î”)Sjkkù·òœœœ1cÆäææ2Œììì>|ÿþýÇ555=gQ„BGDDDJJ fkظq#¿w‰‰¯¯/ôA ucÁµ´´4N?sæÌ¸qãvïÞÝ/å_«¨¨TVVzzzjjj:tHh¿Ç®¸±`–­òòòõë×Ïš5ëõë×Ý8±™3gªü‡††ÆªU«Z®Ei ˜*‰ÃáDDD˜››ó#„ÀŸrcÁ/‚ qqqË—/ÿðáƒÆý#Àç´ˆˆF š7ož¿¿Ó¸‹E8n,è¡Ñh1b„··÷oGár¹µµµ æÕ«W—.]"‰žžžË—/wpp€‹Ã›¥¡™4i’©©i³N‘””„Û eçÎG½xñâ½{÷ž={öáÇ’’ðßo¡+tÞX’——§®®ž’’²`Á˜÷Åb?Þˆ¥¥¥9ΨQ£`c‹Åf³)Š””Ô¾}ûÞ¿óæÍ°°0˜Úóëëë›æÔY¹råû÷ï<ˆÁ`ètznn.ƒIOO¿xñ"_uÂe\ЙÇ߀|úô©¬¬,,,Œð"""üm<›Z>ìù Äxúôé­[·îÝ»7,,,44ôîÝ»+V¬°³³ëôOOpz.© :3fÌØ³gÏþýû###.]º´zõêM›6u½ÿ‚Ûq¾~ý PQQ KLLxð`áÂ…rrrÿ!--Ýê÷ ŸcÇŽeff-Y²ÄÃÃCQQ±ë³Ú´iSlllBBÂ’%KˆDâƒìíí£££»Þóß:+W®”••=wîÜÓ§OŸ>}ª©©¹iÓ&333!Là$„rjþüù£GˆŠŠŠŽŽ677ß¹sçÈ‘#{tháß‘F}æÌ//¯ØØØK—.………-Y²dåÊ•BÈß(„¤‚PèÌœ9˜˜èîî~âÄ 777{{û–YO¹\ncc£¸¸øû÷ï½½½‡züøq999À£GV­ZuêÔ)AÄÅÅÛ>^_¼xáááÁápôõõœœ‚üüù³ººZII‰Ãát—?§“½TVV*++ÿüùÓÄĤººšB¡¤¦¦êééNš4) @[[Ö5MKKûçŸðx|bbbLLŒªªêöíÛíííi4‹…løÓTPP8|ø0wøðá/^¬ZµjÞ¼y£G&‰ÖÖÖû÷ï×ÒÒ*--e±X\.—N§ÓéôV'YWWוÕ.ÍÄĈ#BCCwìØ±cÇŽØØØ3g΄……ñ—Òõ(ÐuçÎãÇ߸q#""BTT”Ÿ©‰Åb±X,uuu Ÿ”¿Ý€Û0ZƒÁhiiݽ{7++kÿþý÷ïß?uêÔÅ‹—-[&„K㫈ðx¼ßª–NÁÿ>Ïœ9óÇ“&M¢Ñh'Ož ì¾ëhèÆÂb±111QQQQQQÍP(¾î‘””„%%%[[[GGG??¿›7o>xðÀÙÙÙÑѱ‹S233#‰ Æ SWWß½{wEE…‚‚àÙ³g'Ož|ÿþ½˜˜˜¾¾¾³³sÓŒ W¯^½råJQQ—ËUTT400ðòò266þøñ#`òäÉd2ÙÖÖvóæÍðOŽÇã]¸páÚµkeeeªªªNNN°ìÉŒ3Š‹‹ _½zÅ`0455÷ïßÏMjk¬ßΰsðx<:Î`0˜Lf³ÿ›}„ h¥¤¤Ž=º{÷î³gÏžÜþþýûƒŠ‹‹ñx|rr2@MM- àñãÇîîî©©©[¶lñóóÛ³gÏÊ•+ùa¸L&“B¡¼yóÆÓÓpìØ±±cÇæååÉÉÉq¹ÜÙ³gËÈÈXXXQ(~:ÁvPRR oºƒÁÈËËw{ºüN 99¹üü|…ÆÆF™Â‰'^»vmáÂ…ü6ð>¥¢¢âëë +¶øûûCfll,!!Ñ4À–Ãáàp¸–&ýäädøk€,Y²äæÍ›üÌß<Éd²X,øSÖ®];}úôÑ£G³Ùl˜Ý‚Vw²Ùìׯ_×××·´šðx¼OŸ>ñ;,K˜‘­#FŒ­­­åp8ü$K|***ºØ¿¦¦æÂ… SSSüøÑÐÐðàÁƒ.vØ!~þü) × ÷;`b«¦ëëë?þÌ7¹GFFîÝ»šg©Têúõë·oßÞ³—÷yòäàÁƒW¯^µµµí®¹UTTÄÄÄHIIÁ’ñññŽŽŽ£G¶µµ­¯¯øðazzzLL …Bäææîß¿_GGÇÀÀ ¾¾þÑ£GÐ+ïàà÷òåK33³êêêÓ§O“H$€‡‡Çõë×§N:{öìW¯^mذáСCK–,Ñ×× }öìÙܹseeeããã׬YóìÙ3x£lk¬ögØ!êëë—,YÂår FË í ÒRRR;wî477?~<ƒÁ(** íè4:††ÆÈ‘#_¾|YUUUUU%„a¬ÆÀOœ8±k×.*•ÚØØ~ëÖ-!ŒÎçþýûÍ‚?ºNˬ"|Ÿ ¶¶ö>|øðéÓ'&“ùàÁ¡­A4hÐøñãóòòØlvyyyyyy;„ËœùÀGóŒ3RRR¢¢¢–,YR\\¼nݺ   Û·oËËË“ÉäçÏŸ{zz–””=zÔÔÔ´ººAuuuð_--­ÀÀ@kkëC‡2™Ì–™óšò[ÃOwÑI¡ÃårEDDØl6¼'*++ççç[YY;vŒïÐIMM={öl}}½£££««+—Ë…jÖ0§Óéd2™ßaeeå·oßàËk;ÈÊÊ6ýˆÅbÉdrÓ~øHHHŒ9ròäɸ:++«>4:,+44Ô××¾­ÊÊÊÚÚÚZZZ^¸pAáx<Z§á‹ÅÎ;ùÑì‚<þ<99ùäÉ“‚ðw¶ºÑlgBBÂŽ—Ä.Ô IDAT;0 ‡Ã å׎¡R©Û¶m›1cFÓWêžÆÁÁaÍš5ðݱ}:Ñyllì²e˸\n\\Üž={ wuÈ!®®®ÖÖÖÕÕÕB:t:Ý××766`ccsäÈ‘–·4­® µµµ¿~ýrqqÁãñðá““súôéW¯^Áö ¦ººº["3 áZLLìøñãð/ßßß_RRrêÔ©YYÙiÓ¦EGGߺukåÊ•à?s ‚ D"QSSsÁ‚ЂkbbB"‘ââ✡¸qtt Z»vmyyyXXØš5kvîÜ àr¹«W¯öóó[¸pá”)SBCC/]º¤§§ÐÔÔܶm[YYÙàÁƒÛ«ývþ˼«H$"‘Øô¸Û Pè|üøÑÍÍíîÝ»‚ÈÉÉmÛ¶MOOÏÀÀ +¿ùòå‹››[QQ4êéé5µUðm­îlÜ›µjüàr¹™™™÷ï߇ßÄŠŠ ???þbF;;»Õ«W áª!S§N;vlKûSK3´Tµe¦â7sss[±b…¢¢"l_QQáåå¿b{÷ˆ‹‹/_¾ÜÖÖÖÈÈH jkk===_¼xÁ`¬­­,X€Thçn¶Ñê~üøèÑ#--­¡C‡r8œ¬¬¬ôôt(tX,ÖåË—>Ìd2a¡1+++‰ôèÑ#OOÏ·oßîÙ³ÇÉÉ ‹Å²Ùìf)fàwðàÁ‘‘‘¦¦¦vvvNNN999ššš=ýóù-:8nÈ!M÷ÀˆãmÛ¶mÚ´‰ÇãùûûO›6ÍÅÅECC£¾¾:ÛàwƒÅb•••5sú 8ŸZ±UˆDâ®]»öìÙóöíÛ¶ÊCvü`dŒAó÷÷‡AšJJJ+W®477o_¨v#•••{÷îÍÌÌÄb±7n\»vm³šâââD"ú:<åýû÷°†<€J¥º¸¸,Z´Ç 9*yÀ€MƒÖ»ø‡_þ¸mÛ¶åË— ­~jAA»»ûׯ_Édò±cÇÚŠ 4hOUU•‹‹‹¸¸øÝ»wO:c]±Xì¬Y³ìíí _¾|Ù-áÉK—.ÍÎÎþõëßý_XXÈápÎ;×´4¥àR£°°08:ß¶m[Ó;ÚìÙ³áÆœ9sââ⪪ª>}ú„ ßè‹ÃáLMM“““ùþ-~¹ønʶÆj†BLLìÖ­[ÿüó‘Hl¶ ´"""JJJ.\¸ÀápDEEׯ_¿yófqqqád¶ŒŒ½ë}æçç¯[·V,8|øpzz:›Í>qâÄÑ£Gá“nâĉ/^¼ ‰±±±žžžééékÖ¬‰ˆˆ0`@||üœ9sÚê¾ $$$˜››gggTVV ž?H÷DúÀúúú€€€ºº:gggA6lØ ¡¡Ñ2.IDD¤eh ‚ M» gÏž-///óÆ ƒ÷ŽžV9èS«¯¯ß·oßéÓ§aŒ½ªªêªU«æÌ™Ó9£Bçxõꕇ‡Guuµœœœ¯¯¯¶¶v·WL¨¨¨@‰#Ì«ð¢8ŽœœÜ–-[V¯^-ÌÒâ<8zô(ƒÁPWW éP\ŒDþõë ø_¶lÙÚµk»]®Y³FJJÊÌÌlãÆáááðM‹ÅÞ»w¯U‹i~~>•JÍÊÊ*,,,..?zôè’%KøÕîÒÒÒà$_¾|I$¥¤¤`މÄÄDUUU‚ IIIbbbMS‰¶J[cµ?ÃÁ`$%%aÊWÁ‚ìÑ£G<¿råÊ;wvâ•£sÐétŸøøxÀòåË>,œ¿jhÞˆŒŒ`0ccãíÛ·kii aháß*ËÊÊàŸ™µµõ¿ÿþÛVIÇnAëׯr8---__ßvû(ÐW{êÔ)øQSSs×®]–––X,ÖÙÙùøñㆆ†™™™ššš?~0`@;*"%%UZZkkkkhhxçÎ.— -dÝ>yéªÐIOO×ÑÑ=zôbccÝÝÝ¡]: `óæÍÓ¦M³¶¶~öìÙoEhBBÂÚµk¡Ñ›@ xzz:AÊÊÊêêêAƒAÚpJØC‹Ž¾¾>Ü?~üêÕ«§M›&ÌßS3w•··w3·]×,UUU ‹~)q x<^JJÊÑÑÑÞÞ¾£³® ˆ»ª} Ð¨¨¨¬]»vÙ²eÝ;ÿèèhhŠ¿zõª««ë‘#G–-[¶yófKKKGGÇmÛ¶Í›7O__Çççç¿}ûÖÁÁaíÚµ€G=z4&&FMMÉd~úôILL¬©™ÓËËëÝ»wuuuñññ+V¬¡R©ÆÆÆ~~~#FŒHOOûö­««+@xüø1àâÅ‹666ŠŠŠP:ÀåiíŒÕþ … fÁ‚{÷î‚5…OSwÕ‰'ÚªµÜ@¡ƒÅbMMMÿ¯½;‡jÿþkö-K‘%]k¶{%]E!—[nÛCEIZ¨/Y²DrSÌR¤Ü"•¤HÒ"ËÜF—èº-·ú$• E ¥¸ÙóûãýùÇ|ª‘ufŒ×ó¯ãÌ™÷yŸ™ãœ×¼_ïó~ûûûëêê²l׬‡¯ù‚‚‚ëׯñ‹p?ÓUk×®õòò¥!åˆNi3gÎ Y¸p!q§ÓÖÖÎÉÉY¼xñÇétúÀ¤Mž<¹ªª*33sË–-ºººååå#ÞÅxà†þÁݽ{×ÈÈhÚ´iaaaiii^^^¸]g©>|xðàÁû÷ï“Éä—/_2Žø¥ùóçwvv:;;]|:;;'L˜ ++Ë‚Gø>ƒ¿øÞÞ^ssóõë×±¸ßLWyyù”””Å‹sýüðÚÚÚOž}š?>ÎRFœ½ÿ~Ü8þüùM›6͘1cÑ¢E¸‰þСC‚‚‚‡ÎÊÊâááQTTœ?>‘š4i’œœ\yyyii©¨¨¨±±±¿¿?cgooÿÇÐh4WW×m۶ᕱ±±çλqãÆÔ©S£¢¢pKÕßÿJKK“““³¶¶ÆãEeeeá@‡Ù¾ð#cÌjÈ‚‚‚?þøã®]»F£©µ¬OW1"‘HË—/÷óóÃ-sÜŸŸåÊ•nnn,N¾ŒFºŠ™ÞÞÞyóæ…„„àŽz:îææ†ûô|³ÙõK·nÝ:t肂¡C‡âââF®Êƒ6”@w/RVVÞ±cÇï¿ÿîèèxóæM™+W®,X°oc``P\\üÛo¿ÅÇÇ/Z´èÔ©Síííx(!f>kweerá3}}} ,puueË2 ÒUîø9°þ—ÄpÒUŒÌÌÌpgÛQrõêÕÏÖìÝ»wïÞ½xÙÖÖÖÖÖö«o\´hQÿCÅx{{ÇÄÄ|¶’ÏÃÃÃÃÃã³õT*•ñÏÏf—ëg_ýÔŒY<æ»ÒUŒÖ¬Y3´îÞc‘‚‚ÂöíÛY¹GÖ¤«ùûûãÁ>«FGG‡°°pOOÏϱ3f†††²}HÉÁ:>ÔÕÕ4iRPPPbb"z_,##CD9˜……Åùóç½½½åääÌÍÍÏž=«¡¡A£ÑX?¥Ã`edd°,ÑΈé*0Ú†Ÿ®bÄÆ¬öÐ\¹r{rr²““kšblLW1âú`6bYºŠ1<1#‰4oÞ¼3gÎ444 ç'1n%bå¼_5ÐÏÒ.##ãïïøðaEEÅÓ§O/\¸°©©‰N§3ë:³téÒžžGGlj'Z[[ã!´sssñÓq‹-QkÒU`THºjL#ragΜÑÖÖæî@‡•Ø›®,ÀÊtUÿpÿ“iÓ¦)(( sv>>¾ëׯwvvÎ;wàÏ3ޏ:íí튊ŠâââáááxHÖžžžo69ðóóã1ñDQ>>>¯^½þ¦Ü„eé*0zF*]5¦}™ ÃÄ é*0ªXŸ®ênFJOOoooNƒ4Fãååµ´´Œeeç¹/ 4ÐáããÝ´iÓo¿ý&!!‘ŸŸogg7À÷c&ÛÚÚ>~üøØ±c¸‰h¨Õæ®â#›®€À!é*0zØ’® þ»Õ~~’7==}Ù²eÿý7žÞœ-úòóóóðð:tèéÓ§r0œ€³.ÙcÎÚµk¹{"ßÞÞÞû÷ïê.GµüoÚ°a{ë0düüüuuu?ÿü3»+2æxüª­­ýöíÛ‘-pš?ÿü“ÝUßèOKK tFádÆÆÆÏž=cw-øoß¾þp$ýcû$0†@ ¾Ž•݉†9G.€sôôôdl?Áð“sŒ¯`Tqàݘôx¹‚‚qûiooˆˆhkkÃ3²†‡‡KIIá—"##_½zE§ÓÅÅÅŸ´ÃÁónÚØØàódâĉkÖ¬éêêâçç?pàÀ±cÇTUU×­[çîîŽßÒÔÔäççWXXÈËË«««{óæM))©äää•+WöööÖÖÖ&%%EFFÒéôÚÚZ111få „"""Nž<ùîÝ;YYY^^Þ{÷î š˜˜<}ú!¤ªªŠš:uê;w†vt€ŒÃsl W‰¯þwïÚµëÙ³gšššÍÍͼ¼¼ >>>$ ___RRRòöö&ðÞ½{ŠŠŠ‚‚‚---›6m222bV~?õHr÷ÿê];((¨ªªJGGçãǼ¼¼“&M "¾ñèèè—/_"„”••ñÊ;vܾ}{Ê”)&LhnnöööƃÖ2‹ ú‰F>3 @çܹsÄÔ•ð÷÷—––F555…‡‡ïÛ·!tüøqccãàà`„PAAAiiéùóçñÑ"„„……ããã0+'+++11ÉÉÉÄöÑÑÑAAA8Æ”šššîînkkkb ˆøúú644´··'&&¶··¹¹¹íÞ½[PPL&‡††Î›7‡‡‡Ùúøøø¼¼¼åË—ËÈȼxñ"!!‡‡ÇÑÑ!äååõîÝ;oooQQÑ‚‚‚?ÿüóÓ§OQQQׯ_OHHˆŒŒ’““Ãõ‘••­¬¬þüÞ½{DùIIIøº£¥¥õéÓ'„¹¹9c‡göìÙŸÍxüÍzÞºuëùóç7nÜhkkBûÇ‹/‚ƒƒ>|hffFü&(((hhh ¶ÁM8$©ªªŠ­¬¬pCT?˜•³páB77·‰'jhhà ß(Ñ××Ç “&MÊÌÌD¥¦¦677ã –••µqãÆÇ———çååÍš5 !$ dbb"((HL…!''7sæL¼Ì¬„‚‚‚„„DBB‚¶¶¶©©iTT”°°0BHOO¯¥¥1´.0αA]%˜ýwkiiZYY¿ˆ***ˆˆÄÚÚšñwδiÓ”••BüüüÄá0+ŸY}{°mmmܨ¨¨àååý믿ìíí™}ƒºû3»këèèÚÚÚ-÷ïß'";;;¢E!¤¡¡#¿qfå3«Ï—‡Ó_ £¦¦¶gÏÜ~ÐÜÜŒ›§N×Ï»ˆY9666666­­­>>þþþššš>>>çÏŸOKK‹ŠŠúùçŸyyyñ\зoߦÓéø‘Šªª*„³õ‹/.+++**jhh¸sçNLLÌáÇBZZZÊÊÊ~~~ÙÙÙW¯^MOO_¸pa^^®€222Ο?¿iÓ&ssówïÞ={öìÚµkwïÞE•”””••õõõ ¤ž¸›öLJðù`BBBÁÁÁ¸-!4eÊ”¢¢¢/7ÓÔÔ¼ví^¦R©øGbø–ëëëqæµÿrâããB"""3fÌÀŸ$6´oùKxNÁÖÖV sçÎ988¸¹¹­ZµŠJ¥^¹råõë×7nÜØ¾};>j===mmm—Ó§O'%%á$,†'edd¤¤¤ìÞ½!T[[ˬ„ƒƒƒ€€€µµõŒ3ðu¿„¯G=yòä²eËÔÕÕGä`[Œ·sl€W fÿÝÕÕÕŒWmmm¼¬§§wõêU¼\TTD¬g†YùÌê3XøjÆ, ³dÉ’U«Vy{{ggg÷õõëvvvË–-kmmÅZ˜­ÏÎÎnhhHHH ;~üx{{;¾/à$ÀÞ½{—/_þóÏ?GFFºººICCC„¹¹¹¥¥åôéÓq•pgôUOÜóæ›ÛÞý™ÝµŸ={ÆÕ644ÌÏÏÇË …XÏ ³ò™ÕçKý=^N¥RCCCqcccWWט˜˜°°02™œ““#,,,!!¡®®Ž£Ýµk×îÙ³çÒ¥K$IEE…h‰555uwwçççlnn~õê•¢¢"BˆY9/^¼Ø¶m[WW‰Dêééa|ÒØÎÎnãÆâââÂÂÂZZZD”ýMþþþŠŠŠçÏŸOOOŸ0a‚‰‰‰‡‡‰DJLLŒŽŽŽ‰‰°··ÇIbÜ‘6 àܹsééé¡íÛ·2[¿uëVaaá .dddHJJêèèàO^^Þää䘘˜ØØØööv™9sæÌ™3WISSÓÅÅåøñã4MGGÇ××wâĉÎÎί_¿Æ æää())õ_O???p¸»»?xð`€Ÿ ^\\L&“qÇ=###Ý»wÅÆÆæææ ‹‹‹«©©988 „œœœâââòóóI$Ò”)Sˆ0ccc___>>>ÜmðÍ›7x6rfåÔÕÕ………ß2ãoÖùóç{{{‹‰‰ ihhàí‡wQܰaƒ££cbbb|||]]ÝÖ­[oß¾-""’žž~ôèQiiiü〇‡';;ÛßßßÏÏOLLÌÄĤ°°e``àîîÖÛÛ‹›U:ôÕrB“&MúôéÓöíÛBß}÷ݱcLj¹éÓ§{zzÆÇÇÓh4CCCÆþL`Ì'çØ`¯Ìþ»ŒŒ***ðNII‰X¿råÊøøøÂÂB‰Ä¸>,,¬¤¤¤¼¼ÜÔÔ”L&—””à¦få3«Ï`Mž~ü(%%Ŭ|fõù !äææFtc)Cë8<‚,,,,,,ØXÖ R©EEE'Oždý®G¶ã0G)--µ··¯­­…Î4`”Œ·slL\.LLLöîÝ›•••••µjÕ*®®.*•ÊÇdz|ùòŽŽŽuëÖµµµ9rdîܹgΜ‰ŒŒŒŸ;wnNNn§ùᇘ­‰‰IOOwttÔÕÕ­¯¯/**’——OHH Ñh‹-^±b…„„DCCÙ3gþïÿþïçŸF=yòÄÁÁaË–-222 ¥²²2;;»¥¥¥®®îéÓ§ŒŒŒ”””œ5k‰Dúf=ªªªŠ‹‹ÍÍÍGïÃd{€‘H$«ºù¬IDAT˜½€Ïݹs§¼¼!tóæÍùóç³»:€ Á9ÆÉ¸; pîܹW¯^!„œ_¼xÁòO— F¾E§¦¦æÀ¥¥¥?ýôãó,-:£êÅ‹GŽ)//·´´Ü±c+wÍzzzxT))©G}öÃ7ÞÎ1<¼²©©é¦M›ðƒTœ ·è¨©©±»"£ËÓÓÓßß¿Ÿ§®†¯<{öloooœe—QiÑQSS#FpÜJEEå·ß~cw-FË`»:0Xãí Ú>`Œ"“Éìb‘Lê ®¸:àZè€kA ®ÅÒ@'>>OW Ɖǯ[·ŽÝµŒ pÅX 0 t~ýõ×3fàÉ\BBBf̘'Wooï17>­­­>ƒÑ¨ººÚÒÒϲÎiRSS---ƒƒƒƒ‚‚6mÚÄ8õØ@lÚ´ O°ÂQôõõ¥lݺuÄwQUU¥©©IL?Ɖôôtccc++«ÒÒÒon?Rç çœo\yÅϸ#`:ŽÎîÝ»»»»555Bd2™F£M›6…ã‘‘‘·nÝÂl‹ˆˆ|s¹!hjjzÿþ}ggç—Óȱ‹‹Kmm-¸½§§'44”†ô¦¤¤¤ÒÒR2™œ””$**j``0â»hlllllìèèñÂgJJJ rwwŸ1cÆÅ‹—.]záÂ…ü±Ÿ·ŒÔyÂ9çW^1Æ3îˆ=``{{{DDD[[FCáI¿ðKIII>$‘HëׯŸ1c^]WW'  ««ûÍrkkk£¢¢Èd²¤¤¤••B¨¨¨(;;›ŸŸŸF£uwwøä\ÌáÉlÍÍÍñ Ã!›·oßVTTÈÈÈáJZYY½{÷îǼÿ~WW—ŠŠŠ‹‹ËâÅ‹oÝºåææF£ÑÊÊÊNŸ>˜˜H§ÓËÊÊÄÄÄ-Z„§ä433C)++çææ²æÐëÇ"""Œkâããñè®JJJx”qbý«W¯´´´ˆ•Ë—/‹•””üõ×_‹‹‹/\¸@œ<¬djjŠ¿Sbš¡éÓ§¿zõÊÄÄäîÝ»²²²QQQ .Dikk¿}ûÖÒÒòæÍ›]]]êêêžžž«V­*--]²dIooommmRRRdd$NÇ󙘘<}ú!„Ç:uê;wX˜€•ºººÂÂBK—.uvvÞ¹sçÎ;užpÓùÆ5WŒ¸páÂÑ£Gß¾}«¡¡áëëKÜþ˜©®®Þ°aCaaá0ߎT9ƒ5¶"þšš¼üæÍ¼pàÀiii„PSSSxxø¾}ûðKnnnÄ{ýüüðᥥ¥âþ‚‚‚¬¬¬þË‰ŽŽ^ºtillìþýû‰À!”•••˜˜ˆg^MNNȱ77·Ý»w ’ÉäâââÐÐÐyóæñð𸹹‘Éäÿüç?ëׯWRRºÿþ®]»>|ø°jÕª-[¶ÄÅÅ!„–-[ÆÃÓ€‹ŠŠŠº~ýzBBBdd¤œœ[ì+^¼xÜÝÝ]RR’””D¬?s挮®.¾Z]½z5##ÏØ’™™©§§‡×S©Ô .àí8––&))‰²±±ùñÇ9êšåïïïëë+$$ôûï¿xxxØÙÙñòòúûûûûûß¾}Û××WUUõÖ­[>>>ïÞ½Û¼ysHHžÚÅÅ…‡‡‡Hk¦¤¤P(”ˆˆˆ¤¤$aaa¶`…ÊÊÊÖÖV'''b££ãêÕ« užpÁù6N®ŒNŸ>åääd``@¡PÜÝÝ“““øá‡~Þ2R ù,HpA$Ð_ £¦¦F´:á…ÜÜÜ·oßÛÔ××Óét‰Ô××÷ûï¿?zôˆN§3UVV:;;ãe[[ÛœœœþËA©ªªaÉ’%«W¯–••ÕÖÖ¶±±àáœEŽŸ8qb^^^{{»¨¨èÔ©SB111¸yÆÖÖVFF&))iíÚµzzzø½'N444$ŠÒÒÒúôéúß#Ž¢¢¢‚¢»»»·nݺ{÷n|RVTT#|[[[ó?~ü˜èhfeeE4P)((477wuu –””à3žsàöØ'NHJJÊËËŸ;w®­­M\\·Ù;v ÿžXºt©œœÜÞ½{½¼¼Œñ{åääfΜI¥§§×ÒÒ‚þ·ÅŒO‚‚‚ƒ:O¸à|'W BWWWBBÂæÍ›7mÚ„²µµõõõÝ·oŸÏ ò96!À‘À SWS§NÅ-Ÿ!“ÉsçÎõððÀÇ`ËA}5ÍlcccccÓÚÚúàÁƒ””•7²î# N'–¯5RRRÝÝÝ}}},­ÙèXºtéßÿmgg7´–/_ž••åàà ,,ÌÇ7òó¬ ³ï”ñ§¤´´tww7nhÓÑÑ=}ú4q?ÎÌÌüᇆö;›;ηñpÅ@={ö¬­­mÑ¢EÄš_~ùÅÇÇGGGgP ùc+!0¶"AŸ:*** åËHª±±•¡ÊÊJf"„tttþøãùóç#„ ?~Ü9ÌDGGŠŠŠÎš5ËÈÈhûö탭ùÐܽ{÷îÝ»¡’’ÜY^^w;¿}ûöܹsëêêBUUUDC¥‡‡‡«««¢¢âÇÓÓÓW®\ÉÇÇ'**Šºtéºëëëq×fqqq„PFF†ŒŒ …B©¬¬,))aÍÑ VEEñ•ééé]½zÕÚÚ!TTTDtÓÖÒÒºvíÚ¼yóBT*µªªŠx»Á©S§$$$p÷v)/////GQ(ÜyòäÉøñ²²2;;;|ö>|øèIºbÅŠ-[¶¨¨¨Ü»wïðáÃ6làççÇ-p|||™™™¡ÚÚZܵ··=zTVVöâÅ‹÷îÝ{þü9›°‚  `hhhpppss³±±ñåË—óòòpfPçItt4â¢ó;®C#((8¨†ü±•[‘Ó@'00ðÚµkOž<ÑÔÔ ¡R©W®\Y°`AXX™LÎÉÉ–PWW_µjBhíÚµ›7ož0aB[[›„„DKKK}}½’’’³³sddä¥K—H$’‚‚‚œœÜ¼¼¼˜•ƒ÷‹3‚ÒÒÒ¿þú+®Ï‹/¶mÛÖÕÕE"‘zzzø¹ Ó¶mÛpÃZpp0BÈÁÁ!44ôøñã¡€€€sçÎ¥§§#„¶oß^XXˆß2{öì´´´>¨ªªúùùáVYmmíU«VÅÅÅõöö*))!„ÒÒÒðàššš...ǧÑh:::¾¾¾¬9´HMM-..ÆÇÞÓÓ£¦¦Fô\¹re|||aa!‰DRRRòòòÂëW¬X±ÿþüü|‰$///++{äÈwwwüª……Enn®½½=[Û°aëW¯ÐÿÏ%»ººîÛ·/>>!´nݺëׯ>|!äîîNL1mmm˜˜ØÔÔ¤®®¾~ýz„»»{XXXoo/˜ˆ;ÇMŸ>ÝÓÓ3>>žF£â®€»¹¹¹ ÇÅÅ¥¤¤èêêæääà+þ Îü£|ìžo\yÅèß´iÓDDD.^¼ˆSW¡Ë—/OŸ>}hMPœ–àŽH€„rsscÙCL,caaáàà`aaÁÊÞºukýúõ8{ʲR©Ô¢¢¢“'O²lÃQWWWRR‚Oå1¡´´ÔÞÞ?ÞÂîºîçÛgX|Å011Ù»wï`Gy9}úttt´“““¾¾þÕ«W©Tjrr²±±ñ£GV¬X±mÛ6ÜÿþýÌÌLÜ”õäɇ-[¶ ùÁÁÁÛ¶m“’’bL888ªœ$<==ýýý99|A$‰C³žcTuu5B¨¤¤DYY™hlŒÎž=KüîðHY EMMè À(óí3câŠáää$$$”’’’™™©¡¡‘””„¿»A5äËÈÈ îJphÑIx|„„„DQQk6+-:áááíííeeeNNNœå"àñuBRRR?fû€l€»ÁùF`Ëch-:#‚• hÑCG¡PØ]ÎÊî* EEE»«Æ8ßcôŠ1d=èl–’’‚ feB`œ€@`3HŒ¦³—Œuè€kA ®¸:ÿekk«ÿ<BH__?**ŠqûÆÆÆ™3g~¶V]]miiÙÓÓúڃ¯Ñ××—úžç!$%%…ª'¼yóFQQñ³Í°ªª*MMÍîînÖÕŒpŽÀùXèìß¿ŸeûWWW„Pddd\\\\\Ü–-[_ ûl^YYÙ¸¸8OOÏ/‹jjjzÿþ}ggç¨V|“··7B())éÔ©S§NÚ±cã«ñññË–-c\£  pêÔ©/‹jlllllìèèÕ ƒ1Î1…-‘놆–íkð̱FFF“&M"“Évvv 3gÎ [½z5cË ‰D³§~V΢E‹ð |fffúúúxÒݾ¾¾cÇŽÙÚÚþðË/Æó€b±±±¸Y(55ÕÆÆæÇÌÈÈÀ/%$$Ì;W__îܹVVVðSo°455B¦¦¦JJJ~~~Ë–-›1c†ˆˆÈëׯ½½½çÏŸÏø«šD"Í›7ÏÔÔô³rLLL𢪪ªRRRxšú¾¾¾¸¸8}}}yyù™3g2Ž-вçÌ•ÆÞH`Ôâ¿4((hÏž=£½»aúþûïEDDŒŒŒ~…:>gΜµk×k¾¼ú,Y²ä³·=zôï¿ÿ~úôiQQQIIÉåË—96@äd¦¦¦bbb¦¦¦#)Òéôùóç{yykDDD>ÛfõêÕŸ½åâÅ‹%%%•••W®\¡P(·nÝ‚ï” À96nA`€Ø @ê꿈 Õ„……µµµ‰õÏž=«««{úô)~URRrÖ¬Y<<<ÏŸ?ùòå—ëBââ⡌Œ  …RYYiffF¡P”••uuuëë닊ŠäååqOEEÅÝ»w‰]÷ÝwJJJ!—ÖÖÖ7Ξ=»··—J¥vww¼a „ž}òóó³¶¶îééÉÍÍ…ït¬ƒslœƒ$À˜Àº@‡Ã?tbB5„»»;Ñìééùúõk¼,((˜““£¤¤äááñÕõ!MMM—ãÇÓh4___{{{• .dddHJJêèèà–F„ŸŸß›7oˆ]/Y²d×®]!99¹ÖÖÖ˜˜„ššZLL \­ wïwssClß¾¯_±bE]]^vss›0aÂ_ý¥ªªºbÅŠ—/_~¹!4}útOOÏøøxfhh¸k×®+V¨««§§§=zTZZÚÀÀçBk×®­¯¯'v½zõj|Áš4iÒ§OŸp5¾ûî»cÇŽÁw:ÖÁ96ÎA`°Ø BnnnŒýù¹ƒ………ƒƒƒ……»+2ê¨TjQQÑÉ“'Ù]ÛLLLöîÝ«¦¦öÍ-333qgdœÀýÇCààÁƒ‘‘‘_&>[zò䉃ƒÃ–-[ˆ$€©©)…BqttüjàÆ¸Æ$ÀÂ… q@ZZúÏ?ÿ¤R©eeeÌÂ\OOOü ×#‘Hº’c:Àààq¾TPP0¨õ˜ŸŸŸŸŸãÆçé………_-áØ±cý”?ÎÁàZè€kA ®¸tFæ7oÞÄcI2âÁ(ÀM ÐóôõõwìØÁîZÀ˜·`Áyyyv׌0¶:ñññ7nÜÈÌÌdW¸†¬¬ìx—aM$0ô@'999))ÉÌÌŒN§üø100púôé»··7õcјˆ†èlܸñùóçxÒžžÿøøø‘«8Ú˜ˆF&uõþý{QQQÆ5ÑÑÑxî:eeåÀÀ@ÆõuuuºººÄÊ ˆ‰‰ýþûïRRRT*õêÕ«ÒÒÒ#R7Œ6ކèÔÔÔøøøtwwS©Ôôôtb}jjªžž>ªüüü“'OâÙäÓÒÒ ñú‚‚‚¬¬,¼}rrrJJŠ””BhÁ‚æææåœó#a££¦¦—˜˜øàÁƒÄÄĦ¦&¼þþýûvvvxÙÎή¢¢/WVVÚØØàe[[[eee¼`¥1 pФž§Nrpp`w-À£ pD·ß¶¶¶ââbQQQooovW,5z‘G:d2™ÝUÛŒ^$ÀA©+€‘¸:àZè€kA ®¸G<^>Jòòò>|ÈîZäÅ‹ì®Kqm ³iÓ¦ªª*v×à,®®®šššì®ëpm ãèèÈî*€Í ¸:àZè€kA ®¸:àZè€kA ®¸:àZè€kA ®¸:àZè€kA 0Öü?tϯ ïlIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_map_to_storage.dia0000644€ÿÿÿÿ00010010000001314311727205031025105 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺÙ\7ÃiqÒÖÐŽºz²[£^½$ ú–Õ*…Û°ZÛ3–Ö¼M>Ec_.¤f×E"Q*£Ô_š-)cÖšh£1x¥pkô2 >Æ¬Ž¯W•ìKÑ¢ãÖG$q{s "lGÛ³–wǬŽORGÕ‡:z”ÙÈ}à_5Q[AVÛ8óèÆ]C”·5R묒¯W%;§ò á¨µ(Í8óD[RBoˆzâ]p0BEY³îú`²‰rZa@ËA¬±¼ÊµôJZëð?•UõY¨ê§âûªJW;çò ­'iŒÆ*Í©«”/@”@©ô0™³¥®ÊÖ”Wt_)àØXS÷ý¦Š·;ë6Šãþ(–óÙ²¨)‘{ ®¤®Hi>[U¤÷?Î'Ó+*¹\L¨,¢øvt¸\]QDÀćò§oÞϧãÛ%Oÿ0÷á± §“¸+‰O’Æ6ä6á ¶SÊn„FÓÉÙ켨þ2‹ÙåùÓî^e!M?0òûdVTÁHç´#¥ñ‹S¾8¥µç„¤!–0bqËÇ}8 ÊN¶M?ÏfÇÅlœ8jÅç‚ Ûþ¢ðœ^l~žªª¶'Y³ññh±˜Û¼ð¬BÇ+O‹ÙÙÃ{¿¹»ó·ÝnH>jm´¤HÂ2ˆ³¼·Ó\ÿäð êA3ªÔjN‰|öèðæÇ›ˆ5¿¬Ö¿Œ&ø_Ö÷«ì6>RO8Ð9߉ p4S» }3ˆÂE ð6†!:ÊàT‚4]7 Ô±YéÁ« (ü€^ lj²y s÷—å¶` s¢•F¡×ñZè # %´}¨ÌP#E©c¨™a –ÍŠ¥h8ªÞÕT¥—aà•Y¡ÖàÕäîIZ(·ÞwܾšEØÉ°÷*i2ZöC°BÛ¤06(nM®e³b)~.YÚõ*Ș5ùui²é`×›x÷—¡o¨ vÎC=dM™¦( ±CGE¸mOÔ¶ üðã‹:øëìâruðëdºÂÛþzcƒRÄúf<Ñ»B™C„¬' ÝóØ`À]váÖ0Báã}A’?Šÿ½,–«ƒ¿_®2ŽìG6$3 '@çRHΈyÓ”¨qVIÉ€¡¢  /M”Ö¹C»0R²¯³+t©ÖŒ2¬(Ó9RSOÜkvrHDŒ°–:Ò¿=þ½Wq”ìíÎt©ÑŒ+œWÐG6e•¡‚Ò†7°"c$J2jR-d”T=Z·íŒÖüd¦ŽÏúZ{\jZ×Ú÷r2󤣅ëÓ¿›¤è#ù¤ST#Þä?em¤z˜íPYa½Ku8J:ËŸûWÍfÅRü`à\ZjÞ…$ö$¶áP–jùE#¡”ò(&P^¨õž£hx~Ѩb²2)4 -ÝoÁp=¤ ¢ò¦[¡4oåRB ºéQË¢ºR6ð§ V³Y_~‹+Õ¾m^Jîh÷ò}RA{j`)³¥4èDHWŠ¡3ôZik¶`GU±Y/†¸pïl(³#) }H¡B37©¬f6çÒÔu#Úè×h¨egÝİ’Ïz9¤•û&‡qGrûC&µR"é™å0X—(ÉÖpÔ¹Tê¶c,ž$‡•|>Ôè4îÚÝÈ¡–}È¡#œ[ÀCD$=ˆ‡.Þà¡ÜVòY/‡rñ0ìH»á®=yéX½”@Ž‚N± CR¨,u6Höz¦:.«ë™¤…2#÷؃ÕЃk$ê®K7Íðz°Ú*3°4,­Ü*¿G²Áî9Ô²YÛ…xï¶IÇ O5§‹ºó)¹ŽÞ˜U9É_»¦BG¤4ÄmÈáHÙµ§¼Í£Æß>}úxø{ñµ˜¾Æ„(öÖ µ’øå³=HÔ¦ '°i5ïAbŠÅ+$Ðã*ã_€ù÷&ò[8Õ\>4ù)ºÖ“Ÿv·—é™ÚOŠð¶§9–T‹Ç›‡”ŒHÝÐÈVCÜÄ¢5©žß[¯˜e±–ÑŠÌ ÜdeLK•u*n¤ÊØx÷Ø‹ [RlÍv»i »OZñë.=]Šd›…o¢uH}ø¼SC N™eÕ°SÜÝ€j¹¬XJçeÇŽ¹jx_«†ëÏ @`F:ï´ûѪc.ù3Â\—üyªþs{‘ôú£N'Wçl¯ÆÏåÚœžœÒ_'Óbyµ\çˆô¢ ;:ˆ{¡%DCûºä=ˆôì5%-ý0¢— R°@T¬C†{a²Ia%<íMpàYˆŽs8š8Ò¸`}Ðt¸Õö0wŠÖéãû¸Ú€Õiòåƒ-„7õû)$>O¦Ó$ÆžžÏ¢KñC÷*íõ6£¼gâT#Ÿtÿ¦“‹ã/óÅä?¸¥¦2÷y4]È ¢­&§=éÉëœØ„â5ÆÜšé(ìþ˜beac¶Ä¶f‰m b6Å8ÃtÎÄ‘¼°ñFýðáÒ¿ö¥ÕB‰¹ÓÂDfüè ?>L–§sÿ6šUÁGç*Ôo ä㤆Íx¡D;<‘’FÁ¼žTF©Í’uPS?l6qå49:±Æø çü4ƒwÙ²Úk£\l=;ñ•ºrŸÓ#»r¯Ç•{Q»w”áf o,ëhe F÷ÔËYYž;М@Ú‘»Œ A3‚¾`XMz‚éœ6k…•q}pß:­¦Ztl)%:¥'È8¤¦¤†R‚w¦Q-ŸE¤…œŸðºò\‡®æ:pt5ÿpuR ©€¸³D$˜¾A1*Σúíˆ`z#\Žé ˜ë˜@”R&…“ÉIU¶Ó`“iÂÝ™lvÜ|ˆ^;­¥õ:´ÎËk6³´b¯ÔÂ: ôÌÖ+òQŸ­¶‡>« ¡¼h˜û¬ˆi„ úYeŸUgU‚VЬ™½0™¡5Ck†Ö×­Ýçì]—‡ A§ÚV‰7  °R¦šBJCKãõ %É)ckD°&3´fhÍÐúBâ‚ÿ=EêËÊРï¡_¥@uÌVDÞŽ•Ö$JÆ"¥!Ha­ŠÔ„#š¶Eˆ ­Õ>˜l©ND-³@´ÒJ9!ÕÓ(ø.(¯BlK™Ìðæo¦ˆÜC â3=·n3tï4w]‰–‚@‘·+}î:Ò‡}$€ëHWdtõÁd¶²Ím†}¶š”*™î=¯'é ëÙE7¬¤D›)U=¦¦×ˆ¨Zñ–*õÂd.UÊ¥JQ_vv†í\q©¬†N©à4¤Þ¯)7Ck5¤>AÊÍІ{ä|—œ-àJ­}ÎÍxU¹:téawÓAÆvo¼j˹ F¨4‹Ã %RãUgÂ@Nª4UÆXþ©2u|Vö0û±´õÄ hfþ Éz÷¡ùöô–Y¶ËÕh±z ÒtçkoÔníÖz è+5÷K-å3V€K½)¬IX¡"$ÊÊùÀÕ|V÷;t†z+‚‘*CE†Šº¨Xï¡ÜS§(`¢#͈̰4'Òø8|¹¤¨d³²Ý©¡¨<Í€¶æN†Š Ï *LPÛò@ÀËrŽ¢‘LRXe“Aë-`4ó@+‚*gáX“¡"CÅ‹€ »_P]LÓÛ¼*­ °¦´*´yVP¡£,ÇÊÉlVd¬x!Xáú lò+¢qi’§×ɬP6ê„1n1®õ@”sPÛfe È@ñÌ€Â÷°µPEê]PƒÒIˆr@”­„-4 UÐ,í@¡ nªlSd¨xPöì$¦Ñƒ*ÄHPaA–¡ övO9ÿˆÂD©èsšè3Rd¤Ø-Rtä9l4À¥Ø'.ñÇE\°:u!¹::øKÐ6[µ.=QÒÑçˆù`6ÓË0a\ç¤Oå…Ôe‘¯aþ§œˆA¥ˆi0Ήpô©J "°§pÔ°Y½Òøä„…è÷fâûuÚ¢‚-¥6w<×÷ŽW_AêúÈ\ ÑÒœSe(ÞM/ø4QUƒ”¹¨âÀÐá?ðVöÁd“rê§R+ ”`Q³Ö×µŒ)œÌãbÁ°{ö3ÀAè}šÕ‹˜äyáY%-4þÏ<Ç’²kOy›£þ5š¬ò„q†¶ÿµ2˜'ôçÓ«:ó®{ÞA‡,ºi³áõµ ôÀ k4E¨ ’Œ =.iZS¾À{sü¸qWÇdåRÙ|©ÁíòmÏÑŸGŽÛØü"{ÎS)ö¨1ÝÓÏ¢ðJüÚ—ÕŒŒ(`‰ ¥”~æ£GÙDE²¬ SÇcåR×|iŒNãç·>´nsšUfÛ*c{èÝ•…:'ÑzûÉ(Ên@l€6íUÊ´Ðm 7T™:«—ÓÒx×`ªXê½´TʶA¬2[W™ÎÙH”?¨ûÉÈ@‹w—qùNæŒIÙHAIK"G]‚8u¦–Éê´ÅæKq»L ø ]Ö™g¤3u>’rP,Ü€ª÷A³ê zú-: % „@*p­ ˆ¶ùíÓ§׃?\N‹á‹ÔId‹ô%ïçß«¤sÎŽ£¤×©í€6 Y'3Ë×””ש-zês‚;°ó¬Ó¼za²É1G»ÕðÑXÒ9ýºÎ ºµ²ŸÒóY´qêG9cÊ©,«¸éV³˜”S®)Qí)§!«2ï¢gVÎîLfåÌÊù4#ÜwÏ!‹Ç˜¢8Éš,òƒ’¤4Œ"½aÛSÞ¦~øá&Ëâ÷âk1Í68‡ ^'/Á—»·ÁëDõ0ö ìÀN )ihaíÒ Ï5>Η«?ŠÑxí½ï3Â&h¼y?ŸŽ_rT`Æ VÌ€0Ãx´Ð`Mî»&c…u4$ÒC¢Ùö$x›ðñi1š-3hp‚F…fÜ`Å Ýn8ô~) ¯Œf¶8%/œCJ©M|I9¶§¼MùÛèâÓü«ùbtVdáÄ‘j‰ÌP %}L«¶–:öã…¤ByWCp"&‚ÁíÁÁ#z.Åâãh±,=8Ñã¾fä`EÛ‡‚_pG<\jH!#t"¸a_NO‹ev\x ŽMéˈÁŠ®'[ðG;ˆŠNÁC11J­ÝƒXÇ/—«/Å,c·™ar¬c{ áû03(žÛ?q”}Kþ‰”3áöÂ?!ÈøOF V+cSø2`°Fè0<å<å OÙNé<%¥X»§)xµŒœhqOò2Z°¢Eì%ŠAÃh©°GrÛD‰*UƒLÀÓ\%dkÊÛD_'ß//2|ð†4ªD1c'†„îI¤üJ~e##‚DaÈæ°ÎÆáš¡5ÍmbÇÊÎèÁ™8Z-„/;àùb‡ê;tH˜¯yÁC‘™‘¬·Æ5ݸòûü,ƒ'xTJaFÎV§¡fzÑ„*¹bíìC5ã%%#5ˆ”Ê:gÁ—š¿×i5Ÿ•Kµ‘G‘ŽQæÉ m‘ŸG§‰öÄØ;M<•bO(ѽc…Á{ÒU xQÂDãKå+ÛÈj¹i´>¸Q¢ŽÏJ”>õfQòP‡ ;‰.ãÐT»ÓÜZniœC0=@’“6 Ÿ à™ ç“â£IˆätHÌÀàG¤j6+—Ò|™Ô7͇<¼.CÒ~B’Þ$Ù Ék_&‹ñö%GDJÃ4ð>8‚$ïUjù`=?$U²YHÖ”­(¥…ŒH‘ö‘ÌŽÉõ€HA…²éªa·‘¼/;Á¦ØN°Z¥n>ÑoÁFªä²dHg`R+“)Ò^’Ý ùÉ:ŸߌóÌ$ëB"¤UB$'5nÕ6ø)€TÍeuÉ–LÆl"eDÚSDr;B¤Ð‡Óf|R@ë-/ iKBFùä´éè<Ý*·à´U±Y‰HÖR> e\¶‘2"í'"ù!R쑤·å_0Ž’¤Ñ©#²3Ú¤™R©”?j¶Ú®æ³zÜ8¡¥F‡ŒI“ö“Ôn0)ö29Ø4ðAº¨ygnZI§XHÉHM£&t:ƒÔ‹z #‘+ù¬XêD”>¥ I›32&í)&AWL*_OGWÅâçƒòþ9[ŒÎ>ø™b3‰ummod_perl-2.0.9/docs/user/handlers/http_cycle_map_to_storage.gif0000644€ÿÿÿÿ00010010000013302211727205032025115 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©Y–/§§§g­6¥¥¥£££ŸŸŸ›››™™™———•••“““‘‘‘‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWW  UUUSSSQQQOOOMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôô???===îîîììì999êêê777èèè555æææ333äää111ààà---ÞÞÞ+++ÜÜÜGw%)))ÚÚÚ'''ØØØ%%%###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨¤¤¤¢¢¢„ÞE   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzz2xxxvvv#tttY–.rrrpppnnnllljjjhhhfffdddbbb```6\^^^\\\ZZZXXXVVVTTTRRRNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷/NBBBóóóñññ>>>ïïï<<<íííxÉ>:::ëëëéééççç444ååå222ããã000ááá...ßßßÝÝÝ***ÛÛÛV‘-(((ÙÙÙ&&&×××$$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍÉÉÉÇÇÇ3UÅÅÅ1SÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠTN©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœOÑšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=r‰ ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîWiíAÌ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(â|PX^gÁDÀÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbL¦þŸ´àË©´Öjë­™¦š£}Ê… °°ÐB)®àÉŠ’ˆyJ X°†˜-à*í´ÔVK§®Ã­ŠÙ§}D;¤EàCãŽé­µè¦«îºRbû¯Š}ÚÂE@ä#1´ $DžpD+-ì"H¿ÿ<ð`â‚ ²´:$#-´â‚+¯ ™-dÌ‘¡ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¢Å -o3*3ìð粫óÎ<[ë®gð&ö© I2â‘P@døp! E2í4ÔCŽB‘ ,AD¦q‘(™óÃG™ôÒM?}ò‘Vc}°*n ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§/$ ‹‘2yn΋ùDÆ¿Â5‰é ØJê}x‘•sѸ“(?ËÅãK>ä>¦ i‚ŽCÞ‚éŠû-ûì´#úsgA#&/HnNdçŸãû³")‹’a©9âÃ{¾ö,¯¤,gˆq<‘Å'©wíÜwï=›·s–ûaŸÎ3C9r÷ÐhB$&J /ÿüçŽB ’•TBä“yƒÚ;RûÞ?çÍI(ó–ý’¤`¢EZ`¿GÁ ZPO€ËVŸ¶u3.ècÅ;ˆ‰X´ "ãB*¬a.À§Ò [øÂrÁE+PñIþ5hA*< "A€,H(â1$´ÀK MˆB"ÍÐ…0dÒ²0–±âáP‡<ô!‘zð#}q‡=lâ£xÁ6ºñH ßfÆg_ÁñŽxÌ£Å' up€ ¤ -(GÌб0v¤"ÉÈò2‡$L"IÉJZòT´L$3ÉKzò“ TT&+³IÁtòR˜*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbêr¥%eJ˜SZjÌ(„4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎv‚“ö"•2'ÃLÀ8³Rþ¨0öÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZ4¡Xˆç¨æ)™zþåž”ÊçEGJÒ’šô¤(M©JWÊÒ–J4£ÉÌà»gNJ¤.Í©NwÊÓžúô§@E)Lå)S Ñ´26•NƒÊÔ¦:õ©PªT :ÔwG¥LR#µÔ©zõ«` «XÇzÐªŠŠ£‘ñ¨_¶ª¨®’õ­p«\ç*TžõªâËêdØš(·Ò• “0Å þJØÂ¬f Z!£Ö¾ðQ~F?¦a` ØgLaŠip¶šå¬gMZa„À³&8)’AÐOt¶Ï(þ©)KÛÚÚ–§‰ÕbÓX¾<öP‘† ø9Ü}¢bŸÅ-îq…‹\âò³#0hqe{ÛêZ÷ºÍíßúè©?‚*¸Ó.&š+ ìs¼Ì-¯sùÉ éþÓ@ Xp€}†™5-ò _ùÒן³Å®€L`ªÚU±x£^%ó[C·œ%í?§ëO “WX„{ýy -ðó÷Ø' ª°Ïk”€Ÿþpˆùà»øÅÖ®«lÈG¦Á…ïzûiáóÂ&8:ÝØ C6*±O0tbŸ?‘á%÷³Å0β–i+ãKíÖ1½Ý Ž ¥ã û˜Ç^èþtK±Ï[”LH úéfbyËxÎ3\»l©/7&Ìxó Êœ^4´Ç=.èt¼E”h„úÙh;ëùÒ˜+Ÿ+ågÅú.‚TdA@YËNÃ\Ø':kŠÊòsÕžuµi=[ŠfÔµ£ì>‡`V˜ 8G?gQ òÚ×À¶0F`Š'pöə޶´ºiJu:1Ÿ¶K¨Üi{ûÛàvhµ'umÄd».ÛT·ÃidÈÁŽÈ@6‰€C`·¾ù9nI•û0ç¦Kºó´î}ÃXŽ˜Eî°„˜“Ð X„qÐøG¾ßšŒxüã ¹ÈþGNò’›üä(O¹ÊWÎr‘KáŸýŽÔ¿ ð¹ O7ø€¡ðgŒC hW~A¥P¶XÁ`"8ýéPºÔ§Nõª[ýêXϺַÎu¨¯£¾þŒ¹(i I[È»™Ê¹Î­ …P¼At°ÅXž‰qäâKÿ†öÎ÷¾ûýàOøÂþðˆO|ß}ö~Š=Q3çŽÙÕ„vL©}íµ#Ô€‚g …ƒ lýU0è]ñ¨O½êWÏzÖ3æÖ-Ù59ùGUþR—Ǽa«g\-> …9ðPúÓ·þøÈO¾ò ÿú°Ç~»œÚàànÿL}ê~Àâè†äþî9À#^5ýòÇOþò»¾ñü~þŒ¹Ë*Såþús%< —+|üR¿ù÷Ïÿþû½ùާ~^6{¤T{½B}ød}ðW]Ï€@Í€ÆçxÉ€éSìÇAî§€ h[4@ vñop Q¥¸‚,ˆz¸Og;¸L/R ‚‡µÝ  iq^©‚Ø‚Fx„€÷‚ƒ‡y„Qsrqswò~:(VEpU1¯S¯ ^ÑX V1ëjO¥‚H¸†k¨„Lh(N8PRh'TX…_Åh€UzPz€fqWQ •UþjȆ¬wyn ˆˆç†Øg3HO5(47xS9ˆ‡t ©`Zð´0 "@ ˆÀT¢0)pTñ#0WÁ O0¶(S!I€ˆE(ß0sÐg°z}à`Ðw]0ö x|÷Ž˜Œ±ŒÍȆÅxŒ|'‰}~ôœhX*Vñ š@ ¨@ˆ˜0WaŸX#€„h ¼øw° ð-ðE°zàˆ}G=1Ð î`É÷n i©ˆ ¹x胓Èi•ØQ—¨;™¨T›øq•p¤Šð`PT P¢ 9`ïxþñhu` ÀˆÐ…  pàz€t0ñÀêP=âàÜ ×@ Pð q† DÐP‰¸w™ RPy@‰Ðw•°8.°wÚ@{0 {§0R0  {WÎpë0ïÀw 0 î0–ÀwUð á V0)—ti—x)zÉ—~ÉwÔ–y0BáÀˆs)ГٗÉwg™–k)m9o)ÚHT8}Þè‘!i¤0 ÑÀ”P TÁ í@391iÃIwPyPöð°è`cß°Y€ TðÎþÐÊà æxù {Rà 0 *`{Ç* m0 { ;®p¦0q9—ê` î R{ñ aà { ô*` ð  RÐ癞ñˆŽùŸ: z  ºw*E  Ø $ðŒŸy÷éj ±€  *î ŸòIŸR`Ÿø©ŸüùšV›5µ‘\Õ‘´9Vzðp$€ Sq¾9*À}\p 0‰-À}T1oð€¯à / 3@l9° ?Á0 EÌà O0 V  YÐá0æ€ëq`uЈ¡à™2pA þï°¨°w×0 èp R€d@}ÀwÙwr)ò`lé'Щ7˜Àwv¦ ÀRà{€{W¾Ð˜‘©›Ú©'ð©¡ÊüÐ{wIð™ÿH—R ÚÀ©ž ª{ç¨*©” Ù8‘KX‘Öv‘i•‘ä¤m%¤C VP{à HêSA J:ç I Á Ä@ 0Î`‹—Pû  "À €´pE°ëQ@zEÈ Lð P@ × Üà` åíàpP  wÐÇØ€|÷{—ô úðËZýéÓ0þ"+ú`+°wÀ§*øÀwŒ«,ë²{³1³ ýð±¾ú™ÁêˆBK3;²% '›² {Û¨*Ò÷£³™­dÅ1Ûj€ {q Û`LTY¹´*{{G ¹ z’p ÷`=^¹´ñàwŽ)áÐŒjÜxèø \ùˆÀwŠ¡sI¸†+ˆûwp —_9tùr°w=ë›Ë¹y»·}û·ÿ¸Íjµ°Éݵµ\V³‡(„€ǰÛ@bR`0/çSY)¹€Ÿ P|÷©A O°wŸpž)þÐ ßЉ+} ¢©ë°pŸª °¹PÀ™-°ÃÐ(+ãð © %Û Š Á¹Æ ,päk¾è«¾ìë¾ð»w5B½A—‘û*0 ¸ëíû¾ñ[½Ãp½Ù»½Ý[ß¾ŠTÖÚWØZ»OUu°Ot¼p$p ÂRF ÖÖ°;••ÒgÈwW _PÖP|Gæ³òzÐw €ú  ¨Ý ð0Œ3°; ŠðÌ™±0ºRðXÀs ¼i+ÜfÀö ¼ü0],_Æc\Æg¼«þ£`ú³ ´•`{ T3ÛÇö`ÆhìÄP,ÅTlÅXœ%Œ`'¬U) Y+ÌÂLÉ9gü ãJtÔ@s`%¶®ÌSm ‰Hè˜þ—ɲ·É{ÕÉÀõÉ üSÜàP·OL0 â8P°ûP\ ÙSµlË,¤0žËº }XÛ¥r‡ÁÌRÍ0 à ³ÜO`° \0…°ONp•ýÔ/|ˆAÜ‹ÖÜ‚“pÇ Ïã×Íë'»íÎÀ<Î:5·Ø`dÿÄX bëýð ÀO]þ{ÀýÏûÒý'ÐÈË æËvþÐíRqàÁ`ÞÀÀ a0ýˆP˜î:UÍ"]Ôç»=JÐhÐ+ÝTt{0åæÐU€@Pjà ¬ePCð©O€9EÔF]ÖŠGÒ”hÒ7†Ò9¦ÒMRÔ@_Õ ˜à·W æp>õ fPc ÐfØ‘è¬oX(q(suX'âüÖ# çIÏÕ Š` èð‡p \ñ 0O! Ø• æ0PñÀ{P.EÖŠ]Û‡Ö©ÖgG»–­Sô • ŠðÚ0–3À %  ¬(GPëð•þÀŃ5Pv‰ÔÐR´mÛÞýºÎwµ“µ(ÌÛ½ÝRà Eê ð ‹ ÷P¼ðÜm ðßà>à^à~àžà ¾à ÞàÞŒ ­ä&­ŒE­uÄÖdæÖçmQC° MUËPPPÀ,• ]·â,Þâ.þâ0îtt€Ô&¬Ô²ÉÔîR¿ PÐTA0dµ =žã:ÕØ„òØÙo1ÙtRÙFÞPW`âìÝT.À ¥ß¯å9…䃢ä€Áänáäså\®PŒ™s• ö°}æ+å傿!æmAærbæpnPþ‘{XÞTR€†õÓY Ù{nRr(tîvÎx'z~èu h‹ÏMu²PÄ€¶ é'•耲è}ÑèkñèpéžþO_€ O%L–Po°Ý©>R ž'¢Î¤®¦þ&¨~ëûÄ,Û……ª ìÙ%áþFá¼eሄღáÊ.P&ËQu®®PÜpúPÕNQ¹Ž'»^Ð.IÒ.jÔîþäܪPEöÐÕ • æìQã~'厽ž¿î&Á~ë/[UѰîûT/¼b$E ¨ñ?ñ_ññŸñ¿ñßñÿñ4®É6®þµ8žï uy V[ K`Rb°œPó6ó8Ÿó:¿ó<ßó>ÿó@ôB?ô7¯ .ÞΤ2ðž^È( UñÓ Õ òPRb°ß½õ„‡ÛѪ۔gÞ(OPkÀu@bQÅðP—M€õZÏõrÿw^?á`o{b?öE`SõxçPL@ÌW?RY?÷ˆÞˆô3EÞœœ÷zÿOå`ö(h]- $uø‰øußìw€ùýä0„RÕ }QÏ`âõ`øq¿ùrßù2çì`vîܦðÕ®Þ.õQ…»Q¡×mQšû\/ûc÷ù6ú¢þ/ ¥ðá^Õ Q ÏRfü¯üß­üGûfû¦„ûê¦ûÂþ ZJݦ ìÚÏýÉô±ûͳ{òÏÿO€í^õhQbÀÆ!MØ@‚ D(LÌ) >„QâDŠ-^ĘQãÆ‡¾Ä€ËH’%MžD™RåJ–*ƒñ¡SæLš5mÞÄ™S§NNíTèÐ`ZEšTéÉ 5>…UêTªU­^Åšu*‘.i«5‹˜°w¸TöàBŠŠz¾íé†ã\ºuíÞ…è¤È¥}ýþ}9Tð`Â6{þ,œXqÍ¢?>ÚTídÊ•-_¶@7b˜=³þ R¹€0Ç,³è6F/XËÅ[öl¼z †„œ[7ÉÀ‹}ÿžyøpÁw,ÙóræÍ? ÀÂsêX‡d è4ÃÔæ=àü;)TzN`vçH9) †¹ËC%PÃ/|ÉÓǬßÃJ[òÃÚ$Ð!Û Â 9—ê8îA o2nA #sª: 7ä°*1 ç™³Š'€Ë* ˆ¬† †ˆcŒ@ $’Y£ŠúhðÜÀo¤x„µ=æˆ!C¤…ž T°žl¤h}jY3®iˆ’P!–6†)0ÌÙ$(Á ÏL©Á ×Ä)B6Ù¬M9KRþnD;ïÜÐXÁÓªD¸ì™8€Ç6àyCž8è™Ãž:½CŸ<øÙ.K{2ç¢!rËØ²Sd€ )ÀS ! Âk”1eBú³Ö»ÈÈÌ9çTóM_cró×ãÜUÎ:ûD6YÊŒp'°µÞ¹pF×bÏìUX6ƒõw8b÷½ðØgFx*Ch"aíÀ)œx¦™f˜XF‰ddDƈcˆ f¨P«h\‡Ú…(ðÉ&VÙõ®¡{$¹æCzÈC {wÆ_} þ^°ß€%xhßZAƒfºé`˜ iƒ†@EäËþT»ÉH–HvÀ ú„5NEg)Æù&•\âmEXö¼‡ ¡¡O&…V¾iƒž§Èg¾’¶Ph£‰+zñÄF|·¥¥¦"Ã#O&Ç'l|ùÁ G²É7§¾CN€¥zjY.š;òÈfkîŠ'¿üÂ?ºíðèwSÜùÅšw_(è×ÿkúêïnˆ-0ÿ˶I…0jJˆÏ|D`CþŽG?ö)/~Ãßw2?.Å~þÃàeðAšÎPonÀŒ"d!Œ`L` ‹·À B¦}„O`H ¶)Ì`Õ¢ˆâ~AèfaA XƒZH§B&ÚŠ…6Œg¨˜NÑ&5„"Kp¨C.bÅë€:îGXÆjÂØ@…2‚e‰M„#ž˜EIÑŠ„©âg‚E:¦d‹]äT `Â@†*1ÐÐ.”åq„dlæØG¤¼P<‘á%'hJöå…åA^€ ܯÀ L@ô¤n_$e)Iô!H}<Š%5y“•’Q•ªÿR{à~F`Àe¢ „l€¥OxË0ûÑŸáµ$zÅ(_§è×>v²Ô‚9z"‰Ï>e18È>—:-(­8+kÙ‘`VŸš!géèÙØJÍU=mõ±€ËD€¸Â"‚‘.y¸‚º¸ž&zÊÙÒÖ¶ÛÄ- u›EÞN7a×ãê˜q¿H`9רÁïP‡Â2å!¼[ÈêZöº»Ì®· ÅîÎWYP˜– Äa•Ã,ã…rD=ùj’Üÿ€¬/^ï«Éü>p¿6ìï…ñÔŒ%˜ð´ˆ8ß”  •?Pþtà"æb†ºáKv8~naˆqÜ¡dYXFLÎBÔ¦Q×)„… r=ìA3æÏ!ãOÇå±}ì> WPÈ]®ŽÀiÈ$¤¤Þ>Ž@ Ty2ñ¬æ ~ùža¾ã˜Wfž™ÏÍ!©Ð±™2 Ø`9à#!à*“ÑìàÐþó36mEA/Ðô3ô§13jµA4!!½‹ <%™ž-VMUW/ÔÀõKí¸S¯/Õ½®L)zâšsFØÜ à`ˆ*øÏ%ZIZdoî׸ ö ‡½¸bGïØÝ. >Ô €pþ˜Bï‰6pŽÍuƒ,2ÄïŒÉ䩬"ÿxÀ>p‚ÜàGx¾p†7\à\þv'à Ãq­ÜÈ;7ºÃ‚„?¨ Å=‰ ‘Œ ›»Fh(#LEé#V21PÔÜæ7ÇyÎu¾sž÷Üç?zÐ…>t›sàÀù2*m¹0q V|h\Æ5^–!LàRGüÄtkસ LÈJ&Š ²—ÝìgG{ÚÕ¾v¶·Ýío‡{Üå^v=â”dú0¨#NêSËÞP FìÀ=¹Aå ˬ¡QÁ*Â'ó±ÏÝò—Ç|æ5ŸùºßUéH½hSk²wõþ=i¼VŠÐ“i C `E*ç܉5 {å7¿{Þ÷Þ÷nï¼-?zÑï„ôÂ2=ÐPŸú«$£0—¹ì0$P£2P€U(€äþ÷ßø9o÷¤[7ôÅ—Éñ•|‚-ŸùUéGOº/â#¼r*r6¼/~þ÷ßÿf¾‰>“È»øQ?_a¿}q¿÷›Š~£œ!p­¢Œh @ª0z؃ǣ ±û¿Áß À¢ÀË:?ô£…|“,–dÀ¨†õJÿá†1è“èȾ«ðÀäÁ´¼DºäD?„NB.pÁL"x>„ m¨ŒÐ«èþp1Ô=äÂ.L; ¼»>*@÷1Â5aÁ]YB&<ˆvè óòŸé ,H¬$ <¶ËØ„²ËÃL„¹3€jÙ´C€M°KØ„L(;€?ôÂÝÃò³/",¾2œ3œ“4T€„žH"ÁB„ÊЬx̹Àij[à€±C€ž˜Ë ÄUè EHE³„2È„[G Ä\|Ĺ‹Ä$\:J=K”L4– ÙÄy@-ÿ û ëÓ ó`(«ØAµ D[Œ„ZÄÅH@€^€DD²Û„žØ„|€XŒ„`”ÇqŒ„)ÈD4€E€tŒ„t(²þó¸àx¬Ç{Ü„|TÇž0€vÜ„?,ÇsÜ~ŒGCÌ„uTDrlGHaŒ»bLÂ1te$BM|Fa£/ … 2ɨ…ã Vn«ŠnL»@Ü„2(†|XDZ›‚2è…UÈI²3€ZÔ€t¨ÅXD€2„`,†FŒ„UÜ¡€j »b@DP(†ApÄj¨ÅU˜‚)àG©¤J«Œ¯dÅ2X…LHÇŸ Ê¡ŒGðª€X4˜ÊUàEGÄ<B\‘tfD“ÜD³‡–Ä•£Œu°*¬ˆ!ªh†*°I´ DÀË|¨z,†°Lz Dxì…,»`,»þbȲ3ÇÓ„v”HÔLÍÕ$»Ö$J=ÄÏœ‚лŠ,;ÞŒOxǰ¬E³ìKò3FÀtÁ$Â<ÃTÃÙà 9P†dQøIÀ0Vˆ…ð…#€m‡ux¾žÐI¶ ÆZLÔ4 €‹Ê“Í@äKÙ$GzÀ‡w-€‚ ¼LU´Åt,ÊÍ„^,M[ÌÇ@´„[„ÐH„)øJã¬Å·ìÑà€^L‡|øÏWœJs„ÐF¥JxTT[ KGüSZ,A Ä^\Çq,ÕUU‚¼< @ 5š,ý-µ }Á»7ÿy̲ †(@†°ÐLàFŽŒ„<€^ˆ„SUDð(ƒSÝÃ@LPËĖ·øÏ‚äIFÝ„vÊ-œ‚sô„)pD{ÜV>„‹|àGfuVhGO°„L¨EúlGJ]b¾*ýË+þÝ+¦B?Z][}?) 8Ül 7dyI€.•Š<Ý<üÆÍÒðsÕáƒÕ¡‘Õ£ÁÐXæ#¾É b˜ÕŠ`,°˜ÐÎaý½>½×‰Å<ÝÔË ¿‹ý¼Œ ˜] €U‡õÒæp,õ¯.8ƒ°&ˆ'¨I|;cõã”Y¹3Ê)A}P~Í,->ŸEŽM½»y€ rhS‹d˜…É 0>hÚ©…[ÄY¥ÓYáYÅÛã[ÀÃŽOôŸJXIdi(¢É‡uÚ¸UÜÕÚWåÚÛòZÑË[ÉÚ õŒeÀœ_Å MH„É€„]½ u‡Î°ºþ'CÅÅEÝ›m\Œ}\ìŠÜ¦š\ÝØ[ÿ'1#h) &èŸ{€r:ÝÔ^Þ›[óCÁ6y]¥ŠÝܘ]t[칊~˜†Ú €iÈS0…iÐ^цìÝÞîˆà^8R˜Á«˜‡Éh†  &؃: Ó„€ØáµßŽ\Ýœm]üJ^ŒZ^é©\˽Œ€”º  TV`.ÜN`‚(‡¸Š*Pd9€Ú#ˆ® ƒà½ß–»âÄãå¥þÕ§ÿMŽàʈŽ?À ŽàÖö–`a¸á>±Š4ÈÉHеŠˆ€‚›*ŒŠúá&Fþ;Ö°ýå0Þ&vŒæí6Ñj¤«èí5ï-61æa X„xÐÜ9EQNa'–ã/Ì_º•â£â]²âúaáV 'ƒ… &ã>ˆBîb8?ÀŠ3»²XBp#.C˜ì‡ÓäMæäNödO6:ÏÛW6Œ<ö¥Ž>,îµ j˜žà1NˆB.d«øè“'èƒx¦š @„_æ`æa&æb6æcFædVæefæffˆ“Ä(&åÑ3eoBåÏSeU{ÞWÈ B>äXþf°`/P e`Ú¬ˆgà²eˆ_ÆôãåC:ª[a¹Ûǹf¥þËæOk¥´¸ ˜^a¨^Øb6_‚æ^ƒ&_S(…Qì2«Ëh'»zgxŽæ»c1«æ~ºgÚÊçCKâ ’‚ #h=¬ ‚>ˆè°åжèäÌè@ÛèêhËúh>ÃŽ„õ ª³Æ±?€ë J“Å Ë EpÛ„v“ 1ˆƒZðìÏíþÐíÑ&íÒ6íÓFíÔVíÕfmÐÞƒ:6^Ã^*Ä@Á²ö¤>îj«èÄ b ‡G ‡ÆŠi؇§8†;àÉ.‡‚¨æ–~€í–íDìÜRìŠbl#àIÈ g¨…²x˜_©‚P„ ìh°‘™&çfnQÞÚé¦nÚþ×ë¾§ì¾0° ÿÚ‡Ä[©ðhé§`îöž§÷¾¢žî±¦!û'ÜÎmª ¿ÅŸx hA3Hß§à¡©&ðõ6ðæFpTpÙfðçqð‚ðŠ!Øá¾Up„²0¬¬èD‚ —!Z„(ðŸ¥'Á7ì/Žï¨gñ§¨þX‡j„x‹3è°X©X€†Š÷ñHò r£&r¢0r¨Bò$Gü^ïÒƒQ@gå6ˆyøÝ,ñ-?ðè–æ¯níó¿*s37BÀrƒ'Ð^T 7×,,ˆfh¹ÉŽŠ%orõ¦söîò¯†¢°ö•0—Ÿ=ï¬>÷s‚À€ES ˆ5ød)äzhe­ ”ŠJØÆ?¼*ÿðJwîK¿h0‹iRËsýòôÝõP†Sêƒ0u‚8…0‚@`‰B0W¨„Z†l0ÿ."g‡öZ¢ƒ @Qà^íÝoaP‡é‹°Cçþ@oJ'ž øOÁõÐõÂÆsúþÚ`ç®aõZÈŽR"FˆKЂ¸)+ ˆ huNvapxˆ—²XhÉ!8\® ;pëplœŠè¢[§Dø,@„ßI»¸‡`•¹Xž˜ƒ8ƒöî÷/ŸfN Û¶ ‚÷ó4•„¸SP…-x)a€/F…HˆµåáŒúB§z>˜Vè„?€§B~ÊÞ$X)¤ E°÷‰px x‡³È›Ø0™h„³xxƒ"ðy;Çhùz  z¥Àïù2ÉCxa ƒHß[H0gÄx‚ü§ †lxþ8~å‚І£Õ )H€¬€÷­Š€N‡B)xýBp†;X‡ †pø‡¨‚O}°‚’“ Ù§}Ûwó€šôX†Ø—Ñ™ÜùhäGõ`)èÿ† þÚ¿ýò8å¿þºøùQþw>ü¤Hüé2‚lQÌ‚Èør`saØ·?C zaxêÊ.ˆZÂnP4ðàÀ‘¤BƒBa¡ŽE¬hñ`7rÜH€¹$K˜5qíI*Ö¶˜‘âò%LE\œ8ÑÀ<)öDQ ^o.CÑ ¢Â¼l.[¦" nvöüÔ壛{æÄþgÈå©R>í'…¨Q¤J¥d°µëW>’øl3L'OŸ@…²ÕÊÕ+ÌÀ‚óƒˆK.Š3nìø1äÈ’'GƇæÌš7sîìù3èС£žmú4êÔÁ"Pníú5lÇjt¬mû6îܺwóî­9‹!ž˜¸2°Q%aC,°2 Ò¹ƒZ•:HÅAD,Nˆ BʉræÎ¡t¢º pÿ¸*%ªÒµÞÝôÙ]%…îQ÷óçfðK2õ—“6îÔt `ò’ ˜" lHáÆ(¸T…/Rx`‚ º$“3nÖ 2܃B(ᇄ (cÊ„ô!ņþ5u ‹"ø#a†„XlEy$–¥¶$“MvFš“QJÙÙjHZy¥d³É·%—]zùåmrИaW¦En€¦m—œ‰|A‡óÀÏ;í¬‘Æ9t¤L9I¨úôÀ .Q":>/1"•¡ý%Ú¢‚…À=€¡(£ûù8(™–=QéóA¡‡^Jª©@ÊúRa‰%®¸*9%¯½j¥¯ÁªÆZ®ÅZ©%›É*»l™K²o.{É(ò‰!oNx£ q$Æ€âÔbN[dÁÍ`èDO6ˆ¼Ä”æ¢;¡#Š“ºìº;j¾/Ý#Éþ5÷ÒCàž `À³ÊZëa‰;ql» {1“Àb¼1•ÄRüqkÈ2;2É%wôÑ hŠ‚Š5€Œ¬>ò]ÐnDðf?yØ|¸@–@ а‘ *xóQ8-¬0L¬J1Î7©ä’j+ŠHL¹¤`LT,¤@ÒK7íÒ'7Ñ4Š.I@´+ TñÔRSmuÙ3€6ÙM¥ÐÊ7mpƒ´ÒL;]÷Ùi;ü#ÄCJ 2ãYÌ1äŸi9äU6~¹l´™¼9ç%@'‹~êìÆŠºe³ :ÄÇs¸?nU0ZG?ƒ>Q‡=YÄbêXð3‡QY!7)˜Á=ÅóSþŠ"»÷þ»KßðwÇ.u±ß:\¼üðÅp¼õûa¯¨9†Ê„JﻩåGuþá&>Э˜ëÿ8åýc6¹ÿ.f9ýéOd£; {£8"[JÅ8G wdC7+èÄ4ÐŽô¬~ü C(Â:ì~ÂÈÇ¿F€,ôÕSØ8:°†6´H- ˆêæ h(Á$ì&ÑÖ;2±‰N|¢MˆB~l…/ܘ ¯8¥Rñc4ä!xà!Œ·‘F#äCì¦ò‰ÁÁØA±Žv¼c¥¸¸.RÌŠZVÿè$.òÑX_4#"9—þ!‘Ìj†qrÃ57ÍЈ) ‰9ⱓžü$ôXÈ*^F ¤)—DÈQâêŽ|å²Ü(Àò"€çì ÜlÀÁBÁIP³˜x%+åÇTN •Ì<Í*“y,ÍÕ²šÉ:Æò $kÄè8Q2ilK+†iÌu²s„È”¦®JùÌ`9sž¡‰&<äJnò“7U:úy>P£7-`·p™›JD fE:ØÎ‰RtVï̧•–iÏŒ 4e>1 ›} ´¤µ9°pÀI˜â£Â2tÓ‚IäæݨÂAä2 uV´§>uÉEEj$~þ5õ,*gB*ÔAÔ¤Nµ >p„ÝØA¥0…N±%SôF ›äMLwóœâæÁ@È0 žþ´­í êRaCT¤Šæ¨tÍŒR㚥¦>µ¯ÑÏt“®„ ¾Øjo 1ƒÞ`À%Ûæ60¢–½,f3«ÙÍr¶³žý,hC+ÚÑ’³{Øæ ÷¨××Ìõ®’ë¨kM“×Õ>†¤~õk"ð ݘ‚ i¤0h‹è¨#‹H Laœ!,BŒÐ €¸ˆ7ìÐ\77°àBn汈,sØÈj¡Þõ²·½î}/|ã+ßùÒ·¾ö½/~ÝÁˆÑ¶bþòŒmjìêÚÙö—1¶½íS-€èi~b‚f $ H3bðÜŠ\B ¹À=Ø´ßÛx ÈÈMP‘:àÄ~±E¦X`É´À›ð] 7gXrEœ]wú¶fÖôbÒ\i6#ÕÍæt±9 b7bP)NP‚‚$TxGDñ Sˆâ.)ž åÐ d9ÍyNtH äæB´ˆ€h#øØÈN¥1ýZ \3Îî/´ùmÆ  LCö²ñ„EÛæ|΋oƒßZäH€Âýêod+[ÍÌ.êÁi›ðópŒÚ“þ@²¨71XDnÒqÛpƒ#°"XþÔ‘kºä6>ùGS¾Ú• ½†PY×Vf &Ë5xK5ÉÁâÁ»å†5[G ‚ŠÝF!ÐLG(hDDÑÑ~!y`Ñ`þÏþ“!špœXÓäAÌ @8РEXFDnÖÆ@ä ¢Eõ`ç–¡¦RJÓ²!˜ˆd5a)d h |Aõuh™¯í!B(ÁmÀËYýŸ"","Ž"êžc!R=¢)Eb2M"%z‰:XÓ;`Áf¼‚/Ù<ÜšÆå†  âþ@DUb,N#­Ì"-2†-. ’.²/ö"—¸‹XÓŒCd† Xƒ¡qD2èÃÖÕŒƒÜF=tÃâÕÆ<3H#5N£ê]#†à6þQ7ŽÒ7‚£|ˆÉpÓ 0fd:¤ôÕÇm¨ƒ2àÆ>8@Y4ðc`^T0@?à?þ`@þÞ@jQAÒA"$o@#7BЂDAÜÌ#n°šüâZ¹¢ÃX*ߌd÷•äŽeãG¥ä­$µ¤KêF?471Áü‚ ìnÐCÜÆ3ŒYmˆÀ(Ú¤”GÆTö€>ÁK\)ŒC¸6ЀK¸%\Êþ%]JA!8ìà ¼LTÂ0ʸÀK&a¦QÂRΘRnS¾SvTF%nÀK𓨀ˆ]m(> _mP€,Ü7¬xà†%¾,ÌÀ ìB C8ƒ6Ãá¼=œApÂKÌ9ƒKø&pº^TÅ^¸„\ÐE,Ø…rÎE]ÜÅbV#ç]#6ž$ïE& M&U¦eÚÆ@¯Y“ÌþáF4àÆì›må†%Š8 Ì]úB¸„8’BoÖ„§æ‚(ˆKÄÈŒÔÈH‚ÒˆL'uò—u~vœvwÊw~gG!ò“8þ„Zn<€á•É28#B$ƒ7€ B!(@€ÐA<ŸÌJôGH FJ`ô¨`T ¼ ª¨ŠÓHA‘Àª@(PYã„>¦=]¨ÿdh m(‡nÄ "7¡ÀMâFÂm(‚ܼ`n Àç„ÃYº5tCˆ;Ȁȅ †½ ÆÀÌÁ$Œì©Á ŒáLgc”Γ”ö••^©EÄH`qÓøAn4=â™ÁXrD0ŸÆ}Á/†ÁšJÁ(Ì…Õ0B̼Äá. ‚*0MÚ°ª«Â*àˆÍàè ßøÍXàjßÜ ¡:©uê3%*å,jñ•£– þ¤öÓ=Bßm$M9«nCd©)PÊÊöŒ‰(CTü‰´‚9äÁ<Á$¸Ä·†ë¸–«îðü ú°»Àú´“j +3kä+æ4j²"IJZO’i< É1h‚n‚DFÖ8Œ*“’$°^#¾¦’¾VŽÇL¨¿þë@l5Å™ì¤>ìPmDCÜFü@n8ìoˆêµ>,"Ú+mM¬)U,Çðëåd¬Æf)7%@iâF6<)vÄ#h˜mÌÃ<äˆ,7€ÃÂìíÉìjѬ ÙìÆàì !«Æ.‹ÊrŠîÆ1ô›dÈ­è7<-Ôº•ÔêÕþ‘Õb Ö2þŽÎþkˆ'7aÙm°v„hÖ†¼cm ÁT¡0€lÚ®íOµm\½­Å­]¬uÖm²b&7Qëm˜€i… \ÿö OŒ g£5]B—r1¬`†)ìÂÀ"ÄìR™ÀA @4ZDzež¿1Ç1~áÝ"`cÚóJÒ÷‚/š¸.™íBÐ#DÁ ó†Ô™W’Ãæ"æú1çø`RÞñ²‰pÁíq±L±e6­µÖàFˆÂ>ŒxmDŸØF)¬‰ÑžEð,$oŽ$;&%›œ% &çŠ&Gå?ýP-I;à†#|;ÔCGœ€þ8Õ†(/—8T¿2šÄ²¡ÎòÑÕ2¦Ýr+5³3sI3ÀTS9@ËmxÃ(#Găàâ0n /l*B4ÄB6— 4ß«4ó5Wš5cI.»$2pJœ—,9¨¢môA€ÙAD´B<“Ì<Ïl=‡Þ=«Y>_É>»$£œqÁ!?˜ýÕZ84òEøÁ,äXVD€ƒ54³<ôÔF´øM´Uô4±t²¼ÁñÕÒ.Œ.GÂxnÄèÃ:rîmÂW„»T‹M+‹K»-L LM#ÉE#¤9€Þ&’ þuFulMõ‘T58ÎNó6]Õu1X{Öˆ,GüL´²õ3×ñ‚pûÞÿ/-Úu/>A„À’4°óE€ÃsD(LVG<Ã1Ö¦Ú†*@YD3Øj§¶j¯6k·¶âb¡bsFo‘cëdSâÅÌ+ v#|öðj¥—4C”uDÄ@Iž7·s?·å=p+Žðl¯™\Øm{^n³áÀ7½ @nœ´E#Ä>ˆum‚ŸÙÑðôAàßL7lW÷þPmK ]ë66nø&9÷ ¢\0Gü@w„FWÄ0Øo}Ó}ÇXlþäu‹ c_òvÿ[w! €«9R µEÜÃErĨj #tE˜AÛ†°¬Wx[]xE¸5íÂõ-fwŽ}8²…8 –6"ï^w„"Œ@Gx<ÌŸEœZm‚30CîÔ ƒ¨?“ÖþÃC<îƒÝ«œÝßýE`@8#Œ`Aƒ&T¸aCƒgì0|#̃µl ‡“âþЕŒªð…YgΞ<‰BÅÚ3R`Æ”)ÌR|e‰ùÀ<˜<Ýü4¦"Œ`>ÀFŠ6w' Þ€I O0) ¹•kW¯_Á†åŠÁEB,¸¤U»–m[·oáÆ• 7ZwñæÕ»—o_¿àT`Ç'ancÇ!·PdeË—1gÖ¼™3Á"ôtÝðÁņ D0ĶÃÙÆ„‡N€Dg3 9ƒqçÆlÝ„ú¬ªu8Q˜F…#—¢O7€Å÷;zuëdÍ¢¼{÷º‰Á‡ÏwpáñçÑï]Ü}ûÆ“GÇ—?Ÿ~üÕŸoEþÃ>lꡈgz¢ ýª¢ ™ŽxÜ`£5Ò8‡€.¾¢¦›. :Á„’&Fˆã)™”“B¹-²àf+ ¢κi¤;„ÎrOÇÕú.½Ì«¼ ‰o=‘l>™lÒÉÑR`ðIÎ$AB4#H°r¡Ch¨œ(6C¦a¬ ?…ÄØâ«QHB)Éb ¤€T&©ŠH%‡uVx€VîÁ#F"«pZXa˜6>X¹‡ ¡ÆOA ëÆƒrLÒÔÈ|,RÕð†\ÕÕ¾ŽÉµ¾aÈ]à#†hþxD³!fHA˜u f¡4¿êb°&¤Pf0 ¥¨Äœ=ä¡Â¹˜@@GmPIÃÚ=>ùd¸Uä‰:ìÉ"×ýÄŽÛº ÕßcÕ Rg-ø­T_MدVV8Vƒ!^kI_)®x>Y°¸¡wüpˆHòc€…ęÇž9ö²cL0™=î fZ5®Ùæ›k¸ ‚#Žᆾ‹á W}¸gˆ'ÖXé¥+;b™Fˆ’RzgÎyCK…(`31 Ò€1¢ç³ÑN, âùè‚&Zá¡å&Òè·gM:ê½ùœé» |ðM‘wZ&€†HpE3-̇ 9þh¢lšÕÎ\ó³ÙÆm¼O»nWéýÇ»A7UoÁY¯8Ìi$Xhˆ-âYhj„ÀÌê™ ÈáòÍ‘OÞßÎ?OIÑM/²ôèÏCÝyW—]û)‰Ð‡#XW|†r©]!"*XȈ8*iè˜Í’1H,æxåñÏ:æµ»ÞT詤é0<ÖóŸ{²·=2i à†àª°‡\£ð{C²€Xhf70H#„ûé„%” ÿø?»pUd!b ˜Âî$p5œÏpÁA¡aBˆ`&„ïcÈ0"‚™!<liÅ`00BN1(”þ!øÂñ¸P‹‰á#CCޱ3³@!ÈHO8`! 0žAV >#KpˆG³‹Á,nfTô#þ¬F÷d±‹àáb!ýòEA:FŒit¤eL€(öMrh3öÁÓÄ44¶`¹…¡p˜9†/Ò€g ¦‰hÂÜa©¶@.Ò;+DdzyKõ0†–JªÕ#©IFp=8@Cˆ€Çƒ8Af Å$l€ ˜aÒPH„w=ø"ˆ!ö¿>Æ’œh›e/QeK]n‘0ë„!/ÑÉF“žn!¸`p!¿SH'HKx/ZP‘Qfé”ÝÌ· ÀK#‚ùþ²Ñ&$%Pð±o<ô2.Ø B `~T ièC".‚YˆËsá,\9—Î…´s<ñüi¦ ò8Ç‘è„pÁ¼yÅ%’†:83`4Bd€ ìIÕTMÆPsvÔ—-uOÎT'[ceÂá‹—æ€Å*„ÜÌLĉ<¡ºi’b§nØB/‹@8VKí.›²ÍNë³µí^N[Þ¾ªÂâŒõ¼¸J…²2 ¤j¦Ü ¹Æ8p|ZkÕ#/L€Ž™f0€ã÷øÇAr‘œä%7ùÉQžr•¼Åm .‡Ùbo™âû…ú¦%¿ûþ+ ´p:¥q£åyÀ‚xPx®ãï1Š €Ë\C½ Ñ^‘Y ÓŠÃXÁv±ìd7GÆör˜÷ˆ¸&Ï|ÝŽ›/ç9·+t—yèc}îÛÆ… !P…B0q¤Wæj ÑBìAŒ»ð¡ÕOˆÙÊ™y›ùíÀ]{eã.¸‡~»ÝŸ´ˆ/hõ«)öŒÇr  ÑC`œuÔÃ2 ‡Ê ÐÖÊæå_©y僊ó*ý¼[dþRš³°ô`<=ê™Ä¬yi°í+9ˆò2d0xåP]?l²bvˆ(øÚþ{:ƒ lBÂùåïŸFÍ'•Ú?/úÜiú¨ú®èú°O?Œbô®àš$ÆD!BÀò ¢@ !a&PD JÀ æ!Î!–!3è@òÀ (*ùø/ÅÂÿÒîùÚB׉Èe>^€Oöâ炎oà üÉñ¯ R ÓÌ ò $ˆa!3PŒ±^P¹p:hÐólð½Ú.ôðB©‡SÈP>H ð @Œ¡ÀÉï¦Äd !”`â$$^@hÁ ‚ ø¨!ÄÁÆ $Îa0ÔÀý¯ %ñ+¾ÐåÂP ÉpaF/îÐþð€Ôp EC ìjA rc°ÀòW°!•.cz! à â/ú ná„«n 'qg¢=×uÉ £§ýçA‘3²¢9¬  ÷|E‘ jañÂN!š bâ/tàÚ KB´" €Ï•ˆñaÂéÍ­”ñ–˜Ñtœñz 15ÃŒìáLàcZ§ Üa€ÏÀà.Äá nÁâfQ3öa§˜ ѦdÿE‘æú‘þqtÒy’ 1câ¡›`OÂ@cA JÐ \!» "Ü BMþt¡ÌáÝ0C)2$ô¯+„l0`:úÀÀ@&‚­$M2TPòÙ.û¢%ëæ%S'&e’3¬`042W*! ,ãÆÿà€lbì nà¢q3XÒ*Er&,Bk¦FŠB:ºò$;ÏÁ’ V²ÈRnÌtÐ2-5#Ø€+愲 †  â­ –aŽ¢ó ê`À!  ¸@4$â¤È+úz@È&.`O|"#(´!GAEŠ ê ö¡1sC,¾r2+³‹.“h2o6“31cÏ 5ú& ²!ꑈbªø²!Î r‹þáê`ÂÑ!¢²+^€Π8&î8}âv@+ !@]áLa”sv€Ð! ®& ”~“`þ»ÂZ*'[¶&¼\Äå9`¢\Î%]òÅ]à%:tÃ84'86%™ìSC/d_ed‘Æ´L–b(*&rô xï ’Á–ÊÔ þ„ÁR•kŽ!6Eã}²Á @.£>¯–œÂ5 ?–€¼ÖUÀÖ`Jvl¢ö nWñ ôµ2j­ h¬!‚ ¬DúN²âþ¶0÷× 7€·hÎõ—q B\ÖWˆà<ë¡‚<¢ÚRÀ`¬‰!"àÖ“3!nO\xÍ2·tM7kÍ4u©guU%q æua— žˆsq… x $ ^"z!ì y‚þà 3Ž!s â8sÇyIz§ètŸz£Çz‹{óFl·÷Vu|¥fÏ †þ!$fž r1ƒ ž@ Bö`n–0í7óð7¹6îø×nZ7 µw{ÏrÒWê‘ üV3’! "w^`¶† Ž@4†ÀT€|é÷ƒË)„“q„Ý®„ƒÄe%…awÚÀr¥Få B`öbT.€€óo°` š¡˜Ò2Ü BÂ3ž—ˆKȈU‰?L‰„‰Oʼna7@ñöVž`~" ~Rúá‚‚× AJL/ ÐÁ â3Òþ6$Ý8–àxkÅòí̃ íXu8€me WÚ E‘A¢€ïþUγ,`Ç@:ø2¬i‹  ꀂ–>ë÷’ñ'“ãLŽlÝî““÷À–ÆÚ¬ P«(X†âhanÀz™NÁ‹@’ƒY˜“‡˜EÍ˜ç ™?L™‘„™Çæ`¤ÅV¢)Ù  Ì@ BYB¢Þ`ðÂ^Á tÈ2˜V• |CeÿÖ¢L*£5z£9º£9: ¤×S7y/èøtNØéylƒ€¿nENÁ!ð@„ ¢Ðà4! ²/ª ÖþÂYãf–!VÚAbªÊ:©•:¬\ðÿ¦×I žéKž±'”EyJ*úV0@O "T™mõPEN!Áµ¼ÐÀüÔ!œÀ n!!>óùª-¦ckJM§¤Óƒªw$¥MÖžYc €œ…aŸd4K@ÅÂZàÆaR$¤®!>rèZi욥ðztô=øZGüZ]‰ ö x„€OfW0 ‚L!n¹ ޾aʘ!'bÏbû²ëZk‹y¤õ¢³«ç¤Ÿ/´Õµ@)Ÿ$º!0@ºBŠ×D!,€ 2q²`Ç@â3¸m%³ãiþ³ëƸÇã³ȪÉA.@B§D và ÚA±+ƒø´°±2†àööUãîà&ú½Ä¼Ñ ½åF½Åƒ½}ÉÀoEƆ^›¤~› !·àª’!¼`2cv`.ÃiŠÂ}Á{IÁ‰†Á ¹?O¹Mu¾ ›ä‚VVt—Õà Â<¨ ü¾€0 J »"JvWÅq…ÅiÉŃÆDÆ×.iêa©¹¼Ë½œì^Z3\A’žäˆÚ œ’Ê `‡ÂÓ,cÐ(3To <Ê…»‰[¾:™ô°æ’fœÁ£ ½Ð ýÐEª Y3 LÔINþ¯@<ÂýX`²_”(A‚ ÚÁØxûàñÎéCÊ‰ÊÆÊãÏ9,ÐoA©H=3¢!ê ·™Ä» X§¡BÆà§"#/3†)8cãVnÙ™½ÙýÙ¡€ÔÉÔÕßÉL; ® Õ]Ý„`3>ãÌå â°±L¼ ÀÀŽ"4a!¤ÁÎ-£P3Vz3C ¾îËýýßþªö`©¨Œ¬}n¤:¾œ=XýÛÁ=Ö3eq—Iàv¹q/÷ n×dÛAbª j$š¡ò€ðö=>søàóœÙ ÚÙ¾¸~†¸ÝÛW>þÂ}3 B3À{…!žRÆëøª&7râABŠ~3ãž„X3Ú8ç5§åZ¤÷\hfþ²j^žnÞêuâé<‡nE˜ TÁïv¡e…>¼MÀÖB¾À¼2.ÍR^ìõëkPë·Ûãë·£áý>yv~3"i(^  ˆˆaZÌÆGí |¢â ”¿5ÃÜaõ:£êÿl 34æï­ëÓÊðÃ(ìOsß#ÁI–® ¤@™²™ ‚ è®` "!á "è¡}EÃNȾïgyR_2Wë¹¾Ï9QÕÝ ñŸ_mj?3ˆ ÌD?”àþs xò/½Á "øÞ |ìÖaN7#x%U~ûý%úËTð÷œð‚–À‹À%¡Â… :|1¢Äˆj»(lÁ-);zü2¤È‘$KŽ\”€y&[º|éQ5Œ4kÚ¬¹À‡›<{ú¼ÈIÀE-ë`4ê"E7“ù‡¦;¥ÄAù‰õâsÞeõ)f ̱dËš=‹6$?b5±˜7®Ü¹ ƒñ)ˆ7¯Þ½|ûúÝ«òÔßÁ„ û=H7±âÅ +ÒÔ˜6²YAIêÌiÅ„7¥z¬” :¤Ì¯=°Bš´2<ë… Iä™°!áØtàËç(þ´î½QS%µÏ}º ¿6´òåÌA¯mû–±ôéí¾Ž=ûÀÀÚ»{'ˆ˜ºøñŽ1BnŽžc£=c\ÄB WGEŸÓG}œ&±uÒä÷y‚$‰qOñДÍMOøÇhH!!]÷_M¨ J…Še}*}€öHbKÏÑäÖx*JgÝw.¾H w0Î8Xx+ÞHWyW"hÜÀ£ 7q± óÕÇQ!ÎܱΠït¤À0îäAE }€/òèÃL?]K9¨ä†*S‡;¤PS~æô‰†7)"F(dpQ;u^Ԍۣ…6 •»´2JÈ) þðy%grƒg/x&bšnz"F)â*\-ÒHja2–ŠjA6†ÊêC:f´Ñ¦‘ €ñÑΑ,qÁQ¨ IÂ`+”`´ Õ‚IMÄìiOE@èÜ@„œ¦i£®¤%Ñ7Ï!*üN7ÌÛ€™ ©&›R(ɤ“²~LR§}ÚjÉ šjÊyª2ª«šlò«<‚\Â#ÙÌ‘6îœÀó `Ò‘ ˜" lH¡°­RP"G 練ˆ “+E.ðT;þ’LàxÃÍ6Ù\S…P8Ñ J „ÚD9+©{‘ðÔÇ5ƒ¶bDMtqŒOꄃK4 ¸`Æ+┆-èT0‡%õÑ8QàŽ7¡±Îú"N·ß†;®½þì°4ŸÞ‘È sÉ(· ;Ë°Óørë¬Ê+êc€7#©ˆ*­À)}(uÓRàü´ÓM+|GôG’LÂ_}wÔa=òÀS'À-ŒO`´Ï7 âÕÚ7åíS[daF xw2o Fã0Eí*`#l·˜œG5«]Cg<;Ï€¦;š©Žu¶ Õëf—2ÙaðEµ« ŽpþÁ±ˆc=¸BGZ@ ]ud~B :¢€ldàyÊcäÀFÐ0yE˜•5ktãá9Ì5¬£ oˆÃêP‡<ì{Bü%]d¸,¼p"dÁÂÀDiŽÜüäðÁ9Ü·B ÈÀ<ЉPŒ¢¦@…*Zá XÈbµÈE‚ cÎxýþ§<ŽÐ‡pȃ :=éõ'xÂ#^?6ÁèxЂwÙ`Ë4hJïtp”*á'_‰=|Á*€^  œÀ3.0Å"–6Ǭ`møGÆñTä‚h…"`V܃ 48‚®þ¨`)ù¥Âôƒmy2ˆÇ!‚Œe4ãÑÀA>š8 8Þ@‡Q„q ÃèàBM¶ÀŸ Á Â@F{Yˆ¥ð,ðc³B°‡OØaÅéH%̱yPÄSØ Üñ˜°zæbÔ -¢®hÁ&Ä ƒVhrOù¤¾ˆÓA1ÂðC¥E(:á dàpÄ"0@ 8€}ÜcñhǺàqþˆ`[®À€G˜€xä›á¤*0Ã!Lb³¥= ©JotÁ“ÂȤª5LJOË–’v¶"hKÜ$§+èCWaT u8ÌÆ}~¸0ð ŽšH ¹>‘Â)ØrPd|à•Xý×’@ÜáCÝðÈ5È¡£aôªYݪ"vjžþ”¶ö1-lÇ“ÚÖ~‡µò­BÞÛÊ늽üõˆ¼Õ‚}¸·rÚ–åôˆE £}†‚‘4 Y MØ`nô„zx+F\q nd ŸÁÎâ†<Äà#¶í/ÈÜ‹ßéÄ·¾Ú¡/ûòÚÏE¶.ž­Ãä:‰w•Q8ÍAÑ7Qþ¸QÈx„½ØÐp¸žñl&@°O€ÐÅ®Y$q‚#àX“Â3+àƒ²Ë#¥Ž3ã_ÇÆrÖKŽß «yÏ"!°†<ȉ ¸‰A…QˆcȆ&ÇÀ“@ó¥.£ˆaàÀH,Љxž˜,GUÉ:¼Ð‘ó#È|ÖŒñœ˜8×™0t^µªî‹êÅè¹Ô´–‚Ÿ5ô JÉ馸ˆî! uÜó æHF @UÔŽB'*qÐÀCÁ¡Fö a;®ÖÜæÈ©c-U»Ú/­·@î nWéwfÝ.õ­+Ä=ÔBÿ¡Ã>.’ucsÁ„(¤Uþ8MÄpzËiceDoiRÝ\tÓí.õ·Ó=q›0ÌÆkŒËeÖwñ»+t ln„h”1úÆ“4#Ȱ³+t{”ø&D¸©&¾í’óùâ"‡ˆÆ?Ž—r›ÝEWÉ…ÎÞ“ÿÇ4a€y~R0ó‹| PßE¤ð…Ü$VXr…¼°‹"\#ë)rØìe¨ï™èMoÈÑ‘N¥›éuºÜI+õü ÁL…øÚpØa' ”4ÖÁ†OWÛÉ7iFEe ÃøóÉ0‰·Rüïü¥{ÝOVJ¼³ºãªß ß›îwÒ¿2ðù™Þþã„ 4ª þU4´²bˆ}(<™G¡å¤ŽiÔAVïÉ;fˆ>è²g¯éOŸ»·^ï®~}Ñe6ŽZˆüä/¿ùÏþô«ýìo¿ûßñaÈpS‚@F  N1Äà>‚`p' RlX‘6‘ ýP ¦ (YP 6zÕGZׇ}Ú§zÜ·jÞ'r¯Â † ‚#H‚%h‚'ˆ‚)¨‚+È‚-è‚/ƒ$haop ù¡Àvhq®  f¥uçÀ6Âm?!ö 4áÌ ‡Ü wP„šF}xpGAØgw©×zäÆz]ˆˆq¯âaeh†gˆ† éùqIc‰j‰“CI”=!úSh„7Ø êÁQxÐ?\  Í' H°sYAæ ÑÐö"=P”ei–X¡“£È“ç“õ”x&”g)—7é ऱ v Öp·' s+°d Ðr¤Á aÀຠZ`Á˜Ö¶ó0—•)—i©…kinm)_oùfqi™¡™Ž^Pü`ÂÁBà`TP4±Y¤Aw Do@á“×Vùañþ!š¿‰“˜™\XŠzÁ™­å™:šÀÉœh˜`\YÑÜ@ÔP Z0»É3( Ä`1éHp ~„°L° ÇÁyÀkМï™Âyzš9nÇ©ZÉcË Ÿû 7ׄõRÐ0³! Âð èÀ\Ñ0 Žðç`”wPдˆü‰¡¬(ŸuGŸ®fŸ'…Ÿø¥ŸJ¢ÇÑ   7g/„p 1pà O„Ô0 ÏõNP D@ ¬yPçÀuÀgØ @¤Ej¤GФIª¤KʤMê¤O ¥Q*¥GÊ¢èÙGœÅ™t_¨¥´¢ïõ*Ùà cJ¦ej¦þgЦiª¦kʦmê¦o §qj¦*OL`P‡©1 Ú@*8p`7Ya' }eX0 ­(q ê¨ ©éŠÐq¥¤Ø¥ÆÉ¥Zú¥°õ*b`‡ª¡*ª£Jª¥jª§Šª©ªª«Êª­êª¡:©hHjž=ÑŠ \Æ ¡° lÁîÐ>¡+ÀO jP¨iXVøI8ŸYz©ñ¡$µ©§Õ©U­ÑЬ5Q€!>—ðä@Žà\pOFi5ÁŸ@PghãàŠÏÚ­º#­J­}a@0>6 gךJÙªRÛÚ¯³¥þ:e8üÀnxÛðp€@p›CP YiË fàŠ¤O@§È­ R¡X©u°{Ñ’gà’@ õÐ’: 4¦°¦Ä°"å°.ûQ[†9Q+‹¥à [P‡ó` GU }•Àv¢×޲¯-K´/³1û3›>`—0E²;`6`-ÙZ?»AAËJCÛµ!d´ ðÁ5‘ Ù@1`ËpààP0c’ÐÑØŠCÐâsŽüZ·œòµ`ûb[8@ ( PÓ༠_p‹Ar;Jt;¹/ëŠrôC1£Ð òpôp j ‹^  "{þÂßj†c@mŠÊµ§[Z• ¶wgvÀPº™Zœ¤ëA¦k¼^ûŠâÒk¼ Rw€Ñ úTçð TvŽZ`ðs‘[¼Õ;"ÿÚtÚG µ¯@´À˜ª%ŽnK 6ð ù ´!¶Ôë¾”ûŠ×Àº' `€=ú 5áI@P¾{†Ž›Yé(¹œð[tÚWƒTÔ´ð ¶@³¸`Â'ŒÂ)ŒÂ8 ¹«çq†a:  P=K°q+À1KÀ\"wk†w`#…ÇL³¢!C V kþqÇp¨GÀÇÄp È€NËÀë Ò Up W ZÀ Þ` b@gpêÐlàpr@…0Õ|¼”j¹—K8 G ò WÍ@ çà ü‚À I­ÔKÍÔJ}´` íl*ï¼»?T„ º$lÇ´|¥ø\·-ÆUðá@%‰ÐŒ€ ú@‡/ÁDàà\À Zà5W6a# P ÏÐ e³ É€hc:êÄ4¡CËÂCPœÐÌ`¡ uÀÄ WT\îàL$ô`P„”gÛ¼©­PüÆ6m”œnwóþ Àé«3@ ó "þ„ÀMþ[æa.æcÞ Â-Õ.\>ð e´à Rð yá6àŠ`çwŽçynçUºq^Ý9ÝúÉ+Öï°¨À×0 èp Y@@TM™b"ɰÝÐ_a`Df€DI´ëàððò¤ EÝËžÉÚ#†=ëÐ Ò —ÐÂÐ ’ ÂÀ`° ‰  …pˆ`Î \M úà ‚@FN€îii\Ç cE‚ Ð Ò dÓ ƒ6Ç 6h˜Á° ·”)ðHòäP~Í•ªp 7p ¿ V®{ÀÔMÀè fNÜiî Õ8°þ…p a Àð  /ñOñO þ;~þj€ÎØM´9àÐÖ°I(ÐI±ÝËÇA Dp F`ÑÉ ê´NN°ÑR îØà \áirB À Ó c<ùçÀL‰z‘V¬0€`Þ Äk€dj`|ÐL•R&Ÿ1&!b1³&ýå±vwº!lK :ðy Rzáï/ðS]Ü~°m@E  ` LP¼`Ô`ø‡ø‰øÀ  qçyaÏ­ãñ. Qô÷!ÀÔ òâÖ° Q+ïî )ÌTD°Óæ7 aþq@Å>è²ÐòÎJÍ óyï@ ‚°%°-’¾lØ0T•`-Ø"ÚÂ-Þ.âB5Кö¨vt={"ÝÙðÊ  tO ÿ®ÚÕg>Èú òUp8°×HpÁ:0 ” ÿûÏÿý¿ÿ׿HùEËàAZÁ"paØÐáCˆ%N¤X‘â„Â4 ³EÊG!EŽ$YÒäI”)U’İ€«'z˜'å€ ©žè$…€,¬”àf¥~Ä6.eÚÔéS¨MÅÄkÈ?¢nuZ/×i\…y `2±iÕ>í¨òQïD¾5 2=zþòâù¶¦º€|ú˜ Þµ£‰/Vœ”)–%O¦\ùa0>5#¬BKQ}†h‘w]§h¶6Ó:@+ \رáB!CËŠÕ¹ =¥[÷-ØBhUÙF( Q0ÄòÐqÍwîh ®VhÙúuì 1.mËØûwðG»É¦)劈/u¬U9‹¾p»Šu¼Ö¾Z9ö¼r?-5%¸ã ¨XÆ?¹ê¥·&›¹æ É¢Xɯ{ëž& ðB¥ú6‚,;Sœ³çTÓ¥“Ø, …~@Ä _pY­µ×È#6Ûp{N3Þ†Ü̸ö ãt`»–þkN3ª´òJ,Q¡%º Ú¬:Ãs»ñL4Ó,)Ä O©ãl*ýf€SNÿÊ1€#ÐÂóOÌ4)°‘ýH ÙI„¾ã#Fæ{+ƒ^©B53ý®DNóÓìX|®ž:È{„–E.¡EßxôñÇÚn3¡"g5È"È ˆhá$6Q6cîšx^•-–-¥óR30AuÖ22õHSj«UÌNh!eãÐû)Í?Áëž6Ì*×Ü8%I‚\h¡j@šä—\1…)ZàsH 0¤€T&LŸ\ZÁZŠUúÖÓg3¶HTèþ ÐÇÇ<ô€2ç\56 eµ•–Zm}FZ–1èža @G)‰=6d¹œîË…4ú¢ŒÊœ¶b¤“–b†çÈå oïdÁwšœÆ‰©£:¤ÔŽÉZNwGêÂ4/@¶&¤(ëŽ>ú)µŽ>ªÄœ=ä¡€‰ßšÁ7T¸BiÀAº8²¡ ¿,3ßP06Ž*|ÒäHYH[[6RdBÑ„‡_<ØC6$€ÐlØb#8Ù.© ÚpÖ¹ˆ–££—}v’¾ýz-o² Žn_ ‰Tˆ*¡?ß pCiWzðÖYçx3o˜¸ãäi€Ø¦d×L—–…vdø˜Þ1Dãù0pã?&Ä JMÛá³*¨˜.Žë -Ñ 4¦QkÄEmLÀ\Ø r#R6pqÙ˜áÀ`†X•Òi‡?cÖêºø¬bQ‘Õ"£"Ýí°@”PxÍ‘÷Yà"=é ÒYþ_4ˆpàÓ=Á\ðñJXÆR–°lÍ/äÈÊ!}/7£x•3€À„çÒtƒ\Bš%JP%ò“ËQ#7ù#|¢Fð`„&ã´%vx¦:ÉLp’H‹\Df˜H91h¯MÑÐ /ÜùNxÆSžP²E”¼GGß\ƒ ¥z•,hß~¨#¤1 YÎ0)3œ Z7íC†#€Þð1ÀŠÏÝát¨}¾ÉP~$”UÑ9iñun „³òÁ( 4Gúf;kÄu#д˜9&IS¤ÐµvZì(W0 ¸,ÁÔËô z…2¨BQ9‰FdU«[þåjW½úU°†U¬c%kYÍzV­îaœ„óiŠL*u:ƒrÜ 8hA /ì£{å+_Ù À8Ø Ô¾\â37QÃÎî^Ü´†‚$è uØVÙo¾àlg=ûYІV´£%miM{ZÔ¦VµU«U=Ê‚( „î!ŽlpCx@%jU¢|¡ërmZ®P ä&W¹Ëensû\èFWºÓ¥nu­»\♈­˜Å)å¸uîá׋¡0~Á ]CÍ0ˆ¬ñøÆ÷ Œ@F}ë{ƒ!lC 6àÃ1þø]"Ù03laY^CD`pƒüà‚D' ¼øþ¯A¹ûÓ¢idàp‡=üa‡XÄ#&q‰M|b§XÅÎnqÓ² Ô …‘ àbçXÇ[!ç…+CJ ásêô-ü‚vТê€ZA×þÁ6¸B0€AFßø ¶€€ö!Y@Ìc&s™Ç, ˆËö1v^·c8ÇÙªC8G#X±ƒ"”¥Q( >ˆdÈYЃ.jÛ,R6cê$J´ rðƒ `¨Eö0‡c„ |`Ã;úá €ñxÄ!ˆÐÂ0ãˆ++67±Ð^0t£ àB×»æu¯yƒ(‰n~‡¶Î› }ldûŽHBþ²ýlßšØ9'’mô! ÍÂAX¥ ˆAåðA2ê‚ ´XBJÉ [,¸Øéf´üÒ&™ND¨ÇbWªjð†?¨GðU£z»†_@,Ï㾆ð¾ò;ÁgðlA;¿°;§X? pœð9–sþ<- …SHø»£•À39BƒŒ“2UP•Í€bH@=àýºÒq`gð„" †þAt sA2t$Âë2LÃn‚Aª« Ð{hq@#€„"t`/?ƒn <-ƒ™!c´1n€d #`€ƒcˆ&ð‚yX¨i8‡ÀpŒ9Zøؾ0½1TCUÌš€\XEX,6¬¸çÑ 7›C ‡8‚C4 8P5aÄ›‹©ÑÑ…õ[@Ç9-ø…lˆóqÐ.ZØC€Zø`Ȇéó@„þ°AžšºSÃXLGpÙ½PGw—Y4¸ç‚!˜ ]<LXc$¾!œ½õã‡s>ø³=`•»IZào4%ÍðAC4Áw¬H¨øŒT´HL‹xœ¶/ʆ à§|„#xZ Â~´·‚c AgÀ…wàà«Éƒ”¿_À×#ŠYXHàsÈçHî£È,Ê€(J¥‹Ž$¶ ²…BØMP p‚ÿ)Imø¨³§•<ÆÜð`˜Cí£…L+¥Â?À* ¢È‚sX)¡d=¢\ÊŠdºÌK§hÊC« †RVX€(950<èÃŒþ8¨`¾®ÜÀÓ<9* ÜHàJ\臨‘À…d(·zê;#‰ËÏ›K½LÇC(ÀÔlÍ-Ú®sl=ÄÑ à0/+Óa„¹ÚJ†;P ø¶ÈÔ`|  …0BØ^¸‚ü7Ó ;ÔtMU|‹WÀN½äË6û"[8ÊØpZŠQD¦—¢…v¶áÌË€s°…+(ÉWyƒ ÂꤺëäÎ2TyñOºôNû¢¿$I¢0°ƒÈÁ ùÀ(€N˜†.À™ƒÀ܃²•Ô%hDd°s‚š±O‡J(Äý¬¸þÐ\`UJ½þ°sÂ#؈€OÜsð~ {È‚#¨¨„@(ÇÁ%cÔ%Õx‚0(ƒÀ<Ð|ÔS˜>’1Æ5¸ÑòóUðÒ¬Qî"%[ ÙØ\H€ÈqÐí1\ˆº Ô2J0 #ÌÀRÐg†`åpŽ•ÜÒiëR1ý>$IDµH2Å, %ŠÀ*2–,°ÕÔžéÊû…ú„ hàˆ¨©ƒ(R°y™ùÐÈ4TbCÔF½ ¡Z}ÇGm+“r¡ØhZÃá^¸¿ÌkÒØ0 Ó9¯4À%`pƒ÷”ÕC£Õ\í:ISÈVuþÜUŸ:'ø Ù€` Š“ÙZP¿ÈqdýGZÀÙP—Ø™k¨ȃa¨C¸…:¨)ÍÀP:-Ms(@I0„ؘ†Ì]_ ÛØ[8cÁ[°Kí)¨!9]ŠÀ€a`.àÞ:/H&ÖE|Uƒlx`Ž` žàÖº7À]Ýí&œ ®Uôž@½m`.a&á-8‚z€6Àý ~á&þ¼¹Þì-\‰pÈaÞap†pd’ZZ˜òè½tyÀEpƒè‚Tkߨø†øÝ 9rÙ Z°¶“¹‡!P'0°9Ýà‰`ד¡=ø¹Ýˆ†a7Ž`­ËªÍÝŽÙ<è<Îc=ž±i ƒŽ:‡Õ ä@¶†7°A>dÔòã?QÓQƒx¶~cI&<,X á©aà v,%©Å  …0pX7#hhÀpœ8_¸0ƒ*^Í•s8†‰•  …#Ž6c‚ƒÛ ž˜c>æcn¸ˆG“ö6–d7Žc-˜ã v$Uƒ3þØfnîæÈW˜ê&<À‚C8gtNgu^gvngw~gxŽgyžçsÎ:F6MØg~îçi*X^8‹di†aÂ{‚°dL6M€PðˆŽèˆ®Wè4è"©õ_ RØÐ&à‚W™\†¸ƒaèƒ)ÜT¸‡YÖŒ_Ø9ÙXZp…)2lÚ” <(F‚Õ˜à)…nês€=ÀbxîÅ0p‰æ‚¦à8ΆjÆ` mjoæÖx€V´Mƒn*¥i‚{^d Àên–a¨‘ ¨ªc#è§žàƒÎ†„¾dì…GŽˆ –´Þf™†Rù@Ø!þ!¦…0’J cðc ˆ…3XÈBx&(Mpxi„P ¤†9†wØ™ðé! *°ƒn;pÀ_¢øAü_aF‘ îë3(ê=8˜4fj@q긆c x੦ãMÊfÚ>ƒo3è€Réã¯k±F²Æç³¦mù E°dG~kpáߖ๦k…¾ë?ih¾îk‘…°¸ƒN¦!ÆÝ“ 4°%`&^À! Š56ˆ.ÐlÍPXÙ˜Zøgc¡†4zø(#aX†‚°‚Ø(®üéŒ™í¾¶ím„²`fYcðíïΆ¨nk.n«>þîäÞæqv$°Žî¤™n³Î‚ã¾î3؇¡à‡€4¸>ñloñ¶k¼žŒ½¦íô>ƒv µŠ¾èÖbæhØà4%?>ºboXZè2ØØ?ˆ_ò ‚84–uà¯vp`x€"Èi` ‡EÙØÎGkßæy¸J¥v³g¾ÿn­³‡É{Tºƒ“ƒ"ã¦íßæxØê®¢·ñŠÁq"`¥K‚ 7Ý=ÇŽ>ÇêsçfÇÝf†–v_‹wkpø¦oz¦ÿõy‡ôzïëIïæçqöÿwj ø8xPõnöñ* òKõï®Öa8­€ˆÏkˆXò‰—…¡~r¢°èŒïõ¯‚EX‚ØþÜŒ:΃àØhvpe(‚ À¦óTx5s4öc8ƒW €!È‚EmP@ˆœ‡ ÷ /÷7j´t¢tÊ qaHz†‡àŒú!Štª¿w´®t¢¸ôÛÙz®Ï¯O°ïkjR7õ³_øÙ‡aqûò†û‡{´nr¬Îõîl¡)ìn4ns bPAØp‡·ÔPe†õÀGX‚SØ+>"¤f ]I†gˆ’_8ƒÏÁ\€ %0 €‚ L¨paÂ`¸@Œ(q"ÅŠS(uf#GŽçìé(ÄTôX¬8¡†°–._ÂŒ³ 5ÙþnâÌ©s'Ïœ§l)t(ј×jŠù€ˆ¤;Ô0LѪDñ(“¢u+×®^¿‚ +v,Ù²fµ6¡cÕª:YœrÜ€\EëjX«w¯P0¾ô ,Xg+øÅ åÄ7äÀ=Ó €,¸¬¸ã1çÎÁø0 -ÐZ¸Ì ¤2Tˆ|вµ0”Á‚Eh(ØB4ïÞ žòÐBmƒ£hE)^0Kl´|ð)hO‡.ÝŠ'¾Ðaçî1j„û1ddAáÄqä}%â¡4mŽßógÐööª‰|fiÓÈ º0‡öU…ÕY"˜ ‚ ¢¥/µõVdrÑ×þ>ÊÀÄ<ØaL~&Ÿˆ9v˜‡Â(æcÁ5YepµKA=¤á}¦]B<Øð‹esl]¡°ÑâÀ(\ƒ@?ÐDl:jœv¿@¡%Ж¢(AýÐb-çÕæ•qw#!8â gàE6ž~gÌãKA/ˆÑ{' óÞˆƒfC ká§wÆ“KA­$s¨K2X©¥—˜ êG¡~i¤ÂAT!éƒ :b‰€¦ØÝŠ‘¹x§$òüˆ›Ý娣 ¸Ha-8øX…- ,DFlý¸â†“ñ"1…ã -ÔðàÜš Y)œ™K(g -Mh)þ†¯‰Y= DNq†˜Ie›7Î •ŒÑ)HwnD’I(1ö牂¦*Ÿ¡¦•hd‹â •TTIJ)¦C ±¦'r:á\øÚ…Áí¡p|«žØjg¯¶H¾—e¶Ù­Œåª--L+]”F —-ªC‹f! áÇp`‹sà¡pÇnçÐ4„# Ö€†2àcŒ-4ˆ… X‘ SŒ"œØ%,àþ `¦ ‘F D‡Rœ#¥Yé6ù?ÿA¦U§,À1>ÒƒÔÀiNw*" C Íp‚4Z«o€A gPâ!@krÂ4G‘¤ì¨H݈Pƒôãà,c‚ @ E6Z"U²P ˆA+Üa…¬â˜+[%Ê% ŠÐ Ð0Ä1Äڲέ…£Ê$Ázz‹OÌ!C²  \›)WûˆŒpFr ̃ |íˆ_·YÄ/Øêˆ¹r~ðƒ‚˜ƒÍZ°h¡Ž˜à¡ƒ*~¡Xßdã2X„@l€Œlü‚}cŒÞôtt ^øŠ˜ÑŽ{ ¯øÅ3¾ñÊ9ˆLÂ6Ä‘8àC "$P/þƒI ¾Qj mîbúæœÑ„%$¡Æ[|уäà5 Á dƒW¸¢,PE*Pq ”‚£pÔÍ’1 { ¯XMˆÀ}“ÂÌB“È@%6ÐNtâ¡ J`S  *XA+Zà‚Ä@3G|„`€ ݶ]_A+½N›¼î&9žà eÁÁ0{.n@YÄÀ­XA*NP‚Qˆ §€€XZÀ¡{9ÄÒpQ6ô \Ù¯h!†@Áͨ-šÑúF ¿€M4x Ø`Z Ǩ@  èãÙÖ46¬c [ø0 C3HC6xƒþ8Ã( B4$`À%xÀ'Œ@) Â ¸B ÌÀ ì‚/8†îüŸ`MxI®åÏ®ñÚ´HÀÛ bÛ¯‚ŠéÜ·^¡¬`AäAÌ<C|µYÁ4Ø3`Ì@™À,‡#`âh¯aàƒ ÃtÁ:ðÑò(PXÕiBV(Èéƒ1¸C6HìA¨@,ÀCxƒVDG¬a ƒL€£ä,PØ'h…+À0¨@rX€†>Ô ƒ\€Æža®a¾áhúéC „· à‰›[tŠÖñš&šbq¬@B$=Øà_Ìàábþ,>ABpÉSTÀžÉÞ†ƒ Ä"¼‡@ðÁ])ƒÀbÐ1è“ à5Á<ÐÂ@™ô ßb5Ñ‚è$,¦¥+Ì€4âÐ0 IHA¬q¢opgP¼Ók1ÀÈÕĨƒzy„ n“’A¼ƒ¸A˜‰7 +@˜3,M“!h…6¸Ã Xå &hþE])ƒ)L!ôV€JA.ÀÃ5¼Ã ‚V\Ã0 Ã5€’hÀUIWz%XJUZå `¥VZânÅŒCPAAì ¼+œ‚Œ©-\,ð:X€€¢ÅTȆÂÍA4ÈàÃ>ôCÀ @ !‚!Â@€",ÂP€#T€$\TÂ,@*Ѐ@ažáÆ0˜Àñ‰B(|Âx@l@%PÂ$H‚<‚#4#D€"$",Àp‚|çH…÷ñ¼A œÃ˜qD™=Ò=´Ñ¸@$€ B ‚"H@#<‚þøæx@'„À”À  ‚ „C-”Â)$„-èÂ!D8B³ÐÁ0´#¬ÏÒ,/$Cš´T£5JOŠâ‚ œ@¨7ÐB¢%„.ÉB\ÀÕA%ØÂö¹ãC¸ÉOÉè/Pš„Aø>n{Í0C†”€L„|…×P,"C x$¸ù—‡@.98BáUNÐ>ÒlA€<ÀZHÁL @òC14ÜX0 LäVd"*nE (¥>|€XÀ=hÅ@4àÁVÜ ê¡jm¬‚84ÃèX…aõÀ d"=„)Y\ˆâþ6y@TDÀòÐÀÞìTU']Y{ˆLtŒÁ}¡Ç)¬DÈçFÐ'¾4€@(Â`å $ 0š,sàAäÁ øŠô†0ƒ/¤èYŠŠÖŠŽQ̨´€œ‚0oØ@O„/XÀ;pÃólƒv¼#cÜQ\Õ`$°ND(é0é,Â] C!LÒ^xMAhƒ´dKðW3}i‡øAA Ã$`PKØ$Gà¤~D!XÃè…_Äœ€¬º&ÈÉC84Á"R7|Å=HÂ5܃!ô@ˆ€RhÅ+ÔA@h5䂨„UffÝfæ$ü+„ìÆ0ÂZÝ@<¼•+¾b¯"†ÈèAÌ XÓ^aSɼÈ# d¢3ÐÁ`hЂÄ4€lˆ‚ÌIËúÆ2ð@,C2à@h™ko\£o 0`€1i”ÂЬõЂ ¸Â „ Á¬Ÿ»éOID‰"ÈÉý0’½G’… AØU+ï5åb_íâØ'H¨îá D%ĘVB8€ÐÂh.o\ƒ-”Â:Tmn• +•øÎTB0‚Ò°Ø€p‚-„Oo̳ŒÑ¿¦€D0BJ$ìÂ:…“B©”/é0Z½DÆrÒÆ>È5˜©QX¯Qå›~°©›"F?ô€”X,‘ïY\ÀÃHÁ}í€(ÂÔ=dA,ÈÁ\šC&ÊCè¢Î€;¼ \þV\|AXCh€ìÁ'ØA”uƒ'ƒ²(O-&k2'_°^ôƒ1@UL¬êF \¼*Ä* ·ÄÀB9ÔÐ +§a°Šýp¼XıJÆ GƲ6ë³ö°Ó&ø‚,„™àÀøéˆ±PÂD±Žt.CH tÀ:”ÐH%„Ð#Ô:Ƴh˜±E¨Á øÁœô®®ý®~4,<,go{èñ ññÆŒìF”¬HœlʶÇ"ËDžb•ÔæX¦8ÈZ¬m/‘­›-\ÄÚª-3·«pr‚[ ï…Èp7'«J î–î8“sc¥3lŒñµx«k 4çNqoü‘|ÀìþÂõ+C -4\Á®,µBtEÔCw´1?&…?Îp¿Ð±‡T4]4Ádô~`¯Hh/ðäÆˆô,I€£´À>”ôYp-bósG„ðŒ°LWÅ®ÞNë…N3O{³Häðì°PãâŠÆHƒºB¢u5S7šh˜I2„@`™Aï-ÐA8à-ÉguíŒuC'óC”vÇD#ÆZ›N[›Ê[oôò¼ièÜu=2?LB_›Å_óE`öF$ó2#vbKóMSsÈXóN÷mìý­S€³³ZvDÜŽB°+ø@:6 Ј~öBÌ3-ðƒ;4‚ÒÀ·hþ8‰ŒAØÌtõl¯LmGÆCGôz¤u‡øöß·¤w\oDG«, %·sc¸t‡H÷sÄKDL_7vÛt\mwêt÷c·.†÷zý4á–·yc¶h°÷š8‰>H@|Ÿ_S‡Fµ”Bc½¶®à@dÁö¨v5ø­xYïðÞoóEƒ{̃J„2‡í$÷Zx#gx—tïE‡·ôFöa8‰¿b60öZ8v문 ·øFLveÇøeëxàÀè8¶ð8C I@‰:Ã2¬Á€×ny/yGà¶n?ù‚?ˆ” •Š•‹Dq7 _¸—w9˜ë…˜'Euoð™…b#Ðþš[E›oó›“™7·8×¹ögÍãž+Ä<ƒFù]‹ª!®›k’»I¢o‚Cì­@ù^@zªHú‰P:GP8bgº¦c8§¯…§8L§´¨“Nv›¸‰ ¸Š¨ú|îbànP¿:¬Óú¹3ZoÀ‚ù 5F±¯ßH¢›uí»^;¡$»‡,û\×µ³s9´ |ƒlÊJÿ’(–9¶¯¬¶[Ù‰ëPŠ»y ¯úßÎ9—»Œ£{ÆÏ·˜îù€LÀ ´¼ÛÈ’/º¯Ì½¯E¾ʾw¥[ú™?ûÀ瘴³…Á•ÖºÂ/|‰7<·?¼·K<¸¿H«_üDœwÆÇ÷<£®g7þMÄä_<“¼w¸°–Ê[ˈË÷q ß$S4»Ì<ÍkºÍW…˜ƒxÚ^;Ïg»ÏóªÃCħúÐ#+eˆ;P=ÒϸÒ/}ŸÇó€ùŽlºe×v“Ÿõi}Up½ˆx=D8³Òµ–øÌ›=V¡}Qtø x¦™»½Uºé˜zU :}ûÝÿ@÷P¶Åï=ÆûýžÏ7‹Vá¿:F´Àà~îëþn1zÖ;:4¾ÀQDPõ[ÿ›„u¾Þ0|ÜýÜ{;>´Ãø“?ù‡€AwëóýëÃ>à³¾PcÄ &x/~Qþ|<þ}Ô G7Ù„ 4xaB… 6DØ„Ž0‰)V´XQ9vd•ìbH‘#I–¼À—l+Y¶tùfËV*˜4‰%;yò|ÓèFgtz5z)Ò`|h5uújT©S©VµjUã©«[¹võ,BR±bC…3{íYclƶÝ9¡†M“U¨‰y¯ËS6Èõ+R‰#Áƒ ¦pìoâ’xœ•sürdÉ“)W¶|sfÍŽŸDTl1MÑ£IvÇàsjÕQªÌû:æÌš«%ât»®tnѪÀ¹õý{©WáÉKÍZyr©`7wþ¼(\Úé¶þt{víÛ¹gŸÁwzxñÓë©1}zõëÙ·wÿ~|ùèጷ?ukØû]Êoº+8å <ð©ã\ð«°|·⠮ ,¼CððÛÃ=üÄE´¥;¬8ÅU\‘Åס鿜"œ1À¼q8qÜq9iü±9éƒB™"<É$•\2‘|Ê(¥œ2¿ ­¼r6Ú’˱läLªt Læº<3)!©\“Í6Ý|N‘YƒÎ:í¼Ï<õ”"F4ý,êK2mjÌAo4óÏD¹P3ÎF}ÒH%esKEÑ ÔÐ0 ÍAD-E“ÑIE•ÔRþM5µÒO¹Ä”Ó7mU9OUå2ÔSm½×\uµ/ÕYidV_ ¶8Y}¥±Ö]•]–ÙfqíõX%öÀa©ÎØh!LÖÙn½ýÜ(¡ÕVÀi¯MnSM”A~ –®ÌôF“nô!Ç™f qŠ ·¸)”&L1á”f Ôdµ/6¢g‡m ,ÇdµÕa –øIŠ-^­àƒÞu\r¡V]vÝ=׫W?h*™J‚}y+3Q¸#GN˜#‰Y@¢* Dà ÿE¢k>€iÕà@é& (ûÀ‰‹O}:ê©«~òê¬ikZi’e4YZ¦¦¢9f–»rÙ)þšòÁƒQJ(a§$)¡NfàÄ‘hñaÁç®ûî¼i™§”HѪ)˜¹›`ªbN:4Ù郸`£yÔ@Å_rpF3&ÐÉtÔU×É Qƹ#‹vý }º@§.¶àèê™C£ u]tÒ¹h={H¬iaF‘H N@•h&º•D©EJfF‰ƧÞzìµ&€LAA•‰FqûSžQ,l‰ b*ù¢Ø€ÄD¤@{ÄáX‡ô5Mìkþ )4 ä@‚0°À‘,hTùÆþú÷¿P"<`Ø@'<0‚&¤àD,ˆA þrЃ«‰ÞôÈ—¾ìI¤}0¾‚œâC˜H%°W þ€(€E}Øç>øM¤z×û¡_pB/{áK_ªâ—¿z0ßL‹f´Ûà‡·¦0ÎqûÀ :P HÂN©ÀÝ*à”ì¤h…ÞØ¸Ç9…nvscTàF H ) FSˆ ‚¦‚MÁÇ0š’Æ4J’’–¤…)òH‹C<%VaN ‡¢,!øÀ\Á…Kฅ<¼`K\ê’—\PHP ÐÃ:qF0‰ \ø `Fv‰ ÐvKYÒÒ—G`AàA„£I„(¬$"RHþD}ˆŠ ‘èEoí|§0T Da0‚"ÑûÌÕ¸ … êÀÛrbv Ö¡ÈÀÊê€:h >1`ÁáÌ Ô@@'î¡äÐ@êjäa– ¼a8¢¢)7±?Ñž+ü¢`>A"Á¤€<@JÀa‰Pà0 ©TJà²A"ž1§Q"R`¸`" €Jà¨11Â@#\@ŽAºà@`ôÁzÀ$"nÁÐ`„íìA´`áóqûQ† ø¬ (‚Þ€Œ!öRàä‘íõ‘ý ’ þ !r$R" R")Ò"1R#S#—±ÁQݑ͉ˆP2`Qa('bšZ´§'Mà¿wò/°€@MÔHÍÔPmÕ‚¦+¹ÀÕbMÖ¸€Ölm»¸©'tM+{+¹i - •a i¡ ß0ç  HᦰÓ):AÚ¡ “ oôR1ï’ „Ó%[Ð:æ>ªíTì#?Ó$<3W8sMp‚îìïR¯ïþñÏðZSñÏñ Oò(Ïò0Oó8 <¯@OôH¯šNO5W6±ÞaG*ÓP¬e8”“L.3Cþ3íƒ4IE:£@S;Mâ:³“YªsJpb+ñ¹ 9ÑME‘ÙU‘]‘ `QiÑqQyÑQÑ“/ê’“X˜³+ @”¡Z:£ó7¦3<¼Àš p%4bèo;3Ô"*T0TW ÆÆÊMJ†AÝÂ\C]DA²Z…@ݦÓJt@TCg”FkTJHF $¯\Ô@Z”G{$GDFm”H‹ÔHÇGƒô(NôG¹ÂG›ô)TI‘bHÔJ¯KI"I§´'˜J±b2¿´f|„K‹&KÏMÓT$¶´LuÂKÅt*žTL¥´My¢JÕOóT;Ùþ´MßN%Ñþ4É´NÓÄhôQUCù´LýTPBN‰ƒ`!Lè´PåP§ÄÎGQ;5O7ÕI•KÕ@&•L6e”á hA]¨!9œ³Sµ9zq#`aFÆH:3•6Á`NàÌM.ÀSD2F#Ì*<<ÆS£D² ˜¡HY?#Z„WMÁWÕ&„?DuJ™4UWµU_õTÃTÏÀP9`õ@,)¡ô¡f×|ãN³U"Œà†mMð;á8f:D3Y=¤öÀ`î`F`C³áœ¤iì_G„[•ÔKÃ9еZÈõÏÌ•IqhÁFaN€ þôˆBh&‘'rb R ä âH•dµ9p­u¨L'.Èâ@²€Ž+€¦ (hÄL#ÈÌL©S"® Š8P­P " iz@´‡ D„Ãàñî`žGLÇäá¬AÌ…`(k:h#>(`A äÁÂJú¡m!èmsÈlÑVmÙÖø‡âöIšÆi¡Vj+j­V"°Vk¹vCD•¾¡ž€ÄW¡csÛ¢bÿle dE–dMeU¶\fevq )PãTc›â³H‹R3˯+*B¡)Áëð!ú*”œbJà]œB°L©f×Znþå¸;åa¡ò@Ä@€¨)hrΚ€kiǽRA¨H¸Ê«FpÏ~ÀæÁÀI8l  !ÊIž6€LA*¡§œ £ © F©æDà¸a"`ša£ø§X _Šý€x‚ 8kØ¥žd|Ëw"ÐW¾êÜØ×}…!à·äwrϦ-8aZàz@)âõfÑÒswÔÍJëv5Kw¡‚wiÁw5)xqwx!ËxŸ"y1KLf—c9VÎH‹ÎlAJ`F!š‚žr®¶š‚ÏšÂÎíE×t°Ü”K>¹`è!¼¼-yþ¸-æÕ$šZ@$"ãxH †èÇ6cD8ìj´çjîçjR.!ˆ!ÅÄfaØ>Ø%‚ ’Nl’%™’nàBÙa%¢ÿøÇ.Ξ(‚KÁy[eX,Ä Ja'~s‡VŠ–›‚‡g}h…–hÖw€ç‡·" É8‹·¸‹¿˜ÂØ)ƘÐJéŒíή¢‘8öêž‚ØàϬ9Ïh!œË*ªn¤Y žÁ·ô ¾rsu3'b`8_y"Ù "@£À¦á>ùjæa"á<Ù”/“Å£nïV"fANÙ¢/zສú“1:•%bŸþÙ•SðŸ'" šCø”Öîa'$`Î!{Õa{¹É{w.z§·z¯7¦gº{©é{›ù*Â0›bœËYŒ“Î ¥‚Ï0v)Í©Íð)HÁšbnW²0¢0©§Ð)Èp*Ôõ(صšÜ6_ógÖ!( ê ¸ à:ö  óàóÜA^uul&"ÎA"J¤Õ7"PAÄÀIôjúUF.†`bïjÐ!Aì¡öÐüÜ@"&Pòï¡;¤øÁ`ôAÈo³;ûþ>{ (Û²1[µYûü\›?Zúú¯Mp{ž{" ±SÚ–“bþ¥[zêžçãxŽëøž«¨­" ¡Ú)¤šª­«µ:**s ·ÙКT•U•AhAñ²)ÄàF!ü°šBððb’Ú;2Ï›´2À)Ó1U@Lg#b =MQ¹j ò 4Át¢ê ºja'n13 ¯í£ZM!&¡(r{¬qh…„A@.D<²X…ë€ ¦Žñj^Á ôÁ ÁŸ ò r".2#72´9$˜µ žU"||%ƒœ&#€ÇuœÇ—\%ü÷ž|D><ÄGœ(KüN<ÅWÜCø—uY'zà î™»ÞYžéÙžñX)€þÒÐ[]Ö›¿!¾å›¾í¿õ›½!ý{¼±1ùrŠ›úQ£ÔfDÎDC„ ÖÖQºÈKÓ™¥ÒË<¹“‚ø¡aò Ü®åèz7íº7Ý¡(­×º­ß:®çº®ïÚKè¼Ñ™º×¿úÑ;- üdÒA˜àQ¸¦2]Y˜¦’ÝÓ›#¾á¢ s%œÂ-ÃuBÃuQ¶ÜÁ!\Û+üÂ3?9\GÝI©ø×ÁºÀ5¢ ȨK޽CBÁžÀÅ#×ácœWúýß¿ßõ}Ú%Òӆݷ"R¡ÞËÔÞ^â'¾–-eØ‹}Ux}áË{ãþýRÇ"â)^äG>5&: |Þ3¾ã}}åiáá¹4äI^æg^K?ýãw‚Tµá›ôå§4æi胞ƒlþæ¹ çuç´ç•ôç…ÞéGÞäsôèÿ4éyt郴éŸ^ë>êatêá´ê]ôês4ë·ÞìºëKôëÅ4ìÝF]i•#ŒÇŒvBˆÇ‡»«_@E¯µ†X7BlÀ("èA#PyZϾa€âï"¿ð)âð6ítí¿´í­¢E]‡{uâ®v çríî¤ìI…k!*X$ Ù'bú;QyÓ¿$V¿õ… ö)bökŸ"n_M'?:+ßþ+2_P.¿*06]ƒ=-À ÌìôqM˜ƒGËhÇv¼]#B€äas¸^dÐ@ Œ"õc ¸À Ì’à¶ð£áV#>H‚N(È5 Þ8&,hÈ!!Ȱ¡Ã‡#JœH±¢Å‹3^쀋3à’ÛF'9¢$ˆÅ¤É,ˆUúR$†¤Lb# A„ 5 J´¨C,¸(]ÊTé8—.Õ)Ђ©œ9&¥. €N\Ó¯`Ê Ƈ–Ù³hÓª]Ëö쇶pã®5yJ®]¶oïêU,‚ئ  jõ’(§Ö¥ÿ!À£\T˜!QþI=Jë1P‹U.œx4¬N9°j]Íz5G—+‰èp2em‚l08Hްã0IçÁmºÀ*QD ô¨³¬µõëØ³o„{öm†*æÞÝûwðáÅ'_Þüyôéյ˟ÿé_¥´3b¬µR ¦Þ8`S‰Ýg dí¥ Zy-¨ ]ÆÕÁ#(36DhW_rXðC¦Tˆ•¸÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D zͳ˜ì„ç‚Þ©Q¸€ó¢›œGFJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžút¦g)FKØÑLq”bŒ€é>*Ô¦:õ©PªT§JÕªZõªÌh “jº£ªå ¸±‹‰Š©XM«Z×ÊÖ¶ºõ­pëþ¥ˆê °Ž@¬dÕ‹Y¹ÉEåE£(ëRå)×Âö°ˆM¬b+W­Úå¯ÕkWû*XZ(Ah©@ JPÌ’" ÈË-^0Z|¢ ÄÐZËÚÖºöµ°íaë0³\6³›íìY*ðÙКe´¥=mjÝIY½Àb&À†ÎB<˜‚0‹ îa|äÂ,Ë „YâAW­V¶à ¯xÇKÞòƶq9nr—k–æ>7º´˜nu¯K‹ìn·»*î]ò¢ Á,"@ Ì ´ N¼ ÅpKš÷Áް„'ÌXôÂ…¿þ°€ là³ XÁ 6ª~{–{@Ãg0-þ |Ô‰ƒ<€Ä§¾KáÛøÆ8Îñ#-\:³˜ÅfQ1‹ÍâbËøS^eÐY¡é:—÷€¯ èPÝ` ¥¸ÆŒ¬ã.{ùË`3ñ²ä&Ç÷ÉQ–.•i+ŸËZFòˆãb×”‚¸%Å#Ð" Rà±ÀYúÀ‚³r9̈N´¢ýÚ1ÕBvÆónK g>ûЂ6 ¡K•dÓ9¡†f´¨GMêR«ÕÑ«û4§ç¬ÅIü"Ô¦Žµ¬gMëX¢Út®^5ꩉ8ƒ°®µ°‡Mìb3åÖëõ¯u]TïÚØÐŽ¶´ÅŒßfï¥ÓÖ¦§Íín{ÛµÈÎ6¶­þ½ío›ûÜèfk¸­=îf—;ÝðŽ·¼Aºîf·»¨ïž·¾÷Íï¬V;Ûv¹wGóÝï‚üà$x„®Q‚#üá×w½‹Êpx#¦È¸Æ7ÎñŽ{üã ¹ÈGNò’›üä(O¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹȻðo…Ã¥âí<@%†Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇîô8ûüÚ¬>»Ú×Îö¶»ýíp»ÜçžB ÓýîxÏ»Þ÷Î÷¾ûýìvÿ»àOøÂþðˆ{àÏøÆ;þñ¼äi±øÉ[þò˜Ï¼æ7ŸªÈ´sþó ½èGOzµT¾ô¨O½êWÏzq{¾õ°½ìgOû,ž¾ö¸Ï½îw_úÛóþ÷À¾ð ïûáÿøÈO¾Â‹¯üæ;ÿùÐ_ó£Oýê[ÿú¦=ö·Ïýî{ŸòÚÿ¾øÇO~áO¿üèO¿ú%þõ»ÿýðï{‹æOÿúÛÿþøÏ¿þ÷Ïÿþûÿÿ€8€X€x€˜€ ¸€ Ø€ø€8 ;mod_perl-2.0.9/docs/user/handlers/http_cycle_map_to_storage.png0000644€ÿÿÿÿ00010010000021477511727205031025152 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\LëÿðÏLË´/–-Z¨„,)[)Z,Q¸²…k+IHeK÷âZºÙe»TH–›-*J©H¢”m´iß›™ßçûo¿ÒT3SÓLŸ÷÷uæ9ç|ÎçL—>žóœç@!„âS$2dˆ±±1·3A!„â¤sçΑÀÁÁÁ××—ÛÉ „Bq‰D"s;„B¡®‚…B!„ø:!„â[Xè „Bˆoa¡ƒB!¾……B!„ø:!„â[Xè „Bˆoa¡ƒB!¾……B!„ø:!„â[‚ÜN «8;;øðÛY „B=ÎÁƒ ¹E7áÛB'99yÈ!Æ ãv"!„Pâëë[PPÀí,ºß:0lØ0ngBõ 7oÞäv Ý Çè „Bˆoa¡ƒB!¾……B!„ø:!„â[Xèðgggn§Àa~~~pqqáv"!„ø?¿uÕZRRÒÇ) F“––.++Û¶m·“ú¼½½ÝÝÝÛÚ;gΜnÈáäÉ“ÕÕÕ¯^½7nÜÚµk%$$ºîZË–-€tÝ%Bõf½¨ÐÉÈÈ óôô$>æççïÞ½›»)µV[[Ëd¯™™Y7ä@ôíÙ³góæÍÝp9„B¨ëô¢BçöíÛëׯg|0`@óîœÇ'$$ ×ÕÕ̘1ƒh?uêÔÛ·oL§Ó‹ŠŠìììFÕ¦¦K—.•””@}}ýäÉ“›Ïè‘@"‘¨T*‰D¢ÑhpìØ±·oß2º7 ¦L™Bl_¾|¹  àû÷ï>>>­o…äYÓÖ}8qâéÓ§ëÖ­#>>yòÄÒÒ’øÈüÛ@!„ºN/*th4š˜˜Xóuuub#""¢´´ô?þ >^¿~=<<ÜÂÂÖ­[·~ýz;;;%%¥ÆÆÆ¿þú‹Q+0Ùuùòekkk⣿¿ÿÛ·oGŽ ‘‘‘EEE[·n%vUUUíÛ·ØÞ¸qcEEcWsË—/‡6ñ°–ã0&g!„B]ª:‚‚‚eee222Ýp­~ýúý²cètz‹‰Ôõ±åÌ™3Äx&÷¥¢¢RXXXSS# PPP ªªÊØÅä,„B¨Kõ¢×ËW®\yäÈÆhß’’77·òòr7n\`` ãÈ    &°s­áÇÿr—žžÞ;w+**îÝ»ÇøXSSäçé—8ž|kŒ”˜ÜÌ™3çöíÛwïÞ9sfóvæg!„B]‡¾¾¾Ü΄ÃLLLlmm[ zÍÎÎöóóU«VÉÊÊ»BBB^¿~M¡Pôõõãy}||âââ~ÿýw++«ÌÌÌíÛ·Oš4‰x/‰É.:~íڵϟ?‹‰‰‰ˆˆôíÛwܸqšššDÌÀÀÀääd))) …"//?oÞ<"%xþüyXX˜”””°°°¤¤¤Mß¾}àèÑ£ ‰‰‰úúú ))I<$b9y&¯—-ŒAÐÌï \]]étúÑ£G›dróûB!ÄqÎÎÎîîî³fÍâv"ÝD<4é=…B!ÔËõ¶B§=ºB!„Poƒ…B!„ø:!„â[Xè „Bˆoõ¢ytøÕ‡nÞ¼Éí,Bˆ8;;÷ïߟÛY NÂB‡ç|ûö­Ý—ÆB1çáá±|ùr,tø :ü@IIiΜ9ÜÎ!„x›——·S@œ‡ctB!Ä·°ÐA!„ßÂB!„B| „Bñ-,tB!Ä·ð­+ÄWN:•›››““Àí\Bq:ü,&&fëÖ­Ó§O÷ôôŒŠŠòðð°²²òðð€Å‹8¢££'Mš™™™AAAÌwíÝ»÷Ñ£G“&M"‘HT*UXXxÇŽ"""ÌÓØ·o_UUUtt´©©éÖ­[¥¤¤ºî–×­[Û·oïºK „â!Xèð3##£±cÇzzz€‰‰Éرc‰*”””ˆ#\]]íîòôôüùó'cª‰ôôô¿ÿþ{×®]ÌÓØ±cdß¾}¾C„Bˆ),tz)…¶Z˜ìjAKK«´´”4;VXXuuu3f̘6mìÝ»÷þýû666De¶wïÞ{÷îÍž=›øØÖY!„P Xèð¹ÜÜ\ÆsœÜÜ\F»››[‹#·lÙÒî®üüüÆŒÃNz'Ož\´h‘’’ññôéÓ¯^½244ôôôlhh°··'ÚêêêÝQmÅN&!„ø:|NYY™ñ¤‰ñŠDåD"‘h4š………™™ A***ˆ‘:!!!DÇ ¡©©‰B¡%ËŠ+.\¸@Ti—.]Z±bã0&g!„BÍa¡ƒ:§yåIJãuäääÚŠ¦®®þãÇêêjüü|MMMÆ.&g!„BÍá<:ˆ h4±¡¯¯õêÕ¶[²dÉ•+W®_¿¾`Á‚æíÌÏB!„°G‡Ÿíß¿?>>~ïÞ½Äëåñññk×®UQQ€äääk×®ÅÇÇoß¾]\\œx9‹ÐÖ®½{÷d2yûöíIƒx½œ8‘hÉÉÉ!66mÚäëë»qãFqqqQQQ999b¯ÁÉ“'i4ZóçVÌÏÚµkW}}}ll,q-)))|Õ!„z3888øúúr;311±µµ511áv"]îéÓ§~~~ÜN!„x›¡¡¡···ºº:·éZÎÎÎîîî³fÍâv"ÝD"aBˆ“’““333+++«««+**ÄÄÄÄÅÅ¥¥¥555•””H$·ÓDõXè „ØõåË—ˆˆˆçÏŸ'&&êéééèèHJJJJJÊÊÊÖÔÔäåå}üø1'''==½¬¬läÈ‘FFFfffüTôÔÕÕ½zõŠÛY :thß¾}¹êXè „XTZZzëÖ­k×®N:ÕÖÖöÔ©SÊÊÊÌϪªªzñâEddäŸþ™™™9þü¥K—2fñ´ïß¿/X°`Ô¨QÜNµãÓ§O§OŸÆ‰F{ ,tBVZZzòäÉóçÏ[XX|¸}û¶……EÇ«œTUU÷ìÙóåË++«… ®^½ºªªŠ³ #„z9,tBUTT4uêÔË—/ÇÆÆž;wNUU•#a)г³sFF†¢¢¢¾¾þ‹/8!„ „P}ùòÅÒÒÒÜÜ<11Q[[›ãñÅÄÄNœ8qíÚµ… ^¿~ãñB½ŽÑAµïóçÏæææ‡^½zu—^ÈÌÌìÕ«W–––°hÑ¢.½B¨7ÀB!ÔŽŠŠ ;;»‹/Λ7¯.§­­;jÔ(EEESSÓn¸"Bˆá£+„P;6lØ0uêÔî©rÊÊÊ·oß^¶lYóeêBˆXè „˜‰‹‹{÷îÝáÇ9pæÌ™9lÒ¤IàÔuB½:!föìÙ³ÿ~aaaFËܹs-Zô×_÷îÝ»hÑ¢ß~û­ƒW­ZõËv77·-;vìf,‹B,À1:¡6åää“7o´··§ÑhVVVÄGOOχv|*9sæü²½ºººE‹¬¬ìÂ… ïܹ³qãÆN&ŽºÄ7þüóO*•úìÙ³v§ÀF¨‡À„P›BBBfÍš% мQUU•èeÙ¸q£««+äææ6ÿµwúôéM›6¹¸¸¬^½úåË—ŒöC‡¹¸¸ü²ÐÙ¾}{\\œËísçÎ}øðaWÜZwš2eÊ ÿ>|¸££cqq1›1ß¿?fÌ˜ŠŠŠæfffŒ 6låÊ•¹¹¹l^¨¹1cÆ/Äuõ8å—_êU°G!Ô¦´´4ƒŒB§¦¦†¨Z:NNNÄN_½zõ¸q㈛7o—Öòòò*--õññiÑ®¯¯ŸššÊ™›á—LJ……-X°@PPðÞ½{...ìÄ,(((++«¨¨’’b4nذáÑ£GOž<±µµ¥P(|¨¬¬ÔÒÒÚ±c£<¥ÑhçÎ üñ㇦¦æ!Cˆv–¯E§Ó/\¸@ܲœœÜ Aƒž?®¬¬¼víZâ¹ØÓ§O¸~ýz¢¢"“1 ÈÂÅñ1êɰÐAµ©¦¦†N§ÿr×Çíìì„„„.]ºÔü˜?þøÃÊÊŠÑmãèèÈf4íìÙ³lé&e£ñ—{ëêêÚ_YYI"‘ˆŠj×®]×®]322²°°xõê•“““———­­-¤¤¤ìÞ½ÛÀÀÀÔÔ´²²2<<œ1.{õêÕ‘‘‘¡¡¡‹/–””$‘H&&&-®RPP"##CÔ ¡¡¡ÎÎκººK–,©¬¬ KHH €¤¤¤7oÞhhh¼xñÂÉÉ)>>^HHvïÞ}õêUF†Œ§Š,_kÿþýÿüóÏøñãÍÍÍãââž?sæÌ!ž‹Å ÑB£ÑBCCÛ Èæ…ø:¡_‹}óæM^^^ë]$éëׯjjj——×¼¤  `„ ÄvrrrÇß™ªªª¢Ñh-5—––ŠˆˆˆˆˆTVVöïߟX&Ú F뢬}i}ûöe²÷Ì™3MMM÷îÝ311‘””ÌËË»~ýúêÕ«·mÛT*uÕªU‡ž;w®€€@MM Ðét …¢§§7sæLÆÃ—yóæIKK‡††:88ürP°™™HHHøøøoÌ=zTZZÚÈȈHÒØØøáÇ7oÞ\¾|9899YZZ>}ú´²²RWW÷Ó§OEEE ÈÍͽvíš½½ýÖ­[€F£­Y³&22’åkåçç_¹rÅÎÎn÷îÝÐÔÔ´téÒ„„„Ù³g8ñ\ ¦L™B¥R‰B‡yòì|Q¨7ÀB!ô =Z¾|ycccll,cÌMsýû÷'6”””²³³íöööâââµµµ²²²UUU®®®žžž}úôÙºuk}}}TTÑß#--Mü¶#,^¼xÕªU²²² EFFfùòåòòò C‡]³f««kQQQrròãÇ%$$ºôÞÛ-ƒh4Ú/÷æææzzz2‰|ãÆ !!!SSSb~ ôôt:>wî\b¯€€€µµuLLLII‰œœÜ˜1cV­Zuýúõׯ_€   ›››žž^GnaÑ¢EïÞ½+--ÕÕÕ%Z¾~ýÚÔÔäëëÛü0Fz÷îÝ-[¶4/ïh4¤¥¥5ÏL&ÛØØ´(t:u­ÏŸ?Óh´… ‚‚‚¶¶¶ Ìo‡yòì|Q¨7ÀB!ÔÒ;wÖ¬YÓÔÔdgg÷øñ㦦&AÁÿ÷wÅñãÇÛüñGó]ãÆc ïhùì3f̘1cFëL¬¬¬fÏžmhh8kÖ¬?š››?}ú”xfÑEX©Ó·o_æ'¶x+›XþýéÓ§ZZZ@§Ó#""$$$ˆ@™™™šššIII_¿~ÍÉÉ ôöö¶µµ•‘‘aDhëÁâêÕ«eddlllÖ­[(  ¢¢B&“ƒƒƒEEE[ïå奣£ãíí­¦¦´sçN¢]AA^¿~=xð`¢¥uQÒ©k·NŒõ¡Ñhááá-ŽaÜT}}=±Á|HT9»víÚ¸q£µµõÕ«Wÿý÷îϤ¸¸8(((&&†xŒfee•––fhhÍü!QòðáCâ‰Ì¹sç”””ìíí‰'tšššVVV‡NLLÔÐÐHHHHNNÞ²e 18&<<ÜÛÛ;$$D[[»¾¾>==]BB‚B¡1‰1¿C† ùþý{||ü¬Y³Fþþþ[¶l9tèÐâÅ‹7nÜ8þ|ggg77·éÓ§›˜˜ fff&'';::ÚÛÛ€°°peeåÍ›7óóó£££àÂ… ãÆ›6mÚ¤I“víÚ«¤¤”šš/^ûúõkg¯¥©©9kÖ¬ãÇ'%% <˜¸eÆ¥¨¨^^^ªªªéééÄÜïß¿gž< _T·üØQO!úúúü÷ƒ¿|ùòСC‰1ü-+++++«­IØê”ׯ_/X° ±±qëÖ­îîî0hР 6899µèÔéÛ¶mÓÖÖž;w®‰‰É”)S”••gÏžž••¶páÂæó5÷eee­‹Âµk×&&&@rrò§OŸ–,YB”2`aa!$$ûâÅ iiéÍ›7/]º”Ø•——÷öíÛÏŸ?'&&~ùòeèС‡&J——§P(OŸ>§ÑhÓ§O···ß¼y3q¡/_¾ÌŸ?ðàÁÙÙÙ>¬««suuÕÒÒúðáÃóçÏSRRH$Òĉ,X@t{Œ1"***22277WUUµ¤¤äýû÷™™™vvv–––uuuÑÑѱ±±………ššš%%%>|xýúuff& ×277'“ÉÑÑÑ/_¾ìÛ·ïøñãÓÒÒ~ÿýw999YYÙ‡ÆÅÅýüùSCC£¸¸XNNÎÁÁI@¾¨ˆˆ}}ýAƒµøI?ÞÒÒ’ñ !¿ ™0a‚¶¶6·é»wï&€ƒƒC‹gŸ|ÀÄÄÄÖÖ¶7 °úôiDD„ŸŸ·A{ölݺuÝ–â¸ììlŸ»wïñ_„º:!¨ªªZ°`AYYÙäÉ“/^¼H"‘šïرcGónž®“œœlddäííM¼¦^^^Þâeo•àà` …róæÍ5â!qqq§OŸ&#ÿrz„8 „z;:¾fÍš””--­Ë—/ÿòaººzTTÔÉ“']]]›ššº.™Lœ8qß¾}Œag/^$f¹mnذaW®\!‘HýõWLLL×僺ÎÂ… ÓÓÓ322222ðyê:Xè ÔÛ=z”˜d6((ˆÉz@***¡¡¡‰‰‰Ã† {ÿþ=ÇÓ¨¨¨Xµj•££cppðìÙ³íuuuŒeš›:uêŽ;h4ÚÒ¥K‰×B¨5,têÕöïßO"‘Ú *++{÷î]WWW ‹%K–|þü™#9TWW<  ÝÃÖ­[åèèxëÖ-Öï„muuu/^¼àb¨#JKK¹ê>Xè ÔëÐéôÕ«WWWWÏ›7ÏÚÚš³Átuu Y³)==]YYYLL¬Ý#ÿù矑#G>}úôÎ;ŒÕ¶»™¨¨¨¦¦æéÓ§¹ruÔq"""<´Vb:õ:—/_NLL”’’:xð ·siÇ–-[Ö¯_offÖ²²{÷îݰaÖ-[&OžÌ•劈55B=FF¨w)((صkœ8q¢ç/^8`À€Ž/=¸téR“’’.Í !ÄC°ÐA¨wÙ¶m[EEÅôéÓ9þЪ+œ>}ZYY¹ãÇŸ={VDDäÆ8]2Bˆ€…B½HTTTpp°PÏh%%%999:EAAÁÝÝN§»¸¸´X! !Ô;a¡ƒPoÑÔÔäææ;vìèT7 ·DDDOÙ:eÓ¦Mššš™™™¾¾¾]BˆÇ`¡ƒPoqáÂ…ÌÌL•µk×r;—¡P(ãÇïìYd2ùï¿ÿ€¿ÿþ»¸¸¸ òBñ,têJKK8ÞÞÞÂÂÂÜN§C¬­­W¯^ÍÂ‰æææ–––•••ûöíãxV!Þ‚…B½Â¡C‡ÊÊÊLMM---¹KG=zô¨¡¡µs>,$$БU)B| „øß·oß.]ºD"‘x¨‡ƒJ¥®\¹’F£±vº²²ò²eËšššXåƒâ'8a BüÏËË«¾¾~áÂ…œš°¸TVVZXX´^̼ã¶nÝêïïÿèÑ£W¯^r0·¶ÏQÏ·zõêŽOÑ„x:ñ¹OŸ>ݺuKPPÐÓÓ“Û¹t‚ŒŒŒŸŸ;ú÷ï¿qãÆC‡yxx8F!~öñãÇP(”Í›7s;—ιtéRdd$›A$%%]]]Gê Ôka¡ƒ?;tèF[¹reÿþý¹Kç >|ôèÑìÇqpp‘‘IJJŠŽŽf?Bˆç`¡ƒßJOO¿ÿ>…Bqqqáv.foo¯§§Ç~qqñõë×ÀáÇنâ9Xè Ä·|||h4šœœ·séœÊÊJöŸ[1¬^½ZJJ*::úõë×œŠ‰âXè ÄŸòòòˆ—­6lØÀí\:íãÇ^^^œŠ&%%E öññáTL„¯ÀB!þtúô鯯ÆÙ³g³ùâWHHHüöÛo èèèH¡P=z”‘‘ÁÁ°¡ž „øPEE…¿¿?ðbw 6lÍš5 Ø¿ÿE‹Ñh´S§Nq0,B¨çÃB!>PYYibb2|øpnçŠÀÀÀ¢¢"ÎÆ\·n™L¾qãÆÏŸ?9!Ô“a¡ƒ¿¡R©ç΀µk×r;:t¨¼¼œ³1 dnn^[[{åÊÎFî¸Çú•ÜÜ\n¥„ßÃB!~óøñãoß¾©©©YXXp;Mœ8Q]]ãaàâÅ‹MMMÞq¶¶¶æææ°`Áb!Ôu°ÐAˆßœ?Ö¬YC&óêðãÇ p<¬©©©¦¦f^^Þ£G8¼ã‰¡Ök×®%6H$Ìš5‹èà¹ÿþüùó‡ bggWRR/^¼X¾|ù˜1c´µµgÍšõòåK"ÔäÉ“ äàà0räHùó秦¦6¿–¿¿¿………¶¶ö AƒŒÿøãî¾[„¸WÿDýRFFFTT”˜˜ØâÅ‹¹ ‹Þ¾}ÛE³“H$bÅÍ‹/²„N§Óh4*•ÚÔÔÔØØØÐÐP______WWWWWG§Ó™œ;`Àiié>ýùh IDAT}ú4o‘‘‘‘‘‘€+Vp®®®©©©³gÏÎËËKNN€¤¤¤7oÞŒ1bÙ²et:ÝÉÉ©±±LLL ::ÚÔÔÔÎÎ.??õêÕT*•ž’’²{÷î~ýú-[¶lÞ¼y555999,ß8B< õDˆ¯\ºt æÍ›'%%Åí\XôäÉ“ššš.ZƒsáÂ…ýõWTTÔÀÉd2½mÐV;ÌçfÔÓÓKLLlÞ2tèPÆ4†sçÎ 1b„²²2ã0'''KK˧OŸVVVêêê~úô©¨¨hÀ€'N øçŸÆOÄwssûþý;qnMM q EOOoæÌ™¼ûB,ÃB!þÑØØxýúuX¹r%·sa¡¡!…Bé¢àRRRsçÎõ÷÷¯¨¨`-éW࿟8ÂÛÛ»y•wïÞݲe £«h4c[EE…Ø ¾7ÆacÆŒYµjÕõë׉ZJPPÐÍÍ# k ÄC°ÐAˆÜ»w¯¬¬lÔ¨Q#FŒàv.¬ë¢¾;;;™×¯_ þ²paÔ.¿loKff¦­­-û¶¾Š———ŽŽŽ···ššZPPÐÎ;;'33SSS3))éëׯ999ÞÞÞ¶¶¶Ä“2„z ,tâ~~~°lÙ2n'Â::¾eË–ƒr°ƒ¤…ŠŠ qqñ²²²ØØXkkë.ºJ[ÊËËRRRàܹsC† Y´h±ëìÙ³ïÞ½€ .HIIQ(”eË–E‰°°peeåÍ›7óóó‰L.\7n±}éÒ%;;;EEÅððpxüø11Ýbxx¸··wHHˆ¶¶v}}}zzº„„D×õ–!Ô3á`d„øDvvvLL …B™7o·sa]~~þƒº®Ê€‘#Gµ 1yt7KMM=yòdhh(\»v­ù°è   ¢R¹~ýº¯¯ï™3g>þLìòññ¡P(—/_ŽŠŠ"Tœ8q">>ž¸‘ðððüüü°°0¸yó&q–¢¢¢œœÜË—//^¼¬¡¡qõêUQQÑî½c„¸ {tâׯ_§Ñh666ÜÎ…u eË–-]z‰þýûoÙ²åÂ… ‘‘‘?~üPPPèÒ˵0nܸo€3DDD´uÖèÑ£;òJ<ñŠƒMg3DˆÏ`Bü€N§ß¸qx÷­rB¿~ýV¬XÑuñóóóÝÜÜddd¦M›F¥R!~……Bü >>>++KIIÉØØ˜Û¹°Åßߟ§ÒE"##ËÊÊà¿a```×] !Ôà£+„øAPPØÚÚòîlȄ۷o·x³š³æÍ›7qâD033ëÛ·oJJÊLJÚuWDqoÿˆ€ÆÆÆ»wïGÞmæ.ggç®{7ž˜:OMM ŠŠŠˆŠíííq=s„ø:ñ¼ÈÈÈŸ?êêêêêêr;v™››7_!³Þ¾};{ölb[AAx†•ššZ]]ÝEWDq:ñ¼;wî±<$OKOO'V$í"±±±ŒZL&ÏŸ?ŸØÎÊÊ꺋"„¸ „x[SSSHHÌ™3‡Û¹°+))éÕ«W]ßÙÙyÛ¶mŒŒÒøB| „x[xxxeeåÈ‘#ÕÕÕ¹ »ÆŽ»zõê. ÞÐÐ@£Ñš¯j9jÔ(%%%¸uëV»«u"„x:ñ6b2Ì §¦¦6vìØ. ÙzÎhâ%ó’’Æâ!>ƒ¯—#ÄÃ‰ÅæÎËí\8ÀÉÉi÷îÝýû÷ïŠà¹¹¹¦¦¦-ûí·C‡À¿ÿþk``Ð|WhhèÔ©S;{•Ÿ?þý÷ßl¤‰ºCFF·S@Ý „xXLLLYY™¦¦&,`ÔÔÔôï¿ÿ=z´‹â¯Zµªu£¶¶¶ººzVVÖ;wöïßééé·oß¾}ûv}}}g ¾}ûº»»s&]Ô•ìííµµµ¹ê&Xè ÄÃl=*èË—/€=:ñ þk¡Þ©ªªÊÖÖ6%%EWW÷ñãÇjjj ¨®®ÎÎÎævjlQWW———ïŠÈ7oÞôóóc|ܼyóÎ; 22òÊ•+­Ç„ø :ñ’ºººÅ‹'&&jhh„‡‡÷ë׆ <ýôª¸¸ØÉÉ©‹‚kjjZ[[7oqqqÙ·oNwtt>>Œv¢;gàÀ$©‹òAu',tâ T*ÕÑÑ144´_¿~aaaŒ]D¡“’’½ìØ5bÄb†bŽKLL|ùòå/w988>|˜D"mÚ´éàÁƒD#ÐAˆÏ`¡ƒ Óé›6mºs玴´thh¨®®nó½|У#..>|øð®ˆÈd«+V;vŒL&oݺuß¾}€tâ;øÖB<ÀÓÓÓßßœœœFÝb¯®®.™LÎÈÈhllâF‚ìrtt\³fͨQ£8ÙÊÊJUU•ÉK–,tvvöôôlhh())ìÑAˆ`¡ƒPO÷òåËsçÎÛ^^^þþþ3gΜ9sæ”)Sˆ%®ÄÅÅ544222233utt¸š,‹âãã7oÞÜ‘;²2ÆÂ… …„„ÿúë/III`¯GÇÆctuq˧£n#±z,tê鯗››ýèÑ£ÐÐÐÜÜܳgÏž={V\\ÜÜÜ|Ö¬YVVVÆ ËÈÈHMMåÑB'44´oß¾{ÿþ}QQQssóvüí·ß„„„V®\YYY ìõè|xøÃhõ@ñ~Â,G@Ý pÝ{úY::½:ñ …baaaaaA§Ó¯\¹²iÓ&¨®®¾{÷îÝ»w€¨RRRæÌ™Ãå\Y"''×aoÞ¼9sæÌlmmýçŸSì°ùèj˜•BUž_Ož¿:'s;ÔMp02B¼„D"åååÛNNN>>>S§N!F–ðèxäìÙ³§+"oݺµ#Ý9 NNN"""@ôë „ø:ñ˜ØØXbcÞ¼y¿ÿþ{``à—/_®_¿¾lÙ²Ÿ?r77Ö¤¤¤tÑ„¡C‡öéÓ§ãÇ @LLLWäƒê~øè !^RWW—˜˜òòò#GŽ$EEE§M›6mÚ4:ÎÕìX´qãÆ®èA9}ú´ªªjÇ]ŒÃÃÃcbbæÍ›Çñ”BÝ{tâ%¯_¿nhh€iÓ¦µîáÑ‘• …XË‚³îÝ»G¼BÕ)&L€/^p<„W`¡ƒ/aüž6mw3á:®®®^__ÏñÈãÆëìYzzzbbbŸ?æÑ瀡°ÐAˆ—DEE€°°pG¦‡á yyy¢¢¢ …ã‘eddX+$$d``@§Óãââ8žB¨ûa¡ƒÏ R©ÄjFFFÄËA|@YYùÉ“'ëîî~ÿþ}ÖÎ;v,´µBBˆ·à`d„xFjj*ñˆÇÆÆ†Û¹p Ng,ÃÎAÑÑÑ«V­bí\â׫W¯8šÑÿó·aTqV–i?‡›@§ƒ—þ³Ÿ9µRò”m¯L„Å:ðýý~+“Z·{¼1í£ÒÎŒ>9IåÁ;Rrß–Óé ?X¢¡–ºí• 1Ü+'©üü„í¯LD¥yri„{tâ!ŒËõõõ¹› ¹»»ß¸qƒãa#""† ÂÚ¹úúúd2ùýû÷]1rˆ mÖ>GeT?sj`ürU!ÑNW9 †vÊC§ËÀØ¥*ÄF»jËÏÍO(Í©»DEǬÿ÷ÔÊ’¯5µTboù÷ºšŸµM,§„×aB<#$$„Ø8vìcõ+^—™™immÍÙ˜ÅÅÅì¼Æ%%%¥­­ššúþý{&Æ0ظoì…ot:Ä\ü6ÇK÷ÕÕ\¢]‰ÏK"N|É}W^WѤ #i½GgQ_8<)æ{j% žÔ7+¾TX\`⊖[3^¶›²QóGjåÇGf›4ó“+>>* öÐiô¨Ó_ã.}+û^§ #ié>h˜ÕÊ ooÊjËíWÕ—€Àõïßßû!(L€CFÏ Òª`ÿèg@"…û Ë-ƒ™|yùýc'Oœ8‘³17mÚÌN¢¾!FDuõ±²¯ó~æÔ~)P%ÍhÿúºìÛ«RÕQ2F«Òiô+Ë“¨ 4˜â¢©7S2cŽœ£8p´LøáŒÈc™ «,**#$Ñ÷ lÉ*‹ŠÉ ‰É À­)vê§)n´z ‰ ——¿a”V ZdAÒ½?>%啿Ôþvpè¶W&dA˜®S>SÆ/W¼AcòFM³þÄYLNrT6C®9¾ÍûP¡?o@iNmÎÛr&÷•x3?Àá-JŸ°r`?5±Œ˜0°S€ä¾nj MX¡ª;U.%´ð´M|}ö0¡NÀ„xCYYÙÏŸ?EDDÞ¼y#(È'r©Tª€€Ço'..îÈ‘#ìD000ðóóël¡SUUU[[K§utÚÆ)5/Ù½¾¼4Æ-UÉI*'ÚÍ7iŸ!ŸZX[Ѩ¤'õ=¥²²°^FYtÔ\E!òû?¦m<ÅEüV&EžÌ2]¯¡2JzÏçÿ·Ø…’žÔ_éæPšSûòJ¶é:õ™»t€F¥_XôúѾô1 •È$eÑE'õîîH½¾î= *9ïÈp)y ,R•J~P0yƒFó>ÌŽY¨$,.ð!¤@U_ÆîÜÈæ'¶u_OŽd *¹!lÑ“tmí»7·òõç+Àã¿ÓEe„´Lû€DaíÉýÞu-רA­S?Ô›ñÉ_—ñ½7oÞÀÈ‘#ù¦Ê€·oßnÛ¶-<<œ³a333ÙŒ0zôhxýúõ™3gjjjª««kkkkjjjjjÚÚ` 衈wt¼Ž„îT¹ õç+‰7ëŒys+?Ðù=ú¿‚©Eí4tƺô†ÏTxÿGUqQšüÒOUt:ŒY D|$ FÏù¾ª¨AJB£Òõ¬GÌVÌ}[žõª4öü·Ë¿'z¾LhsòIæ‡-:¥×bt[÷õó[ñ5¢ÊÝ©ronåÛÅ_ª©ôÈã_šÇ)ùZÓVnµÆ?c"Ä߈BgÔ¨QÜN„“òóó54483%%ESS“͉y´µµEEE³³³=<<:~–„„„¨¨he]iÇO™²Qóã㉫Vü¨c4Þÿó“âPÉE§Fô׋¿š{gËÇgeÆü”×’€ÌØA ™x>Õ–>Eàch¡ÂI Ó!%¬PDRP¼\²K¬(¨w Ÿ ª/£ª/C¼åö¡º¤ARî_`‹>*æÿ§Õ<ÝmÝWŸbiÅÓ¶Ñ)døø¨à×R# 6†O`áM4„Xè Ä’’’€¿Þ·€Y³fYYYq6¦‹‹‹§§ç¤I“Ø "  ££“””4sæLmmm±ÿmkƒQZiŽhÿmùôgÅðìä³þÞEÓ“¼¹onæ›»j PÈuM ×rKskÓ"Š êT–¦Qb€ÜõLÉ}W^[јü ÀÈ~ ÑR[Ö{);/¹"0Ljüï* ¯%1r¶â£}é_ãKåK|yñ3çm¹ÕŸÚÂd(Ë«ýñ©êÑsí)ýjJ“ô×—èÿŸ{‘V€››>( “*˫͌ý9r®âìýºLFødf'•@Ô©/"ÒBB"F«Šõ€¶îËÜuÐu§w‡Mc´Mûå%WdÅÿ¯R´ptmí;oãç:æýɤŒꜤr³š¦Îêìü|Q¯‚…B¼áíÛ·ÀXÈ“?õïߟƒi4ZMM +?´6nܸ¤¤¤‘#Gº¹¹±­…´Èbˆ»”ýó[­®¥\ÜåoŸ£JàõÂퟆPà<:ñ€÷ïßÀðáù'‘Éäüü|Î.ç¹eË–‚‚‚ök¶¶öºuëÄÄIJ³³ËËËÙȽ>¿ð^\Éù–PÆít8é[BYÄñ/‘Ç¿$\ÏÓ6í·ì¾t¸ {tâD¡£§×òiO+//âØ"Juuu#FŒÐÖÖf?ñ²ÕСCÞ¿olÌìAR·ÙÏÖ랬ù£+„8 {tâÄœÈ|Ö£sùòå¿þú‹ƒEDD®\¹Â~ggçÒÒR6lü÷ËGñ(,têéjjj²²²„……Ìí\8©¡¡AWW—ƒ}}}‹ŠŠØ ’’’%-- ÿíBKNNæ@r!.ÁGWõt©©©4MKKKX˜¯†gnÞ¼™ƒÑ½¼¼æÍ›Çfœž:uŠL&Q‡¥¤¤p ?„—`¡ƒPOGü¢e­ó#&&fëÖ­Ó§O÷ôôŒŠŠòðð°²²" ,^¼xàÀML¯—™™Ä|×Þ½{=z4iÒ$‰D¥R………wìØ!""ÂBnoÞ¼!VZàˆúúzggç¾}û²G\\œ1ÙàСCI$Ò§OŸh4Qú „x:õt?~âmçÎ222;v¬§§'˜˜˜Œ;–±¦’’’——¸ºº26ÚÝåééùóçO¢ÒÓÓÿþûï]»vu6±¢¢¢ùóçgdd°pS¿$!!áîîÎfG%&&_ˆ‹‹«ªª~ûö-33“Ïž"Ô{à¿Qêé>}úC† álX…–“°1Z˜ìjAKK‹·ÛYÅÅņ††í×annnìÐù÷ßÕÔÔš·“¦¦¦²!Ä-Ø£ƒPOGü–eyúàÜÜÜíÛ·3¶í­W6زeK»»Zðóó3f Y 2äÚµk,œøK¥¥¥·nÝbô3±Ì××·¡¡¡yË!CBCCSSS­­­Ù Žâ ,têÑÊËË %$$”••Y‹ ¬¬Ì¨O ØATN$‰F£YXX˜™™±$--MYYY\\œý|€B¡?~œÍÁÚ™™™-&0$êË´´´N…º÷G*EÿvíÙèôöA|ÿ("Ô£Ý9ƒî9‹?4¯œX¶cÇKKKޤ$&&fccÃf+Vìß¿ßÈȨy£––t²Ð9¶ï\uu5›É .g=çÏêRXè Ô£}þü82Ûo2`ÀÞ”……Å­[·ˆÉoXSVVF&“'NœØ¢][[›D"effR©TŽ„š9s&Ëi „8##Ô£} D¿ öïß¿wï^ˆŠŠŠ÷ððÈÉÉ!ö&''oß¾=>>~ûöíÄ1 míÚ»w/ѸcÇŽªª*ï àøñãÄììûüùó?Ø©r@FFæÙ³g­ÿ‰/&&6`À€úúúììlvâ#„¸{têш° ÄÚéŒ÷ÉMLLbcc›ï>|x[¡ÚÚåééÉxûše%%%•••-Þob™šššŸŸ;¨TªOë!Ø„Áƒçåå}þü™³ ­#„ºöè Ô£…ŸMâÅÂÔ;m5Š­Å®=zôìÙ³¶ö_~ff&;—@q :õ\T*õÛ·ošššÜÎ…“(JëÑ0¬ihhÐÔÔlñNxg 0`Æ mí%¾|b°Bˆçà£+„z®¯_¿655©ªª q;N²²²âT¨¤¤$5556_,g¾ñÜðË—/ UUUÆN2¨ÛÌ™3_¼ê °ÐA¨ç"~¹jhhp; 133k1c kÆŽËæÄƒW¯^UUU566nëâûï࣫‚‚‚ 6Lž<™”P7xøðáìÙ³±Ðé °ÐA¨çâËB‡F£ÙÛÛ§§§s¤Ð©¬¬”——g'ÂéÓ§:Ää!!¡üüüúúúŽä,''çããÃNJ¨„„„p;ÔMpŒB=WVVð]¡SUU5eʎ̉\RR2lØ0Ær:¾aÆ &09FPPPEE…F£}ûöå !„¸ „z®¯_¿§^Ãî!¤¤¤üýý9*--ÍØØ˜Lfëï± ´{ 1åñã@ñ,tê¹ø²Ðyûö-ÑSž &°|z}}ý!CêêêÚ=’ø`B¼ „z(:NÌÆ«ªªÊí\8éÊ•+ Ådò›ŽHHHÐÑÑi÷H¢ÐáT}†êNXè ÔC×ÖÖöéÓGRR’Û¹p’žžž¾¾>ûqÒÒÒ\\\؉`ddÔÁ7¶ˆZ377—Ë!„¸ߺB¨‡âËîX±bGâ³³byYY™¨¨¨˜˜XG&~ ¸ÜB¼ „z(¢ÿ@EE¥õ®½{÷†……“ 755‰ˆˆxzzrämmòôôl±P(TUU½|ùÒÜÜœýø'Ndgze??¿ÌÌÌcÇŽuä`â§ÀX !ÄC°ÐA¨‡"~­*++·ÞåééY]]ÍXtóãÇGݶm[·æ×žšššÖŸ>}Ú¿?û…•J Ÿ6mËh4Ú’%K:xp¿~ýDDD~þüYSSÓÁN „P…B=Qèü²G§…¡C‡2–ïnll$ÅÁÁ!66¶Ý4˜\¶l™ƒƒƒ¤¤¤‚‚˜1cÛ8yòd6m€±cÇŽ;–µsëëë·oßþüùóN5`ÀøoõɦÊÊJ*•ºpáÂñãÇ2dÊ”)aaa¶¶¶ìG&hjjZ[[³Y踸¸<~ü8,,lÁ‚‚‚‚÷îÝsqqagÖ"„¸š_Ê IDAT „z(âw*ñûµ5¢¿$!!áâÅ‹&&&Ä|0rrr­ûQt:½Ý–Ö˜466666¦ÑhQQQܺu+óh‡5j›…NIII||üŒ3X;½¦¦fíÚµm}±m!Ž'ªO6‰ŠŠ€½½=1á²µµuXXã1\ttôñãÇ?~ü(!!abb²iÓ&F±ûâÅ __ß>TVVjiiíØ±cܸqÄ.vîܹÀÀÀ?~hjj2„q9&gÍš•šš Gõ÷÷ONN=zôñãÇûöíkmm-**¶víZeee--­;w–••ÉÈÈ0IƒI@ð÷÷÷óóËÎΦR©ŠŠŠ¦¦¦{öìa9Cö¨—Àytê‰‹ŠŠú÷ïÏüHWWWF-¢¯¯õêÕ_ibbrñâEÆÇóçÏ3>655999Í'Œax©ŠL&+**Ι3§yÇTUUµ^…ÊÚÚZSS“ùµ+22òúõë,Ÿ.++ëîîÞÙ³ˆBçâÅ‹–––æææfffS¦L™>>...›6mòõõݸq£¸¸¸¨¨¨œœœ‰‰‰ŽŽüöÛo~~~ëׯ—’’¢R©ÆÆÆD;aâĉ6l­¬¬üã?ÜÝÝ¥¥¥™ÌÏÏß»womm-•JmhhذaCó$mmmׯ_/###,,,--½xñb99¹?þøƒý/gðàÁ+W®díÜ¢¢¢x{{wöDEEE(,,lQϵÖnmJøe­vôèQiii###èÛ·¯±±ñÇoÞ¼¹|ùrprr²´´|úôiee¥®®î§OŸŠŠŠ ››{íÚ5{{{¢GF£­Y³&22²Ý€sçÎ 1b„Ï/G.Ÿ9s¦©©éÞ½{&&&ÄÜ•m¥Á< QÿÑét …¢§§7sæL)))ŽdˆsXè Ôýøñþû˵5OOOOOÏæ-ŒYøH$“±2Ë–-[¶lããÓ§OÛ ,øåò–Lž>}ºÍ°°° þ-ÎðîÝ»ÒÒRSSS&guĈ#X>7 €µÕÎ@EEåâÅ‹d2™ô_d2™øHü777·ƒÝEOŸ>%]=~üØÙÙ™hüúõkSSãå5cþž»wïnÙ²…J¥2v÷’––F§ÓçÎK4’Éd¢ÐaÁÛÛ»­âÆBBB¦¦¦`žó€cÆŒYµjÕõë×_¿~ ‚‚‚nnnzzzìgˆsXè Ô…ûƒv{”ˆˆˆ²²26 ŒŒŒ¸¸¸æåZ§¬\¹²¼¼œ…‰®µúúz&‡ ±³šºŠŠ ™L&Æñ´àå奣£C<¢ Ú¹s'ÑNa¯_¿}º‰‰‰  `fffrr²£££½½= WVVÞ¼y3???::.\¸0nܸiÓ¦Mš4i×®]±±±JJJ©©©qqqpñâÅ)S¦\¼x±­€gÏž}÷îGJJŠB¡,[¶LFF>|H¼·uîÜ9%%%{{{FÇ$ &ÃÃý½½CBB´µµëëëÓÓÓ%$$( ó[f¡ÂB¡žˆÒu…Î/ÿÞÕØY±aúôéµµµ¬ëêêjaa1sæÌΞøýûwiié>}ú—””ÈÉɱ–!$$®^½úòåKww÷ððp¸víÚܹsmll(ÊÙ³goÞ¼I&“•””š?ôññÙ±cÇåË—)ŠªªjZZZ@@@BB´iÓN:åããóàÁƒ°°0aaammí´´´«W¯:::ž}–.]ʘšIL***ÊÉɽ|ù2&&FBBb̘1îî¢Ìo™I@„: „z"¢ÐaójOãæææííÍæ3uuuÖN¤Ñh÷îÝk>bÇ8p@^^^NN®¸¸¸°°ÍŸ QÙ0¤¥¥5ÿ8mÚ´¶f|=zt[³ãˆŠŠnß¾½­»k+`DDD[I6¿Õñ4˜´±±ikV&·Ì$ B„¯—#Ô:÷ïßg³Ê‰=qâkç’ÉäOŸ>ÃY:ëëׯk×®%^§jþN>B¨çÃB¡žˆ(tøiÆ}!!!ÖzSš eù¹ULL Ë ¼ËÈÈ…ñ£Añ ,tꉈn~*túôéÃxže›7oþý÷ßY81''gùòåõõõ=±ªªjéÒ¥Ä6ñãÀ„x :õD%%%À_…N@@@RR›A$%%Y ŸŸ¿|ùrztÎ;GÌ’Xè Ä›p02B=NSSSyy¹€€k/B÷LwîÜam| CPPPVVV»ËiýË‹€._¾¼ªªŠØ&ÖWÂB!Þ‚=:õ8¥¥¥t:]VV–©çzšõë×9’ÑÑѬ•JÉÉɬu&Õ××÷éÓGUU•øH:¥¥¥,„Bq öè Ôãüüùdee¹À©S§rsssrr؉3yòd639qâk#‘}}}‡ 2jÔ¨NÕÔÔ4nܸ°°0ÆÚUÄæäälܸ‘“ɱäÝ»w¯^½b§Ð¹téR~~þþýûY8·ÅÚ¢¤§§÷ï¿ÿ6o!~"í:UUU΍'£ÓéÜNu,têqØéÑñóók¾°¹ŠŠ £;‡x¿zçÎ:::))){÷î¹té±÷áÇ111$©©©‰D"Ñh´C‡1¿Vccã±cLjIœëêêf̘ÑÖü¶l.=ŸŸoll̉kÖ¬ñôôTQQéÔYoÞ¼QPP0`@óFâÑQ†¶EBBbìØ±OžHœ¶:rrr555xÙ,¿¥K—§˜?<"2ª¯®®Î¡¹¹922²Å‰0Nž<Ù­[·uëÖ‰ÕŠÍf“Éd—hrrrÜa7èP©Ttç”:ºº:„P×®][ÑvõêÕ[·n­¯¯Ç_?}ú´hÑ"ÎúÙ=z(((ÕÔÔp/@±²²º|ù2çkmmmHHH‹Ï²°°n±ZssóÉ“'[·a STTœ4i’¸­?~}8)¥¶oßN§ÓSRRð‚ž®]»rVöøûûŸ9sfõêÕÊÊÊŠŠŠêêêãÆÃk€¸ÉÊʺ¸¸´âgáØ¼ys+Z%$$ØÙÙ‰ÛêÈ‘#FFF®â? ŽDR$Î9к@!¤««ËÙ^ίwïÞÖÖÖ¦¦¦<å^^^^^^üõ·oß.ìV$iÙ²e-ö'$$äÔ©SÉÉÉ­Ûä’ݳgOž PD0 q[9r„Éd »Šÿ(œ¤ÉSWHüåÙ<Õ^îܹãääô#î,LBBByyy«·òž8q"11QÜV¹¹¹"öF SRRB¡PDüæUTTŒè U`D‰óíÛ7ôýÚŽvìØA£Ñ=z4vìX›Ö­j…õë×;::¶º¹™™ÙĉÅmµvíZ???âMªªªÆŒóòåK¾„ÿ@Ñh´„„±º :Š‹‹ ¥ó_¿GÛ}DgÛ¶mí{C‚ŒŒŒD¬ziÑŠ+ÄmÂd2Ùl¶¸"¿{÷ÎÃÃCô¯_å¬õæWYY¹jÕª¶'ö?Ú;wf̘Î:Hè´e›’äøòå‹Ý… Œ[Ñ<>>~À€úúúbµ’••÷Y#FŒ1b„è:8нFG]]]Øît 9bbb:º à'5:Hœ£»s:ùùù>|hõèÔ_ýUTT$V6›½iÓ&qQ¾~ýzAAA‹ÕZÑHt8ø=ª¨¨ØÑiÆÆÆ‡êß¿ëšÛÚÚŽ?^¬&>LMMkJ‚N§ÿñÇt:½Åšøtf‰¤L] Yètzss³¼¼<™Lîè¾´%%%V7_¹r¥¸M´µµ7mÚ$n«ßÿÈB"<ÌRFt,x\¡y$“ƒƒÃŽ;Z×öï¿ÿÎÎη•®®®XËÙl6…BY´h‘ÊøïÒØØ(n¯$ ~‰Ju “™™É9sïõë×âfÃqþüy‹%V“°°°¨¨(±šDEEIÕŽQ(ô=Ht,ø%Š_¨RjÓ¦M–––žžžóæÍÓÑÑ)..wu0BÈÓÓÓÌÌL¬&ÿü󸋸/]º4eÊ‚•ñßFt"°FÉ‚³´zDØÙÙY[[¯X±";;;;;;&&fïÞ½•••æææ'OžÔÕÕ%r“ôôôE‹‰{ÌÉñãÇÅÝ‹B|Ý7þ»´"³ £Àˆ’èHu ckkohhèææ¶k×®Û·oøðaæÌ™$å „\]]Å= ‡N§ˆݺuK¬YB<¢R$KSS’ò@ÇÄÄäÛ·oùùùœ’Ë—/geeF£ÙÚÚ&&&ÖÔÔp.1™Ì#GŽŒ;ÖÀÀÀÒÒÒÑÑ‘³^Ä¥äädWWWCCC++«uëÖ•––r?îÊ•+¶¶¶zzzcÆŒùã?ˆ\@ÚI÷ÿ3 óÁKF¤ýXdeee33³U«V=yò$11Q¬¶ ÃÞÞžx“ëׯ§¤¤üóÏ?ë—””\ºtiõêÕbu !$##ƒª¨¨ðñña0MMMMMMøþ¿4M¬s“ƒ‚‚”””ÆŽ{ãÆ ///\¾qãÆÈÈÈqãÆM™2¥°°ðáÇœ‰?a—âãã}}}ŒŒ<<<êêêÒÓÓcbbp~®×¯_ïØ±ÃÊÊjüøñuuuwïÞýøñ#¾¡ˆKtè Y:G ƒrttüóÏ?ïÝ»'nFOEEÅüü|<¡C’’’§§'ñúššš—.]RUU«c!|P]]ˆ™¦^½z¼•J½yó¦]Ïž=GŽ’’’ÈÈH__ß5kÖàšëׯÇÃH".ªªªŽ=!¤¦¦6f̘;w‡ãCŸq5| ´©©éÔ©S»víŠï â:H–ææfô}ä@ªÙÙÙ©¨¨I Å#44tøðáݺu#ÞdîܹÄ+×××+**â€@,xוššÚ®]»äåååäääåå9äää*++ÿýw‚7ŒˆˆhhhˆŽŽŽŽŽÆ%™™™ïÞ½C999qj8pq©¸¸˜Édž9s†ûœ±KKË%K–„„„ddd „dee×®]‹B‰¸@'’ˆ{Pž:}úôСC[ÑpÍš5'Ož$žð<88xôèÑ:::ë9r¤©©iÛ¶mâvlëÖ­=zô@)**º¹¹ ¬SPP@0He³ÙÁÁÁ:::œIº°°°k×®YXX¨««#„²²² ÄÓJÄ%mmm™¨¨(çèêê>þ¼¸¸øãÇ¡¡¡œ={v·nÝD\"òƒ á Ð@²tšÂÂBâ©8êêêÈdò´iÓÖg2™x‡AW¯^½uë–¸£Óéqqq¡¡¡ûöíkE: ~Ç/..¶²²211±··¿}û¶ššZLLŒ™™Ù¼yó¬­­·lÙrÿþý~ýú1™ÌwïÞåää$&& »äëë»víZ‡qãÆÉÊÊäää,[¶léÒ¥¡»wï}úôéÓŽ@' õÃã ”““3qâDq[±X¬ÀÀÀ>¬_[[+ÖšâÐÐд´4q{õõë×õë×ãdfÿ0¢€dÁ«sÚeÌ ••• 0@ÜVŸ>}244´³³#X?<<\¬]]FFF­Ø¦¢¢ràÀ<ÈR$KçtÄm¥©©™œœL¼þâÅ‹ÅzʰaÃÄíRyy¹†††³³3þÚi–Šðßÿs@²tŽ@§²²²Ã«V­º{÷.ÁÊ4MVVVKK‹`ýiÓ¦ñ¤Dh›Í^¼x1çÔ‰Žsà¿$Kçt\\\^¾|Ùb5:¾iÓ¦Û·oS©TvõêUI±{÷îãǬœššZUUÕ§O‚õ±ÊÊJeeeî½î0¢€Ô©+$ - þ¾—@l6ûãÇD¶|S(”„„„W¯^-Y²¤ÿþúúú_¾|©¨¨ÐÐÐh±í7bbbviĈW¯^wICC#""‚»Ft:ðï$ Þ’ÝŠh$‰Dúøñ£‚‚‘ÊÖÖÖîîîõõõ!!!ÞÞÞ £G¶°°Xµj•è_BnnîÀ‰<¢´´”ÉdŠ»8zÏž=¯_¿æ)ì¹åøO@É"''‡Âi¥Tmm-ƒÁ Xyøðá)))d2yذakÖ¬‰ŒŒ,**¢ÑhC‡OÄÅÅôÚ¸qãÅ‹ VÆ /\¸À?°„ÿ.øo ðï$ ~»Ku \ZZº{÷n"•­­­;ÆùÊd2gÍšåââ²dÉaM>þ¼|ùòœœ"ÎY,Vii©‡‡‘Îp 0àúõë8³7"#:4M¬” C´K  Ð@²àüØRè0Œ!C†¬¬¯¯_SSSYYÙ»wo„ŸŸ‰DÚµk—ˆ&ÕÕÕK–,!å „Èd2ÏÄ-zþü¹©©©ÀôÝx¤ ÿRQQ±±±¹wïžXO?Ÿ““œ‡ô’¿D‰OýH â•edd¬¬¬ž,î¿Ú¿|ùâéé)0ÊA€¤@É"íNuuõœ9sŠŠŠˆ7éÞ½ûåË—/^¼®­­-ºòÅ‹»wïN0Ðùå—_”••‰÷!¤££³aÃaWB7”$ìº@²à—(~¡J£êêêáÇ‹ÕÄÖÖ¶¢¢âðáÖ––-Vž;w.Á•Å,KWW—È‘<›Íž9sfAAˆ:8ÅÁ(@*@ €dÁ/Qé tôõõCBBÄjÒ¯_¿ .¸¸¸©lffÖ·oß«Õ××744ïÆƒjkkE·#:Ht,òòòd2¹©©IJGÎËË£ÑhÄëÓh´ &899µX“Édš˜˜É,JMMµ¶¶VTT$Þ“ &„……‰NïP__ë¶€ŽGII }§J­[·>zôˆxý‡òW#Ðõë×+**ž†|X¬¬RŠŠŠ†††Dj*((Ì›7¯ÅjÍÍ;¾¾™™™ÄûÐ¥K—C‡©©©µX¤l/@âHo SSSóåË]]]‚õ‹‹‹—/_ÛbÍ€€€þ,›üh4Ú°aÃÆG°MMMÚÚÚ-nkÇðEĨFKHH øhÐQ `nnÞѽ? :Hé t?~Nühà‡þ‰ŽŽ&»tíÚõÔ©S;PWW7bĈ§OŸL(ÿ("*WVV®Zµj„ ;~¾÷ïßÿH;t8ø=*ÖÞ% A¡PFM¼¾§§§££#‘š©©©DÎ8~òäÉû÷ï‰ÌpqêOœ8‘`”ƒª««C"„ººú‘#GÞü|‡A§§K—.èû;UºL™2…xe‹%##ÓâF'„PJJŠ¡¡!‘ÍY‡&x6eÊ‚‡,c8ú$:,F@âHo sçÎâGfffÚÙÙµXÍfÏž=ûêÕ«Dî¹sçNâÃ97nlhh@”þ£à?@*@ €Ä‘Ò@‡Íf/[¶ŒxÞõüüüQ£FµXíãÇrrrK—.m±æ—/_,úÄ?Žððð§OŸŠ›ž“J¥"„ºví*V+@‚©+$N·nÝBµµµÝñÔ××?žxàîîÎf³[¬Ö¯_¿÷ïß·X­°°ÐÖÖöíÛ·Gh&Mšddd$Öp‚@)#:HUUU„Ðׯ_;º#âQVV&¾ßª¾¾¾¾¾¾ÅõÅL&sÖ¬YDRV½|ùÒÛÛ›`àRUUÕ£G!C†êëwl6ÿQð  Ð@âHi “••%:õ7·ÄÄDOOO—þøã‹/ⱓcÇŽ=}ú”HÊ…iÓ¦ýþûïD››;|øð¦¦&‚]åøöí“ÉTVV–““·- £@ €ÄÁSW_¾|é莈'88øÞ½{+ûöMØÆòêêêË—/zzzÖÖÖ®\¹²Å»]»v­ªªŠà£óòòþøãV+x2ÿuÒÖè qºwpŽ©©©±±1ÁÊsçÎv gËZ½zuÌåÚ\ IDATxxøåË—ssskkkçÎ;lØ0õ¿~ýºqãÆ‡|ôŒ3ÖäCOüב(cÆŒ)//OLLÔÑÑéè¾ q`D‰ƒ_¥555Ýñ,X°€à±úŸ>}1É¥¥¥õáÃUUU//¯äää/^ôë×oΜ9†††·t577oÚ´IKK«ÅçÖ××Ï™3‡È hÚ1Йýû÷—““ åß ~æÌ™ººº%K–yîþýûÕÕÕ‰œ°,P;:>>>^^^øàÁk×®oXYYY[[Ëè@Æ D€@‰Ó­[7™ÚÚZ‹ÕÑ}!*//oïÞ½+÷ìÙSÄüO súôé7FGG:”§fmmíŸþyç΂ÏݰaÃŽ;VæW]]¾‡¡m4{öìéÓ§Óh4[[ÛÄÄDÎè]XX˜žžÞQïçç‡G}JJJBöööË—/G?^OOoРAÇŽãÜóàÁƒ#FŒ022š7o^^^§<99ÙÕÕÕÐÐÐÊÊjݺu¥¥¥¸|„ zzzÞÞÞfffƒž3gNnnnÛ4$ :H2™Ü­[·ææf)ÔQRRrss#Xyúôé"/ôíÛ¿×Bû÷ïß¿ÿíÛ·õõõùkÊËËS(kkk"}þü¹‚‚‚ššÁNòÃNÏž=[}nAAAJJJ2227nÜÀ…–––ܧE»¸¸pgÕðòòÂ_çÏŸïãããããÃè4..nذasçÎ-**òööÆQr||ü’%Kššš<<<&Mš”””4þ|œš·MNN?~¼»»{YY™———ÅÖ‹‘Djjj555ÕÕÕíõZýÑ ˆÔÌËË«­­µ±±VÇW[[»ÿþÈÈȘ˜ þjl6[II)==HìqèС”””VÏ[!„ÊËËBaaaIIIìïš››¹?ÐéôúúúoE¥RoÞ¼igg׳gÏÑ£G‡‡‡{yy!„tuu§M›‹«Mœ8‘ÅbÅÇÇ㯮®®ªªªñññÞÞÞük’§NŠ266þí·ß*++ûô騪ªŠ3­ª©©3æÎ;ááá‹-5jTPPÐ… FŒ255]»vmyy9‘ÕNHtD={öÌÏÏÿüù3Áè¡Ã…††Ž7NSS³ÅšL&SD ƒÒÔÔœ;wneeåíÛ·…Å1ׯ_ÏÌÌ$8_&''wôèѶD9ñññ¡¡¡¡?rϬñ#’¦4""¢¡¡!:::::—dffZXX´º{!üAII !„ *..f2™gΜá®ÉÝmmmüB¡ „`Dt>è ‰ð@ÎçÏŸ;º#D9rÄÔÔ”H 3bĈ‡©úõëG¥R£££E$[8~ü8•J%èL›6H5† 6xðàçÏŸï߿߂ôŒŒ ÷‡’’’uëÖ‰¾›ÍÖÑѱ··Ç%aaa×®]ãt8[ÃètºÀ;ì¶¶¶¶ŒŒLTT‘Cè” Ð@©««#„>}úÔÑ!ÊÓÓSWW—HÍ·555nÞ¼1ãççGäåýöíÛ_~ùåñãÇDú&ƒÁxûö­±±1ÎD1jÔ(###a•åääZÌ*züøñââb+++{{{>>©©©¡ààà»wï&%%áßpTTBhúôé'NœèÖ­[xxxXXXyy¹­­­­­-B(-- !tåÊ•»wï–••%$$ „ÂÃÃÛøÓ i`DI„ÿá^YYÙÑ!$;;»ªªjÒ¤I-ÖŒˆˆ1‚©©©‰T(,,ôððxúôi¿~ýZ|â±cǺtéÒb5aX,–¦¦æŽ; Æ—/_äääÚ¾½<11‘û+^úÃmÁ‚ ,Öï·qÃeË–qµ··çÌ‘‰h•““#²×H+tDÒè<|ø°¢¢‚H ³dÉ’è´xŸôôtYYYü+N§?|ø{·¶¸ tuuwïÞ*--e³Ù={ölqf Q Ð@IW ceeEpy¬©©©è ÁÁÁ&&&¢«9;;kjj¶8S¶k×®êêêV:¥¥¥ŽŽŽ±±±DUTT „ntH2ø§ ’¿PñÁ-’oøðáø,Ñ®^½ŠŽÃf³:ÔÜÜ,¢Î•+W ÆŽÛâã °gÏž« S^^þ믿â(}ÿ[@ €Ô@I¤®®.++ûùóg|Š„ûõ×_‰ôóÖ­[¢+477/[¶ÌÌÌLX…¦¦¦7&%%µø,&“¹xñb»ÓEkll´´´ä,…¹uëÖöíÛBuuu­»! £@ €$"“ɽzõjnn–üÙ«ªªªèèh99¹k=zTDæ„™LöööQÅbÉÈÈÌŸ?_ôƒ¢¢¢pN¨Ö¹rå >§˜ãÅ‹8Ýz[ŽttP}úôA•••utGZ ++»eË"5ÕÕÕq¾n¾}ûfllÌs2/ÎÊÄ!//_XXØâÑÃçÎã‰Tˆc³ÙgÏžÅã7œp³-K›$Tß¾}Bœ\Ó«{÷î‹/n±Ú®]»®]»&¢Bll¬©©)™Læ.ܼyó¼yó=z„Â[¨de[ÞB%:Å„$éÑ£GzzzÜ…œ8iÒ$”´:ÁÁÁœãìDHJJ-ÒÕÕõðáÃ<…ŠŠŠ eÙ²eãÆó÷÷½N!”ŸŸŸššJ$âÇd2gÍš•››Ë‰3¢ /:è ¡p¶EÑù#%AtttUUU‹Õ¬­­…]ýúõkss3ÿž&%%%++«’’’}ûöéè蔕•>|¸¦¦FØ}Ö¯_ŸM¼óÜðIÁø$b8Ð!‘H8úH8G …JJJ:º#-ðõõ544]‡J¥ŠÞuêÔ©úúú€€žr•oß¾‘H$|¼ï«W¯:dnn>{öìýû÷óŸÝçèèØêÕ9£F²²²â™;C577ãH®gÏž -Þ‡F£álS@2egg·nÌH)øc ¡p #ù#:DŽ´Ù´iÓðáÃ=<<„U R©÷R)++sÿ† baa3cÆ ž(§¡¡B¡ˆÞ´%LAAÁ©S§:$//ϵºº/‘&2o¥¢¢bccsïÞ½Vtü4£Fêè.€Ÿ$NäôáÇŽîˆ(±±±¾¾¾¢«åääøûû‹¨ ìd?eeeÎÆ«¦¦&__ßÇÇÇÇëèèpWËËË›2eÊüùóqºq¹¸¸lÚ´IØUÎJd"©µz÷î}åÊ•Vôðƒ@ €„RSSSQQùúõkmmm·nÝ:º;‚åääüûï¿-V»ÿ¾ˆQQQQ¶¶¶ÊÊÊü—”••i4BèóçϳfÍRVVŽçߣ~üøqEEEѱ”‰‰‰"¶¬‹è$ ,F@rá7ëû÷ï;º#BYZZ®\¹Rt¢¢"™°êêêÖ¬YÓØØ(𪒒•J}ùò¥µµµ……EPPÀ“xŽ?ž““Óâù:üþùçŸ>ˆnÈÙrÕ¿qïèpè ¹ð›U’--­O¬ùý÷ßïܹ#ì*FóññQSSxUYY9++kĈ›7oÞºu+ÿ°‹ÅZ¹råƒZ±¼ôùóçä^—ÓÔÔ”œœœ——÷åËN!gD¤L] ¹ð›µ¨¨¨£;"ÔÊ•+·lÙ¢©©)¢Naaá¸qã„]ÕÔÔܸq£°«²²²_¿~½y󦕕•À ýõWDD„ˆeÎ"˜šš^¿~{O»œœÜ–-[rrrB E]]]]]½ºº_ÍÈÈhhhèÝ»wïÞ½ÕÕÕ[LŸ0¢€äÂïà7nttGc³ÙQQQ]ºt]-##CUUUà¥ÂÂÂàà`muuuß¾}+,ÊAY[[ÿóÏ?Dr§skjj:qâ™L2dÏ¥ àt:ýãÇ™™™ÅÅŸdÏž=¶¶¶¦¦¦ÎÎÎb=Ð!`DÉ…7eggߺuK_«ÍÍÍ'Ož‘¾ !ôäÉ###a‹©¯^½*luB(??¿ººzøðáÂ*|øðÁÌÌLàžpÑV¯^-,ݺ««ëÖ­[ Æ›7odee+¸”——WTTäääËÊÊîÚµKÜç~>t\œÕ9+V¬4hÐàÁƒ;¶?<ÈdòŒ3D×Ù´iÓÞ½{…+žžž"Ö)>|X___XÛÜÜÜ &ìܹ³':99ÙÚÚ ¼Ô½{w''§ˆˆˆ­[·0€û*‹Å1bDqq±···©©©¸Ïü|0u€äÊÊÊBYXXÐh4¯_¿vtþŸk×®…††Š¨ÐÜÜÜ£GOÚÚÚ"ölOš4iùò实9sfРADò‰r{ùò%Nwrr1„g¯.\¸ÀŸZëÔ©SéééZZZ"ÎÝHÑ@BUUUååå)++'&&N˜0áùóçK—. q ÍO–––&zIFFFÄ#Ÿ Œ=ZXWWW7?rä‹ÅâÏØ §OŸÜÜÜÎ;'zMϘ1ctttŠ‹‹“’’&OžÌ)/--ݲe BhÿþýOýAÑh´„„â]eäÈ‘ü¹Õ@§êÑ£Gl6{̘1ªªª‘‘‘–––wïÞݽ{7~×JÑ›ºCCC'L˜Ð»woþKt:=..nïÞ½VWW;6''G`TÇd2§M›öÛo¿?^Ü>¯]»¶Å•Ë222îîî»wïþ矸U«VQ©Ô©S§:88k[YY¹jÕª &ˆÛ1ð3ýûï¿Gµ··ï莀Ÿ$ÔÇB'NDéèè„……M™2åðáÃC‡•…É¢s?±Ùì?ÿüSØ); åÅ‹Â)‡……ÙÙÙ »:zôhFFF‹™Dy”••õéÓç—_~!Ryþüùûöí‹ŠŠª©©éÑ£BèÖ­[7nÜPQQÙ·oŸè¶êêêGŽ«oà'k]N4 ¥$e ÀãÑ£G!ÎØÀĉ÷ïßÏf³W¬XñæÍ›íBQ©ÔE‹‰¨À`0¦Nʳ˜—£´´TD^‹+Vlß¾]ØU‡˜˜EÂ\¿~ÝÖÖVÄÂg}ûö0aBcccPPBèÛ·o~~~¡-[¶ôéÓ‡øs$ÑÇ‹ŠŠºwïnnnÎ)ô÷÷www—…Éùùù¢ŽR(”ýû÷ k;qâDþ¥¾Xff&‹Å⽓˜˜XQQÁ¹úøñcmmmKKK±zûêÕ«èèh‰D¼ ^’|þüy„жmÛÞ¿onnÞŠ^€Ž’(99!4nÜ8žÅ¶ÿý·¹¹yAAÁÒ¥K… ?Ç!CŽ;&¢ÂÎ;ËÊÊ^***òôô83Å`0.\˜››Ë)III:tè–-[¾~ýúìÙ³3f¼xñ‚x?ëëëBÛ¶mÓÓÓ#Þ !dooß³gÏ/^œ;wîèÑ£d2900P¬µÏI’Ï[á:Ü###{öì‰&wD×þGAAÁØØXØU:~öìYag ÚÙÙ Ûž]UUeggÇ}g*•ºaÃacc³cÇŽ)S¦ˆØ¨Å£¹¹yñâÅaaaës“——Ÿ3gBÈÇLJÉdz{{:´÷t,tDxD‡;Ð)** õ÷÷Ÿ?~]]Bèðá÷nÝꨮ\¹òéӧ®677ïÚµ«k×®ü—²³³ …5ìÛ·o`` w F4hÐÙ³gãããeddÞ¿—iQ\\Ìd2gÍšE°><{ÕÜܬ¦¦ç ¥`×çÝ»wååå]»v-))‰ŒŒLKKKMM外D‘H¤AƒYZZvàìUFF†¯¯¯°«ŠŠŠœ¤Q<ÇŽ;pà@þK ²²²<ãXuuu8`:tèýû÷###ýõ×Áƒ¼ ·FDD´üÃ1xð`yyyƒ±iÓ&Ñ™. $ΡR©<ç|¸ººZZZš›› K“ùÓÄÆÆ °Á,XpðàA£ ÝÜܶڻwïºuëx ©T*÷ƒ¦NúúõkNaa¡››[ZZZ[ÎW¬­­e0d2YÜó—’$žšQPP055µ°°èիןþ‰200à: >]F ªªªÇ«©© ¼úÛo¿ kèããÃ_]]'ª{öìÙ¢E‹´µµÓÒÒDo/ß¿ÿŠ+ÚxŠôëׯB†††bm×êcÆŒ)//OLLÔÑÑéè¾ Y`gòäÉ÷ïß/))‰ß½{÷Š+ðfŸÌÌÌŽîÚÿÄÇÇ‹X³¢ªªzåʇ&¯\¹’{Ž[cc£››HGt Æ–-[üüü‚ƒƒ[þ|ذaïöõë×wïÞ 6,++ëÑ£G³gÏÝ·³gÏ>|øB¡ˆ®FDNNBHÄæ²¶ðñññòòÂK®]»F¼aeeemm-O I'¤ç]+!ƒ:+W®\³fÀKl6ÛÌÌìÛ·oü—úõëwúôiRzzº°Òh´yóæ­Y³&((H]]]tǾ|ùrðàÁ)ôòåK„‰‰I»ÜÇìÙ³§OŸN£ÑlmmkjjpyXX˜žžÞû÷ïB~~~xÔ§¤¤!doo3º?^OOoРAܧè ºu릣£óþý{îyŠŽÒ«W¯¬¬,— ôîÝ;þµÀ§Nb0üMX,Ö–-[ºwïÎiذaýõ‘.UTTøùùõíÛ·÷ãŒZÆ ³°° P(òòò  …óY^^žÂVVVnذ¡Å›³Ùìàà`ÎQIaaa×®]ãt8¹ÖétºÀ;ˆõãdffúúúš››655¥¤¤ð' S‚@é0tèÐ÷ïßgee <¸c{ÒÜÜ,ì˜àÜÜ\SSSþ(çÝ»wºººwBikk \ëçç·uëV"£#gϞݷoßÛ·oÛ+ãfEEEdd$æfÏž=vìXâm ˆÞsüøñââb+++{{ûÛ·o«©©ÅÄĘ™™Í›7OSS}£zûö-Nµ‘çªðÖúM›6–——§¥¥9;;ã`èÂ… ,`±X·oßFݼyÓÏÏ!T\\¼téÒ††==½cÇŽ}üø1&&æÉ“'Dæv°é€g¯ž={ÖÑA[¶l¹té’ÀKæææÓoyyyá4¥<Ž;–˜˜È_—žž.p#:/_¾ìÞ½{Íš5íå4559’B¡äääH$33³v¹-<]•žžþÏ?ÿ „‚‚‚ Î;‡266Þ¶m[NNÎÅ‹_¼x¡¯¯¸6Ü™šš®_¿>??ÿòåËùùù3gÎôññIMMEß½{7)) ¯é‰ŠŠÂMÞ¼yƒ·£‡„„œ9s&&&!$p€ €ÎFt8Б„ÅÈEEEãÇx)##ÃÒÒ’§°±±‘D"ñŸ¬ÓÔÔtìØ1Î2[n“&Mêß¿¿œœœèžÐéô.]º”——óO6!„ØlöÕ«WùË555æv¨­­Å‚xØØØ<"™Û‡ÆŽ;tèж§ÛüöíÛ„ BBB¸ kjj ‡ ÒÆû::H +++ô}°¡£ØÙÙ]¸p¿üåË—üåæææñ[¾|9ÏÈPcc£ÿ $6›½lÙ2Æù:sæL%%%yyùVþ \”””ÜÝÝ:Ä]˜žžÎf³ÍÍÍ[\ |è 5ôõõUUUKKKq~ÇQQQ!ðP>ƒÁ¿K(88Xà¼Õ† êëëy ÏŸ?¯¥¥Å¾Þ¼ysâĉ8K%F344äœ&Üj/^¼Ø½{7‰DZ¶lÏO„Ï­ÁãgiRƒD"á\ŒøMÜ!æÌ™#ðXd þT ýõÿñ6?NLLTPPà)_¶lÙÁƒù•åèè¸eË–©S§nÞ¼9%%åÊ•+Ï$ŽN§»ºº Kl‰'!í%:H“#F „ðépâǃ â)d0—/_毼fÍšQ£Fñêëë:tˆg·ùåË—I$’À5ÈÏŸ?·´´\¸pá½{÷"##ÃÃÃ9)œZ§¦¦†B¡¼xñBà&y:þìÙ3tè Ð@šà@çÉ“'Õââbþtž=ºvíOass³««+Ϭ›ÍVWWçYwòäIaáË‹/ðî§¡C‡¾zõŠN§Ï˜1£²²²g±X¿ÿþûºuëÐ÷´—üž={F§ÓŒŒ~ÐQ€Ÿ NF@š˜™™)**æåå}þü¹gÏž?ùéµµµŠŠŠüÓFêêêK—.å.a0¦¦¦ÏŸ?WTTä.÷òòZ¼x1Ï)ɽzõ:|ø°ÀÅÅÍÍÍ/^¼àÜ×½{÷[·nÍŸ?ܸq—/_¶¶¶«ÿµµµÇŽQ'%%}([‡F£áTS@bµ.PR ¤‰¼¼¼µµõÇSSSòÓCBBŠ‹‹÷íÛÇSnbbbbbÂ]’™™©¯¯ÏåÐh´GñÄÍÍÍ" .((èÕ«'·y~~þ¾}ûÜÝÝuttˆ÷œF£¥¥¥Mš4éÌ™3¢k>~ü!4fÌâ7禢¢bccsïÞ½Ö5Þl IDAT?Ç€pæTð_RfôèÑ>|ôèÑÏtX,–±±1OaEEEBBÂÂ… ¹ GŒÁ?™¥¢¢òâÅ î觸¸ØÉÉ)''GXÆï¬¬,áMR÷ïß÷òòÊÈÈà„>D|ýúÕÆÆfíÚµ“&M]“Á`<}ú”D"µzD§wïÞW®\i][ÀR6Lþ£ <Ë8))éÁƒÜžáâÙWUUU%##£¦¦Æ]xîÜ9oooaQBèùóçòòòNNNYYY+V¬8|ø0ÿ ¡©ªªž>}ZX"RnxÎÏŸü è e,--•••óòò>}úÔöbIOO·´´äY_<|øp}}}î’   ¼¼¼ãÇs?~¼©©iÏž=Ü…;wî±…ŠÉdFFFÊËËûûûŸ?¾[Êoݺ•ššº{÷n"QB(99!$,Ç@Á®+¤ ™L9r$›ÍxßS[[;kÖ,þòòç„òððà)‘••õ÷÷ç|mjjÚ±cBHÄéÃçÎëÞ½{ffæ¢E‹ZåÔ××oß¾ÝÝÝxü+7nœ¸ÏH,t>x|âÁƒ?ó¡ÕÕÕ#GŽäÎyùòå‘#Gxjúúúò+¼uëVîñ§Ã‡‰~¢··wll¬ÀL颱ÙìÒÒR%%¥ÿý—x¾ªºººÌÌL999þ³Ò ¤tîß¿Ïf³ÚCuuuCCCy ïݻdzS7,,¬ªªŠ»CÜÜÜÌ]èââ²k×.aÏzÿþýÅ‹eddTUUÅíg}}ý¼yó8€â?—Y„Ç755YXXtéÒE܇$:HCCC òòò7oÞü´‡¾yó†J¥ò.\¸ÐÇLJó•N§oÞ¼™N§s×¹r劂‚÷Šãºº:}}ý¾}û |“Étvvv _‹Èd²žžžÀl¢%&&"„&L˜Ðºç$,Fî„222Ž=Úѽ-èÓ§ÿ4‘H¤‰'^½z511ÑÐа};&L@@Àܹsyö´÷èу;oCccãòå˵´´¸ë¸»»s'[HHH8tèP||¼°ÉÊÊ™ššŠÛò²²´´4—;wŠÛ!”””„š}¦NÚѽB½yó¦Î„ ÈdòÓ§OétzSyÄ?þ”””Ľ¾¸ªªjçÎÜ£‰l6{Ê”)gΜá>fPD†lÛ¶mìØ±ü¹ÍEc³ÙÊÊÊ÷ïß0`€X 9B“'Oq¨4 ß H>žÅõ S‚@©Ô­[7++«§OŸ&$$ü„#’¿|ùR]]­§§Ç]¸sçκº:Î׫W¯ò¼6Š‹‹9QNEEÅ•+WÖ¯_/ì)¦¦¦AAA½{÷«oGŽ)--=pà@«£ô=б³³kõ°ÊÊÊU«VÁBÉwçÎ3f@ ó_ÒÊÞÞþéÓ§ñññ?!ÐIII¹zõêÕ«W9%x$‰{WÔ’%Kjjj¸[ 0€;ëÓºuë„¥µjjjzõê•™™÷ŠŸ±ÙìÏŸ?'$$œ?žx+~uuuOž>'99Y^^žóõÇܳZ¡¨¨(ËhÊËËW¬Xa`` ìÑçÏŸßµkgRŒJ¥nݺuëÖ­æææ­þqxà›Ãq tVèic`` §§§§§÷þýûŽîNÇ “ÉŽŽŽèûÛúQTT¼rå w “ÉäìÄ.--]¼x1wÚ‡Ó§O;99áÏ÷îÝãiËÑØØhff&âÀÜœœû÷ï¯[·.--móæÍŸ?ÎÌÌäN:ÑFl6ûöíÛ¡Ÿ°s Ð! Ð’.%%eÞ¼yC† 111™={öôéÓñªUSSS[[ÛŽî`›1cB(**êÇ=âÅ‹ùùùÜ%¿ÿþ;N,Š*//_¼x1÷ ›€€<¯Äf³ýýýæ´ºvíš»»»èç^ºtiÑ¢EÖÖÖAAA³gÏ ëÒ¥ ÷ÀRÛ¥¦¦~úô©ÿþ­8‹ à ÑnÞ¼¹víZ ™3g655=|ø°ªªJ[[!¤¥¥õ믿ÆÅÅݽ{·£»Ù‘ÆŽÛ£G¼¼¼ÜÜÜ”÷*$$DGGgРAøkAAŠŠ çX?KKKKKKN嬬,33³®]»"„H$RBBÏÚìĉgΜñP:’ššŠ²³³ ¸Ê§"##Ñ÷`ñç‹‹‹8 õàÁž|a€Vƒ ¹¶oßnaa‘°wïÞÄÄÄ=z´˜ñ 99ÙÕÕÕÐÐÐÊÊjݺu¥¥¥œK©©©‹-²´´400pvv~úô).Ÿ0a‚žžž···™™ÙàÁƒçÌ™“››‹/………á92“‘‘ÁÓ.7nÜøA011±¶¶æ|=sæLXXþüòåËÌÌLÎ¥ºº:WWײ²2„Piiiuu5”ƒ?ÉÉɢòèèhsssÎá%K–,\¸pþüù<›¿Ú‚ÅbEGG#„\\\Úëž­0{öl|P¡››¤ ÝA $׳gϨTêêÕ«q‰’’Òŋ׭['¢U||ü’%Kššš<<<&Mš”””4þüoß¾á«ÏŸ?öìÙСC.\Èf³W¬XÑÔÔ„7nB(99yüøñîîîeee^^^, !diiÉÀÅÅŸÔ‡Z¶lÞà––æäädffÖâ@Å0sæL„Ðõë×ÐýÝÝݹO40`gÆðÌ™3Ož<á\úðáÃÌ™3ûôéƒÚ°aÃÅ‹ynÕÜÜÿMèÉ…ó(á·&‡‘‘‘À©ŽÀÀ@UUÕÑ£GËËË«©©3¦´´4<<_]±bÅ7¬­­)Š‘‘•J­ªªB5 !táÂ…#GŽüñÇëׯ¯¬¬,//GéêêN›6sÿ‰'rf:œ§OŸŽò÷÷ß¿ÿ¹sçìííÏž=KðM\\\üáÇ’’’²²²ŠŠŠOŸ>UUUUWWùòåëׯuuuß¾}khh Óé ƒÅb +5j”††Fqqñ³gψ}ºuëÖ­[7¼ÚØØàÿþG9r¤–––ˆðZt”À¬Ñ’ §°¦R©bµ*..f2™<Ã*?~Ä¢££ûí7î@„ûH:¼ú!„gLjpF8¦L™W]]ÍÖ[˜Öí‘&“É222222$Iæ;¼ééÚµkírR0··oßîÝ»—³‹êÉ“'jjjœ áÜÙ+oÞ¼‰Wõ²Ùl‰tüøqþ»YYYEDDpàfÛ¶mrrrß¾};vìØ±c7lØÀ_¢íñVµÙ³g·ãmÅbjjÊ=ñ‡2d>çzÅŠ±±±eeex8³¦¦FQQqïÞ½ªªªÎÎÎ qqqþþþø¸j__ß³gÏ.]º”å#„p”çÎðððE‹uÀ€d€@H.sssEEÅS§N?~œójܶm[÷îÝ׬Y#¬•¶¶¶ŒŒLTTg‹۞={|ðàÁþýû_»vmÛ¶mÄûÃPáÞJ=}ú¯&IKK£P(S&õïß¿ùÿc³ÙÍ‚°Ùl‹Åù ,»qãF@@瘾v¡¬¬Ì9à!tæÌèøøølÚ´IGG!Äb±vìØ÷;|øpß¾}çÎË}Ÿâââµk×FDD´Ø½OŸ>ýûï¿K—.uuu500øAù¥cccëêê´´´âãã™ß±X,ÎçæææV|®¯¯¯¯¯o—®\¹Ò××7&&ÆÔÔ4>>~áÂ…<OùÃkÑQ>ÿMèÉ¥ªªºmÛ¶7ÚÚÚŽ=ZAA!333;;Ï•„„„”””"„Î;§ªªjddäèèèëë»víZ‡qãÆÉÊÊäää,[¶léÒ¥!yyùºººððð²²²äädÜvøðáøóùóçÝÝÝ555ñN®¸¸8|d ž,Û³gO¿~ýÞ¾}‹—0gggs¶Æ¼|ù’J¥ÆÇÇ{zzrŸž'ÂóçÏ[ñkÁTdgg—ŸŸŸ””ÄYBÔ.ðrÎW'''<ŠóáǤ¤¤cÇŽár6›½zõj›¦¦¦Ó§O'%%ñÜgæÌ™-žeÌf³©Tªººz~~>Áßa«…„„ „JJJ6oÞܾwîÕ«W»ÜgÊ”)ºººÇ·°° “Éø?`nüáµè(€ÿ&t€DsuuÕÔÔ<{öìÍ›7 †–––ÏÊ•+Bÿý÷‡p5üÒ²²²rttœ>}:…B9}útxx¸ŒŒLß¾}mmm9ÿö=räÈæÍ›/^¼H¡Púõë———”žžŽó\¹rE]]}òäÉ8ùQxx8tŒ·mÛö×_%%%)++ëëëçææfffâÃúBÎÎÎwïÞe±X‹/þý÷ßèï„L& Lðäáá±mÛ¶àààö tBCCÇŒÃ9 ‡“ßJKKëêÕ«xŽÍfËÊÊ.\¸!$''÷òåKþqwîܽ¸ª®®ÎÓÓÓÂÂbóæÍ?:ÊùøñãÝ»wedd.\¨¤¤$û™Læ|–‘‘iÅçòòòõë×ïÉׯ_ƒ‚‚ðÁÖgÏž544œ7o¾D"‘V¬X±víÚ‚‚wwwþÉPþðZt”À:@Ò5 ¯æÁ?fÀaooWkò6lXlll‹ÍÉÉá)Y°`Á‚ „Õ_½zõZ¼íåææûåË—v|/HG999¶ï#edÄØä‘››{âÄ ¼¼úêÕ«ýû÷ç:¡©S§8pàóçσæ¯EGùü7Á®+ZïÎ;ø –¿ÿþ[DfÊŸ£wïÞ“&Mb2™¡¡¡íx[OOOÎQçÏŸ¯­­E=yò„û½°°°3fÐét???<™È‘““³k×.Ñ#4%%%)))jjjûöí+J—¿¿NN•JÅY)DD®?ÍðáÃsssß}wïÞ=î«åååUUU...<{±Õ«Wgdd<þ|óæÍœElöööQQQ¯_¿~ùòe||üÞ½{û÷ïÿ~$:´^```\\B($$¤u nÚ~s_ºt©ï¹téR΂_~ùe̘1¡{÷îq™={ÖÅÅ…D"ùøøðy7dÈëׯ‹8ç·¸¸x̘14­ûÌF£:th÷îÝ¡#GŽ¿ÿ¾  @CCcÒ¤I?è¡mwíÚµà‚d2™{ù¹D…×H>˜º õxþýÝáìíí{õê•———šš:bĈ¶ß0''§¼¼œs^"g'ö¶mÛ þéìì\__ßµkWîµ L&óÔ©S«V­211ñèèèqdN§P(•••/_¾ÄÛëð†/|ŒáÂ… èèQ9s†“ª6>>~Æ ***øk```qq1B($$ÄÐÐPDîw‚:2™ìé鉺páB»ÜðÑ£G÷ïßÇŸ÷ïßÿï¿ÿ"„^¿~M§ÓñlT^^Þ† ˜L¦¯¯ïÕ«W¹Û®_¿>##CØ!‡l6{Ïž=G%‘H?"ÊÙ¾}»¾¾~CCƒ®®î… 8Ó7Ÿ?¾uë‰D’„y+9óYéééœ(!tïÞ=\þöí[ž=ü~èЩxzz’H¤›7oâŸÛÈÊÊ 'ÒB………á×ío¿ýÆÊb0[¶la±X………eÊÈš À:t*ZZZt:¯·m#++«‘#GâÏ[·n522™(8;ØMLL,X ¬¬üøñcΖòÜÜ\:ngg'0ý*ƒÁøôé“®®nlll{9ƒÅÆÆêêêâ­Úžžžü[ÏX,ÖùóçB^^^íø\€$ƒ@€Î/”9þ<“Élã­Ö­[Ç9gõ"“ÉwîÜÁ{|öîÝ›••uñâEî%±ÕÕÕnnnœ´ð<***ÆŽj¯#ß¿ïæææèèhaaQ\\,b7u\\܇tuu¹3W:7tèlÆg``PZZzëÖ­¶ÜçË—/ׯ_Ç£2^^^iiil6{Æ xÙMMMÍÙ³gÉdr@@ÎJ†±Ùl???œ žŸ²²²««ëòåËÛÒ1ŽÏŸ?×××Ož<¹²²òôéÓêêêÇ8NŸ>Zºt©$/C´/ø_; ‰D¹Ož<Ù–ûÈÈÈlß¾!Äb±îÝ»7pàÀäääÔÔT<Ó½{÷   !C†œ?§»B•––öìÙSà9¼Ïž=KHHèҥ˺uëÚÒ+ìõë×£F266...ÎÍÍ}ðàA‹)?³³³?~ܵkWww÷¶w -`{y甕•%"í%èpuuu?ôþnnn;wîÌÌÌLKK³±±iÝMTUUqÖk2™œ––Ö«W¯~ýúýñÇ¡ÆÆFyyùÞ½{“H$ÎàÍ­[·Ö¯_ÿúõkþñ¼?(((ˆà£Et»¼¼¼   ##cìØ±7oÞTSS#xÏ'N „<<<¸w0:=t:!KKË?ÿü³£{Z ªªúãn®¨¨øË/¿8pàØ±cÁÁÁ­»Ippð Aƒ¬­­ FïÞ½B 0`Bèüùó¯^½ú÷ßO:ÅIñêÕ«¨¨(þ(‡Åbéëë'%%ÜètëÖ-ooïçÏŸkhhp—¿ÿþ—_~ÉÎÎ>uꔸq|IIIdd¤œœ\{Íš¤:––lK—.=~üxlll~~>'‡ƒXnß¾íáárvvÞ»wïÛ·oÉd²««+BèéÓ§œtW ŠŠŠ6lใÁðóó311ñõõ%øßä»wïüýý§L™râĉ;wâÂ3gÎddd:tÈÙÙ966¶)?Oœ8Ád2çÌ™óþ§A£Ñnß¾ý£ŸÚHØ O ó@€Î©W¯^çÎ;tè^„+.___}}}:þæÍ##£7rÆQ._¾ŒÂ'&³ÙlŸI“&á³ ¹½ÿžN§ßË]__ïéé¹wï^SSÓ_ýUUUÕ¢¼¼|ûöí ­›­®®¾té‰DZ½zu+š‹EEEÅÆÆFÒŽÌüœœœÚkßpèÐi­ZµêÒ¥Kׯ_ß¼y³¶¶¶¸Í9Iã ÉdòÉ“'Èf³>þ¼jÕ*===„PII •Jåι¢R©_¿~4hη@К5klllp`4cÆ ‹€€€ .˜››‹Ûyn'Nœhlltpp022jË}ˆèÝ»w»œ`h/°ë €NK[[{Μ9,kÿþýâ¶-**:räBèíÛ·222ººº$éöíÛ =‘›ÍÖÖÖŽŠŠâžN*((°´´ÌÉÉë‰gÏžÍÏÏçìÛ¼y3BhÚ´imŒrjkkÏœ9ƒZ¿~}[îRèЙýú믲²²!!!%%%b5|ùòezz:BÈÍÍ-77×ÒÒç”0008pà>_çãÇÖÖÖüÇjiivìXÏž=ÿ½3‡ªûãø™ÍÌDDE’)TÒFÒ¦TZdk£íEE¥¢¢E”PÒ&¢E¥´z’½ð´%D…’²•Ý0ûÜßçÕ¼ü¬c›Ð}ÿÑëνçžsnfîýÜóÝøuÑ÷ïßïççÇ`0:4óÆ”——_¸pƒÁìß¿¿Ó   ôiP¡ƒ‚ÒÏqtt¹sçN^^žàg :T[[[RR299YMMíñãÇ##£µkת™//¯ÆÑÚ>|pwwïh)ò°°°I“&1Œ­[·*(( 4H\\ƒÁàñøÉ“'ÿüù:>wŽS§NÁž“&Mêt'(((}Tè  ôs†neeÅãñ>,øY¶¶¶?~üˆ‹‹+///++Ãb±EEE_¾|Ù¿ÿðáï]»Ç÷ËáñxL&sìØ± 0ÑN»0™Ì·oßÄÄÄ233¿|ù’——WXXXTTTVVVUUUVVöíÛ·ïß¿Ã÷Nðýû÷€€,{àÀÎõ€‚‚Ò@… JÿÇÑÑ‘B¡DFFB·›vAäÑ£Gd2yãÆ·o߆ r†š˜˜¸yóæÚÚÚ£G*++ÃÆÕÕÕFFF0ÔHBBBþsss•””àdæÎ;dÈæmp8‘H¤P(¢¢¢^fŽ=Êår—/_>vìØÎõ€‚‚Ò@ÃËQPú?²²²Û¶móòòrrrzüøq»éC9wî—ËÕ××—““[»vmaa¡……Ž{÷ÉÉÉ222°qEEÅØ±cׯ_ßî4jjj¼¼¼\]]UTTRRRø²z‚ÜÜ\è1-üå-}(½SSS4•Îß*tú!¥¥¥Û¶mûÓ³@iŸû÷ï í> sê¼yóæÁƒ0»q`±Xccc@@@ÜchhÈ`0 ´k×.www¨r222äåå©Tª§§§ sX°`ÁìÙ³étº˜˜XªÀ®]»x<žµµu'u‘²²²íÛ·Ï™3GÈã¢tˆÈÈHTèü  B§R__ÿþý{~ú|”Þ‰µµ5‚ B»ÏR(”ƒÚÚÚîÛ·oñâÅmÛƒîß¿Ïd2i4šˆˆˆ®®®²²2Ç{øð¡»»{QQtÍy÷îÝÒ¥Koܸ!++ÛFWEEE'Nœ˜>> eÆŒ—.]zðà‰DZ»v­¬¬,+jjjaaamÄXÕ××S(”÷ïß4ÈÈÈ •Ãf³a‰u´P9 J÷‚ HCC…Bét:ÇíÍkc¨ÐAAù[À`0gÏž?þÙ³gÿùçŸ6*}îܹ³¼¼œÍf‹‰‰åçç>|xòäÉ’’’#FŒ@ÄÙÙyöìÙóçÏoMå444ØÙÙ½|ù277wÁ‚ ,è±kjWW×âââqãÆYXXs\”~,ßûþýûÌÌÌŠŠ ‡£££3}út Ãf³áOϱШ+”¿ˆI“&ÁPóíÛ··Q½yèСŽŽŽ[·n}þü¹¶¶ö† ÒÒÒoß¾ÕÔÔlñÄ_¿~Ñh4QQQ ÌÌÌžºŒÖùòåËÅ‹q8Ü’¬ÙP IDATÙ³g{ó+& JŸ£¡¡D">|XGGÇÚÚÚÉÉéСCóçϧP( .LHHÀãñ‚Ðéô?=Ó¦ BåïÂÅÅeРA)))ÁÁÁÍ––––––N›6móæÍS§Nmhhؾ}û©S§öíÛ7wî\.—;iÒ¤GIII5?×ÏÏOKK«°°°cÇ"‘Øãóÿ ²yóf6›½qãÆ &yt”~ —˵¶¶vuumòŽ„ HllìÂ… ÕÕÕ{á *tPPþ.$%%a”ƒƒCII BBÂáÇ-Z¤¥¥õåË—ÈÈH*•ª¡¡‘žž®¤¤¤­­­¯¯ŸÀáp;|þüyHH`Ñ¢EùùùB¨Þ¾¾¾C† éPjD”vÁb±±±±m´ÉÎζ¶¶î…åVP¡ƒ‚ò×ajjª««Ëd2°²³³Ïž=[PP@£ÑØlvCCC|||mmíŽ;ª««ñx¼]ó V¹¹¹vvv()) ÇݸEŠŠŠŽ;8wî¿2( J·€Á`^¿~Ývssóׯ_ûøøðËÕõºá®ÔÐÐÀßF„F£õ¶‹DAAiB@@ÀÀãââ®]»÷4iÃd2ÙlvUUUbb¢¼¼üêÕ«ù‡âããõõõkjjÔÔÔ222„ìnÜA¬¬¬ †……ÅܹsÿìdPPú%uuumõöö QSSãñxüâ0Íihhàt.—Ëår;1ó®F]!B ®_¿^\\üëׯQ£FMš4iâĉàwpiûGAAé dee}}}W­Zåèè8sæL*•:bÄUUÕ?6iÉáp‚‚‚-Z„Ãᩯ¯‹ß¹s',øÐÅU‹ÕÆmQ@Ž=š‘‘¡  àááÑÅ®PPPZ¤ ¡#%%eooæçç×b‡ƒÇã¿}û–œœÜÑ¡‰DâòåË;íö×%¡ƒ HVV–žž^eeeãý X¿~ýÎ;) ƒÁ MŒú(((œ… š™™Ý¹sgõêÕ D"ÑÄĤÅÇñññ“'O^½zõÎ;­­­ÝÝÝ»>‹uíÚµ«W¯&%%u¥Ÿ/^øøøàp¸ÀÀ@4q Jц—ñ AƒñññŠŠŠ¹¹¹jjjM 0 %%ÕÑ`,+))I$?þÜFRŒ¶zèÄ96›ýåË—¹sç6Q9€ššeeååË—§§§£*¥×2oÞ¼‘¿™:uj/ ŒìQNž<©¬¬œíìì 044l±™¸¸¸™™™„„D@@€µµu×Çår¹!!!S¦Lyÿþ}QQQWºúõë—¥¥%‚ {öì™:uj×熂‚Ò"C‡mí¸¸8@NNnïÞ½_¾|iî¾"//Ïårkkky<¦ƒˆˆˆÉä   'Ntnæ_Ñ!7n¬¨¨h­—Ë}ðàA|||zzºœœ\§K£ ôëÖ­{ñâE\\œ™™•J%‘HzFBELLìúõësçν|ùòôéÓMMMEEE{ÝA ãªªªªªjGD$""âØ±crrr7oÞœ0aƒ:݇ÃY³fMmmí”)SÛmÏû ‚ ‚À þ¿?6ÙÃßàwÒ¼ÿÐ?˜Lf§/ ¥Âårååå›ìTTT|üøqee¥‚‚`ÆŒïß¿çr¹-£/^¼XUUÕ‰¡ÅÅÅœœ^½zÕ‰s!:°FOFFFmTTT,--I$¼   ô6,,,deeãââ¶lÙ«áñx—/_¾yófII‰ŠŠŠ¾¾><qáÂ…üü|%%¥””…§OŸvhtA¾~ý ßZ°X,ÿ ¦ñ6 µCü€O„±cÇzzzîܹӯÆFUU•B¡4:rrr-&Îé( GÅ`0gΜË×, &TmÇb±p8\kéV<˜œœL¡P>}úD¥R›«–&j¦ë— Ý}¶zõꤤ¤/_¾tKo((†Á`4/Ä{ÿþý#F°Ùlfkkëëë 066†%› ¨¨(ÈÛHsRSS;qVc:)tØl6§Ñh­5PRRJLL”––®¬¬üþý{kvµÄÄÄ3ftn:ŽÁ`þ¶·p¡áâârëÖ­3fÌŸ?ÿõë×[·n=~üøŠ+ÂÂÂvïÞM¥R­¬¬>|ø’’h·$xsØlö¤I“z`âü¿=  WºÖÐ××6l™L®««C…JOPTT²qãÆ}ûö¸\î† ¼½½—.]êëë;zôèÀÚÝ»w‡……™˜˜tbX=ª±Å¤É6 µC*Zì¤C3¡R©yyy-jhhàr¹üå%qqqxÃãñÆ ƒ±W"""ãÆƒÛ$iæÌ™Ð/XTTÔÐÐL&C×½cÇŽáñx###¨ 0 ‡Û¾}û¬Y³äääžžžkÖ¬ý8::ÂP ™{÷îÁmYYYOOÏuëÖüýýõõõY,Vc™ÒXÍ4Þ߉?P'ÈËË[±b… -íììbbb?~lffÿ» âããù 6mÚÔS³DAé07UHHHFFFZZ‚ ׯ_/))i—€Á`TTTÚÐÅÅÅ-ŠûÖàp8ž3ŸÎûèàñm+##Ãår ž?>}út•ÆGy<^]]ÝÀkjj`Yã!"""%%U___UUÕö4PP:JVVÖºuëž>}úéÓ'A–.] ÷ãp8##£ÄÄÄŠŠŠÂÂÂuëÖñíÐzzzaaaKDD$==½Û¦þÿ4‘DÍåQ“ cÆŒÕÕÕ***šššqqq?þä÷ÆÏv ×r඘˜Ø–-[à6…BÊ **ºjÕ*¸M&“MMMáöŠ+¢¢¢ÜÜÜœ÷ïßonnŽÇã ‚¬¬,ÿ>0`À¸M F ·ñx¼²²2Üþüù³ —Ëݾ};ÿÔ122"“É?655ݾ}û“'O²³³ããã‰DbTT”½½=ÌòôéS¾]uÞ¼y$éîÝ» fåÊ•t:]YYùñãÇwîÜ9tè—Ë… BvvvÑÑÑðtkkk˜8`Ú´iiiid2ÙÒÒrÇŽB(}‹õýûwh–Â`0l6{ñâÅüÈÔ©S…_û¥]:iH&‘Hd2F‹µÈ€¸\®——ך5kšgÓa±Xeeeååå´ŽƒÇãÙlöàÁƒ›|¡ t‘âââšššªª*EEEÿõA„„111)))EEÅ/^ðNãââþØt[‹Åâp8¨$DDDˆD"üÙŠŠŠŠ‰‰‰‹‹KHH 0@RRràÀÒÒÒòòòqqq¢¢¢Ÿ>}ª««ËÎξzõ*¬çÐ]‰±Xì’%Kâãã; ¤¤äçç‡Åb;´¦[PP`hhØÐаtéÒ~Sêáüùó?þ¬®®ÖÔÔ¼~ýúàÁƒ544lllšâZYY‘H$&“ ó§1™L2™leeÐÔÔäûLMMù§ÛØØ,\¸ðêÕ+ƒ &œ?þâŋº>”¾ ›ÍIMMݵk×Ë—/1Lnnî!C›´ä¿¥ô*:¹ßäååkjjï÷òò211©¨¨ÐÒÒJIIÑÐÐxöìÙ˜1c>~üØ8^ƒÁp8œsçÎÉÈÈtbt33³¡C‡Ö××wnò((|BBBào5 FHæçç¡R©ÞÞÞiiiÊÊÊ©©©ïÞ½stt$Û¶mÛ½{·¡¡áŒ3²³³ß¼yó‡/£› R©ÏŸ?×ÕÕ ߺu«¿¿¿±±qdddPPP÷4{öìÙ³g¿yóÆÛÛ»¡¡Ap¡óíÛ7CCÃòòò3f@‘Ô½ûSð fÚ´i{{û'OžÄÆÆ6n¹fÍ55µM›6YZZb±X2™|éÒ%---•J522‚«8===.— O744$‘H111ööö666[[Û€€€M›6¡é?PÚf¯¹qãÌ~îÜ9ÿ 6DFFΛ7ïª+%%µiÓ¦-[¶ðx¼ÞöÃì’ÝGII);;›ÿqæÌ™Ÿ?–>qâćéééͽµÛ¶mkbÒ‚‚‚ÎNåÿ¸|ù2ü:ݺu«ùQooo•û÷ï'%%)++{zz.[¶ `llŒÅb/\¸pëÖ­Áƒëëë?~üXÈ3ï!¨TjXXØ’%KîÞ½ ¯qÉ’%K–,鉱455CBBÊËË,MõõëWccã?~Œ=úÎ;]ϧÜ{¸|ùò•+W`ÖµvÑÖÖ666†…T­¬¬ Ê~µ² ÄÄÄTTTÈÊÊvbÂ(P² >|ïÞ½^^^p'‡ÃÙ¸qã¯_¿öíÛwëÖ-çïï3lÑh´þ&tæÌ™ÃvÀ`0ÞÞÞ4mÚ´iåååü6'Nl­>ERRR‡L솆†mWOEAém[ðxü¶mÛ¶mÛÖü¡¡!?½ÞÍ›7?~Üo žLž<ùöíÛæææ·oßf2™—.]êÑÛ–€ËºŸ>}222*++›2eJxxxR9*•Ê/:Ö.çÏŸ ÑÐÐ@äÆ222M¾¢|WÐæé|RRR¨T*àÕ«WD"±µÐ‹‹‹[²dIó/Òþýûq8œƒƒÃéÓ§ËËË­­­a-—Þ™š¼óB§¡¡ÁÎÎŽD"UVVFGG[[[kiiíß¿¿±ÊÀÀòÖVGY,VYY™àƒVWWwzÂ((ÝÈ?îÝ»Çáph4ÚÇ555»%ÓL/AWW÷Þ½{«V­ú÷ß«««oß¾ýg…ÅëׯW®\YSS3}úôÐÐÐ~£r"##¡¥)00pÔ¨Q|ïàÛ·oÿþ.7HHH¨©©-Y²ÄÅÅ%88X\\üâÅ‹ fÞ¼y>>>ß¿wrr’€!®ÇWTTüôéL|••Å÷evss{ÿþ}mmmllìš5kúÍÿ$J·SPP€ È¢E‹Z‹{Ú¿ÿ˜1cììì¸\nrrrïôÎt^è”——2ÄÖÖ¶¸¸†Ñ?~ü˜¿ºÅgΜ9°”W—¦‰‚ÒËÈÈÈð÷÷çr¹d2YWW×ÅÅåOϨ›™1cFddä²eËþûï?¸vÛFðArïÞ=[[[‹µ`Á‚àààþt39uêÔ·oß7oÞ”’’211á¿ÂCà·]uâĉK–,I) FII ÌB·´´TWWWWW?|ø°ŸŸ_BB…BQQQÉÉÉIKK[¼x1ìÊÐÐðÉ“'\.wݺu{÷îú£ô”””6oÞÜFt7—Ë533ËÈÈ——ïÍ*tZè°X,‰´oß>‰tèÐ!æîîîááÑ>~éÒ¥ÙÙÙªªª·nÝÒÓÓæ˜L¦““Ó•+WÛ¶msssëgáÐSæx¨IömèÙ+++„Õ";vìètÁ ”¿‡¬¬,iiév£êëëMLL^¿~ #4{'6½ÃÄUUUššš§NrwwŸ4iREE…›››¹¹9¿·µµ}þü¹¬¬,º:Š‚ÒGQTTüï¿ÿôôô˜Læ²eËöìÙÓ‰ôžãË—/S¦L¹rå ¿xñ"¬!œ¡û‘‘‘0ÕS`` L¨ƒ‚ÒãÆ»ÿ¾ ?öììl[[Û1cÆôæBO[h),,TTT¼yóæÖ­[kkkáÎììlmmí¸¸¸7nÔÕÕEDDP©Ô/^ 2„Íf³X¬^˜>E@ÄÅÅïß¿úôiww÷Ë—/ÿ÷ß×®]SWWï¹y<ž———··7‡Ã‘–– ÕÐÐè¹áþ||| »OHHÈèÑ£»^œ¥ƒÁ`þûï?­Y³F[[[ðɈˆˆæµÍÛ`ðàÁÐñƒÁXYYq8×ÑwžÜÜÜ‘#G.Y²$22²É¡²²²yóæ½~ý:88XOO/""BZZt_ž1”?ƒ±··744433ËÏÏŸ5kÖ¶mÛœœœ ïÖÖÖ°VÔ®]»öïß¾»NïÌi‰Ò;a³ÙX,¶CE¦¶oßž™™Ùv`ymmmLLLG'óþýûêêj---OOO111 ÃãñzP訩©íر£¹Ê”••'&&>zô¨µâV(((}—‘#G¦¤¤xyy:uêüùóׯ_wuuµ°°è.!R\\ìîî~óæM€‚‚Â¥K—´µµ»¥gÁ)((¨©©éPŒó»wïÒÒÒddd”””Zkó vƒ!..+îµQH«5õÑùôéSQQQÛ)Ãß¾}»zõjyyùÎÕýAAAéåggç””mmíÚÚÚ;w2ÄÚÚº°°°Ó}òx¼¸¸¸;v¨««ß¼y“@ ìÙ³'==U9((„Q£F n·âóèÑ£6T€Ô5víÚÕ¹œ^‚¾Š©¨¨ìܹ³yÖ &„††úøøØÛÛ÷Â܈(((ݨQ£bbbž?îååõòåË»wïÞ½{wòäÉæææ&&&&D$)))44ôöíÛ ,»téÒãÇ ˜ ¸7C£Ñ"""þô,PÚ¢ ¯^½êè)ááá®®®‚´hWzûöí„ ¾|ùR___TTÄ/Ñœ!C†ÈËË7ÞóíÛ·Y³f„„„œ9sÀf³;ä#Ðár¹8îîÝ»‚4Þ»wïœ9sÔÔÔH$’àóè4hHW‹”––nÞ¼ùOÏ¥-úú}vÖ¬Y³fÍÊËË;sæLHHHZZZZZšƒƒƒ†††¶¶ö°aÃäää”””dddDEE9NmmmqqqyyyiiiZZZBBÔ7€aÆÙÛÛ[XXôŸ³˜˜ŒÏøÓAi 4ޝ9P©¤§§wôÄÌÌÌÂÂBãÌÙlv}}=‡ûöí›ŠŠŠ‚‚‚¯¯¯±±ñÈ‘#ÇokkÛbÁÊÝ»w7q–÷ööž0a 99A¨¨( Áo wïމĒ’A³Ùì 6¤¦¦2™Ìvã­¦OŸÞ$“rÛ4¾0*•*//~S›3dȘz¥7³iÓ¦~ðí¥R©gÏžõðð¸~ýzRRÒ³gϲ²²²²²9wÔ¨Qššš+W®œ={vOS¨ÈÉÉݸqãOÏ¥3Ðét&“Ù‰‚’‚øûû»»»?xðàÕ«WFFF3fÌøñãôAÞ¼yóüùó·nÝ Ï;7''GÀžáâh\\,5¨¢¢²lÙ²Gq8QQQAzHèhhhøûû 8'@zzúÍ›7ÛHZyúôinn®àÝòQWW'“É™™™$‰N§w¢‡þ¨¨èÂ… ÿô,Pþ"DEEmlllllùøñcrròÛ·oËÊÊjjj~üøñãÇ‘Q£F‰‹‹KKK=ZSSSWWW8‹¾(((‚SYYùéӧέ7{{{[XXÌ;×ÖÖÖÛÛ»°°ðׯ_ÇÏÉÉùùóçƒ|||ø¦í¢¢¢ôôtIIIAjkkóóó•””JJJÈd2‹­©©‘——ÿþ=‹ÅÚ¸q£—Ë%Ç ‚Û‚¬§…‹í¨kÒ¥K—Ú: ‹Å®_¿¾C}6>@¡PêëëûM%E”~ƒQSSSSSãïIMMÕ××?~|¿)ðŽ‚ÒQPP¸sçNçÎe±X666ÏŸ?¿páÂñãÇy<ž’’Rxx8ÿ¨ˆˆ‹ÅBäÝ»wrrrD"qàÀ FRRR^^žL&C+‹Åúøñã¸qã6oÞìèèe³Ù CDD„H$‰D:.ˆÐiß_o’w¼]’’’***Z³RC ¾³°X,,[XXxöìÙÍ EÈÀHke}QPPz?þìô¹‰‰‰—.]255}ýúõ°aÃ(Êýû÷ÓÒÒ FyyyaaáçÏŸåääÂÃÃ'NœX[[+..>xðàœœƒñòåË7oÞDDD† 8mÚ´•+W²Ùl:N H$RJJÊæÍ›ai)­ÿí¯è¤¤¤ÈÉÉuÈ“Àáp¢¢¢ÌÌÌZ< c²yô葸¸xiiik©1ÌÌ™3難¨PRR"“ÉŽŽŽ0AƒÑ¹ËPPPº:h & J_¡Ýðê¶Ù»w¯‘‘QCCÈ#‚ŠŠŠ´´ô‡Æ—‘‘1yòd˜pòäɹ¹¹Ó§Og±X‘‘‘&&&ðt??¿É“'—••ÉÈÈèèè¬Y³&--môèÑpE‡@ L›6Ò(`¯öM˜0!**ªWÞØzõãÇ~ÿþ]ZZZFF&!!¡°°píÚµƒáââÒâ(¡IÁ²²²ôôtkkkcccss󺺺§OŸÒétTë  ô6`tE¥¯ÐE¡SUUµk×®›7o644p¹Ü#F$$$˜Læ˜1cèt:•J…-¥¥¥¡“Mãhs%%¥†† …Â`0†ÎårÇŒîM<‡`qqA¦Ô¾Ð¡P(ˆ4DDDáp8//¯!C†ÀÕ§òòò‚‚‚W¯^¹¹¹}ÿþ¶$‘H›7oöðð¤ÛaÆÁ³gÏ‹‹‹?~ü8''šñPPPzPè +:((}…Õ¢j‘[·n­]»VOOÍfs8œ&G±X,‡c2™¢¢¢X,633s÷îÝü£#FŒ€­Ào/¾N“xòn/ïœÐ¡Óé›7oŽŒŒTUUµ±±IMM½{÷nQQ‘——WYYÇsssóõõ…¥¤¤=z$//ŸŸŸ¯¢¢òéÓ'YYY6›]WWG¥Ra™­¯_¿0 33sþüùñññ0?‡»»{II F#‰hu-”^ꣃ‚Ò·è–´[¶ly÷î™L†Ë0ü>ÓÒÒ&Ož €šcÇŽõ÷÷/++àñxeee.—Û½!™í˜;(##£s½GEEÝ»woÓ¦M)))ŠŠŠ€•+W®\¹²q›ÿþûoüøñ,‹Çã 6¬´´TUUUII ‡Ãq8œ`0 X/¾¾¾þÆ[·nÍÊÊ‚1 ôM&¨ÊAAém B¥O€ t‚ÏÖ.’——7pàÀåË—ÛÛÛOš4‰¿_QQÑÓÓóáÇ)))222ééé/^Ô××WRRRVV–’’b0Ýžx¢¡ÃápBG=‘³cÇ}}ýÝ»w«««s¹ÜŠŠŠàà`++«ºº:™´´´qãÆeee5jĈïß¿Ÿ8q"‘Hüþý;‡ûùógnn®¥¥%''Nœ4iÒÝ»w9”>l6[TTôĉ***VGAAé9P¡ƒ‚Òûa³Ùx<‹ÅÒh4}}ýné“Á`ÃDD"A—/_¦¦¦ò]mÊËË•••?~¼lÙ²††¸¿'Òkµ#tx<Œzïô%%%NNN¾¾¾ÐY‹Å.X°€L&———WVV***VTTLœ81//oܸq¹¹¹°ûš5k’““k×®¥Ñh\.·¸¸8::zðàÁà·ƒK80—|kU6PPPþ¨ÐAAéý°X,¶aÆÐÐP*•ª««ûìÙ³né¹´´”ï£Ò‡“0gÎ<ßs`Úñäñx]tÀøûû§¤¤ ÒÐÐ@"‘†6l˜ŒŒŒœœœ¼¼<‡SQQa2™T*ª9~xX •@ àp¸aÆ‘Éd6›Íår›•a0ƒª”Þꌌ‚Òû¡P(ÐltñâEvðàAArñummígÏž¹¹¹UWW÷¨ç‰0„dz±±yóæ \k‚ˆˆ@àr¹°zè–-[øU0øeßaKè¤ÝüíL&£éäQPz!èŠ JŸ€Çã­X±bË–-ÎÎÎâââ®®®t:½  `Μ9Ý>ÖÈ‘#ïÞ½›œœ¬©©Éår%%%{t¢¡ƒÁ`ºe5)33óÔ©S³fÍ"‘H ¢¿K5"""x<>..NTT4??ÿáÇð,eeåýû÷ˆDbãö]Ÿ Šp@WtPPút:ÝÔÔ”@ ¸÷Í` IDAT»»6lÍš5×®]SPPHHH ‘––¼+7oÞ¼O¡P(žžž¹¹¹K—.…^¶Bx¦·z÷A„F£‘Éd 0ÕEöîÝ»páBOOO)))þN óäÉ###‘åË—›ššŽ1"##ãíÛ·0W´––Œ·BAAé‹ +:((} …"))9oÞ<@qqñõë××­['++{ãÆ ssó .Þ•··÷“'O~ýúéêê:kÖ, ©©éææVYYéèè­7=ç”Ó„V‘1¿ADWW÷Æ],666666::ZEE…H$æåå½yóæ×¯_üááá³gÏŽ‹‹«©©‘””„åIÑ[$ Jß:((}h½j\¥ ²²rõêÕ0+Þ‰'`!ªv©¬¬,Y²dñâńʘ˜¨££#äB[ëÉÞÞÞЉØÙÙ¹‡|öìY``àùó磣£«HVVÖ‡TUUÅÅÅѼ8((}Tè  ôètº‰‰Ió…–C‡±Ùì£G ØOII 44TAAAEEeëÖ­<Ø»wïØ±c---irCàr¹4aÞí´*th4ÚÊ•+ ËËËUTT’““gΜ٣†v11±Ã‡Ož<™ï¦ƒ‚‚Ò§A}tPPú Ðz5þü&ûËÊÊ`Z¿ &ÒOXXN·³³|þüÙÏÏÏÌÌÌËË+;;ûÛ·oâââT*uêÔ©FFF[·n=räÈíÛ·³³³¡ Þ1º—Vï>¢¢¢jjjƒž4iRjjêÔ©SŸ?Îd2£¢¢º?k!occóùóg—wïÞø…LQPPú4èŠ JZ¯šï?uê—Ëupp¤“Ÿ?Þ¸qÃÀÀ`äÈ‘Í2ŒüüüW¯^…‡‡ûùù¹¸¸XZZjkk‹ŠŠNŸ>ÇãÑéô®^ÆÿÓªÐo`+W®,**š>}º¶¶öÎ;£££-ZD£Ñlmm;4Ì„ f̘ÑbüضmÛÊÊÊüüüjkk:::¼”Þ *tPPú £EëÕׯ_ïß¿¿råJ~Η¶ñòòt´ØvRRÒåË—a­òn¤­õdh½p8œ×¯_Ÿ9sÆÈÈhüøñÙÙÙgÏž2eŠ€c‰ÄŒŒŒ/^°X¬ÿý×ÖÖVMMMLLl×®]EEEçÏŸçp8‚¨¨¨tá  ô&P¡ƒ‚Ò‡0`@‹U ¼¼¼ðx¼½½½ ýäååEDDXYYÉÉÉuhiiij/m QQQUUÕqãÆ5Þ™••5þ|ƒqþüyÇ`2™uuuïß¿OMM522:wî\NNN]]··7…Byö왬¬,šÔ¥_…ꣃ‚ÒWàr¹-Z¯222þû￵k×R(Aúñõõ%‘HF£u¨½ ´u÷á[¯šì/++óððÐÒÒZ°`€Ã”””‰ÄiÓ¦‰ˆˆÌ˜1ÃÅÅåòå˲²²éééÍÛs¹Üºººn7Ô¡  F ”¾“É411i±þƒŸŸŸ„„ĪU«é'++ 0bĈÞB§¢žÐzuðàÁ&ûÏ;çèèèèè+È07oÞ|XVVvРA²²²rrrÊÊÊ£F5jÔèÑ£=Q´¥]ètúõë×»·OmmmöQú ¨éê¯A‹Õ½}T( QQQ€¾¾~xxx“C>,++³±±¹téR»ý”••!ëp7@ HKK—––6?T__ß©Y·E;B‡B¡¨¨¨hhh@iƧªª* ÀÞÞ^SSS B.\Ø·oß®]»âãã›­«««««ËËËk²‹Å^¿~Ý¢ÝþQº¶oß¾îí“H$†……ikkwo·ÂÃá4)%‹"¨Ðù«(((˜4iR÷ö9oÞ¼àààž.0‰Òh½j.tØlöåË—œœyô«««c0˜ÜÜ\þ·}ûömÛ¶)**ÒéôÏŸ?ß¾}ûäÉ“Ïú+:ÐufåÊ•M„àôéÓ¶¶¶ŽŽŽÍm[Í)//¿víšµµõرc?|ø àäx<ž­­í²eË}wQAŒŒŒnÿñ ‰´|ùò®÷SSSÎd2—-[öàÁƒ^¥u8N~~~»ÍüüüfΜ9gΜÆ5LPÚ:m£¯¯ßÏV,º«H"\Š‹‹[½zõõë×û¨Öyÿþý¨Q£úÖä™L¦±±1‘Hl^Õ;00pß¾}ÖÖÖí ±”šš PWWwwwŸ={¶¸¸8—Ë}ùòå¬Y³&MšôöíÛ&gý¡~[¯8ÐdaaáíÛ·-,,†þíÛ·vûñññÙ¼yó®]»6lØ øüª««‹ŠŠ:ê¶-4ÂÂÂ1Þ%&&N›6íÂ… }îvF¡Pº%/v^^^xx¸¸¸x]]]oÓ:•••N&((höìÙwîÜZ‰–~À_+tŠ‹‹=<<Úm–˜˜èããsìØ1MMM!ÌJ8(((<~ü¸ëý¼{÷nåÊ•x<þñãǽSëxxx4—MÈËË+//ߺuë’%K„3«®­W ,xôèQ“C?^µjÕž={jjjÚèDKK‹Ëå._¾üúõëÇddd\½zõÑ£G˜5kV‹gý¡C¡PF5~üøÌÌÌ&‡Ž?neeekk+H¡OŸ>ÅÅÅ™ššvHèjkkeee;tŠÐøúõkbb¢ -“’’V­Zuâĉn©ÚG‘••={vxxxoÓ:7lذ6TVVÖÖÖ>}útΜ9AAA£FÚÜÚ 77·{+´t;ÅÅÅâââaaaVÉùSxxxtïß´ººZÀ_¿~577¿råJk·þ¿œ#FTTTôN­^WW'HËÇ×ÕÕ èÆÛ€Ö«æBàïï¿páBKKK__ß6z˜2eJvv¶Ý¯_¿|||‚‚‚ètúÎ;===Éd2‡ÃÁápÍk>´+;AûBZ¯V¬XÑ\èää䤤¤¬]»öÀ‚Lîýû÷úúú h[6¡'ô]÷b``+¾¶‚ »víää䘙™9r¤Å ÇôB­#))yûöí6øøøÜ¹s‡Ãeggëêêž>}Z£mOSUUõýûwÓ•¢´†‡‡GuuuOô,++»qãÆ6<|ø0;;»¢¢ÂÔÔtïÞ½{öìésë¾= ‰Dºzõêºuëz§ÖìÚµ«)¥§§ÇÆÆ²ÙìãÇ¿yóæÈ‘#bbbœ^ç€Ö+‰Ä`0šŠŒŒ,**²¶¶nCèÉduuõÂÂBSSÓÈÈÈ)S¦¸¸¸c0(Èd2‚ Í…NO¬þ ä\I£ÑÌÌÌš[¯þþþAAAË–-»uëV»ý”——äääš Å‹7®˜Údô^þË>|x áƒÁŒ?þíÛ·{öì133sppø;Í8®×jAØ´iSAAALLŒµµõ‹/Nœ8ñǽÇ  §§÷gçÐ×ñóó롞ÅÅÅŒŒÚhðæÍ›ììì3f$%%?~<)))00pРA=4Ÿ>ŠŠŠJoÖ:‹/nC»p¹ÜØØØ1cÆäåå=yò$77÷ĉcÆŒæ ;ßzÖä‡Ã tqq™6mZRRR‹§Oœ8ÇŸ¾¾þÙ³gøìÙ3çÏŸÿéõ: Ö8p Ô:=aàèQÔÔÔnݺ¥¦¦öýûw++«?=£öi-s àÂ… ‚˜››·v.ôDvvv¾wïÞøñã¹\îüùóׯ_ÿþýû‚‚h)Â`0ÂYÑHè@…ÕâÓéô   Y³f ¢O§L™òöí[6›-**ºwïÞüüü>,X°ƒÁ“H¤ &4?¦ÑhAyö~–-[véÒ%hÆê½¾HŸÖ:CCÃ+W® >š±îÞ½û§g„ÒçÑÔÔ¼qㆦ¦&4cyyyõDç>M_×:òòòË—/‡f¬Ý»w÷rÇ &“iddÔâ¢õ¯_¿X,–„„DkçN›6N§KII!B"‘p8ܯ_¿à¡×¯_ós+s8œ&'þ±ðÛzÕâ¡€€AÚ]Ô8p •J-//ñâEyy¹‡‡ÇÀ/^¼¨££³jÕ*ƒÑš)§ß¬è@TUU¯]»¦§§W__¿gÏžcÇŽu{~­^KQQÑÊ߬Zµª  @RR²¾¾ÞÐÐV­ïCP©Ô   … Òétkkk;;»æ–l”!--}öìÙõë׎?¾téRþ³áo¦ªªêÁoÞ½{gaaA¡P?~¼lÙ²>§už={ÜÝÝÅÄÄž‚ ðo×»„ލ¨(•J8qbóC999/^¼°²²‚&½ÖÐÔÔÄ`0†††Ó¦MKLLü矆þêÕ«ÀÀÀèèh%%%xyͲúŸ P(îîî¡‹Á`¼û (›Í~òäÉŸž]‡AÍX(݋ݼy3jÆjÌ?4âܹs0yîË—/ñ í…èéé]»v­O˜±Ú°^ñx¼Ö„޾¾¾„„Dk’ ))ÉÎΞÛ\èü1gdÐÈz•‘‘Ñü¨¿¿ÿ­[·V®\ÔZÐbwúôéS§NÑh4›ÜÜÜÁƒWTTðx<,ÛšÐéOË9Y¶l™ººº³³óß%//ßš}çÖ­[>ò|ºCCÃ1cÆ899õªh,”> 4c>|øÍ›7s4–””LÛœÌÌÌ/_¾°Ùl!O©»€f¬3gÎÜ¿¿7Gc±X¬E‹={öÚµkMꊷ¶¢#""ròäIÆ¿&“)""R[[ËoãëëóåËIIÉñãÇ<O"‘æÎ+ Ëo‡è@J{˜9ÐÉÉ©ù¡ÐÐÐòòr›6„Ž––VUUÕùóçÖ¯_O¡P²³³œœ8NÛ5•úñÏš±Ž;–п£±H$Ò¸qãZ<Ôk“$ 4cyzzöªh,”> 4c]ºt)((è¯ÆRPP8zôh‹‡Ž;öåË!ϧ{f¬I“&¹»»÷Úh,2™ÌåríìììììÞ¿õêÕàààŸ?¸\nóà)IIÉèèhUUÕÆkD"ÑÇǧ¸¸¸qKàåå3×Lž5nÖÜÿ®¿®è@þZ3V?5c¡t;¨ëo ÷›±à Ç1b„··wQQQXX˜©©)‚ ðéŒÁ`4557nÜèïï_\\þ 3¿Œ9‹Å>}ú¶äp8UUU€áÇ{yyíÞ½[JJJKK«¾¾¾±< ‘H)))¥¥¥)))ü?~ü˜2eÊáÇ+++ùñI ¥¥ŽÒ1¡ƒÁ`nݺµsçÎ6>Ô†Ð177×ÔÔ”’’âï!“É•••ü uuõéÓ§ëêêΛ7qÖ­[סIv(6³³³­­­¡æèB3c}ýúFiö{bcc¯\¹"ä²î2cõ¹L!Â7!õ3Vß tê555ͽ)z”ÞiÆ‚ ß¿Éd6›­¦¦öõë×ÌÌÌ&¾8x<þÇ7n>>eeeÿþû¯±±1L[ ÿ#šû`ò1™L·ÿþ&-¥¥¥ýüüâââ^¾|ùìÙ³éÓ§{zzêêê6wkêià/ÙÌÌŒB¡¤¦¦ZZZîܹ3??_hŽ+;;{äÈ‘NNNÐ…¾S^^¾{÷îñãÇûùùõ„Kkt‹kçή®®‰$í[¸¹¹9::B÷D¡ñÇÍXÑÑÑË–-KOOæ ŠÂÂÂÙ³g_¼xQÀåÝ‚ÍX¡¡¡öööm?·oß —1üÈápttt***þý÷_ئ®®ÎÏÏoîܹqqqÇ?s挤¤$\Œi®r †nk”––Š‹‹wý Õa¡ƒÇ㡲ár¹>,--=uê•J¿Wt455ÍÌÌ\\\BCC#""~üø¡¨¨ÈïAÒÒÒ&U°X¬„„„ _Ó˜ššÒh4‘6ªõ|¡óãÇ'''QQÑ„„„¥K—:t¨¤¤D8sŽ‹Á`øùùM˜0ÁÙÙ¹[ýáײ´´ÔÉÉiüøñ>>>B»muÝŒõóçOMMÍÛ·o Ù†‹Ò6</00PSSsÆ 0DV8üY3ÇKHH˜7oÞªU«²²²„6î‹ÅÖÔÔøúú.X°àüùó=Tâ¾E„fÆ¢Ñh§OŸ¦R©hãaJ¾9 :&Ï›7OBBÂÃÃ#99–gwqqk?²²²ðþùóçG5îÉd²Ùì¶¿·C‡MHH>|8tê h"‰ ¦¢¢‚H$ÚÛÛ;;;Μ9Ã`0RSSoß¾}øðaccc5$''‡D"ÉËËøðaéÒ¥ZZZ‘‘‘•••\.wúôé555ü[yVVÖØ±c³³³ FfffNNN~~þ?~þüY]]ÝÐÐÐs+ŠP興ˆHJJÂl Û¶mÃãñ>444ôòò‚6H!Уf,ø_-%%E§Ó/\¸0~üøôK¹Ã×ß#GŽ,//wuuÕÐÐ8~ü¸ÐþŽ]1cÁ,[¥¥¥[¶l™7oÞ›7oºqbsçÎùuuõõë×7Ei ˜*‰Ãᄆ†Îž=ÛÄÄ„ï© þ” Þx‰‰‰™={öêÕ«srr„0î>§EDDh4Z@@À¢E‹|||û]ô(Â1cAk F;v옲²²»»{»£p¹Üšš óúõë«W¯‰DWW×Õ«WÛØØÀàð&ih¦L™bddÔ¤A ·)ʾ}ûNžþ<''§¨¨HKK üþ+t…Î/–äææª©©%%%-Y²æ=d±X'N„7b)))‡3zôhؘÅb±Ùl …"))yøðá>ܽ{7$$&ǃëùuuusê¬]»öÇÇŽÃ`0t:=;;ƒÁ¤¦¦^¹r…¯:a4æñ7 Ÿ>}*)) !üFDD„¿Çãa3BKÀ‡=?@lðàÁçÏŸßµkסC‡BBB‚ƒƒÿý÷ß5kÖXYYuúOpz.© :sæÌ9xðà‘#GÂÂÂ|}}¯^½ºaÆíÛ·w½ÿ‚Ûq¾~ý 9rdHHH||üÑ£GŸ>}êååuáÂ…õë×·Q€·i’T0""béÒ¥222¿‘’’jñ÷ …އ‡Ç©S§ÒÓÓõõõW¬Xáââ2dÈ®ÏjûöíÑÑÑqqq+V¬ ‰ÖÖÖ‘‘‘]ïùo µk×JKK_¼xñÙ³gÏž=ÓÐÐØ¾}»±±±&ðG’ B9µxñâ1cÆøúú†‡‡GFFš˜˜ìÛ·oÔ¨Q=:´ðïHcÆŒ¹pá‚››[ttôÕ«WCBBV¬X±víZ!äoBRA(tæÎ ˆwvv>s挓““µµuó¬§\.·¡¡A\\üÇîîîŠŠŠ§OŸ–‘‘}çÎÐÐPQQQ~¦&‹Åb±ÔÔÔ0 |R¶»·¡· ƒ™0a¿ÿþ›‘‘qäÈ‘G;wîÊ•+ÿüó.¬"ÂãñÚU-‚ÿ{ž;wnNNΔ)Sh4ÚÙ³gýüüºï:Úš±°XlTTTxxxxxx“ …¯{ 7ŠŠŠ–––¶¶¶ÞÞÞwïÞˆˆ°···µµí┌‰Db\\œÍðáÃÕÔÔ8PVV&''xþüùÙ³g?|ø &&¦««kooß8#è7®_¿^XXÈår‡ 2{öl777ƒ?¦M›–––F&“---wìØ¿r<ïòåË7oÞ,))QQQ±³³ƒeOæÌ™óýûw==½×¯_3 #GŽð_“Z«ÝvG§Ó “Élòo“0€VRRòäÉ“ð÷÷?{ölVVÖÆ]]][«]н@3Ö¤I“:ÍXð˃Á``Ü ‡ão4ßÙ¸6kܦñ¹ðuTZZúĉ»wï>~üx@@@hhhXXØŠ+V­Z%„«æóòåK.— ï¼ß4ÞnüA&ÍiÒ¬¤¤ÄÃÃD"ÁöÐÆÍãñttt¢¢¢Þ¼ysôèÑGݸqãîÝ»0iž.SOOOUUÕÙÙ977×ÊÊJZZzРA8Çãp¸æÍ÷ãp8ø†·üøñýûw<Ÿ˜˜PUUõõõýï¿ÿœ“““wîÜéíí}ðàÁµk×òÝp™L&…Byûö­««+àÔ©SãÆËÍÍ•‘‘ár¹óçÏ8p ©©i@@…Bá§lyyùÛ·o7ÞƒÁ`dee»=]~'…ŽŒŒL^^žœœ\CCÃÀ &Ož|óæÍ¥K—òÛÀûÔÈ‘#½¼¼`Å(Ð $$$;Ør8×|I?11þ +V¬¸{÷.?ó7Çc2™, þÛ˜M›6Íš5k̘1l6&$d7£Ål6ûÍ›7uuuÍWMx<Þ§OŸøÆ‹%LÏVeeeQQÑšš‡ÃO²Ä§¬¬¬‹ýkhh,]º499ùçÏŸõõõ]ì°CüúõK@«®=`b«Æëêê>þÌ_r ;tè\ž¥R©[¶lÙ³gOÏ^Þo"""C‡¥R©<¯ö7ÕÕÕõõõõõõ-ú 0€B¡¸¹¹ÙØØXZZ>}úôرc7nܰ´´ì®¹•••EEEIJJÂÉØØX[[Û1cÆXZZÖÕÕ=~ü8555**ŠB¡²³³9¢¥¥5{ö캺º'Ož@«¼MlllLLÌ«W¯Œ+++ÏŸ?O"‘lll...·nÝš1cÆüùó_¿~½uëÖãǯX±BWW788øùóç .”––ŽÝ¸qãóçÏá²µ±Úža‡¨««[±b—Ëe0Í3\´ \–””Ü·oŸ‰‰Éĉ FaaapppG§ÑiÔÕÕGõêÕ«ŠŠŠŠŠ !Œ}5|æÌ™ýû÷S©Ô†††Û·oß»wO£óyôèQç®Ó<«ß&¨©©yôèÑœœœOŸ>1™Ìˆˆ¡Å  :tâĉ¹¹¹l6»´´´´´´‹Â0g>ðÑ=88øêÕ«::: Ý»w—””(((´1VÛ3ì(ü—xW!‘HD"±ñ¿p·óóóãââ Ðùøñ£““Ó¿ÿþ‹ ˆŒŒÌîÝ»uttfϞݕ?Š€|ùòÅÉÉ©°°.êèè4^«à¯a´¸³ p?lÖââ—ËMOOôèü%–••y{{óƒgÏžmeeµaÃ!\5dÆŒãÆk¾þÔ|™ ®Tµ¶LÅoæää´fÍš!C†Àöeeennnð'–––vèС¨¨(€¸¸øêÕ«---õõõ…¢¦¦ÆÕÕõåË— ÆÜÜ|É’%øH…ëÜM6ZÜŸ}B„¿è‹ÃጌŒù+ü[ üqñÍ”­Õö ;„˜˜Ø½{÷¦NJ$›„¶Ahhh\\\QQ‘ÍåË—9ލ¨è–-[vìØ!...œÌ¶aaa§Nb2™cÇŽ 9rdOxãÆGUTTìܹóâÅ‹ ƒÁèëë;88hjjB8¡ahh¸yóænìÐÝÝ]GG‡æSPP¨ªª255 C„B¡XXX¬^½ªm!ðîÝ;hP0`À±cÇfÍšÕõ>óòò6oÞ +xzz¦¦¦²Ùì3gΜé&OžüòåK"‘íêêšššºqãÆÐÐÐAƒÅÆÆ.X° µžá›@\\œ‰‰Iff¦¯¯oyy9tâùƒt§tЩ««óõõ­­­µ··GdëÖ­êêêÍý’DDDš»¶ ÒØ±KOOoþüù²²²3|øpxïèi•€6µºººÃ‡Ÿ?úØ«¨¨¬_¿~Á‚[Tè¯_¿vqq©¬¬”‘‘ñòòÒÔÔìö!`ÄÄÈ‘#¡ÄæÕ xQGFFfçÎ6lfiñˆˆˆ“'O2 55µ   ùuAO䪪*èð!..þÏ?ÿlÚ´©ÛEáÆ%%%·mÛvûömø&ƒÅb>|ØâŠi^^•JÍÈÈ(((øþýûíÛ·Ož<¹bÅ ~µ»””8ÉW¯^‰DIII˜c">>^EE€ HBB‚˜˜XãT¢-ÒÚXmϰC`0˜À”¯‚Ù“'Ox<~íÚµûöíëÄ+Gç Óé±±±€Õ«W{zz ç[ —7 ÆÀÀ`Ïž=&LÂоU–””À¯™¹¹ùºuëZ+éØí rëÖ-???‡3aÂ//¯Áƒwû(ÐV{îÜ9øQCCcÿþý+W®Äb±ööö§OŸÖÓÓKOO×ÐÐøøñã AƒÚP9IIÉâââèèhKKK==½p¹\¸BÖí“® ÔÔT--­1cÆ=z4::ÚÙÙ®KûúúîØ±cæÌ™æææÏŸ?oW„ÆÅÅmÚ´ .zWWWEEEAÊËË+++‡ Ö„S®èèêê‰'nذaæÌ™Âü;51W¹»»71ÛuhÀRQQqpp055í—‚Çã%%%mmm­­­;ú0ë ‚˜«Ú ÀÈ‘#7mÚôÏ?ÿtïü#ÿ×ÞÇCµÿÏØ²oYŠ,é²Ý+)EQ.·ºm IZЗ,Y"¹)æ )“rK©$E’Y¦è]·åVR©P´PŠ[öe~¼?¿ó˜O5²ÎŒñzþuœ9ó>ï3sœóš÷ë}Þï+WpS|rrr@@@tt´½½½———­­­‡‡‡¯¯¯µµµ™™//ïóçÏËÊÊÜÜÜ6n܈ºzõêž={²³³544:::*++EDD›9ÃÂÂÊËËÿý÷ß¼¼<'''~~~55µ… ÆÄÄܽ{wòäÉ·oß.++ àãã»~ý:BèØ±c&LÀ¡~<­}õ]CÀ‰DZ´hÑo¿ýÆ‚ÖcºŠJ¥2›ky$à@‡L&ÿúë¯~~~ÚÚÚ,Û5ëák¾€€€Íúõë‡ý"ÜÆtÕÚµk===GhH9¢SÚŒ3‚ƒƒ-ZDÜé455333—.]úñãG:Þÿi'N¬¬¬LKKÛ¼y³¶¶vii©¸¸ø°w1î¿Áp÷îÝ300˜2eJhhhrr²§§'nWÇYª‡8p 88øÁƒ ååË—Œc~mÁ‚íí펎ŽDŸöööqãÆÉÈȰà¾/à/¾»»ÛÔÔtýúõ,®ÀwÓUÃBNN.11qéÒ¥\??¼¦¦æ“'OX–¨Âú™®êÛ§OŸ,X€³T#gïÛ·7Ο?ÞÍÍmúôéK–,ÁMô8tèPzz:™LVPPX°`‘š0a‚¬¬liiiqq±ˆˆˆ¡¡¡ŸŸc·xñâ«W¯öôô8;;oݺ¯Œ‰‰QWW?wîÜÍ›7'Ož‰[ªþþûo„Prr²¬¬ìüùóñxQééé8Ða¶/üȳ²€€€À¬Y³vîÜ9M­}`}ºŠ‰D²µµõõõÅ-sÜoÕªU...,N¾ŒDºŠ™îîîyóæãŽz:îââ‚ûô|·Ùõkêêê·oß>xð ¼¼üÁƒccc‡¯Ê6˜@w/RRRÚ¾}ûüaggwëÖ-iié+W®,\¸o£§§WXXøûï¿S©Ô%K–œ:uªµµ%ÄÌí®¬L.|¡··wáÂ…ÎÎÎlùOfAº Ã?ÇÖÿ’JºŠ‘‰‰ îl;B®]»öÅš={öìÙ³/[YYYYY}óK–,é{¨//¯èèè/Vòòòº»»»»»±>??ŸñÏ/f—ëc_}Ô Y<æ»ÒUŒÖ¬Y3¸îÞ£‘¼¼ü¶mÛX¹GÖ¤«ùùùáÁ¾¨F[[›PWWנϱéÓ§çåå…„„°}HÉ:>ÔÖÖž0aB```||<z_,--MD9˜™™Ùùóç½¼¼deeMMMÏž=«®®ÞÓÓÃú)*55•e‰vF,HW‘6ôt#6fµçÊ•+øØ9booÏš¦Ø…ÅAÓUŒ¸¾˜X–®bD ÖD"Í›7ïÌ™3õõõCùIŒ[‰Xùï7õ÷Cij´KKKûùù:tHAAáôéÓ‹-jll¤Óé̺Î,_¾¼««ËÎÎnüøñóçÏÇChgeeá§ã8[¢Ö¤«Àˆ–tÕ¨FäÂΜ9£©©ÉÝ+±7]X€•骾áþ'S¦L‘——âì¼¼¼7nÜhooŸ;wnÿŸgvý tZ[[ÛÛÛÄÄÄÂÂÂð¬]]]ßmràããÃc&≢¼½½ýýý_½z5ôL¹ ËÒU`ä WºjTû:†ˆÒU`D±>]Õ7ÜŒ”’’ÒÚÚ:”éžžssó˜˜VvžûZ^^^77·ßÿ]\\<''ÇÚÚºŸï%ÆL,,,´²²züøñ±cÇpÑ`«Í= ]ņ7]CÒU`ä°%]ÕO}w«ý.ü$oJJÊŠ+þþûo<½9[ô÷åãã#“É|úô©¸¸xÿ£ ™8iÒ¤’’kkëׯ_WWW›˜˜ ¼Â\ÒU\ÒU`„@ºŠëqNºj„}Êü´ãÆ,--mjjâ„a¡Ù ÒU\ÒU`$@ºŠëqZºj„ànÈ?þø#{«Ñ¯@ÇÔÔ4''çĉiiiCÜ_gg§¸¸¸œœ æáX®â®#ÒU\“ÓU\©_®¸¸8??ÿÒ¥K‡¸³¶¶¶îîîØØXooo6vÀf/HWqHWé*®Çõé*Ô¯@§¨¨? Ÿ:ôηoß¾yóf<ÿù ‹¥ ]Å ]F¤«¸ÞIWq þ¦®þ»õК×jkk/^lbbÂÃÃÃÅ3+1“éªÑîôéÓõõõÒU`X=þüèÑ£®âbÍÍÍ[¶lù믿 ]Åz,ý 'MšÔÝÝ­  ÐÕÕÅM©«æææW¯^õ½ N?v줫8VKK 1õÁ7Ý¿!T__é*Ðt:½³³³ zzzBIII!HWR]]]xèoÂ_1žçÒUlÁꈒ+cØ””””””ïné*NÖÞÞ~îܹïné*0 UUUý¼«Aºjôêçx+®b. ;XIBBBQQ±?[*))íÞ½[BBb¤«JTTôëé'¿‰L&¯Y³†Ó‚õîîîÆÆFv×btëîîö2I$’€€@¶Œ‰‰Y¾|ù°×Œ4>>¾~v6µ··÷òòƒ}68g]²Gµk×r÷D¾ÝÝÝ<Ñ]444Œhùß%((¸aÃöÖaÐøøøjkkùåvWdÔöøUSSóíÛ·Ã[&à4þù'»«¾ЗææfèŒÂÉ Ÿ={ÆîZð?Þ¾};ôáHúÆöH`@|///+» qŽ\çèêêzòä »kÀA ¾MRRòêÕ«ì®`4QPP(..fÙî c/èt ~~~mmmv×€ÿ£¹€kA ®¸:àZL;#Óh4‰ÔÓÓC¡PDEEYY³¯…………„„ ât:=--íôéÓuuuãÇ—““SRR¢P(Ã^Ãþ«ªªÚ°aC^^Þ×s~éêê:88lݺ•Õ »~ýúŒ3ð·"""‚ýö!::ÚßßèåèêêÖÖÖâe!!¡9sæìÝ»wâĉC/y(*++/^\VVÖÏÑT'#ç^%ÀˆâÀ»ÿ1 t(JOOÏîÝ»Boß¾‰‰ e]½¾¥¥¥epo>>KKË·oßêëë———KKKZXX „˜­ïíí=qâÄÙ³gß½{7iÒ$¼k\þŸþÙÖÖ¦  ÐÒÒ’™™)..¾dÉ’êêj„‰‰ BHII)++ !T__ÿ믿¶µµ!„JJJˆ ºïz–••ñññeee-Z´¨?3²²²xס¶¶¶èèèÖÖVüí³tíÛ·ïõë×t:]TTôÙ³gS¦L‘’’ú矎?ÞÖÖ¶sçÎúúúãÇ÷]NQQÑ¥K—ð·ÜÕÕµoß>¼ýŽ; ‰o988XLLlp‡ƒçÝ´´´ÄçÉøñã׬YÓÑÑÁÇÇ·ÿþcÇŽÕ×׫¨¨¬[·ÎÕÕ¿¥±±Ñ××7//‡‡G[[ûÖ­[’’’GŽYµjUwwwMMMBBBDDN¯©©eVB(<<üäÉ“ïÞ½“‘‘ááá¹ÿ¾€€€‘‘ÑÓ§OB***¡É“'ß½{wpG8Á<Çús•øæ÷Î;Ÿ={¦¡¡ÑÔÔÄÃÃ#//ïííM"‘pQT*µ®®!¤¨¨èååEàýû÷š››ÝÜÜ ˜•ßG}’„þÜý¿y× ¬¬¬ÔÒÒúøñ#Ï„ ‰o<**êåË—!%%¥€€¼rûöíwîÜ™4iÒ¸qãššš¼¼¼ð µÌ¢‚>¢‘/ô+Ð9wî1uåþýûýüü¤¤¤Baaa{÷îE?~ÜÐÐ0((!”››[\\|þüy|´!!!!*•Êø;€Y9éééñññøã8rä±}TTT`` Ž1¤ººº³³sþüùÄ"ñññ©¯¯÷÷÷ommomm tqqÙµk—€€…B),, ™7o™Lf¶žJ¥fggÛÚÚJKK¿xñ"..ŽL&ÛÙÙ!„<==ß½{çåå%""’››ûçŸ~úôI\\<22òÆqqq‚‚‚²²²¸>222111`<„¾ëioo_PPàîînmm=”ã.^¼H´º>|xóæÍø¤ùðáCtt4þ'OIIÑ××÷ññAåçç—––&''#„vî܉ܽ{7^ .ÄÄÄào9))‰Ø~çÎ;wîÄ¿‡Å¿ÿþ‹§ëŠŠŠRUU MOO_·nŒŒLUUUXX™LÞ¸q#BhõêÕ¯^½ŠŠŠjjjŠŒŒÄõŸ={vpp0>('''2™ŽÚµk³rÊÊÊbbbüýý§NzæÌ™7nàÿÃÄÄDŽÛ`¬3î0¦Î±þ\%¾ùß½cÇkkkgggsss„P~~þÙ³gW®\‰:s挶¶6Žo®]»–ššŠ”nß¾ÝÑÑÑ××WII©««këÖ­8Ðavõ`VŸA€$¡?wÿoÞµwïÞ=gÎSSSKKK„Pnnî©S§BIII:::8¾ÉÉÉ9yòäš5kBáááË—/VQQéêêòôôij¨€Y}¾ÖW S]]íííýŸÿüÇÌÌŒ¸÷dee1ÎTWWWG§ÓI$Ò£GœñJ++«ÌÌ̾?>få,[¶lõêÕ222šššø¢®®.„Ð×'GuuõÝ»wñÿÞ ::: @YY!#&&6~üøìììÖÖVfë322þý÷߸¸8¢äììl;;»çÏŸß¿Ÿ(ßÌÌ,!!_w¦NúéÓ'„©©)cî“L&Ïž=û‹¿[ÏÛ·o?þüæÍ›---ƒhÿxñâEPPÐÇMLLˆß¹¹¹õõõÄ6¸ ‡D"UVVa¢……nˆê³r-Zäââ2~üxuuu|á!ºººxa„ iii¡¤¤¤¦¦&|#ÁÒÓÓ7nÜøøñãÒÒÒììì™3g"„øùùŒŒˆ©0deeg̘—™•ƒ’——‹‹ÓÔÔ466ŽŒŒBéèè477#†6ÀÆÂ96 «³ÿî©S§ZXX¿ˆÊËˉˆdþüùŒ¿s¦L™¢¤¤„âãã#‡YùÌê3Ѓmiiáî$@yy9Ï_ýµxñbf€îþÌîÚZZZÄŸVVVDKǃˆˆÄÚÚšhÑA©««ãÆHÆoœYùÌêóõáô訪ªîÞ½·455áfÀÉ“'ÇÆÆöñ®~bVŽ¥¥¥¥¥åçÏŸËÊÊ•••ñ?ö )))‘Éä¿þúËÊÊŠq}gg'Bˆˆ*{zzèt:þ“ñÃ"V~s=NŸ3gãæøŠÓÞÞŽ""aaaÜ2Pƒ«gÿ)++ïØ±£­­-44´¹¹Ÿ[***ƒ(í ÌÊ177777oii©¨¨HNNž4i’““ÓÐw÷µÔÔT>>¾×ÔÔèèèÐéô xzzÛ #„:::BD[÷w½™•ƒ_ºxñbQQQEEÅ•+Wh4ÚíÛ·qÁ£ÂX8Çt•`ößýEõz{{Wfå×U«®®Ž»“ %&&†J¥†……1K èîÏì®=\ß8³òû|ÿñr!!!œPÀ*++³·––15RnnîóçÏñrww7^xùòeMM ±=³r¢¢¢B"""3gÎܾ}û£Gˆ—p×’‘‘±·· ‰¥Ñh—/_ööööóóSWW×ÐÐðöö>þ|rrrddä/¿üÂÃÃ炾sçNÇTTVV"„˜­_ºtiIIIAAA}}ýÝ»w£££:„š:uª’’’¯¯oFFƵk×RRR-Z”k… ÔÔÔóçÏ»¹¹™šš¾{÷îÙ³gׯ_¿wïB¨¨¨¨¤¤¤···?õÄÝ´>|8ˆÏ Âmé¡I“&|½™††Æõë×ñr~~>þ‘¾åºº:œyí»*•Šž>}º¿¿?þ$±Á}Ë_Ãs ~þüY]]ýܹs666...ùùùW®\yýúõÍ›7·mÛ†ZGGGSSÓÉÉéôéÓ 8 ‹áßI©©©‰‰‰»víBÕÔÔ0+!dmmmccÃÏÏ?þüéÓ§ãë&~ _/Ž=zòäÉ+V¨©© ËÁ¶kçX?¯Ìþ»«ªª¯šššxYGGçÚµkx¹  €XÏ ³ò™Õg ðÕŒY ::zÙ²e^^^½½½D㺵µõŠ+>þŒ;µ0[Ÿ‘‘Q__züøñÖÖV|_ÀI€={öØÚÚþòË/ÎÎÎD@__!djjjnn>mÚ4\%œÀ½Õ÷¼ùîŶŸwfwígÏž1FDµõõõsrrð2F#Ö3ì|fõùZ_—çç燄„à>†††ÎÎÎÑÑÑ¡¡¡ %33SHHH\\\MM G»k׮ݽ{÷¥K—H$’²²2ÑkllìêêÊÇÇ' ÐÔÔôêÕ+„³r^¼x±uëÖŽŽ‰ÔÕÕÅø¤±µµõÆÅÄÄ„„„¦NJDÙßåçç§  pþüù”””qãÆ¹»»“H¤øøø¨¨¨èèh~~þÅ‹ã$1îHëïïîܹ””„жmÛòòò˜­ß²e‹Ð… RSS%$$´´´pƒ'Ï‘#G¢££cbbZ[[¥¥¥çÌ™3gÎ\% ''§ãÇ÷ôôhiiùøøŒ?ÞÑÑñõë×xƒ   ÌÌLEEžëéëë‹WWײ²²~~&XXXXaa!…BÁ÷ ÜÝÝwíÚ“••%$$$&&¦ªªjccƒ²··ÍÉÉ!‘H“&M"þÁ }||xyyq·Á7oÞàÙÈ™•S[[J|ËŒ¿Y,Xàåå%***((¨®®Ž·ÜEqÆ vvvñññT*µ¶¶vË–-wîÜNII9zô¨”””žžþq@&“322üüü|}}EEEŒŒòòòpQzzz®®®¡¡¡ÝÝݸY5>>þàÁƒß,!4a„OŸ>mÛ¶ !ôÃ?;vŒh›6mš‡‡•JíééÑ××gìÏF1rŽ ô*Áì¿ÛÀÀ ¼¼ßá‰õ«V­¢R©yyy$‰q}hhhQQQii©±±1…B)**ÂM ÌÊgVŸš8qâO ôîÏì®mhhøàÁƒK—.!„”””ˆõkÖ¬‰ŠŠºrå ‰Db\¿uëÖ‚‚‚âââÙ³g‡„„|üøQRR’YùÌêó5BÈÅÅ…èÆ<\×qx™™™ÙØØ˜™™±±¬‘ŸŸ_PPpòäIÖïzx;s”âââÅ‹×ÔÔ@g0BÆÚ96*.FFF{öìIOOOOOwppÐÒÒêèèÈÏÏçå厎¶µµmkk[·n]KKËáÇçÎ~æÌ™ˆ¨¦š@IDATˆ*•:wîÜÌÌLÜNóÓO?1[’’bgg§­­]WWWPP ''×ÓÓ³dÉ!!¡•+WŠ‹‹××ן9sæÿþïÿ~ùå„Г'Olll6oÞ,--M£Ñ***222š››kkkŸ>}zàÀˆˆ ‰™3g’H¤ïÖÓÆÆ¦²²²°°ÐÔÔtä>L¶‡‰D‚ÙËøÒÝ»wKKKB·nÝZ°`»«¸œcœŒ»“çÎ{õêBÈÑÑñÅ‹,ÿtÙ`ø[tª««÷ïß_\\üóÏ?3>/ÀbТ3¢^¼xqøðáÒÒRssóíÛ·³r×, ££ƒGõ””|ôèÑÏÁ0tcíÃÃ+»¹¹á©8nÑQUUewEF–‡‡‡ŸŸ_O] ^yöìÙ^^^8Ë.#Ò¢£ªªJŒà¸•²²òï¿ÿÎîZŒ”vu` ÆÚ92¸ |À(E¡PØ;Ä"#˜Ô\ p-tÀµ Ðׂ@\‹¥•JÅÓÕ‚1âСCëÖ­cw-£\1ÆÖGLß~ûmúôéx2—àààéÓ§ãÉ•†ÂËËkÔO`ee¥Ë`$Fªªª277dz¬sš¤¤$ssó   ÀÀ@777Æ©ÇúÃÍÍ O°ÂQtuu%lÙ²eØwQYY©¡¡AL?ƈ””CCCyyy ‹âââïn?\ç çœo\yÅ˸#`:ŽÎ®]»:;;544B ¥§§gÊ”),¬§ˆˆˆ¸}û6`[XXø»Î Bccãû÷ïÛÛÛ¿žFŽíœœœjjjðÀí]]]!!!œ0¤÷%$$S(”„„==½aßECCCCCC[[??ÿ°8SBBB`` ««ëôéÓ/^¼¸|ùò .Ìš5«· ×yÂ9çW^1Æ2îˆ<``kkkxxxKKKOOBOú…_JHHxøð!‰Djoo_¿~ýôéÓñú¨¨¨ÚÚZ~~~mmíï–PSSI¡P$$$¬­­-,,B|||===Ã>93x2[SSS<Ã0BÈÒÒòíÛ·úúúåååÒÒÒ¸’ïÞ½›5kÖƒ:::”••œœ–.]zûöm—žžž’’’Ó§OÇÇÇÓéô’’QQÑ%K–à)9MLLBJJJYYY¬9´úðჰ°0ã*•ŠGwUTTÄ£Œë_½zÅÏÏ?uêTb¥­­­¨¨hLLŒ„„Äo¿ýVXXxáÂâäa%cccüZZZÓ M›6íÕ«WFFF÷îÝ“‘‘‰ŒŒ\´hBHSSóíÛ·æææ·nÝêèèPSSóððppp(..^¶lYwwwMMMBBBDDNÇó=}ú!„ÇLIIYµj//¯ˆˆBèÒ¥K¼¼¼8讫«Ã]›ÅÄÄB©©©ÒÒÒ4­¢¢¢¨¨ˆ5G7PåååÄW¦££síÚµùóç#„ ˆnÚS§N½~ýú¼yóBùùù•••ÄÛõôôN:%..Ž»¿°Kiiiii)BˆF£áÎÈ'Nć”””X[[ã³÷áÇDOÒ•+WnÞ¼YYYùþýû‡Ú°anKMMåååMKKCÕÔÔà®Í¸½ýèÑ£222/^¼ÿþóçÏÙt¸€BBB‚‚‚ššš /_¾œ³0:O¢¢¢oÜqÅ5䮄À芘:ׯ_ò䉆†Fppp~~þ•+W.\J¡P233…„„ÄÅÅÕÔÔBk׮ݴiÓ¸qãZZZÄÅÅ›››ëêê#"".]ºD"‘äååeee÷ïßïééɬ¼_œ”’’úí·ßp}^¼x±uëÖŽŽ‰ÔÕÕåïïßÏÏeˆ¶nÝŠÖ‚‚‚B666!!!ÇGùûûŸ;w.%%!´mÛ¶¼¼<ü–Ù³g'''øðAEEÅ××·Êjjj:88ÄÆÆvww+**"„’““ñàNNNÇïééÑÒÒòññaÍ¡õGRRRaa!>ö®®.UUU¢·àªU«¨Tj^^‰DRTTôôôÄëW®\¹oß¾œœ‰$'''##søðaWWWüª™™YVVÖâÅ‹Ùr8؆ ^½z…þ.ÙÙÙyïÞ½T*!´nݺ7n:t!äêêJL1=þüøøøÆÆF55µ°°°õë×#„ôôô\]]CCC»»»q?ÐøøxÜ9nÚ´iT*µ§§G__w­ÜÍÅÅEHH(66611Q[[;33_ñtžàå£÷|ãÊ+FߦL™",,|ñâEœºB]¾|yÚ´iƒk‚â´„wD$„‹‹ Ëbb333333VîôöíÛëׯÇÙS–í4??¿  àäÉ“,ÛãPÔÖÖáSyT(..^¼x1~¼…ÝuÜη/°øŠadd´gÏžŽòrúô騨({{{]]Ýk×®åçç9rÄÐÐðÑ£G+W®Üºu+nÈðàAZZnÊzòä‰ÍæÍ›‰†ü   ­[·JJJ2&lllTN~~~œ>#‰Ä¡YÏQªªª !TTT¤¤¤D46FgÏž%~÷Œ x¤,¦ªªJô`„Àùö…QqŰ··LLLLKKSWWOHHÀßÝ€ò¥¥¥w%8´è '<¾BH\\¼  €5Œ–°°°ÖÖÖ’’{{{οrðø:!IIÉdz}@6ÀÝà|#°åŠ1¸aÁÊ„´è€Á£Ñhì®ç aw£¼¼œÝUcœo„QzÅ4HŒt6KLLD±2!0F@ °$FÓÙËF;tÀµ Ðׂ@\ ÿ²²²Òý žF!¤««ɸ}CCÃŒ3¾Ø «ªª277ïêêb]íÁ·èêêJ~Ï󌒔”ÄÕÞ¼y£  ðÅfXee¥††Fgg'ëjF8Çà|¬ töíÛDz} ‚³³3B("""66666vóæÍŒ¯†††~1¯ŒŒLll¬‡‡Ç×E566¾ÿ¾½½}D+ ¾ËËË !”pêÔ©S§Nmß¾ñU*•ºbÅ Æ5òòò§N þº¨††††††¶¶¶­0uà`@Ø °.Щ¯¯gÙ¾Ïk``0a …bmm­§§'$$T__?cÆŒÐÐÐÕ«W3¶ÜH$<{êå,Y²ÏÀgbb¢««‹'Ýííí=v옕•ÕO?ý´téR<(ƒ›…’’’,--gÍš•ššŠ_Š‹‹›;w®®®îܹs-,,à§Þ@ihh „Œ}}}W¬X1}útaaáׯ_+((xyy-X°€ñW5‰Dš7ož±±ñåá!DUTT$%%ñ4õ½½½±±±ºººrrr3fÌ`[<$$ÿd?pàÀ´iÓ”””Ž=Š_ WWW—””TWW×ÔÔìèèéŒ(8ÇÆ,H ["GçXYYáqqñääd„ŒŒLLLLEEÅúSBddä7âââ"""ñ\ÄT*5;;ÛÖÖVZZúÅ‹qqqd2ÙÎÎ!´zõj11±¸¸¸˜˜˜E‹IIIåää¬ZµêñãÇGŽquuUSS»téÒ­[·zzzF츹™®®.^””Ä#UÈËË'%%Ý¿ŸB¡ô§„ÄÄDž $$$//ÚµkWzzúºuëdddªªªÂÂÂÈdòÆB›6m’ ±µµ•‘‘ÉÈÈØ°aCYYYLLŒ¿¿ÿÔ©SÏœ9sãÆ øN¹œcc³³3…BÁ×y„ÐóçÏãââˆWCCC§L™Â¸=N”••}}+!’0Hàñ@gûöíŸ?F•””x{{óóóGFF’H¤‘ÞïàÄÅŽ}û6""‚8áÈdòìÙ³úYÂÔ©Sq´njjJLY’‘‘ñï¿ÿ2þdggã@GNNN__!äçç·fÍbYYYQQÑ'NL™2ÅÀÀ 00ÿ;JMM­««  ¦ "“ÉóçÏ7n\?KÐÑÑÁ?Ê---‰9¥“’’šššÂÃÉÍÒÓÓñMhâĉ3fÌ@…‡‡»»»ÈËË‹‹‹ÇÅÅijjGFF Ç!6ƒsl "’ÍÍÍIIIEEE8 ð믿â$ãÄU8 ÀËûå=wÉ’%ÕÕÕ!„’’RVVVooï‰'Ξ=ûîÝ»I“&ÙØØó·ÇÄÄ$%%!„|}}SRR>þìéé¹jÕ*„P\\\FFƇ¤¤¤xxxrrr8g®4öF#èÿ¥»wïéÝ Ñ?þ(,,l``Ðÿ+TÐéô9sæ¬]»–XóõÕgÙ²e_¼åèÑ£ÿý÷Ó§O ŠŠŠ._¾Ì±"'366566ÞH‘N§/X°ÀÓÓ“X#,,üÅ6«W¯þâ-/^,**ª¨¨¸rå F»}û6|§\α1 ’ýÄÞHRWÿEL¨&$$¤©©I¬öìYmmíÓ§Oñ«3gÎ$“ÉÏŸ?ùòå×ëBbbb¡ÔÔTiiiVQQabbB£Ñ”””´µµëêê äääpOyyù½{÷ˆ]ÿðÃŠŠŠ!''§ÏŸ?oܸqöìÙÝÝÝùùùýoX¡'Ož „h4š°°°žž±þÑ£GÕÕÕøU))©yóæ‘ÉäÇWUU}½!$!!:zô¨ŒŒÌÅ‹ïß¿oaaqáÂ555ƒššš¬¬¬‰'âþUwïÞ---%v­¥¥¥¢¢‚²¶¶þô铯¯ïüù󻺺²²²à;íàã 0*°.Ðáð˜P !äêêJ´{xx¼~ý/ dff***º»»s=BHCCÃÉÉéøñã===ZZZ>>>‹/VVV¾páBjjª„„„––niDùúú¾yó†Øõ²eËvî܉’••ýüùstt4BHUU5::®V…»÷»¸¸ „üýý·mۆׯ\¹²¶¶/»¸¸Œ7þRQQY¹råË—/¿^š6mš‡‡•JíééÑ××ß¹sçÊ•+ÕÔÔRRRŽ=*%%¥§§‡s ¡µk×ÖÕÕ»^½z5¾`M˜0áÓ§O¸?üðñcÇà;íàã 0Pl‰H!ÆþüÜÁÌÌÌÆÆÆÌÌŒÝqùùù'OždwE`t322Ú³gªªêw·LKKÑq÷G I€DDD|øb=BèÉ“'666›7o&’ÆÆÆ4ÍÎÎî›I€›7oâB“‹-ÂI))©?ÿü3??¿¤¤„Y˜ëáááçç‡ôãz$ RWÀÀ@`@<ŽÀ×rss´óõõõõõe\ãîîÎø<!//ï›%;v¬òÇ8˜\ p-tÀµ ÐׂÎÈÜàÖ­[x,)ƒF<¸ :£ž®®îöíÛÙ] õ.\(''ÇîZ€aƶ@‡J¥Þ¼y3--]à222ca\D\†5‘Àà#GŽ$$$˜˜˜Ðéô?L›6­ÿo÷òò£`4‘Àà7>þOCÚÕÕåççG¥R‡¯bàh£"žÔÕû÷ïEDD×DEEá¹ë”””××ÖÖòóókkk+.\(**úÇHJJúûûççç_»vMJJjXꀑƱ‘ÀêêjooïÎÎÎüüü””b}RR’ŽŽ>ªœœœ“'OâÙä“““õõõñúÜÜÜôôt¼ý‘#G%%%B .455…(à|œ iUUÕØØØøøø²²²øøøÆÆF¼þÁƒÖÖÖxÙÚÚº¼¼/WTTXZZâe+++%%%¼`¥Q pФž§N²±±aw-À# pD·ßààà–––ÂÂB///vW,5r‘G: …ÝUÛŒ\$ÀA©+€á¸:àZè€kA ®¸G<^>B²³³>|ÈîZäÅ‹ì®Kqm ãææVYYÉîZœÅÙÙYCCƒÝµ`® tìììØ]°ôÑׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tF›ÿ™=V3ìÙªIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_post_read_request.dia0000644€ÿÿÿÿ00010010000001314111727205031025630 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöEéf8-NL|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fulnÕžÒó娣íKî"Ìêˆî_©ŽJú0P€[äVÔ±=k ÕÑú> R:g²6¾Zmtý®ܸ,·ÑJDàfwtÂ{Ëo®v`­©©z{oì¤øY÷[}{£qà…ŽV;ÖíQH¥%/µ[o’qDÙ–ró]²3“ uÓèx£›!ëæëÕÍГÝðê%Qз¬V)|؆ÕÚž±l´fU|Š*ƾ\HÍ®‹D¢TF©=¾4[RƬ5ÑF'bðJáÖèe@}ŒY_¯:*Ù—>¢EÇ­HâöæDØŽ>¶g-ïŽYŸ¤Žªuô(³‘ûÀ¿j¢·‚¬ ·qæÑ»†)ok¤ÖY%_¯JvNåAÃQj Pš pæ %ˆ¶¤„ÞõÄ»à`„Š>²fÝõÁdå´Â€–‚6-Xcy•3jé•´Öà*«ê³PÕOÅ÷U•®vÎåA[OÒ-ŒUšSW)_€(Réa2gK]•­)¯è¾ž³³‡÷~swço»Ü|ÔÚhI‘„e5fyo§¹þÉáÔ1‚fT©ÕœùìÑáÍ7 k~Y­Mð;¿¬ïWÙm|¤žp s¾àh¦vúf8…‹@0àm Ct”Á©hº:n¨c³ÒƒW1$Pø3 ¼*ØÔdó0æî/ËmÁ@çD+B¯ãµÐF@Jh1ú„Q™¡FŠRÇ„Q3Ã@-›KÑp0T½«©J/ÃÀ+³B­5À«ÉÝ“´Pn½ï¸}5‹°“aïUÒd´ì‡`…¶IalPÜš\ËfÅRü\²´ëU1kòëÒdÓÁ®7ñî/Cß0P&윆zÈš2MQ@c‡ŽŠpÛž¨m3øáÇuð×ÙÅåêà×Ét…·ýõÆ¥ˆõÍ.x¢…w…2‡YOºç±Á€»ì­a„ÂÇû‚$ÿ{Y,W¿\eÙ ŽlHfN Î xÚÍ %]5”h+bjâc÷ç€òà·b4Æû~ð_ïçã«ÝcÉ&”¼H¹'–GXq¤{s0%|¤œ1ò¦)Q㬒’1CEA@_š(­s‡va¤d_gWèR+¬eXQ¦s2¤¦ž¸/Öìäˆa-u¤{ü{¯â(ÙÚéR!£W83® &lÊ*7B¥ o`EÆH”dÔ:¥ZÈ(©z´nÛ­ùÉLŸõµö¸Ô´®µïådæIG ×§~7I?ÐGòH§¨F ¼ÉÊÚHõ01Ú¡²Âz—êp”t–?÷¯šÍŠ¥øÁÀ¹´Ô:½ IìI8l¡,Õ.ò‹FB)åQ4L ¼Pë=FÑðü¢QÅdeRh Zºß‚ázHDåM·BiÞʤ„tÓ£–Eu¥làO¬f³¾üWª}Û¼”ÜÑîåû0¤‚öÔÀRf;JiЉ ®CgèµÒÖlÁŽªb³^ qáÞÙPfGRúB…f.nRYÍlÎ;¥©ëF´Ñ¯ÑP'Êκ-ˆa%ŸõrH+÷MãŽä0ö!‡Mj¥D Ò3Ëa°.Q’!¬á¨s©ÔmÇXòïMä·pª¹|hòSt­'?ín/Ó;2µ;ŸámOs,©7)º ‘­†¸‰EkR=¿·^1Ëb-£™¸Éʘ–*ëT.6ÜH•±ñî#°¶¤Ø.šívÓ@wŸ´â×]zºÉ6 ß8Dëúðy§†@2˪a§¸»ÕrY±”:ÎËŽrÕð¾V ן4@ÀŒuÞi÷£UÇ\òg„¹.ùóTýçö"éõGN®ÎÙ^ŸËµ9=9¥¿N¦Åòj¹*Î;èEvt>÷BKˆ†öuÉ{éØkJZúaD/¤&`¨X‡ ÷Âd“&ÂJxÚ›àÀ!³çéþM'Ç_æ‹ÉpKMdîóhº,:AD[MN{ Ò“-Ö9±#ÅkŒ¹5ÓQØý1ÅÊÂÆl‰mÍÛÄlŠq‡éœ‰#yaãúáÃ¥íK«…7r§… ˆÌøÑ~|˜,Oç?þm4«‚Î T¨ßÈÇI ›ðB‰v2x"%‚!y=©>ŒR›%ë ¦~ØlâÊi*rt&:cñ!Îùiï(²eµ×F¹Øzvâ+uå>§Gvå^+÷8¢vï(ÂÌÞXÖÑÊ@î© –³²<w 9´#wA3‚f}!Á°šôÓ9mÖ +ãúà¾uZM# µèØRJtJOqHMI .¤îL£Z>8ŠH 9?áuå'¸]Íuàèjþáê¤@Sqg‰H0}ƒbTœ-F+ôÛ+Áô0F¸Ó@1×=0()¤4L '““ªl§3À&Ó„»3Ùì¸1ø½vZKëuh—×lfi?Ä^©…uè™-¬Wä£> Zm}VAB xÑ0÷Y Óô³Ê>«Îª­ Y39za2Ck†Ö ­¯Z»ÏÙ».AƒNµ­o`=¤L5…”†–ÆëAJ’SÆ:Öˆ`LfhÍК¡õ…Äÿ{ŠÔ—•¡AßC¿J꘭ˆ¼+­I”ŒEJCÂZ© G4m‹Z«}0ÙRˆ2Z:gh¥•>rBª§Qð\P^…Ø6–2™áÍ;ÞL¹‡@ÅgznÝfèÞiîº-"oWúÜu¤+5úHב®ÈéêƒÉl3d›!Û ûl34)U2Ý{&^OÒÖ³‹nXI‰6SªzLM¯Qµâ-Uê…É\ª”K•2¢¾ìì Û¹â RX RÁiH½_Sn†ÖjH1|‚”›¡ ÷Èù:.8[À•Zûœ›ñªr3tèÒ;ÂŒíÞxÕ–s:Pi‡AJ&¤Æ«Î:„ œTiªŒ±üSeêø¬ìaöcië‰,8ÐÌüA“õîCóíé-³l—«Ñbõ¤éÎ×Þ¨Ý&Ú;¬õ„ÐV8jî—ZÊ+f¬ –zRX“°BEH”•ó+ªù¬îwè õV#U†Š /*tP±ÞC¹§NQÀDGš+5˜aiN¤ñqør HQÉfe»SCQyš+mÍ *žT˜> ¶å€—å(E#™¤°Ê&‚Ö[À hæVUα&CE†Šv¿ "º˜¦·yUZ`MiUhó¬ BGYŽ•“Ù¬ÈXñB°ÂõØäVDãÒ$O¯“Y¡lÔ +bÜb\3<ê((ç ¶Í Ê@‘â™…ï(`k¡ŠÔ»( "5¤“å€([ [ hª YÚBÜTÙ¦ÈPñ2 "ìÙHL£Uˆ‘ Â‚,Cìí,žrþ…‰RÑç4Ñg¤ÈH±[¤è4Ès4Øh€K±O\⋸`tëBrutð – m¶j+\z<,¢¤£Ï óÁl¦—a¸ÎIŸÊ ©Ë"_Ã:üO9ƒJÓ`œáèS•D`Oá¨a³z¥ñÉ ÑïÍÄ÷ë´EZJmîx®ï¯¾‚Ôõ‘¹¢¥9§Ê*P¼›^ði¢ª)sQ!Å¡Ãà­ íƒÉ&å ÔO¤V(Á ¢f­¯kS8™/ÆÅ‚a÷ìg€ƒ>Ð9ú4«1Éó³"JZhüŸ'xŽ%eמò6Gük4Yå ã mÿke0Oè<>ΧWuæ]÷¼;ƒYtÒfÃë j@éÖhŠP$z\Ò´¦|÷æøq㮎ÉÊ¥²ùRƒÛ2äÛž£?:·±ùEö:§RìQcº§ŸEá•6øµ/«QÀ %@J)ýÌG²‰ŠdY¦ŽÇÊ¥®ùÒÆÏo}hÝæ4«Ì¶UÆöл'* tN¢õ†w“Q”Ý€Ø m2Ú«”i¡Ûn¨2u¥ç³hãÔrÆ”SY2VqÓ5¬f1)§\S¢Ú?RNCVeÞEϬœÝ™ÌÊ™•óiF¸ïž+B1E5p’5Yä% HiDz ¶§¼M#üðÃM–ÅïÅ×bšmp¼N _‚ .woƒ×!‰êaìØœRÒÐÂÚ!¤ž?j|œ/W£ñÚ{ß=f„MÐxó~>¿ä¨ÀŒ¬˜=`†ñh¡;ÁšÜwMÆ ëhH¤‡D³íIð6áãÓb4[fÐà ̸ÁŠºÜpèýR@_Ílq$J^8‡”R›ø’rlOy›ò·Ñŧù?VóÅè¬È8‰#Õ™¡„Jú˜Vm-uìÇ #H…ò®†àDLƒÛƒƒGô\ŠÅÇÑbY,2zp¢Ç}!ÌÈÁж#¿4àŽx¸Ô$BFèDp¿œžËì¸ð›Ò—ƒ1\O¶†av‚†bb”Z»±Ž_.W_ŠYÆ n3ÃäXÇö@Ã÷afP6<·â(û–ü-(gÂí…BñŸŒ¬VƦðeÀ`ŒÐ`xÊyË ž²ÒyJJ± vNSðj-8Ñâžäe´`E‹ØKƒ†ÑRaä¶1ˆUª™€#¦1¸JÈÖ”·‰¿N¾_^døà iT‰bÆN Ý“H!ù•üÊFF‰ÂÍaÃ4CkšÛÄŽ”œÑƒ3q´Z_vÀóÅÕvè0_ó‚‡"3#Ynkºq/ä÷ùYNð¨”ÂŒœ­NCÍô¢ !UrÅÚÙ‡jÆ$JJFj)•5t΂/5¯Ój>+—:j#"£Ì“Ú"?Ní‰%°wšx*ÅžP¢{Ç<4 ƒ÷¤« 𢄉ƗÊW¶‘Õ*:sÓh}p£DŸ•(|êÍ¢ ä¡$v]Æ9 ©v§¹µÜÒ8‡`z€$'m>À3.Î';ÅG“Éé:™3ÀHÕlV.¥ù2©ošyx]†¤ý„$½#H²=@’×¾LãíKŽˆ”†iá}pIÞ«ÔòÀz~Hªd³‘¬)[QJ ‘2"í%"™!’ë‘‚ eÓUÃn#y_v‚M±`µJÝ|¢ß‚TÉe5 ÉÎÀ¤V&R¤½$»#@ò=’u>%¾ç™IÖ…DH«„HNj:Ý4ªm"ðS©šËê0’-?˜ŒÙDʈ´§ˆäv„H¡§Íø¤€Ö[^@Ò6–„ŒòÉi ÒÑyºU>nÁi«b³‘¬¥|ʸl#eDÚODò;B¤Ø"IoË ¾`/$I£SGdg´I3¥R)Ôl#´]Ígõ¸5qBK“2&í%&©Ý`Rìe"r°iàƒtQóÎÜ´’N±’‘šFMèt©õF"WòY±Ô‰(}J’6gdLÚSL‚®˜T¾žŽ®ŠÅÏå üs¶ÿ|ðÿÔ#çummod_perl-2.0.9/docs/user/handlers/http_cycle_post_read_request.gif0000644€ÿÿÿÿ00010010000013265611727205031025655 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££ŸŸŸ›››™™™———•••& “““‘‘‘‰‰‰‡‡‡ƒƒƒ }}} 5{{{yyywwwuuusssqqqh®6ooommmkkkiiigggeeecccaaa___]]][[[YYYUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôô=fòòò???ððð===îîî;;;ììì999êêê777èèè555æææäää111âââàààÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈ$=ÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®,J¬¬¬ªªª¨¨¨X“.¦¦¦¤¤¤¢¢¢„ÞE   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ|Ð@ŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXq¾;VVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó@@@>>>ïïï<<<íííëëëéééççç444ååå222ããã 000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠTP©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœQÙšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=²‰ ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî‡iíA6 d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(â4}PX^gÃ@ÐÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb:L¦þ¡¸Ì©´Öjë­™¦š£}ÚÅ!±´à‚)®àÉŠ’ˆ‰Š X´†˜.à*í´ÔVK§®Ã­ŠÙ§~D;äGà CãŽé­µè¦«îºRbû¯Š}ê‚E@$%0¸C%D¢D+.ørH¿ÿ<ða”ò ³´:d$.´ò‚+¯ ©.d ‘¢ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¦Ð -ss*3ìð粫óÎ<[ë®gð&öé IFâ‘L@dùtA-E2í4ÔC’R‘ AD¦Q‘(™óÃG™ôÒM?}ò‘Vc}ð*o )ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§#‹‘1yn΋MÆ¿Âu‰ ØJê}x‘•wѸ“(?ÛÅãK>ä>§ yÂŽCî‚éŠû-ûì´#úsgA#&o†#;ÎyÿÞŬH΢dØFjî;ðÌ7‰r C_¼æO¤ôHê]ûöÜwÏæíœå~اôЂŽÜ;¸Ó…$žÙ‰ÒÍ3.<)š ¹É&D®‘ ‘5|‘¤Þìsü<'<&¡Ì[ôK@Ð E)ÿóž'HÁ-o3â3Œ¯ö‹Œ±Dª„,\‘uAר@p T …*d¡ »ŽÌ¢©ø€ˆä‰¸@þ ‘@‹¨`òÒ \pŒ¥.„#,!‘`¸Â2iYËñjxÃîH;葸ˆC*‘‰N¬ ×ÈF$]3,Œ¯ÚHÇ:ÚñŽ‹ân†Ç>úñ|ãeâH˜9òˆLäÎiBÆŠŒ¤$'y*FVÆ‘‚$%7ÉÉN*Ê’”Ád`4y)BÈà”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0oIRr2¢ )-%f(â™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:»y{‘ꘒIæ_–Y) Ì€øþ̧>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'jP,¸sTðŒŒ<ýBOJÙ“¢ ©HGJÒ’šô¤(M©JjQc.[}ÚCõÑ•Úô¦8Í©NwÊÓž–´¥ï|é»g™ŽNª¦>MªR—ÊÔ¦:õ©*F… 4¢Vƨ’B*T·ÊÕ®zõ«`%¨TE•QÈl´/X”VÃÊÖ¶ºõ­pýéEÉJUÜY•2iUÔZãÐLœ¢| ¬`ÛÕ±†ª¬9+_òš¨½£Õ1P àó§8E52»ƒËfv³§è,1B°Ù ¢Éh(4k hˆô„þ­lg›S ±ŽQì^‹(Çcù.>SOá —¸¿-npó‰ T¸¯¥­t§K]ŠÚöozôÔLAå[èB·Ê%†ð ÞäŠw¹ùdÅsù‰„¤ -0>C ËŽ ömï{ã»OØV÷¿pTçzغ†ï®“áí¡|»ƒÌ†–ŸÐÝg„ÃKŒ@b½ûäÄò‰‰{à³UÀ'6LO sØÃùô¯€WÌâ_×UÆ ‚%£`Cu½úœ0ŽóÙà …®k‰¡ Ÿ"“Àg@ψ!ŸEv0’õ©â[ùʱ}ñ¥pÛÝâ¥Æ…º1…wœc#º¦Àgþ.þÉŠ&$£ú\ó?«Œå:Û¹­Z¶—ã廀™Pb6o™û©c ºþÕÀ#üYLHbúTôœïLéJ{5Ï•Úsbúl—?ʱ ˆìd«q‚.à³ š=…dó‰êÍ®z´›5E3ºZÐþŸD¨+N ŠJ¨CŸµ¸Å>s½ë^ÿš$8E42ËdK;ûÙ=Å4¥4N×ÅÓ‚ò-´·Íín/TÚ“¢öa¬MlJÛÞ®42æÀ€I` ¨Dà "¤ûÞù·¤ÄmrÏÅÜ€B7¾[LŽIÔbxP† N‚Lx¢-F9êQPÜÃÞlMF6ÎñŽ{üã ¹ÈþGNò’›üä(OùǧÀO}GŠßÜ™qdž'ÀQ Ä3ʱ4ƒ+Á¨ƒ’°Sû«a¸À–Îô¦;ýéPºÔ§Nõª[ýêXÏzÓ!ß}ºü“1†£Ì-´ÝLÙüæÓ‚(à0‹:àb,ÐèD9x¤?àxÏ»Þ÷Î÷¾ûýàOøÂ^ïèº>¿ž(˜Æßr¡9žÎŽvÙ!jH4ТŒ!³æjî~øÒ›þô¨O}êßrß6샻šÊŽ)ÊW~°UXÂ3®À”"y=éUOüâÿøƒg½×]]NÅtp´¿”íoÏWr|ÃowËâþÑ€­Žùà¿øW¯ø|3ÆÙe•©¦Oý·’! ËÂÑý§~üøÏ¿þ÷®üÅŸ˰×H²÷(ÑÇL÷Ô~Ó X@tÑ ë ö7|û7h|ýg~.•~2µ~ˆ€´E ¥`ðØàT÷W(˜‚¥wøÄx¶€—4€½R€õÔ[ûð ½5à!  &(*8„DØw,H .x(Ž7’w'ìwƒ^u„P2ð 0ð ³à~€¢`DЦÆT'X„hˆ†G˜„†²„‚Ñ„pñ„v…R¸U]€6Py°U±y`(p¦° Mu†i˜zþƒ` ‡Xxkøzƒ¡$ƒñBƒeƒuÈW•  V± ` ¤ ¶Ð]@0 $ ê@”@´pŸ $0‹0s°…(„—ðqÀˆ§ ΀zÇ‹¡tÀ¨z°ð‹hŒ€Œ(ŒÄ˜w˜Î·G˜‰ƒµŸX@à ¶ Ø Dp4À‰UAXˆVA ó‹|7Ìø?àg€z#°ˆz'@Ž ‹§—–Àþ*(ˆW~-‰™&‰ÈD‰Bc‰G…‰ÚøV7WQ âð &@» &0 ¢pV¡ŽWÁŽVa§0‘Ðþ  ‡€„P€ °ùPô mÀÔC_à Y€ ÖÐàfÈ` eˆx‡ƒÓ8†0ûøŠè ?€wÎð•—0•Œh–QÉºà ¿˜w#p΀•# w?`ºðÌx–úˆ–—0jÉ–ÉX–Wé g†ˆúÈŒúè—kÙ–y7\ ^ –1–—PA¥Ð—ÉWA€‘VQ ™ M  ¦@ŸàT¡’S’VÁšT%¡ø@rl°é0ã\ Ù@Óð N  Ïà }‡?°Äøp?À •— Àþxeþ9ô xg––pŽð€õhÓøJ÷0žxçœÐ){¹ˆá鞃Pžþˆžïùœì)?°Œ‹™—÷ižŽ ŸÕyÙùÜùŸ—©HÈÓæñ‘º#‘YE‘V{p% S§9+}] '‰.}TAp€¯@1² Áv¾ÐÂ0 EpKÀ Ï Õ`ÛÐ ^0cëÀñ t€zPÈÉwùHºð—` –‰wp•:#à^˜e9Ž0—»èôøÌHÕ9lªZJ–—9Ÿq¦`©¦ôئYêt*Œˆ}ÙŒþz§Ô™Ø ¦b:¨‰™S¥™Ee¡j…¡êU„€|à êS¡ :ê   à Æ`  @Ï0‹œPû° "ð • ¶pGlRzeÈ M Q` ØÞða èîðq` `É)WJŒù¸¨|©žÔꦂú˜ýøÎŒº`d‰˜¨€­óÉžáŠwãZ_y­ÞŠ®À(ïJtª­  ܪÔè lX(npørX'tX©<¥ú. »°(`ÄÀ ÝVÐ=•ŒªwÖI§àž° •°0ÓØ­ß¹ˆˆ`þ–0{ç àhinêœzi -û²»³|÷±Ô¸˜þj–´AK²&‹²cš­gªò|‘Ê™ ûU…а„8‰€ÇÀÜbS`P,·SPInZ§Ó¹ŸÐÉžŽ0Ö à•Ù—ð#0•†@âI†ðlzý¨•gk[˜ý§ñš·{k˜~ëÔÉŒñ)Œh‰«ˆƒÀ·‘KðIí)·üY·l °nªQ:>’ªW”ZµMeø€Ou0¿p%€ Ä æ@ Öp p ¼ŠSPéŒÃH—v™•é ãê°¨e鼂k ÆþèŒøy[–jyÕ•àÞ+w‡?à âË‹þ`¦Ù»½ƒÐ½ßûžÎËyùΰÿØÜ« ÞûÀ8Î Ð+½|—þë¨t©WÕºõº°«Tq ›p–O±ð©tQñ` F@H b\ÂÐÁ9űX„|™\` ŒW Ü[üÀ=å ï3€qøÔÕÐrí°ýÔj0 S$\Â)h Œ»)üz+œ`-¼`/ Ã:Õ ÕÀ ÂúlrÑå øN©Oî`@ˆÆkFŒ‚ƒ°¾ ÆÇ·Ä͵ØX* +Å%E¹Ù0düÔþX ëý Oà\û$|ÀýÆkÉú'ÇèwÚEµxœTrðÃ`àÀ@  ã@úÐOï 7UÄ’<Ëä÷´™iÉêgÇQœÉ*UzÀ(P .Phá ®ZE5Ó 6%Ë´\͇GÉØÄ4öÄ6¶Ë¼|RÖp`_Õ ð¹ƒW é èÐOaðOÐPå1ÍplÍúœ|¦ µ#µ ŒÉßœSÃE0ÆÕ Pë𠌀 \ @Ñ0!0Ïý”éPòÀ|P+EÍû<Ò~‡Í‘¨Í3ÇþÍaæÍ=R’õ •ð Û T ¬`žŠ1øÀ=° mPmX• 1j *%Ò$ýÔÿjˊ˨Ë-Sâ peìp@ € p÷P¶ÐMí #ðÖp×r=×t]×v}×x×z½×|Ý×qÍý|Ët|ÉV}Õ6Eʲ Tè° ñ RÚ u–}Ù˜Ùš½ÙKWRÀT½™…mØ*õÒñJ@&Pj€Ú¤}SK( ëK'wÛ u‘ÍÕJõÞ@Pjý ¼mS³=(µý·Ý¹='»}ÜþE pp¥ tÀ,Ý(•Ü‚²Ü~ÑÜlñÜrÝÜ-Px0ÜJ5eHP­¬}Þ#åÝÞ}!ÞkAÞqbÞôíOÇ gÌTŒ0 e Ž ÿMRö (øÍú­ü 'þ½àûTÈÀT‡dELmá Õàyòॱº¤Ò€ÆÒ$þØ3 Ò‚å ° /n]§»o©kV*.G,þi.~ãÿt ìT„°áå x ñ,äeâx‚âxái1áoRá$þvÀìÐTÌÌ¥ÕíäOžã/·ã‰Õã…ôãÙäd®O¯ÆÝTÒàæøT³‹b!e þ©Ðç~þç€è‚>è„^è†~舞芾ènŸ­Â¡=µ£ýæ¥z &[ Ê0RbПê¢>ê¤^ê¦~ꨞꪾê¬Þê®þꣾ =Ճˤ‚å ^ O%ž¬PO0"%\0ÈžìʾìÌÞìÎþìÐíÒ>íÔ^íÖ®ìÀ0ë ]ëU}ëvNækÀvbNÕÀPœNPìÇ~íîþîðïò.ïÙþèLé=é”>PÔ}PE u·PM0ÃÄRÆ>ïŸð ¿ðÕ^ïËçÏ0UÇÞ¾ï…â^‚ÓµÉÃRÏðÿñ ïï?þTÍÂMñÿô„Oõ~àPÐÙö`ðíò8Ÿó:íÚéÜ.Ú¯òµKþëN•¸èP¢H=Q¿óPõ ?ò(Øÿ,ñ£‚ëÜm нUîP UvÀ¿ëô7/õhŸö×Nõ YòUuòNœòB¯OУE `«Pãõôjß÷~ïìlÿ noWp¿Ír?÷ø„ \ÕäîPæÀt@ fÿ÷–ùÈøP~'R~TŽVî&ZÏÛFà \Õ eÿP4Î •ïìpo€ù´Ÿðšoæ`‡Òdwøs_ð ÆÀU-0ß å0Ç Q|¿ì±;þ çÏ?ûµ?ýð~ûƒ`…ŸÒ¼/ôj],FܵüÊûôÐðèS@ÑLxè0P ï€Ó…€ì``Åó ÌÐ1Eà”M\ôóbàB† >„QâĉÀ ØK€.=~RäH’%M’ÖÇÖJ–-]¾„SæLš4@USçNž=‡A8TèP¢!%ÌȘTéR¦M>…UêTªU­^]j@=hX½~%&/X¦ÁJĘ‘cH)Q’lÍ7ˆ~܈kàM€wà¦PÚ€ãMU/ÈŠkñ´Mi@ß-çÊ`ØÀ’²Üþ£ZôhÒ/*ÝXTõjÖ]Rö„[6Ì›9g߯ýògkÞ½K%\øpâÅ¿žÀÊøòŒD‡&@¼wnâÁ™'§:vìàãO?>7ÍŸ¿™nbÞ7 xÖ~á§fh3%/ô eN‘ ?JC0A!²h©Ô|ƒÂ×r£°Â–j³0CØv‹°CÞ€c.DG$‘)$ÞÑ«Äá¸c¹Ѓ1Æ›øàG}ðÀÇ;îÔ“ˆ=÷˜ƒ¡ 2¯=§xžT¨ç&}>X0J)Kk5Ž<IJ¨ 5ä26 »3&³$3(UD3M5­Z'Ö„3ª;xþg ( y¢™&–a"¸Aâ#Œ!â)1¸Xï¿…’dh)òуÿŽdtŠ{0ÁæžEvÐCŒ)?õ¡*“z°LSGÚ2LUeúrÕUÇ<5ÖÎŒ³V[Ñ n­ŠˆT 5.éîЈÈ!\±` P{R<¢œpTá¥ÉV‰%¹{º  €bTh%7¼ µÝvGÕèJYçMÕU{WjõÞ.a7VZy8ààÀáÇŽfŽj‹s˜«¹ŠE¢Bð0.Â9  ~è°â&+¼,”;èÀâ ÒÑ€y„ÙÃ]™?…£Rû=µ^}WÍwç ùþŹÌ&ºh¨> £²F’¥ÁCm„3vf«¯Æš¡š‰¹9h2uö̞æh¯±ziµ&‚ ÆZ[EnT!f4¡:â¬÷æÔ­»>ÛC°ÉÖplÂo3;ðÓŽ»q^ó`cÏ’7–{db  š¼û=ôÿ–WqÁU:þ¢°×¾â èœÿŠ´Ãh¸IþÈÂ>÷50tðÓŸoæw?/á„‚²É_…Â?vÐ+¯€p‡J,Ç'Ȉ n·¯0Ð/Ì5Øš ^'ö³!L28C“pЃ?œÊ1à€0ல`NW0‡› `zƒa¯&Cª¦†9¬ ±Ø’Vq$>bBødO-*2&—”q@ äÊ ¥8G¿)/^^\Í·È* î@Á£jÀ(FB&„›($V ¥€à&uXé8É)Q1AÑ£_¢E?vñ’d"Åx"€#{/¨‚q&¥˜á&(LŠ ª"7¤Â–·Äe.u¹K^öÒ—¿f0…þ9Lbâ2v´ó>Y’LjòB}t¦˜¹L3!E”×lŠ …TÎîtP‚ŠÜVŒ ZGU¤av¶Óï„g<å9OzÖÓž÷Äg>õ Ï"Z‰š˜|^4uÂÉ=zr™¡Ä¦U:wHP€q¤! ¦hà•Ó0OºQ®)óŸ!i¦@ ºEƒ~¡ÕÒqL ô)€ÁR®ðóØ! pK¯ ¸‚$¤Ñ)KzÉ“êTvºINg×€MÅH 1 "ÍÃ}èÒ<¢%@`(£«=ä~T¹{d.[Eè®7NHPÖ8¨ÁQ„PvûH‚Š(@^ °ä ¸†}ØÞ¾w‹ñ½ß|yX_§É÷Y7Z¢Ä@vMhCqæ¦H‚ ÀJ´™ƒ ÷ÁÔt0!L?þ ÏÂ-&^är¸„ ôk*,àœ8¶ðqŒ»/3Æ9œñôj¬Á/9D¦¸‰^â~à ”{EŠ#r<¥á„ [jeÙ5ù“O¶a”¡7åV™ÍÅÉG]#wŠ=èu%Û€:(÷ 1¬i-âv¯¢ Z4Úцt¤%=iJWÚÒ—Æt¦5½iH«×Í—„óåÌ::ëÏÎw&ޱ‚ÛÞD´XD2Â¥ÊaÃÄ9¤r"}ï*ãðÄ$„=lbÛØÇFv²•½lf7ÛÙφö°ùPÙd*V$¡¦à¨SWêøÕÅ!‚`¼P u ˜Š¤Ð¬þŒC>”„÷‚øAíŽZ¤ƒ=lL´}8n[ÏÛß&N¹`ŠHäe¨ã Šâ¬A}Qù&¦öëwÇÛ⤙·?íýlßoß„ëwóþ páá&b& ÀŠ#8Î!°U`ÐîŠ_ܿɸò6Îq|ç{“†õyÈ_7r’ƒ%ø@Ô«Þ¥)ÁÄÁª¢ °€æ7Ç:Îéýé@vœ~'›ÐMGô¢{¥7±ºq“ÀB©ÌÙ¸zÖåîœßqçñúôÀ6±+Žìe¿Jg€LÊááŽ4?$Ôƒ§Š»ç>ù…Ô½Úw¬Ï kÍÛ¢ïû;à«Ràþ#ÚóÆxHÝ*’§<å-_oÌçz{÷ÙçÏzÑKÅv#ûÇ â¨€XVxûúšÇë³ç:mÏ:ÜïL÷^ã}ï¡âŽ›Ä5¥ÅÁB®¢Í%P<"$Í¬ÑÆt°k4ïQóâ'ˆÇ á°†@üðŽ0ÄúU¬éKêÓ—ë šìÓ>§¨„›íQ…F Žƒ¹ h(˜Å› Ø{ˆáƒ:˜‚D¸ È¿÷ŒW ùrpƒtp`¸ ÷;’Éû?Ì˼ÎÓ7 Ë7ÄL@¦È•ìŸ `;°x:¯ €¤ªÀ@‡È h)¨›h(†wÐþ*((;x‡RÈ¿$a¼€‡)¨‚‡+l€à°ˆY Ì4óàRˆ3LC*XC8B]a |ÀE¡ûÀXFà…xÀ ’|7xàƒTl(†uHIIèôñÆŒ¬8–tÉ)€I™ˆ÷ˆ†ÉûÈn ‚,ˆpimxpÊ(ì„JÔ¸»ËD HWHY)Hƒh¹þ™ev`+Lè8V…†$ˆ†m(6>WÃHö蠒󼸷kTÉXȃ ¸Fl¸lO‡tHÉœ‚½ á‘™ À}‡ì’G˜| -… !өܹ3 ›4 “55•6Õ¾)˜¦“l4€‡ŒÍ¨Q)¡LÊ“s™þüÕÿì˜Xç›»µ·€Ý’Õ“Í”<-ÿÙRˆb¨V”VŒ´YJÂYkÓY}áÙŸ)X{Ú¢[†.³Óþñ„• ŽJS«`É!qó® tÚ§¥£¨ @nÕ¼ªµŸEqWæp»i0.$pƒ)øŠ&€›ë|†šeÛ›s[L„[Ÿ“Û ¡[ÉZ’ƒ„¤±Š~¨˜ €jŒ¸S8…jà܇!†ÍíÜÏňþðÜ@…R8=« áh†Ž&à;XЦ˜ÖÂ…·ÃE­ÄÍ·Å-›«µ¶Ç8xΫXŒ8^ŒHŒHÞä]^¥e^äÍt «¨5B€¹Œ 2P[Ü5\õO‘ÙÖ$¬Æíáý6Ö ã•^ŒÈSè%€ßèß÷Å娊4¸áP…±­ €€¤P–ãkZðµ9ÝM.Þ=,ßÍ ô]»½[ãX)²ŠàÜSݤHÞ¥è`üHˆ“(ˆ‡®M ø„ïE`‹S`÷b`Âr`Ü€`Qß;ƒ—QV¨èà¶_^ >„«0v#‹eH„R¯Fþ¸@_à´)¦â*¶â+¾âióU€a‘2_ªa߸a6ƒœ7q߯_¥ðaùõŠ(^‰†~P &ò©@€FÀã<Öã=æã>öã?ä@äA&äB6ä=ö´KÜ]ò}&ÎÓ¼0† žàáˆÜWÀŠb¦Xã5®Šø‚àP‰Å ixõZ†ÙeÈI‘è󢩽—FàU¬1¶2â„«Ê%†Ë= nƒÑÝ^ŒøeÏ fÓ=S@8!ƒt2Ž6ê'UV®"W¶Xž HþI†f°(`ÿ™‚Ü $@¹«0‚ø]Š`|ãmiæ!jvkÆ Y,Z^2¡mVíþQZ¸*lŠ`Eu^gE^`Ff xnyþ*zn1#—ÕžB(!°@†v0aÖm_¦X@Nèà`çrgžùâhÂæÖPè x-­;p«å8ÎzŠfP€˜–é™¦éš¶é›ÆéœÖéæéžö韮éD6Ó.ªv¦‘¾mÞèª:ÞÄ ÌŠG Ù¦ƒÈ‰ 1ƒ[ðê¯ë°ë±&ë²6ë³Fë´Vëµfk°ÖâÔ_‚H£Ö$¤^’V°¤›þ1†z@â¯x‚¯¨†}pŠcÀ~j¥£ž£n0¢+ºî$„î)¼¶/âÍÿ†[ ‹)ˆ‡Ú þ"€À§èØ,C‘$Æn[ñÝV¹žkG:Êþ(Ë^/e)„ÒÚ‡„K‹¨pÁtvŠÅVmrlƒlÕ’ì‚’í¢íè ™Ôyxæ5Q‚2X]§¨ˆþíÔî(n'+îå:n’JnjZnØ"” ìþY…I ‡ÂŠ~pi§…e àÞîêî7ûnø o¡ïƒR꥖Š*€v I°0/øŠeˆŠ¥¶ïûnŸüµý~°þ&«ÿ6©p¨p»Ám¬= …QN쥠‡2Bm _í-ÎY —1 g-'*ÿp§ð@q hàÜT(…W“åKŠfе8Áý… 7þðgq)²ð®ƒq(“ñæ¢q³²ñg ¨M¦8…ŒXƒ˜5¶3ö # ¼©Ø„$„ŠóÏî&wrÖæb×6è ©r׺r,W Tøç¥èòŒ@Œ@‚Hh;j„8WØ7&†xm8ÝþB7tå©(HÜ$†Qð\νmb`‡ ‹(?ÚÓnŠ —L8ˆµ î'—¾(³)—¯;®<×óŒ¸0à¤øs#À„HÀNØ‚ŒÀ„ðR„ È óþsb@ve/YPH"`Z‹;ð>«`€"” ÖÛ7‡ˆF8ˆnh„–±˜¹‡PÒ@U:þؽY9q:ÇõÓuúâõ^'¦¨SX.%Œ Nö&$Lj˜ýái_øwø>V…@€£5nªV%h⛊€G`ò‡˜x…€‡ìj÷Ñ„ìz€ƒ#A|—Z[µ}§±~Ÿ°ïõ2€,àrŒ¨ƒWXÝ\hŠP Æ’öŒpz§0†,h€NcŒØ††õŠ)8¬ˆØ¥Šú5÷‡¨”JyÄHœÄ Ä+ÌÂ; …qÐ+PÊ)h{I¤Ä)èC øÃ@LIñ”¸7D>¼ ÀDA$ƒ@…Ð{HäûøûÀgü¡õVöùlzþ)z#z,G‚QH¥˜vt(qbД_ŠEpxb „¯$¨'†.àlŒX}¦f%ØkŒ€z…Ò¿Š¸}ñtXe`'x†h˜L½.(ƒˆxhAÀPz´GYÀG}ÄÅu\O ÇfÔ í¿Ç|$ÇÀŒÂ8 œtR>‡tÌEvü õ?ÇÃÐ Îð Ð0îGÿú|èÀ·h „ 2œÂϱˆ±èbñ"ÆŒ7rìèñcÇa}l‘,iò$Ê”*W²lÙT.gÒ¬is:wòì©Q ‰B‡-jô(Ò¤J—2mêôéÐ-Î íÄ•ˆ’6#þRÕ Q•ÔIŒÐÊŠB+$6jbTRPº~ ;6â‹hWˆÈ•©Q›°A%úÆÔ**ž‚éøñc4 >‚ €Þ”mïPp® SÂ; NÍÐfÊ>)VàfÎ(<ƒFXùÙ›… ¼ŠGXèÑ¥OÛ€[¡ ÊNIHä'óæÎŸ)Ï=ùzÇC)úìîý{‘6Ç“/Ÿ¦Lóê×£Ä þ=|@ Ó¯oÿ>þüÄæp¢èZÿõ†2ÅI€MÅuÌAOòÀãÎi¨C€ØU†ÙN¡e, 4åÆù$Ék B&bqs0´xìƈþ%:f]‡È¸ õÀ¤Ï†HÝØ)™vBq”PŠÇ•Uš„ž•YŽç^”]¾7ŸaŠ9昅À‹˜ ’É )õ™AaP€óT¤ƒ”\hxYq˜q¡…7 ­#E>Ú`ðÚ`AB.¼ög  y¨¢ Zè¡ûÀ¯òóǻ̼ò2Óß|Nñ³}öýOŸò࿦PCõ) ÒúÈŒÐ]ÔÚ'Á RP}ïÓŸüîW¿ôhJÎÃ`—ø7À M  }õ„¬8¥ j_Sšq‹ˆœ˜€`s¨Ãž "N‚½„¼fiyD4σ¦°‰½z¢àÄ£@ =»Cž¢D¤y(Æ1Vð‚JâüŽXDû©‰ù;cƒ2Å9öê|Ѓé(`€> ø°¨1'bH¬#©Èà™þŽRJc©dÄHÖ$‰Žôõ¨IúTëØ¤Pü` ú¸ t²¢S`‘C@ŽEÙÝ"c)Ë%5ò’ï"%Í3É\ºÄ’¶ìI&A)Ì¥˜X0]&NQƒÒaOqA&œrŒoTA"}@9Ëmr!µü¥wpÉËñìrœ+ñ%8wåÊa²Ó)ù@ r‡˜â@…}NAsܰ0΄J ªÙx C(k@5´ÙÍ….ò›é|$ÍIN6J´%è|¨|ÖÙÎ&ÅÈÁSҠψtù¤Ï"hA œXy$70Ý¡!6½)NsªÓò´§>ý)Pƒ*Ô¡þ§|x©å€ˆQžˆ³¢.)§SMrÑ¥n$˜½ên^ñ”S4A(($-xAvÜ@)Ä)NT¤B(# :‚´ÀFÇèsB<%]p =¸1”e€G¹Â-«ØÅ2¶±Ž},d#+ÙÉR¶²–½lc_÷Cªú¤©Q] T?[³7rv'V½êF+<%FyÂb"r‚'Dä«‹È`àV¢pb ÁÄ=¤Y¦| ÈpÊ@|ศ}îQŠWZxV´( íg§:]‹œºÂüОÛ¢|" ĨB($B,¡ —o•ÈrN!ßTÜv(®`¡Ò’ñ#·)þH`R‰Ñ4z·À)Û®NªkÝ+QtÁ%Ñîv»k`=žÀ†[¥†Q¨ÑR 6"-@Ê{#’ ¥ƒÿ|Š :à”öÞ§Ä ,]kDÁî\ƒo áéJ8ÆSl ðm¸àŸØ …#"‚0˜@(€SD¤Ñ€ÝEHÊ1AŸP ’)}0iS̰^¢<]ö1jgLcŒØØÁØêŽKÛc4§°HTİ‚S À£”ˆ6¨¡Lâ§%œK‚SDC¾A‹ˆWÀ"²œ®pÊ+¾W”! t~®š×l‘6/øÍN3gçüéºf"˜ÉÔ€i°x)ðþè°SœË%tµ(¹ÀV}ÕP‹šÔÖ5uEQMUU ;{Ìëˆ_ÑB …$œ’]/ÅH‰Ñì{ÍÆ-²%ªì¥2{ÜÒ“Ö cY!Ðð;Lø¶)Gà+SªðŽ^%u0J3 ð…3¼á8Ä#.ñ‰S¼â¿8ÆÎârÓøÜŸM·9×Ñv»ûtß@_J¾”cáMÉC)RŠE]K˜½9Îs®óóü¨ÛQª¨ÙÑ_7ÇùCI®ò¡¡Ái ŒÂ6r÷A ƒu?ûúªuE:4è£:ÑÌÁ°#=J_zÏæ€f€òø0þïS‚,¦áµ>Ê`ŒM Yß:àyØu¯{<ª gÙÁyv´ïŒ°–&—»'%ªTŠžÑ%œÃhH¡Úúʾô|Ð ïÔÃó2ñ¿\<ã}¥à#öº›ö®% ”ʸàï¦ÿ=ûP_l°‡$¬Ï¥ëm {Û ˆ‡00 ¨PbÐb¢$Þ%EèW˜} P0S(JA Na àfD ŽÓ ªQ žÑ â ~°PÁœÄ+pÑRă–íšSFÄ; R¡2‰ ^!_ñmáu¡}!ÚLJA9TAIÂ5œR$ƒ>ô›RA9LSØÃ7ÄŸRÐ0CÞ¡ Ÿ¹ñaØù!b â Ò(ƒ&±@$D¬CÐb0;¸"Sì DÃ'.ÄÉÁ„€bé‰bÇ‘"Ñ™b¡"þ©â*BÅjR!ì€-ð€\S€%6äˆ&”*I¤‚Úå€12ŽŸ2Þ3j3b4F£SôÆhRÀA0¬€V5E=,S@)…áR1ãBØãè$Ä”B9èÁ;d- DDNdE^ä(Â3àÐ<(Ä&pA‰ŒÁ $DIždJ¦£B¬ãve!/½ãýÄ£þÌ#=>!Á& Á XÁ)èÛ-ÅÌSxC;ÌESè Ä-Ô€/C,Á3lÃ9˜Ì+ÔƒàÃ'$„ ìä ”Ï3 DXÁXÇ8HÁ ÈB<Œ8 Ä5-Á[ºþA1Ð%Ø¥,à¥K¾dêáEÈd.Ñ$ýØdüàdN*ŘéQÐç5…44ExÚRÁ9…9XdHÆ’„\$0hBb)€å- ¤¦Y®flHGm$Çr4ÇsLm2‡sü%Z¡`†G;º™Ñ-b>b.&R n9™S4@Ê È2Ä¡P$8€4‚" @ÀÔ<B†,I@FLö©ÈB¤'C¸ÈcÀÈɤK|  ozS`þ&aR’a2OqÏq"§Qœ` jR hcSØÁ"0Å#|S€Àô9E üÌ8($BXÃ7xl¼C LÁ5þUC„(C@JCtʧ„ʨLЂЍTÌ_Âätõg$ýgò¨è (Er€”&õ 8ÅÔ¬\˜SŒÜíˆá…ŽãuÂ^ÆK$h0JúB*¬Â¹L–ni—~L¿ˆ Æh ÇÊÅdÌÆtL~ÊhiÑhÙèçà(æèèŽ E‚’&ÒS$C4ñéSCL=)QÀÒuèML2ÀD†|A+¤ƒÐA4dB8*¤J*¥j ×8Žá Žât*$Îâ´é~ &œª‘œrâŒÞiDä©}c„ʃƒ'<Å!ÔbL•†æ§é¹)gê¥êæ¬êèh”«þ þ¬Ò‘<ø‡7êö(…4HS@@8”­J¡…¡ú*+U ++Íëþ k²öŠjÒ eSdA4(aRP‚n-=ЃSA´zþô*¸ž¸.¹v¹Î º®L«º* ÀµjuBÅ1x[˜dÁp]g8lÀjÝÀbTÁjÐÁÂLÂBº®ë˜øcj~1E à^RåR $*$þChìÆ.TÇ>ÔÇÞOȾÌÈæÊÂÞ©¢ð¤QÔ…œ@C3è])Å hZRäÁ5D¬6Cé BiÏßϦSÐÒÏÐÚJѺÊÑî¨=Ã!νþ… >d4Àì$ES,ia dÏŽí6•-8-ó¤m­¬m«´-N£w½Ø9H@µuC ìéPÄápnR€ÂdFD8®áÊâþ’â&ã‚i &ä"g+ê‘4pÛQD+˜¤C}…€nQÌ@ï&9 † E!jžØž®:–ª®îç´n¬8®—Äîb"0ÒQ&´”R¨ƒ”Ä.ìk…5¼Ì…0ÃÜ&XŸPÌî+ÕTQÍ/ýÖ¯ýÞïýúÜfý&ph §uQo™ìΤÁê'((R(Iœ‚/ȪP˜AHH01äÐaQþ Ï}0‡°_ÖÆ½ ág©°h p”XoN‚­ù‚ØB$HÁùÒÇôÓR@Ã94­P$- øÅ$ › g×ëê¡ Ó£¿v«ÕAStÀ(ìÃüÕQ\ÈR˜B“ÖE»1Ï ñŒ1º1œ%ñ.q4v÷ÌѼCSL¼ƒ=$ ’RˆÁÞÞ+•,‹‰¿)œŸ ¯âÐ:  S€´!RÈÃ̃AÅ€,üñÎr°²ár²²×%ò "CLX!èÇ2œƒ.…8A€I@+ˆ2°ò¸šòꡲº©rþбò –H&ûÜðQ4ƒò"Å1Œƒ Ô‚S $QP¸–/û 0¬0—1‡œ1‹2ƒ!mM‘/œRÂcEèƒ#:-S,ÂúÅ¡´É7÷J8{ì8+`9#Þ9¯Y:ã`:ÀʦР.R0A-&6LYR؃3;HFè@ý3™4д të4%4Nߺ۽%…1Xf*ED+RhËŸ‚4 ›pê‘´š4ò¡4‚©ôúMƒiL5tòQˆ#…(ÌTR@ƒ*E‘.Å*€EÂeWwµW5XƒõýÿB/çH¯–°0”5ó³8þÑ! RDÂTÓm?æÇŒCF 8PÍ0`¶`ç\4Ôõªðôðù¯J 5þð/wù±NÓG@9‘ TBShsQ ð Å>X´R‡-Å·À³·’ón6Yó§OÏ$PŸŸPGdG6TÐP2GîÁñ"E(pR,óPôé¦ö­vQˆ´Ù¾vaÆ6Î6Õ¶m;E ”5Q!ìsQ܃.\i÷æ2QœB-/E™Ñêò*w717Q8wâB·J7 R·œY÷u3…)@N“ÌÃK'Å#@R€C<\^Q$™R0Â3÷P°tr»÷Á·oš*}þר}s!~§š~ï·Rx¤W5\Ó,~C;@xDPƒ¼5…ÀŸ*jS87Yøþº¶bŸÇ†ÿa‡/Û‡ƒ8Rp³7sÔ2Ü3Q0¤·Q'…f³/ˆT5Û¸Öáøa;¶Yoc[‰Z/Q ¹Q4Ä‚ɃRÅ!èP”‚ܛԃ~¤A;PùR4ÈBYù,aykcøŽÝØÝ—Ã[Û^r°9 ¥f+EdõP¼€ÔC-”$D9Q$€î9Eï9ŸÇ’Ÿ'•–gxœöø)þ8»…¹˜Å=ì¥AÂX;E(`€,À¬C èkQ@A;Pl˜ÔÉþ4€:Ÿ„:CŒº|«®©£*ª7£ª«·ºWíàUaCšC$¨@I,ƒ¨Á9Ø.1DÁðÅ2ì@ÄJ„¢ ±'Ä0@1¢Š¼Ž$D ;²+„²#ö(úIty•ú—L;µGÄ@;4Ñ2TmRLBïø‚I À9¼QT % <üS$`3†–ã9šÌnðHpH¾'ľ—º¿‹b 0þCÖøêÊ—u³ë³Ãc´'Á<1´ƒŒ§ }a@p„Å2°Á(Ŭ3…ˆ“x{/ÄVvåW²¨Õc#ä¢Tæ» œÂôä+¬Ã8`ÃZ¶å[Æå\™>Ü œC˜~~¾½Ž·¼ñÍ}MÖ½ÙÝ}Ác˜ÁF™´E#{À5ì1{ƒÒÅ"PAº Eê€38Á3Önuë×կž»Z¼ÒÁ‡× ¸syóçÑV:}yLJ#)_!# ÑI9ŒÌþ±k$KH .š"€%™"-è°`Šèa…"ô•üàUnh‡…Whåžð0&N=­ÖÚk±j* ŸƒÕÛ®LeU\¶TWÜï¾M÷/Yum×]ó @ÌwÒĈàá±Fà /!% 8L ‚¶`Œ…äÌVá…NÔ‚DUWâpÍ­¸¬r->]‰%ž’ÞA,ž ¡|òpìxZ&†JpŰ-Ò!g 9pajîÙçž&(bŽ¿¥8ãq1>:ɉþÖc“¡Žz ,HGêÁH@!"¸G!H*cH’Ì ³Øà†nÛíkƒhè¦_5ZéU“¾»;¦é~õé«×}øAð _ˆ­2‚…c†þŽ9,™‚Ñ€bØ~ÛóÏ—‹›˜¹ûŽÒn½›Ìuìø.=Ê¿ÝÖ1ðæê*Ú›f,‡£Š…Å0Hj((’†èôå™×Ö9×ë&kuVUŸ¾ºÖ¡vÙ¹¿Ï{®ŽB’ÄšLj‚š(ȘÊ*âŽÂˆ˜Æœ‚Z!Éå›ÏŸyÑIÏ^¼Ó­×ê.ØóŸ”ØÕ=Z©PÄ  (dk+ xÑb@aßc|A’—MK%\ÿºu@!€Ø` Ýb@Fg{´ácN€ûIís`3ö±mä´(G4¸ 3…!e„90Òpgd`$4þá݆‰…0¬Î ½¸n±/5¼á ƒ  âj;0CŒðAƒ@AZE&ha”AÔHHÎ6˜=ã|9øp9+b‘‘ Ó"ÃÓÅ0ÒŒ“DË!+4nÒ1‡@.®€ß)„l E) ˜e +ˆ‡ êX Är0È8ˆ1*„†ˆ ‘ðå/La“˜Å4æ1‘™Le.“™¾„Á¶B•ÂL–Jz–ÜN%­YLNó+fää72²hœÑPÈ)Â&ËRœåeè‡A˜@KˆA ©Br…[쓟ýôç?P” 5èAšÐ~VàyÜ„Žþ$³I®5Ft.Ût(W¼ Nd pƒÔİCÍTQ0XAYp€Šj|Á fpà †$d $¡ÅFq*˜þ]ô+¥hZ°™M‹ò4+ÍéFçiD- Dˆ< ’€ô$0°Å1†qÞÄçå`¾z  G5«BvJT®øô§Jšh[Ù2TµvÁ¨gåd5n5o¼O!a(äAžàŒ¤9ðDUbAޙı2LÀ®•š4ç ®jÂu.Aµ¦\ÕZWËÞ08„ wpZ„d ÙC汄Á~ LÎ1Ä !fˆA0@’aÖ®iÍl‘þ6ËY¸¼U¹—tÕq½"Zâ.ИÔ\ñ…h …ÉÔGb;4Q0FXƒA¢A;€Aß ‰ a.økºà4.tÙÊYÏZ´D•n}¹§ ŒÓdD¨ÇV CŽG(ÄOPÈ= 1$ˆ´ ”Ê…9àoÞ÷¸ù…ë~'Ù_žþWÃûIT 2#0.!ûX*BB`‚„! ‡-óá$ tàG¢?4€)˜{õÁ²o’Ùõp[AF_”ÄK–ˆ0u(ð5FH {Wp"!i°Ã$S$À@Zl°ÜËÊhlò\ŸüÓ({qÊ­rMþöÈA Ùbk¥ 4&ï4L¤‚r÷©t²ÇYš"!ÍPÀ±‘le/›ÙÍvö³¡miO›ÚÕV¶n!†Yèf%Ôu K=ÍS£Ú] /l…u ó¶Ò€+ D ñøíA¦PÅã 6(ËOàg™n'9(”á wøÃ!ñt¼1šÛKr›»–o0Ü™7¹uŊД…úàCŠ¥F„1„!!/>&V‘NàaÞ ÑG¶ þ:£,}ÈòÍ’°F]aÀ x¶-®ÙŒ¿eãì8$?òZqæ0‹$²¼åvAã¦ÿJAB¶°î"„öÌÊ¡,ˆì°…èÈ óŒèu¯–ѹ•ôµb|éhiºõžNƨKK]lp€ÐºšƒC†t(v¶ûá`ÁŒb~ ñä3lq<'àÚ B·ûé{„÷Šë]+ÝÎæß§ø-žðVâ -ÐÂWúJÉèOBBô‚AF9~O àÃP ‡l ‘eë^€>ôð†]ÒõÝWŽê‘Îznó½ïfýêd?CÚמJ ‚DZÔÍîþ¨)¥ÄyÌ ¢‚"—a äˆ1|¡ £ºø`jû¼/¿ïè.KüƯü$J. 0ýThýØ/=hg Ì" `ŠÀ å¸Ä¼ì ˜l†#^lá „A Fˆ!È‹#Ô$ÔÁI})À¯ð*\ÏšÎu(ð€,ðÍà îÀnA L‚°à£V²!ŠƒƇ°†‹ r!̺!V°=ða²8Âô~ð Y"åFÛ’®-éõ& ýg ™°3RD(¬ `ìt…np n¡æ Â¦ï œà ¢äÁ,pÜà>‚¶÷þB@ÔàpåptèÐâìp’ððnô0{ø°£è N€H¢§ Þá¢B‘ž! Ê‚¢!!^á c`æ‰û†vjb³¥?¨R1ŒVQiZz^ä¡” BÆ^᢯ \a° ¢Ñ ‚@z¡Ò ‚ÒÃÂr¥ ¡1)Ü‹$9üà€%Úl©ñZ¬ñ·-½h¦]çÁ±3¬€$ŽÑV6•CÊôâà`¢î@ j‚fð0ZÇŸ¢R!©r9Šc'Žc!­¥!‡É%2c(²tþ,ò"£ÍÝåà± ˆÀ 8 –Aƒ‚bÒ ð "¢ ºÀ1@ƒ×Dq)úv@È@%0¡BjâH'¶¡ Iá7Ô ða öA'Mbx*|ò'!††ÒbвoŽ)ãÄ`"¤& ´à ~Ñ  JŸT’!Ì@ ÂêÖì€"Üp)^¡Ì>A%î.k‚r@7*¡5]Naì’r€Öa°A%b³pä/Ÿ"0‡p0[¨0+æ0é&1Ó0ì`Þ¥¦² Äá Af‚>“ ˜ àÍžà `£¦Æ&!4HàVÀþda|!ŽÀ °àž" 耦´`%fbs2'#TÂÂÚ@%Ü!´Aøà…Ó)ˆÓ“€Ó\”³i˜³9 ÃëAîj¥ Ôà_ ‚ÚáÞ ‚^#V@ &³0 ðêÂl4%œâ%L"&Šâ8T7tr}C%@|¡ "TBp² *4€.t\2”h6”CƒN´®]x ’aô‘ô± ”±0´! Ö,1R!DZ LA<`0Aa¡ âÀô„)^#6f£6zô6Hg‚7‚Ô8²è` ¸!IpIM±IŸÔz¢ô\žþË«ÔJA¢MW`-Šà Ì!F¢6!( HL1OZ ä@dAäA"dB*äB¦ C6¤C>$DF¤DNd æ@Ø^J+ U)&Tü*uz.•U¦”c6•S!bàëÚå"Ѥ(V‰zÅ À G!¢À 4á1€ & 3íOV™‚NræNòD%øÄO…(TbP åP.…QÅ8NB'š5%õy*ZWgZW¥Z;Æ©°õ]|ŽÜ…ÈÓ Ì.ŸAž@ HŠ KÿåºÒ1*GÞ¶a0B3a‰îYYÏaQbQEbÕåZ+V!šðáLþk寀UA"̼BÊ1* áˆ!EZT0bVf‰fõÎfõg5&SÅg{6!¥ckÅbÔ\À ŒÀni#‰! ÚÁðà2‚ ìˆáͨö­–‘°¶ƒ²ü¸¶It6]À6l¢~š¶VÚÀ9âFÕ `âüv!ê ã”v æÒkþ6pOopQ±pûîp™$q†b×Vf´ëj¥h— ˆÀ"áåÄ"À!„–0š`V  ¨è ]eÒtëuRu—Žu—ÆkYoqc— Ì@EÚe2Ûàe #–@h‰à¶Š´ ƒþ* *·twfÖ!ñKz3Žz‘Äu½{³w±Ü vl%˜Ž—ÇŽñ õË„—.ŠIÅcè€àdV¤AÛ Ê€ bfxâ–à€Ì‚^¡ ÀG0š ¶´ ^‚[a¶—ši™™¹™ù™Y ê—RAùÃD9ãHyTL9vƒÀ´h؈!ò y ¢Ð`*y ºÁ,ª@Ú¡&!š¡\¢›E#ô)âôyŸù¹ŸJûV¯8«Ê®¹¹²ùu¦˜Š¹ä˜iÅL” ´‹ãÑ­Sß2ª¾ ÐÀT"   fM!¡3WY¡ß…a/JkïF¹ã ¡d›÷™^À’¢• I ® !þNÀr¡2¡:9Âß‚«Á¤?¥J¥•†¥·Ã¥‰¦ÃÖä€ìÖJêàÉl‰ÁZÁ Jà" âÎ!$à‚âÔ‘!NŒ¬•ú¤í—‰I8; Z¹¤Z{z®©„íðñJ¤a—ÂøŠ DÀn‘`¢¨€[¦΋#Šø‡ýšK˜š›œúh šuø8é¨:lÕH;­D rÀ Ü¡§Aân÷–$ˆ ìZ!žð@ó.ÛV2{š6;c:û:öZHB»gÙÁ`LÕJ6A®¢ÂJ z€–ÐAoâ $ 0–!X`0ACr»]v;“zÛb~Û:‚[<†»þb‰à¸°JÔa^©á:ÛX l‡ &¡x·âÀ`‚C L²b=ض»u»®ïø®*¯9«¼¨ ìÁŸ!<Â%â¹0\A‡®$î¹   à) @}BɃ¨0¨Ž¼À©ÁýNÁáŠÁÁãià ùÆq<Çu<™@A C@:­F–³Ø ¢Œz;å‘#šÀ d˃W=¾’»bÆûz>Ûâh<8ùŠöÀÇ CôØšJN §«€ ²’o!` â9!Ê„å C`1ŒÍÚüüÏ=Ð}Ð௜Œ²Ü\¶ÜIš”®(Àþ<ÌKhÌ£ˆ7¼<¢ óÂq²›  ƒBœrBi•qDs?.é\tÍ…c”02õáÎw„ÁäR¬ K<〓(õ±Â5ñh3E+ès ç”Í÷ìG#9È&/è1‹0 ˜ØŠ’¡+aÒYþ+š´F ÝÒ BÆä bIG`ÕëÔ`„¢m£hA-æ$= ȶ*<ß@G>S¼JGþ €N!yæI ìm:Ä#“ƺ$’Ê gä²Îj¥ä±ÒBדÓ[]ª7i Ó6ï n tÓ œ2 mL±ª•SL L«n¹êl«†/ñÔybâ€ã 7Ú`SÅQ@ñDL(Œ&dÄ9ƒ•j…,ä6¶‚Bu qLI쌳‹4 ¼P,(’Œ¢.ðŧâä‡âÔÀ;àˆ€0dº 9}þè ]~æ˜Ø.m×°;mÔL%ûlÕ[5kþµÕÑJÍ5RN%Ó·-€Û‚“>±ÅL䛽ñNÁí¼òÆ»ê=0IàNˆ­ xàzàaõÌ @1CÓ´ ¢âà u\Ò\tS €Óx2p †Ì/õT¯LTdSp.tq7¾S苷ࢠ.¹bﮓÓÄ@Ýu×TgMÒpD°o îËÂöºÆhE(;Ú ©8•þ,‹ÚÒ¯i,/^Kš?9Dä€.   SÇÚ–“GLtЂ,Ð7…@`t¸•¼>„âtHIL6‘>̃ hÛªdð8¬ zñkÜøªUªl!!ƨCA@ˆJ„h†#OÆ‚py.€«0)D h˜¨À$$0@‡@€ €ìãô‡;ážC{r…d/¸@&ŒdCá89ÒÑŽätb­ ÎcU±›Êâ&Y‘óͰþHœ]mka‚¸Qì úÐG(&…L1"± j@Œ<!lI¦€ jâ€Æ&€ÑRþÍ '…Àl¾!lœCëJ&D%JQyÒÓžøt«Ø¾ªViõ¬D2+k…“ÖÔ>‡­¦­íN"à'ìƒ'r¥Øž¨(J”ˆGð1ö0 ƒÀ`JÐÒ†txƒ#ÞØJâŠ\xC „('k—7è3«mɉZÙ2iµ¯UŽkÛ[–ت×7´=¯}iòª•f‚·•,U!‚RF„lÀ%†A Kµ#âxG(qÙŒN€€•ÇÀ9+ÙÓÝ(H‚Œø5ÜJu·÷fzçë#ö—8ï]±Wä‹b·Ô·Ä4®KoK…"äAQm(€BnI Eƒ"9†„f™©Æ¡þR ´‡AdPà¼>(XØð…˜ä—û­±W1ü;°Æ¸9*vqpZlæ­ÀxÌk™±—ßL(\†0P&NQ܃ì©Ò‘Œ8à «˜ BPl¥$ˆÇp b ;ðaºßÕ0œ/“³ù7ÙL³{Ãâé$¥eÓMŠì1ê˜Ü¸TÞàƒJc¢:ì£ Ý`1Šp1b´MBH R€_#D I€µ¢–±ÑHÜ!åJ©œjTkšÔÈêt¨Y êk“eÍÔnŠ›£éU—*Ð@ãaà"„l!iöA¡±C¯ˆtð®BŒàN@<ÛÒàNõ´»½–2k›þ+h8U¸ ð·˜zœý¾´¸E5Âu3Hî6Èä!Éd `€B´a…¯è ¾86*nÿjÌn8¸ÿð§ÜàÅÉ6ÍÕ<꘳åÛ.¯ñà Eÿ(ÂDQpCAbp" ÀCÔ`CÚÁ‚X#Á yBJee¬ã +I1P‰ëB»ç4†¹Î§f훥àGøÙ»Às²ß÷ç†â›2L Ø U@4>ºcx¼ U=|¬(vTÃì8Gà€x4Cìü–{Íþö¤Ì\íUaûÀÝ~v/–ã¤/½éOúÔ«~õ¬o½ë_ûØËžôAèo㘠PÐPþ– Ãs“a 1Xîe`9:аç•ì>!YèÇ&NÁ!–À¦¸nK*oùc>ó@J;ç nóï[ô:ož7þô«ýìo¿ûßÿøËþô¯¿ýÕÿÜ낹`Ð#ö d ®° U C ”f‡@Ú€_À úÀ¦á ú€ 8eØ—}öµ}Ü×›÷}ž§mäsÍc})¨‚+È‚ QtÀ±¼p1I°1àñhï  æ ´`Q ²àX¨(±‚b€‘@…Uh…Wˆ…Y¨…[È…]è…_†a(†VÈ`&E ¨yÞ'~þ5wkX&˜p(Ø‚sH‡u¨(¨ñ ²U ñ I`2²„d@ -³ËP Ðí@ Fàø€ L¨Sƒ¶f}W0{›È‰è‰ŸФwhgˆ†Ýç†_~n‡'‡v芯‹ Ñx ¯Ä ¡"|D -`ÑAÀ„Ð`‹Š+@ªðÀW&2 p±Ñ(¤XŠ!¨†§Øy©¸†«Øm­(ßޏô2­`a°hè@ˆxRð ¨$oRxAÏÀTA ï@d " µŒáèÿ(JÔXŠ"Èy$xmÜHmÞ ÉAú Ø€ý÷þ #Cè¥ÓÛàxÄ öÆuÔ`.°h&"° É’-¹‰†©vjIj é’9ù®/ÜpÒp êpwÄëÆ¦èÞ0‚<Ð T±e€ˆ«i|@:É•9 “ (“7G“žf“›†“]‰–°øøÀ¥s B1ïuL¸Z‘x íõ€"iÀ 'ðii˜ù•Ü–47–iV–lv–‡)™,¨X,áÞ@Ö`[0‚ ùG Æ€JùXJ€€0R¡M° ÒzÀk0™µ ‰™y‹ipifþ9f‘i›ÁÙ8Ø `€³Sà@ A Ä ë`XÒP“ ê@T‡R€…Âésˆ›o§›Ç›.æ›1œß©ž   òf)‰€ 0ÀÓÄ` ”‘X&¦`Æu(¥ü`ø‚Í  Ê  ê  ¡*¡J¡j¡Š¡ê £(fÕhã©må¹bç‰bÍ£ À€¢)ª¢+Ê¢-ê¢/ £1*£3J£5j£+ Ÿ¸Ôe9hŰ F°ˆÃV€“—‚G¤@‡b ¡(¥SJ¥Uºze¨ª zm" _$:_Í#éÀej¦þgЦiª¦kʦmê¦o §q*§sj¦XÊ‚‚¡¯É ð• ƒU[ ¾ mðýP[À0š+¨ JÚ‚cצõŠyØh ^Ú^`ª^bÊ•j©,w]D ©Q)À ppd0 -Ó!…I–M@ ‚ µ´‚HPuH©¢ÚU—š›™º4àUÁ>@fÆ©¯å©²ªÂª}¤z]ôÀü ƒ Á ðà˜ õwI¦’ ± ³PuX  9j}ÁJ­&f†ê¡2YfÀ˜  öP8€+ö¬¬­©5­óz^¾£‚ rðj¦þ \ƒôPˆU0y›€rÖg´ˆÀªK¯Yª¥HA<@œ0@°Á9p4@õøZ{V«V+²£J‡ÒàŒŠÚ  TV° W  ¡* n€‰tHN°8®(¯9Ë;Ä*žÆz6` )°KÕÀ¿Ð^4KV6V8kµÃj­Ö'Bïc@ ß0xP¹ „@ _° çz( $k›‚cðƒsXµiË4X{v"HwÐK©1¶Ú(~f Nh‹¸#[‡A ’#¸±ax€Ò°«„êæŠ[PPúFµ!{¹§U¯%k²Z{š°K|ð dþ` SÉZ¼)³¶@ÁÀ»ÚD¹×d¹¯ûevˆ ¡wÄ£€€°µ¸*µR‹‡‹¼R¢¸:GûG@’` @€ [Á» ¾ë˾í˾6Àµeј4€‡P¢Ðè°ÉšEÅËEÇÛ½»£°,h€ny+kÓ¡B“wà°+A‰«Á3ã ©vȽœ#±+»J»Vq ͧ »` Y ¡… Ì"¹]A_бá" ¶ð ñK<þ;E¬ÁK3À,ø P ¨ôTupa§(F+Ò| ù‹üÃÔñ½1G„8Ù` ¡€ Ú€þM Á M€Æi¬Æk¬0õXgöÂ[U{‚ì`E<¼<>|¹ùëMQÄ Ú  İQ`} (FÐ^À ñ`"U0V|Ŷ‘Å G 8Ê` “€ ý0¼U!Ë Ê«ÌÊ­¼ÊF` p܆ñÕKï¿«59×Á|Œ¸#¯à »â½×›‚k 8CÇGkÖt‡`ð>  r Lš×k Ç€ ™´ MðD SPØpY°Þâb d`êÀîÐoq0u å°ÉWËÁ,‚6 B±WO` ꜂þð  Ñ-Ñ ¶p ³lÙ¬£C@Ù°b{¾;Ì˲ëˈk^0Q0ìÑ1 Ù çÀ¤ãÐü`a _ÐÞ°sS0ÔÒ OÐ ®™ JÀ0H |êƒìàkslàÌpTÑ ø°Æ „!,ïðü3õð?ø‘+û¸o½Kü@Eý\Óÿ,»"èô°6dÐ Þ&´ º{Ñ´l½€ n½6߀¸p oœî@< ¶Ë1Ò%[Òi{ÒSÀ“ۧZp¤+àa©QÓÉ×­½Rz€øP8†3pþnðí 8eÀ€3ßJ P œ@ Òp1+@Ä@ /pÄ020 NPЬTA| vpw¯ÀG |ðÄÚÐ I@ Y0î„äö¸ü ²Mt ¶Ûj€éPc0ãß°=Z€Vp Õ0 Ñð NàʰÑ@:Á³%0 vÍ p"È:PPƒm ¶¯„†M \@â%nâ'þˆÑòÇYÁ@°K` À0ÁP@ ð;Îã=îã;^b Y¡ÇÁÓÙV{ÒðÀ©ØP ë€ Ý@ð3…T#;ÁÉÀßà`°ßþöSø“?íÀïp0r Öv@´ÈŽýÖÜ8l “ñœ ÄÐ ˜ðÄÐ’°İ pÄÀŠ``Ï !m ú‡@AP´‰i0XÇ@e‡ Ð Ô Ó ËÔÈp Âò* ¾ #* =€6~×$ ÐlÀ 5 @À| ™m†½­*®ØeÁ<°K `\ Øp¸ @@ É íÛÎíÝ®íÆ¼D0äšÝÁGqä9D5#  c1A J”1ÁÔ;Æü–Fp HÐÍÉÀ›ÎP ã¼ïÙà éþl (Æ€ÌP €Âtp•+¡|ä¤ßXµ«"é¼7WN+}ÐÕ S€úÁ·’+‚°Þm"Ø ¡³¶€_G ÆŽìÊžÑ-ŽÍê½@¸ÐWñ 4` MïôOõO½ S0îWQä]sî"D‚÷! L¼0ä} Ü3@ï91ÈOÊG3` P #C0 O â°0 ö>©®{7_ÖpSð&°'W®0èÀO›`'x2zÂ'~(‚";Ô óÔ¶yk"`ÙÚPDZ! ;o Ç×ÉnÑ+Ncþ9÷±A U 6°ØJpV¡8@ š üÃOüÅ?üØ u}õã·ÙZºõójM.1Bâ" ªpF GÝÀ ÊÀµ.Pú„D@иd¼ÀϹ_0P V½½„Ï.°qTEïP‡#LôÞLi Ô”)¼âaCØÐáCˆ%N¤XÑ"D~ƈm܈%@!EŽ$YÒäI”)OëcËåK˜/«Ø:€¾E¶Ì̳ € (i¸bº4`kIO¤I{F!cëTŠ¡QaÚD%Õª­\H‡ØªÂ-‘›aŒÁÔÛU©Ò‚˜$ê0*åÎ¥[—¤„þ‰‰árÑï_À?ü¦½)WD€ÁwBC Xôó%ðoF½™5oæÜÙó:^ñ\º´5&¦Ã€@e™iرMó½XPA‘, tøÂf ‡´\ðB Ò fÞÜùÌz=Ú¥^Ýz–h…ö•´‚­>ü4rlWÔ¢G fê*Ú˜TáÔ“™`ëÖ°eƒ¬YvÊp@ LŵØrk(¸®sðA”ðÒ‹¶ç*´ðBç0ÀœË4’íC‰ 4< ñÄÌÐ)€$AñÅÒ(¬h·ˆhlh¢‰*h„") zÅŽÜ0TÃè8šB(¡þÌ-{ì0Œ[ áÄ–^®Jo=öšzj¾©¨ŠL—xÐ ŽHÀ–O’e¨²°‘L¥dAp­¶ÞŠ+J@”#—4ôÐ ß0äP°&a””£~xÆÅIA¼Ç ŠÀ4SP •(^pakÊ…på”H¦h8ÔÙ Y˜"zX¡=€„8}`h•D“,Rbž ôÙº¦L+ }ÖÓcþÒ@ëK<‘joL4m‘/\hp°e—î©ÎûÏÎn‘Ò3Á>üZ|åt#Q•õ÷߈$–^Ì€ÔDP%…G¿j H6Fð ‡cµ¯Š¼è‰/þÒ)'¦<üèÇJ;@h“tø˜‡ -H†wàXá €sžˆYgóõ¹$i¥JO9ªà>nãàÛ÷ЗÌ^Å‚ñ€¥”ð!¦:ïT×=ôóg²KÚw/ŒuV{íÀ˜µøDp´ÀŽÞÞL Ul24»%í—mÙ:„›ý¨lıkI*pšÀ£Ûj|àf[£¾^Z̦É|-hP‚5¶Á7›ô)¥ Ì}×k¥çåsÁ˜Lñ³ÿüvÁÝîûÃ'€±I$v'Æœpnb@x¿ÓœTS÷Á}mžŸýç c¢AÈxW±E(«’Ž—épÅ5s>hl)$þ¤ÊðƆ[Ђ [pÐN³X×u±í¾ìÚ•þµéy°!'ªÕ wØÍ¨–à1@ÙNg…?2ÀœEoÔ[œThñ5y­{¶@F3LxB¦pM9AvA§-ÚØE ShLè’Tºf9üÕ+v÷Ú ¾ú‡A$f°p”9º>”"5 ‹l"ŠŠ1ELb-¤Á"â«z/Á ÞñµhЀ{Qa@>ÜøF8ÆñE ןÍY…`z†š€–~-ˆ°ƒ‰ì­#zQ‘K Kƒ„Pˆ'‘È"Œ¸á›ŒãŽ|ùɃe¦gþ‡ŒÒ]RsXnCÒ°Ê/\ùJXÆR–ýÁ…4'C«`£ VÓ,l€«²uab!‰HÊ(%”ËdN#9é2$¡t±Ç‰ŒAV` ¡Þ3OäIf†3"`Df);8J¨Rá#HÑŸžé*$ˆ—$¶gaÞ˜„|‰!Ë %eŠS q¦7;€"ôD“°÷ ŠzØ„1¨‚A·ˆ†HdT£åhG=úQ†T¤#%iIMzRò¡p£üçuLé’¨ò¶€áPÄa k|aàiO{Új5¨q°7ÐÐÕá—QñÏâ…qüŸõ"1ç§¿–4/„þ¢0¼úU°†U¬c%kYÍzV´¦U­keëWUjÑo¶ Z6‰F 4Á€{CÞ`°‰[DÔ&`Ä§à ¢+ÜB±‹elcûXÈFV²“¥le-{YÌ6–oN’^V]zΗÀ ªä4&?bÁ½8Æ#šá’9\ ³¥-" Üâ¶DàÆhЇcô-yŒ‰8²ð5fàâªôÃŒð\èFWºnQ‹~!\czBg[†¼û]ð†W¼ã%oyÍ{^ô¦W½ëeox7{Ø-£3@ŸÒ°ðÀW¿ûåï‰XªÝh6MDÀš*=` @€À¶h;P†VÔ4|Àþ ®0 !ˆð*Ä… .`¹CL• q‰M|âSÃ[Ópv|³õWÆ3–1Ô! Väà#ÇŽPƒP"4&r‘ûûßËŔ͠‡*m‚-ãühBn¡>Ðá/iBÚ~€Câȃ<àÑrb¶à¹~c¨i¸KŠ,,7 «ô»àsŸýüg?ÛÀ?[[’«c#'ZÑŽ¬–°hHGÚ‘H64J^Z' 4ðÞ@„—t©:0G/Ðñ…'4#Fa/º` eÀ%8ø.–áƒ]ðs(v‰ôó5}ÁR±eøx@h`B*þ¬ôþ\-ihGûEùÀ¤}mlÈÒÍš€]ÒL€¡&€~± hlaOÚ@Œ6¡æpÉ1Q‚ø‰5K0æ,Ï¡¬ÁN>v_Ra€H@ÃÞðD5¨d@‚-^aO´ØÌævJžm‡|#{è”ÈM~rét¶ã–ö¶-èn6(! 4mœza†]ˆ£ Òè.~Á+›4€ÉØÅjÅp´¤ºDª¦3L|'Ã&ÍàÁ¶L7ÙâÐQ×uÄŒ'„=ìý !h„–´˜ã+7ÉÇQþöE÷C€{ݱ½m¶ƒä¥§·M\Áf ^ðƒþpQˆžäÃ@Fá[ ƒG…×.‰“*éЄdˆ€PÂî€}$ã%Ô׎V 1ï*q»Ý]ß_^áõ³_4ÞóþÒ¼õu°Á/‚ñ{à« »ÀEVd“+á÷:X.;'o‹Ê89¶h¤^eŒƒ¦x  †@|!o°‡ÀQr“›m‘kl#©k_½HZO{ü{sFþý/cÛc»—RÝsŸ£éœ—¥Û[@…Ò)Zc'Ék:—€!47 […-Š80†dd؃_P>b¨) ‡6xh¿þ0kh>ú«?¸¿ÿ«AẰþA´¨\¹ê¡^ (@ ƒV ˜@‚J8X‡'@01µ¥“Àø Àø±…s²1oèd˜$  ˆƒc‡&øzX¨jP‡pxlp 8šPÕ“Á¶ÛªìCä1à?DêÁŽ  \Ó"´‰s0Q$È›ˆ6#4*Ü5+Ô^Ð=î;šcØ‚`ÈiH ! è·`Bˆ[!ÈÑ{?˜8À~:&= $D^Ä«^ F‹1Dn  ˆŸ hÄné.ÉD©à5Ýãuà>m ¾.™±…ªÅ2þŠ ˜ÂÃÅ\ì‚]Fv䌚àÃvŒÇ!Æf£ !Ð^bF¤Hx°…„Æ 8§;†|†]€‡_ÀF†äQ °¾³‰ZGlG´ˆA\Gy”ÇZèH‘” z¬´êÁEàO €ßáÇm„Œ+6¬B‚|‰i$ÂÔ³…-›µù±@°*8›èu`'¬?ŽIaT˜¦ŒÊÎ(IC« ‰)VHÿ05ø=دL 9 A‹¼š| â¢`€¡â)À¨„bÛ…~˜ñ˜]HT«¥¤›¤\½¥”JBdëLÃä¬t SÊŠþžh‡+€¯‰šÚMø…ã+ÏÍä0¡Ø‘ôá2øÕJƒ;‚7@ÎsLÌ‘pÔI59L€S¨Ua¬Ô–z)¨ ¥ˆ ƒxÉ[È=¥yQµB[°¥Ø’V‰l¨Ѓ"Ø„EÈ|°§˜°Âþ“@Fm6ZÕU»US ×^äÕz©iÜÇžºTˆ—1hVË™eíÌWÄ¥`h²xÙ’0 8Ђ#¨…¨@7 Ÿp­´qÝ&¨‰XŠ­X‹µXy@W‚ÒÐØ¾!%Y‘Y’-Ù’]¢aT¹t¼T[˜¥À%ƒxáX€—%J¥†{• 2U¤°'eˆ—uà}°~(¤$P=|Xb V~´ƒMR´JÆM€QðX» ƒçÜ%u-§KýUÃP¶ Å“h°…è =è1…¤H‚µŠLPŠpÀ¨‹¡‹¯yW —†…pHD‚GI¡Vþ#lÅ]\Æm\Çm—9ˆZ‹:t¸\ÌÍÜË]ˆvì>4”U4­å;H]Õ]]ÖmÝÔ O_èÚ¾áUB0dºÔvUŠoÀ›Å“˜†>p øGX„¤¨†¹Š`pÚ¤8\ø<É\pJË™C“ÀU (ïý^ðõÞNù‚@aZjUmH_õ]_ömßô%98\Êõ&}Ua0,Bô»ã†ø_àÿå‚$°‡hÓZ0p_V`¨«–Ø]•5 Wˆ ®` ŽgL %–µ…Z0 Åã0a€(p‰0(/X³ãMŠpXÞ¡€þ¡gP *°Lë–{ U ]»ŠíM dí*Ø@1_@ßNbõ%9-pÙɵ(}Õƒo˜b*®âúª2°(uh+.æâk€+èb1V«,Îvø5hC`%nc¨Ã‚v€~›Œß§ò€CbY@à[0<‡WCIˆ,p€£y¡Þí‰2€á¨¨[¥P‡cp×õ˜[a¥iƒ¶ŠF‰¼© eQeIè 9˜„d2\9ß6Vb&Þ'ž_GÒW50[¾e\~…j-Âãñ¦<ÀFfafb.fc>fdNfe^ffnæ`î†:•3NO¨fk¾æj(þ(]cãV^`¨‹†ˆã9~˜:Qðu^çuŽVØ4("–ÆE }h‚.:Øj <(?¨0b8À:í‰rp䘆S °Wˆ—Ë¥`L¥ÈLôK¥}¼1\îhu€¢ 1Ø.U~Vþffbm€eù¥ß#îèŽÖåS(h…!ã¤j"Ópþ†ºqÈCÏ„ Ö"Ðmm q’ñÞ~Ê[ÆžÈjo¹˜ðê¤à>V |øÖ—°ñ" ùéԞЂw ¡pÀ",ÃðU¯ƒpƒUèB\8‰FŠIò|©r˜¾ò[†ìÖ bê ì ïo0ѯå5m\íÐ)cäað9þÏ™:—”;—p=Çå×>b5ôÙNöôÍÛõPáí—ô[náF®¶"UŠ` ø…¡°q0󘀤ȆT íN e]0qF 6ðÑ3‚5²"¤ànÀrëv†"˜®oÉEe»@vr‡@y‘ùbö4pª.ðŽ>p^ k¿öÉvÙö<ßs\®ð ÂðôÚ¶‡ ®à$¥€twô‘€ôuŸ…ŽFq›€g²áj H(ÛžÈL |¸‚ìG(¤@uxe8a°€ŠÃSfõq W ;83“ -€„­á†h˜€øžˆ_Ç‹ÇeaÇåþ,·‰-¯ 'wv@“g"5Oy6‡i7· 8ß—‡ye‘ù¡yªžðŽîó?ßùq7|ž¡ßm¢ £j‡iJŸm­ö®~E—ðQH›0†ýCŠw8J ³…RF ÇXFP,iR'=û ´f0 KÃHhð`0¬‘Û—¤x„½‡–¾¿å¿ïhb—lgóòsÐ__ÄoöÎVù –vÒî›É§|D±|Áü Ö|˜þöØî/ž/mý¡Ÿ €€`Ž™‚ ‚0ëàÁ×àñÐe"ÅŠ/b´8¬­Ž?‚ÄåÃÖ®2ŒÀGYªF=ÒDõd…šFIÙ’b´¦˜:lñèC“Ž^¿-m0´ç0¿‚µ¨ €)†Õ©4{ðÐ8r&…¥(a±ºvïâÍ›· 5Úþ,x0áÀ¨hЫx1ã¼Øúª5ø €ˆÈx@‡Aã΋ó(›"z4éÒ¦O£N­z5ëÖ®E;©ãÙ3;Z,›ñ@“å}Êðó`l6ñâyÃSx9sÁ­P0¾K€¸Œœpadw²hîHc}|Å[Aê  GGm÷bv¼òÇK[ ¦¥¸b£ãaN`ž`GALKÑd‚-Ñ À(EUS?¶Ð`Kþ[F1  G]‘GQ“€ÖXeE†¸™A04½"F\sI·_~5Wca‡%£Ž©Ûd•á&/4µ’ŒŽŒöš’K2Ù¤“°Évä]µÝf™n¼Y–†*üDR‚‰rÊÙXf`ÏE&1Ô‡eÛ¡ˆÉ<É Òáxæ HÃ.S a‹ ëU‹ ‘S?®¼±_G¿tTDMã€c‹5:<¥aOžWáoKb‹ šÓgGÒTϳÔ"jÈ¡2P `h™‰(P±GX0ªIÌŒf« ŽÁÎÆ£”ájFvÄJ²u%ù¤µ×b«dlÁR‰Û•¸>ÒþN_L{ä˜Åš‰f°lZç¦v áêDÙž™ÚÒT¶h“ .¶ÐÑ.DØ‚ £¬!Á> ©“ —5ÙÁ :8°G¡¥azØŒ"nM)ز©Q¯ä ‰,•áE±Ã+uük©«ÞRÓdTk‰i5Ë–[p},qa4¡Ø°èÚxl¹‚L€Œ^ÊZöc³f`¦gÆ)ñYhÙrݵ×Û7œbÝZ¹[³¾'\¹Š!±Ø¹Hר®šìváŽ8_¹«œ¸zžxõftïVì©Ó{i„ÑQÀ¹£)ØtTO4@Ò S]s1Pà.ìí"-»®`ËKÕ 4éþ`ÃKÒ@M›@ÑË.ÏL^¼"‡JÀT'Y¶òܬŠ,ºˆ‘гBÇ ØìÕÜ5*=í#œƒÉ2xA™ÔS I¤‘Ľ"BÑyUëµúë3 öl£¤ð…^dGöm³ZréåÚy =z½mzË‘[˜èv7˜€É›YöÖ,9Ñ pÁÓFŒ¡@@%³‡lÑ 4›è2*D0ž¬Èrn‘547 Î]Lì1†$2a G)ã›èà>ò‹&„Ã(ü¨ ø@“/lÁ…¹ÏŠü@ OøŽ´¸GEt¦–[M-W»ê•òèRœBLÅ_²ËÑx#ĬMv4Y'þž`—î©å{Y|V´ˆ³¢s4€xIûúèGÔ¸Ï3¤€>fñ¼ÐO-ö›Z¸Æµ¿»$@%¼€‡˜’cÆBg]Áë‚h2T´Á" dˆ›%¯ˆHP#±Å!0#O¶˜C¶A…¼„AG>"C=¨°è «4—1 íÂ#éˆ*øt$  Æ,–°‚ñ€59„-¸ñ‹/dÍpůØiØCG’a|­€ÇD¬h,fÑ >{ËE–ç€ S1ÁËxIÁTYŒ€2¶A“w€" Ä€£Yä˜Åªmf6"c†=îÂÇ×df*ÃxÃKþÊš@v&!5 ‚ì’H³,rjh ŽØö·ˆšðai°Kz¦LÎm“‚ˆ'Mä°‚7Pd”)e³ú€ð¤r"xR@MØ€‰ÌýÄB°:\ BT ˜CÑA/<&‡OLBhƒ6($Ö‹3@mí Ò£\ UfGz1&p"¸°Š-¥„6Ô„°.ÔAˆâ‰¥ƒÐ0Žn\#ʈX¶ƒÐB/`…*NAŠ|Bš¨À$"ð{|„.à’L¡{2Ÿù<ï’7v¦•³-ŒXXà>ýKBcd0¡P F´±p„Áf`Gä1þðn–Âð$)Ò™¨1+Ÿ f€~ÀCÔÐc^²€J¤C%±Èµ¶¶¤ ì0hÅ;¬`Ò2J³áV‚9 ‹8ÆKÓ©á¯Kc\ÛBs :gÒêérµA@0ÑxFn0•У JE¼Ôk‚¡N©ÄЃÐ$‘`Hl[°£'8FGê°Š`ù<ÚxE Ñ C@¸ 7×9ã}2†ØAƒ(Øâffáp‘‡R@/V="‚¥CÉÂS‚¡:S…‚4=èÉÂ#Y€ð®z„^ ÙØ ¹°œÆ`…%ì`«ð]|Ð ×£Éøèk®G)dì"ž6Фـ9†LÁ 4)‚ÞQ kˆ¦ ‡n)0óÐ3ú±îvàÝä67ºÕ½$°£ Sà9Ò‡|À‰hD(à⣯@8î\¥ú™-ÙTžáe,áE(F„Œäà5˜-d¼Â.hÁ*T‘ TœÀ¥ Å– Rþ€X¯H ™^mbÔ™ÀÀ&4ÐO€"¢E Lp‚S¤@+`A+\ð‚WÀ`´˜Ç€„a|*1ǪíðŠ9eGo5¶ñ)Ïg(# EÆÍyQZÌ/h TBÝ@…вØ"§K#*¶‹‘´a;è¿üd 1ì ¸0§O¢Üå­ÄõþÐÁÜ œC`€Êâ ò ‚Ã’lƒ®éÿÕD§´ˆ؆·¤œ½A¨á6 xD2ÔMSÕ½Úsàá À4x„7Ø—+AKà5Ðà©—:¼!þRtD@ CAÁKÄ0P‡-C1Ñ€ XCЃ-8ÓíuYî … <Á ÙÂà@þ%,ƒš¥+È@)Ú@zØÔG;™Á ±áV,‘uPèR_)€¼õ °nÅýaØ–À<¼Áȃ&øÂhCd7lÁxÃD€Ãˆƒ8„9€,ìB8”m4€6 à«Æ)ˆA€ÃhCP4 ƒH!`]>l @À1PCXø š 0A^47¨Ã=À"t >T8¤@€œ38ÉõxÒ"ˆÆ6¼ °d @'ˆÆP)Ã)H@"øhÈN/Ä6À¤‚h`C1¬6ȈÆIMLÒ¤MNJ²$ ¸$L*I<‡¨þA9t8ÁAÐÂ+°*Ø*ØÂÌ‚­C¼A– –¨W!P@wÅÁÔA>ìC?€ !Â!$‚",#4€<$HÀL`&XÀ&Ô¨‚-(@˜0P –Øsà `Þ(ˆB(|€t€l‚&d&T%L‚$D|NÀ=ˆ†@,äÁhP™ÊSz[—~i˜j©Qp©’<4CÛxUí ¤a=„€UØA\X³x´H9<1T-ˆñ/t‰-׉I ÝHŬš Â\Ç@¼‰#NÍ”¸Á#DUàIþ%@ DÂ…(ÃSäÁè ôÉ 10¨€0Y€Ó€ºPìb¸€ ÂXÌVÐÀBÑ0T€¬Â¸\¢œ\6‹<ì°¿îO$àT ÈOY’Õ]]šÐ&íAMÐÁ „þRR‰ê»pÇÔ¨C ¤á3ÔÁª²ê*…[MDƒÄÄ(\¤8èV,ƒÈB$ƒ ¼•°â±ZJ¡Á„)€-ÚPÔ+¹ ¬ Áðb«\(y¼Î®øÇ#„ˆðÔ_nAc–HãÈCF°(cDR6,À¼’‘Ú+•K¼C'4ƒciE iDäDÇ[À6P@ëzT ¾FìÎ*dð/(‚RŽƒ °€}†é„ª@+„ƒL¬ìè ìκ¤0¨ƒ€ÂÄÑR-ˆFóÃóF¯7/ò*ïÃ)˜gäkN1ê”ø¬"Í!®Ð¥f0B£Ú…$-þ¬A%æ¥UÔRÄ>€´BçŠRÖ ÞÖâJsªÄ*„ØŽmGlM$]y€-AÝþ6à‚)´C\Ý ˆ*EâÁ&tC$PÌí| xÀ'àÂê ‘-J—mkXÀ! Ã!|E¹ĹZ†‰¢¨Šz®G(@MÝE½úÔ½‚ 6ü¨ëÛ"né‘JG?ì Ð×ñ®k`ăLAqåÀ<Â4  ÈÂ$e:¤á<È© ¼¬ÀˆÆˆàÃ5P€hd„€Ø7ÜqïqËÊ1бkËûvF?AGåE¡Ä¡FF¢À¢ò¯]H@þ, 5­Õaê‘ÐM¼BdDršÁrF†©¢ªªZðÛB'ÀD…Øí H¡h ¨°†°pODŠt@;˜€Ø;yÄØB$Ü‚ôâ2óă…Ô ˆˆˆ2‰¢HºÀºþЇ ”?’¿JF쪅À¬t”±^,,‚uìRúsûhrc-"Õ/LÝod-Mí)Û… °Ó>­&µ‰7"—ˆ×®XØö²/oÕ0¿_Œ®ò•7ßí— E!ÁÀ/$Q¶òÄØ!DÃè‰Iƒ8…=X‡›3D†q3˜Àó%ÉóþÐsAìAÈÃìîO?þX ‰ ìC@g2·´…%´Yä/ì¯C{†¥úÔ+ëÝ„…-ãòAH0PpGKÕ*ùDPƒ±ºƒâôP4ó•ÙB2„€dÄŽ-ÔÁ8ä-LH^Û‚NG•OµA(1?¤¨u|nŒµ%õÚ,µ4uA|1 é#IµI¥1?dV¿†Íê(„()›²Xu+b£Ø&¥µE“©2„.§*\S„à|Äí¸tóÅ´Aè'cƒÄ^Û‚?¼ƒ$PLsûÄ~ˆÁP èK^;v*Avæ„:³óx\¶td¶mv¹tögã3ÿ–¶jÓ÷j°vŒ¸vntõzþ mCÓvmpYãv¦ê6X¨µo±Fƒ­p·\ûDrkÈ~èC8·O@7¥˜ÂV%vžØ@tCév€†·7:„P30zµ”¬÷ô´÷´¼·=?µNÐn£Îw}ã¸iÜ·tä·(uXÿ7€K´YÇZ8o/‚·õ[3x\WxØ€T8O@7|T ñç3,À÷ãÂu‰›ÅdWv‡¤·q´8ܼ8²Äx›Ahö)ßxŽËùì¸qôxWËöü¹;-‘K‡‘ã ’ÓF›pór“;9cKÓ1N9Æà-Op„í¹è€Hú28à€ùA˜7»ÖK™Ç™#MšËþšD|‹uœÏ9Ž×yqÜ9Ð.4Ñôž3Y”Ÿ ×² +§#ví×r4¢'z£û ¡4OAÄ*ŠÊ)bº—wô¦›ŠK¨‡¨£ ©«‰©›ÁŒ€Dþ·ª¯:}·:q¼ºAü8­‡­_®‡®/¯ßòà-y {ƒ{¾C÷ÂíñH€™t¦×˦‹9޵϶‹¶‡‰©»ùž‹û¸cu¹Ïƹ›Až«ûºÛvh8,x 3bos‡¡ß»*å{±ïõàâõÅ@€Ø€òy3ÁÛ ˜wúª*¼g0<±8ü¿®CRªùÄS¼?[ÑÄlû}Áø­üY‡ü®çƒ;ñÔDp/þÖ7¾s?~ó Ù“ÇXðßy[°Ú7è' êÒöcðßÀú}ë»þÁ>cÔ†6ýîÿ}ï·ûïyðÇ;ÿ-øò3?ôãôóþÛ¿…"º(pZÿû¿ÿD‘6]4xaB 3ˆ5tøbĈU¨ÑvcF9fD@ƒD‘#IFd2 eJ•)'+ùfÉ<ÏÐÕ´ygN;yöôùhКÑêÄ|™ÆNR¥K•¾S`jT©a€éx«ÆV(H‰%@„íð•5{Öì*qbÙ¶u›pX[séÖµ{o^½{ùòU_Áƒ ámbÅ‹#\èU$E7‚(W¶|sfË´@BöütT{jH—6}ujÕ«Y·vý¶é8¡i×¶‘ªÕ¬»;níJlcáÉw‰[yråxÿ^þúÝÃÅ©Woþû¸6ſ۹w÷þ|ÈÛãÉ—7}zõç©â±ò~|ùóéÇgõvpëû÷þÀºš @ä¦ãAê°£- e|Â%œÂÖ»à 5Üà ©ÄÁû-4ý<‘1ÿ \1¹Y|1¯Qœ1±;¼ÇuÜ‘ÇBf …’È"™[x ¥j£‘Vši[è1…„Rœ#š¥Kb¯éØÁÇ“‚>P¡‹þ6f˜GTž=€gô)C‚ðÖ›o‚¾¥<ºù  ¹áÐÇ‹uÜé‚ îÂ!È:þš˜ ¹é¶»‹¿õ Œ"¥!&D@!•T¤qˆ“TTå–Q4¡…&P ½ôÓS_˜T8%…UF&uT ñjæ†@ c6Ÿl*qh Zè# ØD•=áCeç¡—þ¡Ðs”  îºa¹Îä‰Y¾ù磟¾¡ê¯Ï~ûî¡ø>|ö#ŸĊ>õ±Ï} ù1HW;Ý©®!¾žðˆ»¨œ ‚C6‘ºM°¬HA,fÓ»ßÏ!¦C¡–b+YËzT³žuhþ-æVC+šÕ¶¶´¹|-lÎù€ :`Š`‚t¡€Ò(@—ä ¥h…9~6±ÑåhIóá]„6D`.0Æ\Œ ‚¹(¢sÉG1æ2´¡‰‘Œf´Å)’h FÔeh|™N!„(cø\ÑN ÈÅ<¾`HD*’‘]XAJ°‰ÔÃyÆ8:Q a ]D PHBp (…Ä HAÒ‘IhÁ8âa„¨|,øÛDB S4ä~h ŽÐ.p—½ü%1V°AbDâ! „Lʺ0…Lƒ Ä A9:È 9 ¡ 9 JØ„Ê°Ñ •mþ³›ß '1Ú(`vX=Ý9²9ÀNÔ´&6µÉMo‚Sœä4':ÕÉNwBžg=ï™Ï}¶¡Ÿ…øçgp©K^× ifC )Î ³ iB 5äà V Rg–”Éé2–„-¬a{TÄ0gŠágó"mG[”q.tœËçRŒ{¨ñsIDæ’‡¬ÎEÒ°NÕ:Rµ©c|ªírªX›KHPWÄ ‰;œ‹é24ºÚ¯¶¸‡+HЈ(àqXˆIgÀ鄾±5t!biÀ,.›Ù.Ä£;Ïè‚ Ku¬ þ !*BVÛ…ÇF¶ “­,g%P*28Å>á$œ¸§¨ÅØ Ó·Áî ‹SHâ ÑMʶ3†6ãÝ9™:@ÙJ¨ŒÉ›Yv¹³*¸N89"?€Î‰º±.vµK îæÁ»à¯ÊÈ»ó¢W½ìmˆ{?£[Þ&7¸Ã%FsŸ]ãJ—+£u%&±¼ô¦G½ê‰Ñ 4Tb1°Ãúˆátí8v˜:ÿùоô§Oþýê[ÿúØcöµ¿}î¥Ï{ß_øÄ7>ò•ï™ÞðˆÈ剑ù†añ€xéJ2€—V°Ó9uˆû‰QyÈ`ë ^K²(˲6K³г@‹;D‹´`ë´Rk³Šª Z‹cË9« ¢ÐF©Rnålaçì¢çláçæ¢b.¾ê¸J°¾ÊDÎJðEÐå¤ËêbW:a. aŽÁ0àD .* J` †PÁD!š`.‚p‹p.LzÅ €.ö D¡ŒP/ä > ìÀÕ‚r@ØÀÈàÄð¡Úg âp ÅÊ@Ô`þ€ îaæÐ`ŠŠæ”À¡¸ÃBi Ûð ãÐ@k ÂZB¡!Á¦À<`LÀƒR,—V!L ² !BqK±!T€°%ºÀ! €L LQ*Æá/^€Ža¼à@ ô!v" rÐ $­aôa ’q›ñ‰¡ЀøÁ à!Jê¡ `ùÀD€•‘¥‘­‘°Q¹±¿1DZÏ1×Ñ36±?QImu±‚4!RÖ/(Ò!HÀ ò¡ÿ˜auòr1E‘!£ ÎþäŒÎì Ïölb\² ü,Э ÍÐX‹•BÑV²ÑZ’•8°Ëîb{ð©Å µ cpJ¡(¡.–è)é”ÁDp ˜&)Ga §P’9rð?Ø,MTEgŠƒZÆ£ÔðÄØÚÑ-a¢-e-u,ˆÎè.ïšî鰎ꬎ/µŽë¼ìÄŽìÌíÔŽíºÀí6îäŽîJéîòrïþ2^„,ÙäT–#3©Ä,Ïr8Òò6æ²Næ Ðé-S&L5;…4q,Êð Ó° &Ñ áoäíp7õý»@ ÑQÑ!QÙð6íðœÂ3Qeþ3‘# FA:@R>4C4iã NÀ B QÞ‘ ˆO5Ï3"ÈÓ<ÅZN@¦zÄ^¶3E’ª@veÄJR¦h„N>­£;Ñ@T@;$>û31ne?—C?TÃ@cTB'”B1¤@´-”AƒF,7”0´C¯#B+”DKÔD?ãBC.èÓCŸcA[T:TE¹sDOÔFoGó$gfT14FûâE”.@”Gâ?sI“T5S´H ÂG…ÇJÛ¬IãH•K³”e˜´IŸtJ¹¨CW$b¡Jd´JÝâJÑ£d@KÛK×TC¸´H½4@Æ”J(E”á lþaW¬::3@ˆ”-q;bAhH8Òô%"áZPàlÍ(^CÔå/jª6ÞÅM;ä´À˜¡JS!#T5„QOÁQ!5&$µ<ä”G}4O÷´OÿôNÃ4Ÿì9@U,¡î ÁѬ´Fiãc&MGòá4Ú…6â2SÓƒøà ð`HZá²Û4¤X5RãtGÏT,žTouV¥ÔV &‹¸†.€HÈ@‰JA€]{¨k@¢@B`ª(ˆ´:íoJŒ Χä@´@0K$ÆÀgbfì/jìbÈãc®@,2Ø/§RÀ àcþv`V§¢á£.Ľ„1 ð B‡ðæ®áÂËheÚg;Þ'Z×C æÁ┡v|z6hÖfqVg½gièg7dc;–ƒ\€v@®Ž-‚µ18CÝ/ —ש(×.×W"7q׊.dÀrë"sÑ*J?°VmaȪÌpáL€HAæâêÂ9R8°–ì.ŒLʨ”ssr³:«Ö6+8»€êa¶^2'ø-õ%>\€"ÝŒé!((ÂÖ\"CÜ+eV'eŽ'e¾‘8AŒa¿hf[·w<º÷{"|‘àŒ¹f¦MŒÉØŒ¥þmÚæØ[≣8ÂΊŠM‹µxU˜-ÌAL¡ z  bÙabYÉb`r–ab%–b!GrÚV0dІ“ˆ…]†e˜†çŠÊn˜ÉæB‡‘ìähUM®.4¡ žl†éÂ9hYÉî‚äx¸8 &#v»`ô! `ruXkÆ!€¤ñOâ @d¦Ûâ8eèÁ!"àÓXmch‹¶!jAò˜ÛyÚ¼™¤Â9ŽÝyë/šÿxtùÁâš³ù<¸”Ðî¡ "€Ô!uÙauYÉu.tG·tO÷ ºuIéuA¹/f/l—SÙxÙVíâ—þcY]áö„G°.Jæ‚÷TpXî{Y‰è¢cÄL…ƒWKÉWÿÒ/#† DaTÁZ¡ > ¯ÚÞîbW-ÔA¥XjÁ^ªâ¯"Á4DYE¦Y‰AÞ€ !ðRf0 F /ûlï bü" ùÊ=(€N@hAöû€ö䚮ϮÛa`­Ûú­{°o¯°É¯ž‰aª«ºþ°Z«¹Ú«Ñ @  ‚ “™Ï’؇#fˆ‹øˆ—Yµ-š/dФé¥Uš¥]¦Mx¦}®•Át¤A@OùTöÀŒÒ mA PT ›aþ.0! 1AÀH¸Å·ë èb+»r oº1ðf;`€7ñp³f ô@ <Âì@¼n¡ q1ªm£TOA2Á"1’uPQhˆÞíBÞ±R‰Aí€ ª21e^¡ ôÁ &Á™®1cÁ!ÐQٯϴœàS‚µñ úÂ%\Ä÷±ÂK<Ã3¤¾ï;¿+r¿Q¡¿ÿ;ÀÓƒK™‘ b¢a™[K˜ ˜Y´‘s”¸\!Ø.xV;¸¿r¸‹û¸“{¹›û¹§¼ ¥›WH º¯0 ¹r)KøK¹I˜Z|A¡¨:©`©³©ó(@{€Z¨‰Ú¨‘Z©™Ú©ß‚NÏ\MhÕÒçBW©ã4+àङw¤šàK\Æä|SL FýΤmÑ[½ÙÛ½ ¾1±Å›¼Í›Ö×»½ßû8åÛ-*ÝÒƒJ7½8¸Û j¨PBGDᢡ¾„<áÕÇó/ØÛaEÚ©½ÕßDÍmÅÉ3=,GÚÜmAÙy”ͳÝÝß=€÷¤Ó?}FŒýÌ‘]H×}FÛÞûÝßQÏg„Ù=AìýKñýGõ]EùýßÞá_‚UgÔà§áaTáC”á^ã7¾!þ"^E'J+¾E/C3žãOþß=>DA^HEÞCIþAMågÞÝUCYþG]~CaÞ@ežæ¯mþAqFužA•P¹sn¨ æÀr|صœ¥I|ÞN(u;hNá!² þBGè½Å;°^ë‚ë½þ!À>Z…Þ@‰¾E¾/$MµÓ#!X— Žª À.Ñ E¨¾N\¦ Á|‰!NÝ!ˆÀNSé<ì_‚ð _Òÿ!ßñòs”íûÓíCîÑî[{îµ[,"æ fBn ð­’'gÅ qpý/Bàæ¡mº ÚÚ Ä@! ]V¨éþ Ê@–มë»Õ}ö/ÞG|îçÂÿÂÆ&¡! (}Öóäù•ŸùÑ^ó» ú@úè¿W ®?û·ÿ|º_@/4é·c饥韞Ù–F>?”Ó @e« Áƒ*Døa¡Ã‡‡AèB±¢E‹  dGñKƒR8b Y1P "ê²¢L‰M+êy hï$€[¬œt ¥bøÐ]¤(a±£H“*]Ê´©Ó§P£J%ÖO#(GèpUiU¬GÛtÀ¨Ðb$ÊuŠ@B¥£Üƈeâ±6@(ØagÙÔ¿€ L¸°ÓªÁjå éW¤bÉšE«þ–­[¸réÚÅ«—¯_àC‹VŠ%ÀС\SF:)rS!‹à€I1#íÓ¸sãÖ¢ïß®P Aâ¿; ¡ŒȉKÔ=B~dFÞîb[{ÅxV<«˜1”Å7pìHiµwÑÑðãC­*h?&Içïê˜?±wá-Ñ_&IUáNœ@Ž| 6è`|ôÙ‡_¥Ÿ…þh•€ˆ”*øàˆ#–FwÜQy<#Ž=tltQwqaU8]|1J9xtóAE,Â9óxBQ íÐbìÖ[tÈ)ÇœsÐA œqVþ&\–¿Mw"Šì|ÈŒ$yG^™]À1þ„l*`À™·ÉS€(3”8§½Gâž„}eÌ^ù‡a…º±C?ˆö…Iaó†&¯„£|Vj)‰~º_…T Z衉.:h£F:饨f"ui$’G³‘I›I(©Ä’K0ÉD“M8éÄ“O@ uo\"·e±a‰ìBÇ.«—'¦AùH4ðE\‹’¶ÀKE¼Ã ?.`bÊ5APD¶äAQ8í|@Á ø˜“§Q©ö»Ô$d°RiÀ#€CŒ:“•ðQî°0íÌÂÏ) xMGÍqðâÕ •,ƒJø«òÊS̈À7Œ°Â þü01O\ñÅoÜñÇ!3rÉ'§ÌòÑI­ª[FÖag&œOƒgÕxµ`^Eè©Ç^nÄ:ë[³^#¤lØmBö³}yŽF(TTŽUvÈû¶Fq9Ê` eè¡Æ P4†U2P¤L;üð£Eîñ‹4ªãhR`XEGÈáX41¥ÀQO B9ú¤³ GE®Q+GFâVðøìH«žåš“¹F—#Õùç¡^úé©[Å:1®Ã.;íG+›mbÊ*=Ô©Ù¦›ÔS$'vâ9ì“g+dvøbDþùAûåúì·Ï¾žÌÇ/ÿüô×o?ýÎã&-µY‹-¸Ýþúß¶º .r™ ]êb—»à%¯.ÐË^øÒ×÷ÐGÁ…Œ­‚áSŸû6ÈÁ Âï~ ¡GHÂ2%§Y›@ÚF‘¹ ¤n.@Ý(‚»åmo}û[àº08® ‡KÜâ¸> bð‚F ›;ÈÄ&6΄PŒ¢§HřƉXÌ"Eº–Ä "±‹ËZ¢Çè¾VñŒhL£©ˆB2ºñD\ãù¾(G.‰ñx|â÷ÈÇ>úñqmÌ£ +Ç:žŽ†„Ò9H3þñ‘Œ¤$ HF汉ô"3)´Yò“]pä$GIÊRJ²’ $#&9‰¬M²²KžLe#ËÀ‹ZÚò–¸Ìþ¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™Ð¦®(KA®ò•Yr%6²Èjj‘§8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÏxšÁ›Ö,â6¹¤M¯E"gë&@ÊІ:ô¡¨D'JÑŠ®ïšûùω3Ùîœg:x À‰/ ÍèFËWЈ>ˆ™#­hG[úÒ˜^+¤#]I#ºÒ™µ¨G­ÒMsÚÓ5©WÍêV{ÓÔ‘Fõ6UíêZÛúÖø¥-§‡#klÒ×À¶°´kÀºØ ùõ°—Íl[Ãѽ~å0npŠj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇþMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïz{Û ºFv²ê¬o„b¸ÀNð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã _¸‹ûÍk~“üä(O¹ÊWÎò–»üå0¿rÌgNóšÛüæ8ϹÎcíûüç@ºÐ‡Nt}÷¼èHOºÒ—Îô¦#ýèNºÔ§Nõª[½‹P¿ºÖ·Îõ®{}êYÿºØÇNö²›ýäa?»Ú×Îö¶»ÝÐo»ÜçN÷º'ívÏ»Þ÷Îw ã½ï€¼àì¿þðˆO¼âÉgøÅ;þñ|B/ùÊ[þò|§<æ7ÏFùΛ]óž½èGuГþô¨O½ÎÃÃúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ï|â;mod_perl-2.0.9/docs/user/handlers/http_cycle_post_read_request.png0000644€ÿÿÿÿ00010010000021456211727205031025671 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\Œëû8ðk¦eÚKÒ¦D‹%kÉ’"%’%²ëX“ÊZ–’ƒsÂAÈ.Û¡"ÊR–¨N9E Q¢Dí{Úfæ÷Ç}>óëš™šfºÞ|^ó,÷õ\Ïô9u¹Ÿû¹o„B!!E}}}~g‚B!ÄK§OŸ¦€ƒƒƒ¯¯/¿“A!„â% …Båw!„Bm „B -,tB!$´°ÐA!„ÐÂB!„BB „B -,tB!$´°ÐA!„ÐÂB!„BB „B -,tB!$´Dù@[qqqyûö-¿³@!„:œ}ûöñ;‹v"´…NRR’¾¾þ€øB!Ôøúúæååñ;‹ö#´… 0ÀÔÔ”ßY „BHpp0¿ShW8F!„BB „B -,tB!$´°ÐA!„ÐÂBG¸¸¸ð;óóóÛ»wïºuëøB!á$Ìo]ý(11ñîÝ»4Á`ÈËË—––nÙ²…ßIýÞÞÞnnnÍ1cF;äpìØ±ªªªgÏž¯ZµJFF¦í®eoo{÷îm»K „êÌ:Q¡“––áééI6ssswîÜÉß”~ôýûw6GÍÍÍÛ!ÒoôçŸnܸ±.‡BµNTè\¿~}õêÕ¬M•ÆÝ9÷ïßþü¹¸¸xMM¡¡áäÉ“ÉþãÇ¿zõªoß¾L&³  `Á‚C† ù塆††óçÏ@mmí¸qãÏèýüùs …B§Ó) ƒÁððð€Ã‡¿zõŠÕ½ahh8~üxòùÂ… yyy_¿~õññùñÖ8Hž3ÍÝ×Ñ£G£¢¢,,,œÉæ?ÿüciiI6Ù!„PÛéD…ƒÁ’’j¼GKK‹|ˆŽŽ.))Ù¶mÙ ŒŒŒ´°°ggçÕ«W/X°@UUµ¾¾þ?þ`Õ l]¸paêÔ©ÊÊÊdÓßßÿÕ«Wƒ€lÞ¼™ª¬¬Üµkù¼víÚòòrÖ¡Æ/^ Í<âá,yÎ4w_«W¯®¯¯Ÿ7oÙ?þüÚÚZRå°ÿ6B¡6Õ¹ æ=~ü˜õH æÍ›·sçNR+€šššªª*ˆ‰‰5°ÒÜ¡ ‚N§‹‹‹“?í±±±Û·og’‘‘Ù½{77÷Åqò-WYYIÚ²¹/;;»+W®899@PPÐìÙ³Y§±i…Bµ©NTèˆŠŠ–––*((´ÃµºuëöÓŽ`2™MöP(”¶Ïˆ+'Ož$ãuØÜ—ººz~~~uuµˆˆH^^ž††ë›V!„P›êD¯—/]ºôàÁƒ¬Ñ¾EEE®®®eee`ll|åÊÖ™AAA£FâæZ ùé!ƒ7n°6ËËËoݺÅÚ¬®®fÓóôS>>?þí·ß¬­­ÓÓÓÝÝÝÇŽKÞKbsˆÉd^¾|ùãÇRRR]»v566ÖÖÖ&1¯\¹’””$''G£Ñzôè1kÖ,’<|ø0""BNNN\\\VVvÚ´i]»v€C‡ÕÕÕ%$$ 6 deeÉC"Ž“gƒõz¹‘‘ÙÃÍþ¾`Æ L&óСC²iÅþ¾Bñœ‹‹‹››› ¿iòФó:!„P'×Ù Nôè !„B :!„ZXè „BHha¡ƒB!¡Õ‰æÑVoß¾ æw!$ \\\ºwïÎï,/a¡#ðòòò¾|ùòË—ÆB±çáá±xñb,t„ :Â@UUuÆŒüÎ!„Ûž={øâ=£ƒB!¡……B!„„:!„ZXè „BHha¡ƒB!¡…o]!¡rüøñìì쬬¬€€~ç‚Bˆÿ°Ðf=Ú¼yó¤I“<==cbb<<<¬­­=<<`þüù½zõ€ØØØ±cÇ@zzzPPûC^^^÷îÝ;v,…B¡Óéâââ[·n•`ŸÆ®]»*++cccÍÌÌ6oÞ,''×v·ììì îîîmw „B a6f̘#Fxzz€©©éˆ#H•ªªªdƈ 6°>üò§§gqq1kª‰>üõ×_;vì`ŸÆÖ­[I]»vñøB!¶°Ð餔••›ÛÃæP:::%%%ܤQ__øðáüü|¨©©™`0äðaÃ.]ºÔÜi .¼xñb``àœ9sïgß !„bÁa¶{÷îøøx///òzy||¼‡‡ÇªU«ÔÕÕ ))éòåËñññîîîÒÒÒäå,¢¹C^^^d'•Juww—‘‘iIäõrÒìÉÊÊ"Ö¯_ïëë»víZiiiIII%%%SSS===rÔÐÐðرc £ñs+ö­vìØQ[[G®%''‡¯š#„PgF___~gÂc¦¦¦vvv¦¦¦üN¤ÍEEEEGGûùùñ;„lFFFÞÞÞZZZüN¤m¹¸¸¸¹¹ÙØØð;‘ö@¡P°G!ÄKuuuIIIéééUUUåååRRRÒÒÒòòò={öÔÖÖVUU¥P(üN!ÔY`¡ƒâÖ§OŸ¢££>|˜ŸŸo`` §§'+++++«¨¨X]]““óîÝ»¬¬¬>”––yòäÁƒ¿ÿþ{zzúìÙ³-ZĘ%о~ý:kŽm/C~'‚~á뻊³Ç/âD£:¡V+))9vìØ™3g,,,öíÛgnnN¥¶ôN ÈÌÌ~ü8a„,_¾¼M/dnnþìÙ3KKK˜7o^›^ !Ô`¡ƒú…òòò œ;wnÖ¬Yíp9]]ݸ¸¸!C†ôìÙÓÌ̬®ˆbøè !ô kÖ¬™8qbûT9„ššÚõë×ííí/SBÀB!ÄÎãÇ_¿~}àÀ^œ2eJKN;v¬ƒƒÃÞ½{yu]„Pç„…Bˆ?ÿüs÷îÝâââ¬=¶¶¶óæÍûã?Ȧ——×¼yófΜÙ€˖-ûé~WW×&{¶nÝÂZ!„8€ctBÍÊÊÊ"“7Þ¹bÅ ƒammM6===ïÞ½Ûò©tf̘ñÓýUUUMö(**Î;÷Æk×®meâ¨MÄûg]ßøŽAgz¼4ë¢.Éïtj,tBÍ ³±±i¼SCCãáǰvíZ‘ƒfgg5Šu‰'>~üÈd2+++—/_nllLöïß¿?''çË—/7oÞlr!ww÷ǯ[·Žlš™™MŸ>lmmÝÝݽÐÙcSô¹š|“Ñ1ë6ë@Ùî4nbf%–™ûÜý™©¤¼kç_F1…ÿ»„ˆö¨.¶ÞýyX‘hŽPhÝãõ­oíp-^ùé…:,tBÍJMM544l²SCCƒº rZö›r Q½ Ý­¶ôUü_LÚâ裟²_—Õ”7(ëÉNýS¯Ï˜ÿVöf2˜Žf<½˜Yö­F©ŒÊ@9²Ÿãk1™s<ãñù/¥¹5rÊ´:2© »hHš¯Ó&ÏŶ<3í¦%å¿,‘TTä1›€|Q<ÿ£Ž „P³ª««™LæOݽ{wÁ‚bbbçÏŸo|ζmÛ¬­­YÝ6ŽŽŽ\æÀ`0N:ÅeVaS±vþôh}}}ýwú/ã×”×S(@¥ÀÍÉO.dê˜u`Ý#ýqñ…Å/gû 4Z 9Iå7Ý“µŒõ-º/kx{/¯(ó;‰`欕‘Ÿt'oäb 9Q •¢gÞ½ÉUʾּý*¥(&ÝU’îäù-}©2PnÔšò†·ayŸž»ÅŽ¡ÉˆÀç¥_ž•hwQê+ý1¶èââÄÉãEÄ©psKòã¿ÿ† A9?ÞQ«®uû÷”ØSŸû˜tí?©ÇLJE© `ØlÕÆÏÅȃ™t'ï—¹ü¢ÐÃB!ôsqqq/_¾ÌÉùÉ6 …òùógMMMÈÉÉiÜ ’——ǯ“””Ôòw¦*++ F“AÍ%%%Ý»w'ˤÓa0m´ÉÙ—&Ó]œÍѨCéŒzÆË_õÌ»Kȉ–d}z1ÓÌYkÊ=`Йg罸·ëÃð¹ªTJ]5€ ¢":C†Ìè)©ðßÃÃyj’òbIwòÆ­éýÓa1Å€„¬è‚ÓƒEÅ©pÿ¯’ b:fÝH’ºãº½ ùúìr¶‰ƒ&LX¯=präðüïåõªr_“+*òkÔ$‹3¿?¹iæ¢5e»0Ìó R" 8¾Viö÷‡§¿ŒZªa»·?Ð뙾3Ÿ}zR8ò©ñi¬!Ò/¯å^qyàÿÿž9àkr“ Ãçü7‹B¥ ³SmRè´êZßR+™ ¦±ýËÁŠˆQŒæ«}zRÌþvØ'ÏÍ…:,tBMݸqcåÊ• ,¸ÿ~CCƒ¨èÿù]qäÈÖçmÛ¶5>dllÌ}ÜûÙÿ&Ož}º‘‘‘Í»wï&L˜%--ݺ[j ŽGêtíÚ•*BasB“·²»ô’€wáùÊú²ÀdBrD¾„¬¨t1ÈûP©ÔWúÏ4‹ÂŒê¢/ÕOý²Â¼R¨I)þÿAµLÆÏ,š:÷–V;dwqéKç[ÆTQJ )ªemä(q©ŸÜÚíßß÷ì/;ïø î½¥â/eߨôŽìWP‘€Œøe½ÿŠËOO›%­ºXóöî7•þ²$ÿ·÷òšfó¿'¡ µŒÿ¾(¶ÉsóE¡Î „Ðÿq÷î]RåìØ±cíÚµS§N½téÒo¿ýÖþ™=zô¨  @EE%""ÂÚÚ:55ÕÈÈ(66¶k×®íŸg^…|}së<8ò©‹º¤™‹…J€:2ƒ§÷¼·ëÃçø¥¾2Ÿžg½*³þ]— Žy–¶ëÃëÐo=ûÉ6Ô2¾¥TÐdEÅ$þ{´GÆü¯«:@®4ç{z\ñ`ÛžšFНC¿@ÜÙ/ÖÛuç389->`Å+£Ejn}.¯zímòPoBwª%?­*+±Ì|­¶™‹ˆÐ¨5å Ï/g—dO.€˜ãÚcºLQÖßýææwc Õ%sß–Œ-€˜âR"…ŸªZ{­:2Cl{FìOûò¢TYO–Ü2ë‹RP•€ÛÛßwÕ”úšR‘W Y/KÙ'ÏÁÕ>?wÔAàÌÈ¡ÿïÅ‹K—.mhhؼy3™½fÛ¶m[·n­©©iÿdþøã;;;•I“&¥¥¥uíÚõÎ;zzz¹¹¹S¦L©¬¬lÿ”8s÷‡7·¿À“ ™1'2ê¾3X‡æd宓ÿ±*îÜ—†:Æœ£ãV÷&‡äU%åzÐÒãŠbNd$å(õ‘v !&ù_—†úyëmºyï+ýü-µrø\ÕñkµïïùHµ¼¸šó½¬¾÷È.CíT“î~‹÷Ï:KÅþü)EñgÙñþÙ¥ÙßLê1`²‰¶ðô 1 j¬ïç÷Q]4¤ îÜ—È}iðÛ…!&+5¿¼(=õùó³Òžú²ðø|æƒ#Ÿ8»ÖÜcƒ,7öùö¾òÑÙÏ sÈLÖ·¡6H~Æž~Y¯Êú~ÎzY¦¬+ñ%ìrðEµÉuTpppðõõåw&tðàÁÇŸ¾¼– /ƒòrB<…B*++çÌ™SZZ:nܸsçÎQ(ÿgD­´´t@@ÀÖ­[w󴤤¤1cÆx{{“×ÔËÊÊš¼ì­®®B£Ñ‚ƒƒ›ÔdH€|Œ-úçPúÛ°<HÎåw:Hhá`d„:;&“¹råÊääd .üôa––VLLÌÌ™3?þ¼oß¾&/añÐ;wæÏŸäȲ֜;w®¼¼|ÇŽO0`ÀÅ‹É"êÆ 3¦Ã­<€~ÉØ^ÝØ^ßY á‡=:uv‡ “–– ’““kî4uuõððð„„„¼yó†çi”——/[¶ÌÑÑ1$$„Uå@MM¾¾þçOœ8qëÖ­ cÑ¢EŸ?æy>!စBÚóçÏwïÞM¡PzõêÅþdEEÅÐÐÐ 6XXX,\¸ðãÇ<É¡ªªjß¾}½{÷®©©yñâÅСCõðð˜3gÎOnذÁÚÚº´´tÑ¢Eµµµü²mfffhhèºuë ÌÍÍ)Êýû÷ÏŸ?¯££óãÉ_¿~ýñàÆäää®\¹B¥RÏœ9Ѫ»@u8¡Nêï¿ÿŽ•’’:sæ g+ÈÈÈ,X°`Á‚_¿~ŽŽŽŠŠÚ·o_FF†ŽŽŽžžž¬¬¬¬¬¬¼¼|UUUeeeiiiVVÖ«W¯¤¥¥‡jbbrüøñ²¿Daa¡¡¡!ûsüÇxzzº¸¸<~ü¸[·nÜ BHXa¡ƒPgôùóg²FÕÉ“'{öävFüž={’ŠètzjjjzzzEEEUUUEEE=´µµååå•••µµµ[µtÃÀ~yš³³sdddLLŒ££ãµk×8¿®Õ×ÐÓñ1ÔUEuüNµ,têt˜LæòåË«ªªfÍš5uêTÞéׯ_¿~ýxíÇjjjRR¿ž3÷ï¿ÿEhXè $äÞ¿íÚ5QQQOOO~çÒ ~~~ÜDèÞ½ûÚµk÷ïßïááñÏ?ÿð*16ÊÊÊnܸáààÐ×Bܸvíš¹¹9:: ¹={öÐéô+V¨ªªò;—Vxõê•¢¢b¯^½¸ ²zõê“'O&$$ÄÆÆŽ;–W¹±!//ÏÙjÔžž={ÆïPûÁ1: ³wïÞݹs‡F£mܸ‘ß¹´ÎùóçBHà`¡ƒÐòñña0 ,PRRâw.­SQQÁýs+–åË—ËÉÉÅÆÆ¾xñ‚W1B‚ „„SNNyÙjÍš5üÎ¥ÕÞ½{·gÏ^E“““#„}||x!$(°ÐAH88q¢¾¾~úôé\¾¸Ä2223gÎäa@GGGvïÞ½´´4†Eu|Xè $„ÊËËýýý@»s`À€+W®äaÀîݻϛ7Á`?~œ‡aB: ¡€€€ŠŠ SSÓò;N\¹r¥  €·1©TêÕ«W‹‹‹y!Ô‘a¡ƒ°¡Óé§OŸ€U«Vñ;íß¿¿¬¬Œ·1ûôé3a„ïß¿_¼x‘·‘[îþýû}~&;;›_)!$ô°ÐAHØÜ¿ÿË—/šššüÎ…C£GÖÒÒâyXGGG8wî\CCσ·œÝ„ `Μ9äB¨í`¡ƒ°9sæ ¬\¹’JÔÿÀ9"""Âó°fffÚÚÚ999÷îÝãyð–stt$C­W­ZE>P(°±±!<·oßž={¶¾¾þ‚ ŠŠŠàÉ“'‹/>|¸®®®ÍÓ§OI¨qãÆõéÓÇÁÁaðàÁzzz³gÏNIIi|- ]]Ý>}ú˜˜˜lÛ¶­½ï!~Ô߃¡ŸJKK‹‰‰‘’’š?>¿sáÐh» IDAT«W¯Úhc …BVÜ}zNNNRR$&&¾|ùrРAöööL&ÓÉÉ©¾¾LMM 66ÖÌÌlÁ‚¹¹¹Ë—/§Óé$xrròÎ;»uëfoo?kÖ¬êêꬬ,Žo!…‹z"$TΟ?³fÍ’““ãw.ú矪««Ûh ιsçþñÇ111½zõ¢R©Ìæ@sûÙ`?7£ABBBã=ýû÷gMchkk+%%9hÐ 555ÖiNNN–––QQQýúõ{ÿþ}AAŠŠÊèÑ£þþûï‘#G’ø®®®_¿~%m«««É]Ðh4ƒ)S¦îÿ+â: úúúÀÀ@Xºt)¿sᜑ‘Fk£àrrr¶¶¶þþþåååœE ü üïñOx{{7®r 44tÓ¦M¬®`0¬ÏêêêäùÞX§ >|Ù²e¤–uuuåÉ ,t·nÝ*--2dÈ Aƒø çÚ¨/‡eÁ‚þþþ /^¼ýiáª]~º¿9ééévvvÜgøãUöìÙ£§§çíí­©©´}ûö–ÄIOO×ÖÖNLLüüùsVVÖ•+W¼½½íììÈ“2„: ,t~~~`ooÏïD8Çd27mÚ´oß>v4Q^^.--]ZZ7uêÔ6ºJsÊÊÊ’““àôéÓúúúóæÍ#‡N:õúõk8{ö¬œœF³··'E‰¸¸xEEEpppnn.ÀtöìYcccòùüùó ,èÙ³gdd$Ü¿ŸL·éíí¦««[[[ûáÙ¶ë-C¨cÂÁÈ ‰ÌÌÌGÑh´Y³fñ;ÎåææÞ¹s§íª>>4íÂ… 111äAU@@ÀÑ£GãããÉDFFæææFDD@pp0iÕ³gO%%¥§OŸž;w.$$¤wïÞ—.]’””lß;FˆÏ°G!!È`0¦M›&##Ãï\8G£Ñ6mÚÔ¦—èÞ½û¦M›Îž=ûàÁƒoß¾)++·éåš066nò8Kttts­†Ú’WâÉ+Z,Ó¦M›6mZk3DHÈ`B€Éd^½z÷­r¢[·nK–,i»ø¹¹¹®®® VVVt:ÕùVXè $ âãã322TUUMLLø WüýýÉ8•6òàÁƒÒÒRø_ExåÊ•¶»B¨#ÀGW ƒ   °³³ÜÙ‰ëׯ7y³š·fÍš5zôh077ïÚµkrrò»wïú÷ïßvWDñ—`ÿND@}}}hh(ðäÝfþrqqi»wãÉÔyšššPPP@f(^±b®gŽÃB!÷àÁƒâââ~ýúõë×ß¹pk„ WHà­W¯^MŸ>|VVV&ϰRRRªªªÚèŠ!¾ÃB!wãÆ ËC ´>IÛH\\«¤R©³gÏ&Ÿ322Úî¢!þÂB!ÁÖÐÐ3fÌàw.ÜJLL|öìYÛÅwqqÙ²e k“U’/!$”°ÐAH°EFFVTT >qâÄÖ^¥¸¸ø¯¿þâ"MÔÒÒÒøj?Xè $À=zTZZª­­- 544ܼyóСCmÙ²e?îÔÕÕÕÒÒÊÈȸqãÆîÝ»àÇׯ_¿~ýzmmmk ®]»º¹¹ñ&]Ô–V¬X¡««Ëï,P;ÁB!vçÎÈÉÉy÷îÝÝ‚…Éd?~¼ÖÖ&o’“•À›X¸páŸþ™——çááñðá÷oß’ýd^ÁVQPPpqqá2U„oá„“É$…NMMMsëD 11±¶{wûöퟮš——WWWG>Ÿ}ìÑAHXð¯E„:§ÊÊJ;;»äää~ýúÝ¿_SSSEE¥ªª*33“ß©qEKK«Gm988ØÏϵ¹qãÆíÛ·Àƒ.^¼øãùØ£ƒ0ÁB!ARSS3þü„„„Þ½{GFFvëÖ  ýôª°°ÐÉÉ©‚kkkO:µñžuëÖíÚµ‹Éd:::?~¼ñ¡òòòÂÂBIIÉ6šÎ!ÔΰÐAH`Ô××/^¼øáǪªª‘‘‘***d¿:>| ŒÚÂŒ3~ýãääDfö[½zµk?éÎéÕ«…Bi£|Bí „Nwtt ïÖ­[DDDïÞ½Y‡H¡“œœÌ¿ì¸5hÐ 2C1Ï%$$<}úô§‡8@¡PÖ¯_¿oß>²è $d°ÐAH0™Ìõë×߸qC^^><<¼_¿~ AŽ´´ôÀÛ"ò•+WجcµdɒÇS©ÔÍ›7ïÚµ p€BBߺBHxzzúûû€““ÓСC›íׯ•JMKK«¯¯ãG‚Ürtt\¹rå!CxÙÚÚZCCƒÍ .uqqñôô¬««+**ìÑAHˆ`¡ƒPG÷ôéÓÓ§O“Ï{öìñ÷÷Ÿ2eÊ”)SÆO–¸’––îÝ»wZZZzzºžž_“åP||üÆÛ"rKVƘ;w®˜˜˜££ãü!++ Üõ踺ºsܵ›óçÏãH¬Î „::ccãìììØØØ{÷î…‡‡gggŸ:uêÔ©SÒÒÒ&L°±±±¶¶0`@ZZZJJŠ€:ááá]»våyØÛ·oKJJN˜0á—gΜ9SLLléÒ¥À]NDD„½½}—.]8Ž€ÚÁÆ™L&:: faaaaaÁd2/^¼¸~ýz¨ªª R%$''Ϙ1ƒÏ¹rDII©-ÂO™2¥…'O:õ÷ß'SìpùèÊÒÒRMM›¨­ýtí3$”p02B‚„B¡äääÏNNN>>>'N” #Kt<ò;wþüó϶ˆ¼yóæ–tç°899IHHé×A ,t0qqqäìY³~ûí·+W®|úô)00ÐÞÞ^@‡†$''·Ñ„þýû·ê’¨¨¨‰‰ ‹/&›L&ÓÌ̬OŸ>£Fúþý;ïß¿ßçg²³³ÙöÍ›7vvvzzzºººÖÖÖãÇgjóæÍðáÃËËË9H ¡ „ëÅòaÆñ7rss»zõ*ÏÃFGGëëësÖvذaT*õÍ›7m1rˆ;v,ÄÅÅ‘ÅÒãââHE2oÞ|¸®®® ë!šµµ5é§±··ïß¿ÿðáÃ}||Ï)àèè8sæLXµjù@^Äc0gΜ133##""XM^¿~]VVvòäÉ;wž>}ÚÖÖVRRR\\¬¬¬V­Z¤·©oß¾GŽ!­Ø´±±!IÞ¾}{öìÙúúú , Z6w_pçÎÉ“'ëéé3fáÂ…}úôaB‹5k–¾¾¾¡¡¡››kÂL„Z „ÆÛ·o@]]½GüÎ…gBBBFÍÛ˜ëׯ á&‚¡¡!Qmgøðá7nÜÈÎÎŽŒŒ400`íOLL|ùòå Aƒìíí™L¦““S}}=8::’·íâãã­­­|ìØ1___PQQ‘——o<;¢ŠŠŠ‚‚‚‚‚ìØ±cïÞ½šššöööT*ÕÉɉUZõéÓGDDd×®]!!!999;wŠ€åË—Oœ8æÏŸ¿råÊ•+Wššš’Vl.Y²ÄÂÂ6lØ’’2}úôœœœ¤¤$6÷ºnÝ::¾hÑ" R‘yŒÂÃ×-[V__¿páBssóèèèùóçWUUµéÏ œ0!ÁPZZZ\\,!!ñòåKQQ!ù/—N§‹ˆˆðüv?~|ðàAn"úùùµ¶Ð©¬¬üþý;ƒÁháù+W®tpp ½&sæÌau 999YZZFEEUTTôë×ïýû÷***666÷ïß_¿~½££#¸¸¸œ>}zÅŠd&I–þýû“üsrr—/_¾eË ÓéË–-;pà€­­­ˆˆˆŠŠÊþýû½¼¼ÜÜÜ@__ßËË‹,=6kÖ,yyùððp‡ÆKw±hkk+%%9hÐ ŸÆ ›»¯ãÇëëë_¿~ô$¹ºº†††NŸ>:$//?fÌèÚµ«‰‰ÉÝ»wƒƒƒYÛú%!ùu‰Ð{ùò% kçž={ôôô¼½½555ƒ‚‚È‚ê=}úT[[âããi4y>Õ ˆŠŠÒÑÑ&“-##£¨¨ùùù!!!ƒ 4h”””§§gqqq÷îÝYš,-Â> Ëót7w_>\·nù©5žn@]]J¥†„„HJJ²¹G„ØÀB!Á˜˜Âõ¾ØØØX[[ó6æºuë<==ÉkMÑÓÓKLLœ2eŠ®®®ÔÿHJJ6÷UZ 8ð—ñÉ¢¡gΜ155MKK ¿u넆†:;;‹‹‹WTTçææÆÆÆÀÙ³gYÓaÿùçŸoß¾-//ÿí·ßH_HYYY@@@rr2œ>}Z__Þ¼y ­­mmm}àÀ„„„Þ½{?þ<))iÓ¦Mbbb››ûñãG++«±cÇ–––†‡‡kii±Vä £Á<<<ôõõ¿~ýocc³mÛ66O:õúõk’³œœF³··'¥Xs÷åìììêêjcc3f̘äääÆO ]\\\]]'Mšdjj***šžžž””äèè¸bÅ n~¾¨SÁB!ÁðêÕ+`-ä) ÷pÁ`TWWs°òÃŒìêêÊ}´&>|—.]ÊÎÎ?~üåË—ÉÜ7oÞtvvöññÙºuë… h4š††Fjjj@@ÀóçÏY…ŽMdd$N_²dÉæÍ›ÉΔ””cÇŽ‘á½—/_ÖÔÔ$…8p@GGçÚµk?îÝ»÷Þ½{É;Yзo_qqqƒqùòeqqñ±cÇzxx°:c 6nÜø÷ß?þ\SSÓÖÖvéÒ¥ìeff@`` ˆ‰‰9’ înî¾îÞ½K¥ROœ8qùòeeeeKKKÖk\Ó¦M£Ñh§N ¦R©ªªª¬'wµ: €¢¢¢ÜÜ\999ž?èá¯)S¦\¼xQOOW©T*é,áÒ›7oÔÕÕ€tNð\tttãÍ‹/6Þ:tè½{÷Ø4_»víþýû›ì466NIIùéù¢¢¢ÎÎÎÎÎÎ?b½1Þò¾UË6¹µÆØÜ— ù|éÒ¥ˆˆÖP'+++¡YÙ ñ: òÜÊÀÀ@@×'ÿ)ƒ‘••¥¥¥ÅØFFFìǬ´Äú÷ïmVèpæîÝ»¤P8sæÌüùóuuuùÏdgg744TVV†„„ >¼Éˆ„8†óè $È‹Ç-ü!@¨Tjnn.o—óÜ´iS^^÷qtuu¥¤¤233ËÊʸȇºÿ>’ÚWh$&&ž:uÊ××÷Æ&&&ÇŽãwFHx`B€:ç”eeeRRRd+OÔÔÔ 4ˆ'ýäe«þýû?þüÍ›7&&&ÜÇä^[¬~ÚA4~t…oaB€Ì‰,d=:.\øã?xPBB¢É`θ¸¸”””À€à_>BH@a¡ƒPGW]]‘‘!..Þ·o_~çÂKuuuýúõãa@__ß‚‚.ƒ$''ÇÄÄÈËËÃÿºÐÈò!…®êèRRR †ŽŽkêXá°qãFF«¯¯ß³gY ‰½zõ:~ü8•JR‡‘™iB „::ò‡–³ÎGmÞ¼yÒ¤Ižžž111ÖÖÖdÊüùó{õê±±±dz½ôôô   ö‡¼¼¼îÝ»7vìX …B§ÓÅÅÅ·nÝ*!!ÁAn/_¾$+-ðDmm­‹‹K×®]¹Œ#--Íšl°ÿþ åýû÷ ƒ”>!ƒ…BÝ»wíÜZcÆŒ1b„§§'˜ššŽ1‚µ¦ªªêž={`Æ ¬¿|8Yéëë_¾|™ƒ†?URRríÚ5V?Ç|}}ëêêïÑ××OII™:u*—ÁB|…BZYYY~~¾ŒŒŒššgÔÔÔXë 7HåD¡P †………¹¹9ARSSÕÔÔXÓüs‰F£9r„ËÁÚééé½{÷n2!©/SSS[j÷îÝRRRÜ$ƒÚZ“%Ù‘ÃB¡tçôíÛ·ã,þиrâØÖ­[,--y’’””Ô´iÓ¸ ²dÉ’Ý»w3¦ñNhe¡³gÏžªª*.“AmÍÊʪãü7…Ú:uh?~aZÕˆPQQááMYXX\»vL~ÙÒÒR*•:zôè&ûuuu)Jzz:NiI¨)S¦pœBˆçp02BéK ý ؽ{w||¼——ÄÄÄÄÇÇ{xxdee‘£IIIîîîñññîîîä–æyyy‘[·n­¬¬äð®Ž9BÞ`çÞÇ¿}ûÆM• ÿþûïÿÄ—’’RQQ©­­ÍÌÌä&>Bˆ_°G¡¼€Ý§OΚ{xx°Þ'755‹‹k|tàÀÍ=„jî§§'ëíkŽUTT4y¿‰cššš~~~ÜD Óé>>>?Á&úö훓“óñãGÞ.´ŽjØ£ƒP‡F !›Ä%&&†ƒ©wš#&&6dÈn"Ü»wïßÿmî(ùòÓÓÓ¹¹Bˆ_°ÐA¨ã¢Óé_¾|ÑÖÖæw.¼D£Ñ~ Ùºº:mmí&ï„·–ŠŠÊš5kš;J¾|2X !$pðÑB×çÏŸ444ÄÄÄø /Y[[ó*Tbb¢¦¦&—/–³_‰‚<7üôéSKBUVVFDDp“ j73fÌÀ¯:,tê¸È×Þ½{ó; 377o2c gFŒÁåă—.]ÒÐÐ011iîòý·ðÑU^^Þš5kÆÇMJ¨ܽ{wúôéXètXè Ôq e¡Ã`0V¬XñáÞ:=zôà&‰'öïßÏæuuu11±ÜÜÜÚÚږ䬤¤äããÃMJ¨„……ñ;ÔNpŒBWFF]¡SYY9~üxžÌ‰\TT4`ÀƒÁq&“¹fÍšQ£F±9GTTT]]Á`|ùò…ã !„ø „:®ÏŸ?¯^Ãî äääüýýy*55ÕÄÄ„Jåê÷Øœ9s~y™ò‡ü8B‚ „:.¡,t^½zEzª¸7jÔ¨€€Ž›×ÖÖêëë×ÔÔüòLò#À„:uPL&“ÌÆ«¡¡Áï\xéâÅ‹ÑÑÑ< Åfò›–xþü¹žžž„„Ä/Ï$…¯ê3„P{ÂB¡ª°°ðû÷ï]ºt‘••åw.¼d``0lØ0î㤦¦®[·Ž›cÆŒiá[¤ÖÌÎÎæær!¾À·®ê „²;–,Y“8………ܬX^ZZ*)))%%Õ’“ÉO—»BHa¡ƒPEúÔÕÕ<äååA&nhhðôôäÉÛÚ<äééÙd¡P¨¬¬|úôé„ ¸?zôhn¦WöóóKOO?|øpKN&?Öb¨!‚…Bù³ª¦¦öã!OOϪª*Ö¢›ïÞ½;tèЖ-[Ú5¿_©®®þqçû÷ïwïÞÍ}¡C§Ó###­¬¬8ŽÀ`0.\ØÂ“»uë&!!Q\\\]]ÝÂN „P…B)t~Ú£ÓDÿþýYËw×××>|8??jjj&OžÜ¸¸zõj||¼„„DII‰®®î£G,--ÿú믗/_}ûöíÈ‘#™™™¬·™Ø|þüùõë×ÅÅÅëêê FYY™¯¯/9´sçÎøøxwww²9f̲샔”ÔìÙ³¹ÿrâââ<ÈM¡Óªñ= EUU5===;;[GG‡ã‹¶«W¯þþûït:ýßÿýi¡ŒP§‚…BTnn.¨ªª²?N§Ÿ>}º_¿~dóرcóæÍcµ:qâijgÏŒŒŒàæÍ›UUU$‡NŸ>]\\lii [¶lÙ°a(++ïÞ½›U °xúôé“'OŠŠŠ“É2¡­­=uêT. uëÖÝ¿?""bΜ9¢¢¢·nÝZ·n7³!Ä/Xè ÔA‘¿©äïëÔÕÕIÉóçÏÏ;gjjJæƒQRRú±…`2™¿Üó#6MLLLLL F^^^LL̾}û6oÞÌ>Ú† Âe¡STT?yòdΚWWW¯Zµª¹/¶9ä|R}rIRRV¬XA&\ž:ujDDë1\ll& ¬Ä IDATì‘#GÞ½{'##cjjº~ýzV±ûäÉ__ß·oßVTTèèèlÝºÕØØ˜b0§OŸ¾råÊ·oß´µµõõõY—cÐÆÆ&%%:äï”4tèÐ#GŽtíÚuêÔ©’’’«V­RSSÓÑÑÙ¾}{ii©‚‚›4Ø??¿ÌÌL:Þ³gO33³?ÿü“ã ¹ÿA NçÑA¨#ª¯¯/((éÞ½;û3 7lØÀªE† véÒ¥ŸžijjzîÜ9Öæ™3g Y› äCVVVã cØ$/UQ©Ôž={Θ1£qÇTVVþ¸ ÕÔ©SµµµÙßÑ/=xð 00ãæŠŠŠnnn­mE sçÎYZZN˜0ÁÜÜ|üøñãÆ3555113f̨Q£FŽigg÷ÓQØ?:{öìþýû÷ïßÊÚ¾lÙ²úúú… š››GGGÏŸ?¿ªªŠMLL|ùòå Aƒìíí™L¦““S}}=9´sçNoooMMÍE‹‰ŠŠ†„„´$à’%K,,,`Æ )))Ó§OÏÉÉIJJú1ÛŠŠ …"""Â> 6“““wîÜÙ­[7{{ûY³fUWW“Qh¼Ê¡æ`BQ~~>ƒÁPVV&#`šðòòŠ‹‹óððX»vm=ttt455}||Ö­[·~ýz__ßµk×JKKKJJ*))™ššêééÀÌ™3ýüüV¯^-''G§ÓMLLÈ~bôèÑkÖ¬‘’’’””¬¨¨Ø¶m››››¼¼<›€¹¹¹^^^ß¿§ÓéuuukÖ¬iœ¤ÝêÕ«ÄÅÅåååçÏŸ¯¤¤´mÛ6¾}û.]º”³¶{÷îõöönmÞ={@~~~“zîG¿¬M‰ŸÖj‡’——3f tíÚÕÄÄäîÝ»ÁÁÁ‹/'''KK˨¨¨ŠŠŠ~ýú½ÿ¾  @EE%;;ûòåË+V¬ =j cåÊ•<øe@[[[))©ÈÈÈAƒùøøütäòÉ“'nݺejjJæ®l. öIýÇd2i4šÁ”)Säääx’!Bìa¡ƒPGôíÛ7øß×yzzzzz6ÞÚ…B¡°+coooooÏÚŒŠŠb}ž3gÎO—·dðĉÍÞ€……ù·8ËëׯKJJÌÌÌØ´j‰AƒqÜ6 €³ÕΕ••@]]ýܹsT*•ò?T*•l’ÿÍÎÎnawQTTytuÿþ}²óóçÏ ¬—×Öü=¡¡¡›6m¢Óé¬Cä^RSS™L¦­­-ÙI¥R§M›F öY¼½½›«!®^½*&&fff¶wï^öi°8|øðeË–¾xñDEE]]] ¸Ï!ö°ÐA¨#"…÷ƒv;”èèèÒÒR. ´´´Ç7.×ZeéÒ¥eee4$]kµµµ†††lNãf5uuuu*•BÆñ4±gÏ===òˆ*((hûöíd?)Â^¼xÑ·o_²çùóç- ÈB¡Pš;ôã;êÍ¥Á>`zzº¶¶vbbâçÏŸ³²²®\¹âíímggÇ}†±‡…BQ^^´e¡³sçÎÊÊÊ'Ož„‡‡³ÞØjkFFFd7"""ÒÓÓ9kK§Óåååååå9h«§§G¥R‹ŠŠèt:—wAFמ?~äÈ‘wîÜ€€€€uëÖ¹¸¸¸ººNš4ÉÔÔTTT4===))ÉÑÑqÅŠ ..^QQœ›› gÏž566¶²²;vìŽ;âââTUUSRR?~ çÎ?~ü¹sçš xêԩׯ_“8rrr4ÍÞÞ^AAîÞ½KÞÛ:}ú´ªªêŠ+X›4ØŒŒŒôöö ÓÕÕ­­­ýð჌Œ FcËl"ÔBXè Ô‘ mWèüô_ám›X&MšôýûwÎÚnذÁÂÂbÊ”)­møõëWyyù.]º)))q–—.]zúô©››[dd$\¾|ÙÖÖvÚ´i4íÔ©SÁÁÁT*UUUµñ@Ÿ­[·^¸pF£ihh¤¦¦<þÜÊÊêøñã>>>wî܉ˆˆ×ÕÕMMM½té’££ã±cÇš D&Ë!†ÄÄÄFŽIº¬<øåË’X—.]-ZÄššMlöìÙSIIééÓ§=’‘‘>|¸›››¤¤$û[f¡ÂB¡Žˆ:\þAíh\]]½½½¹|¡¥¥ÅYCƒqëÖ­Æs!¶ÜÞ½{{ô衤¤TXX˜ŸŸÏåÏ…T6,©©©7­¬¬š›ñyèСÍÍŽ#))éîîÞÜÝ50::º¹$ßjylN›6­¹EXÙÜ2›€µ¾^ŽPGTPPÂUèäååݾ}›Ë*'..îèÑ£œµ¥R©ïß¿'ÃYZëóçÏ«V­"¯S5~'!Ôña¡ƒPGD ašq_LLŒ³Þ”ÆÂÃÃ9~nõèÑ#Žx QPP …ùÑ „:uD¤Û@˜ .]º°ÞçØÆûí7fee-^¼¸¶¶¶µ +++-ZD>“öè $X°ÐA¨#***á*t¹ "++ËÙíÜÜÜÅ‹sУsúôi2K`¡ƒ`ÂÁÈu8 eee"""œ½Ý1ݸqƒ³ñ1,AAA¿\Në§8^tñâÅ•••ä3Y_ „ öè Ôá”””0™LEEEn¦žëhV¯^=xð`n"ÄÆÆrV*%%%qÖ™T[[Û¥K ²I ’’B!„ø{têpŠ‹‹@QQ‘߉?~<;;;+++ €›8ãÆã2“£Gr6Ù××W__È!­jÕÐÐ`llÁZ»ŠÌSG~:!A…Bé3à¸Ð‰¿zõª¤¤$ƒÁPTT,**b­RÄgggàò…©´´´ÈÈÈU«Vq¡ººZJJŠ5g]«L›6ƒÎ¤ääd Æ+tvéÒ°G!Aƒ…BNii)pZ褤¤„„„xð`ܸqÖÖÖm[Ô6lppphss“I“&‰Újݺu~~~öööÄ›TWW;öùóçB| ÿø¢R©ÉÉÉ"utggg8Jç¿Ä~vøˆÎöíÛ;ö†YõÒ*Q›0 ‹%êÈoÞ¼qwwþkÇWÙk½yUUU­Zµªý‰½ÀÏvëÖ­™3gB ó_b:íÙ¦$>¾~ýjkk{öìYCCÃ64OJJ4h®®®H­¤¥¥D}ÖÈ‘#GŽ)¼t„¯ÑQUU´;ˆøøøÎîøE`bçèîNQQÑû÷ïÛ<:õ÷ß¿}ûV¤&,kóæÍ¢£|åÊ•âââV«µ:¢7è vð{T^^¾³;Ò :4pàÀ¶5·±±™0a‚HMîß¿Ÿ‘‘!Ò”FûóÏ?i4Z«5ñéÌ8H˜º@¼Ðh´––YYY2™ÜÙ}é îîîmn¾råJQ›hjjnÞ¼YÔVüñ‘…Dx˜ $Œè ^ð¸Bò:‰'{{û;w¶­íÿþ÷¿¼¼pÁ(FÛoΜ93fÌ R©666)))_¾|a_b0!!!ãÆÓÓÓ³°°ppp`ïr)--ÍÅÅE__ßÒÒrýúõåå圻xñ¢žžžŽŽÎرcÿüóO"—t’ýÿLèzð’I?YQQÑÄÄdÕªU=JII©mcc#N·³³#ÞäÊ•+éééÿüóÁúeeeçÏŸ_½zµHCIII!„*++½½½étzsssss3þ€ÿ/•JéÜä°°0…€€€qãÆ]½zÕÓÓ—ûûû_»vmüøñS§N-))¹ÿ>{âOÐ¥¤¤$___ww÷úúúää䬬¬øøxœŸëåË—;wî´´´œ0aB}}ýíÛ·?|ø€o(ä]:ˆ—®è „þúë¯;wÑS^^¾¨¨O褠 àááA¼¾ººúùóç•••EêBŸT__/d¦©OŸ>ïVWWwýúu[[ÛÞ½{3&:::eee×®]óõõ]³f ®¹aÃ<Œ$äRpp°²²ò˜1cB***cÇŽ½uëVtt4>ô'PÃÇ@O›6­{÷îøB.Ð@ €xiiiA?F$š­­­’’‘R\"##GŒÑ£GâMæÍ›G¼rCCƒ¼¼<DÒÔÔ„w]©¨¨ìÞ½[VVVFFFVV–ýAFF¦ªªê?þ xؘ˜ÆÆÆ¸¸¸¸¸8\’““cnnþæÍ„££#»æð!—JKK Fhh(ç#Øc3K—.ˆˆÈÎÎFIKK¯[·/„r €.Ä 3õ <1tòäÉáÇ·¡áš5kŽ?N<áyxxø˜1c´´´Ö innÞ¾}»¨Û¶m[¯^½Bòòò®®®|ë RY,Vxx¸––{’.**êòåËæææªªª¡ÜÜÜ!C†pµrISSSJJ*66–ïù‡ÅÅÅÚÚÚOŸ>---ýðáCddäÁƒç̙ӣG!—ˆü ˆ9t/]fD§¤¤„xj¶úúz2™<}út‚õ F@@ÞáEÐ¥K—nܸ!jÇh4ZbbbddäþýûÛ΂×Ñ£GKKK---ŒŒìììnÞ¼©¢¢obb2þ|++«­[·Þ½{wÀ€ ãÍ›7ùùù)))‚.ùúú®[·ÎÞÞ~üøñÒÒÒÅÅÅùùùË—/_¶lBèöíÛŒ×ÓÓ£Ñh¯_¿VRRÂç ¹@৸råJ¶awëÖ­¬¬Œø€ƒÁðóóÓÑÑ!þˆüüü6 ˜Q(”ÜÜÜÊÊJÔAãmxº*++‹Á`ØÙÙ………á]`§OŸž?þ©S§<˜œœœ’’"++«££³aÃ<Ä"èÒŒ3(ÊÉ“'£££¥¤¤ú÷ïoccÃNä®®®®ªªúøñã‡*))YXX¬_¿ý¹@ ã1™L2™Ü†Mò{öìqpp žËSNNnåÊ•+3Œààà 6ˆÚ«7nèèè°£níĵ-22’ó«’’ÒŽ;vìØÁÛPÈ%;;;A»Õf̘1cÆ Q/ÐHüð8@ åççOš4IÔVL&388øýû÷ë×ÖÖŠ´¦822233SÔ^}ûömÆ 8Y—YAÀŒè ^ðêœ3èD?~4h¨­>}ú¤¯¯okkK°~tt´H»º Ú° LIIéÀx $:ˆ—®è888ØÛÛ‹ÚJ]]=--xý%K–ˆô333Q»TQQ¡¦¦æää„¿v™¥âüwÀÿ\/]#ЩªªjðǪU«nß¾M°2•J•––ÖÐÐ Xúôé\)ZÅb±–,YÂ>äu¡ãøï€@ñÒ5ggççÏŸ·ZF£mÞ¼ùæÍ›uuuT*õÒ¥K8’ bÏž=G%X9##£ººº_¿~ëcUUUŠŠŠœ{ÝaD‰SWˆ|øðƒ…¯öÕÓÓÛºu+‘›×ÔÔDEEùøøïO]]Ý‚ ¢££ y¯¶èôíÛ÷âÅ‹ÄøÙ Ð@¼à¬Ñ8ငÊÊʲ´´$^ßÒÒ2--B¡ìß¿?))IøPÍ«W¯ÊÊʦL™BäÎAAA¢þ«ýëׯ|£D Јt/’èÔÔÔÌ;÷íÛ·Ä›ôìÙóÂ… çÎ‹ŽŽÖÔÔ^ùܹs={ö$èüöÛoŠŠŠÄ{‚ÒÒÒÚ´i“ «MMM!‚Êâv] ^ðK¿P%QMM͈#DjbccSYYdaaÑjåyóæ\YÌd2µµµ‰Ƀ±X¬Y³f ©ƒPŒ$:ˆü•Ü@GWW7""B¤& 8{ö¬³³3‘Ê&&&ýû÷oµZCCƒ¡¡acc#ñnÜ»w¯¶¶Vøq;0¢€Ä@ñ"++K&“›››%ôpäÂÂB*•J¼>•J8q¢££c«5 †‘‘‘Ì¡ŒŒ +++yyyâ=™8qbTT”ðô !‘n è\è vÐwªÄÙ¶mÛƒˆ×¿ÿ>ïq5|]¹r¥²²’àiÈ“'O>uêñnÄÄÄ455õéÓGx5<¢Ä~Jh Ó¿ÿ¡C‡¯?iÒ¤]»v¬yäÈ —M¥R‰¯¤yùò¥¿¿ÿ÷ïß[­‰ëˆºÀЉ Ð@ìà÷(‘÷® )«”¼¼¼¾¾>‘šrrróçÏoµZKK‹¯¯oNNñ>tëÖíСC***­Ö„@‰ÛË;’è|ùòåëׯÚÚÚë—––®X±"!!¡Õš¼Y6yQ©T33³ñãÇìCss³¦¦f«ÛÚ1üG2ªD¥R“““ >t–Aƒ™ššvv/À/bGr‡FGG?øþýû‡âââÆ.Ý»w?qâÁÔ××9òñãÇJà?ŠÊUUU«V­š8q"Á€_ïÝ»w†††Äÿ#’Ä~Š´wILP(”1cƯïáááàà@¤fFF‘3Ž=zôîÝ;"3\ìú“&M"å „êëë‘Ð@!¤ªªBð†à×#84º t;ݺuC?Þ©’eêÔ©Ä+3™L))©V7:!„ÒÓÓõõõ‰lÎ "x6uêT‚‡,c8ú$:,F@ìHn sëÖ-âGæääØÚÚ¶ZÅbÍ™3çÒ¥KDî¹k×.âÃ9þþþˆrÁüHt;è°X¬åË—Ï»^TT4zôèV«}øðAFFfÙ²e­ÖüúõëСC…ŸøÇýøñcQÓsÖÕÕ!„ºwï.R+@'‚©+ÄN=BµµµÝÑ444L˜0xàææÆb±Z­6`À€wïÞµZ­¤¤ÄÆÆæõë×Gh&Ožl`` Òp‚@ #:ˆeee„зoß:»#¢QTT$¾ßª¡¡¡¡¡¡ÕõÅ cöìÙDRV=þÜËË‹`àR]]Ý«W¯aÆêë, ÿQð  Ð@ìHh “››+<õ7§””¾—þüóÏsçÎ᱓#GŽ<~ü˜HÊ…éÓ§ÿñÇD]PP0bĈææf‚]eûþý;ƒÁPTT”‘‘µ- ³@ €ØÁSW_¿~í쎈&<<üÎ;+ÿþ]ÐÆòššš .èëë{xxÔÖÖ®\¹²Õ»]¾|¹ººšà£ ÿüóÏ6+x2ÿu’Öè vzöì‰$pޱ±±¡¡!ÁÊóæÍt gËZ½zuttô…  jkkçÍ›gffÆ·þ·oßüýýïß¿OðÑ3gÎ$X“ =ñ_G¬Œ;¶¢¢"%%EKK«³û€ØÄ~•~ùò¥³;"š… °¿öë×oàÀ222‘‘‘¼»ÁCCCëëë—.]J乪ªªDNXæ«oooOOO|ðàåË—‰7¬ªªª­­å t ãB@ €ØéÑ£‡””Tmm-“Éìì¾UXX¸oß>‚•{÷î-dþˆ+Ð9yò¤¿¿\\ÜðáùjÖÖÖþõ×_·nÝ"øÜM›6íܹ“`e^555èGÚNsæÌ™1c•Jµ±±IIIaÞEEEééééèèàõ~~~xÔ§¬¬ !dgg·bÅ „Є ttt† räÈö=<8räHƒùóç²ËÓÒÒ\\\ôõõ---ׯ__^^ŽË'Nœ¨££ãååebb2tèйsç´ÿG@Ü@ €Ø!“É=zôhii‘ AWWW‚•g̘!$ñBÿþýñ{!xóæM]]]Þš²²² ÅÊÊŠÈCŸ>}*''§¢¢B°“¼p Ó»wï6ßSXX˜‚‚B@@€””ÔÕ«Wq¡……çiÑÎÎΜY5<==ñ× x{{{{{s&:MLL433›7oÞÛ·o½¼¼p”œ””´téÒææfww÷É“'§¦¦.X°§&ÅmÓÒÒ&L˜àææöñãGOOO Š­ # ŽTTT¾|ùRSSÓQ¯ÕŸMOOOOOHÍÂÂÂÚÚZkkkAðq|µµµ×®]‹WSSã­Æb±²²²ˆÄ.111‡JOOoó¼B¨¢¢!•ššÊú¡¥¥…óFkhhhõVuuuׯ_·µµíÝ»÷˜1c¢££===BÚÚÚÓ§OOHHÀÕ&MšÄd2“’’ðWee夤$///Þ5IÁÁÁÓ¦MCnܸ±ªªª_¿~ÁÁÁÊÊÊ8ÓªŠŠÊØ±coݺ½xñâÑ£G‡……={väÈ‘!ccãuëÖUTTYí€@qÔ»w¢ÏŸ?Œ:]ddäøñãÕÕÕ[­Ã`0„:!uuõyóæUUUݼySPsåÊ•œœ‚óe222‡nO”“””‰úðáçÌ/"iJcbbãâââââpINN޹¹y›»‡222ÂBø  ÒÒRƒÊY“³ÿšššø…BAÁˆèz Ð@áœÏŸ?wvGˆ 166&èŒ9²ÕaªÔÕÕÅÅÅ I¶pôèѺº:‚ÎôéÓ‰TÂÌÌlèСOŸ> 477'ý %%Åù¡¬¬lýúõÂoÅb±ÂÃõ´´ìììpITTÔåË—9öÖ0Æ÷»­©©)%%KäÐEº$tGªªª¡OŸ>uvGˆòððÐÖÖ&R³Õ-BÍÍÍúúú[¶lÁc ‚øùùyy¿~ýú·ß~{øð!‘¾ñE§Ó_¿~mhhˆ3QŒ=ÚÀÀ@Pe™V³Š=z´´´ÔÒÒÒÈÈÈÎÎZÅÇÇ›˜˜ÌŸ?‹{÷î0`Àëׯ?~ŒÊËËÃ3J}ûöEmÞ¼Y__¿¢¢"33ÓÉÉ CgÏž]¸p!“ɼyó&Bèúõë~~~¾¾¾ëÖ­³··?~¼´´tqqq~~þòåË—-[v÷î]„Й3gÜÜÜÔÕÕoß¾JLLôöönóï 1‹‘Gè¬X±Bx\‚¥¥¥±WœríÚµÂÂBáwKMMuqqÁKR„Û³g \D°X,ooïsçΡü§i<]•••õÏ?ÿ „Š‹‹OŸ>244ܾ}{~~þ¹sçž={†Waçääà¶ÆÆÆ6l(**ºpáBQQѬY³¼½½322Bááá·oßNMMÅ¿áØØX„ÐŒ3Ž;Ö£Gèè訨¨ŠŠ „Pff&BèâÅ‹·oßþøñcrr2B(::º?âFtGøîUUUÝBòòòª««'OžÜj͘˜!Ã!˜ŠŠŠðA…’’ww÷Ç0 Õ'9r¤[·n­V„Édª««ïܹ“N§ýúUFF¦ýÛËSRR8¿â¥?œ.\¸páBAÍñ~+!7\¾|9çW;;;ö™VùùùB{ €¤‚@q$YÎýû÷+++‰:K—.muN«÷ÉÊÊ’––Æ¿"!h4Úýû÷9wk‹ª¸¸X[[{Ïž=¡òòr‹Õ»wïVg¦bÄ‘d:–––—Ç ¯ndd$¼š“““ººz«3e»wﮩ©is S^^îàà0xð`„Pee%BˆïFw€8ƒš Žð Ü"þFŒÏbîÒ¥Kxሠ,ëСC---Bê\¼x±¸¸xܸq­>nРA{÷îmµš ¿ÿþ;Žrп:HtGªªªÒÒÒŸ?Ƨ¡ˆ¹ßÿH?oܸ!¼BKKËòåËMLLUhnnö÷÷OMMmõY cÉ’%Bv§ ×ÔÔdaaÁ^ sãÆ;v „êëëÛvC@g@qD&“ûôéÓÒÒ"þ³WÕÕÕqqq222­Ö<|ø°Ì!2™ìåå%¤“É”’’Z°`ðÅÆÆâœPmsñâE|N1Û³gÏpºõö9èè ¦úõë‡úøñcgw¤ÒÒÒ[·n%RSUUçëæëû÷†\'óâ¬Ll²²²%%%­=|úôi®H…8‹uêÔ)<~ÃÆ7Û³´Ð) Ð@Lõïß!ÄÎ5-¶zöì¹dÉ’V«íÞ½ûòåËB*$$$“ÉdÎÂ-[¶ÌŸ?ÿÁƒ!¼…JZºõ-±±±ÂSLA"‘Јf ) Ð@LIJ Î>ÎNˆÔÔTáÙ"]\\‚‚‚¸ ååå)ÊòåËÇ¿víZáë”BEEED‚!^ cöìÙ¼—Ø#:ð‰b g[ž?RÄÅÅUWW·Z-99ÙÊÊJÐÕoß¾µ´´ðîiRPP°´´,++Û¿¿––Öǃ‚‚¾|ù"è>6lÈËË#ÞyNø¤`|1èH$}$œ£€˜ÂƒeeeÝ‘Vøúúêëë ¯SWW'|Ô‰'¸Ê•””¾ÿN"‘ðñ¾/^¼8tè©©éœ9syÏîspphóêœÑ£G[ZZrÍ!„ZZZp$×»wo99¹VïC¥Rq¶) žòòòÚ6æ$ü±S8Ðÿ"GÚlÞ¼yĈîîî‚*ÔÕÕñÝK¥¨¨Èù6l˜¹¹y||üÌ™3¹¢œÆÆF …"|Ó– ÅÅÅ'Nœ8t謬,ïÕšš¼DšÈ¼•’’’µµõ;wÚÐ ðËŒ=º³»~tS8‘Óû÷ï;»#Â'$$øúú ¯–ŸŸ¿víZ!짨¨ÈÞxÕÜÜìëëûðáä¤$---Îj………S§N]°`N× *ggçÍ›7 ºÊ^‰L$µVß¾}/^¼Ø†>~tS***JJJß¾}«­­íÑ£Ggw‡¿üüüÿý·ÕjwïÞ’"*66ÖÆÆFQQ‘÷’¢¢"•JE}þüyöìÙŠŠŠIII¼{Ô=*///<–"%%EÈ–u‘€¸ÅȈ/üf}÷î]gwD ‹•+W ¯óöí[!™°êëë׬YÓÔÔÄ÷ª‚‚B]]ÝóçÏ­¬¬ÌÍÍÃÂÂøžÄsôèÑüüüVÏ×áõÏ?ÿ¼ÿ^xCö–«Šz@§ƒ@ñ…߬âèhhh´zbÍüqëÖ-AW©Tª···ŠŠ ß«ŠŠŠ¹¹¹#GŽÜ²e˶mÛx‡…˜LæÊ•+ïݻ׆å¥OŸ>=xð çºœæææ´´´Â¯_¿² Ù#:è ‰`ê ñ…߬oß¾í쎴råÊ­[·ª«« ©SRR2~üxAWÕÕÕýýý]•––þöíÛõë×---ùVøûï¿cbb„,sÂØØøÊ•+œ{Úedd¶nÝšŸŸ¢P(ªªªªªª555øjvvvcccß¾}ûöí«ªªÚjút€8€Ä~_½zµ³;‹ŊíÖ­›ðjÙÙÙÊÊÊ|/•””„‡‡ i«­­ýúõkAQBÈÊÊêŸþ!’;Sssó±cÇÈdò°aø.-\¸ Ñh>|ÈÉÉ)--Å%{÷îuww·±±166VSSsrré¡€N#:ˆ/¼á(//ïÆbøZmii9~ü¸ôU¡GZL}éÒ%A«sBEEE555#FŒTáýû÷&&&|÷„ ·zõjAéÖ]\\¶mÛF§Ó_½z%--]É¡¢¢¢²²2??¿´´TZZz÷îÝ¢>ðëA €øb¯Îñññ2dÈСC;·?\ÈdòÌ™3…×Ù¼yó¾}û+BÖ)éêê j[PP0qâÄ]»vµá„@GGG¾—zöìéèè±mÛ¶Aƒq^e2™#GŽ,--õòò266õ¹€_¦®_¹¹¹!sss*•êîîþíÛ·ÎîÑÿçòåË‘‘‘B*´´´ôêÕKÈÄ“¦¦¦=Û“'O^±b… «¡¡¡C† !’O”ÓóçÏi4𣣣q <{uöìYÞÔZ'NœÈÊÊÒÐÐrî@¬Àˆbªººº°°PQQ1%%eâĉOŸ>]¶lYdd¤i~±ÌÌLáƒLRRRBy{{/\¸p̘1‚*¸¸¸¹yHH“ÉäÍØ ħOŸ\]]OŸ>-|MÏØ±cµ´´JKKSSS§L™Â.///ߺu+B(00ï©?!*•šœœL¼K ³Œ5Š7·è’ Ð@L=xð€Åb;VYYùÚµk·oßÞ³g~׊ƒµk× ßÔ9qâľ}ûò^¢Ñh‰‰‰ûöíãÛ°¦¦fܸqùùù|£:ƒ1}úô7N˜0AÔ>¯[·®Õ•ËRRRnnn{öìùçŸ8U«VÕÕÕM›6ÍÞÞ^PÛªªªU«VMœ8QÔŽ_éßÿ=|ø°]gwü è ¦îß¿š4iBHKK+**jêÔ©AAAÇ“…ÉÂs?±X¬¿þúKÐ); åÙ³g‚)GEEÙÚÚ »:|øpvvv«™D¹|üø±_¿~¿ýö‘Ê ,Ø¿llì—/_zõê…ºqãÆÕ«W•””öïß/¼­ªªjHHˆH}¿XÛr¢ %.cà.<@±Ç&MšÈb±|||^½zÕ©]C¡ºººÅ‹ ©@§Ó§M›Æµ˜—­¼¼\H^ Ÿ;vºjooÏw H+W®ØØØYøÌ¥ÿþ'Nljj C}ÿþÝÏÏ!´uëÖ~ýú. ÓA €8úðáÃÛ·o{öìijjÊ.\»v­›››˜,L.**žp”B¡ j;iÒ$Þ¥¾XNN“Éd½“’’RYYɾúðáCMMM ‘zûâÅ‹¸¸8‰D¼ ^’|æÌ„ÐöíÛß½{gjjÚ†^€Îâ(-- !4~üx®Å¶ÿûßÿLMM‹‹‹—-[&(Pø5† väÈ!víÚõñãG¾—Þ¾}ëááÁwfŠN§/Z´¨  €]’žž>|øð­[·~ûöíÉ“'3gÎ|öìñ~644 „¶oß®££C¼BÈÎήwïÞÏž=;}úôáÇÉdrpp°HkŸâÄž·Â t8ÉËË_»v­wïÞxargtíÿÈÉÉ ºJ£ÑN:%è,A[[[AÛ³«««mmm9ï\WW·iÓ&:nmm½sçΩS§ ٨ť¥¥eÉ’%QQQës’••;w.BÈÛÛ›Á`xyy >¼ ÷t.tGxD‡3ÐyûömddäÚµk,XP__ ºqãFgõpåÊ•?tµ¥¥e÷îÝÝ»wç½”——WRR"¨aÿþýƒƒƒ9K¨Tê!CN:•””$%%õîÝ;¼L›ˆÒÒRƒ1{öl‚õ¹àÙ«––88 »®;oÞ¼©¨¨èÞ½{YYÙµk×233322Ø©%B$iÈ!8{•íëë+誼¼<;i—àààqãÆ <˜÷Rrr²´´4×8V}}=˜†~÷îÝk×®ýþûïC‡ à{Nƒމ‰iý‡`èС²²²t:}óæÍÂ3]Ä:ˆ<œSWWÇu·žžž‹‹‹………©©© 4™¿LBBßláÂ…ä»1J__ßÕÕ•o«}ûö­_¿ž«°®®ŽóAÓ¦MKJJŠŒŒ|ùò¥@§¤¤ÄÕÕ533³=ç+ÖÖÖÒét2™,êùËñbOÍÈÉÉ›››÷éÓ篿þBéééñÆŸ.ÃWuuõÇUTTø^ݸq£ †ÞÞÞ¼gñÕ×׳£º'Ož,^¼XSS333SøöòÀÀ@Ÿvž"ýòåK„¾¾¾HÛµ:ÅØ±c+**RRR´´´:»/ˆX£€Ø™2eÊÝ»wËÊÊ’’’öìÙãããƒ7ûääätv×þORR’5+ÊÊÊ/^ä{hòÊ•+9çà8555¹ººò†xD‡N§oݺÕÞÞÞÏÏ/<<¼ÕCt>Üþa˜/^ „8wøw )S¦èü@|ÕB(//Ï¢®®Ž³pÔ¨QÝAºt; .411aïd¦P(xktyyyUUU§víÿ¼zõJÈFkYYY¾£^½zuïÞ=¾ç>}úÔÌÌŒïݾ}ûöæÍ33³ÜÜÜÌ™3GxßN:uÿþ} …"¼ùùù!!›ËÚÃÛÛÛÓÓ/ý¹|ù2ñ†UUUµµµ\$@tìw­˜ ê¬\¹rÍš5|/±X,“ïß¿ó^0`ÀÉ“'ùFHYYY‚nH¥RçÏŸ¿fÍš°°0UUUáûúõëÁƒ[]¤LÐóçÏBFFFr7.sæÌ™1c•Jµ±±IIIùòå .ŠŠÒÓÓÓÑÑy÷îBÈÏÏú”••!„ìììpF÷ &èèè 2„ó4£ƒŽ9ÒÀÀ`þüù………ìòÄÄDÿ¬:ÿè ؇ÝeggwnO0iiiAKp^½z%--͛ܛÅb)((Œ;–o+///¾‡WUUÙÚÚ>~üXx&s¬°°PAA!==]SS³ÕÊ­b2™/_¾$‘H?ïøœ°°0…€€Î4ï¶¶¶ì:ÎÎÎS§NeõôôÄ_,Xàííííí=~üxöÕÄÄD33³yóæ½}ûÖËË‹Édâr>ÞÄÄdþüùêêêèÇÕëׯqª¼¼<>!Äw€ €®Ft 8ЇÅÈoß¾0aßKÙÙÙ\…MMM$‰÷dæææ#Gް—ÙršØÛÛsM!1™ÌÀÀ@ÞÊ---UUU à*ûöí¼yóاç –žž>kÖ,Qº/NOLLÜ·oþŠÏ+âHtx€¡sÏ |ùò¥ Å¹ÇŽã*LJJâ›È)**Ê××—·üÓ§OþþþB2†²éééTTTðN6!„X,Ö¥K—xËÕÕÕùæv¨­­Å‚¸X[[ó="™Óû÷ïÇ7|øðö§Ûüþýûĉ#""8 ¿|ùR\\,//?lذvÞÐé Ð@bXZZ¢ƒ ÅÖÖöìÙ³¼åÏŸ?æ-755å{ˆßŠ+¸F†šššlmmyW ±X¬åË—S©Tö×Y³f)((ÈÊʶñgà   àæævèÐ!ά¬,‹ejjÚêjh€øƒ@‰¡«««¬¬\^^Žó;vŠÊÊJ¾‡òÑétÞ]Bááá|ç­6mÚÔÐÐÀUxæÌ Þ𥤤äúõë“&MÂY*©Tª¾¾>û4á6{öìÙž={H$Òòå˹~"|n ?H:t$ çbÄoâN1wî\¾Ç"›››ó¦Jøûï¿y·yøðaJJŠœœWùòåË<È{çÜÜ\‡­[·N›6mË–-ééé/^ä{ö q4ÍÅÅEPbK<9i/è Ð@’Œ9!„O‡ëïß¿2dW!N¿páoå5kÖŒ=š«PWW÷СC\»Í/\¸@"‘ø®A~úô©……Å¢E‹îܹsíÚµèèhv §¶ùòå …ByöìßMò4íÉ“'RRRèÐ5@ €$ÁΣG:«¥¥¥¼é<}*//ÏYîéé¹dÉ®S’ûôéÄwqqKK˳gÏØ÷õìÙóÆ ,?~ü… ¬¬¬DêSSSmmí‘#G„ÔIOOG?ʶ¡R©8Õ[m ”„‚@I"++keeuÿþýŒŒ ''§_üôˆˆˆÒÒÒýû÷s•q–äääèêêrE9T*õÁƒ\qFKK‹ˆ‹‹‹ûôéÃÎm^TT´ÿþääd777---â=§R©™™™“'O ^óáÇ¡±cÇ¿9'%%%kkë;wî´­9ø5 „3§‚ÿt0cÆŒ¹ÿþƒ~} Ãd2 ¹ +++“““-ZÄY8räHÞÉ,%%¥gÏžqF?¥¥¥ŽŽŽùùù‚2~çææâ0o’º{÷®§§gvv6;ô!âÛ·oÖÖÖëÖ­›•••uttÌÍÍõññ â]!Ô*eeå“'O JDÊ);;/ÐùõÓ‚€Ÿ$Œ………¢¢baaá§OŸÚŸA$YYY\ë‹GŒ¡««ËYVXXxôèQΣG677ïÝ»—³p×®]B¶P1Œk×®ÉÊÊ®]»öÌ™3mØR~ãÆŒŒŒ={ö‰rBiii!A9.’v] aÈdò¨Q£X,ß³ø~žÚÚÚÙ³gó–<˜7'”»»;W‰´´ôÚµkÙ_›››wî܉rúðéÓ§{ö왓“³xñâ6D9 ;vìpss#ÞÿJÇ/ê³b $Ÿ¸wïÞ¯|hMMͨQ£¸†sž?ÂUÓ××—÷XámÛ¶qŽ?½}ûVø½¼¼øfJŽÅb•——+((üûï¿ÄóUÕ××çääÈÈÈðžý\è yp s÷î]‹õ˪­­ÉUxçήºQQQÕÕÕœ%øâ––ÎBggçÝ»w zÖ»wïÎ;'%%¥¬¬,j?æÏŸàÀ„ï¹ÌB<|ø°¹¹ÙÜܼ[·n¢> ¶ Ð@òèëë«©©UTT¼zõê—=ôÕ«Wuuu\…‹-òööf¥Ñh[¶l¡Ñhœu.^¼(''ǹ⸾¾^WW·ÿþ|Ä`0œœœè×*2™¬££Ã7›„p)))¡‰'¶í¹ñ‹‘» ìììÇwv/@+úõëÇ{ A$iÒ¤I—.]JIIÑ××ïØŽ 0oÞ<®=í½zõâÌÛÐÔÔ´bÅ Î:nnnœÉ’““:”””$èAÒÒÒaaaÆÆÆ¢öðãÇ™™™ÎÎλvíµ-B(55!4eÊ”6´ˆ-tº ²²²²²²Å‹wvG€@?~¼~ýz{î0eÊ”K—.ݾ}›ï–ïŸACCÃÀÀ€³äÎ;=Ú¶m»DYYyݺuœu¨Tª’’ÒàÁƒÙ%7oÞô÷÷ô”èèh''§6D9ß¿5jÔ¡C‡Dmˆ¿}û¶gÏž&&&m»@sæ ñV¼êëë=zD&“;dŽªª*ï–{ nâãã;» à]WHª©S§"„’““¹vnÿ rrr\çGGG¯ZµŠý•Á`()) 0€]’——÷æÍÎ&ëׯçlÂÉÏÏïôéÓ"uéË—/¥¥¥ñññjjj"µår÷î]:nmmÝ£GöÜ † Ð@R :tРAÕÕÕÙÙÙ?ûYS¦LY¾|9gÉ“'OFŒÁþºaîUG»wïNOOÇŸ™Lfyy¹‰‰ ߃mZZZzõê%Ò:â/_¾L˜0¡±±ÑÌÌL„C€[·n!„ìííÛ+€¸@ fgg‡~¼§ª›7o666r–Í;nii‰‹‹³´´ä¬0xðà °+ïØ±ƒïKJJ¤¤¤öìÙÃwI5ßÁªÂÂByyù¥K—Þ»wO¤#ùjnnÆ t РK‚@ †÷Öý‚@gåÊ•MMMì¯555 ƒœAJJêÕ«WêêêœMöîÝËÎc•žžÀ{ÛªªªiÓ¦ znBB‰'8KÂÂÂ&MšôêÕ«Õ«W·ùÇáôèÑ£ÚÚÚ¡C‡jkkwÈ b$˜µµuŸ>}Š‹‹_¾|ùóžÒØØ8nܸž={²KÎ;Çy|NZZš¬¬,ûëû÷ï9gµB±±±|—ÑTTTøøøèéé zô™3gvïÞÍž«««Û¶mÛ¶mÛLMMÛüãpÁ7‡ãèª Ð’*>>^OOOGGGGGçÝ»wÝÎA&“зõO"//ñâE΃ÁÞ‰]^^¾dÉδ'OžtttÄŸïܹÃÕ–­©©ÉÄÄDȇ%%%ùùùwïÞ]¿~}ffæ–-[>þœ““Ùt¢X,ÖÍ›7B¿`ç S@ Ä]zzúüùó‡ fdd4gΜ3fàU«ÆÆÆÞÞÞ666ÝÁN6sæL„PllìÏ{ijgÏŠŠŠ8KþøãœX!TQQ±dÉÎ6x^‰Åb­]»–oN«Ë—/»¹¹ îùóç/^lee6gΜ¨¨¨nݺq,µ_FFƧOŸ؆³˜ÎÑbíúõëëÖ­SSS›5kVssóýû÷«««555B¿ÿþ{bbâíÛ·;»›iܸq½zõ*,,,((øIy¯"""´´´† ‚¿+))±õ³°°°°°`WÎÍÍ511éÞ½;BˆD"%''s­ÝÁŽ;*ä¡4-"""##!dkkÌw•O;]»v ý½ÄÄD¾Z÷îÝãÊh3Ñ⫱±qÇŽæææÉÉÉûöíKIIéÕ«W«ÒÒÒ\\\ôõõ---ׯ__^^ξ”‘‘±xñb ===''§Çãò‰'êèèxyy™˜˜ :tîܹøRTTž#Ãd~~~x¾¬¬¬ÌÑÑ^´hѰaÃ,,,BBBX,ÖÏù}ð'%%…§]®^½ú“adddeeÅþ…??þ<''‡}©¾¾ÞÅÅåãÇ¡òòòššÞ(ÿ~ÒÒÒ„‡eqqq¦¦¦ìÂK—.]´hÑ‚ ¸6µ“ÉŒ‹‹C9;;wÔ=Û`Μ9ø BWWWH) @‡ƒ@ˆ¯'OžÔÕÕ­^½Z^^—(((œ;wnýúõBZ%%%-]º´¹¹ÙÝÝ}òäÉ©©© ,øþý;¾úôéÓ'Ož >|Ñ¢E,ËÇǧ¹¹!4~üx„PZZÚ„ ÜÜÜ>~üèééÉd2Bœ™œñI}¡åË—ã Þ™™™ŽŽŽ&&&­Tü ³fÍB]¹rå'ÝßÍÍóDãAƒ±g CCC=zľôþýûY³fõë×!´iÓ¦sçÎqݪ¥¥eþüùyyy­>ôìÙ³>>>œ%®®®¥¥¥Ë–-×ö{ðàAuuµŽŽNçÎ[-_¾|öìÙ¡+Và$iÊ”):::FFFxÒ544|ñâ…ððZH”À:@|ámggwêÔ)‚oâÒÒÒ÷ïß—••}üø±²²òÓ§OÕÕÕ555_¿~ýöí[}}ý÷ïßi4Ng2™‚ÆŠF­¦¦VZZúäÉ"ÏIcc#×öõ+V°cfÍšåêêʾ4lذÀÀ@„‹ÅêÑ£ï9È999 \YÐy½|ù˜•––ž9sfÁ‚jjjNNNŽŽŽ³gÏÆ±iûáÐÇ¢_¿~ÊÊÊœY/úõë×£G=zààÕÚÚÿ÷?fÌ„ШQ£444„„×£|þ›`_8…u]]H­JKK װʇð‡¸¸¸7r"œGÒáÕ?!<;F|ä€=Â1uêÔÄÄÄššδނ´m4™L–’’’’’"‘HR?àMO—/_î“‚9½~ýzß¾}ì]T=RQQaoçÌ^yýúu¼ª—Åb‘H¤£GòÞÍÒÒ2&&†} Û·o—‘‘ÑÓÓûþýû¸qãÆ·iÓ&Îüí×ÔÔ„·ªÍ™3§o+cccΉ?„аaÃð9×>>> ?~ÄÙ_¾|‘——ß·oŸ²²²“““œœ\bbâÚµkñqÕ¾¾¾§NZ¶l;ÊGá(ÿÖ­[ÑÑÑ‹/î„ñ_¦¦¦òòò'Nœ8zô(ûÕ¸}ûöž={®Y³FP+MMM))©ØØXö„§½{÷:ôàÁƒ¼|ùòöíÛ‰÷‡= Â¹•{üø1^M’™™I¡P¦L8p`ËÿÅbµðÃb±˜L&ûƒ ìêÕ«ìcú:„¢¢"û€c„Phh¨½½=t¼½½7oÞ¬¥¥…b2™;wîćûõïßÞ¼yœ÷)--]·n]LLL«ÝûôéÓ¿ÿþ»lÙ2==½Ÿ”_:!!¡¾¾^CC#))‰ñ“ÉdniiiÃ熆††††éáÊ•+}}}ããã“’’-ZÄ•ñ”7¼åðß_ÊÊÊÛ·o÷÷÷·±±3fŒœœ\NNN^^ž+‰ˆˆ(+++))A>}ZYYÙÀÀÀÁÁÁ××wݺuöööãÇ—––...ÎÏÏ_¾|ù²eËB²²²õõõÑÑÑ?~LKKÃmGŒ?Ÿ9sÆÍÍM]]ïäJLLÄG¶àɲ½{÷0àõë×x s^^{kL@@ÀóçÏëêê’’’<<<8OÏâéÓ§møµàˆ‡7*²µµ-**JMMe/!êx9û«££#Åyÿþ}jjê‘#Gp9‹ÅZ½zµµµussóÉ“'SSS¹î3kÖ¬VÏ2f±XuuuªªªEEE‡m*++Û²eKÇÞ¹OŸ>rŸ©S§jkk=zÔÜÜœL&ãÿ€9ñ†×£|þ› ÐbÍÅÅE]]ýÔ©Sׯ_§ÓéÞÞÞ+W®Dýïÿ{ÿþ=®†_Z–––3fÌ P('OžŒŽŽ–’’êß¿¿ ûß¾!!![¶l9wî…B0`@aaaXXXVVÎopñâEUUÕ)S¦àäGÑÑÑ8Ð144ܾ}ûßÿššª¨¨¨««[PP““ƒëC999ݾ}›Éd.Y²ä?þø©¿2™Ì7Á“»»ûöíÛÃÃÃ;6ЉŒŒ;v,û,v~+ K—.á9>‹%--½hÑ"„ŒŒÌóçÏywÆÝºuKøâªúúzssó-[¶üì(çÇ·oß–’’Z´h‘‚‚‚ôd2™ýYJJª Ÿ+**6lØ@¼'ß¾} Ã[Ÿ:uJ__þüùø‰DòññY·n]qq±››ïd(ox-<Êà¿  îFW sá3`³³³Ã«5y™™™%$$´úÐüü|®’… .\¸PPýÕ«W8p ÕÛþT®®® _¿~íÀSõŽ;f``€èèhSSS¼ ‡Å355õìÙ³aaa}ûöÿM°ë €¶»uë>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0"##;ð¶ì£Ïœ9S[[‹zôèç!{QQQ3gΤÑh~~~x2‘-??÷îÝÂGhÊÊÊÒÓÓUTTöïß/R” ªµk׿çç×ÕÕá¬B"×_fĈo~¸sççÕŠŠŠêêjggg®½‡ØêÕ«³³³Ÿ>}ºeËö"6;;»ØØØ—/_>þ<))iß¾}ü?b Ú.88811!Ѷ7 ¿¹ÏŸ?ß÷\¶l{ÁÇo¿ý6vìX„Ð;w8ÇÌN:åììL"‘¼½½¹Ž¼6lØ•+W„œó[ZZ:vìX*•Ú}æD¥R:´gÏ„PHHHxxø»w‹ÕÔÔ&Ožü“Ú~—/_>pàÞ!H&“9—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>………#GŽlÿ óóó+**Øç%²wboß¾N§ãÏ×®]srrjhhèÞ½;çZƒqâĉU«V y„––V\\ÜÏ8²F£Q(”ªªªçÏŸãíuxÃ>ÆpÑ¢E?uô¨BCCÙ©j“’’6mÚ¤¤¤„¿—––"„"""ôõõ…ä~ Ñ +!“É¡³gÏvÈ L"‘~F”³cÇ]]ÝÆÆFmmí³gϲ§o>þ|ãÆ ‰$óVB¤¤¤°ç³²²²ØQBèÎ;¸üõë×\{ø¼ РKñðð ‘Hׯ_Ç'>·“¥¥%N¤…ŠŠŠÂ¯Û7²‡²ètúÖ­[™LfII ×Ãöööÿûßÿ‚SRRrÿþ}Îz:DCCNz0hРÜÜ\Þ]Öááá4mêÔ©5€ÿtèR444ìííi4^oÛN–––£FŸ·mÛf``€3Q°w°-\¸PQQñáÇì-å4ÍÖÖ–oúU:þéÓ'mmí„„„Ž:rKHHÐÖÖÆ[µ=<ZH·+**Š‹‹³³³Çwýúu‚÷«Ó»wïh4ñ½Ü ûöí³··766þý÷ß•••ÍÍÍ+**vìØ!''×¶ ÙšššóçÏ“H¤Õ«W·¡¹H”””¬­­ÅíÈlÀËÑѱ£öý1]ÖªU«ÎŸ?åÊ•-[¶hjjŠÚœ4¾¤¤„L&?~|ðàÁ,+ àóçÏ«V­ÒÑÑA•••ÕÕÕqæÜFÕÕÕ}ûömÈ!8ßAkÖ¬±¶¶ÆÑÌ™3ÍÍÍΞ=kjj*jç9;v¬©©ÉÞÞÞÀÀ =÷!¢oß¾r‚ £À®+º,MM͹sç2™ÌÀÀ@QÛ¾}û6$$!ôúõk))©¦¦&mmm‰tóæÍäääàȉÅbijjÆÆÆrN'[XXäçç‹ôÄS§N±wŠmÙ²!4}úôvF9µµµ¡¡¡¡ 6´ç> ]Ùï¿ÿ.--QVV&RÃçÏŸgee!„\]] ,,,pN ==½àóu>|ø`eeÅ{,¡††ÆñãLj?.++ëСC111ì¤ ƒvttlÒ®#GŽ466N™2¥@BA @W6xð`<¨³gÏ‘𛛝Zµª¶¶VNNNJJJMM §k¨¨¨°´´ÔÖÖF:tè·ß~ç$cW¯^‹‹£P(BŽ'æUVV¶dÉ’#GŽôîÝ»¡¡Ýßßÿï¿ÿnjj©çœ>þ|âÄ ‰äïïßæ›$:tq7n”••ŠŠ*..&Þª_¿~ÖÖÖ=zôÈÈÈ:thrr2Bhúôé‹/ÆY3Bœ»µ_¼x±gÏQS‘ÇÅÅ™™™555ùøøhhhôéÓ§[·n$IZZÚÜÜüÓ§OxásÛážfffm¾ @¢A @§¥¥µpá–––íÛ·oåëëûÿØ;óx¨¾7ŽŸÙÌ0ÖˆJI¦PIiW*-²¶¨Ð^TT-¢„’6-*E›’½ðmJ…’²•Ý0ûÜßçÕ¼ülmB÷ýG¯;÷ž{ι™¹÷sŸç9ÏóãǸ¸¸ŠŠŠòòr,[\\üåË— >üúõëqqq¼¸.—Ë`0ÆŽ›íüƒñîÝ;€¨¨hffæ—/_òóó‹ŠŠŠ‹‹ËËË«««ËËË¿}ûöýûw¸Ä½|ÿþÝßß‹ÅvìØÎõ€‚‚Ò@——£ ôdeewìØáéééèèøäÉ“?¦AäüùóGWWWNNnýúõEEEfff÷î݈‹‹'''ËÈÈÀÆ•••cǎݸqã§Q[[ëéééâ⢬¬œ’’«ÕäååÁˆiÁ›s¨T*ôô¡ôrŒÑT:ÿ¨Ð釔••íØ±ãoÏåÏÜ¿_`÷Y˜SçíÛ·<€ÙÛ‹Åüýýá}}}:>pàÀ={ö¸¹¹A•“‘‘!//O¡P<<<ø™ÃÂ… çÌ™C£ÑDEE{TåöìÙÃår---;‘@¨‹”——ïܹsîܹ¥CDFF¡Bç_:ý†††÷ïßóÒç£ôN,--Ø}–L&:tÈÚÚzÿþýK–,ißtÿþ}ƒA¥R…„„´µµ•””¸\î£GÜÜÜŠ‹‹ahNvv¶‰‰ÉÍ›7eeeÛ骸¸øäÉ““'O¶°°HJJjY «' MNN–––þ[¹sdeea"”^KTTÔßžŠ€@…Nÿ„L&ëèèüíY ´‡à_%׬YãëëûáÇ“'O¶˜üæÍ›Áƒ{{{“Éä™3g^¾|ùÁƒ$iýúõ²²²P¬¨ªª†……µ³Æª¡¡L&¿ÿ~àÀÁ¨‹K¬;;;£…ÊQPºAÉd2üH£Ñ¸\®ˆˆHo¶¡Bå_ƒÁœ;wnÁ‚çÎ[³fM;•>wïÞ]QQÁb±DEE Ž92yòdIIÉ#F âää4gΜ ´¥rmll^½z•——·páÂ… öØ5µ‚‹‹KIIɸqãÌÌÌ9. J¿–ï}ÿþ}fffee%›Íž6mÚŒ30 ‹Å„¿=ÇV@W]¡ üCLš4 .5ß¹sg;Õ›‡ ¢®®îàà°}ûö/^hiimÚ´)-- ‘‘ñîÝ; VOüõë•JQWWÏÌÌì©Ëh›/_¾\ºt ‡Ã;w®7¿b¢ ô9I$Ò‘#G¦M›fiiéèèxøðá ÉäE‹%$$àñxAh4ÚßžisP¡ƒ‚òoáìì>>ƒîPjD”?‚ÅbcccÚi“““ciiÙ Ë­ BåŸÃØØX[[›Á`4u`åääœ;w®°°J¥²X¬ÆÆÆøøøººº]»vÕÔÔàñx›–¬òòòlll PTTL¸q«?~pþüy^eP”nƒÁ¼yó¦ý«V­zóæ··7¯\]/¡îJ¼mA¨Tjo»H”føûû0 ..îúõëpžž^³6 ƒÅbUWW'&&ÊË˯]»–w(>>^WW·¶¶VUU5##CÀáÆ-AÄ‚N§›™™Í›7ïïN¥_R__ßÎQ//¯àà`UUU.—Ë+Ó’ÆÆFvgáp8§3ïêª+AÂ7JJJ~ýú5jÔ¨I“&Mœ8ü^\ÚÅþQPPzYYYŸÕ«W;88Ìš5‹B¡Œ1BEEåãÇÍZ²ÙìÀÀÀÅ‹ãp8ADEEãããwïÞ >tÑŠÃd2Û¹-òɱcÇ222†êîîÞÅ®PPPZ¥¡#%%ekkæëëÛj6›Çã¿}û–œœÜÑ¡‰DâòåË;ö×%¡ƒ HVV–ŽŽNUUUÓý7nܽ{7™L¦Óé¡™S寳hÑ"SSÓ;wî¬]»6!!H$µšã8>>> `òäÉk׮ݽ{·¥¥¥››[×'Àd2¯_¿~íÚµ¤¤¤®ôóòåKooo€&ÎAAé!Ú‰28p >>^AA!//OUUµYƒââb €””TG ÀX,VRR’H$~þü¹¤íõЉs ,ëË—/óæÍk¦rµµµÞÞÞJJJË—/OOOGUJ¯eþüù#3uêÔ^¸0²G9uê”’’RNNŽ““@__¿Õfbbb¦¦¦âââþþþ–––]—ÃáO™2åýû÷ÅÅÅ]éêׯ_æææ‚ìÝ»wêÔ©]Ÿ J« 2¤­Cbbb99¹}ûö}ùò¥eøŠ¼¼<‡Ã©««ãr¹˜"$$$,,xòäÉÎͼó°yóæÊÊʶp8œÄÇǧ§§ËÉÉuº1 JϱaÆ—/_ÆÅÅ™ššR(‰ô·g$PDEEoܸ1oÞ¼+W®Ì˜1ÃØØXDD¤iÔÞ©¨¨¨¨¨tqDA"""Ž?.''wëÖ­ &{ö¬C£#òõëWøÖ‚Åbyo0M·mâ}´z"?Œ;ÖÃÃc÷îÝVVV***d2¹¥Ð‘““k5qNGIHH8vìƒ9{ö,4_3™L˜PµU¸\.“ÉÄápm¥[=tèPrr2™Lþôé…Bi©Zš©™®_Ÿt×ê³µk×&%%}ùò¥[zCAé4t:½e!Þû÷ï1‚ÅbQ©Tkkk€¡¡!, Ü ~ÞFZ’ššÚ‰³šÒI¡Ãb±ðx<•Jm«¢¢bbb¢´´tUUÕ÷ïßÛò«%&&Μ9³ssÐh4 󯽅£ ggçÛ·oÏœ9sÁ‚oÞ¼Ù¾}û‰'V¬XfggG¡P,,,>|ø’’øcIð–°X¬I“&õÀÄøyÔŒ–j‰H$2 “Vm´8îÌ™3¢¢¢Û·o¯­­={ö¬˜˜˜­­mMM§§§¸¸øþýû«««]]]ÅÅÅ«ªª<())éææVYYiooÁ`¾~ýúñãÇëׯ/[¶Œ§Ã‹ÅÚ»woPPиqãž>}jeeuïÞ½±cǾxñbÓ¦MaaaªªªIIIeeezzzŒ‰‰)--7o@(**"ÚÚÚ|hÄþ¦éµÃM7Ú9Äë¤eÞ!ƒñùóg~æ³`Á‚¯_¿¶Ü*³fÍ4h?]¡ ô(X,vÆŒ$‰N§Ã=FFFššš®®®‡nÚÒÕÕµ¦¦FRR²Õ~ŒŒŒ²²²ø÷ùóçž3N ‡Ã`0ÚyC²´´8p ŽŽN@@ÀàÁƒ[móíÛ·3føûû·óJ׺ººÃ† ®¯¯G…JOP\\¼yóæýû÷8ΦM›¼¼¼LLL|||FýàÁh¡µ³³ 322êÄ(°zTSI³m@[‡š*Zí¤C3¡P(ùùù­jlläp8<󒘘¼‹áñøaÆÁµWBBBãÆƒÛ$iÖ¬Y0.XDDD___XX†î?~Ç@e€Á`p8ÜÎ;gÏž-''ðððX·nìÇßßßÁÁ.µ‘‘¹wïÜ–••õððذaÀÏÏOWW—Éd6•)MÕLÓýøu‚üüü+VðÓÒÆÆ&&&æÉ“'¦¦¦ð¿«°°0>>ž×`Ë–-=5K”ŽsSgdd¤¥¥!rãÆÒÒÒfë0Œ²²r;Ú ¤¤¤Uqßl6»ÓsæÑù<¾½sedd8Naaá‹/f̘¡¬¬Üô(—Ë­¯¯0`@mm-,kÜ!„„„¤¤¤ª««ÛŸ JGÉÊÊÚ°aógÏ>}ú„ ˆ‰‰ ÜÃá +++‹ŠŠ6lØÀóCëèè„……ub,!!¡ôôôn›úÿÓLµ”GÍ>Òéô™3gÖÔÔ(++khhÄÅÅýüù“×/Û)´åÀmQQÑmÛ¶Ám2™ •@DDdõêÕp[XXØØØn¯X±"**ÊÕÕÕÉÉéÀ«V­ÂãñAVV–w˜6mÜ&£G†Ûx<^II nþüÙÊÊŠÃáìܹ“÷ê‹ ?yòÄØØxçÎOŸ>ÍÉɉ'‰QQQ¶¶¶0kȳgÏx~Õùóç’H¤»wïb0˜•+WÒh4%%¥'OžÜ¹sçðáÄlll¢££áé–––0qÀôéÓÓÒÒ„……ÍÍÍwíÚ%0ñ‡Ò×a2™ß¿722‚n) Ãb±–,YÂ3ð@¦N*øÚ/¤“Žd‰$,, W‹µŠ„„‡Ãñôô\·n]Ël:L&S\\¼¼¼¼¢¢‚Úqðx<‹Å4hPË_((]¤¤¤¤¶¶¶ººZAAÀ{½F$!!ATTTJJJAAáåË—¼€Ó¸¸¸¿6ݶÁb±8* !!!"‘¶"""¢¢¢bbbâââ’’’ –––——‹‹ùôéS}}}NNεk×`=‡îªHŒÅb—.]üøqEEE___,Û!›naa¡¾¾~cc£‰‰I¿)õpáÂ…Ÿ?ÖÔÔhhhܸqcРAêêêVVV-âZXXH$ƒó§1 aaa €††/† `llÌ;ÝÊÊjÑ¢E€×¯_ëééM˜0áÂ… —.]Ôõ¡ômX,–Pjjêž={^½z…Á`òòòœ˜˜Ø¬%ï-¥WÑIs|——¯­­mºßÓÓÓÈȨ²²RSS3%%E]]ýùóçcÆŒùøñcÓõ †ÍfŸ?^FF¦£›šš2¤¡¡¡s“GAá «þþþp…dAAA …¢§§çåå•––¦¤¤”šššíàà@ vìØagg§¯¯?sæÌœœœ·oßþåËè&(Ê‹/´µµÃÃ÷oßîççghhؽÍ™3gΜ9oß¾õòòjllä_è|ûöM__¿¢¢bæÌ™P$uïÄþ¼ƒ™>}:`èС¶¶¶OŸ>mÚrݺuªªª[¶l177Çb±Â—/_ÖÔÔP(hÅèèèp8xº¾¾>‰DЉ‰±µµµ²²X[[ûûûoÙ²MÿÒ>0{ÍÍ›7anôóçÏûùùmÚ´)22rþüù¼P]))©-[¶lÛ¶Ëåö¶f—ü>ŠŠŠ999¼³fͲ··ÿüù³¸¸xPPÐÉ“'?|øHOOo­ رcG3—ŸvvÊ((ÿÇ•+Wà×éöíÛ-zyy)++ß¿?))IIIÉÃÃcÙ²eCCC,{ñâÅÛ·o4HWW÷É“'žyA¡P–.]z÷î]xK—.]ºtiOŒ¥¡¡\QQÁgiª¯_¿þøñcôèÑwîÜéz>åÞÕ+W®^½ ³®ý---CCCXHÕª>áU+[¸paLLLee¥¬¬l'&Œò/%ËðáÃ÷íÛçéé w²ÙìÍ›7ÿúõkÿþý·oß622âr¹~~~0ÕJíoBgîܹ¼Å ÆËË‹J¥NŸ>½¢¢‚×FOOoâĉmÕ§HJJê‹]__¿ýê©((¢}¯ß±cÇŽ;ZÒ××ç¥×»uëÖ“'OúMÁ“É“'‡„„¬Zµ*$$„Á`\¾|¹Go[|šu?}úd``P^^>eÊ”ðððþ¤r …Wtì\¸p!88X]]A›7oÊÈÈ4ûŠòBA[¦óIII¡P(€×¯_‰Ä¶–Æ  °Xl\\ÜÒ¥K[~‘8€ÃáìííÏœ9SQQaii k¹ôÎÔä:666$©ªª*::ÚÒÒRSSóÀMU.,oË:Êd2ËËËù´¦¦¦ÓFAéF~üøqïÞ=6›M¥R=z¤¡¡Ñ-™fz ÚÚÚ÷îÝ[½zõÇkjjBBBþ®°xóæÍÊ•+kkkg̘ÚoTNdd$ô4Œ5ÊÌÌŒòýûwhnô÷÷WUU]ºt©³³sPP˜˜Ø¥K—0Ìüùó½½½¿ÿîèè(..—¸ž8qBAAáÓ§O0ñAVV/–ÙÕÕõýû÷uuu±±±ëÖ­ë7ÿ“(ÝNaa!‚ ‹/nkÝÓÆŒcccÃáp’““{gt¤óB§¢¢bðàÁÖÖÖ%%%pý“'OxÖ-sçÎ…¥¼º4M”^FFF†ŸŸ‡ÃÖÖÖvvvþÛ3êffΜ¹lÙ²ÿþûÚnÛY|УܻwÏÚÚšÉd.\¸0((¨?ÝLNŸ>ýíÛ7À­[·¤¤¤ŒŒŒx/ÄðøíW8qâÒ¥KaRJ:^ZZ ³ÂÃÃÍÍÍÕÔÔÔÔÔŽ9âëë›@&“•••sssÓÒÒ–,Y»Ò××úô)‡ÃÙ°aþ}û~Å(}EEÅ­[·¶³º›ÃᘚšfddÈËË÷f•:-t˜L&‰DÚ¿?‰D:|ø0•Jussswwo¹z^KK‹Á`ô§{ ø×UE]]=>>ÞÄÄ$''GEEåöíÛ:::‚œƒÁptt¼zõ*`ÇŽ®®®ýl9tÓ”9|j–}ÆA6ÅÂÂ.Âj•]»vuº`Ê¿CVV–´´ôW!444½yó&''®ÐìtØõoTWWkhhœ>}ÚÍÍmÒ¤I•••®®®«V­â5ÃãñÖÖÖ/^¼••E­£((}…ÿþûOGG‡Á`,[¶lïÞ½HïÙ9¾|ù2eÊ”«W¯âñøK—.ÁÚ‚ºÿ S=À„:((í0nܸû÷ïóócÏÉɱ¶¶3fLo.ôÔ1CKQQ‘‚‚­[·¶oß^WWwæäähiiÅÅÅݼy³¾¾>""‚B¡¼|ùrðàÁ,‹ÉdöÂôA(((|"&&vÿþý3gθ¹¹]¹rå¿ÿþ»~ýºššZÏÈår===½¼¼Øl¶´´thh¨ººzÏ ÷/àíí Ã}‚ƒƒGÝõâ¬(ý óßÿñÙ800pݺuZZZü,ŸŒˆˆhYÛ¼ 1Œ……›ÍÆáp}çé€ÐÉËË9räÒ¥K###›*//Ÿ?þ›7o‚‚‚ttt"""¤¥¥A÷åCAAù‹`0[[[}}}SSÓ‚‚‚Ù³gïØ±ÃÑÑ‘Ïeá"##ÃÒÒÖŠÚ³gÏPÇw×é9-Qz', ‹Åv¨ÈÔÎ;333Û_X^WWÓÑɼÿ¾¦¦FSSÓÃÃCTTƒÁp¹Ü:ªªª»víj©r åå円†‰‰‰?n«¸ JßeäÈ‘)))žžž§OŸ¾páÂ7\\\ÌÌ̺Kˆ”””¸¹¹Ýºu 0tèÐË—/kiiuKÏ(((üSXXX[[Û¡5ÎÙÙÙiii222ŠŠŠmµù;Nƒ÷Ú)¤ÕüÆè|úô©¸¸¸ý”áïÞ½[»v­¼¼|çêþ   ôr‚““SJJŠ––V]]ÝîÝ»liiYTTÔé>¹\n\\Ü®]»ÔÔÔnݺE öîÝ›žžŽª”¿Â¨Q£ø÷[ñxüøq;*@ê{öìé\N/~_Å”••wïÞÝ2kP3BCC½½½mmm{anD”naÔ¨Q111/^¼ðôô|õêÕÝ»wïÞ½;yòäU«Vñ™A¤¤¤ÐÐÐÆÆF‹5119q⟠‚{3T*5""âoÏ¥=:aøwxýúuGO wqqA¤U¿Ò»wï&L˜ðåË—†††ââb^ሖ >>†††#GŽ?~|||¼µµu«+íììšË{yyM˜0œœŒ HTTÔ´iÓÄÅÅù¿]ð%t²³³‰Dbii)?Y,Ö¦M›RSS Æ×[͘1£Y&åöiza E^^ý¦¶dðàÁ0õJofË–-ýàÛK¡PÎ;çîî~ãÆ¤¤¤çÏŸgeeeeeñsî¨Q£444V®\9gΜž¦@‘““»yóæßž Jg Ñh £%ñóósss{ðàÁëׯ fΜùãǃ¼uëÖ lß¾6ž7o^nn.Ÿ=Cãh\\,5¨¬¬¼lٲdzÙl~zàK訫«ûùùñ9'@zzú­[·ÚIZyöìY^^ÿÝòPSSÎÌÌ$‘H4­=ôoDDD-Zô·gò!""beeeee… ÈÇ“““ß½{W^^^[[ûãÇ?~ 5JLLLZZzôèÑÚÚÚ‚1ú¢  ðOUUÕ§OŸ:goöòò233›7ožµµµ——WQQѯ_¿Nœ8‘››ûóçÏx{{ó\ÛÅÅÅééé’’’‚ÔÕÕ)(((**––– c±ØÚÚZyyù÷ïß3™ÌÍ›7ëééq80|øðÀÀ@¸Í=ð)t°XlGC“._¾ÜŽÐÁ`0X,vãÆê³éé2™ÜÐÐÐo*)¢ ô0Œªªªªª*oOjjª®®îøñãûMw”~ÌСCïܹӹs™L¦••Õ‹/.^¼xâÄ .—«¨¨Î;*$$Äd2ÉÎÎVWW—““#‰ À`0’’’òòòÂÂÂÐKÅd2?~ü8nܸ­[·:88DDDX,N"‰D"QHHˆF£ñ#tþ/ 7Ë;þG’’’*++ÛòRC¾³0™L,[TTtîܹÍ EÀÀH[e}QPPz?þìô¹‰‰‰—/_666~óæÍ°aÃÈdòýû÷ÓÒÒètzEEEQQÑçÏŸåääÂÃÃ'NœXWW'&&6hРÜÜ\:þêÕ«·oß„„„0}úô•+W²X,F H$RJJÊÖ­[ai)>½ÿ¶è¤¤¤ÈÉÉu(’Àf³£¢¢LMM[= ×d!òøñc11±²²²¶R%b0˜Y³f5ÝSYY©¨¨(,,ìàà "B§Ó{"w JB]ƒ‰‚ÒWøãòêöÙ·oŸAccãˆ#‚²²²´´ô‡Æ—‘‘1yòd˜pòäÉyyy3fÌ`2™‘‘‘FFFðt__ßÉ“'———ËÈÈL›6mݺuiii£G†0}útÞ’F>“xý¹Ñ„ ¢¢¢:qµáááM½W?~ü0`À÷ïߥ¥¥eddŠŠŠÖ¯_ ÓéÎÎέŽB šÕ,//OOO·´´444\µjU}}ý³gÏôõõi4ªuPPz°jÑAAé+tQèTWWïÙ³çÖ­[gĈqqqƒ1fÌF¡P`KiiidÓtµ¹¢¢bcc#™L¦ÓéÇçp8cÆŒ÷f‘C°¸8?Sú³Ð!“ÉXiˆˆˆ(..Æápžžžƒ†Ö§ŠŠŠÂÂÂׯ_»ºº~ÿþ¶$‘H[·nuwwç§ÛaÆÁsçÎЉ‰=yò$77ºñPPPzPè ”¾B‡jQµÊí۷ׯ_¯££Ãb±Ølv³£X,‡Ã1 ,›™™iggÇ;:bÄXÐ üŽráEá4[OÞÍËË;'th4ÚÖ­[###UTT¬¬¬RSSïÞ½[\\ìééY^^Îår]]]}||`c))©ÇËËË(++úôIVV–ÅbÕ××S(Xfëëׯ™™™ ,PWW‡ù9ÜÜÜJKK©T*‘HD«k¡ ô*Д¾E·¤½Ø¶m[vv¶°°04ÃðúLKK›‚ 0>[»H~~þ€–/_nkk;iÒ$Þ~G¥¤¤ÈÈȤ§§_ºtIWWWQQQIIIJJŠN§w{â‰?6›M :‰Ü”]»véêêÚÙÙ©©©q8œÊÊÊ   ‹úúz™´´´qãÆeee5jĈïß¿Ÿ8q"‘Hüþý;‡ûùóg^^ž¹¹9''Nœ4iÒÝ»wÙl6”>,KDDääÉ“ÊÊÊ^¬Ž‚‚Òs B¥÷Ãb±ðx<‹¥R©ºººÝÒ'N ‚‰þˆD"‚ ¯^½JMMå…ÚTTT())=yòdÙ²epO¤×úƒÐár¹pÕ{§(--uttôññÁÂX,váÂ…ÂÂÂUUU •••'NÌÏÏ7n\^^¬Ã¾nݺääd€¸¸øúõë©T*‡Ã)))‰ŽŽ4hø­À  ÇÝÝæ’o«Ê Êß:((½&“I¥R7mÚJ¡P´µµŸ?Þ-=—••ñbTZÂf³æÎ‹Çã{®Ì"¹\n°~~~)))‚466’H¤ádž &###'''//Ãᔕ• …BjŽW VC%8nذaÂÂÂ,‹Ãá4[T†Á`èt:ªrPPzh02 Jï‡L&C·Ñ¥K—BXXØ¡C‡øÉÅ×´´´ž?îêêZSSÓ£‘'‚:\.×ÊÊJHHèíÛ·Ð8Ö !!!Àáp`õÐmÛ¶ñª`ðʾÖ0H»åÛ¡°°0šN¥‚ZtPPú\.wÅŠÛ¶msrrsqq¡Ñh………sçÎíö±FŽy÷îÝääd ‡#))Ù£vŠ? Ó-Ö¤ÌÌÌÓ§OÏž=›D"566Šüšj„„„ðx|\\œˆˆHAAÁ£GàYJJJ‰Ä¦í»>Á€ZtPPú4ÍØØ˜@ ¸¹¹ 6lݺuׯ_:thBBBpp°´´4ÿ]áp¸ùóç·z ™LöððÈËË311Q¶x¦·y÷A„J¥ ‹‹‹ÃS]dß¾}‹-òðð’’âíÄ`0OŸ>500Z¾|¹±±ñˆ#222Þ½{sEkjjÂõV(((}Ô¢ƒ‚ráU IDATÒ' “É’’’óçÏ”””ܸqcÆ ²²²7oÞ\µjÕÅ‹ùïÊËËëéÓ§¿~ýŠŒŒtqq™={6@ÐÐÐpuu­ªªrpp€Þ›ž ÊiF›ÁÈ˜ß ¢­­}óæÍ®­¬¬L$óóóß¾}ûë×/^ƒððð9sæÄÅÅÕÖÖJJJÂò¤è-¥ï‚ ”¾ô^5­RPUUµvíZ˜ïäÉ“°Õ©ªªøûû/]ºtÉ’%‡‚ʘ˜8mÚ4ßÚ³'{yyÁ b''§nòùóç.\ˆŽŽnªr YYY>|PQQCóâ  ôuP¡ƒ‚ÒW ÑhFFF- -‡f±XÇŽ㳟ÒÒR@hhèСC•••·oßþàÁƒ}ûö;ÖÜÜAf7‡C¥Ry+Ì»6…•J]¹r¥¾¾~EE…²²rrrò¬Y³zÔÑ.**zäÈ‘’’’É“'óÂtPPPú4hŒ J_z¯,XÐlyy9Lë7aÂ~ú £Ñh666€ÏŸ?ûúúšššzzzæää|ûöMLLŒB¡L:ÕÀÀ`ûöíG ÉÉÉN$xÇè^Ú¼ûˆˆˆ¨ªª4hÒ¤I©©©S§N}ñâƒÁˆŠŠêþ¬…x¼••ÕçÏŸ³³³¼B¦(((}Ô¢ƒ‚Ò‡€Þ«–ûOŸ>ÍápìííùéäçÏŸ7oÞÔÓÓ9rdË£t:½  àõë×ááá¾¾¾ÎÎÎæææZZZ"""3fÌàr¹4­«—ñÿ´)tàØÊ•+‹‹‹g̘¡¥¥µ{÷îèèèÅ‹S©Tkkë 3a„™3g¶º~lÇŽååå¾¾¾uuu€iÓ¦uðPPPz/¨ÐAAéCÐéôV½W_¿~½ÿþÊ•+y9_ÚÇÓÓÐÑbÛIIIW®\µÊ»‘öìÉÐ{`³ÙoÞ¼9{ö¬ÁøñãsrrÎ;7eÊ>Ç ‰/_¾d2™>´¶¶VUUݳgOqqñ… Øl6‚ ÊÊÊÝpA(((½ Tè  ô!DDD$$$Z­áéé‰Çãmmmùé'???""ÂÂÂBNN®CHKKëP{~hO興ˆ¨¨¨Œ7®éά¬¬ Ðéô .ð9ƒÁ¨¯¯ÿþ}jjªÁùóçsssëëë½¼¼ÈdòóçÏeeeѤÆ((ý(tД¾‡ÃiÕ{•‘‘ñßÿ­_¿žL&óÓ‰DÒÓÓëÐèT*µCíù¡½»Ï{Õlyy¹»»»¦¦æÂ… ù¦´´”H$NŸ>]HHhæÌ™ÎÎÎW®\ÑÓÓ“••MOOoÙžÃáÔ××w»£EÀÀe¨ÐAAé+0 ##£Vë?øúúŠ‹‹¯^½šŸ~²²²#FŒèÐè=!tþPÔz¯:ÔlÿùóçbccùæÖ­[G7o^||ü«W¯^½zÅ;´gÏž#GŽÈÊÊ8PVVVNNNIIiÔ¨Q£F=z4 'ж£üvãÆîíSKK‹Ï }”~êºú§@„ÉdvoŸÊ‚DDD ««ÞìУGÊËË­¬¬._¾üÇ~ÊËËu¸›A ¤¥¥ËÊÊZjhhèÔ¬ÛãB‡L&+++«««CiÆ£ººÚßßßÖÖVCCƒŸ B/^Ü¿ÿž={âãã[­¯¯¯¯¯ÏÏÏo¶‹ÅÞ¸qÃÌÌìý£t;T*uÿþýÝÛ'‘H ÓÒÒêÞn›ÍnVJ…P¡óOQXX8iÒ¤îísþüùAAA=]`¥)Ð{ÕRè°X¬+W®8::òóèWSSÃ`0yyy¼=8nçÎ;vìPPP ÑhŸ? 9uêTÓ³þ‚E†Î¬\¹²™Ðœ9sÆÚÚÚÁÁ¡¥o«%ׯ_·´´;vì‡øœ—˵¶¶^¶l ïuÉÈÈèö¿` ‘HË—/ïz?µµµááá cÙ²e<èUZ‡Ífü±™¯¯ï¬Y³æÎÛ´† ÊA…NûÄÄÄèêêö3‹EwI„ö¡¸¸¸µk×Þ¸q£j÷ïß5ªoMžÁ`‰Ä–U½öïßoiiùG¡W,¥¦¦ÔÔÔÜÜÜæÌ™#&&Æáp^½z5{öìI“&½{÷®ÙYAè€ßÞ«ƒ6Û_TTbff6|øðoß¾ý±ooï­[·îÙ³gÓ¦Müϯ¦¦¦¸¸¸£aÛ#,,Œç]bbâôéÓ/^¼Øçngd2¹[òbçç燇‡‹‰‰Õ××÷6­SUUÅçdçÌ™sçΕhéü³B§¤¤ÄÝÝýͽ½½?®¡¡!€Y †¡C‡>yò¤ëýdgg¯\¹Ç?yò¤wjww÷–R ùùùÛ·o_ºt©`fÕu ÷jáÂ…?nv¨°°ðÉ“'«W¯Þ»wommm;hjjr8œå˗߸qcøðဌŒŒk×®=~üøàÁƒ³gÏnõ¬¿#tÈdò¨Q£ÆŸ™™ÙìЉ',,,¬­­ùI"ôéÓ§¸¸8ccã @]]¬¬l‡N_¿~MLLä§eRRÒêÕ«Ož<Ù-Rû(²²²sæÌ ïmZ€ÃᆠÖNƒªªªºººgÏžÍ;700pÔ¨Q›[;äååuo…–n§¤¤DLL,,,ŒÏ*9 ww÷îý›ÖÔÔðY"ðëׯ«V­ºzõj[·þœ#FTVVöN­^__ÏOË#GŽÔ××óÆÛ€Þ«–Bàçç·hÑ"sssŸvz˜2eJNNŽÍ¯_¿¼½½i4ÚîÝ»=<<„……Ùl6‡kYóá±üYè@ïÕŠ+Z ÜÜÜ”””õë×}eeåÞ¬u–,YÒŽváp8±±±cÆŒÉÏÏúôi^^ÞÉ“'ÇŒ#Èvž÷*,,¬Ù!6›àìì<}úô¤¤¤VOŸ8q"?uêùò¥––ƒÁ¸~ýúéÓ§cbbÚYØÑ{¾z9rd« ƒïÞ½[SSciiÉO?jjj4íëׯ¼=£Gމ‰©ªªŠŒŒüõëWFFôä5…J¥ö¿ŸŸŸ½½=@¸s玅…EQQÑßžÑßj}}ý†††eË–½~ýúoϨ ;;;;99‰Ä   yóæ}þüùoO ¥Ï£««{îܹ<þ|Ú´i/^¼øÛ3êu@­3`À¨uzÂÁÑ£¨ªªÞ¾}[UUõû÷ïÁÁÁ{F¦­Ì€‹/"²jÕª¶Î…‘ÈNNN÷îÝ?~<‡ÃY°`ÁÆß¿_XX=E F0¾„TX­^0F œ={6?útÊ”)ïÞ½c±X"""ûöí+((øðáÃÂ… 1LII ‰Dš0aBË÷c*•J ø™gïgÙ²e—/_:t(tcuK¼^_¤Ok€¾¾þÕ«W‡ÝXwïÞýÛ3BéóhhhܼySCCº±<=={¢ŒsŸ¦¯kyyù€€€åË—C7–]/Ì`0­­ýúÅd2ÅÅÅÛ:wúôé4MJJ A‰„Ãá~ýú½yó†—[™Íf7;ñ¯YtÀoïU«‡üýýù£QgÀ€ ¥¢¢âåË—îîî ¸téÒ´iÓV¯^M§ÓÛråô‹DEEåúõë::: {÷î=~üx·ç×굯üÍêÕ« %%%ôõõaÕú>…B \´hF³´´´±±iéÉFAéÒÒÒçÎÛ¸q#àĉ&&&¼gÿLuuõƒßdgg›™™‘Éä'Ož,[¶¬Ïi°wï^777QQѧOŸšššæääüíIµ‰ˆˆˆ˜˜Ø¢E‹Z=ÊápÚz4 -\¸A‘–õîß¿ üÛõ.¡#""B¡P&NœØòPnnîË—/-,, K¯-4440Œ¾¾þôéÓ׬Y3|øðׯ_DGG+**ÂËkiÈê:€L&»¹¹ýƒn,:žýÿÀP‹õôéÓ¿=»ƒº±Pº,»uëVÔÕ”?~lÂùóçaòÜW¯^ñÚ ÑÑѹ~ýzŸpcµã½âr¹m ]]]qqñ¶$ARR’ <·¥ÐùkÁÈ ‰÷*##£åQ??¿Û·o¯\¹200°­ ÇîÌ™3§OŸ¦R©VVVyyyƒ ª¬¬är¹X,¶-¡ÓŸÌ9MY¶l™ššš““Ó¿°K^^¾-ÿÎíÛ·=z$àùt#úúúcÆŒqttìU«±Pú4ÐuäÈ‘·oßþË«±¤¤¤`ÂØ–dff~ùò…Åb xJÝtc={öþýû½y5“É\¼xñ¹sç®_¿Þ¬®x[!!¡S§NQ©TÞå0 !!¡ºº:^Ÿ˜˜˜/_¾HJJŽ?ž@ àñx‰4oÞ<>C~;DRÚÃÌŽŽŽ-…††VTTXYYµ#t455«««/\¸`oo¿qãF2™œ““ãèèÈf³Û¯©ÔÞÐuüøñ„„„þ½‹D"7®ÕC½6Iÿ@7–‡‡G¯Z…Ò§n¬Ë—/þ³«±†zìØ±V?~üË—/žO÷ÝX“&Mrss뵫±„……9ŽÍû÷ï¯]»ôóçO‡Ãi¹xJRR2::ZEE¥©Í‚H$z{{—””4mI <==£¢¢`æšÉ“'›˜˜ØÛÛ766vûUt@CÉd …Òj)ƒqãÆ ---yyù¶NŸ2eJ}}ýÇmllyýúµššÚµk×>}úÔ´YËø»þjÑü³n¬~êÆBévP7Ö¿@ïwcAà —Ë1b„——WqqqXX˜±±1‚ ðéŒÁ`4446oÞìççWRR2uêT.—Û,4çÇͺ•””tpp€®€ªª*ÌÖ~ Lçè€Ðáelõ(¬!))ÙêQ …2hР¡C‡B‡‹ýùó'T|™™™,‹ˆÆÿßû¯E‡º«€®ÆBévÐÕXýž>± ‹ÅâñxAètúâÅ‹CCC¥¥¥UTTbccÙlvjjj@@€¥¥%|Qç=µY,´Ðxyy]ºtIMMmË–-yyyl6;99ÀKªƒ²{è»Ý1 ÑÎÚ«ö+Úèëë°XlË,Ot:=66VHHêÁ„&µÏõë×ccc[F õ(ÿòj¬þº ¥ÛAWcõ{zÿj,h¿)(( ÑhÃáP©T …2bÄÀÕ«Wa3¸kyâp¸„„33³çÏŸoÚ´);;Ûßß_EE…\õþý{¸‘‘‘1lØ0øñË—/ £—ÔuLèÉä#FLž<¹å¡ö…Ž™™Y;¿LSSÓÛ·oC‹Q«BGÀ𣠠ÀÞÞ~õêÕPr ÔÕ?@ÝX(ÝêÆúèµn,A0Lyy9…Bž¬ÏŸ?ÃÌ/#GŽÄb±Ïž=ƒ-Ùlvuu5`øðážžžvvvRRRššš Må‰DJII)++KIIáíüñãÇ”)SŽ9RUUÅ[ŸZ[¢ÔQ:&t0LccãíÛ·wïÞ=`À€¦‡Ú:«V­ÒÐÐ’’âí®ªªâ}lll433ó÷÷¨©©Í˜1C[[{þüùЉ³aÆM²ë@±™““cii E¨ G˜ëëׯp•f¿'66öêÕ«¶u—«Ïe ùw¼ ©7¸±úîB§NP[[Û2š¢Gén,h€øþý;@XX˜Åb©ªª~ýú533³Y,ÿðáÃæÍ›?nddäíí=cÆŒ.Y²¤YŸZZZ÷îÝköf0...ZZZBBBBBB#GŽÌÎÎîúsªÃá/BBB#FŒðöö.//øð¡¡¡!L[ ÿ#ZÆ`ëééñ1 .—{àÀf-¥¥¥}}}ãââ^½zõüùó3fxxxhkk· kêià/ÙÔÔ”L&§¦¦š››ïÞ½»  @`Œ+''gäÈ‘ŽŽŽ0„¾SQQagg7~üx__ßžéo‹nqcíÞ½ÛÅÅ呤} WWWž(0þº+::zÙ²eééé‚ôoQTT4gΜK—.ñY¢¼[°+44ÔÖÖ¶ý§@øöíŒ2†Ùlö´iÓ*++>|ÛÔ××ûúúΛ7/..îĉgÏž•””„Ƙ–*€Á`xç¶EYY™˜˜XןP:x<*‡£§§÷èÑ£²²²Ó§OS(ðÛ¢£¡¡ajjêììñãÇ^‚”••5«ê€ÅbÅÅÅ­¬¬x𯨨˜J¥ µSý«‡à ?~8::Šˆˆ$$$˜˜˜>|¸´´T0sŒ‹N§ûúúN˜0ÁÉÉ©{ýáײ¬¬ÌÑÑqüøñÞÞÞ»muÝõóçOooo ûpQÚ‡ËåhhhlÚ´ .‘ ×ÅåræÏŸ¿zõꬬ,ûWÀb±µµµ>>> .¼páB•¸o¹±¨Tê™3g(ÊÁƒÛ¹@X†’çN‚ÉóçÏwwwONN†å™ÃÃáíGVV>Ð?þüøñ㦽1 ‹Õþ÷vÈ! LJa@]¡ó šˆD"ƒ©¬¬$‰¶¶¶NNN€³gÏÒéôÔÔÔ#GŽr¹\¨ ¹¹¹$I^^þÇ&&&ššš‘‘‘UUUgÆŒµµµ¼[yVVÖØ±csrrètzfffnnnAAÁ?~þüYSSÓØØØsE(t„„„$%%a¶†;vàñøGéëë{zzB¤èQ7ü¯–’’¢Ñh/^?~üÁƒû¥Üáéï‘#GVTT¸¸¸¨««Ÿ8qB`Ç®¸±`–­²²²mÛ¶ÍŸ?ÿíÛ·Ý8±yóæüššÚÆ[®Ei ˜*‰Íf‡††Î™3ÇÈȈ© þ– Þx‰‰‰™3gÎÚµksss0î_>§…„„¨Tª¿¿ÿâÅ‹½½½›Æ]ô(‚qcAo •J=~ü¸’’’››ÛGáp8µµµ æÍ›7×®]#‰...k×®µ²²‚‹Ã›¥¡™2eŠA³N‘€Ûd2yÿþý§Nºzõê£G^¼x‘››[\\¬©© ~ÿºBç%yyyªªªIIIK—.…y™LæÄ‰áXJJŠÍf=6f2™,‹L&KJJ9räÇwïÞ †Éñ =¿¾¾¾iNõë×øðáøñã †F£åää`0˜ÔÔÔ«W¯òT'\Æy¼ ȧOŸJKKƒƒƒ ¿âmãñxØŒÐðaÏ[ 6hР .ìÙ³çðáÃÁÁÁAAA>\·n……E§ÿ÷ø§ç’ B¡3wîÜC‡=z4,,ÌÇÇçÚµk›6mÚ¹sg×ûï!8çëׯ€‘#GÇÇÇ;vìÙ³gžžž/^ܸqc;x»‘fI#""LLLdddÄ#%%Õêï ww÷Ó§O§§§ëêê®X±ÂÙÙyðàÁ]ŸÕÎ;£££ãââV¬XA$#"",--###»Þó¿:ëׯ—––¾téÒóçÏŸ?®®®¾sçNCCCLà¯$„rjÉ’%cÆŒñññ ŒŒ422Ú¿ÿ¨Q£zthÁߑƌsñâEWW×èèèk×®¯X±býúõÈß(€¤‚PèÌ›7ïäätöìYGGGKKË–YO9Ncc£˜˜Ø‡ÜÜÜΜ9###xúôéÆÏŸ? ˆ˜˜XûƒÂÇë«W¯œÙl¶¶¶¶ A_¿~UUUÉË˳Ùìîòçt²—ŠŠ EEÅ_¿~éëëWUU‘ÉääääiÓ¦N™2ÅÇÇGCCÖ5MII™:u*ŠŠRVVÞ»w¯¥¥%•JÅb±ð ÿ7åää<<ÌÈÈ8zôèãÇÏŸ?õêÕ5kÖàÒxÀ*"\.÷ª¥ÓCð~ÏóæÍËÍÍ2e •J=w¯o÷]G{@7‹ŠŠ oÖ€L&ót„„Ü(..˜››[[[»»»{yyݽ{7""ÂÖÖÖÚÚº‹S244$‰qqqVVVÇWUU=xð`yy¹œœàÅ‹çÎûðშ¨¨¶¶¶­­mÓŒ 7oÞ¼qãFQQ‡Ã~ü˜>}zZZš°°°¹¹ù®]»àWŽËå^¹råÖ­[¥¥¥ÊÊÊ666°ìÉܹs¿ÿ®££óæÍ:®®®~ôèQÞkR[cýq†ƒËåÒh4:Î`0šýÛì#\@+))yêÔ©ƒúùù;w.++kóæÍ...mÕ.è^ kÒ¤I‡†n,øåÁ`0pÝ ‡ãm´ÜÙ ¸6kÚ¦é¹ðuTZZúäÉ“vvv'Nœð÷÷ [±bÅêÕ«pÕ<^½zÅápà}ƒû›¦ÛM?"Ò¬‚ Íš•––º»»“H$Øú¸¹\î´iÓ¢¢¢Þ¾}{ìØ±Çß¼yóîÝ»0iž.SGGGEEÅÉÉ)//ÏÂÂBZZzàÀ8Çãp¸–-÷ãp8ø†·üøñýûw<Ÿ˜˜PQQñññùï¿ÿœœœ’““wïÞíååuèСõë×óÂp ™L~÷î‹‹ àôéÓãÆËËË“‘‘áp8 ,0`€±±±¿¿?™Læ¥lyyù¦{0Œ¬¬l·§Ëï¤Ð‘‘‘ÉÏÏ—““kll0`@aaáäÉ“oݺebbÂkïS#GŽôôô„[¼½½¡@ÓÓÓo`Ëf³q8\K“~bb"ü3@V¬Xq÷î]^æo.—Ë`0˜L&ü·)[¶l™={ö˜1cX,LHÈjA«;Y,ÖÛ·oëëë[ZM¸\î§OŸxÎ&“)ÈÈV%%%‘ÚÚZ6›ÍK²Ä£¼¼¼‹ý«««›˜˜$''ÿüù³¡¡!""¢‹vˆ_¿~ñé5Ãý ˜ØªéÇúúúÏŸ?óLîaaa‡†æY …²mÛ¶½{÷öìåý&"""!!0dÈ …Âårë~SSSÓÐÐÐÐÐÐj˜„„™Lvuuµ²²277öìÙñãÇoÞ¼innÞ]s+//ŠŠ’””„ $ccc­­­ÇŒcnn^__ÿäÉ“ÔÔÔ¨¨(2™ ÈÉÉ9zô¨¦¦æœ9sêëëŸ>} ½òVVV±±±111¯_¿644¬ªªºpá‰D²²²8;;ß¾}{æÌ™ ,xóæÍöíÛOœ8±bÅ mmí   /^,Z´HZZ:66vóæÍ/^¼€7ʶÆj†¢¾¾~ÅŠ‡N§·ÌpÑ>Ð -))¹ÿ~##£‰'Òéô¢¢¢   ŽN£Ó¨©©5êõëו•••••Æj 4èìÙ³ P(!!!÷îÝÀè<?~Ü,ø£ë´Ì*Âó jhh;v,77÷Ó§O #""B`kІ 2qâļ¼<‹UVVVVVÖÅá2gðÑDDFFÆÎÎnÚ´isæÌéÊ…O¾|ùâèèXTTM†Ó¦Mkj«àÙ0ZÝÙ ¸6kÕøÁápÒÓÓ?~ ‰ååå^^^¼ÅŒsæÌ±°°Ø´i“®2sæÌqãÆµ´?µ4SAKU[f*^3GGÇuëÖ <¶///wuu…?±´´´Ã‡GEEÄÄÄÖ®]knn®««+€µµµ...¯^½Â`0«V­Zºt)>R¡»ÙF«û!ðãÓ§O'L˜   Àf³322RSS¡Ða2™×¯_÷ðð`0°Ð˜©©)‰Dzúô©‹‹Kvvö¡C‡lll°X,‹Åj–bþ÷:4,,ÌÀÀÀÂÂÂÆÆ&++K]]½§ÿþH'…‡6lXÓ=0âØÎÎnçÎ\.×ÛÛ{Ö¬YöööjjjõõõÐÙL&³´´´™ÓgРA¼ÔŠ­B$8pèСììì¶ÊCv¼`dŒAóöö†Ašòòòëׯ722j_¨v#‡NOOÇb±;vìØ²eK³šbbbD"ú:<åǰ†<€B¡ØÛÛ/[¶ Ç 8*yàÀMƒÖ»øÅ‹ŠŠ‚/ƒ ²³³[»v­Àê§899}ýúUXXøôéÓmE‰ŠŠŠŠŠ2„·§²²ÒÞÞ^LLìáÇçÏŸ‡±®X,vþüù–––:::¯_¿î–ðäÕ«WgffVWWóÜÿ………l6ûÒ¥KM›AS .5 †£ãñx;;»¦w´ À… ÆÄÄTVV~úô AžÑ‡Ã$&&ò,¼[ üqñÜ”mÕþ ;„¨¨è½{÷¦NJ$›-m‡ÐÐи¸¸ââb++«+W®°Ùl‘mÛ¶íÚµKLLL0™mÃÂÂNŸ>Í`0ÆŽ8räÈžñæÍ›?®¬¬Ü½{÷¥K—èt:ƒÑÕÕµ··×ÐЀñpC__ëÖ­ÝØ¡››Û´iÓxË| ÕÕÕÆÆÆaaa‚Éd33³µk×Bµ-²³³¡CYBBâøñã³gÏîzŸùùù[·n… <<|8¼wô´Ê@ŸZ}}ý‘#G.\¸cì•••7nܸpáÂÎ:Ç›7oœ«ªªddd<==544º}¸bbäÈ‘Pâòê¼(6›-##³{÷îM›6 ²´xDDÄ©S§ètºªªj```‡âº`$ruu5 ø[³fÍ–-[º]nÞ¼YRRÒÐÐpÇŽ!!!ðM‹Å>zô¨U‹i~~>…BÉÈÈ(,,üþý{HHÈ©S§V¬XÁ«v—’’'ùúõk"‘()) sLÄÇÇ+++IHHmšJ´UÚ«ýv #!!S¾òdOŸ>àñøõë×ïß¿¿¯ƒF£¹»»ÇÆÆÖ®]ëáá!˜o54o„……0ŒžžÞÞ½{'L˜ €¡|«,--…_³U«Vmذ¡­’ŽÝ‚ ·oßöõõe³Ù&Lðôô4hP·}µçÏŸ‡ÕÕÕ8°råJ,kkk{æÌôôtuuõ?8°•‘””,))‰ŽŽ677×ÑÑyðà‡Ã²nŸ<ŸtU褦¦jjjŽ3æØ±cÑÑÑNNNÐ.íãã³k×®Y³f­ZµêÅ‹¡qqq[¶lFoàâ⢠ € HEEEUUÕ!C aM0%ì¡EG[[nLœ8qÓ¦M³fÍäß©™»ÊÍÍ­™Û®ë@–²²²½½½±±q¿”8</))immmiiÙчYWàÇ]Õ>PèF޹eË–5kÖtïü###¡)þæÍ›'Ož\³fÍ®]»V®\immmgg·xñbmmm<ŸŸŸŸmeeµeËÀÓ§OO:¥¢¢Â`0>}ú$**ÚÔÌéêêúþýûºººØØØuëÖ Q(===//¯´´4%%¥ÔÔÔììlðßÿ®^½jff6xð`(àò´vÆj† ³téÒÇ ÀšÂ£©»êìÙ³mÕZî  ÐÁþ¯½;‡jÿþž±eß²YÒµf»WÒUr¹å¶=T”¤…ú’%K$7Å\!eRn‘JR$i‘ent‰®Ûr«OR©P´PŠ›}›ßïÏï<æS¬3c¼žgμÏûÌç¼æýzŸ÷›Lþå—_üüütttX¶kÖÃ×|{{ûõë×øE¸Œéªµk×zzzŽÒrD§´™3g/\¸¸Óiiieee-^¼øãÇt:}à?Ò&Ož\YY™žž¾e˲²2qqñïb&L‘‘aÁ#|ŸÁ_|OO™™Ùúõë Y\o¦«F„œœ\RRÒâÅ‹¹~~x--­'Ož°,Q… 0]Õ¿OŸ>ÍŸ?g©F#ÎÞ¿?nœ?þü¦M›f̘±hÑ"ÜDèÐ!ÇgddÉd…ùóç ©I“&ÉÊÊ–•••””ˆˆˆùùù1†qvvvüñGoo¯‹‹Ë¶mÛðʘ˜uuõsçÎݸqcêÔ©‘‘‘¸¥êï¿ÿF¥¤¤ÈÊÊZYYáñ¢222p Ãl_ø‘1f5düq×®]£ÑÔÚÖ§«‘H¤åË—ûúúâ–9îÆÇÇ·råJWWW'_F#]ÅLOOϼy󂃃qG=NwuuÅ}z¾Ùìú%uuõ[·n:tH^^þСC±±±#WåAJ ƒ»)))íØ±ã÷ßwpp¸yó¦´´ô•+W,X€·Ñ××/**úí·ß¨Tê¢E‹N:ÕÖÖ†‡bæ³vWV&>Ó××·`Á¶ü'³ ]…᎟ãëI ']ÅÈÔÔw¶%W¯^ýlÍÞ½{÷îÝ‹—mlllll¾úÆE‹õ?TŒ——Wttôg+yyyÝÝÝÝÝÝ?[_PPÀøçg³Ëõ³¯~jÈFFF,sˆ]é*FkÖ¬Zwï±H^^~ûöí¬Ü#kÒUŒüüüð` ŸU£½½]HH¨»»{ÈçØŒ3òóóCBBØ>¤äà‡êèèLš4)000>>=ŽÇ/–––&¢ÌÜÜüüùó^^^²²²fffgÏžUWWïííeý”ƒ•––ƲD;#¤«Àh~ºŠ³ÚCsåÊ|쉉‰ŽŽŽ¬hŠ]Xd°1]ňë€Ùˆeé*FÄðÄŒH$Ò¼yóΜ9S__?œŸÄ¸•ˆ•ð~Õ@?D½páÂÆÆF:άëÌÒ¥K»»»&Nœhee…‡ÐÎÎÎÆOÇq,¶D9¬IWQ5"éª1È…9sFKK‹»Vboº °+ÓUýÃýO¦M›&//?ÌØyyy¯_¿ÞÑÑ1wîÜ?Ï8âè´µµutt(((ˆ‰‰………á!Y»»»¿ÙäÀÇLJÇLÄEy{{ûûû¿zõjø˜r–¥«Àè©tÕ˜öe. '¤«À¨b}ºª¸)55µ­­m8 Ò½½½<<<111¬ì<÷¥:¼¼¼"""›6múí·ßÄÅÅsssmmmø^bÌÄ¢¢"›Ç;v 7 µÚÜÒU\`dÓU8$]F[ÒUÔ·ÚoÂOò¦¦¦.[¶ìï¿ÿÆÓ›³Å@?P>>>2™|èС§OŸŠ‹‹<ÊÁð˜‰S¦L)--µµµ}ýúuuuµ©©éà+ÌU ]Å ]F ¤«¸礫FÉ£G–/_þÏ?ÿ°1ÊA t._¾lgg÷éÓ'QQÑáÌO;aÂAAÁ²²²¦¦&Nš½ ]Å ]F¤«¸§¥«F î†üý÷ß³· tÌÌÌrssOœ8‘žž>Ìýuuu‰‹‹ËÉɱ`~Žé*.é*0J ]Åõ89]Å•ôኋ‹óóó/^¼x˜;kooïéé‰õööfclö‚t€t%®âz\Ÿ®â@ tŠ‹‹ñÓðø©³!ïLPP0))iÇŽ[¶lÁ󟹨1 ÒU\ÒU`4@ºŠë“thêê¿[¯y­¶¶ÖÎÎÎÔÔ”‡‡‡‹gVb&!!ÒUcÝéÓ§ëë뤫ÀˆzþüùÑ£G!]ÅÅš››·nÝú×_AºŠõXúAO™2¥§§GAA¡»»››RWÍÍͯ^½ê:~ìØ1HWq¬ÖÖVbꃯºwïB¨¾¾ÒU`àètzWWW?ôöö"„’““B®£º»»ñ Ð_…¿b<Ï ¤«Ø‚Õ%Wư©©©©©©ßÜ ÒUœ¬££ãܹsßÜ ÒU`PªªªxWƒtÕØ5ÀñV ]Å.\v°’„„„¢¢â@¶TRRÚ³g„„ÄhW –¨¨è—ÓO~™L^³f §ë===ì®ÅØÖÓÓ3âe’H$l)((³téÒ¯m|||ìlêèèèåå5ûlpκd9k×®åî‰|{zzîß¿?ª»hhhÕò¿IPPpÆ ì­ÃñññÕÖÖþüóÏì®È˜7âñ«––ÖÛ·oG¶LÀiþüóOvW|: ?ÍÍÍÐ…“={öŒÝµà¼}ûvøÃ‘ôí?Àø:^^^Vv'æ¹ÎÑÝÝýäÉv×€ÿ‚@|¤¤äüÁîZÆ…’’–í:ö‚€@ÀÈàçç×ÑÑaw-ø0š ¸:àZè€kA ®Å´3rpp0F355%‘H½½½ ETT”•5ûRXXXHHÈÞH§ÓÓÓÓOŸ>]WW7qâD999%%% …2â5¸ªªª 6äçç9ç—žžÞªU«¶mÛÆ‚j„……]»vmæÌ™ø[ aÁ~ûíïï?ürôôôjkkñ²Ðœ9söíÛ7yòäá—<•••vvv<àhª€““sŒ¯`Tqàݘ˜: ¥··wÏž=¡·o߯ÄÄ„††²®^_ÓÚÚ:´7d íííl?Áð“sŒ¯`Tqàݘôx¹¼¼}JNNö÷÷Ç#üþôÓOïß¿G555EGG_»vM@@`É’%›7oæãã³¶¶~ûö­Ayy¹´´t`` ¥¥%BˆÙú¾¾¾'Nœ={öÝ»wS¦L±··_µjÞ5.ÿÏ?ÿlooWPPhmmÍÊÊ_´hQuu5BÈÔÔ!¤¤¤”ª¯¯ÿå—_ÚÛÛB¥¥¥DÝ=3 @çܹsÄÔ•ðóó“’’B566†……íÛ·!tüøq##£   „P^^^IIÉùóçñÑ"„„„„¨T*ãïfådddÄÇÇã#11‘Ø>***00ǘƒR]]ÝÕÕeeeE¬!Ÿúúzÿ¶¶¶øøø¶¶¶ÀÀ@WW×Ý»w P(”¢¢¢yóæ‘Édfë©TjNNÎòåË¥¥¥_¼xG&“BžžžïÞ½óòòÉËËûóÏ??}ú$..yýúõ¸¸¸ˆˆAAAYYY\™˜˜˜ŠŠŠƒ2Bÿõttt,,,tww·µµÎŒq/^$ZÝ9²eË|Ò|øð!::ÿ“§¦¦øøø „ ÊÊÊRRRB»víB îÙ³/÷_Î… bbb𷜜œLl¿k×®]»váߎ#âßÿÅÓuEEE©ªª „††fdd¬[·NFF¦ªª*,,ŒL&oܸ!´zõêW¯^EEE555EFFâúÏž=;88”³³3™LGíÞ½›Y9<ˆ‰‰ñ÷÷×ÔÔ_ê/Щ®®öööþÏþcnnNÜ{²³³gª«««£Óé$éÑ£G...x¥MVVVÿ³r–,Y²zõj---ü Sww7BèË“£ººúÎ;ø o ¬¬ŒЉ‰›8qbNNN[[›ˆˆ³õ™™™ÿþûo\\QrNNŽƒƒÃóçÏïÝ»G”onnž€¯;šššŸ>}B™™™1æ>ÉdòìÙ³?›ñø›õ¼uëÖóçÏoܸÑÚÚ:„ö/^=|øÐÔÔ”øM——W__Olƒ›pH$Ree%&ZZZ↨~0+gáÂ…®®®'NTWWǾQ¢§§‡&Mš”žžŽJNNnjjÂ7,##cãÆ?.++ËÉÉ™5kBˆŸŸ?00ÐØØX@@€˜ CVVvæÌ™x™Y9!yyyqqñ¸¸8---“ÈÈH!!!„®®nss3bh\`<œcƒºJ0ûïÖÔÔ$þ´´´$~•——‰••ãïœiÓ¦)))!„øøøˆÃaV>³ú ö`[[[¹; P^^ÎÃÃó×_ÙÙÙ1ûu÷gv×ÖÖÖ&þ´±±!Z:îß¿OD$¶¶¶D‹BH]]7F2~ãÌÊgVŸ/§¿@GUUuÏž=¸ý ©© 7N:566¶Ÿw ³r¬­­­­­[ZZ˜  `PPnKGM™2¥°°ðËÍ444®]»†— ð Äð-×ÕÕáÌkÿåP©T„°°ðŒ3üýýñ'‰ í[þžS°¥¥E]]ýܹsööö®®®………«V­*((¸råÊëׯoܸ±}ûv|ÔºººZZZÎÎΧOŸNHHÀIX ÿNJKKKJJÚ½{7B¨¦¦†Y9![[[{{{~~~++«3fàë&~ _/Ž=zòäÉeË–©©©ÈÁ¶oçØ¯Ìþ»«ªª¯ZZZxYWW÷êÕ«x¹°°XÏ ³ò™Õg°ðÕŒY ::zÉ’%«V­òòòÊÌÌìëë#×mmm—-[ÖÒÒ‚;µ0[Ÿ™™Y__züøñ¶¶6|_ÀI€½{÷._¾ü矎ˆˆpqq!’!333 ‹éÓ§ã*á$Îè ªž¸çÍ7/¶¼û3»k?{öŒ1* ªm``››‹—i4±žfå3«Ï—ú{¼¼   $$wð122rqq‰ŽŽ ¥P(YYYBBBâââjjj8Ú]»víž={.]ºD"‘”••‰–X777>>>¦¦¦W¯^)(( „˜•óâÅ‹mÛ¶uvv’H¤îînÆ'mmm7nÜ(&&&$$¤©©IDÙßäçç§  pþüùÔÔÔ &»»»“H¤øøø¨¨¨èèh~~~;;;œ$ÆiýýýÏ;—ššŠÚ¾}{~~>³õ[·nºpáBZZš„„„¶¶6nðäááILLŒŽŽŽ‰‰ikk“––ž3gΜ9sp•444œ?ÞÛÛ«­­íãã3qâD''§×¯_ã ‚‚‚²²²û¯§¯¯/8ÜÜÜ>žJ¥ÖÖÖnݺõöíÛ©©©G•’’Ò××Ç?Èdrff¦ŸŸŸ¯¯¯¨¨¨±±q~~>.J__ßÍÍ-44´§§7«ÆÇÇ:tè«å „&MšôéÓ§íÛ·#„¾ûî»cÇŽ rÓ§O÷ðð R©½½½Œý™À˜3NαÁ^%˜ýw–——ã;œ¢¢"±~åÊ•T*5??ŸD"1® -...++311¡P(ÅÅŸiYùÌê3X“'OçI€ÁÞý™ÝµŒŒîß¿éÒ%„’’±~Íš5QQQW®\!‘HŒë·mÛVXXXRR2{öìÂÂÂ?JJJ2+ŸY}¾DB¹ººݘGÊÐ: sss{{{sss6Ö5 Ož<Éú]lÇaŽRRRbggWSSiÀ(oçØ˜¸\ïÝ»7#####cÕªUÚÚÚ¼¼¼ÑÑÑË—/ooo_·n]kkë‘#GæÎ~æÌ™ˆˆ*•:wîܬ¬,ÜNóÃ?0[ššêàà ££SWWWXX(''×ÛÛ»hÑ"!!¡+Vˆ‹‹××ן9sæÿþïÿ~þùg„Г'Oìíí·lÙ"--M£Ñ***233›››kkkŸ>}zðàÁˆˆ ‰Y³f‘H¤oÖÓÞÞ¾²²²¨¨ÈÌÌlôA?öþµIDAT>L¶‡‰D‚ÙËøÜ;wÊÊÊB7oÞœ?>»«¸œcœŒ»“çÎ{õêBÈÉÉéÅ‹,ÿtÙ`ä[tª««8PRRòÓO?1>/ÀbТ3ª^¼xqäÈ‘²²2 ‹;v°r×, ««‹Gõ””|ôèÑgÏÁ0|ãíÃÃ+›˜˜lÚ´ ?HÅ™p‹Žªª*»+2º<<<üüüúyêjøððʳgÏöòòÂÙXv•UUUb'À­”••ûí7v×b´ ¶«ƒ5Þα¡MàÆ( …ÂÞ!Á¤žàZè€kA ®¸:àZ, t¨T*ž®Œ‡^·n»kàŠ1°>`èüúë¯3fÌÀ“¹Ϙ1O®4^^^cn|=£12PUU•……žeÓ$''[XXnÚ´‰qê±Ø´iž`…£èééI2غuëˆï¢²²RCCƒ˜~Œ©©©FFFòòò–––%%%ßÜ~¤ÎÎ9߸òŠ1žqG$ÀtÝ»wwuuihh „(Jooï´iÓXX1NqëÖ-<À¶°°ð7'œ‚ÆÆÆ÷ïßwtt|9Û9;;×ÔÔàÛ»»»CBB8aHïaJHH())¡P( """úúú#¾‹††††††ööv~~þ/p¦„„„ÀÀ@77·3f\¼xqéÒ¥.\øñÇûyËH'œs¾qåc<ãŽH`жµµ…‡‡·¶¶ööö"„ð¤_ø¥„„„‡’H¤ŽŽŽõë×Ϙ1¯ŠŠª­­åçç×ÑÑùf9555‘‘‘ EBBÂÖÖÖÒÒ!TXX˜™™ÉÇÇ×ÛÛÛÕÕ5â“s1chhˆ'³533Ã3 #„¬­­ß¾}k``P^^.--ˆ+iiiùîÝ»üñþýûÊÊÊÎÎ΋/¾uë–««koooiiééÓ§ãããétzii©¨¨è¢E‹ð”œ¦¦¦!%%¥ììlÖÚ`}øðAXX˜q •JÅ£»***âQƉõ¯^½âçç×ÔÔ$V._¾\TT4&&FBBâ×_-**ºpáqò°’‰‰ þN­­­‰i†¦OŸþêÕ+ccã»wïÊÈÈDFF.\¸!¤¥¥õöí[ ‹›7ovvvª©©yxx¬Zµª¤¤dÉ’%===555 t:Ï[dllüôéS„têÔ©wîÜaýaVêìì @-]ºÔÉÉiçÎ;wîÔyÂMç×\1âÂ… G}ûö­ºººqûc¦ªªjÆ ùùùÃü};Rå ÖØŠú tª««½½½ñò›7oðÂüüü¤¤¤BaaaûöíÃ/¹ººïõõõŇ—’’b``€ÿùóòò222ú/'**jéÒ¥111û÷ï' „PFFF||<žy511q Ç6z\]]wïÞ- @¡PŠŠŠBBBæÍ›G&“]]])ÊþóŸõë×+**Þ¿×®]>|XµjÕ–-[bccBË–-#“Éqqq¸¨ÈÈÈëׯÇÅÅEDD ÊÊʲõȾâÅ‹AAA]]]ÅÅÅ Äú3gÎèèèà«ÕÕ«WÓÒÒðŒ-éé麺ºx}AAÁ… ðöHII‘@Y[[ÿøãuÍòóóóññüý÷ßóòòÜÝÝmmmyxxüüüüüünß¾íã㣢¢rëÖ-ooïwïÞmÞ¼988O íììL&“‰´fRRF OHH’——gë‘V¨¨¨hiiqtt$Ö888¬^½ÚÀÀ`Pç œoãäŠÁèôéÓ‘‘‘ŽŽŽúúú4ÍÍÍ-11ñ‡~èç-#ÕÏ‚„Dý:ªªªD«c`` ^ÈÎÎ~ûö-±M]]N'‘H}}}¿ÿþû£Gxyyét:1ÓXEE…““^¶±±ÉÊÊê¿„ŠŠ ñ‘–,Y²zõj---kkëÞ(ÁY䘘11±‰'æää´µµ‰ˆˆL:!›glll¤¥¥Ö®]«««‹ß;qâD¢(MMÍOŸ>¡ÿm1â(ÊÊʸ!º««këÖ­»wïÆ'eyy91·••1/ñãljŽf–––D•¼¼|SSSgg§€€@qq1>ã9n=qâ„„„„œœÜ¹sçZ[[ÅÄÄp›í±cÇðK—ÊÊÊîÝ»×ÓÓÓÈÈ¿WVVvæÌ™DQºººÍÍÍè[ŒÀø$ 0¨ó„ ηqrÅ tvvÆÅÅmÞ¼yÓ¦M!Ÿ}ûöy{{ª!Ÿc\ :u5uêTÜ2ñ …2wî\wwwü'ñq ¶„ÐWÓÌÖÖÖÖÖÖ---Âð—Ñétb™ñZ#))ÙÕÕÕ××ÇÒš~~þ¥K—þý÷ß¶¶¶C+aùòåöööBBB¼¼#?ÏÚð1ûNJJIIuuuá†V0mmm‘Ó§O÷ãôôô~øah¿³¹ã|W „гgÏZ[[-ZD¬ùå—_¼½½µµµÕ?¶c+ô©£¬¬L£Ñ¾Œ¤pP‰ª¨¨Àa&BH[[û?þ˜?>B(//ïñãÇý—ÃLTTT@@€ˆˆÈ¬Y³ ·oß>ØšÍÝ»wïÞ½‹*..Æ‘åääp·óÛ·oÏ;·¶¶!TYYI4Tº»»»¸¸(((<|ø055uåÊ•¼¼¼"""¡K—.ñòòâ »®®wmC¥¥¥IKKÓh´ŠŠŠââbÖÝ`•——_™®®îÕ«W­¬¬B………D7mMMÍk׮͛7!TPPPYYI¼]__ÿÔ©Sâââ¸û »”•••••!„h4îŒ{>|Hô$]±bÅ–-[”••ïÝ»wøðá 6ðññḴ´4^^Þôôt„PMM îÚŒÛÛ=*##sñâÅ{÷î=þœM‡ XA@@ $$$((¨©©ÉÈÈèòåË9998 3¨ó$** qÑùÆWŒ¡TCþØJŒ­H€i píÚµ'Ožhhh\¹reÁ‚¡¡¡ %++KHHH\\\MMmÕªU¡µk×nÞ¼y„ ­­­âââÍÍÍuuuŠŠŠNNN—.]"‘Hòòò²²²ðôôdVÞ/ÎJIIýú미>/^¼Ø¶m[gg'‰Dêîîö÷÷àç2LÛ¶mà kAAA!{{ûãÇ#„üýýÏ;—ššŠÚ¾}{~~>~ËìÙ³SRR>|ø ¢¢âëë‹[eµ´´V­ZÛÓÓ£¨¨ˆJIIÁ€khh8;;?~¼··W[[ÛÇLJ5‡6ÉÉÉEEEøØ»»»UUU‰Þ‚+W®¤R©ùùù$IQQÑÓÓ¯_±bÅþýûsssI$’œœœŒŒÌ‘#GÜÜÜð«æææÙÙÙvvvl9lÆ ¯^½Bÿ?—ìââ²oß>*•ŠZ·nÝõë×>Œrss#¦˜¶²²ŠollTSS [¿~=BH__ßÍÍ-44´§§÷Çã¦OŸîááA¥R{{{ p× ÀÝ\]]…„„bcc“’’ttt²²²ðPç þQ>vÏ7®¼bôoÚ´iÂÂÂ/^Ä©+„ÐåË—§OŸ>´&(NKpG$@B¹ºº²ì!&–177···777gåNoݺµ~ýzœ=eÙN Ož<ɲ=Gmmmqq1>•Ç„’’;;;üx »ë¸œoŸañÃØØxïÞ½ƒååôéÓQQQŽŽŽzzzW¯^-((HLL422zôèÑŠ+¶mÛ†òïß¿ŸžžŽ›²žã¯j‰4oÞ<“ÏÊ166ÆCˆª¨¨HJJâiêûúúbccõôôäääfΜÉ8¶xHHþÉ~ðàÁéÓ§+))=z¿®®®.))©®®®¥¥ÕÙÙ9ÚUpŽ[¶D0ŽÎÿ°±±Á âââ)))!™˜˜˜ŠŠŠƒ¤„ÈÈÈëׯÇÅÅEDD ⹈©TjNNÎòåË¥¥¥_¼xG&“B«W¯‹‹‹‹‰‰Y¸p¡””TnnîÊ•+?~œ˜˜èææ¦¦¦véÒ¥›7oöööŽÚqs3===¼ ))‰Gª——ONN¾wï…BH III4-<<K–,ùì-Gýû￟>}ZXXX\\|ùòeŽ 9™‰‰‰¨¨¨‰‰ÉÈFŠt:}þüùžžžÄaaá϶Y½zõgo¹xñbqqqEEÅ•+Wh4Ú­[·à;åpŽ[ öFºú/bB5!!!---bý³gÏjkkŸ>}Š_•˜5k™L~þüùË—/¿\C¥¥¥IKKÓh´ŠŠ SSS¦¤¤¤££SWWWXX(''‡xÊËËïÞ½Kìú»ï¾STTD9;;·´´lܸqöìÙ===]]]oX¡'Ož „h4š°°°¾¾>±þÑ£GÕÕÕøU))©yóæ‘ÉäÇWUU}¹!$!!:zô¨ŒŒÌÅ‹ïÝ»giiyáÂ555CCÚššìììÉ“'ãþUwîÜ)++#v­­­­¢¢‚²µµýô铯¯¯••Uwwwvv6|§cœcã$ÆÖ:þ¡ª!„ÜÜ܈Ö`ׯ_ãå   ¬¬,EEEww÷¯®Gihh8;;?~¼··W[[ÛÇÇÇÎÎNYYùÂ… iiiÚÚÚ¸¥!äëëûæÍb×K–,ÙµkBHVV¶¥¥%::!¤ªª W«ÁÂÝû]]]BþþþÛ·oÇëW¬XQ[[‹—]]]'L˜ð×_©¨¨¬X±âåË—_®GMŸ>ÝÃÃJ¥öööìÚµkÅŠjjj©©©G•’’Ò××Ç9„ÐÚµkëêêˆ]¯^½_°&MšôéÓ'\ï¾ûîØ±cðŽupŽs,¶D$„««+c~î`nnnooonnÎº‚‚‚“'O²»"0¶ïÝ»WUUõ›[¦§§ãÎÈ8 €û#†$ÀÁƒ#""¾L|¶!ôäÉ{{û-[¶IæààðÕ$À7p!ŒI€… â$€””ÔŸþYPPPZZÊ,ÌõðððóóÃúq=‰©+`p 0†@  GàKyyyƒZùúúúúú2®qwwg|žŽŸŸÿÕŽ;ÖOùãL®¸:àZè€kAgdnpóæM<–€!#ŒÜ1OOOoǎ쮌y ,““cw-Àc[ C¥Roܸ‘žžÎ® p ™ñ0.".ÚH`èNbbbBB‚©©)Nÿøñc@@ÀôéÓþv///<êÆ¢1 =ÐÙ¸qãóçÏñ4¤ÝÝÝ~~~T*uä*Ž6&"‘I]½ÿ^DD„qMTTž»NII) €q}mm-??¿ŽŽ±rÁ‚¢¢¢¿ÿþ»¤¤¤¿¿AAÁÕ«W¥¤¤F¤nm +Щ®®öööîêê*((HMM%Ö'''ëêêâ£ÊÍÍ=yò$žM>%%ÅÀÀ¯ÏËËËÈÈÀÛ'&&&%%IJJ"„,X`ffQÀù8?Ö8:ªªª±±±ñññ<ˆollÄëïß¿okk‹—mmmËËËñrEE…µµ5^¶±±QRRÂË“'OþøñcGGB¨°°x/8çG#3` ??ÿÊ•+KKK‡\ÂêÕ«OŸ>ÝÙÙ),,ÌË ½c ÇF#62òýû÷ÕÔÔð²Ann.^¦ÑhDlmmí?þø/çåå=~ü˜xû÷ßÿÏ?ÿ\¹reÉ’%#U%° gFÃz¼¼  ÀÛÛ!ÔÝÝ­¦¦Fô*Z³fMTTÔ•+WH$’’’’¿¿?^ïääqéÒ%‰$///++{àÀOOOüª¥¥eVVÖÒ¥K‡wD`…1 ëñò72{•±5£   foùþûš†\°Ò˜ˆ8hRÏS§NÙÛÛ³»`ш8¢ÛopppkkkQQ‘ˆˆˆ——»«–½H€# …Âî*€mF/à ÔÀÈ‚@\ p-tÀµ Ðׂ@\‹#/%999>dw-òâÅ vW¥¸6ÐÙ´iSee%»kp vׂu¸6Ðqpp`wÀfÐG\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðׂ@\ p-tÀµ Ðkþ×µô'ÑôIEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_response.dia0000644€ÿÿÿÿ00010010000001314011727205032023736 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»cVÇ'©£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ׫’SyÐpÔ€Ú”æœùH ¢-)¡7D=ñ.¸¡¢¬Yw}0ÙD9­0 e„ F ÖX^åŒZz%­uøŸzQªN‹“¶ç¹»UÕOÅ÷U•®vÎåA[OÒ-ŒUšSW)_€(Réa2gK]•­)¯è¾ e'Û&‰ŸÎg³ãb6NµâóA ¾¥?Âsz±ùyªªÚžd ÌÆÇ£ÅbþmóÂ7² ¯|<-fgïýæîÎßv¸!ù¨µÑ’" Ê jÌòÞNsý“Ã/¨cͨR«9%ò٣Ûo Öü²Zÿ2šàw~Y߯²ÛøH=á@ç|'2ÀÑLí&ôÍp `ÀÛ†è(ƒS ÐtuÜ0PÇf¥¯bH0 ðfxU0°©Éæ)0`ÌÝ_–ۂΉV…^Çk¡7Œ0€”Ðbô ¢2C¥Ž ¢f†Z6+–¢á`¨zWS•^†Wf „Zk€W“»'i¡Üzßqûja'ÃÞ«¤ÉhÙÁ m“ÂØ ¸5¹–ÍŠ¥ø¹di׫ cÖäץɦƒ]oâÝ_†¾a .LØ9 õ5e𢀯á¶=QÛf,ðÃ/ê௳‹ËÕÁ¯“é oûë Jë›]ðD ï e²ž4tÏcƒwÙ…[Ã…÷Iþ(þ÷²X®þ~¹Ê8²ÙÌ $œ@ð´šJ4º k(ÑVÄÔÄÇîÏåÁoÅhŒ÷ýà¿ÞÏÇW»Ç’M(y‘(rO,3ްâH÷æ`JøH!9#bäMS¢ÆY%%c†Š‚€¾4QZçíÂHɾήХVX3ʰ¢LçdHM ëkíq©i]kßËÉÌ“Ž®Oün’~ ä?NQ9Œ4x“ÿ”µ‘êab´Ce…õ.Õá(é,î_5›Kñƒsi©uz’Ø“pØ„CYª]ä„RÊ£h˜@y¡Ö{"Œ¢áùE£ŠÉʤÐ$´t¿Ãõ*ˆÊ›n…Ò¼•H 5è¦G=,‹êJÙÀŸ*XÍf}ù-®Tû¶y)¹£ÝË÷aHí©¥ Ìv”Ò !\)†ÎÐk¥­Ù‚UÅf½â½³¡Ìޤ0ô!… Í\Ü ¤²šÙœwJS×h£_£¡N”u[ÃJ>ëåVî›ÆÉaìC5šÔJ‰¤g–Ã`]¢$CXÃ!PçR©Ûޱx’VòùP£Ó¸wxhw#‡Zö!‡ŽpBn‘ô ºxƒ‡r[xXÉg½Ê=Äð#9ì~H„»öä¥cõR9 :Å6 I¡²ÔÙ EØë™ê¸¬®g’ÊŒÜcVC¬‘¨».Ý4ÃëÁj«ÌÀÒ°´r«üÉ»çPËfmâ½Û&3<Õœ.êΧä:zcT]ä$g|횑ҷ!‡o eמò6ûôéãáïÅ×bú¢Ø[7ÔJâK8H”Ïö Q›,œtÀ¦EÔ¼‰)¯P@«Œ:|äß›ÈoáTsùÐä§èZO~ÚÝ^¦wdjw>)ÂÛžæXR-o>R2 u@#[ q‹Ö¤z~o½b–ÅZF+23p“•1-UÖ©\l¸‘*cãÝG`/6lI±]4Ûí¦€î>iů»ôt)’m¾qˆÖ!õáóN :e–UÃNqwªå²b)uœ—;"äªá}­®?h€ê¼ÓîG«Ž¹äÏs]òç©úÏíEÒë:\³½?—kszrJL‹åÕrUœ#vЋ*ìè| î…– íë’÷ Ò °×”´ôÈ^*HMÀQ±î…É&M„•ð´7ÁCf!:ÎyàhâHã‚õAÓáVÛÃÜ)Z§ïãjJTb¤É—¶ÞÔï§ø<™N{z>‹.ÅÝ«´{ÔÛŒòž‰SŒ|Òý›N.Ž¿Ì“ÿà–6š>ÈÜçÑtYt ƒˆ¶šœö@¤'[¬sbGŠ×s?j¦£°ûcŠ•…ÙÛš%¶)ˆÙãÓ9GòÂÆõÇKÿÚ—V %näN ;@™ñ£'üø0YžÎ<>~8üÛhV¨P¿5“6à…ídðDJCòzR}¥6KÖAMý°ÙÄ•ÓTäèLtÆãC0œóÓ ÞQdËj¯r±õìÄWêÊ}NìʽWîqDíÞQ„#˜1¼°¬£”ÝS,gey>î@siGî2‚fÍúB‚a5é ¦sÚ¬VÆõÁ}ë´šF@jѱ¥”蔞 ãš’:\H Ü™Fµ|>p‘r~ÂëÊOpºšëÀÑÕüÃÕI¦âΑ`úŨ8[ŒVè·W ‚éaŒp9¦€b®{ `QRHi˜N&'UÙNg€M¦ wg²Ùqcð!zí´–ÖëÐ:/¯ÙÌÒ~ˆ½R ë4Ð3[X¯ÈG}´Úú¬‚„ð¢aî³ ¦2èg•}VU ZA³frôÂd†Ö ­Z_´vŸ³w]‚rœã6µë!eª)¤4´4^R’œ2Ö±Fû`2Ck†Ö ­/$.øßS¤¾¬ úúUÚTÇl%@äíXiM¢d,R‚ÖªHM8¢i[„ØÐZíƒÉ&êD”ÑÒ9 D+­ô‘R=‚à‚ò*ͱ”É oÞñfŠÈ=*>Ósë6C÷Nsוh)y»Ò‡à®#]q¨ÑG¸ŽtEÖHWLf›!Û ÙfØg›¡I©’éÞ3ñz"0ΰžXtÃJJ´™RÕcjzˆªo©R/LæR¥\ª”õeggØÎ‘Àj蔊ÐNCêýšr3´VCŠá#¤Ü m¸GÎ×qùÀÙ®ÔÚçÜŒW•›¡C—Þv7dl÷Æ«¶œ›Ði„J³8 R2!5^uÖ! á¤JSeŒåŸ*SÇge³K[OÌ`Áf暬wšoOo™e»\«Ç Mw¾öö@í6ÑÞa­'¬€°ÂQs¿ÔR^1cX°Ôš„*B¢¬œüXQÍgu¿Cg¨·"©2Td¨xP¡û€ŠõÊ=uŠ&:Ò\¨Á Ks"×[@ŠJ6+ÛŠÊÓ\hkîd¨ÈPñÌ Âô°-¼,Gá(É$…U6y ´ÞV@3„°"¨rŽ5*2T¼¨°ûÑÅ4½Í«ÒªkJ«B›g:Êr¬œÌfEÆŠ‚®ÏÀ&°"—&yzÌ e£NXããšáQDA9µmVPŠ Ï (|@[ U¤ÞE1¨!„(DÙJØP@³PÍÒª à¦Ê6E†Š—aÏ@b=¨BŒdª`ogñ”ó(L”Š>§‰>#EFŠÝ"E§1@ž£ÁF\Š}â\Ä; óX’«£ƒO°m³U[áÒãa%}N€˜f30½ ÆuNúT^H]ùÖáʉHgÔ‡Ç8;$Âѧ*%ˆÀžÂQÃfõJ㓢ߛ‰ï×i‹ :´”ÚÜñ\ß;^}©ë#s1DKsN•U x7½àÓDURæ¢BŠC‡ÿÀ[AÚ“MÊA¨Ÿ H­$P‚DÍZ_×2¦p2_Œ‹ÃîÙÏ} sôiV/b’ç…gE”´Ðø?OðKÊ®=åmŽø×h²ÊÆÚþ×Ê`žÐ x|œO¯êÌ»îyw²è¤Í†×Ô"€Ò'¬Ñ¡2H2*ô¸¤iMùïÍñãÆ]“•Keó¥·?dÈ·=Gu:ncó‹ìu:O¥Ø£ÆtO?‹Â+mðk7^V32¢€A$J€”Rú™eɲ*L•K]ó¥1:ŸßúкÍiV™m«Œí¡wOTèœDë ï&£(»±9@Úd´W)ÓB·%ÜPeêx¬^lLKã]ƒ©b©÷:ÐR)ÛA²Êl]e:g#Qþ Fì'#,Þ]ÆQä;™3&e#%-‰u âÔ™Z&«Ó›/Åí21àƒtYgž‘ÎÔBúHÊA±pªÞͪ/è!xpè·è€”(©HÀµ. Úf ä·OŸ>\Jüpu:-rX„#,R'‘9,Ò ”¼Ÿ¯B’Î9;Ž’^c¤¶Ú€fÌ,c\SR^§¶è©Ï îÀγNóê…É&ÇíVÀGcAJçôë:'èÖÊr|JÏgÑÆ©åŒ=(§²d¬â¦kXÍbRN¹¦Dµ¤œ†¬Ê ¼‹žY9»3™•3+çÓŒpß=W„,cŠjà$k²ÈJÒ0 ˆô„mOy›Føá‡›,‹ß‹¯Å4Ûà6x@¾\îÞ¯CÕÃØ7°#81¤¤¡…µCH+<Ôø8_®þ(Fãµ÷¾{Ì› ñæý|:~ÈQ!€3X1zÀ ãÑBw‚5¹ïšŒÖÑH‰fÛ“àmÂǧÅh¶Ì Á ˜qƒ7t¸áÐû¥€¾2šÙâH”¼p)¥6ñ%åØžò6äo£‹O󬿋ÑY‘q„Gª%2C +”ô1­ÚZêØŽF å] Á‰˜·è¹‹£Å²XdôàDûB˜‘ƒ9lF~iÀñp©I …<ŒÐ‰à„=~9=-–Ùqá586¥/#+b¸žl Ãí *:; ÅÄ(µvb¿\®¾³ŒÜf†É±Ží†ïÃÌ lxnÿÄQö-ù'ZPÎ„Û ÿ„ ã?1X­ŒMáË€Á ¡Àð”ó–0?ËàÁ •R˜Ñƒ³Õi裙^4!¤Jn£X;ûP͸ƒDIÉH "¥²†ÎYð¥æïuZÍgåRGmäQ¤c”y²C[äçÑib£=±öNO¥ØJtFaðžtU‚^”0ÑøRùÊ6²ZÅ@gn­n”¨ã³%‚O½Y”<Ô!ƒÄÎ@¢Ë84Õî4·–[çLä¤MÃ'xfÃÅùd§øh"9R'3pø©šÍÊ¥4_&õMó!¯Ë´Ÿ¤wI¶HòÚ—Éb¼}É‘Ò0M#¼Ž É{•Z>XÏI•lV#’5e+Ji!#RF¤½D$³#Dr= RP¡lºjØm$ïËN°)¶¬V©›Oô[°‘*¹¬$Ò˜ÔÊd@Ê€´—€dwH¾@²Î§Ä7ã9mA::O·ÊÇ-8mUlV"’µB—m¤ŒHû‰H~Gˆ{@$ém9ÁŒã…$itêˆìŒ6if£T*åšm„¶«ù¬·F#Nh©Ñ!cRƤ½Ä$µLнLD6 |.jÞ™›VÒ)R2RÓ¨ À õ¢ÞÂHäJ>+–:¥OiBÒæ €ŒI{ŠIГÊ×ÓÑU±øù |ΣóŸþ¸ûJummod_perl-2.0.9/docs/user/handlers/http_cycle_response.gif0000644€ÿÿÿÿ00010010000013312611727205031023754 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‰‰‰‡‡‡ƒƒƒ}}}{{{.Nyyy=g wwwuuusssqqqooo†âFmmmkkkiiigggeeecccaaa___]]][[[YYYb¤3WWWUUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôòòò???ððð===îîîììì999êêê777èèè555æææ333äää111âââààà*GÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%###ÔÔÔ !!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨$¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’$<ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfff ddd bbb```^^^\\\TŽ,ZZZXXXp¼:VVVÕBTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó@@@>>>ïïï<<<ííí:::ëëëéééççç444åååããã000áááßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠUL©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœMášJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=r‰ ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîwiíAFÌ d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(¢4}PX^gÄ@àÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbJL¦þŸ´Ì©´Öjë­™¦š£}êE²°Ð)¯àÉŠ’ˆiJ Y° †˜-à*í´ÔVK§®Ã­ŠÙ§~D;äFàCãŽé­µè¦«îºRbû¯Š}ÚE@d$1´ ƒ$Dž€D+-ü’@¿ÿ<ðbŒâ‚ µ´:¤#-´âÂ+° ™B-dì‘ ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¢ÀÍ -w³*3ìð粫óÎ<[ë®gð&ö© I:‘L@dùx1Ž-E2í4ÔCŠR‘2d©† D¢|dÎ=dÒK7ýôÉGZµÖ^¬òÆñ[õÕCf]$þÙ=÷í÷ß¹2º«¶—} C’²)‘çæÜ8‘Òdœ1,]{±x‘ß„­$߉y¹;‰ò³^D.9åCîSÊ&ì¹ä- Î8à´×n;¢?w4bò¶dçD~:γ9+’µ()¶‘œ+^<èlÉ‚ñJÖ‚F9Éy|’|ßîý÷à³™;g»öé<¶œC7íxñ'Dn¢4ñô×®(– yÉ%D²Q ‘6÷Žô¾øÍzõcʼ…¿$!à›8D‘8ÀðYð‚Ô“à²Õ§mÝÌ {EÆXñ"I‚-ˆÈ¼  kTÀ °†)†ÔÂÆp†^ø†jÑ Tx@þDâ Z  ŒƒH° RŠx I-°FÆVgBªH5„¡ ™´,Œeìx:ä¡H$øÀHaìáŸÅ)fðpŒ#’Æ·™òÆWrÌ£÷ÈÇEñ Hì£ IH Ò3v,  ÉÈF:rg‡¼L" ³ÈGZò’˜Ï|δ¦ÇêçJZ1‚¾ ¡5ÙX³Ô0úنϖâ²þl5haZÐ’Â…mi ÛO"T€&…$ÒñÏ[ä ¾¶°‰] ”Bžò¦§Mm¡všRŸNL¨í2ê@ ·Úà·¸!zíIe1Û®K·õíqkZsh$. HÂèÜÍo–[Rç>Lºé²î<µ»ß2$n!<0¡¥ø@%8A ƒô@†'î±ï¸.# ¹ÈþGNò’›üä(O¹ÊWÎò–»œäTè¿#pà |.ÇÓÁ^`)DâäPœÁaÔHP)˜MV1ØÃPºÔ§Nõª[ýêXϺַÎõ®{]êì¸/@gNJKÇo¦vÎsìJp¨Et1hl‚½xGÓÁA…¾ûýàOøÂþðˆO¼âÿ÷`ˆýŸdOT͹ƒv5©Sloûm‰àˆ5 hÙÈ \‡U |g¼êWÏúÖ»ÞõŽ—y‚ykvNVþQ—¿Tæ5X+(áX`KFŽ<œ>õ¯O¾ò—Ï|ÄÇ~ì³ï.§:X¸ÜG“Ÿ¼/ð8¼þÁº»eðpXQßüò›ÿü°¼¿£_cï²ÊT»Ï~]ËÈ à?UÉþþûÿÿ€÷|Ç~`V{¦t{½b}ú„}òw]Ð@Π°È€˜Ë'€ë7SîçAðÇ€ ˆ[¶0 vñpp SÅØ‚.¨zØO‘‡;ØL/ 8R"8‚‰µÞà ia^ª°‚ø‚H˜„‚ƒÅ0ƒ‡2y„qsr‘sw0 Ä` F Lð Ò@ W  Üðâ@è ìr`øðˆ±â¹2€þÃ@ïÀ¨Ðw×` êp T d`~àwùwt)ò€né'ð©6›àwwð¥P ÐTð|€}gÁ𘱩ú©'ª£ÚüÐ}‡Jši—TÀÚà© *ª}©’J©–*ÛX‘Mx‘Ø–‘kµ‘æ#¤oE¤E*Vƒ€|ð JÊSa L:é  KúÄÇ€ ž Ï€‹šPû° !Ð ’¸pF ìS`zUʰ M RP × Ýb0ç íðqP  xÀÉÈ~  }—ô úàÍzÿéþÔ@$Kú`+Ðwà§J ùàwŽ «. ³}7³Q³ ý²ÀšÃ ‰DK5[²' )»²){ݨ*Ô¤µ¹­fµ3ÛkÀ {qP ÛÀ pM T[Ù´,{}W ½ z”p ÷€< `Ù´ñx9âàŽŠÝ xê0ù ^‰àwª¡ui¸ˆKŠxr+—aYvsÐw?ûë¹{Û·¸9¸Ïе²éßÕµ^;V„0³‰8†€ÉÀÛ`bTp@1T[½ Ÿ`~ªÃ  ÒžÐwŸþž)Ð àà‹K~@¢ª€ì°Ÿ« À½pà™-°Æà*KäªÐ 'Û ‹@Ä ½È ,p拾êË¾î ¿òÛw4C ½a—“ë*` Èí+ï¿ó{½Æ½ÛÛ½ßká;¾>šW@ªTØúWÚz»QUøÐOu Àp$` Å åP Õ` ` ÛS[I†~‡!ø` àw€3+ð÷ê Ú€ jà Åh | T°ÒàœZ@ ¥K€ü@Ä»¶TÐ )pü`ÄËÆT ÆdlÆþh¬Æ½* g Sp L{ èÀòPP³€li¼ÆQ<ÅU|ÅY¼Åjp –Â\µÂ’ÕÂ.ìTq°œuæO²P®tQðP E@Gpb]ÃË>õ¶’¨„ €œL{žÜW ,\¢<ÊAÕ î4ÐqýÔÔ@Žr!ì°åk`?…˹ì‚q0  ºþ×ËÒ§µßX*yHÌ.å ÔÁ`Ëÿ$ìráäpýYùOí`ˆDü‹Ùü‚• ÇàÏåÎíG»ïGÎÃlÎp m`PmPX…—iP /•Û»=Þ± }Y;8[«ÂÁ-Ü/r PQE°…ð‘€”À pÇkQA>Þè€^à~àžà ¾à ÞàþàánàNÙÒjnÔêXÖzGpmfrÍÞEL´ðTçÐ %ð àRÙðu0ã2>ã4^ãPWLÂNM›P â0EÜð OEvPŒk ä>ÎS’M(”–ý˜M'š½ä…+ßOåÝPÿ V¾SM>(OQîS>'Uæ å˜8PWÙ`|0ÒlÞRc.(eþgÞþi.'k^ç5¹xÐåOEj˜PC­Ÿ è(uç’ç~±çlÑçqòçŒNPÉ ûU‰P u šN —žRŽ(Þ’¾”'–>êUÊU àd Eàíê%Uêyrê|‘êj±êoÒê¼ÞORpÌ·}Xú¸ Ǿ]pî[®H^hþìe´Qè~'ꎞÄî&ÆÎë0`.UÑïýd1Üb&U ¨pñŸñ¿ñßñÿñ ò"?ò$_þò9ÞÉ;ε=þï •z  v[L€RcÀ°ó<ßó>ÿó@ôB?ôD_ôFôHŸô=¯ ~Þ4Τ’ð£ŽÈ(@Uñ@ÓõòpRcÐäö†×ÛÓúÛ–·Þ.oPlÀv`bSÅQšNàõ`/öxxdáf{hŸöå˜&PU‘ wÕÇÜõ%õõyßøå=€N_SéýÉøul¯‚ØÓÄ`RŒïø¿÷ÒÞ÷ Xù–ÿO.EHUOà +^‹÷ ÷¢OsÓ.fìîIîîm¯í[0îX?UùЋ ÀÝõùµ/ö·þ_v¤ƒ¦úÅ@ $Ví evÀ=¼ü´ßüäýü’—û¶û¨ÔûìöûÇ \šÝ¶ àìà/þÎßô³+εÛòÔP”¤Ø@‚ D˜Pწ0„H°?:Ó"^8¦ Ž=~RäH’%MžD™R¥Ç`f àEæLš5mÞÄ™SçΜÄúàTèP¢EEš4)¦”>…U*1<­^ÅšÕ¦½~VìX²e ù Y¶¹•k[ìMq3n¹ˆé^¦oVþXðà-_ÆÔšXñbŸR?†\”©ÓÈ•-¥ºXóf«\í~þZ4[B¼m—E‘¸~ˆKfWãH½1x€qÛ/aÞ½}6l&gâÅg6¾œ\¹ÐÉË;Îl\úfÏ©­_Ç.:€ Ù½_$¢@!ÙxCêçÀõï¨Ta* $ç¨ 0æNOBÃF}˜èÇ£KºÐ2\ø­A; ® á¦£P+äžÃð±æ2äШè*±³®¾#±D*z 9ñ«xøŒ‹ˆcŠHæe’Hb6¼É7ÂQïÜù†ŠHnノÄA„ Pè BkàɆŠVÐ'—Ì9ãŽú@ hqØ×ô-B‚& 1Nœ.ìþ°Î£6´ÓÎå䓦êZ4ÐÔL€A/Ò „Ï ‘xÜq8䑃:ì±Ã|ðÐG~øà+T¦Ð1©Èôzf·Žîø ”Zhƒ õàh‚õ8 fJ‘À?Øv07‚³Ï>éÌ3Y ðT6Ã=åóÏC§¥V¬#ÜY¯Ú…¸4D\>øÑC<ðÉÔ{H-ÉTôšã£ ÜË/wÑë(z˜Òǃ`ÿýkØbŠ…6Nd›µ“Y„{¶à¥Õ6b‰B'&öîÜ¡ hžp¦‰f–X†GeŽH¦ˆcˆXh¶vo}€y>RgŠ|²¹àÖ{eæèJ®þ¹ô`£O˜`‡+¹Í…D)š rÀQ¥—}[YD–BïñÂ>àèŒI¡pÜèæhÇGJ1ªAl:êç ¶¼²©'7Îê®?oñ~ìpô-Ì Í By0Û¼Ác/ 9‡/< à,(º‚©+Òâã“;è0­Vtô@žaöx¼y"çœòŸ2ïsêÛ^ƒÐ1â  YD-ŠaP£„a]"Éqp3Ì c0˜Ã£lІWñ …H Þ ‚@“„pãk̾VÑhü!c¦ÇCû5…‹Ð©J©3¢!–‘-G`Öá=XÄ.a+Æ6²€*¸q,T´bÙ„E1Zh‹_¼  ö1'A4c"!R€*r,q Ñ1ÒÀ/”zÄäoøhÈ«àpHÙá'RHNn…ŒŽDåE` xï‘L@0…€wt`&uÉ›M–r'ž¥dþ̆їXAd*•™ 8@ ÞS-BâÄ)'°d.w¹MÀôò˜sú#1ŸJQ’ò›^H¦2Q9<Ãáè–]”AB‚ˆk€cX.ÉM~¢Ä›ç¬ 0År~ÒœßL§:¹ÊK(#†A>À”:eŸýÄ(äf(¡œJAyÐc&Ô¡C¼¾á?<Ä.¸€AÐÀ”Yd-ƒP±SžöÔ§?jP…:T¢Õ¨GEjR{ ޾©£µ‰@A*R@’Ô—&=)]£—‚.öHvx†œÃZ‡W¢a¶¶Õ­o…k\å:WºÖÕ®wÅk^õ þ×gÒª:‘ê@©úE«–«Y- *`xï øL4¢ ÐT{1bª´¿'œ ½Ó0A”Ârò°šíÐÁJ 6!ŒˆÁA°à¾Ø hkSÉÙÎz!°â,KkÈÓêk¹bJn»ç|͈A zÉã}ðø8a\Gò¶³¿%fpy8Ü>—»»FkÇïµ ¢¹†;Ø"=Ê*qÞDz÷¯à ¦xsH^1š—¿Ô’5À„h@ôìš°`0œƒ œ`Šv@%à.£¡ `Q 8ƒ΢A(g0¡…ÉÀ9ÐÄþój ¹øÑ¢¨×X±EìQÒÄDñUd-càF3€2—A€®.øÌ!>\Jð‹ @‡|2Ù{Ch‘ydü%Ù†K6³wް6qL#( `%èöìPÀË `8ÍçT3 Ù\?7sÎ…¶N^¥ŽmåèšÐ»Ì! y?@ ¸Föß¡¿™è/.úzžà£Q"|Ë ãJÉ]TX@!u%pa+lÎtª>&«¹èjêÁz²6¶]HÁåüÀÇ>ƒ8ØEãXˆ¤‰Z¶6Ú]C¶/•ÍCfþgÎÙòƒö¹Í’ù¾¦{À/P´€t|Îc "×Ì*ƒE¶@x¾p†7Üá‡xÄ%>qŠWÜâ /sºK¹î¶ÛrïÖ^¼å]–$B2fŠlˆekÚRD$ôZ#XÄÁ HôÜç?zÐ…>t¢ÝèGGzÒ•¾tŸóÂ{jo}ûÙÑÅãQyôD>r³A¢‚â'ŒKƒ\$ghBXÄ¡ªŒ¶}$üxºÆ9Éñ ^ÝiYçÜÖ¹^ÀŽÐ=˜bƒ®!vaƒòU¨Oçlw{ä=w¿J= T¯:sD[u¼ONï{‹˜Òíb,þÁ¬0B×8‚݆j‡¼ä%OyŽZþò™åæGÛyª}ô`Y>p†2—YbI¨F\(¯X+€½ì¥ÏÚ;Õö4¡»í¾0Þ/Í÷¿÷J?˜}#á–™°ýé˾úÄŠzo³¿í#¬ûû>ø/‚a4tDp‡°j‹hÀ‹8zàÅ»ˆµk?÷‹»øû.ÌÃ=\¨¿f¹¿‚É?ýƒc|X†ÿé2”í`¾¯`ÀŒ¼÷ƒºëó¬ 4Š T– „– Ô@…(;Ú†¸Hòø O€3ÁØCA~RA¹3¤ù«L4¬A„h¦x¯ÿ1þ>²È5 ×P‚Ç#‰´P*¨{B‡ÆQ ½"ô?p‚N¹p¨Žðwƒé;Bü/ Ä=&Ì'ì(ŒBƒ¦¢ÿQEˆ‹Ò h\@5äˆoáƒ: C` ˆÃ3ÛÀ Ý ‰qpth`` 3t¬<TÂëáC=1&Ä@$­ÙÄ ‚ó#‹ä ø¨(¯8A‘P`*°¾¸üØþ ‚Þd°w…8D"i*°‡ýp€Ž¸´àˆZ 1Ù·½àQàˆkÌÆ*ØFŽ€­™ú8FýàŽplÐs=qàˆCx<`[þpÁ¸C”‰U¤žV¬?Œ–S’ÅìH£0…Š ¶Èè VsÈ_ õ`9x|x†[™’*¹’,‘€^=¨…a€O !!’õ8’$y…ÃQ)àŽh=`Hx‡nPŽ„µy…(o¤‚›4†œÜI%a')¡+Á*°-PÛ2"*x>˜‚3qHÁH‚4ÈÌAÈQH9‰EYl0{˜Hÿ‘¹¶`‡®ú ºg°r€DYàƒ*ÀJ€VqXáõ€I*èx“Æ„*x>@ޏcP‡É|„4¢#¥L¶»Ì̤‚ÍìLþŽ@ÈSÌW‰n¨‚,¡Áñ mp‡ÀÍbÜ|@‚œ:&ÊÀ½¶Œ“· Ä€Ô+ 9`†CYJØ„(V $xm vÀÁ” Ì"ñ°S™¾Ø õ¸Žøº¡¤LUaÈƒŽˆÊkÀ‚kNt˜ÌS¤‚øœOލO÷„y¡cÔ舸•zÛ‹àÍT¼¾´´œµäâ|†lHëШ©ÿ)ña‹upį(â p‘‡4‡ð\?€0•š¹™œIO¸Ž€;ÍÑìˆ{àˆjèyÈ’ ¨‚ɬ~£Ìxð!%þR1ãŒÂ]D¡§ %ÀůpÈÀ€ ˆ€D ?ȇw(‡-‚äHhÜJ¯\›°¼ÑàÁÔ‡X ¥‚´1J·áˆbU¸,Oàˆ9ê‚°{è‚Lt #P` UQR¥¸¹¡ޏ›¼Ù›E°n`f0F[‡Xcp1ËÞDK4­:5Å 7­A¸ÂK²8†)P² ”MðÅÀ¬¡,ÝáßÌp8P,àØ‘ŽÀ‚|° þèˆ]˜‚*À9ø¶ûuÐm@…¡¼×|Ý׎(W¦¸ÜÙ:`Æ+  È}‡¹ØE|°- …xiV µ= i}j­kÕ?*p”+ülè7AyÄäÐ…HTÞPéË™rX3­Ph-•e6µ=—?8œ::8Q±(€É‹[àè׉•l}½7(h9`6Ú“%ZÐ2Úå`ÙªÉÙ Ê Qþú4 ‹h‚}‚ Ì¿ð¦à‡J= H:è40[g=Sà´:Ý­¶¥ý=Áq€‚m3‹e¸¶è°>àÛ"t»³µ<”ušþµUÈ•É=ñ(Äÿ¹„ˆ”‚b("„ˆÝm]©#Ý…1]©AZËS]®klûÖâ„Ê5 IØV¯Xq@¯Ã²GÌÝŒÚ]ùKÛ©r\BÝÎy[¸í4;7 ‚±hRw¢Þêí§ë@ÆŠß½Œî-Žá9FŸ¯èj`½ †(…R †fb `Fà6S…üŠy` gЀ¶h>°:MÜu_L‚ß<”_ÍÎ̳_âÀ_y;  T–a¦ÝŽa‚8ø +XAÖ#ˆ´(ƒö aÝUÜ¡-a‚ÚþÞJáíù^ðm‹í„Þá×.Ðbîâ,Cñ 5À¶P…æÅˆ€€‚X›²‰Nb+áË^ÁzbqŠâ1¢âÔX­Jú (àRHà‚áƒ8d1ŽF0)€‡ã "pÄP€N@â9Τ:&²;®<&¦=ÖŒŽ6(H™]ˆCNd0Fäƒd8? 4H»²hC¸£2S˜ü…‹óå_æ`fav:“]N/O&PæŸ)îc²¡‹ÁbUcƒHe. (€@‘†~0kr¡ˆ@E çr6çsFçtVçufçvvçw†çx–çsÎ8<´ã&þ^e.§à•:Q66ý……°@åUFˆk¾f¯`00 fØÛ°ˆ†g(³fààº|æÐ@Â>ê]„¡_Ë`fÅðçY«¥ºøŠðßb`ä6``"•>`–~àR E,‘2H«Ï°§¾ªh‹¶çMÆg ÔgƒâçÞúhT[ü* 1²8Ò‹"ØâƒpÉmÞižöÍŒn–Öœ¡î¬¢†4ñ¨ÙÿY[üHÈȪ¶êgýi­ŽŒŽN ¯Ž³"èÌýB€%²Pv€ä ¾b„ăV벸h1ÂjeqkÈ€ëræÁ¾ˆ1ÀZþºö ¥‘…p†ÐìÍæìÎöìÏíþÐíÑ&íÒ6íÓFmÏ®ç«Fæ ê‘âê¿’k3:€¨‹ ‹EðÜ„ƒ×€ˆ1ƒ\0îãFîäVîåfîævîç†îè–îé¦nä.æÚck|Nlì‰m¨šm&D* c ‡Y‹' jØ…H<àÝ.ˆ‹ÂäÒä4kí{íªênúî káJø hÈ…² xð`ˆ D\n kmšï*ªoD»o#ËoÂÚo€êï[Bà¯} ¼H†R¤j…ï  _µ _³ ® ?§ ±Þi]ÿ‰&‘$8 Vˆ"Êk‡p‡ O6W4/Gþ¨Ævl† âAïZH(‹Æ ‹~¸l…È™¹Eˆòö!ru3òVCòSò’bò&W+v¡Gˆ²@ƒ/‹f€göò/ož0߸1_¶2?±3¿ª4Ws„H?öå®=‡†oƒ˜‡vbˆ=çsÇñó¹tvt$#tÃ2ôC7KäP†F…Qxtï‚p†š3‘ c†`s7ðJ§ã%FÛ¶Þô6ëtÓútP' Q„(‚`”k®i‹"ð?Œ¸„^trÁ³s ·u ÇõcÖõæ¼^'®_öb0…´>ˆb'Sˆ#Ð@h*EP€…KþÐæbðÖÉq'Z÷vߨ:88 Ñb….`/†u莱€.´ñpð„ ô¡„éÛù¾ô$ÌôŽÛuFóöòw`Ï€cƒ0÷" GMØ‚ „-;„  `öC6÷bpy˜ß2Z˜H"°]Á&‹;¨Â¯h]ŒˆíP"k EHnPä™Á¸¨L•xX:àĽlçÝŽ¯»µ/°‘õ<„°RX….¸©bØ•AF*/†XˆÍUåœ{S§û>˜Vð@ȧkvÞþŽ$`‡¼€E¨õ‘€€…x‡¹ ž½ú”x„¹€þ€#@Eì^\íûf#û3ûC?ƒÆ#ö¨ à]H02Ây‚}…8†lpK®æÐ» *8€°‚ Æ/fú¼à*¸R~ôG€ìüGe´ÆO}¸Ú¤éÿÇ€|øxGûÒœ)ëOÆŽhGù ó?Y}ìÇðgòÿ }&&}nß½Ó/,hð „%Ð(æð!Ĉ'R¬hñ"ÆŒ7rìèð?=É&–zxN”C ‹&"‚ô0’‘‡,zÉõPåD“¨‚ãXDP#=:d`“hÇ Ð)aÂÄɳgÒ¦T±Öå •¬Z·.þàâÄ æQyÀgŠ ZðÄ}Ë Š^ÖàeËÚ€1Sxc­Z¶Y#‰åC'†8DYô¥ò‰O8*oãέK…0È÷ $­ceϦ]ÛöráÉ·²níšPˆY(¬mû6îÜÄúàêíû7ðà‡/nÜ8_SÇ—3oÜÒ§SWÈ)öìÚ·sGº€¹œÒL`qøèR1"X™%)ÝíH ¤â¡"'B%ýzí½ç ЧB8ò )¡\rÍvoøá‘)t4_j¨a®iÕÕ†diãX'ØÀ&ZÝñA)µÐoðBVVÓ׈þ%ž˜bV]=ókŒÁ èȢ‹0öÀ[3¥H`ˆTäÖŽ2 ¤‡]¾ÛC³U7&™ºñæšiª\rkºù¦pЕ9' 5Ôžyê¹§FsàŸ÷ñ Ñ j‘&‚naÔ1ǰBVè¡! VŽôꆤ.9GkŒ€b”zj†\z ­¬¥@_úxª¨²þ¬—Íj[DbÖ9휻Áy-¶Àµ™-·ÏEG-¸c^w(¹åšË!ô¨¹š „T9Å7µ±”Ect±éXK’Õ…ݸ¦ÎþùdsAc`Vw½°À®}dc[l0¾N¬Õ=”\s"<è¡oÀnìl³ÐÊF[¸-›Ù-Ìkn3Íq~ë2ε{.Ï=÷¬Ô z†‚Š5”»G>ØQÒSGE’NS¤¯—%ÐÂ"mô€ ß(%N +ãÆ±TŽ*½ÛÊ"T£G/) à )¶Ødgõ‰X_‰2FVlýÊVhuvÚk·Í·W'ü½7^)´ŽÝ|öØe3î7à(w©r˜,ç<ºAÖÖ|:r(‡:ër’þ:A;û<;ízz€'µë‘ëxÄ eÓŒ:@8õ¾]vÁ—œjþG?žJƒ=ZÐ, YðCÇ|]AE7)œÁ=ÝóCÊ"ÓW}Vàhˆ‡Y}‘!;^h•ýöÝð½ûÂ_*:B%aì¡Gê³^°úÇ—ÿyÎC sˆ´`÷:Ó±®‚¿™™cæ: ¾Nv»û 3¢¸$„DQ|v wd£#+ð5ÐŽŠP­6¼!s¨Ã¢ìň sFÁ VƒDäÖƒ˜3š°‰NÌ áDŽ`! ØÙƒ%ˆ’!A€¡ÇÃ1’±ŒfÔ¡¨Ä– ñˆ§3¢¯•Ä5¶Œ‰S¼£î€<à1#ÓxvHÀô;´@"h˜¼32þ²‘Ž$cEGÇpµ1Ž1ƒ£%Ý4ÇIRËŽ}üä¹´€2€òPO(G¼°†-nÄG)(¡ÈGÒ²–¶ôR$9ÉÆ3e’f˜ìeš6©K:y²”ÆÜ“; …cNqðÙt ¸À!›(fyËmró‘¹&µ* LlýrœÍ&8ÉTLf²3;ÉàƒÀÔÎbƒHi@'Î5zC`…6»)Ðîð›é¤“8Íù¦r*ô8è<(uÖ9ωnÄ PEâ‡j ¥ް×39ÂJ‡wšH ªÒ•:Ë %SBª&†Ê”8}in$šÑR È‚î*Q ÔŽþÍèH *Á‘dxà éŒ1ÊÒ©R5+.Å)ubZSçÐt«Á¹)Vm£Sž’õ!ùÈó‡’|,n´ÊØÔ­n¸Æ+pí$ÙåV„1°èH)šRý€Ï:p0ƒ‡¢&@)P‘Ì>ä@ X`Š|ãH1Á :" /pdÛˆH3@‡Š`!þþý/€,à¸À>0‚¬à3XÀ)\Yr¥#\ã§«ÆEn„cwRærØ!À :‚Š<ÁB1Ár€ã 1¯D4±…‡Pâ{z°FÀepÄ >Àã9t./)Ü ÃGöBd‹ÌÎNà®#&žH'ÄP +|â!AƒŽ‹A^‡D©fF‹!ò T oM³ñFް‚Þ£xz•r‡ÕøäƒLXÉÚZ¬Ÿ‡ãä#GÏÆ4A,¡; ŠLc´¸¯CfR‘1c9îÚ‘h€#aÖ70Cçù·{.]’M\UÛìÔ:Û0©wÚ @@x-þ¸ë5l±L‡„@ %€#äåh8ÆÁ‰E’q¤|"¤ég7‚†/Käpv¬ËªgW¤Ï¬f2cáBg·€!<2”â%àèC²Q…wD°(E("1d”BfÎCÔÃ÷Àgw£¨G`‘ʼn (·d·Ím/x[ÕàN¬¸#Lnˆ;ñFȨ}(HãÓy¤92d$AºÙÀq²JœÛôŽšñän|æ!Ô£{ñ„@˜Ëk J Á5¬<#ݰˆ, Ÿï´æ®¾¹Ÿs¾Õ·çTßÝ^ØÐ¡]Ð(×:éJÌx#Fˆþ¯F¬à—Od„ ˆ3 ÷½ó½ï~ÿ;à/øÁ¾ð†?<âýþi«ŸëJÖzM¹þX¯½vÞ@‚*‘da(ÉÃ(,2Š…MM >=êS¯úÕ³ž·Ñ2õÄ)žjVWд÷äKyÍû, Æ›¨´1ÃŽâ¼ÄHØåÔ°±w<…!/Ó܇u÷¼ç™<àŒ‰ÞZîHŒ¦"˜ÀäaÀ¨-b @ùÌÿ-?qèWú ¥>V­}sñRkg3@€ù]D%ŒFÀ3lD˜ƒïXD$€x¡Ô"Á:’üÙÜìÝÞŸ—âNéßþJ>þ„ JËIFtE ¸_¾ ]àÕe ú†ý)”¾šàž@ÀEA(xD$П  D È€  To1ÞžÑßpÝ 9å Dí æÉ5à 3ÍÁPÀÀq„5`ÛE(ÂiÄ!0ÍE …D¤ÔÎ!É`ãÑ` ₎”nawxA£°èÜ <@8 áDT#F„ÀF$b 4!nbKE!ìÍÖàS¦ÓâvŒh;mÂ(dC p‚ „> Aú]D¸™´="D,F(L_I 'cybì¡ZÖÞ^)‚Óþ)¢bv¬T;½C,TSFÀò±G/:ÄYÅ„0£9:1#AP!cb/5ã0=#4"Å0 ;9Xo$€5hšE,ƒ>´F9PFÔƒ7xÞEÌ0&žã9Úᆢºc&Á£.Éã;&–EZFr’Fn$GŒc;àBLÁJhäFüŸžHc`Á¤—T*dŸÔ$üÝä‘å¤Wídõä$ý$PjD?àE;5ƒ <×FÐh4ÜF„À-fDüþÔCºFYò€>”V`Á(ƒ¸6ØBV¦`¦aRÁ!<°ƒ-¼ÃV\Bœ ¸€VP¦eb&Vn…VfWn•WºXÒ‘XŽ%F(LÌÓ¨ÀÐF,>l_FL@-hD7°Ãl„*Â,Ø‚ üÂ0ƒ<ƒ6˜ƒçÀ= >t‚VÌÄÅ=CV@§t2Éh†idEg|-„wzhˆFg>K:ª£@„fMæ•æ&jZÄ@´±SÐAnD4l„<\FA!qD9ˆÊ†tˆ³ˆf0hAVÔã(}U¦d)üZŽ%ßDD­)÷ þ*o¥*Û#3£+s,C£EYÑ1Q;l$„;ÔÃEœ@>aÄ€¯v”3Ÿ3h&³Å-3í™q¸<3*>À3úhÄ7àA7ZD<\.Eô1EA0ÔeD0Ð9óŒ9g*:ãœ:³;ƒ‹;¢2ÜŠ”Bw4ƒ9øbFøÐÙC@´ÂAŸKB3ìBg]C«ÚCwÒ8ôvœŠ?OprE8C'›8Œ2EüÁ-p„\JÀˆ¹4¹”´Éžôã¥t ­ô´D4 ¤˜1ýÜa!Ôgséƒ?Æ®F ÂK¼ QŠQ-RGŸRûS׉So!:þÀã~’ ”¯E,AI^Ä5ÛEÔMSÄ:tÈEx ÒX“õ"Ï`#o`2®51µtaÅòŒ¯ÏÝEÃø'FxAØZ„Õ”ëcëIYîY×_Z+cÏI[ó 4¼ˆ1Mƒ@WD8rE€j]4h#F¬jF¬ÒDä]â·p7qwq›!ö&ö•6…v™¤¶ êQÒ”RÀáE8ng/[rLjC_KD Ré!²yŸ7z§ž4l·‘1 g+à t«“c6GøØS)‚$TTn—ðCìƒ^cD HFlMU -»ÂðòY{'7‡1s÷F|¿É|‹K}þÛ·FØäsY/î [„¼ñEÄtDôÁ3¸@9øD„6éŽv:÷…5³«Iw²(ÂWOÄ=¨¤E¯±GKD)htFX[Ư‹WŒK„Œ'/·£7ŽŸšŽï)€g÷‘õRöE,‚\Ä7ÀƒNÄ®aD"<ŠGDd·x”oÓ”—¨{_¹Nfy¸mùžuùõqt(5vCñvŒ;ĹCLƒØmļ½p7øƒûV„¿·U¸&ùù“:ïõP—U3lµD$C009E$@7_ÄOcn¨è6¥Wú`Ýù›¨¦Ÿcœ§Z†k8F(þÈB)ÅÃkOD!´iDŒ‚œÐCw¨;ÈzF8È`Ñ:KÙz{㺞wå®ë\¯Û¯»E<‰²÷*ô7F8€oG„ 8=Ü |ÀE4À«O„¨ GÈr¶k»Jq;„çù„Sx¸oݸk\¹›;E܃g”# 7G| : €×N°CÞîɽHÿ;ô À·†Àc:Á<§¯É…W¨kÞ]/Y]ñƒ#¤€o4ƒ¬9lp1H KD3ð€Ý>„ ÁÈk…LM¢Œ¸ƒ®h… ˜üÉoEÊW¹û~»h|ä%<Ï-<ÃK;€R3àîE@þB NüÂo €9¼DH?]„´}GôtÙR¥UzcøÊ¯tÊÕkEÖ+÷D¼zýô}׉ýØCDð?0ºîÄÁM[„!è·D¨Aø†ˆƒñED4ÐÃ'ÿ#S&¬ÂÒkÅ^öeVP©ðhƒ†ð(ü ¤>(Á>hEc>fdfEЧ<èDÏÈ&~¦sýz:þýAþäIþä?;Hú'¡Aê4ÀAoP@Ø)ѳÃ`„Äk„ :”³†r2§sJêí“E"è@cHþ¿Â ”Âü @ðÑÁJ¸kT𙢂Ö€=ÛÁspì‡_±éx¶—k¢bÔiˆRû÷í§©þΙa«-ÀÏ4 @©Ð?V°@Ìt‹P ©àm+ߦË0CâœëÐCŸ”ûPÄâ ÓÐÄèª OÅYd‘ iñº+Ö Ë6¾âÁh¼’æ ‹±Â "™'ŽxÞh£6ÔH‡€/DªÆ›/V;Á:›C#G¼,ޤÁ.´èÆ£ÍÂ5ÙüÈB­0ဇ‘{´ EK?¹£>o¬yMlSÒö\s½WgžÄÝùÎro67Ýx‰.º,.Y0º«wþ‹I¾úc¯Æ¡ã›° Ñ·¬dL8B>ð8Æ`Pe.Ûì³%¤%›ƒþ3gŸÁínnûÏ¡•Î[ï” àÞ½S²„”°ÞÙÆ-Eà€´«$ hkŒ”¶€Œ¯þFÛòË1ßHí•Z²›Û·çÖSîÐ;¬Ûs9ñ\õxãà™Õ‹É'ëyç«f‹„WØÚqPš'(';ó㑯vs¶O7tÒGzæLo^ÃÔaÏ~Ðl@G{°PÀ+"ºˆÇ+FpëϪj”‡â“¯ßþ—ïÜz9ŸŸÞCéýgœêíO:ØûÞUT}ðã«SA¿Ò ñu¥ðÊäp °$£-ËPI!´cÐï~%4aINr!ýPCý `søÂ¦ …Á1 q¨2 ª³;Âr gtVøŠhÁFØ@% @ÊHxB)ž05tþÞNd½¤d‘zQ±âõ²’C1ªˆ ¸‡ê¤ðë4AEPITr ~Åq1 ¤Q•HˆâY¿*~q:.äbqbxH¢ÐT¹á!i–[à‘üD¼Â€ù©d½èC1À„°Ì;¿@JîÆHU&oŽ!É”DÆ2(Œt%NI]†Å}TÝ"æ&ìã+äII)lAŽgtx^)ÃìÌ’Œ`¨a+Ï@ÊãR¹Jm^®•·ü ,iy”-†“)¶ôfMr¹Kur…IQ –"R+P›V@Q‰äcgÀÀ4º„÷•eÁp£VÌ>x0›ÛthþÙºyNª€“œB™eEybN‰^%Œëô¨X €]¨.Fô ûºâ‰QlEèÉTÜS% iY”±•cÄ* `CT¡•¨E5êQ‘šT¥.•©MuêSƒƒÂi…• E1ú“‹bT£V}I:?êÑÖI’-€€WJ‘¾šŽÂ'‹8C?´²„›Že ªèŠ,䂯}õë_XÁ–°…5ìa›XÅúµ½©ªWm‚Õ¬öd«í*dÁVuRnÜüø•g`“,‹POr` j€A+hpƒ Ît… H±…fq æA¶[XœlS*KÎËz5³¹¤<þ½) £]™«JÇ­( ¸H1p0D­´À&-‹w·R+À¸å¥*o¯êÛß.%¸á®U‹kÞRÃ3{놻"†ƒnå n`V  ƒnt!Ï-è)H\Í+—Àä+ßÝ¢&’ým{iùÞÆ7ÂÜ F„˜+ÙðDWöpy ‚+Ex…Ìsó@ƒRr¤L­ÃÆ0…]báÉb8––(‡{œ=R@ƒz{…1¹¢(œåöW,`h’¥lЊ4b‡Áx) D=¼ ¸$«óÇ@rV‰¬H#ŸÉkV%\§7"ÐC»fÇ"¼þR'xå„(ËB«•Ò,hA#´ó.ÛLá7c4·œ³7ëüh½y)…È[&Ø•}(—+ (AWʯ|#§eqA·"{ðà RPƒ  ЀÌú°¦#iôNº¢•æâ¥o™i`WG:ø UsÅ Þ ,4Ñ5Øf!D«·"\(7P·lH ›·Ä&§±³ˆlW*[ÝñÚT¥l´ÌÖ¹= º•Hc¿ai‡š·Â*oèâ'Œ€8¤[ï²²î'¼e(ïFÒ[≲ä „!ñÀÀ…RE¿Î" ¸²¥à`¹9¶Ì•c$¬>i<0þˆ®8c=÷ùÏt¡èE7úÑ‘žt¥/èP^Ûc\aõ®WœË¡úO4NHŽwœP @/puEë†ÓUâ,p% ðÀñV¨@'Ã(Ë5 N>©ra09,–ð…7üáxtÄó¼Q§‰Åi‰ñfý‹[纠XA$žÌC|ðôêˆ@1t…Ô[¡Ä*º² <¬},†Ëô`cð¤Îv=W*÷PÝ[+ŒÏÔ?œ©_Ý¢ã$~O(oEË_^F]@9zògC{]иíâPЕ-|eÊ\YG=ÈÂrh-Gˆ.~°âÞx»w?…z¯Âþà÷öøU¯?ò½8ÿ˜,Ÿù+òØá|¢ ßÔeš©,Ê lö댩,BAÆ"\œÈ ZN+rïý@P7â¯ñôï% /–$/€’¯†ø¯ÿÂ#4lá'z`äJ®E–!SºnO% à¸BÈ‹!ð¡ `ô`å¢ÎBÆŽôAÞÀ§Ú/­$Fð÷JPêî/\Œ¯þV…Zзd(ÄŽìö& à¥^õR"tí ˆa¤Äâ~AÎbÉø`‹ ¯0±Ð÷jøï)ý' h É0;vh zB Áêóå¦þm+–€¸â€G,`p †a P ,Æ!L,Ò)Ö ÏJm±#²°·Ð‡¯ yæ ÷ÇÑ:Êàá, Öà>ø \ F ¨©,lA¶¢x,%v!z¸aFqEðáÁÄâo1sñév1ÈzÑqz„Ñzˆ±Û‚6ä 4@ºO]¦áQ"XO+8€ ·Â @+Œ!z"NÀ &¥+ÆAj,¢ô€ü<¥ ÓÑבsÚQø|19€‘øæ±yêÑÏb’ì L@â`Ç Ü ½BÈïÄ€'ÆAva ¹°‘-öþÈê9mvHM:’÷‘Û)¡ç$O'%U²,!* bEˆ&þp+”A UâþK%N%@Å4!,Î,J#i’$È )à6üÀÄ€#Ä)›²M>’â¼J*¹ˆ*IÇ*=+³²-®)€2Q.a¥È"È¡ã`r¶‚î` làÀ‚V±-X,è.G¢P¹tà6Ð4 d0Rþ¢ò»P1C‡1íÆ1ó,Ä ’]’!-S‚¾ âR¢>i+( 5µØÂB ÒÀ ®cHbîB¢€ô¡ 4‚b%3p)8CœQÄD~Òþ”`dó>†€6Ñ6w1³H7ç†7ÛÆ7³,8 ÎpÔ@ ¶B#ãh+öJ4Á ’¼XÎøÀ ÃAè ð¡4âÎ33AjCHôN  =‚ B#P”¦Å>G¢0 1êôS†ønü3h4@ÇbÀˆ!^ØA9U"¶"xg+ÁBSb Àí¶Â à q®£¶Ä ¡0ÀD T h~!ŒÀ ²ÀH2$ƒ2,c6c36d4¨ 4Nƒ ÚA²áø-mT$p4$wô…zÔg~ôf‚THÃâ"éaý Å Ö`q¸@þQ+¶ÞN%æÄB¦@AÍ€¾-Uõc?úã?:ã3ì´=d65bôá¬`P õ)Aò6G(ugõ\ÕQÁ"a¨o]h1%–Aæ’æÒ †ò,²A ÀÍ:P¡WXH8à(á ¡ âÀ&$¤„JVãJ²dKº¾D6gUM €”`¶!t$ ÕWDJòê†UhšËX‹f’øM]J.a+ÊT¹¢$”+(€:Z)¡aJCeTJåTReUZåUbeV¨ Vn%Wv¥W~%X†… æç\à>L þÕ#6?qóþ‚Ugþ–[ŠUa»â ûÖÅÁ¹ªéc‹ášF+ à È+¤À ,;Ž€&€BÝdC"a†‡aF#"fb*¦A4c4†cX&dFæAðƒ@vV#zv 5€‚v\†v[ŠÖh·¢öDi]zAKµü´bža®Ž` H+%Ž Y'¨ó:8(Þ´¡,0ôn*oKpoý§oÉ%ÿv1pW%œðáZ å±@cÇÂÚRâÊÀbë:* ðŠ6`Às“tµItõt§Çt¿åoï&aWw]*Fq ¥´Z@+Š€tj2‹A Ø ¾ðÀAÝB‚`ûŠÁ þÛÈâs‰w•Œwþz”wO˜×OT÷yQB"v·PÚà(Ãâ"V+€¶âØ÷+ê ¬#p%ÔÓ|Úwxß7â7øæ—têWOîwNòWMõú ¥Dø8`+âLjÃâ¤vÍ¢ ¤ATbø€®V5+8tyÕ0­*ƒCgƒu·ðƒŸ n]4² :—-–A `—`@»ˆ@ à:ˆ ´&`€'x‡ê‚ñgëOˆí¤ƒQÇyõ·PˆÀ x(Q¬t.@+jO@J‹f`+Æ€²`-ž æ’,ÞÀ·"Ô,ÜŒ¥HŒu”ŒÏŒGOþĈŸ—D/—P¤A‚Áb ̲ú"µâÀW%A@HWË" ÔaU¢;—®(˜‘MÈ‘Ý ’‰O’醈KÐ’WiíªPÜ@I•!¶‚Èï>6´*àÉ r¸, Q" ì€ÂöBkÙ–ï—%M—¯Ž—?„’M˜÷ÀŒæ-%žK# `¸Œ¡æpl¸WžLa»"Œò,œÃ¹‡s4—–`­ }YÿÔÙh•ø `%æ² ¤%”á –@+já“çà;t ˆ 'jÎàŒÈ¢ daYU‚?”Ös ªp:§uz§yz§þ§@¡ •œ©Îœ=Áh‹&@„L!,òŠX7 ”³Ë€z R€HàŸ¹Â¦ö+”š©Çb¯ï¬Ñ:­Õ:±¦õV¨×‹¨K'¢ço¢–¦ Å25%²™×—Tîº"ª d! 8 Sà Îå¼B(£‘ºh|x£€xnäÚ9Œ:CìZaï ‰æ%4Z+rU+J É¸ÂZ`È¡”T,ì,Š’&[i*[¢.n2»96{::ÛX‹@ø€|e¤Èo¤·, ´‚Ja+ª9%’ÁÀAù+ a,Á‚Ó¢û¶){¡Ç¹¡)«`©îþ· HÁ[PxâH¢¥ÁÂð %B€| ¾¢ªÀ&o‡¼L,ºƒ•×›PrûœvÛgz»‹BÒ ‚ÛXÛéIed t@+ÚAµÇ¢JX§úq,ˆ`û6–+žð` |]Ü›|g9ÐEÔûÄYd$‡b[ä¾%¼’ÀnêÐw+À@΢t`ÊblEÆÙ%ÅoiÅu¦ÅãÅ…ãÁ•ª[$Âv˜4›× ‡R˜(%L|+’! 0É,’ üÛP@{™\]œÜ• |\¤\€è:øÒ¥ÖúÏ=Ðï©Ùâ|IFv¬ëiâj àŠ½þâ×Èb*é,œoæœÎÅ{ØàúÂÌ{½¨Ü†šKž¡§MýÔQ=Õ™ÊÜ™-ŽTFL!r  @wN+X`¶¡t-Å¢ Ü€Å+2ÓU¤ÎéÎãæÓ+Ô#]`:ö ÕÏ"ô²›EL@µ­€T‚¨A¿BÈÀ«»"/Fï,Ú)Ü‚ç˜îÝá=Þå}Þé}ÈÏØ Ù¿%ÏIdÏÏÙ¡=Ú§hÚÝ¢;};¤Àå¹/ÉSB ·²¼b0,.Üb “ zð=äE~äÿŠæ ß¿Hß÷„ߟÂߣà~à©ý,özY6)›þµÂlW+l Û¤›“Å‚¬À¬T,žô ô ú›cþxøáä7½Ý:}È”}²˜ý7`þéMˆàÛ"Ó`ØÝ‚ú· À.‹!ÁÞAá‹+ƒÒæÅbŒàϽ˜-šë3'êÝzt«ή>«²Þ*¶^ïíÇëÛÂù\ZPTà„QbH %~¡i‹¡‚|”M ÛµbÂàB|,š%ÑðÞé mø^ –¼Y~†\È ¿ô‘ñÙ¢—DáæCZ%æèØÊJ‚8Ö´buj+Ð` 0œ-ŽÀ r›öïçôu1õzõË©õ)ìõsdÿ,ŠAWÄíR‚ èéþžQ"Ð È`-¸‚(A% €ø:XeæG?ûëú¡ÒgÉû:­½Bb‹)ØE%¡Â… :|1¢Ä‰+Z¼˜pµ‚;zäX$ €uKšô¸$ÇM& àøíÊI‚ñ,˜ F/Ahì$ÍüIP€O@OŽé‚1©Ò¥L›:åw¬c–^ªZ½Š5«Ö­\»zåJ¬®±dËš=‹6­ÚµlÙ`ª­Ü¹tëƒð5¯Þ½|³ äxЩàÁ éy;°b†‹š\ÀƒãÉ; ¸…]’‚&@$Àè㲓ãÒœKs‡Ô8)”KAà]ëŽGÛ¾»)Tþ©Tûúþ ˆÛnM]…Z%snXr~8œsŽÝtU!aðA† ´ˆÔ‹B‹—¢Rè¹w ;¨± G'PRÐX”GÙ|$ %%‘c!òE=ƒ ¡ôØ D3¾Å%oÔæƒD!‰fö•!ˆjçášn¦%â™rJ7u…ÙT7ð0ÓMB^°c‹Œ4*tÈ3xúŽBãŽþU’P#>Lô“%‡%†Ã[o\ñ2v¸3J5ÝèdDMYÐ"s„µó*AO¬±M1[Pá?5ðKY0³D!ņ%RÍÃx0Œ÷%žÒÞ6&AeΉíVi¾É­ZmvÛmœÙŽ{•‰Ý9mR €ÀB}´#hyT<ÀÇ*Ð8ß$ =A¨` <ÙPÑ ú䲂9g\CÅ=&–ˆ^JÐ zÔ2ÌP§n´` ²Z%J¶bIAl @P.›ttŒ²dDem¡Ž E,¸ž6SfÑŒó8à%ÐïxùPA´=€ €¨¤šJE¡‡Ú’hºéV[þ̵䒻-¸^õí×kŠ»õ¸æ¢hµE>C´vBÚ¸sBÜ6°‰Bw|PJ-´AÐíR1— ]Ð_ýIB½ÀÃ0D…óM7ÛdsTHÅM,‘„2EøêQæò„”äÇ5½¶rDGu ‘ÌIëˆÃK4 ¸pF+2š-D¶³²ùáF8†àÎ7 0̾3Åc¬1½öâ«oÚÒb­uÙØv-v·a‡ÿ!ÙÞÏy6ºÚS„°=(útùÖ Mp—‡ NEÛ„.8 Ý#!ØQD4B¿*Px°ƒ=è!xØ'Ù¤Q} á# è>Òþº“ð  Ü8C ð V-Cð.b¸…T–ÛÊÀÄQaq×x[ÜN0·º­LÜëÍù¾'òym|JÔùŽh¦ô ±"ã ° Œ"^ é‚úÔuL!Ù¸@ùç?Ì!!Ž8ã ; ÌqÖð8ÄAs # k`‡à :Øzàƒ¹”†ö¨@"È-@Y€ EàÆб Hr$ý™É5à‚t|U‡€8(q pÀ )JŠU´â²¨Å-rÑ  ƒÈ@ž! ™‘#â (D€ÜÑüèg¿)¦¨ˆPDbÁÅÄþk*ç‰Õ¼¥9Ið! .PÁ3*XàãqA)8S¶`ÆpƒBp¨¢ô@+! °â^°>ù@Æ8 <¦H,štlMŽ„e4ÃЈFq¤ú†:6SŒdD GP‡:ÒGœ„P(†2DÊ‘ñr§<@“,C…TC Z>Ô°L¼‘ q̆ÁN"FeBFì&‰À§Íe3«Äá¦U£óͨF$ƺp/PôSB1¥{hk¤ ²À:0í _>q:$H!—@äQØh3pT€Åþr¬Gf¬S°£%Jt’'cU8%ˆÀUB ð0pJT€À°€ À@öqyÄ£€øC ±WX`!@ Q‰*6žâ˜g=ï)VóPó«WM"WÕ´ÕïÒÅ«ÜNX³‹^F‹"¨2ô¡Öôh /KDîóÁ?Ø yGG"àß“PÁS©2<KÀ²Éª!ðÀ%o,äæÐß’ÚØÇFvp•+]Ókí–×BXïrÂkâ¶wÄ}9/ˆ£е`i¯$ÖÈE¢XÅ0‚бb$ H‚À‘6 þ£&éÆJ[Wì¢Z @Ƴ¥¼A1`HP_&³:%NqqPlfµ¬xÌzq1˜§H4ÔV¢Æ“í!؃ÓDÄ.9.F” –µÁ$ápGHEêŒM|€¥@€9 Ü`¦PâH,G…;—Æo®‘˜Ùü›2§¹.husðê1mn5cê¼ cåaAm(ÀGnZŒC$Ã>I†¬fú2Vmf ¶GAhOˆ4Ëéë[Ø…Ä™svµ˜ µª¦MÞ5µqJím²¬yÛ\q³µ[mc}1X%JAÜ£ë@)б <€#« Á( BO\þ§"€ R ;ðÉXÞ¹þirëEÔáv \*.—qKÜ/«VßÃÑ ëuƒvRzê°‚pƒ$Æ8]1ÚÀˆ&Lá³Å(Í92$˜|AÍȬ#äË÷§Ìþx§#¾q¯PãiwÅ5žt«˜Ûè N·v °Ê~FFìJ¢†›Dªû·{a+¤lýÑNõ£c»{QïÊÒ™~§‡êuŸzܳku÷¬G_ŸM ÄNÄC$Âðdã }v~a„k ž wÖ¶#ýw¹ó¦îï6Þå¢woó=ê~=8Ÿ"€êé‘‚"ƒ;áþ¾š;Úm„ú#OÐ@ªÑ u<#…'1|òv׋žª¤ÏËÝOO–Ô›zõIo½ô‡ûô é‚üì+àÝÇ1"¯«’ÌÃÖ Z5찎›ä€‡3J[tßUHW}Xq}؇ Ú7jÜ·qgC¹(Hhˆ¨Èè!×#K°pIîU b€dËp cðA…pŸwóö'(yýp ¥À+@@ P€(MX€bzè-‡„fÁ€g.Ý€Q(…SH…Uh…Wˆ…Y¨…[È…]è…_8…HVZ»0‹0o¸Vþ”ð ÚÀY‰—¡S 7…`GÂ`Àú“Ñ ú€t¸lp'„8wÚV„x„K˜wJȈcÑ„äf.PF‰•h‰—XV`|”Ñ §ƒq  @4P-@ÇÊ 6å°¶P! ´`jX'²@‰cŽŒÁ(ŒÃHŒÅhŒÇˆŒÉ¨ŒËÈŒÍèŒÂȇ˜ˆ`±ˆ˜}Žøˆ‘¸m“ˆ‰Ýè߸ U­±VðH`½B2Õe` ½3Í@ Ðì0 Eðø@ ¸XT°‰$eXði‰ ©øot7Uq€Ø§€i¦þ©Æàˆ‘©‘áx /57ã‚D,P¦¸ Y1 c¡ î÷•¡8°‘9©“;é‘§7‘fV‘ v‘;i”G)R¿Ó “!wDÐ;…0Þ°fç‹àð =0Óà¼6Ñ X4‰”ei– Ó“Óø“x”)6”lV”g)—siã z ˆuh†Þ0;ryàB^  úW I v@Qè0 eÑ—!<@—“I™?‘–‰¸–L×–&ö–c—• šfù àޱ w ÖäW ðu+Ðg ÀuŽÑ â@о0[pòþ8 ÇóšÃ š—Y„™‰q›)^ÉbŸIœÏ©‘`€üàB­Cà“dSÁZ ŽaxÐGp@ø`1 G³a0tÐéžfiœˆœ§œßÅœ#æœï©Ÿ—˜°_@ÑÝ@Õ0$[@éébX ǰ`yIP$€‡ ‘MÐ ­ázÀl°Ÿš“ñY}ónõÉU÷Y^ùé¡)Ê*× ð†3Tà` ÷1 Å ê`Ñ` Pé`ÇSÅ‹*j¤Ý¢¤'¢ÞF¢Ye¢Ü…¢G*¥­á À fÇ2†p 1ð Ò€‡Õ$6P@ þEp Ú‰SéÀvÀ’–è §sJ§uj§wЧyª§{ʧ}ê§ ¨uÚˆø^°¤¦Ö¤Úô¤_e.Ù ©‘*©“J©•j©—Š©™ª©›Ê©*©X*RMp@Š“a ÚP*Ð;q :@q'ð”h Þ8r°¹ª«»Ê«£W¨ŠhI˜Ö¸¨Ve.c€‰À¬Íê¬Ï ­Ñ*­ÓJ­Õj­×Š­Ùª­Íú«—8#kp¡&Á‹ à_Ȱ ð QÑîÐ'±+Ÿ'R k«˜„…¨=Dˆ™Õ8¬‰zMÇÚMÉJˆü:DXeD0Vr( þ p`e £á(uÁæMP ð 5e‰G@߸¯{5Ò¬W±–5ðdÑ?Pf&°MD°Õd°(kˆÝ8üÀøÛð@ @qðD@ ‡éÍP gð£Òª@x°:k5þzœ›\‰ @ –P\™9`b5«D7 E9‹µS¤°”FPµA ÁФ8Ètaÿw ›WZåà‘Eb²WÛ¶Û£²+ ‘\{=Pš`H\Â:p5P\ÉUhK>j{Dl{¸ýJ¯P "‘ ÙP1pÍ€áÐRp37ã”àéDàþ„‘'û¹Ó”¸Š{€7€ (°SÔÐÀð]š>œ{>žÛ»)û¥$G1¢à ò€ô° k0ÅÚÀ´¡[‰d ŠÝÈ»Ïë Z+ŸŒ[5p=e%É‹ŒÈ¼Þã¼î‹'o[‰A™ ƒ¾]bxѰ+Õ釆‘[`àv»k¸þ{mÀª¸†*¿ea ;ŰP¸ ›Y”˜‹ 5 %œ¶¨¶Á^пìiæ e× #ç—‚ ¤Ð 5EÕˆ»Î¥‘í+Ãò»+‘dxH€ @  jѼ@ÅUlÅWlÅ7 ¼t1‘5 P àþç`¶/»¹.¼Á1|Ä ŽxPLC?>p3Dð&psûþHË#ù ŽF¼Æ‹¿!ÚÁdQ ‡Ä¸¥¼€ Ù¨„°l’¿rQ` #]â! ¸ [ì5û[6j<È×À–@ ›á‡Tu`Ðg €VîÑ| ù°‘‚|ʃQÈJzÈc±ž „ ¸ð ” gÑ ËÐÑ,ÍÓL͛ÕV0Ú—VP‚ $ë°¼h¬¸¦Ü»qêU¹‘Ê•è Ü)P l @p hбæ_À ðVÀÓËü˶Ìu‘œ@L€  þ ýÀÂd!Í ÑMÑ=ÑE€ €Ù|É*ÖSî (.â¼²äü¹à,œ5!Ä”ÈD{ýD?|0$B…pÄÀ? ³‘ ³ŠA| É  Õ Mð5 T`×€Ù°Ýð á c0e€é°íÐoq0upä0ÐRÐQ¼¥Ô%à€jð¸ß 3gA`×w×y}×”€ ¥°Ñ¤ÖÑj1³,tHØÀÈÅ£LÒÁjÒŸûe a Žâ áØ æ0«â`üPb`àݰ“ƒ•c9Ó Ñ Oà º IÐ9G€¦zþÌm„ë ôc|<àLpcá øPǰ ŠÔ‰,îà$ô`ƒt—‘k¿×½SüàÈe=gtøó@?eà Ý %ð¶€@#ì×]¬rá º`Ýôã G  É€ÍhÑÆÑÈ{j/\}¸£i *аOZ •f%½ Ømᨥ€ˆDðàîÀtü@â@´Å!  Å & R "P Óà-A3P N@0³cQ|vÀ Åü€A¶À·œ ܀ŠdÀVx€uöËú°áö@rðá"¾þi€g@â àà ^¤YpÖ@ Ò ÏàÁ­Ï@Ñ TP Þ-à½qØ;0Áë Ü%/uîm ]Àèîèþðý×\Ø] ;U¸ T h5Ћ ê£Nê¥.êV€¼@€¤¼5Þ¶þ|€ q Æ ×À U0Gµ^ß½ ]à _džGg°G|Äìàðò Òmƒä‘üpß×]e Äž$O  P Î@ ‹P MðˆP Íà…P Kp Wð ظ ß—yÀ¡G þ• ãYEP‡±Î0 Ñþ9ÎÐ ±­ Éð9—È»ð è”)àñÃç}žÄÁú“  6° @°ƒþ|°^î­.’.ßuÑ=°S p]p×`º @P Ëàó?ôAïóÇ ÂD êNஎµAE<áÀ  ΄ ÄôÝ-mE GPÔ˰•ÔP K½îØð °ñl r ÀÔ€L¾9éÐOµj”í 4€ßàÆl`ž"m`}ЂŠT )4Ò)^Â4NS*(ëçw€¾à$–‹ 9à|]bi¡ò,ïò€=ßm1³npH€à   M`ÀPÕþ û³OûµOû@à r@GÏ„‹]¨J¯³A5#qp Q ½ Mn Û4€õ¿“cÐO4P @ €¬"C  OPá P Z¯¯ @Î÷ÕPàQ³^°‰~yu ó0T1S1Ã|¢RÐàA„ .dØÐáÄüŽ£H1K/5näØÑãG!E‚$Ö×I”)SæÀe D;\ÙÖ Y”J”p)©ÙÓgM)ep•BÓhJš¦Ž.ÅEÍg$+én°¹' –”;rˆ²ÔÕëW°^¯ @ˆQbF®eÛÖmG 4*Óâ]¼þyõîEhA€W'Nð0Š ÃTIà‰ÊÜX1£ù¯Ä¹™5oæÜ¹ó9d!‚À‡gÔ›ëõâ3-u10âSöÚömÎu!:¨ù!oËУ'OŽƒ¼ SÎ|`Á^ð®ñ¥^Ý:Ìs/¾åÞÝ»—’LQZÁUˆ¦>D¸ÐÈ«ÉÎS4]FuòüY@СEÅ«Lº箞†ÀÅŠm ™‚&1ŽÉ*‡küS)²ÌBK­ï*´¤¸æÒí:;ìЛú Ã"„0𱆃$ÈBq~ 8ˆ²ÃmFÛæ°Xˆ Ñ¶j–HMŒ0¨¢™‹LmC‡x[À˜l~{!hþbá å jŽ·{ ’5<ôòË‚d´£ Ë,3<¦âóÅŸ*À¥~Pä$ax‘o'ûêÃ(Qê¯Ï“ ©‰2„Q§'p¹aÁkÖ9ãQH#•\ ,ë,œÒ2sS 3¬I0CõË (粉ŒTU³nœ!ÕUw<ç ¨-V\)•¡æêµ Px†±’`Ž‚y’· ‚ÅŽ&G•V/1‹ÙŽSlßB“©zì¨/\Ñ_˜š/ÏŸöÔ¯Ï?ûìa.0B\:ñ)œ´º&t}¢¥Ò1UIÓl fËS]íšva†z£„Zƒ™¼ªÍµÈ~Ø æÖ‹þ_»ÇÙ8îXÕ]Š Z¸¤ƒ*9á¯WJq„ŠV€#õ E *ÀŒÑFœÓ'†¿Vhxi†ª½Ö`¨?ÚÖ¨h¤ÐÇ>=öPT ñÎí(¡ø´]¡a©™“§ìd”߯iú×R 3¥0j¼9B˜.…™ö›a †¦£4*†uä"ß9”(÷,|Ð!ÇW-9¡/ÚàÌ{r‚ Ùðð£oí  KÐáCž*Pš·ÜC,þ¶»Ã­%3oÞ§6 tå°¢‡ý¼Ž[]@q!{?_”…“„ဟ’øA%}áŽ{î€'äý{/ö¾üvòË·¸òþÛ¾Ñ;@®$T¡©ß/r|¿-ßo§wjߥäMÀC¿¨ñƒmt Oq»OØÖå å-¥5HBÀ¸Dé<£hC Xò6ê `—òÞÿð&¾¾íO…·;ŸýRó„`Ð$Gx_9À}4À…FÂßÒN–²}¬iý3aÔˆ’(ëk«ÀE|–b¼¯!olPÊ~  BÀ£'gèÆ r-,9ØA¾¤½¯q„v+bÔP(D8ò/w;| 4q5n´ÃqÇðÀÕÖð:Þ/…·øQ‰82Œˆm,ØQb ƃxOÄ…2œqILfR“¼Š ÚÀ‹°‹ŠþûÉ/ó“3@CLXB¹Ž’½ª±n»#±õÆDæRZ- ¤gÊÁ ða>ºX²@PP®—4ê¡.IEÚ’SŽÌÁ ÜÁ@iÔÀ‰Fi@>¼ùMp†ó›:B(·¹ŸEyzÆš X2P–K Á¤É)\>SŸâå29s„OÄ ŽP¦ª¶ÑšˆãþÜQ3÷ùP‡Dóžg2‰Q¬PŽš*KFG=úQ†TQºXGÉ”k4Á[yª.À”xno„³¬g-'z¡|BT§¨bèŒÊ€„óÈâ;:XA=<|‚†=‘CwúÔ0åîi7µ#q‰Œb yþê(%Ê*2E_{D—Ó4Δž(±'U;%—O ªsEH?™º™£&L€D5ê¸UЃ&üîÊÌ48B±‹elcûXÈFV²“¥le-{YÌ.–RõŸ[½cUdô¸%N‹j€a`mk[Û†iÄ6¶q¸Á6Ò ¨¢ó¤GY¾†‡pã¬gŒåLËÈFϾUCtFsû\èFWºÓ¥nu­{]ìfW»ÛuîfÛT\&Ï@%pqd£ë €.‘ ÁÒ$ Ùwmƒ…\äW¿ûåoýû_XÀ&p |`þÖ¯"SM.wŽÊ.d”ÐHþà‹„nø"‹pÆIæ`0„XÄap„2LlbaT¨A’áJñ¤%áÈ™ ‹ãšñ9(B}üc ŸBZŒkÚà í­`r“üd(GYÊS¦r•­|e,gYËOV°}mÓŒ Ð@‹qË‚ àe4§Yͨa0’ÛrÄzå.þð˜8c8C+J›<@è¢X †&ÉŸDa!†Û€DZÒ“¦´¤§qƒëúÈnîÎÞÖüiP–éx+t`Ùàc F°Á'±ŒPÇZÖwm3§GrDgÌ#£4ÁÇŠa~4A ¹Ðè ”4¡mxGþ?¾!€pä!ïèÃ8À\ô€%ÀÂ1ÞãÝ…!$ÆR|q^¤[Ýëf÷ºo°¨ë•ÐÖnñô¬í}ï÷ÕJÀw¿ýý¾ZÏ›$ʼn v=›øA O JÊå‹”ÃçÜ!Œ"LÒ^À p’CÍø/ÖŠ“D/êP ÔGêÁÛ­f»РÄQÚ*ð‘Ôûß;çùmò#ô\èCÇMÀqÞG²éàH„à 0`4[˜Ãþƒ6ƒ“M¨C9N’ŒD`Œ“\‡ $ p‡'l¨Æ® ad”º˜Çpw¼ßݲmŽ€ ”µšÆÅÍþŽ!¸]ñ‹/Æ>€ ÆGžñF?¼F9Ö¥³# R íÇà 4ð"Mˆ†t ŸÑÄ5X/2<âåö$ÂEt¸Uò@ì:)qF°€ìyÐ Àð€4Œ|i0á Ë_~?æ4ˆÁ$š6|åá’xÉg¿ß}À´ÿýSÞúŽ,ÅÒiòŠlAýëg?z  BÔ$?‚0ܯñ”ÀÝ(‰®×®éЄeH€!`ƒ;¸}X”˜@1â  %ë ? L3Ÿ ‚ Ü@Y¿Ês$ù1?¨ƒa8A| à]Z¡ ,‚ÜÛ*þs‘]Ûþ\Pؽ`qàR@ "€10„7¨?ø†‡?¨Hø†lӋܪ¾ Ôˆ ä@/d¨€`øB2D3<ì c,‚ñtò¬¼ólOPä X°PÜÔM7 ]P€Ÿh\ Œ¯Ex§¯Â…vx7=Štº€tÐ,Ë<þ8ÌÅ =¼ ÕPM\„”áQÙäP$  ÞŒœ-Ê;ˆ›¢p‘,0ðjø·A‰†ø³³Œ „Te¨t‚µ¡Q‡K@;ÀQ§üÆÒ/d`6EL!m0G:¥ž€kütè~¨{à$ ¸B8â9'Œ øq8‡“à…<¸™Ô‡RP@®ñÇ=º5Ó Ü’UàÔ«œÓä:"](LŸè^8€¸i€ІB^ ¼;”1KÀ!$“¸Q¡g0†|œi³ÌTœÛTP?AIc•JQõ,8#í à…BB-¨õ ¡9ÙÌt†þí‰gð‚ª¯±ƒG€Q°y´éÒç$V3ÖeÍ>¬ByEÉfu+«ú"Ÿp\@ůé`xA%}ÎtZTŸ8ƒ(Â058'!xƒ…×y“×{e¼ €R¸Ø‘ÌWªr¤H€úˆ ~Ñ\Á¸qƒH\°€Ÿ—¿øšk°Ðc¸DØ|(+•¸÷‹9е5‹åX¢£ £MG½)GÊI°¬‰ÝC…¯!ƒ— !hÙΤ“kø vø]+Q\ðú€-0‚[@ øƒoضäZN+Ú¹XI¨[»½[¼ÍÛ¼‡¥u¡Z%¾u"HÂ-\Ã=\þÄEÜ9™¦(«Âø °n`~`f`#ýà­„r¸'«‚ÚŸð]È\t¡bi胳¸²¬Dð j°^£†Øõþ‰BÐ…ÎAlÐÚ !*@»>!_‘°cb!â ~<0À§ª4›]ƒlhb'~b(Žâ&Þ›©ßûe¨®›a¨¯q䀯ø¾m`1c2ã.@‚zø·Þ )nã6ν«¡` Þx¸c<Îcxq iz\\¸…ú˜?É“¸F€‚“ølSaŸÆ Ðý‰*Àƒë—{ ‚Œƒ“c  •í—*؃MIßbXb7^å'¦b-ˆ\ûeª®Õo¨e[¾å1£†2`ªtˆ_þe`fafb.fb„Tc^ffnæaÞe\YZƒð·5felν,þ`cÄE8ˆ<à[zÜ@€ú°\(t Ž;‚Gx†,xâ%®‰3˜d£ÀÞŸH‡dˆZû˜\(ä¸iƒO^ŠP ù± hh‡vèG¨ 9€3AeUÆæUvå-€å+]4i‘i¸Y b¨<„hi—~i˜Ži™žiš®i›¾iœÎé–„:ÈiFNj¡j§0$@àO»fŒvãÜ“†àfoîpP૾꫞Yà5h£ÇÍIIí }h/È:à…i°<0?´bhÃl­ rÐg•†¶û‰À…Wøš:Ɵϟȃ~$ÏþÖµù!…‘Nìt¦ÐœJâ"¹è¥–bWΆ¶b,Nl’ÖX”€V€µeʃF˜ÔNmÕ^mÖnm×~mØŽmÙžmÚFíFèéh#Ïi1†8 ò7¥®ì(nêlxên®à”¤cç9Øífjð–0„"d\€¤Ÿ¸\@û@\0Z@ƒ€<ih´ÃVŸºN‰øhìž ƒbx‡¯9€( š¨‚;h¸d‡¦ @`ÊýHè8lèFƒÅæ4ø€*eåÊÊ&îV£&ÎìX^¦>p4(é@ ð].íÓ®m/q?qŸ„ÛöiÝ>þp±„Eàfjn`c ‡bã>n¨Vn\™êç†n6©…°g䈿ŸHƒpÓúÀ—w†š`ƒxkŸø‚öV ¤ý hŠ~©5zð)¥bh´»Ÿ8Í$lƒ1pèNðNÙ˜è$“ì‰ðφˮpŽÆpÎÖpéÈ”î%ÓNqFotG/ñÏm-ÐðGƒ}  ~8jYî>φ×ñä^n¶pîr4h‡qÛê®þ@ëúØSý @ðÉÒ"rðY\`´žè‚-G a ‚ú¨‚SDvh±v !p#è…i(6ï FxÛ®9ßm:þéy¨ÌÇö‹æìNwb*¶䓆kƒ¬ ¤ ?ðBéxíѦ£EtyŸwzôX‘æIwq°„VUøíà5Nïó܇J8øJ Ð0W/õÚiJ`êfu‚c íö‰@çŸÀ‡ E [G†(#€­ -èuEÃ'¨w ‚øª_P´:p7XaÔ;ñ란ió¤=ðkiSæŽngâo÷stÁtu€é¿ h¶Ÿx§w¬Ïz·÷UÁwJß÷‘Žqήf¯ñ¤÷tty„\yx x‘ò"'ç¼ÁîPÕŸ†A¨\À [€°þÈè l@y”èrŸ`ÙUÈš”€0`PÀ"ئcê‰/ßiÿŽj÷ì i;¯_Š~‹£?ûpÒ/}Ò‡$¦Gw§‡îuéC?é”~Ÿ«×zÚ¯}׿zUñz}ç÷‘¾t£Fê»ø¯=ÆcW¥€µgîŽ õ¶¯…ÄFušàj¼Áî8c&ð !¨OŸÀ,àာr艓_€g`# ø;nuY_öŸ°ƒd@ƒ< "ÐF¸žmPH‰É¯‰èy€ð"p Á‚T€š†¦Àç¡ÃyÁ€1!B 4Š )r$I’V¬É¦r%Ë–._²4CÉš6þo’¼†’"EBðD¯ÆVËp"Å™§Ñ¤¦NŸB*u*ÕªV¯bÍÚ´Q¤I×ÐÔá/–xªQÅ@+^ßµ)@˜vï¶l€B\›Yp,Àœ±h<¨”’<ºCŽì…X\–/c¾,Ìr7Pè0€q´»t¸j`~4£5 A02‰„«GæÚ¶oc4u3j&«GOÀ%î÷èeÐnà††$˜µü^´û61’¯TÈplĉc?àPev}mžL‰w=L™4ÏÃ×¹Æ0Ÿ@Çj°€ZøI—j €XàV]ù'XbVÖYA-ÂJ$XaþMsÕÅž†,éÅ—…ÅüuÝ`……˜bA ` xp€‹Q6]fºü€ /ÌPD1ƒŠ"´é’(¿Ëµ £’µå¶$.€(¸L¥¸è²Ãl}`dO¾XæÍo8yYu/b§aÝÑ—Àpr@ry“Þ†wfã^ÉGŸ}ôðt4°çH˜¨¢‹È Òç aû0?ch…â¹a‡t†(Ùˆ†™hX;´`ăhJc™;Ô L–esO–aY´áÒ€4(`.2à–e*Ù¤’ÂHe ¸<e(˜õÀ%Fýœ&Üo ‹Ë™/‚þÉ7©ÉDô¡aFE6ç‡vvÊžžšÞÔ§aÒ7TQGiŠ(£ÿ °£BÚ Yô¥µV[ôÂÇi¼ë}úa¨‘Zbbè2櫹ºd ¼Pq.7Èj…. dV–ý¼ò†°¸c2£‰ó .Õì e·™)+coÄ•‚‹Q–#²eÕŽFÏ–™ó"¨•ù­‹3ì×@`åÅ&ºh€'y¹k!¼ß5/Ã%Ù;¾èæ·_†ú°Üs 8°…%)ºNxv\“mWÄN YÅA•ŠnŠ+¶¸1BûŒK³á’Í2º Æ‚e¼‹2„†ûd–Î2kf‡&çäþ0k¶;ãÒ³Œ=\Š„£¡€K¥¿Ábãe5²-.<0Ô9²Rc—ËhJ€ÖLªd|tR"FÔ¡‰'„„Ž<±#ûÚÆŸ·\Ä ¡˜"È‹A^ôQ‹7ŒD‘aäÖøþ¶ PéÅ;FrI€fcpš˜0"S´A0„!ÕÅ䉆ű(•0ª .yh NBÍ* *8€6ãÀÌ9€eê!˜ä8G  ¶³.‰E¨‘eÆ 3,ÝŠV–F-”°Îõ £).¶ 0dcÎ8_^VrFf؃e–Q|­x‡@´ø.ÊózÙ+ˆ‘‚ÜŽ%€ä?*Ð%"šÚÀˆ;ø»h`Çh¶15Ä!0€! ôzZŨÀ‚3(o©Þ¸I»ð '0A F@Fñ† è6 -f ƒÀâ-`Á*T S˜€£Q4· Q˜]°ØQ†zSÜ‚•¸À%0 Nxâ  J`‚R  *XA+ZàÄ ¶‡‚b Í3XF9äœÀBcþâôÔÆ•9HŒ!2Ãïõ‚ ØB-Ä€ ´Â ¨Â ”€(„7˜Â4 ,.ÄÁÑE"¸/ÔHðxAåŒ .ŒH.ø•mx›ºM»ímDà mÜ›e$ÄÀ ¤Û i˜ÔÀpS `†.ô€(ƒ3LC6|C9<ƒ((<‚$X€&pÀ'ˆ) Â ¼B Ø‚ üB0 †]†.üÁîÈA´`õh\”9€HDÓ¢ÍL|‘zx±¢àÈÃÇ¥9ˆ8t\5< dÌÀi€4`„@ŸÕ‘ŸEÙ&˜9 1HÃþ°Ã7EÉ 5ž¹'XÔ€´Ý,ÌB#œÂL d€ tÀ¤ã$Ä‚àc*0Å ldÂPš+4E8#na£6bÂtpS4c#ìN@@2¤ÖC0ûÄCŵÀ„3lC:Ü Â)êjx $|A)좀´F¤‚âáYÚ4b#3:ã ¼@ä #Ì&2NÂ,d@áM0æ¦kÂÞ•cØfä l£n²ã‡Ñ;7TAèÀ-À+˜|.`A-0ÇTÀÜ£ÁôCÀ@ !‚!"$‚<À"þ0‚L$P%P‚\Â-€*p؈Ú0¨—A”^ƒ |`(€Â'xh\‚%T%T@$@Â#8,‚(B",€A'D‹bÀ~Ø`Ö”@:[CûÜ4ñ ÀÂ!0€",BïsCôó?ãvnô…ª5v±õo»õDÂ5OH´Å·*Um<Ñ+ô@MwKÔÁ›:7Ïxïmü@ðƒ;¹Ù_ÚO¹Ú+8ÛóT-0ü\ǽÜÓ}Ä—´K>ˆxw|Eϸ°P¾W¾† ~|\°dÅž6¡x×;¾ A>N,ù °'¤[¾Àc>¥k~•s¾ÅøÀ7Ї¾Ð~™—¾Kò ©¾µ+D À÷ƒøX­>Õï¹Õ‡Ö“µNØ-¸ÿûÃ]Ò7ÍûþïßOðþßXpCðÿû³SÊ3xaB… 6tÈP €0Ù(V´xcF‹­Pxøñ`–^H–4i€|íX¶l B 7‹NÖ´yçMb}põôùhP¡C‰5jT ©£K™6uJ BN©RUÅ´zU ºCS¹’”@dX+Öh4{ö¢)¶}x k\Öиµ 2O£I{ùöõûp`Áƒ 6|xo£:w®“—Õ2Æ“)#Œ8mf=V9’kÊÇVŸÕézúôN§«Y·šÔulÙB¡¢F J\nÝ»u#kc[êWÏÇ–Õ|Ü¢Z¶ÃÛ.ôztè’1¯þœwVvíÛ¹w÷þ|xñãÉ—Ï.h1s5vØ·wßÞÝëóA^F~?gë"»²Ã÷À\%à Ô‰§Ù\ð'Ø|𩨜©„³n,7ÙÃ=üÄmY‹¾Mt«žST\‘Å]|Æeœ‘Æmd1ŽuÜñ#ûð;N?æø«È"IR Â$[sPÉ&i“ÐÈ('¼¹±F»K–ã‘Ë.½üÌ0Åœ,"<®8Í4Õ\“Í4Ùéh?Фœ5$¼³(&ñ¼³6:ýìŠÊá¤`†ÐB =ÑDu`ÌF}ÒH%](¢,-•«³á†ü“S÷ü4(=AM²ÏNþM=)ÐIU]•ÕV]}•1eؘ•ÖZm½×\©ˆóÔ^LpTPE –ÁR}55UX•]–Ùf}vÇMåÔNbñÖÚÙŒöÏd¡ýÜpÅ—Ui¹¥³Úl›ÄV]×¶=wNoÉ—Þzí½·-sá2Ýv!d×ßÕÞÝ×Hyñ=á„^V_‚‰ì7àŽ˜©®Ðà…5Þ˜ãŽuløâ !¦X¶a9aF„PHB]K*–ðN¼ÑÇœgh87uÆ© €Ë.Pœ(ÅSœi”ψ‰¶iôt”ñ8Ü¥júé1£žÚ3¡‰6Ú^C6pä“S^™d¦°õ §e.Q—íþ¥úDU 9%Î]€ujº„Ÿ Å k/¤Oö@À]W Qd !8*Pƒh)E.Ba [c 'ø %HA #)( VqQ<ƒ‚¦€c:gBþ ǸDð I„ ¶°‡vüA”ã(§Cú! HÒ`Ž$# Vá†åžUÃbÜ0‡;ìá Ä!ñˆI„›(F(DŠT´"µè™>„%¬ AR¸Âcƒ H)4A„ƒ\‚‚—€£XYä…*dáA"8Á=ºE$1›YÍnÆ­œíì$=K °‚7\¸îwÄ£]O§<æy`  (QŸP`vð‰t€ŠQ´¢¬LÞò|;Ù­2T`PâF€ô¤ÇèIBГCÔ¡'ù0FOLiÊhN³š¸(…-q‘ˆŸ˜Ò(µ!âP&ˆþã€Ã+¼  »êyÏ|îÓ *8 .¡zp€$ÏÇ&$1 äÁ € *àˆA°Ï£è[IÞÏyö ,<Š`—Ä‚Œ—‚A¦A ƒ,Âùƒ ÒÀª”¥.-† Y G ¤“™œ¨0it¡" Ç&" 9D F#,!" — Ü56A9¥2Õ©P-FððÀÍkW7.:k¨E=jR—ÚÔ§FuªU½jV·ÚU(|Õ®b%«YѪÖ6°•n­ÌISºÒb´Ô <5ÈO£:™*  €AÀ(ƒäâÅ8‚ "ÛSÊþ§Õi¾@7»áMoÜâ›M¸Q¥™ÏÄÅ7qAÍžŒ³'æì‰1î‘ÍBôÄyèIà“D9(ÅoÉ)ÜÝJ³·á ¶d!‚`¼m¸"¯d`KTöä•>1¥1ÆK^[Þã"P„Îù2/(ù3I`’lÂ`à¼À756°àq•gxAý%I:T ’̶&öýë 8Á@fè–”b8JÑâRÜÂx4Èmºb¿Ø E) zfr1!CŠáŽ«D.5ˆ$(WŒvÎÈVÙœÜ`'˜`ñâ[›d ¹ÈþG.F’ó°ä&?™rQŽÉ”«|å,dË•9qŠmìbCÇ<öñŒ\ŒÕ:ð 5ÆóŽ{\çß9_ƒ°ö´GÀï…o|å;ß#½>/´ï}ñ› êw¿üí/&ýóÂÿ¸éBš|vàQºû]Ÿ°w¼åÅ|åK_ôÖÚ=¥zy=ëøÎ÷Õí•õv•)¶õ€Åè „r^\¤—›>aöP„¡ XÓ‹Ê<ø‰“~ %ô Ÿ{£†ÃÐîø×؇M4l ƒ[Ü^ ·¹û&â&»…pK0…ç`°ƒÆ>HÁÒ„:€à´A¥!1€`à¡ÅþpúÑñ~äè PƒAqf“CaãÿxáÞ` X€C =3—•5¹Š_<ã)÷8ÈENò“;™r:ï8$¯Ñò—ÇÎÿ¶#n†/Äá,Bðøg Ú Q§ìÓ“…H°Óð”'=í‰O}ò³ìÿä§@ jP„zA¡ u(D%JQ‹bT£´íèØAJtÐãC9v²—M”j_»''ø *u}ÞnþäðÂvžŠ]Êž!=ÙDq¢lâ">è z ødóAÑeO€¡ÝØ× ­°ƒÝ(Œ_|ã à¸Äàq /pø†VðûàÅg?Z@ RX#^þ8¬q‰Gx’ ¸ Š wÌÃÐhÜëž÷¾~ñ y›Ô Ñ0A>aÙ„< ¦ÅøC 2 ƒt£¢þB‘ " V !"ïBŠ!†à ’áÈAÐþÀ ²aì! tàßNÀôA@hÒ&qR'‹ÁÒ€øá !Fè a¥%à%cr&kò&sr'{ò'ƒr(‹ò(ÁR) ¢)Ÿ2*§²*¯’2 !²#r%Cr$K,Pà²ó DÀ òa ™À‚ôÒH’#/í" ¡Û¾-ÜÆ­ÜÐÍo4Ó ÖÍÝÞÍ âmÞ2l£NâÞ.Sß2s£ÜOÙ‚âdPT‘]›q‹ñOFa"á'p©7}˜¡Q jç6CÁ}‘6ƒ1™–IA² þT,†t€#cJDâÄeæ²’;b;é%;%E$dölïüv¯÷ŒOøˆO=‘Où˜Ïù Oú¨Ïú°Oû¼€û.ÁûÀOü(ªüÎ3ýÚàšD:GebVã@÷„:«5®“>Âó[æ@®ª;/´!(ÔBFB!E$ Q©Ñ ü1·Q|ºñÃ1EËñÓq½ ß1ç±ï1÷±¯±DÃѪÀÁ@Û%A™B B4ÀZÔA§KÀÀœæe+ÙA1”J "J§´^„ÆBkUÄ&I¹ÂtdãdBº¬%HUçI¾”B ´JÛÔMßÔK¼TMs"LÑ´)ÎÔNIçþ'ØNÿPµ G‡O»¢Nóô(ðQqaO µ&üTP#UR'õ3µNHiQWCQµQ-µ$ •RCUTÛTN=µ$5S‡bSó´SMTGVc•ËJÕT½USõ9q5 ¤VsâUeXƒuahÕToUW}bUWÃdOZÕSUG*`„•ZaUZÅ„X=ÕXdY÷dX0€°N¦dcA‹…WCcB¢ä“¬hæÃ†æ``äÚ¢CÁÄj‚´¬ckªµQA ì€ úá!þu2VLæµêõ^Ã"_O$[-õPÁU\ÉÕ\½µò˜©×bã\ÄYk"Æþê!Jêí4 õ!çNà$%*4!k˜ã;–G(€JanöÁ!n$„–KXÖeñ[ µWkU/c¯ecqíS阌@DàÊà–F nŒ©xš'¤ @`„É•vµBê-}$$¦ä@´À Lú¦˜Èo@M DMI#Ô °´µP  qx ,ˆžÁ±¾dËZ ð€¨Ä'ä¬aœLبr²(&¶g»$ ä"˜¡F—‰J·Ž8×sAWt•hvéètÇ$q×p÷—q Âq!Wr?Fi¥ÂÀþ¤a¤â]dzÁS¯×Ä™®6k·¶k¿6lUÉx> lÏ6mg˜ SU£Ö'ºK¼˜õºÀI(@¡' óò¡  »|«'f XÆ'€«œØ–Bê-íÎÎ *TD!Z@B¡B¡oâ`¢ü¦î*ê¢R6^çãÄTA ©İ:‹äìï|`'“ÆÉ @L¶L Hª0`JA.¯ €«šì°'±R·Kâºá €œA«|دÖJˆÝʆqX‡y¸‰¸r‚¸­Æ¤ƒ?ø D˜„‹AL…‹!T¸XXyQ£ø "ô¡øpem£Žéþôz…Â}E~y‹‚~qÁ~³)ã7»œëB€­«Ù7ÚÖÄKÖtaJ@Dz¢~‚y"Ù½zB×z‚Ö€MÛÚ¶4LÁDÁ^Ô D@l3KóŽ-dƒ­#q”¡¦Á ¬®¦âüìŠ> :ÂdË&Ç‚&g†&g)‹AäàÐÌsˆ–ˆçÈ‘Ø ”ø 9é<è–¹™Ÿù瀎›Åä–sy—©®—â—I!˜‡Yb—÷&ÊAH¡$|zóvöv£üúGnéÖnñVoùVøÇz—Âi=y’+ù’36Ù':YØÈ)”}­ÖÕ‘§vj'ï',¡ z ¢þo 8Zj"òJ¹€O™3ù&ƒ½àôA 83áÕDháœ](ùÌ Þ²Šs”N›'gÂð ›ÃYš§™9V·u â˜Aœ§šª®¨' ©µ¹ªÉù n:§ ‚ê—}¨£žm"Þî¡$"€ÒA‚ׂ7ê‚ïNØ!ø­ãÚ‚' ƒú(œ–¤{£Aš“ …â¤)O}yj!ñ'FAzbà·.‘4Kº'B±¢õ4]mcd)ªdÛ“=ù†@aTÁZÁ <@ܯ¶ºÏ4¸¦âÒ!³6 ϶R “0/h"1ÀȨ€ë¾d+ùµZÒÊ€€ 'þÎ@®zJ(‰Ò(‚*­+Á[G @ ðÁ Ö ö-ý<.!  Îï<Ïý,û¼ÿ=L¸ÜËÁ<0ÅÜÈÜÌÑœK²Užé™$x@fZÃê¥Kâ¥<–h–=Å(FübMÅ›³YÜÅa\ÆiÜÆs›QÇE€Ç…‘•37CüX¼Wf]JT¶K¼ tae©Z®_¨}ÔÏÚ&:Z!~A¶Âµa[¶iÛ¶)ÀˆP[µYûÜcf?k[?o[*¶õX“MCö@*´YjyU6¡ tqêÛísžj ¾ÛmãÀ¦ zŸ<ʧ¼ÊIâÊþï1¾“|É›㥜ʭ¼F³<ßó¸Ù×w±WžQƒœN†Ü @©[^R@¡¤¡”%J¹fáÉ¥ç;çu>â}ÚFå]žØZ~åý½P¥ýç£^êécb+àÞOô]Wù]uœžO¡~êÃ^ìï¢ê)Dæi^J´W¹>m¼~NÁ~ìã^î¢ìùTíS•íIÆíÕîçÞïç¾îçôî35ï)fï¿´ïÿ^ñÃ>ðÕtðµð#æð“4ñßò¾ñ¿ôñ5òfò´ò/_ô§9ó“tóó´óý¥S×Õ*H”Jbè”7Lg:%ô¿e_cÂs "èA ÆYaG_i°bþ÷{ÿ ~?øbø¶ôôôí4õ…â>¥SÞ¡‚I¶Jâ ïìmöéäö¡sž¸"Àá ‚ü BÇYÛ‰ÿ!Î?ýÿýâýã!æ?TŸ ¼H° Áƒ$Ö—Ç#JœHñᣊ3NÀ”Æ=€9‘…¸S MžgáêÑḮ Êš»päÎ ˜Päðpó0pGæäqˆ‚viÆ”@£˜Õ«X³jÝʵ«×¯`ÃëÀË›3á”$ÛF#”¬dßZͲ·bÇ.…Á‡MÒÕQ-ˆƒÉ*ˆ4Ò˜K"¶±ãÇ#KžÜþ•¬Y´jÙº… @n1º;ïæÝÛ÷oàÁ…‹N¼˜²ë×°µf €Ò ¹º4hApÎL8P7®¶q… I*—(rùrŽl.¤Éã*wâãpp7" ‚£A^Tœ!qI=ë‘‹•/€œˆd ß¹©UÅ&à€^‘µ“\Ç AgœyÖÆ&$BÈň@Î&ˆ G$Vm!²”`D1mðÁ<ØÑ ,¶è¢€n†—‚ b×UF8a…f¸a‡†8b‰'¦¸â‹Hº8[m šçy8]BAß4à]JÀ§åB U§u^j]˜i ‚̈ðþA dVtq*A ?e`ùá ”§ðàöŒž|BÐpØ1E+{ DU’ŒNFV ð³„5^u£¥•ºƒ›˜V‚•nØã„ ã4jꩌ>餘zfÕ¥¯fºi§Ÿ†:j©¨æÙ’(©Ä’K0É”›é´SO?5TQG%µ”M=Bɵ‰‘™hªÉ¦µuÄ-sßRôfm7ñ‡MY hpp ±À» °.Añ ä€ó €ºö»U\ǰÑàÀ­^åý$ÜO_uÍ–ÀŽDøkñÅb,0¥®ŽU©Çž¬ð [õpÄWŒñÊXñªPvÃrw¥ºø‘þgzê±ç|^ÈÇQ}÷å·_ÿTm¸!!ÝmtJƒ©4.ã¢Ôdu äG€Uà^€uy[ Dì!ãN/ü´@ )Ö!Ð YG‡@à°ã8àS¿,ë I„lq•,˜ÈÇ“Ná"nU;` ;µðSJH£ƒUs~@8Vq“†$ˆÈ`c}§Žñ߉>8ã‡'¾¸á޹ä”[޹æœ{z1¢“n:êª_ìrBqÎYç¼4ã™.Ÿ~*è@„ŠhBG? ‘ÓOùô%Ú?µBæìtÂ@·ídÇÜés´~QòÐÁÄbœp†k á€@dÔ5ƒ@Ìþ`?ø¡…(*@Åk”8vò«„¡.ö8 ø»bŒô@Žðrè<øƒU¸“VXÅiàÀ抄&r ‹1ÁDð/Ô =B†0a1P¨BºÐ_ÇCH¹ÎÕ<ç}gOí‚W¼˜'zÝ+_û2Z—Â÷ðqÞûâÓÆ·¥2šñŒ^XÔ×ÈÆ6ºñpdQ2µª äjY ›×òÈ5/Œ­lgKÛÚÚö¶¸ÍÍ u»[Þö¦E1:Ò!a|ä·ÈˆÆJZ’oq̤&7ÉÉNömŽ)GÎ'öà}¦|Ÿ@V¿ùÕï~ùÛŸú·“ÿy!€,þ ö¶(ÉðE²—m¢ä%‡iI5zò˜ÈL¦2—)Pó™eÌ0•öËizI˜Ð̦qŒÉÌnzó›à\£3µINjñÒšáª&:ƒÍrº“ Ü §<çIÏz*‰6ïÌg#׉4uò“$íÔg9ãiÏ‚ô • >ÊPiþ“Lþ|èGÊÐl4¡ͨF—9ΊfÓ¡­NDCŠŠz”˜8C/VÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢5§rXèIÝ R’>Ç[NèI–šÏy@àªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«þ\ÏŠª¾³©QÉH¿åY ͤv ¬`KØÂö°ˆM¬b‹¼r±¯Ô„êH‘&Q° $á™ËØÎzö³  ­hGKZÑ:ö#”e1;ÍBT²­uHD‘Ù¿Nµ´¸Í­nwËÛÞú¶´§ŽliÛ~Â$ÍY' B”€Ì(М]À€¸ø„ŽQÎþö»à ¯xÇKÞÜW#É]îCšûÜèN·º×Íîv½´×‰ÈB&ÀF9bˆ<8$ pH!îá|ôÂ!Ͱ„CâqNåx·¼ް„'Lá oé¼¹o~÷ëþþ7À¸pŒ‹/¸ÁÊ©/¸þpá Á!!€ÈÒ ˆ0-ÀÀxqÍÛZøÇ@²‡ü[ c¤9-~1.büã¢Æ¹qŽw&G„:÷ŒeLc?d Ø$Âô`"›ùÌhN³š-iäŠ`YËKæò“½ì0‹ùµL+.."±‡$À¿¸¸ˆ Q‡"%À5Èìã5;úÑŽt¤Ûœ4‡ðÙÏ€´€ ‹|ú!‰^t•«‘ÔŠ€`n F ˆPb$ -"ð?°`³–´®wÍë^‹—Ò15ªUÍjWÃZÖ´vˆ­Ûde¤Aá¸öµ´§MíjwØO{6³IíÈJ#ÚÖ·¸ÇþMnrb[iÞÞvžÉ <Ãà.·¼çMïzäÜßj÷»Õב”ÙÞ¸À…Œï~7;¯ÿ¸ÂÎðï<¯jÂNñŠ[üÚ(î7H"îÔ‰_üã ¹GUŽ“Ôã"O¹ÊWÎæŒk\LÜ~yDPÎòšÛüæ!¹SMRšãüç@¹ÎIÊs‰¥HºÒ—Îô¦;ýéPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ô¿àr™W¤èÄ%æN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'ïwQ»]¯1¿¼æ7ÏîùÎ{þó ½èG?êu“þô¨O½êWÏúÖ»ôp½ìgOûÚÛþö¸—yìsÏûÞûþ÷À>ïw/üâÿøÈO¾ò%Iüå;ÿùоôßüé[ÿúØÏ¾ö5_ýí{ÿûà¿øù=þò›ÿüèO?æM¯þö»ÿýð‡~÷ãOÿúÛÿþºÏ<þ÷Ïÿþûçú÷8€X€Ü2˜€ ¸€õ‡€ ø€ßç€XxÈG¸س‡ ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@ˆƒ;mod_perl-2.0.9/docs/user/handlers/http_cycle_response.png0000644€ÿÿÿÿ00010010000021465611727205031024003 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*%ŠTD„ìÚw²¤RJE©›R¢å¶ÜT·åjUÑ~˧ÛJHŠ[Qi‘‹•$²†¤Ä„3æ÷Çù6ùÍæ=(3îëùÇ÷1sÞç¼ß÷ó}¿:ÛK^^UUuüøñx ')))ggç6ü,l[·nmC«ÄÄD[[[Q[9rÄÀÀ@ÐUüGÁ‘(@"@ €ØÁ9Úè „´µµÙÛËyõíÛ×ÊÊÊØØ˜«ÜÓÓÓÓÓ“·þÎ;ÝŠD"­X±¢Õþ„……:u*%%¥m›\²³³{÷î͵Š:.j«#GŽ0 AWñ… þ`ê ±ƒß£\›§:Ê;wÆILL¬¨¨hóVÞ'N$%%‰Ú*77WÈÞ(AÊÊÊdee…üæ•””Œè Q`D±óýûwôãÚvíÚE¥R=z4nÜ8kkë¶­jƒ7:88´¹¹‰‰É¤I“Dmµ~ýz___{{{âMª««ÇŽûêÕ+!¾„ÿ@|Q©ÔÄÄD‘º :‹³³3¥ó_b¿G;|DgÇŽ{C‚ „¬zi•···¨M ‹Åõ@ä÷ïß»»» ÿµã«ìµÞ¼ªªªV¯^ÝþÄ^àg»sçÎÌ™3!Ðù/€@±ƒölS_¿~µµµ=þ¼¡¡aš'$$ 4HWWW¤VRRRqqq¢>käÈ‘#GŽ^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@'??¿¤¤¤Í£Sÿý÷‡DjÂb±¶lÙ"ê1Ê×®]+((hµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[s› &ˆÔäáÇ©©©"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘‘‘¡P(Ý—   àîîÞææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²··ßµkWÛÚþïÿËÎε•¶¶¶HËY,–¬¬ìâÅ‹‰TÆ—¦¦&Q{è,è ^ðKT¢ÌÌLö™{oÞ¼õ0¶sçÎ1™L‘šDDDDGG‹Ô$::šHªvLVVýFÄ ~‰âª„Ú²e‹ššš………‡‡Çüùóµ´´ŠŠŠD]Œòðð011©É?ÿü#ê"î‹/N:•`eüw$¬Ñ@¼à¬m¶¶¶VVVÞÞÞÙÙÙÙÙÙ±±±û÷ﯪª255=yò¤¶¶6‘›¤§§/^¼XÔcNŽ?.ê^ô°°0âë¾ñߥ ™%Ft/xDG¢›„„}}}WW×={öܾ}»¤¤dÖ¬Yƒ&å „\\\D= ‡F£ééé‰ݺuK¤YB<¢ÄKss3’ð@ÇÈÈèû÷ïùùùì’K—.eee:tˆàššš¬¬¬ˆ?”Édš™™ÕÔÔo’‘‘±}ûv‘–ÁˆÄ ^Æ+%%ÁÓÊ$ÉÆÆ†}òlnnîúõëÏ;G|õŒ¬¬ìÕ«Wû÷ïOü¡yyyýúõSQQ!Þ„N§ûùù‰ô«Æ•…¤7É”)St~xøða‡ÜÀÄ Ñ‘––î쎴‹ÍíÛ·B sæÌÙ¹s§¾¾>ñæIIIÆÆÆ"=ÑÀÀ >>^¤&£Fš;w®HM:6ÐñòòòôôÄÙ[¯^½Ú!÷p@ñÒFtB&LHKK£R©>>>FFFnnn"5÷ðð¸ÿ>ñúuuuÕÕÕ"±ø×_ÉùÀ 8m¿9sæÌ˜1ƒJ¥ÚØØ$%%}ùò…}‰Á`9rdܸqzzzì=ðB.¥¤¤¸¸¸èëë[ZZnذ¡¼¼œóq—/_¶±±ÑÓÓÓÑÑ;vìŸþIä’N²ÿŸ)]^2"éÇ"+**š˜˜¬^½úéÓ§III"µmll¤ÓévvvÄ›\»víÉ“'ÿüóÁúeee/^\³fHC‘Éd„Pee¥——NonnnnnÆðÿ¥R©"›¢  àïï?nܸëׯ{zzâr??¿7nŒ?~êÔ©………>dOü º”àããc``àîî^__Ÿ˜˜˜žž‹ós½yóf×®]–––&L¨¯¯¿{÷nii)¾¡Ktè ^ºF ƒrppøë¯¿îÝ»'jFOyyùüü|<¡C‚‚‚‡‡ñúêêê/^TVV©c!|P}}½™¦>}ú¼[]]ÝÍ›7mmm{÷î=f̘ÈÈH蔕•ݸqÃÇÇgíÚµ¸æÆñ0’KAAAÊÊÊcÆŒA©¨¨Œ;öÎ;‘‘‘øÐgœ@ mll=|øð64\»víÉ“'‰'< 3fŒ––ÁúGŽinnÞ±c‡¨Û¾}{¯^½Bòòò®®®|ë RY,Vhh¨––{’.""âêÕ«æææªªª¡¬¬¬!C†pµrISS“L&GGGó=ÿ°  @[[ûÅ‹EEE¥¥¥ááᇚ3gN=„\"òƒ æ Ð@¼t™ÂÂBâ©Øêëë)ÊôéÓ Ög0þþþx‡AW®\¹uë–¨£ÑhñññáááhC: ^Ç/**²´´422²³³»}û¶ŠŠJll¬‰‰Éüù󭬬¶mÛvÿþý0Œ÷ïßçää$%%ºäãã³~ýz{{ûñãÇKIIäää¬X±bÙ²e¡»wï:t(66VOOF£½{÷NII Ÿ(ä]:€ŸâÚµkm؆ݭ[·²²2âZ Ã××WGG‡ø#rrrÚ0`&++›••UYY‰:h¼ OW¥§§3 ;;»¼ ììÙ³óçÏ>tèPbbbRR’ŒŒŒŽŽÎÆñ‹ K3fÌ••=}útdd$™Lîß¿¿ ;‘»ºººªªê³gÏ?~¬¤¤daa±aÃ<ö#ä]:€ŽÇd2)J6ÉïÝ»×ÁÁx.O99¹U«V¬Ì`0‚‚‚6nÜ(j¯nݺ¥££Ã> ºµ×f´ððpίJJJ;wîܹs'oC!—ìììíV›1cÆŒ3D½@ ñÃã1”““3iÒ$Q[1™Ì   ’’‚õkkkEZSž––&j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢?4HÔVŸ>}Ò××·µµ%X?22R¤]]mئ¤¤tðàA<ÈÄK×tìííEm¥®®ž’’B¼þ’%KDzŠ™™™¨]ª¨¨PSSsrrÂ_»ÌRqþ;ஈ—®èTUUµaØcõêÕwïÞ%X™J¥JIIihh¬?}út®”­b±XK–,arƒºÐqŽüw@ €xé޳³ó«W¯Z­F£Ñ¶lÙrûöíºº:*•zåÊI±wïÞãǬœššZ]]ݯ_?‚õ±ªª*EEEνî0¢€Ä©+Ä - þ¾C,«´´”È–oYYÙÄÄÄׯ_/]ºtàÀººº_¿~­¬¬TSSkµíõë×ccc viäÈ‘W®\uIMM-**гFt8ðïÄ Þ’Ý†hĉD*--•““#RÙÊÊÊÍÍ­¡¡!,,lùò剉‰cÆŒ177_½zµð_BnnîàÁƒ‰<¢¼¼œÁ`ˆº8zß¾}oÞ¼á*ì¹åøO@ñ"--Âi%Tmm-N'XyĈOž<¡P(fffk×®½qãÆ‡¨TêðáÃ…ÄñññĽüüü.\¸@°2VXXxþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐÐòòò½{÷©leeuìØ1öWƒ1{ölggç¥K— jòùóç•+WæääÉpÎd2ËËËÝÝ݉t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]Ý/_¾TUUõíÛ!äëëK"‘öìÙ#¤IMMÍÒ¥K‰D9! …Âuq«^¼xallÌ7}7©Â#¾”””¬­­ïÝ»'ÒÁ¯çèèç!ýG@ €xÁ/QâS?bhݺuÄ+“ÉdKK˧OŸ:;;=zôÑ£GñññÂWûêéémÛ¶ÈÍkjj"""¼½½‰÷§®®nÁ‚‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@B¥§§[ZZ¯oii™’’"++{àÀ„„áC5oß¾-++›2e ‘;Šú¯ö¯_¿zxxðr@ n Ð@¼Hz SSS3wîÜ>oÒ³gÏK—.]¸p!22RSSSxå .ôìÙ“` óÛo¿)**ï BHKKkóæÍ‚®655!„n(ˆØu€xÁ/QüB•D555#FŒ©‰Meee`` ……E«•çÍ›Gpe1“ÉÔÖÖ&r$Æb±fÍšUPP ¤@q0 è ^ðKTr]]ݰ°0‘š 0àüùóÎÎÎD*›˜˜ôïß¿Õj †††Ä»ñàÁƒÚÚZáÇíÀˆÄ‹ŒŒ …Binn–ÐÑóòò¨T*ñúT*uâÄ‰ŽŽŽ­Öd0FFFD2K „RSS­¬¬äåå‰÷dâĉÂÓ;444 „Dº- sA €ØQPP@?Þ©gûöí="^ÿáǼÇÕðuíÚµÊÊJ‚§!Ož<988˜x7¢¢¢šššúôé#¼Ñ@ b¿G%4Ðéß¿ÿСC‰×Ÿ4iÒîÝ» Ö-..&2ÃÅ®?iÒ$‚QB¨¾¾ tBªªªGŽ!xCðë]:ˆnݺ¡ïTÉ2uêTâ•™L&™Lnu£BèÉ“'úúúD6g<›:u*ÁC–1}Œ# v$7йsçñ£333mmm[­Æb±æÌ™såÊ"÷ܽ{7ñá??¿ÆÆFá D¹à? þ$:ˆ tX,ÖŠ+ˆç]ÏÏÏ=zt«ÕJKK¥¥¥—-[Öjͯ_¿:Tø‰l‘‘‘Ïž=5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÄ ˆnnn,«Õj (..nµZaa¡Í»wïŽÐLž<ÙÀÀ@¤áFt;ÊÊÊ¡oß¾uvGD£¨¨H|¿UCCCCCC«ë‹ ÆìÙ³‰¤¬zõêÕòåË .ÕÕÕ½zõ6l¡¾þÀb±ðÿÄŽ„:YYYÂSsJJJòððà{éÏ?ÿ¼pá;9vìØ³gψ¤\˜>}úüAäѹ¹¹#FŒhnn&ØU¶ïß¿3 EEEiiiQÛ: :ˆ://ïÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬ß-]---[¶lÑÐÐhõ¹ sçÎ%²š¯ t¦L™¢óñ !”maaçõØFÕþ.ÐUA €ØÁ'ãIÖÔUCCC||<ÁÊ·nÝ tÊ.} IDATµÿþ¥¥¥ì¯ýúõ8p ´´txx8ïnð3gÎÔ××/]º”ÈsTUU‰œ°ÌW:^^^žžžøàÁ«W¯oXUUU[[Ëè@Æ „€@±Ó£G2™\[[Ëd2;»/Dåååíß¿Ÿ`åÞ½{ ™?â tNŸ>íçç3|øp®šµµµýõ×;w>wóæÍ»ví"X™WMM ú†¶Óœ9sf̘A¥Rmll’’’Ø£wzzz:::xG½¯¯/õ)++CÙÙÙ­\¹!4aÂ!C†;vŒ}ÏC‡9ÒÀÀ`þüùyyyìò””}}}KKË 6”——ãò‰'êèè,_¾ÜÄÄdèСsçÎÍÍÍmÿ€¸@±C¡PzôèÑÒÒ"Aƒ: ®®®+Ϙ1CHâ…þýûã÷:B( àöíÛººº¼5edddee­¬¬ˆ<ôÅ‹rrr***;É :½{÷nó8…„„(((øûû“ÉäëׯãB ÎÓ¢9³jxzz⯠,ðòòòòòâLtoff6oÞ¼>,_¾GÉ K—.mnnvwwŸ}úÔÙ!ÊÃÃC[[›HÍV·577ëëëoݺ1âëëKäåýîÝ»ß~ûíñãÇDúÆN÷î¡¡!ÎD1zôhA•¥¥¥[Í*züøñ¢¢"KKK###;;;>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òòò„ß-99ÙÅÅ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUzzú?ÿüƒ )((hll<{ö,BÈÐÐpÇŽ999.\xùò%^…™™‰Ûoܸ1??ÿÒ¥Kùùù³fÍòòòJMME…††Þ½{799ÿ†£££B3fÌ8qâD="###""***llllllBiii¡Ë—/ß½{÷ãlj‰‰¡ÈÈÈvþtˆÑ@á¸WUUuvGÉÎή®®ž¬¬¬$è,]º´Õ:­Þ'==]JJ ÿŠ„ Ñh>äÜ­-ª‚‚mmí½{÷"„ÊËËY,VïÞ½[™ˆtG’èXZZ\kll,¼Bhh¨‘‘‘ðjNNNêêê­Î”íÙ³§¦¦¦ÍNyy¹ƒƒC\\ÜàÁƒB•••!¾Ýâ þi€8Â/T|p‹ø1b>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòå‚‚‚qãÆµú¸AƒíÛ·¯Õj‚TTTüþûï8ÊA?þè q Ð@©ªªJII}þüŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ%K–Ù.\SS“……{)Ì­[·vî܉ª¯¯oÛ Ä…BéÓ§OKK‹øÏ^UWWÇÄÄHKK·ZóèÑ£B2? „(ÊòåË…T`2™d2yÁ‚ÂsBµÍåË—ñ9Ål/_¾ÄéÖÛsä  S@ €˜êׯBèãÇÝ‘VHIImÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÈȶzôðÙ³g¹"âX,Vpp0¿ac‡›íYÚ èè ¦ú÷ïbçš[={ö\²dI«ÕöìÙsõêU!âââŒ) gáÖ­[çÏŸÿèÑ#„ÞB%%ÕúŠèèhá)&„ ‘H=ÒÑÑá,dhÄN³è ¦$%Ð eg'Drr²ðl‘...\…òòò²²²+V¬?~üºu넯SFåç秦¦ †x1ŒÙ³gçææò^bè@ÂK$:ˆ)œmQxþHqS]]ÝjµÄÄD+++AW¿}ûÖÒÒ»§IAAÁÒÒ²¬¬ìÀZZZ?~ üòå‹ ûlܸ1;;›xç9á“‚ñIÄ\p C"‘pô pŽb ”••uvGZáã㣯¯/¼N]]ð P§Njhhð÷÷ç*WRRúþý;‰DÂÇû¾~ýúðáæ¦¦sæÌ à=»ÏÁÁ¡Í«sFmiiÉ5w†jiiÁ‘\ïÞ½åääZ½•JÅÙ¦€xÊÎÎnÛ˜PðÇ@Lá@GüGtˆi³eË–#F¸»» ªPWWÇw/•¢¢"ço`ذaæææ±±±3gÎäŠreee…oÚ¤  àÔ©S‡–‘‘á½ZSSƒ—H™·RRR²¶¶¾wï^º~™Ñ£GwvÀ¯b 'r*))éìŽSPPçãã#¼ZNNκuë„Tt²Ÿ¢¢"{ãUss³ÏãÇ´´´8«åååM:uÁ‚8]ƒ¨œ·lÙ"è*{%2‘ÔZ}ûö½|ùrúøI Ð@L©¨¨())}ûö­¶¶¶GÝþrrrþý÷ßV«Ý¿_HЍèèhEEEÞKŠŠŠT*!ôùóçÙ³g+**&$$ðîQ?~ü¸¼¼¼ðXJˆ¤¤$![ÖE tâ# ¾ð›µ¸¸¸³;"……ŪU«„×ùðáƒLXõõõk×®mjjâ{UAA¡®®îÕ«WVVVæææ!!!|Oâ9~üxNNN«çëðúçŸJJJ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜••5räÈ­[·nß¾wXˆÉd®ZµêÁƒmX^úâÅ‹C‡q®ËinnNIIÉËËûúõ+»=¢’¦®_øÍúáÇÎîˆ@«V­Ú¶m›ººº:………ãÇtU]]ÝÏÏOÐU))©o߾ݼyÓÒÒ’o…¿ÿþ;**JÈ2g!Œ¯]»Æ¹§]ZZzÛ¶m999!YYYUUUUUÕšš|5##£±±±oß¾}ûöUUUm5}:@Àˆâ ¿ƒ¯_¿ÞÙáÅbEGGwëÖMxµŒŒ eee¾— CCC…´ÕÖÖ~÷î (!deeõÏ?ÿÉΩ¹¹ùĉ eذa\—.\ˆ?Ðh´ÒÒÒÌÌÌ¢¢"\²oß>wwwccc555'''‘ è0¢€øÂ޲³³oݺ%†¯Õ–––“'O I_…zúô© ÅÔW®\´:!”ŸŸ_SS3bÄAJJJLLLøî nÍš5‚Ò­»¸¸lß¾N§¿}ûVJJª’CEEEeeeNNNQQ‘””Ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸P(”™3g ¯³eË–ýû÷ V<<<„¬S ÔÕÕÔ677wâĉ»wïnÃ ŽŽŽ666|/õìÙÓÑÑ1***,,lûöíƒ â¼Êd2GŽYTT´|ùrcccQŸ øõ`ê ñ•••…277§R©îîîß¾}ëìý®^½.¤BKKK¯^½„L}ú¦M›&L˜ jŸ×¯_ßêÊe2™ìææ¶wïÞþù‡3ÐY½zu]]Ý´iÓìííµ­ªªZ½zõĉEíø•þý÷ߣGÚÙÙuvGÀ¯bêáÇ¡I“&!„´´´"""¦N8|øp1Y˜,<÷‹Åú믿²#++ûòåKA‹”#""lmm]=z4##£ÕL¢\>~üد_¿ß~ûHå 8p ::úË—/½zõBݺuëúõëJJJÞVUUõÈ‘#"õ übmˉ$”¸Œ¸|ðððà;3E§Ó-Z”››Ë.yòäÉðá÷mÛöíÛ·çÏŸÏœ9óåË—ÄûÙÐЀÚ±c‡ŽŽñV!;;»Þ½{¿|ùòìÙ³G¥P(AAA"­}ˆtGxÞ /Ðá$//ãÆÞ½{ã…Éѵÿ#''ghh(è*F t– ­­­ íÙÕÕÕ¶¶¶œw®««Û¼y3N·¶¶Þµk×Ô©S…lÔâÒÒÒ²dÉ’ˆˆ‚õ9ÉÈÈÌ;!äååÅ`0–/_>|øð6Üй Ð@áÎ@çÇáááëÖ­[°`A}}=B(00ðÖ­[ÕÃU«V={öLÐÕ–––={ötïÞ÷Rvvvaa¡ †ýû÷ â,¡R©C† NHH “ÉÅÅÅx™6EEE cöìÙësÁ³W---***pp v] vÞ¿_QQѽ{÷²²²7n¤¥¥¥¦¦²SK"„H$Ò!C,,,:qö*##ÃÇÇGÐUyyyvÒ(.AAAãÆüþýû7nÜøý÷߇êïïÏ÷&œÕú#ÀСCeddètú–-[„gºˆ-t;x8§®®Žëœ=== SSSAi2™¸¸8¾6ØÂ… :Äwc”¾¾¾««+ßVû÷ïß°aWa]]烦M›–þæÍ!Naa¡««kZZZ{ÎW¬­­¥Óé EÔó—âÄžš‘““366677ïÓ§Ï_ý…ÒÓÓã: >]†¯êêêÇ«¨¨ð½ºiÓ&A ½¼¼xÏ⫯¯gGuÏŸ?_¼x±¦¦fZZšðíåÞÞÞí}šo„”žž.è†T*uþüùk×® QUUÞ±¯_¿:t¨ÕEʽzõ !dddÔ!wã2gΜ3fP©T›¤¤¤/_¾àòˆˆ===ââb„¯¯/õ)++CÙÙÙáŒî&LÐÑÑ2dçiF‡9r¤ÁüùóóòòØåñññ:ÿ?Xuþ; Ð@°»ËÈÈèÜž`RRR‚–à¼}ûVJJŠ7¹7‹ÅRPP;v,ßVË—/ç{èpUU•­­í³gÏ„g2Çòòòž|ø°|ùr&“‰Ëñ„ n‚£À#Fü¤ q‹‘VVV!YYY1ÑÑÖÖÎÎÎæfBúúú×®]ã-OLL¼yóæÉ“'y/EFF:::*((p•766ÚÚÚ&$$´:ƒª®®¶±±9{ö,g”Ðoß¾¥ÑhQQQ4~èt:o!•Jmll$rÿººº›7oÚÚÚöîÝ{̘1‘‘‘8ÔÓÖÖž>}z\\®6iÒ$&“™€¿º¸¸(++'$$,_¾œ7©jPPдiÓB†††›6mªªªÂ™¹ŒgÏžýçŸÆÅÅ㈧C~Kˆ?txý …Bqppèì¾ êêj‰Ä7ÊAÑh´ò–GGGó]0ûñãÇÍ›7O™2…7ÐÉÍÍ5j”šš‘^íÛ·oÀ€666D*ñâÅ „P÷îÝW¯^-RÃ>}ú©ÕØØƒK233ÍÍÍEí''ö,þe677ã¯êêêxøðá¦M›lll„$L ë@ УG--­ââbÎyŠÎÒ§OŸ¬¬,¾—ššš† òþý{ÞµÀ§N¢Óé¼M˜Læ¶mÛzöìÉ{ÉÌÌìï¿ÿ&Ò¥ÊÊJ__ßþýûwà>pœQËÌÌÌÜÜ\VVVFFFNNNVV–ýYFFF–.¬ªªÚ¼ys«7g±X¡¡¡ZZZ죒"""®^½Êè°s­Óh4¾wéÇÉÌÌôññ155 jnn~òä o‚º$t Ç/..ÎÊÊ:thçö¤¥¥EÐ1Á¹¹¹ÆÆÆ¼QÎû÷ïµµµùî„ÒÔÔä»0Ö××wûöíDFG‚ƒƒ8ðîÝ»ŽÊ¸YYYyãÆ ÌÍ™3gܸqÄÛ9¼çøñãEEE–––FFFvvv·oßVQQ‰511™?¾ºº:ú1FõîÝ;œj#;;ÏUá­õ[¶lÑ×ׯ¨¨HKKsrrÂÁÐùóç.\Èd2oß¾ºy󦯯/B¨¨¨hÙ²e:::ÇŽ+--}úô)‘9A$,F@2àÙ«çÏŸwvGжmÛ.^¼È÷’©©)ßô[žžž8M)—cÇŽ%%%ñ–ÇÇǧ§§ó݈Îåëׯ{÷î]»vmGE9ÍÍÍ£F’••ÍÉÉ!‘H&&&r[.xº*==ýŸþA…„„466ž={!dhh¸cÇŽœœœ .¼|ùRWWql¸366Þ¸qc~~þ¥K—òóógÍšåå啚šŠ ½{÷nrr2^Ó›¼}ûoG ;sæLll,Bˆï]Œè p #‹‘?|ø0a¾—222,,,¸ ›ššH$ïÉ:ÍÍÍÇŽc/³å4yòäJKK ï FëÖ­Û¡C‡ˆìÉ"‚Á`HKK?}ú´ªªŠF£éèèIsÑ\á]xx8W……  J†Âû­„ÜpÅŠœ_íììÞ¿߯¾ á`DÉ`jjJ"‘^½zÕéÿ 㻼£ªªÊÕÕ•½¥™MNNîþýû¼:ÒÒÒÉÉÉÚÚÚ\åéééÒÒÒDfèæÍ›wöìÙŽŠrNŸ>'ÑÔÔÔp@ÙÎ¥Áq’AIIièСt:=;;»»Ád2Y,ßô¥¥¥ööö\SHL&3 €·rKKKUUÕ€¸Ê?|ø0oÞ<öéyB„„„¼ýé6¿ÿ>qâݰ0ÎÂ/_¾ÈËË6¬÷t:t–––èÇ`Cg±µµ=þ|˜³0==Åb™šš¶º þ Ð@bèêê*++———ãüŽ¢²²’ï¡|t:w—Phh(ßy«Í›7744pž;wNCCƒ7|),,¼yóæ¤I“p–J*•ª¯¯Ï>M¸Í^¾|¹wï^‰´bÅ ®ŸŸ[ƒÇÏ’$‰D¹ñ›¸SÌ;—ï±Èæææ¼©þþûoÞãm?~œ””$''ÇU¾bÅŠC‡ñÞ9++ËÁÁaÛ¶mÓ¦MÛºuë“'O._¾Ì÷ìAâh4š‹‹‹ Ä–xrÒ^Ð5@ €$9r$BŸ×)JJJ† ÂUH§Ó/]ºÄ[yíÚµ£Gæ*ÔÕÕ=|ø0×nóK—.‘H$¾k_¼xaaa±hÑ¢{÷îݸq#22’©m¾|ù"++ûòåK¾›äi4ÚóçÏÉd2:t è Ip óôéÓÎê@QQo:ÏG]½z•«°¥¥ÅÅÅ…kVˆÅb©ªªr­Î‰?yò¤ ðååË—x÷ÓðáÃ_¿~M£ÑfΜYUUÕ†Î3™Ì?þøcÆ èGÚK^ÏŸ?§Ñh?é¨@À/'# ILLLäååóòò>þÜ»wï_üôÚÚZyyyÞi#UUÕeË–q–Ðétccã/^ÈËËs–{zz.Y²„ë”ä>}úò]\ÜÒÒòòåKöÁ}={ö¼uëÖ‚ ÆéÒ%+++‘úßÔÔT[[{ìØ1!užzôè×:L&ÓÐЫ°²²211qÑ¢Eœ…#GŽäÌRRRzùò%gôSTTäè蘓“#(ãwVVƒð&©û÷ï{zzfdd°C"¾}ûfmm½~ýúÉ“' ¯I§ÓŸ={F"‘Ú<¢Ó·oßË—/·­-àg€@ ƒø&ÿÙøžeœœœüàÁÎ@Ïpqí«ª®®&“É***œ…gÏž]¾|¹ (!ôâÅ GGǬ¬,opó6 IDAToïÀÀ@ÞB­RVV>}ú´ D¤œ222ð_?-øI Ð@ÂXXX(**æåå}úô©ý D’žžnaaÁµ¾xĈºººœ%!!!yyyÇç,<~üxssó¾}û8 wïÞ-d ƒÁ¸qㆌŒÌºuëÎ;׆-å·nÝJMMÝ»w/‘(!”’’‚”ã ‰`׆B¡Œ5ŠÅbñ=‹ïç©­­={6oùàÁƒysB¹»»s•HII­[·Žýµ¹¹y×®]!!§Ÿ={¶gÏž™™™‹/nC”ÓÐаsçN777âMð¯tüøñ¢> ¶ Ð@òàñ‰üʇÖÔÔŒ5Šk8çÕ«WGŽáªéããÃ{¬ðöíÛ9ÇŸ?|ø ü‰Ë—/‹‹ã›)]8‹U^^®  ðï¿ÿÏWU__Ÿ™™)--Í{ö@rA €äÁÎýû÷Y,Ö/{¨¶¶vxx8Wá½{÷¸vêFDDTWWs–àcˆ[ZZ8 ÷ìÙ#èYÅÅÅ.\ “ÉÊÊÊ¢ö³¡¡aþüùDñžË,ÄãÇ›››ÍÍÍ»uë&êCb $¾¾¾ššZEEÅÛ·oÙCß¾}[WWÇU¸hÑ"///öW¶uëVÆYçòåËrrrœ+Žëëëuuuû÷ïÏ÷A ÃÉÉIÐ~­¢P(:::|³I—””„š8qbÛž O°¹ ÊÈÈ8zôhg÷´¢_¿~¼ÒD"‘&MštåÊ•¤¤$}}ýŽí˜ þþþóæÍãÚÓÞ«W/μ MMM+W®ÔÐÐà¬ãææÆ™l!11ñðáà ‚$%%bll,j?~ü˜––æìì¼{÷nQÛ"„’““BS¦LiC[€Ø‚@§ *+++++[¼xqgwôñãÇ›7o¶çS¦L¹råÊÝ»wùnùþ444 8KîÝ»÷ôéÓíÛ·³K”••ׯ_ÏY‡J¥*)) <˜]rûöm???AO‰ŒŒtrrjC”óýû÷Q£F>|XÔ†XAAÁ‡zöìibbÒ¶;Ä:]S¿~ý¦M›ÖÙ½½}û¶Îĉ)ʳgÏh4Z;SyÄ;þ”œœÌ¹¾¸ººz÷îÝœ£‰,kêÔ©gΜá}Z[[;tèPmmí¹!@¬@ €³¶¶îÓ§OAAÁ›7o~ÞSÇ׳gOvÉ… 8ÏIII‘‘‘a-))áœÕBEGGó]FSQQáíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===âââÎîNç P(èÇÛú'‘——¿|ù2g ƒÁ`ïÄ.//_²d gÚ‡Ó§O;::âÏ÷îÝãjËÖÔÔdbb"äÀÜœœû÷ïoذ!--mëÖ­Ÿ?ÎÌÌäL:ÑN,ëöíÛ¡_°s Ð) ÐâîÉ“'óçÏ6l˜‘‘Ñœ9sf̘W­{yyÙØØtv;ÙÌ™3BÑÑÑ?ï/_¾ÌÏÏç,ùã?pbQ„PEEÅ’%K8WØøûûãy%‹µnÝ:¾9­®^½êææ&ü¹/^\¼x±••UHHÈœ9s"""ºuëÆ9°Ô~©©©Ÿ>}8p`ÎbH8Gˆµ›7o®_¿^MMmÖ¬YÍÍÍ>¬®®ÖÔÔDihhüþûïñññwïÞíìnv¦qãÆõêÕ+///77÷'å½ ÓÒÒ2dþZPP ¤¤Ä>ÖÏ‚]9++ËÄĤ{÷î!‰”˜˜Èµv;qâÄ™3g„<”F£………¥¦¦"„lmmƒ‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÜÜ<11ÑßßÿþýIII½zõj5ãAJJŠ‹‹‹¾¾¾¥¥å† ÊËËÙ—RSS/^laa¡§§çääôìÙ3\>qâDåË—›˜˜ :tîܹ¹¹¹øRDDž#Ãd¾¾¾x¾¬¬¬ÌÑÑ^´hѰaÃ,,,Ž9Âb±~Îïƒ?2™Œ§]®_¿þ“adddeeÅþzæÌ™ˆˆüùÕ«W™™™ìKõõõ...?~D•——×ÔÔðF9ø÷“’’"<,‹‰‰155e/^ºté¢E‹,XÀµù«=˜LfLL BÈÙÙ¹£îÙsæÌÁºººBJQ::@|=þ¼®®nÍš5òòò¸DAAáÂ… 6lÒ*!!aéÒ¥ÍÍÍîîî“'ONNN^°`Á÷ïßñÕ/^<þ|øðá‹-b±XÞÞÞÍÍÍ¡ñãÇ#„RRR&L˜àææöñãGOOO&“‰²°°àÌ àììŒOêC­X±oðNKKstt411iu âg˜5kBèÚµk?éþnnnœ'4ˆ=cxæÌ™§OŸ²/•””Ìš5«_¿~¡Í›7_¸pëV---óçÏÏÎÎnõ¡çÏŸ÷ööæ,quu-**Z¶lþ»´ß£Gª««utt:wÞjÅŠ³gÏF­\¹ ‘HS¦LÑÑÑ122“†ø«¡¡áëׯ…‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÆŒ‘‘‘QQQ;vlyyydd$¾êíí}ýúu+++YYYƒºººêêj„ÐèÑ£BçÏŸ?räÈŸþ¹qãÆªªªŠŠ „¶¶öôéÓÙ÷Ÿ4i{¦ÃÉÉiÆŒ¡uëÖœ={ÖÎÎ.88˜à›¸¨¨¨¤¤¤¬¬ìãÇ•••Ÿ>}ª®®®©©ùúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4zôh55µ¢¢¢çÏŸy®H¹¶¯¯\¹’=3kÖ,WWWö¥aÆ „X,V=xÏAÎÌÌlhhàÊ‚ÎëÍ›7xÀ¬¨¨èܹs ,PSSsrrrttœ={6ŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯÖÖÖø¿ÿ1cÆ „F¥¡¡!$¼åðßkt€øÂ)¬ëêêDjUTTÄ`0¸†UJKKñ‡˜˜˜M›6q"œGÒáÕ?!<;F|ä€=Â1uêÔøøøššδނ´m4…B!“Éd2™D"‘À›ž®^½Ú!'sz÷îÝþýûÙ»¨ž>}ª¢¢ÂÞΙ½òæÍ›xU/‹Å"‘HÇç½›¥¥eTTûAvìØ!--­§§÷ýû÷qãÆ7nóæÍœù%Ú¯©© oU›3gNÞV$ÆÆÆœ¡aÆás®½½½ãââ>~üˆ‡3¿|ù"//¿ÿ~eee'''99¹øøøuëÖáãª}||‚ƒƒ—-[ÆŽòB8Ê¿sçNddäâÅ‹;áÇ@<@ Ä—©©©¼¼ü©S§Ž?Î~5îØ±£gÏžk×®ÔJSS“L&GGG³'¼8íÛ·oèС‡8pàÕ«WwìØA¼?ìÎ­ÔØ³gÏðj’´´4YYY‚)“Øòÿc±X-ü°X,&“Éþ (»~ýº¿¿?û˜¾¡¨¨È>à!tæÌ{{{èxyymÙ²EKK !Äd2wíÚ…÷ ìß¿ÿ¼yó8ïSTT´~ýú¨¨¨V»÷éÓ§ÿýwÙ²e...zzz?)¿t\\\}}½††FBBã&“ÉþÜÒÒÒ†Ï ÒÃU«VùøøÄÆÆ'$$,Z´ˆ+ã)ox-<Êà¿  ¾”••wìØáççgcc3fÌ99¹ÌÌÌììlw››ºº:ÞÉlÁ“eûöí0`À»wïðæììlöÖÿW¯^ÕÕÕ%$$xxxpžž'Ä‹/ÚðkÁoTdkk›ŸŸŸœœÌ^BÔ!ðröWGGG<ŠSRR’œœ|ìØ1\Îb±Ö¬YcmmÝÜÜ|úôéääd®ûÌš5«Õ³ŒY,V]]ªªj~~>Áßa›………!„ÊÊʶnÝÚ±wîÓ§O‡ÜgêÔ©ÚÚÚÇ777§P(ø?`N¼áµð(€ÿ&t€XsqqQWW¾yó&N×ÐÐðòòZµjBèÿû_II ®†_Z–––3fÌ••=}útdd$™Lîß¿¿ ûß¾GŽÙºuë… dee ——’žžŽó\¾|YUUuÊ”)8ùQdd$t wìØñ÷ß'''+**êêêæææfffâÃúBNNNwïÞe2™K–,ùã?~êï„B¡ðMðäîî¾cÇŽÐÐÐŽ tÂÃÃÇŽË> ‡ßJCCãÊ•+xŽÅbIII-Z´!$--ýêÕ+Þqwîܾ¸ª¾¾ÞÃÃÃÜÜ|ëÖ­?;Ê)--½{÷.™L^´h‘‚‚‚Ô …ý™L&·ásEEÅÆ‰÷äÛ·o!!!ø`ëàà`}}ýùóçãK$ÉÛÛ{ýúõnnn¼“¡¼áµð(€ÿ&t€¸=z4^)Ì…wÌ€ÍÎίÖäeff×êCsrr¸J.\¸páBAõ׬YsðàÁVoûS¹ººúûûÇÅÅ}ýúµOÕ;qâ„t"##uttLMMñ*vÏäääóçχ„„¤¦¦öíÛwðàÁœw¸téÒ˜1c¸ yÑéô!C†øùùuTÏù>"00/HG9::uì#äååÉd6yäææž8q/¯¾råÊÀÙBhÚ´iüüù3ßàyÃkáQ>ÿM°ë €¶»sç>ˆåÿûŸÌ”¿Fß¾}'OžÌ`0ÂÃÃ;ð¶ì£Ï;W[[‹zúô)ç!{3gΤÑh¾¾¾x2‘-''gÏž=ÂGhÊÊÊž~ûí·±cÇ"„îÝ»Ç9fìììL"‘¼¼¼¸Ž¼6lصkׄœó[TT4vìX*•Ú}æD¥R>¼wï^„Б#GBCC‹‹‹ ÔÔÔ&Ožü“Ú~W¯^=xð Þ!H¡P8—Ÿ‹Ux €øƒ©+ÚŽëßßÎÎήOŸ>yyy©©©#GŽlÿ srr***Øç%²wbïØ±ƒN§ãÏ7nÜprrjhhèÞ½;çZƒqêÔ©Õ«W y„––VLLÌÏ8²F£ÉÊÊVUU½zõ o¯Ã¾ð1†‹-ú©£GítæÌvªÚ„„„Í›7+))á¯AAAEEE¡°°0}}}!¹ßFtèJ(Ї‡BèüùórÃGÝ¿ø÷ßBoÞ¼¡Ñhx6*//oóæÍ ÃÇÇçÊ•+œm7nܘ‘‘!èC‹µoß¾£G’H¤ŸåìܹSWW·±±Q[[ûüùóìé›ÏŸ?ߺu‹D"‰Ã¼•IIIìù¬ôôtv”ƒºwï.÷î×~/tèR<<|øó„žÑÐЀ“ 4(++‹w—uhh(F›:u*dÍà?º {{{†×Û¶“¥¥å¨Q£ðçíÛ·àLììFFF .TTT|üø1{Kynn.F³µµå›~•N§úôI[[;..®£ŽœÁâââ´µµñVmÞ­gL&óܹs!OOÏ|.@œA @WƒÊœ;wŽÁ`´óV6l`³zQ(”;wîà=>û÷ïÏÊʺpáç’ØššWWWvZx.•••ãÆ‹ŠŠBuÔ‘ÇÅÅÅ®®®æææEEEBvSÇÇÇ—””hkksf®tmèÐÕŒ?^OO¯¼¼üÖ­[í¹Ïׯ_¯]»†Ge<==ÓÒÒX,ÖæÍ›ñ²›/_¾S(œ• c±X¾¾¾8}!´lÙ2q^† èXð¿vº‰„s=ž}z;£œÚÚÚ3gÎ „6nÜØžû$:te¿ÿþ»””TXXXYY™H _½z•žžŽruuÍÍ͵°°À9%ôôô<ˆÏ×)--µ²²â=–PCCãäɓėžž~øðᨨ(vÒ†Áƒ;::¶?i×±cǧL™Ò΀ ¡ Р+uê‰DòóókóM º¸M›6ÉÈÈDDDoÕ¯_?kkë=z¤¦¦:411!4}úôÅ‹㬙¡€€ÎÝÚ¯_¿Þ»w¯¨©ÈcbbÌÌÌššš¼½½544úôéÓ­[7‰$%%ennþéÓ'¼ð¹mq O33³6ß Ñ Ð ‹ÓÒÒZ¸paKKËŽ;ˆ·òññ)++»wïÞçÏŸ«ªªÈdryyùû÷ïýüü´´´.^¼xïÞ=öºœ––6lذääd|ÐN«h4ZVVBHIIéåË—ïß¿/((()))//¯ªªúúõkUUUqqqii)ÞâÞ¥¥¥ÁÁÁd2ùÿ±wæñPµÿÿ¿fßJIÆVI*¥=©´ˆh£[ÚCE¥¢¢Å­R”´IÑ¢RZ•´ÙJ m’²•Ý0ûœß×÷žŸeŒmBçùèÑãÌ9×¹®ë˜™3¯s½·]»vµ­”*tPPz>®®®4-** ºÝ´‚ ÷ïß§P(kÖ¬¹~ý:LÓ¯_¿øøx;;»êêêýû÷«««ÃÆ•••æææ0ÔHFFFœþsrrÔÔÔàd¦M›Ö·o߯mp8‰D¢ÑhT*UÌËlÀþýûù|þÂ… ‡Ú¶PPPzhx9 JÏGQQqÆ >>>nnn?n1}‚ 'Ožäóù&&&JJJ+V¬ÈÏÏ·±±¹uë@FF&))IAA6.++:tèªU«ZœFUU•§§§––Vrr²°BVg““=¦%¿œÃ`0 ¥¥‹cii‰¦Òù@…N¤¸¸xÆ z(-sûöm‰ÝgaN7oÞܹsf7‹7o 00î133c±X}úôÙ²e‹——T9iii***t:ÝÛÛ[œ9Ìœ9ÓÈȈÉdJIIuªÊlÙ²E ØÛÛ·!P;)))Ù¸qãÔ©S%<.J«ˆŠŠ²°°@…Îß*tz µµµïß¿¦ÏGéšØÛÛ#"±û,FÛ½{·££ãŽ;æÌ™#Útûöm6›Í`0ˆDâ”)SÔÕÕÁ½{÷¼¼¼  kNffæüùó¯\¹¢¨¨(¢«‚‚‚Ç5ÊÖÖ611±q%¬Î ,,,))I^^þOåÎQTT„YˆPº,<øÓS@‘¨Ðé™Ðh4ccã?= QHþQòŸþ øðáÃáÇE;&¿~ýºoß¾~~~4mâĉçλsç™L^±b…¢¢"+:::ááá"b¬jkki4Úû÷ïûôécnnŒÊár¹°Äº‡‡Z¨¥cA¤®®ŽF£Á—L&S P©Ô®¼6† ”¿ sâĉ3fœ8qâŸþQésóæÍ¥¥¥\.WJJ*77wïÞ½£F’••4h‚ îîîFFF3fÌhNåÔÕÕ999%$$äääÌœ9sæÌ™vMMàééYXX8lØ0IŽ‹‚Òãå{ß¿Ÿžž^VVÆãñÆ7a ÃåráOϱ Ш+”¿ˆ‘#GÂPó7ЍÞܯ_?===WW×õë׿xñÂÐÐpõêÕoß¾¤¥¥½{÷ÎÀÀ ÉÿþÍ`0¨Tªžž^zzzg]Fó|ùòåìÙ³8îĉ]ù¥ÛQWWG&“÷îÝ;nÜ8{{{77·={ö̘1ƒF£Íš5+..Ç#Âd2ÿôL‚ ”¿ >}ú$''‡„„4>Z\\\\\<~üx;;»±cÇÖÕÕmܸñèÑ£;vì˜6mŸÏ9räýû÷åääŸ0zôèüü|À¦M›H$R§_Ìÿ‚ ˆ—Ë]³f¾¾¾„GGAéÁðù|*•jooïééÙà AGÍš5KWW7((¨ >` BåïBVVIŒÉ IDAT¹¸¸ ÷ÇÅÅíÝ»wöìÙ£GþòåKTTN×ÓÓKMMUSS344411‰‹‹àp¸ú¾xñ"440{öìÜÜ\ Toÿ´´´¾}û¶*5" J‹`±ØG‰h“••eooßË­ Bå¯ÃÒÒrÊ”)l6»¾+++ëĉyyy ƒËåÖÕÕÅÆÆVWWoÚ´©²²Ç;995®`•““ãääÔ»wo€šššdÜ›¤  àÀ€“'O +ƒ¢  t æõë×¢X[[¿~ýÚÏÏOX®®‹Ðw¥ºº:á6‚ £«]$ J{÷îséÒ%¸ÇÔÔ´A6›Íår+**âããUTT–-[&<kbbRUU¥££“––&awãÆ bkkËb±lll¦M›ög'ƒ‚Ò#©©©qÔ××744TGGG ‹Ã4¦®®Ž×Vø|>ŸÏoÃÌÛu… @¸|ùraaáïß¿555GŽ9bÄð_pi;ûGAAé ýýý—,Yâêê:iÒ$:>hÐ mmí?6hÉãñ‚ƒƒgÏžÃá©­­•’’ŠÝ¼y3,øÐÎU‡#â¶(&û÷ïOKKëß¿ÿ¡C‡ÚÙ J“ˆ:rrrÎÎÎ> h² ÇÃãñß¿OJJjíÐ$iáÂ…mvûk—ÐA$##ÃØØ¸¼¼¼þþ^½z­ZµjóæÍ4Åb„F}”?άY³¬¬¬nܸ±lÙ²¸¸8‰daaÑdŽãØØØ   Q£F-[¶lóæÍööö^^^퟇ùtéÒÅ‹ÛÓÏË—/ýüüp8\PPš8¥“áeܧO@ll¬ªªjNNŽŽŽNƒ½zõÈÉɵv‹ÅÊÊÊ’H¤ÏŸ?‹HŠ!ª‡6œár¹_¾|™6mZ•¨ªªòóóSWW_¸pajj*ªrPº,Ó§O×ø±cÇvÁÀÈNåÈ‘#êêêYYYîîî33³&›IKK[YYÉÈÈÚÛÛ·\>Ÿ:f̘÷ïß´§«ß¿/]ºAmÛ¶;¶ýsCAAi’~ýú5wHZZ ¤¤´}ûö/_¾4v_QQQáóùÕÕÕÓJˆD"…B >|øpÛfÞö°fÍš²²²æðùü;wîÄÆÆ¦¦¦*))µ¹1 Jç±råÊ—/_ÆÄÄXYYÑét2™ü§g$Q¤¤¤._¾~ü¸¼¼¼ÿþ€‰'¾ÿžÏç7iŒ>{ölEEE†–––vss{õêUÎ…´QèÀ=iii"Úhii¹¸¸,]º”L&û JWÃÆÆFQQ1&&fݺuð»Z@pþüù«W¯iii999™˜˜ÀC‘‘‘§OŸÎÍÍUPPPSSKNNîß¿ÿ³gÏZ5:‚ ß¾}ƒO-X,VøSÐÜ!áK@“'ŠÃСC½½½7oÞìàà ­­M£Ñ %%¥&ç´–¸¸¸ýû÷c0˜ãÇÃåk‡ª6‰@ àp88®¹t«»wïNJJ¢ÑhŸ>}¢ÓéUK5ÓþK“ŽŠ>[¶lYbbâ—/_:¤7”6Ãb±â½}ûö Aƒ¸\.ƒÁpttô÷÷Ì›7–n€ªªª8O#IIIiÃYõi£Ðár¹x<žÁ`4×@MM->>^^^¾¼¼üÇÍÙÕâãã'NœØ¶9˜L&ƒùÛžÂQ$†‡‡Çµk×&Nœ8cƌׯ_¯_¿þàÁƒ‹- ߺu+N·µµýðáCrr2 Å’àár¹#GŽì„‰ð¿ò¨Õ‰Db³ÙóçÏor‡Ã;vLJJjýúõUUUÇ—––vvv®¬¬ôññ‘‘‘Ù±cGEEž}ûddd<<<ÊËËwíÚ%++ëååUVVæââ‚Á`¾}ûöñãÇK—.-X°@¨Ã—Ëݶm[HHȰaÞ@˜2eŠ˜±ÿQÿÚáËú" ;iÜ@xˆÍfþüYœù̘1ãÛ·o÷ÇÆÆÂ•I“&)++‹Ó J§‚Åb'L˜@&“Y,Ücaa1zôè}ûöíÙ³§~Ë}ûöUVVÊÊÊ6Ù……EFF†øã>þ¼ÍsÒF¡ÃçóÙl¶ˆ'${{û>}úõíÛ·É6ß¿Ÿ0aB`` ˆGºæ0110`…B©©©A…JgPPPºfÍš;vø|þêÕ«}}}çÏŸïïï?xðà;wîÀÚ­[·†‡‡[XX´aX=ª¾Å¤Á6 ¹Cõ*šì¤U3¡Óé_¿~mòP]]ŸÏ./IKKû0`Œ½"‰Ã† ƒÛd2yÒ¤IÐ/˜J¥š™™Q(èºwàÀ<onn•ƒÁáp7nœ:x¼¨sø|~^^Þ‹/&L˜ ¥¥Uÿ¨@ ¨©©éÝ»wUU,kÜ*ˆD¢œœ\mmmEE…èi  ´–ŒŒŒ•+W>{öìÓ§O‚ÌŸ?îÇápæææñññeeeùùù+W®Ú¡ÃÃÃÛ0‘HLMMí°©ÿ/ $QcyÔà%‹Åš8qbee¥–––ALL̯_¿„½ ³Âµ¸-%%µnÝ:¸M£Ñ òP©Ô%K–Àm …bii ·-ZôàÁƒ}ûö¹»»ïܹÓÚÚÇEEEá} W¯^ãÆƒÛaðàÁpÇ«««ÃíÏŸ?;88ðùü7 ߠ¹9…Byüø±¥¥åÆŸ}z^^™L¾yó&ƒY¼x1“ÉTWWüøñ7öìÙÃçóá‚““Stt4<ÝÞÞ&?~üÛ·o)ÊÒ¥K7mÚ$1ñ‡ÒÝáp8?~ü°°°€f) ÃårçÌ™#\àŒ;Vòµ_Z¤†d2™L¡P`´X“ôêÕ‹Ïçûøø,_¾¼q6‡###SRRRZZÊh=x<žËå*++7øBAi'………UUUªªªáã5‚ qqqRRRrrrªªª/_¾:œÆÄÄü±é6‹ÅápPI‰D‰¿¶T*UJJJZZZFF¦W¯^²²²½{÷–——WQQ‰‰‰¡R©Ÿ>}ª©©ÉÊʺxñ"¬çÐQ‰±Xìܹsccc8¨¦¦€Åb[µ¦›——gffVWW7þüSêáÔ©S¿~ýª¬¬400¸|ù²²²²žžžƒƒCã@\[[[2™Ìf³aþ46›M¡PlmmB2€¥¥¥ðt‡Y³f^½zejjª¯¯êÔ©³gÏJêúPº7\.—H$¦¤¤lÙ²%!!ƒÁäääôíÛ7>>¾AKáSJ—¢Ë!ð9@EE¥ªªªþ~ ‹²²²Ñ£G'''ëéé=þ|È!?~¬¯Á`x<ÞÉ“'Ú0º••U¿~ýjkkÛ6y!¡¡¡ð»#$sss‚ÐétSSS__ß·oߪ««§¤¤dffººº„ 6lݺÕÌÌlâĉYYYoÞ¼ù×ÑAÐéô/^L™2%""býúõgΜ™7o^TTTpppÇddddddôæÍ__ߺº:ñ…Î÷ïßÍÌÌJKK'NœERÇNìO!üÁÀ`0ãÇôïßßÙÙùÉ“'=ªßrùòå:::k×®]ºt)‹¥P(çÎ=z4€N§›››ÃU€±±1ŸÏ‡§›™™‘Éä‡:;;;88×®]‹¦ÿ@ Ì^såʘýäÉ“gΜY½zuTTÔôéÓ…®ºrrrk×®]·n@ èj_ÌvÙ}ÔÔÔ²²²„/'Mšäââòùóg™Ã‡øðššÚØ[°aÆ&-1ÉËËkë”QPþ‡óçÏÃÓµk×õõõÕÒÒº}ûvbb¢ººº··÷‚ óæÍÃb±§OŸ¾víš²²²‰‰ÉãÇ%<óN‚N§‡‡‡Ï;÷æÍ›ðçÎ;wîÜÎËÀÀ 44´´´TÌÒTß¾}›7oÞÏŸ?|ãÆöçSî:œ?þÂ… 0ëZ‹Λ7Rµµµ…*GL„ÕÊfΜùðáò²2EEÅ6LåoJ–nß¾ÝÇÇîäñxkÖ¬ùýû÷Ž;®]»faa!Μ93l1Œž&t¦N* vÀ`0¾¾¾ cüøñ¥¥¥Â6¦¦¦#FŒh®>Ebbb«Lìfff¢«§¢ ´ ÑV'<¿aÆ 64>dff&L¯wõêÕÇ÷˜‚'£Fº~ýºµµõõë×Ùlö¹sç:õ¶%æ²î§OŸÌÍÍKJJƌѓT€N§ ‹ŽµÈ©S§BCCõôô¹r劂‚Bƒ¨Ð´q:Ÿääd:xõê‰Dj.4€ÅbcbbæÎÛøƒ´sçNçâârìØ±ÒÒR{{{XË¥k¦&o»Ð©««srr"“ÉåååÑÑÑööö£GÞ¹sg}•€åÍ­Žr8œ’’ñ­¬¬ló„QP:Ÿ?Þºu‹Çã1Œ{÷îtH¦™.”)SnݺµdÉ’»wïVVV^¿~ýÏ ‹×¯_/^¼¸ªªj„ aaa=FåDEEAKSPP¦¦¦Ð;øúõë?~ü€Ë222:::sçÎõðð ‘––>{ö,ƒ™>}ºŸŸß?ÜÜÜddd`ˆëÁƒUUU?}úddd}™÷íÛ÷þýûêêêG-_¾¼Çü%Q:œ¼¼<AfÏžÝ\ÜÓÎ;‡ âääÄçó“’’º¦w¤íB§´´´oß¾ŽŽŽ………0ŒþñãÇÂÕ-!S§N…¥¼Ú5M”.FZZÚ™3gø|>…B™2eЇ‡ÇŸžQ3qâĨ¨¨ <}ú®ÝŠ>èTnݺåèèÈápfΜÒ“n&Gýþý;àêÕ«rrrÂâ   xügW1bÄܹsaRJ‹UTT³"""–.]ª«««««»wïÞ€€€¸¸8¦¥¥•ýöíÛ9sæÀ®ÌÌÌžkkka3<ïèèøâÅ EEEtu¥›¢ªªúôéSccc6›½`Á‚mÛ¶µ!½gÛøòå˘1c.\¸€ÇãÏž= kGHfèžGTTLõê  ˆ`ذa·oßçËž••åèè8dÈ®\è©u -ùùùªªªW¯^]¿~}uu5Ü™••ehhsåÊ•šššÈÈH:þòå˾}ûr¹\‡ÓÓ¡  ˆ‰´´ôíÛ·;æååuþüù§OŸ^ºtIWW·óF>>>¾¾¾<O^^>,,LOO¯ó†ûðóóƒî>¡¡¡ƒnqV”ž ƒyúô©˜ƒƒƒ—/_nhh(NøddddãÚæ"PVV†Ž¿ ÆÖÖ–Çãáp¸Ö>ó´BèääähhhÌ;7**ªÁ¡’’’éÓ§¿~ý:$$ÄØØ822R^^t\ž1”?ƒqvv633³²²ÊÍÍ|ñâ…OBBÂÍ›7oÞ¼9jÔ(kkk 1"’˜˜výúõºº:‹?þÁƒÅLÜ•a0‘‘‘z(¢hÃÂÀßëW¯Z{JDD„§§'‚ MÚ•Þ½{§¯¯ÿåË—ÚÚÚ‚‚aáˆÆôíÛWEE¥þžïß¿Ož<9///44ôøñã.—Û*DZ„ŸÏÇáp7oÞ§ñöíÛ§Nª££C&“ÅŸG›ACºš¤¸¸ØÎÎîOÏEÝý>;yòäÉ“'ýúõøñã¡¡¡oß¾}ûö­‹‹‹žžž¡¡á€”””ÔÔÔ¨T*Ç«®®.,,,---..~ûöm\\Ô7€8;;ÛØØôŒ¯³””ŒÏøÓA…©©)ÇרTRSS[{bzzz~~>ƒÁ€qæ\.·¶¶‡Ã}ÿþ]KK«ÿþþþþóæÍÓÐÐ>|xll¬££c“+·nÝÚÀYÞ××W__””„ ȃÆ'###þíB,¡“™™I"‘ŠŠŠÄiÌårW¯^’’Âf³[Œ·š0aBƒLÊ¢©at:]EEý¤6¦oß¾0õJWfíÚµ=àÓK§ÓOœ8qèС˗/'&&>þ<#####Cœs555 /^lddÔÉÓ”(JJJW®\ùÓ³@Ai L&“Íf·¡ $‚ gΜñòòºsçΫW¯ÌÍÍ'NœøóçOèƒlgg7cÆŒõë×ÃÆÓ¦MËÎγg¸8K jii-X°àþýû<J¥ŠÓƒXBGOOïÌ™3bÎ ššzõêUI« Ïž=ËÉÉ¿[!ººº %==L&3™Ì6ôг¡R©³fÍúÓ³@ù‹ R©‚|üø1))éÝ»w%%%UUU?þüùó'‘HÔÔÔ”–––——åååŸ>}jÛz³¯¯¯Í´iÓ}}}óóóÿþ}ðàÁììì_¿~ݹsÇÏÏOhÚ.((HMM•••E¤ººZUU577WMM­¨¨ˆB¡`±Øªª*•÷ïßs8œ5kÖ˜ššòù|0pàÀàà`¸-Îz Sè`±ØÖº&;wN„ÐÁ`0X,vÕªU­ê³þéV[[Ûc*)¢ ô0ŒŽŽŽŽŽŽpOJJЉ‰ÉðáÃ{Lw”LÿþýoܸѶs9ŽƒƒÃ‹/NŸ>}ðàA@ ¦¦! 6,--mÔ¨Q0!á¨Q£rrr&L˜Àáp¢¢¢,,,àé£F*))QPP7nÜòåËß¾};xð`¸¢C Æ/ i3‰WËôõõÈ!ðǽç,..ΔZ:4­ ‘f€ÈÈÈ‚‚çããÓ·o_¸úTZZš——÷êÕ«}ûöýøñ¶$“Évvv‡§ÛÀ'NÌ›7OZZúñãÇÙÙÙÐŒ‡‚‚Ò¥@WtPPº­ªEÕ$×®][±b…±±1—Ëåñx Žb±XÇf³©T*‹MOOߺu«ðè Aƒ`A+🗋Р§AcÆ ==½ØØX˜ŸÃËË«¨¨ˆÁ`H$´º J—]ÑAAé^tHÚ‹uëÖeffR(¸ #ìóíÛ·£FÀÍ¡C‡ž9s¦¤¤€ÇãÔÕÕù|~džd¶ t`î ´´´¶õþàÁƒ[·n­]»699YUU°xñâÅ‹×oóôéÓáÇs8@0`À€ââbmmm555Çãñzõê…Á`ôôô`½øÚÚÚ+W®¬_¿>##4Æ`0Ð7™@  *¥« ”n‚ Ð þ¶¶“¯_¿öîÝ{áÂ…ÎÎÎ#GŽîWUUõöö¾wï^rr²‚‚BjjêÙ³gMLLÔÔÔÔÕÕåääX,V‡'žhAèðx<ÐZOäúlÚ´ÉÄÄdëÖ­ººº|>¿¬¬,$$ÄÖÖ¶¦¦FAAáí۷Æ ËÈÈÐÔÔ4hÐû÷ïGŒA"‘~üøÃá~ýú•““³téR<O FŒ1räÈ›7oòx<(}¸\.•J=|ø°––V›ƒÕQPP:Tè  t}¸\.Çb± ÃÄĤCúd±X!!!0щDB$!!!%%EèjSZZª®®þøñã ÔÕÕÁý‘^«¡#`Ô{›(**rssó÷÷‡ÎÂX,væÌ™ ¥´´´¼¼\UUµ¬¬lĈ_¿~6lXNN¬Ã¾|ùò¤¤$€ŒŒÌŠ+ ŸÏ/,,ŒŽŽVVVÿ)0¸„sèÐ!˜K¾¹*((( Tè  t}8ƒÁX½zuXXNŸ2eÊóçÏ;¤çââb¡Jcx<^\\ÜÔ©Sñx|çU€iÁCP ´ÓpæÌ™äädAêêêÈdòÀ PPPPRRRQQÁápZZZl6›N§C5',«¡7`À …Âårù|~ƒ 2 Ãb±P•ƒ‚ÒÕ@‘QPº>4 šÎž=K ÂÃÃwïÞ-N.¾ö`hhøüùó}ûöUVVvªç‰$„Ž@ ppp ‰oÞ¼‹c ‰ÏçÃê¡ëÖ­VÁ–}‡-¡“vã§C …‚¦“GAé‚ B¥[ -Z´nÝ:wwwiiiOOO&“™——7uêÔKCCãæÍ›III|>_VV¶S×)Z¸û`0˜YMJOO?zôèäÉ“Édr]]õ?àR ‘HÄãñ111T*577÷Þ½{ð,uuõ;wH$RýöíŸ Šd@MW((Ý&“iiiI ¼¼¼ °|ùòK—.õïß?...44T^^^ü®p8ÜôéÓ›<…F£y{{çääÌŸ?zÙJàæÐ¬ÐA„Á`P(0ÕN¶oß>kÖ,ooo999áN óäÉsss"‘¸páBKKËAƒ¥¥¥½{÷æŠ=z4Œ·BAA鎠B¥[@£Ñdee§OŸ(,,¼|ùòÊ•+¯\¹bmm}úôiñ»òõõ}òäÉïß¿£¢¢<=='OžL  öíÛW^^îêê ­7ç”Ó€fh—Ð7 IDAT‘1ÿ È”)S®\¹ÒþÁ=zôèÑ£èèh---‰ôõë×7oÞüþý[Ø ""ÂÈÈ(&&¦ªªJVV–'Eo‘((ÝTè  t õª~•‚òòòeË–Á¬x‡†…¨Z¤¼¼8wîÜ9sæìÞ½*@||ü¸qã$|Ceºòõõ…NÄîîî8äóçσ‚‚N:]_å@222>|ø ­­---æÅAAéî B¥»Àd2-,,/´ìÙ³‡Ëåîß¿_Ì~ŠŠŠaaaýû÷×ÒÒZ¿~ý;w¶oß>tèÐ¥K—"Òà†Àçó †0¼ÃiVè0ŒÅ‹›™™•––jii%%%Mš4©S= ¥¤¤öîÝ[XX8jÔ(¡› J·uFFAé.@ëÕŒ3ì/))iýôõõÅé'<<œÉd:99>þ`eeåãã“••õýûwiii:>vìXssóõë×ÿûï¿×¯_ÏÊÊ‚F$xÇèXš½ûP©Teeå‘#G¦¤¤Œ;öÅ‹l6ûÁƒŸµwppøüù³‡‡Gff&@XÈ¥[ƒ®è  t# õªñþ£Gòù|q:ùõëו+WLMM544e±X¹¹¹¯^½ŠˆˆðððXºt©¡¡!•J0a‚@ `2™í½Œÿ¥Y¡ŸÀ/^\PP0aÂCCÃÍ›7GGGÏž=›Á`8::¶j}}ý‰'6?¶aÆ’’’€€€êêjÀ¸qãZy (((]Tè  t#X,V“Ö«o߾ݾ}{ñâÅœ/¢ñññ´¶Øvbbâùóça­òDÔz2´^x<Þëׯ?nnn>|øð¬¬¬'NŒ3FÌ1H$RZZÚË—/9ÎÝ»wutt¤¤¤¶lÙRPPpêÔ)‡ ˆ––V\ JW5]¡ t#¨Tj¯^½š¬áããƒÇãÅéçëׯ‘‘‘¶¶¶JJJ­šÀÛ·o[Õ^DÝ}¨Tª¶¶ö°aÃêïÌÈȘ1c‹Å:uꔘc°Ùìššš÷ïß§¤¤˜››Ÿ¿IëUZZÚÓ§OW¬XA£ÑÄéÇßߟL&›šš¶jtƒÑªöâ Jè­W ö—””:thôèÑ3gÎs˜¢¢"‰4~üx"‘8qâDóçÏ›šš***¦¦¦6nÏçókjj:ÜP‡‚‚"aДî›Í¶°°h²þC@@€ŒŒÌ’%KÄé'##0hРVÞB§…¢žÐzµ{÷îûOž<éêêêêêúèÑ#q†¹zõê¿ÿþ;mÚ´ØØØ„„„„„á¡-[¶ìÝ»WQQ±OŸ>ŠŠŠJJJêêêššššššƒtFÑv”a2™—/_îØ> ÅtÚGé1 +:‚p8œŽí“@  BY’P©T€‰‰IDDDƒC÷îÝ+))qpp8wî\‹ý””” ëp7€@ ÈËË7>T[[Û¦Y‹¢¡C£Ñ´´´ôôô 4RQQèììl`` N¡Ó§OïØ±cË–-±±±ÖÔÔÔÔÔ|ýúµÁ~,{ùòe›ûGép ÆŽ;:¶O‰nhhرÝJ× ”,Š8 Bç¯"//oäÈ‘ÛçôéÓCBB:»À$J} õª±Ðár¹çÏŸwssç§_WWƒÁäää÷àp¸7nذAUU•Éd~þüùúõëGŽ©ÖXÑ®3‹/n tÇŽstttuumlÛjLiié¥K—ìíí‡úáÃ1'',X辋:‚¤¥¥uø—_2Éä… ¶¿Ÿªªªˆˆ6›½`Á‚;wît)­Ããñrss[l0iÒ¤©S§Ö¯a‚Ò"¨ÐÍÇMLLzØŠEGI„ëC111Ë–-»|ùr7Õ:ïß¿×ÔÔì^“g³ÙóæÍ#‘H«zíØ±ÃÞÞ¾E¡#–RRRººº^^^FFFÒÒÒ|>?!!aòäÉ#GŽ|÷î]ƒ³þ€ÐÿY¯víÚÕ`~~þõë×mlløýû÷ûñóó³³³Û²eËêÕ«ÅŸ_eeeAAAkݶ%Fxx¸8Æ»øøøñãÇŸ>}ºÛÝÎh4Z‡äÅþúõkDD„´´tMMMWÓ:åååbN&88ØÈÈèÆ+ÑÒøk…Naaá¡C‡ZlïççwàÀ ÌJ2ôïßÿñãÇíï'33sñâÅx<þñãÇ]Së:t¨±hÀׯ_KKKׯ_?wî\É̪ý@ëÕÌ™3ïß¿ßàP^^ÞãÇ—,Y²mÛ¶ªª*Œ=šÏç/\¸ðòåˤ¥¥]¼xñþýû»víšÜ!R»)ŠŠŠFFF]Mëp8Ü€D4(//¯®®~öìÙÔ©Sƒƒƒ555%67äää¬ö˜÷§g!ŠŠŸL² þJd@dz🞋(‚÷Evì{ZYY)f‰Àoß¾Y[[_¸p¡¹[ÿ_ΠAƒÊÊʺ¦Ö‰ˆˆ¨©©§åÞ½{kjjÄtãí @ëUc¡8sæÌ¬Y³–.]êïï/¢‡1cÆdee999ýþýÛÏÏ/88˜ÉdnÞ¼ÙÛÛ›B¡ðx<׸æC‹Â± ´,t õjÑ¢E…NvvvrròŠ+víÚ%ÎäÞ¿obbÒ«W/Ñ2°¡ï:SSSXñµIÙ²e ;;ÛÊÊêßÿm2EÁ_ÂÁƒ]PëÈÊÊ^¿~]D??¿7nàp¸¬¬¬)S¦;vL£mgSQQQžW7g·öŸžH÷&òßœÊÊÊÎèYQQqÍš5"Ü»w/++«¬¬ÌÒÒrûöíÛ¶mëvë¾ ™L¾xñâÊ•+»¦ÖlÙ²EÄ”RSS=zÄår<øæÍ›ÿýWJJJ’ÓkÐzE&“Y,VƒCQQQööö"„…BÑÕÕÍÏÏ·´´ŒŠŠ3fŒ‡‡Ç¼yó0  AÆB§3VÅr®d0VVV­W€3gÎ/X°àÚµk-öSZZ PRRj,tæÌ™S¿bjƒÑ»ø7àÀ":Ã7ƒÁ >üÝ»wÛ¶m³²²rqqù;Í8®ËjqX»vm^^ÞÇííí_¾|yøðá?î=F‘# ™ÙE—<» ±ÇFBtÒÒÒæææ"¼yó&++kâĉ‰‰‰LLL êÓ§O'ͧ›¢¥¥Õ•µÎœ9sDh>ŸÿèÑ£!C†|ýúõÉ“'999‡2dˆ$g؄֫ððð‡x<^PP‡‡Çøñã›<}Ĉx<þÈ‘#x<þåË—†††l6ûÒ¥KG}øð¡ˆÀŽÎø¹«G*•ª¡¡Ñd`ðÍ›7+++íííÅéGWW—Éd~ûöM¸gðàÁ>,//ŠŠúýûwZZ´äÕ‡Á`ô ÿ™3g\\\Â7lmmóóóÿôŒþ P똙™ÕÖÖ.X°àÕ«WzF­€B¡xxx¸»»“H¤iÓ¦}þüùOO ¥Ûcbbrâĉ޽{?þ|ܸq/^¼øÓ3êr@­Ó»wo¨u:ÃÀÑ©èèè\»vMGGçǶ¶¶¡¡¡zF-Ó\æ@ÀéÓ§±¶¶nî\è‰ìîî~ëÖ­áÇóùü3f¬Zµêýû÷yyyÐR„Á`$³¢#–Ð «É f2™ÁÁÁ“'OGŸŽ3æÝ»w\.—J¥nß¾=77÷Ç3gÎÄ`0………d2Y__¿ñó1ƒÁ â̳ë³`Á‚sçÎõïßš±:Ä_¯;Ò­µÀÌÌìÂ… „f¬›7oþé¡t{ ®\¹b``ÍX>>>Qƹ[ÓÝµŽŠŠJPPÐÂ… ¡këÖ­]Ü1ƒÍf›››7¹hýû÷o‡###ÓܹãÇg2™rrr‚Éd÷û÷oxèõë×ÂÜÊ<¯Á‰lEüg½jòP`` ‚ -.êôîÝ›N§—––¾|ù²´´ôСC½{÷>{öì¸qã–,YÂb±š3åô˜ˆ¶¶ö¥K—Œkkk·mÛvàÀϯÕe)((XüK–,ÉËË“••­­­533ƒUë»t:=88xÖ¬YL&ÓÞÞÞÉÉ©±%¥UÈËËŸ8qbÕªU€ƒΟ?_øÛð7SQQqç?233mllh4ÚãÇ,XÐí´@ضm›———””Ô“'O¬¬¬²²²þô¤š…J¥JKKÏš5«É£|>¿¹Ÿf"‘8sæLA¨TjãúN·oßF¾w]KèP©T:>bĈƇ²³³_¾|ikk MzÍa``€Á`ÌÌÌÆÿÏ?ÿ 8ðÕ«WAAAÑÑÑjjjðò/dõ<@£Ñ¼¼¼þB3‹ÅÊü_ (—Ë}òäÉŸž]«AÍX(‹µ³³CÍXõùùóç®zœqâÄ¥K—ÔonE‡H$9r„Á`/‡Íf‰Äêêjaÿ‡~ùòEVVvøðáÇ“ÉäiÓ¦‰éòÛ*Z‘Òftssk|(,,¬´´ÔÁÁA„Ð=ztEEÅ©S§\\\V­ZE£Ñ²²²ÜÜÜx<žèšJ=øë ÍXˆ‹‹ëÙÑXd2yذaMê²I’Äš±¼½½»T4J·š±Î;ü×FcõïßÿþýM:pàÀ—/_$<ŸŽš±FŽéååÕe£±( ŸÏwrrrrrzÿþýÅ‹CBB~ýúàóùƒ§dee£££µµµë¯YH$??¿ÂÂÂú- ‚σ`æšQ£FÍŸ?ßÅÅ¥®®®Ã¯¢‚F£Ñéô&K°ÙìË—/ª¨¨4wú˜1cjjj>~üèää„ È«W¯tuu/^¼øéÓ§úÍûßõÔÈ_kÆêa f,”5cý t}3\˜ƒ òõõ-((·´´Dþ:c0ƒ5kÖœ9s¦°°pìØ± kÎÏŸ?t+++ëêê M=˜yX´LÛh…Ðflò(¬!++ÛäQ:®¬¬Ü¿hÃb±¿~ý‚Š/==Ëå q`Âøÿ™bÏ]Ñ‚Fcõ Ðh,”Æêñt‹h,,‹Çãa±X³gÏ “——×ÖÖ~ôèÇKII ²··‡êÂ_m.— Wh|}}Ïž=«««»víÚœœ—””&ÕƒNÙôÙn†{%º¢™™‹Å6ÎòÄb±=zD$¡î‘Œk’h.]ºôèÑ£ÆÞBÊßÕ“@£±P:4«ÇÓõ£±àúMnn.“É$|>ŸÁ`ÐéôAƒ.\¸›ikÿ_–vXˇÃÅÅÅÙØØ<þ|õêÕ™™™ÚÚÚBçª÷ïßô´´À—_¾|a³ÙR×:¡C£Ñ 4jԨƇD ßL++«k×®Á£&…Ž„5Gnn®‹‹Ë’%K ä”¨«g€š±P:ÔŒõ7ÐeÍX‚`0˜’’:-YŸ?†™_444°Xì³gÏ`KWQQ8p ÏÖ­[åääF][[[_ÉääääâââäädáΟ?Ž3fïÞ½åååÂø$ÐTˆRkiÐÁ`0uuu×®]Û¼ysïÞ½ë!t¬­­ äää„{(Jyy¹ðe]]M`` @WWw„ S¦L™>}:4â¬\¹²U“l?PlfeeÙÛÛC*ÉÑ%fÆúöíŒÒìñsæÌiЧ¡¡á­[·|€Ùl¶§§§¡¡!‘H$‰™™™íÿjµû ‘H4hŸŸ_IIÉÝ»wçÍ›ÓÃ?DclSSÓàààüü|á!6›-vîÜÙ ¥¼¼|@@@LLLBBÂóçÏ'L˜àíí=eÊ”ÆnM ü&[YYÑh´”””¥K—nÞ¼977WbŒ+++KCCÃÍÍ ºÐ÷`JKK·nÝ:|øð€€€ÎpéoŽ1c9;;ïÛ·ï/‘¤Ý‹}ûö¹ººB÷D‰ñÇÍXÑÑÑ ,HMM•ä Šüü|##£³gÏŠY¢¼C°+,,ÌÙÙYô¯@øþý;ô2†/y<Þ¸qãÊÊÊîÞ½ ÛÔÔÔL›6-&&æàÁƒÇ—••…‹1UƒÁÏmŽââbiiéöÿBµZèàñx¨lø|¾©©é½{÷Š‹‹=J§ÓÁ+:VVVaaa‘‘‘?þTUUö€ HqqqƒªX,VFFÆÁÁA¨i,-- ‘HQý«“ Ÿ?º¹¹Q©Ô¸¸¸ùóçïÙ³§¨¨H2sŒ‹Åbèëë»»»÷`«?üX»¹¹ >ÜÏÏOb·­ö›±JJJŽ=j``pýúu ÛpQD#‚‚‚ V¯^ Cd%ß5c ‚¸¸¸éÓ§/Y²$##Cbãþ°XlUU•¿¿ÿÌ™3O:ÕI%î›Dbf,ƒqìØ1:¾k×.ËP ÍIÐ1yúôé222‡JJJ‚å™#""<<<àÚ¢¢"üAÿüùóýû÷ë÷Æf³¹\®èÏm¿~ýâââÝ€ÚCÛšH$ƒ)++#‘HÎÎÎîîî€ãdzX¬”””ëׯïÝ»wÞ¼yj Hvv6™LVQQùðáÃüùóGU^^Îçó'L˜PUU%¼•gdd :4++‹Åb¥§§gggçææþüùóׯ_•••uuu·¢…‘H”••…Ù6lØ€ÇãïÝ»gffæããm SÍXðO-''Çd2OŸ>=|øð]»võH¹#Ôߥ¥¥žžžzzz”ØûØ3̲U\\¼nݺéÓ§¿yó¦'vhÌóm}¢á¿Ÿ³zSþƒÙý÷l`ª$fdddaa!ôTÊŒo¼‚<|øÐÈÈhÙ²eÙÙÙ÷§‰D"ƒÁ œ={¶ŸŸ_}¿‹NE2f,ha0PWW÷òòjq>Ÿ_UU…Á`^¿~}ñâE‰äéé¹lÙ2Þ Í˜1cÌÍÍt‚ H¯^½à6FÛ±cÇ‘#G.\¸pïÞ½/^dggŒ=ü÷.´‡¶/–äääèèè$&&Î;æ=äp8#FŒ€7b9997xð`ؘÃáp¹\&++»wïÞ>ܼy344&ǃëù555õsê¬X±âÇÀ`0L&3++ ƒÁ¤¤¤\¸pA¨:a4æ 7 Ÿ>}*** %ü‘HnãñxØŒÐðÇ^ ¦¬¬|êÔ©-[¶ìÙ³'444$$äîݻ˗/·µµmó_O|:/© :S§Nݽ{÷¿ÿþîïïñâÅÕ«Woܸ±ýýwüÖóíÛ7€††FhhhllìþýûŸ={æããsúôéU«V‰(ÀÛ4H*9þ|™ÿ““kòû …ΡC‡Ž=šššjbb²hÑ"¾}û¶V&®šé÷‹?D—Œ±éO ãÒ /Ú¼Ýúbbû{þ€BgÅŠòòògÏž}þüùóçÏõôô6nÜ8oÞ< Là$„rjΜ9C† ñ÷÷ˆˆˆŠŠ²°°Ø±c‡¦¦f§-yà3Ò!CNŸ>½oß¾èèè‹/†††.Z´hÅŠÈß(¤‚PèL›6 ëîî~üøq777{{ûÆYOù|~]]´´ô‡¼¼¼TUU;¦  xòäɪU«Nž<‰ ˆ´´´èAáÏkBB‚‡‡Ç›2eŠ““Aß¿———«¨¨ðx¼Ž²ç´±—ÒÒR55µß¿›™™•——Óh´¤¤¤qãÆååå3ÆßßßÀÀÖ5MNN;v,}ðà––Ö¶mÛìíí ‹…?Øð¯©¤¤äíí-B x{{'$$¬ZµjöìÙC† !‘HÖÖÖÿþû¯¾¾~aa!‡ÃáóùL&“Élú´ººº=Ñ. Ä„ººzHHÈöíÛ·oß}úôéÐÐPa(]§ÍXwîÜ9vìØ7¨Tª0S‡Ãáp8::: þR¶¸·¡· ƒÑ×׿{÷nZZÚ¿ÿþ{ÿþý“'O^¸páŸþ‘À¥ UDA‹ª¥ÍC¿ÏÓ¦MËÎÎ3f ƒÁ8qâD@@@Ç]‡(  ‹Å>xð """""¢A&Ô=½zõ‚€¥K—:::³vhÊ  ÏM8÷=þÜ÷²¼:‘U!žÞgÁ]ßÉñEÙ5ÍÉòß^Ui¸ +šlׄ ÏOç%^ø^YÄRÖ‘6Ù¦¡kª8hð¼ì{Ý™Š¹‰å\€¾ì|Ÿ!ýteDÕâ Û†@ `2™,‹Íf×ÿŸÍf3™Ìú;a­¬¬ì‘#GvíÚuæÌ™'Nddd¬Y³ÆÓÓ³¹Ú 4c9rÏž=ÐŒ?< Æ­àp8áFã €ûa³úmêŸ Gååå>¼uëÖƒ†………‡‡/Z´hÉ’%¸j! |>Þ7ÿQ»þKA4C¤A³¢¢¢C‡‘ÉdØÚ¸Á¸qã>¾ E‹ݼyS˜ù[ °Ùl‡ÿ¯ÏÚµk'Ož}b³Ù‘‘‘‹Aëׯ߈#rrr¸\nqqqqqq;;„aÎBàOóÔ©S#""-ZôãÇ;;»ÀÀÀÛ·o+**R(”—/_zzz9rÄÜܼ¼¼Að_}}ý€€kk냳ÙìÆ™óêÓâÂOGÑF¡Ãçó‰D"—Ë…Aãjjj_¿~µ²²:zô¨Ð “””tæÌ™ššGGGWWW>ŸÕ ¬aÎd2)”ÿÿìUZZúýûwøð*yyùú/±X,…B©ßMMÍñãÇ·áꬬ¬²³³ë ‡âããóñãG8¥K—.^¼øüùópÇpu>XìØ±CèÍŽ ÈË—/ãããOœ8 ˆpg“ vÆÄÄlß¾ƒÁðx¼aí:¾uëÖ©S§ -ÀÁÁaÍš5ðÙQ4mè<::úŸþáóù>ܽ!H,õ IDAT{7´®0ÀÕÕÕÚÚº¼¼\B‡ÉdúøøDGGlll>ÜøsË`0„º§ªªªººº¢¢ÂÅÅÇÓh4@ffæÉ“'_¿~ Ûc0˜òòrDÐÏ”‡Æ<¥ñ6úx"ððÐ'Š,AËH Õ‡¨=Uáݽ¢××~N²Spêø€<§5Bv„e_Š,0b~_›Y~üèææv÷î]Aäåå·mÛ6nÜ8##£¶¿%bóåË77·üü|¸d8nܸúkÂ5Œ&w6î‡Íš\üàóù©©©÷ï߇ßÄ’’___a0£‘‘‘­­íêÕ«%pÕ‰'6¬ñúSãe*¸RÕÜ2•°™››ÛòåËûöí Û—””ìÛ· ·oßîÙ³çÁƒiiéeË–-]ºÔÄÄD ªªª<==0Œµµõܹsð'®s7Øhr?¾|ò䉾¾¾ªª*ÇKKKKIIB‡Ãá\ºtÉÛÛ›ÍfÃBcVVVd2ùÉ“'žžž™™™»wïvrrÂb±\.·AŠøçíß¿xx¸¹¹¹­­­““SFF†žž^gÿ}Z¤B‡Ã 0 þèq¼uëÖ7 ??¿I“&¹¸¸èêêÖÔÔ@cünp8œ¢¢¢FeeeajÅ&!‘H;wîܽ{wfffså!; ¡32ú ùùùÁR***+V¬°°°-T;ÒÒÒ={ö¤¦¦b±Ø 6¬]»¶AM iii‰¤¤¤ÔÚžá)>|€5ät:ÝÅÅeÁ‚x<^Â^É}úô©ï´Þ±ÀÞƒàß²²òÖ­[—-[&±ú©¹¹¹îîîß¾}£P(GmÎ+HJJJJJª_¿~Â=eee...ÒÒÒwïÞ=yò$ôuÅ`0°Æï´iÓ^½zõèÝöÏpÜòù©Uµå•ÿ F¥¹µ|.òôÄÿdU(Ëû¿%ÌA†rSÖJ¾”ÿíUGÀÌvÓ0¢—°åÐ9ÿ÷6W9#¢˜QÊ)Îa 0°ú¿rxXfäü~ןf0~ÿßÊnoµÿ«qƒ'a>"z,Ñ3l$iü­[·ÆŽK"‘„Š ,,,&&¦  ÀÁÁáüùó<J¥®[·nÓ¦MÒÒÒ’Él~ôèQ6›=tèÐàà` ÎñÊ•+÷ïß/++Û¼yóÙ³gY,ƒ111qqq100€þpÃÌÌÌÎή;ôòò7nœ0Ì'//PQQaiiŽ F³±±Y¶lôÍ™™™»ví*))éÕ«×&OžÜþ>¿~ýjgg+x{{§¤¤p¹ÜãÇ9rþÒ5*!!D"EGG{zz¦¤¤¬Y³&,,¬OŸ>=š9sfs=Ãǃ˜˜ ‹ôôtÿÒÒRèÄóéOè SSSãïï_]]íììŒ Èúõëuuuû%‰ÄÆ®-‚Ôwì266ž1c†¢¢bïÿ8p ¼wt¶Ê@›ZMMÍÞ½{O:}ìµ´´V­Z5sæLI–¤xýúµ‡‡Gyy¹‚‚‚A‡#&444 Ä‘äÕI xQ<OAAaóæÍ«W¯–diñÈÈÈ#GްX,àààVùuAO䊊 èð!--½dÉ;;»…S6¨Óä~Ó.­JÝp,é­JÅâ0›žŒ'R›øH”|b(jÒö}™Qú­®ì{]òåöcÓŸ*÷*ák|¹’–àkBž„¥Êz¤><ú¥y1i¯ÐIII=zô!Cöïßíîî¾cÇ€¿¿ÿ¦M›&MšdmmýâÅ‹EhLLÌÚµkÉdòÇ ‚§§§ªª*‚ ¥¥¥åååýúõƒ k’)aWt¦L™7FŒ±zõêI“&Iò}j`®òòòj`¶k?Ѐ¥¥¥åââbiiÙ#%ÇËÊÊ:::ÚÛÛ·öǬ=ˆc® : µk×þóÏ?;ÿw÷ŠÒË ç¾›îÕ¶>¥0ïUÈÚwclûÏØ¦qm]ú‘I/u¦÷Áâ0¿¾ÔþH«š¶‰nä8ðáAɃŸÒËû‘æ±ÅÙ5$i<üÿ×ÃweýL¯bVs3#K&®ˆ'b•´¤ô-úFø”÷ªBQS*7©üÇ»*Ó=Ú8"6ûÉoðÿÚ»÷¸˜òÿqàï™nºßt¡t‘íªÛnQ}j±n’\ŠtÑEI+j6•hd["$Q’\ÒeÖdKí¶.‹„PQ.E¶V÷šæ÷Çûó;ßù`2Ýf¦éõüëtæÌû¼ÏÌéœ×¼_ïó~#TœX=}¦ìø1å¹õ¡WÞÎöžØÇ¾ú®!àÀ‚D"ÍŸ?ÿÇäBk 5]E¥RÙ͵<p C&“øá‡€€###®íšûð5_LLÌÙÙyýúõC~îkºjíÚµÞÞÞÃ4¤1íÒÔ©SCCCçÏŸOÜé ²³³-Zô÷ß3™LΤ?¾²²2##cëÖ­FFFeee²²²CÞŘsÿàîÞ½knn>iÒ¤ðððÔÔToooܮ޳T>cÆŒQRRâÂ#|ŸÀ_|OOÍúõëÍÍ͹\¯¦«†„ŠŠJrrò¢E‹~~xƒ'Ožp-Q…q˜®êÛÇçÎëééigg7qv~ÔÓ÷U­¡Û¯ì|'Nœ¦ð­³Ú_™¯˜ˆévâ[a1r!µêæé:™$?aÌd'•Éßÿ÷R%«&.£"ö¼´±ò·÷c¤…µ§Ê¦'"þ±²ù’ñåyõ½ ¦Í&­y?êã•.‰¦ªÒ·ÎÔ=-nTš$¹<ÁdÊ 5„ÐóÒF„Piò Õ1FŽÊ®Ö#„þL«Ã»}áGÆØÕ ÄÄĦOŸ¾{÷îáhjí÷ÓU¬H$Ò²eËüýýuuu¹¹_žY±b…‡‡—“/Ñ®b§§§göìÙ¡¡¡ø s“ÉôððÀ}zXgpâ®®î­[·~þùgUUÕŸþ9>>~èªÜo tp÷" ;wþòË/...7oÞTTT¼zõê¼yóð6¦¦¦EEE?ýô•J]¸páéÓ§ÛÚÚðPBì|ÒîÊÍäÂ'z{{çÍ›çîîΓÿd.¤«°iÓ¦ SÉü†û¿$“®bemm=cÆ0Žjüç§P—ŸM\~þoçA“ª& ¾ÜTþóøïœÇñ%Ìaû7+}Ú QH„4g›ÎœmŸæÝ‚oÚ²þõÒÃ}õQC.°°°¸zõ*7÷È«t«5kÖ¬]»–Ë;åUUÕ;vpsÜIW± ˆˆˆø¼íííÝÝÝ>ǦL™RPPÆó!%ûè<|øÐÈÈhܸqÁÁÁ‰‰‰xèq<~±¢¢"å`¶¶¶.\ðññQVV¶±±9w®.ƒÁàþ”ý•žžÎµD;+.¤«Àp|ºŠ³Úsïâ›ÿ\z‹ú-¡jš»Æ8.=>Ê\2x˜®b%ð À<ĵt+bxbV$iöìÙgÏž­¯¯ÌObÜJÄÍx¿ˆÓÏÒŽ›<|ø°ššÚ™3gæÏŸßØØÈd2ÙuY²dIww·‹‹ËرcçÌ™ƒ‡ÐÎÉÉÁOÇñ-žD9ÜIWa5$éªÈ…ý‘R;~²Œ`:ÜÄÛtàn¦«ú†ûŸLš4IUUu#° ߸q£££cÖ¬Yœ?Ï8ä8 tÚÚÚ:::ÔÔÔddd"""ð¬ÝÝÝ_mrÁc&≢|}}_½z¥¦¦6غ ®¥«ÀðªtÕˆöy. ?¤«À°â~ºªo¸)--­­­m0 Ò CHHÈÎÎ...nîܹCWÁ~ã4Ж’’Ú´iÓO?ý$++›——çääÄá{‰1‹ŠŠ?~|üøqÜD4Ðj HW €¡MW@à“t>]Ň8 tŠ‹‹ñÓðø©³ïL\\<99yçÎ[·nÅ󟸨 ÒUÒU`8@ºJà’tâ4uõß­×¼V[[»`Ákkk!!!žY‰¤¤$HWtgΜ©¯¯G®CêùóçÇŽƒt•knnÞ¶mÛüé*îãê=a„žž55µîînAJ]577¿zõªïm˜LæñãÇ!]Å·Z[[÷íÛ×Ç÷îÝCÕ××Cº pŽÉdvuuõ±ƒÁ@¥¤¤ „ ]5Buwwã ¿Åt:!é*žàvD)1lZZZZZÚW7ƒt?ëèè8þüW7ƒtè—ªª*ïj®¹8oÒU¼"€a7ÉÉÉ©««s²¥††ÆÞ½{åä䆻J ¿¤¥¥ccc9Ù’L&¯Y³†ß‚õÞnfËû¾Ú ÀW1z˜C^&‰DãdKqqñ¸¸¸%K– yÀpá°³éÊ•+}||FaŸ ~À_—ìgíÚµ‚=‘oOOÏýû÷‡u ÃZþW‰‹‹oذ·u0‘ÆmûfÞàuEF¼!_ Þ¾};´e~óÛo¿ñº àë Ð}inn†Î(üÌ¢öi=¯kÀÿxûöíà‡#éÏ ðeÂÂÂÜìN4È9rü£»»ûÉ“'¼®ÿø2yyù_ý•×µŒ$jjj%%%\Ût윀@ÀÐ522âu-ø0š :Xè@`A Ŷ3rhh(F³¶¶&‘H ƒB¡HKKs³fŸ‹ˆˆ À™LfFFÆ™3gêêêÆŽ«¢¢¢¡¡A¡P†¼†œ«ªªÚ°aCAAÁçs~™˜˜¬Zµjûöí\¨FDDÄõë×§NŠ¿å°°0))).ì·±±±ƒ/ÇÄĤ¶¶/KHHÌœ9sÿþýãÇ|ɃQYY¹`Á‚p8š*àg£äãëV|x÷$¶…Ba0{÷îE½}û6...<<œ{õú’ÖÖÖ½ñСC'Ožtuu500xöìÙ©S§x~›ill|ÿþ}GGÇçNxx8×fõ ëííݵkB¨¡¡áСCÁÁÁÜÙ5;mmmCRŽO@@@RR’„„DCCÃÁƒ×®]K£Ñ†¤ðkhhhhhhooçùo”œc|x•ÊïþƒÄÑã媪ªÄí§­­-22²µµÏÈ!//_ŠŠŠzõê“É”‘‘yò䉞žž¢¢âÍ›7Ï;×ÖÖòæÍ›sçÎõ]NaaaVV–ˆˆƒÁèêê:räÞ>((ˆN§·´´ „ÈdrDD„¬¬,'•ÿøñcJJJ`` á÷_ÿú—œœÜû÷ïBMMM±±±×¯_[¼xñæÍ›EDDÞ¾}kffV^^®¨¨loob·¾··÷äÉ“çÎ{÷îÝ„ œW­Z…wËÿí·ßÚÛÛÕÔÔZ[[³³³eee.\X]]²¶¶Fihhäää „êëëøá‡ööv„Pii)D÷]ψˆˆäääÌŸ?Ÿ“„eee¼k„P{{{lll[[þvBCC‰Yº8ðúõk&“)--ýìÙ³I“&)((üõ×_'Nœhooß½{w}}ý‰'ú.§¸¸øòåËø[îîî>pàÞ~×®]EEEÄ·*##3°ÃÁón:88àódìØ±kÖ¬éìì9xðàñãÇëëëµ´´Ö­[çéé‰ßÒØØèïï_PP $$dddtóæMyyù£G®X±¢§§§¦¦&)))**ŠÉdÖÔÔHKK³+!yêÔ©wïÞ))) Ý»wOLLÌÒÒòéÓ§!---„Ðĉïܹ3°£ü`žcœ\%¾øß½{÷îgÏžééé555 ©ªªúúú’H$\•J­««C©««ûøøxïÞ=55511±æææM›6™››³+¿ú $œÜý¿x×®¬¬444üûï¿…„„ÆL|ã111/_¾Dihhá•;wî¼}ûö„ ÆŒÓÔÔäãロeô|‚£@çüùóÄÔ• PPP@566FDDìß¿!tâÄ ‹„P~~~IIÉ… ðÑ"„$$$¨T*ëïvådff&&&âãèÑ£Äö111ÁÁÁ8Æì—êêê®®®9sækˆ@ÄÏϯ¾¾>00°­­-11±­­-88ØÃÃcÏž=bbb ¥¨¨(,,löìÙd2™Ýz*•š››»lÙ2EEÅ/^$$$Éd„··÷»wï|||¤¤¤òóóûí·?ÊÊÊFGG߸q#!!!**J\\\YY×GII)..®¢¢âСC¬‡Ðw=W®\YXX¸eË''§ÁÌwéÒ%¢ÕýÈ‘#[·nÅ'͇bccñ?yZZš™™™ŸŸBˆN§—••¥¦¦"„vïÞß»w/^‹/ÆÅÅáo9%%…Ø~÷îÝ»wïÆ¿‡Ä?ÿüƒ§ëЉ‰ÑÖÖ ÏÌÌ\·n’’RUUUDD™LÞ¸q#BhõêÕ¯^½Š‰‰ijjŠŽŽÆõŸ1cFhh(>(7772™‰Ú³g»ríêêŠJII166ÆñM^^Þ©S§Ö¬YƒŠŒŒ\²dIhh¨––Vww···7tØEìêó¹¾êêj__ßÿüç?¶¶¶Ä½'''‡u¦ººº:&“I"‘=zäîîŽW:::fgg÷ýñ±+gñâÅ«W¯VRR200ÀÐ uww#„>?9ª««ïܹƒÿÇð±±±AAAššš¡¸¸8™±cÇæææ¶µµIII±[Ÿ••õÏ?ÿ$$$%çææº¸¸<þüÞ½{Dù¶¶¶IIIøº£¯¯ÿñãG„ kî“L&Ϙ1ã“¿ZÏ[·n=þü÷ßomm@ûÇ‹/BBB>|hmmMü&ÈÏϯ¯ÿ¿”p‰Dª¬¬$ÂD{{{ÜÕvåÌŸ?ßÃÃcìØ±ºººøÂ7LLLLð¸qã222B)))MMMøF‚effnܸññãÇeee¹¹¹Ó¦MC‰ŠŠ[ZZЉ‰Sa(++O:/³+!¤ªª*++›````ee-!!266nnnF,m@Œ†s¬_W vÿÝúúúÄŸöööÄ/¢òòr""™3gëïœI“&ihh „DDDˆÃaW>»úô÷`[[[; P^^.$$ôÇ,X°€Ý‡Ð¯»?»»¶¡¡!ñ§££#ÑÒqÿþ}""qrr"ZtBººº¸1’õgW>»ú|~8}:ÚÚÚ{÷îÅíMMM¸pâĉñññ}¼‹CìÊqppppphiiyðàArr²¦¦&þÇ0 2™üÇ8::²®ïêêBQ…¸¸8ƒÁ`2™øOÖ‹XùÅõL&sæÌ™¬s˜ã+NGGBˆˆ<$%%qCH ¬žœÓÔÔܵkW{{{xxxss3>·´´´¢¢¢PÚ'Ø•cggggg×ÚÚZQQ‘šš:aÂ77·Áïîsééé"""‡*))©©©166f2™sçÎõöö&¶‘””Duvv"„ˆ¶î¯6z³+¿téÒ¥âââŠŠŠ«W¯Òh´[·n à‚ F„ÑpŽõë*Áî¿û“êõöö¬2ìʪ«V]]`'(J\\•Jˆˆ`—è×ÝŸÝ]{¨¾qvås|ýñr œPÀjjj~±·¡¡!15R~~þóçÏñrOO^xùòeMM ±=»rbbbBRRRÓ¦MÛ¹sç£Gˆ—p×þRRRZ¹reXXX||jccc77·3gÎ$%%á$,†'¥§§'''ïÙ³!TSSî„“““³³³¨¨èœ9s¦L™‚¯›ø%|½8vìØ©S§–.]ª££3$ xb´c^%ØýwWUU±^= ð²±±ñµk×ðraa!±žv峫Oá«»$@llìâÅ‹W­Zåãã“••ÕÛÛK4®;99-]º´¥¥wja·>++«¾¾>!!!<<üĉmmmø¾€“ûöí[¶lÙ÷ßåîîN$ÌÌÌB666vvv“'OÆUÂIœÑëW=qÏ›¯^l9¼û³»k?{öŒ5* ªmff–——‡—i4±žv峫Ïçúz¼œN§‡……á>îîî±±±ááá %;;[BBBVVVGGG»k׮ݻwïåË—I$’¦¦&Ñkeeåéé)"""&&ÖÔÔôêÕ+555„»r^¼x±}ûöÎÎN‰ÔÝÝÍú¤±““ÓÆedd$$$ôõõ‰(û«ÔÔÔ.\¸––6fÌKKË-[¶H¤ÄÄĘ˜˜ØØXQQÑ à$1îHxþüù´´4„ÐŽ; Ø­ß¶m›„„ÄÅ‹ÓÓÓåää qƒ§ÐÑ£GcccãââÚÚÚgΜ9sæL\%===77·'N0 CCC??¿±cǺºº¾~ýo"&&–­®®Þw=ýýýqÀáééùàÁ?,""¢¨¨ˆB¡àŽ{æææ[¶lÙ³gOppp\\\NNŽ„„„ŒŒŒ¶¶¶³³3BhåÊ•ñññyyy$i„ Ä?˜………ŸŸŸ°°0î6øæÍ<9»rjkkÃÃÉo™õ7ëܹs}||¤¥¥ÅÅÅuuuñö€»(nذÁÅÅ%11‘J¥ÖÖÖnÛ¶íöíÛ’’’iiiÇŽSPP055Å?ÈdrVVV@@€¿¿¿´´´¥¥eAA.ÊÔÔÔÓÓ3<<¼§§7«&&&þüóÏ_,!4nܸ?îØ±!ôÍ7ß?~œh›xð`IIÉ¿þõ/Öç¸ Zt†Õ‹/Ž9RVVfgg·sçNnîš Œñ¨òòò=úä98o´cxxe++«M›6á©ønÑÑÖÖæuE†———W@@@O] ^yÆŒ>>>8Ë+ÃÒ¢£­­MŒà•¦¦æO?ýÄëZ —þvu ¿FÛ96° |ÀE¡Px;Ä"+˜Ô ,t ° ЀÀ‚@‹«•JÅÓÕ‚QâðáÃëÖ­ãu-#\1FîGlüqÊ”)x2—ÐÐÐ)S¦àÉ•ÃÇÇgÄOàèèhÂb8Fªªª²³³Ã³¬ó›””;;»àààM›6±N=ƉM›6á VøŠ‰‰‰<‹mÛ¶ ù.*++õôôˆé‡À(‘––faa¡ªªjoo_RRòÕí‡ê<áŸóM ¯£™`DlÇÑÙ³gOWW—žžBˆB¡0ŒI“&q±bü"**êÖ­[x€mIIɯN87ïß¿ïèèø|9žsss«©©Á·www‡……ñÃÞƒ”””TRRB¡P’’’¤¤¤LMM‡| ííí¢¢¢C^8àOIIIÁÁÁžžžS¦L¹téÒ’%K.^¼8}úô>Þ2Tç ÿœoyÅÍ#è÷€mmm‘‘‘­­­ !„'ýÂ/%%%=|øD"utt¬_¿~Ê”)x}LLLmm­¨¨¨‘‘ÑWË ª©©‰ŽŽ¦P(rrrNNNööö¡Â¬¬,ƒÑÕÕ5ä“s±cnnŽ'³µ±±Á3 #„Þ¾}kffV^^®¨¨Œ+iooÿîÝ»éÓ§ß¿¿³³SSSÓÍÍmÑ¢E·nÝòðð`0¥¥¥gΜILLd2™¥¥¥ÒÒÒ .ÄSrZ[[#„444rrr¸shýõáÃIIIÖ5T*®ŽG'Ö¿zõJTTT__ŸX¹lÙ2ii鸸899¹ü±¨¨èâÅ‹ÄÉÃMVVVø;upp ¦š¯®Y~~~âââ¿üòK~~þ–-[œœœ„„„nß¾íçç§¥¥uëÖ-__ßwïÞmÞ¼944O íææF&“‰´frr2F‹ŒŒLJJ’PUUåé‘n¨¨¨hiiY¹r%±ÆÅÅeõêÕfffý:Oà|%W VgΜ‰ŽŽ^¹r¥©©)Fóôô|øèIº|ùò­[·jjjÞ»wïðáÃ6lÁ-péé顚šܵ··;vLIIéÒ¥K÷îÝ{þü9pƒ˜˜XXXXHHHSS“……Å•+Wrssq¦_çILL  óM0®#&&Ö¯†ü‘•Y‘Û@'((èúõëOž<ÑÓÓ ¥ÓéW¯^7o^xx8…BÉÎΖ••ÕÑÑYµjBhíÚµ›7o3fLkk«¬¬lsss]]ººº««kTTÔåË—I$’ªªª²²òÁƒ½½½Ù•ƒ÷‹3‚ ?þø#®Ï‹/¶oßÞÙÙI"‘º»»9ü\iûöí¸a-$$!äììvâÄ „P``àùóçÓÒÒB;vì(((Ào™1cFjjꇴ´´üýýq«¬ÁªU«âãã{zzÔÕÕB©©©xp===77·'N0 CCC???î'RRRŠŠŠð±wwwkkk½W¬XA¥R H$’ººº··7^¿|ùòäåå‘H$%%¥#GŽxzzâWmmmsrr,XÀ“ÃÁ6lØðêÕ+ôÿsÉîîîû÷ï§R©¡uëÖݸqãðáÃ!OOObŠé9sæ$&&666êèèDDD¬_¿!djjêééÞÓÓƒû&&&âÎq“'Oöòò¢R© ÃÌÌ w­‚ÍÃÃCBB">>>99ÙÈÈ(;;_ñûužàå#÷|È+Fß&Mš$))yéÒ%œºB]¹reòäÉk‚â·„€`D$„‡‡×bâ[[[ggg[[[nîôÖ­[ëׯÇÙS®í”N§ž:uŠk{ŒÚÚÚââb|*%%% ,À·ðº.@ðÁùö ._1,--÷íÛ×ßQ^Μ9³råJ“k×®Ñéô£GZXXlg/é ЀÀ‚@ ,tþËÑÑÑä3x„‰‰Itt4ëö S§Nýd3¬ªªÊÎή»»›{µ_bbb"ÿ<Ï3BH^^TOxóæššÚ'›a•••zzz]]]Ü«= à€ÿq/Ð9pà×ö5îî¨¨øøøøøø­[·²¾þɼJJJñññ^^^ŸÕØØøþýûŽŽŽa­0ø*„PRRÒéÓ§OŸ>½sçNÖW©TêÒ¥KYרªªž>}:44ôó¢ÚÛÛ‡µÂ`Äs €~áI$À½@§¾¾žkû}zzz:~)!!aÖ¬Y&&&³fͲ··‡Ÿzý¥§§‡²²²RWW÷÷÷_ºté”)S$%%_¿~­¦¦æãã3wî\Ö_Õ$iöìÙVVVŸ”cii‰‡ÕÒÒ’——ÇÓÔ÷ööÆÇÇ›˜˜¨¨¨L:•ulñ°°0ü“ýСC“'OÖÐÐ8vì~)22RWWW^^^WW×ÀÀ ³³s¸?0¬àµ 00<‰`ÿáèèˆdeeSSSBJJJqqq‡⤄èèè7n$$$DEE‰‹‹ã¹ˆ©Tjnnî²eË_¼x‘@&“]\\B«W¯–‘‘IHHˆ‹‹›?¾‚‚B^^ÞŠ+?~|ôèQOOOË—/ß¼y“Á` Ûq 2¼ //GªPUUMII¹wï…Bᤄääd™””$!!¡ªªŠÚ³gOffæºuë”””ªªª"""ÈdòÆB›7o–““‹ŒŒ [¶l™’’RVVÖ† iÒ$ÖíqàÁƒŸßJˆ$ 8L†=ÐÙ¹sgKK B¨´´Ô××WTT4::šD" ÷~&!!áíÛ·QQQÄ G&“g̘!&&Æa úúú8Z·±±!¦,ÉÊÊúçŸXÿ rssq £¢¢bff† X³f ±²²²´´ôÉ“''MšdnnŒÿ@¥§§×ÕÕÓ‘Éä9sæŒ3†ÃŒñrbNé”””¦¦¦ÈÈHb³ÌÌL|?~üÔ©SB‘‘‘[¶l!6PUU•••MHH000°²²ŠŽŽ–ŠC<çØ(D$š››½¼¼RRRŠ‹‹qà‡~À)HÖ‰«p@XøÓ{îÂ… «««BÖÖÖ! œœœÞÞÞ“'Ož;wîÝ»w&Lpvv&æo‹‹KIIAùûû§¥¥µ´´x{{¯X±!”••õáÃ!!¡¼¼<þ™+·‘À°:ÄippðÞ½{‡{wƒôí·ßJJJš››s~…â“Éœ9sæÚµk‰5Ÿ_}/^üÉ[Ž;öçŸ>}ú´°°°¸¸øÊ•+| ò3+++iii++«¡™LæÜ¹s½½½‰5’’’Ÿl³zõêOÞréÒ¥âââŠŠŠ«W¯Òh´[·nÁw*ൠÀ!ÞFºú/bB5 bý³gÏjkkŸ>}Š_•““›6m™L~þüùË—/?_’‘‘A¥§§+**Òh´ŠŠ kkk¦¡¡addTWWWXX¨¢¢‚xÊËËïÞ½Kìú›o¾QWWG¹¹¹µ´´lܸqÆŒ===t:½««‹ó†%€zòä BˆF£IJJšššë=zT]]]QQ_UPP˜={6™L~üøqUUÕçëBrrr¡cÇŽ)))]ºtéÞ½{ööö/^ÔÑÑ177¯©©ÉÉÉ?~<î_uçβ²2b׆††ZZZ!''§?úûûÏ™3§»»;''¾Ó‘αQ’#÷>ÿЉ ÕBžžžDk°——×ëׯñrHHˆ˜˜Xvv¶ººú–-[¾¸!¤§§çæævâÄ ƒahhèçç·`ÁMMÍ‹/¦§§ËÉÉâ–F„¿¿ÿ›7oˆ]/^¼x÷îÝ!eeå–––ØØX„¶¶vll,\­ú wï÷ðð@îØ±¯_¾|ymm-^öðð3fÌü¡¥¥µ|ùò—/_~¾!4yòd///*•Ê`0ÌÌÌvïÞ½|ùr´´´cÇŽ)((˜ššâœBhíÚµuuuÄ®W¯^/XãÆûøñ#®Æ7ß|süøqøNG:8ÇF9HôO"BÈÃõ?¿`°µµuvv¶µµåuE†N/,,—ŸŸß¯õ˜¿¿¿¿¿?ëš-[¶°>OG(((øb Çï£üQ¦€€À‚@ ,t ° 3² ¸yó&K À€FAΈgbb²sçN^×F¼y󿩍¨ðº`ˆñ,СR©¿ÿþ{FF¯* 0”””Føˆ w":GMJJ²¶¶f2™ÿýwPPÐäÉ“9»õ#шˆèlܸñùóçxÒîî*•:t_‘ÀФ®Þ¿/%%ź&&&Ï]§¡¡ĺ¾¶¶VTTÔÈȈX9oÞ00N§_»vMAAaHê€áÆ·‘À êêj__ß®®.:ž––F¬OII166ÆG•——wêÔ)<›|jjª™™^ŸŸŸŸ™™‰·?zôhrr²¼¼J] -t ° ЀÀ‚@ ,t °øâñòa’››ûðáC^×à#/^¼àu¸J`M›6UVVòºqww×ÓÓãu-¸G`^W<}t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ ,t ° ЀÀ‚@ €‘æÿ=qD>Ñà;IEND®B`‚mod_perl-2.0.9/docs/user/handlers/http_cycle_trans.dia0000644€ÿÿÿÿ00010010000001314211727205031023230 0ustar ????????None‹í]ÝSI’ç¯ ˜Ç“ËUYß«õlŒ711ë˜õÆ>µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)þkÓÆpZœ´5&ž£6ú>öFâÀ ­v¬Û£J'J^j·Þ$ã ˆ²-åæ»dg&ê¦ÑñF7CÖÍ×»S†žìÖ(€W/‰‚¾eµJáÃ6¬ÖöŒe£5«âST1öåBjv]$¥2Jíñ¥Ù’2v`­‰6:ƒW ·F/êcÌêøzÕQɾô-:n}D·7Ç Âvô±=kywÌêø$uT}¨£G™ÜøU¸d¹3nÜ5ÔHy[#µÎ*ùzU²s*ŽP[€Ò\€3?)A´%%4ð†¨'Þ7#Tô‘5ë®&›(§´Œ´ÑhÁË«œQK¯¤µÿSYUŸ…ª~*¾¯ªtµs.Úz2Æha¬ÒœºJùD DJ“9[êªlMyE÷呎5ußoªx»³n£8îby1Ÿ-‹š¹êJꊔæ³UAzÿðóè|2½¢‚‘ËÅ„Ê"ŠoG‡ËÕÕAüþËK|(úæý|:¾]²ñôs«z:‰»’ø$ilCnjë1¥ìFh4œÍ΋ê/³˜]ž?íîUÒô#¿OfEŒtN;R¿8è‹SZ{NAJb #·|܇£¢ìdÛ$ñÓùlv\ÌÆ‰£V|>` h²íá/ ÏéÅæç©ªj{’%0‹ù·Í ßÈ*t¼òñ´˜=¼÷›»;Ûà†ä£ÖFKŠ$(ƒ¨1Ë{;ÍõO¿ Ž4£J­æ”Ègo~¼Y€XóËjýËh‚ßùe}¿Ênã#õ„óÈG3µ›Ð7Ã(\‚oc¢£ N%@ÓÕqÃ@›•¼Š!Á€Â˜aàUÁÀ¦&›§À€1wYn :'Ziz¯…Þ0ÂRB‹Ñ'ˆÊ 5R”:&ˆšjÙ¬XІƒ¡ê]MUz^™5j­^M…rë}Çí«Y„ {¯’&£e?+´M cƒâÖäZ6+–âç’¥]¯‚ŒY“_—&›v½‰wú†º0aç|0ÔCÖ”iŠ;tT„ÛöDm›±À?¾¨ƒ¿Î..W¿N¦+¼í¯76(E¬ovÁ-¼+”9DÈzÒÐ= Üen #>Þ$ù£øßËb¹:øûå*ãÈnpdC23p tNÀÓFh^(Ñ肬¡D[S»?”¿£1Þ÷ƒÿ:x?_íK6¡äE¢È=±Ì8Š#Ý›ƒ)á#…䌈‘7M‰g•”Œ* úÒDi;´ #%û:»B—ZaÍ(Ê2“!55ðÄ}A°f'‡DÄk©ó ýÛãß{GÉÐîL— ͸™q}4aSV¹A*(mx+2F¢$£Ö)ÕBFIÕó uÛÎhÍOfêø¬¯µÇ¥¦u­}/'3O:Z¸>ð»Iú>’ÿ@:Eå0ÒXàMþSÖFª‡‰Ñ•Ö»T‡£¤³ü¹ÕlV,ÅÎ¥¥Öé]HbOÂa{e©v‘_4J)¢aå…Zï‰0Іç*&+“B“`ÐÒý ×Cª *oºJóV % Ô ›õ°,ª+e#ª`5›õå·¸RíÛæ¥äŽv/߇!´§–20ÛQJƒN„dp¥:C¯•¶f vT›õbˆ ÷Ά2;’ÂЇ*4sqƒÊjfsÞ)M]7¢~†:QvÖmA +ù¬—CZ¹orw$‡±9ÔhR+%bžYƒu‰’ a ‡@K¥n;ÆâIrXÉçCNãÞá¡ÝjÙ‡: ¹ÛƒDmz°pÒ›Qó$¦X¼BB=®2þèð‘o"¿…SÍåC“Ÿ¢k=ùiw{™Þ‘©Ýù¤o{šcIµx¼ùxHÉ8€Ô=l5ÄM,Z“êù½õŠYk­ÈÌÀMVÆ´TY§r±áFªŒw½Ø°%ÅvÑl·›ºû¤¿îÒÓ¥H¶YøÆ!Z‡Ô‡Ï;5ê”YV ;ÅÝ ¨–ËŠ¥Ôq^v숫†÷µj¸þ<  f¨óN»­:æ’?#ÌuÉŸ§ê?·I¯?êtruÎöjü\®ÍéÉ)ýu2-–WËUqŽØA/ª°£ó¸ZB4´¯KÞƒH/À^SÒÒ#z© 5 DÅ:d¸&›4VÂCÐÞ™…è8磉# ÖM‡[ms§h>¾« (Qˆ‘&_>ØBxS¿ŸBâód:m@bìéù,º?t¯ÒîQo3Ê{&Ne0òI÷o:¹8þ2_Lþƒ[Úhú sŸGÓeÑ "ÚjrÚ‘žl±Î‰A(^cÌý¨™ŽÂî)V6fKlk–ئ fSŒ8LçLÉ oÔ.ýk_Z-”¸‘;-ìAdÆžðãÃdy:Gðøøáðo£Y|tN BýÖ@>NjØ€J´“Á)i ÉëIõa”Ú,Y5õÃfWNS‘£3ÑkŒÁpÎO3xG‘-«½6ÊÅÖ³_©+÷9=²+÷z\¹Çµ{G Ž`ÆðvÀ²ŽFPjtO]°œ•åù¸Í ¤¹Ëš4#è †Õ¤'˜Îi³VX×÷­Ój©EÇ–R¢Sz‚ŒCjJjèp!%(pgÕòùÀQDJPÈù ¯+?Áuèj®GWóW'š ˆ;KD‚é£âl1Z¡ß^¦‡1Âå˜йî1€ DI!¥aR8™œTe;6™&ÜÉfÇÁ‡èµÓZZ¯Cë¼¼f3Kû!öJ-¬Ó@Ïla½"õIÐj{è³ JÀ‹†¹Ïj€˜FÈ ŸUöYuV%hÍšÉÑ “Z3´fh}=ÐÚ}ÎÞuytªm•x³€ ë!eª)¤4´4^R’œ2Ö±Fû`2Ck†Ö ­/$.øßS¤¾¬ úúUÚTÇl%@äíXiM¢d,R‚ÖªHM8¢i[„ØÐZíƒÉ&êD”ÑÒ9 D+­ô‘R=‚à‚ò*ͱ”É oÞñfŠÈ=*>Ósë6C÷Nsוh)y»Ò‡à®#]q¨ÑG¸ŽtEÖHWLf›!Û ÙfØg›¡I©’éÞ3ñz"0ΰžXtÃJJ´™RÕcjzˆªo©R/LæR¥\ª”õeggØÎ‘Àj蔊ÐNCêýšr3´VCŠá#¤Ü m¸GÎ×qùÀÙ®ÔÚçÜŒW•›¡C—Þv7dl÷Æ«¶œ›Ði„J³8 R2!5^uÖ! á¤JSeŒåŸ*SÇge³K[OÌ`Áf暬wšoOo™e»\«Ç Mw¾öö@í6ÑÞa­'¬€°ÂQs¿ÔR^1cX°Ôš„*B¢¬œüXQÍgu¿Cg¨·"©2Td¨xP¡û€ŠõÊ=uŠ&:Ò\¨Á Ks"×[@ŠJ6+ÛŠÊÓ\hkîd¨ÈPñÌ Âô°-¼,Gá(É$…U6y ´ÞV@3„°"¨rŽ5*2T¼¨°ûÑÅ4½Í«ÒªkJ«B›g:Êr¬œÌfEÆŠ‚®ÏÀ&°"—&yzÌ e£NXããšáQDA9µmVPŠ Ï (|@[ U¤ÞE1¨!„(DÙJØP@³PÍÒª à¦Ê6E†Š—aÏ@b=¨BŒdª`ogñ”ó(L”Š>§‰>#EFŠÝ"E§1@ž£ÁF\Š}â\Ä; óX’«£ƒO°m³U[áÒãa%}N€˜f30½ ÆuNúT^H]ùÖáʉTŠ˜ãìGŸª” { G ›Õ+ONXˆ~o&¾_§-*èÐRjsÇs}ïxõ¤®ÌÅ-Í9UVâÝô‚OU8H™‹ ) þoiL6)¡~* µ’@ V5k}]˘ÂÉ|1. »g?CôÎѧY½ˆIžžQÒBãÿ<Ás,)»ö”·9à_£É*Oghû_+ƒy@/àñq>½ª3ïºçÝtÈ¢6^OP‹Jœ°FS„Ê É¨Ðã’¦5å ¼7ÇwuLV.•Í—Üþ!ßöýyÔé¸Í/²×é<•bÓ=ý, ¯´Á¯ÝxXÍȈ‘(RJég>z”MT$˪0u}úxp=(ñÃÕé´ÈaްHDæ°H/Pò~þ½ I:çì8Jz‘Úhšu2³ŒqMIyÚ¢§>'¸;Ï:Í«&›x´[})ӯ뜠[+Ëñ)=ŸE§~”3ö œÊ’±Š›®a5‹I9åšÕþ‘r²*ƒð.zfåìÎdVάœO3Â}÷\²xŒ(ª“¬É"?(i@JÃ( Òk¶=åmá‡n²,~/¾ÓlƒsØàuùlp¹{¼ITcßÀŒàÄ’†Ö! ­ðüQãã|¹ú£×Þûî1#l‚Æ›÷óéø G…fÌ`Å è3ŒG Ý Öä¾k2VXGC"=$šmO‚· Ÿ£Ù2ƒ'hTH`Æ VÜÐ=à†Cï—úÊhf‹#QòÂ9¤”ÚÄ—”c{ÊÛ¿.>Íÿ±š/FgEÆN©–È %¬PÒÇ´jk©c8^A*”w5'b"Ü<¢çR,>ŽËb‘у=î aFVä°}!ø¥wÄÃ¥&ò0B'‚{öøåô´XfÇ…×àØ”¾Œ¬ˆáz²5 {´ƒ¨èì0£ÔÚ=ˆuür¹úRÌ2fp›&Ç:¶¾3ƒ²á¹ýGÙ·äŸhA9n/ü‚ŒÿdÄ`µ26…/+`„ÃSÎX^Àð”í”ÎSRŠU°{pš‚WËhÁ‰÷$/£+ZÄ^¢4Œ– {$·A”¨R5È1ÁUB¶¦¼Môøuòýò"ÃoH£J3†pbHèžD ɯDàW62"H†lëlþ ZÓÜ&v| ìàŒœ‰£ÕBø°ž/v¨°C‡„ùš<™ÉúpküXÓ{ ¿ÏÏ2xp‚G¥fôàluúh¦M©’Û(ÖÎ>T3î QR2RƒH©¬¡s|©ù{VóY¹ÔQyéežìÀÐùytšØhO,½ÓÄS)ö„Ý;æ¡Q¼']•`€%L4¾T¾²¬V1Й›Fëƒ%êø¬D‰àSoe uÈ ±3è2ÎMµ;Í­å–Æ9Ó$9iÓðÉžÙpq>Ù)>š„HN‡ÔÉ œ~Dªf³r)Í—I}Ó|ÈÃë2$í'$éA’í’¼öe²o_rD¤4LÓïƒ#Hò^¥–ÖóCR%›ÕˆdMÙŠRZȈ”i/Éì‘\ˆT(›®vÉû²lŠí«Uêæýl¤J.«I†t&µ22 í% Ù’ï¬ó)ñÍ8ÏH².$BZ%DrRÓé¦QmŸHÕ\V‡‘lùÁdÌ&RF¤=E$·#D }8mÆ'´Þò’¶±$d”ON[ŽÎÓ­òq N[›•ˆd-Eà£PÆe)#Ò~"’ß"ÅIz[Nðãx!I:";£MšÙ(•Jù£f¡íj>«Ç­ÑˆZjtȘ”1i/1Ií“b/‘ƒM¤‹šw榕tŠ…”ŒÔ4jB§0H½¨·0¹’ÏŠ¥NDéSš´9 cÒžbtŤòõttU,~>(_àŸ³Åèüçƒÿ¥KôØummod_perl-2.0.9/docs/user/handlers/http_cycle_trans.gif0000644€ÿÿÿÿ00010010000013362411727205031023250 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§¥¥¥f«5£££ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuu"sssqqqooommmkkkiiigggeeecccaaa___6[Fv%]]][[[YYYWWW  UUUSSSQQQMMMþþþKKKüüüIIIúúúGGGøøøEEEööö?j!CCCôôôM(AAAòòò???ððð===îîîììì999êêêèèè555æææäää111âââààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨¤¤¤¢¢¢   žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||/zzzxxxvvvtttrrrpppnnn…ßE3F*llljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷BBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&××× ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËË ÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠYT©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœUÝšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=²‰#ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒî—iíA& d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ("5PX^gÂ@ ÆDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜L Óãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBb*L¦þ¡ÀÌ©´Öjë­™¦š£}*Æ!²¼*°à銒ˆ© ]¼à†˜0à*í´ÔVK§®Ã­ŠÙ§‚D;äLàICãŽé­µè¦«îºRbû¯Š} E@¤$4ÀPÃ$D¢€Ì+0ørH¿ÿ<ðfœC ´´:ä#0¼,± ©B0dü‘¢ÈŠ$¾úò;¤¿ üd¹E&¼pÃC¦ð -‡³*3ìð粫óÎ<[ë®gð&öi I>â‘L@äúˆAN-E2í4ÔC’’‘ ADº‘‘(™óÃG™ôÒM?}ò‘Vc}p+s )ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§2$)‹‘5yn΋YEÆǵ‰ ØJê}x‘•‹Ñ¸“(?+ÆãK>$?© yÂŽCƒéŠû-ûì´#úsgA#&oHnNdçŸãûE$I‹’a©9âÃ{¾ö/¯$-l˜s<‘Åg^ûöÜw/çíœå~اôÔ’ŽÜ?¸#$žɉÒÂÇ/ÿ¹¤\‚$&˜ ‡%Dæ@F’zcŸûàç<ù1 eÞª_’N$¢H  ÷&HÁ n |›Ÿa|õYdÌð Ò$fˆL ¬À†Ä l¨bH)\a _(p|€¯XÅ@$OÜþ¬ð9ˆô€Z¼@£ÇVld,u"$¡ ‰CºIËÂXÆfUÃæp‡EúŒdCê‡b`¢aE ºñp41£ÁÂø*ŽxÌ£÷¸(>éf| ¤ iÁ9^¦Ž„¹#!ÉÈFîÌ–Aä`éÈJZò’§‚de$)Jbò“  ¥¢4INÆ“—2€ VÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbs—ô()'cJÀ ÒRpF"¦IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvº3œè°©–)™fþ噕þ’À †ÁÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÑŠZô¢ í‚1JÒ’šô¤(M©JWÊÒ–ºt¢U&à²Õ§m2T#}©NwÊÓžúô§@ jJc:Ï™¾Kp– é¤r*Ô¦:õ©PªT§zP¢rÔ¨@Cje”*)¦Rõ«` «XÇJV„ZUT…ÌGûÂÕHyµ¬p«\çJסn­XÅV)ÓVE½µ®µD*rØÂö°a=k¨Òú˜µò¥¯‰úë0üa  #Ö?wŠTX£³?Ølg?›ŠÐCŸ=*N±Œ‚†Â³¨ˆþ†ISØÚÚö¶=U,¨ëÇ’ì0VÐOâòsü4®q‘;Üä·Ÿé ÁA;[ÜZ÷ºØÅ¨nÿæGOÝTÂ¥.u9áÜax€Ÿäm®yŸÛOWL Mè@ RððSÚÐìi» ßøÎ·¾ÿ¤mvLàWõ®‹Íkøö:àJ¸?èliJÝV¸¼Ãˆ€#ÞûÏM€¡Ÿ•À?K ~fÃýô0ˆEÜOøÅ0.ðv]¥à 2X26TxÙëÏ ó¸Ÿ> PêÊvÌp*V ~šüüú™d 3ÙŸ.ޱ–·\Û_Š·ñ-^r\¨cøÇ=¦0þC©‹ ~êb ®ˆÂ2^àÏ74Ë\γžãêeKY1b¾ ™ efõ¦9 >ö±A©+à 4B y¨$þàOGßyϘδXû\©?'&Ðvô $ ‚Ê^Ö'?ãàÙTX¶Ÿ¬þì«OûYT<ã ¯%í`ù© ¸â¢˜Ä:üi \ü³×¿ö°‡A‚TT¡³PÖ´´§TNSÊÓˆu]D-(áRûÛà÷C­=)lFÛtáv ¼-îL'ã ˆD°I8 ÞPB»÷ÝOrKÊ܆A÷\Ô (vó;Æä €-ÎÀf°–ðD ^P„rÔàÀ‡¾áºŒxüã ¹ÈþGNò’›üä(O¹ÊWÎr‘c þŽÀ¹sãÈ»Ë*SYÿúsUC< .„üS¿ù÷Ïÿþû½ùާ~_6{‘T{B}дOðw]ÑÐ@ÏÐÆçxÉ€é'SìgSî§€ ˆ[µp vt R¥¸‚,ˆzÈOg;¸IØ+˜O ‚µÅßÐ i‘^!¬‚Ø‚Fx„€÷‚Çyƒ1yqQywò~:(VÈ`Ua±€Sq±@ ^!X! V¡í jP¥‚H¸†k¨„Lh(N(PRh'TX…_%m UÑPÐfW ˜UþjȆ¬W ~s ˆˆç†èg3XJ5/7(R9ˆ‡€5 ¬``à·@ #p Œ Tñ£@*°T! $P Wñ U@¶(SqO€ˆEˆá0xðl°z‚ðfÐwc0÷ x|ø°Ž˜Œ±ŒÍȆÅxŒ|'‰}ôœxX+ ŠUažp «@ˆœ WŸX$€„hÃ0¼øwà 0@Ȱzàˆ}7?4ð ï°É÷s i©ˆ ¹x胓Øi•ÈL—(4™¸T›øsµp§ àf`T± `£ ;`ïxþñhz ððŒÀ‰p `0 y@òìP=ä@ÞàÙp V r– KàP‰¸w‰€X 0~Ðw˜1°w]@€@ {×@X` À{—ÐÀíP ðÀw @ ï0–†ÀwZ ã°[P )—ti—x‰zÉ—~Éw×–~IãÀˆs‰Ð“Ù—Éwg™–k‰m9o‰ÚXT8}Þè‘€u!i§` Ó—€ Tñ î@391iÃI|P~÷`ñÐm ipá_  Y@ Ðþ Ì êx € X @ +p`{ð+0 r@ {7 =°€©0q9—ì` ïàXð€pñg{' õp+€ ñ° {癞ñˆŽùŸ: z  ºw+LÐ Ú %ðŒŸ¹÷9j ³€  Šî ŸòIŸX`Ÿø©ŸüùšW›Iµ‘]Õ‘´YV@p%° S¾9+À}b  0‰0À}T¡t@б 20 6Pl;à BPÂ@ ÈðÎ U` [Ð_0ãêÐívpùЈñà™5ÀE€þð«°wÙ@ m XPd€‚ÀwÙwr)ó lù(Щ9œÀw{©@ X0€{§EИ‘©›Ú©(ð©¡ý{ÇOð™ÿH—X ]À©ž ª{ç¨*©” Ù8‘KX‘×v‘õ”‘º¤n%¤C*V€ HêSq J:ëÀ I Â0Åp  @Ð`‹›PüÐ #ð “වȠíW@zµɰ Q Vp ÙàÞ@f€éàî0u` p |ðÇÈÐ|' à{§õ ûðËZýÖþ"‹û`,°wÀ§Š úÀw«,ë²{³1³ þð±¾ú™ÁêˆBK3;²% '›² {Û¨*Ò÷£³™­eµ1 o° {0 Ýð°QTY¹´*‹ {w ¼0Š• ø ?à^¹´òàwŽIã ŒjÞxmpú° \ùˆÀwŠ¡sI¸†‹ˆûwp —_9tùw°w=;›Ë¹y»·}û·ÿ¸Íjµ°ÉÞµµ\+V†³‡˜ˆ€ÇÐÝPbX°P/÷SY¼€Ÿ  |÷©EÀ U °w¡pž*þð á ‰‹‚ ¢¬°íÀpŸ­à¼À™0ÀÄ (‹å¬À %û €Âà¼ Æ /€äk¾è«¾ìë¾ð»w7I½A—‘++@ èë;íû¾ñ[½Äp½Ù»½ÝËß¾<ŠW>ºUÖêWØZ»QeùÀOyp¿p%  Ãðæ0 ×€ € ËSY)p†|Ç#Pù€ Àw 1;Eð}m°]° nð ÃX €ÐXÐÔÀœ_0 £‹„Ðý€›¶Xà *°ýpÂÛáÅXÆbLÆfŒÆþ»J k°W` J›êó0³~|gœÆOÅS\ÅWœÅnP vÂ|•‘µÂ,ìTuœtÖO²0®t‘ñp K€M`baEðÊ=Õ¶ˆ„Žéš,{œÜ`ž\ ÊAå ï7°qüÖ ŽraíÀ%o@>eË·Ì‚up é¹ü·ËЇµÝX*w(Ì,õ Ö Ë´ìOfÐ bP‰ÀOTp•þäz‡(ĽxÍ-h x û<~Þ¼~²Û~âÌäÌSJ    GPbÐ# ¶nát ý´ÒõO…ýàúÌÏ"Ý=€½Œc¿üþ`Ð:µ`d@PV [la¬pôàO ÀÅ ðâ°SÖ<ÒF}~°Û£íÍÒN•~hP  0 h1ð°ÐZ¥ŸJ N SE}Ôf­x%M‰'ms)­c+íÔ+u èúuPÏÀ ï  @ÑaÁ¢ 6e kPdÐg½Ø‘è¬oX(qsøuX'ã ×% çIÏ õ ` m ‹ \ @Up"@Øåê@PòЀP/UÖŒ}Û—Ö¹ÖgG»˜½Sõàå ]0–6à &à ¬XÊíþ ˜„EPvÙ×àR¶ÛàýºÎwµ“µ(ìÛ¿íRâ`pµìp P ŽpøP¼u Þ­ à>à^à~àžà ¾à Þàþà.Ž ­å&­E­ãÓÖeöÖéQJÀ 0 N•Í`PV°-µ ]×â.þâ0ã2îtyÔ&¼Ô²ÙÔþRÁVàTG@dåð?¾ã;õ؄ـ1ÙnQÙtrÙHÞP\€âîíT1à Åß±0å:¥äƒÂäáämås"å^®PŒ¹tµ ÷ æ,æ‚"æ~Aælaær‚æþrnP‘ËZîTX€†Ô_ÀÙ}~Rt(vÞx¾z'|žèu h›ÏNµ´ PÅ€¶•@é(µè€Òè|ñèjép2é þOe Pu°PtÐÝ«NR¢ž'¤^¾ANhžë&^Ì´mXøØ Ä®]þo®V¿nGÁ>jþìu²,Uë å |°‚míµëxÒëxaêiêo¢ê¹NzìUKp^½P*l.î0Õì2÷ìí‰4íÝVíúîO2]UÓ@ðü¤/Ìb%u A0ñ_ññŸñ¿ñßñÿñ òÏ6¾þÉ8®µ:^ð µ~°f[ ð¨'…3@6ó8Ÿó:¿ó<ßó>ÿó@ôB?ôDó!0áäMSáL*ìꆜS%1íPS0&…Ü@ \ßõ^ÿõ`öb?öd_öföhŸöjïõ¦€ô± γ›ò*PpÐzPbRõQ›Rõ[¿ö‚?ø„_ø†oøm_ò¼|òç-÷soPŒyT% x÷PQPÌXORZøœßùžÿùiŸøãýöå½ô£Òô}žv‚×åÒÂPR›ú²?û´_ø¢€ITæÝÉèýø0„S5‚ QÑ€âö ù_ûÌßüÎþÏön¯ÔpoÐLÏðÖß>õR¥»(Q¢Ù}Q±ÿüä_þŸûHúJ÷Õïû… !þUî0 ¥zÐ;,þËoþüßÿkþ1lX—b D˜PáB† >l(,Ð-Š-^ĘQãFŽ; ÊãH’%M ƒQåJ–-J¸!PæLš5mÞÄ™SçNž=}þ´f4:âEšTiÍVZ-µ‰†%ªU­^ÅšUëV®]½~V¬USjt™VíZ1M¾…7#H‘ríÞň’í^¾aBXð`Â@+8RX±-ÍõÃS°Ô±•-_ÆœYsÙ³û~þþìïhÒé–FýV/hÖ{ÿ*†[ölœKÆ(Dðs‚}Ø4yªV ƒ,¥YùræÊ9ÓDÛZºKÑ©­Ã=}]»ÆÕÓ½«|­[üxòB øV¬<ÒK pæØ`ÊÄ´0u?òæýýÿÏê¹™¢û®@†ªÛ.Á²SPÁî „¡ðÖ£°B À 7Tâ ¡o¸¬Š+…D)é$:ɤ“äVœA“N ŠL9§E«"‚ ইtÎ,è<‹0Id’"›¼îÁ$!œpC+¯$Ìê‰Ëä €° J‰b–8¦‰dœpb8DÄ sJþ Ä9)!¢8ȤnhtáœN‚᪂ Ï ¸±¸A[”HI/P&§4pI(|rSÔ¤Äô»*½$µÔŸNÀSqê`¢±€xÞ‘#:æ±£<îÑC|øØÇ~9®XfðêD«å¯*ˆBÏØQYGƒ@ ÛI·«R. Õ;M=Õ®SrG5\éF]µ]wjâæx—¦ö(ìc÷Ý~ü؇|z½çd»RÖÙ:¯BàGã¦å/á Î)"¸ÅØ+oBRÝéÆ=75sC¶+]Ac·^•±T)VžmÞÁ‚Šh¦x&Šf X†Ídšþ8f‰b”È©>®¦ iJf˜Ï…­]˜’g))Ñ šÍ8k²Œ°ã“Y™dÒF.“¿æ+e˜×^O$X[‰Uˆ&ŒXAÌè¬JqAÏ.¦ªïû‚p?F£¥[=ƒ(¥=w€A½SkË©Ú\´û »ì»Èö¼¤³7_Km¶O§ œ~ôxfm0ÐQL TLï831NDˤÚþ9'B°‘"À}8"fÀýSv¼Üò̽&}¯ÎC tì=½z—LG=|Å>@¶¯¶iøðc›¼áŒ>~ù)™ÞûÐ&Ú¾4íóߨ{ûWŸø%„a `þºÁŠaÜ—xßü$¿úýÏzøã^ö—Á¼¤Ä‚®‰IEH}ÄG=ks½ÓZ ðF'8ìUðƒj¹=²AVÄ7lHG8Äž¬£8ÝQ'ˆcMxàÛÑЊC²![’Ã.($]ɵø’ÑŒBiB;ÀŽÓ@2ƒ¡Û0ºÑdáI©âõØœ,ŽQ%\#FxØE1úñ Bþ9Ê[ ²‡…ì$"UIÄcÅ §cÄ,Ó%Ô$(¸¤.y¹Í°p2˜ æ(©CdR™Ëá ¡:qàk0É8¡L΀7ÄQ(˜äf>·âÍo"$œ 'ËéÇs¢3¬Ì€AwRˆ"Ð ɃRð©OŠn­3ýô$‰¹CQnô"cA¾x¨‹Ac Є ¡åLrã4œ#7ÅiNuºSžöÔ§?jP…:T¢5§Üðå·€‰Qƒü3Í Hµ(Ò‘ž>_PéÚŽq'èÆ€kH:@ñ…qüd@kZÕºV¶¶Õ­o…k\å:WºÖÕ®l}摘zþ zÔ‹uñ«K¹×„Pµªkcî!€Ó5a„™Æ4l²˜RÃ8Ä8¬"5GX§‚ªü“* ›Ùz)A ©iiâÔ„ 8Ž”¨ÖŒ›Ýkg»øÙü…ö†£µíª aœÚ²Í ++8B~É<`ˆ^ÏÁ"n™ªÛòv{¾ý p±ë¥l¨1pÆé`Ød£û‰jQ T„•‹¯µ‹QîêлØ¯Å›ß YÁ`Æ4`‡x®Ì \ Ò!O€D>ÀÈ€p¿ýì/ÿºÿoÀ^Ï3˜ÃcÜ¢p¢m;`‚þ™dýhF(™ ‹ïÃß qGì¹ÛïÄ=Ï2’€/4ƒ"¿Iê»®Â$‚Ã3© Ñ‹x°'’aöã`™C.[‘½wd1˦ =ˆO5*"ŠV®ÈÐM´,ŠØhóéÈlJ3çÍbSsõØèÂ,hC7,’Ô`mQ8Š`î ›@¢¨EàÓF¯mÐ,ôöM²D“nÑ¥Œô%r\D Tí*.€|Ú·˜° k•Ú©ÆÞªCÖêͽšØKAH<€‘!ô#M€™ ê0#'€î&l™Úg¿ËØ~Dvè”}.fþ£ÍÙåŠ>à ’q¤âõ¥×³o ¡<Š€oQ¢ÌVÔÂàGx¾p†7Üá‡xÄ%>qŠ'<Ìçcº=·nrµûkï†wPœ@ˆ¼$v¨…"–Q $fÙpO`AžºkÊ8< ž÷Üç?zÐ…>t¢ÝèGGzÒ•Þs@4˜c„g_+ÈŽNÝã'yÈË$cE1¤½Az‚D!çsÀBÚÕ¾v¶·Ýío‡{Üå>wº×ÝîwW{?œŽq-j¼l÷ÔÕ=–u­% AÅ#zpä`e Å`àpGlî Ê8ÐŽwÎwÞóŸýçõ®W¨ûþSêS%`­>ØÒ‹ð…ÿ @²ía@Á®`ÂÊ<  ý 8{è…?|â¿î£ïZëâw±~S‚W×ëaÏ“eäks˜Ûå„k¦ øÉ%À‚àßüçG¿ç‘ÿKå7õô¨wRÕ ýpIú:ñHÈ?^dà’'wm(¿ô#À4À¼Û»¥Ú®÷ƒ?çƒú û»?œ¨08•Q‚wèªÀ˜† ì‰&¨@ ¼žÐ¼4Á4¾õSªök D=lÄ œ@› ȇeoH+ÁðŠDÁ!$BÎSÁ§k?æ#dœ¬Á™X=`þ n À›Ÿ ± ܼ"Ã1|»#ä; RÂaÂqÂ$Â(w ö íSŠ.pƒ €'ȼ0t»Û †´»†quð¼k„}ñC·)–-‡kH;Ax3 Ãá3Cä/œº5tÖ+½7„ÃI‰) V`Áh ˆ†Õñ@\D¶Ó@È,@ I¼»D¤ß“ߋŵ#9P8D,p€y¹DáËDLÃsñÄiÃÅ(th­ð9ÿSŠîCŠ,€ˆú !|»e€À‚ ´Kbx?ÈCH»- cЃw8ILDzXÆ9þXFxÀ-ø€qGP;J€´£<È, #ãRH;‚4È,@È´Ç·q>@†tÀ‚wŒÇyT»GІ}@d€qH»D€>h‡ZHÐ{Æ$äÄÀšÆí¨F*A%8Ô 5*ƒS ù \X® p 7Ÿ0G·[Ff°ƒ9Èi`FQ¨‡#Xlˆ‡mÀ àðZ(,9‡ €w,€ †¸‚ I»8ðgˆxð7H»I€3X@TXH·„K¹¤K,ß< qP,°J¬ÔJ® ¶/XÙ:",x@¸‚˜…x8ƒ¶½„Æ›ô«œÔŽþ4kœ@»¢D˜ ŒvÈ* €h¡žx-(‡`T»ed@È‚|8ŒÍÛH…G‹ƒ´[ƲÄ^ˆ‡‡dNfL;x„UH»l †6NHP£:Le¤Îê¼ÎìÜNéLDhXÄãLN£À‚/È/H;–C».xÀOväš$M›„?@Í(E¨cÍûÀ3ñ¹fÀv€p¨NTp…YÈ"@iè‚rh*<9ßœÎ9¨…Ä‚ ¸¹vœN|H;®ãËU;€>P;I¾Ì.Ȇð„qPé4ÑѽѴKÄ;`;=´Û‡P»`Æy;þàOÒS¾h$—µÕ,¾€˜ ŸC0À`‡WŠ%À~á—yhƒyQñœƒA€0Ñ6¸}زۼeÄ€´‹=OM;|D^˜®<‚,NK€u˜NyX;CET,¸EåJ,èG¶ÃS=åÓ÷ĆnH;B»0ø‚dÄÄþ¼RÓô(-M .•žôIÙÐP„rº¤xo )\ °€XC}€s+ðÀ¦l; ­EÐL8,(‡p`^¨x…FÏ} 8£R, ‡øË P;v,V¨…´££0`Z¸‡0ÐEø`VþØv RvuWxM»Pð½@R@ƒ´ËÖmíÖo­LWX1f ¶q€ 9ø€*M>ÿüOªS½ùPÂòRØ{1ŸÚTŠb¸‚dP Tá„rŒÓóB ,¸AôÀBèȰGØñ´w ƒà‚´3>0ŽoP;.2Èl¨µÓ…+È>°_ðChƒ}è‚UàK¥eZ§U;™ >0€´ÃY‰ž•€.؇qøÍkjȇ{ø‚Y@ÒÑ´ÒÖÃROÕO Ù½Y­ÃY±C˜Ñ†}»x8 ZÍ h¾ mFá#;s@¿šlÕŽõØÿ”UïÜ#¸ bÀ4EŠþ¬¤°xP˜5¾øJà‡Èõ¼90€;`†ô³\½uÕêÛÒØÜéè\x£,1 ®1`¥(èV*`Ê8å¼o‰~°Ùí< €.<à6Ð]Vå]̽ˆß%à]Æ­ÕÂ`9 *À6¨X[ „çµÞú=ÁÝ-½½ÝñE—¿eªá-71ÅðÁ¡¼°‚a0¢¥Ü ǵßNAïÍßÞ%&þÅ òm &¶f°6–OP_¨˜”ý võà:*ƒEfáóÃ_¨Ó_(±à»À`ÖÐ`X@j¯&,HŠ(@ C]§ná"^Õ¼`ðM=Íõ_ŒºþáRs„ò °Þ kØTHkàbÚ†-îâ/ðâP…SÐA  Àx†Œ(=ØÕ›p`#Æc»{a΢`q’?¿ªa”1ßó €–Š EˆUFfdGVàG^d™H -xƒ+1Þ“‰ÛP"ÎãQ¾»=έ>¨?ö¨@þŒ'f4 !„ `äIˆ—¥e¨eJ\ÖeP•Ÿpƒ V aŸ ˜ 8ÛB¸cRvæ¶3åT⊘á’iâ~rå@;-KŠàâT㙘ešç^ŽG +ˆ.“WøQ~æyv»hÞÄiþŽ¿äkþ¦l3*€y(Üœ˜år¦åš0ho>„ `³[Šf@< 3F A_¨¸æèŽöèþè¦CbFå§Råbå¾ðg$+¡—‘åJ&ç›0hƒþ !(+©  kŠ!žHFê ê¡&ê¢6ê£Fê¤Vê¥fê¦v꡾8M±’ö¬“&¦”N›A&d¨ˆâXŠ‚Fh™ë¤x2€ fp^¡˜h³f˜cÙÜjØ8Êá&©f¹ÀjŠkŰ¥à ¨âa¸âàæ8cOÃöbÄ6ãT@…U\5(+˜§¼ÚkŘëªk&¹ë¸Èk¶XéþSf‚SŠ& ½ X[®‰±¼éËÆl©2ªÞ-«¥Ï.­†í ðÄ Ÿ¨… yÇ›H¥ÜíÂÈl Úìél³áç` í[‚`ißð1„XRŠdhvfãX¶ R¤éã¾CÙ.3Úî.Û%ÜV‹è&04XÝàÚƒô* :¤œx†ÀïüÖïýæïþöïÿðð'ð7pþŽêÒÄçbBï@Rï´`ïü"h(:Ò ŠF˜ß›0ƒ•Ü 4°\ ñ7ñGñWñgñwñ‡ñ—qé½\|nnÕxnSŠðñ"EŸb¨ˆNŠ)H kàœ8þ>è Ÿ 4z–òz–`’^ð?‰O&Ýož0dK hÀ…¥À‚x¨ãP‚TÌ ™°¢‰ò)‡ó´³ç©¾ò£ÿ.ïr€3C.~p¼2Ù ×Ö (ó8ŸóÙ®s}^e-7'=ßsœ°ÇFy°ìòp‚5Xcœ0"ìÆ C?ô)Oôò^t&fA׃ôH¯ %XS#ŸVˆ„¥`,¡ð‡úÆ ²3Þ¨xóP§çQ'4óö/;'$G'¨TWõ™Ðh‡‚yP 6ƒ¤h†PÐmPçõyöuTvöc"ö2öcbÕúRPk'§ z€s¿ lÏvgþÞöcëv!ûvr ÷©wr¿EZ*àâU8v/œ‰g 9 Á€_Ö‰d_v7Ÿwm¯r>.uøÃó–èñ຀0µ‰T 8ø€+1h{pi¤X‚ ܉ GPÆ›öOßõ‰åzG·{?³|¨}­~?vU0îšy™Pxé€Hð%FXˆ… °éaøÚÙ†ô':ú¤çš<@@(Óa/æb?vФ>œ 6—x"¬è‚^š‡æŠ?å‹G½Œg‰·-\øˆ%¨„GˆM™¨„+K„ ‰ 8ùYúa0|Ä¿²Y J%`àðVŠ= Cþ hpä Y"™;F€®/`øBÚÐÇÏ»[<øî•r›Ï8œ74*žÿ-ŸWu`½›ÈTh…0˜©a`†oN…Uˆõapx€ß^Žüäÿfæˆ@°WB°'ƒv ''h,쉀Fxû·£ˆ…€‡ßáƒÜ»ƒ„ß du»—f×}Ðb,hð „ 2\(áÆ°ˆ'R¬hñ"ÆŒ7rìèñ#H‰kx±˜*bË"êºø‚"Ĉ+$žd™±˜Ÿ&Τ؅MH‰XµÒá£2¢ ƒå)Ô¨Ð{:µ*–DÐø´«þjbïüd1UK¨qû¶Ô0'ëÖ®_Ÿf@‚3>ÈÒ=uà h°„[jÝ»y÷>ÍÆ€41žjåê±]¼zùFíìÙs¿b>4,mú4jƒÂÝjíú5ìØ²gÓ®mÛ¶]U·wóîí[˜ÀÔ‡ó0(òäÊ—3o>¬I??ÇLJLG*â†FE’(‰‰Ä—ÃÄà’˜Ý¢‰NXM¤!z¢¨éÈ”wžquO˜9“M5WdMk|ÕT1 €ÂTañ W¬0K¯ÀÂS@Öê[  T¸Õò«0C{‡g~ÀÇfÄ<³‰ìÝ™ õصÏ,»ì³Ê, /¼òJD/Á]7”/Àa{靨e›)°×id0Åm»í¶!ðò°Â›\‡œ9E8 Å‘SNM¹rÕU…ñ…7Ÿµq…>ÛöV\Uˆsžøg„SûWT‹7þ8»XA…O%Ùà£È~4…øšcM¥Öq­6ím6î´‘;îgÖþ;Ûo ?¼›ø±àæ(«`SHÂè“þ\%ì´DPÐùAýEMQi04/¬~ãÀÀ1rDE9á°Â‹Ó¯4‚…0~ð¢‚1v½ 棯þSBÑ ‘b0Xˆ@ø`-@¥}ï‹ßü0"RÁ+Â!o”ï|é[Ÿ)øº)Ån³ûÚnÇ»¶fw, ›ïP¨¶à¯†6 ÊŠÚÐ ì‰+/4£ Uöw 0Øå €Œü¡2jäã_˜ÅÒÑ…~àa vÙ¼¡‚5ôã^ì*AE+bñ)áp ð”1´ªb€Š¹èE€ñ­ŠcÌÔѲyáVYã—æG»þr„Ÿ)á eØ5¾0w.¬$¿b(ɮчžüdEV€î€$¬PÂÛŠñŽm€„ °Üí9²–¶¼%.s©KмgkõÚ$Á(‰É²]r˜eÒ$0ïÕÉR2ó†¸À!šÙ.´!9¸DPœ’#Lã˜Xw)Îq’³œ#„ä/“i/a`Ål'˜©Î4-Sšöt2Ї{j¤HN –$gXÄ,•hÎ…2´¡·Dç<ïÅNxîëí’<#š¥zò³£qúÔàQ8M!Oôé‘gÔ'¨DB*Ó™Ò”—WÒhš&zQ2Yt§¼É(N‰ÃÑ‘µþ9JÔám{HÏG6ƒˆp¢ˆiM³ªUsB4¨ZÒ©O¿ÔÓ°Ú¨^MÍP•ªV~è¥Z‹@ä4`' «F߆!¸«[ý+`mÙÕ³¬dõÍX;³Ö4i]+d7¢T3²‚¸r`ð¿5õ#*È!À¦ŠÐ2°¦=- ájÂt665†Uìn [Ø0¶µ yldsk6  5´D*r@<%4$0°ÄGŽñ -H„HÄð+j£ÝÁÚ5¯mmd‹ÝÖÔ¶º Á­nÃ}@!Ùà P‘ ¨B95 ‰9`”ↄÌõ<„18ÀþЕ.€K]ï–æºÛ tsàÛt—À¯xu˪€Ä ïCÜ‹EÔ98ÅàÚÈ̲ 81ŠS¬â³¸Å.~1Œc,ãÓ¸Æ)„j#é`†xÁýJ°Ëжßv´>2Eü ¤" é0jÁ B±c6ˆ!Rq‚¨by¯DšÐ¤à¸8ö€œœù#²ÃGèÑ Š4xÀp¡ç=ó¹Ï~þ3 -èAºÐ†>4¢ýŒÊy±–È éqo¡Ýí6ØÑFòZ-€$™‚ª"r‚)D䤯hðåŠA"•ÀÇ›Ý2´!þA†*’ØÓ¾¾©£é O»•&ò¥MÔOè$¡¶È'Ì0 ´Häx‘õ0À‘q¥¢Û«8õD`aÒ!®ä#K€µGšÀÕÈ÷Uö¯uìƒ ÛÇÅží±wœlxwô/er5.R o`ÎÏE´=Œ–h¤x /HLp`{9 E¿ãÝèy¤Þ ¾7lóíà}gÜž¯@² Ð7µHjDF`LÄz‹È4°jŠœ'#ÇHrBÑÙŽ"Ãaƒµ+ ½ä–7ÇmÇšH÷äŠ9IîtfÚˆ V ˜³ÙFàA Ä"£þD¯IŠ*t{‡ñ E(žÂ‰6-’`ëG†zÔÅàñ[ý°X÷®Ö ÿI``mRBÒæjTœ#ð0øGzÝ'8Ù"ºQ$^ÄG}ñÛm䃴Ä0OG(Á tF0ÆeÄ%@ á¦!M!  l!àN9áYAa"L?ö(U3@j„%|ÖF4x„ Ãe„$€—YDi©¡#2&ž*^”zÖ!œ8äƒ&fïžlÄTÀ>"*’S$¶2!‚)˜+ÞÂ%U&~b›DÄd!Ã(„„$¨œôaE(ÔÀ)¦"2æÒ*>_+ÆâþÁ¢+Î"NÕ¢-:G6QÝ|ăÝ}64F0B®uD"HF$Ôi)T2¶c--c6£3¶ÐFãášT£4‰Æ•2øÁØ <€8£EX€ARÄ€GCn!À£;VdÖ䨯I¢<Îc%R”4j5êãr |AQqÂ)xA!xB”A> ÃjD”[G°ABNtDäè#²£EþäÀc°Mâau$<}dD…¤H&;@”ßF,A9`AGØÃ7X FÐ8XŠeX’%‘™eX¡¥1©¥:±e[‚Ã0ƒR±À#´†´tá©t;`fGðCàHCbvÆÚÅ(¦#2æŽ9¦OAæ0If2Qfezy}eQÂÜ\vt¦Gä¡›4¥õ$ÖXÀ*LaÀ¦ʦƒÑæNÙ&&á&0éænr„?ˆˆREà ,™GÔtD4¼ÛFŒ@Lr„ôÖjvFxþÀ>¨TpÁ)”ƒ¼ƒ6ÔÂS𧨀…eÌEc¦à<¾â~)E…é © •©™ZH¤Z‘CÊ}„D`›4WNÄ2€¼#$B€üAÈC!œ ¼tÀ«#Ît±zϸ þÕ4ÍÓ¬0+@ ¦Æ —v)§Â“§²¨¢¨Ž*EDäD*U §Gè"tD#AG€@/~D äÐ8ÔçS\Ã7Œ®¼C `‘X€gì«g\ÎgŽé Žê`ÀžNê–Z']k;eë m+ð™·¶M¸P˜R Á |ÄÔCpÄ1¬9tÄdáè•ASž¼b)Éü<ÂàÁäü£/¬B+¤Ï`ЬÍâlý]PmX1`aÎÂVk…:¬1A,ïHlítkÅFÄÅ®arÄ«.ruaHÈūs¾ 5 0ƒ]œ ¼‚:øT%DÓFLÃtÁGPÁ8lØb®Enu .&y®Ùî QìÔ& ¸*Õ°¨GxAÐ$"ªGÐ=˜›êzCÿ\.î¡îÚïV’ï– ð¦èzë ì*Õ«†Ä1ß›x¬Éj8XïõXö¶Öö¾P÷ŠÍ÷zMøŽª €ÑÕ¸uÄ „¢F¤(G$_n„àšD˜„üƯtÍocÕ/ Ý/ . þ~¨Reb„œ@DÃ3øúeÄ žFô6œï6C/‘¤IÞ®##–¯Lþr’ðïÁ„çs•Ìó^ÄC>hC8+iÄCG˜lP¤hCßðiåðYí0ïôð¿ü0Ápp‡öæ¯Å@è9H€ï}Á \íµqÈqF€‚›Fsn1–{[R=2!ŒçeÕ4FD€+¼†¨¸Q„ØqEÜx9´AÀMÄ[¢ ÷qæjª2îˆq&ipâòn¾¥j•%€ØF¬Ã¸Æ.ü§]Ä5¼ƒcÄ8Cg„ãD$2þ#š˜%³2/337s3› £u©—rn,¢ò¾²2±É8eQm¹ÞD;8Ak¤‚/0îD°TµI ó0ô€‡Eä Ö³=ß3>#Úf$+^hlX³¾`³½°reÒ°²ù‚ ÜÂ#\A/#ÈGD:„ðDxð6 %5»"@“*GA·%õ‚íHåGtÀ(ðCÀF” G ÍÍZDñ^ôÛdtYn4v4™´š„ôRNVey¼ƒGDB¼ƒ=h Ø•F A/Ghi³Mà N7¦N'!O‰OÓUWusLÐQ¥ÃÜt8ðVf„<$ðE¸þóE(AÄ'E0ÌX·ÍUÏfV»àVÇÓGsP‹d2 ¼‚s4:ä$G‚°›D@¼B^SÌ^_g_¯à_IW£É`‹$dÀ53±ACcÄ3€²ÏE_Ä ØÂG¸gETxZe'Ìe7lfSÝf{IgkÉgë#©y”/¤pF‚šj„ì^ŠpG(B0SD`ÜMmÌmnnGÚncT`ÏÛoW£:@ßÓ XqF@ÁgjD6èœFØCi_;ÄŠF€‚RT7Â\÷îf7± rööF}µ}Q1ó}_ÃmÁœn„¨nFpÏÖø›à·öê·½ñ· ú7–þ|·-Rƒ°xT5Ð5Fˆƒof„(¤ÁFDCUnÄÇrD+À?YDü ŒÏ8׸Û88Ê?3£?ÃÆvŒ4„†b>=OG‚:jÄ#¤8F|z†õ¼wEÐÀAu`>_9–gyV“ûR›²Ùüxo`xq ¹& ÌUGÂ$xl[DX²Dð{oD! œF„qKD#Šò^@—ëø—SøÇYø ’¹P8„D[¬µx-ÁMþA'g„„³Fˆ6EûyMºEH8ý:ã:Õ!úp˜y¾Ü?BtW>&F(ÌÎ2dWD*06G,ㆲ§þ¨W„¨W0©¿ž©Gª ‡ªG!*ÀƒÛÓ¸F4 h8Ä ZÌmÄ"@¦SÄ€wz°ËÔ°“r{ô%{-;Z)ú¢w„'@(tT$¹Fœ/FC;„{DTƒöyÄ€Ù­c¹ÿy ¯Ö ÷ø3fhw[³Ï lÓ¶x5CsWÄ1¯_Ä!8uF¼y¾·ÌŠüÁعG³4ƒ91±»¹;jD¼2ÈBGɈ[Ä!„+Eœ‚|ßÔƒs¸A;Œ¥å=²‰þèW@;ðS3ì¹ED‚)’ª/¼F ÃTÄ$ä•FÀ÷ƒ"€kË+tJçëø…»Nòc~Â3ÿ;?%B¿±I?@ˆ8`Aƒ&ThPÂa!F”8‘bE‹1fÔ¸þ‘cGÖôë·äcÉ’u iDD ¢›,·`:—nâ´z•4.ÃRr€VÑ„Á2”hÑ¡þüاfh%?èaÙÀ,]¨RD K#;Úä{Âh"h|ÚÕ‚7´ `óö9óg”n]»wñæÕk÷B Š],<˜pa…ÂÁT¼˜qcÇ!G–<™ªªÉ—1gÖ, ‚aÏŸA3th’tiÓ§Q—làZj×Ùà,Ì aÈPlÖîNÆ:¤=Th^õØäû4ßÔ¨‹zTÅ2):,©t¨‡«6g²ayèÊŠYñ΀Ãò À>\,Э ¿—~}ûöûþ šþÿ…ˆ5 PÀ«ŒÀtŒ3ÿl †^‹P )”+6*̶=.¢c°Ù†"%†Ù #E² ±¤(Ã) ¦ j®È›0ÖÈË x€,zˆ‘ã,dÀ|Ĩ.›Õ!*XbƒvØm˜~ÛVˆ×6˜âñÎ;"„Óû£ ¹¨_.@Å‹j‘¤$%jQa˜ÕZƒ¹8»þÆ J ,˜¡Ê\,2Py²0•(ÚØ§‹UܨPB€Í¡&Ÿ{¾˜^ÕCÙ#ÒoÌî½K´R»îYÛ–{á¸W“îág½Ûïç+–÷è‡gŒ\™ä¢A°ˆ<ÀÉ(šÃ;:æ„&’„bˆóÝý÷áwÕ/1ce^Îâ“×ùü\Þþ8G=ÞÉ ô.ŠŒÀ£¤aDV'À$h€†‹Ä,~ôàû€7 áýLøãŸ›öwBù„ àaX¡: %ÐÓGLÓx\¤ÀH `Q0¨ƒ¹¤°ÁÉ}‰M\UGØB™P…iJþaÄB)úç…1ôâk¼u|‘"P€E”yXÄÏÂ$¦õ{hï! øŠ˜G=ÖŠõÛ¢¨ˆE]Q˜ÑâCÓE2.’4KØG?š½Dò"¼8cE–P‹4Á˜ÀÈ1L²Œˆâ ÷˜JU¥ˆlP 9 BÆR2‡t¥gÉH]z$ ðÆó´ÐŽŒd㡤ƒ.¢€Y”Ä9ˆˆ¨’T®’š{lå-Í”Zªi–Û|Œ-±I˜\î’œÉ>žgH”& g D¢‘b€ò"ÄàG”@ sD„=¸À4«P&^3œ ¥71ÓM„2œ]Èþ8ËQŠØ‰Øe(`ì@",àE †fd„ž§ñU|Ø>®Ôƒu¨aºPÉ(T¦0ièKQ‰îô!'ðçóÑ›‹8ƒQDRQ‹rH# I´ˆpè‘cà U,¨R–nÕ}.Åé`bZÓÇд¦7ýjAtÊS‰VªxÞ €‘%”T"T`ŸDDa è£kØ@5*r:väÀxgDбQj•« ˜WÏzmŠWm¥ìdÌÙ‰F­¥È! ‹ç™‰cE@qЉlŠà ⡂»F¤³íH2&RŒ§´#hhÃ#€\á—¸Å5îqþ‘›\å.—¹Íu.pi0?Xi¬“½lfÈ*ÓÌj6­žÝå « K@À"©p#mO±˜F¬Á‚m7‚VTD –Ãp‘_ýî—¿ýõï`˜À6ð÷kýP—VÖ½îe²»ÐíF¶»Þe$ ¿¡áŸ‘FV9ÒˆÀ„ª°Fn"Â9œà#ep@Eà@•ZX˜ÆÓe°d¬™#tÂg­p¿8LCo àlEàÄs"  Á-Ž!ŒS"0@Gi;‚å‰ %2£xc‚„5Ƿر7{üÕ†Ö¨ŠÞ¼qÏŠ˜á°™‚‘ôÀaA’‡þ¡ºj$᳈06Ó8Ìb™s|æm¦§k^4õt€C,ò›¦ˆ@Q‘?¬aŠ È`!ÔGFÀ+@TéÞ¥=ÛhGCúÁ’¦%¥_ji\û ðdÞ`(‹| ÙÃ=E‘ è!ªY$Rªè¡ ÌøU<`{ˆ!‚Ã&§®ÅÌëëú:–Àv¨°Í·K@ySB=¨ìr4Â"ט‚EðaˆŽ4¡ÃiR©JuÊxïÝ7V÷eÙ]HwÞ ·Ø¨âé‹-á’á‘)"TD ú°8pÛ‘,s"V¸G?´`7›HÁ ¾½þZœ‘ gðÃ)qAN<œç9±˜€y¬Ã‹Ð09EÄ`è‰Äb-ÑÐÐÆæþ0ÙÃó·Hë05¼¢>/ô*dV¦"D õ ("Ê!‡aòÁ¨€üàô2¢>"ºöÁæ ·È0ñ.6Ñ;ñÑ>×ä ­ñHQŠLñOCÀƒû¼Ooœ€N+Eð!TÀæÖ@DK#ŠÁá#Š­€Å˜ñù/¢1§‘½I“g[¨½±4z à `ŒA¶#ëžn" À(ŠH#d n Šà R #ÈM#Ö*Þ ß«ar(þ1x°ùr›Òx ’„2!K öàpá þ$º O´¡ª:¢Öi" àÖ B@1á t¡#'$M#.1&ar&E¨&w­³Ñ̰ÑwòzÒ'=¢'Je :@¨PXª!%LP"<€'B @"ˆAƒP@J¦"È¡ \#¦ü` %G,-“,!/²n’–rRnÚÒ~Þ.9‚¢îAN`¨Â¨G ÞA/-‚¶Ì&È¡ t¡/)B¢²$ø¨!¾šñ}z)T,3`0Ó,Ó -³±3ßæ3™'4ES#AÞÉ žâ *¦ôq"’A#ò "ú."„¢:@!#Ï#šdzÀ2þ8âÛ¨bèCÞÁ Š¢ëˆ³8mir=1-Çj-AÑ9‡:£Ó#¶€*p³O0Aµ8bÊ!ðê@ƒ&¢öà r 0¢JÒ$^4é=õÂVAÈz€><%U6…?û3 R9­‘9ÝÆ@ëA”#º“XŽ!<B Æ ñ ¢@j"*`D%"Ú2 Ú@ L#[Z î)”‚)°À)†d*¤+²b+´,Ä‚,XTR’ÀEóâ8t3c‰FÆF×GsT#0ÅoÜà &‚2åi"ð‹C1‚ œ@ËPO03",íâ8’c9° 9†:¤ƒ:À:°þC;¸Ã;Àc(àRQ ”ÈFM¡Ñ?˲MeátaäTbè´N1b@„!YÚH#B&¢‚(Q"  Ä"´€(È4bl,a@Ra``nÀޤ  ÐA/v¤G~$H6ÅSVT;– šäI°Àj` À“TKF;ÑM iUFçðUaÕ""³ÄO´à $ˆ"bA#%¢Ú!ý"‚bA#Và üÔ# Ü á,¶R,S4%TÄu^X4Tüe(`|A à5^9qéUìuWZ5bôu_+¢r–pX\R<ça=•`=Å`7?bÌ`ëþJcšæVDÁ0¡ ¡à ú  `sî]ÔEJÚå]âe^„¤^>å^Z´ðà º¡ádë‚McT@ „@áðe&fev"(êî„%ôêÀ&Â"–"^ÁP)¢Ú¡;b*!s>te†flgt†g|h„†hŒi”†iœj¤f(î€öb2Í ÔÖ(Øv^S[VWäÖnެn‰ ‡åɬjq‡®G" ` (É"¬@.á4š &QÓ‘qï¢rs4g(:çsBçT†‚tLup§u^çL%…KJ×GL53Ïje±huo¥u…þna"^Ј…ŽU"®P"–à« ÞÄ ¢ jV‚ŽÁIM”¶a  :‚QÃw«NWeS· ÑwnðU Ù·}‡á!„OR’ w#¤"¢ #Š@ÁLÃôozB>X X Í·Š"ØMÔ×W*Ø‚C§~ñd üÔ`@"–Àr«A‡Á Ú°.ø@PI#Ž@ ‡!ë8B_†Ç9îˬ†Û䆛çu-¸OØÃ„ñ$~S#€oÇï&b¬ø"òà7HãF8x`®Ø…³˜šbXgX…ÀXy&Xs¸}'Ö ñ¤"”à&¢þu7#À¡ 6Ø#¢€V "ªð xIô¹*pO¨ÓDŒe%‘a— ;……2ãKbž`ƒ•@¨L ¾LC ,€| ܸMù”·UÝ6á¶ ]YN`¹n•@|©O†uî$¢t~u*Á& ð  0d pa=9blq"FO=‹—Y•PÙ&½8Ò¢¹Ì¦€È¸Œñ$:øNª€1â ¼süÁ1%¢”8"¡¡ PÁT; ڀ*#BOæ8òù,Ÿ™1XMþ¹Lª¹new¾ðDp5"`"` ³aq#ÀOMÀB2 þh”;°Æù!œ@úayÕC:F:9Kú-#-SšLVZfñ°ábAá "É(Ó´a“‡bï” ŒÁˆåJ̹"úÀ7?ž—š©›¹mŸnú9ǦڅZ í$ð"§N¦a=ã`)"Ö $‚úø$·è@ ba Љ#¢@n6".…vø·žk´I»´Mû´Mû êuﯣ:÷ºAªZf@Óî¤Ü #ú@š"âÚ€H]Q ¾@1´@Ú¡Ôúöz÷"j›"5¿0º¥{º©ÛÀ–1eexŸ{-¯,¶d¶÷õ³ïä "¶aþ¦í#s•ý*bžŒ d¡ <@a3‚ Ö€ô,"u°ý:YÈ÷«T™NºÁV÷«+æÚú! ["LV"LàØ(â`@ÊÁpU#à#zÓúûbþ§<A¼›‹ú:Ä3d ìœ8Cò` ɇ‡á^A"J &¨!âÐ!$À/â¶#0ŽÇYÜ¿¹øç´{ݸûºR¼?VÒSC¦a²1âäì!FÀ‰›`.²À5yè °M#¡ö–œÉ¹µOü@¦œ?ª¼NÙªW3 z@"Ü!<â9·îr#”@ ×Îø€ñÍ…eÄ_þªÄ“gÎW¨À›ïÎs”2èo+$”ü!AËœ@l+¤x"È@>¢z€:¢€„ÙчÒJÒ‡Ò¤ÎiÅe=B” ±œ²BÖay«AW‰ú ~ "(À™ ¢Ñ'âÊ £< LÍ)"cˆ¸×û„Ö ÊÖå×D×Aƒb졺ÍýÜÑ=sû#`á§2Dœ;"¨€Ü‹+ @.bç8¢,ê#Š´}Û›ížâ¢ü²Ä}NŽL µþá!>â— ²º$j5CT O+âf_ Ãe<5" äÀÔê3à#„ÛÃÉÛßܳÈÒb@溚þþ â?bü ˆœBNÐB \!"”Àtñ" ’»"H¤?‚­h€4pù°>ëµ~ë¹¾ë` ]›`ÞmdþMT lçs~•vž4Ú<ÞSà ±«ï\"Ì`¤b<Á"ªà9"V4Š :®ù/ÝñŸ¿¾Âþ–ÆÞaÊ>3—^í×>•ÚÞ$d7ˆ)$8 "ïBX"r êz¡5B ´€ ¶Y#¦ üàãZ©7߃úò>ò >èž².ß0Ò>÷9Ÿç?b%Û`åIƒÐx À=‡aÐàaî‡:sô5¢!?´’¹$äÚþø;h÷±[_í‚_¬†¿0ŠŸüó¨óM¢3»NV@’¢2Ðn$Ný¡â„“a 4X­ ´%:4( À…‡¢ ƒ%£Æ;zü2¤È‘$Kš<¹±_±ƒ]ˆy 3¦Ì™4kÚ¼‰Ó¦°@·zúü 4¨Ð¡D‹5 €ª£L›:}* BΩT«Z)á†AºPzý 6¬Ø°°U<;ìRhÛ:Låà1‚ÅÚy1˜ª AO³’£¸ò (˜ÜRlòÃ/Ž} 9²d“*Yº¼Š9³æO;{þ,4éRФKª9µê©Y·v ;¶ì¯e7äà‹mþÃñ¬Ä2·`2ŠG¶5ä’†ÍCC• B¨WgwÃÌJ/èx¶öíÜ9V6Ørµøñ09›>þ§èôì;£&_uë‚\»Û¿/¹öõaKÚ`·EPàb''€Aàl–<=L=‡M;“X+„‚avø}¢Wß^|&^e^{*z¶ÞŠ.õÞ‰2²¦}¯…(›#~$EŽ&é· |€a[Ÿ@í DÐ ¢D€#-S9m¤Óƨã[‘J¨<bäc™f¦‰—ÍÈfM)¾'Q-ÆgŒmÞÓ|ÕwæW‡<¡R\qs ò=ö þ× ƒE4‡Ù#‚AKD3Œã ÐPÀTD ·àCÇZL: nßé!£²Þ7"A%â‰ë›tîÚÓœ¼®h'®wê9 Ÿ³’ iÄ0‹¼hÔˆ¢Çvä¨tuà«¡ÐAhpñ<ÝÕPÙ>äDXô¤È«Nº £ÀJ¦HÑ&…/sL˯Hµs«°mêúkœ¾Ì^°ÏH¬±ýzäM<Ìx“‘íÔ­´% ãQļãG†dTÀ̳3þdTÉŽ=îÔ[$eŒïœrHÕJ'$‡ÚÓÈ¥€AîMÐot3 X4¤Z øòþÓÌÄ…aaÒKR´4$*C¢û>Œ6š–-|'Á»xðÛç)̶‰ ߘöF‡ÀF¸“ñ¢X<È+ÌÏàd$J=G¬€M<Û`ñ ûàÂ:kdƒ>4÷¸HúJÀ ~ÐRĆ>[ u¯}P%ç¾rIAp¤@.œTLbV„L?ÑF i“Æ R´ô8 /ôð|ú`Aý=Ü @Î;÷ŒÇ×rÞÚýpÝ&º-w{q·OÝê“w·ù9ß¼ÆXtñ þçNhd H-,@¯oX˜€¾2½EAo_Ð EFxÎ5 â‡7º±þlh V Â¢'$c UkÈС(mAÁD6¨ö ½$IÎCØ1Ž]Lc1XCX*CZ^½B"9ˆc‚x8D€",®rÀ éL‡:ÕÎpˆSœýdƒ¾5Í/>ìƒzÞçFÏÈo«©ß3¢ ‚ÛG¾’‚ŒL`Gø¢à±€?jl‚ŠÄGF$€­”唬¤ø ‡{ÔcñÐP ­9P£ üPNC!¦:D‡ùA¾°@¬ZãÄ“0R#YÐÆu5@PuXÀ`6øç?P€wœLé¸>žÄqEpœ¦SæMþÍØñŽäÀø œ"py%Å:Ò†+ècxà. ½;däî2 =xA’ØøF8ÆQt¨£ oh‡è`<è!~D%ñÕVbÈ݆-@Y KøÂ†Á ŒD£:K6â!‚u¨’U‰À8* x¢ *R±ŠV¼² …-pÁ‹AÆP†3 A Xêò‰Ö#êà‡hzŽÄ$ÝàÇ?²™’yf6ÉÓFk‚¦šb= 6¿z•mÞq€(C V È @A¢b G4Ð¥0`1äðŒ”#¬àE=ðŠFDÄøC-‚ŒþPG+ ÆŽô ½}Ð@t[Ýàn–Ð',£ψÆ4º€BÀŽ X8ÚÀ¤cD`Mhƒ†GTD TÆpV;ŒD=t¸Ä€ºL²ËŒ\ã _E>Ü0U{âSŸæäêl¼ŠÖÕ„µ¬!+w‰rÖìRE­w<1ìÀ‡0 @ XÇŸÐTjäã_˜…<±@ˆ.ôÜÛˆPìø†F2 @Ì# $ôlð:¬œüdU;kT$€¡!ÅÈAVʤqUd EpÅ€~´¤(<° TÂЀ" €À|ÐCî ÄJBŽˆþ؈ƒdv³ Þë8úú×ÀZ2Øïf¤ù]Óx7̧‘Š—åƒábámËŒJîH~v.ìc]ÂÐ~·ˆè(A•ƒÈÁ0úðƒD ÐÁ‚*Ò¤­d| ˜@šÇTCð_ÖH6бF¦p#äK_û²ù1]>3ŠÀLæ±*%Õ×4³©3CÞQ—)¥ƒ?Jç눮¢’×!ˆaüA¡œð$êðE¼ñàºðÆ@m1ï+sð 8âfY£ÑSã««²]VeÌê¾ExÏM“X‹;DÔK±%pͺ""R°[Ä\FÁë%$Cþ¼‹EÄñÕíœm… t;@Û>I%P  ÄBƒX 5”o=ïq¯ ÞVIw»C³ê“åÝ$ÏSšrûåZ:^ë†âP‡ü6Çà”AŽ‘´ÝþŽUAC-ÄQYC«¸Iþ›”vA#õîǽc›R·ü&&W¹zRîu¡°|ëb7Ö6sé„4ÀP%RAàcì`Ô±Œ<À ­¸ÁJ ¢Pfh$ˆ× r =ÂÙÚ~âÙͧu²Ó¤ëa¿»Õ=ö­›ýñÓJûn¼=¼ë:yàA¾ bÐpqpD®âa öA2F¡fløþu.H£y;§sž_‘—¼L(ö˳:ó-ßüðeåùÝè`"øc 6Ä ´Î ÿ¾Ü#ÛY‚{|Ç?¿_Å7~yP]ùuƒ=þ>a>É¿þ3Eß6:ƒöm£ÝG `JÀe ± [ÀkûA¾ÀÙ €±o_0q–hÓ~î'ÈçuÊ—jöoø·>²Œ¡7“×ar@5°J€US íR‡xçSÐEr ÍÐÐ@KA p!éw‚Óî‚*'‚dF‚çf‚K")ÈÄ ×AÀr  ÆŰ€QóôsþÂÖ ìðϰZÂg…eÒ„Æ÷„'…a6…¯Ö0å€ …hˆ‡ˆˆ‰¨ˆ‹Èˆèˆ‰‘(‰“XˆGo¬o àbʶ Å€ªtk0qX2whÁ‰ áþ©05mA€ À…‡yˆ#{(y}Ønø]hjÄâ Š@ŒÅhŒÇˆŒÉ¨ŒËÈŒÍèŒÏÑ(ƨl«  ÒÑs÷[Q °Ð6€ëàBÃÀxgq÷`Aΰ‹ÀÞ°|pŽM§~¸h&ºHv¼¨n¾È]ÀxfÄ"mIi¡÷–b¼@CÊPŒÀqþqx‘ ²ð haoP &P“0 ÑÝè(² mhГ1)“3I“5i“7‰“9©“;É“=é“2 ä–>üÈjþXVéeyMé”O)ñ"»ñZàñàÈ`TsºujP JtÍ` íP K0ùP (éX \\@‰ui—w‰—y©—…øwCI”/a”©†”b¥”âÅ”P‰˜‰©˜!|à·EsÃ0ŠJ0/`Œy( é4°=Á ïÑq£;°˜©©šŠé—˜d6˜ÖT˜Ùu˜«i›·9)Lô Œaþ0 é JtWð ~.y†QÐ=Q ïàsÒ1 Fš¸i×Y$­I”¯f±9M³‰Vµ‰ãIž AûàõˆŽÙø ìp«’}°bÐÿçä×y Õð00xÒ1ðåI JÚéÜù]ÞGàùUâi z›°1`ݰÓ€ ë°…ÃÁÁ¼¶×gÞp…`@Ð =k –Œ‘x€@J£Š Nô‡r£¡£=á Ù¡5*¤PIùЋ±+‘ï°Q¾epðf`ˆÀEõ¦£x j|C ¦·y£|˜£=úuþ<Ú£? MA¦m:*~Ö0à p àiÀ¥PÃP áâ2ä¢)NͰbàýn ©‰9¦»X¦fÚ+ó§£jJGl©Z$Ù` Ž»EX P R à mhÓ@ àëp<;Á’žª«9©ûX©–Ê n¤©kÄ©»j¬Œ À àÇ;ˆ 4°Ô°Ž×€‡vT€ KP M ;ëÐzÀ™ù `®çŠ®éª®ëÊ®íê®ï ¯ñ*¯óJ¯éÚ—æö—€ù«f¬ð3¬óC,Û K°k°‹° «° ˰ ë° þ±k°Ì:4Q°0‘ŒA ]°+ DupCm±(`‡ÒÆkÑ”h`{ɲ-ë²/ˈA9rùZ”ûÚ£ýÚ>ÿª>Ä‚ê°? ´A+´CK´Ek´G‹´I«´KË´M ´2[ÑòŠJ Г a ` ¾°qðþP`ÀR’Ú²ð%k·ˆø¡[§ Ü…³r£³uó÷ø¶!ò/À¥W /‘›@è @%bÀ$M0t ÃP¡Ð[Ùåà”n»·Ý·-÷„80>C€t‹©ôw·l“·›{&} \ôÐýÀÑ ðà•PÐþ!¥J€ øÙÍ@ kà”§U@±¶¨·¬K+B‰¯ù ‚ÍÉ P —`ÍÉ< Vuû6©»0««¼>âºÀ%$Èp¼ EIÆÐ{i‡˜P«eŽ).™›¼ßËKrÈ8° …/€Ð{€8Мq¤½ýã½ø "á»ZÓàRrÛ° Y@[Ð \  ` q<±#rÙ”J Ÿ•šëÀYǼ4{|6û:p )0\Öп0M \0 ,, ¼ÂËë”-¥O1¤ð óÀõ  o°•dоK€Qâp¶yy*üÑ¡¿ðFy8°þÅ%/9|ºñÇøâÃ]œ¿U \G  -tÅù¢|ÐÓ³uë •`p€~)|¿lìL-ìÂï÷—0\€ jp +êFþxÀ·€Á ÉÛëj‰\viÆÅ†, \ÙÐà…Ã`•´ pƒð½åÆiÂP–˜Ÿ Ê`ñÅç†|×øPp F D»@ÌÅlÌÇlÌ: ÃNá‹8À‡`¢à逽¡«À›œÈk|˱!ÊÀeÀHÊ=$ ¡vxP¾há–¶EãÀ¶OiËÛŒ¹üjÈ— Õ· ©0»p ^P¯†à,rÆFdPÊù"þ# ·ð ˼+iŒ'ÚLÏ]ËÀ%` ñey€I —û€àú ˜ó|Ñ%aϦ†|jQIÚp ¡P ÛQ Á° QÔA-ÔCBÍ©ÝuÐDÁZ ‰–Tì°ÃØì½·õf\çt>½ZÏpm*0 pPIt`l]ãcà ñpZMÔÒ…üÒ¸ŒÈœŒ|sLIÌp  þÉ>ÍØ-؃ØKp H¦M! ÅõVPÉu"Õ4KÕo‹dã à“Õ‰ žÔ‚‡õG€.¢‡°ÂC`Òq '« ±\ Ç ¢Õ Qþ0¦U X ÙÀ^Þâ`h€jÀëÀîsPupyå×Ü<׉Ly:ÐRù\àSp ëÂð åmÞçÞæ] · ‰ý"Xº·ôPÚÀ8Ì=ÙùZÙonºýãP2   û€ÈàR”±f d Þ Ä"4BÕ`Ó S𠉺 N BMÀ­ëlô”ìà„íÌ ΰ=Ñ ùðŰ …`ïð5õp …žLÆC>\ý0ÆÓ­6àѼ® Ã>1ôðGjÐ Þà&µ àÜÞþŠý½ BþGßйp G-î@€ÃeÆÉ0±ßøØßJ +¸°W_°'/”± D.è)æó˜™„›Dñ ïО´ý@Igp»Ã@#° Ã0 '@$V°$0 Õ‚6@ RPPº=€ z°…2ÐU0 µ'½ _€ Ãàià^|0}dÜûpè÷€v°èŽþm kg0áð ¯ô]°Ø` ÔPÐ RÀ O x0aPI‹ò´ äÓgFy@àœå·ÀÈùr[AÁåµù®ïûÎïSàåîÍÌI-@`Ãe·PþX BA8Ðñ/ññZ€ÃF vùý—sŽ‹á€° ‘ ÄÐÙðY°OXðXgCý° að cPãpµEPíÐït0vàãz°PŽÙd>ä×VIí Í1› Ãð •ÐàÃÐ 0!PÀ[ pß·°àpE}ð¨Màq ä°aKp;²ÏP Ó`BÏÐ ž ÇÀBé¶à r¥* ú“îê^Ý. ‚° 9  Fðž€àoþ\þ‚nÿæN@0\  aÙ¹€F0 Ëàú¯û±þïúÅpÉJ€ñpç\{p‡»EâÀÐ! ز) ÀT#ÑÍÖ²Çг½ P@Z·MÓÛ`Ú `uR à Ö/zëpXl±šš =… àðÍp #5CupàöX3Ò;˜³e 1=ïN]ÃÒÐáCˆ%N¤XÑâňýŠ ãȱK1!EŽ$YÒäI”)U¢èÖK˜1eöÂr Ž[<ˆ äÉD&L·žð$Z”§5·R¥øÙ4æ@UNâ”ct ¡^rE‘ù Ç5°aÅŽk¤—,Fš ƒ°Òí[¸qKJ¸Ñqš0þõîåÛ×oD6P ¯ñš·í ¶n oÖ«ÑîeÌ™5oÖŒ¦€KX ŽóéË’œq`g jŽâÚ µömܘñb ¼ÞµCXæ˜èAˆ{€è‡'|éaYT|Ž^üÐ* Ô_ðáÅ7´l÷£\ôéÕ‹i)U&[F¸»µíQQNƒµj©R¦Üû *›"(I´XG8²©Ã .bòR.±ðB 3¼0›`Hk­¶ÖqD”è²k·ñRTQÅ Šƒ~`º(‚•*‹ øÂfšc¯òr364ì@%”H@ˆ#9þ³‡@ªŒq &™(»< E‹ˆÒ¡ê©g; p(°é°0SNïâ%žlVÔsOòlëè< ´½µ¸åöQä6æá©P¦É¥©ýúó/©¥ ”‰@McÒ…¨$nÑ¢D®ÈŒb$ä!›Ncš¦ÃbKPZG4±#0ùÔuWˆ¾±j:.F(#l*pH‚.öÇã.*ÒKh;ºãbQ"ÚÍ®53Ê ‹f°—£\) lb¼(³Y,bè…‡àlhÎÀðiHÜàu_¿žÐZŽ‹P©&픢,¸%~`ä¥`v¡T(Kú/ÓVoá4c þxD`fã)‡[tP5vÖPye–[^å–W=TKÖ¶Ù­[ÉÍ‹_ž{Þ Ì!ÒÏq½ €Zˆ.¶tÖ@.—޶܉æ¬ÙQ&ÇÞàŽ†,0 ŠEu}V["¾ùm“–Ê=¬’äG6¹¥÷*­˜¨‹luãNð Qà–OŠå§ ³‘ço¢fÖ™ešnÎçª ××½çáP€ÁføòWj#ýq´ˆ¨Yç Ÿª¶”Zª#Š ;0a¨!KPp1•G°x:Öi€YÌÀ"„X?p„Î}h(Ž…Ñ»Ç¢m:Ÿ=—¤šÆŠþ}úóã’ÝÐoÊ‚BN|¹U™‘rhÄ¥i³Y:SŸüÂ¥13£„M¤ï î]1>¾7Àß„¤e÷|€~XbŸûBâ=æÈ˜Ô‚€òˆ"7o‘Œg„T¤#%é.’r‚8ì'à䤀¶±‹e Ñ@‚3 À7§”q•ô< Í,*°|NT¨zêçB1c<âÛ*Zº0QШ¸AæP­Š‘ŠþTPþ͉ÞAÀ*à`›Mi€>ÌzV´¦õ¬A1NÆZ p6…–‚Ƹâ§j|%µJ¢ ^U°ýºàT5Ó„P4,*´ºƒŒc†ÍMU{Ù‡dõ¯#âª̱ʠMC*¿ miM{ZÔ–,&céý¤’(ÔÍR´¸Eðϯ0åfmõ9aV¸Î*,e3£d$JàˆR1à 0ò!¿4îm,;ÜÁjÖ·êáê-$Ú Ð¯p¤(Ù&]+PÚ”J^Ϩ[WòÖ¯ÛMO`±{_‡µºv ÀN \6Jø+>Ñha¿TmÃ#ü`GX¦þp…-|a gXÃæðƒMúЍ»5-4lÒqÜâdàG\üâÇ¡3žqtÐ6”,•pm©SL–ÊñA¿h/nõªÛwú4Äëy#€ñd(GYÊS¦r•­|e,gYË[ær—¡üá[÷éˆ4Rp‰àƒÛð;à€ àâÀ($bfÔp{æsŸýüg@ZЃ&t¡ }hD'ÚÏ‚üS4—,Œâ$  D4,™“aÁ½8F#žñ’;`£ £&u‘ T£:Jˆ q œ (®0‡èŒ\$žÙàÁ|ýk`[-¯úÂ/bÝ×G«gÍ0@þ³ýlhG[ÚÓ¦vµ­}mlg[ÛÛ†6£ñ|šfXàæŒ_b €o§[Ýê^d²Ý‚Q (Œ õÀ-ú<ƒXÃ+VJ?Bä\:êžY¿$Xå!ŠÜ€D\⧸ī¡ƒ1Ùî–Ë×ýqûS 뀄+z€Œ,åã ÈÈA( ±ŒÇ\æÆl7ÇS‚ÑgдɆŽ~DÁ ¸ø ðp ˜D!q€‡?À!qôAð9Á€[>¿°B1 'ë;e«†Tz¡ƒ]¤]íkgûÚu`²1ÚÓæoñøÌí~÷¥åOÀ{ßý¾´šÏ=nÔ”I$þv>bà@O˜‚`·^øÀ½H¦ðŒ`,¡£½Ã-˜Q€—ðà¹hÆvß…]&&Yüö±{øX¼YÇA4*á”Þ >%uÿ{ï}¿}¿'~ñ9xÝ„«;<ñx á͈î0…Að Ã0iò`Ž—c%ÈIGÙ‘ƒTìç• ®±óC&ÇAèqä_ÿùGg¬†&¸X/и[Ƚä3 Þ3>ì»?ch@ ,>äK@òqŠôj¾vp+° HBƒ^`ƒ]‡(˜1È…_€žpX†]Ø44ˆ¢{ "C8Õ‹‰! þ„£˜x ण‡Å¹…_ø€*8B$¬g˜&dBxÀ#p C@ ‰œ@-ü¸@€$ØB0Ä» L@®J…æXÈ:#XC6lC#‚\0žÐ‡!0‚`xÃÍ‹ ùkŠ„cœÃƒ(X†*@8Ø ؇e€‰jÈdˆ¢S¨€5ºÂ®0¼Ätƒž#ÀDNü¸1L>®ú£3€<Ð_TLEÃ1‚]È3pšà$@EÐ5ñêCfÙ9]¸F,f‡~@˜P‚@B B˜{p(r{ˆpȺ[8=Ù1+¤D1ÈÂNüFcþp,ÇýúDÝã*E‰¢›€ 4 A0¸U(%Ñ›½Ôc?˜À‰Ö­€k½ù‰:(†e€døƒ_˜ÅaX) ‡8€ ¨Æ’Y‚k°Åm¤Do4G”üüHBGÁ["èˆv€{xrˆ‰&˜„äjƒ)°74p¼Äǧ¸Áл…yÛ¹4@o(™d˜€&¨#¨ƒc‡( zhЂjX €†lP ˆ¢X€IäFÏI°Ä ^K³Ä ‘œ;¹á8½mHÉ@…P†ž¦:Ⱥ¸ÃÉMÑÉ[ð^EbŒ¢cƒ`ð‚iÀY$þµ`‚ˆ‡[$ð‚E¼Æ˜pGùòʯôK 0‚Qì‡u HEÞTE¾é!­ùKTD`-˜‚›<ÀùòÊŒ$MçÄ D±ÄçœNØ0MŽs¤x$ØÙrM¢@x¸……”Í|tŠ!8v„†]€‡_ÐM÷‚ÈC#Ð3[øKÝ,ιÈ+lNê|N€ZøO= ët·%Ê…DO˜ ‚îðÎ. „4NòÌI}|‰ÚLII¼¤ ½wÒAÐ-@‡ø‚u/þ´@ÿ,ÐÏ\ÚpQ½ŒMþ¶%‚a¡rp0¸øñƒR¢°ƒ x»=¼Ð—'œ&vìI0Î]ð‡h˜Ø…e°¼ÕšAMYÑlÑ ËEðÅ1Ó}4Œú”Gq¸  G° ~¸aàf¸ÈSR©ˆ«1ÂpÍ#HSØ~Ô’_à#ðÒNÓäÓ3ýÈÀˆ…G•Ñ4]2GÊ…-Šð¼øÑF¸+Ör‡·ÓS§ˆ+ X‡\àï´:ˆGœdTÝsÔI5G€Y-ÐJ 1GÂÑ:'؃øa fé‚(P°†1 ˜Ð`‚#Ïp †mhƒdÀuHÿYU˜‡ P?þxÕåäFY½ÕotxrýÏ\¥/®Š)¢€€ª¤u°Š{ød¸ÀCH‡(z+¾ §I¡†3H‡—Ø…> ×܇TXD÷áKX¼qMWLÄ—V Øé\×í¨\@£ƒ]8€øix*2†]0@|œµK&e —ÐSX%h †»¤TaòŒØ¹›XŒCÃSŸuNõ-xC‚^% Ø…‡ª˜/À2]¥‡¹Ð¸ U% iP†øÑƒƒ€SÀ†y…ý©V%åY›óÙ¡À °Ÿµ͢ݬîZ§¢‚[@IÊ „_€Å`UÒ¸š”9' PÒ47x+þ$˜RE[ŽSÛ·eÀJ€Tx\όۿâ*@£¨#P’¿é[Åø‰¿õË[¸£Ð›â œlÐí † P]ȇõZ½7œ=Æu7Ç¥\â‹\Tà]³´\­âªÚìNžàÁU œ48ÝUºÒÍÐÉÌ£h‡!Ð9ÊÑ!° :ÀW[H pØ:úÉÝdÛ]»€‚IH_õ]_ömßö•à­£–-ø•%püÍ_ýÝ_þåßâ*áý©îº…É( >p4 œ~À0 >0Q£†çŠ[£X¯ ù›6~X¥~0 WŒ”Nhq]ïԃɊ¹ÆúÌ €Q¨_Ö1þƒUý'𠶨îÊ\«¸½ ¶i¸à ?è04…¢P† – K0Špà¤4zÒÊò%p@ "a/qÝ•|1c2.c3~…¶ƒ6¬cH7~c8vãVX+MN@Œ4€ÿ9=øc@dAä?îU_¨áÛ‰[0&<™(^£ø†\hàŠyajµÐðÄE( kXâ¦.ŠCÈ…ªmÈ]%,P¿VÉb•¸b¨e[¾åZ†@2¨óí×}ƒmfafb.æ`~@:5¦,éØùLБ-솨fk¾æjeþ°‡¾“á20fpgLŸCNdGK X¨u^gv®h‡JÀaGþ [° :¬ Kip*x 3(1À:O.ŠpåŸÀ h0Š,¸…Ž¡|PÐ2ÔsYN Ñý›,øZéeŽøåpþèa~À/˜Œež*éõƒoHi•^ir³50¬uð2™–il ƒ-˜iœÞ²—v  7¼ófjì‚v€rf‘Læ ó€{`H«¨…[0ЇÎkH†.x€(R)Jæ‰50è¦hb£X‡c0Þþ˜€[Àçø‰ƒ‰–ŠŠF‰?Ê ¸k¼ÆkHà ;ˆAáèaðè¡þhþ‘’^c’Þ7`ÆnlÇ–í<(&£êƒ.XÌÎlÍÞlÎîlÏþlÐmÑmÒÆì/ȃqéiuðÖnm×>~ð€=þ6¡ìpÖÁ*€£NjÀ;g”HfQðáîá^]ø7ˆ¥®M…%Š}ˆ1°<Ø…j¨> A¸apǨå‰r k™†÷3 ¸X œzÓ£`S£èƒ½üR‘?BÇ®ïu@Hh4,/îÁ¶mcém0leFì\Rìú®oÈN…ì€W€9êƒÔÁ/µ‘ÔæiYpÇfbh˜#P0™«m/fÜÞÝFjD`ß>þ‰d¾gl„±†º)ƒB`¤~ 2Š ¸cèc¸…˜6øËD †(P?¨-Šqý& <x œIˆ,ØÇ;qHå«HÎýŒo™ïgƒû6IÊèß*š/ñö‘`6ð’6&?sÈ6耺qé ¯p ï Oí ?sf¹„F8êŸq:“s€*æçíÒlq“xñ3GZl>pê$ÊqC£h0W«x®øH‚€ƒ¸k€¢'—‰È5 ¸…±”kp¨‡°œ†fP?ƒ ŠD°Ð1¿3ñ4gìCÈ’¾ÀþŽsH߯óÃNlXl=>gƒH¡É6& tŸ)t ÿ‚3gƒDg~’Øžíê"ñl߆§ôÝ^qlYê¯ÙtÚ`w»ãNîñÉqæ¶ ðX« Ý\©O€Ú½†#Š0¸u˜,°Š,8ÉŠiWs‡(B@^¨¾Ivžp„ñ%óõxvvƦ^Úïþ®¯ÿŽl‡ô¼‡$¬‚¯âƒíKðo÷=olyxð¤tWwžawléiwGt¸ÆvVq_7|ÏvK{K(%!‡€‡ñçôÆ®G±ñ„Ÿç¦Øñ¢©6Š|¸]˜˜xcÀþwÂ[žøW¸[«€%˜3£ð…˃ƒVÊ\õ&ŠHxygú†vü®o6ÿFkÿö|æ´” Àó£÷qol?¥.¡§‡ú}‘úh¡úw÷Æ^ôoj¯ôÓ×÷Š„qY{§ÇötPuÎÉñ’Y£†±4 \ø‰‰˜! m(|˜Èõ¢ ÝV°Ø”€2hXÄ%+“å‰]Çb˜W™_pšwìiWf¿î¸?’ž—s€Gh Áµl¦p!ÆBd˜ À6/b”`F‹ÆÀÓ "É’û0âr%Ë–._ÂŒ)s&Íš6þUJÉcrç0v¾tìè À¥Žü˜èç¡ϦNIšPfÕªV¯b¥j¯×®\»¨ð4b—b΢M›–€;A/‚@«£»Yüp£v/ß¾~…º%x0aÁ@”8Bz÷.’‹çãl°å¹µ3dE.4),z4黪H†åñb=ÇØ°~@ÉGCnu[ñ‚0ØÇP“Á/ñâgY@õÖâ:€ÞÒvWãi%ÜQ Ŭ޿{W…P;ùa+.g£‘cPy¼î¾ZV~'Ê›öïãϯ§Îù }•ÞPEuä+ýp„þ1øPTS!x¯„Õàþ0eY'[n-×\AU2T…dX¢Z€7Ød·x#Š:w3kï¬s „AÂ6q3’ÜDŠCfÚ7:Ür†’,·Ã Cج5B$a™h"rÊ-×ÜsËÀYüQ"vÃÝÒ™•x ÁiÒyé©·Qzè€5jäÙP}û!š¨¢öåd!€|¸\#íP@¡ >X§¦UQ(VƒZ·az.76ðáA˜&¢èe.·í€ Kà3«0"d.…‰ÂZ– ܃—ÃI¤J’rËJf–‹Ar×=<ô"Ø7¬90¬``®jݘé™Éþç!ã`G$¾i¡œ›nzç¥$í™Þz|~ÒHﺨ¾ûîÛhƒ HTzG%µÔ»äeÊnZªq¢v(WzuÝ•W·ÆµêeeÁð Ø6øì*„ñ ä- P“SÞ"Rܲ¶¨›b0V(iÂ-Ò(9 a@D{—?6ÞBîc ÌÌ­‰"PNqß–éŸlD7]uÅ¥ÛຠÓéîÁŻܼ|ºŸ|…æË¯Úkßç/ƒ/iz"¨à×O%Ìu„ jV¨m*1Ÿ!Žx1q¹ ¡éÀ±¹,P˜1ûË,ßò‹`Æ,68·\ãó3V3p7*öX*·Hþ¡¤9¡4õ :¬)rã°J—hƒ  õ[áNÍFšk¶I\Ö n­7x^ß-E|Ž=5 ‚šgÚlsßýKnû÷[ró9i¥Ñó”·óÞñÍ ÃÅAü©S›Šªª†ó…øé·Dä-Û,#7ÚÍ-v¡„[$££€ƒøQ˜u,A­ÙD:xÐ1¢‘1 J-&·HÝbbQÀÁà¬AÚˆq„È Ôï2„‹Å<á}^PˆW¼q•ë\~YÞN̈4o}vO¡ 1d€mzòòSñØP/‘ŒÅ Ùž÷ºØ=ð™„)_PÈÇ'‚)EŒÑkBDþÔ§Ä«´Ï?s‡8ü¿ ÌojË^ð—ý¡¦c5ºEÇÜ`ÁðîP)²!CˆŽxÒ]¾ †‘nƒ¨ÙEÇv!€Z¨i·@kràƒhPFi`Í °˜ P¡»HÚpÂÔÈÀΆßÒÂÃŽø°xUÃåÕöBD“â'ȆC’øF«@N:*ÑŒ†„í-Õ+^Ù§ÄbG ƒ\¬ÃÅ;øŒ9´a_À†4˜.ã…;¨Å,bà þV¤‚"øÄ.aHDàTö L5`€ ; b¿ÄH0ç;Lê\¿MA--ÄQ‹+Õ£×ð3ü%$ Ï B5´° 0€Ã æ`;â ;x&¼CISK 7,X› vp7o ÀCÕÈ«C´€I¼²ð‚B.L“ ü4xÅ;¶Ðá¾~8"›@+D "HCÇ8ìE+ÏÑó`ÖE(ðZjÆÏ¬±vF@à ;Ö è¡!ÀEìCfƒBz±V5BÂ]ÔñÍFF¸;rp‚c&­ÆÌ‡´ ÔÀ‚ÁA2¶a„YªT0dFÍ1~šbþø€8°Â-Á†æÖ(}8…#Œ#,ù#` 1± #<+_ÀÃnMêvJÂC4bØø~II¦áYuä9äÐŽv¼zX:Ò†rœá ã(CÂ1†1|# _øÂíj 3ܺ\)èNY¡ €6|! á8:ÚÐ9ÌùhûÛc3‹ÁxáßjBƒÙ£w6èâIvHÞðZ´B—Q'^,ÃÝ4™&=°` °C%‰€ÚQ x°$aØmb€…-ÜÅzxÇ)®¡-|`~­JÊ`ÌcÎðGö·€îKŸúÖÇ~ÛúSŒ(`A7ƒÔ>€þ #D@lœÏ ƒ¬„ÃØHÜ ØÈ-V@ƒ0à ƒ1¸PÃôÀäÀ Ô‚ Ô Ä,ÀÀ ´+¬‚*œ*œ)¼Çn,)ÜøA,Ô „tUPˆ-T‚%`@l@|(„‚(ŒB ˜À ¤B ¨À °À+À@ È ÐB-ÌÁCëHƒ`˜CæéA,ˆ‡ÈOÜh¡CpÆ Cü/ä@-Ð ÄÀ+°+ € Â|*<@¼@rÜB0Á]”Á"\Ð.ÜFüÀˆÁÿÜ” ÁXA.€×hô\ÒÇÒ¡ƒLƒ$€X`CþЀ $ÝYဓP F.$Ã3TÃ6€ƒ9@)0@Â$\À&x@(*¬ À ÔBøB°Å F. ‚bØÏÜ]åÞ9€8Gë½åmâ!¼ÈýqÞš•:ú`>àÁ<ø] Ã„ƒäm5С3€… ؈TA%EB¶ÁÕ¶9'ô`9$1TÁ´Q)ÉŠDAµ…ƒ'ìÕ}0;Ã;x< \Á ÌB<œ8¨D´<JÊ1`¼‡ÐBI…‚JÀà ,‹`…ì.°:¬A6´$¼ä,Ä$Iš$Jª$KÚG Þ>Ð#¬ŽÇôþàç™XÀˆÞÍ)]åXÞ Æ2ÔÃ]ì–!…åURÃ`xƒ¹¥V ¸!Á¡ƒ­C ¼¥Û%‹`B ØIAYÜB1èÀ5(=ÜBr‘b™"“MÁHÝðÀ$4ƒÕ¹+Ødê@eÜ‚˜ÌyÁ†IeeŠˆWqdÔœ-øQ °Ãª]D«]Õ<1AÀÃÌ<\‚/pÁ6xt€7œ88ˆƒ9TÌÂ.(@o|lC<¡x¤˜8€Á6hA5PÁ3@A2,ÁXd–-èƒb”Ã[uD\U‘<Ð @C€"þP€`Ý8¤@ZÀ¤‚3èÇ4i–"¨D¼ Xh'¨Ž1C*H"‚J¸RNb/ÄC6À ¬‚Jd1´A6¸R¨Ä‡a‡z(ˆb…Z( `¨†N%ŸÙÁ”Ãd Ãô@-È€+¨B¼µÂ-p-\IXÀt¥~¥ƒÂOáA8[ÜAè?øCÀ@!€!"$‚",‚<@#8‚LT@%TÂ`‚-+äü[[v…à â(ˆB(|€tÀdÀ%XB%X€$D$<4‚0Â",€¤Á'D€§n€ ÜäþÐ ¬ÃYDh]>Ô ÄÀÀ!$0B#D$H‚øéx(ˆ ˜ ¬Â Œ. ‚*<ˆÂ-ôÂ"lÉ8 ‚æä1ÈA$ÈÒÆ/,ÃÝçL&e ×dî  À´‚7”&ÒYëÈF%P’`B.d"kÖ’‰€…¼ÃÍt€9¼×8S9^Õ$I?˜¨W‘„ eÁT#Cœxgçùš8†UR@‘‚Ñž¶ÙÞU@„„ðÄj´ÃT[?üƒòÍÄ4Å€5¤¨„È> ¬„ (è>|€ˆ>¨„€0ôÁJHBÓº’2þßÐíÑíb­}@<íÄ‘ý Xe=ˆ@[œE\ñx@ \9|Í$Õ ô øB…IÜQÜX8L´¤AæÙ*ÀÁYÈ*Ðjñ0À€4‚µÊ$@ <‚Ñ0óô2ø „ÆÇ0A¨€à\ºŽÙºf”¦À¨`ÐéØ]ƒ,€Àƒ7Ì\7IkÇO¹Á&€6LB¡n2Ã#PJ$ÂVÉO¨Ð]tA´çXulY}ì| ‚ZYÂÙ(„}fCNC6°ASDÅbÐ  ÁBà¬L09Œƒ ¥äyÃKàC%d>(Âþø`+a€JÄ‚x>€¨Ä5ð´”XŽÏrÓ-€+€ï»<‚‹å€<ÈØ>Éã6ôíS8Ì,¬@gùȽ¡ÈUÑ:”€UBC4T«<ßbHƒìÊ(¼ßçØkŠ4ƒÌ‚1,ƒˆ™é–"êjËä Áƒ*À-ÄpäÁ-,°*á@piîο–È*©ÉË4‚Ó¨ò²nÎ Â1<ôÅFÄci\ïBðÚmoyÀ;pÂ38„ø^~.‡~K6–@T€$[XGÞDÜR+xþ/$Ž °€·-„OªÀ+„ƒä¯+í ÜR×bh°ÂA‚ÈB KÕA€€JÌ21Ôò-{+»2,÷ŸStï‹É-C¬-´írtiH,úäTÁÁdɰ<Ö°S8 ?€¼‚ {–ã%O­:G+˜Aiµ &Ü2œÙ`4€Ü‚d1jdC. B;hDi1‘Tæh’dÀ<‚Íà€|B. pÀœ`t4-­J8‡0‚_𱿅Ã&EÄQôÒǨC,²52ydCÉN²BÞ'ù¾ÅʶìXøÃ ¹éU~\ Ä`Á­õ45äÃ=|þÁ,ÜÁŒªƒUÎCüÒÚÀ;ÐÁ pJpÁ”A>ìˆJ€ „Â8Ü7X5VkõCµTSõ47…?C…9D6osP¼-Ä-ú ƒÈB:è¢VV…ô ZäA,ÔA_nâ¾Åâ6îã––iÆ-pBÜAa܈„"‘LÎ%ÀB{ICÆç,A´ƒ ,Á-˜×`ÌÁ-<. Áišvaø®_¼A ÂÓÀÞÉŸ0ïç=¯ò¸ô|ÌôúÔt¡P²EXrG˜/újQ?Düz‘ß›MpðC¬°aei oé%£° ö0Ä49#6)¶ûôüÀóAååð 1Æñec¶`8™gþ ÉGk‹ç¾YnoqK¥ÈQ5ÁÐ/ïŠÆÜ‚Hའø-ìv_؃·79÷[ð¦;#7œ,·ó4wžüÆ©FC‹*8Y™·–hÁˆ˜Of®wË®{8 ƒ¸uÈùS »Â{ƒ{г&FO³?»³GûNL»Ž{i_;¶Ï0 oûeu;dû¬y’/y¹7¹»€°»‹FC‡Œd¹BC3À®Ó1“û{G¸9K›ÈÀ;EÁ³ËÁ3HÂwÄž÷ùûxÄ+=KL¼ITþI<ýŽc|âS½9w¼}|A…<âÉßóå›»æ+CßA«@T”€¿}˜äüÎÃy·¨þN°~¸þ|½Ñ_;à×>_Ý~DT|Ôó~úí´o$ší¶Ý~îþöúڙ6yj¯©^ykQµî[®õFì¸ ?ñÄg;8òÈ%Ÿœr,¤Ì{ð”ù¼Ó¿9OPðÌá-|ñÒM?õÔUêdÑ÷Ýüs2==¶†\Ÿ™ôÕuß÷Þ}´õÛ_…v g/Þ´Ð…_3÷ßúè~ù9‰G>Áã±Mùê+l^úðÅŸü¡©÷^Äë·‡Mûõê}àÀ/Ÿþúí¿¸óã÷j÷ 5ñ3H0Šs—HžíÀá‰oìиëÐrH0èÌü^" )¤âªxЈ%€a‡Á§ÈâCŽ›Üå6÷¹/8C<–Æ• ¨°ÂJªŠ•4B+2V¢Nu ˜ÀÆ Ä:ŒG´Dã°0j„a$('"@;Hb%È(ƒ#.a ˆc68G“ØÄ(F‚ü@ÍØqÕxœ.nÃþpˆG\â§xÅ-~qŒg\c*ÜØÉ:æ±,ä8ÙþF–ê<àax%^É…S<3b% ÀJ°¶aàÃh Ò\a6Âg–pZE)RÑŠ¢Ãâ7!ÂÅ¿ö!M4-jU{ Öd·ñ-AˆØ‚ ˆèAúj‚Ø`·àA*0ÍÛMßâ¶–ÎíAþ& ! xM‚@V°IlA¹ë^ÿúø€ a…ß.P €5!¸W œÐ°1`Ñ ß€·Á-†x¼ bÀµ²ŽHÜŒ~È¢bmlk›Ûã–€1Ñ¼Ø IøK‘ ƒ§Âb¥êJ¶ê`‚ábÀ,R 2`XŒA¯“%‡:Å-Þtƒ?Иe-oN^ú˜Â$fÚ‘©Lf:š7&5­‰ÍiS ÜôfÜʼnvcêÁ¡±5®uÝk_CVÙÌv¶°Ÿ}‹Y/’Ø‘Oö²›]øcó¶LˆŒt'K0 ‚¼ !Á¾Å°i[Ð+$nèÀ« K1У’ˆ ‡Tbâ ÷îçKo:$aÁ_€{ ~L„ÞI>ím/Üë>‹û6þy^ÂUìQ0Yø0žu–d(Qȃþœáˆ (1 9üÀñ÷‡Çæ7¬„?×?Þ/ÿù‹q.!Âá *,éjîpà(ýÖ¯ýúOþèÏþðoÿN.Ž0þØ*p é¦O<ªïúVü`BüÈ/ÍZ‚ª®ná´n%JÍFð0º@ˆË¸K¹˜«º¢kºð˺v0»¶«»¾K Âk¼Êë¼Òk½Úë½âk¾¢¾n+@êA‰€ ó>/4Roõ B°/ØjË ¸pÓNψ4ï šH F 8ÁÓB`ëôAB"d  à!(þ‹ ~aÖLÚÄàô€"¡€ÁÀa Â@ lA <"0 /17Q ^ ` PŽ@ Ä!°! áÂa‚ö¶ËÞ!äË€ %‘-1 ŒÏ¿†aN`%BÁÍ\âláVâVÂh%˜ñ%Ìj%œ`ÐVA<ÐH¼¡`áú!Àª †¡²   DBŽêo"á `ÒqÛñ‡á Ú`¡ô`¦†Á€Ä€¡ðpÄ‘ÍÕ‘Ýå‘íqðQùÑ/2 ² 2!²!þ’9Ì(—±[‚‡ÁWâ qÖFÎVbìLëbr&‡Aó§¦-"ìÍ!ð­ÛÄ-Ü’²ÜÎÍMÒmݰÍÝà-ù "ùŒ2Û¶-)¥^)‘¢ ß0 oA BèPLíF-ÙLíÈðÊò,oÁÓP• b€8 ¡ŽA0 D ¡ ,àJ $ML@z "0³0 @¡€L€ âVA8Á0CƒBÈàº@ÞO1è¡ì `@ È ò!h$ `S6i3Q` üà ’À~`ú¡ hÑX`ð€0ÊÁMôà¼T“þ5]Ó6=àÜÆ!/<(Vb` –ÀVÀ<€=V"R@.ÀŒ¡VÁ„À V<œdz<ï3?÷“«.!R`r¬”%H@ ô(až ôôS>ÃÓIõ¢ !öf¯ön/÷xO‹àT ~Oø†O Šïø$¢*çþ­ ™ÏM¡O‹¸Òób/ûò/'“0Có23s3ã’Ná$,M R ˜Áìò &iQGA3%S05!ÚG5Z¯eà'6ƒƒJÄütç]V]âU}§UÙ&11±1'±1Q9Q?‘E‘MU‘]ehÑqQyÑ{5=QBÅT³F Ť[ïUSõ$VÕ=j5uî ^,VÛÕ%Ô•]£]Í'HÓ4QóõV³5_ó—nj³_gó_ss7{ó7Å 8‡³839—³9Ÿ3:õ•:ÖÅÂ[?‡TIà F: oÆ•\ƒã‹n… þN@ D wÆ¡.Ú!!ݵ]Uv¤Zöw<èòìm|(dOB}d€F!Õú&c é@6gGdd]i“Vi}g‹v"vVh)/£V4mÇiiÃ\—Vk·–k©¢i¯Öj¨A‚Öˆl³¶kÓVm»ökÁÖ! Vlií[ã!ÌöjÑvmóVoÛµmÝnéÖeæpÂjÝVUvoWq‘¶oÁöo—l‹Èno×r/W|÷j—n#6Aèer‹¶r÷ÄlsS7qO—iÉpŸÒXtïEk6€¸àè$\¹¦pÄ9;D^e¯¤tƒâ>dàþÒbþ^?F†ê‚ÏJä†Thá ôÀüa(ªw8¼×g’7–·y©ây÷Dsvgmwu—wiWpãRò¤wÇdtâtÑìáUöÔ‹˜ÄŒš¨môa]ÁjÈ=fÕzo¥!Àø€„‚§â‚ƒ%€Øy[÷u7jå’~áwjKÏ„Ak” ¢HP@ "ëDaš…E hÀ T@+¸Ö¤*‹é˜¦ŒÁöá .áÛü ‹L ¥´ÈîêïþwÏ DKW!&‡RÀ ÀŒ~€æ©¤Á̆æTø Ði~ æ°¡NΨRþJŽžŠ-xaœ`<€%püáŽMNo Žå˜Ží8ŽŽ*Ý$ª@ÆŠ±x¬Ê &½ŒWBŒÉØŒÇuOâÂ!¨a£x+ä”9#„%¯†IéV¸…_˜ * †g8”B‹”n8‡w¸‡=k4j­×BÖ*íÒBââPxÒp« lÀ¨ 2­·~øKª2¯K ÖuHA`ÀFÁF!‹ê@½´ Ù Û¨GŽº€­†!'‡¡Îð¯AVbJèä ÀghNàaøkÐ(6`Ra2€Ê¨€ÆLîËÒ(Ìøø[ê¼%žAÆ ÚÊþ†Œ¢ ¡š¡ú£#ZŽ&ºÈ~Æá™%湞‡î9Ÿ‡aŸ‘Ο=™6>`@~`8Ñ$ü—6ŒÚ$ ÖÖxM˜c­˜â˜o!™c‹™‡Ù™O-š ‚š_Mj¿Ò„×-ÁH€f >Á ¬  ¯ò\ïš›PÜÈÍþÄí`Å€ê!ßâ´ ‘z1Ž7(Ì(` VB¬%¶Êêf €dhŽæ Ž Ž@t6ÁŠèö(ƒ-šE0Z£W‚£›à³;p(P³9Û³'WÛg ±›% [²Ñ÷“'ÂìBª`˜˜œxþ¾¢´©ˆ8‰—¸‰Ÿøš²I•c× %¯­Åš¬Í­oA­ ‚­ Ù!äzñðÒ«å÷ÐÐ .!$/¼¯½³;!Ì®E¤*å‹Ö9öÁ ä4ÞŒqùˆ%`§›«›%æb,<0µáˆXâøµa;´EÛ=üW˜!¶GœÄ)°Â× ÃS»ÄgûÀü¶<·üÁ3àVú¶øðá!"ÖœÙÁœç+•›½œÅ¹ÇÕK¯»4äÒ½ ¾å{­µp½¿Õ{óLø. âr ºA˜A-…A,«|– ¢.ßçw#×k•XÅ­DþaXA^A > бœZù¥À?%0`âlΠnmÁ&¡%Vá”d 8xfð”ÀŒŽÚaîA=rç`%P2’Ã¥úá öá:ò±ÔO!S½a$>=ÔG½Ö?ÒÔ2×U]’ ýÐå9ÑwÿýÑ#½Æ["n<Ç!À{/°í‹öº¯ÿzÀ¿ÉIC.·¼ ºüËÃ|ÌË<ËÉÍáz´n7w™ánQ+óÐ@HAó¢³fá´î=4ã×0  :õS«öK~©ChÀ6¶6±èÚÀ¾ÀÀÁ!þ`@ü` 9•}IÄ7TÀ°TKé =7 €jF¥wTÔÀ;á(Ö`¶€*ŒG7”%RtE[tÕ¾ ¤€{W"é}t醾èÞê3Té©QëAFåYÞ坿UAæiÞæƒ¥oƒ{¸âª`À“o¿ÙÍ!þûÚû›vI#ÞÛ—Þí=Tñ]ßùÝß^à Þð)óà ˆÞ21ÓSµ«·n×eÿUûVÄ ŽgßuJzDî¥]">¡^A|ÁJBÏùÜÏj±FŠÎíÏk¿ÏàÏÅ`sÿþ@»5Tãwpï—6ÖÕ€j@ßQ8! §ŽìÁô'ûñÇúW80 øà J¹ã?>äGÞ!J~9yýâ3~ãÏäEžäöäU&ù•_nKXó6  äC° Áƒ"”pc˜Ã‡#JœH±bEQ©ªX°È±£GŽgh—ì£É“(Sª\ɲ¥Ë”!G–|I³&EŒmRì@¡ÏŸ@Å,À.¨Q…ÂÝZÊ´©Ó§P£JJ•ªHUU³jÝÊU„£`Ê=ÊP§Ù³hÓª]˶­Û·pãVä9¶.Á,°4)׿€C½*¸°a¨^ù*^ü³¬ÜÇ#KžLþ¹²eÉtE'R f„~‹Ý”0éÓ]¿~^­Øñå×°cËžM»6Ë̬s‡ º7`Ó¾ƒ#V­»¸Q×¶“+_μ¹óÛ=K÷É[¸u©À¯[O<½û†ÏËO¾<æèÞÓW×Î~iöö½¹§Oܼýûøóë—ˆ{þôõð]÷^€¤Éçßtõí§à‚ 6øZ Á HáaþTŽHE0t"UPm $]‚BTF‡"Qá©@äE=1B”Ž:3µèãD/Â(ã04Úˆ#C:´c?Âa„¹Mx!j’ {ú„—é ºr8d1ðùî¢qÐçÃP'`‡$uC'²˜€Ì0qÂ?èÑ À¶ã´E/Ê(ÒJ´ÓPKMõ0V‹”õÖ]öØdOéA[vù¥‰b’iæ©jv÷po 8±o@3$€€Ãvœþ4ô£†A‰ƒŽ8šñÀMAC…bÐtèqÅ+($l‹I?P@ïC»û¹è;0>Á;–@¤…÷Hq9}×Vûí¹߬ڻß¡ðkÿÐñÉ/ß¼ßg À§¡ŽZj‰….†ª²ê*¬²Òj+®ºŠÁ«¯À&´øh‘O^ùåÖþÁ”h'Œ%DMdDúN2…©IX€`2T)LÅ ÊpøŒl*Ž6½>íN?ð‡ ýQéA$s¸D,Âñ%|O6!¡îÔæ;. …+d¡ CÒІ7|VøØ!ŽyŒêY^a2”©Œe.ÌD2³šÝ,g;ë™þ” G€‡1£o ˆ-E DÎdA ˜c^ìH@eÆx/úƒJ G ˆè>$íø@vs|`„:â†àeƒ(Æ0ÖáI8…Ò!îÔ€ÑZô# ð@zà;|òâpþÈÚ0 EÔ@ÿJâe2¹I‡tò“§$%2E9ŒT®²•¯Œå,kyË\c—½üe0“ø7ÑqÎs¢™úXÒuèt¨R]AXç:ØQ‡ŒíQ£oÐhLlj3BAA&=8’Ÿð'­æf`À (XƒÞ$ ²A˜ÑŽ~ôã Ýϯ=$H"¹G.ÃÑ!‘j‹õ0š‚rìC?„CÆÑ¡W8„m°è LØt-éH…zÒ”®´¥/éLkzÓœöc§=ׂ@†sD'HAÔ ƒä Ç {JŒbS %ŘÙEõ­p+þ¤¦ ¸¼¼1Žz¬ãóHG>ŠÁ€$! ‰HE2Ò‘b€¤$)iI²¦õŒ{¬hÖÊÖÖlT®˜Í¬fiÒÍ‚pF$ú$@:ZÄŠ5(BÊP‡Š¢’¨(jQŒ¾S²Š,n CÙÊÚÅ­› ®p‡+UßF ž»% =“+•ÞW,À%®t§ÕÎ>W,ûcîV–«Ý§8÷ºd¹,uÇK^aZ¼GÉnw«ÂÝõ2å»èJtËKßú6è¼ñŠzÝ‹Ýò·*ðͯFíKàÿ¿F rÿû—öò7À >ˆÖÀ‹ [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠþWÌâ»øÅ0±èaý.˜ÁÛõ/Ž£á„²‡Lä"ùÈHN²’—Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå(³ÁÇØ½ñŽÙ«cë¶¼çMïzÛ{>ɆJ¶·Ýí¥|;Üã¾E¹Ïî[¬»ÝïΊ¥o±^¬` KAS@°”O4­#øÅ-6° AûÞ ¹ÈGNòô&<+ xÄ'^ñ‹3%ã︵ó¬‹á#+g Åoaq¦ • ðÁ$0ôñ’ýèHOú¨óý›ãü×yË}Π ]4 ·˜$À@npß?DÎ-Œ¦˜`Ù ºÒ×Îö¶»=ÎLwŠÖ¹.p¯ƒÜc¿…>ÊΔ³§ý0–~4 P1W›à’hJ%NQ‚JÌ"LÄ &[ô·[þò˜Ï¼qâÎþÁÞðˆW<ãù¥H~4 ' AyÍ»þõ°=£™»zÔ_»=–FëeÏûÞû>óœïMîmOóöx‚ÐxÄîÏüæ;_äÁ'Íñ“Oü1O%ÞÏϾö·ÿæè»7õÚÅ>÷ÇOþò×ûë?sÅoþö»ÿýºAwÕŸ\öÃÿþøÏ¿Qä¯]úïÖþú€˜üÇ\þ‡[8€ ¸€ãW€Éu€’•€ 8è{¸[øX°©Ðø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃&8'g}¥q{Bh˜p„H˜„J¸„LØ„þNø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†RøwB¨pD¸†nø†p‡r8‡tX‡vx‡x‡z¸‡|؇~ø‡€ˆð‘‡‚Xˆ†xˆˆ˜ˆŠ¸ˆ’EˆŒøˆ‰’8‰”臎X‰˜˜‰š¸‰œØ‰TÒ†žŠ¢8ФXФx‰¦˜Šª¸Š¬ØŠóŠ®‹²8‹´X‹Úж˜‹º¸‹¼(Š¸Ø‹ÀŒÂ8Œ€ø‹ÄxŒÈ˜ŒÊø}°¸ŒÎøŒÐØŒÒXÖx؈uÔ˜ÜØÞØÆøâ8Žä¸ŠáXŽè˜ŽêH‰ç¸ŽîøŽðø‡02ôXöx.ø˜ú¸üØþø9Yy™ ¹ Ùù‘9‘ ;mod_perl-2.0.9/docs/user/handlers/http_cycle_trans.png0000644€ÿÿÿÿ00010010000021464211727205031023267 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy<”ëÿ8þkÆ2ö%%Ù"e«´¡tˆ”¨”öœ6²UB*9§:)§ÒI6ZN¡ˆêPQ‡¢$©)[Ù² ²ÍÌïëûžŸ™˜ÆŒ×ó÷cîë¾ï×ýºÇûð꺯ûºàQ„–––¡¡!§3`§ÀÀ@BÈÞÞ> €Óɰ@ r:€þ…x:àYPè€gA¡ž…x:àYPè€gA¡ž…x:àYüœN ¿¸¸¸¼}û–ÓYƒÎ±cÇôõõ9ÅáÙB';;[KKk„ œND***8ÅÀáÙB!4aÂ###Ng "œNa@Áð,(tÀ³ ÐÏ‚B< nâââÂéØ,((èèÑ£®®®œNoâå·®ºËÊÊŠŽŽ&‘HT*URR²®®nÏž=œNêÿðóóóððèiïÒ¥K ‡3gÎ455=þ|ÆŒŽŽŽbbbýw-[[[„ÐÑ£Gû!TèÄÅÅy{{ãÍòòòƒr6¥î¾ÿÎ`¯‰‰Éä€û:´k×®¸Ð†P¡sûöímÛ¶Ñ7ååå;wç<|ø0##CPP°¥¥EOOoáÂ…¸ýìÙ³¯^½7nF«ªªZ»ví”)S~º«££ãÊ•+555¡ÖÖÖ_~ù¥óŒ>‰‰‰B¡*•êåå…:uêÔ«W¯èÝzzzÆÆÆøóÕ«W+**¾|ùâïïßýÖ˜Hž9=Ý×ßÿ`jjêììŒ7=zdff†7@ÿB…•JéÜ¢ªªŠ?$&&ÖÖÖþöÛox3444>>ÞÔÔ!äìì¼mÛ¶µk×*((´··ÿñÇôZÁ®«W¯ZYYÉÉÉáÍàààW¯^Mž<!”””TUUµ{÷n¼«±±ñðáÃøóŽ;è»:Û°aêásÉ3§§ûÚ¶m[{{ûêÕ«qûš5kZ[[q•ÃøÛúÕÐ*tzÚ•––F¤…Z½zõÁƒq­€RTTTPP@ t°ÒÓ®¤¤$ÜQ(AAAü§=%%eÿþýô]bbbGŽa徘N¾÷ñ¹ îËÆÆ&,,ÌÉÉ !¾bÅ úa ÎúÕ*tøùùëêꤤ¤àZÇÿaÇ BˆF£ui!ýŸKΟ?Çë0¸/%%¥ÊÊÊææf>>¾ŠŠ eeeú.gýj½^¾iÓ¦¿þú‹>Ú·¦¦ÆÝݽ¾¾!4cÆŒ°°0ú‘ááá³fÍbåZ'NŒŒŒüá.;wîÐ7îÞ½KßlnnfÐóôClO¾;zJ î !´téÒÛ·oGEE-Z´¨s;ã³€þC@ÙÛÛp:6322²±±é2赸¸8((H@@!ÄÇÇ·yófiii¼+&&æÅ‹$©­­mÚ´iôñ¼þþþiii¿þú«……EaaáÞ½{çÌ™ƒßKb°‹F£Ý¸qãÇ"""BBB2223fÌPSSÃ1ò³³%$$H$ÒÈ‘#—/_ŽSB=~ü8..NBBBPPP\\|ñâÅ222¡“'O¶µµeffN›6 !$..Ž1<ô×Ëõõõq }4ãûB¹¹¹Ñh´“'OvÈà,Æ÷€í\\\<<<,--9È@ à‡&C§Ð†¸¡Vè ¡GWj ÐÏ‚B< ð¬!4¯zûömDD§³^àââ2bÄNgØ ®WQQñùó矾4€1//¯ 6@¡Ãc Ðá K—.åtÀÝ|}}9`?£ž…x:àYPè€gA¡žo]žröìÙÒÒÒ’’’Nç€ó ÐáeOž<Ù½{÷‚ ¼½½“““½¼¼,,,¼¼¼BkÖ¬=z4B(%%eΜ9¡ÂÂÂððpÆ»|||Ìæ;‚Bgˆ’““ë©…Á®.ÔÕÕkkkYI£½½ýÔ©S•••¡–––… š››#„|||îÝ»·xñb\™ùøøÜ½{wÉ’%x³§³€. Ðáq¥¥¥ôç8¥¥¥ôvww÷.GzzzþtWAAAººº¬¤wæÌ™Õ«W+((àÍsçÎ=þ\__ßÛÛ»­­ÍÎηÛÛÛ·´´Ð»£z:‹•Lð$(txœ¢¢"ýIý +påD ¨Tª©©©‰‰ AðH˜˜Ü1ƒuttH$\²lܸñÒ¥K¸J»råÊÆé‡18 è Ð7+'¦=zב••í)šªªêׯ_›ššøøøÊËËÕÔÔ軜tóè R©øÃ´iÓ®_¿ÞÓaëÖ­»víZhhèÊ•+;·3>  ƒ^väÈ‘ôôtüzyzzº———£££’’B(;;ûÆééé{÷îÅ/ga=íòññÁD"qïÞ½bbb½I¿^ŽOÄ-%%%øÃÎ;vìØ!***,,,++kdd¤©©‰÷êéé9s†J¥v~nÅø¬´¶¶¦¦¦âkIHHÀ«æ0”BöööœÎ„ÍŒŒŒlllŒŒŒ8H¿KHHHLL ât"ÀÝôõõýüüTUU9Hÿrqqñðð°´´ät"@ @€ÚÚÚ²³³ ÉdrSSSCCƒˆˆˆ¨¨¨¤¤ä¨Q£ÔÔÔ§Ó PèXõñãÇÄÄÄÇgffVVVêèèhjjŠ‹‹‹‹‹KKK777—••½{÷®¤¤$??¿®®nòäÉ&&&zzz¼Tô´´´<þœÓY€^?~¼ŒŒ §³ “jkkoݺuãÆÊÊÊùóçÛØØœ={VQQ‘ñYOŸ>MJJúý÷ß W¬X±~ýzúÀ,®öåË—•+WN™2…Ó‰€Ÿxÿþý¹sç`¢Ñ! @ŸÕÖÖž9sæâÅ‹¦¦¦ÇŽ311!{û §˜˜˜©©©©©)B¨¸¸øâŋ˖-ÓÑÑÙ»w¯ŽŽNf=deeƒƒƒ9ø {{{N§¼^èvíÚ5===2™üöíÛÛ·o›ššö¾ÊéBYYùСC?~´°°XµjÕ–-[Ù›0`ˆƒBÐ[UUUóçÏ¿zõjjjj`` ²²2[Â’H$—‚‚‚Q£FM›6íéÓ§l  @/}üøÑÌÌlÞ¼y™™™l/""ò÷ß߸qcÕªU¡¡¡lš`Œàç>|ø0oÞ¼'NlÙ²¥_/dbbòüùs333„ÐêÕ«ûõZ€¡ ÀO444¬]»öòåËË—/€Ëihh¤¦¦N™2eÔ¨Qsç΀+x<ºüÄöíÛçÏŸ?0U¦¨¨xûöm[[ÛÎËÔ Ð0’––öúõë'N°+à¢E‹zsØœ9sìíí=Ê®ë†&(tŒ:tèÈ‘#‚‚‚ôkkëÕ«WÿñÇxÓÇÇgõêÕË–-ëeÀÍ›7ÿ°ÝÝݽK˾}û"##éKÀ`Œ G%%%xòâÎvvvT*ÕÂÂoz{{GGG÷~*¥K—þ°½©©©K‹´´ôªU«îܹ³cÇŽ>&úÅÍ›7ÿýw …òßÿýt l èÑô(&&ÆÒÒ’¯s£²²2îeÙ±c‡››B¨´´´óŸ½sçÎíܹÓÕÕuË–-Ïž=£·?~ÜÕÕõ‡…ÎÞ½{ÓÒÒ\ÿ'22·[[[GGG÷Ç­ $ccã±ÿ3qâD‡êêjc¾yóFWW·¡¡¡s£‰‰ ýB&LØ´iSii)‹êLWW¿7×b—~Q`H@òòòôôôº4Ò ææf\u)tœœœð¶eË–3fàÍ]»v!„\]]»_È××·¶¶Ößß¿Kû´iÓrssÙs3œãêêúðáø¸¸•+Wòóóß½{×ÕÕ5$$„•˜uuu ôÆíÛ·?xðàÑ£G666$éþýû[·nec¥¨¦¦feeõàÁƒ¸»üð‹C :€}ýúUAA¡K£¸¸xCCëW¯&OžÌÇÇ—••U[[+--÷vttœ9s¦  @@@€H$~ùò…•¤¤¤ÚÛÛ÷îÝ;nÜ8>>>>>>"‘È×Il²’ðYYY ÇÅÅ9::***ª««ïß¿¿®®NJJŠJ¥^¾|ùúõë_¾|QWWß¶m½Ë!T\\L¡PðËö‡B™›› „ðë÷aÛ¶mÛ·o_¼x1‰Dzô葃ƒÃèÑ£555½½½+**FމJII9}úô»wïÄÄÄŒŒŒvîÜIÿá>}ú4 àíÛ·d2Y]]}ß¾}ôò”J¥†……}ýúUMMMKK ·3}-véÒ%|˲²²cÇŽ}üø±¢¢¢££#~.–0zôèm۶አ?&c‰/Ší?b0˜A¡èQss3Fûá®èèèµk× \¹r¥ó1¿ýö›……½ÛÆÁÁŨTê… X Ò' Ê zã÷¶···´´ü4>™L&¸¢:pàÀ7 LMMŸ?îäääëëkccƒÊÉÉ9xð žžÞܹsÉdr||<}\ö–-[’’’bcc׬Y#..N ŒŒŒº\¥¢¢"&&FJJ × ±±±...ÚÚÚëÖ­#“Éqqq111¢¢¢¡¬¬¬—/_êéé3æéÓ§NNNéé顃^¿~ž!ý©"Ó×:räÈ?ÿü3sæÌy󿥥¥=~ü!´téRü\ 7¸…J¥ÆÆÆþ4 ‹_àyPè~,55õåË—eeeÝw„OŸ>©¨¨ „ÊÊÊ:÷‚TTTÌš5 ÎÎÎîý;ST*µË æÚÚZ!!!!!!2™|ØÑÑÁÏÿ~Wœ>}šþù·ß~ë¼kÆŒôá]0žýoáÂ… .잉……Å’%Kôõõ---ß½{7oÞ¼„„üÌ¢Ÿ0=RGFF†ñ‰]ÞÊÆË¿'$$¨««#„h4Zbb¢˜˜~TXX¨¦¦–••õéÓ§’’’°°0???)))z„ž,nÙ²EJJjñâÅÎÎÎaaa|||JJJD"122RXX¸ûñ¾¾¾ššš~~~***áááû÷ïÇírrr¡/^Œ7·t/Jút-|ûñññx¬•Jïr ý¦Z[[ñÆÉ³òE¡ Àÿ«œìرÃÊÊêúõë¿þúëÀgR]]þäÉü%..ÎÂÂ"//O__?%%…ñC¢A%::?‘ TPP°³³ÃOèÔÔÔ,,,Nœ8‘™™9f̘ŒŒŒììlOOO<8&>>ÞÏÏ/&&FCC£µµ5??_LLŒD"á˜x̯———––Ö—/_ÒÓÓ---§Nƒ öôô<~üøš5kvìØ±bÅ ww÷ ñóófgg;88ØÙÙ!„ÉdrDDDyyyJJ BèÒ¥K3fÌ077Ÿ3gÎRSSrssÓÒÒB—/_ùôéS_¯¥¦¦fiiyúô鬬¬qãÆá[¦Q£FBùúú*++çççã¹ Þ¼yÃ8y&¾¨ù±ƒÁ‚!4mÚ4ÞûÁ_½zuüøñx o+*****êi6úäÅ‹+W®looß½{·‡‡BhìØ±Û·owrrêÒ©3öìÙ£¡¡ammmdddll¬¨¨¸dÉ’øøø¢¢¢¸¸¸U«Vuž¯y0¨«« ë^:::fff"„²³³ß¿¿nÝ:\Ê „LMMRSSŸ>}*))¹k×®õë×ã]eee¯^½úðáCffæÇÇâÄ \ „FŽI"‘ÒÓÓ©Tê‚ ìììvíÚ…/ôñãÇ+VŒ7®¸¸8::º¥¥ÅÍÍM]]ýíÛ·?ÎÉÉ!³gÏ^¹r%îö˜4iRrrrRRRii©²²rMMÍ›7o ×®]kffÖÒÒ’’’’ššZYY©¦¦VSSóöíÛ/^2q­yóæ‰Ä”””gÏžÉÈÈÌœ93//ï×_•’’’•••––ŽŽŽNKKûöíÛ˜1cª««eeeííídâ‹JLLœ6mÚØ±c»ü¤.^¼hffF…WÅÄÄÌš5KCCƒÓ‰ „ƒBööö]ž}ò###›¡0À>!!!111((ˆÓ‰®—••5þüöööõë×w~8µuëV ‰‹/d2ñññË—/ÏÌÌ”––VRRúüù3.*++ÍÍÍ‹ŠŠæÎN¯ƒ¢¢¢%K–$&&r:nòðáCüJù€]$377ïÒ®¯¯ïç秪ª:`™p„‹‹‹‡‡ïupü@€™‘!TZZjmmÝÞÞniiyêԩλþú믴´´óçÏX2EEE«V­ >|8_yy9½ ‘••ŠŠ’‘‘ùï¿ÿœ,%ÀvÅÅÅþþþQQQ!ü¿ô(t¨±±qåÊ•uuu¿üòËåË— Bç½¢¢¢!!!ûöíëÜÍÓ²³³ üüüðkêõõõ]^öVRRŠŒŒ$‘H]j2ÀEÒÒÒÎ;‡#ÿpzØ †:¶uëÖœœuuõ«W¯þðaªªjrrò™3gÜÜÜ:::ú/™û÷ïÏž=ûðáÃôag—/_ƳÜv6a„k×®„?þøãÉ“'ý—è?«V­ÊÏÏ/(((((€ç} ÿ@¡ÀPwòäI<Élxx8ƒõ€”””bcc333'L˜ðæÍ¶§ÑÐаyóf‡ÈÈÈ%K–ÐÛ[ZZèËt6þü}ûöQ©Ôõë×ã× ;(tÒ222Ž9B BBB~:TZZ:**ÊÍÍÍÔÔtݺu>|`KMMMÇŽ3fLKKË‹/¦NÚy¯——×Ê•+x¢›››……E]]Ýúõëés®@gPè0tUWWÛÚÚR(¼êao¬X±"33SUUU__ßÂÂ"**Šé‡YyyyîîîcÆŒyöìYLLÌÙ³g…„„ºSTTÔÓéáܹs#GŽ|ûöíï¿ÿÎ\Þ…C×æÍ›¿~ý:{öl¼’Q‰¹»»ggg/\¸ðرc£FZµjÕÅ‹óóóznqqqTT”«««ŽŽŽ‰‰ @xøðá•+WðìÀ]|ùò¥û;ÀIHH„……‰Ä‹/ÆÅÅõé.CÌŒ ÀõÏ?ÿ¤¤¤ˆˆˆ\¼x‘¹ÄÄÄÖ®]»víÚ/_¾$&&&$$;v¬¨¨H]]]SSS\\\\\\RR²©©©±±±®®®¤¤äÕ«W¢¢¢S§N544<{öìĉ_¢ººZOOñ1“'Oþã?¼½½]\\ÒÒÒ†ÎĽx: EŸ>}ÂkT?ž>‡,ÓF…+„…BÉËË+,,$“ÉMMMd2yäÈ‘jjj’’’rrrjjj}Zºaâĉ!!!?=ÌÙÙ9>>>99ÙÁÁáÖ­[Ìß ËZZZž>}ÊÁ@oÔÖÖr:0p Ð`È¡Ñh[¶lijjZ¾|¹••{ƒóññikkÓ²fQ~~¾¢¢¢ˆˆÈOüçŸ&OžœpçÎújÛLXXXMMíܹs¹:è=!!!.Z+ ° †œ«W¯fffJHH;vŒÓ¹ü„§§ç¶mÛLLL~z¤´´´ÏöíÛ===ùåŽ,W$''‡×Ô 0€¡¥¢¢âÀ¡¿ÿþ{ð/^(//ßû¥ׯ_oddTSSãååÕ¯Y¸: -{öìihhX°`ÛZõ‡sçÎ)**öþø . ݼy¦K`Pè0„$''GFF  þ‡V¡ššš’’’>"''çááA£Ñ\]]»¬š Ð`¨èèèpwwGíÛ·¯OÝ$œ’˜˜ˆŸ²õÉÎ;ÕÔÔ ú!)—B€¡âÒ¥K………JJJŽŽŽœÎ¥WH$ÒÌ™3ûz‘HüóÏ?Bþùguuu?äà&Pè0$ÔÖÖ=z!äçç'((ÈétzÅÊÊjË–-Lœ8oÞ<3332™|øða¶gà.Pè0$?~¼®®nîܹfffœÎ¥·^Àû|}}[[[W­ZÅ® ‹™L655í¾˜yïíÞ½;88øÁƒÏŸ?×××gcn=©®®Þr’k:̆¸£¶¡½Ÿ¢ p5(tàqïß¿¿uë??¿··7§sé))©   V"Œ1bÇŽÇ÷òòzôè»c ¾¾þÅÍ2ãícàZ€Ïo”A¡3D@¡óõõ¥P(vvv œÎ¥^½z%--=zôhV‚lÛ¶íüùó™™™)))sæÌaWn ˆH 9©À…+ Ó¾q:0p`Œ¼ìÝ»w÷ïß'‘H»víât.}såÊ•¤¤$ƒˆ‹‹»¹¹!„`¤C:ð²ãÇS©ÔM›61‚Ó¹ôÍĉ§NÊz{{{))©¬¬¬””Ö£¸:ð¬üüü{÷î‘H$WWWNçÒgvvv:::¬ÇݶmBèĉ¬Gp(tàYþþþT*uíÚµ²²²œÎ¥oÈd2ëÏ­è¶lÙ"!!‘’’òâÅ vÅp (tàMeeeøe«íÛ·s:—>{÷/»¢IHHà–ýýýÙÀ- Ð€7;w®½½}É’%,¾¸ÄbbbË–-cc@‰ôàÁƒ‚‚6† ~PèÀƒ‚ƒƒBÜØƒš0aÂÖ­[ÙpĈ«W¯¦R©gÏžecXÀà…<($$„L&Mœ8‘Ó¹0#,,¬ªªŠ½1‰DâÍ›7¿}ƒ9TB`Â@x …B D9::r:&?~\WW—½¯Ä;vÞ¼yqqq×®]Û¹s'#÷Þ›{_ƒ6euo÷z9w˜’ðÀçÀP=:ðš‡~þüYEEÅÔÔ”Ó¹0iöìÙªªìŸ_ØÁÁ!tùò厎¶ï=ýµŠãŒDM_¯„?úôèÀk.^¼ˆÚºu+‘È­ÿ’9}út„;w®ššZaaáƒ,--ûã½a¼Cík.ù݃ “jåÙ ïTBý5÷Iù;2BhmÀäÔKŸK^׫èI­¿4El¸`ÁãšÄ¿?–¾®oièÓ·:¤9Ö@!ä«›\ó¹Y{¾ìÇ´oí-¥ÉRÖÇ´å'HЯ•zéó“KŸk>5S)4)!­y#–ùMàÌmÀ!Üú{ðCÉÉÉ"""kÖ¬át.LzõêU?ÍbL ìííB—/_f:F£R© ¥£Ø<Ò[ IDAT££½½½­­­µµµµµµ¥¥¥¥¥Ñ+­(,,% &#عEDZ@DZ!4ÇAu‘¡¯ÊÞ6L[._[ò½äU=BèÓ‹ºÏÏk•§HlM£Ò®mÈ¢´QBšóF „ò«4瘹A¹¶ìûå5™ÔŽÿ—DYvÿ{sÄFØÖ[­ØÚD©)þÎôÀ¥ GžråÊ„ÐòåË%$$~zðàôèÑ£æææ~ZƒsÕªUüñGrròèÑ£‰D"­g¡žÚIb°WiŠä¡ó:·(èHü‘ÿÿZtW)Šò½©Pž&µ6prçQ;óvªM\82'¶ò{C»‚ŽÄ—2¹²UJQxÜ™ÔËŸínê5”A)O•ºáøº®¼e˜²0B¨­™‚B4Ä/ħ>EjÊÒQÂRL|ip5(tàííí¡¡¡¡M›6q:æéëë“HŒÊVHHHX[[7440ð#¸!„wéôÎê³:]Æ&¿¼Uæò†JùÿƒS;]g˜ŠþÀO""„臩N—6rR}v­¸(½!Ä'@Xॡ4E’õ à"PèÀ;îÞ½[WW7eÊ”I“&q:æõS_ÝÚµkƒƒƒ¥¤¤^¼xÁÏÏÿÃÂ…^»ü°½'……… V±!ÅnW¹÷ûûQãÅWŸ4bŒHúõÒ;žïz¦"¿Qvœè¡Óê¢æšÏÍÏ‚Jb|òô×*â'e PèÀ;‚‚‚B¶¶¶œN„y4ÍÓÓóرcŒK V444ˆŠŠÖÕÕ¥¦¦ZYYõÓUzò½®=õJqYv=B(éôGù 3U»ý ‹³êBÉg? I ñl-2L!ÄG"¶4tdÜ(­-ýž—X…J>[¤f0,/¡!”r®h֦ђòBoc*BÙ÷¾þ²} Bè]LEÌáü×Q_Gi‹w´R¿æ’IâüB04 -ðÿxxDqqñ“'OH$ÒòåË9 óÊËËïß¿ßUBhòäɸÄ“G°²· ñ' ²ïW „ž^-N>WDß•~½W*O¯•$þ˜à_X‘߈w­ œ$ DL øô>¡j˜²B(õòçøc…©5øóÛ˜ŠºÒïÙÑ8>KRAXb$©0µ&ù\Qfx™ìXQ§¨éÂ|{ÇpôèÀ#BCC©TêâÅ‹ÅÄÄ8 óH$’§§g¿^bĈžžž—.]JJJúúõ«œœ\¿^®‹±2GËæÿp×ÞŒ{©èI{<6üipßb³Î›Ólä§ÙÈ÷5Cx ôèÀ h4ÚÍ›7BÜûV96|øð7ö_üòòrwww)))sss …Ñ× PèÀ ÒÓÓ‹ŠŠ þïþÁ,88øõë×ý?))©®®ý¯" ë¿kxt/GÙØØpïlÈØíÛ·û/þòåËgÏž211‘‘‘ÉÉÉy÷îÝøñãûïŠÎâî߉„P{{{TTBÈÆÆ†Ó¹°ÊÅÅ¥ÿÞ§Ñh$IEE!TUU5lØ0„¬gƒB®—””ôíÛ7mmmmmmNçªyóæáú£?¼zõjÉ’%ø³œœ~†•››ÛÔÔÔOWp:p½;wî „–-[ÆéDX•ŸŸW$í'©©©ôZH$®X±.**êù$wƒBîÖÑуZºt)§saUVVÖóçÏû/¾‹‹Ëž={è›ôÒž…Ü->>žL&OžúÇÉÉéÏ?ÿDmÛ¶Íßߟގ»sFM ú)À@‚Bî@¡Pbcc‡7fÌú.\èäääp.;VMš4 ÏPÌv™™™Ïž=ûá.{{û'N„;w;v 7Âx :p¶sçÎ;wîHJJÆÆÆjkkwÞË=:¢¢¢'NìÈaaa Ö±Ú¸qã©S§ˆDâîÝ»>Œ`€<Þº€ x{{#„œœœ¦NÚe¯¶¶6‘H,((hooàD‚¬rppغuë”)SØÙÂÂBYY™ÁëÖ­ãççwqqñöönkk«©©AУB€ÁîÙ³gø³¯¯oppð¢E‹-ZdllŒ—¸3fLAAAaa¡¦¦&G“eRzzú®]»ú#roVÆXµj•€€€ƒƒÃü!..ŽXëÑqwwÿöíÓ§ƒsåʉ5@¡À`7cÆŒÒÒÒ”””ÄÆÆ–––^¸páÂ… ¢¢¢óæÍ³´´´°°˜0aBAAAnn.—:±±±222l{ïÞ=aaáyóæýôÈeË– lÚ´‰L&#Öztâââlmm‡ Æt0víÚE£Ñ Ð  Ð€ H$SSSSSSvíÚµ;w"„ššš¢¢¢¢¢¢B¸JÈÉÉYºt)‡seЬ¬l„ˆˆX´hQ/¶²²úý÷ßñ;,>º233STTd%èo?\û ð$Œ 7!eeeø³“““¿¿ÿüùó…„„ðÈ.|ÿþýC‡õGäÝ»w÷¦;‡ÎÉÉIHH!„ûu< ¸Ljj*þ°|ùò_ý5,,ìãÇ¡¡¡¶¶¶\:4$''§Ÿž Œ?¾Oøùù BOž<é|]ÀMZZZ233B#GŽœzôˆía=<<îÝ»ÇܹӧOGõ´B€»@¡×ÈÍÍÅx/^Ìé\؆F£Ñ—ag£”””±cÇ2w.~àõüùs¶fô˜˜˜Œ;vÆ x“F£Í;wìØ±³fÍúþý;>|8öGJKKzî›7olll455544,,,Œé£Úß¼y£««ÛÐÐÀDJ PèÀ5è/–O›6³™°‘‡‡ÇÍ›7Ù611QKK‹¹s§M›F$ß¼yÓ#‡°9sæ „RSSñbé©©©¸"Y½z5+}u666xÞ •+Wör¡úúú7–••­\¹ÒÈÈ(//¯¸¸¸¥¥ï­¨¨¨««ƒBp5(tà111øÃ©S§8› ÊÉɱ7fuuµ˜˜Ó§KHHhhh´¶¶¾yó†Yu†ßí¢Ñhx­ÖˆˆܾtéRðôéÓ 6èêêjhhXZZÒ¢YXXà~[[ÛñãÇëêêúûûwžSÀÁÁaÙ²e!GGGü¿ˆG¥R/^¼8wî\0..Ž~ÊëׯëëëÏŸ?ðàÁÀÀ@kkkaaaAAA„¹¹¹££#B÷67îôéÓø,---q’÷îÝ[±b…––ÖÚµkñ„–=ÝBèþýû .ÔÔÔ400X·nÝØ±cé£ÐRRR–/_®¥¥¥§§çááAŸ0€^‚B®ñöí[„’’ÒÈ‘#9 ÛDFFΞ=›½1wîÜÉJ===„ÕtuuïܹSZZ¯££CoÏÊÊzùòå¤I“lmmi4š““S{{;BÈÁÁ¿m—žžnaa1yòä3gÎ „äåå%%%;ÏŽ(///%%%%%…:pàÀÑ£GUTTlmm‰D¢““½´;v,ßáÇ###ËÊÊ<˜ÀÇLJÚ²eËüùóBkÖ¬ÙºuëÖ­[ŒŒðY nܸÑÔÔ!äææ–››»dÉ’²²²ììl÷åêêJ¡PÖ¯_¯¬¬Œ ˜››Ï™3§®®.66VUU•¾" æå奥¥õåË—ôôtKKËß~ûAÀ .¼~ýç,!!A"‘lmmq)ÖÓ}9;;»»»[ZZääät~bèâââîî¾`Á###~~þÂÂÂììl;;;V~¾`HBîðêÕ+„}!OÞPUUÕ¹ç€uT*µ¹¹™‰•º›1cFVVÖäÉ“ÝÝÝYÖÅãÇBׯ_/--566¾qãž;àßÿuvvö÷÷ß·oßÕ«WI$’²²r^^^HHHFF½Ð±´´Œ§P(7nܽ{7nÌÍÍ=sæ Þ{ãÆ \è „Nœ8¡®®~ëÖ­´´´1cÆ=z¿“…7nœ   •J½qㆠ àœ9s¼¼¼è1:::»víúçŸ222TTT¬­­7mÚÄ8`xxxqq1B(44!$ 0sæL<¸»§ûŠŽŽ&‰çλq㆜œœ™™ý5®Å‹“H¤ .DDD‰DSSSú“;z ¸@MMMyy¹„„ÛôpÖ¢E‹®]»¦©©É®€D"w–°èÍ›7JJJ!Ü9Áv‰‰‰7¯]»ÖysêÔ©<`púŽ;Ž?Þ¥qÆŒ¹¹¹?<žŸŸßÙÙÙÙÙ¹û.úã=Áï[õ>`—[ëŒÁ}YZZZZZâÏׯ_‹‹£u277癕ÝG@¡ÀÏ­ttt¸t}ò¢R©%%%ªªªlŒ§¯¯ÏxÌJoœ8qbüøñ¨ß æDGGãBáâÅ‹kÖ¬ÑÐÐàtFlSZZÑÑÑÑØØ©««ÛeÄLƒytàøÅãÞ þà"D"±¼¼œ½ËyzzzVTT°GCCÃÙÙYDD¤¸¸¸¾¾žõ€lqòäɇ"„BCCqíË3²²².\¸pçÎCCÃ3gÎp:#À; G.€ ÎsÊñ€úúz<‚•-ZZZ&MšÄ–~ü²Õøñã322Þ¼ychhÈzLÖõÇ꧃DçGW°ôèÀðœÈ<Ö£sõêÕ?þøƒ…„„º vaŽ‹‹Kmm-Bh„ è_>€KA¡À`×ÜÜ\TT$((8nÜ8NçÂNmmmÚÚÚl PUUÅbœœœäädIIIô¿.4¼|€KÁ£+»ÜÜ\*•ª®®NŸ:–7ìÚµ‹ÑÚÛÛ}}}ñI¬=zôÙ³g‰D"B×axf—‚B€Áÿ¡e®óãÉ“'»wï^°`··wrr²———……€²f͚ѣG#„RRRðôz………áááŒwùøø}:}M___„››ýÃOwáõp#B(??ÿÏ?ÿxþ›ý µ> „xiU#L^^ž7ejjzëÖ-<ù sêêêˆDâìÙ³»´khh„ÂÂB …ÂÇÇ×›P‹-b: ÛÁ`d5Ü—€û˜päÈ‘ôôt„Prrrzzº——WII Þ›½wïÞôôô½{÷âcèzÚåããƒ÷íÛרØÈä]!túôiü;ë>|øðõëWVª„””Ôÿý×ýŸø"""òòò­­­ÅÅŬÄp ôè0¨á°ÇŽËÜé^^^ô÷ÉŒŒRSS;ï8qbO¡zÚåííMûši555d2¹ËûMLSQQ b%…Bñ÷÷ï>7n\YYهػÐ:``@ƒ.txl—ääd&¦Þ鉀€À”)SX‰ðàÁƒÿþû¯§½øË/,,dåNB€Á‹B¡|þü™OMMÓ¹°‰Dê>†9mmmjjj]Þ ï+yyùíÛ·÷´ùx°€ëÀ£+¯OŸ>utt(++ p:v²°°`W¨¬¬,_,g¼~nøñãÇÞ„jllŒ‹‹c%0`–.] /^ Pè0xá?®cÆŒát"lcbbÒeÆæLŸ>ʼn¯_¿®¬¬lhhØÓøûïå£«ŠŠŠíÛ·ÿòË/¬¤@ttô’%K Ð  Ð`ðâÉB‡J¥ÚÙÙåçç³¥Ð!“É#GŽd%¹sçŽ?Îà%%%òòòÖÖÖÞä,++ëïïÏJJ`ÄÄÄp:0@`ŒƒWQQâ¹B§±±ÑØØ˜-s"×ÔÔL˜0J¥2F£mß¾}Ö¬Y ŽáççWRR¢R©Ÿ?fúBNB€ÁëÓ§O!v½†=HHHH³%T^^ž¡¡!‘ÈÒﱕ+Wþô<åþq¸ : ^¼÷§(**–••±^è>>Æi0˜““sðàÁáÇÛÚÚ._¾¼¹¹BcW†ôztŒ*++©TªœœÓ…Ojjª——׎;FŽ©®®®¢¢âïïïêêºsç΀€€;vˆŠŠ ËÊÊijj"„–-[´mÛ6 …bhhˆÛ±Ù³goß¾]DDDXX˜L&ÿöÛo’’’ –——ûøø|ÿþB¡´µµmß¾½s’666Û¶m“’’”””\³f¬¬ìo¿ýÆú—3nܸM›61wnUUÕÑ£Gýüüúzâ¨Q£B•••]ê¹î~Z›b?¬ÕNž<)))i``€’‘‘144ŒŽŽŽˆˆØ°aBÈÉÉÉÌÌ,!!L&kkk¿ÿ¾ªªJ^^¾´´ôÆvvv¸GJ¥nݺ5))é§­­­EDDâãã'MšäïïÿÑËçÏŸïèè¸{÷®‘‘ž»²§4ÄõF#‘H:::‹-’`K†0…ƒÑׯ_Ñÿþ¸vçíííííݹ…> @`0VÆÖÖÖÖÖ–¾™@ÿ¼råÊ.oÉ à¹sçz¼„LMMñ¿Åé^¿~][[;wî\gõƤI“˜>7$$„¹ÕÎåääBJJJ—/_&‰„ÿ!‰xÿoiii/»‹𣫇º¸¸àÆOŸ>uttÐ_^Ãèó÷DEEyzzR(ú.|/yyy4ÍÚÚ7‰ÄÅ‹ãB‡q@:??¿žjˆ›7o Ì;÷èÑ£ŒÓ`PWWwóæÍ¡¡¡/^¼@ñóó»»»ëèè°ž!ŒA¡À`„ Öí*‰‰‰uuu,:iii˵>Ù´iS}}='⮵ÖÖV===‡ °²šº’’‘HŒŒŒÄãxºðõõÕÔÔĨÂÃÃ÷ïßÛqöâÅ‹qãÆá–ŒŒŒÞ¤#=íêþŽzOi0XXX¨¦¦–••õéÓ§’’’°°0???Ö3€1(tŒ***P:lll|úôill,ý­þ¦¯¯y°"..®°°¹s)Ф¤¤¤¤$çjjj‰Äšš …Ââ]àѵW®\™9s¦ŽŽÎýû÷B!!!®®®...îîî ,022âçç/,,ÌÎÎvpp°³³C ’É䈈ˆòòò””„Ð¥K—f̘ann>gΜ¤¦¦*((äææ¦¥¥!„._¾lll|ùòåž^¸páõë×8Ž„„‰D²µµ•’’BEGGã÷¶ìììèƒ4Œ÷ó󋉉ÑÐÐhmmÍÏÏ#‘HŒo™A@z #<¤ÿ þ+¼¿±²bÝ‚ ¾ÿÎܹnnn¦¦¦‹-êë‰_¾|‘””6lXuuuMM¬¬,s `111¡ëׯ?{öÌÃÃ#>>!tãÆ kkëÅ‹“H¤ .DDD‰D…ÎOýýý÷íÛwõêU‰¤¬¬œ——’‘‘ann~öìYÿû÷ïÇÅÅ jhhäåå]¿~ÝÁÁáÌ™3= Ç“åàC3gÎÄ]Výõ×çÏŸqbÆ [¿~=}Jhi08jÔ(YYÙgÏž=yòDLLLWW×ÃÃCXX˜ñ-3@/A¡À`„ ÿ 6îîî~~~,>ƒPUUeîD*•z÷îÝÎs!öÞÑ£GGŽ)++[]]]YYÉâÏW6tyyy7ÍÍÍ{šñyêÔ©=ÍŽ#,,¼wïÞžî®§€‰‰‰=%ÙyüVïÓ`pñâÅ=-ÂÊà– —àõr£ªª*Ä[…NEEŽ{÷X¬rRSSÿþûoæÎ%‰ïß¿ÇÃYúêÓ§OŽŽŽøuªÎïä?(tŒp¡ÃK3î 0×›ÒYll,ÓÏ­ž2 à§×Љ‰ÁÝ9XGG‰Dúa¡ãììüûï¿3½Fé—/_¤¥¥…„„úz¢¢¢bHHHOEIOÚÛÛ544¬¬¬ºï’¨®®®¯¯ïkÔ¨Q£F^:Â×訪ª ÚÄGlllgwü"°F±ƒstw@§  àÇmúûï¿‹‹‹EjÂb±¶lÙ"ê1Ê×®]+,,lµZ«#:qb¿Gååå;»#ÀÐÐððáÃl[skkë‰'ŠÔäáÇiii"MIÐh´?ÿü“F£µZŸÎŒ#Q€D€©+Ä Fkii‘••%“ÉÝ—   àææÖææ«V­µ‰¦¦æ–-[DmõÇYH„‡Ù Ð@‚Àˆâ+´!¯“x²³³ÛµkWÛÚþïÿËÉɵ•¶¶¶HËY,…BY²d ‘ÊøïÒÔÔ$j¯Ä ~‰Jt “••Å>sïõë×¢fÃvîÜ9&“)R“ˆˆˆèèh‘šDGGIÕŽQ(ô#Ht/ø%Š_¨jË–-jjjæææîîî ,ÐÒÒ*))uu0BÈÝÝÝÄÄD¤&ÿü󨋸/^¼8mÚ4‚•ñßFt °Fñ‚³´yDØØØXZZz{{çäääääÄÆÆîß¿¿²²ÒÔÔôĉÚÚÚDn’‘‘±dÉQ99v온{ÑȯûÆ—6d–tÑ@¼à‰t¬­­ôõõ]\\öìÙsûöí>Ìž={ðàÁ£„³³³¨gáÐh4===‘b£[·n‰4KˆGt Ð@‚@ €xinnFè}ÿþ½  €]réÒ¥ìììC‡¼CSSSCCƒ¥¥%ñ‡2™Ì#FTWWo’™™¹}ûv‘–ÁˆÄ ^Æ+--ÁÓÊ$ÉÚÚš}òl^^ÞúõëÏ;G|õ …B¹zõjÿþý‰?4??¿_¿~***Ä›Ðét???‘~Õ¸²ôæ"™:uªÎ>ì{¸@ €xÁ#:222Ý‘v±¶¶¾}û6B¨¡¡aîܹ;wîÔ××'Þ<))ÉØØX¤'ÄÇÇ‹ÔdôèÑóæÍ©IÇ:^^^8{ëÕ«W;äž.è ^ºÀˆBhâĉéééT*ÕÇÇÇÈÈÈÕÕU¤æîîî÷ïß'^¿®®®ªªJ¤#ÿúë/"9¸à£í7wîÜ™3gR©Tkk뤤¤ššö%ƒ<~üx===sss{{{öx!—RRRœõõõ-,,6lØPVVÆù¸Ë—/[[[ëéééèèŒ7îÏ?ÿ$r I'ÙÿÏ€®/‘ôc‘MLLV¯^ýäÉ“¤¤$‘Ú666Òét[[[âM®]»–ššúÏ?ÿ¬_ZZzñâÅ5kÖˆÔ1„””B¨¢¢ÂËË‹N§777777ãøÿR©T‘ÎM QPPð÷÷?~üõë×=<}šóì±ssóeË–………eff"„¤¥¥×¯_B ¹@âˆzPž:uêÔðáÃÛÐpíÚµ'Nœ žð<44tìØ±ZZZë777ïØ±CÔŽmß¾½W¯^!yyy¾u ©,+44TKK‹=IqõêU333UUU„Pvvö!C¸Z ¹¤©©)%%Í÷üÃÂÂBmmíçÏŸ—””|üø1<<üСCsçÎíÑ£‡KD~Ä:ˆ—.3¢STTD<µ[}}=™Lž1cÁú Ãßßïð"èÊ•+·nݵc4->>><<üÀmHgÁëØ±c%%%FFF¶¶¶·oßVQQ‰511Y°`¥¥å¶mÛîß¿?`ÀƒñîÝ»ÜÜܤ¤$A—|||Ö¯_ogg7aÂiiéÂÂÂÜÜÜ+V,_¾!t÷îÝC‡ÅÆÆêééÑh´·oß*))áó…\  €@ðS\»v­ Û°»uëVZZJ|@‹Á`øúúêèèDnnnÌ(JvvvEEê ñ6<]•‘‘Á`0lmmCBBð.°³gÏ.X°àÌ™3‡JLLLJJ’••ÕÑÑÙ¸q#btiæÌ™ åÔ©S‘‘‘RRRýû÷·¶¶f'rWWWWUU}úôéãÇ•””ÌÍÍ7lØ€Ç~„\  €@Ðñ˜L&™LnÃ&ù½{÷ÚÛÛÏå)''·jÕ*‚• FPPÐÆEíÕ­[·tttØGáQ·vâÚŒÎùUIIiçÎ;wîäm(ä’­­­ Ýj3gΜ9s¦¨—è$~x †rss'Ož,j+&“ôáÂõkkkEZSžžž.j¯¾}û¶qãFœƒ¬Ë¬ à¿Ft/xuN‡Œt¢OŸ> 4HÔVŸ?Ö××·±±!X?22R¤]]mئ¤¤tðàA<ÈÄK×tìíííììDm¥®®ž’’B¼þÒ¥KEzʈ#DíRyy¹ššš££#þÚe–Šðßÿs@¼t@§²²² ëW¯¾{÷.ÁÊT*UZZZCCƒ`ý3fp¥Dh‹ÅZºt)ûÔ…Žsà¿ÄK×tœœœ^¾|Ùj5¶eË–Û·o×ÕÕQ©Ô+W®àH‚ˆ½{÷;vŒ`å´´´ªªª~ýú¬UVV***rîu‡$L] ^ðhñ÷½b±X?~$²å›B¡$&&¾zõjÙ²eÔÕÕýúõkEE…ššZ«m¯_¿K°K£Fºr动ƒLjjjQQQœ%0¢€Ä— ^ð–ì6œ@#>H$ÒÇåääˆT¶´´tuumhh óôôLLL;v¬™™ÙêÕ«…ÿòòòLäeee CÔÅÑûöí{ýú5Wa×È-À :ˆ„NÓ(¡jkkét:ÁÊ#GŽLMM%“É#FŒX»ví7Š‹‹©TêðáÃ…ÄñññĽüüü.\¸@°2VTTtþüyÞ%üwÁ#€D€— ^ðÛ]¢ÐÐв²²½{÷©liiyôèQöWƒ1gÎ''§eË– jòåË—•+WæææÉpÎd2ËÊÊÜÜ܈t†mРA×®]Ù­8Ñ¡R©"¥¤¢Còx‰âçÇ–è@‡N§6Œ`e]]ÝšššÊÊʾ}û"„|}}I$Òž={„4©®®^¶l‘(!D&“¹Î nÕóçÏù¦ïÆ#UøoÄ—’’’••Õ½{÷Dz"øõà<¤ÿt/ø%J|êG ­[·Žxe))) ‹'Ož8999räÑ£GñññÂWûêéémÛ¶ÈÍ«««#""¼½½‰÷§®®náÂ…‘‘‘†††¼W[ túöí{ùòeâülè ^pÖhœp@BeddXXX¯oaa‘’’B¡P8 |¨æÍ›7¥¥¥S§N%rçÀÀ@QÿÕþõëWwww¾Q"èÄ :ˆItª««çÍ›W\\L¼IÏž=/]ºtáÂ…ÈÈHMMMá•/\¸Ð³gO‚Îo¿ý¦¨¨H¼'!--­Í›7 ºÚÔÔ„"¸¡ `×â¿Dñ UUWW9R¤&ÖÖÖæææ­Vž?>Á•ÅL&S[[›È‘<‹Åš={vaa¡:8ÅÁ(@"@ €xÁ/QÉ ttuuÃÂÂDj2`À€óçÏ;99©lbbÒ¿ÿV«544666ïÆƒjkk…·#:Ht/²²²d2¹¹¹YBGÎÏϧR©ÄëS©ÔI“&988´Z“Á`É,JKK³´´”——'Þ“I“&EDDOïÐÐЀé¶€ÎbGAAýx§JœíÛ·?zôˆxý‡òWÃ×µk×***ž†}„WÃ#:è A Ð@ìà÷¨„:ýû÷:t(ñú“'OÞ½{7ÁšGÅQ p™™™T*•øJš×¯_ûùù}ÿþ½Õš¸Ž¨ œÄ~yÀÀ@‘²JÉËËëëë©)''·`Á‚V«µ´´øøødeeïC·nÝ>¬¢¢ÒjMt8°½±#¹NMMÍׯ_µµµ Ö/))Y¹re\\\«5ýýýÃÂÂx³lò¢R©#FŒ˜0aÁ>477kjj¶º­Ã!£JT*511‘à£Ag4h©©ig÷ü"è v$7Ðyüøqdd$ñ£>|Hpø'&&†`ìÒ½{÷“'Oì@}}ý¨Q£ž>}J0¡þ£©\YY¹zõêI“&ìøõÞ¿ohhHü? é Ð@ìà÷¨H{—Ä…B;v,ñúîîîöööDj¦¥¥9ãøÉ“'ïß¿'2ÃÅ®?yòd‚QB¨¾¾ tBªªªÁÁÁo~=‚Cƒ Ë€@±Ó­[7ôã*Y¦M›F¼2“É”’’ju£B(55U__ŸÈæ¬ÀÀ@‚çñ`Ó¦M#xÈ2†£Oâ ÓÁbdÄŽä:wîÜ!~ÔaVV–M«ÕX,Öܹs¯\¹Bäž»wï&>œãççרØ(<(üGÁ €D€@±#¡‹ÅZ±bñ¼ëcÆŒiµÚÇedd–/_Þjͯ_¿:Tø‰l‘‘‘OŸ>5=g]]B¨{÷î"µt"˜º@ìôèÑ!T[[ÛÙMCCÃĉ‰®®®,«Õj xÿþ}«ÕŠŠŠ¬­­ß¾}Kp„fÊ”)" ç t@0¢€ØQVVF}ûö­³;"EEEâû­Z]_Ì`0æÌ™C$eÕË—/=== .UUU½zõ6l¡¾þÀb±ðÿÄŽ„:ÙÙÙÂSsJJJrwwç{éÏ?ÿ¼pá;9zôèÓ§O‰¤\˜1cÆüAäÑyyy#GŽlnn&ØU¶ïß¿3 EEEQÛ: :ˆ:??ÿÏ?ÿlC°‚'ñ_ )`b§gÏžH×è¬<þ|A—p¶¬5kÖDFF^ºt)//¯¶¶vþüù#FŒà[ÿÛ·o~~~>$øèY³f¬É‡žø¯#VÆW^^ž””¤¥¥ÕÙ}@ìÀˆb¿Jkjj:»#¢Y´hÁcõ?þ,d’ ,(Z IDATKCCãÇÊÊÊ)))/^¼0`À¼yóôõõùnéjiiÙ²e‹††F«Ïmhh˜7o‘Ð|u` 3uêTˆ‡h¡œœsss<¯Ç6zôèöw €® Ä>O²¦®âãã V¾uëVPP «ýû÷ÿøñ#ûk¿~ý(##λüôéÓõõõË–-#òÜ€€UUU"',óÕŽ———‡‡>xðêÕ«ÄVVVÖÖÖr:q! Ð@ìôèÑCJJª¶¶–Édvv_ˆÊÏÏß¿?Áʽ{÷2Äèœ:uÊÏÏ/&&føðá\5kkkÿúë¯;wî|îæÍ›wíÚE°2¯êêjô# m§¹sçΜ9“J¥Z[['%%±Gï"""ôôôtttðŽz___<êSZZвµµ]¹r%Bhâĉ:::C† 9zô(ûž‡5j”Á‚ òóóÙå)))ÎÎÎúúú6l(++Ãå“&MÒÑÑñôô411:tè¼yóòòòÚÿ£ n Ð@ìÉä=z´´´HÐ Ž‚‚‚‹‹ ÁÊ3gÎ’x¡ÿþø½Ž ¸}û¶®®.oMYYY …biiIä¡ÏŸ?—““SQQ!ØI^8ÐéÝ»w›ïÀ)$$DAAÁßß_JJêúõë¸ÐÜÜœó´h'''άøëÂ… ½¼¼¼¼¼8ÆÇÇ1bþüùÅÅÅžžž8JNHHX¶lYss³››Û”)S’““.\ˆS“â¶)))'Ntuuýô铇‡‡ÅÖ‹‘G***555ÕÕÕõZýÙôôôôôôˆÔÌÏϯ­­µ²²TÇW[[pãÆØØX555Þj,KAA!##ƒHìuøðáÔÔÔ6Ï[!„ÊËËBÉÉɬZZZ8?Ðh´†††VoUWWwóæM›Þ½{;622ÒÃÃ!¤­­=cÆŒ¸¸8\mòäÉL&3!!uvvVVVNHHðôôä]“4}út„¡¡á¦M›*++ûõ뤬¬Œ3­ª¨¨Œ7îÎ;‘‘‘K–,3fLHHÈùóçG…266^¿~}yy9‘ÕNHtG½{÷.((øòå Áè¡Ó…‡‡O˜0A]]½ÕšQQQ CH ƒRWWŸ?~eeåíÛ·Å1×®]ËÊÊ"8_&##säÈ‘öD9 ááá¡?rάñ"’¦4**ª±±1&&&&&—dee™™™µ¹{!###üAAA!„ *))a0§OŸæ¬ÉÙMMMüB¡ „`Dt=è Žð@Η/_:»#D tFÕê0Õ€êêêbbb„$[8vìX]]Á@gÆŒDª 1bĈ¡C‡>þ< ÀÌÌŒôƒ””ç‡ÒÒÒ 6¿‹Å ÕÒÒ²µµÅ%W¯^å tØ[Ãh4ß;춦¦¦””Ttt4‘Cè’ Ð@©ªª"„>þÜÙ!ÊÝÝ][[›HÍV·577ëëëoݺ1âëëKäåýöíÛß~ûíñãÇDúÆNûö­¡¡!ÎD1fÌA•eddZÍ*zìØ±’’ ###[[[>ÞË˫Ϳ+Ä,F@I\ ³råJáq –’’Â^q"È7òóó…ß-99ÙÙÙ/InïÞ½‚rMÁb±¼¼¼.\¸€~ü9ðŸ¦=ðtUFFÆ?ÿüƒ ),,lll<{ö,BÈÐÐpÇŽ¹¹¹.\xñâ^…••…Ûoܸ±  àÒ¥K³gÏöòòJKKC…††Þ½{799ÿ†£££B3gÎ<~üx="###""ÊËË­­­­­­Bééé¡Ë—/ß½{÷Ó§O‰‰‰¡ÈÈÈvþtˆÑ@á¸WVVvvGÉÉÉ©ªªš2eJ«5£¢¢„ ‡`***ÂŠŠŠÜÜÜž>}:`À€VŸxôèÑnݺµZM&“©®®¾k×.:þõëW™öo/OJJâüŠ—þpZ´hÑ¢E‹5Çû­„ÜpÅŠœ_mmmÙsdBZåææ í5’ Ä‘d:>¬¨¨ è,[¶¬Õ:­Þ'##CZZÿŠ„ Ñh>äÜ­-ªÂÂBmmí½{÷"„ÊÊÊX,VïÞ½[™ˆtG’èXXX\kll,¼Bhh¨‘‘‘ðjŽŽŽêêê­Î”íÙ³§ºººÍNYY™½½}\\ÜàÁƒB!¾Ýâ þi€8Â/T|p‹ø9r$>‹E¸+W®à…#‚°X¬Ã‡·´´©sùòåÂÂÂñãÇ·ú¸AƒíÛ·¯Õj‚”——ÿþûï8ÊA?þè q Ð@©ªªJKKùòŸ†"æ~ÿýw"ý¼uë–ð ---+V¬011T¡¹¹ÙÏÏ/99¹Õg1Œ¥K— Ù.\SS“¹¹9{)Ì­[·vî܉ª¯¯oÛ Ä™LîÓ§OKK‹øÏ^UUUÅÄÄÈÈÈ´ZóÈ‘#B2? „Èd²§§§ L&SJJjáÂ…ÂsBµÍåË—ñ9Ål/^¼ÀéÖÛsä  S@ €˜êׯBèÓ§OÝ‘VHKKoÛ¶HMUUUœ¯›¯ïß¿rÌ‹³2±ÉÊʵzôðÙ³g¹"âX,Ö™3gðø ;ÜlÏÒf@§€@1Õ¿„;×´ØêÙ³çÒ¥K[­¶gÏž«W¯ ©gllL&“9 ·nݺ`Á‚G!„ð*iéÖ·PDGG O1!‰Dzô葎Žg!û@#vš€¤€@1%)Nhh(û8;!’““…g‹tvv ä*”——§P(+V¬˜0aºu넯SF¤¥¥ †x1Œ9sæäååñ^bè@ÂK$:ˆ)œmQxþHqSUUÕjµÄÄDKKKAW¿}ûÖÒÒ»§IAAÁ¢´´ôÀZZZŸ>} ¬©©tŸ7æääï<'|R0>‰˜ tH$Ž>ÎÑ@LáÁƒÒÒÒÎîH+|||ôõõ…ש««¾êäÉ“ þþþ\åJJJß¿'‘HøxßW¯^>|ØÔÔtîܹ¼g÷ÙÛÛ·yuΘ1c,,,¸æÎB---8’ëÝ»·œœ\«÷¡R©8ÛO999mó þ؈)èˆÿˆ‘#m¶lÙ2räH777Aêêêøî¥RTTäü 6ÌÌÌ,66vÖ¬Y\QNcc#…B¾iK“'O>|XVV–÷juu5^"MdÞJIIÉÊÊêÞ½{mèøeÆŒÓÙ]¿:ˆ)œÈéÇÝa ãââ|||„WËÍÍ]·n ‚NöSTTdo¼jnnöññyüøqBB‚––gµüüüiÓ¦-\¸§k•““Ó–-[]e¯D&’Z«oß¾—/_nC? :ˆ)%%¥oß¾ÕÖÖöèÑ£³»Ã_nnî¿ÿþÛjµû÷ï Immm­¨¨È{IQQ‘J¥"„¾|ù2gÎEEÅ„„Þ=êÇŽ“——K ‘””$d˺H@ÜÀbdÄ~³¾ÿ¾³;"¹¹ùªU«„×)..’ «¾¾~íÚµMMM|¯*((ÔÕÕ½|ùÒÒÒÒÌÌ,$$„ïI<ÇŽËÍÍmõ|^ÿüóχ„7do¹8p ¨÷t:t_øÍ*ÎŽ††F«'ÖüñÇwîÜt•J¥zyy©¨¨ð½ª¨¨˜=jÔ¨­[·nß¾wXˆÉd®ZµêÁƒmX^úüùóC‡q®ËinnNIIÉÏÏÿúõ+»=¢’¦®_øÍZ\\ÜÙhÕªUÛ¶mSWWR§¨¨h„ ‚®ª««ûùù º*--ýíÛ·›7oZXXð­ð÷ßGEE Yæ,„±±ñµk×8÷´ËÈÈlÛ¶-77!D¡PTUUUUU«««ñÕÌÌÌÆÆÆ¾}ûöíÛWUUµÕôéq#:ˆ/ü¾~ýzgw„?‹Ý­[7áÕ233•••ù^*** ÒV[[ûíÛ·‚¢„¥¥å?ÿüC$w:§æææãÇ“ÉäaÆq]Z´hþ@£Ñ>~ü˜••URR‚KöíÛçææfmmmll¬¦¦æèè(ÒCFt_xÃQNNέ[·ÄðµÚÒÒrâÄ !é«BOž<100´˜úÊ•+‚Vç „ ª««GŽ)¨Â‡LLLøî nÍš5‚Ò­;;;oß¾N§¿yóFZZº‚CyyyEEEnnnII‰´´ôž={D}.à׃@ñÅ^ãíí=dÈ¡C‡vn¸ÉäY³f ¯³eË–ýû÷ VÜÝÝ…¬S ÔÕÕÔ6//oÒ¤I»wïnà ÖÖÖ|/õìÙÓÁÁ!***,,lûöíƒ â¼Êd2GURRâééill,ês¿L] ¾²³³BfffT*ÕÍÍíÛ·oÝ£ÿÏÕ«WÃÃÃ…ThiiéÕ«—‰'MMM!{¶§L™²råJAWOŸ>=dÈ"ùD9½|ù’F£988³WçÏŸçM­uòäÉŒŒ !çîÄ Œè ¦ªªªòóó“’’&MšôüùóåË—‡‡‡ 9æKOO>È$%%%d‘——×¢E‹ÆŽ+¨‚³³³›3™LÞŒ B|þüÙÅÅåìÙ³Â×ôŒ7NKK«¤¤$99yêÔ©ìò²²²mÛ¶!„øžúƒ¢R©‰‰‰Ä»:ËèÑ£ys«. ÄÔ£GX,Ö¸q㔕•oܸann~÷îݽ{÷âw­8X·nðMÝááá“&MêÛ·/ï%¿ÿ~¾ «««ÇŸ››Ë7ªc03fÌØ´iÓĉEíóúõë[]¹,%%åêêºwïÞþù‡3ÐY½zu]]ÝôéÓíììµ­¬¬\½zõ¤I“Díø•þý÷ß#GŽØÚÚvvGÀ¯bêáǡɓ'#„´´´"""¦M›8|øp1Y˜,<÷‹Åú믿²C¡P^¼x!h‘rDD„ ±«#GŽdff¶šI”˧OŸúõë÷Ûo¿©¼páÂDGG×ÔÔôêÕ !tëÖ­ëׯ+))8p@x[UUÕàà`‘ú~±¶åDJ\ÆÀ\=z„b Lž<9 €Åby{{¿yó¦S»†BuuuK–,RN§OŸ>k1/[YY™¼ÞÞÞ;wîtÕÎÎ.66–ï@‘ ×®]³¶¶²ð™Kÿþý'MšÔÔÔ‚úþý»¯¯/BhÛ¶mýúõ#þ\@§ƒ@qôñãÇâââž={ššš² ×­[çêê*& “ „'¥P(‚ÚNž<™w©/–••Åd2ÙGï$%%UTT°¯>~üXSSÓÜÜ\¤Þ¾zõ*&&†D"o‚—$Ÿ;w!´cÇŽ÷ïß›šš¶a‡ sA €8JIIAM˜0k±íÿþ÷?SSÓÂÂÂåË— ~aÆ=zTH…Ý»wúô‰ï¥ââbwww¾3St:}ñâÅyyyì’ÔÔÔáÇoÛ¶íÛ·oÏž=›5kÖ‹/ˆ÷³¡¡!´cÇâ­B¶¶¶½{÷~ñâÅÙ³g9B&“ƒ‚‚DZû è Žð¼^ ÃI^^þƽ{÷Æ “;£kÿGNNÎÐÐPÐUvæÌAg ÚØØÚž]UUeccÃy纺ºÍ›7Óét++«]»vM›6MÈF-.---K—.ˆˆ XŸ“¬¬ì¼yóB^^^ ÃÓÓsøðám¸ sA €8Â#:œNqqqxxøºuë.\X__ ¼uëVgõpÕªUOŸ>tµ¥¥eÏž=Ý»wç½”““STT$¨aÿþýƒ‚‚8K¨Tê!CΜ9“ %%õþý{¼L›ˆ’’ƒ1g΂õ¹àÙ«––88 »®;ïÞ½+//ïÞ½{iié7ÒÓÓÓÒÒØ©%B$iÈ!æææ8{•™™éãã#誼¼<;i—   ñãÇ<˜÷Rbb¢´´4×8V}}=˜†~ÿþý7nüþûïC‡õ÷÷ç{NƒŽŠŠjý‡`èС²²²t:}Ë–-Â3]Ä:ˆ<œSWWÇu·žžž³³³¹¹¹©©© 4™¿L\\ßlÑ¢E‡â»1J__ßÅÅ…o«ýû÷oذ«°®®ŽóAÓ§OOHHýúµ@§¨¨ÈÅÅ%==½=ç+ÖÖÖÒét2™,êùËñbOÍÈÉÉ›™™õéÓ篿þBéééñÆŸ.ÃWUUÕãÇUTTø^Ý´i“ †^^^¼gñÕ×׳£ºgÏž-Y²DSS3==]øöò€€ooïvž"ýúõk„¾¾¾HÛµ:ŸqãÊËË“’’´´´:»/ˆX£€Ø™:uêýû÷KKKöîÝëíí7ûdeeuv×þOBB‚5+ÊÊÊ—/_æ{hòªU«8çà8555¹¸¸ð†xD‡N§oÛ¶ÍÎÎÎ××744´ÕCtŽ9Òþa˜W¯^!„8wøw ©S§êü@|ÕB(''ÇÜܼ®®Ž³pôèÑÝAºt;‹-211aïd¦P(xktYYYeee§víÿ¼yóFÈFkYYY¾£Þ¼yóàÁ¾ç>þ|Ĉ|ïöíÛ·wïÞ1";;ûÑ£GsçÎÞ·3gÎ<|øB¡¯FDnn.BHÈæ²öðòòòððÀK®^½J¼aeeemm-W I'$û]+&ƒ:«V­Z»v-ßK,ËÄÄäû÷ï¼— pêÔ)¾RFF† R©Ô ¬]»6$$DUUUxǾ~ýzèСV)ôòåK„‘‘Q‡ÜËܹsgΜI¥R­­­“’’jjjpyDD„žžžŽŽÎû÷ïB¾¾¾xÔ§´´!dkk‹3ºOœ8QGGgÈ!œ§:thÔ¨Q ,ÈÏÏg—ÇÇÇëüÿ`Õøï€@ À>ì.33³s{‚IKK Z‚óæÍiiiÞäÞ,KAAaܸq|[yzzò=t¸²²ÒÆÆæéÓ§Â3™cùùù ©©©ššš­Vn“É|ýú5‰DúyÇç„„„(((øûûs¦y777·±±a×qrrš6mû«‡‡þºpáB/////¯ &°¯ÆÇÇ1bþüùÅÅÅžžžL&—ã AÜG#GŽüI?â# ,--B ELFt´µµsrrx£„¾¾þµk×xËoÞ¼yâÄ ÞK‘‘‘ \å666 ­ä „ªªª¬­­Ïž=Ë%´Ç›7oh4š††FTT:Î[H¥R‰Ü¿®®îæÍ›666½{÷;vldd$õ´µµg̘‡«Mž<™Éd&$$à¯ÎÎÎÊÊÊ žžž¼IUƒ‚‚¦OŸŽ244Ü´iSee%ÎÌellDªEEE566ÆÄÄÄÄÄà’¬¬,333Qûɉ=ˆ™ÍÍÍø«ººú>|¸iÓ&kkk! Sèz Ð@ôèÑCKKëýû÷œó¥OŸ>ÙÙÙ|/555 2äÝ»w¼kOž¼ýé6¿ÿ>iÒ¤°°0ΚššÂÂByyùaƵóþ€NÃÂÂýlè,666çÏŸç-ùòePPo¹©©)ßCüV®\É52ÔÔÔdccû‰Åb­X±‚J¥²¿Îž=[AAAVV¶?WW×Çsfdd°X,SSÓVWCÄ:H ]]]eeå²²2œß±STTTð=”N§óî å;oµy󿆆®ÂsçÎihhð†/EEE7oÞœ>þĉ‚—/^àÝOÇõêF›5kVeee:Ïd2ÿøã 6 i/y={öŒF£ü¤£¿œŒ €$111‘——ÏÏÏÿòåKïÞ½ñÓkkkåååy§TUU—/_ÎYB§ÓŸ?.//ÏYîáá±téR®S’ûôéÈwqqKKË‹/Ø÷õìÙóÖ­[ .œ0aÂ¥K—,--EêSSSmmíÑ£G…ÔIMME?ʶ¡R©8Õ[m ”„‚@I"++kiiùðáô´4GGÇ_üô°°°’’’p•q–deeéêêrE9T*õÑ£G\qFKK‹ˆ ûôéÃÎm^PPpàÀÄÄDWWW---â=§R©éééS¦L9}ú´ðš?F7ŽøÍ9)))YYYÝ»w¯mÍÁ¯1hÐ œ9ü@ €„;vìÇ=zôë&“ihhÈUXQQ‘˜˜¸xñbÎÂQ£FñNf)))½xñ‚3ú)))qppÈÍÍ”ñ;;;‡Ax“Ôýû÷=<<23çÊ[ž IDAT3Ù¡ß¾}³²²Z¿~ý”)S„פÓéOŸ>%‘HmÑéÛ·ïåË—ÛÖð3@ €„Áƒ |“ÿl|Ï2NNN~ðàg ƒg¸¸öUUUUIII©¨¨pž={ÖÓÓSP”ƒzþü¹¬¬¬ƒƒCvv¶··w`` ï ¡V)++Ÿ:uJP"RN™™™xίŸü$è aÌÍÍóóó?þÜþ"ÉÈÈ077çZ_>>¼Ç oß¾sü)00°¸¸Xø===ãââøfJŽÅb•••)((üûï¿ÄóUÕ××geeÉÈÈðžý\è yp sÿþ}‹õ˪­­ÎUxïÞ=®ºUUUœ%øâ––ÎB''§={özÖû÷ï/\¸ %%¥¬¬,j?,XpðàA„ï¹ÌB<~ü¸¹¹ÙÌ̬[·n¢> ¶ Ð@òèëë«©©•——¿yóæ—=ôÍ›7uuu\…‹/öòòb¥Ñh[·n¥Ñhœu._¾,''ǹ⸾¾^WW·ÿþ|Ä`0è×*2™¬££Ã7›„pIII¡I“&µí¹ñ‹‘» ÌÌÌ#GŽtv/@+úõëÇ{ A$iòäÉW®\IJJÒ××ïØŽ âïï?þ|®=í½zõâÌÛÐÔÔ´råJ Î:®®®œÉ>œ èAÒÒÒ!!!ÆÆÆ¢öðÓ§OéééNNN»wïµ-B(99!4uêÔ6´ˆ-tº ÒÒÒÒÒÒ%K–tvG€@Ÿ>}ºyóf{î0uêÔ+W®Ü½{—ï–ïŸACCÃÀÀ€³äÞ½{Ož<Ù¾};»DYYyýúõœu¨Tª’’ÒàÁƒÙ%·oßöóóô”ÈÈHGGÇ6D9ß¿=zôáÇEmˆ÷ìÙÓÄĤmwˆ'tº¦~ýúMŸ>½³{zóæM;I“&‘Éä§OŸÒh´v¦ò&ˆwü)99™s}qUUÕîÝ»9GY,Ö´iÓNŸ>ÍyÌ  <رcÇøñãys› Çb±ïß¿?hÐ ‘²%&&"„¦N*äP"¨T*¾NNN\‹ëA—©GOŸ>MLLüG$ýúµººZGG‡³p÷îÝõõõì¯W®\ázm”””ÈË˳£œŠŠŠË—/oܸQÐSŒCBBúöí+Rß‚ƒƒËÊÊ<Øæ(ýtlllÚ|¬²²rõêÕ°ÐGüݹsgÖ¬Yèü@ €¤²µµ}úôiBBÂ/tRSS¯\¹råÊv IâܵlÙ²ššÎVƒ âÌú´aÃAi­š››_½zebb¹â§U,ëË—/‰‰‰çÎ#ÞŠW}}ý“'OÈdr‡,ÐQUUåÝrÄMlllgwü"°ë I5mÚ4„Pbb"×ÎíŸANNŽë¼àÈÈÈÕ«W³¿2 %%¥°KrrrÞ½{ÇÙdÆ œM8ùúúž={V¤.ÕÔÔØÛÛ—””ÄÆÆª©©‰Ô–Ëýû÷étº••U=Ús€‚@I5tèÐAƒUUUeffþìgM:uÅŠœ%Ïž=9r$ûëÆ¹VíÙ³'55f2™eee&&&|¶iiiéÕ«—Hëˆkjj&NœØØØ8bÄ~ îܹƒ²³³kÿ­â$˜­­-úñžþ©nß¾ÝØØÈY8oÞ<ü¹¥¥%&&ÆÂ‚³ÂàÁƒ.\È®¼sçN¾w.**’’’Ú»w/ß%Õ|«òóóååå—-[öàÁ‘Ž䫹¹/Ð@€. $Þ[÷ U«V555±¿VWW3 vr))©7oÞ¨««s6Ù·o;Ujjª¿¿?ïm+++§OŸžŸŸ/è¹qqq'Ožä, ™|àœÕBEGGó]FS^^îíí­§§'èÑçÎÛ³g{R¬®®nûöíÛ·o755móÃߎc «‚@HªØØX===÷ïßwvw:™L¶··G?ÞÖ?‰¼¼üåË—9K {'vYYÙÒ¥K9Ó>œ:uÊÁÁ¾wïW[¶¦¦&!åææÞ¿Æ ééé[·nýòåKVVgÒ‰vb±X·oßFý‚k€Nw©©© ,6l˜‘‘ÑܹsgΜ‰W­{yyY[[wv;Ù¬Y³BÑÑÑ?ï/^¼(((à,ùã?pbQ„PyyùÒ¥K9WØøûûãy%‹µnÝ:¾9­®^½êêê*ü¹/^\²d‰¥¥eHHÈܹs#""ºuëÆ9°Ô~iiiŸ?8p`ÎbH8Gˆµ›7o®_¿^MMmöìÙÍÍÍ>¬ªªÒÔÔDihhüþûïñññwïÞíìnv¦ñãÇ÷êÕ+???//ï'å½ ÓÒÒ2dþZXX¨¤¤Ä>ÖÏÜÜÜÜÜœ]9;;ÛÄĤ{÷î!‰”˜˜Èµv;~üøéÓ§…<”F£………¥¥¥!„lll‚‚‚ø®òi§7n Áâ¯Ïw@ëÁƒ\ùÂm#:@|566îܹÓÌÌ,11ÑßßÿþýIII½zõj5ãAJJг³³¾¾¾……ņ ÊÊÊØ—ÒÒÒ–,Ybnn®§§çèèøôéS\>iÒ$OOO“¡C‡Î›7///_ŠˆˆÀsdx‚Ì××Ï—•––:88àÏ‹/6l˜¹¹ypp0‹Åú9¿þ¤¤¤ð´Ëõë×Ò#ŒŒŒ,--Ù_OŸ>?¿|ù2++‹}©¾¾ÞÙÙùÓ§O¡²²²êêjÞ(ÿ~RRR„‡e111¦¦¦ìÂË–-[¼xñÂ… ¹6µ“ÉŒ‰‰A999uÔ=Û`îܹø BH) @‡ƒ@ˆ¯gÏžÕÕÕ­Y³F^^—(((\¸paÆ BZ%$$,[¶¬¹¹ÙÍÍmÊ”)ÉÉÉ .üþý;¾úüùógÏž >|ñâÅ,ËÛÛ»¹¹!4a„PJJÊĉ]]]?}úäááÁd2Bæææœ™œœœðI}¡+Và Þééé&&&­Tü ³gÏF]»ví'ÝßÕÕ•óDãAƒ±g OŸ>ýäÉö¥>Ìž=»_¿~¡Í›7_¸pëV--- ,ÈÉÉiõ¡çÏŸ÷ööæ,qqq)))Y¾|9þ»´ß£Gªªªttt:wÞjÅŠsæÌA­\¹ ‘HS§NÕÑÑ122“†ø«¡¡á«W¯„‡×B¢|þ› Ðâ çQÂoM6¾S!lAAAÊÊÊcÇŽ•••UQQ7n\YYYdd$¾êíí}ýúuKKK …b``PWWWUU…3f BèüùóÁÁÁþùçÆ+++ËËËBÚÚÚ3fÌ`ßòäÉì™GGÇ™3g"„Ö­[pöìY[[Û3gÎ|—””|øð¡´´ôÓ§OŸ?®ªªª®®þúõë·oßêëë¿ÿÞØØH£Ñèt:“É4V4fÌ55µ’’’gÏžy®H¹¶¯¯\¹’=3{ölö¥aÆ „X,V=xÏAÎÊÊjhhàÊ‚Îëõë×xÀ¬¤¤äܹs .TSSstttpp˜3gŽMÛ‡†8¶èýúõSVVæÌzѯ_¿=zôèѯVVVø¿ÿ±cÇ"„F­¡¡!$¼åðßkt€øÂ)¬ëêêDjURRÂ`0¸†U>~üˆ?ÄÄÄlÚ´‰3á<’¯þAáÙ1â#ìŽiÓ¦ÅÇÇWWWs¦õ¤m{¤Éd²”””””‰D’úozºzõj‡œÌéíÛ·û÷ïgï¢zòä‰ŠŠ {C8göÊ›7oâU½,‹D";vŒ÷nQQQìxÙ±c‡ŒŒŒžžÞ÷ïßÇ?~üøÍ›7sæ—h¿¦¦&¼Umîܹx[‘sNü!„† †Ï¹öööŽ‹‹ûôéά©©‘——ß¿¿²²²£££œœ\||üºuëðqÕ>>>gΜY¾|9;ÊGá(ÿÎ;‘‘‘K–,é„ñ_¦¦¦òòò'OžÜ/00°ÿþóçÏç¼OIIÉúõ룢¢ZíÞçÏŸÿý÷ßåË—;;;ëééý¤üÒqqqõõõ Œ˜L&ûsKKK>744444tHW­Zåããkllœ°xñb®Œ§¼áµð(€ÿ&t€øRVVÞ±c‡ŸŸŸµµõرcåää²²²rrrð\IXXXiiiQQBèìÙ³ÊÊÊööö>>>ëׯ·³³›0a‚´´taaannîŠ+–/_Ž’••­¯¯ŒŒüôéSJJ n;räHüùܹs®®®êêêx'W||<>²O–íÛ·oÀ€oß¾ÅK˜srrØ[cüýý_¾|YWW—àîîÎyzžÏŸ?oïG<¼Q‘MAAArr2{ Q‡ÀËAØ_ð(·’““=ŠËY,Öš5k¬¬¬š››O:•œœÌuŸÙ³g·z–1‹Åª««SUU-(( ø;l³°°0„PiiéÖ­[;öÎ}úôéûL›6M[[ûرcfffd2ÿ̉7¼åðßkÎÎÎêêêgΜ¹yó&N×ÐÐðòòZµjBèÿû߇p5üÒ²°°°··Ÿ9s&…B9uêTdd¤””Tÿþý­­­Ùÿö Þºuë… (Ê€òóóCBB222p~ƒË—/«ªªN:'?ŠŒŒÄŽ¡¡áŽ;þþûïäädEEE]]ݼ¼¼¬¬,|XBÈÑÑñîÝ»L&séÒ¥üñÇOýÉd¾ žÜÜÜvìØÚ±Nxxø¸qãØgá°ó[ihh\¹rÏñ±X,iiéÅ‹#„ddd^¾|É»3îÎ;ÂWÕ××»»»›™™mݺõgG9?~¼{÷®””ÔâÅ‹¤ “ÉìÏRRRmø\^^¾qãFâ=ùöí[HH>ØúÌ™3úúú ,À—H$’··÷úõë ]]]y'CyÃkáQ>ÿMèq7f̼R˜ ­­-^­ÉkĈqqq­>477—«dÑ¢E‹-TÍš5lõ¶?•‹‹‹¿¿\\Üׯ_;ðT½ãÇà@'22RGGÇÔÔ¯ÂagñLNN>þ|HHHZZZß¾}Ìy‡K—.;–«N2dˆŸŸ_Gõœï#ñ‚t„ƒƒCPPPÇ>B^^^JJ„MyyyÇÇË«¯\¹2pà@v ƒš>}úÁƒ¿|ùÂ÷0hÞðZx”À캠íîܹƒbùßÿþ'$3å¯Ñ·oß)S¦0Œððð¼­»»;û¨ÀsçÎÕÖÖ"„žzôèþýûøs@@À¿ÿþ‹zýú5FóQùùù›7of0>>>W®\ál»qãÆÌÌLA‡²X¬}ûö9r„D"ýŒ(gçκººÚÚÚçÏŸgOß|ùòåÖ­[$Iæ­„HJJbÏgedd°£„н{÷pùÛ·o¹öðxA @—âîîN"‘nÞ¼‰O|n' œH !_·›6mbeÑéômÛ¶1™Ì¢¢"®#†íììþ÷¿ÿ :§¨¨èáÇœ'ôtˆ††œô`РAÙÙÙ¼»¬CCCi4Ú´iÓ k&ÿèÐ¥hhhØÙÙÑh4¼Þ¶,,,F?oß¾ÝÀÀg¢`ï`722Z´h‘¢¢âãÇÙ[Êóòòh4š ßô«t:ýóçÏÚÚÚqqquä §­­·j»»»ón=c2™çÎCyxxtàsâ º¼PæÜ¹s £·Ú°aûhœÕ‹L&ß¹sïñÙ¿vvö… 8—ÄVWW»¸¸°ÓÂs©¨¨?~|TTB¨£Ž<~ÿþ½‹‹‹½½½™™YII‰ÝÔñññ>|ÐÖÖæÌ\èÚ Ð «™0a‚žž^YYÙ­[·ÚsŸ¯_¿^»v Êxxx¤§§³X¬Í›7ãe7555gΜ!“Éþþþ8+Æb±|}}q6x^ŠŠŠÎÎÎ+W®lOÇØ¾|ùÒÐÐ0uêÔÊÊÊS§N©ªªòCb;uêBhùòåâ¼ бàít5$ çz{ö,11±[·n6lhO¯°×¯_3ÆÐत$//ïÁƒ­¦üÌÉÉyüøq÷îÝ]]]Û߀¤€íå]Svv¶´— ÓÕ××ÿÔû»¸¸ìÞ½;+++==ÝÊʪm7QVVÆY¯ÉdrzzzŸ>} ðçŸ"„šššdeeûöíK"‘؃7·nÝÚ¸qãëׯyÇKðþ ‚ÒíòòòÂÂÂÌÌÌñãÇß¼ySEE…à=?ŽrssãÜÁèò Ðé‚ÌÍÍÿúë¯Îîh…²²òÏ»¹¼¼üo¿ývðàÁ£G†††¶í&¡¡¡C† ±´´¤Óé}ûöE 4hРA¡sçνzõêßÿ=yò$;Ä«W¯¢££y£&“©««›œœLp£Ó­[·<==Ÿ?®¦¦ÆYþþýûß~û-''çäÉ“¢Æñ¥¥¥7nÜ‘‘é¨Y3€¤€@§ ÒÐЀ­³`ùòåÇŽ‹‹‹+((`çpÉíÛ·ÝÜÜBŽŽŽû÷ïûö-™LvvvF=}úÔÍÍ±Q^^~óæÍ\w Óé¾¾¾FFF>>>ÿ›|÷îݺuë¦M›vüøñÝ»wãÂÓ§Ogff>|ØÑÑ1..® )??Î`0æÍ›÷ þ§A¥Roß¾ý³ŸÚIÐ O ë@€®©OŸ>nnngÏž=|ø0^„+*]]]öæÍ???ö8Ê¥K—BøÄd‹ååå5eÊ|V!§÷ïßÓh4â{¹ÜÝÝ÷ïßogggllüûï¿+++›™™•——ïܹSNN®m²ÕÕÕ/^$‘HkÖ¬iCs‘())YYY‰Û‘Ù€—ƒƒCGíûbº¬Õ«W_¼xñÚµk[·nÕÔÔµ9;i|QQ™L>qâÄàÁƒY,–¿¿ÿ—/_V¯^­££ƒ*--­««ã̹ª««ûöíÛ!Cp¾‚Ö®]kee…£Y³f™™™ùûûŸ?ÞÔÔTÔÎs:~üxSS“A{îCDß¾};ä#@G]WtYšššóæÍc2™¢¶-..F½}ûVJJª©©I[[›D"ݾ};11ñÑ£G8rb±XšššÑÑÑœÓI………æææ¹¹¹"=ñÌ™3ìb[·nE͘1£QNmmíéÓ§B7nlÏ} º²ßÿ]ZZ:,,¬´´T¤†/_¾ÌÈÈ@¹¸¸äåå™››ãœzzzÄçë|üøÑÒÒ’÷XB 'NØÛÛ\FFÆáÇ£¢¢ØIìààÐþ¤]Gmllœ:uj;&€„‚@€®lðàÁxPgïÞ½"5433[½zumm­œœœ”””ššN×P^^naa¡­­:|øðo¿ý†OIÆ®_¿C¡P„OÌ«´´téÒ¥GíÝ»wCC;/ºŸŸßßÿÝÔÔ$RÏ9}ùòåäÉ“$ÉÏϯÍ7H4tèâ6mÚ$++QXXH¼U¿~ý¬¬¬zôè‘––6tèÐÄÄD„ÐŒ3–,Y‚³f"„8wk¿zõjïÞ½¢¦"‰‰1bDSS“···ÆÿcïÌã¡úÞ8~f3ÃX#*%™B%©HÚH¥EÖ íEE%Qi¥(i“¢E¥´—ì…o‹PB$´ÈV–0Ì>÷÷Çy5/?ëØ&tßôºsï¹çœ›™{?÷yžówŽ“'Ož'Nìt'(((}Tè  ôs†nccÃår<ÈÿYööö?~üˆ­¨¨(//Çb±ÅÅÅ_¿~ݳgÏðáï]»Ë‹Ëár¹ cìØ±ñññ0ÑN»0Œ÷ïßDEE322¾~ýš——WXXX\\\^^^]]]^^þýû÷¢¢"¸Ä½`±Ø}ûöu®”~*tPPú?...d29""†Ý´ ‚ Ož<^¿~ýíÛ·a‚œ!C†$$$lܸ±¶¶öðáÃJJJ°ñïß¿áR#qqq~úÏÍÍUTT„“™={öàÁƒ›·ÁápD"‘L&‹ˆˆðy™M8|ø0‡ÃY²dÉØ±c;× J?]^Ž‚Òÿ‘••ݲe‹···««ëÓ§OÛM‚ ÈÙ³g9ŽœœÜêÕ« ­¬¬îÝ»OJJ’‘‘+++ÇŽ»víÚv§QSSãíííî¬œœœÌ«ÕäææÂˆiÁ›s¨T*ôô¡ôrÌÌÌÐT:ÿ¨Ð釔••mÙ²åoÏ¥}îß¿/°û,Ì©óîÝ»ÀìÆm€ÅbMLLp‘‘N8pàŽ;<==¡ÊIOO———§P(^^^üÌaÞ¼yzzz4MTT´GU`ÇŽ\.×ÖÖ¶ „ºHyyùÖ­[gÍš%àqQ:DDD„©©)*tþP¡Ó©¯¯ÏÊÊâ¥ÏGéØÚÚ""°û,™LÞ¿¿½½ýîÝ».\ض?èþýû ƒJ¥ éêê*))q¹ÜÇ{zzÃМ>˜››ß¸qCVV¶®Š‹‹?>iÒ$›ÄÄÄæ•°z‚‡&%%IKKÿ­Ü9²²²0 J¯%22òoOE@ B§B&“õõõÿö,PÚBð¯’+V¬ð÷÷ÿøñãñãÇÛL~ûöíàÁƒ}}}ÉdòôéÓ/]ºôàÁ‰´zõjYYY(VTUUCCCÛXcU__O&“³²²hll ŒÊa±X°Äº››Z¨¥{A¤¡¡L&Ã4Ë劈ˆôfÛ*tPPþ0Ì™3gæÎ{æÌ™+V´Qésûöí,KTT4??ÿàÁƒ“&M’””1b‚ {÷îÕÓÓ›;wnk*§¡¡ÁÁÁáõë×¹¹¹óæÍ›7o^]S ¸»»—””Œ7ÎÊÊJ㢠ô{`ùÞ¬¬¬ŒŒŒÊÊJ6›­££3mÚ4 Ãb±áoϱÐUW((ÿ'N„KÍ·nÝÚFõæ!C†¨««»¸¸lÞ¼ùåË—ÚÚÚëÖ­KMM¤§§¿ÿ^SS³ÅýúE¥REDDÔÕÕ322zê2Zçëׯ/^ÄápgΜéͯ˜((}ކ†‰tðàA[[[WW×Ì;—L&ÏŸ??>>Ç#B£ÑþöL›‚ ” 77·&''7?ZVVVVV6uêÔ7N™2|y¢ IDAT¥¡¡aëÖ­'OžÜ½{÷ìÙ³9ÎĉŸ}zVV‡ÃiÑ}ñâÅêêêN -&&æêêúæÍ›Nœ é¤Ð5zÒÓÓÛh£¬¬ìììlmmM"‘à]¥·aee%++»iÓ&ø[m —˽|ùòÍ›7KKK••• à¡ðððóçÏçççËÈÈ(**&'':ôùóçAoß¾Á·,Ë{ƒi¼ híï# ÅùaìØ±^^^Û·o·³³SQQ!“ÉÍ…Žœœ\‹‰s:J||üáÇ1ÌéÓ§¡ùšÉd„ª-Âår™L&‡k-Ýêþýû“’’ÈdòçÏŸ)JsÕÒDÍtýø¤»VŸ­\¹211ñëׯÝÒ J§¡ÓéÍ ñÞ¿Ĉ,‹J¥ÚÛÛûùùLLL`Ià&(((ðó6Òœ”””NœÕ˜N ‹…Çã©Tjk ¤¥¥«ªªŠŠŠZó«%$$LŸ>½ssÐh4 󯽅£ 77·[·nMŸ>}îܹo߾ݼyóÑ£G—.]êääD¡Plll>~ü˜œœ h·$xsX,Öĉ{`âü¿}ZLLÌÑÑñ÷ïßÞÞÞâââ»wï®®®öððwss«ªªÚ·oŸ¤¤¤§§gee¥³³3ƒùöíÛ§OŸ®]»¶xñbž#,kçÎÁÁÁãÆ{öì™Ý½{÷ÆŽûòåËuëÖ…††ªªª&&&–••80::º´´töìÙ¡°°@ èêêòY û‡Æ×?6Þh㯓æ x‡ Æ—/_ø™Ïܹs¿}ûÖ|\\|¨Ì˜1cРAüt…‚Ò£`±ØiÓ¦‘H$:÷˜ššjiiyxx8p qKß¿KJJ¶Ø©©iff&ÿã¾xñ¢ÓsæÑI¡Ãáp FoH¶¶¶Ô×× mÚ´€€€6^éZÃÀÀ`ذaÂÂÂuuu¨ÐAé Š‹‹CBBÖ¯_¿{÷n‡ÃY·n¹¹¹ŸŸßèÑ£ÒéôéÓ§ÿþý[YYYSS366öçÏŸ¼ÞxÙN¡-n‹ŠŠnÚ´ n“Éd¨<"""Ë—/‡ÛÂÂÂfffp{éÒ¥‘‘‘{÷îݳg¥¥%'²²²¼û€„„„ŽŽÜ&£G†Ûx<^II nùòÅÎÎŽÃálݺ•÷ê‹ ?}úÔÌÌlëÖ­Ïž=ËÎÎŽ‹‹#‰‘‘‘ŽŽŽ0kÈóçÏy~Õ9sæH¤»wïb0˜eË–Ñh4%%¥§OŸÞ¹sçÀ„¢¢¢àé¶¶¶0qÀÔ©SSSS………­­­·mÛ&0ñ‡Ò×a2™EEE¦¦¦Ð-…Á`X,ÖÂ… yÈ”)S_û¥]:éH&‘HÂÂÂpµX‹HHHp8ooïU«V5ϦÃd2ÅÅÅËËË+**¨dzX¬Aƒ5_ð…‚ÒEJJJjjjª««¼×kAâããEEE¥¤¤^½zÅ 8ýkÓm,‹Ãá ’"‰ðg+"""***&&&...!!!))9`ÀiiiyyùØØX‘ÏŸ?×ÕÕegg_½zÖs變ÄX,vÑ¢EqqqGŽ PTTô÷÷Çb±²é544˜››÷›RçÎûùóçïß¿555¯_¿>hÐ uuu;;»æ qmllH$ƒÁ€ùÓ †°°° @SS“C033ãngg7þ|À›7o 544Î;wñâEA]J߆Åb ¥¤¤ìرãõë× &77wðàÁ MZòÞRz4‡À÷yyùšššÆû½½½MMM+++µ´´’““ÕÕÕ_¼x1f̘OŸ>5^¯Á`ØlöÙ³gedd:1º……Å!Cêëë;7y!!!ð·WHæçç¡P(†††>>>©©©JJJ)))>|pqq![¶lqrr222š>}zvvö»wïþòet ååË—ºººaaa›7o¾pႉ‰IDDDPPP÷¤§§§§§÷îÝ;Ÿ††þ…Î÷ïߌŒ***¦OŸER÷NìoÁ{``0˜©S§†êèèøìÙ³˜˜˜Æ-W­Z¥ªªºaÃkkk,+,,|éÒ%---…B166†V€¾¾>‡Ã§‘H¤èèhGGG;;;€½½}@@À† Ðô(m³×ܸqæF?{öì… Ö­[1gÎ^¨®””Ô† 6mÚÄår{Û³K~EEÅììlÞÇ3f8;;ùòE\\<88øøñã?~¤¥¥5ÖlÙ²¥‰K‹O :;e”ÿãòåËðëtëÖ­æG}||”••ïß¿Ÿ˜˜¨¤¤äååµxñb€‰‰ ‹=þü­[· d``ðôéSϼ‡ P(¡¡¡‹-º{÷.¼ÆE‹-Z´¨'ÆÒÔÔ ©¨¨à³4Õ·oßLLL~üø1zôè;wît=ŸrïáòåËW®\Y×ÚE[[ÛÄÄRµ±±*‡OxÕÊæÍ›]YY)++Û‰ £ü @É2|øð]»vy{{Ãl6{ýúõ¿~ýÚ½{÷­[·LMM¹\î… `†-*•Ú߄άY³x‹0Œ•J:ujEE¯¡¡á„ Z«O‘˜˜Ø!»‘‘QÛÕSQP:DÛ^'<¿eË–-[¶4?dddÄK¯wóæÍ§OŸö›‚'“&Mº}û¶¥¥åíÛ· Æ¥K—zô¶Å§Y÷óçÏÆÆÆååå“'O ëO*@¡PxEÇÚåܹs!!!êêê‚ܸqCFF¦ÉW” Úì7*'""zšGeeeÅ‹¾}ûvQQ47ˆ‹‹«ªª.Z´ÈÍÍ-88XLLìâÅ‹ fΜ9¾¾¾EEE®®®âââp‰ëÑ£G>þ dffòb™=<<²²²jkkcbbV­ZÕoþ'Qº‚‚A,XÐÚº§={öŒ3ÆÁÁÃá$%%õÎèHç…NEEÅàÁƒíííKJJà2ú§OŸò¬[5ɾ ã cccaµÈ¶mÛ:]0åß!33SZZºÝUõõõ¦¦¦oß¾ÍÎΆ+4{'v½ÃÄÕÕÕššš'Ožôôôœ8qbee¥‡‡‡¥¥%¯···ùò¥¬¬,jEAé£(((ü÷ßúúú cñâÅ;wîìDzÏÎñõë×É“'_¹rÇ_¼xÖŽÌÐýˆˆ˜ê)00&ÔAAiƒqãÆÝ¿ŸŸ{vv¶½½ý˜1czs¡§ŽZ nÞ¼¹yóæÚÚZ¸3;;[[[;66öÆuuuááá åÕ«Wƒf±XL&³¦BAAá11±û÷ïŸ:uÊÓÓóòåËÿý÷ßµk×ÔÔÔznD.—ëíííããÃf³¥¥¥>|¨®®ÞsÃý øúúÂpŸÑ£Gw½8+JÿƒÁü÷ß|6 Zµj•¶¶6?Ë'ÃÃÛ×6oƒAƒÁÀ_ cccÃf³q8\Gßy: trssG޹hÑ¢ˆˆˆ&‡ÊËËçÌ™óöíÛàà`}}ýððpiiiÐ}yÆPPPþ" ÆÑÑÑÈÈÈÂÂ"??æÌ™[¶lquuåsYx‡HOO·µµ…µ¢vìØ±gÏÔñÝuzgNK”Þ ‹ÅÂb±*2µuëÖŒŒŒ¶–×ÖÖFGGwt2YYY¿ÿÖÒÒòòòÅ`0\.·…Žªªê¶mÛš«Hyy¹‰‰IBB“'OZ+n…‚‚Òw9rdrr²··÷É“'Ï;wýúuwww++«î"%%%žžž7oÞ :ôÒ¥KÚÚÚÝÒ3 ÿÔÔÔthó‡RSSedd[kó v:.&&+îµQH«5øÑùüùsqqqÛ)Ãß¿¿råJyyùÎÕýAAAé儽{÷&''kkk×ÖÖnß¾}ðàÁ¶¶¶………î“Ë寯ÆnÛ¶MMMíæÍ›açÎiii¨ÊAAù+Œ5Š¿'Ož´¡r¤®ÑÐаcÇŽÎåôâ÷ULYYyûöíͳ5ááǾ¾¾ŽŽŽ½07" J·0jÔ¨èèè—/_z{{¿~ýúîÝ»wïÞ4i’¥¥¥©©)Ÿ ILL|øðáíÛ·X,ÖÜÜüèÑ£|&îÍP©Ôððð¿= ”¶è„aàßáÍ›7=%,,ÌÝÝAýJïß¿×ÐÐøúõk}}}qq1¯pDs,//ßxÏ÷ïßgΜYPPrúôi‹ÅêP` _B‡Ãáàp¸»wïòÓx×®]³fÍRUU%‘HüÏ£Ó KºZ¤¬¬lãÆ{(mÑ×ï³3gΜ9sf^^ÞéÓ§CBBRSSSSSÕÕÕµµµ‡ &''§¨¨(###""Âf³kkkKJJ***ÊÊÊRSSãã㡾 6ÌÑÑÑÊʪüœEEEáúŒ¿=”¶044D×ñ5*•´´´Žž˜‘‘QXXH¥Rá:s‹U__Ãá¾ÿ®¬¬..ÎÞ޾ł•NNNM‚å}||444III‚DFFêè舋‹ó»àKè|øðH$–––òÓ˜Åb­[·.%%…Á`´»ÞjÚ´iM2)·Mã £P(òòòè7µ9ƒ†©GPz36lèß^ …ræÌ™cÇŽ]¿~=11ñÅ‹™™™™™™üœ;jÔ(MMÍeË–éééõð4ŠœœÜ7þö,PP:Fc0((‰ È… <==%%%½ÿ¾¼¼¼¦¦æÇ?~ü5j”˜˜˜´´ôèÑ£555uuucôEAA៪ªªÏŸ?wÎÞìããcee5{öl{{{ŸÂÂÂ_¿~=z4''ççÏŸ<ðõõå¹¶‹‹‹ÓÒÒ$%%©­­UPPÈÏÏWTT,--Æb±555òòòYYYL&sýúõ†††‡@ ><((nócO| ,ÛÑФK—.µ!t0 ‹]»vm‡úl|:€L&×××÷›JŠ((ý £ªªªªªÊÛ“’’b``0~üø~Sà¥3tèÐ;wîtî\&“igg÷òåËóçÏ=z”Ëå***†……ñŽ 1™LA>|ø ®®.''G$ €Á`$%%ååå………¡—ŠÉd~úôiܸq7ntqqˆˆˆ°X,:.$$D$‰D¢FãGè´/ 7É;Þ.‰‰‰•••­y©¡ ßY˜L&‹-,,}š““Ýx(((½ (tP‹ J_¡Cµ¨ZäÖ­[«W¯Ö××g±Xl6»ÉQ,‹Ãá †ˆˆ‹ÍÈÈprrâ1b,hþD¹ð¢pš¬'ïæåå:4mãÆ***vvv)))wïÞ-..ööö.//çr¹~~~°±””Ô“'Oäååóóó•••?þ,++Ëb±êêê( ,³õíÛ7 ‰ŒŒŒ¹s窫«ÇÅÅÁüžžž¥¥¥T*•H$¢ÕµPPzhŒ Jߢ[Ò^lÚ´éÇÂÂÂÐ Ãë355uÒ¤I¸BsìØ±.\(//àñx;;;%%%‡Ó½K2Û:0wPzzzçzŒŒ¼wïÞ† ’““Ë–-[¶lYã6ÿý÷ßøñã™L&—Ë6lXYY™ŠŠŠ¢¢"‡c³Ù F]]Ö‹¯¯¯¿qãÆæÍ›333aAc c“ ªrPPz¨ÐAAé ƒ`à³µ‹äåå 0`É’%ŽŽŽ'NäíWPPðòòzüøqrr²ŒŒLZZÚÅ‹ •””¤¤¤ètz·'žhGè°ÙlÐÑHäÆlÛ¶ÍÀÀÀÉÉIMMÃáTVVÛØØÔÕÕÉÈȤ¦¦Ž7.33sÔ¨Q#FŒÈÊÊš0a‘H,**Âáp?þÌÍ͵¶¶Æãña„ 'N¼{÷.›Í†Ò‡Åb‰ˆˆ?~\YY¹Ó‹ÕQPPzTè  ô~X,Çb±T*ÕÀÀ [ú¤ÓéÁÁÁ0Ñ‘HDäõë×)))¼P›ŠŠ %%¥§OŸ.^¼¸¡¡îï‰ôZí.— W½wz€ÒÒRWWW???,ŒÅbçÍ›',,\QQQUU¥  PYY9a„¼¼¼qãÆåææÂ:ì«V­JJJˆ‹‹¯^½šJ¥r8œ’’’¨¨¨Aƒ? špŽ;sÉ·Veåo ”Þ“ɤR©ëÖ­{øð!…BÑÕÕ}ñâE·ô\VVÆ‹Qi›ÍŽŸ5kï¹ 0íDr¹Ü.`.\¸œœŒ HCC‰D>|8`ذa222rrròòò8NYY™Á`P(¨æxâa5T€Ãᆠ&,,Ìb±8N“Ee †N§£*¥·#£ ô~Èd2t]¼x‘@ „††îß¿ŸŸ\|]A[[ûÅ‹¿ÿîÑÈA.—kgg'$$ôîÝ;hk‚@àp8°zè¦M›xU0xeßaK¤ÝüíPXXM'‚Ò A-:((}.—»téÒM›6íÝ»WLLÌÝÝF£Ìš5«ÛÇ9räÝ»w“’’4559ޤ¤dÚ)Ú: ¦[¬I'Ožœ9s&‰Djhhù4Õ áñøØØX‘üüüÇó”””öìÙ ‰Ûw}>(((‚µè  ô h4š™™@ðôô6lتU«®]»6tèÐøøøiiiþ»ÂápsæÌiñ2™ìåå•››knn£lðLoõîƒ •J‡ ¦ºÈ®]»æÏŸïåå%%%ÅÛ”~ká IDAT‰Á`ž={fll,$$´dÉ33³#F¤§§¿ÿæŠÖÒÒ‚ë­PPPú"¨E¥O@&“%%%çÌ™())¹~ýúš5kdeeoܸaiiyþüyþ»òññyöìÙ¯_¿"""ÜÝÝgΜI 455=<<ªªª\\\ ÷¦ç‚ršÐj02æ‚èêêÞ¸q£ëƒÅÄÄÄÄÄDEE)++‰Ä¼¼¼wïÞýúõ‹× ,,LOO/66¶¦¦FRR–'Eo‘((}Tè  ô ÷ªq•‚ªªª•+W¬xLJ…¨Ú¥ªª °hÑ¢… îß¿*@BB‚ŽŽŽ€omÙ“}||`ñÞ½{»qÈ/^ž;w.**ª±Êdff~üøQEEELL Í‹ƒ‚Ò×A… J_F£™šš67´8p€Åb>|˜Ï~JKK>:t¨²²òæÍ›sæÌäÉ“ùƒH$¦§§¿zõŠÉd>zôÈÞÞ^UUUTTtÇŽÅÅÅçÎc³Ù‚(++wá  ô&P¡ƒ‚Ò‡‘h± „··7wttä§Ÿ¼¼¼ððp99¹M 55µCíù¡-¡#""¢¢¢2nܸÆ;333çÎK§ÓÏ;Çç £®®.+++%%ÅØØøìÙ³999uuu>>>d2ùÅ‹²²²hRc”~ :hŒ J_Ãá´è½JOOÿï¿ÿV¯^M&“ùéÇÏÏD"vht*•Ú¡öüÐÖ݇ç½j²¿¼¼üرcZZZóæÍãs˜ÒÒR"‘8uêT!!¡éÓ§»¹¹]¾|ÙÐÐPVV6--­y{‡SWW×íŽ:—Q B¥¯À`0LMM[¬ÿàïï/..¾|ùr~úÉÌÌŒ1¢C£÷„Ði§¨'ô^íß¿¿Éþ³gϺ¸¸¸¸¸ÄÄÄð3ÌÍ›7:4{ö츸¸×¯_¿~ýšwhÇŽ”••8p ¬¬¬œœœ’’Ò¨Q£F5zôh@OmGivýúõîíS[[›Ï }”~êºú§@„ÉdvoŸÊ‚DDD```ÖäÐãÇËËËíìì.]ºÔn?ååå‚À:ÜM ÒÒÒeeeÍÕ××wjÖmÑŽÐ!“ÉÊÊÊêêêPšñ¨®®pttÔÔÔä'ƒÐùóçwïÞ½cÇŽ¸¸¸æGëêêêêêòòòšìÇb±×¯_·²²j·”n‡J¥îÞ½»{û$‰¡¡¡ÚÚÚÝÛ­``³ÙMJÉ¢ð*tþ) &NœØ½}Ι3'88¸§ L¢4z¯š ‹uùòeWWW~ýjjj &77—·‡ÃmݺuË–- 4íË—/·oß>qâDã³þ‚E†Î,[¶¬‰Ðœ:uÊÞÞÞÅÅ¥¹o«9×®]³µµ;vìÇùœ—˵··_¼x1 ïuIOOïö¿` ‘HK–,éz?555aaa cñâÅ<èUZ‡Ífççç·ÛÌß߯Œ³fÍj\Ã¥]P¡Ó6ÑÑÑýÌbÑ]E¡}(66våʕׯ_ï£Z'++kÔ¨Q}kò ÃÄÄ„H$6¯ê¸{÷n[[Ûv…\±”’’PSSóôôÔÓÓãp8¯_¿ž9sæÄ‰ß¿ß䬿 tÀïÕ¾}ûšì/,,¼}û¶••ÕðáÿÿÞn?¾¾¾7nܱcǺuëøŸßïß¿‹‹‹;¶-0BCCùqÞ%$$L:õüùó}îvF&“»%/v^^^XX˜˜˜X]]]oÓ:UUU|N&((HOOïÎ;+ÑÒøg…NIIɱcÇÚm–àëë{äÈMMMÌJ0 :ôéÓ§]ïçÇË–-ÃãñOŸ>íZçØ±cÍ¥@òòò***6oÞ¼hÑ"Á̪ë@ïÕ¼yóž##£É¡£GÚØØØÛÛó“Dèóçϱ±±fff:€ÚÚZYYÙ"0¾}û–ÀOËÄÄÄåË—?~¼[*¤öQdeeõôôÂÂÂz›Öàp¸aƵѠªªª¶¶öùóç³fÍ 5j”ÀæÖ¹¹¹Ý[¡¥Û))) å³JÎßâØ±cÝû7ýýû7Ÿ%¿}ûfiiyåÊ•Önýÿ8#FŒ¨¬¬ìZ',,¬®®ŽŸ–¬««ã3Œ·7½WÍ…àÂ… óçÏ·¶¶öóók£‡É“'ggg;88üúõË××7((ˆF£mß¾ÝËËKXX˜Ífãp¸æ5ÚŽ }¡½WK—.m.trrr’““W¯^½oß>~&—••e`` !!Ѷ lBOè»îÅÐÐV|mAvìØÈÉɱ°°8tèP‹) þŽ= è…ZGRRòöíÛm4ðõõ½sç‡ËÎÎÖÕÕ=uê?NÛž¦ººº¨¨ˆÏt¥(­qìØ±ß¿÷Dϲ²²ëׯo£Áãdz³³+++ÍÌÌvíÚµsçÎ>g÷íiH$ÒÕ«W׬YÓ;µ`ÇŽmL)---&&†Åb=zôÝ»w‡äô:ô^‘H$:ÞäPDDDqq±­­mBGXXXMM­°°ÐÌÌ,""bòäÉnnn&&&  aaaAš ž°þò\I¥R-,,š{¯.\ Z¼xñ­[·Úí§¢¢ ''×\è,\¸°qÅÔ&£÷ò_þðáÃÛHè ÿ füøñï߿߹s§………³³ó¿éþÀáp½VëðÆ  ¢££mmm_½zuüøñ¿=&!!¡¯¯ÿwçÐ×ñ÷÷ÅÄÄŒÛhðîÝ»ìììéÓ§'&&=z411100pàÀ=4Ÿ>в²roÖ: .lC»p8œ˜˜˜1cÆäåå={ö,77÷øñãcÆŒä ;Ï{Úä›Í tss›:ujbbb‹§O˜0ÇŸ8qÇ¿zõJ[[›Á`\»víäÉ“ÑÑÑm,ìè‰Ç=_=ŠˆˆŒ9²Å…ÁwïÞýýû·­­-?ý¨©©Ñh´oß¾ñöŒ=:::ºªª*""âׯ_éééГ×*•Ú?ü.\pvv&wîܱ±±),,üÛ3ú;@­cddT__¿xñâ7oÞüíuaaa77·½{÷‰ÄàààÙ³gùòåoO ¥Ïc``pæÌ™¼xñBGGçåË—{F½¨u µNO88zUUÕ[·n©ªªÙØØ„„„üíµOk™çÏŸGÄÒÒ²µsa$òÞ½{ïÝ»7~üx‡3wîܵk×fee@OƒŒE‡/¡V‹L£Ñ‚‚‚fΜÉ>”––VQQ‰‰‰a³Ù)))¶¶¶ðE÷Ôf±XÐBãããsñâE55µ 6äææ²Ù줤$/© Êî¡ïvÇ4Dk¯Ú®hcddÀb±Í³<Ñéô˜˜!!!¨{šÔ6×®]‹‰‰i-Ô£üË«±úèj,”n]Õïéý«± ý&??ŸF£‡C¥R)ʈ#W®\ÍTTTà¬å‰Ãáâãã­¬¬^¼x±nݺ>¨¨¨ð‚«²²²àFzzú°aÃàǯ_¿2Œn\R×1¡C&“GŒ1iÒ¤æ‡Ú:VVVmü2-,,nݺ-F- kŽüü|ggçåË—CÉ)0P7Vÿuc¡t;¨ë_ ×º±Á`0ååå z²¾|ù3¿Œ9‹Å>þ¶d³ÙÕÕÕ€áÇ{{{;99IIIiiiÕ××7–$)99¹¬¬,99™·óÇ“'O>xð`UUo}hi‰RGé˜ÐÁ`0 ·nÝÚ¾}û€jCèXZZjjjJIIñö WUUñ>644XYYÔÔÔ¦M›¦««;gÎèÄY³fM‡&Ùu ØÌÎζµµ…"T£ ÌõíÛ7¸J³ßsåÊ[ȺËÕç2…ü;Þ…ÔÜX}w¡S'¨©©iMÑ£ôN74@„……Y,–ªªê·oß222šÄâàñø?®_¿þÈ‘#¦¦¦¾¾¾Ó¦M8pàÂ… ›ô©­­}ïÞ½&_`ƒáîî®­­-$$$$$4räÈ>tý9Õáð!!¡#Føúú–——?zôÈÄĦ-†ÿÍc° ƒ‚‚ y‡ —ËݳgO“–ÒÒÒþþþ±±±¯_¿~ñâÅ´iÓ¼¼¼tuu›‡5õ4ð—laaA&“SRR¬­­·oßžŸŸ/° Æ•=räHWWWBß©¨¨prr?~¼¿¿O„ô·F·¸±¶oßîîîþHÒ¾…‡‡‡‹‹ Oݵxñâ´´4Aú·(,,ÔÓÓ»xñ"Ÿ%Ê»»±>|èèèØöS€@ |ÿþFÃl6[GG§²²òÑ£G°M]]¿¿ÿìÙ³ccc=zúôiIIIhŒi®r †wnk”••‰‰‰uý Õa¡ƒÇ㡲áp8†††?.++;yò$…B,:šššnnn> ÿñ㇂‚¯AÊÊÊšTuÀb±âââvvv>~øðá0 ¨+t~A‘HÄ`0•••D"ÑÑÑqïÞ½€Ó§OÓéô”””Û·oÔÓÓ355åE*€¿åÆ‚7^A¢££õôôV®\™““#€qÿ ð9-$$D¥R,XàëëÛ8î¢GŒ zc¨Tê‘#G”””<==Û…ÃáÔÔÔ`0˜·oß^½z•H$º»»¯\¹ÒÎÎ.o’†fòäÉÆÆÆM:ADBBn“ÉäÝ»wŸ8qâÊ•+?~ùòeNNNqq±––øóWè 7–äææªªª&&&.Z´æ=d2™&L€7b)))6›=zôhؘÉd²X,2™,))yðàÁ?Þ½{7$$&ǃöüºººÆ9uV¯^ýñãÇ#GŽ`0–Á`RRR®\¹ÂSptæñ6 Ÿ?.-- !üAHHˆ·Çãa3BKÀ‡=oØ AƒÎ;·cÇŽ„„„?zôhÕªU666þß㟞K*…άY³öïßèСÐÐP??¿«W¯®[·nëÖ­]ᅦàtœoß¾FŽwøðáçÏŸ{{{Ÿ?~íÚµmàíFš$ 777—‘‘ÿƒ””T‹¿g(tŽ;vòäÉ´´4ƒ¥K—º¹¹ <¸ë³ÚºukTTTllìÒ¥K‰Dbxx¸­­mDDD×{þ€BgõêÕÒÒÒ/^|ñâÅ‹/ÔÕÕ·nÝjbb"€ ü•¤‚PN-\¸p̘1~~~aaa¦¦¦»wï5jT-xà;Ò˜1cΟ?ïááuõêÕ¥K—®^½ZùT Ù³gâââöîÝ{úôiWWW[[ÛæYO9NCCƒ˜˜ØÇ===N:%##xöìÙÚµkÏž=‹ ˆ˜˜XÛƒÂÇëëׯÝÜÜØl¶®®®ƒƒA_¿~UUUÉË˳Ùìîòçt²—ŠŠ EEÅ_¿~UUU‘É䤤$‚‚‚É“'ûùùijjº¦ÉÉÉS¦LÁãñqqq‘‘‘ÊÊÊ;wî´µµ¥R©X,>°áÿ¦œœœ——o.—ëååõúõëµk×.X°`̘1D"ÑÒÒòСC%%%L&“ÃáÐh4Öâ$kkk»²Ú¥‰˜PRR Þµk×®]»¢¢¢ÎŸ?Â[J×£@7ÖƒN:uç·Šˆˆð251™L&“©ªªŠÁ`à“²Ý ¸ £U0Œ††Æ£GÒÓÓ:ôäÉ“³gÏ^¹reÅŠ¸4°Š—ËmWµtzÞïyöìÙ999“'O¦R©gΜñ÷÷ï¾ëh èÆÂb±‘‘‘aaaaaaMÉdžî‘€ÅÅÅkkk{{ûcÇŽùøøÜ½{7<<ÜÑÑÑÞÞ¾‹S211!‰±±±vvvÇWUUÝ·o_yy¹œœàåË—gΜùøñ£¨¨¨®®®££c㌠7nܸ~ýzaa!‡ÃÜþñãGxxxQQOHH¨¨¨øùùý÷ß{÷îMJJÚ¾}»ÏþýûW¯^Í Ãe0d2ùýû÷îî'OŽ7.77WFF†ÃáÌ;wÀ€fffd2™—N° äååoß¾Ýxƒ‘••íötù:222yyyrrr  (((˜4iÒÍ›7ÍÍÍymà}jäÈ‘ÞÞÞ°b‹¯¯/h†††âââlÙl6‡knÒOHH€ÈÒ¥KïÞ½ËËüÍår “É„ÿ6fÆ 3gÎ3f ‹Å‚ YÍhq'‹Åz÷î]]]]s« —Ëýüù3ϹÃd2Ùª¤¤$""RSSÃf³yI–x”——w±uuuss󤤤Ÿ?Ö×ׇ‡‡w±Ãñë×/>½f¸ö€‰­¬««ûòå ÏäzàÀhž¥P(›6mÚ¹sgÏ^ÞÂÃÃãããC† ¡P(\.·ö¿ÿ®¯¯¯¯¯o1LBB‚L&{xxØÙÙY[[?þüÈ‘#7nܰ¶¶î®¹•——GFFJJJÂ’111öööcÆŒ±¶¶®««{úôiJJJdd$™Ldgg:tHKKKOO¯®®îÙ³gÐ+oggýæÍ“ªªªsçΑH$;;;€››Û­[·¦OŸ>wîÜ·oßnÞ¼ùèÑ£K—.ÕÕÕ ~ùòåüùó¥¥¥cbbÖ¯_ÿòåKx£lm¬¶gØ!êêê–.]Êápètzó m Ò’’’»wï6550aN/,, îè4:ššÚ¨Q£Þ¼ySYYYYY)€a¬Æ AƒNŸ>½gÏ …ÒÐÐpûöí{÷î `tOžœ““óùógƒ.°5hC† ™0aBnn.‹Å*+++++ëb‡p™3øhž5kVbbbXXØÒ¥K‹ŠŠ6nÜpÿþ}YYYaaáW¯^¹»»Ÿ8qÂØØ¸ªª AUUUð' Œ†††¿¿¿¥¥åÑ£Gõõõ FóÌyi×ðÓ]tRèp8!!!‹ï‰ŠŠŠyyy'Ožä9t’’’.\¸PWWgooïââÂáp š5Ìi4š°°0¯ÃŠŠŠï߿××6––nü‹Å 7¸¸ø¨Q£¦NÚ‰«³°°ÈÉÉi,t˜Lfpp°··7ƒ&-Z IDAT|[•––¶¶¶^¶lÙåË—ŽÇår¡u¾XìÞ½›ÍŽ È«W¯Μ9ƒ og‹MvÆÆÆîÚµ ƒÁ°Ùìàà`^í …âää4k֬ƯÔ=Ýúõëá»cÛt¢ó¨¨¨+Vp8œèèèýû÷Cïê°aÃ\\\,--«ªª th4š··wTTÀÊÊêøñãÍ¿·T*µ¶555ÕÕÕÎÎÎx<>¼333Ï;÷öí[؃ÁTUUuKd4\‹ŠŠž:u ~ó}}}%$$¦OŸ––ž1cFDDĽ{÷V¯^ þ˜!‰êêê‹-‚\###‰íèè޽}@@À† ÊÊÊBBBÖ¯_¿{÷n‡ÃY·n¹¹ù´iÓ‚ƒƒ¯^½ª££PWWwrr*--:thcµ=ÃŽÂ{y€w‰D$ÿ 7 p;???66 OŸ>¹ºº>zôA'''==½®üQøäëׯ®®®………Ðd¨££ÓØVÁ³a´¸³ p?lÖ¢ñƒÃᤥ¥=yòþËËË}||x‹õôôlllÖ­['€«†LŸ>}ܸqÍíOÍÍTÐRÕš™Š×ÌÕÕuÕªUƒ†íËËË=<<àO,55õÀ‘‘‘11±•+WZ[[ DMM»»ûëׯ1Œ¥¥å¢E‹ð‘ íÜM6ZÜŸ={¦¡¡¡  Àf³ÓÓÓSRR Ða2™×®]óòòb0°Ð˜……‰Dzöì™»»û‡öïßïàà€ÅbY,V“3ð¿wèС¡¡¡ÆÆÆ666™™™êêê=ýÿÓ.:8nذa÷Àˆc''§­[·r¹\__ß3f8;;«©©ÕÕÕAgüm0™ÌÒÒÒ&NŸAƒñR+¶‘HܳgÏþýû?|øÐZyÈ €1h¾¾¾0HS^^~õêÕ¦¦¦m Õn¤¢¢âÀiiiX,vË–-6lhRCLLŒH$B_C‡€§|üøÖP(ggçÅ‹ãñxG%8°qÐz÷¿x‘‘‘ðåoРANNN+W®XýÔüüü½{÷~ûöMXXøäÉ“­E‰ŠŠŠŠŠ2„·§²²ÒÙÙYLLìÑ£GgÏž…±®X,vΜ9¶¶¶úúúoÞ¼é–ðäåË—gddTWWóÜÿl6ûâÅ‹›AS .5 £ãñx''§Æw´¹sçÂyóæEGGWVV~þüAžÑ‡Ã'$$ð,¼[ üqñÜ”­Õö ;„¨¨è½{÷¦L™B$›,mƒ‡ÆÆÆÛÙÙ]¾|™Íf‹ˆˆlÚ´iÛ¶mbbb‚ÉlzòäIƒ1vìØ   ‘#Göôˆ7nÜxòäIeeåöíÛ/^¼H§Ó1Œ³³³¦¦&Œ‡FFF7nìÆ===uttxË| ÕÕÕfff¡¡¡‚Éd++«•+WBµ->|øÊGŽ™9sf×ûÌËËÛ¸q#¬Xàåå•’’Âb±NŸ>}âÄ ø¤›4iÒëׯ‰DbTT”»»{JJÊúõë>|8pàÀ˜˜˜yóæµÖ3|ˆ555ÍÈÈðó󫨨€A<‘î‰ô:uuu~~~µµµŽŽŽ‚lÞ¼YMM­y\’PóÐAvéëëÏ;WVVvÀ†ï=­rЧVWWwðàÁsçÎÁ{eeåµk×Λ7¯sF…Îñöí[77·ªª*oooMMÍn®˜9r$”8‚¼:/ŠÍfËÈÈlß¾}ݺu‚,-~âÄ :®ªªÔ¡¸.‰\]] >ÄÄÄV¬X±aÆn…ëׯ—””411Ù²eËíÛ·á› ‹}üøq‹Ó¼¼< …’žž^PPPTTtûöí'N,]º”Wí.99NòÍ›7D"QRR昈‹‹SVV /**Ú8•h‹´6VÛ3ì FBB¦|å(Èž={Àãñ«W¯Þ½{w'^9:F;vìXLL `åÊ•^^^‚ùVCóFhh(ƒÁîܹSCCCC øVYZZ ¿f–––kÖ¬i­¤c·ƒ È­[·üýýÙl¶†††··÷ Aƒº}è«={ö,ü¨®®¾gÏžeË–a±XGGÇS§Néëë§¥¥©««úôiàÀm¨ˆ¤¤dIIITT”µµµ¾¾þƒ8´uûäù¤«B'%%EKKk̘1‡ŽŠŠÚ»w/´KûùùmÛ¶mÆŒ–––/_¾lW„ÆÆÆnذ½ ‚»»»‚‚‚ UUUC† †5Á”°‡]]]¸1a„uëÖ͘1C§&î*OOÏ&n»®XÊÊÊÎÎÎfffýRâ@ðx¼¤¤¤½½½­­mGf]wUÛ@¡9rä† V¬Xѽ󈈀¦ø7n¸¸¸?~|ÅŠÛ¶m[¶l™½½½““Ó‚ tuuñx|^^Þ‡ììì6lØxöìÙ‰'"##UTT ÆçÏŸEEE›9=<<²²²jkkcbbV­Z%$$D¡P }||RSS•þ×ÞÇCµÿÏØ²oYŠ,éZ³Ý«ÒUr¹å¶=THÒB}•%K$7Å\!eRn‘JR$i‘ent‰®Ûr«©´)Z(ÅÍΘßïÏï<æS¬3c¼žgμÏûÌç¼æýzŸ÷{òä›7oVTT \½z!tôèQggç &àÐ?žÖǾú®!àÀ‚D"-X°à×_eCk 9]E¥RY͵<p C&“ùå===¶íšýð5_HHÈÁÁaíÚµÃ~îsºjõêÕ^^^#4¤Ñ)mÆŒ!!! , ît:::ÙÙÙ‹-úøñ#ƒÁèÿ´‰'VWWgddlÞ¼YOO¯¼¼\RRrØ»÷ßà?¸;wîO™2%,,,55ÕËË ·«ã,Õýû÷8rïÞ= …òòåKæ1¿4oÞ¼ŽŽ¢‹OGGǸqãäääØðßgðßÓÓcnn¾víZccc6Wà›éªa¡  œœ¼hÑ"žŸ^GGçÑ£GlKTaýLWõíÓ§OóæÍÃYª‘ˆ³÷íÛ‡çÏ;·aÆiÓ¦-\¸7Ѱ?]ÅŒD"-[¶ÌÏÏ·Ìñ6+V¸»»³9ù2é*VzzzæÎ‚;ê †»»;îÓóÍf×/ijjÞ¼yóàÁƒŠŠŠŒ‹‹¾*Ø`ܽHEEeûöí¿ÿþ»££ã7dee/_¾<þ|¼¡¡aqqño¿ýF¥R.\xòäɶ¶6<”+Ÿµ»²3¹ð™ÞÞÞùó绹¹qä?™ é* wü ØÿKb(é*ffff¸³í¹råÊgköìÙ³gϼlkkkkkûÕ7.\¸°ï¡b¼½½cbb>[ÉÏÏïéééééùÙúÂÂBæ??›]®}õQC6011aó˜CœJW1[µjÕàº{FŠŠŠÛ¶mcçÙ“®bæïïkø¬ííí"""ÝÝ݃>ǦM›VPPÊñ!%èÜ¿_OOo„ AAA xèq<~±¬¬,å`çÎóöö–——777?s挦¦&Ngÿ”•žžÎ¶D;36¤«ÀHzºŠ³Úƒsùòe|ìIIINNNìhŠSØdp0]ÅŒç€9ˆmé*fÄðÄÌH$ÒܹsOŸ>]__?”ŸÄ¸•ˆð~U?D}ZGG‡·vâlº °;ÓU}ÃýO¦L™¢¨¨8ÄØùùù¯]»ÖÑÑ1gΜþ?Ï8ìúè´µµutt())IHH„‡‡ã!Y»»»¿Ùä €ÇLÄEùøø¼zõjè˜ò¶¥«ÀÈ®tÕ¨öe. 7¤«Àˆbºªo¸)--­­­m( Òt:ÏÒÒ266–ç¾Ôß@‡ŸŸ_LLlÆ ¿ýö›¤¤d^^ž]?ßKŒ™X\\lkkûðáãGâ&¢ÁV›w@ºŠ oº —¤«ÀÈáHºªŸúîVûMøIÞ´´´¥K—þý÷ßxzsŽèï* @&“<øøñcIIÉþG93qÒ¤Ieeevvv¯_¿~þü¹™™ÙÀ+ÌS ]Å ]F¤«x÷¤«Fȃ–-[öÏ?ÿp0ÊAý t.]ºdooÿéÓ'qqñ¡ÌO;nÜ8aaáòòò¦¦&nš³ ]Å ]F¤«x·¥«Fî†üý÷ßs¶ý tÌÍÍóòòŽ?ž‘‘1ÄýuuuIJJ*((°a~®é*é*0B ]Åó¸9]Å“úõáJJJ .Z´hˆ;kooïé鉋‹óññá`l΂t€t!®ây<Ÿ®âBý tJJJðÓðø©³AïLXX899yûöí›7oÆóŸº¨Q ÒU<ÒU`$@ºŠç‘têoêê¿[­y­¶¶ÖÞÞÞÌÌŒ‡gVb%11ÒU£Ý©S§êë뤫À°zúôé‘#G ]ÅÚ››·lÙò×_AºŠýØúAOš4©§§GII©»»›—RWÍÍͯ^½ê{ƒqôèQHWq­ÖÖVbꃯº{÷.B¨¾¾ÒU ÿ FWWWÐét„PJJ BÒU£Tww7žú«ðWŒç9tG°;¢äÉ6-----í››AºŠ›uttœ={ö››Aº ȳgÏúyWƒtÕèÕÏñV ]Å)<v°“”””²²r¶TQQÙ½{·””ÔHW ”¸¸ø—ÓO~™L^µj·ë===œ®ÅèÖÓÓ3ìe’H$!!¡þl),,»dÉ’a¯iýìlêäääíí=ûlpîºd:«W¯æí‰|{zzîÝ»7¢»hhhÑò¿IXXxݺuœ­Ã  ÔÖÖþüóÏœ®È¨7ìñ«ŽŽÎÛ·o‡·LÀmþüóONW|: /ÍÍÍÐ…›™˜˜OÆ¿jÕªÎÎNýû÷=z´¾¾^MMmÍš5ø-~~~|||zzz7nÜ––NJJZ±bEOOOMMMbbbdd$ƒÁ¨©©gUB(""âĉïÞ½“““ããã»{÷®ÐôéÓ?~ŒRSSCMž<ùöíÛƒ;:À Æà9ÖŸ«ÄWÿ»wîÜùäÉ--­¦¦&>>>EEE‰„‹¢R©uuu!eeeoooâïÞ½«¤¤$$$ÔÜܼaÃcccVå÷QŸA€$¡?wÿ¯Þµƒ‚‚ª««uuu?~üÈÇÇ7a„   ⎎~ùò%BHEE%00¯Ü¾}û­[·&Mš4nܸ¦¦&ooo}’””ŒŠŠºvíZ|||dd¤°°°¼¼<®œœ\lllUUÕ˜¡ïz:99yzzÚÙÙ eƸ .­î‡Þ¼y3>i>|øƒÿÉÓÒÒŒŒŒ|}}B………ååå©©©¡;w"„„……wïÞ—û.çüùó±±±ø[NII!¶ß¹sçÎ;ñoÇañï¿ÿâ麢££ÕÕÕ…„„ÂÂÂ233׬Y#''÷ìÙ³ððp2™¼~ýz„ÐÊ•+_½zÝÔÔ…ë?kÖ¬|P®®®d29""!´k×.VåTTTÄÆÆhkkŸ>}úÚµkøÿ099™F£EDDà6ëŒ7Œ©s¬?W‰¯þwïØ±ÃÎÎÎÍÍÍÒÒ!TXXxæÌ™åË—#„NŸ>­§§‡ã›+W®¤§§ã¥Û·owqqñóóSQQéîîÞºu+tX]=XÕg @èÏÝÿ«wíÝ»wÏž=ÛÜÜÜÆÆ!”ŸŸòäI„PJJо¾>ŽoòòòNœ8±jÕ*„PDDÄ’%KBBBÔÔÔº»»½¼¼p Ã**`UŸ/õè<þÜÇÇç?ÿù……qïÉÉÉaž©®®®ŽÁ`H¤¸¹¹á•¶¶¶ÙÙÙ}|¬ÊY¼xñÊ•+åäätttð4DÝÝÝ¡/OŽçÏŸß¾}ÿá bbbUUUB±±±ãÇÏÍÍmkkcµ>++ëßÿ'JÎÍÍutt|úôéÝ»w‰ò-,,ñuG[[ûÓ§O!sssæÜ'™Lž5kÖg3³ž7oÞ|úôéõë×[[[ÑþñâÅ‹àààû÷ï›™™¿ òóóëëë‰mp‰Dª®®&ÂD+++ÜÕVå,X°ÀÝÝ}üøñšššøÂ7B ð„ 222B)))MMMøF‚eff®_¿þáÇååå¹¹¹3gÎD MŸ>]HHˆ˜ C^^~ÆŒx™U9!EEEIIÉøøxSSÓ¨¨(„¾¾~ss3bj<`,œcºJ°úïÖÖÖ&þ´²²"~UVV‰µµ5óïœ)S¦¨¨¨ „ˆÃaU>«ú ô`[[[y; PYYÉÇÇ÷×_ÙÛÛ³út÷gu×ÖÕÕ%þ´µµ%Z:îÝ»GD$vvvD‹BHSS7F2ã¬ÊgUŸ/§¯@G]]}÷îݸý ©© 7Nž<9..®wõ«rllllllZZZ***’““UUUñ?ö ©¨¨Éä¿þúËÖÖ–y}WWBˆˆ*„……ét:ƒÁÀ2XÄʯ®g0³gÏfžÃ_q:::BDä!**ŠBjpõì?UUÕ;v´··‡……577ãsKMM-22r¥}†U9––––––­­­UUU©©©“&Mruuúî¾”žž. pàÀÒÒÒšš}}}ƒ1oÞ>>þþþšššZZZ>>>çÎKMMŠŠúùçŸùøøð\зnÝb0ø‘Šêêj„«õ‹-*+++**ª¯¯¿}ûvLLÌ¡C‡BÚÚÚ***~~~YYYW®\IKK[°`Ann.®€ÒÓÓÏ;·aÃssówïÞ=yòäêÕ«wîÜA•”””••õööö§ž¸›öýû÷ñù`ÂÂÂÁÁÁ¸-!4iÒ¤¢¢¢/7ÓÒÒºzõ*^.,,Ä?2Ó·\WW‡3¯}—C¥RB¢¢¢Ó¦M ÀŸ$6¸oùKxNÁ––MMͳgÏ:88¸»»9;;^¾|ùõë×ׯ_ß¶m>j}}}WW×S§N%&&â$,†'¥§§'''ïÚµ !TSSꄃƒƒ   µµõ´iÓðu¿„¯GŽ9qâÄÒ¥K544†å`GŒµs¬ŸW VÿÝÏž=c¾zèèèàe}}ý+W®à墢"b=+¬ÊgUŸÂW3VI€˜˜˜Å‹;;;{{{geeõööëvvvK—.miiÁZX­ÏÊʪ¯¯ ;vìX[[¾/à$Àž={–-[öóÏ?GFFº¹¹I###„¹¹¹¥¥åÔ©Sq•pgôTOÜóæ›Û~ÞýYݵŸ½  ehhèááÖÓÓƒ›U<øÕrB&LøôéÓ¶mÛBß}÷ÝÑ£G‰¹©S§nÚ´‰J¥Òét###æþL`Ô#çØ@¯¬þ»+++ñNYY™X¿bÅ *•ZPP@"‘˜×‡……•”””——›ššR(”’’Ü´Àª|Võ¨‰'Žñ$À@ïþ¬îÚ&&&÷îÝ»xñ"BHEE…X¿jÕªèèèË—/“H$æõ[·n-***--5kVhhhQQÑÇ¥¥¥Y•Ϫ>_"!„ÜÝ݉nÌÃep‡‡‘………ƒƒƒ……ëÀ………EEE'Nœ`ÿ®‡·ã0W)--µ··¯©©Î4`„ŒµslT\.¦OŸ¾gÏžÌÌÌÌÌLggg]]ÝÎÎÎÂÂB~~þ˜˜˜eË–µ··¯Y³¦µµõðáÃsæÌ‰ˆˆ8}útdd$•J3gNvv6n§ùá‡X­‰‰IKKsttÔÓÓ«««+**RPPˆ§Óé .Y¾|¹¤¤d}}ýéÓ§ÿïÿþïçŸF=zôÈÁÁaóæÍ²²²4­ªªi÷håIDAT*++«¹¹¹¶¶öñãLjŒŒ”’’š9s&‰Dúf=ª««‹‹‹ÍÍÍGîÃäx€‘H$˜½€Ïݾ}»¼¼!tãÆyóæqº:€Á9ÆÍx; pöìÙW¯^!„\\\^¼xÁöO—†¿Eçùóçû÷ï/--ýé§Ÿ˜Ÿ`3hÑQ/^¼8|øpyy¹¥¥åöíÛÙ¹k6Ð××Ç£zHKK?xðà³çັvŽáá•MMM7lØ€¤âN¸EG]]ÓY›6mò÷÷ïã©«¡ÃÃ+Ïš5ËÛÛgc9eDZtÔÕÕ‰œ¯RUUýí·ß8]‹‘2ЮN ÔX;ÇBCC7¥( g‡Xd“z€gA žx:àYè€g±5СR©xºZ0F:thÍš5œ®`t€+ÆXÀþH€e ó믿N›6 Oæ2mÚ4<¹ÒPx{{ºñ lmm ˜ŒÄÈ@Ïž=³´´Ä³¬s›””KKËààà    60O=Ö6lÀ¬pi&[¶lö]TWWkiiÓ1"--ÍÄÄDQQÑÊʪ´´ô›Û×yÂ=çO^1Æ2ÞˆXŽ£³k×®®®.---„…B¡ÓéS¦LacŸEddäÍ›7ñÛ¢¢¢ßœpnß¿ßÑÑñå4rçêêZSSƒnïîî å†!½‡(11±´´”B¡$&&Љ‰û.ÚÛÛ‡½pÀƒ‚‚<<<¦M›váÂ…%K–œ?þÇìã-ÃužpÏùÆ“WŒ±Œ7"ØÖÖÑÚÚJ§ÓBxÒ/üRbbâýû÷I$RGGÇÚµk§M›†×GGG×ÖÖ êéé}³œÀÀÀššš¨¨( …"%%egggee…***ÊÊÊ Óé]]]Ã>9+ÆÆÆx2[sss<Ã0BÈÆÆæíÛ·FFF•••²²²AAA¸’VVVïÞ½ûñÇïÝ»×ÙÙ©ªªêêêºhÑ¢›7oº»»Óéô²²²S§N%$$0Œ²²2qqñ… â)9ÍÌÌB***999ì9´úðშ¨(ó*•ŠGwUVVÆ£Œë_½z%((¨­­M¬\¶l™¸¸xll¬””Ô¯¿þZ\\|þüyâäa'SSSüÚØØÓ M:õÕ«WÓ§O¿s玜œ\TTÔ‚ B:::oß¾µ´´¼qãFgg§††Æ¦M›œKKK/^ÜÓÓSSS“˜˜É`0ð¼EÓ§Oüø1B:yòäÛ·o³ÿ0;uvv†‡‡"„–,Yâââ²cÇŽ;v è<á¥óg®ýqþüù#G޼}ûVSSÓ××—¸ý±òìÙ³uëÖ ñ÷íp•3P£+è+Ðyþü¹^~óæ ^Ø¿¿¿¿¿ŒŒ B¨±±1<<|ïÞ½ø%wwwâ½~~~øðRSSŒŒð?~~~fffßåDGG/Y²$66vß¾}D`ÊÌÌLHHÀ3¯&%%õçØFŽ»»û®]»„„„(JqqqhhèܹsÉd²»»;…BùÏþ³víZeeå{÷îíܹóÇÎÎΛ7oŽ‹‹C-]º”L&ÇÇÇ㢢¢¢®]»),,,//ÏÑ#ûŠ/^wuu•””$&&ëOŸ>­§§‡¯VW®\IOOÇ3¶dddèëëãõ………çÏŸÇÛïß¿?55UJJ !dccóã?rÕ5Ëßßß××WXXø÷ßÏÏÏ÷ôô´³³ãããó÷÷÷÷÷¿uë–¯¯¯ššÚÍ›7}||Þ½{·qãÆ<5´««+™L&ÒšÉÉÉ4-"""11QDDDQQ‘£GØ¡ªªª¥¥ÅÉɉXãèè¸råJ##£'< ô訫«­ŽAAAx!''çíÛ·Ä6uuu ƒD"õööþþûï<àççg0ÄLcUUU...xÙÖÖ6;;»ïrBjjjÄGFX¼xñÊ•+åäätttlllúyx#g‘ccc%$$ÆŸ››ÛÖÖ&&&6yòd„PLL nž±µµ•••MLL\½zµ¾¾>~ïøñ㌌ˆ¢´µµ?}ú„þ·Åˆ«¨ªªâ†è®®®-[¶ìÚµ Ÿ”•••ÄßÖÖÖļÄ>$:šYYY TŠŠŠMMMBBB%%%øŒç¸=öøñãRRR gÏžmmm•Àm¶GÅ¿'–,Y"//¿gÏ///ü^yyù3fEéëë777£ÿm1c“ЀÎ8߯ȃÐÙÙ¿qãÆ 6 „lmm}}}÷îÝëãã3 †|®Mð@$0àÔÕäÉ“qËÄg(Êœ9s<==ñŸÄÇ1ÐrB_M3ÛØØØØØ´´´TTT$''«ªª®_¿~€uføËÀ ±Ì|­‘––îêêêííekÍF†  à’%Kþþûo;;»Á•°lÙ²ÌÌL~þáŸgmèX}§Ì?%eddºººpC+˜®®®˜˜Ø©S§ˆûqFFÆ?ü0¸ßÙ¼q¾…+BèÉ“'­­­ .$ÖüòË/>>>ºººjÈ] Ñ øÔQUU¥Ñh_FR 8¨DUUUá0!¤««ûÇÌ›7!”ŸŸÿðáþËa%:::00PLLlæÌ™ÆÆÆÛ¶mhÍçÎ;wîÜA•””àÎÈ ¸Ûù­[·æÌ™S[[‹ª®®&*===ÝÜÜ”””îß¿Ÿ––¶bÅ ~~~111„ÐÅ‹ùùùqÐ]WW‡»6KHH „ÒÓÓeeei4ZUUUII {Žn *++‰¯L__ÿÊ•+ÖÖÖ¡¢¢"¢›¶¶¶öÕ«Wç΋*,,¬®®&ÞnhhxòäIIIIÜý…SÊËËËËËB4 wFž8q"~<¤¬¬ÌÎΟ½÷ïß'z’._¾|óæÍªªªwïÞ=tèкuëp \zz:??FFB¨¦¦wmÆííGŽ‘““»páÂÝ»wŸ>}Ê¡Ãì $$ÜÔÔdbbréÒ¥ÜÜ\œ…Ðyxè|ã+Æà ¨!t%FW$À2Ð ¼zõê£G´´´BBB /_¾<þü°°0 …’-"""))©¡¡áììŒZ½zõÆÇ×ÚÚ*))ÙÜÜ\WW§¬¬ìââyñâE‰¤¨¨(//¿ÿ~///Våàý⌠ŒŒÌ¯¿þŠëóâÅ‹­[·vvv’H¤îî€~~.C´uëVܰŒrpp =vìB( àìÙ³iii¡mÛ¶à·Ìš5+55õÇjjj~~~¸UVGGÇÙÙ9..®§§GYY!”ššŠ'×ÒÒruu=vìN×ÕÕõõõeÏ¡õGJJJqq1>öîînuuu¢·àŠ+¨TjAA‰DRVVöòòÂë—/_¾oß¾¼¼<‰¤   ''wøðaüª……ENN޽½=G[·nÝ«W¯ÐÿÏ%»¹¹íÝ»—J¥"„Ö¬YsíÚµC‡!„<<<ˆ)¦­­­544ÂÃÃ×®]‹244ôðð ëééÁý@p縩S§nÚ´‰J¥Òét###ܵð6www‘¸¸¸ääd==½ììl|ÅÐy‚”Þó'¯}›2eЍ¨è… pê !téÒ¥©S§® ŠÛ¼ Bîîîl{ˆ‰m,,,,,,عӛ7o®]»gOÙ¶Ó¢¢¢'N°mCQ[[[RR‚OåQ¡´´ÔÞÞ?ÞÂéºÞçÛgØ|Ř>}úž={:ÊË©S§¢££œœ ®\¹RXX˜””dbbòàÁƒåË—oݺ7äß»w/##7e=zôÈÁÁaóæÍDC~ppðÖ­[¥¥¥™*§? M›6ùûûssø8ŒH$—f=G©gÏž!„JJJTTTˆÆFÀìÌ™3ÄïžQ”E£ÑÔÕÕ‰Þ Œ8ß>3*®NNNÂÂÂÉÉÉššš‰‰‰ø»PC¾¬¬,â­„÷€á„Ç×AIJJ±g`ƒÑÒ¢ÞÖÖVVVæääÄýW._!$--ýðáCŽÈxœoŽ\1×¢3,Ø™€0x4ÓUà^¡¡¡œ®Â`TVVrº ` ó0J¯ƒ ‘ÀaÉÉÉ¡àà`v&Ætƒ„ÀÈa9{9Àhx:àYè€gA ó_¶¶¶_ÀÓˆ „ ¢¢¢˜·ohh˜1cÆg›aÏž=³´´ìîîf_íÁ×HÏ󌒖–ÆÕÞ¼y£¤¤ôÙfXuuµ––VWWûjF8Çà~ì töíÛǶ} ‚››B(222.....nóæÍ̯†……}6¯œœ\\\ܦM›¾,ª±±ñýû÷#ZaðMÞÞÞ¡ÄÄÄ“'Ož333<énooïÑ£Gmmmøá‡E‹áy@±ØØXÜ,”’’bccóã?¦§§ã—âããçÌ™c``0gÎ+++ø©7PZZZ!SSSeee??¿¥K—N›6MTTôõë×JJJÞÞÞóæÍcþUM"‘æÎkjjúY9Ó§OÇCˆª©©IKKãiê{{{ãââ f̘Á<¶xhh(þÉ~àÀ©S§ª¨¨9r¿¡©©)--­©©©££ÓÙÙ9ÒQpŽYŽD0ŽÎÿ°µµÅ ’’’©©©!99¹ØØØªªªô§„¨¨¨k×®ÅÇÇGFF 㹈©Tjnnî²eËdee_¼xO&“B+W®”ˆ]°`ŒŒL^^ÞŠ+>|˜””äáá¡¡¡qñâÅ7nÐéô;n^f``€¤¥¥ñHŠŠŠ)))wïÞ¥P(ý)!99™F£EDD$&&Šˆˆ(**"„víÚ•™™¹fÍ99¹gÏž…‡‡“Éäõë×#„6nÜ(%%ºlÙ299¹¬¬¬uëÖUTTÄÆÆhkkŸ>}úÚµkðò8ÇÆ 777 …‚¯ó¡§OŸÆÇǯ†……M™2…y{œ¨¨¨øòVB$`À2âÎöíÛ[ZZBeee>>>‚‚‚QQQ$i¤÷;8ñññoß¾ŒŒ$N82™|ø ##ÃÇÇ———Ç=s¥q6ñ@‡ø/ Ú½{÷Hïnˆ¾ÿþ{QQQccãþ_¡úƒÁ`Ìž={õêÕÄš/¯>‹/þì-GŽùûï¿?~\TTTRRréÒ%® ¹™©©©¸¸¸©©éðFŠ cÞ¼y^^^ÄQQÑ϶Y¹rågo¹páBIIIUUÕåË—i4ÚÍ›7á;åpŽYè'ÎFºú/bB5bý“'Ojkk?~Œ_•’’š9s&™L~úôéË—/¿\’@¥§§ËÊÊÒh´ªª*333¦¢¢¢§§WWWWTT¤  €x*++ïܹCìú»ï¾SVVF¹ºº¶´´¬_¿~Ö¬Y===………]]]ýoX¡G!„h4š¨¨¨¡¡!±þÁƒÏŸ?¯ªªÂ¯ÊÈÈÌ;—L&?|øðÙ³g_®GIII!„Ž9"''wáÂ…»wïZYY?^CCÃØØ¸¦¦&''gâĉ¸ÕíÛ·ËËˉ]ëêꪩ©!„ììì>}úäççgmmÝÝÝ““ßéhçØI€Q}—èÄ„j!¢5xÓ¦M¯_¿ÆËÁÁÁBBBÙÙÙÊÊÊžžž_]ÒÒÒruu=vìN×ÕÕõõõµ··WUU=þ|zzº”””®®.niDùùù½yó†ØõâÅ‹wî܉’——oii‰‰‰A©««ÇÄÄÀÕj p÷~www„P@@À¶mÛðúåË—×ÖÖâeww÷qãÆýõ×_jjjË—/ùòå—ëBS§NÝ´i•J¥ÓéFFF;wî\¾|¹††FZZÚ‘#Gddd qN!´zõ꺺:b×+W®Ä¬ &|úô Wã»ï¾;zô(|§£œcc$Š#‘ !äîîÎÜŸŸ7XXX888XXXpº"#®°°°¨¨èĉœ®ŒnÓ§Oß³gººú7·ÌÈÈÀ‘q÷GLI€DFF~™øl=BèÑ£G›7o&’¦¦¦4ÍÑÑñ«I€ëׯãB˜“ ,ÀI™?ÿü³°°°¬¬ŒU˜»iÓ&ü Ï#‘Hº’£:ÀÀàq¾”ŸŸ? õ˜ŸŸŸŸŸóOOOæçé_-áèÑ£}”?ÆÁàYè€gA žxtFæ7nÜÀcI4âÁ(ÀK Ðõ ¶oßÎéZÀ¨7þ|N× 3Ž:T*õúõ뜪ϓ“ ã"à1ì‰è$%%%&&š™™1Œ?N:µÿo÷ööÆ£`4‘Ààõë×?}úOCÚÝÝíïïO¥R‡¯bàj£"žÔÕû÷ïÅÄĘ×DGGã¹ëTTT™××ÖÖ êéé+çÏŸ/..þûï¿KKK^¹rEFFfXꀑƵ‘ÀçÏŸûøøtuu¦¥¥ëSRRôõõñQååå8qÏ&Ÿššjdd„×çççgffâí“’’’““¥¥¥BóçÏ777‡(à~Ü iuuõ¸¸¸„„„ŠŠŠ„„„ÆÆF¼þÞ½{vvvxÙÎή²²/WUUÙØØàe[[[¼µ±n…ÄIÂ6ûpûeV ¢šîN AIc%ŠNe+óW™Yùñç¿|?Ÿ~-ËÉ|öîH ytXÌNçãÉììÝÑ??ýú&ýåçƒ?'£?៳Åèüc¶¤W¬VzûöÛ·obzµ­æ 1\ŠeñöÿFÓéè-.z{ôóÁááí ŒG«½·~w´Z-&'—«âp6:/ÞŒNÿ}¶˜_ÎÆGåªõºÓùt¾8ü:š¾;úész½]_æíëh-‘Õùhq6™Ý§ƒ÷fZÞðfØ¢ôÆ«ë{òtr'Û%7Ý.¹ÅvÉM–ÇóÅj1š¬î“<™Ï§ÅhVR]-.‹öt–§£)ŠØCluàâódµš?òù?¦Ë& ”oÿж§jîÙb2~Xqﬨ¹Ê·Éxõåø;Óí*¯~Åtõ¯“åädZT}úÉlÕÛå¯ú¹üæ·“Ðûæ×;JCyµÚía [اog—“q±|DÌ¹Ò—õ²·ÝõÍuMoLùÖÆfHLGWÅb}ù÷7Ûôáú ^#έ»0?ùŸâtµfï«ÑlçN:e”ÖÚ2ªªöem£§ô|9ºi:ë¦è¹ ”Zq*¦"ì•TN„N¢û¸Fvf­¡:¢Ý~£Ž&fu|µêhûRG…»³:¢ûWª£’> à¹ulÏZCu´>€Æ‚”Ι¬¯V]?†ë7.Ëm´¸ÙðÞò›«XkjªÞÞ;)~ÖÆýÖFßÇÞ¨Cx¡£ÕŽu{RéDÉKíÖ›dA¶¥Ü|—ìÌdCÝ4:ÞèfȺùzu3ôd·F¼zIô-«U ¶aµ¶g,­YŸ¢Š±/R³ë"‘(•Qj/Í–”±kM´Ñ‰¼R¸5zPcVÇ׫ŽJö¥hÑqë#’¸½9¶£íYË»#¯:†Óâ¤mDúYª£êC=Êlä>ðÀ¯š¨À­ +Èmœyt㮡FÊÛ©uVÉ×»CvNåAÃQj Pš pæ %ˆ¶¤„ÞõÄ»à`„Š>²fÝõÁdå´Â€–‚6-Xcy•3jé•´Öà*«ê³PÕOÅ÷U•®vÎåA[OÒ-ŒUšSW)_€(Réa2gK]•­)¯è¾ž³³‡÷~swço»Ü|ÔÚhI‘„e5fyo§¹þÉáÔ1‚fT©ÕœùìÑáÍ7 k~Y­Mð;¿¬ïWÙm|¤žp s¾àh¦vúf8…‹@0àm Ct”Á©hº:n¨c³ÒƒW1$Pø3 ¼*ØÔdó0æî/ËmÁ@çD+B¯ãµÐF@Jh1ú„Q™¡FŠRÇ„Q3Ã@-›KÑp0T½«©J/ÃÀ+³B­5À«ÉÝ“´Pn½ï¸}5‹°“aïUÒd´ì‡`…¶IalPÜš\ËfÅRü\²´ëU1kòëÒdÓÁ®7ñî/Cß0P&윆zÈš2MQ@c‡ŽŠpÛž¨m3øáÇuð×ÙÅåêà×Ét…·ýõÆ¥ˆõÍ.x¢…w…2‡YOºç±Á€»ì­a„ÂÇû‚$ÿ{Y,W¿\eÙ ŽlHfN Î xÚÍ %]5”h+bjâc÷ç€òà·b4Æû~ð_ïçã«ÝcÉ&”¼H¹'–GXq¤{s0%|¤œ1ò¦)Q㬒’1CEA@_š(­s‡va¤d_gWèR+¬eXQ¦s2¤¦ž¸/Öìäˆa-u¤{ü{¯â(ÙÚéR!£W83® &lÊ*7B¥ o`EÆH”dÔ:¥ZÈ(©z´nÛ­ùÉLŸõµö¸Ô´®µïådæIG ×§~7I?ÐGòH§¨F ¼ÉÊÚHõ01Ú¡²Âz—êp”t–?÷¯šÍŠ¥øÁÀ¹´Ô:½ IìI8l¡,Õ.ò‹FB)åQ4L ¼Pë=FÑðü¢QÅdeRh Zºß‚ázHDåM·BiÞʤ„tÓ£–Eu¥làO¬f³¾üWª}Û¼”ÜÑîåû0¤‚öÔÀRf;JiЉ ®CgèµÒÖlÁŽªb³^ qáÞÙPfGRúB…f.nRYÍlÎ;¥©ëF´Ñ¯ÑP'Êκ-ˆa%ŸõrH+÷MãŽä0ö!‡Mj¥D Ò3Ëa°.Q’!¬á¨s©ÔmÇXòïMä·pª¹|hòSt­'?ín/Ó;2µ;ŸámOs,©7)º ‘­†¸‰EkR=¿·^1Ëb-£™¸Éʘ–*ëT.6ÜH•±ñî#°¶¤Ø.šívÓ@wŸ´â×]zºÉ6 ß8Dëúðy§†@2˪a§¸»ÕrY±”:ÎËŽrÕð¾V ן4@ÀŒuÞi÷£UÇ\òg„¹.ùóTýçö"éõGN®ÎÙ^ŸËµ9=9¥¿N¦Åòj¹*Î;èEvt>÷BKˆ†öuÉ{éØkJZúaD/¤&`¨X‡ ÷Âd“&ÂJxÚ›àÀ!³çéþM'Ç_æ‹ÉpKMdîóhº,:AD[MN{ Ò“-Ö9±#ÅkŒ¹5ÓQØý1ÅÊÂÆl‰mÍÛÄlŠq‡éœ‰#yaãúáÃ¥íK«…7r§… ˆÌøÑ~|˜,Oç?þm4«‚Î T¨ßÈÇI ›ðB‰v2x"%‚!y=©>ŒR›%ë ¦~ØlâÊi*rt&:cñ!Îùiï(²eµ×F¹Øzvâ+uå>§Gvå^+÷8¢vï(ÂÌÞXÖÑÊ@î© –³²<w 9´#wA3‚f}!Á°šôÓ9mÖ +ãúà¾uZM# µèØRJtJOqHMI .¤îL£Z>8ŠH 9?áuå'¸]Íuàèjþáê¤@Sqg‰H0}ƒbTœ-F+ôÛ+Áô0F¸Ó@1×=0()¤4L '““ªl§3À&Ó„»3Ùì¸1ø½vZKëuh—×lfi?Ä^©…uè™-¬Wä£> Zm}VAB xÑ0÷Y Óô³Ê>«Îª­ Y39za2Ck†Ö ­¯Z»ÏÙ».AƒNµ­o`=¤L5…”†–ÆëAJ’SÆ:Öˆ`LfhÍК¡õ…Äÿ{ŠÔ—•¡AßC¿J꘭ˆ¼+­I”ŒEJCÂZ© G4m‹Z«}0ÙRˆ2Z:gh¥•>rBª§Qð\P^…Ø6–2™áÍ;ÞL¹‡@ÅgznÝfèÞiîº-"oWúÜu¤+5úHב®ÈéêƒÉl3d›!Û ûl34)U2Ý{&^OÒÖ³‹nXI‰6SªzLM¯Qµâ-Uê…É\ª”K•2¢¾ìì Û¹â RX RÁiH½_Sn†ÖjH1|‚”›¡ ÷Èù:.8[À•Zûœ›ñªr3tèÒ;ÂŒíÞxÕ–s:Pi‡AJ&¤Æ«Î:„ œTiªŒ±üSeêø¬ìaöcië‰,8ÐÌüA“õîCóíé-³l—«Ñbõ¤éÎ×Þ¨Ý&Ú;¬õ„ÐV8jî—ZÊ+f¬ –zRX“°BEH”•ó+ªù¬îwè õV#U†Š /*tP±ÞC¹§NQÀDGš+5˜aiN¤ñqør HQÉfe»SCQyš+mÍ *žT˜> ¶å€—å(E#™¤°Ê&‚Ö[À hæVUα&CE†Šv¿ "º˜¦·yUZ`MiUhó¬ BGYŽ•“Ù¬ÈXñB°ÂõØäVDãÒ$O¯“Y¡lÔ +bÜb\3<ê((ç ¶Í Ê@‘â™…ï(`k¡ŠÔ»( "5¤“å€([ [ hª YÚBÜTÙ¦ÈPñ2 "ìÙHL£Uˆ‘ Â‚,Cìí,žrþ…‰RÑç4Ñg¤ÈH±[¤è4Ès4Øh€K±O\⋸`tëBrutð – m¶j+\z<,¢¤£Ï óÁl¦—a¸ÎIŸÊ ©Ë"_Ã:üO9ƒJÓ`œáèS•D`Oá¨a³z¥ñÉ ÑïÍÄ÷ë´EZJmîx®ï¯¾‚Ôõ‘¹¢¥9§Ê*P¼›^ði¢ª)sQ!Å¡Ãà­ íƒÉ&å ÔO¤V(Á ¢f­¯kS8™/ÆÅ‚a÷ìg€ƒ>Ð9ú4«1Éó³"JZhüŸ'xŽ%eמò6Gük4Yå ã mÿke0Oè<>ΧWuæ]÷¼;ƒYtÒfÃë j@éÖhŠP$z\Ò´¦|÷æøq㮎ÉÊ¥²ùRƒÛ2äÛž£?:·±ùEö:§RìQcº§ŸEá•6øµ/«QÀ %@J)ýÌG²‰ŠdY¦ŽÇÊ¥®ùÒÆÏo}hÝæ4«Ì¶UÆöл'* tN¢õ†w“Q”Ý€Ø m2Ú«”i¡Ûn¨2u¥ç³hãÔrÆ”SY2VqÓ5¬f1)§\S¢Ú?RNCVeÞEϬœÝ™ÌÊ™•óiF¸ïž+B1E5p’5Yä% HiDz ¶§¼M#üðÃM–ÅïÅ×bšmp¼N _‚ .woƒ×!‰êaìØœRÒÐÂÚ!¤ž?j|œ/W£ñÚ{ß=f„MÐxó~>¿ä¨ÀŒ¬˜=`†ñh¡;ÁšÜwMÆ ëhH¤‡D³íIð6áãÓb4[fÐà ̸ÁŠºÜpèýR@_Ílq$J^8‡”R›ø’rlOy›ò·Ñŧù?VóÅè¬È8‰#Õ™¡„Jú˜Vm-uìÇ #H…ò®†àDLƒÛƒƒGô\ŠÅÇÑbY,2zp¢Ç}!ÌÈÁж#¿4àŽx¸Ô$BFèDp¿œžËì¸ð›Ò—ƒ1\O¶†av‚†bb”Z»±Ž_.W_ŠYÆ n3ÃäXÇö@Ã÷afP6<·â(û–ü-(gÂí…BñŸŒ¬VƦðeÀ`ŒÐ`xÊyË ž²ÒyJJ± vNSðj-8Ñâžäe´`E‹ØKƒ†ÑRaä¶1ˆUª™€#¦1¸JÈÖ”·‰¿N¾_^døà iT‰bÆN Ý“H!ù•üÊFF‰ÂÍaÃ4CkšÛÄŽ”œÑƒ3q´Z_vÀóÅÕvè0_ó‚‡"3#Ynkºq/ä÷ùYNð¨”ÂŒœ­NCÍô¢ !UrÅÚÙ‡jÆ$JJFj)•5t΂/5¯Ój>+—:j#"£Ì“Ú"?Ní‰%°wšx*ÅžP¢{Ç<4 ƒ÷¤« 𢄉ƗÊW¶‘Õ*:sÓh}p£DŸ•(|êÍ¢ ä¡$v]Æ9 ©v§¹µÜÒ8‡`z€$'m>À3.Î';ÅG“Éé:™3ÀHÕlV.¥ù2©ošyx]†¤ý„$½#H²=@’×¾LãíKŽˆ”†iá}pIÞ«ÔòÀz~Hªd³‘¬)[QJ ‘2"í%"™!’ë‘‚ eÓUÃn#y_v‚M±`µJÝ|¢ß‚TÉe5 ÉÎÀ¤V&R¤½$»#@ò=’u>%¾ç™IÖ…DH«„HNj:Ý4ªm"ðS©šËê0’-?˜ŒÙDʈ´§ˆäv„H¡§Íø¤€Ö[^@Ò6–„ŒòÉi ÒÑyºU>nÁi«b³‘¬¥|ʸl#eDÚODò;B¤Ø"IoË ¾`/$I£SGdg´I3¥R)Ôl#´]Ígõ¸5qBK“2&í%&©Ý`Rìe"r°iàƒtQóÎÜ´’N±’‘šFMèt©õF"WòY±Ô‰(}J’6gdLÚSL‚®˜T¾žŽ®ŠÅÏå üs¶ÿ|ðÿÇ0Uummod_perl-2.0.9/docs/user/handlers/http_cycle_type.gif0000644€ÿÿÿÿ00010010000013357311727205032023106 0ustar ????????NoneGIF87aø?÷±±±¯¯¯­­­«««©©©§§§X”.¥¥¥£££„ßEŸŸŸ›››™™™Dq8———•••“““‘‘‘‹‹‹‰‰‰‡‡‡ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWSSSQQQMMMþþþKKKüüüIIIúúúGGGøøø0QEEEöööCCCôôôòòò\š0???ððð===îîîììì999êêêèèè555æææäää111âââàààÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊ ÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²®®®¬¬¬ªªª¨¨¨¤¤¤¢¢¢    žžžœœœššš˜˜˜”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆŒëI†††„„„‚‚‚€€€~~~|||zzz2xxxvvv#tttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVV  TTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷/NõõõBBBóóó>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½lµ8 »»»¹¹¹···µµµ³³³,ø?þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŠTL©\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©SœMÑšJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»a£âÝË·¯ß¿€ L¸°áÈ{Õ«¸±ãÇ#KžL¹²åËocÞ̹³çÏ C‹½W3éÓ¨S«^ͺµkµ¦_ËžM»¶íÛ¸íÆÎÍ»·ïßÀƒƒÞ-¼¸ñãÈ“+GK|¹óçУK—Ý|ºõëØ³k/\}»÷ïàÃþ‹_ @êøóèÓ«¿Þ=ò‰!ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨à‚ 6èàƒîwiíAL d¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ(â4}PX^gÁHÐÅDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜LÓãh>$™l¶éæ›pÆ)çœtÖiçxji¦æm¶fž€*è „j衈&Z晢¥éØŸŠF*餔Vj饘v¹'š?ri¦ †*ꨤ–j*–›6Ú©ŸBbL¦þŸ¼ðË©´Öjë­™¦š£}ÚÅ ®¸ð)¬à©Š’ˆiÊ X¸ †˜/à*í´ÔVK§®Ã­ŠÙ§~D;äHàéJãŽé­µè¦«îºRbû¯Š}úE@ä#®¼ $D¦pÌ*/ì2H¿ÿ<ðaŒ ±´:$#/¬+­ ¹/dÌ‘ ÈŠ$¾úò;¤¿ üd¹E&¼pÃCª E -ss*3ìð粫óÎ<[ë®gð&ö) I2‘ T@äùt1Ž,E2í4ÔCŠR‘"<ÁDªa‘(™óÃG™ôÒM?}ò‘Vc}p*o ϱU_=dÖEŽÝóþÞ|÷+£»j{Ù§1$v2yn΋MÆ·Â5âF~¶’zž8Ί¯=ä³]<¹äCîSÊ(ìá8ä/޹߰Ç.û¡?w4bò¶¤æ¯wÁxï³"‹’‡ç}$ïœ'ß$Ê. ¼ðh”3<‘Ï#©÷ìØg¯=›µsvûaŸÊ#Ë9r÷ÀNhBd&J+ÿ»ò¢P‚d%•ÉÆ$DÚðE’z§¿~û¾ë“Pæ­ø%)"È„!Šd@þmïŒà–º·™ïÆW{È× Tá"A/p…Ⱥ€Šk`  ¸†)†T¦p…]øFb±ŠS„@DÒ ^€ ŒƒHþ… V x ‰/¸FÆNçAŠH-D¡ ™´,Œe,x2¤¡ qH¤ü r3¬á ˜Ä%JðŒhL#’(ˆ ÆWjŒ£çHÇEñ H7«£÷ÈG ²ñ2n$ ûHÈBrg´L 3ÈC:ò‘÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡(Ö9ªvFæ~‰'¥æÑŽzô£ ©HGJÒ’šô¤ è0—­>m+¡â(JgJÓšÚô¦8Í©NEªRv²ô]‚³ŒF'%Óõ¨HMªR—ÊT€ö´¢?ZP+3TIµ©XͪV·ÊÕ®ô©¢²(d0Ú—ªFêª^M«Z×ÊÖ¶ò”¢aªí¦J³* ­nõç$Jaƒ¼úõ¯€Õ*XC%ÖÇ•/vM^…ÑjŒ@¨†ꉃR”¢–íe-‹ÙRhV#À, L1 eøó—%4>ZŠÀºöµ°µþé`AUXÇv/‰EÔb…Á{ö¶ž§¨ço\Þ ×·öWÎI·ñåÂn¦fNsèFpˆEl1hd‚¹pGÑÁ1…ºÛýîxÏ»Þ÷Î÷¾ûýà÷_hýž\OTË ³o¹ÄOd/ûkÀˆ5¨hÙÈ Xg5 t'¼èGOúÒ›Þô†Wy€iëu@‚]MbÇTä%Ø*,áW`‹/FŽ<|>ô§¾ð‡O|À§~뫯.§\:¸Ø_jö´Ïë8¼¶»eï€VAþ_üî{ÿû¨?¼½“ßbë²ÊTÐ>[ËðŽÈå àÐ>S¹þúÛÿþx?>âÉåÖ+òõâ|ÉDOê]Ѐ@Î0À‡çã·Ræ÷RèG€[²0 váp€ KEX‚&(zXO‰‡(‹7w'é·\µÞ  ia^1¨0‚x‚@„z—‚°‚´ã”€½"€ò¤4XÇ`U1­ S‘­ ^áX Vaë0jIE‚BX†eH„Fh(-(/1h'3ø„XÕipU‘{P{f‘WA • Tdh†¦' zþo@ˆ‚‡†üwgHèIJ/L¸QN(‡y ¨`[´ $@ ‰ÐT¡P+Tñ% WÁ ÑP°(S1K ˆ?8à0tÐhPz~Ðapw^0ö ‰|÷€ˆ8ŒQŒÇh†¿ŒvLj¸|x”–X,À‰Uš@ §à‡™`WQ™X%€~h¶˜w° /ÇPz€ˆwW=®° í`×oÀþIˆYxâ§‚hiXL‘(4“HT•˜l…p£ŠapT p¡ 8`éxëhvP Àþ‰Ð†0 `ð{u ðÐê=ãðÝØ` Q k† GpPƒXw ©0SP! z@pwÀ‡H0PwÛ@| u§ S0  ugÏ€ë î`w 0 íЕ‚`wUð â V úÈ–n —r9ti—xiwÖ°•z@Eâ`ˆm9ʨy—yiwa9–e9g9i9ÔèSØ|؈‘y5i£0 ÒД@ TÁ ì@-9+i½IxPz€ö ï°i€d àÀZ T0 ÏàËð è w þù |SÀ 0 , €u×°, n0 u :¬¥0kÙ–êP íS| ëùbð u ô0,p ï  u÷á9ž‘ˆˆ™ŸûÙŸÿ Zw,H Ù &Œ™‰ñùþ  °  :詞ìéžSŸòIŸö™šPµšBU‘Vu‘®éU{p&p S‘¸9,`}]p *‰/`}Tap­À 1 3àk8° ?0Á0 ǰÍð ÑP V° Zàâ@èëðr`øpˆ±Ú92€C0îÀ§PwØ0 þi€ S dP~`w ywl)ñpfÙ)p©6™`ww ¥ ÐSð| uW¿p˜1©•z©)©›ÚüðuwK™ùè–S@Û`©˜ª©u‡¨ŠÊ¨ŽªÓØEøÐ‘î4‘¸££gÅ£=ºU€|À B SA D:é€ C*Á@Ä@ PÏ‹˜Pû $À  ´pǰëRàyuÈ  M Q` ØÝða0ç ìðqP y xÐÁØv÷ u·ô úÅúŒ÷ Õ@;ú`-Pþw`§:ù`wŒ ª&‹²u·²Ѳ ý±¸š™»Šˆà^à~àžà îßNØÊêmÌzQÎ >híejMÞe˰pTçÀ ÿï `RÚpu(žâ*¾â,ÞâHWD ÂFÍšHá(ÅÛïG5=öO‹k ã6NSŠM(Œ ŽíM'’=äu#žÞGÝP÷Ý N>SE>(GþIÞK>'Mžåe˜8ÐVÚ`|°Ñd^R[.(]î_Îa.'cÞæÿ´¸xPåþG5bP;­—ç õæç}1çkQçqr焾OÆ ¶ô|Tˆ E b+ R†(ˆÎŠ®Œ'޾鸄ÈTƒ`EØmêÕéyòé¥1áTá}vá´â¿üÚ%©ðëÓõàøác¥ëoÄëœæëÆÎO(ÀÊKe«NPÝ€úÐ×ÑÞP¶Ž'¸Ž¡ž£þ&¥Në_`| JuöÕµpæÝžRÈÎrÊnXÌ.HÎnmÐ^ï÷€åJ% ÿ^OUÂ%æQÖp ÿðñ?ñ_ññŸñ¿ñ/ñhã•<ãT[ãOþPé ú€a¯%‰ Rc°œó2?ó4_ó6ó8Ÿó:¿ó<ßó>ÿó3¿ þÝ-µÍ¤rî›È*ÀTðÀÒõñðQcÀÜ}õ~WÛËzÛ°7Þ%ïOlÀvàaKåP˜N@õVõnŸwZá\€^ÿõüd˜(ÐT wÕ¿<õUõo?øÝ½DTá}Éuo÷ùtb/‚ЕÒÁàQ‚Oøƒ÷É>÷K¸øŒO0=ÈTOà  #^ßö–ïö˜ïš/‰œßù°ÚîôK•µ¸P Ô Q•¿úXßú]÷úûO ŽUì UvþÀ5ìûªüÜ-üŠ—ï¶µïŒÔïävðÆ TÝý• PìÒOýÁ?ô««Í­Kò²ŸO’@íXd¿PåpÆÔpþè_ýê_ÔìÐÑEà@‚ D˜PáB„hƒQâDŠ-^ĘQãFŽ=~)ñˆBžD)LK¹”wÀÔ’â.SlÞ¼©ÀNžÞàTèP¢EEšTéÐ_(b ÀPêTªU ëCKëV®]½~VìØ±;M‘E›VíÚ`¬¾…W C™uíÞÅ›×£ ÞˆéìâÈ]?ÄÃK“¨NW=ÄpüsédÊ•-_.ÚôiT¹=#þĺVôhÒ_Í–FúkÛÏ­]w¡ XölÚµ/€ÁönF´”¸æPò ø<în •šá9vnJ‚aíôPd €_ñô5ë‡s=ÈÀÀœ^=eÍ¡¾†7´júõ¹ž¶ŸŸ­Ûøý«Ææ-@ä¨è†Àà ¯ "$#ˆ9˜$QB eØð†(?Üç¸7hç›)qŒ:\ç)@¡g®yG›)V@ŸZZ0ç llê€%X€ÅaÖC2I¢Ú“è=ÿž\h>ý¦ ?*¯\?(·<@¿3@P%L> !/häàvÜxŽxä þ‡{ì°<ôу>zt'tŽ(ž‘ì¦;D(%Ú˜â¸lªÀ'›`™R((Ä%?•Ɉœä²T¤Ä2Õ°¬T5UÖL…ÕK3g¥µ®$Úñ©V¸C/X>øÑC<ðÁÓ{5ªPœtš¨ Êãé'g‹»izvÒ'P¿ERTˆH…uKT[EW+VÓòÕr¹”UWyçÕ蜠wÀ;hg ( y™&˜aB™ ‘I˜#ˆ1#ÅšµôYä* )òÑFK¯Ø¦{$ÁæžCzÐc pO¾L\aÈ}׿sÙUu]˜ís·å'ãÍ7眃€'þ2┆ó„Íàêzx¨qHÐV2¸éÇ`HA“§ TrÙvE\!óž.d@›>`˜VÇnP†{2•Y¶¾—g¾Rf¼U«¹îøpþ9ðY¿áÇg‡h s«bÌìJZ(Aðà©C›Àé l ~è°b'+Hâã“;èè‹Rtô ž!öˆ;ö¤ææÌïøîÞ[?½s/­oÛ]qáäW†·¦Ù¤ÁCmNvé§OÙ)÷jÿÝ5Üy¯owîEó={Ï‚¾üÚŒà€ÍÏ‹T„¡J §¾~ûg·¾IìÅ÷lûïSóÞÿÒ>þÅ…|ìC ^þòa˜¿ooЋ"b!  ô»_5ˆÚ°5þ i±ЃV9`UØ å‚ô¢„p# kd¹ özP#/C7°*X1%<ôaãD%ÂeˆGD‹ÑØ•$–q!Ltb5R Ê1%qˆ0ˆ‘†t¡%`c ¿EF7VåŒk‹©•6²!±c$At |çx„^2€‚ˆœ`'ëC 9ÊpåoTûs$C¹HÓà,¬$K#SY8JÒ–Æ€ÂP¾DÀ0 ‚Hvþ’‚?F”Ç,åffI•UÂò>®tf µ´L†ÔÒ–‘¬à3ÌŽ^á Œˆ°,†D”ÈD§ÜL9.TRó ÍŒ&-¹HYºÓš×”#%7€OâÁNêðEc¦Ó êT¦;£”•xªežˆ¬'5ïÉÏÞ ß0 ªGh`"hØ '%b’ŽŒÁ §@iJUºR–¶Ô¥/…iLe:SšÖÔ¦*Ç:WÖN…žÑ|è#ºÌ‰R4…ÑÂF‡g {(a7é;DÎÑ -ˆÃ#ÒÈ@VµºU®vÕ«_kXÅ:V²–Õ¬gíê.¯×S…üÔ™AEãPgYT£²°‡Ê—þäEÒ¨HB: ž £®¥[âVXÂõˆrM%]+<# c'’˜ìEq¼‰\!=±C2ð‚Ì^3±ŠícYéX"BÖ‘’-íÏ0µÒ È‹p ‘(,"ÔŠ+ú ‹âi"¶’<­bU»H֒е…„íqé…(b®å{Ádƒ °vE |±J"BºvL.[—‹Èæ†ð¹nŒîyk…jdJ8†+àå 爈&vòƒxe ¸‡|ã˜Þž®wíà{Ë_‡É˰ 1hAÔð¼8D6~8À+|ÄF…›È`…:þŸ„•HaþHE€˜¡•—è4gÖ€A^ ‘`‰H‚|PW‚:”³Ææc±;]|DOÆA¤ñ“y“„¦‰[E%…·cìæG¦ÀV¾€kh9Q¦æ”‰Xeî]ù„Yv3mŽà¨4pƒ+†€ „ׄ6àeù°H#ø€ h¥0:È3ûà¼L9“μ³³ñi½áWnGWÊPGéž"‘À¢'A‹J“ÓÛô,+ÂKç.ÓÜô«ïBŠ€À+@à>’€¸Ä/F PLx³ºF\¬S9kÖzo·æ_®¡Ý’|xâ(Å|°•m ˆóÆtÖþåÒÇA…,ä=oz×ÛÞ÷Æw¾õ½o~÷Ûßÿx½,mGRûÖÆ¶Å§ím§D €`‡w"YBd3â°1» ‚µ¦qhÂ'GyÊU¾r–·Üå/‡yÌe>sš×å|ÐïNQûN†64Ðô¹Wž=†7¼%F @ pø‰ãÒÀÑšq$ê WG ?rNðBü{ŸÙÐWt£§m #t`Ø@p ^ØàE0Ï#¹Õ±¾÷¡h}­;¿JσžH ~+b·ÙË~$ìÄØÂ`‚TÁ``rL¨®w¾wþ&~×àoø²þžôˆ÷›âÿeàgp²“ó¥kÜE ð%ЂÍ{Þ÷8ý)EïSÁ“Þ+`‡êë¦úÕw¤;á}…ÊÌÙèýï|v±Å7þ3_i|åÛŒùÍ߈€ðNµ‹4àÏ‘$ЃtïHÕµ¿ý­óT¹à?u1=Ã+¿–9?ôˈa|Pöé20ÜÀ½Ð¿ýó<îÓ9ïK- @äc—|—D@‹8;àŽ↻X£ñˆN€£@γÀƒÂ@®s#¯ãL,AŠ`‡Ð.ö‘½”À5‰ÂX‚¼+ ’8’)°qtx›¥Ðþ‰@‘Aœð'à+k° ?h‡0оô?õâÀðÓAtáÁX¤THØ ²«D¸‹Ã h(œù㈠Š_áƒ:˜‚B؉C+4Ç€ŒˆQ7@‡ø…¨Bgñ=3ÔÀ ÀV¿Ó›¦áóA8Œž1êK‰Ú; æ(ðC¡8p)°ø ê°ì°‰Ð€b°ƒv0,IŽ)¨‚‡ë€€›´°‰X ƒ)7žàQ°‰bzÌ{T|,}„Ãû²‡€4޳‹uP*˜ Žp†* …Œh> |„ˆY”Fy”…€Žœ‚\x‡ÑËDq>8›À†aHÀl„(⢛|K«Ìœ‚ÃLL›8½»KG- ‚,° ²ù‰mh‡ ÍYÌ„xì¿þK´Ê½ÁJWéDÑãÊ(3šƒe up„L RPX°_8†hØrXœ8·‘Y(”ié É8Ž{°‰¤ƒÉÀ¼‰€<¸‰G˜Ä†+À†Ðq@À¤Ä)àNï´ ðÌNh‘j¡Å)и‰ °oã‰@Í¿«Ê44¾ÖÄ­„—7ÜGÞø)öÎ’ uàÃ8Ô `‰‡4ˆæô‰?€(‹Á¡NЛh;ðLíô›°†\ˆ*ÌI07½„œ¸…Qµ‘)ÀœÑŒ±-¸n°‰øù .Ђ*\ªþ¾ÕĽݒØÁ[€CP¡œC‰%0Åp¨…è ˜D?Èw(‡-ˆ‚ùkÅ xÑB„¥lÀ­áðš·ÔWhÿœ‚¥™I¨±‰YTˆÈN°‰-â‚{à‚C, $@XÿdTGH©ª±›Èš­éE0JUÀ0K©qx7ð–©LÍyPÒ³R*ÁR(ÑRä0uC ²l bdH‰1ÉVtKÌ)PÀÔéœÏÑE+xËh8`+°‰É©œ›¸|¸† ¸‰[*À9Ø«4Їm8˜×r=×›€ÖþÐÎñÐ) ,Ðqx ÉP„iÀ{ÐXˆ\Ð)ÝUÃëÕvyMÀ Öæ›‚6)BÄɆs›w¨KÕˆ:Uõü=)‡o‘RÑ£Ò™©XýøÕ›!Ù¥ H›":˜Ð“(ÀB‰YÝtV%™Œ|}ð½78x9XpiYÀ{Y˜‰Ùü˜YÿÈØÕ¬•//@ƒ”&Ø(HH%ñ†à‡Ið= (:È4Ú\ ÐL<¾¼¬í­]<²€‚‚a“ e˜…º8°>8Û仩ݹªe—«¥™‹Ý9¾-»ß Cö©„œ•ˆah!„,Y·T\Rb\þÔrÜtÜúÐÛ¿©Y› f6eE Mø[™€cýu‡¿Hº ëCÑ]A*Ýÿ³Û®H]úX]ø Ü†³¾i¨°$pƒ)@‰&XŸÕ¦ß ^¬^4,^ñ Àä}åݶEEè‡j¸¼¨€(…R¨†÷}ap_ø•_ˆøES…üy¨ gø»h>°0µ“ÍÞcÚÞ›ØÁ;^¾‘\Ô_hK ˆ †ˆS€æ`öÜÞàˆ8‡øˆ*XƒY1€Ë‹’(ì]`ƒjà{à ‹àÔ_ài]×Í Ü„ .aˆhÖ b>â!†ˆ2ñþ5Àº@ÜõW‰hÌžaá¥[‰íÞ­ÈaÔØáÖ¨`]³,?úˆxßR˜_‰à`Šˆc&ž€EP(xÙ•> àîbdªa)»aŸãÞ™`Å:cNƒ‚ÖéXŒˆã9Vb9¦6Fø@ƒ©k f(„Pr²D€èÃ]¸SFåTVåU^eœ‹X—-ä†:dÒ(ãÏXäH[ |âIfâ‰d#>‰(3‰†~˜aº H€D`æfvæg†æh–æi¦æj¶ækÆælÖæg¸3tà0ÀM$ÀDf«[Î3òm…ˆdJ®ˆ_þep/‰e0Û†gþp2f0`±ôaÚ°Á2:]t™åѨåñéá~® OЉôõE5nûuaˆ˜èø­èü-RÀC)«Ê qR+„žV¢€n•rî)sv³,N )ð°”H‚lj#(bŠÀa&é’öfgyÂÛ +èÎpi-û e…0¡‹PƒìiŸVÍXŽ'•ÞK„ƒžê8>\ö„LJ dX=þß ®9|ç®– “"”Ž™¡ö¹¢–‹£®±1 ZùºƒëÒ Í#Œp ìÂ6ìÃFìÄVìÅfìÆvìdžìÈ–lÄîæªj¬V »6 ®vkQ!þèYè¯Pĵˆ0ø69¨…×†íØ–íÙ¦íÚ¶íÛÆíÜÖíÝæíÞŽmW=]½lºn(͆ ¼V19|"zàd”x”¨†}¸cÀ~m‰8§@£AŽ3«*âŽ'ã~ ä®° ž„‚†Zh‰)xÖ#°CŒø s˜‚ân/~eªï·ïh"oâìÎæˆ¦ùÚ·“ˆDž¾ˆíÎï ònJëïÆúog ðÿp׈й\ó‡‘%8ÿ½ˆ"ëÇïïî/†åáç¼ei…2où2Ô‰nJGh ½ ‰~ì‹Ð¯­gñû™pY«þðÕºpXÊpª¨ñóªXjxH 4ð”`Xàl#?òúIòi[ræjrVzò%Úp¿ë»^éÚQ°çìžy€8·1óé)ó‚;söJszšq{js7¯B¬Ùˆ†÷=…Q°óA‰p†S p⌘ò*¿ï>¤?ïº@°A‡¨B—¨CGô‰È­ˆRˆ6YùåzÐå“8öˈ XÅŒ0¶ër÷t1õõ#u¡2u¢BõTSjŠpõf‡ˆ$øP0¥D`h… faÇÑPpªökÏŸ:HH€ÐPˆß÷=paþPÝ@‰XÂÚ¨ïN§I(àåîaèb§²c«dŸ«egva¨àhuˆ8I`ˆÀ„-ˆI 2C¨€ˆ¸€Zãh†Š¿x"ƒ…€4Ðm딸ƒ!ü@ÅÀ v¢H„òЂD`ËÁŒ{ÀF\Š}¥ƒÛ tqþ†ñïEøÈRxf/Ó9¨(…Tà’MiãSàqaÈtˆ(ÜIy«wô¬ïƒP…N„rúe(mQ‚uHAŽ€P~ €V˜wx ³9YŸWŠFx‰x88†J,úÆ%ø93øÇJú×ZúT?È‚‡†:ˆÿ½‹p‰xÃþˆÌ¿bÈøã^†ˆmÛ“˜‰(àŽ@â™'ŽŽRÛ_Çv|Ç›°Åp¼‰*øqÐ+Í)È}w„ÇåhŽn”ŽÇœ1™ÞÇEm\~èhþñ(óPGvDþ›ØFç°þÿ îºg̠Ƈ®Çwó$ °”?:†˜{Š8„¬†G <ˆØ|aèöaÂ:(hPàƒJPtEì 0PÆ R¬h°A-‹7n¬Ý’eÍœ<‹6M •k\ÎLiéò¥"0R¤è@Þ”|¤°€õNÌ·– è aqí¶–/ c!€7:yúÚò‘M>t\‰;þÔBÔ)Ÿø„›2´èѤS°ÐÊÕkKzº–sgÏŸA×fÝÚõ%àÀ‚ù=<ˆ%@—ÄŠ3nìø1äÈ’!ëCë2æÌš7sîìù3hÐPM….mú4ê`&³níúuc 48Ò®mû6îܺwóÞÀ\ÅÑP\Øhƒ0#T¡)Á «H¥ÄÂ`")B %ùòæÏÂAE¸ƒ€X‘ µïƒoü讲"·¨ú÷ïO#ØeLüá´M;4¥`™¸t‡¥Ä@S¼Á‡ -UñKTˆ ‚-ÅôÌ€ƒ x ±`ƒFè! ¾Ë”BA!~L¡!MþØbˆÿù8Xa‘EÙEe¨)¹$“œÖ$”Qr¦Ú‘UZ™lñi¹%—]ziÛ8ñåAבYÑœY&fÞ`Ô1‡üÐBKè±_ˆKŒDU(ˆ²8G``€Ga$º¨~= ¦€­@Tú„@¨¡–ŽZ걺DDC^yë­IJ¹+¯™=Ù+°©­†+±Uf¹&²É*K¦ 䂬›Êb"J|åL°ßäÖÆGÁÅŸ7±ˆZt#XRä£a@.-õF¹ç 6¨ˆa½”îºíŠŠ¯K÷H‚Íþ=‡ô Ç·æþ°¬±ÒjbÅJ ›®ÁZ¼ä¯k<å°{Ìڱˊ<2ÉyÔ™¡œrM "ï‘O|’0”Û»%Á5[ôí'ð‚"mä ßx$Î - ãÆªS*¹ ºŠ"S£G.+• +€´ÒL·ô‰M3‰2FK ÍŠU¸ôtÔSWM¶L)œ=6S+¬ŽÝôÒMÓm6Ú ûø°¼øcoü¸gCþ8•Œ[Ûl%k¾9É!Ð ç¡[†:º©’@nY0“ðí ®\@¥‹ÚÑ Óàc°” üÐaTVLÑÍ gðcñü¢þˆî¼ûÞ8ûáa@K^è·N./<ñ_½~×'ŠN¡ñ ±‡‡Ñ÷^*ùP™oøˆ dëåù;>9ÿ—IÞ¿Å*—¿ü…Lt< oXG PK¨0ÂæˆÑm䦨ءžÑ¯ƒü C(†ÙOø ãö@Èýo…½ WÀÒ°†©aÃÜ\! ñÙ%v£Ý AC€š^7Â%2±‰N a OC©Ð…k¡¥Ã)zl†;üb€<€Ñ6ÔhD|LÝô#>°"6»'Ò±ŽvdbÇʼnU1‹Á¢›´Å=Ë‹e<äæ´€2 þrYO(nº°†!ÞÆF) 9Þ±“žüäòHH*Z&¤)•4ÈQÞÊ|¥²Ú€(ÀÒ"ˆÃæîÜtÉ@ÁIP³˜w%+‹ÕÇTJ •Ì4Í*“i¬ÌÕ²šÈ2ô$k äà8A2jhK€*†iÌu²S„È”f®JùL`9sž ‰&<‹äJnòs7U€û)?Xƒ7/`Ķp‰J d &E8ØÎ‰RTVïÌg•–iOŒ€4]>1úš} ´¤´A°`ÀI”¢33ró‚IàÆÞ¨‚Aâ2 uV´§>mÉEEZ$~ôþ4õ,êfB*TAÔ¤N­M> Ýܤ(L¡¥Rð¦›ÜMLuœÞÆÁ8P žþ´­í êR_CT¤†æ¨tÅŒR㊥¦>µ¯Ér£® ¤ ¿Ø*o! Þd$Û&7@† ¦–½,f3«ÙÍr¶³žý,hC+ÚÑ’³|ئ õ¨W×Ìõ®‘ë¨kK“×Õ:†¤~õ+XZ‘›R4á Œ†,ruà`D)P Sœâ „=H> ¸ÀùÆxƒëâÆ]À<¸f€¹B-Ò«Þõ²·½î}/|ã+ßùÒ·¾ö½o{!1ÚRLžþ±E]];[þ.ƶ·}*‚ܨÀ"O¸@Pð €y‚+œKLlÁ ’¸Çšôk›/¤¸9Æ(‚˜øÀ.®ˆ ™ÖþW3¾ë€eÜ¿X œø\n \N„AUø„APvc’"2*”Oaaˆ°’©SÍ@|›$´µÂ`Y{,æëØ14®1fnLעÇbæ& 4¹[jX„Ží€xâ‚<× ·  1èÖÜœà¸aò–9†7Yµe6³Ñ\WØJšcžŒ›]ËU@¹ÑÆ ÂŠ YÐR $à ²ˆk DÐ0DÂc‚7ŸþP¨múpØÛ AÉyp­éÛ’ùÒŠ9³¤ÕŒT68ÓÃnä,PÝŒ¥HÁ jmPÁ±@+JŠG´¸¥ˆ”A'å0Ç9Ð9à(0€›V±"E@ž}àbI‘®ôk= ðÌ0›¿ÎÖw142Á×Ê‚À4]wä7-¶z[‘[÷+¿l4+»¨§íÁ?¾Ãd »_J F&‹5ìÆ‹À.^›nlÄH„ÊŸòK¼Æ%ÿèÉW›ò Óð)lð’ʬ hˆLqÔ$:|$p·6Uh‡Æ+¢À XÄ 8;ÚÓ®öµ³½ínþ;Üã.÷¹Ó½îkGôÐ]ôÿ}£I×ëÒ™Ž@o =‚¯1Ž1Ûäa¼v&üR¾ò–¿<æ3ÚZ9ºß‰Ù{lûnÏ¿Ç5ð‡ë\ÇÍ(lCƒ¹ Ä9è¹(Ñ­¶g'\=ïïOZ༧é—júÓs.pF?ï"çf-³P q4`Ñ¡LPûÛs”¹÷<è]+úy_¨Ã'¾æøq“˜>G&ÁPÚà·Q‚9J·‘G ¹‘h÷ }_¿…ß]ß3•ŸHúŒ>4àÅÆQmÄÄ lŸn  ÈýÛïù ¥… þbJ ²@¼ƒ@C(èÆ#x²ÀEÈ€r ºjå]™ ]! 3•`> " 6tK5ÍÁ⽃ºáÆ5G$BŠÙ†!Ì G$\RDÍÑ~áy Ñ`úÏþ“á™tAœXS2èÌB D@8Ð`E`BÄÀm Ò @ä ¢Eõ`ç–¡¦RJӲᗌh5eÂ(dA h‚ €>ƒõqD`¯íáA0m¼ËYýŸ"",Ž"ê^c!R=¢)Eb2M"%v‰:X“;`f´‚/ÕÆ;ÔÆáÆ  ¢þ@DÕ1b,Nã¬Ì"-.†-.’.²/öâ–¼A‹X“C`Æ \àm„2èƒÖÑÆÃØF=xÃâц<@3H#5N£ê]#†à6úQ7ŽÒ7‚c|„É2pS 0ÂedA¨ôчm¨ÃBÚÆ>8@Y@4ð#`T0@?à?þ`@þÞ@fQAÒA"än@#7 BЂ/HAAØÌãm°ß™üâZ¹bÃ`À)ŸŒd÷•¤ŽeãG¥¤­äµ¤KæF?075 èÖmÐCØ4„mÀ(ÖF¤”GÆTö€>”K\Á(ƒ´C6ÈBK¸%\Êþ%]N!<¬ƒ,¸ÃKl, À€K&a¦Q¾RʘRnSºSrTFåm¼ËðS°€„m0> _mT@,ØF7¬Ãw܆%Â+È‚ ì Ã<Ã6˜ƒáÄ= >p‚KÌÅ=CKø&p¶È]P…^´D\Ì,Ô…rÊ]ØÅbV#ç]#6ž$ïEæ MæU¦eÖÆÀ®YÐþ݆4Üä[mAáF9 ø‡¬„Ðå/hAKˆã(ôf-Hôçpþ'ŽH‚´ŒÈØÈ$èŒÔÈtRç~YççaçÀi'qg yçwr"?þƒ§á™0ƒ3„2|¬A"B€ìAÀC ø‰¬|ÀØ ¤†¥ì‡«œJª4Í)¨J„•5RècÚ†ö†¢‡v¨F b!r“ ÜämØÁ!؆"|mˆÀ ↠xŽ8œeKXƒ7x´ƒ LA\`@`Ôi`Ô‹` Á ÂLŸÌÁÎt6&Eé“¢N£_=*þÉDj?Ý#ôÙ†2ÐÔ³æ1DÖše¬h˜LÁ2@…Ÿ|Á* ƒÐA4LBK€«¸’«¹æÎî¼Ïù¤Ïú¼+¨û4©¡ò×°2S±Bα^Ž£*ëA0«5ñd™ÂÙƒ&äÆ Hdd‘©6)Ië5æk*í+åt …þ+À „ÀV<ŒÉNêƒц4HmHÀàœÁúƨb+Ä"â½ÒÅš’ÅnL¿ZŽÆn¬–r”æmdA4˜"GêTîT5A<­FhA0àC6PPGœÁ8ØÆ§îÆ9@6,nìVÔì UíºÐíKîvÑÖr-²Àä‹Á€ÜÀ8PÀÌi 8+D8ã°/GtÂy „ORoõNÔõŠTö®Ðö¾å^ãîb©BZ“4èœFL€*dF Ã”Q„ÀoEЀÜÆ8¤ÉÇ8ÂîýFluþRèî•¡“œ!ïuïÄp‡ŠcGVÓ$8m¤ƒ`.ôÀ‚Y„5´àjÄ4ƒðr„ÈàA ðÿUVi 1±ñoÞ„B©…\ÿò KŒ §£5a‚—n1¬ƒ\F)ìÁì™ÄA CXzež¿1Çñ}áÝ"`WÚïJÒ÷‚®˜í‚Ð#HÁ óÆ|Um@ƒ9lîA`®oŽ&å'›ÜË[¦Ó^k-ÕÁm|@(ì|—FðImBªíUDÏF²æL²cV2É]2Àe2®lrTþS@ÁÒ´Ãm8´C=pDþ ˆmŒòn‰Cõ1,Ÿ‰,*--W.·’3?ó–<ÀA5Ã³ØÆ7à2n< ®Eœ±EÁ/Œ%D4À‚6“L4ãë4ó]5KÚ5_‰.»$2lÊ› ‚—0ƒ9¨bmøx™AH¬Â£Ù>[I?»ä¢¨ó¡Á!k„3Øß¬‰ƒ#[ÄÌn€%E\4ØC/KDSíD‹_EרEOÓK# À„ÁÒ.ŒîFÂxjèÃ:r®mÂSD»PKN'KL¿íL`Mÿ×MIF#$:ÀÞ" <ïF0Dr6¼GÔÃG[„:øGüÀ=þ5²DõãNuVul]µ‘d58ÊNó2Õq1X{ÒFŒìFøŒ´Â54×ñ‚pûÞÿ/-êu/N„À5¸³F„C4r(LG@Ã1ÒF¦ÖF*U„ÙÙk·¶k¿6löÞc¡coFk‘dëeS¢ÁÌ+ r#Œöðje—<¤5EøÜÕEÔäɱtO7uW^4wâxðßvšÙµ€í¶çõ6þ|Ó+$܆JWD@ðAìƒYÓF ìYm PnðíevÓ¶vï/åv”àµ>e³b߆,@9÷Õ â\ðFü@sGCÄ0@þد~ÃXm$w‹ dc2x÷›x¡ «5’ ,uEÜÃEj„¬j +4E”‚A×°¬ox[u8EÈ5íÒõ-z7Ž•¸±8 ’$ö!ï_s„"”G|Ã;Ì_E”m Â3T8Dðµ†û¸'y3qˆw÷ˆß2’_š’K &’5R 7sÉ8¬ƒ— 5<Ým¬h[Šù~÷wjý7‘k£‘¯Ùš?Z›7 K»t_1ÃQS„1üBŽ[Ä 3G¬7Jiº »™/±°úR&ú²-z™5:ú%-"ÁƒfWÄ l)DŒP]Ѓ—¨Á:|zm8þÈ[…zEzv{0€÷€C  «ŒØú!BzÓ¤6DÀ€ÐÃ,˜€p„p:E,€â†Ó¾lûD!»+»©C&ª›œªëX´ŸÞ=ÈÅ+-ÂlãÆ'h4@¤ (mE@Á:”íšpË4û‘¸°{`¸{¡Ãû™›aš[s½·™8Y^¢_aì #¬f0C¬9°0DA[3ô€ØÄ»ÿH€H6Œ´ƒ§¸„ D¼Ä¿Å 9öÆ»”Î;Òm|³u¼ÇsÄÀ:43ÜwE8BVìBf$€9¼E@B9qD d}n 4› þ%QXˆÊ¨ÊлDѸI^<-4» 1½Á9ýÓã0?ðCžPˆ4G‚yS„Pf@€8ÄDH=(2;êdnxD*ÜüK¤åZ¶„$, NàT„È6ìˆÂ¨à@àÃìƒKìe_þeK€xƃ>4î@lÝ:Þë=“<;lÜûé­ÃŸ#Pþn@\Æp™R3¬ÃÐF¿ÛÆ›Çùºnê&oªèã"è@X@‚ø³B ”ÂŒ è€*¤`Ãqæ…Upš>ÔB ˜ÃÀ“î¾Å_¼ïƒ@Hè2`Aƒ&T¸áB 4„E”8‘bE‹1fÔ¸þ‘cGAFÄMH“'9¢¹“Ž0×´Y4"lÊÆCTfšdL3'ÏžE›&…Ê5.g¦$UºtJ:²¦üÒ¢yI«¾Á @«RE%} Í”míR¤µ Ó”ª ’VàÊ”n]»wñæÕ[7 ‹X4<˜paƒÁúÐR¼˜qcÇ!G–á€s™{´€åE{?¹£8oZMXa¥^(Ö_!¨Ö])Ž,׊+î5bˆƒMÖãAŠÑ/rçT$£?Àh:¾Ùi?2…$áb¼µsáŸúç†%zxc_'ÆXiÅ.^úVžµc’©®z"xÖj‰(!e#w¸A)8̼H‰NC¢- #£o…Ž[î¹ó"Z$ô¢ž5i§+nšo(¡Î›Ê©·.Üã8xÆpaòÉã4EÜɈ™þ42“¶@gœˆæÀ‰·}¦[ôÑã¶[£Grï¿uõ›õ%O?¯]Ë,@Çv"X##¸€£EÔ¨‘CªGåˆÐI^ú„MG]öýV=J×µ¯/öë×£}÷ñòMp5d@7 W…ulÎȪ‘ÀÂ$‹°ÁDF`™"p€-táR Aþd¯÷a` 7ó@‚F‚ô¡iÊuÂE¡¦i‚Ž0‘&L„øËÈ0V#L£Yþ…e2ÀÂnQ€1ÜázhˆÃøÜPŒ”Ñá Óî$³€!Øø `¤Ï›H rÑa`q"jvaÊõŒ‹…  Ñ8š0–Ñ=ddddΘȆ¨‘•Ü Å­)biÆ>2“‰”Bäˆ>‡‘28$Æø…*ò ˨†´åè)IÐ,ò‘šqd/ñó]††’–4¦E$q™ÂõÀ9Â)žQ“¨A>†p†Pã"CXÞGöð‹$RÄàƒþjyKu–Î/E2à0 ÃK`Væ2óÌ¡0ái%ÿ“ŸÀÀ- €byéÄ(*‚ ,f ,xÇþ ¦9‘ Dô#Ȩ1•Œ! ŒðèGAR‘Ž”¤%5éIQšR•®”¥uE;aõÎ|6Džö„Ì/mJ‹HÎÔ Åì'?5¾@)Eñ$: Æ(â ý (Ú‘1 â"U—F®P ­n•«]õêWÁV±Ž•¬e5ëYÑÊU œ‡§ñL`NYO¸Jf§mˆOjÌ)À [ƒ&%DK(‚ŠÉ)ªñŠ Á (  p6XFyµ¬F¬gW„Ôt®‹Á©MëjW¼^–ñ€4¬¶€}^$ªYÀ+²WÐÂÁÀ)òs ô#¼­È¢`Ò7¦š¥é[þ;›™ÏÚ3´m-q)X ®X­Q¼HÆY‘'¸7)€ºÁ´VF€&G3ŒT€.t3kÜ‚p6¹ËgsyúÜ÷Žï„{ð_‹d¡ÙÃâq‹~IÌ!Ja$!hˆ‚D4`™–í—´ñ•¯Ä›\zÒGÄÁïLõËáÚ‘ö«+hƒ-@!$w°‡p,’;°Ò#G`E¢a;€aÞ° Q.”MÅÆôð‡éÛYûóÄùLq“ G •jF nA2E`ÄOÀÈ=ñ‘$v"cÙÎvþ‡eK>Y¾Qžë”{Yex^YÎU eþ ²#¼ï"û@­EFp‚‹”!ù†E?V$ öàG¢ ?@* ‘õ¹>³‘ÎÆµ3\ñüH=“Ï£™¤tï¶HÔ[‘V`â"j°ƒ@"HWDЀcn°xÍÕk,µfOÓT3rÕºlu³“§rÍdˆ,kÅ’ ³"-˜Fv7Â&WDPÞ°EcqÀÛ|¶]£mÓi—±Ú’¼v½¿T>Èêy·„Šj…ÄN5 º5‚ rðØ"ÄW=Ó„w ™q@r‘œä%7ùÉQžr•¯œå-wùÈ%\4™~˜ ù¶ç¾ÅØþïDþàZbrA (¤#øX7bN\Á"JxÇ…+2r×HÀG°á^h­`L,P oÉ!­e7ûÙÑžö´££ã›9Í»`óyâ‡:G#Ï{Ž%UdH1òн5#! 9tE$‘Š‹dLïHØ8²=؃ŠéC¬!o¸­“ó@ûEÛe÷͆¸Ä7•kéc÷/â=ïâʱ˜FÄzÖÂFeͦ‚‹l!#4¶ˆ:êᑃfÀh„p}Só¡ëüó[õywŠþ r&Ýk¨ú²¾õêÖqƼÜÖRù‘2 ƒ¼sÈî$Üþ3{$UìÈ G‹:âÙ<ô0H¤¯¸¨o¾HõûHûdˆûº/6¾Bà áDÞä"F ó&¢DÀ"2PHN äAn#˜!$è@ôà 6ÊùðÃcÝ® %Cˆ!Èp5bQcèŠÎj” *òO"V ÓÎ Š#ˆa!$XŒÀ±jÅ0Aïnx°æÐ™æôPˆ‹05,h # ŠÁÌ)ð°„l­"˜`,Â6‡#b há †@ I#Æá΋#ÒÁ2ÖÌÒi 1±.t0ôÎþ0îÒP °{Ü|à0M£àî ja Žƒ° dK²–>BЍ" `Ã$â`1ü@ n¡Ú‹#þ/•1)6Ñ ;Ñúz)µg¯§Mñ$äb;¬àÀ÷„…"1"jÁñ(Z°"œ(bàa1r Ü M.b¶Á5B@ŠNlp3±OçíhI_‡eǯ1$ÜÈ’0Á2faqª Â#¡øž! c¢áÈÑ"b Mb`¤ª寂~Ä ï­­’‘ ’u2ur!?bàaœ”àPÄÀc +þVp"X¡»&‚Ü&ÂNtáÐ6bÝ@b,FU’)ŒÌ2 <ü Â`)Š­%]2a`R ¡ì}°&ÿæ&''uò$¬À2BòK*¡<"È¡ÿâÀm*bî@ l4âñ$\ä+õNÁ´t Øõätcè´N5"\joX,Q"”!¨Ò¨² H2$´! †Í4NaR\àH@ $¡¡¡ âÀÎå.N$EÒ‚E\Fdh„25õG €–€¸BÕ.>ô ݇àTiR5bV•U1¾MX.Š¡"ÊaQ-bìÓ".`úOW%¡\3 ï$Oö¤Oþ$P¥P%Q¦`QåQ"eR*åR2e æ`ã` úK Ê•.ΕÓµ†ÖcÚ•cV ^=¦@÷†µb©`…AN†" À Ø#¢À (5þ’`*?ŸÐ`ï"\<‡\Ì%)Òe]Ú¥;’^ä…^&_öå;ƒ:B–×-ë,DQïd34 ð]Y¶".¯ˆ%€”"‚"”á¢* Ö@°$" ^ÕlŒ7O´á `>‚?»vF¶K¶È–bRöWÐ6m'ÂøzuK"ñ ¶#rM"pL#†`­NÄNä" 7+×–—úWwW×W"Wr%¢]âvKŽÀ=ëá(â@à¢êRÂ`¸)#$ä%axO`€Í# wuY÷k»SlK/vuev¥femWX®Ht·¤ P’#à^•®þ*â¦7#ê LÃ>7"œSx¨Wu­—‹ZWô^·{¸÷iÌ–új7|÷¶¤x5# "âÏf7â¢árA¢ ¦&‚ø€z–1÷—óúîþW{ØV¼WV ØvÑ‚RXö± ×$”a .×b·Œ@ Žá4Œh&@}ó7„E{IµTðTK/…«d…%×Üà‚¾„G…a4€"ÁfSG…Af "Æ€° $ž ¨Ò#Þà+"Ð$ª×ˆ_h„R{K섣ĉ|Ã÷KÔoµ$ðW#¤à(…¡ê‘"ˆáx'âd`Ò€0ó#”þ xq"ZãmSRŽÕ‰ŽÓR‰—Ø3Qu€EŠ%×e©jKÜF‘a*¢Š vÜó0 É >ø#¸É‹#B 쀎v?õ—“ȓÔ„‰KL‘Ä”Óöà@æâL"Zk ,X†ãhÁl †×™L!Œ/"N2$âØ˜‰ÑÕŽE ‡”ášY耺%K¤*Û`#΀ (" y^ã¢àÀ£Zá „È#šÀbu"˜f ·£Zª£=ú£A:¤AZ à™då¹¾˜YÄœùHð™e‡À¿´DLa#ò`…&7 \ÓË@ £ þV`L œ=.g3â¥ù#²Jí”z©™º©ÏŠ 0ž•Ù³R:¹Vzvø¸·$£µ$U"´Á•åctê.fë \! @€P7 Î`á0𳟵úcØt¦Jøuè¹I®z?Z^ï`š=&Ð9"þ™"@•"NÀÅ,^àÈa`”#®N#L²îšdò:ŸöšuúšIþZ?›U@ø`y¤ŠorW2`(ÂJ¡"vY"ŒÁÀÒ8#(5âÏj{³ñlMí¤¥¬ª;k´Ã'«‰»Bz¤²B¤¡¡5"¬+"H`y“ 2¨à"%G ~Œ#ŽþãžÛc:ž>ûoBvì™æJ›U“©Fd t€"Øa@‚ø¢¼±#Œ€÷Ö"žð`þÒ{XÖ{˜Ú›oÞû>˜[=æ»NÕ¡môU@6`¸#"|K ~€¢Îáy+â ( $˜AZà#°¦‡œX\—Üi"Ü>&<=*E œlQ@Òáh©AFy 0H",à„$BÁ+ÂÀ`Ž@B N@¼-¢K‚÷Åܸ¡ ¹ïL¹çêÆ#hµêÁ©Å|ÌÉ<ífÚ$X!“*äŽz"  žŠ 2BÔ<‚à($^O¬üʳwª×P”›8¾?¬càD:Ñ}Ñ=¥:šMþ EÄð–Òó"bÕ.ÛF™’#šÀ  ŽÁÏû@b\’f|ijÜ{]¾ ýܹöÒCBôz;@P€¿#¢ Ta"Œ F0#€ „ú"f¢ðB"™\%>îå¤}Ú©½Ú­ýÚ øR=‘V]iZ=>¼\4b}Ö¹¨ÖQâ¼Û\5¢Àþ°Ù+aÅ%" ú("´A0‚øÜ#6àP⥙̀~à ¾à þà>á~á¾áþá!žà= ª¶ºc¾>˜VkdÜ_ÈÜOÂe}7@ÀŽ~™"œ¡s)ÂxͶ™#Œ  ÀŠ9â ðAþ !|þç>è…~艾èþè‘>é•~é™èýâ±ß´Õ¸®6ž‡:þãA¾…DÞ$&1 L%€|…A®RÎËØ]zR$Kž#¨áê7$ðˆMb z¾éõ~ïù¾ïýÞïŸ>ªMÐi!ãèÕkÜ·žëmÝ$^o¢±„8"R!ðvaf…áH\‘Q`×)‚Àà ¼#F…ÍxþïQ?õUõ—>ðw0‰§Úð¥ñ5Kñ_€ºÞ$0ILÞ '‰ˆab,"J}4aÒ(‚/ª"Ѐ û$’ oOŸõ­ÿú±¿ï]Ÿ¥Ðe¿3h_´²þþö(÷CÂ$Ù@žN"¦šº9"†€G¯€ JÂ"A&BèA~OCPÿî‚P¤ <ˆ0¡Â… :|1bAÄ„Y´ˆ%@—;zü2¤È‘$EëC+¥Ê•,[º| 3¦L™˜š‰3§ÎÁ$”ü 4¨Ðh\¶àÖ”¥L›:} 5ªÔ©T«Z½Š5ëÒ=׎zý öHêÀš=û•I­£™P\ pô›´áe8û‹Þ ‹ÐÖA¢ Ø"*Ÿ£#P¢âÅŒ;vLÑkÆ¡”+[îrr§æÍœ]Ö¼Ù9´è–=/›>=²èѤZ[»~=e‘žšò`ÛÆÊÕðÙþBèþí•“‹[Ö)¹ˆ”E‹À*C;.͹4wH‹ܬtÜe÷Šø±øñäËCŒ|t2êõë3~åçøô5—fߴꋬoûw=ÈvÐá„(Lñ)=PÛ>•Ûw À\žõFfÕ3ÂQG@#Œâ ð•¿ %Š´ÜÇU\èÕ>x£EᙇcŽ:6†ÞEêå¤PîÕGäfó‰äK÷ÉäOûYÔ߃RJÕdÀËX¹0¥ƒSNá…Ĭ€5~•‚$q…Yð•Xјi–iL‘Ò!^¼x¦0§Ê™72$DM†Ö¤ÀŽŠ.ºXþiÔd¤&¡”d¥4Ùdi¦´,)i§=‰”R_ŽÊT7ï,ÓÍR]¬# —^2eÈ3x°êS ÓŽT²ü>Íô³”$³Õ†CMoXQS1v´3Š5T…y!o…õy‘"s\¤‚±³­EO¬Á0[Lñ•€9°ËJ,ÃÄ™bu'hb„ÀC/øê›(£þþ«£Âüè©§CjŠ0-G&\$§w j”¤~9 4Õ;®68E|HÁ,ïˆñÍR Ð3 ×¼£Í« O--˜s6SÜ“lmˆèÀ䀱 AØ´]ÕÀŒØš% «Pr*XTK&^£þƒwhÀJ[¤aÃ5R¸MŸƒ.T¨i§MfÌI̳ۖIM›XòÊÑ7ý øCüp¤3léˆÓçpáMF,êÄ_vÉñS”3µM;)ln™0u‡¥Ä@S@`ñRô¼ê ¢þÆéEO‘Ë;6KÅU8ßtÃ6ØT1EP<ÑJ s„º_aƒK3!ˆY~`“î*IxUGÆ ¥Ž8¸Hà gpÑ‚!ÏÁøBofÛ»ÐÒGq 팊š@ RJà`À‚h SÈ@ ƒR,b «Ç Z0 7„`)ä*rA¬B®€*îÑY@KIÚX0ŒÙŒuúpÏL8Êì! JP3œ i`XÚQð¢o¤á8Â0Æ„‘„4tÁ+\`ZŒa êGY-ß W¼â‹ñ3ˆ'ÁKü­PrŒD^@O$ „5(Dñ“І¾‡¡ŠµÏ H£þð'r}Ð †!|ât˜S6€>ă 0!êfÐ8°àIí%%{&lá+ĨƒE¤ÉU8¡å ¿¸[-Òð#¤(:‚h@°$0` 0€}ÜCð` ä©úé‹}Èj"ÐzÀÿèñš/3è“° 4,dQ“ØÆ††±ÎÉC\‰VvÃ^áU¨£+èCØ9“´†ˆ8„ȉ°0ò0¯L Æh™‚)*ÂVd„•rëõy´&ò$„^ R(¼þBÁõ¼›%ðÚO7Ç>r †Má ‰‚ZæÉc¯¬ŸKŒÃd–Ü€ö‚}|øh}â/kôˆx ã~Æ‚qW4@ Z ÀQÚ€Žnœ¥{¸îEXq‹nh€XÚÙ£€KXÀƒ•²¥#á`0W&Ë]Ö …; “ k(.³©¿äšðck^š *ÄVDl/oÆñˆ«µá,áhGU­êŒLˆ¬v€9¨ äÆàu›ô>÷åK[:Ó£RAÍ™Oc›4_®öPJ}êpŸÄ0šWjÔ†€e­Â0„1@tcxë¬ZÃÖqÆ ‹p\è„U-‘¶Õ„þ~¸?ú+m)SÛÛ?áô¶c¢í‡«DÔ  ¸Åñ “FŸ€+j$‰RX÷†:¸Št(ƒ8J*h Í‹¡•`k Þ!ç‹XÃ|´£ñ›ð —gá‰Ã%î.#Ý%/:QÄLÙŒK}¢¿P7ø`>I¨û°ˆÊ2Œè £ ‹h‚¢+Œ ý(c8†ÖkÄŒå2¢ÄGéq.Ø p¡ëý1Dw:H޾tù(=ð+iºß9rñ©+þKU¿Ð-ÐlÂÖÅØžYÔ°ö‹ ƒz1¿ìÑè°|öxúÞO¯˜¾¾#€'¼ÂïúMu{õ!IüâoÿŸÆKˆBþb°üwVy‹„P¢E¦¸|EV¨õ…¾° $`#øyµíEÔkŸ1ª§=f®û—Dé†_½íqþ×èþ;F`–!$7XDw0B ÔEu´a´ˆ5r Oðgb ÌÏ€Eh1 ð¥·}(ÝG{­Gxã'qåwxç—~ˆl¶44´ `knP ϵÄ |æbò n5¢Õ`êà{gáðÎp]y?x¸zxøpèwCµÀ„Mè„O…Q(…SH…Uh…Wˆ…Y¨…L8ˆ-L°`L!& aàgÊ@ càDþƒpØ' ÓQr€1†_‘ý°¥€.QS¤`h>„ˆiØG8ÞçD¸tF¸mHèt Ò ‡àˆ‰‘(‰“H‰•h‰—ˆ‰™¨‰›È‰èg×%p ß¡%Çn! ¬° Î%|é°<Âàst1ö  ^ñÍ ˆðÝ x‹ÿfz€„Bxx†ˆtˆˆmŠXt bhÍèŒÏfQöÀ¹=ɉÐAð‘sG ®pQk 'p а§h)àqÍ8¯ ù¨ûÈýèÿ)Ii¹ ˆVFˆ…~á×ÈjÊXþq̉‘Y#Ù±U ï Ç`éBfåe çCÌP Ðë@ Gàø òhS@eahWP@? ”A)”CI”Ei”G‰”I©”KÉ”CsƒØaŒ'‘F‘ g‘©•[É•_Ñx cõb£†F@.PØ5ò bi®À) í *&!¡8Е{É—} •Q9•W•]v•Þ–•}‰˜‰iUé³ ¿ð†Fp>ƒ Þp7i€ºqÏà)A íoß! µe—Љš©¹4Ù¹mƒ©e…Ym‡©šµi›g1ú ¿(‹£þè ê /ryÐE]° 7( JzQè@ +ñ5'!$=p›×‰€Áš„èšØ›&›£F›ÙIž©É ºÁ w ×!( `y-Pk 0yºÑ bAà º[p,ù;ÇòPžJžÛé}Ý jß)aá©i㉠Ê•_€üÐEÙQEÐý'l a …€¬ô€AÃsð(wG¡1šš : ‘‚·G ¡`&¡2ê£Ð¸àbñÝ@ÖÐ&[@,ÊŸ( Äp£‰Jð&'^qJÐÌ] üÀ?*¦{I£Ch£þ7šÚX;ze=:¦oŠ-Ø ÀŠgSà !B  i@cÒ0 `é`ÈV5õqpʨY¦Åx¦hª¦ŠÅ¦榊©ÙÑ ° w5…€ ®€ð ÓP‹Â` krct¤pÄÐl•ü`nùŒÎÀ¹ª«»Ê«½ê«¿ ¬Á*¬ÃJ¬Åj¬ÇÊ«OÉQ)•‘z£“ÚP•ú` ¢ ¿`­×Š­Ùª­ÛÊ­Ýê­ß ®á*®ãJ®Ùê©VÕgÝøð GÀçÔV<ØŒH¢€‘c [°+°K°Ë ɬÁ ­ %­þ*c€ˆ@±k±‹±«±˱ë± ²!+²{°ÑØ%kÀ¥gÑŠ cŰ ° ÑíÐh±-ÐnhU k€¯Ñ8\ÀEkü€° ËzÎ ‘ ËG{XK´FKµZ´ÑhR(h¡˜æPð]ÀUIPo_ÑŸVϘä‘C[µu{W›ËʬÆX@ >5PaN›GP QRk·‰;x òÀü``Á î’ô"j¤°œ_Á ±p9  çÚ‡S«¸©ÛŒû(J»´šñ™hà’@ õð™9þE¸d¸…¸ª ¼SÀºÏÈÇ`ºA ¿ÀÝ(Å@wGQÍÆ;=uíºD¨Å8´ ´`¶Ð¬DÀ i­ÖkÍÖj}´°*ðÒ³ÁWí}¬ÏƒÌ¬:­ÕM¡ š -’#ÔÍÈBô~1EB|Ð&0bƒ`ÁÀ@ ßa úš •ü¤Æ€ MÅ MðQE SPØpY°Ýð ác0e€é ìþÐoq0u`äð×·ÇÕJK7@M‡W O@ éð ]ÓÀ Ñ-ÝÓMÝÒ- ´P r½)¸[dKÙÐ|Ê{ýÉá׿ýB±ãUâ +ÀŒ ú`ÇPMXÁGáð]Ð [Ð;Wð;ÀC Q Ððΰ¥Ê Ç“¯*ÍGÁIø cABæ@Í¿1NÐ wº€fA ÊK^ÎrÐíàJñ@ö KºI¾K,ãoÅ·Q €ÞÜ K@ $TºÐ Yp5! .a›ÇÙ=×î,º` 1NBÞ¶` .íìÐ>ÐÁÜVÞþ]pÞèíaMqžÃÀZ‹$ZÀÉP¡€ßÊ0ãs®]zЋøÐCtðCpðnÐë DgÀ8$•+ P@˜ Ò€¾,PÂ@ 0àS0±àô@‚›5À+`!ü‚²À­ Zp ÂdðYxðxKÌú€çö@rÀç¾i€g@b àà S¤X`×P Ó ÏàN° K tP\C ±ãÿ±ã{+Ç)á;€ÆFN t|(cÕI. \ îëÎîíþK®Ý²ìä1áAðV@ ¿0ÀàPP /ðOð_þLÇ×Qæ¿=æKá|p K ÃØ T JS Sêmü  \à ^â ¨tª´Jë°íðprÐâv K`ÉR.ã‹–CëÐ jò˜ÐÂà ’ ÂÐpÂÀ °L`Vð 0Þ´ ß0Æy¦I 1f ã°\G0³ÁÎ@ Ò0<ÎÀ Ž Æ<ÐXÑOÑ»°Q+°?ð*Ù®ãEÜÕÝ®€ 6p AÀá^|°]¾I¾sðÞä;á>ðV p\`ØÀ¶@A Ê ú£Oú¥/úÄðÇFð^^Þ ÿ׿nþ yÀP&ú L1–ôñœýÄpÆŸ­ LðT£ ÒPÚ[Ð ¬À5±5B Ð ÕçLJéSüŠ˜sÿ¨èð ÆÌ²¡,L‘jöÐýP[Z0Æâ%ÉÒ3®å,ÐRØþ¼í ´$XP×Z5jÐÊ1 ÀÇH 4@k DŒ!F)C«”Љ! >4%RäB7ÒEÀV“‚¼jX£YÓæM›AtÉ™$d0 ]„%ZÔèQ¤I•.UJ†0¨ÂÆp™RÕêU¬YµnåÚÕëW°[!xSU€8÷Œ¨j-W“±³1äÀ#ŒHà‡«'>¨±ì q™“llB¯ÆzȬÆþz±*è¡'9 °j,ݦÒËâªÊål.4óL¯bŒÊ¹Ût3)ëÞ£¥ ZyHŸChA#ˆÖéD[B*ï<ô:úHΑ( ÑnÁ¨ˆ9¹)DŠ‡Â †¿°at iLp" ÞuTŸŠŠI4SU5,oTÒí ÀÀçš ¬¢ }ÄÙ…5°ÔTòרæ°€VŒ60k˜p, 0 ‚™c£… U®Æb`˜,¢äµ*rá*.«úr¬{ª¢5VU×L_…a“TxŒ»@ué$# héƒ\µˆPÒ;tS÷6¥Åˆø(˜Ì ²–0ÅF32ÖxcŽþO¡¥S}uÁxK–.ÂS©Zwe–ÍÔ€rðjWÚvÎhöìœ3HI¥V¬m·Ü6¢)‘£ç¨Š‘»ÆÒ ªVìȶe¬{ͪwMöZ©y±«Ç•¡eLhÑ»A ÆÈàõM˜Q_v@ƒc …“ŒB™¨?làq#X>öTä‚Býzq¤PžVå¬#—üªÔRxAŽeŽ›9èÏúáó 9ìž”Žýס³š¸*±ÆªIRаF¦X8ÒÙX˜"~`a=XL}\Y­…ɛǪݮ—¾‹°C’& }ÎÓcŠÕ`¯íÁ€[á¹…F;þfº‡_ŒØbÁÃçÝðœþþR%„Üyþ×¥ x:ä šÛÚé>ãŽÌT ü "ðƒIJV¼Ð§/Xå‚qŠ„?ôƒlv@U6€>ă `ÞXfÐ8°à ýsôžƒ?ÆU/$* ˜ªà‹÷€opãC˜¢6¥ d€B;ø %¡ €‹_ø ²O%Žd8üšã¤²?†QŒ››`c¾¡Øae†Pñ‹2ª`ó¾$Æ0z\,™ ò&àÁmÕ7¾70ùQnF”“B”Ð,(ðݺÓ(ÚPíÀO~óÃ"â¢8>zÍ‹þuÄc)±FÆ9æ ¿xÈ ’ÀÀr€úp@*gDÊÈ­/؇)%gÃPzͩԗ ZÊ$Bt›"U>“@ƒ‚xFÎÐÔBEL`Èþ–©*³_0M6J0úR,C¥-ýbLdO ì1B½5¸ÃtL§óZ~Lb§Ôã Í ¯aDòƒ‡ØF d8C¢¥hEqÑ´ y&#±£ \„H#g€šÁ„µ‰„Š›gýFvÐ’¡s 3]Y;÷Ù—r ‘£PÍ ‡€B‚7õ .izT䦤JhnÐùE£Ê ‰òqU¬fU«Xþ­HBÕ÷@S$¢ Ô3€ì¬T~-Íâ'·¸Ô7É©s½M‰•$|‚_ï`ÄPů ¯mìuDòˆÈv@aˆò…((¶ÈÏš¤ƒkD2M¢V+®Ö“­}+sÛä¦W¹ÅíLòeXÀ–1ÂPQ€Ê  ì-jñ_XÀ&p |`'XÁ fpƒ̇åš÷A ¥þ… "ûŒ„„$´°ÆöQ‡8Äm F‰K‡p# ËdX=’Š‘apx/¾›Úµ®Ö›/•ðƒFI‡_YÈC&r‘|d$'YÉKfr“üd!C˜¿4rAö PÂ÷‡6º¡@`µÀ/ÀЈÐMÙ1W¨E›Ýüf8ÇYÎs¦sí|g<çYÏ{†³×dÐSg˜ áBdù C2DAè†.Œ¡gd×C¥- F CÓš¶èRƒ>#¥ì+A‘ù5Ã;þ&6rpXÇZÖ³öI§´À‹Q»5Ðò"3 ðk`[ØÃ&v±}ld'[ÙËfvþ³…íg57† A5Ç ÚÛæ6·÷¸kè ÓFxbdA@‹?ˆÀ;ÎPGΰ Ž* ¶¨Á‚A ’úűE69ˆ; 'xÁ NpjÜ@Šå1¸§ãÅnG\âî4B:¡ £HøÂ1lð‰@(câ#'¹-¿íp°9· ÎGd‚-ÃühBj¡>ÐÁiBÚàŽ~|CáÈ<Üчq ¢´ð…vxbÔMßÙ ,6 “èâ¸àz×½þu¯ß bR,'Ê£ñ’§]í:«–°v¸Ç]g'7ûQê—?d5ðÞ`„¬M;(‡.þÎñ…'8GÈ·.º@‹e@ 9à…-˜\Œ·=û&HÅ">}¡"é¬Â|PhHB$®­{SL%wØÇÞ2ùÀ1d{Ü †î­'JBï•w "ð/˜-Ìá ÈA„qÑ&Ô¡1"LÀ†«Ã—ÆÔMÂk¸|¹½ky `ëgÿú aâ—! ´ˆAwkÀpòòž)hÏ}ÿã¾(ÿ@ÜÛ=ý£•+ˆí¾uP‚(H@]@\‡&†.°^ž‡€€P\h´1¢ÃŽR —s‚p_¸‚“½¡^¥ÉþA¥i†'èÁì1€‚ëÀ?Z`½, þ#@&”¸>€"hB)\;Ô¿„*à{V`º èB/ü ð[ˆÈ `C†Ë5ò ‰¾‰,:he G€"`ƒ;Ð}P† †M9 … Т$LŠ%œBEd/à‚E|Ĉ«BÞK¨7ÊB¨ƒà`ØDN¬› À[ƒžyˆ+ ‚MÜV›®7¤…]q¹[ …D¸Z(€e~ …0‚@ø@xƒzðƒo(€qøƒzp„o`:ZÈ<i1$à…Q´Õ7-µ@)kò2FS°"‚7ÈTßTQ%ÄV²uHI€þR(ÜÉ4[ÆJ¨°ˆƒ °·ÑZ¨Äð¹uPZÈH›Õl¨‚à† 8„[À‡î*ˆCvìZ‡ûZ޽Ã%…ÙÕJÆ…«„ò… ˆNˆpÁS2èÜM¢ÍÕÎÃÄX h¹ÁI›P 8h×YP øƒop:…]p“]¾`H_ñ_ò-ßò…‡Û-#‘5ô#Pø_ù_ú¥ßÚ šÜ]* £»Èc46ãT`€(ÀÌLX‹‰4€û9æ;¸c<Îc=Þã;–Õ]háÓa\(NÀ‚à]ß}o°…& ˜†>ð‰¨Î8„Œ¨†! `ðàŒ[Ø ‚É[ ÑMš‚îc”(fŠ W~eXvåüxñÞ¨ Ý5Ð]Þe^îe_Öe„ãÂRÞð‚4«J0‘&äxfhŽægæ‚d¨¸Sa0øemþÖfÌž?äM Vr.gs–gI8¨ý¥…YP 3L Bq€X(ˆ00/XºKÎpØä‰XˆgÐ*X˜ð¹#ˆ¬0Ð<ìXå¥À\·¡‚= [† \ÞfŒæeÔ» f¢R^=ð‘i’¶¶j(ƒ»J([镾8°–Žé&CéhQùYƒX;lÎhžfA,XøfαHaž10§ý½P Y … ˜px¼$h„hÀ‚p¨jdˆ8€‰"Öˆt0†DV‰  yŸ6`h“ph¥x# ¸Žë¸nˆG•І‹æiŒÞè-èè1v'å]þ4(lÃ>ì ƒZº©<ÀDˆlÉžlÊ®l˾lÌÎlÍÞlÎîìÈÖ‚:›FM(mÓ>íøà˜cnÛi¾ÞfŒ†j¡ž»pF aØmÞæíЀPƒPÚ_ÞýWŒÐ‡&èB¡\ YÀƒaðzq4Zˆ ‡®.`?hZ`…Á9·lЈ0ÕˆŒ,úö-‘ƒã»lïŽäk¡ÅàÙ²cC2$é«y3ç·¦8ó6åð`;ÆÐ>Àˆ–E@hqcá‚/Ò@s&Á.ïÞ_Q uÖa:|ÎÊûõ6Æßa)ÐØš° è֯[7 ƒôîÂ6ŽF"Åœðr½]¥ÌûL/ßÃ/>L™ìÚÄ)~gÏŠjPñÀUÜWàAI-…‚Ø­’•Âtå\d™5\þZkå$IcG8þ좾œ°iƒ‹\â–ùæb.¢ÅÅÔ½ôìX(°¡Ah¦‹@Ò[´ÐuŽ‚ ÁÅÅp!YŒ‰´8il°h0æd Í 0˜ @A¸Ún´¤Ä@ÆùÅÝÂRÊÜÐwNƒ%ÔæÒCÂ(À†A„xF§$/MŠ€9$ÁŒ‚0/'Mdš× £´‚@üHH¬èÍ+Ú‡&¡PÁÂEðËwhh›€¤¼AüBRÊ1£’Fö n8:èòÆŠÄÑw}C‡ìøS ÈÀ VÂzø.~±Ì FÔŒr)iPC‚Àg¨þµƒ‹£“ Å0°ŒT"¢Sà /šŽÃð£5€¾° ºÐ9Êñƒ04!K~Èâ¶ ޶–¦Î‡¯LtùeGñ:Â1f=µ‘Ì™ò-iÀIJDvÝé©ŸŠ¢s@Àêæ7ëj/,vDÐG,ÞPsBÄ‹¾ûÞ·'î(ˆ»zOï Ìo‰‡)Ú –B$ ¾sŸ¨ ÚS ñø€0®£9``T€ÀŽÆÁ—s€/'Õ#ÉqŽÌ.’$í.Žð½Œs´Ú˜^² `Äb û /„1˜AÀ†_È5œ‘D_DN3AõM°þ½(ãø>VáŽß0Ui`R+r._FÇ( @épwrµž_5"\Š´£QøÎY·–Vö>1^]3êA*¶#Ì Æìja¼r$-ƒ‚ðs“D¥S­`XÀ1>Ð@ il=Û„‚¼o‘ ÞÌ¢eoj#Äâg* f’€äfn@Zœã0r‹›è"ƒrà„# €6hãENf™$E”å>Ô 1;°Å9ÎQãêE¯a&d`‹gIŽJhÃ`ø‚Ø"0(ÚQg:¸! âÐÂ5¢±Œw`¡(Ä,`U ¢¢':@ þ 8b ª_¨ñ‚Éé¸%Dr©Ö]2ç9ñ-JhcY@‰&°F~¹ßƒLp¨Qmláa(ÔÑxÌøàl$ZQ¨¡ÀÍ;0{«IƒôÃá †\ ’ @E|pEa–T pÅ*Úa Ûà ÁR1‚  ‡0`"Xu²óméêï->A‡ Ä¢O,>¦‹¥ƒ0àjÀ³\ åmab/ZЈ™ÊøÁÞ‚FL®/7-ÔaC/uH0XÎ#mÄ@‹ÐK ¡ ¬R¤zé2hŒÁ‹Ìcê¨Ah¡4þ×E¶ÈÃ(È´ i†ae!YÀÐhËȳ£ÝšéÅéËÉ.ñΩwððà†u¬c p°ÃÌA2C bÀ/xÁ\Ђ`'½„ÖßRAuºŠL¤A \‡Ì‘†u¸!tÀ‡ÙÑ>$Xì% øSx \ž¹£áH’¬°„Ä"²l2qpz|@çfÉ2å1…I@"1Ä3ð°Y¸ƒ$àmɃ)Xá-ŰC;Fa ‘T!âÐÃjEü"úhF?¤O}XùÍ~ôÍfb4a ܇â@!$Â\ÅÝŒ0þ`À(8p~¨MˆqaqÁ38Á2,Á1à Á/ô€à€ Ѐ,Ì€ ¸B+°Â ¸@* Â)˜ Â(ˆz̆2ˆ‚=€´‚«$ˆå1EƒÌ‚$L‚l@|'tÂ'€B(˜À  @)¨À °@ ¬Â À@ ¸B,ÈB< Á/ A0˜N4èE9Hž´Â†TÈúèÇq–9De``0p`.Ø€,Ä‚+ÀÀ*´*¤À ˆ h)D€¸@pÐB Á[€"@.¼Fô@t-d“ŒAD-d×fØœÐáÑÆÃŽHÃ$ÀŽ<^ø‚"Á™ÿÔÀþ‘0’+ð…-ø ƒ3Pƒ6|C9<ƒ($‚4$d&€À'”)œB °‚+È‚ ìÂ/Åí…-ü`ÈAÍÀ ÉÝÜA€‡é‰ããÑ ŠÀ_åñ W‰ã[è>ÐA<Ü]˜ƒ€ÃâYA5´a3ÔÆ ¼ˆÔÌM8‚´Iµ±W&Ø 9Á0Dƒ¬O ‰4³ƒ&Ð|Ÿ:C;dÁDH ÀÂ;ˆÁ7ˆÄ²,HºÁ0L ‡Ä‚|‚H°   LAƒèC-´€9œ6œ$¤$,¬¤G‚¤H’¤I¾Ç6„ž>´ã[ÆØ æ}ؾôÇܽþ'EeWF ì…2Ѓ;ÒÓ:jCƒx¥WNÃ^t÷‰–žœ!¥!{¥ ¤¥é ‹^ôž¸ÌJ AWÐ1äV Ü€5$ƒ<Ђpq¢yb‘=ÁFÑÂä$0ÃÓ©*Ì€bÞ@cÐBÌJX¢ÆÙM¥ˆlWoP¸Vš1@ö1D ¨©=„©=;!A¸Ã¼`V²— Ü\À±ÅÁÔA>ìC?€ ‚ ‚!"@@(Â"P@XÀH‚$d@%Ì ‚œ‰¾ í 6È0 †(|B€ÀtÀPÂ$H<‚#4#H€"@@" ,pÂ\jì -Œìœ@:à˜ChÖþSÝCKñ  ‚!4@"(Â4Â#`Àvt”À ¤À)°€8Ô)˜Â(Ђ. •ˆC!LN ƒ8‚*AP_ð‚2,ÁÎaNc:æn5&. @ hA*tÃgݳvL_H#ÙA%ØB$šf+}V¬+0TÀψÁ”zm#.uãSíðà |XPGŒ¬A#%‚1¨ vZޭ݇a@%3Y@XëMÛë=•pAF@MŒÆ: €³ñC1 ßJ, T¨HlìWŽÄ ¨>„‡À=ˆ€4äÁH¤Âx˜rú<¼¨ö¦ #œ˜ ÀÊ•å:ÖíQ Ì °€eÝXÆ¡áÆ©S:˜T>C”© ß`DƒÔJ( 漫ˆ0ÃÀB1(à l™çv"èR ãAÃù)-¨nÔ- +´(Õ@\hÒ¾zÈ(IÊ(Âшð¢m² €ÀC]4lB V64ÀóD­ÑôzG´C&8ƒAhïCÈçpÐç®ÜgQD)lÃ,òƒ]äKLÀ+¥Bä‚!¸¨8¼@ \ëþÏNÁ'Øä ¬8¸Aüš’>¸Â+UíHè BÍt¸‚+•,€ˆ+ƒ+Ãr7”ò)§²ýEõ¢˜ÚÄØ¢AÙ‡•f"„Œ 0Ö ªƒØ XìØÁ*ìñeÙ°\â0Ó¼ªq¤Bx–©TÂ[˜í…-Aƒ6Ø)¬C,”÷ÈcnÆÁh#<Ð*}A €'Ø(áFÊéF³©¤qà ØÛñYlP(,%o{0€!‘!w6x,#d|rïY¬ÉnE?ôÀtÛ\ÉG´À; ÁÀšL"L>؃À´(:@þe< Áí ´°ÀˆÄàˆFðÁ'ÜÁÁyCTOuU/ðR7õS;sQôC18˜AP³5çÄÙ@Ú†0P€+œÃ<ªåµ°Q L´BÔÅßîY ná®g}V^ÐB&üÂôŒÜ@&öãPB ô• 4_`Î|À:œÀÐÂwíÅÐ#Ô€LhkKÈØÀ MzÅÝzÕ ñbÞñOJ³‡K“LûI#;Ä#W„÷‚¯tüôA¤¯)0¼¹ ÿ•”v0•Brp_ Kó`;–8ŸO-¥Ï:Ô\òÎGœKödëÅ‘eöŽh4µX.šþÑö—”ˆüT„ìÂOÑ®f -@4\A ´kÓ‚íÚE=` os£oŸ…m¦óp§‰qrˉrۉȚG}NrØl²…Mz¼À>XwK`·Qܵç6Ó6‹wGÌívQ o0¶{WÄ;óA<Ï÷AQ6g$5ˆ®=8„woŒ(ÃÈA6ðÌø³^\LˆCÐÏ@¹„ÇH /D”tÂ.¬oôñVxøÜ€xšˆ8s£ANÓÁÉÌt_PóÃ$¼8KÄxQ̸wW„^óuŽë886z«‘z9{g–?ÄcéÅ*±‚/„¦µAl+”{Ž”kþ?´C#ÔщS-.©¢Ù€<¨RölXœa€ymÇU.ˆ-‰%C†p̩ڲ€XéLèð¬Ž\Áƒ  Ö‡VbÅ‹7vürdÉ’¹šš|ò(a0w^LBaÑ Q u—e:|Pñ€ÞèÁÝ–¼˜1mn"IÖv«r j–0Ïp}ÁÄwržK™7wþ:S§É#Fþ*üj pè ¢þý)Y³ºÉs\Û<ÜÑtí¢ÎûÉêTad×|Øs~ýûWæß\røO2Ðì“­´XÁ¹€Ÿ¾8!ÚÀæ¶ò4Ô†· uRÉXD‘Äm¸¢ÅZ.º]|‘¹¦.´®m¼ñ‡¥(GÅ)oÃòλP=Ñèʇ$•Tr„ÝP„Â(ÂÀ*­ìË®ÜR?¥¬´Å“ ƒ¾LÈBð2 R·}4I%2å´éͧX„Ï<󔼨ä”Ó«:ë’Í܆L/.#ÿ$°3¥¤’ËHùóOÒJ#óÒÑ…@‡ÓN=í´˜62E(ÍïþÖ,-7ˆ \}ÖW+0fÕœòxæœ\uÝ•×^}ýØ`…–ØbsfºïÔ°ƒÙfm¶j}“PTÏ:ô»" [Ÿn½ýÖÛT•BH-=—²,Ñ]W1LÉ}÷ÀR©»È@ì½ß|õÝ_YFš`ëYƒà‚ >á„^˜á†~bƒã˜bj˲-l©ÓÞŽE3—Ý£TdKÝõeÁäMî¢E]~yÌÞ*ž™æšm¾g·ÈÂÊž}þè …þy ô²M4夹äuIn:Ò“•žzeߢX묵ޚ뮽N1ç°Å›ì²¿# æ´]6zc¤§žšiþ¨-}Zî+¥~;åªÍÞ›ï¾ýþ;gdØœð ?ñħ Òm¼SŽ»îH鎜À»ïXoÀ5ßœóÎ=ÿÜ$Ž/÷rʯœÜôý,ÜÌAöØeŸýMÑY·ôÔ D]wÏV¿ÝQ×ižøâŸÝvà3ͽ÷ýxoþ²ß•—Røã­¿ûìoN~ú/™‡Þ³çÁ¿4´îß­^ûôÕ_Ÿ}·¸7¿\ÄÆ·rrM–)!‚ˆœ̼üFÞЇ9žAÖ ãX^0ôMN( Lጚi‚:`x=tÀšÈhŸç4Èzf !u"8Á ï}ð³äì‡?ýþÍ/2¨ Ab”±Èí0zåSPaÐa ¬cÔ±JÂK( ‚ÔŒŠÉq!ˆFxc 5ë 0ÂÎm±‹_ #ÍÆXÆïdÑŠ0lœ £T: ö‡Ñ¡bD_€@'8#‰‚3à„\A _ˆ¢‘~¤ I y¢£Ð-DÐ Aš€äë‚:ð¡ „„`]h ⱆS(ÐÑÇ(pX>c–µìÂBAè¤ÉÉ¢0ºéÎyŽ"÷Ìç>…‘άÀ˜0BD*!ÎJìôªP+&fO|ê3"ß 'RÁ €¨ÊÆŽ|”d ™˜KfRK!˜ÁHaIÔ@1äóœb«(‡]1©IÅü‘®•dÌiA€ $ÄHÌHCÔ!1ùFb€H‹Òfvþ³¥E)K D,¦´ ‡…,CXÑLà¸E<&ôÛàwB,8ƒ *Áz€à ÏC& 1ä¡ €00Àä ‚[ÝòÖ·ÀuÞq„°d±0Ý@ B R@D~€ÈŽ‘¡u¾õ½¯0X0Ua0B"C­Í»0…Lƒ Â(921Èá9A 9Jر‘ 2N¸Âΰ0Ú0 v`‹MÜÅ9 p v0„%La cXÃö0ˆELbCÅ?^q‹_ã·¡Æ‚¸±P!_ˆXö…H!‚` `¿þ‰€€Mµø†0’À‚-ØËÂÀ²–Ë€!ñˆIÝ£™'ÂU~Ž¢e1«YZp61¬MÌk3Œ{„v‰)D“‡H'fÒ EJ‘èÖ2š¨=´j'«®Æ¸¢¿¨„b†QW—@€í£bòª˜Ò¶úÕ±¦Å=XQ‚DD¶þ ̀̄ßíB&ìð…%²¡ KTC´miwáczF샤ƒô¡vŸÂçƒ [ÙÌvvµ)P ,3(E8‘c”ߥ˜ÅT‹ ¦þ×ÞùÖ÷T‹R4â ¦ÎD†6£c £jòHQþmcÄÅ´Æ*¸ÁN@Á8"¢Rÿá\q8Ä%. Š[ã'#Çäq‹œä1yräMï€ç{ßÂ(øÁîo… cÀé7À…np„ÿßA  PÊS¦r𮄥,iiK®ë’—¾¦0i@Lc"S™bfœ M²Ss븴 ƒjU³úÕ°,¯} ìÄlÒ´‰!5'm]ø]÷ú×xÏuk³G_˜@‰qcfýwÒž“ 0ÔðPÇV”òàÇ#Bøá ’ÐG8ÌÝzòšE`Àìð]` 1·BvozÔwAõ¬gb»1*2ÁnŒAEú-ŒGd¨Ë/þIê0‚8+8 Ä~‡Aà =èÇøû1±7@ IDÌÙ…ð“¿üU|%Z-xç'çÛ·ßý￟üÌýÔ¯ý2ŽŒpüº æ¯þîOçŠ:Ž/ù Bú*‚ú¬oË$¢¨’ލ Ï#⽬Ýçjë¶rk·z˸„‹¸Òë¸ZP¹˜Ë¹ « ¤‹º¬ »´‹»¼ ¼Ä‹¼¼RÐ/èác‡/ò228Ïó#cÖ¯òJ+¶œÑ4/‡L1€ÈB!12áÑc@‹òácb@1İ1+1xÔN@ØbìA~a¾þÁ À¡Dàf¡ @&à*àq± \€^@Hᆠ ®a!ÀÂô˜«ÚAü`Æ  à Q Ñqápï½ BP">Ì&"ôKþ` b ¢b!"|‘"® "” éN:¶èºXÁ€ø¡¢A„¨ "ࢌÎa à ¶±¿1…A ÒAì`¤„ Â~aôo¨Ñ±Q¹ÑÁQÉÑÑQÔ‘ÝrëñóqûñÒ7²h{ñ%Â…!b„ñþÀ†Ì bÐŒéF²$…k $¡ØÝBÝžÚ¦'¯-ÛÄdÛºMÙÀMÜv/!v/'—­Ùx2 ”-1¾0 Çp1äè01~À óáÒÒvíÒïòh+µ’àp /1ì'CRÁn@J4@FÁaÐLá@Aš 1èÒ.ñ21H¡ðç @1öà@!ò2¼ä B ì üâBt@ÖáÊÀšú ¤È`4Kó471Î@Ö  à î¡âÒ ú¬â–A¾Äİ«3?34S²MÀ"‚>"¦àþ@€N¼ãÊTÀ2¾RáNà²"¦³:¯"V &èº " @Nà°3,Ä€+`@Œ¡¼ÀD€ôzà " nÁÒ`+Ü(ìALÄö³?ÿ3@…aÒ€øÁ @"Fè¡$@ ÷†>À>ñS?ùÓ?T@ Ô@‹/AÔD!"&´B/4C7´C}£9Ÿ3:ÉÓ:±=Õ“=›ŠT@4@$OáH#¢œ d²È)HQ`=Ç“:4,° F¯ôN/õVÏõš(L» öh¯öºàöro!²Ü~Ð÷¾Tøšè)—1Ü.åÒ0ï’2þ“1Ó´,`Fá®òU1:aØ!-—€ø4³0ëRO±„- ôDFzè(Š(û^'ÿ>T'âSg§SÃ.òpûðq ñ‘‘#Ñ)Ñ1Q9ÑAQILU‘][u!1À,åRKF|ò£YÙ%S5µ0 ˜•rž3¢ –áäfZ©u6¤¨V¾œ`dG¸böÑ[»uc'Êci'‚þP`ÍÈ&†$–0¾g?ì'4Mn6Ú¥|T–B¬õcsVgwÖGRÖfå‚egö1dVh#öggyVi—–isÂgV!‚VhƒhgÖh¡¶!(¶i·–k»ö$žk #Ц6|¸lãj±6i½–mÛöCÁ6l¥ölGÆlç–1Òj×Öm÷–o×n±Vnç¶jóoVoûq·xþj÷lW?!’Î¥pöp}f@q7—m3wf÷h—@$—]&§–á hÁ~¬ÁR×¥r"8ÄÈ…­âEkÁƒ$(b ýžb\)¦„¸ÂÍ.D…8—fA ì ú%Š·þ6œwfr·v·wuâwkgŽÂhÇö1N7uW·u¦nË’,ÿ#Z·äu»`Xqê\ØtS{$‹’ Œ/lòa[ÁPxZ0XÖ–K— M—ƒ—iÁ—C+˜C¨I­˜ÙÓm24ˆpÍÕtÍáJ@`!18a1´ÄªõNðƒïO”˜ù©ÍÚÐÚîµ DÖMLЧ ãrM"‹á¨"8°¨Œ©n¤D€V*ÆäƈœÆ Æ(B…ä€dÎx¡/¤¡"": (ûÝÈ;²'» ´gf¯ûú¯5п$b°I¡°{e£ä€â¢€X„˜¼Š˜)‡w¸‡8ˆ‡8™–éþ“/à -ï°Z«¹Ú«i¬i͹¯¬ã¬ýn-C™,µp1(¡ ¯º- ½›1°0­¥)Çt‰Àyô! ÆtÜl×G†j`°[;"û $@ÄØ={Œä!":»´-û²¿cŽë"faL›Â+Ü ¼Ëܳ-µ#"¿W››øÛè â¿\Pàööî!&€Ò!›Õa›ÉË›y0š§¹š¯ùÅc¼›·ë›—{2šû¼C¼É;¬%¯‚C½»»1€\-cl!1¸!’¡+ƒ¡*Ñ•-Ѷf)d}¹«}_•V©m@¡PÁV¡ Bàn±|Xeþ#¯Kb¨4 Ƭ̄l%‹A"Nax¤bð—‹öWJŒ`pqŒÒ@ !ì!²ß"4r²Áëäø@ôaÖñÒ3Ý7} "}Ò+ýÔ#ÓùqÕ9½bî<ÏÏyÏ[Rýþ<Ð}UPTü X|¾_Ï®×z‰àZ®éº¾£ÝÇ%ƒÉ­R1ž<ʧ¼Ê¯|ÉãPËRCPWu—ah!O“ÆÀDaÓCøR`á²Ò2ÇÝÕ4@1R+³Ë$–d—`Ws‰h ô@ 4áâì@¼j!v³75€Îo÷;¤·þV`’tIËI;;@`J`&D…WèÓÊ `9ǨÎ@¬À ¬E4"4”C=´ÓßD´œ€y!bç_´çqTújþæsé”ç‘é+†ã=ä‘TäMäMåknkû¶¢¢¡¾w¯½½í â;Ùë:šîš!¾gÜ¿×ÜÑ]RÕÝÝÞåÞíï3ßï§ø=1óQýTÆ×n#}eCî[GãǦ Ò¸o<è9ó‹§òÅ^¦‚øaaôÀ ØÜÍá\Î+á/`¢ÌÍÕõßâ¼ J‘õÛ¡0Dwj!w~4¶@iê\þP2¡ üê!óigùÛù=ß>4ð@ 4Ùá!^â)þ ,Þ7]ážá³?â'¾âûãW”?ÜÙÿneÞ Ú eŒßG@¡¢ü&D×a…š „ H° Áƒ*\(P ë1œH±¢EŠ JEÃp±#–]BŠI²¤É“"P‡²¥K‘ÁúКI³¦Í›8sêÜÉ“çCS=ƒ J4˜„—H“*]Z’ŽP£JJµªÕ«X³jÝʵ«×¯ ?2;ò È"I´­Û·8ÂK§Qµxó"u ¶¯ß¿€ L¸°á…bõ*5÷ÐÍ8Å&ÙÖLþ¹¦Üʘ‹…ÌY1ßàC‹Mº´éÓ‰;«+9³k·—_˶»yµm¥ŸOëÞÍ»·ïߣSß޲õìã:c#?~—¸ó“¹KŸN½ºõëŸk7¾¼ûLåÞ]7×N¾KôëèÓ«_Ï~köòù‡G~~åñðŸoÏ¿¿ÿÿë½—ßjòÙ'[}Ö…_Kä<äàJ!ðÂHsÐñK"ÆcÄí B`<øP AYÐ3"Aç #ч0Z¢ˆ$ c"Š*P£@-¾caØY f†`et· JfaÀ#&@ØE%‚Œô£H’Jçá9"‚’‰ŽMPþAFøaÖŽÂôƒ&˜t"$&™fΩ&›nÎ)œpÖùWBBF¤lIvw$e!(Y›K*ÝQ@y<N=j¹¥–\<N_„BZ„ R `N<š„¤Â:¥1†I_Ò)goœÎÆp“c €„ŃZCÌ`à“ $e @bÀa@#¤@æ(!èt·æºk¯¿¬@Ã:Xì±É.ÛìCÐJK­µØj»-C„ŠÔ ˆJHa¦]v¡!‡ÄúZ£ŠÔl#·äI*9ˆádÙo\ŠH”NÐ g˜P ô€R=QP‹*Nt)<2 >çÐúÔ¼Éþé`Äð¦¸~¶q&™sS9™LP‚ÄÍ™¸rÂ1´€ ô`34ÿfóŠÆêìçŸ=ÿ,HÐC}tÒÂ,ýÓPKMµÕXgH.5ùd”Ri%–šVìœÀ®%LŸÁ¯}PB Ë” B Ì=Ú’J|ÀO#ùRßZ¾#â3—2ÒpØ!Å*{@7sÖrâ?L4nÍ_¿ÞŽˆKÀ> AU¸a(Œ#·o©¯Þ:ìÀÆîçìÖöíå¾{ï¿ÏýR¤“Vz)¿$YÞ©ƒŸ†:j©§¦ºj«]¼묑ɴœáˆ+Îøq‹N&øl ›Äåd¯)Řw G þ 4¶©~Á£  9Àñ ™ýPÄ`ÏŠ§×¹¡ýÈ`?â@<‚`ã ”h8´`„èí‚tÝ×âd¼]Pƒìà@>–Є©×¦ˆIL]ºØY¡1Žy d"ëÉr²”­¬e/‹Yúæ3¿Ùį.U|MýJÒ¤ ÔA$~˜@–0/tAb““§|&+oùËëroZ$ì[€6³iqv¢ÓFMN0lÀÜæXϺַþeœã›&HWúLšm¨Ó"R§ Õ­NôaïdÏ% E6}‚Q<¢&’… $‹ ÐÄ.l̹NøÂþð«7Qà.wºÛïzç»ßgxʽ2P0„àÏþùÎ{þó$V|‚2oy·wgÀØ<èWÏúÖÞë˜A}éAîM”àŒP½ëwÏûÞ;ö“±=îgåtÛ÷ÈO¾ò» |æ^>¹Ç_¾ô§OýÚ6?¹Ïßmô«Ïýî{ß6×ßmöq»ýï›ÿüè_‹è‹Ó¿üé¿üÑ~ÜŽ?µðŸ¿þ÷/ýú§öþ¦•ü7€ØzþgZXÁ€¥Ð€ø€8Xx˜¸Øø ‚"8‚$X‚&x‚(˜‚*¸‚,Ø‚èëÇ~6‘€~e•pƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„LØ„þNø„P…R8…TX…Vx…BÈv2¨]î·…^ø…`†b8†dX†fÈ~4x†j¸†l؆nø†p‡®‘†rX‡vx‡x˜‡z¸‡áA‡|ø‡€ˆ‚8ˆ„H†~Xˆˆ˜ˆŠ¸ˆŒØˆsqˆŽ‰’8‰”X‰q‰–˜‰š¸‰œØ‰~…‰žŠ¢8ФXŠ9Ц˜Šª¸Š¬ˆˆ¨ØŠ°‹²8‹føŠ´x‹¸˜‹ºˆ€]¸‹¾ø‹ÀŒe‹ÂXŒÆxŒÂHŒÈ¸ŒÌØŒ«¨ŒÎÒ8”ÔxؘhÚØÞøj("â8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxø˜ú¸üØþø©;mod_perl-2.0.9/docs/user/handlers/http_cycle_type.png0000644€ÿÿÿÿ00010010000021515211727205032023117 0ustar ????????None‰PNG  IHDRø?­:¸sBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\ŒëÛð{¦eÚ´X’6%Ú­’%QJ¤¢#»Ž­´!•ÎÁäˆc+Ë¡¢N¡´(§IB”R¢6-Si›™÷ûó›Ï¼¥Q3SÓL×÷÷3Ïv=×3óþtû¹„ø!¤¥¥ehhÈíL8)((ˆ€rpp äv2œD ˆÜΠ¯@¡¾…ø:à[Pè€oA¡¾…ø:à[Pè€oA¡¾…ø– ·è+®®®oß¾åvÀ€sôèQ}}}ngÑOø¶ÐÉÎÎÖÒÒš0a·ÀÀÀŠŠ ngÑø¶ÐAM˜0ÁÈȈÛYHdd$·SèWÐG| ð-(tÀ· Ðß‚B‡—¸ººr; >r䈛›·ÀŸøyÔUWYYY111$‰J¥JIIÕÕÕíÞ½›ÛIý?þþþžžžÝ]ºti?äpúô馦¦çÏŸ899IHHôݽìììBGŽé»[ÌQ¡SPPàããƒ7ËËË8ÀÝ”ºúþý;“£&&&ýn7:xðàÎ;ûáv@ßD…έ[·¶nÝJß”——glΉ‹‹ËÈÈniiÑÓÓ[´hÞæÌ™W¯^7ŽF£UUU­Y³fÊ”)?=ÔÑÑqùòåšš„Pkkë¼yógôINNÎÈÈ  …@ P©Tooo„ÐÉ“'_½zEoÞÐÓÓ366ÆŸ¯\¹RQQñåË—€€€®ÆBò¬éî¹þþû襤$SSS¼ùàÁ333¼ÉüÛúÎ *t¨Tª˜˜ãUUUü!99¹¶¶ö·ß~Ûaaa‰‰‰¦¦¦!—­[·®Y³FAA¡½½ý?þ × L]¹rÅÊÊJNNo†„„¼zõjòäÉ¡‡VUUíÚµ jll5¸ î=yò„þJ !´jÕªàZ!¤¨¨¨  €êÔa¥»C>Ä …BÆÚSSS÷íÛG?$!!qøðavž‹åä{®±±_Ëä¹lmmÃÃÃBË—/§ŸÆä* O ¢BGPP°®®NZZºî5|øð6Ì „h4Z§=¡ï3b˹sçp&Ï¥¤¤TYYÙÜÜ, PQQ¡¬¬L?Ää* O ¢áå7nü믿è½}kjj<<<êëëBáááô3#""fΜÉν&NœõÃC:::·oߦo644ܹs‡¾ÙÜṲ̈åé‡8ž|Wô”˜<BhéÒ¥·nÝŠŽŽ^¼x1ã~æW}‡€rpp äv&fdddkkÛ©Ókqqqpp°BH@@`Ó¦M222øPllì‹/H$R[[Û´iÓèýyž|6l˜ššŽž-))I"‘F޹lÙ2œBèÑ£G ’’’ÂÂÂC† ±¶¶6lBèĉmmm™™™Ó¦MC 2¿$b9y&èÃËõõõñz'hæÏ…rww§Ñh'Nœ` Èä*æÏ€ã\]]===---¹H à—&ƒ§Ð¹ÁVè ¢WWl Ðß‚B| ð­A4¿zûömdd$·³~àêê:bÄng8 žWQQñùóçŸÀœ··÷úõë¡Ðá3Pèð…¥K—r; àm~~~ÜNpôÑß‚B| ð-(tÀ· Ðß‚QW€¯œ9s¦´´´¤¤$44”Û¹à>(tøÙãÇwíÚµpáBŸ””ooo ooo„ÐêÕ«GJMM3gB¨°°0""‚ù!__ßû÷ïÏ™3‡@ P(aaá½{÷Šˆˆ0OãСC©©©sçÎݵk—¤¤dß=²‹‹ BhÏž=}w < ~6{öìéÓ§ûøø „ŒŒŒ¦OŸŽ«„‚‚ž1ÂÝÝþᧇ|||¾}ûFŸj"??ÿÏ?ÿÜ¿?ó4öîÝ‹ƒ:tˆÃO0…Î %''×Ý&‡:QWW¯­­e'ööö“'OVVV"„ZZZ-ZdnnŽòõõ½{÷®µµ5®Ì|}}ïܹ³dɼÙÝU@'Pèð¹ÒÒRú{œÒÒRú~NgzyyýôP'ÁÁÁºººì¤wúôéU«V)((àͳgÏ>þ\__ßÇǧ­­ÍÞÞïwpphii¡7Guw;™àKPèð9EEEú›&ú(vàʉ@ P©TSSS‚444àž:±±±¸aëèè ‘H¸dÙ°aÃÅ‹q•vùòå 6ÐOcrÀ Ð;Œ•ËŽ9‚ûëÈÊÊvMUUõëׯMMMåååjjjôCL®Á<:€ ¨T*þ0mÚ´k×®uwÚÚµk¯^½¶bÅ Æý̯è E‡Ÿ>|8==Ý××/OOO÷öövrrRRRBegg_¿~===}Ïž=âââxpÖÝ!___¼“H$îÙ³GBB¢'iàáåøB¼§¤¤رcG``àöíÛÅÅÅEEEeeeŒŒ455ñQ==½Ó§OS©TÆ÷V̯ڿkkkZZ¾—¤¤$ 5€ÁŒ€rpp äv&fdddkkkddÄíDú\RRRrrrpp0·Þ¦¯¯ïïﯪªÊíDú–«««§§§¥¥%·éZtœÔÖÖ–]XXH&“›ššÄÄÄÄÅÅ¥¤¤F¥¦¦¦  @ ¸&`°€BÀ®?&''?zô(33³²²RGGGSSsÈ!C† ‘‘‘inn.++{÷î]III~~~]]ÝäÉ“gÏžmbb¢§§ÇOEOKKËóçϹè‘ñãÇ6ŒÛY€þ…€Eµµµ7oÞ¼~ýzeeå‚ lmmÏœ9£¨¨ÈüªÆÆÆ§OŸ>|øð÷ß/,,\¾|ùºuëè³xÚ—/_V¬X1eÊn'~âýû÷gÏž…‰F (t½V[[{úôé .˜šš=zÔÄÄ„HìéN SSSSSS„Pqqñ… ~ùå={öèèèôeÖýAVV6$$„ÛY€Ÿpppàv  ÿÀðr@/Ðh´«W¯êéé‘Éä·oßÞºuËÔÔ´çUN'ÊÊÊüøñ£……ÅÊ•+7oÞÜØØÈÙ„ƒ:€žªªªZ°`Á•+WÒÒÒ‚‚‚”••9–D"¹ººŒ5jÚ´iOŸ>åHX@PèzèãÇfffóçÏÏÌÌÔÐÐàx|11±¿ÿþûúõë+W® ãx|Àà}t?÷áÇùóç?~|óæÍ}z#“çÏŸ›™™!„V­ZÕ§÷ Pè~¢¡¡aÍš5—.]Z¶lY?ÜNCC#--mÊ”)£Fš;wn?ÜÀÇàÕà'¶mÛ¶`Á‚þ©r0EEÅ[·nÙÙÙ1.S,€BÀÌ“'O^¿~}üøqN\¼xqON›3gŽƒƒÃ‘#G8u_Àà…€™ƒ>|XXX˜¾ÇÆÆfÕªUüñÞôõõ]µjÕ/¿üÒÀ›6múá~N{öîÝE_X}tÝ*))Á“3î´··§R©xÓÇÇ'&&¦çSé,]ºô‡û›šš:í‘‘‘Y¹råíÛ··oßÞËÄAŸ¸qãÆï¿ÿN¡Pþû￟N À-:€nÅÆÆZZZ 0îTVVÆ­,Û·owwwG•––2þÙ;{öìŽ;ÜÜÜ6oÞüìÙ3úþcÇŽ¹¹¹ý°ÐÙ³gÏ“'OÜþ'** ï·±±‰‰‰é‹GëOÆÆÆcÿgâÄ‰ŽŽŽÕÕÕlÆ|óæ®®nCCãNú&L˜°qãÆÒÒR6oÄHWWˆë‡{qÊ¿(0¨@‹ [yyyzzzvÒ ææf\u*tœñ¶yóf¼¹sçN„››[×ùùùÕÖÖtÚ?mÚ´ÜÜ\Î< ÷¸¹¹ÅÅÅ%$$¬X±BPPðÎ;nnn¡¡¡ìĬ¨¨¨««khh””¤ïܶmÛýû÷}º  @HHˆH$~ùò…¤¥¥ÛÛÛ÷ìÙ3nÜ8"‘(À /6ÙIø‡¬¬¬DEEœœœÕÕÕ÷íÛWWW'--M¥R/]ºtíÚµ/_¾¨««oݺ•Þd‚ ...¦P(x°ýÁƒBæææ!<üž@ lݺuÛ¶mÖÖÖ$éÁƒŽŽŽ£GÖÔÔôññ©¨¨9r$B(55õÔ©SïÞ½“022Ú±cýÇ}úôi``àÛ·oÉd²ººúÞ½{éå)•J ÿúõ«ššš––ÞÏò½h4ÚÅ‹ñ#ËÊÊŽ;öÑ£GŠŠŠNNNø½XRRÒèÑ£·nÝŠ+*üšŒI@¾(ŽÿÄ` ƒBЭææföÃC111kÖ¬º|ù2ã9¿ýö›……½ÙÆÑёͨTêùóçÙ Ò+LÊ úÎmoooiiùi|2™L pEµÿþëׯϞ=ÛÔÔôùóçÎÎÎ~~~¶¶¶¡œœœèééÍ;—L&'&&ÒûeoÞ¼ùáÇñññ«W¯2d@022êt—ŠŠŠØØXiii\ƒÆÇÇ»ººjkk¯]»–L&'$$dddÄÆÆŠ‹‹#„²²²^¾|©§§7f̘§OŸ:;;§§§ !„8píÚ5z†ô·Š,ßëðáÃÿüóÏŒ3æÏŸÿäÉ“G!„–.]Šß‹áâï¡R©ñññ? Èæø:€KKK{ùòeYYY×CáÓ§O***¡²²2ÆVŠŠŠ™3gâÏÙÙÙ=3ÕØØH¥R;uj®­­!“É#FŒÀˤSP©Ô>ÚdíK6l“£çÎëèè¸s玑‘Ñ!CÊÊÊÂÂÂ6oÞ¼{÷n„…BÙ´iÓñãÇmllš››B4D"éèè,^¼˜þòeÙ²eRRRñññ?ìlbb‚’À#æNœ8!%%5{ölœ¤¡¡aLLLddäúõëBÎÎÎfffIIId2Y[[ûýû÷UUUòòò¥¥¥×¯_···ßµkBˆJ¥nÙ²åáÇ,ß«¼¼üêÕ«kÖ¬9pàB¨££cݺuK–,=z4ý½BÈØØ˜B¡àB‡yòì|Q`0€Bð÷ïß_¿~}{{{ZZ½Ï £#Fà ÅÅÅôýöööâââß¿—‘‘illtww÷ññ:tè®]»Z[[SRRp{””þk‡­^½zÓ¦M222$IZZzýúõ#GŽÌÈÈ?~ü–-[ÜÝÝ«ªª²³³ãââ$$$úôÙZQ©Ô---õññaùÆBBBsçÎÅóåççÓh4|T@@ÀÊÊêñãÇ555²²²ººº›6m {ñâBHPPÐÃÃCGG§'°jժׯ_×ÖÖjkkã=Ÿ>}êèè d<^†FGG{yy1–wT*!”——ǘ!‘H´¶¶îTèôê^>| R©+W®Ä;mmm322˜?óäÙù¢À`… ³Û·ooÙ²¥££cÍš5qqq‚‚ÿïߊS§NÑ?ÿöÛoŒ‡ èÝ;:a>ûߢE‹-ZÔ5 ‹%K–èëë[ZZ¾{÷nþüùIIIøEa¹§Î°aØ_ØiT6^þ=))I]]!D£Ñ’““%$$ð  ÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚJKKÓ#t÷bqóæÍÒÒÒÖÖÖ...áááJJJD"1**JTT´ëù~~~šššþþþ***ûöíÃûåääB/^¼7nÞÓµ(éÕ½ðã'&&â¾>T*511±Ó9ô‡jmmŘ'ÏÎ(tÿOLL ®röïß¿}ûv++«k×®ýúë¯ýŸIuuuDDÄãÇñk”„„ ‹¼¼<}}ýÔÔTæ/‰”˜˜üF&((HAAÁÞÞ¿¡SSS³°°8~üxffæ˜1c222²³³½¼¼pç˜ÄÄDÿØØX ÖÖÖüü| ‰„câ>¿ÞÞÞZZZ_¾|IOO·´´œ:ujll,B($$ÄËËëØ±c«W¯Þ¾}ûòåË]]]=<<.\hdd$((XXX˜íèèhoo&“É‘‘‘ååå©©©¡‹/˜››Ï™3gÿþýiii ¹¹¹Ož•’’Ú¹sçºuë𡲲²W¯^}øð!33óãÇãÇ?~ü8.B#GŽ$‘HIIIéééT*uáÂ…ööö;wîÄ7úøñãòåËÇW\\ÓÒÒâîî®®®þöíÛGåää„Y³f­X±7{Lš4)%%åáÇ¥¥¥ÊÊÊ555oÞ¼),,\³f™™YKKKjjjZZZee¥ššZMMÍÛ·o_¼xQXXȽæÏŸO$SSSŸ={6lذ3fäååýúë¯ÒÒÒ²²²222111Ož<ùöíÛ˜1cª««eee˜dá‹JNNž6mÚØ±c;ýR.\033£!äW±±±3gÎÔÐÐàv"ýáÀ„ƒƒC§wŸ|ÀÈÈÈÖÖv0t°OJJJNNæv"€çeee-X° ½½}ݺuŒ/§¶lÙ"))yáÂ…þL&11qÙ²e™™™222JJJŸ?ÆÅAee¥¹¹yQQÑܹs#""èÃ@PTT´dÉ’äädn'ÂKâââ\]]ñò~»)îIfnnÞi¿¾¾¾¿¿¿ªªj¿e®®®žžžü×ÀñCfF „Pii©M{{»¥¥åÉ“'ýõ×_Ož<9wî\¿%STT´råʰ°°áÇ ”——Ó YYÙèèèaÆý÷ß...ý–à¸ââ €èèh„þ¿ô(t¨±±qÅŠuuuóæÍ»té@`<*..ºwï^Æfž¾“={ölç 0‚B€Á«ººÚÎÎŽB¡xzzâU{bùòå™™™ªªªúúúÑÑÑ,¿ÌÊËËóðð3f̳gÏbccÏœ9#""Ò霢¢¢î.'gÏž9räÛ·oÿýwÖrð7(t¼6mÚôõë×Y³fᕌzNBBÂÃÃ#;;{Ñ¢EG5jÔÊ•+/\¸ŸŸÿÓk‹‹‹£££ÝÜÜtttLLLB\\ÜåË—ñìÀ|ùò¥ë`F’’’áááD"ñÂ… ½z À`3#0HýóÏ?©©©bbb.\`mÅ ‰5kÖ¬Y³æË—/ÉÉÉIIIG-**RWW×ÔÔ2dÈ!C¤¤¤šššëêêJJJ^½z%..>uêTCCÃ3gÎLœ8‘ù-ª««õôô˜Ÿ3yòä?þøÃÇÇÇÕÕõÉ“'ÇgáYü £OŸ>á5ªÎ;GŸC–e£FÂBˆB¡äåå’É䦦&2™åb 'jkk¹è?Pè0èÐh´Í›7755-[¶ÌÊÊŠ³Á´µµé Y³)??_QQQLLì§gþóÏ?“'ONJJº}û6}µí~&**ª¦¦vöìY®Üôœˆˆ­•Ø…ƒÎ•+W233%%%=Êí\~ÂËËkëÖ­&&&?=SFFÆ××wÛ¶m^^^óæÍãÊrErrrxMMÀÀ‘\***öïßúûï¿þâ…òòò=_zpݺuFFF555ÞÞÞ}š€‡@¡Àà²{÷†… rü¥U_8{ö¬¢¢bÏÏ?þ¼ˆˆÈ7`ºd…ƒHJJJTT”ÐÀi…ª©©)))éÕ%rrržžž4ÍÍÍ­Ó Y€Á ‹ŽŽ„ÐÞ½{{ÕLÂ-ÉÉÉø-[¯ìرCMM­°°000°’ð(t,.^¼XXX¨¤¤äääÄí\z„D"͘1£·W‰Ä?ÿü!ôçŸVWW÷A^^…ƒBmmí‘#GBþþþÂÂÂÜN§G¬¬¬6oÞÌÂ…óçÏ733#“ɇâxVÞ…ƒÂ±cÇêêêæÎkffÆí\zêþýûmmm¬]{üøq!!¡ÐÐО¬JàcPèÀÿ>þ|ùòeÀC- eãÆT*•µËíìì:::Xèåà'0a üÏÏϯµµuåÊ•œš°¸ÉdSSÓ®‹™÷Ü®]»BBBîß¿ÿüùs}}}æÖêêjü~ |›7oîùM€§A¡Ÿ{ÿþýÍ›7}||¸K/HKK³aĈÛ·o?v옷·÷ƒ8•õõõ·oßvppè‡{vܼyÓÄÄ A øœŸŸ…B±··WPPàv.½ðêÕ+™Ñ£G³dëÖ­çÎËÌÌLMM3g§rcBJJеÔ ?=þœÛ)€þ}tàgïÞ½»wï‰DÚ¹s'·séË—/?|øÍ C† qwwGAO-(tàgÇŽ£R©7n1b·sé‰'N:•ý8ÒÒÒYYY©©©ìGð(tà[ùùùwïÞ%‘HnnnÜÎ¥×ìííuttØ#..¾uëV„ÐñãÇÙà9PèÀ·¨Têš5kdee¹KïÉdöß[ÑmÞ¼YRR255õÅ‹œŠ àPèÀŸÊÊÊð`«mÛ¶q;—^{÷§¢IJJâÂœŠ àPèÀŸÎž=ÛÞÞ¾dÉ6.q…„„Ä/¿üÂÁ€ŽŽŽ$éþýû ø Ð€544„„„ „x±9!4a„-[¶p0àˆ#V­ZE¥RÏœ9ÃÁ°€ øPhh(™L622š8q"·saExxxUUgcº¸¸‰Ä7n|ûö³‘:ð …„rrrâv.,:vìX}}=gcŽ;vþüùß¿¿zõ*g#÷\\\ÜØ)--åVJð=(tà7qqqŸ?VQQ155åv.,š5k–ªª*ÇÃ:::"„.]ºÔÑÑÁñà=gkk;þ|„Њ+ð@ßB~sá„Ж-[ˆD^ýø©S§8vîܹjjjeee÷ïßçxðžsttÄ]­œœð€²´´Ä ]¿~½®®®†††¥¥å³gÏp¨yóæ;ÖÁÁaòäÉšššË—/ÏÍÍe¼WHHˆ©©©††ÆØ±c ûí·þ~Z¸WÿüPAAAJJŠ˜˜ØêÕ«¹ ‹^½zÕG³¼âæ¥K—XB£Ñ¨T*…Béèèhoookkkmmmmmmiiiii¡ÑhL®•———’’:t(gdw IDATãiiiiii„І p#œ»»{nnî’%KÊÊʲ³³BYYY/_¾œ4i’FsvvnooG!„RSSçλfÍšòòòÍ›7S(<''çÀÇ·³³[¶lYsssII Ë‚E=à+—/_F-[¶LRR’Û¹°èÁƒÍÍÍ}´çÊ•+ÿøã”””Ñ£G‰DZ÷BÝíg‚ùÜŒ:::™™™Œ{ÆOŸÆÐÆÆFLL,11qÒ¤IŠŠŠôÓœÍÌÌ’’’Èd²¶¶öû÷﫪ªäåågÍšúÏ?ÿ̘1Ç÷ððøòå ¾¶¹¹?‰DÒÑÑY¼x1ïþ,ƒBþÑÞÞ†Ú¸q#·sa¾¾>‰Dê£à’’’666!!! ¬E üúßë'Žð÷÷g¬rBÑÑÑ^^^ô¦„•J¥VRRÂð÷F?MWWwÓ¦Maaa¸–ôððàÈÂð(tàwîÜ©««›2eʤI“¸ ëú¨-‡nÍš5!!!ÒÒÒ/^¼üaáB¯]~¸¿;………¶¶¶ìgØõ.~~~šššþþþ***ûöíëIœÂÂB55µ¬¬¬OŸ>•””„‡‡ûûûÛÚÚâ7e PèÀ?‚ƒƒBvvvÜN„u4ÍËËëèÑ£l 餡¡A\\¼®®.--ÍÊʪîÒúúúÐÐМœ„PPP––ÖªU«ð¡óçÏ¿~ý!tñâEIII‰dgg‡‹aaa2™Y^^Ž;0]¼xÑÀÀ¾|ùòš5kF•˜˜ˆŠ‹‹ÃÓ-&&&úûûÇÆÆjhh´¶¶æççKHHô]ktF€O?~ü˜D"-[¶ŒÛ¹°®¼¼üÞ½{}Wå „&OžŒkAàC$éÊ•+)))øEUhhèßÿžžŽ$11±¼¼|øðëׯrrr}z»N :§KNNîS§ödH<¢EgmmmmmÝÛ à3Т? Ñh7nÜ@ñî¨rløðá6lè»øåååÒÒÒæææ …ÞøàWPèÀÒÓÓ‹ŠŠ ¹ [BBBp?•>òðáúº:ô¿Š0<<¼ïîàÕü ""!dkkË»³!c·nÝê4²š³–-[6kÖ,„‰‰É°aÃrrrÞ½{7~üø¾»#€»xûßDB¨½½=::!Ä‘±ÍÜåêêÚwcãñÔy***¡ªª*^‘´¤¥¥ÑkA"‘¸|ùrü¹¨¨¨ïn à.(tàm±±±¡¥K—r;veee=þ¼ï⻺ºîÞ½›¾I/ ñàKPèÀÛÉdòäÉ“UUU¹ »¦OŸ¾yóæ> ÞÖÖF¥RWµœ2eŠ‚‚BèæÍ›?]­À£ Ð€·ánÈü1/œŠŠÊôéÓû(øÃ‡»Î™×ÔÔЗð^kooÇ‹ ØØØp;pvv>pàÀˆ#ú"xiiéܹs;íüå—_Ž;†ú÷ßõôôÅÇÇ/X° ·wùöíÛŸþÉFš ?p;РЀ‡=~ü¸®®NMM0êèèø÷ßOœ8ÑGñ7mÚÔu§†††ªªjQQÑíÛ·>ŒÊÏÏ¿uëÖ­[·Z[[{[è 6ÌÓÓ“3邾doo¯¡¡Áí,@?BvïÞ=„PYYÙ»wïº6WðvæÌ™>Z[$Ç+w²víÚƒVTTx{{?zôèíÛ·x?žW°W¤¥¥]]]ÙLÀYÐG^E£Ñp¡ÓÒÒÒÝ:‘ N -ZD߬­­ ±¶¶?~ü‘#GB«W¯¾sçNCCƒ±±1BhôèÑ}”  ?Á«+xRee¥““BHYY¹¸¸˜ZtÒÒÒpSJ_X»v-þPYY¹mÛ¶¤¤¤ŽŽ„‰D²´´\¹r¥¥¥¥˜˜>Ï-:ð(tà=µµµK—.­­­6mÚÍ›7UUUóòò¨T*O¯èéááA/58ëóçÏ­­­êêê!YYÙiÓ¦á¡j&&&111]{}üøA‹ü‚‡ÿY`pjll´µµÍÉÉÑÖÖŽ‹‹SQQ‘——ojj*..ævjlQUU9rd_DŽŒŒ ¦oîܹsß¾}¡‡^½zµëùТ?B^ÒÒÒ²zõêÌÌÌ1cÆ$&&>!4a„O¿½ª®®vvvî£àjjjVVVŒ{ÜÜÜ:D£ÑÏœ9Ãx¨¡¡¡ººZTT´¦óô3(tàíííëׯôè‘‚‚Bbb¢¼¼<ÞÏ…N~~>~aÔ–.]Úµ÷³³3žÙoëÖ­ôý¸9gôèÑ¡òô'(tà  ÅÑÑ1>>~øðá cÆŒ¡Â…NNN÷²cפI“ð Å—™™ùìÙ³rpp8~ü8@رcÇÑ£GñNè ŸB@£ÑvìØqûöm))©øøxmmmÆ£|Т#..>qâľˆÎd« 6œ>¾´´ôüùóçÏŸŸ?¾¥¥¥……Å„  rssy´Ð‰6lÇÃÞ½{WTTtþüù?=ó—_~Ú¸q#™LFìµè$$$ØÙÙ :”å ìܹ“F£A¡3@¡ ‘H¦¦¦¦¦¦4íêÕ«;vì@555EGGGGG#„p•““³téR.çÊYYÙ¾¹xñâžleeõûï¿ã)vØ|ueff¦¨¨ÈNÐ×~¸öàKÐ^B ÊÊÊðggg瀀€ ˆˆˆàž%<ÚùÞ½{ì‹È»víêIs³³³ˆˆB·ëø:𘴴4üaÙ²e¿þúkxxøÇÃÂÂìììx´kHNNN½A?~|¯^! "„?~Üùú¼º€—´´´dff"„FŽ9yòd¼STTÔÜÜÜÜÜœF£q5;mß¾½/ZPΞ=«¬¬ÜóWW˜¡¡abbâãÇ—-[Æñ”ýZtà%/^¼hkkC™››wmáÑž•$ ¯eÁYwîÜÁC¨zeæÌ™¡§OŸr<W@¡/¡ÿ677çn&œB£ÑTUU[[[99<<ÜÀÀ ·Wéè舉‰}øðGß:B^’’’‚îÉô0<¡¬¬LTT”D"q<²´´4 a…„„ôôôh4Ú“'O8ž ÿA¡Ï P(x5ƒÙ³gãÁA|@QQñÁƒëééy÷î]Ö®>}:B¨»²¼ xFnn.~ÅcmmÍí\8†F£Ñ—aç ÔÔÔ±cDzv-~áõüùsŽfôÿ˜˜˜Œ;výúõx“F£Í;wìØ±3gÎüþý; ãââÆþHiiéO¯}óæ­­­¦¦¦†††………±±1½Wû›7otuuXH € x}`ù´iÓ¸› yzzÞ¸qƒãa“““µ´´X»vÚ´iD"ñÍ›7}Ñs›3gB(-- /–ž––†+’U«V±ÓVgkk‹ç Z±bE'ª¯¯ß°aCYYÙŠ+ŒŒŒòòòŠ‹‹[ZZðÑŠŠŠºº:(tOƒBž‹?œÐ;ôˆ‹‹÷ð.ãÆ366NJJZ²d ccLtt´——…B¡ïéT<á&„Ђ âââjjj˜¬ŠšŸŸO£Ñlll𦀀€••ÕãÇñU eÑ¢Eoß¾ÍÌÌ vrrzôènÔa! ý4ÿN+›v÷\ÅÅÅ6lÀUBÈØØ/U‹úôéSGGnµ¢+))é.7ºâŸ1ào¸Ð™2e ·á¤òòò1cÆp6fNNŽšš›óhhhˆŠŠ{{{÷ü* QQÑ^ ›rrrJJJZ·n]ee%}§ŸŸŸ¦¦¦¿¿¿ŠŠJDD^PѳgÏÔÔÔBééé$ ¿Ÿê޲²2B())I]]!D£Ñ’““%$$dddB•••QQQ“&Mš4i’˜˜˜Ï·oßFŒAÐiiæéºÎÓÝÝs)++?zôÈÍÍ ÿjŒÓ ())‰Ä¨¨(QQQ&ÏPèÀ²²²·BYZZZXXp6¦›››ÖÄ2MMͬ¬¬Å‹khhˆý¨¨hwè¥Õĉ/záÂ##£‚‚‚øøø;wî „¢££]\\„……Édrdddyyyjj*BèâÅ‹ôé°<øöíÛ†††øøø_ý·…Ô×ׇ††æää „‚‚‚´´´V­Z…RSS³°°8~üxffæ˜1c222²³³½¼¼„„„Bååå>|077Ÿ3gN]]]||¼ªª*}EÜÌÛÛ[KKëË—/ééé–––¿ýö“€çÏŸýú5ÎYRR’D"ÙÙÙáR¬»çrqqñðð°´´œ={vNNãCWWW…  fgg;::ÚÛÛ³óû‚A xëW¯Bô…<ùCUUcËû¨Tjss3 +?te``••5yòdö£uòèÑ#„еk×JKK¯_¿Žçø÷ß]\\öîÝ{åʉ¤¬¬œ——š‘‘A/t,--)ʆ víÚ…wæææž>}wï½~ýºŠŠ .tBÇWWW¿yóæ“'OÆŒsäÈ<& !4nÜ8aaa*•zýúuaaá9sæx{{ÓctttvîÜùÏ?ÿddd¨¨¨ØØØlܸ‘yÀˆˆˆââb„PXXBHHHhÆŒ¸swwÏC$Ïž={ýúu999333ú0.kkk‰tþüùÈÈH"‘¨  `jjJs@O@¡¨©©)//—””äø‹îZ¼xñÕ«W5559H$âÆ6½yóFII !„'8.99™qóêÕ«Œ›S§N½ÿ>“Ë·oß~ìØ±N; rssx¾   ‹‹‹‹‹K×CôãÝÁã­z°Ó£1bò\––––––øóµk×è]ÌÍÍùfe7ÀPèÀð{+]Ÿü‡¨TjII‰ªª*c&$$èëë3ï³ÒÇ?~<ê³B‡5111¸P¸páÂêÕ«544¸Ç”––FFFvtt466FEEéêêvêñË`xxÜ“Î<„H$–——sv9O//¯ŠŠ öãhhh¸¸¸ˆ‰‰××׳#Nœ8‡ õ/ßÈÊÊ:þ|``àíÛ· OŸ>ÍíŒÿ€x.tç”ãõõõbbb¸+G´´´Lš4‰#íx°Õøñã322Þ¼ychhÈ~LöõÅê§ã«+8 ZtàxNd>kѹråÊüÁÁ€""":»°ÆÕÕµ¶¶!4aÂô¿/À£ Ð` knn.**7n·sᤶ¶6mmm ¬ªªb3HNNNJJŠ””ú_^¾À£àÕ]nn.•JUWW§OËvîÜÉÁhííí~~~x$vŒ=úÌ™3D"!„ë0<3 €GA¡À@‡ÿÐ²Öøñøñã]»v-\¸ÐÇÇ'%%ÅÛÛÛÂÂw@Y½zõèÑ£B©©©xz½Âˆˆæ‡|}}ïß¿?gÎ@¡P„……÷îÝ+""ÂBn/_¾Ä+-pDkk«««ë°aÃØŒ#..NŸlpüøñáýû÷T*—>ž…Ý»wïBx´soÍž={úôé>>>!##£éÓ§Ó×4PPPðóóC¹»»Ó?üô^ïDåççÿùçŸû÷ïïmbUUUË—//((`á¡~HBB/KÉŽû÷ïgff⯠!$..®¬¬üùóçÂÂB>{oÀàÿÀ@÷þý{„––gÃÊÉÉu·‡É¡NÔÕÕq¿ÝÞª®®Ö××gáÂîxxx°ßAçßÿUQQa܃'3ìn">ÀÀ-: tø¯,ËÓ—––îÙ³‡þ™¾¿ëÊ^^^?=ÔIpp°®®. Yiii]¿~… ¨¶¶öæÍ›ôv&–¶µµ1îÑÒÒŠÏÍ͵²²b38€+ Ð`@«¯¯¯¬¬”PTTd-‚¢¢"½ ¿b®œ•J555511a!H^^ž¢¢"}š6‘H¤S§N±ÙY»°°p̘1&0Äõe^^^¯B>|XLLŒd@_ë´$;àcPè0 áæœqãÆ œÅ+'–íÝ»×ÁÁÁÌÌŒ#)‰‰‰Y[[³dÆ ‡ž={6ãNuuuÔËBÇÏϯ©©‰Íd@_3778ÿ›} ´> „øiU#L^^žƒejjzóæM<ù kêêêˆDâ¬Y³:í×ÐÐ ……… E@@ '¡/^ÌrŽƒÎÈ h¸-·+°àðáÃééé¾¾¾¡”””ôôtooï’’|4;;{Ïž=ééé{öìÁçÐuwÈ××ïÜ»wocc#‹O…ЩS§ðvö}øðáëׯìT9!iiéÿþû¯ë⋉‰ÉËË·¶¶³À-ТÀ€†`;–µË½½½éãÉŒŒÒÒÒNœ8±»—PÝòññ¡¾fYMM ™Lî4¾‰e***ÁÁÁìD P(]»`cãÆ+++ûðágZôhÑ`@Ã…ŸMâ’’’ÂÂÔ;Ýš2e ;îß¿ÿßÿuwù………ìÜÀ-Pè0pQ(”ÏŸ? ¨©©q;N"‘H]{𦭭MMM­Ó˜ðÞ’——ß¶m[wGñ—;Kx¼º`àúôéSGG‡²²²·sá$ N…ÊÊÊRQQas`9ó•(ð{Ã?ö$TcccBB;É€~³téRx5@¡ÀÀ…ÿ¸Ž3†Û‰pXll¬‰‰I§kX3}út6'¼víš²²²¡¡aw'àᅦ¯®***¶mÛ6oÞô'(t ª««¿ÿ>tèÐ!C†p;NÒÑÑ™6mûqòòòÜÜÜØ‰0{öìŽØÂµfii);·pŒº`€âËæ„І 8§ººšËëêêDEEÅÄÄzr2þ`¹+x: P¸ý@II©ë!__ß„„<¹pGG‡ˆˆˆGFksO§…BBÏž=›?>ûñgÍšÅÎôÊÁÁÁ………'OžìÉÉøW /† à!Pè0@á?«ŠŠŠ]ùøø455ÑÝ|÷î݉'vïÞݯùýLsss×ïß¿?|ø0û……BILL477g9•J]»vmO>|¸ˆˆÈ·oßš››{Ø  Ð`€Â…Î[t:?~<}ùîööö“'OVVV"„ZZZ-ZÄX ܸq#==]DD¤¶¶VCCãñãÇfffþùçË—/#""¾~ýzêÔ©ââbúh&&322nݺ%,,ÜÖÖF¥Rëëëñ¡¤§§ïÙ³oΞ=/û &&¶|ùrö¿œ´´´¿þú‹B§Wý{‚‚‚Baaaii©ºº:Ë7í7nÜøý÷ß)Êÿý÷ÃB€A ¨òòr„‚‚óÓ(JPP¶¶6Þ<}úôªU«èW={öùóçúúú¡ÿý·©©é¯¿þ‡‚‚‚¾}ûfff†Ú½{·»»;BHNNîðáÃô…yÀ   sçÎ "„h4ÚùóçéWíÛ·¯¾¾žÞæD§­­MO•$©çí1]EDD>¼ç—(**–••±_è|Æòå222žžž½½ :—.]233›?¾‰‰‰±±ñ¼y󌌌 gÏž=sæÌ3fØÚÚþ°vW/^}º»€x²ÜaHHHhÆŒ¸É꯿þúüù3NlèСëÖ­£O Í$ &G%++ûìÙ³ÇKHHèêêzzzŠŠŠ2d&è!(tˆp¡ÃæÔÆÃÃÃßߟÍwªªª¬]H¥RïܹÃ8bÏ9rdäÈ‘²²²ÕÕÕ•••lþ.¸²¡ËËËcÜ477ïnÆç©S§v7;ލ¨èž={º{ºî&''w—$cÿ­ž§Á$ µµuw‹°2yd&è!^À@TUU…ø«Ð©¨¨¸{÷.›UNZZÚßÿÍÚµD"ñýû÷¸;Ko}úôÉÉÉ §b“ø Ð` Â…?͸/$$ÄZk £øøx–ß[=~ü˜åÞ£¢¢¤¥¥q¡ƒ¯€B€7ðS¡3tèPúx–íܹó×_eáÂ’’’õë×·¶¶ööÂÆÆÆuëÖáÏøç€x : D555ˆ¿ ÐÐЬ¬,6ƒ 2„µÚåååëׯg¡E'((Ï’‡ Ð€7AgdœŽŽŽúúzÖBL·oßf­ ]DDDQQÑO—Óú!–]¿~}cc#þŒ×W‚BÞ-: 8µµµ4MFF†©çš­[·Nž<™©©©¬•JÙÙÙ¬5&µ¶¶:TYYoâB§¶¶–…Pnœoß¾!„ddd¸B9s¦´´´¤¤$44”8óæÍc3“¿ÿþ›µžÈZZZS¦LéÕU ôµ«ð̵Öí!ÿý—qþE~Zè466âUÀ@F£Ñ¸è'Pè0à°Ó¢̸°¹’’½9¯Þ·oŸ¦¦fNNޝ¯¯ˆˆÈåË—ñј˜˜Ç„ŽŽ@¥R;Æü^ííí'OžÄ“8·´´,Z´¨»ùmõôôØ\zº¼¼ÜÐÐ… ·lÙâã㣤¤Ô««^¾|)'''//ϸ¿ºÂehw$$$¦OŸþàÁRýÉ $ Ð`ÀÁËk³6äŠB¡ˆ‹‹3hý÷ß8p@SS!¤­­­¢¢B!ûõëW???¼I&“=<<~z¯Ó§O¯ZµJAAož={öùóçúúú]ÏTVV¦wéeÍáÇYøOðÏŸ??|ø…É”÷îÝ»eË–%K–0îþþý{[[›°°ð/9rdHHHooè;Pè0à°SèP©Ôî 2dĈEEEªªªUUUâââôbÏ üé½bccqsÖÑÑA"‘~X踸¸üþûï,¯QúåË‘Þ^¨¨¨Ú]QÒööv ++«®‡$%%«««ëëëûî2(tpØ)t„„„¾}û†»ÍveooïïïøðáÆyŠ»–G=iÕ—••¥71A¥Rÿý÷ߟ¾câÌ™3ÒÒÒžžž½ºŠF£ ü°ðbNHHˆ±ìc„ ††(tàü3K|ƒL&#„$%%Y¸vûöí¿ÿþ{ss3Þ¬¬¬\¿~=½ÿìСCEDDŠŠŠ¾}ûÆØEOO/88˜¾YWWöÓ{M›6íÚµk?=J¥ž9s†µS˜¨¨¨‰‰Io¯züø±Mo¯ÊËËsssëî(þQzÀ-ТÀ€ƒÿŽÒß+õŠœœÜŽ;|||H$Fô÷÷gì×ìàà`ccsþüyƫ֭[wñâE'''iiiyyyú’Rû÷ïommMKKÃz$%%é={vìØ¸}ûvqqqÑÿcïÎã¡ÞþÇŸ™±S*e ©ˆ‘¥6²¤U+¥nJ -·}¹-W«í·º]m„¤ˆ²•¹R¢B²’f̘ßçÓüæ;›÷ Ì¸¯çŸÇÌyŸó~|>Ÿ÷«³½äåUUUmmmñ NRRRÓ¦MkÅ϶mÛ¶V´Š···µÕ±cÇŒŒŒ]ʼn$:ˆœs uBHWW—½½œ—šššµµµ©©)W¹§§§§§'oý]»v º‰DZ¶lY‹ý >sæLRRRë6¹dddôìÙ“k¾¾¾t:]ÔVÇŽc0‚®â? ;)@üÁÔb¿G¹6Oµ—;wî8;;ÿŒ; _^^Þê­¼§NJHHµUVV–½Q‚”––ÊÊÊ ùÍ+))!Ñ@¢Àˆbçû÷ïèÇ;µíÞ½›J¥>~üØÆÆfèС­[Ô 6lprrjus33³qãÆ‰Újݺu>>>ŽŽŽÄ›TUU=úÍ›7B| ÿø¢R©ñññ"ut”iÓ¦ÁQ:ÿè vð{´ÝGtvîÜÙ¾7$ÈÈÈHȪ—­X±BÔ& ƒÅb‰z ò‡ÜÝÝ…ÿÚñUöZo^•••«V­j{b/ð³Ý¹sgêÔ©èü@ €ØÁN[¶)‰¯_¿ÚÛÛ_¼xÑØØ¸Íãââúõ맯¯/R+))©˜˜QŸ5|øðáÇ ¯ƒáktTUUíNâãîÝ»Ýð‹ÀÄÎÑÝ9ÜÜÜâââVNýõ×_"5a±X[·nõå7näååµX­Å€¸@±ƒß£òòòÝ‘v`ll|äÈ‘¾}û¶®¹Ý˜1cDjòèÑ£ääd‘¦$h4ÚüA£ÑZ¬‰OgÆ‘(@"ÀÔâ…F£577ËÈÈP(”ŽîK;PPPpwwouó•+WŠÚD[[{ëÖ­¢¶Ú´i‘…Dx˜ $Œè ^ð¸B+ò:‰'GGÇÝ»w·®íßÿ‘‘!j+]]]‘–!³X,YYÙ… ©Œÿ.¢ö ÐQ Ð@¼à—¨D:iiiì3÷Þ½{'êa6lL&S¤&¡¡¡"5‰ˆˆ ’ª“••E?‚Q€D€@ñ‚_¢ø…*¡¶nݪ®®niiéáá1wî\ÂÂBQW#„<<<ÌÌÌDjòÏ?ÿˆºˆûòåË'N$Xÿ]`D kt/8kA«GAĽ½½µµõŠ+222222îÞ½{àÀÊÊJssóÓ§Oëêê¹IjjêÂ… E=æääÉ“¢îE&¾îÿ]Z‘YÐQ`Dñ‚Gt$:б³³‹‹‹344œ={öÞ½{£££‹‹‹§OŸÞ¿‚QBÈÕÕUÔ³ph4šH±QTT”H³„xD$:ˆ—¦¦&$ᎉ‰É÷ïßsssÙ%W®\IOO?|ø0Á;466Ö××[[[(“É2dHuu5ñ&/^¼Ø±c‡HË€`D‰â/ã•’’àie‰dggÇ>y6++kݺuÄWÏÈÊÊ^¿~]SS“øCsrrz÷î­¢¢B¼ Nß²e‹H¿j\YHzs‘L˜0Aï‡GµË=\ Ð@¼àiiéŽîH›ØÙÙEGG#„êëëgΜ¹k×.CCCâÍLMMEz¢‘‘Qll¬HMFŒ1kÖ,‘š´o ãåååé鉳·^¿~½]î àâ¥Œè „ÆŒ“’’B¥R½½½MLLÜÜÜDjîááñàÁâõkkk«ªªD:bñÏ?ÿ$’ó @q0Úv3gΜ2e •Jµ³³KHHøòå ûƒÁ8v옥¥¥““{¼KIII®®®†††VVVëׯ/++ã|ÜÕ«Wíìì ôôôFýǹ€¤“ìÿ3 óÁKF$ýXdEEE33³U«V={ö,!!A¤¶ t:ÝÁÁx“7n<}úôŸþ!X¿´´ôòåË«W¯©c!2™Œª¨¨ðòò¢ÓéMMMMMMøþO*•*Ò¹É ¾¾¾6667oÞôôôÄå[¶l¹uë–­­íĉóóó=zÄžøt)..ÎÛÛÛÈÈÈÝݽ®®.>>>55õîÝ»8?×»wïvïÞmee5f̘ººº{÷î•””à ¹@'â¥s:!''§?ÿüóþýû¢fô”——ÏÍÍÅ:)((xxx¯¯¡¡qùòeeee‘:†§ÕÕÕ ™iêÕ«Á»ÕÖÖÞ¾}ÛÞÞ¾gÏž£F ÃNiié­[·¼½½×¬Yƒknذ# ¹äïﯬ¬ „œÙ5:„?¹TXXÈ`0Î;ÇùöØŒ¥¥åâÅ‹ƒƒƒ_¼x’’’Z·n^%ä:ˆ}šxÂó   Q£Féèè¬ìر¦¦¦;wŠÚ±;vôèÑ!$//?{öl¾uòòò©,+((HGG‡=Izýúu UUU„Pzzú€¸Z ¹¤­­M&“#""øž˜——§««ûêÕ«ÂÂÂ’’’ÇÏœ9³[·nB.ùAsè ^:͈N~~>ñÔ luuu eòäÉë3 ___¼Ã‹ k×®EEE‰Ú1rðàÁV¤³àuòäÉÂÂB+++‡èèh•»wïš™™Í;×ÚÚzûöí<èÓ§ƒÁøðáCfffBB‚‘‘‘ KÞÞÞëÖ­stt´µµ•’’ÊËËËÌÌ\¶lÙ’%KB÷îÝ;|øðÝ»w h4Úû÷ï•””ðù‡B.Ð @ ø)nܸъmØ]ºt)--%> Å`0|||ôôôˆ?"33³f²²²éé鍯ÛðtUjj*ƒÁppp Ä»À.\¸0wîÜóçÏ>|8>>>!!AFFFOOoÆ xˆEÐ¥)S¦ÈÊÊž={6,,ŒL&kjjÚÙÙ±¹khh¨ªª>þüÉ“'JJJ–––ëׯÇc?B.Ð @ hL&“B¡´b“ü¾}ûœœœˆçò”““[¹r%ÁÊ Ãß߯ ¢ö***JOO}uk#®Íh!!!œ_•””víÚµk×.Þ†B.988Ú­6eÊ”)S¦ˆz €N@â‡Çb(33sܸq¢¶b2™þþþÅÅÅë×ÔÔˆ´¦8$$$%%EÔ^}ûömÆ 8Y§YAÀŒè ^ðêœv3è@?~ìׯŸ¨­>}údhhhooO°~XX˜H»ºŒŒŒZ± LIIéСCx $:ˆ—Îè8999::ŠÚJCC#))‰xýE‹‰ô”!C†ˆÚ¥òòruuuüµÓ,à¿þç €xéNeee+†=V­ZuïÞ=‚•©Tª”””––Áú“'OæJ‰Ð"‹µhÑ"ö!7¨çÀ:ˆ—ÎèL›6íÍ›7-V£Ñh[·nŽŽ®­­¥R©×®]Ñûöí;yò$ÁÊÉÉÉUUU½{÷&X«¬¬TTTäÜë#:H˜º@¼àÑâï{1Äb±JJJˆlù–••ûöíâÅ‹ûöí«¯¯ÿõë×ŠŠ uuõÛÞ¼yóîÝ»»4|øðk×®‰:Ȥ®®ÎY#:Høw âoÉnÅ 4âƒD"•””ÈÉÉ©lmmíææV__¼téÒøøøQ£FYXX¬ZµJø/!++«ÿþDQVVÆ`0D]½ÿþwïÞqvŽÜòü§@ €x‘––Fá4ª¦¦†N§¬þ¼|ùòÌÌL"ΙLfYY™»»;‘ΰõë×ïÆ8³'"#:T*U¤” C´K  Ð@¼àüØèÐéôAƒ¬¬¯¯ÿåË—ÊÊJ555„‰DÚ»w¯&ÕÕÕ‹/&å „( ×Ä-zõê•©©)ßôÝx¤ ÿøRRR:tèýû÷Ez"øõœá<¤ÿt/ø%J|êG ­]»–xe2™leeõìÙ³iÓ¦?~üñãDZ±±ÂWûlß¾ÈÍ«««CCCW¬XA¼?µµµóæÍ 366æ½Úb £¦¦võêUâülè ^pÖhœp@B¥¦¦ZYY¯oee•””$++{ðàÁ¸¸8áC5ÙÙÙ¥¥¥&L rç£GŠú¯ö¯_¿zxxðr@ n Ð@¼Hz S]]=kÖ¬‚‚âMºwï~åÊ•K—.………ikk ¯|éÒ¥îÝ» t~ûí7EEEâ=AéèèlÞ¼YÐÕÆÆF„Á eq»®/ø%Š_¨’¨ººzذa"5±³³«¨¨8zô¨¥¥e‹•çÌ™Cpe1“ÉÔÕÕ%r$Æb±¦OŸž——'¤@q0 è ^ðKTr}}ýàà`‘šôéÓçâŋӦM#RÙÌÌLSS³ÅjõõõÆÆÆ Ä»ñðáÚšáÇíÀˆÄ‹ŒŒ …Bijj’ÐÑsrr¨T*ñúT*uìØ±ÎÎÎ-Öd0&&&D2K „’““­­­ååå‰÷dìØ±¡¡¡ÂÓ;Ô××#„Dº- cA €ØQPP@?Þ©gÇŽ?&^ÿÑ£G¼ÇÕðuãÆŠŠ ‚§!?þüùóÄ»ÞØØØ«W/áÕðˆ:Ht;ø=*¡Ž¦¦æÀ‰×7nÜž={ÖtéÒåÈ‘#***-Ö„@‰ÛË;’è|ùòåëׯºººë._¾<&&¦Åš¾¾¾ÁÁÁ¼Y6yQ©Ô!C†ØÚÚìCSS“¶¶v‹ÛÚ1üG2ªD¥Rããã >t”~ýú™››wt/À/bGr'Ož„……?øÑ£G‡"## Æ.]»v=sæ ÁÔÕÕ >üùóçJà?ŠÊ•••«V­;v,Á€_¯¨¨ÈØØ˜øI€¤ƒ@±ƒß£"í]²²²£F"^ßÃÃÃÉɉHÍääd"g?{ö¬¨¨ˆÈ »þ¸qãF9¡ºº:$4ÐA©ªª;vŒà Á¯Gphtè vºté‚~¼S%Ëĉ‰Wf2™d2¹ÅN¡§OŸÙœuôèQ‚çñ`'N$xÈ2†£Oâ ÃÁbdÄŽä:wîÜ!~ÔaZZš½½}‹ÕX,ÖÌ™3¯]»Fäž{öì!>œ³eË–††á D¹à? þ$:ˆ tX,Ö²eˈç]ÏÍÍ9rd‹ÕJJJ¤¥¥—,YÒbͯ_¿8Pø‰laaaÏŸ?5=gmm-B¨k×®"µt ˜º@ìtëÖ !TSSÓÑM}}ý˜1cˆnnn,«Åj}úô)**j±Z~~¾Ýû÷ï ŽÐŒ?ÞÈÈH¤áFt;ÊÊÊ¡oß¾utGD£¨¨H|¿U}}}}}}‹ë‹ ÆŒ3ˆ¤¬zóæÍÒ¥K .UUU=zô4h¡¾þÀb±ðÿÄŽ„:éééÂSsJHHðððà{é?þ¸té;9qâÄóçω¤\˜ÝËË+99!tïÞ½ÄÄDüŽˆˆ@M™2åÔ©Sݺu -//·³³³³³C¥¤¤ „®^½zïÞ½?ÆÇÇ#„ÂÂÂÚøÓ n`Dq„ÿá^YYÙÑ!$##£ªªjüøñ-Ö 2‚©¨¨TÈÏÏwwwþüyŸ>}Z|â‰'ºtéÒb5A˜L¦††ÆîÝ»étúׯ_¥¥¥Û¾½þŒOCs¿ÿþ;‘~FEE ¯ÐÜܼlÙ2333Aššš¶lÙ’˜˜Øâ³ Æ¢E‹„ìN®±±ÑÒÒ’½&**j×®]¡ºººÖÝÐQ Ð@Q(”^½z577‹ÿìUUUUdd¤´´t‹5?.$óBˆB¡,]ºTH&“I&“çÍ›'üA8'Të\½zŸSÌöúõkœn½-G::ˆ©Þ½{#„>~üØÑi””ÔöíÛ‰ÔTUUÅùºùúþý»±±1×ɼ8+›ŒŒL~~~‹G_¸p+R!ŽÅb?ß°±ÃͶ,mttSššš!v®i±Õ½{÷E‹µXmï޽ׯ_R!&&ÆÔÔ”B¡pnÛ¶mîܹ?Fá-TRR-o¡ˆˆˆžbB‰ôøñc===ÎBöFì4 IbJR   öqvB$&& ÏéêêzôèQ®ByyyYYÙeË–ÙÚÚ®]»Vø:e„Pnnnrr2‘`ˆƒÁ˜1cFVVï%öˆ$¼@â@ €˜ÂÙ…ç‘‘‘UUU-V‹·¶¶tõÛ·oÍÍͼ{𬬬JKK<¨££óñãÇ£G~ùòEÐ}6lØ‘‘A¼óœðIÁø$b.8Ð!‘H8úH8G1…JKK;º#-ðöö644^§¶¶Vø¨3gÎÔ××ûúúr•+))}ÿþD"áã}ß¾}{äÈssó™3gúùùñžÝçääÔêÕ9#GŽ´²²âš;C577ãH®gÏžrrr-Þ‡J¥âlS@|ø¶mÛvìØÁ;,Äd2W®\ùðáÃV,/}õêÕáÇ9×å455%%%åää|ýú•]ÈÑ@ISWˆ/üf-((è莴råÊíÛ·khh©“ŸŸokk+誆†Æ–-[]•’’úöíÛíÛ·­¬¬øVøë¯¿ÂÃÃ…,sÂÔÔôÆœ{Ú¥¥¥·oßž™™‰’••UUUUUU­®®ÆW_¼xÑÐР¦¦¦¦¦¦ªªÚbút€8€Ä~ß¼y³£;‹ŊˆˆèÒ¥‹ðj/^¼PVVæ{)???((HH[]]Ý÷ïß ŠrBÖÖÖÿüó‘Ü霚ššN:E¡P ÄuiþüùøF+))IKK+,,Ä%û÷ïwww·³³355UWWwqqé¡€#:ˆ/¼á(###**J _«ÍÍͧOŸ’¾ !ôìÙ3###A‹©¯]»&huB(77·ººzذa‚*›™™ñÝ.ÜêÕ«¥[wuuݱcNÏÎΖ’’ªàP^^^QQ‘™™YXX(%%µwï^QŸ øõ Ð@|±Wç¬X±bÀ€ìØþp¡P(S§N^gëÖ­¬xxxY§|ôèQ}}}Am³²²ÆŽ»gÏžVœèììlggÇ÷R÷îÝÃÃÃwìØÑ¯_?ΫL&søðá………K—.555õ¹€_¦®_ééé! *•êîîþíÛ·ŽîÑÿqýúõ!š››{ôè!dâI[[[ÈžíñãÇ/_¾\ÐÕsçÎ 0€H>QNoÞ¼¡ÑhÎÎÎBÆðìÕÅ‹ySk9s&55UKKKȹ;±#:ˆ©ªªªœœEEÅ„„„±cǾzõjÉ’%!!!B¤ùÅRRR„2‘Éd! Œ¼¼¼æÏŸ?jÔ(A\]]…ÜüرcL&“7cƒŸ>}š={ö… „¯é=z´ŽŽNaaabbâ„ ØåeeeÛ·oGùùùñ=õ!D¥Rããã‰w t”#FðæV:ˆ©Ç³X¬Ñ£G+++ߺuËÒÒòÞ½{ûöíÃïZq°víZ᛺CBBÆŽ«¦¦Æ{‰F£ÅÆÆ8p€oÃêêj›ÌÌL¾QƒÁ˜Ä:ˆ#tèÐÝ»wOœ8QÈF-.ÍÍÍ‹- %XŸ“ŒŒÌ¬Y³B^^^ céÒ¥ƒnÅ} ÄÑá t BBBÖ®];oÞ¼ºº:„ÐÑ£G£¢¢:ª‡+W®|þü¹ «ÍÍÍ{÷îíÚµ+樓ŒŒüü|A 555ýýý9K¨Tê€Ο?G&“‹ŠŠð2m"  ÆŒ3Öç‚g¯š››UTTàà$ìº@ì|øð¡¼¼¼k×®¥¥¥·nÝJIIINNf§–D‘H¤XZZvàìÕ‹/¼½½]•——g'ââïïoccÓ¿ÞKñññRRR\ãXuuu8`|˜ïÆ(CCÃÙ³gómuàÀõë×sÖÖÖr>hÒ¤Iqqq!!!ïÞ½èäççÏž=;%%¥-ç+ÖÔÔÐét …"êùËñbOÍÈÉÉ™ššZXXôêÕëÏ?ÿDðÆŸ.ÃWUUÕ“'OTTTø^ݸq£ †^^^¼gñÕÕÕ±£º—/_.\¸P[[;%%Eøör??¿+V´ñéwïÞ!„ EÚ®Õ!F]^^ž ££ÓÑ}@¼ÀÄ΄ iiiݵÿ‰‹‹²fEYYùêÕ«|M^¹r%ç§ÆÆÆÙ³gó†xD‡N§oß¾ÝÑÑÑÇÇ'((¨ÅCtŽ?Þöa˜·oß"„8wø·£ &èý@|ÕB(##ÃÒÒ²¶¶–³pĈíÝA: t;óçÏ733cïd–••Å[£ËÊÊ*++;´kÿ“-d£µŒŒ ßQÙÙÙ>ä{Nà«W¯† Â÷nß¾}ûðáÃ!CÒÓÓ?~<|øp##£¹sçæää°Ëcccõþ/Xuþ; Ð@°»{ñâEÇö“’’´';;[JJŠ7¹7‹ÅRPP=z4ßVK—.å{èpee¥½½ýóçÏ…g2Çrrrž>}ª­­Ýbå1™ÌwïÞ‘H¤Ÿw|N`` ‚‚‚¯¯/gšwKKK{{{viÓ¦Mœ8‘ýÕÓÓ7ož——————­­-ûjllì!CæÌ™SPP°téR&“‰Ëñ„ n‚£ÀaÆý¤ q‹‘ÖÖÖ!YYY1ÑÑÕÕÍÈÈàfB†††7nÜà-¿}ûöéÓ§y/………9;;+((p•744ØÛÛÇÅŵ8ƒªªª²³³»pág”ÐÙÙÙ4MKK+<<œÆNç-¤R© Dî_[[{ûöm{{ûž={Ž5*,, ‡zººº“'Oމ‰ÁÕÆÇd2ãââðWWWWee常¸¥K—ò&Uõ÷÷Ÿ4iBÈØØxãÆ•••83—©©éŒ3þøã˜˜˜óçÏ㈧]~Kˆ?txý …Bqrrêè¾ ªª*‰Ä7ÊAÑh´¾}ûò–GDDð]0ûñãÇÍ›7O˜07ÐÉÊÊ1b„ºº:‘^íß¿¿OŸ>vvvD*ñêÕ+„P×®]W­Z%RÃ^½z©ÞÐЉKÒÒÒ,,,Dí''ö,þe655á¯|ôèÑÆíìì„$L ó@ Э[7¢¢"ÎyŠŽÒ«W¯ôôt¾— ðáÃÞµÀgΜ¡Óé¼M˜LæöíÛ»wïÎ{iÈ!ýõ‘.UTTøøøhjj¶ã>pœQkÈ!²²²222rrr²²²ìÏ222²paeeåæÍ›[¼9‹Å ÒÑÑa•zýúuÎ@‡kF£ñ½ƒH?NZZš···¹¹¹¿¿SSÓÓ§OyŒÐ)A €d|ø ««Ëw'”¶¶6ß…±>>>;vì 2:rþüùƒ¾ÿ¾½2nVTTܺu s3gδ±±!Þ6//Èá='Ož,,,´²²211qppˆŽŽVQQ¹{÷®™™Ùܹs544Ð1ª÷ïßãTx® o­ßºu«¡¡ayyyJJŠ‹‹ †.^¼8þ|&“º}û¶B¨°°pÉ’% zzz'Nœ())¹{÷î³gÏˆÌ  é`12’Ï^½|ù²£;‚¶oß~ùòe¾—ÌÍÍù¦ßòôôÄiJ¹œ8q"!!·<66655•ïFt._¿~Ý·oßš5kÚ+Êijj1b„¬¬lff&‰D233k—ÛrÁÓU©©©ÿüóB(000//¯¡¡áÂ… !ccã;wfff^ºtéõë×úúúˆcé©é† rss¯\¹’››;}út//¯ääd„PPPн{÷ñšžˆˆÜ$;;oG>wîÜÝ»wB|Øè|`DÉ€qXŒ\PP0f̾—^¼xaiiÉUØØØH"‘xOÖijj:qâ{™-§ñãÇ÷íÛWZZZxOh4Z—.]>LdO CZZúÙ³g•••4MOOOHš‹¶à ïBBB¸*ÌŸ?_P²0„Þo%ä†Ë–-ãüêààðáÇVö #:Hsss‰ôæÍ›ÿ‡xpp0ßå•••³gÏfoif“““{ðà´´tbb¢®®.Wyjjª´´4‘º9sæ\¸p¡½¢œ³gÏâI4uuuP¶qi0@@ €dPRR8p NÏÈÈèÀn0™L‹Å7½CII‰££#דÉôóóã­ÜÜÜ\YYÙ§O®ò‚‚‚9sæ°OÏ"00ðéÓ§Ó§O¥ûÑéôØØØà¯ø¼"ÞÑ)€Ä@‰:öÌÀwïÞ ZœkiiyêÔ)®Â¸¸8¾‰œBCC½½½yË?}ú´eË!CÙ ±#ƒÁHMM•‘‘‰ˆˆÐÔÔÄ…©©©:tC‡E¥¤¤t`ÊËËy'›B,ëÚµk¼å|s;ÔÔÔà A\†Ê÷ˆdNÅÅÅ666ƒn{ºÍïß¿;688˜³ðË—/yyyòòòƒ jãý$†••ú1ØÐQìíí/^¼È[þæÍÞrsss¾‡ø-_¾œkd¨±±ÑÞÞžw‹ÅZ¶l•Je>}º‚‚‚ŒŒL+ nnnGŽá,LMMe±Xæææ-®†ˆ?túúúÊÊÊeee8¿c‡¨¨¨à{(NçÝ%ÄwÞjóæÍõõõ\…ZZZ¼áK~~þí۷LJ³TR©TCCCöi­öúõë}ûö‘H¤eË–qýDøÜ<~tè 1H$ÎňßÄbÖ¬Y|E¶°°àM•ð×_ñoóäÉ“„„999®òeË–>|˜÷ÎéééNNNÛ·oŸ4iÒ¶mÛž>}zõêU¾gG£Ñ\]]%¶Ä“ƒö€Î$ÉðáÃBøt¸Q\\<`À®B:~åÊÞÊkÖ¬9r$W¡¾¾þ‘#G¸v›_¹r…D"ñ]ƒüêÕ+KKË Ü¿ÿÖ­[aaaìN­óåËYYÙׯ_óÝ$O£Ñ^¾|I&“!Рs€@I‚gÏžuT yÓy>~üøúõë\…ÍÍÍ®®®\³B,KUU•kuNllìéÓ§…/¯_¿Æ»Ÿüöí[6uêÔÊÊÊVtžÉdnÚ´iýúõèGÚK^/_¾¤ÑhFFF?é¨@À/'# IÌÌÌäååsrr>þܳgÏ_üôššyyyÞi#UUÕ%K–p–ÐétSSÓW¯^ÉËËs–{zz.Z´ˆë”ä^½z=z”ïââæææ×¯_³îëÞ½{TTÔ¼yólmm¯\¹bmm-RÿkjjNœ8!¤ÎÓ§OÑ€²u¨T*N5ÄVëe ¡ Ð@’ÈÈÈX[[?zô(99ÙÅÅå?=88¸°°ðàÁƒ\å&&&&&&œ%iiiúúú\Q•J}üø1WœÑÜÜ,äâ¼¼¼^½z±s›çææ>ÞÍÍMGG‡xÏ©TjJJÊøñãÏ;'¼æ“'OB£G&~sNJJJC‡½ÿ~뚃_£_¿~8s*ø/€@ 3jÔ¨G=~üø×:L&ÓØØ˜«°¢¢">>~Á‚œ…ÇçÌRRRzýú5gôSXXèì윙™)(ãwzz:ƒð&©xzz¾xñ‚úñíÛ·¡C‡®[·nüøñÂkÒéôçÏŸ“H¤V訩©]½zµum?:H<ØÀ7øÏÆ÷,ãÄÄćr:x†‹k_UUU™LVQQá,¼páÂÒ¥KE9¡W¯^ÉÈÈ8;;§§§ÎdR€ IDAT¯X±âèÑ£¼+„Z¤¬¬|öìYA‰H9½xñ/ÐùõÓ‚€Ÿ$Œ¥¥¥¢¢bNNΧOŸÚžA$©©©–––\닇 ¦¯¯ÏY˜““sòäIΓ'O655íß¿Ÿ³pÏž=B¶P1Œ[·nÉÈȬ]»6  [Ê£¢¢’““÷íÛG$ÊA%%%!„å¸H"Øu€„¡P(#FŒ`±X|Ïâûyjjjf̘Á[Þ¿ÞœPîîî\%RRRk×®emjjÚ½{7BHÈéÃ.\èÞ½{ZZÚÂ… [åÔ××ïÚµËÍÍxü+µµµõY±’O<|øðW>´ººzĈ\Ã9oÞ¼9vìWMoooÞc…wìØÁ9þtôèÑ‚‚áO\ºtiLL ßLé±X¬²²2…ÿý—x¾ªººº´´4iiiÞ³’ $tˆÁ`¸¸¸:ЯE EOOo6 áBcÇŽmÝsâ #wB/^¼8~üxG÷´ wïÞ¼ÒD"‘ÆwíÚµ„„CCÃöí˜ ¾¾¾sæÌáÚÓÞ£Gμ Ë—/×ÒÒâ¬ãææÆ™l!>>þÈ‘#qqq‚$%%hjj*j?~ü˜’’2mÚ´={öˆÚ!”˜˜ˆš0aB+ÚÄ:PiiiiiéÂ… ;º#@ ?Þ¾}»-w˜0aµk×îÝ»ÇwË÷Ï ¥¥eddÄYrÿþýgÏžíØ±ƒ]¢¬¬¼nÝ:Î:T*UII©ÿþì’èèè-[¶zJXX˜‹‹K+¢œïß¿1âÈ‘#¢6Äòòò ºwïnffÖº;Ä:SïÞ½'MšÔѽegg·1Ð;v,…Byþü9Fkc*o‚xÇŸ9×WUUíÙ³‡s4‘ÅbMœ8ñܹsœÇ ÉÀððáÃ;wÚØØðæ6ŽÅb)**>xð _¿~"5d‹GM˜0AÈ¡>DP©T|+ þ¦M›Æµ¸tJè ‘ºuëfeeõüùóøøø_pDòׯ_«««õôô8 ÷ìÙSWWÇþzíÚ5®×Faa¡¼¼<;Ê©¨¨¸zõê† =ÅÔÔ400PMMM¤¾;v¬¬¬ìСC­ŽrÐ@ÇÞÞ¾ÕwÀ*++W¬ö2´ëÕÆû€ŸíuDùÔ©S!Ðù/€@Iåààðüù󸸸_è<}úôÚµk×®]c—à‘$Î]Q‹/þòå g«~ýúqf}Z¿~½ ´VMMMoß¾533ã\ñÓ"‹õùóçøøø€€â­xÕÕÕ={öŒB¡´Ë®j²îçaþKܽެèè.€_v] ©&NœˆŠçÚ¹ý3ÈÉÉq¶jÕ*öWƒ¡¤¤Ô§OvIFFƇ8›¬_¿ž³ 'Ÿ .ˆÔ¥/_¾899Þ½{W]]]¤¶\éH@¾šššðtè” Ð@‚á½u¿ ÐY¹recc#ûkuu5ƒÁ`'g “ÉÙÙÙœMöïßÏÎcõôéS___ÞÛVVVNš4)''GÐscbbΜ9ÃY8nܸìììÕ«W·úÇáôìÙ³šššêêê¶Ë b$ØÐ¡C{õê•——÷îÝ»Ÿ÷”††›îÝ»³K.]ºÄy|NRR’ŒŒ ûkqq1ç¬B(""‚ï2šòòò+Vzt@@ÀÞ½{Ù“bµµµ;vìØ±c‡¹¹y«.øæp:@Rݽ{×ÀÀ@OOOOO¯¨¨¨£»Ó1(Š““úñ¶þIäåå¯^½ÊYÂ`0Ø;±ËÊÊ-ZÄ™öáìÙ³ÎÎÎøóýû÷¹Ú²566š™™ 9ð0???33óÁƒëׯOIIÙ¶mÛçÏŸÓÒÒ8“N´‹ÅŠŽŽFý‚k€wOŸ>;wî AƒLLLfΜ9eʼjÕÔÔÔËËËÎή£;ØÁ¦NŠŠˆˆøyxýúunn.gɦM›pbQ„Pyyù¢E‹8WØøúúây%‹µvíZ¾9­®_¿îææ&ü¹—/_^¸p¡µµu``àÌ™3CCC»téÂ9°ÔvÉÉÉŸ>}êÛ·o+ÎbH8GˆµÛ·o¯[·N]]}úôéMMM=ªªªÒÖÖFiiiýþûï±±±÷îÝëènv$›=zääädeeý¤¼WÁÁÁ::: À_óòò”””ØÇúYZZZZZ²+§§§›™™uíÚ!D"‘âãã¹Öî`§N:wÒh´àààääd„½½½¿¿?ßU>mtëÖ-ô#Xüõ2¢*®üöŠ·|ëË1=´å}è”`Dˆ¯†††]»vYXXÄÇÇûúú8p !!¡G-f©!´lÙ2¼Á;%%ÅÙÙÙÌ̬ŊŸaúôé¡7nü¤û»¹¹qžhܯ_?öŒá¹sçž={ƾT\\<}úôÞ½{#„6oÞ|éÒ%®[577Ï;7##£Å‡^¼xqÅŠœ%³gÏ.,,\²d þ»´ÝãÇ«ªªôôô:vÞjÜj]«9š¡ñkÿ÷„СIë{ÅlÕ‰¯È¦¢_·hÇ—eÔ±y²¾WÌú^1çfü»Y+n‡Áý¸¹ìè:;±ê¤cò&͸ Á+3¾–´[\€„‚@ˆ/œG ¿5ÙŒŒŒøN…°ùûû+++5JFFFEEeôèÑeeeaaaøêŠ+nÞ¼imm-++kddT[[[UU…9r$Bèâŋǎûã?6lØPYYY^^ŽÒÕÕ}ªªªª®®þúõë·oßêêê¾ÿÞÐÐ@£Ñèt:“É4V4räHuuõ—/_y®H¸¶¯/_¾œ=3}úôÙ³g³/ 4ÈÏÏ!Äb±ºuëÆ{rZZZ}}=Wt^ïÞ½Ãf………óæÍSWWwqqqvvž1cŽMÛ‡†3fÌh—»µBw-yùnÒJ*2œ% Ý¥ºK[ÎÑDéŽèÑ]K!d0¶'Bh€­J>òãÖèšNRGå=ýb6MCgH·{G><8ž‡ÊŒ®ügÎ ½yÄ¢>FUßÅ}:3%…FetÌ€x€5:@|áÖµµµ"µ*,,d0\Ã*%%%øCddäÆ9Î#éðꄞ#>rÀá˜8qbllluu5gZoAZ·GšB¡Éd2™L"‘È?àMOׯ_o—“‚9½ÿþÀì]TÏž=SQQao;v,»æíÛ·ñª^‹E"‘Nž<É{7++«ððpö<‚ìܹSZZÚÀÀàû÷ï666666›7oæÌ/Ñvx«ÚÌ™3Ûñ¶"Ñ6WöÍý?Ùµ4M»þù~BhÂZÝŒÛ_Ëe(!êgº´¦¯](**²8F;wÎÑÑ:^^^[·nÕÑÑA1™ÌÝ»wãÃýŽ=ª©©9gÎÎû®[·.<<¼Åî}úôéßÿ]²d‰«««ÁOÊ/SWW§¥¥ÇøÉd²?777·âs}}=½¡}fÖ&ü®{å·W¯#+´Í•3£+F-ÑáûA rúß‚“IêQÔÏôÏùß™M¬'ò9«UÖ·KPèñ¥¬¬¼sçÎ-[¶ØÙÙ5JNN.---##Ï•—––æçç#„.\¸ ¬¬lddääääíí½nÝ:GGG[[[))©¼¼¼ÌÌÌeË–-Y²!$##SWWöñãǤ¤$Üvذaøs@@€›››††ÞÉ‹lÁ“eû÷ïïÓ§Ïû÷ïñ挌 ---ÜU__ß7oÞÔÖÖÆÅÅyxxpžž'Ä«W|vÜ´G<¼Q‘½½}nnnbb"{ Q»À«­Ù_ñ(Nqqqbbâ‰'p9‹ÅZ½zõСC›ššÎž=›˜˜ÈuŸéÓ§·x–1‹Åª­­UUUÍÍÍ%ø;lµàà`„Piié¶mÛÚ÷Î]ÕZX,OÉ$u5}¥øC¹ý†ö SHc¼ûsUÈ{òEM_ !”÷´ZJ–¬Ð]ºG2…´úÞ<@è1çêꪡ¡qþüùÛ·oÓét---//¯•+W"„þþûïââb\ ¿´¬¬¬œœœ¦L™"++{öìÙ°°02™¬©©iggÇžZ:vìØ¶mÛ.]º$++Û§OŸœœœÀÀÀÔÔTœßàêÕ«ªªª&LÀÉÂÂÂp cll¼sçοþú+11QQQQ__?+++-- Ö‡rqq¹wï“É\´hѦM›~êï„B¡ðMðäîî¾sçΠ  ö tBBBFÍ> ‡ßJKKëÚµkxŽÅbIII-X°!$--ýæÍÞqwîܾ¸ª®®ÎÃÃÃÂÂbÛ¶m?;Ê)))¹wï™L^°`‚‚‚Ô …ý™L&·âsyyùŠM ‰÷¤¡¦éi@qYæ7„Ѓù½»÷øßü)‰„Æ­Ñ ^ñúSî÷¿õáŸ"·¿+}ý­¡¶)3ºrÔ)²Ýz½kË_ýxà„^d éÓ‡ï%¯¾_­;Æ»_;ýæ<èq7räH¼R˜ ƒƒÞ ÅkÈ!111->433“«dþüùóçÏTõêÕ‡jñ¶?ÕìÙ³}}}cbb¾~ýÚŽ§ê:uÊÈÈ:aaazzzæææx;‹gbbâÅ‹“““ÕÔÔú÷ÿ?cW®\5jW!/:>`À€-[¶´WÏù>âèÑ£xA:BÈÙÙÙßß¿}!//O"‹0×Vö¦öÞ‘Lz3B(ùRqÏþŠì@!d>]ãîžjmœŸßžùôÞob*›™,›e}w D qí-%KN<žÿo`)‰Lê®-gì¨fìÔòr1:1th½;wîà°éï¿ÿž7ožœM¿€ššÚøñããââBBB–/_Þ^·õðð`°qãF„гgÏüüüð!4¡ÐÐЩS§Òh4ŸpÆ4™™™{÷îMHHòˆÒÒÒ¢¢¢‘#G|ñâÅv t?~\RR‚??¿1cÆX[[¿{÷NWW/7ÎÉÉÙ¼y³£££···ƒƒçFô 6TWWãÕ<¼wf±XPPPX½zõψrvíÚuñâÅììl]]Ý‹/²Ë?þE"‘ÄaÞJˆÍÿÚ ¼”bó+{€¤ßÐZÁÃÃD"ݾ}ŸøÜFVVV8‘B(44TII !´qãFöPNß¾};“ÉÌÏÏç:bØÑÑñï¿ÿt N~~þ£G8£vQ__S›õë×/==÷,¥   6qâD!³i€Î:---GGG†×Û¶‘••Õˆ#ðç;váLìì&&&óçÏWTT|òä {KyVVF³··ç›~•N§úôIWW7&&¦W¯^mï$[LLŒ®®î»wïB¼[ϘLf@@BÈÓÓ³Ÿ gèÐÙà…2 F[“­_¿ž} 4ÎêE¡Pîܹƒª>pà@zzú¥K—rrrØMª««gÏžÍN Ï¥¢¢ÂÆÆ&<<!Ô^GÍž=ÛÉÉÉ¢°°}f¯ØØØââb]]]Î̀Π:[[[ƒ²²²¨¨¨¶Üçëׯ7nÜÀ£2žžž))),kóæÍ8Æ—/_Ο?O¡P|}}qV2ŒÅbùøøàlð¼]]]Ûk÷ûçÏŸëëë'L˜PYYyöìYUUU¾cHlgÏžE-Y²Dœ—!Úü¯€Î†D"-[¶ !túôé¶Ü‡L&ïÚµ !Äd2ï߿߿ÿ¤¤¤ääd<Ó½{÷ÀÀÀAƒàtW¡²²²ž={rî½b{ùòe|||—.]Ö¯_ß–^aïÞ½9r¤±±qaaaVVÖÇ[Lù™‘‘ñäÉ“®]»º¹¹µ½I»®:§ôôt!i/A‡««û¹ÇŸÌž={Ïž=iii)))C‡mÝM”••.\ˆ¢P()))½zõêÓ§Ïüjll”‘‘QSS#‘HìÁ›¨¨¨ 6¼{÷Žw¼äýû÷sæÌ $øh!Ý.//ÏËË{ñâ…ÍíÛ·UTTÞóÔ©S!www¼¤ðN'diiùçŸvt/@ ”••ÞÍåååûí·C‡8q"((¨u7 0`€µµ5NWSSCõëׯ_¿~¡€€€·oßþûï¿gΜa'‚xûömDDo”Ãd2õõõ ntŠŠŠZºté«W¯ÔÕÿÏ ¿EEE¿ýö[FFÆ™3gDãKKKoݺ%--ÝŽgF$:––lK–,9yòdLLLnn.;‡ƒH¢££ÝÝÝB...xÿþ=…BquuE=þÜÝÝ¡A^^~óæÍ\w Óé>>>&&&ÞÞÞÿ;ùáǵk×Nœ8ñÔ©S{öìÁ…çÎ{ñâÅ‘#G\\\bbbZ‘òóÔ©S cÖ¬Y¿à4*#ýVùÏ~ h+«å: S€@€Î©W¯^îîî.\8rä^„+*ooo}}}–mdd´eËö8Ê•+WBø A‹ååå5~üx®;Ñh4â{¹ëëë=<<8àèèhjjúûï¿+++[XX”——ïÚµKNN®u²ÕÕÕ—/_&‘H«W¯nEs‘())õÑãMLåÏ~h£ÁS5ÚkßsèÐi­ZµêòåË7nÜØ¶m›¶¶vË þ/vÒøüü| …rúôéþýû³X,__ßÏŸ?¯ZµJOO!TZZZ[[;wî\ζµµµß¾}0`η@К5k†Š£©S§ZXXøúú^¼xÑÜÜ\ÔÎs:uêTcc££££‘‘Q[îC„ššÚƒ€w?û)â`×–¶¶ö¬Y³˜L¦ŸŸŸ¨m Ž;†zÿþ=™LnllÔÕÕ%‘HÑÑÑñññ?Æ‘‹ÅÒÖÖŽˆˆàœNÊË˳´´ÌÌÌé‰çÏŸÏÍÍeïÛ¶mBhòäÉmŒrjjjÎ;‡Ú°aC[îPèЙýþûïRRRÁÁÁ¥¥¥"5|óæMjj*BhöìÙYYY–––8§„Á¡C‡ðù:%%%ÖÖÖ¼Çjii>}ÚÉɉøãRSS9ÎNÚпgçÿÇÞ™ÇCÕýqüÌffŒ5Bi‘)T’ФU*-²¶ÐíEE%Qi%””Ñ¢R´y’½ð´¥ˆ -$e+»aö¹¿?ΫyùYǺï?zݹ÷ÜsÎÍ̽Ÿ{¾›~ã2UÃÇLJN§ÏŸ?¿‹‚ ¥Ÿ‚ ”Œ¢¢"\ÔqssëЉS¦LÙ±cGuu5‰DÂb±rrr°\CII‰¦¦&•JxyymذfI†„………‡‡‰Ä6Ò7çÇëׯ÷ññ‘––nhhà×Eß¿¿ŸŸƒÁèÐÌS^^~á ³ÿþNw‚‚‚Ò¯A… ÊÇÑÑQHHèöíÛyyy‚Ÿ5tèP--- ‰””•G ×­[«f<==GkøðÁÍÍ­£¥ÈÃÃÃ'OžÌ`0¶mÛ6lذÁƒ‹ŠŠb0<?eÊ”Ÿ?BÇçÎqúôiXÂsòäÉî¥_ƒ ”ÎÈ‘#---y<Þ‘#G?ËÆÆæÇñññåååeeeX,¶¨¨èË—/û÷ï9räµk×âããù~9<ÉdŽ?>11&Úi&“ùöí[€ˆˆHffæ—/_òòò ‹ŠŠÊÊʪªªÊÊʾ}ûöýûwâÞ ¾ÿ€Åb<عPPP¨ÐAAø8::R(”¨¨(èvÓ.‚<|øL&oÚ´)44&È:thRRÒ–-[jkk;¦¨¨WWWÂbébbb‚ôŸ››«  '3oÞ¼!C†4oƒÃáˆD"…Bð2›pìØ1.—»|ùòñãÇw®”^Ž‚2ð‘‘‘Ù¾}»§§§““Ó£GÚM‚ ȹsç¸\®žžž¬¬ìºuë W¯^}÷î]€˜˜XJJŠ´´4l\QQ1~üø 6´;ššOOO%%¥ÔÔT~…¬ž 77zL÷þrFƒ–>”>މ‰ šJço:ÒÒÒíÛ·ÿéY ´Ï½{÷zí> sê¼~ýúþýû0»q`±X###@@@Üc``À`0¼{÷n777¨r222äåå©Tª‡‡‡ sX¸p¡ŽŽNéQ•ؽ{7dz²²êD¡.RVV¶cÇŽ¹sçöò¸("**ÊØØ:¨Ð€Ô×׿ÿžŸ>¥obee… H¯Ýg)Ê¡C‡lllöíÛ·dÉ’¶íA÷îÝc2™4MHHhΜ9ŠŠŠ<ïÁƒnnnEEEÐ5çÝ»w¦¦¦7nÜ‘‘i£«¢¢¢“'ON™2ÅÒÒ299¹y%¬ž ,,,%%EJJêOåΑ‘‘YˆPú,ÑÑÑz (½*t& EWW÷OÏ¥-zÿUòŸþñóóûðáÃÉ“'ÛvL~õêÕ!C¼½½)ÊÌ™3/]ºtÿþ}‰´nÝ:(VTTTÂÃÃÛˆ±ª¯¯§P(ïß¿ËüùóGÿfÚ´i}00²G9uꔢ¢bvvö-6533 °²²êú¸\.7$$dêÔ©ïß¿/**êJW¿~ý²°°@dÏž=Ó¦MëúÜPPPZdèС­ÈÊÊîÝ»÷Ë—/ÍÝWäåå¹\nmm-ÇÃt!!!2™tòäÉÎͼó+:aÓ¦M­5àr¹÷ïßOHHHOO—••ít b”žcýúõÏŸ?733£R©$éOϨW¹~ýú¼yó._¾>~ëÖ­ð·Úwùòå›7o–””())ÙÚÚêééÁC‘‘‘.\ÈÏÏ—––VPPHMM6lØ“'O:4:‚ _¿~…o-X,–ÿÓxÐÚ!þG@‹' Âøñã=<}¢R©ÍUK5ÓõKîŠ>[³fMrrò—/_º¥7”NÃ`0šâ½wïÞ¨Q£Øl6F³±±ñõõÁ’ÀM1b„ o#ÍIKKëÄYé¤Ða³Ùx<žF£µÖ@AA!))IJJª²²òû÷ï­ÙÕ’’’fΜٹ9èt:ƒùÛÞÂQz ggç[·nÍœ9sÁ‚¯^½Ú¶mÛ‰'V¬XnooO¥R---?|øšš h·$xsØlöäÉ“{`âü¿—Ëݸq£———©©©¯¯ïرcïß¿WhíííÃÃÃ;1 ¬ÕØbÒdÐÚ¡Æ -vÒ¡™P©Ô¼¼¼544p¹\þò’¨¨(¼‹áñøáÃ‡ÃØ+!!¡ &Àm‰4kÖ,è,,,l``@&“¡ëÞñãÇñx¼¡¡!T ‡ÃíØ±cöìÙ²²²µk×Â~a¨…´´ôÝ»wá¶ŒŒŒ‡‡Çúõëþþþzzz,«±Li¬fïïĨäåå­X±B–¶¶¶±±±=233ƒÿ] ü›7oî©Y¢ t˜›*$$$##ãÍ›7‚\¿~½¤¤¤I\ƒQRRjC·(î[ƒÃátzÎ|:Ƿu®´´4—Ë-((xöìÙŒ3”””åñxuuuƒ ª©©e;„¤¤d}}}UUUÛÓ@Aé(YYYëׯòäɧOŸ155…ûq8œ¡¡aRRREEEaaáúõëùvh]]ÝðððNŒ%$$”žžÞmSÿšH¢æò¨ÉGƒ1sæÌêêj%%% øøøŸ?ò{ãg;…k9p[DDdëÖ­p›B¡@å^µjÜ&“É&&&p{ÅŠÑÑÑ®®®Ø¿¿¹¹9'222üû€¸¸¸¶¶6Ü&cÇŽ…Ûx<^QQnþüÙÚÚšËåîØ±ƒÿê’ÉäG™˜˜ìرãñãÇÙÙÙ D"1::ÚÎÎf yòä ß®:þü‚‚‰tçÎ ³råJ:®¨¨øèÑ£Û·o>|˜ËåÂ![[Û˜˜xº••L0}úô7oÞÉd ‹;wöšøCéï°X¬ïß¿C³ƒa³ÙK–,á/ð@¦M›Öûµ_Ú¥“†d‰D&“a´X‹ˆ‹‹s¹\OOϵk×6ϦÃb±ÄÄÄÊÊÊÊËËidzÙl99¹æ_((]¤¸¸¸¦¦¦ªªjĈþë5‚ ‰‰‰"""’’’#FŒxþü9ßá4>>þM·u°X,‡ƒJBHHˆH$Ÿ­°°°ˆˆˆ¨¨¨˜˜˜¸¸¸„„Ä Aƒ¤¤¤äååããã………?}úTWW—}õêUXÏ¡»*c±Ø¥K—&$$?~< @AAÁÏÏ‹ÅvhM·  ÀÀÀ ¡¡ÁÔÔtÀ”z8þüÏŸ?«««544®_¿.''§¦¦fmmÝ<×ÒÒ’D"1™L˜?Éd’ÉdKKK€††߇ `bbÂ?ÝÚÚzÑ¢E€—/_êëë«««Ÿ?þâÅ‹½u}(ý6›-$$”––¶{÷î/^`0˜ÜÜÜ!C†$%%5iÉKéStr9¾ÈËË×ÔÔ4Þïééill\QQ¡©©™ššª¦¦öôéÓqãÆ}üø±q¼ƒáp8çΓ––îÄèfffC‡­¯¯ïÜäQPø„„„Àßj@@ŒÌÏÏ B¥Rõõõ½¼¼Þ¼y£¨¨˜––öîÝ;GGG°}ûv{{{ƒ™3gfgg¿~ýú_F7A¥RŸ={6gΜˆˆˆmÛ¶ùûûEEEuï@::::::¯_¿öòòjhh\è|ûöÍÀÀ ¼¼|æÌ™P$uïÄþüƒ™>}:`ذavvv?Ž‹‹kÜríÚµ***›7o¶°°Àb±d2ùÒ¥Kššš*•jhhWqººº\.žn``@"‘bccíì쬭­666›7oFÓ ´ Ì^sãÆ ˜ýܹsþþþ7nŒŠŠš?>ßUWRRróæÍ[·nåñx}í‡Ù%»‚‚Bvv6ÿã¬Y³>þ,&&|òäÉ>ÒÓÓ›{k¶oßÞĤ% 2 ÊÿqùòeøuºuëVó£^^^JJJ÷îÝKNNVTTôððX¶lÀÈÈ‹Å^¸páÖ­[rrrzzz=êå™÷T*5<<|éÒ¥wîÜ׸téÒ¥K—öÄX!!!ååå–¦úúõ«‘‘Ñ?ÆŽ{ûöí®çSî;\¾|ùÊ•+0ëZ»hiiÁBª–––På¿ZÙÂ… ccc+**ddd:1a”¿(YF޹wï^OOO¸“ÃálÚ´éׯ_ûöí»uë–±±1Çó÷÷‡¶h4Ú@:sçÎå;`0///6}úôòòr~}}ýI“&µVŸ"99¹C&vƒ¶«§¢ tˆ¶­Nx<~ûöíÛ·oo~ÈÀÀ€Ÿ^ïæÍ›=0O¦L™jnnÊd2/]ºÔ£·-—u?}údhhXVV6uêÔˆˆˆ¤rT*•_t¬]Ο?¢¦¦† È7¤¥¥›|Eù® ÍÓù¤¦¦R©TÀË—/‰Dbk¡1((,¿téÒæ_¤ýû÷ãp8‡3gΔ——[YYÁZ.}35yç…NCCƒ­­-‰Dª¬¬Œ‰‰±²²ÒÔÔÜ¿c•€å­­Ž²X¬²²2Á­®®îô„QPº‘?~ܽ{—ÃáÐh´hhhtK¦™>œ9sîÞ½»jÕªÿý·ºº:44ôÏ ‹W¯^­\¹²¦¦fÆŒaaaFåDEEAKS``à˜1cV¯^Í÷ ýþý;\n SQQYºt©³³spp°¨¨èÅ‹1Ìüùó½½½¿ÿîää$&&C\Oœ81bĈOŸ>ÁÄYYY|_fWW×÷ïß×ÖÖÆÅÅ­]»vÀüO¢t;‚,^¼¸µ¸§ýû÷7ÎÖÖ–Ë妤¤ôMïHç…Nyyù!ClllŠ‹‹aý£Gø«[|æÎ Kyuiš((}ŒŒŒ .—K&“çÌ™ãììü§gÔÍÌœ93**jÙ²eÿý÷\»m#ø G¹{÷® ‹ÅZ¸pappð@º™œ>}úÛ·o€›7oJJJó_ˆá!ðÛ®:iÒ¤¥K—¤” £¤¤f!DDDXXX¨ªªªªª9rÄÏÏ/11‘B¡())åää¼yófÉ’%°+ƒÇs¹Üõë×ïÝ»·×¯¥ß   °eË–6¢»¹\®™™YFF†¼¼|_V9 ÓB‡Åb‘H¤}ûö‘H¤Ã‡Óh4777ww÷æÑóZZZL&s Ý›PPÀÿ›®*jjj ¦¦¦ÙÙÙÊÊÊ·nÝÒÕÕíÍ 0™L''§+W®¶oßîêê:À¡§ÌðP“ìÛв1–––0«EvîÜÙé‚A(YYYRRRíF!Ô×׿zõ*;;FhöM:lz‡‰7ªªª444NŸ>íææ6yò䊊 WWWsss~3<occóìÙ3tu¥Ÿ2bĈÿþûOWW—Éd.[¶lÏž=HïÙ9¾|ù2uêÔ+W®àñø‹/ÂÚ½3ôÀ#** ¦z „ uPPÚ`„ ÷îÝäÇžmcc3nܸ¾\è©c -………#FŒ¸yóæ¶mÛjkkáÎììl--­øøø7nÔÕÕEFFR©ÔçÏŸ2„Íf³X¬>˜>E@DEEïÝ»wæÌ77·Ë—/ÿ÷ß×®]SUUí¹y<ž§§§——‡Ã‘’’ SSSë¹áþ¼½½¡»OHHÈØ±c»^œe`ƒÁ`þûï?­]»VKKKðÉÈÈÈæµÍÛ@NN:þb0KKK‡ƒÃá:úÎÓ¡“››;zôè¥K—FEE59TVV6þüW¯^ëêêFFFJIIîË3†‚‚òÁ`0vvvfffùùù³gÏÞ¾}»“““€aá"##ÃÊÊ ÖŠÚ½{÷þýûQÃw×é›9-Qú&l6‹Åv¨ÈÔŽ;233Û,¯­­íèdÞ¿_]]­©©éáá!""‚Á`x<^ •;w6W9²²2##£¤¤¤‡¶VÜ ¥ÿ2zôèÔÔTOOÏÓ§OŸ?þúõë...«W¯î.!R\\ìæævóæMÀ°aÃ.]º¤¥¥Õ-=£  NAAAMMM‡bœß½{÷æÍiii…ÖÚÀ|ƒƒÁ`ˆŠŠÂŠ{mÒj A}t>}úTTTÔvÊð·oß®Y³F^^¾suPPPú8áÀ©©©ZZZµµµ»ví2dˆ••Uaaa§ûäñxñññ;wîTUU½yó&@سgOzz:ªrPPþcÆŒÜnÅçáÇm¨©k444ìÞ½»s9½}SRRÚµkWó¬AM óöö¶³³ëƒ¹QPPº…1cÆÄÆÆ>{öÌÓÓóÅ‹wîܹsçΔ)SÌÍÍLˆ HrrrXXXhhhCC‹Åšššž8qBÀÁ}ù§gÒXø{xùòeGO‰ˆˆpqqA¤E»ÒÛ·oÕÕÕ¿|ùR___TTÄ/Ñœ!C†ÈËË7ÞóíÛ·Ù³g„„„œ={Àf³;ä#Ðár¹8îÎ;‚4Þ»wïܹsUTTH$’àóè4hHW‹”––nÙ²åOÏ¥-úû}vöìÙ³gÏÎËË;{ölHHÈ›7oÞ¼yãàà ¦¦¦¥¥5|øpYYYiiiaaa‡S[[[\\\^^^ZZúæÍ›ÄÄD¨oÇ·³³[½zõÀø9‹ˆˆÀøŒ?=”¶Ð××Gãøš•JzzzGOÌÌÌ,,,¤Ñh0ΜÍf×××ãp¸oß¾))) 6Ì×××ÈÈhôèÑ'NLHH°±±i±`¥½½}gy///uuu@JJ ‚ ÑÑÑÚÚÚbbb‚ß.:ïÞ½#‰%%%‚4f³Ù7nLKKc2™íÆ[͘1£I&å¶i|aT*U^^ý¦6gÈ!0õJ_fóæÍàÛK¥R}||ÜÝݯ_¿žœœüôéÓ¬¬¬¬¬,AÎ3fŒ††ÆÊ•+uttzxš½Š¬¬ì7þô,PP:Ng2™((‰ ˆ¿¿¿››Ûýû÷_¾|ihh8sæÌ?~@ä-[¶,X°`Û¶m°ñ¼yórrrì.ŽÆÇÇÃRƒJJJË–-{øð!‡Ã¤„Žššš¿¿¿€s¤§§ß¼y³¤U'Ožäææ Þ-UUU2™œ™™I"‘ètz'zØ /Z´èOÏå/BXXØÚÚÚÚÚA?¦¤¤¼}û¶¬¬¬¦¦æÇ?~ü3fŒ¨¨¨””ÔØ±c544æÌ™Ó;‹¾(((‚SYYùéӧέ7{yy­^½zÞ¼y666^^^………¿~ý:qâDNNÎÏŸ?ïß¿ïííÍ7m¥§§KHH R[[;bĈüü|…’’2™ŒÅbkjjäååß¿Ïb±6mÚ¤¯¯Ïår ÂÈ‘#ƒ‚‚à¶ ë)@@¡ƒÅb;êštéÒ¥6„ƒÁb±6lèPŸOP(”úúúSIe€Á`TTTTTTø{ÒÒÒôôô&Nœ8` ¼£  `† vûöíÎËb±¬­­Ÿ={váÂ…'Nðx<…ˆˆþQ!!!‹… È»wïÔÔÔdee‰Dâ Aƒ0Œ„„„¼¼<™L†V*‹õñãÇ &lÙ²ÅÑÑ ,,Ìf³ †‘H$‰BBBt:]¡Ó¾¿0,<Þ$ïx»$''WTT´f¥†(|ga±XX,¶°°ÐÇǧC³BAAéeà ¤µ²¾(((}Ÿ?vúܤ¤¤K—.™˜˜¼zõjøðá åÞ½{oÞ¼a0ååå………Ÿ?NJJ’••ˆˆ˜4iRmm­¨¨¨œœ\NNƒÁxñâÅëׯBBBC† œ>}úÊ•+Ùl6N'$)55uË–-°´”€ÖÿöWtRSSeee;äIàp8ÑÑÑfff-…1Y‚<|øPTT´´´´µT‰ fÖ¬Y÷TTT(((ÉdGGG€Š ƒÁè‰Üe(((] 4¥¿ÐnxuÛìÝ»×Ðа¡¡aÔ¨QAIIIJJêÇ&LÈÈȘ2e LH8eÊ”ÜÜÜ3f°X¬¨¨(cccxºŸŸß”)SÊÊʤ¥¥µµµ×®]ûæÍ›±cÇÂ0}út~H£€I¼Úo¤®®݉«ˆˆhl½úñãÇ Aƒ¾ÿ.%%%--˜˜XXX¸nÝ:ƒÁpvvnqФŽ`YYYzzº•••‘‘‘¹¹y]]Ý“'O èt:ªuPPú°º¢ƒ‚Ò_è¢Ð©ªªÚ½{÷Í›7¸\î¨Q£bbbL&sܸqt:J¥Â–RRRÐɦq´¹‚‚BCC…Ba0#GŽär¹ãƃ÷&žC°¸¸ Sj_èP(”NDš"##‹ŠŠp8œ§§ç!CàêSyyyAAÁË—/]]]¿ÿ[’H¤-[¶¸»» ÒíðáÃᆑ‘‘¨¨è£Grrr ¥O…º¢ƒ‚Ò_èP-ª¹uëÖºuëtuuÙl6‡Ãir‹Åâp8&“),,ŒÅb333íííùGG Zß^.|/œ&ñäÝ^Þ9¡C§Ó·lÙ¥¬¬lmm––vç΢¢"OOϲ²2çêêêëë KJJ>|øP^^>??_IIéÓ§O222l6»®®ŽJ¥Â2[_¿~ÏÌÌ\°`ššZBBÌÏáææVRRB£ÑˆD"Z] ¥Oúè  ô/º%íÅÖ­[ß½{G&“á2 ¿Ï7oÞL™2#4Çïïï_VVÀãñÖÖÖŠŠŠ\.·{C2Û:0wPFFFçzŽŽ¾{÷îæÍ›SSSGŒX¹råÊ•+·ùï¿ÿ&NœÈb±x<ÞðáÃKKK•••p8‡ÃÇ`0jjj°^|}}ý7¶mÛ–•• c0è›L P•ƒ‚Ò×@… J¿A蟭]$//oРAË—/·³³› Fpp0LôG$yñâEZZßÕ¦¼¼\QQñÑ£GË–-khh€û{"½V;B‡ÇãÁ¨÷NPRRâäääëë …±XìÂ… Édryyyeeåˆ#***&Mš”——7a„ÜÜ\X‡}íÚµ)))11±uëÖÑh4.—[\\#''~+0¸„ãîîsÉ·VeåO ”¾‹Å¢Ñh7n £R©sæÌyúôi·ô\ZZÊ÷Qi‡ÃILLœ;w.ï¹ 0íxòx¼.:`üýýSSSihh ‘H#GŽ >\ZZZVVV^^‡Ã)))1™L*• Õ¿@<¬†J p8ÜðáÃÉd2›Íær¹M‚Ê0 ƒÁ@U J_uFFAéûP(h6ºxñ"@?tè ¹øº‚––ÖÓ§O]]]«««{Ôó¤7„dz¶¶zýú5\k‚@àr¹°zèÖ­[ùU0øeßaKè¤ÝüíL&£éäQPú èŠ J¿€Çã­X±bëÖ­uqq¡ÓésçÎòìžÑ IDATíö±F}çΔ” .—+!!Ñ£ëí Ó-«I™™™§OŸž={6‰Djhhþ \ªÂãññññÂÂÂùùù<€g)**îß¿@$·ïú|PPPztE¥_@§ÓMLL‚››ÛðáÃ×®]{íÚµaÆ%&&†„„HII Þ‡›?~‹§P(ÜÜ\SSSèeÛ ÏôVï>‚Ðh42™,&&¦ºÈÞ½{-Zäáá!))É߉Á`?~lhh($$´|ùr“Q£Fedd¼}ûæŠÖÔÔ„ñV(((ýtE¥_@¡P$$$æÏŸ(..¾~ýúúõëeddnܸann~áÂÁ»òòòzüøñ¯_¿¢¢¢\\\fÏžM 444\]]+++¡õ¦çœršÐª32æ7‚Ì™3çÆ],......&&FII‰H$æåå½~ýúׯ_ü:::ñññ555°<)z‹DAé¿ B¥¿­W«TVV®Y³fÅ;yò$,DÕ.•••€€€€¥K—.Y²äСCPÙ’’’´µµ{ù†ÐÖz²——t">pà@7ùôéÓÀÀÀóçÏÇÄÄ4V9¬¬¬>(++‹ŠŠ¢yqPPú;¨ÐAAé/Ðétccãæ -‡f³ÙÇŽ°Ÿ’’@XXذaÔ””¶mÛvÿþý½{÷Ž?ÞÂÂA&7.—K£ÑøæÝN«B‡F£­\¹ÒÀÀ ¼¼\II)%%eÖ¬Y=jh9räHqqñ”)Søn:(((ýÔG¥¿­W ,h²¿¬¬ ¦õSWW¤Ÿððp:nkk øüù³ŸŸŸ™™™§§gvvö·oßDEE©Tê´iÓ ·mÛvôèÑÐÐÐììlhD‚wŒî¥Õ»°°°ŠŠŠœœÜäÉ“ÓÒÒ¦M›öìÙ3&“ÝýY ñxkkëÏŸ?;;;¿{÷À/dŠ‚‚Ò¯AWtPPúÐzÕ|ÿéÓ§¹\®ƒƒƒ üüùóÆúúú£Gn~”Á`äçç¿|ù2""ÂÏÏÏÙÙÙÂÂBKKKXXxÆŒ<N§wõ2þŸV…|[¹reQQÑŒ3´´´víÚ³xñbfccÓ¡aÔÕÕgΜÙbüØöíÛËÊÊüüüjkkÚÚÚ¼”¾ *tPPú £EëÕׯ_ïÝ»·råJ~Η¶ñôôt´ØvrròåË—a­òn¤­õdh½p8œW¯^={ÖÐÐpâĉÙÙÙ>>>S§Np "‘˜‘‘ñüùs‹õï¿ÿ򯯬¨¨ˆˆˆìÞ½»¨¨èüùóA%%¥n¸ ”¾*tPPúÂÂÂâââ-VðôôÄãñvvv‚ô“——iii)++Û¡ ¼yó¦Cí¡-¡#,,¬¬¬•‘‘A“£  H ÐA}tPPú \.·EëUFFÆÿý·nÝ: …"H?¾¾¾$I__¿C£Óh´µ„¶î>|ëU“ýeeeîîîššš .p˜’’"‘8}út!!¡™3g:;;_¾|Y___FF&==½y{.—[WW×í†:”^†Q B¥¿Àd2[¬ÿàçç'&&¶jÕ*AúÉÊÊŒ5ªC£÷„Ði§¨'´^:t¨ÉþsçÎ9:::::ÆÅÅ 2ÌÍ›7=:oÞ¼„„„/^¼xñ‚h÷îÝGŽ‘‘‘|ØäPAAÁ£GV­ZµgÏžššš6:ÑÔÔär¹Ë—/¿~ýúÈ‘#W¯^}øðáÁƒgÏžÝâYFèP(”1cÆLœ8133³É¡'NXZZÚØØ’DèÓ§Oñññ&&&:€ÚÚZ™Òk|ýú5))I–ÉÉÉ«V­:yòd·THí§ÈÈÈèèèDDDô5­ÀápÇo£Aeeemmí“'OæÎ4f̘^›[äæævo…–n§¸¸XTT4<<\À*9 ww÷îý›VWW X"ðë×¯æææW®\iíÖÿ—3jÔ¨ŠŠŠ¾©u"""êêêiyäÈ‘ºº:ÝxûÐzÕ\èüýý-ZdaaáëëÛFS§NÍÎζµµýõë—··wPPNßµk—‡‡™Læp88®y͇v…c'h_è@ëÕŠ+š œœœÔÔÔuëÖ¬øÚ"‚ìÞ½““cffvôèÑSü%œ8qÐµŽ„„Dhhh ¼½½oß¾Ãá²³³çÌ™sæÌAŒ¶=MUUÕ÷ïßLWŠÒîîîÕÕÕ=ѳŒŒÌ¦M›ÚhðàÁƒìì슊 “½{÷îÙ³§ß­ûö4$éêÕ«ëׯï›Z°{÷î6¦”žžÇf³Oœ8ñúõë£GŠˆˆôæô:´^‘H$ƒÑäPTTTQQ‘••UB‡L&«ªªš˜˜DEEM:ÕÙÙÙÈȃÁ@@&“i.tzbõW çJfffÖÜzð÷÷ Z¶lÙ­[·Úí§¼¼ ++Û\è,Y²¤qÅÔ&£÷ñ_þÈ‘#ÛHè ÿ fâĉo߾ݳg™™™ƒƒÃßiþÀáp}VëÂæÍ› bcc­¬¬ž?~òäÉ?î=&..®««ûgçÐßñóó롞EEE Ûhðúõëììì™3g&''Ÿ8q"99900pðàÁ=4Ÿ~Š’’R_Ö:K–,iC»p¹Ü¸¸¸qãÆååå=~ü877÷äÉ“ãÆëÍv¾õ*<<¼É!‡èìì<}úôäääOŸ4i?uêþü¹––“ɼvíÚéÓ§cccÛìè‰Ç½@= =ºÅÀà;wîTWW[YY Òªª*Nÿúõ+ÏØ±cccc+++£¢¢~ýú•‘‘-y¡ÑhÃÀïïïïàà@ nß¾miiYXXø§gôg€ZÇÀÀ ¾¾~Ù²e/_¾üÓ3êd2ÙÙÙùÀD"188xÞ¼yŸ?þÓ“Bé÷èééùøø 4èéÓ§ÚÚÚÏž=ûÓ3ês@­3hÐ ¨uzÂÀÑ£¨¨¨ÜºuKEEåû÷ï–––!!!zFíÓZæ@À… 177oí\è‰|àÀ»wïNœ8‘Ëå.X°`Æ ïß¿/((€–" Ó;+: ¨°Z¼`:4{ölAôéÔ©Sß¾}Ëf³………÷îÝ›ŸŸÿáÇ… b0˜ââb‰¤®®Þüý˜F£AæÙ÷Y¶lÙ¥K—† ÍXÝâ¯×é×Z```påÊ•‘#GB3Ö;wþôŒPú=7nÜÐÐЀf,OOÏž(ãܯéïZG^^>00pùòåÐŒeooßÇ3˜L¦¡¡a‹‹Ö¿~ýb±Xbbb­;}út:.))‰ ‰DÂáp¿~ý‚‡^½zÅÏ­ÌápšœøÇVtÀoëU‹‡iwQgРAT*µ¼¼üùóçåååîîîƒ ºxñ¢¶¶öªU« Fk¦œ³¢QVV¾víš®®n}}ýž={Ž?Þíùµú,EEE+³jÕª‚‚ ‰úúzXµ¾A¥Rƒ‚‚-ZD§Ó­¬¬lmm›[²QP:„”””φ 'Nœ055å?þfªªªîÿæÝ»w«W¯¦P(=Z¶lY¿Ó:aÏž=nnn"""?633ËÎÎþÓ“jaaaQQÑE‹µx”Ëå¶öhZ¸p!‚ ÂÂÂÍë;Ý»wAø·ë[BGXX˜J¥Nš4©ù¡œœœçÏŸ[ZZB“^khhh`0ƒéÓ§'%%ýóÏ?#GŽ|ùòe```LLŒ‚‚¼¼æ YOP(77·¿ÐŒÅ`0Þý?ДÍf?~üøOϮàf,”n‹ÅnÙ²5c5æÇqîÜ9˜<÷Å‹‚ø†öAtuu¯]»Ö/ÌXmX¯x<^kBGOOOLL¬5Iœœlkk Ïm.tþ˜32hd½ÊÈÈh~ÔßßÿÖ­[+W® j­h±;sæÌéÓ§i4šµµunn®œœ\EEÇÃb±­ ´œÓ˜eË–©ªª8pàoˆÆ’——o;sëÖ­ôò|ºƒqãÆ999õ©h,”~ 4c9räõë×s4–¤¤$LÛœÌÌÌ/_¾°Ùì^žRwÍXgÏž½wï^_ŽÆb±X‹/öññ¹víZ“ºâ­­è :uŠF£ñ/‡Éd ÕÖÖòÛøúúÆÆÆ~ùòEBBbâĉÇ“H¤yóæ èòÛ!:Òftrrj~(,,¬¼¼ÜÚÚº ¡£©©YUUuþüy‡ 6P(”ììl'''‡ÓvM¥üó†f¬ãÇ'&&ìh,‰4a„õÙ$I‚ÍX}* ¥_ÍX—.] úk£±† vìØ±?~üË—/½<Ÿîš±&OžìææÖg£±Èd2—˵µµµµµ}ÿþýÕ«Wƒƒƒþü àr¹Íƒ§$$$bbb”••¯Y‰DooïâââÆ- ‚§§gtt4Ì\3eÊSSS‡†††n¿Šh …B¥R[,eÀd2¯_¿®¥¥%//ßÚéS§N­««ûøñ£­­-‚ /_¾TUU½zõê§OŸ7kî7PWt ­k€š±PºÔŒõ7Ð÷ÍXpa†Çã5ÊËË«¨¨(<<ÜÄÄAøtÆ`0›6mò÷÷/..ž6mÇkâšóãÇ&ÝJHH8::BS@EEækÛ¦st@èð3¶xVhñ(•J•““6l4Èa±ØŸ?BÅ—™™Éf³ùŽ80aüÿMqà®èðA£±h4J·ƒFc xúE4‹Åãñ‚0ŒÅ‹‡……III)++ÇÅÅq8œ´´´ÀÀ@+++ø¢Îj³Ùl¸BãååuñâEUUÕÍ›7çæær8œ””?©tÊî¡ïvÇ4D±WmW´100`±ØæYž F\\œÔ=½ãšÔ6×®]‹‹‹kî-Ô£üÍÑX 4 ¥ÛA£±<}? ®ßäççÓétÀåri4•J5jàÊ•+°™²²2Ü€µ}ºqãÆwïÞ(++ó«Þ¿7222†?~ùò…ÉdvcH]Ç„…B5jÔ”)Sšj[è¬^½º_¦™™Ù­[·àŠQ‹B§—5G~~¾ƒƒÃªU« äì5P3ÖÀ5c¡t;¨ëo Ïš±Á`0eeeT*Z²>þ 3¿Œ=‹Å>yò¶äp8UUU€‘#GzzzÚÛÛKJJjjjÖ××7–$)55µ´´455•¿óÇS§N=räHee%?> ´¢ÔQ:&t0LCCí[·víÚ5hРƇÚ:æææ’’’ü=d2¹²²’ÿ±¡¡aõêÕUUÕ3fÌ™3gþüùЈ³~ýúM²ë@±™meeEhoŽÞkf¬¯_¿Â(ÍO\\Ü•+Wzy…¬»ÌXý.SÈßCï›ú‚«ÿ:u‚šššæÞ=Jß4cÁˆïß¿Èd2›ÍVQQùúõkfff_<ÿáÇM›6?~ÜØØØÛÛ{ÆŒƒ^²dI“>µ´´îÞ½Ûä Ìd2]\\´´´„„„„„„FýîÝ»®?§:ìþ"$$4jÔ(ooï²²²ÿý×ÈȦ-†ÿÍ}°õõõƒ‚‚ ù‡˜L&ÇÛ¿“–RRR~~~ñññ/^¼xúôéŒ3<<<æÌ™ÓÜ­©§¿d333 …’––faa±k×®üüü^›@²³³Gíää]è0åååööö'Nôóóë —þÖè3Ö®]»\\\þIÚ¿puuutt„Æ7cÅÄÄ,[¶,==½7ýSêèè\¼xQÀåÝB/›±ÂÂÂìììÚ~ „oß¾A/cø‘ÃáhkkWTTüûï¿°M]]ŸŸß¼yóâããOœ8qöìY ¸Ó\å0 ÿÜÖ(--íúªÃBÇCeÃårõõõÐ?þüðáÃÆ½1™L6›Ýö÷vèС‰‰‰#GŽ„n@]¡óMD"ƒÁTTT‰D;;»Ξ=Ë`0ÒÒÒBCC9bddÄãñ ‚äääH$yyù>˜ššjjjFEEUVVr¹Ü3fÔÔÔðoåYYYãÇÏÎÎf0™™™999ùùù?~üøùóguuuCCCÏ­(B¡#$$$!!³5lß¾Ç?xðÀÀÀÀÓÓÚ {5cÁÿjIII:~áÂ…‰'§…„„h4Z@@ÀâÅ‹½½½û]ô(½cÆ‚ÖvüøqEEE77·vGár¹555 æÕ«WW¯^%‰...kÖ¬±¶¶†ÁáMÒÐL:ÕÐаI'‚ˆ‹‹Ãm …²oß¾S§N]¹råÁƒÏž=ËÉÉ)**ÒÔÔ¿ÿ ]¡ó‹%¹¹¹***ÉÉÉK—.…yY,Ö¤I“àXRR’ÃáŒ;6f±Xl6›B¡HHH9räÇwîÜ Éñàz~]]]ãœ:ëÖ­ûðáÃñãÇ1 NÏÎÎÆ`0iiiW®\á«NÆyü ȧOŸJJJBBB¿âoãñxØŒÐðaÏ“““;þüîÝ»>üï¿ÿ®]»ÖÒÒ²Óÿ{‚ÓsI¡Ð™;wî¡C‡Ž=îëë{õêÕ7îØ±£ëý÷ÜŽóõëWÀèÑ£CBBŽ;öäÉOOÏ .lذ¡¼ÝH“¤‚‘‘‘¦¦¦ÒÒÒb¿‘””lñ÷ …Ž»»ûéÓ§ÓÓÓõôôV¬XáììUSSÛ±c‡‘‘Q/Là$„rjÉ’%ãÆóõõˆˆˆŠŠ266Þ·oߘ1cztèÞ¾#7îÂ… ®®®111W¯^ Y±bźuëz!c/$„BgÞ¼y€„„„œ={ÖÉÉÉÊʪyÖS.—ÛÐÐ **úáÃ77·#Fœ9sFZZðøñã 6œ;wAQQѶ…×/^8;;s8œ9sæØÚÚùõëWee¥¼¼<‡Ãé.{N'{)//WPPøõë—Aee%…BIIIÑÖÖ.((˜:uª¯¯¯††¬kššš:mÚ4<Ÿ­¤¤´gÏ+++†ÅbáþoÊÊÊzxxð‡àñx/^¼Ø°aÃâÅ‹ÇG$ÍÍÍ=ª®®^\\Ìb±¸\.N§Óé-N²¶¶¶+Ñ.MÄ„¢¢bppðÞ½{÷îÝsáÂ…~(]ÍX÷ïß?sæÌí۷Ä……ù™šX,‹ÅRQQÁ`0ðIÙî܆Þ* F]]ýßÿÍÈÈ8zôèÇÏ;wåÊ•þù§.¬"ÂãñÚU-‚ÿ{ž7o^NNÎÔ©Si4šŸŸ_÷]G[@3‹ŽŽŽˆˆˆˆˆhÒ€B¡ðu¸¸8Ü(**XXXØØØ¸»»{yyݹs'22ÒÎÎÎÆÆ¦‹S222"‰ñññÖÖÖ#GŽTQQ9xð`YY™¬¬,àÙ³g>>>>|™3gŽ]㌠7nܸ~ýzaa!—Ë2dˆŽŽŽ«««¾¾þÇÓ§Oóæ ™L¶°°Ø¹s'üÊñx¼Ë—/ß¼y³¤¤DIIÉÖÖ–=™;wî÷ïßuuu_½zÅ`0ÔÔÔŽ=ÊMjm¬vgØ9x<Ng0L&³É¿M>ÂZ ‰S§Npà@nn®¥¥¥””ÔàÁƒq8ÇápÍ7šïÇápð nÿøñ#22òû÷ïx<>))  ¬¬ìëëûßÿ8p %%e×®]^^^‡Z·nß —ÉdR(”·oߺ¸¸NŸ>=a„ÜÜ\iii.—»`Á‚Aƒ™˜˜P(~:Á6—— m¼ƒÁÈÈÈt{ºüN iié¼¼5zôhOOOX±ÅÛÛ 4}}}11±Æ¶‡Ã5_ÒOJJ‚ÈŠ+îܹÃÏüÍãñ˜L&‹Å‚ÿ6fóæÍ³gÏ7n›Í† ÙÍhq'›Í~ýúu]]]óU÷éÓ'¾q‡Åbõ¦g«¢¢¢°°pMM ‡Ãá'YâSVVÖÅþÕÔÔLMMSRR~þüY__ÙÅ;į_¿´šáÚ&¶jü±®®îóçÏü%÷ðððÇÃåY*•ºuëÖ={öôìåý&222110tèP*•ÊãñjS]]]_____ߢ˜¸¸8…Bquuµ¶¶¶°°xòäÉñãÇoܸaaaÑ]s+++‹ŽŽ–€’qqq666ãÆ³°°¨««{ôèQZZZtt4…Bdgg=zTSSSGG§®®îñãÇÐ*ommûòåK##£ÊÊÊóçÏ“H$kkk€³³ó­[·fΜ¹`Á‚W¯^mÛ¶íĉ+V¬˜3gNppð³gÏ-Z$%%·iÓ¦gÏžÁekcµ=ÃQWW·bÅ .—Ë`0šg¸h¸ -!!±oß>ccãI“&1ŒÂÂÂàààŽN£Ó¨ªªŽ3æåË—½0"ôÕ““;{öìþýû©TjCCChhèÝ»w{at>>lâüÑušgáÛ544Ž;–““óéÓ'&“Ùk1hC‡4iRnn.›Í.-----íb‡0Ì™|4Ï;7999"þ\à IDAT"bŊ߿߲eK@@À½{÷dddÈdòóçÏ]\\ŠŠŠN:ehhXYY‰ ˆŠŠ øF]]ÝÏÏÏÜÜüĉºººL&³yæ¼Æ´»ðÓ]tRèp¹\!!!6› ï‰ yyyfff§OŸætRRRüýýëêêlll¹\.T3°†9N'“ÉüËËË¿}û_^Û@JJªñG,K&“÷ÃGLLl̘1Ó§OïÄÕ™™™åää4:,+88ØÓÓ¾­JIIYXX¬\¹òòå˽àŽÇãñàê4|±Ø·oß›AçÏŸ'%%ùøø ÂßÙâF“ñññ{÷îÅ`0'88˜_;†J¥ÚÛÛÏ;·ñ+uOcmm½iÓ&øîØ6è<&&æŸþár¹±±±‡‚ÖÕáÇ;::š››WVVö‚СÓéžžž111€Õ«WŸ—Ëݸq£———©©éŒ3‚ƒƒ¯^½ª­­ PSS³··/))6lXcµ=ÃŽÂy€w‰D$ÿ 7 p;???>> ?:99ýûï¿‚HKKÛÛÛkkkëèètå" _¾|qrr*,,„K†ÚÚÚ×*øk-îlÜ›µ¸øÁårÓÓÓ>|‰eee^^^ü`FKKË7öÂUCfΜ9a„æëOÍ—©àJUkËTüfNNNk×®2dl_VVæêê boÞ¼9|øptt4@TTtÍš5zzz½¢¦¦ÆÅÅåÅ‹ ÆÜÜ|éÒ¥øH…ëÜM6ZÜ?~¬®®>bć“‘‘‘––…‹Åºv횇‡“É„…ÆÌÌÌH$ÒãÇ]\\Þ½{wèÐ![[[,Ëf³›¤˜ÿ½Ã† 744´´´´µµÍÊÊRSSëéÿŸvé¤ÐÁápÇo¼zÛÛÛïØ±ƒÇãy{{Ïš5ËÁÁAUUµ®®ÛàoƒÅb•””41úÈÉÉñS+¶‘HÜ¿ÿ¡C‡Þ½{×ZyÈî‚ïŒ €>hÞÞÞÐIS^^~ݺuÆÆÆm Õn¤¼¼üðáÃéééX,vûöí›7onRCTT”H$B[C‡€§|øðÖP©T‡eË–áñø^öJÝšWˆˆˆˆˆÈСCù{***DEEÿý÷ßsçÎA_W,;þ|+++]]Ý—/_v‹{òªU«233«ªªøæÿ‚‚‡sñâÅÆÍàR †…„„ÀÑñx¼½½}ã;Ú‚ àÆÂ… ccc+**>}ú„ чÃ&%%ñW ø·øãâ›)[«ív‘»wïN›6H$6 mƒ°°°øøø¢¢"kkëË—/s8aaá­[·îܹSTT´w2Û†‡‡Ÿ>}šÉdŽ?>((hôèÑ==â7>|XQQ±k×®‹/2 £§§çàà ¡¡ýáz ƒ-[¶tc‡nnnÚÚÚü0Ÿ‚‚@UU•‰‰Ixx8‚  eõêÕkÖ¬j»x÷î4(‹‹‹?~|öìÙ]ï3//oË–-°b‡‡GZZ›Í>{öì©S§à“nÊ”)/^¼ ‰111...iii›6m þíÝy\Lûÿ8ð÷L›öM ¥En«R÷†ˆ¢Ò­K×ö(Z|K‹%]QsS‰Ft)!‰’dIËPn)·k¹ø”¥(Kui_æ÷Çûó;ù`Ò:3M¯ç_§3gÞç}fNç¼æýzŸ÷ûª³³3nôæããÛµk—’’Nÿþý‡&NœˆÖX3…=nÑ155Å 6l˜;w.+¿§/ÒU¿ÿþûi»¡Ã ,uuuÿ¥K—reˆƒñòòJHHxxx¸ººôf6ýIWõ :¡)S¦8;;ÛÛÛoý/_¾Œ›âSRR¢££ííí½¼¼ììì<<<|}}­­­MMMyyyŸ={V^^îæææì쌺råÊž={rrr444:::ªªªDDD›9ÃÂÂ***þý÷ßüü|GGG~~~55µ… ÆÄÄܹsgòäÉ·nÝ*//àãã»víBèèÑ£&LÀ¡~<­}õ]CÀ‰DZ´hÑo¿ýÆ‚ÖcºŠJ¥2›ky$à@‡L&ÿúë¯~~~:::,Û5ëák¾€€€­­í† †ý"ÜÆtÕºuë<==GhH9¢SÚÌ™3ƒƒƒ-ZDÜé´´´²²²–,YòñãG:Þÿi'N¬ªªJOOß¼y³ŽŽNYY™¸¸ø°w1î¿ÁpwïÞ500˜2eJhhhJJЧ§'nWÇYª8p 88øþýû ååË—Œc~mÁ‚íííkÖ¬!ºø´··7NFF†ð}ñÝÝÝ&&&6l000`q¾›®rrrIIIK–,áúùáµ´´?~̲DÖÏtUß>}ú´`Áœ¥‰8{ß¾}¸qþܹsnnnÓ§O_¼x1n¢?xð €€À¡C‡222Èd²‚‚‚ ˆ„Ô„ deeËÊÊJJJDDD ýüüÃ8›+W®ôôô899mݺ¯Œ‰‰QWW?{öì7&Ož‰[ªþþûo„PJJЬ¬¬……/*##:Ìö…cVC˜={öÎ;G¢©µ¬OW1"‘Hvvv¾¾¾¸eŽ»ñññ­\¹ÒÅÅ…ÅÉ—‘HW1ÓÝÝ=þüàà`ÜQ@§Ó]\\pŸžï6»~M]]ýÖ­[”——?xð`llìðUyÀèàîEJJJÛ·oÿã?V­ZuóæMiiéË—//\¸o3mÚ´¢¢¢ßÿJ¥.^¼øäÉ“­­­x(!f¾hweerá ½½½ .trrbË2 ÒUîø9°þ—ÄPÒUŒŒqgÛrõêÕ/ÖìÙ³gÏž=xÙÊÊÊÊÊê›o\¼xqßCÅxyyEGG±’——×ÝÝÝÝÝý‹õŒ~1»\û꣆,`hhÈâ1‡Ø•®b´víÚÁu÷äåå·mÛÆÊ=²&]ÅÈÏÏÖðE5ÚÚÚ„„„ººº}ŽMŸ>=???$$„íCJ,ÐyðàŽŽÎ„ ãããñÐãxübiii"ÊÁLMMÏ;çåå%++kbbræÌuuõžžÖOé0Piii,K´3bAº Œ´¡§«±1«=8—/_ÆÇž˜˜hooÏš¦Ø…ÅAÓUŒ¸¾˜X–®bD ÖD"ÍŸ?ÿôéÓõõõCùIŒ[‰Xùï7õ÷Cij´KKKûùù:tHAAáÔ©S‹-jll¤Óé̺Î,[¶¬««kÕªUãÇ·°°ÀChgggã§ã8[¢Ö¤«Àˆ–tÕ¨FäÂNŸ>­¥¥ÅÝ+±7]X€•骾áþ'S¦L‘——âì¼¼¼×¯_oooŸ7o^ÿŸgvý tZ[[ÛÛÛÄÄÄÂÂÂð¬]]]ßmràããÃc&≢¼½½ýýý_½z5ôL¹ ËÒU`ä WºjTû:†ˆÒU`D±>]Õ7ÜŒ”ššÚÚÚ:”éžž33³˜˜VvžûZ^^^77·ßÿ]\\<77×ÚÚºŸï%ÆL,**²²²zôèÑÑ£GqÑ`«Í= ]ņ7]CÒU`ä°%]ÕO}w«ý.ü$ojjêòåËÿþûo<½9[ô÷åãã#“É|ò䉸¸xÿ£ ™8iÒ¤ÒÒRkkëׯ_WWW¼Â\ÒU\ÒU`„@ºŠëqNºj„<|øÐÎÎîŸþac”ƒúè\ºtÉÆÆæÓ§O¢¢¢C™Ÿvܸq‚‚‚eeeMMMœ0,4{AºŠ @º ŒHWq=NKWÜ ùÇdo5ú蘘˜äææ?~<==}ˆûëìì—““cÁü  ÒU\ÒU`„@ºŠëqrºŠ+õëÃççç_²dÉwÖÖÖÖÝÝëííÍÆØìé*.é*0B ]Åõ¸>]Åúèã§áñSgƒÞ™  `RRÒöíÛ7oÞŒç?tQ£¤«¸¤«ÀH€t×#é*ÔßÔÕ·ZóZmm­±±1ϬÄLBB¤«F»S§NÕ××#HWaõìÙ³#GŽ@ºŠ‹577oٲ寿þ‚të±ôƒž4iRww·‚‚BWW7¥®š››_½zÕ÷6t:ýèÑ£®âX---ÄÔßtïÞ=„P}}=¤«@ÿÑéôÎÎÎ>6èééA%''#„ ]5Juuuá ¿ ÅxžHW±«#J®ŒaSSSSSS¿»¤«8Y{{ûÙ³g¿»¤«À€<þ¼Ÿw5HW^ýoÒUìÂ…a+IHH(**ögK%%¥Ý»wKHHŒt•À@‰ŠŠ~=ýä7‘Éäµk×rZ°ÞÝÝÝØØÈîZŒnÝÝÝÃ^&‰DèÏ–‚‚‚111Ë–-ö:€‘ÆÇÇ×ÏΦööö^^^c°Ï'à¬Kö¨³nÝ:îžÈ·»»ûþýû#º‹†††-ÿ»7nÜÈÞ: _mmí/¿üÂzÿjii½}ûvxËœæÏ?ÿdwÀ÷A úÒÜÜ Q8™¡¡áÓ§OÙ] þÇÛ·o‡>Iߨþ Œ"è€oãååeew¢!Α à]]]?fw-ø/tÀ·IJJ^¹r…ݵŒ& %%%,Ûtìý€áÁÏϯ££ÃîZð?`4p-tÀµ Ðׂ@\‹igäàà`fllL"‘zzz(Ѝ¨(+köµ°°°A¼‘N§§§§Ÿ:uª®®nüøñrrrJJJ eØkØÏŸ?߸qc~~þ×s~ééé988lݺ•Õ »víÚÌ™3ñ·"""‚ýö!::ÚßßèåèééÕÖÖâe!!¡¹sçîÝ»wâĉC/y(ªªªlllÊËËû9š*àdcäãÀ«Qx÷"¦…BéééÙ½{7BèíÛ·111¡¡¡¬«×·´´´ î8~üøš5k´´´ž>}zâÄ ¶ßfß¿ßÞÞþu ʲYýBBBz{{wìØjhh8pà@`` kvÍLkkë°”ãåååçç— $$ÔÐаÿþuëÖÑh´a)|ÐÚÚÚØ~‚¡#ç^%ÀˆâÀ»ÿõëñryyyâöÓÚÚÞÒÒ‚gd “””Ä/EDD¼zõŠN§‹‰‰=~üXCCCZZúæÍ›gΜimm zóæÍ™3gú.§°°033“¯§§§³³óðáÃxû€€€‚‚‚ÏŸ?#„ÈdrXX˜¸¸x*ÿéÓ§ääd<ÂïÏ?ÿ,!!ñþý{„PSSSttôµk×–.]ºiÓ&>>>KKË·oßêëëWTTHKKš››#„˜­ïíí=~üø™3gÞ½{7iÒ$[[[¼k\þŸþÙÖÖ¦  ÐÒÒ’••%..¾xñâêêj„±±1BHII);;!T__ÿ믿¶µµ!„JKK‰ ºïz–——óññegg/Z´¨?3²²²xס¶¶¶èèèÖÖVüí³tíÛ·ïõë×t:]TTôéÓ§S¦L‘’’ú矎;ÖÖÖ¶sçÎúúúcÇŽõ]NqqñÅ‹ñ·ÜÕÕµoß>¼ýŽ;ŠŠŠˆo988XLLlp‡ƒçÝ´´´ÄçÉøñã×®]ÛÑÑÁÇÇ·ÿþ£GÖ×׫¨¨¬_¿ÞÕÕ¿¥±±Ñ××7??Ÿ‡‡GGGçæÍ›’’’‰‰‰+W®ìî©IHHˆˆˆ Óé555¢¢¢ÌÊA…‡‡Ÿ8qâÝ»w222<<<÷îݘ1cÆ“'OB***¡É“'ß¹sgpG8Á<Çús•øæ÷Î;Ÿ>}ª¡¡ÑÔÔÄÃÃ#//ïííM"‘pQT*µ®®!¤¨¨èååEà½{÷š››ÝÜÜ ˜•ßG}’„þÜý¿y× ¬ªªÒÖÖþøñ#Ï„ ‰o<**êåË—!%%¥€€¼rûöí·oßž4iÒ¸qãššš¼¼¼ð µÌ¢‚>¢‘/ô+Ð9{ö,1uåþýûýüü¤¤¤Baaa{÷îE;vÌÐÐ0((!”——WRRrîÜ9|´!!!!*•Êø;€Y9ñññøãHLL$¶ŠŠ Ä1æ€TWWwvvZXXkˆ@ÄÇǧ¾¾Þßß¿µµ5>>¾µµ500ÐÅÅe×®] ¥¨¨($$dþüùd2™Ùz*•š““cgg'--ýâÅ‹¸¸82™¼jÕ*„§§ç»wï¼¼¼DDDòòòþüóÏOŸ>‰‹‹GFF^¿~=...""BPPPVV×GFF&&&¦²²òÀŒ‡Ðw=ííí ÝÝÝ­­­‡2cÜ… ˆV÷ÇoÞ¼Ÿ4>|ˆŽŽÆÿä©©©úúú>>>¡‚‚‚²²²””„ÐÎ;B‚‚‚»wïÆË}—sþüù˜˜ü-'''ÛïܹsçÎø·ã°ø÷ßñt]QQQªªª¡¡¡ëׯ—‘‘yþüyXX™LvvvF­^½úÕ«WQQQMMM‘‘‘¸þsæÌ ÆåèèH&“ÃÃÃB»víbVNyyyLLŒ¿¿¿¦¦æéÓ§¯_¿Žÿ“’’h4Zxx8n€±Î¸Ã˜:Çús•øæ÷Ž;¬­­œœÌÌÌBgΜY±bBèôéÓ:::8¾¹zõjZZþQº}ûö5kÖøúú*))uuumݺ:Ì®Ìê3 ôçîÿÍ»öîÝ»çÎkbbbii‰ÊËË;yòäš5kBÉÉɺºº8¾ÉÍÍ=qâÄÚµkBáááË–- VQQéêêòôôij¨€Y}¾ÖW S]]íííýŸÿüÇÔÔ”¸÷dgg3ÎTWWWG§ÓI$ÒÇœœðJ++«¬¬¬¾?>få,]ºtõêÕ222ZZZø¢®®.„Ð×'Guuõ;wðÿÞ ::: @YY!#&&6~üøœœœÖÖVfë333ÿý÷߸¸8¢äœœœU«V={öìÞ½{Dù¦¦¦ øº£©©ùéÓ'„‰‰ cî“L&Ï™3ç‹¿[Ï[·n={öìÆ---ƒhÿxñâEPPЃŒ‰ßyyyõõõÄ6¸ ‡D"UUUa¢¹¹9nˆê³r-Zäââ2~üxuuu|á!zzzxa„ ééé¡ää䦦&|#Á222œ=zTVV–““3kÖ,„??``àŒ3ˆ©0deegΜ‰—™•ƒ’——‹‹ÓÒÒ222ŠŒŒBéêê677#†6ÀÆÂ96 «³ÿnMMMâOsssâQEE‘XXX0þΙ2eŠ’’Bˆ8få3«Ï@¶¥¥…»“<<<ýõ— ³a@wfwmmmmâO+++¢¥ãþýûDDbmmM´è „ÔÕÕqc$ã7ά|fõùúpú tTUUwïÞÛšššp3àäÉ“cccûxW?1+ÇÒÒÒÒÒòóçÏåååIIIÊÊÊø{Д””Èdò_ýeeeŸ¾³³!DD‚‚‚===t:ÿÉøa+¿¹žN§Ï;—qs|ÅiooG‘‡°°0n¨ÁÕ³ÿ”••wìØÑÖÖÚÜÜŒÏ-•ˆˆˆA”öf嘙™™™™µ´´TVV¦¤¤Lš4ÉÑÑqè»ûZZZßJJJjjjtuuétú‚ <==‰m„……B!¢­û»ÞÌÊÁ/]¸p¡¸¸¸²²òòåË4íÖ­[ƒ¸à‚Qa,œcºJ0ûïþ¢z½½½ƒ« ³ò‡ëªUWWÇÝI …C¥RØ%t÷gv×®oœYùýF¾ÿx¹N(à?•••¿ÙÛN[[›˜)//ïÙ³gx¹»»/¼|ù²¦¦†ØžY9QQQ!‘Y³fmß¾ýáÇÄK¸ëÆ@ÉÈÈØÛÛ‡„„ÄÆÆÒh´K—.y{{ûùù©««khhx{{Ÿ;w.%%%22ò—_~áááÁsAß¾}›N§ãG*ªªªBÌÖ/Y²¤´´´°°°¾¾þÎ;ÑÑчBijj*))ùúúfff^½z555uÑ¢E999¸V8JKK;w››‰‰É»wïž>}zíÚµ»wï"„Š‹‹KKK{{{ûSOÜMûÁƒƒø|0AAÁ   Ü–Žš4iRaaá×›ihh\»v /àˆá[®««Ã™×¾Ë¡R©!aaáéÓ§ûûûãOÜ·ü5<§àçÏŸÕÕÕÏž=kkkëââRXXèààPPPpùòåׯ_߸qcÛ¶mø¨uuuµ´´O:•€“°þ”–––””´k×.„PMM ³rBÖÖÖ¶¶¶üüüÓ§OÇ×Mü¾^9räĉË—/WSS–ƒl1Öα~^%˜ýw?þœñê¡¥¥…—uuu¯^½Š— ‰õÌ0+ŸY} _͘%¢££—.]êàààåå•™™ÙÛÛK4®[[[/_¾üóçϸS ³õ™™™õõõqqq¡¡¡ÇŽkmmÅ÷œسgÝ/¿üáääD$ôõõB&&&fffS§NÅUÂIœÑP=qÏ›ï^lûy÷gv×~úô)cT@T[__?77/Óh4b=3ÌÊgVŸ¯õõxyAAAHHîàchhèääJ¡P²²²„„„ÄÅÅÕÔÔp´»nݺݻw_¼x‘D")++-±FFF®®®|||MMM¯^½RPP@1+çÅ‹[·níèè ‘H]]]ŒO[[[;;;‹‰‰ ijjQöwùùù)((œ;w.55uܸq3fÌpww'‘HñññQQQÑÑÑüüü6668IŒ;ÒúûûŸ={655!´mÛ¶üü|fë·lÙ"$$tþüù´´4 mmmÜàÉÃÓ˜˜ÓÚÚ*--=wîܹsçâ*ihh8::;v¬§§G[[ÛÇÇgüøñkÖ¬yýú5Þ ((H@@ ++KQQ±ïzúúúâ€ÃÕÕµ¼¼¼ŸŸ VTTD¡PpÇ=ww÷]»vÆÄÄdgg ‰‰‰©ªªÚÚÚ"„ìíícccsssI$Ò¤I“ˆ0CCC^^^ÜmðÍ›7x6rfåÔÖÖ†††ß2ãoÖ xyy‰ŠŠ ª««ãíwQܸqãªU«âãã©Tjmmí–-[nß¾-,,œššzäÈ))©iÓ¦ád2933ÓÏÏÏ××WTTtÆŒùùù¸¨iÓ¦¹ºº†††vwwãfÕøøøƒ~³„Є >}ú´mÛ6„Ð?üpôèQ¢AnêÔ©T*µ§§G__Ÿ±?uÆÈ96Ы³ÿnƒŠŠ |‡STT$Ö¯\¹’J¥æçç“H$Æõ¡¡¡ÅÅÅeeeFFF ¥¸¸7-0+ŸY}jâĉc< 0л?³»¶¡¡áýû÷/^¼ˆRRR"Ö¯]»6**êòåË$‰qýÖ­[ KJJæÌ™RXXøñãGIIIfå3«Ï×H!¢óp\Çáadj×'r­IDATjjkkkjjÊÆ:°FAAAaaá‰'X¿ëáí8ÌQJJJllljjj 3 !cí—‹3fìÙ³'#####ÃÁÁA[[»£££  €——7::ÚÎή­­mýúõ---‡ž7o^xxøéÓ§#""¨Tê¼yó²²²p;ÍO?ýÄl}tttjjêªU«tttêêê åääâââzzz/^,$$´bÅ qqñúúúÓ§Oÿßÿýß/¿ü‚züø±­­íæÍ›¥¥¥i4Zeeefffsssmmí“'O8!!!1kÖ,‰ôÝzÚÚÚVUU™˜˜ŒÜ‡Éö0#‘H0{9_ºsçNYYBèæÍ› ,`wu‚sŒ“qwàìÙ³¯^½B­Y³æÅ‹,ÿtÙ`ø[tª««÷ïß_RRòóÏ?3>/ÀbТ3¢^¼xqøðá²²233³íÛ·³r×, ««‹Gõ””|øðáÏÁ0tcíÃÃ+¹¹¹á©8nÑQUUewEF–‡‡‡ŸŸ_O] ^yΜ9^^^8Ë.#Ò¢£ªªJŒà¸•²²òï¿ÿÎîZŒ”vu` ÆÚ92¸ |À(E¡PØ;Ä"#˜Ô\ p-tÀµ Ðׂ@\‹¥•JÅÓÕ‚1âСCëׯgw-£\1ÆÖGLß~ûmúôéx2—àààéÓ§ãÉ•†ÂËËkÔO`ee¥Ç`$Fzþü¹™™žeÓ$''›™™º¹¹1N=Önnnx‚Ž¢§§'É`Ë–-þ‹ªª* bú!0F¤¦¦ÊËË›››—””|wûá:O8ç|ãÊ+ÆXÆ‘ÓqtvíÚÕÙÙ©¡¡¢P(===S¦LaaÅ8EDDÄ­[·ðÛÂÂÂßpnß¿ßÞÞþõ4rlçèèXSSƒnïêê á„!½‡(!!¡¤¤„B¡$$$ˆˆˆL›6mØwÑÐÐÐÐÐÐÖÖÆÏÏ?ì…Δèêê:}úô .,[¶ìüùó³gÏîã-ÃužpÎùÆ•WŒ±Œ;"ØÚÚÞÒÒÒÓÓƒ“~á—**ª¶¶–ŸŸ_GGç»åÔÔÔDFFR( kkksss„Paaaff&_OOOggç°OÎÅŒžÌÖÄÄÏ0Œ²´´|ûö­¾¾~EE…´´t`` ®¤¹¹ù»wïfÏž}ÿþýŽŽeeeGGÇ%K–ܺuËÅÅ¥§§§´´ôÔ©Sñññt:½´´TTTtñâÅxJNccc„’’Rvv6km >|ø ,,̸†J¥âÑ]ñ(ãÄúW¯^ñóókjj+íììDEEcbb$$$~ûí·¢¢¢óçÏ'+áïÔÒÒ’˜fhêÔ©¯^½š1cÆÝ»wedd"##-Z„ÒÒÒzûö­™™ÙÍ›7;::ÔÔÔ<<<JJJ–.]ÚÝÝ]SS“A§Óñ¼E3fÌxòä B:yòä;wî°þ0+utt„…… „–-[¶fÍš;vìØ±c@ç 7o\sÅèóçÏ9räíÛ·êêê>>>Äí™çÏŸoܸ1??ˆ¿o‡«œ]‘@_Nuuµ··7^~óæ ^Ø¿¿ŸŸŸ””B¨±±1,,lïÞ½ø%â½¾¾¾øðRRRôõõñ?^^^FFFßåDEE-[¶,&&fß¾}D`ÊÈȈÇ3¯&&&öçØFŽ‹‹Ë®]»(JQQQHHÈüùóÉd²‹‹ …BùÏþ³aÃEEÅû÷ïïܹóÇ›7oŽE-_¾œL&ÇÅÅá¢"##¯_¿!(((++ËÖ#û†/^uvv'$$ëOŸ>­££ƒ¯VW¯^MKKÃ3¶¤§§ëêêâõçÏŸÇÛïß¿?%%EBB!dii9{ölŽºfùùùùøø þñÇyyyîîîÖÖÖ<<<~~~~~~·oßöññQQQ¹uë–··÷»wï6mÚŒ§†vtt$“ÉDZ3))‰F£…‡‡'$$ ÉË˳õÈ+TVV~þüÙÞÞžX³jÕªÕ«Wëëëè<á‚ómŒ\1:u*22ÒÞÞ~Ú´i4ÍÕÕ511ñ§Ÿ~êã-ÃÕÏ‚„D}:ªªªD«c`` ^ÈÎÎ~ûö-±M]]N'‘H½½½üñÇÇyyyét:1ÓXeeåš5k𲕕UVVVßå „TTTˆŒ°téÒÕ«WËÈÈhiiYZZöóðFÎ"ÇÄĈ‰‰?>''§µµUDDdòäÉ¡èèhÜ)+**ˆ¾-,,ˆy‰=zDt4377'¨äå囚š:::Š‹‹ñÏ9p{ìñãÇ%$$äääΞ=ÛÒÒ"&&†Ûl=ŠO,[¶LVVvÏž=žžž†††ø½²²²3gÎ$ŠÒÕÕmnnFÿÛbÆ&'\p¾‘+¡££#..nÓ¦Mnnn!+++Ÿ½{÷z{{¨!Ÿc\ 8u5yòdÜ2ñ …2oÞmiiY¼x1±æ×_õööÖÖÖPCþèJŒ®H`À§Ž²²2Fû:’jhhÀA%B¨²²‡™!mmí+W®,X°!”——÷èÑ£¾Ëa&*** @DDdÖ¬YÛ¶mhÍçîÝ»wïÞEãÎÈrrr¸ÛùíÛ·çÍ›W[[‹ªªª"*ÝÝÝœœmÚ´“'OŠ‹‹ãî/ìRVVVVV†¢Ñh¸3òĉñã!¥¥¥ÖÖÖøì}ðàÑ“tÅŠ›7oVVV¾wïÞ¡C‡6nÜÈÇLJ[àÒÒÒxyyÓÓÓB555¸k3no?r䈌ŒÌ… îÝ»÷ìÙ36.`   ¦¦&CCÃK—.åääà,̀Γ¨¨(ÄEçw\1G@@`@ ù£+!0º"¦N@@Àµk×?~¬¡¡\PPpùòå… †††R(”¬¬,!!!qqq555„кuë6mÚ4nܸ––qqñæææºº:EEÅ5kÖDDD\¼x‘D"ÉËËËÊÊîß¿ßÓÓ“Y9x¿8#(%%õÛo¿áú¼xñbëÖ­$©««Ëßß¿ŸŸËmݺ7¬!„lmmCBBŽ;†ò÷÷?{öljj*BhÛ¶mùùùø-sæÌIIIùðáƒŠŠŠ¯¯/n•ÕÒÒrppˆíîîVTTD¥¤¤à À544;ÖÓÓ£­­íããÚCëää䢢"|ì]]]ªªªDoÁ•+WR©Ôüü|‰¤¨¨èéé‰×¯X±bß¾}¹¹¹$INNNFFæðáî®®øUSSÓììl¶¶qãÆW¯^¡ÿŸKvrrÚ»w/•JE­_¿þúõë‡B¹ººSL[XXÄÇÇ766ª©©………mذ!4mÚ4WW×ÐÐÐîînÜ4>>wŽ›:uª‡‡•JíééÑ××Ç]+wsqqŠMJJÒÑÑÉÊÊÂWü'øGùè=߸òŠÑ·)S¦ _¸p§®B—.]š:uêàš 8-!À‘ !äâⲇ˜XÆÔÔÔÖÖÖÔÔ”•;½uëÖ† pö”e;-(((,,\±bÅÖ­[qCþýû÷ÓÓÓqSÖãÇmmm7oÞL4ämݺURR’1!`kk0 rú“ððððóóãäðq‘H$ÍzŽRÏŸ?G+))€Ñ™3gˆß=£)‹F£©ªª½A!p¾}aT\1ìíí“’’ÒÓÓÕÕÕðw7 †|iiiÄ] Î-:à ¯ƒ/,,dÍÀ£¥E',,¬µµµ´´ÔÞÞžó¯\<¾BHRRòÑ£Gl p78ßl¹b ®EgX°2!-:`ðh4»«À¹BBBØ]…Á¨¨¨`wÀça”^1 #€Í’’’BAAA¬LŒèl ‘Ãtör€Ñp-tÀµ Ðׂ@翬¬¬ô¾‚§AéééEFF2nßÐÐ0sæÌ/6Þ?nffÖÕÕźڃoÑÓÓ“ü žç!$))‰ª'¼yóFAAá‹Í°ªª* ÎÎNÖÕŒpŽÀùXèìÛ·eû'''„PDDDlllllìæÍ›_ ýb^™ØØX¯‹jll|ÿþ}{{ûˆV|———B(!!áäÉ“'OžÜ¾};ã«T*uùòåŒkäååOž<üuQ mmm#Za0êÀ9À€°%`] S__ϲ} ž9ÖÀÀ`„  ÅÚÚzÚ´iBBBõõõ3gÎ ]½z5cË ‰D³§~QÎâÅ‹ñ |ÆÆÆzzzxÒÝÞÞÞ£GZYYýôÓOK–,Áó€b111¸Y(99ÙÒÒröìÙiiiø¥¸¸¸yóæéééÍ›7ÏÜÜ~ê ”††BÈÈÈHQQÑ××wùòåÓ§O~ýúµ‚‚‚——ׂ U“H¤ùóç}QÎŒ3ð¢***’’’xšúÞÞÞØØX===99¹™3g2Ž-‚²8p`êÔ©JJJGŽÁ/…‡‡«««KJJª««kiiuttŒô‡Fœcc$‡-‘Œ£ó?¬¬¬ð‚¸¸xJJ BHFF&&&¦²²òÀý)!22òúõëqqq‚‚‚x.b*•š““cgg'--ýâÅ‹¸¸82™¼jÕ*„ÐêÕ«ÅÄÄâââbbb-Z$%%•››»råÊG%&&ºººª©©]¼xñæÍ›===#vÜÜLOO/HJJâ‘*äåå“““ïÝ»G¡PúSBRRF OHH’——GíÚµ+##cýúõ222ÏŸ? #“ÉÎÎΡM›6IHH„‡‡‡„„ØÙÙÉÈÈdffnܸ±¼¼<&&Æßß_SSóôéÓׯ_‡ï”;À96999Q(|G={ö,..Žx544tÊ”)ŒÛã$@yyù×·" ƒŽt¶oßþùóg„Pii©··7??dd$‰DéýN\\ÜÛ·o#""ˆŽL&Ï™3G@@ Ÿ%hjjâhÝÄÄ„˜²$33óßÿeü7ÈÉÉÁŽœœœ¾¾>BÈÏÏoíڵIJ²²¢¢¢ÇŸ2eŠA`` þw•––VWW@LD&“-,,Æ×ÏtuuñrKKKbNéää䦦¦ððpb³ŒŒ |š8qâÌ™3BáááîîîÄòòòâââqqqZZZFFF‘‘‘BBBÃqˆ€Íàƒˆ$@ss³‡‡Grrrqq1Nüúë¯8É8qNðò~yÏ]¼xquu5BÈØØ!¤¤¤”ÝÛÛ{üøñ3gμ{÷nÒ¤I¶¶¶Äüí111ÉÉÉ!__ßÔÔÔÏŸ?{zz®\¹!—™™ùáÃ)))žÜÜ\Ι+½‘Àˆ:Äi``àîÝ»GzwCôã? ôÿ Õt:}îܹëÖ­#Ö|}õYºtéo9räÈßÿýäÉ“ÂÂÂâââK—.ql€ÈÉŒŒŒDEEŒŒ†7R¤Óé ,ðôô$Ö ±ÍêÕ«¿xË… Š‹‹+++/_¾L£Ñnݺß)€slÌ‚$@?±7€ÔÕª iiiëŸ>}Z[[ûäÉüª„„ĬY³Èdò³gÏ^¾|ùõz„˜˜B(--MZZšF£UVVÓh4%%%ºººÂÂB999ÜÀSQQq÷î]b×?üðƒ¢¢"BÈÑÑñóçÏÎÎÎsæÌéîî.((èìììÃ@=~ü!D£Ñ„……§M›F¬øðauuuee%~UJJjþüùd2ùÑ£GÏŸ?ÿz=BHBB!täÈ™ .Ü»wÏÜÜüüùójjj555ÙÙÙ'NÄý«îܹSVVFìZ[[[EE!dmmýéÓ'___ ‹®®®ììløNG;8ÇÆ8HŒ ¬ t8üC'&TC¹ºº­Á¯_¿ÆËAAAYYYŠŠŠîîîß\ÒÐÐpttÐILLLHH066¦Óé?~ ˜:ujÿßîåå…G=Àh4*"Á:ÎÎÎÏž=ÃÓvuuùùùQ©Ôá«8Ú¨ˆ†'uõþý{Æ5QQQxî:%%¥€€Æõµµµüüü:::ÄÊ… ŠŠŠþñÇ’’’þþþW¯^•’’–º`¤ql$0¤@§ººÚÛÛ»³³³   55•XŸœœ¬««‹*77÷ĉx6ù””}}}¼>///##oŸ˜˜˜””$))‰Z¸p¡‰‰ D9çãüH`Hã訪ªÆÆÆÆÇÇ———ÇÇÇ766âõ÷ïß·¶¶ÆËÖÖÖx¹²²ÒÒÒ/[YY)))áå‰'~üø±½½!TXXH¼œŒó#á0ŸŸåÊ•¥¥¥ƒ.aõêÕ§Nêèèæå…‡Þ€Ñ„c#aùþýûjjjxY__?77/Óh4¢¶¶¶ö•+Wðr^^Þ£Gˆ·ÿøãÿüóÏåË——.]:\UËpf$0¤ÇË ¼½½B]]]jjjD¯¢µk×FEE]¾|™D")))ùûûãõkÖ¬‰ˆˆ¸xñ"‰D’———••Ý¿¿§§'~ÕÜÜ<++kÙ²eC;"°Â¨ˆ†ôx¹³³3³WûW3 bö–ü±©©iÐõ+ŠH€ƒ&õphase_nameE>) where modules can plug various callbacks to extend and alter the default behavior of the webserver. mod_perl provides a Perl interface for most of the available hooks, so mod_perl modules writers can change the Apache behavior in Perl. These callbacks are usually referred to as I and therefore the configuration directives for the mod_perl handlers look like: C, where C is one of the handler names. For example C configures the response callback. A typical handler is simply a perl package with a I subroutine. For example: file:MyApache2/CurrentTime.pm ---------------------------- package MyApache2::CurrentTime; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; $r->content_type('text/plain'); $r->print("Now is: " . scalar(localtime) . "\n"); return Apache2::Const::OK; } 1; This handler simply returns the current date and time as a response. Since this is a response handler, we configure it as a such in I: PerlResponseHandler MyApache2::CurrentTime Since the response handler should be configured for a specific location, let's write a complete configuration section: PerlModule MyApache2::CurrentTime SetHandler modperl PerlResponseHandler MyApache2::CurrentTime Now when a request is issued to I this response handler is executed and a response that includes the current time is returned to the client. =head1 Handler Return Values Different handler groups are supposed to return different values. Make sure that you B explicitly return a wanted value and don't rely on the result of last expression to be used as the return value -- things will change in the future and you won't know why things aren't working anymore. The only value that can be returned by all handlers is C, which tells Apache that the handler has successfully finished its execution. C is another return value that indicates success, but it's only relevant for L of type C>. L may also return C which tells Apache to stop the normal L and fast forward to the C>, followed by C>. L may return any HTTP status, which similarly to C will cause an abort of the request cycle, by also will be interpreted as an error. Therefore you don't want to return C from your HTTP response handler, but C and Apache will send the C<200 OK> status by itself. L return C to indicate that the filter has successfully finished. If the return value is C, mod_perl will read and forward the data on behalf of the filter. Please notice that this feature is specific to mod_perl. If there is some problem with obtaining or sending the bucket brigades, or the buckets in it, filters need to return the error returned by the method that tried to manipulate the bucket brigade or the bucket. Normally it'd be an C> constant. L return values aren't really handled by Apache, the handler is supposed to take care of any errors by itself. The only special case is the C> handler, which, if returning anything but C or C, will prevent from C> to be run. C> handlers should always return C. =head1 mod_perl Handlers Categories The mod_perl handlers can be divided by their application scope in several categories: =over =item * L =over =item * C> =item * C> =item * C> =item * C> =back =item * L =over =item * C> =item * C> =back =item * L =over =item * C> =item * C> =back =item * L =over =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =item * C> =back =back =head1 Stacked Handlers For each phase there can be more than one handler assigned (also known as I, because the C functions are called Iphase_nameE>). Phases' behavior varies when there is more then one handler registered to run for the same phase. The following table specifies each handler's behavior in this situation: Directive Type -------------------------------------- PerlOpenLogsHandler RUN_ALL PerlPostConfigHandler RUN_ALL PerlChildInitHandler VOID PerlChildExitHandler VOID PerlPreConnectionHandler RUN_ALL PerlProcessConnectionHandler RUN_FIRST PerlPostReadRequestHandler RUN_ALL PerlTransHandler RUN_FIRST PerlMapToStorageHandler RUN_FIRST PerlInitHandler RUN_ALL PerlHeaderParserHandler RUN_ALL PerlAccessHandler RUN_ALL PerlAuthenHandler RUN_FIRST PerlAuthzHandler RUN_FIRST PerlTypeHandler RUN_FIRST PerlFixupHandler RUN_ALL PerlResponseHandler RUN_FIRST PerlLogHandler RUN_ALL PerlCleanupHandler RUN_ALL PerlInputFilterHandler VOID PerlOutputFilterHandler VOID Note: C> and C> are not real Apache hooks, but to mod_perl users they behave as all other hooks. And here is the description of the possible types: =head2 C Handlers of the type C will be I executed in the order they have been registered disregarding their return values. Though in mod_perl they are expected to return C. =head2 C Handlers of the type C will be executed in the order they have been registered until the first handler that returns something other than C. If the return value is C, the next handler in the chain will be run. If the return value is C the next phase will start. In all other cases the execution will be aborted. =head2 C Handlers of the type C will be executed in the order they have been registered until the first handler that returns something other than C or C. For C API declarations see I, which includes other types which aren't exposed by mod_perl handlers. Also see L =head1 Hook Ordering (Position) The following constants specify how the new hooks (handlers) are inserted into the list of hooks when there is at least one hook already registered for the same phase. META: Not working yet. META: need to verify the following: =over =item * C run this hook first, before ANYTHING. =item * C run this hook first. =item * C run this hook somewhere. =item * C run this hook after every other hook which is defined. =item * C run this hook last, after EVERYTHING. =back META: more information in mod_example.c talking about position/predecessors, etc. =head1 Bucket Brigades Apache 2.0 allows multiple modules to filter both the request and the response. Now one module can pipe its output as an input to another module as if another module was receiving the data directly from the TCP stream. The same mechanism works with the generated response. With I/O filtering in place, simple filters, like data compression and decompression, can be easily implemented and complex filters, like SSL, are now possible without needing to modify the the server code which was the case with Apache 1.3. In order to make the filtering mechanism efficient and avoid unnecessary copying, while keeping the data abstracted, the I technology was introduced. It's also used in L. A bucket represents a chunk of data. Buckets linked together comprise a brigade. Each bucket in a brigade can be modified, removed and replaced with another bucket. The goal is to minimize the data copying where possible. Buckets come in different types, such as files, data blocks, end of stream indicators, pools, etc. To manipulate a bucket one doesn't need to know its internal representation. The stream of data is represented by bucket brigades. When a filter is called it gets passed the brigade that was the output of the previous filter. This brigade is then manipulated by the filter (e.g., by modifying some buckets) and passed to the next filter in the stack. The following figure depicts an imaginary bucket brigade: =for html bucket brigades

The figure tries to show that after the presented bucket brigade has passed through several filters some buckets were removed, some modified and some added. Of course the handler that gets the brigade cannot tell the history of the brigade, it can only see the existing buckets in the brigade. Bucket brigades are discussed in detail in the L and L chapters. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/in_filter_stream.dia0000644€ÿÿÿÿ00010010000000764411727205031023223 0ustar ????????None‹íÝo#·Àßﯠ¸šßQ|A›"@"}húl¬¬µ¼=Y2Vë8ÎCÿör¸²­Ï³,’›ÛÜ8¸‹-ïíhVœáoÈÎ÷?üv;üZÖËj1¿8c„ž ÊùÕbRͧgÿùå§oíÙß}?©ŠïüŸi]Üü¿˜/á§‹³›¦¹ûîüüááÌ—E³¨É¬º'ËòüÅlVœû‹ÎÏ>¾ Öo0)š^[½Z4M]ï›r0/nË‹³qqõiZ/î瓳öªÕuW‹Ù¢üZÌ.ξ¹_gç«ÛœoÜç3÷¾+¦å¸.‹O‡oMý—s§Üú®¬·o{{·XVþ’æñnç’÷¿×®Y]µôͧ¿ù«ü¦}K«^îµïÒÜõ´šïÊñÏfÖ>N,çÜ? 嬣FöôLÞ.nÜ­¸Y·âênÅUËË»EÝÔEÕìŠ/³²˜·R›ú¾<]Îòª˜ù!ö9µ"´¸®šfñÊû¿.fËch_~¶¶·Zî´®&Ÿ7Ü+Ü塚47—¿ez\íÝ3Ýý×jYgå¾w_Í›d·LsûíO'xï—9Ú»œ&¶T¥zûô0½¯&åò•a¶yÍ;ݬ.;í©o_wìƒi_Úš¬ƒˆYñXÖ«Ûÿíeš¬>à•ÇY{ ‹ñË«f¥Þ¿›b>)êÉàÛÁß¿½P‡gŽjrqö/ºùx¶ò7óžoçùÜ-ž'R e†œ®¹ÚV}×q3oK©½Å|:+Ÿ%±V’¶^ÒHXbÐCî Ši~šärVÞ^^-êù.%¤V2ˆ NeWÑ'‡"4nã+BÖMYMošÃ˜%§ê2^Ô“²~MJ¨¥›_'~LÕÜ@—›~b§(¯á¿ÓD,o—{@øˆYr¿K:±Æ“͓ڧ ”Z?rá–e6O§W’$kÍ“K0OJ<{e5Ï$JežŠ0§rš¤!L&°ÿ¯Ü>7)<ŸyòXóTDR§ä0§a*"¬ô2$qF˜‹üCpþT‹œf©Ü1iüÄœbügœ‚0ËDf‹T[)¾s9öWóòrÙ<ÎÊmåüþ¶½»ìÂE¬%2M˜*ÿüsÚ"HáAŒqáA¶µD¦òZb´rÇÙ¢s¹ÇÚ"5mñ°ÅŸËæaQò¦øãlq?ÙcŒ2šZ%Q†±¡Ÿ£ŒÉj[’F ?3F´ÈL­)”<ŠZ ÛÆ,£a "”ÐñF󫺥ةšaª÷ŸÅ×VÆi"®«Ùì›»,lágèÎRÙÞEÓ·ˆmÊßš³W–%·®9ôœÂ>ÎÆu[[>6|>³JzèS_Ì›}‚àõÁuq[Íaùó¾®`‘¯|8„\i{‡Û_®?Ï·¿£ÝkLÛ± Œºéâ÷z@ícɇÌ2*NÜvðy”Ÿ"¨˜UÓùm¹ÿƒ}1v¤”½KÄoô-³êîòfQW¿ûaUÌr~ã'û¦ºJ äØÿOïuö †Šæ~{lj¢2/yIÆúÑ®ˆqÎØ“1„úÖÇ­'¢ÆÕb>¿,ç“ ÑIzî¹Ô¿1>íy¸ºÛ~#ûöœÒÓ@*^÷Ïó²¨ëÅÃá îd4|ºõ嬜O?¯Îgüñi"_}€o•˜Æ†u´ Kâãhæ´^/ƒKçíÂPéÄBjm¤§wá‡Ém½»îòÁ(ªÐtÑt“šî/@Ö»¦kbM×éMJæ´\?ãq˜÷¨yÐä¾·_~ 2-›Ëq]M‹Iù~<þðu†$js3ÜÙÜ!ÉîxÄX$ã²½N?Qv˜¥Y÷¶½¦`ÍŽ„ð `5,ÛSš9í$V¹ã–í­Êt´…Ɖ3§>4\¶ÏËá.Ú…‡ccZ¢s'›„½31„ÁkõÈŠœ‘ÚºÌ,~P˽¬)sp©¶©©¼*gÑYÌ[Òö¥sFÔ†@´jÔˆ³ MõÊGHåPùžáˆXžX|âi»ì§d¾¬[ø‚pe—Ä Êg$$LÌv•Œ163 Ôsæð>•ö beSÔÍk󳈾wwôºÐäSô³Ë˜Ïý8ôV³Ü™{ž~3¸ñvNš šEHŒ¼üvc—üÉÄ·nšˆ¢óT¹óó´å’ÈÌÖ̽›7>¼ÄòPåÁˆ€p[A¾ï"ø¨¾¼¬æ_#°Üpp" d'D‚xÂÀúYÖx<‡Ç" òl{lýè0²Ûã]EVWûë<Í»P®"3/"jÂB}Š÷*Ö+€§KîÒsÜ.&we=»¼®fMY£Éà@ŽFt#Y݈J°1èMÙ‘Üû‚íF@ˆSü·Œžš6ץ߃â®~Zʼ¼òÕ”£wþ“÷ËÅÕ§²Æãá`Yý^~€×›ûzî_ÁÏn<÷Þ?ƒÇ¡_®ÇI’…hÃJ =}³ï¸HGøÑa5l™€¤ƒ ’Õé’»t@„nÉÊW ~þÚJ,Jä—¬Þ$:1R(b¡:Ð!ò†ABî4ƒŒî0DJ ’èE´*HÅø'G‰Ö¡aˆþ#ëþ«?øÇ„ÀUeÏÅò’„¤°(o¥ÓzÇ~P¦C-2÷þë!=÷G"ž.ÅT,LÅê$§’%Kªdæc‘9©R1ÊqµU©ü̼…3ÛQZ厞ò¢© —*L¤èi"Eã4EÜžªmVó’„¢n’òÆ þzÉ’›ÝÀêyè¼ &Ѷ¾nÛb)ªë• #<óäÕõ. Z˜¼$T×+ã§åç®NŠë÷ª¹× ×.\ª-¦~åÆãã<6±™HYã<ßù¸ÎONPÓÆyZB!œÌeóè¹?Î ×!~%Öu`–Çç­A=°#&oÚˆà£ð T¨ãùX¸ys`ôáªkV!œ"«`½Dæ=Cd@Ž+oy·{4×~¤½_ŒÇßþeÚŒ®«zٌګǣÁóës/íCxùv1©®ß?ŒÞaöIçåv»£“O²:•*ùÎEvÂv|âc^å%='Ÿø×ÕÉ’1ùäÏœ|²3(c²z“èT6é#zèwäeySÙäªu‹% $àŒz$+†©lèMŽ”èM²z“À›‡i€Y›u‰ÒY"À&^x“0d€MN–ŒÞäOêMöJô&Y½‰o™eD»ÓÆ•ÌÚ6k%Gy9pr¨´aWA›SÅâzK?|Qçë-†4®¹¤hRôSU—Ål¶ÏE'çi•2ÍÏŠ6š0'€SÁ™Âa&œ:$\ÖÞaIT<æ Rê‡?5JHãC@Ë…9ûAN£—ǰ;ÑØ(ïiªØœ„×'eM´–NÀ™²›.lNt4bˆèôd?å[gT˜©aYÃiGe€Œ‘õ¼Á8 „ÁŒÎII4DÂ@Â@Â@Âèa"w|06\,ÆqË©‚%8™Ñý_:oÊHhsîÔˆk†¼I®ÿ˜ßÝ7žíàlµÁ7E5ü½hŠÁO³Åž5ç°Æí¡ˆž0w|ÂããG u@ï’¹œnÄcµ°Ÿp8¨Ä;i“å´ˆjj~Dˆ’@I Q0DÁC”…(–¦ µ6\,NÌ¢"¾M¬¼ȰD3¶Ž#ºŒ$J"d d d dô2ø;„ „Œ8ÈHÐyBu~¤o@£D™¶‰\nÈH¢$BBBBF¯ Ã!d dÄBF|¡>%ÂrÖdÀQBšÉÈ`Dòn #‰’}:ð‚Â!¤!!#2â[QÁÑ`¦È`„ ½œpg»ŒJ"d d d dô 2ÑZ#d dDAFô±>ÌÏù0ÿZb¹ÉZûN÷a‰¡†8)™d€%Hë²BF %2222úÆÓ…½¿Ø†‹EÈ@È82lÈ°Žµó¯ÊZý C m!Cb8ÁWˆ¡mfĈW£_ÝM¥+ÄÐx'"ÆIˆáôx2Ô*˜™Î»Yb‰²ÆzI^l–8bB£ -òF ‘0000úDŽ0fL l?‚€q`Hšàˆè\Ñ`@a  u%F ‘0000úENr$ $Œˆ>ÄÏÏó¢€£û6ƒÑ a$Q    £G„áýžAÂ@ˆ#ŒèS>ý<Ïl7„ÁÕë„Á çF ‘0000úDŒ(‡„„EÑG|úyZ¿wCN¬¥apAX|‘BAä ä ä ä‹>ñ'RcòE_È­š¡…ä\æoÕ }Jœ'ЧfÍЧ„q8åÓånÖ­$2222FÏš5CŸïb醋EÈ@È82T‚fÍŽ…àLþf͆J #4kæÊµ„ÁlæfÍñ"a a a aôªY³¢T¨–0.c aœD:E»U+á€MÓA»Uc ó™~n·ê¡Eîn«Ñ:"c c c cô¬ÛªÑ60ƺ‡EÄ@Ä81LŠf«¢Ä€f«| 1 Ùªì1’興ˆˆˆÑ³^«# 1lŠV«Ý F8c 1B«Ué:@Œ$:"b b b bô¬Ó*""Fb¸$V…ê1B£Un_­ª#‰ŠHHHH}k³ «HH§†¢Iº¬ÚNJ§Ìap"ºà‹ "_ _ _ _ô­ÃªA¾@¾ˆá – bUp¶*7.oÅ*c",Ùùy˜CŪP±ª¶ºÿe©XW£_«’AŪÜêaqiå•Xf©å–\véå—`†)æ˜ZF™œ™TUIæšl¶éæ›pÆ)çœtÖY#šUM©¦|öé矀*è „æˆ'Uz®X袌6êè£Fé¡S%*饘fªé¦œvÊ#¥RYê騤–jê©¨Š jT¢¦êê«þ°Æ*묫Óꬸæªë®¼öYë­½+ì°Ä{䯠îiì²Ì6ël±ÈâV•²ÏVkíµØr-VÔfëí·à†Kç¶)**î¹è¦«.–äZÕí££˜K¤ ²$±£=kô`¯‹ò²Hï¾ëÖ¨J¿Xð›c»Ó&ìhIʲcÕĨˆŒÃhƒÂ-BãÆy1ÇqŽLòŒ §ép£™qŽ-ãø²‹1\sÇ2Þ|òΞ¦<Õ»l¾¶¨’K-›´A²‰‹ÐbC@ü ¡äb-O³XÍ()±@‹£Ôk-²ÌK4›Ipá ºÁ¢""´(Â+,Â<‹›TÁb´¸ÉÈ¡ Ñ¢'ž·È„ ÖÀ¸¶:;³=‹ßëýôÕ³x}öÎVa3ÖøŽsŒ:3ï¼É4~Ï„ìçBrI³øÅ¿;ž3†Ç/ì¹h|,¢Þì‡?kèOaµóÏÊÈä± ²¨fî«Å‹ö@š-oq² EÿX¤Á}FÝ;aøb”ŠÐE%|VËbÖ=uð}5úÞËNˆ.÷µˆ þ|‘õpq/´‘[ÄCqEJ“1Åepƒ,º!‹Üw9íÕMG)üâ‹tÖÅ5qX3ô üb¤Eg qFKÉÞˆÃ-ºh{e\  ™H;iYXoš¢Ç!ÀÏ0ÐD‹B0U¡y,ô*G1â(Œ{„Ñ £PPÒ’ÍJc‹6ÉFN¾è‘£_%½(GŽa -òÆXDÈE²•ü¤Žâè½>žÈ?‹b˜ÚUP Ø]2 ´õ€rÎx„Ôra&|Â{ j’@›Ÿ0 j t*LFU¨‘:*R—:.`"*YE-ÔÝhq¦rjªUµªVýDTlµ „iÀV×ôU°Šu¬O*+Ï:Ö®¢õ­pë£Ü*׺Úõ®Mý%·¢Š×¾úõ¯K¢+`KØÂË©•‚ªaËØÆêH°ZªFðà ÉRÖ²•lf/«YÌz¶³ å¬h7KÚÏŽÖ´¥ mjO«ZÔº¶µ°åþ¬DË(n¬Ãΰ-nu›ÛÛöv·¾å­pƒK\à÷·Èîq•›Üâ6w¹Îe®t£K]覂l–4¡& ÃÔð.xÅÞï–w¼æ%¯zÓË^ôº÷¼ð]ï{åßöÖw¾ö¥¯~óË_gÀC€sÂÆ:Èà ØÀp‚¬`;¸Áf°„LáOØÂŽp†/¬a {¸Ã ž°“² # c%>qŠQlb«¸Å+Ž1Œgüâ»øÆ2¶qŽqLcë¸Ç;2‡üãë£o¤Ò.–0èÈå Ò«Ô‘‹aL¹ÊW¶2•µŒå-gùË^s—ÇÌå2ƒ™Ìg6³þ˜ÕŒæ5§ùÍnŽó˜Ÿ4‡&8y/ÐÐBv*ÅvéÎsá9¤è¸<©Ð{9•’¯Ô6 º-•H„¨aG·ÅpR2,M `Ïz-—‘°«#T‚Ój±€åd 5 :Õ«N’?ìüê·$É£Z´F@ƒÙڈɵ> ”íì´pA Nªs±Û’gPg@bôQ‹uÜhÙg4¡±M–Cs›-Šæ3«üL$pÐ Ÿ˜C.âP£F;,‘žt¥ß LkšÞhñ´³¥Dî!€²¹ ’ðß]QµZp¯(¼I³n8Yn½ï3ñy§<ÊB\„ °A†ˆ°þ%®•a׉ä]9v²iò¯4»Tºî5£jX€YX[Ôò­h»çYñ6пîP»‹¯6RFdFŒ‘0¥»‡N•x׉ÒT¯Š½›´é¬oEß0·­ú-$e°UF †:0¡S{]*§Ãß•¸/)ât¿ ÅÃnô†Ýˆ ¹ÈÅ’&(£ Yx:#¡Ž9àZFÞ‡>^1ò·›œNy—ŠÊ›¤ìÌWååI;´a¤ L hÀ0ˆ~àrhƒ˜Ð…s AœáùïÚiОzï©Rôg“=HkÈtŒ¸0Š9ôà -šúÛ­N'¬ç}ëLêúð¥þöÐ÷]eFZƒHO8¬.r;ÝíÎjWçý²fùö÷î}ã_é5Ê….+‹60Á .Ry^wysÒ{›Ç$·}Ãz¹&zÇ$@€ ýôŒPz0#½÷s™'| è{|g{e$´<#°t4"}^G}sb}t‡}K¢} Ø} ø}Ád$7 àÀаs4¢~op2wëkH‚w H5‚¢V$4 `J¿ÖdtG€rb€ÈÆyò7| Ø3xFrRxmÁ÷{Û–w¨€ÅÇo`Ø%*Hã@Y^1¡`_0ÇRÁ‡RÄ`,h#&€[]â‚þoƒJ"ƒÛGƒ^hƒ¶ƒF„mqW±jñV1R‰8g†!„3"y4…ZB„Ah„G‚„ó÷xsN"€`!!  ¶ÀÃ`ð0 PU!  dŒ&€ ž€ 0`bÃ`‹¸Èj Š€ (‘° &Æ‹¾£ ƈŒÃ0ŽÉ8 ûQVX#àpµ0ŸÀ Z‚…+× ¨gȆ!øge¡‰Ã° QA½hQá‰UQÑQ Ìð‰Ãài ð&¦Rq‡ù‰ŽRà©i;Âã´¹0£ ;W|è$ö(þkhqûÈ%oø‘9 w8¢hé9 ž˜“ÿ8 ‘ˆi‘ É“TѓÔQþŽ…1ˆ5ÂñÄ"m p`¤æ$ˆèuŠ˜$Œ8|Ž‹_X“[B‰`A€ÐØðt8 zð£à~QµÐš@)ŒØ0˜ p)—Ãð`@ÀÐ`‘ =ti—Q!Æ0 ~ ˜äЙ9 w€£ÈŠ2¢mð"o°p@øÈ$ªèu¤h$®8|JøˆLxt^B‹b1”má›\ a°‰ëH#ê€~/BIðš€RIBZh]¨–(A^rtþ0 tðÛÙ±±#É9#x  êP “$.‰†0“XúØ„6éhr¡½Ø‹Ð`RPL@ 7`4  Ÿð £0 ¡ &à $`›Q6#ýPê0 cH$c™ue‰$gÙ{i©-k)Ÿmyp^çʰFà ž`Z ª 4`!ôŽÐW#ððpG›Y7›ER›½w›Ö™›~×%¼9tÇ9#pP3BŒ éy$Ò‰€[Ø{Õé¡× EÙY†9#T O÷ j$ëIwi¸}3ùGÈhô9}’–#s°{. `‚ àƒJr¡T—¡G²¡ž×¡›"‹þMâ–TÇ£02†XY€sg›|¹ŠN⣞¤X*¤àG¤Thyz#úðì“êP!w%Sº$ ¸}W:¨ª›üø’9¢bàqÊP>-y†hÚž1I(ñâ#„Ê$79tXI#ú0p—%|:t~j$€šy‚:#¯pïpe“62KB ¾ÚªCÊ%†:tˆºAìÖ%:z¨¦Ù£UZ©°x#¬cJ=Õ=E¢­=ò«KR¤@w¤V¢Jš#§ª$©Ê…¯¹Kƒ H½TY`Ã:Hæ8Œ“EÿÇ"öÀ7´4MC98/£­¯ ªðXÜš©\"T€";²$[²h o²*»²,«þ0³2+³  3{³1 @° 8‹³  =‹³•ÐA{³`\ñ%ÞL77r¦o—¦Ãç#S »—1ä D/‚&p@Öæ À#<·´;ä"´À ª œ8B¯J¬XÁ <°t»xt{·x»„@™ ,0#з‚;¸zËøp »—€ŒÛ¸K¿À¸EP *ถû ¿`¸“[¹–Û¸èÀ·’K¹ë¹àŒ‹¸Š;ºŒën°Ãz%aP"0pˆS#É tËZ$ÍšwÏZ?΀“1G”6IDE1¢­ÿé òj¼.2DE4JÔ@§›¥W¨"þºa vp ·  Ü ½À½â˽Ҁ>0J j`Ⱦîë¾W@v@P0@ ô›¿ùë>ð ~@¿0ðÝ ¿û‹ð¿ÀLÀô¿þ ÀÌÀ ìòK¿ö‹¿L¿0 ™°áÊ$a0ΠFðIP»2R®àz®DB©™g©Jä7z1yĵ/B \µÀ/ƒAwÄFjÐy#n›$öj–@nà l`KÅQüK`À°Oð¿Ð \ÜÅ\< ¿€ *  ÆhŒÆŸ; b\kPiœÆIÌÆ€àÆpÇhŒ„@ÇvŒÇh¼Áþa<Æe|Æ~Œèà\rª%!Ü"Ø@ð82Ò¯Iò¯V°9’1ZòêI2BJ/bŸ0zð ¡Ð"µÄ"†ôÃ0¢­h@QJÄ{ƒ¯Ú€@ :0 %˾üËS°ˤ0 ©ðËÈŒ ~Ë[0 ¬€Ì¿ìnàË%0 ]͹, ÓœËÕ|ÍØ ™°ÍÐÍß è€ ñÀÌÎ\γ ÚÀIë%b Âç '0µ^'µÈ#EO`­ÎàO/%PÎðPÅ"}ËCs-ÒL²ðL-ÂR²`P½ê ¡P3e#EŒ$pk Ð  0 i0Ò(þÒ¼° ÐÒÕì-Ó2ÍÝ@ ¤àÀ 6½Ó<]°Ó¢0 +ÀÓ=ýÓ6ÔCMÔ;=FM H­ÔKMÓ6Ó: Õ¤PÊð¬¯k%ã@Ï/‚ &`~ ^óö‚Ê—}1Ù»˜ÒÑGò­W ?¹ƒ°›Éø ’[Ñ<ÐaÐ×]1€Í#€¯ÐxPuÈYñÁKòÕ3Âc½[©Â@çØ@âÂyÚâÖFrÄU‘uà¤]Ú¥ ¼LÚu°º0®ýÚ¯= BðÚ4 ¶}Û· Ã0¶Ý -€ÛÀ9mÛ ðÛÀ}Û ·ÍÆ}Ü©ÜË]ÛÎþ ºÍÛ©À Å0Œøú#ÜÐzÞx0Þxpw@èMö0`-#\ pkð¦yw€¨š®™·ª=Ë‘¸¥^qËå,Ãà ¹ÌÃŒÍÇ0 ‹àËÊ\ÎÛ0 òËÒ\Î/0 ÁÍâ Í^á¹ÎNá¾|ÎéüÍ þà0 è Ýñ|$x‰¸.þtàã1Îp#óàp𸵺jkš'mj%]þýÍ.à@àß|à žË .âáŽÌná®áà<å¿\å¹ â å%~âÛ}]ý$ä52Šž·Ûs¹K$»Kwl})ž]$pmEŽÍG>àþ¼ä®àË å$áßÌåÚ|å¾Ìá…îá]ŽÎ_Nâ&¾ØÌÂMræ3b:éiÙ=‡Ù?¢ÙtÇÙ™RçDÚT‘çмçIÞçþçNîÇë².ë+àà±.ͳžë’@ᱮ͹>ë» ²ο.ëÁ.ëÅ€ÎÅëµ.±> °Ýí$e€æ0j§é.BÉHbÉž‡ß£®ßØYË\‘”À ê¾îë&­î°'ô^ïõõž×]Á×~=Ø[!Ø^Q†ØÊ  c~_Rðð"à¤Q˜Ï;¾Ï=Þ?þTm8Ÿ^!×]Q×w½†½‹ Qò$_þòŠÀ$BPò%/(ò*Ïò%/¿1/ó Oøð /òŽó‹ ,€È®§\rïÐ"à¤Q'#mÞro>$qþvs.)¤>$wÚy°[ÎÌõ`ö^°Að/PÃ`f¿ölÿäÍüÌßLèãlÍß|èÜL÷߬èsïÍØìåðöì,æ“î%Hï à¤P¦.Âé-çé>êo'êmMîZª©ý˺ÌËå¬äPÌÇüÍn¿Îq/ÎäŒÍv¿÷å¬÷¥ß÷Žþ÷¢Í&ŽâŠì%æ ïÀ ø/ò~xwÉvˆ‡zØû½? €Hôí¯öwâ>ùÔþ+‰EE¾Ë½üÍœïùåúpÍr¿úÈ|úÞ̪÷¬â€ÿÍ&Nô>ç%h û?–hÀIþHœXS1”¡XüÌ¥áLà@‚ D˜PáB†  5LâDŠÃ@¬H‡=:ë×&ãH‰€(@‚¤cX ”-]NY%©a©\ÞDåå–a¬nºôã¦e‰a]~¢”&%Q£G!eR ‰©SHèPÅÛÙ“ê¬bÚX¤X)ÑG² «}¤fìÚŠbBh²Åe˜½ k ëA¹Œ"&h"ƒ×&OØ`‘è.5¡¡MB¤MˆéÚ•8j¢_ÀÃ8þö‰â™9ÆØžFMÒÓ£²“¥†[ölÚµmÇ" õnÞ½b\{1"ɾyÛ¨;A7:R Ö\út^Kº\4L×uîÝÙu‹Ç0QáÍŸïÖÂ|šacΟ¡><{÷ï̓“…¾}󾇯<þ¢¨C™8¾bËŒc°![Ô¸M¢$ÚD"ê2A¢H A¢F$ …™‰6fÂa*´f‚Sd¢P†¹ð C›¨Ãa>´ñC)'ÂÛl0!šð±H#D²È$²I',áÀ*îI‡˜¶X`Hm%LC Ok€‡ÔÂ03µÒD­|^I zêÈþä´3аÒJ##¡ÄЏÉFIÔP">O&b†i±E?_¤ÒaTÂÌ(zeÆ$SãBŒ<šƒÈMG%µT$¡ÑâSU‹’¤)‰ãhÕ„dK ŽnÅWS »µŽ%V$Xa…•HØï@6ÙdÙ[Ùn6P6Ú1†iÙ: 6Ùi«E–l³e`ÛdY8\˜µ¶˜!êøÚ–t½ø ¯ñŠWËÆFhHˆži¥uÂ|ì¨Gï:©ÏµÞÜ%Ò«2={”ʦÓN<÷ÈoEêª áç'©ÓÖ”‰š†B¥¿ÿ+BûЇ<Š(O#±"œlþ~ö¸èE®h?¡ÜõN§½ðµ„tÞãèžRA”Œ¯å;ŠØÎG€85ô¼þ·ÂÝíà`„΢Ö~(t'bÀ‰0og=KM­†5D\ô$X¾šA®”(\áƒÍ€b£xaøŠçЀµ†aŠÀÈ¢£ÈE/Bqac3ÈE7=1Í ¢›1ehcu`IÂ6öÑT{+Ë;Î`ˆ*¨£3BVwNÎòª6P¢¦¯+ù«äzZÁb/²…Jc’Xåþ¤©ŠýÉc;Õb ƒ–#é¥e’ËÔn5»QGb$À!Çìnj—©*l¨ãµoUH0O© ·TÚíζéÛ<¼àùè‰<`/,A[Ø‚ †7ØÁßÉG>1Œ{DØÂN…ƒ1 R\øÂòh†9ìá ³ ÄÞp‡Iaÿt#®ðŠóÁ‹þ*”°¡Ú5HzÏÊ…u!?þñ„¼†$9 L@²2”<ñ.ÄÏÔƒŽS+RUàˆ­Bäš‹UÝVÅ“(Qã%0Æ”¨A%jЛ5ÁÆMpBœ¬{B$«Rþ¨2€JX`˜D$ ð€F4B X 0€€ MFŽ Ï©uWIuã5¬õöÍ­«ðZ< ¢&”HCªU­j_ ©ÆÒÁ Z׺Ö©5;ê0^÷º×¢X ¯¯åkbg ¼>ˆíkc÷Ú[Ëîu³yM®]C{ À.°‹1‹ëf¤²uf/LÎ~„oHÈFŽþPá´<"ÁDÆï—Í{-ûJÍ8$µÕÕæ ÐG–2Û5€š-3­©¬z{šrÓ.­g9ì…uE½Z÷8‰ñ55ã|¬ÅÇÆmqPà4ßÕ.wa³ ´\kpyÌ]^_(YްyÎsþƒh@ïx‡Ï…>t ÀBgщîBxÀçIWúÐ 1t¨GÝ焨‚ÐnuŸ'_PY1ƒ Œp«@Ð[·ÁÍTn·‰6u€¼­7O@>‚†%øÃŸò²n‹·_†ï ‡G<âën~K¸Bä%?y d@ò¨@Ç4¿ùÍ!—Ð<:ÁyÒ_þ"»Ð< FOúÍ›õš÷ÁêY¿×oþ˜Ÿ½æ=úX‚~@ÍÀMÚ¡ @7p€n ßùη!P1…)Ôa ~öµß XÜâ ø7$á}ò“?úS¸…€ñ`”¿üS úÕÏ~÷“_¿ˆú×ßþúßBèðLð>ð¿þ»…xð8‰" Fƒ‚0j`ÐP•¾ø‹Àø ØhŒÇY HЄ„i€Á(ŒŠØÀ$ ðň‹„ É  ˨‹» 2˜€Wð‰PÁ¸Œ€AÔ ¾øA‰ 2+*Ë“$L ‹*€º"ˆjøøþYÈ"û„H(¦š µ›5ב+p‡24Ã3Ä|X†2D…ÜÛ¼eX†Í³„O€:´Ã;¼Ã  C<äÃ:Ì ø³>äC DAÄÃIÐCìÓIá#ˆ;C+ @@v(‚(TÐÄMÜÄ_@€i˜†Xx¹XÅR,Åèë„Nø`„ HÅW|EX7HÅ `„'øXŒÅY¬Å[ÌE]LÅ_àÅN°E\ÆT„TTEVtÅcD€g €_ ³²{ˆ($ ¨@â‹©”©ˆ÷© o¨ˆY‘a°p† )”ésd ©ˆC‘‹w´ ÑþIGB‰Mé‘$Y*(X 0gÐE pp­hЦ%È…rðˆÀKœüò ø‡‚I‘ Ƀ(µqÓ¥o7qc8w8¼^€:x¾t; zð‚3@†Ÿ$Ê¢¼‚ Jd8^(Ê¢œ¤üI¥dʦ$ÊL€JzJª$JtèÉŸ Ê¡ÔJzðƒL¨X8róp gÐa²ˆw£J¡ŠÇ GŠPFAlj€3¸ûÆA¡9” ÙËF±Ç}£ÈB‘”Ü@YÇŠÈ”$é·'!ƒù*‹\€*P†Šœ+p°Q |i„QXƒþ‹X€¯…àÈåñÈŽPZ(ˆÙ¬MÚ<ˆ…CÉEB¹,ÉI‚NÞP¹Ó(Ÿéú‰Y „¢ ‡aˆªØ<؇}P‰`˜ÎëÄÎ)‡ëÌÀNì<…íœÎîüNìdñÜò,Ï錅èœÎê\ÏéôPp»Ö È( €ËX»€˜‚ƒI ˆ‘.Ð ˆ‹F@˜ŠP…I]˜†A ˜Š¹˜ŒÙ| ˜IhÐíÐAˆ˜‰áQƒ•ˆ”Q&&ù”;¸2²@ƒµRÍ, ~ØFƒ Zp­pˆ×< ÁË’ÝÔ%áë Û$%&ÝÙp¢Tþ¶kXµ*Ø\À…V-õÒ/Å HðN)ÓÔ¨‡3E eÓÔ°j³d üˆxMèB…ð¨•LéSÀ¹›MQÂ'QˆÍñ¢­$ÀŽjˆAð †Ò:Ô–1RdrÄ€D3ƒ³ÓÀ}€G3[0 ÕR-ÕE¨"R0ÕV%#REVuÕRí¢R%YÕW%ÕWÕ\EU_ U=`/F«" rˆ˜±WÕØ™ÿÉQY€Z(‹/èÏ…(Ôø;×üÂà CÂ9ÉKµ!•¬3–d‹uº€ueWv%ŠhXW/ „^h…zµW{‚a°×þ¸ª¨€aȇ¡ª¸€aH”O‚5Ø–@‡uŠ‚=X¯áWX”tø€b] ´|¹ü›»|ù)YFºL'Q…‘+U`ˆIí¤J]Ý$WêÍ«*Ît‘;Ÿå¤Š|%”˜X§ø×€‡= ˆEX¤ý ¥õ¦½ §­Š¡=Š¢µXŒÕX°¸YùÏšÕ%» .˜Up¯ Ø™>€wxÙoMžpÂóÚBRGœ ú "Ÿu  Ú~%ÚŠ=Z…Ø„}Ø…}ZÁeXªý «…„‹%Ö¬¯OÙÓ¸Õ¥A5Ž€Âhꃡ8Hû ¶- ·UþÊõ£LˆMÕÙ êÙú ¾…Ž ÆÕNÄ…ÂMZí ¨u ©Í<¿­ZÀ]PØ€iüÓ…¨&Aƒ¸P†P°€MÛ™Ôìo=8Òý¡½B^ÿ1WC×µøWßñßt_^ y`ßöu_‰Pö]†n„úµ_ûÝ0A¨ß:(…ûõßñƒú‚þõ_û`û%.à@8àú­‡ù]àúÍßý¥5@e UñXÚÐ7‰ø‚‚<M© {“ž ½·E‰™“ÝX+ó*­âñR…€Yš’YU¡Ùí ž­½¥œ] XŠ3P-%1E 25S7SÓÓp#>þ { €:ÈÚZ ;ß¹À1‘ ˜ G! º;¶3•3Ì—ÛÝ ‹˜Š(8ÝÂ^š[ž¹>(­ƒ`1_0¢a©ÐpöA6äCžßlȆñÀEväGæ…Rpdö¨€G~äTdE¦dK~dÈälØdNVdHäEv5QVd:ÉXÈ]•É¥ˆĆ B¬ŒK‘ˆ~h„W-I &ÔA‰P2È…8˜‹Ä‹!d‹ ÜÀµÀe]†Ã˜O‘“)Â1ÂÒ(Ë- ˜+) èLë Ž8ž:^!ÔuÕ]‹ã$¬©ÒÛæ|N§ZI†þø+¤}¸ŸÀÝ}Ž.}n Ǫç{¦Š‹]ecͶ`Ç{”‘ŠÚE v‰~è£hØ–@m—ø]”Pê‚F‡²¼OUéZ!Ñ|Á=P Ř¹ñ‰È€€<À†ˆ„ Ђ0Q ƒ I‚>¸ÞNÑIn‰Ðì&‰â>n…‘ƒaЀ¬nŽ1”Q™Q)c‚à‚OxÔ*.ˆuÈS¢×ÊÖ‡xãMÒiY™cËö;·ºåìw.jОç£hÒþ Ó†„×^Z×^íŸ(©>Šbhð‚¦OûœÓÈÍWö¹!•¹ž ?’º™ˆ@5nv†ŠñÜ‹XÙƒx‡‚†%X‚5ˆžlU¡ g@ƒ!'ò"7r4Ѓ7Pþò%gò&oM€€(—ò)Ÿò  *Çr) ,Ïr Ø/ÏòJè1Çò ã>v |°•8*R¢\¹ÒYc…"Â[Ós|ø†k¸T?ôAô|]„At(0t?GtEô4=t¤tAgÓ>ÿs‰¨t?×8•S®Z§huéƒøæ&—åQ€»oò(œ5ÉÎáOáéµà‚'Ø€]g„VÜõ_vB „LÈ ödWö „À‡KØ…ÏKÃi§vBø…4,‚ZØjçögèvÀ‡lßvnŸvуl×vr/wXOCh—vuLJx´þ‹L j’bO%â0qb¶@bÔà‚%v%_‹&vÓaÅêŒàX'ájQžË\‡Ô´Èj=ˆGe¸*5¨oYCZ/ž& nà;ð¾#à`½)P%s@†–—y™—D;@¾:€JØÉçóNðä[€h¾Føy ú¡ßyIôy z¢§€+ˆ=›§œ×y¨ÿKHøŠÀlÒl’øŽtš¢à€æPßs0Ë×ã×Bpû·{Ë·×N¸·û©¹·O»‡{¼û†åû·÷{·ÿÝÀw{¹wû«¾m+vøÿY¯÷¶Ñ‰oã‚8cÆv(ŽWwþ' Õs70 `ýÓ?}q Z$Æ'0ÆcD…_@Å5H€ÙÇ}ܽi˜ýXƒÈýÜ÷=ÞßþàÇýN â7~äÇý_ˆýÙ¯ýÛw~tÈ„Çe ¯3gݼuÝ›€]Ùu ÚåÝ–pZÜmZÝmíÂØ©ÞÅ^¬eeUñÆž‚† €‡‰&& ƒAˆD6…R€'g 2lèð!Ĉ%`"ÑZÃ6rì8 @FáY¼hòdD‘*;¢ò Ò–a¬^Ò¬9‹P„—á†E©ésÇ•—’†ðYsŠ8š‚†¹2úòTÒ—K›:…„.*¤©U­þJtëL X¬ôˆò,Ú´ ÉI)«U¼­Û†É{y3gU!ȼìZµÂ°|/‘n½0,ÍS¬F #~yµðašèü:,Òt~¹å¨ösçТG“.mú4êÔžûéúµëƒ°]›ølíF.†t RãJ’·‡/ì׆4»n d;¼ü9t^„€QbضêÚ·/ëFŠ”‹a;“/_§ù{Õ/ÏýwõìÛ“Ÿ”|úäëuÿ~¼~¤ÔAduVI"Ä)˜5ö”—\tÙ…ÓVzñ eFY6˜b>1–dYÕaM:–¡Ob–‰6„æÉ# ^”Œj5ŽCGþ7Ö¸#=†D³ #àTÁĵ¨Š2Ô&#”ÐÌ@¼WÖoe ¥Z6TB>Œ†‡>ÌŒ†Ï$£àÁh\°9Z=oŠV>ŒfupÖ™ "pùçC¶¨Q;ylq(¢ˆ^Å¡Òñ£¤‘FºQ¤Ý¥p)¦˜²2L—òRJ¦¡r Þ¥ €*¦£6ƒ)§¢š‚ª¬Zúj ›všBõ¨ÁHh}ê?M vÀŽ td¬É*Ëc“„òί©óP(ýJÜ#°aRoXv+ҖךÀ<ÈÕáºé¦+Ê0é [‡GŒ1/½ônDow©è»ï¾¶êû)¿"žþ¾¦ÌïÀÍìËB)ï›ð¾±äëp*þ¦ÂK&›…vâþz>¯ŒYæ™vжf›r†'iUÔyçÈÀbx¬ÐªԀ ˜x‚=<À0 Èò@9a˜0LFݳ'ª@0*‰0&d suÖ1‡1ËŠ=öJÐháL5d-s<YܬÐbÀí•+e\IsCdZKÖÉ]îÕWPÆaˆ Ve∟˜xe‹c¦ÙžùÍ%[¥ác+¬¤1Œ/¡›~º0>ÌPB ìÞÃ:ì±w‡ÿÑ~;îçÝή ¸ã~D)»¯ç;î ß;ñ´³0{íâ%Oþ{gî–ß…bæ04½ô0È£ÈFÈ^?Œ75 R‰™þ0bn4ÙñË?LCx¬áþ<Ä úT³ùI¸Ð¤@oÙ›JÂ@†‡4«Ê\W¸¼C”Óåó¸È@*’‹ÜE4™ ¦Èr™ÑØ´@â4èAq‰L¶2Áô¤*~JQª¢Á¬0¥*”J«ò RÅ)#ôJrÂé­Fs£QY¼ À€#àF"·.hQ$ì{À0¾¸‘Wpo~fôàrŒ³ÁÆCÔ€A¬°!‰Å:Ú0Fôo'ù–J®¾ÕÑ^r K (!ÂQþˆ‚BQMT´ÃÅpð‡NÜ/ÉA®0’&DGfÆ'?Ò6‚ráKb2“ªÌ'[¹áWtˆ­8Å’´4â,ƒhDX&Ñ(Kì)=¬•4âhØF?0ð lD…ðˆÅ|62lÜ@g C-:  r€SœäØH´vÆuî( €ˆ$Ð×á!Ÿ@.J©6ÀFUúcÞ È‘²ŽäB¤à&„§XqÇx(D!ž|<)½è óP¨\4¢MD‹!ŽŽB4£÷€h,€BÒ‡Nô¡C €À±±ŽéS-§ Wé”VÖÐ)¼ÜÊoé[êÒþ(™ªOŽ ‚¼`¢Jj6·œ±s4Þ°AU³Š³]¤kX•¢øƒúlHæ@Jœ %õˆ =¢À:š«8^Á0Œ{„.uéH`ØMjR™[ÜD–F/=¨ Qj®¦jéœ_¨J6’†¯LSe©”¢Ö„¨E4ŠHG{ZŸã§U v%šêi54ÉhKms;Û“Co€H“jQÓ\ÖHË[;W‚Ö´gr_hÈ„½Ðàã‹X„^†qÝírWØ®^„À]îBá»× ïx¹KóbwâMïuédÝöj¾‹Ð ¼U‘ Ȳþ r¹ÐuS¨«Àðâ„ ¡ž4$¸ÁÆÇ&D! \hW¾°0<`a_ˆç††%ÌáfxøÂqÚp‡K,aÇFxÂV±(þA6¸¨3N¼u«ã—& šþú¡O.È‘È ¨H–Ë‘¹®ð£)Ô¡ò1Œ`$ªÊ^ D^ð‚1 #Zþ2˜]ë” ’–&¦ÝÊQË,1ûsÀô/ZN &‘‰Fº%;lÊH³ÞÅ>64ö`ÁSß|³aò¸Ð†V‰;4ŠþÑQ!ÐÈÅlæ7=,a ÿ@Kr9¢ä0yÍ7ËÊκ҆ å˜s¹Z3«Í­"›}òËÎp Îgþ9Mrä¡ë]ïzS¤ÐµtºàŠa›Ø!öòЊe3›ÙKIŲ½ ŽfS[ÃŲ{1mj3ÛÚØ^¶H¹Ýík3»µÊw+žíÉX‚f’öU-ïCsUAÉ "q€y€‹Î’élz à)ê’º§F‰õQ^m”3 QâF…8M2£ßÝÚš·¸õ A…î‘v8ÊSžò#pA(ÇT.ó^p(ÿ@ÌežršÛå¿È¹ÎOÁó”gb'ú)XîòS Ðà¸Çæ-õCC‰ ª+lTè7-@ G2\3}ðÍ9W4¡Žá¨ñâYS#¨/þíÛk’æU¯ùÔ½”5‹jì–þvÜ$-t ž!øÁÞ0€à@0¾ñŽ/@oqP¾ò–/E)ø@ùX¾ó”Çüæ=ßyÐSÞ¢¿|)*ïƒÉŸ^˜×¼8~Ð gˆæÆ'±GAQ’ã©ó^«>†ÒF‘eT¢I^ 'âöõŠ=÷ t²h’©LYRÖwTº°‚aŒ!ûÞÿ~w¢ â??úÏsþ`p ýèA)Öß~÷Ÿ¿Uò¯ýëþñ—?ÿâÏ•lRß™„œ4p& . 7x4< F B1ô^UùŠIèÀ|¡Y šQ¢]K“þ¨Yƒ>À¸Ø)WóÕÔ§‰F˜ŒÌtu†a b•…bÁI–…˘ŒŸÅÌ~yD­  D„ .‹TIÄ 4 HèZÄ[N¡²ÔÛ¯‰!¬ÐF 2_ œó!œçÔAì”a3L똃­áF4Xw0Æa²Ÿ ÀáyÈ!’Àa”Ê¡Æ!Ãüa".O7"Ò¡JÔáC`NâiH„PlèhP"'òˆÇ¬-PµØBúÆ êSمƉÜ"MCU$Ñ„$‘M˜ˆ%Q’ÑâK`R,¾„ŠÌÚÞi$:Äßu¢1–…í-ÀÀR'Ébé"$Ø";bÒ;n’RUÎecY`à0:DJ#?â£3@C#Ȇh¢Z| ?¤GŒà¯¬M£Ð?(@y¡–„áæÄ 8&#-”Q4”mÅ,JÎ-zˆ<Æ£õ"$ü"( aGa>6B"äBðÛ¸MzÓK¾¤ qÝÍ (7êÍ)–RÂa¤+n$,¦£/®#H’$M¤VE¥IþblñJh´d$~\N£BL€±MZÍÀÃ;°:¨#¬%8€ÃŒ@d5T2aW¾þ¤Ç,š* 4¬J U ¥@y#EúM*v;ÔÁ:…±B‚ÁËê”!ìlìØU3d¦fjæ5NffØf†¦^ Af¢€„æfަfÆ jj¦jf¦c­BkffgúBfêÁŒé]YðV.D1Þ%%:8¡XN‰X ‰*çKR# DBE ǀĘJ×^F¤)fM…£ BWgØ™ ¦ æÙhìœôYgüY  `o.Ä>*çâã? ÛÀÁ8A9˜Ã:¨A´ÁÈÐàAüà B$|£B øƒ?Ô“m؃k˜7èèa&YQ’Eþ*f7d_;Æ÷¨£@Jxà€õIJ²!"X[0À(Ö(RÐèRäCÖ¨¶áh`ìhŠ”ê(¨¹Á¨Œ)Œz›ÑMµ'í-(%.áBÀÚ É;|†Ji'î$ $BÜF5àÏ<åH„åòeçDÖÔQæg©]©ù”ݹjùPÜIFžNNÛ½V“V”:ƒ$zLB.˜ÆÀލĢC£†F¡ê00Ó]Bľ ɶØ—JãÍ(‘m¸‘t@ ÎÁ¥í´4švc›¢âq€šÂ¡ÃÉ©ÃýDŠáéVÜ®îÒ­*ÑŸî¦0öæovDÕœÆp„þ÷ˆÄ².+… G«iË&#CP"$HL‹Z@ã¦N"s 4@‹p}ôOÍM2Áo1„ #üO‡†vêwºÅÙé”QðÔgõiªõêPí)ñÝñéR¡š/e‚Ì”¾§ù hAL&XÃÓøÌ1yÄ(pרSGtìÖ`Çr3LB<ìp 8ù@ 6ôC#¼‚ÍÑ”ƒ×€Mïù£C@ÃÐ$pkZ(è·Naƒþ àO|† @,6ŒB .A|‚Íu®*QÖk)…(¾æ–ÉÔÙ^™$ `B•%JwäC>ŒŠ(¸­ÜÎþ-/ðÜžÀ0ÂÜέ<Ø­Ûâ­Þî­Ü€ßæà îà¶íÛ^âº-/èŠL9i FéJ p„ûŒJ|G°O#(‚Ð<@ùxn©Ï0|ê^Ñ0Á'„M³v„æ€ ö8+üô•F4H€-ZléÐN¡—þÊpà+¤Å:¤à4Ä8ÔþÀÆü“Öf«¥çx§[€'u‰gh ŒhìàœôàJü Ì,lVNî ËF\®évOYLÑF|è Íèn‰‘H¬„Aõ¯ûnD5O$lDqàYT¥¦/'nŽ üF Ä@Ë@6ÀÀ À%þ<Âq™DòMs½ª R‚`0‡á`ù^ÎF˜Î2|B½Ì°z”À¼œÇ ×Ëöù¼OÓËÓ Ãüð¼ñ¼, q ßp&Ì‚Jro¶g±n„"5`CDBhAû“JH@Ø”Ó8y„“S8±GLX‘wñÈS,¬ñ084 C:Y µ^`¦…·:p†ëµP©‚D.L€7DÄ8¨B fY‰ËÀ}ćÖѽ–Å*ÅÈedÉ!ŽG:åTvT:Æ(sÒ'×#,<ƒ0l{:l`ÿòÞU ÎþŠÐ ²­Ç¨A.<ïÏö€'H@"üƒ¨þq®¼Jò\%¯×b²;ă4Oó4×tƒ4Û!ØÁt³7{s`€7ïÀdì€9Ÿ³9A \‚9[! 3<ãC ì‚9£Â;Ãó9Ë3=›³âás>Ïó9‹9ûs:¯³9O!ăh°d{ïm`î^ ðâ²ïÍhA0A ɬÁ5ÎÍ$Ü7Îiă;œ4J§4>àÃ2œ4*ØA›ó2,Ã9OÃ'HNç´Në4¨ÂNÿtNc@.XP5uQ5$5PëiL® r%EËmMuê4èÁ(ÐÂ0A$Á(4 nNH7ó%¦UïX+€¥µ¡õþ1 ²[Ë!C5q”5×Ò%ϵVÕrKº2_÷u0‰Ë-6é²]^W/ˆ–‹aëC÷æcóXDÿÊDO¶ŽYtbÛÆb‹°>a¶ŽAuúúÈ£–Eiç޼Oj“ T`¡U5hÚfCIg'ÐaÎ ZÇöü¬µVN±8k·²– @ë´rÄðŽÁõŸÈµngU]϶ZÔö mç—<÷:ùu>6€ì0|qs¬ÈŠÈzwG”ìÉÁÔkÐ ää Òlçò˜vsIac÷:!¶tƒ0›zv×:6ÏOdk¥üîû ú̯è–nû@¸˜ î'¨.ëžSÑþl„ö<ÀÒˆLײÞ÷ŽU6 \vŸ‘fÿ÷ôzh^ÓÕ‰Ÿ‘hKu²àï{‘ý:xýÃýÚ¯JèopÑÿÂïF̃”wÄÆ¾6I¿xn©ø]/3%·ø å6“ûo·¤oóH£ÓÈnÄ–wDyG¨ñFh7 K2-S#äB¬ã±Ü/wŒàX•C· :ùgP·\ÝöÍìõïH~C"w+Ë,÷^Ú ËÈ~ú²ø·žP€Û6 ¸£ûÈ·$;=ôs“øŸ˜ø¥Wa[E:€³ª€R¨‹MŒ§º²À6«“ ©ï9”‹´Ÿ{ •¿zi\y>f9®—ss‰s÷zþDw¬GŸ3—½^·°£Æ¢`¡/;{ NB{;½S±¯8½2¶AY:µF¦çc·§†§s ¨‡;i¤øµ;ı/Y­‹Ëiô¥ ÄûÄ;½×{¼#(ƒ¾;‚¾÷»¿+Ãø€ < ¼ÁüÀ‚áiÀ;¼Â#¼ÂÀ7üÃ|ˆƒÁS|Å|ü|Áo|ÂÂ#öæhÇÏ8À/¥nD¤ªD¢:êjOªkw¥«›»j¤;¶» ”Ÿ5 ÓÌØP@À9½Ñý/ÂLà ðÂÒG}ÔkóÜ‚ÃÃ-l=×o==<,l½|7HB×w=:„ý-Œþ}ÙŸ=×Ç!d‚Ø“½Ù»ý-À½Ò[=Ök½ÝKÃUH«°N.¯ ‰à§ñp#·r¿ä¯CI°Û¼h;Î3ĺsZ»_  {„Ä=* Â%Ìó%t¾è‹>::LÃ4ÔÀê·¾ë/tB'l#<Á/È>îã¾6˾Ç3Âä~îï~'ôþï¿ì#€ð¿ñ¿8À¾ìÓ¾í/'À LÃá«D³÷ݳ“FD‚O+‚ÄR¬5ìn$l‚Ó¬,GÐ7pA8û;Á0$yÈvÍé®$ÎFcöG£C~g@úä/@ 5Œ`AƒÃ|GžÞ:†¾¼øñäˇ{i¾¹rè½½°àíøõÞ±þ­É:ØtyÍä¤Xž‹íZ¿n Âe¿ž 4Þò%ø€àþ(ƒ¯LPO@ÍûjÀLPÁÈ lÐÁ°>Ó*4­H{p±~Ú(, ÒèЗapéPÄŸ — :QÅAñÀ0|&) ÆÂìÁ?ÂìÁŔѫÁ*IÄÂ!!¢ÆžU9ÃfŒ '„H2Ð " ¥‡0‘å9†QDKk€. Œé¨–4!g˜;ð0¨ 2Œ“,O!2¢däÌSÏ=#B;m0BŽ&Í¡@/²¡ y0Œ CÃ0(­ÔÒa„¨J,ít‘Û(Ý´SK?õ…R=ðYeÔJK=•…IW¥ÓJ àešñȲAD´E >ƒO‚° c£D þòÆ`÷ÔQcVÚióLb^±ÝlРݨÂl%ÊHC.(×\s]& s À§•wá…7œaHy× qr‹íuaÛáŠ|a«`˜|VóàÕ&’! >8áÕ†È߃÷M6tf¹u0®À-Ú²°yÀh K&½L QÇPnÙåÉ0ëXf¯¶]¨Û…¾5Õ~!9ØÜ íàl†á`µÝ†¤â~ÿuxà‚›øá…–úé…%NzéÕ0Ö˜¼™;Cïå±É>ˆ×²ÑNÛl°Ù–¨æƒn>(g™1Ôg€}h¡&ÚhH¦˜_¨“žºê|§f8jįŽxb€·†cKþpÕ*ȶ53Ríͧ¥Ña9ýc?1ÇümƒâfèP°µ;é¼÷NÚï£Ï7òÃs3|ñÜÇ=¶Ä³Üb®ëp¤rŽœ-],_Eo^Îä…Öùé÷´Vy¶O/(õ‚æîX\ÂÂhÁ•ñÉ'?…aD!Ÿ‡Käiß}÷·f…öy)%ûñLJaÀÀ™nòÀ` C÷û_ó7À¢Dàýx¿:ŒÀ~ Äþúw¿zè! ÇÛÇ®êð@* ËH˜ÂÅ,„2ËA¶Gî 5*Ì EI½(F„™ŽlD#pìˆ0õF,<¸‘‚El*t"dÎöD)Vf‰.þ„²7ð`àᢻX‘ºo‚0c3†Á 3®‘(‚ \?!À‘Žu¬C)²‘Ç4 £yôãÿ—Çýáâ… d6YÈ?6°‚‘"ýX‡LàQ|„dY±$ärU´ˆæ¦JŽx.P å)ÉB:Obë…Éâê4£ZHD–´œeEZ¾»µæ5 Zmn“´ÀAâ7®HZÃ$1Œ³iÉ\æÁ·g&Íq°)fÒº¶Iƒ@¯3_Œˆ7!ÎÎ0•åä&‘¤WNuÄz«äU+c8 -bë{ƒI lx™´_BÂ6¸9Ø0¯y0d*“™Ò$(4úL€Us5Xþ67ÖÓÔ2"…ˆE;³ÎršP(Ôè:YèÎ@Áó•mÛ>]£O¡õS˜sh¾ZPHL¡Í<èBƒGÌaó`VA"aDJ‘&~tŠQ$ªFƒŠ(’^g°¤[†t‰Ò^l6Àô'ÀºS™Ò`1­©Aš¯!hÇšZ=X1 ÑA )©E:ÒQŸHJ@™®¢Te[‡´T 9µc¹´çJX0$'°…5ìvÁ ÅbJ±u,2

1¤ÁuÐp½ÅW& ÐÁ{á ß| ¾-¸Äð›ßüîo ø½àû, ö—€ì‚øÀ°‚ó`Å9øÁ Æ‚ã( `ŸÝ#ÀýZp‡:ÞéUÄR4o^™Ê­’²mŒö¼[¾`·š}ö­h´ÓÚà Ề]MÇëÝî~׸œÚÇ&K'ñ Ê7O®v¢ë’Gx×½Mm›_ûâÜÄ3Î×ìW»ÜÜÈ;VX!‘84OÌú*ò,(7˜Ýº·PæÜœÔ[;S¸S6O•åþ¦Þl—,÷ìÙÏdÌ·/×8Ì7^ŽËìã3G:Í?.œÛ ›È¡£xÚ,wÛºçæ—HâuóÊëgÓZu&e¯ôky ãùÝÀ%â›ë1ðñ½õKÁ¯ l £Àþ_°‘Í >þúØÈ¶²+ðkF:ûÙËNÁKAí_»Ø¿&=]‡˜Oã AAÌ}j%"JÝ$Tµ Rl³ƒ­ÅÇMî`pÈ\Ê(ºe™.td˜* â§eAr[•l˜X†.ói7AšL¤'?\mR~wgXÍ=Ac Ë…Þ@c›ÇŽœ»l:0eX•#£8p¹(èr™Ïü.Wp3fžþóšãàæ9Ÿ9#mNlŸË\’-ẏŽxA»ZÁ3¢äÆÔ¹ 0&< {<àF´TŽ0¨ FøúÕ=¡ L ‰"˜€&àäv¸ä s(“Ÿ^ =S\m}¾¸gâ ·yÏŒÐZ14$òéË•óŸ.5kWmÖÜxu¡”kN_š#kÔÙ°Æ%Ì  ¸ ‡ÃG.¥†7Ò€ô¥.àý_"˜=“zH¦æ;ÚRýwÍd\†'±‹¥ªR«¶´¬<…7 Õ©óóµy­ÈìÊHüÁrÓgò) d͇ q™ý~lÿþaèÔÇÿ½Ú„¿êÀ£nðOukRJñ–¯ñš/ú$/6¨/6¢i¦¤¯ú0ïñ²Ï îÈØŠW  ¾/!Âo1Ž-´†¡0à0€ ôàFA à:°!K2 °á¢¥ ÂàLÒ$ÑDM†áMD-â†dâîol,.ÿƒøäÉø¥ã o—`ö‰¥°¡ pò"Ï©)ac¬ûr£„A­jkW…  2ðûôaê~m”åÔòÎ<ö®ÇÆïP,”pž,P#ȈŽpaJ Ž±ÖSØ(!KñCš!1S…q"ñ'Q*ñ#þñða(±²8ÿ¡µ ÑG‘{Äx" P¨@Àa 3° csLæÔxÏB|Ï]&øò,ö ¥†%‡c‡ø-ˆºüͺ »âìÃ, e1ç@üN†?Æþ¸ñe~Q[öO{ú¯cê­ÐZà}Ô±ÐÇ}ì«|àQ`\`|xAâå‘Cà¥8î1^~#Þ…ûñ]þÑ^r ²¼@bò]ò^ŠÁ~ª(pH&@®QçàáØ@ÔHr² ¨¡ ”áÞê¥E-„]rZŽ0ifa¨ÁÅ 9âð` ѺLÑrÌ”àþNá(‘)ƒ€ €)wÀ’2*€ äá(Ÿ2*“r*«ò¦à*±ò(µò(§àŒò+O¡˜)3Áâ0æp3ðÀû2ç2#ßá gXÞÒ4ê0/¥mò"‚±¸üО–à31Ó4Às Á$s2)³(S0335SJ¡2Ó6s3;“04C33G3À4O“3K4Åá 5QÓ31Ó® 0:ÏAþëÈ ÌaÔ  Ú ìØDúá!(Ò/÷$d¥“O|10+b0Ùæ0Ì€À3<Ås<¹  á<Ñ3=Õ¶±Ý%þÔÐ.µñ:ùÄéX´SqÒ•Æ‘åïAÎN`®‘ £A`òAdrA¤&ós"¸“uBd/Ëã­ñûÔÁ 1TA4´3ú2D0'Ômö3žü3P ÏD)c7…ÁCGF„:Ä:qT@²3E!¢Bu¦Gdf á"€æ“HÕÃ>™”@€T0WT'³@ŸÔ04[ª”!A[òJ#£AäAÁ´Oþ$J·sJûS…'Ë´ Û@ôM!cD9£Déô0PM…Tf^4O9BFÝ P!CG„G u0~4Jû´cÕ0Æ­=uûØmR'M-þ¢QÁÅJ-• ²´"´€¸s´S BL„LMõ $”OÕt¯®ìBWu›Ìð"¼aæ¼s¨nV‡ÁN7O}µ ö”Q_•¸ØæEÑ`r2¾@0Òm#¢u¦õ™5LˆJP¢h@¾ 0gXÂP QÅuQTS³E+Â#&€ü¢áî `àî¢]7báRÈ"Úüa ­sÆÏWT\ SÓ´,X”Mí@Áî¸@ B`0L¬ë@ð üƒ äN¢c‡d‚&¡bOKÚÌ.öÐú¡^A¾.ìèÎîD'Ké` –à©€T¿tXQµ@þTuX[ÕX–J9NV B.Ü£öÊÏô6b/âöëön/þjï¸>† >¡LäÕ \oÀjçU÷B‡›ºo.7°mzuVU3„U\‹5]5½s#˜–-Ü#Ìö j¹káp7b0ÀXîqé¢^/ý ‚þD‡c¨âs.iÑÕ – ÈÕ<ÌuXÑ5EÕ[8ÂKÀ°áI¢¤.>p#ÈÄLzð xpuÐ bÚ„ XL`K`3@-~÷Sð=Vtœ!j´.¢˜ Ö r¡r€TaBÁH 0@Ê`HvV 6t‡þa)"uy…S%£XD'›'Hú¤7!r5¿ïL¤TW5hÍch}µhõöh×4VÇë›'y Cíá$4ÁL Fáh@j{ã`HævUë–1îvXóu÷ÖÊ’µ0‡•»¨#3òCÃU}‡atË£t}õt'Ô}+U}'bKßá•T`%uXÓ7tÙ—BW8ÐÚ~-õS±Áö÷ûÀ¡tØT¸<xV X…VÙÆM;ϸá¼5!F tFØTKx1NØWS¸‡›¸ÕZXAªU+òÝÎ-÷ú8N0€ÈF[‚ há_³ tlø†ã„np‘ë#3–8HëþXã@WAæÕ,4^éÕ^C_‡á ,wlÂbr¡ Jç|W5‰ v’#‡Š)CdëΓ9öíš· @Vd ‚dMÖÖn<¶®ë¸ È ðäaË0ÆæS+" °øg}u‹M£‹Wõ‹é8Œ‘ÕB$ksïýêÂp¯Vkÿ"k¹ö¼l}Pö†õ @Ä@ öq¥öeÞxfÚ¸ŒkÕNâxVç8?aPþÔ2wþTï Wœwø£ ‚qàýæÃü†a$ö*× 6öe¹Š‡MC‡g•‡º’‹ï’$w}qww[ºUz!|— f°CI°r! Ö@¢þ•W ؤl"Õ†YY\]™’µ™oY,:ã„~Cgýš¹Nšg•šKÚM›K:©Y˜›õ„]òže&Ÿ-U¬Á¢ŸWõŸµ3 íd -µ£—裹£’Iz­Mz QÚ¨ÍK•Mµ¨‘ø¨­‰D–Õ™W)‹;Õª;«;U«ñš«xŒ•ÖWÍ\ÈzR/Û+ÐÚTÕ:0 {HÜAÆA>J° –µYâY©õ‡!³U¢ºË†Aº4DzUï´óºEeZøc!´é]—îF©úúˆ ö‡!ù`;´-İ £"A$@$–b­$ 6ÁìT¶êP– zÀ ÄÛ †aþ£E¶žCÙfE ±=I±-•±9ñ-²u[²íØ«Ž=Ô‚-¼V>ÆÖ/î"/†¡ž½Y½©•6[2ûQÜ":»S?Û&ûAF»0Ò¢=ü;? · 샺Wþ6Ú Q ®[H®W¦®9·)|·–H$I–¤I`WJ¨ÄJ°DK¸$xÃdLÊ$¦ƒº Xú”†ˆ•{¹ B°ÛÅŸ˜©_FX B~ª_oYPɽ«¾'U¾7ƒ¾'Õ¾[¿-™²Ë&dF¦dû‰Qÿ"¾4^=þ¦uO-ákX}k»3nÛT¿ÝÞÃýŇD2@y2œïʽ•Ï’Óýè›|!.6ë†Ùë”y송ìÎëÔŽí6b—q¹fmYÄ>^yB>OG>,J>OOÞæS>[x²lÝYõè‚õâÃô0šÚ/ÈÝD-æäåé”ðgPk^øn¾3^”.(zFYýW¢3YkZþ0×Î|~¯‡5è9cè;µèQžêcý Š7Gð´z[ð?°¦mð¥u÷v™·þ(ÞÜ ýâ§^ãxHÔ ªÁ+vOœÚÎÒ>šÕ·íÁâíé4îîKÃtz6QVeÀïZžÎú=Ó»?Ϻ]þ}ÿïÿ!ð ¾Oô¼"çß´óOß`A3DßRI_îM¿<Þ6ãÖ"&~Öb˜À <ˆ0¡Â… :|±¡³‰+Z¼ˆ1£³ˆ;zü2$G$Kš<‰2eI´`™•Ty‰ó¥>“ýÚˆü 4¨Ðˆ•Ñ<Š”$5{C›:} ÔÓ£¤*“A½Š5+G ¨zý ¶"L…/["”I•Ê‚9Ûî,i£’Ö¹t¡Ú6ïI[jêúýûó®^þš>Œ8d’ƒ;Æ86aÙ˜3B{®­æ&ÌK :´Á3h›Þ(:uj.bNSœcXµlÕд¸¾62ÂþÉg+«œ N³ð9êÔ1b܈,YªTQ5;:`ÜÉI‘Ž}.õìܧSÿŽT÷AÞÑÒÔ£L¸æ9êq*ëÙ=¾Ð¢àÃ.•ÿ§TÜVóûÊU}ž$žAädÞQƒPÓÞKp¨ÑÆóØszô3HwÄõ_‡ 6 U|yHbC ºVX‰*B´Xˆ.Bf–d” R°¥Þ;}¶b‘ö"R>9k¸ÁFd’Õd“ÎÌHÐÕˆŠd¦&)飓4YÇåŠÛ…É¥—AB9”Q™40Ò–:<ùDf‡ô™yÒ}uv¸ßmtТÈ0:¨ €Jè¡….ªhþ£‰>Šh¤ŒB:©¤ŽZJ饕nªi§™:BWxˆ¦@jÒèXÐXÜKŒ˜Äážþ8ªF#Ê:+^·½É?Îðê+°¿ö:l°Ä ‹ì±ÊËl±Î&Û,´Ï.;m´ÔJ‹íµÚZkì:µ Xê0§ ÄæWÖ„ð¯–ä®ùù­Fîþgd¼öÞ‹o¾…;î0å‚¥…'Êl9o~úZ„- 3 ;ÜðÂ?,1ÄWŒ1ÅOÌñÅ{ÜqÆ!,2È&—Œ2ůÌrËõñ‹æ¿aUcÒ?´ 0L7ç¼³Î8ûÌóÏ=-tÑA tÒD#½´ÒF;ÍôÓMO-uÕ9¯aþË `bˆ3mpí5Ø_w=vØd‹öÙj›ÍvÙn§Ý6Üo¯=wÜtË÷Ýz³írß~ÿýÌ1"˜ê€ý`¢‡3ö ®8ã‹'þxã;Nùä–KŽyäšWž9ç›_þyç {Núè¦7>યÎz뮿þäàãÅ\8ì¶ßŽ{îºïÎûÁ‚SÖ{ðÂO|ñÆ?Ñï½!Ï|óÎ?}ôÔ)_^íÒ_}öÚo?<õ„s~øâOþ½ÞOi}ùê¯Ï~ûî£tþšé¿Oýöß/}ü¨âÏÿþÿ¿;ý‘k~, ˆ@' Ð_L Áze2“ /ˆÁ R°ì ?xþ¿ ‚p„$,¡ûDhªp…ù“hÇÂÊp†½C! oˆÃö͆:ì¡è%qˆD,¢i„hDìÕβHžTÁÁ‹DÑeLtb™‡Ä+ºæ²‡,d!ÇØ@%Ÿðâe‘*EdD£kúÑÈb´ HŽ¢Æ¯h‹6¸ÙIÜø•2ža£—ÅCžÆ¹£J9H’„‘‘¤cäÀÈu ,’.‚ä'RWKRE’’¤¤"…—ÈS:Æ”ŸPÆ r°†~LäLE.ú ŠŒb&帡 3Ê"¡œcÚ0‘P4q æ‰Y :ÒŒ™È(šhþ[|±$²àBEÞ@ |‚k CE6qY!qÉ\¦EZùÊXž’\¨ãDЩNvS˜Ät>×9Ocz­@Ô™Kg¬ ö˜ˆ=˜°UîÐ…éW%šS:ƒ jp†5rA‘,t€"› &$))Ê’0ድÓèD\šÒP”f"ž%E˜`kœÄž©BC­ŒP¤•bG?P;^d¨•, SM²RBZD£ŠÐ•3Dð g Á …·0ʲT‚5,e$##ÚTN¾4­)q$ .âRgÀ#Y$-6Q‘Z¤D¯$$«á ZÜÀ›¤ˆKÍšÔ‰ð°‚%,[+ÂØÁþ–$n…ëE,TgÔq°škX)%zö1e5,EÐN¥®UµmÕH\çz‘_b$®³ C_Y« _©Õ´–]m1'‚ 7æ–µÎHépwKY×^Ö"™¥€P .Ðv´£+u“RZßVa¤13»Ù®Tîl12Þ‹„¢æ=I9ráMg# ¶-.ksA^Åî°¼ý-0Íé ü:4U鵈€õ›ØÞV¤V AVa‚O BŸÅuóeÝ §„‹^¼A÷9 gÄŸx)€pƒZ@ "BT¡ pc"¸¥*BAŽ’òõˆ*ºøÅQPäÇf2EjlƒçþØT Š?aPÒȲh¨IÚpÐØ`³ÇŠ#Aâ‰è!Ó¤5l`["yÈàñˆKL’=ʵ•3Æ\æ3×ÉJ3™`f4“dÇ=&•<‘Hh³ uFÀ1‘, BÃæmšDKiðL7ÓœF¥¥M…éNßfÓ¢.5î2lj¯“Hµ«øiq…úÕ´®uøPmë\ëºx¸Þµ¯}êX[tŠÀ.¶±U×ëc+{ÙúJ6³Ÿ m39;ÚÔ®öË„=kkk{Û!š6·¿ nªx;Üä.÷J°m鋚{Ýì&É¸Û ïp¿;ÞôÖ6ý‡|ë{ßüî·¿ÿ ð€ |èà/¸ÁŽð„+|á o¸ÃñˆK|⯸Å/ŽñŒk|ã_ ’ò‹|ä$/¹ÉOŽò”«|å,o¹Ë_ó˜Ë|æ4¯¹ÍoŽóœë|ç<ï¹Ïô  }èI YÂU°¤+}éLoºÓÝÕ¯§K}êT¯ºÕ¯>—¨c}ë\ïº×¿.u­ƒ}ìd/»ÙÏα£}ílo»ÛßþµÃ}ît¯»ÝÇ.÷»ë}ï|ïûžòî÷À ~ð„Çà øÄ+~ñMiãùÈK~ò”¯¼å/ùÌk~óœï¼ç?úЋ~ô¤/½éOúÔ—> ;mod_perl-2.0.9/docs/user/handlers/in_filter_stream.png0000644€ÿÿÿÿ00010010000011055611727205031023247 0ustar ????????None‰PNG  IHDRÙnÛ“™sBITÛáOà pHYsÐй‹çŸ IDATxœìw\S×ûÇ?7l«bµ¸Q¸P‹«ÖYÅ nQ[Ôoµ Õ"h¥ZpàÄQX bÅ?ѺÁU­£UQEöJBòûã¦1„ä’„Kœ÷¾îxž{Î!×›'ç~Îó@ šƒ`ooß¿M÷„@ B½ã×_¥xxxìÛ·OÓ!Pï (Š£é>@¨×X„@ ‚&!±@ MBb@ š„Ä"@ 4 ‰E@ h‹@Ð$$! Iô«µèÒ¥Kvv¶ºB ¡.1kÖ¬7VkV},òîÝ;@н{w6zE ¡^pþüùüü|E,«EtïÞ=22²f]"P°²²RÐ’èE@ h‹@Ð$$! IH,B A“X„@ ‚&!±@ MBb@ š„Ä"@ 4 ‰E@ h‹@Ð$$! IH,B A“X„@ ‚&!±ˆB¸ººÖÒŃƒƒ}||f̘¡‚ï“'O<<<¼¼¼ªº»¹¹±ÛAKX³fMíÝÊ"ó6#j¹¯ê$Qˆ+V4oÞ¼–.þÝwßùûûöÙg*ø8p`÷îÝAAA¿ÿþ»Ô©™3g*ÛÖªU«TèAÍøùù1Ü bm|¾2o3¡†ûª¾AbG___æñÑ£G+{©’’’w‡ a>ÄÚø|U¸Í„j!÷U}Cö×Xáùóçß|ó££#EQ™™™ffföööóæÍ£ Nœ8oddTZZêììEQ`Ó¦Mô)yJ†'Ãsƒr_ÕOêx,Ò¶mÛ-Z¬_¿ÞÔÔtêÔ©lРÁÒ¥Ké³111999AAAôîþýû£££ÇŽ àÂ… ïß¿ÿ?Îð!Ê;Å|K3Àp›ùúúN™2eþüù-[¶är¹žžžä;Cû9{ölff¦ø),,üá‡èm†G%Àá¹Á¹¯ê'u<`cccjj  iÓ¦ 4ÀáˆÞL]¾|Yü¿ À·ß~»téRú?Øùóç·lÙ">5oÞ¼¸¸8zÛÎÎÎÝÝ]ò”——ýà>{ö,ý#€†ÏçIþßkÞ¼ùºuëØd-SWÇ¥»´iÓ¦cÇŽ õôôjx5†[º&×lÙ²%ÝÆ Ö°‡5páÂ…mÛ¶‰wÍÍÍ÷íÛGo3<*id>ª}n¨¹¯ê*u?a¡P(uD Ð7f~=¡£Óuu\†[šP¨ú¡S¥ ¯Ì'@µÏ AL½Ö®<øÀâÝC‡ <˜Þ6lXHHˆä©ôôtz;33344T|jÿþý_}õ½Ý£GðððÚîvíQTT$óKH×ÇU¯÷!2œb¸¥ õ‡^½zýöÛoâݼ¼¼#GŽÐÛ JÈsƒ 8ñ\\Uš6mÚµk×ÈÈH5öŠ5’““gÏž=|øðŸ~úÉÍÍmÚ´iãÆsuu¥7DEE%$$———÷ë×OR»zòäÉ›7o888\¾|¹[·n¾¾¾>>>;vü믿ÌÌÌÊËË¿øâ‹ &Ð.B¡pß¾}‰‰‰¦¦¦&&&78p`‡øùùq¹Ü„„„/¾øÀŒ3:uêD{ýüóÏåååâS 6TDê±fÍš²²²¸¸¸˜3gN»víª½ s[/^þüM›6YZZøùù‘mÚž5kÖéÓ§5}Õ”²²²×¯_¿{÷Žlëô¶:quuuqqùã?,--cbbÆŽK¶ëÀvß¾}cccÕ|/ÕY<<<„òiÒ¤ÉðáÃsµ†èèè›7o2t˜ Íÿüó3f…B²­£Ûj¾g,--ËÊÊjõ?Aýääädffªù^Ò!ª 0h ‹µñ,--5ÝBÈËËÓtjJvv¶­­-yÓ¤Ó¨ù>$®ºJx Õu¹Í… îÝ»§é^T$88øÜ¹sšîEM™3gÎÇ5Ý ‚êøûûŸŸÞnذ¡§§çÂ… ÃÂÂfϞݺuk//¯þýûWõ"z†èEÚÑ‹XèEØBóó"’GŒ¿ýöÛ{÷îMž<ù‡~:tèŸþI'BCô": Ñ‹´¢!°Ñ‹°…vÅ"âãÓ¦M»uëÖâÅ‹£¢¢***è³D/¢Ó½A z+½[h2‘|GS‡ãâârõêÕ_~ù%$$¤W¯^‡.//'z†èEÚÑ‹XèEØ‚e½HQQ‘ŸÏçñx<y£¨¨H‘7m_~ùe÷îÝÇçããciiIô": Ñ‹´¢!°Ñ‹°˱ˆ“““¾¾¾ó†··wµŸbnnî¶mÛ~ÿý÷iÓ¦8qÂÚÚš”uÐiìííë@ù†¤¤$RF§±µµUó}H× #Ô1¬­­ëÀM`9122š1c†‚Ʀ¦¦ ïhŠ‹‹÷ìÙ³wï^—øøø¦M›ÒÇ/\¸Ð¨Q£=z°Ð]‚Ú ¶¶¶9r¤¦;R#æÌ™³iÓ¦~ýúiº#ñ÷÷oÒ¤ÉøñãÕÖbYY™±±±Úš#¨ww÷qãÆ 4HÓÑy´Q»Z^^¾wïÞîÝ»'%%]¼x1((Hˆ€äÑqˆ^„  ½ˆ^„-4™_¤j,Âçó###;wî|òäÉŽ;Võ"z†èEÚÑ‹XèEØB[r …Âèèèõë×7kÖ,$$¤gÏžò¼\\\ÔÕAû½A z+½[hÅ;š‹/4hçΛ7oŽŽŽfD@ò‹è8$¿A ùE¬@ò‹°…†ßÑ}:tè åþæÍ›½{÷–––Ž=ºmÛ¶/_¾433+))qww‹‹KMMõöö®ÚPvvöÉ“'Ûµk×­[7‡>;vL__?//žÒêÝ–XÒ+Õ®Ô®½½}HHˆ››[ ÿ8µŠjz‘ŠŠŠÐÐÐ?ÿü³wïÞsçÎ]´h‘……EmtOAˆ^D×!z+½[èÞ¼ˆ‹‹KŸ>}jx‘ëׯ{yyyzz:88ØÚÚøã?èS= …Ó¦M8p »»{Õ@‡ÃY°`§§'=C3mÚ´ŠŠŠ¹sçúøø4mÚÔÍÍM<É!Õ­­m³fÍø|~LL €sçÎÍŸ?Þ¼y?üðýd”êÉßRRíJíÐ~Y¨½½=ýWŠŠŠŠæÍ›oÞ¼ùÚµk™™™={öܼysQQQmôP’’’Š‹‹5Õ:¡æØÚÚ6jÔH-æææ’E4ukkkò±²‚îÍ‹°R¦ª®ÂÊÊÊÝÝ]òˆ"ZñuÚµkgnn^mC§OŸöððàp8áááèhƒ¹ 4¨ö²â]}}mÿ@U«G#èã³Ï>Û¹sgJJÊÆ»wï¾xñâo¾ùFý¿8I=]‡Ô£!°©GÃÚþÕUVò‹ôïßÛ¶m’‰_ûõë·sçN33³¢¢¢E‹QÕ¨Q£ÐÐÐäääÉ“'wíÚUì›’’òøñãmÛ¶ …¯¿þ@XXØ7ÊÊÊFŒѤIñnûöí¥²µµ -++»}ûö AƒF޹{÷n##£ôôôÔÔÔ”””ªÝ°µµåñxRíVíÆµk׆ V“?‹P-¿HEE…äªïV­ZíÝ»7))ÉßßßÑÑqéÒ¥sæÌQ篢ÑuH~+½[P<<<öíÛ'Ï¢iÓ¦]»vŒŒTc¯˜ˆ‹‹kܸqÍ_ÓÐDFFN™2…•KÕRC™™™%%%­ZµªÖòÈ‘#S§NU¡ u’˜˜(”}MÓ½{÷ãÇÛÙÙU=õï¿ÿúûû?|øð‡~˜>}º¡¡!K=eÂÒÒR ­jôôô²²2u¾¦±³³ËÌÌ$±HãÇ<|¬ò°²²b0h(Šª§zñññû÷ïWA» æ†š4i¢H @û¨ª¿£©ŠƒƒCxxxXXXLLLïÞ½ÃÃÃÅs]µÑ‹è:D/B`¢a Ý{GÊ^€³³³³³³"–ááá’Jé1cÆ(õS¼¡:OQQÑÈ‘#MLLìììôôô(ŠÒÓÓÓÓÓãp8278½QRRœ™×ÑÑ1**êöíÛ6lغu«··÷ĉUÈ^£ D/¢ë½ˆ^„-t/Q=šéÓ§«­­ºžžž¾¾¾™™YëÖ­+**„BaEEEEE…@  7x<^YY™øˆ@  7x<ž"Uœœœ¼¼¼.\¸zõj;;;æ"‹5èEt¢!°Ñ‹°…îÅ"¤îbbb²{÷nô"gΜažä …—.]Ú´iS~~þÏ?ÿÜÇǧ}ûöµÐ#U z]‡èE¬ ²^dìØ±cÇŽåóù‡vtt\¶lE|KJJThQËѽX„èEtÕô"¡¡¡µÐ(//ÏËËûôÓO•ò"z]‡èE¬PC½ˆžžž››ÛáÇçÌ™#yœÇãmß¾=;;@YYÙ¨Q£FŒAŸZ³fÍíÛ·ÅQ‹³³3]ÕÃ㨨hÕªU;vðäÉ“µk×6lØð×_¥-Oœ8oddTZZêìì|°¶¶ܵk×Ô©SÅ9!wïÞ}çÎÞ½{ðóóËÏÏ—Š¬^½úäÉ“t  cÇŽ}ûö0a½“““Dïîß¿?::zìØ±øo2ÆÍÍíÈ‘#UË‹##C¬ö¸|ù²8ðí·ß.]º”ŽEÄîëÖ­«zÙ÷ïßO™2å÷ß— •jÝ‹ETЋ¤¤¤ îÓgî‡îtä±gFŽDv6\]‘šZÕ^Ì 0 U^ŒqéLLpþ<–/—¾\~–¹\p¹˜?½{ãÅ DEAVAW>°h, Š‹aaeË `Ï™öÀZ !ð#`PVV­=€tà ð}Y™ ˆË[à`,ær;s¹ªˆðrc´Ê¨¦©Uôôô¾ùæ›™3g>|xÊ”)=zôðöövpp`p!z]‡èE¬ÀJ~ºj´äšŒÆWùP„’’’ââb}}ý¢¢"¥?VÞ¸qãÚµkåÙ°‚îÅ"*èE<[·ÎB€X½ë×#+ rÞóq÷@ À›Þ76ÆäÉ ñêäüôw:É@2KK<}Ф$œ?/¯‰7蜡÷Û¶EDž?Gb¢Lûb ©°=€tRÆå ðð\™ä¦€÷'Ÿ,}ÿ^Þe%QM/R{…BŠ¢yxxÌš5+44tòäɽzõòööîÔ©“L/¢Ñuˆ^„À låY¼xñüùóŵ=z„‡‡Ë+ËZTT$³,F‹-¶nÝêêêjdd´cÇŽ&MšˆO <øÀß|ó ½{èСÁƒ+Ò±† ÚÙÙ-^¼ø—_~ñóó«½:_º‹¨ 1önôN¿~¸v ±±?«v<DAàÏ?cÉ,]ŠíÛå¹Ì–³èƒ[·pæŒ<û`pT¼ÿË/1#GÊ ^C”±ЛÃá J¹ àpL‚%Àl…rXomMEEÁÕUž$Ú¦Ç"4ÆÆÆ ,pww ™8q¢““ÓŠ+ìíí¥¼ˆ^D×!z+ÔD/²aÆ„„„ÀÀ@ooo##£ &Ó§<==÷íÛ·dÉSSS“Æ8°C‡ôÙÉ“'/^¼ØÒÒÒÐÐÐÂÂbÚ´iôïóÞ½{/[¶låÊ•|||~þùgq[cÆŒ‰ŠŠòôô466.//ïׯŸøŸŸ—ËMHH …#3fÌÿ HKK`kkkcc3qâÄ>}ú(¸ØGYt/QE/b`€Þ½Ñ¢Ðß+cêT¹ö¥¥ˆŽÆœ9 Ozº¾Oy¯6 , “&¡W/ £ÑÏ?ǶmríŸ=CXÄïçè^ÍŸÿÄÒÒää`ëV%ììßW¯”s9|Ož(7¬,ܼ cc4h ×F-Ô‹HÆ"4ÆÆÆ .tww?tèиqãúõëçíí-~€èEt¢!°BMô"¾¾¾¾¾¾â]ñ/mŠ¢,X ÏqèС23‘ôêÕ+66–Þ¾xñ¢ÔÙI“&‰×ÎH²fÍy ­X±B¼ýý÷ßÿý÷ò,kŽîÅ"ªä11ÁâÅpsûxÄÞríÏžÅÿýöìäë±)S0eŠ\—ÈH †Y³>iÒK–ȵˆ@T”´Á¸qrí_¾ÄÞ½JØØ¿&&ʹ>  ŠÙ³?dÈ•+8ÇËTÞTE õ"ò011ùî»ïæÌ™sðàÁ±cÇ:;;{{{·k×D/¢û½H=¶Ð½XD•ü"<n܃LaÀØÚ".ôBÖ âÐ!È{7Æá`î\8tHt¤¼ááøûo¹MÌ™ƒ®]:_çÓ§(*ÂÒ¥rí›6…·7Þ¾E` (g #eeʹ¤¥¡¼¸_Ѥ¥áɦW¦¶õ"ùùùIIIEѳâ ñ¶Ô©¼¼\¸P®½æÎEE¾ýöãÁ pá‚\ggt튳gõñ | à휜J6ÊÚ«æ¢Â@¦¶õ"/^¼X¹r¥P(¤# ñ†x[êÇSäQbjjºdÉ’áÇ0 666&&¦cÇŽdjDw!z+Ôíz4êD÷bÕò‹´„ÚÖ‹tïÞýC U…ììlEŠý&$$lܸ1--–©7ŽèEt¢!°+ùEÐÅÚx§OŸ¾uë–¦{A€¢ðàөUGbb¢R]5Îõë×ÇŒ³dÉ’)S¦Ü¹sgúôéD/¢ë¤§§çä䨳EKKËòòru¶HPD/º7/¢½õhôôÀ[†>¥§Z1GQàrÁ ž£¥*%² Áç+aÀØ……ʹ4h€ü|åÂá ];LžŒ˜¹.hm~‘ªÄÅÅfee-[¶lÒ¤I’ ë‰^D×!z+½[è^,¢Š^ÄÔ«V¡s›6ºðÏ_á»ïðàÜ/rúÛK_ÿc®Ž^½\iL"#EXºY~eÓ©èü§/_ÂÉI {Ý»ãÍå\úöÅ¿ÿb×®Jëhd"È•+øå"-­ZŸ_„&666 ''gÙ²e'NÔ«2åCò‹è:D/B`¢a Ý‹ETÑ‹èéÁÎպР€¬,PÚ·sÊ[Š‚DÎ TTˆ’“RôõE3ò¨¨€Pø1™©¾>( |¾¼¼®¢SŠÛ(.VÚ¥¨H•¼xww¦ä+hy~‘«W¯äåå-_¾|üøñU£’_D×!z+½[è^,¢J~‘âbøúbÓ&èÞ¿þŠ¿ÿ†‡‡\ûü|TT KÑü‡¯/fÎĆ  “ëRT„¹s1w.ô郛7ûz&ú IDATqû6úö­¦câXçÜ9Œ1cðçŸlÚ«æ2oæÍ”ˆÂhm~‘Ë—/._¾|ܸqÌ¥ˆ^D×!ùE¬@ô"l¡{±ˆ*z‘Š ¤¤ˆ¶ÍÌ °…ˆdóì™hãÃÈÎÆÓ§ÊµK¨‚êEŠŠŠ:uêdaañã?º¸¸(RPJ{ô"ÉÉÉQQQ’髲k×®E‹)uÍððp?ú}eeÒÒÒÊËËÛ´i#ÕnÕnìÚµkáÂ…ò&–4Ñ‹XèEØB÷ÖѸ¸¸ôéÓGÓ½ TF±ðìíímmmkµ/J! [´háïï_ítˆ˜¤¤¤bÅÞI±E”œl.mÚ´©vžI©@„¾fË–-ežŠ‰‰iݺuÕv«vcÈ!òú¬ ЕQÕÙbnn.™©{X[[“•to^„äQŠb’†°å aCüñ¦MSÄVÛô"Ÿ~úi||¼²^ìêE^¼xMQÔ£GÖ­[gkk›ðüùsÖÖÖ...ׯ_/**êÓ§dYš7oÞìÝ»·´´tôèÑmÛ¶ˆˆxùò¥™™YII‰»»{\\\jjª··wÕ†²³³Ož<Ù®]»nݺ988|øðáØ±cúúúyyy¤ºA·%–×Hµ+µkooâ&Qx!11ÑÙÙ933SÍ/GdBô"V z¶Ð½XD½ˆžÚ·ýf§kW°´d¨Ó+Ê?b„hýªt숯¿–ërñ"† UÑ£‹ð5k†™ó´4œ< q©¡V­ÀÕݺɶÏÏÇáÃJØ8u ¯_+çrö,ž>ÅСèÜYÑäçãÉXZÂÊJ®Ú¦Q­6»z‘ëׯ{yyزe =iôÇ8::xôèј1c¦M›Æáp¦È)‡Äápè2ZaaamÛ¶6mÚÚµkçÎknnÀÍÍ-ò¿EOR 4kÖŒÏçÇÄÄ888œ;wnþüù´åÚµk«vƒ¢(É RíJízסC‡Û·okC ¢!°Ñ‹°…îÅ"ªèELM±zu¥Úx]»âêU¹ögÏÂŧNUZGãáÁ$w57ÇäÉ•Öô¶h¹ö¸pAÚ`ιö/_"*J {gÎÀÔT9— `hˆÉ“+­éeÈ•+X±—/Tä0¢mzÕ`W/BOBHbeeåîî.yD‘—Gâë´k׎D˜:}ú´‡‡‡Ã Pµ.OÕn4õ2Nê²â]©8ï·ß~KKK[µjUµQD/B`¢a Ý‹ETÉ/ÂçãÉ\»&× sg4j„þŠñŸ âÜ9¹µñ( £FA(ÄÙ³¢#\.ΜAF†Ü&ÆGûö8yR$‰}ð%%kocƒyóðî€Ü\åìde)í’‘.11xûVѼx'Op÷®‚/w´-¿ˆj°›_¤ÿþÛ¶mÓ××çÿ·vº_¿~;wî433+**Z´hEQ5 MNNžFŽ92uêTñnjjê¦M›‚ƒƒUh´6P¿^ÄØØ˜èEêD/ÂŒ••s€ACQ”îÍ‹¨¢!h Ú¦Q Öó‹ÄÇÇ'&&VÕ¥²N jÒ¤‰‚–’í¸qãFÕ­ ˆ^„À D/º‹ho=šúÌ·ßâÀE ‰^D&ÎÎÎÎÎΊX†‡‡K¾Ÿ3fŒRkSoˆ]´mJ æz‘qãÆÍœ9sܸq æP!z‘: Ñ‹°…îÅ"ªèE´ÕVÏ*Eƒ()QÎÅÔTÁTî¡(´k‡yó«ˆ9Ñ‹ÔéÓ§«¿ÑºGÍõ"Ïž=Û¾}{@@]´¨ÚYD/R'!z¶Ð½XD•ü" `ñbôï/× gOX½ôšÆ'O°bΟgÒ®Ð×ÿ¸gôhlÜWW¹MÐëž=pò$||˜¹Ò?¶ìíñî¼~aÔ°0t(ÒÒ”s=ÿþ‹ÀÀJkŽ˜rã¶mCy9²²äºHP7ô"¤®Ss½EQGMNNÞ¸qãÆ½¼¼\]]Þûü"uíыܹs',,ìÕ«WYYY¯_¿n׮݈#FŽÙµkWy¥Èµ Ý‹ETÑ‹èëÃÑ‘); ‘ (P ¨¾6žø¤(˜™á“OªiÂÜ\ô]nj §z{==‘Ma¡röÊÊ”v)-Uz ffHMÅÂ…ÈϯÆÑ‹´ƒšëE8Ž@ èß¿ÿþýoÞ¼¸iÓ&OOÏ©S§Êzn½HDãz@°cÇŽ;vHM¼=zôèÑ£G7n6lØŽ;>ýôSMõPAt/QE/RR‚E•í€ÿeÊß• Ɖæ?-Âĉص ÇËu).Æ¢EøáèÑþ‰{÷0b„\ûòrÃÆF´{ô(¾ünn¸rE¶}Eòó•°› ¡Pi‹cÙ2EÂã¡ @ñ÷MD/BÐj®¡cz»oß¾§Nú믿6nܸyóæ¥K—Θ1C*ì z‘:‰fõ"=òððxöì++«Y³fõëׯE‹M›6½{÷î¹sçŽ?~áÂ…^½z:t諯¾ÒT?A÷bó‹üý·h»¨rrS—X1n$'3e(PXˆÂB¢ïßWӄ؀ˀ‚‚j\”µWÍE…( Ñ‹´šëE(Š’Ê׫W¯cÇŽÝ¿ãÆAAAßÿýìÙ³Åïeˆ^¤N¢A½ÈåË—g̘QVVfcc³yóf:3²øì!C† ²lٲŋ_ºtiÊ”)!!!cÆŒÑHWA÷jã]¸pá^µ%v jFár¬ÁÁÁçΫվ¨9sæ<|øPÓ½ ¨Ž¿¿ÿÉ“'krÉyI9räÈ‘øøxGGÇÝ»w—”” +?ë$îîîט£Ö·nÝš2eJYYÙ´iÓžDß¾hÝ€è_T®åQ‰œ\¼qîK[[:òrIáÌ%ìÄÇãÍå\n߯óçèÓmÚ(:²2¼yƒÏ>cº¬D/BÐ|||rrr–,Y"„B¡P(¤7Ԇ̃ ??¿j):uêš‘‘áììÌårãã㇠¢žÔƒFô";wîLMMuppرc‡‚kdž>}»jÕª=ôH-C÷bUô"ff ª´NµW/$&ʵ§kãݼYiͲe"E§LÌÍñÍ7•jãµn †o¬ˆܺ%màå%×þåKÄÆ*a sg˜›+çÒ³'ŒñÍ7•jã1äʬ\‰»w‘œÌtåÿ z‚6`kk«¯¯ß£G‡CQEQô‡Ã‘ÚyÃá,Y²¤ÚXD(ž?Þßß¿eË–aaa$©{hD/rüøqk×®UªÌøÖ­[ûõëwôèÑùóçwc¨Ö®!t/Q%¿ˆ@€Œ ¦LÍ›ÃÌ oÞˆ”­oÞ@(ÄßCÞª?ŠB÷î">ññ`øÅ?x0Z¶ÄµkHM€[·PV†ÐP¹öVV;yy8u Þ¿WÎ^5—¬,Ñ@²RILÄ“'yßÏ4v H~‚6@ç™5‹©„3ÆÆÆÌ3|—.]Ú°aŸÏ_±bÅÈ‘#ÖÑ$''GEE­øoeŸÔ®ÚP¤Ý]»v-Z´H©k†‡‡ûùùÕ¸wZŠúó‹¼yóæÙ³gæææÊ&P¶³³[´hÑæÍ›wîÜ©=U*Åè^,¢J~‘¢"xy1M еñþ÷?º6žˆ¾}åÚÓµñøü)Iìßýûåº;†–-L—”1gŽ\{Œ‹7o*Ù(k¯šËL Ý« ¤˜Éu¨É/²{ÇŽkâ5\úúÐÓ£Œ ·  óÖ­⸧Aѽ'!pÿÆ ¡™™(Ë…ôôÀøJ»°¬ %%æÖÖ@Q06—‹Š yö\>¿¨ ÀÜÜÜÀÀ@{¡P˜››kem-šMVÌ%?7·w¿~I⟠¤”ËmWT” À s¶ò‹È)FTTÔ¤I“j»™¨_/råÊTávww Љ‰ÉË˳´´¬…Þ©ŽîÅ"ªÕ£¹ 0å6¿t ïÞ!-Þû°»8D ÀÎR3!@C;vàÔ)ܹCï¥ïù öoÞ`Æ q±B%í¼Ê•tIZ¡À …’ <ö®Š¥©çz‘Mþþ[׬ÙV^NptIJe00ÀÊ•xþ\¦}2àŒ¦Ü¸ŠÂ÷ßcØ0”—ÃÕUf8"~šÇŠŠô¸»cíZ…˜4 ý%³‰ýÀ èöáll;;¤¦bÀ™ö·¹À [a¡"ö¥€+ ìþð¡  Ë (½{7ŽËUp —€WŸ×<¿HÕ5½®_¿îï“ãíí=nÜ8çãâæü"oÞ¼Ù»woiiéèÑ£Û¶m+µ«x¯îß¿òäÉvíÚuëÖÍÁÁaáÂ…-[¶üä“O §NÚ¤I“ˆˆˆ—/_š™™•””¸»»7mÚ”¡RÆqqq©©©ÞÞÞ^¼xMQÔ£GÖ­[—-Ù;¦¯¯Ÿ——WQQ !!áùó笭­¥Þ³?þüòåË&&&>>>¤ÚMIIû~öÙg’ ÑÆ×¯_/**êÓ§O‡ª6”˜˜èì윙™YÕÕ¯¹téÕ’…ØÚÚ:;;ÇÅÅ]¿~]j}/Ç»wïÞ_ý•ŸŸ_\\\TTT\\Ìãñ:tèСC‡1cÆÈÌàÇ"º‹¨  Üa~ýUò'øÂ`_Q”<ôZ¾¼ -ùd࿇o§²².¯^µoß¾ÚÎcÌeeeúwïvëÛ·úB\ÿÝaååúúú îúÏ¥'EÙÙÙ¥¤0 ]„Ä·È’6m¾üòËê]Ôo½ÈŠZŒþ §SS\º„'Oä"|à>Ð(05ERÒÒ/o^¤%ð hŒ¢›øóOܺ…ÌLÈù›ó€×@SÀ›Þ/-Åܹ ñê•L{ðR{Æ@¢’.¦À`àðËUp @) (X ¸æùE¤æEnݺµaÆŒŒŒüqâĉUÿß1çáp8 ,Ö¶m[©]IKÉ∃ ’šÉ°µµmÖ¬ŸÏ‰‰qppøüóÏéоÔÌ™3§M›¶víÚ¹sçšÓy“»!eìææI[^¿~ÝËË À–-[lmm $Û=wîÜüù¢ßAk×®ðÇ8::xôè‘T&Œ¸¸8ºQñ ;©vľNNN’ ÑÆgÊ"ýª uèÐáöíÛµT–YÍz¡P @eíQ»víâââ222”——_¼x1..îæÍ›Ož<‘ù+ñÌ™3ôôô&Ožìçç§x¥neQ_,Ö¦M›¾•_|(~PŒ z‘ùB!ÓôAÔg½ÈU`2ð½óùç˜;99 ºàDà% ˆ~P \¼ˆìly.o`2½Ó®ŽÇ‹Ÿàè ð ð1ßK@¾üÞÞfnÊØp¬”tñr•È}`'EÙ¯Zy6’Ô¼8¹{÷îúõëSSS—/_îêê*ON¨`=šŠÊï­*ä¿Æ’ÉéÓ§=<<8Nxx¸Ô)ñ7M»víd"2Û•g,Õ1©v«ÎYYY¹ËYŽ'ŽKléµ~UÚ•ô=pà@ÕJÎ?Umè·ß~KKK[µj•ÌÖkˆšõ"ïß¿/((hÔ¨QóæÍU»=xæÌ™K—.]»vÿ߯‡Ó¥KgggkkkSSS333SSS}}ýÿý÷Å‹'NœˆŒŒŒŠŠZ½zõ¢E‹j£Àúb‘   ¡C‡JEŠ£Š^„ 5°«a+ÀUÕô"@@´BÉÆsæ€1SÎ`/0=’»t«+ý]¦¨&&&ö´(¡qcØÛƒÇƒ••<û$¡P/?ß^üæ¸U+ØÛÃÜ\ž‹…@ WP ¸=#ŠÒËÍUÊÅXO““£Ô@>P”Þ§Ÿb¦B Ô\/BQÔÇ×®]ûìÙ³åË—O™2…ù‚ z‘”””ÇoÛ¶M(~ýõ×R»RÆÌ…šmmmCCCËÊÊnß¾=hÐ CCÃ]»vçååM›6 @XXØ7ÊÊÊFŒ!õ·j»RÆâÝöíÛ÷ïßÛ¶múúúô—™T»#GŽÜ½{·‘‘QzzzjjjJJJ¿~ývîÜiffVTT$õe6hРýû÷ …‡úúúÚÚÚJµ+éÛºukɆèð¥Q£F¡¡¡ÉÉÉ“'O®ÚÐÁƒkOª©f½=uÔ¬Y3•Ý£¢¢ÄÇÇàp8½{÷?~¼££cÏž=eN¢Ó¯rüýý7nÜxèСիW§§§¨>9P<<<öíÛ'Ï¢iÓ¦]»vOÍiœ¸¸¸Æ÷éÓGÓ!¨Bbb¢@ üT‡ºqãFÕªŒj²/wSÓÁ«WϦK ˜˜ E ”–âõkyöWþþ{ÜìÙé™›™€…ÌÍ‘Ÿ/ÊÐ/‹ùíÛ÷غÕÃÃCÁ.EGGÿÏÝ=]áôä½:uRÜÀ€¾}_<}ª”ËÐ[ݽ«Ô@¼—/ßåï?gäÈû%%ÕÚ§§§—••5jÔHñ^I1xðàìììeË–MŸ>]‘Wévvv™™™j®)~y¡»MÔ„ÔÔÔM›6×Òõ?|øÀãñÔö±ÆÄÄ̘1cøðáª}#?~ü¸ÿþC‡>|¸«««R=OHH˜0a—Ëõ÷÷§_«U‹••s€ACQT½Ð‹´võ"÷ï߯ÉA•Q1¿sOR$dbÍPz:( ¶¶œ$·°€…S+%%`øâ75…¡!Š‹Eõ‰ŠŠ 2Ùs8°°€@ Ò8çç+g¯B€(ØRj ……HMÅÔ©(-•ë"AÍõ" ,˜8q¢â 4R&>>¾¼¼|üøñ K‹¬ìÅ;0$Ôš4iÂÖ/™¨Y/BëÀ€N‚Ù£‡(퇋1a’´”ÄÍMôå}ü8FãªkW˜<öö–†Ã‡Áz^FÛ¨Ö­€ÂBlß®„=€cÇðì™r.§NááCå’›‹7`n^°÷?j®QÖõ"’¥^ÒÒÒÊË˫ϵX™”””ˆˆVo°^RGñÂ7»víZ¸p¡BIkZÒ‹:thåÊ•eee666‹-š;w®½˜N;èիשS§ž2”xSÝ‹Eˆ^D§©×zcc,]Z©²LÄOð+Wpõ*Bµr³ˆц©)FBµKaÇŽÅØ±£G±re5öVV"›Œ ìÛ§„=€'`l¬œË™300Pn ¸pþ)*ÙXu@/"Yê%&&FœçTqZµjUíFK½°^RGñÂ7C† ‰ŠŠRVJ̵¡ñóóÛ±czÅJƒ ؽ~ÍùôÓOdËOº¨º‹½ˆNS¯õ"xøg΀•¾ø¹¹H_œàÑ#8~ôïé®]ao‡‘˜(×…ÇCt´(gIÓ¦øî;¼} †ä II(+û8i1}:ìí.·‰¢"åì¼y£´Ë«WJäÍ$'Ã×WÁ—;Ú¦Q¼KÕR/Þ¼y#Îvþüù¬¬,¡P˜=kÖ¬ððpssó’’’©S§æççKU~ðüùóÕ«W/]ºÔÉÉIª˜‹T©æÖ¤¤ŽdŸ—/_~ôèQqáþþþM›6MKKsvv1ßK—@ÏÀÓ‹/ÆäÉr]ĦM g¹é ùnÝÀ𥃹sñ߃ôOœcÇä(oߢ[7%ì „ÄDå\† ÃÝ»Ê äÖ-øú¢´ŠÝ·Ú¦©!Rwk‰jßÎÔ’/3’j¿ z‘[·nùúúJUÂ*((iüîÝ»ÄÄÄ èÄûë‚‚@`aaÁâRjÝ‹ETÓ‹¤§§vr2(,¤P>ùúúx÷|¾<——z€¨Ö¹‘š7Gi)22äÙçñx¯‹‹'Àă£A\½Šœ™ö<àtqqs ˜þJkßݺáÝ;\¹"Ó^\..6(cc}=½jí¼*.¾t02r¤ß§*àòº¸‚f^B IDATø `nd4A_Ÿ8W\lŒS` C½Ö‹ÐŸÚÀ4lXiWŠŠ P+­émÞœ)C }}H¾ (0¬#ÕÓ“aÀ0éjh¨œ=€ÒR¥]èB»J D_¯_ÃÝ]Á9-Ô‹XAÍd™z‘´´´Õ«WGGGW÷È‹Eâãã…BaŸ>}´R~Õ÷Úx*èE^¿~=ÈÉiêû÷tä±};ÆŽEN\]ñâEU{!0H~ÚæåÁÈ.ÀÔW®ÀË ²fäâO` àÈå‚ËÅܹøâ ¤¦âÄ Wµ‹¦€7`X\ ss,_¿þ*Ó^¬L€€aYYµö2?€–€gy¹ayùG—ýûå¹d'C`Ay¹#­Ì§òꕼ@àµÌ+V¡^ëEJK†÷;kÖ`à@øù!6òòÀãaà@0üø¸}œœ>ÖÆûî;Tžñ®Dh(¦L»;èu àóÁðønÝãÅ têB!¸\%ìðxTqQj Ìÿ˜òÐ6½AG‘Ò‹oݺ588XÞ@yïhþþûo}ûö­N²‰E•ô"?¶l™„áôõ±n6mBV–¼‡Èš¾ô¾±1èÅë©©ò²ôÚ©@*€† ‘œŒÔTüù§¼&2R  Cï·m‹ˆ¼~‡eÚ—/Ñ Ûxª6‘–†ä¹$.Àe’ èkllæ*¶Ö¼^ëE**ðô)’ÒÃ'OD±Må9^Ùܽûñ•ŸÏ0ÛzŸ‰U •¶¥àr@(¬‘½j.* Da´M/BÐQÄz@pôèѵk×fff2Øçåå=zô¨   ð? ®^½ @WñÏž=ДÎͺ‹¨ 1v³èž=qó&nÝ‚üô 0xˆfÆ}}ñãðöfÈëà||Kï´n³gqÿ>þïÿäÙGÿŽŠ÷W¯ÆØ±7N^l‘ôRÆÀ'_ á"?Êá ÿ<HàmaAEGC±Ï¥^ëEµ‘‘‚¡IÓ‹4­¹}û¶Ï}~6¼}ûv üײºò;íÒ¥KØÍ|¯{±ˆ*z}}ôì ;; K6|ò *+ž*Q^ŽS§0s¦è­6]ù¢W/|ó\—ß~Ãøñ¢øÆÆš7ƒ\ëåKüú+üýE»;À¼y”°pø0ž>UÎ%"(7÷ïqù2LL Øs½Ö‹jœ8ÅsÕO½ëUc³gÏNMM½~ýºÌ¼/Uár¹;wnذ¡¹¹¹¹¹9½Ñ°aÃØØØØØXˆEÁµk×PyUÍѽXD•ü"ÆÆX¸³f}<Ò¦ÍÇU¹rgÎ`çÎJšÁI“ÀP—!"C†àÛo?±±Á’%rí££qø°´C¢½Œ lݪ„=€ß~ƒ‘‘r.‘‘Ð×Ç—_VªÂ<„œ:…“'ñêÓ•ÿ£^ëEôôТÖ@ÑËZ·FÏžPQðÅLzzÉÀ¢w4 èßÿ£ð¢*íÛÀС¢¶rrpâD¥ûV :µ°]¤¸Jظr/^(çrý:?Vn ¥¥øç4i‚O?•ë"ÎéE¬ à ëUc¹¹¹3fÌ8pàÁƒ3ä¯lÃåroß¾]õ¸žž^lllZZZ-ô‘e¢££ß¿ß¼ysek12£{±ˆ*ùEø|ܺÅ$ÝwvÆgŸ!>ô­ðø1>Ì$¸›7…ƒE .Gâñc¹ö3g¢G„…áÞ=xñ¥¥XºT®½ V®Ä»w¢¼×ÅÅÊÙHK«Æå“O°jÞ¿ÿXõåKp¹øãû Û·#*êãAæäwsç‚¢àáñQ3xù2._–kß«zôÀùóÿxpûv¹ömÛbåJäåU²QÖžÙ¥M¬Z%ÃE…(L½Ö‹HMÅÝ»`j {{3•ˆKJ‚@€øxQ~‘V­ðÙgHIÃ'>W¯ŠÔ 66psûw8zT®ý?ÿ ¼»v‰v¿þvvˆ‰ÁË—²íóó•³™©´KzºÒIIÁóçX´HÁÔmÚ¦a¨GSµ. ]ž·Gt¼"雚šJOuDÈ™÷­¶jŒ:‹¹ÔÄùE Æ?~üøû÷ïïÝ»÷Ô©S\úî­Œ¼X¤[·nEýûï¿,f2e’’’3fdddtïÞ}úôéì^\÷bRF§©×z‘’üü3~þø¯6Þ?ÿ0h¨EŒ%Ú Ä?bß¾jjãEFŠ–¹::ÂÍ oÞTUC"ìþì3ØÙaÿþj ×)k¯š‹ Q-Ô‹È«GC#3Á¥X£ öWf©6!¦Ìª1Po1—:@Õü"ŽŽŽûöíûå—_:"U´…Ëåʼ,,,ZµjõâÅ‹¿þúK{„hçÎ{øðáôéÓy<ÞË—/}||ž?nffÌbÆUÝ‹EH=­ƒ¢°|9¶lQĶ^ëEZƒ¶éEêÑT­ cff’ŸŸÿþýAƒ]ºtIì{âÄ ''§-ZÄÅÅ?^ª¹j«Æ@½Å\êòêÑ4nÜxÅŠžžž§NÚ·oŸäË—ÂÂB™Qé¸qã¶lÙ¦=±ÈŠ+^¿~(>ÒªU«cÇŽIU`Ý‹E´·žBEú”žžH¶BQàr™$,ôïŠÙ…àó•°`b‚‚å\LM‘—§ô@>ÿS§2¬û•¤^ëEµ»;VÄPÛô"ÕÖ£‘\³@k dúŠ »È,DWmÕ5s©0×£122rsssss»sçΞ={Μ9Ãçó è:·R̘1#((èäÉ“ éšfݺu³fÍ`mmÝ¡C‡iÓ¦Mš4©–òõé^,¢Š^¤Ax{ã¿À_t”zyÛƒX¸7o2­S¥¿’ÅbÕ=°mÓbšÃ‡EÏÊèh¸»£Ú”mÚˆ^™gd S'%ìôí‹§O«wiÝú£ËÀ¸{[·V¯$!Ë—£¸¯ʼZ¯õ"õcc¦:2211Ai©Ò µl‰%K ˆ­¶éE´5s©0Ô£‘¤wïÞ½{÷ÎÎÎÞ»w¯¼cŸþù Aƒ®^½ºfÍš-ŠM3×6cÆŒ™>}zxxxóæÍOž^¿ÆŒòòÊKQ¯õ"ÆÆ˜;­ìmÛV$‰Ij*V­BDèŸÔööàîŽþý庸ºâ§ŸD¹sèG§NL*Ñ+Wàéù1c=ãøë¯r3ÊdeaØ0%ìL™‚ÄDå\fÍÂÝ»Ê äÁlÚ>ŠåÿÕB½ˆ6 ý=Ô6dÖ£‘GãÆW¯^Í`°aƆ„„¸ºº:99±ÓÅšpãÆG­[·n­Âë%U@÷bUô"¥¥ðóÃŽй3BBðÏ?˜3G®}a!x<ôì)šüX¶ óæaóf0¼F-)ÁÂ…X¸ñ÷ßxðÝ»WÓ1q˜yêÆŽÅĉÕú”µWÍåÿ]”\ñ(L½Ö‹èë£woQ=šF*íJqå 8ŒQ)&¶·%2¡(4jÉ¿°¡!þà‰"uIÞ*g ¼\i—²2¥’žŽôt,^ Åf;´M/BÐQäéET£C‡^^^ãÇÿã?œéã`É’%¥¥¥Šig33³_ýuäÈ‘ÁÁÁ£FêÓ§O-5¤{±ˆ*z‘Š ¤¦"5ø¯@hq±(=II¢ º>í»wL•DŠQ¯õ"ôÚòsçäxzÂÉ [·‚Ά” >®®Ð—ÿÿôôiP\\DynJKáëû1ÙnU¶mÃØ±XºT’–”  @”’X&-[âÚ5¼zú—_E…röÒÓQQ¡œKFx<åR^ެ¬=¯^5‘ëP mÓ‹tf½ˆ ,[¶,---<<ÜÅÅeÁ‚Ý»w·°°Ø°aÃÌš5k=±ªFzöì¹|ùrÿü166–¢ó+²îÅ"ªèEµ©©‚ïhêµ^„ÏÇíÛ•uQĤIpr•òÜüù'Ó5…BPbbįÞòsr2èèY&iiÈÈ@Zš*€ :L—GFÒÓiû,%í)ïR¨ü@Þ©@)p‘ÁE¢!°‚‚zÅÑÓÓÛ¹sgãÆwìØ±§JN¬bų¬³dÉ’ÐÐÐþùçâÅ‹Rªj¶Ð½X„äQŠ’WU˜M¦¦8}š)A¾õZ/ü0½.ž3ó磨ˆÞ£m}0ý ¡õöÿ"sm€|!°l¼½Åje`ôb°ýmÛŠï  §Œ=€ ’.eÀ%RX—ss¬c®‚^äñãÇëׯ——C¬ZtB/BP¥ô" BQÔêÕ«===÷ìÙóøñãüüüÉ“';v,66–õ¬ bdd´hÑ¢•+W‘XD„*z==´k'*Tѱ#4l†»‡ÏÇ:T47Þº5tèÀ´çÂ|õ•¨Š^³fðé§`(:•™‰#Gàé)Ú¥ÑMœ(W PT„ýû•°ƒ¤$å\.\À?ÿ`Ètë¦è@ qשּׂ™Ê¬HPŸõ"[Þ¿_«äÏ@`^­€º2þ––z õkt‡Z]Ρ”^äîÝ»›6mºxñbMþ°D/R'aW/"‰¹¹¹džõãǨՕ,Ì|óÍ7þþþ·oß~ûömÓ¦MY¿¾îÅ"ªèELL°bE¥Úx;âêU¹ötÿoïÎ㢪×?€fa‘U %7­È¬ëš™)!¸ß Á%ÄŸhE¦¥WM»æŠ )˜f()¢(¹¹+.àVQšQlâe5E‡aßÇa`3Ãaæ|Þôšåû9ŒùÎ9Ÿó<ûöÕÉ N›ÆwmÝãÆÕ¹¦·C¶³Ý‡áàAõ*Ô 6V‡ñNœ@«VºM9{&&7®Î5½ì;’œŒ ”„¬,¶W~âY΋ØÛÛ8wF4Ñ2/’œœzöìYænS¾•R^¤Eâá­EôÉ‹TW㯿”¤q@¯^h×7nÔ^øû﨩Á±c`ùóáí ‘?ýT{l¹ª G‚å\õ¨QèÕ ?üP[’äÏ?!—?í‚VŸ­-fÎDQ¶l€’ÝÆÈÏ×yJnn펫)ÇE(/Ò",/Òµk×K—.ݼySYÍðd2 ‹æxqá­EZH}ý®žÕ‰…d2ݦh]&ä)¦7Þ¬YlY`”!| Ì‹ìÞ½;44ô&Kuùº\]]E"‘D"‹Å‰„¹ÁPÞ•H$Ìå]±X¼víZ:(Òò,/ÒµkWÙÙÙM©ššš3fxzz¾ûî»:.cŽÊ4Óß=á­EôÉ‹˜›ãƒ0t¨ÆLóE‹˜?‡eÈ­=}ºvIáíU«Ø®Ra.ÉùúëÚ6ÇŽáƒØ®=a¾9;ׯi 1p ãŒ‰´´Æ§tíútÊøñøå¬XQçš#öùùg¬XÊJjœ¢‚ò"„”y‘=ztíÚU˵ˆD"ùçŸô{ÇW¸k¤@øÃ`yggg7”ÝX›àÔ©Sû÷ïß¿ÿ–-[bcc;0µ´pìØ1...M߆ú„·Ñ'/"•Âí:CùÇ‚éòúë÷Æ{ãÚ",-Ѷm#ãÛ´©}MKKˆÅ—HjÇTTè6Oú€è4…9j­ÓŽ´iƒ¼<̘’’F¦ ¼áe^ä•W^ùþûï/]º´jÕª .°Ï’J¥ …¢ººº¦¦¦ººš¹ÁPÞ­®®fÆ(ïÖÔÔ¼ûî»!!!th¤…1X^dðàÁ&&&III÷îÝk×®]S^ÊÉɉ¹‘ššÚ¿ÿ/¿ürüøñÎ*..>pà€X,žÂ^B_Â[‹è“‘Ë޽{ G¬_¿ÿƧŸjÿ>*+áãS{ä`æLLœˆ-[ØZª–•á“OðÙgðâ‹8}ׯ³‰)/Gi)”ÿ¤vìÀˆ˜:Uc³’šë0ÀǨ®ÖgʧŸbñbmw¤²%%øßÿ4¨‹ò"„Ôê‹ôë×ï‡~8wîܪU«®\¹¢i–X,nÛè2]ƒf:ËNŒË`y‘víÚ >ü§Ÿ~Ú·oßLïR}¹ººš˜˜TVVöîÝ;55uúôé§OŸ^·nû?Ñøøø²²²!C†teé-ÕÂ[‹è“©ªÂï¿×v-gJ€!1±‘YçÏ×Þ`N(dg³U(PZZ[½›9}XU…Fç*0¥¬KJ™¢ëxý¦è±#Z{ò"7nÜHII9{ölll¬®¯œ››[^^îââ’™™™°PCÅ[µgÙk³‘‘‘‘ÁÁÁºn­p5X_dðàÁƒ>yòäêÕ«SSSëÏjJv•ê‹´HË‹ð÷÷ÿé§ŸbbbfÍšÕ”KºLLLìììîܹ³mÛ¶¤¤¤E‹íÚµëèÑ£;wîìß¿ƒSJJJ¾úê+z¿/;ã·oŠãÇ7xé?1&­ÿFGEEa90#Ó¦Mc¹ò3==}ÆŒz,D$&&vëÖ €‹‹ ËÉ,µgÙØ»w¯Ú·7µÔi!’ Z†G˜BBBh(¢3lذS§NÅÆÆöêÕKí©&ÖÑ{.á­€€€$öï¨ÜñòòêСCFFÆüùó›ò:÷îÝ»s玥¥eÇŽΜ9ãîî~ÿþ}oooÿteƒú'ÊËË'MšTPPàîîîååÕ”·f!¼ã"T_„wÌͱgO#ÕåŸhñy‘¸¸¸óçÏ{zzJ$’]»vµiÓF&“ùùù988ÄÅÅݼyÓÒÒR&“Ôoë——§L¶çååmÞ¼¹¬¬läÈ‘®L;¡º#UŸeìååÓ¥K—áÇ«md‡âããsrr,X ÜÕ¼víÚ;w ÅÝ»wçÏŸÏÌ---íׯŸ››€´´´Aƒ6SáæÀÞF$ùøøŒ1âðáÃ!!!Ê¿ÎT_„¨1X^€D"‰1bĶmÛ<<<¦²\aÀ*>>À+¯¼Â¬­ÝÜÜNŸ>½aƈˆˆ#GŽ?~ü•W^2dÈСCkjj®_¿þõ×_ߺu«mÛ¶ Í÷ÿ¸ðÖ"úäEÄb<÷¬­ sghÕ nnÇ+HO‡‡Gí×}GGprËè÷ßñ¯¡{wèÔ ìík¯ÊiPQŽ¿í]fÊС°µmx¼L†ƒuàÒ%dgë6åçŸñ×_ºíˆ\ެ,tî íÂØ->/âïï/‹'Nœ`Û¶msçÎeÖ;vì˜:uª¿¿ÿòåË5u¼+//WދųfͰsçÎ+W®(l 2¤K—.ªÏºººªÝ7o3¸wïÞ“&M²²²š1cFFFƧŸ~¢º‘|}}÷¨d¡Ô6òÂ… ¥¥¥;w;v¬Ú2ÜÜÜ._¾, …´ëG#‹ÇŽ;jÔ¨„„„uëÖeggS?¢Æ`yFïÞ½#""Þÿý¹sçZ[[3F×WÈÍÍ]µj€Ù³g+477ÿÏþ{õêÕ«W¯†††*¼üòËß~û­öWÜèAxk}ò"X³¦Îuª`©kÄôÆ;w®Îu4³gCå—§®ukÔéשXއáìYõ,¯_P€ãÇuàµ×`a¡Û”ajŠ÷Þ«Ó}G’“1{6RS‘‘ÁöÊO< yUʃÊÝ»wgi½Û`|¬ººšåS°ºººþݰ°0µaׯ_OJJ Ö¦Œ´êF¾ùæ›mÛ¶ÍÉÉIHH˜>}:êرcGnnî’%K}Yþh´’D"ñõõý÷¿ÿ½gÏžƒêýŽ”i‘ ™aLœ8ñúõë›6m  Z¸p¡-Ë×˺~ÿýw???¹\>vìØ·ÞzKíÙ¶mÛ®_¿~åÊ•çÏŸOJJºxñ¢T*m׮݄ |||š»ü¼ðÖ"úÔ©©ÁíÛøë/œœÐ¦ òóñèäæB¡Ào¿±Õa6@™\©ªBJ X¾ ggœ;¦XMj***£q¼•ÆGIIm›‡uàέ¦ìîîNkJKKÓ>’É[È‹8;;«-;rrr^|ñE×'̓س?ËÞÊîý÷ßWÞV6ß´isC­oÖ”)SÄÇÇ+Qíÿ¹{÷n???–÷2–üü|ƒµä`ØØØP?š–‡ò"\ÞZ„ò"‚Fy½ ±ó ?" ¼áåE¸"¼µåEò"z£#ü¢¼áåE¸"¼kz©¾ˆ Q}ÂT_„p‚ê‹pExkª/"hT_„ðÕ!œ ¼W„wކò"‚Fy”!œ ¼W„·Ñ//òàÁƒàÀÀª²2‰ÐªärhþPT×ÎÃÃ’ùú+‘ÀÌ 2Û[îСœ¦õŽìILôööfyeåEš(33s×®]K—.¬|êÆ)))gÏž­?177·¼¼ÜÅÅ%333!!aá…ʧ"##ßÿ}‰Db€íç Ê‹NP^„+Â[‹èQ_$??hß¾ÓïÜéZUüç?ððÀƒ˜5KÓ”Õ@>°ú÷ßÍtë†U«Ð¦ bb°o_ƒãÖ»—<@»vØ·ÎÎÈÉÁàÁ Ž/<À¾G$°|9 ¼ó®^­?¾˜ ”ûɃŽpøè ì}ð@›·pøÈâ ^žîÈ­[xýõ§”ÀM@ËãÏT_¤‰\\\:wîÌÜV]ˆHOOŸ1cÆŒ3œ˜˜˜8sæL4Ô†éãëëÛ,[ÌKT_„p‚ê‹pExk]ë‹”––özþùîÀ_À_¬­‘“ƒ¬,=ªiJð7ð:°€H± ((€†œJph,`î—•aút(¸uKÓ[Œ–€7‰GâÒ%BÃ{$ð ÐIëñÕÀ x¤Ë”Ç@¹Ž;Òè´D"‘¦1ª¨¾ˆ&¼~ýº»»»¥¥å°aÃvíÚÕ¦M™Læçç'•J÷íÛ'•J>|ÈKÏÉÉY° öwwþüùââb¦øÇ’%K¢¢¢^^Ø»—eüJ©ÔµªªöS\"Á„ ÉXÂ%ëE"w›ÚûÎÎpwG›6°µÕ4Eüð¡c«VîÌ—$¸»£²’ÃñD"qQ‘®S$öö’ÌLv¤•D‚°0°ÖñTEyí)cˆD"…B¡Ó\ŸüñÞ½{AAAÌ#õ‡)ÛÓ¨uѦñ Q^„p‚ò"\ÞZDŸ~4vvHI©½ýüó°u+?Ö8ÞÓC‡bÅ `>ZµBn®Æñééø÷¿ñàAwíbÛ¤Ö­ÕSû/½¤þ MŸœ OO|ù%ž|i5åãam­Û޼ñÌÍYN⨡¼ˆ&W®\ñðð¸uëVIIÉ­[·Ænee%“É|}}¥Ré¦M›ÌÌÌòóósrr²³³“““SRRäry=ú÷œ,—˽½½ìííóóóÛ¶m«|}''§ÊÊJ“úýh’’’ÔºÆhj|ÓbP^„p‚ò"\ÞZDŸ~4 zô¨ó³"Ѥª ––uƈDlS>„B–ï=b1¬­QSƒââÚG ÈdlSZ·†©)?súC×ñÐyJn®Î;òè¶oGjªÆ)uQ^D“ððpîîî˜È'Ÿ|¢:àƒ>P½ëììÌô‚aLž @¿éϩʋNP^„+«OýhxG$‚Ö‡»© áêGC8Aýh¸"¼µõ£iF––:O‰°hÔr8õ£!|@ýh'(/Âá£Ñ'/bjŠº— ÔÁT±lÓ#GÖ>rélmÁ}ñEèÕ L9¹G‚åH&ao•+kY¶ >>xõUS<<`¸»ë3¾¨6ÀÛ¯½¦Ã”¤$ܸÁ¶#ÌŽª;rð Þ|×®iœRåEP^„p‚ò"\ÞZDŸ¼ˆµ5~ø¡‘1;?Ó©Þ~762eüxŒü¤$,^ÜÈx;»§cV¯†·74”ë~jÌŒ£Ïøäd|ý5¼½ë\ÓÛè”ÄD˜›7¾#¶¶OÇüø#<@J ¦OodÊ‹~ ¼áåE¸b µÈÎ;]\\ú÷ï¯ßƒªô©/R^ެ½Ý·/ÚµÃå˸wOãøÒRdd€)jÉÔ:«®ÖÔ‰rs!—?=œ0iÜݱkÒÒ4N©¬ÄÁƒµe9ڷLJâömDEq6>/••8tÿûŸSrrè¶#·naêTh}ð™ê‹> ú"„T_„+Z‹„‡‡>\m…¡ýƒªô©/RRòôzÝ#Gàå…/¾`éGÇŽáØ1°°À„ (/GÝë°jUí×^ƒ»;öíáClãú ?ý½{ãÃQXøô8¯ß=vDÜÖáp«Ê‹Õ!œ ¼W ´Im¨…öªÒ'/BxƒÛ¼‡k\P^Dè(/B8Ay®<yÒ¬:t€vMzÁu^„Ã5®N(/"t”!œ ¼W„wM¯!ê‹H$Íûú Öý7+C³'mÚ`ãF¶ |ê¢ú"„¨¾áÕáŠðŽ‹è“±±yZйwÝ:,\¨qü”)èßóçO>ÔÍÍqõªÆñ7obÆ ÖÞ55€½{YZûÂÞaa˜6íé[xx ¬Œ³ñ—.ÁÇ¡¡ ÔaÊüù(*ÒmGÞ~VVO§4†úÑ> ¼áåE¸"¼µˆ>y¼ñFG˜‰&ÕÕpp¨ó]_,fûêon‘j!y惜…TZgŠX¬þ MÏüÕuJ~¾Î;"“áûïqå ÛT_„ðåE'(/Âá­EôÉ‹<|–k®ºvÅöí¸y³ö¨€þÁÞ½`©î:}:fÍBt46o€²2ƒåo‹ ®_GfæÓ5\Ž?ÄìÙ§lߎ‰1mZí¥ÅºŽ¯©AE‚ƒññǺM‰Øv¤[7üñ²²ð µTTàçŸ5ޝ‡ê‹> ¼áåE¸"¼µˆ>õE*+qö¬Æg™RÐ×s÷.îÞÕ8…)QPPçc˜åkS~C¡¨3¦², êêêÚ1Ê)ºŽ×oŠÚFªipGtAõEP} ª/ÂáeW© iö¥~4„¨ áåE¸"¼ã"T_¤™›ësÀムõE%”!|@y ʋpExk}ò"R)^~Yã³Ýº@«VOÓ©™™hÝ..§0W‚tî\‰­¨À¯¿²5‹i×ll\ûÈæÍxýuôê¥qJ0|xm;:]Ç—•á»ïtžòë¯øóÏÆwÄÚú鎜?qã—§qJ]”áDfffBBÂÂ'ׂ©Ý%¢¼áåE¸"¼µˆ>y[[¶+rݺ=Ó¹3Fn¼7ÞÔ©˜:þø¯¿Þøøv힎ٶ ~~÷º{ï=¼÷ž>ã““±{7&Nl¼7žê”K—Ъ•n;2`ÊÊpùòÓä/+Ê‹$$$¼óÎ;MÜÕK£Õî’FQ^„p‚ò"\ÞZDŸú"UUOC¦®®°¶FFŠ‹5Ž—ÉŸ_e‹ñú먩ÁùóÇß¼‰òrDFÖÞõñA×®HLÄÍ›l›tæLm´];øúâÞ=ÄÇs6>;»vJE…SnÞ„B¡ÛŽäçcʶf]¼ª/’––¶fÍšï¾ûN׉,y‘¸¸¸›7oZZZÊd²€€€ìì쌌 vvv£GŽ‹‹;þ|iii¿~ýÌÌÌâââ/^üË/¿œ}˜õŠêÜœœfÑ×à‰ÅâY³fعs§«««Ú]nnn—/_¦…Hƒ(/B8Ay®o-BýhÍèy‘‹/†††ž9s†¹+Ñ«Þ?{^¤{÷îÌB€­­m@@€ê³ ®~ …Ú\©TÊ2^U5smv½»;vìÈÍÍ]²d ûôgåE'(/Âá­EôÉ‹fec­¿|1/röìÙÐÐÐäädÕEZwõSÅ’Ù¹sgJJŠ\.÷òòrtt0`ÀÆ---KKKƒƒƒE"‘½½}LLLffæ„ ,--·oß^\\œšš:dÈ“'O*çîß¿¿oß¾:u:wîܸqãÔŽíggg߸q#""B¡Pøøø¨ÝeÆDGGGGGë±wÏÊ‹NP^„+Â[‹è“Ñ•XÌÖ¥{þyí¯ˆ©Õª6mª=¤ÃçE ÅÉ“'CCC¯6”_Öï¸K^dÊ”)S¦LQÞõôôôôôTðÖ[o)o{xxhš;ûIÝM›6Õgggµu†ÚÝœœœ_|‘9YC꣼áåE¸"¼µˆ>y++lÙR{›ùë¿paíÅ# š?/¿Œ™3'U¼ÌÌðÃÇçåaÁ‚§56˜ÍûæDDhœÒ³'þû_0¹¦áK¯^lQ]ÇÿöüýñùçðóÓaʪU()ÑmG¦NE»vÐúø³!ó" …"111,,Œ¥§®~kþ×qtt\·n±·‚¿(/B8Ay®o-¢O^ÄÌ OÒ‚µÔZå©™7]º`äȧH$uîªùãˆÅPûºÏ¾`‰`o_gŠ©©ú+4e<ÓåN×)wîè¼#r9ŽGJ >ù„m؆ɋTWW:thýúõþù'ûÈæÈ‹ð`Gy ʋpExk}ò"%%µ‡Ô±#Ö­Cn.þóŸÚGîßÇ?"'Gã__LžŒøxÄÆÀ£G()A×®Çwé‚3g“ƒ7߬}¤¬ ‹aõjS""0f æÌ©½†E×ñåå(+ÃgŸ!$D‡)wî`ۑΑ”„[·ž^Utûö«W/Ÿwê¤q– äEvïÞz“åP]Ý»w—H$b±Xò„H$RÞ‹Åʧ”7233÷îÝKýh„‹ò"„”áŠðÖ"úäEÊËÙ /¼€uëP\¬S '‡m-Ò»7¤§ãÇ™ª–ñ" Ÿ¯úšïß/`鈑›‹‚äæ*§è4þ@±ŽSrûŽj;òø^yå¶YO /Ò£G.]ºh¹‘H$÷îÝÓõ-:tèÀçƒ"¤Q”!œ ¼WD‚‚‚¶(ãõ´oßÞÃÃcÖáÄævîÜ9‡~ýúi9þæÍ›Ý;°ŒH`mêjeÁ®Û€`û¨11©)**˜.¸Õ€ûFˆÅ07‡B²2æIÀ.ö)ffHPQª*=ÆWSuŸb ”é¸#r`0ëÉ%©JKK«©©qrrÒr¼Þ.^¼¸zõê .°{î¹çΟ?_]]]SSSý„B¡PÞ®©©Q>¥¼Ñ±cG-×^„Ÿòóóår¹½½½ÁÞ±k×®………´ia|øÒ¥KÆÞ ¢§´´´üü|¿éðáÃOŸ>½sçΞ={ª=Åy}"ùùù÷Y¢TÍÀÆÆ¦œé'EZÊ‹pExÇEô©/BxÃXýhD"ÑÈ‘#½½½<’™™É<ÞRë‹vT_„p‚ê‹pExÇEF­}p•ð»»»‚«šˆÅâñãÇ_ºtiÓ¦MÌå<ú£IOOüø1ÇG ÈÉÉÉÁUEEE”plyìììè×Ê á­EŽ?þË/¿{+ˆž¢¢¢Ž9bÜmH$~~~W®\‰ˆˆÐ/K4mÚ4–Z®„ÿBBB0¸ …Žä·HIIIÆÞŠ–@xkÊ‹šQò" 211yï½÷öíÛ§Ç\Ê‹åE'(/ÂÊ‹ƒ2V^DýÎÑP^Dè(/B8Ay®o-¢O?«/Ò¬øß†°£ú"„T_„+Â;GCyAÓ5/R^^¾yóæ’’’æÛ$=P^Dè(/B8Ay®o-ByAÓ>/òðáÃÐÐÐ^½z-Z´ˆW§u@y᣼áåE¸"¼µˆ§§§¦¢«7nÜØºuëäÉ“õxÙÜÜ\¦æDffæš5k4 S{–}°6©ÇÖ ×‡~ØhÑÕÂÂÂÏ?ÿüÅ_\½z5óajjj­ÓÖöíÛ=<<Œ½D‹-2dÑUP^¤…Љ‰ySÙ}4ðÖ",õEÒÓÓg̘«ÇË&&&vëÖ €‹‹ K#YµgÙØ»w¯Z²Im#ƒƒƒµßÈ„„íó{}‘ììì9sæ¼üòË‘‘‘¥¥¥ÊÇ¥R~›¨¾ˆÐQ} ª/Â~ý‰×†¦~4qqqçÏŸ/..öôô”H$»víjÓ¦L&óóósppˆ‹‹»y󦥥¥L& hß¾½Úô¼¼<‘H¤¼½yóæ²²²‘#GºººÖ©ú,û`//¯˜˜˜.]º >\m#;t蟓“³`Áå.¨näµk×îܹ£P(îÞ½;þ|fniii¿~ýÜÜܤ¥¥ 4¨°°ÐÀÝÏ›BS?šëׯGDD:t¨ººZí)‘HÄ·¤~4BGýh'¨ W„·9|ø°»»{ýµˆ¿¿¿X,ž8q"€mÛ¶Í;—Y[ìØ±cêÔ©þþþË—/ lÓ¦Mƒ/«z*W,Ïš5 ÀÎ;¯\¹¢<°1dÈ.]º¨>ëêêªvwÞ¼yÌàÞ½{Oš4ÉÊÊjÆŒŸ~úiHHˆêFðõõݳgê.¨nä… JKK;wî/bnnNy‘–‡ò"ìlmmÙ ‘H$¼ã"šò"MÔàÁ>stt\·n±·BgL^dĈ‰‰‰'Ož\¾|ùõë×Ù§˜ššîÙ³§²²²²²²¢¢Bõ†ò¿UUUÌÊÊÊúÙdnQ^Dè(/B8Ay®o-BýhýŽ¥ÚfذaC‡=xðàêÕ«³²²4M133{ûí· µZ¡¼ˆÐQ^„p‚ò"\iQõEÿ©Õ‹ÅãÇ¿xñbDD„¦ƒ|+.ª/"|T_„p‚ê‹pExkêG#h ö£111yï½÷~ýõ×åË—ÛÙÙ©=Ë·¢« ~4ÂGýh'¨ W„·¡~4‚ÆÒÆÜÜü£>JMM7ožjƒ‡kÊ‹õ£!œ ¼W„·aéGà ZÌ4wó½EFFÖ/`Êö£±²²Z¼xqjjjPP³ ág}êG#hÔ†p‚úÑpExk‘æÎ‹4ÚbFûÁMo^£Õn5o½õ?›×°÷£Qj×®ÝÚµk¯^½êççÇÔ.åE„Žò"„”áŠðÖ"È‹0-f¾üòËŒŒ æ‘´´4{{û õ³<Ë>˜i^sâÄ k׮ݶmÛæÍ›•gµ“““cbbbbb>\PPàçç—‘‘1iÒ$æa\\Ü©S§bbbþúë/îîîüLÕ4˜ѤS§N›6mâáE+”:Ê‹NP^„+¼»B¡QÍT_D•Z‹°v~i¦æ53gÎdJ¾ÆÅÅ1cöîÝÛ»wo×®]5jÔÊ•+÷ïß¿yófæ°Aýn5ÊKgy¥~?šFÕO³åE„Žê‹NP^„+Â[‹²¾ˆ2r¡Mçn›×(ÿP*_ÓÖÖ6 @9òÞ½{ÖÖÖ÷ïßWö¯Q{w^ ‹ºõE„‹‡‡jˆN¨¾áÕá ?®ØiêGÕ[ÌhêüÒ|Ík6lØÐ·oßN:;wnܸqfff ظq£¥¥eii©Í±cÇV¬X±`Á‚ððp&¡Ú­¦¨¨ÈÓÓ“ûŸN“1ýhŒ½MEýh„ŽúÑNP?®P?卿óËîÝ»ýüüŒ½ `úѰ_JÃÔFè¨ áõ£a§}?áeW __Dˆ_ø¹k}¡¼ˆÐQ} ʋpExçh ߆¾Ípˆò"„(/B8Ay®o-ÒÜyÒ¬(/Bø€ò"„”áŠðÎÑP?AÓ©¾oQ}¡£ú"„T_„+Â[‹P?A£¼áÊ‹NP^„+Â[‹4w?M233—-[ÆÜŽŒŒT}êÆ[·nö£êG#tÔ†p‚úÑpExk‘æîG£‰‹‹KçΙÛÁÁÁªO¥§§Ï˜1#66¶Á‰‰‰‰ÝºuCCýhxÛ5¦ùhÙ†ç¨ÐQ? êGÃá­E8Ï‹FGGÏ™3gË–-»víºsçNxxøÖ­[¿úê«»wï>xð`Ë–-ÑÑÑëׯ¿{÷.€øøøµk×*§ÇÅÅ?~<&&¦      00°¬¬,??Ÿ¹ //O$1ƒÕúÑÔïÃÒø¦e ¼áÊ‹NP^„+Â»Ž†ó~4žžž'NܳgóßÄÄĹsç2«‡;vH$’™3g2#—/_À××Wµò›Z#˜!C†H¥ÒÊÊJ樬êIâúnÔ.pei|Ó2èц‡(/"tÔ†p‚ò"\ÞZÄõE”‡1D"‘B¡Ði®Ï?þxïÞ½   æ ‹úÔ1µ®1Ú4¾4ª/Bø€ê‹NP}®o-Ây}‘+W®xxxܺu«¤¤äÖ­[ãÆ ·²²’Éd¾¾¾R©tÓ¦Mfffùùù999Ç ˜CáIDATÙÙÙÉÉÉ)))r¹¼Gýû÷MNN–ËåÞÞÞöööùùùmÛ¶U¾¾““See¥‰‰Iý~4IIIj]c45¾i1¨¾áª/B8AõE¸Býh¸·mÛ6eµÖÂÂB™Læìì\¤Z×!6¾Ñõ£!|@ýh'¨ ;êGc·oߎ‰‰9þ¼êEŽŽŽ .DP¯kŒßèŠê‹> ú"„”áŠðÎѾöÚ·o ßôgákåEP^„p‚ò"\ÞZ„úÑåEP^„p‚ò"\Þ9êG#hT_„ðÕ!œ ú"\ÞZ„ÏyÒ(Ê‹> ¼áåE¸"¼s4|΋FQ^„ðåE'(/Âá­E(/"h”!|@y ʋpExçh(/"h”!|@y ʋpExkÊ‹åEP^„p‚ò"\Þ9Ê‹åEP^„p‚ò"\ÞZ„ò"‚Fy”!œ ¼W„wކò"‚Fy”!œ ¼W„·¡¼ˆ Q^„ðåE'(/Âᣡ¼ˆ Q^„ðåE'(/Âá­E(/"h”!|@y ʋpExçh(/"h”!|@y ʋpExkÊ‹åEP^„p‚ò"\Þ9ãæE233.\Øà]Ò(Ê‹> ¼áåE¸"¼ã"£GîׯŸšþî...]ºtÑt—4ÊÝÝÝÉÉÉØ[ÑTééé?6öVý999ÙÛÛò‹ŠŠÌÌÌ ùŽÄìììè×Ê á9~ü¸½½}Ÿ>}Ô‹‹»y󦥥¥L& ÈÎÎÎÈÈ`gg7zô踸¸óçÏ—––öë×ÏÌÌ,..nñâÅ¿üòËÉ“',X :÷Î;/½ôREEÅsÏ=7nܸú——·yóæ²²²‘#GºººªÝ––6hРÂÂBü@„%**ÊÎÎnĈÆÞ&™6mZhh而½!DO!!!ŽŽŽ þÞLär¹¹¹¹ÁÞŽF@@Àرc‡ bì <á­E>ìîî^-âïï¿|ùòÀÀÀ6mÚX³fMïÞ½\»vmÔ¨Qþþþb±xâĉÌàÎ;èÓ§³^Q›““Ãꈋ‹kpÄbñ¬Y³ìܹÓÕÕUí.77·Ë—/ÓB¤Aiii-àHåE„.??ßÀÿ‡ÚØØÓwè†ò"\ÞZ„%/Ò½{wf!ÀÖÖ6 @õY±¸R …Bm®T*e¯ªºººÁ»;vìÈÍÍ]²d ûôgåEP^„p‚ò"\ÞZDS}‘;w¦¤¤Èår///GGÇlܸÑÒÒ²´´488X$ÙÛÛÇÄÄdffN˜0ÁÒÒrûöíÅÅÅ©©©C† 9yò¤rîþýûûöíÛ©S§sçÎ7Ní{Lvvö7""" …Ú]fLtttttt³ÿ „‰ê‹> ú"„T_„+"AAA[¶lÑ4¢}ûö{öìiÖíÈÉÉ ýꫯ”‡%4¹råJƒyž`v$**ÊØÂS-#/âããCyA3|^ÄÜÜœò"-åEØÙÚÚ²/0"‘Èø×Ñüù矯¾új\\œD"it<Ïë‹8::®[·ÎØ[Á_T_„ðÕ!œ ¼WŒyŽ&555,,ìÈ‘#LhC,‹D¢Fgñ¼ }õaGy”!œ ¼WŒ³¹xñbXXØéÓ§ëlJcggÔFÐ(/Bø€ò"„”ኡÏÑ$%%9ÒÛÛ[m!-®[aP?A£~4„¨ áõ£áŠÖ" …âèѣÆ 7n\rrrƒc´ ‹€÷yÂŽò"„(/B8Ay®4û9šššš~ø!,,ì?þhdS´;GÃó¼aGy”!œ ¼Wšw-²gÏž°°°¬¬,m‹Åâ—_~Y¢T*•H$½{÷ŽˆˆhÖm&ÍŠò"„(/B8Ay®4ïZÄÕÕµcÇŽÚ¯EnݺÅ>F"‘hêGC¡eÔ¡~4BGýh'¨¾Wšw-Ò§OŸ$''¯ZµêâÅ‹lŠTúÛo¿U«¨ªªª©©QÞ®®®¶¶¶Þ·o_ƒýhˆ P?ÂÔ†p‚ò"\1Ä5½üé§ŸNŸ>½råÊÔÔT›"•2-ëØS^D¸(/Bø€ò"„”áŠá®é:tè©S§bcc{õêÕà-¯£=zt¿~ý8Ý4b8îîîNNNÆÞЦJOOüø±±·‚èÏÉÉÉÞÞÞïXTTDEZ;;;úµr õED"‘Ϲs碣£]\\ÔžÕr-BõEê‹>0|}‘sçÎÍœ9s×®]t»%Ý~å•W¨¾'ŒÐF,?þÒ¥KQQQª'e¨¾È³€ê‹>0|}ssóž={2—]Ðísû½÷ÞëÖ­›!ÿ!µTFîÓ[QQvûöí=zh³È8wƒ¦¨´´´šš¡Ÿ¦±±±1ö&&ÉÏÏ—Ëå>MCȳF0}zMMMSSSW¯^íèè¨ÍÊ‹ZËÈ‹œ>}zæÌ™L‚õÒ¥Kt[p·™ÒÍú„¢= €>}úŒ5JÓˆõë×;::¾óÎ;Í·R©ôµ×^{çw´iIsæÌ™°°°ŠŠŠž={ž8qbݺut[@·.\hbbâêêÚ|ÿœ 55µuëÖNNNÏ=÷\qqqYYÝÜmm®Ú#„4ÅÚµkÙŒeË–§Ooƒ´¬/‹{öìimmýðáC º-¬Ûƒ êÚµksÿ[jnÞÞÞÊÛݺuSž0¦ÛºMá #çE!„Ò" &/B!„g­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­EiF¾¾¾õŒŠŠZ´hÑäÉ“ ¿=ZZ¶lٻᆱßÜw¹¥âÿ¯’A{a³bÅ ™L–œœÂGŽi€ÍÐOZZÚÁƒÃÃÙ»¹¹¹üqÓ_V]ÖdÚ´iׯ_WþxW­ZåäääææÖèDn†þ– !MDk"H«W¯¾råJÏž=kjjîܹ3kÖ¬¾}ûX¹rå7úö훞žnkk[YYÙ·oßÿûß̬5kÖüúë¯{÷î-,,ܰaÃÿþ÷¿ØØXæ©eË–]¾|YùwРA>>>:mÒÑ£G½¼¼‚ƒƒ™»6l¸}ûvnn®ò-´Á²•••_}õÕÝ»wÈårooo///æ©’’’ÜÜÜE‹}ûí·æææÌƒìïµcÇŽ%K–(ïvìØ‘9(¨©©Y¹rå£Gîß¿?gΜ^xAùTtttVV–B¡xüøñÔ©S_}õÕFwYÓïK'sçÎ]¶l™r#5mû¯RÓ,-©ý–Ùíß¿ÿÂ… fffeeeƒ zçw•––.Y²¤gÏžþüóÏåË—[YY}óÍ7:m !- ­Eˆ }öÙg'Nœ9sfçÎ+**æÎË|¶-Y²døðá666›6mbFFGG'&&2ŸF .d¾Ñ:::®^½ZõÐúÒ¥K‹‹‹õ8ú’——ǼNVV–———³³3óøìÙ³¡ûÑ{–͈ŒŒôóósrrbînÚ´éÊ•+ÿú׿”ïâëë»{÷îµkךššjó^ÕÕÕ­[·V}ÄÕÕUy;;;;((¨gÏžóçÏÿꫯ”OMŸ>¹¡P(fÏž­ü8gÙeM¿/XXXTVV6ºì¿JM³Øiú-³HLL¼ÿ¾ò°ÓÖ­[:4f̘ÿþ÷¿`"zöìÙ¿ÿñãÇk³„´T´!BÕµk×Î;055µ²²R}< @ywúôéŸ|ò‰®9´÷üóÏ3{Ì餿óÓO?1EUUUfffÌZD¹%:…$jjjXžuqqa>/MMM%‰êûnݺ5;;ÛÄÄD,jùvš~_:‹ÅMÙ ½7^ßò©S§” 3f̘3gΘ1cžþù¼¼<Ÿ}ö™H$ZµjUAAAÇŽµ|YBZ$Z‹–F¡P¨=Âþ¡Ë•+V4ëë;88°¶Ñòpˆ’‰‰ÉƒìììtšµjÕª·ß~ûý÷ßgî29!—ËÍÌÌš²Mßx®~Ë2™ìñãÇR©´´´T¹À"ä™Eÿ–¦°°0&&Fywë֭Æ SÞ­ªªbnäææ2_O•JKK ³ja§i3úôé³k×.ßèã?þïÿ«ŒyÞ½{7  ¨¨ˆ}Ö½{÷”cþüóOµŸa³Z»víĉµÙ M?CCnü›o¾ùí·ß*ïnÛ¶íÍ7ßdnwêÔéË/¿|÷Ýwýüü6lØàèèØ|›Aˆ ˆmÙ²EÓˆöíÛ{xxìٳǀ[EH-ÕkzE"Ñ”)S˜kz—-[vêÔ©>úh„ ÿýwPP§§çâÅ‹,Z´¨gÏžW¯^µ´´,//8p êÉøøøøääd ‹V­Z¥¦¦¾øâ‹óæÍ³¶¶pâĉƒÚØØ˜ššZ[[ûûû;88°oÞÊ•+92xð`‘H4oÞ<Õc _|ñEyy¹òjd+++e‚å)–ÍP([¶lIKKkݺu«V­Þxã æ¢’¥K—VTT(_pòäɽzõÒæÇ›••eff¦P(¤Réœ9sÚ¶m«Ü¯O?ýtüøñßÿ}xxøˆ#˜ ëÏ?ÿüÝwßYXXÈår›Ÿþùå—_ž7ož­­-Ë~±ü¾X¨^Ó+—ËG5dÈæ)–Í`ù²Ïâö· !!!99ÙÜܼ¼¼|À€LvÀÕ«WçÍ›wöìYÇÿâ‹/˜é„´0¶¶¶ì †H$¢µii s0!„vÚ¯Eè !„BŒ‰Ö"¤EY¶lÙ… æÏŸâÄ co !„­Ðu4¤EYºtéÒ¥K½„Bt@ÇE!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„“V½ñ’’’ÜÜÜš{S!„ò j|-âééYTTd€M!„BHKòÒK/i3¬ñµÈwß}×ä!„BiåE!„bL´!„Bˆ1ÑZ„B!ÆDkB!„­E!„bL´!„Bˆ1ÑZ„B!ÆDkB!„B!„<«þ*ßsÌ»9¡GIEND®B`‚mod_perl-2.0.9/docs/user/handlers/out.gif0000644€ÿÿÿÿ00010010000012623011727205031020505 0ustar ????????NoneGIF87aü%÷±±±¯¯¯­­­«««©©©§§§¥¥¥£££¡¡¡ŸŸŸ›››™™™———•••“““‘‘‘‹‹‹‰‰‰‡‡‡………ƒƒƒ}}}{{{yyywwwuuusssqqqooommmkkkiiigggeeecccaaa___]]][[[YYYWWWUUUSSSQQQOOOMMMþþþKKKüüüIIIúúúGGGøøøEEEöööCCCôôôAAAòòò???ððð===îîî;;;ììì999êêê777èèè555æææ333äää111âââ///ààà---ÞÞÞ+++ÜÜÜ)))ÚÚÚ'''ØØØ%%%ÖÖÖ###ÔÔÔ!!!ÒÒÒÐÐÐÎÎÎÌÌÌÊÊÊÈÈÈÆÆÆÄÄÄÂÂÂÀÀÀ ¾¾¾ ¼¼¼ ººº¸¸¸¶¶¶´´´²²²°°°®®®¬¬¬ªªª¨¨¨¦¦¦¤¤¤¢¢¢   žžžœœœššš˜˜˜–––”””’’’ŽŽŽŒŒŒŠŠŠˆˆˆ†††„„„‚‚‚€€€~~~|||zzzxxxvvvtttrrrpppnnnllljjjhhhfffdddbbb```^^^\\\ZZZXXXVVVTTTRRRPPPNNNÿÿÿLLLýýýJJJûûûHHHùùùFFF÷÷÷DDDõõõBBBóóó@@@ñññ>>>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,ü%þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤IŒ³Rª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´iON£JJµªÕ«X³jÝʵ«×¯:¡‚K¶¬Ù³hÓª]˶íR±nãÊK·®Ý»xó^…«·¯ß¿€ LØ(߈+^̸±cª‡KžL¹²åË~#³=ɹ³çÏ C‹Mº´éÓ(k^ Œë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹sÜ«ñFOÛú¹õëØ³kßν»÷ïàÃþ‹/>Ýnù³ÕÇ«_Ͼ½û÷ðãËŸû<]ûeÓÓßÏ¿¿ÿÿ( røÉUàXú ¨à‚ 6èàƒw [~•à ø ¾Dèᇠ†8`…›Ý'[®¬À)¬ˆ§Jm4g [¬ÀFs,ˆ¨ãŽ<ö艬™› 9º¦Çâ½ð’Îéã“PF)eo@ªUåV ² l¼FÉ ,ÀPÉk¤$± º$@¦™hªé£´Ð,À «´ÀJ+®¡° €Fò(Îöe˜cºVæ™iêÆ$lpÊI§k'xc¥_\ F¤sÖ ›“S†*ê¨>^‰–©Y%Øm‘tðZþ¼Ä>`”#l³Öz«k¢àñÚˆ¸¯±QÃkʪk­¾«k¹Úê¨l½þ,©ÈáÚØ †wð¡˜`AôñL@a˜ýHþš×Ìæ6»ùÍp޳œçLç:ÛùÎxv³‘\ÀÀnƵQ6-,wh6 É. {ãD¾¥–ÀJ[úҘδ¦7ÍéN{úÓ µ¨G}iìùªÚô3kh¾2!î vbƒA‡´ ¬Àë^ûú×À¶°‡MìbûØÈN¶²}mê.òy?LþI´eâäù@¹Õ%ÕÃ`! è! ?X+--°ëe›ûÜèN·ºÕÝl.>›>Ó~ zc©^lOõiÀPlpzu–ä^·ÀNð‚'»Ý[|÷|â͆¿¤Úò¹¶½­y X F;"ðrüã 9ºþ®E…LÕVbõÄKZƒô)ÓÃuSp‘Ûüæ8ÿ5ÉŒj…¢œ:*_yA/àŒ]( k¸Í=žó¦;à;7y|–yƒ³ÞB?í’Á”~#¨¬ùÓÇNvsG½ç+ýù©‚žõjæ ?©AMb°3½ìxÏ{°ÏîHÀP½%ÄÛ.L7”á*‰A+2 ´4„K@Ñ-¸Ã§»Þ7¿y¾{r™ „Ðà ËOxb%|ðÃJüÀž˜À%ÊDæïÎy_ CííyeúÝêÅ:éù„v¬Ä ˜…(B0‹F€A%…P°•PB±hI'¦þ ‚î @%—Åì‡-ŽÜjH· àA_‡a ø†îžäþý‰ÿü9¿þö÷« ÷Jl7|Ääǰ@À ³p ¯· DÐ4€ ,!.ñz-AÄ0~Â& º.Às€ éæ¹çkÀ ð«Y@p$('˜‚+Ø‚µ÷‚Vð©€Z%zÂG€Ã„ü@,1 ãð@$ · $  pX.o` ;p´ 1ð .À « ¨p¥@ # à Àš—` 0  FÈ ˆp…@‚ÿÀù`tn°h`ãþÝ XP @{¾fƒf`XàäÐWྦ_€{gÐ¼Æ ñ¢Àkõ`—íÀkŠ {𱽆Ęx½†Ÿ@ü±P‚§˜Š«ØŠVðб8‹½v –Øg0@·‡ŠV`%ˆŒ²H‹½Æ‰žŠV ŠáΆv€¥ƒ‚5€>ˆKH >0„—0 N€ ¤ ð*a*A-«¨Q­@l6ø 0VÀ @ )P`¼°)ð q@ ¼V 9¬`¥0¦ˆŠí` ðÀVðP)e¼ÖhAØ þÛÀk, )º7Œ!9’%y’)¹’¼–p©  1õGŒ‘r`’(ù *É’V‘I‘i©‘&Jçnä˜Zj‡蘎µ¤M0ÛÀ#p )aó˜)P )¶…-ÁrÉpyÜÐ   Б0”`€ ° à Ÿ¢@ù„© "­ð° 3` 9À ?ÄpÊÐO U€ [Ðà0ækàøÀ é0°À`ñð§ÀkÙ@ ì VP0Y‚Ðk6èk§(ô°¡&05›Ðkzð¥þ V p¼†? ŒñœÑ9&P× þÀ¼¦K@$˜ŠVð‚Ü Ôi¼FœÆ‰œÊY‚8èsæøg@Õ0 P`”þÜ@š$£¿¶œ¼–¼v ¸@3™– ù°¼Ð“x¦óðkÃXäðÂù]ð ÁÆU°Û‰º€½V“9‰Š *ªV@ª¦úkŒZŠ”¸ej¼–¥r€«ÁF©–Š©šú¦Ð©qZŽ¿ÇLuj§¶DFyV ä`M¯Àÿ0 Ï€ zꙄ¨½¸ ‘€½VÀ€ SžÀkŸ(° â¹*C‰ 7à*™ \`€ Š0ÑÈ*@ qà¦æ ¨€ Bº `Âи€Æ +`[°›° Û°Ëk3C¯‘þŠ=E€{ °äÀ°ë¦õJ ÷š¯ûÚ¯ j^Ùwñw,xð1zÒšIÍÐÐ: À B¸Lã0S EÑ ŠÎ€˜d®¼†à`ÐkZc ØP½6êà¤ô ~àkÀüÀ §Àà ò~±ð9`@ ú€]ð Àj„°þpY -ø (þ€‘ëñ·V¸ƒ[¸‡›¸‹«¢üP²`¦ @W»ºˆ«¸¼·rK·v‹·0Z0´Ÿ÷¬¡÷ J»´–dAê \ä °¹pš0 n°[„äþ9i•$¶»ÇyÃhsÍ –sšrÑJ¼¨ô `åÐET‡µ´ ½îÖp—Ľ݋wt0 ¾Ê«!¾Ç–é2–æ‹I=Ú]ÙEdPp: GÐ Z„qÅEõЗ`Iú»¿dw š â¾§F´™|„ÕƒœI~° a” YàÁ@Vð5vZtïàEþ Ûëˆ\Ä'ÀåEÀùaÀ+ýÓ@ÔB=ÔD­ÓØ €À+€%mÒ†t _`¤dð`Fð´JÀÔ”$uða´7ÁÕ*´ï1¼X G! § ­IVPwe„¯«_cHZý^]s= `íbýÖl${àv`Lóðú€z ×_9À#½vK]Øu¨`J‹0Íg¤rÌØ†×îQ×3Q×wÝymÙf”eûÇ¥¤ €FTð€ =H˜ÝšMmkLbÝÜÚkdy §d½‹F’àpÕ¶R‡Ä‰-–‹=Ül¤.Z ÕdÖþ ÜuôÚìÛ1ÁÙMÝaô -zÏ¥4¬FûqµÜÍHŽÈÇ]ÀÉÞfT PO¦” ¶F¾¶ßodÝëÝ0¡ÝïÍßb´ úàn€JåÞi¤)-nôÞ0á^á~ážá¾áÞáþá â~Ô9˜Ô;ÈÍ®F«®pP0=%HxPã6~ã8žã:¾ã<Þã>þã@äB>ä7ÒÐFвÝ)NüÀáJ¦ÐÛkdü°OH€ ½åÅfäð†ä^ÑÙìñÙð«JD@”¼Ff.ãZÎåpl^¾p`®=JÎßbPåÛJþÇoÄäüáu”åq^èMâjâç8à)ÞE© ‘(Õ `Ñ€Dè†^ès~rí½ÄŒÞèZ¤yð•J‰ p”þ×Péo~épžéSWç\!æëAæÔϲ0K§P q”² Àê®ç°¾Õ²Ž%wÎÝϳ„ñG÷ô@®ƒÞêÁÐÃ.×ÅN?ÇNÝ–EPUG`G–~íØŽèrªèŠâžFFð~†0KPÀs„`ÎMGçŽî֜홽í©ÒíÃ}ú¼ï©DQ0Gŧÿ6Gýî©q¤þ^vÛß?oÛ¼>KÏ€tôíÀPþíÃvŠ/€‚.€‚_ñcwñ×ñëÒénPk>UL`püní_/H‚´øº ΰIV`‹¸xºhyê ôÀÎ0¦Û؉ð‰.?l0ÿß2@Ú¦ˆuJ§0ÓqDÙ1z°|Ð~ð`Ï 0@P`p€ˆ¥Þ ©0l‚€µ/ðÀ’”à«p/@Ðé’0)“V°âü@ *€i œS‘Y‘]/l_¯þp³-cµMàW NKY0ûsä±Ʀ¨ ŸÛÙgе[‚ÃYœ¥pœÉyúr®îÎþªÍÁë ¶Ú‘¶:LGΠÏI€ G` E@ ÂA ?à =À ;  9€ 7` 5@ 30² ±0†l¤¿¸o+¥8y¦!ÇŠ•Gê ´‚Âü< „QâDŠ-^ĈÀ0ŽÍtRäH’%MžD™ReJ³\¾„SæLš5mÞijeNž=}â°RèP¢EM²zÐQéR¦M>…UêTªU­^ź4 €GY½~;µ€#a•^@…Ñ „ȮʾmØZYÛöíÀ|–²å[Ä«™Œ… F|qãÒF?†rçOÊ•-Ïœ|Yóf—A#þ©YÒ¥MŸF= zLR¿6ÔkXyþ˜)Öb¹9°Â€ðÓ-Lˆ"lÅœ8T¸®zä €ª|`dø0ðb(V‰‹ó-ñxòå).VÚ8ôzö™9¿‡Ó}|ú7=³Çÿy4lþýýÿF„é, R`+„ÜÒªè=„Ä€= ˆ-ü¹# †²€?>Ñ㎚@~XÆó^„11ô<)?›¯>)ËqGg¹ïF!…Ú@#D2ªbÖ$¿rb›Ô¤ bÌ)†4Ýbä²K/¿„hFŽÔ²L”zü1MšÐT3¾ Í„s¤"Ÿ¤þ³ÎÿÀ;÷ìˆQˆð´dLCET#¦ÈŒ³Q6Û„ôQH7{³Q8çä3SM½z6j (R+aÐh…ÐDWeuU1‡aÔR3%ôGZk­¬RY‡ÄT_eª™:þðX§°p§?2þÀǵ°¶l5Zia|5Ö]…¼×ú²Õ¶']¯µ±WcÇÝ”’ —)"pCmœh8‚dEmÌ‚vZ{ï-¬ÚÁ’Ûnßó÷_ûø5SÜt¦(@Ø?T.áh›?˜ƒÞBñÅ8ãˆô%¸_k øã5;æ5©†O~RŠ<úÀeL>̓u:ÚŠŸwÁªWcñå˜dCþ™Ç 9ûÖgý`F9i ˆ¤w0À¿HjäÙ‹wÆZÚžnoh5öº3®ó3Xi³OÓ€H’&B ÔðG©jú «³Æ[ëE÷4°Ã pËŠîÛ¨²ÏF¬hú`e"^£…‘¥€i蜯Î;s0·.<²¿¯éó¡ ï|¨ÃGý*s‰IÚ'R« e¥`H‘ŽŠ¤«ª.ˆÃß>xá‡'¾xãG>yå—gxÎKÇtEštèU:=uí¥’…¬¤˜ÀgÄ…ˆ{JA€Q¬¢ ÷߇?~ùç§¿~ûïÇ?ý÷ç_þ½¯‡ õ¤'ŸúÄzoËÏ291-hØäRÎf;€LÇ+ZåÃ’]UzühVG$ÒoUa¥é#koúÀœ~"b–&CÕÀJ€c¹Õ­~õ¤£Ikø0;'™à¦qšT4ÄYI „!Ãò ZdÅê+öEBDŒ\ƒÐêÏašœÞ¶þTDOàG² Žk Dð ñ“íåK°ßò±õ´A¨ fƒ‡ö4ˆs…Û"ôý¬†ˆ ÞêÀ xl¼Ý)GÔÁ_0$ÝyÑw»,â{«åbó­N %” PZ3œVšGh»*Óð‡>äK•UWd-X¨|}¸Â!â¡c棨÷[ò²–xX  ÔE`ŲanTè¢È×Ã~…±ä ‘€3ö„tX¡éO:B"¡ ~  Ç@=¼!]/ϾYþòÀ½ÚדöÌÍbLw€Š ­†<àmþ€V):EÖÂŒ:ÈAÒ¸ (ì„`CÛ°‚ÖXPîVDÆ‘—À#V831RÐC }pÆ$âñ 6 ¤¾a… Jqväsgùh¾(Aœ?ÜáäX„dO{Ûã~‹NAR +<àUHÁ+äQ†ã“GòÛu6¢¡¼ËƒžÌÓ<°¨`³Y‡3‹px2¯‹Z &°0H‡yè‡A@„F𠱈µ`€?¸}¸€»°=ø€R€€ƒX‹ß³\‡µƒA´‚=:…Èb`”w`ˆ+à>¼ÀÁüƒ´‚üÁ(hø¸\Á|Ao¸þ.ˆën€ðB*Û„ÈS¹<ã7Ê“¨ ¸´éø(³)ˆá“÷#cx‚,vXˆôJ¯3¸ˆ¼èˆ”›º¡̇¨¾l7sá„ E\B-ȆàrPD9„pDH”D‚;ˆˆA¬à‡@ˆ¸‹ÆªÃ@3´4Œ95´“¶)¥™„}(R:¬P´4ÐCÇjrÐh8‚˜Wˆ…1èC¶`¸@9¹  »h‹µÈ€h…<ÀBFDˆ|(7\ Ü ‚+°ÁK€u¸Áy€pG+¸rÄ=P„ „ Æº¸ oÀ†nˆþ¸‹/è‚tƒ‘ÿk­¤Z /´Å«ˆȃѳ¨t°P‚=ð 5,°°§H½‰`d„úóPæp9{#ä‡ð W´ÞÀ¾à*T˜ð„Øø|ø‚‹Ã¤#@…pWÄIäIí ã@ŽXŽæxŽGx?oPf`x?r` †8xÿCI+CYÄ …Ü.†lȪøp†³Q‚õ2 /ˆ"°Ø¢~P5c›ˆ +(† áªË#Œx˜ƒЂpA+Ђ}À† @[¨‚+؃:Ð…ûvàn8…ê«ÌþËÌÌ © É éɽ-àrH½ }À‡.xQ4KXéEèÔZb-ÖûT UÂÒZlÖ×È¥8ÈŠ ÔR@T¥Ö¥þØ×jíˆ8Ϫ„A ‹u@¯(i0$"˜P85åÑtÕ¯ue¦v} eÕ f×ÒP†¬Ö~íV~Å R(ø¡'¡‘ ®¤Qˆ•XcNµØÎUX*U#­¥oUÕZ%Ù¦Y–­ŠPøÅ¯‚¯‰ìˆ‘”„©X‡>­¨•Ú©¥Úª­Ú;8ÖɳXŒ8xÝØÓ8…èYŸÕW§Ú¯˜†9hÏ«@CË <ئÀW©0)ÀÛ¼ÕÛ½åÛ¾õÛ¿ÜÀÜÁ%ÜÂ5ܽýÈ•‹ÅšåÚ‹ÕØ¯ a@U¬ø>õSk(0à8XÔ>íÎ5TÏG-þRÈ#öÁ³„²ðŠs °¥Ö³„ÜÒèNj\ºYUÊYMl'àÖÒ`1Sš]Ô¨]ºÝgË]HÚ]ò|fqÛ¤Y€Ó«DP€¦0Û¸¶â%㽞䭼–#ÀÒiÞ㜇 E[@„°€`óŠ ¸Þ¦x¢ÏãÞîÑŠeÜåU¤ò}ËE€ð9B°`ΊkÐQŽ ²ø­_³ð^èßY|×…”¹~ N˜?‹j„ªÉŠRs Q€l… B…6áFáVáfává†á–áFáN˜Y Íß nË ¶à¦pˆ1³ ‡ ¨"‰§PEvŠŠ Ipþâ'†â(–â)¦â*¶â+Æâ,Öâ-æâ'>…¬]Ü­Õß3â߆Lª—U¸mc¯@ƒ$}Šðž%Æœ˜Í/Š…§š5!.Nîá¥`hU1°K¯¸øŠ¢]ŠotŠœ±ã;ãàÌañ}Ü?Ž &€<ˆÞdB„È &¨0}øƒIu HŽäÌÁc‡ÒãäßÎ)c5dˆÛ³1AF@´¨èP:^ekå—zå1v#?Æäa0€LBy°±¯PÎ G(©(¹æažØI¦ÙJþ·X.œY>ÀøTN³1‚ þŠQà„þè¨IØfnÖœbvªcæcþUfL&íЄ(3#àÀêV̉C…Ë€U<˜Pà'ÄP¬çÛäX¨ ÇÈŽJ¬ió¦ÄEÀ†ñäi¦ ˜ B‡-jô(Ò¤J“˜åô)Ô¨R§R­jõ*Ö¨M³ríþê+€¥bÇ’-k”Õƒžjײmëö-ܸrçÒ­k÷îÚ+Üàíë÷ïÜbÅîB‰SínªÀ½€ §Ä/tqÐ@žVQÓ‡¯Ë+; mñw'Ëä,V¾¡Hãj¤8{-ÚŠ¸É“÷F·;0I›F @unݼNPÇ=`~ÒþZ`òݽ!s¯©síO³âÇ“ºõ+úôê§ž_ïþ½Ó°åçÓOŠ0þüú÷ówÛý —¢üeE_h˜r×5o¸À=Ö…Zx!†j¸a…ß©^}!ŠØ|%š‰'ªx•|"º8ß}Ê8#üá?þFÔHã¥üƒ;òÔŒ"ÇøÓÇ`n9Æ!“M:ù$”Ýy؈/ZiVŠ+j‰^–[z9K‹WŠ)VŒBšy&šÚL`.Ô(…äI¦Ð’Nª¡"µ"€!à^;z‚ ñb8]JàKIR–%þ¥\4j¹VJT0P2¨;ÃØÁŸPœ" '°eæ ¼<ƒ«‹(2:—f0.*Ô.•(HMá[s¥T¢6U­ñÀQE Þ… °K;ÊðǸt€ŽoÂáBL¯±Ž},d#+YYt‚„mM”Aßׯ]V™v­âƒ¬C'ðµFÙ@€]öᬷ`ñdË€!‰ÙÒ¶¶¶½-ns«ÛÝò¶·¾ý-pƒKÛSXo 5if5›\«Ì•¥uýl±îfÄ)è‹0öt)g „3xU†¸ãºu¹ëÙ¬­š[ÒçBX@b¨ à k(m\ ÀOº Áþ} 1høÝð8[ã%¯PÐûEóvÁEao{;eà®Çðn]fº( ¸n)ˆMa{­“XPv°‚Öâq9˜(Žð¥İø•‘8YžÂe_ p‰ƒü§#xÅ e0{ZÜRWÎh `ÁÊÅkøê\ža—sèH.®@€,ä1;‰Èä5òÌм%õ.ôÅLnS$@Qò™Áxycê2nÎ¥ ¨•Ë*p·¶¤ŠÌ†f’™«f„-zEl&¨›ßŒ¦JàhN]²Ñ*»E Aà4[N€Qzć>µ…ÝÙF‹‹Õ'zt2#-i3npäþ#–ë‚éºÜX?j»€˜Q-lî¨ú²®þ’¥ë`ÊzÖ;Ú@CY(‚0ôˆh\Œ€ºÀÁvt 4ìa“Û;j[ÞdCNÉAi¶³iäT¶|©`Ã]ìЃº €u‰…%êâ t`Üå.w±ÓÍnF-ü)Ë–$¼ã-#P`ï úEŒ“.>ãa©-Ý,àà%NøRÕí(•kÖÝïvéŃ5`¢|Ñ^Ñëüã.@C^! œ‚ÈÉIŒr¢²|\ Ë™ ó˜ÿê×å+ľí"†4ìœ-Šàs\´Ð†.Ó‚ëÉ1˜ ,t㦆þÌ?°~ A"Z…9úmÈ@ wÏûÞûnE@coˆE—Gœêû1ö[¹TÍ.ùâ[¬Ñº0õp™>æ‡?èF7ª¸ ì¡}tB"1€o ‚hä÷Aþð­ð€?T!¯GÂ!@` Î1¦_ýëgŸò997[­y°hþá‹ì¼çó#jRÇ»™èº<ïbÚ€w;Îð†Xˆ wè»/t@Èàø-XŽ‚Z7Àƒ <` À&D!LW)H@"Z j ÷ ø¹æyÉþ²çM]úY *À”üW`¤€‚XÑÅ?PÚ @àW¡u‡ÏÔ^XÁ"À>ÜÄ¡M<ý©€D FÔL„N?Dá.K•`”_Ô¡_ þE €$”Oh×\àÍ…p¶½Å2¨C:Ø´'À ‰X…\8„Áš<À€PŸÜ„ ÞÄtÁ7àD>XB6äÃ"ðB(Ä"6â#Fâ a^Þø©ÐÓ™_yáöE*€ø›]ØûÅ"Ä×\dƒ´mY¤*\MˆBõmD$tÁ`€(CèÂ)¤‚K(0 #1ƤÄJ´ÄþK€„H„I$bHŒDIœÄ%baIi¡£qá †â¯Œb)Æ(V¤Ä®EBÆoÀX3LFX¬‚:ôÁLÁ%D=Þc>îãft†uÜFsŠ7º(‚£]ˆ#ù¬ÃÆÔE4hœ\](ÀÕ0ÔE¬ÓÅ „žÒ¼¸Æ…"X±íŽîZ4409q.\d¦ ä± w‹Ø*¿or\ \½EL1l˜~„¸Z¯f›_hÁAwe2Nl2û†g ³Û ›P ÃåüYE‰ºÅþ8ñZ’ºE%”å] P& ÄÈMFÉYˆ ÀÔ Ô²-Û.wr~² ‡²(¿#À+ð "¼*\@Ã>ÀÅFé‡Ì˜ƒçà,À"L³Ñ!…8™ÔĦÖÃ7ƒ³ç2~îr²õrøü²T¾òL Ôœ\$€$plÞú…ð¯…ÞDÜÍ]ÝYÁ\BßÀd47ÔÞˆÂfÀ ¬>,A?Háâ bù=ðƒ3h†J†sâŽq»¥×.!ÒÎAÕf F¿EÜÈx4^œQ`A6htÃ7€Œ(¤@…äÞîõžäK#4#äþt%À5+˜@) ÀLÿA¨;”A6(ó9ôI_ ñ-¨:¤Á_7¤Q7ð“1³-µã~˜Ã!V³E @C~ÁàþÆömÄ™|;Ù<̶kÓ÷!&¢Mè·7_bcû1­òæ-í€ÇE@ÇK3ÜC~(·Å l[°BŒâÅ#¤C:7P8wàâè"/úâ{õ@ Áe@‚@Üë Â ¸ƒ ´ê*ä4„$¤J°„KÀÄ—©B>€ Àµpõc'õ`J¶ã"`eé‚¿Å ³:‘ê+]¤ÃõÙÙ4·ã;Æ#Ì£h€:ü=è İ?pÃ)°ÁoüÁ'|í1zu؆lú'èAè‚›÷·›¯8dCœœ£­,8kĘBµÀÐC·Å,+”Aï ¡þéøsB³JŠó(€#DgDKåaÊq¼HÃÞº#ÓÅ(\@@­ &Ñ™y±§o›;6«Ãyy¾:ØjÂvFÌ6PrO8²ZAð,vKíZDƒ;œ ^”@$Érâ$±‡» ;ì&;ƒ-{ä4ûLÞ±+X‘4.[Ø3ÀE ðx[Äs_‚E-C³:¸:¾À· Á³°Á›Â'ŽÂ[ä{QQ¼€uºÅ2´AϽöö¼Á2¯ü¯åÚ €cŽtÈû¸«8¥²øÉ“MʃãwÄ43°¾…ð<[œC:½…Hhß’7,ðK÷6¸}¶Œü™9´² ø‹÷äÞþÄ(Áª²…X|OL F5ð]L´ó„itkgÏŸA‡ŽªÀ Ñ CL`º •ÖTˆ–^[³nªbJ”~p›àtoß¿/5¬™xqÉ•‘'wy\yóš—‹GÇÌ9xuë×§Ö{Ô¼³FóÕ”HlISË3Uå–Nw÷ïá.>QæÎñ7¾ŸŸÿþ,èõŠºø,´k˜ÃÀ¤ˆÀm©M˜PŠ’–¢ÀÁ¤Ž¡Š n’a ·¨XPÄ©š/ÀKÚ¯¿eR‘EåþCQÆ$ÑÆ ¢€ILo©lÞ0B)*ÎQJŽ2:Lʈ'Ô˜ª z' ñã(¤ ¹ìR>f s±ɤÉÅ2)‹QLkôÒÍø¶ ÏÁfµJ”ò1)3YJbô|*C‚œÐÑ-·þàŽPà$ÌxSR÷L\óÄ3ÑìÓLSÓRÛœTÔ਀BÈA+RÙJȨ9$©(ƒn =ôPYGíÕ·J?­oSN–Ø<þ VºP}mö3oðGe0–W7"‚r”*E¥.¨F*'ÚH')<@ç–r¹æ H[œ­÷3`•ÎØc‘Û—ßçò=‘Y{ †Êˆ;ÜrGŒÅ]ê.–jF)(à±B);Î@K*‹•Ê€@`òCK/ .Y*|ÖÌß![™åÈRõ(“ivЏÉj$^™|–²¢¥ð`ª›¥ ø'ªbRp‚© J{ÉpX«æ«•B9fÅ\~¹§®½n)Ù­ëš­2Ea >q–êš8œF Š ‘â8*‚À6©kôᇠ—t‹Âo‚¹HñÅoÜñÇe) L²þ‰;ì›,{lÊ3ûl“ Y¶‘LÜT" ·‡©Ç¥6XE)+Ö˜Fªfô^j,h)~úhO© €‘Äøã‘O^ùå™oÞùç¡^úé©?É9¯ürM·lóì…òüs‚“±çdX ä>¦%Љb–ÀªVˆ4©FˆJ ¥Ÿ"€-h0‹Z &x*¬@. tà!A N‚´àx½h |AÉ\÷ZBýt03â_½ø€)¸DP$°‚¥,à I9Ç<¬Ó n<Â`e€fádì€4⑘D%*Qƒá QòAâdŠ<ùþ73³^­…Kj±;žÅçV“Š < ¤U°®2ø TŠÑ©èFL€`SÄ%î‘}ô#›8'b1EU„‘!urEBE‹[¤™1>ö’µ m7ÚÆ”R0$¥CP ŽÀº¤ B”Kƒ?ð±;\8åüã+aK$’#“[¤Ù¯\úä–D1¡#GÅ}ôa0¡C¢P÷žwˆ²±˜ ä ”dŒ*XÃ5¨·Øã¬t¥,ÁNqf{½Äå.'#E–)Òœù%0'%,%ÅØGlÁŽC±Ï=L¸Ãá‚…¤ € IŸR 7ø!+p þ\¼9N‰Nô´üR;¢NCj”_ìlç;áù¦P«ÐF¢µ†l ÃŽŽ'Öa=ÛÈÞ‘:¬!BN1‚@µEUK5êQ1hÑAb”£Sl*±:à*âã<©0j#Ê<bh!O/n´‚ ¤ Þ´ÿ@pü»SJ°9„ ðßcHêF6 ¶Â (À)¶!> ÐâàÚ§¿B0hWëÑÄ“#;hY°;¦áðúÜcìg#@x)¡ 6N€<¸>cò òàÞ…° éö, ÉD+C Á‡ ›;v »C6*~`²e ´l#€ß˜bN:ã¢i ì²`*Ï )ñˆ°´èPåØÎ³þóÐ:X*>‚öη(+D!P¤À)a µâÀ¡HÂNO·¯yѺàÐäØÎ'6ÑíÀÀ?18ªæFÄ2a#¤°)a•˜Â֠爠·d @{ñèï*W„[†ñC †è= 7âÂÁ̸ÁâZ)b à˜âø`+¢!!).Ì?ÁQ™*ŸcÝ.Õ±7ˆÀ`»# Æ)ÌÀN6TC*Œà;cRà bà dŽ &!)Q!ÛÉyÏ!Õ "#ò4n¬(Ž6btÒ# oÐàšÂþ*P+ÞaÄ”Bˆj€*ZÒ%Û&ÍI&óƒ*Gè!¡ï&¹±TADd` ‚ ðk ú) ‡˜B†K*èD2)V¡jœr¡2¥²—¬²Xh’ÜlR+Aãf2;d6 ^q @6 Þ@)‚JI VR)šá˜ZpHr8³3=ó3â.o)/Qp/9­/ýÒ3Œ ç®Ã€¦)À6"þp ¤ï‚ ÀÁ²‚H 6—æäAç”B.#9•s9™³9óÓŽ!ÍÄ4- 5S³3v ;,á0bºq*N¡˜ :A+a °‰)Tåþ:%e©bR:ùŠ:›Ì:á3+K† ¤€ À Bšd ˆ dQ¸´"ʃ²’‚àòóMäs*é3„Ð9?'T*ä@ü° !²ü޾ 3âØA@ÂÌ!+¾Žë)|(à:”K*//42ì“Á8ôFŸ¢(’EcT`#\j²@a#’AÂRM)`@§‚ K#  &H»#GGsGa‚4‘³’K d%à:ôà? âÈp)ÄÌØE³E+AØ¢-”ÑLmÄKIL“°G½ëGùt) Ž>”ÁF™ôR¡0—Êr*þøþ*d- uDü”U—2”L;uA¾a¨¬Cts|IJo ‚à‡!ðT ØÀÔ)’H› tähJUD>‹Bµ»jÄê`Y™µYõY¡5Z¥uZ©µZ­õZ±5[›5´"áÞò7šáLrÄ€¨€[B ‰ )Ĭ)”àö*Dæ ‚ÕSí Át9Žuµj$. v` ¶` ö`6ava¶aöa!V`GA³‚ ª ˆ’ fà'‡aU'Á$•àXg„aK‡ad!W›B`îUXó5:÷Ulúµ´þuê²A€b©Bv>þ|¡ù<¡"°!=Æ)j£âàgi¡"ýÀ*+4±6kµVqÎÓ‰föÿjÖfG+ "tvgݰgµ¢+þ€0C„3)”!S‡á` LbC*à ŠF€žQ‹§z ÷p7q7qOÁÔ¼ÖíŠ5Mnö®rmÓÖg©bwÎ8ba B00¸˜Æ1Ñ+*ÄÀÖ "g+žÒrkoW¾–ÃÖ2&£*vƒPmµâÀx!8Ám‡! a ¨RÁ ‡Áï¢Úß "ˆ7+| 3^—wÃMv7¨v‹ðvý#w?ª‘Ì–{CÐw³âþú@Ö+8ˆà’äâ@oʧ¢/[ø°)ö—* @ü¡t½}AÐ{WÝ"7ÈWªÌ÷lØìÔ7+¨O|£â«0è‹U33Ò ‡¡6@j•BHŒÀ€§"ÍŠÀ3¶w‚©KirÅ·ùŠTâ|axä*Ø)~ƒÆc X‘bD6{‘"~À8‚ Ž€J;#äR{ér‡EK†k‰†o׆[‡B‡±XÉzx*Ä p74¼àxâ Ø@ Æ¢>A Ö3)ü`-—‚He¹¢þ`«\÷ŠÇX®´ø¢¸†د"m!¡ÆŒ‚17+¢þh³:°b ºÀøˆ.Ù‰Þ×O·3Þí >ã… ©yX¡È‹;e‘'¬‘y1– îà ª ¬@H!;;N’=CÀ|Ãø1« ÂÁ– ¶ šâàn=ãÀi­¸••ì•ÁylkÒ–)ÑÛΠ^a ¦m˜yx’©"@Xv+ÖÀ5;À"7B :y)¢ac Dx+”þ`™ç’‚ŽLÿ¼ùÀ™‹ÃV–ÃŒ‡AŒÛðä¾!ÀÀŽ-¼Nöà b!ˆúà !Æ|øÁþaÆjlÏnì‡þ<Œ!àa®A‚ʘ* R48õâ¨PE- u5] B™¢L¡™A@•W™§íxá˜Ëzÿz":‘»˜–©ÌœÛ0Þáèþ  Ràä¡ Â!@Á‚ °A¶Á â’hAÐ! -Ï@«Ï~H>¤`àŒZž©±œ 8”`s¡ ð«Þ8Ö‡AØá”‘‚ŠðDcwÀlZNžÀâjî`¬€jð!~:¨‡º¨­ ¤O:¥ÓÚ ÖšÜ(úkÜšåàZGÚ®›à!êL :PôàJ°-ÚèÚþ & ëš-㌳­äÑ ¨g+&A"á `à  ` Á “Ô3S7Â2#ëo  š ¾"L¸3¢! /¬)Hâ`ž-à!@Þ;.}¡,0[³9[¯ùÚ¯;­Ÿ÷ÆÙÜ4”rv× ‚®«‚mýÐ’q,Ú m¤-ÎÉ£-Hf/‚zvá´|Ë¥L³b D b ›†Á¦ŠAà ”ÖÈ  N÷4 Xm*@½¤À °€ ÀÄš2N®@DÎî@Ƣͽá;´›»½{t|v·þ˜­'zº}¯ºƒ°î`´@X`ð:¾  :ºØ¡ öá ìÏ¡¬nòR}›¨ò€ °¼LàP T`X€ZÁ^bahÁpAxÁ€!† ŽZ„A4V ¦ap 0I @•¡ t X@œ"ñ7ˆ‹ šà ¦à ¶    Ò` Þ`î ˜|áVà‚þ\¤©ú – ¨Ü ¬œ \W”Ü›w<{\Ó~œl‚Ü +áÆ R K\À 0À²³JÁóÒ›X@ˆ!< ÌAPökÁ„-À`% ó@óþ8<Àøátfá言ÌO ÀŠD äM šž ®áôqÑ7ÆáPŠËnò â  Öà ÆÀöÝ‚úÝ ®¡ ºÀôö..b}ÖC}Ô›;^_'œùÒÒ…0Š öà L ¬@‚m DšôºàZ¶Àîà§³`þ>A¨üÎ/ýÖÀbæ 6½ÖCC›94€;„#XÖ a ¸ú4bŒ×ôÀèØ Ì@ ¼@ °€  € ” ¸XYÊ!íò(½€Èç^ýÐ;ÅJþäSþ¡óžf÷ÞÇ-þ£ï~‰Ò¾³ChÇÀ‘b¶` ¶ f¿|áˆ~°` îY À Ab˜À $häÑ$â81âÀ ¨¬X¼ˆã¡=:‚Ø ?8ˆoN -QÓ‡¯Ë+;kÚ¼‰3§ÎˆÁU²ò ½y(Pô#²nm‰ ÊÐJ6Ý•×^Ø-ÈàNº$tNÜr^xrn8…:'Ý@n5Hb‰&bÔWiá>X¨(P)ø)aP9Ž cˆ-¢@Dß £#Œ%ãÇ0ùp1Ð5}ð³ýWWð†iw'n¹àƒEøa˜hiÈa™Ä‘ifšÌ‰É¦Y!6F—rÎIWŠNt™ùÄ=à ‡ÃŒ¢Þ0*xÀÆV ´Œþ;n@”ÏéÜ9øh`ÐÔ@éDÑ j¨!omžššj®Š•ª¬nت²õæ0#ŠŠk®ÙI)ˆdÙÐÈÆìcNZT£Æ"U!õP L 3ŽAD€ ¥®âÒé¥@`Î:««¯®;‹ºì*+º²Özë¸önÉëÅx€!”Z†Å!ÑHAD  D@ñí (P|Qð·áÞ‹qƒås®¼§ºû®š ‡|¦Ç³ÒgÆ*_—ï–„Š~˜"дIÑ_,3Ð%Æ q%Y4)ä6(h2LÅ @%ß‚ûéÊRW·qÇ&‹9þ2Éf­5Xñ^-&ÊSm[ËNFCçôGA ÃP!O2„\ ¬L° A˼¸Þ0XÌcÂx„0Í_ïÃO_LvãpUm*Øarݵ…”W®Õ×’{(¶ãž{÷ô0¦äÕŸZ #Ç+ÃÈ hÃ\ë··a¡ŒBŽG°µÀw‹Gýyð8A¾9Ö˜³{ùñ6["æQGôÒOO}õÖ_}öÚoÏ}÷Þ½>¾wJF{ð-d2Í ˆ¾Ì“”J—‡E6Ã@@£a\èãp„nŒž-B<æy(yÊ8Í)ð9µRÂ3.ˆÁ jpƒì ?þŠp„$,aû÷´@ôù‹AÅ# ˆBˆ@ƒÄã~ô€<ü¤š $ ðˆÄNPB„àWšèD .ñ7µ*¢¯ˆÅ,„¸CÂTã{ äFæ1Œh„"rˆ Þ3BÀã<ôé‡%†± 8fsÀ£x.Èb„,¤!‰ÈD*r‘Œl¤# ÉH2 ¤úRä¦(:1s›,Ž1™–*jq”¤,%}„€ ”G€ràD4¼‘A „ì8]Aúñ#út# ˆèPÉÐ¥ƒÄ,¦1‰Ìd*s™Ìl¦3Ÿ ÍhJó˜ÿØ (Ÿ£ÉþNfH›¼&gÊpŠsœ Ú´ÏðP „èD‚¤†Â€Æ× O žð£uzæî@5É Ð€†ÓjÞ7·vа|² N¥@ QJ=PÍ'*`„OCvE@E‹¤‚|âŠû ´8€}~F8BD_ SJ”¡eÉfB¥bÓã-”¦KqhL Ôƒâœ(L,ñgÀCÅNÁ‚ÐH *…Îð;A¡Ÿò ªW¿j™òô)7½PN1·Ó±"ŧ`mkD™€M¨F l`€ zi†W¬3å0ÐðhyƉF7º*$ñ0Õ­Œ ªXÕšª²þZN²‚¬›ÀÙØÌ ôGI%²N7Ø£ÃX_A,QXÏã ¾Ð#ŒªÑG›iv¶}¬erÖ„æ¶ki½-ØJÛàbñ…aÊÑ+LBhDÀ®Q pÔ³n®…ˆ,Æn<­à…p¿+NÛú¶B”MÎnµÖÛÛ¼ì¥Ô;ü‘þ%¼XÀ ªPMÛ C,H#ÔRÀtBtüÖ7ØŽö*‹âõíyµùà¥×²ë]°…Ëã ÀÀ0F0@x#i‘Ãgò ±ªBŠH«EBHrÆ4®±oŒãNXs¼K‰ð&}Œ<G³øƒ‘Œä$+þyÉLn²“Ÿ å(KyÊTFr0‹x |üAYÔ@°€Aài† ô'‘E=£Ú-"ïÐæ,^’¨³ïŒç<ëyÏ|ÿ è@ zÐu>Å•|[ CPѯš0dkE‘kHzÒ”®´¥/éLkzӜ? jIo¬ˆž@XŒŒx¢ É€ˆ`:¤ª8†D(€ùZÑÒ€ŽGY@$~N‰B> £•wìU9Z­>¢°ƒ7êƒ[‰H8à‹!˜A±5Äx‘h´‘…ºâ$~n-ûÙ#v±‹Â@P…µÐmy³²ì±6›ÝŒöxLþ"Ó0²ð ØîmøâAøp‡i }D@)×Í啕ûÝäK½‘€ŠHƒš fÑ n&[d_+‘q²ù{€¼™Q| 'ƒmÀ€3h Y$¨ Â2Ò©EXà¦ÄxÌU¶ñwS®ÞõàÇ”¦Ž å'â½[Õò£ìûéž›yè²qâY‰(ÅŒ‘ ;¬ï@z`°‘ »g1¨ƒ® s²¯,êŦ\.,uõÄÓCNèäÊÓ”ožŽ]ð2¿2/€3È’«àVGÐñŠ%ðÖì@Þ‘ƒˆ3ƒ¹cÓOyŒ^È—ÓOâÿ‚gt}Ñþ__^Ø‹2ùØKÍì¡#BHטÄÿ¡žÆ9ì.ÀDHp¦l”QÝËÃ^øãš=/çŒÛOI͘… _T%»Wäi|îgŒø¡> °a(Bü$ºà]äD€vqÛ'¹â}ãu9Ü ~ãFà@pXP»€Æo4°¸°ØÐÀ³€êç~¿|/—€ƒgyYTàõô q{ßFP }Z´ ð9$NN·‚¡²€&èð€'0 ºðÉ`Ãp "  SH…Uh…SX·€r8:p 9p{  z@4 oëò~ þC(.ô7@ÀÆP0Ä ~Ð 0@¹DNF`   ,vEBȆsR„‰&(~0 ư)7í7V€Žx&bQoªð€Ñ @»€†(Hk8ˆ%Àß`"n:T°ð à aè à  ^„8ŠrRˆ–u9Axyà u³³€&8àÏÑ(Ð8 ³€@‰$¿`™ØøÐ³‰Š¿¥‚½hPs.À ׊-¨EÿÐþ`× ~m°ƒ¥à°|àÿ @„P†p€   °ŒÐðþ ’0 P` p ˜ °À à ! À`}ˆŽ¶ñ‹u9¬x nÀpçGÐA)”CI”By³PØÈ…añ ÷‰}0Zx†VŽ¢“³QXàäÐWà ÚÀè€ @ å`•P0  ðŽàÐ °   ˆ€p†`…P0 ÿÐ|°zp %âG3N²WJ0É ëÃZ Ãð V2 Ó §criSÞ(›³I›á ;ñâWá°þ“µ1“ju9™puE0 x¥ÐŠþ°>9xp ß ÓIÕy ³ð H©”ž$<0T³ÐXQ ãÈÌXiXPV‰ŽX™6I )P`V0Ð)0  h pµ   ö ~=ð˜²ØÀ ÃÀ_Ð|Ž€!0 ðÆ øP ÃpŸ§0 ’~q0š 0 ™ÁY W Pý ¼  ÈpE@ ÂÀà ¼°9p¶@ 3 ±0ð®Ð ¬À«  *(p ¦P %@ $0"  ð àÀ ›  9À ;! ºþ.€(а›¿yÁ9V”Ó ^0%}@>€„Sâ âXx° ZØ©Ù(—s ‰×Øp0 Tp‘*©“J©‘Ê ¿€oUyŽnzîyñð§`Ù@ ì Þp\`úA¹ ïP &` §€¨©  +° ,À -Ð .à ¯°± 30´` 7€ 9  ¼Ð¾ðAÂ0Ä` G€ I°΀ˆ·WtÐÕ°ú d-N° £TÀ3H° ¶ˆ€¡µ°P‚h… á`~ }ЭjÚ‘™v·y»›yrþa y£àŽò§°Ÿ·×þ³@ £¼<›ò»¸Ü):ÀJ°tƒmÀ¾Ý€¹kÜ̵ùÌu,Í¿gºÕŒr@&ÀuÀ qÁÈYäòp}Z«ET@ @²QB(%Q%ÔSòVÀ-{ ÿÂyÐ>V êðôp@Ð&*ÁE¼c¿2·ø€{0æù¾&«¸Z¬a‘gx Ø™‰wµ€ž³°Ì#M›%ͤ‹ÒÔ¬Òp!{¸ 2 ädi01È«Eé ç¤?Á%â©+ÈÊÞ¤.ß š‰w Ű-›Ö…j0 "P2 < ̉ VQ×Î ÍvÜxþ 5}Mˆ…MN×` }gZ”ú€ŸDS‘Ý æ¬ ”mÐ(è.¿$›È€ëÑ÷Ú¾L¿YA½`&0%[`4ðÂpP†UÛ$=Û'v)ÛÖ1Ó߬B/vbßÂáÝéVÜ\["X¢%CXÙ×ä.Ð@›ðÙF Žà ®à0p²ÿàœi­ZX Çwus8 }`³ æyÞwÞz½Þ|ÝÞ$òÞ¤¤V7…0@ÐØøÐ_eÜ%Þÿ J®þ@›úp Ëx0Ùi É áZ1²œxc Ç€³…ÒÌ,Û&-â-ÇÞ4.“º-Pç€%APr þ5øV3nåsa㘄ム- oçq.çp^ ³à‰SlÑY!Ç›h :àá>›xMÛdÛFTæ%râ¥D 6 ¶¤"ç Œˆ³óš¼ú½ètqæS¤.$ öÀžÛÉAæÅâá(@Ń.ÒQž× ¬³$ÞéTƒåõ ¦ ãÀ†àÍQ ˆ@‡°§0pcÎé·NØ]vê2Ÿú[gU,·0 / êƒî),›  „.›†®ÞTnëÌ~åŒÁÛ{P1p6mì£PšH8ÆïýîïÿîH”äì-§*<àHNþ›Jhnµp“PÆ ñ/ñÑP _ Hî›°Q1×O¤F ;^ >~Ë G ò+Ïò-Ï!NëÓüÀPe5oó7ó9óÀ”YÉàKpuÞ0¢° – “°)@ _ÜkÐ8íVÃ4MSOõUoõWõÿdI}×Ъµ@³‚.Ž› õ6 pðkÏökFa0 Ñ0 ¿` >ðñc±¥F›°`~'¿Æ­páN¾&µ¾D ø‹Ïøïøù‘/ù“Où•où—ù‹\fÀÀôaÍ 0)Fú_…hÀx4 0 'þ0 ˆà ¾ˆP˜à‰f@ [œ@_›á W± XàÇüɯüÈÿ·€çD~ø2_úÓT`p˜@ Õ  @šNýá?PG,uX ¬Ë u³€œ€2à÷R1p J Ñ`ñ ƒÀ”fn š¥cV­Y u LØÐáÃY :ì5¬Œ5n11¡ !îšµ‹‰À¬dÙÒåK˜1eΤI“Õƒa9uîäÙÓçO A…%ZÔèQ¤I•.€&¦Q¥N¥ZÕêU¬fºÔäÚÕë×—=.ÙXÖ,³ü0˜•Ëa-#Ñ| ˆþLò%É•î£G<Š„(Öã°gÏj ‘$a·váZ,%XÌ™5³¼‰ÕógСE‡ ÃhÔ©U¯f­uókØ3 CĦØ6€}·f•CÂB‡#º©qCäß1ë"QBE%!“Wψ̲ÑK-„ !'œ=1Óí²Û¾M<ë#bWÔ¯WOâá¥b³Ô%ûUò¡ÊØùõƒéÌÚÿŠ.ð@\͵ýÔ¬;‡¾ï¬/zQã£]zñ¡—_:ô!ÁVɈ€˜ŽL·í‚ð!Y&Ô¨šaŒ†æI`G¤ Ô#¾flàƒÆò¸spIÌúSðI(£þLª,‘òJ,³ô‰A&»¤éń̑Ñ,fÁK$jQ#yË¥–3mÐA jÑÅð"gLŒÐ!¢ofhÆ PLÙc ÂáN!ܚńBîórÒ™œÔòRL4€ 2õôÓÿ¸¤tÔ•Àœ¥ >7Ú Ë ºÅŠ„n™!#iÞº2S}@"UŒL˜… ˜eP …†|¸$˜è0ã€b8æ:äÀ „lQêÂTp-u\r«B€IÊUwÝ©DwRS%ä5£$¬sHˆ„´°D P  œ¸õVS© c^ÚÙ…‘ipp4!)„À -òùÅ^‡†á‚þf©s–âaQÉwI—]”Sö)$Qùe˜{r·d&»C¤WæÝhrÒB“10RÇŒ¶Jr`\CZ&©Áán™¤k˜H'˜vD 5œ á“D)s–[è`¬£ˆD¦ó–æQOŽynrU ºóFyf¸„Œ]vADçêøâ Ê ínÑT"!܇Ö!—]xÐ\Ã_”Èè”’| µm°¡‡¿í›I¹õv=KxäuÚ?å{õüºÛ% ‡ð £ÇñMíåÂï¨&Â@’#£KzÌã^vómÜYÇ©vî¯lGºÿÊÛ³­;þj9#‘Y‚у•Ä/K›Ahð$â門ϡhˆ!Ç>2rn™i;ª3Ÿ~Z7>®Æh@-x ò503/"¸• ÄO~ixnñ°ü-0$<„ü0¡&$äABHQ‹htACH@-޶@ 6è$¢g`€EQ‰ªÉ`¿!À!#]8Á3v³©à¸à‡Fê ” …Å›H/h0 )È}pC†Q€\²àB>ΉÜÞýˆ•X@$¤gš¸G®@(}gÐH*1 È Áƒ'lÑ#Ìbøã ¤›v$¤ þj@ʳ@Ãaùc "33ÄBÆ’(³J€,m•CºR6EYîaƒ Ç ÓHÊC>(¢ <8S'“6tó ¥bê\´Êq­ÔåW`yKpî„@@8ÍY”\v&/âÁ;ÊR+ L(8Óž€Š;àl¨†6ï˜(gf"6@À2™ŒP£šÙ)ìè†rS\ùæ9oy¢ýI:'Ú’¥OL¡Ã/Üž$Ì¢¶ùÄ‚JøÁ# (wÊ|ÄAø;ÇïÔødcÛè¤D?Z©>rt£º@”úÔœxô¨`0ÕÊò¿MLèBþȧŒŽ@¶šâÉ#2ÀÈ„ñ8YuBêp@' ñ(ã³XF3#:Uo&ªáì±W¥Jõ¨`âÊò1$£«¶‰Å,œ2&44¬`²ò4"3è  ’ACˆpVt mádQñꕊV‰À€T»QÁ~LéÛìFX1‹MÝÆXh†'$ˆ:L½ÀéF¨aƒLè«™ÀðÇG£¿`¦iOKQ½¾6–Â@´{ÎØNÔT³(ÍFø¡2LH³ðé„‘ÀšŽ79„ ¼ž5Ô"¹à‡ š€‘ð%*²«¯[“Ô~7‚E€ÎðªÓT:1 „d¾Y²øb˜P<„ 1 iF\ýjX»ºƒƒì,<c»æu¯}ýë]¿#uØóÜ€ d'[ÙÈ^ƒþ'¤ ËÿÚ¡ˆ%H†º†d[ÛÛæv·³}_èÂПA´KDó—Âf¡Å,Ôª9DKØG¢r?à…¬鈧Er C˜Å FÀâmdáØ1qcÕ^ꄼa!Þx)x†Á6,~qŒg\ãÿNìABF7xv!Ÿ:¸Îk`yË]Îò?Ä å´*6~ó›—ù7¹·Â•°CèC'ºÐõq‡Kdo¼8 Áž6Ò(xÁ6}øbHƒv ` P‚nö_ù{…¿XlF6¼‚ ƒcBÇ»ÔpÄ]îsŸ8°Ÿ[…â8ç;Æ;ŽŠY<@"ç þ xÄÏ#æHy€N°PÈG^o°Êd4D«æ}ç¼ÎYpÒžgåç5I„ŒüAŠZ÷Mѳ…Y61‹!(† q¶ð…$ê11ÒÈ ÆÈÀBqÅ0,xÄ`†1ÑCždxFÕð|èCÿ͕ޭ²wÎó½ã(ðBà‹ý‘Ë"úãWÃf÷´ @'ð€Üÿ~øÇ_þó§ýíüç_ÿV8å«byà@\,S7OÙ¼ìÃ9=¬Št*½*è ¼@ dz¡Õ#Œ^`³0°,³HYøHB diÞ»ßS´[0³˜„Y˜ð þªÒ` І7Ø øÂ•æ3ò“>PP€X‡ØÈ; À¾ܸíÛ†îÁóðKBèÛ¬p¸¢…’c öÛ?4LC5\C6ä?ÿ£ ËS/|¾| ,z‚qø¬BkÀmxÀp‹Àv=š(=h˜C5 2€´6X¸‘AX1`‡³p€Zhˆº…C€†ÙkˆYшˆAÂà(;ŒÐ» |ÀȈ%¨‡úHˆk( .‘`5Øh8$ôÂ7#5¸„:»ƒ )ü *äC¿°¸,ÜÂÕèÂ9ܬPƒ P<Æó3lCnìFoÜ¿þ«<þÃ9̧yP€Í¼›SÆŒóÃ?„@«˜@8Ä9$2 è <½Ô—ÕC¸²€YØ´0ƒnX¦4€<À;©R„Œ#* :‚aT d˜Rˆ ˆ†„ S¨…]À‚²HÉš³%áÅ9üÅç#m}¨¾Í8FŸHFw܆ŽcvØI8`*{è.œ#D¤Æç„+ôS?ÕØÆolJ§lÊpü¿qDDsT;è°Ä”=¼Ém€Çx D $Ä™0DDÄG5`Hœ$à@„Œ^X³ØYÈ™²xƒ[¨®_°‚Œ8‡òÈ…ˆü·B0 W˜…sQ ÀÄ·@þI†؇’ É ‚Y40&QI_`|>8hÂ'Ô šì ›tÇŽ;‹=ÐÖF/$Êç{12\Êö{JÚ¬M5ŒJ8œÊr€y€>¸Ã<Ô’­¼Ió†8ÎH}€#@ª G{ôB³|¾G@•FlK¸‡P›0‹ kˆ¼ÌˆWŒ¾ÒˆÌò{( }H†s° Ð[„X°‡U´Á_Ȇ²°‚³Ì”t¾ÌÜLèFb¼»&‘8¥MeÜwˆP ÐÄi‡ÔÊi€jŒ¾k€lD ¦´MÑùÃÍ©ˆCªäÍèCGPÇ,NwÔ9ŃçþK™ Ë{ ˆ>}~•œ…( a˜…Ø)‹uH’ñ$Ïø\õ ºÜK˜…ÿ: ®yƒ8øI†qX ðÏÉ P”tÌLB–?—„I™Ì«ë€Šãʾ{I F ]M %?£DÊô%Q@Q• ÝÍÞŒ¾«Äˆ¬¼UÆ~xHTHEÄ®ÀQéÔÑñCKµdK/ùǺzTP<Œ(‚Y°›@°º#AØUHJOà Œ®í¸…0‹/¨F8 x D„ú¨†SÀ‡D Ђ²ˆ†Ê,Ó9SòKÓñëLŒøLÔbФpP9Å8:þ½PñËÐ ?×Ã2üŒ? Tu}ÊAŠBõª$¿ß޾?öBÝå]ý §óˆh°\ðÞEƒPbd3‘U(.hA ÂAÅÈ<’Þé„  ø8†@‡pX¾ƒ ÁPƒþñÐgH·‹<€5€,x€—f5 æ9t_l}‰[‹@cèb9ýbª˜•užCNÑh….`#è‰x–Óy^ Q1°…@x‰|†¾}žC vÄÜnX„<šÉhÛþYȨ‡€bà„e˜¯i"½´ éˆB6“yƒaÀ‡¸„@ȆZhœ‚iX£,èUX†Ä â ÖeÌHœZ°2îg@„`ŽÙiY§?,Fæ-æ‰#ýƒj¡æJ¢žŠ¯ã‡0g¥¾SÏmêÞ†¾3. &Àˆ;è&à‰«ÆêpÖêž°[j`„cknZžn5 ãÑ6™N'Ó‰¶æÊ·V Q1Œð]Èb0¸ëçËë9 d`~Œ‡˜È „ˆ€ŒÁi‘Ø…Óˆ?Xƒ'#8e¤‰t`H‰Þ…_ª\°c°€GhˆZp„ŒÐþƒY`‚n°€I€„FP„ €Ø‡zp4.°(H@ƒqøŠqெÐIX3èê•°iœvjcæéàÞ‰ØÉåü\ðæa8î›Ln©8" H….êƒpƒaXêçËæÞÞæ¯ fí" ‡øêîž?Œ|9ðnÛož89^€1°€fȉ°¦ÃôVovDiÞ9Œ †CPÊù¾ÉúN Q!i¸ˆ?øX ÿNÄUï³LËݽç N7s&~ $˜…oPO‚à@p¨†j¸ÈH*À—;ÂEâå„8H ;Ò¼pȶ*Є€…‰Hþp·À=€eùƒ< ‡7P‡2øm¨hXc^¸Y5{xˆ`ÐÅó‡Ø(çmRçÌ&ä8€0À˜9ƒx€8x7pƒv`ƒuX5H‡t@ƒqR€cð„aü[ˆ/wÇ—,€s Žx ;ȇ~„@B0HE`xH€I¨KÀ€L؀𨠘*(…—æøŽûÙèZRçß-`ЄI`„؇vø†hP?4i8pŒ@†yȉ;—¿ àxU€‡,ðóÚô@°ƒ°Û7ø,Ht5ëÞV`<à-À‚k þ)€'X%@‚µV PC€¨mh „a¨tw¼t¤à1 Mh†hÏ?uwj Ž„}ð•(8DP€˜oGx„°y ÀyŒ˜‡Z®'b ð'1€¸†Y€‚YW ‘èUqH)°‹ hŒ¾1!Ð_Z”HˆÑ²0… =˜+‡ØpÞŒ0‡SHЃ¼\W\ð…"X‚(¸‚. uÐs0“x˜€~qR£páÂIˆ1Œ(Q"¤?/b̨q£‚Y³Š}°ø' ÛN¢L©r%Ë”Ú6ÂŒ)3‘ÇYƒþ, @ÖÄ…e è)taòqzÌ#ïh‡Ð`†rŒ ^à‚°`*HáÍh‡7È †*ÐB ü“UÈ!UŠ‚<6˜À?̨‡ëjiK0+hËBŒ¼õbíÀ…>@¡¡ÏͨHHÂ%h€…ÇA“qŽ‹fMÒ1 xCA¸Æ,|À$a #`ÇHàÉåHu·¬e?Ð…Yðà_ H> †Õñ.!¾{ðÚ±‹ AwÆCÞ™÷¼ç  “ðâ0°g’?{(óP¡ 8Ayêã û€‚5:ì€ ©`hA#þd,B¼ @1†A-°ÆØ`(fDWAÁÿ r® æÃ*ÈbÀ‡«PlØ  ÕÕ•ö”UÁ)Ft S«œã Už @‹øñ#ZH_cE—a-?¡G"¶êVåݯÀAˆˆäõQ;íÔwÄðÖ ¬û¸a}´€–`P%‚Xy5¬í# 2Å'×iY\^D¤p‹ÜÀ Ì ³GŽŠñ‹¼À@¢&kg4ÍhÞž …vQ‚Ð}ÓFŽ ˆ>öA ÕoŠSçeW€Ãm 80QŽÖåsNü|žôŠpÔòxoíjì$‘þŒå9t¯’è_¿x‚œ|B ÌÛ¨²<Ú¬gEknÅÀEæ`ú)ï¥W½ÊºÊAŽ'Xì ]ødòa‰läc¼èƒ¬°Á X¥yàB>«\ôØS­².«Á f°€ ¼_ÉhÕ­âÀfpŽå•µeXlVÌ2”×­+#0ø°¼¼Š—S}Í1ó˺d¯Àëk5W6KkxCŠ{Y‚ðR Q¨qšdÐ@qPÀ ¢00·6ÍS¢æ\çdÇB™6°”¥b­¼N°à™5D-Ç8/Ð kðAÜÔÜÚ×*.t¿ „8< èÀ#zÖ)p „ÕB B8F3>îðÕ€ È`À:£»Ï:ÑÆŸè¤ ºÕá{›Þ7K<ío0þ‚¯Ô=im@*RySÔƒ Â÷d}Õ@j°B,þuQCøèÂ+ì°Bu@‘ÀðƒxÌA¬VÑBÆ lTÀ*qúÃ'ôp¼=îs÷pÚ×Þö—Û­‘(Ä÷ØÝ“+ÚI­9iëÓ ª4|OßL_I¿ç ð*!B¶ší˜Eàœqë˜,ÁŽX!Ï+:|„\ ø4"tqÀ \ÖçžîPªÛ‡ëZ–ÒO_úè]–ÎST꡺Pàkù¢?¿ã>1ý!Óáúãò)~ºå'‚yÚÔØÅ‘‰^ù¡Déþ}ÚéYëM„ëц”QÙì]Y¸¤™ÌÂ.ôQSíÍŠ&¸CÐÁ,0¤ÜdiåÖõIà-iŸD8šP@ñ—øùùà68Ý’ÚúL{õDªÍ&×åþEÀÀ°@?,a~Läñ_]Zõ¼@!ay`" ‘)à:1 D8`O,5\ Ò^ˆA9hCkÑ  N=¸à I &Ä:4€ç ÓŒ ‰˜CÌB›Ýá ²aqÍ`DÔ D”•éà¼ñ þ`j”®F„ÕÀHi¢Já~?\B)ª"Š¡_ÿIÄÿM„þ汕&z¡õàI„aŽá-•aDœ¡DÀž?PÖ">\ð@3ÀAkeÃ4¼ÄC"J“â4€>|Â"SŽˆ˜'Ô@ã,À 1²N#2Ä#2„÷%ÝfÏ-úàùÑâzq¢D°C¸üâü­â>ò£þµ¢úFDâX<¾Õ`.–×.®Þ*µÞcIV™8Þ’z  Z4YèƒTÈ7¦Ž”LhH9<ÎàP6€€H†#Eî£Ñ ÷1Ä JšÃUâ§]bùe"-ª=z¢Báªåc?åQâú›+F,.„r¡A¤-Þ¢BþCÖR/2þÄ/*DÎLV¤Hî —HޤÐÌBôA“2íÏ7¾$E’cCФDâ$Î^NÙNŽ^OjâOFD=‚¢($)"åa"¥RÎS2„Sª,ržTN¥^¹£U¾VœC6 D*D0#X¶¡Xö[šåôI‰pAͱV.ä4Æ¥8Î¥B<":b—êeŽñ%Óùe&C°ß=J¦Ké#b'?*æ§1æB8%Aç_!dùY¦[afëhåBü¢D‚f1–æv¦“”¸À"´Ö7ÌB ÞákclªA Úä"Þfyåæ¾í&ö¦O¸×P6§ag~JáqYr*ÄÿA%Ö5çDþ=çèEçVMg“i¦>–W®avºŽErç„JhMÈk=Â'¸$„Ž£L:"?Ý%ÑÅ`{þÕ{rZ|á|*IJ ¦€Æ#~êçŒÖ昪æAæ€Ö"eV%ø•¿%èêT§B¸žgÊž‡¶N…Nhi2é;ƒhµ– |@‡*iLêÓömŠ£‰¾Š™Š ‹ªÁOT´¼ '²iÚhyáhlÐsªédº#.éÓ i•©´v^ih6é ®™YÒL\*z:„8ÄR¤—º˜Š—˜Æ™þ„¡šÊh›zjº¼é_Å)KTÖ©[(Ó(Eíéþb-¨/~ ÃjX*¡2)ðùiº y."ï¨(k°k¶^Fê:Zb;Þ¢¥¢ŸúÜ:@k´JkÏ&§ç§bkd„ê[Q0X·‚k¸ÆÏæjÞé6¬êDµª*ƒ¸ë»ÂëKÄÞ¬Òj­6é­Úëãð*òŽn|_m¤¤n¥î³vžúèFš–k§fkÃZÁ¶ºMˆ–«sR%æ© Vq©Ò„D ½Ök¾n'¾Šìpj(°BʪìʪìM‚¥ÀRÁB”Á>×4T¬KáB%ðlÏúìÏmÐ íÐmÑíÑ"m%lÀþù"ÈÂÓBmÔB­) AÎZþ¬blšÞÆ^V ðÂׂmØ‚m ¸ÈjgÉ:)ÚzܾšíË"«N6ÔÐÜÒmÝڭݺpBÀ¡ÀÁ ÐCœÂsq.4ðCH@•„ôH—4ˆA(˜Ãxƒ¬ÎFÏ?„;¼ÌÓEˆC•Ü´CLs´Gƒôø< €++($„€ œÂ)àlòhþÂ) @(ÐB(`B, ˜€V/uS?uT ” ¤BRGÁS›B4”•XÁPà ƒ˜Ã&D€Ô%$2Œ$`Bn‚h gÃ&2]Û5^ëõ0À(-/äA30¶aç1¾e³ë‚ó-çr3ëƒ/³0³1#³22g{64K35ƒ5_6-ƒRo5XCuòŒuYŸõ0X5 €)h×%O&ƒG¼ó;¸G ¸G”š1†¼s:UÉ!¸NCxÀ°hxT€-ÐÃ'¥x¬x‹ƒA ¤ÁdB ØCT 4”Á&T‚Áð€D‚!T‰8Â(¤r•ˆ8‰›8ŠƒG,<$[Ñr"<³üÖ0T)ô­ $Ï CòÀ6lsyò|yò¤pGÂòÀvŽaÄ(ɸ`D¯ƒQ%O%Ørfƒ³_„7cAàÔ@9(Of_öëþ1¼u\Ïu]ßu^ïu_ÿ5t6a¶ ö¤/vcÀcGödãñþ!X6‘eù–wùšC›'Ï›ïõŒy#$#@ò€(-„Ã0 A °¹›+Oš{9˜K7(‹2)›²î¢òO·Î*;w 8Ï„ÏB…ÏÂ…{D†{1tÜ> ‚G$x$@MÄ@¢â@)X8†×„µc;€Ïˆ+ˆÀdBMè»À@˜Å³G˜w„ãû¾ó{˜å+ˆ@#xcMlø ƒÁ…Ü4ë`lBˆ*—-*³h¼Ç+ ÔEDÅWÉ:¤TI³»ŽËƒÁÄWüÅg<¸+„°µ[Å@) A'(O”ÂЗ‚,pl'OnŸyÐ}ÑsþݼB)$œßq! Àì" CìÀ?xý?(·(Uò4BŸ›½pý׃=,Ë&´‚8tp+ú¢Cî_‹KF๞Ÿ«—Ÿ2 [Gò z¡z¢Û²¿õüÏ3=Ñý0@½Ôkmn›yò{ò ýÒC~ÔO}ò½ã·ºvAE_t•x@FotG4œ4I›ô t’³´KÃt•È4MÛ4NcÄNƒAO„³ktP¯þI€ Ô½ÛûÀï{¿ÏÂÁ'üÂÏ‚yC¸G$xC3üõ7?Â+¼òë;óË;‹`r/Œp ‹ü{ôOúIüp·Ÿ·׃?PBëš þTÉðÃ8¸|ÿ§²ËÄœ! .0Æ€~`6³@;‡ !JC€ †ø«È*)ÃH–4y’d¨aLLæå0Q&S¥,©’$̘ÜàéæN¡(,úVŒ¾¤ü•jÐaJŽaÅ®lyPáÈarT𴀦N¡JæmM¥E0ò(!ùÀ¦¾Ü µ{o^½{ùöõkò€B~ìA4,ÎŽ‹ÿÑÙ € ÉFZ¬œ˜qc’Ùä`j%® ’•ÿžTÉҥΘ=’Laræ0R°ƒÚ,ÉèËÒfº@g"˜&ä2x˜Ã Œ&I*Ø¢'&ùòæÏÁ¤Hþ3"S {B+³©0|ÀÀB$C Å8±áðâÇ£3ÇÆ,ýûõ{˜Õk„aô[¿aƒFô3¿ô ¡Áýüë¿°À 3@ÃY&$"ý6É'CðÐoŸôA¿h\ØoÄ +Øoõ#¡Ã Z%T&¹À]ÂÉBœL>G0: ‚p2@%™tJ0Vð‡KHÁ&0Æ $ñ@œJÂ;cà©GÞ³À1†,òÈ$—Œ€â §iJ é“Pz@’ ‚¤QHú–’E)“’”˜¤SJ# Zæ˜!Â8æsøQg‡AþHâÂ|ÖÈA«aLÀ‡npTQI5u˜"ÖðÇŸ,0i”9ì1‚K=Ùd•%i’¢ŽJj©¦žŠjªª®Êj$®¼K,iË" -µØrk¸ä¢ëÒ>ÿæÑ“"%iR’‚(t˜A ÉHà^Û†ÁéÝaâeWP¿xS€w& €ƒÀØ$1 rã!È*¦"6À'ÓŽ£C€†Z'2(‚o¢ŠbØaˆ%€âL…èðÃg‰±Àõ«Q¿NœeŸôK€ýòšÂ¤už…ç›IÌqC 9afýIå2(” ÙÏ‚QF˜dBL!”œÐOk®½ÖþOD…)öóãP6ù:GÃ-òH,0êÉ¡Ž7X@ tÐ-8£ñÇ#ŸÜKÒè£!`(^èñg X,Czîh"ƒpÌé€<È;<ñÅ+ׇ–×ÉÙ ”'>!‰V¬0¢ƒH耑’48Á pJ$•SHè ’ˆ7y’P¡”N£¤T!á“ä—Š´óÕ_Ÿýö‘-#ÓM;ý4ÔQK=5ÕU[}5ÖYkµWºâ•¯€%,b•¦w¿Fð†W¼ã™o{Ýû^J0q‚dÀ$™8ÅK"‚'ìƒ]ΘÆ0"è=ð ãzÜ oêáJL#G<•þÝ>)ˆA¢àTìt QÙE2²‘ލ,SÊÐÔª6‹«emk]ã[ÜæV·þP`£ *@-îÇÌxÇÍ–@„YP‘nv›EÛ¤5ýpÈqäÏ„äXG9úí‡yÔãùØG?‡pŸi9H;p„(ä"ÙHGÞ%}tN$)Þ€G>’ˆd$$I©IOŠÒ¨¥+eiK]úR˜ÆT¦3 MkjÓ›â4'OÚiJ™Š‡yIG^þòŽÀ„š/…)L<þ™ÉT¦ÙHJVòXäÈÔÈMk^›{9d"³y¾gvó’€á ‡8Å1Îq“åÒy9ÊþCsœóèDG:Ó5$u«kÝë:&»rÖ–Ë”8ŠéFb¡³€cBgA…P0ƒ ýå1—YQ‹*³™…C ž‚n~¤!©_¤ jŽO(A8@zÉ‹¾¦z\¨Dù3µPLƒ¦iNyGŠÆ¨1Í(J‰ZT£©I•¤KƒÚÔ‹î´§Q5¦T©Ú¡Ÿ:«ÈªR¹ÚU¯~¬HejVÉÚG¨V­P;kZ{zÕ²¾‚ ë\éZW»Þ5Yc…ë^²V¶þõ€­ª[ù ׭ⱉUìb¿ª×ÂÂÕ¯‚Mkd%«ÓÇ^ö°ŒÕìf9ÛYG:ö²d¥le¥:ZÒN4þ´…ͬgYÛZ×¾6/ M­SM{ڜֶ ‘pZ ;Û¦®¶’ˆ6Ç»×$+êHl™ÛÜ’÷³]ðí[qKSÝJö¬`†f1µk ô <ííù™)W45ì(Ç2[šH<¡&pAdôòMI0D7”IçÖõ]ȃ3þa—ä.÷/®ä{ã;ß½Ø×}²nLM«]îz¼Ø¥™„ÞÛÂ4o‚Ä=š:Äd¶·48A‚ œÍHÂO{0Hâ8_ÐcØxÄ0þÁ‘pâZ‘\Ǽñ_ºVà¥X€,öÐôµÊ/þu¤ŠY\ßèNX´u¤£‡íÈåÒn8iþ½è€(H@3ê§¢ аŸ Œ ˜˜Élfý|àT@ì ŸzB£0…ÇûG;üHƒ²£üè&Ò‡ˆ ÈùìÄqb¹. 'ZEOqŠ€ #' p²XŒpÒ B##)a¯‡†Ñ,yl`¥à‡” ‘dcZC²q;9¬J GJB fôøÇAÉ3UdãXÇ<ö±€,dØù‘¡uI4hê ªšÕ$q5¬e½> ëâÐ5ÀÇô®×¢ÿFfm·¬:—ù̳HóšÛ¬Ÿ7ÇyÎcFøó¼ç>ÏâÏþ4/×ê ||·³°@1ôcúAÄÓö ýŒ¼ä' €ÀŸRÐ@? RkLM¬æ8:ˆ¤‡((Á‚>„â!iÎ#ó G=žV_ J n8†$ŽÐ×0ЯFl= É68182’a`¢Ácàjš¨C1H“>)C»«tÀ7Jr€?<ÃØR@¶²™íì^à×Áv±ì‘,Í~ö#©nu¬Cë$éºdÀ.öaÝìì»÷;ñP‚üˆ’M¼ÌÖó±¶ùËI> “k(å³X9Š\.òÚß^?3¯ù~nžó‰‚ÙCú)ÂÇ?œ×â$þ(^¡ŸNðgãËg¾ó”¡|°B ¡y޲‹ULcùCDa—Idˆ¯gæ§•…“d° $¡IbóÌšèß->àÐÊêŽ2 J"ö Ð%îï”JïøŽ$ü®ð ðíJBîèGÊÒ$î/ÿdƒ6þ…&J‚píMºéꀢ¦`,­0 >6­c:ÍÑ MÒ(í/-ÓÀ€ÊŽÃfAûšïù¢oúªo®o?²ùD€ûfáäöãûÂoü8ù&„@2à` ©P?6n 3ÄÃ,D笪üN‡àÖƒ!4€È`O&ˆþÅþþ‚’Àôïý¯$äŠÍ‘ð+òök(€ aOƒ2 BþD[¾",Þ".æ¢."«¤ÚHB˜Áí,£UÒ]B’qM°$ú/IQô^ð""þ`”ŽéàãéÒc=„ŽèŒé±éÊã<˜1 µl ×?Êð ±C4¤ ä ƒ —gøcjA?º!äágöADäi ä –¦iàð¥B =F ”J©bÞ&ò`À À8  ^)–´Šþ’…’2`ðeëøE2èeŒÁ$NÎÁ‘à§c^~ò ¬þv'0Z! ø! (@4\VdÅJ"X†¥XH‘«*ÀJ`büà1¶åË%ébà3q‡ÒåÏe©$(Ò"÷Åë4’#KÂ#Aò“I‰ñôІPÆÄÔ¯!Úïý€ˆ“æ÷#×±ß1¦s†F¶Ð§4ä¶«»˜ÁÖ(ŠÞfÌÀDÒæôÃÄæ^!Ómøæ/?.ö¬¨o`Êq:ænÇ*fÖ º€Â!X ú €ðIuX"χÁJ.Ô8ˆ™gd JTC¤ P' º@ž ÀH‚hÒ& þXÒ%aÒ9grV¢'é6ss71¨7Má7ƒ“$†3€Ñbp‚¦€-ãÏü ÂÁÉ’-BþdJŽþò“2Ûè0s1s 1gá1G 2'“ ó2E 3áFnÒ m‹¦ ­ÄÌï­þКÀ`ÇPªY᎓D#=ËCÓS™:ÁVt¡Á R!Ò!3AM*À¤r ò r!’ˆö,°ªËH;³°É`¯8š6Á ˆJ$ßÁJô8CtD[KJUT™2@ö  úm5[ó5c“!ò‰u’²4O35ËÔ5aS6õɬ’”­ÔNu¤°>þ3®¬ ô‘@¡¦À°ÔPªJ¯t³•P½ô±ö3¨ð4O+tR ËÈ PUS7•S‡bô°ŠI4Ë*õËH˜0ôRÙ+";•U[ÕUKâSŠOý”¶L5ª$•TQ5U¥îU{ÕW75VwõpÕVû¦X9NXkU•Y›õ¿‚5Y‹ôX/tZëHW£•2ÕY·•[ Z±5ˆµZùC\óôZÁ5´µ[ו]½ê[Ñu"Êu\j^É^-J]ñª¸`§U L‚ ì!Shq¬]–±Þõ^B^ǵaôZË«c,XÀ!ìà2%ˆnC—Õ³BôÁñH"þ¶”$ˆ@‰`a%i_aÇ%ü`6 –]vavZuVC$áN‘‰I#!¦ 2á"à=‚Rƒ*_ï*0À@Ò`–àºf vK‚Û ÈŠAÆ@´Á<‡á=Ê`(€$@ÀÑÖª©eýdE¶UJÖ$PVeMTk¹gï•gãÈg++péñg ô Ö€¢`î!c5”-â ÓÄ Ìa¼Áð)S@èâÜÜa Ìà‡žÖ®£c\¢`où¶$ Oò†AÌA.D ($º!Ùf…aà>`x!šanK#þj§¶j¯6kO"’ºökÃvlËölÓvmÛömãV'cUb5–a-¶!0–|‚c©K²¼Œª wŽ× bbÙÃ=$×Ä–1ê¬;´ƒ;ÀàÎ6Uá ÊL€ˆAÒau=¶³£&Á˜€v+xKøu J"0t³$° ðA¥Ê¡yfI"vg—ƒ¡Ìv /ww·w7x]ax‹÷x“wyÃW=õ(h‡eŒi•VC›6RÛ—´à—>ŽDàpî}‘ " €üq„‡Øü8v>æd>Á!ä`ò  VÁÒÕ9«2ŠÁ ¨÷Dý+’0ƒ1.Ï¿8Ã3@#&Kþ˜/ X‚)x…µÖ¡,ƒagƒAЃI„E¸HX‡ç7q·q7rûÐÄ*÷r3ws;7M?7tG J÷tS7\ÿ*‰E`‰›X°àw y Š#B !e®˜iÍO‡ Âa&—!æ¡@aÌAT3®š+DÀ J‚  ¿¡†aŒ9ò9*E¼…Z†a›áÆ\Òb-Úû"ר‚/¸KŽCŽCŽ?#4¹è7}Ûci_ùtôw=ø7;¶ƒ!8Sh€ ˜•‘ï”ÑÊ}%êZ™4ð !f =âdÜä¡¡cHqpK´„KÂÞ$È þÄÁ< n@Ρ›K$·$^ð›Åv`š;‰ êçVH¢¤2eHB€zåWº™/‚y˜I¢˜9™—©Ÿ™.¢™,¦¹š¯9›Å…›I1V£xŠ«¸-¢õLL‹=ÆŠ½¸!ÀXŒÉ˜?ë o­2A~ûè3¸!$ÖŸä¤Qg63€ â©sÖï `'‚ÜWº ÌX¨[YVúZz¦cº±knÚVîgvz:Wv¨óªYÙ•¹–Aûtf™ j¹õpY—yÙ—ƒc 5„­ ·^wnaU±kÛ¶)Vš¡¡á:@¢}ûFÕ£Qi£Á £Ñãþ£B¤IÚ¤QZ c[§¤g›Wo»³{Ybõ­M ®ag®Á»®Õ¯õzžÀ ¯;æ¯Á °»°C™ºO5¾õÔºkS»ï¿ÿâoáµµÍu¾ ä\ë›uó›Ào{¿Ñµ¿í4Á'«¾OŒ_Â#\Â'œÂ+ÜÂ/Ã3\Ã7œÃ;ÜÃ?ÄC\ÄGœÄKÜÄI|‡ü¬ÿÛZY|?\Åc\ÆgœÆkÜÆoË >ßËáù]?þ¾áÛêÛg¼`h|ýhTÎ.ùƒ žâ_æc~Ì-^?F¾ä&ØS~?V¾åž—ú\Ha.ý‹ö#At?A‹ âeÞéŸêU=¡€^è‰~‹Œ2%3é—¡-T ¡š>êÇžìËþ²Ò˜õ¥½ÁÚ‹H£û¸Ø4ÿãv˜l>àÇyòòé¿ã«r£Þ?Ë(›EÅlðÝàÇüópK–9’Ùåð¼ûxö²YÏwð|ùc'’ˆQMÙˆ!Í…6ûª:Ž:1Óé¾”Âêeó4ÞJbIX›13FGD"C$k&9NãÛÉU^d‡”е’^”w*‡Š>ZI³óÕBÖMœÌoÊza„!,o&aš³¸8¦F˜4k?ÉìG2Ùõ ¾!¾vš‰XÞäw“ ô=>®Wû ‹­ù5¶GÒÖ5bÊuU!, 9ZA‚yARK6&).ùÈ}×a­± O1FkõœÝ1„~ú¥Ûå®4ŒÙ«0¢ºéE’Å“eyŸÆûâlu»n÷aŸ´­}ÚÑŠ×uePëtb¨—ìqR†vC%÷ÆÒ8Ûëwši7 o{/ hš™]Sá`šý›æÏqy—Ÿ¬eþ”æ«Y…m²¶¶IœèGØHÒ<÷$õ„9Rˆ Ö@;Qò4µ ÀI?6ÊÈöàì{óQ %{JZs4»z–q×2š‰¸NÒô»‹»áÜÌÞòR×~ÌÐ+×j^"¶Œ?—Ã#«!{÷Ô='¿|¼sßÞJsÍ:ó3‹3uŸzž•U‚ÜõÁut›¤÷nÕeU$nm!¾üƒõ®tÝÂOë>}ž/F[iL׎®M„îºøJh!ÒXH1ŒšvÒö'¨'pAQšÌ³Û¸úsÝZ9QJåÂÔ ]Kš,&7y‘ün{U”†²{/ÆŽõerÕNþnNiðÖ³;K¶sØ‘¶=1ì<À ¢JY°`”3:vx.¹´‚ T6“|•gÙ$Îf^¡&jVO°îNÊUÃÁÛZÁÕbÿíT-w¿?²Ù$*Šü®~Øa-[ž¤q6ž8žq’ÍDeœ—Jìdz-Z#¼[†r½;¬Y91ÄõVíÖ¾,½ëž¦×íõ;Ý5ÂlgzÍ¢»@JÀ„ú‹®uÕ s²µ52„±#ƒ32¤=Rd„6Î0$VtìÌ„i9" ILàa®NÍJó•n@4-ÖÇ`”;ŸQîW73<4,ÕÚ°Üò®+v™ D× SÚŽ8cª¦¾ÿâÆrûœQÛñ4þgÕ$øº¦Â:¤ßЭçvàq»3T„œs*D­;Ôí¸Lý6”¯ßY¸ÈZK«‘eJð|FUçÒ_˜Öþ‚XB2þCÓ$¨ÓÐH 㳂\8‰^°n.¸Oçq›Ïq‘N®“´ìÛl\Äàç?¸ÿ¨ëŒàDB:‚;X”3+7Çœë°ër^’AÒ 3‚¸L‘2M÷=_™ä«r±*7žäÝŸ¦ÓoßüÇþÊ]aå½[æWŸâr4˜NGƒeò{üíØþ¨ˆËU‘ ~ùÛøÍ¿ÎMD±5ktð P]Ÿþ#8#üzQëY·ûK w»¿Úð¾H!á"bbÌð1ÃHûR"ÑXnŸ®ho$(¡ªÈ„ÜÎ ´}²‹²“gà ˠÓ!+ k¡láŠ=Öd#…°šÞШճ2s+mº糡QgZ¬ƒ­Bb¸q¨Î¥!Çe+I :²ÓIûø½BÁ؈0Deá÷ «õ¬ÞëwkìîÖ×µ[xZ”lgÛîeT”ÇŒ™ÐÖ÷gÏO…¾Ò-JÒ>ÆÍŽYn£;äNÃZûÿØ©… ß×Ô_ È÷°÷\õ¢ƒÌ8ê@5a3ã¨ãheÅŒ)u^ƒá¦¿ÐöäÁÚàm>K®ïßÙ—n9p-—“i‘Ìí½þ¬ ö²&X݃aA0¨ßi¤Hn1Æ:I8ŒoÜ •D¬$Œ}Î<ñ¯_¿ B¾ôƒ/u(&¨7i™©ô¥b\äqØåsú½$ìb3ݸã_ÿ¼ x“£¼IPoÒ:^“ºÝe%\+LhÈÈ Âì€céÕ<Ìv–1•H(ê%ËÆ’ûô&¿ø¨‰ÁG?3üt%Ùà¯Q >¦ùÄs†ØÅ¬ëœàU‚öÛ˜ÒWÒ³óÂqØš}B ¬ÝÞ ãXXFaZ á$NÂocÖèY¹)±ðå˰ÔöZ`¯¥«½–má¢IßEiZUW w°|ª8ñiL“° ¨’¿Û"1…”vÉÏ QL—k­á)ÙÏØGö ÆÚb³`!+—4J1zE¯°^QØ,n(W“÷–"ûˆ…)P6”+j­ã¦m7J¬G_¥uØüQîæ0„&.¶Cåƒìlâ Œ.tÄÄÄÄ8/Ä0z”*[ÇIc|­ŒA;e†‘õø‹IØÈQªè:f”>&qÆå2 ]( q^ٻ݄dd4 ÖA ,Jt/a6j Ô­h˜~ £ %2222Î 2 ’Tdd´‚ ÞEàfo¡w ƒ Üdt¢$@@@@Æ9 …ÈÈh ¢ÈвȰ’ß… ƒ{ƒŒöJddddœdD@@F;Èh†—©x/1V’¤Ob2(EJ÷“щ’çÔ«ÈÈhœŽNUW‡a»$qþ4lw,(EBbãOÃ6.£”#"‰êé4ì=«Ã–Âø[‰–Žéèý•þ¥­ËÖh$˜+¼ 'ŠÑ Ç†=HÂNÒØ•±±Föºl,¹OÐY®¦ƒû‰¤?|%Ïûwo¯Gƒ·Óé·ƒËÁŸ'ãmuÏ·Uå=ßB}ÏÞê{Övk(ñÔ™üѺþsdz°þèA’% æý‘¯áÏ[”ìÓ=&ö—Etu¿‡Šõê`ªû)8˜†uQ|‡:ìp5,w._¾‘Ĭ$—¸¶~Í"êœÌp,¯eç‹T&¯ìŸàX:q,ÿÈÓûšõÖºò£H{†peƒҋ•„©6îfe3fÿ³‘,yCÉ ûl&GGj•¬¸•ùr¶¾Ð±ÂzX±¥tltÛZŒP<äFj'*ÂF*l¤ÂF*l¤žÑFª±(ˆôL¢à¸ØGmD­sÛ¥Wµ~±’ Ã¸å‡ a`,Æîh j6ˆA‚VéëDI` ` ` `Œ³b mÔc¨ÒÑ2ÚììNLnèWœ†Ím·#–‹×îÄ6¶Ÿq©=cH¶~N:ccccœSýŒáb½·Â £c´? ž Âp/Œa{ºKe` Šˆ…ë^£ 1€1€1€1Ή1¬ke£cÈÃôÆz—1LŒa€1€1€1€1¾*Æ ˆcc´dŒö¹í®†M?ŒA‘Oƒ!M{bŒ.tÆÆÆÆ8'Æ`ˆh` `ŒvŒÑºÚ†í‡Rôáªk<‰ÇàHšžâ1ºÐ㜃[¶€x `ŒvŒaºJ]%v|ÄÔôºê"‘ô“ÔU†e¦ÜÕV:ccccœcî*CtÇÅccœÌw•¼êÇ_¬{H^õŒÉ6yÕAF?É«­”ÈÈÈÈ8ÇäU¼ Ñ 2HWÉ«ö»6´‡ÜUÇêiòª+ÔÉúÈ]m£"Æ9¦®ZÂø£ÕÎÀè 0hW™«ác“¸ú™«á£0000Î1o£1`°®ÒVû ½¦7À0_cÒ*FcÀà]嬆ŒMÊê#`<䬆ŒTÀÀÀÀ8ÇŒU ŒÆ€!ºJX ›|ÕGÀxHX ¨€€€€qŽéªÏ™ücþ¹ .ZWõHs—?ÊãX‡ÌTµ’ðF¶’ÆL¸2tDâ MUíDÉSø‚$uH¢°ƒïœ…ÞLØ4/fqqœ.ð¾KlÈfIf? É¾‹:pOñµû~ìobŸë×itÞ¬_Ø¿ó"ºýðæÿ¢«¾Ç¤$mod_perl-2.0.9/docs/user/handlers/out_filter_stream.gif0000644€ÿÿÿÿ00010010000005110111727205031023417 0ustar ????????NoneGIF87aS÷”((©©©§§§äÙÙ^ÿµµ¥¥¥U£££RCCŸŸŸÿ ™™™———­¦¦•••eEE[ÿ$$“““‘‘‘ÿÜÜe‡‡‡ ………¹¸¸ƒƒƒÿ>>ùµµ‘ ÿÈÈDùff{{{i!!ÿKKãááwwwuuui÷ÿXXUooommmÿ77kkkiiiÿÁÁgggÿïïeeecccaaao[[___LII[[[ÿ­­ÿÛÛUUUù§§ÿŒŒéc÷ÓÓÿ==þþþüüüµ³³ùââ}||öööôôô­???îîîSLLìììêêêèèèùQQ…æææÝ¹¹´ffäää111ÿqqÜÜÜ ËÈÈÚÚÚÿûû]\\KØØØÔÔÔÒÒÒÐÐÐôÌÌ̧ÿÈÈÈÆÆÆÄÄÄÂÂÂÿôôÿ¼¼¼ºººš””sqq¸¸¸ùŸŸ¶¶¶)/!!é&&¡žž|®®®ÿ¿¿¬¬¬àßߪªª¨¨¨I ¡¦¦¦ÿÌÌÉ——¤¤¤¢¢¢ÿOO   žžžÿœœœùIIÿ\\˜˜˜ÿææ’’’ÿ——ŽŽŽÿÅÅ6ù55ÃŒŒŒ÷ŠŠŠÿvvˆˆˆ"ùííM „„„‚‚‚ÿUUB66zzzÿstttÿAApppù;;Kjjjÿ||f hhhÿªª fffzssbbb```XXXVVVʹPPPÿÿÿÿ‚‚ìééJJJÿ°°HHHùùù DDD$óóóñññù--ðïïïÊ##ÿ@@íííÜÿÊÊ888éééçççååå´««ááá´,,,ÝÝÝÿää&&&ÕÕÕ-ÏÏÏÍÍÍù½½PùuN99ùˆˆ¼„„µµµ ³³³ÿ÷÷,SþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ€N˜É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ð*…-[Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª= !éÚ·pãÊK·®Ý»xóêݶ-¥| L¸°áÈ+†êðâÇ#KžL¹²å¯/kÞ̹³çÏ ¹fMº´éÓ¨SÇ­ºµë×°c‡f-»¶íÛ¸sϥݔ¥ßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ä„¢þòfZãùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿ(à€_ â¹Õ Ú4èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,^øB‚EÅ`‹4Öhã8æ¨ãŽ<öèã@Bø"c >5cH&©ä’L6éä“Pþ8äSã-ud”Xf©å–\véå—.Âè˜SW‚iæ™h¦©æšl )¦ŒmÆ)çœt©œü2„2Ô€Æ:ëD“C)†¼E=NéT•Ë”‰è£F*©„XøQ‹3ç@ä22)Š6Ũ£Ÿ–jê©]ª¡3¤:þÈt0ôƒ‡sDâJUh2>Upr(ª%†ÊÔ¨Ä&«ì²AÖqŒ>­órt£á§T-ŸD³»²à–kî¹$š¡Ì@ÊLŽˆâ@Ž@ôx‹.†â.Cî½üö믃–<À¼°b?óP ÿJ˜ï¾ G,1ª+§+öƒút`ÅÄÚ<\$™ —l2¢àA'5†ó‹ÅÖJ,rŒ žlóÍiÎí8B;L<ó˜M‘ŠóÑH;‰T1:‚Ð*2¿YsÒTW­dcœc&*{¡fÐaÈ œÒJ ²ÔRC=s‹+DÒOk §Õxç½ãþ1ðÒc5Ô¡jì3Á hD†&ÐP¤ 8=L"Ž™vO­÷嘫h….¼Á#·BH88ƒÎ¶}‚NCü ·¼°ÂœJ8 ¡8êƒÓ^Vndæ§ÞB ƧøÂñ6¿€.<®á+B#óB'ె×®1º¶=pË\ Oò™Ë£ØÊ/Îp8‡?´ÿ`4®/ÿœ?Lˆƒþ%柢ÿ'ÔÁ# DU@ƒ,"Qà­H ‘‚@ôŠ-™¯hià‰~Á¡pÏA ˜#´¿ NHƒB!ˆTH"J (EèP-áÁAÌ¢tA¦Kþ.Ñ5DJ¨ˆ[ B-„a:8èèø…!ñÄ(N±AµˆF ŽÁ‹XCJd¢”…ô h ÀƒJ‘ƒ_ ab@xñƒHø¯ŒgL£ƒ^À>:CŠåòÕˆh)ãc<”Úð|Tt¡58†dØ üàAøbçXÇüeq‹]Ô¤6ðˆF56ˆÎð# 4Ä ÁàV\ƒFÀ>#BŠRüÉhÆRî±l¥ª0Èp!…'”P2à Rì²BÄÔ†1T‚58è ˆÐà PR¥GƒªyÍl:(8G²Ì€‡t µ ·vxª~üŒXþê¡•€äŒoEcÚ8¦6 q b òf3Å©e6s—äl6ç—Î óB.¼hƒ4ʈjc¢ç¬h’¨A²ÐB¢6Hê 0äò= $:Ѓà€yÚ „ØÐ—ÆôA:-êPŠc„¡q¹±(ñ¼oAIŸ’ÿ¦Ú  4¨â)J‘ÙÓ\þÔAX…F+”Q[¦T™>ýfN™ÄR™TB[u@ÉêV)õA·àC]Vmðô®b”F Þ€aPFj…V”šʲBðCaaÐT+k#ª®´ªºêN× °ëX)TV qTB¨eþ%[÷JZz:ȶÕF˜Ù S„ÐBmÕF& ¡!Äl8MD¤Ì —¸f­“;J0ÙhCuÈ­¹ž€s\(X‡Ê4«Èóùȳþ‹Ä75€Pm(×AÍmÐn úÛáRHµŒnjáš[ûêHµ@G´a tÔÂAˆ/nQ3 XÁ v°6~Á 4䀶P€\àkà Bö 94hFj^¼K”˜#RA |8Ä#.qƒjK)Ž1NupÆ@<€ ÐMbÝøDç(4ŽLo¼9ÚìÞ€Ž[X Жd‰?þ@”0–1mLa cØA 1þ‰M¬ [ñÇn–"gµq‹ÿ‚Ím¶ó‘âü‹+%xÁ nPšsÌf>ÿxM«%„‚,h(ƒê4ÙºÔê CÈBÉ¡y‰D³Eª)ÑŠN¨yª ¶™0©Á3ô¢\^ ":Ô7‚bë)(†ÖnfTÁAî(F«¢‰MSid¶N“®yÝëí᥹4ÞÞá+]è5irÀ:´ñ>Ãä]8²¤±kcûÚ®v¨Á Þ0@6iïPغ’© z€ŸÐÄ9…Ž0@—Dì–·ÂAöqwÁjXCVð³…¬Ãæ.Èœ5”ð…{Ü_chUþNõú©(`^:j°l„ ÃAáÇ!ÆÀ6¼A>€‹Uk~üçý É[4‰h‚a+ø…s+TBõ`E=À ¤†dKŸP°u¼Fo@„çÂ>v±kƒìg7;Ú×®ö¶—ýíi‡;Ûåîö¸Û}îw¯;Þ÷^w ·ÉˆÂгQ«TDOOQ8ǹÃH%C)TÜÂë=ß'Žà ,ƒóžýç;?úГ^ô¨?½êMÏúÒ»>õ­‡ýëW?ûØÓ^ö²7QAˆQòÞ÷½ß}ð/|à¿øÈ'¾ò‡Ïüã/ßùÍO~ôŸ/}è[¿úÅO’)þÍ¢_‰s\¾D#À:…æ d‚»BùW˜ÇiDãs9¢g¡X"§+Ë` ΀ (hx¸Øø‚‚#(‚h‚$x‚%¸‚*˜$ù—7ÂAÄð.#äQ õY²®ð #`0UP½Õ^ ‚N‘æ =P·à&RÐÒ’ÀflÐt#òu4hc0n%âf°…tñL@BÝõA+ÂAkÀA#äR^õM,$ Ú~#‡ õ sµV¢ àðb$b ­2j B“5tÒþƒP‹m"-ç¼À¢…Ù]h"`”iA†A‚rúoèR áÇ`N+ pxÁ˜yQ"-'1)!’h”[Q‰&"–i¡‰Kò*Óxæ2â5dôpÎ 0l+"y("¸!WúÐDrcÐQ‘ Z1#ðy„¹“±ŒÍh–eJbFÀ1+°ŽÊÒ §Ð*Ðð šÉ"Ü´ˆöX€š"˜†Ñr±© °³I›‹%2’iM8Ð8ààšè2Å-è ~72¬f“¢‚“©i!X .f°îðsþðd Q½§ @¹| “p éÐ Ëð†Y  aØЙ€ËàQ k° ©ÐÝ –P §`›LA Àýðy­Ð ÐOA ‹1”_øž½)H©$„0=è§‹†  6@>“‚€£€#)s Îy,Й•Ÿ@§Ü©è`a¹ˆ0Op Ë ªK NQ›ËÐËÀ†yKáyÀ‰¹ ·YM° #` PÁ†©dy‰Jhé$é°±¦a``·Bœp ±ß9)`P 9‰-Â5*jš7yÑ!€ã*þ🠠šP ë€ý¦ÕÖâX° ‡` ?ºH*¤Ë`¤L1›±i Y¥ŽI¥—ºSz›%à·ù ™c*”ù$Zp “ ^÷)-?‹'b PZz‰•Fccpã0‹ò–Ì–ê¦ MÐôI”A@Äîé6 Ëð­~Ð`€rÐ9 X0–0?‘ð 0Ëœ@ œÐóÊâ“›½8"¼ùªa±%Z@8À'Â:²À0Bö[¦b­Ò§-Ò´¢ãÒ¢W!“:!09ž‘±šJ"Ei°_qþ¡f²1²t*OÐ*<Ó" ±~úœ€š“R]ñ/à`ɲS¦$B´`Q¦i’)>ˆ*Àª"º"(ÇSG¬"â³*à Q˜H;®Úµ[«h´Ê2/­Ð" ¤Ø!{©! £Aà“¶O¡›$R°t›l8J˜,0+ò·kË!m›!U Fà9B²y›²#²²y{. &c‰ÄÂÐl,’`ˆÃʈ–ó!Q ¸’£‘k´#¹Z¡´hr ‰¨,Î3k+‚)§±ú±(.0LÁRÀkCP¾» ƒÉÇËà[Qµ ù)_«ºU!¶gþ’ Ã$y tà«'2T«"ņSWhµ¹ ¥Ë x0è¹ áQì뾤کMÁ‰°À¼~vK°I½VÁ&ÝÀ9–$ï°-  ‘ ²*2œf)b†ÿWµ ëi6¸Qñe5 0? `Â˰L\š¥@¯ã@(¼ YÊžÝ*Ãï [ t€ìð Ò@Ž+"+ÀR1¹`" ÝÕ¡A’ⵓ ¬Ä%¢óRz:ÁR˜³,º³ÑY#¦+±ùÅë+ ‡@ŸËP L! |@ UÆj¼ šJ¤q¼füp  à¤NqÇ˰ÆOÑþ¼K‰,"Dl¬‹&á°1UàÀ@’¶ë°à³› P "é0YÐ4ÒWlÁ§Ùˆ6›¤›X@À©ºdl¤·Ù « ÇKQ›šj¤ârǪÇMAcІ°!pÓ[ÈPa½hòJB$cÀ1É>«>0MË!V ¾r¤Ë"Ü5yå{ÁøÊUq ì ×`ÎËp· ?ü£/ NªôËà å ð·ÛêžüÌ­aXdœx0©tU@¡bñ¿"‚·Ä ròœCë#TèÍ ɵÚ]Ç@Í¢–P]a`—+€Ñ!Rþ¸)¢ÁWÑ¿»âL!QñÊQAÓU¤[á ` ܇À \è…*«ÐÝF|&j€CX‡U|#X°Cm§À*ñ8F°@epî0”ðF°-šO½"„Ò ¢Ò(ÒÅVÑ P “ ê«wMR0fº„|ÔQqÈl" ˶% ·7Râ ,s!Ý@à }¹Ðš*‚€ûÍŸº5"¸| uà ØKaÌlÒ©ðdë‰P+rÍ%šà²ý²0UP §¨Îp –à@:¢ÙY÷¹Á⬺ "mÚK)Vþ`Ç0Ùš  0ýà˜}!cÐ0p¸\ùÄÝ&XsÜ)m¾7ÂÒ]Ä!2ÄÐÔqÒ „ U°• Ú – @~€tPï€p A  Ü UÐå d$a»ÃÅì×!ÝO!ØÒ-°FçyñUp ‘ BŽÅ«Å.ºÜa˜KqM¼Ãû»Û»¿›¼Æ»˜5μY"̨áLÚ¦Ò kÀPh  Ê Uà'è°ÕÔp 9 Û)sÐâžü§¨ã2œÚR‘¾Cھ蹪«Š¿+läËàw^nDÍÙþdÊ5ÂÞNÁÁ¬ÿ š_úy, Â"LÂ&ü¤)¼ 4léíYÃ÷ëÄáÞ ߦ-ßxÎ$e nŽ»8×PÆÓª¾‘¥¦ÊƲ bLÆu¼ n¼Æs<ÇeÜ€\"vÎ>êNâ<{ŽÜ}îÙ4"Ê_ÜL @ëõ+ë¥|ÊK‘ÊË˵,Ë›j%M1 Ál¥mÚHnìLâÙëâ· ã[–ã\Îçl`  íú®ñÚ¯ö*Ï @Ïé¼ÎíœÏðüÏþÜÏ=ÐËÐ…ÑÜ òÜÐîZÒÝuêîž#€Ž.Í1=ÓV¡ÓKÔ†áéþê€-ê$˜«¹c®³eþî$¢êh!×ty}{mÁþ!þÅžòI™kñ/¾ €°!EnççôA¢CÏîþÙÔëðR ô°ÇX!oÚN%fðîãé,ä^ñóqï#éÀ-u¯ÜÍ.ÿ6.˜Sꌿ©=俼¤M!5š¹ ¬ R䫺¿Ì³?±oinñ»êMQûTÁæSÎ0 ? ç÷›¿_Ñô•Ï#‡pX™þÎT·ï¹¿l¾¾n^íÚ/çeaõ Â9q— !¼Ÿóù¤ôªŽÎjð `  ð¯ð)Ÿdl jŸø¹ ‰. Ë`ÿ ŠÑªS‡.Ë Dð‹Á¸e‰R\Fà`Bj–ÑaÀ ß2 .[q°UžnKEefÙÉ”a@„S¦Am5mÞÄ™SçNž=}þTèP¢EuàÁQ/fB@ØÌL˜ óWK Ä¹‹¢`A>‘&ZVölL–*;ìâÐà  Š+vY·L–J¡Å¨Ñ`H„Ö–5Y‰Re[—Ù}’–UòÁ1ëzꊚY3€u°Øþt§’ÁF%š6øÐ`$˜£—•^V#c-<„tpDìÙˆG–yÚ ðˆ…ËfÂ7ðeµfjX½ ú2ÖÍ'_‡dUûvîݽ ÞÊ„*•jøžô®/SM=œmÕˆ&<¹¶Ì>þ˜Ó«ÿFm×JYf¾Û–ÉÍ ÝSÎ:ƒ¤i$>¤‹Î?ƒœ;¨‰1Þ“Ìš~8 «¨‚j¢¡g39›¤mNˆd„ï I`:í´²±ÜÐm™ËŠ8#g 5ˆ üb¢M;]N(ádŸ& ,&°d„ÒqÖ&"QHœ˜P(êšãX’%UÔ^9ù5Xƒ ˆ ¦tˆÉ ¥k³U©Bi3Ç%·\swÒâËî…(½1c*sÜ÷@9µ”qü˜µÖe0  Bùõ×Zl[–a žÃŒ .x_ZmÅUW^_…vj RàHÙVÛ»ýÖ *T&-j`üx¢BA$‘(ÍŒ>jª¡G‰+¹gŸ©þ'paû™¦s!ù%‡„éÁ¦~ø%Klzágè(æ—_jÊb…z@ƒ€sÇ&; ô=1׫ëx.šJ¸¯ ú '#úM^â^¦²ž< ÙlÓÉÅâì´cr—m3Ý»îðÄŸ‰êˆ1p¥˜‚oÿ^eèÈ)nH2ÊÈÍÆG^yÚŸçÐJsƒÀÉŠš~À‰z›ˆÉ) ­µîAòÓÇ×ÒŠ¨V‡©u2É…þ æ“o?þ¸{Òg3}Œc'Låç¿ÿöÅ5v‚½›h¯&[É3þÈ·ÀqA.⻢>x•ËÄàdNF¿ÌècïèIÎ28BRé\œÀ€MšDB|ÚÐÀæl‚À›Da Äa–ê÷™†I=ëk[ …xA¿ñ$*ø~R¸!6qˆ3W)Žñ‹[œâs5±DÖ~05œýZ#^M¬Ð ä`©È_Õ¸ú]q;œÖÚ€ø:'Öñy¿ÛI7<ð v&“ƒ?é­Ñ‡àı.¾ &ñâÒ %©8žXA CÙ_¡&¹IÅ‘Ÿex7Fªí‡d'Uùž vG„¡Ä*eÙ³PÖÒ–Ú™JÉ:9¢ÒLn›e0!þRDî0‘ñf2eÅ[6Ó™>IQ9v™¾^>’\°Sf0ñȘÄ2›ßõ¹OgÄbÿ¼Â?:ÐØC (A Ê. ¡ ¨(êPˆT²èC+º‹ƒx'“‹gH=YN’6óC:'¸Îƒ´ÓiC0hQ_,¨GNušSZàbƒDJ Õ¨»8¨ â T€jT¡jcЪ_ „¤*U8 ÀªTÀªV·Uœ WÍêX£ª„ÀB©LuªZ©Fœ`­äÎ+—±þ‚„ô›%ì-1c•Æñ”Ö âAØá%˜À@ˆ@;YʪƒpìJÊR6'Ø… À4P@´§Em;T!Z_  ,@mjWk€Ö¾6¶§­€jYëZØÞÖ¨khG[ZߊVƒ°+1·ÃD¿†”™…®!1£†ÂZŒ¥Rº&DBÐŽÄÀ>è/º;Þñ  -X° ¤×½ïUÅ.1ßHb¾÷ů Nù~!_Ào€÷Ûßÿ¿)ð"ü `Ï7i/}íÛàE˜[°ë6·Ó\‹ó;c@Äà@,âkcÄ&.ñ‰Uœb“ØÅ(~ñŠcÜbþ×XÆ6¦ñuœcÏØÇ8Š&ÐÇšÒ‘ìLåAB0ˆJT"ËàA“¥«ÈŒÔÈ €gx†ž;É‘ì28„¶%É•4I”\•\I‘¤€–|†”ŒI™d…ŽüÈeÉ›|†>†y°+¼êE쟂ƒ¨¼ˆCØ~ ŠLÀ” } È~3Á 0Èî3¬#3¸Ä2ˆä³(‹3ô«„,Û²8ë½0C=×{³;c3:³3Ô»¿:ƒ³8ã½=sË?û¿&´Š'„ž.`€bpžžá~+C(ò¨…CŠ3¼J¨ÔJ¯|C°¼<›KÍ{2³d3´TKÔkË>{KºÌËþ¹|½ºÔKÔ”Ë1ÛK03M¿Œ»e(E«˜LIÈ›8…Ì ‡Ð¥úÅÜô+aŠ­¼L42|)%óL(C=ÑÔ2ÒäËÙd3¸ÄË×ä2×´KîÔËÒô³ë¼‡\ ¾eð¨p$Î&úGè€Íø„VX¤HÏCÛÍ›ȃƒÔÌd¬5²üÌèœÁ´œN¶¬Îð3ìdMÕŒKÔãïd3°‡}Ë`X…A#Jí°·ù,¡ Ñ„Rp£›°J §¬Šû¼̤9Zû%í¢$@Oà5¥ÑÅQÈOð„BX†"ÐÑR{p€PàI"EÒ$õ2€"Eº HÒ(eþR'=¶(MRqkRxR+ER H7"5Ò3àR"õxc‘+&’!QZÌœJ9‡ à!›Ì5Å· ¸O?ÐOæÔ’9 …›Œf|8»Ž‰«¸i<ÔÉȸD• Ž#T |»êëŸÀ“Œ¼ã»ó;À#¼¾éT¼;¼&r®¤9(ƒwhƒ5`3ƒCƒ.Ђ( ΰÒ_´Ól2Ο¨˜;EÆ8¼˜ @…cEVdåÑ8V…/Ph•Vi½HfˆVE`&ÐÖmÝÖ>X†>ÐÖQà‡\àÖr5ˆm×råÖsÕVHWuÕVve‡l…W&ðVpe‚Qþø¿âÛŽãkŸ¹ñ™äƒˆæ{Å%Y†ès"˜›ÕÌèÕ†E‡H°ž\ý¦ú¤S_ÝÓ92“ñÛ¼<¿e3õ³AÔë?ì”?úƒ="Â)³¿ýã²’ý¿ µŠ ‰­èН ÆS ´ØY¶P Žðˆ¸P º° ¼Èٽ苿¸ˆŒØˆ 4‰Ÿå@„>Ä e‡0@‡uX‡j8MÐ]øzxð€‡mXeè£M¦½ë;¼›ˆO¥’¿sŸ¹èTK-¼P%!åU „Œõ¥äX6+? ½­Aö;—MB“ýA”=YÛ[Y)kÙÄ2˜­MÀd Á„‰øˆ©ûÈý˜ZŒþ+dŽÓ¡6AŒ.´0ìÂÃØjSœ¨…Y½Ÿ¬Óþ1ùÝ™X¾™ Žà½ƒ‚p†IˆŒçKXé"¡ ¾õÛšã?Õ<ÁõX´4ÜõsÙÊ]ÜÈm²ÜA–UÙò•\"dÊ•2˜=y»M¦x4Y“™“8¹ß:9”â=!úõ“ i’@1[Ô$EÑŲØ[¥â>›ÀÕe0ƒ˜ÁC@4–· ˆÀhÚƒ¸àL‡VX†7xŠP›õŠáV‹€ Š`†wœ_±˜È¸Ç|ÜǃèÇZÏœ°ñ€€5œ€= ¤˜B×…QŽŽ?É‘ÔXÅæ_åߎåX6e¹ç¨ÒÝ Z`mˆ€"KÌËh‚cFfdÃcÔg|TÉ0T¹Æ¬°FF¥fm,T]€o”Y¦ Y!!XΊ¥”Œ¼qÊèŠØ ÀêÚ‰UŃˆgê˜á–çVþþØ ‘4qe}.X”å»`â°ç.”[tÃþÑ[Ÿøe±V„Ëe|†+;°ƒ3àI‹Öè @0¶3øè‘&é%…‡¾Hu é•fR”^•^鑞ɓF”Ži™Viž¼éö‚`À‘óÍ…Ù¹ ÛÁþIL6 aðÍZ JžÌt€à0‡t\Ge–gуÈjuÔ‚e JÈ€ (PYSA²6k´n–QbacGxŒk¯&äi©ˆˆäÑÇ@!¡p¸Ý¡pÃæëåX€Î³ ÐÑ$PÙ4P.CÐÔ3…MÍæ²Øä³Ê&³þÿ‹ß£ˆŸ÷a€ÃÌÕöø„€ÌŸˆà ç"gÉ› âžPˆaÞÌ#vNÙÍ1“εd3ð<ÍÕÄìíTn휲»LPØDnÚ,Ïó¤Ø ºdœxVN "£¾n*éåÝîí‡ÞOaÖà.K =É>n ý3Ξ2ù–2è^îçžnñ jt%£ ïþÁ¢1mÔæ›ÏÕ…Öm ßæÏUïÿ„ìöÐ÷¦ìä^Ð8£oÈmn»ŒÐ ÷Ëf8Ó¡VÓÿ–ŸÃfŠÞ%qN #.RNY;ïìR2 1è…>«ñ×qgý‚^è…gXGðñ!'r{ `"àþI$gò&/I]†Ñs„&§r“Dr)§ò&7(Çò,Gr/=ò$_r/†>0SÛüUnJñþée¢ˆí5Ÿ¤Üæ ‡Gïð V@•Œf¾lÖ iž @—‰EŸxæ¬Ð]èƒê.4<!k(‡H—ôI§ôr`ƒJÇôH—ƒ1ÈtL?„NÇônõJÏ™ÈnÜ„sUêåc2o>¿¯ÑYÿ†ep½Ñ/`†]çu^Ï6OØul}…a'vbGÄa_Ä-(öe7bçe_vboöawWhöW˜öW W¸öa?öWØ‚{ \àï¼òo™‚XÐ…ug÷vw÷0†w±þ•÷z·w28`˜†iðÚ}÷÷Ÿ†8}×…sЀÿwXÈ÷i(øƒGø}h€‚7ø‡‡xpx~׋ß÷…™p ¤Tw"ç‰!€zu NÐÓ›pyœˆyœpÁìMâíÙ1YÄ%ÙðEßñBñ­ûzûcöm²’Å…{ Ì= ¢6ˆ)ˆ…H‚$À‡qp@¨ú­ßúÏ2‡l%¸†%Ȇ²7û²'cà‚²?‚n(€@8{³OQoȆ@h†nÀ‡¸7{%¨û»Ïû½çûlHû¿Ç{½|ÂÇ…Xûlhû·ü$P‚vHeº’Þ%X’"¡@yþ•q‚‹q¢¨†¦¹‰ÑÇ ÓÇ ?m`ýÖo}EXE`ý]hQØ…ÛÇ}Ü{`…Û¯+Fþàþ`Ð…`þþäg„u?~å~æ~wþà‡þºäŸ~â7þèÿ–Ñ6Šë@*UÿjX‡?ÿó?ÿ€\~â×…˜~Ã\€… X˜ÿüÏÏûý\q;1ð½ TeP B… ¶KñBXEeײ"—Ðfò$Ê”*W¢¬±f$¥‘2gÒ¬ió&Μ:wòì铿-–+Ñà$ôèÊ5! ¬æ ¤R§¢”©ÆÖ¬Z·šþÀç+ذb •cö,Ú´ìÒ²EûîPÛ¸åâÆµB·m7™,9ùIÉ×o_““öÝL±È›·Kf!nì˜Ë‰$’ñQ!ù2æ]æ*Uj±ìçТ¹ˆ ým٠ѢI•æ|:µêЪZWz;t;Íœ=ƒ¾]‰ «|¬h¡jü¤L>©~2oîü9ôè4KR- Ãñ£Ji2u 5;x•ÒÇ“/Ï\K –Õz¤\ßž½É ›“!Ógûú÷àwçÿ3ˈñ¦±M -ô²Œ# :ø`¢8X„€>¸„ R(†…j’a vè`5&¸`ƒ#¶À~ÄRSxS½¡ LæÙx#Žþ8‚b1h£JÛÍÔÝS4E$xä¸$“б’)¹cÆM¬ä±“%dðÄJ?;uÈNo€¹Ó9cê—;!rE>iÐI”BUAÇH“4y'žyêEU”§IBÊDäw€REž‰*’5ýJ#N¬Ã¥•VzÆ2•êAÆzê©:Ëœáip˜zê©<,ƒ‚©@‚*¬¡djê#¯Âzª¬<œ:­·ë©”ê몲z€pæ€4užäÒHût±(µÕ:U;Š¡‚ŽD¨‘ÎJe-¹L>:}¾U"+lñœ îËlšn¾²Œ-œ‘¦®ËèÀküú+þm±õû/g¹mf/¾œQAƒ²Ä‰‹\¹[¬S³Rå@Ý.ÕT‘39±P›üzÊ—®oìræ.¼òÒ»ðm÷æ[ɾ¾ pÁªíÌÙl#\‰ÂêÚì0ÄËÎD²63žü´É;RÅ xÌÈ…2­’’P{­Ó“NÉòm.W³oñÎËY½57ŒsÏ¢ý°Îwh?ÝvlGÿFÃ6J'És~}xµÆÙ€+W™u¸[«„¨Lkœr9æ™k~Ê1%xþ9è¡;Ë¥_Q:ê©/`*¨Ÿ®ºêŒ¾Àë°£.Êì´Ûžº(²¤^ûî 5úhN)ЛÙhߦöÌF¿þómsãÍ™ÞA×=tÑ ßL…"~(2ÓÐ">~žØNU#8>(ä"K.žLmCK=¾ õè¿¿þ´à2À €D!€<à.N*@„ø"(ÁšÀ4ˆà! N¸ 2¸AJÐ'¨5HB *á°X`¸B*ă'ɹcV|>üáCÕ~³8"‘è‰e؉Á)£EU9ŠÃ„³èˆLA±VY”âyÅj`ñ‹P c×ñD3‚ŠṖžð½™‡dä»#ž2†”[ ëûVûd2²÷Q,$ìð€L` Dþ Š|$$U‹A(r¥$!ƒìÂ`(àÉQ’²ªð¤/²”§4@*WÙÊQVÀ”¨T%+gi€ ذ“Ÿ ¥.=)ŠAÜ0e†ZÙ¯¤“,m©K:ùR˜Ì”“2ñ¤iÒ "ì8‘ÌiйÀN\0†ž¤#Nê€HÆ€Næ€3'pÂ’¤6•Z  ¸ÜGÈ“t-$!hG bà ôÀ=èA ÐŽ Ђ,Ø*щªb‹¸h$qÑrÔ'ˆÇE¿‰/p´¤ éHKÊQ‹€t"%©J/š‚4X£é"L€‹-Ü0l†Û¿€ TaþK*R“Xˆ¡©[ìCS£*Õqƒ¨XUU³ªÕe•B*ЪV1ÔÕe|¬YÍXËjVn´ƒªVÅêZ¹€Dl&„›˜áÊc›D  >QÀMöšŒ„°9bG"Ìu’q°C|J AÕ€,î’| rŸ'¡œ?Á™8dJ]Þh)8£‚exB]ò¨Çh™¨®$œÀ œA‚€ÔUÛÛæÖ7¾Øm%p+uùb°­ií0Û`XÃËž¡Š·0I,ƒêR^Q1¡®zñF]гÍmèVÔ¨Ëzã…Ím²×]ß<¬®2Ñ£Ê^‚0üB ô•Zщt!þË ~Á5,ƒ `€3W >Db§Ð‚ Љp˜!“X§Ìp 9øÀ] ð€qRŠ€‚J#.1NìàeøW$`€+ðÐa‡#aÇ'¤Až[œbŸh ƒ,äA"É[ø äHˆü>™„G80–á'S¹ÊøÃ#ˆ@„-n@Ë^þò€P„"l`M3šÓ¼2,a̪âAšãÌf7g*Îiœ‹ðf;£Ê3™ÍÌç1/ASÐRHrÈ2êZ×7Ø]†v}ÃÝÏx—6àx/ójZ5ê¥4{“&1;C#B2kˆÄ°!qu ¿ÖB$ˆþ˜À®Ñ¿.#– Bò ð:Ö ˜õ2\} „$Ë`v¯qrë\¿Z$R°ÆBbld×Z$M'yê dhbà †|°W``„ÀÃ4» Î&Ù³…\F¬“rüá;QÆv¢2La'߉®Ø#à:ÑB0ÄPÌôs>61g}Ýwq&»Û]Øzoó]ò†×Ò$¿ §O›O÷æ6À7'æMœ €”С²•-‘”@&= –qK4@$‘(úH2Ñ/ãç"ÙyHZQƒš@›Ï‰Õ¥^“ ½Ú!iBª¥ÐtAÖÉœä)ñÌ`{kÃÈ›Eþ²H”,¹~⛘¸;Þñ~€eãî[Å6$!øÁ>Tb¼"|aÅ3žñ³XÆ,~Ì£ñ– ã)oùÆc~ñ¾Ðüæßy øBнy ânè)”~J¥‹O·º7 Üó¾÷ºÁ İŒP¿øÆPñ)„ ãCɇ4ó¯ Q<ùÑþ~üá_ø,rÑ›˜–WœäÁ%˜V$,Ž^ x!ÁVÐp‚œð+t¼  x‡XhA:@ð¤C+,ƒ3\ ýÙŸ_ÁŸü9C9ÐD:C”Øf •P`MðŸÿ±¸(þD,ÇÞ_0]HTÁì‘Û¡„ÛÍÜ…„Üm há›hù>,*pÆi¥–oPˆpÆk© 3,C/pmÙ–o„Dh×m@!gl’Ná2„F ¡o$áVB¸Þ A ä+€À¤¡™¥!¶! šN\SN@“Nˆ OPÓN¨‘3å"(Ã#¸ ³„|݉8¤ŽLÝO "y¤šH/˜‡ùÄà Ò[ܱ“íàmôàVBª áq݆2¡ÆVB)ªÆ)Z¡º¬"Š¢2¡â¡ K2a øƒ.îâ.bJìbp8‚0ã0ÚÁ20^1.#…Øþ0ÖÊ2c3£.B4ã4 £°äÃ5 £1"£#äƒ"¸×HÔÑÄà:Z[Á•|yÖ$Öà2ÜàÖŒD`blh"¢–'.CVÂ+ÆÆ(‚a*ŠÆ)dh¬¢ArÆ**B(d,‚á=€–  SM`\Ë,¼ Ç-̰Íñ¨†ß@ÁØx•äИJâ߈äÛ´—àŒÓÌ\:Ö¤tÈ“$~ŒwDŽgÑ]=P>3ü‡ êY@™ÙÂâ± žSF0ÞðÃ%8%á…ÄàQ¥UV håVR×2 (CS†%TJ¥¡9—O P]dHŠFòtdl0H:þÏͤϘäôTBõô¥ÞdÛl¨Ù•øÑ‰M&ftÄàI¼ãNê“gå`¾í¿ù›NœÀ)\Nh&NôgÞD`æÃéÂðÃs9JtáF– É)O]~d%´¤hŒ$`ò¥ÐÌm&Œl††ß<Ì6"ɈbçOD"Û9fÈt–½1Ù0l‚sš™sF§t®Á$C§l}Šv.<Ã3ìÝx§xŽgÁxg™-Áx®§y¢§Q­çxR@{>Cz§xR+tçwŠŠ}zgÃ<ÜP¢Õ¢Á¥ºÌe̬MlÆ%o>Om"ÌIîeJ>(K2(gô¦"ìÃÉ„9Š q~èOþ´ã>!§Öx=î iñ€iéc%¬Vkù&×l—pé–Ö¨o°bpõÖmláqɨo„áë-EƉEÒI•’–Ù,4Uõ”Fi”&¡D)–fi–bg!`éi)˜ÞË&`i>˜j©˜f)i–¦)–ªÑ°)–r)™÷Äœ¸Ð$ˆîiMàäqêdrÖ›½ù$Š––otb‹²–ký¨l)òhl<êp娤ª‹Æ–ré,¶eœ¼%’*SN0ÓNÈ!NÐaNØ!™HN ÉJÛ|AL†Ä]‰Ëø9‡`5‡´ÛH4‚(ƒeòéx0f j‰’dªþŠ*‹ºè¢bêŒÞ(¤ªF¥Rª´NjÆh£ÞFæÂ¢fFÊÑÞAk1ƒº.Á2<ƒº¾+¼¦AÌÀ à–#Ð+¾ækü¾–Y/äk¾^¿Ò«¿l¾NÃÀÎ@Á,½fß¼Ö+ƒ0,½Î9Š„ˆé ÞD~íW˜(à2¼ÁrllÔ@D!̈~@9¼@ÐRŽ ëµkÛ+OîÓ%ÆÖ²Þ¢:+Œ2j¦rkµÞÆÑÆ$­jp€=ír­‚s ( Ø¢V‚Æ9ZGzœ¤¨‰œÉ¡—jdšÊ©Fʉ­§MZËÅLŽÚ9òĪi›¬ùþ•«V²©«€Í„Ý.ƒ”Àœ‚Ø}¸Ù,s\ìûèÎò¬H„ ,‘?@.åV.>ˆB>x‚'ÜKh®ç~®=8€¬œÁèž.êzÀÃè†Ê .ì®në.ÃëÂîéâë:€ëÚîíþÙè–.ÚDR\EZÜÕfímr"‹3?‚"N³2d3«â3ë(já?ó4Ïb‘Fɑ΄•àâ–HÀ7w´?dŠ6G tô7s³6'ÃH“´6›´6W£J¯´”y³5qôK4h³ Œc¬Rmžz/>ï©ýºã> jOž¨º4¢t?F´hsB?óSkaTW!+ sSOôh §F‰§ÎD lƒ*o‘$üG<ðCœ5Z£µÈ Zïæ…:þhnF¨ÜØM%¨¤„V(^:Œ<´„_v°A"HÅ ÿô‡ê3Ö<&?#«Qóò&zƒ(BZG6…`ÃY3e÷ÝÀyð¥ñ(\vH?tv÷}6ðÕ±h_iß ˜åegöf¯åijÂcÔ¶¸@ dÔ¶clƒ”AcìB=Ìä"@U€*w B>D,÷ 5÷sG.H÷ Q·1‚p·q#7РÔCM ®JÔ3@ƒ<>KÆ6qÚ²Pv VârÒã 4~çw~~ûïe.ðM°ÁÝsMx&ÓDh¸Mh.@iòt”X-MTÀT¸…_ø4þLƒ…3B;t¸‡x;üÁx8Ѐ‰Ÿ8г+$€‰§Š¿8 $€Š›ø.À8ŠË8+œ¸‹Û¸‰ãø‰ïB‰ó8 ¨8‹Ó€<Ä€MtèQàA4hÂ)Ø@f!…{ «yoÍu?ûÿ⿕ئœÁ—9™   lÑ 9›·¹êšc§:´9¯nœ/ÜÓ9›Ë'œ£€œëùž+™§¹¨:š{A0`ÃÄ© òNyÅHPÃ9€‚hC-¬€TÌ\؉£×dPèPÓwQû3gÈ€¡m³*êÐB«£^«ò¶Æ†Žâh¶B­¦éV#IWw:µ¤pJìCTþ'„ÃIì=!E­ö-¯ã‘a?bc¹b“:rzl­ªß†¶mlóŽÆ:µººµÂº¥fûl2¸ò²—‹ˆöC°O@¤Ä-øRIJ²§;âÀ7¨Ë÷±.Ùb§èŠ ¡Ðb»­-¸#mÁË:ÓŠF4)·Þƒ¢ÓbÕ¨½+Š’k!€Ã:d¬D ¨”ËÄTàÄ#N•3Í•‹z–ë Ïþ»j]{l{«‹»o$¼T¼jÄÀÓ²zÃ7Cñ2úÈS JB¬ƒ%l¥¾]!ªíh„/^ÑEáwµµ‹}ûö±ì±bÏè#û÷ïÓì~þ}üÿuÑ¥¿ÿоü#оû AõãïÀÅ–cîrÇŒ”F°æ 4 ¡‰eHƒJ\¦Ãe9ŠN]¡Ô³ã÷ôá奩 #t)%鄲ÐÇ숊‘yz×îwûÏùÇ6~¹ï=Õ{¡1~ùD0Ò š_F{ôË-ü|üÛVÜøñW·8‘ñI•KÈ8Vð‰Œ&M<·Œ ”ƒ€¹ ]¿FWA´™ïxKäN׺©™fd°ÓF‚dwåé`ˆa†CÜÈ~tUøUáÙpjÅ3•9ß`(–ˆ¶Tb(pÄ#  Iœc…H¬£ D*þ =ªq]ÐÃð=tñ ,ЇžêÞ½Ê6Æ ˆ \^J(cÌh†3žhHcš8¦f5­©H?ÞКãXâpG°*3D`XÆ ef3ËÈ ¶.¹Œ×Äf6µ¹ÍAr”ưCx ‹rB°A†ZXˆàæ@¡4:I³\šÿNׯòn€(YÑ2@Ä‘ˆŒ)ZQ‹:cP,Ñ$\F$˜ÆÒ$£>¢&äH"ܬ¡Œhd£nê(•{C1èáƒâdíʹlÙ© Þ+ƒñ¼‘âAòqÍx"<‰¡5Ee›Ä\¤ š-40 Ypæþ$,1"H,#SIQŠŠ#5ts£Ë˜Ô¥,…)Mq (&Lˆjñ eX±!a`)Cìɪ5FI‡1½™ÿ§ÏÞM%Ñ Ö°Šu¬d-«YÏò)µ¬…ăDaË@„ @qK”b~hÀ‚†t@¼ƒ ä° ° ‹XÆÊ¤%u›mu ß ×¸zÓ0t@U DCÀšœÍ¦K:ã­úz³™^M—ü4^ŔتƒñF}À‰:Ða‰ù%¤ GkHý»£Zföbø”’Nƒ(ÀŠá`×È•V:Ä ˆÇ9NÑmP„'g3Ï[Õ·ólaë†!3``:þìmJþLJ<(ã/¨‚hr\è C5•î¿pšKкñ1‡Àœ1ëòD*o‚,±Wì—7{ÿE]÷ v+J8ÔõT:ðEIc2w^V2þ Êf ì*\Šo»»< ߪv lée‚)²Ú(EÃ;Ñm¬xÛaZ⓾˰¯Cø€9ËÖÅïDœÜ(‰Ø'òÝŽuiì¤ì2ø:ª -MÞ Œs@  yÃ…£ój½9N‰{ådOÙ8c%>qBÆ ŒOŒÀ• aàÄ;‘ûÀP¬”O‚`4ïhÁ‹³r¨F @:äôˆŠÒ±† O°Ã†‡×þœ‘*ÄV‰lØ…tçP†rp}´B5èÁ”*„ÕÐÅ á™ùsÌþ•1” *OÇ©nÎŽÝœèà.¤ ëðÀ€‰¢À F ú‡9h EþEJm`&»:#Pγ§û[Y×—!V@4‚r\ña>H,E\æêÚ¿™áÊÝ›6³qÚ&¦IŒð‰°'šPƒ…×ìg ºÜƒÎR¡Óíi÷øƒv;l Òâ0dŽŠqclÙg|"«~L«)îX³›àûœ5Qæzp ÀØ AÇKãeèegÜÙ3Î8o,~«7 Ã:4 þ[mäÕÛN7wΜn5¿œ'ëöÚÌ¥Âgè¢f°+¾Ñ¬oîðÚþŽÀ‰®’SÉÇÜ•Ê;|ð€O @Kk>5†²ó¨`<ë+ÙøÑÛ}e£" w•JªWNñ–£ºí5Þ:­ºnðÅ­ùç7&7ŇÞ÷”°q7Þ…i,õíhûØMå/oyaió›Ïüç=úΞó¥=éOozÑ«õ«Oýë]/,«C©ŠËÃ>nsûÜãÞö¼×}ïw|àÿ÷Å÷ýñ…oüä#ŸøÌW~ó—}èOÿùÊÿ»¾¯èÅA¼ÃgçÎAá …üâ_ùÏo~ô¯_ýí/ÿûÓþöËßýñ·ÿüï_üï_ÿý× ÜadÁp  0°ð0pP+!-0/°9ð7Яc²ïãoöÁ –UW0_°aÐipmPq0u°swð°ÐyгŒð‘0 •p ™pPnðjÁØa¢p « ¥ ­0 ¯° ¹ð ·0 µp ½P Ë Á Í0 ϰ ›ð á0åpé;ž°ñ0õpù°ýðó©ãv  ± ñ1 ñ±ñ!1%Jq-ñ115+þq=ñA1E1J:qMñQ11±U±]ña±Y1i±mñƒfqqy±}Ñ!tñ…q‰Qƒ±‘1•qqñ¡±›1©±­1 §ñµq¹d²±Á1ÅQco!1¢~!¼–ð¨:ÐÑÕ‘Í‘ ¿‘Ù¡„AzàÞŠb ¥bÐá òÞQ! Ë8B ƒ†~€~A„A!~€:J@¡ y¡ á(Jò r!~¡›ð¡q ”¡Û´áZ²(.rPfR*jRn'N²!r²_æ`'µ ø+!z2rþj²p&Šr;nò&%±±¡²ÞÖ âÞQ r€o¡ Òej!Jà:2½"+·R!ºò g(‚´¡*µaÖ‘&ž2!Öò+" V z à)Ö‘ŠÁ ‹âàG!Ê@!‚ „ÁLE!J!~ Ž.éQ!`  r`”Ž¢&Ç¡"b2+sáòò.È4-34ß2.MÒ!à~!ÌÒœab¢Á ò^Tòƒ !†'â)‹2 2@2C§&‘s:¨Á 26’'¢Ö@!>@¯"p Ž¢p¢ t3гÚЀ!î2!¢¡ ´!þöÎ--²!¬ =ç“(êó(¢³$Õ³! !Uâ&AÖÀbèí7c%8±'‹Ó9¢(}3BïSžó1fÒb=‚C““$ße!ˆA*|'j²&± z p`:;´:-Ô5¢Dµ!EW´E)´!l”E]ÔDBCû“!r²8+2xAHSAP*Q²ÜS!ÞK ´BbB³B/Ô&uÒ.¢(3sC¥âPÉ:åSn4ËôEÁTMeR!ÄáHÍM“JÕRN—RH·O‚HÇ!ˆ 8TIe…Ië1Œ•Ê!&µÁ>Ù 3 ä¢ –3@3’QRþâN•Cµ!˜*OB †à´Á ”•NT!†ÀØæ G9(UOÍÔŠVu7]´S¢Vµ¡UeF"à%!4`@µ¡já ð€×uIñÇê1÷±"Ð`n¡ lÀ%axáJÀ :”Ð ˆ¡‚Z­[µ•[½\‰¢ 2ÆTjà¼òcêõ^b[»õ[ : r`RÁòÕ #39hsp`ÎàÕ\-j!!ð „!jxÁ…ö>¦+!@ä@b‹b#ˆÁî´¡b/6c76!øµ])Öb1Vcçµ!àõäõ•ìÕ Æ óþÌRò Å´! ž`Y³„A•6F›öi]‘i•6V¡¶j=Qjµ+{ ¶¬¶kAk½6lÅ6ÁvlÍöl ±lÑvmÙ– µmá6nQmå¶níö‡Þönõvoánùöo—ó6p ·pá®Y½Îpwqsp÷q!÷1ü6r)wo'·r1Wn/7s9wm7·sAWlK Æ¡tM÷tQ7uUwuY·u]÷ua7vewvi·vm÷vq7wuwwy·w}÷w7x…wx‰÷ua ÝÀ”wy™·y÷y¡7z¥wz©·z­÷z±7{µw{¹·{½÷{Á7|Åw|É·|Í÷|Ñ7}©·u¢¸®àï}á7~S‚nä·~í~é÷~õw.ù÷Íü7€ ¸€ýk€ 88³xøË¨!x‚)x{°ƒ)08ƒ5xƒ9¸ƒ=øƒA8„Ex„I¸„Mø„Q8…Ux…Y¸…]ø…a8†ex†i¸†mø†;mod_perl-2.0.9/docs/user/handlers/out_filter_stream.png0000644€ÿÿÿÿ00010010000007515311727205031023453 0ustar ????????None‰PNG  IHDRSºœE†sBITÛáOà pHYsÐй‹çŸ IDATxœìy\ÌùÇ_3MM—$GÈÑb±¹Åº…²î”£DÂf•³ë*,VŽXDåjÙÂúåJ,¢iQI‡ÊÝMMÍïoÆø63ÍLÓÌTŸç=¾Ÿï÷sVßÏûûù¼?ï÷ ¡>Á`nn>pà@e÷„@ „š%>>>22’`àÀTv@¨Y:ÉTv7@P(Dò¡~A$@ êDò¡~A$@ êDò¡~A$@ ê,ñ/^¼øáÃÅt…@ „êc``ðÓO?‰ÉP…ä»~ýú¬Y³äÚ%@ jÀÀÀjI>--­víÚɵK@ Ô ZZZâ3=@ êDò¡~A$@ êDò¡~QÅ @ ðáp8Ïž={þüùóçÏsss ¿PPP mÛ¶mÚ´¡~ššš¶nÝšÅ"Ó¬ÊAþ$ ’²²²\¿~=..îùóç)))<OLþ—/_ &utt†jmm=räÈFÕpg ’B$@ ÐÉÌÌ ˆˆ¸yófaa!ÿ>‹Å277777ïÞ½»žžžŽŽŽ¶¶¶¶¶¶ŽŽŽŽŽNYYYBBBrrrbbbrrrBBBzzú¥K—.]º¤¦¦fii9iÒ$;;;² T:ä@ _‰Ý¿ÿùóçKJJ¨;;v?~|§N¾ûî;333&SÜñsssÁdzzzxxxXXØÝ»woݺuëÖ­õë×ÿüóÏóæÍÓÕÕ­ÁaÄB$@ Àû÷ïW®\yþüy c„ Æ =zt“&Md®ÓÄÄÄÙÙÙÙÙ¹¸¸8444 àÞ½{›6mòõõuuuuqqÑÑёߒBÎvþüóO ‹óçÏ7hÐ`áÂ…Ož<ñ÷÷Ÿ>}zuÄž šššS§N ¿xñb¿~ý>}ú´iÓ&KK˘˜¹ÔO "ùB}gÇŽsçÎÍËË5jÔÓ§O½½½[¶lYCm 4ˆ’ßÿ}rr²••Õü!þÔ AîÉG ê5'Ožôööf³Ù»ví:uêTÆ Ðè Aƒ®]»6þüÒÒÒU«VÙÛÛ———+ ]‘|¡þïææ`ÇŽŠlZCCcË–-gÏžmذá•+WV­Z¥ÈÖë9Dò„úËêÕ«KJJg̘¡” 6ìÌ™3l6ûàÁƒJéC=„œí$õ”ØØØ›7oêêê®[·N‰ÝèÝ»÷îÝ»çÏŸ¿jÕªéÓ§«©©IXÇã}øð!++++++33³¤¤¤ô Ô5ÿ—Ëmü…† 6lذ_¿~êêê5:.U†H>PO¡Ž–Ìš5KéÞUlmmûí·×¯_?þ¼k×®‚x<^VVVRRÒëׯSSSß¾}›••õîÝ»ÌÌÌwïÞUG;hhhؾ}ûÎ;0`Ô¨QšššÕG­H>PáñxfÏž­ì¾€ËåR†}·oßþøñc|||zzúëׯ_¿~PZZ*´ƒÁ000022jÚ´ióæÍ544Ô¿@]S?Y,‹ÅúôéSvvöçÏŸß¿ÿþýû§OŸRwïÞõóóSSSëÓ§µµµ““›ÍVìè•‘|„ZƆ âââΜ9S·»±uëÖÇ+}˜u˜ÄÄÄ÷ïß7mÚÔÌÌL¹=IKK³²²JOO°fÍšÊ MMM)GØÍš5322âÿ”|k´2ééé¯^½úï¿ÿÂÂÂîÝ»w÷îÝ»wïnÞ¼ÙÙÙùçŸÖ××—}H*O}”|5:§ìÛ·/---55õĉÒ–}þüù®]»tuuß½{G+nkk{úôi9¶U{Y·nÝ’%KD=]³f———´äÞêãááQ£õîÞ½  _¿~ÊîÞ¾}K‰=ƒÑ¬Y³víÚµiÓ¦E‹:u255íØ±c -ÂLLLLLL<þ|‡ó÷ßGDD;vÌÇÇgïÞ½Û¶mS…Õp Q%_Î)?ÿü3OOOÊ>|xÿþýB½ÙΜ9SÚ¶ä;Ñ× KþˆP‰ŠŠ0`Àew½{÷¾s玺ºz•NAk6›mccccc3kÖ¬­[·^»vmÉ’%‰‰‰7nTV—j”ú(ùTQNÜ­­­¥­ªOôååå^^^yyy?~tssëÒ¥ uÆ ÷ïßç XZZŽ;Vü#//¯¸¸¸>}ú¼|ù²qãÆ¥¥¥}úô™4iRuºQZZº{÷îwïÞ(..3fŒ••¿Ô‘#Gy<^AAÁ¬Y³zöìÉtáÂ…¨¨( ¢¢¢Áƒóï‹©pË–-¹¹¹©©©žžž‡¦)lÙ²Eº_h½„Zóõïß_Ù€Î;+» üðÃgΜ9{ö¬««ë¾}ûÒÓÓýýý †²û%gj“ä{õêÕܹs{ôèÁ`06l˜™™©««knn>gÎ*ùsçîܹÃf³‹ŠŠ,--'OžÌ/+tN?ë)rºÙ¼ys^^j¶µµíÞ½;õhÏž=ÒniŠ‘u`MJJš7oÞwß}WRR²|ùòÝ»wS÷×­[—““#´Ã¢­Y³fĈ5Ú¿?uçÈ‘#aaaü_— Ýðõõµ³³311¡’û÷ïðàAïÞ½©$ÿß•ÇãýòË/|É÷÷ßøðaûöíünð#½‰©ÿsòäÉß~ûMCC£Ên×CÞ¿Ÿ’’òæÍ›¬¬¬Â¢¢¢OŸ>¥¥¥5iÒ¤S§NÊî*2eÊ”¦M›Îœ9óÂ… C‡ºçT«©M’¯}ûö­ZµòööÖÑѱ³³;r䈶¶6å@XXØÇwîÜI%ýüü.^¼øÓO?Aôœ"~ÖSätC¹oX²dIå©ù—_~ôÛ§bd@˜FÍÌ̾ûî;ÕÑðS´iÓÆÑÑ‘Ÿœ3gÎ’%K$‘|¢ºN}XPp¹\6›Mý†¹\®ŸŸ_RR’ºº:“ÉÌÌÌäg»zõêï¿ÿ.ØÛ·oWY!E‹-êáζ(¸\n\\\ttôÇÿûï¿§OŸŠ:ú߯_¿:¹•' ´k×.'''ooï‰'Ö±˜µIò044¤þÆÆÆÚÚÚøÿ¸|±ÀÙÙÙÍÍ’|bæ1³^]nêê¸d¦²³àjzP422µPööö5jÔ‚ ¨¤„úf1R¨ì7Š"y÷îÝÉ“'ïÞ½QVV&ø¨qãÆ­[·nÙ²e‹-´µµµ´´455555G¥¬ÞÖ Æ¿ÿþèèè½{÷zxxHXª¬¬ìÒ¥K»víºyófMö®ZÔ2É'wÄÌzuuº©«ã¢ÈÏÏ///ú!/êQfff@@ÿÈÏÏoøðáÕ郅…EPPÐôéÓ+?zÿþ=ÿ#ãùóçiiiüG#GŽÝˆšèkû¸¼¼¼îß¿îܹ‰'þùçŸ÷ïß÷òòâ[AM™2eÑ¢E5ÒÐÐhذ¡½½½‘‘‘øG]ºtQSSûå—_tuu9΀$9O$¦îîî\¼x±ŽŽŽ–––‘‘Ñ?þHé“/^¬­­]\\ܨQ£‚‚‚Õ«W/[¶¬qãÆ£F:þüŠ+ÔÕÕsss»téÒ¤I“Í›7¯ZµJL…ëÖ­+))‰ŠŠ¢vªg̘¡:g%j𨨨mÛ¶…‡‡S߯ÚÚÚÖÖÖT8Ùúì—K¾ôë×O__?%%%11±]»v¢²;vÌ××÷íÛ·ÔQ‡õT€yóæ|ÈŸõ&NœHáñxŒ3ÝPG¢§›õë×s8þ#===ITt6l(..¾}ûö AƒÌž=»C‡UV(¾­k×®]¸p¡òD/Û¸ê0žžž*xЇ †'OžlÛ¶íòåË<ÉdÚØØL›6mèСµz»Beqrr:þüŽ;ø‡³ùüù³ŸŸßÁƒ?~ü(x¿Q£F¯_¿VTélݺuëÖ­B:tÈÅÅ¥6I¾š€Ìzò?P‹(++[±b…¿¿?---''§Å‹*»_uÿ¥K—NŸ>Ý××Wð~VVÖ¾}ûŽ=šŸŸ_¹”¡¡!ÿp²â©Rò©ô‚”@¨i6lØpçÎåË—9rĈÊîAŸ?vrrºqãƒÁpppX·nÒ=M×Z·n @P'œœ¼{÷î“'Or8Q¥T|ù^K>2ëÖ­['*BͦM›„z>|ø°aÃj¸_:IIIãÆKOO744<~üxŸ>}”Ý£úBË–-ñEò=þÜÇÇçÂ… \.W|)uuõ¢¢"‹¥š"°^K>1³žÜ!Óh­cíÚµÊî¡‚üüü©S§¦§§wëÖ-((ˆoJPÔY•òòòÙ³g_¼x±òyxQ4oÞœºÐÐРD  ,‹º?gΟ«×’O‘i”@™_ý•:[xùòe---ew§~A©ñtuu}}};wî¼wïÞÜÜÜ*K±X,---.—KÈ-))•355UžÝ• "ù‚JóñãÇàà`ƒqòäI"öÙºuë¿ÿþ{êÔ©måÍ›7øâEdÙ²esæÌÙµkסC‡Š‹‹Å”ÒÑÑá[8”””P"ÆáÇ9RMDzA < ‚JÆápFŒѾ}{…5zñâÅU«VuîÜùÑ£GvìØáéé)ái¡1öjJ W£DFFB œSãÆ7lØ3{öl1: mmí† ·jÕª]»v:u¢¶CiwƒêJ¾ÄÄÄk×®%&&’k¥\*BBBiùé§Ÿ6oÞ}:??ßÖÖVWW—\«ÔõçÏŸåûG— »wï^¿~ý‚ 6oÞ¬à¦)/K—.]½zu“&MøN|||¦N*ð¤gÏž|¬K–,ôžO‘––vþüùE‹ñïìÞ½{âĉÔveXXØÛ·o©G~~~FFF”Ã} [[ÛöíÛÿú믴µÔòåË×®]ëãããàà`jj*ßáÿûï¿#GŽ,-- 8p øÌ>ܸqã;w¨ä!CÎ;'¾ˆ¯¯ïÚµkþùg¹»È¯Å>\7n,ùñY‚ILL5jTtt´|«}ýúµ®®®"U5© ’$6“â¹uëÖøñã[¶lùøñc{ƒ¤D]zzº¯¯/µö¢$߈#×@\.·S§N|ç^B%€•+WþöÛo«V­b0ÞÞÞTRT77·]»vñ“K—. 8ÃgöìÙYYY'NœhÒ¤Iµ‡û þùçâÅ‹ æÏŸ/¹“£7nlÚ´)&&fäÈ‘§OŸŸù?þXµjUM|Ó¨„J€IÕ—,ø”EÓ¦M_9yÑ£G¹×I#3fÌøô铲{!„AƒµoßþÕ«W¡¡¡|·ºŠÄÄÄD__Ÿ:êBQeÀQ°X¬üü|©"HˆR›ihhìÛ·oÛ¶m7n”—ÛR‡³f͚ǘ:uª···äe‡ 2xðà¿þúKð×% J((e…£=_yy¹¹¹ùÞ½{…ºw…j¾„õ]]]I‚H˱cÇÂÃÃå^-A^¨løƒñóÏ? ùT$‹-Ú»w/_#E<•™ “Rù~«V­¨mR;;»={ö4kÖŒÿˆ 5ÃO †šžž^›6m-Z´iÓ¦*ýªTÉ›7o6nÜøý÷ß>|˜ÍfûøøeAô|õ•ÕóQ\ºtÉÁÁAMMíäÉ“Õ \?Y·nÝž={ÄçÑÔÔ?~üìÙ³ù§uj”£G.Y²döìÙBÕ¢Õ¡J=Ÿ‚¬õÒû÷ïïÑ£ÇâÅ‹“’’D! >eQsz>"öT™3f(» â°±±Y¾|9—Ë1cÆãÇ•ÝÚÇ´iÓøQ?0 mmíÆ·jÕÊÚÚÚÓÓ3888>>þ?þPŒØC}°ç«lÛÁáp{÷î=wîܸ¸¸ÊE$×ó%$$ˆïø§§¤"!!2Ž Sy•;vŒÿ½¶@ô|õ•Õóññðð˜yòäøñã+V¬=z´‚×JÜíTšO²²²?ÿüsàÀvvv>|$¹ÊÁÌÌLŒ! \JZÌĮ̀‚öööÕ±’áñxµÎ¯|VV–›››Ü«‰‰yõê•Ü«%È‹'N(» UÀ`0öíÛ÷óÏ?—••y{{;–6iÄÃd2ccc Ɔ¯¬þ(ñl§ //¯#F,X°àþýû#GŽìܹóâÅ‹­­­Å8³æñxׯ_?~üx«V­/^¬¯¯¯È>«úúú>>>Ó§OŸ7oÞÓ§OüñÇ­[·:99)¾'µòlçСCSRR(ñVVV&&ñ‡YøÜ¹sçÎ;ßÿýÍ›7iëîÜÜÜüüüÖ­[?¾aÆԂÌ‚’CL&sþüùŽ?N“|Í›7wttpòäI&&&Í›7çr¹aaa]ºt±µµ¥–tÁÁÁ._¾ìââBܸqcåž9s†²K‹µ±±±··ß¸q£““Sƒ *g¾råÊ»wï$¸JAìùê'*kÏW™ü1**Ê×××ÏÏ/..nÞ¼yjjj=zôèÛ·oçÎ 5jÔ Aƒôôôôôôׯ_>|8//*;dÈ ê6={öŒŒŒ\³fͱcÇ–.]š””´iÓ&i­®«I­”|Ÿ>}úøñã7u±Xüðƒ´‹‚‚IêlÛ¶­‡‡Ç¤I“ í%2dˆArrrHHßW*-ª*/Ô455© ê:oÞ<&“I™ãð£Ôß Ê%ZãÆ)9ʧC‡BÅ++«ŒŒ ñª ”žOîÜ;fhh8fÌùVKª¯ç¤qãÆk×®]±bÅÙ³gƒƒƒÿùçŸèèh1’4hдiÓ„„„ÚøJÖ:::>>>£Gž1cƾ}û wìØ!­õ^uP¢žOvÉ÷÷ß3 Áèºb2WégÝØØxÅŠÓ§O矅¡ÙóR6aºººGÍÉɉ‰‰iÕªU\\Ü®]»x<^å효¨(SSÓ¾}ûR&&&ÅÅÅ÷ïßþœ——glllbbbjj:|øð=zØÛÛ'$$(Åóµ*3räÈààà™3g=z´°°ðÀ kºî{¬¶´´z€€¾¾¾››Ûܹsù‹3ŠºaÏÞ£G 7{UbÏW?©z¾ê0pàÀgϞݸq£{÷îÊî‹Êekk[PP°wï^…Ù·\¸paöìÙãÇ?zô¨|kV{>¡+tuuW®\ãêêJ{¨+ö|cÆŒ©]bÄž¯¾¢âö|Õ'''@=?Þ"ŠPoýÒ¥Kij¬š£ÞY5°Ùì… þûï¿¢”dµEÙ^÷ ö|õ“Ú¥ç“%ž¡¯Lž|èïïÿìÙ3Å‹„ëׯèׯŸbš«û’Oä«ç ã‹ÞÀÀÀV­Zýûï¿üXÃ/_¾tvv–DÏ!X–æ/´²ûÐaÆ…„„ÈÖáK—.mÙ²eæÌ™Tü-EBô|õ“:¯ç³°°044LNNŽŒŒTv_D’””dmm½téÒššš:99…††+ é?nß¾@M|ø …H>!H®çsrr:r䈛›ÛÁƒƒ‚‚Þ¾}ëääTTT”žžN]HKKã;æa±X½zõêß¿ÿªU«ÿý÷ßoß¾­²-ZYÊ_¨5§Ó’æææ=’iôÐÓÓûçŸöìÙ#*S||¼¾¾~ii©lõ‹èùê'u^ÏÇd2©¨¶®®®Ô´ ‚´lÙ²eË–Ølv^^ÞùóçÚµk7{öìÐÐКë6‡Ã™5kÖû÷ï 4iÒ¤j…F­ô^VÓH®ç9rä´iÓN:EýlÞ¼ùàÁƒY,Vii©½½=åÇ–À¤I“Î;—››Ûºuk+++{{{&“9mÚ4IÚ¢•¥ù ­ì>TÔ5((ˆ/´\9“ÉLHHøå—_D©%:uêtÿþ}¡†’Õ„øí¬ŸÔ"¿2ãæægggwêÔ©ÊfÄJG]]}ýúõ3gÎlÙ²åùóçCCCÏŸ?ÿèÑ£ .\¸pA[[{äÈ‘&L1b„ÝÒ’mkk­©©¹gÏ…yï$k>!Tç%;vì_ýõ÷ßóc7S!©(îÞ½kggçââ"ô“···˜½>Qeiú<~R| 1¨©© 8Ðßß_”ËÓÀÀÀ2»!z¾úI×óÐÐÐ 400¸uëÖĉùn¬Uо}ûxóæM‹-.\xí򵯯Xooïž={]¸pÁÁÁ¡uëÖË–- ®æQUwúôéDGG·jÕêÎ;²…u“ ²æÍo§yò€‰‰‰ŸŸŸäuL&³K—.]ºt¡ÎÖ¥¥¥%''§¦¦¦¦¦¦¤¤¤¥¥¥¦¦æææ²Ùl 6›mffÖ¾}ûÎ;[[[³Ùì˜ÝN!H®ç«ó(xJ"z¾úI=ÑóÑÐÒÒrqq™7o^DDĹsçÂÂÂþûï¿ÿþûzÚ¢E‹=ztêÔ©M›6-Z´ 6«¿BúðáÃÇcbb¼¼¼üöíÛ<¸sç΃ÒÒÒÒÒÒ.]º$˜³iÓ¦-[¶¤dL»vítuu©å]EýTSSûôéÓdz³³³³³?|ø@]DGG Æ…g2™?þøã¬Y³ÆŽ«ôE˜‚!g;…@|Ê‚ØóÕOêƒ=_•0™ÌÁƒñ0Œ:tèÐAðfyyùÛ·o)ýYZZÚëׯ JKK9‡Ã)))áÿär¹7nÒ¤‰¾¾>õS__ßÀÀÀÜÜ\Z'Æu¢ç‚Üõ|fff|#MA±‡/~;… sqq¡®ù~;oܸ±zõjIüvÚÚÚÊoŠ€èùê'õSÏ'-L&“Úç¤ìÍ Õ¬ù„ ¹žÏÉÉiÀ€OŸ>577×ÕÕ>|xPPPƒ íììX,ÖÙ³gY,ÖçÏŸ©‹Ó§O'''ó-ÿ‚ƒƒ###srr(«ó5kÖìÛ·/;;{íÚµûöíÓÒÒªìó³AƒÔá+ÊQgQQ‘µµuûöíiIssó£G J¾øøxKKËÌÌÌšð:&/ˆž¯~RŸõ|¥@$ŸdöÛæîîNɪÀÀ@555þŠmãÆlmmý~ÑüvJåóSZ¿5çlSŽ=_ý„èù †øíBu^BþÁ`H{@T6ŸŸúí¬9g›r„øí¬Ÿ=AÁ5ŸdöÛ9a„;wêééÚÚÚ²X¬ýû÷³Ùìôôôää䤤¤¨¨¨»wïwìØ±_¿~4¿’ûü”ÁogÍ9Û”#DÏW?!z>‚‚!’OÕñÛIsy·páBÁdÛ¶mgΜÉOÒüvBŸŸRùí¬Qg›r„èùê'DÏGP0”ä#g;¿A)ö|”ÏÏÈÈÈŸ~ú‰»‹fm3yòd k£¹«nÖ¬Ù¶mÛäÒÏ…èùê'DÏGP0”UÑó}ƒR^BÊççÑ£GÅ8Æ”Ùo§¦¦f ù˜–/’èùvïÞ]XX(UµDϧâ=AÁ.B *e‘••%&6/űcǾûî»;väççKXmLLÌ«W¯ªÝ;BM!ÔPsÉ'„Æ+» õJÏ'>OYYYNNŽ··w÷îÝ÷ìÙ#ÉúÏÁÁ8pQe‚‚‚”ÝBý‚H>!¿ÊB=_)ýñãÇuëÖuïÞýÀ‚†•éÑ£uºç·ß~“WWe«*!!aÆ 2Œ‹‹óóó㟇òõõå? LRSSøI¾JHH¬––¤ú ¯´s^BMC$Ÿ”¢ç«<³TFp¾“°NQó,m¾  OŠœï*#‰žöÏúþý{OOÏ=zøûû—””-Â×óñ}È "&) ¡UU‰ ;© ¼Üñw}àÙÛÛÓ|×I8а°0Ê—cAAÁüqòäÉcÇŽQÞb%ñ'í@„Bô|C¬„ ”ø|•g–ÊÐ|~JR§¨yV5=‚JbÏ'Tîfdd,]ºt÷îÝ+V¬ ,)Ÿòíù’’’üýýKKKÛµkG¹  Èåçç÷íÛ·S§N‚ÉÝ»w·nÝÚÀÀ //ÏÎÎŽvζrUQQQ”6±I“&-[¶<þ|‡ºwïÞ¥K—ììlš;ÁÌãÆ ~ýúµ®®naa¡££#-6· —»æÍ›Ó|àÑ ¨Ê†øòttt²³³/^laaAŬ‘ÖCžÌ{>‚‚!«… ¹=ß‚ 'ÇŒŒ ÁùÀÕ«W³²²x<Þ»wï–/_NKÒj£Í,´IêöíÛüù.11ñâÅ‹ #66ÖËËëÝ»wRͳT[*èT{>1š””WWWŸ+VLš4‰ª‚oÏ×¼ysGGG'Ož¤ÑÈ &MMMùÒåøñゆ˜B«:sæ e>Û§OŸæÍ›s¹Ü°°°.]º\¾|™æÇN0³½½ýÆœœ4hPy\´NÒ|à‰Ï\eC‚Å«W¯¬JZy2Cìù †¬ù„ ù‚69Ž5Jp¾›››ŸŸßºukÊ>–¤A›Yh“”à|I™Ìÿþûï&&&êêêRͳ C5=‚Rz¾ãÇ2™L555þOþ—Ë_Ibb¢‹‹ËÎ;===mll˜L&ßžo(É—ú¨d+"Ôt¤òR¹ªÆS²ÀáÇçÍ›Çd2)µYei-˜™¢C‡BÅž ¡Ê†=ä‰BBy2Cìù †H>!Èö–——‡†† Îw† b``œœ2gÎZRTUü™EÔlH›‰híJ2ÏVö @L+b<‚¦¦¦®Y³FÔp$‡ÒóyxxDGG‹Ê£§§'IU/^¼pttœ0a‚¿¿??>_TT”©©iß¾}ùôõõ¦L™Ò­[7~2--Í××WSSóóçÏööö´ú+WÕ¿ÿ½{÷êêêæçç·k×.  ¸¸øþýûƒ=z4Í`fWW×'NPní¬¬¬* ¥y¹;~ü¸ }úP“?Ù±cG}}ýððp‹UPP°råÊË—/ ¶«©©yúôiþ<»fÍš„„„/^ð§?ƒqèСٳgSó݉'ž={Öµk×”—— vƒÅbÑzuóæÍòòrÁÎ4èÈ‘#rqFéù\\\ÒÓÓËËËËÊÊø?ùÎÎÎyyyUV5lذåË—÷éÓÀúõëÛ´i³xñb©:C…àq$µ‡ÌÌÌÂÂBÊCžTœT&11qÔ¨Qb|LLLÄØð1 ++«åË— z,£Ô¥ÒÊfWW×^½zM˜0AÂU&AfTAÏž‘‘Á߉ÉËË[ºté¡C‡„……½}û–>ÚÏÏÏÈÈè§Ÿ~â—µµµmß¾ý¯¿þª¡¡Á¿éãã3uêT*¹ÿþž={öîÝ[Aã!ˆ¥¬¬ÌÀÀ@MMíÇò­¹Jɧº»’ëùîܹÃáp”29Þ¹s'>>¾S§N²WM ’Øó‰Ú `2™666Ë–-£4¬‚Èæ·“fCTZZÊOÚØØˆñ3WÖê  z¾¿ÿþ[ð¯AƒüòˆˆÊ7=…³³³››› äkÑ¢…——­ÂððpÁõ—Ëe³ÙDò©DÏ'É_Bi ì©ægiiiii)së4ªãT^}À=Ÿø¯Êÿ¬jjj'N\ºtiÇŽ…áëùªÓ7…é¢ê¡ÒK†\ùÿJð”x—z|ŒŒŒ¨mO‚ Â`0˜L&¥F‘yö“ ÕµdWŒÊaúôéŽÔùïzIÄo§à¹uuõéÓ§?xðàСC¢ÄˆßN•GüvöêÕ+00Ÿüüù3ß^eÈ!‡æ?ò÷÷2dH•ZXX¯lªŒ²–}ª»æ“\ÏG/’ØóQÿ©l6ÛÞÞÞÍÍ­U«VUVKâó©8ª ç›9sæáÇ,XШQ#MMÍæÍ›;88PlllBBBÜÝÝ5559Nÿþýù[ëÖ­+))‰ŠŠòôô0cÆŒÎ;SÜÝÝ<¸xñb---##£üQfõAîÉG‡øíTUêùÊËËÙl¶££ã/¿üBst"šžïرcÇç= (UÐó˜;wîܹs…>𲕭j¨‚žPß ’‰Ï§,$‰Ï'‚ñù®\¹"wÛUB5!'AЇìvÒ!z>e!‰=Ÿ êù¬¬¬222äÞ¡:¨ˆžP¯PV¸Õ•|B_ÂgÏž]¾|YòJx<ÞãÇ;‰>j_™èGrÓÒ @M (.†è­¹’ÒÒ¸Û·{ V‘ÖÒBI Dÿ!ËÊË£oÜhûý÷†††’ä¡7`€ßhO‚"o#"†®Zõßýûi Â-++¹yó2'‰=Ÿ Ðô| 6ß!T ÑóYóÑ©ŸïÉ“'#œ^\Ì ¥…‰ahˆÐP$% ­ œ(-ÕÌ©t‡°µEy9öîEn®Ð"ÿ‘À!@@ëÖX¿zz ÄÅ‹Bó¿<‘€mD 8;cÔ(p8˜9S¨dâžÀÀ66V’üBxÀæþýI\®„EÂ0àù¶mp¹$X P„$‰Ï'üø|†††’ %Ô4$>AñÉG‡fÏ?°oßiN{êæèÑèÝ™™ÈÈ€€Av\ÀÐÀ``êTèé!2R”ØKnÀ«T~mm\¿Žôtܺ%4?ˆ 6p€¶6>|À¹s¸~]”Lz¨K“Ÿ ÄM5.Wò"7&0ˆË•| Ï'€ò %‰=Ÿ ÐìùªéÌ… wTÁžPß ’mÁ÷矶-.fO°ÙhÒÑÑ ‚@ˆ;A 5`4PèÜyyxó¡¡¢Z¼ ¦P 6(-…‹‹(“ „»ŠcŽãÆÁÊ ×¯C´묔ùO/¥/ÒSM­¼¬Lª„+ÇÛ …èù*ˆô|?~|üøq“&M,,,Èu]½1b„äÿDòÑ©üÚ›¨+]]=Šáï/ªx 0X ü@¥ûõî]ðóÃñ㢊¼:³¨‹…Y³ŸFµ²ÀžZS°°À¬Yˆ3¨…Ræÿ‡Í¾ËáH[$³³7¤ˆ—–Nœ@Ó¦Ìo§ ÈÅo'¡æP€ž////  {÷îÆ KNN&×uïzêÔ©R}?)Kò©n”"|»ìóòòâ<|¸iÊ`³1e 8œ=+ªlJN΄+ü6nüŠdjŠ=œŒ˜QE~Ú½»c›6ÛV¯&mÛ¢¼\”@Vvv»²?ÖÑÒ4j„ Zfèš›K•á¦MÁÁÒÉÌË3kØPªt7.11±iãÆù%%5¤ç“->A‘Ô´ž/11±]»väØvÆÇÇgöìÙ’çïÖ­[JJÊ“'O$ñ€(9µ8J‘¿]º`ÆŒ¯I6û›$”¬^!CðÃ_oššÂÔTd‘€4j3³¯w˜Ìo’4²²À` m[èè|½i`ê\¨P¤ÍÏdÊR$%J7‚¬^MiL£ç#¨ Ðó¹¹¹mÙ²EŽáMª†»»»TßOd·“ŽÃÐP¤¤ˆ,`k kkœ> Ê » ……X¶ b>0÷î…‰ -Bz:<|ˆÛ·!ƈû—_°höìÁÞ½PV.ß1ô)¯%üp¬Òæ÷N–"¹¹HL”n ؽ›zX+ô| AAAëÖ­àëëëêêÊw÷îÝ[·n uJ’ššÊápÌÌÌBBBø[´$Uí‚ ({£ú€ô|dÁW·Y²dɯ¿þ*y~"ùèy Ÿ=óg" tî kküû/ç»7ĵAîºv /^|½)æƒ%;»âgBÂ×›¢w¿Rü²ùüYê|¡VèùÌÌÌZ·nM] Š=/_¾tvvæï¦æââBÕ`*°@K6lXHHˆ­­­\:¬ú(@ÏW_T•ÂÇÇG*ÉGÅ_T¼/CÕ•|•íù5 ƒAÙ¹+ÆžONNN xúô©¹¹¹®®îðá‚4hPXXhggÇb±Îž=Ëb±>þLù}8}útrròÊ•+©âÁÁÁ‘‘‘999#GްfÍš}ûöegg¯]»vß¾}ZZZiiiü`§iii(**²¶¶nß¾=-inn~ôèQAÉoii™™™©®®.ß_Ž* {¾G=_ÝfçÎRå'>\èø|²cbR±+9 ÂÃaceëùFŽ9mÚ´S§NQ?ÃÂÂÜÝÝ)Y¨¦¦F­Ølܸ€­­í©S§øÅííí™Læ´iÓ¨äàÁƒY,Vii©½½½––Ž€ “ɤBØ?~¼}ûö´$*mÂtêÔéþýûuRìèùò€èùª‹Cˆ™:©3 ººÔÑ|ðxøðÆÆU€šÂZ¶¬°…ÿü£K‘ù©€–;âKHL\º„1cP¥*HæüˆŽ–ºHóæÐÔ”n ‘‘8P==‰Æ`0¤ý;vì_ýõþýûyóæQw´µµ+g£}rò“,Ö7/H```jjêš5k¤êCmèùÕ‡èùª‹—pñbx{WQlõjP§ùSRðý÷ ýæl§P®]«¸øé'´m Ÿ*òÛÙÁβ²ŽS§¾9x)” *.44¤Ë?gbb¤.’ éÒ¹3RSQTeëù¬Y³¦G‡.))ZêÑ£Gä½®Û=_u¢ç:£Gå¾Y[Û·‹,ÏáÀÛnnhÙÌÍÀÒû÷‹,ˆ–-±h€ +--ܾ-2N&L@xxÅñÊ5öÂ…_M*3t¨tùÀ™3R)*”)Ò dî\°Ù(/GÒó¤B*=Ÿ¨Ãx™™™Ë—/ß³gÏŠ+¦M›F3 !z¾:OmÑó©®ä¢èÛË–}Mji}“¤‘’‚íÛ1yò7V ææ"P(W®ÀÄ~½£¦öM’屺ÿoLÚ¶­OB‘6¿¿¿,E’’з¯t)* ¤ªgÏ'3•]qV†æóS’:ùþBiÔj 1113f̸yó&‹ÅR«‹Åb2™Ô…šš“Éär¹bjKMM]´hÑ®]»<<<&NœÈü²ýNô|uiíùˆU!z¾ë×±|¹ÈcÆ`È„‡WøêÌÍEQ¶l¡¡È"ëÖ¡iSlØPa,‹Gðè‘ÈüNNpt„¿? ´\.FŽgfN­´ ªHJ›ÿåKYŠde!5Uºäçó·µÂo§$TvÅY©Ä¾õJ£V{4i€ÁƒK˜_’u[bb¢³³óÎ;===­­­ ±ç«óHkÏGÖ|t„ØóýóþùGd}} ‚ÈHìØñõfHˆ¸6/FÓ¦8yòÕbü~ ))ˆŒüzóî]qMPT'¿lEÒӥȔkÏ·`Á‚Ö­[äååÙÙÙeddœ?¾C‡Ý»w§G\½z5++‹Çã½{÷nùòå´$­6š+Îàààׯ_ëêê:::Þ¾}›ïó311ñâÅ‹ #66ÖËËëÝ»w‚ífggÓü…FEEQjË&MšŒ7Žj«özíÞ½»AII —Ë-ûêNyy¹à5¤Uòßÿ={Ö¢yóæuÞ DpÛ 888%%E昦üm*D;ªE»Òêù”å±ZuO¸4nÜXÙ]¨§Pz>¹Wëàà É‚ÏÔÔÔÃÃcîܹîîî×®]311iÞ¼9—Ë ûb‰Ÿ›››ŸŸo``@9$£%iP®8ÝÝÝÿùçöööeeeNNNžžžÆÆÆ¶¶¶ü\ddä’%KÜÝÝ»tébbbBk÷òåË...sæÌYºt)u|ñÌ™3TÁØØXê½­ì”ß.- Õózîܹŋß¼yóÎ;÷îÝ{ðàÁ£Gþý÷ß§OŸÆÇÇ¿|ù2!!áõëש©©oß¾ÍÌÌìÝ»w•uª©©Mž<ùîݻ͛7àææöLL¸•š$DüG°4™©` üA‚Ûööö´õ½T톅…µk×@AAÁüqòäÉcÇŽQ²P’]ɪ9ÜÝÝ¥ÊOv;éÔöCebh(ÎUP ÂѪ¤ç+// 7o“É ¢n2ÄÀÀ 999$$dΜ9´¤¨ªø¯V‡4h &­ÝÊߤ7vtt¼SÛ=‚Jå·S¼žO]]}êÔ©îîîÔ<ÎGPÏ÷êÕ«ˆˆ--­·oßzzzfee å022¢-Г’’h‹l>´²ÁÁÁ«W¯~ôèÑÿþ÷¿•+WR<òóóûöí»{÷nÁM…¢¢"1™;Qn Ò¼ysZ¨¡™ùUÑö h466æoèèèdgg/^¼ØÂ‚ÍfCú]eAüvV9Øó1`³Å·Q45AÍY<6„-´h&&èÓ§â΃èÙ³jû9™óçå!>^ê"íÛãþ}éòò%&L€‹ ”­çÓÐÐðõõÕÔÔüüù³½½ý“'OŠ‹‹ïß¿?xð`“àà`##£ÂÂBjï”–¤²+ÎãÇSN>­¬¬š5kÆOvìØqàÀ»víb±XÔœnbb"ØîèÑ£iþBû÷ï¿wï^]]Ýüü|WWWƒQÛ=‚ÊlÏ'›Íž9sæâÅ‹[Pÿcß"øEuûöm*2Fzz×Z¤N IDAT:ZPŽY³fÙÛÛoܸÑÉɉúRÙºu+õñkcc#¸ÝZ¹,µ”·°° $`SSS¾ :~üøÌ™3Åd® í)-TˆøÌgΜm€øvÛ`5åø ÒÆQDÏW]„èùV­‚——ÈÔ›°y36o€”të†ë׫öXýï¿z¬vvõ4+ -[âÆªÝIóÕ“ÒåŸ3¯^I]äÓ'L›&Ý@ºtAv6Š‹¡l=Ÿ±±±à¤Cí’AÀ]ç/¿ü"˜Ÿ–¤²gΙ3g :ù¤%;t耚ÈFSö3íVöJ“^µÝ#¨T~;+K>mmíÙ³g/Z´¨),E‚z>¾è211¡.ƒrP‚ ôÊ‹lA*—¥à/֙¾i®øÌ²!XUå!Ðv „nÐpAY{¾ê"<>_•zu~ꢸ……ÀbAC\.DØØ@Y23qÿ>¨©¡gO”•!:Zdþìlðxxø°Â¾°U+#%"‹H›?+K–"‚Í–n ùù=ZìùîܹÃáp&L˜ §§'ßHÒt|||å . ©íAe¶çÓÓÓsvv^°`A•^âíùìççÇãñžöððùœR5iÓ¦à†§——gíÚMÔ¿»¾>Þ¿ÇÇb,R€ <žP±â£§”…´z¾Y³f]ºt)00ÐÆÆFŽÝغuëÖ­[…>:tè‹‹‹ê®ù„¿„Ô*¿$AÛk€Úkϧ€su©~{^^^ŽŽŽRyñV{>%n*T‰äÛ4TDìAz=Ÿ²¬TWò Ñó$„Áå› K<{eëùÊB*=Ÿl[Aò²ç«ÎâÞ××W1 ÕO¤Õó«:Âõ|õ &Òê~™Lô쉤+¥®Žk×`j eëùÊB*=ŸlÈËo§Â÷dAZˆßÎê"äðO  ÂAK bbA••áÀÌšcc°°€~€˜•ø¥K06¦lÚ*‚$hjâ‹Á²òóá쌀°Ù@iÂgÎüj*P;;éòŸ=‹sç¤.ÂåbÌéâáÁWªŽ=A‘HeÏ'Äog‡ØóU!/á°aðöþšÔÖš<%˜?ÿ« ‹ (”ÿEÛ¶˜2åëë›$¬,0™˜0ᓃnÝðía°o˜>]ºüááR7Ž×¯Ñ£‡tqwÇéÓàpP›õ|’“ŸŸŸ-Ui·ß333õõõ¥rËR^^.íyzê  TE´´´ … SÀúFô|„EZ=Ùí¤#d¢¹b6‘D¯^ˆŒÄÇðé8øùU¬ù„òóÏÐ×Ǿ}øø^¾D|¼8w—S§bòdœ9Sá´¸ee˜9S\=j¥5ujERÚüÊP„—œŒ·o¥H~þÃ9sØ”­ç+,,üiøðçññi âlQ€¼ÏŸƒ äÄ`@]eeý.•ñx<GÍVg±À` A0È˳±œUP PßÐÕEAìŽiä””””–6ÑÒRc2%É_R^þ¡¨H[]½5^ÉŠdµ40à1¨K0wÝ{ÂôRéùd£²žïرcÇç›ôj;õÝžïøñãfff”E‹ 7!Tψ‘MnÙ‚^½Áìˆë¥­-ôõ±wï7«ÅDOíÜ“'ãùsœ=ûõæùóâš 5¹LEí_½’j ¥€-pæÿƒRõ|ÖC†4{úô!Ú{ûvØÛ£´Æ!1Qh‘MÀqà 0 ¸††øûo´iƒÄDôê%T¼FË€…8ÁÊ ïßÃÊ ÉÉ•ó—”MûUÀ¨ ]»âÚ5¨«Ã×ÂbXü ü I’ÿ?`,` ü]ZjTZ*a‘ñ€.0ÿÓ'JÆK0à> ʺE)z>GÄ^]BZ=_];Û¹sçÎ#FÐä™ä7!LÏÄC4GŽ " Tª°wryÚ4hjâÍ* \‚Åäߺ»vQŽNðE,u Œ"EQÉï¶Tùse*ÒøCÊýïÆ ƒRõ|¶ººc` ;wâÐ!¤§W¸#¨x 4*Œ4ss1j|ø jÝÓ(|jjpq‹…¼|0iÕª"ݲ%LL`` Î[wz:zô€‘ôì ††³Ë÷þ=ââÀÙJýOPQCerr#E~¢ @º"ÿþ‹¬,éÂá@SíÛãKø7Š×óYYYeˆñÃG¨…Ôw=_õ!ö|ÊB¼žOæÕ¼Dö| âÌŒñõÎØ±â".> WWºZËÇGœ·îFð믰¶þz§gOˆ‰G¸u+²³éÄÔ ;;)òhÙzzÒ13ƒŽŽt9{Ç#6""ä)EÏ'GßÐU€ØóUb÷£,”iÏÇã!7>ˆÌа!ÔÕ‘“ʳF~>x<¾¦VjjhÑeeHK«¸Ãå":Zœëó¾}¡¯þ©8ñûâ ñ%.®š4A¿~ÈÎÆ½{ðê•tù©Q”—KW$'Gê<~Œ{÷.J¨=Ÿ¡¡aFF†±˜Ø„Z…´z>²ÛI§¦_B‚(”iÏ—“ƒÉ“ÅeˆŠBÿþ3wï~½ùm|êohÖ xÿþ›<6ˆkâúu ‚U«pãÆ×›‚K+ƒáÖ-<{öMióþ,uÈ4Ñ(ÅžOEì; ò¢¶ÄçSÝ­†šV9D‘••åææ&÷jcbb^‰1´ (›¢É‹G‘÷ºn#­žOYV ª+ùªsFƒP(=ŸÜ«upp øÊ§’ùŸ   šnÜÍÍí™-#¡nàîî.U~²ÛIG¨žïÙ³g—/_–¼÷øñc©…FGG禥Rç ÕÔ ¡âb1¡JJKãnßî1lXEZK %%∔—G߸Ñöûï+yòdäÀÓ‹‹Y´´0i Ф$¡5p¥¥š@…`‡°µEy9öîEn®Ð"ÿ‘À!@@ëÖX¿zz ÄÅ‹Bó¿<‘€mD 8;cÔ(p8˜9S¨dâžÀÀ66V’üBxÀæþýI\®„EÂ0àù¶mp¹$X PK”©çÓÔÄô颎ݨ0W˜?TË„;&ΧåÜ\O{öTÜYµ «V‰Yú {wعÔoàÜ9œ;'Æ@°Â¡[· uÚ‹Ø´IŠüfÏFi©tE,@ZštyðÑÑ(+e OüvªOmÑó©®ä£ÙóÅÇÇìÛw‡ÓžZµŒ^½™‰Œ Q¿».àH4g00u*ôô‰¼<¡ù€[À0à*•_[ׯ#=·n ÍÏb€ \ ­pî®_%“žêÒäçq@S@Ë•¼È € âr%ÈsÀ  ˆ2ývjjÂÖö«¡ÌœYqqø0NœÀ¢EUä×ÖþšgíZtíúÕxN”ØðÏ?ÐÒª:Æytu¥Ë ¸ººÒ),„šštyÿçÎaÛ6ˆ0¡SŠßÎêàëëëêê*aæÔÔT‡c&æ£JIIIÁÁÁkÖ¬‘¾wtBBBøq iI|ø¾¾¾ ,Ö!†l{¾êB³çûóÏ?Û³€§Øl4i‚èh‰ré[¨£" @çÎÈËÛ7 Õâu`(Pр͆‡JKáâ"JÆä!Àn€rôŒqã`e…ë×EÍ,ÎJ™?x)}‘žjjåeeR $ X9nÜÎÐP(7>_q1üýqý:tîŒ3'n1ôä ¸Ü¯Ûw³f¡gO":Zd‘‚¬ZUå£OlÝŠû÷!fJIAF† ©Hþñ:u‚øï?áùóòž.E~ÙÙÈÉ‘®HVÊʤÈû÷xñB̶j-ŠÏGA›÷CBB&‹>æââ"mmÛ¶5srX‚vù˜™™ VEKÊ€äRذa!!!¶¶¶ÕiNBhö|………9Âøüù3uñôéS=Ÿ •? ­MÔ•®.ŽÅÇð÷U<˜,*bõë‡]»àç‡ãÇEy tfQ  ³f!?_Œë¬,À°§Ö”,,0kbcÅ j¡”ùÿa³£8i‹döïovã†TñÒÒ‰hÚʵç+.Æ©S×'bÆ ¼xñ r¡ìÝ[qÑ»7zöĵkâ„%€§O+.¨½ÐqófMð3P‰q-&K~ÙŠÈ0Ѩ”ž/==ÝËËkçÎÙÙÙÔÅùóç_¿~­««[XXèèèxûöíäää•+WRùƒƒƒ###óóóûöíÛ©S§¨¨(ê q“&MÆ --ñÅöñêÕ«YYY<ïÝ»w³fÍ jРAaa¡]NNNDD„––ÖÛ·o===©ü¯^½úõ×_ÝÜÜúôéC«™Ö®øA¥¥¥8p ¨¨ÈÚÚº}ûö´¤ø²‚}^¾|ùéÓ§‡¿eËccãÔÔTKKË!C†Ð:inn~ôèQAÉoii™™™)U-IX²dI³fÍ:”““óñãG m’5ßW„¼„ãÆU™£Â´êêŠcÈÉÁŠظ”ëNêójÄœ;'²ÈîÝhÓ«WåZB[[\ăìl €Ç¡¥ ÂÉ–‡æÏYÄÜ\ºü›6!8Xê"yypt”n ãÆÉ¤õ!>¡2*¥ç3114hÐ¥K—Z¶l9hÐ ---{{û7:995hЀ­­íÿÛ;󰦮ôÃ(‹ ¢Tpaµ38ŠU©ÕâV´ŠâNu Ú±*®€XµÅå¥Xë‚"­ûÖZËØ õçVE‹[]«0 uAD!ìÉïbÉ%7 $$ïç™§s—sî=‡˜¼÷Üï9ßw¯ì! ?~¼™™Ypp0³»ÿ~æIëúõëÇçñxår/‡ŠŠŠŠ‹‹ÝÜÜFŒqèСððp&(¦¤¤TVVNŸ>À£š$_999iii»víbÞË)\Yá¾ì˜™™1ÿöÛo;tè °Ë^W¾Íu»^UUuêÔ)¥ÝW-^^^:{âã㣣£³j2«{e8880vvvöööme„…áF>%ùù¼½1qâ›]>¿Ö®99X¼þþµ2Ó¶kǶê99µ¦W˜™±Í¶ÈËZicY|&9—73Ó¤JNúõãÖ‘’,^Ì(¦úÍÏG4 ÖÖˆŠª•ÞYCÓù$ ŸÏ¿sçNË–-™#;vdžRäÐCBBäÏ ™a1ÀßßßÙÙùÁƒäñx²± ü¶Ìb×ÉÉiÔ¨Q'Ožd2™Ô½²ü}cccóóóë ð /÷˜]öºòmž6mšÂY++«#GŽŒ7®¬¬ÌÚÚºn#\òSRRrssu¢_*°nݺaÆ1ÂÎÎÎÙÙ™Çâ1¤W 7ò)ñí“&q½t §O³9Κ…Ï>CB‚ôõZu5ªªÐ­X¼™‘–ìŽkùgÏ4©RT„¬,n))Á† ÌI}ê|\±²BE…ôF÷°xs¤.UUpw“aƒy°·‡ÊòŒ<ìí-ÝeA¼¼Tf‰Í¡<€ÿý%%Üªäæ¢ €[Gª«áâ‚= "牡é|Í›7/,,|ðàA@@€o¿ýö·ß~+++ pqq‘ívêÔ‰qEwrrJNN¾ÿ~PPлï¾ûÕW_1 ëgΜÉãñ\]]+++™QÎîÝ»[´h!‰ÜÝÝ;wî¼nÝ:;;;‘H4vìØ’’’­[·J$’k×®EEEUTT<þ<,,lذab±xàÀu¯,ßóçÏýõ×J»“}óæÍõë×K$’¡C‡*ì`©«Ðfù¿Óý 6X[['''çåå-Z´H¡‘§N4hüÕ’’’’’’ÔýظÀè|Ò%[ŒáF>%†7n¨2Û€.]0l®^­¥ñ°û6­\ 'NÔÊLËòØûâ…ô¿5Y¨ZSQ mÊkVåÕ+ΩAŸ:ŸƒöìÁûï:RŽɶpmûvÌš%K4(eÇìØÁv‹øøZ6`}ú°Íˆ‰‹CR’b”•åÇjõËhÛV:cKý*;¢¼œ[GÀîÝÈÊÂÍ›JÏ”Î`àÀd“G&Mš4I6§·Î.€²5µ…ßú?ü077—I[6«öŠÆ¹sçÊï*¤6[¼x1™·Ã Aƒ®,ßöíÛ«zqçáá¡lvYêÖm³B÷Ö+4òÉ“'ãÆ“í>xð k×®õ¾_Õ ®ëùô…áF>òíllxssÈ¿™áñÀ’Î «˜ß+­ne‰Ò#ÕÕ¸™™*«t숷ÞŸJgš½Ö &žR;éË—ñ¯i^þÅ ÎU QGTch:Ñ@X³|_´†ëz>}a¸‘O‰ÎgcÕú6 ÉÖÌÃD‚ü|´jÅ&ù0S›Ú´‘>¿zGÇ7rK]˜YË:!0PzäÇ1dê]"ªqù'Oðû´n kkn9sýúÁÊ z×ùØWö0ÿ$…•Ð)†¦óM®ùùô…áF>%†³g«š–ö†Å‹¥³ùsrЭŽ­5·S)'NH7ááQOFPãÆy{—‡ÔTìÝ[kâ¥R¾ÿ^ºaeÅ­ü´i¸r…s•/0|8·Žté‚Ü\”–B¿:Ñдm«jš˜¡é|DS„t>mQò%,.ÆÓ§`f†- ãÙ3•õóó!ãÑ#éÜηÞBóæxýš-Á·H„¬,©³¥…†EU[¾ÐW¯ ãØ1éÛ6ooxzâÆ Ô¬eQ×òhRåòeôëÇ­#ÅÅøàƒÐùL33¶iœJ17¯gp¬OO$$`Æ ¥'[ç#Òù´E‰Î— õvrÂóçxùõ¦rþðCéÆ'Ÿ`ËìÝ‹ÐÐzªüø#ØÚâõk”•aĈzÊ˱®]‹yóœ,5”ÒUyͪüø#çŽÔ ô©óñù2,ËZ™O|ÌüóŸðø1F“…dïÀ£¢¤GÖ¯ÇþÃö& KˆŽ–þSIODZclhf÷ßþ†={ ;_}Å¡<€ˆéDMõ«,[†Ü\n¹u ·oƒÇS%£’ÎGhé|Ú¢Dç#}ê|f̨߱zöl鯶m8z´þwà¶¶oÊlÜ??¶è ï½'Ýx𶶨פ£ysi™ßǎʘ;—Û-DDÀÒ’[GÀÿý6oÆÃ‡J 69OMÃLvD"ѶmÛìíí_¿~=mÚ´ ôéÓ'((hÔ¨QK—.ýG½Z QÒù´… 5Gƒ·gúöÅٳЯÎW^Ž#Gpë´o¡Cqÿ>Û{ÚóçQ]+¤»~oo=ʶîS$š5`²°¾ó-ÂÕ«XµJeùÛ·‘—Ù¼ð˜xz":Zå ç/¸•ðò%Š‹¹UÉÏGe%·ŽäæââE–Å‘†¦óíÞ½[Þ¨3;;[•a&ŸÏß½{÷âÅ‹333ÓÒÒ-Z$_7//¯[·n-[¶9r¤Â]öïßjmm]VVvøðá¾}û¾ûî»ÑÑÑÛ·owrrbÊ4œË¥ñA:Ÿ¶Ðz>@£œ¥ðõebø|üð\]¡_¯´›6I·?úC‡âúuÌ™SÏ¥™9MÚ¶…·7¨Ç±úôiéFQ-Âãdz@TެÀܹðôÄ/¿Ôc'͵¼¼U·šU QGTch:Ÿ‚Qg\\‹a¦››&:Ê×}ðà“a÷îÝuïbaaÁÌò·¶¶¶°°¸uëÖÝ»w›5k&`œr4¤Ë¥ñA:Ÿ¶(ÑùÞ{ƒÚ7 …X³FeýòrÄÆbδi@êØÔ·/Tû!%mÚH¹1«‚7?.u),ÄÈ‘HM•N?a¬>ýôÍRº¼÷·òß|ƒýû9W)-EP·Žüûßàó™‘"ùvš&¨óÉu²fÊI$²º2ËJ¥å«««ËËËù|~yyyUU•——Wpppyyù®]»¦NÊ”i8—Kãƒt>mQ¢óùúbþü7»A­]rr°f F®5àoSeZÇÃÕýú½9bn^kWƱúÝwk-9ðð@m÷£Zp-¿}»&U²³áëË­#Ì`«¢z_ÏG4––˜3GÕTCÓùŒ:Ù 3mmmwìØQXXxåÊ•þýû§¥¥Éê>|¸W¯^mÛ¶=}úôÈ‘#ùµømÚ´ÉÁÁÑù.\ 88X(ž={–ijù\¤ói‹’Ãôô7Tu2þþHM•:V¡´+W‚Å;uéR´l‰åË‘—ׯ#3“ÍjêT„„`ûv$'@e%ªª0hÛ2sf¤åç'ÝåZþÏ?5©’—‡Ü\n).Æ‚Ìɦ´žOE“ÇC³fÒ14#äX[£Æ˜_ ••xñ5é˜ÅþhÞ\e®å¼~ ‘ˆ[‘¯^që//øû¿YÀZCÓù¬)Ù 3»wﮪ®ÌñR©´P(œ#÷:=11‘Ù½GmP—Kãƒt>mQò%ÌÈ@F†Ê NNð÷Ç™3X»öÍÁƒÙî1{6Z¶Äž=µ«Y|¿˜oZNΜysð·ßØnÁ Myͪm!ßN}¡OÏÌ Í›K¥Y Ö®vvàèXë  ›åD‚‚¶Çggðùxþ\j„]T„êj¶ò|>œQ^ŽçÏ ?Ÿ[y"Ì͹UyýšsG^¼@f¦ä—_S[Ô`€:Ÿ!Р.—Æé|ÚBëù4§ys6«¥ðxHIAHô«óaÂ6ê#Gàパ#¥ïrKJPQfÍT–oÑwîàÙ3©U)s‹Ú%aŒžÇŒ©eôüöÛ*Ë3vҵ줹–þœs€kG*€%€â¼þ4Öùrrrnß¾ýÁÔ[’|;Òù´E†<ø|¶œ®Ì)kk0ùš%ØÛÃÍMeyæ·ÉÕ½zI\¼ˆ=ØnÁ qùׯqû6ç*: #ƒ[Gþü#G", úÕùÄâüüü\–¹¹hѹ¹ÈÍðwXÔ)ssܹ#uü©áPÊr‹S§ðü¹Ìïð8ÀR>?àömf/‹cyE€Ç*/޹¤ŸÑ*(5Ðù®^½ºfÍšãÇ/\¸PÈG¾FOSÑùxBCC7oÞ¬ôtDDDDDDã6IŠÂ7$&&¦¼´ô˘•O¦šouNNÎÈîÝ·þú«ú. <}¤ÛŒcõŽõ;V3.ŒÑsi)|}ë)ïï/Ý`ì¤걓æZ^³*{÷rîÈÍ›ÌÿÓz>Ó¤^ï·ß~[½zõÇçÎ;vìX+fõ ‹•.¯‹‚Îׯ_¿‡*LD‰&JSÑùÔú÷ª”¿‘H¤ÿSØUú?B#Nç£EQ†ÌĉU:}úôðáÃ?ûì³   ‹/Nš4IöH$5Ç|¤ó=sçÎÕwÔÂp#Ÿ!¼,nª¨÷3¤HMwf=Ÿ.ÛعsgjjªÎ/Kè ¥ëùNž<9xðàyóæMœ81##c„ uí+Õó­_¿Þ»æŸCQQQËzM¢©¯öôýb¸‘¯I ™õ~P«0¹ë8ai‰'ÀçÈËË›S¯I4w®\¹rOa±6aH|WÛæ;--màÀ‘‘‘ÿþ÷¿/\¸0vìX™¦êù233¾×vvvmYÒ1M Òù´E‰Î׫…€Y„ `Þ<•õ«ªðÍ7˜<..àãÿø–,QYåØ1´j%]#Å|É­­±¿ÊòÅÅøä$'3ŒÒ¤Io– ÔeÜ8nåÀáÜ«TUaÈn‰ˆ@50é|¦ £óI$’ŸþyõêÕååå .>|x½ã¹ªªªëׯïÛ·ÏÌÌŒÇãÉþËT”?¸fÍšõë×Óz>#¦©è|†ù”èÔÊA*Ö2*S 'Éɘ>½–cµ4*åÚ5xx (èÍ ‹Z» äåÁÌ #GÖr éÞµ-k1a·ò©©œo‘šŠÿýÿ;·Ž„‡cß>Æì£)ùvºƒYÏ'‹ [µjÕªU+u^cVWWgggŸýNNøúkÀŸâöm6;¨1c0z4öï—Ú–•¡º“&AÅ[ Ò‘Ö˜1Ò]®å/]Ò ŠäÁ<~Ì­#ÅÅ—¦McLìõéÛ©”Œ»!`t>ssó±cÇŽ5jß¾}aaaîîîQQQ=zô`©hff4cÆŒzo¡ð8Û»wo-ÛLäÛ©-JÖó¥§#=]e…•+ѳ'RS!¿€Q–æT)cÆÀÉ µ«Y´¨.]0z4nÝÂ9Ã#GØnÁ iy±FU.îÝãÔ‘J`,°?- Ÿ’qëùõ|&L3fÌž={¦NÚ©S§¨¨(U£vN:_“óí$8A:Ÿ¶ÔÕù·U•”„ôtÜ¿Ïì1¦¼Ÿv,U‚ƒamšE×_%i›eÄÅaýz™á/–:2F8ª»¡p€Sù"ª46qìˆ8––Ƥ}Ñ»ÎGɸõBÝõ|–––“'OÞµkפI“ºvíÙ­[7…ŠêG>òí4zHçÓ…ÃÑ£Gÿ%©¬2òòòJÆÝø¨òí´²²úøãÇŸ’’ìããÑ¥KYõW5Ðz>£‡t>mQøzyyyÉìö ®ú|£éùŽuÆšê£w’qëöü||>ÿ“O>™4iÒŽ;FåëëÁ|%Õó5Åü|'HçÓÊϧ/ô®óQ2n½ Žo§µµõŒ3BBB’’’ûõë·hÑ"õÇ|¤ó=MEç3Ü•ìÚŒZm`t>_vÊ”):™ØÙh˜Z2î]»v©YR Ìœ9óòåËÞÞÞƒþå—_Ô×ùnܸ¡E C'<<\ßMP Ã|ô`¨/4Öù*++YÎ69ßNkkkõ“C,¾J±±±™3gεk×BBBÔü¶’Îgôo§¶o§¾ÐÀ·³²²2))iøðá,eÈ·ÓÀa×ùTacc3oÞ¼º‹F”R×·“02È·S[šÄÔX£„“o§D"ùþûï}}}Ïœ9“›Ë–M|; ßΆ ®o'adΧ-¤óé õu¾S§N 0 !!!>>~íÚµ,Y› Îgj¨¯ói é|Fé|ÚBz€¾PGçûã?F5oÞ¼Y³f¥§§ûùù1f(,Uäu¾3gÎìܹSg-&tWOHç3zHçÓÒùô»Î÷ðáÃÐÐР  !C†œ?~Ĉ̼>fI8Ëeåu¾~ýúq]žO44šé|œ Ïè!O[HЪt¾çÏŸGFF0 }ûö™™™Ó¦M“·õ²´´‹ÅÕÕÕª.K:ŸC:¡=¤ói é|ú¢®Î'‰Ö®]ëëë+‘H.\¸°páB¥ÓýÙ‡} :%ã64Hç#´‡t>m12=`ÕªUún‚ºÈë|•••;vìðññ¹{÷nZZZ\\œ³³³ªŠJ¥¾òòòÂÂÂüüüfÍš½ýö۲㔌ÛÐ ÐÒù´E·:ßA&Ö$%%°ObT “R@3D"QBBÂÎ;KKKgΜ¹gÏžªªªÀÀÀË—/k|YU0:ŸD"9zôhïÞ½üñÇ}ûömݺ•É{À‚X,0`@·nÝ:uêÔ®];GGG77·îÝ»÷éÓÇÇÇg{Ò(B¯ÎGhOSÑùŒÄ·³q2ºhÙ²ellljjêˆ#fÌ˜áæææììüúõëqãÆ=yòäÈ‘#;v|çw¼½½ïÝ»—žž.?~™½}ûöÊÊJOOÏ÷ßÀ¹sçä© N~WýLrLŠ]í`|;CCC:ôäÉ“Q£FµiÓFŠvvvëׯwww·¶¶æóùÌeg—-[&›ÕBɸ u|;µ„|;ž¦¢ónä«›Ÿ…ÆÉèàÞ½{Æ ;qâ€víÚ-Z´ˆ9þí·ß~ðÁ­[·®ªªúé§Ÿ¼½½OŸ>=}út=кuk&ÕΞ={˜*û÷ï—o¤B*8ù]õ3É©ùçbG–ŸoçÎYYY‰‰‰>>>}ôÑÌ™3Ù‡}ÀÅÅEÕ;Lùü|”ŒÛ©›ŸOçP~>£‡òói ×ÃFÈèVVVvåÊ•äää»wïæççËŸ‹ÅG 533cf È<|™Á ºä+4R"‘(LŒ”í6r&9yÏÓÓ3>>>**jóæÍìׯßìÙ³Ò#È`_ÒÇ)?Ñø¨ÊϧCHç3z(?Ÿ¶pú6NF·ØØX__ß›/¾øÂÃÃ#11ÑÚÚúÕ«WãÇ¿víZrrrYYYFFFÿþýû÷ï¿uëV‰DríÚµ¨¨¨sçεk×Î××W¶¡ÐÈ;wîÈ¿í”ßmäLruóó5oÞ<:::<<<%%eâĉžžžsæÌéß¿¿BEö¹êçç#ôBãè| } B¿4•ü|<¡¡¡›7oVz:"""""¢q›ô<Ü»w¯ì ª~yðàÁš5k6nܨ“«±ç竬¬ÂРõ|„öÐz>)Ïž=KIIÑ ¢á?&&&N™2ÅÎÎNß Ñq&9u|;y<ÞÀ;–””tæÌ™®]»®Zµª¢¢‚%ò5¹ü|¦­ç#´‡ÖóáÕ«WÑÑÑݺuûùçŸ5¨N¾ú‚S~>Ÿ”””ŸþùñãÇì:åç3dh=¡=Me=_ƒD¾ŠŠŠM›6õìÙ“Y‚-‰4¸H“˜k”pÊÏÇàéé¹aÆììì®]»ª*C¾ùvÚÓTÖóé8ò1yJ{õêuúôécÇŽ­[·®]»všE>Ã×ùŒõóó)  ;vì¨ê,é|é|„ö˜¢ÎwáÂ…Aƒmذ᫯¾Ú³gó#(˜é\QÐ(£[£¡ŽÎ§¤ó8¤óÚcZ:_VVÖäÉ“CCCCCCÓÓÓå=„B¡fc>2º5œt>õ!ÏÀ!ÐSÑù -ZУGK—.)¸Ÿ…Â’’ ®Lz€¾Ð@çSÒù Òùí1~¯¼¼|Æ ¾¾¾<ïÂ… ³fÍRpÊèÖ8h¬ó±C:ŸC:¡=MEçÓĽL,B{Le=ƒ­­íŒ3233CCC×­[׳gÏíÛ·ËÞpr]ØÀ@ë~ô­ç3Mh=¡=F«ó±`aa1bĈ´´´ÄÄÄ_ýµ{÷î±±±Ïž=ÓÌÆ…|;õé|¦ é|„ö¿ÎÇ‚¯¯ïwß}wüøñ—/_úøøÜ¸qCƒÈGz€¾ Ï4!ÐSÑùXðððX»ví7¦OŸnmm͵:é|ú‚t>Ó„t>B{LKçcÁÞÞ~Þ¼yï½÷׊¤è ÒùLÒùíi*:Ÿ9ŸáÇ+=––&Ÿx¡1qttÔùbjBòòò>ÿüóÐÐPÝ^ÖÍÍ­K—.™™™wïÞm×®¹¹ù/¿üBÛ†³}á–ôŠ:aÊ”)ÞÞÞnnnׯ_wtt …´mLÛC† QHZ Ξ=ûþûï+=•™™yìØ1M|;ÒôEƒúvFGGûùùYZZ&%%ѶAm:T矻<½{÷f,ŸŽ=zõêÕÖ­[;;;Ó¶‘m·k×®Aÿé€ÐÐÐÍ›7+=ѸM’âààpþüù—/_öîÝÛÑÑ‘¶y›Çãéås'‚Ð’¸¸¸¸¸8¥§¶lÙf¸c>‡¾uë–»»»££#m7òv«V­ôýùA4†;æ#‚  ¨w̧)’ ‚ Š|A„iA‘ ‚0-(òA¦E>‚ ´ ÈGA˜ù‚ Ó‚"AaZPä#‚ L Š|A„iA‘ ‚0-(òA¦E>‚ ´ ÈGA˜ùˆ¦Äرcëܸqcddäĉ¿=j²|ùò1cÆhVWi—Ãÿ( ãÀ 3ÓšñäÉ“øøx&©ºX,ž?~Ë–-ë­£ÃfhpÁ/¿üòøñã~~~²#YYYû÷ï—íNš4©n­ÿüç?"##uÕ ÉÈÈØ·oŸ@ ‹ÅŽŽŽ«V­°téÒ¹sçjvM¥]ÖŒ;vlÛ¶ÍÏÏÏÌ̬¢¢" `À€êTÔíßåSfÿ( BWPä36 ¢¢¢âãã¼zõ*<<|ýúõöööìE"‘n[¢Á—,YòòåË•+WÊŽ(ŒaÆ5B34ãöíÛßÿýºuë˜ÝÜÜÜÙ³gkY º¬Š?þø?þýyccc]]]½¼¼ê­¨Û¿a½Ÿ2A44ùŒM›6-Y²„ {¢¢¢6mÚwùòåýû÷?}ú4!!!''ç»ï¾cŠ-_¾<##Cö¬Ý·oß¡C‡ˆ‰‰¹yóf¯^½þüóOGGÇÊÊÊ^½z5Š)¦ÁÕçøñã3gÎdvž|øìÙ³|>¿´´´oß¾£GZ\\ݹsg·nÝúâ‹/ììì¶lÙ©%„IA‘ÏØxþü¹‡‡‡ü‘:<}ú@DDópíââ²bÅ ùwJK—.-,,¬ûã=pà@‡¯¿þš9’””ôÓO?1¿}\°^þúë/æ:YYY²¾Ìš5 Ü߃±4#11qܸq®®®Ìî×_}ñâÅž={Êî2vìØ={ö¬ZµÊÊÊJ{UWWÛØØÈéСƒl;;;;44´sçÎ ,ذaƒìÔ´iÓ˜ ‰D2kÖ,Yð`érTTTpppXX˜››[EEExx¸‘O(VVVÖÛ öRU-vT}Ê,üôÓO²!õÖ­[øá‡ÀÀÀÏ?ÿüÈ‘#LØйsçÞ½{ôÑGê4ƒ0Y(òff:žµäîî"Û6mÚܹs¹àÔçí·ßf~d—,YÒ@·`HMMe| UUU|>Ÿ‰|²–p·Äb1ËÙöíÛ3¿ÎVVVæææò÷ݺukvv¶¥¥¥™™óŒ¢îîînnnÌíììÔo§<²-š5CãÆkð)§§§Ë€O>ùdΜ9o¿ýö_ý **ŠÇãÅÆÆ>~ü¸M›6j^–0M(òNNN>d~îß¿ïââ¢ñ%‰ÂöŸx]ñå—_6èõ[´hÁ>$Us¨'ÃÒÒòŋ͚5ãT+66öƒ>˜1c³Û˜ŠWYYŸÏצÚ7^WŸ²H$*))±°°(..ÖùÃa|Ð?ccÆŒ_~ùåË—/™Ý¢¢¢+VÈ~›ªªª˜ÜÜ\æIYFqq±ÒöôéÓäädÙîÖ­[ßÿ}Ù®ldT5ÃÇÇg×®]:¼ÑìÙ³?ÿüsÙdgÏž…„„È>UäççËš·nÝRø6(«V­ V§ªþ†ÙxÿmÛ¶Év·oßîïïÏl·mÛ6>>~̘1ãÆKHHÐæ90xBCC7oÞ¬ôtDDDDDDã6‰Ð–'Ož¬[·Žyò•H$sçΕýìÛ·ïܹsB¡P \¹r¥k×®óçÏg¦}ž8qâûï¿wpp°²²²··?~|‹-DFFvîÜùÒ¥K¶¶¶ååå}úô‘Q4¸ 111ÿýïýüüx<ÞüùóåÇOË–-+//?wî\Ÿ>}ØÙÙÉ0–S,ÍH$›7o¾}û¶@ hѢſþõ/f¢ãÒ¥K+**dœ8qb—.]ÔùËgeemܸ‘ÏçK$ ‹9sæ8;;Ëú5oÞ¼>úèСCëÖ­|xÿþý™S,Í`ù²×Òí§ ààÁƒçγ¶¶.//÷Ýw™..]º4þüS§N8pà²e˘ê„ɧôÔ–-[ÂÂÂ(òõ©ÁD‚ }Qo䣷A„iA‘`cùòågÏž]°`Á‰'ôÝ‚ Ý@s; 6–.]ºtéR}·‚ B—И ‚0-(òA¦E>‚ ´ ÈGA˜ù‚ Ó‚"AaZPä#‚ L Š|A„iA‘ ‚0-(òA¦E>‚ ´ ÈGA˜ù‚ Ó¢ž\ b±X$5NS‚ B{Äb1{z"Ÿ——WRR’îÚCA ‹——{z"ßÔ©Suׂ ‚Ð?¤óA¦E>‚ ´ ÈGA˜ù‚ Ó‚"AaZPä#‚ L Š|AAAÆËÿZÔ˵j߀æIEND®B`‚mod_perl-2.0.9/docs/user/handlers/practical_mod_perl_comp.gif0000644€ÿÿÿÿ00010010000017746111727205031024553 0ustar ????????NoneGIF89aø•Õÿÿÿ‚¶ŠºÙï÷˜Ì–Ç“À‘¿1@Äú¸ì¯á§×¡ÏœÈ˜Ã—–Ár”Vn œÄ£È%²Ú&§ÊN·ÕI‘}Êà¾È©Ýêàóøìøûóûý ùþþÿóæÿýüûëæþõòýúùëßÜüüü÷÷÷ïïïçççÞÞÞÔÔÔÇÇǹ¹¹©©©™™™‡‡‡uuudddTTTFFF:::---###ÿÿÿ!ù?,ø•ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿É€xL.›ÏçcÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„… h‰ŠhB‹ŽŽ’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬§±Œ²µd¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓΰ¶¶ØµÔßàáâãäåæçèéÆ×Û±Úí¸êóôõö÷øùúÏìð‹ïþÉÛG° Áƒ&´ÐÀ†g*œH±¢Å‹}õƒhæ!Ç[BŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sê܉³ÄÇÿ3– @´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«W®*~v¤%–̈°eÓª]˶­Û·pãÊ+Fň¶AéêÝË·¯ß¿€ .›w°áÈ+^Ì8páÆ#KžL¹òàÇ–3kÞ̹³g1˜?‹æ CÇh¾1rؘÜÍ‹ÓíB{Ž¡£G 4x¬°,bíhZèàQ FŽG;Z«íý“¶mܺkP1Çäbо!#˜Ã–%»³ 7êÞ0MY¸Ú^£Ù1£ÖŒÄwÄF{ŒûŸç¥€ ëÉbƒu•õ€V|b˜öß Ä÷Y’€ cÔ@xÈÿ À•!ƒrcpèá‡2PŸ¶X†‰dœˆZ–¸Û0¤( 4\x† +PÈa!ÀÂ’Aâ‰e€8Æ Öh$*ÈÀ‚ (4HÃ3’ádŒ`:„¡Ö•#0Àb|9†|ò Yä‘eTye–,ÚØd‘b¸ c7z7FX* Õãm"ò [yœÉ@¡š)ÐCx´¸@ *  :ºZ“Š@V É©)  ñ½€Y7Àœ¥´àÀƒi3 :¦†¶°j.äFV € È©9¦+è€_«bxvõÙ€Ý:ŒÚCo0h8iŽâÀj¨)B Àix%ÇmŠÿß ´°CvÄâÚ祙"ËnkÕù¨ˆ£¦Cz–*¥-8 Ãk–bªiµ´ª«Aûí´cà°î¯»öÊ…÷©°1²9´¦¯8ì@®*h¨#õ½€_ìÇèf:hºƒi0ØPC )«9† &‡;`¥9ëÀÅc|wôy*ž—³ 6¤÷‚ 5Ø" "ÈðY[Ò²B ð°¥ ’ɳ#&‹°háž•ñÑuÕ’Uà Äŵ 1Àiz1°péÑ*7]Êçµ#†ú-† *t-°?›,ù a=ŠFÍcܬÙjö]5Ï<ß åÍš\ƒ¥õÕdÜs¯6hc:ÎÿØ´ŒMÖ 1'´·ý)ùn,BˆÇ.ª¹„»3pÄ ¨æ–óª ü¥»ù`¡³‹M– ïz € ™ÇÂy6¼vðURq˜æ€Cˆlùî7l«Èê´'=$ƒÄ“›õv“éÝ@nài‡”F<1°‹Mdkߟê—4ê™-ï õxEGé¨QJDóbð<ÐPk[#”šäCÁêmJcÊœ›G@µpzˆßü48´à9pyÈš2¨¢(L>¨PÒ€xЕ!;¾«‹£"·nQŠ ùÓ4•Ó´ï5‚³ýă *«‚QôheÌ@Zcгҕ²ï9ÿj+û‰DZ(a<*Èõ2•6" Ñþ£õ(Ô>1È/il,ƒÅ@ƒ¼À:Ø A³ AñËzžTZÙÔï`ðQ7äZºJt¡¸-Ì"C&ÅPÆºÔ m3³L.-sƒB’¡GozTŽÃ‚ÜfpÞc%¡ 4Aoå ‰Zå'WhBßíFpò攢æh –ÓšHƒB>s@SD¤ïÀÌ,æðY+ƒ’HÊý©–b—À¸ÀBuoŽ ñ–>‘d†^šÁ8(Ô/% “˜š;gû¹Pï5’µ J2íäd“Ïæ)q—•a’ö'¦E‘,ÿÉßl°-ÌÑ‚ga¤]æ\x«ú\MËEOŸÅ 6°ß#B¨¶ÙÁ@81˜¡ ÂâSGÚÀõ¡Á°Àão…±Š´xã:sW7 9» x„ƒ˜ÀA¥C;7ê(B¥eàAÅ–À?€+ri5¥õÄ©þÕ™W…Okеƒ­¨pej •Ì6E’”h¢Z9Ö61ñ3(Œ£"yH1Ü`EÈì`-D#v½p3­Â°  ;†[Њtò­…Ù¡-ÄXˆ …Ô´š‹­šrÖ5€ç~œ ¨|z€E i¨Š–Z ]pTM~f­Á ºæƒH•—L-<ÿ-h”óHÐä >“lÖ&ƒ9ãKM+}”zÕd8¿B¿Ò=xÉ»2½qÐÄV}wp_ˆÁà€hØÕÉ((´° CV;éggÓ7°ŠIÜ‚#µüµ±Ö¬àD)[Ñ 6øÔ>yèúÚÏÐ2^´LmÆø›‘ nÐT!ˆ{}\ßtt%a(g3ƒ ä#c1ðíIc:q‰ÎæddY|*àŽÊàpÈxÒŽý Gÿþò¾+(ê´"&© û؉þâ–*jÉÈ*Ò“yåe'ã‰[4º›Ò”דhµÒ›V&ƒ7Þ—Ï2𛆕؎ñ‰úÁÆJm¡ÐDX*¿z‰ÿ¤i¸tšJ±ˆ'G,v†•nºNbÙô©Í0ëºt2I”ʆs½ˆ[Ò3LN}U^s„6`S@h ¹ iÕØ³€ö6hPÀq{ŠYÞH5K0¨¢·=£mèõÛÚ5º©äjÆêÕëŽ7_àmìÐÊûÞøÎ·¾u½ï~ûûߺNð‚¼3ö>¸ÂÎp¿$¼á¸Ä 3ð‰[üâÈÃ3ÎñŽg|ã¹Èò‘›üäý.9ÊWÎòo«¼å0¹Ì*.óšÛœÒ/¿¹ÎwÞ˜œóüç@w ̓Nô¢#ÆçFOºÒÓ‚ô¥;ýéðh:Ô§Nõ UýêXg‹Ô³Îÿu¨o½ë`Oú×ÃNv ½ìh¿ùÙÓÎv˜¯½íp?ù×)À“ºÛýîxÏ»Þ÷Î÷¾ûýï/¡^†¾ ÀI¼âÏøÆKáx[$âøÊ[þò˜Oó ½èGŸŽÈ‹åëÝ ½êWÏúÖ+Ãô?A½ëgOûÚ·ö‘½íwÏûÞ+~ókѽï‡Oüâï÷A=âÏüæ;_ȇˆðŸOýê?c |ý†Lßúàÿ0°/ € ˯=ðÕò}ñ»ÿýØ@> † $ ÷Ý×xçm‘ú÷ûü}åç>Q÷Ç{ùçí÷ 8|00àÿ²Rö‡ƒ7y ¸Ä‡@Šp»·~L·ÜÀâ }¨Ž ‚»—€Qg‚²ÐÀ+( ~¹€;„98„;؃(˜P~ð ¾7pp.x0h{24 Ÿ÷ È`ÈR˜`˜hH…a¸†h˜„+h„G¨Öàv1NØ{„h…ƒÈ]è @hP€þà„è‡øUH0Ì7`WH{$(y€X Žh  e8h‚fð ÛLjõ0ˆg0>Ø{ p–؇Xø‡kaƒÁ@~"axÿ‹øƒ;@Šdàò÷ŠªX°w‰°˜³ˆœ§É¸'´Ø äw!pàŠËXzh©H| eàŒ³—…Û°€Æ@‰gЄÄwaá8@f€‹¾wŽÑ8‚ìˆ îȉ²h€^˜}õX;˜Âð€Á¸ Ћb€ŒÌ騮7Ù°…ñ ŒœˆŽy `z#À‚é Ö Ù sH  ’ŧ‘d Ži‹jˆ#É‡È ñ(‰+Ù òØ h`X†åX“$98y{:™ùzÄ) Ph¨Ùò×”Æ@žˆŠhˆ†!ñ†ÿõù€ Šš"‘ |I~ YÍ™eiœà8– :¢š„˜Œ0‰ƒ!a¡¡4—¾)Á7œáŸú¹ ß è‚À›ä§”ð ,Z ˆŠ`Œe€ˆú ˆà¤bàp¤Š¨ŒÊ°fˆfp ¤bº Ö¨h0À𤯰¤Ф‰¥3Ú“%)SYÎI¦Û‰œÞy À“PX…0IÉ•dp%ê£+Ø‹o †„hИÌ@¡Pn*†SÈÝ(õø€é7Ëé³Iž¹ '9%s©@…¤È©}cê…ÿ‘ ‰aX©ep©» •i£ì‡£ýˆŸ´¨ÝÉ ÊyAÊ’'ùˆÍ„jà•š:P†C¿8¬¹‚X‡H ŒÃ(‰BjEJðöJQ¤!ªòׂj—¯zŒàªƒêÑy¹j®?¸‚ ù­+º‚âjåj˜;J{«ùi•̪ µ¬Óy­òǨÍù˜`¥OÚ±þ*zŠ!ú£–j²¹x’z©y*ÐY'#p­» €"az3» ýº¨cð`ª@K~ãJ®.K³0Û¨H» ,˱»§Öy£Ô¸ ÇÙ¬»0²´&šN«°<‹ŠÀ¦ÿ‹­új Q;¨Éº  ¶c0ºJ¬ªXÙ Öš„u"—  'yूú´¢z©ùª SKh›¶kÛ¶¼ –… ¨ëzÁ™{ÈZº¬ÿy |ÛG~ @²ð¡K¯ $;“ëY~e°­Â¯‹°RëºÞ ¹Òšªyû ‘gš7¬V ñǨPH»4«ºÚ…Ih‘° ²Kj ÅŠ€}*“«§Ã[ E ±àX›u8¶•ø‹<˜„Všég¾¡ù¨¿½ˆI ê{»Èk—”(´YÙ»MË’¸©9 eì ©Ëk­µë¤HjžîÛªÆY£ÖËŸ;©£ÿÛ{ƒ°÷0ô6  *±?¨¼·{ªª‹·¨ê‹•¹,ª? IȨQ‰¿ž»´쬺+l’ïZº”7‡"L°™Ã L¬ |µÇšµ›±p›­0—z¹ƒi¨ÄX¨ š”K™§é¥ð›ÕK¼(ەɰƒ»«-{ P(…T(¼ïK¦ý0—ÙËŤ²]«X¬ÅCœŸ3Üz—›|™{ Æã'‰hp‡þºƒ¶k)­:èƒlÇ~¼À',•L•Ê ÉgÅÅ…‘é‰ë±¾ØÈík¥ÿ°Œ±©,²ýȵµ;gÊ»˜¼ ]|Çw¹¾Ì”¥Ë›^[»lÊiÌËw¬ÊX»‰Ì› ©@<œ›<¿‘;fP¨ÊºÅÞɨ€¤n9ˆÈÈ—0œÍ㊓o‰Ë±+ÇÑ …ålϹ€Î¨\Í€y½?±¹®”rª y(¶gðÍ hŸL¹2)ÈÒĺ`šÛÊ´¥ÄLµÙüÈv¹•Ê “+8‘g9“ÍêÏBÜ˪—ÇÒ·Çc@н›ÞZª ë° ÅKüêéÐý¨ 𮀡\«Ò!í¥” ñ¬µ ]ÁãÑ™*ÔD]µ§¼Ò­šýü̹¾H…2—¿ê¥¥‰»ÿ¼‹ÆpŒ e§µ,ÑUÝÏɃç°ÔG\¹>}ŒùKÒRŒý˜MÍÕm“«ì§}<6=€f!ÖÒ Õ»P×cpÖhíâ<ÓÝŒ“ÏÌÇq]ÌsÁˆÀœÉ¨µ“Ò}mÍEŒÍLMk°L¡#J²#À¥ªØ»p´f-ÓÒ`Ôì­w= rýÅ À× aÔ~=ÍêW±Ób@ێܹa)¡À Œ-ŽñÛÖ+™¹- »M£+b­ÜçpÝÄýÏMÚ%8y{½Ü' „<¸Þ¼0Ý:LÀçÀ¡Ì­ ”¸iýʘÍÛ;š‰…ŠöÍÒì}ÞØØ;Øý ò]Ýÿã0¥¦m½ÎÝýíÝÛk¡ck.áåmÕŽÕ>Ð Îå ÛËkšê*†týÐûí ÝMÕåÑ(Þà°âââW]àn¹Æmu¦Ù= Žãóx  Ù„PýÉÍ 3N½ìÛ>*¸äÄXánÍå¢äw…ܰÕ]äü0Ûô}žÙ7ºÚ­}FmzÑÌŒNã lå‘`ñÇæ‰€£=Ó}.â×ÜŸ}ßápäßç¤Ø„*ùæîyÙ}ÚÛëÛc^ˆÞæ©(Üeþã€è<è^Î (~ãÔ ‘‰ÎÑ|M×f»›è0åÚ[Þn¬âòWê3Šé~þéÿ™çÒÞ'æH¾µæ`èÑ…ÏÌÄ3ûæê<ÂH.ÝsNå;›q^‚Ä>¦¶î¬~™YÍd~ë¸nÌh~}0;ªk>Ü=²b ÛF¾ì­®Àúì½õîbðãžé Nï&ÞÀœN•%ãÞžâÕ°¯õˆ¸æjÔÝšQ N䎒ێ¦–Ø8ð×~Ñ?z`.B¼¾ï ¡ÞØÉÞ¼dPª´kÛ`nšìë îÔ\Õ•-½¯¤…¼Î˜ÊÖšnïü~yº®FìßÝþz³”)ÌÆ%Ü×àmòL¬¾òžÝ¸ýàAÿ‹CïåÕŽí#®ÕðÝå=Ÿ GžædœÂÉMÇ'\ðÿv}õÇô}ï@+ðvôõéõcöf~êqzmCÎós/å?O‘ÉÎJ¿à`¹Ð/_ foÞ?.éÍIöÐÛ÷Û-÷!îãõ~àù.Øžž÷ÊÐñÔ-ÞOŸM -_ï’ž¨‘mÌ*öê¸ùƒ2Ï ¨/? Ÿö¦?øŒ—ó ˜ñ•ÿøF¾÷Éûš„bÍÉä ¯ì%«à”­ÓØH ¾óÁ/ÚYoyuÏoØ™û5¯Ûß®õ ûÇP¼úOرËuÛÑ¢ný²Ÿöˆ’£ï¬rjz3O¼’îýä~þ›íÑëHŒô¼ï¹%á0‘IÉdp>œRÉôŒ ÿBÉ`BõVšÀô+ÈÝï™Èd3‰u"qxrö71iŒ$Ίö˜œÎ¤ö’Üàô#%')+‘Ìì25Ï6??,ß². G%# D-³¤Ô¼š2=ÈŽúj>ì4%ÄFv©‚³,P“n}çJŸâØpí¨%'ú„°%d¡h×nÏt¹kISãåç«0Aï³:ñ÷Ÿ`SÉŸh`Fo +Wþ(!°`g‹»#Lpb!™bKÀi@ÕK–xº±ùQ5$–ãR¥Ñ¥rJd˜Lò8´5 ºÔ(d¸ É-ù6 €F/ d ¡ÿIjÕHöøáÓ—u_šTLRBÁ£Óª %²ä±4+” ¸Ñ0 Ù¸ÎÄÞí ƒ1^„yTAl²€]èæ»gDñÄâô ÊY©0cÇC/²K-ß¹ø°í“·qûÐÝŒ†nà'xèîíë%ô“EeqçÆÉußVÞ B,7M&d¨ WÖvÎJµ³„àp!ÃЊ–õŒKB€Rv% ¸sç €«¡ãQÈ^Øž3}h^«Ü*-nò/L*Ê…˜óÐS/‚ï„à`4$ ƒB:ê¬Ã<µ¸ËÂ;ðÞ›@?;ú#K·+Ùï7N<1”cšÈ ºë6ñ`:ÿ-Xp”‘ÔÓA(J€ ÔsŽ‘[@¡½·a˵!TðI4¿¤À;tä@JŽŒÂG6zMÊuAE¿ÿ˜œ Ýp³ÝöxGÊMMxW¤s5I×?`ÓTø¡‡W`(,€·ÙfE”6Zií:FWyìÑä“Õ³€d-¹…ddP6ÙI_ä8—Íkf)Æ4$!ºõÜp‘ç{a•—€ö\òì©VŽÙd•3` Ö>t¥òb¤Ù(&Ï),ç'v.ÔÜŸƒ&;ªU´újµÞØîf@&1ï´&ù†¡ˆ@ð̆cÑ¿ý<‚$4ü[ãÿ¾”Ùpizyx­TcžkrQVwÆé0fpƇ³|Té:=²a¼Çvl®ÜCÐ ÐM¿{ãD÷â㼃Ó]xyÞøãÿ…/ùåíîøÙßA¦–ù驯Þúë±ÏïÞ}/‘{4´_üñÉ/ß|6œoziƒ?ßý÷á_~zxç~ýgÛŸ_ÿýùïßüôu¿FIÏ4àؼï A€ŠÊ_!A N4QMô@ nƒì_ýz‡ÁiЃ%4á ÃgÁ‰ð7Dá aÃã©ð7,ä e˜Cî 4ä ¹‚Cêï=â—ºÝù+@ÌŠø¾¥\§[Q,àH4‚ÍЉYq"?\hÅø!F逢á·”FÃë"?¾Ø4ʯqë×çH>ÌÙ(;|ñÇ€8ây\ÿÞRÀt4þ’ˆ©³Q’ ÐFÝpoƒ¼G!i<¨DJIÓÊä€ V A’º{co¼Ç½0~²z ×&0ÉÊå!@Pg(åÝN©•Tö.–²ÜTdGùÒ|ˆ¨N-ÃñGfåò–1µç7~YšÅ]l©LCQ2oΊ9‹«ð¼j7Ÿ>ïªø;ë¡¶úÖ¥5Jmë›*×QÄU¯¸¡ëƪ ­»:*j§4•x Äí®pEÈkY¤ 8*ðy)íkÚm±–%È_™Ò°~VWï¹×F–ºÀ.ˆœ™jÉ”Øx 2e$ëËë8;ÛÈÙ6up¡ƒ(;<&°ËS˜+FÕXû!Ú kq#Snÿà h®>žãÃQ*ÜÀfb©žœ8p&éÇFêàÑä R^ 9Œ ˆÔ•4Á&%·°ÀHÀÙúøÿ„x@K î$ªà€ÆF¯ adû®½÷kPHt`³"a9Ãná!Ð.¬ \ek9‚Ô‡C"ú:Ãäô›Ø#VÚèç€Q^»dJŠô@Œ ãd°Ê%æuÚãy€Åb…,OB6â2€Å‚ao{ÃdMñBï5°$æ $O˜ øÎè%¤(ˆ,>ÔvíÐÝ~Ì–í:ö!‡’ ¸Õ‹}¦¿„LJÆÁ>p,×%\bCMjò@ä”M6rU಑\àuÕ•fŒR`χæZÐ4Õ65Òfevát%˜ùž¢õp¦BÊíÿàFQ’’"gâ¥X€M[Ò7:à*¦\tÈÃѺ”Ù‡û #x‹ÐæÜ ^%™y9X1¸Á«lÙ)Å_av>2—äD»ŒP F‚­íId”Õ¦«Æ®C™µVõ 6ƒMÌ:™Lpp‚ »…l³\A(zèBi¼"¯ÈÔÔ¦ãZ^À´?"ô†µ5Zyä÷J ž°|ä-ª3˜&Îݲ]Ÿ7S(Ç*=ΪbD$ßwL=“j?zÔªÁux™› q;ä¸²Ž ={¼$Þ¼é´ñרEË ˆÏ!õ™`=ëGŸpO’Qò‡!è±E'ˆÔ|ÿB ^µ—;ŠG—œˆÏÄÎ!›ˆºF6oûñœ4ëíÕ­ å&4¹'v$Gw6]¾x9Ü"íTz^Ü«AÎ6Óºä®l'µ­Á¤²P`A\ ˜~žæ‘±x‹)O{%q4ÄÄäôcçO"âr‹Z®C<€ÏywÞBo!“C[¤çîóYÁ /H¢Ìç>ÏŸÌgÆ&æž»4²Oqe/a?¨ëÅ2,]Üû–¯=翟 AŸãÄð»!|(`ÕÊ|>’¬Ê~.ê†ú -f/Þ& èïºXÅ$¾Â 0F™ÀB%Æï(pÍŒÇeT„ùÀMýÿ¡ûžA›.¯U> UÞ Á3Ñ ˜g8€åžÂødªÃ¾'I‡8ò þò* ÆNÿ£4B@ƒŠE%¾«4F€Ç!*špû*ƒÝÌ/ÓäbŸ@ƒ ™¢ðs„뮢ÁPšæÂT­­ëá!]mSAUÐà±ØELªˆ6báƒdN O‚ÝΰIL!ðhƒ ©‡-¼î"û„nþå-ALÂÈ= ÝHUéj a?Àp ³àû ‚SƬQä °ÎËŒῚ…#IãeO–uôä ¦+á vq²&ܾ 'éÿ @ͨ­êú&ÿ¡ü,e­ xÅ)Am3nU Ž¬ø†zTeæáï)¢"amœNQ# ÷ ÿ>ÄŸùcüÜ1 6é0éùDŒNJå5ØÑ[$ ò”ž20 `q¤¨° Iã šÐ9å<ío$ò ÓCW~΄Ý2f×0ÛpÏ%á‘&EYØ盘‘’0r¯Ñc2N²Ì‚UTàElk'IÆ:n­…âÔ±rN²®tn´B²#U$_!ŽR¼«Â1Ž.e â áj&å1<â³ò ,ÍNÀÍ÷ÐW¸R µR»4‘—þá(÷À)M’)ÿÿ ¿î³ !¾‘û°§g-ËÀëÑ*é%†2ãÒ.qé- Šå}Žæ”Ç[N2PXì)­bG±ªO1ãA0?„ ·’<¼ëSnTs5ÉÄCHSêQðs¥–²-).¡’1UÅå›Ú¨44“D3¡¼RÄqíÑ"rŒ&3b7à±{”27m³)'³.«%/:ÅD˜ÀBŒl8sC­sGiT7ýP?ŸÔÜôÀDÃóG‡JKÑPmqÃHYt›’T–ô‰šT>÷J-¥FÙmY4›–M‹R;´¥¸Qʯ()µjO+4F‘ù B u.'4Jct,ñ°°öƒH÷c*ôQõ”©B(Òs?^D^Ó9Ë´Õìj:ÕIGrFß”1ÁrQK(†œ4ÐÆ¨ô/óyzTGÃ%8.Ô‹TPáH­âLåVK•M«´b°ÓT5ÿ°;7sø˜Á0à>¶ÒW{UA?tPZ‚“Z±$TýÏA±jA ´Què Z;õ ljMT CÓ[ÒZGáB-€ILt]ÇS^¯+BK\ñQ•UBÂCÛñ(9sZZ5UÑ/¸ R”^·Sç¡Nô‹€ *-JEAÕ_CkT ¯>õTÝ]’%¹õ)ØC,0Zo±RA3D%ÖR:±R´ÕæµVE–A¿ÊEisgË5Vá\-Ó_ï'Æ ^yáUysn•Gù5Fø¯¡àûij‹ÏcEÞ(MÁhMyVFK¶h•-F‰RkÁí%s ˜ö9¸ÿv49öÊñiµµ é'w2rfÑv`ÿÕg”\Å´5Uu6/(]±&ÆIàº6 na· n‰ó,—üª„oŸÂmQ°(cìû>•lƒ¶1 w\öp•7‹µl 4%guÕ÷to‡ÖFi;Kívü¶ZÝ"e‘¥–´vÇN v)ÂA‰ÈÔkÏ `ÈtY †ölUpsE‘¨.€Upö ,Öܨ‘ ô¯5Cøq"Õw}ÙW}i¥¬„ñÜö¦M;Ö"ÀXt1÷ïœDÀö‚ÄVŽ —]Wq±÷/Fi|3#ûðÀíPö0mýØNA:¼¤¹xrƒ9¸ƒïÿÕ Ù­ éqXå„Ï `.šª`† ›wq[dwË‘mI6W KnØžÀkêøP3òⲎÜ@j ‡.žFð“¶ŒmµõY)Ž{ï°íЕ òË'L à @yÔ(R$wÓbsŸ0¯’˜®5/pwY•ns´ 3ÙÀÇz ¬ÃÀäÿ-t¤óÄþ%~ñ´7g$Ò-âK @îJJ0@(2àlRÍ —âU_Á& o–Ó¢–JXßø’8LP®ßz†Fþì%eGzäW  ‡«JÒeTÜ‹e—s ²+ÂÍz1:¤.ˆNƒ;x¢'ú/W˜ÎL¸á`Z¯ ÀÀ@á^N4%Næµ,€íJ Ä&âÀ7uŽÖJc«PÝøP[î~ãk ²2S4Áî¢ÁFïAN×Fá^£ä®fþø¥ ±HYzáÄbÎ8}Û·ª­Ú&UEg áj„£sy  (À™Ÿ fà’bllÁ¶Ÿ5A_·@§3ÿ¨g8)CV$^iƉ×ÄůQÁ_ìÀbøú€ÁÈcRTx\ší%èk¶b -[å¼ü•xm¾:s§%‘‚lJŒ†O$ű3[ "`“)àê.J `é^9:ÄÅ«H°¯[ðó(’v$¡—°¶nJF5±fâåeVóµj怛5‡ûÅÉl¤JB lŽãw¿‚ŒhÉhÂ…¿4g], £­§AB®ŽºÆŽŽ¨»•«Â àŠ!º¿F[8` à±¹:2 F@îeHfnçmªF¸U„¸Û¹·ëÍðÇlgBG'ËÁG³§Á“àÁK'³@ÿ#sº€Kr¬{v{L½òš<¿SÀ @"À*@\ü´{Kf € `‡{06ù ^\p:ÔÂ…éWy ܱlº›Þ8J¼¯Ìén— Yb€\<@à( Çaœ Xz`xÜÇ•Â<Œ_ÆgŒÈI•Ê;(jGဠxÜ`Ç)€\\Œ# ŒýÀ ÑÙ*@ÌÅ ,ÝÅ×@qÜÇÎïÏ9HÏ÷¼àÑ`Æx€À4ÙÐÇXÆ!]D`Ö#]Òéòú=¿ï÷ý þ Ø"&*.26:>BFJ:pôNÒEbÇGç#*D €àƒgšJÕÕ˜$GU½ð‘ÃF‘:dĸÁpH†ÿ<º£¨ÊÖ.C¨°u#Ù•’¼õ¡`A˜æÖ8`Pᤙ8ÁÝ<ÜMÀ ŽC޼@—¡OäŒ Ë6´›0@-€z” B!ŒÀ!ĵðÖ¦;œFƒ^Us ,ÁÕÑã 0ꆌöÔ  ô6¢£¨{ô8p–š°Â¤"0ÿ€k  0À«‰|Ÿ?ÿ0€€=<ðÐC4Ñ`ƒ .La[ +àÐ\9< À 3ÈéŠ 3Ä ¨ÅPœ6œ–F*ø È ¼ÑÀmBëÁA}Äœ2 Èã"BP@ïu¬Fõ4 Ñ“’lp,ÞÂk³  ð µ~¨Ðm€ AðqÒwßîmƒ£$¡ßÇ}„CØC 94Cµ-Üp E=ÐÀœ…oµpL -Ѐ 4ä°‚¸60CÒà‚-ŒÀ ,¨À 0Û¾©&t üÛä.Ò¹q)N¯Øx³^GR¶Áh¬vÛ×cÿNØM ³Þw ŽÏuðù“E!ó ‚=ð Co9Ðà„Eª´¶K 2ÀPEw²¥-€Cn ÄŒ€Úz+r'2  b Ä@[y×—Ø dn_C’ —j<À/öÚðņM0@=° n$ O™Ô•õ²çÃBâm¢. Pìa8â†È ìm|£¸ÆGhˆ@>èŠPp’‚†p¬BÍg6ÀÁýð”ƒÌÀAÀqÅ JBcØÄ "¨ DƒÁÀ(˜Ê lQð û € d®0-È-6 Ej“ÿ†!lÊ%a@ jdàj4@ ½ê0T¨L¬€èÊW6âm°Xj‰XMàmµ´˜ °$-x¢®:JÀ€f d!+…UìA ¤"‚¶ÀAXªpÇ’M…¼AÎ"š5Ádt™ T†<´ Dä €ó\Q*àF(‰j€fÉn*ØMWº<äÀ˜4%=—å4é ¡*ptÊUÚD•í!,+jQ9´²Àb£<1€äÃ˜ìø–7š$›FÒäÒÊL°¡_„€°=èE¡`³!H.Ž8¨ 2Þ`:I¡l` ÿÄ]:xYã0ˆÀ;æÀödÅ‚â—ê¯òA+`S™ñ V™ÞÀvø)Š^4®ru SR؆Mdí®Ó˜?üÁE ª} ` n`…-v,2``&ƒ³¸‚¥q±§€S`°€*\#%w³Ö°Ž´ X :ÙÑ`¨ÃÁÙ ÊÆ¼ YDà R×2Òž ¨`<6A#®\ Ccg ‘9ô8„¨[}×¹B÷•k¸Ž)žô ÷Ž Iï3ølFdQ)…-tQ­´ô7æJ¢ ×`i7"ˆeЃÛÔ¡8xÁì ¸ödÓ Z ‚@ÿárív ‚@U´¡KZ€Â…ºÜ…K®Ó DX< k]œJpÜ£ P0(šqñµVˆFÆ@Xtk|Q£èãWÉÂ>ÌO¨È™PÑí”HaÖõöÀ ɸ ¤ çŠK9è » œvÁùËA@73Ñ1R¥}ˆ[:°€*€=máÕ…k¦3³ ^ÐyÆ@6’t‹Xຢæá\÷ŒAÀ¼¸‰œ±„ „ O‚­¢jîŽféKc:ÓšÞ4§;íéOƒ:Ô¢5©KmêS£Ô³HöÖ{yÁ}­v€f9€`(ÀÞlu”fÜAÿj2…l ÍÆ9<  ƒr‹¯ð YòsêŠ ƒqI®²9›lì‰'FÖölWpЂ;›®gÆ•™mÑdÑÐLV¸H!“}é0@—h«1ËT[zn¨¤twPЧƒ#<á _8Ãîð‡C<âŸ8Å+nñ‹cœâØx:'Ù€€ ™`: ˆ|ĹÈA3ØÂÉà†LÒ‰+V0A1wucé‚:ª£ ¨S³^0Ø ‘¡ÒE턾_Ô¡«‘¹S$ t€à1å¡0ˆ-µPv튄l‚GÕì æ”)9ûq6èAn]a ì)ã}’1Á»3Ë8ïzß;ÿßûÞÜ v“šBlÊ÷1Hñ jЃ<«Â0˜A˶B@*àŒ©Œ+Tb¡ þQÌ$× "¼N˜ÂÀP,(w/ …JΞK­ `QPóž(8wTð‚P»@ 1'ØŸdDÈqbüÛEu@×ÝïÒŸ>õ«o}Ù™Œ?|( Ž-×OŽÏR. ä¸Åê¬d­³]9c°•Ÿr…ë­]ldVdÜG?:µ&¸Ø„…ƒ4‹Úê… ZIA/f ˸Ù>ÁOçð5ü“äÈ ;Å–œÝ nðOùŒI¨XÁ¸uÕõÑDô™` ªà ² 8 Ì‚ÌÅÿéÁkØ”0PAÈ´ÌX$Þ ¸@ PÞbù€/È€˜MD¾ÑíÄÂïiPšÙ…8DÈÓT¬YPàTÖÙè@W9‰[ø€Ì€ëé@ü¸À„à©À  N¼A°P^µ˜Á̆aF[ ‚Déaúá² ›ôDÈè€9D¿ÜT–4„èTP˸ÎÑEmèL¨NÏüQd‚ÚÔ…Î¥[EH-LDŽÌL4N¡ 9¹…ëü ¬À1Pƒ²à¸ŽÛ%"êì[î¬N\ø€Ô‰-H ÈI\Ä ¢ :ã3Bã (ØRýÓ¸éÁµMÒ¨ÿ p…¡dJåBåÈ5Kš4„-€ ¤AjÖÌÔNà° ´@¸Œ‚½7ñQ˜4Ë À€û¨Û–$æ9H#Õ†Ò¹ÅÙ$Ëz1\Àû5„Ì–ìÀ@°I4ná€,ÈÙä0ÀÅD‹.HNY&b¶jÝGˆN@P5QA¯¤ª2DeMžŠj&C¿”·uÛõ¡·†ëËÂlp#™¼Œ™x‰‰à™,”«*Ò‚"¨›Ök¸Æ~˜¢Wˆ9Á‘M5Ùš%ÃBP“yIV+ÖÒ ØšÝ“"m£ðšu…íäVQ^0T=uÌõÆCpªMѪ ÈS‚åÁúÕŽç Í+” b9¤lËÒhÌnàòAÿ Üd–d4ÒqnÅ5E—ÄÑSCûą䀎jÞŠ…¡ÏL- › µ¦£ýõÙ ÐÆf¥m,+á*k…µ¸_˜5Ò\Ú®Þ ¸€0˜ýEh“uµ\ØÙì#Þ”h6ÞßÒÞ~HÁ¬ž–•¡+T@ÐqEß îõÚ¨™ÕÄóñ¶D ÍÅ[¨–òVÝ("³QˆäئRÝ‚[ÜÉ9E[*R݉ôBêÒTõÇÎä!CEBoµÌ)#1Rì°ÉfU£ë”ÞÙ¨ÅX%™¿* œ!©@HA6r…È ML =Ö‚LHŠêV¡¢þ-öª0a6’ÿ¼½Ï1è ‰•í˜à p…ÀŒâÃn:F ÿ´¤4â.ØD •ŒÒAD€êêÕî—˜e¹Á¥äpá²éÑ•–=…Î ]í¶Ö•Љ 誸ÉYÍÀB8Ö¢( ¸Ær– \"˜R±›Ø×¡×~HЊ¥IO†dmé~– ¯p!§¤Ÿ……B4ž°‰qXãë‰0éÑ)XWtŹ܄é e„†Œfùœm\Á1,Híæk_Qr“*àWìOˆÍ¹êܦÈZh¹Îµ Co,yÄæÑ å€ûYA—¹ýÀåbYG%ÆÂc­@mµ%-0Þ¡ôÇÿçP‹ÂɲhÓsIJ!‹ó3–¥šÒÆ…¤£[DHËR-ü©é°—mðg}–éV •yá«B-Œ„ãÈb’‚0pœ ÐZ#´]AÖ™ôR †JáL§I0lëYµI-À¥ý°£EDñM™þ˜Qì€ë#ОÑi2't–ôW<ÇIç[—p-³ ËŽóNçÝþ0nk/ðG-ØIίçX…HÃÎj“4Êmö‚ºüh-²©&ßIîpR¨°ï4¤Óäa5(R6^Bˆ^Ît‰ÜÂ~Ô18Á4ØCÔÀLSÃA¸…1~EÞRƒÏ\È_®×¾f­‘ÿdãäñ— ÎËÙt ðÀúÞ™ NótdK‡Ý$ýüW$Df »§ÌN ÏáÉPžŽIƒŸÕnDk©#ãHq,tÝX†Š*¶:ç®h‰ÎÍõ4È4ÈÆ±-Hb¶š°*ˆæ.Såù E W÷±¡fÙg§Ñ™ø4³ÂF³ÙœáÏ[Â>¯ dKvxï] ‹fq¯Èº…=éLExˆ-0‡ÌÑP0‚7%ðÉTÊà‚Ò]tnvî0l8D:Øpº‚Ò ´Ô ÅÐØNþXÝ(óÔ5å²J’:ºÅX$»…JQôìjÝáÚÖ™ðAæ¬ÿqë9¶!`¦ x‹÷ŒF ܦC0èµùjm¹‡µ3-աĆE—ù¹EB ³­…LÙ ¬Þ1vl Ñ_¡ä–¤±"•ÛMA³ÿ ³i—„ªb˜ÌÅŠ/o¥ÚŸà©+„ùEºÈÀ1P Š0$"jˆ¸\ ˆ›HÈè@%óQBÀshK@çt Óx¢¯7ñéQ–|ºà̲­UjKYÐþ´89F¨tŽCžAN^š SqR`õŽEÎØT PÒÅÀMb¢mšÌÖ¡!!ȶžÂ„'”cˆˆÞél+üôo(ƒ4õã%·0´ËzÄUeêÄ5ÿšÍ…lãEx.<^n0Mr’c_ŸŒ+z¹‚Y² ]Î@ILÉÜâ,ÕäåBêpàqã>O•Ä}í‚•›º_A,À,jDí@•‡Nè03ðUÐÒ=Öæ]D,PO‰pVÓEØðÓª‹E y)/‹Ç@uHÑzæT™ýMHè‚J+9w‡ßL•Œè¡›ûÍ£ÒbIp¬³€ãD÷¹É¬ìé 4fæÝÓ–Ä·Õ1î.„cª¯ØÌWDÁbS¹M-ÛU+qÙ¥¹Ø€,ËÌ—TÄs€Ð¹qGŸH2áRDZ˜Ùé,jÝ+8Oá ÀíVȆ4èdãåÖ+3ÛmÄQê`ÿÊuÁñóYÓº„Ê9Á€?õ +è=Õ‰hµá³0GÕ—éÔ‘ª—ý©#èÄEÿà™„!•ÃÖYÉÀ˜¨V^g0€.@uÚÛÚ\° ²9/4'ŒÇ8¢C~ùÓwþù Ì´)‚o„Äu¿E0sMæÊà æ˜zŒÄvÀl‡“åv½@ÄjÖh5˜ 6 «Z®˜ÕdcWg¬b¢®à¼.ÀÛ&B×nÛKf Y Ì ð ȉÿÑ€°¹Ñ’™‘‰±Áṩ¼CÔ‰™i³A#ÊÑ€$"Bt<%⠈퉥­µ½ÅÍÕÝÍÒâý&.6>FNV^¾…¡q ²ñÁqÀÙÙñ”•¤¡±Ý¡]y‰i™é"ª™¡y§ ¼iñR¨l¼ð ‹'å…‹u5jâ ™–#)àÔî@3ÿD-F±½É!7iŽ*T°¢ŠFH48î{õÂÑ Ñ¬›1m,ºP:.·Àã™TôP!w‡_E‰‹à¸Q£$(7Ah† –` •ùx·¡òbá”4“Ô="}^ÌàaTOb³¨Øõ ‹WdW¹^üxb,θdÁ‚FbL8FñðÒC€SÐøH¦ãhh~,±{8Ý!>|n(ph¯|xÁùà‹@dŠh¨†‡+n˜á¢dØ¡‘⢺P†TfЊv@(Ƹᣞ*³AN³ ©,Ô‚¥¢¡îéÁ¨{ðzaЇ\“O†ÿ®)Ž!U‰£°šÿÈÆ;*¯Ä2K-ËÃ%1bx¡‡vàA/Â@…XrL>»hàA²ÀJ‹ã†Ä쌤Êâ#‡?èc ª}P`D•ü Æj È^`C*r“çD8 úA>tA¦,`«ÜØD•QÐ Ê”¬‘&¼å¹Gl¯ˆ·îñb.8VÈïSúrUì¦-w±òXe—eV™ÊhZT¡ŠÔ;E¨IZPÓÄ™±«ùppA†‡X]ä²ÈtŠ ædK @0T†êáS:ìù–¥ooÚ#Ñ|J,Ì¡ o ÌŠXºá4¦ùöŽ4ÄAÍ€kà”§ÿ\Ð!ÊB*h³hÁP›±¬A¶ždŽV@ãG¢Dà0N¨šÅ%Y ‡&ºè\^ðãõLíРƒ\`t=49MÒBE¤?vøG d8JmàpR Z’€ƒc8 rˆ¨Sv8ym_üøº@tp4®Xa·(c†ç> _œº!É7\xA å™aZ8_%ûòQìaà‚fÈ·šÆ’šïù‘´¡œÔ¢oÈ1Zª©b§½v¢OQÓØXîMlQZ4—'\Èaù|¨áGÔœö´F•w#Íctˆ‰Nm¢±.ê‡C8kÄ”³}Êÿ´pÁ…B«¡…"é}#ñúYOŒ‰Qð“T æú±šæ5B&àÙ¢J5p0l&MIX׺¤¨‚1:‹Ô¡U1ïYFšíD8BðtÊZ£„+ÞÁ8°4ƤHvÀ 4 e4D( è$#l êxÙL²Á訢CèÁYÒÆ­,é*{ãƒ26WXCÆàµdA>¼ñUÂq rh1aÊdò“K\â6Œ?Ú!‚ß 7 ¹[··"ÐÌæ8?õ”¤p ´ ! ¹Èªäî&ŽŒE*üa‰²<®Z±ðV –tS(¢%;xˆ“b ‚¨41ÿ|!CÊ·8¶’§ a]…ã–qh;–+2Ð x¿„ƒ0p‰:æ'¾™Øc=•8… BS®@á'k¸$.ºú­g jž«ŒRˆQB(1Ù hÆ!å€X4¢ RD¾\bvEK$#å9Ï_àìC Äß6!‰rEåÜÈA ¸eFü7}ÁeYH£½O¹ƒq-óšC°N>G@Þè‘7µˆI{CÁ$l&2Ä`N»ñ>ˆP|?á†7°²[–²²ð >ˆ™Œô‡¸€g{HÛn:¶-ô`)ÍÓ‡^¡Š„ï(31ŠD+rL@Ÿ ÿ|'=Å:Ö[†ÕD- i‹FèÀŸJM ΊÁ@&9E#ˆHš^}«H("B%èsŰÏ"ajR¤£Ñj}*†^À*D%#JI q¹oa"‚S –ò掘K¶P1ƒHÑÕD>Xg²‰EtJgôIÅrä¡ ø SêDâ5*õŸ7  ö+Y•»\]¬w‰“ÓQü­ˆTÀÁEèiª‰J]”×<È(É• Ãs|J{¸ 4hÁû\ÊDeS@‡T‚ ÓaµEòaSÈf¦¨È×N²9„z¸W ý(¦Z¤D€N&9èGÿ¾H:~,!zqààûìÁ&:¨eSH”ráVæ¶ØÅµèåL´|@È­Ì zâØ*¦Jª¨ØSLñ?ü¤ ÷XCe¢ßÕ•4`H\€“½µ¯FÀôSÜ—@¦S„¦®1&‡ô&3gZ‡’”IÞv´P'£ œA‡‡P! q¼V{!Ij¸©àË¢†¢:Ø`cùÍÞþvÛ¯®øÅ†´TÖ‹(órDHÞÑXxÁ—Á­ÃDàS*|b9¯8P§NA‰! ÄQ™¨ ñóƒ]`fÊɺB´ lœ°Þù<#&:зz¸â dr#Xÿ{M,xá\Õ(n°9lÃ:EÂÑ£5DHì͘Thˆ»ôA$‹#=oyª%`»> ôö0ÐKéËáÀ¡èÌ©òØ$ÎàLæ“ý .Ôn·h V P¤õ ·æ|o¡ÆÚE¨âÙjŠœ–Ž’#ÈÛê|&½‚íÈC¥ÐïÉN£‚±¤í§ˆªž”£(\ÅHb–§…Jt4Þô†:=‰ð,yTQqc ¢,¬Œ (TgNÍ[rð‘f†wMðŒÒ ME,Ø$˜°éOèåÀ€Á9ˆ p–®ÂÑ]'3È;8è…#OL{”'ÂÿÊåU'ƒ%·.PlU¼ †pS8ó”ÃF!:Šã@0¤¸ zÙSSTAÀü„).(“¼™Ϩ׾h— …Yfa"¦îXohæè«jâ ]Ž +¹†CÏ îÀF,àá…‰¨'ç­Å<’eº‡"àH@e×–Æ)öiz0㌥ >I¥dŠª²€î–ƒ!HNA#½Eu’p“=  7(j€èµ@\2@6£%¢¡=Û£ÀeÉ JË!ÂhEˆ,`3§àŠ (ƒ¸•‰@8;t%>`¨È;@€`˜«Ø«Izyy q‰æÿé .X‚‹xpÁ%ѹ–½A‰‚+”¿Ù0yŸÉj"Qø ½–X-À0iÐq3ˆB³Ëvš‰Sè‡{1±84×P7@Úˆ ¬À:Ä’©HDX<"šˆÆ9"r#™ £? #X ÉPX”#S›ÔÙ¥ªüÀSU˜1ø,Y›¾¤@†a—hHÁRîx˜˜‚hZy½#mŽíZ\H‹@XŒx-kšP‹HñÀ2™"€‚Ž€$š‚@ªøª‰‹AÙÿjoøšJè9ñÛ sŒY¥:» K •E ;P2 ¹rŸšQHúx„ó¢T¤£8¬Ø¸†F 8 CU¦8€ùRLÛiRñhœ{yC8AO'8µuÒF]½‡ ƒY Vf•¨€£¸Ù%èÚR ¹*‚²…Y8 ”U ÉP’]„YžãPhÀÆ`Ÿ?hˆá1®yJ~Í)*Ê4 ‡Ì°ï<‡šúR‚ˆ+ —oUQ>xÑ=I}¨TU„GˆDù›"Ê*žÉ‚Cp3×D9Ÿs¶©§máÝð­Nû€­hê‘8uˆ@…„ (Q¤Ð†å€Œ•½®Èhè9ÆhØ"j'"‘ftO$ZÅê¥äé\,#˜ “¤‰ü‘\•&/xØøÄbÒ% Ø®~PšYH‡1è¥\¡‰Fc¤&8Óˆa‰¢Gü¡ In¨ŒÁܾZ°‰y‡Ð9ˆyËòá‹«‹"–˜†ñ«$‡0À‰hx•²ˆ”¹ÿ¦º øânÍ–Ö›Ëâ@„ÇÌÝ[,‚™IKS|#ÏáLöUùÅ&€Ž B196ƒX~h½¶yƒUFÎlÈâRe`îXÓ¿‰*˜‹tŠ)pÃÓIÉØbÃ#Â…C…?à—TEUnШ ¼C…‹ @¢ÕGxx‘ŒD/UÌPhˆõKyòiñƒ‰”ðë4⨠™‘?p Ûµ£‡“‰ ƒY”&¡%ˆ˜’‚Sщt¦{\¡]gg€£Ïz¤­ƒE – xƒìA¢‘µ#p`*™x‡{|Þå R‰¶EChP@Yò‹ºÖÈP¥)£ÔÀ V[ž1… ×ÿ ”ºØ”†–ƒÄ"ÊFÄMC»À²”„îÚo ax#´±ñ-Tˆj9-z€„EáøÛ¸~…: qºØÐ]Ș—(CЉ¸ÄÃÂßÍ£—!¸7Û! LòhÙÂ,Q1ì©Q Ùêf­ˆ¤,PûzÍ)ž“‰/J»Ò”±šÍ©-r†âH¼t8Oxahˆg0œ¹ŒOàCH‚̨.Y ¦"U0à¥=æè4v‚1Ñ üå•¿TȨ  Ü`/4À%Û>¡õ”¥„J9›]AjN[¼·…"x@f”äÕNFØÖVçv‰“¡‰LO)(#ŸÛøÖæ­–”Òš«q8¤Éc‡H¼ÿiΉx‚å û=-øh•y‚}à™uÞµAc£W޶Sð \À‰Љ@‹”2#q*‚ZãXL)ÃB 1!®Âº£8*íQ¤-‹…·X•¡#G`ú¹3M¼ óUE˜…Üa5ѲîVh˜Êéo >Áù’%a”&Ì 78³0À ¢"t›,ø(ªâ1H8ÓæÔÇ”±wc¹0[„yeÐ' èÑDÕ-Pƒ\¸Í É»À-ÆÚÙÀ«­ÉZIJfÐj€¯vÓ½t1XMG£Ál.V`¥2•“ƒbã¸3¤c4%#ã²rSóBƒÓ’ÿ×å`£s“ç²CC7Ê å¢àC»ÐC 0cæK$‚Ì€ ãúÐâÓ0ó’P㇠ T›Ã³C+ÒµûÊFû­ö›®¾ÎÞîNDû.¿>ósCI«;3kS3SNÄ7°¸¢£ lÖè°±§€&´ØŒ‘„#À‹oxtø¨‘#á®o=nàØ!‚FŽM^ðHæbŒPrØ ñ ‰/ šœ€GŒn3d¨ˆ±¥W †XdÈÈñ¢O•=díâ174b¨hÇ"H›2nÒðcæiÂ{8’Õ€âq¥¸o4|°ÈÀ¨×¯é®ÈAdåÇTó(£‡,^ÿ‰Àà@ÎàB¨9(c4’øàP‘‡Ž<ø,ÙÒÅÖ7[4¶>`"4\UQ«ö®gí^£¡B¢ž»r ådå+/¥òÈáckºPç8'e‘"bÌû|¼ðótRÒÁrœÇë!B×DkÉv¹a ðÞK¨jhA·1E0|µM 00‡Ã@ -SŠ µø3Æ (¨°‰À%& g+4·E ÷…[8èR‰.ÿ¬@ ³ÌFÄ[*Fñ 7Ð`R CÜ?»ÙrödµÃv0dô‚/6Ôhƒl<è"Gð²ƒ3h³œ67|•$oìì0à 6Ãÿ<„)ÍbQŽ +pò…e5°†P½x÷ 8öO2ÐhC b–uã¼L¤K{3´% é‚„ 2\YÎÑ’òˆ"Î.-,!ƒ Izà ,\YB·ÅÞØà±q¹²H^¯¾–1Þ¯ê4Dà J VÅaÕ-‰)aÇaWÆ`e ¹SƒÉ<$bѰƒ®&YÍI9Ü¡Ó =ø2qÊ Ñ ¶˜˜"øðøâx®*7µÁO¶¥‡˜zü¡"mEü…±-¤bÍ eV…£N!C'ªeÜ3EÈ@ˆBÖÐàÂ#PdÆ*4ô@çi*¸pÿ óèÁÂ]*(@”Þ@4‹èB*Ü|6"‚hÌys/8´%I˜7—uO#68¨n(írÃc6TYŽq+È 12Jß"¤ AòêÎÃÌ‘ÁPÒ0µ°¦—ù£i?Wb%Ý7XÕ€[ çÌ!ÇDÂ.N^°Œ§e-+Þ¢²»0Wîeö2mRé¡ÃS¶Ø¢‚•’§Ø‚X*¸í„:ô ßB!CоÄ@F ‘ÄsŠ(x€™k [Ùp¥®;ª eÞñX”$öÄ7Ë Ð™ƒaRpÞÉŒÆ-ÀQúÕŸ aÙ ;`ⳘIºI N£ÔÊ…l/E*4<ÇE ß@ÿÛ켉dl¡VÚ8µ *ÈÁ¢’ (\"`È VЭIuA‚*xƒÄ$Š-àhœñÂ(ž`,"¸Àµ¡IBŽq ß ae2Ý Rµ‚r°áˆXÈ 3xWR•Ĵ ¬ä-¾™È,pPÛ=nнñã\àaD‰ÒÜD¥6¨ÍZñÊŒ1¢8åÂj“€ö‚²èªíi-`К_,¹‚â¢!ª8¾b ªÂ+ð®›Ègß0!Zóhá/˜zˆgï0AÈQ†>ˆáèŽèÌð ª VX®üã`5šÿ\€5м€ˆ º%)è-, ‡Ô3¥§M9üÊºŽªL * –†¨¬`]Cš7ðQªäB1g2ŸZ`y°5p³Å}'8ÉšAt§sä —(¼Ÿ@ÅUWÕ>¹°˜]РpŽ£¢CÑÐÇéf.èG%ŠßØST„ÈÁš¢hAÀO ÉÅû4±'̆mùZˆ®¤l±PféÀ"qvà|kS “D—ðpÕÉÕ•ºy>ÐÜ„lP¬‡6bá‚SÄàJ²BB“R4„@Üd0•¬e€¬€cå _Ä’¸ lHR`ÿV+¡ á8…ú`ÔQ(ƒW±Ö?”¡YѦ ÂVïpA®f`”DÖŠ¼¾.­ÓãßÁ1¬AmeŠCUu"Žœ”%’!ƒ "éV,x-ðó6©Í2T"\ÊdFÊDZÕæ-d›#U±®‡*×]œ.8s%a%£˜ª(¦¨WÀDÑ$µYÑz0…•Ø"µHxŤBE¹LõgONyJžP…+¹ÀOÚEBò0˜m!JÆøqEb¹|nî¯p4g)«ï¡E.ã!…ªð`[¸±?d¹|4+Úø”ÑP‰ Ì ù«4á‹––Š/ÄGè"ç4Ж\.`pZÌÀ'XlKvzÐ¥ n„N‘Á ]!Õ½HJ–=ƒ(Ë*a ³±­ù).XÏ Ë”—Z¶É cÂרª¹dÿ‚=V8 gî\> ¥r4?%Á¤B–((š.$)I46,-”‡ •IYZCÔ0DÀ^¨Ò)Ý«„™hñ´ìÈZX¯ÀŸBv3ŽÕFWYXŠ íPa²V†‘þ S )ŸbÀ‘y1Ë€~€E7@@r¶tRÄm]qÿ Qà‚"XQ «ÒÝá6S'Fí*¡,”"ÅB»á*"p ß°J¿"$>°!Â'Q˜²5´Ò ’@¢P…%g Ç&ºÙw}‹³r4T Bc]0_D ¼„W³‹UOÃ…È0i¸€)ÈÂ=`e>µ— qèeaefб>aá@½ *³Po:  òIÍ¢€±Õ° ÃpÃ×ÿpŒ <…e5ðw–ñ"R€qDEqb(Cß$mqx´³3¸ÃŸ°3ÂÞ Š0“‚G°¾@ 2ÖA QŽ]PdÅœqP€ÿe@V€1U4GàaÒWNÑ(P0£Ù’ Ï%ÇPO ~ò ©e ˜B œÁ8Gá,>0$ å{ù”/5Æ Ò$n @]pCBš2ˆÊUˆî`‰ès !{ß@ dö7m@’cÄÁw"ÑõõRðSKV"¸³Ë`OL1eæcM¾`oÁ‚¸ôGh:ÈØœp v@'n€?R\ð4ÁF‚b@8 m+ QâAq°{ðkà >‚ÜçŒA)Õf‘] ý¡wCç•SÕ %õP`¤Ç?(áèQšBoÑzçÐëX'F0n¹˜ìàCpF²Ä3g€7Z ³$§„Pœw2(â  R8PPKFÀÆÁÿB!SKç‰Ya›°H+ ¢¾ç9ÊU<‘,àRmQ†2H!l?Y¥ÓAH*—†Ôù8Ö™ÒÙ 76À/e”¡² š "Ú@ž»8¥ÍaI&tHp® '†ô>{¢W"pc§€ia£÷·ãf¶Qñ“÷ã/¡S˜ˆSÿðtÀ(JS3U€#‘c0-8PƒaN ´¤ £*²X Òq« ?¿¤¬ªÐš82u)byî0]"H¥ D}Z`˜:ê&¸³mDИ|@2/ðwÇæ ]™aÂ¥Xy1?ü`„!Ö êR'<ÿ òb+#ѧÙu Q09^Ö”=t 3R†f9¥"Tú + §„(ˆ5u Zå% ãð$"ÀÒz3; ¼Ð1çPà)ßW& F „á$¹ôw€±'X#¤eY:z£\™nf%øÀ¥à²*IÁVXa ’#F‘Õ%gaAò5]Q#6r(ÒÞ:yÁ=€KL¥T!)Òie”cIv`#ëò€_:G!Qñ"Ä‚–± ”àöJžŒF21³Eð}ëfÞ«‹‚#’bb›™nW3 ‚% ·g,fÉV ±\3uÌ`°54 ;‡Ù€n0iÿ¼Õ¨á–›0"Ä‘æ“DQP+hr:±ß!»ðp 1Uôd½Wšp69³‹©"+1H¹B_³6 J"±'gåPu¿4'È@j£ñ"N‡rE°2¡¤CC´±V›`7Æ&*¼ÀC»‚G5 b‹3õÀ v8‚…¸„p~ðLRÐ1J”±$L¶š³”?àsö„‹õ'ß¡dHªd®( lÅVäÃN«Íz™ð HJ?q5 !0bòr1ñ¸ãCÐ †à!šà]ðpƒf(‹9CIª4æ DµPµñ¦õ5‘{ùö0ꔵA6åeš µ› ‹ÿ‰³[‹ŽâŒÖ[Â`óz Qº œ¸\±¶ð[1·à*]Ae· Jw0³6‚ U¢SF¡/Šz½Dð)ù&4ÿ# çó࣠Ö6@«(’InŽá .Ú.(°|#_ÂÓ˜-@CÈ/‚ŒÄooÀ®Nyø€pÈã S¡\°.÷ ^ÉG4–„e‘Js>®Ð@’PS•x CÇ:„X²ke`Xg¼3$ã–R`ñú“"!·ðzO™xŠOr –²°Ò¬5 Óð¥ªÂ54Üç[Ø)´Ú™ݱ›L¯ãCCgòsÈP/\P¿S’£¢‰B[¡Ïóz¦€;ùcÿJД A#E–™Â¢ )0Ã1à*gfç6ÙcBaR úœ ÔoM ¶™@Õ]ƒ#²(¸T¹a/²1*‘CTð!Þ•:¹TЉöt·ÿn9Høy0ÐÜ;ŠAÞ¡9´ ¿$&äšçc,âÉÿÀÂd¬T-ò'„”p_p?³+]áÐ d:¸Aàg7éA[°"΍ÎàÝå^4&âÅS¯U ‚M±ÿó¸C0;i²4*Ì£ÐÍd¬Êªˆ†¬"÷ ±"’"£r1ÉC¥r$ù8ÍÏñY`T4‹4‘ ñ nƒÿÀ3U|À‰Äœ |¨¡ƒS©$éQ7)a„”¤oyqgI@à@†ÓAV ©D –´*Ñ$D-G¡*ÆA2öHUaá)f8Îsê@cwQ(—2­ d–¦0CS¯ž”Z_Ê"[³&Â㺣ð:!r óY‚/y‰{Â1*ÙȈK¢ ß7 ú‡%«2ã_¦á¾–ÇÅmþm8qØ<®ðt©¹2&Î;¾çðéD1š¢Y£puTÀ ´ Óé-ÛÄjXÀ,5c`ÒYj@Hêâ*LÅW Wò²JÔWPÄá\sH]PÕÐAŒF@ÿOUÆ`;‘×$fHH!r®¹·Œ¢?ù(JæBvÄÓ2q³q·Ø6®ÐÞ"°ÌÎÀ"4³X0ó Œàf7“nâ&c°brPç^†Ö@tsfÇü ³#µ»8Ë@HüÍSK€/5~Ë»Àh1$ ¥“ëÀçÄ©n6úð³Å Ç@BÁwƒ¡†‰m c8”;6:p˜,L Žr#Ç ‘:¢Ò·rˆøÒ…{"¨¶.Œ½àYi¥Þ,$SuCd,/Ktµì %a:^A ¡68¥ Åó"ž4ÒWÃ/Ã1~2lu' 4RIz`ÿ*‹ oŠ* ]1„ì\#_¤÷ m`,xÁŽ+±D ±C`³D(ˆ’I!AƒðN7A)Yı cbº‚‰~⻲• ‘‘×q.´Úç’O»@![tÀ9¾GOq‹‰ò¡âGBç°Äà &´²"…Jh ¡YÚÐ2¥HH²ZD€y‘GC* y “LH@à›‰h´Ûì&º3€h‡ÃÑ. ð¨¬Úª9Ë©rÛ, jÝj6]+€ÈlNu]Ùf5Y ŠÆ¦¥.à†ѧæ'ÀÏ%f†%à†…¦&3æÅ+&ÀPE&@†ô³õ“nEƇ¥®ÿ+@…'`ef'@h§ïÐÕ54µ8Y¥îF¦¦¥gç%ù“”Tæ;€FÓ€‡§‡ g¦‰‹f‡ Œª§G‡I«j‹?_Ÿz)å<@%=b8‰¥3zذÁ$G&™¬0NÛ>9vüÄ_"&WD0‰ÑbE)s<$(±¡˜oäÔØ±ÄºSšÐtXÅÆ ¿z Æ&¿rxjµÒ… 4z8Áàá0=ìH|–CŽ¥ýVâÈD¥'`ÌvQªF3%DˆÝadEM\ˆ˜6g FdµˆƒèŒ)3jÌÐ'è`´Àæ0ŠŒ¬²©1ÿ6n.J-¬&QÒ´Ïô±ëèV+`¬Hvö+,´¨1‹çÓ¼\©ðTÃ3 -ijÐð1ωrhfÁ±ÃFÍvŒ„ø'gãoëøµCGŒ¼æíEƒC}ë˜øø#cPvõGçý"ÿÀ}@*&®o$Á œ H‡¨ †2܉aœb°aw.ÊÁ‰À‡9¾“èœ2Ù‡%Är°§JRTí•@b@Ï›‡”¡´èîªÂÑZÈA†Ðó¡¨x „¼i›ZP0Nñ$¢tð°©“pHϦæiÁ4XPaÒXkå‹~A Æÿœta…Ǧ1Q¸á2ɾi¸Bƒ†O\€j›¡ÖÓá5Ñ@¢˜X+Æ‘d&óCr#‘LZa¬ÒR‰Ë¡Ýx˜ç9pz’‰U%,i"7°x'À\åœ!yÁVÑ“|8âÚ™H±ˆˆÒ«äЕÚ\ à°1]¨1Aº£‡±"‡V&²Rì"Gµ¢¢¹| J‡` šG"ü¾‘a†"‚a,‹Œ,F‰ uG†`ˆÜ£Ö±¡¥Ö™Áš[,êuGàqäA†‚Ïá‚_9]!‡JbPƒ†/Ó#­ _}ÁáµÏ`ðá…]"±Ã“‘_ùD‡…ÿ`ÀÒ *¥Ðx-4Æ\Ùe9ó¡Áã:È cPÁ‹ãÐ"QÖà™Ù …Õß>ýY—:| ÀѼðdú“²)õP¬ÚsŽh2¾Á<Ê8Š_&DXuÙjÿ¦A‚·£ÐØAcu繃æCƒ ™ÇMÅEߨsÖ| BnÑ $Á’†‰ºîÜ0WÊo˜nœ%–˜qœpÊÂâ†"zm dün0Ε#ipvÁmƬ¡6ῌ)‡pZ‚ÁÉâŠqÏ™~óÈ¡…Œg˜j2®ùR§=¤ã‰Ë $¢`VÀ£™¦ÕìnËûÆ4¸ñ‰ZÀ 9* gbÿ°6Uð"~—ÀÇ*\`! mªÀ ~ÑœÕô«4ëYX°jÀÀĆB±Æ6àAd0ªO´áWáÁƒ(BLôAÐzÂçB”¢&Œn£4`&µ ^%ãŸR ›#"0æ]Jk…p2ˆ-dê)qc3 ߨÀøZ Hó–­‘ÂmŠÃz€ID1°‰‡ÚÑÌÍ„ W#GŒÓ¯,|D(áÁ<»°FŠhŽ__4ÃDÖ3P‹~Ä™_Œ†D:Ьj">ÈÊDÀU’F4a¡ïAÐ÷˜ÀÀ­dT£—B˜€“Ìã/ØÚSÖ!°cÒƒ;ˆAìГßÏU8Ø‹ðܱ”IÄÁC8QTÕÓbã¬Å‘>‘²]ä‹NcÁ –à X*¸Ä ˜Rƒ«ŸÈ×!2²8T"9ň ˜ˆj`ÿãÇL™pd`.)dE8•‰¢e&Ce{›D.á ÆH‚f˨rL2P-cÒÁ‚i‚ q´1¯¡‰“:wQxHiuØ_ÂhÕ&Ø€ÈUâ§5rP°\Uƒì? Á‘Xê°“o4¥| 9G$Âê!}Ÿ R’¸Ñ¦ô`bŽ Ð[‘¿Rx¦©(õÒv‰¤Mm«ˆKEoqIbÌàB«X_Ö‘”cú549ÜàgHê ³ÿ~˜LT=“` ¸iE(ÇNDí.»*yHKZv-ââƒ_‹ÃgÌu‘> -AO;TÑÃiHXyrq/â2 èsæ©/Eˆò„yøn,ÈØÀ WUB¬[‰æÁ¯ôÔF³jÊQÁ¹…Àè†Nˆ*;œ´‡á-ÂB¼µ€1«’ÅáðbÞ†ØÑ¿NL&jqQ°mÎ_Ûˆç?Ýåæ <¡%l9Å)+¸ÓŽÓUæ%ã2ñyÆ6V²-ü&*€8D¡B¸Œ}©øE!"ƒB“ÂB u)^±Á¨`†`(p‚Ú`£‰x¹ÙiÂUì6f7{ÿÁ^,FÞð@Dz‘à¾QÈ<óµ­u÷èÌEµ$$%l–P;nP8tHüüÆóv²@<·âà‘CíXµ-0´ (‹¸‡v0ËQ•âf¹P›Zу<Ýk$=o"õ$ÝŠhù|Mh™ 1šHÄÛ2  †â”ñB$$Å—hkj¼0¢!iÀÕŠDÝÅ*xAÁš† ]wõŒqD–œþÀ‚­‡ i‹C¸"å.H‚5X0‘SòÁW;}ÂHË×”¤7B° eb+Ú ÛŠ-Þ,hm¨pÛ!¡‡ 1„$‚ÚÀ“a•gBßZo‚ ÝÉ*Dˆ%‰‚B§“ Ê‹$Ö.¹ÿÌ•xY`Y=Ì=ÔÎQô"ÒØív»$¨‚Öºàa;ÀЉøE­5âxiÅ¸Ò 'ÕÓx „V[[㤙ÌyË ïëÉó6JU-4ú””z‹·&£&jþ^øÅ‚ÄÁÈq 1 f>â†ê¦Öl#"vê>ŰAH’!XŠ`!РLn®$æ7®`òð!HJeʶ@H”fÞàΡëÄfDÀæAäßèÃPË&c"ëô2#dƒfhX€olÞä.Æ)hÈ+„Ç¿(ìô¨… ”¦°Lî ºìÚ!áæ6nŽn¢ˆÿz"ž€V^OCæ O&¡bzâkB‰‹ X@û‡»ˆ r¦ßª M %ØNaXgX0¤äÀ®h^ÌÌ lâ!Òà‚c D€WÀèDJ1l † äj=Þ‚52l5Pé¦^tàô©iR¡Pã˜,hZ!"làpnɤbÂ*)šn}Ž*R. ö¡¥P<%cEl|…˜fž¦Bò«>ο‹rv$wÆæLö–š om"AâKn©HæöÂs| $f °QWz®´ DŽ–%H lÂ$Ê€Ïò,RÌ/N|„ÀUø%ŸºB¹ ãXÿ|PÀ"¢é$â1º«ìË?ð.eDÀ_¨À¿œ - „w ¦¥ †s _t } dräœÍ3ÖçmÞ@¦ïDqÑ@M DñWä„iZ SÞ‚ÖäÄ ¾ÀÐ!ÚZ¡ö¯›œï$r=’¤ bf~‚FºfÑ”1V€4¸B*V?šfkvÑiRQTá‚„Œê e"ÆA¤:ä‘AÈ!š‚“a fÀ6Bˆqª’ ¡ê.vEloH® ²ò.“B^`0$0&‚_ÐmF¾aYî+·V"xì B\/ä`äá!J‚p2¥¡(¤ jÂ2·a=p€T À ÿéî&ãXbE ¤¤C°¡=@ÂoâÂC`K0Zª¶£ v|hâ<ãn‹#lc«FÞ§CøªP^  ¤¨të V1‡Ä@:»pÁ5×c[,ÀÉJˆìÜc¸!l–v1|…a= …yEQÌD–ñŠ¥®Ä9H¤V<Ä-ª[°bôØl1]áí¥ î'†&Bd£øö+³K u§r*ô?¾#âæ¾ÁC˜ÊUæŒ_<ÄÐ!I¾á&–b2DY$áVb!òJ¶îª]zˆÆ\v±P¥9$D\a!àCääV€è(°ãy)ÿq„H°c ”¦)#R®D©€œˆÎ4 ¡Ñ€M(3á~Á²™¸&–H£_àÀ¡„nê"aëè(–üóД£ªv@‚'€Ê1¬BïŠa³rr”†jJ8gž¸.H­ƒ IH즌ÿ…1 «2‹8-Äp–\z€ Œ kByÈD_a ÄÂ0übvx,»”ò-ð`ë R»¼jõD G:JEáÑIÚa°‚ Ü#D”`E\êC¾"<>N¦%øÓÄiÊv¡žN¦œLéÜÄP`õ¼‘Cbµ¤U&»ŒÕ *‘1€Šdˆ!®îW*‘"®"whÅXÉ£s(d êÁ&Yµ¦Âjõš¢£Ìevv"Ev`ô,¢ «Tྌ Bþ¨'¾ Â)_ÀIwb!hH þÈúœsx€¬ š@=ê8–€Fp•BhFš X²V›`²1<–+Ñ›ª`Þ"ÃN‚å˜âÿckúÛ"iú¨ŠæP¢x´î}¬€æ°`Ô`@òàf/¶7¾)íyæi=UHÁ„âRƒØpêE!fHö$¦G)¢MR¤$¤€&ÊÏX«ÀAÂ>ú£`ÖMDQPac u†ø šòkD¡4æ„4‡JÀAwxÈF“ô"À¡÷„ ”`Y8ah”òEK¡øºà'Ìä1HÁ50¤þ¤ÂX€a¶ƒÒ’–_ü D¶Î´Þ¥ „`¯À "n%œ@"3I€CJž$=w›ï$ÔÂÆÉC€ÎqRA·áB\@NKjö Tî‚Âk¼m=rd=ÿ¸È†9dʨL–I¥Öc2 Å–÷†QÙra5ôA¢Â~!~’‘è0¡·áì°¡Є ‚%ó-'BB>-ÖöÜ0ÉX¡wbV¢Q+¢""ü`ZâÌa´ƒ¨ú·#:'q‹ºDÂ…ÉÍU$§„Äiƒ“¤B„íÜêÇ!.µ5ú¦ºdÈΞ>Âö¬lm¨f!-ÄžºÃ’ç ;€¡á ª6ÁÚa‰ø Qï󤄋–Ç,|xœMj^WÕžÁWL'_¢ÑÀÂæ HX¨>áI—el*/Ò€Lä:¢à`=ÐÄH,*ÑÚÖƒÿ…¦/ˆb0‘;=†M©ò0¬JÁ@n-=î‹:Ú!¬ºã|—e ÆÁŽäÒ\Œ•_Và0 ¦ê2ê®$ãu³jDz‚ ¨ëˆ8™t&E¸¦'wâvH G”Èoæ¶"ÄEµn¢ v"ÒÑ$w¨Ð}ÆÁ äø BäÀ_Ãè¶gÚbbzÅB¤‚BDÓú¢árÁ€ ˆd¼Æiž'c*((©á:¡!]Õ6Ó€¨I&n ñƒ_Ò¢bfÈ–Bpö: ö`ƒNø@vAfï³éV¡ªêN‘5ä‚+ƒÖ\s¼tjy$4.DHj<+ùJÿdQ+! Ö_²·Ai)"ñÄå" ™¼¾–Å`–_8)ôÅ2Na ˆ8fÝ€k%lš#&âfæà-ç ÄÅŽ°ˆ"úb" ™cœ'®b;¢ò6¸À5oj)`k¦LO¸¯N¥H‡œ" æ¢ÊØ|+’õ‚š¤›IHv£ ,#^€C,¥âç$¸f¾HQË`[zCR”9Qçi‡‚è$AÏáæê-[&`ÿ4ɨVeœi d« PâdÉU>¥¢|c•þ”5ÌõQ”m lH:!\>â~+™è‹·ƒƒ4ëT᪨9öµÚa$DB†¢>~îk§@ÿOKd:1”ãp¦é&EJOÉœû¦[êã'`Ýâ &eŽbqËÀFÀ‹rºC;ZʺozÆ œ`Y‡Ÿâ`N–wê¸5–¡²^/CЉ-,®àÛ)œ`ÄC€å·åš —8h»²”‰±åéØ$~´úb „¤5)ËÚR¡ž€.4(TòIˆÕ£¤‚º_š)V¨àã$‚ÂQ*q¡ªM8HAë5(œHÝ® ƒnòÁB¶CKQj£TÂo†¹›‚7´Êï£Ú·oBB¤ì° Òî}‰ DŠ¢Rä ™{z%äq²È|Œj \=GiÿœÖ$$öíÒQ·¼,G—»¦p‡ 7±Plœ)dvò eœ)Z´±4¦L;P†ßv‚ú@\¯$Râ âÔ&ÍÕ‘B9¸A8v‚5C/Ðè6よ¤PVey¢Ê(÷'„‚‡ –·AÀ`!÷§&Å 8ðìN¢'š›Pö4æ`{K!".„+dï½ ¢î0ƒêš©ÖÝÌÂL<¡ŠÜÐ&JX¡¬Ä’áP03JZJrnÛÜ…š"ðõkmª^T=nƦ„&¢"“ß³‘sp£çx¨.ZJÕà¨9LjpB¶Cr”€¤Ã[Ø@ëJ0ã|€_ÿ¬Ý˜ ´D½|c&$‰Û2ÆS°ï"ª ¾§%àÒ+¦e6çG„‡Tì )iæ ¢! J;Ç雾¸¥y‡êP‚‡™[€½ I¨Ï_.?æ•JxÂn‘‚‹ªp!¬µ)šÀ,enPØc¨0¡`BHò©2B€ xP:€ V£éh­@‹UƒõÖ+«ºÕ–4[-PÃb¶€ ¨¤¶—j…ÞÙn»àà÷}€ÀÌOÚN_X–ã#d¤¤# àŒÊÞ^LÀŽßNe @ÏLMˆHfŽ ÀÎ$l¬ì,VæM%À˜«Ø!aOæK΀ Måÿ`"ŽÎÎÏ-ðN @Ì%€P%MNŽõZSeÍ ‘˜Jg¨J ÜÙYL÷N`Õ^OŽ Nh s2dô3¶æˆéЃMÆ7bÈ G† *´ÜÀ@J=„¨™!cŠ:Å¡'!9\ Òó¢ _rÕèTïš‹3ž©ñbÇ=ÿp˜‘xƒŠ6d˜ô!fçŠ-›X˜i-ÆŽk\Ы4£Š4j@Ì"'‹ \åaI7+hÌX+ޕ傀†+Š×!ytŽ0„€aÍØ ;Ýè3°Ã2ZØèvÐ ©¡FzÇl’žwà°[]ð0YìPÏ‚xäC _PCLŠí¤P2äpÏlÔpƒ 6Ì`ZOñã ƒõ  ÊÐI\fôåB 5´‰}+ˆ§M[ ÖžDeÍ}8$€ Ш$" -ÈÁFDX´€à=¸ Ÿ 1°uÓ1°! /ÀHŽ U¨à‚G"±Ç™iÀr'J&<èšrPÎ6($Gˆ ÿ¤&;°€ƒø0E+3Šb0õI(¦ƒî1ƒn{„b9à [ÝýÓ|‹ðaÚ¨˜2a¤*b ñ×<}è‘Ë|{°Àƒ 0ć„Rb½Rà­ÊÀC¤ìA„Ußô`̽äà -´†7}…%C„b0x¦ 9rL>RP4Bx_ 1èPƒ ’Œ :È;0 ¹F7:UCÈÀð[C®%¾ Q]ÁPnß5'™ ¿BÆ wÑ௠4!Æé .X5ÊzjŒEYÜ ÁÇàB *àÅ™›ÈÐͯá­Ô²ƒÝ‘ }xfȧ™ˆÊkÝ ’i¦’Ñ©ÿ´‹ÍY Ðà‘a*{>&ÔaÏ’Éob‚õ`1óé±Ã G(´œ8¤"µ4|,w]Oi°ÊiÁ8tCD(=ÄÀƒ)ôbŒ|]œáR0I—E¤‰ÁßÒ®bÃ3²¤F‡æ2uƒ”¸ÇX_¸°BE:¬0’ =R ,ä ‚Däu»ÜHƒs„Üp„ 0cÍh×`n—&‘"YC½X1g‹Q3˜­FVT’¹ÕèàB b…Á°W²FW=Biß7rÜQÍV„›–PÐ Ð,œÆ gaÚ Ò#ÁNr°ø„§; cS‰°”Ú¤±Éf†¨Á .óbÿ‚Ö Fp¼¼M¹Ž‚&|Äeº“…Ð 75[ ê#œTJ^¨Ð öpNX£~r!T¹ƒt•áž ‡ AH$<Ð äÖéI„ç ×1”qh'!"àÇPtrðäËdJ%ô…‰‡¥g‰˜$œÄߢ:ǃ¯úp£(uÅz88”è`Œv&  (¢ ·õà5¿rJB+;ÿ§=)b[ÿw˜0"KM°ÑLá-èa@WøàŸ9ÐC%ZÐ05ÿÓC-ó±Pä „¨„dÚžÒà¡dÙ•–“Cñ`=à³BGZ€á6Å4h$õO¬¤;TÙàh°ƒ.üfä@†Fs“‘  •ÄP;ì"Óå>žÉl Þ³°zM2%*kð ÍE³«“ f ™O5Ä*¨B\(I…*/8ð‰jÖ‰ä7L;³Ï–¦ÂÛ>rê‰ê!¸"–q¢Ozá„ßÔ@«k€a6A†dž¸OxJn ÑYÊ ´T•µ,$Úa)· T‚’.aãÇpÇ'œšÿx€‹=¡ÅMþ[ÄNñN¡p&32±k˜}"° d':¿”m7˜³Âb¤³2L5ÇÕÅÂzÔ^˜&,;ØRf‡Ò£XÃkYÃzfá‚DÄ:Ð0Yñ$y J:¼QŒjš+ÚŽ ‹L%DÀàkìÀ0üÄâ’JE0ß™Ø1šõ áÄd›É?Ɖ-O,Y'ž,†+  uñK’k™ÂhTOê¹A%ûÇÐFXCjóx&ej£ˆU¨"Ú¨Õ¡‘#aƒ>¢7ØcÅV¶‡®5k¨|xL¶Éù,>`¢ˆÈÌ„–3†v7…›ÎD]£"½ Á¡#˜¤6ÿ¤DGãÉ…¨Ä rï"UfõÛbˆÀNõJÖhV1|€¹Ð$A uE8tð‚*pe©-Ãò% Å0¸dE(R”A<1H9@·G>áxìÉËz`ó5LÅŠ©1ÄŸ „¢J⑇øÖò_+8k *I.0ö+ÑvÁz`¸B~[V¤ #EôŒ&Ù–A´‹‹BÈáh»Æ¸Â©Ônðô²¼âv¸qº‹ÄI'1-—r\"Dp>ð™Êćº&r`à.F¹HPª3"÷ð! ÎHã RAƒ?Êãy®…,îêE×ü“Nª—™~…Ê&«‘H@ä5Bxÿ ºNæi§ˆÓ ‰ îšE%Ó¬˜ü%Lÿà)èÕ›Å8S`„*zÅÔE° dáÒžªQv%û˜¡’ó¼D2¡ÄÙbÊìR”±bˆ0?¶gÖ”,Ë q}š¨CE‰q‹ ˆ0QE³Ì TDG¼IgT*àÕÀ0D¥ôA*HP&8^Ä 8ƒaäY°Ë®<`‰ í† $ €tÊk‰…Û¨–&N A@e†+Â}Tˆ^2é„!J `ŽfÌÈ@³ü]s]ÃôÌ]z BKsˆ”dMÂ^¥ZdT~U„hËGôÀàŽ^ÕÁLÅ3ŒnZ`DÊ´ð¬‹L(I‚&AQ Õ%à ¨H@e×÷pZÐàK„Ê"ÄÈÒðA28Éö ˆAHÿÇTÔÇq½ ¬€(žAt}Ã0õ…X„Þ‡m¡kŒd(ÆdP „0xIÅI† C T£pˆ ú È’ÖI@AE¸¤éãéÐc„¤5Máb˜!­e—l‘>„› Â[ýœ#~²%DœC4È%xD†”‚øJeàŠ5˜ßÔ@D³¼¤Ä‚æ1ä€v„Æž›„‡ï|Š˜O¼¸Ã½é€èÁÁŽué1à€C”ÈÇ@¶ J¬€ØEÂó(‰1¸ÖTBxZk AXÀT†ä” FDìiˆÀe×Ò¥Û!óÔä¼|Vdná7pBfI <ŒÀD!œŽ,ÿ C9K¬DJØ)ˆ‡!Ähˆ0|ÇY±ÌŠ”K,=N:lTxã]ÐAãì’J¹†ïà‚¾&w4Ùc™¨i‚ é¬F2’¥È€²¥ÆÕÁgÄ3,'ÌN¥ðζ]õÃgÑ~ÀA¼…üÊʹ®ŒŠ»á‚£B„6é™´‡È‘AðH(l I‡Y—7Øé€IoKOùC.LšîlÂ$èKFyζÔKEÇlj_c ‹öc8›0H®xd™Ì¢7è?ˆx@ÄÉÅÁ`S˜ %‰P¬„Iæ@¼ÁÒÈJèÐíDu`e8Âdp^èÿ‚ÄÙ€¦½¸‚†;˜Æ01nõ]OÌ@U6MŽP®䀆B(зΧ\:[|*ÔhÐR ÀSµ&0”ïm[2TgôìŠê¥ÁïtZ¢Oú­=Adj´‚ ‰pnÓƒ Å5Ä›6h\yÅ€ S]ƒ|ý žŒÁ´M¤]ž<Á#„~å’â¤^6©\ §Œg‰Ô,TÃð¬Û¬è-ÜM ¤ÂA°2Øe2Ž!ærPì€Z„«•KÌ5¬‘Å“8’© CÝ¢€7bLÙë1ðäh"[ÆW¸‚•-aèyƒÜL.WySd‚N€ÙÕ8†§üÿ߈ÉlO"PèHJƒsB‘/[nÕ9ŽX*E?È 6Áµ•ÈÊ4ŒGd‰ ®®5tB¦¥ÐaâS§èxœD`Ì~(æÔ ô }‰H„þÄ Z.N<Èt]¤È¡A˜<‚ŠLÄiÃGRDiH†0¼Äïø ñ4 ©Ýè<Bà쌒µXŒ*]®èÚÇ!¤C€Ø–pO¶gþ>FˆÒX^Ò̓`?øeAV‘¤¶â£2ptáTÕgL‹Kˆ˜¢Ò`ÙŽx1ísëÆ~S öÓÁb±¹ Áz@¦ÜÙ< N˜ Ä+T‚1ÌÑ8I%±A÷UBíHN"ÅÕ+T£dŒ_,¤&@hAÃéáSÇ×ÑÔŸnòèœ!,Ç0Qv„‚]È­ðÿ"À’ÌAXÁrd;æ„D+ƒ¨@C8ÉŽáL Äl|ˆ†b Æà¼/®SŠLH†˜9fÕ†$K&ŠG{ΔB-¥4„_º3žÓ¯XÑÄüNC¨ÎÂHæk¹'´Öñ‹4ØG p¬‚V‚­ ªÑøÍ(ÈM!"Ð%ÔO_ŠÎxbÂè=CÈDϰÊÇQ¨A(Á'<Ï=…J-[ÄÅ)þÎAKðàâ¦H"øAL£€@»‚oø…gу–aêª5!d!ÏÚ.Î8&8‹a`ßà „µj8ö%¹üÜS@ä‚ß´IMR±¡  §ô£½tpØe’éÿ&ƒøÁSÒ˜i(áPÆ‚_Æ€Šè ¦üldê쬗bD°ÀôÖÎöƒ¬=R¡)ìl—ewBIhiƒèt²‡v€«Šl´CËqÝEo5ë&ß1,ç„ü&¼Ç}eG‰}A^`Á~)' »ØÀÃàLÌTw¬Á=¹[kßyyúœ…]Ên¸ · B}‘&‡Þjxö]8 IXˆìKºÈý¬‰)¡M#ÅŽ^%Z.< ' Ð…H€K¸áÆùDFP¦1¼åŽå1ÔÇ´ˆ‚î"c&ÜAºB ¼ê žÔL Ü›J`F¢}/ÈU¾Õƒ xÿ¿8’5^‘B³¸ødÌ =¸ÄzªYæ…ž7d{3ÓÇ8%ªvøPµ‡ m5b½˜øñ‰ ?}¸Y4S„,ÆŽúûæP©ôj¬³qq)—.3™y–/СE&]šŠS**Æô˜³îÊ ÏŒÓªÕÅœ8hÜÀq¤‹ZR©håoMÿbj'zB£F *dð8¢’‡LÀ ÐfIeqÒò(‚K‚wàÑÄC™‹·@™à¸ò‘ ")€Æ¶ÉšaNËÈØ‘'V ÏjX;>üy!¹0 ]bš-OaÄ3t;eÄTdï‹¢¥‡8ÞH„x‘Ü]–«·þúYœGÒjXß/åÀYaŠšÜQAÅôºåÀ:þâDxDQƒ‡izh¥Ñ^@Ò!$¥Æ‹­èà)±È_¨Ñ³qd Y:pR,²†cL„J~˜H¬fq¥À^(ø×[„™‰@ ÀÄ H’Žæh`ª¨ÿP\•x4Áи(áua¥L£R–ù¦!"iR2bqÉ 4¸Iuã™hˆ/Øé T¡—ŽPÁÝyÁZÄÙ &*iK[¡·˜ËÓÈ`mªð“7Da¡ZÅ:œ1ƒ›êÄiÁrŽ^†ŠdJÙÐVÃdà©sùÝG¢úp' •àÁ©qŒiô$àºCeò%ÿ ´ ІzxCŠÊõ$U™ˆ•Þ¸PÖdbHÑ{Þ_gFð 7 Óg>ú[àâÂ)“êÜGÀbƒ›œÅm®Z^$$@Re;LË&;dä 'Ââi§é¨Îd2D8‘oÖít‘üÃnp °Q.> Nˆ8ä¢!P»StÒ°Û® ýãt §,á"›%Pà³GDX¶¬è^%("Ÿžù ƒ;F61íÚ¨(Ð"`Óh,PŒq*,#`‰;Ñ[[áB6шrÙ˜Å$ÿ‘Á"lmÅZ¹NBbeLm¹L+Bv¬HŽË&šGNÿtÁår—c‘ t¥ùz%êØŒIGòXÃtuQI±Í(xµhâ0—¹TÎMq Û` ‹LÌéŒÊÁö`ÕÜ.Á%ò€wôp#l9w0±„Ê tnñ&"½3•#3j€ìD¯ê„gâ…mé(©ÈDÿÌuw¬dVn«B½z‹$ˆ3„H„x%$vB¡ 3ÂvºsÕ CD2ÂHWBÔMx#7Ë*L*Xk`õpˆ–¼Š.4dá›þr”ù<*•2S)ü00ôÑËóþíFuD9ð)Fª `Ѓ'°¡Ïú°¨7Áá·Ë"wIÌÿ!Í‹8l‹’H7M,üï!-ˆUг´…ÝU¥ñÆÆIŽ ×R4‹CYÄ+qÌn§Ð)ÑHœ¥P  Ä!7Ùé”J:Á;~EÌvKb|²È!ˆ@ ŽÂ¥.ží5ìÊNïʈ¹ª ‚œè¨tþ(ö¾¡T+ã¤,Ò¹pDm¥BÜ ¥)6‘¥‰]†co(Ž)¡ ü;cí.ÓÍè}øw2øH«b0>aèÀß7èOeP ²@U\Y! P°D%uw(,^…"ln Ý¡ÒQb±¢ÙŠ>ñê|¶•Víp(s18x‚¬Ï+™>p„’Ó™ÝwI˜ÿÈY[tZ) ,!˜ŒOWzP vûÃCo)Ä –+úc¢U~Ä…õŒÄö±^Î;™Ö£²^HPl#”ƒ(FÁ HHI»;“uÀ„¼Û’`ƒ»™úÙ›—x†Ð+œè’M¸‘U8Ä»@ìÐ9Ôi58 éà ‚è*·)ƒ¥ Ö`Þ*ò †'ˆ ±É¬Jp‰Bñº€Ð´È*޶«r8*”Û)6 B©1ø„z™:B•°ƒ¤0vKœ6 䨄Xµ· [7{‡u€ÜºŠ†«Ýð/­`ЇbG ) ,ûq íh#pØ›l:ÀÿP €€C†Tت¿¡Ž];¦Š ù¦2O`¨7à¼/A:c"«p‹D «T‚Jyžêû9«Ä@R\™œ£‚À -}˯0‘ëC“°À^ ‡FQ‚â¡àQ§Y;X‰'Á';Ø*ì¼*#m™ l ’£ô؃ªÐ‡ IIy2¨ EÊh85ðžeè·…ÊÜ:‚sÉ•Hœ «„ Z!˜ L(5oª%Xˆ£BGX(˜çx’¥ê8¡m S¶Ú*È‘´x½X­+¼¨˜¹VÓžœáÚ‰¨NDº kž'˜ÿÊ À7@‡$ 0zh+“5 ƒÄG¨˜RœI•±7i.…X”ŠÑ $a³h€DƒÑX‘T¡Î8c¢‹8X01‹,„©¼ªŠªàІ†K g¨è`‰)ÈôX9Z<4D€A;BÿQ;EC„fÓ iH„;ˆÄ/Qƒ¯`WÑŠ`Y!PI6`ÝzŽ©Çx;’Y§8=éì˜0Œ¯Y4˜‚(¨1ô(˜»¹&P :Ü20Z‰î¸ø3‰žª¨7è©2ǰ„ÉÄQœNÐBœÀ9çI/šÜÍ7A y Q Ô‰ UÜ“üd ›ˆ'—ÿæð˜R7%*‘‚X‰ŠÉøÀçŠ EÈ ¯K<ð­Ôp„…mÈŽÒ™CS¥Êx¥i΋9„ @Ÿ Ž¹ ps0#xG ‹ ¹È«Ð–D«•þù„4èW‰. …QƒØ–i²*n½Ü4I˜Op 0ðÁlBa*ƒt ÞÀ„´80–’ a¸½‡$‘‘iMÀxŒP€ˆÀ 8P‰süt87@¼ÄVàM!5 AJ˜Iš+‘ðT†j åùË8Úp‚¸êEˈžÉyèÈŠJ$“Y˜>”G¸¾vÄhP±8´TŠ(xn{¨è ‚bÿ«Ú‰ŠK‡!«¹ \x°Œ9‚vXƒ$Ii'üØÓ©‚•[!;Re`*Ep <ˆü9…p ª£a»‰HÐ;Þb‚‰´©P@‡=``¤‹!<׬£M02Î0&L˜Ÿ‡¸pU¡C–! VÑ@ ‰Ø·GÅ‘H'eØÈÒ@„ÝàÏC=“¢ÀO˜Ø6H‹ê{¸ Øx& 2Ý ܃óñ”ià©[1µC'8@hÚʲŠ¿ìˆž‰¢†áÑ„mB„³ríh8zZVϱô˜F©„qÈH€—0‹ˆ1/ˆˆi™Š¯8—í #LxOÀƒ“ð@f(ÿíx„…‚Ã`µnk%`„âùMÍÏNÉÒM8ØQ€!RЗ¸Â’¼Œªð<¬ˆ¾“ÔRiV¢í§X¸QÊ“œ4ƒ8Aç‚›À(Sº 1y èa·kZ’-(Í‚x‰T‚J²…j蟮¨G‰p޲| ép Z‰Л2¬æ Z}ÝUxŒ¹˜‰¡‘“X•°¡(N)õ„…Øĵ‚Øq2À„KÝúÀ¡p Ø±.™BŠÉ‚#˜–™è¥Ôyœˆð¾‹DI‰+yËB™ÈQÀ„¸!/HËv£’| ÿª‡Q…g5çáH(ZáͧxY[ȯ‰“™…ÿi-&PƒW©"VñZ/)x&ᎅ6­ ˆÏà½Y˜½‘Ñ#¥YˆØT—fƒ«;pÆæñŒ 9]ÙVP‰üø $y$8¹)ˆJ™ ‰ Ñ"b‰Pyx¤£ ™3J´• ”˜­1ÓXº Bè¸|Ý‚²m"rÈH\n;úi„ÏÙ‘p •Õ:‚Ä/˜‘u Œ›•ŠOPƒÊÉiÕáÝá¡ßZ˜$ ’70- >>ƒq´[# ez¼`8˜tƒ•‹ ñE.Êúð%Ò¿üÊ z8ÐXRŽHŒ˜ ºLµP0-™×¹™‘´V›‰ÿ*h…Ý[ž¸ÌR‚À (  sŠ7Hº§ ŒVËÂÄÙìx P4Y„'rsºAžÐ£¹:—8aÇø@¼ õ0…šµ› |…Là˜Ä!ˆû%êÈ``…º &HžeUòáZ@©•áÅ»ø‹(À©· ™”$ì˜9»‚kȆ4„9’å. µ =$Iõ)¤8" ‹!P—Nʃ©!Y‰¹èâáУ{=ŒÆ³KRH Km‹â!™üj‹â˜sé†+Ù1$6y ò¸j™•gHº®ª‚W¨$¿‰‚G Ë»Sb¹³Ù$…ÕX` (˜MP4\¤Qv¤K“ÿ’ «æ™/KÞ¨5X]ZæaÔà²i`Ê9Ô†Ÿð›‹ð‰Õ\…Àë"‚QB©P$eH'YHBèíhS*@®Xé‚Г$ƒ>Á‰‚è»(ßÈ’JèUŠë mûq%δ:å É YÞØ¤ˆµäuá ½°iŠ›ÚÜÒèØŠxÙÒch¼Jùû¢,qQ“ˆe` ÞG)Å‘*“ÑJ0ɿٔ»¨­KE@ËêL(U"HiÏ^i.kâèä•0¨NH‘ÚÀ执ÈzÙ­AÙ€ã5×@6|áIaèHôP…,A:W!*W)P·ªÍ_¾›ÿ"Èì_l‹hÒ 1Ñ­£\‡\;ù’n¦†Jñ©$1ðäJ@(.`#wà(‘°#²#ŽžIÙ‹z`ƒŸèËÚ 0¼[µèË$ë£Sa!ØÍ0…ŒN‰Ç¾H¿i7˜-ú¥0p«‡ÍZ1ÏNiÐ.Þ%œeàU»;bœUb-‡TR ǽÙBÙƒ™ ‹jŽ—°ûœó@’•’·àá‚ù¡ãù '¸². Ÿõp‚ó¡…zxîв*MÊ;opd X˜£Ù'蜢ò 'sŸ38‰•JOY‰„‰zpúq­¸BxHœ3‰ÑƒÿGØ OYYps3q’±Mý‚Çö/A ‰á˜Š›pZ®pàšÊÕ m9ÀÙ’« –=<²›}@›cQª¤`à#Æä ”rsW¦é›®Äm‡ »¦V#%6‰-VØ"ºD ÉAçthÔÕ(ÈK¸¨‚ÐÌùðmɇ·P u‹Àâa©)YÝÈ7aƒS@x*HMÞÈ™T›ð¨¬]‰?¹•ù¬ÔÛz­ËØÙ¨ó<+µ;/97(G‘iðíÑ%EßaF®¹Ú÷¾XtNsõpTcš†Žø•l ƒ> S‡x ƒ9˜» C[ ÿ=8¡Kyì)P÷ssŽ…ÊûÖn)°:œs –ø b ­fC Jb`“ÑFvؘƒ»‰È€Ã‰œ~2Ùp*ж£Æ(`à(4€¹†åÝæ‘{ez<áÑ Mó…¢èñÓX@U>“!ß<)@ŠR² G?pÖÞ€ÿ­ÄÑGîdµÕ:ЏD Ó\®OÎÓµ˜$ûXZ&EaXˆ½˜`éø,„8žˆŒ ªîL0—-5o«²!xêĈ”CH“¡”½e¦±ik¾¹ ÍÔ£‡è[±âi’Ä0Žgh±F¹ˆÊB1ØŠ™A~ÑŠFX ¬CÕúC¦ÿ裇ò•aUhÎ͆Õ++=É£ÝM¸áùÏ5úŒ©í·'Ú¸ÿ(õeÙ‰#5ðƒ1œÙ5ÄŸHœË؇Žì8£ç‹;ˆÉî•fØG‚–v›£Ì¦»ér:Àðd5@àj»Ú-Ëâ¼4€n—ûŠd»[oº³!¥ø€®7›O©54>2192782j7<6=2mm11g`6"3e56;,==,06-"4=H”7;HTx+4F/.96xTs:83*86<.QR<þ I¡á* +;Q rŸ4ÀÕ bFC‘E å³bÃEÊpÙ^ÑòCDH5r:ÿ1„ÌQšz/ìÈ© ¨K-âµ%2H$Ã";ô ÂYX1–üxò‰éIÖ >¤è\~ ãBª!}aá!-ÑDÑ,i¤˜ÅDQ¦«îºì@É.;ºIƒC΍˜QìæGŠªaƒ[@*Ã àø ]‚ÇŠƒ…}feM; 3‹¨Y!PƒÈ®ˆÁ€‘!aóI6Såb…/9$‹ YÚÚE9 Ê ‹g PRÌ0R¡[ˆUÄ 4àz…+,Ô…Ä °¬ Û,ÃÅ…©ô€ ¼ÒRñµ:ø@1>ôP—ÏMÀPÕ)´ÂÊ(æ’>"ÿ…Ùfƒ¡eðUñï.øºîޝZˆÁÅvªÎÆàRÀ -ób L  C M$CYºh¤­X§&8ßà°Â ¦Ö°Ô Єի28ôPƒù8q”j““Ÿ¤ã¦Ea*j£ªº ‚ Ûæ˜ÏbT1ù¬¸yq7Èàƒ?§ªûRÄPU |Ü £š ­‘ƒ VÌ+ 2ð€E°öÔ{[ (‚©† %I0Y¹˜A.| ¢Øš h7‡B)[r,Äæ*ÌpÌ`h §Áqø‚RØD¡wõÂx*×"[„8jŽ Ð%”PAYêQÓh¨ÿ‡¸H$¥¨C^rÂ"'9«½ÒPÔna7LÉ‚YäO›¸gpƒÇh#²èlÁ-‚Áèb"YÅ>jð ¨ib`ØŸÆ/ေ›—sÆh E"ñB«.fGÍëLR˜¡à¶˜Ä9Ê lÒ'âÐŒJZCdÃX®ÖÁNzRü$‡ÌÀЈ” XàƒÚ„Åó±"ž¹ðßpÄlЦÔ|*¬ñ„PæŽJC;(Äên…E¤haÉ‚˜.Ö ÞíGb²BHf.Ю ÕhÁ Ñ#$ ‰Zm`¶Çqfy‰ÎpbàºÿFêYÑ\)d“­ IØ` #H…Á•HIÚ´Ð|ÇYhD=p4…EÂo³Õ!afj0¹ûÑêNŠò¤' å'ià…ŽÁZ(¹ŒÒc …! Š¡Ѧ•âxA8Z È0+áp † Ìí§ÃÊü‘—˜%>¤[Šâ…!'Ð\DX´±Hy( 4Á‚˜šÑ#Ta€©œh®j¢ÁpÔÄ3µ£)ÄÚûÒ2ùõa?•bàƒœ€¨lbO:#‚Ò `Ú£úéÑŠ¥a<ûÃ\€[ÈA5ZàÂA544“PAÿZpòJgûI•zrg:Яh"ÍA±"X$!#DÊ -ƒpˆã2êˆË¸ d © -*V¶x‘^[E)¼€lµùH#Ä£º#¼A‹T„{o“É ÐìVz`å:…d¡FàÂNH›ñÆTL=¿¡ƒ(K ã\AíÀÄÄ©ŽvKgµ°¼OÄ`rƒ,ÒÀkI!'\“æb¸Ð \$ÈР˜HªeÄà(¢BqiËc ÚÖ“õ* º“DC²† ‹® ‚ðÂ7{ôÁfá‚ϹÑN‘«.±àP—ëjº¸àÈp¸(’Î`b/fÿ˜A ^›1^ˆž|™ƒö’´'( ^X$1>•[KµÈ‰¤ÙQ¢¢|Ø‚¶N&XêCZЀ+:BCkƒ"pŽ&$¦IÀ„Ô¢›D¬1F`'‹€ÙA~0¾‰Oø;42&À³›zVâÍep!¦øèh3ñàåû:p?îäfÔ¼µ.¤(gHˆBLüð õÜ‚-ØB Ý7 !-HÕ,{—å Úrã­A~€ oz&n”jØËÕðËR&³¸`σE“,hOUCÀH "³˜2®S„5`°<¨AÖpÁ ,´‚yè,pKÇ©‚ü[añóÇÿ>h!ƒ.Ö‰BÉ'œ©ª—  w˜O%om¤±N<"ðBNÒ€,ê ¶’€¢Ô$§FŸ_]Áî ^Ù¢ C HÅ.á(Ø9Ø$vVÌeQƒ4ÄVâØ´+ý…WÔ MUq*q…¤m¬¸HEá`>ƒ¤DÍt6‰ó1Ko9Âuè’cd0´84š«)Îœà‚´roÅàË 4†… €IxHÅÝ+¬_ôÁ]Nz@buØ M0ðúÙaÂ\?GÆÔ`„ªÀHÅ=óðÇŒ‹°‡Ö†pd{ôâG)éTÁk6vJiää÷°uXò‡ T§O ÿ†àuK 艰ú qÄ W7{/”½ø…?p B76`øÊ3 jF¬ø#;Ù‘l¯Ab/2|á:¯ÕJ‹ J•~££"A$V ÂpÀÑë£W“ó2ÓdU€"„D/mQl±{c ¹µI}´òZÞ¢-Z@“Ñ¢ ÔàE´•4{ZJZMd”ÆW„K‚|”¡RzŸà¶à¢PŒb >` Š%“;o0 Rö Š`Râ°ŽmW0/äF²¥fHÐU³p…ðÛã)A#ª †  ¹¡ i@]Â>SÀRáëÑ(dH3=wÿÀs Ã1ðcsbcP á} æ'X-R1àD1±YÆg°×â:Ì-#cǰH5¢0Á,G)"b6ü°ˆ]‚,xÁÕ8¨ F8Œ¤„>vP°%²H9вÑEQKþ¶ A â#i®†i¢Z:°"š`T[M£‡°8v^UöÀWÑ2¶°Fà4'ÐäE$ E1nx¿ "¥>5 _4 ʰP°ãA1"9'? ø )hãtYÿ£zU¡²IBÚZã j`R_3ss >4 ƒtB[ÿ ÕAwÐ%PUBcÀ:°ðå…- —ÞÂABŒF¹Aß×c,‚FÓJª" üQˆÅE¤7ÿ,]¡WÂ3€&µ/0²gоR]°Ói°ƒ4VðX€T€GÙ±’Úâx†`“IDe“Ê3 w@SXLð©çÍÔˆ>0§`‰ET'©10Ö s0‰UFT€3I€ N0KU-¡!ˆ“sÒD ¿0M!T¿õs  ó׋šÑXv••´7Ë0(¹8Q›QvGù›ð”=6 àÕlÿÀÒCè1n±}¹E üayº qåB%·ÓEìB+ÿÐSÀU± ¤*°ꇌ“§–’ …U Ž8@YSiºå¤7ŒÕ>`ÿ è"'sDgBÅP7ò"Öjš#|‚…ôÒ…pk¯´-Ù6½0ñWE¸™Ðó*qñHÀÀ!ô¢š×pù œzÞâl\€"+Ñ ˜œ8ºÆèc‘$|žP,°ƒÅ åFÀÁÂr!½‚ ¦Ò˰“’IÃç <`&R–2NGмÂR ÿ@hº—aQ }bðs~ªpO -‚0 7´1‘€i3´âCj1 ÃE$‘"â¼ÿ±BUØY£a^C-!;íÁ1%}µ³˜>ô0Dà hdb3.ˆ° 5ƒvC×¢ S'6¹ÒßbB†‘£´ú$ÂÉcF€ ÒÀ‹Í–;…k· |þ°Ó Q^gÄPM12­-Ws¥àðÂuIc]r¹El`!#ƒ3ƒ ˆæ«‘[áZ ‹cJ¯`“ê{!!Ø3z7S€T¸9Ysª 3ð †b{E0·°- ;ɳT3¡&sCh LäU"ãUúŸv·¢-Á0QÍЛÊ`á‡JplÃCHáV«,{G'sjÿ@x³ðaCx"ˆ:ð ¼"zÕ.`jR)K #¹ml/@!æßÀEË0NU$exDOxŽ  XaÀýXÇ‚’>ÇRÙ!ó±+LÁ_u“Fj’ n¤ݲÀ Õ¯:ÐÔáD¶ q³†ƒÔ-¥4y*Ñ!'j¨° ‡]2j"ù“ðÕ’7 p×Òз™¾PIŒñ Ú‚z¹Ù›"ð-˲;š„_p?ñNÿ0êp‡JºÐ ÖÐu1p]jReUØ… !v€.űÁÁ`gð#v“8›„—­¨´ry)‘u€h_à²ÿpss²r ³çM™<7€ 1,Z³TrÁ6qH¯‡¹@)^‹9xÄ5ž°j C ¥Äw?“põi†@¡âøº ž làd¶à €Ä3Êf7$³ØÒ)ù s¹a1¹0/ãa§K«©ëcÛáX[2^‚ŠL8 Ó¶–2’ §YÆR%‡>»ã@-ZÀJô2 Ñ39ÅÕ%ݵ‡ôR ¸aB9¡l°CÃJ}Õ%Ëð †@Š9¤Å*— i‘êD›Âys©Çmñv &DbÁR›q^¶P’ÃÖ¨*ü2Na©$óŠ`­g¢X 2’³HdÿÐ2;ZBČćÃ5ª7#Œ£%œAæ¥0õ#-s*8UÀh%—%Ëå+²K?C½D,µ(µƒÂ¥À·ÇF& _ÐÂÄ¢(€)¡Â!L@ItÓg‹ “”½óòa6¸Sp~Ì€h£vY 9kJK@Yž*¥ bµ}+»"WŒ ûðþ  Dr]ö¢RGÀ1'I@Ç*F¤Ù¶àcZð`ü2(ä¡+¢ÒJ\ÀÆ‘ü›“ŒA“œ‘²+×%üY9c9µg.Ô jQq~;<ÂàÕ d­¼ /`O¢‚‘¨ÅuùaBÂEÿs`¸,ƒ(-R¹2{L#%èâh>HDŸ¸‘ o€!²V0À)˜Ó2®xÂFÿpÌé±z¥‡ÖÅklSZ,*»_0HaÉ1Ya­Œ1$Ê*_ÀŠS zžÀ¼iÁø¬˜!Wé&L±-Ê :m„m8{M¤'¦06±ó{PÌ" üñ2’Åâ`>I åÐ-B‘L3݃†!,0˜RX (»FZr*¤-ÜpB­ô%ô AÜ® WÕQ¡j¦ÌøsÔ2Š.-nÄEoÆB Ò0'4ÑNŒj» ç¤!>¬´0Ài6) ±(®€ˆ¶¹¬è w£cƒA°ÿuB³×¹ÖkÜp°¢,ÝQHuMŒwm8‘³10yÒÒ ¹…sQà|1V 0âIÃ3<ä@Fì:2[IÍl"Šø Ÿ¬"½ "ñ³ë]NÛ²rYйz%) uB jlÁâHc\dÙÆ–Pò³]T,pÀ5CÑ—XÔ¥«:0 uó–§ š~O41 ‘B#áU¼µ<癹ÒÌEߎbT¹²7µ¶Áó-H|án]ÀYåm×·êk$fêGF4’3ùt¥j(쓟‡ ® MK0ó\à ãâŒÌÒ!» ›£¤‡cb ¹5=UUp¢ª‚?0è8kÿ°HÇ¢+ zì@A7KíYi¯FÑ"uAÖJ†KB!5#d@,¯q,BÁzÿ7P,Pãö}J4‰ÇÔÍsÕ«;ó«-ÈÉ„Á Q7$2 z¬êiªËRº3êU~tçÞ]Ò¯|QŸ%x)T Xd§·RH5 s{:ã9±&[X›ë†ñ_)sriBL1@¥¬Êb¨eƒX’Å0»P:1Àªzžx¥k Å‘trJ8s°äZ'ô`x¡!hM! NÐЂ z\ˆi²JX€NÖÚ+à²-˜€p€3¥7s~7ÌÿЦtj"Ì2ÆjÒzì¾–ìƒãM\ÐàÓ‚} :-») pwBÕSXzè5®×O I‰& ´ ø£è¢Œ³-£ßÙB6Rî.§Ú"FŠ@„`)X0p7Ô†¼àuV[)T¦¸PS—bˆ¦ b1S*VGP.ÐxH 9o!e—I¼)1VÀžsíT‹Þ’ýÞ_P^÷2œeÉcä*íèRP~6ÿk8?8Ž¢ùAIÜcÆ“XØG1ŽõHœ‡¥ #Bå ÑßÖÚ âØ Î^Õ€/ÑcµKzïsÊ›Z¼‚J8ûŠë¬•3<äq!¹ŽÕ›LÿaÅžÐR8#ÿW‰uÀ1(Ž goäjºm;z Ö€&Á}œT£ø ʶ¢¥÷“Áǃ}½@#Ú|59["u¸^xí–Ûõ~Áañ˜\6ŸÑ_bšÝ³l€š‘Ĺ*wõwªpˆpbl`U|´^ff^dVìjTŠxv†ö<{nln–¬|ôvfˆ¨x¨pôˆxôy:}®„J«zrdhnn<‡îhtj`´V`p‰|fppltôDd8az|nbn,[t°_,«rnji|nhTôflDxp^jlxŒ}Zf¨ˆ¡EÆŽ.r¸ˆQÿC–9¼}ãƒe Yyrà ²GXXµÓQt&±h ¦Éxè¸Jâ†ÖK§ØhÐ š,²T¨‘žtØC7ePa´è…ËDøCˆ¯€>+†Ù!3OôH.$f2Ú†9ÜláÀ4L¨ÝÓá‡kÒbš]aüþ³ÂD&ˆ˜L®=tøãWhXØŠuaÎH²ðaùþn)bؤ*%Ý.Ü `#[‚ñ9}æé (NAì!dOèˆV‚!§;:ˆ7ÀEF¬¾˜ˆ©Ž¤N>‰$r¢, áªÉ€ì ÙŠ+úö™¦ÞZA.ÛÀü“DQ,K˜2ÿwˆ¢‡BÊö0æþ-»Ær²ÌaÄ-høõ”šØóÏÅô65¸ˆß´2¬ìt`¹ŸðOÇ’!Jlæ†Þúˆb¥W±AªxzP¥~®¨a»1TÀ¡ÀŠ‚ä0ª§‹Ý¡Ž¥7±XI胫/VˆaGß÷iº†Õp€d”% ‘…kв,Ÿj{`a5¼EŽTpXnÓÎä1—[€ ø¬-×BˆU$1yPY|U¥8C@ûJ…¼á"=¦ Û„r2:‚Nt#<Ãs Ž%”D–¸WÙô‹÷X"WPŒ¨ ‡b…"A¿áE 4ˆˆM”‹Ò zIU!ÿ“Ã`±¯¸¡L,&¢•倨“߈?3hAÓfàì`~dœFÉ”÷—ˆB,\|( -Lð ó” ¨$\A7 Ò º×,È+^¾³D PÈ^€è+zЊ †ÐƒxQa•Ôä$3#ðà^Ó#UŠu0*$Ä¥tX MI†?ô¤¢Ê‘HÌ$˜çL*繊:1„Ný /(ÒÈlЉ’1¸ðA0lx<7¨‹X™ô ~Bš8xm3pã LCÈà.¨‡ŽZé;”ìzˆˆA†¢”‹Ñ¢²E c,áCàM& ¦ -%/«¥8Á‰¢”èÿ—&2˜‘XaI1JÓjÖ2„~U“‚XuT³è¦[`ÁX0¾¦’¤ÞAeIÁ0ƒÄäqXÍ*þ„„8Ô€oÁÌo³„Z” EKèMB‰ÀȽ -6ö(*|²&I @ $qAag=-‘ÞL‰ ˜±ØË^òÂ)´€›4(Ëp‚³‘*Âçi6ð0¾P‚{©¶p d¥#BÛ·¼ñ+z 3[h²7ä"”£0g¡µªÆb¡E?Uq*LD‘”nV''åìT@-& æRMŠeÁµüÁJ+I…:!ªÙ`'^H9,! 5´@ic"±„Ük{4‡´ec¦vI)·Ð‚»¯sŸ50<{à¦Ua#í¨ˆ¨Q‡ÓPæ!/Åäò8¦ƒh`#>€"åt” _܉SAë—!‰¾2XãÓßHE!/Y‹"ŒP;È ªÃ«„Íö‚å)ñ(H-êÀŒÇFcdŒÛ‹kÄƦÉ,¥xΡ"Œª¬I90ñÄa—˜(˜ÌeH°‚ùin‰ ‚K Ö¯ÞÁ20$|CHÿöÞÄ€dµ\)³x€[˜õ(o’HU/ â„>¤L*‚*ÚXn6ù^*sÐ…éÖ™Á‹Áæ’^K(ꉲü§|Þ| ^Ç’/÷*H½ùó«Ápf4grø©]E³‡?˜( SX!ÐC”€ÀÚN=óžC6‚¿"(ïÁƒ4|aå­‘8X Á6UÒƒàt ÔBŸUa‚b= +ÜÃÏ£T-¥Éº0™ÃÐòj´áyo+G¬&Å[bÃZÖh&f±‹ ªB,Á3‹óBçÇÕâvøAu~Z‹AÜ.]*Xñ¾‹m ÓÀ 1bX%뀃Sk|¨T:æ§1ƒ¼¬#Gêÿvût‰ƒR)’áÙÓ൦B>Z¢?¸1'ºù­n0Îï˜ÃšMáÍŽP’£Âg±0ò%‚1Š# ±t+†’þ¹^¼àv Fœà5r«àS»C•zÃS™±•Üév&Ñ¢¨JßðA7ô%…ÙÁ·Z{ÀW,qÐpNذlkòö?÷¥*ë$NÂbÞ®ÙhÉN–˜“Ù–q¸êç¯CYòÞíÆ§!¿¤Bu}Ô‡ Tµ?¹ggÞóÑã(¸@¬Z *Û¤“ðåoÄeÿx DA*A§~´š‰~-3Êb&¾¦X¬cpT¼ 9æ,J„¢¢8òjYØ%]ìbm”äQ²ÀëpéR飀Æ¡üÂx†ìköêÅâÀ¤Áz‚²¬`ÊÅwâE` ˜žÁÏ|ñNzÀ/`bêáQR‹áD –6AøƒLÄ£\`˜«jÁ& fÒ@¨à vPûN¾ÆPT`ICãÖiYJÄQˆ ïºqtìðaÚá¹@0â@qL%&4 nàzÂJ`E„A´Ž#”ƒ¥ž¸*#˜`!ñä N6^¦çe²BE£,2bJ®–æ0>ìl©ìÁÿ”bª0ä~~ã ê©‚„Œâ`Ììâ2Ò €©TÒsò”`¢5,Á:ÆC‚jª\â¥)Ž„ræ’J•Ô&‚ ŒÁ6êHX¯*ÅcYæÀŸ€°)œ^ÀkÖ‚á.a®¾Ì$¹£:£Üå“íib‡*b|âEy&¥(KÄ ,!|’.!æ*÷„¾ a©ÌFߢ*؆ žÅžªä j+K8¦TC©vªÌ 0Æ=ô€µ<³NúCaNDÄÅ>¢\éeìÇDXc¬¾¨ð–`¿C$Å0p„‘.åªB¤a;¸ˆ úÊ ª@ÄKÔ‹¦âôiŸƒk,áW6¡8œ*žâQ»£Eëäeèl Ìè?âÀ_øf#Œfsa"GBà£X$ÎLìa­KßhU'Žé[Ö 1B”ôÇ<¨¥ õøZcxÎÂVe"Al,‡8BGÜrœrB6†Ì…ޤd5¼¢µ³ät„4G/ -83nv4cR(3TAT$®â 8qO0dá/ò@z¢K§ñ^ëU&^ÀJöŒ@z!\vDã´Gf@â¡"úâY<'yªåFñÅM†¥TCÈj±Üæ¤Jí6Œ# ´rbiB\Å£ÿBLÌ?ÅO„¤_@ödp‰–öJPxé ÿÄP§I^¥%d㉊G€(üv'“3v²ºäˆÓlØL£†oâ$Oœµ¦àÅö\bcø 0¯´ˆ«r¦kp H2A6÷oW—!Åïc9óff7ML/ö³Z¦gÄ0€áMÄPd`¯*Þ‹Á~·³X¡/ÎRâax`Yk©FöÈÿ>ç^ag?'ØŒwGÃÞ‡ ä1ŠpU~"]Ð ^u{ÃpMj)Âe%̇QòlÎ ‚æåO¥'æo?Teu()=b§ÉfJ€o‚ÁÌã: å˜Æ5´2žhCT3áO d=„puþ„'CHŒ àcxŠd¿.e®@T½™&FACîaØÏÆÈ׸lÀbæÏDTä´JÚ”ŽµcÞK ´gBèÖ༚¡4®æ΂*?™ÿ uâEshÎáþÔ½š&ò¤/^ â€\-ü6ƒ‚ Vx£ÉàÅôá2öšÿj ìàœ¢kä€IîÞLIsè8Q´R¢qw]CüƉ–ê]Ê"½¾!%¼Ù§oÂY¤LºbÔêÝútôM¹‚múƒWx¼ ãçÒªÝC,BG$I5–hÅÁ<:cú,aÒª@!MèE¯C¬6ßF/D¥Âbuätz™7þîp7Z¯mÂy­ÛvÁÉÊ2“BB:Ã¥*ò*Tð %ìáPæš’ÿl@%Û («b›F {YRÅmàAvàWÄ–QQ* /FDDâUldpÄÿ)ú3#þT$¦¢§=ybì~àúa¥Ì­¢Â gØ…ºø©øEXC$<ŒPšû›£gIÆ-9ÆÒb€Tbâà %Tž1IÊw ŽäŒ=È"àÇ-¾îÚ´ˆôR"¨‹Qª.B  ÁzÜÃÞn‡S «ÚË|N> põ D:Ù¾ ²¡þ.^|¨ ¼3>>8¾ðÏ@©2"ÊT¤ $5öäóû`¾žÌܤƒ2ng–5¨Á± ²C¢v %0'¶ôÑ`ß-¢TcF¢@" (#ÿ^÷Ó\™ »A´Ž"t&PÀ¢çÈ#2„a|Fl JÈîl»`8"“Ê%³é|B];µ°nªXÖX³Å°^•z›‰4—¯ }Ããò¹œJ¿ãÔ] ôôÔô–ÜÁˆ´dÌäÐ<´MÝàTÕôäy~‚†Š¾±PõÄȸÌÔÌìàÜм¨Ä`È ÖÀôÉè¸ÃÁLUíø¾àèäè¼ÄÌbúRáà¤áôÀÈļRù{7Ùƒr•‰LCÞD謸à‰<öYšŠÐh2úæXKÿ ‡È ZÀp#€9f€ãE3:Õxñ¨~4ÿŽsÁp 4`hbv‹d!J~j­@²‚6ñˆ»çE±db«"¤GˆxxÌÈñ“ *¾àÀ¢I±˜:¯b õ¢ ‘3b¬p¤© ƒ-jÐÈaC‡ ¨c×e†¢;e©ÌX1©Ì "%T° UC5q'ɉ˜I–A‚©£Q¥©¿<6fh¢¡£ 6P®jØ‹>:£N­D… \6`Ñ€ŒË‡ .2²{´-)™*9T{"BÔC\ Wà*|#¬ú˜®‹øUÅÔË…‘)›Í|šÑ‚‹fv‡Ê4Ý‘œ:ûÅš¨ úŠ ‡±/xâ£Ç Íê %ÿC{tÁTTM ®I_±¾¼7 HÖG„d3`¦†óÔ' ‰3'ÂC™¨U5YãMTÐpI»¼6Ï HEÀ 9T3Q—Èø† _8uC lS&6ȃA­HÖ”&ï}T$8ªæËGM-èT]eé \¨ÀƒRR±Œ=HX×<©¥ßèÃNÞÀC:T):‚¾¦1jv§*øBF.˜gƒ€c¸ e .,WD <ø†1Tˆ¨¨(\¦¦,”²#e¬Ã(8´ÐCma 4Z™¨»~¢‚v<åà*Aá ×.žQñ… ð¥ÿ¯LhgÇ(ÕÀ:1ÔP–& Õ˜‰;LÑͳŸŠ84È%¾å‹ ô`R'\ä°œ:µRH/ˆ0®¿wÔà]>D;C4ÓÐ0K²ãio.9û/XüFâ;ãA² &§øRƒ/X E ßQ.jà „4AßS¡øˆ‰‚T\¦b 7ìW»%XE²ÏMXÉZ’-Hß°(šÇ—#?Á2™ÄÖC¿=ReS5ø¸Uä5&/æ,Tiv ÄT 3Ð@È!FA­I9Îù9,*t\£GDg¾%@+a‘_p!ƒÒ`aˆËƒv7¨°BH…ÙAaÊpÀ̉€yϦð†xILŒF¨~ZÕ®ïñƒ ¶ÂÁ,¬Ï7L ",”ÉÈ``hCŠ3¥ì ¡Â逺ÙNgxÛáó$©u|a{õ{ˆÿú6e %ðN€ñ$ŒÃ¬ÏÌŒæéM ¨ø9 ‘' Ø€Amnæô f²èH a°an¼ËD*äF¨§\xÊ ²%™Ú4$-6 ýÊ`óE¢ɸZ$!ƒ%QB_†¤bu’LÜ){Á¼D:OhGÂõ0‹9=<äÏö ¯>`†6®èiI—2´ðgžiœìpá 侨ÜXÊ›lJ;^±Á Ôg”ÂsêqT z#†äl8Vx/"Ó9ë³Á6>÷)&Fyc’~t °_¬¹Köì€i¸k`@ƒÒ|‹ È– öÿ‚%B*Sø“ThѶv’Œ< ¥;P€.mÂL¼ø27?HLúÜ!4ƒWšïš6_mˆ*´Aý”x ‹Ø¡dˆ†¾* ¤©[´À)ª¥ Óür%„6S°2aÛõ× d`ÜIþ¡"¡"øˆ l¼ât!4¦ü0CÉšb¸ìéøkŸ ‚²ž&ˆ¡ž=jd}ƒ5äÈrÁÿª.’ ,M$è$˜ÉñŒ»£¡í—ŒkC«† ÂN¾ù)&hP‹ß4(Q°”Ùvp¢îabd2¨¥¾ å†J–IǼÂÙÚ$#˜̪Z' ‡øÑŸÉUV=dÒÌÛÝ%ô¥ÍO14ðÿwˆ(¤˜ŽÐÇ5ÌätQÚºú­ÅªùNHVß`Ḃ öá5r¼ÃÚM…ÔèŽe£ÜjÔ”% ; &Z᱉žD;£W XÀX$…êhˆ ˆL?+Ÿ«Ež‚¨´M¶ Ûrc)ö9¢¾™“ò?d0 âЬ~:x„£È… FàQ m±h!zVÁO1+²EUb+•±ÛCT»VJ³CR*’Ñ (ÉmM¿z15AD2$ô‚j…å¡ ÈÅeÔ©ôà`)Å9—ÚB`C_®ª7ÂE@Wó`\€ ñíJ‘ÂKÃLrXÂG>êêö¬Iš1º ô‰×üï§ÿ¸`Ôƒ¾€ZÖÈa½É¨¦¡‚[áäZj d‰â)‚²ª=tDà.”0¾ 確[nžTéç y”:¢ûl-³˜ER|€ãgô D«Ô‹$)H<캽•DÙΠ®Ê>ˆbHÔÏ7ö¸T˜$§L‹RÂ\°Y:ÖßìàHœ¿Á Â+!  jß‹¤ íHI²’ê`à…Ë˰¼`b¼^$ß{£†ÿkŸðËjšéO Î bp š°­¤ok2>>ý]W­Ð, Õ w€/k¬âŽíyI„±Ã%ðΧ~ssꤎÛÚ$Øpv‡„`¨ÿ°$¤ËÊAJÊô¸ìÀŸL ßm uF ›S€Áe$Ñ7T iÇ~¤[ãÏãe…Qi hBmXK]<d ˆOIÍCÎB̤ˆøÀQCƒ$`ŒpÞç Í|•IÜ (…6´"Ä·¨À’<@Yâp V”˜•$Òø|˜oÞpeŒPĬ¼‡—qM˜4á ÆEm… D‹tÂ<,ƒKBk ÜñA…ÐͶ•áM0B²SClSÖ¸(Ç!ȨBĵÂÙT 5õA´,Ãji‚šajô@58ŒpÞII˜Ç hÛËáLaè‚ý`Îóÿä¡MüÈ*ÀJŸEMaZp‚t}S?à@ øZ$B$DË$¶‡%¨EÜQàÈ_J‹DùÕ…ÝV <pÑRC`ÊÌ@I»Õb̶øÎW€MôB#å@ D¢¸Ä#‰•/RGfPÆ‚vpã]dŽÉç¨&WÞ0|•´\"”׌\08 õÉøÜˆ;ªÁ~²])¢ãbÐË¢Á2H‰B©TÛ• TÝ.à °@4|Œ)R‡P•@¿4 ×%0¤ÅCŠ€íÔÒ4LSqžG5ÑDZVD"!TU¤”yEÂ{èÙN¶f4ϸÍÐ4ª#ÿhFôÀ RRÀÀm!à?¤ QÁ˜]ƒ<”…d !Ôë€Z-ðdO~M#ñ™^oéëé˜ hA ýÔ 7øS¦Æ,„$"ðKW RKÄ@EÔ I­hÂr$¦åŒt¥F”Õ‹BL‘š1yG7=CôÒ)^È΄肙½ƒMÌÂ#í]2ÜEø@ƒ}† ðÄÀHÆ0NfV8O•ÇôHž‚IlÃd0aIrA*D È›¤a£MLR~xËe IU±Â#™d!®Ã+îæ8t—H6PL1xÉpÂÂç8T‚tdÚi 4ǰü]Â4L9`rÿ&ÔbˆÁY¼Æ‚(…XtÇwê„P€O’â&dßeÂIBàì|H>ŠBj:?ÔtP\$°€ðÂéŒàØ#@ĸ•Ä ²¨ ÁFùŽÈ´^¬HXÖ4TDfHŒ…†‚s€Ï5˜|" ­eEÁ|UU$dV­ Æ 8±è84ˆ¬d‚ èøÝà,dÃ6ŒŽ™ÜŠòŠöŠH°ÅÈ$˲¼™ÞAWJà€Dü6„ MÅ”ŽC1(’h¡O—w"[“à™dP¶ù ›Â#ô ¿üÔÓ-GfEìY NDh7Ýä!¨žfO¨ÀB°Ò°4™{ÿ’œz°Ä8”ÂTé¸ j0ŠISb?©Æ¢Ç„XKDn!d@r*(ìËxÅ]:Å•D¤âíÁ;4ÏÃ<ã{G‡ ¬Àeädž¬&u˜Äœ¶ÄFÂøÂ$–Íýjt3”4‰Á>DdkÒ‘ïT ±‰)©ÆC5Ì÷š¾GK¢† PŒäÜC¶ KAƒŽ««" Zx"‚¶j|#Åœ_nÖÈ8kjØŽéGà<tQèU<1ø d‹¤ ̼‡Qì@|4]!a¾ eD^àÿðQ@Sü›¢,,Ä]šÐ „hX’–DUØVÚ%à.PãÉÎÿ,à ÜF7æìµA ˆšëôÇ B NÝÆ~C œÆ;ä‡Õ‰ˆ –<‚ÈZ#@ ˆ@!ª MíöeT Ä1Äw­]Zf Á§öAæ€]ú›×:¡áÃ;Š °ÀYNB‚ÉÆHã´5L°`E,©h2íÐ¥yÅêKVF$@Žx ÀÀFœ‡¼ºÇi|D8 óÜ m†¢L˜I¦ŽÊŽÇ|W"u®æA „& ›dªžMÆ2îSÐ×on‚ÌíôÐgø ä°E[Ñ‘bê«…d\˜‡`‚ÔU–CòþjRxÍB¤æw°‹vló¼+ Î-Ž›„´´1ä"? 5ˆ™ŸÐm; ¸-](8T vWöÚuS´_qî ísMF‡ ç„'r^tÁÓYΦxeˆ·õ‰kaóDMÈÍÚ¼–Q}D4ˆäÑ ~n·µ#xFal4ÓZD*Áoö£#—–éwï¥GÍB€ËA´#(Œÿ\øsE(»Q7X­Š&&gó!¤w½ÕÈù©‹„(±v/§Î‚ŠuTP“a;gsþÒ0$t–e‰ÂˆH0Ft4ŒqÛ—äæÔÃAÓ'ù&„M1‘z›V9m†b‹ålfÿ WÒ0ùDKðèRÂÔ” ?èÇ0ôK_d†·‚º¼†Ê|Aµ­Ö¡E#‘3–7Û>]«Yç\—ßÒ U°Ì“5°À@ÏØÁ!‚5×3Å"n-EÜ$ØGaDÌÅ}ÜÿÈX‹’p®Öt÷,Ã꾆bÖ^…ïÐ$XpêáÅY²?A©K#¹¿}bVp›¸#çá@D IÔ²H7ø'=-³4´ù\ $#ÌÂVx4ø[oײ‚AŒNŠÚ»8Jè†Þ–RWâ–ûç–G yd cX#8×ÞÁ CUBDiä6‹ÄyÊ×ù!}—içÈǽ@fÿy|8„Apã=‡£¨á&tbRËÚ+€¤„rõ†¹g­ÀÐÇ—'Æa,Ä8 Ö’fZ°À´_EõIý”A’7½iŸMê’S¸K=@H™×$OŒOð+49Ñkø§È¬Ú$mÈ\ªÁÑȠĈ¹Ò‚ÑD®êY[½ëÈ(Aý=Ó¼dœƒŒ‚XÀ!†”AdœëG*9²‹í]ŸÔFˆ–ܨ Ã×9Â҇ë¨AègN´œŽXð±À.ÞÝ/ÁB`‚\÷޾H:d‚¬¥¾×Þ•° ôÅLœTï€Ñf”„š‘óê^JÅ$ü-¿®E ûHOÿÚŽgd‡ò'F+È2PÉ´j;@ efÓù„F¥ÓâÔ€ <£f Ðf¢b¯˜ƒ‰t¸[‘v…Çåsz½Yä½j6ä0+²Ù©1²3/¸8!áÆ,pÄ%õ(Ò‰\€!1#\¸Ö¿.ò$/‹@ö6 ±èpÕŒ]jÕx”Õá=ÞÊðm†F2¹ˆÕ­Ä߀!qÈþd‚wòŠ©§˜éoÔ¤eGVu›:ã³ßމ6TØAÉ ³ŒÍÀl'ʡ᷑|`*Ú¦Üq• \…ûLk^¥…xafX¢ bè0 ‡kR7òn_Th…%ÿW©ad1‹±ê(P7KŒÞVäÁçÜÚè£Ͼ,Ýô'Å ràÏ(Œñ„]xomèá‘J¼ÈH«æòuX1ŠPŸ3Œ®üt'›Çy`ÙÜ„†hY¨a†xE ^ýF^B„ÍÁ(o(AÇÔ戡ƒ¬€ke!DxÀ¤×ÉJë[í7A„Ô‚O”\¾P° .I¨Öÿ3±;g"°Ë…®¦‚!y‚±ß.8C·ÑX ÀȦþ• ÎÂMb’Rtà\j7Lhט dÞàà„ ƒLr@ƒùÙЊlÞT ´àÒ€Ìh`™´¢Š"ÊT2‘ÿ¨ ”«Ú bÐB¨.¬’ õh î14ÎÉHQ jñ®£ æFħ€D3[½Z@:Q•¨òèGNŽ¢ÔŠX¨´™¼@\ëCµBѤ5¨f˜~2‘P¬Ed0ƒûœQPöòŸôe­fQ2…"&©ÙÌ‚¤‹/Ù€*šÃÌv2ĘäíBÁÄf"€™MƒÀƒ–\°’%r @¦YŠâ“ D§º…Â\¾ç®vÛ¢S°ôÃ¥°ƒ©‰kŠŸÝ›ÎÌ‘ðÒâ]fª¥ô&ðÆl5hÄE+…©o¥ðVÀQb ;KóeÎæè4›Æ>ö>{{í!¿o>jŒê”âhÄ:øu'ßæ”Wñ†ex°‚p5}Ðdí»û,¡õ²2¸ÒZ&ÔžöZÖ‹m,Ú‘’¤”œ&œ^ø(Qù¾ b„Mòäî–NÎg2Íp¤+ü×Ìâ~É1O_é5ÁƒMˆÞñÃÈÅÿís\»‡Á0¬w$pýØÃ-Î<{QØ ¿F‚ ã^¢°þk‡¸ ý›ÿqq²‹‰ÞÈC£=Ôx¤Ç‘@ÿ£=<›¾Ã³Ƹª?kž´+‹¡ñº™£2²S8³3AjS;Ë:3 t3q¦„hÀ&‡0‘„¨ J8¾‹ˆ<‡GšGP¤¾©‹p9a‚H”QY‰y«&ˆ….ˢ案8¾4¸‰‰ØÁŒèÁÎ2ˆ½íÑ-{‚´£½"À¯-VI8«“C+pÃ|ÔIˆ&Þ@J¨ÁØR)¸C»”ÚÐN žp‡±( HêÃÞCÍú™ø™Ã`(ÁŒ;h% ¼Ñjž*‹©À0“@-HDÌàÄ <;âŒ0ÿ0À·Ë+‡£&°sø9A—»^Ä„•k aÔ²<Ôöa> Å)„ŽÅ&H”i¥Ãiƒœz$QH gãDÀOìÌ Š)ác“@&pœÄÝ㽙ҘιÈ¡¶Ñ`€±zEX4kè•þ`ì³Æ à(ŸÉ“2òiˆ!» dlÁëRG°Ø‘l„’‰øIÇÒóÛ=QX‹ªÙI €‚!´#Š’10GóĤ¸…¿q¬6‚”Ñ©– 0#©«¸.WQE&€?’ €î¹Œßs ë‘Àd¾̆ñ“oè™Ì/Øq¡bê3+ªt…â@ürÿšS’AX gx‡¾QMXž˜éhixÁNÀrÁ'šDýX‚,à†‘G6ÉÈùФè'ÈñTl Â@‡QáŒ"ÌI8¨¤rq‚ ¤‘· «“¾ `c=̦‡Ú¤+û²Ò䦼ÔÍÖ|ÕtÍØ%Ø”ÍÚÔ#Ú´Íܤ!ÜÔÍÞ´ÞôÍàŒàÎâäâ4ÎäìäTÎæ¼Ÿ®tÎèæ”Îêê´Îì<ìÔÎîü îôÎðŒ,ñ$OÓÏòDOÕJÏõ|˜ódÏ÷ô$è„Ïù4Cú´ÏqÏûÔÏüÚÏþ ùôÏEÐ-+5NÐåOeЃÈϥυPø”Ð eÏ µÐôÄÐ -Ï åPñôÐõN†$Ñ5ÑEÑUÑeÑuхѕѥѵÑÅÑ}Ñ ;mod_perl-2.0.9/docs/user/handlers/protocols.pod0000644000104000010010000007077412540623200022233 0ustar AdministratorsNone=head1 NAME Protocol Handlers =head1 Description This chapter explains how to implement Protocol (Connection) Handlers in mod_perl. =head1 Connection Cycle Phases As we saw earlier, each child server (be it a thread or a process) is engaged in processing connections. Each connection may be served by different connection protocols, e.g., HTTP, POP3, SMTP, etc. Each connection may include more than one request, e.g., several HTTP requests can be served over a single connection, when several images are requested for the same webpage. The following diagram depicts the connection life cycle and highlights which handlers are available to mod_perl 2.0: =for html connection cycle

When a connection is issued by a client, it's first run through C and then passed to the C, which generates the response. When C is reading data from the client, it can be filtered by connection input filters. The generated response can be also filtered though connection output filters. Filters are usually used for modifying the data flowing though them, but can be used for other purposes as well (e.g., logging interesting information). For example the following diagram shows the connection cycle mapped to the time scale: =for html connection cycle timing

The arrows show the program control. In addition, the black-headed arrows also show the data flow. This diagram matches an interactive protocol, where a client send something to the server, the server filters the input, processes it and send it out through output filters. This cycle is repeated till the client or the server don't tell each other to go away or abort the connection. Before the cycle starts any registered pre_connection handlers are run. Now let's discuss each of the C and C handlers in detail. =head2 PerlPreConnectionHandler The I phase happens just after the server accepts the connection, but before it is handed off to a protocol module to be served. It gives modules an opportunity to modify the connection as soon as possible and insert filters if needed. The core server uses this phase to setup the connection record based on the type of connection that is being used. mod_perl itself uses this phase to register the connection input and output filters. This phase is of type C>. The handler's configuration scope is C>, because it's not known yet which resource the request will be mapped to. B A I handler is passed a C> as its argument: sub handler { my $c = shift; # ... return Apache2::Const::OK; } [META: There is another argument passed (the actual client socket), but it is currently an undef] B The handler should return C> if it completes successfully or C> if the request is forbidden. B Here is a useful I phase example: provide a facility to block remote clients by their IP, before too many resources were consumed. This is almost as good as a firewall blocking, as it's executed before Apache has started to do any work at all. C retrieves client's remote IP and looks it up in the black list (which should certainly live outside the code, e.g. dbm file, but a hardcoded list is good enough for our example). #file:MyApache2/BlockIP2.pm #------------------------- package MyApache2::BlockIP2; use strict; use warnings; use Apache2::Connection (); use Apache2::Const -compile => qw(FORBIDDEN OK); my %bad_ips = map {$_ => 1} qw(127.0.0.1 10.0.0.4); sub handler { my Apache2::Connection $c = shift; my $ip = $c->remote_ip; if (exists $bad_ips{$ip}) { warn "IP $ip is blocked\n"; return Apache2::Const::FORBIDDEN; } return Apache2::Const::OK; } 1; This all happens during the I phase: PerlPreConnectionHandler MyApache2::BlockIP2 If a client connects from a blacklisted IP, Apache will simply abort the connection without sending any reply to the client, and move on to serving the next request. =head2 PerlProcessConnectionHandler The I phase is used to process incoming connections. Only protocol modules should assign handlers for this phase, as it gives them an opportunity to replace the standard HTTP processing with processing for some other protocols (e.g., POP3, FTP, etc.). This phase is of type C>. The handler's configuration scope is C>. Therefore the only way to run protocol servers different than the core HTTP is inside dedicated virtual hosts. B A I handler is passed a C> object as its only argument. A socket object can be retrieved from the connection record object. B The handler should return C> if it completes successfully. B Here is a simplified handler skeleton: sub handler { my ($c) = @_; my $sock = $c->client_socket; $sock->opt_set(APR::Const::SO_NONBLOCK, 0); # ... return Apache2::Const::OK; } Most likely you'll need to set the socket to perform blocking IO. On some platforms (e.g. Linux) Apache gives us a socket which is set for blocking, on other platforms (.e.g. Solaris) it doesn't. Unless you know which platforms your application will be running on, always explicitly set it to the blocking IO mode as in the example above. Alternatively, you could query whether the socket is already set to a blocking IO mode with help of C>. Now let's look at the following two examples of connection handlers. The first using the connection socket to read and write the data and the second using L to accomplish the same and allow for connection filters to do their work. =head3 Socket-based Protocol Module To demonstrate the workings of a protocol module, we'll take a look at the C module, which simply echoes the data read back to the client. In this module we will use the implementation that works directly with the connection socket and therefore bypasses connection filters if any. A protocol handler is configured using the C directive and we will use the C and CVirtualHostE> directives to bind to the non-standard port B<8010>: Listen 8010 PerlModule MyApache2::EchoSocket PerlProcessConnectionHandler MyApache2::EchoSocket C is then enabled when starting Apache: panic% httpd And we give it a whirl: panic% telnet localhost 8010 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. Hello Hello fOo BaR fOo BaR Connection closed by foreign host. Here is the code: #file:MyApache2/EchoSocket.pm #---------------------------- package MyApache2::EchoSocket; use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => 'SO_NONBLOCK'; use constant BUFF_LEN => 1024; sub handler { my $c = shift; my $sock = $c->client_socket; # set the socket to the blocking mode $sock->opt_set(APR::Const::SO_NONBLOCK => 0); while ($sock->recv(my $buff, BUFF_LEN)) { last if $buff =~ /^[\r\n]+$/; $sock->send($buff); } Apache2::Const::OK; } 1; The example handler starts with the standard I declaration and of course, C. As with all Cs, the subroutine name defaults to I. However, in the case of a protocol handler, the first argument is not a C, but a C blessed into the C class. We have direct access to the client socket via C's I method. This returns an object, blessed into the C class. Before using the socket, we make sure that it's set to perform blocking IO, by using the C constant, compiled earlier. Inside the recv/send loop, the handler attempts to read C bytes from the client socket into the C<$buff> buffer. The handler breaks the loop if nothing was read (EOF) or if the buffer contains nothing but new line character(s), which is how we know to abort the connection in the interactive mode. If the handler receives some data, it sends it unmodified back to the client with the C method. When the loop is finished the handler returns C, telling Apache to terminate the connection. As mentioned earlier since this handler is working directly with the connection socket, no filters can be applied. =head3 Bucket Brigades-based Protocol Module Now let's look at the same module, but this time implemented by manipulating bucket brigades, and which runs its output through a connection output filter that turns all uppercase characters into their lowercase equivalents. The following configuration defines a virtual host listening on port 8011 and which enables the C connection handler, which will run its output through C filter: Listen 8011 PerlModule MyApache2::EchoBB PerlProcessConnectionHandler MyApache2::EchoBB PerlOutputFilterHandler MyApache2::EchoBB::lowercase_filter As before we start the httpd server: panic% httpd And try the new connection handler in action: panic% telnet localhost 8011 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. Hello hello fOo BaR foo bar Connection closed by foreign host. As you can see the response part this time was all in lower case, because of the output filter. And here is the implementation of the connection and the filter handlers. #file:MyApache2/EchoBB.pm #------------------------ package MyApache2::EchoBB; use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use APR::Bucket (); use APR::Brigade (); use APR::Error (); use APR::Status (); use APR::Const -compile => qw(SUCCESS SO_NONBLOCK); use Apache2::Const -compile => qw(OK MODE_GETLINE); sub handler { my $c = shift; $c->client_socket->opt_set(APR::Const::SO_NONBLOCK => 0); my $bb_in = APR::Brigade->new($c->pool, $c->bucket_alloc); my $bb_out = APR::Brigade->new($c->pool, $c->bucket_alloc); my $last = 0; while (1) { my $rc = $c->input_filters->get_brigade($bb_in, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; while (!$bb_in->is_empty) { my $b = $bb_in->first; $b->remove; if ($b->is_eos) { $bb_out->insert_tail($b); last; } if ($b->read(my $data)) { $last++ if $data =~ /^[\r\n]+$/; # could do some transformation on data here $b = APR::Bucket->new($bb_out->bucket_alloc, $data); } $bb_out->insert_tail($b); } my $fb = APR::Bucket::flush_create($c->bucket_alloc); $bb_out->insert_tail($fb); $c->output_filters->pass_brigade($bb_out); last if $last; } $bb_in->destroy; $bb_out->destroy; Apache2::Const::OK; } use base qw(Apache2::Filter); use constant BUFF_LEN => 1024; sub lowercase_filter : FilterConnectionHandler { my $filter = shift; while ($filter->read(my $buffer, BUFF_LEN)) { $filter->print(lc $buffer); } return Apache2::Const::OK; } 1; For the purpose of explaining how this connection handler works, we are going to simplify the handler. The whole handler can be represented by the following pseudo-code: while ($bb_in = get_brigade()) { while ($b_in = $bb_in->get_bucket()) { $b_in->read(my $data); # do something with data $b_out = new_bucket($data); $bb_out->insert_tail($b_out); } $bb_out->insert_tail($flush_bucket); pass_brigade($bb_out); } The handler receives the incoming data via bucket bridges, one at a time in a loop. It then process each bridge, by retrieving the buckets contained in it, reading the data in, then creating new buckets using the received data, and attaching them to the outgoing brigade. When all the buckets from the incoming bucket brigade were transformed and attached to the outgoing bucket brigade, a flush bucket is created and added as the last bucket, so when the outgoing bucket brigade is passed out to the outgoing connection filters, it won't be buffered but sent to the client right away. It's possible to make the flushing code simpler, by using a dedicated method C> that does just that -- flushing of the bucket brigade. It replaces 3 lines of code: my $fb = APR::Bucket::flush_create($c->bucket_alloc); $bb_out->insert_tail($fb); $c->output_filters->pass_brigade($bb_out); with just one line: $c->output_filters->fflush($bb_out); If you look at the complete handler, the loop is terminated when one of the following conditions occurs: an error happens, the end of stream status code (C) has been received (no more input at the connection) or when the received data contains nothing but new line characters which we used to to tell the server to terminate the connection. Now that you've learned how to move buckets from one brigade to another, let's see how the presented handler can be reimplemented using a single bucket brigade. Here is the modified code: sub handler { my $c = shift; $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); while (1) { my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; for (my $b = $bb->first; $b; $b = $bb->next($b)) { last if $b->is_eos; if ($b->read(my $data)) { last if $data =~ /^[\r\n]+$/; my $nb = APR::Bucket->new($bb->bucket_alloc, $data); # head->...->$nb->$b ->...->tail $b->insert_before($nb); $b->remove; } } $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } This code is shorter and simpler. Since it sends out the same bucket brigade it got from the incoming filters, it only needs to replace buckets that get modified, which is probably the only tricky part here. The code: # head->...->$nb->$b ->...->tail $b->insert_before($nb); $b->remove; inserts a new bucket in front of the currently processed bucket, so that when the latter removed the former takes place of the latter. Notice that this handler could be much simpler, since we don't modify the data. We could simply pass the whole brigade unmodified without even looking at the buckets. But from this example you can see how to write a connection handler where you actually want to read and/or modify the data. To accomplish that modification simply add a code that transforms the data which has been read from the bucket before it's inserted to the outgoing brigade. We will skip the filter discussion here, since we are going to talk in depth about filters in L. But all you need to know at this stage is that the data sent from the connection handler is filtered by the outgoing filter and which transforms it to be all lowercase. And here is the simplified version of this handler, which doesn't attempt to do any transformation, but simply passes the data though: sub handler { my $c = shift; $c->client_socket->opt_set(APR::Const::SO_NONBLOCK => 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); while (1) { my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } Since the simplified handler no longer has the condition: $last++ if $data =~ /^[\r\n]+$/; which was used to know when to break from the external C loop, it will not work in the interactive mode, because when telnet is used we always end the line with C, which will always send data back to the protocol handler and the condition: last if $bb->is_empty; will never be true. However, this latter version works fine when the client is a script and when it stops sending data, our shorter handler breaks out of the loop. So let's do one more tweak and make the last version work in the interactive telnet mode without manipulating each bucket separately. This time we will use C> to slurp all the data from all the buckets, which saves us the explicit loop over the buckets in the brigade. The handler now becomes: sub handler { my $c = shift; $c->client_socket->opt_set(APR::Const::SO_NONBLOCK => 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); while (1) { my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; next unless $bb->flatten(my $data); $bb->cleanup; last if $data =~ /^[\r\n]+$/; # could transform data here my $b = APR::Bucket->new($bb->bucket_alloc, $data); $bb->insert_tail($b); $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } Notice, that once we slurped the data in the buckets, we had to strip the brigade of its buckets, since we re-used the same brigade to send the data out. We used C> to get rid of the buckets. =head1 Examples Following are some practical examples. META: If you have written an interesting, but not too complicated module, which others can learn from, please submit a pod to the L so we can include it here. =head2 Command Server The C example is based on the example in the "TCP Servers with IO::Socket" section of the I manpage. Of course, we don't need C since Apache takes care of those details for us. The rest of that example can still be used to illustrate implementing a simple text protocol. In this case, one where a command is sent by the client to be executed on the server side, with results sent back to the client. The C handler will support four commands: C, C, C and C. These are probably not commands which can be exploited, but should we add such commands, we'll want to limit access based on ip address/hostname, authentication and authorization. Protocol handlers need to take care of these tasks themselves, since we bypass the HTTP protocol handler. Here is the whole module: package MyApache2::CommandServer; use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::HookRun (); use Apache2::Access (); use APR::Socket (); use Apache2::Const -compile => qw(OK DONE DECLINED); my @cmds = qw(motd date who quit); my %commands = map { $_, \&{$_} } @cmds; sub handler { my $c = shift; my $socket = $c->client_socket; if ((my $rc = login($c)) != Apache2::Const::OK) { $socket->send("Access Denied\n"); return $rc; } $socket->send("Welcome to " . __PACKAGE__ . "\nAvailable commands: @cmds\n"); while (1) { my $cmd; next unless $cmd = getline($socket); if (my $sub = $commands{$cmd}) { last unless $sub->($socket) == Apache2::Const::OK; } else { $socket->send("Commands: @cmds\n"); } } return Apache2::Const::OK; } sub login { my $c = shift; my $r = Apache2::RequestRec->new($c); $r->location_merge(__PACKAGE__); for my $method (qw(run_access_checker run_check_user_id run_auth_checker)) { my $rc = $r->$method(); if ($rc != Apache2::Const::OK and $rc != Apache2::Const::DECLINED) { return $rc; } last unless $r->some_auth_required; unless ($r->user) { my $socket = $c->client_socket; my $username = prompt($socket, "Login"); my $password = prompt($socket, "Password"); $r->set_basic_credentials($username, $password); } } return Apache2::Const::OK; } sub getline { my $socket = shift; my $line; $socket->recv($line, 1024); return unless $line; $line =~ s/[\r\n]*$//; return $line; } sub prompt { my ($socket, $msg) = @_; $socket->send("$msg: "); getline($socket); } sub motd { my $socket = shift; open my $fh, '/etc/motd' or return; local $/; $socket->send(scalar <$fh>); close $fh; return Apache2::Const::OK; } sub date { my $socket = shift; $socket->send(scalar(localtime) . "\n"); return Apache2::Const::OK; } sub who { my $socket = shift; # make -T happy local $ENV{PATH} = "/bin:/usr/bin"; $socket->send(scalar `who`); return Apache2::Const::OK; } sub quit { Apache2::Const::DONE } 1; __END__ Next, let's explain what this module does in details. As with all C, we are passed an C object as the first argument. Again, we will be directly accessing the client socket via the I method. The I subroutine is called to check if access by this client should be allowed. This routine makes up for what we lost with the core HTTP protocol handler bypassed. First we call the C C method, which returns a I object, just like that, which is passed at request time to L C and returned by the subrequest API methods, I and I. However, this "fake request" does not run handlers for any of the phases, it simply returns an object which we can use to do that ourselves. The C method is passed the C for this request, it will look up the CLocationE> section that matches the given name and merge it with the default server configuration. For example, should we only wish to allow access to this server from certain locations: Order Deny,Allow Deny from all Allow from 10.* The C method only looks up and merges the configuration, we still need to apply it. This is done in I loop, iterating over three methods: C, C and C. These methods will call directly into the Apache functions that invoke module handlers for these phases and will return an integer status code, such as C, C or C. If I returns something other than C or C, that status will be propagated up to the handler routine and then back up to Apache. Otherwise, the access check passed and the loop will break unless C returns true. This would be false given the previous configuration example, but would be true in the presence of a C directive, such as: Order Deny,Allow Deny from all Allow from 10.* Require user dougm Given this configuration, C will return true. The C method is then called, which will return false if we have not yet authenticated. A C utility is called to read the username and password, which are then injected into the C table using the C method. The I field in this table is set to a I encoded value of the username:password pair, exactly the same format a browser would send for I. Next time through the loop I is called, which will in turn invoke any authentication handlers, such as I. When I calls the C API function (as all C auth modules do), it will get back the username and password we injected. If we fail authentication a C<401> status code is returned which we propagate up. Otherwise, authorization handlers are run via C. Authorization handlers normally need the I field of the C for its checks and that field was filled in when I called C. Provided login is a success, a welcome message is printed and main request loop entered. Inside the loop the C function returns just one line of data, with newline characters stripped. If the string sent by the client is in our command table, the command is then invoked, otherwise a usage message is sent. If the command does not return C, we break out of the loop. Let's use this configuration: Listen 8085 PerlProcessConnectionHandler MyApache2::CommandServer Order Deny,Allow Allow from 127.0.0.1 Require user dougm Satisfy any AuthUserFile /tmp/basic-auth Since we are using C directives here, you need to make sure that it's available and loaded for this example to work as explained. The auth file can be created with the help of C utility coming bundled with the Apache server. For example to create a file F and add a password entry for user I with password I we do: % htpasswd -bc /tmp/basic-auth dougm foobar Now we are ready to try the command server: % telnet localhost 8085 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. Login: dougm Password: foobar Welcome to MyApache2::CommandServer Available commands: motd date who quit motd Have a lot of fun... date Mon Mar 12 19:20:10 PST 2001 who dougm tty1 Mar 12 00:49 dougm pts/0 Mar 12 11:23 dougm pts/1 Mar 12 14:08 dougm pts/2 Mar 12 17:09 quit Connection closed by foreign host. =head1 CPAN Modules Some of the CPAN modules that implement mod_perl 2.0 protocols: =over =item C - An SMTP server http://search.cpan.org/dist/Apache-SMTP/ =back =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/server.pod0000644000177200010010000004745112540623200017610 0ustar SteveNone=head1 NAME Server Life Cycle Handlers =head1 Description This chapter discusses server life cycle and the mod_perl handlers participating in it. =head1 Server Life Cycle The following diagram depicts the Apache 2.0 server life cycle and highlights which handlers are available to mod_perl 2.0: =for html server life cycle

Apache 2.0 starts by parsing the configuration file. After the configuration file is parsed, the C handlers are executed if any. After that it's a turn of C handlers to be run. When the I phase is finished the server immediately restarts, to make sure that it can survive graceful restarts after starting to serve the clients. When the restart is completed, Apache 2.0 spawns the workers that will do the actual work. Depending on the used MPM, these can be threads, processes or a mixture of both. For example the I MPM spawns a number of processes, each running a number of threads. When each child process is started C handlers are executed. Notice that they are run for each starting process, not a thread. From that moment on each working thread processes connections until it's killed by the server or the server is shutdown. =head2 Startup Phases Demonstration Module Let's look at the following example that demonstrates all the startup phases: #file:MyApache2/StartupLog.pm #---------------------------- package MyApache2::StartupLog; use strict; use warnings; use Apache2::Log (); use Apache2::ServerUtil (); use Fcntl qw(:flock); use File::Spec::Functions; use Apache2::Const -compile => 'OK'; my $log_path = catfile Apache2::ServerUtil::server_root, "logs", "startup_log"; my $log_fh; sub open_logs { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; $s->warn("opening the log file: $log_path"); open $log_fh, ">>$log_path" or die "can't open $log_path: $!"; my $oldfh = select($log_fh); $| = 1; select($oldfh); say("process $$ is born to reproduce"); return Apache2::Const::OK; } sub post_config { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; say("configuration is completed"); return Apache2::Const::OK; } sub child_init { my ($child_pool, $s) = @_; say("process $$ is born to serve"); return Apache2::Const::OK; } sub child_exit { my ($child_pool, $s) = @_; say("process $$ now exits"); return Apache2::Const::OK; } sub say { my ($caller) = (caller(1))[3] =~ /([^:]+)$/; if (defined $log_fh) { flock $log_fh, LOCK_EX; printf $log_fh "[%s] - %-11s: %s\n", scalar(localtime), $caller, $_[0]; flock $log_fh, LOCK_UN; } else { # when the log file is not open warn __PACKAGE__ . " says: $_[0]\n"; } } my $parent_pid = $$; END { my $msg = "process $$ is shutdown"; $msg .= "\n". "-" x 20 if $$ == $parent_pid; say($msg); } 1; And the I configuration section: StartServers 4 MinSpareServers 4 MaxSpareServers 4 MaxClients 10 MaxRequestsPerChild 0 PerlModule MyApache2::StartupLog PerlOpenLogsHandler MyApache2::StartupLog::open_logs PerlPostConfigHandler MyApache2::StartupLog::post_config PerlChildInitHandler MyApache2::StartupLog::child_init PerlChildExitHandler MyApache2::StartupLog::child_exit When we perform a server startup followed by a shutdown, the I is created if it didn't exist already (it shares the same directory with I and other standard log files), and each stage appends to that file its log information. So when we perform: % bin/apachectl start && bin/apachectl stop the following is getting logged to I: [Sun Jun 6 01:50:06 2004] - open_logs : process 24189 is born to reproduce [Sun Jun 6 01:50:06 2004] - post_config: configuration is completed [Sun Jun 6 01:50:07 2004] - END : process 24189 is shutdown -------------------- [Sun Jun 6 01:50:08 2004] - open_logs : process 24190 is born to reproduce [Sun Jun 6 01:50:08 2004] - post_config: configuration is completed [Sun Jun 6 01:50:09 2004] - child_init : process 24192 is born to serve [Sun Jun 6 01:50:09 2004] - child_init : process 24193 is born to serve [Sun Jun 6 01:50:09 2004] - child_init : process 24194 is born to serve [Sun Jun 6 01:50:09 2004] - child_init : process 24195 is born to serve [Sun Jun 6 01:50:10 2004] - child_exit : process 24193 now exits [Sun Jun 6 01:50:10 2004] - END : process 24193 is shutdown [Sun Jun 6 01:50:10 2004] - child_exit : process 24194 now exits [Sun Jun 6 01:50:10 2004] - END : process 24194 is shutdown [Sun Jun 6 01:50:10 2004] - child_exit : process 24195 now exits [Sun Jun 6 01:50:10 2004] - child_exit : process 24192 now exits [Sun Jun 6 01:50:10 2004] - END : process 24192 is shutdown [Sun Jun 6 01:50:10 2004] - END : process 24195 is shutdown [Sun Jun 6 01:50:10 2004] - END : process 24190 is shutdown -------------------- First of all, we can clearly see that Apache always restart itself after the first I phase is over. The logs show that the I phase is preceded by the I phase. Only after Apache has restarted itself and has completed the I and I phase again, the I phase is run for each child process. In our example we have had the setting C, therefore you can see four child processes were started. Finally you can see that on server shutdown, the I phase is run for each child process and the C block is executed by the parent process and each of the child processes. This is because that C block was inherited from the parent on fork. However the presented behavior varies from MPM to MPM. This demonstration was performed using prefork mpm. Other MPMs like winnt, may run I and I more than once. Also the END blocks may be run more times, when threads are involved. You should be very careful when designing features relying on the phases covered in this chapter if you plan support multiple MPMs. The only thing that's sure is that you will have each of these phases run at least once. Apache also specifies the I phase, which is executed before the configuration files are parsed, but this is of no use to mod_perl, because mod_perl is loaded only during the configuration phase. Now let's discuss each of the mentioned startup handlers and their implementation in the C module in detail. =head2 C The I phase happens just before the I phase. Handlers registered by C are usually used for opening module-specific log files (e.g., httpd core and mod_ssl open their log files during this phase). At this stage the C stream is not yet redirected to I, and therefore any messages to that stream will be printed to the console the server is starting from (if such exists). This phase is of type C>. The handler's configuration scope is C>. B The I handler is passed four arguments: the configuration pool, the logging stream pool, the temporary pool and the main server object. The pool arguments are: =over =item * C<$conf_pool> is the main process sub-pool, therefore its life-span is the same as the main process's one. The main process is a sub-pool of the global pool. =item * C<$log_pool> is a global pool's sub-pool, therefore its life-span is the same as the Apache program's one. META: what is it good for if it lives the same life as conf pool? =item * C<$temp_pool> is a C<$conf_pool> subpool, created before the config phase, lives through the open_logs phase and get destroyed after the post_config phase. So you will want to use that pool for doing anything that can be discarded before the requests processing starts. =back All three pool arguments are instances of C>. C<$s> is the base server object (an instance of C>). B The handler should return C> if it completes successfully. B sub open_logs { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; $s->warn("opening the log file: $log_path"); open $log_fh, ">>$log_path" or die "can't open $log_path: $!"; my $oldfh = select($log_fh); $| = 1; select($oldfh); say("process $$ is born to reproduce"); return Apache2::Const::OK; } In our example the handler opens a log file for appending and sets the filehandle to unbuffered mode. It then logs the fact that it's running in the parent process. As you've seen in the example this handler is configured by adding to the top level of I: PerlOpenLogsHandler MyApache2::StartupLog::open_logs This handler can be executed only by the main server. If you want to traverse the configured virtual hosts, you can accomplish that using a simple loop. For example to print out the configured port numbers do: use Apache2::ServerRec (); # ... sub open_logs { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; my $port = $s->port; warn "base port: $port\n"; for (my $vs = $s->next; $vs; $vs = $vs->next) { my $port = $vs->port; warn "vhost port: $port\n"; } return Apache2::Const::OK; } =head2 C The I phase happens right after Apache has processed the configuration files, before any child processes were spawned (which happens at the I phase). This phase can be used for initializing things to be shared between all child processes. You can do the same in the startup file, but in the I phase you have an access to a complete configuration tree (via C>). This phase is of type C>. The handler's configuration scope is C>. B Arguments are exactly as for C>. B If the handler completes successfully it should return C>. B In our C> example we used the I handler: sub post_config { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; say("configuration is completed"); return Apache2::Const::OK; } As you can see, its arguments are identical to the I> phase's handler. In this example handler we don't do much, but logging that the configuration was completed and returning right away. As you've seen in the example this handler is configured by adding to I: PerlPostConfigHandler MyApache2::StartupLog::post_config Everything that applies to C> identically applies to this handler. The C> includes another useful example. =head2 C The I phase happens immediately after the child process is spawned. Each child process (not a thread!) will run the hooks of this phase only once in their life-time. In the prefork MPM this phase is useful for initializing any data structures which should be private to each process. For example C pre-opens database connections during this phase and C sets the process' resources limits. This phase is of type C>. The handler's configuration scope is C>. B The I handler is passed two arguments: the child process pool (C>) and the server object (C>). B If the handler completes successfully it should return C>. B In our C> example we used the I handler: sub child_init { my ($child_pool, $s) = @_; say("process $$ is born to serve"); return Apache2::Const::OK; } The example handler logs the pid of the child process it's run in and returns. As you've seen in the example this handler is configured by adding to I: PerlChildInitHandler MyApache2::StartupLog::child_init =head2 C Opposite to the I phase, the I phase is executed before the child process exits. Notice that it happens only when the process exits, not the thread (assuming that you are using a threaded mpm). This phase is of type C>. The handler's configuration scope is C>. B The I handler accepts two arguments: the child process pool (C>) and the server object (C>). B If the handler completes successfully it should return C>. B In our C> example we used the I handler: sub child_exit { my ($child_pool, $s) = @_; say("process $$ now exits"); return Apache2::Const::OK; } The example handler logs the pid of the child process it's run in and returns. As you've seen in the example this handler is configured by adding to I: PerlChildExitHandler MyApache2::StartupLog::child_exit =head1 Apache Command-line Commands Some notes on how Apache start/restart Apache commands affect mod_perl. META: not sure this is the best place for this section, but start some notes here. Apache re-parses F at least once for B of the following commands (and will run any mod_perl code found in it). =over =item httpd -k start No special issues here. Apache start and immediately restarts itself. =item httpd -k restart This will abort any processed requests and restart the server. All kind of problems could be encountered here, including segfaults and other kind of crashes. This is because when the C signal is sent, things in process will be aborted. Avoid using this method. Alternatively C can be executed C. =item httpd -k graceful No issues here. Apache starts and restarts itself just like with C, but it waits for the existing requests to finish before killing them. Alternatively C can be executed C. =item httpd -k stop Similarly to C you may encounter all kind of issues here, due to the C signal. =back =head1 mod_perl Startup The following sections discuss the specifics of the mod_perl startup. =head2 Start Immediately Restarts As explained in the L, on start Apache normally runs the server configuration phase, followed by C> and C> phases, then immediately restarts itself. Therefore everything running at the server startup is executed twice. During the restart, Perl is completely destroyed and started again. =head2 When Does perl Start To Run If Apache is started as C<'httpd -t'> (equivalent to C<'apachectl configtest'>) or as C<'httpd -S'>, it will run only the configuration phase and exit. Depending on your configuration file, it may or may not start perl. See the details below. During the normal startup, mod_perl 2.0 postpones the startup of perl until after the configuration phase is over, to allow the usage of the C> directive, which can't be used after Perl is started. After the configuration phase is over, as the very first thing during the C>, mod_perl starts perl and runs any registered C> and C> entries. At the very end of the C> any registrered C> entries are run. When any of the following configuration directives is encountered (during the configuration phase) mod_perl 2.0 is forced to start as soon as they are encountered (as these options require a running perl): =over =item * C> =item * CPerlE section|docs::2.0::api::Apache2::PerlSections>> =item * C> =back Therefore if you want to trigger an early Perl startup, you could add an empty CPerlE section|docs::2.0::api::Apache2::PerlSections>> in F: # trigger an early Perl startup right after loading the mod_perl module, if you are using DSO, or just before your mod_perl configuration section, if you're using a static mod_perl build. But most likely you want to use the C> instead. =head2 Startup File A startup file with Perl code to be executed at the server startup can be loaded using C>. For example: PerlPostConfigRequire /home/httpd/perl/lib/startup.pl It's used to adjust Perl modules search paths in C<@INC>, pre-load commonly used modules, pre-compile constants, etc. Here is a typical I for mod_perl 2.0: #file:startup.pl #--------------- use lib qw(/home/httpd/perl); # enable if the mod_perl 1.0 compatibility is needed # use Apache2::compat (); # preload all mp2 modules # use ModPerl::MethodLookup; # ModPerl::MethodLookup::preload_all_modules(); use ModPerl::Util (); #for CORE::GLOBAL::exit use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Connection (); use Apache2::Log (); use APR::Table (); use ModPerl::Registry (); use Apache2::Const -compile => ':common'; use APR::Const -compile => ':common'; 1; In this file C<@INC> in adjusted to include non-standard directories with Perl modules: use lib qw(/home/httpd/perl); If you need to use the backwards compatibility layer load: use Apache2::compat (); Next we preload the commonly used mod_perl 2.0 modules and precompile common constants. Finally as usual the I file must be terminated with C<1;>. =head2 Dealing with Restarts Ideally the code running at the server startup shouldn't be affected by L. If however this is not the case, you can use C>. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/handlers/server_life_cycle.dia0000644€ÿÿÿÿ00010010000000602411727205032023351 0ustar ????????None‹í]ÛnÛH}÷WÊË.Vi÷ý2g3ÀÁÎb3ólÐ-s‡&ŠŽã—ýö­"勤¦-‹l9²é ™‘ÜêbQuêTUW7þåûe:ø‹$ÏN†ŒÐá Î&ù4Éf'Ã?ÿøí½þòáèçiýgEt9€Od |u2¼(ËùOÇÇ×××$½YDe^4¹"‹øøQšFÇ0èxøáh0x8Á4*#|oùnT–ErvUƃ,ºŒO†gÑä¯Y‘_eÓa=j9n’§y1ø¥'ÃwçÕÏðx9ÍñÊ<Ì=fñYG5OMáǹ]¦žÇÅú´—ó|‘Àòf¾1¤aü÷Á˜å¨ ÊfÞ}”ïêKZ¾q?—ïB…”—Q1K²M9poÒúFpb9çp3”³ŽiØí=y¾¸³ýŠK÷+®Ø¯¸dq:Ï‹²ˆ’rSäYž§q”ÕRËâ*Þ]Îb¥`b©ÕB‹ó¤,ó'®ÿê +ñ|˜-?ÌW?Ë6«SkWÔ ðUÀw¬ÊÐÀ7ƒb㤪oTÍ’JÙ=CGÿ0Ó†¹{ä(òy à‹—¾n |.‚U4ù\É„@9Ò3±ši3àw‘ïWÒ?rvtS»VÔzðøï˜;4uÿ/=6P·RI•jªYHúæDPdˆ°–±1Ó€ŽlNÕ®‚K¼+O,€®iÊÈªŽ‘•qkÍ%ÿÎåç<;Of M&¬Ì6-óçYé‰ïΣË$½A?uU$¸°_‹òÍÎÂ÷_Oñ¹þíûOy:}蜞1éüS«èϱjŠÏ2Ç]Ä­§ðM”¶¥É,»Œý_æ½—ÝVïRt7©ƒ±m݈Ę#&d ÁõR ÃðŸW/À¯¨ß}|Áðy‘OâÅ"^—ðÎtñòÎdÝ—¼7â7ÇÞ‡tâC> q­#Kœ9"ƒ.²Y"…L‚Hj8dœ0cAªb܈Ð%†ÞQÒáîZʼ*¾Å§ÓdzOâGZZ §bÎIεuœq«÷Ref´ƒU@>Fwvû[W›¤5 †;+\UmRLŒ8Ä«n×xõ9Õ¦M›ªÑœè¾Øô¶òÍõ2ó¾òMֺ׉SÂÔH­Âºyep™Æ\³…0‹² |‘âbpÝEÙ†CŸõõaaP¾ç]™áKsºÊlD-HVU™ ¶Hrb0{¨2{´l,GãUõ¤ÿ¶V˜š—˜Â’~ë6-ì—E:Jú ‚å‘õvïlÚ'ÑEšÿs~÷ÿèG©,¿BÎ÷_ÏùA9¿u+™$ȼ 2[´œÌ™Ô²^Úµ|¬ˆdFñ¤ÕT˜ñ½:ú†Y¦©­»m¿®üÆÖ•ÍËt†0ÕÁµÙB@+EØ5!Á¹“(HX&ÄŠª1@vNŠà ö«é‰4„WÕcøm…í&pØÞ„áÖí]UÇeÝù¶Òε²Uw—tfŒEm¬ ,,lð†nŸŽþaZ³ž…ßdµ½ ›.Œfœ…ÄFšš…e b£DÅw€â=€Ø§f#ܱzÖ£ømÍ`/T>³]´Fìg1Á—Í¥(g̈ÂÿµQJ#„ô]™áº2ýö×ÑB*âÚïÆ¬˜ï¾aËÝÑŽÕ|Êps4Ǹî®ÂîŽn©Z¿?ºßý\çí;×xuxàƒD¤%à ¢6­Uâì,†ÅÜñÁ׋«rš_gýJX÷Ù_ÏâAFë†9E˜ÃFP”ĵÃ#º˜ÇØSY Ùùôœ}úóhr_æÓÓy\¤¸ìÁÑÒ™|IÎãÉÍ${oÀ›x ³÷%ø’_Ó4™/|AÎ;迲Õ&åíšéЙԛ¡!/0àRªÞ6ÁB¦íuÛ&/0 dåD30I0D*úÆ“„Nö'qÑAª…¬“º Õ kqùKQ+<ÌQƒ‚µÐ:|ªGIï¸z‰nç›±í>%N$X!o}î%v¾Ä¾~Ô® ^b®ÄuÄ¥¸Ñ7(à@ 6bUû‰Ç\…ÄåB×°Z+· WIbÜÞέaô‡æªŽR:Õͱ9U=]¶ìz´& [T/a‡°_þn1îèKžÏû .Än(¿öY\È8´ý¡[‚P‡¡—ÁáÊNâ!/JC1‰ƒÐëÐm•~½ã„ÃkÚ¹»eû0”Ie†\Ú¾‰Š0ÉZvào×AØ]«¿ÆLw­Å:è)ðè×N^máĶ_ÁЕ}›6·hᬮxCY96Ä9f*~06xé¤IMßHYNî~CúòÉkç­Ö @xZjef*èó8¶ë×bð àåkÚ¢¸Ø´‚ÒZ¿¾„¸„â§Ѻ“Fën=hàÌ€5›ÚUC$R¸ª(E›àiP“š¾ÝeÌ-Égù>:HJ¬ƒ'a±=¤B èv¿•cêv‡ü@¬Öúõ©ÐkM…ïàìBö<ÖÖ¹»TD%³{J…šÔlx¬®O…zÞjä­Ö½Œ%Ñ̦B(†iv› 1MDE[ÁS¡öúõ©ÐˤB²ƒMN.=hèÌT!Ù2Âýù’ë=¥BMjz·ørY“OŸ ½mJièઃ}õŽ/wD†åm– 0Swpð¾£oàh2þ#¨óеÝüœèÚ6ÆÃÏÚoô_;Ž¥oüëu;¿ öŽ#¨ãh݈Â1Ü\>×&dÔáðôüJ ­¿êÃ8?¾óøÛ?>_$éôŸYRþ½?$\ç¨×{ÿÔØ.ü‡ÄíßLv²:€ :CßU>ßñë÷Þw„öVØ»Ž€g ×Áº¯hó ©m Œ¢:x@35¾{„U|[)¶MÙܶR57O²+•lÕŸ*ô#Ÿ*$»xw#ì“ûôf‰B¸­×µ«Ÿ©pG„ü>³/ùlÑsz¸B¤Ç{JùŒ É:8Uâtø«øÕÈ%ÖIålÅëŽJ<^È)þ‰«*ú{PÐÁ8× ü¶ŽöftõP`º§£½%ï ™§n¤ˆaawKí80½´Nk|^²6Ô¢XMw^\ßz¨GEÿ(W¨zìv;B“è ˆVT2,J%ÅÈKxÊ6wÖ ¥Œšð]™›:z†9¬Ï8àÄOoOí»Ò¡y)ö¼zʪǤ;î¨uˆ'êÄ–LÀCÃÉ£¢7Å >>ïïï<<<ííí:::ëëë888ééé666ççç444ååå222ããã000ááá...ßßß,,,ÝÝÝ***ÛÛÛ(((ÙÙÙ&&&×××$$$ÕÕÕ"""ÓÓÓ ÑÑÑÏÏÏÍÍÍËËËÉÉÉÇÇÇÅÅÅÃÃÃÁÁÁ¿¿¿ ½½½ »»»¹¹¹···µµµ³³³,oHþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠìxŔɓ(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨ÑžMÍZÊ´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]+6)Û·pãÊK·®Ý»xóêÝ+×-ß¿€ L¸°áÈÛPš¸±ãÇ#KžLÙ®ßʘ3kÞ̹³ç¸—?‹Mº´éÓ†C£^ͺµë×°¡ªŽM»¶íÛ¸ÏÎÍ»·ïßÀµîN¼¸ñ㮇#_μ¹sÇÊŸKŸN½úÛèÖ³kßÎ}*öîàÃþ‹oþ}¼ùóèm—OϾ½ûÏëßËŸO?qüúøóë·¼x¿ÿÿÖußRטaà&¨à‚ 6èàƒF(á„Vhá…f¨á†vèᇠ†(âˆ$–˜¡[ 8 .Þ@ãâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6ù£<€¤ØŸV¸0Ì•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖi'š¸D)Ü”YUy矀*è „j衈&ªè¢bæ)%c}ZÉ褔Vj饘fªé¦˜:º'¤XùÉ騤–jꩨ¦ªªšžf¥¢¨þ«Æ*무Öjë­c¶ŠÕ«’âêë¯À+ì°uêz¯Ä&«ì²Ì6k«±V!ëì´ÔVkíµ€B[•´Øvëí·à‚«-U܆kî¹è¦[ë¸Þñj¯êÆ+ï¼ô.Ê®TåÖ«ï¾üö˪ž®º{¬þlðÁßU¾7ìðÃß*,›ÀV ñÅgL¬ÄO1¬ñÇ ‡Œ*ÇNyŒh(;¨YÊ›¤è%¥ÔP¦"=àI2bV‚ ˆìóÏZ’Ü”É\‚PʡؙBšj\çÒƒ®<æ;à@1 „ˆÓÃX2Ð`‹,4SDs E§(Q'Ôg–òÌÓ„J-&'Y_ɶ—©¨=Ìþ2ª„í·Æc/Uö–’ø¡H"X‚€‹-rÂ"YNRB)+Ü“å!¥”p‚)§`©¦Àð–Hpp +À{å7œ`‰†4*¤"‚ (L‚å)”¢Y*p ))$p÷–Š3î8äW–~zêXz³©”"÷0Ó“ÙMÒ`Þ}ÂßÜCø,ƒkÙC1ÏÈ%3`9É![± –Ø~%/`9D;Ã$Ó÷•šxåùÐR(¬%Z8a¸hÆ0Tp¥CPK”@Ü0 @õLèSû†Ñ¿ÿKº δT=1)AoË^–Jؽòë{áÃÒ<öw,`©~Y‚Ú1,qŠ€þžÓ°Ä6¶1CzÒ;…ü®dìÑnPÆð8 ThI`Âá‡qD$*1KVä ¿t S€ALû»’ \ÈFÁbU±Ø—RéùÂXz…–¨Š}lq+ðR±d‹/uÀ9Œ"Ô¦x¥0b ‹_Òc–¨XH/qŒ]b Ö1¦U(pJ@AG©¯7‚j`ªóR3$™¿`‰é»%p%ãJípÙ0 ,MÃdÛÑ¥gbK‹Œ""*x¥ H°’ÀÒš&XB–æ%»„É-™ar¸R ±´‚èíJÀÄ•,RºS^¦ÜŠ»ôŠtâJþ ®T H¬ ¨X–î± S¨BÆ ®DV”"”!¬!ÐEXW"‚TQPT‚“Wº´tk„€;PÀ0Rz%D/¼Ã’"N@ŠUTbøR?ÿP,i”£©(J1é¹K" ªô<¦.‰9Ð4Ê0Î+m ¨¸€ºÜ ˽³ñ¤R*Û–¨Qª›_“àÄ´v/¬‘jZ5W·zɨ«]?×w±)Ô8!˜XÁîÕL@*˽¾¢R] @¢d¿ÆØ39-¨¬ß[±±jöbŠ@,> 6ÎÆÑ³¤u˜!àÊÔúÌ´T™þ§k&ü`¶bØ®à[Ôâ¶`ýÀ~ 2ØNE¶Äõð„äN·Çâíq}ë\}µÖ¨.ÆŒ+äj·^f€7¾ë=èFKºÝ¥®·tÑ¥v¼ 2Ìâ ±nÀä}w£â]6Y«&8…#1õ‰RXƒÑØ6‘yŒ³bÌ hC~¶_¨ôwM¥¸Æ•œ`>N /L”^õåØc «ðS.¬¦Œp MžéP×+çÕzÒ´‘So¡ÇÊ£q󞽺~81ÛÒ ,½ynÆÌÃæ4ǹ+ÉœlÇ b åÌm®sX*a£¬/# cÊþŠÓ¥b§°˜i(ð@"¸¥^ €Y ዇1#ûä"‡gŠL!¦^—>lgB0~X¢ßüDy¥XmžŸ­¥FZ_{Àˆ%T€VÛ˜ÀšåÔæ¦¼YMÏàC'$ÈEÉ~K¾˜: ˜K]Lâ«h&¶%8Ì‹ÞR°Kqk*úK Ã0°ð‰ fiˆÈÖÒ²o­¯9àÒ\ê‡1bYm{ÀŪãÔj¦¼úLÒÆR ‡QInrINXF ©Óbcé˜ÙFæ–ê­¥}s©%Èf7ÈÙo-Ü_k€Ÿµ„‡ ª¢‚(î _¬Ní^Ê»þͤ‹j\I ¢À’6í½%<\ pYZ¹ýÍÏ&[K2Ï/} L,…€ óÞe/¯ôK›ãœ˜#¾¡%:ðB ðÀ„)ÀµS9aòˆ. Œ¿)ä+R¯šL‘ŠøÜ?íèG¯4Ô¢–â¨Y’-„¸Qµ U©oS­Äø&Õí¼F(˜\Štø´îAÅRCÑ,mã ñÐÒâ!:¿/õð@]û¾¸€s` ¶øäѳYx8•*qäÀ p®×Ýö‘kŒÎî50ºuÈBôuð€˜Ò hQF@‚–Ñ (H VÀB6¸à0ˆ fPÃ&Ðþ!cÌc)j5gϦڋ]d¬ ›¼Â¸(’áN ®x,b!‹ØºÀ ¾ Â@ Æ€ ÊÀ O Ò@ Ö€ [ÐÞâ@gkÀîòPwúÀðGÒ [åcPçÀ#E~gb~. §'plÝC g&{P P± #±}°y€ö0qðm°êpe0iÑP Nbà‚fƒZ¨.=Ž úþðbàš´Ð ° ˆpP0ÿÐû÷@óïÐë€fPãþßÐ Z€×P Ó NÀJ ÇpKbB-À±dðZ¢Gg‡p@]ø%\xŠçR@K^p øŠ2`L‘ à£'‹à ÷ÐÕàP |p5‘7 F Š[’ŠÎ.0È3 ÛP÷¶°³€Pm¤‚!u°‚@…Pepmt° Šy ƒ€mÎÑè-,H‡%X u°‰- p*Ñ ­w ð °]"’zž0h]h÷ˆ-¨Ã†%ÕäÈV©² 0qð`R   Á1P§hþ‘i-¤ZÕðrª‚Acâ´мÐN.(“3I- =ƒ%É –8?š ²R ðyP&\ È]ðä§”K9,Åp­ ¸ G`’ðpîp¢·Sé+p&N î =0:G–e),¡Ðp.H€ ¼è 1¶f€˜À"{) xhð ×àFçd.ÓPcX@ùÕ˜Žù+Ò@…N±Æ'/fð…  j€b¦yš¸¢â‰àdô ôòqpf P—Õu›¸y+ â° MG/Ñ ¢‡ Yø]Êþ¹œµR SÀÓÀ{@‘ôÜ7”•œæµ-èÅ_çǵ2àD°¢­à/Pqù[Û)Ÿ´bqž0 FP€?3 PØj–\J ²2pP€ D$iNF\J¡± ˜Å –s G† ¢íI.ïiañI¢²BcÈ\c/pfÑ„[#j£ª2u¼y1 z¤1Ú.§ÔYBš,×0_ÐŒÃð'³¤Ñø ZÐ¥^ú¥`¦b:¦dZ¦fz¦^*š€¦lÚ¦nú¦aZU„¢¡–FŸ¥¥Îèu°|Ú§~ú§€¨‚:¨þ„Z¨†z¨ˆš¨Šº¨ƒ|‰B}’¤…§ªè#`˜š©šº©œÚ©žú© ª¢:ª¤Zª¦zªŸ:¸˜(jIz§KŠ/3ºb5:“–Šª¸š«ºº«¼Ú«¥ªª‹’¢7t•E©§x«¾š¬Êº¬Ìš¬Àº(‘@†HÉXÆÚ…Èڬؚ­Úº­Ïº(ÅWpP¬±º0³êfµz‘׺­êº®ìzªÝº(IºWÕª…éÚ®øš¯úú®Š¢IPŽ£F¯ã:1MzZOÚk—ª¯ »°êʯŠr m '°"Oçz÷ʰ»±»ê°Šrc¨~nU¯.˜±{²(+ª«(þð`žîD²äg²)[³6‹©+›(Dp@ ÈIJ2;{4{³D˱9›(×69²Û1åêjC[´T«°G›(¿öUAëuS[µ`Ë®W›(© iÕµ÷µa»¶Ù:¶ˆâ·@Û´%ó´îµyš°l»·b»ª™ÂÀ‹9Jh»njË·ˆË«n‹(D0°=1K·Cc·"‡·•ª·‰›¹Ëº¸ˆbAèys[±bu°‡‹­ÿ w±ÀË Áß ¹¡Ê¹ˆ’ ðp.T¸«VºÌJøð® yï ¬ðt.À × » J»‡r ÿˆ¡û)Kº˜þÛ®×]˜Úò€ @ Æð0 ËkŠ {ð±˜J’¾@üà ÿ©rÀ©XàäÐWà™ ÚÀè€ @™ª_©gÐ(뼇ò Ó0Û[Ö«°ÿ ©¢°€ g ÀðVðP)ð òPá`«ü@ *€i ˜z¿ù»©¬Ð³)P`V0`™Ê dš¹+ÄðÀ~»)Óu!ÊFº»f¼«¬‹ù ©lp¿Ÿ€©¸ ÙÀ ð`jÌŠ›`÷‹˜JÄ;¬Ã›p ˜š ÄÀÙà WÀþ˜*ø‹©…G$‰ P\*ìV’K6”v¬¯YÛš{À÷ÛÅVXl ‰¡n<ÈVðP9lÊ‚ã¸|©”Æüp™¦l(`-é‹L*Õ`À,ºqõ¤Yœ¬X Ú`˜šð¥œ˜Ú yÀ_б»©t|Ê©¼Ê;ŒÊt˜z ¸@Ûà ØÐ ˜:¦œ– ù°¼ÐÎl´QÌ)SÇ ÅL½£‹Ì×Û®ìÀ0pêP¼÷Ë/àŸ¤LÄäÀ*@ qàË®ª` È`àŸ¬ Æ®©Ê¬ ¨ðþž0Äâ¥ Ì ;,ÁÄ€« q°Í Áˆò þ”»‘,8“l{;ÐíC€q í°Ê1sZ€©@ ú€]ð v`aŠŸ VມÊZc ØP™*[Àä°u;<ê ‰ô ~ð˥⟩ÔÆìWm³Ý̰Ðy`«ÓˆBLšsÅ(–ÌÛ"Ìý ¯r@&ÀuÀ a‹Ø‡R æ~à×}ÌB ÙÚJÖþp ú*‘z¸ ½Ï£"Á,@Ú\½Í¼¼Ý±´Í)bðu°g›Ôà3Ô–{¬FÝÛÌ­²¿Í)OþÔXÆC‰ÚÍÍÛž(…ÍJ]ÝÈM/ÿ… 6`A·&ç}%0­ÃG£(ØÝ²»Ý‡"ÀÙ`Ôý×5/¶aEm’hÓ“h‚ßò¹ô}(W€ðVà}ÁÓE/.†%‹ |'=Ó= ’C9^5 6†cRcáH”á®c‹Ó8SàË}à,n n(##ààúí¤ó¢q6gZBàõ>yvh‰4s[”AW²>bà-¾·/^(\4^Ú€M/±6kA®%;ÔC?¤%¹à$ä›&EG¾âIžÝKN(J€þ`rß]ã;/ñv%Ab}ôG5'p\2±W²?Þ½@þa>æ~îâÏ=*ŽÛsÅÍæêƒ2 kåûíZ#' ÎìDëì‚AúZ®ÛÖ~(Ù®í6Ëíb‹äVèÔnã©UX"[à?p ö~ïøžïú¾ïüÞïþþïð?ð_ðýþ¾)Ëqù¹¦4©ž_Ð _ññŸñ¿ñßñÿñ ò"?òŸþ܇2ËK@-ú”?î}°Â…áÞBH t0 ËÓPZ.oÚ0,ôrêB¨\¬ùtÙò†á?,{©æmd] ÝL¡Â=q¹µôéÕôÁ¢ ¤¤`y M!È×~0Ïõ†¢tL×FD°{ P…=ÝöYÿîm®ö¸â P£Tê¨OÑÃ2i÷ƒÂ’†×FG¼ P@XÐ á}…Ì[Kø=åîÔ2³{~éBšÉ0 îZŸnÅãÝt0, àv§0 3?&é&é}òÐê`a ´÷ÕI@ A°C¿]—_íïdúsÄ$,rã ¯Bnþbüˆ ÷„êÃï³á•ƒ%%`±péXâ;À#<S¢M,Óc 2¶<½‚&0&p®€%"Žá‘39Ù%^dWRÿ¥á1Là°€˜PáB† >„QâDŠâ4KãFŽ74åQdG\,žD™RåJ‰DV%Ì!fX2V P8©Kž=}þŒ € E{–hÄR$š¼ ¼Oà«c‰XJ˜¢K…ºH$S¨"!ƒ#ŒžE›ö!Æ‘mgt;²¤ZºuU³tª ^ ‘ ü; •BYv f¹@ćÕ(•êK¡ÌJ].uj’@@1Tyþ"D$+C¼zù*¼PìCAK8†›!Û¸áÖ&iRönµ¡ö \=,pàÔ óFÞ¸€CÉÓþÅãb™@[‹qqÐiôBßÀÞþ0@YçåéÒÆý@Èô皇Ÿ’E1ívø¸¤šÄ¨XP @ŸKG6x„!R¢¸a^ O¡ù껿…(„ˆƒ20Ä”Ðkï¶öfyODºgSTÅR¨&”)F i>H‘HY¥’>X±H‰^G#-aŠ´H †!ÂUJ¥’ujRLHaœ„a…”P4ÈF _ŒqÆaD)eŠËÜþ³Ì3Ó\ƒµt" UDLqÓ4=NS…5VÞN€Y•À[ã[µ¶Vq{uWa‡=«°"ÖHcø'Ùäzë×Ú‚u¶ZkBbYÀ~@— :e„RJíÚòº ucƒÖ-iã¢ö]{ }÷ݼ{e«)þE,Þ¶æu«^‚†õž?àEJå“40}žb¶j§c»  á¶9åGm`‘J€•£ifN‹d‘L–ËPœþN”>ô™¦#&ðñç íZ€–.JgÛ e¨¯ÐTèèŽÃ-¯A ›%©;âY$«Ëf{71ô飛ˆ˜€yÚ6ŠÁ[¥³9JÛ£µûލR¨¡+Â+:€6€ÿ‰Ýv(·èoõØ;qðŽõH”R:0e¥ªZÌ%ÊÆž?Ò™¥—IY¥iþÀ‰Ú'Ò\£Às ›ÀÀ˜\¥àv¯(z˜%˜A^%P&úˆz”óM}^º'rW R(Eú ˆLˆEôK±æ²»Ê ”ÄÚ•S>èÁMÊ¥€ø Âz(áþüu@…`ïwñÜÂNÐCØJ ”HÄ@b2“š„ç; ‰„nñ„Ýed¸BºH¡$`… q Õ:Ç= ¡ !ÇSA~tèA %$ ‰Á4à…I†ë°pÄ…ÄP{®¢áÏJQ †àp‡Â KCøÃqw@PÇÄdl  Nô@÷DgÛ`A3’ Ð8È2˜+ äx}!C$yHøÂfÐå½f‘q"¡"¸03Ï$¸Æ@ŠR¤à|±ŽtÄ£Áï2éˆâtO$¦@E&þh˜øÂ–·Äe.u¹K^öÒ—¿æ-£þŒ`Ó˜ÇD¦.ëÑ'j „¤K$ÃíA“'³´ËHÀnvÓ›ßg8Å9Nr–ÓœçDg:Õ¹ÎqJÃòêhF²jï´¦D¤pŠØü€Vh@:P‚Ô EhBºP†6Ô¡=èðK ù´ç ó‰’ œÝèç?!:R’–Ô¤'E)C%º¤%`õ”f¦¨ ÅúÉŸ)ÅiNuºÓœ®´H\øÃ¦cÍŒV³¦Kº)O•ºT¦6Õ >]QàŠ•¦G5RRºU®vU¥-¾à̪ƔU3X±Z­zÕ­oõ*TE £BD5«¯Ð:þ-µ®59m…k`»S¹†Ho¨©UÓê×v°…ìH  m OÍk´öJ¯¾2v7ŽlhEÑÎî†xÅQËWÏŠ´£…-l')ÐrPmfåµÙ„•¶µŽyml… ÙÙÂgVWËÙß(¸Ã….\‹[(¸P®nÆÛ“ù¶¹‡yntÅËÕé:‡0ÆZ—ÛÛï(¼ã…ïRË‹œhÈ~P¯vKÆÝžµ7>ïo€{ê]ÄdÌ~]owý  ØÁ&ïnƱ‡>\.¿„b£F&¹àº4øÁ~h„eà ¬€± î/‡ãa—ÔæèC`!ÐþeEVİAà±DëwgüUU|›”€¹/ÔPRAÀƒ MÀòp‡'T¡$‡? ‘_„A ˜1q…L%˜ü9±§öÄÅ9E.©$t°`È(©n;PIüá -xŤpARF ѽqcRh¨ðÂÊp¡Üüf‘rUÏr°B`+`ÁäèÃ!P |¡ø3@¹±¯?ˆÂ ß3¾P0¸Cþt¨Gm…1Àôà‡3þPpì«($N½ç€FBü@2@Ž­&ú0ýøC¶äYyÒ¼sž÷ü‰?ŒÃ ¬1RPþX €ÀRðŠ8 •ÈXa‚R À ² ˆwœ;Ýën·V~ÐBèHC6z|ï›l¨HoLŒ]H2 Šj-R 6ñÛn ÎäßæI¸IªgÀ`À°B<þp €fƒìx!žW $B½´@ah‚êœçVð9Ðõ,p0vÜ I'(Ö­à+p ¹²:S­m—=aŒiÆ0]sÙÈ|¤zÀvðd0 ”Æ­€{„@:³ºˆ¡´î|¸{Þ±¾ôCTëÕ:?NPç…]¾// 01±\ÍhS;ðØ·Cþôñùz \ÐcVȇ%²‘E𢜾ºÝZŽ;ì@ eÁ(P¯z+°Þõ‹gºãyÁ{Ýè –ùòÄ@Äw[.úÑ7¦ô.ôý,t9À@Åà €~"Ý(X…8â0k+´æ¨¸;T`…Jüa -Hi 3+8¿ô[?+pP…|ƒ\ù€Ú€Š3QÀ½K0Š+…H°0òU`ƒ°<¥»´t.j®íƒ Ì뾓ø¾† }q0(-1Ðl¨€€šuà `ðúvàn8½K€"¨ƒ=ø AÄA¨üþƒOЃ;p¨#3}0€*ä—'( Ø~ ‡9 AžÁ³8† €'P‚öRÁ6jAï«´ƒ-M;‡’KT€5àíû<À ½¼CÄxA=Ä)3¨f /d‰K€<°ƒ«C £ÄD”ˆEdD”’€S»\X2?Ü Føƒ?èDÚDIóÄlÊÃP¤Å†jß 8{Å ‹Å”ÅZ°[ì È!ëÅVüņFaŒ/bd‰Ø8Gó¯elFºxFh/iT‰8ÆVÀÆl,ÄÍ‘$fÜF…èFoD4uŒˆ85¸+^È{˜ƒ7Xt(ƒ0èm°†)xf@þ†"_Ð…˜Xx…V`U@S(Q…OðÐ °„!ޏ‡$0rØK°ðìƒHËäOÌd3ÖòÑ{1›¡ ¸„LØ€ø€…/AX…x…Ȇ!8‚%x‚(¨‚,è‚/ƒ3Xƒ6ˆƒ:È~x!EKQ‰Rƒèƒ!x„ÎíÓXA Ä0%h( ,Ø/3H‡v€:¸‡}ðƒ@€0DPp€Gˆ€ ¨KÀ àø„P…8‚ƒèˆ\X€-0xFÐ>¥ÕZM•{RÑ4OØ€€#c‡N*wþmWwý”DH•ãâ„YJ0Ab#ð׋ÐÓ„lXkiXH© °®8ψuØ´ÛSæâØ[)…¨X¹0`Pý1¤TOØ—#€Mˆ~µY#Yº°<°Gƒø~ÈÙ›}Ø{ZXA2B0€@„DX˜„‰\¦G ƒ£%Z…X­ýð\°˜õÚhâZ£M[O)3g2š;ø8hÛOÁÙº xžŽ…¯Á[O¹Û¿…eXN>Ø(ÈØ6Á}”ÀeÜò°DcØS@­Ç…ǵ\äh†60´Y¨†=à‡ÍÜDÁÜþÑÝã†YX´2ÝC)ÝÖ… ( à‡=è<Øí“×ÅÝÆðÐÅÚÝÜ-Z ^#™†ºÉƒA,ÞÑÝåµ å™ ç-’æ•^µ¸†6 ÍêU•á5ª‰¸ußðßñ%ßò5ßóEßôUßõeßöuß÷…ßø•ßù¥ßøu‡úÅßüÕßýåßþõßÿíßJ©Zí`ƒFàVàfàvà†à–à ¦à ¶à Æà Öà æàöàáá&á¦`à“æÞ«šˆN0Χ„á–á¦á“¦~áæáöáFÉΜn³Þa Fâ$Vâ%.!Vþáµ%^#fâ)¦â*¶b¦râ&b>•â+öâ/ã0.¨,æ-Ù.ã4Vã5b2–fã8–ã9b.c(î^‰pa:æã>öãsãë1cö¢ˆ=þãCFäDެ@†8VäG†äH^*F^‹AV°B>bIÖäMæä…¢d‡päNåQåO†!KN14&åUfeE6å?ÁcÖãLnåZ¶å8~å&BeoÃä[öå_Nã\N£X.âYæcŽáð²‘:ƒä+¨(e3ˆÆ#¨ 8µ5d(h^(m†òs0aÞZHËLXTed6gw¼oDúv Aв)«²€g&(0þ(9 Å æÊ‡ûÄ´bÓ} „…Âçj²'(Y d;~ã]^»^>gFL…*œë*QÐè%ب¥£ê³? ´²e<ˆJiƒJº 8_€(4·L‡:肇bbæbc¦Å`…HPžB1ÖN¨£.¨p+§fbÈú ¨•~µX£¿Z“¥»5Ї%臀’æé³«î´O ~È‚±:«îµ_ ¶aK¶e »UÓ—V[j„o†hAæé3öiF䃋¨x°·‚j0N…p¨Ä(ÇÞ*ÈFâ.ˆ‚²j€¸w{‡¥ûƒPv(þ‰³ã8˶gFQ7v<«^¸†{¸ˆË¸[>|Ó7~ó·€*€0pîXqþXB.gK…w¨|¨H…ðƒVH¶ÁXÈà êØk€*…,hîTp€ è–î„"_øXH€€Bnåfn¶‚hTpI€¼T8oUX€zîè®4PSP¸5€òopïïþþïp‚’ ¨ìÞîî( U˜¹¶‚õ^îæÖïïæo¢îT°n‚€UHVx¨.p÷áR¨”360k€Z: ´¼ƒæ A«–ƒ?˜¼N—¶væ©ó¸å{¼Ü[þÃqÐ7¾ÞißîÚÀÖÃ@¨@…× ¨O(8€â€‚¨kxÆ.(-¨.O(h¸„€Ê (+ÇrÇÓ€€Ò€G¨FÈ€€ƒ's.÷rYíkà€€òóÕ ôöÛr+0s+ôâ+t2>ó‚B†°ÞW(7¨=Gt/(0(È5W€Zt@÷a}°7Åh(~ <0íÆ3ë$/kgÎ}h¶Õ.rf«õé³u+ˆ'pò'†r¶ îc„ZöŠ‚íN…U¸s¨ãG… ˆtg‡viO¨(Çnvb…"v+(÷€º€zöíæv+8[p…X„tþ¨w÷y¨uoîv·wy§÷€:‡R (Éþö€‚ìpÏ÷mŸöl¨ö¸và¨Aswx÷wƒQigæ=ß¾QXé_ïqg >^§fäëç$׳y(¨~€(v-þkà–òKÜ+(÷(^0¨R(ƒÏvây‡’r(¨q¨ró‚zƒÂ‚v W¨¨ŸúG(«§ú€Cú¦þú€Bz+xúòù°Gx+x€Òz–…8íª¶çþû¿¤³V€UÈ>?( Ä@Ç€U€(H(aè\@e)1@¨„R`õQèÃ\À€´À×·þ (ûÃ?ý (¯ùùÝîëF–hî«ycƒW ?5Àœ{¨„‚zo¶ðf¢}‡J‚4( Ø5€ûu€Ê:· °„€*J¨ß'(R¨nwë(ì(ê(í·î¨pH‚â}°/ø£'(ï¨Û¨Ü(FÀ5¯l+ñçá¥;„'¨%ˆ:{¾˜ÀŸOŸþcÅÊAœø!¤)^l6ÊÊîák׳oÏ^‹:[îçÓ¯T€ ö÷£]:öÿT^ 8ËVzÖb•Ń :è^*J¸ Zx!†ômBO†²OXx¸Ÿ F Y˜âWa™øÔ‚#Ê8#RÒx#Žþ9ê¸t옣`ü¸V‰/:…"‹ZÀU’V!hdS19åƒ&\±Ê"Tj¹%—]zùe{EB‰d“+69Ë“PJ &›mºù&œqÊ9¢˜F’™¤™M¦iäšsúù'  :èu¾x'‹y&¹ç‹}ú(¤‘J:餆šˆhŠŠ²È¨‰ŽRú)¨¡Š:ꌖ&ˆ©š¦Èi‚ž’ú*¬±Ê:«P¦HÕ™.™+š.ªi­Á ;,±‚Ú:ªªj «ÿ¹Z,´ÑJ;-LA)®g.;`³c=K-¸áŠ;nÖ^›¬€Û Ø­‚À’û.¼ñ’{¬Xèz¥î¾ò鮼ýúû¯¬ôž˜mþ™»æÊnTß¼0à Ï)0Töv…oWCÕ 5­h¼1Ç{ü1È!‹<2É%›|2Ê)«¼2Ë-»Ü±.Käð2Í5Û|3Î9ë¼3ÏScî˜ãið™?5O$I+½4ÓM;ý4ÔQK=5ÕU[}5ÖYk½5×]77x=6Ùe›}6ÚZ‹à‚i»õ<×bË+ÅY-7Þyëm¢tP±7à >8á…çýœ¾8ã;þøà#€ ä•7.±ŠD멯åë=ˆx>:饛˜¾:ë­;Ž ¸>ûÀtk¾(ç´¯î èþ;ðƒÀÁ¼ë.ôŽ<ë˜cUþw‹Ì“®‘H=öc…€Ù{ÿ=à´€ø–;ôWÝ]>Þ¥` ûñ_òÛ?0p?ãç+ÉdÑrÇ?½…š G'9Ê%°Ì[òá@Áù¯*és’'ø"Nàü`áH€K€°„­³Ü`B¼UPWÜÜ t †6„)pòðqG/%´DÝnSìá$€Š 2ñ)%x_£8v R¬]®.X•õ•ð`Ńè> „±Œb1Ú!†k,cøÌ8·,qUGä¡" 9ÚÐùá#„H¤ Q0ÆbÁ‚@Hþ±…ZìU \r…'%*)Ç)@khÉ %"k4rˆ™ª#³îxÃ@ ÃP‚¶A†vLC“ D&aË2:Q¨ „à-˜ò@&®èHTrK•´Ä €‘„(lAèC&‚Rî|Í@Gðq‡:ÐC°Gرu Ã•Ýäa2Ò€zde‡”iÊT1s]ÎÔ B9‘<ÀƒHÁ;˧ †Rt ½á&@ ¬üâ X@—ùBÜ5Q|=(¤Œ_Ð`JÀ‡?ÌðÐïAá àÃ/€ "ãHȦ@„•ÚÐ (ÕÂUÊŒêÓþv5bÏÁ~l#+¥O¿ÇA_d…æÀ¢jCê•À*N°Ç$˜Ñ}*«ŸùŠ"ìd€´!‚ZÍ^4âB¬HÐ ê[K˜Ž?ØÃU¡ž ̨Q^qÑX¨àp` yÍž' ‹«ô(ÀcWÈ‹÷Í‚ þÈË8؃ý„2J: t!t™½Þ4æ€uX…pÆkM(˜#?À(ä8ÚJ±ò$DU€.#·Òž-ªò‹5`Î!PØ´A Â%kºÌZ±Ò‚0àf‘„Ø]—yÕ¨ÃÎ1 @íá#&R>†þR<†6 8p7Ž÷=ž ´•‘ž ¨Ë $ð¼÷¯ÝÈ BCà ›Úƒ‡°®Æ±;C²¿ £1$²MO„ùH„mŒC HB;Ôði4w¬F%¬†Ah† 4ÇÀËÆ…áäïE#A ”Q°¦A[ †5°±sÈÃîÈ‚0T¡D¤¯6t1RË‹”NxîÛG‘g„|p`â 4`á âB: ø€ œ _ðGPá6ÄÎv”âŽ{lˆyÈEÎóè2­†¡ÓDµëÔp bðƒ¤ˆÄ=€R,`3þ8XÄdaŽ8´ù ù0j~óœï¼çóùyЇ^ô£#ýED.ÞÀŠìH 8Â8ðŒÊü¬„C(À‘†4b²þ^ !h Þ F»ÚÙîv Á]ît·{Õ£‚„Gtá –ø†–ÌP {Ä ÷+ûxùÇ p# ¥@Ê) |ô 0§ñä+ùÌo¾óŸ¼41‡!àKߨ„9xaùA>Ãò#B lV`GÙ¨DèÁ‰±ß÷ºç½ï/|â‡|gðæÛ´ ƒå`_í£W¾c8` ظâ©TŽØ#qË-÷½~-¿üçGõ?ªÐ˸I VØÆ&ÚŠ6~/ûêK²ëA&ȃ1À—Œ9ø‚X½• z *`žMƒ ŒÁ¼É„.ò¢s5ƒ+dAþ:lÉ5ø ÃLDÈ€$ÈEZ\ÃȃC+2¡å|ÃHƒ|É=l€0¼‘(Ý@%´QPB\ÀF9š#˜¤c°c'¹#<…<ÒcfY6¼Bø±Ç68Â8H6lA(¢C ‚,®…°ƒ PZØÄ`˜ö"ÄÁ”"—€#°À„â@ˆ¤Q0<Áõ…ÑG†d—¤I¢¤J²dQ¸$Læ!¸$´Ç5 ‚,ôŒÁƒtÃv€9;¨Â <"Z/(ƒdä‘‘Vð0 ¸Ãuh t‚1T£D¸ƒ,LÀ3nã&‚q¥WrIXCS€Y¢¥Z\þÃZjU'¨Cï­‡„Â1!Dt‚ý=È´ÄÈ“DˆC'”C{t8ô"ð„#ðT6ÄÀA®‡8%0$6LĤ ÀDª¬ ðZY&fºÇfvfƒdÃgJDhºÂ ”fZœfj>T1”Âü£Ză*°ã„B<`È>´VxBGHDÄ€°ÐC?L¦FfÎQ]šîBX€P‚ ¥9H%}pA‰Òå*y&…ì30Ÿ q§w²Ç5€§x¶§{˜§D¤§;¬§~Å{Æç;Á ¬E;´@5þ08B€2ˆ¨‚00øBì@ ¬G!¸ƒ8þöÏu>GþŸîHÀ{tCÈ•DHƒp„D‚=<(&ƒ8&{p€8¬Ã ¡¨Š®‹º(À¨Œ>H$ ÖN„Žòèzø(Ú’àB$)Z| hè´À:ÜH˜“4g<°þÁ ÜÃZ;$€îP¦ëÁˆC®Å;¨(­Áœ¡»9¤=| X”Hİ‡Ð ¬œÒéz¼C*äéžbø)ªDø¡*¢jÒ1C &ZD€KùC àŽ(ÂC–XÁ7Œ€AýÁ „ƒZÜ;0íÀ)ë-0”¢¬BSÁD(|C,HD xÁþø‚Qþ/¨àZ€;é*¯®Å¯ë°zˆ±"«²2+B<ëzH+µÊä-ëCÄCH4@뎔ÃoùC ˆä:´‚QÆÁs¤…¨‹¹®šN2Ð2tƒZxÁ pi+§Œ\RÃÂÁp"„.‡ZÂ`” lÁlÂ"ÄÂÞˆÃÄZľÑTìZ`¬Æ–È€jRt@5ÞÁ¨k‡\Ã%2|éCø3HD0,RàÁXWë,é/ä€k¤´Õà‚Åâ \D ¡üeƒÂ@»¥E=¬#LÓ:­ZD-BP­Ž\-díCp-Bx­Z„þíØ–Ñ NE9ì€DÔ€6n‰!P×j´>%Z ‚;¼Ÿé(­çC àÎÂ0¼è ð휀H¦+TœFZà:|ãA®ä¦åb®ærîCx.èŠ.Z®é6&`ÃÞ%ÅlÎfÈ5t€A-AZÁ>¬C¡¢…¼AˆôCõ&Åõ@ön/†tï÷†ïøJ„ù¦Eú®/ÿÂôêQPFÁù‚I6”@(ÀPLnÁß"EhC4¬ôV (CÞ¶$.þH.D—‚<±E´DhBZ‚;ÔÃeðïdOo‰;e ÓÄ £§ £…´p©;ÀëQ\C*H È,›ÔCQì7´-" … Á§Î?ÎlE<”Á99˜¤CŒùƒ~ÐD:è‚DÄÁ!…!´²OoqQtñ‡ñ—qì¢1¨1Z´ñÇ„Añ&…ÈìÁ¾2ôƒ€ A\8œ8xÃ-°@&(ýÕð­?À&RdCtBãŽ(ú”h Ž ƒ…¼Ñ˜¶I6ŒB0ÀPDÂyC #…%pÃßÄO+¿òPÄrþN'›Ôò-çò.÷òQür0ßP °ÂYhAŒÕAïÇ9<‚ d?d „À@<€A58`ÜC!8‚ ôÀàÃÂmú\ 0DœÅ: Ž‘Î3ެ!œÅ5à´Âû.qQäC€ÉŸ A{O@tR´D 4œ01Q0t'=tR €1Lt I€5,RxA»¶ÁW·xÀì/Pè¯8A `Âì.8BB¯Åe œ! ƒY1*ÿ’yŽxC%œE6Àð&8ð€ C$‡%[rd²(B'ÓÇ7t°?Ôç((”OS?þuRDõTWuƒ\uVouWõ„5 ŒuYÏÇY‹„ZE6°µ ™<œãQ`A»®AÕ¶DÀà*ìCzñJW,CüÀÈ‚©¶‡#˜“ œE ü@=:Î?Ž+¸TÜ"ð‡<@*`ƒ?h,ˆ39‡Ã9§3ØA;—/T>C nÞå(0Äy$˜ƒƒyÏj·ökÇö~Ìvmßvns<ð6:«3p;‚p·q#7}\Ãr×Y¤\v•[E20@ì-ñZ4À±@„Š€0œ6𠹚/6ëº9œËy ôƒßù,äùž÷¹{ú z¡ƒ¸ŸÈïj& ÐÃ(¤cv=AÂz,€?ü$(HYç˜yà2p@R`ø0º{¤ƒþ(°Ã B¤§úU$%ƒ4D‚€"¼Ñ ôº4è’ôè:¯¯ù¯¿y°{±;²W…²3»³³G´À´¯yµƒÐx@R$6-@{,8¼‚„û~8Ü€b¨…Lµ …pCV™OR[*/aåXÂD(õP§{˜ ¼ \¾  ƒ$p¹°¡$´HÃ;<ÐCK¯…ÄS¼Å_¼WdüÆwüz|<„|ѶA8hÐhC€Æ6÷ZŒƒ£ÅÌï·p‚;$2Z\’;pQ €8ˆ!j¼ -õã|ƒ;ØARü»>¸:{dÃÔ)0ÁѧˆÁdþ³ZÀ; vQx‰!Ös=Rx=د‡Ø“½ÙŸý€¤ýÚ¯‡Û[BRÈý%Ã$À(?‰qy¤ ð€ßïw5Pƒ-ìn\WnÄpPÔ€âT®ï /€@R‚A/{(ÀÄL>‹‚7äÀ9¬Å õÁå66°åñŒ~RÀ鷇곾ë§ìË>í_Óí…lê~]/$…û˜1Å5tBäÃð#= ¤ÁÊ ((ªRÈ;õã„~Þ@<»¼Ã™{ˆ „d?‹ä‚&¸ÃBªÅÁçE!”@86`Aƒ&Tˆ€7,V F”hå>&&fÔhþEŒŒ0tf…9’dI“'QŽÌ¥ÉÝ„/K€'ç%ÄBe.Ô¹“gOPÖè©i…¿>…†fÌVƒÙ³”O¡F…* ΃¤ìùÃh(*>ÁÄHêHL•‰Ë@ØžH¶,š€$¯J”Æ„µÏ¢%G¹¼V°ø€-ÛÐXŸÜF~wnÝ»‡#î5å7pg¨ƒ N¼¸qÍ $§V­°¬¡Ýº(ÙJ¹&.lxÖý— 9M‡9É4ü²\œo«Ž|6í_¶ÈV8’t€4çh[áP§ßnï's‰Pàp¸0Z }÷ftèÒ©[ÇN{{÷ï÷E†_þ|þúšëÛsO@°ž‰ƒ¦šH€.0k‡œhÀOB“~©¢”À–¡JIa@ƒ”û‹9Àžû°™4üJ>ú8€¶ldxBŠ 'Džó#ÊU>”ìÄkZ±C^ŒqFñ³ǼtäÑG ƒ¬2! bª}þ36¾h„É1C2â ò’ã©©œ9 2DµFt®­5Ù°¦m²àÚÈH†[ÈÄ/q88Lâ0£¦qâÇJ°òŠO?”ÐB¿QEuô%H%ÔT%ÚØg(Å^Á o*átÌ]œ!%¯ Ç‹šRÁÊ9˪S­læz†þ€/v=lqB©EÖû|ˆâ”kò*€†aSy2Ùš”e³g£ö»j¯ÍvÛ¡Dù\+ùa(C˜Cþ‘Fu™ð#¢™hEÑÉ“Eô &ÙP ‘—SœÂ£1ÂT5j ÍsÇ1´Ë§ô*¿”Ì *P7ŒOTI6tPÓ²”Cé‰ý¦‘" ‚pHU*Sóò¨JU*TµêK°Z“­¦”'/À@M‘+l%eaÉ ë_ à‹¤`ȨÉüTB,WËedš1‡³f$°E^¾Á5ÜU*¥°YM/ðiä°[b;‘Æ>ö*‘,e¡bÙ¤dv›ÍÈ<ËÖ…£ p¨ +`ˤÀâ¨-K.Ä¡±š„cMåÛÈ(þB!X<Ô°ÐA„0j‚s y)…Ñ|û”a ()O%^2B;²ì¹Ñnu¯rÝìj—»Cñ.x7"^Ù*dÚhé@¤¡Ì£ BXoTš% R#€†rÿ):è°@5)Ð1Wõ¸ƒ ÿMI# ;”J€5qF xÆ`CXºk†…Q‚á¤l¸Ã/ùð|rUÔd¹Ê +6€â§äÂú݈# —lcÑPSBÔ§5,D@j¢L3Ç:6 ¼¤š|£x$cIÀ2'Cù%RÎjM\Qe+“ËZ~ —½ü’„ÆÁ$È€\eð°ëšOþR  … ö@63BŒy°U+¬/7|!ºk€ ®wÐ%9„_‡²B¼dU`Ù¤+}éL»£&ɧ“"jR›ºÎ‰C:< ®$E®pµIˆ@UÖÄk–xÉ(@Áèå*x5HáKἨ¿É-Æ €¡,b1/Ɇ<ª1/g×$Úè˜vµ­lk»&ÜÆ†·Á]k‚ˆá [æ‡?Àp•+È!Ý$yÅ[kÂWnmdÂPv‚Ý·šH¢&ŸÀ³‡Ž7œ¸ß³˜Øj¢…9à@ùÁ!æµð†?ü*`˜xÅ-Žñ—hœã/ù¸¼’ˆŒØWɇ9¤…þòYô£Å/C¾J,‘dœ}Ì…4rÚ`Ü(CJ{΃Aù¼ÄÈ€œE1/v(]#Lï‘Ó¡.õ¡Týê AÖaŠPÔĸlMB!«ÂÛÈtsª‘5xÁ=HF‰’SÂdŸp5á—Æqiàaî-hpM*½nÈá ø«Dñ:oÁo /ù—TæÃ¨Á#jRƒï^…n˜{H\p¡(QöÆ¢¡ã÷“%‚ïÉĸ‘Û—‘iÈÎñ…¡°!uQ”È›ˆ`*àÓ[¸ Œ?÷ä/¿ù>Ì%Y“>±»&hˆÃ¦æn] E]ÜH*,Ñ÷þFóòÑE´O:¡[l‚…Wù@ ^Ïjk(Î^¢ JÅJò¯&ø¯…’âÿpk¢0a¬ö@Ÿ6B öÀŽé%"€^/$‚ q4âÁ„l#4á+roþ†ªþ–ìþzB$ &bjo( $^oÊî%V(^¢@nRhÐqð*vp}0Ô@7‚åÍ Ìí%êÊà*V@F0$¼!ï4¢àLP"àäoÙ.5® n6¢ €’âM\iî ø6‚¯bá%N!Lå ð%àP‡‚GpðP#ôý°Öö¡ à –à*š («¼cŒ­&Òþ å4‚œ¨Õ°†Tƒò „2 îào(AºÐäÁù&¢Æ®à%0€JªÄQq"T‘“â/q7Ša©ïópäM,æ%(d!)²¡€@$Ü B@2`¸PB¼Cîé–¼/ÒáH15²¡ð|Ôá*P!Vî wÜP#Âáò€!Š`R°À7âçâ1)æÑ±Q¹Ñx¼ñ$Àñó1#öQüÑ RÞ(aÆ^⦬&ìDâä.$¤`¸çuÈd†À +á%ô¥VC÷L‚÷NÂ÷v¢Rp# ®" ì@!³q»ñþ½~p#Èð`#îÁ&E'GÌ'“(C‚$Eâ$S²Pr(–²)5â)åÍÊè%L> )ÁDB~a$¶A$ ÁDà@$6 BA^ÀõB"/÷²/E0`FdHD FaH $:a D`2@$(AbÁ$æ².ïò/õ’/ýr¤ ÞjÂFà%Ò NTƒ&KÂ&M'un#"Á±’ æ Õf+M%G%ÇÞN#Œ~FíaRd³&j“´¢KtÓ-áR.éÒ.ñò3Ó334 Ó0s$“12%“2-35³:;s4EBþ8‡¢83#À 9kí@o#Z.àP@$Fá$Þ“D‚¨`r!FA”AC @$$¡B"@$‚D8K¢$Á“@C 4$tAEâ,²&…#5‚Ô@Õ1 RC N#‚#’"Ì¡-ßR$â2$6Ó:µÓ=‹4;g¡;31³1s"s2E 2Câ23³$†t=ÛIëÔ^âøó%èáy‚$n4#rtG{4$Ô$´@4AQ4NT$$”B-t0TC94$<”$@T$ÞtDKtNBg¡K‡Lû3#Æ´ÖVÁ®Š§’b2@$Hþá$J$N -=õSgD“@JE€2t:u$ògþt$5$6u$R5TAuÔAŽ6B4ä%žd´è˜M26a£6Âè§&€T@EtH”NçÔDåQï4$*ôBOu6´CQâUgaPµPU$˜€ ÍΠ6¢ ÂÁJ†µ4h(’S5•SA5PATTIÕTCbVCbU[µVa•^Câ^ÉÕ\5¢±ˆ5#Èa]ë,zê%n )T ÚÒL"VEbV ¶^EBNâ?Oâ_¶$4v_=V$¦`"'‚‡0*#Ž~u†ŒÎþTƒhç%Vòó%*aä5cþ–VK6egaT¥T_Q•$üµ[Mvh;vh 40À^â ÞÁJp¶&v¶g7âg/VheÕh‰ölAÖ$DÖ$HölEâd—¶hÏvj«–³®6k·¶Îjàë6ÂkøA$š!8C ^¡ÕàD 5jÏD/@Lb@$ˆ D‚rîCK"q·qkõ„k#<¨ç2baf «fcP5R¡Q3b…à«&B€ÆöiËVníTÓ¶$Ö¶$ÚÖ[á–ckµ lë%á]–®¬äuMcõ†¢v—pIðpgÁsC‚qÍ6j#wr+7$.7s7P;Wq³tåvŒ·þ&’w63B˜7,Š!!æ!ê×'lÁˆ­é fF JAD¶'$ÀDÀÖÓ áf¡ž`B‚‚%Xj#áB"À DâTA<ê°R!:¡” $5"  ^‚X—\0É`°ˆUCð ­(u(\aèX€ X$ò˜†'˜yþ¸’i@9؃C„E˜„E„QX…YØ…ax$’y’ûX$„ÁÍ4¢Æ|8#|÷‚Ä—'õaÑŒ˜[yÊ™úÒy"|¡ÂÆ@ ‚ŸýÙ ,fÀ*¾6±çyz½6B‚ì%ˆÄpyiT2Ü™êà— ÈZÚ(–gù%tá¬$£7¢êž¤£:B:#d™–ûÖ¤ëì&!Ê`’BÖ³ þ‹)^âÁLw"”!°*zF›+5PZ#`zYzžea×6¢ ^‚ á¤9š©ú%fÀ£¡Zª5‚ª­z#v€¦aL`W´Ðµ&V![»ð asÀ^‚æAˆéˆ{ψuÂao 0a‹Àº•o@.^ºm#lÙJû%pk°‡â«ú°kB±ß±oÆH€À4âà™j¢zkžÍáx Öo# ôúùú&ýz!Xà%ù¦g(`À‹[Ìñ% ¢7b¢­¤¶kâp;)v{¡}»&‚{'¢aL0â%’b2µ•kAê6#.án7¬àµu9þ¶_s¶âo#Úî’"$`¡•IWyõ¬„½Ùà{(䛾í»Àð{#zµÖ Á7‚À’‚paž—¡ †àB4‚À¼ÿn—ûZ5Bájâ÷0Y4`¡Á̰{#¸!¬$DÜ ÄÉåÄç9Åkâº_âÅkÍXê%¼Àöà"#b²`žå@†·®'#ÜÒX×02.j‚‡ìz(0€¦æ>0#"¯œ2BTs@®<Ëëz¯¼¼•Á<ôÈ|"̼Öà_â âÌðî ªºÐüã%„A×úÀ8|÷<\¶UÃâ|"ðÀƆBzþ`ž‹!†¢íP`#°`’ÁJ K^â=Ë#½•'½ÒàÒ5"Ó7½Î¦a†õ†ÂΡ•KáÉ7 %"f`Êi6X#cZrÈXä»3â)繞`(¤,g3B ØaRˆ}OXĵÂÒ–½ÙqÚ'B Úæä¡©4Â0¼&^ ZY¼dÈî­#Bí€}u…Ý-Ô  †B@(2îz¡•A´£'h­Jî=ß÷}(´Àß^à5¢^" æš`t5 ’ÂX¡ £N .»Á_ `Þ‡¸Þàî è&b •k" Ø •EÁ³5¢Oþ1#á&¥Z¾&`^æ_‚æmç3BçÌçårP#ÔàìAäVõ;6A¦ ük“úaË_bà^bñP~¯U>,ÚWöÔ“¢šõõš¨7"òàòM#<€Î¬díi×í›<î±^빞™æ¾¥ðïÝ›ïëìÆÑÅ€’¾FÚ‚Lé'B`Æ•Âf&s¹ÃÑ»$`S'ŽÀœ3‚Û˜|((á&$ë·¾ë©êÀ“6"B=#ZAL%õÛ ZÄaßòÁÉöq_#tŸ^¢÷aî†:#Xà]k".uBþ5KGBûg HB` AþBh  Àò%¬¦rÿ ˆ.Ø«<2T )3 ü°ÊÛ`|ïãòõ†Ÿ6/+ lÒo˜Â… :|èPEƒ­˜ñ—§[EŠíÚÔš2¤È‘$K‚4Q² 'ˆTÉÒå,3,¨1ÊÉ{¼¥‹©^\€ÜŠÀ”߸ èEZ…Ul YµÂ­Ü`·]GÂlùr%æ™5o本uÄ«¨ˆzž”ìV`µ¸ñãÈ µVY¤Xþ²`uŸM»¶mm“#>‘6ZuëåÌjûõÛë¬^C§eøÎÊB@–yÂ;x,FÞÖ~ÒxTFœmQ¡ùC¾  ž\X¾Â|U£ª0Êc'p€žIçÍ’Û,»!Ø›‚¿©[ŽN?VE"AÑAŽ~LñgÕZ5à„$q'žHáÍòŠä™gbH^@vèaŽI©°U=€Ác£ŒcH•…bH+¶¨$H¬Œg¢ð¼cU „P6tè¨}“ÙZ~ú1aÏ6Q-€5 ÀM‘F†Ô‹P2 ÒŠå‰t våŒaÕ7üôFPÌÀ%RdšYšjZŦþ›'…„¤œ.JÚä,ONjâž}þèFƒ êB‹ä`•$4ñØ;îøàfe"€4À#!9rV¬³ž „ £"ÀžmN?ž8bTxØÅ*?hµ2Fºé’xŒ8d³‘k¤Á Zl¤U )ÉÇøÂ’—l%HŽ@B«|rˆ¡¥õSŠPX… i#9<Õ{¼Ä£†>ô¡:Á:ÒaHö퇋”Ï<¼ñþi ñƒ9XEÌ=þX°Š! Ž3 Bn¼f6·ÙÍo†Sœä4':ÕÉÎ[ʧ_¸#A6@¼¢ábž”Ââñ˜RE9„4ØÅíøÐ-@|£8ü`•I€å´J,6@ÐÞb ¿´ -T”R„ÀDF£¢QŽ>æ£!àHK•“Žh#*Õ§~´¸hµŽxŒ¨‘€š:ÊÆàÀc  (0XW417MŠVS>#àZT´P¢¦JÓP*ò*ðƒÇœãOT %9ÜpKQxµ(`«UÞAV³"ŽiµÊZû¯Š\ã­>•&\ñLà ŒŠÞ`½þšèEèhT: … q°D©³DR“Kñƒ?­4=Æ è $£gÀoQ„”B`CŸ¥=mje•Ö¾¶’-m‹b[ÜnD·…•âP«dÃd{L&ž°DâÖ¦ì@ÃSßEE1@XDµ2Ñ­TT?U8„U´°Dà1ÙˆÂ"´‹žZÁùx qÅLø´½ïï|¥àW;úåoŸþàæÊÇxÌ!@v¬6®Xð`žq†D¬V`FQ®Ñ…„|Všš+”%bðK` Ù³Ê>æaÐP" –- @ŸP¨f瀱U,0ãGþåÆÙÈñd(ÀãÇü8Èq²„™3sô8(ºXèjÃa 8¹'¹€†V‹†:ÀAYDÀvÞž¤W+ë•âàݨdCÚc.0ŽY+b`3£Ã_å„òéó\”=÷yµ€ô yRèC7,Ñ8­£¯,cH Uj~ÀjÝpM^Z$8ÐÅ Vk…Xà˜E9à ÚŠV« Z…z¢r={6*5€Åªw„2üï1Ÿ4NŒ@4×× ö°‹RƒÛ$É^¶UšýlÔDÔÍ„IMeoðögAƒì€aV Äò ‡¢Â¾3o®%ºkõnUþ?ï@½‹b ¢ôw –x7«—‚Õš¡~(J"¬A„æ¾# J²ð†;$8€¸Ä)nqŒ“»9Ö(ªu„dœ– ‚pÇ<Ž}‹¡ãAá7PZ”!@¢oqæÉœ{Rgýƒ¢«_$V»Ž2`ä·È6¬_€_E¸òÒ›€§‹NêT·új±®õ p}åÍ!€6x^‘rÀãJ°„< péZÄÂY-½Ñ÷‚ßDÿ7zNçë'2µŠŒãà†Õæã Â96 Xà‹Æ:öú°CQŽèI˜ñ[ÞÈã#ÿ( =Û—“„I¬6þþð‡{WËsPÌÉÇ0Fà.ø?ôAw¨iB#~Wô'I×4ì£ÏÜ hƒŽmƒ ùÙcL_L€Ü×_혱}@°ãû«ÿøWk~ ¿(¾˜Äí›Ceð «÷³Z〠©° ÆK$°}V0äàEEáÔP Ðgxr†xH§xúÞ@~AC5Wõ&pi4ð Â0€«e[àð‚¡Gn!8‚1&k‚+Ø‚3h1(„Qƒ¶÷­ä"13i}B aPVÚ¥q >°fB# ˆ²Ý û =ÑgÓ·Õ§ÄÀMþ}à/óù@ âaÅ ¼ƒ½gQ‘Àvh¸Z‡À†nhp(‡ F‡v؃zȇ~˜„Ì¡o«õ Úd E›ð [<à Ú Xh˜ES¡ $†%A†&a†òèÐ)Vñ0ûkbP«`iÚ• g` ¥á€;* € Dzr7‹QQ‹·˜‹»Ø‹Äõ‹Áká`ŒEŒÊøˆË¡ igá@Ê0I«ÕWÇ`VƒwhŠÀ†r ^ ŠhtH}è!.P°–pe n  |‚_bk'e JVÛðÿðþ)@°ö YÚ¥ ¹Z ‘å7‘ߨH` Øgr€1Ç…Á! U 7à æ#Š÷P?ºtbG`Ua¨ÒÇeèúoP]øuÔŒV¡ op_’µ £°‚…e÷àŒ¸„I¹”Ñ Îà”X• F•£À X kZ‰€Añ^i’Íì °&îYb Šëa6àJ½°îÐ# Lê þ„MàÈbî6”k`€;M€‰E¡UÀ É`V€P"}ðp bðˆ”¹Z–y*™›Ù™Ÿš£I¥yš©¹šsþ) r«…-9²Y…  Ú ‡FÏ0 ô@ Æd_sˆir0ÐÔA«H­X¯¨Ç º·ZpVÌð’V± Ÿ]á4 5l†…tU'(XC ß(žäùæYbéëÙžïILñ9Ÿ¢hö98¨¡Ÿ¾)Hp€…ñðI䀋 ŠÀ@0 ûCxopf  ¡?§ OIZ”àFÜ9ÞIà©Á°ñÕd Šj€ c ‚ÙJ< oà kï,ÀàO• Ç`’8ª£<ê£X¤BJ¤—d¤Hª¤§Ö¤O¥*çÐþl‰LÐú ^'Z£PA à#fðc` —À¢°¶ñ… ç`¥°§E2úEéŠG™#रfau{€ ÜÀ5FÍ ôP Ò`Ð%ö¥qоٺZõ©’Z”j©˜ÊDšÊ©žº Zb縥zªd* pစ^pþ@ <÷# ]@ yžP²:Ï ) _@ /u¢qø§V¬ÕpK†4:6žS XøÔiÚŠ…‡Ðu° D¢õo€€z¢hÐÂiM”&y êÊ®î ¯°&¯ôj¯ÝCþøª¯üª þ °{>ÌP°¾Ê©°h×ð}PbkÛ —¶€±EP K°[À •pjà¿@Dp é°Ðw°¼ \¹­!ôp.Ñóàõ Oä æ*èªÜXxM{ÀÛZ#@Ctj"dàa€ ˜°²?ÚK[p—Q1 ¾@¨¾iµX«µ\ëµ`+¶d;!f‹¶j[´jжo[£ðs˱̑ I Z‰&þi€´ÞÀXØ @ +€ Ðúððo0{_ð/’pmEK“Yç©dЋàSP; RþKŠª#  々\ ð¦Às|z†²€Kðv` ƒá€ i¥°° JŸÄ „Ûfè€ë»À kÂK¼Æ[ÈëOÙ°¼Íû¼ÑëÓ[½×›½¢¸½å½±à›¸ ä0j¢˜;€PaŒq’{¢×PëPbðz®[X`[À9¨EP……»º Të!'à ˆ@²Îð„ðº@¾QP ʰÜÐP³7Kð³ Ð?»= o麀P?U`²mýKÂ&JÂ+_.ü1<Ã5|Ã9Œ³#ÁÃéàÃ@,ÄþD\´F HlKÜÄýë!j°§ ”U{À ó 0-0ªÌÇjºAb5x»C9†ˆú¼«#H@ ¥  _ôPÑòàP¿=›‹ Oð¹‘4º¥+à𠔜pÀ}l‘€0®Jb•Ó¿Ž É¢(ÉVÉqÉ™¼ÉÁ̹ ¬¢Lº{PʧœÊ«ÜÇ® Ä ËV@Ë¶ÌÆ’ì@´?*g@ e ±K ùÆÊç\°°Ðò§°LÐ\¬È5ÊÈ:ò âÀt¢xBÆ@[t` €½\´ ÁŒÎþ¡¸0Á‘ A€×< ù¼ÏXëÏ]Mн­ÁÍÊ ýÐ$]]Ñ# ª Và ’€ðIqÐi ]´ëÀ €±J[4Ø0 FÏY%p·tê b * QÅÀ0ÝPDðºÊÓ} Ìü°®!Eð˜ý»ÔM-ŠOÝÕRMT WÕè¼Õ]ýÕVÖcÍÒͱè–Ö! 3M!Ð d@À`¸ùÖ‘ š€ÉsP Û÷[`eóŒÈ¬XÏçzÏ\RLܯ°àÍi` C wWP‡ÍÇpÌì0~ç Np×ÃÙrT±œ žþ Ú¢MÚ¦MÁ¨-3«ý%ÐÚ¯­#‰ Áü^@$ @²I°×º],PO·[  vÔ-¦O°Æ]@‹EPáÔ9.'ÝXÚeà &*e[àY Þâä _pÞVÞ¶ÈÞí½ZjðÞñ½Z@ßÂÍ% @SuЀ €ÁΫ0TkàN‚` €1 k×€ EnÝ-™ú”i a  åM¡àb 4p †}ØÙQE°}à Û à qâ)® ×°â€Ñâ/ã3Žázvãv ;Þã?Î%à;}¢f@jü}àþ ÛÇP€qu kÙPÊPÔ#>ÙÝYÙS{Ù ‚kE› @]kZ° \Î 9ºäQ3}ù[™à \ å 1çu¾­wžçú°ç}^b€è1è€Qè°–‰¾è\Bêðk®‹Š ¢}Ì·u¥¦½  Mp¥À—°VGPò¼r$®Hvô “!ÝÆàÍ2³‰Æp|é0€A×`Œõé Ñë¿ÞÀÁ>ììPì2ƒì®ìÌîì'íÛ=í:‚-€ÒÀ×E»€a¶°‡‡-'ÐîmB u_0 †œëm>£o¾»WÖoî Z$€þ´[Þå ÅYm?àÍøÐ£™ ²ÐâZîÃ0ð/ŠŸð]½ð ÏÓñj½ZñÏ%ÏpO€ï«Eð- }£@4kXP%U€•€Õñî I¨ë£ueñ€XÂÇX©€ê€ /ŸÕZ0ë'°êAE€ Í ò ÁôNOÁP/õkJõVÏÓX¯õwÀõXøõÈàÚcÏ%ÀÔW,!Ð$ k ‘ ߇ë qС ZÐ c ˜ô¼j^Ю`X¨@ íë¸ð{o-'ðÊ$Il)jv]î”oùœù›/áwþàù¦ú£ÿ¥ÿ£Üúv*ùp§pùŒ0õ{ð¬ÿæ®[‹• üWPkŽôþ~¨Hx+× 3ƒkãð.@>€áÒ@ ó«…„@ ? g«Ñmpk¼¿Ûßý þâ/áåþéV$( !Rq,œbé[Aˆµa0ÌâEŒ5näØÑãG!Er´"+L¿ˆºŽaÕ \D˜1eÂŒ7Sf6Nm"ŒäÙ³#.@³„%ZtèBSF•ÅeÀçS‘Ö,°‰E(f}XCÂ9›acÚ³UžŠb fcU†T¸qåb”Ju¦U¬þZvýªÖï@²fÑþµÂÖí\ĉ‹ÄdÏÔC‚ 4Ý#\Ù²Ì}âˆ[ÜyÐ¥¡g!½´©ç¸vδès‘,y[ù)ûèÚe¿ñ°Sé6ázÔrTC]¼³jÖ®a˦m·Zݼ}W>Üøuì<±ÀÇèùwðáNͱ@$»\Ð¥’VÏÔéù‘TbŒù‘ÖBr-ˆÿwÀe,6hcø ôI>úìÃO?þúSë?ËÐ@ )üg fðppð²± V°¨ð©ôÚ; €¤Lê´?ºÄ ( 4äðƈòçˆrZô±£c,ˆFq4R yüqIÔŒ¨€Xjþ:Ç Ô1æ-&E*QEöTœ…Å,3²Â•1˜ò̾1aKÌ 3K+\ ÇL4ÏT“M7ßÔ3.(<™#–vêünlÎxdO¶4±KÁDt>ÂhBAoÄ‚’3\ñQ&#´R/ÍtSNK婚OâPBPÅêÆ’-¨9$OS3R´=FMtôQ#&YC†yZýŽ’4’¸§V&{ý•aŸ#ÖXd£ KÜ ƒ’lš…ižSØÑi7ºU½\ÛÛ•Óg8‘G7´ýK+Ò€$\&Ó]÷wý‚W^zûõˆˆ\±ç…E~kvœKŽXC2üµ5(/GC1â/ß‹všNàY€|þe⢒,¬A„V‡GÄXcŽ;†éãG.ùe¢Á`‡9X€$[AÓÁ€˜;b0$˜/·´rÕ;·V$,hc lU(SØÙ! ™Lz馶j©©®ú달ø$‰=~E,pÌ&T®ˆÃ•DžÛ¢¡E+º´£‘%‚…Ã’#ÚÁŒ¹™Ü»ï¿ouðÂO|òa”xlèA…GüÀ¹²rÙ€…-úb“{Œ ü3ˆ½¼[´¼¥…Â]èi!‚ÏÑDã’!ð‘á WgröÚoÏýÌÝ{ÿ=xá)ŸF fÀ¦.’ˆ…N(a‘B„€B€ÄPT±…þ~äÙ|8H¦¼îÐ^-vz«ù™=€A´oÌ‘STA¯Pš·'ûáOüSH@P‚1 °‰´BÂH8ÐQ…$øB«E%A*Lða“Ÿi,öµd\ÎôH* ðãù¥Ð ´ÑbpªS!¢bˆ‚Öð†9TË{øÃ ±ˆSä,°*z~Ki¡Rè3)"3¸õ¬‡=íqÏ{àS,UÔ` {˜C 'bd±Vac«w½ìm¯{ß+DßÇ9ÖwÌ£y‘UÔÈ•ÒE£|qnføG#6A rð þi°FGÒ8”ô'= Ê &! 4å*PyÂU²R—¦@t)´ÖqibÓ¤Sý²y²@”ùÌŒˆ™x¦%×3L/ó€  ¹ºX@ßüfà‰jsQØlÔ i ”€œ“‹1Ïgb£H' Ù©+wêÑp>çƒ+ô—“ ú1LºG—ÀúµW "¥äЂ‡ºîŸæ hï€&p4h®@TúH@!fвYR*šÞxéËZôT…€.hºN›¶S—T<„ê°ÀO¥b0„£âj¤FþÃé‹Ñ‡?ƒªôb5VÚ¥Y%×VñÖÕ)¶×@«´ÊzÖº°°[‰æVØÁµˆÜòЬ`^‡mð¿Ú °ó¬ •=0ÖT*@$4 6:8b—àD(‹ü ÒàFáHk%¢DÑæqC`ä=úl…”€ ¨b,`EPú XÄB3XEoýˆ­DWºèB#³[¢ÌvE•\1®=â°¢P„xé¸pn…Â9ÝéZ¢½ýÚÀ± D€@>ÞALâ‘Ø=QRšÅeˆ¾Ó%À| ¤­hb Hþ"q€+Lpp¸ØÐ‡=`Á(n@8 [ujÕÀ$Õã!bŒT€À ‘ûZ·ÃÙɨ ”b ``ÇáŠä+ŒRÏP’ÀBÑ®Pj›¸4T)3˜æác†>ècE9);šaåhmÃ`Q°à|JK–ØŠ¹êH3äÁj(J4úº‚9;?EAQ„ è9Z€1h0R`¬ds“+öÈ€µ ðAg‡ üà‡†2¸Cn™6Õ3Ö€AåcN£SÜV7¿õ‘Í(CK‡‚t`¤ÆNYU0_t“×µ’¶€ƒY`¢¨ºlôþd]HI·ÁB¡h_‡m1ì¡Ù˜Å;‡h\»TÇØ‚$w‘€ËÕþŒu`Y”B(À°¸ÃYÌB%°w© Á†Bã—Ín7eY™m›  GûÝ™oä¡ À¦ñpNÙ eö«ÿZðg³r@Æ(Œ£æØ8Rþ¨züäkÇÙM±'¯îg€VÞñòÎp G.þ&+^@™Ç9w%¸ˆ…(ãè)D0õ=ƒ_7DíE§c¤ó {ÙÍ~v´§]íkg{ÛÝnº]îs§{Ýí~w¼ç]ïm@°wÀ^ðƒ'|áþ ¿Ã'ðáÖ’Ç% r°ûÄa Få-yÌg^ó›ç|ç=ÿyЇ^ô£'}éMzÔ§^õ«g}ë]ÿzØÇ^ö³ýÂÎtb†ý"¾ðŽÖ|ÿ{à_øÃ'~ñ‡ï‹Û;>~_Ϥî-Â{ãG_úÓ§~õ­ýf!$¸¿©ä{}ð‡_üã'ù}¯ýÆß<÷Þ7ûÝÿ~øÇ_þAH¸¯Ôž@þûçÿýÿÿV©¿DQ>.b>‰Ê¿ï@\@l@üˆû;0|@ ¼@ Ì@ð‹@-"ÀK2@Úr¾aÐ? ,Aö›AìA|Áäˆ d1üA#R”CYSÈ…„‰T@\ ¾®üʰ´È¿ØÈ™@Ëì‚(€ˆš J @xsüƒPv(œ‘È~,GƲ"†¨™´‚z•@Fþ+Ø|øA¸ ¾ô˦¬¿d(V±Šò«¼F‘:ÃTÄ­Œ V؆0ƒÐ‚XxïTØ?h…TH+ ….ðMà´Ø”MÚÛÄMÝäM™XÍÖ$ U˜úp´6HˆRÈ‚ÝL:X…`…G@ËhTpIè—ì_cH¸À;(K°èê¨É0ÇHJ8 ˆÌ]”ƒ?8ƒø~¨­˜É°{ ‡:0€‚hÐQ‚`…Ñ,HS$BTL͙ЅG”ø|þ ‚øT`Í8…t5ÈH Ñ¸ÑÝѰpQ•Ñ@”ØW ´dNPË`€Lˆ Pp€Ê x+€ƒN O+ðNÜ@}°‚Ȩ¯0訷 LäÓýKšôS+h]ˆH¨ÐÀ€(¸‡°È…XˆQÄT‚ð‚:ÑôÃÆõÓJ…ˆp0ˆ(øÎTX… €:ë´Q%USEÕ¿øÔP5Ë*•Ò R+°RHU‚(K…NP+H°bÍUeý¿1àRˆr¸ƒЂ`QI•T+¨I«Â€jþETLlÀ—Pi˜¥ÔI ˆè‡tÅTû3È6ËÆíT˜@GR+à™ÐÕp0ð‚  €• }µ~ÝU[½UÐU^µ_`-Öop]¥Ò„?Yˆƒã!ÐJøƒ1h‚ú©UÈ>¸-ˆK0Í,…µ ˜Ó*Haè\@ S4E¨2› ÌHšƒuPz€WÆš½ÙœµA€#@…pB+yÀÃ{ÅWˆø×ÄN ¨„àL0‚xÛ¸ µ6h[ˆuØ(Ø­Ñ‚QþFÀ-mK+x€,ˆ S+à0„AÑ\V+Yù3ÇC(ˆˆÆ!)‚:؃/00øƒOø™{D+PÝèzP°èZ‘D4@³,`9hà‡éªÛAø‡<€<„Ø•.Ú[vàn86.0‡1pœé»Jzu´œÁ?DÛP…V`…@…±‚kØWHØ€}ˆH…+ØM?(\ \‚Hßõmß÷µ‚øßT¨ß™_ò5ß …,8P ÈRˆIx(c@i´‚E€(…Pƒ€„HØ`NIÐÍhO kh°[0+˜þ+Ðk ÿÓu€Ó…^"ÈL-M{ 5_"&¿M  „‡&8ÜêÓÞ²Íʳ-b)?,XX”Yôáy}bwãÔ)þb0.?'ÖÔŒâ0>c4[ Ü^„ìÞ!Nc8Žcâc ÞT3–c<Îc•¡ãš b‘xc=dA>F*? @dE^ä )d;dHdFždJ& G†5HþI®dNîd˜¸äËdØdO.eOåÇåŽ eSnåIFåå3M(ôbW®eF†å”e.DM[îå[&Í>¶c!Žƒ5(fc>fdNfe^ffnfg~fhŽfižfj®fk¾flÎfmþÞfnîfoþfpgqgiÎ`6da *Øvngw~gxŽgyžgz®g{¾g|Îg}Þg~îgþg€hh‚.hƒ>h„Nh…Þg%@Q2îC¬‹h‰î0¬ì≾hŒf¬Š6¸Œîhª¹i’&§Ž¼’Ni•V26Öå„\i˜Ži :i”i›¾é¹¡i4ÄižîizÑéÓôi¡êRêY&j¤Nê%1ê]Vj§~êaê—†jª®êÅêîµj­Þê8liUæj°ë=|èSk³>ëR$kEk¶æj¬Á¶Žë›~k¹®kª¦k»Îë¤ÆjgÈ¿þkÀlÁlþÂ.lÃ>lÄNlÅ^lÆnlÇ~lÈŽlÉžlÊ®l˾lÌÎlÍÞlÎîìÇ^¯Ž˜tøÒ.mÓ>mÔNmÕ^mÖnm×~mØŽmÙžmÚ®mÛ¾mÜÎmÝÞmÞîmßþmànáîÛV.¦äNnå^nænnç~nèŽnéžnê®në¾nìÎníÞnæv4îþnðoñoò.oó>oôNoõVëõno÷~oøŽoùžoú®oôönûÎoýÞoþîoÿþoÿ@—p/p?pOpÇÁoppp /oüžp ¿p Ïp ÿï ßpÿpq¯îq?qOñ/qo—qq'pq¯q¿q GHßqïq‡îÿq!r"÷ñ /r$Or%?ñ#_r'r(‡ð&r*¯r+çï)¿r-ßr.¿oïr0s1ï,s3?s4¯ã4_s6oóè.s7s9ßò«s;¿s<Ïs=ßs>ïs?ÿs@tAtB/tC?tDOtE_tFotGtA;mod_perl-2.0.9/docs/user/handlers/server_life_cycle.png0000644€ÿÿÿÿ00010010000015052311727205031023403 0ustar ????????None‰PNG  IHDRoH¸ý”QsBITÛáOà pHYsÐй‹çŸ IDATxœìÝy\Myü?ðϽu»í ‰dÐ")2ÆI²T˜DŠZmí¡…ŠQ‰¥CF«ŒÊ¾ÔŒ!LIööõ.¿?>ßïùÝo¸¥íÜêýüÃãœó¹çœ÷=é¾úœó¹ç €î¡ „”””455ɮ藎=JAÙÚÚÆÆÆ’] Ð/Q(*Ù5ý¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]üÝYùùóç555=U @¢ &HHHtmÝn¥é¶mÛž={&..Þ¤+++KMM500èÚêÝJS„P@@À’%Kº¹€\&&&ÝY®›Ýi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]Ý}¾)/óóó{úôé©S§º³   ž* !´oß¾{÷îu³ª.ˆŠŠª¨¨(//OMMý¡ÿøã´´4EEEWWWάûìÙ3 …2räH—.• ýF_÷Mýýý=<<´µµýüüz{_>>>£FêÎþùçŸnnák;wîìñmvÆ–-[‚‚‚FýCk=yòdÏž=IIIþþþFFFáááYëÚµk #444$$DHHèÒ¥K]*ú¾NSoooOOO--­úúú–––>Þû:v옅…ÙU);;ÛÄÄDLL !4qâĪªªÎ¬uöìYkkk<½aÆÌÌÌ^,x gzOŸ>½páÂ÷ïßçää¬X±/ô÷÷úôéÌ™3Ÿ={&%%ÕÖÖ6sæÌU«Vk%$$¼xñ‚Íf744˜››khhM.\¸yó&…Ba0 …Åb8p7±X,ÿºººOŸ>999©¨¨àåmmm‡zÿþ=B¨¹¹yÙ²eK–,iWgEEÅ!CDEEñì¿ÿþkmm­®®N¡P$$$ªªªDEE•””¬¬¬ð Μ9sóæM:ÞÔÔ4wî\###bSgÏž-((hjjÒÒÒêðq?\Š ª­­-//÷ððˆÄ ;Üã÷¸»»Ó•••Y‹B¡Ðét<-((HLÀ@EBš^¸pÁ¢±±qëÖ­Dšz{{/Z´HRR2::/IHH¸p႞žž%B‹Íf;88iš••UUUEF]]««+±¯²²2[[[eeåÖÖVww÷C‡áå‘‘‘&&&rrrx6::º¨¨èçŸæ¬3!!aëÖ­ÄìĉÇŒ ""bbb’ ,,ìääD¼©OŸ>………áÙ¸¸¸sçÎáw———÷ñãG"àž={Æýq?\Š÷ðð@§§§wògg´´´ta]>>¾ž*xS_§éƒäää¨Tª¨¨hkk뇆 †›ÆoiiI¼ÒÊÊÊÅÅçƒÁˆ‹‹+++£ÑhT*•ó|c^^çÅ<11±ØØXbv„ ÊÊÊ!ÎÏô¬¬,Ü·Ã NçLÓOŸ>!„†ÊYü°aÃDDDB²²²ÂÂÂ!*õN•_ºt‰ˆR„““NÓÜÜÜÐÐPÎ÷uýúõ—£Ñañ£Fò÷÷ïpÇ`0vïÞíææFôÔ¹c2™œ³l6»‹Ô×išœœ\WW‡»P---§OŸÞ´inúú3—Åbቀ€€Å‹¯ä#J¼†@¡P:,CFF†ûùÏ„„âÊ)¸‹ïÁ.)B¨©©ÉÝÝ}ëÖ­ÁÄb±ñ--- £ëÔ§£ëêꃂ‚‚‚‚ÒÓÓoܸA´VUU;vŒ˜‹‹ÓÑÑÁÓ>| ú^%%%ÄËf̘‘œœLÌVWW§§§wXÉôéÓÓÒÒ¾×Z___SSCœJíŒ ÄÇdz‰‰‰ ,ÀÓºººIIIœMoÞ¼épƒ\Ž÷â{Ö‹/ŒmllBõõõí^ààà°víÚvÊ~ýõׄ„<””d``Ð7ÕY(![[[γ£·téR ‹¯Çï|MCCÃÔ©SwìØÚ·o_vv¶¦¦&>-éáᡬ¬\\\,**ÚÒÒ2gÎCCC¼â;wŽ?.,,ÜÜÜ,))yçÎ555777)))„P||üÝ»w%%%GŽiaa;gþþþÙÙÙ®®®†††¿ÿþ{XXØÒ¥K½½½Bl6;66¶´´TDDDHHHFFfþüù80BQQQººº'Nä,þùóç‹/Þµk—±±±©©éÊ•+׬Yƒ'B§OŸ.((lii™={6ç(¤?þøã¯¿þ¢Ñhµµµ***—.]RSSóôôär¬¸ .Åûøø´¶¶Ì™3!´~ýúÉ“'ãµ|}}[ZZˆ&qqq|†€; Ñ£GGæåË—'Ožä|Á‚ >|øpûöív'ÃÂÂÊËË©Tª¼¼üæÍ›;ÜøÚÓ§Oïܹ3yòdÎ1w€^bbb²yóæ®ýõOÁ'Eû,M¹ëñû$tÙ®]»öîÝKn ¼s4YÂÃÃýüüœœœ|||È®€¯›i wüÒ£„þfQss3Ù…:Æ+iêççwóæMww÷üü|²k! €B¦ô¼rŸ^ŸÁv:kïÞ½_/×ÑÑ„G| ÷Myÿ–aÄ;i:íÚµ‹ìO÷²jjj"»@ÇxåL/ œ¦Ð7 _€4€Gá4…ë¦ô ¦ð(Ó @?i ‚1½ô#¦ð(Ó @?i ‚3½ô#ð òÿöÛoßl*)) }ÿþ}jjj†ŠŠŠª¨¨(//'eé éiúéÓ'*•J£Ñ˜L&‹Åâ|b( ¨¯¯¿~ýº––ÖŽ;ÄÅÅÛ½ÀÌÌì{ëÆÇÇGGGóó“öcÚ²e ú߇ƒ>gzèGúGš†„„xyyIKK#„ðG|áåå…rqq øæ ôõõ¹¬Nb”rÁÝèGúÇ'uKK Ñ¥9xð ÑÔÖÖvèС÷ïß#„š››—-[F<Ó&((¨¶¶¶¼¼ÜÃÃ#>>6ùûûŸ?~ÅŠø™hþþþ™™™+W®Ä³]Ø`—ß×áÇ߾}ûÍó¨uuu………¸_hll¬¦¦Öá[F]¸páæÍ› …Á`P(‹uàÀ„¥¥eKK‹¢¢bII‰¿¿¿  `bb"÷µ¸à^è¾.ܽáýû÷222½Và»úGšÚÙÙyzzJKK+))ýüóϲ²²DSdd¤‰‰ ñdïèè袢"ühq"‡ÒÓÓƒƒƒñCOBÞÞÞ­­­666xÖÖÖ¶¹¹™xÚh6Øeè;çQq=..._§5— ³²²ªªªˆUêêê\]]ñtDD„ŸŸ~R©²²ò¸qãˆýrY‹ .e€ÁÇÇG£ÑÚÚÚÚÚÚh4÷_»v- ÀÈÈÈÖÖ¶oÊëKUUUYYY7n$»¾«¤©‚‚BHHH}}ýãÇ“““W¬X›²²²p÷c0t:ó3}Ô¨Qøiäœ6lØã$11qÆ DS×6øCjkk¿¾zÚy\*ÌËË 'šÄÄĈ'׊‰‰ 6ìåË—ãÇÿð჈ˆˆ˜˜nâ²V×Ê=EPP°­­­¹¹™KšÞºu+ àÖ­[!â‘òFUUÕRRR.\i xYÿHSœ¢¢¢³fÍš5k–··7‘¦222Üϵ~³9~üøªªª††>>¾ÊÊJyyy¢©kü!ÁÁÁß»†Ú\*d±Xí–àÂc666!!!)))œ@p_« e€ž"((XWW×ÜÜLüé鸸8 àÚµkÄ6›Ý‡Õõ®/_¾„‡‡ÇÅÅá+Ç­­­dW7ýãû¦;wîüüù3ž~÷îÑ4}úô´´´.lsýúõÇOOO766æ\Þå vÞ×éõC¸T8cÆŒäädb¶ºº:==˜2dˆ  àË—/?þ|¸©©IWW!Ä`0È® n(![[ÛΜÙûÚÒ¥K-,,ú`ìÉŽ;Z[[)Š   •Jݱcñ§:›ÍŽ---’‘‘™?>¾:èããÓÚÚZPP0g΄Ðúõë'OžÌ¹Y ‹•’’¹°;ü&â2óæÍÃKˆaG¾¾¾---ÄÅÅʼnk™~~~ÍÍÍÄZ6l˜4iR‡"„âããïÞ½+)))((8räH ÎÎtUU•¡¡aLLŒªª*g‘ß[‹K…ÜË=bƌϟ?/..ž0a^òøñã}ûöegg³ÙlqqqGGGIIÉ;vìß¿ßÏÏ_Œï§ZZZŽ;úáÄÐâÅ‹çÍ›7kÖ¬¬¬,² ™‰‰ÉæÍ› º°.ŸÐãý4=…Íf;;;s^%¼LSSóÉ“'7nÜPQQùûᅢ‚‚Ο?Ïf³EDD¶nÝêîî>tèPüJ}ûöùøø899‘[3B)œÅb±Ùl‹EÌ Û-a±X ãÏ?ÿŒ¯ªªBÍž=; @KK !TXXøË/¿LŸ>ýâÅ‹$¿10 u3MûÇuSÐS.\¸ §§Gv ³ð™ÞçÏŸ:tèÌ™3,KHHhÓ¦M;vìh÷M*•Š:{öliii‡Ñõ5&“‰“s ‡œK:³°;oYUUÕßߟó Àzÿþ}YY‹ÅjkkãççŸ8qbwö@ƒ4,üüüêëëoܸ1oÞ¼™3gvgP1è3øæ‚ÖÖÖL&!D£Ñž|øðaù5>>>*•J¥R) •J%f‰…Ä’ÖÖÖêêj|aX^^~Ïž=k×®Åï…€Ó´¼¼|úôéxÉØ±cÏ;7vìØ¾k|¤é`áããCv à‡á¾iDDDaaazzzkkëĉW­Zååå5uêTÎWâÒ××700ø^tqÁÇLJ“s ‡\¶ N¬“ïîË—/^^^xö§Ÿ~RRRúzu| ŸB¡#–_¿~­¦¦&++»dÉ’… jii‰ˆˆtã0Ð Mà]øvHbbbáááîîîááá©©©§OŸ^¾|ù®]»ˆî¡É“'¯Y³†ÌŠ„””Ttt´‡‡GDDDJJJ~~~~~¾¶¶¶‡‡‡ŽŽñ2Ü7;vìÝ»w ïß¿ëÖ­‚‚‚·oß&%%%%%Ñétmmí5kÖpø /õoÈ08qÞ\PNNîÀ÷ïßß´i“  à¹sçf̘¡§§wûöm„N|B¸=zôþýû=zäìì,..~ùòåE‹ýüóÏüñ¾‹Ó´­­J¥Îš5kóæÍ©©©eee—/_öööž7o^kkkvvö† äää,--/]º4¾w ú HSxNS·²1"00ðáÇÂÂÂYYY³fÍÒÕÕ-))Aýùû¦Ã† Û½{÷ãÇ}||† V\\lhh¨¢¢’œœŒ¿zÐîî  E]]ÝÕÕõܹs/_¾ [¶lYkkë¹s猌Œ”••ƒ‚‚Þ¼yCÒ»ƒ¤)¼ë{ 6l˜ŸŸß£G\]]ÅÅÅóóóñ 7úošbâââNNN=:pàÀèÑ£KKK-,,ðí*¹Ü½ABBbÆ iiiÏŸ?÷óó›4iRUUÕþýûÕÔÔ6nÜxïÞ½>|`ð‚4€wqŒÌ!C¼½½=zäáá!%%…úšb‚‚‚ÖÖÖwïÞ=r䈂‚ÂÛ·oBmmm®8dȇÂÂÂ?ÿüS__ŸÉdþñÇ .\½z5çýè ¦ð®¯Ïô"„Z[[kkk‰à”ؾ}ûÇwïÞ=dȪì4míÚµ·nÝJIIQWWïLšæÌ™“’’òôéSGGGIIÉ‹/®\¹RCCãæÍ›½W0ä`L/<ÅbíܹßãkiiyõêB(""">>¾¥¥¥©©©¹¹™ÍfOœ8>"ˆ‰‰9;;“Szo¢R©úúúúúú'NœøÑueee}}}ÝÝÝãââ"""^¼xa``°páB___•Þ¨ f¦ð*•*""÷uSuuuuu5ç‡Î­s`055íÚŠ"""NNN[¶l‰‰‰ ¼téÒ¥K—Ö¬Y³oß>|z€1¸~!àeNNNøT­ƒƒC^^Þõë×‹ŠŠ?~üï¿ÿVTT|üø133!4|øðÕ«W“]l?C£Ñ¶mÛVZZºiÓ&S§NM™2%%%¾Kz ¤)¼BBBÂÕÕ!tõêÕ… jjjΘ1CEEe„ rrrC‡ˆˆ@ÙÛÛã±¾àGIJJÞºukáÂ… K–,ùçŸÈ® ¦ð++«1cÆzô?ä8,,LOOïõë×dú1HSx‹‘‘Ñ”)Sþûï¿ÈÈHbá«W¯222h4ÚæÍ›I¬m€?{öìˆ#nß¾­©©yéÒ%²‹ý¤)¼…J¥úúú"„‚‚‚¾|ù‚}ú”@¡P¶mÛFvi“˜˜ØÉ“'CBBètz\\œžžÞû÷ïÉ. ô3¦ð"___ …Q^^ÝÐаpáBeee²ëȬ¬¬Š‹‹G}÷îÝ ~üHv!}MDDDTT”ÜV¯^M£Ñlmm:ôåË—C‡‘[àe¦ ßˆŒŒŒŒŒ&»9r„ìúTccãÖ­[wîÜIv!håÊ•"""&&&ÉÉÉC† ñññ!»"À£ MA²qãF¸‚8ðT/pÑ¢EÉÉÉ–––ááá"""nnndWx\7€,[¶,>>žB¡$''“]àE¦Ð±åË—>¾cÇŽ=þœìr Møa¥¥¥7nœ2eІ††››[/Ýý\GGgÂÿúå—_šššzc/ §ÈËË›™™µµµÁí'HS~̽{÷V¯^ýøñcƒùóçgggÿúë¯oß¾íñmذAGG!dlllkk+((Øã»=ËËËKDD$++«¸¸˜ìZ@_ƒ4à°ÙìíÛ·ËÉÉåä䆆†ž9s¦©©) @OO÷#ÍÍÍ'Ož¬¡¡Îf³ñŠ×¯_722RRRš1c†››q/º L˜0ÁÖÖVMMMQQqÍš5¥¥¥¸iݺu«V­BmÚ´iãÆ …³‹§¥¥¥  ```——G4ýùçŸË–-STTœ;wîúõë'L˜ ¥¥E´¦¤¤,Z´HAAa„ ššš»víêÍ6¸HKKoÚ´ !„%AÒ€ð÷ß¿zõÊÅÅeèСx‰‚‚‚¥¥å¥K—6nܸdÉ„Paa¡žžžššZdddll,B(77×Êʪ­­mýúõ .¼|ù²©©iCCBhþüù¡ëׯkii­[·®²²ÒÚÚšÉdvX‰¯¯oppð¸qãÌÍÍ©TêæÍ›322BçÎsrrb2™fffcÆŒ¹}û6BÈÈȯURRâçç'--mnnnddÔØØX^^Þ+Gj°Ú²e‹¸¸øÕ«W}úï¿ÿplã&mmmÎ-hhhXYY•””ÄÄÄ8;;[[[v눀¯ØÚÚ ççç'íÁ`i ÀPRR3fLXXXuu5^òâÅ‹¤¤$mmm"ÀðÉU„Paa!N—””=z´¼¼üãÇŸsèÂËÊÊÊššš/_¾Œ3!téÒ%¼œÍf_¾|YTTTJJj̘17nÜhiiÁM/^äÜ‹/äååïß¿Ÿ››¯¥¥B¼Ð#† ²~ýz6›Iv- ïð“]ý •J ¶´´\²dÉâÅ‹›››³²²ÄÄļ½½‰×ìÝ»÷É“'µµµ¹¹¹[·nuuu]ºtéüùóùùù_¼xñøñc{{{›+W® „×­['++‹=““cgg—žž~óæM„ÐÑ£GÅÄÄBeee!6›-//¯§§z÷îÝŸ~ú©¸¸øñãÇÛ·o§Ñh[¶lquu500˜;wnIIÉ;w8ëÏÏÏ ÉÊÊRPPhiiyö왨¨(mÛ¶øøøßÿ}Ïž=Ä%v0°Ašðcf̘qêÔ©ßÿN§ëêênß¾}øðáÄ òóó™Læ† vìØZ±bN‰‰ÉÈÈ R©rrr‹-Â'„ñ‰Ö””<47##ÃÎÎ.!!áÕ«W¡'N|]Fhhè¤I“NŸ>}ëÖ­Ÿ~ú)88^±b•JŽŽ>qâĈ#tuu9‡ûÊÊÊÊÈÈܾ}ûæÍ›¢¢¢øû²BBB½zÄ¡Q£F-Z´(777--ÍÁÁìr@_€4à‡Mž<9))é{­ŽŽŽh·pÉ’%xÄo;ÄÙZìñãÇÄt»“´íðóóoÙ²eË–-_7àé´´´¼¼<<»bÅ <. ô6kkëÜÜܸ¸¸mÛ¶µûv Mè.\ÈÎÎFÅÅÅ™šš*((UIEEEFFƒÁ¨¯¯?{ö¬†††””YÅ ZÚÚÚ#Gެ¨¨¸uë¹ 6…@Ï8xð`NNB(==ýþýû$Vrÿþý˜˜˜ØØØ3gÎhjjÂXRP©TSSS„Pzz:Ùµ€¾}Sz÷³}‰óL/ ÑúõëCCCÏž=F ùôM WŒ;VMM­¡¡Õ¤)ô|ª³gÏ’]èu¦<áÓ§OÎÎή®®;wîtwwwuuålåü.cøÞçÍ›‡Ç£†„„xxx´»“à‡àÔ999 ƒìZ@ï‚ë¦{öLJJª­­mæÌ™ø^îtttJKKóóó!M6HSž`ggçéé)--­¤¤ôóÏ?ËÊÊM>>>555ß{…••ž`³ÙDšâ°466NOOæOÈ}ƒßäíí½hÑ"IIÉèèh¼$!!áÂ… Æ0@WW7""âòåË{öì!»Ћ My‚‚‚BHHH}}ýãÇ“““;sÃWVVF£Ñ¨TjUUU»Œ5Êßß¿G*?~¼¥¥%1keeåââi @‡f̘!((XZZúùóç!C†]è-0 ‰'à'|‰ŠŠÎš5kÇŽÅÅÅY+ @]]ýÀþþþÄS½]øŠ[»[ c³Ùí^Éb±~tã Bt:}ÆŒ,+77—ìZ@/‚4å ;wîüüù3ž~÷îgk}}ý7£ëÇ?ÿü3ž.))©¨¨èäî¾·A„ÐØ±c‰^^»ví§Ÿ~ÂÓUUUÇŽ#^§££ÓÉÝ0Èá; îÞ½Fö`p¦—'Œ7nïÞ½ EPPJ¥âV¯^½mÛ6III SSS„¥¥¥£££°°pss³¤¤dCCƒ———›››”””OkkkAA¾€º~ýúÉ“'w¸A„Mppð™3gÚÚÚ† B VRQQáããsppmii™3g޾¾~ú9< áãÇéééfffd—z¤)OæÒJ<½« bØQ;~~~]Ø BˆJ¥ ÚŽ™™|Ð'NÄû÷ï_³f =xðàÎ;»³ÍÆÆÆž(­ƒ ž8q¢Ý’óçÏ›››#„ÌÍÍÛ=$ ¦ý[BB‹/ØlvCCƒ¹¹9ñH™ÀÀÀ¢¢"eee‹õîÝ;{{û™3gk={¶  @@@ ©©IKK‹œÒAç æ4mgòäÉÉÉÉxº­­íСCïß¿G577/[¶Œ¸OVqqñï¿ÿ. ÐÚÚÊb±jjjbccq“ŸŸ_aa!ñ”¤¹sçêééÛÿÞoSPPPmmmyy¹‡‡G||¼   ^Øá9-†“ö¤iÿfee…'Øl¶ƒƒñûïéé¹víZ;;»±cǶ¶¶:;;iš——÷ñãÇàÙ„„„gÏžõ}å “ M1&“yôèQeee<ibb"''‡g£££‹ŠŠðò=zäÈiÒ¤qãÆ…‡‡;999;;ÇÆÆ:::Šˆˆ ÉÈÈÌŸ?_QQ!TYYéïïßÔÔÄd2[[[8·¹zõêmÛ¶IJJ HHH˜ššÊÈÈ ®¿M>>>­­­øêúõë'OžÜáÛ!º¤¦!dkkKŒyû!K—.µ°°„œ Ïlݺ5---22rݺud׺îï¿ÿ^¾|ù‡üýý·lÙBv9àLLL6oÞl``Ð…u) œé€§ÁEEEÜñ#»Ð+ MàipgÁ£¶¶!Ä9À $¦ð4è›øñàÒÒÒdzŒB€W´µµ]¿~½íµ¶¶2Œ¿ÿþ!tõêÕ¦¦&¼·R(”€€ …BvÕ ³ð}z‡Nv! W@šÀ+h4Ú¡C‡nܸñuS^^^^^ç{{{ˆÒþßâ›#~Ái Ù½{·®®.›ÍÖÑÑ9r$Fàü·ªª*66V@@`ëÖ­d ~ÀçÏŸÄÅÅ%$$È®ô HSxˆ††ÆÒ¥K³²²”””>üõ ðÍzV¯^MÜ¢ô ¯_¿F7ŽìB@oQHðooo>>¾ØØØW¯^µkzûöí±cǨTª““¥®{ùò%Bß: H¦ð%%%##£ÖÖV__ßvMlnnÖ×ן0a¥®Ã£É&NœHv! ·@šÀs<<<RSSKJJˆ…_¾|Ásvv&¯4ÐE¥¥¥!â‰r`à4,JJJlmm]\\Ö¯_ß®ÉØØ˜”’À÷Œ;ÖÜÜœÉdz{{ £¢¢êêê,X ¦¦Fbm kpš*))‘]è-0 ‰þöÛoBBB,KJJêÓ§OÁÁÁÝÜf|||ttô7ŸeffÖ̓çîî~âĉ³gÏâ‡`766âAIÐ1íª««ËÊÊáLïiÊsJKKÏž=†gËËË{dËß{°¢¾¾~lô ;;»ƒzzz^¼x1>>þÇšššd—~؃Øl¶ªª*<@fƒ4å9ÉÉÉœç÷FÍÙ1=sæÌÍ›7étzSSÓܹsŒŒðòÀÀÀ¢¢"eeeüd{{û™3gMuuu………øyRÆÆÆÄ©ÂÇ¿}û¶¼¼<55õëJÂÂÂÞ¼yC¥R¥¤¤îÝ»§  €PÕKo´ãè蘔”téÒ¥ìììÐÐP„ï·îܹƒš6mÙ…€^iÊs˜L¦ˆˆçâìÐ… >}úDt[ãââÎ;·bÅ „§§çÚµkíììÆŽÛÚÚêììL¤)~p)ç“– øÑ8eÛ9~ü¸²²2þø¾páÂÅ‹zðm‚IHH899ùúú®]»¶¶¶VII ž~ØO „fÍšEv! Á($žÃb±¾×téÒ%bÖÆÆæÊ•+Äìøñãñ·ÙºÿœŠŸÝzzzð­sRØÚÚ>?{ÄÉÉ n%ص¶¶Q(HÓ Ò”çÐh´ÏŸ?“]à BBBÛ·oG;ÖÐÐìr@Wܽ{·±±QAAaذad×z¤)Ïqttܽ{wcc#ž}ÿþ½¥¥å—/_B ,ˆ'^™˜˜¸`Á‚^*cúôéùùùx:;;»²²²—v¸333?~ü¶mÛ¾7ˆ ð8ü{Ô{¿ª€GÀï'Ï1b„³³³··7Ng³Ùüüü!!!xìÁéÓ§[ZZfÏž/š"„üüü 222V¯^ýÏ?ÿܺu+ ÀËË 7577£6lØ0iÒ$¼–¯¯oKKKAAn'®¡®_¿>""ââÅ‹ c̘1<ò­ó={ö<|øì*úš¸¸øŸþ™••Ev!}ÍËËkŒÜÁiºxñb² ½‹‚²µµíÂÊK—.µ°°€‘ƒ‹‹ 1ú‰D†††ÊÊÊS§N%»Ðë"##=<<úûÇË›7oTTTDDDÊÊÊÈ.pcbb²yófƒ.¬K¡P o :VSSÃÇÇGvÿcêÔ©ÚÚÚdWz]zz:Ù%ô€ÌÌL„ТE‹ Ji =,22’Éd._¾\FF†ìZ@4€žTSSsüøq„ÐÖ­[É®ôHSèI õõõZZZp ÌAÒzL]]]TTBÈÙÙ™ìZ@Ÿ‚4€óùóçÙ³gÏ›7ìZ@Ÿ‚4€žQ[[‰òôô$»Ð× M gÖÖÖjkkÏ™3‡ìZ@_ƒ4€ðêÕ«ÄÄD>>¾½{÷’] ¤)ôww÷¶¶6SSSeee²k$€4`PÈÈȘ7ož‚‚ÂÌ™3·oßÎÙdnn>a² Ο?ñâEIIÉ]»v‘] <߀Žikkÿ÷ßxZHHhΜ9þþþÒÒÒÝÙæ£G6nÜxùòeqqñvM‘‘‘=¢R©ŠŠŠ­­­óæÍsuuíò¾ÊË˽¼¼TUU/^üúõë»wïr¶jjjŽ1¢Ë---;wîDíÞ½{ذad—Èi @ÇœœœrrròòòŒùùù333œœRSS»³ÍwïÞUWW×ÖÖ¶KÓÌÌLWW×#F¶µµ]»víÇ£Gîξþý÷_‹:vìØ¯[mllº³q°sçÎÊÊJ555KKK²k¤4 cË—/ÊËËÛ´iÓ¨Q£&MšäããS]]-))Éb±ÒÒÒÞ¾};iÒ¤mÛ¶éêê+¦¤¤$''ÿ÷ßL&SVVVKK QY²dÉóçÏBZZZ! …²mÛ6‡¦¦&__ßéÓ§'%% !„µ´´èt:Bè{ûZ°`Ayy¹¶¶vQQQss³ªªªŸŸŸ’’®AGGçÕ«W¡… "„øøøŽ;6kÖ,„PVV–³³3“ÉD]½zuÔ¨QDåþùgtttYY™´´ô¸qãnß¾=jÔ¨«W¯öÁÑî_nݺuüøq:~äÈ …Bv9€4pÝ€VWWG¡PøøøB¾¾¾ÁÁÁãÆ377§R©›7oÎÈÈÀ/+))ñóó“––677722jll,//ÇMÖÖÖ‹/F™ššÚÙÙÙÙÙÍŸ?!tïÞ½ÚÚZGGG¥!aaácÇŽ¹¹¹qÙ^÷úõëZZZëÖ­«¬¬´¶¶Æ‰²±±i·/yyyܤªªjoo[9;wÎÉɉÉdš™™3æöíÛ!##£^;¢ýUMM›ÍvwwWTT$»@&è›ðŽ9Â`0233çÏŸ/&&öæÍ›ôôtkkk|ÙŒÉdZYY…††òññ566"„Øl6NWUUÕ××'NêIHHäææÚÚÚröëêêB#GŽäÜ)#Êe_sæÌIMMMJJÂ=NUUUWW×·oßâ-2äë}!„Fåì윟ŸŸ››Ë¹<**JIIé÷ß@¹ººž;wnåÊ•=~<û;''§ŠŠ uuuGGG²k$ƒ¾)?à·ß~ËÌÌÔÒÒ C={öŒÍfâV>>¾åË—üøñÓ§O! ++«’’’˜˜gggkkëÂÂBîÛDÕÖÖ~ÝÄ}_!âÚ*>-LôM»à¿ÿþ›;w.ŽR„¶¶v—75€¥¦¦ž={VLL,11‘Ÿz&ƒ¤)?àêÕ«¥¥¥GŽÁ½Ì1cÆ „.]º„[ÙlöåË—EEE¥¤¤B/^¼——¿ÿ~nnn||¼––VHHHuu5çÙl6笺ººPtt4ƒÁ úøø„‡‡sßWÏ3fÌ7ZZZðìÅ‹{|ýÝ£GÜÝÝBQQQãÆ#»@>ø{ €Ž]¸p!;;!tôèQ999*•Š’——×ÓÓ ½{÷îO?ýT\\üøñãíÛ·Óh4„P~~~HHHVV–‚‚BKK˳gÏDEEqÇ!4|øp„§§§’’ÒÛ·o víÚåãããáá±hÑ¢¹sç Þ½{÷Ñ£GÆÆÆ\öuåÊ„PbbâºuëdeeóóóB999vvv¡ãÇáâÅÄÄètº¹¹¹¤¤$BèäÉ“åååxŒÒÑ£GÅÅÅõõõ·lÙâêêj``0wîÜ’’’;wîpÐyXMM±±qss³¥¥¥Ùåži @ÇÂÂÂ^¿~:qâÄ!CÌÌÌ„……qShhè¤I“NŸ>}ëÖ­Ÿ~ú)88xÕªU¸IVVVFFæöíÛ7oÞÕÐÐpss#†©ªªº»»'%%7ÎÐÐpãÆ!###YYÙ£Gfff¶¶¶Ž5ÊÎÎnË–-\ö…O §¤¤ÈÈÈèèèäåå!„222ˆ4Å_–=qâBH@@`Ö¬Y3fÌ@ÅÅÅá÷E´ª««ëëë¯X±‚J¥FGGŸ8qbĈºººx›!Ä`0,,,ªªªÔÕÕ÷íÛGv9€WPB¶¶¶±±±]XyéÒ¥K–,ééªø6CCC¸Œ×ÇÒÒÒ|||Š‹‹{ã¬ò÷ØØØØÚÚòàÇ‹««kbbâ°aî\¹"''Gv9 Ç˜˜˜lÞ¼¹k'( ôMßPQQ‘‘‘Á`0êëëÏž=«¡¡Ñ—Qʳ¢¢¢étzzz:D)ài ø†û÷ïÇÄÄ0™L!!¡ùóçûúú’]ù222víÚE¡PŽ;6}út²Ë¼Òð 0¾†ÓÅ‹íííÙlv`` ž¤ƒoÈ@®^½º~ýz‹åèè¸iÓ&²Ë¼ú¦ÀÍÍ›7׬YÓÖÖfccãããCv9€GAß¾+//ÏÈȨ­­míÚµÁÁÁp_{ð=¦ðmYYY¦¦¦---VVVQQQ¥€ HSø†#GŽ˜™™1™L‡à»_ð=pÝþ6›íêêš””D¡PaØè HSøÿjjj¬¬¬.]ºD§Ó£¢¢ˆûDÀ¤)ü>,[¶ìùóçC‡MOOÇw3 3àJ „Ðo¿ý¦¦¦öüùó)S¦\¹r¢üHSÀ`×ÜܼuëV{{ûÆÆF##£ÜÜ\âÑëtœé jEEEööö/_¾ua;Ÿ? UUUuww¯¬¬”••ŒŒÌÉÉùùçŸ{ºd Màml6!4¨ž†ÿ€X¸páªU«š››#""ÔÕÕƒ‚‚jkk;¹…/^ØÙÙMœ8Ñßßÿýû÷***)))OŸ>]·n]o5HSxÚ ì›â·Ó‹¿ý9mÚ´ .x{{_½zÕ××7::ÚÅÅÅÒÒ’N§ã×777Ÿ?þâÅ‹§OŸÆ‡KRRÒÄÄÄÊÊJ^^¾‹ƒ¤)< wÔÞ¾}OJDB/˜;ùo‡!¦‹ŠŠÐÿ¦)6gΜ+W®\¼xÑÛÛ»°°pçΑ‘‘–––ÂÂÂ7oÞÌÉÉÁ!ÊÇÇ·páBsss}}ýA5n ðHSxÎ 333ƒÁd2‰±vK˜Lf‡Ó ƒÅbu8ÍäÐ÷oüë“Û::::::™™™kÖ¬©¨¨ð÷÷'^©©©illlddDtXèc¦ð4œdcÆŒ±¶¶&«î!Ýɹ§;çòüõ×__ß篵µ555uß¾}---!*•:uêÔM›6­\¹’F£‘qløÿ Mài¤éŧdûr‡n—¦MMM øï¿ÿBÒÒÒÖÖÖŽŽŽ‚‚‚}Y\@šÀÓáÝ8G!ÕÕÕÅÄÄ„……UUU!„”””\\\~ýõ×A5Èô ¦ð´Aø œ¦uuu{öì9tèÐçÏŸBêêê...zzzðEÀ› Mà!¯_¿¦þ/>>¾ŠŠ „ÐÝ»w·nÝJ,Äÿúøø ‘]rÏÃ@DDDàÙY³f¹¹¹ikk“Z€4€‡¨¨¨ÄÄÄ|½üõëׯ_¿æ\¢­­= £ýoß!´`Á77·Ù³g“[i Y³fÍþýûÿûï?[[[&“Éb±8ÿ­©©qss£P(^^^dÛ[˜L¦žžž«««ºº:ÙµÐY¦ðæììììì\XXóõ5B777„ÐâÅ‹§M›FF}aÇŽµÛ °A4P€~ÁÄÄdäÈ‘>ÌÌÌl×ôöíÛèèh …âééIJm}¢ôG¦ð:îèèˆ"îõC ljj200˜2e ¥¾ Òžcnn.##sçÎììlbayyy\\•Jõðð ±6À7AšÀsÐÿížúûû·´´***’WàÛ MàE6l:tè­[·._¾Œ*++KJJâççß¹s'Ù¥¾Ò^$,,¼yóf„ÐÞ½{ñ¿mmmkÖ¬vÀ› MàQ666’’’W¯^MLLLMM¥Ñhîîîdø6HSx”˜˜˜BÈÆÆ†Á`˜ššŽ7Žì¢ßi ï²··c±Xt::¦ð2HSx—¤¤$~H¸¹¹¹œœÙå¾ Òž¶yóæ¡C‡ººº’]€îÓuøðá¾ß/ý›Íž7oÙUÐo888lÙ²¥wJBšÖ××XYYõý® l uuu}¿_rž!#,,,##CÊ® `¤ì®›Ýi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)Ð]¦@wAšÝi t¤)`àËÍÍ]¸paw¶ ©©9a„ׯ_sy¹¹ù„ Ú-ÌÊÊRPP˜0a÷Õûí7ü²ŠŠŠîÔÒéÕ IDATù½2¸[¶lÙÆY,V7w=˜Aš86›:lذvËKKKùå—ÆÆÆvË LLL&Ož}úòåË t¸#›ýû÷·[8jÔ(—+Vp_W^^~ùò圛²¶¶ÖÖÖF­^½zãÆãÆë°.e „Þ½{W]]ýÍ4õòò‰‰‰éä.À×øÉ.`º{÷î¹sçèt:›Í–øòåËîÝ»{i_žžž½´ñÁæùóç#GŽä\ò½Ãëææ¶k×®¾ªëÿppp k×ýWvv6NÇÉô56›ML755ùúúNŸ>=))IHH!ÔØØ¨¥¥E§Óñ BBBîܹSSS3uêT___¼<++ËÙÙ™Éd"„®^½:jÔ¨ÎÆb±Ž=zòäɪª*yyy%%%¢ÉØØ!”““sùòe{{û±cÇâå ,(//×ÖÖ.**jnnVUUõóó#VäRÆ’%Kž?ŽÒÒÒBQ(”mÛ¶988àÖ¡C‡'&&>xð@MM­3Ńv oÚÞ={–½gÏ///oooCCò²²ÞÛ]SSSïm|°9yò$þ#Àáîܹ£¨¨ˆÓ‘»{÷îÕÖÖ:::/>v옛›žÍÉÉ™6mÚÚµk_¾|ikk‹s !¤ªªjoo¿xñâ*ÌÏÏ/$$dܸqfffüüügÏžíp•ùóç#„®_¿®¥¥µnݺÊÊJkkëΔamm—›ššÚÙÙÙÙÙáMpkQQѽ@€¾i;uꔋ‹ 1+''Gô$:TWW÷æÍGGÇÔÔTAAA„··7BˆÁ`ÄÆÆâ3NÍÍÍ‹-âü;:--íÕ«Wl6»¡¡ÁØØ˜øË1$$äÞ½{ÄÉÉ™3g×f¸oð›ÂÂÂþþûïiÓ¦•••IHH0ŒiÓ¦tX>>xyÿ”¯\¹òéÓ'ü'®óÅ‹ À‰ÉdR©ÿç<œMeeeYYY~~¾‰‰‰¸¸8•J={öÛ·oBß¼²ˆM™2Oà_ó¶¶¶.WõÏ?ÿ°Ùlb¸•J]±bE‡iŠ=OàSÐDß´;ðÿÕÙÔàiÚÃ:b>räȯ/Ååççs…`0øs–Éd&''¿~ýšF£Q(”÷ïßw¦ .äbìØ±k×®%f×­[·k×.ÎÙ7‹¿qãÆž={ˆY333///œ¦W®\  šDEECBB:¬pÍš5ÎÎ΢¢¢Ã‡Ÿ:uª¥¥%ñ2.M]Û öåË …"%%Åýøp?~<¾fF£ÑpžqêÁŸòÕ«WýüüˆÙuëÖýõ×_ Àiøðáí†á¿]rrròóó­­­‰«’#FŒŠŽŽŽˆˆàçÿŸG)))EEÅž­jĈ¡;wîLœ8/)..îÙ]|çubNøÛ;íúå ó M{F«®®–””äò‚¯6ì{} ƒjiimذÏvr — rñõ¯Y»?¾Y<_ÿmA¡Pð— ùå—_~ù…Åb}øðáÖ­[ÄX .M]Û –ššJt {Dßü”;|_SWW¿ví“Éüúïžv$$$|||<<<-Z4wî\AAÁ»wï>zôÈØØçqRR’™™“ÉüóÏ?B™™™Û¶mC>~èСRRR¸óš˜˜¸nÝ:YYÙüü|„PNNŽ÷2BÇGyzz*))½}û¶°°ÐÀÀ€øÏvõêU„ÐÌ™3{ôØ"0 ©‡ÙÚÚîÛ·½òñãÇ­[·VWWs_kêÔ©§OŸþfÓlj>å?ÿüƒÏD¿Ùæ²A.Þ½{wòäIb6%%¥ÝÕ¦oÂrˆÙ´´4MMM<=mÚ´S§NM555gΜé°Â°°0„•J>|ø²eË>}úÔ™¦®m!ÔÐÐP[[Kœ€åô½ÃÛ5]û)ÏŸ?ÿĉÄlZZÑÊý}‚®®nMMÍ×=?YYYIIÉvç$ŒŒŒŽ;6f̘ÌÌÌÔÔÔºº:;;;///|J_þ¸|ù2¾0IŒŠ‹‹‹Å Oœ8süøqÎ&{ééé111)))¸)**ÊÒÒòþýûø´?>Û‘–––““säÈ‘˜˜b­£Gâ<.,,D¥¤¤äççWVVæåå!„222:,!¤ªªêîîþï¿ÿ&''ÿûᅥ††8ƒB­­­iii£Gž>}zÏôÁ‡‚²µµíÂÊK—.µ°°Àçô:/88¸¡¡_^^½z•˜˜( Àf³ùøøìíí‡ ‚ nkk+,,ÄýçŽØlöñãÇŸ={&"""(((--={öl|þçÁƒ¿ýö›Pss³„„ăTTT¶lÙ‚»¿W¯^ÍÎΧÓébbb«V­’––æ¾A.üýýîÝ»'**ÚÚÚúóÏ?ëééá&.Å#„233‹ŠŠ[ZZf̘Á9 )55õáÇt:}Ĉk×®Åý6.nß¾}ĈMMM,«µµÕÖÖ–¸JÄ¥©kD%&&Ο?Ÿ¸¼Íé{‡7,,ìÒ¥K›6mÒ××?þ|LLÌÂ… ñè³Þø)geeóóó×××+**Þ¸qCEEÅÉɉûûãÿ±wæq1~ïÿ?Ó¾¯*)²YÚlQ*Ê’¢ÐiáMè-{Öh¡RDBÙ*Q‘¨’¥Ð"!mҾʹÌòûãþ}zôõÖ}ßÍÜÓ,îç_šûš3WãչιÎ9×!Ìœ9388˜Õ¾°)ÁÁÁÁÁÁÇ·²²bµ/ŒrîÜ9‘Ý»wõ666îîîý[/‡J»áÑâðáÃtä‡9cÇŽùùù±Ú æsöìÙ÷ïß³Ú6eæÌ™&L¸qãÆoÛµ8VES|Ýço¥7nD<$ö7“˜˜(##á”…àßÎÿçäÉ“¯^½ €6#ààp<<7Åùÿìܹsçάö‡#Áç¦888888Œ‚GSFÁ£)£àчQðhŠƒƒƒƒƒÃ(x4ÅÁÁÁÁÁa<šâààààà0 Mqppppp¦888888Œ‚GSFaMeÁ§OŸ644°ä£qpØ‡æææ––™ß®ØÄÁÁ¡›?ö_%9œ° š.Y²däÈ‘Ãÿ¹88ìFjjêëׯÍÌÌæÌ™Ãj_p¸“oß¾ýüùsìØ±ŠŠŠ¬öe˜˜3gŽ––Öð. ¢©¶¶¶¶¶öðîðSSSóëׯ±cÇâ3œ?RSS“žž®££cooÏj_p¸“ÿý7>>þàÁƒ¸Æ˜ ¾nÊDüüüŒŒŒž?ÎjGpØ*• À/•Äa]]]QQQV;ÂýàÆLDXX@$Yí›B£ÑÕŽàp-x46ðhÊD hÚÝÝÍjGpØ|nŠÃlðh:làÆLŸ›âÀƒGSfÓÙÙ cµ#ÜþgÌDð¹)7Åa6x46ðhÊD„„„Mq¦8̦Ãk* þ%àë¦8ðàÑC***š››Eÿ‡˜˜˜¾ iØÀ£)Á×MqàÁ×Mq0¤¶¶ÖÒÒrà+±éë닉‰‰ÀÚÚÚÐÐEžr'x4e"øÜ|nŠƒ!úúú>|ìììì_fª¨¨h)!!À¹|PÌD h º§§§­­íçÏŸß¾}+..nmmeµw8¬Ÿ›â`‹»»;`ܸq¿~ý"‰T*µµµµººº´´´   33SBBàãã3bÄV;ËmàsS̸páBNN‰D"‘HÝÝÝD"±­­ ðüùsh!$$ôáÃÖyŠÃˆDâŒ3ZZZ@àáá!½½½€ÿý÷رc„ÿÁÃÃ3iÒ¤ÄÄDV»ŒÃy¬Zµ*  °°033ÓÈȈ@ HJJJJJBO£££ÛÛÛÇŒãêêÊZ?¹|PŒÓ§OOMM}öìÙ«W¯ ËËËýú P(4MPPPJJŠ`ccƒ ÿ6DDDœ{zzº»»I$RWWWgg'M‰DbSSScccCCï_¿~þü¹eËVû‹Ã‘899‚‚‚~{ÔÙÙéïïØ¿¿   œãvðhŠºººË–-,Z´èÍ›7ÅÅÅß¿¯¯¯ïèè R©ÝÝÝ¥¥¥|||<<<¬v‡8::Bwó=|ø°£££½½½µµµ¹¹¹©© Š£ÐR–††$$:pppzøðaYYÙÀ×Ož>¾¬¬,‘É“'«¨¨ÈËË‹‰‰AÛLBCC»»»ÍÍÍ'L˜ÀjOqX€¸¸¸››àÔ©Sbbbâââ’’’ÒÒÒ222#FŒ‹ŒŒì޽ߗ„C7²²²k×®¥R©çÎ뱦¦æÔ©SáÈ‘#¸º˜M±DUUuãÆd2y÷îÝ¿=êêêºpá`Û¶m¬p ‡-pqq‘””ÌÌÌÌÍÍýíQDDDmm­¶¶¶™™K|ÃáÜÝÝ •+Wššš WöîÝK$---gÏžÍZ߸<šbÌîÝ»EEE“’’rrr¾~ùò妦¦Y³fájþ›‘pqq«ÝÁá0ÚÛÛKKKËËË¡HYSSSSSÓÒÒB"‘äååÿ•Jݲe …BŠYvvvJIIÉÉÉ)((Œ;vܸqãÆ›½}ûöáÇ$‘HæææzzzÖÖÖØý6Ü Mé§½½½¬¬ìóçÏeeePšZ™ ‰Ì´‰D(Ó"!!!//¯   ¢¢ÒŸi™8q"žiá&å! $$„ËçÞ½{711±··wÑ¢E6l cÒÇñððhhhhhhØÛÛ¾~ýúâÅ‹gÏžùøøÌ™3ÇÈÈÈÉÉ qÖû—ƒGÓ!@¡PÞ½{—••eZššš&L˜0aÂ555}}}EEÅQ£FIII!j®¥¥¥¡¡¡±±ñÇ•••oÞ¼)))ùþýû´iÓú3-S¦Lž_ +pyà0NMMM||üõëשTª™™YXXK’®ãÇ?~<àÈ‘#IIIÏŸ?Ÿ0a‚¾¾¾±±ñæÍ›yyy‡ß%ö‡pvvŽˆˆ ãÍfffööö¦¦¦X{Å^|þüùÉ“'©©©yyyP¦eâĉS§N7n†Ó*•Z\\üæÍ›Â‚‚‚®®®þL ~!;ƒË‡qh4ZVVVDDÄ«W¯ÌÌ̬¬¬´´´XíÔÿL&ß»w/99ùãÇžžž®®®Ì›(³ www :ÞK ð¹é |øðÊ´H$###[[Ûàà`qqq&}Ï´iÓ¦M›ýøýû÷/^dggûúúêêê9;;ã™ö—&ôõõ%$$ lذáäÉ“ìy0ÏÚÚÚÚÚºµµ5**jÒ¤IK–,ñòòÒÔÔdµkì>7ýºººøøø¸¸¸¾¾>33333³©S§²Ð …’”””———––6oÞ>þÒ¥KS¦LÙ½{÷Œ3Xí087Åwþ L‹­­­žž^YYÙ±cÇž}z]]??¿ƒƒCNN™Lž2eJTT…Baµ,à黎‰‰šššÏž=‹‰‰¹zõª®®.«=BBBööö‹-rtt\µjUEE«â¸F‹/ÆåÁr¨TjttôôéÓUUUŸ>¾‹/Nš4‰Õî0ÊÚµk­¬¬®_¿njjjkk»k×.öŸ?±3/^¼Ø½{7///wÈcÍš5«V­ºqã.VñãÇ777"‘xïÞ=eeeV»34¾~ýš•••ŸŸßÓÓ½())9oÞzôHVV–Õî @£ÑÊÊÊrrr²²²Þ¼yÓ××½.++;þ|CCÃùóçËÈÈ oPRRZ%144 ¥ïØ gñWDÓêêjww÷¶¶¶Û·o3†Õî oß¾õgZº»»¡%$$ú3- íÇõêÕ»wïš™™ùøø¸¹¹ý=™úàydgg¿zõ —ûÐÔÔdnn®©©yûömSë}}}OŸ>%‘HË—/ÇʽߠP(Ë–-+//‡~äáá9räÂ… ­­­§M›F÷à’@ ØÛÛëêê:88äææ:tˆ»/-çþê ÷ïßß¶m›³³3j'‰/_¾ÌÊÊÊÎήªª‚^äáá™:uª¶¶6âïÒÞÞîååÕÑÑ•ÜÄù/¸//oëÖ­ÃJ!ÔÔÔîÝ»·lÙ²®®®'Nôõõ=yòäâÅ‹ , Ñh÷îÝÓ××wssûøñ#¯\¹2**jÆ iii˜{Îr¸pÝ4&&æèÑ£!!!3gΤ¯…žž(ÓÒÖÖ½¢©© ý²Ì¼§¤¤ìÙ³‡H$JII Ö××C¯+++ÛÚÚ®Y³†¾L ÄåË—cccããã9"±É$8]{÷îíêêÂåÁVôôô888ttt\¼xq¨ ‘H7nÜ R©aݺužžžrrrLr=qqqGŽéííÕÔÔ QRRª©©‰ŒŒ¼}ûvOO@055õññ7nÜP[þðდ“ÓéÓ§---™á9Ý0¸nÊUÑ”F£íß¿?)))..NQQ‘Žêêꢢ¢H$@NNnݺuVVVÃyPìëׯååå"""Ð^Ó”””ºº:¥¥¥Ï¨Q£èküþýûþþþׯ_×××ÇÔk38ê IDATyDGGÇÇdz‰<ÜÜÜÚÛÛqy°2™lee%..~úôé¡®k>xð  ¥¥…‡‡ÇÌÌlûöílµ#ìÇÛ¶m«®®–’’:uêÔ‚ $)22òÂ… d2™@ ¬^½zß¾}CÝ[ôíÛ7›cÇŽ­^½š)®ÓƒÑ”0cÆ úÞ§­­­ªªJÇ{1‡J¥ÚÛÛ—––^»vmĈC}û¯_¿Nž<¹k×®·oß’ÉäyóæíÞ½ûèÑ£sæÌ‘`†Ãƒ!--meeUWW÷áǼ¼¼I“&]¼xqÆŒ•••%%%111?~TQQ¡#¡4iÒ$]]]GGÇ &Lœ8‘þ³'XÉãÍ›7ì#/^àò`-}}}6l9{öìö„×ÔÔlÛ¶-22²»»[[[;,,ÌÁÁAZZšy®Ò‚‚ÂÊ•+ËËËKKKSRRz{{uuuæÌ™³víÚ®®®’’’?Þ¸qCIIiH‚‘––^°`Á¶mÛTUUÙgSÒ;wfÍšE_Ù–pI4íííÝ´iSccãåË—‡:Jêîî>rätΚJ¥®[·.""ÂÎÎNUU•UGñøùùMLLäååsssß¿ŸmgggkkkeeE¡PÊÊÊÊËËJKKÕÕÕ‡t¤ ¨¨8oÞ<%%¥É“'3éW`+py ç/”ÝÐh´Í›7÷õõ 5”FGG»ºº~ÿþ]XXØÏÏïÈ‘#ôíë„„„,,,„„„^¾|™ŸŸ_PP ¯¯/*****jdddllüùóçoß¾¥¥¥Ι3GLL eË222 .Ü´iÓ´iÓØdFŽGS@¡PÖ­[ê¢EjjªƒƒÃË—/¦¦¦aaa«W¯F/¦2mÚ´… æææ–——ß»wOUUUKKËÐÐpóæÍoÞ¼)//‹‹«©©™;wî~q999cccWW×#Fhhh0ïW`pyàò`»víúþý{dd$úo[[›··÷•+W¨TêÒ¥KcbbæÎËæ4ÂÌ™3uuu³³³?þœœœ¬©© í1bÄêÕ«edd^½zõåË—ëׯ;ý\SZZzöìÙÎÎΆ††ì0žøÛ£)™Lvppàáá Òð°¶¶vûöíááá$ISS3,,lóæÍCÈ399¹•+W~ýúµ¸¸øÁƒ$ êgÏžmccC$KJJ>}útãÆ EEÅ!‰@JJÊÈÈÈËËKEE…s Ò"ˆ<¼¼¼.\¸€Ëƒ‹åÁ!!!<¸|ù2úë<«ªª¬¬¬ ÅÄÄBCCÝÝÝ9è%%¥åË—úôéóçω‰‰£Gîß­¦©©immýýû÷òòòÔÔÔÚÚÚyóæ¡,{4räÈ©S§:99YXXHII1ó7@†ÁhÊÙ'dh4š³³3‘H ÒøîòåË‹/ÎÎÎÚ·oß;wØöRe ‰óçÏûùùA·šØÙÙýúõ ++{ðàÁû÷ïëêê¶µµùøø888ÔÖÖ¢oyüøñ×®]Û¾};WîVÿ“GWW}òÈÊÊÂåÁÅò`„ÔÔÔ .ÄÅʼn‹‹£|˽{÷LMMëêê´´´>|hddÄT™œœÜ•+WÜÜÜ¿• ‘““‹ˆˆ8}ú´  àíÛ·W­ZÕÜÜŒ²Y==½­[·®]»ªVÁ¹pv4õ÷÷¯©© G_þ±½½}ëÖ­ÐÎoSSÓgÏž988°¦eË–-×®]SPPxýúµ¥¥å‹/ Gjjjqqq~þü¹±±ñÕ«WÑ·þ,!!qîÜ9ôÇð;VZZšœœÌ‰·{—“äQRRrÿþ}N—#ÄÄÄ\¼xñÖ­[‚‚‚ˆÆÝÝÝ...¹¹¹²²²W®\Á°ÂTuuujjjffæû÷ï MLLæÏŸ?}út4^ý—ššš‚‚‚¢¢¢[·n•––.Z´ÈÒÒráÂ…ŒÿÄÇÇÿûï¿ ÅÆÆæÐ¡ChÞòöí[OOÏììl–Tƒúë¢iOOžžž³³3Ê" eÏž=wîÜáããû÷ßׯ_Ï$ǨTê—/_ þüYYYI"‘ dKooo¦E^^^ZZZRRRUUUEEEQQóL t;JZZÏ‘#G¬­­Ñ¼‹B¡lÚ´iΜ9þþþØú3œàò@äo–#TTT,^¼øîÝ»h.Á¥R©›6mÊÍÍ•““»ví&Ir*•šššzóæÍwïÞA7º,Z´Û‘ßÏŸ?“““oÞ¼ùüùs33³­[·2xôÑ£G^^^½½½ööö(•súôéÒÒÒ;wî ÿ~…¿.šº¸¸Ž=ŠÆ˜B¡8::æää ‡……`ëLkkk¦åóçϪªªÓ¦MSQQéÏ´HII‰‰‰ Ì´ÔÖÖ666677}ùò¥®®®¢¢bΜ9P¦EKK “±?F;wî\XXFÛºu«——šw577¯X±âüù󆆆ŒûÀpy á¯•ÝP(”%K–XXXôß=oìé陞žŽU(mhh¸víÚ7ôõõííí-,,˜w5D}}ýåË—CCC555MMMÍÌÌè^NNŽ‹‹Koo¯ƒƒÃ¾}ûí©TêÊ•+7nÜHß'ÒÍßMãââBBBP^gßÓÓãîîž••%--}åÊ•)S¦`åFMMMZZZffæÛ·o ú3-èOž „H$fdd@™–’’###(ÓÂx õ»wïúùùQ(kkë£G¢ë¹ººfggÓw¥k¡ORRRW¯^ÅåÁõò`„àààû÷ï߸qÍ·´ÿþ¸¸8 ‰„„ã777_¸p!11ÑÆÆÆ××w˜kA—ÆìÝ»·½½}çÎË–-£o¾øìÙ377·¾¾¾;v¸ºº"Ú———ÛÙÙeggóæç¿(š~ÿþ}áÂ…·nÝBsk•JuttÌÎΖ••Ťè(•JMKK‹óæµµõâÅ‹±Í´üúõ Ê´dgg/Y²dóæÍšššŒ4øäÉ“íÛ·wwwÛÚÚ ùc y÷î]bb"›Ÿ ù¡ÊÃÉÉ)++‹yòX½zµ±±1§Ècýúõàby0Bee¥‘‘ÑÝ»wÑ\opùòå#GŽ ÅÄÄÐ}O€L&‡„„\¹reÓ¦M{÷îeíð%33sß¾}ííí~~~sæÌ¡£…¬¬,'''vâĉ•+W"ÚŸ?¾   ))‰ŽÏ¢£)Çl( R©nnn(ûJ CiSSSpp°žžÞãǽ½½ÛÛÛ/]ºdff†ùvyyyGGÇŒŒŒêêjOOÏU«V¥¤¤Ð} kÑ¢E‘‘‘BBBqqq(7"zxx´¶¶^ºt‰¾Od tÈÃPúGy˜››s<®_¿ÎÅò`ooo'''4¡477700@ „……1JŸ={fjjZ__ÿñãÇàà`–gŒŒŒòòòöíÛ·mÛ¶ÖÖÖ¡¶`hhèïïO£Ñüüü>|ø€hïìì\[[ûðáCºüe M#"" KÑ9r$%%ELLìêÕ« ö•­­­ÇŽ355íééyñâErr²••Õ0ìù”——ß¹sç?""" ’““é»ZOOïÂ… ‚‚‚±±±!!!ˆö<<<§N:vìXUUÇè“Ç•+WpyÐ-?~ÐñqÇÇkjj-kjjœ)Ї‡ÝKËÛ·o?räÈ•+Wnݺ5ØÞl–°zõêÒÒR“”””¡¾}Æ NNNd2yË–-ˆe¹øøøöïßïççÝ~ÈpF4­®®>uêÔÉ“'Ñ$—bcc¯\¹" ÎH‰Q …rîÜ9CCCAAÁOŸ>…‡‡Eb°råÊâââ›7oÞ¹sÇÒÒ}y‘èëëGFFòòòž;wîÖ­[ˆöãÇß²e šv€ny0rh[å‘€hɪ0ÇÝôööîÛ·oïÞ½ˆÒ¢P(^^^ЖòíÛ·Ó÷qoÞ¼155;vì§OŸ0߇ ‚‚‚GŽyýúuTT”§§gGGÇÞ¾cǃææf777 …oÐËãÕ«W¸<þH¿<üýý¹LŒ5a„yóæ!Z½{÷nÔ¨Q!!!t¬(Óh´¨¨¨Í›7_½z544”Í«á?¾  `ܸq¦¦¦¥¥¥èßÈËˬ¬¬üéÓ'è/ž;w†‡‡7440àìðÁÑ4##ãÛ·oÐÉxêêêÉd²‹‹ ÝE¥;;;}}}¢££ïÝ»‡fnØX¹reII‰®®î’%KèèÈÖ­[ «««áyyyöîÝÛÕÕE¯¿ÃAFFÆ×¯_QÊcË–-¸<ƒ+åÁgϞݱc¢åÛ·o¡Éý™3gЗßêš×fdd”––š˜˜Ðåìp#((nkk›žžŽþbbbaaaüüü±±±™™™ðÆÊÊÊ+V¬8~ü8cÎìMûúúöìÙãçç‡xÚ‰B¡x{{wwwëêêúúúÒ÷qïß¿_²dÉÈ‘#?}úôßÂl쀀€À ®^½êááÑÖÖ6¤·{{{µ¶¶ººº"fZfΜ9kÖ¬³gÏ2à/sä±gϞᔇ‚‚.ÀÌ™3gϞĀ¿lÍùóçõõõø===~~~T*ÕÙÙ™ŽGmmmëׯ{ùò%šNlÅŠ+ž>}zìØ±!ݦ0uêÔ;wÒh´þùQ¢·oßFÞ±ìM/_¾èèè”””ܹsçÔ©Sèßµyóæ9sæ´¶¶îß¿ÞRRRÒÆÆæÌ™3Œ¹9°u4%‰gΜٻw/¢eQQÑùóç¡L …¹)Н¯ïÇ?}údnnN—³Ã€€ÀÙ³g£¢¢6lØðàÁôo ¼qãt© ŠŠŠkÖ¬9vìcÎ2:äqúôi\ðp<$**ÊÈÈq²XYYE Ž?>Ôz¿~ý²³³Û·o߉'8ú𮘘XVVÖ«W¯Pã… NIIAÜ:çäätûömö´±u4ˆˆ˜5kâÆË¾¾>¨¤ËæÍ›uuu‡ú)ííí7näããËÏÏg«ýèh°°°ÈÉÉ9}úôåË—Ñ¿K]]}÷îÝ???Ä£c®®®IIIß¿gÄOf@‡<èØyÄéòxþüùß)Fèéé uvvF´„®Âµ²²ÒÒÒÒG477ÛÙÙ¹¸¸ Yògdeeóòò>|ø€~©¬¬ ­IïÙ³§»»ÆRRRÒÊÊ*<<G™ ûFS"‘âííh^VV6nÜ8:6¦744¬X±bîܹ Ì.}É$455‹‹‹SRRÑŸ8ܰaüyóÚÚÚçvâââ7n<}ú4Þb .”hhh0[öööì&¹}û¶¦¦&â}ùùù™™™âââhv* „D"9::ÚÙÙ±ð.OÌJOOÏÈȸrå Ê·ØÙÙ©««WWWC78ÁàààËæ[ÞØ7šÆÄÄèéé!Îjjj ²ˆC­ƒÚØØ¸a×   ޾gJTTôéÓ§………hÖºú KOOÏÊÊ‚·Ü¼ysrr2[mÀåfËcÓ¦Mì&‰ŒŒÜ°a¢´×ÔÍÍ ýM±*•ºcÇèH71bĈçÏŸGGG#j‚——÷ßÿ„††þúõ ÆRYYYWW7>>G™›ö½½½gÏžES=àÈ‘#ÝÝÝË—/Ÿ1cÆ>¢µµuÆ 7nܳg½n²ÒÒÒ999Ÿ?F¿›\QQñŸþìÛ·¾àˆ¸¸øÚµk/\¸€£X€^GÅåþ2y0Èëׯ;::/¬ÎÌÌ,,,”““CwröìÙööö‹/2à#û"''—˜˜¸k×®ŠŠ 4ö³gÏ655íëëC¬Ò`cc3¤‹á‡M£iRRÒ¤I“&Ož oöæÍ›G‰ˆˆ 5aÒÝÝíäädddÄM—5 ¦¥¥åææ"¦MúY·n††F]]âšÄÆoܸ1ÔÒ'L½<ÒÓÓé–ÇÂ… ¹RQQQ(ß¡ò`ØØØ5kÖ f# £A®®®Cª´“““œœœ””Äé7ÒÃ0kÖ¬“'Oº¹¹õöö¢±÷ññáåå½uëVMM ŒÙܹs;;;ß¾}‹‘›ØÃ¦Ñ4""͈ïäÉ“yyyôCçœÔÕÕ¹f4ÝŒŒLvvvllì“'OÐØóððøûû„ˆˆˆºº:KEEÅùóçÇÅÅaä)C0[»víRWWgÿ]C’ǵk׸[Œ@"‘îß¿¿bÅ x³×¯_—””ÈÈȬ]»}ã ÞÞÞׯ_—““cÌMvÇÁÁA__å= ãÇ·´´ìëë ƒ1#ÖÖÖ×®]ÃÈGìaÇhZRRòë×/ÄC„999ÒÒÒ(k÷ÚÐÐÃÑ»ÒCVV6))iïÞ½Ÿ?Fc?}úô¥K—’Éäàà`xËõë׳C¦eäñë×/\Ó§O_¶lɃARRRttt£”§Ý°aÃãýýý===õõõr‘C yõêÊT///žÄÄDø"‚Ë–-KNNîëëÃÈGŒaÇhemmx–ʳ»¸¸ é(}^^Þ­[·’““¿l™m™>}úÙ³gÝÜÜzzzÐØ{{{óòòÞ½{·²²ÆlæÌ™T*õåË—¹I'¸<d¨òðòòâ y0ÈÝ»w—-[oSSSóìÙ3AAA{{{ô-ß¿ÿçÏŸhŽGsâââ7oÞÜ»wogg'¢±’’ÒâÅ‹{{{cccáÍÆ2³2ü°]4íéé¹wïâu²ïÞ½{󿤤¤­­-úÆ›šš<==cccGŽɘ›ìŽ­­­‰‰ b+++ …Âþ™\˜À­ò`ŽŽŽÜÜÜE‹Á›%$$P©TSSS ”-wuu:t(&&†‹GiÿeöìÙK—.EY{ÒÉÉ ?õ\ºt)ÛÞµÀvÑ455uêÔ©ˆ—r@;)Ö¯_?¤-®®®tW<ç,‚‚‚Þ¿r·mÛ6^^^hø cfaañàÁ”sf––†ËèGrr2›ËƒA=z4{öl111 …Ýi8¤ÓU«V uc9püøñ‡–——#ZêèèL›6­­­ ¾†þ¢E‹=zD&“±ó3Ø.šÞ½{×ÂÂÞæçÏŸüüü[¶lAßrjjê·o߆t䎣÷÷÷GSú\QQÑÌ̬¯¯þäµ¼¼üÔ©S Î1;wî0Iiii¸<’™Lfsy0Hzz:âzüëׯýú¥¬¬´´´(++#ÞµÐÏÅ‹ÝÝÝé¸Bœ›X¿~ýׯ_Ñ Ú a ” mm튊ŠöövÌüÃ6Ц4íÉ“'ˆ™hØbaa>Óâáá¸u…[Ù¼ysuu5š£ K—.-((€? ahhøøñcìDSå±uëVøI Ãò`œœœÄhš““@Q|GGÇÇÿæ‰)„€€€§§'šãÈ ,)**‚©ÂÏϯ¥¥Å†g±Ø(š 3ƆJ¥BÃ333”ÍÖÖÖfdd ¹l„[áçç?xð bL€°°°‰‰ @²$ÓÂTyxyyaà"gÂò`œ/^ ¦ú¡hоü½{÷LLLþÚÓ8;;§§§#N(  ÉÐW=ÚÚÚl¸‰¢inn.¢š‹‹‹FŽ©©©‰²Ù¨¨(''':îˆæ&Ö®][SSóáÃDË¥K—àï—ÖÐШªªjnnÆÌ?0U222 ;ÈÁp<¤²²RDDDVVƆD"ñðð ¿%÷Ö­[îîîX8ÈñHKK›šš¢¹¸¬ÀQÒÑÑ)((ÀÌ9Œ`£húüùsÄLËóçψ»Øûéêêºÿ¾§§'ƒ¾q:|||^^^111ˆ–óçÏ/--…¹`‹——wÆŒ/^¼ÀÒE$˜!"‘ˆËp…<äýû÷Ó¦Mƒ·ùôé™LVWWAÓfEEE[[Û_RG ›6mBSxZÍÉË˃¹ŽwÚ´iEEEX:‡lMóòòO7ggg P¶™œœ¼`Á‚¿vIl ŽŽŽOž}Šh9}útüåk“'OþôéfÎa»DÓwïÞihhÀÛ÷ööª©©‰‹‹£i³²²²¾¾þ/)‡†M›6¡9YM>^¾|I¡P³™:uê§OŸ`R1Ø‚^ªªª(åñãÇŸ?âòèe"Ž åÁ8eee&L€·¦Jjjjhlnn®ªªú O0ó|ùr4·Ê@Ñôýû÷06ãÇGy!ù°Á.ÑôLj—?C_®¶¶6Ê6ÓÒÒV­Z…xÙÈ߃‘‘Quuumm-¼™¼¼¼ŠŠ ‘H,++ÌFRRRBBþ¤† —ǃ´(¨ IDATq¸<¹ò`*•ZYY9vìX2™üõëWÄ),Ä‹/ôõõùøø°q‘[022zýú5•J…7›2e F`€1cÆàÑôÏ””” ú†šiyüø1ži//¯¹¹9V™uuõaË´àò8W RWW­ÃÁØÔÔÔôõõ)**¢¼G¡  O{üiiiÄ(ý±———ÃÄ]•¯_¿bìc°K4ýüù3â ºˆ`âĉhlkk«¨¨˜7oÎq–––h΢ɴŒ7f›¶|þü1‡Ëƒq–/_Ήò`ªª*ø%yð¿•{ôÖŠ‹‹¹éÆÄ;_Ñ3oÞ%%%I$ROOûÜûÄÑ´ºº1… ÑgZ>}ú´~ýúþñî²==½·oßÂw—¢¢¢JJJÕÕÕ•••ƒM ajibHUUSåwvá8y0NSS|$t ,Ê;þª««~-QQQ‡îÿQEEe`çÿôéS!!!"‘¸`Á‚~Yþûï¿yyyT*µ®®nûöíý 0úúúŽ?MÚH$ÒòåËÞœ˜˜øìÙ3@&“ •J…*Júùùåååõ××\°`ÁŠ+ ŸÄœ9šÔ:™L†_fØ"š¢aHÝ%‰D‚¦¡ýàÝåÀ§è3-ðÁ’}Ö- y Ì×ýW8ÆJô%âRSS±}b˜„2·ˆƒ ~~þaÈÙp.hÆÇÐ8 ~=»··—­î`‹Ê‚h@³(ƒ!!!Än’)|°¤R©¬Úø<ð. 1‘§ÜÈ&""‚M¡TVSSš%$$àW”ÿrˆD"âÚ šhJ$ÙjXÌÑ”‡‡1Ó‚GS éëëCœåC]!|°žL .a+yôõõqD%d111øÚ)àÅ ú‚ˆˆ‹‹Ã—øË©¯¯ï?í=hövtt ¬§1<°E4Aì¡L ¢è!ði $ 1Ó}ð½áðDS\à gɃqFŒü Ã‘(D¼&ö¯…J¥"6ÿ;|¿¡¬££ã·ƒ‹¬…-¢©°°0b¦:ß‚2Ó‚ áAŸiïU»ºº†!Ó‚Ëc˜ÁPа-²²²ˆz€ªUüøñMƒ£Gf·«7Ù‡_¿~‰‹‹#³ ÿ˜hJ&“;::PlØ"š¢É´@Ý%ʱ¡¤¤$¾nï_¿OßvttàƒåðdZÄÅÅqy 'ʃ­¦ƒ!''‡83f OUUš}U£GþöíFÞqeeeˆwƒÿ]( 3…mll”••EYOcx`‹h:bÄø¢*à_+TŽMƒìv‘,[ñóçOÄL 46„_Þhoo†h*++‹Ëc8á,y0Ž’’bbVHHHAA¡¯¯¯ºº±A•?~à« ¤¸¸M4…¾çUV~ãׯ_ìSï‚-¢©¬¬,â\:n2Ó¢¬¬Œ £¹¹YPP±0)⺕JmiiAÜMÀ8˜'âpyÀÀqò`œÑ£G£‰‘“&M””” Z Œ7îÇ8Çu©ªª"š!FÓªª*˜§,-¢©œœâf¹Ñ£GóòòÖÕÕ¡)€w—0”––v‹Ö@ ë´äåå3hnn–””†M›rrrˆ)\eeeHhÊàò€CyHHHpÄž^)))€8 ‡j°|üøM›S§Nýí7D^^ž¶¶6¼M__ß?xxx`âeee%š9îpÂÑTYY1ÓÂÏϯ¤¤D¡P*++=zt]]Ê£Ö%%%XeZPÞ€Æ C’šé).0”»%â`PSS«¨¨€·™6måŒSGG'++ ϸ‹ööö¯_¿Bã***ÈdòرcavÃáÑôÏ@Ý%âYoô™>>¾‰'bãw1¤L ”AÌ`à%ŽÌcôèѸ<† Ž“&Lš4 ñ:ðîÝ;4õ¿ôôô233™T¿ÂßßßËËKSSÓÇǾT2»ñüùsMMMÄF¥¥¥àуQ^^o0ü°E4AÌæAcC”™–)S¦¼yó縎ÜÜ\ÄL …Bùþý;@;vì`6•••hR‚Œ#""‚¹<¦NÊ}:¢ñÂ… ïÞ½ ò†“øøø§OŸ ‰Ä  ¬ãýÇGûöí+**ÒÓÓ+--•‘‘éëëÓÓÓ³±±ÁÜ1–’’rùòeDË‚‚Ì—üýûw¶*+Ø-šÎ™3ÆF[[›‡‡§¨¨Íí¾zzzǧï¾CD8·»ÌÍÍ:u*b¥(_ª®®cS^^¾aÃ,ôò(,,ìééAüçÍ›Ç|xîܹ222111УóçÏ'&&®X±[ßòóóùùù3eeeüüüšššƒÙêèè`ëã°E¦ Ë´HIIMœ8±»»ûýû÷ˆ Ž9RZZ%æÄÇÇ»ººzyy9;;_¿~ñѾ}û,--|||¶mÛvãÆ &ùvÿþ}CCCD3ÄL F+++CÜM€S¦L)++ƒ·äÑÓÓƒfATAA%òèïÑΞ=ÙÜÜ|ûömøG‡nhh€:»3g΄„„´´´ ™HчʃqÄÅÅ•””» ===aaá> )Ø«££ÓÜÜŒ¨[Lè_PHOO˜qÙºuë£GM˜0aàíîîîiii˜;yùòåþ+#aÈÏϧP(0[Þ½{§««‹©wÀ.ÑT[[ÍŠô æåå¡iÊ´0êÙaÿîrÁ‚ˆfКâŒ33¨ªª’’’¶·¶¶6š%(¶•Gtv€û÷ï/\¸Ñ ’L"n˜å sçÎÍÏχ·ÖÓÓ£R©ˆ „Õ«W‡††bä ýwÓÇwKa~wOOO||üòåË-Ÿ>} €Õ½{÷nÖ¬Y˜9‡ìM544ÊËËÏ’B+Ø™™™hÚ477ÇÀ9pDwùöí[ …‚¸ŽD"}úô‰——f7Ê0gZ8]ìßÙ¡ËF왈ƒG__1š–.] @9Ø]»víõë×Q^ÆÀýz066 ëýÂ… &&&ˆjkk###û…††š™™aëáõë×µµµ-Ÿ={`£iSSS]]L˜U°K47nâñ†¹sçŠŠŠ–”” ¹¢ACCƒD" ÏjŽè.cbbV­Z…höúõk2™}[yp\g˜ ---ì¼&Œ³²²à£)`íÚµ÷îÝ‹÷ðð@<\ ¥¥¥¢¢»yófì<å$h4Ú¾}ûÜÜÜàï–‡xøð!`Ù²eƒP(”gÏžùûûcé"F°W4ݺu+™L†¯”±hÑ"qqñ¢¢¢¯_¿"n¶–““ÓÓÓ»téÒöíÛ1t•»ËS§N¡9^YZZZYY)-- ,_¾|9gΜa¾šƒäÁ‰ ”GYYyèêêrD…Þß033Û¶m›¼ÙÌ™3'Ož\RR’ššŠf[¯¯ï¶mÛlllï` »wï~öìÙÖ­[ÍÍÍÍÍÍ1o?11±§§M²-77·¶¶vÔ¨Q0‹îïß¿WPP`Ï2[ì²n ‘‘QUUE¬P#((ýÇܺu M³ÎÎÎ'NœøËoGÊÌÌìêêBsøáÁƒSSS˜dNNÎðgZþZyôwvа —”ˆƒ—ÇóçÏŒŒ°ôo¸˜9sfGGbÁ^”ù¸xñ"šÚÓ¦MÓÔÔ<}ú4.2ÀÀÀ÷ï߇††2#”öõõùúúîܹÍÄ:¸nÝ:ãôôt˜™+ka£h 066†òHð¬[·pëÖ­îînDã©S§Nš4©ÿ`22 Ý%úL M-,,3 ÑhOŸ>í_ñN˜$uuuv–S;;ˆ}ûö¹ºº¢—LwF£Ñ233Y"Æ!–––©©©ˆ–––– ¥¥¥ÐqDþùçŸ'N ¹÷Ë8qKª*šÓÆÆÆÇóòòZ[[fC¥R>|ˆf¯K`¯hjfföäÉD3MMMMMÍÖÖVh¤Œˆ¯¯ïÁƒ‡aŸ:}0»»LIIiiiA3 ËÏÏÿñㇼ¼<ÌY®>HJJ²äö&ÉÃÇLJåÁl yÀŒŸúé—LÉ@ʬ­­“’’gœОA”ÇI•””œœœœœœ0p‘s¨¬¬<}úô¾}ûÐÇÄÄP(ccc˜¢ùùùòòò'NÄÎG,a¯hª¥¥E&“¡ àÙ¸q# ** ÍIuuõÙ³g?~9 2™ìããããユ„TžiÍš50Ó”GAGî†--- …‚ËC¸I˜0}út~~~4ç¦llldee‹ŠŠúOÃãìì\]]ùi¶…B¡¬_¿ÞÝÝ]II Ѹ«« JóÂ8îÝ»·víZÌ\ÄöЦaùòåh2-Ë–-SRRúòå š¢$__ßsçÎ}ÿþQ93gÎ(++£YÇjiiIKKãåå…Ñ+T·ÚÊÊ SÑ‚Ës‚‚‚†*5kÖ fÃZy`…Ý;wÍ Ík'OžDsG_`` ——šuY.àøñãÍÖzÀ7ÚÚÚfÍš³¼½½=##¦C`õêÕÉÉɈ™>>¾!eZÝÜÜ™tã {R]]}ìØ1”u·¯^½J&“,XS¯äÍ›7bbb,¬¿jee…Ë+ª««=:TyŒ5j0–ËÖ­[—žžŽæ*½µk׎?þÛ·oqqqhZVWWß¾}»µµ5;ïzÄ·oß¡ÉytuuA%ÜÜÜ`Ì’’’ŒŒŒdee1ókØ.šjjjJHH¼zõ ÑríÚµrrrÅÅÅÐÎD6oÞÜØØxéÒ%†}ä ¨Tª³³3šC„$éÚµk)Ó’˜˜íñaÌ–Gtt4Ã>r\)L““[²d šB¼¼¼Õ××£iÜÎÎN^^Z‰àVª««—-[vêÔ)4ö—.]jii™9s&ÌÕ§4íÚµkˆÇÍY ÛES€­­-šL T‹äÔ©S½½½ˆö¼¼¼;vì@¼)‚;8}útww7Jý%$$´´´èèèÌœ9s0›®®®ÔÔT&݆”‰8>>>èààä±sçοDgΜáJy`‚››Û•+WÐ,ºÏ™3ÇÄĤ³³þ ú@Nœ8ññãÇS§N1æ#›ÒÛÛkaa±qãÆùó磱onnŽŠŠìرÆ,++KLL ÍÞ`ÂŽÑtݺu™™™ÍÍ͈–VVV'N¬ªªB¹¶¯¦¦¶sçÎÕ«W“H$†Ýdk Oœ8qöìY4™‰tနi¹ÿ¾¼¼ç¼ì÷õñªNÇœƒõýã÷Ñ>{ï³ü¬{ÖÙk?ûy„cbblmmI\õwL ¶¶¶ÝÝݤ_W½~ýúÊ•+ìììÄç+)//¯¬¬\ñ†Ð:=bccÇeztuuM„ô ŠeË–M™2寤ìÌÏÏ݇>yòdaa!‰o¡¤¤”œœ¼cÇìÎôXÔÜܬ¥¥…Ý\çàà ñ¨òòòððp–£G9Š@ :thïÞ½Œaйš.Y²„›››”GõBëׯ×ÕÕmkksss#±Ó"%%gooOÊduŒ‡ÃÙØØÔÔÔœ={–ø*+ƒúûû±NËÆ%$$ˆìyæÌ///†Z„Öé!))ïàà0ÎÒ#<<œéáééÉPéA-‡>q≣Ò455·oߎÇãkkkI| ™ÌÌÌS§Nmܸ‘”™¥Ê«W¯•••Ioð"„:::¶mÛF 6mÚDd¹„ÐíÛ·{{{‰ÌÜËP·š"„8pòäIR:-¡ÀÀ@AAÁâââϯ  mbb‚=K7v„þùçýû÷çÎ#=§ÃÂÂ^¿~-!!A|°ÜÿýWQQÁ€ã¶F”AAA#Myyù¨¨(HRÒcÌ­ N"eeå… bpÂÙÙyùòåmmmvvv¤ ;Çðòò^¾|¹¹¹YNNn Mȧ®®îçççîî>¢&¿O}}½’’ñÅïz{{9HÊÈsFÀÐQjkkϘ1ãêÕ«¤ìÌÇÇÂÂÂröìÙG‘øŠŠŠ—/_öññ!qÒÔÚÚª££óíÛ·sçΑ¾€âË—/CCC™™™>Lü¨€€???¼òQzðòòž|Àn»xWHHˆ••ÕüùóyE#Lww÷† >œ’’2Òµ:¢¢¢nݺÅÃÃB¼{îܹyóæ©©©Qìèa³]Ê IDATèjŠ  éêê"eguuu<ïââRUUEâ[HIIedd„‡‡[YY¹ +++±[aaa¤_v|ÿþkIYYYY.!tÿþý¶¶6†}$ÿðá䧇šš¤)¾ÿîææ6Òƒ*¦M›æêêŠ=C ..® .ˆ‰‰UTTØÙÙ¨ykkk›pìØ1}}ýææf²â¥¹«W¯JKK‹ŠŠÞ¸qCZZzDÇæååaךAAAÄWü®¯¯‰‰  ,ØQÅèÕôÏ?ÿÔÖÖ&ýýæÍ› ;::ìííI|ö !ÄÃÓœœÜÙÙ)++;†æ¤NHHX´hÑÎ;½½½GÔ ñóó{ÿþ½¼¼<ñψþþþ€€€ÀÀ@Ò?ˆG™¢¢"¤Ç¯P’ïÞ½éA-...Ÿ?&ýÙÐI“&%$$LŸ>ýéÓ§öööýýý¤¿—¬¬ljjª¼¼üìÙ³;FÊ4^£¦¶¶ÖÐÐÐÓÓ3$$ÄÙÙy¤÷·oßnß¾‡ÃmÛ¶mÙ²eDö$>>>;wî$eýÆÁèÕ!tðàÁäädÒ?û•••6nÜHâU Bˆ‹‹+((hãÆªªªŒ?YkOO««ëGº}|||FF77÷É“'‰7èbbbdeeIœ!Œ^ÈHùóçS’¤ßE£,=üýý)IqTÁÆÆvöìÙƒ’~½(&&–œœ, PXXhmmÝÙÙIúÛ±³³;;;ß¼yóÞ½{222çÏŸ'qpítuuíÝ»WUUuÞ¼yóçÏé,,,:::–-[æììL|çäää¾¾¾Í›7“/}Œj*,,ìééI|Ç¡888âããÅÅÅ_¿~½qãÆu笭­“’’Nœ8¡§§÷ùóg²â¥9¬ÁÂÂÂ’‘‘!++;¢c ˜˜˜Ž;öÇÙóãÇGŽ¡,Xš##=âââ(I1‘™™™”¤‡¤¤$‘=ÇJzP‹’’’µµ5‰ _c°‚:}úô¢¢"2n ‡††=z444T^^>66vD׸ÔR__ïêê:mÚ´–––ØÙÙ‘qüû÷ï¶¶¶Ÿ?VSS;uêñ!KõõõÇŽѽ 1ª)BÈÑѱ££ƒô‡ÿ¸¹¹/\¸ **ZRR²qãÆe¡´´ô•+WæÍ›'++ÀPk'½{÷nÕªUÛ¶m vuui¶ÕÕÕ¹ººâp¸­[·êëëÙ“@ `CõÄÅÅ) y4@z` =hj×®] )))¤"))™’’2kÖ¬/^~·~ŠŠÊÅ‹÷ìÙsþüy½{÷~ûöm¤'!@¸}û¶‰‰‰’’Rooonn®‡‡飨†jnn^»víÛ·oedd"##‰ãíÛ·ïÙ³GFF†ÜØéflTSVVÖ³gÏ>|˜ô ‚3f$%% [ZZ¶··“þvlllNNN·nÝÊÏÏŸ={vll,Ý;-ÝÝÝû÷ïŸ?¾‚‚Bff&ñ¢ª±±Ñ¢­­MGGÇÍÍøÎ©©©Œ?Í4ÒƒòôøôéÓxMjacc;þüñãÇß¼yCúQ¢¢¢—.]š7o^}}½±±q^^o­®®õàÁƒ¯_¿Š‰‰éèèœ>}úû÷ïdœê·JJJ¼½½ÅÅÅÝÜÜ,XðàÁƒ;wNž<™¼³}ùòÅÈȨººZNN.11‘›››øþ!!!S§Neð•×~elTS„¼¼¼ƒƒƒ¯¯/éë9cŸ˜Ø%ˆ……é7É0BBBgΜ9~üxdd¤œœ\TT]F|üøÑÍÍmêÔ©MMMyyyŽŽŽ¤O82¨««ËÖÖ¶±±QEE%44”x§åãLJ %ñ1F //ïèè8ÒôHNN†ô@uuuÙØØ`éqæÌ™ñ—Ô"--`oo?¢J&$$”`hhØ××gooüøñŸ~ýzõêÕÉ“'‰œ‡ŸŸßÍÍ­´´tÙ²e999‚‚‚jjj;wî¼wï…¹W__õêÕM›6M›6ÍÔÔôû÷ïgÏžMOOÿçŸ~[ÿˆxûö­©©é—/_äää.\¸0eÊâûß½{÷úõëáááctŠJ&„££#6±õHØØØo QÑÀÀÀÒ¥K×®];¢™­­­ß¾};cÆ ìƒŒ·.,,Œ-,,tww÷ððømZPŽ@ Ü¿?,,ìÞ½{&&&NNNd¿ikk«••Õ›7o¤¤¤ÒÒÒ&MšDdggnnnbb²uëVòÞŽ^ =È;ÕHÓÃÂÂbÍš5c.=¨ÈÝݽ¡¡!,,lDú[ˆ ‡Ã©¨¨œ={v蟬¿¿_CC£µµÕÐÐððáÃÄÿ <óæÍW¯^•”””••IHH¨ªª*))‰‰‰IKK‹‰‰ñóóóðð ;êëׯ---­­­/^¼¨®®~ÿþýµk×´µµ555544ˆ§ Ý‹/¬¬¬:;;•””bccùùù‰ïÿáǵk×^¾|™Œ!NÔbff¶uëV###2Že²a¬TS„PmmíŠ+bbbäååI?êëׯNNN%%%lllaaaýõyïÞÖÖ«¬¬¼nÝ:;;;R’~¤ž={–’’’œœÌÅÅennnllLÉ»477755Íž=ûÂ… BBBÄ÷ ©¨¨¸råÊXüzé1Rd¤Çÿý—šš:ÓƒZúúúV¯^½hÑ¢mÛ¶ôØââb—ææf>>¾½{÷þý÷߃/eggïܹ³³³SRRòÌ™3#ºqØÛÛ[YYYUUõâÅ‹/_¾|úôéÝ»w]]]ýýýüüü}}}===ÜÜÜ“'O–––ž5k–¨¨¨ŠŠÊŒ3Fú‹wíÚ5??¿ÞÞ^¬)ýÛ®ííí¦¦¦>>>k×®¥n$#2±ª)BèÚµk;wîÌÎÎæåå%ý¨¾¾¾]»v¥§§311988ìØ±ãÇ1•••™™™nnnÄ?)p8Ü¥K—ŠŠŠrrrþüóO+Vhjj’ÑaÔÐÐPTTtãÆÌÌLNNNƒU«V‘w4T]]­­m]]´´tBBÂo?+ssswïÞ——GâÊ— Òƒt0=¨¥½½]CCcÇŽd|ò¶´´ìÞ½[ëmÉ’%|ªòÝ»w...¯_¿æââ:xðàÐZKÐÞÞÞ××ÇÎÎÎÂÂÂÉÉIëþ<?}úôéÓ§B{÷îýíh¸;;;%%%ºÏÕ0áª)BÈÛÛ›¿{DϤ„èèèÀÀ@7þüððpÁW´´´¾|ù²|ùò£G’òYŒÇãoݺUQQQZZúìÙ3qqq¬Ó2sæL"–oß¾577·¶¶¾|ù²ººúÝ»wX§eÉ’%X§…ø“ ¤«¨¨ÀðRPPˆ‹‹ûm'°¡¡ÁÄÄäâÅ‹ .¤JôBvzÄÄÄ;v Òã§ÆMzPË›7oŒŒŒŽ?N|­º_IKK;tèP[[›——— Vu°e©©©!33³Ý»wSò=l”544lß¾½¬¬ŒmïÞ½¤L’E ÜÜÜ:;;ÓÒÒè>ïD¬¦ýýý&&&ŠŠŠ¤?e8èÙ³g[·nýòå Ïž={†6îܹãííÝÞÞ.!!qæÌ™}÷ïë뫬¬¬¬¬Ä:-MMMoß¾íêêêë뛜žžN DDDÜÝÝÿþûo¬¢\ºtÉßß¿··WQQñÌ™3ÄÓfÑÑÑAAAýýýÂÂÂJJJ¤uäÈ‘çÏŸ_¿~¼Ço¨k"VS„Pgg§†††‹‹‹‰‰ÉHýúõëž={nݺ…Z¼xñ¡C‡fΜ‰½TWWçââRQQÁÉÉéïïOyŸ.–°°0l¥}}ýß¾#‡stt”–– ¢il£ÒãW =¨+++ËÝÝ=>>~öìÙ䡨¨ÈÓÓ³¡¡!$))éââ²råJ–ŠŠ —ºº:~~þÀÀÀ¥K—R5pjúòåËž={îܹƒÒÓÓ;räÈoÇa²²²nÞ¼Iö8ÔEa5eA-X°€¼ãçÍ›7Ò‰©‚]OOÏÅÅEVV–øìÉ?âââ244”(,,¬®®NLLäääœ;w.333??¿‰‰IssóóçÏïÜ¹ÓØØ¨©©IÉ''ç¤I“899ÙÙÙiÝÊøøñ£££cZZ++ëÞ½{wíÚEÊ;zyyuvvFGGÓ½ÓB-?éAu³gÏݶm›‘‘yÃÁDEEmmmÿøã—/_ÖÕÕeggÇÅÅáp¸eË–™ššÖÖÖVTTdddôööª©©1ÚŸ‡Ã%$$¸¸¸¼zõŠ——÷À^^^œœœ¤‘žž~ãÆ AAAZÇI¢ÔÔTUUÕ‘Î †ñ÷÷«Õ!$  ¡¡áàà°téÒ¡·¸H$++kjjÚÒÒRQQñðáÃË—/óññÉÉɱ±±éêꊉ‰=|øðùóç÷ïß×ÐÐ`¯NÄÅÆÆ:99}øðAHH(..nùòå¤\QQ‘––6†nÏÒcH™3gÎÌ™3íìì444~;’맘˜˜dee­¬¬fΜYSSóùóçÂÂÂèèh&&¦õë×KHH<~ü¸¨¨¨¨¨hÉ’%´(Nž'Ož˜››gfföööjhh\¼xqÁ‚$ö ÉÌ̼qãÆ´iÓh'é&n5E‰ˆˆÈÉÉÙÛÛkjj’‘Ç\\\zzz………wïÞÍÌÌäåå•‘‘QPPXºtéãÇ«ªª®^½*)))%%E‹_*š››===±¯´K—.— åÀøøøôôôëׯ“Ø™[ =0´&'''..¾iÓ&uuõéÓ§“wfffyyy+++yyù–––÷ïߥ¤¤TVVþý÷ß UUUéééJJJt_Y¥¼¼ÜËËëäÉ“3gÎ $}ÞApøðá»wïfeeM:•Ö¡ŽÈ„®¦!)))qqqWW×U«Vý8B’3f̰±±‘’’Â:-·oߎ‹‹Ã¦X¿~ý»wï***²²²ºººÔÕÕ°Ó’””äìì\QQÁÃóoß¾]»v‘˜ÖÑÑÑIIIŒ–ÓTé14=°î.¤-ÈÊʪ¨¨ØÙÙIIIQ2“”””‰‰‰µµ5EÅ·oßÊËË»»»YYY;;;¯]»ÆÉÉ9þ|º<òûäÉ??¿   >pqqy{{?~œô¯’8ÎÝÝýÝ»wéééŒÓà4Ñ«)BHVVVBBbãÆêêêäý—ÏÄÄ$##cee%..^SSÓÔÔTXX…ÇãMMMedd Š‹‹ ªÓR\\laa‘žžÞÛÛ«®®Ž=½@âc /^ÌÈÈ¡uœôéAFz$&&&&&N„ô "qqñ%K–lݺµ¿¿ŸŒ©’‡áääTWWß¼y³²²òäÉ“+++±Ñj=ª¨¨ÐÖÖµö{zzºŸŸßÙ³g±:joo¾hÑ"Ò¿A¶µµ9::ööö¦¥¥èqðQCa5«cz”™™éääCáÄTáîÝ»çÏŸüø16é«ÁÍ›7›››…„„Nœ8AÞfTôòåËàààüü|„˜˜˜¯¯/‰·ÁB!(((''çæÍ› uÓ‚¦ =HEEE‘q˹½½½  àÁƒùùùŸ>}Â6²°°(**jiiikk+))ÑtíO<ÿìÙ³ÜÜÜ‹/¶µµaçÎkff¶jÕ*‡ì•½gÏž   5kÖP;Xj‚júÿ”——oذÁÌÌì·Ë»“Çäææ¦¤¤tww³³³cË5èèèÚèŒÌÌÌóçÏ?þ!ÄÅÅeii¹eË>>>ÒOÒÞÞŽ-`™ššJÉÒc¤ƒéqåÊÆéW]aaa'Ož «éx[SIIIéÎ;ÆÆÆ û÷ï'c™øajkk«ªªª««ñx„ƒÃáâãã#""öîÝkmmM­ØÜ8¬¦!nnîóçÏGFF9rD[[û·‡àñøÿþûë´<{ölh§ESS봌º•¡§OŸÚØØ vZøøøÖ¬Ycbb¢  @ÆÙp8œ¿¿ÿƒ._¾¬¬¬LÕHÇ*HA´&((úôiSSSKKKWW×a_w6lØ ¦¦¦¥¥E­…E)Ga)­ªªÚ¼yó¬Y³îܹCâ“ÍãÃø¬¦GGÇ XYYéèèYŠ!777===77·½½ÛÂÊʺpáÂ%K–,Y²dΜ9té´ ­\¹rÁ‚dðþýûíÛ·cWc0¨dHHQãêêúÏ?ÿøøø¬\¹r÷îÝC'Ý%åËÜXñýû÷Ó§O§¤¤øúúnÞ¼y¢-‚;ž«)BhÁ‚=Ú±c‡¾¾~XXØOo¤_»v-##!$&&†uêÔÕÕÉ{ÒŸ*DEESSS)¼cÇã/\¸æëë»iÓ&jÅ6Î@z@zŒaaᨨ¨‡nݺ5222 €Z‹ë1—––¢««[RR21WÀçÕ!4eÊ”˜˜˜ÐÐPl0§››Û°N‹©©©²²²––ã$7…Ÿ•555›7oÉÉÉaœ_Š1AzP+*@ MMÍgÏžEGG›››/Y²ë Ð;(J¥¦¦KKK'%%Mäû ú-Õ9;;———wttb«ÞÒÐа±±+ÝÝÝëÖ­sttÌÌÌ¿Ô(ÀÒ£³³ÓÀÀÒÐ ‹££cii©´´ôªU«<==›ššè™Ð;"*HKKÓÒÒJMM=þ|DDÄļiAÃÒ£®®ŽÞQ¤Ãðó󫪪’““sppÐÕÕMKK1΀>|ø€ ƒÏÍÍÅf¯\¹r%|3ÃL¸jŠbaa±³³+--UPP066Þ±cÇàô]cN~~¾‘‘Qpp°ŸŸß­[·(Ÿk M¿ÿþ{ÇŽôŠLcÛ–-[ª««;V\\¬¬¬ìããƒMIïÐþWGGGrr²••Õúõë'M𔓓“’’¢¥¥Eï¸Ëø…ô+<<<^^^«V­222Z½zõXéû÷õõ¥§§ÇÆÆ²°°øøø¬Zµ ¾R×Ðô022‚ô´ÆÄÄ´|ùòåË—···Ÿ?>%%ÅÝÝ}õêÕ‹-Z±b]&¨jiiÉÉÉÉÎÎ.))Ñ××wuuÕÕÕ¥|±ñj¼ÍÓKžþþþèèè   nnnWWWccc†\­¡¡!111--MYYÙÙÙy<=¬Æ° =]´´´„‡‡ççç—––jjjÎ;W[[[AA¦ *àp¸ÂÂÂ<~üøãÇ+V¬044ÔÕÕ¥ãSa£f½§l±­+W®¤§§êëëëèè0È—úÎÎά¬¬7nTVVš››cëWÓ;¨‰ÒÐKooojjjiié£Gêë딕•%$$fÏžMáw»¶¶¶W¯^½y󦶶öéÓ§µµµ‹/ÖÖÖÖÖÖVVVfØ/Ž´Õ”ú:::rss ŒŒŒÔÔÔôõõé’U­­­X§¥¨¨hÅŠ¦¦¦zzzÐi¡/H@Gß¾}+++++++--­ªªªªª’åççŸ}ú¬Y³$$$Fg~é1Vd£!___„P__ß•+WJKKwïÞ]WW§  0Øi‘‘‘¡¼Óòúõë7oÞÔÔÔÕÔÔ¨««kkkŸ8qbþüùªÓ2¶@zF %%õ«Æ¾]ZZÚ¿ÿþ»víÚQŽj‚jJvvvssssss„P[[ÖiÉÉÉ©®®®¬¬$±ÓÒÕÕõýû÷ÎÎÎæææ/_¾´´´`NNN¬Ó2þ|GGGZ_ܪƒôŒ‰››!ÔÝÝMï@&¨¦#ÆÏÏÝ¢ÜRSSÓØØØÐÐP__ßÚÚZ[[;ØiùüùsWW—   //ï`§EXXX^^ë´ˆ‹‹ÃòãɈÒãÓ§O½½½Ãq€Z°jÚÕÕEï@&¨¦T@¤Óâááëíí +uLXDÒÃÆÆ&==ýèÑ£«W¯å¨ÀD€-áצ£ZF´…]X´¶¶Ò;Àˆ°ž-§w `|‚kÓÑÕ”¶TSð Ø zÆ™@Œ3PMGTSÚÂFŸC5?צ€¦ Ó;š šÒtzpm h «¦pm:: šÒTS@\›š‚Nïh‚jJ[X§÷ëׯô0"¨¦€¦ Ó;š šÒ\›" Ó h ªéh‚jJ[üüü,,,mmmôŽ0¸645iÒ$ÞÑÕ”¶˜™™'OžL ¾}ûFïX \›Ž&¨¦4·NÁ¯Àµ) )¨¦£ f¤9¸u ~ª) ¢gÏž½~ýº»»»»»»««««««¥¥!ÔØØhii‰mÁ^êîî>}úô_ýEïǨ¦4÷ÓjÚÙÙùùógIII:F[oo¯¯¯/‡#x<ž@ „'Ož „.\¸ððáC<mÇãñüüü§OŸ¦wÈ`ŒiooߺuëÛ{zz233‡n‘’’º0  ¨¦Ô„Çã[[[±Õz1_¿~­««C=z444tpc__Ÿ¾¾~RR½C£„ƒƒ£µµõÚµk?¾TRRRRR2tK@@ÀhÅÆmmm==½Û·oKHHXZZNš4‰ûfffõõõ[¶luý¨ª)5õõõéêêbås˜çÏŸÛbgg7*AF±k×®7nàp¸½{÷Š‹‹333333311 þïÇCCC………mmmé,“üýýïÝ»×ÐÐ`mm={öìa¯>zô¨¾¾^PP[‹PTSjâää °´´D-^¼XFFFpAAÁgÏžÙÚÚJHH,]º”Þñ‚Q%++»fÍš+W®455ùûûÿ¸ÖÝݶm6x€‘š3gŽ™™YBB‚¯¯ïåË—‡½ŒÚ´i$-@5¥²•+WêêêÞ½{wΜ9QQQ?î°{÷n„­­-tZ& ]»v]½z566v×®]C_ºsçNAA,… (áçç—–––ššúøñcuuõÁíUUUׯ_çäätpp cxã| SßÑ£G988bcc±1&CÕÕÕeeeqppXXXÐ%6@_RRR¦¦¦}}}ÿþûï°—<ˆrvvÆæV€<Ó§Owvv&žžžC§Ù Áãñ¦¦¦ÂÂÂt oƒ¯™ ù®IDATjJ}RRR[·nÅãñ...Ã~ˆŒŒÄáp«W¯¢Wx€¾¼½½YYYãããkjj7ææææåå ØÛÛÓ160>lÛ¶MXX¸   -- ÛÒÜÜÇÄÄäââBߨÆ1¨¦4áéé)**Z\\<´ÙÛßß‚VÞDöÇlذa``»Å`?oÙ²…‡‡‡~¡q‚‡‡ÇÇÇ!äããÓßß:{ölWW—žžžŒŒ ½£· šÒ77÷¡C‡B¾¾¾ØÔ¡«W¯~úôI^^^MM®Ñ:óòòbccKHH¨¬¬D=|øðÞ½{üüüŽŽŽô ŒVVV³gÏ®ªªŠˆˆèéé EÁ…)MA5¥cccmmí––lØBèìÙ³.LBâââæææ8îÀèÿ.Lœœøøøè'XYY±qã mjjš7ož––½ãÏ šÒбcÇØØØÎ;WRRòêÕ«ððð¬_¿žÞqúóôôäààHNNމ‰ÉÉÉáååurr¢wP`\100X¼xñ—/_¼½½\˜ÒTS’‘‘qrrÂáp...aaaÁÔÔ”———Þqú³²²ÂápØã ŽŽŽ“'O¦wP`¼9xð 366¦w8ãTSÚòöö),,„6/ÆÃÓ“ÇóððützU(4þü5kÖ „¶lÙÂÊ ³ ÐTSÚâááÁîŠáp¸… ***Ò;"À(DDD°íìì°¥ º={ö YYYÑ;ñnßVjkkÛÛÛéõî£IJJjÞ¼yeeezzzeeeô0==½¤¤$H @;GúpóÄ!))9š#ûèVM½¼¼jjj&ÎMDEEÅëׯ_¿~ÞÆ2sæÌ={öÐ; Æ›÷ïßGFFêëëÚ;Ò³“îçç3¿ ºÑzî›”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦€q.;;[WW—’3hiiIKK¿ÿžÈ>ÖÖÖÒÒÒÃ6feeÉÊÊJKK?<%%Û­¾¾ž’8q†††›6mÂãñ¾õÕ0ž„àà`aaáaÛ_½z¥¦¦ÖÕÕ5lû£GÌÌÌþüóOSSSccãàààÅ‹ÿö´´´LLL†mTRRÚ¼y³žžñcUTT–/_Žý\XX8gÎéXhB¨¼¼\EE¥½½ýÇ—äääòòò®_¿NÊùÁ¯@5€$AAAööö´;ÿ©S§hzþ ëÑ£GµµµVVVö¿ÿ¾¹¹¹¹¹yèÆôôt[[Ûúúz“•+WÖ××ÿ÷ßoß¾ý믿~ûFÇŽ¶QLLÌÃÃÃØØ˜ø±RRR«W¯Æ~–””Ä®¤MMMíììììì–-[öÛw'B¨©©éÛ·o?­¦~~~“&M 'ý]ÀXéo¾~ýÌÂÂÂÊÊŠÃá‚¿¿?½ƒ"‘à===÷ìÙCÆ9|}}»Û¶mÛÈ;? îæÍ›K—.ýé«aðçîîîýû÷/X° 66–‹‹ !ÔÕÕ¥££ÃÁÁíT\\ÜÖÖ6wîÜýû÷ËÊÊbÛ³²²ÜÝÝq8B(77WLLŒ”Àðx|dddrrò§OŸ¤¤¤æÌ™ƒmŸ:uª±±ñ­[·œœœXXXþù矣GÞ¹s‡ƒƒcÙ²eïÞ½ãää¼téÓúõë»»»%%%srrˆ‡¡¯¯_]]ÒÑÑA111¹ººnÛ¶ {UPPpÆ 111eeeóæÍ#õÿYðÿA5Têáá! €êêêòöö¦wD#@‹à»»»)? [qq±œœV‰+--mooß¾}ûàÎÜÜÜqqqS¦Lyþü9BèÖ­[Ë—/Ÿ6mZVV–££ã½{÷XXXBJJJNNNÕÕÕÙÙÙ¤æï˜¨©©©§§÷ôéÓk×® Û!<<¼­­íÓ§Oâââ ÂÂÂVVV½½½ÌÌ̽½½\\\ƒ—ÝD°··¿ÿ~vv¶¹¹9///“¶¶öÐV¬XóôéS¨¦dƒj ¨¬¯¯——û™››ûßÿ|i`` ""ë­õôôèéé ^1œyò„­··wعÌÌÌÂÂBŽîîîE‹amÀ;vtvvzxx`WEoÞ¼ æåå F…„„”––ÊÊÊâñøÏŸ?ÛÚÚ.X°à7­ àãÇÃ*‡ŽŽÎà=H¬§Ê²k×.„ÐŒ3†î,//ªé‰'V­Z…RTTôöönjjÂvsww¿}û6éÕ´¾¾þâÅ‹;wîDáñøÍ›7ß¿è>—/_üYMM !dcc#''çàà`iiÉÌÌÌÅÅ¥ªªŠíC$ŒuëÖñóóggg;::þôÒYFF‹ŠÄøÁ š*³¶¶þ÷ßedd”••§M›6øRTT”‰‰ ö™…Š---?>Bhûöí!‡´´´}ûö±±±aûxxxôõõ ~û¶¶¶îééÁJ)y'$;x„Ðû÷ï­­­eeeûûû÷íÛ€mlÒN:ÕÏÏoh öôôlkkûi¿ÿ~KKËþýû±&&&ÖÔÔ`?ß¾}»µµõàÁƒØ?/\¸pëÖ-}}ý;v`cD±í²²²***+W®Äþéæææèèhcc#&&Ößß¿{÷n¨¦!ÇÌüÿˆ888|üø±¶¶ööíÛfff|||ÌÌÌ‹/nllDýôÎ"æÏ?ÿÄ~àææFõ÷÷“Õ›7oÂàp!fffccãaÕôîݻ߾};pà@vvöŠ+B‹-266NJJBYYY –R aÿ`]b@¨¦€Ê¤¥¥ýýý¿ÿ^QQ‘’’"##£¯¯½tûöí¡ƒ>ØÙٱ⇙1cÆ·ÍÍͰêxñâEssóÁ—È;!yÁ#„þøã¬’±±±a->Jäææ½£laañøñcìçüüü ¾deeåç积¯?cÆŒ?"„:„òóóûô铨¨èàž³fÍ®<ØØØ/²'¸iÓ¦ jdaaºuëÖíÛ·íííÅÅűíÓ§Oçââ ;}ú4+ëÿ~6îÛ·oÊ”)rrrÔjúôé¡âââÙ³gc[ŠŠŠ~Ümîܹ©©©wîÜqvvÎÏÏ9sæLRR’’’@¸pႳ³3éï;ô>ñPØÓ;îËÁˆ@5TVWW7kÖ¬I“&©ªªªªª $aaaâ½ÖŸ^AΚ5«©©©««‹™™¹±±QBBbð%òNH^ðŒ£»»ûû÷ïlllß¿vÕ~¤¬¬üàÁ÷Û/@üüüûöíóññÑÓÓÓÔÔäää,)))//ß°aVccc­¬¬p8\FFB(==ÝÕÕ!”œœüáÇwïÞ!„"##ùøøäää°žpRRR}}}mm-B(**ŠŸŸ_^^ÞÐÐPAAaÉ’%û÷ïô葨¨è«W¯ BÑÑÑýõvþ¨¨(>>>„væ¾¾¾ýû÷'$$ðòòFDD011-[¶ìĉ>|ðõõåãã#Bk´øúúΙ3§±±ñÉ“'FFFƒßrssB‹-¢êÿ÷ TS@e œ>¾²²rÒ¤IœœœBBB‹/Æ:]Gíïïòä öíxݺuÃzk...x<>,,lèFJN8Òà?~÷îÝ-[¶¬ZµêÆááẺºث׮]{òä 777Wyyùœ9sœ± ‹ÜÜÜ›7oòññqppðòò®]»VHH;*++«¨¨ˆ••µ³³SNN.??_QQ»+œžžþôéSNNÎÞÞ^UUÕÁ‡Ÿ={¶oß¾ôôtì—òöö^¸p!öR```^^ž½½½±±quuµ‡‡Ç_ýåîî>Ò¿à8300°dÉ•S§NÑ;uêÔ©S§N=ztíÚµôŽ…jFTžÌÌ̶nÝŠ}s)&&&¨¦€q....$$¤¬¬ŒÞ0())©¤¤¤ñtã`ô«)tz㜵µ5|q'âÚµkã©”ÒTSÀ8ÇÌÌ–¢jºpáBJƸo P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š”‚j P ª)@)¨¦¥ š ·ÿ¾dE€©¸]IEND®B`‚mod_perl-2.0.9/docs/user/handlers/tmlogo_color.gif0000644€ÿÿÿÿ00010010000001260711727205031022377 0ustar ????????NoneGIF89a§Õ?ÿñÔÿâ£ÿìÃÿÃ@ÿøêÿê¼ÿôÛÿöâÿÆIÿûòÿØ„ÿÈQÿÉTÿÏeÿîÊÿÍaÿàÿÌ\ÿËXÿÑmÿÄDÿÄBÿç±ÿÐiÿÖ}ÿÇLÿÕyÿÞ•ÿÒpÿÜ‘ÿÚˆÿå­ÿä©ÿÅFÿýùÿÔvÿè¶ÿÛŒÿß™ÿÿÿÿÈOÿ×€ÿþüÿðÏÿÜŽDz¡¼?r›¿ÐÝïóöO‚Ÿ¸Í/g’ßçî_Š«ÏÛæO~£[ЭĝÄÕo•´ÿÓtÿÿþÿÿÿ!ù?,§ÿÀŸpH<ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xŒ$šÏB²zÍn»ßð¸|N¯?Ñh»~Ïïûÿ€‚PxEƒ‡ˆ‰Š‹Œr…Ž‘’“”•–~y—š›œžŸ'g £¤¥¦§o†¨«¬­®¯FC°³´µ¶i·º»¼½©¾ÀÁÂÃR?ÄÇÈɼÆÊÍÎÏ¥ÌÐÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœyd†‹›8sޠɳÍÿœ@kÀ¡Ñ¢¨Ñ£0z*%#ã¨Ó;ßµž&í9õž?NbD5:Õ[5ÀÔM3Àb²y%]0ü„“0ìhVò‘ƒ‘9qE ;å%[r™•ßqQ¤G¢IrSÕµE‘Gî0æ5Hé‚i¢RÑ.Ài# 7½§ç‘V6áXŽOÉð‚ ˜œ1zä’HX¶¢S9Øpç)éT9Xº£™GÊiD :”¨• ‰&qƒ Ý9%¬Wù£¶â0¦S,zØW8x¡7ñZ” „ªÚu‡½ °M°Ùl3¸Ú“¬49ì·- QëS}&èàeÿì¸N}ƒ¶O9‹ ‚›C‹J ˜nY;Ök”‚'¸ ìQ?š»éTÆQ:ؾGÝJm5  îF ÌpÁITÊîa6<œ\GÜpp Ʋâ/ÃFõ&bVOÔ0ò·ï­<•¢ð:%¯5œüí À^ˆ²IÔW 5OECŠ1øü-·L蜮 øRªô¾?bù³vLÌ`±|Q/_Vrê;U¹¦l|õŸAèD?$oL¼ûíÍÇn}Xi¾Ì0ÀF”µÃ v;°Ü(3­DÑûÒ-+⇵˜öÕ:*á2äFa¬Äãäž0õS°ÈLy ª²íTÂGNyÁ¢¼„ét-!ñÕ2XùùèóÒÿx¼'°ÎpÉJÌ~”âFþ9›Ã® ·F:©uì°1®‚ùç½Üõ 7˜ÍpaN߬ûT2xÏø¾nûnT…Þ’ 9Xz&ÃÃoC{ÜÚƒËwûéòý¼ùE]oÄÈ/ˆŸS,‡Šæýl>ã—„7;&Ð+ßù^£Ò$ÁÏá&}³KÂëÌgÀt-Ïb›áN°Á}‹ªABg—j) õ3ŠÿL?pÁækàSB b˜®'YeH¨`Ãú„¿àà&6`ÜûŒPB” éãC!Ã(¦„â9êru¿¡b¨€R?2ª4 Íõ´¶ŸË5},Šþ˜PÉ„u0eŸÊÀRTÌÒ-r ˆ|Çš½#D³(Õ\²¼&>…wÖšBƒ_IAˆ) ZYd@6*Ô¯F(ZøœË±)á˜ß&-šÎ?ê%Sß"`¬·*ÆÑ O1Ø“P¿&tðƒ÷œ[j<½)Îð\ö¢wV!“GBÙ …`¦ Ÿ¼Õ®sƒ$ñ¢hÿÉ<ŠP:,àAá0BAçW¨UÉ'VëŸK hœfI'˜Ô(ýì¤$Ã`Àɱ]]`c6Au˜˜AYÑ \Ç1£'°±|‡I*Òh«Ü”ZOÕJغ% l­ =ŒOͽ–U5 ŒÑ6=J…ò•„j™ÂÈž˜VÜ!ã«QÀ SžäM}NÁ¤8Ði ŽÖ„&Bt c«&Ï)N¯vÖ …-ŠU«Wº®®R*BûÅ(t0 ×ü2ü~–Î}ƒBypVˆ­3·kP¾ÊâØãÉ Ûœê¶‰Z+p˜Ã:èÞê„&Ú4¢#"Þ°Äê‹îEáGP,í´ ÏaEÖ â5ÿÊe1+\ šG Ǽî b :ävõ $g8Ö^ÆMY­u­€hZ僺O©óŽ 7à>ás =Býš‹²rs 0•Q{L‹‘ kº ^@â“X{7ÃgQxààáúǨÅË€eŠÓf°V3FǶ°ÍÛõŹóéœ)Ôr¨Ä­m~ž°ƒ-úÎK ØhÝÛÞ%8-*ÞW…}¬ “Ø´5Â6ù+à«E8¼m=*¸x‡Ø(„¶¾Üi늖ÔsIXj&X‹ã T&(‹b]¼› “Ñ^4 ªíðˆºY%{¥4­—— ú6—È- 0¡µùɧU–|…îÛŒÿ½ã7ÛP»œyÆËF‹`À6Z Ú“AýF[³ÞtÚ+^òn™³2Wã¾Ú ÛÔa–¯¦Üak¥ÐmfBl·Óã|xRΘé³âÀ—}9Áör’üÀá)¡ÕOxÙ_Á¼äØpÛ™R¼0ŒŸ–QJ/¡ƒãQñ°ŒSãf${Ý z¶¶Û¸ÔO¾™=行³uNa`d6‚®Ÿà4ãH–rò½A½Ï…/¡’G÷Rƒç_e¤wYQ8t·¶…:Ǥ×,†Dý¹èiÛÍõ~ÂÀ =k$0ڋŪ’ýßtxæN5Îs#|¼Å†mÝg /+Mý.ËÆ™øêXÏz‰o&ÿr&üK_Çö¨{ü‚ëÆ– ðntÐÔDëp×:,ûŒ¢ZÚ,W›þ\“ß6Üåª{d¯»½Ò>QïjYAÅÅ­«† G{ÔO¼„sœ ûqó^ñ(‘×Ë…µøe¤×ÜÓZî7Ëwä¼BžY_e+c xO†T[îÿÝ× &5ÎQ×Ú{1¹×nmúDý6P9›ôÌ}÷Êë— æ;9-¦ðýuã',]ñ›v‹òV\¾«a÷QðŸÒ>W´+E±#ò¦âŽl²"dqÊ`jqRpY²Zæs[îx€YévŠò3ÆÒu´÷!»“‘F#É-Õ…2)7q´à öhã!y­H9Ä€”b1±bl>,ÉŠøç 7UØ4ïEeës03(ÓNÏøÃTOO6‹Ù ¨Ø(Gà‘JÀ“8hrOpL#Ä•Ã}yFŒÿQ@Lð’%?ÙmFÇ?ò“$3‰(”(G , 0ƒç}”#NƒZ¦v'b)‚¶/ÂF)—JaZ?xWIm;€A9;¯÷”Âá5'ÉÍØ Rp¹÷SWƒ†…8¨:°™Xó%·S0G—tÑç†wšH™.Ò%@)2pSÖxßZ·F›ZøÕvß²¸˜L 2?³¡›é„«S˜B"D.ø‚M •ïf˜h–.,BÔ–)¿Ù0ÈXò¦„ D—¶² b*d* p¦hz¦°¦lº¦ð¦pjr:§r vz§+§yê|Ú§ð§€ú§0¨„:¨$p¨ˆjŠº¨Ш  ©0©”J©p©˜ &°©&°žú©Ð¢*ª,Pª%pª%઺ª ®úª®š²*«P«¶ª¸š«#°«ÿ¼Ú¾ú«¬Â:ÄZ¬pÈš¬ÐÌÚ¬Îʬ­Ò:­P­Öz­ Úº­Üª­ ð­à®àºäZ®æº(®éšìÚ®îÚ®¯ò:¯ô:¯!p¯øš¯úš¯Яþú¯°0°[°;›° »° Û°û°KΦcZ¦iЦmÚ¦p§@§uz§xª§+Ч~¨‚*…j¨€¨‡º¨Œê¨©’Z©–™z©œÚ© ª£Jª¦Šªª¬ «¯:«³j«·š«¸Ê«½ú«= ¬Pk¬Åª¬ÉÚËú¬Í:­ZûÀµ\‹­Õ*ÙÚ­ÜÊÿ ®h{®j«®ëŠïú¶õ:·öº¯v«¯›·zk°|[û·€¸k+¦*P¦dz±jš±nº±ë± ²";²$˧&+¨)k¨,K.«¨0³‘ @³–z³šš³ ê©=ۥʨzª¬ªªD«)@»F‹´µª´KË´#à´ð´PËRK¬T[µX ­ °µÑÚµÌ ¶ÖJ¶d‹¶i«¶æÊ¶ëú¶pK·Ú{·Ü{¯zû½ÿÚ·+¸ä[¾û {¸{±Œ{à¸ð¸s ²v:¹•{¹'›¹$°²,Û¹ð¹2;º¤k³6{³¨»³Ÿºº­ûºÿA»³k»·‹»º«¼Û»¾¼Â;¼Å»¬W{¼Ê+­Öúµ`+¶Ð»­f+½áJ½Õ˶à¶Ø ¯r«½sÛ½Ü ¾:,¾k¾>üÀ¾†‹¸fʾîû¾ò ¹÷‹¿ú[¹À¿™«¹ܹºLº¦{ºœšº¡Ú³ ÁL´µk´)€»pÁì»ÀµüÁÇ‹¼#¼¼&ì¼)\¶,<®.L®Ö+Ã3 ¯6|Ã8l·: ¾àýJÕÍmÙ—­¦ ®ÙqzÝžÝ"½Ýf}áãüÝ’jΕêÖ[ ×!.×±‹Þumâì×)þ´ðÝÁ,þ×"\ßÔÚ۾߇=Ü0¬ØÿÜÉíã?ÞÜAþÃ0 Z]ä‹Ä›½Íؽ§M¨ Ú„JÚ‰Šá  Ê.Þ›º~Ê"žªsÍÊ^ž´`îÞ*>Ë~­¬· ØqÔtLÔÐ[ãÒ{ãêÃþ½Ø ÍãtN@~ç>¬àà> ¤·¹>»þ¥¾þëÀìÂ>ìÄ^ìÆ~ìÈžìʾìÌÞìÎþìÐíÒ>íÔ^íÖ~íØžíÚ¾íÜÞíÞþíàîâ>îä^îæ~îèžîê¾îìÞîîþîðïò>ïô^ïö^îÒpïUšïú~üÞïm‘ ð?ðb¡ _fða! ¯xðð document written mainly for mod_perl core developers, but may be found useful to non-core problems as well. =head1 Reporting Problems Whenever you want to report a bug or a problem remember that in order to help you, you need to provide us the information about the software that you are using and other relevant details. Please follow the instructions in the following sections when reporting problems. B to understand is that you should try hard to provide B the information that may assist to understand and reproduce the problem. When you prepare a bug report, put yourself in the position of a person who is going to try to help you, realizing that a guess-work on behalf of that helpful person, more often doesn't work than it does. Unfortunately most people don't realize that, and it takes several emails to squeeze the needed details from the person reporting the bug, a process which may drag for days. =head2 Wrong Apache/mod_perl combination First of all: Apache 2.0 doesn't work with mod_perl 1.0. Apache 1.0 doesn't work with mod_perl 2.0. So if you aren't using Apache 2.x with mod_perl 2.0 please do not send any bug reports. META: mod_perl-1.99_xx is mod_perl 2.0 to-be. =head2 Using the Wrong Compiler To build mod_perl, you B also use the same compiler that Perl was built with. You can find that out by running C and looking at the C section. If you have used a different compiler and have encountered problems (which most likely will be the case) recompile Perl with the same compiler and then recompile mod_perl again. =head2 Before Posting a Report Before you post the report, make sure that you've checked the I file (t/logs/error_log in case of the failing test suite). Usually the errors are self-descriptive and if you remember to always check this file whenever you have a problem, chances are that you won't need to ask for help. =head2 Test with the Latest mod_perl 2.0 Version If you are using an older version than the most recently released one, chances are that a bug that you are about to report has already been fixed. If possible, save us and yourself time and try first to upgrade to L, and only if the bug persists report it. Reviewing the Changes file may help as well. Here is the Changes file of the most recenly released version: http://apache.org/dist/perl/mod_perl-2.0-current/Changes . If the problem persists with the latest version, you may also want to try to reproduce the problem with L. It's possible that the problem was resolved since the last release has been made. Of course if this version solves the problem, don't rush to put it in production unless you know what you are doing. Instead ask the developers when the new version will be released. =head2 Use a Proper Subject Make sure to include a good subject like explaining the problem in a few words. Also please mention that this a problem with mod_perl 2.0 and not mod_perl 1.0. Here is an example of a good subject: Subject: [mp2] protocol module doesn't work with filters This is especially important now that we support mod_perl versions 1.0 and 2.0 on the same list. =head2 Send the Report Inlined When sending the bug report, please inline it and don't attach it to the email. It's hard following up on the attachments. =head2 Important Information Whenever you send a bug report make sure to include the information about your system. =over =item * If you haven't yet installed mod_perl and/or you are having problems with the test suite -- you should do: % cd modperl-2.0 % t/REPORT > mybugreport where C is the source directory where mod_perl was built. The C utility is autogenerated when C is run, so you should have it already after building mod_perl. =item * If you have already installed mod_perl and are having problems with things unrelated to the the test suite -- you should do: % mp2bug > mybugreport C should have been installed at the same time mod_perl 2.0 was installed. If for some reason you can't find it, you can alternatively run the following command, which does the same: % perl -MApache2 -MApache::TestReportPerl \ -le 'Apache::TestReportPerl->new->run' > mybugreport =back Please post the report (F) B in the text of your message, and not as an attachment! Now add L to the report and send it to the L. =head2 Problem Description If the problem is with the mod_perl distribution test suite, refer to the L<'make test' Failures|/_C_make_test___Failures> section. If the problem incurs with your own code, please try to reduce the code to the very minimum and include it in the bug report. Remember that if you include a long code, chances that somebody will look at it are low. If the problem is with some CPAN module, just provide its name. Also remember to include the relevant part of I and of I if applicable. Don't include whole files, only the parts that should aid to understand and reproduce the problem. Finally don't forget to copy-n-paste (not type!) the B part of the I file (not the whole file!). To further increase the chances that bugs your code exposes will be investigated, try using C> to create a self-contained test that core developers can easily run. To get you started, an C bug skeleton has been created: http://perl.apache.org/~geoff/bug-reporting-skeleton-mp2.tar.gz Detailed instructions are contained within the C file in that distribution. Finally, if you get a segfault with or without a core dump, refer to the L section. =head2 'C' Failures If when running C some of the tests fail, please re-run them in the verbose mode and post the output of that run and the contents of the F file to the list. Please B the F file from C that runs a complete test suite, as it contains a lot of irrelevant information. For example if 'C' reports: Failed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------ compat/apache_util.t 15 1 6.67% 13 modperl/pnotes.t 5 1 20% 2 Do the following: % cd modperl-2.0.xx % make test TEST_VERBOSE=1 \ TEST_FILES="compat/apache_util.t modperl/pnotes.t" or use an alternative way: % cd modperl-2.0.xx % t/TEST -clean % t/TEST -verbose compat/apache_util.t modperl/pnotes.t In the latter approach, C cleans things up before starting a new test. Make sure that you don't forget to run it, before running the individual tests. Now post to the mailing list the output of the individual tests running and the contents of F. Also please notice that there is more than one C being run. The first one is running at the top directory, the second in a sub-directory F. The first logs errors to F, the second too, but relative to F. Therefore if you get failures in the second run, make sure to C to that directory before you look at the I file and re-run tests in the verbose mode. For example: % cd modperl-2.0.xx/ModPerl-Registry % t/TEST -clean % t/TEST -verbose closure.t At the moment the second test suite is not run if the first one fails. =head2 Resolving Segmentation Faults If during C or the use of mod_perl you get a segmentation fault you should send to the list a stack backtrace. L explains how to get the core file and extract this backtrace. Once a proper stack backtrace is obtained append it to the bug report as explained in the previous section. =head2 Please Ask Only Questions Related to mod_perl If you have general Apache questions, please refer to: http://httpd.apache.org/lists.html. If you have general Perl questions, please refer to: http://lists.perl.org/. For other remotely related to mod_perl questions see the references to L. Finally, if you are not familiar with the modperl list etiquette, please refer to the mod_perl mailing lists' L before posting. =head1 Help on Related Topics When developing with mod_perl, you often find yourself having questions regarding other projects and topics like Apache, Perl, SQL, etc. L will help you find the right resource where you can find the answers to your questions. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman =back =head1 Authors =over =item * Stas Bekman =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/install/0000755000104000010010000000000012540623200017332 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/install/install.pod0000644000104000010010000004610012540623200021505 0ustar AdministratorsNone=head1 NAME Installing mod_perl 2.0 =head1 Description This chapter provides an in-depth mod_perl 2.0 installation coverage. =head1 Prerequisites Before building mod_perl 2.0 you need to have its prerequisites installed. If you don't have them, download and install them first, using the information in the following sections. Otherwise proceed directly to the mod_perl building instructions. The mod_perl 2.0 prerequisites are: =over =item * Apache Apache 2.0 is required. mod_perl 2.0 B work with Apache 1.3. L (DSO) mod_perl build requires Apache 2.0.47 or higher. L build requires Apache 2.0.51 or higher. =item * Perl =over =item Prefork MPM Requires at least Perl version 5.6.1. You don't need to have threads-support enabled in Perl. If you do have it, it B be I and not I<5005threads>! If you have: % perl5.8.0 -V:use5005threads use5005threads='define'; you must rebuild Perl without threads enabled or with C<-Dusethreads>. Remember that threads-support slows things down and on some platforms it's unstable (e.g., FreeBSD), so don't enable it unless you really need it. =item 64 bit Linux If while running C while building mod_perl 2 you get an error like this: /usr/bin/ld: /usr/local/lib/perl5/5.10.1/x86_64-linux/CORE/libperl.a(op.o): \ relocation R_X86_64_32S against `PL_sv_yes' can not be used when making a shared \ object; recompile with -fPIC /usr/local/lib/perl5/5.10.1/x86_64-linux/CORE/libperl.a: could not read symbols: Bad \ value You're likely on 64 bit Linux and will need to build Perl for that platform. You can do so by running Perl's C with the C<$CFLAGS> environment variable and the C<-A> and C options. So if you normally build Perl with: % ./Configure -des You would instead configure with: % CFLAGS='-m64 -mtune=nocona' ./Configure -des -A ccflags=-fPIC =item Threaded MPMs Require at least Perl version 5.8.0 with ithreads support built-in. That means that it should report: % perl5.8.0 -V:useithreads -V:usemultiplicity useithreads='define'; usemultiplicity='define'; If that's not what you see rebuild Perl with C<-Dusethreads>. =item Static prefork build Perl with ithreads support version 5.6.1 or higher Perl without ithreads support version 5.8.2 or higher =item Static non-prefork build Perl with ithreads support version 5.8.0 or higher =item threads.pm If you want to run applications that take benefit of Perl's I Perl version 5.8.1 or higher w/ithreads enabled is required. Perl 5.8.0's I doesn't work with mod_perl 2.0. =back =item * CPAN Perl Modules The mod_perl 2.0 test suite has several requirements on its own. If you don't satisfy them, the tests depending on these requirements will be skipped, which is OK, but you won't get to run these tests and potential problems, which may exhibit themselves in your own code, could be missed. We don't require them from C, which could have been automated the requirements installation, in order to have less dependencies to get mod_perl 2.0 installed. Also if your code uses any of these modules, chances are that you will need to use at least the version numbers listed here. =over =item CGI.pm 3.11 =item Compress::Zlib 1.09 =back Though the easiest way to satisfy all the dependencies is to install C available from CPAN. =back =head2 Downloading Stable Release Sources If you are going to install mod_perl on a production site, you want to use the officially released stable components. Since the latest stable versions change all the time you should check for the latest stable version at the listed below URLs: =over =item Perl Download from: I This direct link which symlinks to the latest release should work too: I. For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. =item Apache Download from: I For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. =back =head2 Getting Bleeding Edge Sources If you really know what you are doing you can use the cvs/svn versions of the components. Chances are that you don't want to them on a production site. You have been warned! =over =item Perl The cutting edge version of Perl (aka bleadperl or bleedperl) is only generally available through an rsync repository maintained by ActiveState: # (--delete to ensure a clean state) % rsync -acvz --delete --force \ rsync://public.activestate.com/perl-current/ perl-current If you are re-building Perl after rsync-ing, make sure to cleanup first: % make distclean before running C<./Configure>. You'll also want to install (at least) LWP if you want to fully test mod_perl. You can install LWP with C shell: % perl -MCPAN -e 'install("LWP")' For more details on bleadperl, see I. =item Apache See L. =back =head2 Configuring and Installing Prerequisites If you don't have the prerequisites installed yet, install them now. =head3 Perl % cd perl-5.8.x % ./Configure -des If you L, run: % ./Configure -des -Dusethreads Most likely you don't want perl-support for threads enabled, in which case pass: C<-Uusethreads> instead of C<-Dusethreads>. If you want to debug mod_perl segmentation faults, add the following I<./Configure> options: -Doptimize='-g' -Dusedevel Now build it: % make && make test && make install =head3 Apache You need to have Apache built and installed prior to building mod_perl, only if you intend build a DSO mod_perl. If you intend to build a statically linked Apache+mod_perl, you only need to have the Apache source available (mod_perl will build and install Apache for you), you should skip this step. % cd httpd-2.x.xx % ./configure --prefix=$HOME/httpd/prefork --with-mpm=prefork % make && make install Starting from 2.0.49, the Apache logging API escapes everything that goes to F, therefore if you're annoyed by this feature during the development phase (as your error messages will be all messed up) you can disable the escaping during the Apache build time: % CFLAGS="-DAP_UNSAFE_ERROR_LOG_UNESCAPED" ./configure ... Do B use that CFLAGS in production unless you know what you are doing. =head1 Installing mod_perl from Binary Packages As of this writing only the binaries for the Win32 platform are available, kindly prepared and maintained by Randy Kobes. See the documentation on L for details. Some RPM packages can be found using rpmfind services, e.g.: http://www.rpmfind.net/linux/rpm2html/search.php?query=mod_perl&submit=Search+... However if you have problems using them, you have to contact those who have created them. =head1 Installing mod_perl from Source Building from source is the best option, because it ensures a binary compatibility with Apache and Perl. However it's possible that your distribution provides a solid binary mod_perl 2.0 package. For Win32 specific details, see the documentation on L. =head2 Downloading the mod_perl Source First download the mod_perl source. =over =item Stable Release Download from I or your favorite CPAN mirror. This direct link which symlinks to the latest release should work too: I. For the purpose of examples in this chapter we will use the package named I, where I should be replaced with the real version number. Open the package with: % tar -xvzf mod_perl-2.x.x.tar.gz or an equivalent command. =item Development Version See L. =back =head2 Configuring mod_perl To build mod_perl, you B also use the same compiler that Perl was built with. You can find that out by running C and looking at the C section. Like any other Perl module, mod_perl is configured via the I file, but requires one or more configuration options: % cd modperl-2.x.x % perl Makefile.PL where I is an optional list of key/value pairs. These options can include all the usual options supported by C (e.g., C, C, etc.). The following sections give the details about all the available options, but let's mention first an important one. Configuration options are discussed in L. =head3 Dynamic mod_perl Before you proceed, make sure that Apache 2.0 has been built and installed. mod_perl B be built before that. It seems that most users use pre-packaged Apache installation, most of which tend to spread the Apache files across many directories (i.e. not using --enable-layout=Apache, which puts all the files under the same directory). If Apache 2.0 files are spread under different directories, you need to use at least the C> option, which should be set to a full path to the C executable. For example: % perl Makefile.PL MP_APXS=/path/to/apxs For example RedHat Linux system installs the C binary, the C and C scripts (the latter two are needed to build mod_perl) all in different locations, therefore they configure mod_perl 2.0 as: % perl Makefile.PL MP_APXS=/path/to/apxs \ MP_APR_CONFIG=/another/path/to/apr-config However a correctly built Apache shouldn't require the C> option, since C> should provide the location of this script. If however all Apache 2.0 files were installed under the same directory, mod_perl 2.0's build only needs to know the path to that directory, passed via the C> option: % perl Makefile.PL MP_AP_PREFIX=$HOME/httpd/prefork =head3 Static mod_perl Before you proceed make sure that Apache 2.0 has been downloaded and extracted. mod_perl B be built before that. If this is an svn checkout and not an official distribution tarball, you need to first run: % cd httpd-2.0 % ./buildconf To enable statically linking mod_perl into Apache, use the C> flag like this: % perl Makefile.PL MP_USE_STATIC=1 \ MP_AP_PREFIX=$HOME/src/httpd-2.x \ MP_AP_CONFIGURE="--with-mpm=prefork" C> B point to an extracted Apache 2.0 source tree. This will configure Apache by passing C> to Apache's F<./configure> script. Here is an example: % cd ~/src % tar -xvzf perl-5.8.x.tar.gz % cd perl-5.8.x % ./Configure -des % make install % cd .. % tar -xvzf httpd-2.0.xx.tar.gz % tar -xvzf mod_perl-2.x.x.tar.gz % perl5.8.x Makefile.PL \ MP_USE_STATIC=1 \ MP_AP_PREFIX="$HOME/src/httpd-2.0.xx" \ MP_AP_CONFIGURE="--with-mpm=prefork" % make % make test % make install % ./httpd -l | grep perl mod_perl.c =head2 mod_perl Build Options =head3 Boolean Build Options The following options are boolean and can be set with C or unset with C, where XXX is the name of the option. =head4 MP_PROMPT_DEFAULT Accept default values for all would-be prompts. =head4 MP_GENERATE_XS Generate XS code from parsed source headers in I. Default is 1, set to 0 to disable. =head4 MP_USE_DSO Build mod_perl as a DSO (I). This is the default. =head4 MP_USE_STATIC Build static mod_perl (I). =head4 MP_STATIC_EXTS Build C as static extensions. =head4 MP_USE_GTOP Link with I and enable I reporting. =head4 MP_COMPAT_1X C or a lack of it enables several mod_perl 1.0 back-compatibility features, which are deprecated in mod_perl 2.0. It's enabled by default, but can be disabled with C during the build process. When this option is disabled, the following things will happen: =over =item * Deprecated special variable, C<$Apache2::__T> won't be available. Use C<${^TAINT}> instead. =item * I<$ServerRoot> and I<$ServerRoot/lib/perl> won't be appended to C<@INC>. Instead use: PerlSwitches -I/path/to/server -I/path/to/server/lib/perl in I or: use Apache2::ServerUtil (); use File::Spec::Functions qw(catfile); push @INC, catfile Apache2::ServerUtil::server_root, ""; push @INC, catfile Apache2::ServerUtil::server_root, "lib/perl"; in I. =item * The following deprecated configuration directives won't be recognized by Apache: PerlSendHeader PerlSetupEnv PerlHandler PerlTaintCheck PerlWarn Use L instead. =back =head4 MP_DEBUG Turn on debugging (C<-g -lperld>) and tracing. =head4 MP_MAINTAINER Enable maintainer compile mode, which sets C and adds the following C flags: -DAP_DEBUG -Wall -Wmissing-prototypes -Wstrict-prototypes \ -Wmissing-declarations \ If gcc version 3.3.2+ is found, not compiling on OpenBSD, and C<-Wdeclaration-after-statement> is not already part of the C flags add it. To use this mode Apache must be build with C<--enable-maintainer-mode>. =head4 MP_TRACE Enable tracing =head3 Non-Boolean Build Options set the non-boolean options with MP_XXX=value. =head4 MP_APXS Path to C. For example if you've installed Apache 2.0 under I as DSO, the default location would be I. =head4 MP_AP_CONFIGURE The command-line arguments to pass to httpd's configure script. =head4 MP_AP_PREFIX Apache installation prefix, under which the I directory with Apache C header files can be found. For example if you've installed Apache 2.0 in directory I<\Apache2> on Win32, you should use: MP_AP_PREFIX=\Apache2 If Apache is not installed yet, you can point to the Apache 2.0 source directory, but only after you've built or configured Apache in it. For example: MP_AP_PREFIX=/home/stas/apache.org/httpd-2.0 Though in this case C won't automatically find C, therefore you should run C instead and pass the location of C or C, e.g.: % t/TEST -apxs /home/stas/httpd/prefork/bin/apxs or % t/TEST -httpd /home/stas/httpd/prefork/bin/httpd =head4 MP_AP_DESTDIR This option exists to make the lives of package maintainers easier. If you aren't a package manager you should not need to use this option. Apache installation destination directory. This path will be prefixed to the installation paths for all Apache-specific files during C. For instance, if Apache modules are normally installed into I and C is set to I, the I will be installed in: /tmp/foo/path/to/httpd-2.0/modules/mod_perl.so =head4 MP_APR_CONFIG If APR wasn't installed under the same file tree as httpd, you may need to tell the build process where it can find the executable C, which can then be used to figure out where the apr and aprutil I and I directories can be found. =head4 MP_CCOPTS Add to compiler flags, e.g.: MP_CCOPTS=-Werror (Notice that C<-Werror> will work only with the Perl version 5.7 and higher.) =head4 MP_OPTIONS_FILE Read build options from given file. e.g.: MP_OPTIONS_FILE=~/.my_mod_perl2_opts =head4 MP_APR_LIB On Win32, in order to build the APR and APR::* modules so as to be independent of mod_perl.so, a static library is first built containing the needed functions these modules link into. The option MP_APR_LIB=aprext specifies the name that this library has. The default used is C. This option has no effect on platforms other than Win32, as they use a different mechanism to accomplish the decoupling of APR and APR::* from mod_perl.so. =head3 mod_perl-specific Compiler Options =head4 -DMP_IOBUFSIZE Change the default mod_perl's 8K IO buffer size, e.g. to 16K: MP_CCOPTS=-DMP_IOBUFSIZE=16384 =head3 mod_perl Options File Options can also be specified in the file I or I<.makepl_args.mod_perl2>. The file can be placed under C<$ENV{HOME}>, the root of the source package or its parent directory. So if you unpack the mod_perl source into I and your home is I, the file will be searched in: /tmp/mod_perl-2.x/makepl_args.mod_perl2 /tmp/makepl_args.mod_perl2 /home/foo/makepl_args.mod_perl2 /tmp/mod_perl-2.x/.makepl_args.mod_perl2 /tmp/.makepl_args.mod_perl2 /home/foo/.makepl_args.mod_perl2 If the file specified in C is found the I will be ignored. Options specified on the command line override those from I and those from C. If your terminal supports colored text you may want to set the environment variable C to 1 to enable the colored tracing which makes it easier to tell the reported errors and warnings, from the rest of the notifications. =head2 Re-using Configure Options Since mod_perl remembers what build options were used to build it if first place, you can use this knowledge to rebuild itself using the same options. Simply C to the mod_perl source directory and run: % cd modperl-2.x. % perl -MApache2::Build -e rebuild =head2 Compiling mod_perl Next stage is to build mod_perl: % make =head2 Testing mod_perl When mod_perl has been built, it's very important to test that everything works on your machine: % make test If something goes wrong with the test phase and want to figure out how to run individual tests and pass various options to the test suite, see the corresponding sections of L or the L tutorial. =head2 Installing mod_perl Once the test suite has passed, it's a time to install mod_perl. % make install If you install mod_perl system wide, you probably need to become I prior to doing the installation: % su # make install =head1 If Something Goes Wrong If something goes wrong during the installation, try to repeat the installation process from scratch, while verifying all the steps with this document. If the problem persists L. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =item * Doug MacEachern Edougm (at) covalent.netE =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/intro/0000755000104000010010000000000012540623200017017 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/intro/overview.pod0000644000177200010010000006512312540623200017477 0ustar SteveNone=head1 NAME Overview of mod_perl 2.0 =head1 Description This chapter should give you a general idea about what mod_perl 2.0 is and how it differs from mod_perl 1.0. This chapter presents the new features of Apache 2.0, Perl 5.6.0 -- 5.8.0 and their influence on mod_perl 2.0. The new MPM models from Apache 2.0 are also discussed. =head1 Version Naming Conventions In order to keep things simple, here and in the rest of the documentation we refer to mod_perl 1.x series as mod_perl 1.0 and to 2.0.x series as mod_perl 2.0. Similarly we call Apache 1.3.x series as Apache 1.3 and 2.0.x as Apache 2.0. There is also Apache 2.1, which is a development track towards Apache 2.2. =head1 Why mod_perl, The Next Generation mod_perl was introduced in early 1996, both Perl and Apache have changed a great deal since that time. mod_perl has adjusted to both along the way over the past 4 and a half years or so using the same code base. Over this course of time, the mod_perl sources have become more and more difficult to maintain, in large part to provide compatibility between the many different flavors of Apache and Perl. And, compatibility across these versions and flavors is a more difficult goal for mod_perl to reach that a typical Apache or Perl module, since mod_perl reaches a bit deeper into the corners of Apache and Perl internals than most. Discussions of the idea to rewrite mod_perl as version 2.0 started in 1998, but never made it much further than an idea. When Apache 2.0 development was underway it became clear that a rewrite of mod_perl would be required to adjust to the new Apache architecture and API. Of the many changes happening in Apache 2.0, the one which has the most significant impact on mod_perl is the introduction of threads to the overall design. Threads have been a part of Apache on the win32 side since the Apache port was introduced. The mod_perl port to win32 happened in version 1.00b1, released in June of 1997. This port enabled mod_perl to compile and run in a threaded windows environment, with one major caveat: only one concurrent mod_perl request could be handled at any given time. This was due to the fact that Perl did not introduce thread-safe interpreters until version 5.6.0, released in March of 2000. Contrary to popular belief, the "threads support" implemented in Perl 5.005 (released July 1998), did not make Perl thread-safe internally. Well before that version, Perl had the notion of "Multiplicity", which allowed multiple interpreter instances in the same process. However, these instances were not thread safe, that is, concurrent callbacks into multiple interpreters were not supported. It just so happens that the release of Perl 5.6.0 was nearly at the same time as the first alpha version of Apache 2.0. The development of mod_perl 2.0 was underway before those releases, but as both Perl 5.6.0 and Apache 2.0 were reaching stability, mod_perl 2.0 was becoming more of a reality. In addition to the adjustments for threads and Apache 2.0 API changes, this rewrite of mod_perl is an opportunity to clean up the source tree. This includes both removing the old backward compatibility bandaids and building a smarter, stronger and faster implementation based on lessons learned over the 4.5 years since mod_perl was introduced. The new version includes a mechanism for the automatic building of the Perl interface to Apache API, which allowed us to easily adjust mod_perl 2.0 to the ever changing Apache 2.0 API, during its development period. Another important feature is the C> framework, which was originally developed for mod_perl 2.0, but then was adopted by Apache 2.0 developers to test the core server features and third party modules. Moreover the tests written using the C> framework could be run with Apache 1.0 and 2.0, assuming that both supported the same features. There are multiple other interesting changes that have already happened to mod_perl in version 2.0 and more will be developed in the future. Some of these are discussed in this chapter, others can be found in the rest of the mod_perl 2.0 documentation. =head1 What's new in Apache 2.0 Apache 2.0 has introduced numerous new features and enhancements. Here are the most important new features: =over =item * I (APR) Apache 1.3 has been ported to a very large number of platforms including various flavors of unix, win32, os/2, the list goes on. However, in 1.3 there was no clear-cut, pre-designed portability layer for third-party modules to take advantage of. APR provides this API layer in a very clean way. APR assists a great deal with mod_perl portability. Combined with the portablity of Perl, mod_perl 2.0 needs only to implement a portable build system, the rest comes "for free". A Perl interface is provided for certain areas of APR, such as the shared memory abstraction, but the majority of APR is used by mod_perl "under the covers". The APR uses the concept of memory pools, which significantly simplifies the memory management code and reduces the possibility of having memory leaks, which always haunt C programmers. =item * I/O Filtering Filtering of Perl modules output has been possible for years since tied filehandle support was added to Perl. There are several modules, such as C and C which have been written to provide mechanisms for filtering the C stream. There are several of these modules because no one's approach has quite been able to offer the ease of use one would expect, which is due simply to limitations of the Perl tied filehandle design. Another problem is that these filters can only filter the output of other Perl modules. C modules in Apache 1.3 send data directly to the client and there is no clean way to capture this stream. Apache 2.0 has solved this problem by introducing a filtering API. With the baseline I/O stream tied to this filter mechansim, any module can filter the output of any other module, with any number of filters in between. Using this new feature things like SSL, data (de-)compression and other data manipulations are done very easily. =item * I (MPMs). In Apache 1.3 concurrent requests were handled by multiple processes, and the logic to manage these processes lived in one place, I, 7700 some odd lines of code. If Apache 1.3 is compiled on a Win32 system large parts of this source file are redefined to handle requests using threads. Now suppose you want to change the way Apache 1.3 processes requests, say, into a DCE RPC listener. This is possible only by slicing and dicing I into more pieces or by redefining the I function, with a C<-DSTANDALONE_MAIN=your_function> compile time flag. Neither of which is a clean, modular mechanism. Apache-2.0 solves this problem by introducing I, better known as I. The task of managing incoming requests is left to the MPMs, shrinking I to less than 500 lines of code. Now it's possible to write different processing modules specific to various platforms. For example the Apache 2.0 on Windows is much more efficient now, since it uses I which deploys the native Windows features. Here is a partial list of major MPMs available as of this writing. =over =item prefork The I MPM emulates Apache 1.3's preforking model, where each request is handled by a different forked child process. =item worker The I MPM implements a hybrid multi-process multi-threaded approach based on the I standard. It uses one acceptor thread, multiple worker threads. =item mpmt_os2, netware, winnt and beos These MPMs also implement the hybrid multi-process/multi-threaded model, with each based on native OS thread implementations. =item perchild The I MPM is similar to the I MPM, but is extended with a mechanism which allows mapping of requests to virtual hosts to a process running under the user id and group configured for that host. This provides a robust replacement for the I mechanism. META: as of this writing this mpm is not working =back On platforms that support more than one MPM, it's possible to switch the used MPMs as the need change. For example on Unix it's possible to start with a preforked module. Then when the demand is growing and the code matures, it's possible to migrate to a more efficient threaded MPM, assuming that the code base is capable of running in the L. =item * Protocol Modules Apache 1.3 is hardwired to speak only one protocol, HTTP. Apache 2.0 has moved to more of a "server framework" architecture making it possible to plugin handlers for protocols other than HTTP. The protocol module design also abstracts the transport layer so protocols such as SSL can be hooked into the server without requiring modifications to the Apache source code. This allows Apache to be extended much further than in the past, making it possible to add support for protocols such as FTP, SMTP, RPC flavors and the like. The main advantage being that protocol plugins can take advantage of Apache's portability, process/thread management, configuration mechanism and plugin API. =item * Parsed Configuration Tree When configuration files are read by Apache 1.3, it hands off the parsed text to module configuration directive handlers and discards that text afterwards. With Apache 2.0, the configuration files are first parsed into a tree structure, which is then walked to pass data down to the modules. This tree is then left in memory with an API for accessing it at request time. The tree can be quite useful for other modules. For example, in 1.3, mod_info has its own configuration parser and parses the configuration files each time you access it. With 2.0 there is already a parse tree in memory, which mod_info can then walk to output its information. If a mod_perl 1.0 module wants access to configuration information, there are two approaches. A module can "subclass" directive handlers, saving a copy of the data for itself, then returning B so the other modules are also handed the info. Or, the C<$Apache2::PerlSections::Save> variable can be set to save EPerlE configuration in the C<%Apache2::ReadConfig::> namespace. Both methods are rather kludgy, version 2.0 provides a L. =back All these new features boost the Apache performance, scalability and flexibility. The APR helps the overall performance by doing lots of platform specific optimizations in the APR internals, and giving the developer the API which was already greatly optimized. Apache 2.0 now includes special modules that can boost performance. For example the mod_mmap_static module loads webpages into the virtual memory and serves them directly avoiding the overhead of I and I system calls to pull them in from the filesystem. The I/O layering is helping performance too, since now modules don't need to waste memory and CPU cycles to manually store the data in shared memory or I in order to pass the data to another module, e.g., in order to provide response's gzip compression. And of course a not least important impact of these features is the simplification and added flexibility for the core and third party Apache module developers. =head1 What's new in Perl 5.6.0 - 5.8.0 As we have mentioned earlier Perl 5.6.0 is the minimum requirement for mod_perl 2.0. Though as we will see later certain new features work only with Perl 5.8.0 and higher. These are the important changes in the recent Perl versions that had an impact on mod_perl. For a complete list of changes see the corresponding to the used version I manpages (I, I and I). The 5.6 Perl generation has introduced the following features: =over =item * The beginnings of support for running multiple interpreters concurrently in different threads. In conjunction with the perl_clone() API call, which can be used to selectively duplicate the state of any given interpreter, it is possible to compile a piece of code once in an interpreter, clone that interpreter one or more times, and run all the resulting interpreters in distinct threads. See the I (I) and I (I) manpages. =item * The core support for declaring subroutine attributes, which is used by mod_perl 2.0's I. See the I manpage. =item * The I pragma, which allows to force the code to be super clean, via the setting: use warnings FATAL => 'all'; which will abort any code that generates warnings. This pragma also allows a fine control over what warnings should be reported. See the I (I) manpage. =item * Certain C functions now can be overridden via C namespace. For example mod_perl now can override C via C. See the I (I) manpage. =item * The C extension as a simpler alternative to C. See the I manpage. =item * The large file support. If you have filesystems that support "large files" (files larger than 2 gigabytes), you may now also be able to create and access them from Perl. See the I (I) manpage. =item * Multiple performance enhancements were made. See the I (I) manpage. =item * Numerous memory leaks were fixed. See the I (I) manpage. =item * Improved security features: more potentially unsafe operations taint their results for improved security. See the I (I) and I (I) manpages. =item * Available on new platforms: GNU/Hurd, Rhapsody/Darwin, EPOC. =back Overall multiple bugs and problems very fixed in the Perl 5.6.1, so if you plan on running the 5.6 generation, you should run at least 5.6.1. It is possible that when this tutorial is printed 5.6.2 will be out. The Perl 5.8.0 has introduced the following features: =over =item * The introduced in 5.6.0 experimental PerlIO layer has been stabilized and become the default IO layer in 5.8.0. Now the IO stream can be filtered through multiple layers. See the I (I) and I (I) manpages. For example this allows mod_perl to inter-operate with the APR IO layer and even use the APR IO layer in Perl code. See the C> manpage. Another example of using the new feature is the extension of the C functionality to create anonymous temporary files via: open my $fh, "+>", undef or die $!; That is a literal C, not an undefined value. See the C entry in the I manpage (I). =item * More overridable via C keywords. See the I (I) manpage. =item * The signal handling in Perl has been notoriously unsafe because signals have been able to arrive at inopportune moments leaving Perl in inconsistent state. Now Perl delays signal handling until it is safe. =item * C was added to allow a creation of temporary files and directories in an easy, portable, and secure way. See the I manpage. =item * A new command-line option, C<-t> is available. It is the little brother of C<-T>: instead of dying on taint violations, lexical warnings are given. This is only meant as a temporary debugging aid while securing the code of old legacy applications. B.> See the I (I) manpage. A new special variable C<${^TAINT}> was introduced. It indicates whether taint mode is enabled. See the I (I) manpage. =item * Threads implementation is much improved since 5.6. =item * A much better support for Unicode. =item * Numerous bugs and memory leaks fixed. For example now you can localize the tied C filehandles without leaking memory. =item * Available on new platforms: AtheOS, Mac OS Classic, Mac OS X, MinGW, NCR MP-RAS, NonStop-UX, NetWare and UTS. The following platforms are again supported: BeOS, DYNIX/ptx, POSIX-BC, VM/ESA, z/OS (OS/390). =back =head1 What's new in mod_perl 2.0 The new features introduced by Apache 2.0 and Perl 5.6 and 5.8 generations provide the base of the new mod_perl 2.0 features. In addition mod_perl 2.0 re-implements itself from scratch providing such new features as new build and testing framework. Let's look at the major changes since mod_perl 1.0. =head2 Threads Support In order to adapt to the Apache 2.0 threads architecture (for threaded MPMs), mod_perl 2.0 needs to use thread-safe Perl interpreters, also known as "ithreads" (Interpreter Threads). This mechanism can be enabled at compile time and ensures that each Perl interpreter uses its private C structure for storing its symbol tables, stacks and other Perl runtime mechanisms. When this separation is engaged any number of threads in the same process can safely perform concurrent callbacks into Perl. This of course requires each thread to have its own C object, or at least that each instance is only accessed by one thread at any given time. The first mod_perl generation has only a single C, which is constructed by the parent process, then inherited across the forks to child processes. mod_perl 2.0 has a configurable number of C and two classes of interpreters, I and I. A I is like that in mod_perl 1.0, where the main interpreter created at startup time compiles any pre-loaded Perl code. A I is created from the parent using the Perl API I (I) function. At request time, I interpreters are only used for making more I, as the I are the interpreters which actually handle requests. Care is taken by Perl to copy only mutable data, which means that no runtime locking is required and read-only data such as the syntax tree is shared from the I, which should reduce the overall mod_perl memory footprint. Rather than create a C per-thread by default, mod_perl creates a pool of interpreters. The pool mechanism helps cut down memory usage a great deal. As already mentioned, the syntax tree is shared between all cloned interpreters. If your server is serving more than mod_perl requests, having a smaller number of PerlInterpreters than the number of threads will clearly cut down on memory usage. Finally and perhaps the biggest win is memory re-use: as calls are made into Perl subroutines, memory allocations are made for variables when they are used for the first time. Subsequent use of variables may allocate more memory, e.g. if a scalar variable needs to hold a longer string than it did before, or an array has new elements added. As an optimization, Perl hangs onto these allocations, even though their values "go out of scope". mod_perl 2.0 has a much better control over which PerlInterpreters are used for incoming requests. The interpreters are stored in two linked lists, one for available interpreters and another for busy ones. When needed to handle a request, one interpreter is taken from the head of the available list and put back into the head of the same list when done. This means if for example you have 10 interpreters configured to be cloned at startup time, but no more than 5 are ever used concurrently, those 5 continue to reuse Perl's allocations, while the other 5 remain much smaller, but ready to go if the need arises. Various attributes of the pools are configurable using L. The interpreters pool mechanism has been abstracted into an API known as "tipool", I. This pool can be used to manage any data structure, in which you wish to have a smaller number than the number of configured threads. For example a replacement for C based on the I will allow to reuse database connections between multiple threads of the same process. =head2 Thread-environment Issues While mod_perl itself is thread-safe, you may have issues with the thread-safety of your code. For more information refer to L. Another issue is that "global" variables are only global to the interpreter in which they are created. It's possible to share variables between several threads running in the same process. For more information see: L. =head2 Perl Interface to the APR and Apache APIs As we have mentioned earlier, Apache 2.0 uses two APIs: =over =item * the Apache Portable APR (APR) API, which implements a portable and efficient API to handle generically work with files, sockets, threads, processes, shared memory, etc. =item * the Apache API, which handles issues specific to the web server. =back In mod_perl 1.0, the Perl interface back into the Apache API and data structures was done piecemeal. As functions and structure members were found to be useful or new features were added to the Apache API, the XS code was written for them here and there. mod_perl 2.0 generates the majority of XS code and provides thin wrappers where needed to make the API more Perlish. As part of this goal, nearly the entire APR and Apache API, along with their public data structures are covered from the get-go. Certain functions and structures which are considered "private" to Apache or otherwise un-useful to Perl aren't glued. Most of the API behaves just as it did in mod_perl 1.0, so users of the API will not notice the difference, other than the addition of many new methods. Where API has changed a special L can be used. In mod_perl 2.0 the APR API resides in the C namespace, and obviously the C namespace is mapped to the Apache API. And in the case of C, it is possible to use C modules outside of Apache, for example: % perl -MAPR -MAPR::UUID -le 'print APR::UUID->new->format' b059a4b2-d11d-b211-bc23-d644b8ce0981 The mod_perl 2.0 generator is a custom suite of modules specifically tuned for gluing Apache and allows for complete control over I, providing many possibilities none of I, I or I are designed to do. Advantages to generating the glue code include: =over 4 =item * Not tied tightly to xsubpp =item * Easy adjustment to Apache 2.0 API/structure changes =item * Easy adjustment to Perl changes (e.g., Perl 6) =item * Ability to "discover" hookable third-party C modules. =item * Cleanly take advantage of features in newer Perls =item * Optimizations can happen across-the-board with one-shot =item * Possible to AUTOLOAD XSUBs =item * Documentation can be generated from code =item * Code can be generated from documentation =back =head1 Integration with 2.0 Filtering The mod_perl 2.0 interface to the Apache filter API comes in two flavors. First, similar to the C API, where bucket brigades need to be manipulated. Second, streaming filtering, is much simpler than the C API, since it hides most of the details underneath. For a full discussion on filters and implementation examples refer to the L chapter. =head2 Other New Features In addition to the already mentioned new features, the following are of a major importance: =over =item * Apache 2.0 protocol modules are supported. Later we will see an example of a protocol module running on top of mod_perl 2.0. =item * mod_perl 2.0 provides a very simply to use interface to the Apache filtering API. We will present a filter module example later on. =item * A feature-full and flexible C> framework was developed especially for mod_perl testing. While used to test the core mod_perl features, it is used by third-party module writers to easily test their modules. Moreover C> was adopted by Apache and currently used to test both Apache 1.3, 2.0 and other ASF projects. Anything that runs top of Apache can be tested with C>, be the target written in Perl, C, PHP, etc. =item * The support of the new MPMs model makes mod_perl 2.0 can scale better on wider range of platforms. For example if you've happened to try mod_perl 1.0 on Win32 you probably know that the requests had to be serialized, i.e. only a single request could be processed at a time, rendering the Win32 platform unusable with mod_perl as a heavy production service. Thanks to the new Apache MPM design, now mod_perl 2.0 can be used efficiently on Win32 platforms using its native I MPM. =back =head2 Optimizations The rewrite of mod_perl gives us the chances to build a smarter, stronger and faster implementation based on lessons learned over the 4.5 years since mod_perl was introduced. There are optimizations which can be made in the mod_perl source code, some which can be made in the Perl space by optimizing its syntax tree and some a combination of both. In this section we'll take a brief look at some of the optimizations that are being considered. The details of these optimizations from the most part are hidden from mod_perl users, the exception being that some will only be turned on with configuration directives. A few of which include: =over 4 =item * "Compiled" C =item * Inlined C calls =item * Use of Apache pools for memory allocations =back =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Doug MacEachern Edougm (at) covalent.netE =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/intro/start_fast.pod0000644000177200010010000001363112540623200020000 0ustar SteveNone=head1 NAME Getting Your Feet Wet with mod_perl =head1 Description This chapter gives you the bare minimum information to get you started with mod_perl 2.0. For most people it's sufficient to get going. =head1 Installation If you are a Win32 user, please refer to the L. First, L the mod_perl 2.0 source. Before installing mod_perl, you need to check that you have the L B. Apache and the right Perl version have to be built and installed B you can proceed with building mod_perl. In this chapter we assume that httpd and all helper files were installed under I<$HOME/httpd/prefork>, if your distribution doesn't install all the files under the same tree, please refer to L. Now, configure mod_perl: % tar -xvzf mod_perl-2.x.xx.tar.gz % cd modperl-2.0 % perl Makefile.PL MP_APXS=$HOME/httpd/prefork/bin/apxs where C is the full path to the C executable, normally found in the same directory as the C executable, but could be put in a different path as well. Finally, build, test and install mod_perl: % make && make test && make install Become I before doing C if installing system-wide. If something goes wrong or you need to enable optional features please refer to L. =head1 Configuration If you are a Win32 user, please refer to the L. Enable mod_perl built as DSO, by adding to I: LoadModule perl_module modules/mod_perl.so There are many other configuration options which you can find in the L. If you want to run mod_perl 1.0 code on mod_perl 2.0 server enable the compatibility layer: PerlModule Apache2::compat For more information see: L. =head1 Server Launch and Shutdown Apache is normally launched with C: % $HOME/httpd/prefork/bin/apachectl start and shut down with: % $HOME/httpd/prefork/bin/apachectl stop Check I<$HOME/httpd/prefork/logs/error_log> to see that the server has started and it's a right one. It should say something similar to: [Fri Jul 22 09:39:55 2005] [notice] Apache/2.0.55-dev (Unix) mod_ssl/2.0.55-dev OpenSSL/0.9.7e DAV/2 mod_perl/2.0.2-dev Perl/v5.8.7 configured -- resuming normal operations =head1 Registry Scripts To enable registry scripts add the following to I: Alias /perl/ /home/httpd/httpd-2.0/perl/ SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders Options +ExecCGI Order allow,deny Allow from all and now assuming that we have the following script: #!/usr/bin/perl print "Content-type: text/plain\n\n"; print "mod_perl 2.0 rocks!\n"; saved in I. Make the script executable and readable by everybody: % chmod a+rx /home/httpd/httpd-2.0/perl/rock.pl Of course the path to the script should be readable by the server too. In the real world you probably want to have a tighter permissions, but for the purpose of testing that things are working this is just fine. Now restart the server and issue a request to I and you should get the response: mod_perl 2.0 rocks! If that didn't work check the I file. For more information on the registry scripts refer to the C> manpage. (XXX: one day there will a tutorial on registry, should port it from 1.0's docs). =head1 Handler Modules Finally check that you can run mod_perl handlers. Let's write a response handler similar to the registry script from the previous section: #file:MyApache2/Rocks.pm #---------------------- package MyApache2::Rocks; use strict; use warnings; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; $r->content_type('text/plain'); print "mod_perl 2.0 rocks!\n"; return Apache2::Const::OK; } 1; Save the code in the file I, somewhere where mod_perl can find it. For example let's put it under I, and we tell mod_perl that I is in C<@INC>, via a startup file which includes just: use lib qw(/home/httpd/httpd-2.0/perl); 1; and loaded from I: PerlRequire /home/httpd/httpd-2.0/perl/startup.pl Now we can configure our module in I: SetHandler perl-script PerlResponseHandler MyApache2::Rocks Now restart the server and issue a request to I and you should get the response: mod_perl 2.0 rocks! If that didn't work check the I file. =head1 Troubleshooting If after reading the complete L and L you are still having problems, take a look at the L. If the problem persist, please report them using the L. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/performance/0000755000104000010010000000000012540623200020165 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/performance/mpm.pod0000644000177200010010000001253312540623200017565 0ustar SteveNone=head1 NAME Performance Considerations Under Different MPMs =head1 Description This chapter discusses how to choose the right MPM to use (on platforms that have such a choice), and how to get the best performance out of it. Certain kind of applications may show a better performance when running under one mpm, but not the other. Results also may vary from platform to platform. CPAN module developers have to strive making their modules function correctly regardless the mpm they are being deployed under. However they may choose to indentify what MPM the code is running under and do better decisions better on this information, as long as it doesn't break the functionality for other platforms. For examples if a developer provides thread-unsafe code, the module will work correctly under the prefork mpm, but may malfunction under threaded mpms. =head1 Memory Requirements Since the very beginning mod_perl users have enjoyed the tremendous speed boost mod_perl was providing, but there is no free lunch -- mod_perl has quite big memory requirements, since it has to store the compiled code in the memory to avoid the code loading and recompilation overhead for each request. =head2 Memory Requirements in Prefork MPM For those familiar with mod_perl 1.0, mod_perl 2.0 has not much new to offer. We still rely on L, try to L and L using specially designed for that purpose tools. The new thing is that the core API has been spread across multiply modules, which can be loaded only when needed (this of course works only when mod_perl is built as DSO). This allows us to save some memory. However the savings are not big, since all these modules are writen in C, making them into the text segments of the memory, which is perfectly shared. The savings are more significant at the startup speed, since the startup time, when DSO modules are loaded, is growing almost quadratically as the number of loaded DSO modules grows (because of symbol relocations). =head2 Memory Requirements in Threaded MPM The threaded MPM is a totally new beast for mod_perl users. If you run several processes, the same memory sharing techniques apply, but usually you want to run as few processes as possible and to have as many threads as possible. Remember that mod_perl 2.0 allows you to have just a few Perl interpreters in the process which otherwise runs multiple threads. So using more threads doesn't mean using significantly more memory, if the maximum number of available Perl interpreters is limited. Even though memory sharing is not applicable inside the same process, mod_perl gets a significant memory saving, because Perl interpreters have a shared opcode tree. Similar to the preforked model, all the code that was loaded at the server startup, before Perl interpreters are cloned, will be shared. But there is a significant difference between the two. In the prefork case, the normal memory sharing applies: if a single byte of the memory page gets unshared, the whole page is unshared, meaning that with time less and less memory is shared. In the threaded mpm case, the opcode tree is shared and this doesn't change as the code runs. Moreover, since Perl Interpreter pools are used, and the FIFO model is used, if the pool contains three Perl interpreters, but only one is used at any given time, only that interpreter will be ever used, making the other two interpreters consuming very little memory. So if with prefork MPM, you'd think twice before loading mod_perl if all you need is trans handler, with threaded mpm you can do that without paying the price of the significanly increased memory demands. You can have 256 light Apache threads serving static requests, and let's say three Perl interpreters running quick trans handlers, or even heavy but infrequest dynamic requests, when needed. It's not clear yet, how one will be able to control the amount of running Perl interepreters, based on the memory consumption, because it's not possible to get the memory usage information per thread. However we are thinking about running a garbage collection thread which will cleanup Perl interpreters and occasionaly kill off the unused ones to free up used memory. =head1 Work with DataBases =head2 Work with DataBases under Prefork MPM C works as with mod_perl 1.0, to share database connections. =head2 Work with DataBases under Threaded MPM The current C should be usable under threaded mpm, though it doesn't share connections across threads. Each Perl interpreter has its own cache, just like in the prefork mpm. C is a work in progress, which should bring the sharing of database connections across threads of the same process. Watch the mod_perl and dbi-dev lists for updates on this work. Once C is completed it'll either replace C or will be used by it. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/performance/prevent.pod0000644000177200010010000000373012540623200020456 0ustar SteveNone=head1 NAME Preventive Measures for Performance Enhancement =head1 Description This chapter explains what should or should not be done in order to keep the performance high =head1 Memory Leakage L. =head2 Proper Memory Pools Usage Several mod_perl 2.0 APIs are using Apache memory pools for memory management. Mainly because the underlying C API requires that. So every time Apache needs to allocate memory it allocates it using the pool object that is passed as an argument. Apache doesn't frees allocated memory, this happens automatically when a pool ends its life. Different pools have different life lengths. Request pools (C<$r-Epool>) are destroyed at the end of each request. Connection pools (C<$c-Epool>) are destroyed when the connection is closed. Server pools C<$s-Epool>) and the global pools (accessible in the server startup phases, like C handlers) are destroyed only when the server exits. Therefore always use the pool of the shortest possible life if you can. Never use server pools during request, when you can use a request pool. For example inside an HTTP handler, don't call: my $dir = Apache2::ServerUtil::server_root_relative($s->process->pool, 'conf'); when you should call: my $dir = Apache2::ServerUtil::server_root_relative($r->pool, 'conf'); Of course on special occasions, you may want to have something allocated off the server pool if you want the allocated memory to survive through several subsequent requests or connections. But this is normally doesn't apply to the core mod_perl 2.0, but rather for 3rd party extensions. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/porting/0000755000104000010010000000000012540623200017346 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/porting/code/0000755000104000010010000000000012540623200020260 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/porting/code/apache_mp3_2.diff0000644000177200010010000001530512540623200021436 0ustar SteveNone--- Apache/MP3.pm.2 2003-06-06 15:17:22.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 15:16:21.000000000 +1000 @@ -55,6 +55,14 @@ my $NO = '^(no|false)$'; # regular expression my $YES = '^(yes|true)$'; # regular expression +sub get_config { + my $val = shift->r->dir_config(shift); + return defined $val ? $val : ''; +} + +sub config_yes { shift->get_config(shift) !~ /$YES/oi; } +sub config_no { shift->get_config(shift) !~ /$NO/oi; } + sub handler : method { my $class = shift; my $obj = $class->new(@_) or die "Can't create object: $!"; @@ -70,7 +78,7 @@ my @lang_tags; push @lang_tags,split /,\s+/,$r->header_in('Accept-language') if $r->header_in('Accept-language'); - push @lang_tags,$r->dir_config('DefaultLanguage') || 'en-US'; + push @lang_tags,$new->get_config('DefaultLanguage') || 'en-US'; $new->{'lh'} ||= Apache::MP3::L10N->get_handle(@lang_tags) @@ -343,7 +351,7 @@ my $file = $subr->filename; my $type = $subr->content_type; my $data = $self->fetch_info($file,$type); - my $format = $self->r->dir_config('DescriptionFormat'); + my $format = $self->get_config('DescriptionFormat'); if ($format) { $r->print('#EXTINF:' , $data->{seconds} , ','); (my $description = $format) =~ s{%([atfglncrdmsqS%])} @@ -1204,7 +1212,7 @@ # get fields to display in list of MP3 files sub fields { my $self = shift; - my @f = split /\W+/,$self->r->dir_config('Fields'); + my @f = split /\W+/,$self->get_config('Fields'); return map { lc $_ } @f if @f; # lower case return qw(title artist duration bitrate); # default } @@ -1340,7 +1348,7 @@ sub get_dir { my $self = shift; my ($config,$default) = @_; - my $dir = $self->r->dir_config($config) || $default; + my $dir = $self->get_config($config) || $default; return $dir if $dir =~ m!^/!; # looks like a path return $dir if $dir =~ m!^\w+://!; # looks like a URL return $self->default_dir . '/' . $dir; @@ -1348,22 +1356,22 @@ # return true if downloads are allowed from this directory sub download_ok { - shift->r->dir_config('AllowDownload') !~ /$NO/oi; + shift->config_no('AllowDownload'); } # return true if streaming is allowed from this directory sub stream_ok { - shift->r->dir_config('AllowStream') !~ /$NO/oi; + shift->config_no('AllowStream'); } # return true if playing locally is allowed sub playlocal_ok { - shift->r->dir_config('AllowPlayLocally') =~ /$YES/oi; + shift->config_yes('AllowPlayLocally'); } # return true if we should check that the client can accomodate streaming sub check_stream_client { - shift->r->dir_config('CheckStreamClient') =~ /$YES/oi; + shift->config_yes('CheckStreamClient'); } # return true if client can stream @@ -1378,48 +1386,48 @@ # whether to read info for each MP3 file (might take a long time) sub read_mp3_info { - shift->r->dir_config('ReadMP3Info') !~ /$NO/oi; + shift->config_no('ReadMP3Info'); } # whether to time out streams sub stream_timeout { - shift->r->dir_config('StreamTimeout') || 0; + shift->get_config('StreamTimeout') || 0; } # how long an album list is considered so long we should put buttons # at the top as well as the bottom -sub file_list_is_long { shift->r->dir_config('LongList') || 10 } +sub file_list_is_long { shift->get_config('LongList') || 10 } sub home_label { my $self = shift; - my $home = $self->r->dir_config('HomeLabel') || + my $home = $self->get_config('HomeLabel') || $self->x('Home'); return lc($home) eq 'hostname' ? $self->r->hostname : $home; } sub path_style { # style for the path to parent directories - lc(shift->r->dir_config('PathStyle')) || 'staircase'; + lc(shift->get_config('PathStyle')) || 'staircase'; } # where is our cache directory (if any) sub cache_dir { my $self = shift; - return unless my $dir = $self->r->dir_config('CacheDir'); + return unless my $dir = $self->get_config('CacheDir'); return $self->r->server_root_relative($dir); } # columns to display -sub subdir_columns {shift->r->dir_config('SubdirColumns') || SUBDIRCOLUMNS } -sub playlist_columns {shift->r->dir_config('PlaylistColumns') || PLAYLISTCOLUMNS } +sub subdir_columns {shift->get_config('SubdirColumns') || SUBDIRCOLUMNS } +sub playlist_columns {shift->get_config('PlaylistColumns') || PLAYLISTCOLUMNS } # various configuration variables -sub default_dir { shift->r->dir_config('BaseDir') || BASE_DIR } +sub default_dir { shift->get_config('BaseDir') || BASE_DIR } sub stylesheet { shift->get_dir('Stylesheet', STYLESHEET) } sub parent_icon { shift->get_dir('ParentIcon',PARENTICON) } sub cd_list_icon { my $self = shift; my $subdir = shift; - my $image = $self->r->dir_config('CoverImageSmall') || COVERIMAGESMALL; + my $image = $self->get_config('CoverImageSmall') || COVERIMAGESMALL; my $directory_specific_icon = $self->r->filename."/$subdir/$image"; return -e $directory_specific_icon ? join ("/",$self->r->uri,escape($subdir),$image) @@ -1427,7 +1435,7 @@ } sub playlist_icon { my $self = shift; - my $image = $self->r->dir_config('PlaylistImage') || PLAYLISTIMAGE; + my $image = $self->get_config('PlaylistImage') || PLAYLISTIMAGE; my $directory_specific_icon = $self->r->filename."/$image"; warn $directory_specific_icon; return -e $directory_specific_icon @@ -1444,7 +1452,7 @@ sub cd_icon { my $self = shift; my $dir = shift; - my $coverimg = $self->r->dir_config('CoverImage') || COVERIMAGE; + my $coverimg = $self->get_config('CoverImage') || COVERIMAGE; if (-e "$dir/$coverimg") { $coverimg; } else { @@ -1453,7 +1461,7 @@ } sub missing_comment { my $self = shift; - my $missing = $self->r->dir_config('MissingComment'); + my $missing = $self->get_config('MissingComment'); return if $missing eq 'off'; $missing = $self->lh->maketext('unknown') unless $missing; $missing; @@ -1464,7 +1472,7 @@ my $self = shift; my $data = shift; my $description; - my $format = $self->r->dir_config('DescriptionFormat'); + my $format = $self->get_config('DescriptionFormat'); if ($format) { ($description = $format) =~ s{%([atfglncrdmsqS%])} {$1 eq '%' ? '%' @@ -1495,7 +1503,7 @@ } } - if ((my $basename = $r->dir_config('StreamBase')) && !$self->is_localnet()) { + if ((my $basename = $self->get_config('StreamBase')) && !$self->is_localnet()) { $basename =~ s!http://!http://$auth_info! if $auth_info; return $basename; } @@ -1536,7 +1544,7 @@ sub is_localnet { my $self = shift; return 1 if $self->is_local; # d'uh - my @local = split /\s+/,$self->r->dir_config('LocalNet') or return; + my @local = split /\s+/,$self->get_config('LocalNet') or return; my $remote_ip = $self->r->connection->remote_ip . '.'; foreach (@local) { mod_perl-2.0.9/docs/user/porting/code/apache_mp3_7.diff0000644000177200010010000001150412540623200021440 0ustar SteveNone--- Apache/MP3.pm.7 2003-06-06 17:04:27.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 17:13:26.000000000 +1000 @@ -129,7 +129,7 @@ my $self = shift; $self->r->send_http_header( $self->html_content_type ); - return OK if $self->r->header_only; + return Apache::OK if $self->r->header_only; print start_html( -lang => $self->lh->language_tag, @@ -246,20 +246,20 @@ $self->send_playlist(\@matches); } - return OK; + return Apache::OK; } # this is called to generate a playlist for selected files if (param('Play Selected')) { - return HTTP_NO_CONTENT unless my @files = param('file'); + return Apache::HTTP_NO_CONTENT unless my @files = param('file'); my $uri = dirname($r->uri); $self->send_playlist([map { "$uri/$_" } @files]); - return OK; + return Apache::OK; } # otherwise don't know how to deal with this $self->r->log_reason('Invalid parameters -- possible attempt to circumvent checks.'); - return FORBIDDEN; + return Apache::FORBIDDEN; } # this generates the top-level directory listing @@ -273,7 +273,7 @@ my $query = $self->r->args; $query = "?" . $query if defined $query; $self->r->header_out(Location => "$uri/$query"); - return REDIRECT; + return Apache::REDIRECT; } return $self->list_directory($dir); @@ -289,9 +289,9 @@ if ($is_audio && !$self->download_ok) { $self->r->log_reason('File downloading is forbidden'); - return FORBIDDEN; + return Apache::FORBIDDEN; } else { - return DECLINED; # allow Apache to do its standard thing + return Apache::DECLINED; # allow Apache to do its standard thing } } @@ -302,17 +302,17 @@ my $self = shift; my $r = $self->r; - return DECLINED unless -e $r->filename; # should be $r->finfo + return Apache::DECLINED unless -e $r->filename; # should be $r->finfo unless ($self->stream_ok) { $r->log_reason('AllowStream forbidden'); - return FORBIDDEN; + return Apache::FORBIDDEN; } if ($self->check_stream_client and !$self->is_stream_client) { my $useragent = $r->header_in('User-Agent'); $r->log_reason("CheckStreamClient is true and $useragent is not a streaming client"); - return FORBIDDEN; + return Apache::FORBIDDEN; } return $self->send_stream($r->filename,$r->uri); @@ -322,12 +322,12 @@ sub send_playlist { my $self = shift; my ($urls,$shuffle) = @_; - return HTTP_NO_CONTENT unless @$urls; + return Apache::HTTP_NO_CONTENT unless @$urls; my $r = $self->r; my $base = $self->stream_base; $r->send_http_header('audio/mpegurl'); - return OK if $r->header_only; + return Apache::OK if $r->header_only; # local user my $local = $self->playlocal_ok && $self->is_local; @@ -377,7 +377,7 @@ $r->print ("$base$_?$stream_parms$CRLF"); } } - return OK; + return Apache::OK; } sub stream_parms { @@ -468,7 +468,7 @@ my $self = shift; my $dir = shift; - return DECLINED unless -d $dir; + return Apache::DECLINED unless -d $dir; my $last_modified = (stat(_))[9]; @@ -478,15 +478,15 @@ my ($time, $ver) = $check =~ /^([a-f0-9]+)-([0-9.]+)$/; if ($check eq '*' or (hex($time) == $last_modified and $ver == $VERSION)) { - return HTTP_NOT_MODIFIED; + return Apache::HTTP_NOT_MODIFIED; } } - return DECLINED unless my ($directories,$mp3s,$playlists,$txtfiles) + return Apache::DECLINED unless my ($directories,$mp3s,$playlists,$txtfiles) = $self->read_directory($dir); $self->r->send_http_header( $self->html_content_type ); - return OK if $self->r->header_only; + return Apache::OK if $self->r->header_only; $self->page_top($dir); $self->directory_top($dir); @@ -514,7 +514,7 @@ print hr unless %$mp3s; print "\n\n"; $self->directory_bottom($dir); - return OK; + return Apache::OK; } # print the HTML at the top of the page @@ -1268,8 +1268,8 @@ my $mime = $r->content_type; my $info = $self->fetch_info($file,$mime); - return DECLINED unless $info; # not a legit mp3 file? - my $fh = $self->open_file($file) || return DECLINED; + return Apache::DECLINED unless $info; # not a legit mp3 file? + my $fh = $self->open_file($file) || return Apache::DECLINED; binmode($fh); # to prevent DOS text-mode foolishness my $size = -s $file; @@ -1317,7 +1317,7 @@ $r->print("Content-Length: $size$CRLF"); $r->print("Content-Type: $mime$CRLF"); $r->print("$CRLF"); - return OK if $r->header_only; + return Apache::OK if $r->header_only; if (my $timeout = $self->stream_timeout) { my $seconds = $info->{seconds}; @@ -1330,12 +1330,12 @@ $bytes -= $b; $r->print($data); } - return OK; + return Apache::OK; } # we get here for untimed transmits $r->send_fd($fh); - return OK; + return Apache::OK; } # called to open the MP3 file mod_perl-2.0.9/docs/user/porting/code/apache_mp3_9.diff0000644000177200010010000000520412540623200021442 0ustar SteveNone--- Apache/MP3.pm.9 2003-06-06 17:27:45.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 17:55:14.000000000 +1000 @@ -82,8 +82,8 @@ $new->{'r'} ||= $r if $r; my @lang_tags; - push @lang_tags,split /,\s+/,$r->header_in('Accept-language') - if $r->header_in('Accept-language'); + push @lang_tags,split /,\s+/,$r->headers_in->{'Accept-language'} + if $r->headers_in->{'Accept-language'}; push @lang_tags,$new->get_config('DefaultLanguage') || 'en-US'; $new->{'lh'} ||= @@ -272,7 +272,7 @@ my $uri = $self->r->uri; my $query = $self->r->args; $query = "?" . $query if defined $query; - $self->r->header_out(Location => "$uri/$query"); + $self->r->headers_out->{Location} = "$uri/$query"; return Apache::REDIRECT; } @@ -310,7 +310,7 @@ } if ($self->check_stream_client and !$self->is_stream_client) { - my $useragent = $r->header_in('User-Agent'); + my $useragent = $r->headers_in->{'User-Agent'}; $r->log_reason("CheckStreamClient is true and $useragent is not a streaming client"); return Apache::FORBIDDEN; } @@ -472,9 +472,9 @@ my $last_modified = (stat(_))[9]; - $self->r->header_out('ETag' => sprintf("%lx-%s", $last_modified, $VERSION)); + $self->r->headers_out->{'ETag'} = sprintf("%lx-%s", $last_modified, $VERSION); - if (my $check = $self->r->header_in("If-None-Match")) { + if (my $check = $self->r->headers_in->{"If-None-Match"}) { my ($time, $ver) = $check =~ /^([a-f0-9]+)-([0-9.]+)$/; if ($check eq '*' or (hex($time) == $last_modified and $ver == $VERSION)) { @@ -1283,8 +1283,8 @@ my $genre = $info->{genre} || $self->lh->maketext('unknown'); my $range = 0; - $r->header_in("Range") - and $r->header_in("Range") =~ m/bytes=(\d+)/ + $r->headers_in->{"Range"} + and $r->headers_in->{"Range"} =~ m/bytes=(\d+)/ and $range = $1 and seek($fh,$range,0); @@ -1383,11 +1383,11 @@ # return true if client can stream sub is_stream_client { my $r = shift->r; - $r->header_in('Icy-MetaData') # winamp/xmms - || $r->header_in('Bandwidth') # realplayer - || $r->header_in('Accept') =~ m!\baudio/mpeg\b! # mpg123 and others - || $r->header_in('User-Agent') =~ m!^NSPlayer/! # Microsoft media player - || $r->header_in('User-Agent') =~ m!^xmms/!; + $r->headers_in->{'Icy-MetaData'} # winamp/xmms + || $r->headers_in->{'Bandwidth'} # realplayer + || $r->headers_in->{'Accept'} =~ m!\baudio/mpeg\b! # mpg123 and others + || $r->headers_in->{'User-Agent'} =~ m!^NSPlayer/! # Microsoft media player + || $r->headers_in->{'User-Agent'} =~ m!^xmms/!; } # whether to read info for each MP3 file (might take a long time) mod_perl-2.0.9/docs/user/porting/compat.pod0000644000177200010010000013456712540623200017454 0ustar SteveNone=head1 NAME A Reference to mod_perl 1.0 to mod_perl 2.0 Migration. =head1 Description This chapter is a reference for porting code and configuration files from mod_perl 1.0 to mod_perl 2.0. To learn about the porting process you should first read about L (and may be about L). As it will be explained in details later, loading C> at the server startup, should make the code running properly under 1.0 work under mod_perl 2.0. If you want to port your code to mod_perl 2.0 or writing from scratch and not concerned about backwards compatibility, this document explains what has changed compared to L. Several configuration directives were changed, renamed or removed. Several APIs have changed, renamed, removed, or moved to new packages. Certain functions while staying L as in mod_perl 1.0, now reside in different packages. Before using them you need to find out those packages and load them. You should be able to find the destiny of the functions that you cannot find any more or which behave differently now under the package names the functions belong in mod_perl 1.0. =head1 Configuration Files Porting To migrate the configuration files to the mod_perl 2.0 syntax, you may need to do certain adjustments. Several configuration directives are deprecated in 2.0, but still available for backwards compatibility with mod_perl 1.0 unless 2.0 was built with C>. If you don't need the backwards compatibility consider using the directives that have replaced them. =head2 C C was replaced with C>. =head2 C C was replaced with C>. C is available in mod_perl 1.0, since 1997. =head2 C C was replaced with C> directive. PerlSendHeader On => PerlOptions +ParseHeaders PerlSendHeader Off => PerlOptions -ParseHeaders =head2 C C was replaced with C> directive. PerlSetupEnv On => PerlOptions +SetupEnv PerlSetupEnv Off => PerlOptions -SetupEnv =head2 C The taint mode now can be turned on with C>: PerlSwitches -T As with standard Perl, by default the taint mode is disabled and once enabled cannot be turned off inside the code. =head2 C Warnings now can be enabled globally with C>: PerlSwitches -w =head2 C C is a mod_perl 1.0 legacy and doesn't exist in mod_perl 2.0. A full teardown and startup of interpreters is done on restart. If you need to use the same I for 1.0 and 2.0, use: PerlFreshRestart =head2 C<$Apache::Server::StrictPerlSections> In mod_perl 2.0, CPerlE sections|docs::2.0::api::Apache2::PerlSections>> errors are now always fatal. Any error in them will cause an immediate server startup abort, dumping the error to STDERR. To avoid this, C can be used to trap errors and ignore them. In mod_perl 1.0, C was somewhat of a misnomer. =head2 C<$Apache::Server::SaveConfig> C<$Apache::Server::SaveConfig> has been renamed to C<$Apache2::PerlSections::Save>. see CPerlE sections|docs::2.0::api::Apache2::PerlSections>> for more information on this global variable. =head2 Apache Configuration Customization mod_perl 2.0 has slightly changed the mechanism for L and now also makes it easy to access an Apache parsed configuration tree's values. META: add L<> to the config tree access when it'll be written. =head2 C<@INC> Manipulation =over =item * Directories Added Automatically to C<@INC> Only if mod_perl was built with C, two directories: I<$ServerRoot> and I<$ServerRoot/lib/perl> are pushed onto C<@INC>. I<$ServerRoot> is as defined by the C directive in I. =item * C and C Environment Variables mod_perl 2.0 doesn't do anything special about C and C Environment Variables. If C<-T> is in effect these variables are ignored by Perl. There are L to adjust C<@INC>. =back =head1 Server Startup mod_perl 1.0 was always running its startup code as soon as it was encountered. In mod_perl 2.0, it is not always the case. Refer to the L for details. =head1 Code Porting mod_perl 2.0 is trying hard to be back compatible with mod_perl 1.0. However some things (mostly APIs) have been changed. In order to gain a complete compatibilty with 1.0 while running under 2.0, you should load the compatibility module as early as possible: use Apache2::compat; at the server startup. And unless there are forgotten things or bugs, your code should work without any changes under 2.0 series. However, unless you want to keep the 1.0 compatibility, you should try to remove the compatibility layer and adjust your code to work under 2.0 without it. You want to do it mainly for the performance improvement. This document explains what APIs have changed and what new APIs should be used instead. Finally, mod_perl 2.0 has all its methods spread across many modules. In order to use these methods the modules containing them have to be loaded first. The module C> can be used to find out which modules need to be used. This module also provides a function C> that will load all mod_perl 2.0 modules, implementing their API in XS, which is useful when one starts to port their mod_perl 1.0 code, though preferrably avoided in the production environment if you want to save memory. =head1 C, C and Friends C, C and other modules from the registry family now live in the C namespace. In mod_perl 2.0 we put mod_perl specific functionality into the C namespace, similar to C and C which are used for libapr and Apache, respectively. C> (and others) doesn't C into the script's dir like C does, because C affects the whole process under threads. If you need this functionality use C> or C>. Otherwise C modules are configured and used similarly to C modules. Refer to one of the following manpages for more information: C>, C>, C> and C>. =head2 C In mod_perl 1.0 it was only possible to preload scripts as C handlers. In 2.0 the loader can use any of the registry classes to preload into. The old API works as before, but new options can be passed. See the C> manpage for more information. =head1 C C has been replaced by three classes: =over =item C> Apache constants =item C> Apache Portable Runtime constants =item C> mod_perl specific constants =back See the manpages of the respective modules to figure out which constants they provide. META: add the info how to perform the transition. XXX: may be write a script, which can tell you how to port the constants to 2.0? Currently C> doesn't provide a complete back compatibility layer. =head2 mod_perl 1.0 and 2.0 Constants Coexistence If the same codebase is used for both mod_perl generations, the following technique can be used for using constants: package MyApache2::Foo; use strict; use warnings; use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ); BEGIN { if (MP2) { require Apache2::Const; Apache2::Const->import(-compile => qw(OK DECLINED)); } else { require Apache::Constants; Apache::Constants->import(qw(OK DECLINED)); } } sub handler { # ... return MP2 ? Apache2::Const::OK : Apache::Constants::OK; } 1; Notice that if you don't use the idiom: return MP2 ? Apache2::Const::OK : Apache::Constants::OK; but something like the following: sub handler1 { ... return Apache::Constants::OK(); } sub handler2 { ... return Apache2::Const::OK(); } You need to add C<()>. If you don't do that, let's say that you run under mod_perl 2.0, perl will complain about mod_perl 1.0 constant: Bareword "Apache::Constants::OK" not allowed while "strict subs" ... Adding C<()> prevents this warning. =head2 Deprecated Constants C and similar constants have been deprecated in Apache for years, in favor of the C names (they no longer exist Apache 2.0). mod_perl 2.0 API performs the following aliasing behind the scenes: NOT_FOUND => 'HTTP_NOT_FOUND', FORBIDDEN => 'HTTP_FORBIDDEN', AUTH_REQUIRED => 'HTTP_UNAUTHORIZED', SERVER_ERROR => 'HTTP_INTERNAL_SERVER_ERROR', REDIRECT => 'HTTP_MOVED_TEMPORARILY', but we suggest moving to use the C names. For example if running in mod_perl 1.0 compatibility mode, change: use Apache::Constants qw(REDIRECT); to: use Apache::Constants qw(HTTP_MOVED_TEMPORARILY); This will work in both mod_perl generations. =head2 C C has been replaced with C>. =head2 C C has no replacement in 2.0 as it's not needed. =head1 Issues with Environment Variables There are several thread-safety issues with setting environment variables. Environment variables set during request time won't be seen by C code. See the L for possible workarounds. Forked processes (including backticks) won't see CGI emulation environment variables. (META: This will hopefully be resolved in the future, it's documented in modperl_env.c:modperl_env_magic_set_all.) =head1 Special Environment Variables =head2 C<$ENV{GATEWAY_INTERFACE}> The environment variable C<$ENV{GATEWAY_INTERFACE}> is not special in mod_perl 2.0, but the same as any other CGI environment variables, i.e. it'll be enabled only if C> is enabled and its value would be the default: CGI/1.1 or anything else Apache decides to set it to, but not: CGI-Perl/1.1 Instead use C<$ENV{MOD_PERL}> (available in both mod_perl generations), which is set to the mod_perl version, like so: mod_perl/2.000002 Therefore in order to check whether you are running under mod_perl, you'd say: if ($ENV{MOD_PERL}) { ... } To check for a specific version it's better to use C<$ENV{MOD_PERL_API_VERSION}> use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ); =head1 C Methods =head2 Crequest> Crequest> has been replaced with C>. Crequest|docs::2.0::api::Apache2::RequestUtil/C_request_>> usage should be avoided under mod_perl 2.0 C<$r> should be passed around as an argument instead (or in the worst case maintain your own global variable). Since your application may run under threaded mpm, the Crequest> usage involves storage and retrieval from the thread local storage, which is expensive. It's possible to use C<$r> even in CGI scripts running under C> modules, without breaking the mod_cgi compatibility. Registry modules convert a script like: print "Content-type: text/plain"; print "Hello"; into something like: package Foo; sub handler { print "Content-type: text/plain\n\n"; print "Hello"; return Apache2::Const::OK; } where the C function always receives C<$r> as an argument, so if you change your script to be: my $r; $r = shift if $ENV{MOD_PERL}; if ($r) { $r->content_type('text/plain'); } else { print "Content-type: text/plain\n\n"; } print "Hello" it'll really be converted into something like: package Foo; sub handler { my $r; $r = shift if $ENV{MOD_PERL}; if ($r) { $r->content_type('text/plain'); } else { print "Content-type: text/plain\n\n"; } print "Hello" return Apache2::Const::OK; } The script works under both mod_perl and mod_cgi. For example CGI.pm 2.93 or higher accepts C<$r> as an argument to its C function. So does C from the same distribution. Moreover, user's configuration may preclude from Crequest> being available at run time. For any location that uses Crequest> and uses C, the configuration should either explicitly enable this feature: SetHandler modperl PerlOptions +GlobalRequest ... It's already enabled for C: SetHandler perl-script ... This configuration makes Crequest> available B during the response phase (C>). Other phases can make Crequest> available, by explicitly setting it in the handler that has an access to C<$r>. For example the following skeleton for an I phase handler makes the Crequest> available in the calls made from it: package MyApache2::Auth; # PerlAuthenHandler MyApache2::Auth use Apache2::RequestUtil (); #... sub handler { my $r = shift; Apache2::RequestUtil->request($r); # do some calls that rely on Apache2::RequestUtil->request being available #... } =head2 Cdefine> Cdefine> has been replaced with C>. =head2 Ccan_stack_handlers> Ccan_stack_handlers> is no longer needed, as mod_perl 2.0 can always stack handlers. =head2 Cuntaint> Cuntaint> has moved to C> and now is a function, rather a class method. It'll will untaint all its arguments. You shouldn't be using this function unless you know what you are doing. Refer to the I manpage for more information. C> provides the backward compatible with mod_perl 1.0 implementation. =head2 Cget_handlers> To get handlers for the server level, mod_perl 2.0 code should use C>: $s->get_handlers(...); or: Apache2::ServerUtil->server->get_handlers(...); Cget_handlers> is avalable via C>. See also C>. =head2 Cpush_handlers> To push handlers at the server level, mod_perl 2.0 code should use C>: $s->push_handlers(...); or: Apache2::ServerUtil->server->push_handlers(...); Cpush_handlers> is avalable via C>. See also C>. =head2 Cset_handlers> To set handlers at the server level, mod_perl 2.0 code should use C>: $s->set_handlers(...); or: Apache2::ServerUtil->server->set_handlers(...); Cset_handlers> is avalable via C>. To reset the list of handlers, instead of doing: $r->set_handlers(PerlAuthenHandler => [ \&OK ]); do: $r->set_handlers(PerlAuthenHandler => []); or $r->set_handlers(PerlAuthenHandler => undef); See also C>. =head2 Chttpd_conf> Chttpd_conf> is now Cadd_config|docs::2.0::api::Apache2::ServerUtil/C_add_config_>>: require Apache2::ServerUtil; Apache2::ServerUtil->server->add_config(['require valid-user']); Chttpd_conf> is avalable via C>. See also C>. =head2 Cunescape_url_info> Apache-Eunescape_url_info is not available in mod_perl 2.0 API. Use C instead (http://search.cpan.org/dist/CGI.pm/CGI/Util.pm). It is also available via C> for backwards compatibility. =head2 C C has been replaced with C>. =head2 C Since Perl 5.6.1 filehandlers are autovivified and there is no need for C function, since now it can be done with: open my $fh, "foo" or die $!; Though the C function C is available for XS/C extensions writers. =head2 C C is not available in mod_perl 2.0 API. You can use C>: Apache2::ServerUtil->server->log_error instead. See the C> manpage. =head2 Cwarn> C<$Apache-Ewarn> has been removed and exists only in C>. Choose another C> method. =head2 C C<$Apache::warn> has been removed and exists only in C>. Choose another C> method. =head2 C C has been replaced with the function C>, which now accepts a single argument: the module name. =head1 C Variables =head2 C<$Apache::__T> C<$Apache::__T> is deprecated in mod_perl 2.0. Use C<${^TAINT}> instead. =head1 C Methods =head2 Ctop_module> Ctop_module> has been replaced with the function C>. =head2 Cget_config> Cget_config> has been replaced with the function C>. =head1 C Methods =head2 Cget> Cget> has been replaced with the function C>. =head1 C Methods and Variables =head2 C<$Apache::Server::CWD> C<$Apache::Server::CWD> is deprecated and exists only in C>. =head2 C<$Apache::Server::AddPerlVersion> C<$Apache::Server::AddPerlVersion> is deprecated and exists only in C>. =head2 C<$Apache::Server::Starting> and C<$Apache::Server::ReStarting> C<$Apache::Server::Starting> and C<$Apache::Server::ReStarting> were replaced by C>. Though both exist in C>. =head2 Cwarn> Cwarn> has been removed and exists only in C>. Choose another C> method. =head1 Server Object Methods =head2 C<$s-Eregister_cleanup> C<$s-Eregister_cleanup> has been replaced with C> which accepts the pool object as the first argument instead of the server object, a callback function as a second and data variable as the optional third argument. If that data argument was provided it is then passed to the callback function when the time comes for the pool object to get destroyed. use Apache2::ServerUtil (); sub cleanup_callback { my $data = shift; # your code comes here return Apache2::Const::OK; } $s->pool->cleanup_register(\&cleanup_callback, $data); See also C>. In order to register a cleanup handler to be run only once when the main server (not each child process) shuts down, you can register a cleanup handler with C>. =head2 C<$s-Euid> See the next entry. =head2 C<$s-Egid> apache-1.3 had server_rec records for server_uid and server_gid. httpd-2.0 doesn't have them, because in httpd-2.0 the directives User and Group are platform specific. And only UNIX supports it: http://httpd.apache.org/docs-2.0/mod/mpm_common.html#user It's possible to emulate mod_perl 1.0 API doing: sub Apache2::Server::uid { $< } sub Apache2::Server::gid { $( } but the problem is that if the server is started as I, but its child processes are run under a different username, e.g. I, at the startup the above function will report the C and C values of I and not I, i.e. at startup it won't be possible to know what the User and Group settings are in I. META: though we can probably access the parsed config tree and try to fish these values from there. The real problem is that these values won't be available on all platforms and therefore we should probably not support them and let developers figure out how to code around it (e.g. by using C<$E> and C<$(>). =head1 Request Object Methods =head2 C<$r-Eprint> $r->print($foo); or print $foo; no longer accepts a reference to a scalar as it did in mod_perl 1.0. This optimisation is not needed in the mod_perl 2.0's implementation of C. =head2 C<$r-Ecgi_env> See the next item =head2 C<$r-Ecgi_var> C<$r-Ecgi_env> and C<$r-Ecgi_var> should be replaced with Csubprocess_env|docs::2.0::api::Apache2::RequestRec/C_subprocess_env_>>, which works identically in both mod_perl generations. =head2 C<$r-Ecurrent_callback> C<$r-Ecurrent_callback> is now simply a C> and can be called for any of the phases, including those where C<$r> simply doesn't exist. C> implements C<$r-Ecurrent_callback> for backwards compatibility. =head2 C<$r-Ecleanup_for_exec> C<$r-Ecleanup_for_exec> wasn't a part of the mp1 core API, but lived in a 3rd party module C. That module's functionality is now a part of mod_perl 2.0 API. But Apache 2.0 doesn't need this function any longer. C> implements C<$r-Ecleanup_for_exec> for backwards compatibility as a NOOP. See also the C> manpage. =head2 C<$r-Eget_remote_host> C> is now invoked on the C>: use Apache2::Connection; $r->connection->get_remote_host(); C<$r-Eget_remote_host> is available through C>. =head2 C<$r-Econtent> See the next item. =head2 C<$r-Eargs> in an Array Context Cargs|docs::2.0::api::Apache2::RequestRec/C_args_>> in 2.0 returns the query string without parsing and splitting it into an array. You can also set the query string by passing a string to this method. C<$r-Econtent> and C<$r-Eargs> in an array context were mistakes that never should have been part of the mod_perl 1.0 API. There are multiple reason for that, among others: =over =item * does not handle multi-value keys =item * does not handle multi-part content types =item * does not handle chunked encoding =item * slurps C<$r-Eheaders_in-E{'content-length'}> into a single buffer (bad for performance, memory bloat, possible dos attack, etc.) =item * in general duplicates functionality (and does so poorly) that is done better in C. =item * if one wishes to simply read POST data, there is the more modern filter API, along with continued support for C and C<$r-Eread($buf, $r-Eheaders_in-E{'content-length'}>) =back You could use C or the code in C> (it's slower). However, now that C has been ported to mod_perl 2.0 you can use it instead and reap the benefits of the fast C implementations of these functions. For documentation on its uses, please see: http://httpd.apache.org/apreq =head2 C<$r-Echdir_file> C cannot be used in the threaded environment, therefore C<$r-Echdir_file> is not in the mod_perl 2.0 API. For more information refer to: L. =head2 C<$r-Eis_main> C<$r-Eis_main> is not part of the mod_perl 2.0 API. Use Cmain|docs::2.0::api::Apache2::RequestRec/C_main_>> instead. Refer to the C> manpage. =head2 C<$r-Efilename> When a new Cfilename|docs::2.0::api::Apache2::RequestRec/C_filename_>> is assigned Apache 2.0 doesn't update the finfo structure like it did in Apache 1.3. If the old behavior is desired Apache2::compat's L can be used. Otherwise one should explicitly update the finfo struct when desired as explained in the C> API entry. =head2 C<$r-Efinfo> As Apache 2.0 doesn't provide an access to the stat structure, but hides it in the opaque object C<$r-Efinfo> now returns an C> object. You can then invoke the C> accessor methods on it. It's also possible to adjust the mod_perl 1.0 code using Apache2::compat's L. For example: use Apache2::compat; Apache2::compat::override_mp2_api('Apache2::RequestRec::finfo'); my $is_writable = -w $r->finfo; Apache2::compat::restore_mp2_api('Apache2::RequestRec::finfo'); which internally does just the following: stat $r->filename and return \*_; So may be it's easier to just change the code to use this directly, so the above example can be adjusted to be: my $is_writable = -w $r->filename; with the performance penalty of an extra C system call. If you don't want this extra call, you'd have to write: use APR::Finfo; use Apache2::RequestRec; use APR::Const -compile => qw(WWRITE); my $is_writable = $r->finfo->protection & APR::WWRITE, See the C> manpage for more information. =head2 C<$r-Enotes> Similar to C>, C> and C> in mod_perl 2.0, Cnotes()|docs::2.0::api::Apache2::RequestRec/C_notes_>> returns an C> object, which can be used as a tied hash or calling its I> / I> / I> / I> methods. It's also possible to adjust the mod_perl 1.0 code using C>'s L: use Apache2::compat; Apache2::compat::override_mp2_api('Apache2::RequestRec::notes'); $r->notes($key => $val); $val = $r->notes($key); Apache2::compat::restore_mp2_api('Apache2::RequestRec::notes'); See the C> manpage. =head2 C<$r-Eheader_in> See Cerr_header_out|/C__r_E_gt_err_header_out_>>. =head2 C<$r-Eheader_out> See Cerr_header_out|/C__r_E_gt_err_header_out_>>. =head2 C<$r-Eerr_header_out> C, C and C are not available in 2.0. Use C>, C> and C> instead (which should be used in 1.0 as well). For example you need to replace: $r->err_header_out("Pragma" => "no-cache"); with: $r->err_headers_out->{'Pragma'} = "no-cache"; See the L manpage. =head2 C<$r-Eregister_cleanup> Similarly to C<$s-Eregister_cleanup>, C<$r-Eregister_cleanup> has been replaced with C> which accepts the pool object as the first argument instead of the request object. e.g.: sub cleanup_callback { my $data = shift; ... } $r->pool->cleanup_register(\&cleanup_callback, $data); where the last argument C<$data> is optional, and if supplied will be passed as the first argument to the callback function. See the C> manpage. =head2 C<$r-Epost_connection> C<$r-Epost_connection> has been replaced with: $r->connection->pool->cleanup_register(); See the C> manpage. =head2 C<$r-Erequest> Use Crequest|docs::2.0::api::Apache2::RequestUtil/C_request_>>. =head2 C<$r-Esend_fd> mod_perl 2.0 provides a new method C> instead of C, so if your code used to do: open my $fh, "<$file" or die "$!"; $r->send_fd($fh); close $fh; now all you need is: $r->sendfile($file); There is also a compatibility implementation of send_fd in pure perl in C>. XXX: later we may provide a direct access to the real send_fd. That will be possible if we figure out how to portably convert PerlIO/FILE into apr_file_t (with help of apr_os_file_put, which expects a native filehandle, so I'm not sure whether this will work on win32). =head2 C<$r-Esend_http_header> This method is not needed in 2.0, though available in C>. 2.0 handlers only need to set the I via Ccontent_type($type)|docs::2.0::api::Apache2::RequestRec/C_content_type_>>. =head2 C<$r-Eserver_root_relative> This method was replaced with C> function and its first argument is a I object. For example: # during request $conf_dir = Apache2::server_root_relative($r->pool, 'conf'); # during startup $conf_dir = Apache2::server_root_relative($s->pool, 'conf'); Note that the old form my $conf_dir = Apache->server_root_relative('conf'); is no longer valid - C must be explicitly passed a pool. The old functionality is available with C>. =head2 C<$r-Ehard_timeout> See Ckill_timeout|/C__r_E_gt_kill_timeout_>>. =head2 C<$r-Ereset_timeout> See Ckill_timeout|/C__r_E_gt_kill_timeout_>>. =head2 C<$r-Esoft_timeout> See Ckill_timeout|/C__r_E_gt_kill_timeout_>>. =head2 C<$r-Ekill_timeout> The functions C<$r-Ehard_timeout>, C<$r-Ereset_timeout>, C<$r-Esoft_timeout> and C<$r-Ekill_timeout> aren't needed in mod_perl 2.0. C> implements these functions for backwards compatibility as NOOPs. =head2 C<$r-Eset_byterange> See Ceach_byterange|/C__r_E_gt_each_byterange_>>. =head2 C<$r-Eeach_byterange> The functions C<$r-Eset_byterange> and C<$r-Eeach_byterange> aren't in the Apache 2.0 API, and therefore don't exist in mod_perl 2.0. The byterange serving functionality is now implemented in the ap_byterange_filter, which is a part of the core http module, meaning that it's automatically taking care of serving the requested ranges off the normal complete response. There is no need to configure it. It's executed only if the appropriate request headers are set. These headers aren't listed here, since there are several combinations of them, including the older ones which are still supported. For a complete info on these see I. =head1 C =head2 C<$connection-Eauth_type> The record I doesn't exist in the Apache 2.0's connection struct. It exists only in the request record struct. The new accessor in 2.0 API is Cap_auth_type|docs::2.0::api::Apache2::RequestRec/C_ap_auth_type_>>. C> provides a back compatibility method, though it relies on the availability of the global Crequest>, which requires the configuration to have: PerlOptions +GlobalRequest to set it up for earlier stages than response handler. =head2 C<$connection-Euser> This method is deprecated in mod_perl 1.0 and Cuser|docs::2.0::api::Apache2::RequestRec/C_user_>> should be used instead for both mod_perl generations. C<$r-Euser()> method is available since mod_perl version 1.24_01. =head2 C<$connection-Elocal_addr> See Cremote_addr|/C__connection_E_gt_remote_addr_>> =head2 C<$connection-Eremote_addr> Clocal_addr|docs::2.0::api::Apache2::Connection/C_local_addr_>> and Cremote_addr|docs::2.0::api::Apache2::Connection/C_remote_addr_>> return an C> object and you can use this object's methods to retrieve the wanted bits of information, so if you had a code like: use Socket 'sockaddr_in'; my $c = $r->connection; my ($serverport, $serverip) = sockaddr_in($c->local_addr); my ($remoteport, $remoteip) = sockaddr_in($c->remote_addr); now it'll be written as: require APR::SockAddr; my $c = $r->connection; my $serverport = $c->local_addr->port; my $serverip = $c->local_addr->ip_get; my $remoteport = $c->remote_addr->port; my $remoteip = $c->remote_addr->ip_get; It's also possible to adjust the code using Apache2::compat's L: use Socket 'sockaddr_in'; use Apache2::compat; Apache2::compat::override_mp2_api('Apache2::Connection::local_addr'); my ($serverport, $serverip) = sockaddr_in($r->connection->local_addr); Apache2::compat::restore_mp2_api('Apache2::Connection::local_addr'); Apache2::compat::override_mp2_api('Apache::Connection::remote_addr'); my ($remoteport, $remoteip) = sockaddr_in($r->connection->remote_addr); Apache2::compat::restore_mp2_api('Apache::Connection::remote_addr'); =head1 C The methods from mod_perl 1.0's module C have been either moved to other packages or removed. =head2 C, C and C The methods C, C and C were removed. See the back compatibility implementation in the module C>. Because of that some of the idioms have changes too. If previously you were writing: my $fh = Apache::File->new($r->filename) or return Apache::DECLINED; # Slurp the file (hopefully it's not too big). my $content = do { local $/; <$fh> }; close $fh; Now, you would write that using C>: use Apache2::RequestUtil (); my $content = ${ $r->slurp_filename() }; =head2 C The method C was removed since Apache 2.0 doesn't have the API for this method anymore. See C, or the back compatibility implementation in the module C>. With Perl v5.8.0 you can create anonymous temporary files: open $fh, "+>", undef or die $!; That is a literal C, not an undefined value. =head1 C A few C> functions have changed their interface. =head2 C C has been replaced with C>, which returns formatted strings of only 4 characters long. =head2 C C has been replaced with C> and requires a pool object as a second argument. For example: $escaped_path = Apache2::Util::escape_path($path, $r->pool); =head2 C C has been replaced with C>. =head2 C C is not available in mod_perl 2.0. Use C instead (http://search.cpan.org/dist/HTML-Parser/lib/HTML/Entities.pm). It's also available via C> for backwards compatibility. =head2 C C has been replaced with C>. =head2 C C> now requires a C> object as a first argument. For example: use Apache2::Util (); $fmt = '%a, %d %b %Y %H:%M:%S %Z'; $gmt = 1; $fmt_time = Apache2::Util::ht_time($r->pool, time(), $fmt, $gmt); See the L manpage. It's also possible to adjust the mod_perl 1.0 code using Apache2::compat's L. For example: use Apache2::compat; Apache2::compat::override_mp2_api('Apache2::Util::ht_time'); $fmt_time = Apache2::Util::ht_time(time(), $fmt, $gmt); Apache2::compat::restore_mp2_api('Apache2::Util::ht_time'); =head2 C C has been replaced with C>. For example: my $ok = Apache2::Util::password_validate("stas", "ZeO.RAc3iYvpA"); =head1 C =head2 Cparse($r, [$uri])> C and its associated methods have moved into the C> package. For example: my $curl = $r->construct_url; APR::URI->parse($r->pool, $curl); See the C> manpage. =head2 C Other than moving to the package C>, C> is now protocol-agnostic. Apache won't use I as the default protocol if I was set, but I wasn't not. So the following code: # request http://localhost.localdomain:8529/TestAPI::uri my $parsed = $r->parsed_uri; $parsed->hostname($r->get_server_name); $parsed->port($r->get_server_port); print $parsed->unparse; prints: //localhost.localdomain:8529/TestAPI::uri forcing you to make sure that the scheme is explicitly set. This will do the right thing: # request http://localhost.localdomain:8529/TestAPI::uri my $parsed = $r->parsed_uri; $parsed->hostname($r->get_server_name); $parsed->port($r->get_server_port); $parsed->scheme('http'); print $parsed->unparse; prints: http://localhost.localdomain:8529/TestAPI::uri See the C> manpage for more information. It's also possible to adjust the behavior to be mod_perl 1.0 compatible using Apache2::compat's L, in which case C will transparently set I to I. # request http://localhost.localdomain:8529/TestAPI::uri Apache2::compat::override_mp2_api('APR::URI::unparse'); my $parsed = $r->parsed_uri; # set hostname, but not the scheme $parsed->hostname($r->get_server_name); $parsed->port($r->get_server_port); print $parsed->unparse; Apache2::compat::restore_mp2_api('APR::URI::unparse'); prints: http://localhost.localdomain:8529/TestAPI::uri =head1 Miscellaneous =head2 Method Handlers In mod_perl 1.0 the method handlers could be specified by using the C<($$)> prototype: package Bird; @ISA = qw(Eagle); sub handler ($$) { my ($class, $r) = @_; ...; } mod_perl 2.0 doesn't handle callbacks with C<($$)> prototypes differently than other callbacks (as it did in mod_perl 1.0), mainly because several callbacks in 2.0 have more arguments than just C<$r>, so the C<($$)> prototype doesn't make sense anymore. Therefore if you want your code to work with both mod_perl generations and you can allow the luxury of: require 5.6.0; or if you need the code to run only on mod_perl 2.0, use the I subroutine attribute. (The subroutine attributes are supported in Perl since version 5.6.0.) Here is the same example rewritten using the I subroutine attribute: package Bird; @ISA = qw(Eagle); sub handler : method { my ($class, $r) = @_; ...; } See the I manpage. If Cmethod> syntax is used for a C, the C<:method> attribute is not required. The porting tutorial provides L on how to use the same code base under both mod_perl generations when the handler has to be a method. =head2 Stacked Handlers Both mod_perl 1.0 and 2.0 support the ability to register more than one handler in each runtime phase, a feature known as stacked handlers. For example, PerlAuthenHandler My::First My::Second The behavior of stacked Perl handlers differs between mod_perl 1.0 and 2.0. In 2.0, mod_perl respects the run-type of the underlying hook - it does not run all configured Perl handlers for each phase but instead behaves in the same way as Apache does when multiple handlers are configured, respecting (or ignoring) the return value of each handler as it is called. See L for a complete description of each hook and its run-type. =head1 C For those who write 3rd party modules using XS, this module was used to supply mod_perl specific include paths, defines and other things, needed for building the extensions. mod_perl 2.0 makes things transparent with C>. Here is how to write a simple I for modules wanting to build XS code against mod_perl 2.0: use mod_perl 2.0; use ModPerl::MM (); ModPerl::MM::WriteMakefile( NAME => "Foo", ); and everything will be done for you. META: we probably will have a compat layer at some point. META: move this section to the devel/porting and link there instead =head1 C C has been renamed to C>. =head1 C C currently exists only C> and it does nothing. =head1 C C has been replaced by C>, which works for both mod_perl generations. To migrate to C simply replace: PerlInitHandler Apache::StatINC with: PerlInitHandler Apache2::Reload However C provides an extra functionality, covered in the module's manpage. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman [http://stason.org/] =back =head1 Authors =over =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/porting/porting.pod0000644000177200010010000014625612540623200017651 0ustar SteveNone=head1 NAME Porting Apache:: Perl Modules from mod_perl 1.0 to 2.0 =head1 Description This document describes the various options for porting a mod_perl 1.0 Apache module so that it runs on a Apache 2.0 / mod_perl 2.0 server. It's also helpful to those who start developing mod_perl 2.0 handlers. Developers who need to port modules using XS code, should also read about L. There is also: L. =head1 Introduction In the vast majority of cases, a perl Apache module that runs under mod_perl 1.0 will B run under mod_perl 2.0 without at least some degree of modification. Even a very simple module that does not in itself need any changes will at least need the mod_perl 2.0 Apache modules loaded, because in mod_perl 2.0 basic functionality, such as access to the request object and returning an HTTP status, is not found where, or implemented how it used to be in mod_perl 1.0. Most real-life modules will in fact need to deal with the following changes: =over =item * methods that have moved to a different (new) package =item * methods that must be called differently (due to changed prototypes) =item * methods that have ceased to exist (functionality provided in some other way) =back B One way to deal with all of these issues is to load the C> compatibility layer bundled with mod_perl 2.0. This magic spell will make almost any 1.0 module run under 2.0 without further changes. It is by no means the solution for every case, however, so please read carefully the following discussion of this and other options. There are three basic options for porting. Let's take a quick look at each one and then discuss each in more detail. =over =item 1 Run the module on 2.0 under C with no further changes As we have said mod_perl 2.0 ships with a module, C>, that provides a complete drop-in compatibility layer for 1.0 modules. C does the following: =over =item * Loads all the mod_perl 2.0 Apache2:: modules =item * Adjusts method calls where the prototype has changed =item * Provides Perl implementation for methods that no longer exist in 2.0 =back The drawback to using C is the performance hit, which can be significant. Authors of CPAN and other publicly distributed modules should not use C since this forces its use in environments where the administrator may have chosen to optimize memory use by making all code run natively under 2.0. =item 2 Modify the module to run only under 2.0 If you are not interested in providing backwards compatibility with mod_perl 1.0, or if you plan to leave your 1.0 module in place and develop a new version compatible with 2.0, you will need to make changes to your code. How significant or widespread the changes are depends largely of course on your existing code. Several sections of this document provide detailed information on how to rewrite your code for mod_perl 2.0 Several tools are provided to help you, and it should be a relatively painless task and one that you only have to do once. =item 3 Modify the module so that it runs under both 1.0 and 2.0 You need to do this if you want to keep the same version number for your module, or if you distribute your module on CPAN and want to maintain and release just one codebase. This is a relatively simple enhancement of option (2) above. The module tests to see which version of mod_perl is in use and then executes the appropriate method call. =back The following sections provide more detailed information and instructions for each of these three porting strategies. =head1 Using C META: to be written. this is a new package which makes chunks of this doc simpler. for now see the C> manpage. =head1 Using the C Layer The C> module tries to hide the changes in API prototypes between version 1.0 and 2.0 of mod_perl, and implements "virtual methods" for the methods and functions that actually no longer exist. C is extremely easy to use. Either add at the very beginning of startup.pl: use Apache2::compat; or add to httpd.conf: PerlModule Apache2::compat That's all there is to it. Now you can run your 1.0 module unchanged. Remember, however, that using C will make your module run slower. It can create a larger memory footprint than you need and it implements functionality in pure Perl that is provided in much faster XS in mod_perl 1.0 as well as in 2.0. This module was really designed to assist in the transition from 1.0 to 2.0. Generally you will be better off if you port your code to use the mod_perl 2.0 API. It's also especially important to repeat that C>, since this takes the control over performance away from users. =head1 Porting a Perl Module to Run under mod_perl 2.0 Note: API changes are listed in L. The following sections will guide you through the steps of porting your modules to mod_perl 2.0. =head2 Using C to Discover Which mod_perl 2.0 Modules Need to Be Loaded It would certainly be nice to have our mod_perl 1.0 code run on the mod_perl 2.0 server unmodified. So first of all, try your luck and test the code. It's almost certain that your code won't work when you try, however, because mod_perl 2.0 splits functionality across many more modules than version 1.0 did, and you have to load these modules before the methods that live in them can be used. So the first step is to figure out which these modules are and C them. The C> module provided with mod_perl 2.0 allows you to find out which module contains the functionality you are looking for. Simply provide it with the name of the mod_perl 1.0 method that has moved to a new module, and it will tell you what the module is. For example, let's say we have a mod_perl 1.0 code snippet: $r->content_type('text/plain'); $r->print("Hello cruel world!"); If we run this, mod_perl 2.0 will complain that the method C can't be found. So we use C to figure out which module provides this method. We can just run this from the command line: % perl -MModPerl::MethodLookup -e print_method content_type This prints: to use method 'content_type' add: use Apache2::RequestRec (); We do what it says and add this C statement to our code, restart our server (unless we're using C>), and mod_perl will no longer complain about this particular method. Since you may need to use this technique quite often you may want to C>. Once defined the last command line lookup can be accomplished with: % lookup content_type C> also provides helper functions for finding C>, or C>. =head3 Handling Methods Existing In More Than One Package Some methods exists in several classes. For example this is the case with the C method. We know the drill: % lookup print This prints: There is more than one class with method 'print' try one of: use Apache2::RequestIO (); use Apache2::Filter (); So there is more than one package that has this method. Since we know that we call the C method with the C<$r> object, it must be the C module that we are after. Indeed, loading this module solves the problem. =head3 Using C Programmatically The issue of picking the right module, when more than one matches, can be resolved when using C programmatically -- C> accepts an object as an optional second argument, which is used if there is more than one module that contains the method in question. C knows that C and and C expect an object of type C and type C respectively. So in a program running under mod_perl we can call: ModPerl::MethodLookup::lookup_method('print', $r); Now only one module will be matched. This functionality can be used in C>, for example, although most users will not have a need for this robust of solution. =head3 Pre-loading All mod_perl 2.0 Modules Now if you use a wide range of methods and functions from the mod_perl 1.0 API, the process of finding all the modules that need to be loaded can be quite frustrating. In this case you may find the function C> to be the right tool for you. This function preloads B mod_perl 2.0 modules, implementing their API in XS. While useful for testing and development, it is not recommended to use this function in production systems. Before going into production you should remove the call to this function and load only the modules that are used, in order to save memory. CPAN module developers should B be tempted to call this function from their modules, because it prevents the user of their module from optimizing her system's memory usage. =head2 Handling Missing and Modified mod_perl 1.0 Methods and Functions The mod_perl 2.0 API is modeled even more closely upon the Apache API than was mod_perl version 1.0. Just as the Apache 2.0 API is substantially different from that of Apache 1.0, therefore, the mod_perl 2.0 API is quite different from that of mod_perl 1.0. Unfortunately, this means that certain method calls and functions that were present in mod_perl version 1.0 are missing or modified in mod_perl 2.0. If mod_perl 2.0 tells you that some method is missing and it can't be found using L, it's most likely because the method doesn't exist in the mod_perl 2.0 API. It's also possible that the method does still exist, but nevertheless it doesn't work, since its usage has changed (e.g. its prototype has changed, or it requires different arguments, etc.). In either of these cases, refer to L for an exhaustive list of API calls that have been modified or removed. =head3 Methods that No Longer Exist Some methods that existed in mod_perl 1.0 simply do not exist anywhere in version 2.0 and you must therefore call a different method o methods to get the functionality you want. For example, suppose we have a mod_perl 1.0 code snippet: $r->log_reason("Couldn't open the session file: $@"); If we try to run this under mod_perl 2.0 it will complain about the call to C. But when we use C to see which module to load in order to call that method, nothing is found: % perl -MModPerl::MethodLookup -le \ 'print((ModPerl::MethodLookup::lookup_method(shift))[0])' \ log_reason This prints: don't know anything about method 'log_reason' Looks like we are calling a non-existent method! Our next step is to refer to L, wherein we find that as we suspected, the method C no longer exists, and that L provided by the C module. =head3 Methods Whose Usage Has Been Modified Some methods still exist, but their usage has been modified, and your code must call them in the new fashion or it will generate an error. Most often the method call requires new or different arguments. For example, say our mod_perl 1.0 code said: $parsed_uri = Apache2::URI->parse($r, $r->uri); This code causes mod_perl 2.0 to complain first about not being able to load the method C via the package Apache2::URI. We use the tools described above to discover that the package containing our method has moved and change our code to load and use C: $parsed_uri = APR::URI->parse($r, $r->uri); But we still get an error. It's a little cryptic, but it gets the point across: p is not of type APR::Pool at /path/to/OurModule.pm line 9. What this is telling us is that the method C requires an APR::Pool object as its first argument. (Some methods whose usage has changed emit more helpful error messages prefixed with "Usage: ...") So we change our code to: $parsed_uri = APR::URI->parse($r->pool, $r->uri); and all is well in the world again. =head2 Requiring a specific mod_perl version. To require a module to run only under 2.0, simply add: use mod_perl 2.0; META: In fact, before 2.0 is released you really have to say: use mod_perl 1.99; And you can even require a specific version (for example when a certain API has been added only starting from that version). For example to require version 1.99_08, you can say: use mod_perl 1.9908; =head2 Should the Module Name Be Changed? If it is not possible to make your code run under both mod_perl versions (see below), you will have to maintain two separate versions of your own code. While you can change the name of the module for the new version, it's best to try to preserve the name and use some workarounds. META: need to discuss this more. =head2 Using C As a Tutorial Even if you have followed the recommendation and eschewed use of the C> module, you may find it useful to learn how the API has been changed and how to modify your own code. Simply look at the C source code and see how the functionality should be implemented in mod_perl 2.0. For example, mod_perl 2.0 doesn't provide the Cgensym> method. As we can see if we look at the C source, the functionality is now available via the core Perl module C and its C function. (Since mod_perl 2.0 works only with Perl versions 5.6 and higher, and C is included in the core Perl distribution since version 5.6.0, there was no reason to keep providing Cgensym>.) So if the original code looked like: my $fh = Apache->gensym; open $fh, $file or die "Can't open $file: $!"; in order to port it mod_perl 2.0 we can write: my $fh = Symbol::gensym; open $fh, $file or die "Can't open $file: $!"; Or we can even skip loading C, since under Perl version 5.6 and higher we can just do: open my $fh, $file or die "Can't open $file: $!"; =head2 How C was Ported to mod_perl 2.0 C is an elaborate application that uses a lot of mod_perl API. After porting it, I have realized that if you go through the notes or even better try to do it by yourself, referring to the notes only when in trouble, you will most likely be able to port any other mod_perl 1.0 module to run under mod_perl 2.0. So here the log of what I have done while doing the porting. Please notice that this tutorial should be considered as-is and I'm not claiming that I have got everything polished, so if you still find problems, that's absolutely OK. What's important is to try to learn from the process, so you can attack other modules on your own. I've started to work with C version 3.03 which you can retrieve from Lincoln's CPAN directory: http://search.cpan.org/CPAN/authors/id/L/LD/LDS/Apache-MP3-3.03.tar.gz Even though by the time you'll read this there will be newer versions available it's important that you use the same version as a starting point, since if you don't, the notes below won't make much sense. =head3 Preparations First of all, I scratched most of mine I and I leaving the bare minimum to get mod_perl started. This is needed to ensure that once I've completed the porting, the module will work correct on other users systems. For example if my I and I were loading some other modules, which in turn may load modules that a to-be-ported module may rely on, the ported module may work for me, but once released, it may not work for others. It's the best to create a new I when doing the porting putting only the required bits of configuration into it. =head4 I Next, I configure the C module, so we don't have to constantly restart the server after we modify C. In order to do that add to I: PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache2::*" PerlSetVar ReloadConstantRedefineWarnings Off You can refer to C> for more information if you aren't familiar with this module. The part: PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache::*" tells C to monitor only modules in the C and C namespaces. So C will be monitored. If your module is named C, make sure to include the right pattern for the C directive. Alternatively simply have: PerlSetVar ReloadAll On which will monitor all modules in C<%INC>, but will be a bit slower, as it'll have to C many more modules on each request. Finally, C uses constant subroutines. Because of that you will get lots of warnings every time the module is modified, which I wanted to avoid. I can safely shut those warnings off, since I'm not going to change those constants. Therefore I've used the setting PerlSetVar ReloadConstantRedefineWarnings Off If you do change those constants, refer to the section on C>. Next I configured C. In my case I've followed the C documentation, created a directory I under the server document root and added the corresponding directives to I. Now my I looked like this: #file:httpd.conf #--------------- Listen 127.0.0.1:8002 #... standard Apache configuration bits omitted ... LoadModule perl_module modules/mod_perl.so PerlSwitches -wT PerlRequire "/home/httpd/2.0/perl/startup.pl" PerlModule Apache2::Reload PerlInitHandler Apache2::Reload PerlSetVar ReloadAll Off PerlSetVar ReloadModules "ModPerl::* Apache::*" PerlSetVar ReloadConstantRedefineWarnings Off AddType audio/mpeg mp3 MP3 AddType audio/playlist m3u M3U AddType audio/x-scpls pls PLS AddType application/x-ogg ogg OGG SetHandler perl-script PerlResponseHandler Apache::MP3 PerlSetVar PlaylistImage playlist.gif PerlSetVar StreamBase http://localhost:8002 PerlSetVar BaseDir /mp3 =head4 I Since chances are that no mod_perl 1.0 module will work out of box without at least preloading some modules, I've enabled the C module. Now my I looked like this: #file:startup.pl #--------------- use lib qw(/home/httpd/2.0/perl); use Apache2::compat; =head4 I Before I even started porting C, I've added the warnings pragma to I (which wasn't there because mod_perl 1.0 had to work with Perl versions prior to 5.6.0, which is when the C pragma was added): #file:apache_mp3_prep.diff --- Apache/MP3.pm.orig 2003-06-03 18:44:21.000000000 +1000 +++ Apache/MP3.pm 2003-06-03 18:44:47.000000000 +1000 @@ -4,2 +4,5 @@ use strict; +use warnings; +no warnings 'redefine'; # XXX: remove when done with porting + From now on, I'm going to use unified diffs which you can apply using C. Though you may have to refer to its manpage on your platform since the usage flags may vary. On linux I'd apply the above patch as: % cd ~/perl/blead-ithread/lib/site_perl/5.9.0/ % patch -p0 < apache_mp3_prep.diff (note: I've produced the above patch and one more below with C, to avoid the RCS Id tag geting into this document. Normally I produce diffs with C which uses the default context of 3.) assuming that I is located in the directory I<~/perl/blead-ithread/lib/site_perl/5.9.0/>. I've enabled the C pragma even though I did have warnings turned globally in I with: PerlSwitches -wT it's possible that some badly written module has done: $^W = 0; without localizing the change, affecting other code. Also notice that the I mode was enabled from I, something that you shouldn't forget to do. I have also told the C pragma not to complain about redefined subs via: no warnings 'redefine'; # XXX: remove when done with porting I will remove that code, once porting is completed. At this point I was ready to start the porting process and I have started the server. % hup2 I'm using the following aliases to save typing: alias err2 "tail -f ~/httpd/prefork/logs/error_log" alias acc2 "tail -f ~/httpd/prefork/logs/access_log" alias stop2 "~/httpd/prefork/bin/apachectl stop" alias start2 "~/httpd/prefork/bin/apachectl start" alias restart2 "~/httpd/prefork/bin/apachectl restart" alias graceful2 "~/httpd/prefork/bin/apachectl graceful" alias hup2 "stop2; sleep 3; start2; err2" (I also have a similar set of aliases for mod_perl 1.0) =head3 Porting with C I have configured my server to listen on port 8002, so I issue a request http://localhost:8002/mp3/ in one console: % lynx --dump http://localhost:8002/mp3/ keeping the I open in the other: % err2 which expands to: % tail -f ~/httpd/prefork/logs/error_log When the request is issued, the I file tells me: [Thu Jun 05 15:29:45 2003] [error] [client 127.0.0.1] Usage: Apache2::RequestRec::new(classname, c, base_pool=NULL) at .../Apache/MP3.pm line 60. Looking at the code: 58: sub handler ($$) { 59: my $class = shift; 60: my $obj = $class->new(@_) or die "Can't create object: $!"; The problem is that handler wasn't invoked as method, but had C<$r> passed to it (we can tell because C was invoked as C, whereas it should have been C. Why I wasn't passed as the first argument? I go to L and find that L are now marked using the I subroutine attribute. So I modify the code: --- Apache/MP3.pm.0 2003-06-05 15:29:19.000000000 +1000 +++ Apache/MP3.pm 2003-06-05 15:38:41.000000000 +1000 @@ -55,7 +55,7 @@ my $NO = '^(no|false)$'; # regular expression my $YES = '^(yes|true)$'; # regular expression -sub handler ($$) { +sub handler : method { my $class = shift; my $obj = $class->new(@_) or die "Can't create object: $!"; return $obj->run(); and issue the request again (no server restart needed). This time we get a bunch of looping redirect responses, due to a bug in mod_dir which kicks in to handle the existing dir and messing up with C<$r-Epath_info> keeping it empty at all times. I thought I could work around this by not having the same directory and location setting, e.g. by moving the location to be I while keeping the physical directory with mp3 files as I<$DocumentRoot/mp3/>, but C won't let you do that. So a solution suggested by Justin Erenkrantz is to simply shortcut that piece of code with: --- Apache/MP3.pm.1 2003-06-06 14:50:59.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 14:51:11.000000000 +1000 @@ -253,7 +253,7 @@ my $self = shift; my $dir = shift; - unless ($self->r->path_info){ + unless ($self->r->path_info eq ''){ #Issue an external redirect if the dir isn't tailed with a '/' my $uri = $self->r->uri; my $query = $self->r->args; which is equivalent to removing this code, until the bug is fixed (it was still there as of Apache 2.0.46). But the module still works without this code, because if you issue a request to I (w/o trailing slash) mod_dir, will do the redirect for you, replacing the code that we just removed. In any case this got me past this problem. Since I have turned on the warnings pragma now I was getting loads of I warnings from C<$r-Edir_config()> whose return value were used without checking whether they are defined or not. But you'd get them with mod_perl 1.0 as well, so they are just an example of not-so clean code, not really a relevant obstacle in my pursuit to port this module to mod_perl 2.0. Unfortunately they were cluttering the log file so I had to fix them. I've defined several convenience functions: sub get_config { my $val = shift->r->dir_config(shift); return defined $val ? $val : ''; } sub config_yes { shift->get_config(shift) !~ /$YES/oi; } sub config_no { shift->get_config(shift) !~ /$NO/oi; } and replaced them as you can see in this patch: F, it was 194 lines long so I didn't inline it here, but it was quick to create with a few regexes search-n-replace manipulations in xemacs. Now I have the browsing of the root I directory and its sub-directories working. If I click on I<'Fetch'> of a particular song it works too. However if I try to I<'Stream'> a song, I get a 500 response with error_log telling me: [Fri Jun 06 15:33:33 2003] [error] [client 127.0.0.1] Bad arg length for Socket::unpack_sockaddr_in, length is 31, should be 16 at .../5.9.0/i686-linux-thread-multi/Socket.pm line 370. It would be certainly nice for I to use C instead of C so we will know where in the C code this problem was triggered. However reading the I manpage reveals that C in the list context is the same as calling an explicit C, and in the scalar context it's calling C. So I have found C was the only I function used in C and I have found this code in the function C: my $r = $self->r; my ($serverport,$serveraddr) = sockaddr_in($r->connection->local_addr); my ($remoteport,$remoteaddr) = sockaddr_in($r->connection->remote_addr); return $serveraddr eq $remoteaddr; Since something is wrong with function calls C<$r-Econnection-Elocal_addr> and/or C<$r-Econnection-Eremote_addr> and I referred to L and found L on these two functions. Indeed the API have changed. Instead of returning a packed C string, Apache now returns an C> object, which I can query to get the bits of information I'm interested in. So I applied this patch: --- Apache/MP3.pm.3 2003-06-06 15:36:15.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 15:56:32.000000000 +1000 @@ -1533,10 +1533,9 @@ # allows the player to fast forward, pause, etc. sub is_local { my $self = shift; - my $r = $self->r; - my ($serverport,$serveraddr) = sockaddr_in($r->connection->local_addr); - my ($remoteport,$remoteaddr) = sockaddr_in($r->connection->remote_addr); - return $serveraddr eq $remoteaddr; + my $c = $self->r->connection; + require APR::SockAddr; + return $c->local_addr->ip_get eq $c->remote_addr->ip_get; } # Check if the requesting client is on the local network, as defined by And voila, the streaming option now works. I get a warning on I<'Use of uninitialized value'> on line 1516 though, but again this is unrelated to the porting issues, just a flow logic problem, which wasn't triggered without the warnings mode turned on. I have fixed it with: --- Apache/MP3.pm.4 2003-06-06 15:57:15.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 16:04:48.000 @@ -1492,7 +1492,7 @@ my $suppress_auth = shift; my $r = $self->r; - my $auth_info; + my $auth_info = ''; # the check for auth_name() prevents an anno # the apache server log when authentication if ($r->auth_name && !$suppress_auth) { @@ -1509,10 +1509,9 @@ } my $vhost = $r->hostname; - unless ($vhost) { - $vhost = $r->server->server_hostname; - $vhost .= ':' . $r->get_server_port unless - } + $vhost = $r->server->server_hostname unless + $vhost .= ':' . $r->get_server_port unless $ + return "http://${auth_info}${vhost}"; } This completes the first part of the porting. I have tried to use all the visible functions of the interface and everything seemed to work and I haven't got any warnings logged. Certainly I may have missed some usage patterns which may be still problematic. But this is good enough for this tutorial. =head3 Getting Rid of the C Dependency The final stage is going to get rid of C since this is a CPAN module, which must not load C on its own. I'm going to make C work with mod_perl 2.0 all by itself. The first step is to comment out the loading of C in I: #file:startup.pl #--------------- use lib qw(/home/httpd/2.0/perl); #use Apache2::compat (); =head3 Ensuring that C is not loaded The second step is to make sure that C doesn't get loaded indirectly, through some other module. So I've added this line of code to I: --- Apache/MP3.pm.5 2003-06-06 16:17:50.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 16:21:14.000000000 +1000 @@ -3,2 +3,6 @@ +BEGIN { + die "Apache2::compat is loaded loaded" if $INC{'Apache2/compat.pm'}; +} + use strict; and indeed, even though I've commented out the loading of C from I, this module was still getting loaded. I knew that because the request to I were failing with the error message: Apache2::compat is loaded loaded at ... There are several ways to find the guilty party, you can C for it in the perl libraries, you can override C in I: BEGIN { use Carp; *CORE::GLOBAL::require = sub { Carp::cluck("Apache2::compat is loaded") if $_[0] =~ /compat/; CORE::require(@_); }; } or you can modify I and make it print the calls trace when it gets compiled: --- Apache2/compat.pm.orig 2003-06-03 16:11:07.000000000 +1000 +++ Apache2/compat.pm 2003-06-03 16:11:58.000000000 +1000 @@ -1,5 +1,9 @@ package Apache2::compat; +BEGIN { + use Carp; + Carp::cluck("Apache2::compat is loaded by"); +} I've used this last technique, since it's the safest one to use. Remember that C can also be loaded with: do "Apache2/compat.pm"; in which case, neither C'ping for C, nor overriding C will do the job. When I've restarted the server and tried to use C (I wasn't preloading it at the server startup since I wanted the server to start normally and cope with problem when it's running), the I had an entry: Apache2::compat is loaded by at .../Apache2/compat.pm line 6 Apache2::compat::BEGIN() called at .../Apache2/compat.pm line 8 eval {...} called at .../Apache2/compat.pm line 8 require Apache2/compat.pm called at .../5.9.0/CGI.pm line 169 require CGI.pm called at .../site_perl/5.9.0/Apache/MP3.pm line 8 Apache::MP3::BEGIN() called at .../Apache2/compat.pm line 8 (I've trimmed the whole paths of the libraries and the trace itself, to make it easier to understand.) We could have used C which would have told us only the fact that C was loaded by C, but by using C we've obtained the whole stack backtrace so we also can learn which module has loaded C. Here I've learned that I had an old version of C (2.89) which automatically loaded C (which L). Once I've upgraded C to version 2.93 and restarted the server, C wasn't getting loaded any longer. =head3 Installing the C Helper Now that C is not loaded, I need to deal with two issues: modules that need to be loaded and APIs that have changed. For the second issue I'll have to refer to the L. But the first issue can be easily worked out using C>. As explained in the section L Programmatically|/Using_C_ModPerl__MethodLookup__Programmatically> I've added the C> code to my I so it'll automatically lookup the packages that I need to load based on the request method and the object type. So now my I looked like: #file:startup.pl #--------------- use lib qw(/home/httpd/2.0/perl); { package ModPerl::MethodLookupAuto; use ModPerl::MethodLookup; use Carp; sub handler { # look inside mod_perl:: Apache2:: APR:: ModPerl:: excluding DESTROY my $skip = '^(?!DESTROY$'; *UNIVERSAL::AUTOLOAD = sub { my $method = $AUTOLOAD; return if $method =~ /DESTROY/; my ($hint, @modules) = ModPerl::MethodLookup::lookup_method($method, @_); $hint ||= "Can't find method $AUTOLOAD"; croak $hint; }; return 0; } } 1; and I add to my I: PerlChildInitHandler ModPerl::MethodLookupAuto =head3 Adjusting the code to run under mod_perl 2 I restart the server and off I go to complete the second porting stage. The first error that I've received was: [Fri Jun 06 16:28:32 2003] [error] failed to resolve handler `Apache::MP3' [Fri Jun 06 16:28:32 2003] [error] [client 127.0.0.1] Can't locate object method "boot" via package "mod_perl" at .../Apache/Constants.pm line 8. Compilation failed in require at .../Apache/MP3.pm line 12. I go to line 12 and find the following code: use Apache::Constants qw(:common REDIRECT HTTP_NO_CONTENT DIR_MAGIC_TYPE HTTP_NOT_MODIFIED); Notice that I did have mod_perl 1.0 installed, so the C module from mod_perl 1.0 couldn't find the C method which doesn't exist in mod_perl 2.0. If you don't have mod_perl 1.0 installed the error would simply say, that it can't find I in C<@INC>. In any case, we are going to replace this code with mod_perl 2.0 equivalent: --- Apache/MP3.pm.6 2003-06-06 16:33:05.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 17:03:43.000000000 +1000 @@ -9,7 +9,9 @@ use warnings; no warnings 'redefine'; # XXX: remove when done with porting -use Apache::Constants qw(:common REDIRECT HTTP_NO_CONTENT DIR_MAGIC_TYPE HTTP_NOT_MODIFIED); +use Apache2::Const -compile => qw(:common REDIRECT HTTP_NO_CONTENT + DIR_MAGIC_TYPE HTTP_NOT_MODIFIED); + use Apache::MP3::L10N; use IO::File; use Socket 'sockaddr_in'; and I also had to adjust the constants, since what used to be C, now has to be C, mainly because in mod_perl 2.0 there is an enormous amount of constants (coming from Apache and APR) and most of them are grouped in C or C namespaces. The C> and C> manpage provide more information on available constants. This search and replace accomplished the job: % perl -pi -e 's/return\s(OK|DECLINED|FORBIDDEN| \ REDIRECT|HTTP_NO_CONTENT|DIR_MAGIC_TYPE| \ HTTP_NOT_MODIFIED)/return Apache2::$1/xg' Apache/MP3.pm As you can see the regex explicitly lists all constants that were used in C. Your situation may vary. Here is the patch: F. I had to manually fix the C constant which didn't fit the regex pattern: --- Apache/MP3.pm.8 2003-06-06 17:24:33.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 17:26:29.000000000 +1000 @@ -1055,7 +1055,7 @@ my $mime = $self->r->lookup_file("$dir/$d")->content_type; - push(@directories,$d) if !$seen{$d}++ && $mime eq DIR_MAGIC_TYPE; + push(@directories,$d) if !$seen{$d}++ && $mime eq Apache2::Const::DIR_MAGIC_TYPE; # .m3u files should be configured as audio/playlist MIME types in your apache .conf file push(@playlists,$d) if $mime =~ m!^audio/(playlist|x-mpegurl|mpegurl|x-scpls)$!; And I move on, the next error is: [Fri Jun 06 17:28:00 2003] [error] [client 127.0.0.1] Can't locate object method "header_in" via package "Apache2::RequestRec" at .../Apache2/MP3.pm line 85. The L quickly L me that C and its brothers C and C are R.I.P. and that I have to use the corresponding functions C, C and C which are available in mod_perl 1.0 API as well. So I adjust the code to use the new API: % perl -pi -e 's|header_in\((.*?)\)|headers_in->{$1}|g' Apache/MP3.pm % perl -pi -e 's|header_out\((.*?)\s*=>\s*(.*?)\);|headers_out->{$1} = $2;|g' Apache/MP3.pm which results in this patch: F. On the next error C> kicks in. Instead of complaining: [Fri Jun 06 18:35:53 2003] [error] [client 127.0.0.1] Can't locate object method "FETCH" via package "APR::Table" at .../Apache/MP3.pm line 85. I now get: [Fri Jun 06 18:36:35 2003] [error] [client 127.0.0.1] to use method 'FETCH' add: use APR::Table (); at .../Apache/MP3.pm line 85 So I follow the suggestion and load C: --- Apache/MP3.pm.10 2003-06-06 17:57:54.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 18:37:33.000000000 +1000 @@ -9,6 +9,8 @@ use warnings; no warnings 'redefine'; # XXX: remove when done with porting +use APR::Table (); + use Apache2::Const -compile => qw(:common REDIRECT HTTP_NO_CONTENT DIR_MAGIC_TYPE HTTP_NOT_MODIFIED); I continue issuing the request and adding the missing modules again and again till I get no more complaints. During this process I've added the following modules: --- Apache/MP3.pm.11 2003-06-06 18:38:47.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 18:39:10.000000000 +1000 @@ -9,6 +9,14 @@ use warnings; no warnings 'redefine'; # XXX: remove when done with porting +use Apache2::Connection (); +use Apache2::SubRequest (); +use Apache2::Access (); +use Apache2::RequestIO (); +use Apache2::RequestUtil (); +use Apache2::RequestRec (); +use Apache2::ServerUtil (); +use Apache2::Log; use APR::Table (); use Apache2::Const -compile => qw(:common REDIRECT HTTP_NO_CONTENT The AUTOLOAD code helped me to trace the modules that contain the existing APIs, however I still have to deal with APIs that no longer exist. Rightfully the helper code says that it doesn't know which module defines the method: C because it no longer exists in Apache 2.0 vocabulary: [Fri Jun 06 18:40:34 2003] [error] [client 127.0.0.1] Don't know anything about method 'send_http_header' at .../Apache/MP3.pm line 498 So I go back to the L and find the L. In 2.0 lingo, we just need to set the C: --- Apache/MP3.pm.12 2003-06-06 18:43:42.000000000 +1000 +++ Apache/MP3.pm 2003-06-06 18:51:23.000000000 +1000 @@ -138,7 +138,7 @@ sub help_screen { my $self = shift; - $self->r->send_http_header( $self->html_content_type ); + $self->r->content_type( $self->html_content_type ); return Apache2::Const::OK if $self->r->header_only; print start_html( @@ -336,7 +336,7 @@ my $r = $self->r; my $base = $self->stream_base; - $r->send_http_header('audio/mpegurl'); + $r->content_type('audio/mpegurl'); return Apache2::Const::OK if $r->header_only; # local user @@ -495,7 +495,7 @@ return Apache2::Const::DECLINED unless my ($directories,$mp3s,$playlists,$txtfiles) = $self->read_directory($dir); - $self->r->send_http_header( $self->html_content_type ); + $self->r->content_type( $self->html_content_type ); return Apache2::Const::OK if $self->r->header_only; $self->page_top($dir); also I've noticed that there was this code: return Apache2::Const::OK if $self->r->header_only; This technique is no longer needed in 2.0, since Apache 2.0 automatically discards the body if the request is of type C -- the handler should still deliver the whole body, which helps to calculate the content-length if this is relevant to play nicer with proxies. So you may decide not to make a special case for C requests. At this point I was able to browse the directories and play files via most options without relying on C. There were a few other APIs that I had to fix in the same way, while trying to use the application, looking at the I referring to the L and applying the suggested fixes. I'll make sure to send all these fixes to Lincoln Stein, so the new versions will work correctly with mod_perl 2.0. I also had to fix other C files, which come as a part of the C distribution, pretty much using the same techniques explained here. A few extra fixes of interest in C were: =over =item C As of this writing we don't have this function in the core, because Apache 2.0 doesn't have it (it's in C but implemented in a slow way). However we may provide one in the future. Currently one can use the function C which requires a filename as an argument and not the file descriptor. So I have fixed the code: - if($r->request($r->uri)->content_type eq 'audio/x-scpls'){ - open(FILE,$r->filename) || return 404; - $r->send_fd(\*FILE); - close(FILE); + + if($r->content_type eq 'audio/x-scpls'){ + $r->sendfile($r->filename) || return Apache2::Const::NOT_FOUND; =item C C is now C: - $self->r->log_reason('Invalid parameters -- possible attempt to circumvent checks.'); + $r->log_error('Invalid parameters -- possible attempt to circumvent checks.') ; =back I have found the porting process to be quite interesting, especially since I have found several bugs in Apache 2.0 and documented a few undocumented API changes. It was also fun, because I've got to listen to mp3 files when I did things right, and was getting silence in my headphones and a visual irritation in the form of I messages when I didn't ;) =head1 Porting a Module to Run under both mod_perl 2.0 and mod_perl 1.0 Sometimes code needs to work with both mod_perl versions. For example this is the case with CPAN module developers who wish to continue to maintain a single code base, rather than supplying two separate implementations. =head2 Making Code Conditional on Running mod_perl Version In this case you can test for which version of mod_perl your code is running under and act appropriately. To continue our example above, let's say we want to support opening a filehandle in both mod_perl 2.0 and mod_perl 1.0. Our code can make use of the environment variable C<$ENV{MOD_PERL_API_VERSION}> use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ); # ... require Symbol if MP2; # ... my $fh = MP2 ? Symbol::gensym : Apache->gensym; open $fh, $file or die "Can't open $file: $!"; Some modules, like C may work under mod_perl and without it, and will want to use the mod_perl 1.0 API if that's available, or mod_perl 2.0 API otherwise. So the following idiom could be used for this purpose. use constant MP_GEN => $ENV{MOD_PERL} ? { ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ) ? 2 : 1 } : 0; It sets the constant C to 0 if mod_perl is not available, to 1 if running under mod_perl 1.0 and 2 for mod_perl 2.0. Here's another way to find out the mod_perl version. In the server configuration file you can use a special configuration "define" symbol C, which is magically enabled internally, as if the server had been started with C<-DMODPERL2>. # in httpd.conf # 2.0 configuration # else From within Perl code this can be tested with C. For example, we can use this method to decide whether or not to call C<$r-Esend_http_header()>, which no longer exists in mod_perl 2.0: sub handler { my $r = shift; $r->content_type('text/html'); $r->send_http_header() unless Apache2::exists_config_define("MODPERL2"); ... } Relevant links to other places in the porting documents: =over =item * L =back =head2 Method Handlers Method handlers in mod_perl are declared L attribute|docs::2.0::user::porting::compat/Method_Handlers>. However if you want to have the same code base for mod_perl 1.0 and 2.0 applications, whose handler has to be a method, you will need to do the following trick: sub handler_mp1 ($$) { ... } sub handler_mp2 : method { ... } *handler = MP2 ? \&handler_mp2 : \&handler_mp1; Note that this requires at least Perl 5.6.0, the I<:method> attribute is not supported by older Perl versions, which will fail to compile such code. Here are two complete examples. The first example implements C which has a single method that works for both mod_perl generations: The configuration: PerlModule MyApache2::Method SetHandler perl-script PerlHandler MyApache2::Method->handler The code: #file:MyApache2/Method.pm package MyApache2::Method; # PerlModule MyApache2::Method # # SetHandler perl-script # PerlHandler MyApache2::Method->handler # use strict; use warnings; use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION >= 2 ); BEGIN { if (MP2) { require Apache2::RequestRec; require Apache2::RequestIO; require Apache2::Const; Apache2::Const->import(-compile => 'OK'); } else { require Apache; require Apache::Constants; Apache::Constants->import('OK'); } } sub handler_mp1 ($$) { &run } sub handler_mp2 : method { &run } *handler = MP2 ? \&handler_mp2 : \&handler_mp1; sub run { my ($class, $r) = @_; MP2 ? $r->content_type('text/plain') : $r->send_http_header('text/plain'); print "$class was called\n"; return MP2 ? Apache2::Const::OK : Apache::Constants::OK; } Here are two complete examples. The second example implements C, which is very similar to C, but uses separate methods for mod_perl 1.0 and 2.0 servers. The configuration is the same: PerlModule MyApache2::Method2 SetHandler perl-script PerlHandler MyApache2::Method2->handler The code: #file:MyApache2/Method2.pm package MyApache2::Method2; # PerlModule MyApache2::Method # # SetHandler perl-script # PerlHandler MyApache2::Method->handler # use strict; use warnings; use mod_perl; use constant MP2 => ( exists $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION >= 2 ); BEGIN { warn "running $ENV{MOD_PERL_API_VERSION}\n"; if (MP2) { require Apache2::RequestRec; require Apache2::RequestIO; require Apache2::Const; Apache2::Const->import(-compile => 'OK'); } else { require Apache; require Apache::Constants; Apache::Constants->import('OK'); } } sub handler_mp1 ($$) { &mp1 } sub handler_mp2 : method { &mp2 } *handler = MP2 ? \&handler_mp2 : \&handler_mp1; sub mp1 { my ($class, $r) = @_; $r->send_http_header('text/plain'); $r->print("mp1: $class was called\n"); return Apache::Constants::OK(); } sub mp2 { my ($class, $r) = @_; $r->content_type('text/plain'); $r->print("mp2: $class was called\n"); return Apache2::Const::OK(); } Assuming that mod_perl 1.0 is listening on port 8001 and mod_perl 2.0 on 8002, we get the following results: % lynx --source http://localhost:8001/method MyApache2::Method was called % lynx --source http://localhost:8001/method2 mp1: MyApache2::Method2 was called % lynx --source http://localhost:8002/method MyApache2::Method was called % lynx --source http://localhost:8002/method2 mp2: MyApache2::Method2 was called =head1 The Conflict of mp1 vs mp2 vs mp22 vs ... vs mpNN META: should something be said here? =head2 Distributors Distributors should mark the different generations of mod_perl core as conflicting, so only one version can be installed using the binary package. Users requiring more than one installation should do a manual install. In order to have any of the 3rd party modperl modules installed users need to have the correct modperl package installed. So there is no need to mark the 3rd party modules as conflicting, since their most important prerequisite (the modperl-core) is already handling that. Of course packagers can decide to make the two generation packages as non-conflicting, by building all mp2 core and 3rd party modules into F subdir, in which case the two will always co-exist. But this is not the most logical approach since 99% of users will want only one generation of mod_perl core and 3rd party modules. =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. Stas Bekman [http://stason.org/] =head1 Authors =over =item * Nick Tonkin Enick (at) tonkinresolutions.comE =item * Stas Bekman [http://stason.org/] =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/docs/user/troubleshooting/0000755000104000010010000000000012540623200021113 5ustar AdministratorsNonemod_perl-2.0.9/docs/user/troubleshooting/troubleshooting.pod0000644000104000010010000006313012540623200025051 0ustar AdministratorsNone=head1 NAME Troubleshooting mod_perl problems =head1 Description Frequently encountered problems (warnings and fatal errors) and their troubleshooting. =head1 Building and Installation =head2 Cannot find -lgdbm / libgdbm.so.3: open failed: No such file or directory Please see: L. Also it seems that on Solaris this exact issue doesn't show up at compile time, but at run time, so you may see the errors like: .../mod_perl-1.99_17/blib/arch/auto/APR/APR.so' for module APR: ld.so.1: /usr/local/ActivePerl-5.8/bin/perl: fatal: libgdbm.so.3: open failed: No such file or directory at ...5.8.3/sun4-solaris-thread-multi/DynaLoader.pm line 229. the solution is the same, make sure that you have the libgdbm shared library and it's properly symlinked. =head1 Configuration and Startup =head2 Can't locate F in C<@INC>... Sometimes you get a problem of perl not being able to locate a certain Perl module. This can happen in the mod_perl test suite or in the normal mod_perl setup. One of the possible reasons is a low limit on the number of files that can be opened by a single process. To check whether this is the problem run the process under C or an equivalent utility. For example on OpenBSD 3.5 the default setting for a maximum number of files opened by a single process seems to be 64, so when you try to run the mod_perl test suite, which opens a few hundreds of files, you will have a problem. e.g. the test suite may fail as: [Wed Aug 25 09:49:40 2004] [info] 26 Apache2:: modules loaded [Wed Aug 25 09:49:40 2004] [info] 7 APR:: modules loaded [Wed Aug 25 09:49:40 2004] [info] base server + 20 vhosts ready to run tests [Wed Aug 25 09:49:40 2004] [error] Can't locate TestFilter/in_str_consume.pm in @INC (@INC contains: ... Running the system calls tracing program (C on OpenBSD, C on Linux): % sudo ktrace -d /usr/local/apache/bin/httpd -d /tmp/mod_perl-2.0/t \ -f /tmp/mod_perl-2.0/t/conf/httpd.conf -DAPACHE2 -X looking at the ktrace dump reveals: 16641 httpd NAMI "/tmp/mod_perl-2.0/t/lib/TestFilter/in_str_consume.pmc" 16641 httpd RET stat -1 errno 2 No such file or directory 16641 httpd CALL open(0x3cdae100,0,0) 16641 httpd RET open -1 errno 24 Too many open files It's clear that Perl can't load F because it can't open the file. This problem can be resolved by increasing the open file limit to 128 (or higher): $ ulimit -n 128 =head2 "mod_perl.c" is not compatible with this version of Apache (found 20020628, need 20020903) That error message means that mod_perl was built against Apache released on or post-20020628, but you are trying to load it against one released on or post-20020903. You will see the same error message for any other Apache module -- this is an error coming from Apache, not mod_perl. Apache bumps up a special magic number every time it does a binary incompatible change, and then it makes sure that all modules that it loads were compiled against the same compatibility generation (which may include only one or quite a few Apache releases). You may encounter this situation when you upgrade to a newer Apache, without rebuilding mod_perl. Or when you have several versions of Apache installed on the same system. Or when you install prepackaged binary versions which aren't coming from the source and aren't made against the same Apache version. The solution is to have mod_perl built against the same Apache installed on your system. So either build from source or contact your binary version supplier and get a proper package(s) from them. =head2 Server Hanging at the Startup First you need to figure out where it hangs. strace(1) or an equivalent utility can be used to discover which call the server hangs on. You need to start the process in the single server mode so you will have only one process to monitor. For example if the server hangs during 'make test', you should run: % cd modperl-2.0 % strace /path/to/httpd -d t -f t/conf/httpd.conf \ -DAPACHE2 -DONE_PROCESS -DNO_DETATCH (and may be C<-DPERL_USEITHREADS> if it was in the original output of C.) If the trace ends with: open("/dev/random", O_RDONLY) = 3 read(3, then you have a problem with your OS, as F doesn't have enough entropy to give the required random data, and therefore it hangs. This may happen in C C call or Perl Cnew>. The solution in this case is either to fix the problem with your OS, so that % perl -le 'open I, "/dev/random"; read I, $d, 10; print $d' will print some random data and not block. Or you can use an even simpler test: % cat /dev/random which should print some random data and not block. If you can't fix the OS problem, you can rebuild Apache 2.0 with C<--with-devrandom=/dev/urandom> - however, that is not secure for certain needs. Alternatively setup EGD and rebuild Apache 2.0 with C<--with-egd>. Apache 2.1/apr-1.1 will have a self-contained PRNG generator built-in, which won't rely on F. =head2 (28)No space left on device httpd-2.0 is not very helpful at telling which device has run out of precious space. Most of the time when you get an error like: (28)No space left on device: mod_rewrite: could not create rewrite_log_lock it means that your system have run out of semaphore arrays. Sometimes it's full with legitimate semaphores at other times it's because some application has leaked semaphores and haven't cleaned them up during the shutdown (which is usually the case when an application segfaults). Use the relevant application to list the ipc facilities usage. On most Unix platforms this is usually an C utility. For example linux to list the semaphore arrays you should execute: % ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 2686976 stas 600 1 0x00000000 2719745 stas 600 1 0x00000000 2752514 stas 600 1 Next you have to figure out what are the dead ones and remove them. For example to remove the semid 2719745 execute: % ipcrm -s 2719745 Instead of manually removing each (and sometimes there can be many of them), and if you know that none of listed the semaphores is really used (all leaked), you can try to remove them all: % ipcs -s | perl -ane '`ipcrm -s $F[1]`' httpd-2.0 seems to use the key C<0x00000000> for its semaphores on Linux, so to remove only those that match that key you can use: % ipcs -s | perl -ane '/^0x00000000/ && `ipcrm -s $F[1]`' Notice that on other platforms the output of C might be different, so you may need to apply a different Perl one-liner. =head2 Segmentation Fault when Using DBI Update DBI to at least version 1.31. =head2 EPerlE directive missing closing 'E' See the L manpage. =head2 'Invalid per-unknown PerlOption: ParseHeaders' on HP-UX 11 for PA-RISC When building mod_perl 2.0 on HP-UX 11 for PA-RISC architecture, using the HP ANSI C compiler, please make sure you have installed patches PHSS_29484 and PHSS_29485. Once installed the issue should go away. =head1 Shutdown and Restart Issues happening during server shutdown and restart, or during specific interpreter shutdown at runtime with threaded mpm. =head2 Subroutines in EperlE sections under threaded mpm If you have defined a subroutine inside a EperlE section, under threaded mpm (or under perl with enabled ithreads which spawn its own ithreads), like so: sub foo {} At the server shutdown, or when any interpreter quits you will see the following error in the I: Attempt to free temp prematurely: SV 0x91b8e74, Perl interpreter: 0x8547698 during global destruction. Scalars leaked: 1 This is a bug in Perl and as of Perl 5.8.4 it's not resolved. For more information see: http://rt.perl.org:80/rt3/Ticket/Display.html?id=29018 =head2 Modules using C under threaded mpm Modules using C under threaded mpm may get: Attempt to free unreferenced scalar SV 0x8154f74. when each interprter exits. This is a bug in Perl and as of Perl 5.8.4 it's not resolved. For more information see: http://rt.perl.org:80/rt3/Ticket/Display.html?id=24660 =head1 Code Parsing and Compilation =head2 Segfault with __read_nocancel Backtrace If your application segfaults and you get a similar to the following backtrace: (gdb) bt #0 0x4030d4d1 in __read_nocancel () from /lib/tls/libpthread.so.0 #1 0x00000000 in ?? () that usually means that you've build your non-mod_perl modules with ithreads enabled perl. Then you have built a new perl B ithreads. But you didn't nuke/rebuild the old non-mod_perl modules. Now when you try to run those, you get the above segfault. To solve the problem recompile all the modules. The easiest way to accomplish that is to either remove all the modules completely, build the new perl and then install the new modules. You could also try to create a bundle of the existing modules using C prior to deleting the old modules, so you can easily reinstall all the modules you previously had. =head2 Registry scripts fail to load with: Unrecognized character \xEF at ... Certain editors (in particular on win32) may add a UTF-8 Byte Order Marker (BOM: http://www.unicode.org/faq/utf_bom.html#BOM) at the beginning of the file. Since C> adds extra code in front of the original script, before compiling it, it creates a situation where BOM appears past the beginning of the file, which is why the error: Unrecognized character \xEF at ... is thrown by Perl. The simplest solution is to configure your editor to not add BOMs (or switch to another editor which allows you to do that). You could also subclass C> or its existing subclasses to try to remove BOM in ModPerl::RegistryCooker::read_script(): # remove BOM ${$self->{CODE}} =~ s/^(?: \xef\xbb\xbf | \xfe\xff | \xff\xfe | \x00\x00\xfe\xff | \xff\xfe\x00\x00 )//x; but do you really want to add an overhead of this operation multiple times, when you could just change the source file once? Probably not. It was also reported that on win32 the above s/// doesn't work. =head1 Runtime =head2 error_log is Full of Escaped \n, \t, etc. It's an Apache "feature", see C>. =head2 Problems with Catching Signals See L. =head2 APR::Socket::recv: (11) Resource temporarily unavailable at ... You need to make sure that the socket is set to L before using it. =head2 Cnew> Hanging See L. =head2 Memory Leaks =over =item * s/// in perls 5.8.1 and 5.8.2 p5-porters report: http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-12/msg00634.html Fixed in 5.8.3. There is no workaround but to upgrade to 5.8.3 or higher. =back =head2 C Libraries Don't See C<%ENV> Entries Set by Perl Code For example some people have reported problems with C (whose guts are implemented in C), which doesn't see environment variables (like C, C, etc.) set in the perl script and therefore fails to connect. The issue is that the C array C is not thread-safe. Therefore mod_perl 2.0 unties C<%ENV> from the underlying C array under the I> handler. The C driver or client library uses C (which fetches from the C array). When C<%ENV> is untied from C, Perl code will see C<%ENV> changes, but C code will not. The I> handler does not untie C<%ENV> from C. Still one should avoid setting C<%ENV> values whenever possible. And if it is required, should be done at startup time. In the particular case of the C drivers, you can set the variables that don't change (C<$ENV{ORACLE_HOME}> and C<$ENV{NLS_LANG}> in the startup file, and those that change pass via the C method, e.g.: my $sid = 'ynt0'; my $dsn = 'dbi:Oracle:'; my $user = 'username/password'; my $password = ''; $dbh = DBI->connect("$dsn$sid", $user, $password) or die "Cannot connect: " . $DBI::errstr; Also remember that C requires that I (and any other stuff like I stuff) be in C<%ENV> when C is loaded (which might happen indirectly via the C module. Therefore you need to make sure that wherever that load happens C<%ENV> is properly set by that time. Another solution that works B, is to use C ( http://search.cpan.org/dist/Env-C/ ). This module sets the process level environ, bypassing Perl's C<%ENV>. This module is not thread-safe, due to the nature of environ process struct, so don't even try using it in a threaded environment. =head2 Error about not finding I with I You need to install at least version 3.11 of CGI.pm to work under mod_perl 2.0, as earlier CGI.pm versions aren't mod_perl 2.0 aware. =head2 20014:Error string not specified yet This error is reported when some undefined Apache error happens. The known cases are: =over =item when using mod_deflate A bug in mod_deflate was triggering this error, when a response handler would flush the data that was flushed earlier: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22259 It has been fixed in httpd-2.0.48. =back =head2 (22)Invalid argument: core_output_filter: writing data to the network Apache uses the sendfile syscall on platforms where it is available in order to speed sending of responses. Unfortunately, on some systems, Apache will detect the presence of sendfile at compile-time, even when it does not work properly. This happens most frequently when using network or other non-standard file-system. The whole story and the solutions are documented at: http://httpd.apache.org/docs-2.0/faq/error.html#error.sendfile =head2 undefined symbol: apr_table_compress After a successful mod_perl build, sometimes during the startup or a runtime you'd get an "undefined symbol: foo" error. The following is one possible scenario to encounter this problem and possible ways to resolve it. Let's say you ran mod_perl's test suite: % make test and got errors, and you looked in the F file (F) and saw one or more "undefined symbol" errors, e.g. % undefined symbol: apr_table_compress =over =item Step 1 From the source directory (same place you ran "make test") run: % ldd blib/arch/auto/APR/APR.so | grep apr- ldd is not available on all platforms, e.g. not on Darwin/OS X. Instead on Darwin/OS X, you can use their otool. You you should get a full path, for example: libapr-0.so.0 => /usr/local/apache2/lib/libapr-0.so.0 (0x40003000) or libapr-0.so.0 => /some/path/to/apache/lib/libapr-0.so.0 (0x40003000) or something like that. It's that full path to libapr-0.so.0 that you want. =item Step 2 Do: % nm /path/to/your/libapr-0.so.0 | grep table_compress for example: % nm /usr/local/apache2/lib/libapr-0.so.0 | grep table_compress You should get something like this: 0000d010 T apr_table_compress If you get the message: nm: /usr/local/apache2/lib/libapr-0.so.0: no symbols that means that the library was stripped. You probably want to obtain Apache 2.x or libapr source, matching your binary and check it instead. Or rebuild it with debugging enabled, which will not strip the symbols. Note that the "grep table_compress" is only an example, the exact string you are looking for is the name of the "undefined symbol" from the I file. So, if you get: undefined symbol apr_holy_grail then you would do: % nm /usr/local/apache2/lib/libapr-0.so.0 | grep holy_grail =item Step 3 Now, let's see what shared libraries your apache binary has. So, if in step 1 you got F then you will do: % ldd /usr/local/apache2/bin/httpd if in step 1 you got F then you do: % ldd /foo/bar/apache/bin/httpd The output should look something like this: libssl.so.2 => /lib/libssl.so.2 (0x40023000) libcrypto.so.2 => /lib/libcrypto.so.2 (0x40054000) libaprutil-0.so.0 => /usr/local/apache2/lib/libaprutil-0.so.0 (0x40128000) libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x4013c000) libdb-4.0.so => /lib/libdb-4.0.so (0x40143000) libexpat.so.0 => /usr/lib/libexpat.so.0 (0x401eb000) libapr-0.so.0 => /usr/local/apache2/lib/libapr-0.so.0 (0x4020b000) librt.so.1 => /lib/librt.so.1 (0x40228000) libm.so.6 => /lib/i686/libm.so.6 (0x4023a000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x4025c000) libnsl.so.1 => /lib/libnsl.so.1 (0x40289000) libdl.so.2 => /lib/libdl.so.2 (0x4029f000) libpthread.so.0 => /lib/i686/libpthread.so.0 (0x402a2000) libc.so.6 => /lib/i686/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Those are name =E value pairs showing the shared libraries used by the C binary. Take note of the value for F and compare it to what you got in step 1. They should be the same, if not, then mod_perl was compiled pointing to the wrong Apache installation. You should run "make clean" and then % perl Makefile.pl MP_APACHE_CONFIG=/path/to/apache/bin/apr-config using the correct path for the Apache installation. =item Step 4 You should also search for extra copies of F. If you find one in I or I that will explain the problem. Most likely you have an old pre-installed apr package which gets loaded before the copy you found in step 1. On most Linux (and Mac OS X) machines you can do a fast search with: % locate libapr-0.so.0 which searches a database of files on your machine. The "locate" database isn't always up-to-date so a slower, more comprehensive search can be run (as root if possible): % find / -name "libapr-0.so.0*" or % find /usr/local -name "libapr-0.so.0*" You might get output like this: /usr/local/apache2.0.47/lib/libapr-0.so.0.9.4 /usr/local/apache2.0.47/lib/libapr-0.so.0 /usr/local/apache2.0.45/lib/libapr-0.so.0.9.3 /usr/local/apache2.0.45/lib/libapr-0.so.0 in which case you would want to make sure that you are configuring and compiling mod_perl with the latest version of apache, for example using the above output, you would do: % perl Makefile.PL MP_AP_CONFIG=/usr/local/apache2.0.47 % make % make test =back There could be other causes, but this example shows you how to act when you encounter this problem. =head2 Variable $x will not stay shared at This warning is normally as a result of variables that your script is sharing with subroutines globally, rather than passing by value or reference. As the cause and solution of this is virtually identical to another commonly encountered problem (L), the text is not repeated here but is instead included in that section which follows this one. You may have read somewhere F that this warning can be ignored, but if you read on you will see that you should F ignore the warning. The other thing that might confuse you is that this warning is normally encountered when defining subroutines within subroutines. So why would you experience it in your script where that is not the case? The reason is because mod_perl wraps your script in its own subroutine (see the L documentation for more details). =head2 Sometimes it Works, Sometimes it Doesn't When you start running your scripts under mod_perl, you might find yourself in a situation where a script seems to work, but sometimes it screws up. And the more it runs without a restart, the more it screws up. Often the problem is easily detectable and solvable. You have to test your script under a server running in single process mode (C). Generally the problem is the result of using global variables (normally accompanied by a L warning). Because global variables don't change from one script invocation to another unless you change them, you can find your scripts do strange things. Let's look at three real world examples: =head3 An Easy Break-in The first example is amazing: Web Services. Imagine that you enter some site where you have an account, perhaps a free email account. Having read your own mail you decide to take a look at someone else's. You type in the username you want to peek at and a dummy password and try to enter the account. On some services this will work!!! You say, why in the world does this happen? The answer is simple: B. You have entered the account of someone who happened to be served by the same server child as you. Because of sloppy programming, a global variable was not reset at the beginning of the program and voila, you can easily peek into someone else's email! Here is an example of sloppy code: use vars ($authenticated); my $q = new CGI; my $username = $q->param('username'); my $passwd = $q->param('passwd'); authenticate($username,$passwd); # failed, break out unless ($authenticated){ print "Wrong passwd"; exit; } # user is OK, fetch user's data show_user($username); sub authenticate{ my ($username,$passwd) = @_; # some checking $authenticated = 1 if SOME_USER_PASSWD_CHECK_IS_OK; } Do you see the catch? With the code above, I can type in any valid username and any dummy password and enter that user's account, provided she has successfully entered her account before me using the same child process! Since C<$authenticated> is global--if it becomes 1 once, it'll stay 1 for the remainder of the child's life!!! The solution is trivial--reset C<$authenticated> to 0 at the beginning of the program. A cleaner solution of course is not to rely on global variables, but rely on the return value from the function. my $q = CGI->new; my $username = $q->param('username'); my $passwd = $q->param('passwd'); my $authenticated = authenticate($username,$passwd); # failed, break out unless ($authenticated){ print "Wrong passwd"; exit; } # user is OK, fetch user's data show_user($username); sub authenticate{ my ($username,$passwd) = @_; # some checking return (SOME_USER_PASSWD_CHECK_IS_OK) ? 1 : 0; } Of course this example is trivial--but believe me it happens! =head3 Thinking mod_cgi Just another little one liner that can spoil your day, assuming you forgot to reset the C<$allowed> variable. It works perfectly OK in plain mod_cgi: $allowed = 1 if $username eq 'admin'; But using mod_perl, and if your system administrator with superuser access rights has previously used the system, anybody who is lucky enough to be served later by the same child which served your administrator will happen to gain the same rights. The obvious fix is: $allowed = $username eq 'admin' ? 1 : 0; =head3 Regular Expression Memory Another good example is usage of the C regular expression modifier, which compiles a regular expression once, on its first execution, and never compiles it again. This problem can be difficult to detect, as after restarting the server each request you make will be served by a different child process, and thus the regex pattern for that child will be compiled afresh. Only when you make a request that happens to be served by a child which has already cached the regex will you see the problem. Generally you miss that. When you press reload, you see that it works (with a new, fresh child). Eventually it doesn't, because you get a child that has already cached the regex and won't recompile because of the C modifier. An example of such a case would be: my $pat = $q->param("keyword"); foreach( @list ) { print if /$pat/o; } To make sure you don't miss these bugs always test your CGI in L. To solve this particular C modifier problem refer to L. For more details and further examples please see the L documentation. =head1 Issues with APR Used Outside of mod_perl It doesn't strictly belong to this document, since it's talking about APR usages outside of mod_perl, so this may move to its own dedicated page, some time later. Whenever using an C package outside of mod_perl, you need to: use APR; in order to load the XS subroutines. For example: % perl -MAPR -MAPR::UUID -le 'print APR::UUID->new->format' =head1 Maintainers Maintainer is the person(s) you should contact with updates, corrections and patches. =over =item * Stas Bekman =back =head1 Authors =over =item * Stas Bekman =back Only the major authors are listed above. For contributors see the Changes file. =cut mod_perl-2.0.9/INSTALL0000644000177200010010000000120712540623200013106 0ustar SteveNoneSimple install: % perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs % make && make test % make install Simple config: LoadModule perl_module modules/mod_perl.so #PerlModule Apache::compat # your config comes here For a more detailed version (including more options) refer to: docs/user/intro/start_fast.pod or online: http://perl.apache.org/docs/2.0/user/intro/start_fast.html For an even more detailed documentation refer to: docs/user/install/install.pod docs/user/config/config.pod or online: http://perl.apache.org/docs/2.0/user/install/install.pod http://perl.apache.org/docs/2.0/user/config/config.pod mod_perl-2.0.9/lib/0000755000104000010010000000000012540623201014525 5ustar AdministratorsNonemod_perl-2.0.9/lib/Apache2/0000755000104000010010000000000012540623201015770 5ustar AdministratorsNonemod_perl-2.0.9/lib/Apache2/Build.pm0000644000104000010010000017116412540623201017377 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::Build; use 5.006; use strict; use warnings; use Config; use Cwd (); use File::Spec::Functions qw(catfile catdir canonpath rel2abs devnull catpath splitpath); use File::Basename; use ExtUtils::Embed (); use File::Copy (); BEGIN { # check for a sane ExtUtils::Embed unless ($ENV{MP_USE_MY_EXTUTILS_EMBED}) { my ($version, $path)=(ExtUtils::Embed->VERSION, $INC{q{ExtUtils/Embed.pm}}); my $msg=<<"EOF"; I have found ExtUtils::Embed $version at $path This is probably not the right one for this perl version. Please make sure there is only one version of this module installed and that it is the one that comes with this perl version. If you insist on using the ExtUtils::Embed as is set the environment variable MP_USE_MY_EXTUTILS_EMBED=1 and try again. EOF if (eval {require Module::CoreList}) { my $req=$Module::CoreList::version{$]}->{q/ExtUtils::Embed/}; die "Please repair your Module::CoreList" unless $req; unless ($version eq $req) { $msg.=("Details: expecting ExtUtils::Embed $req ". "(according to Module::CoreList)\n\n"); die $msg; } } else { my $req=$Config{privlib}.'/ExtUtils/Embed.pm'; unless ($path eq $req) { $msg.="Details: expecting ExtUtils::Embed at $req\n\n"; die $msg; } } } } use constant IS_MOD_PERL_BUILD => grep { -e "$_/Makefile.PL" && -e "$_/lib/mod_perl2.pm" } qw(. ..); use constant AIX => $^O eq 'aix'; use constant DARWIN => $^O eq 'darwin'; use constant CYGWIN => $^O eq 'cygwin'; use constant IRIX => $^O eq 'irix'; use constant HPUX => $^O eq 'hpux'; use constant OPENBSD => $^O eq 'openbsd'; use constant WIN32 => $^O eq 'MSWin32'; use constant MSVC => WIN32() && ($Config{cc} eq 'cl'); use constant DMAKE => WIN32() && ($Config{make} eq 'dmake'); use constant REQUIRE_ITHREADS => grep { $^O eq $_ } qw(MSWin32); use constant PERL_HAS_ITHREADS => $Config{useithreads} && ($Config{useithreads} eq 'define'); use constant BUILD_APREXT => WIN32() || CYGWIN(); use ModPerl::Code (); use ModPerl::BuildOptions (); use Apache::TestTrace; use Apache::TestConfig (); our $VERSION = '0.01'; our $AUTOLOAD; sub AUTOLOAD { my $self = shift; my $name = uc ((split '::', $AUTOLOAD)[-1]); unless ($name =~ /^MP_/) { die "no such method: $AUTOLOAD"; } unless ($self->{$name}) { return wantarray ? () : undef; } return wantarray ? (split /\s+/, $self->{$name}) : $self->{$name}; } #--- apxs stuff --- our $APXS; my %apxs_query = ( INCLUDEDIR => 'include', LIBEXECDIR => 'modules', CFLAGS => undef, PREFIX => '', ); sub ap_prefix_invalid { my $self = shift; my $prefix = $self->{MP_AP_PREFIX}; unless (-d $prefix) { return "$prefix: No such file or directory"; } my $include_dir = $self->apxs(-q => 'INCLUDEDIR'); unless (-d $include_dir) { return "include/ directory not found in $prefix"; } return ''; } sub httpd_is_source_tree { my $self = shift; return $self->{httpd_is_source_tree} if exists $self->{httpd_is_source_tree}; my $prefix = $self->dir; $self->{httpd_is_source_tree} = defined $prefix && -d $prefix && -e "$prefix/CHANGES"; } # try to find the apxs utility, set $self->{MP_APXS} to the path if found, # otherwise to '' sub find_apxs_util { my $self = shift; if (not defined $self->{MP_APXS}) { $self->{MP_APXS} = ''; # not found } my @trys = ($Apache2::Build::APXS, $self->{MP_APXS}, $ENV{MP_APXS}); push @trys, catfile $self->{MP_AP_PREFIX}, 'bin', 'apxs' if exists $self->{MP_AP_PREFIX}; if (WIN32) { my $ext = '.bat'; for (@trys) { $_ .= $ext if ($_ and $_ !~ /$ext$/); } } unless (IS_MOD_PERL_BUILD) { #if we are building mod_perl via apxs, apxs should already be known #these extra tries are for things built outside of mod_perl #e.g. libapreq # XXX: this may pick a wrong apxs version! push @trys, Apache::TestConfig::which('apxs'), '/usr/local/apache/bin/apxs'; } my $apxs_try; for (@trys) { next unless ($apxs_try = $_); chomp $apxs_try; if (-x $apxs_try) { $self->{MP_APXS} = $apxs_try; last; } } } # if MP_AP_DESTDIR was specified this sub will prepend this path to # any Apache-specific installation path (that option is used only by # package maintainers). sub ap_destdir { my $self = shift; my $path = shift || ''; return $path unless $self->{MP_AP_DESTDIR}; if (WIN32) { my ($dest_vol, $dest_dir) = splitpath $self->{MP_AP_DESTDIR}, 1; my $real_dir = (splitpath $path)[1]; $path = catpath $dest_vol, catdir($dest_dir, $real_dir), ''; } else { $path = catdir $self->{MP_AP_DESTDIR}, $path; } return canonpath $path; } sub apxs { my $self = shift; $self->find_apxs_util() unless defined $self->{MP_APXS}; my $is_query = (@_ == 2) && ($_[0] eq '-q'); $self = $self->build_config unless ref $self; my $query_key; if ($is_query) { $query_key = 'APXS_' . uc $_[1]; if (exists $self->{$query_key}) { return $self->{$query_key}; } } unless ($self->{MP_APXS}) { my $prefix = $self->{MP_AP_PREFIX} || ""; return '' unless -d $prefix and $is_query; my $val = $apxs_query{$_[1]}; return defined $val ? ($val ? "$prefix/$val" : $prefix) : ""; } my $devnull = devnull(); my $val = qx($self->{MP_APXS} @_ 2>$devnull); chomp $val if defined $val; unless ($val) { # do we have an error or is it just an empty value? my $error = qx($self->{MP_APXS} @_ 2>&1); chomp $error if defined $error; if ($error) { error "'$self->{MP_APXS} @_' failed:"; error $error; } else { $val = ''; } } $self->{$query_key} = $val; } sub apxs_cflags { my $who = caller_package(shift); my $cflags = $who->apxs('-q' => 'CFLAGS'); $cflags =~ s/\"/\\\"/g; $cflags; } sub apxs_extra_cflags { my $who = caller_package(shift); my $flags = $who->apxs('-q' => 'EXTRA_CFLAGS'); $flags =~ s/\"/\\\"/g; $flags; } sub apxs_extra_cppflags { my $who = caller_package(shift); my $flags = $who->apxs('-q' => 'EXTRA_CPPFLAGS') ." ". $who->apxs('-q' => 'NOTEST_CPPFLAGS'); $flags =~ s/\"/\\\"/g; $flags; } sub caller_package { my $arg = shift; return ($arg and ref($arg) eq __PACKAGE__) ? $arg : __PACKAGE__; } my %threaded_mpms = map { $_ => 1 } qw(worker winnt beos mpmt_os2 netware leader perchild threadpool dynamic); sub mpm_is_threaded { my $self = shift; my $mpm_name = $self->mpm_name(); return exists $threaded_mpms{$mpm_name} ? 1 : 0; } sub mpm_name { my $self = shift; return $self->{mpm_name} if $self->{mpm_name}; if ($self->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/) { delete $threaded_mpms{dynamic} if $self->mp_nonthreaded_ok; return $self->{mpm_name} = 'dynamic' if ($1*1000+$2)*1000+$3>=2003000; } # XXX: hopefully apxs will work on win32 one day return $self->{mpm_name} = 'winnt' if WIN32; my $mpm_name; # httpd >= 2.3 if ($self->httpd_version_as_int =~ m/^2[3-9]\d+/) { $mpm_name = 'dynamic'; } else { $mpm_name = $self->apxs('-q' => 'MPM_NAME'); } # building against the httpd source dir unless (($mpm_name and $self->httpd_is_source_tree)) { if ($self->dir) { my $config_vars_file = catfile $self->dir, "build", "config_vars.mk"; if (open my $fh, $config_vars_file) { while (<$fh>) { if (/MPM_NAME = (\w+)/) { $mpm_name = $1; last; } } close $fh; } } } unless ($mpm_name) { my $msg = 'Failed to obtain the MPM name.'; $msg .= " Please specify MP_APXS=/full/path/to/apxs to solve " . "this problem." unless exists $self->{MP_APXS}; error $msg; die "\n"; } return $self->{mpm_name} = $mpm_name; } sub should_build_apache { my ($self) = @_; return $self->{MP_USE_STATIC} ? 1 : 0; } sub configure_apache { my ($self) = @_; unless ($self->{MP_AP_CONFIGURE}) { error "You specified MP_USE_STATIC but did not specify the " . "arguments to httpd's ./configure with MP_AP_CONFIGURE"; exit 1; } unless ($self->{MP_AP_PREFIX}) { error "You specified MP_USE_STATIC but did not speficy the " . "location of httpd's source tree with MP_AP_PREFIX"; exit 1; } debug "Configuring httpd in $self->{MP_AP_PREFIX}"; my $httpd = File::Spec->catfile($self->{MP_AP_PREFIX}, 'httpd'); $self->{'httpd'} ||= $httpd; push @Apache::TestMM::Argv, ('httpd' => $self->{'httpd'}); my $mplibpath = ''; my $ldopts = $self->ldopts; if (CYGWIN) { # Cygwin's httpd port links its modules into httpd2core.dll, # instead of httpd.exe. In this case, we have a problem, # because libtool doesn't want to include static libs (.a) # into a dynamic lib (.dll). Workaround this by setting # mod_perl.a as a linker argument (including all other flags # and libs). my $mplib = "$self->{MP_LIBNAME}$Config{lib_ext}"; $ldopts = join ' ', '--export-all-symbols', '--enable-auto-image-base', "$self->{cwd}/src/modules/perl/$mplib", $ldopts; $ldopts =~ s/(\S+)/-Wl,$1/g; } else { my $mplib = "$self->{MP_LIBNAME}$Config{lib_ext}"; $mplibpath = catfile($self->{cwd}, qw(src modules perl), $mplib); } local $ENV{BUILTIN_LIBS} = $mplibpath; local $ENV{AP_LIBS} = $ldopts; local $ENV{MODLIST} = 'perl'; # XXX: -Wall and/or -Werror at httpd configure time breaks things local $ENV{CFLAGS} = join ' ', grep { ! /\-Wall|\-Werror/ } split /\s+/, $ENV{CFLAGS} || ''; my $cd = qq(cd $self->{MP_AP_PREFIX}); # We need to clean the httpd tree before configuring it if (-f File::Spec->catfile($self->{MP_AP_PREFIX}, 'Makefile')) { my $cmd = qq(make clean); debug "Running $cmd"; system("$cd && $cmd") == 0 or die "httpd: $cmd failed"; } my $cmd = qq(./configure $self->{MP_AP_CONFIGURE}); debug "Running $cmd"; system("$cd && $cmd") == 0 or die "httpd: $cmd failed"; # Got to build in srclib/* early to have generated files present. my $srclib = File::Spec->catfile($self->{MP_AP_PREFIX}, 'srclib'); $cd = qq(cd $srclib); $cmd = qq(make); debug "Building srclib in $srclib"; system("$cd && $cmd") == 0 or die "srclib: $cmd failed"; } #--- Perl Config stuff --- my %gtop_config = (); sub find_gtop { my $self = shift; return %gtop_config if %gtop_config; if (%gtop_config = find_gtop_config()) { return %gtop_config; } if ($self->find_dlfile('gtop')) { $gtop_config{ldopts} = $self->gtop_ldopts_old(); $gtop_config{ccopts} = ''; return %gtop_config; } return (); } sub find_gtop_config { my %c = (); my $ver_2_5_plus = 0; if (system('pkg-config --exists libgtop-2.0') == 0) { # 2.x chomp($c{ccopts} = qx|pkg-config --cflags libgtop-2.0|); chomp($c{ldopts} = qx|pkg-config --libs libgtop-2.0|); # 2.0.0 bugfix chomp(my $libdir = qx|pkg-config --variable=libdir libgtop-2.0|); $c{ldopts} =~ s|\$\(libdir\)|$libdir|; chomp($c{ver} = qx|pkg-config --modversion libgtop-2.0|); ($c{ver_maj}, $c{ver_min}) = split /\./, $c{ver}; $ver_2_5_plus++ if $c{ver_maj} == 2 && $c{ver_min} >= 5; if ($ver_2_5_plus) { # some headers were removed in libgtop 2.5.0 so we need to # be able to exclude them at compile time $c{ccopts} .= ' -DGTOP_2_5_PLUS'; } } elsif (system('gnome-config --libs libgtop') == 0) { chomp($c{ccopts} = qx|gnome-config --cflags libgtop|); chomp($c{ldopts} = qx|gnome-config --libs libgtop|); # buggy ( < 1.0.9?) versions fixup $c{ccopts} =~ s|^/|-I/|; $c{ldopts} =~ s|^/|-L/|; } # starting from 2.5.0 'pkg-config --cflags libgtop-2.0' already # gives us all the cflags that are needed if ($c{ccopts} && !$ver_2_5_plus) { chomp(my $ginc = `glib-config --cflags`); $c{ccopts} .= " $ginc"; } if (%c) { $c{ccopts} = " $c{ccopts}"; $c{ldopts} = " $c{ldopts}"; } return %c; } my @Xlib = qw(/usr/X11/lib /usr/X11R6/lib); sub gtop_ldopts_old { my $self = shift; my $xlibs = ""; my ($path) = $self->find_dlfile('Xau', @Xlib); if ($path) { $xlibs = "-L$path -lXau"; } if ($self->find_dlfile('intl')) { $xlibs .= ' -lintl'; } return " -lgtop -lgtop_sysdeps -lgtop_common $xlibs"; } sub gtop_ldopts { exists $gtop_config{ldopts} ? $gtop_config{ldopts} : ''; } sub gtop_ccopts { exists $gtop_config{ccopts} ? $gtop_config{ccopts} : ''; } sub ldopts { my ($self) = @_; my $config = tied %Config; my $ldflags = $config->{ldflags}; if (WIN32) { $config->{ldflags} = ''; #same as lddlflags } elsif (DARWIN) { #not sure how this can happen, but it shouldn't my @bogus_flags = ('flat_namespace', 'bundle', 'undefined suppress'); for my $flag (@bogus_flags) { $config->{ldflags} =~ s/-$flag\s*//; } } my $ldopts = ExtUtils::Embed::ldopts(); chomp $ldopts; my $ld = $self->perl_config('ld'); if (HPUX && $ld eq 'ld') { while ($ldopts =~ s/-Wl,(\S+)/$1/) { my $cp = $1; (my $repl = $cp) =~ s/,/ /g; $ldopts =~ s/\Q$cp/$repl/; } } if ($self->{MP_USE_GTOP}) { $ldopts .= $self->gtop_ldopts; } $config->{ldflags} = $ldflags; #reset # on Irix mod_perl.so needs to see the libperl.so symbols, which # requires the -exports option immediately before -lperl. if (IRIX) { ($ldopts =~ s/-lperl\b/-exports -lperl/) or warn "Failed to fix Irix symbol exporting\n"; } $ldopts; } my $Wall = "-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"; # perl v5.6.1 and earlier produces lots of warnings, so we can't use # -Werror with those versions. $Wall .= " -Werror" if $] >= 5.006002; sub ap_ccopts { my ($self) = @_; my $ccopts = "-DMOD_PERL"; if ($self->{MP_USE_GTOP}) { $ccopts .= " -DMP_USE_GTOP"; $ccopts .= $self->gtop_ccopts; } if ($self->{MP_MAINTAINER}) { $self->{MP_DEBUG} = 1; if ($self->perl_config('gccversion')) { #same as --with-maintainter-mode $ccopts .= " $Wall"; } if (!OPENBSD && $self->has_gcc_version('3.3.2') && $ccopts !~ /declaration-after-statement/) { debug "Adding -Wdeclaration-after-statement to ccopts"; $ccopts .= " -Wdeclaration-after-statement"; } } if ($self->{MP_COMPAT_1X}) { $ccopts .= " -DMP_COMPAT_1X"; } if ($self->{MP_DEBUG}) { $self->{MP_TRACE} = 1; my $win32_flags = MSVC ? '-Od -MD -Zi' : ''; my $debug_flags = WIN32 ? $win32_flags : '-g'; $ccopts .= " $debug_flags" unless $Config{optimize} =~ /$debug_flags/; $ccopts .= ' -DMP_DEBUG'; } if ($self->{MP_CCOPTS}) { $ccopts .= " $self->{MP_CCOPTS}"; } if ($self->{MP_TRACE}) { $ccopts .= " -DMP_TRACE"; } # make sure apr.h can be safely included # for example Perl's included -D_GNU_SOURCE implies # -D_LARGEFILE64_SOURCE on linux, but this won't happen on # Solaris, so we need apr flags living in apxs' EXTRA_CPPFLAGS my $extra_cppflags = $self->apxs_extra_cppflags; $ccopts .= " " . $extra_cppflags; # Make sure the evil AP_DEBUG is not defined when building mod_perl $ccopts =~ s/ ?-DAP_DEBUG\b//; $ccopts; } sub has_gcc_version { my $self = shift; my $requested_version = shift; my $has_version = $self->perl_config('gccversion'); return 0 unless $has_version; #Only interested in leading version digits $has_version =~ s/^([0-9.]+).*/$1/; my @tuples = split /\./, $has_version, 3; my @r_tuples = split /\./, $requested_version, 3; return cmp_tuples(\@tuples, \@r_tuples) == 1; } sub cmp_tuples { my ($num_a, $num_b) = @_; while (@$num_a && @$num_b) { my $cmp = shift @$num_a <=> shift @$num_b; return $cmp if $cmp; } return @$num_a <=> @$num_b; } sub perl_ccopts { my $self = shift; my $cflags = $self->strip_lfs(" $Config{ccflags} "); my $fixup = \&{"ccopts_$^O"}; if (defined &$fixup) { $fixup->(\$cflags); } if (WIN32 and $self->{MP_DEBUG}) { #only win32 has -DDEBUGGING in both optimize and ccflags my $optim = $Config{optimize}; unless ($optim =~ /-DDEBUGGING/) { $cflags =~ s/$optim//; } } if (CYGWIN) { $cflags .= " -DCYGWIN "; } $cflags; } sub ccopts_hpux { my $cflags = shift; return if $Config{cc} eq 'gcc'; #XXX? return if $$cflags =~ /(-Ae|\+e)/; $$cflags .= " -Ae "; } # XXX: there could be more, but this is just for cosmetics my %cflags_dups = map { $_ => 1 } qw(-D_GNU_SOURCE -D_REENTRANT); sub ccopts { my ($self) = @_; my $cflags = $self->perl_ccopts . ExtUtils::Embed::perl_inc() . $self->ap_ccopts; # remove duplicates of certain cflags coming from perl and ap/apr my @cflags = (); my %dups = (); for (split /\s+/, $cflags) { if ($cflags_dups{$_}) { next if $dups{$_}; $dups{$_}++; } push @cflags, $_; } $cflags = "@cflags"; $cflags; } sub ldopts_prefix { my $self = shift; $self->perl_config('ld') eq 'ld' ? '' : "-Wl,"; } sub perl_config_optimize { my ($self, $val) = @_; $val ||= $Config{optimize}; if ($self->{MP_DEBUG}) { return ' ' unless $Config{ccflags} =~ /-DDEBUGGING/; } $val; } sub perl_config_ld { my ($self, $val) = @_; $val ||= $Config{ld}; basename $val; #bleedperl hpux value is /usr/bin/ld ! } sub perl_config_lddlflags { my ($self, $val) = @_; if ($self->{MP_DEBUG}) { if (MSVC) { unless ($val =~ s/-release/-debug/) { $val .= ' -debug'; } } } if (AIX) { my $Wl = $self->ldopts_prefix; # it's useless to import symbols from libperl.so this way, # because perl.exp is incomplete. a better way is to link # against -lperl which has all the symbols $val =~ s|${Wl}-bI:\$\(PERL_INC\)/perl\.exp||; # also in the case of Makefile.modperl PERL_INC is defined # this works with at least ld(1) on powerpc-ibm-aix5.1.0.0: # -berok ignores symbols resolution problems (they will be # resolved at run-time # -brtl prepares the object for run-time loading # LDFLAGS already inserts -brtl $val .= " ${Wl}-berok"; # XXX: instead of -berok, could make sure that we have: # -Lpath/to/CORE -lperl # -bI:$path/apr.exp -bI:$path/aprutil.exp -bI:$path/httpd.exp # -bI:$path/modperl_*.exp # - don't import modperl_*.exp in Makefile.modperl which # exports -bE:$path/modperl_*.exp # - can't rely on -bI:$path/perl.exp, because it's incomplete, # use -lperl instead # - the issue with using apr/aprutil/httpd.exp is to pick the # right path if httpd wasn't yet installed } $val; } sub perl_config { my ($self, $key) = @_; my $val = $Config{$key} || ''; my $method = \&{"perl_config_$key"}; if (defined &$method) { return $method->($self, $val); } return $val; } sub find_in_inc { my $name = shift; for (@INC) { my $file; if (-e ($file = "$_/auto/Apache2/$name")) { return $file; } } } sub libpth { my $self = shift; $self->{libpth} ||= [split /\s+/, $Config{libpth}]; return wantarray ? @{ $self->{libpth} } : $self->{libpth}; } sub find_dlfile { my ($self, $name) = (shift, shift); require DynaLoader; require AutoLoader; #eek my $found = 0; my $loc = ""; my (@path) = ($self->libpth, @_); for (@path) { if ($found = DynaLoader::dl_findfile($_, "-l$name")) { $loc = $_; last; } } return wantarray ? ($loc, $found) : $found; } sub find_dlfile_maybe { my ($self, $name) = @_; my $path = $self->libpth; my @maybe; my $lib = 'lib' . $name; for (@$path) { push @maybe, grep { ! -l $_ } <$_/$lib.*>; } return \@maybe; } sub lib_check { my ($self, $name) = @_; return unless $self->perl_config('libs') =~ /$name/; return if $self->find_dlfile($name); my $maybe = $self->find_dlfile_maybe($name); my $suggest = @$maybe ? "You could just symlink it to $maybe->[0]" : 'You might need to install Perl from source'; $self->phat_warn(<{MP_PROMPT_DEFAULT}; require ExtUtils::MakeMaker; ExtUtils::MakeMaker::prompt($q, $default); } sub prompt_y { my ($self, $q) = @_; $self->prompt($q, 'y') =~ /^y/i; } sub prompt_n { my ($self, $q) = @_; $self->prompt($q, 'n') =~ /^n/i; } sub phat_warn { my ($self, $msg, $abort) = @_; my $level = $abort ? 'ERROR' : 'WARNING'; warn < $bpm_mtime) { #reload if Makefile.PL has regenerated unshift @INC, 'lib'; delete $INC{$bpm}; eval { require Apache2::BuildConfig; }; shift @INC; } else { eval { require Apache2::BuildConfig; }; } return bless {}, (ref($self) || $self) if $@; return Apache2::BuildConfig->new; } sub new { my $class = shift; my $self = bless { cwd => Cwd::fastcwd(), MP_LIBNAME => 'mod_perl', MP_APXS => undef, # so we know we haven't tried to set it yet @_, }, $class; $self->{MP_APR_LIB} = 'aprext'; ModPerl::BuildOptions->init($self) if delete $self->{init}; $self; } sub DESTROY {} my %default_files = ( 'build_config' => 'lib/Apache2/BuildConfig.pm', 'ldopts' => 'src/modules/perl/ldopts', 'makefile' => 'src/modules/perl/Makefile', ); sub clean_files { my $self = shift; [sort map { $self->default_file($_) } keys %default_files]; } sub default_file { my ($self, $name, $override) = @_; my $key = join '_', 'file', $name; $self->{$key} ||= ($override || $default_files{$name}); } sub file_path { my $self = shift; # work around when Apache2::BuildConfig has not been created yet return unless $self && $self->{cwd}; my @files = map { m:^/: ? $_ : join('/', $self->{cwd}, $_) } @_; return wantarray ? @files : $files[0]; } sub freeze { require Data::Dumper; local $Data::Dumper::Terse = 1; local $Data::Dumper::Sortkeys = 1; my $data = Data::Dumper::Dumper(shift); chomp $data; $data; } sub save_ldopts { my ($self, $file) = @_; $file ||= $self->default_file('ldopts', $file); my $ldopts = $self->ldopts; open my $fh, '>', $file or die "open $file: $!"; print $fh "#!/bin/sh\n\necho $ldopts\n"; close $fh; chmod 0755, $file; } sub noedit_warning_hash { ModPerl::Code::noedit_warning_hash(__PACKAGE__); } sub save { my ($self, $file) = @_; delete $INC{$bpm}; $file ||= $self->default_file('build_config'); $file = $self->file_path($file); my $obj = $self->freeze; $obj =~ s/^\s{9}//mg; $obj =~ s/^/ /; open my $fh, '>', $file or die "open $file: $!"; #work around autosplit braindeadness my $package = 'package Apache2::BuildConfig'; print $fh noedit_warning_hash(); print $fh <build_config; my @opts = map { qq[$_='$self->{$_}'] } sort grep /^MP_/, keys %$self; my $command = "perl Makefile.PL @opts"; print "Running: $command\n"; system $command; } # % perl -MApache2::Build -e rebuild *main::rebuild = \&rebuild if $0 eq '-e'; #--- attribute access --- sub is_dynamic { shift->{MP_USE_DSO} } sub default_dir { my $build = shift->build_config; return $build->dir || '../apache_x.x/src'; } sub dir { my ($self, $dir) = @_; if ($dir) { for (qw(ap_includedir)) { delete $self->{$_}; } if ($dir =~ m:^\.\.[/\\]:) { $dir = "$self->{cwd}/$dir"; } $self->{dir} = $dir; } return $self->{dir} if $self->{dir}; # be careful with the guesswork, or may pick up some wrong headers if (IS_MOD_PERL_BUILD && $self->{MP_AP_PREFIX}) { my $build = $self->build_config; if (my $bdir = $build->{'dir'}) { for ($bdir, "../$bdir", "../../$bdir") { if (-d $_) { $dir = $_; last; } } } } $dir ||= $self->{MP_AP_PREFIX}; # we no longer install Apache headers, so don't bother looking in @INC # might end up finding 1.x headers anyhow # unless ($dir and -d $dir) { # for (@INC) { # last if -d ($dir = "$_/auto/Apache2/include"); # } # } return $self->{dir} = $dir ? canonpath(rel2abs $dir) : undef; } #--- finding apache *.h files --- sub find { my $self = shift; my %seen = (); my @dirs = (); for my $src_dir ($self->dir, $self->default_dir, '../httpd-2.0') { next unless $src_dir; next unless (-d $src_dir || -l $src_dir); next if $seen{$src_dir}++; push @dirs, $src_dir; #$modified{$src_dir} = (stat($src_dir))[9]; } return @dirs; } sub ap_includedir { my ($self, $d) = @_; return $self->{ap_includedir} if $self->{ap_includedir} and -d $self->{ap_includedir}; return unless $d ||= $self->apxs('-q' => 'INCLUDEDIR') || $self->dir; if (-e "$d/include/ap_release.h") { return $self->{ap_includedir} = "$d/include"; } $self->{ap_includedir} = $d; } # This is necessary for static builds that needs to make a # difference between where the apache headers are (to build # against) and where they will be installed (to install our # own headers alongside) # # ap_exp_includedir is where apache is going to install its # headers to sub ap_exp_includedir { my ($self) = @_; return $self->{ap_exp_includedir} if $self->{ap_exp_includedir}; my $build_vars = File::Spec->catfile($self->{MP_AP_PREFIX}, qw(build config_vars.mk)); open my $vars, "<$build_vars" or die "Couldn't open $build_vars $!"; my $ap_exp_includedir; while (<$vars>) { if (/exp_includedir\s*=\s*(.*)/) { $ap_exp_includedir = $1; last; } } $self->{ap_exp_includedir} = $ap_exp_includedir; } sub install_headers_dir { my ($self) = @_; if ($self->should_build_apache) { return $self->ap_exp_includedir(); } else { return $self->ap_includedir(); } } # where apr-config and apu-config reside sub apr_bindir { my ($self) = @_; $self->apr_config_path unless $self->{apr_bindir}; $self->{apr_bindir}; } sub apr_generation { my ($self) = @_; return $self->httpd_version_as_int =~ m/2[1-9]\d+/ ? 1 : 0; } # returns an array of apr/apu linking flags (--link-ld --libs) if found # an empty array otherwise my @apru_link_flags = (); sub apru_link_flags { my ($self) = @_; return @apru_link_flags if @apru_link_flags; # first use apu_config_path and then apr_config_path in order to # resolve the symbols right during linking for ($self->apu_config_path, $self->apr_config_path) { my $flags = '--link-ld --libs'; $flags .= ' --ldflags' unless (WIN32); if (my $link = $_ && -x $_ && qx{$_ $flags}) { chomp $link; # Change '/path/to/libanything.la' to '-L/path/to -lanything' if (CYGWIN) { $link =~ s|(\S*)/lib([^.\s]+)\.\S+|-L$1 -l$2|g; } if ($self->httpd_is_source_tree) { my @libs; while ($link =~ m/-L(\S+)/g) { my $dir = File::Spec->catfile($1, '.libs'); push @libs, $dir if -d $dir; } push @apru_link_flags, join ' ', map { "-L$_" } @libs; } push @apru_link_flags, $link; } } return @apru_link_flags; } sub apr_config_path { shift->apru_config_path("apr"); } sub apu_config_path { shift->apru_config_path("apu"); } sub apru_config_path { my ($self, $what) = @_; my $key = "${what}_config_path"; # apr_config_path my $mp_key = "MP_" . uc($what) . "_CONFIG"; # MP_APR_CONFIG my $bindir = uc($what) . "_BINDIR"; # APR_BINDIR return $self->{$key} if $self->{$key} and -x $self->{$key}; if (exists $self->{$mp_key} and -x $self->{$mp_key}) { $self->{$key} = $self->{$mp_key}; } my $config = $self->apr_generation ? "$what-1-config" : "$what-config"; if (!$self->{$key}) { my @tries = (); if ($self->httpd_is_source_tree) { for my $base (grep defined $_, $self->dir) { push @tries, grep -d $_, map catdir($base, "srclib", $_), qw(apr apr-util); } # Check for MP_AP_CONFIGURE="--with-apr[-util]=DIR|FILE" my $what_long = ($what eq 'apu') ? 'apr-util' : 'apr'; if ($self->{MP_AP_CONFIGURE} && $self->{MP_AP_CONFIGURE} =~ /--with-${what_long}=(\S+)/) { my $dir = $1; $dir = dirname $dir if -f $dir; push @tries, grep -d $_, $dir, catdir $dir, 'bin'; } } else { push @tries, grep length, map $self->apxs(-q => $_), $bindir, "BINDIR"; push @tries, catdir $self->{MP_AP_PREFIX}, "bin" if exists $self->{MP_AP_PREFIX} and -d $self->{MP_AP_PREFIX}; } @tries = map { catfile $_, $config } @tries; if (WIN32) { my $ext = '.bat'; for (@tries) { $_ .= $ext if ($_ and $_ !~ /$ext$/); } } for my $try (@tries) { next unless -x $try; $self->{$key} = $try; } } $self->{$key} ||= Apache::TestConfig::which($config); # apr_bindir makes sense only if httpd/apr is installed, if we are # building against the source tree we can't link against # apr/aprutil libs unless ($self->httpd_is_source_tree) { $self->{apr_bindir} = $self->{$key} ? dirname $self->{$key} : ''; } $self->{$key}; } sub apr_includedir { my ($self) = @_; return $self->{apr_includedir} if $self->{apr_includedir} and -d $self->{apr_includedir}; my $incdir; my $apr_config_path = $self->apr_config_path; if ($apr_config_path) { my $httpd_version = $self->httpd_version; chomp($incdir = `$apr_config_path --includedir`); } unless ($incdir and -d $incdir) { # falling back to the default when apr header files are in the # same location as the httpd header files $incdir = $self->ap_includedir; } my @tries = ($incdir); if ($self->httpd_is_source_tree) { my $path = catdir $self->dir, "srclib", "apr", "include"; push @tries, $path if -d $path; } for (@tries) { next unless $_ && -e catfile $_, "apr.h"; $self->{apr_includedir} = $_; last; } unless ($self->{apr_includedir}) { error "Can't find apr include/ directory,", "use MP_APR_CONFIG=/path/to/apr-config"; exit 1; } $self->{apr_includedir}; } #--- parsing apache *.h files --- sub mmn_eq { my ($class, $dir) = @_; return 1 if WIN32; #just assume, till Apache2::Build works under win32 my $instsrc; { local @INC = grep { !/blib/ } @INC; my $instdir; for (@INC) { last if -d ($instdir = "$_/auto/Apache2/include"); } $instsrc = $class->new(dir => $instdir); } my $targsrc = $class->new($dir ? (dir => $dir) : ()); my $inst_mmn = $instsrc->module_magic_number; my $targ_mmn = $targsrc->module_magic_number; unless ($inst_mmn && $targ_mmn) { return 0; } if ($inst_mmn == $targ_mmn) { return 1; } print "Installed MMN $inst_mmn does not match target $targ_mmn\n"; return 0; } sub module_magic_number { my $self = shift; return $self->{mmn} if $self->{mmn}; my $d = $self->ap_includedir; return 0 unless $d; #return $mcache{$d} if $mcache{$d}; my $fh; for (qw(ap_mmn.h http_config.h)) { last if open $fh, "$d/$_"; } return 0 unless $fh; my $n; my $mmn_pat = join '|', qw(MODULE_MAGIC_NUMBER_MAJOR MODULE_MAGIC_NUMBER); while(<$fh>) { if(s/^\#define\s+($mmn_pat)\s+(\d+).*/$2/) { chomp($n = $_); last; } } close $fh; $self->{mmn} = $n } sub fold_dots { my $v = shift; $v =~ s/\.//g; $v .= '0' if length $v < 3; $v; } sub httpd_version_as_int { my ($self, $dir) = @_; my $v = $self->httpd_version($dir); fold_dots($v); } sub httpd_version_cache { my ($self, $dir, $v) = @_; return '' unless $dir; $self->{httpd_version}->{$dir} = $v if $v; $self->{httpd_version}->{$dir}; } sub httpd_version { my ($self, $dir) = @_; return unless $dir = $self->ap_includedir($dir); if (my $v = $self->httpd_version_cache($dir)) { return $v; } my $header = "$dir/ap_release.h"; open my $fh, $header or do { error "Unable to open $header: $!"; return undef; }; my $version; while (<$fh>) { #now taking bets on how many friggin times this will change #over the course of apache 2.0. 1.3 changed it at least a half #dozen times. hopefully it'll stay in the same file at least. if (/^\#define\s+AP_SERVER_MAJORVERSION\s+\"(\d+)\"/) { #XXX could be more careful here. whatever. see above. my $major = $1; my $minor = (split /\s+/, scalar(<$fh>))[-1]; my $patch = (split /\s+/, scalar(<$fh>))[-1]; $version = join '.', $major, $minor, $patch; $version =~ s/\"//g; last; } elsif (/^\#define\s+AP_SERVER_BASEREVISION\s+\"(.*)\"/) { $version = $1; last; } elsif(/^\#define\s+AP_SERVER_MAJORVERSION_NUMBER\s+(\d+)/) { # new 2.1 config my $major = $1; my $minor = (split /\s+/, scalar(<$fh>))[-1]; my $patch = (split /\s+/, scalar(<$fh>))[-1]; my ($define, $macro, $dev) = (split /\s+/, scalar(<$fh>)); if ($macro =~ /AP_SERVER_DEVBUILD_BOOLEAN/ && $dev eq '1') { $dev = "-dev"; } else { $dev = ""; } $version = join '.', $major, $minor, "$patch$dev"; $version =~ s/\"//g; last; } } close $fh; debug "parsed version $version from ap_release.h"; $self->httpd_version_cache($dir, $version); } my %wanted_apr_config = map { $_, 1} qw( HAS_THREADS HAS_DSO HAS_MMAP HAS_RANDOM HAS_SENDFILE HAS_LARGE_FILES HAS_INLINE HAS_FORK ); sub get_apr_config { my $self = shift; return $self->{apr_config} if $self->{apr_config}; my $header = catfile $self->apr_includedir, "apr.h"; open my $fh, $header or do { error "Unable to open $header: $!"; return undef; }; my %cfg; while (<$fh>) { next unless s/^\#define\s+APR_((HAVE|HAS|USE)_\w+)/$1/; chomp; my ($name, $val) = split /\s+/, $_, 2; next unless $wanted_apr_config{$name}; $val =~ s/\s+$//; next unless $val =~ /^\d+$/; $cfg{$name} = $val; } $self->{apr_config} = \%cfg; } #--- generate Makefile --- sub canon_make_attr { my ($self, $name) = (shift, shift); my $attr = join '_', 'MODPERL', uc $name; $self->{$attr} = "@_"; "$attr = $self->{$attr}\n\n"; } sub xsubpp { my $self = shift; my $xsubpp = join ' ', '$(MODPERL_PERLPATH)', '$(MODPERL_PRIVLIBEXP)/ExtUtils/xsubpp', '-typemap', '$(MODPERL_PRIVLIBEXP)/ExtUtils/typemap'; my $typemap = $self->file_path('lib/typemap'); if (-e $typemap) { $xsubpp .= join ' ', ' -typemap', $typemap; } $xsubpp; } sub make_xs { my ($self, $fh) = @_; print $fh $self->canon_make_attr(xsubpp => $self->xsubpp); return [] unless $self->{XS}; my @files; my @xs_targ; foreach my $name (sort keys %{ $self->{XS} }) { my $xs = $self->{XS}->{$name}; #Foo/Bar.xs => Foo_Bar.c (my $c = $xs) =~ s:.*?WrapXS/::; $c =~ s:/:_:g; $c =~ s:\.xs$:.c:; push @files, $c; push @xs_targ, < \$*.xsc && \$(MODPERL_MV) \$*.xsc \$@ EOF } my %o = (xs_o_files => 'o', xs_o_pic_files => 'lo'); for my $ext (qw(xs_o_files xs_o_pic_files)) { print $fh $self->canon_make_attr($ext, map { (my $file = $_) =~ s/c$/$o{$ext}/; $file; } @files); } print $fh $self->canon_make_attr(xs_clean_files => @files); \@xs_targ; } #when we use a bit of MakeMaker, make it use our values for these vars my %perl_config_pm_alias = ( ABSPERL => 'perlpath', ABSPERLRUN => 'perlpath', PERL => 'perlpath', PERLRUN => 'perlpath', PERL_LIB => 'privlibexp', PERL_ARCHLIB => 'archlibexp', ); my $mm_replace = join '|', keys %perl_config_pm_alias; # get rid of dups my %perl_config_pm_alias_values = reverse %perl_config_pm_alias; my @perl_config_pm_alias_values = keys %perl_config_pm_alias_values; my @perl_config_pm = sort(@perl_config_pm_alias_values, qw(cc cpprun rm ranlib lib_ext obj_ext cccdlflags lddlflags optimize)); sub mm_replace { my $val = shift; $$val =~ s/\(($mm_replace)\)/(MODPERL_\U$perl_config_pm_alias{$1})/g; } #help prevent warnings my @mm_init_vars = (BASEEXT => ''); sub make_tools { my ($self, $fh) = @_; for (@perl_config_pm) { print $fh $self->canon_make_attr($_, $self->perl_config($_)); } require ExtUtils::MakeMaker; my $mm = bless { @mm_init_vars }, 'MM'; # Fake initialize MakeMaker foreach my $m (qw(init_main init_others init_tools)) { $mm->$m() if $mm->can($m); } for (qw(rm_f mv ld ar cp test_f)) { my $val = $mm->{"\U$_"}; if ($val) { mm_replace(\$val); } else { $val = $Config{$_}; } print $fh $self->canon_make_attr($_ => $val); } } sub export_files_MSWin32 { my $self = shift; my $xs_dir = $self->file_path("xs"); "-def:$xs_dir/modperl.def"; } sub export_files_aix { my $self = shift; my $Wl = $self->ldopts_prefix; # there are several modperl_*.exp, not just $(BASEEXT).exp # $(BASEEXT).exp resolves to modperl_global.exp my $xs_dir = $self->file_path("xs"); join " ", map "${Wl}-bE:$xs_dir/modperl_$_.exp", qw(inline ithreads); } sub dynamic_link_header_default { return <<'EOF'; $(MODPERL_LIBNAME).$(MODPERL_DLEXT): $(MODPERL_PIC_OBJS) $(MODPERL_RM_F) $@ $(MODPERL_LD) $(MODPERL_LDDLFLAGS) \ $(MODPERL_AP_LIBS) \ $(MODPERL_PIC_OBJS) $(MODPERL_LDOPTS) \ EOF } sub dynamic_link_default { my $self = shift; my $link = $self->dynamic_link_header_default . "\t" . '-o $@'; my $ranlib = "\t" . '$(MODPERL_RANLIB) $@' . "\n"; $link .= "\n" . $ranlib unless (DARWIN or OPENBSD); $link; } sub dynamic_link_MSWin32 { my $self = shift; my $defs = $self->export_files_MSWin32; my $symbols = $self->modperl_symbols_MSWin32; return $self->dynamic_link_header_default . "\t$defs" . ($symbols ? ' \\' . "\n\t-pdb:$symbols" : '') . ' -out:$@' . "\n\t" . 'if exist $(MODPERL_MANIFEST_LOCATION)' . " \\\n\t" . 'mt /nologo /manifest $(MODPERL_MANIFEST_LOCATION)' . " \\\n\t" . '/outputresource:$@;2' . "\n\n"; } sub dynamic_link_aix { my $self = shift; my $link = $self->dynamic_link_header_default . "\t" . $self->export_files_aix . " \\\n" . "\t" . '-o $@' . " \n" . "\t" . '$(MODPERL_RANLIB) $@'; } sub dynamic_link_cygwin { my $self = shift; return <<'EOF'; $(MODPERL_LIBNAME).$(MODPERL_DLEXT): $(MODPERL_PIC_OBJS) $(MODPERL_RM_F) $@ $(MODPERL_CC) -shared -o $@ \ -Wl,--out-implib=$(MODPERL_LIBNAME).dll.a \ -Wl,--export-all-symbols -Wl,--enable-auto-import \ -Wl,--enable-auto-image-base -Wl,--stack,8388608 \ $(MODPERL_PIC_OBJS) \ $(MODPERL_LDDLFLAGS) $(MODPERL_LDOPTS) \ $(MODPERL_AP_LIBS) $(MODPERL_RANLIB) $@ EOF } sub dynamic_link { my $self = shift; my $link = \&{"dynamic_link_$^O"}; $link = \&dynamic_link_default unless defined &$link; $link->($self); } # Returns the link flags for the apache shared core library my $apache_corelib_cygwin; sub apache_corelib_cygwin { return $apache_corelib_cygwin if $apache_corelib_cygwin; my $self = shift; my $mp_src = "$self->{cwd}/src/modules/perl"; my $core = 'httpd2core'; # There's a problem with user-installed perl on cygwin. # MakeMaker doesn't know about the .dll.a libs and warns # about missing -lhttpd2core. "Fix" it by copying # the lib and adding .a suffix. # For the static build create a soft link, because libhttpd2core.dll.a # doesn't exist at this time. if ($self->is_dynamic) { my $libpath = $self->apxs(-q => 'exp_libdir'); File::Copy::copy("$libpath/lib$core.dll.a", "$mp_src/lib$core.a"); } else { my $libpath = catdir($self->{MP_AP_PREFIX}, '.libs'); mkdir $libpath unless -d $libpath; qx{touch $libpath/lib$core.dll.a && \ ln -fs $libpath/lib$core.dll.a $mp_src/lib$core.a}; } $apache_corelib_cygwin = "-L$mp_src -l$core"; } sub apache_libs_MSWin32 { my $self = shift; my $prefix = $self->apxs(-q => 'PREFIX') || $self->dir; my $lib = catdir $prefix, 'lib'; opendir(my $dir, $lib) or die qq{Cannot opendir $lib: $!}; my @libs = map {catfile($lib, $_)} grep /^lib(apr|aprutil|httpd)\b\S*?\.lib$/, readdir $dir; closedir $dir; "@libs"; } sub apache_libs_cygwin { my $self = shift; join ' ', $self->apache_corelib_cygwin, $self->apru_link_flags; } sub apache_libs { my $self = shift; my $libs = \&{"apache_libs_$^O"}; return "" unless defined &$libs; $libs->($self); } sub modperl_libs_MSWin32 { my $self = shift; "$self->{cwd}/src/modules/perl/$self->{MP_LIBNAME}.lib"; } sub modperl_libs_cygwin { my $self = shift; return '' unless $self->is_dynamic; return "-L$self->{cwd}/src/modules/perl -l$self->{MP_LIBNAME}"; } sub modperl_libs { my $self = shift; my $libs = \&{"modperl_libs_$^O"}; return "" unless defined &$libs; $libs->($self); } sub modperl_libpath_MSWin32 { my $self = shift; # mod_perl.lib will be installed into MP_AP_PREFIX/lib # for use by 3rd party xs modules "$self->{cwd}/src/modules/perl/$self->{MP_LIBNAME}.lib"; } sub modperl_libpath_cygwin { my $self = shift; "$self->{cwd}/src/modules/perl/$self->{MP_LIBNAME}.dll.a"; } sub modperl_libpath { my $self = shift; my $libpath = \&{"modperl_libpath_$^O"}; return "" unless defined &$libpath; $libpath->($self); } # returns the directory and name of the aprext lib built under blib/ sub mp_apr_blib { my $self = shift; return unless (my $mp_apr_lib = $self->{MP_APR_LIB}); my $lib_mp_apr_lib = 'lib' . $mp_apr_lib; my @dirs = qw(blib arch auto); my $apr_blib = catdir $self->{cwd}, @dirs, $lib_mp_apr_lib; my $full_libname = $lib_mp_apr_lib . $Config{lib_ext}; return ($apr_blib, $full_libname); } sub mp_apr_lib_MSWin32 { my $self = shift; # The MP_APR_LIB will be installed into MP_AP_PREFIX/lib # for use by 3rd party xs modules my ($dir, $lib) = $self->mp_apr_blib(); $lib =~ s[^lib(\w+)$Config{lib_ext}$][$1]; $dir = Win32::GetShortPathName($dir); return qq{ -L$dir -l$lib }; } sub mp_apr_lib_cygwin { my $self = shift; my ($dir, $lib) = $self->mp_apr_blib(); $lib =~ s[^lib(\w+)$Config{lib_ext}$][$1]; my $libs = "-L$dir -l$lib"; # This is ugly, but is the only way to prevent the "undefined # symbols" error $libs .= join ' ', '', '-L' . catdir($self->perl_config('archlibexp'), 'CORE'), '-lperl'; $libs; } # linking used for the aprext lib used to build APR/APR::* sub mp_apr_lib { my $self = shift; my $libs = \&{"mp_apr_lib_$^O"}; return "" unless defined &$libs; $libs->($self); } sub modperl_symbols_MSWin32 { my $self = shift; return "" unless $self->{MP_DEBUG}; "$self->{cwd}/src/modules/perl/$self->{MP_LIBNAME}.pdb"; } sub modperl_symbols { my $self = shift; my $symbols = \&{"modperl_symbols_$^O"}; return "" unless defined &$symbols; $symbols->($self); } sub write_src_makefile { my $self = shift; my $code = ModPerl::Code->new; my $path = $code->path; my $install = <<'EOI'; install: EOI if (!$self->should_build_apache) { $install .= <<'EOI'; # install mod_perl.so @$(MKPATH) $(DESTDIR)$(MODPERL_AP_LIBEXECDIR) $(MODPERL_TEST_F) $(MODPERL_LIB_DSO) && \ $(MODPERL_CP) $(MODPERL_LIB_DSO) $(DESTDIR)$(MODPERL_AP_LIBEXECDIR) EOI } $install .= <<'EOI'; # install mod_perl .h files @$(MKPATH) $(DESTDIR)$(MODPERL_AP_INCLUDEDIR) $(MODPERL_CP) $(MODPERL_H_FILES) $(DESTDIR)$(MODPERL_AP_INCLUDEDIR) EOI my $mf = $self->default_file('makefile'); open my $fh, '>', $mf or die "open $mf: $!"; print $fh noedit_warning_hash(); print $fh $self->canon_make_attr('makefile', basename $mf); $self->make_tools($fh); print $fh $self->canon_make_attr('ap_libs', $self->apache_libs); print $fh $self->canon_make_attr('libname', $self->{MP_LIBNAME}); print $fh $self->canon_make_attr('dlext', 'so'); #always use .so if (AIX) { my $xs_dir = $self->file_path("xs"); print $fh "BASEEXT = $xs_dir/modperl_global\n\n"; } my %libs = ( dso => "$self->{MP_LIBNAME}.$self->{MODPERL_DLEXT}", static => "$self->{MP_LIBNAME}$self->{MODPERL_LIB_EXT}", ); #XXX short-term compat for Apache::TestConfigPerl $libs{shared} = $libs{dso}; foreach my $type (sort keys %libs) { my $lib = $libs{$type}; print $fh $self->canon_make_attr("lib_$type", $libs{$type}); } if (my $symbols = $self->modperl_symbols) { print $fh $self->canon_make_attr('lib_symbols', $symbols); $install .= <<'EOI'; # install mod_perl symbol file @$(MKPATH) $(MODPERL_AP_LIBEXECDIR) $(MODPERL_TEST_F) $(MODPERL_LIB_SYMBOLS) && \ $(MODPERL_CP) $(MODPERL_LIB_SYMBOLS) $(MODPERL_AP_LIBEXECDIR) EOI } if ($self->is_dynamic && (my $libs = $self->modperl_libpath)) { print $fh $self->canon_make_attr('lib_location', $libs); # Visual Studio 8 on Win32 uses manifest files if (WIN32) { (my $manifest = $libs) =~ s/\.lib$/.so.manifest/; print $fh $self->canon_make_attr('manifest_location', $manifest); } print $fh $self->canon_make_attr('ap_libdir', $self->ap_destdir(catdir $self->{MP_AP_PREFIX}, 'lib') ); $install .= <<'EOI'; # install mod_perl.lib @$(MKPATH) $(MODPERL_AP_LIBDIR) $(MODPERL_TEST_F) $(MODPERL_LIB_LOCATION) && \ $(MODPERL_CP) $(MODPERL_LIB_LOCATION) $(MODPERL_AP_LIBDIR) EOI } my $libperl = join '/', $self->perl_config('archlibexp'), 'CORE', $self->perl_config('libperl'); #this is only used for deps, if libperl has changed, relink mod_perl.so #not all perl dists put libperl where it should be, so just leave this #out if it isn't in the proper place if (-e $libperl) { print $fh $self->canon_make_attr('libperl', $libperl); } for my $method (qw(ccopts ldopts inc)) { print $fh $self->canon_make_attr($method, $self->$method()); } for my $method (qw(c_files o_files o_pic_files h_files)) { print $fh $self->canon_make_attr($method, @{ $code->$method() }); } my @libs; for my $type (sort map { uc } keys %libs) { next unless $self->{"MP_USE_$type"}; # on win32 mod_perl.lib must come after mod_perl.so $type eq 'STATIC' ? push @libs, $self->{"MODPERL_LIB_$type"} : unshift @libs, $self->{"MODPERL_LIB_$type"}; } print $fh $self->canon_make_attr('lib', "@libs"); print $fh $self->canon_make_attr('AP_INCLUDEDIR', $self->ap_destdir($self->install_headers_dir)); print $fh $self->canon_make_attr('AP_LIBEXECDIR', $self->ap_destdir($self->apxs(-q => 'LIBEXECDIR'))); my $xs_targ = $self->make_xs($fh); print $fh <<'EOF'; MODPERL_CCFLAGS = $(MODPERL_INC) $(MODPERL_CCOPTS) $(MODPERL_OPTIMIZE) MODPERL_CCFLAGS_SHLIB = $(MODPERL_CCFLAGS) $(MODPERL_CCCDLFLAGS) MODPERL_OBJS = $(MODPERL_O_FILES) $(MODPERL_XS_O_FILES) MODPERL_PIC_OBJS = $(MODPERL_O_PIC_FILES) $(MODPERL_XS_O_PIC_FILES) MKPATH = $(MODPERL_PERLPATH) "-MExtUtils::Command" -e mkpath all: lib lib: $(MODPERL_LIB) EOF print $fh $install; print $fh <<'EOF' if DMAKE; .USESHELL : EOF print $fh <<'EOF'; .SUFFIXES: .xs .c $(MODPERL_OBJ_EXT) .lo .i .s .c.lo: $(MODPERL_CC) $(MODPERL_CCFLAGS_SHLIB) \ -c $< && $(MODPERL_MV) $*$(MODPERL_OBJ_EXT) $*.lo .c$(MODPERL_OBJ_EXT): $(MODPERL_CC) $(MODPERL_CCFLAGS) -c $< .c.i: $(MODPERL_CPPRUN) $(MODPERL_CCFLAGS) -c $< > $*.i .c.s: $(MODPERL_CC) -O -S $(MODPERL_CCFLAGS) -c $< .xs.c: $(MODPERL_XSUBPP) $*.xs >$@ .xs$(MODPERL_OBJ_EXT): $(MODPERL_XSUBPP) $*.xs >$*.c $(MODPERL_CC) $(MODPERL_CCFLAGS) -c $*.c .xs.lo: $(MODPERL_XSUBPP) $*.xs >$*.c $(MODPERL_CC) $(MODPERL_CCFLAGS_SHLIB) \ -c $*.c && $(MODPERL_MV) $*$(MODPERL_OBJ_EXT) $*.lo clean: $(MODPERL_RM_F) *.a *.so *.xsc \ $(MODPERL_LIBNAME).exp $(MODPERL_LIBNAME).lib \ *$(MODPERL_OBJ_EXT) *.lo *.i *.s *.pdb *.manifest \ $(MODPERL_CLEAN_FILES) \ $(MODPERL_XS_CLEAN_FILES) $(MODPERL_OBJS): $(MODPERL_H_FILES) $(MODPERL_MAKEFILE) $(MODPERL_PIC_OBJS): $(MODPERL_H_FILES) $(MODPERL_MAKEFILE) $(MODPERL_LIB): $(MODPERL_LIBPERL) $(MODPERL_LIBNAME)$(MODPERL_LIB_EXT): $(MODPERL_OBJS) $(MODPERL_RM_F) $@ $(MODPERL_AR) crv $@ $(MODPERL_OBJS) $(MODPERL_RANLIB) $@ EOF print $fh $self->dynamic_link; print $fh @$xs_targ; print $fh "\n"; # Makefile must end with \n to avoid warnings close $fh; } #--- generate MakeMaker parameter values --- sub otherldflags_default { my $self = shift; # e.g. aix's V:ldflags feeds -brtl and other flags $self->perl_config('ldflags'); } sub otherldflags { my $self = shift; my $flags = \&{"otherldflags_$^O"}; return $self->otherldflags_default unless defined &$flags; $flags->($self); } sub otherldflags_MSWin32 { my $self = shift; my $flags = $self->otherldflags_default; $flags .= ' -pdb:$(INST_ARCHAUTODIR)\$(BASEEXT).pdb' if $self->{MP_DEBUG}; $flags; } sub typemaps { my $self = shift; my @typemaps = (); # XXX: could move here the code from ModPerl::BuildMM return [] if IS_MOD_PERL_BUILD; # for post install use for (@INC) { # make sure not to pick mod_perl 1.0 typemap my $file = "$_/auto/Apache2/typemap"; push @typemaps, $file if -e $file; } return \@typemaps; } sub includes { my $self = shift; my @inc = (); unless (IS_MOD_PERL_BUILD) { # XXX: what if apxs is not available? win32? my $ap_inc = $self->apxs('-q' => 'INCLUDEDIR'); if ($ap_inc && -d $ap_inc) { push @inc, $ap_inc; return \@inc; } # this is fatal my $reason = $ap_inc ? "path $ap_inc doesn't exist" : "apxs -q INCLUDEDIR didn't return a value"; die "Can't find the mod_perl include dir (reason: $reason)"; } my $os = WIN32 ? 'win32' : 'unix'; push @inc, $self->file_path("src/modules/perl", "xs"); push @inc, $self->mp_include_dir; unless ($self->httpd_is_source_tree) { push @inc, $self->apr_includedir; my $apuc = $self->apu_config_path; if ($apuc && -x $apuc) { chomp(my $apuincs = qx($apuc --includes)); # win32: /Ipath, elsewhere -Ipath $apuincs =~ s{^\s*(-|/)I}{}; push @inc, $apuincs; } my $ainc = $self->apxs('-q' => 'INCLUDEDIR'); if (-d $ainc) { push @inc, $ainc; return \@inc; } } if ($self->{MP_AP_PREFIX}) { my $src = $self->dir; for ("$src/modules/perl", "$src/include", "$src/srclib/apr/include", "$src/srclib/apr-util/include", "$src/os/$os") { push @inc, $_ if -d $_; } } return \@inc; } sub inc { local $_; my @includes = map { "-I$_" } @{ shift->includes }; "@includes"; } ### Picking the right LFS support flags for mod_perl, by Joe Orton ### # # on Unix systems where by default off_t is a "long", a 32-bit integer, # there are two different ways to get "large file" support, i.e. the # ability to manipulate files bigger than 2Gb: # # 1) you compile using -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64. This # makes sys/types.h expose off_t as a "long long", a 64-bit integer, and # changes the size of a few other types too. The C library headers # automatically arrange to expose a correct implementation of functions # like lseek() which take off_t parameters. # # 2) you compile using -D_LARGEFILE64_SOURCE, and use what is called the # "transitional" interface. This means that the system headers expose a # new type, "off64_t", which is a long long, but the size of off_t is not # changed. A bunch of new functions like lseek64() are exposed by the C # library headers, which take off64_t parameters in place of off_t. # # Perl built with -Duselargefiles uses approach (1). # # APR HEAD uses (2) by default. APR 0.9 does not by default use either # approach, but random users can take a httpd-2.0.49 tarball, and do: # # export CPPFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" # ./configure # # to build a copy of apr/httpd which uses approach (1), though this # isn't really a supported configuration. # # The problem that mod_perl has to work around is when you take a # package built with approach (1), i.e. Perl, and any package which was # *not* built with (1), i.e. APR, and want to interface between # them. [1] # # So what you want to know is whether APR was built using approach (1) # or not. APR_HAS_LARGE_FILES in HEAD just tells you whether APR was # built using approach (2) or not, which isn't useful in solving this # problem. # # [1]: In some cases, it may be OK to interface between packages which # use (1) and packages which use (2). APR HEAD is currently not such a # case, since the size of apr_ino_t is still changing when # _FILE_OFFSET_BITS is defined. # # If you want to see how this matters, get some httpd function to do at # the very beginning of main(): # # printf("sizeof(request_rec) = %lu, sizeof(apr_finfo_t) = %ul", # sizeof(request_rec), sizeof(apr_finfo_t)); # # and then put the same printf in mod_perl somewhere, and see the # differences. This is why it is a really terribly silly idea to ever # use approach (1) in anything other than an entirely self-contained # application. # # there is no conflict if both libraries either have or don't have # large files support enabled sub has_large_files_conflict { my $self = shift; my $apxs_flags = join $self->apxs_extra_cflags, $self->apxs_extra_cppflags; my $apr_lfs64 = $apxs_flags =~ /-D_FILE_OFFSET_BITS=64/; my $perl_lfs64 = $Config{ccflags} =~ /-D_FILE_OFFSET_BITS=64/; # XXX: we don't really deal with the case where APR was built with # -D_FILE_OFFSET_BITS=64 but perl wasn't, since currently we strip # only perl's ccflags, not apr's flags. the reason we don't deal # with it is that we didn't have such a case yet, but may need to # deal with it later return 0; # $perl_lfs64 ^ $apr_lfs64; } # if perl is built with uselargefiles, but apr not, the build won't # work together as it uses two binary incompatible libraries, so # reduce the functionality to the greatest common denominator (C code # will have to make sure to prevent any operations that may rely on # effects created by uselargefiles, e.g. Off_t=8 instead of Off_t=4) sub strip_lfs { my ($self, $cflags) = @_; return $cflags unless $self->has_large_files_conflict(); my $lf = $Config{ccflags_uselargefiles} || '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'; $cflags =~ s/$lf//; $cflags; } sub define { my $self = shift; return ""; } 1; __END__ =head1 NAME Apache2::Build - Methods for locating and parsing bits of Apache source code =head1 SYNOPSIS use Apache2::Build (); my $build = Apache2::Build->new; # rebuild mod_perl with build opts from the previous build % cd modperl-2.0 % perl -MApache2::Build -e rebuild =head1 DESCRIPTION This module provides methods for locating and parsing bits of Apache source code. Since mod_perl remembers what build options were used to build it, you can use this knowledge to rebuild it using the same options. Simply chdir to the mod_perl source directory and run: % cd modperl-2.0 % perl -MApache2::Build -e rebuild If you want to rebuild not yet installed, but already built mod_perl, run from its root directory: % perl -Ilib -MApache2::Build -e rebuild =head1 METHODS =over 4 =item new Create an object blessed into the B class. my $build = Apache2::Build->new; =item dir Top level directory where source files are located. my $dir = $build->dir; -d $dir or die "can't stat $dir $!\n"; =item find Searches for apache source directories, return a list of those found. Example: for my $dir ($build->find) { my $yn = prompt "Configure with $dir ?", "y"; ... } =item inc Print include paths for MakeMaker's B argument to C. Example: use ExtUtils::MakeMaker; use Apache2::Build (); WriteMakefile( 'NAME' => 'Apache2::Module', 'VERSION' => '0.01', 'INC' => Apache2::Build->new->inc, ); =item module_magic_number Return the B defined in the apache source. Example: my $mmn = $build->module_magic_number; =item httpd_version Return the server version. Example: my $v = $build->httpd_version; =item otherldflags Return other ld flags for MakeMaker's B argument to C. This might be needed on systems like AIX that need special flags to the linker to be able to reference mod_perl or httpd symbols. Example: use ExtUtils::MakeMaker; use Apache2::Build (); WriteMakefile( 'NAME' => 'Apache2::Module', 'VERSION' => '0.01', 'INC' => Apache2::Build->new->inc, 'dynamic_lib' => { 'OTHERLDFLAGS' => Apache2::Build->new->otherldflags, }, ); =back =head1 AUTHOR Doug MacEachern =cut mod_perl-2.0.9/lib/Apache2/compat.pm0000644000104000010010000005040712540623201017617 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::compat; use strict; use warnings FATAL => 'all'; no warnings 'redefine'; #1.xx compat layer #some of this will stay as-is #some will be implemented proper later on #there's enough here to get simple registry scripts working #add to startup.pl: #use Apache2::compat (); #use lib ...; #or something to find 1.xx Apache2::Registry #Alias /perl /path/to/perl/scripts # # Options +ExecCGI # SetHandler modperl # PerlResponseHandler Apache2::Registry # use Apache2::Connection (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Access (); use Apache2::Module (); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Response (); use Apache2::SubRequest (); use Apache2::Filter (); use Apache2::Util (); use Apache2::Log (); use Apache2::URI (); use APR::Date (); use APR::Table (); use APR::Pool (); use APR::URI (); use APR::Util (); use APR::Brigade (); use APR::Bucket (); use mod_perl2 (); use Symbol (); use File::Spec (); use APR::Const -compile => qw(FINFO_NORM); BEGIN { $INC{'Apache.pm'} = __FILE__; $INC{'Apache/Constants.pm'} = __FILE__; $INC{'Apache/File.pm'} = __FILE__; $INC{'Apache/Table.pm'} = __FILE__; } ($Apache::Server::Starting, $Apache::Server::ReStarting) = Apache2::ServerUtil::restart_count() == 1 ? (1, 0) : (0, 1); # api => "overriding code" # the overriding code, needs to "return" the original CODE reference # when eval'ed , so that it can be restored later my %overridable_mp2_api = ( 'Apache2::RequestRec::filename' => <<'EOI', { require Apache2::RequestRec; require APR::Finfo; my $orig_sub = *Apache2::RequestRec::filename{CODE}; *Apache2::RequestRec::filename = sub { my ($r, $newfile) = @_; my $old_filename; if (defined $newfile) { $old_filename = $r->$orig_sub($newfile); die "'$newfile' doesn't exist" unless -e $newfile; $r->finfo(APR::Finfo::stat($newfile, APR::Const::FINFO_NORM, $r->pool)); } else { $old_filename = $r->$orig_sub(); } return $old_filename; }; $orig_sub; } EOI 'Apache2::RequestRec::notes' => <<'EOI', { require Apache2::RequestRec; my $orig_sub = *Apache2::RequestRec::notes{CODE}; *Apache2::RequestRec::notes = sub { my $r = shift; return wantarray() ? ($r->table_get_set(scalar($r->$orig_sub), @_)) : scalar($r->table_get_set(scalar($r->$orig_sub), @_)); }; $orig_sub; } EOI 'Apache2::RequestRec::finfo' => <<'EOI', { require APR::Finfo; my $orig_sub = *APR::Finfo::finfo{CODE}; sub Apache2::RequestRec::finfo { my $r = shift; stat $r->filename; \*_; } $orig_sub; } EOI 'Apache2::Connection::local_addr' => <<'EOI', { require Apache2::Connection; require Socket; require APR::SockAddr; my $orig_sub = *Apache2::Connection::local_addr{CODE}; *Apache2::Connection::local_addr = sub { my $c = shift; Socket::pack_sockaddr_in($c->$orig_sub->port, Socket::inet_aton($c->$orig_sub->ip_get)); }; $orig_sub; } EOI 'Apache2::Connection::remote_addr' => <<'EOI', { require Apache2::Connection; require APR::SockAddr; require Socket; my $orig_sub; if (defined *Apache2::Connection::client_addr{CODE}) { # httpd-2.4 $orig_sub = *Apache2::Connection::client_addr{CODE}; } else { # httpd-2.2 $orig_sub = *Apache2::Connection::remote_addr{CODE}; } *Apache2::Connection::remote_addr = sub { my $c = shift; if (@_) { my $addr_in = shift; my ($port, $addr) = Socket::unpack_sockaddr_in($addr_in); $c->$orig_sub->ip_set($addr); $c->$orig_sub->port_set($port); } else { Socket::pack_sockaddr_in($c->$orig_sub->port, Socket::inet_aton($c->$orig_sub->ip_get)); } }; $orig_sub; } EOI 'Apache2::Module::top_module' => <<'EOI', { require Apache2::Module; my $orig_sub = *Apache2::Module::top_module{CODE}; *Apache2::Module::top_module = sub { shift; $orig_sub->(@_); }; $orig_sub; } EOI 'Apache2::Module::get_config' => <<'EOI', { require Apache2::Module; my $orig_sub = *Apache2::Module::get_config{CODE}; *Apache2::Module::get_config = sub { shift; $orig_sub->(@_); }; $orig_sub; } EOI 'APR::URI::unparse' => <<'EOI', { require APR::URI; my $orig_sub = *APR::URI::unparse{CODE}; *APR::URI::unparse = sub { my ($uri, $flags) = @_; if (defined $uri->hostname && !defined $uri->scheme) { # we do this only for back compat, the new APR::URI is # protocol-agnostic and doesn't fallback to 'http' when the # scheme is not provided $uri->scheme('http'); } $orig_sub->(@_); }; $orig_sub; } EOI 'Apache2::Util::ht_time' => <<'EOI', { require Apache2::Util; my $orig_sub = *Apache2::Util::ht_time{CODE}; *Apache2::Util::ht_time = sub { my $r = Apache2::compat::request('Apache2::Util::ht_time'); return $orig_sub->($r->pool, @_); }; $orig_sub; } EOI ); my %overridden_mp2_api = (); # this function enables back-compatible APIs which can't coexist with # mod_perl 2.0 APIs with the same name and therefore it should be # avoided if possible. # # it expects a list of fully qualified functions, like # "Apache2::RequestRec::finfo" sub override_mp2_api { my (@subs) = @_; for my $sub (@subs) { unless (exists $overridable_mp2_api{$sub}) { die __PACKAGE__ . ": $sub is not overridable"; } if (exists $overridden_mp2_api{$sub}) { warn __PACKAGE__ . ": $sub has been already overridden"; next; } $overridden_mp2_api{$sub} = eval $overridable_mp2_api{$sub}; unless (exists $overridden_mp2_api{$sub} && ref($overridden_mp2_api{$sub}) eq 'CODE') { die "overriding $sub didn't return a CODE ref"; } } } # restore_mp2_api does the opposite of override_mp2_api(), it removes # the overriden API and restores the original mod_perl 2.0 API sub restore_mp2_api { my (@subs) = @_; for my $sub (@subs) { unless (exists $overridable_mp2_api{$sub}) { die __PACKAGE__ . ": $sub is not overridable"; } unless (exists $overridden_mp2_api{$sub}) { warn __PACKAGE__ . ": can't restore $sub, " . "as it has not been overridden"; next; } # XXX: 5.8.2+ can't delete and assign at once - gives: # Attempt to free unreferenced scalar # after perl_clone. the 2 step works ok. to reproduce: # t/TEST -maxclients 1 perl/ithreads2.t compat/request.t my $original_sub = $overridden_mp2_api{$sub}; delete $overridden_mp2_api{$sub}; no warnings 'redefine'; no strict 'refs'; *$sub = $original_sub; } } sub request { my $what = shift; my $r = Apache2::RequestUtil->request; unless ($r) { die "cannot use $what ", "without 'SetHandler perl-script' ", "or 'PerlOptions +GlobalRequest'"; } $r; } { my $orig_sub = *Apache2::Module::top_module{CODE}; *Apache2::Module::top_module = sub { $orig_sub->(); }; } { my $orig_sub = *Apache2::Module::get_config{CODE}; *Apache2::Module::get_config = sub { shift if $_[0] eq 'Apache2::Module'; $orig_sub->(@_); }; } package Apache::Server; # XXX: is that good enough? see modperl/src/modules/perl/mod_perl.c:367 our $CWD = Apache2::ServerUtil::server_root(); our $AddPerlVersion = 1; sub warn { shift if @_ and $_[0] eq 'Apache::Server'; Apache2::ServerRec::warn(@_); } package Apache; sub request { return Apache2::compat::request(@_); } sub unescape_url_info { my ($class, $string) = @_; Apache2::URI::unescape_url($string); $string =~ tr/+/ /; $string; } #sorry, have to use $r->Apache2::args at the moment #for list context splitting sub args { my $r = shift; my $args = $r->args; return $args unless wantarray; return $r->parse_args($args); } sub server_root_relative { my $class = shift; if (@_ && defined($_[0]) && File::Spec->file_name_is_absolute($_[0])) { return File::Spec->catfile(@_); } else { File::Spec->catfile(Apache2::ServerUtil::server_root(), @_); } } sub exit { require ModPerl::Util; my $status = 0; my $nargs = @_; if ($nargs == 2) { $status = $_[1]; } elsif ($nargs == 1 and $_[0] =~ /^\d+$/) { $status = $_[0]; } ModPerl::Util::exit($status); } #XXX: warn sub import { } sub untaint { shift; require ModPerl::Util; ModPerl::Util::untaint(@_); } sub module { require Apache2::Module; die 'Usage: Apache2->module($name)' if @_ != 2; return Apache2::Module::loaded($_[1]); } sub gensym { return Symbol::gensym(); } sub define { shift if @_ == 2; Apache2::ServerUtil::exists_config_define(@_); } sub log_error { Apache2::ServerUtil->server->log_error(@_); } sub warn { shift if @_ and $_[0] eq 'Apache'; Apache2::ServerRec::warn(@_); } sub httpd_conf { shift; my $obj; eval { $obj = Apache2::RequestUtil->request }; $obj = Apache2::ServerUtil->server if $@; my $err = $obj->add_config([split /\n/, join '', @_]); die $err if $err; } # mp2 always can stack handlers sub can_stack_handlers { 1; } sub push_handlers { shift; Apache2::ServerUtil->server->push_handlers(@_); } sub set_handlers { shift; Apache2::ServerUtil->server->set_handlers(@_); } sub get_handlers { shift; Apache2::ServerUtil->server->get_handlers(@_); } package Apache::Constants; use Apache2::Const (); sub import { my $class = shift; my $package = scalar caller; my @args = @_; # treat :response as :common - it's not perfect # but simple and close enough for the majority my %args = map { s/^:response$/:common/; $_ => 1 } @args; Apache2::Const->compile($package => keys %args); } #no need to support in 2.0 sub export {} sub SERVER_VERSION { Apache2::ServerUtil::get_server_version() } package Apache2::RequestRec; use Apache2::Const -compile => qw(REMOTE_NAME); #no longer exist in 2.0 sub soft_timeout {} sub hard_timeout {} sub kill_timeout {} sub reset_timeout {} # this function is from mp1's Apache2::SubProcess 3rd party module # which is now a part of mp2 API. this function doesn't exist in 2.0. sub cleanup_for_exec {} sub current_callback { require ModPerl::Util; return ModPerl::Util::current_callback(); } sub send_http_header { my ($r, $type) = @_; # since send_http_header() in mp1 was telling mod_perl not to # parse headers and in mp2 one must call $r->content_type($type) to # perform the same, we make sure that this happens $type = $r->content_type || 'text/html' unless defined $type; $r->content_type($type); } #we support Apache2::RequestUtil->request; this is needed to support $r->request #XXX: seems sorta backwards *request = \&Apache2::request; sub table_get_set { my ($r, $table) = (shift, shift); my ($key, $value) = @_; if (1 == @_) { return wantarray() ? ($table->get($key)) : scalar($table->get($key)); } elsif (2 == @_) { if (defined $value) { return wantarray() ? ($table->set($key, $value)) : scalar($table->set($key, $value)); } else { return wantarray() ? ($table->unset($key)) : scalar($table->unset($key)); } } elsif (0 == @_) { return $table; } else { my $name = (caller(1))[3]; $r->warn("Usage: \$r->$name([key [,val]])"); } } sub header_out { my $r = shift; return wantarray() ? ($r->table_get_set(scalar($r->headers_out), @_)) : scalar($r->table_get_set(scalar($r->headers_out), @_)); } sub header_in { my $r = shift; return wantarray() ? ($r->table_get_set(scalar($r->headers_in), @_)) : scalar($r->table_get_set(scalar($r->headers_in), @_)); } sub err_header_out { my $r = shift; return wantarray() ? ($r->table_get_set(scalar($r->err_headers_out), @_)) : scalar($r->table_get_set(scalar($r->err_headers_out), @_)); } sub register_cleanup { shift->pool->cleanup_register(@_); } *post_connection = \®ister_cleanup; sub get_remote_host { my ($r, $type) = @_; $type = Apache2::Const::REMOTE_NAME unless defined $type; $r->connection->get_remote_host($type, $r->per_dir_config); } sub parse_args { my ($r, $string) = @_; return () unless defined $string and $string; return map { tr/+/ /; s/%([0-9a-fA-F]{2})/pack("C",hex($1))/ge; $_; } split /[=&;]/, $string, -1; } use Apache2::Const -compile => qw(MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub content { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); while (!$bb->is_empty) { my $b = $bb->first; if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->delete; } } while (!$seen_eos); $bb->destroy; return $data unless wantarray; return $r->parse_args($data); } sub server_root_relative { my $r = shift; File::Spec->catfile(Apache2::ServerUtil::server_root(), @_); } sub clear_rgy_endav { my ($r, $script_name) = @_; require ModPerl::Global; my $package = 'Apache2::ROOT' . $script_name; ModPerl::Global::special_list_clear(END => $package); } sub stash_rgy_endav { #see run_rgy_endav } #if somebody really wants to have END subroutine support #with the 1.x Apache2::Registry they will need to configure: # PerlHandler Apache2::Registry Apache2::compat::run_rgy_endav sub Apache2::compat::run_rgy_endav { my $r = shift; require ModPerl::Global; require Apache2::PerlRun; #1.x's my $package = Apache2::PerlRun->new($r)->namespace; ModPerl::Global::special_list_call(END => $package); } sub seqno { 1; } sub chdir_file { #XXX resolve '.' in @INC to basename $r->filename } #XXX: would like to have a proper implementation #that reads line-by-line as defined by $/ #the best way will probably be to use perlio in 5.8.0 #anything else would be more effort than it is worth sub READLINE { my $r = shift; my $line; $r->read($line, $r->headers_in->get('Content-length')); $line ? $line : undef; } #XXX: howto convert PerlIO to apr_file_t #so we can use the real ap_send_fd function #2.0 ap_send_fd() also has an additional offset parameter sub send_fd_length { my ($r, $fh, $length) = @_; my $buff; my $total_bytes_sent = 0; my $len; return 0 if $length == 0; if (($length > 0) && ($total_bytes_sent + IOBUFSIZE) > $length) { $len = $length - $total_bytes_sent; } else { $len = IOBUFSIZE; } binmode $fh; while (CORE::read($fh, $buff, $len)) { $total_bytes_sent += $r->puts($buff); } $total_bytes_sent; } sub send_fd { my ($r, $fh) = @_; $r->send_fd_length($fh, -1); } sub is_main { !shift->main } # really old back-compat methods, they shouldn't be used in mp1 *cgi_var = *cgi_env = \&Apache2::RequestRec::subprocess_env; package Apache::File; use Fcntl (); use Symbol (); use Carp (); sub new { my ($class) = shift; my $fh = Symbol::gensym; my $self = bless $fh, ref($class)||$class; if (@_) { return $self->open(@_) ? $self : undef; } else { return $self; } } sub open { my ($self) = shift; Carp::croak("no Apache2::File object passed") unless $self && ref($self); # cannot forward @_ to open() because of its prototype if (@_ > 1) { my ($mode, $file) = @_; CORE::open $self, $mode, $file; } else { my $file = shift; CORE::open $self, $file; } } sub close { my ($self) = shift; CORE::close $self; } my $TMPNAM = 'aaaaaa'; my $TMPDIR = $ENV{'TMPDIR'} || $ENV{'TEMP'} || '/tmp'; ($TMPDIR) = $TMPDIR =~ /^([^<>|;*]+)$/; #untaint my $Mode = Fcntl::O_RDWR()|Fcntl::O_EXCL()|Fcntl::O_CREAT(); my $Perms = 0600; sub tmpfile { my $class = shift; my $limit = 100; my $r = Apache2::compat::request('Apache::File->tmpfile'); while ($limit--) { my $tmpfile = "$TMPDIR/${$}" . $TMPNAM++; my $fh = $class->new; sysopen $fh, $tmpfile, $Mode, $Perms or die "failed to open $tmpfile: $!"; $r->pool->cleanup_register(sub { unlink $tmpfile }); if ($fh) { return wantarray ? ($tmpfile, $fh) : $fh; } } } # the following functions now live in Apache2::RequestIO # * discard_request_body # the following functions now live in Apache2::Response # * meets_conditions # * set_content_length # * set_etag # * set_last_modified # * update_mtime # the following functions now live in Apache2::RequestRec # * mtime package Apache::Util; sub size_string { my ($size) = @_; if (!$size) { $size = " 0k"; } elsif ($size == -1) { $size = " -"; } elsif ($size < 1024) { $size = " 1k"; } elsif ($size < 1048576) { $size = sprintf "%4dk", ($size + 512) / 1024; } elsif ($size < 103809024) { $size = sprintf "%4.1fM", $size / 1048576.0; } else { $size = sprintf "%4dM", ($size + 524288) / 1048576; } return $size; } *unescape_uri = \&Apache2::URI::unescape_url; *escape_path = \&Apache2::Util::escape_path; sub escape_uri { my $path = shift; my $r = Apache2::compat::request('Apache2::Util::escape_uri'); Apache2::Util::escape_path($path, $r->pool); } #tmp compat until ap_escape_html is reworked to not require a pool my %html_escapes = ( '<' => 'lt', '>' => 'gt', '&' => 'amp', '"' => 'quot', ); %html_escapes = map { $_, "&$html_escapes{$_};" } keys %html_escapes; my $html_escape = join '|', keys %html_escapes; sub escape_html { my $html = shift; $html =~ s/($html_escape)/$html_escapes{$1}/go; $html; } *parsedate = \&APR::Date::parse_http; *validate_password = \&APR::Util::password_validate; sub Apache2::URI::parse { my ($class, $r, $uri) = @_; $uri ||= $r->construct_url; APR::URI->parse($r->pool, $uri); } package Apache::Table; sub new { my ($class, $r, $nelts) = @_; $nelts ||= 10; APR::Table::make($r->pool, $nelts); } package Apache::SIG; use Apache2::Const -compile => 'DECLINED'; sub handler { # don't set the SIGPIPE return Apache2::Const::DECLINED; } package Apache2::Connection; # auth_type and user records don't exist in 2.0 conn_rec struct # 'PerlOptions +GlobalRequest' is required sub auth_type { shift; Apache2::RequestUtil->request->ap_auth_type(@_) } sub user { shift; Apache2::RequestUtil->request->user(@_) } 1; __END__ mod_perl-2.0.9/lib/Apache2/ParseSource.pm0000644000104000010010000004134412540623201020567 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::ParseSource; use strict; use warnings FATAL => 'all'; use Apache2::Build (); use Config; use File::Basename; use File::Spec::Functions qw(catdir); our $VERSION = '0.02'; sub new { my $class = shift; my $self = bless { config => Apache2::Build->build_config, @_, }, $class; my $prefixes = join '|', @{ $self->{prefixes} || [qw(ap_ apr_)] }; $self->{prefix_re} = qr{^($prefixes)}; $Apache2::Build::APXS ||= $self->{apxs}; $self; } sub config { shift->{config}; } sub parse { my $self = shift; $self->{scan_filename} = $self->generate_cscan_file; $self->{c} = $self->scan; } sub DESTROY { my $self = shift; unlink $self->{scan_filename} } { package Apache2::ParseSource::Scan; our @ISA = qw(ModPerl::CScan); sub get { local $SIG{__DIE__} = \&Carp::confess; shift->SUPER::get(@_); } } my @c_scan_defines = ( 'CORE_PRIVATE', #so we get all of apache 'MP_SOURCE_SCAN', #so we can avoid some c-scan barfing '_NETINET_TCP_H', #c-scan chokes on netinet/tcp.h '_BYTESWAP_H', #c-scan chokes on byteswap.h '_BITS_BYTESWAP_H', #c-scan chokes on byteswap.h 'Expat_INCLUDED', #c-scan chokes on expath.h # 'APR_OPTIONAL_H', #c-scan chokes on apr_optional.h 'apr_table_do_callback_fn_t=void', #c-scan chokes on function pointers ); # some types c-scan failing to resolve push @c_scan_defines, map { "$_=void" } qw(PPADDR_t PerlExitListEntry modperl_tipool_vtbl_t); sub scan { require ModPerl::CScan; ModPerl::CScan->VERSION(0.75); require Carp; my $self = shift; my $c = ModPerl::CScan->new(filename => $self->{scan_filename}); my $includes = $self->includes; # where to find perl headers, but we don't want to parse them otherwise my $perl_core_path = catdir $Config{installarchlib}, "CORE"; push @$includes, $perl_core_path; $c->set(includeDirs => $includes); my @defines = @c_scan_defines; unless ($Config{useithreads} and $Config{useithreads} eq 'define') { #fake -DITHREADS so function tables are the same for #vanilla and ithread perls, that is, #make sure THX and friends are always expanded push @defines, 'MP_SOURCE_SCAN_NEED_ITHREADS'; } $c->set(Defines => join ' ', map "-D$_", @defines); bless $c, 'Apache2::ParseSource::Scan'; } sub include_dirs { my $self = shift; my $inc = $self->config->apxs('-q' => 'INCLUDEDIR'); my @dirs = ($inc, $self->config->mp_include_dir); my $aprinc = $self->config->apxs('-q' => 'APR_INCLUDEDIR'); unless ($aprinc eq $inc) { # Add APR include directory if different to httpd includedir push @dirs, $aprinc; } @dirs; } sub includes { shift->config->includes } sub find_includes { my $self = shift; return $self->{includes} if $self->{includes}; require File::Find; my @includes = (); # don't pick preinstalled mod_perl headers if any, but pick the rest { my @dirs = $self->include_dirs; die "could not find include directory (build the project first)" unless -d $dirs[0]; my $unwanted = join '|', qw(ap_listen internal version apr_optional mod_include mod_cgi mod_proxy mod_ssl ssl_ apr_anylock apr_rmm ap_config mod_log_config mod_perl modperl_ apreq mod_cache mod_serf mod_dav); $unwanted = qr|^$unwanted|; my $wanted = ''; push @includes, find_includes_wanted($wanted, $unwanted, @dirs); } # now add the live mod_perl headers (to make sure that we always # work against the latest source) { my @dirs = map { catdir $self->config->{cwd}, $_ } catdir(qw(src modules perl)), 'xs'; my $unwanted = ''; my $wanted = join '|', qw(mod_perl modperl_); $wanted = qr|^$wanted|; push @includes, find_includes_wanted($wanted, $unwanted, @dirs); } # now reorg the header files list, so the fragile scan won't choke my @apr = (); my @mp = (); my @rest = (); for (@includes) { if (/mod_perl.h$/) { # mod_perl.h needs to be included before other mod_perl # headers unshift @mp, $_; } elsif (/modperl_\w+.h$/) { push @mp, $_; } elsif (/apr_\w+\.h$/ ) { # apr headers need to be included first push @apr, $_; } else { push @rest, $_; } } @includes = (@apr, @rest, @mp); return $self->{includes} = \@includes; } sub find_includes_wanted { my ($wanted, $unwanted, @dirs) = @_; my @includes = (); for my $dir (@dirs) { File::Find::finddepth({ wanted => sub { return unless /\.h$/; if ($wanted) { return unless /$wanted/; } else { return if /$unwanted/; } my $dir = $File::Find::dir; push @includes, "$dir/$_"; }, (Apache2::Build::WIN32 ? '' : follow => 1), }, $dir); } return @includes; } sub generate_cscan_file { my $self = shift; my $includes = $self->find_includes; my $filename = '.apache_includes'; open my $fh, '>', $filename or die "can't open $filename: $!"; for my $path (@$includes) { my $filename = basename $path; print $fh qq(\#include "$path"\n); } close $fh; return $filename; } my %defines_wanted = ( 'Apache2::Const' => { common => [qw{OK DECLINED DONE}], config => [qw{DECLINE_CMD}], context => [qw(NOT_IN_ GLOBAL_ONLY)], http => [qw{HTTP_}], log => [qw(APLOG_)], methods => [qw{M_ METHODS}], mpmq => [qw{AP_MPMQ_}], options => [qw{OPT_}], override => [qw{OR_ EXEC_ON_READ ACCESS_CONF RSRC_CONF}], proxy => [qw{PROXYREQ_}], platform => [qw{CRLF CR LF}], remotehost => [qw{REMOTE_}], satisfy => [qw{SATISFY_}], types => [qw{DIR_MAGIC_TYPE}], auth => [qw{AUTHN_ AUTHZ AP_AUTH_ AUTH_ AUTHZ_}], }, 'APR::Const' => { common => [qw{APR_SUCCESS}], error => [qw{APR_E}], filepath => [qw{APR_FILEPATH_}], filetype => [qw{APR_FILETYPE_}], fopen => [qw{APR_FOPEN_}], fprot => [qw{APR_FPROT_}], finfo => [qw{APR_FINFO_}], flock => [qw{APR_FLOCK_}], hook => [qw{APR_HOOK_}], limit => [qw{APR_LIMIT}], poll => [qw{APR_POLL}], socket => [qw{APR_SO_}], status => [qw{APR_TIMEUP}], table => [qw{APR_OVERLAP_TABLES_}], uri => [qw{APR_URI_}], }, ModPerl => { common => [qw{MODPERL_RC_}], } ); my %defines_wanted_re; while (my ($class, $groups) = each %defines_wanted) { while (my ($group, $wanted) = each %$groups) { my $pat = join '|', @$wanted; $defines_wanted_re{$class}->{$group} = $pat; #qr{^($pat)}; } } my %enums_wanted = ( 'Apache2::Const' => { map { $_, 1 } qw(cmd_how input_mode filter_type conn_keepalive authn_status authz_status) }, 'APR::Const' => { map { $_, 1 } qw(apr_shutdown_how apr_read_type apr_lockmech) }, ); my $defines_unwanted = join '|', qw{ HTTP_VERSION APR_EOL_STR APLOG_MARK APLOG_NOERRNO APR_SO_TIMEOUT APR_HOOK_PROBES_ENABLED APR_HOOK_INT_DCL_UD APLOG_MAX_LOGLEVEL APR_BEGIN_DECLS APR_END_DECLS }; sub get_constants { my ($self) = @_; my $includes = $self->find_includes; my (%constants, %seen); for my $file (@$includes) { open my $fh, $file or die "open $file: $!"; while (<$fh>) { if (s/^\#define\s+(\w+)\s+.*/$1/) { chomp; next if /_H$/; next if $seen{$_}++; $self->handle_constant(\%constants); } elsif (m/enum[^\{]+\{/) { $self->handle_enum($fh, \%constants); } } close $fh; } #maintain a few handy shortcuts from 1.xx #aliases are defined in ModPerl::Code push @{ $constants{'Apache2::Const'}->{common} }, qw(NOT_FOUND FORBIDDEN AUTH_REQUIRED SERVER_ERROR REDIRECT); return \%constants; } sub handle_constant { my ($self, $constants) = @_; my $keys = keys %defines_wanted_re; return if /^($defines_unwanted)/o; while (my ($class, $groups) = each %defines_wanted_re) { my $keys = keys %$groups; while (my ($group, $re) = each %$groups) { next unless /^($re)/; push @{ $constants->{$class}->{$group} }, $_; return; } } } sub handle_enum { my ($self, $fh, $constants) = @_; my ($name, $e) = $self->parse_enum($fh); return unless $name; $name =~ s/^ap_//; $name =~ s/_(e|t)$//; my $class; for (keys %enums_wanted) { next unless $enums_wanted{$_}->{$name}; $class = $_; } return unless $class; $name =~ s/^apr_//; push @{ $constants->{$class}->{$name} }, @$e if $e; } #this should win an award for worlds lamest parser sub parse_enum { my ($self, $fh) = @_; my $code = $_; my @e; unless ($code =~ /;\s*$/) { local $_; while (<$fh>) { $code .= $_; last if /;\s*$/; } } my $name; if ($code =~ s/^\s*enum\s+(\w*)\s*//) { $name = $1; } elsif ($code =~ s/^\s*typedef\s+enum\s+//) { $code =~ s/\s*(\w+)\s*;\s*$//; $name = $1; } $code =~ s:/\*.*?\*/::sg; $code =~ s/\s*=\s*\w+//g; $code =~ s/^[^\{]*\{//s; $code =~ s/\}[^;]*;?//s; $code =~ s/^\s*\n//gm; while ($code =~ /\b(\w+)\b,?/g) { push @e, $1; } return ($name, \@e); } sub wanted_functions { shift->{prefix_re} } sub wanted_structures { shift->{prefix_re} } sub get_functions { my $self = shift; my $key = 'parsed_fdecls'; return $self->{$key} if $self->{$key}; my $c = $self->{c}; my $fdecls = $c->get($key); my $inlines = $c->get('parsed_inlines'); push @{$fdecls}, @{$inlines}; my %seen; my $wanted = $self->wanted_functions; my @functions; for my $entry (@$fdecls) { my ($rtype, $name, $args) = @$entry; next unless $name =~ $wanted; next if $seen{$name}++; my @attr; for (qw(static __inline__)) { if ($rtype =~ s/^($_)\s+//) { push @attr, $1; } } #XXX: working around ModPerl::CScan confusion here #macro defines ap_run_error_log causes #cpp filename:linenumber to be included as part of the type for (@$args) { next unless $_->[0]; $_->[0] =~ s/^\#.*?\"\s+//; $_->[0] =~ s/^register //; } my $func = { name => $name, return_type => $rtype, args => [map { { type => $_->[0], name => $_->[1] } } @$args], }; $func->{attr} = \@attr if @attr; push @functions, $func; } # sort the functions by the 'name' attribute to ensure a # consistent output on different systems. $self->{$key} = [sort { $a->{name} cmp $b->{name} } @functions]; } sub get_structs { my $self = shift; my $key = 'typedef_structs'; return $self->{$key} if $self->{$key}; my $c = $self->{c}; my $typedef_structs = $c->get($key); my %seen; my $wanted = $self->wanted_structures; my $other = join '|', qw(_rec module piped_log uri_t htaccess_result cmd_parms cmd_func cmd_how); my @structures; my $sx = qr(^struct\s+); while (my ($type, $elts) = each %$typedef_structs) { next unless $type =~ $wanted or $type =~ /($other)$/o; $type =~ s/$sx//; next if $seen{$type}++; my $struct = { type => $type, elts => [map { my $type = $_->[0]; $type =~ s/$sx//; $type .= $_->[1] if $_->[1]; $type =~ s/:\d+$//; #unsigned:1 { type => $type, name => $_->[2] } } @$elts], }; push @structures, $struct; } # sort the structs by the 'type' attribute to ensure a consistent # output on different systems. $self->{$key} = [sort { $a->{type} cmp $b->{type} } @structures]; } sub write_functions_pm { my $self = shift; my $file = shift || 'FunctionTable.pm'; my $name = shift || 'Apache2::FunctionTable'; $self->write_pm($file, $name, $self->get_functions); } sub write_structs_pm { my $self = shift; my $file = shift || 'StructureTable.pm'; my $name = shift || 'Apache2::StructureTable'; $self->write_pm($file, $name, $self->get_structs); } sub write_constants_pm { my $self = shift; my $file = shift || 'ConstantsTable.pm'; my $name = shift || 'Apache2::ConstantsTable'; $self->write_pm($file, $name, $self->get_constants); } sub write_pm { my ($self, $file, $name, $data) = @_; require Data::Dumper; local $Data::Dumper::Indent = 1; my ($subdir) = (split '::', $name)[0]; my $tdir = ''; my $build = Apache2::Build->new(init => 1); my $httpd_version = $build->httpd_version; if ($httpd_version lt '2.4.0') { $tdir='xs/tables/current'; } else { $tdir='xs/tables/current24'; } if (-d "$tdir/$subdir") { $file = "$tdir/$subdir/$file"; } # sort the hashes (including nested ones) for a consistent dump canonsort(\$data); my $dump = Data::Dumper->new([$data], [$name])->Dump; my $package = ref($self) || $self; my $version = $self->VERSION; my $date = scalar localtime; my $new_content = << "EOF"; package $name; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by $package/$version # ! $date # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $dump 1; EOF my $old_content = ''; if (-e $file) { open my $pm, '<', $file or die "open $file: $!"; local $/ = undef; # slurp the file $old_content = <$pm>; close $pm; } my $overwrite = 1; if ($old_content) { # strip the date line, which will never be the same before # comparing my $table_header = qr{^\#\s!.*}; (my $old = $old_content) =~ s/$table_header//mg; (my $new = $new_content) =~ s/$table_header//mg; $overwrite = 0 if $old eq $new; } if ($overwrite) { open my $pm, '>', $file or die "open $file: $!"; print $pm $new_content; close $pm; } } # canonsort(\$data); # sort nested hashes in the data structure. # the data structure itself gets modified sub canonsort { my $ref = shift; my $type = ref $$ref; return unless $type; require Tie::IxHash; my $data = $$ref; if ($type eq 'ARRAY') { for (@$data) { canonsort(\$_); } } elsif ($type eq 'HASH') { for (keys %$data) { canonsort(\$data->{$_}); } tie my %ixhash, 'Tie::IxHash'; # reverse sort so we get the order of: # return_type, name, args { type, name } for functions # type, elts { type, name } for structures for (sort { $b cmp $a } keys %$data) { $ixhash{$_} = $data->{$_}; } $$ref = \%ixhash; } } 1; __END__ mod_perl-2.0.9/lib/Apache2/PerlSections/0000755000104000010010000000000012540623201020402 5ustar AdministratorsNonemod_perl-2.0.9/lib/Apache2/PerlSections/Dump.pm0000644000104000010010000000514712540623201021654 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::PerlSections::Dump; use strict; use warnings FATAL => 'all'; our $VERSION = '0.01'; use Apache2::PerlSections; our @ISA = qw(Apache2::PerlSections); use Data::Dumper; # Process all saved packages sub package { return shift->saved } # We don't want to save anything sub save { return } # We don't want to post any config to apache, we are dumping sub post_config { return } sub dump { my $self = shift; unless (ref $self) { $self = $self->new; } $self->handler(); return join "\n", @{$self->directives}, '1;', '__END__', ''; } sub store { my ($class, $filename) = @_; require IO::File; my $fh = IO::File->new(">$filename") or die "can't open $filename $!\n"; $fh->print($class->dump); $fh->close; } sub dump_array { my ($self, $name, $entry) = @_; $self->add_config(Data::Dumper->Dump([$entry], ["*$name"])); } sub dump_hash { my ($self, $name, $entry) = @_; for my $elem (sort keys %{$entry}) { $self->add_config(Data::Dumper->Dump([$entry->{$elem}], ["\$$name"."{'$elem'}"])); } } sub dump_entry { my ($self, $name, $entry) = @_; return if not defined $entry; my $type = ref($entry); if ($type eq 'SCALAR') { $self->add_config(Data::Dumper->Dump([$$entry],[$name])); } if ($type eq 'ARRAY') { $self->dump_array($name,$entry); } else { $self->add_config(Data::Dumper->Dump([$entry],[$name])); } } sub dump_special { my ($self, @data) = @_; my @dump = grep { defined } @data; return unless @dump; $self->add_config(Data::Dumper->Dump([\@dump],['*'.$self->SPECIAL_NAME])); } 1; __END__ mod_perl-2.0.9/lib/Apache2/PerlSections.pm0000644000104000010010000001415312540623201020744 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::PerlSections; use strict; use warnings FATAL => 'all'; our $VERSION = '2.00'; use Apache2::CmdParms (); use Apache2::Directive (); use APR::Table (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); use constant SPECIAL_NAME => 'PerlConfig'; use constant SPECIAL_PACKAGE => 'Apache2::ReadConfig'; sub new { my ($package, @args) = @_; return bless { @args }, ref($package) || $package; } sub parms { return shift->{'parms'} } sub directives { return shift->{'directives'} ||= [] } sub package { return shift->{'args'}->{'package'} } my @saved; sub save { return $Apache2::PerlSections::Save } sub server { return $Apache2::PerlSections::Server } sub saved { return @saved } sub handler : method { my ($self, $parms, $args) = @_; unless (ref $self) { $self = $self->new('parms' => $parms, 'args' => $args); } if ($self->save) { push @saved, $self->package; } my $special = $self->SPECIAL_NAME; for my $entry ($self->symdump()) { if ($entry->[0] !~ /$special/) { $self->dump_any(@$entry); } } { no strict 'refs'; foreach my $package ($self->package) { my @config = map { split /\n/ } grep { defined } (@{"${package}::$special"}, ${"${package}::$special"}); $self->dump_special(@config); } } $self->post_config(); Apache2::Const::OK; } my %directives_seen_hack; sub symdump { my ($self) = @_; unless ($self->{symbols}) { no strict; $self->{symbols} = []; #XXX: Here would be a good place to warn about NOT using # Apache2::ReadConfig:: directly in sections foreach my $pack ($self->package, $self->SPECIAL_PACKAGE) { #XXX: Shamelessly borrowed from Devel::Symdump; while (my ($key, $val) = each(%{ *{"$pack\::"} })) { #We don't want to pick up stashes... next if ($key =~ /::$/); local (*ENTRY) = $val; if (defined $val && defined *ENTRY{SCALAR} && defined $ENTRY) { push @{$self->{symbols}}, [$key, $ENTRY]; } if (defined $val && defined *ENTRY{ARRAY}) { unless (exists $directives_seen_hack{"$key$val"}) { $directives_seen_hack{"$key$val"} = 1; push @{$self->{symbols}}, [$key, \@ENTRY]; } } if (defined $val && defined *ENTRY{HASH} && $key !~ /::/) { push @{$self->{symbols}}, [$key, \%ENTRY]; } } } } return @{$self->{symbols}}; } sub dump_special { my ($self, @data) = @_; $self->add_config(@data); } sub dump_any { my ($self, $name, $entry) = @_; my $type = ref $entry; if ($type eq 'ARRAY') { $self->dump_array($name, $entry); } elsif ($type eq 'HASH') { $self->dump_hash($name, $entry); } else { $self->dump_entry($name, $entry); } } sub dump_hash { my ($self, $name, $hash) = @_; for my $entry (keys %{ $hash || {} }) { my $item = $hash->{$entry}; my $type = ref($item); if ($type eq 'HASH') { $self->dump_section($name, $entry, $item); } elsif ($type eq 'ARRAY') { for my $e (@$item) { $self->dump_section($name, $entry, $e); } } } } sub dump_section { my ($self, $name, $loc, $hash) = @_; $self->add_config("<$name $loc>\n"); for my $entry (keys %{ $hash || {} }) { $self->dump_entry($entry, $hash->{$entry}); } $self->add_config("\n"); } sub dump_array { my ($self, $name, $entries) = @_; for my $entry (@$entries) { $self->dump_entry($name, $entry); } } sub dump_entry { my ($self, $name, $entry) = @_; my $type = ref $entry; if ($type eq 'SCALAR') { $self->add_config("$name $$entry\n"); } elsif ($type eq 'ARRAY') { if (grep {ref} @$entry) { $self->dump_entry($name, $_) for @$entry; } else { $self->add_config("$name @$entry\n"); } } elsif ($type eq 'HASH') { $self->dump_hash($name, $entry); } elsif ($type) { #XXX: Could do $type->can('httpd_config') here on objects ??? die "Unknown type '$type' for directive $name"; } elsif (defined $entry) { $self->add_config("$name $entry\n"); } } sub add_config { my ($self, @config) = @_; foreach my $config (@config) { return unless defined $config; chomp($config); push @{ $self->directives }, $config; } } sub post_config { my ($self) = @_; my $errmsg = $self->parms->add_config($self->directives); die $errmsg if $errmsg; } sub dump { my $class = shift; require Apache2::PerlSections::Dump; return Apache2::PerlSections::Dump->dump(@_); } sub store { my $class = shift; require Apache2::PerlSections::Dump; return Apache2::PerlSections::Dump->store(@_); } 1; __END__ mod_perl-2.0.9/lib/Apache2/porting.pm0000644000104000010010000000661212540623201020015 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::porting; use strict; use warnings FATAL => 'all'; use Carp 'croak'; use ModPerl::MethodLookup (); use Apache2::ServerUtil; use Apache2::Const -compile => 'OK'; our $AUTOLOAD; ### methods ### # handle: # - removed and replaced methods # - hinting the package names in which methods reside my %avail_methods = map { $_ => 1 } (ModPerl::MethodLookup::avail_methods(), ModPerl::MethodLookup::avail_methods_compat()); # XXX: unfortunately it doesn't seem to be possible to install # *UNIVERSAL::AUTOLOAD at the server startup, httpd segfaults, # child_init seems to be the first stage where it works. Apache2::ServerUtil->server->push_handlers( PerlChildInitHandler => \&porting_autoload); sub porting_autoload { *UNIVERSAL::AUTOLOAD = sub { # This is a porting module, no compatibility layers are allowed in # this zone croak("Apache2::porting can't be used with Apache2::compat") if exists $ENV{"Apache2/compat.pm"}; (my $method = $AUTOLOAD) =~ s/.*:://; # we skip DESTROY methods return if $method eq 'DESTROY'; # we don't handle methods that we don't know about croak "Undefined subroutine $AUTOLOAD called" unless defined $method && exists $avail_methods{$method}; my ($hint, @modules) = ModPerl::MethodLookup::lookup_method($method, @_); $hint ||= "Can't find method $AUTOLOAD"; croak $hint; }; return Apache2::Const::OK; } ### packages ### # handle: # - removed and replaced packages my %packages = ( 'Apache::Constants' => [qw(Apache2::Const)], 'Apache::Table' => [qw(APR::Table)], 'Apache::File' => [qw(Apache2::Response Apache2::RequestRec)], 'Apache' => [qw(ModPerl::Util Apache2::Module)], ); BEGIN { sub my_require { my $package = $_[0]; $package =~ s|/|::|g; $package =~ s|.pm$||; # this picks the original require (which could be overriden # elsewhere, so we don't lose that) because we haven't # overriden it yet return require $_[0] unless $packages{$package}; my $msg = "mod_perl 2.0 API doesn't include package '$package'."; my @replacements = @{ $packages{$package}||[] }; if (@replacements) { $msg .= " The package '$package' has moved to " . join " ", map qq/'$_'/, @replacements; } croak $msg; }; *CORE::GLOBAL::require = sub (*) { my_require($_[0])}; } 1; mod_perl-2.0.9/lib/Apache2/Resource.pm0000644000104000010010000001024112540623201020113 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::Resource; use strict; use warnings FATAL => 'all'; use mod_perl2; use Apache2::Module (); use BSD::Resource qw(setrlimit getrlimit get_rlimits); use Apache2::Const -compile => qw(OK); $Apache2::Resource::VERSION = '1.72'; our $Debug; $Debug ||= 0; sub MB ($) { my $num = shift; return ($num < (1024 * 1024)) ? $num*1024*1024 : $num; } sub BM ($) { my $num = shift; return ($num > (1024 * 1024)) ? '(' . ($num>>20) . 'Mb)' : ''; } sub DEFAULT_RLIMIT_DATA () { 64 } # data (memory) size in MB sub DEFAULT_RLIMIT_AS () { 64 } # address space (memory) size in MB sub DEFAULT_RLIMIT_CPU () { 60*6 } # cpu time in seconds sub DEFAULT_RLIMIT_CORE () { 0 } # core file size (MB) sub DEFAULT_RLIMIT_RSS () { 16 } # resident set size (MB) sub DEFAULT_RLIMIT_FSIZE () { 10 } # file size (MB) sub DEFAULT_RLIMIT_STACK () { 20 } # stack size (MB) my %is_mb = map {$_, 1} qw{DATA RSS STACK FSIZE CORE MEMLOCK AS}; sub debug { print STDERR @_ if $Debug } sub install_rlimit ($$$) { my ($res, $soft, $hard) = @_; my $name = $res; my $cv = \&{"BSD::Resource::RLIMIT_${res}"}; eval { $res = $cv->() }; return if $@; unless ($soft) { my $defval = \&{"DEFAULT_RLIMIT_${name}"}; if (defined &$defval) { $soft = $defval->(); } else { warn "can't find default for `$defval'\n"; } } $hard ||= $soft; debug "Apache2::Resource: PID $$ attempting to set `$name'=$soft:$hard ..."; ($soft, $hard) = (MB $soft, MB $hard) if $is_mb{$name}; return setrlimit $res, $soft, $hard; } sub handler { while (my ($k, $v) = each %ENV) { next unless $k =~ /^PERL_RLIMIT_(\w+)$/; $k = $1; next if $k eq "DEFAULTS"; my ($soft, $hard) = split ":", $v, 2; $hard ||= $soft; my $set = install_rlimit $k, $soft, $hard; debug "not " unless $set; debug "ok\n"; debug $@ if $@; } Apache2::Const::OK; } sub default_handler { while (my ($k, $v) = each %Apache2::Resource::) { next unless $k =~ s/^DEFAULT_/PERL_/; $ENV{$k} = ""; } handler(); } sub status_rlimit { my $lim = get_rlimits(); my @retval = ("", (map "", qw(Resource Soft Hard)), ""); for my $res (keys %$lim) { my $val = eval "&BSD::Resource::${res}()"; my ($soft, $hard) = getrlimit $val; (my $limit = $res) =~ s/^RLIMIT_//; ($soft, $hard) = ("$soft " . BM($soft), "$hard ". BM($hard)) if $is_mb{$limit}; push @retval, "", (map { "" } $res, $soft, $hard), "\n"; } push @retval, "
$_
$_

"; push @retval, "Apache2::Resource $Apache2::Resource::VERSION"; return \@retval; } if ($ENV{MOD_PERL}) { if ($ENV{PERL_RLIMIT_DEFAULTS}) { require Apache2::ServerUtil; Apache2::ServerUtil->server->push_handlers( PerlChildInitHandler => \&default_handler); } Apache2::Status->menu_item(rlimit => "Resource Limits", \&status_rlimit) if Apache2::Module::loaded("Apache2::Status"); } # perl Apache2/Resource.pm ++$Debug, default_handler unless caller(); 1; __END__ mod_perl-2.0.9/lib/Apache2/SourceTables.pm0000644000104000010010000000245012540623201020722 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::SourceTables; use Apache2::StructureTable (); use Apache2::FunctionTable (); #build hash versions of the tables %Apache2::StructureTable = map { $_->{type}, $_->{elts} } @$Apache2::StructureTable; %Apache2::FunctionTable = map { $_->{name}, {elts => $_->{elts}, return_type => $_->{return_type} } } @$Apache2::FunctionTable; 1; __END__ mod_perl-2.0.9/lib/Apache2/Status.pm0000644000104000010010000006065112540623201017621 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::Status; use strict; use warnings FATAL => 'all'; use mod_perl2; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use File::Spec (); use Apache2::Const -compile => qw(OK); $Apache2::Status::VERSION = '4.01'; # mod_perl 2.0 use constant IS_WIN32 => ($^O eq "MSWin32"); my %status = ( script => "PerlRequire'd Files", inc => "Loaded Modules", rgysubs => "Compiled Registry Scripts", symdump => "Symbol Table Dump", inh_tree => "Inheritance Tree", isa_tree => "ISA Tree", env => "Environment", sig => "Signal Handlers", myconfig => "Perl Configuration", ); delete $status{'sig'} if IS_WIN32; if ($Apache2::PerlSections::Save) { $status{"section_config"} = "Perl Section Configuration"; } my %requires = ( deparse => ["StatusDeparse", "B::Deparse", 0.59, ], fathom => ["StatusFathom", "B::Fathom", 0.05, ], symdump => ["", "Devel::Symdump", 2.00, ], dumper => ["StatusDumper", "Data::Dumper", 0, ], b => ["", "B", 0, ], graph => ["StatusGraph", "B::Graph", 0.03, ], lexinfo => ["StatusLexInfo", "B::LexInfo", 0, ], xref => ["StatusXref", "B::Xref", 1.01, ], terse => ["StatusTerse", "B::Terse", 0, ], tersesize => ["StatusTerseSize", "B::TerseSize", 0.09, ], packagesize => ["StatusPackageSize", "B::TerseSize", 0.09, ], peek => ["StatusPeek", "Apache::Peek", 1.03, ], ); sub has { my ($r, $what) = @_; return 0 unless exists $requires{$what}; my ($opt, $module, $version) = @{ $requires{$what} }; (my $file = $module) =~ s|::|/|; $file .= ".pm"; # if !$opt we skip the testing for the option return 0 if $opt && !status_config($r, $opt); return 0 unless eval { require $file }; my $mod_ver = $module->VERSION; $mod_ver =~ s/_.*//; # handle dev versions like 2.121_02 return 0 unless $mod_ver && $mod_ver >= $version; return 1; } use constant CPAN_SEARCH => 'http://search.cpan.org/search?mode=module;query'; sub install_hint { my ($module) = @_; return qq{

}; } sub status_config { my ($r, $key) = @_; return (lc($r->dir_config($key) || '') eq "on") || (lc($r->dir_config('StatusOptionsAll') || '') eq "on"); } sub menu_item { my ($self, $key, $val, $sub) = @_; $status{$key} = $val; no strict; no warnings 'redefine'; *{"status_${key}"} = $sub if $sub and ref $sub eq 'CODE'; } sub handler { my ($r) = @_; my $qs = $r->args || ""; my $sub = "status_$qs"; no strict 'refs'; if ($qs =~ s/^(noh_\w+).*/$1/) { &{$qs}($r); return Apache2::Const::OK; } header($r); if (defined &$sub) { $r->print(@{ &{$sub}($r) }); } elsif ($qs and %{$qs."::"}) { $r->print(symdump($r, $qs)); } else { my $uri = $r->location; $r->print('

'); $r->print( map { qq[$status{$_}
\n] } sort { lc $a cmp lc $b } keys %status ); $r->print('

'); } $r->print(""); Apache2::Const::OK; } sub header { my $r = shift; my $start = scalar localtime $^T; my $srv = Apache2::ServerUtil::get_server_version(); $r->content_type("text/html"); my $v = $^V ? sprintf "v%vd", $^V : $]; $r->print(<<"EOF"); Apache2::Status $Apache2::Status::VERSION

Embedded Perl version $v for $srv process $$,
running since $start

EOF } sub symdump { my ($r, $package) = @_; return install_hint("Devel::Symdump") unless has($r, "symdump"); # lc generates a (FATAL) warning if $r->dir_config is undef my $meth = lc($r->dir_config("StatusRdump") || '') eq "on" ? "rnew" : "new"; my $sob = Devel::Symdump->$meth($package); return $sob->Apache2::Status::as_HTML($package, $r); } sub status_symdump { my ($r) = @_; [symdump($r, 'main')]; } sub status_section_config { my ($r) = @_; require Apache2::PerlSections; ["
", Apache2::PerlSections->dump, "
"]; } sub status_inc { my ($r) = @_; my $uri = $r->location; my @retval = ( '', "", (map "", qw(Package Version Modified File)), "\n" ); foreach my $file (sort keys %INC) { local $^W = 0; next if $file =~ m:^/:; next unless $file =~ m:\.pm:; next unless $INC{$file}; #e.g. fake Apache2/TieHandle.pm no strict 'refs'; (my $module = $file) =~ s,/,::,g; $module =~ s,\.pm$,,; next if $module eq 'mod_perl'; my $v = ${"$module\:\:VERSION"} || '0.00'; my $mtime = -e $INC{$file} ? scalar localtime((stat $INC{$file})[9]) : 'N/A'; push @retval, ( "", (map "", qq($module), $v, $mtime, $INC{$file}), "\n" ); } push @retval, "
$_
$_
\n"; push @retval, "

\@INC =
", join "
\n", @INC, ""; \@retval; } sub status_script { my ($r) = @_; my @retval = ( '', "\n", ); foreach my $file (sort keys %INC) { next if $file =~ m:\.(pm|al|ix)$:; push @retval, qq(\n); } push @retval, "
PerlRequireLocation
$file$INC{$file}
"; \@retval; } my $RegistryCache; sub registry_cache { my ($self, $cache) = @_; # XXX: generalize $RegistryCache = $cache if $cache; $RegistryCache || $Apache2::Registry; } sub get_packages_per_handler { my ($root, $stash) = @_; my %handlers = (); my @packages = get_packages($stash); for (@packages) { /^\*${root}::([\w:]+)::(\w+)::$/ && push @{ $handlers{$1} }, $2; } return %handlers; } sub get_packages { my ($stash) = @_; no strict 'refs'; my @packages = (); for (keys %$stash) { return $stash unless $stash->{$_} =~ /::$/; push @packages, get_packages($stash->{$_}); } return @packages; } sub status_rgysubs { my ($r) = @_; local $_; my $uri = $r->location; my $cache = __PACKAGE__->registry_cache; my @retval = "

Compiled registry scripts grouped by their handler

"; push @retval, "

Click on package name to see its symbol table

\n"; my $root = "ModPerl::ROOT"; no strict 'refs'; my %handlers = get_packages_per_handler($root, *{$root . "::"}); for my $handler (sort keys %handlers) { push @retval, "

$handler:

\n

\n"; for (sort @{ $handlers{$handler} }) { my $full = join '::', $root, $handler, $_; push @retval, qq($_\n), "
"; } push @retval, "

\n"; } \@retval; } sub status_env { my ($r) = shift; my @retval = ("

\n"); if ($r->handler eq 'modperl') { # the handler can be executed under the "modperl" handler push @retval, qq{Under the "modperl" handler, the environment is:}; # XXX: I guess we could call $r->subprocess_env; and show how # would it look like under the 'perl-script' environment, but # under the 'modperl' handler %ENV doesn't get reset, # therefore on the first reload it'll see the bloated %ENV in # first place. } else { # the handler can be executed under the "perl-script" handler push @retval, qq{Under the "perl-script" handler, the environment is:}; } push @retval, "\n

\n"; push @retval, "
",
        (map "$_ = " . escape_html($ENV{$_}||'') . "\n",
            sort keys %ENV), "
"; \@retval; } sub status_sig { ["
",
     (map {
         my $val = $SIG{$_} || "";
         if ($val and ref $val eq "CODE") {
             # XXX: 2.0 doesn't have Apache2::Symbol
             if (my $cv = Apache2::Symbol->can('sv_name')) {
                 $val = "\\&".  $cv->($val);
             }
         }
         "$_ = $val\n" }
      sort keys %SIG),
     "
"]; } sub status_myconfig { ["
", myconfig(), "
"]; } sub status_inh_tree { return has(shift, "symdump") ? ["
", Devel::Symdump->inh_tree, "
"] : install_hint("Devel::Symdump"); } sub status_isa_tree { return has(shift, "symdump") ? ["
", Devel::Symdump->isa_tree, "
"] : install_hint("Devel::Symdump"); } sub status_data_dump { my ($r) = @_; return install_hint('Data::Dumper') unless has($r, "dumper"); my ($name, $type) = (split "/", $r->uri)[-2,-1]; no strict 'refs'; my @retval = "

\nData Dump of $name $type\n

\n
\n";
    my $str = Data::Dumper->Dump([*$name{$type}], ['*'.$name]);
    $str = escape_html($str);
    $str =~ s/= \\/= /; #whack backwack
    push @retval, $str, "\n";
    push @retval, peek_link($r, $name, $type);
    push @retval, b_graph_link($r, $name);
    push @retval, "
"; \@retval; } sub cv_file { my $obj = shift; $obj->can('FILEGV') ? $obj->FILEGV->SV->PV : $obj->FILE; } sub status_cv_dump { my ($r) = @_; return [] unless has($r, "b"); no strict 'refs'; my ($name, $type) = (split "/", $r->uri)[-2,-1]; # could be another child, which doesn't have this symbol table? return unless *$name{CODE}; my @retval = "

Subroutine info for $name

\n
\n";
    my $obj    = B::svref_2object(*$name{CODE});
    my $file   = cv_file($obj);
    my $stash  = $obj->GV->STASH->NAME;
    my $script = $r->location;

    push @retval, "File: ",
        (-e $file ? qq($file) : $file), "\n";

    my $cv    = $obj->GV->CV;
    my $proto = $cv->PV if $cv->can('PV');

    push @retval, qq(Package: $stash\n);
    push @retval, "Line: ",      $obj->GV->LINE, "\n";
    push @retval, "Prototype: ", $proto || "none", "\n";
    push @retval, "XSUB: ",      $obj->XSUB ? "yes" : "no", "\n";
    push @retval, peek_link($r, $name, $type);
    push @retval, b_graph_link($r, $name);
    push @retval, xref_link($r, $name);
    push @retval, b_lexinfo_link($r, $name);
    push @retval, b_terse_link($r, $name);
    push @retval, b_terse_size_link($r, $name);
    push @retval, b_deparse_link($r, $name);
    push @retval, b_fathom_link($r, $name);
    push @retval, "
"; \@retval; } sub b_lexinfo_link { my ($r, $name) = @_; return unless has($r, "lexinfo"); my $script = $r->location; return qq(\nLexical Info\n); } sub noh_b_lexinfo { my $r = shift; $r->content_type("text/plain"); return unless has($r, "lexinfo"); no strict 'refs'; my ($name) = (split "/", $r->uri)[-1]; $r->print("Lexical Info for $name\n\n"); my $lexi = B::LexInfo->new; my $info = $lexi->cvlexinfo($name); $r->print(${ $lexi->dumper($info) }); } my %b_terse_exp = ('slow' => 'syntax', 'exec' => 'execution', basic => 'syntax'); sub b_terse_link { my ($r, $name) = @_; return unless has($r, "terse"); my $script = $r->location; my @retval; for (qw(exec basic)) { my $exp = "$b_terse_exp{$_} order"; push @retval, qq(\nSyntax Tree Dump ($exp)\n); } join '', @retval; } sub noh_b_terse { my $r = shift; $r->content_type("text/plain"); return unless has($r, "terse"); no strict 'refs'; my ($arg, $name) = (split "/", $r->uri)[-2,-1]; $r->print("Syntax Tree Dump ($b_terse_exp{$arg}) for $name\n\n"); # XXX: blead perl dumps things to STDERR, though the same version # works fine with 1.27 # B::Concise couldn't parse XS code before perl patch 24681 (perl 5.9.3) # B::Terse is deprecated and just a wrapper around B::Concise now adays eval { B::Concise::compile("-terse", "-$arg", $name)->() }; if ($@) { $r->print("B::Concise has failed: $@"); } } sub b_terse_size_link { my ($r, $name) = @_; return unless has($r, "tersesize"); my $script = $r->location; my @retval; for (qw(exec slow)) { my $exp = "$b_terse_exp{$_} order"; push @retval, qq(\nSyntax Tree Size ($exp)\n); } join '', @retval; } sub noh_b_terse_size { my $r = shift; $r->content_type("text/html"); return unless has($r, "tersesize"); $r->print('
');
    my ($arg, $name) = (split "/", $r->uri)[-2,-1];
    my $uri = $r->location;
    my $link = qq{$name};
    $r->print("Syntax Tree Size ($b_terse_exp{$arg} order) for $link\n\n");
    B::TerseSize::compile($arg, $name)->();
}

sub b_package_size_link {
    my ($r, $name) = @_;

    return unless has($r, "packagesize");

    my $script = $r->location;
    qq(Memory Usage\n);
}

sub noh_b_package_size {
    my ($r) = @_;

    $r->content_type("text/html");
    return unless has($r, "packagesize");

    $r->print('
');

    no strict 'refs';
    my ($package) = (split "/", $r->uri)[-1];
    my $script = $r->location;
    $r->print("Memory Usage for package $package\n\n");
    my ($subs, $opcount, $opsize) = B::TerseSize::package_size($package);
    my $Kb = sprintf "%.2f", $opsize / 1024;
    my $Mb = sprintf "%.2f", $Kb / 1000;
    $r->print("Totals: $opsize bytes, $Kb Kb, $Mb Mb | $opcount OPs\n\n");

    my $nlen = 0;
    my @keys = map {
        $nlen = length > $nlen ? length : $nlen;
        $_;
    } (sort { $subs->{$b}->{size} <=> $subs->{$a}->{size} } keys %$subs);

    my $clen = $subs->{$keys[0]}->{count} ?
        length $subs->{$keys[0]}->{count} : 0;
    my $slen = length $subs->{$keys[0]}->{size};

    for my $name (@keys) {
        my $stats = $subs->{$name};
        if ($name =~ /^my /) {
            $r->printf("%-${nlen}s %${slen}d bytes\n", $name, $stats->{size});
        }
        elsif ($name =~ /^\*(\w+)\{(\w+)\}/) {
            my $link = qq();
            $r->printf("$link%-${nlen}s %${slen}d bytes\n",
                       $name, $stats->{size});
        }
        else {
            my $link =
                qq();
            $r->printf("$link%-${nlen}s %${slen}d bytes | %${clen}d OPs\n",
                       $name, $stats->{size}, $stats->{count});
        }
    }
}

sub b_deparse_link {
    my ($r, $name) = @_;

    return unless has($r, "deparse");

    my $script = $r->location;
    return qq(\nDeparse\n);
}

sub noh_b_deparse {
    my $r = shift;

    $r->content_type("text/plain");
    return unless has($r, "deparse");

    my $name = (split "/", $r->uri)[-1];
    $r->print("Deparse of $name\n\n");
    my $deparse = B::Deparse->new(split /\s+/,
                                  $r->dir_config('StatusDeparseOptions')||"");
    my $body = $deparse->coderef2text(\&{$name});
    $r->print("sub $name $body");
}

sub b_fathom_link {
    my ($r, $name) = @_;

    return unless has($r, "fathom");

    my $script = $r->location;
    return qq(\nFathom Score\n);
}

sub noh_b_fathom {
    my $r = shift;

    $r->content_type("text/plain");
    return unless has($r, "fathom");

    my $name = (split "/", $r->uri)[-1];
    $r->print("Fathom Score of $name\n\n");
    my $fathom = B::Fathom->new(split /\s+/,
                                $r->dir_config('StatusFathomOptions')||"");
    $r->print($fathom->fathom(\&{$name}));
}

sub peek_link {
    my ($r, $name, $type) = @_;

    return unless has($r, "peek");

    my $script = $r->location;
    return qq(\nPeek Dump\n);
}

sub noh_peek {
    my $r = shift;

    $r->content_type("text/plain");
    return unless has($r, "peek");

    no strict 'refs';
    my ($name, $type) = (split "/", $r->uri)[-2,-1];
    $type =~ s/^FUNCTION$/CODE/;
    $r->print("Peek Dump of $name $type\n\n");
    Apache::Peek::Dump(*{$name}{$type});
}

sub xref_link {
    my ($r, $name) = @_;

    return unless has($r, "xref");

    my $script = $r->location;
    return qq(\nCross Reference Report\n);
}

sub noh_xref {
    my $r = shift;

    $r->content_type("text/plain");
    return unless has($r, "xref");

    (my $thing = $r->path_info) =~ s:^/::;
    $r->print("Xref of $thing\n");
    B::Xref::compile($thing)->();
}

$Apache2::Status::BGraphCache ||= 0;
if ($Apache2::Status::BGraphCache) {
    Apache2->server->push_handlers(PerlChildExitHandler => sub {
        unlink keys %Apache2::Status::BGraphCache;
    });
}

sub b_graph_link {
    my ($r, $name) = @_;

    return unless has($r, "graph");

    my $script = $r->location;
    return qq(\nOP Tree Graph\n);
}

sub noh_b_graph {
    my $r = shift;

    return unless has($r, "graph");

    untie *STDOUT;

    my $dir = File::Spec->catfile(Apache2::ServerUtil::server_root(),
        ($r->dir_config("GraphDir") || "logs/b_graphs"));

    mkdir $dir, 0755 unless -d $dir;

    (my $thing = $r->path_info) =~ s:^/::;
    $thing =~ s{::}{-}g; # :: is not allowed in the filename on some OS
    my $type = "dot";
    my $file = "$dir/$thing.$$.gif";

    unless (-e $file) {
        my $rv = tie *STDOUT, "B::Graph", $r, $file;
        unless ($rv) {
            $r->content_type("text/plain");
            $r->print("dot not found\n");
        }
        else {
            B::Graph::compile("-$type", $thing)->();
            (tied *STDOUT)->{graph}->close;
        }
    }

    if (-s $file) {
        $r->content_type("image/gif");
        $r->sendfile($file);
    }
    else {
        $r->content_type("text/plain");
        $r->print("Graph of $thing failed!\n");
    }
    if ($Apache2::Status::BGraphCache) {
        $Apache2::Status::BGraphCache{$file}++;
    }
    else {
        unlink $file;
    }

    0;
}

sub B::Graph::TIEHANDLE {
    my ($class, $r, $file) = @_;

    if ($file =~ /^([^<>|;]+)$/) {
        $file = $1;
    }
    else {
        die "TAINTED data in THING=> ($file)";
    }

    $ENV{PATH} = join ":", qw{/usr/bin /usr/local/bin};
    my $dot = $r->dir_config("Dot") || "dot";

    require IO::File;
    my $pipe = IO::File->new("|$dot -Tgif -o $file");
    $pipe && $pipe->autoflush(1);

    if ($pipe) {
        return bless {
            graph => $pipe,
            r     => $r,
        }, $class;
    }
    else {
        return;
    }
}

sub B::Graph::PRINT {
    my $self = shift;

    $self->{graph}->print(@_);
}

my %can_dump = map {$_,1} qw(scalars arrays hashes);

sub as_HTML {
    my ($self, $package, $r) = @_;

    my @m = qw();
    my $uri = $r->location;
    my $is_main = $package eq "main";

    my $do_dump = has($r, "dumper");

    my @methods = sort keys %{$self->{'AUTOLOAD'}};

    if ($is_main) {
        @methods = grep { $_ ne "packages" } @methods;
        unshift @methods, "packages";
    }

    for my $type (@methods) {
        (my $dtype = uc $type) =~ s/E?S$//;
        push @m, "";
        my @line = ();

        for (sort $self->_partdump(uc $type)) {
            s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64)/eg;

            if ($type eq "scalars") {
                no strict 'refs';
                next unless defined eval { $$_ };
            }

            if ($type eq "packages") {
                push @line, qq($_);
            }
            elsif ($type eq "functions") {
                if (has($r, "b")) {
                    push @line, qq($_);
                }
                else {
                    push @line, $_;
                }
            }
            elsif ($do_dump and $can_dump{$type}) {
                next if /_$_);
            }
            else {
                push @line, $_;
            }
        }
        push @m, "\n";
    }
    push @m, "
$type" . join(", ", @line) . "
"; return join "\n", @m, "
", b_package_size_link($r, $package); } sub escape_html { my $str = shift; $str =~ s/&/&/g; $str =~ s//>/g; return $str; } sub myconfig { require Config; # Config::myconfig(); fails under threads with (5.8.0 < perl < 5.8.3) # "Modification of a read-only value attempted" # provide a workaround if ($Config::Config{useithreads} and $] > 5.008 and $] < 5.008003) { return $Config::summary_expanded if $Config::summary_expanded; ($Config::summary_expanded = $Config::summary) =~ s{\$(\w+)} { my $c = $Config::Config{$1}; defined($c) ? $c : 'undef' }ge; return $Config::summary_expanded; } else { return Config::myconfig(); } } # mp2 modules have to deal with situations where a binary incompatible # mp1 version of the same module is installed in the same # tree. therefore when checking for a certain version, one wants to # check the version of the module 'require()' will find without # loading that module. this function partially adopted from # ExtUtils::MM_Unix does just that. it returns the version number of # the first module that it finds, forcing numerical context, making # the return value suitable for immediate numerical comparison # operation. (i.e. 2.03-dev will be returned as 2.03, 0 will be # returned when the parsing has failed or a module wasn't found). sub parse_version { my $name = shift; die "no module name passed" unless $name; my $file = File::Spec->catfile(split /::/, $name) . '.pm'; for my $dir (@INC) { next if ref $dir; # skip code refs my $pmfile = File::Spec->catfile($dir, $file); next unless -r $pmfile; open my $fh, $pmfile or die "can't open $pmfile: $!"; my $inpod = 0; my $version; while (<$fh>) { $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; next if $inpod || /^\s*#/; chomp; next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/; { local($1, $2); ($_ = $_) = /(.*)/; } # untaint my $eval = qq{ package Apache2::Status::_version; no strict; local $1$2; \$$2=undef; do { $_ }; \$$2 }; no warnings; $version = eval $eval; warn "Could not eval '$eval' in $pmfile: $@" if $@; last; } close $fh; # avoid situations like "2.03-dev" and return a numerical # version if (defined $version) { no warnings; $version += 0; # force number return $version; } } return 0; # didn't find the file or the version number } 1; __END__ mod_perl-2.0.9/lib/Apache2/XSLoader.pm0000644000104000010010000000242212540623201020007 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::XSLoader; use strict; use warnings FATAL => 'all'; use XSLoader (); BEGIN { unless (defined &BOOTSTRAP) { *BOOTSTRAP = sub () { 0 }; } } sub load { return unless BOOTSTRAP; # do not change the next line and do not insert anything below it in this # function. XSLoader::load depends on it. goto &XSLoader::load; } 1; mod_perl-2.0.9/lib/APR/0000755000104000010010000000000012540623201015147 5ustar AdministratorsNonemod_perl-2.0.9/lib/APR/XSLoader.pm0000644000104000010010000000242612540623201017172 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package APR::XSLoader; use strict; use warnings FATAL => 'all'; use XSLoader (); BEGIN { unless (defined &BOOTSTRAP) { *BOOTSTRAP = sub () { 0 }; } } sub load { return unless BOOTSTRAP; # do not change the next line and do not insert anything below it in this # function. XSLoader::load depends on it. goto &XSLoader::load; } 1; __END__ mod_perl-2.0.9/lib/Bundle/0000755000104000010010000000000012540623201015736 5ustar AdministratorsNonemod_perl-2.0.9/lib/Bundle/Apache2.pm0000644000104000010010000000351412540623201017542 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Bundle::Apache2; $VERSION = '1.00'; 1; __END__ =head1 NAME Bundle::Apache2 - Install Apache mod_perl2 and related modules =head1 SYNOPSIS C =head1 CONTENTS Bundle::ApacheTest - Needs for testing CGI 3.11 - Used in testing (it's in core, but some vendors exclude it) Chatbot::Eliza - Used in testing Compress::Zlib - Used in testing Devel::Symdump - Symbol table browsing with Apache::Status HTML::HeadParser - Used in testing IPC::Run3 - Used in testing LWP - Used in testing =head1 DESCRIPTION This bundle contains modules used by Apache mod_perl2. Asking CPAN.pm to install a bundle means to install the bundle itself along with all the modules contained in the CONTENTS section above. Modules that are up to date are not installed, of course. =head1 AUTHOR mod_perl 2 development team mod_perl-2.0.9/lib/ModPerl/0000755000104000010010000000000012540623201016067 5ustar AdministratorsNonemod_perl-2.0.9/lib/ModPerl/BuildMM.pm0000644000104000010010000002722712540623201017730 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::BuildMM; use strict; use warnings; use ExtUtils::MakeMaker (); use Cwd (); use File::Spec::Functions qw(catdir catfile splitdir); use File::Basename; use File::Find; use Apache2::Build (); use ModPerl::MM; use constant WIN32 => Apache2::Build::WIN32; use constant CYGWIN => Apache2::Build::CYGWIN; our %PM; #add files to installation # MM methods that this package overrides no strict 'refs'; my $stash = \%{__PACKAGE__ . '::MY::'}; my @methods = grep *{$stash->{$_}}{CODE}, keys %$stash; ModPerl::MM::override_eu_mm_mv_all_methods(@methods); use strict 'refs'; my $apache_test_dir = catdir Cwd::getcwd(), "Apache-Test", "lib"; #to override MakeMaker MOD_INSTALL macro sub mod_install { q{$(PERL) -I$(INST_LIB) -I$(PERL_LIB) \\}."\n" . qq{-I$apache_test_dir -MModPerl::BuildMM \\}."\n" . q{-e "ExtUtils::Install::install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"}."\n"; } my $build; sub build_config { my $key = shift; $build ||= Apache2::Build->build_config; return $build unless $key; $build->{$key}; } #the parent WriteMakefile moves MY:: methods into a different class #so alias them each time WriteMakefile is called in a subdir sub my_import { no strict 'refs'; my $stash = \%{__PACKAGE__ . '::MY::'}; for my $sym (keys %$stash) { next unless *{$stash->{$sym}}{CODE}; my $name = "MY::$sym"; undef &$name if defined &$name; *$name = *{$stash->{$sym}}{CODE}; } } sub WriteMakefile { my %args = @_; $build ||= build_config(); ModPerl::MM::my_import(__PACKAGE__); my $inc = $args{INC} || ''; $inc = $args{INC} if $args{INC}; $inc .= " " . $build->inc; if (my $glue_inc = $build->{MP_XS_GLUE_DIR}) { for (split /\s+/, $glue_inc) { $inc .= " -I$_"; } } my $libs; my @libs = (); push @libs, $args{LIBS} if $args{LIBS}; if (Apache2::Build::BUILD_APREXT) { # in order to decouple APR/APR::* from mod_perl.so, # link these modules against the static MP_APR_LIB lib, # rather than the mod_perl lib (which would demand mod_perl.so # be available). For other modules, use mod_perl.lib as # usual. This is done for APR in xs/APR/APR/Makefile.PL. my $name = $args{NAME}; if ($name =~ /^APR::\w+$/) { # For cygwin compatibility, the order of the libs should be # @libs = ($build->mp_apr_lib, $build->apache_libs); } else { @libs = ($build->modperl_libs, $build->apache_libs); } } else { @libs = ($build->modperl_libs, $build->apache_libs); } $libs = join ' ', @libs; my $ccflags; $ccflags = $args{CCFLAGS} if $args{CCFLAGS}; $ccflags = " " . $build->perl_ccopts . $build->ap_ccopts; my $optimize; $optimize = $args{OPTIMIZE} if $args{OPTIMIZE}; $optimize = " " . $build->perl_config('optimize'); my $lddlflags; $lddlflags = $args{LDDLFLAGS} if $args{LDDLFLAGS}; $lddlflags = " " . $build->perl_config('lddlflags'); my %dynamic_lib; %dynamic_lib = %{ $args{dynamic_lib}||{} } if $args{dynamic_lib}; $dynamic_lib{OTHERLDFLAGS} = $build->otherldflags; my @opts = ( INC => $inc, CCFLAGS => $ccflags, OPTIMIZE => $optimize, LDDLFLAGS => $lddlflags, LIBS => $libs, dynamic_lib => \%dynamic_lib, ); my @typemaps; push @typemaps, $args{TYPEMAPS} if $args{TYPEMAPS}; my $pwd = Cwd::fastcwd(); for ('xs', $pwd, "$pwd/..") { my $typemap = $build->file_path("$_/typemap"); if (-e $typemap) { push @typemaps, $typemap; } } push @opts, TYPEMAPS => \@typemaps if @typemaps; my $clean_files = (exists $args{clean} && exists $args{clean}{FILES}) ? $args{clean}{FILES} : ''; $clean_files .= " glue_pods"; # cleanup the dependency target $args{clean}{FILES} = $clean_files; ExtUtils::MakeMaker::WriteMakefile(@opts, %args); } my %always_dynamic = map { $_, 1 } qw(ModPerl::Const Apache2::Const APR::Const APR APR::PerlIO); sub ModPerl::BuildMM::MY::constants { my $self = shift; $build ||= build_config(); #"discover" xs modules. since there is no list hardwired #any module can be unpacked in the mod_perl-2.xx directory #and built static #this stunt also make it possible to leave .xs files where #they are, unlike 1.xx where *.xs live in src/modules/perl #and are copied to subdir/ if DYNAMIC=1 if ($build->{MP_STATIC_EXTS}) { #skip .xs -> .so if we are linking static my $name = $self->{NAME}; unless ($always_dynamic{$name}) { if (my ($xs) = keys %{ $self->{XS} }) { $self->{HAS_LINK_CODE} = 0; print "$name will be linked static\n"; #propagate static xs module to src/modules/perl/Makefile $build->{XS}->{$name} = join '/', Cwd::fastcwd(), $xs; $build->save; } } } $self->MM::constants; } sub ModPerl::BuildMM::MY::top_targets { my $self = shift; my $string = $self->MM::top_targets; return $string; } sub ModPerl::BuildMM::MY::postamble { my $self = shift; my $doc_root = catdir Cwd::getcwd(), "docs", "api"; my @targets = (); # reasons for glueing pods to the respective .pm files: # - manpages will get installed over the mp1 manpages and vice # versa. glueing pods avoids creation of manpages, but may be we # could just tell make to skip manpages creation? # if pods are installed directly they need to be also redirected, # some into Apache2/ others (e.g. Apache2) not # add the code to glue the existing pods to the .pm files in blib. # create a dependency on pm_to_blib subdirs linkext targets to # allow 'make -j' require ExtUtils::MakeMaker; my $mm_ver = $ExtUtils::MakeMaker::VERSION; $mm_ver =~ s/_.*//; # handle dev versions like 6.30_01 my $pm_to_blib = ($mm_ver >= 6.22 && $mm_ver <= 6.25) ? "pm_to_blib.ts" : "pm_to_blib"; my @target = ("glue_pods: $pm_to_blib subdirs linkext"); if (-d $doc_root) { my $build = build_config(); # those living in modperl-2.0/lib are already nicely mapped my %pms = %{ $self->{PM} }; my $cwd = Cwd::getcwd(); my $blib_dir = catdir qw(blib lib); # those autogenerated under WrapXS/ # those living under xs/ # those living under ModPerl-Registry/lib/ my @src = ('WrapXS', 'xs', catdir(qw(ModPerl-Registry lib))); for my $base (@src) { chdir $base; my @files = (); find({ no_chdir => 1, wanted => sub { push @files, $_ if /.pm$/ }, }, "."); chdir $cwd; for (@files) { my $pm = catfile $base, $_; my $blib; if ($base =~ /^(xs|WrapXS)/) { my @segm = splitdir $_; splice @segm, -2, 1; # xs/APR/Const/Const.pm splice @segm, -2, 1 if /APR.pm/; # odd case $blib = catfile $blib_dir, @segm; } else { $blib = catfile $blib_dir, $_; } $pms{$pm} = $blib; } } foreach my $pm (sort keys %pms) { my $blib = $pms{$pm}; $pm =~ s|/\./|/|g; # clean the path $blib =~ s|/\./|/|g; # clean the path my @segm = splitdir $blib; for my $i (1..2) { # try APR.pm and APR/Bucket.pm my $pod = catdir(@segm[-$i .. -1]); $pod =~ s/\.pm/\.pod/; my $podpath = catfile $doc_root, $pod; next unless -r $podpath; push @target, '$(FULLPERL) -I$(INST_LIB) ' . "-I$apache_test_dir -MModPerl::BuildMM " . "-e ModPerl::BuildMM::glue_pod $pm $podpath $blib"; # Win32 doesn't normally install man pages # and Cygwin doesn't allow '::' in file names next if WIN32 || CYGWIN; # manify while we're at it my (undef, $man, undef) = $blib =~ m!(blib/lib/)(.*)(\.pm)!; $man =~ s!/!::!g; push @target, '$(NOECHO) $(POD2MAN_EXE) --section=3 ' . "$podpath \$(INST_MAN3DIR)/$man.\$(MAN3EXT)" } } push @target, $self->{NOECHO} . '$(TOUCH) $@'; } else { # we don't have the docs sub-cvs repository extracted, skip # the docs gluing push @target, $self->{NOECHO} . '$(NOOP)'; } push @targets, join "\n\t", @target; # # next target: cleanup the dependency file # @target = ('glue_pods_clean:'); # push @target, '$(RM_F) glue_pods'; # push @targets, join "\n\t", @target; return join "\n\n", @targets, ''; } sub glue_pod { die "expecting 3 arguments: pm, pod, dst" unless @ARGV == 3; my ($pm, $pod, $dst) = @ARGV; # it's possible that the .pm file is not existing # (e.g. ThreadMutex.pm is not created on unless # $apr_config->{HAS_THREADS}) return unless -e $pm && -e $dst; # have we already glued the doc? exit 0 unless -s $pm == -s $dst; # ExtUtils::Install::pm_to_blib removes the 'w' perms, so we can't # just append the doc there my $orig_mode = (stat $dst)[2]; my $rw_mode = 0666; chmod $rw_mode, $dst or die "Can't chmod $rw_mode $dst: $!"; open my $pod_fh, "<$pod" or die "Can't open $pod: $!"; open my $dst_fh, ">>$dst" or die "Can't open $dst: $!"; print $dst_fh "\n"; # must add one line separation print $dst_fh (<$pod_fh>); close $pod_fh; close $dst_fh; # restore the perms chmod $orig_mode, $dst or die "Can't chmod $orig_mode $dst: $!"; } sub ModPerl::BuildMM::MY::post_initialize { my $self = shift; $build ||= build_config(); my $pm = $self->{PM}; while (my ($k, $v) = each %PM) { if (-e $k) { $pm->{$k} = $v; } } # prefix typemap with Apache2/ so when installed in the # perl-lib-tree it won't be picked by non-mod_perl modules if (exists $pm->{'lib/typemap'} ) { $pm->{'lib/typemap'} = '$(INST_ARCHLIB)/auto/Apache2/typemap'; } ''; } my $apr_config; sub ModPerl::BuildMM::MY::libscan { my ($self, $path) = @_; $apr_config ||= $build->get_apr_config(); if ($path =~ m/(Thread|Global)(Mutex|RWLock)/) { return unless $apr_config->{HAS_THREADS}; } return '' if $path =~ /DummyVersions.pm/; return '' if $path =~ m/\.pl$/; return '' if $path =~ m/~$/; return '' if $path =~ /\B\.svn\b/; $path; } 1; mod_perl-2.0.9/lib/ModPerl/BuildOptions.pm0000644000104000010010000002026612540623201021046 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::BuildOptions; use strict; use warnings; use Apache2::Build (); use Apache::TestTrace; use Config (); my $param_qr = qr([\s=]+); use constant VERBOSE => 1; use constant UNKNOWN_FATAL => 2; use File::Spec; sub init { my ($class, $build) = @_; #@ARGV should override what's in .makepl_args.mod_perl2 #but @ARGV might also override the default MP_OPTS_FILE #so snag that first parse($build, [grep { /^MP_OPTIONS_FILE/ } @ARGV]); parse_file($build); parse_argv($build); # if AP_PREFIX is used apxs and apr-config from the apache build # tree won't work, so it can't co-exist with APXS and APR_CONFIG # options if ($build->{MP_AP_PREFIX} and $build->{MP_APXS}) { error "You need to pass either MP_AP_PREFIX or MP_APXS, but not both"; die "\n"; } if ($build->{MP_AP_PREFIX} and $build->{MP_APR_CONFIG}) { error "You need to pass either MP_AP_PREFIX or MP_APR_CONFIG, " . "but not both"; die "\n"; } if ($build->{MP_DEBUG} and $build->{MP_USE_GTOP} and !$build->find_gtop) { error "Can't find libgtop, resetting MP_USE_GTOP=0"; $build->{MP_USE_GTOP} = 0; } unless ($build->{MP_USE_DSO} or $build->{MP_USE_STATIC}) { # default to DSO $build->{MP_USE_DSO} = 1; } $build->{MP_GENERATE_XS} = 1 unless exists $build->{MP_GENERATE_XS}; # define MP_COMPAT_1X unless explicitly told to disable it $build->{MP_COMPAT_1X} = 1 unless exists $build->{MP_COMPAT_1X} && !$build->{MP_COMPAT_1X}; # try to find apxs if (!$build->{MP_AP_PREFIX} && !$build->{MP_APXS}) { $build->find_apxs_util(); # make a last ditch effort to find apxs in $ENV{PATH} if (!$build->{MP_APXS}) { my @paths = split(/$Config::Config{path_sep}/, $ENV{PATH}); my $potential_apxs; while (!$potential_apxs) { last if scalar(@paths) == 0; # don't loop endlessly $potential_apxs = File::Spec->catfile(shift @paths, 'apxs'); $potential_apxs .= '.bat' if Apache2::Build::WIN32(); if (-e $potential_apxs && -x $potential_apxs) { $build->{MP_APXS} = $potential_apxs; } else { undef $potential_apxs; } } } } } sub parse { my ($build, $lines, $opts) = @_; $opts = VERBOSE|UNKNOWN_FATAL unless defined $opts; my $table = table(); my @unknown; my $continue = ""; my @data = (); for (@$lines) { chomp; s/^\s+//; s/\s+$//; next if /^\#/ || /^$/; last if /^__END__/; # more than one entry on the same line (but make sure to leave # -DMP_* alone) push @data, split /(?=\WMP_)/, $_; } for (@data) { #XXX: this "parser" should be more robust s/^\s+//; s/\s+$//; $_ = "$continue $_" if $continue; #example: +"MP_CCOPTS=-Werror" if $] >= 5.007 if (s/^\+//) { $_ = eval $_; } if (/^MP_/) { my ($key, $val) = split $param_qr, $_, 2; $val ||= "" unless defined $val && $val eq '0'; $continue = $val =~ s/\\$// ? $key : ""; if (!$table->{$key} and $opts & UNKNOWN_FATAL) { my $usage = usage(); die "Unknown Option: $key\nUsage:\n$usage\n"; } if ($key eq 'MP_APXS') { $val = File::Spec->canonpath(File::Spec->rel2abs($val)); } if ($key eq 'MP_AP_PREFIX') { $val = File::Spec->canonpath(File::Spec->rel2abs($val)); if (Apache2::Build::WIN32()) { # MP_AP_PREFIX may not contain spaces require Win32; $val = Win32::GetShortPathName($val); } if (!$val || !-d $val) { error "MP_AP_PREFIX must point to a valid directory."; die "\n"; } } if ($table->{$key}->{append}){ $build->{$key} = join " ", grep $_, $build->{$key}, $val; } else { $build->{$key} = $val; } print " $key = $val\n" if $opts & VERBOSE; } else { push @unknown, $_; } } return \@unknown; } sub parse_file { my $build = shift; my $fh; my @dirs = qw(./ ../ ./. ../.); push @dirs, "$ENV{HOME}/." if exists $ENV{HOME}; my @files = map { $_ . 'makepl_args.mod_perl2' } @dirs; unshift @files, $build->{MP_OPTIONS_FILE} if $build->{MP_OPTIONS_FILE}; for my $file (@files) { if (open $fh, $file) { $build->{MP_OPTIONS_FILE} = $file; last; } $fh = undef; } return unless $fh; print "Reading Makefile.PL args from $build->{MP_OPTIONS_FILE}\n"; my $unknowns = parse($build, [<$fh>]); push @ARGV, @$unknowns if $unknowns; close $fh; } sub parse_argv { my $build = shift; return unless @ARGV; my @args = @ARGV; @ARGV = (); print "Reading Makefile.PL args from \@ARGV\n"; my $unknowns = parse($build, \@args); push @ARGV, @$unknowns if $unknowns; } sub usage { my $table = table(); my @opts = map { "$_ - $table->{$_}->{val}" } sort keys %$table; join "\n", @opts; } sub parse_table { my ($fh) = @_; my %table; local $_; while (<$fh>) { chomp; s/^\s+//; s/\s+$//; next if /^\#/ || /^$/; last if /^__END__/; my ($key, $append, $val) = split /\s+/, $_, 3; $table{'MP_' . $key} = { append => $append, val => $val }; } return \%table; } my $Table; sub table { $Table ||= parse_table(\*DATA); } 1; # __DATA__ format: # key append description # where: # key: is the option name # append: is whether we want to replace a default option (0) # or append the arg to the option (1) # desc: description for this option __DATA__ USE_GTOP 0 Link with libgtop and enable libgtop reporting DEBUG 0 Turning on debugging (-g -lperld) and tracing MAINTAINER 0 Maintainer mode: DEBUG=1 -DAP_DEBUG -Wall ... CCOPTS 1 Add to compiler flags TRACE 0 Turn on tracing USE_DSO 0 Build mod_perl as a dso USE_STATIC 0 Build mod_perl static PROMPT_DEFAULT 0 Accept default value for all would-be prompts OPTIONS_FILE 0 Read options from given file STATIC_EXTS 0 Build Apache2::*.xs as static extensions APXS 0 Path to apxs AP_DESTDIR 0 Destination for Apache specific mod_perl bits AP_PREFIX 0 Apache installation or source tree prefix AP_CONFIGURE 0 Apache ./configure arguments APR_CONFIG 0 Path to apr-config APU_CONFIG 0 Path to apu-config XS_GLUE_DIR 1 Directories containing extension glue INCLUDE_DIR 1 Add directories to search for header files GENERATE_XS 0 Generate XS code based on httpd version LIBNAME 0 Name of the modperl dso library (default is mod_perl) COMPAT_1X 0 Compile-time mod_perl 1.0 backcompat (default is on) APR_LIB 0 Lib used to build APR::* on Win32 (default is aprext) NO_THREADS 0 Build mod_perl without thread support with httpd >= 2.4 mod_perl-2.0.9/lib/ModPerl/Code.pm0000644000104000010010000007737212540623201017317 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::Code; use strict; use warnings FATAL => 'all'; use Config; use File::Spec::Functions qw(catfile catdir); use mod_perl2 (); use Apache2::Build (); use Apache::TestConfig (); use Apache::TestTrace; our $VERSION = '0.01'; our @ISA = qw(Apache2::Build); my %handlers = ( Process => [qw(ChildInit ChildExit)], #Restart PreConfig Files => [qw(OpenLogs PostConfig)], PerSrv => [qw(PostReadRequest Trans MapToStorage)], PerDir => [qw(HeaderParser Access Authen Authz Type Fixup Response Log Cleanup InputFilter OutputFilter)], Connection => [qw(ProcessConnection)], PreConnection => [qw(PreConnection)], ); my %hooks = map { $_, canon_lc($_) } map { @{ $handlers{$_} } } keys %handlers; my %not_ap_hook = map { $_, 1 } qw(child_exit response cleanup output_filter input_filter); my %not_request_hook = map { $_, 1 } qw(child_init process_connection pre_connection open_logs post_config); my %hook_proto = ( Process => { ret => 'void', args => [{type => 'apr_pool_t', name => 'p'}, {type => 'server_rec', name => 's'}, {type => 'dummy', name => 'MP_HOOK_VOID'}], }, Files => { ret => 'int', args => [{type => 'apr_pool_t', name => 'pconf'}, {type => 'apr_pool_t', name => 'plog'}, {type => 'apr_pool_t', name => 'ptemp'}, {type => 'server_rec', name => 's'}, {type => 'dummy', name => 'MP_HOOK_RUN_ALL'}], }, PerSrv => { ret => 'int', args => [{type => 'request_rec', name => 'r'}, {type => 'dummy', name => 'MP_HOOK_RUN_ALL'}], }, Connection => { ret => 'int', args => [{type => 'conn_rec', name => 'c'}, {type => 'dummy', name => 'MP_HOOK_RUN_FIRST'}], }, PreConnection => { ret => 'int', args => [{type => 'conn_rec', name => 'c'}, {type => 'void', name => 'csd'}, {type => 'dummy', name => 'MP_HOOK_RUN_ALL'}], }, ); my %cmd_push = ( InputFilter => 'modperl_cmd_push_filter_handlers', OutputFilter => 'modperl_cmd_push_filter_handlers', ); my $cmd_push_default = 'modperl_cmd_push_handlers'; sub cmd_push { $cmd_push{+shift} || $cmd_push_default; } $hook_proto{PerDir} = $hook_proto{PerSrv}; my $scfg_get = 'MP_dSCFG(parms->server)'; my $dcfg_get = "$scfg_get;\n" . ' modperl_config_dir_t *dcfg = (modperl_config_dir_t *)dummy'; my %directive_proto = ( PerSrv => { args => [{type => 'cmd_parms', name => 'parms'}, {type => 'void', name => 'dummy'}, {type => 'const char', name => 'arg'}], cfg => {get => $scfg_get, name => 'scfg'}, scope => 'RSRC_CONF', }, PerDir => { args => [{type => 'cmd_parms', name => 'parms'}, {type => 'void', name => 'dummy'}, {type => 'const char', name => 'arg'}], cfg => {get => $dcfg_get, name => 'dcfg'}, scope => 'OR_ALL', }, ); for my $class (qw(Process Connection PreConnection Files)) { $directive_proto{$class}->{cfg}->{name} = 'scfg'; $directive_proto{$class}->{cfg}->{get} = $scfg_get; for (qw(args scope)) { $directive_proto{$class}->{$_} = $directive_proto{PerSrv}->{$_}; } } while (my ($k,$v) = each %directive_proto) { $directive_proto{$k}->{ret} = 'const char *'; my $handlers = join '_', 'handlers', canon_lc($k); $directive_proto{$k}->{handlers} = join '->', $directive_proto{$k}->{cfg}->{name}, $handlers; } #XXX: allow disabling of PerDir hooks on a PerDir basis my @hook_flags = sort(map { canon_uc($_) } keys %hooks); my @ithread_opts = qw(CLONE PARENT); my %flags = ( Srv => ['NONE', @ithread_opts, qw(ENABLE AUTOLOAD MERGE_HANDLERS), @hook_flags, 'UNSET','INHERIT_SWITCHES'], Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)], Req => [qw(NONE SET_GLOBAL_REQUEST PARSE_HEADERS SETUP_ENV CLEANUP_REGISTERED PERL_SET_ENV_DIR PERL_SET_ENV_SRV)], Interp => [qw(NONE IN_USE CLONED BASE)], Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD DYNAMIC FAKE)], ); $flags{DirSeen} = $flags{Dir}; my %flags_options = map { $_,1 } qw(Srv Dir); my %flags_field = ( DirSeen => 'flags->opts_seen', (map { $_, 'flags->opts' } keys %flags_options), ); sub new { my $class = shift; bless { handlers => \%handlers, hook_proto => \%hook_proto, directive_proto => \%directive_proto, flags => \%flags, path => 'src/modules/perl', }, $class; } sub path { shift->{path} } sub handler_desc { my ($self, $h_add, $c_add) = @_; local $" = ",\n"; foreach my $class (sort keys %{ $self->{handler_index_desc} }) { my $h = $self->{handler_index_desc}->{$class}; my $func = canon_func('handler', 'desc', $class); my $array = join '_', 'MP', $func; my $proto = "const char *$func(int idx)"; $$h_add .= "$proto;\n"; $$c_add .= <{handlers} }) { my $handlers = $self->{handlers}->{$class}; my $i = 0; my $n = @$handlers; my $handler_type = canon_define('HANDLER_TYPE', $class); print $h_fh "\n#define ", canon_define('HANDLER_NUM', $class), " $n\n\n"; print $h_fh "#define $handler_type $type\n\n"; $type++; for my $name (@$handlers) { my $define = canon_define($name, 'handler'); $self->{handler_index}->{$class}->[$i] = $define; $self->{handler_index_type}->{$class}->[$i] = $handler_type; $self->{handler_index_desc}->{$class}->[$i] = "Perl${name}Handler"; print $h_fh "#define $define $i\n"; $i++; } } } sub generate_handler_hooks { my ($self, $h_fh, $c_fh) = @_; my @register_hooks; foreach my $class (sort keys %{ $self->{hook_proto} }) { my $prototype = $self->{hook_proto}->{$class}; my $callback = canon_func('callback', $class); my $return = $prototype->{ret} eq 'void' ? '' : 'return'; my $i = -1; for my $handler (@{ $self->{handlers}{$class} }) { my $name = canon_func($handler, 'handler'); $i++; if (my $hook = $hooks{$handler}) { next if $not_ap_hook{$hook}; my $order = $not_request_hook{$hook} ? 'APR_HOOK_FIRST' : 'APR_HOOK_REALLY_FIRST'; push @register_hooks, " ap_hook_$hook($name, NULL, NULL, $order);"; } my ($protostr, $pass) = canon_proto($prototype, $name); my $ix = $self->{handler_index}->{$class}->[$i]; if ($callback =~ m/modperl_callback_per_(dir|srv)/) { if ($ix =~ m/AUTH|TYPE|TRANS|MAP/) { $pass =~ s/MP_HOOK_RUN_ALL/MP_HOOK_RUN_FIRST/; } } print $h_fh "\n$protostr;\n"; print $c_fh <handler_desc(\$h_add, \$c_add); return ($h_add, $c_add); } sub generate_handler_find { my ($self, $h_fh, $c_fh) = @_; my $proto = 'int modperl_handler_lookup(const char *name, int *type)'; my (%ix, %switch); print $h_fh "$proto;\n"; print $c_fh <{handlers} }) { my $handlers = $self->{handlers}->{$class}; my $i = 0; for my $name (@$handlers) { $name =~ /^([A-Z])/; push @{ $switch{$1} }, $name; $ix{$name}->{name} = $self->{handler_index}->{$class}->[$i]; $ix{$name}->{type} = $self->{handler_index_type}->{$class}->[$i++]; } } for my $key (sort keys %switch) { my $names = $switch{$key}; print $c_fh " case '$key':\n"; #support $r->push_handlers(PerlHandler => ...) if ($key eq 'H') { print $c_fh <{type}; return $ix{'Response'}->{name}; } EOF } for my $name (@$names) { my $n = length($name); print $c_fh <{type}; return $ix{$name}->{name}; } EOF } } print $c_fh " };\n return -1;\n}\n"; return ("", ""); } sub generate_handler_directives { my ($self, $h_fh, $c_fh) = @_; my @cmd_entries; foreach my $class (sort keys %{ $self->{handlers} }) { my $handlers = $self->{handlers}->{$class}; my $prototype = $self->{directive_proto}->{$class}; my $i = 0; for my $h (@$handlers) { my $h_name = join $h, qw(Perl Handler); my $name = canon_func('cmd', $h, 'handlers'); my $cmd_name = canon_define('cmd', $h, 'entry'); my $protostr = canon_proto($prototype, $name); my $flag = 'MpSrv' . canon_uc($h); my $ix = $self->{handler_index}->{$class}->[$i++]; my $av = "$prototype->{handlers} [$ix]"; my $cmd_push = cmd_push($h); print $h_fh "$protostr;\n"; push @cmd_entries, $cmd_name; print $h_fh <{scope}, "Subroutine name") EOF print $c_fh <{cfg}->{get}; if (!MpSrvENABLE(scfg)) { return apr_pstrcat(parms->pool, "Perl is disabled for server ", parms->server->server_hostname, NULL); } if (!$flag(scfg)) { return apr_pstrcat(parms->pool, "$h_name is disabled for server ", parms->server->server_hostname, NULL); } MP_TRACE_d(MP_FUNC, "push \@%s, %s", parms->cmd->name, arg); return $cmd_push(&($av), arg, parms->pool); } EOF } } my $h_add = '#define MP_CMD_ENTRIES \\' . "\n" . join ', \\'."\n", @cmd_entries; return ($h_add, ""); } sub generate_flags { my ($self, $h_fh, $c_fh) = @_; my $n = 1; (my $dlsrc = uc $Config{dlsrc}) =~ s/\.xs$//i; print $h_fh "\n#define MP_SYS_$dlsrc 1\n"; foreach my $class (sort keys %{ $self->{flags} }) { my $opts = $self->{flags}->{$class}; my @lookup = (); my %lookup = (); my $lookup_proto = ""; my %dumper; if ($flags_options{$class}) { $lookup_proto = join canon_func('flags', 'lookup', $class), 'U32 ', '(const char *str)'; push @lookup, "$lookup_proto {"; } my $flags = join $class, qw(Mp FLAGS); my $field = $flags_field{$class} || 'flags'; print $h_fh "\n#define $flags(p) (p)->$field\n"; $class = "Mp$class"; print $h_fh "\n#define ${class}Type $n\n"; $n++; my $i = 0; my $max_len = 0; for my $f (@$opts) { my $x = sprintf "0x%08x", $i; my $flag = "${class}_f_$f"; my $cmd = $class . $f; my $name = canon_name($f); $lookup{$name} = $flag; $max_len = length $name if $max_len < length $name; print $h_fh < 'Apache API interaction', 'c' => 'configuration for directive handlers', 'd' => 'directive processing', 'e' => 'environment variables', 'f' => 'filters', 'g' => 'globals management', 'h' => 'handlers', 'i' => 'interpreter pool management', 'm' => 'memory allocations', 'o' => 'I/O', 'r' => 'Perl runtime interaction', 's' => 'Perl sections', 't' => 'benchmark-ish timings', ); sub generate_trace { my ($self, $h_fh) = @_; my $v = $self->{build}->{VERSION}; my $api_v = $self->{build}->{API_VERSION}; print $h_fh qq(#define MP_VERSION_STRING "mod_perl/$v"\n); # this needs to be a string, not an int, because of the # macro definition. patches welcome. print $h_fh qq(#define MP_API_VERSION "$api_v"\n); my $i = 1; my @trace = sort keys %trace; my $opts = join '', @trace; my $tl = "MP_debug_level"; print $h_fh <perl_config('ccflags_uselargefiles'); return unless $flags; for my $flag (split /\s+/, $flags) { next if $flag =~ /^-/; # skip -foo flags my ($name, $val) = split '=', $flag; $val ||= ''; $name =~ s/^-D//; print $h_fh "#define $name $val\n"; } } sub ins_underscore { $_[0] =~ s/([a-z])([A-Z])/$1_$2/g; $_[0] =~ s/::/_/g; } sub canon_uc { my $s = shift; ins_underscore($s); uc $s; } sub canon_lc { my $s = shift; ins_underscore($s); lc $s; } sub canon_func { join '_', 'modperl', map { canon_lc($_) } @_; } sub canon_name { local $_ = shift; s/([A-Z]+)/ucfirst(lc($1))/ge; s/_//g; $_; } sub canon_define { join '_', 'MP', map { canon_uc($_) } @_; } sub canon_args { my $args = shift->{args}; my @pass = map { $_->{name} } @$args; my @in; foreach my $href (@$args) { push @in, "$href->{type} *$href->{name}" unless $href->{type} eq 'dummy'; } return wantarray ? (\@in, \@pass) : \@in; } sub canon_proto { my ($prototype, $name) = @_; my ($in,$pass) = canon_args($prototype); local $" = ', '; my $p = "$prototype->{ret} $name(@$in)"; $p =~ s/\* /*/; return wantarray ? ($p, "@$pass") : $p; } my %sources = ( generate_handler_index => {h => 'modperl_hooks.h'}, generate_handler_hooks => {h => 'modperl_hooks.h', c => 'modperl_hooks.c'}, generate_handler_directives => {h => 'modperl_directives.h', c => 'modperl_directives.c'}, generate_handler_find => {h => 'modperl_hooks.h', c => 'modperl_hooks.c'}, generate_flags => {h => 'modperl_flags.h', c => 'modperl_flags.c'}, generate_trace => {h => 'modperl_trace.h'}, generate_largefiles => {h => 'modperl_largefiles.h'}, generate_constants => {h => 'modperl_constants.h', c => 'modperl_constants.c'}, generate_exports => {c => 'modperl_exports.c'}, ); my @c_src_names = qw(interp tipool log config cmd options callback handler gtop util io io_apache filter bucket mgv pcw global env cgi perl perl_global perl_pp sys module svptr_table const constants apache_compat error debug common_util common_log); my @h_src_names = qw(perl_unembed); my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit exports); my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names)); sub c_files { [map { "$_.c" } @c_names, @g_c_names] } sub o_files { [map { "$_.o" } @c_names, @g_c_names] } sub o_pic_files { [map { "$_.lo" } @c_names, @g_c_names] } my @g_h_names = map { "modperl_$_" } qw(hooks directives flags trace largefiles); my @h_names = (@c_names, map { "modperl_$_" } @h_src_names, qw(types time apache_includes perl_includes apr_includes apr_compat common_includes common_types)); sub h_files { [map { "$_.h" } @h_names, @g_h_names] } sub clean_files { my @c_names = @g_c_names; my @h_names = @g_h_names; for (\@c_names, \@h_names) { push @$_, 'modperl_constants'; } [(map { "$_.c" } @c_names), (map { "$_.h" } @h_names)]; } sub classname { my $self = shift || __PACKAGE__; ref($self) || $self; } sub noedit_warning_c { my $class = classname(shift); my $v = join '/', $class, $class->VERSION; my $trace = Apache::TestConfig::calls_trace(); $trace =~ s/^/ * /mg; return <{init_files}->{$name}++; my (@preamble); if ($name =~ /\.h$/) { (my $d = uc $name) =~ s/\./_/; push @preamble, "#ifndef $d\n#define $d\n"; push @{ $self->{postamble}->{$name} }, "\n#endif /* $d */\n"; } elsif ($name =~ /\.c/) { push @preamble, qq{\#include "mod_perl.h"\n\n}; } my $file = "$self->{path}/$name"; debug "generating...$file"; unlink $file; open my $fh, '>>', $file or die "open $file: $!"; print $fh @preamble, noedit_warning_c(); $self->{fh}->{$name} = $fh; } sub fh { my ($self, $name) = @_; return unless $name; $self->{fh}->{$name}; } sub postamble { my $self = shift; for my $name (sort keys %{ $self->{fh} }) { next unless my $av = $self->{postamble}->{$name}; print { $self->fh($name) } @$av; } } sub generate { my ($self, $build) = @_; $self->{build} = $build; for my $s (values %sources) { for (qw(h c)) { $self->init_file($s->{$_}); } } for my $method (reverse sort keys %sources) { my ($h_fh, $c_fh) = map { $self->fh($sources{$method}->{$_}); } qw(h c); my ($h_add, $c_add) = $self->$method($h_fh, $c_fh); if ($h_add) { print $h_fh $h_add; } if ($c_add) { print $c_fh $c_add; } debug "$method...done"; } $self->postamble; my $xsinit = "$self->{path}/modperl_xsinit.c"; debug "generating...$xsinit"; # There's a possibility that $Config{static_ext} may contain spaces # and ExtUtils::Embed::xsinit won't handle the situation right. In # this case we'll get buggy "boot_" statements in modperl_xsinit.c. # Fix this by cleaning the @Extensions array. # Loads @Extensions if not loaded ExtUtils::Embed::static_ext(); @ExtUtils::Embed::Extensions = grep{$_} @ExtUtils::Embed::Extensions; #create bootstrap method for static xs modules my $static_xs = [sort keys %{ $build->{XS} }]; ExtUtils::Embed::xsinit($xsinit, 1, $static_xs); #$self->generate_constants_pod(); } my $constant_prefixes = join '|', qw{APR? MODPERL_RC}; sub generate_constants { my ($self, $h_fh, $c_fh) = @_; require Apache2::ConstantsTable; print $c_fh qq{\#include "modperl_const.h"\n}; print $h_fh "#define MP_ENOCONST -3\n\n"; generate_constants_lookup($h_fh, $c_fh); generate_constants_group_lookup($h_fh, $c_fh); } my %shortcuts = ( NOT_FOUND => 'HTTP_NOT_FOUND', FORBIDDEN => 'HTTP_FORBIDDEN', AUTH_REQUIRED => 'HTTP_UNAUTHORIZED', SERVER_ERROR => 'HTTP_INTERNAL_SERVER_ERROR', REDIRECT => 'HTTP_MOVED_TEMPORARILY', ); #backwards compat with older httpd/apr #XXX: remove once we require newer httpd/apr my %ifdef = map { $_, 1 } qw(APLOG_TOCLIENT APR_LIMIT_NOFILE), # added in ??? qw(AP_MPMQ_STARTING AP_MPMQ_RUNNING AP_MPMQ_STOPPING AP_MPMQ_MPM_STATE), # added in 2.0.49 qw(APR_FPROT_USETID APR_FPROT_GSETID APR_FPROT_WSTICKY APR_FOPEN_LARGEFILE), # added in 2.0.50? qw(OPT_INCNOEXEC OPT_INC_WITH_EXEC); # added/removed in 2.4 sub constants_ifdef { my $name = shift; if ($ifdef{$name}) { return ("#ifdef $name\n", "#endif /* $name */\n"); } ("", ""); } sub constants_lookup_code { my ($h_fh, $c_fh, $constants, $class) = @_; my (%switch, %alias); %alias = %shortcuts; my $postfix = canon_lc(lc $class); my $package = $class . '::'; my $package_len = length $package; my ($first_let) = $class =~ /^(\w)/; my $func = canon_func(qw(constants lookup), $postfix); my $proto = "SV \*$func(pTHX_ const char *name)"; print $h_fh "$proto;\n"; print $c_fh <{$class}; my $constants = [sort map { @$_ } values %$groups]; constants_lookup_code($h_fh, $c_fh, $constants, $class); } } sub generate_constants_group_lookup { my ($h_fh, $c_fh) = @_; foreach my $class (sort keys %$Apache2::ConstantsTable) { my $groups = $Apache2::ConstantsTable->{$class}; constants_group_lookup_code($h_fh, $c_fh, $class, $groups); } } sub constants_group_lookup_code { my ($h_fh, $c_fh, $class, $groups) = @_; my @tags; my @code; $class = canon_lc(lc $class); foreach my $group (sort keys %$groups) { my $constants = $groups->{$group}; push @tags, $group; my $name = join '_', 'MP_constants', $class, $group; print $c_fh "\nstatic const char *$name [] = { \n", (map { my @ifdef = constants_ifdef($_); s/^($constant_prefixes)_?//o; qq($ifdef[0] "$_",\n$ifdef[1]) } @$constants), " NULL,\n};\n"; } my %switch; for (@tags) { next unless /^([A-Z])/i; push @{ $switch{$1} }, $_; } my $func = canon_func(qw(constants group lookup), $class); my $proto = "const char **$func(const char *name)"; print $h_fh "$proto;\n"; print $c_fh "\n$proto\n{\n", " switch (*name) {\n"; for my $key (sort keys %switch) { my $val = $switch{$key}; print $c_fh "\tcase '$key':\n"; for my $group (@$val) { my $name = join '_', 'MP_constants', $class, $group; print $c_fh qq|\tif(strEQ("$group", name))\n\t return $name;\n|; } print $c_fh " break;\n"; } print $c_fh <$filepath" or die "Can't open $filepath: $!\n"; print $fh <<"EOF"; =head1 NAME $class\::Const - Perl Interface for $class Constants =head1 SYNOPSIS =head1 CONSTANTS EOF my $groups = $data{$class}; for my $group (sort keys %$groups) { print $fh <<"EOF"; =head2 C<:$group> use $class\::Const -compile qw(:$group); The C<:$group> group is for XXX constants. EOF for my $const (sort @{ $groups->{$group} }) { print $fh "=head3 C<$class\::$const>\n\n\n"; } } print $fh "=cut\n"; } } sub generate_constants_lookup_doc { my ($data) = @_; foreach my $class (sort keys %$Apache2::ConstantsTable) { my $groups = $Apache2::ConstantsTable->{$class}; my $constants = [sort map { @$_ } values %$groups]; constants_lookup_code_doc($constants, $class, $data); } } sub generate_constants_group_lookup_doc { my ($data) = @_; foreach my $class (sort keys %$Apache2::ConstantsTable) { my $groups = $Apache2::ConstantsTable->{$class}; constants_group_lookup_code_doc($class, $groups, $data); } } sub constants_group_lookup_code_doc { my ($class, $groups, $data) = @_; my @tags; my @code; while (my ($group, $constants) = each %$groups) { $data->{$class}{$group} = [ map { my @ifdef = constants_ifdef($_); s/^($constant_prefixes)_?//o; $seen_const{$class}{$_}++; $_; } @$constants ]; } } sub constants_lookup_code_doc { my ($constants, $class, $data) = @_; my (%switch, %alias); %alias = %shortcuts; my $postfix = lc $class; my $package = $class . '::'; my $package_len = length $package; my $func = canon_func(qw(constants lookup), $postfix); for (@$constants) { if (s/^($constant_prefixes)(_)?//o) { $alias{$_} = join $2 || "", $1, $_; } else { $alias{$_} ||= $_; } next unless /^([A-Z])/; push @{ $switch{$1} }, $_; } for my $key (sort keys %switch) { my $names = $switch{$key}; for my $name (@$names) { my @ifdef = constants_ifdef($alias{$name}); push @{ $data->{$class}{other} }, $name unless $seen_const{$class}{$name} } } } sub generate_exports { my ($self, $c_fh) = @_; require ModPerl::WrapXS; ModPerl::WrapXS->generate_exports($c_fh); } # src/modules/perl/*.c files needed to build APR/APR::* outside # of mod_perl.so sub src_apr_ext { return map { "modperl_$_" } (qw(error bucket), map { "common_$_" } qw(util log)); } 1; __END__ =head1 NAME ModPerl::Code - Generate mod_perl glue code =head1 SYNOPSIS use ModPerl::Code (); my $code = ModPerl::Code->new; $code->generate; =head1 DESCRIPTION This module provides functionality for generating mod_perl glue code. Reason this code is generated rather than written by hand include: =over 4 =item consistency =item thin and clean glue code =item enable/disable features (without #ifdefs) =item adapt to changes in Apache =item experiment with different approaches to gluing =back =head1 AUTHOR Doug MacEachern =cut mod_perl-2.0.9/lib/ModPerl/Config.pm0000644000104000010010000000516612540623201017642 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::Config; use strict; use Apache2::Build (); use Apache::TestConfig (); use File::Spec (); use constant WIN32 => Apache2::Build::WIN32; sub as_string { my $build = Apache2::Build->build_config; my $cfg = ''; $cfg .= "*** mod_perl version $mod_perl::VERSION\n\n";; my $file = File::Spec->rel2abs($INC{'Apache2/BuildConfig.pm'}); $cfg .= "*** using $file\n\n"; # the widest key length my $max_len = 0; for (map {length} grep /^MP_/, keys %$build) { $max_len = $_ if $_ > $max_len; } # mod_perl opts $cfg .= "*** Makefile.PL options:\n"; $cfg .= join '', map {sprintf " %-${max_len}s => %s\n", $_, $build->{$_}} grep /^MP_/, sort keys %$build; my $command = ''; # httpd opts my $test_config = Apache::TestConfig->new({thaw=>1}); if (my $httpd = $test_config->{vars}->{httpd}) { $command = "$httpd -V"; $cfg .= "\n\n*** $command\n"; $cfg .= qx{$command}; $cfg .= Apache::TestConfig::ldd_as_string($httpd); } else { $cfg .= "\n\n*** The httpd binary was not found\n"; } # apr $cfg .= "\n\n*** (apr|apu)-config linking info\n\n"; my @apru_link_flags = $build->apru_link_flags; if (@apru_link_flags) { my $libs = join "\n", @apru_link_flags; $cfg .= "$libs\n\n"; } else { $cfg .= "(apr|apu)-config scripts were not found\n\n"; } # perl opts my $perl = $build->{MODPERL_PERLPATH}; $command = "$perl -V"; $cfg .= "\n\n*** $command\n"; $cfg .= qx{$command}; return $cfg; } 1; __END__ =pod =head1 NAME ModPerl::Config - Functions to retrieve mod_perl specific env information. =head1 DESCRIPTION =cut mod_perl-2.0.9/lib/ModPerl/CScan.pm0000644000104000010010000010334112540623201017416 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package ModPerl::CScan; require Exporter; use Config '%Config'; use File::Basename; # NOTE to distributors: this module is needed only for mp2 developers, # it's not a requirement for mod_perl users use Data::Flow qw(0.05); use strict; # Earlier it catches ISA and EXPORT. @ModPerl::CScan::ISA = qw(Exporter Data::Flow); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @ModPerl::CScan::EXPORT = qw( ); @ModPerl::CScan::EXPORT_OK = qw( ); # this flag tells cpp to only output macros $ModPerl::CScan::MACROS_ONLY = '-dM'; $ModPerl::CScan::VERSION = '0.75'; my (%keywords,%style_keywords); for (qw(asm auto break case char continue default do double else enum extern float for fortran goto if int long register return short sizeof static struct switch typedef union unsigned signed while void volatile)) { $keywords{$_}++; } for (qw(bool class const delete friend inline new operator overload private protected public virtual)) { $style_keywords{'C++'}{$_}++; } for (qw(__func__ _Complex _Imaginary _Bool inline restrict)) { $style_keywords{'C9X'}{$_}++; } for (qw(inline const asm noreturn section constructor destructor unused weak)) { $style_keywords{'GNU'}{$_}++; $style_keywords{'GNU'}{"__$ {_}__"}++; } $style_keywords{'GNU'}{__attribute__}++; $style_keywords{'GNU'}{__extension__}++; $style_keywords{'GNU'}{__consts}++; $style_keywords{'GNU'}{__const}++; $style_keywords{'GNU'}{__restrict}++; my $recipes = { Defines => { default => '' }, cppstdin => { default => $Config{cppstdin} }, cppflags => { default => $Config{cppflags} }, cppminus => { default => $Config{cppminus} }, c_styles => { default => [qw(C++ GNU C9X)] }, add_cppflags => { default => '' }, keywords => { prerequisites => ['c_styles'], output => sub { my %kw = %keywords; my %add; for ( @{ shift->{c_styles} } ) { %add = %{ $style_keywords{$_} }; %kw = (%kw, %add); } \%kw; }, }, 'undef' => { default => undef }, filename_filter => { default => undef }, full_text => { class_filter => [ 'text', 'C::Preprocessed', qw(undef filename Defines includeDirs Cpp)] }, text => { class_filter => [ 'text', 'C::Preprocessed', qw(filename_filter filename Defines includeDirs Cpp)] }, text_only_from => { class_filter => [ 'text_only_from', 'C::Preprocessed', qw(filename_filter filename Defines includeDirs Cpp)] }, includes => { filter => [ \&includes, qw(filename Defines includeDirs Cpp) ], }, includeDirs => { prerequisites => ['filedir'], output => sub { my $data = shift; [ $data->{filedir}, '/usr/local/include', '.']; } }, Cpp => { prerequisites => [qw(cppminus add_cppflags cppflags cppstdin)], output => sub { my $data = shift; return { cppstdin => $data->{cppstdin}, cppflags => "$data->{cppflags} $data->{add_cppflags}", cppminus => $data->{cppminus} }; } }, filedir => { output => sub { dirname ( shift->{filename} || '.' ) } }, sanitized => { filter => [ \&sanitize, 'text'], }, toplevel => { filter => [ \&top_level, 'sanitized'], }, full_sanitized => { filter => [ \&sanitize, 'full_text'], }, full_toplevel => { filter => [ \&top_level, 'full_sanitized'], }, no_type_decl => { filter => [ \&remove_type_decl, 'toplevel'], }, typedef_chunks => { filter => [ \&typedef_chunks, 'full_toplevel'], }, struct_chunks => { filter => [ \&struct_chunks, 'full_toplevel'], }, typedefs_whited => { filter => [ \&typedefs_whited, 'full_sanitized', 'typedef_chunks', 'keywords_rex'], }, typedef_texts => { filter => [ \&typedef_texts, 'full_text', 'typedef_chunks'], }, struct_texts => { filter => [ \&typedef_texts, 'full_text', 'struct_chunks'], }, typedef_hash => { filter => [ \&typedef_hash, 'typedef_texts', 'typedefs_whited'], }, typedef_structs => { filter => [ \&typedef_structs, 'typedef_hash', 'struct_texts'], }, typedefs_maybe => { filter => [ sub {[keys %{+shift}]}, 'typedef_hash'], }, defines_maybe => { filter => [ \&defines_maybe, 'filename'], }, defines_no_args => { prerequisites => ['defines_maybe'], output => sub { shift->{defines_maybe}->[0] }, }, defines_args => { prerequisites => ['defines_maybe'], output => sub { shift->{defines_maybe}->[1] }, }, defines_full => { filter => [ \&defines_full, qw(filename Defines includeDirs Cpp) ], }, defines_no_args_full => { prerequisites => ['defines_full'], output => sub { shift->{defines_full}->[0] }, }, defines_args_full => { prerequisites => ['defines_full'], output => sub { shift->{defines_full}->[1] }, }, decl_inlines => { filter => [ \&functions_in, 'no_type_decl'], }, inline_chunks => { filter => [ sub { shift->[0] }, 'decl_inlines'], }, inlines => { filter => [ \&from_chunks, 'inline_chunks', 'text'], }, decl_chunks => { filter => [ sub { shift->[1] }, 'decl_inlines'], }, decls => { filter => [ \&from_chunks, 'decl_chunks', 'text'], }, fdecl_chunks => { filter => [ sub { shift->[4] }, 'decl_inlines'], }, fdecls => { filter => [ \&from_chunks, 'fdecl_chunks', 'text'], }, mdecl_chunks => { filter => [ sub { shift->[2] }, 'decl_inlines'], }, mdecls => { filter => [ \&from_chunks, 'mdecl_chunks', 'text'], }, vdecl_chunks => { filter => [ sub { shift->[3] }, 'decl_inlines'], }, vdecls => { filter => [ \&from_chunks, 'vdecl_chunks', 'text'], }, vdecl_hash => { filter => [ \&vdecl_hash, 'vdecls', 'mdecls' ], }, parsed_fdecls => { filter => [ \&do_declarations, 'fdecls', 'typedef_hash', 'keywords'], }, parsed_inlines => { filter => [ \&do_declarations, 'inlines', 'typedef_hash', 'keywords'], }, keywords_rex => { filter => [ sub { my @k = keys %{ shift() }; local $" = '|'; my $r = "(?:@k)"; eval 'qr/$r/' or $r # Older Perls }, 'keywords'], }, }; sub from_chunks { my $chunks = shift; my $txt = shift; my @out; my $i = 0; while ($i < @$chunks) { push @out, substr $txt, $chunks->[$i], $chunks->[ $i + 1 ] - $chunks->[$i]; $i += 2; } \@out; } #sub process { request($recipes, @_) } # Preloaded methods go here. sub includes { my %seen; my $stream = new C::Preprocessed (@_) or die "Cannot open pipe from cppstdin: $!\n"; while (<$stream>) { next unless m(^\s*\#\s* # Leading hash (line\s*)? # 1: Optional line ([0-9]+)\s* # 2: Line number (.*) # 3: The rest )x; my $include = $3; $include = $1 if $include =~ /"(.*)"/; # Filename may be in quotes $include =~ s,\\\\,/,g if $^O eq 'os2'; $seen{$include}++ if $include ne ""; } [keys %seen]; } sub defines_maybe { my $file = shift; my ($mline,$line,%macros,%macrosargs,$sym,$args); open(C, $file) or die "Cannot open file $file: $!\n"; while (not eof(C) and $line = ) { next unless ( $line =~ s[ ^ \s* \# \s* # Start of directive define \s+ (\w+) # 1: symbol (?: \( (.*?) \s* \) # 2: Minimal match for arguments # in parenths (without trailing # spaces) )? # optional, no grouping \s* # rest is the definition ([\s\S]*) # 3: the rest ][]x ); ($sym, $args, $mline) = ($1, $2, $3); $mline .= while not eof(C) and $mline =~ s/\\\n/\n/; chomp $mline; #print "sym: `$sym', args: `$args', mline: `$mline'\n"; if (defined $args) { $macrosargs{$sym} = [ [split /\s*,\s*/, $args], $mline]; } else { $macros{$sym} = $mline; } } close(C) or die "Cannot close file $file: $!\n"; [\%macros, \%macrosargs]; } sub defines_full { my $Cpp = $_[3]; my ($mline,$line,%macros,%macrosargs,$sym,$args); # save the old cppflags and add the flag for only ouputting macro definitions my $old_cppstdin = $Cpp->{'cppstdin'}; $Cpp->{'cppstdin'} = $old_cppstdin . " " . $ModPerl::CScan::MACROS_ONLY; my $stream = new C::Preprocessed (@_) or die "Cannot open pipe from cppstdin: $!\n"; while (defined ($line = <$stream>)) { next unless ( $line =~ s[ ^ \s* \# \s* # Start of directive define \s+ (\w+) # 1: symbol (?: \( (.*?) \s* \) # 2: Minimal match for arguments # in parenths (without trailing # spaces) )? # optional, no grouping \s* # rest is the definition ([\s\S]*) # 3: the rest ][]x ); ($sym, $args, $mline) = ($1, $2, $3); $mline .= <$stream> while ($mline =~ s/\\\n/\n/); chomp $mline; #print STDERR "sym: `$sym', args: `$args', mline: `$mline'\n"; if (defined $args) { $macrosargs{$sym} = [ [split /\s*,\s*/, $args], $mline]; } else { $macros{$sym} = $mline; } } # restore the original cppflags $Cpp->{'cppstdin'} = $old_cppstdin; [\%macros, \%macrosargs]; } sub typedef_chunks { # Input is toplevel, output: starts and ends my $txt = shift; pos $txt = 0; my ($b, $e, @out); while ($txt =~ /\btypedef\b/g) { push @out, pos $txt; $txt =~ /(?=;)|\Z/g; push @out, pos $txt; } \@out; } sub struct_chunks { my $txt = shift; pos $txt = 0; my ($b, $e, @out); while ($txt =~ /\b(?=struct\s*(\w*\s*)?\{)/g) { push @out, pos $txt; $txt =~ /(?=;)|\Z/g; push @out, pos $txt; } \@out; } sub typedefs_whited { # Input is sanitized text, and list of beg/end. my @lst = @{$_[1]}; my @out; my ($b, $e); while ($b = shift @lst) { $e = shift @lst; push @out, whited_decl($_[2], substr $_[0], $b, $e - $b); } \@out; } sub structs_whited { my @lst = @{$_[1]}; my @out; my ($b, $e, $in); while ($b = shift @lst) { $e = shift @lst; $in = substr $_[0], $b, $e - $b; $in =~ s/^(struct\s*(\w*\s*)?)(.*)$/$1 . " " x length($3)/es; push @out, $in; } \@out; } sub typedef_texts { my ($txt, $chunks) = (shift, shift); my ($b, $e, $in, @out); my @in = @$chunks; while (($b, $e) = splice @in, 0, 2) { $in = substr($txt, $b, $e - $b); # remove any remaining directives $in =~ s/^ ( \s* \# .* ( \\ $ \n .* )* ) / ' ' x length($1)/xgem; push @out, $in; } \@out; } sub typedef_hash { my ($typedefs, $whited) = (shift,shift); my %out; loop: for my $o (0..$#$typedefs) { my $wh = $whited->[$o]; my $td = $typedefs->[$o]; #my $verb = $td =~ /apr_child_errfn_t/ ? 1 : 0; #warn "$wh || $td\n" if $verb; if ($wh =~ /,/ or not $wh =~ /\w/) { # Hard case, guessimates ... # Determine whether the new thingies are inside parens $wh =~ /,/g; my $p = pos $wh; my ($s, $e); if (matchingbrace($wh)) { # Inside. Easy part: just split on /,/... $e = pos($wh) - 1; $s = $e; my $d = 0; # Skip back while (--$s >= 0) { my $c = substr $wh, $s, 1; if ($c =~ /[\(\{\[]/) { $d--; } elsif ($c =~ /[\)\]\}]/) { $d++; } last if $d < 0; } if ($s < 0) { # Should not happen warn("panic: could not match braces in\n\t$td\nwhited as\n\t$wh\n"); next loop; } $s++; } else { # We are at toplevel # We need to skip back all the modifiers attached to the first thingy # Guesstimates: everything after the first '*' (inclusive) pos $wh = 0; $wh = /(?=\w)/g; my $ws = pos $wh; my $pre = substr $wh, 0, $ws; $s = $ws; $s = pos $pre if $pre =~ /(?=\*)/g; $e = length $wh; } # Now: need to split $td based on commas in $wh! # And need to split each chunk of $td based on word in the chunk of $wh! my $td_decls = substr($td, $s, $e - $s); my ($pre, $post) = (substr($td, 0, $s), substr($td, $e)); my $wh_decls = substr($wh, $s, $e - $s); my @wh_decls = split /,/, $wh_decls; my $td_s = 0; my (@td_decl, @td_pre, @td_post, @td_word); for my $wh_d (@wh_decls) { my $td_d = substr $td, $td_s, length $wh_d; push @td_decl, $td_d; $wh_d =~ /(\w+)/g; push @td_word, $1; push @td_post, substr $td_d, pos($wh_d); push @td_pre, substr $td_d, pos($wh_d) - length $1, length $1; $td_s += 1 + length $wh_d; # Skip over ',' } for my $i (0..$#wh_decls) { my $p = "$td_post[$i]$post"; $p = '' unless $p =~ /\S/; $out{$td_word[$i]} = ["$pre$td_pre[$i]", $p]; } } elsif ($td =~ /\(\s* \*? \s* ([^)]+) \s* \) \s* \(.*\)/gxs){ # XXX: function pointer typedef $out{$1} = ['XXX: pre_foo', 'XXX: post_bar']; # XXX: not sure what to stuff here #warn "[$1] [$td]" if $verb; } else { # Only one thing defined... $wh =~ /(\w+)/g; my $e = pos $wh; my $s = $e - length $1; my $type = $1; my $pre = substr $td, 0, $s; my $post = substr $td, $e, length($td) - $e; $post = '' unless $post =~ /\S/; $out{$type} = [$pre, $post]; } #die if $verb; } \%out; } sub typedef_structs { my ($typehash, $structs) = @_; my %structs; for (0 .. $#$structs) { my $in = $structs->[$_]; my $key; next unless $in =~ /^struct\s*(\w+)/; next unless $in =~ s{^(struct\s*)(\w+)}{ $key = "struct $2"; $1 . " " x length($2) }e; my $name = parse_struct($in, \%structs); $structs{$key} = defined($name) ? $structs{$name} : undef; } while (my ($key, $text) = each %$typehash) { my $name = parse_struct($text->[0], \%structs); $structs{$key} = defined($name) ? $structs{$name} : undef; } \%structs; } sub parse_struct { my ($in, $structs) = @_; my ($b, $e, $chunk, $vars, $struct, $structname); return "$1 $2" if $in =~ / ^ \s* (struct | union) \s+ (\w+) \s* $ /x; ($structname, $in) = $in =~ / ^ \s* ( (?: struct | union ) (?: \s+ \w+ )? ) \s* { \s* (.*?) \s* } \s* $ /gisx or return; $structname .= " _ANON" unless $structname =~ /\s/; $structname .= " 0" if exists $structs->{$structname}; $structname =~ s/(\d+$)/$1 + 1/e while exists $structs->{$structname}; $structname =~ s/\s+/ /g; $b = 0; while ($in =~ /(\{|;|$)/g) { matchingbrace($in), next if $1 eq '{'; $e = pos($in); next if $b == $e; $chunk = substr($in, $b, $e - $b); $b = $e; if ($chunk =~ /\G\s*(struct|union|enum).*\}/gs) { my $term = pos $chunk; my $name = parse_struct(substr($chunk, 0, $term), $structs); $vars = parse_vars(join ' ', $name, substr $chunk, $term); } else { $vars = parse_vars($chunk); } push @$struct, @{$vars||[]}; } $structs->{$structname} = $struct; $structname; } sub parse_vars { my $in = shift; my ($vars, $type, $word, $id, $post, $func); while ($in =~ /\G\s*([\[;,(]|\*+|:\s*\d+|\S+?\b|$)\s*/gc) { $word = $1; if ($word eq ';' || $word eq '') { next unless defined $id; $type = 'int' unless defined $type; # or is this an error? push @$vars, [ $type, $post, $id ]; ($type, $post, $id, $func) = (undef, undef, undef); } elsif ($word eq ',') { warn "panic: expecting name before comma in '$in'\n" unless defined $id; $type = 'int' unless defined $type; # or is this an error? push @$vars, [ $type, $post, $id ]; $type =~ s/[ *]*$//; $id = undef; } elsif ($word eq '[') { warn "panic: expecting name before '[' in '$in'\n" unless defined $id; $type = 'int' unless defined $type; # or is this an error? my $b = pos $in; matchingbrace($in); $post .= $word . substr $in, $b, pos($in) - $b; } elsif ($word eq '(') { # simple hack for function pointers $type = join ' ', grep defined, $type, $id if defined $id; $type = 'int' unless defined $type; if ($in =~ /\G\s*(\*[\s\*]*?)\s*(\w+)[\[\]\d\s]*(\)\s*\()/gc) { $type .= "($1"; $id = $2; $post = $3; my $b = pos $in; matchingbrace($in); $post .= substr $in, $b, pos($in) - $b; } else { warn "panic: can't parse function pointer declaration in '$in'\n"; return; } } elsif ($word =~ /^:/) { # bitfield $type = 'int' unless defined $type; $post .= $word; } else { if (defined $post) { if ($func) { $post .= $word; } else { warn "panic: not expecting '$word' after array bounds in '$in'\n"; } } else { $type = join ' ', grep defined, $type, $id if defined $id; $id = $word; } } } unless ($vars) { warn sprintf "failed on <%s> with type=<%s>, id=<%s>, post=<%s> at pos=%d\n", $in, $type, $id, $post, pos($in); } $vars; } sub vdecl_hash { my ($vdecls, $mdecls) = @_; my %vdecl_hash; for (@$vdecls, @$mdecls) { next if /[()]/; # ignore functions, and function pointers my $copy = $_; next unless $copy =~ s/^\s*extern\s*//; my $vars = parse_vars($copy); $vdecl_hash{$_->[2]} = [ @$_[0, 1] ] for @$vars; } \%vdecl_hash; } # The output is the list of list of inline chunks and list of # declaration chunks. sub functions_in { # The arg is text without type declarations. my $in = shift; # remove_type_decl(top_level(sanitize($txt))); # What remains now consists of variable and function declarations, # and inline functions. $in =~ /(?=\S)/g; my ($b, $e, $b1, $e1, @inlines, @decls, @mdecls, @fdecls, @vdecls); $b = pos $in; my $chunk; while (defined($b) && $b != length $in) { $in =~ /;/g or pos $in = $b, $in =~ /.*\S|\Z/g ; # Or last non-space $e = pos $in; $chunk = substr $in, $b, $e - $b; # Now subdivide the chunk. # # What we got is one chunk, probably finished by `;'. Whoever, it # may start with several inline functions. # # Note that inline functions contain ( ) { } in the stripped version. $b1 = 0; while ($chunk =~ /\(\s*\)\s*\{\s*\}/g) { $e1 = pos $chunk; push @inlines, $b + $b1, $b + $e1; $chunk =~ /(?=\S)/g; $b1 = pos $chunk; $b1 = length $chunk, last unless defined $b1; } if ($e - $b - $b1 > 0) { my ($isvar, $isfunc) = (1, 1); substr ($chunk, 0, $b1) = ''; if ($chunk =~ /,/) { # Contains multiple declarations. push @mdecls, $b + $b1, $e; } else { # Non-multiple. # Since leading \s* is not optimized, this is quadratic! $chunk =~ s{ ( ( const | __const | __attribute__ \s* \( \s* \) ) \s* )* ( ; \s* )? \Z # Strip from the end }()x; $chunk =~ s/\s*\Z//; if ($chunk =~ /\)\Z/) { # Function declaration ends on ")"! if ($chunk !~ m{ \( .* \( # Multiple parenths }x and $chunk =~ / \w \s* \( /x) { # Most probably pointer to a function? $isvar = 0; } } elsif ($chunk =~ / ^ \s* (enum|struct|union|class) \s+ \w+ \s* $ /x) { $isvar = $isfunc = 0; } if ($isvar) { # Heuristically variable push @vdecls, $b + $b1, $e; } elsif ($isfunc) { push @fdecls, $b + $b1, $e; } } push @decls, $b + $b1, $e if $isvar || $isfunc; } $in =~ /\G\s*/g ; $b = pos $in; } [\@inlines, \@decls, \@mdecls, \@vdecls, \@fdecls]; } # XXXX This is heuristical in many respects... # Recipe: remove all struct-ish chunks. Remove all array specifiers. # Remove GCC attribute specifiers. # What remains may contain function's arguments, old types, and newly # defined types. # Remove function arguments using heuristics methods. # Now out of several words in a row the last one is a newly defined type. sub whited_decl { # Input is sanitized. my $keywords_rex = shift; my $in = shift; # Text of a declaration #typedef ret_type*(*func) -> typedef ret_type* (*func) $in =~ s/\*\(\*/* \(*/; my $rest = $in; my $out = $in; # Whited out $in # Remove all the structs while ($out =~ /(\b(struct|union|class|enum)(\s+\w+)?\s*\{)/g) { my $pos_start = pos($out) - length $1; matchingbrace($out); my $pos_end = pos $out; substr($out, $pos_start, $pos_end - $pos_start) = ' ' x ($pos_end - $pos_start); pos $out = $pos_end; } # Deal with glibc's wierd ass __attribute__ tag. Just dump it. # Maaaybe this should check to see if you're using GCC, but I don't # think so since glibc is nice enough to do that for you. [MGS] while ( $out =~ m/(\b(__attribute__|attribute)\s*\((?=\s*\())/g ) { my $att_pos_start = pos($out) - length($1); # Need to figure out where ((..)) ends. matchingbrace($out); my $att_pos_end = pos $out; # Remove the __attribute__ tag. substr($out, $att_pos_start, $att_pos_end - $att_pos_start) = ' ' x ($att_pos_end - $att_pos_start); pos $out = $att_pos_end; } # Remove arguments of functions (heuristics only). # These things (start) arglist of a declared function: # paren word comma # paren word space non-paren # paren keyword paren # start a list of arguments. (May be "cdecl *myfunc"?) XXXXX ????? while ( $out =~ /(\(\s*(\w+(,|\s*[^\)\s])|$keywords_rex\s*\)))/g ) { my $pos_start = pos($out) - length($1); pos $out = $pos_start + 1; matchingbrace($out); substr ($out, $pos_start + 1, pos($out) - 2 - $pos_start) = ' ' x (pos($out) - 2 - $pos_start); } # Remove array specifiers $out =~ s/(\[[\w\s\+]*\])/ ' ' x length $1 /ge; my $tout = $out; # Several words in a row cannot be new typedefs, but the last one. $out =~ s/((\w+\**\s+)+(?=[^\s,;\[\{\)]))/ ' ' x length $1 /ge; unless ($out =~ /\w/) { # Probably a function-type declaration: typedef int f(int); # Redo scan leaving the last word of the first group of words: if ($tout =~ /(\w+\s+)*(\w+)\s*\(/g) { $out = ' ' x (pos($tout) - length $2) . $2 . ' ' x (length($tout) - pos($tout)); } else { # try a different approach to get the last type my $len = length $tout; # cut all non-words at the end of the definition my $end = $tout =~ s/(\W*)$// ? length $1 : 0; # remove everything but the last word my $mid = $tout =~ s/.*?(\w*)$/$1/ ? length $1 : 0; # restore the length $out = $tout . ' ' x ($len - $mid); } # warn "function typedef\n\t'$in'\nwhited-out as\n\t'$out'\n"; } warn "panic: length mismatch\n\t'$in'\nwhited-out as\n\t'$out'\n" if length($in) != length $out; # Sanity check warn "panic: multiple types without intervening comma in\n\t'$in'\nwhited-out as\n\t'$out'\n" if $out =~ /\w[^\w,]+\w/; warn "panic: no types found in\n\t'$in'\nwhited-out as\n\t'$out'\n" unless $out =~ /\w/; $out } sub matchingbrace { # pos($_[0]) is after the opening brace now my $n = 0; while ($_[0] =~ /([\{\[\(])|([\]\)\}])/g) { $1 ? $n++ : $n-- ; return 1 if $n < 0; } # pos($_[0]) is after the closing brace now return; # false } sub remove_Comments_no_Strings { # We expect that no strings are around my $in = shift; $in =~ s,/(/.*|\*[\s\S]*?\*/),,g ; # C and C++ die "Unfinished comment" if $in =~ m,/\*, ; $in; } sub sanitize { # We expect that no strings are around my $in = shift; # C and C++, strings and characters $in =~ s{ / ( / .* # C++ style | \* [\s\S]*? \*/ # C style ) # (1) | '((?:[^\\\']|\\.)+)' # (2) Character constants | "((?:[^\\\"]|\\.)*)" # (3) Strings | ( ^ \s* \# .* # (4) Preprocessor ( \\ $ \n .* )* ) # and continuation lines } { # We want to preserve the length, so that one may go back defined $1 ? ' ' x (1 + length $1) : defined $4 ? ' ' x length $4 : defined $2 ? "'" . ' ' x length($2) . "'" : defined $3 ? '"' . ' ' x length($3) . '"' : '???' }xgem ; die "Unfinished comment" if $in =~ m{ /\* }x; $in; } sub top_level { # We expect argument is sanitized # Note that this may remove the variable in declaration: int (*func)(); my $in = shift; my $start; my $out = $in; while ($in =~ /[\[\{\(]/g ) { $start = pos $in; matchingbrace($in); substr($out, $start, pos($in) - 1 - $start) = ' ' x (pos($in) - 1 - $start); } $out; } sub remove_type_decl { # We suppose that the arg is top-level only. my $in = shift; $in =~ s/(\b__extension__)(\s+typedef\b)/(' ' x length $1) . $2/gse; $in =~ s/(\btypedef\b.*?;)/' ' x length $1/gse; # The following form may appear only in the declaration of the type itself: $in =~ s/(\b(enum|struct|union|class)\b[\s\w]*\{\s*\}\s*;)/' ' x length $1/gse; $in; } sub new { my $class = shift; my $out = SUPER::new $class $recipes; $out->set(@_); $out; } sub do_declarations { my @d = map do_declaration($_, $_[1], $_[2]), @{ $_[0] }; \@d; } # Forth argument: if defined, there maybe no identifier. Generate one # basing on this argument. sub do_declaration { my ($decl, $typedefs, $keywords, $argnum) = @_; $decl =~ s/;?\s*$//; my ($type, $typepre, $typepost, $ident, $args, $w, $pos, $repeater); $decl =~ s/[\r\n]\s*/ /g; #warn "DECLAR [$decl][$argnum]\n"; $decl =~ s/^\s*__extension__\b\s*//; $decl =~ s/^\s*extern\b\s*//; $decl =~ s/^\s*__inline\b\s*//; $pos = 0; while ($decl =~ /(\w+)/g and ($typedefs->{$1} or $keywords->{$1})) { $w = $1; if ($w =~ /^(struct|class|enum|union)$/) { $decl =~ /\G\s+\w+/g or die "`$w' is not followed by word in `$decl'"; } $pos = pos $decl; } #warn "pos: $pos\n"; pos $decl = $pos; $decl =~ /\G[\s*]*\*/g or pos $decl = $pos; $type = substr $decl, 0, pos $decl; $decl =~ /\G\s*/g or pos $decl = length $type; # ???? $pos = pos $decl; #warn "pos: $pos\n"; if (defined $argnum) { if ($decl =~ /\G(\w+)((\s*\[[^][]*\])*)/g) { # The best we can do with [2] $ident = $1; $repeater = $2; $pos = pos $decl; } else { pos $decl = $pos = length $decl; $type = $decl; $ident = "arg$argnum"; } } else { die "Cannot process declaration `$decl' without an identifier" unless $decl =~ /\G(\w+)/g; $ident = $1; $pos = pos $decl; } #warn "pos: $pos\n"; $decl =~ /\G\s*/g or pos $decl = $pos; $pos = pos $decl; #my $st = length $decl; #warn substr($decl, 0, $pos), "\n"; #warn "pos: $pos $st\n"; #warn "DECLAR [$decl][$argnum]\n"; if (pos $decl != length $decl) { pos $decl = $pos; die "Expecting parenth after identifier in `$decl'\nafter `", substr($decl, 0, $pos), "'" unless $decl =~ /\G\(/g; my $argstring = substr($decl, pos($decl) - length $decl); matchingbrace($argstring) or die "Cannot find matching parenth in `$decl'"; $argstring = substr($argstring, 0, pos($argstring) - 1); $argstring =~ s/ ^ ( \s* void )? \s* $ //x; $args = []; my @args; if ($argstring ne '') { my $top = top_level $argstring; my $p = 0; my $arg; while ($top =~ /,/g) { $arg = substr($argstring, $p, pos($top) - 1 - $p); $arg =~ s/^\s+|\s+$//gs; push @args, $arg; $p = pos $top; } $arg = substr $argstring, $p; $arg =~ s/^\s+|\s+$//gs; push @args, $arg; } my $i = 0; for (@args) { push @$args, do_declaration1($_, $typedefs, $keywords, $i++); } } [$type, $ident, $args, $decl, $repeater]; } sub do_declaration1 { my ($decl, $typedefs, $keywords, $argnum) = @_; $decl =~ s/;?\s*$//; #warn "DECLARO [$decl][$argnum]\n"; my ($type, $typepre, $typepost, $ident, $args, $w, $pos, $repeater); $pos = 0; while ($decl =~ /(\w+)/g and ($typedefs->{$1} or $keywords->{$1})) { $w = $1; if ($w =~ /^(struct|class|enum|union)$/) { $decl =~ /\G\s+\w+/g or die "`$w' is not followed by word in `$decl'"; } $pos = pos $decl; } #warn "POS: $pos\n"; pos $decl = $pos; $decl =~ /\G[\s*]*\*/g or pos $decl = $pos; $type = substr $decl, 0, pos $decl; $decl =~ /\G\s*/g or pos $decl = length $type; # ???? $pos = pos $decl; if (defined $argnum) { if ($decl =~ /\G(\w+)((\s*\[[^][]*\])*)/g) { # The best we can do with [2] $ident = $1; $repeater = $2; $pos = pos $decl; } else { pos $decl = $pos = length $decl; $type = $decl; $ident = "arg$argnum"; } } else { die "Cannot process declaration `$decl' without an identifier" unless $decl =~ /\G(\w+)/g; $ident = $1; $pos = pos $decl; } $decl =~ /\G\s*/g or pos $decl = $pos; $pos = pos $decl; #warn "DECLAR1 [$decl][$argnum]\n"; #my $st = length $decl; #warn substr($decl, 0, $pos), "\n"; #warn "pos: $pos $st\n"; if (pos $decl != length $decl) { pos $decl = $pos; die "Expecting parenth after identifier in `$decl'\nafter `", substr($decl, 0, $pos), "'" unless $decl =~ /\G\(/g; my $argstring = substr($decl, pos($decl) - length $decl); matchingbrace($argstring) or die "Cannot find matching parenth in `$decl'"; $argstring = substr($argstring, 0, pos($argstring) - 1); $argstring =~ s/ ^ ( \s* void )? \s* $ //x; $args = []; my @args; if ($argstring ne '') { my $top = top_level $argstring; my $p = 0; my $arg; while ($top =~ /,/g) { $arg = substr($argstring, $p, pos($top) - 1 - $p); $arg =~ s/^\s+|\s+$//gs; push @args, $arg; $p = pos $top; } $arg = substr $argstring, $p; $arg =~ s/^\s+|\s+$//gs; push @args, $arg; } my $i = 0; for (@args) { push @$args, do_declaration1($_, $typedefs, $keywords, $i++); } } [$type, $ident, $args, $decl, $repeater]; } ############################################################ package C::Preprocessed; use Symbol; use File::Basename; use Config; use constant WIN32 => $^O eq 'MSWin32'; sub new { die "usage: C::Preprocessed->new(filename[, defines[, includes[, cpp]]])" if @_ < 2 or @_ > 5; my ($class, $filename, $Defines, $Includes, $Cpp) = (shift, shift, shift, shift, shift); $Cpp ||= \%Config::Config; my $filedir = dirname $filename || '.'; $Includes ||= [$filedir, '/usr/local/include', '.']; my $addincludes = ""; $addincludes = "-I" . join(" -I", @$Includes) if defined $Includes and @$Includes; my ($sym) = gensym; my $cmd = WIN32 ? "$Cpp->{cppstdin} $Defines $addincludes $Cpp->{cppflags} $filename |" : "echo '\#include \"$filename\"' | $Cpp->{cppstdin} $Defines $addincludes $Cpp->{cppflags} $Cpp->{cppminus} | grep -v '^#' |"; #my $cmd = "echo '\#include <$filename>' | $Cpp->{cppstdin} $Defines $addincludes $Cpp->{cppflags} $Cpp->{cppminus} |"; (open($sym, $cmd) or die "Cannot open pipe from `$cmd': $!") and bless $sym => $class; } sub text { my $class = shift; my $filter = shift; if (defined $filter) { return text_only_from($class, $filter, @_); } my $stream = $class->new(@_); my $oh = select $stream; local $/; select $oh; <$stream>; } sub text_only_from { my $class = shift; my $from = shift || die "Expecting argument in `text_only_from'"; my $stream = $class->new(@_); my $on = $from eq $_[0]; my $eqregexp = $on ? '\"\"|' : ''; my @out; while (<$stream>) { #print; $on = /$eqregexp[\"\/]\Q$from\"/ if /^\#/; push @out, $_ if $on; } join '', @out; } sub DESTROY { close($_[0]) or die "Cannot close pipe from `$Config::Config{cppstdin}': err $?, $!\n"; } # Autoload methods go after __END__, and are processed by the autosplit program. # Return to the principal package. package ModPerl::CScan; 1; __END__ =head1 NAME ModPerl::CScan - scan C language files for easily recognized constructs. =head1 SYNOPSIS =head1 DESCRIPTION See the C manpage. This package is just a fork to fix certain things that didn't work in the original C, which is not maintained any longer. These fixes required to make it work with the Apache 2 source code. =cut mod_perl-2.0.9/lib/ModPerl/DummyVersions.pm0000644000104000010010000001000012540623201021240 0ustar AdministratorsNone# # /* # * *********** WARNING ************** # * This file generated by ModPerl::WrapXS/0.01 # * Any changes made here will be lost # * *********************************** # * 01: lib/ModPerl/Code.pm:716 # * 02: lib/ModPerl/WrapXS.pm:1138 # * 03: lib/ModPerl/WrapXS.pm:1190 # * 04: Makefile.PL:435 # * 05: Makefile.PL:333 # * 06: Makefile.PL:59 # */ # package APR::Base64; $APR::Base64::VERSION = 0.009000; package APR::Brigade; $APR::Brigade::VERSION = 0.009000; package APR::Bucket; $APR::Bucket::VERSION = 0.009000; package APR::BucketAlloc; $APR::BucketAlloc::VERSION = 0.009000; package APR::BucketType; $APR::BucketType::VERSION = 0.009000; package APR::Date; $APR::Date::VERSION = 0.009000; package APR::Error; $APR::Error::VERSION = 0.009000; package APR::Finfo; $APR::Finfo::VERSION = 0.009000; package APR::IpSubnet; $APR::IpSubnet::VERSION = 0.009000; package APR::OS; $APR::OS::VERSION = 0.009000; package APR::Pool; $APR::Pool::VERSION = 0.009000; package APR::SockAddr; $APR::SockAddr::VERSION = 0.009000; package APR::Socket; $APR::Socket::VERSION = 0.009000; package APR::Status; $APR::Status::VERSION = 0.009000; package APR::String; $APR::String::VERSION = 0.009000; package APR::Table; $APR::Table::VERSION = 0.009000; package APR::ThreadMutex; $APR::ThreadMutex::VERSION = 0.009000; package APR::ThreadRWLock; $APR::ThreadRWLock::VERSION = 0.009000; package APR::URI; $APR::URI::VERSION = 0.009000; package APR::UUID; $APR::UUID::VERSION = 0.009000; package APR::Util; $APR::Util::VERSION = 0.009000; package Apache2::Access; $Apache2::Access::VERSION = 2.000009; package Apache2::CmdParms; $Apache2::CmdParms::VERSION = 2.000009; package Apache2::Command; $Apache2::Command::VERSION = 2.000009; package Apache2::Connection; $Apache2::Connection::VERSION = 2.000009; package Apache2::ConnectionUtil; $Apache2::ConnectionUtil::VERSION = 2.000009; package Apache2::Directive; $Apache2::Directive::VERSION = 2.000009; package Apache2::Filter; $Apache2::Filter::VERSION = 2.000009; package Apache2::FilterRec; $Apache2::FilterRec::VERSION = 2.000009; package Apache2::HookRun; $Apache2::HookRun::VERSION = 2.000009; package Apache2::Log; $Apache2::Log::VERSION = 2.000009; package Apache2::MPM; $Apache2::MPM::VERSION = 2.000009; package Apache2::Module; $Apache2::Module::VERSION = 2.000009; package Apache2::Process; $Apache2::Process::VERSION = 2.000009; package Apache2::Provider; $Apache2::Provider::VERSION = 2.000009; package Apache2::RequestIO; $Apache2::RequestIO::VERSION = 2.000009; package Apache2::RequestRec; $Apache2::RequestRec::VERSION = 2.000009; package Apache2::RequestUtil; $Apache2::RequestUtil::VERSION = 2.000009; package Apache2::Response; $Apache2::Response::VERSION = 2.000009; package Apache2::ServerRec; $Apache2::ServerRec::VERSION = 2.000009; package Apache2::ServerUtil; $Apache2::ServerUtil::VERSION = 2.000009; package Apache2::SubProcess; $Apache2::SubProcess::VERSION = 2.000009; package Apache2::SubRequest; $Apache2::SubRequest::VERSION = 2.000009; package Apache2::URI; $Apache2::URI::VERSION = 2.000009; package Apache2::Util; $Apache2::Util::VERSION = 2.000009; package ModPerl::Global; $ModPerl::Global::VERSION = 2.000009; package ModPerl::InterpPool; $ModPerl::InterpPool::VERSION = 2.000009; package ModPerl::Interpreter; $ModPerl::Interpreter::VERSION = 2.000009; package ModPerl::MethodLookup; $ModPerl::MethodLookup::VERSION = 2.000009; package ModPerl::TiPool; $ModPerl::TiPool::VERSION = 2.000009; package ModPerl::TiPoolConfig; $ModPerl::TiPoolConfig::VERSION = 2.000009; package ModPerl::Util; $ModPerl::Util::VERSION = 2.000009; mod_perl-2.0.9/lib/ModPerl/FunctionMap.pm0000644000104000010010000001314512540623201020654 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::FunctionMap; use strict; use warnings FATAL => 'all'; use ModPerl::MapUtil qw(); use ModPerl::ParseSource (); our @ISA = qw(ModPerl::MapBase); sub new { my $class = shift; bless {}, $class; } #for adding to function.map sub generate { my $self = shift; my $missing = $self->check; return unless $missing; print " $_\n" for @$missing; } sub disabled { shift->{disabled} } #look for functions that do not exist in *.map sub check { my $self = shift; my $map = $self->get; my @missing; my $mp_func = ModPerl::ParseSource->wanted_functions; for my $name (map $_->{name}, @{ $self->function_table() }) { next if exists $map->{$name}; push @missing, $name unless $name =~ /^($mp_func)/o; } return @missing ? \@missing : undef; } #look for functions in *.map that do not exist my $special_name = qr{(^DEFINE_|DESTROY$)}; sub check_exists { my $self = shift; my %functions = map { $_->{name}, 1 } @{ $self->function_table() }; my @missing = (); for my $name (keys %{ $self->{map} }) { next if $functions{$name}; push @missing, $name unless $name =~ $special_name; } return @missing ? \@missing : undef; } my $keywords = join '|', qw(MODULE PACKAGE PREFIX BOOT); sub guess_prefix { my $entry = shift; my ($name, $class) = ($entry->{name}, $entry->{class}); my $prefix = ""; $name =~ s/^DEFINE_//; $name =~ s/^mpxs_//i; (my $modprefix = ($entry->{class} || $entry->{module}) . '_') =~ s/::/__/g; (my $guess = lc $modprefix) =~ s/_+/_/g; $guess =~ s/(apache2)_/($1|ap)_{1,2}/; if ($name =~ s/^($guess|$modprefix).*/$1/i) { $prefix = $1; } else { if ($name =~ /^(apr?_)/) { $prefix = $1; } } #print "GUESS prefix=$guess, name=$entry->{name} -> $prefix\n"; return $prefix; } sub parse { my ($self, $fh, $map) = @_; my %cur; my $disabled = 0; while ($fh->readline) { if (/($keywords)=/o) { $disabled = s/^\W//; #module is disabled my %words = $self->parse_keywords($_); if ($words{MODULE}) { %cur = (); } if ($words{PACKAGE}) { delete $cur{CLASS}; } for (keys %words) { $cur{$_} = $words{$_}; } next; } my ($name, $dispatch, $argspec, $alias) = split /\s*\|\s*/; my $return_type; if ($name =~ s/^([^:]+)://) { $return_type = $1; $return_type =~ s/\s+$//; # allow: char * :.... } if ($name =~ s/^(\W)// or not $cur{MODULE} or $disabled) { #notimplemented or cooked by hand die qq[function '$name' appears more than once in xs/maps files] if $map->{$name}; $map->{$name} = undef; push @{ $self->{disabled}->{ $1 || '!' } }, $name; next; } if (my $package = $cur{PACKAGE}) { unless ($package eq 'guess') { $cur{CLASS} = $package; } if ($cur{ISA}) { $self->{isa}->{ $cur{MODULE} }->{$package} = delete $cur{ISA}; } if ($cur{BOOT}) { $self->{boot}->{ $cur{MODULE} } = delete $cur{BOOT}; } } else { $cur{CLASS} = $cur{MODULE}; } #XXX: make_prefix() stuff should be here, not ModPerl::WrapXS if ($name =~ /^DEFINE_/ and $cur{CLASS}) { $name =~ s{^(DEFINE_)(.*)} {$1 . ModPerl::WrapXS::make_prefix($2, $cur{CLASS})}e; } die qq[function '$name' appears more than once in xs/maps files] if $map->{$name}; my $entry = $map->{$name} = { name => $alias || $name, dispatch => $dispatch, argspec => $argspec ? [split /\s*,\s*/, $argspec] : "", return_type => $return_type, alias => $alias, }; for (keys %cur) { $entry->{lc $_} = $cur{$_}; } #avoid 'use of uninitialized value' warnings $entry->{$_} ||= "" for keys %{ $entry }; if ($entry->{dispatch} =~ /_$/) { $entry->{dispatch} .= $name; } } } sub get { my $self = shift; $self->{map} ||= $self->parse_map_files; } sub prefixes { my $self = shift; $self = ModPerl::FunctionMap->new unless ref $self; my $map = $self->get; my %prefix; while (my ($name, $ent) = each %$map) { next unless $ent->{prefix}; $prefix{ $ent->{prefix} }++; } $prefix{$_} = 1 for qw(ap_ apr_); #make sure we get these [keys %prefix] } 1; __END__ mod_perl-2.0.9/lib/ModPerl/Manifest.pm0000644000104000010010000000651412540623201020201 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::Manifest; use strict; use warnings FATAL => 'all'; use File::Basename; use File::Find; use Cwd (); use Exporter (); our @EXPORT_OK = qw(mkmanifest); *import = \&Exporter::import; #generate a MANIFEST based on CVS/Entries #anything to be skipped goes after __DATA__ (MANIFEST.SKIP format) #anything else to be added should go here: my @add_files = qw{ MANIFEST mod_perl.spec Apache-Test/META.yml }; sub get_svn_files { my @files; my $cwd = Cwd::cwd(); my @lines = `svn status -v` ; foreach my $line (@lines) { chomp $line; if ($line =~ /(?:\d+)\s+(?:\d+)\s+(?:\w+)\s+(.*)\s*/) { my $file = $1; if (-e $file && ! -d $file) { $file =~ s{\\}{/}g; push @files, $file; } } } # files to add which aren't under svn push @files, qw(lib/ModPerl/DummyVersions.pm lib/ModPerl/MethodLookup.pm); return @files; } sub mkmanifest { my @files = (@add_files, get_svn_files()); my $matches = maniskip(); open my $fh, '>', 'MANIFEST' or die "open MANIFEST: $!"; for my $file (sort @files) { if ($matches->($file)) { warn "skipping $file\n"; next; } print "$file\n"; print $fh "$file\n"; } close $fh; } #copied from ExtUtils::Manifest #uses DATA instead of MANIFEST.SKIP sub maniskip { my $matches = sub {0}; my @skip; while (){ chomp; next if /^#/; next if /^\s*$/; push @skip, $_; } my $sub = "\$matches = " . "sub { my (\$arg)=\@_; return 1 if " . join (" || ", (map {s!/!\\/!g; "\$arg =~ m/$_/o"} @skip), 0) . " }"; eval $sub; $matches; } 1; __DATA__ patches/ #very few will have Chatbot::Eliza installed eliza # random failures t/perl/ithreads.t t/perl/ithreads2.t t/response/TestPerl/ithreads.pm t/response/TestPerl/ithreads_args.pm t/response/TestPerl/ithreads_eval.pm # broken/out-dated t/perl/ithreads3.t t/response/TestPerl/ithreads3.pm # incomplete t/apr-ext/perlio # PAUSE breaks if a dist has more than one META.yml. the top-level # META.yml already excludes Apache-Test from indexing Apache-Test/META.yml # exclude Apache-Test/MANIFEST since it confuses the mp2 build (e.g it # wants Apache-Test/META.yml which we don't supply, see above) Apache-Test/MANIFEST # this is an internal to developers sub-project Apache-Test/Apache-TestItSelf mod_perl-2.0.9/lib/ModPerl/MapUtil.pm0000644000104000010010000001575012540623201020010 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::MapUtil; use strict; use warnings; use Exporter (); use Apache2::Build (); our @EXPORT_OK = qw(list_first disabled_reason function_table structure_table xs_glue_dirs); our @ISA = qw(Exporter); # the mapping happens in lib/ModPerl/StructureMap.pm: sub parse # '<' => 'auto-generated but gives only a read-only access' # '&' => 'RDWR accessor to a char* field, supporting undef arg' # '$' => 'RONLY accessor, with WRITE accessor before child_init' # '%' => like $, but makes sure that for the write accessor the # original perl scalar can change or go away w/o affecting # the object my %disabled_map = ( '!' => 'disabled or not yet implemented', '~' => 'implemented but not auto-generated', '-' => 'likely never be available to Perl', '>' => '"private" to apache', '?' => 'unclassified', ); my $function_table = []; sub function_table { return $function_table if @$function_table; my $build = Apache2::Build->new(); my $httpd_version = $build->httpd_version; if ($httpd_version lt '2.4.0' || ! -d "xs/tables/current24") { push @INC, "xs/tables/current"; } else { push @INC, "xs/tables/current24"; } require Apache2::FunctionTable; require ModPerl::FunctionTable; require APR::FunctionTable; @$function_table = (@$Apache2::FunctionTable, @$ModPerl::FunctionTable, @$APR::FunctionTable); $function_table; } my $structure_table = []; sub structure_table { return $structure_table if @$structure_table; require Apache2::StructureTable; @$structure_table = (@$Apache2::StructureTable); $structure_table; } sub disabled_reason { $disabled_map{+shift} || 'unknown'; } sub xs_glue_dirs { Apache2::Build->build_config->mp_xs_glue_dir; } sub list_first (&@) { my $code = shift; for (@_) { return $_ if $code->(); } undef; } package ModPerl::MapBase; *function_table = \&ModPerl::MapUtil::function_table; *structure_table = \&ModPerl::MapUtil::structure_table; my @condition; sub readline { my $fh = shift; while (<$fh>) { chomp; s/^\s+//; s/\s+$//; # this implements # #_if_ cmd # ... # #_else_ # #_end_ if (/^\s*#\s*_(if|unless|els(?:e|if)|end)_(?:\s(.+))?/) { my ($cmd, $param) = ($1, $2); if (defined $param) { while ($param=~s!\\$!!) { my $l=<$fh>; die "$ModPerl::MapUtil::MapFile($.): unexpected EOF\n" unless defined $l; chomp $l; $param.=$l; } } if ($cmd eq 'if') { unshift @condition, 0+!!eval "#line $. $ModPerl::MapUtil::MapFile\n".$param; die $@ if $@; } elsif ($cmd eq 'elsif') { die "parse error ($ModPerl::MapUtil::MapFile line $.)". " #_elsif_ without #_if_" unless @condition; if ($condition[0] == 0) { $condition[0]+= !!eval "#line $. $ModPerl::MapUtil::MapFile\n".$param; die $@ if $@; } else { $condition[0]++; } } elsif ($cmd eq 'else') { die "parse error ($ModPerl::MapUtil::MapFile line $.)". " #_elsif_ without #_if_" unless @condition; $condition[0]+=1; } elsif ($cmd eq 'unless') { unshift @condition, 0+!eval "#line $. $ModPerl::MapUtil::MapFile\n".$param; die $@ if $@; } elsif ($cmd eq 'end') { shift @condition; } } next if @condition and $condition[0] != 1; if (/^\s*#\s*_(eval)_(?:\s(.+))?/) { my ($cmd, $param) = ($1, $2); if (defined $param) { while ($param=~s!\\$!!) { my $l=<$fh>; die "$ModPerl::MapUtil::MapFile($.): unexpected EOF\n" unless defined $l; chomp $l; $param.=$l; } } if ($cmd eq 'eval') { eval "#line $. $ModPerl::MapUtil::MapFile\n".$param; die $@ if $@; } next; } s/\s*\#.*//; next unless $_; if (s:\\$::) { my $cur = $_; $_ = $cur . $fh->readline; return $_; } return $_; } } our $MapDir; my $map_classes = join '|', qw(type structure function); sub map_files { my $self = shift; my $package = ref($self) || $self; my ($wanted) = $package =~ /($map_classes)/io; my (@dirs) = (($MapDir || './xs'), ModPerl::MapUtil::xs_glue_dirs()); my @files; for my $dir (map { -d "$_/maps" ? "$_/maps" : $_ } @dirs) { opendir my $dh, $dir or warn "opendir $dir: $!"; for (readdir $dh) { next unless /\.map$/; my $file = "$dir/$_"; if ($wanted) { next unless $file =~ /$wanted/i; } #print "$package => $file\n"; push @files, $file; } closedir $dh; } return @files; } sub parse_keywords { my ($self, $line) = @_; my %words; for my $pair (split /\s+/, $line) { my ($key, $val) = split /=/, $pair; unless ($key and $val) { die "parse error ($ModPerl::MapUtil::MapFile line $.)"; } $words{$key} = $val; } %words; } sub parse_map_files { my ($self) = @_; my $map = {}; for my $file (map_files($self)) { open my $fh, $file or die "open $file: $!"; local $ModPerl::MapUtil::MapFile = $file; bless $fh, __PACKAGE__; @condition=(); # see readline() above $self->parse($fh, $map); close $fh; } return $map; } 1; __END__ mod_perl-2.0.9/lib/ModPerl/MethodLookup.pm0000644000104000010010000025071512540623201021051 0ustar AdministratorsNone# # /* # * *********** WARNING ************** # * This file generated by ModPerl::WrapXS/0.01 # * Any changes made here will be lost # * *********************************** # * 01: lib/ModPerl/Code.pm:716 # * 02: lib/ModPerl/WrapXS.pm:765 # * 03: lib/ModPerl/WrapXS.pm:1189 # * 04: Makefile.PL:435 # * 05: Makefile.PL:333 # * 06: Makefile.PL:59 # */ # package ModPerl::MethodLookup; use strict; use warnings; my $methods = { 'BINMODE' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'CLEAR' => [ [ 'APR::Table', 'APR::Table' ] ], 'CLOSE' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'DELETE' => [ [ 'APR::Table', 'APR::Table' ] ], 'DESTROY' => [ [ 'APR::Pool', 'APR::Pool' ], [ 'APR::ThreadMutex', 'APR::ThreadMutex' ], [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ], [ 'Apache2::SubRequest', 'Apache2::SubRequest' ] ], 'EXISTS' => [ [ 'APR::Table', 'APR::Table' ] ], 'FETCH' => [ [ 'APR::Table', 'APR::Table' ] ], 'FILENO' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'FIRSTKEY' => [ [ 'APR::Table', 'APR::Table' ] ], 'GETC' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'LOG_MARK' => [ [ 'Apache2::Log', undef ] ], 'MODIFY_CODE_ATTRIBUTES' => [ [ 'Apache2::Filter', undef ] ], 'NEXTKEY' => [ [ 'APR::Table', 'APR::Table' ] ], 'OPEN' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'PRINT' => [ [ 'Apache2::Filter', 'Apache2::Filter' ], [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'PRINTF' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'READ' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'STORE' => [ [ 'APR::Table', 'APR::Table' ] ], 'TIEHANDLE' => [ [ 'Apache2::Filter', 'Apache2::Filter' ], [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'UNTIE' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'WRITE' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'aborted' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'add' => [ [ 'APR::Table', 'APR::Table' ], [ 'Apache2::Module', 'Apache2::Module' ] ], 'add_config' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'add_input_filter' => [ [ 'Apache2::Filter', 'Apache2::Connection' ], [ 'Apache2::Filter', 'Apache2::RequestRec' ] ], 'add_output_filter' => [ [ 'Apache2::Filter', 'Apache2::Connection' ], [ 'Apache2::Filter', 'Apache2::RequestRec' ] ], 'add_version_component' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'addrs' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'alert' => [ [ 'Apache2::Log', undef ] ], 'allow_methods' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'allow_options' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'allow_override_opts' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'allow_overrides' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'allowed' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'allowed_methods' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'allowed_xmethods' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'ap_api_major_version' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'ap_api_minor_version' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'ap_auth_type' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'args' => [ [ 'Apache2::Directive', 'Apache2::Directive' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'args_how' => [ [ 'Apache2::Command', 'Apache2::Command' ] ], 'as_hash' => [ [ 'Apache2::Directive', 'Apache2::Directive' ] ], 'as_string' => [ [ 'Apache2::Directive', 'Apache2::Directive' ], [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'assbackwards' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'atime' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'auth_name' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'auth_type' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'base_server' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'bind' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'bucket_alloc' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'bytes_sent' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'c' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'cfg' => [ [ 'ModPerl::TiPool', 'ModPerl::TiPool' ] ], 'check_cmd_context' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'child_terminate' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'cleanup' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'cleanup_for_exec' => [ [ 'APR::Pool', 'APR::Pool' ] ], 'cleanup_register' => [ [ 'APR::Pool', 'APR::Pool' ] ], 'clear' => [ [ 'APR::Pool', 'APR::Pool' ], [ 'APR::Table', 'APR::Table' ] ], 'client_addr' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'client_ip' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'client_socket' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'close' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'cmd' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'cmds' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'compress' => [ [ 'APR::Table', 'APR::Table' ] ], 'concat' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'conftree' => [ [ 'Apache2::Directive', 'Apache2::Directive' ] ], 'conn_config' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'connect' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'connection' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'construct_server' => [ [ 'Apache2::URI', 'Apache2::RequestRec' ] ], 'construct_url' => [ [ 'Apache2::URI', 'Apache2::RequestRec' ] ], 'content_encoding' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'content_languages' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'content_type' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'context' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'copy' => [ [ 'APR::Table', 'APR::Table' ] ], 'crit' => [ [ 'Apache2::Log', undef ] ], 'csize' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'ctime' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'ctx' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'current' => [ [ 'ModPerl::Interpreter', 'ModPerl::Interpreter' ] ], 'current_callback' => [ [ 'ModPerl::Util', 'ModPerl::Util' ] ], 'current_perl_id' => [ [ 'ModPerl::Util', 'ModPerl::Util' ] ], 'current_thread_id' => [ [ 'APR::OS', 'APR::OS' ] ], 'custom_response' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'data' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'debug' => [ [ 'Apache2::Log', undef ] ], 'decode' => [ [ 'APR::Base64', undef ] ], 'delete' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'destroy' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'APR::Bucket', 'APR::Bucket' ], [ 'APR::BucketAlloc', 'APR::BucketAlloc' ], [ 'APR::Pool', 'APR::Pool' ] ], 'device' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'die' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'dir_config' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'directive' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::Directive', 'Apache2::Directive' ] ], 'discard_request_body' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'do' => [ [ 'APR::Table', 'APR::Table' ] ], 'document_root' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'emerg' => [ [ 'Apache2::Log', undef ] ], 'encode' => [ [ 'APR::Base64', undef ] ], 'encode_len' => [ [ 'APR::Base64', 'APR::Base64' ] ], 'eos_create' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'equal' => [ [ 'APR::SockAddr', 'APR::SockAddr' ] ], 'err_headers_out' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'errmsg' => [ [ 'Apache2::Command', 'Apache2::Command' ] ], 'error' => [ [ 'Apache2::Log', undef ] ], 'error_fname' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'error_log2stderr' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'escape_path' => [ [ 'Apache2::Util', 'Apache2::Util' ] ], 'exists_config_define' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'fflush' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'filename' => [ [ 'Apache2::Directive', 'Apache2::Directive' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'filepath_name_get' => [ [ 'APR::Util', 'APR::Util' ] ], 'filetype' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'filter_flush' => [ [ 'Apache2::Filter', 'APR::Brigade' ] ], 'find_linked_module' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'finfo' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'first' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'first_child' => [ [ 'Apache2::Directive', 'Apache2::Directive' ] ], 'flatten' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'flush_create' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'fname' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'format' => [ [ 'APR::UUID', undef ] ], 'format_size' => [ [ 'APR::String', 'APR::String' ] ], 'fragment' => [ [ 'APR::URI', 'APR::URI' ] ], 'frec' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'get' => [ [ 'APR::Table', undef ] ], 'get_basic_auth_pw' => [ [ 'Apache2::Access', undef ] ], 'get_brigade' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'get_client_block' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'get_config' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'get_handlers' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'get_limit_req_body' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'get_remote_host' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'get_remote_logname' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'get_server_banner' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'get_server_description' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'get_server_name' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'get_server_port' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'get_server_version' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'get_status_line' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestUtil' ] ], 'group' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'group_id' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'handler' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'header_only' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'headers_in' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'headers_out' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'hostinfo' => [ [ 'APR::URI', 'APR::URI' ] ], 'hostname' => [ [ 'APR::URI', 'APR::URI' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'ht_time' => [ [ 'Apache2::Util', 'Apache2::Util' ] ], 'id' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'in_use' => [ [ 'ModPerl::TiPool', 'ModPerl::TiPool' ] ], 'info' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::Log', undef ] ], 'inode' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'input_filters' => [ [ 'Apache2::Connection', 'Apache2::Connection' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'insert_after' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'insert_before' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'insert_head' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'insert_tail' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'internal_fast_redirect' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'internal_redirect' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'internal_redirect_handler' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'invoke_handler' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'ip_get' => [ [ 'APR::SockAddr', 'APR::SockAddr' ] ], 'is_EACCES' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_EAGAIN' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_ECONNABORTED' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_ECONNRESET' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_ENOENT' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_EOF' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_TIMEUP' => [ [ 'APR::Status', 'APR::Status' ] ], 'is_ancestor' => [ [ 'APR::Pool', 'APR::Pool' ] ], 'is_empty' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'is_eos' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'is_flush' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'is_initial_req' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'is_perl_option_enabled' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'is_virtual' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'keep_alive' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'keep_alive_max' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'keep_alive_timeout' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'keepalive' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'keepalives' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'last' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'length' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'APR::Bucket', 'APR::Bucket' ] ], 'limit_req_fields' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'limit_req_fieldsize' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'limit_req_line' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'line_num' => [ [ 'Apache2::Directive', 'Apache2::Directive' ] ], 'listen' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'loaded' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'local_addr' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'local_host' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'local_ip' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'location' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'location_merge' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'lock' => [ [ 'APR::ThreadMutex', 'APR::ThreadMutex' ] ], 'log' => [ [ 'Apache2::Log', 'Apache2::RequestRec' ], [ 'Apache2::Log', 'Apache2::ServerRec' ] ], 'log_error' => [ [ 'Apache2::Log', undef ], [ 'Apache2::Log', undef ] ], 'log_id' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'log_pid' => [ [ 'Apache2::Log', 'Apache2::Log' ] ], 'log_reason' => [ [ 'Apache2::Log', 'Apache2::RequestRec' ] ], 'log_rerror' => [ [ 'Apache2::Log', undef ] ], 'log_serror' => [ [ 'Apache2::Log', undef ] ], 'loglevel' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'lookup' => [ [ 'Apache2::Directive', undef ] ], 'lookup_defaults' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'lookup_dirent' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'lookup_file' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'lookup_method_uri' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'lookup_uri' => [ [ 'Apache2::SubRequest', 'Apache2::RequestRec' ] ], 'main' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'make' => [ [ 'APR::Table', 'APR::Table' ] ], 'make_etag' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'max' => [ [ 'ModPerl::TiPoolConfig', 'ModPerl::TiPoolConfig' ] ], 'max_requests' => [ [ 'ModPerl::TiPoolConfig', 'ModPerl::TiPoolConfig' ] ], 'max_spare' => [ [ 'ModPerl::TiPoolConfig', 'ModPerl::TiPoolConfig' ] ], 'meets_conditions' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'merge' => [ [ 'APR::Table', 'APR::Table' ] ], 'method' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'method_is_limited' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'method_number' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'method_register' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'min_spare' => [ [ 'ModPerl::TiPoolConfig', 'ModPerl::TiPoolConfig' ] ], 'mip' => [ [ 'ModPerl::Interpreter', 'ModPerl::Interpreter' ] ], 'module_config' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'module_index' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'mtime' => [ [ 'APR::Finfo', 'APR::Finfo' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'name' => [ [ 'APR::BucketType', 'APR::BucketType' ], [ 'APR::Finfo', 'APR::Finfo' ], [ 'Apache2::Command', 'Apache2::Command' ], [ 'Apache2::FilterRec', 'Apache2::FilterRec' ], [ 'Apache2::Module', 'Apache2::Module' ] ], 'names' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'new' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'APR::Bucket', 'APR::Bucket' ], [ 'APR::BucketAlloc', 'APR::BucketAlloc' ], [ 'APR::IpSubnet', 'APR::IpSubnet' ], [ 'APR::Pool', 'APR::Pool' ], [ 'APR::ThreadMutex', 'APR::ThreadMutex' ], [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ], [ 'APR::UUID', 'APR::UUID' ], [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'next' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'Apache2::Command', 'Apache2::Command' ], [ 'Apache2::Directive', 'Apache2::Directive' ], [ 'Apache2::Filter', 'Apache2::Filter' ], [ 'Apache2::Module', 'Apache2::Module' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ], [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'nlink' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'no_cache' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'no_local_copy' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'note_auth_failure' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'note_basic_auth_failure' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'note_digest_auth_failure' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'notes' => [ [ 'Apache2::Connection', 'Apache2::Connection' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'notice' => [ [ 'Apache2::Log', undef ] ], 'num_requests' => [ [ 'ModPerl::Interpreter', 'ModPerl::Interpreter' ] ], 'opt_get' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'opt_set' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'output_filters' => [ [ 'Apache2::Connection', 'Apache2::Connection' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'overlap' => [ [ 'APR::Table', 'APR::Table' ] ], 'overlay' => [ [ 'APR::Table', 'APR::Table' ] ], 'override' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'override_opts' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'parent' => [ [ 'Apache2::Directive', 'Apache2::Directive' ], [ 'ModPerl::InterpPool', 'ModPerl::InterpPool' ] ], 'parent_get' => [ [ 'APR::Pool', 'APR::Pool' ] ], 'parse' => [ [ 'APR::URI', 'APR::URI' ], [ 'APR::UUID', 'APR::UUID' ] ], 'parse_http' => [ [ 'APR::Date', 'APR::Date' ] ], 'parse_rfc' => [ [ 'APR::Date', 'APR::Date' ] ], 'parse_uri' => [ [ 'Apache2::URI', 'Apache2::RequestRec' ] ], 'parsed_uri' => [ [ 'Apache2::URI', 'Apache2::RequestRec' ] ], 'pass_brigade' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'password' => [ [ 'APR::URI', 'APR::URI' ] ], 'password_get' => [ [ 'APR::Util', 'APR::Util' ] ], 'password_validate' => [ [ 'APR::Util', 'APR::Util' ] ], 'path' => [ [ 'APR::URI', 'APR::URI' ], [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'path_info' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'pconf' => [ [ 'Apache2::Process', 'Apache2::Process' ] ], 'per_dir_config' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'perl' => [ [ 'ModPerl::Interpreter', 'ModPerl::Interpreter' ] ], 'pnotes' => [ [ 'Apache2::ConnectionUtil', 'Apache2::Connection' ], [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'pnotes_kill' => [ [ 'Apache2::ConnectionUtil', 'Apache2::Connection' ], [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'poll' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'pool' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::Connection', 'Apache2::Connection' ], [ 'Apache2::Process', 'Apache2::Process' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'pool_get' => [ [ 'APR::ThreadMutex', 'APR::ThreadMutex' ], [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ], 'port' => [ [ 'APR::SockAddr', 'APR::SockAddr' ], [ 'APR::URI', 'APR::URI' ], [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'port_of_scheme' => [ [ 'APR::URI', 'APR::URI' ] ], 'prev' => [ [ 'APR::Brigade', 'APR::Brigade' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'print' => [ [ 'Apache2::Filter', 'Apache2::Filter' ], [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'printf' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'process' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'protection' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'proto_input_filters' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'proto_num' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'proto_output_filters' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'protocol' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'proxyreq' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'psignature' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'push_handlers' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'puts' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'query' => [ [ 'APR::URI', 'APR::URI' ], [ 'Apache2::MPM', 'Apache2::MPM' ] ], 'r' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'rationalize_mtime' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'rdlock' => [ [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ], 'read' => [ [ 'APR::Bucket', 'APR::Bucket' ], [ 'Apache2::Filter', 'Apache2::Filter' ], [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'recv' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'recvfrom' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'refcnt' => [ [ 'ModPerl::Interpreter', 'ModPerl::Interpreter' ] ], 'register_auth_provider' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestUtil' ] ], 'register_provider' => [ [ 'Apache2::Provider', 'Apache2::Provider' ] ], 'remote_host' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'remove' => [ [ 'APR::Bucket', 'APR::Bucket' ], [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'remove_loaded_module' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'req_override' => [ [ 'Apache2::Command', 'Apache2::Command' ] ], 'request' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestUtil' ] ], 'request_config' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'request_time' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'restart_count' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'rflush' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'rpath' => [ [ 'APR::URI', 'APR::URI' ] ], 'run' => [ [ 'Apache2::SubRequest', 'Apache2::SubRequest' ] ], 'run_access_checker' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_auth_checker' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_check_user_id' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_fixups' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_handler' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_header_parser' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_log_transaction' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_map_to_storage' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_post_read_request' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_translate_name' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'run_type_checker' => [ [ 'Apache2::HookRun', 'Apache2::RequestRec' ] ], 'satisfies' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'sbh' => [ [ 'Apache2::Connection', 'Apache2::Connection' ] ], 'scheme' => [ [ 'APR::URI', 'APR::URI' ] ], 'seen_eos' => [ [ 'Apache2::Filter', 'Apache2::Filter' ] ], 'send' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'send_cgi_header' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'send_error_response' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'send_mmap' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'sendfile' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'sendto' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'server' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ], [ 'ModPerl::InterpPool', 'ModPerl::InterpPool' ] ], 'server_admin' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'server_hostname' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'server_root_relative' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'server_scheme' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'server_shutdown_cleanup_register' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'set' => [ [ 'APR::Table', 'APR::Table' ] ], 'set_basic_credentials' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'set_content_length' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'set_etag' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'set_handlers' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ], [ 'Apache2::ServerUtil', 'Apache2::ServerRec' ] ], 'set_keepalive' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'set_last_modified' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'setaside' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'setup_client_block' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'short_name' => [ [ 'Apache2::Process', 'Apache2::Process' ] ], 'should_client_block' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'size' => [ [ 'APR::Finfo', 'APR::Finfo' ], [ 'ModPerl::TiPool', 'ModPerl::TiPool' ] ], 'slurp_filename' => [ [ 'Apache2::RequestUtil', 'Apache2::RequestRec' ] ], 'some_auth_required' => [ [ 'Apache2::Access', 'Apache2::RequestRec' ] ], 'spawn_proc_prog' => [ [ 'Apache2::SubProcess', undef ] ], 'special_list_call' => [ [ 'ModPerl::Global', 'ModPerl::Global' ] ], 'special_list_clear' => [ [ 'ModPerl::Global', 'ModPerl::Global' ] ], 'special_list_register' => [ [ 'ModPerl::Global', 'ModPerl::Global' ] ], 'split' => [ [ 'APR::Brigade', 'APR::Brigade' ] ], 'start' => [ [ 'APR::Bucket', 'APR::Bucket' ], [ 'ModPerl::TiPoolConfig', 'ModPerl::TiPoolConfig' ] ], 'stat' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'status' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'status_line' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'strerror' => [ [ 'APR::Error', 'APR::Error' ] ], 'subprocess_env' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'tag' => [ [ 'APR::Pool', 'APR::Pool' ] ], 'temp_pool' => [ [ 'Apache2::CmdParms', 'Apache2::CmdParms' ] ], 'test' => [ [ 'APR::IpSubnet', 'APR::IpSubnet' ] ], 'the_request' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'timeout' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'timeout_get' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'timeout_set' => [ [ 'APR::Socket', 'APR::Socket' ] ], 'tipool' => [ [ 'ModPerl::InterpPool', 'ModPerl::InterpPool' ] ], 'top_module' => [ [ 'Apache2::Module', 'Apache2::Module' ] ], 'trylock' => [ [ 'APR::ThreadMutex', 'APR::ThreadMutex' ] ], 'tryrdlock' => [ [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ], 'trywrlock' => [ [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ], 'type' => [ [ 'APR::Bucket', 'APR::Bucket' ] ], 'unescape_url' => [ [ 'Apache2::URI', 'Apache2::URI' ] ], 'unload_package_xs' => [ [ 'ModPerl::Util', 'ModPerl::Util' ] ], 'unlock' => [ [ 'APR::ThreadMutex', 'APR::ThreadMutex' ], [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ], 'unparse' => [ [ 'APR::URI', 'APR::URI' ] ], 'unparsed_uri' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'unset' => [ [ 'APR::Table', 'APR::Table' ] ], 'untaint' => [ [ 'ModPerl::Util', 'ModPerl::Util' ] ], 'update_mtime' => [ [ 'Apache2::Response', 'Apache2::RequestRec' ] ], 'uri' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'used_path_info' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'user' => [ [ 'APR::Finfo', 'APR::Finfo' ], [ 'APR::URI', 'APR::URI' ], [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'user_id' => [ [ 'Apache2::ServerUtil', 'Apache2::ServerUtil' ] ], 'useragent_addr' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'useragent_ip' => [ [ 'Apache2::RequestRec', 'Apache2::RequestRec' ] ], 'valid' => [ [ 'APR::Finfo', 'APR::Finfo' ] ], 'warn' => [ [ 'Apache2::Log', undef ], [ 'Apache2::Log', undef ], [ 'Apache2::Log', undef ] ], 'wild_names' => [ [ 'Apache2::ServerRec', 'Apache2::ServerRec' ] ], 'write' => [ [ 'Apache2::RequestIO', 'Apache2::RequestRec' ] ], 'wrlock' => [ [ 'APR::ThreadRWLock', 'APR::ThreadRWLock' ] ] }; use base qw(Exporter); use mod_perl2; our @EXPORT = qw(print_method print_module print_object); our $VERSION = $mod_perl2::VERSION; use constant MODULE => 0; use constant OBJECT => 1; my $modules; my $objects; sub _get_modules { for my $method (sort keys %$methods) { for my $item ( @{ $methods->{$method} }) { push @{ $modules->{$item->[MODULE]} }, [$method, $item->[OBJECT]]; } } } sub _get_objects { for my $method (sort keys %$methods) { for my $item ( @{ $methods->{$method} }) { next unless defined $item->[OBJECT]; push @{ $objects->{$item->[OBJECT]} }, [$method, $item->[MODULE]]; } } } # if there is only one replacement method in 2.0 API we can # automatically lookup it, up however if there are more than one # (e.g. new()), we need to use a fully qualified value here # of course the same if the package is not a mod_perl one. # # the first field represents the replacement method or undef if none # exists, the second field is for extra comments (e.g. when there is # no replacement method) my $methods_compat = { # Apache2:: gensym => ['Symbol::gensym', 'or use "open my $fh, $file"'], module => ['Apache2::Module::loaded', ''], define => ['exists_config_define', ''], httpd_conf => ['add_config', ''], SERVER_VERSION => ['get_server_version', ''], can_stack_handlers=> [undef, 'there is no more need for that method in mp2'], # Apache2::RequestRec soft_timeout => [undef, 'there is no more need for that method in mp2'], hard_timeout => [undef, 'there is no more need for that method in mp2'], kill_timeout => [undef, 'there is no more need for that method in mp2'], reset_timeout => [undef, 'there is no more need for that method in mp2'], cleanup_for_exec => [undef, 'there is no more need for that method in mp2'], send_http_header => ['content_type', ''], header_in => ['headers_in', 'this method works in mod_perl 1.0 too'], header_out => ['headers_out', 'this method works in mod_perl 1.0 too'], err_header_out => ['err_headers_out', 'this method works in mod_perl 1.0 too'], register_cleanup => ['cleanup_register', ''], post_connection => ['cleanup_register', ''], content => [undef, # XXX: Apache2::Request::what? 'use CGI.pm or Apache2::Request instead'], clear_rgy_endav => ['special_list_clear', ''], stash_rgy_endav => [undef, ''], run_rgy_endav => ['special_list_call', 'this method is no longer needed'], seqno => [undef, 'internal to mod_perl 1.0'], chdir_file => [undef, # XXX: to be resolved 'temporary unavailable till the issue with chdir' . ' in the threaded env is resolved'], log_reason => ['log_error', 'not in the Apache 2.0 API'], READLINE => [undef, # XXX: to be resolved ''], send_fd_length => [undef, 'not in the Apache 2.0 API'], send_fd => ['sendfile', 'requires an offset argument'], is_main => ['main', 'not in the Apache 2.0 API'], cgi_var => ['subprocess_env', 'subprocess_env can be used with mod_perl 1.0'], cgi_env => ['subprocess_env', 'subprocess_env can be used with mod_perl 1.0'], each_byterange => [undef, 'now handled internally by ap_byterange_filter'], set_byterange => [undef, 'now handled internally by ap_byterange_filter'], # Apache::File open => [undef, ''], close => [undef, # XXX: also defined in APR::Socket ''], tmpfile => [undef, 'not in the Apache 2.0 API, ' . 'use File::Temp instead'], # Apache::Util size_string => ['format_size', ''], escape_uri => ['unescape_path', ''], escape_url => ['escape_path', 'and requires a pool object'], unescape_uri => ['unescape_url', ''], unescape_url_info => [undef, 'use CGI::Util::unescape() instead'], escape_html => [undef, # XXX: will be ap_escape_html 'ap_escape_html now requires a pool object'], parsedate => ['parse_http', ''], validate_password => ['password_validate', ''], # Apache::Table #new => ['make', # ''], # XXX: there are other 'new' methods # Apache::Connection auth_type => ['ap_auth_type', 'now resides in the request object'], }; sub avail_methods_compat { return keys %$methods_compat; } sub avail_methods { return keys %$methods; } sub avail_modules { my %modules = (); for my $method (keys %$methods) { for my $item ( @{ $methods->{$method} }) { $modules{$item->[MODULE]}++; } } return keys %modules; } sub preload_all_modules { _get_modules() unless $modules; eval "require $_" for sort keys %$modules; } sub _print_func { my $func = shift; my @args = @_ ? @_ : @ARGV; no strict 'refs'; print( ($func->($_))[0]) for @args; } sub print_module { _print_func('lookup_module', @_) } sub print_object { _print_func('lookup_object', @_) } sub print_method { my @args = @_ ? @_ : @ARGV; while (@args) { my $method = shift @args; my $object = (@args && (ref($args[0]) || $args[0] =~ /^(Apache2|ModPerl|APR)/)) ? shift @args : undef; print( (lookup_method($method, $object))[0]); } } sub sep { return '-' x (shift() + 20) . "\n" } # what modules contain the passed method. # an optional object or a reference to it can be passed to help # resolve situations where there is more than one module containing # the same method. Inheritance is supported. sub lookup_method { my ($method, $object) = @_; unless (defined $method) { my $hint = "No 'method' argument was passed\n"; return ($hint); } # strip the package name for the fully qualified method $method =~ s/.+:://; if (exists $methods_compat->{$method}) { my ($replacement, $comment) = @{$methods_compat->{$method}}; my $hint = "'$method' is not a part of the mod_perl 2.0 API\n"; $comment = length $comment ? " $comment\n" : ""; # some removed methods have no replacement return $hint . "$comment" unless defined $replacement; $hint .= "use '$replacement' instead. $comment"; # if fully qualified don't look up its container return $hint if $replacement =~ /::/; my ($modules_hint, @modules) = lookup_method($replacement, $object); return $hint . $modules_hint; } elsif (!exists $methods->{$method}) { my $hint = "Don't know anything about method '$method'\n"; return ($hint); } my @items = @{ $methods->{$method} }; if (@items == 1) { my $module = $items[0]->[MODULE]; my $hint = "To use method '$method' add:\n" . "\tuse $module ();\n"; # we should really check that the method matches the object if # any was passed, but it may not always work return ($hint, $module); } else { if (defined $object) { my $class = ref $object || $object; for my $item (@items) { # real class or inheritance if ($class eq $item->[OBJECT] or (ref($object) && $object->isa($item->[OBJECT]))) { my $module = $item->[MODULE]; my $hint = "To use method '$method' add:\n" . "\tuse $module ();\n"; return ($hint, $module); } } # fall-through local $" = ", "; my @modules = map $_->[MODULE], @items; my $hint = "Several modules (@modules) contain method '$method' " . "but none of them matches class '$class';\n"; return ($hint); } else { my %modules = map { $_->[MODULE] => 1 } @items; # remove dups if any (e.g. $s->add_input_filter and # $r->add_input_filter are loaded by the same Apache2::Filter) my @modules = sort keys %modules; my $hint; if (@modules == 1) { $hint = "To use method '$method' add:\n\tuse $modules[0] ();\n"; return ($hint, $modules[0]); } else { $hint = "There is more than one class with method '$method'\n" . "try one of:\n" . join '', map {"\tuse $_ ();\n"} @modules; return ($hint, @modules); } } } } # what methods are contained in the passed module name sub lookup_module { my ($module) = shift; unless (defined $module) { my $hint = "no 'module' argument was passed\n"; return ($hint); } _get_modules() unless $modules; unless (exists $modules->{$module}) { my $hint = "don't know anything about module '$module'\n"; return ($hint); } my @methods; my $max_len = 6; for ( @{ $modules->{$module} } ) { $max_len = length $_->[0] if length $_->[0] > $max_len; push @methods, $_->[0]; } my $format = "%-${max_len}s %s\n"; my $banner = sprintf($format, "Method", "Invoked on object type"); my $hint = join '', ("\nModule '$module' contains the following XS methods:\n\n", $banner, sep(length($banner)), map( { sprintf $format, $_->[0], $_->[1]||'???'} @{ $modules->{$module} }), sep(length($banner))); return ($hint, @methods); } # what methods can be invoked on the passed object (or its reference) sub lookup_object { my ($object) = shift; unless (defined $object) { my $hint = "no 'object' argument was passed\n"; return ($hint); } _get_objects() unless $objects; # a real object was passed? $object = ref $object || $object; unless (exists $objects->{$object}) { my $hint = "don't know anything about objects of type '$object'\n"; return ($hint); } my @methods; my $max_len = 6; for ( @{ $objects->{$object} } ) { $max_len = length $_->[0] if length $_->[0] > $max_len; push @methods, $_->[0]; } my $format = "%-${max_len}s %s\n"; my $banner = sprintf($format, "Method", "Module"); my $hint = join '', ("\nObjects of type '$object' can invoke the following XS methods:\n\n", $banner, sep(length($banner)), map({ sprintf $format, $_->[0], $_->[1]} @{ $objects->{$object} }), sep(length($banner))); return ($hint, @methods); } 1; mod_perl-2.0.9/lib/ModPerl/MM.pm0000644000104000010010000001262612540623201016745 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::MM; use strict; use warnings; use ExtUtils::MakeMaker (); use ExtUtils::Install (); use Cwd (); use Carp; our %PM; #add files to installation # MM methods that this package overrides no strict 'refs'; my $stash = \%{__PACKAGE__ . '::MY::'}; my @methods = grep *{$stash->{$_}}{CODE}, keys %$stash; my $eu_mm_mv_all_methods_overriden = 0; use strict 'refs'; sub override_eu_mm_mv_all_methods { my @methods = @_; my $orig_sub = \&ExtUtils::MakeMaker::mv_all_methods; no warnings 'redefine'; *ExtUtils::MakeMaker::mv_all_methods = sub { # do the normal move $orig_sub->(@_); # for all the overloaded methods mv_all_method installs a stab # eval "package MY; sub $method { shift->SUPER::$method(\@_); }"; # therefore we undefine our methods so on the recursive invocation of # Makefile.PL they will be undef, unless defined in Makefile.PL # and my_import will override these methods properly for my $sym (@methods) { my $name = "MY::$sym"; undef &$name if defined &$name; } }; } sub add_dep { my ($string, $targ, $add) = @_; $$string =~ s/($targ\s+::)/$1 $add/; } sub add_dep_before { my ($string, $targ, $before_targ, $add) = @_; $$string =~ s/($targ\s+::.*?) ($before_targ)/$1 $add $2/; } sub add_dep_after { my ($string, $targ, $after_targ, $add) = @_; $$string =~ s/($targ\s+::.*?$after_targ)/$1 $add/; } my $build; sub build_config { my $key = shift; require Apache2::Build; $build ||= Apache2::Build->build_config; return $build unless $key; $build->{$key}; } #the parent WriteMakefile moves MY:: methods into a different class #so alias them each time WriteMakefile is called in a subdir sub my_import { my $package = shift; no strict 'refs'; my $stash = \%{$package . '::MY::'}; for my $sym (keys %$stash) { next unless *{$stash->{$sym}}{CODE}; my $name = "MY::$sym"; # the method is defined in Makefile.PL next if defined &$name; # do the override behind the scenes *$name = *{$stash->{$sym}}{CODE}; } } my @default_opts = qw(CCFLAGS LIBS INC OPTIMIZE LDDLFLAGS TYPEMAPS); my @default_dlib_opts = qw(OTHERLDFLAGS); my @default_macro_opts = (); my %opts = ( CCFLAGS => sub { $build->{MODPERL_CCOPTS} }, LIBS => sub { join ' ', $build->apache_libs, $build->modperl_libs }, INC => sub { $build->inc; }, OPTIMIZE => sub { $build->perl_config('optimize'); }, LDDLFLAGS => sub { $build->perl_config('lddlflags'); }, TYPEMAPS => sub { $build->typemaps; }, OTHERLDFLAGS => sub { $build->otherldflags; }, ); sub get_def_opt { my $opt = shift; return $opts{$opt}->() if exists $opts{$opt}; # handle cases when Makefile.PL wants an option we don't have a # default for. XXX: some options expect [] rather than scalar. Carp::carp("!!! no default argument defined for argument: $opt"); return ''; } sub WriteMakefile { my %args = @_; # override ExtUtils::MakeMaker::mv_all_methods # can't do that on loading since ModPerl::MM is also use()'d # by ModPerl::BuildMM which itself overrides it unless ($eu_mm_mv_all_methods_overriden) { override_eu_mm_mv_all_methods(@methods); $eu_mm_mv_all_methods_overriden++; } $build ||= build_config(); my_import(__PACKAGE__); # set top-level WriteMakefile's values if weren't set already for my $o (@default_opts) { $args{$o} = get_def_opt($o) unless exists $args{$o}; # already defined } # set dynamic_lib-level WriteMakefile's values if weren't set already $args{dynamic_lib} ||= {}; my $dlib = $args{dynamic_lib}; for my $o (@default_dlib_opts) { $dlib->{$o} = get_def_opt($o) unless exists $dlib->{$o}; } # set macro-level WriteMakefile's values if weren't set already $args{macro} ||= {}; my $macro = $args{macro}; for my $o (@default_macro_opts) { $macro->{$o} = get_def_opt($o) unless exists $macro->{$o}; } ExtUtils::MakeMaker::WriteMakefile(%args); } #### MM overrides #### sub ModPerl::MM::MY::post_initialize { my $self = shift; $build ||= build_config(); my $pm = $self->{PM}; while (my ($k, $v) = each %PM) { if (-e $k) { $pm->{$k} = $v; } } ''; } 1; mod_perl-2.0.9/lib/ModPerl/ParseSource.pm0000644000104000010010000000407012540623201020661 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::ParseSource; use strict; use Config (); use Apache2::ParseSource (); our @ISA = qw(Apache2::ParseSource); our $VERSION = '0.01'; sub includes { my $self = shift; my $dirs = $self->SUPER::includes; return [ '.', qw(xs src/modules/perl), @$dirs, "$Config::Config{archlibexp}/CORE", ]; } sub include_dirs { '.' } sub find_includes { my $self = shift; my $includes = $self->SUPER::find_includes; #filter/sort my @wanted = grep { /mod_perl\.h/ } @$includes; push @wanted, grep { m:xs/modperl_xs_: } @$includes; push @wanted, grep { m:xs/[AM]: } @$includes; \@wanted; } my $prefixes = join '|', qw(modperl mpxs mp_xs); my $prefix_re = qr{^($prefixes)_}; sub wanted_functions { $prefix_re } sub write_functions_pm { my $self = shift; my $file = shift || 'FunctionTable.pm'; my $name = shift || 'ModPerl::FunctionTable'; $self->SUPER::write_functions_pm($file, $name); } for my $method (qw(get_constants get_structs write_structs_pm get_structs)) { no strict 'refs'; *$method = sub { die __PACKAGE__ . "->$method not implemented" }; } 1; __END__ mod_perl-2.0.9/lib/ModPerl/StructureMap.pm0000644000104000010010000001024012540623201021060 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::StructureMap; use strict; use warnings FATAL => 'all'; use ModPerl::MapUtil qw(structure_table); our @ISA = qw(ModPerl::MapBase); sub new { my $class = shift; bless {}, $class; } sub generate { my $self = shift; my $map = $self->get; for my $entry (@{ structure_table() }) { my $type = $entry->{type}; my $elts = $entry->{elts}; next unless @$elts; next if $type =~ $self->{IGNORE_RE}; next unless grep { not exists $map->{$type}->{ $_->{name} } } @$elts; print "<$type>\n"; for my $e (@$elts) { print " $e->{name}\n"; } print "\n\n"; } } sub disabled { shift->{disabled} } sub check { my $self = shift; my $map = $self->get; my @missing; for my $entry (@{ structure_table() }) { my $type = $entry->{type}; for my $name (map $_->{name}, @{ $entry->{elts} }) { next if exists $map->{$type}->{$name}; next if $type =~ $self->{IGNORE_RE}; push @missing, "$type.$name"; } } return @missing ? \@missing : undef; } sub check_exists { my $self = shift; my %structures; for my $entry (@{ structure_table() }) { $structures{ $entry->{type} } = { map { $_->{name}, 1 } @{ $entry->{elts} } }; } my @missing; while (my ($type, $elts) = each %{ $self->{map} }) { for my $name (keys %$elts) { next if exists $structures{$type}->{$name}; push @missing, "$type.$name"; } } return @missing ? \@missing : undef; } sub parse { my ($self, $fh, $map) = @_; my ($disabled, $class); my %cur; while ($fh->readline) { if (m:^(\W?)]+)>:) { my $args; $disabled = $1; ($class, $args) = split /\s+/, $2, 2; %cur = (); if ($args and $args =~ /E=/) { %cur = $self->parse_keywords($args); } $self->{MODULES}->{$class} = $cur{MODULE} if $cur{MODULE}; next; } elsif (s/^(\w+):\s*//) { push @{ $self->{$1} }, split /\s+/; next; } if (s/^(\W)\s*// or $disabled) { # < denotes a read-only accessor if ($1) { if ($1 eq '<') { $map->{$class}->{$_} = 'ro'; } elsif ($1 eq '&') { $map->{$class}->{$_} = 'rw_char_undef'; } elsif ($1 eq '$') { $map->{$class}->{$_} = 'r+w_startup'; } elsif ($1 eq '%') { $map->{$class}->{$_} = 'r+w_startup_dup'; } } else { $map->{$class}->{$_} = undef; push @{ $self->{disabled}->{ $1 || '!' } }, "$class.$_"; } } else { $map->{$class}->{$_} = 'rw'; } } if (my $ignore = $self->{IGNORE}) { $ignore = join '|', @$ignore; $self->{IGNORE_RE} = qr{^($ignore)}; } else { $self->{IGNORE_RE} = qr{^$}; } } sub get { my $self = shift; $self->{map} ||= $self->parse_map_files; } 1; __END__ mod_perl-2.0.9/lib/ModPerl/TestReport.pm0000644000104000010010000000546112540623201020546 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::TestReport; use strict; use warnings FATAL => 'all'; use base qw(Apache::TestReportPerl); use ExtUtils::MakeMaker (); my @interesting_packages = qw( CGI ExtUtils::MakeMaker Apache2::Request mod_perl2 LWP Apache2 mod_perl ); # we want to see only already installed packages, so skip over # modules that are about to be installed my @skip_dirs = qw( blib/lib blib/arch lib ); my $skip_dir_str = join '|', map { s|/|[/\\\\]|g; $_ } @skip_dirs; my $skip_dir_pat = qr|[/\\]($skip_dir_str)[/\\]*$|; sub packages { my @inc = grep !/$skip_dir_pat/, @INC; my %packages = (); my $max_len = 0; for my $package (sort @interesting_packages ) { $max_len = length $package if length $package > $max_len; my $filename = package2filename($package); my @ver = (); for my $dir (@inc) { my $path = "$dir/$filename"; if (-e $path) { my $ver = MM->parse_version($path); # two versions could be installed (one under Apache2/) push @{ $packages{$package} }, $ver if $ver; } } } my @lines = "*** Packages of interest status:\n"; for my $package (sort @interesting_packages) { my $vers = exists $packages{$package} ? join ", ", sort @{ $packages{$package} } : "-"; push @lines, sprintf "%-${max_len}s: %s", $package, $vers; } return join "\n", @lines, ''; } sub config { my $self = shift; my @report = (); # core config push @report, ModPerl::Config::as_string(); # installed packages push @report, $self->packages; # this report is generated by user/group return join "\n", @report; } sub package2filename { my $package = shift; $package =~ s|::|/|g; $package .= ".pm"; return $package; } sub report_to { 'modperl@perl.apache.org' } 1; mod_perl-2.0.9/lib/ModPerl/TestRun.pm0000644000104000010010000000453312540623201020036 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::TestRun; use strict; use warnings FATAL => 'all'; use base qw(Apache::TestRunPerl); use Apache2::Build; # some mp2 tests require more than one server instance to be available # without which the server may hang, waiting for the single server # become available use constant MIN_CLIENTS => 2; sub new_test_config { my $self = shift; # default timeout in secs (threaded mpms are extremely slow to # startup, due to a slow perl_clone operation) $self->{conf_opts}->{startup_timeout} ||= $ENV{APACHE_TEST_STARTUP_TIMEOUT} || Apache2::Build->build_config->mpm_is_threaded() ? 300 : 120; $self->{conf_opts}->{minclients} ||= MIN_CLIENTS; ModPerl::TestConfig->new($self->{conf_opts}); } sub bug_report { my $self = shift; print <SUPER::new(@_); my $config = Apache2::Build->build_config; $self->{conf_opts}->{httpd} ||= $config->{httpd}; return $self; } # - don't inherit LoadModule perl_module from the apache httpd.conf # - loaded fastcgi crashes some mp2 tests my @skip = ('mod_perl.c', qr/mod_fastcgi.*?\.c$/); Apache::TestConfig::autoconfig_skip_module_add(@skip); 1; mod_perl-2.0.9/lib/ModPerl/TypeMap.pm0000644000104000010010000003143712540623201020014 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::TypeMap; use strict; use warnings FATAL => 'all'; use ModPerl::FunctionMap (); use ModPerl::StructureMap (); use ModPerl::MapUtil qw(list_first); our @ISA = qw(ModPerl::MapBase); sub new { my $class = shift; my $self = bless { INCLUDE => [], struct => [], typedef => [], }, $class; $self->{function_map} = ModPerl::FunctionMap->new, $self->{structure_map} = ModPerl::StructureMap->new, $self->get; $self; } my %special = map { $_, 1 } qw(UNDEFINED NOTIMPL CALLBACK); sub special { my ($self, $class) = @_; return $special{$class}; } sub function_map { shift->{function_map}->get } sub structure_map { shift->{structure_map}->get } sub parse { my ($self, $fh, $map) = @_; while ($fh->readline) { if (/E=/) { my %args = $self->parse_keywords($_); while (my ($key,$val) = each %args) { push @{ $self->{$key} }, $val; } next; } my @aliases; my ($type, $class) = (split /\s*\|\s*/, $_)[0,1]; $class ||= 'UNDEFINED'; if ($type =~ s/^(struct|typedef)\s+(.*)/$2/) { my $typemap = $1; push @aliases, $type; if ($typemap eq 'struct') { push @aliases, "const $type", "$type *", "const $type *", "struct $type *", "const struct $type *", "$type **"; } my $cname = $class; if ($cname =~ s/::/__/g) { push @{ $self->{$typemap} }, [$type, $cname]; } } elsif ($type =~ /_t$/) { push @aliases, $type, "$type *", "const $type *"; } else { push @aliases, $type; } for (@aliases) { $map->{$_} = $class; } } } sub get { my $self = shift; $self->{map} ||= $self->parse_map_files; } my $ignore = join '|', qw{ ap_LINK ap_HOOK _ UINT union._ union.block_hdr cleanup process_chain iovec struct.rlimit Sigfunc in_addr_t }; sub should_ignore { my ($self, $type) = @_; return 1 if $type =~ /^($ignore)/o; } sub is_callback { my ($self, $type) = @_; return 1 if $type =~ /\(/ and $type =~ /\)/; #XXX: callback } sub exists { my ($self, $type) = @_; return 1 if $self->is_callback($type) || $self->should_ignore($type); $type =~ s/\[\d+\]$//; #char foo[64] return exists $self->get->{$type}; } sub map_type { my ($self, $type) = @_; my $class = $self->get->{$type}; return unless $class and ! $self->special($class); # return if $type =~ /\*\*$/; #XXX if ($class =~ /::/) { return $class; } else { return $type; } } sub null_type { my ($self, $type) = @_; my $class = $self->get->{$type}; if ($class =~ /^[INU]V/) { return '0'; } else { return 'NULL'; } } sub can_map { my $self = shift; my $map = shift; return 1 if $map->{argspec}; for (@_) { return (0, $_) unless $self->map_type($_); } return 1; } sub map_arg { my ($self, $arg) = @_; my $map_type = $self->map_type($arg->{type}); die "unknown typemap: '$arg->{type}'" unless defined $map_type; return { name => $arg->{name}, default => $arg->{default}, type => $map_type, rtype => $arg->{type}, } } sub map_args { my ($self, $func) = @_; my $entry = $self->function_map->{ $func->{name} }; my $argspec = $entry->{argspec}; my $args = []; if ($argspec) { $entry->{orig_args} = [ map $_->{name}, @{ $func->{args} } ]; for my $arg (@$argspec) { my $default; ($arg, $default) = split /=/, $arg, 2; my ($type, $name) = split ':', $arg, 2; if ($type and $name) { push @$args, { name => $name, type => $type, default => $default, }; } else { my $e = list_first { $_->{name} eq $arg } @{ $func->{args} }; if ($e) { push @$args, { %$e, default => $default }; } elsif ($arg eq '...') { push @$args, { name => '...', type => 'SV *' }; } else { warn "bad argspec: $func->{name} ($arg)\n"; } } } } else { $args = $func->{args}; } return [ map $self->map_arg($_), @$args ] } #this is needed for modperl-only functions #unlike apache/apr functions which are remapped to a mpxs_ function sub thx_fixup { my ($self, $func) = @_; my $first = $func->{args}->[0]; return unless $first; if ($first->{type} =~ /PerlInterpreter/) { shift @{ $func->{args} }; $func->{thx} = 1; } } sub map_function { my ($self, $func) = @_; my $map = $self->function_map->{ $func->{name} }; return unless $map; $self->thx_fixup($func); my ($status, $failed_type) = $self->can_map($map, $func->{return_type}, map $_->{type}, @{ $func->{args} }); unless ($status) { warn "unknown typemap: '$failed_type' (skipping $func->{name})\n"; return; } my $type = $map->{return_type} || $func->{return_type} || 'void'; my $map_type = $self->map_type($type); die "unknown typemap: '$type'" unless defined $map_type; my $mf = { name => $func->{name}, return_type => $map_type, args => $self->map_args($func), perl_name => $map->{name}, thx => $func->{thx}, }; for (qw(dispatch argspec orig_args prefix)) { $mf->{$_} = $map->{$_}; } unless ($mf->{class}) { $mf->{class} = $map->{class} || $self->first_class($mf); #print "GUESS class=$mf->{class} for $mf->{name}\n"; } $mf->{prefix} ||= ModPerl::FunctionMap::guess_prefix($mf); $mf->{module} = $map->{module} || $mf->{class}; $mf; } sub map_structure { my ($self, $struct) = @_; my ($class, @elts); my $stype = $struct->{type}; return unless $class = $self->map_type($stype); for my $e (@{ $struct->{elts} }) { my ($name, $type) = ($e->{name}, $e->{type}); my $rtype; # ro/rw/r+w_startup/undef(disabled) my $access_mode = $self->structure_map->{$stype}->{$name}; next unless $access_mode; next unless $rtype = $self->map_type($type); push @elts, { name => $name, type => $rtype, default => $self->null_type($type), pool => $self->class_pool($class), class => $self->{map}->{$type} || "", access_mode => $access_mode, }; } return { module => $self->{structure_map}->{MODULES}->{$stype} || $class, class => $class, type => $stype, elts => \@elts, }; } sub destructor { my ($self, $prefix) = @_; $self->function_map->{$prefix . 'DESTROY'}; } sub first_class { my ($self, $func) = @_; for my $e (@{ $func->{args} }) { next unless $e->{type} =~ /::/; #there are alot of util functions that take an APR::Pool #that do not belong in the APR::Pool class next if $e->{type} eq 'APR::Pool' and $func->{name} !~ /^apr_pool/; return $e->{type}; } return $func->{name} =~ /^apr_/ ? 'APR' : 'Apache2'; } sub check { my $self = shift; my (@types, @missing, %seen); require Apache2::StructureTable; for my $entry (@$Apache2::StructureTable) { push @types, map $_->{type}, @{ $entry->{elts} }; } for my $entry (@$Apache2::FunctionTable) { push @types, grep { not $seen{$_}++ } ($entry->{return_type}, map $_->{type}, @{ $entry->{args} }) } #printf "%d types\n", scalar @types; for my $type (@types) { push @missing, $type unless $self->exists($type); } return @missing ? \@missing : undef; } #look for Apache/APR structures that do not exist in structure.map my %ignore_check = map { $_,1 } qw{ module_struct cmd_how kill_conditions regex_t regmatch_t pthread_mutex_t unsigned void va_list ... iovec char int long const gid_t uid_t time_t pid_t size_t sockaddr hostent SV }; sub check_exists { my $self = shift; my %structures = map { $_->{type}, 1 } @{ $self->structure_table() }; my @missing = (); my %seen; for my $name (keys %{ $self->{map} }) { 1 while $name =~ s/^\w+\s+(\w+)/$1/; $name =~ s/\s+\**.*$//; next if $seen{$name}++ or $structures{$name} or $ignore_check{$name}; push @missing, $name; } return @missing ? \@missing : undef; } #XXX: generate this my %class_pools = map { (my $f = "mpxs_${_}_pool") =~ s/:/_/g; $_, $f; } qw{ Apache2::RequestRec Apache2::Connection Apache2::URI APR::URI }; sub class_pool : lvalue { my ($self, $class) = @_; $class_pools{$class}; } #anything needed that mod_perl.h does not already include #XXX: .maps should INCLUDE= these my @includes = qw{ apr_uuid.h apr_sha1.h apr_md5.h apr_base64.h apr_getopt.h apr_hash.h apr_lib.h apr_general.h apr_signal.h apr_thread_rwlock.h util_script.h }; sub h_wrap { my ($self, $file, $code) = @_; $file = 'modperl_xs_' . $file; my $h_def = uc "${file}_h"; my $preamble = "\#ifndef $h_def\n\#define $h_def\n\n"; my $postamble = "\n\#endif /* $h_def */\n"; return ("$file.h", $preamble . $code . $postamble); } sub typedefs_code { my $self = shift; my $map = $self->get; my %seen; my $file = 'modperl_xs_typedefs'; my $h_def = uc "${file}_h"; my $code = ""; for (@includes, @{ $self->{INCLUDE} }) { $code .= qq{\#include "$_"\n} } for my $t (sort {$a->[1] cmp $b->[1]} @{ $self->{struct} }) { next if $seen{ $t->[1] }++; $code .= "typedef $t->[0] * $t->[1];\n"; } for my $t (sort {$a->[1] cmp $b->[1]} @{ $self->{typedef} }) { next if $seen{ $t->[1] }++; $code .= "typedef $t->[0] $t->[1];\n"; } $self->h_wrap('typedefs', $code); } my %convert_alias = ( Apache2__RequestRec => 'r', Apache2__Server => 'server', Apache2__Connection => 'connection', APR__Table => 'table', APR__UUID => 'uuid', apr_status_t => 'status', ); sub sv_convert_code { my $self = shift; my $map = $self->get; my %seen; my $code = ""; for my $ctype (sort keys %$map) { my $ptype = $map->{$ctype}; next if $self->special($ptype); next if $ctype =~ /\s/; my $class = $ptype; if ($ptype =~ s/:/_/g) { next if $seen{$ptype}++; my $alias; my $expect = "expecting an $class derived object"; my $croak = "argument is not a blessed reference"; #Perl -> C my $define = "mp_xs_sv2_$ptype"; $code .= < Perl $define = "mp_xs_${ptype}_2obj"; $code .= <h_wrap('sv_convert', $code); } 1; __END__ mod_perl-2.0.9/lib/ModPerl/WrapXS.pm0000644000104000010010000011167412540623201017623 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::WrapXS; use strict; use warnings FATAL => 'all'; use constant GvUNIQUE => 0; #$] >= 5.008; use Apache::TestTrace; use Apache2::Build (); use ModPerl::Code (); use ModPerl::TypeMap (); use ModPerl::MapUtil qw(function_table xs_glue_dirs); use File::Path qw(rmtree mkpath); use Cwd qw(fastcwd); use Data::Dumper; use File::Spec::Functions qw(catfile catdir); our $VERSION = '0.01'; my (@xs_includes) = ('mod_perl.h', map "modperl_xs_$_.h", qw(sv_convert util typedefs)); my @global_structs = qw(perl_module); my $build = Apache2::Build->build_config; push @global_structs, 'MP_debug_level' unless Apache2::Build::WIN32; sub new { my $class = shift; my $self = bless { typemap => ModPerl::TypeMap->new, includes => \@xs_includes, glue_dirs => [xs_glue_dirs()], }, $class; $self->typemap->get; $self; } sub typemap { shift->{typemap} } sub includes { shift->{includes} } sub function_list { my $self = shift; my (@list) = @{ function_table() }; while (my ($name, $val) = each %{ $self->typemap->function_map }) { #entries that do not exist in C::Scan generated tables next unless $name =~ /^DEFINE_/; push @list, $val; } return \@list; } sub get_functions { my $self = shift; my $typemap = $self->typemap; for my $entry (sort { $a->{name} cmp $b->{name} } @{ $self->function_list() }) { my $func = $typemap->map_function($entry); #print "FAILED to map $entry->{name}\n" unless $func; next unless $func; my ($name, $module, $class, $args) = @{ $func } { qw(perl_name module class args) }; $self->{XS}->{ $module } ||= []; #eg ap_fputs() if ($name =~ s/^DEFINE_//) { $func->{name} =~ s/^DEFINE_//; if (needs_prefix($func->{name})) { #e.g. DEFINE_add_output_filter $func->{name} = make_prefix($func->{name}, $class); } } my $xs_parms = join ', ', map { defined $_->{default} ? "$_->{name}=$_->{default}" : $_->{name} } @$args; (my $parms = $xs_parms) =~ s/=[^,]+//g; #strip defaults my $proto = join "\n", (map " $_->{type} $_->{name}", @$args), ""; my ($dispatch, $orig_args) = @{ $func } {qw(dispatch orig_args)}; if ($dispatch =~ /^MPXS_/) { $name =~ s/^mpxs_//; $name =~ s/^$func->{prefix}//; push @{ $self->{newXS}->{ $module } }, ["$class\::$name", $dispatch]; next; } my $passthru = @$args && $args->[0]->{name} eq '...'; if ($passthru) { $parms = '...'; $proto = ''; } my $return_type = $name =~ /^DESTROY$/ ? 'void' : $func->{return_type}; my $attrs = $self->attrs($name); my $code = <{thx}) { my $thx = $func->{thx} ? 'aTHX_ ' : ""; if ($dispatch) { $thx = 'aTHX_ ' if $dispatch =~ /^mpxs_/i; } else { if ($orig_args and @$orig_args == @$args) { #args were reordered $parms = join ', ', @$orig_args; } $dispatch = $func->{name}; } if ($passthru) { $thx ||= 'aTHX_ '; $parms = 'items, MARK+1, SP'; } $thx =~ s/_ $// unless $parms; my $retval = $return_type eq 'void' ? ["", ""] : ["RETVAL = ", "OUTPUT:\n RETVAL\n"]; my $avoid_warning = ""; if (@$args and not $passthru) { $avoid_warning = " /* avoiding -Wall warnings */\n"; $avoid_warning .= join "\n", (map " $_->{name} = $_->{name};", @$args), ""; } $code .= <[0]$dispatch($thx$parms); $retval->[1] EOF } $func->{code} = $code; push @{ $self->{XS}->{ $module } }, $func; } } sub get_value { my $e = shift; my $val = 'val'; if ($e->{class} eq 'PV') { if (my $pool = $e->{pool}) { $pool .= '(obj)'; $val = "(SvOK(ST(1)) ? apr_pstrndup($pool, val, val_len) : NULL)" } } return $val; } sub get_structures { my $self = shift; my $typemap = $self->typemap; require Apache2::StructureTable; for my $entry (@$Apache2::StructureTable) { my $struct = $typemap->map_structure($entry); next unless $struct; my $class = $struct->{class}; for my $e (@{ $struct->{elts} }) { my ($name, $default, $type, $access_mode) = @{$e}{qw(name default type access_mode)}; (my $cast = $type) =~ s/:/_/g; my $val = get_value($e); my $type_in = $type; my $preinit = "/*nada*/"; if ($e->{class} eq 'PV' and $val ne 'val') { $type_in =~ s/char/char_len/; $preinit = "STRLEN val_len;"; } my $attrs = $self->attrs($name); my $code; if ($access_mode eq 'ro') { $code = <$name; OUTPUT: RETVAL EOF } elsif ($access_mode eq 'rw' or $access_mode eq 'r+w_startup') { my $check_runtime = $access_mode eq 'rw' ? '' : qq[MP_CROAK_IF_THREADS_STARTED("setting $name");]; $code = <$name; if (items > 1) { $check_runtime obj->$name = ($cast) $val; } OUTPUT: RETVAL EOF } elsif ($access_mode eq 'r+w_startup_dup') { my $convert = $cast !~ /\bchar\b/ ? "mp_xs_sv2_$cast" : "SvPV_nolen"; $code = <$name; if (items > 1) { SV *dup = get_sv("_modperl_private::server_rec_$name", TRUE); MP_CROAK_IF_THREADS_STARTED("setting $name"); sv_setsv(dup, val); obj->$name = ($cast)$convert(dup); } OUTPUT: RETVAL EOF } elsif ($access_mode eq 'rw_char_undef') { my $pool = $e->{pool} or die "rw_char_undef accessors need pool"; $pool .= '(obj)'; # XXX: not sure where val=$default is coming from, but for now use # hardcoded (SV *)NULL $code = <$name; if (val_sv) { if (SvOK(val_sv)) { STRLEN val_len; char *val = (char *)SvPV(val_sv, val_len); obj->$name = apr_pstrndup($pool, val, val_len); } else { obj->$name = NULL; } } OUTPUT: RETVAL EOF } push @{ $self->{XS}->{ $struct->{module} } }, { code => $code, class => $class, name => $name, }; } } } sub prepare { my $self = shift; $self->{DIR} = 'WrapXS'; $self->{XS_DIR} = catdir fastcwd(), 'xs'; my $verbose = Apache::TestTrace::trace_level() eq 'debug' ? 1 : 0; if (-e $self->{DIR}) { rmtree([$self->{DIR}], $verbose, 1); } mkpath [$self->{DIR}], $verbose, 0755; } sub class_dirname { my ($self, $class) = @_; my ($base, $sub) = split '::', $class; return "$self->{DIR}/$base" unless $sub; #Apache2 | APR return $sub if $sub eq $self->{DIR}; #WrapXS return "$base/$sub"; } sub class_dir { my ($self, $class) = @_; my $dirname = $self->class_dirname($class); my $dir = ($dirname =~ m:/: and $dirname !~ m:^$self->{DIR}:) ? catdir($self->{DIR}, $dirname) : $dirname; unless (-d $dir) { mkpath [$dir], 0, 0755; debug "mkdir.....$dir"; } $dir; } sub class_file { my ($self, $class, $file) = @_; catfile $self->class_dir($class), $file; } sub cname { my ($self, $class) = @_; $class =~ s/:/_/g; $class; } sub open_class_file { my ($self, $class, $file) = @_; if ($file =~ /^\./) { my $sub = (split '::', $class)[-1]; $file = $sub . $file; } my $name = $self->class_file($class, $file); open my $fh, '>', $name or die "open $name: $!"; debug "writing...$name"; return $fh; } sub module_version { local $_ = shift; require mod_perl2; # XXX: for now APR gets its libapr-0.9 version return /^APR/ ? "0.009000" : "$mod_perl2::VERSION"; } sub write_makefilepl { my ($self, $class) = @_; my $fh = $self->open_class_file($class, 'Makefile.PL'); my $includes = $self->includes; my $xs = (split '::', $class)[-1] . '.c'; my $deps = {$xs => ""}; if (my $mod_h = $self->mod_h($class, 1)) { $deps->{$xs} .= " $mod_h"; } local $Data::Dumper::Terse = 1; $deps = Dumper $deps; my $noedit_warning = $self->ModPerl::Code::noedit_warning_hash(); require mod_perl2; my $version = module_version($class); print $fh < '$class', 'VERSION' => '$version', 'depend' => $deps, ); EOF close $fh; } sub mod_h { my ($self, $module, $complete) = @_; my $dirname = $self->class_dirname($module); my $cname = $self->cname($module); my $mod_h = "$dirname/$cname.h"; for ($self->{XS_DIR}, @{ $self->{glue_dirs} }) { my $file = "$_/$mod_h"; $mod_h = $file if $complete; return $mod_h if -e $file; } undef; } sub mod_pm { my ($self, $module, $complete) = @_; my $dirname = $self->class_dirname($module); my ($base, $sub) = split '::', $module; my $mod_pm = "$dirname/${sub}_pm"; for ($self->{XS_DIR}, @{ $self->{glue_dirs} }) { my $file = "$_/$mod_pm"; $mod_pm = $file if $complete; return $mod_pm if -e $file; } undef; } sub class_c_prefix { my $class = shift; $class =~ s/:/_/g; $class; } sub class_mpxs_prefix { my $class = shift; my $class_prefix = class_c_prefix($class); "mpxs_${class_prefix}_"; } sub needs_prefix { my $name = shift; $name !~ /^(ap|apr|mpxs)_/i; } sub make_prefix { my ($name, $class) = @_; my $class_prefix = class_mpxs_prefix($class); return $name if $name =~ /^$class_prefix/; $class_prefix . $name; } sub isa_str { my ($self, $module) = @_; my $str = ""; if (my $isa = $self->typemap->{function_map}->{isa}->{$module}) { foreach my $sub (sort keys %$isa) { my $base = $isa->{$sub}; #XXX cannot set isa in the BOOT: section because XSLoader local-ises #ISA during bootstrap # $str .= qq{ av_push(get_av("$sub\::ISA", TRUE), # newSVpv("$base",0));} $str .= qq{\@$sub\::ISA = '$base';\n} } } $str; } sub boot { my ($self, $module) = @_; my $str = ""; if (my $boot = $self->typemap->{function_map}->{boot}->{$module}) { $str = ' mpxs_' . $self->cname($module) . "_BOOT(aTHX);\n"; } $str; } my $notshared = join '|', qw(TIEHANDLE); #not sure why yet sub attrs { my ($self, $name) = @_; my $str = ""; return $str if $name =~ /$notshared$/o; $str = " ATTRS: unique\n" if GvUNIQUE; $str; } sub write_xs { my ($self, $module, $functions) = @_; my $fh = $self->open_class_file($module, '.xs'); print $fh $self->ModPerl::Code::noedit_warning_c(), "\n"; print $fh "\n#define MP_IN_XS\n\n"; my @includes = @{ $self->includes }; if (my $mod_h = $self->mod_h($module)) { push @includes, $mod_h; } for (@includes) { print $fh qq{\#include "$_"\n\n}; } my $last_prefix = ""; for my $func (@$functions) { my $class = $func->{class}; my $prefix = $func->{prefix}; $last_prefix = $prefix if $prefix; if ($func->{name} =~ /^mpxs_/) { #e.g. mpxs_Apache2__RequestRec_ my $class_prefix = class_c_prefix($class); if ($func->{name} =~ /$class_prefix/) { $prefix = class_mpxs_prefix($class); } } $prefix = $prefix ? " PREFIX = $prefix" : ""; print $fh "MODULE = $module PACKAGE = $class $prefix\n\n"; print $fh $func->{code}; } if (my $destructor = $self->typemap->destructor($last_prefix)) { my $arg = $destructor->{argspec}[0]; print $fh <{name}($arg) $destructor->{class} $arg EOF } print $fh "MODULE = $module\n"; print $fh "PROTOTYPES: disabled\n\n"; print $fh "BOOT:\n"; print $fh $self->boot($module); print $fh " items = items; /* -Wall */\n\n"; if (my $newxs = $self->{newXS}->{$module}) { for my $xs (sort { $a->[0] cmp $b->[0] } @$newxs) { print $fh qq{ cv = newXS("$xs->[0]", $xs->[1], __FILE__);\n}; print $fh qq{ GvUNIQUE_on(CvGV(cv));\n} if GvUNIQUE; } } if ($module eq 'APR::Pool' && Apache2::Build::PERL_HAS_ITHREADS) { print $fh " modperl_opt_interp_unselect = APR_RETRIEVE_OPTIONAL_FN(modperl_interp_unselect);\n\n"; print $fh " modperl_opt_thx_interp_get = APR_RETRIEVE_OPTIONAL_FN(modperl_thx_interp_get);\n\n"; } close $fh; } sub write_pm { my ($self, $module) = @_; my $isa = $self->isa_str($module); my $code = ""; if (my $mod_pm = $self->mod_pm($module, 1)) { open my $fh, '<', $mod_pm; local $/; $code = <$fh>; close $fh; } my $base = (split '::', $module)[0]; unless (-e "lib/$base/XSLoader.pm") { $base = 'Apache2'; } my $loader = join '::', $base, 'XSLoader'; my $fh = $self->open_class_file($module, '.pm'); my $noedit_warning = $self->ModPerl::Code::noedit_warning_hash(); my $use_apr = ($module =~ /^APR::\w+$/) ? 'use APR ();' : ''; my $version = module_version($module); print $fh < 'all'; $isa $use_apr use $loader (); our \$VERSION = '$version'; $loader\::load __PACKAGE__; $code 1; __END__ EOF } my %typemap = ( 'Apache2::RequestRec' => 'T_APACHEOBJ', 'apr_time_t' => 'T_APR_TIME', 'APR::Table' => 'T_HASHOBJ', 'APR::Pool' => 'T_POOLOBJ', 'apr_size_t *' => 'T_UVPTR', ); sub write_typemap { my $self = shift; my $typemap = $self->typemap; my $map = $typemap->get; my %seen; my $fh = $self->open_class_file('ModPerl::WrapXS', 'typemap'); print $fh $self->ModPerl::Code::noedit_warning_hash(), "\n"; my %entries = (); my $max_key_len = 0; while (my ($type, $class) = each %$map) { $class ||= $type; next if $seen{$type}++ || $typemap->special($class); if ($class =~ /::/) { $entries{$class} = $typemap{$class} || 'T_PTROBJ'; $max_key_len = length $class if length $class > $max_key_len; } else { $entries{$type} = $typemap{$type} || "T_$class"; $max_key_len = length $type if length $type > $max_key_len; } } for (sort keys %entries) { printf $fh "%-${max_key_len}s %s\n", $_, $entries{$_}; } close $fh; } sub write_typemap_h_file { my ($self, $method) = @_; $method = $method . '_code'; my ($h, $code) = $self->typemap->$method(); my $file = catfile $self->{XS_DIR}, $h; open my $fh, '>', $file or die "open $file: $!"; print $fh $self->ModPerl::Code::noedit_warning_c(), "\n"; print $fh $code; close $fh; } sub write_lookup_method_file { my $self = shift; my %map = (); foreach my $module (sort keys %{ $self->{XS} }) { my $functions = $self->{XS}->{$module}; my $last_prefix = ""; for my $func (@$functions) { my $class = $func->{class}; my $prefix = $func->{prefix}; $last_prefix = $prefix if $prefix; my $name = $func->{perl_name} || $func->{name}; $name =~ s/^DEFINE_//; if ($name =~ /^mpxs_/) { #e.g. mpxs_Apache2__RequestRec_ my $class_prefix = class_c_prefix($class); if ($name =~ /$class_prefix/) { $prefix = class_mpxs_prefix($class); } } elsif ($name =~ /^ap_sub_req/) { $prefix = 'ap_sub_req_'; } $name =~ s/^$prefix// if $prefix; push @{ $map{$name} }, [$module, $class]; } # pure XS wrappers don't have the information about the # arguments they receive, since they manipulate the arguments # stack directly. therefore for these methods we can't tell # what are the objects they are invoked on for my $xs (@{ $self->{newXS}->{$module} || []}) { push @{ $map{$1} }, [$module, undef] if $xs->[0] =~ /.+::(.+)/; } } local $Data::Dumper::Terse = 1; local $Data::Dumper::Sortkeys = 1; $Data::Dumper::Terse = $Data::Dumper::Terse; # warn $Data::Dumper::Sortkeys = $Data::Dumper::Sortkeys; # warn my $methods = Dumper(\%map); $methods =~ s/\n$//; my $package = "ModPerl::MethodLookup"; my $file = catfile "lib", "ModPerl", "MethodLookup.pm"; debug "creating $file"; open my $fh, ">$file" or die "Can't open $file: $!"; my $noedit_warning = $self->ModPerl::Code::noedit_warning_hash(); print $fh < 0; use constant OBJECT => 1; my $modules; my $objects; sub _get_modules { for my $method (sort keys %$methods) { for my $item ( @{ $methods->{$method} }) { push @{ $modules->{$item->[MODULE]} }, [$method, $item->[OBJECT]]; } } } sub _get_objects { for my $method (sort keys %$methods) { for my $item ( @{ $methods->{$method} }) { next unless defined $item->[OBJECT]; push @{ $objects->{$item->[OBJECT]} }, [$method, $item->[MODULE]]; } } } # if there is only one replacement method in 2.0 API we can # automatically lookup it, up however if there are more than one # (e.g. new()), we need to use a fully qualified value here # of course the same if the package is not a mod_perl one. # # the first field represents the replacement method or undef if none # exists, the second field is for extra comments (e.g. when there is # no replacement method) my $methods_compat = { # Apache2:: gensym => ['Symbol::gensym', 'or use "open my $fh, $file"'], module => ['Apache2::Module::loaded', ''], define => ['exists_config_define', ''], httpd_conf => ['add_config', ''], SERVER_VERSION => ['get_server_version', ''], can_stack_handlers=> [undef, 'there is no more need for that method in mp2'], # Apache2::RequestRec soft_timeout => [undef, 'there is no more need for that method in mp2'], hard_timeout => [undef, 'there is no more need for that method in mp2'], kill_timeout => [undef, 'there is no more need for that method in mp2'], reset_timeout => [undef, 'there is no more need for that method in mp2'], cleanup_for_exec => [undef, 'there is no more need for that method in mp2'], send_http_header => ['content_type', ''], header_in => ['headers_in', 'this method works in mod_perl 1.0 too'], header_out => ['headers_out', 'this method works in mod_perl 1.0 too'], err_header_out => ['err_headers_out', 'this method works in mod_perl 1.0 too'], register_cleanup => ['cleanup_register', ''], post_connection => ['cleanup_register', ''], content => [undef, # XXX: Apache2::Request::what? 'use CGI.pm or Apache2::Request instead'], clear_rgy_endav => ['special_list_clear', ''], stash_rgy_endav => [undef, ''], run_rgy_endav => ['special_list_call', 'this method is no longer needed'], seqno => [undef, 'internal to mod_perl 1.0'], chdir_file => [undef, # XXX: to be resolved 'temporary unavailable till the issue with chdir' . ' in the threaded env is resolved'], log_reason => ['log_error', 'not in the Apache 2.0 API'], READLINE => [undef, # XXX: to be resolved ''], send_fd_length => [undef, 'not in the Apache 2.0 API'], send_fd => ['sendfile', 'requires an offset argument'], is_main => ['main', 'not in the Apache 2.0 API'], cgi_var => ['subprocess_env', 'subprocess_env can be used with mod_perl 1.0'], cgi_env => ['subprocess_env', 'subprocess_env can be used with mod_perl 1.0'], each_byterange => [undef, 'now handled internally by ap_byterange_filter'], set_byterange => [undef, 'now handled internally by ap_byterange_filter'], # Apache::File open => [undef, ''], close => [undef, # XXX: also defined in APR::Socket ''], tmpfile => [undef, 'not in the Apache 2.0 API, ' . 'use File::Temp instead'], # Apache::Util size_string => ['format_size', ''], escape_uri => ['unescape_path', ''], escape_url => ['escape_path', 'and requires a pool object'], unescape_uri => ['unescape_url', ''], unescape_url_info => [undef, 'use CGI::Util::unescape() instead'], escape_html => [undef, # XXX: will be ap_escape_html 'ap_escape_html now requires a pool object'], parsedate => ['parse_http', ''], validate_password => ['password_validate', ''], # Apache::Table #new => ['make', # ''], # XXX: there are other 'new' methods # Apache::Connection auth_type => ['ap_auth_type', 'now resides in the request object'], }; sub avail_methods_compat { return keys %$methods_compat; } sub avail_methods { return keys %$methods; } sub avail_modules { my %modules = (); for my $method (keys %$methods) { for my $item ( @{ $methods->{$method} }) { $modules{$item->[MODULE]}++; } } return keys %modules; } sub preload_all_modules { _get_modules() unless $modules; eval "require $_" for sort keys %$modules; } sub _print_func { my $func = shift; my @args = @_ ? @_ : @ARGV; no strict 'refs'; print( ($func->($_))[0]) for @args; } sub print_module { _print_func('lookup_module', @_) } sub print_object { _print_func('lookup_object', @_) } sub print_method { my @args = @_ ? @_ : @ARGV; while (@args) { my $method = shift @args; my $object = (@args && (ref($args[0]) || $args[0] =~ /^(Apache2|ModPerl|APR)/)) ? shift @args : undef; print( (lookup_method($method, $object))[0]); } } sub sep { return '-' x (shift() + 20) . "\n" } # what modules contain the passed method. # an optional object or a reference to it can be passed to help # resolve situations where there is more than one module containing # the same method. Inheritance is supported. sub lookup_method { my ($method, $object) = @_; unless (defined $method) { my $hint = "No 'method' argument was passed\n"; return ($hint); } # strip the package name for the fully qualified method $method =~ s/.+:://; if (exists $methods_compat->{$method}) { my ($replacement, $comment) = @{$methods_compat->{$method}}; my $hint = "'$method' is not a part of the mod_perl 2.0 API\n"; $comment = length $comment ? " $comment\n" : ""; # some removed methods have no replacement return $hint . "$comment" unless defined $replacement; $hint .= "use '$replacement' instead. $comment"; # if fully qualified don't look up its container return $hint if $replacement =~ /::/; my ($modules_hint, @modules) = lookup_method($replacement, $object); return $hint . $modules_hint; } elsif (!exists $methods->{$method}) { my $hint = "Don't know anything about method '$method'\n"; return ($hint); } my @items = @{ $methods->{$method} }; if (@items == 1) { my $module = $items[0]->[MODULE]; my $hint = "To use method '$method' add:\n" . "\tuse $module ();\n"; # we should really check that the method matches the object if # any was passed, but it may not always work return ($hint, $module); } else { if (defined $object) { my $class = ref $object || $object; for my $item (@items) { # real class or inheritance if ($class eq $item->[OBJECT] or (ref($object) && $object->isa($item->[OBJECT]))) { my $module = $item->[MODULE]; my $hint = "To use method '$method' add:\n" . "\tuse $module ();\n"; return ($hint, $module); } } # fall-through local $" = ", "; my @modules = map $_->[MODULE], @items; my $hint = "Several modules (@modules) contain method '$method' " . "but none of them matches class '$class';\n"; return ($hint); } else { my %modules = map { $_->[MODULE] => 1 } @items; # remove dups if any (e.g. $s->add_input_filter and # $r->add_input_filter are loaded by the same Apache2::Filter) my @modules = sort keys %modules; my $hint; if (@modules == 1) { $hint = "To use method '$method' add:\n\tuse $modules[0] ();\n"; return ($hint, $modules[0]); } else { $hint = "There is more than one class with method '$method'\n" . "try one of:\n" . join '', map {"\tuse $_ ();\n"} @modules; return ($hint, @modules); } } } } # what methods are contained in the passed module name sub lookup_module { my ($module) = shift; unless (defined $module) { my $hint = "no 'module' argument was passed\n"; return ($hint); } _get_modules() unless $modules; unless (exists $modules->{$module}) { my $hint = "don't know anything about module '$module'\n"; return ($hint); } my @methods; my $max_len = 6; for ( @{ $modules->{$module} } ) { $max_len = length $_->[0] if length $_->[0] > $max_len; push @methods, $_->[0]; } my $format = "%-${max_len}s %s\n"; my $banner = sprintf($format, "Method", "Invoked on object type"); my $hint = join '', ("\nModule '$module' contains the following XS methods:\n\n", $banner, sep(length($banner)), map( { sprintf $format, $_->[0], $_->[1]||'???'} @{ $modules->{$module} }), sep(length($banner))); return ($hint, @methods); } # what methods can be invoked on the passed object (or its reference) sub lookup_object { my ($object) = shift; unless (defined $object) { my $hint = "no 'object' argument was passed\n"; return ($hint); } _get_objects() unless $objects; # a real object was passed? $object = ref $object || $object; unless (exists $objects->{$object}) { my $hint = "don't know anything about objects of type '$object'\n"; return ($hint); } my @methods; my $max_len = 6; for ( @{ $objects->{$object} } ) { $max_len = length $_->[0] if length $_->[0] > $max_len; push @methods, $_->[0]; } my $format = "%-${max_len}s %s\n"; my $banner = sprintf($format, "Method", "Module"); my $hint = join '', ("\nObjects of type '$object' can invoke the following XS methods:\n\n", $banner, sep(length($banner)), map({ sprintf $format, $_->[0], $_->[1]} @{ $objects->{$object} }), sep(length($banner))); return ($hint, @methods); } 1; EOF close $fh; } sub write_module_versions_file { my $self = shift; my $file = catfile "lib", "ModPerl", "DummyVersions.pm"; debug "creating $file"; open my $fh, ">$file" or die "Can't open $file: $!"; my $noedit_warning = $self->ModPerl::Code::noedit_warning_hash(); print $fh "$noedit_warning\n"; my @modules = keys %{ $self->{XS} }; push @modules, qw(ModPerl::MethodLookup); my $len = 0; for (@modules) { $len = length $_ if length $_ > $len; } require mod_perl2; $len += length '$::VERSION'; for (sort @modules) { my $ver = module_version($_); printf $fh "package %s;\n%-${len}s = %s;\n\n", $_, '$'.$_."::VERSION", $ver; } } sub generate { my $self = shift; $self->prepare; for (qw(ModPerl::WrapXS Apache2 APR ModPerl)) { $self->write_makefilepl($_); } $self->write_typemap; for (qw(typedefs sv_convert)) { $self->write_typemap_h_file($_); } $self->get_functions; $self->get_structures; $self->write_export_file('exp') if Apache2::Build::AIX; $self->write_export_file('def') if Apache2::Build::WIN32; foreach my $module (sort keys %{ $self->{XS} }) { my $functions = $self->{XS}->{$module}; # my ($root, $sub) = split '::', $module; # if (-e "$self->{XS_DIR}/$root/$sub/$sub.xs") { # $module = join '::', $root, "Wrap$sub"; # } $self->write_makefilepl($module); $self->write_xs($module, $functions); $self->write_pm($module); } $self->write_lookup_method_file; $self->write_module_versions_file; } #three .sym files are generated: #global - global symbols #ithreads - #ifdef USE_ITHREADS functions #inline - __inline__ functions #the inline symbols are needed #ifdef MP_DEBUG #since __inline__ will be turned off my %multi_export = map { $_, 1 } qw(exp); sub open_export_files { my ($self, $name, $ext) = @_; my $dir = $self->{XS_DIR}; my %handles; my @types = qw(global inline ithreads); if ($multi_export{$ext}) { #write to multiple files for my $type (@types) { my $file = "$dir/${name}_$type.$ext"; open my $fh, '>', $file or die "open $file: $!"; $handles{$type} = $fh; } } else { #write to one file my $file = "$dir/$name.$ext"; open my $fh, '>', $file or die "open $file: $!"; for my $type (@types) { $handles{$type} = $fh; } } \%handles; } sub func_is_static { my ($self, $entry) = @_; if (my $attr = $entry->{attr}) { return 1 if grep { $_ eq 'static' } @$attr; } #C::Scan doesnt always pickup static __inline__ return 1 if $entry->{name} =~ /^mpxs_/o; return 0; } sub func_is_inline { my ($self, $entry) = @_; if (my $attr = $entry->{attr}) { return 1 if grep { $_ eq '__inline__' } @$attr; } return 0; } sub export_file_header_exp { my $self = shift; "#!\n"; } sub export_file_format_exp { my ($self, $val) = @_; "$val\n"; } sub export_file_header_def { my $self = shift; "LIBRARY\n\nEXPORTS\n\n"; } sub export_file_format_def { my ($self, $val) = @_; " $val\n"; } my $ithreads_exports = join '|', qw{ modperl_cmd_interp_ modperl_interp_ modperl_list_ modperl_tipool_ modperl_svptr_table_clone$ modperl_mgv_require_module$ }; sub export_func_handle { my ($self, $entry, $handles) = @_; if ($self->func_is_inline($entry)) { return $handles->{inline}; } elsif ($entry->{name} =~ /^($ithreads_exports)/) { return $handles->{ithreads}; } $handles->{global}; } sub write_export_file { my ($self, $ext) = @_; my %files = ( modperl => $ModPerl::FunctionTable, apache2 => $Apache2::FunctionTable, apr => $APR::FunctionTable, ); my $header = \&{"export_file_header_$ext"}; my $format = \&{"export_file_format_$ext"}; foreach my $key (sort keys %files) { my $table = $files{$key}; my $handles = $self->open_export_files($key, $ext); my %seen; #only write header once if this is a single file for my $fh (values %$handles) { next if $seen{$fh}++; print $fh $self->$header(); } # add the symbols which aren't the function table if ($key eq 'modperl') { my $fh = $handles->{global}; for my $name (@global_structs) { print $fh $self->$format($name); } } for my $entry (@$table) { next if $self->func_is_static($entry); my $name = $entry->{name}; my $fh = $self->export_func_handle($entry, $handles); print $fh $self->$format($name); } %seen = (); #only close handle once if this is a single file for my $fh (values %$handles) { next if $seen{$fh}++; close $fh; } } } sub stats { my $self = shift; $self->get_functions; $self->get_structures; my %stats; while (my ($module, $functions) = each %{ $self->{XS} }) { $stats{$module} += @$functions; if (my $newxs = $self->{newXS}->{$module}) { $stats{$module} += @$newxs; } } return \%stats; } sub generate_exports { my ($self, $fh) = @_; if (!$build->should_build_apache) { print $fh <<"EOF"; /* This is intentionnaly left blank, only usefull for static build */ const void *modperl_ugly_hack = NULL; EOF return; } print $fh <<"EOF"; /* * This is indeed a ugly hack! * See also src/modules/perl/mod_perl.c for modperl_ugly_hack * If we don't build such a list of exported API functions, the over-zealous * linker can and will remove the unused functions completely. In order to * avoid this, we create this object and modperl_ugly_hack to create a * dependency between all the exported API and mod_perl.c */ const void *modperl_ugly_hack = NULL; EOF for my $entry (@$ModPerl::FunctionTable) { next if $self->func_is_static($entry); unless (Apache2::Build::PERL_HAS_ITHREADS) { next if $entry->{name} =~ /^($ithreads_exports)/; } ( my $name ) = $entry->{name} =~ /^modperl_(.*)/; print $fh <<"EOF"; #ifndef modperl_$name const void *modperl_hack_$name = (const void *)modperl_$name; #endif EOF } } 1; __END__ mod_perl-2.0.9/lib/mod_perl2.pm0000644000104000010010000000363612540623201016756 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package mod_perl2; use 5.006; use strict; BEGIN { our $VERSION = "2.000009"; our $VERSION_TRIPLET; if ($VERSION =~ /(\d+)\.(\d\d\d)(\d+)/) { my $v1 = $1; my $v2 = int $2; my $v3 = int($3 . "0" x (3 - length $3)); $VERSION_TRIPLET = "$v1.$v2.$v3"; } else { die "bad version: $VERSION"; } # for example this gives us: # $VERSION : "2.000020" # int $VERSION : 2.00002 # $VERSION_TRIPLET: 2.0.20 # easy to parse request time API version - use # $mod_perl2::VERSION for more granularity our $API_VERSION = 2; } # this stuff is here to assist back compat # basically, if you # PerlModule mod_perl2 # or take similar steps to load mod_perl2 at # startup you are protected against loading mod_perl.pm # (either 1.0 or 1.99) at a later time by accident. $mod_perl::VERSION = $mod_perl2::VERSION; $INC{"mod_perl.pm"} = __FILE__; 1; __END__ =head1 NAME mod_perl - Embed a Perl interpreter in the Apache/2.x HTTP server mod_perl-2.0.9/LICENSE0000644000177200010010000002613612540623201013073 0ustar SteveNone Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mod_perl-2.0.9/Makefile.PL0000644000104000010010000006744112540623201015745 0ustar AdministratorsNoneuse 5.006; use strict; use warnings FATAL => 'all'; # useful for sub-Makefile.PL's to know whether they are invoked # directly or via the top level Makefile.PL $ENV{MOD_PERL_2_BUILD} = 1; use constant MIN_HTTPD_VERSION_DYNAMIC => '2.0.47'; use constant MIN_HTTPD_VERSION_STATIC => '2.0.51'; use constant MIN_HTTPD_24_VERSION => '2.4.0'; my($old_modperl_version, $old_modperl_pm, $old_Apache2_pm); BEGIN { eval { my $old_mp2 = eval { require Apache2 }; require mod_perl; if ($mod_perl::VERSION < 1.999_22 && $old_mp2) { $old_modperl_version = $mod_perl::VERSION; $old_modperl_pm = delete $INC{'mod_perl.pm'}; $old_Apache2_pm = delete $INC{'Apache2.pm'}; } }; } use lib qw(lib Apache-Test/lib); use Config; use File::Spec::Functions; use File::Spec; use DirHandle (); use File::Copy 'cp'; use File::Basename qw(basename dirname); use File::Find (); use Apache2::Build (); use Apache::TestSmokePerl (); use Apache::TestTrace; use ModPerl::TestReport (); use ModPerl::TestRun (); use ModPerl::Code (); use ModPerl::BuildMM (); use constant WIN32 => Apache2::Build::WIN32; use constant BUILD_APREXT => Apache2::Build::BUILD_APREXT; our $VERSION; my $build = Apache2::Build->new(init => 1); my $code = ModPerl::Code->new; sub UNATTENDED() { $build->{MP_PROMPT_DEFAULT} || ! -t STDIN } # may populate $build->{MP_APXS} win32_fetch_apxs() if WIN32; configure(); perl_version_check($build); local %ModPerl::BuildMM::PM = ( 'lib/typemap' => 'blib/lib/Apache2/typemap', ); # these h files need to be installed system-wide so 3rd party XS # extensions can use them my @xs_h_files = map catfile("xs", $_), qw(modperl_xs_sv_convert.h modperl_xs_typedefs.h modperl_xs_util.h APR/PerlIO/modperl_apr_perlio.h); my @exe_files = map "bin/$_", qw(mp2bug); ModPerl::BuildMM::WriteMakefile( NAME => 'mod_perl2', VERSION => $VERSION, DISTNAME => 'mod_perl', NO_META => 1, ABSTRACT_FROM => 'lib/mod_perl2.pm', EXE_FILES => \@exe_files, DEFINE => get_DEFINE(), macro => { MODPERL_SRC => $code->path, MODPERL_MAKEFILE => basename($build->default_file('makefile')), PERL => $build->perl_config('perlpath'), MOD_INSTALL => ModPerl::BuildMM::mod_install(), MODPERL_AP_INCLUDEDIR => $build->ap_destdir($build->install_headers_dir), MODPERL_XS_H_FILES => join(" \\\n\t", @xs_h_files), }, clean => { FILES => "@{ clean_files() }", }, dist => { DIST_DEFAULT => 'mydist', COMPRESS => 'gzip -9f', SUFFIX=>'gz', PREOP => 'find $(DISTVNAME) -type d -print|xargs chmod 0755 && ' . 'find $(DISTVNAME) -type f -print|xargs chmod 0644', TO_UNIX => 'find $(DISTVNAME) -type f -print|xargs dos2unix' }, ); post_configure(); sub get_DEFINE { my $opt_define = ''; # do we have apr libs? # XXX: this define is really needed in xs/APR/APR/Makefile.PL, but this # top-level Makefile.PL overrides MY::pasthru, and defines DEFINE= which # overrides any local definition, not sure what's the right fix, for # now just define it here (should it define PASTHRU_DEFINE instead?) $opt_define = '-DMP_HAVE_APR_LIBS' if $build->apru_link_flags; # preserve any DEFINE opts from outside and combine them with our # local DEFINE @ARGV = grep defined, map { (/^DEFINE=(.*)/ && ($opt_define .= " $1")) ? undef : $_ } @ARGV; return $opt_define; } sub configure { # mod_perl test suite relies on having Apache-Test bundled with # the mod_perl source, since any pre-installed version may not do # the right thing unless (-d "Apache-Test") { error "Can't find a sub-directory Apache-Test. " . "Make sure that you are using a complete source distribution"; exit 1; } set_modperl_version(); if ($old_modperl_version) { (my $old_modperl_version_str = $old_modperl_version) =~ s/(\d\d\d?)(\d\d)/$1_$2/; my $vstring = "mod_perl/$old_modperl_version_str"; print "$vstring installation detected..."; my $prefix; /^PREFIX=(.*)/ && $1 && ($prefix = canonpath glob($1)) for @ARGV; # check that it's a full path my $path = canonpath $old_modperl_pm; # XXX: doesn't handle relative paths yet # if PREFIX=/foo/bar is used, and it's not the same as the # path where mod_perl < 1.999_22 is installed if ($prefix && $path !~ /^$prefix/) { print "ok (will install mod_perl/$VERSION into PREFIX=$prefix, " . "no collision)\n"; } else { my $note = ''; if ($old_Apache2_pm) { $note .= "Conflicting file: $old_Apache2_pm\n"; } if ($path =~ /Apache2/ or $old_modperl_version > 1.99) { my $dir = dirname $path; # was it installed into the top-level? $dir = catdir $dir, 'Apache' unless $path =~ /Apache2/; $note .= "Conflicting dir: $dir\n" if -d $dir; } print " not ok\n\n"; print <{MP_LIBNAME} . $Config{lib_ext}; my ($apr_blib, $full_libname) = $build->mp_apr_blib(); my $lib2 = catfile $apr_blib, $full_libname; unless (-d $apr_blib) { File::Path::mkpath($apr_blib) or die "mkdir $apr_blib failed: $!"; } foreach my $lib ($lib1, $lib2) { unless (-e $lib) { open my $fh, '>', $lib or die "open $lib: $!"; print $fh "#this is a dummy file to trick MakeMaker"; close $fh; } } } system_sanity_check(); my $min_httpd_version = $build->should_build_apache ? MIN_HTTPD_VERSION_STATIC : MIN_HTTPD_VERSION_DYNAMIC; if ($build->{MP_APXS}) { print "Using APXS => $build->{MP_APXS}\n"; } elsif ($build->{MP_AP_PREFIX}) { if (my $reason = $build->ap_prefix_invalid) { error "invalid MP_AP_PREFIX: $reason"; exit 1; } print "Using Apache prefix => $build->{MP_AP_PREFIX}\n"; } else { unless ($build->{MP_USE_STATIC}) { # may populate $build->{MP_APXS} prompt_for_apxs($build); } } $build->{$_} and $ENV{$_} = $build->{$_} for (qw/MP_APXS MP_AP_PREFIX/); unless ($build->{MP_APXS} or $build->{MP_AP_PREFIX}) { my $ok = 0; for my $path ($build->find) { $build->dir($path); my $mmn = $build->module_magic_number; my $v = $build->httpd_version; next unless $v; next if $v lt $min_httpd_version; $ok++ if $build->prompt_y("Configure mod_perl with $path?"); last if $ok; } until ($ok) { my $ask = "Please provide the location of the Apache directory:"; my $ans = $build->prompt($ask) || ""; # strip leading/closing spaces $ans =~ s/^\s*|\s*$//g; if (defined $ans and -d $ans) { $build->dir($ans); $ok++; } else { error "Can't find dir '$ans'"; last if UNATTENDED; } } } if ($build->should_build_apache) { $build->configure_apache(); } my $httpd_version = $build->httpd_version; unless ($httpd_version) { error 'Unable to determine server version, aborting.'; if ($build->{MP_APXS} || $build->{MP_AP_PREFIX}) { my $what = $build->{MP_APXS} ? 'MP_APXS' : 'MP_AP_PREFIX'; error "Invalid $what specified?"; } else { error 'Please specify MP_APXS or MP_AP_PREFIX.'; } exit(1); } if ($httpd_version lt $min_httpd_version) { error "Apache/$httpd_version not supported, " . "$min_httpd_version or higher is required"; exit(1); } printf "Configuring Apache/%s mod_perl/%s Perl/v%vd\n", $httpd_version, $VERSION, $^V; my $apr_config = $build->get_apr_config; #cache it # we need to know where apr-config and apu-configs are # which sometimes aren't placed into the same dir with apxs/httpd # XXX: need to fix that for WIN32 # XXX: when the source tree is used, there is not much use for apr-config unless (WIN32 || $build->apr_config_path || $build->httpd_is_source_tree) { error "can't find 'apr-config', please pass " . "MP_APR_CONFIG=/full/path/to/apr-config to 'perl Makefile.PL'"; exit 1; } for (@{ clean_files() }) { debug "unlink...$_" if -e $_ && unlink; } #ModPerl::BuildMM will use Apache2::BuildConfig in subdir/Makefile.PL's $build->save; ModPerl::TestRun->generate_script; ModPerl::TestReport->generate_script; Apache::TestSmokePerl->generate_script; my $tables_dir = tables_dir($httpd_version); unshift @INC, $tables_dir; if ($build->{MP_GENERATE_XS}) { debug "generating XS code using $tables_dir..."; xs_generate($httpd_version); } install_typemap(); } sub prompt_for_apxs { my $build = shift; print <prompt($prompt) || ""; print "\n\n"; # strip leading/closing spaces $ans =~ s/^\s*|\s*$//g; last unless length $ans; # skip unless (File::Spec->file_name_is_absolute($ans)) { warn "The path '$ans' is not an absolute path. " . "Please specify an absolute path.\n"; next; } warn("'$ans' doesn't exist.\n"), next unless -e $ans; warn("'$ans' is not a file.\n"), next unless -f _; warn("'$ans' is not executable.\n"), next unless -x _; $build->{MP_APXS} = $ans; last; } } sub post_configure { #now have any data subdir/Makefile.PL's save, e.g. XS $build = Apache2::Build->build_config; $build->write_src_makefile; $build->save_ldopts; $code->generate($build); for my $type (qw(DSO STATIC)) { next unless $build->{"MP_USE_$type"}; warning "mod_perl \L$type\E library will be built as ". $build->{"MODPERL_LIB_$type"}; } if ($build->is_dynamic) { warning "You'll need to add the following to httpd.conf:", "", " LoadModule perl_module modules/$build->{MODPERL_LIB_DSO}", "", "depending on your build, mod_perl might not live in", "the modules/ directory.\n"; if ($build->{MP_APXS}) { warning "Check the results of", "", " \$ $build->{MP_APXS} -q LIBEXECDIR", "", "and adjust the LoadModule directive accordingly.\n"; } } $build->save; } sub tables_dir { my $httpd_version = shift; my $tables_version=''; if ($httpd_version lt MIN_HTTPD_24_VERSION) { $tables_version='current'; } else { $tables_version='current24'; } my $tables_dir = "xs/tables/$tables_version"; } sub xs_generate { require ModPerl::WrapXS; my $xs = ModPerl::WrapXS->new; $xs->generate; #shift @INC; #ModPerl::Code needs this path too } sub install_typemap { my $to_file = 'lib/typemap'; open my $to_fh, ">$to_file" or die "open $to_file: $!"; for my $from_file (qw(WrapXS/typemap xs/typemap)) { open my $from_fh, $from_file or die "open $from_file: $!"; cp $from_fh, $to_fh; close $from_fh; } close $to_fh or die "close $to_file: $!"; } sub echo_cmd { my $cmd = shift; print "$cmd\n"; system($cmd) == 0 or exit(1); } sub clean_files { my $path = $code->path; my @files = (); File::Find::find(sub { push @files, "$File::Find::dir/$_" if -f $_}, "WrapXS") if -d "WrapXS"; push @files, map { "xs/$_.h" } qw(modperl_xs_typedefs modperl_xs_sv_convert); return [@{ $build->clean_files }, @files, qw(lib/typemap lib/ModPerl/MethodLookup.pm lib/ModPerl/DummyVersions.pm t/htdocs/vhost/error_log t/SMOKE t/TEST t/REPORT ), , , , , map { "$path/$_"} @{ $code->clean_files } ]; } sub set_modperl_version { require './lib/mod_perl2.pm'; $VERSION = $mod_perl2::VERSION_TRIPLET; open my $fh, 'Changes'; while (<$fh>) { if (/^=item\s+\Q$VERSION\E-(dev|rc\d+)/) { $VERSION .= "-$1"; last; } last if /^=item/; } close $fh; $build->{VERSION} = $VERSION; $build->{API_VERSION} = $mod_perl2::API_VERSION; } # needs to be run after configure() when apxs is setup sub perl_version_check { my $build = shift; my $perl_version = $]; $perl_version =~ s/5.00(\d)(?:00(\d))?/"5.$1." . ($2||0)/e; my $perl_threads = Apache2::Build::PERL_HAS_ITHREADS ? "w/" : "w/o"; my $perl_string = "Using Perl $perl_version $perl_threads ithreads"; my $httpd_version = $build->httpd_version; my $mpm = ""; my $build_threaded = 0; # For httpd-2.4, we can't use mpm_is_threaded(), because MPMs are loadable # modules. We therefore treat httpd as a whole project as threaded. It is # still possible to disable threading by using MP_NO_THREADS=1 if ($httpd_version lt MIN_HTTPD_24_VERSION) { $build_threaded = $build->mpm_is_threaded(); $mpm = $build->mpm_name(); } else { if ($build->{MP_NO_THREADS}) { $build_threaded = 0; } else { $build_threaded = 1; } } # certain mpms require perl 5.8.0+ w/ithreads if ($build_threaded) { my @fail; push @fail, "Perl 5.8 or higher" unless $] >= 5.008; push @fail, "Perl built with ithreads (build perl with -Duseithreads)" unless Apache2::Build::PERL_HAS_ITHREADS(); if (@fail) { if ($httpd_version lt MIN_HTTPD_24_VERSION) { error "$perl_string and '$mpm' mpm httpd.", "Failed requirements:", join "", map {" - $_\n"} @fail; } else { error "$perl_string and httpd-2.4.", "Failed requirements:", join "", map {" - $_\n"} @fail; } exit 1; } } else { # before 5.8.2, perl_shutdown is incomplete (in the case of ithreads # each PerlInterpreter * gets tossed so it works) if ($build->should_build_apache && !Apache2::Build::PERL_HAS_ITHREADS) { # before 5.8.2, perl_shutdown is incomplete if ($] < 5.008_002) { if ($httpd_version lt MIN_HTTPD_24_VERSION) { error "static $mpm mpm requires a threaded ". "perl 5.6.1-5.8.1 or any perl 5.8.2+"; } else { error "httpd-2.4 requires a threaded ". "perl 5.6.1-5.8.1 or any perl 5.8.2+"; } exit 1; } } } if ($] < 5.006_001) { error "$perl_string. You need at least Perl 5.6.1"; exit 1; } if ($] >= 5.007 and $] < 5.008) { error "$perl_string.", "5.7.x development versions of Perl are no longer supported", "Upgrade to Perl 5.8.0 or higher"; exit 1; } if ($Config{usemultiplicity} xor $Config{useithreads}) { error "mod_perl does not currently support multiplicity without ". "ithreads."; if ($build_threaded) { error "Please recompile Perl with -Duseithreads and ". "-Dusemultiplicity"; } else { error "Please recompile Perl with either -Duseithreads and ". "-Dusemultiplicity or -Uuseithreads and -Uusemultiplicity"; } exit 1; } } sub system_sanity_check { return if WIN32; my $ccflags = $build->perl_config('ccflags'); for (split /\s+/, $ccflags) { next unless s/^-I//; my $header = "$_/ap_mmn.h"; if (-e $header) { $build->phat_warn(<lib_check('gdbm'); malloc_check(); os_check(); } sub malloc_check { return unless $build->is_dynamic; return unless $build->perl_config('usemymalloc') eq 'y'; my $abort = $^O eq 'solaris'; my $bincompat = $build->perl_config('bincompat5005'); if ($bincompat) { $build->phat_warn(<() } sub os_check_hpux { my $ccflags = $build->perl_config('ccflags'); my $ld = $build->perl_config('ld'); if ($build->is_dynamic and $ld eq 'ld') { unless ($ccflags =~ /\+z/i) { $build->phat_warn(<{MP_AP_PREFIX}); my $script = catfile($build->{cwd}, 'build', 'win32_fetch_apxs'); my @args = ($^X, $script, "--with-apache2=$prefix"); system(@args) == 0 or die "system @args failed: $?"; my $apxs = catfile($prefix, 'bin', 'apxs.bat'); $build->{MP_APXS} = $apxs if -e $apxs; } package MY; use Config; use constant WIN32 => $^O eq 'MSWin32'; use constant BUILD_APREXT => Apache2::Build::BUILD_APREXT; sub MY::top_targets { my $self = shift; my $string = $self->ModPerl::BuildMM::MY::top_targets; if (BUILD_APREXT) { ModPerl::MM::add_dep(\$string, pure_all => 'aprext'); # must not import File::Spec functions inside MY, it breaks # 5.6.x builds my ($apr_blib, $full_libname) = $build->mp_apr_blib(); my $from = File::Spec->catfile($apr_blib, $full_libname); (my $ap_lib = $build->ap_includedir()) =~ s{include$}{lib}; my $to = File::Spec->catfile($ap_lib, $full_libname); my $src_dir = File::Spec->catdir(qw(xs APR), 'aprext'); $string .= <<"EOF"; aprext: cd "$src_dir" && \$(MAKE) all \$(PASTHRU) LINKTYPE="static" aprext_install: \@\$(MKPATH) "$ap_lib" \$(CP) "$from" "$to" EOF } if ($build->should_build_apache) { ModPerl::MM::add_dep(\$string, pure_all => 'ap_build'); $string .= <<"EOF"; ap_build: modperl_lib cd "$build->{MP_AP_PREFIX}" && make ap_install: ap_build cd "$build->{MP_AP_PREFIX}" && make DESTDIR=\$(DESTDIR) install EOF } ModPerl::MM::add_dep(\$string, pure_all => 'modperl_lib'); $string .= <<'EOF'; source_scan: $(PERL) build/source_scan.pl xs_generate: $(PERL) build/xs_generate.pl bugreport: $(PERL) bin/mp2bug etags: $(SHELL) build/make_etags modperl_lib: cd "$(MODPERL_SRC)" && $(MAKE) modperl_lib_install: cd "$(MODPERL_SRC)" && $(MAKE) DESTDIR=$(DESTDIR) install modperl_xs_h_install: @$(MKPATH) $(DESTDIR)$(MODPERL_AP_INCLUDEDIR) $(CP) $(MODPERL_XS_H_FILES) $(DESTDIR)$(MODPERL_AP_INCLUDEDIR) modperl_src_clean: cd "$(MODPERL_SRC)" && $(MAKE) clean EOF # $(ECHO) was broken before 6.10_01 # XXX: if ever require 6.11 we can remove this workaround require ExtUtils::MakeMaker; (my $mm_ver = ExtUtils::MakeMaker->VERSION) =~ s/_\d+//; my $say = $mm_ver > 6.10 ? '@$(ECHO)' : '@$(PERL) -le "print shift"'; $string .= <<"EOF"; modperl_banner: $say "+--------------------------------------------------------------+" $say "| |" $say "| For details on getting started with mod_perl 2, see: |" $say "| |" $say "| http://perl.apache.org/docs/2.0/user/intro/start_fast.html |" $say "| |" $say "| |" $say "| Found a bug? File a bug report: |" $say "| |" $say "| http://perl.apache.org/bugs/ |" $say "| |" $say "+--------------------------------------------------------------+" EOF $string; } sub MY::install { my $self = shift; my $string = $self->MM::install(@_); for my $kind ('', '_site', '_vendor') { ModPerl::MM::add_dep(\$string, "pure${kind}_install" => 'ap_install') if $build->should_build_apache; ModPerl::MM::add_dep(\$string, "pure${kind}_install" => 'modperl_lib_install'); ModPerl::MM::add_dep(\$string, "pure${kind}_install" => 'modperl_xs_h_install'); # ModPerl::MM::add_dep(\$string, "pure${kind}_install" => 'aprext_install') # if BUILD_APREXT; ModPerl::MM::add_dep_after(\$string, "install$kind", "doc${kind}_install", 'modperl_banner'); # glue_pods target must come first ModPerl::MM::add_dep(\$string, "pure${kind}_install" => 'glue_pods'); } $string; } sub MY::clean { my $self = shift; my $string = $self->MM::clean(@_); ModPerl::MM::add_dep(\$string, clean => 'modperl_src_clean'); ModPerl::MM::add_dep(\$string, clean => 'test_clean'); $string; } sub MY::test { my $preamble; if (Apache::TestConfig::WIN32) { # need to add the location of Apache's dlls to the PATH my $ap_bindir = $build->apr_bindir() || ''; unless ($ap_bindir) { $ap_bindir = File::Spec->catdir($build->{MP_AP_PREFIX}, 'bin') if $build->{MP_AP_PREFIX}; } my $modperl_libexecdir = ''; if ($build->is_dynamic) { # need to add the location of mod_perl.so to the PATH my $lib = $build->modperl_libpath() || ''; if ($lib) { $modperl_libexecdir = File::Basename::dirname($lib); } else { $modperl_libexecdir = File::Spec->catdir($build->{cwd}, 'src/modules/perl') if $build->{cwd}; } } my $extra_path = ''; $extra_path .= ";$ap_bindir" if $ap_bindir; $extra_path .= ";$modperl_libexecdir" if $modperl_libexecdir; $preamble = <passenv_makestr(); $preamble = <mpm_is_threaded(); run_subtests :: cd Apache-SizeLimit && $(MAKE) test EOF $preamble .= <<'EOF'; test :: pure_all run_tests run_subtests EOF return $preamble; } sub MY::postamble { my $self = shift; my $string = $self->ModPerl::BuildMM::MY::postamble; if (!WIN32) { $string .= <<'EOF'; rpm: dist @[ -d $(PWD)/rpm ] || mkdir $(PWD)/rpm rpmbuild -ta --define "_rpmdir $(PWD)/rpm" \ --define "_srcrpmdir $(PWD)/rpm" \ $(DISTVNAME).tar.gz @mv $(PWD)/rpm/*/*.rpm $(PWD)/rpm/ @rm -rf $(PWD)/rpm/*/ EOF } $string .= <<'EOF'; mydist : Apache-Test/META.yml mod_perl.spec manifest tardist mod_perl.spec: build/make_rpm_spec $(PERL) build/make_rpm_spec Apache-Test/META.yml: cd Apache-Test && make metafile tag : svn copy https://svn.apache.org/repos/asf/perl/modperl/trunk https://svn.apache.org/repos/asf/perl/modperl/branches/release/$(VERSION_SYM) svn copy https://svn.apache.org/repos/asf/perl/modperl/branches/release/$(VERSION_SYM) https://svn.apache.org/repos/asf/perl/modperl/tags/$(VERSION_SYM) svn copy https://svn.apache.org/repos/asf/perl/modperl/docs/trunk https://svn.apache.org/repos/asf/perl/modperl/docs/tags/$(VERSION_SYM) EOF return $string; } # this is a workaround so that ModPerl::MM will move MY::constants # away, and Apache-Test/Makefile.PL which has its own MY::constants # won't get complaints on MY::constants redefined sub MY::constants { shift->ModPerl::BuildMM::MY::constants; } sub MY::tool_autosplit { ''; } sub MY::manifypods { my $self = shift; my $ver = $self->{VERSION} || ""; local $_ = $self->MM::manifypods(@_); s/pod2man\s*$/pod2man --release mod_perl-$ver/m; $_; } sub MY::pasthru { my $self = shift; chomp(my $str = $self->MM::pasthru); join $/, "$str\\", "\t".'PERL="$(PERL)"\\', "\t".'DEFINE="$(DEFINE)"', ""; } sub MY::dist_basics { my $self = shift; my $str = $self->MM::dist_basics; $str =~ s/(\"?)-MExtUtils(::Manifest=mkmanifest)/-Ilib $1-MModPerl$2/; $str; } mod_perl-2.0.9/MANIFEST0000644000104000010010000010070412540623201015112 0ustar AdministratorsNoneApache-Reload/Changes Apache-Reload/LICENSE Apache-Reload/MANIFEST Apache-Reload/Makefile.PL Apache-Reload/NOTICE Apache-Reload/README Apache-Reload/RELEASE Apache-Reload/lib/Apache/Reload.pm Apache-Reload/lib/Apache2/Reload.pm Apache-Reload/t/all.t Apache-Reload/t/conf/extra.last.conf.in Apache-Reload/t/lib/Apache/TestReload.pm Apache-Reload/t/lib/Apache2/TestReload.pm Apache-Reload/t/reload.t Apache-SizeLimit/Changes Apache-SizeLimit/INSTALL Apache-SizeLimit/LICENSE Apache-SizeLimit/MANIFEST Apache-SizeLimit/MANIFEST.SKIP Apache-SizeLimit/Makefile.PL Apache-SizeLimit/README Apache-SizeLimit/RELEASE Apache-SizeLimit/lib/Apache/SizeLimit.pm Apache-SizeLimit/lib/Apache/SizeLimit/Core.pm Apache-SizeLimit/lib/Apache2/SizeLimit.pm Apache-SizeLimit/t/apache/all.t Apache-SizeLimit/t/apache/check_n_requests2.t Apache-SizeLimit/t/apache/zzz_check_n_requests.t Apache-SizeLimit/t/apache2/all.t Apache-SizeLimit/t/apache2/check_n_requests2.t Apache-SizeLimit/t/apache2/zzz_check_n_requests.t Apache-SizeLimit/t/conf/modperl_extra.pl.in Apache-SizeLimit/t/pod.t Apache-SizeLimit/t/response/TestApache/basic.pm Apache-SizeLimit/t/response/TestApache/check_n_requests2.pm Apache-SizeLimit/t/response/TestApache/deprecated.pm Apache-SizeLimit/t/response/TestApache/zzz_check_n_requests.pm Apache-SizeLimit/t/response/TestApache2/basic.pm Apache-SizeLimit/t/response/TestApache2/check_n_requests2.pm Apache-SizeLimit/t/response/TestApache2/deprecated.pm Apache-SizeLimit/t/response/TestApache2/zzz_check_n_requests.pm Apache-Test/CONTRIBUTORS Apache-Test/Changes Apache-Test/INSTALL Apache-Test/LICENSE Apache-Test/Makefile.PL Apache-Test/README Apache-Test/RELEASE Apache-Test/SUPPORT Apache-Test/ToDo Apache-Test/lib/Apache/Test.pm Apache-Test/lib/Apache/Test5005compat.pm Apache-Test/lib/Apache/TestBuild.pm Apache-Test/lib/Apache/TestClient.pm Apache-Test/lib/Apache/TestCommon.pm Apache-Test/lib/Apache/TestCommonPost.pm Apache-Test/lib/Apache/TestConfig.pm Apache-Test/lib/Apache/TestConfigC.pm Apache-Test/lib/Apache/TestConfigPHP.pm Apache-Test/lib/Apache/TestConfigParrot.pm Apache-Test/lib/Apache/TestConfigParse.pm Apache-Test/lib/Apache/TestConfigPerl.pm Apache-Test/lib/Apache/TestHandler.pm Apache-Test/lib/Apache/TestHarness.pm Apache-Test/lib/Apache/TestHarnessPHP.pm Apache-Test/lib/Apache/TestMB.pm Apache-Test/lib/Apache/TestMM.pm Apache-Test/lib/Apache/TestPerlDB.pm Apache-Test/lib/Apache/TestReport.pm Apache-Test/lib/Apache/TestReportPerl.pm Apache-Test/lib/Apache/TestRequest.pm Apache-Test/lib/Apache/TestRun.pm Apache-Test/lib/Apache/TestRunPHP.pm Apache-Test/lib/Apache/TestRunParrot.pm Apache-Test/lib/Apache/TestRunPerl.pm Apache-Test/lib/Apache/TestSSLCA.pm Apache-Test/lib/Apache/TestServer.pm Apache-Test/lib/Apache/TestSmoke.pm Apache-Test/lib/Apache/TestSmokePerl.pm Apache-Test/lib/Apache/TestSort.pm Apache-Test/lib/Apache/TestTrace.pm Apache-Test/lib/Apache/TestUtil.pm Apache-Test/lib/Bundle/ApacheTest.pm Apache-Test/t/TEST.PL Apache-Test/t/alltest/01bang.t Apache-Test/t/alltest/all.t Apache-Test/t/alltest2/01bang.t Apache-Test/t/alltest2/all.t Apache-Test/t/bad_coding.t Apache-Test/t/cgi-bin/cookies.pl.PL Apache-Test/t/cgi-bin/next_available_port.pl.PL Apache-Test/t/conf/extra.conf.in Apache-Test/t/conf/modperl_extra.pl.in Apache-Test/t/cookies.t Apache-Test/t/import.t Apache-Test/t/log_watch.t Apache-Test/t/log_watch_for_broken_lines.t Apache-Test/t/more/01testpm.t Apache-Test/t/more/02testmore.t Apache-Test/t/more/03testpm.t Apache-Test/t/more/04testmore.t Apache-Test/t/more/all.t Apache-Test/t/next_available_port.t Apache-Test/t/ping.t Apache-Test/t/redirect.t Apache-Test/t/request.t Apache-Test/t/response/TestMore/testmorepm.pm Apache-Test/t/response/TestMore/testpm.pm Apache-Test/t/sok.t BRANCHING Changes INSTALL LICENSE MANIFEST META.yml Makefile.PL ModPerl-Registry/MANIFEST ModPerl-Registry/Makefile.PL ModPerl-Registry/README ModPerl-Registry/TODO ModPerl-Registry/lib/ModPerl/PerlRun.pm ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm ModPerl-Registry/lib/ModPerl/Registry.pm ModPerl-Registry/lib/ModPerl/RegistryBB.pm ModPerl-Registry/lib/ModPerl/RegistryCooker.pm ModPerl-Registry/lib/ModPerl/RegistryLoader.pm ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm ModPerl-Registry/t/206.t ModPerl-Registry/t/304.t ModPerl-Registry/t/404-filename-with-newline.t ModPerl-Registry/t/404.t ModPerl-Registry/t/500.t ModPerl-Registry/t/TEST.PL ModPerl-Registry/t/bad_scripts.t ModPerl-Registry/t/basic.t ModPerl-Registry/t/bin_resp.t ModPerl-Registry/t/cgi-bin/206.pl ModPerl-Registry/t/cgi-bin/304.pl ModPerl-Registry/t/cgi-bin/404.pl ModPerl-Registry/t/cgi-bin/basic.pl ModPerl-Registry/t/cgi-bin/bin_resp_start_0.pl ModPerl-Registry/t/cgi-bin/cgi.pl ModPerl-Registry/t/cgi-bin/closure.pl ModPerl-Registry/t/cgi-bin/content_type.pl ModPerl-Registry/t/cgi-bin/env.pl ModPerl-Registry/t/cgi-bin/env_val.pl ModPerl-Registry/t/cgi-bin/exit.pl ModPerl-Registry/t/cgi-bin/flush.pl ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl ModPerl-Registry/t/cgi-bin/local-conf.pl ModPerl-Registry/t/cgi-bin/missing_headers.pl ModPerl-Registry/t/cgi-bin/not_executable.pl ModPerl-Registry/t/cgi-bin/nph-foo.pl ModPerl-Registry/t/cgi-bin/perlrun_decl.pm ModPerl-Registry/t/cgi-bin/perlrun_extload.pl ModPerl-Registry/t/cgi-bin/perlrun_nondecl.pl ModPerl-Registry/t/cgi-bin/prefork.pl ModPerl-Registry/t/cgi-bin/r_inherited.pl ModPerl-Registry/t/cgi-bin/redirect-cookie.pl ModPerl-Registry/t/cgi-bin/redirect.pl ModPerl-Registry/t/cgi-bin/require.pl ModPerl-Registry/t/cgi-bin/runtime_error.pl ModPerl-Registry/t/cgi-bin/runtime_error_n_status_change.pl ModPerl-Registry/t/cgi-bin/runtime_error_plus_body.pl ModPerl-Registry/t/cgi-bin/send_headers.html ModPerl-Registry/t/cgi-bin/special_blocks.pl ModPerl-Registry/t/cgi-bin/status_change.pl ModPerl-Registry/t/cgi-bin/syntax_error.pl ModPerl-Registry/t/cgi-bin/use_error.pl ModPerl-Registry/t/cgi.t ModPerl-Registry/t/closure.t ModPerl-Registry/t/conf/extra.conf.in ModPerl-Registry/t/conf/modperl_extra_startup.pl ModPerl-Registry/t/dirindex.t ModPerl-Registry/t/fatalstobrowser.t ModPerl-Registry/t/flush.t ModPerl-Registry/t/ithreads.t ModPerl-Registry/t/nph.t ModPerl-Registry/t/perlrun_extload.t ModPerl-Registry/t/prefork.t ModPerl-Registry/t/redirect.t ModPerl-Registry/t/regex.t ModPerl-Registry/t/rewrite_env.t ModPerl-Registry/t/special_blocks.t NOTICE README README-SVN RELEASE STATUS SVN-MOVE bin/mp2bug build/config.pl build/make_etags build/make_rpm_spec build/source_scan.pl build/win32_fetch_apxs build/xs_generate.pl docs/TODO docs/api/APR.pod docs/api/APR/Base64.pod docs/api/APR/Brigade.pod docs/api/APR/Bucket.pod docs/api/APR/BucketAlloc.pod docs/api/APR/BucketType.pod docs/api/APR/Const.pod docs/api/APR/Date.pod docs/api/APR/Error.pod docs/api/APR/Finfo.pod docs/api/APR/IpSubnet.pod docs/api/APR/OS.pod docs/api/APR/PerlIO.pod docs/api/APR/Pool.pod docs/api/APR/SockAddr.pod docs/api/APR/Socket.pod docs/api/APR/Status.pod docs/api/APR/String.pod docs/api/APR/Table.pod docs/api/APR/ThreadMutex.pod docs/api/APR/ThreadRWLock.pod docs/api/APR/URI.pod docs/api/APR/UUID.pod docs/api/APR/Util.pod docs/api/AUTOGENERATION docs/api/Apache2/Access.pod docs/api/Apache2/CmdParms.pod docs/api/Apache2/Command.pod docs/api/Apache2/Connection.pod docs/api/Apache2/ConnectionUtil.pod docs/api/Apache2/Const.pod docs/api/Apache2/Directive.pod docs/api/Apache2/Filter.pod docs/api/Apache2/FilterRec.pod docs/api/Apache2/HookRun.pod docs/api/Apache2/Log.pod docs/api/Apache2/MPM.pod docs/api/Apache2/Module.pod docs/api/Apache2/PerlSections.pod docs/api/Apache2/Process.pod docs/api/Apache2/Reload.pod docs/api/Apache2/RequestIO.pod docs/api/Apache2/RequestRec.pod docs/api/Apache2/RequestUtil.pod docs/api/Apache2/Resource.pod docs/api/Apache2/Response.pod docs/api/Apache2/ServerRec.pod docs/api/Apache2/ServerUtil.pod docs/api/Apache2/SizeLimit.pod docs/api/Apache2/Status.pod docs/api/Apache2/SubProcess.pod docs/api/Apache2/SubRequest.pod docs/api/Apache2/URI.pod docs/api/Apache2/Util.pod docs/api/Apache2/compat.pod docs/api/Apache2/porting.pod docs/api/ModPerl/BuildMM.pod docs/api/ModPerl/Const.pod docs/api/ModPerl/Global.pod docs/api/ModPerl/MM.pod docs/api/ModPerl/MethodLookup.pod docs/api/ModPerl/PerlRun.pod docs/api/ModPerl/PerlRunPrefork.pod docs/api/ModPerl/Registry.pod docs/api/ModPerl/RegistryBB.pod docs/api/ModPerl/RegistryCooker.pod docs/api/ModPerl/RegistryLoader.pod docs/api/ModPerl/RegistryPrefork.pod docs/api/ModPerl/Util.pod docs/api/README docs/api/config.cfg docs/api/index_bot.html docs/config.cfg docs/devel/Changes.pod docs/devel/config.cfg docs/devel/core/apache_integration.pod docs/devel/core/coding_style.pod docs/devel/core/explained.pod docs/devel/core/mod_perl_specific.pod docs/devel/core/mpms.pod docs/devel/debug/c.pod docs/devel/debug/code/.debug-inline docs/devel/debug/code/.debug-modperl-init docs/devel/debug/code/.debug-modperl-register docs/devel/debug/code/.debug-modperl-xs docs/devel/debug/perl.pod docs/devel/help/help.pod docs/devel/performance/size_matters.pod docs/devel/performance/speed_matters.pod docs/devel/porting/porting.pod docs/index_top.html docs/os/config.cfg docs/os/win32/Changes.pod docs/os/win32/config.cfg docs/os/win32/config.pod docs/os/win32/distinstall docs/os/win32/faq.pod docs/os/win32/install.pod docs/os/win32/mpinstall docs/rename.pod docs/user/Changes.pod docs/user/coding/coding.pod docs/user/coding/cooking.pod docs/user/config.cfg docs/user/config/config.pod docs/user/config/custom.pod docs/user/design/design.pod docs/user/handlers/bucket_brigades.dia docs/user/handlers/bucket_brigades.gif docs/user/handlers/bucket_brigades.png docs/user/handlers/connection_cycle.gif docs/user/handlers/connection_cycle.png docs/user/handlers/connection_cycle_all.dia docs/user/handlers/connection_cycle_all.png docs/user/handlers/connection_cycle_pre.dia docs/user/handlers/connection_cycle_pre.png docs/user/handlers/connection_cycle_process.dia docs/user/handlers/connection_cycle_process.png docs/user/handlers/connection_cycle_time.dia docs/user/handlers/connection_cycle_time.gif docs/user/handlers/connection_cycle_time.png docs/user/handlers/filter_life_camera.jpg docs/user/handlers/filter_life_cigarrette.jpg docs/user/handlers/filter_life_coffee.jpg docs/user/handlers/filter_life_goggles.jpg docs/user/handlers/filter_life_mask.jpg docs/user/handlers/filter_life_player.jpg docs/user/handlers/filter_life_shower.jpg docs/user/handlers/filter_logic.dia docs/user/handlers/filter_logic.gif docs/user/handlers/filter_logic.png docs/user/handlers/filters.pod docs/user/handlers/general.pod docs/user/handlers/http.pod docs/user/handlers/http_cycle.gif docs/user/handlers/http_cycle.png docs/user/handlers/http_cycle1.gif docs/user/handlers/http_cycle1.png docs/user/handlers/http_cycle_access.dia docs/user/handlers/http_cycle_access.gif docs/user/handlers/http_cycle_access.png docs/user/handlers/http_cycle_all.dia docs/user/handlers/http_cycle_all.gif docs/user/handlers/http_cycle_all.png docs/user/handlers/http_cycle_authen.dia docs/user/handlers/http_cycle_authen.gif docs/user/handlers/http_cycle_authen.png docs/user/handlers/http_cycle_authz.dia docs/user/handlers/http_cycle_authz.gif docs/user/handlers/http_cycle_authz.png docs/user/handlers/http_cycle_cleanup.dia docs/user/handlers/http_cycle_cleanup.gif docs/user/handlers/http_cycle_cleanup.png docs/user/handlers/http_cycle_conn_filters.dia docs/user/handlers/http_cycle_conn_filters.gif docs/user/handlers/http_cycle_conn_filters.png docs/user/handlers/http_cycle_fixup.dia docs/user/handlers/http_cycle_fixup.gif docs/user/handlers/http_cycle_fixup.png docs/user/handlers/http_cycle_header_parser.dia docs/user/handlers/http_cycle_header_parser.gif docs/user/handlers/http_cycle_header_parser.png docs/user/handlers/http_cycle_http_filters.dia docs/user/handlers/http_cycle_http_filters.gif docs/user/handlers/http_cycle_http_filters.png docs/user/handlers/http_cycle_init.dia docs/user/handlers/http_cycle_init.gif docs/user/handlers/http_cycle_init.png docs/user/handlers/http_cycle_log.dia docs/user/handlers/http_cycle_log.gif docs/user/handlers/http_cycle_log.png docs/user/handlers/http_cycle_map_to_storage.dia docs/user/handlers/http_cycle_map_to_storage.gif docs/user/handlers/http_cycle_map_to_storage.png docs/user/handlers/http_cycle_post_read_request.dia docs/user/handlers/http_cycle_post_read_request.gif docs/user/handlers/http_cycle_post_read_request.png docs/user/handlers/http_cycle_response.dia docs/user/handlers/http_cycle_response.gif docs/user/handlers/http_cycle_response.png docs/user/handlers/http_cycle_trans.dia docs/user/handlers/http_cycle_trans.gif docs/user/handlers/http_cycle_trans.png docs/user/handlers/http_cycle_type.dia docs/user/handlers/http_cycle_type.gif docs/user/handlers/http_cycle_type.png docs/user/handlers/in_filter_stream.dia docs/user/handlers/in_filter_stream.gif docs/user/handlers/in_filter_stream.png docs/user/handlers/intro.pod docs/user/handlers/out.gif docs/user/handlers/out_filter_stream.dia docs/user/handlers/out_filter_stream.gif docs/user/handlers/out_filter_stream.png docs/user/handlers/practical_mod_perl_comp.gif docs/user/handlers/protocols.pod docs/user/handlers/server.pod docs/user/handlers/server_life_cycle.dia docs/user/handlers/server_life_cycle.gif docs/user/handlers/server_life_cycle.png docs/user/handlers/tmlogo_color.gif docs/user/help/help.pod docs/user/install/install.pod docs/user/intro/overview.pod docs/user/intro/start_fast.pod docs/user/performance/mpm.pod docs/user/performance/prevent.pod docs/user/porting/code/apache_mp3_2.diff docs/user/porting/code/apache_mp3_7.diff docs/user/porting/code/apache_mp3_9.diff docs/user/porting/compat.pod docs/user/porting/porting.pod docs/user/troubleshooting/troubleshooting.pod lib/APR/XSLoader.pm lib/Apache2/Build.pm lib/Apache2/ParseSource.pm lib/Apache2/PerlSections.pm lib/Apache2/PerlSections/Dump.pm lib/Apache2/Resource.pm lib/Apache2/SourceTables.pm lib/Apache2/Status.pm lib/Apache2/XSLoader.pm lib/Apache2/compat.pm lib/Apache2/porting.pm lib/Bundle/Apache2.pm lib/ModPerl/BuildMM.pm lib/ModPerl/BuildOptions.pm lib/ModPerl/CScan.pm lib/ModPerl/Code.pm lib/ModPerl/Config.pm lib/ModPerl/DummyVersions.pm lib/ModPerl/FunctionMap.pm lib/ModPerl/MM.pm lib/ModPerl/Manifest.pm lib/ModPerl/MapUtil.pm lib/ModPerl/MethodLookup.pm lib/ModPerl/ParseSource.pm lib/ModPerl/StructureMap.pm lib/ModPerl/TestReport.pm lib/ModPerl/TestRun.pm lib/ModPerl/TypeMap.pm lib/ModPerl/WrapXS.pm lib/mod_perl2.pm mod_perl.spec src/modules/perl/mod_perl.c src/modules/perl/mod_perl.h src/modules/perl/modperl_apache_compat.c src/modules/perl/modperl_apache_compat.h src/modules/perl/modperl_apache_includes.h src/modules/perl/modperl_apr_compat.h src/modules/perl/modperl_apr_includes.h src/modules/perl/modperl_bucket.c src/modules/perl/modperl_bucket.h src/modules/perl/modperl_callback.c src/modules/perl/modperl_callback.h src/modules/perl/modperl_cgi.c src/modules/perl/modperl_cgi.h src/modules/perl/modperl_cmd.c src/modules/perl/modperl_cmd.h src/modules/perl/modperl_common_debug.c src/modules/perl/modperl_common_debug.h src/modules/perl/modperl_common_includes.h src/modules/perl/modperl_common_log.c src/modules/perl/modperl_common_log.h src/modules/perl/modperl_common_types.h src/modules/perl/modperl_common_util.c src/modules/perl/modperl_common_util.h src/modules/perl/modperl_config.c src/modules/perl/modperl_config.h src/modules/perl/modperl_const.c src/modules/perl/modperl_const.h src/modules/perl/modperl_debug.c src/modules/perl/modperl_debug.h src/modules/perl/modperl_env.c src/modules/perl/modperl_env.h src/modules/perl/modperl_error.c src/modules/perl/modperl_error.h src/modules/perl/modperl_filter.c src/modules/perl/modperl_filter.h src/modules/perl/modperl_global.c src/modules/perl/modperl_global.h src/modules/perl/modperl_gtop.c src/modules/perl/modperl_gtop.h src/modules/perl/modperl_handler.c src/modules/perl/modperl_handler.h src/modules/perl/modperl_interp.c src/modules/perl/modperl_interp.h src/modules/perl/modperl_io.c src/modules/perl/modperl_io.h src/modules/perl/modperl_io_apache.c src/modules/perl/modperl_io_apache.h src/modules/perl/modperl_log.c src/modules/perl/modperl_log.h src/modules/perl/modperl_mgv.c src/modules/perl/modperl_mgv.h src/modules/perl/modperl_module.c src/modules/perl/modperl_module.h src/modules/perl/modperl_options.c src/modules/perl/modperl_options.h src/modules/perl/modperl_pcw.c src/modules/perl/modperl_pcw.h src/modules/perl/modperl_perl.c src/modules/perl/modperl_perl.h src/modules/perl/modperl_perl_global.c src/modules/perl/modperl_perl_global.h src/modules/perl/modperl_perl_includes.h src/modules/perl/modperl_perl_pp.c src/modules/perl/modperl_perl_pp.h src/modules/perl/modperl_perl_unembed.h src/modules/perl/modperl_svptr_table.c src/modules/perl/modperl_svptr_table.h src/modules/perl/modperl_sys.c src/modules/perl/modperl_sys.h src/modules/perl/modperl_time.h src/modules/perl/modperl_tipool.c src/modules/perl/modperl_tipool.h src/modules/perl/modperl_types.h src/modules/perl/modperl_util.c src/modules/perl/modperl_util.h t/apache/add_config.t t/apache/cgihandler.t t/apache/constants.t t/apache/content_length_header.t t/apache/discard_rbody.t t/apache/post.t t/apache/read.t t/apache/read2.t t/apache/read3.t t/apache/read4.t t/apache/scanhdrs.t t/apache/scanhdrs2.t t/apache/send_cgi_header.t t/api/access2.t t/api/access2_24.t t/api/add_config.t t/api/content_encoding.t t/api/custom_response.t t/api/err_headers_out.t t/api/in_out_filters.t t/api/internal_redirect.t t/api/internal_redirect_handler.t t/api/lookup_misc.t t/api/lookup_uri.t t/api/request_rec.t t/api/rflush.t t/api/sendfile.t t/api/slurp_filename.t t/api/status.t t/apr-ext/base64.t t/apr-ext/brigade.t t/apr-ext/bucket.t t/apr-ext/date.t t/apr-ext/error.t t/apr-ext/finfo.t t/apr-ext/os.t t/apr-ext/pool.t t/apr-ext/status.t t/apr-ext/string.t t/apr-ext/table.t t/apr-ext/threadmutex.t t/apr-ext/threadrwlock.t t/apr-ext/uri.t t/apr-ext/util.t t/apr-ext/uuid.t t/apr/constants.t t/apr/pool_lifetime.t t/compat/conn_authen.t t/compat/request_body.t t/compat/send_fd.t t/conf/extra.conf.in t/conf/extra.last.conf.in t/conf/modperl_extra.pl t/conf/post_config_startup.pl t/directive/perl.t t/directive/perlcleanuphandler.t t/directive/perlloadmodule2.t t/directive/perlloadmodule3.t t/directive/perlloadmodule4.t t/directive/perlloadmodule5.t t/directive/perlloadmodule6.t t/directive/perlmodule.t t/directive/perlrequire.t t/directive/setupenv.t t/error/runtime.t t/error/syntax.t t/filter/TestFilter/both_str_con_add.pm t/filter/TestFilter/both_str_native_remove.pm t/filter/TestFilter/both_str_req_add.pm t/filter/TestFilter/both_str_req_mix.pm t/filter/TestFilter/both_str_req_proxy.pm t/filter/TestFilter/in_autoload.pm t/filter/TestFilter/in_bbs_body.pm t/filter/TestFilter/in_bbs_consume.pm t/filter/TestFilter/in_bbs_inject_header.pm t/filter/TestFilter/in_bbs_msg.pm t/filter/TestFilter/in_bbs_underrun.pm t/filter/TestFilter/in_error.pm t/filter/TestFilter/in_init_basic.pm t/filter/TestFilter/in_str_bin_data.pm t/filter/TestFilter/in_str_consume.pm t/filter/TestFilter/in_str_declined.pm t/filter/TestFilter/in_str_declined_read.pm t/filter/TestFilter/in_str_lc.pm t/filter/TestFilter/in_str_msg.pm t/filter/TestFilter/in_str_sandwich.pm t/filter/TestFilter/out_bbs_basic.pm t/filter/TestFilter/out_bbs_ctx.pm t/filter/TestFilter/out_bbs_filebucket.pm t/filter/TestFilter/out_init_basic.pm t/filter/TestFilter/out_str_api.pm t/filter/TestFilter/out_str_buffer.pm t/filter/TestFilter/out_str_ctx.pm t/filter/TestFilter/out_str_declined.pm t/filter/TestFilter/out_str_eval.pm t/filter/TestFilter/out_str_lc.pm t/filter/TestFilter/out_str_remove.pm t/filter/TestFilter/out_str_req_eos.pm t/filter/TestFilter/out_str_req_mix.pm t/filter/TestFilter/out_str_reverse.pm t/filter/TestFilter/out_str_subreq_default.pm t/filter/TestFilter/out_str_subreq_modperl.pm t/filter/TestFilter/with_subrequest.pm t/filter/both_str_con_add.t t/filter/both_str_native_remove.t t/filter/both_str_req_add.t t/filter/both_str_req_mix.t t/filter/both_str_req_proxy.t t/filter/in_autoload.t t/filter/in_bbs_body.t t/filter/in_bbs_consume.t t/filter/in_bbs_inject_header.t t/filter/in_bbs_msg.t t/filter/in_bbs_underrun.t t/filter/in_error.t t/filter/in_init_basic.t t/filter/in_str_bin_data.t t/filter/in_str_consume.t t/filter/in_str_declined.t t/filter/in_str_declined_read.t t/filter/in_str_lc.t t/filter/in_str_msg.t t/filter/in_str_sandwich.t t/filter/out_apache.t t/filter/out_bbs_ctx.t t/filter/out_bbs_filebucket.t t/filter/out_init_basic.t t/filter/out_str_buffer.t t/filter/out_str_ctx.t t/filter/out_str_declined.t t/filter/out_str_lc.t t/filter/out_str_remove.t t/filter/out_str_req_eos.t t/filter/out_str_req_mix.t t/filter/out_str_reverse.t t/filter/out_str_subreq_default.t t/filter/out_str_subreq_modperl.t t/filter/with_subrequest.t t/hooks/TestHooks/access.pm t/hooks/TestHooks/authen_basic.pm t/hooks/TestHooks/authen_digest.pm t/hooks/TestHooks/authz.pm t/hooks/TestHooks/cleanup.pm t/hooks/TestHooks/cleanup2.pm t/hooks/TestHooks/error.pm t/hooks/TestHooks/fixup.pm t/hooks/TestHooks/headerparser.pm t/hooks/TestHooks/hookrun.pm t/hooks/TestHooks/init.pm t/hooks/TestHooks/inlined_handlers.pm t/hooks/TestHooks/push_handlers.pm t/hooks/TestHooks/push_handlers_anon.pm t/hooks/TestHooks/push_handlers_blessed.pm t/hooks/TestHooks/push_handlers_same_phase.pm t/hooks/TestHooks/set_handlers.pm t/hooks/TestHooks/stacked_handlers.pm t/hooks/TestHooks/stacked_handlers2.pm t/hooks/TestHooks/startup.pm t/hooks/TestHooks/trans.pm t/hooks/access.t t/hooks/authen_basic.t t/hooks/authen_digest.t t/hooks/authz.t t/hooks/cleanup.t t/hooks/cleanup2.t t/hooks/error.t t/hooks/hookrun.t t/hooks/init.t t/hooks/inlined_handlers.t t/hooks/push_handlers.t t/hooks/push_handlers_anon.t t/hooks/stacked_handlers.t t/hooks/stacked_handlers2.t t/hooks/startup.t t/hooks/trans.t t/htdocs/TestAPI__add_config/htaccess t/htdocs/api/auth-groups t/htdocs/api/auth-users t/htdocs/api/custom_response.txt t/htdocs/api/slurp.pl t/htdocs/filter/reverse.txt t/htdocs/filter/subrequest.txt t/htdocs/includes-registry/cgipm.pl t/htdocs/includes-registry/test.pl t/htdocs/includes-registry/test.spl t/htdocs/includes/clear.shtml t/htdocs/includes/footer.shtml t/htdocs/includes/header.shtml t/htdocs/includes/test.shtml t/htdocs/merge3/htaccess t/htdocs/modperl/setupenv2/config_require.pl t/htdocs/modperl/setupenv2/module.pm t/htdocs/modperl/setupenv2/post_config_require.pl t/htdocs/modperl/setupenv2/require.pl t/htdocs/perlio/MoonRise.jpeg t/htdocs/perlio/redrum.txt t/htdocs/protocols/basic-auth t/htdocs/vhost/post_config.pl t/htdocs/vhost/startup.pl t/lib/TestAPRlib/base64.pm t/lib/TestAPRlib/brigade.pm t/lib/TestAPRlib/bucket.pm t/lib/TestAPRlib/date.pm t/lib/TestAPRlib/error.pm t/lib/TestAPRlib/finfo.pm t/lib/TestAPRlib/os.pm t/lib/TestAPRlib/pool.pm t/lib/TestAPRlib/status.pm t/lib/TestAPRlib/string.pm t/lib/TestAPRlib/table.pm t/lib/TestAPRlib/threadmutex.pm t/lib/TestAPRlib/threadrwlock.pm t/lib/TestAPRlib/uri.pm t/lib/TestAPRlib/util.pm t/lib/TestAPRlib/uuid.pm t/lib/TestCommon/FilterDebug.pm t/lib/TestCommon/Handlers.pm t/lib/TestCommon/LogDiff.pm t/lib/TestCommon/MemoryLeak.pm t/lib/TestCommon/SameInterp.pm t/lib/TestCommon/TiePerlSection.pm t/lib/TestCommon/Utils.pm t/lib/TestExit/FromPerlModule.pm t/modperl/cookie.t t/modperl/cookie2.t t/modperl/exit.t t/modperl/getc.t t/modperl/local_env.t t/modperl/merge.t t/modperl/merge2.t t/modperl/merge3.t t/modperl/perl_options.t t/modperl/perl_options2.t t/modperl/pnotes.t t/modperl/pnotes2.t t/modperl/post_utf8.t t/modperl/print_utf8.t t/modperl/print_utf8_2.t t/modperl/readline.t t/modperl/request_rec_perlio_api.t t/modperl/setupenv.t t/modperl/setupenv2.t t/modperl/status.t t/modules/apache_resource.t t/modules/apache_status.t t/modules/cgi.t t/modules/cgi2.t t/modules/cgipost.t t/modules/cgipost2.t t/modules/cgiupload.t t/modules/cgiupload2.t t/modules/include.t t/modules/include2.t t/modules/include_subreq.t t/modules/proxy.t t/perl/hash_attack.t t/preconnection/TestPreConnection/note.pm t/preconnection/note.t t/protocol/TestProtocol/echo_bbs.pm t/protocol/TestProtocol/echo_bbs2.pm t/protocol/TestProtocol/echo_block.pm t/protocol/TestProtocol/echo_filter.pm t/protocol/TestProtocol/echo_nonblock.pm t/protocol/TestProtocol/echo_timeout.pm t/protocol/TestProtocol/pseudo_http.pm t/protocol/echo_bbs.t t/protocol/echo_bbs2.t t/protocol/echo_block.t t/protocol/echo_filter.t t/protocol/echo_nonblock.t t/protocol/echo_timeout.t t/protocol/pseudo_http.t t/response/TestAPI/access.pm t/response/TestAPI/access2.pm t/response/TestAPI/access2_24.pm t/response/TestAPI/add_config.pm t/response/TestAPI/aplog.pm t/response/TestAPI/command.pm t/response/TestAPI/conn_rec.pm t/response/TestAPI/conn_util.pm t/response/TestAPI/content_encoding.pm t/response/TestAPI/custom_response.pm t/response/TestAPI/err_headers_out.pm t/response/TestAPI/in_out_filters.pm t/response/TestAPI/internal_redirect.pm t/response/TestAPI/internal_redirect_handler.pm t/response/TestAPI/lookup_misc.pm t/response/TestAPI/lookup_uri.pm t/response/TestAPI/lookup_uri2.pm t/response/TestAPI/module.pm t/response/TestAPI/process.pm t/response/TestAPI/query.pm t/response/TestAPI/request_rec.pm t/response/TestAPI/request_subclass.pm t/response/TestAPI/request_util.pm t/response/TestAPI/response.pm t/response/TestAPI/rflush.pm t/response/TestAPI/sendfile.pm t/response/TestAPI/server_const.pm t/response/TestAPI/server_rec.pm t/response/TestAPI/server_util.pm t/response/TestAPI/show.pm t/response/TestAPI/slurp_filename.pm t/response/TestAPI/status.pm t/response/TestAPI/sub_request.pm t/response/TestAPI/uri.pm t/response/TestAPR/base64.pm t/response/TestAPR/brigade.pm t/response/TestAPR/bucket.pm t/response/TestAPR/date.pm t/response/TestAPR/finfo.pm t/response/TestAPR/flatten.pm t/response/TestAPR/ipsubnet.pm t/response/TestAPR/os.pm t/response/TestAPR/perlio.pm t/response/TestAPR/pool.pm t/response/TestAPR/pool_lifetime.pm t/response/TestAPR/sockaddr.pm t/response/TestAPR/socket.pm t/response/TestAPR/status.pm t/response/TestAPR/string.pm t/response/TestAPR/table.pm t/response/TestAPR/threadmutex.pm t/response/TestAPR/threadrwlock.pm t/response/TestAPR/uri.pm t/response/TestAPR/util.pm t/response/TestAPR/uuid.pm t/response/TestApache/cgihandler.pm t/response/TestApache/conftree.pm t/response/TestApache/content_length_header.pm t/response/TestApache/daemon.pm t/response/TestApache/discard_rbody.pm t/response/TestApache/post.pm t/response/TestApache/read.pm t/response/TestApache/read2.pm t/response/TestApache/read3.pm t/response/TestApache/read4.pm t/response/TestApache/scanhdrs.pm t/response/TestApache/scanhdrs2.pm t/response/TestApache/send_cgi_header.pm t/response/TestApache/subprocess.pm t/response/TestApache/util.pm t/response/TestApache/write.pm t/response/TestCompat/apache.pm t/response/TestCompat/apache_file.pm t/response/TestCompat/apache_module.pm t/response/TestCompat/apache_table.pm t/response/TestCompat/apache_uri.pm t/response/TestCompat/apache_util.pm t/response/TestCompat/conn_authen.pm t/response/TestCompat/conn_rec.pm t/response/TestCompat/request.pm t/response/TestCompat/request_body.pm t/response/TestCompat/send_fd.pm t/response/TestDirective/cmdparms.pm t/response/TestDirective/env.pm t/response/TestDirective/perlcleanuphandler.pm t/response/TestDirective/perldo.pm t/response/TestDirective/perlloadmodule.pm t/response/TestDirective/perlloadmodule2.pm t/response/TestDirective/perlloadmodule3.pm t/response/TestDirective/perlloadmodule4.pm t/response/TestDirective/perlloadmodule5.pm t/response/TestDirective/perlloadmodule6.pm t/response/TestDirective/perlloadmodule7.pm t/response/TestDirective/perlmodule.pm t/response/TestDirective/perlrequire.pm t/response/TestDirective/pod.pm t/response/TestDirective/setupenv.pm t/response/TestError/api.pm t/response/TestError/runtime.pm t/response/TestError/syntax.pm t/response/TestModperl/cookie.pm t/response/TestModperl/cookie2.pm t/response/TestModperl/current_callback.pm t/response/TestModperl/dir_config.pm t/response/TestModperl/endav.pm t/response/TestModperl/env.pm t/response/TestModperl/exit.pm t/response/TestModperl/getc.pm t/response/TestModperl/interpreter.pm t/response/TestModperl/io_nested_with_closed_stds.pm t/response/TestModperl/io_with_closed_stds.pm t/response/TestModperl/local_env.pm t/response/TestModperl/merge.pm t/response/TestModperl/method.pm t/response/TestModperl/methodname.pm t/response/TestModperl/methodobj.pm t/response/TestModperl/perl.pm t/response/TestModperl/perl_options.pm t/response/TestModperl/perl_options2.pm t/response/TestModperl/pnotes.pm t/response/TestModperl/pnotes2.pm t/response/TestModperl/post_utf8.pm t/response/TestModperl/print.pm t/response/TestModperl/print_utf8.pm t/response/TestModperl/print_utf8_2.pm t/response/TestModperl/printf.pm t/response/TestModperl/readline.pm t/response/TestModperl/request_rec_perlio_api.pm t/response/TestModperl/request_rec_tie_api.pm t/response/TestModperl/setauth.pm t/response/TestModperl/setupenv.pm t/response/TestModperl/setupenv2.pm t/response/TestModperl/status.pm t/response/TestModperl/stdfd.pm t/response/TestModperl/stdfd2.pm t/response/TestModperl/subenv.pm t/response/TestModperl/taint.pm t/response/TestModperl/util.pm t/response/TestModules/cgi.pm t/response/TestModules/cgi2.pm t/response/TestModules/cgipost.pm t/response/TestModules/cgipost2.pm t/response/TestModules/cgiupload.pm t/response/TestModules/cgiupload2.pm t/response/TestModules/include_subreq.pm t/response/TestModules/proxy.pm t/response/TestPerl/api.pm t/response/TestPerl/hash_attack.pm t/response/TestPerl/signals.pm t/response/TestUser/rewrite.pm t/response/TestVhost/config.pm t/response/TestVhost/log.pm t/user/README t/user/rewrite.t t/vhost/config.t t/vhost/log.t todo/2.0.6 todo/README todo/api_status todo/bugs_apr_ext todo/bugs_build todo/bugs_mp todo/bugs_registry todo/design_notes todo/docs todo/features_deprecated todo/features_maybe todo/features_missing todo/features_new todo/features_optimization todo/features_registry todo/release todo/tests_issues todo/tests_wanted util/apr_arg_check.pl util/apr_pool_check.pl util/cvsize.pl util/getdiff.pl util/methodlookup_check.pl util/perl_bloat.pl util/sizeof.pl util/source_stats.pl util/xs_check.pl xs/APR/APR/APR.pm xs/APR/APR/APR.xs xs/APR/APR/Makefile.PL xs/APR/APR/apr-test xs/APR/Base64/APR__Base64.h xs/APR/Brigade/APR__Brigade.h xs/APR/Bucket/APR__Bucket.h xs/APR/BucketAlloc/APR__BucketAlloc.h xs/APR/Const/Const.pm xs/APR/Const/Const.xs xs/APR/Const/Makefile.PL xs/APR/Error/APR__Error.h xs/APR/Error/Error_pm xs/APR/Finfo/APR__Finfo.h xs/APR/IpSubnet/APR__IpSubnet.h xs/APR/Lock/APR__Lock.h xs/APR/Makefile.PL xs/APR/OS/APR__OS.h xs/APR/PerlIO/Makefile.PL xs/APR/PerlIO/PerlIO.pm xs/APR/PerlIO/PerlIO.xs xs/APR/PerlIO/modperl_apr_perlio.c xs/APR/PerlIO/modperl_apr_perlio.h xs/APR/Pool/APR__Pool.h xs/APR/SockAddr/APR__SockAddr.h xs/APR/Socket/APR__Socket.h xs/APR/Status/APR__Status.h xs/APR/String/APR__String.h xs/APR/Table/APR__Table.h xs/APR/ThreadMutex/APR__ThreadMutex.h xs/APR/ThreadRWLock/APR__ThreadRWLock.h xs/APR/URI/APR__URI.h xs/APR/UUID/APR__UUID.h xs/APR/Util/APR__Util.h xs/APR/aprext/Makefile.PL xs/APR/aprext/modperl_dummy.c xs/Apache2/Access/Apache2__Access.h xs/Apache2/CmdParms/Apache2__CmdParms.h xs/Apache2/Command/Apache2__Command.h xs/Apache2/Connection/Apache2__Connection.h xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h xs/Apache2/Const/Const.pm xs/Apache2/Const/Const.xs xs/Apache2/Const/Makefile.PL xs/Apache2/Directive/Apache2__Directive.h xs/Apache2/Filter/Apache2__Filter.h xs/Apache2/Log/Apache2__Log.h xs/Apache2/MPM/Apache2__MPM.h xs/Apache2/Makefile.PL xs/Apache2/Module/Apache2__Module.h xs/Apache2/RequestIO/Apache2__RequestIO.h xs/Apache2/RequestRec/Apache2__RequestRec.h xs/Apache2/RequestUtil/Apache2__RequestUtil.h xs/Apache2/Response/Apache2__Response.h xs/Apache2/ServerRec/Apache2__ServerRec.h xs/Apache2/ServerRec/ServerRec_pm xs/Apache2/ServerUtil/Apache2__ServerUtil.h xs/Apache2/SubProcess/Apache2__SubProcess.h xs/Apache2/SubProcess/SubProcess_pm xs/Apache2/SubRequest/Apache2__SubRequest.h xs/Apache2/URI/Apache2__URI.h xs/Apache2/Util/Apache2__Util.h xs/Makefile.PL xs/ModPerl/Const/Const.pm xs/ModPerl/Const/Const.xs xs/ModPerl/Const/Makefile.PL xs/ModPerl/Global/ModPerl__Global.h xs/ModPerl/Interpreter/ModPerl__Interpreter.h xs/ModPerl/Makefile.PL xs/ModPerl/Util/ModPerl__Util.h xs/ModPerl/Util/Util_pm xs/maps/apache2_functions.map xs/maps/apache2_structures.map xs/maps/apache2_types.map xs/maps/apr_functions.map xs/maps/apr_structures.map xs/maps/apr_types.map xs/maps/modperl_functions.map xs/maps/modperl_structures.map xs/maps/modperl_types.map xs/modperl_xs_util.h xs/tables/current/APR/FunctionTable.pm xs/tables/current/Apache2/ConstantsTable.pm xs/tables/current/Apache2/FunctionTable.pm xs/tables/current/Apache2/StructureTable.pm xs/tables/current/ModPerl/FunctionTable.pm xs/tables/current24/APR/FunctionTable.pm xs/tables/current24/Apache2/ConstantsTable.pm xs/tables/current24/Apache2/FunctionTable.pm xs/tables/current24/Apache2/StructureTable.pm xs/tables/current24/ModPerl/FunctionTable.pm xs/typemap mod_perl-2.0.9/META.yml0000644000104000010010000000112612540623201015230 0ustar AdministratorsNonename: mod_perl version: 2.0.9 installdirs: site distribution_type: module no_index: directory: # A-T and others have their own CPAN distros - Apache-Test - Apache-Reload - Apache-SizeLimit package: # Internally redefined module - C::Preprocessed # Fake packages - Apache::Status::_version - perlrun_decl # Apache::compat redefines - Apache - Apache::Constants - Apache::File - Apache::SIG - Apache::Server - Apache::Table - Apache::Util mod_perl-2.0.9/ModPerl-Registry/0000755000104000010010000000000012540623202017130 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/lib/0000755000104000010010000000000012540623172017704 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/0000755000104000010010000000000012540623201021237 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/PerlRun.pm0000644000104000010010000000540512540623201023170 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::PerlRun; use strict; use warnings FATAL => 'all'; # we try to develop so we reload ourselves without die'ing on the warning no warnings qw(redefine); # XXX, this should go away in production! our $VERSION = '1.99'; use base qw(ModPerl::RegistryCooker); sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } my $parent = 'ModPerl::RegistryCooker'; # the following code: # - specifies package's behavior different from default of $parent class # - speeds things up by shortcutting @ISA search, so even if the # default is used we still use the alias my %aliases = ( new => 'new', init => 'init', default_handler => 'default_handler', run => 'run', can_compile => 'can_compile', make_namespace => 'make_namespace', namespace_root => 'namespace_root', namespace_from => 'namespace_from_filename', is_cached => 'FALSE', should_compile => 'TRUE', flush_namespace => 'flush_namespace_normal', cache_table => 'cache_table_common', cache_it => 'NOP', read_script => 'read_script', shebang_to_perl => 'shebang_to_perl', get_script_name => 'get_script_name', chdir_file => 'NOP', get_mark_line => 'get_mark_line', compile => 'compile', error_check => 'error_check', should_reset_inc_hash => 'TRUE', strip_end_data_segment => 'strip_end_data_segment', convert_script_to_compiled_handler => 'convert_script_to_compiled_handler', ); # in this module, all the methods are inherited from the same parent # class, so we fixup aliases instead of using the source package in # first place. $aliases{$_} = $parent . "::" . $aliases{$_} for keys %aliases; __PACKAGE__->install_aliases(\%aliases); 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/PerlRunPrefork.pm0000644000104000010010000000117412540623201024520 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package ModPerl::PerlRunPrefork; use strict; use warnings FATAL => 'all'; our $VERSION = '0.01'; use base qw(ModPerl::PerlRun); if ($ENV{MOD_PERL}) { require Apache2::MPM; die "This package can't be used under threaded MPMs" if Apache2::MPM->is_threaded; } sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } *chdir_file = \&ModPerl::RegistryCooker::chdir_file_normal; 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/Registry.pm0000644000104000010010000000617512540623201023416 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::Registry; use strict; use warnings FATAL => 'all'; # we try to develop so we reload ourselves without die'ing on the warning no warnings qw(redefine); # XXX, this should go away in production! our $VERSION = '1.99'; use base qw(ModPerl::RegistryCooker); sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } my $parent = 'ModPerl::RegistryCooker'; # the following code: # - specifies package's behavior different from default of $parent class # - speeds things up by shortcutting @ISA search, so even if the # default is used we still use the alias my %aliases = ( new => 'new', init => 'init', default_handler => 'default_handler', run => 'run', can_compile => 'can_compile', make_namespace => 'make_namespace', namespace_root => 'namespace_root', namespace_from => 'namespace_from_filename', is_cached => 'is_cached', should_compile => 'should_compile_if_modified', flush_namespace => 'NOP', cache_table => 'cache_table_common', cache_it => 'cache_it', read_script => 'read_script', shebang_to_perl => 'shebang_to_perl', get_script_name => 'get_script_name', chdir_file => 'NOP', get_mark_line => 'get_mark_line', compile => 'compile', error_check => 'error_check', strip_end_data_segment => 'strip_end_data_segment', convert_script_to_compiled_handler => 'convert_script_to_compiled_handler', ); # in this module, all the methods are inherited from the same parent # class, so we fixup aliases instead of using the source package in # first place. $aliases{$_} = $parent . "::" . $aliases{$_} for keys %aliases; __PACKAGE__->install_aliases(\%aliases); # Note that you don't have to do the aliases if you use defaults, it # just speeds things up the first time the sub runs, after that # methods are cached. # # But it's still handy, since you explicitly specify which subs from # the parent package you are using # # META: if the ISA search results are cached on the first lookup, may # be we need to alias only those methods that override the defaults? 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/RegistryBB.pm0000644000104000010010000000263612540623201023620 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::RegistryBB; use strict; use warnings FATAL => 'all'; # we try to develop so we reload ourselves without die'ing on the warning no warnings qw(redefine); # XXX, this should go away in production! our $VERSION = '1.99'; use base qw(ModPerl::RegistryCooker); sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } # currently all the methods are inherited through the normal ISA # search may 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/RegistryCooker.pm0000644000104000010010000005771312540623201024565 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # VERY IMPORTANT: Be very careful modifying the defaults, since many # VERY IMPORTANT: packages rely on them. In fact you should never # VERY IMPORTANT: modify the defaults after the package gets released, # VERY IMPORTANT: since they are a hardcoded part of this suite's API. package ModPerl::RegistryCooker; require 5.006; use strict; use warnings FATAL => 'all'; our $VERSION = '1.99'; use Apache2::ServerUtil (); use Apache2::Response (); use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::RequestIO (); use Apache2::Log (); use Apache2::Access (); use APR::Table (); use APR::Finfo (); use APR::Status (); use ModPerl::Util (); use ModPerl::Global (); use File::Spec::Functions (); use File::Basename (); use Apache2::Const -compile => qw(:common &OPT_EXECCGI); use APR::Const -compile => qw(FILETYPE_REG); use ModPerl::Const -compile => 'EXIT'; unless (defined $ModPerl::Registry::MarkLine) { $ModPerl::Registry::MarkLine = 1; } ######################################################################### # debug constants # ######################################################################### use constant D_NONE => 0; use constant D_ERROR => 1; use constant D_WARN => 2; use constant D_COMPILE => 4; use constant D_NOISE => 8; # the debug level can be overriden on the main server level of # httpd.conf with: # PerlSetVar ModPerl::RegistryCooker::DEBUG 4 use constant DEBUG => 0; #XXX: below currently crashes the server on win32 # defined Apache2->server->dir_config('ModPerl::RegistryCooker::DEBUG') # ? Apache2->server->dir_config('ModPerl::RegistryCooker::DEBUG') # : D_NONE; ######################################################################### # OS specific constants # ######################################################################### use constant IS_WIN32 => $^O eq "MSWin32"; ######################################################################### # constant subs # ######################################################################### use constant NOP => ''; use constant TRUE => 1; use constant FALSE => 0; use constant NAMESPACE_ROOT => 'ModPerl::ROOT'; ######################################################################### unless (defined $ModPerl::RegistryCooker::NameWithVirtualHost) { $ModPerl::RegistryCooker::NameWithVirtualHost = 1; } ######################################################################### # func: new # dflt: new # args: $class - class to bless into # $r - Apache2::RequestRec object # desc: create the class's object and bless it # rtrn: the newly created object ######################################################################### sub new { my ($class, $r) = @_; my $self = bless {}, $class; $self->init($r); return $self; } ######################################################################### # func: init # dflt: init # desc: initializes the data object's fields: REQ FILENAME URI # args: $r - Apache2::RequestRec object # rtrn: nothing ######################################################################### sub init { $_[0]->{REQ} = $_[1]; $_[0]->{URI} = $_[1]->uri; $_[0]->{FILENAME} = $_[1]->filename; } ######################################################################### # func: handler # dflt: handler # desc: the handler() sub that is expected by Apache # args: $class - handler's class # $r - Apache2::RequestRec object # (o)can be called as handler($r) as well (without leading $class) # rtrn: handler's response status # note: must be implemented in a sub-class unless configured as # Apache2::Foo->handler in httpd.conf (because of the # __PACKAGE__, which is tied to the file) ######################################################################### sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } ######################################################################### # func: default_handler # dflt: META: see above # desc: META: see above # args: $self - registry blessed object # rtrn: handler's response status # note: that's what most sub-class handlers will call ######################################################################### sub default_handler { my $self = shift; $self->make_namespace; if ($self->should_compile) { my $rc = $self->can_compile; return $rc unless $rc == Apache2::Const::OK; $rc = $self->convert_script_to_compiled_handler; return $rc unless $rc == Apache2::Const::OK; } # handlers shouldn't set $r->status but return it, so we reset the # status after running it my $old_status = $self->{REQ}->status; my $rc = $self->run; my $new_status = $self->{REQ}->status($old_status); return ($rc == Apache2::Const::OK && $old_status != $new_status) ? $new_status : $rc; } ######################################################################### # func: run # dflt: run # desc: executes the compiled code # args: $self - registry blessed object # rtrn: execution status (Apache2::?) ######################################################################### sub run { my $self = shift; my $r = $self->{REQ}; my $package = $self->{PACKAGE}; $self->chdir_file; my $cv = \&{"$package\::handler"}; my %orig_inc; if ($self->should_reset_inc_hash) { %orig_inc = %INC; } my $rc = Apache2::Const::OK; { # run the code and preserve warnings setup when it's done no warnings FATAL => 'all'; #local $^W = 0; eval { $cv->($r, @_) }; # log script's execution errors $rc = $self->error_check; { # there might be no END blocks to call, so $@ will be not # reset local $@; ModPerl::Global::special_list_call(END => $package); # log script's END blocks execution errors my $new_rc = $self->error_check; # use the END blocks return status if the script's execution # was successful $rc = $new_rc if $rc == Apache2::Const::OK; } } if ($self->should_reset_inc_hash) { # to avoid the bite of require'ing a file with no package delaration # Apache2::PerlRun in mod_perl 1.15_01 started to localize %INC # later on it has been adjusted to preserve loaded .pm files, # which presumably contained the package declaration for (keys %INC) { next if $orig_inc{$_}; next if /\.pm$/; delete $INC{$_}; } } $self->flush_namespace; $self->chdir_file(Apache2::ServerUtil::server_root()); return $rc; } ######################################################################### # func: can_compile # dflt: can_compile # desc: checks whether the script is allowed and can be compiled # args: $self - registry blessed object # rtrn: $rc - return status to forward # efct: initializes the data object's fields: MTIME ######################################################################### sub can_compile { my $self = shift; my $r = $self->{REQ}; return Apache2::Const::DECLINED unless $r->finfo->filetype==APR::Const::FILETYPE_REG; $self->{MTIME} = $r->finfo->mtime; if (!($r->allow_options & Apache2::Const::OPT_EXECCGI)) { $r->log_error("Options ExecCGI is off in this directory", $self->{FILENAME}); return Apache2::Const::FORBIDDEN; } $self->debug("can compile $self->{FILENAME}") if DEBUG & D_NOISE; return Apache2::Const::OK; } ######################################################################### # func: namespace_root # dflt: namespace_root # desc: define the namespace root for storing compiled scripts # args: $self - registry blessed object # rtrn: the namespace root ######################################################################### sub namespace_root { my $self = shift; join '::', NAMESPACE_ROOT, ref($self); } ######################################################################### # func: make_namespace # dflt: make_namespace # desc: prepares the namespace # args: $self - registry blessed object # rtrn: the namespace # efct: initializes the field: PACKAGE ######################################################################### sub make_namespace { my $self = shift; my $package = $self->namespace_from; # Escape everything into valid perl identifiers $package =~ s/([^A-Za-z0-9_])/sprintf("_%2x", unpack("C", $1))/eg; # make sure that the sub-package doesn't start with a digit $package =~ s/^(\d)/_$1/; # prepend root $package = $self->namespace_root() . "::$package"; $self->{PACKAGE} = $package; return $package; } ######################################################################### # func: namespace_from # dflt: namespace_from_filename # desc: returns a partial raw package name based on filename, uri, else # args: $self - registry blessed object # rtrn: a unique string ######################################################################### *namespace_from = \&namespace_from_filename; # return a package name based on $r->filename only sub namespace_from_filename { my $self = shift; my ($volume, $dirs, $file) = File::Spec::Functions::splitpath($self->{FILENAME}); my @dirs = File::Spec::Functions::splitdir($dirs); return join '_', grep { defined && length } $volume, @dirs, $file; } # return a package name based on $r->uri only sub namespace_from_uri { my $self = shift; my $path_info = $self->{REQ}->path_info; my $script_name = $path_info && $self->{URI} =~ /\Q$path_info\E$/ ? substr($self->{URI}, 0, length($self->{URI}) - length($path_info)) : $self->{URI}; if ($ModPerl::RegistryCooker::NameWithVirtualHost && $self->{REQ}->server->is_virtual) { my $name = $self->{REQ}->get_server_name; $script_name = join "", $name, $script_name if $name; } $script_name =~ s:/+$:/__INDEX__:; return $script_name; } ######################################################################### # func: convert_script_to_compiled_handler # dflt: convert_script_to_compiled_handler # desc: reads the script, converts into a handler and compiles it # args: $self - registry blessed object # rtrn: success/failure status ######################################################################### sub convert_script_to_compiled_handler { my $self = shift; my $rc = Apache2::Const::OK; $self->debug("Adding package $self->{PACKAGE}") if DEBUG & D_NOISE; # get the script's source $rc = $self->read_script; return $rc unless $rc == Apache2::Const::OK; # convert the shebang line opts into perl code my $shebang = $self->shebang_to_perl; # mod_cgi compat, should compile the code while in its dir, so # relative require/open will work. $self->chdir_file; # undef &{"$self->{PACKAGE}\::handler"}; unless DEBUG & D_NOISE; #avoid warnings # $self->{PACKAGE}->can('undef_functions') && $self->{PACKAGE}->undef_functions; my $line = $self->get_mark_line; $self->strip_end_data_segment; # handle the non-parsed handlers ala mod_cgi (though mod_cgi does # some tricks removing the header_out and other filters, here we # just call assbackwards which has the same effect). my $base = File::Basename::basename($self->{FILENAME}); my $nph = substr($base, 0, 4) eq 'nph-' ? '$_[0]->assbackwards(1);' : ""; my $script_name = $self->get_script_name || $0; my $eval = join '', 'package ', $self->{PACKAGE}, ";", "sub handler {", "local \$0 = '$script_name';", $nph, $shebang, $line, ${ $self->{CODE} }, "\n}"; # last line comment without newline? $rc = $self->compile(\$eval); return $rc unless $rc == Apache2::Const::OK; $self->debug(qq{compiled package \"$self->{PACKAGE}\"}) if DEBUG & D_NOISE; $self->chdir_file(Apache2::ServerUtil::server_root()); # if(my $opt = $r->dir_config("PerlRunOnce")) { # $r->child_terminate if lc($opt) eq "on"; # } $self->cache_it; return $rc; } ######################################################################### # func: cache_table # dflt: cache_table_common # desc: return a symbol table for caching compiled scripts in # args: $self - registry blessed object (or the class name) # rtrn: symbol table ######################################################################### *cache_table = \&cache_table_common; sub cache_table_common { \%ModPerl::RegistryCache; } sub cache_table_local { my $self = shift; my $class = ref($self) || $self; no strict 'refs'; \%$class; } ######################################################################### # func: cache_it # dflt: cache_it # desc: mark the package as cached by storing its modification time # args: $self - registry blessed object # rtrn: nothing ######################################################################### sub cache_it { my $self = shift; $self->cache_table->{ $self->{PACKAGE} }{mtime} = $self->{MTIME}; } ######################################################################### # func: is_cached # dflt: is_cached # desc: checks whether the package is already cached # args: $self - registry blessed object # rtrn: TRUE if cached, # FALSE otherwise ######################################################################### sub is_cached { my $self = shift; exists $self->cache_table->{ $self->{PACKAGE} }{mtime}; } ######################################################################### # func: should_compile # dflt: should_compile_once # desc: decide whether code should be compiled or not # args: $self - registry blessed object # rtrn: TRUE if should compile # FALSE otherwise # efct: sets MTIME if it's not set yet ######################################################################### *should_compile = \&should_compile_once; # return false only if the package is cached and its source file # wasn't modified sub should_compile_if_modified { my $self = shift; $self->{MTIME} ||= $self->{REQ}->finfo->mtime; !($self->is_cached && $self->cache_table->{ $self->{PACKAGE} }{mtime} == $self->{MTIME}); } # return false if the package is cached already sub should_compile_once { not shift->is_cached; } ######################################################################### # func: should_reset_inc_hash # dflt: FALSE # desc: decide whether to localize %INC for required .pl files from the script # args: $self - registry blessed object # rtrn: TRUE if should reset # FALSE otherwise ######################################################################### *should_reset_inc_hash = \&FALSE; ######################################################################### # func: flush_namespace # dflt: NOP (don't flush) # desc: flush the compiled package's namespace # args: $self - registry blessed object # rtrn: nothing ######################################################################### *flush_namespace = \&NOP; sub flush_namespace_normal { my $self = shift; $self->debug("flushing namespace") if DEBUG & D_NOISE; ModPerl::Util::unload_package($self->{PACKAGE}); } ######################################################################### # func: read_script # dflt: read_script # desc: reads the script in # args: $self - registry blessed object # rtrn: Apache2::Const::OK on success, some other code on failure # efct: initializes the CODE field with the source script ######################################################################### # reads the contents of the file sub read_script { my $self = shift; $self->debug("reading $self->{FILENAME}") if DEBUG & D_NOISE; $self->{CODE} = eval { $self->{REQ}->slurp_filename(0) }; # untainted if ($@) { $self->log_error("$@"); if (ref $@ eq 'APR::Error') { return Apache2::Const::FORBIDDEN if APR::Status::is_EACCES($@); return Apache2::Const::NOT_FOUND if APR::Status::is_ENOENT($@); } return Apache2::Const::SERVER_ERROR; } return Apache2::Const::OK; } ######################################################################### # func: shebang_to_perl # dflt: shebang_to_perl # desc: parse the shebang line and convert command line switches # (defined in %switches) into a perl code. # args: $self - registry blessed object # rtrn: a Perl snippet to be put at the beginning of the CODE field # by caller ######################################################################### my %switches = ( 'T' => sub { Apache2::ServerRec::warn("-T switch is ignored, enable " . "with 'PerlSwitches -T' in httpd.conf\n") unless ${^TAINT}; ""; }, 'w' => sub { "use warnings;\n" }, ); sub shebang_to_perl { my $self = shift; my ($line) = ${ $self->{CODE} } =~ /^(.*)$/m; my @cmdline = split /\s+/, $line; return "" unless @cmdline; return "" unless shift(@cmdline) =~ /^\#!/; my $prepend = ""; for my $s (@cmdline) { next unless $s =~ s/^-//; last if substr($s,0,1) eq "-"; for (split //, $s) { next unless exists $switches{$_}; $prepend .= $switches{$_}->(); } } return $prepend; } ######################################################################### # func: get_script_name # dflt: get_script_name # desc: get the script's name to set into $0 # args: $self - registry blessed object # rtrn: path to the script's filename ######################################################################### sub get_script_name { shift->{FILENAME}; } ######################################################################### # func: chdir_file # dflt: NOP # desc: chdirs into $dir # args: $self - registry blessed object # $dir - a dir # rtrn: nothing (?or success/failure?) ######################################################################### *chdir_file = \&NOP; sub chdir_file_normal { my ($self, $dir) = @_; $dir ||= File::Basename::dirname($self->{FILENAME}); $self->debug("chdir $dir") if DEBUG & D_NOISE; chdir $dir or die "Can't chdir to $dir: $!"; } ######################################################################### # func: get_mark_line # dflt: get_mark_line # desc: generates the perl compiler #line directive # args: $self - registry blessed object # rtrn: returns the perl compiler #line directive ######################################################################### sub get_mark_line { my $self = shift; $ModPerl::Registry::MarkLine ? "\n#line 1 $self->{FILENAME}\n" : ""; } ######################################################################### # func: strip_end_data_segment # dflt: strip_end_data_segment # desc: remove the trailing non-code from $self->{CODE} # args: $self - registry blessed object # rtrn: nothing ######################################################################### sub strip_end_data_segment { ${ +shift->{CODE} } =~ s/^__(END|DATA)__(.*)//ms; } ######################################################################### # func: compile # dflt: compile # desc: compile the code in $eval # args: $self - registry blessed object # $eval - a ref to a scalar with the code to compile # rtrn: success/failure # note: $r must not be in scope of compile(), scripts must do # my $r = shift; to get it off the args stack ######################################################################### sub compile { my ($self, $eval) = @_; $self->debug("compiling $self->{FILENAME}") if DEBUG && D_COMPILE; ModPerl::Global::special_list_register(END => $self->{PACKAGE}); ModPerl::Global::special_list_clear( END => $self->{PACKAGE}); { # let the code define its own warn and strict level no strict; no warnings FATAL => 'all'; # because we use FATAL eval $$eval; } return $self->error_check; } ######################################################################### # func: error_check # dflt: error_check # desc: checks $@ for errors # args: $self - registry blessed object # rtrn: Apache2::Const::SERVER_ERROR if $@ is set, Apache2::Const::OK otherwise ######################################################################### sub error_check { my $self = shift; # ModPerl::Util::exit() throws an exception object whose rc is # ModPerl::EXIT # (see modperl_perl_exit() and modperl_errsv() C functions) if ($@ && !(ref $@ eq 'APR::Error' && $@ == ModPerl::EXIT)) { $self->log_error($@); return Apache2::Const::SERVER_ERROR; } return Apache2::Const::OK; } ######################################################################### # func: install_aliases # dflt: install_aliases # desc: install the method aliases into $class # args: $class - the class to install the methods into # $rh_aliases - a ref to a hash with aliases mapping # rtrn: nothing ######################################################################### sub install_aliases { my ($class, $rh_aliases) = @_; no strict 'refs'; while (my ($k,$v) = each %$rh_aliases) { if (my $sub = *{$v}{CODE}){ *{ $class . "::$k" } = $sub; } else { die "$class: $k aliasing failed; sub $v doesn't exist"; } } } ### helper methods sub debug { my $self = shift; my $class = ref $self; $self->{REQ}->log_error("$$: $class: " . join '', @_); } sub log_error { my ($self, $msg) = @_; my $class = ref $self; $self->{REQ}->log_error($msg); $self->{REQ}->notes->set('error-notes' => $msg); $@{$self->{URI}} = $msg; } ######################################################################### # func: uncache_myself # dflt: uncache_myself # desc: unmark the package as cached by forgetting its modification time # args: none # rtrn: nothing # note: this is a function and not a method, it should be called from # the registry script, and using the caller() method we figure # out the package the script was compiled into ######################################################################### # this is a function should be called from the registry script, and # using the caller() method we figure out the package the script was # compiled into and trying to uncache it. # # it's currently used only for testing purposes and not a part of the # public interface. it expects to find the compiled package in the # symbol table cache returned by cache_table_common(), if you override # cache_table() to point to another function, this function will fail. sub uncache_myself { my $package = scalar caller; my ($class) = __PACKAGE__->cache_table_common(); unless (defined $class) { Apache2->warn("$$: cannot figure out cache symbol table for $package"); return; } if (exists $class->{$package} && exists $class->{$package}{mtime}) { Apache2->warn("$$: uncaching $package\n") if DEBUG & D_COMPILE; delete $class->{$package}{mtime}; } else { Apache2->warn("$$: cannot find $package in cache"); } } 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/RegistryLoader.pm0000644000104000010010000001221712540623201024537 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::RegistryLoader; use strict; use warnings; use ModPerl::RegistryCooker (); use Apache2::ServerUtil (); use Apache2::Log (); use APR::Pool (); use APR::Finfo (); use APR::Const -compile=>qw(FINFO_NORM); use Carp; use File::Spec (); use Apache2::Const -compile => qw(OK HTTP_OK OPT_EXECCGI); our @ISA = (); sub new { my $class = shift; my $self = bless {@_} => ref($class)||$class; $self->{package} ||= 'ModPerl::Registry'; $self->{pool} = APR::Pool->new(); $self->load_package($self->{package}); return $self; } sub handler { my ($self, $uri, $filename, $virthost) = @_; # set the inheritance rules at run time @ISA = $self->{package}; unless (defined $uri) { $self->warn("uri is a required argument"); return; } if (defined $filename) { unless (-e $filename) { $self->warn("Cannot find: $filename"); return; } } else { # try to translate URI->filename if (exists $self->{trans} and ref($self->{trans}) eq 'CODE') { no strict 'refs'; $filename = $self->{trans}->($uri); unless (-e $filename) { $self->warn("Cannot find a translated from uri: $filename"); return; } } else { # try to guess (my $guess = $uri) =~ s|^/||; $self->warn("Trying to guess filename based on uri") if $self->{debug}; $filename = File::Spec->catfile(Apache2::ServerUtil::server_root, $guess); unless (-e $filename) { $self->warn("Cannot find guessed file: $filename", "provide \$filename or 'trans' sub"); return; } } } if ($self->{debug}) { $self->warn("*** uri=$uri, filename=$filename"); } my $rl = bless { uri => $uri, filename => $filename, package => $self->{package}, } => ref($self) || $self; $rl->{virthost} = $virthost if defined $virthost; # can't call SUPER::handler here, because it usually calls new() # and then the ModPerlRegistryLoader::new() will get called, # instead of the super class' new, so we implement the super # class' handler here. Hopefully all other subclasses use the same # handler. __PACKAGE__->SUPER::new($rl)->default_handler(); } # XXX: s/my_// for qw(my_finfo my_slurp_filename); # when when finfo() and slurp_filename() are ported to 2.0 and # RegistryCooker is starting to use them sub get_server_name { return $_[0]->{virthost} if exists $_[0]->{virthost} } sub filename { shift->{filename} } sub status { Apache2::Const::HTTP_OK } sub pool { shift->{pool}||=APR::Pool->new() } sub finfo { $_[0]->{finfo}||=APR::Finfo::stat($_[0]->{filename}, APR::Const::FINFO_NORM, $_[0]->pool); } sub uri { shift->{uri} } sub path_info {} sub allow_options { Apache2::Const::OPT_EXECCGI } #will be checked again at run-time sub log_error { shift; die @_ if $@; warn @_; } sub run { return Apache2::Const::OK } # don't run the script sub server { shift } sub is_virtual { exists shift->{virthost} } # the preloaded file needs to be precompiled into the package # specified by the 'package' attribute, not RegistryLoader sub namespace_root { join '::', ModPerl::RegistryCooker::NAMESPACE_ROOT, shift->{REQ}->{package}; } # override Apache class methods called by Modperl::Registry*. normally # only available at request-time via blessed request_rec pointer sub slurp_filename { my $r = shift; my $tainted = @_ ? shift : 1; my $filename = $r->filename; open my $fh, $filename or die "can't open $filename: $!"; local $/; my $code = <$fh>; unless ($tainted) { ($code) = $code =~ /(.*)/s; # untaint } close $fh; return \$code; } sub load_package { my ($self, $package) = @_; croak "package to load wasn't specified" unless defined $package; $package =~ s|::|/|g; $package .= ".pm"; require $package; }; sub warn { my $self = shift; Apache2::Log->warn(__PACKAGE__ . ": @_\n"); } 1; __END__ mod_perl-2.0.9/ModPerl-Registry/lib/ModPerl/RegistryPrefork.pm0000644000104000010010000000117612540623201024743 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package ModPerl::RegistryPrefork; use strict; use warnings FATAL => 'all'; our $VERSION = '0.01'; use base qw(ModPerl::Registry); if ($ENV{MOD_PERL}) { require Apache2::MPM; die "This package can't be used under threaded MPMs" if Apache2::MPM->is_threaded; } sub handler : method { my $class = (@_ >= 2) ? shift : __PACKAGE__; my $r = shift; return $class->new($r)->default_handler(); } *chdir_file = \&ModPerl::RegistryCooker::chdir_file_normal; 1; __END__ mod_perl-2.0.9/ModPerl-Registry/Makefile.PL0000644000177200010010000000176012540623201017204 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; no warnings 'redefine'; use FindBin; use lib grep { -d } map "$FindBin::Bin/../$_", qw(lib Apache-Test/lib); use ModPerl::BuildMM (); use Apache::TestSmokePerl (); use Apache2::Build (); # enable 'make test|clean' use Apache::TestMM qw(test clean); # prerequisites my %require = ( "Apache::Test" => "0", # any version will do? ); my @scripts = qw(t/TEST t/SMOKE); # accept the configs from comman line Apache::TestMM::filter_args(); my $build = Apache2::Build->build_config; if ($build->should_build_apache) { push @Apache::TestMM::Argv, ('httpd' => $build->{httpd}); } Apache::TestMM::generate_script('t/TEST'); # t/SMOKE Apache::TestSmokePerl->generate_script; ModPerl::BuildMM::WriteMakefile( NAME => 'ModPerl::Registry', VERSION_FROM => 'lib/ModPerl/RegistryCooker.pm', PREREQ_PM => \%require, clean => { FILES => "@{ clean_files() }", }); sub clean_files { return [@scripts, 'Makefile.old']; } mod_perl-2.0.9/ModPerl-Registry/MANIFEST0000644000104000010010000000052512540623201020262 0ustar AdministratorsNoneMANIFEST This list of files Makefile.PL README TODO lib/ModPerl/PerlRun.pm lib/ModPerl/Registry.pm lib/ModPerl/RegistryBB.pm lib/ModPerl/RegistryCooker.pm t/TEST.PL t/basic.t t/closure.t t/cgi-bin/basic.pl t/cgi-bin/closure.pl t/cgi-bin/env.pl t/cgi-bin/local-conf.pl t/cgi-bin/not_executable.pl t/cgi-bin/require.pl t/conf/extra.conf.in mod_perl-2.0.9/ModPerl-Registry/README0000644000177200010010000000001612540623201016103 0ustar SteveNoneto be written mod_perl-2.0.9/ModPerl-Registry/t/0000755000104000010010000000000012540623202017373 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/t/206.t0000644000104000010010000000106612540623201020071 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 2, need [qw(mod_alias.c HTML::HeadParser)]; my $url = "/registry/206.pl"; my $res = GET($url); my $body = 'code, 206, "test partial_content: response code", ); ok t_cmp( $res->content, $body, "test partial_content: response body", ); mod_perl-2.0.9/ModPerl-Registry/t/304.t0000644000104000010010000000337312540623201020073 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 10, need [qw(mod_alias.c HTML::HeadParser)]; my $url = "/registry/304.pl"; { # not modified my $if_modified_since = 'Sun, 29 Oct 2000 15:55:00 GMT'; my $res = GET($url, 'If-Modified-Since' => $if_modified_since); ok t_cmp( $res->code, 304, "test HTTP_NOT_MODIFIED (304 status)", ); ok t_cmp( $res->content, '', "test HTTP_NOT_MODIFIED (null body)", ); #t_debug $res->as_string; } { # full response cases: # 1) the resource has been modified since the If-Modified-Since date # 2) bogus If-Modified-Since date => is considered as a # non-If-Modified-Since require # my %dates = ( 'Sun, 29 Oct 2000 15:43:28 GMT' => "the resource was modified since #1", 'Sun, 28 Oct 2000 15:43:29 GMT' => "the resource was modified since #2", 'Thu, 32 Jun 1999 24:59:59 MIT' => "bogus If-Modified-Since #1", 'Thu Juk 99 00:00:00 9999 FUK' => "bogus If-Modified-Since #2", ); my $received = 'Test'; while ( my ($if_modified_since, $debug) = each %dates) { my $res = GET($url, 'If-Modified-Since' => $if_modified_since); t_debug "If-Modified-Since $if_modified_since"; ok t_cmp( $res->code, 200, "$debug (code)" ); ok t_cmp( $res->content, $received, "$debug (body)" ); #t_debug $res->as_string; } } mod_perl-2.0.9/ModPerl-Registry/t/404-filename-with-newline.t0000644000104000010010000000076512540623201024264 0ustar AdministratorsNone#!perl use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET_RC); plan tests => 1, need 'mod_alias.c'; { # this used to result in 500 due to a combination of Perl warning about # a newline in the filename passed to stat() and our # use warnings FATAL=>'all' t_client_log_error_is_expected(); my $url = '/registry/file%0dwith%0anl%0d%0aand%0a%0dcr'; ok t_cmp GET_RC($url), 404, 'URL with \\r and \\n embedded'; } mod_perl-2.0.9/ModPerl-Registry/t/404.t0000644000104000010010000000135612540623201020073 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET_BODY GET); plan tests => 2, need [qw(mod_alias.c HTML::HeadParser)]; { t_client_log_error_is_expected(); my $url = "/error_document/cannot_be_found"; my $response = "Oops, can't find the requested doc"; ok t_cmp( GET_BODY($url), $response, "test ErrorDocument" ); } { my $url = "/registry/status_change.pl"; my $res = GET($url); ok t_cmp( $res->code, 404, "the script has changed the status to 404" ); } mod_perl-2.0.9/ModPerl-Registry/t/500.t0000644000104000010010000000445612540623201020074 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 7, need 'mod_alias.c'; { # the script changes the status before the run-time error happens, # this status change should be ignored my $url = "/registry/runtime_error_n_status_change.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 error on runtime error (when the script changes the status)", ); } { my $url = "/registry/syntax_error.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 compile time error (syntax error)", ); } { my $url = "/registry/use_error.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 compile error on use() failure", ); } { my $url = "/registry/missing_headers.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 error on missing HTTP headers", ); } { # since we have a runtime error before any body is sent, mod_perl # has a chance to communicate the return status of the script to # Apache before headers are sent, so we get the code 500 in the # HTTP headers my $url = "/registry/runtime_error.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 error on runtime error", ); } { # even though we have a runtime error here, the scripts succeeds # to send some body before the error happens and since by that # time Apache has already sent the headers, they will include # 200 OK my $url = "/registry/runtime_error_plus_body.pl"; my $res = GET($url); #t_debug($res->content); ok t_cmp( $res->code, 200, "200, followed by a runtime error", ); # the error message is attached after the body ok t_cmp($res->content, qr/some body.*The server encountered an internal error/ms, "200, followed by a runtime error", ); } mod_perl-2.0.9/ModPerl-Registry/t/bad_scripts.t0000644000104000010010000000100612540623201022051 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 1, need 'mod_alias.c'; { t_client_log_error_is_expected(); my $url = "/perlrun/r_inherited.pl"; my $res = GET($url); ok t_cmp( $res->code, 500, "the script hasn't declared its private \$r", ); } mod_perl-2.0.9/ModPerl-Registry/t/basic.t0000644000104000010010000000540012540623201020637 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil qw(t_cmp t_catfile_apache t_client_log_error_is_expected); use Apache::TestRequest; use Apache::TestConfig (); my %modules = ( registry => 'ModPerl::Registry', registry_bb => 'ModPerl::RegistryBB', perlrun => 'ModPerl::PerlRun', ); my @aliases = sort keys %modules; plan tests => @aliases * 5 + 3, need 'mod_alias.c'; my $vars = Apache::Test::config()->{vars}; my $script_file = t_catfile_apache $vars->{serverroot}, 'cgi-bin', 'basic.pl'; # very basic compilation/response test for my $alias (@aliases) { my $url = "/$alias/basic.pl"; ok t_cmp( GET_BODY($url), "ok $script_file", "$modules{$alias} basic cgi test", ); } # test non-executable bit (it should be executed w/o a problem) for my $alias (@aliases) { if (Apache::TestConfig::WIN32) { skip "non-executable bit test for Win32", 0; next; } my $url = "/$alias/not_executable.pl"; t_client_log_error_is_expected(); ok t_cmp( HEAD($url)->code, 200, "$modules{$alias} non-executable file", ); } # test environment pre-set for my $alias (@aliases) { my $url = "/$alias/env.pl?foo=bar"; ok t_cmp( GET_BODY($url), "foo=bar", "$modules{$alias} mod_cgi-like environment pre-set", ); } # require (actually chdir test) for my $alias (@aliases) { my $url = "/$alias/require.pl"; ok t_cmp( GET_BODY($url), "it works", "$modules{$alias} mod_cgi-like environment pre-set", ); } # exit for my $alias (@aliases) { my $url = "/$alias/exit.pl"; ok t_cmp( GET_BODY_ASSERT($url), "before exit", "$modules{$alias} mod_cgi-like environment pre-set", ); } # test method handlers { my $url = "/registry_oo_conf/env.pl?foo=bar"; ok t_cmp( GET_BODY($url), "foo=bar", "ModPerl::Registry->handler mod_cgi-like environment pre-set", ); } # test mod_perl api usage { my $url = "/registry/content_type.pl"; ok t_cmp( GET_BODY($url), "ok", "\$r->content_type('text/plain')", ); } # test that files with .html extension, which are configured to run as # scripts get the headerparse stage working: the default mime handler # sets $r->content_type for .html files, so we can't rely on # content_type not being set in making the decision whether to parse # headers or not { my $url = "/registry/send_headers.html"; my $res = GET $url; ok t_cmp( $res->content_type, "text/plain", "script's content-type", ); } mod_perl-2.0.9/ModPerl-Registry/t/bin_resp.t0000644000104000010010000000142412540623201021361 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # testing various binary responses use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 2, need 'mod_alias.c'; # 2 sub-tests { # favicon.ico and other .ico image/x-icon images start with # sequence: my $expected = "\000\000\001\000"; my $location = "/registry/bin_resp_start_0.pl"; #my $location = "/cgi-bin/bin_resp_start_0.pl"; my $received = GET_BODY_ASSERT $location; #t_debug "$received"; ok t_cmp(length($received), length($expected), "image size"); t_debug "comparing the binary contents"; ok $expected eq $received; } mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/0000755000104000010010000000000012540623201020702 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/206.pl0000644000104000010010000000055112540623201021547 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- print <<_OUT_; Status: 206 Partial Content Content-Type: text/html; charset=UTF-8 Content-Length: 11 Content-Range: bytes 0-10/1336 Date: Fri, 31 Jan 2003 09:39:01 GMT ETag: "xxxx" _OUT_ print ' 'all'; # manually handle 'If-Modified-Since' requests use APR::Date (); use Apache2::Util (); use Apache2::RequestRec (); use constant FMT => '%a, %d %b %Y %H:%M:%S %Z'; use constant GMT => 1; use Apache2::Const -compile => qw(HTTP_NOT_MODIFIED); my $last_modified = "Sun, 29 Oct 2000 15:43:29 GMT"; my $r = shift; my $if_modified_since = $r->headers_in->{'If-Modified-Since'}; my $status = 200; my $body = 'Test'; #APR::Date::parse_http may fail my $if_modified_since_secs = ($if_modified_since && APR::Date::parse_http($if_modified_since)) || 0; my $last_modified_secs = APR::Date::parse_http($last_modified); #warn "If-Modified-Since $if_modified_since\n"; #warn "last_modified_secs $last_modified_secs\n"; #warn "if_modified_since_secs $if_modified_since_secs\n\n"; if ($last_modified_secs < $if_modified_since_secs) { $status = Apache2::Const::HTTP_NOT_MODIFIED; $body = ''; } my $date = Apache2::Util::ht_time($r->pool, $r->request_time, FMT, GMT); print <content_type('text/plain'); print "Oops, can't find the requested doc"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/basic.pl0000644000104000010010000000071012540623201022316 0ustar AdministratorsNone#!perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test all the basic functionality print "Content-type: text/plain\n\n"; # test that __END__ can appear in a comment w/o cutting data after it print "ok $0"; # test that __END__ starting at the beginning of the line makes # everything following it, stripped __END__ this is some irrelevant data mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/bin_resp_start_0.pl0000644000104000010010000000077712540623201024507 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # favicon.ico and other .ico image/x-icon images start with this sequence my $response = "\000\000\001\000"; # test here that the cgi header parser doesn't get confused and decide # that there is no response body if it starts with \000 sequence print "Content-type: image/x-icon\n\n"; print $response; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/cgi.pl0000644000104000010010000000034312540623201022001 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use CGI qw/:standard :html3/; print header(-type=>'text/html'); print b("done"); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/closure.pl0000644000104000010010000000112112540623201022706 0ustar AdministratorsNone#!perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil qw/t_server_log_warn_is_expected/; t_server_log_warn_is_expected(); } # this script will suffer from a closure problem under registry # should see it under ::Registry # should not see it under ::PerlRun print "Content-type: text/plain\n\n"; # this is a closure (when compiled inside handler()): my $counter = 0; counter(); sub counter { #warn "$$: counter=$counter"; print ++$counter; } mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/content_type.pl0000644000104000010010000000032112540623201023746 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- my $r = shift; $r->content_type('text/plain'); $r->print('ok'); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/env.pl0000644000104000010010000000041012540623201022022 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test env vars print "Content-type: text/plain\n\n"; print exists $ENV{QUERY_STRING} && $ENV{QUERY_STRING}; __END__ mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/env_val.pl0000644000104000010010000000042612540623201022673 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test env vars print "Content-type: text/plain\n\n"; my $var = $ENV{QUERY_STRING}; print exists $ENV{$var} && $ENV{$var}; __END__ mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/exit.pl0000644000104000010010000000121512540623201022207 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # XXX: exit should work by stopping the script, but not quitting the # interpreter, though it's not trivial to make an automated test since # what you really want to check whether the process didn't quit after # exit was called. Things become more complicated with # ithreads-enabled perls where one process may have many interpreters # and you can't really track those at the moment. So this test needs # more work. print "Content-type: text/plain\n\n"; print "before exit"; exit; print "after exit"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/flush.pl0000644000104000010010000000115212540623201022357 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; local $| = 1; # unbuffered mode my $r = shift; print "Content-Type: text/html\n\n"; print "yet another boring test string"; # This line passes a bucket brigade with a single bucket FLUSH # it was causing problems in the mod_deflate filter which was trying to # deflate empty output buffer, (the previous print has already flushed # all the output) (the fix in mod_deflate.c was to check whether the # buffer is full) print ""; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/ithreads_io_n_tie.pl0000644000104000010010000000451212540623201024711 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # # there is a problem when STDOUT is internally opened to an # Apache2::PerlIO layer is cloned on a new thread start. PerlIO_clone # in perl_clone() is called too early, before PL_defstash is # cloned. As PerlIO_clone calls PerlIOApache_getarg, which calls # gv_fetchpv via sv_setref_pv and boom the segfault happens. # # at the moment we should either not use an internally opened to # :Apache2 streams, so the config must be: # # SetHandler modperl # # and then either use $r->print("foo") or tie *STDOUT, $r + print "foo" # # or close and re-open STDOUT to :Apache2 *after* the thread was spawned # # the above discussion equally applies to STDIN # # XXX: ->join calls leak under registry, this doesn't happen in the # non-registry tests. use threads; my $r = shift; $r->print("Content-type: text/plain\n\n"); { # now we can use $r->print API: my $thr = threads->new( sub { my $id = shift; $r->print("thread $id\n"); return 1; }, 1); # $thr->join; # XXX: leaks scalar } { # close and re-open STDOUT to :Apache2 *after* the thread was # spawned my $thr = threads->new( sub { my $id = shift; close STDOUT; open STDOUT, ">:Apache2", $r or die "can't open STDOUT via :Apache2 layer : $!"; print "thread $id\n"; return 1; }, 2); # $thr->join; # XXX: leaks scalar } { # tie STDOUT to $r *after* the ithread was started has # happened, in which case we can use print my $thr = threads->new( sub { my $id = shift; tie *STDOUT, $r; print "thread $id\n"; return 1; }, 3); # $thr->join; # XXX: leaks scalar } { # tie STDOUT to $r before the ithread was started has # happened, in which case we can use print tie *STDOUT, $r; my $thr = threads->new( sub { my $id = shift; print "thread $id\n"; return 1; }, 4); # $thr->join; # XXX: leaks scalar } sleep 2; # XXX: will go away ones join() calls are enabled print "parent\n"; untie *STDOUT; # don't affect other tests mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/local-conf.pl0000644000104000010010000000026112540623201023253 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- $test_require = 'it works'; 1; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/missing_headers.pl0000644000104000010010000000056112540623201024405 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } print "No HTTP headers were sent\n\n"; print "Here is some more body coming\n even with double new line\n\n"; print "Here is some more body coming"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/not_executable.pl0000644000104000010010000000047512540623201024246 0ustar AdministratorsNone#!perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # this test should return forbidden, since it should be not-executable print "Content-type: text/plain\n\n"; print "ok"; __END__ this is some irrelevant data mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/nph-foo.pl0000644000104000010010000000064012540623201022605 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- my $r = shift; print "HTTP/1.0 250 Pretty OK\r\n"; print join("\n", 'Content-type: text/text', 'Pragma: no-cache', 'Cache-control: must-revalidate, no-cache, no-store', 'Expires: -1', "\n"); print "non-parsed headers body"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/perlrun_decl.pm0000644000104000010010000000114612540623201023720 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package perlrun_decl; use warnings; use strict; use base qw(Exporter); our @EXPORT = qw(decl_proto); # this BEGIN block is called only once, since this module doesn't get # removed from %INC after it was loaded BEGIN { # use an external package which will persist across requests $MyData::blocks{perlrun_decl}++; } sub decl_proto ($;$) { shift } # this END block won't be executed until the server shutdown END { $MyData::blocks{perlrun_decl}--; } 1; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/perlrun_extload.pl0000644000104000010010000000423212540623201024447 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use warnings; use strict; use Apache::Test (); use Apache::TestUtil; use File::Spec::Functions qw(catfile catdir); use lib catdir Apache::Test::vars('serverroot'), 'cgi-bin'; my $require = catfile Apache::Test::vars('serverroot'), qw(cgi-bin perlrun_nondecl.pl); print "Content-type: text/plain\n\n"; ### declared package module ### { # require a module w/ package declaration (it doesn't get reloaded # because it declares the package). But we still have a problem with # subs declaring prototypes. When perlrun_decl->import is called, the # original function's prototype doesn't match the aliases prototype. # see decl_proto() BEGIN { t_server_log_warn_is_expected() if perlrun_decl->can("decl_proto"); } use perlrun_decl; die "perlrun_decl BEGIN block was run more than once" if $MyData::blocks{perlrun_decl} > 1; print "d"; print decl_proto(1); } ### non-declared package module ### { # how many times were were called from the same interpreter $MyData::blocks{cycle}{perlrun_nondecl}++; $MyData::blocks{BEGIN}{perlrun_nondecl} ||= 0; $MyData::blocks{END} {perlrun_nondecl} ||= 0; # require a lib w/o package declaration. Functions in that lib get # automatically aliased to the functions in the current package. require "$require"; die "perlrun_nondecl's BEGIN block wasn't run" if $MyData::blocks{BEGIN}{perlrun_nondecl} != $MyData::blocks{cycle}{perlrun_nondecl}; # the END block for this cycle didn't run yet, but we can test the # previous cycle's one die "perlrun_nondecl's END block wasn't run" if $MyData::blocks{END}{perlrun_nondecl} + 1 != $MyData::blocks{cycle}{perlrun_nondecl}; # they all get redefined warning inside perlrun_nondecl.pl, since that # lib loads it into main::, vs. PerlRun undefs the current __PACKAGE__ print "nd"; print nondecl_no_proto(); print nondecl_proto(2); print nondecl_proto_empty("whatever"); print nondecl_const(); } mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/perlrun_nondecl.pl0000644000104000010010000000267212540623201024437 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # we use this file to test how the files w/o package declaration, # required from perlrun, work use Apache::TestUtil; my $num; # this BEGIN block is called on every request, since this file gets # removed from %INC after it was loaded BEGIN { # use an external package which will persist across requests $MyData::blocks{BEGIN}{perlrun_nondecl}++; } use subs qw(warn_exp); # all subs in this file get 'redefined' warning because they are # reloaded in the main:: package, which is not under PerlRun's # control. BEGIN { t_server_log_warn_is_expected() if defined *{"nondecl_no_proto"}{CODE}; } # normal sub, no prototype sub nondecl_no_proto { 1 } BEGIN { t_server_log_warn_is_expected() if defined *{"nondecl_proto"}{CODE}; } # sub with a scalar proto sub nondecl_proto ($) { $num = shift } BEGIN { t_server_log_warn_is_expected() if defined *{"nondecl_proto_empty"}{CODE}; } # sub with an empty proto, but not a constant sub nondecl_proto_empty () { $num + 1 } # besides the the constant sub will generate two warnings for nondecl_const: # - one for main:: # - another for perlrun's virtual package BEGIN { t_server_log_warn_is_expected(2); } # a constant. sub nondecl_const () { 4 } END { $MyData::blocks{END}{perlrun_nondecl}++; } 1; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/prefork.pl0000644000104000010010000000107512540623201022712 0ustar AdministratorsNone#!perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test that prefork runs from the directory the script lives in # All Modperl::*Prefork modules must chdir into the current dir, so we # should be able to read ourselves via a relative path print "Content-type: text/plain\n\n"; my $script = "prefork.pl"; if (open my $fh, $script) { print "ok $script"; } else { print "prefork didn't chdir into the scripts directory?"; print " The error was: $!"; } mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/redirect-cookie.pl0000644000104000010010000000113712540623201024311 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test env vars use Apache2::URI (); use Apache2::Const -compile => qw(REDIRECT SERVER_ERROR); my $r = shift; my $path = $r->args || ''; $server = $r->construct_server; $r->err_headers_out->set('Set-Cookie' => "mod_perl=ubercool; path=/"); $r->headers_out->set(Location => " http://$server$path"); $r->status(Apache2::Const::REDIRECT); # exit status is completely ignored in Registry # due to $r->status hacking return Apache2::Const::SERVER_ERROR; __END__ mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/redirect.pl0000644000104000010010000000054212540623201023041 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test env vars use Apache2::URI (); my $r = shift; my $path = $r->args || ''; $server = $r->construct_server; print "Location: http://$server$path\n\n"; #warn "Location: http://$server$path\n\n"; __END__ mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/require.pl0000644000104000010010000000101112540623201022704 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test the require use Apache::Test (); use File::Spec::Functions qw(catfile); my $vars = Apache::Test::config()->{vars}; my $require = catfile $vars->{serverroot}, 'cgi-bin', 'local-conf.pl'; print "Content-type: text/plain\n\n"; # XXX: meanwhile we don't chdir to the script's dir delete $INC{$require}; require $require; print defined $test_require && $test_require; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/runtime_error.pl0000644000104000010010000000056612540623201024142 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } # this script sends no body at all, and since the error happens # the script will return 500 print "Content-type: text/plain\n\n"; print no_such_func(); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/runtime_error_n_status_change.pl0000644000104000010010000000060712540623201027363 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } use Apache2::Const -compile => qw(NOT_FOUND); my $r = shift; $r->status(Apache2::Const::NOT_FOUND); $r->print("Content-type: text/plain\n\n"); $r->print(no_such_func()); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/runtime_error_plus_body.pl0000644000104000010010000000062112540623201026212 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } # this script sends some body before the error happens, # so 200 OK is expected, followed by an error print "Content-type: text/plain\n\n"; print "some body"; print no_such_func(); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/r_inherited.pl0000644000104000010010000000061112540623201023531 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings; # this script shouldn't work # this is to test that $r is not in the scope from the function that # has compiled this script in the registry module # my $r = shift; $r->content_type('text/plain'); $r->print($r->args); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/send_headers.html0000644000177200010010000000006312540623201022312 0ustar SteveNoneprint "Content-type: text/plain\n\n"; print "ok"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/special_blocks.pl0000644000104000010010000000136712540623201024223 0ustar AdministratorsNone#!perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test BEGIN/END blocks use Apache2::RequestRec (); use vars qw($query); $query = '' unless defined $query; BEGIN { $query = $ENV{QUERY_STRING}; } print "Content-type: text/plain\n\n"; my $r = shift; our $test = $r->args || ''; if ($test eq 'uncache') { # mark the script as non-cached for the next execution require ModPerl::RegistryCooker; ModPerl::RegistryCooker::uncache_myself(); } elsif ($test eq 'begin') { print "begin ok" if $query eq 'begin'; # reset the global $query = ''; } END { if (defined $test && $test eq 'end') { print "end ok"; } } mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/status_change.pl0000644000104000010010000000044112540623201024066 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache2::Const -compile => qw(NOT_FOUND); my $r = shift; $r->status(Apache2::Const::NOT_FOUND); $r->print("Content-type: text/plain\n\n"); mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/syntax_error.pl0000644000104000010010000000051312540623201023775 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } print "Content-type: text/plain\n\n"; # the following syntax error is here on purpose! lkj;\; print "done"; mod_perl-2.0.9/ModPerl-Registry/t/cgi-bin/use_error.pl0000644000104000010010000000050112540623201023240 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- BEGIN { use Apache::TestUtil; t_server_log_error_is_expected(); } use DoesNotExist (); print "Content-type: text/plain\n\n"; print "this script is expected to fail"; mod_perl-2.0.9/ModPerl-Registry/t/cgi.t0000644000104000010010000000112712540623202020323 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 2, need [qw(mod_alias.c HTML::HeadParser)], need_min_module_version CGI => 3.08; my $url = "/registry/cgi.pl"; my $res = GET $url; ok t_cmp($res->header('Content-type'), qr{^text/html}, "test 'Content-type header setting"); ok t_cmp(lc($res->content), 'done', "test body"); mod_perl-2.0.9/ModPerl-Registry/t/closure.t0000644000104000010010000001101512540623202021232 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use TestCommon::SameInterp; use File::Spec::Functions; # this test tests how various registry packages cache and flush the # scripts their run, and whether they check modification on the disk # or not. We don't test the closure side effect, but we use it as a # test aid. The tests makes sure that they run through the same # interpreter all the time (in case that the server is running more # than one interpreter) my @modules = qw(registry registry_bb perlrun); plan tests => 6, need [qw(mod_alias.c HTML::HeadParser)]; my $cfg = Apache::Test::config(); my $file = 'closure.pl'; my $path = catfile $cfg->{vars}->{serverroot}, 'cgi-bin', $file; my $orig_mtime = (stat($path))[8]; # for all sub-tests in this test, we make sure that we always get onto # the same interpreter. if this doesn't happen we skip the sub-test or # a group of them, where several sub-tests rely on each other. { # ModPerl::PerlRun # always flush # no cache my $url = "/same_interp/perlrun/$file"; my $same_interp = Apache::TestRequest::same_interp_tie($url); # should be no closure effect, always returns 1 my $first = same_interp_req_body($same_interp, \&GET, $url); my $second = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second) != 2), $first && $second && ($second - $first), 0, "never the closure problem", ); # modify the file touch_mtime($path); # it doesn't matter, since the script is not cached anyway my $third = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second, $third) != 3), $third, 1, "never the closure problem", ); reset_mtime($path); } { # ModPerl::Registry # no flush # cache, but reload on modification my $url = "/same_interp/registry/$file"; my $same_interp = Apache::TestRequest::same_interp_tie($url); # we don't know what other test has called this uri before, so we # check the difference between two subsequent calls. In this case # the difference should be 1. my $first = same_interp_req_body($same_interp, \&GET, $url); my $second = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second) != 2), $first && $second && ($second - $first), 1, "the closure problem should exist", ); # modify the file touch_mtime($path); # should not notice closure effect on the first request my $third = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second, $third) != 3), $third, 1, "no closure on the first request", ); reset_mtime($path); } { # ModPerl::RegistryBB # no flush # cache once, don't check for mods my $url = "/same_interp/registry_bb/$file"; my $same_interp = Apache::TestRequest::same_interp_tie($url); # we don't know what other test has called this uri before, so we # check the difference between two subsequent calls. In this case # the difference should be 1. my $first = same_interp_req_body($same_interp, \&GET, $url); my $second = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second) != 2), $first && $second && ($second - $first), 1, "the closure problem should exist", ); # modify the file touch_mtime($path); # modification shouldn't be noticed my $third = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( (scalar(grep defined, $first, $second, $third) != 3), $first && $second && $third - $second, 1, "no reload on modification, the closure problem persists", ); reset_mtime($path); } sub touch_mtime { my $file = shift; # push the mtime into the future (at least 2 secs to work on win32) # so ModPerl::Registry will re-compile the package my $time = time + 5; # make it 5 to be sure utime $time, $time, $file; } sub reset_mtime { my $file = shift; # reset the timestamp to the original mod-time utime $orig_mtime, $orig_mtime, $file; } mod_perl-2.0.9/ModPerl-Registry/t/conf/0000755000104000010010000000000012540623202020320 5ustar AdministratorsNonemod_perl-2.0.9/ModPerl-Registry/t/conf/extra.conf.in0000644000104000010010000001503712540623202022725 0ustar AdministratorsNone#this file will be Include-d by @ServerRoot@/httpd.conf # Adjust PerlInterpMax and PerlInterpMaxSpare if the requirements change # at the moment all tests require only 1 interprter PerlInterpStart 1 PerlInterpMax 1 PerlInterpMinSpare 1 PerlInterpMaxSpare 1 # make sure that we test under Taint and warnings mode enabled PerlSwitches -wT PerlSwitches -I@ServerRoot@/../lib \ -I@ServerRoot@/../../Apache-Test/lib \ -I@ServerRoot@/../../lib \ -I@ServerRoot@/../../blib/lib \ -I@ServerRoot@/../../blib/arch # run on startup PerlRequire @ServerRoot@/conf/modperl_extra_startup.pl PerlSetVar ModPerl::RegistryCooker::DEBUG 2 PerlModule ModPerl::RegistryCooker PerlModule ModPerl::Util ############################# ### Normal registry setup ### ############################# Alias /registry/ @ServerRoot@/cgi-bin/ Alias /dirindex/ @ServerRoot@/cgi-bin/ Alias /registry_bb/ @ServerRoot@/cgi-bin/ Alias /registry_oo_conf/ @ServerRoot@/cgi-bin/ Alias /registry_prefork/ @ServerRoot@/cgi-bin/ Alias /perlrun/ @ServerRoot@/cgi-bin/ Alias /perlrun_prefork/ @ServerRoot@/cgi-bin/ Alias /nph/ @ServerRoot@/cgi-bin/ Alias /registry_modperl_handler/ @ServerRoot@/cgi-bin/ Alias /rewrite_env/ @ServerRoot@/cgi-bin/ ScriptAlias /cgi-bin/ @ServerRoot@/cgi-bin/ PerlModule ModPerl::RegistryBB PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::RegistryBB PerlOptions +ParseHeaders PerlModule ModPerl::Registry SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders AddHandler perl-script .pl Options +ExecCGI PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders DirectoryIndex cgi.pl SetHandler modperl Options +ExecCGI PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::Registry->handler PerlOptions +ParseHeaders SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::Registry # don't preload ModPerl::RegistryPrefork as it won't load under # threaded MPMs SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::RegistryPrefork PerlOptions +ParseHeaders # don't preload ModPerl::PerlRunPrefork as it won't load under # threaded MPMs SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::PerlRunPrefork PerlOptions +ParseHeaders PerlModule ModPerl::PerlRun SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::PerlRun PerlOptions +ParseHeaders ####################################### ### Same interpreter registry setup ### ####################################### Alias /same_interp/registry/ @ServerRoot@/cgi-bin/ Alias /same_interp/registry_bb/ @ServerRoot@/cgi-bin/ Alias /same_interp/registry_oo_conf/ @ServerRoot@/cgi-bin/ Alias /same_interp/perlrun/ @ServerRoot@/cgi-bin/ PerlModule Apache::TestHandler PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlFixupHandler Apache::TestHandler::same_interp_fixup PerlResponseHandler ModPerl::RegistryBB PerlOptions +ParseHeaders # PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlFixupHandler Apache::TestHandler::same_interp_fixup PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlFixupHandler Apache::TestHandler::same_interp_fixup PerlResponseHandler ModPerl::Registry->handler PerlOptions +ParseHeaders PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlFixupHandler Apache::TestHandler::same_interp_fixup PerlResponseHandler ModPerl::PerlRun PerlOptions +ParseHeaders ### the 404 test ### Alias /error_document/ @ServerRoot@/cgi-bin/ ErrorDocument 404 /error_document/404.pl SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::Registry ### deflate tests ### Alias /registry_bb_deflate/ @ServerRoot@/cgi-bin/ #PerlOutputFilterHandler ModPerl::TestFilterDebug::snoop_connection PerlModule ModPerl::RegistryBB PerlOptions +GlobalRequest SetHandler perl-script Options +ExecCGI PerlResponseHandler ModPerl::RegistryBB PerlOptions +ParseHeaders #PerlOutputFilterHandler ModPerl::TestFilterDebug::snoop_request SetOutputFilter DEFLATE # # keep everything self-contained, to avoid problems with sandboxes # which break when things try to run off /tmp # # XXX: consider folding the the following two settings into # Apache-Test's autogenerated httpd.conf ScriptSock logs/cgisock # # XXX: would be nice to have Apache-Test support a new 'tmp' token # (similar to t_logs) which will map onto t/tmp by default and provide # a new -tmp option to override this default SetEnv TMPDIR @t_logs@ # RewriteEngine On RewriteLogLevel 9 RewriteLog @ServerRoot@/logs/rewrite_log RewriteRule /rewritetest /rewrite_env/env_val.pl?REWRITE_TEST [E=REWRITE_TEST:GOTCHA,PT,NS,L] SetHandler perl-script PerlResponseHandler ModPerl::Registry Options +ExecCGI PerlOptions +ParseHeaders mod_perl-2.0.9/ModPerl-Registry/t/conf/modperl_extra_startup.pl0000644000104000010010000000306212540623202025305 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use ModPerl::RegistryLoader (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Process (); use DirHandle (); my $proc = Apache2::ServerUtil->server->process; my $pool = $proc->pool; # can't use catfile with server_root as it contains unix dir # separators and in a few of our particular tests we compare against # win32 separators. in general avoid using server_root_relative in your # code, see the manpage for more details my $base_dir = Apache2::ServerUtil::server_root_relative($pool, "cgi-bin"); # test the scripts pre-loading by explicitly specifying uri => filename my $rl = ModPerl::RegistryLoader->new(package => "ModPerl::Registry"); my $base_uri = "/cgi-bin"; for my $file (qw(basic.pl env.pl)) { my $file_path = "$base_dir/$file"; my $uri = "$base_uri/$file"; $rl->handler($uri, $file_path); } # test the scripts pre-loading by using trans sub { sub trans { my $uri = shift; $uri =~ s|^/registry_bb/|cgi-bin/|; return Apache2::ServerUtil::server_root_relative($pool, $uri); } my $rl = ModPerl::RegistryLoader->new( package => "ModPerl::RegistryBB", trans => \&trans, ); my @preload = qw(basic.pl env.pl require.pl special_blocks.pl redirect.pl 206.pl content_type.pl); for my $file (@preload) { $rl->handler("/registry_bb/$file"); } } 1; mod_perl-2.0.9/ModPerl-Registry/t/dirindex.t0000644000104000010010000000124112540623202021364 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 2, need [qw(mod_alias.c HTML::HeadParser mod_dir.c)], need_min_module_version CGI => 3.08; { my $url = "/dirindex/"; my $res = GET $url; ok t_cmp($res->header('Content-type'), qr{^text/html}, "DirectoryIndex + AddHandler - Content-type"); ok t_cmp(lc($res->content), 'done', "DirectoryIndex + AddHandler - body"); } mod_perl-2.0.9/ModPerl-Registry/t/fatalstobrowser.t0000644000104000010010000000242512540623202023004 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil qw( t_cmp t_write_perl_script t_client_log_error_is_expected ); use Apache::TestRequest qw(GET); use File::Spec::Functions qw(catfile); plan tests => 4, need need_module(qw(mod_alias)), need_cgi, need_min_module_version CGI => 99.99, skip_reason('fatalsToBrowser known not to work'); my $file = catfile(Apache::Test::vars('serverroot'), qw(cgi-bin fatalstobrowser.pl)); t_write_perl_script($file, ); foreach my $base (qw(cgi-bin registry)) { my $url = "$base/fatalstobrowser.pl"; my $res = GET $url; ok t_cmp($res->code, 200, "error intercepted"); t_client_log_error_is_expected(); ok t_cmp($res->content, qr/uninitiated_scalar/, "error message captured and returned"); } __END__ use strict; use CGI::Carp qw (fatalsToBrowser); use CGI; my $cgi = new CGI; print $cgi->header; print "$uninitiated_scalar"; print "Hello World"; mod_perl-2.0.9/ModPerl-Registry/t/flush.t0000644000104000010010000000152712540623202020706 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET_BODY); plan tests => 1, need [qw(mod_alias.c deflate HTML::HeadParser)], need_min_module_version("Compress::Zlib", "1.09"), need_min_apache_version("2.0.48"); # it requires httpd 2.0.48 because of the bug in mod_deflate: # http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22259 require Compress::Zlib; my $url = "/registry_bb_deflate/flush.pl"; my $expected = "yet another boring test string"; my $received = GET_BODY $url, 'Accept-encoding' => 'gzip'; my $decompressed = Compress::Zlib::memGunzip($received); ok t_cmp( $decompressed, $expected, "test flush body" ); mod_perl-2.0.9/ModPerl-Registry/t/ithreads.t0000644000104000010010000000151112540623202021361 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Config; use constant HAS_ITHREADS => ($] >= 5.008001 && $Config{useithreads}); plan tests => 1, need 'mod_alias.c', {"perl 5.8.1 or higher w/ithreads enabled is required" => HAS_ITHREADS}; { # the order of prints on the server side is not important here, # what's important is that we get all the printed strings my @expected = sort map("thread $_", 1..4), "parent"; my $url = "/registry_modperl_handler/ithreads_io_n_tie.pl"; my $received = GET_BODY_ASSERT($url) || ''; my @received = sort split /\n/, $received; ok t_cmp \@received, \@expected; } mod_perl-2.0.9/ModPerl-Registry/t/nph.t0000644000104000010010000000227412540623202020352 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 6, need 'mod_alias.c'; my $url = "/nph/nph-foo.pl"; my %expected = ( code => '250', body => "non-parsed headers body", headers => { 'content-type' => 'text/text', 'pragma' => 'no-cache', 'cache-control' => 'must-revalidate, no-cache, no-store', 'expires' => '-1', }, ); my $res = GET $url; my %received = ( code => $res->code, body => $res->content, headers => $res->headers, # LWP lc's the headers ); for my $key (keys %expected) { my $expected = $expected{$key}; my $received = $received{$key}; if ($key eq 'headers') { for my $header (keys %$expected) { ok t_cmp( $received->{$header}, $expected->{$header}, "test header $header" ); } } else { ok t_cmp( $received, $expected, "test key: $key" ); } } mod_perl-2.0.9/ModPerl-Registry/t/perlrun_extload.t0000644000104000010010000000134312540623202022770 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); use TestCommon::SameInterp; plan tests => 2, need [qw(mod_alias.c HTML::HeadParser)]; my $url = "/same_interp/perlrun/perlrun_extload.pl"; my $same_interp = Apache::TestRequest::same_interp_tie($url); for (1..2) { # should not fail on the second request my $res = same_interp_req_body($same_interp, \&GET, $url); same_interp_skip_not_found( !defined($res), $res, "d1nd1234", "PerlRun requiring an external lib with subs", ); } mod_perl-2.0.9/ModPerl-Registry/t/prefork.t0000644000104000010010000000265212540623202021235 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache::TestConfig (); use Apache2::Build (); my $mpm_is_threaded = Apache2::Build->build_config->mpm_is_threaded(); my %modules = ( registry => 'ModPerl::Registry', perlrun => 'ModPerl::PerlRun', registry_prefork => 'ModPerl::RegistryPrefork', perlrun_prefork => 'ModPerl::PerlRunPrefork', ); my @aliases = sort keys %modules; plan tests => 1*@aliases, need 'mod_alias.c', { "can't run under threaded MPMs" => !$mpm_is_threaded }; my $script = "prefork.pl"; # very basic compilation/response test for my $alias (qw(registry_prefork perlrun_prefork)) { my $url = "/$alias/$script"; #t_debug "$url"; ok t_cmp GET_BODY($url), "ok $script", "$modules{$alias} test"; } # the order is important, we also want to check that prefork specific # modules didn't affect the cwd of other modules # the normal handlers should not find the script in the cwd, as they # don't chdir to its directory before running the script for my $alias (qw(registry perlrun)) { my $url = "/$alias/$script"; #t_debug "$url"; ok t_cmp GET_BODY($url), qr/prefork didn't chdir into the scripts directory/, "$modules{$alias} test"; } mod_perl-2.0.9/ModPerl-Registry/t/redirect.t0000644000104000010010000000277512540623202021374 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET_BODY HEAD); use Apache::TestUtil qw(t_catfile_apache); plan tests => 4, need [qw(mod_alias.c HTML::HeadParser)], need_lwp; # need LWP to handle redirects my $base_url = "/registry/redirect.pl"; { my $redirect_path = "/registry/basic.pl"; my $url = "$base_url?$redirect_path"; my $vars = Apache::Test::config()->{vars}; my $script_file = t_catfile_apache $vars->{serverroot}, 'cgi-bin', 'basic.pl'; ok t_cmp( GET_BODY($url), "ok $script_file", "test redirect: existing target", ); } { my $redirect_path = "/registry/does_not_exists.pl"; my $url = "$base_url?$redirect_path"; t_client_log_error_is_expected(); ok t_cmp( HEAD($url)->code, 404, "test redirect: non-existing target", ); } { local $Apache::TestRequest::RedirectOK = 0; my $base_url = "/registry/redirect-cookie.pl"; my $redirect_path = "/registry/basic.pl"; my $url = "$base_url?$redirect_path"; my $response = HEAD $url; ok t_cmp( $response->code, 302, "test Registry style redirect: status", ); ok t_cmp( $response->header('Set-Cookie'), "mod_perl=ubercool; path=/", "test Registry style redirect: cookie", ); } mod_perl-2.0.9/ModPerl-Registry/t/regex.t0000644000104000010010000000164512540623202020700 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil qw(t_cmp t_catfile_apache); use Apache::TestRequest; use Apache::TestConfig (); my %modules = ( registry => 'ModPerl::Registry', registry_bb => 'ModPerl::RegistryBB', perlrun => 'ModPerl::PerlRun', ); my @aliases = sort keys %modules; plan tests => @aliases * 1, need 'mod_alias.c'; my $vars = Apache::Test::config()->{vars}; my $script_file = t_catfile_apache $vars->{serverroot}, 'cgi-bin', 'basic.pl'; # extended regex quoting # CVE-2007-1349 (which doesn't affect any of our shipped handlers) for my $alias (@aliases) { my $url = "/$alias/basic.pl/("; ok t_cmp( GET_BODY($url), "ok $script_file", "$modules{$alias} regex in path_info", ); } mod_perl-2.0.9/ModPerl-Registry/t/rewrite_env.t0000644000104000010010000000075212540623202022115 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(GET); plan tests => 1, need [qw(mod_alias.c mod_rewrite.c)]; { my $url = "/rewritetest"; my $res = GET $url; ok t_cmp($res->content(), "GOTCHA", 'found environment variable from mod_rewrite'); } mod_perl-2.0.9/ModPerl-Registry/t/special_blocks.t0000644000104000010010000001060412540623202022536 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # test BEGIN/END blocks's behavior use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use TestCommon::SameInterp; my %modules = ( registry => 'ModPerl::Registry', registry_bb => 'ModPerl::RegistryBB', perlrun => 'ModPerl::PerlRun', ); my @aliases = sort keys %modules; plan tests => @aliases * 4, need [qw(mod_alias.c HTML::HeadParser)]; { # PerlRun always run BEGIN/END since it's never cached # see also t/perlrun_extload.t which exercises BEGIN/END blocks # from external modules loaded from PerlRun scripts my $alias = "perlrun"; my $url = "/same_interp/$alias/special_blocks.pl"; my $same_interp = Apache::TestRequest::same_interp_tie($url); # if one sub-test has failed to run on the same interpreter, skip # the rest in the same group my $skip = 0; my $res = same_interp_req_body($same_interp, \&GET, "$url?begin"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "begin ok", "$modules{$alias} is running BEGIN blocks on the first request", ); $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?begin"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "begin ok", "$modules{$alias} is running BEGIN blocks on the second request", ); $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?end"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "end ok", "$modules{$alias} is running END blocks on the third request", ); $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?end"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "end ok", "$modules{$alias} is running END blocks on the fourth request", ); } # To properly test BEGIN/END blocks in registry implmentations # that do caching, we need to manually reset the registry* cache # for each given script, before starting each group of tests. for my $alias (grep !/^perlrun$/, @aliases) { my $url = "/same_interp/$alias/special_blocks.pl"; my $same_interp = Apache::TestRequest::same_interp_tie($url); # if one sub-test has failed to run on the same interpreter, skip # the rest in the same group my $skip = 0; # clear the cache of the registry package for the script in $url my $res = same_interp_req_body($same_interp, \&GET, "$url?uncache"); $skip++ unless defined $res; $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?begin"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "begin ok", "$modules{$alias} is running BEGIN blocks on the first request", ); $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?begin"); $skip++ unless defined $res; t_debug($res); same_interp_skip_not_found( $skip, $res, "", "$modules{$alias} is not running BEGIN blocks on the second request", ); $same_interp = Apache::TestRequest::same_interp_tie($url); $skip = 0; # clear the cache of the registry package for the script in $url $res = same_interp_req_body($same_interp, \&GET, "$url?uncache"); $skip++ unless defined $res; $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?end"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "end ok", "$modules{$alias} is running END blocks on the first request", ); $res = $skip ? undef : same_interp_req_body($same_interp, \&GET, "$url?end"); $skip++ unless defined $res; same_interp_skip_not_found( $skip, $res, "end ok", "$modules{$alias} is running END blocks on the second request", ); } mod_perl-2.0.9/ModPerl-Registry/t/TEST.PL0000644000177200010010000000256712540623202016520 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use FindBin; # test against the source lib for easier dev use lib "$FindBin::Bin/../lib"; use lib grep { -d } map "$FindBin::Bin/../../$_", qw(lib Apache-Test/lib); # pick the common test libs use lib "$FindBin::Bin/../../t/lib"; MyTest->new->run(@ARGV); # sub-class Apache::TestRunPerl package MyTest; use base qw(Apache::TestRunPerl); # redirect tests require 2 servers use constant MIN_CLIENTS => 2; use File::Spec::Functions qw(catdir); use File::Basename qw(dirname); use Apache2::Build; # default timeout in secs (threaded mpms are extremely slow to # startup, due to a slow perl_clone operation) use constant DEFAULT_STARTUP_TIMEOUT => Apache2::Build->build_config->mpm_is_threaded() ? 180 : 90; # subclass new_test_config to add some config vars which will be # replaced in generated httpd.conf sub new_test_config { my $self = shift; require Apache::Test; my $mp2_root_dir = dirname Apache::Test::vars('top_dir'); $self->{conf_opts}->{src_dir} = catdir $mp2_root_dir, qw(src modules perl); $self->{conf_opts}->{startup_timeout} ||= $ENV{APACHE_TEST_STARTUP_TIMEOUT} || DEFAULT_STARTUP_TIMEOUT; $self->{conf_opts}->{minclients} ||= MIN_CLIENTS; return $self->SUPER::new_test_config; } sub bug_report { require ModPerl::TestRun; shift->ModPerl::TestRun::bug_report(); } mod_perl-2.0.9/ModPerl-Registry/TODO0000644000177200010010000000000012540623202015705 0ustar SteveNonemod_perl-2.0.9/mod_perl.spec0000644000104000010010000000553012540623202016440 0ustar AdministratorsNone%define _version 2.0.9 %define _release 1 %define _source http://apache.org/dist/perl/mod_perl-2.0.9.tar.gz %define _dirname mod_perl-2.0.9 %define _httpd_min_ver 2.0.47 %define _perl_min_ver 5.6.1 Name: mod_perl Version: %{_version} Release: %{_release} Summary: An embedded Perl interpreter for the Apache Web server Group: System Environment/Daemons License: Apache License, Version 2.0 Packager: mod_perl Development Team URL: http://perl.apache.org/ Source: %{_source} BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: httpd >= %{_httpd_min_ver} BuildRequires: perl >= %{_perl_min_ver} BuildRequires: httpd-devel >= %{_httpd_min_ver} BuildRequires: apr-devel, apr-util-devel %description Mod_perl incorporates a Perl interpreter into the Apache web server, so that the Apache web server can directly execute Perl code. Mod_perl links the Perl runtime library into the Apache web server and provides an object-oriented Perl interface for Apache's C language API. The end result is a quicker CGI script turnaround process, since no external Perl interpreter has to be started. Install mod_perl if you're installing the Apache web server and you'd like for it to directly incorporate a Perl interpreter. %package devel Summary: Files needed for building XS modules that use mod_perl Group: Development/Libraries Requires: mod_perl = %{version}-%{release}, httpd-devel %description devel The mod_perl-devel package contains the files needed for building XS modules that use mod_perl. %prep %setup -q -n %{_dirname} %build CFLAGS="$RPM_OPT_FLAGS" %{__perl} Makefile.PL /dev/null ';' %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc Changes LICENSE README* STATUS SVN-MOVE docs/ %{_bindir}/* %{_libdir}/httpd/modules/mod_perl.so %{perl_vendorarch}/auto/* %{perl_vendorarch}/Apache/ %{perl_vendorarch}/Apache2/ %{perl_vendorarch}/Bundle/ %{perl_vendorarch}/APR/ %{perl_vendorarch}/ModPerl/ %{perl_vendorarch}/*.pm %{_mandir}/man?/* %files devel %defattr(-,root,root,-) %{_includedir}/httpd/* %changelog mod_perl-2.0.9/NOTICE0000644000177200010010000000014512540623202012763 0ustar SteveNoneThis product includes software developed by The Apache Software Foundation (http://www.apache.org/). mod_perl-2.0.9/README0000644000104000010010000000575712540623202014656 0ustar AdministratorsNoneThis is mod_perl version 2.0 *** Prerequisites *** Apache: Dynamic mod_perl (DSO): Apache 2.0.47 - 2.4.12. Static mod_perl: Apache 2.0.51 - 2.4.12. Newer Apache versions may work with this version of mod_perl. If not, the svn version likely will, which can be obtained from: http://perl.apache.org/download/source.html#Development_mod_perl_2_0_Source_Distribution Perl: Any stable version of Perl currently in support by the Perl community, as described in recent Perl distributions' "perlpolicy.pod" document, EXCEPT THAT Perl 5.22.x is currently not supported due to the problem reported in https://rt.cpan.org/Ticket/Display.html?id=101962 We hope to address that in the next release (2.0.10). Newer Perl versions may work with this version of mod_perl. If not, the svn version likely will (see above). Many older Perl versions also work with this version of mod_perl: Perls back to version 5.8.2 (and possibly earlier in some build configurations) are currently believed to work, but this is not guaranteed to be the case, either now or in the future. C compiler: The mod_perl source currently uses GNU89 inline semantics on GCC, but GCC 5 defaults to newer C99 semantics. If you see MP_INLINE related warnings during the build and missing symbols when starting the test suite, adding "-fgnu89-inline" to MP_CCOPTS may help. There are also some reports of this happening with the Clang compiler, where the corresponding option to try is "-std=gnu89". *** Status *** mod_perl is currently considered stable. Four test scripts are currently known to fail with Apache 2.4.x on Windows: t/protocol/echo_block.t (Fails tests 2-3) t/protocol/echo_nonblock.t (Fails test 2) t/protocol/echo_timeout.t (Fails tests 2-5) t/protocol/pseudo_http.t (Fails tests 3-8 and 11-13) *** Documentation *** Documentation can be found in the docs/ directory. Currently they don't get installed on 'make install'. Certain API documentation can be found in docs/api/. The online version is at http://perl.apache.org/docs/2.0/. *** Todo *** mod_perl-2.0 is not 100% feature complete with the 1.xx version. See the files in the todo/ directory for what remains to be done. Some of those features will be implemented after 2.0 is released. The goal is to empty the file todo/release and document/test/verify the API that's going to be supported by 2.0. More API will be supported post 2.0 release. *** Support *** For comments, questions, bug-reports, etc., join the mod_perl users list by sending mail to modperl-subscribe@perl.apache.org. When reporting bugs please follow the instructions at: http://perl.apache.org/docs/2.0/user/help/help.html#Reporting_Problems For announcements join the mod_perl announce list by sending mail to announce-subscribe@perl.apache.org. *** Developers *** Development discussion takes place on dev (at) perl.apache.org *** Authors *** mod_perl-2.0 was designed and written by Doug MacEachern, with contributions from many others (see Changes files). mod_perl-2.0.9/README-SVN0000644000177200010010000000323312540623202013404 0ustar SteveNonethis is a very simple document that outlines some of the important details about the mod_perl svn repository. LAYOUT the mod_perl project at the Apache Software Foundation lives here http://svn.apache.org/repos/asf/perl/ and uses the following structure modperl/trunk # equivalent to cvs HEAD - currently # the mod_perl 2.0 development branch modperl/tags # every official mod_perl release modperl/docs/trunk # the mod_perl documentation project modperl/trunk includes the following svn:externals properties: % cd modperl % svn propedit svn:externals . [vi pops up] Apache-Test https://svn.apache.org/repos/asf/perl/Apache-Test/trunk Apache-Reload https://svn.apache.org/repos/asf/perl/Apache-Reload/trunk Apache-SizeLimit https://svn.apache.org/repos/asf/perl/Apache-SizeLimit/trunk docs https://svn.apache.org/repos/asf/perl/modperl/docs/trunk/src/docs/2.0 DEVELOPER ACCESS assuming that you have already been granted commit access to the repository, you should follow the following steps to checkout mod_perl Change your password via: https://svn.apache.org/change-password $ svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0 if you want to test that your commit access is working, this file is an acceptable place to take a test drive. FURTHER READING for more details, see http://perl.apache.org/docs/2.0/user/install/install.html for information on getting httpd and mod_perl from svn, as well as http://svnbook.red-bean.com/ for svn information in general. svn for cvs users (including migration tools): http://svnbook.red-bean.com/en/1.0/apa.html mod_perl-2.0.9/RELEASE0000644000104000010010000002055712540623202014774 0ustar AdministratorsNoneInstructions for mod_perl 2.0 Release Manager 0. make sure your public key is in the KEYS file in the mod_perl docs. you should only need to do this if this is your first time playing Release Manager $ cd mod_perl-docs $ grep $USER src/dist/KEYS note that the KEYS file itself contains all the instructions you need on how to add your key. if you need further help on gpg (like how to create a key in the first place) you can look here http://people.apache.org/~geoff/gpghowto.html Copy the KEYS file into place: % scp KEYS people.apache.org:/www/www.apache.org/dist/perl/KEYS If this is your first release, ask someone with APML karma on PAUSE to verify you have the appropriate permissions. Likely someone on the PMC can do this. a. login into https://pause.perl.org b. menu click: Select Mailinglist/Action c. choose APML and Change Permissions and click go d. click 3.1 Make somebody else co-maintainer e. choose the modules to give the perms to type the username of the new co-maintainer f. if you happen to know that packages were added this release, make sure you give the correct permissions to them. 1. 'make mydist' - to make sure nothing is missing from the manifest, etc. Now test this generated package mod_perl-2.0.9.tar.gz (not the current build) with as many configurations as possible on as many platforms as possible, unpacking the package each time afresh. a. edit ./Changes - change -dev to -rc\d+ starting with -rc1 - edit META.yml to the rc\d version above in the version key b. nuke any preinstalled mod_perl libs and run 'make test' c. test that you can 'make install' and then run 'make test' again d. test whether we still 100% OK on systems with no LWP: % APACHE_TEST_PRETEND_NO_LWP=1 make test e. build and test as root. double check that you have started from a fresh source, without having any stale dirs from the previous build laying around. 2. once confident that the package is good, upload a release candidate to people.apache.org/~username and post 24 hour-ish candidate alert to the modperl/dev list (may be longer to give most people a chance to catch up). no need to tag this package Subject: [RELEASE CANDIDATE]: mod_perl-2.0.9 RC\d+ 2a. if problems are detected during stage 2, repeat stages 1 and 2. 3. when the package has been reported to be good, prepare a new package to be released a. edit ./Changes: - remove -rc\d+ - add release date - edit META.yml to remove the -rc\d+ from the version key b. check ./README and ./Makefile.PL - make sure supported httpd versions (dso & static) are current c. rerun: % perl Makefile.PL make sure tag looks right % make -n tag d. commit Changes README Makefile.PL % svn ci -m "Releasing 2.0.9" Changes README Makefile.PL e. tag % make tag XXXX: See BRANCHING for the steps to include the proper tagged externals XXXX: This needs to be fixed, and updated, developer beware its outdated and possibly wrong f. Update the svn:externals in the new tag (you can't propedit remotely yet in svn) % svn co https://svn.apache.org/repos/asf/perl/modperl/tags/2_0_9 % svn propedit svn:externals 2_0_9 Update the Apache-Test line to current revision % svn info https://svn.apache.org/repos/asf/perl/Apache-Test/trunk | grep "Last Changed Rev" Update the docs line to the current tag. It should look like: % svn propget svn:externals 2_0_9 Apache-Test -r 608229 https://svn.apache.org/repos/asf/perl/Apache-Test/trunk docs https://svn.apache.org/repos/asf/perl/modperl/docs/tags/2_0_9/src/docs/2.0 % svn ci -m "Releasing 2.0.9" g. create the final package % make dist h. test the final package again at least once 4. Release the package and update links (e.g. mod_perl-2.0.9.tar.gz) a. upload to people.apache.org:/www/perl.apache.org/dist/ - ask the PMC chair to give you the needed permissions if you do not have them. % scp mod_perl-2.0.9.tar.gz people.apache.org:/www/perl.apache.org/dist/ b. ssh to people.apache.org, unpack the package, update symlinks to the tar ball and unpacked distro: % ssh people.apache.org % cd /www/perl.apache.org/dist/ % ln -sf mod_perl-2.0.9.tar.gz mod_perl-2.0-current.tar.gz % tar -xzvf mod_perl-2.0.9.tar.gz % rm /www/perl.apache.org/dist/mod_perl-2.0-current % ln -sf mod_perl-2.0.9 mod_perl-2.0-current c. archive older releases (keep current + one prior release) % mv /www/perl.apache.org/dist/mod_perl-2.0.7.tar.gz \ /www/perl.apache.org/dist/old % mv /www/perl.apache.org/dist/mod_perl-2.0.7.tar.gz.asc \ /www/perl.apache.org/dist/old % rm -rf /www/perl.apache.org/dist/mod_perl-2.0.7 d. update the version and release date in the docs: % vi modperl-docs/src/download/index_top.html % vi modperl-docs/doap_Perl.rdf and commit. % svn ci -m "Releasing 2.0.9" \ modperl-docs/src/download/index_top.html \ modperl-docs/doap_Perl.rdf It'll be automatically updated within 6 hours. Alternatively you can do a manual update by logging into www.apache.org and running: % /home/perlwww/apache.org/modperl-docs/bin/site_build You may need to sudo -H -u perlwww to cleanup any svn locks. 5. Upload the package to CPAN 6. Tarball signing (depending on whether you use GPG or PGP, pick the first or the second set of the commands): a. sign your local copy of the tarball: % gpg --detach-sign --armor mod_perl-2.0.9.tar.gz % pgps -b --armor mod_perl-2.0.9.tar.gz b. upload the generated sig file to people.apache.org: % scp mod_perl-2.0.9.tar.gz.asc people.apache.org:/www/perl.apache.org/dist/ % ssh people.apache.org % cd /www/perl.apache.org/dist/ % chmod 0664 mod_perl-2.0.9.tar.gz.asc % ln -sf mod_perl-2.0.9.tar.gz.asc mod_perl-2.0-current.tar.gz.asc c. ask one of the other developers to double check the signature file and tarball: download both files and verify the signature: http://perl.apache.org/dist/mod_perl-2.0.9.tar.gz.asc http://perl.apache.org/dist/mod_perl-2.0.9.tar.gz % gpg --verify mod_perl-2.0.9.tar.gz.asc % pgpv mod_perl-2.0.9.tar.gz.asc d. make sure that the files you just created are group rw so all the dist admins can make changes: % find /www/perl.apache.org/dist/ -user $USER -type f -print0 | xargs -0 chmod 0664 % find /www/perl.apache.org/dist/ -user $USER -type d -print0 | xargs -0 chmod 0775 7. Distribute to www.apache.org/dist/perl and archive the old package under /www/archive.apache.org/dist/perl/ a. unpack the package, update symlinks to the tarball and unpacked distro: % cd /www/www.apache.org/dist/perl/ % cp /www/perl.apache.org/dist/mod_perl-2.0.9.tar.gz* . % tar -xzvf mod_perl-2.0.9.tar.gz % mv mod_perl-2.0.7.tar.gz* /www/archive.apache.org/dist/perl/ % rm -rf mod_perl-2.0.7 b. make sure that the files you just created are group rw so all the dist admins can make changes: % find /www/www.apache.org/dist/perl/ -user $USER -type f -print0 | xargs -0 chmod 0664 % find /www/www.apache.org/dist/perl/ -user $USER -type d -print0 | xargs -0 chmod 0775 8. Announce the package a. post ... to the modperl, announce lists Note, to post to announce@, you must be sending from an apache.org address. Subject: [ANNOUNCE] mod_perl 2.0.9 include - link at perl.apache.org: http://apache.org/dist/perl/mod_perl-2.0.9.tar.gz http://apache.org/dist/perl/mod_perl-2.0.9.tar.gz.asc (pgp sig) - MD5 sig (as it comes from CPAN upload announce). - the latest Changes 9. Prepare for the next cycle a. increment version in lib/mod_perl2.pm b. increment version in META.yml c. edit ./Changes: - start a new item with incremented version + '-dev' =item 2.0.10-dev d. add a release entry in STATUS e. update this file versions to make it easy to copy-n-paste things on the next release: $ perl -pi -e 's/(\d+)([._])(\d+)(\2)(\d+)/join($2, $1, $3, $5+1)/eg' RELEASE f. commit the changed files % svn ci -m "start 2.0.9-dev cycle" Changes META.yml lib/mod_perl2.pm \ STATUS RELEASE 10. Old Versions Remind other Developers to delete versions older then the prior release from CPAN. Old releases can always be found on BACKPAN. mod_perl-2.0.9/src/0000755000104000010010000000000012540623172014555 5ustar AdministratorsNonemod_perl-2.0.9/src/modules/0000755000104000010010000000000012540623172016225 5ustar AdministratorsNonemod_perl-2.0.9/src/modules/perl/0000755000104000010010000000000012540623203017162 5ustar AdministratorsNonemod_perl-2.0.9/src/modules/perl/modperl_apache_compat.c0000644000104000010010000000477112540623202023644 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define AP_DECLARE_EXPORT #include "mod_perl.h" /* back compat adjustements for older Apache versions * BACK_COMPAT_MARKER: make back compat issues easy to find :) */ /* use the following format: * #if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) * [compat code] * #endif * and don't forget to insert comments explaining exactly * which httpd release allows us to remove the compat code */ /* pre-APACHE_2.2.4 */ #if ! AP_MODULE_MAGIC_AT_LEAST(20051115,4) #define modperl_warn_fallback_http_function(ver, fallback) \ { \ dTHX; \ Perl_warn(aTHX_ "%s() not available until httpd/%s " \ "falling back to %s()", \ MP_FUNC, ver, fallback); \ } /* added in APACHE_2.2.4 */ AP_DECLARE(const char *) ap_get_server_description(void) { modperl_warn_fallback_http_function("2.2.4", "ap_get_server_version"); return ap_get_server_version(); } AP_DECLARE(const char *) ap_get_server_banner(void) { modperl_warn_fallback_http_function("2.2.4", "ap_get_server_version"); return ap_get_server_version(); } #endif /* pre-APACHE_2.2.4 */ /* since-APACHE-2.3.0 */ #if AP_MODULE_MAGIC_AT_LEAST(20060905,0) #define modperl_warn_deprecated_http_function(ver, fallback) \ { \ dTHX; \ Perl_warn(aTHX_ "%s() is deprecated since httpd/%s " \ "try using %s() instead", \ MP_FUNC, ver, fallback); \ } AP_DECLARE(const char *) ap_get_server_version(void) { modperl_warn_deprecated_http_function("2.3.0", "ap_get_server_(description|banner)"); return ap_get_server_banner(); } #endif /* since-APACHE-2.3.0 */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_apache_compat.h0000644000104000010010000000661112540623202023644 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_APACHE_COMPAT_H #define MODPERL_APACHE_COMPAT_H /* back compat adjustements for older Apache versions */ #if !APR_HAS_THREADS typedef unsigned long apr_os_thread_t; typedef void * apr_thread_mutex_t; typedef void * apr_thread_rwlock_t; #endif /* back compat adjustements for older Apache versions * BACK_COMPAT_MARKER: make back compat issues easy to find :) */ /* use the following format: * #if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) * [compat code] * #endif * and don't forget to insert comments explaining exactly * which httpd release allows us to remove the compat code */ /* pre-APACHE_2.2.4 */ #if ! AP_MODULE_MAGIC_AT_LEAST(20051115,4) /* added in APACHE_2.2.4 */ AP_DECLARE(const char *) ap_get_server_description(void); AP_DECLARE(const char *) ap_get_server_banner(void); #endif /* pre-APACHE_2.2.4 */ /* since-APACHE-2.3.0 */ #if AP_MODULE_MAGIC_AT_LEAST(20060905,0) /* removed in APACHE-2.3.0 */ AP_DECLARE(const char *) ap_get_server_version(void); #endif /* since-APACHE-2.3.0 */ /* ap_http_scheme is called ap_http_method in httpd 2.0 */ #ifndef ap_http_scheme #define ap_http_scheme(r) ap_http_method(r) #endif #if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=2 #define MP_HTTPD_HAS_OVERRIDE_OPTS #endif #define MP_HTTPD_OVERRIDE_HTACCESS (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES) #define MP_HTTPD_OVERRIDE_OPTS_UNSET (-1) #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) /* 2.4 API */ #define MP_HTTPD_OVERRIDE_OPTS_DEFAULT (OPT_UNSET | \ OPT_ALL | \ OPT_SYM_OWNER | \ OPT_MULTI) #define mp_add_loaded_module(modp, pool, name) \ ap_add_loaded_module((modp), (pool), (name)) #define mp_loglevel(s) ((s)->log.level) #define mp_module_index_ perl_module.module_index, #else /* 2.2 API */ #define MP_HTTPD_OVERRIDE_OPTS_DEFAULT (OPT_UNSET | \ OPT_ALL | \ OPT_INCNOEXEC | \ OPT_SYM_OWNER | \ OPT_MULTI) #define mp_add_loaded_module(modp, pool, name) \ ap_add_loaded_module((modp), (pool)) #define mp_loglevel(s) ((s)->loglevel) #define mp_module_index_ #define ap_unixd_config unixd_config #endif /* 2.4 vs. 2.2 API */ #ifndef PROXYREQ_RESPONSE #define PROXYREQ_RESPONSE (3) #endif #endif /* MODPERL_APACHE_COMPAT_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_apache_includes.h0000644000104000010010000000316312540623202024166 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_APACHE_INCLUDES_H #define MODPERL_APACHE_INCLUDES_H /* header files for Apache */ #ifndef CORE_PRIVATE #define CORE_PRIVATE #endif #include "ap_mmn.h" #include "httpd.h" #include "http_config.h" #include "http_log.h" #include "http_protocol.h" #include "http_main.h" #include "http_request.h" #include "http_connection.h" #include "http_core.h" #include "http_vhost.h" #include "ap_mpm.h" #include "util_filter.h" #include "util_script.h" #if !defined(MP_IN_XS) && AP_MODULE_MAGIC_AT_LEAST(20100606, 0) APLOG_USE_MODULE(perl); #endif #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) #include "ap_provider.h" #include "mod_auth.h" #endif #endif /* MODPERL_APACHE_INCLUDES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_apr_compat.h0000644000104000010010000001042512540623202023203 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_APR_COMPAT_H #define MODPERL_APR_COMPAT_H /* back compat adjustements for older libapr versions */ /* BACK_COMPAT_MARKER: make back compat issues easy to find :) */ /* use the following format: * #if ! AP_MODULE_MAGIC_AT_LEAST(20020903,4) * [compat code] * #endif * and don't forget to insert comments explaining exactly * which httpd release allows us to remove the compat code */ /* apr_filetype_e entries rename */ #ifndef APR_FILETYPE_NOFILE #define APR_FILETYPE_NOFILE APR_NOFILE #endif #ifndef APR_FILETYPE_REG #define APR_FILETYPE_REG APR_REG #endif #ifndef APR_FILETYPE_DIR #define APR_FILETYPE_DIR APR_DIR #endif #ifndef APR_FILETYPE_CHR #define APR_FILETYPE_CHR APR_CHR #endif #ifndef APR_FILETYPE_BLK #define APR_FILETYPE_BLK APR_BLK #endif #ifndef APR_FILETYPE_PIPE #define APR_FILETYPE_PIPE APR_PIPE #endif #ifndef APR_FILETYPE_LNK #define APR_FILETYPE_LNK APR_LNK #endif #ifndef APR_FILETYPE_SOCK #define APR_FILETYPE_SOCK APR_SOCK #endif #ifndef APR_FILETYPE_UNKFILE #define APR_FILETYPE_UNKFILE APR_UNKFILE #endif /* apr file permissions group rename (has no enum) */ #if defined(APR_USETID) && !defined(APR_FPROT_USETID) #define APR_FPROT_USETID APR_USETID #endif #ifndef APR_FPROT_UREAD #define APR_FPROT_UREAD APR_UREAD #endif #ifndef APR_FPROT_UWRITE #define APR_FPROT_UWRITE APR_UWRITE #endif #ifndef APR_FPROT_UEXECUTE #define APR_FPROT_UEXECUTE APR_UEXECUTE #endif #if defined(APR_GSETID) && !defined(APR_FPROT_GSETID) #define APR_FPROT_GSETID APR_GSETID #endif #ifndef APR_FPROT_GREAD #define APR_FPROT_GREAD APR_GREAD #endif #ifndef APR_FPROT_GWRITE #define APR_FPROT_GWRITE APR_GWRITE #endif #ifndef APR_FPROT_GEXECUTE #define APR_FPROT_GEXECUTE APR_GEXECUTE #endif #if defined(APR_WSTICKY) && !defined(APR_FPROT_WSTICKY) #define APR_FPROT_WSTICKY APR_WSTICKY #endif #ifndef APR_FPROT_WREAD #define APR_FPROT_WREAD APR_WREAD #endif #ifndef APR_FPROT_WWRITE #define APR_FPROT_WWRITE APR_WWRITE #endif #ifndef APR_FPROT_WEXECUTE #define APR_FPROT_WEXECUTE APR_WEXECUTE #endif #ifndef APR_FPROT_OS_DEFAULT #define APR_FPROT_OS_DEFAULT APR_OS_DEFAULT #endif /* APR_FPROT_FILE_SOURCE_PERMS seems to have only an internal apr * use */ /* apr_file_open flag group rename (has no enum) */ #ifndef APR_FOPEN_READ #define APR_FOPEN_READ APR_READ #endif #ifndef APR_FOPEN_WRITE #define APR_FOPEN_WRITE APR_WRITE #endif #ifndef APR_FOPEN_CREATE #define APR_FOPEN_CREATE APR_CREATE #endif #ifndef APR_FOPEN_APPEND #define APR_FOPEN_APPEND APR_APPEND #endif #ifndef APR_FOPEN_TRUNCATE #define APR_FOPEN_TRUNCATE APR_TRUNCATE #endif #ifndef APR_FOPEN_BINARY #define APR_FOPEN_BINARY APR_BINARY #endif #ifndef APR_FOPEN_EXCL #define APR_FOPEN_EXCL APR_EXCL #endif #ifndef APR_FOPEN_BUFFERED #define APR_FOPEN_BUFFERED APR_BUFFERED #endif #ifndef APR_FOPEN_DELONCLOSE #define APR_FOPEN_DELONCLOSE APR_DELONCLOSE #endif #ifndef APR_FOPEN_XTHREAD #define APR_FOPEN_XTHREAD APR_XTHREAD #endif #ifndef APR_FOPEN_SHARELOCK #define APR_FOPEN_SHARELOCK APR_SHARELOCK #endif #ifndef APR_FOPEN_NOCLEANUP #define APR_FOPEN_NOCLEANUP APR_FILE_NOCLEANUP #endif #ifndef APR_FOPEN_SENDFILE_ENABLED #define APR_FOPEN_SENDFILE_ENABLED APR_SENDFILE_ENABLED #endif #ifndef APR_FOPEN_LARGEFILE /* added in 2.0.50 */ #ifdef APR_LARGEFILE #define APR_FOPEN_LARGEFILE APR_LARGEFILE #endif #endif #endif /* MODPERL_APR_COMPAT_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_apr_includes.h0000644000104000010010000000270712540623202023532 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_APR_INCLUDES_H #define MODPERL_APR_INCLUDES_H /* header files for APR */ #ifndef CORE_PRIVATE #define CORE_PRIVATE #endif #include "apr_version.h" #include "apr_poll.h" #include "apr_lib.h" #include "apr_strings.h" #include "apr_uri.h" #include "apr_date.h" #include "apr_buckets.h" #include "apr_time.h" #include "apr_network_io.h" #include "apr_general.h" #include "apr_uuid.h" #include "apr_env.h" #include "apu_version.h" #if APU_MAJOR_VERSION > 1 \ || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION > 3) #include "apu_errno.h" #endif #endif /* MODPERL_APR_INCLUDES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_bucket.c0000644000104000010010000001101412540623202022321 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* * modperl_bucket_sv code derived from mod_snake's ModSnakePyBucket * by Jon Travis */ typedef struct { apr_bucket_refcount refcount; SV *sv; PerlInterpreter *perl; } modperl_bucket_sv_t; static apr_status_t modperl_bucket_sv_read(apr_bucket *bucket, const char **str, apr_size_t *len, apr_read_type_e block) { modperl_bucket_sv_t *svbucket = bucket->data; dTHXa(svbucket->perl); STRLEN svlen; char *pv = SvPV(svbucket->sv, svlen); *str = pv + bucket->start; *len = bucket->length; if (svlen < bucket->start + bucket->length) { /* XXX log error? */ return APR_EGENERAL; } return APR_SUCCESS; } static void modperl_bucket_sv_destroy(void *data) { modperl_bucket_sv_t *svbucket = data; dTHXa(svbucket->perl); if (!apr_bucket_shared_destroy(svbucket)) { MP_TRACE_f(MP_FUNC, "bucket refcnt=%d", ((apr_bucket_refcount *)svbucket)->refcount); return; } MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d", (unsigned long)svbucket->sv, SvREFCNT(svbucket->sv)); SvREFCNT_dec(svbucket->sv); apr_bucket_free(svbucket); } static apr_status_t modperl_bucket_sv_setaside(apr_bucket *bucket, apr_pool_t *pool) { modperl_bucket_sv_t *svbucket = bucket->data; dTHXa(svbucket->perl); STRLEN svlen; char *pv = SvPV(svbucket->sv, svlen); if (svlen < bucket->start + bucket->length) { /* XXX log error? */ return APR_EGENERAL; } pv = apr_pstrmemdup(pool, pv + bucket->start, bucket->length); if (pv == NULL) { return APR_ENOMEM; } /* changes bucket guts by reference */ if (apr_bucket_pool_make(bucket, pv, bucket->length, pool) == NULL) { return APR_ENOMEM; } modperl_bucket_sv_destroy(svbucket); return APR_SUCCESS; } static const apr_bucket_type_t modperl_bucket_sv_type = { "mod_perl SV bucket", 4, #if MODULE_MAGIC_NUMBER >= 20020602 APR_BUCKET_DATA, #endif modperl_bucket_sv_destroy, modperl_bucket_sv_read, modperl_bucket_sv_setaside, apr_bucket_shared_split, apr_bucket_shared_copy, }; static apr_bucket *modperl_bucket_sv_make(pTHX_ apr_bucket *bucket, SV *sv, apr_off_t offset, apr_size_t len) { modperl_bucket_sv_t *svbucket; svbucket = apr_bucket_alloc(sizeof(*svbucket), bucket->list); bucket = apr_bucket_shared_make(bucket, svbucket, offset, len); if (!bucket) { apr_bucket_free(svbucket); return NULL; } #ifdef USE_ITHREADS svbucket->perl = aTHX; #endif /* PADTMP SVs belong to perl and can't be stored away, since perl * is going to reuse them, so we have no choice but to copy the * data away, before storing sv */ if (SvPADTMP(sv)) { STRLEN len; char *pv = SvPV(sv, len); svbucket->sv = newSVpvn(pv, len); } else { svbucket->sv = sv; (void)SvREFCNT_inc(svbucket->sv); } MP_TRACE_f(MP_FUNC, "sv=0x%lx, refcnt=%d", (unsigned long)svbucket->sv, SvREFCNT(svbucket->sv)); bucket->type = &modperl_bucket_sv_type; return bucket; } apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv, apr_off_t offset, apr_size_t len) { apr_bucket *bucket; bucket = apr_bucket_alloc(sizeof(*bucket), list); APR_BUCKET_INIT(bucket); bucket->list = list; bucket->free = apr_bucket_free; return modperl_bucket_sv_make(aTHX_ bucket, sv, offset, len); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_bucket.h0000644000104000010010000000213112540623202022326 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_BUCKET_H #define MODPERL_BUCKET_H apr_bucket *modperl_bucket_sv_create(pTHX_ apr_bucket_alloc_t *list, SV *sv, apr_off_t offset, apr_size_t len); #endif /* MODPERL_BUCKET_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_callback.c0000644000104000010010000003201612540623202022605 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, request_rec *r, server_rec *s, AV *args) { CV *cv = (CV *)NULL; I32 flags = G_EVAL|G_SCALAR; dSP; int count, status = OK; /* handler callbacks shouldn't affect each other's taintedness * state, so start every callback with a clear tainted status * before and after the callback one of the main problems we are * trying to solve is that when modperl_croak called (which calls * perl's croak((char *)NULL) to throw an error object) it leaves * the interpreter in the tainted state which later affects other * callbacks that call eval, etc., which triggers perl crash with: * Insecure dependency in eval while running setgid. Callback * called exit. */ TAINT_NOT; if ((status = modperl_handler_resolve(aTHX_ &handler, p, s)) != OK) { TAINT_NOT; return status; } ENTER;SAVETMPS; PUSHMARK(SP); if (MpHandlerMETHOD(handler)) { GV *gv; if (!handler->mgv_obj) { Perl_croak(aTHX_ "panic: %s method handler object is NULL!", modperl_handler_name(handler)); } gv = modperl_mgv_lookup(aTHX_ handler->mgv_obj); XPUSHs(modperl_mgv_sv(gv)); } if (args) { I32 items = AvFILLp(args) + 1; EXTEND(SP, items); Copy(AvARRAY(args), SP + 1, items, SV*); SP += items; } PUTBACK; if (MpHandlerANON(handler)) { #ifdef USE_ITHREADS cv = modperl_handler_anon_get(aTHX_ handler->mgv_obj); #else cv = handler->cv; #endif } else { GV *gv = modperl_mgv_lookup_autoload(aTHX_ handler->mgv_cv, s, p); if (gv) { cv = modperl_mgv_cv(gv); } else { const char *name; modperl_mgv_t *symbol = handler->mgv_cv; /* XXX: need to validate *symbol */ if (symbol && symbol->name) { name = modperl_mgv_as_string(aTHX_ symbol, p, 0); } else { name = handler->name; } MP_TRACE_h(MP_FUNC, "[%s] lookup of %s failed", modperl_server_desc(s, p), name); ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "lookup of '%s' failed", name); status = HTTP_INTERNAL_SERVER_ERROR; } } if (status == OK) { count = call_sv((SV*)cv, flags); SPAGAIN; if (count != 1) { /* XXX can this really happen with G_EVAL|G_SCALAR? */ status = OK; } else { SV *status_sv = POPs; if (status_sv == &PL_sv_undef) { /* ModPerl::Util::exit() and Perl_croak internally * arrange to return PL_sv_undef with G_EVAL|G_SCALAR */ status = OK; } else { status = SvIVx(status_sv); } } PUTBACK; } FREETMPS;LEAVE; if (SvTRUE(ERRSV)) { MP_TRACE_h(MP_FUNC, "$@ = %s", SvPV_nolen(ERRSV)); status = HTTP_INTERNAL_SERVER_ERROR; } if (status == HTTP_INTERNAL_SERVER_ERROR) { if (r && r->notes) { apr_table_merge(r->notes, "error-notes", SvPV_nolen(ERRSV)); } } TAINT_NOT; return status; } int modperl_callback_run_handlers(int idx, int type, request_rec *r, conn_rec *c, server_rec *s, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, modperl_hook_run_mode_e run_mode) { MP_dINTERP; MP_dSCFG(s); MP_dDCFG; MP_dRCFG; modperl_handler_t **handlers; apr_pool_t *p = NULL; MpAV *av, **avp; int i, status = OK; const char *desc = NULL; AV *av_args = (AV *)NULL; if (!MpSrvENABLE(scfg)) { MP_TRACE_h(MP_FUNC, "PerlOff for server %s:%u", s->server_hostname, s->port); return DECLINED; } if (r || c) { p = c ? c->pool : r->pool; } else { p = pconf; } avp = modperl_handler_lookup_handlers(dcfg, scfg, rcfg, p, type, idx, FALSE, &desc); if (!(avp && (av = *avp))) { MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)", desc, r ? r->uri : ""); return DECLINED; } MP_INTERPa(r, c, s); switch (type) { case MP_HANDLER_TYPE_PER_SRV: modperl_handler_make_args(aTHX_ &av_args, "Apache2::RequestRec", r, NULL); /* per-server PerlSetEnv and PerlPassEnv - only once per-request */ if (! MpReqPERL_SET_ENV_SRV(rcfg)) { modperl_env_configure_request_srv(aTHX_ r); } break; case MP_HANDLER_TYPE_PER_DIR: modperl_handler_make_args(aTHX_ &av_args, "Apache2::RequestRec", r, NULL); /* per-server PerlSetEnv and PerlPassEnv - only once per-request */ if (! MpReqPERL_SET_ENV_SRV(rcfg)) { modperl_env_configure_request_srv(aTHX_ r); } /* per-directory PerlSetEnv - only once per-request */ if (! MpReqPERL_SET_ENV_DIR(rcfg)) { modperl_env_configure_request_dir(aTHX_ r); } break; case MP_HANDLER_TYPE_PRE_CONNECTION: case MP_HANDLER_TYPE_CONNECTION: modperl_handler_make_args(aTHX_ &av_args, "Apache2::Connection", c, NULL); break; case MP_HANDLER_TYPE_FILES: modperl_handler_make_args(aTHX_ &av_args, "APR::Pool", pconf, "APR::Pool", plog, "APR::Pool", ptemp, "Apache2::ServerRec", s, NULL); break; case MP_HANDLER_TYPE_PROCESS: modperl_handler_make_args(aTHX_ &av_args, "APR::Pool", pconf, "Apache2::ServerRec", s, NULL); break; }; modperl_callback_current_callback_set(desc); MP_TRACE_h(MP_FUNC, "running %d %s handlers", av->nelts, desc); handlers = (modperl_handler_t **)av->elts; for (i=0; inelts; i++) { status = modperl_callback(aTHX_ handlers[i], p, r, s, av_args); MP_TRACE_h(MP_FUNC, "callback '%s' returned %d", modperl_handler_name(handlers[i]), status); /* follow Apache's lead and let OK terminate the phase for * MP_HOOK_RUN_FIRST handlers. MP_HOOK_RUN_ALL handlers keep * going on OK. MP_HOOK_VOID handlers ignore all errors. */ if (run_mode == MP_HOOK_RUN_ALL) { /* special case */ if (type == MP_HANDLER_TYPE_FILES && status != OK) { /* open_logs and post_config require OK return code or * the server aborts, so we need to log an error in * case the handler didn't fail but returned something * different from OK */ if (SvTRUE(ERRSV)) { status = modperl_errsv(aTHX_ status, r, s); } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "Callback '%s' returned %d, whereas " "Apache2::Const::OK (%d) is the only valid " "return value for %s handlers", modperl_handler_name(handlers[i]), status, OK, desc); } break; } /* the normal case: * OK and DECLINED continue * errors end the phase */ else if ((status != OK) && (status != DECLINED)) { status = modperl_errsv(aTHX_ status, r, s); #ifdef MP_TRACE if (i+1 != av->nelts) { MP_TRACE_h(MP_FUNC, "error status %d leaves %d " "uncalled %s handlers", status, av->nelts-i-1, desc); } #endif break; } } else if (run_mode == MP_HOOK_RUN_FIRST) { /* the exceptional case: * OK and errors end the phase * DECLINED continues */ if (status == OK) { #ifdef MP_TRACE if (i+1 != av->nelts) { MP_TRACE_h(MP_FUNC, "OK ends the %s stack, " "leaving %d uncalled %s handlers", desc, av->nelts-i-1, desc); } #endif break; } if (status != DECLINED) { status = modperl_errsv(aTHX_ status, r, s); #ifdef MP_TRACE if (i+1 != av->nelts) { MP_TRACE_h(MP_FUNC, "error status %d leaves %d " "uncalled %s handlers", status, av->nelts-i-1, desc); } #endif break; } } else { /* the rare case. * MP_HOOK_VOID handlers completely ignore the return status * Apache should handle whatever mod_perl returns, * so there is no need to mess with the status */ } /* it's possible that during the last callback a new handler * was pushed onto the same phase it's running from. av needs * to be updated. * * XXX: would be nice to somehow optimize that */ avp = modperl_handler_lookup_handlers(dcfg, scfg, rcfg, p, type, idx, FALSE, NULL); if (avp && (av = *avp)) { handlers = (modperl_handler_t **)av->elts; } } SvREFCNT_dec((SV*)av_args); MP_INTERP_PUTBACK(interp, aTHX); return status; } int modperl_callback_per_dir(int idx, request_rec *r, modperl_hook_run_mode_e run_mode) { return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_DIR, r, NULL, r->server, NULL, NULL, NULL, run_mode); } int modperl_callback_per_srv(int idx, request_rec *r, modperl_hook_run_mode_e run_mode) { return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PER_SRV, r, NULL, r->server, NULL, NULL, NULL, run_mode); } int modperl_callback_connection(int idx, conn_rec *c, modperl_hook_run_mode_e run_mode) { return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_CONNECTION, NULL, c, c->base_server, NULL, NULL, NULL, run_mode); } int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd, modperl_hook_run_mode_e run_mode) { return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PRE_CONNECTION, NULL, c, c->base_server, NULL, NULL, NULL, run_mode); } void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s, modperl_hook_run_mode_e run_mode) { modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_PROCESS, NULL, NULL, s, p, NULL, NULL, run_mode); } int modperl_callback_files(int idx, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s, modperl_hook_run_mode_e run_mode) { return modperl_callback_run_handlers(idx, MP_HANDLER_TYPE_FILES, NULL, NULL, s, pconf, plog, ptemp, run_mode); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_callback.h0000644000104000010010000000566312540623202022622 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_CALLBACK_H #define MODPERL_CALLBACK_H /* alias some hook names to match Perl*Handler names */ #define ap_hook_trans ap_hook_translate_name #define ap_hook_access ap_hook_access_checker #define ap_hook_authen ap_hook_check_user_id #define ap_hook_authz ap_hook_auth_checker #define ap_hook_type ap_hook_type_checker #define ap_hook_fixup ap_hook_fixups #define ap_hook_log ap_hook_log_transaction #define modperl_callback_current_callback_sv \ get_sv("Apache2::__CurrentCallback", TRUE) #define modperl_callback_current_callback_set(desc) \ sv_setpv(modperl_callback_current_callback_sv, desc) #define modperl_callback_current_callback_get() \ SvPVX(modperl_callback_current_callback_sv) int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p, request_rec *r, server_rec *s, AV *args); int modperl_callback_run_handlers(int idx, int type, request_rec *r, conn_rec *c, server_rec *s, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, modperl_hook_run_mode_e run_mode); int modperl_callback_per_dir(int idx, request_rec *r, modperl_hook_run_mode_e run_mode); int modperl_callback_per_srv(int idx, request_rec *r, modperl_hook_run_mode_e run_mode); int modperl_callback_connection(int idx, conn_rec *c, modperl_hook_run_mode_e run_mode); int modperl_callback_pre_connection(int idx, conn_rec *c, void *csd, modperl_hook_run_mode_e run_mode); void modperl_callback_process(int idx, apr_pool_t *p, server_rec *s, modperl_hook_run_mode_e run_mode); int modperl_callback_files(int idx, apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s, modperl_hook_run_mode_e run_mode); #endif /* MODPERL_CALLBACK_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_cgi.c0000644000104000010010000000640112540623202021612 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" MP_INLINE int modperl_cgi_header_parse(request_rec *r, char *buffer, apr_size_t *len, const char **body) { int status; int termarg; const char *location; const char *tmp; apr_size_t tlen, newln; if (!buffer) { return DECLINED; } /* ap_scan_script_header_err_strs won't handle correctly binary * data following the headers, e.g. when the terminating /\n\r?\n/ * is followed by \0\0 which is a part of the response * body. Therefore we need to separate the headers from the body * and not rely on ap_scan_script_header_err_strs to do that for * us. */ tmp = buffer; newln = 0; tlen = *len; while (tlen--) { /* that strange mix of CR and \n (and not LF) copied from * util_script.c:ap_scan_script_header_err_core */ if (*tmp != CR && *tmp != '\n') { newln = 0; } if (*tmp == '\n') { newln++; } tmp++; if (newln == 2) { break; } } if (tmp - buffer >= *len) { *body = NULL; /* no body along with headers */ *len = 0; } else { *body = tmp; *len = *len - (tmp - buffer); } status = ap_scan_script_header_err_strs(r, NULL, NULL, &termarg, buffer, NULL); /* code below from mod_cgi.c */ location = apr_table_get(r->headers_out, "Location"); if (location && (location[0] == '/') && (r->status == 200)) { r->method = apr_pstrdup(r->pool, "GET"); r->method_number = M_GET; /* We already read the message body (if any), so don't allow * the redirected request to think it has one. We can ignore * Transfer-Encoding, since we used REQUEST_CHUNKED_ERROR. */ apr_table_unset(r->headers_in, "Content-Length"); ap_internal_redirect_handler(location, r); return OK; } else if (location && (r->status == 200)) { MP_dRCFG; /* Note that if a script wants to produce its own Redirect * body, it now has to explicitly *say* "Status: 302" */ /* XXX: this is a hack. * filter return value doesn't seem to impact anything. */ rcfg->status = HTTP_MOVED_TEMPORARILY; return HTTP_MOVED_TEMPORARILY; } return status; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_cgi.h0000644000104000010010000000316212540623202021620 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_CGI_H #define MODPERL_CGI_H /** * split the HTTP headers from the body (if any) and feed them to * Apache. Populate the pointer to the remaining data in the buffer * (body if any or NULL) * * @param r request_rec * @param buffer a string with headers and potentially body * (could be non-null terminated) * @param len length of 'buffer' on entry * length of 'body' on return * @param body pointer to the body within the 'buffer' on return * NULL if the buffer contained only headers * * @return status */ MP_INLINE int modperl_cgi_header_parse(request_rec *r, char *buffer, apr_size_t *len, const char **body); #endif /* MODPERL_CGI_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_cmd.c0000644000104000010010000005606612540623202021627 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* This ensures that a given directive is either in Server context * or in a .htaccess file, usefull for things like PerlRequire */ #define MP_CHECK_SERVER_OR_HTACCESS_CONTEXT \ if (parms->path && (parms->override & ACCESS_CONF)) { \ ap_directive_t *d = parms->directive; \ return apr_psprintf(parms->pool, \ "%s directive not allowed in a %s> block", \ d->directive, \ d->parent->directive); \ } static char *modperl_cmd_unclosed_directive(cmd_parms *parms) { return apr_pstrcat(parms->pool, parms->cmd->name, "> directive missing closing '>'", NULL); } static char *modperl_cmd_too_late(cmd_parms *parms) { return apr_pstrcat(parms->pool, "mod_perl is already running, " "too late for ", parms->cmd->name, NULL); } char *modperl_cmd_push_handlers(MpAV **handlers, const char *name, apr_pool_t *p) { modperl_handler_t *h = modperl_handler_new(p, name); if (!*handlers) { *handlers = modperl_handler_array_new(p); MP_TRACE_d(MP_FUNC, "created handler stack"); } /* XXX parse_handler if Perl is running */ modperl_handler_array_push(*handlers, h); MP_TRACE_d(MP_FUNC, "pushed handler: %s", h->name); return NULL; } char *modperl_cmd_push_filter_handlers(MpAV **handlers, const char *name, apr_pool_t *p) { modperl_handler_t *h = modperl_handler_new(p, name); /* filter modules need to be autoloaded, because their attributes * need to be known long before the callback is issued */ if (*name == '-') { MP_TRACE_h(MP_FUNC, "warning: filter handler %s will be not autoloaded. " "Unless the module defining this handler is explicitly " "preloaded, filter attributes will be ignored."); } else { MpHandlerAUTOLOAD_On(h); MP_TRACE_h(MP_FUNC, "filter handler %s will be autoloaded (to make " "the filter attributes available)", h->name); } if (!*handlers) { *handlers = modperl_handler_array_new(p); MP_TRACE_d(MP_FUNC, "created handler stack"); } modperl_handler_array_push(*handlers, h); MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s", h->name); return NULL; } static char *modperl_cmd_push_httpd_filter_handlers(MpAV **handlers, const char *name, apr_pool_t *p) { modperl_handler_t *h = modperl_handler_new(p, name); /* this is not a real mod_perl handler, we just re-use the * handlers structure to be able to mix mod_perl and non-mod_perl * filters */ MpHandlerFAKE_On(h); h->attrs = MP_FILTER_HTTPD_HANDLER; if (!*handlers) { *handlers = modperl_handler_array_new(p); MP_TRACE_d(MP_FUNC, "created handler stack"); } modperl_handler_array_push(*handlers, h); MP_TRACE_d(MP_FUNC, "pushed httpd filter handler: %s", h->name); return NULL; } #define MP_CMD_SRV_TRACE \ MP_TRACE_d(MP_FUNC, "%s %s", parms->cmd->name, arg) #define MP_CMD_SRV_CHECK \ MP_CMD_SRV_TRACE; \ { \ const char *err = ap_check_cmd_context(parms, GLOBAL_ONLY); \ if (err) return err; \ } MP_CMD_SRV_DECLARE(trace) { MP_CMD_SRV_CHECK; modperl_trace_level_set_apache(parms->server, arg); return NULL; } /* this test shows whether the perl for the current s is running * (either base or vhost) */ static int modperl_vhost_is_running(server_rec *s) { #ifdef USE_ITHREADS if (s->is_virtual){ MP_dSCFG(s); return scfg->mip ? TRUE : FALSE; } #endif return modperl_is_running(); } MP_CMD_SRV_DECLARE(switches) { server_rec *s = parms->server; MP_dSCFG(s); if (modperl_vhost_is_running(s)) { return modperl_cmd_too_late(parms); } MP_TRACE_d(MP_FUNC, "arg = %s", arg); if (!strncasecmp(arg, "+inherit", 8)) { modperl_cmd_options(parms, mconfig, "+InheritSwitches"); } else { modperl_config_srv_argv_push(arg); } return NULL; } MP_CMD_SRV_DECLARE(modules) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; MP_PERL_CONTEXT_DECLARE; MP_CHECK_SERVER_OR_HTACCESS_CONTEXT; if (modperl_is_running() && modperl_init_vhost(parms->server, parms->pool, NULL) != OK) { return "init mod_perl vhost failed"; } if (modperl_is_running()) { char *error = NULL; MP_TRACE_d(MP_FUNC, "load PerlModule %s", arg); MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); if (!modperl_require_module(aTHX_ arg, FALSE)) { error = SvPVX(ERRSV); } else { modperl_env_sync_srv_env_hash2table(aTHX_ parms->pool, scfg); modperl_env_sync_dir_env_hash2table(aTHX_ parms->pool, dcfg); } MP_PERL_CONTEXT_RESTORE; return error; } else { MP_TRACE_d(MP_FUNC, "push PerlModule %s", arg); *(const char **)apr_array_push(scfg->PerlModule) = arg; return NULL; } } MP_CMD_SRV_DECLARE(requires) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; MP_PERL_CONTEXT_DECLARE; MP_CHECK_SERVER_OR_HTACCESS_CONTEXT; if (modperl_is_running() && modperl_init_vhost(parms->server, parms->pool, NULL) != OK) { return "init mod_perl vhost failed"; } if (modperl_is_running()) { char *error = NULL; MP_TRACE_d(MP_FUNC, "load PerlRequire %s", arg); MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); if (!modperl_require_file(aTHX_ arg, FALSE)) { error = SvPVX(ERRSV); } else { modperl_env_sync_srv_env_hash2table(aTHX_ parms->pool, scfg); modperl_env_sync_dir_env_hash2table(aTHX_ parms->pool, dcfg); } MP_PERL_CONTEXT_RESTORE; return error; } else { MP_TRACE_d(MP_FUNC, "push PerlRequire %s", arg); *(const char **)apr_array_push(scfg->PerlRequire) = arg; return NULL; } } MP_CMD_SRV_DECLARE(config_requires) { /* we must init earlier than normal */ modperl_run(); /* PerlConfigFile is only different from PerlRequires by forcing * an immediate init. */ return modperl_cmd_requires(parms, mconfig, arg); } MP_CMD_SRV_DECLARE(post_config_requires) { apr_pool_t *p = parms->temp_pool; modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; MP_dSCFG(parms->server); modperl_require_file_t *require = apr_pcalloc(p, sizeof(*require)); MP_TRACE_d(MP_FUNC, "push PerlPostConfigRequire for %s", arg); require->file = arg; require->dcfg = dcfg; *(modperl_require_file_t **) apr_array_push(scfg->PerlPostConfigRequire) = require; return NULL; } static void modperl_cmd_addvar_func(apr_table_t *configvars, apr_table_t *setvars, const char *key, const char *val) { apr_table_addn(configvars, key, val); } /* Conceptually, setvar is { unsetvar; addvar; } */ static void modperl_cmd_setvar_func(apr_table_t *configvars, apr_table_t *setvars, const char * key, const char *val) { apr_table_setn(setvars, key, val); apr_table_setn(configvars, key, val); } static const char *modperl_cmd_modvar(modperl_var_modify_t varfunc, cmd_parms *parms, modperl_config_dir_t *dcfg, const char *arg1, const char *arg2) { varfunc(dcfg->configvars, dcfg->setvars, arg1, arg2); MP_TRACE_d(MP_FUNC, "%s DIR: arg1 = %s, arg2 = %s", parms->cmd->name, arg1, arg2); /* make available via Apache2->server->dir_config */ if (!parms->path) { MP_dSCFG(parms->server); varfunc(scfg->configvars, scfg->setvars, arg1, arg2); MP_TRACE_d(MP_FUNC, "%s SRV: arg1 = %s, arg2 = %s", parms->cmd->name, arg1, arg2); } return NULL; } MP_CMD_SRV_DECLARE2(add_var) { modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; return modperl_cmd_modvar(modperl_cmd_addvar_func, parms, dcfg, arg1, arg2); } MP_CMD_SRV_DECLARE2(set_var) { modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; return modperl_cmd_modvar(modperl_cmd_setvar_func, parms, dcfg, arg1, arg2); } MP_CMD_SRV_DECLARE2(set_env) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; #ifdef ENV_IS_CASELESS /* i.e. WIN32 */ /* we turn off env magic during hv_store later, so do this now, * else lookups on keys with lowercase characters will fails * because Perl will uppercase them prior to lookup. */ modperl_str_toupper((char *)arg1); #endif MP_TRACE_d(MP_FUNC, "arg1 = %s, arg2 = %s", arg1, arg2); if (!parms->path) { /* will be propagated to environ */ apr_table_setn(scfg->SetEnv, arg1, arg2); /* sync SetEnv => %ENV only for the top-level values */ if (modperl_vhost_is_running(parms->server)) { MP_PERL_CONTEXT_DECLARE; MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); modperl_env_hv_store(aTHX_ arg1, arg2); MP_PERL_CONTEXT_RESTORE; } } apr_table_setn(dcfg->SetEnv, arg1, arg2); return NULL; } MP_CMD_SRV_DECLARE(pass_env) { MP_dSCFG(parms->server); char *val = getenv(arg); #ifdef ENV_IS_CASELESS /* i.e. WIN32 */ /* we turn off env magic during hv_store later, so do this now, * else lookups on keys with lowercase characters will fails * because Perl will uppercase them prior to lookup. */ modperl_str_toupper((char *)arg); #endif if (val) { apr_table_setn(scfg->PassEnv, arg, apr_pstrdup(parms->pool, val)); if (modperl_vhost_is_running(parms->server)) { MP_PERL_CONTEXT_DECLARE; MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); modperl_env_hv_store(aTHX_ arg, val); MP_PERL_CONTEXT_RESTORE; } MP_TRACE_d(MP_FUNC, "arg = %s, val = %s", arg, val); } else { MP_TRACE_d(MP_FUNC, "arg = %s: not found via getenv()", arg); } return NULL; } MP_CMD_SRV_DECLARE(options) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; int is_per_dir = parms->path ? 1 : 0; modperl_options_t *opts = is_per_dir ? dcfg->flags : scfg->flags; apr_pool_t *p = parms->temp_pool; const char *error; MP_TRACE_d(MP_FUNC, "arg = %s", arg); if ((error = modperl_options_set(p, opts, arg)) && !is_per_dir) { /* maybe a per-directory option outside of a container */ if (modperl_options_set(p, dcfg->flags, arg) == NULL) { error = NULL; } } if (error) { return error; } return NULL; } MP_CMD_SRV_DECLARE(init_handlers) { if (parms->path) { return modperl_cmd_header_parser_handlers(parms, mconfig, arg); } return modperl_cmd_post_read_request_handlers(parms, mconfig, arg); } #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) MP_CMD_SRV_DECLARE2(authz_provider) { apr_pool_t *p = parms->pool; char *name = apr_pstrdup(p, arg1); char *cb = apr_pstrdup(p, arg2); modperl_register_auth_provider_name(p, AUTHZ_PROVIDER_GROUP, name, AUTHZ_PROVIDER_VERSION, cb, NULL, AP_AUTH_INTERNAL_PER_CONF); return NULL; } MP_CMD_SRV_DECLARE2(authn_provider) { apr_pool_t *p = parms->pool; char *name = apr_pstrdup(p, arg1); char *cb = apr_pstrdup(p, arg2); modperl_register_auth_provider_name(p, AUTHN_PROVIDER_GROUP, name, AUTHN_PROVIDER_VERSION, cb, NULL, AP_AUTH_INTERNAL_PER_CONF); return NULL; } #endif static const char *modperl_cmd_parse_args(apr_pool_t *p, const char *args, apr_table_t **t) { const char *orig_args = args; char *pair, *key, *val; *t = apr_table_make(p, 2); while (*(pair = ap_getword(p, &args, ',')) != '\0') { key = ap_getword_nc(p, &pair, '='); val = pair; if (!(*key && *val)) { return apr_pstrcat(p, "invalid args spec: ", orig_args, NULL); } apr_table_set(*t, key, val); } return NULL; } MP_CMD_SRV_DECLARE(perl) { apr_pool_t *p = parms->pool; const char *endp = ap_strrchr_c(arg, '>'); const char *errmsg; char *code = ""; char line[MAX_STRING_LEN]; apr_table_t *args; ap_directive_t **current = mconfig; int line_num; if (!endp) { return modperl_cmd_unclosed_directive(parms); } MP_CHECK_SERVER_OR_HTACCESS_CONTEXT; arg = apr_pstrndup(p, arg, endp - arg); if ((errmsg = modperl_cmd_parse_args(p, arg, &args))) { return errmsg; } line_num = parms->config_file->line_number+1; while (!ap_cfg_getline(line, sizeof(line), parms->config_file)) { /*XXX: Not sure how robust this is */ if (strEQ(line, "")) { break; } /*XXX: Less than optimal */ code = apr_pstrcat(p, code, line, "\n", NULL); } /* Here, we have to replace our current config node for the next pass */ if (!*current) { *current = apr_pcalloc(p, sizeof(**current)); } (*current)->filename = parms->config_file->name; (*current)->line_num = line_num; (*current)->directive = apr_pstrdup(p, "Perl"); (*current)->args = code; (*current)->data = args; return NULL; } #define MP_DEFAULT_PERLSECTION_HANDLER "Apache2::PerlSections" #define MP_DEFAULT_PERLSECTION_PACKAGE "Apache2::ReadConfig" #define MP_PERLSECTIONS_SAVECONFIG_SV \ get_sv("Apache2::PerlSections::Save", FALSE) #define MP_PERLSECTIONS_SERVER_SV \ get_sv("Apache2::PerlSections::Server", TRUE) MP_CMD_SRV_DECLARE(perldo) { apr_pool_t *p = parms->pool; server_rec *s = parms->server; modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; apr_table_t *options; modperl_handler_t *handler = NULL; const char *pkg_name = NULL; ap_directive_t *directive = parms->directive; MP_dSCFG(s); MP_PERL_CONTEXT_DECLARE; if (!(arg && *arg)) { return NULL; } MP_CHECK_SERVER_OR_HTACCESS_CONTEXT; /* we must init earlier than normal */ modperl_run(); if (modperl_init_vhost(s, p, NULL) != OK) { return "init mod_perl vhost failed"; } MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); /* data will be set by a section */ if ((options = directive->data)) { const char *pkg_namespace; const char *pkg_base; const char *handler_name; const char *line_header; if (!(handler_name = apr_table_get(options, "handler"))) { handler_name = apr_pstrdup(p, MP_DEFAULT_PERLSECTION_HANDLER); apr_table_set(options, "handler", handler_name); } handler = modperl_handler_new(p, handler_name); if (!(pkg_base = apr_table_get(options, "package"))) { pkg_base = apr_pstrdup(p, MP_DEFAULT_PERLSECTION_PACKAGE); } pkg_namespace = modperl_file2package(p, directive->filename); pkg_name = apr_psprintf(p, "%s::%s::line_%d", pkg_base, pkg_namespace, directive->line_num); apr_table_set(options, "package", pkg_name); line_header = apr_psprintf(p, "\n#line %d %s\n", directive->line_num, directive->filename); /* put the code about to be executed in the configured package */ arg = apr_pstrcat(p, "package ", pkg_name, ";", line_header, arg, NULL); } #ifdef USE_ITHREADS MP_TRACE_i(MP_FUNC, "using interp %lx to execute perl section:\n%s", scfg->mip->parent, arg); #endif { SV *server = MP_PERLSECTIONS_SERVER_SV; SV *code = newSVpv(arg, 0); GV *gv = gv_fetchpv("0", TRUE, SVt_PV); ENTER;SAVETMPS; save_scalar(gv); /* local $0 */ #if MP_PERL_VERSION_AT_LEAST(5, 9, 0) TAINT_NOT; /* XXX: temp workaround, see my p5p post */ #endif sv_setref_pv(server, "Apache2::ServerRec", (void*)s); sv_setpv_mg(GvSV(gv), directive->filename); eval_sv(code, G_SCALAR|G_KEEPERR); SvREFCNT_dec(code); modperl_env_sync_srv_env_hash2table(aTHX_ p, scfg); modperl_env_sync_dir_env_hash2table(aTHX_ p, dcfg); FREETMPS;LEAVE; } if (SvTRUE(ERRSV)) { MP_PERL_CONTEXT_RESTORE; return SvPVX(ERRSV); } if (handler) { int status; SV *saveconfig = MP_PERLSECTIONS_SAVECONFIG_SV; AV *args = (AV *)NULL; modperl_handler_make_args(aTHX_ &args, "Apache2::CmdParms", parms, "APR::Table", options, NULL); status = modperl_callback(aTHX_ handler, p, NULL, s, args); SvREFCNT_dec((SV*)args); if (!(saveconfig && SvTRUE(saveconfig))) { modperl_package_unload(aTHX_ pkg_name); } if (status != OK) { char *error = SvTRUE(ERRSV) ? SvPVX(ERRSV) : apr_psprintf(p, " handler %s failed with status=%d", handler->name, status); MP_PERL_CONTEXT_RESTORE; return error; } } MP_PERL_CONTEXT_RESTORE; return NULL; } #define MP_POD_FORMAT(s) \ (ap_strstr_c(s, "httpd") || ap_strstr_c(s, "apache")) MP_CMD_SRV_DECLARE(pod) { char line[MAX_STRING_LEN]; if (arg && *arg && !(MP_POD_FORMAT(arg) || strstr("pod", arg))) { return "Unknown =back format"; } while (!ap_cfg_getline(line, sizeof(line), parms->config_file)) { if (strEQ(line, "=cut")) { break; } if (strnEQ(line, "=over", 5) && MP_POD_FORMAT(line)) { break; } } return NULL; } MP_CMD_SRV_DECLARE(pod_cut) { return "=cut without =pod"; } MP_CMD_SRV_DECLARE(END) { char line[MAX_STRING_LEN]; while (!ap_cfg_getline(line, sizeof(line), parms->config_file)) { /* soak up rest of the file */ } return NULL; } /* * XXX: the name of this directive may or may not stay. * need a way to note that a module has config directives. * don't want to start mod_perl when we see a non-special PerlModule. */ MP_CMD_SRV_DECLARE(load_module) { const char *errmsg; MP_TRACE_d(MP_FUNC, "PerlLoadModule %s", arg); /* we must init earlier than normal */ modperl_run(); if ((errmsg = modperl_cmd_modules(parms, mconfig, arg))) { return errmsg; } return NULL; } /* propogate filters insertion ala SetInputFilter */ MP_CMD_SRV_DECLARE(set_input_filter) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; char *filter; if (!MpSrvENABLE(scfg)) { return apr_pstrcat(parms->pool, "Perl is disabled for server ", parms->server->server_hostname, NULL); } if (!MpSrvINPUT_FILTER(scfg)) { return apr_pstrcat(parms->pool, "PerlSetInputFilter is disabled for server ", parms->server->server_hostname, NULL); } while (*arg && (filter = ap_getword(parms->pool, &arg, ';'))) { modperl_cmd_push_httpd_filter_handlers( &(dcfg->handlers_per_dir[MP_INPUT_FILTER_HANDLER]), filter, parms->pool); } return NULL; } /* propogate filters insertion ala SetOutputFilter */ MP_CMD_SRV_DECLARE(set_output_filter) { MP_dSCFG(parms->server); modperl_config_dir_t *dcfg = (modperl_config_dir_t *)mconfig; char *filter; if (!MpSrvENABLE(scfg)) { return apr_pstrcat(parms->pool, "Perl is disabled for server ", parms->server->server_hostname, NULL); } if (!MpSrvINPUT_FILTER(scfg)) { return apr_pstrcat(parms->pool, "PerlSetOutputFilter is disabled for server ", parms->server->server_hostname, NULL); } while (*arg && (filter = ap_getword(parms->pool, &arg, ';'))) { modperl_cmd_push_httpd_filter_handlers( &(dcfg->handlers_per_dir[MP_OUTPUT_FILTER_HANDLER]), filter, parms->pool); } return NULL; } #ifdef MP_COMPAT_1X MP_CMD_SRV_DECLARE_FLAG(taint_check) { if (flag_on) { return modperl_cmd_switches(parms, mconfig, "-T"); } return NULL; } MP_CMD_SRV_DECLARE_FLAG(warn) { if (flag_on) { return modperl_cmd_switches(parms, mconfig, "-w"); } return NULL; } MP_CMD_SRV_DECLARE_FLAG(send_header) { char *arg = flag_on ? "+ParseHeaders" : "-ParseHeaders"; return modperl_cmd_options(parms, mconfig, arg); } MP_CMD_SRV_DECLARE_FLAG(setup_env) { char *arg = flag_on ? "+SetupEnv" : "-SetupEnv"; return modperl_cmd_options(parms, mconfig, arg); } #endif /* MP_COMPAT_1X */ #ifdef USE_ITHREADS #define MP_CMD_INTERP_POOL_IMP(xitem) \ const char *modperl_cmd_interp_##xitem(cmd_parms *parms, \ void *mconfig, const char *arg) \ { \ MP_dSCFG(parms->server); \ int item = atoi(arg); \ scfg->interp_pool_cfg->xitem = item; \ MP_TRACE_d(MP_FUNC, "%s %d", parms->cmd->name, item); \ return NULL; \ } MP_CMD_INTERP_POOL_IMP(start); MP_CMD_INTERP_POOL_IMP(max); MP_CMD_INTERP_POOL_IMP(max_spare); MP_CMD_INTERP_POOL_IMP(min_spare); MP_CMD_INTERP_POOL_IMP(max_requests); #endif /* USE_ITHREADS */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_cmd.h0000644000104000010010000001164512540623202021626 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_CMD_H #define MODPERL_CMD_H char *modperl_cmd_push_handlers(MpAV **handlers, const char *name, apr_pool_t *p); char *modperl_cmd_push_filter_handlers(MpAV **handlers, const char *name, apr_pool_t *p); #define MP_CMD_SRV_DECLARE(item) \ const char *modperl_cmd_##item(cmd_parms *parms, void *mconfig, \ const char *arg) #define MP_CMD_SRV_DECLARE2(item) \ const char *modperl_cmd_##item(cmd_parms *parms, void *mconfig, \ const char *arg1, const char *arg2) #define MP_CMD_SRV_DECLARE_FLAG(item) \ const char *modperl_cmd_##item(cmd_parms *parms, \ void *mconfig, int flag_on) MP_CMD_SRV_DECLARE(trace); MP_CMD_SRV_DECLARE(switches); MP_CMD_SRV_DECLARE(modules); MP_CMD_SRV_DECLARE(requires); MP_CMD_SRV_DECLARE(config_requires); MP_CMD_SRV_DECLARE(post_config_requires); #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) MP_CMD_SRV_DECLARE2(authz_provider); MP_CMD_SRV_DECLARE2(authn_provider); #endif MP_CMD_SRV_DECLARE2(set_var); MP_CMD_SRV_DECLARE2(add_var); MP_CMD_SRV_DECLARE2(set_env); MP_CMD_SRV_DECLARE(pass_env); MP_CMD_SRV_DECLARE(options); MP_CMD_SRV_DECLARE(init_handlers); MP_CMD_SRV_DECLARE(perl); MP_CMD_SRV_DECLARE(perldo); MP_CMD_SRV_DECLARE(pod); MP_CMD_SRV_DECLARE(pod_cut); MP_CMD_SRV_DECLARE(END); MP_CMD_SRV_DECLARE(load_module); MP_CMD_SRV_DECLARE(set_input_filter); MP_CMD_SRV_DECLARE(set_output_filter); #ifdef MP_COMPAT_1X MP_CMD_SRV_DECLARE_FLAG(taint_check); MP_CMD_SRV_DECLARE_FLAG(warn); MP_CMD_SRV_DECLARE_FLAG(send_header); MP_CMD_SRV_DECLARE_FLAG(setup_env); #endif /* MP_COMPAT_1X */ #ifdef USE_ITHREADS MP_CMD_SRV_DECLARE(interp_start); MP_CMD_SRV_DECLARE(interp_max); MP_CMD_SRV_DECLARE(interp_max_spare); MP_CMD_SRV_DECLARE(interp_min_spare); MP_CMD_SRV_DECLARE(interp_max_requests); #endif /* USE_ITHREADS */ #define MP_CMD_SRV_RAW_ARGS(name, item, desc) \ AP_INIT_RAW_ARGS( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_SRV_RAW_ARGS_ON_READ(name, item, desc) \ AP_INIT_RAW_ARGS( name, modperl_cmd_##item, NULL, \ RSRC_CONF|EXEC_ON_READ, desc ) #define MP_CMD_SRV_FLAG(name, item, desc) \ AP_INIT_FLAG( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_SRV_TAKE1(name, item, desc) \ AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_SRV_TAKE2(name, item, desc) \ AP_INIT_TAKE2( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_SRV_ITERATE(name, item, desc) \ AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_SRV_ITERATE_ON_READ(name, item, desc) \ AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \ RSRC_CONF|EXEC_ON_READ, desc ) #define MP_CMD_SRV_ITERATE2(name, item, desc) \ AP_INIT_ITERATE2( name, modperl_cmd_##item, NULL, \ RSRC_CONF, desc ) #define MP_CMD_DIR_TAKE1(name, item, desc) \ AP_INIT_TAKE1( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_TAKE2(name, item, desc) \ AP_INIT_TAKE2( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_ITERATE(name, item, desc) \ AP_INIT_ITERATE( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_ITERATE2(name, item, desc) \ AP_INIT_ITERATE2( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_FLAG(name, item, desc) \ AP_INIT_FLAG( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_RAW_ARGS(name, item, desc) \ AP_INIT_RAW_ARGS( name, modperl_cmd_##item, NULL, \ OR_ALL, desc ) #define MP_CMD_DIR_RAW_ARGS_ON_READ(name, item, desc) \ AP_INIT_RAW_ARGS( name, modperl_cmd_##item, NULL, \ OR_ALL|EXEC_ON_READ, desc ) #endif /* MODPERL_CMD_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_debug.c0000644000104000010010000000176312540623202023514 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This file must not contain any symbols from apache/mod_perl * (apr and perl are OK) */ #include "modperl_common_includes.h" /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_debug.h0000644000104000010010000000172612540623202023520 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_COMMON_DEBUG_H #define MODPERL_COMMON_DEBUG_H #endif /* MODPERL_COMMON_DEBUG_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_includes.h0000644000104000010010000000224212540623202024232 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_COMMON_INCLUDES_H #define MODPERL_COMMON_INCLUDES_H /* header files which are independet of Apache/mod_perl */ #include "modperl_apr_includes.h" #include "modperl_apr_compat.h" #include "modperl_perl_includes.h" #include "modperl_common_types.h" #endif /* MODPERL_COMMON_INCLUDES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_log.c0000644000104000010010000000711112540623202023200 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_common_includes.h" #include "modperl_common_log.h" #include "modperl_debug.h" #undef getenv /* from XSUB.h */ static apr_file_t *logfile = NULL; #ifdef WIN32 static unsigned long debug_level = 0; #else unsigned long MP_debug_level = 0; #define debug_level MP_debug_level #endif unsigned long modperl_debug_level(void) { return debug_level; } void modperl_trace_logfile_set(apr_file_t *logfile_new) { logfile = logfile_new; } void modperl_trace(const char *func, const char *fmt, ...) { char vstr[8192]; apr_size_t vstr_len = 0; va_list args; if (!logfile) { return; } /* for more information on formatting codes see http://apr.apache.org/docs/apr/1.4/group__apr__lib.html#gad2cd3594aeaafd45931d1034965f48c1 */ #ifndef MP_IN_XS /* PERL_GET_CONTEXT yields nonsense until the first interpreter is * created. Hence the modperl_is_running() question. */ if (modperl_threaded_mpm()) { if (modperl_threads_started()) { apr_os_thread_t tid = apr_os_thread_current(); apr_file_printf(logfile, "[pid=%lu, tid=%pt, perl=%pp] ", (unsigned long)getpid(), &tid, modperl_is_running() ? PERL_GET_CONTEXT : NULL); } else { apr_file_printf(logfile, "[pid=%lu, perl=%pp] ", (unsigned long)getpid(), modperl_is_running() ? PERL_GET_CONTEXT : NULL); } } else { #ifdef USE_ITHREADS apr_file_printf(logfile, "[pid=%lu, perl=%pp] ", (unsigned long)getpid(), modperl_is_running() ? PERL_GET_CONTEXT : NULL); #else apr_file_printf(logfile, "[pid=%lu] ", (unsigned long)getpid()); #endif } #endif if (func && *func) { apr_file_printf(logfile, "%s: ", func); } va_start(args, fmt); vstr_len = apr_vsnprintf(vstr, sizeof(vstr), fmt, args); va_end(args); apr_file_write(logfile, vstr, &vstr_len); apr_file_printf(logfile, "\n"); } void modperl_trace_level_set(apr_file_t *logfile, const char *level) { if (!level) { if (!(level = getenv("MOD_PERL_TRACE"))) { return; } } debug_level = 0x0; if (strcasecmp(level, "all") == 0) { debug_level = 0xffffffff; } else if (apr_isalpha(level[0])) { static char debopts[] = MP_TRACE_OPTS; char *d; for (; *level && (d = strchr(debopts, *level)); level++) { debug_level |= 1 << (d - debopts); } } else { debug_level = atoi(level); } debug_level |= 0x80000000; modperl_trace_logfile_set(logfile); MP_TRACE_any_do(MP_TRACE_dump_flags()); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_log.h0000644000104000010010000000351712540623202023213 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_COMMON_LOG_H #define MODPERL_COMMON_LOG_H #define MP_STRINGIFY(n) MP_STRINGIFY_HELPER(n) #define MP_STRINGIFY_HELPER(n) #n # if defined(__GNUC__) # if (__GNUC__ > 2) # define MP_FUNC __func__ # else # define MP_FUNC __FUNCTION__ # endif # else # define MP_FUNC __FILE__ ":" MP_STRINGIFY(__LINE__) # endif #include "modperl_apr_includes.h" #include "apr_lib.h" #include "modperl_trace.h" #ifdef _PTHREAD_H #define modperl_thread_self() pthread_self() #else #define modperl_thread_self() 0 #endif #define MP_TIDF \ (unsigned long)modperl_thread_self() void modperl_trace_logfile_set(apr_file_t *logfile_new); unsigned long modperl_debug_level(void); #ifdef WIN32 #define MP_debug_level modperl_debug_level() #else extern unsigned long MP_debug_level; #endif void modperl_trace(const char *func, const char *fmt, ...); void modperl_trace_level_set(apr_file_t *logfile, const char *level); #endif /* MODPERL_COMMON_LOG_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_types.h0000644000104000010010000000212012540623202023563 0ustar AdministratorsNone /* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_COMMON_TYPES_H #define MODPERL_COMMON_TYPES_H /* subclass apr_uri_t */ typedef struct { apr_uri_t uri; apr_pool_t *pool; char *path_info; } modperl_uri_t; #endif /* MODPERL_COMMON_TYPES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_util.c0000644000104000010010000001217412540623202023401 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This file must not contain any symbols from apache/mod_perl (apr * and perl are OK). Also try to keep all the mod_perl specific * functions (even if they don't contain symbols from apache/mod_perl * on in modperl_util.c, unless we want them elsewhere. That is * needed in order to keep the libraries used outside mod_perl * small */ #include "modperl_common_util.h" /* Prefetch magic requires perl 5.8 */ #if MP_PERL_VERSION_AT_LEAST(5, 8, 0) /* A custom MGVTBL with mg_copy slot filled in allows us to FETCH a * table entry immediately during iteration. For multivalued keys * this is essential in order to get the value corresponding to the * current key, otherwise values() will always report the first value * repeatedly. With this MGVTBL the keys() list always matches up * with the values() list, even in the multivalued case. We only * prefetch the value during iteration, because the prefetch adds * overhead (an unnecessary FETCH call) to EXISTS and STORE * operations. This way they are only "penalized" when the perl * program is iterating via each(), which seems to be a reasonable * tradeoff. */ MP_INLINE static int modperl_table_magic_copy(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, int namelen) { /* prefetch the value whenever we're iterating over the keys */ MAGIC *tie_magic = mg_find(nsv, PERL_MAGIC_tiedelem); SV *obj = SvRV(tie_magic->mg_obj); if (SvCUR(obj)) { SvGETMAGIC(nsv); } return 0; } static const MGVTBL modperl_table_magic_prefetch = {0, 0, 0, 0, 0, modperl_table_magic_copy}; #endif /* End of prefetch magic */ MP_INLINE SV *modperl_hash_tie(pTHX_ const char *classname, SV *tsv, void *p) { SV *hv = (SV*)newHV(); SV *rsv = sv_newmortal(); sv_setref_pv(rsv, classname, p); /* Prefetch magic requires perl 5.8 */ #if MP_PERL_VERSION_AT_LEAST(5, 8, 0) sv_magicext(hv, NULL, PERL_MAGIC_ext, NULL, (char *)NULL, -1); SvMAGIC(hv)->mg_virtual = (MGVTBL *)&modperl_table_magic_prefetch; SvMAGIC(hv)->mg_flags |= MGf_COPY; #endif /* End of prefetch magic */ sv_magic(hv, rsv, PERL_MAGIC_tied, (char *)NULL, 0); return SvREFCNT_inc(sv_bless(sv_2mortal(newRV_noinc(hv)), gv_stashpv(classname, TRUE))); } MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_ const char *classname, SV *tsv) { if (sv_derived_from(tsv, classname)) { if (SVt_PVHV == SvTYPE(SvRV(tsv))) { SV *hv = SvRV(tsv); MAGIC *mg; if (SvMAGICAL(hv)) { if ((mg = mg_find(hv, PERL_MAGIC_tied))) { return mg->mg_obj; } else { Perl_warn(aTHX_ "Not a tied hash: (magic=%c)", mg->mg_type); } } else { Perl_warn(aTHX_ "SV is not tied"); } } else { return tsv; } } else { Perl_croak(aTHX_ "argument is not a blessed reference " "(expecting an %s derived object)", classname); } return &PL_sv_undef; } MP_INLINE void *modperl_hash_tied_object(pTHX_ const char *classname, SV *tsv) { SV *rv = modperl_hash_tied_object_rv(aTHX_ classname, tsv); if (SvROK(rv)) { return INT2PTR(void *, SvIVX(SvRV(rv))); } else { return NULL; } } /* same as Symbol::gensym() */ SV *modperl_perl_gensym(pTHX_ char *pack) { GV *gv = newGVgen(pack); SV *rv = newRV((SV*)gv); (void)hv_delete(gv_stashpv(pack, TRUE), GvNAME(gv), GvNAMELEN(gv), G_DISCARD); return rv; } /* XXX: sv_setref_uv does not exist in 5.6.x */ MP_INLINE SV *modperl_perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv) { sv_setuv(newSVrv(rv, classname), uv); return rv; } MP_INLINE modperl_uri_t *modperl_uri_new(apr_pool_t *p) { modperl_uri_t *uri = (modperl_uri_t *)apr_pcalloc(p, sizeof(*uri)); uri->pool = p; return uri; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_common_util.h0000644000104000010010000000700712540623202023405 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_common_includes.h" #ifndef MODPERL_COMMON_UTIL_H #define MODPERL_COMMON_UTIL_H #ifdef MP_DEBUG #define MP_INLINE #else #define MP_INLINE APR_INLINE #endif #ifdef CYGWIN #define MP_STATIC #else #define MP_STATIC static #endif #ifdef WIN32 # define MP_FUNC_T(name) (_stdcall *name) # define MP_FUNC_NONSTD_T(name) (*name) /* XXX: not all functions get inlined * so its unclear what to and not to include in the .def files */ # undef MP_INLINE # define MP_INLINE #else # define MP_FUNC_T(name) (*name) # define MP_FUNC_NONSTD_T(name) (*name) #endif #define MP_SSTRLEN(string) (sizeof(string)-1) #ifndef strcaseEQ # define strcaseEQ(s1,s2) (!strcasecmp(s1,s2)) #endif #ifndef strncaseEQ # define strncaseEQ(s1,s2,l) (!strncasecmp(s1,s2,l)) #endif #ifndef SvCLASS #define SvCLASS(o) HvNAME(SvSTASH(SvRV(o))) #endif #define SvObjIV(o) SvIV((SV*)SvRV(o)) #define MgObjIV(m) SvIV((SV*)SvRV(m->mg_obj)) #define MP_SvGROW(sv, len) \ (void)SvUPGRADE(sv, SVt_PV); \ SvGROW(sv, len+1) #define MP_SvCUR_set(sv, len) \ SvCUR_set(sv, len); \ *SvEND(sv) = '\0'; \ SvPOK_only(sv) #define MP_magical_untie(sv, mg_flags) \ mg_flags = SvMAGICAL((SV*)sv); \ SvMAGICAL_off((SV*)sv) #define MP_magical_tie(sv, mg_flags) \ SvFLAGS((SV*)sv) |= mg_flags /* some wrapper macros to detect perl versions * and prevent code clutter */ #define MP_PERL_VERSION_AT_LEAST(r, v, s) \ (PERL_REVISION == r && \ ((PERL_VERSION == v && PERL_SUBVERSION > s-1) || PERL_VERSION > v)) #define MP_PERL_VERSION_AT_MOST(r, v, s) \ (PERL_REVISION == r && \ (PERL_VERSION < v || (PERL_VERSION == v && PERL_SUBVERSION < s+1))) #define MP_PERL_VERSION(r, v, s) \ (PERL_REVISION == r && PERL_VERSION == v && PERL_SUBVERSION == s) /* tie %hash */ MP_INLINE SV *modperl_hash_tie(pTHX_ const char *classname, SV *tsv, void *p); /* tied %hash */ MP_INLINE SV *modperl_hash_tied_object_rv(pTHX_ const char *classname, SV *tsv); /* tied %hash */ MP_INLINE void *modperl_hash_tied_object(pTHX_ const char *classname, SV *tsv); MP_INLINE SV *modperl_perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv); MP_INLINE modperl_uri_t *modperl_uri_new(apr_pool_t *p); SV *modperl_perl_gensym(pTHX_ char *pack); #endif /* MODPERL_COMMON_UTIL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_config.c0000644000104000010010000004713712540623202022330 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" void *modperl_config_dir_create(apr_pool_t *p, char *dir) { modperl_config_dir_t *dcfg = modperl_config_dir_new(p); dcfg->location = dir; MP_TRACE_d(MP_FUNC, "dir %s", dir); return dcfg; } #define merge_item(item) \ mrg->item = add->item ? add->item : base->item static apr_table_t *modperl_table_overlap(apr_pool_t *p, apr_table_t *base, apr_table_t *add) { /* take the base (parent) values, and override with add (child) values, * generating a new table. entries in add but not in base will be * added to the new table. all using core apr table routines. * * note that this is equivalent to apr_table_overlap except a new * table is generated, which is required (otherwise we would clobber * the existing parent or child configurations) * * note that this is *not* equivalent to apr_table_overlap, although * I think it should be, because apr_table_overlap seems to clear * its first argument when the tables have different pools. I think * this is wrong -- rici */ apr_table_t *merge = apr_table_overlay(p, base, add); /* compress will squash each key to the last value in the table. this * is acceptable for all tables that expect only a single value per key * such as PerlPassEnv and PerlSetEnv. PerlSetVar/PerlAddVar get their * own, non-standard, merge routines in merge_table_config_vars. */ apr_table_compress(merge, APR_OVERLAP_TABLES_SET); return merge; } #define merge_table_overlap_item(item) \ mrg->item = modperl_table_overlap(p, base->item, add->item) static apr_table_t *merge_config_add_vars(apr_pool_t *p, const apr_table_t *base, const apr_table_t *unset, const apr_table_t *add) { apr_table_t *temp = apr_table_copy(p, base); const apr_array_header_t *arr; apr_table_entry_t *entries; int i; /* for each key in unset do apr_table_unset(temp, key); */ arr = apr_table_elts(unset); entries = (apr_table_entry_t *)arr->elts; /* hopefully this is faster than using apr_table_do */ for (i = 0; i < arr->nelts; i++) { if (entries[i].key) { apr_table_unset(temp, entries[i].key); } } return apr_table_overlay(p, temp, add); } #define merge_handlers(merge_flag, array) \ if (merge_flag(mrg)) { \ mrg->array = modperl_handler_array_merge(p, \ base->array, \ add->array); \ } \ else { \ merge_item(array); \ } void *modperl_config_dir_merge(apr_pool_t *p, void *basev, void *addv) { int i; modperl_config_dir_t *base = (modperl_config_dir_t *)basev, *add = (modperl_config_dir_t *)addv, *mrg = modperl_config_dir_new(p); MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx", (unsigned long)basev, (unsigned long)addv, (unsigned long)mrg); mrg->flags = modperl_options_merge(p, base->flags, add->flags); merge_item(location); merge_table_overlap_item(SetEnv); /* this is where we merge PerlSetVar and PerlAddVar together */ mrg->configvars = merge_config_add_vars(p, base->configvars, add->setvars, add->configvars); merge_table_overlap_item(setvars); /* XXX: check if Perl*Handler is disabled */ for (i=0; i < MP_HANDLER_NUM_PER_DIR; i++) { merge_handlers(MpDirMERGE_HANDLERS, handlers_per_dir[i]); } return mrg; } modperl_config_req_t *modperl_config_req_new(request_rec *r) { modperl_config_req_t *rcfg = (modperl_config_req_t *)apr_pcalloc(r->pool, sizeof(*rcfg)); MP_TRACE_d(MP_FUNC, "0x%lx", (unsigned long)rcfg); return rcfg; } modperl_config_con_t *modperl_config_con_new(conn_rec *c) { modperl_config_con_t *ccfg = (modperl_config_con_t *)apr_pcalloc(c->pool, sizeof(*ccfg)); MP_TRACE_d(MP_FUNC, "0x%lx", (unsigned long)ccfg); return ccfg; } modperl_config_srv_t *modperl_config_srv_new(apr_pool_t *p, server_rec *s) { modperl_config_srv_t *scfg = (modperl_config_srv_t *) apr_pcalloc(p, sizeof(*scfg)); scfg->flags = modperl_options_new(p, MpSrvType); MpSrvENABLE_On(scfg); /* mod_perl enabled by default */ MpSrvHOOKS_ALL_On(scfg); /* all hooks enabled by default */ scfg->PerlModule = apr_array_make(p, 2, sizeof(char *)); scfg->PerlRequire = apr_array_make(p, 2, sizeof(char *)); scfg->PerlPostConfigRequire = apr_array_make(p, 1, sizeof(modperl_require_file_t *)); scfg->argv = apr_array_make(p, 2, sizeof(char *)); scfg->setvars = apr_table_make(p, 2); scfg->configvars = apr_table_make(p, 2); scfg->PassEnv = apr_table_make(p, 2); scfg->SetEnv = apr_table_make(p, 2); #ifdef MP_USE_GTOP scfg->gtop = modperl_gtop_new(p); #endif /* make sure httpd's argv[0] is the first argument so $0 is * correctly connected to the real thing */ modperl_config_srv_argv_push(s->process->argv[0]); MP_TRACE_d(MP_FUNC, "new scfg: 0x%lx", (unsigned long)scfg); return scfg; } modperl_config_dir_t *modperl_config_dir_new(apr_pool_t *p) { modperl_config_dir_t *dcfg = (modperl_config_dir_t *) apr_pcalloc(p, sizeof(modperl_config_dir_t)); dcfg->flags = modperl_options_new(p, MpDirType); dcfg->setvars = apr_table_make(p, 2); dcfg->configvars = apr_table_make(p, 2); dcfg->SetEnv = apr_table_make(p, 2); MP_TRACE_d(MP_FUNC, "new dcfg: 0x%lx", (unsigned long)dcfg); return dcfg; } #ifdef MP_TRACE static void dump_argv(modperl_config_srv_t *scfg) { int i; char **argv = (char **)scfg->argv->elts; modperl_trace(NULL, "modperl_config_srv_argv_init =>"); for (i=0; iargv->nelts; i++) { modperl_trace(NULL, " %d = %s", i, argv[i]); } } #endif char **modperl_config_srv_argv_init(modperl_config_srv_t *scfg, int *argc) { modperl_config_srv_argv_push("-e;0"); *argc = scfg->argv->nelts; MP_TRACE_g_do(dump_argv(scfg)); return (char **)scfg->argv->elts; } void *modperl_config_srv_create(apr_pool_t *p, server_rec *s) { modperl_config_srv_t *scfg = modperl_config_srv_new(p, s); if (!s->is_virtual) { /* give a chance to MOD_PERL_TRACE env var to set * PerlTrace. This place is the earliest point in mod_perl * configuration parsing, when we have the server object */ modperl_trace_level_set_apache(s, NULL); /* Must store the global server record as early as possible, * because if mod_perl happens to be started from within a * vhost (e.g., PerlLoadModule) the base server record won't * be available to vhost and things will blow up */ modperl_init_globals(s, p); } MP_TRACE_d(MP_FUNC, "p=0x%lx, s=0x%lx, virtual=%d", p, s, s->is_virtual); #ifdef USE_ITHREADS scfg->interp_pool_cfg = (modperl_tipool_config_t *) apr_pcalloc(p, sizeof(*scfg->interp_pool_cfg)); /* XXX: determine reasonable defaults */ scfg->interp_pool_cfg->start = 3; scfg->interp_pool_cfg->max_spare = 3; scfg->interp_pool_cfg->min_spare = 3; scfg->interp_pool_cfg->max = 5; scfg->interp_pool_cfg->max_requests = 2000; #endif /* USE_ITHREADS */ scfg->server = s; return scfg; } /* XXX: this is not complete */ void *modperl_config_srv_merge(apr_pool_t *p, void *basev, void *addv) { int i; modperl_config_srv_t *base = (modperl_config_srv_t *)basev, *add = (modperl_config_srv_t *)addv, *mrg = modperl_config_srv_new(p, add->server); MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx, mrg==0x%lx", (unsigned long)basev, (unsigned long)addv, (unsigned long)mrg); merge_item(modules); merge_item(PerlModule); merge_item(PerlRequire); merge_item(PerlPostConfigRequire); merge_table_overlap_item(SetEnv); merge_table_overlap_item(PassEnv); /* this is where we merge PerlSetVar and PerlAddVar together */ mrg->configvars = merge_config_add_vars(p, base->configvars, add->setvars, add->configvars); merge_table_overlap_item(setvars); merge_item(server); #ifdef USE_ITHREADS merge_item(interp_pool_cfg); #else merge_item(perl); #endif if (MpSrvINHERIT_SWITCHES(add)) { /* only inherit base PerlSwitches if explicitly told to */ mrg->argv = base->argv; } else { mrg->argv = add->argv; } mrg->flags = modperl_options_merge(p, base->flags, add->flags); /* XXX: check if Perl*Handler is disabled */ for (i=0; i < MP_HANDLER_NUM_PER_SRV; i++) { merge_handlers(MpSrvMERGE_HANDLERS, handlers_per_srv[i]); } for (i=0; i < MP_HANDLER_NUM_FILES; i++) { merge_handlers(MpSrvMERGE_HANDLERS, handlers_files[i]); } for (i=0; i < MP_HANDLER_NUM_PROCESS; i++) { merge_handlers(MpSrvMERGE_HANDLERS, handlers_process[i]); } for (i=0; i < MP_HANDLER_NUM_PRE_CONNECTION; i++) { merge_handlers(MpSrvMERGE_HANDLERS, handlers_pre_connection[i]); } for (i=0; i < MP_HANDLER_NUM_CONNECTION; i++) { merge_handlers(MpSrvMERGE_HANDLERS, handlers_connection[i]); } if (modperl_is_running()) { if (modperl_init_vhost(mrg->server, p, NULL) != OK) { exit(1); /*XXX*/ } } #ifdef USE_ITHREADS merge_item(mip); #endif return mrg; } /* any per-request cleanup goes here */ apr_status_t modperl_config_request_cleanup(pTHX_ request_rec *r) { apr_status_t retval; MP_dRCFG; retval = modperl_callback_per_dir(MP_CLEANUP_HANDLER, r, MP_HOOK_RUN_ALL); /* undo changes to %ENV caused by +SetupEnv, perl-script, or * $r->subprocess_env, so the values won't persist */ if (MpReqSETUP_ENV(rcfg)) { modperl_env_request_unpopulate(aTHX_ r); } return retval; } apr_status_t modperl_config_req_cleanup(void *data) { request_rec *r = (request_rec *)data; apr_status_t rc; MP_dINTERPa(r, NULL, NULL); rc = modperl_config_request_cleanup(aTHX_ r); MP_INTERP_PUTBACK(interp, aTHX); return rc; } void *modperl_get_perl_module_config(ap_conf_vector_t *cv) { return ap_get_module_config(cv, &perl_module); } void modperl_set_perl_module_config(ap_conf_vector_t *cv, void *cfg) { ap_set_module_config(cv, &perl_module, cfg); } int modperl_config_apply_PerlModule(server_rec *s, modperl_config_srv_t *scfg, PerlInterpreter *perl, apr_pool_t *p) { char **entries; int i; dTHXa(perl); entries = (char **)scfg->PerlModule->elts; for (i = 0; i < scfg->PerlModule->nelts; i++){ if (modperl_require_module(aTHX_ entries[i], TRUE)){ MP_TRACE_d(MP_FUNC, "loaded Perl module %s for server %s", entries[i], modperl_server_desc(s,p)); } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "Can't load Perl module %s for server %s, exiting...", entries[i], modperl_server_desc(s,p)); return FALSE; } } return TRUE; } int modperl_config_apply_PerlRequire(server_rec *s, modperl_config_srv_t *scfg, PerlInterpreter *perl, apr_pool_t *p) { char **entries; int i; dTHXa(perl); entries = (char **)scfg->PerlRequire->elts; for (i = 0; i < scfg->PerlRequire->nelts; i++){ if (modperl_require_file(aTHX_ entries[i], TRUE)){ MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s", entries[i], modperl_server_desc(s,p)); } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "Can't load Perl file: %s for server %s, exiting...", entries[i], modperl_server_desc(s,p)); return FALSE; } } return TRUE; } int modperl_config_apply_PerlPostConfigRequire(server_rec *s, modperl_config_srv_t *scfg, apr_pool_t *p) { modperl_require_file_t **requires; int i; MP_PERL_CONTEXT_DECLARE; requires = (modperl_require_file_t **)scfg->PerlPostConfigRequire->elts; for (i = 0; i < scfg->PerlPostConfigRequire->nelts; i++){ int retval; MP_PERL_CONTEXT_STORE_OVERRIDE(scfg->mip->parent->perl); retval = modperl_require_file(aTHX_ requires[i]->file, TRUE); modperl_env_sync_srv_env_hash2table(aTHX_ p, scfg); modperl_env_sync_dir_env_hash2table(aTHX_ p, requires[i]->dcfg); MP_PERL_CONTEXT_RESTORE; if (retval) { MP_TRACE_d(MP_FUNC, "loaded Perl file: %s for server %s", requires[i]->file, modperl_server_desc(s, p)); } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "Can't load Perl file: %s for server %s, exiting...", requires[i]->file, modperl_server_desc(s, p)); return FALSE; } } return TRUE; } typedef struct { AV *av; I32 ix; PerlInterpreter *perl; } svav_param_t; static #if AP_MODULE_MAGIC_AT_LEAST(20110329,0) apr_status_t #else void * #endif svav_getstr(void *buf, size_t bufsiz, void *param) { svav_param_t *svav_param = (svav_param_t *)param; dTHXa(svav_param->perl); AV *av = svav_param->av; SV *sv; STRLEN n_a; if (svav_param->ix > AvFILL(av)) { #if AP_MODULE_MAGIC_AT_LEAST(20110329,0) return APR_EOF; #else return NULL; #endif } sv = AvARRAY(av)[svav_param->ix++]; SvPV_force(sv, n_a); apr_cpystrn(buf, SvPVX(sv), bufsiz); #if AP_MODULE_MAGIC_AT_LEAST(20110329,0) return APR_SUCCESS; #else return buf; #endif } const char *modperl_config_insert(pTHX_ server_rec *s, apr_pool_t *p, apr_pool_t *ptmp, int override, char *path, int override_options, ap_conf_vector_t *conf, SV *lines) { const char *errmsg; cmd_parms parms; svav_param_t svav_parms; ap_directive_t *conftree = NULL; memset(&parms, '\0', sizeof(parms)); parms.limited = -1; parms.server = s; parms.override = override; parms.path = apr_pstrdup(p, path); parms.pool = p; #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS if (override_options == MP_HTTPD_OVERRIDE_OPTS_UNSET) { parms.override_opts = MP_HTTPD_OVERRIDE_OPTS_DEFAULT; } else { parms.override_opts = override_options; } #endif if (ptmp) { parms.temp_pool = ptmp; } else { apr_pool_create(&parms.temp_pool, p); } if (!(SvROK(lines) && (SvTYPE(SvRV(lines)) == SVt_PVAV))) { return "not an array reference"; } svav_parms.av = (AV*)SvRV(lines); svav_parms.ix = 0; #ifdef USE_ITHREADS svav_parms.perl = aTHX; #endif parms.config_file = ap_pcfg_open_custom(p, "mod_perl", &svav_parms, NULL, svav_getstr, NULL); errmsg = ap_build_config(&parms, p, parms.temp_pool, &conftree); if (!errmsg) { errmsg = ap_walk_config(conftree, &parms, conf); } ap_cfg_closefile(parms.config_file); if (ptmp != parms.temp_pool) { apr_pool_destroy(parms.temp_pool); } return errmsg; } const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms, SV *lines) { return modperl_config_insert(aTHX_ parms->server, parms->pool, parms->temp_pool, parms->override, parms->path, #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS parms->override_opts, #else MP_HTTPD_OVERRIDE_OPTS_UNSET, #endif parms->context, lines); } const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines) { int override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); apr_pool_t *p = s->process->pconf; return modperl_config_insert(aTHX_ s, p, NULL, override, NULL, MP_HTTPD_OVERRIDE_OPTS_UNSET, s->lookup_defaults, lines); } const char *modperl_config_insert_request(pTHX_ request_rec *r, SV *lines, int override, char *path, int override_options) { const char *errmsg; ap_conf_vector_t *dconf = ap_create_per_dir_config(r->pool); if (!path) { /* pass a non-NULL path if nothing else given and for compatibility */ path = "/"; } errmsg = modperl_config_insert(aTHX_ r->server, r->pool, r->pool, override, path, override_options, dconf, lines); if (errmsg) { return errmsg; } r->per_dir_config = ap_merge_per_dir_configs(r->pool, r->per_dir_config, dconf); return NULL; } /* if r!=NULL check for dir PerlOptions, otherwise check for server * PerlOptions, (s must be always set) */ int modperl_config_is_perl_option_enabled(pTHX_ request_rec *r, server_rec *s, const char *name) { U32 flag; /* XXX: should we test whether perl is disabled for this server? */ /* if (!MpSrvENABLE(scfg)) { */ /* return 0; */ /* } */ if (r) { if ((flag = modperl_flags_lookup_dir(name)) != -1) { MP_dDCFG; return MpDirFLAGS(dcfg) & flag ? 1 : 0; } else { Perl_croak(aTHX_ "PerlOptions %s is not a directory option", name); } } else { if ((flag = modperl_flags_lookup_srv(name)) != -1) { MP_dSCFG(s); return MpSrvFLAGS(scfg) & flag ? 1 : 0; } else { Perl_croak(aTHX_ "PerlOptions %s is not a server option", name); } } } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_config.h0000644000104000010010000001471412540623202022330 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_CONFIG_H #define MODPERL_CONFIG_H void *modperl_config_dir_create(apr_pool_t *p, char *dir); void *modperl_config_dir_merge(apr_pool_t *p, void *basev, void *addv); modperl_config_srv_t *modperl_config_srv_new(apr_pool_t *p, server_rec *s); modperl_config_dir_t *modperl_config_dir_new(apr_pool_t *p); modperl_config_req_t *modperl_config_req_new(request_rec *r); modperl_config_con_t *modperl_config_con_new(conn_rec *c); void *modperl_config_srv_create(apr_pool_t *p, server_rec *s); void *modperl_config_srv_merge(apr_pool_t *p, void *basev, void *addv); char **modperl_config_srv_argv_init(modperl_config_srv_t *scfg, int *argc); #define modperl_config_srv_argv_push(arg) \ *(const char **)apr_array_push(scfg->argv) = (arg) apr_status_t modperl_config_request_cleanup(pTHX_ request_rec *r); apr_status_t modperl_config_req_cleanup(void *data); /* use a subpool here to ensure that a PerlCleanupHandler is run before * any other pool cleanup - suppools are destroyed first. Particularly a * PerlCleanupHandler must run before request pnotes are dropped. */ #define modperl_config_req_cleanup_register(r, rcfg) \ if (r && !MpReqCLEANUP_REGISTERED(rcfg)) { \ apr_pool_t *p; \ apr_pool_create(&p, (r)->pool); \ apr_pool_cleanup_register(p, \ (void*)(r), \ modperl_config_req_cleanup, \ apr_pool_cleanup_null); \ MpReqCLEANUP_REGISTERED_On(rcfg); \ } void *modperl_get_perl_module_config(ap_conf_vector_t *cv); void modperl_set_perl_module_config(ap_conf_vector_t *cv, void *cfg); #if defined(MP_IN_XS) && defined(WIN32) # define modperl_get_module_config(v) \ modperl_get_perl_module_config((v)) # define modperl_set_module_config(v, c) \ modperl_set_perl_module_config((v), (c)) #else # define modperl_get_module_config(v) \ ap_get_module_config((v), &perl_module) # define modperl_set_module_config(v, c) \ ap_set_module_config((v), &perl_module, (c)) #endif #define modperl_config_req_init(r, rcfg) \ if (!(rcfg)) { \ (rcfg) = modperl_config_req_new(r); \ modperl_set_module_config((r)->request_config, (rcfg)); \ } #define modperl_config_req_get(r) \ (r ? (modperl_config_req_t *) \ modperl_get_module_config((r)->request_config) : NULL) #define MP_dRCFG \ modperl_config_req_t *rcfg = modperl_config_req_get(r) #define modperl_config_con_init(c, ccfg) \ if (!ccfg) { \ ccfg = modperl_config_con_new(c); \ modperl_set_module_config((c)->conn_config, (ccfg)); \ } #define modperl_config_con_get(c) \ (c ? (modperl_config_con_t *) \ modperl_get_module_config((c)->conn_config) : NULL) #define MP_dCCFG \ modperl_config_con_t *ccfg = modperl_config_con_get(c) #define modperl_config_dir_get(r) \ (r ? (modperl_config_dir_t *) \ modperl_get_module_config((r)->per_dir_config) : NULL) #define modperl_config_dir_get_defaults(s) \ (modperl_config_dir_t *) \ modperl_get_module_config((s)->lookup_defaults) #define MP_dDCFG \ modperl_config_dir_t *dcfg = modperl_config_dir_get(r) #define modperl_config_srv_get(s) \ (modperl_config_srv_t *) \ modperl_get_module_config(s->module_config) #define MP_dSCFG(s) \ modperl_config_srv_t *scfg = modperl_config_srv_get(s) int modperl_config_apply_PerlModule(server_rec *s, modperl_config_srv_t *scfg, PerlInterpreter *perl, apr_pool_t *p); int modperl_config_apply_PerlRequire(server_rec *s, modperl_config_srv_t *scfg, PerlInterpreter *perl, apr_pool_t *p); int modperl_config_apply_PerlPostConfigRequire(server_rec *s, modperl_config_srv_t *scfg, apr_pool_t *p); const char *modperl_config_insert(pTHX_ server_rec *s, apr_pool_t *p, apr_pool_t *ptmp, int override, char *path, int override_options, ap_conf_vector_t *conf, SV *lines); const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms, SV *lines); const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines); const char *modperl_config_insert_request(pTHX_ request_rec *r, SV *lines, int override, char *path, int override_options); int modperl_config_is_perl_option_enabled(pTHX_ request_rec *r, server_rec *s, const char *name); #endif /* MODPERL_CONFIG_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_const.c0000644000104000010010000000755612540623202022212 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #include "modperl_const.h" typedef SV *(*constants_lookup)(pTHX_ const char *); typedef const char ** (*constants_group_lookup)(const char *); static void new_constsub(pTHX_ constants_lookup lookup, HV *caller_stash, HV *stash, const char *name) { int name_len = strlen(name); GV **gvp = (GV **)hv_fetch(stash, name, name_len, TRUE); /* dont redefine */ if (!isGV(*gvp) || !GvCV(*gvp)) { SV *val = (*lookup)(aTHX_ name); #if 0 Perl_warn(aTHX_ "newCONSTSUB(%s, %s, %s)\n", HvNAME(stash), name, SvPV_nolen(val)); #endif newCONSTSUB(stash, (char *)name, val); #ifdef GvSHARED GvSHARED_on(*gvp); #endif } /* export into callers namespace */ if (caller_stash) { GV *alias = *(GV **)hv_fetch(caller_stash, (char *)name, name_len, TRUE); if (!isGV(alias)) { gv_init(alias, caller_stash, name, name_len, TRUE); } #ifdef MUTABLE_CV GvCV_set(alias, MUTABLE_CV(SvREFCNT_inc(GvCV(*gvp)))); #else GvCV_set(alias, (CV*)(SvREFCNT_inc(GvCV(*gvp)))); #endif } } int modperl_const_compile(pTHX_ const char *classname, const char *arg, const char *name) { HV *stash = gv_stashpv(classname, TRUE); HV *caller_stash = (HV *)NULL; constants_lookup lookup; constants_group_lookup group_lookup; if (strnEQ(classname, "APR", 3)) { lookup = modperl_constants_lookup_apr_const; group_lookup = modperl_constants_group_lookup_apr_const; } else if (strnEQ(classname, "Apache2", 7)) { lookup = modperl_constants_lookup_apache2_const; group_lookup = modperl_constants_group_lookup_apache2_const; } else { lookup = modperl_constants_lookup_modperl; group_lookup = modperl_constants_group_lookup_modperl; } if (*arg != '-') { /* only export into callers namespace without -compile arg */ caller_stash = gv_stashpv(arg, TRUE); } if (*name == ':') { int i; const char **group; name++; group = (*group_lookup)(name); for (i=0; group[i]; i++) { new_constsub(aTHX_ lookup, caller_stash, stash, group[i]); } } else { if (*name == '&') { name++; } new_constsub(aTHX_ lookup, caller_stash, stash, name); } return 1; } XS(XS_modperl_const_compile) { I32 i; STRLEN n_a; char *stashname = HvNAME(GvSTASH(CvGV(cv))); const char *classname, *arg; dXSARGS; if (items < 2) { Perl_croak(aTHX_ "Usage: %s->compile(...)", stashname); } classname = *(stashname + 1) == 'P' ? "APR::Const" : (*stashname == 'A' ? "Apache2::Const" : "ModPerl"); arg = SvPV(ST(1),n_a); for (i=2; iserver_hostname, s->port); } #ifdef MP_TRACE void modperl_apr_table_dump(pTHX_ apr_table_t *table, char *name) { int i, tmp_len, len = 0; char *fmt; const apr_array_header_t *array = apr_table_elts(table); apr_table_entry_t *elts = (apr_table_entry_t *)array->elts; modperl_trace(MP_FUNC, "*** Contents of table '%s' ***", name); for (i = 0; i < array->nelts; i++) { if (elts[i].key && elts[i].val) { tmp_len = strlen(elts[i].key); if (tmp_len > len) { len = tmp_len; } } } /* dump the table with keys aligned */ fmt = Perl_form(aTHX_ "%%-%ds => %%s", len); for (i = 0; i < array->nelts; i++) { if (!elts[i].key || !elts[i].val) { continue; } modperl_trace(MP_FUNC, fmt, elts[i].key, elts[i].val); } modperl_trace(MP_FUNC, ""); } #endif #ifdef MP_TRACE void modperl_perl_modglobal_dump(pTHX) { HV *hv = PL_modglobal; AV *val; char *key; I32 klen; hv_iterinit(hv); MP_TRACE_g(MP_FUNC, "|-------- PL_modglobal --------"); #ifdef USE_ITHREADS MP_TRACE_g(MP_FUNC, "| perl 0x%lx", (unsigned long)aTHX); #endif MP_TRACE_g(MP_FUNC, "| PL_modglobal 0x%lx", (unsigned long)PL_modglobal); while ((val = (AV*)hv_iternextsv(hv, &key, &klen))) { MP_TRACE_g(MP_FUNC, "| %s => 0x%lx", key, val); } MP_TRACE_g(MP_FUNC, "|-------- PL_modglobal --------"); } #endif /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_debug.h0000644000104000010010000000267312540623202022152 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_DEBUG_H #define MODPERL_DEBUG_H #include "mod_perl.h" #ifdef MP_DEBUG # define MP_ASSERT(exp) ap_assert(exp) #else # define MP_ASSERT(exp) ((void)0) #endif #ifdef USE_ITHREADS # define MP_ASSERT_CONTEXT(perl) MP_ASSERT((perl) == PERL_GET_CONTEXT) #else # define MP_ASSERT_CONTEXT(perl) ((void)0) #endif char *modperl_server_desc(server_rec *s, apr_pool_t *p); #ifdef MP_TRACE void modperl_apr_table_dump(pTHX_ apr_table_t *table, char *name); /* dump the contents of PL_modglobal */ void modperl_perl_modglobal_dump(pTHX); #endif #endif /* MODPERL_DEBUG_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_env.c0000644000104000010010000004637112540623202021652 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #define EnvMgOK ((SV*)ENVHV && SvMAGIC((SV*)ENVHV)) #define EnvMgObj (EnvMgOK ? SvMAGIC((SV*)ENVHV)->mg_ptr : NULL) #define EnvMgLen (EnvMgOK ? SvMAGIC((SV*)ENVHV)->mg_len : 0) #define EnvMgObjSet(val){ \ if (EnvMgOK) SvMAGIC((SV*)ENVHV)->mg_ptr = (char *)val;} #define EnvMgLenSet(val) {\ if (EnvMgOK) SvMAGIC((SV*)ENVHV)->mg_len = val;} /* XXX: move to utils? */ static unsigned long modperl_interp_address(pTHX) { #ifdef USE_ITHREADS return (unsigned long)aTHX; #else return (unsigned long)0; /* just one interpreter */ #endif } #define MP_ENV_HV_STORE(hv, key, val) STMT_START { \ I32 klen = strlen(key); \ SV **svp = hv_fetch(hv, key, klen, FALSE); \ SV *sv; \ \ if (svp) { \ sv_setpv(*svp, val); \ } \ else { \ sv = newSVpv(val, 0); \ (void)hv_store(hv, key, klen, sv, FALSE); \ modperl_envelem_tie(sv, key, klen); \ svp = &sv; \ } \ MP_TRACE_e(MP_FUNC, "$ENV{%s} = \"%s\";", key, val); \ \ SvTAINTED_on(*svp); \ } STMT_END void modperl_env_hv_store(pTHX_ const char *key, const char *val) { MP_ENV_HV_STORE(ENVHV, key, val); } static MP_INLINE void modperl_env_hv_delete(pTHX_ HV *hv, char *key) { I32 klen = strlen(key); if (hv_exists(hv, key, klen)) { (void)hv_delete(hv, key, strlen(key), G_DISCARD); } } typedef struct { const char *key; I32 klen; const char *val; I32 vlen; U32 hash; } modperl_env_ent_t; #define MP_ENV_ENT(k,v) \ { k, MP_SSTRLEN(k), v, MP_SSTRLEN(v), 0 } static modperl_env_ent_t MP_env_const_vars[] = { MP_ENV_ENT("MOD_PERL", MP_VERSION_STRING), MP_ENV_ENT("MOD_PERL_API_VERSION", MP_API_VERSION), { NULL } }; void modperl_env_hash_keys(pTHX) { modperl_env_ent_t *ent = MP_env_const_vars; while (ent->key) { PERL_HASH(ent->hash, ent->key, ent->klen); MP_TRACE_e(MP_FUNC, "[0x%lx] PERL_HASH: %s (len: %d)", modperl_interp_address(aTHX), ent->key, ent->klen); ent++; } } void modperl_env_clear(pTHX) { HV *hv = ENVHV; U32 mg_flags; modperl_env_untie(mg_flags); MP_TRACE_e(MP_FUNC, "[0x%lx] %%ENV = ();", modperl_interp_address(aTHX)); hv_clear(hv); modperl_env_tie(mg_flags); } #define MP_ENV_HV_STORE_TABLE_ENTRY(hv, elt) \ MP_ENV_HV_STORE(hv, elt.key, elt.val); static void modperl_env_table_populate(pTHX_ apr_table_t *table) { HV *hv = ENVHV; U32 mg_flags; int i; const apr_array_header_t *array; apr_table_entry_t *elts; modperl_env_untie(mg_flags); array = apr_table_elts(table); elts = (apr_table_entry_t *)array->elts; for (i = 0; i < array->nelts; i++) { if (!elts[i].key || !elts[i].val) { continue; } MP_ENV_HV_STORE_TABLE_ENTRY(hv, elts[i]); } modperl_env_tie(mg_flags); } static void modperl_env_table_unpopulate(pTHX_ apr_table_t *table) { HV *hv = ENVHV; U32 mg_flags; int i; const apr_array_header_t *array; apr_table_entry_t *elts; modperl_env_untie(mg_flags); array = apr_table_elts(table); elts = (apr_table_entry_t *)array->elts; for (i = 0; i < array->nelts; i++) { if (!elts[i].key) { continue; } modperl_env_hv_delete(aTHX_ hv, elts[i].key); MP_TRACE_e(MP_FUNC, "delete $ENV{%s};", elts[i].key); } modperl_env_tie(mg_flags); } /* see the comment in modperl_env_sync_env_hash2table */ static void modperl_env_sync_table(pTHX_ apr_table_t *table) { int i; const apr_array_header_t *array; apr_table_entry_t *elts; HV *hv = ENVHV; SV **svp; array = apr_table_elts(table); elts = (apr_table_entry_t *)array->elts; for (i = 0; i < array->nelts; i++) { if (!elts[i].key) { continue; } svp = hv_fetch(hv, elts[i].key, strlen(elts[i].key), FALSE); if (svp) { apr_table_set(table, elts[i].key, SvPV_nolen(*svp)); MP_TRACE_e(MP_FUNC, "(Set|Pass)Env '%s' '%s'", elts[i].key, SvPV_nolen(*svp)); } } TAINT_NOT; /* SvPV_* causes the taint issue */ } /* Make per-server PerlSetEnv and PerlPassEnv in sync with %ENV at * config time (if perl is running), by copying %ENV values to the * PerlSetEnv and PerlPassEnv tables (only for keys which are already * in those tables) */ void modperl_env_sync_srv_env_hash2table(pTHX_ apr_pool_t *p, modperl_config_srv_t *scfg) { modperl_env_sync_table(aTHX_ scfg->SetEnv); modperl_env_sync_table(aTHX_ scfg->PassEnv); } void modperl_env_sync_dir_env_hash2table(pTHX_ apr_pool_t *p, modperl_config_dir_t *dcfg) { modperl_env_sync_table(aTHX_ dcfg->SetEnv); } /* list of environment variables to pass by default */ static const char *MP_env_pass_defaults[] = { "PATH", "TZ", NULL }; void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s) { MP_dSCFG(s); int i = 0; /* make per-server PerlSetEnv and PerlPassEnv entries visible * to %ENV at config time */ for (i=0; MP_env_pass_defaults[i]; i++) { const char *key = MP_env_pass_defaults[i]; char *val; if (apr_table_get(scfg->SetEnv, key) || apr_table_get(scfg->PassEnv, key)) { continue; /* already configured */ } if ((val = getenv(key))) { apr_table_set(scfg->PassEnv, key, val); } } MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s]" "\n\t@ENV{keys scfg->SetEnv} = values scfg->SetEnv;", modperl_interp_address(aTHX), modperl_server_desc(s, p)); modperl_env_table_populate(aTHX_ scfg->SetEnv); MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s]" "\n\t@ENV{keys scfg->PassEnv} = values scfg->PassEnv;", modperl_interp_address(aTHX), modperl_server_desc(s, p)); modperl_env_table_populate(aTHX_ scfg->PassEnv); } #define overlay_subprocess_env(r, tab) \ r->subprocess_env = apr_table_overlay(r->pool, \ r->subprocess_env, \ tab) void modperl_env_configure_request_dir(pTHX_ request_rec *r) { MP_dRCFG; MP_dDCFG; /* populate %ENV and r->subprocess_env with per-directory * PerlSetEnv entries. * * note that per-server PerlSetEnv entries, as well as * PerlPassEnv entries (which are only per-server), are added * to %ENV and r->subprocess_env via modperl_env_configure_request_srv */ if (!apr_is_empty_table(dcfg->SetEnv)) { apr_table_t *setenv_copy; /* add per-directory PerlSetEnv entries to %ENV * collisions with per-server PerlSetEnv entries are * resolved via the nature of a Perl hash */ MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s]" "\n\t@ENV{keys dcfg->SetEnv} = values dcfg->SetEnv;", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool)); modperl_env_table_populate(aTHX_ dcfg->SetEnv); /* make sure the entries are in the subprocess_env table as well. * we need to use apr_table_overlap (not apr_table_overlay) because * r->subprocess_env might have per-server PerlSetEnv entries in it * and using apr_table_overlay would generate duplicate entries. * in order to use apr_table_overlap, though, we need to copy the * the dcfg table so that pool requirements are satisfied */ setenv_copy = apr_table_copy(r->pool, dcfg->SetEnv); apr_table_overlap(r->subprocess_env, setenv_copy, APR_OVERLAP_TABLES_SET); } MpReqPERL_SET_ENV_DIR_On(rcfg); } void modperl_env_configure_request_srv(pTHX_ request_rec *r) { MP_dRCFG; MP_dSCFG(r->server); /* populate %ENV and r->subprocess_env with per-server PerlSetEnv * and PerlPassEnv entries. * * although both are setup in %ENV in modperl_request_configure_server * %ENV will be reset via modperl_env_request_unpopulate. */ if (!apr_is_empty_table(scfg->SetEnv)) { MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s]" "\n\t@ENV{keys scfg->SetEnv} = values scfg->SetEnv;", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool)); modperl_env_table_populate(aTHX_ scfg->SetEnv); overlay_subprocess_env(r, scfg->SetEnv); } if (!apr_is_empty_table(scfg->PassEnv)) { MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s]" "\n\t@ENV{keys scfg->PassEnv} = values scfg->PassEnv;", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool)); modperl_env_table_populate(aTHX_ scfg->PassEnv); overlay_subprocess_env(r, scfg->PassEnv); } MpReqPERL_SET_ENV_SRV_On(rcfg); } void modperl_env_default_populate(pTHX) { modperl_env_ent_t *ent = MP_env_const_vars; HV *hv = ENVHV; U32 mg_flags; modperl_env_untie(mg_flags); while (ent->key) { SV *sv = newSVpvn(ent->val, ent->vlen); (void)hv_store(hv, ent->key, ent->klen, sv, ent->hash); MP_TRACE_e(MP_FUNC, "$ENV{%s} = \"%s\";", ent->key, ent->val); modperl_envelem_tie(sv, ent->key, ent->klen); ent++; } modperl_env_tie(mg_flags); } void modperl_env_request_populate(pTHX_ request_rec *r) { MP_dRCFG; /* this is called under the following conditions * - if PerlOptions +SetupEnv * - if $r->subprocess_env() is called in a void context with no args * * normally, %ENV is only populated once per request (if at all) - * just prior to content generation if +SetupEnv. * * however, in the $r->subprocess_env() case it will be called * more than once - once for each void call, and once again just * prior to content generation. while costly, the multiple * passes are required, otherwise void calls would prohibit later * phases from populating %ENV with new subprocess_env table entries */ MP_TRACE_e(MP_FUNC, "\t[0x%lx/%s%s]" "\n\t@ENV{keys r->subprocess_env} = values r->subprocess_env;", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool), r->uri); /* we can eliminate some of the cost by only doing CGI variables once * per-request no matter how many times $r->subprocess_env() is called */ if (! MpReqSETUP_ENV(rcfg)) { ap_add_common_vars(r); ap_add_cgi_vars(r); } modperl_env_table_populate(aTHX_ r->subprocess_env); /* don't set up CGI variables again this request. * this also triggers modperl_env_request_unpopulate, which * resets %ENV between requests - see modperl_config_request_cleanup */ MpReqSETUP_ENV_On(rcfg); } void modperl_env_request_unpopulate(pTHX_ request_rec *r) { MP_dRCFG; /* unset only once */ if (!MpReqSETUP_ENV(rcfg)) { return; } MP_TRACE_e(MP_FUNC, "\n\t[0x%lx/%s%s]\n\tdelete @ENV{keys r->subprocess_env};", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool), r->uri); modperl_env_table_unpopulate(aTHX_ r->subprocess_env); MpReqSETUP_ENV_Off(rcfg); } void modperl_env_request_tie(pTHX_ request_rec *r) { EnvMgObjSet(r); EnvMgLenSet(-1); #ifdef MP_PERL_HV_GMAGICAL_AWARE MP_TRACE_e(MP_FUNC, "[0x%lx] tie %%ENV, $r\t (%s%s)", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool), r->uri); SvGMAGICAL_on((SV*)ENVHV); #endif } void modperl_env_request_untie(pTHX_ request_rec *r) { EnvMgObjSet(NULL); #ifdef MP_PERL_HV_GMAGICAL_AWARE MP_TRACE_e(MP_FUNC, "[0x%lx] untie %%ENV; # from r\t (%s%s)", modperl_interp_address(aTHX), modperl_server_desc(r->server, r->pool), r->uri); SvGMAGICAL_off((SV*)ENVHV); #endif } /* to store the original virtual tables * these are global, not per-interpreter */ static MGVTBL MP_PERL_vtbl_env; static MGVTBL MP_PERL_vtbl_envelem; #define MP_PL_vtbl_call(name, meth) \ MP_PERL_vtbl_##name.svt_##meth(aTHX_ sv, mg) #define MP_dENV_KEY \ STRLEN klen; \ const char *key = (const char *)MgPV(mg,klen) #define MP_dENV_VAL \ STRLEN vlen; \ const char *val = (const char *)SvPV(sv,vlen) /* * XXX: what we do here might change: * - make it optional for %ENV to be tied to r->subprocess_env * - make it possible to modify environ * - we could allow modification of environ if mpm isn't threaded * - we could allow modification of environ if variable isn't a CGI * variable (still could cause problems) */ /* * problems we are trying to solve: * - environ is shared between threads * + Perl does not serialize access to environ * + even if it did, CGI variables cannot be shared between threads! * problems we create by trying to solve above problems: * - a forked process will not inherit the current %ENV * - C libraries might rely on environ, e.g. DBD::Oracle */ static int modperl_env_magic_set_all(pTHX_ SV *sv, MAGIC *mg) { request_rec *r = (request_rec *)EnvMgObj; if (r) { if (PL_localizing) { /* local %ENV = (FOO => 'bar', BIZ => 'baz') */ HE *entry; STRLEN n_a; hv_iterinit((HV*)sv); while ((entry = hv_iternext((HV*)sv))) { I32 keylen; apr_table_set(r->subprocess_env, hv_iterkey(entry, &keylen), SvPV(hv_iterval((HV*)sv, entry), n_a)); MP_TRACE_e(MP_FUNC, "[0x%lx] localizing: %s => %s", modperl_interp_address(aTHX), hv_iterkey(entry, &keylen), SvPV(hv_iterval((HV*)sv, entry), n_a)); } } } else { #ifdef MP_TRACE HE *entry; STRLEN n_a; MP_TRACE_e(MP_FUNC, "\n\t[0x%lx] populating %%ENV:", modperl_interp_address(aTHX)); hv_iterinit((HV*)sv); while ((entry = hv_iternext((HV*)sv))) { I32 keylen; MP_TRACE_e(MP_FUNC, "$ENV{%s} = \"%s\";", hv_iterkey(entry, &keylen), SvPV(hv_iterval((HV*)sv, entry), n_a)); } #endif return MP_PL_vtbl_call(env, set); } return 0; } static int modperl_env_magic_clear_all(pTHX_ SV *sv, MAGIC *mg) { request_rec *r = (request_rec *)EnvMgObj; if (r) { apr_table_clear(r->subprocess_env); MP_TRACE_e(MP_FUNC, "[0x%lx] clearing all magic off r->subprocess_env", modperl_interp_address(aTHX)); } else { MP_TRACE_e(MP_FUNC, "[0x%lx] %%ENV = ();", modperl_interp_address(aTHX)); return MP_PL_vtbl_call(env, clear); } return 0; } static int modperl_env_magic_set(pTHX_ SV *sv, MAGIC *mg) { request_rec *r = (request_rec *)EnvMgObj; if (r) { MP_dENV_KEY; MP_dENV_VAL; apr_table_set(r->subprocess_env, key, val); MP_TRACE_e(MP_FUNC, "[0x%lx] r->subprocess_env set: %s => %s", modperl_interp_address(aTHX), key, val); } else { #ifdef MP_TRACE MP_dENV_KEY; MP_dENV_VAL; MP_TRACE_e(MP_FUNC, "[0x%lx] $ENV{%s} = \"%s\";", modperl_interp_address(aTHX), key, val); #endif return MP_PL_vtbl_call(envelem, set); } return 0; } static int modperl_env_magic_clear(pTHX_ SV *sv, MAGIC *mg) { request_rec *r = (request_rec *)EnvMgObj; if (r) { MP_dENV_KEY; apr_table_unset(r->subprocess_env, key); MP_TRACE_e(MP_FUNC, "[0x%lx] r->subprocess_env unset: %s", modperl_interp_address(aTHX), key); } else { #ifdef MP_TRACE MP_dENV_KEY; MP_TRACE_e(MP_FUNC, "[0x%lx] delete $ENV{%s};", modperl_interp_address(aTHX), key); #endif return MP_PL_vtbl_call(envelem, clear); } return 0; } #ifdef MP_PERL_HV_GMAGICAL_AWARE static int modperl_env_magic_get(pTHX_ SV *sv, MAGIC *mg) { request_rec *r = (request_rec *)EnvMgObj; if (r) { MP_dENV_KEY; const char *val; if ((val = apr_table_get(r->subprocess_env, key))) { sv_setpv(sv, val); MP_TRACE_e(MP_FUNC, "[0x%lx] r->subprocess_env get: %s => %s", modperl_interp_address(aTHX), key, val); } else { sv_setsv(sv, &PL_sv_undef); MP_TRACE_e(MP_FUNC, "[0x%lx] r->subprocess_env get: %s => undef", modperl_interp_address(aTHX), key); } } else { /* there is no svt_get in PL_vtbl_envelem */ #ifdef MP_TRACE MP_dENV_KEY; MP_TRACE_e(MP_FUNC, "[0x%lx] there is no svt_get in PL_vtbl_envelem: %s", modperl_interp_address(aTHX), key); #endif } return 0; } #endif /* override %ENV virtual tables with our own */ static MGVTBL MP_vtbl_env = { 0, modperl_env_magic_set_all, 0, modperl_env_magic_clear_all, 0 }; static MGVTBL MP_vtbl_envelem = { 0, modperl_env_magic_set, 0, modperl_env_magic_clear, 0 }; void modperl_env_init(void) { /* save originals */ StructCopy(&PL_vtbl_env, &MP_PERL_vtbl_env, MGVTBL); StructCopy(&PL_vtbl_envelem, &MP_PERL_vtbl_envelem, MGVTBL); /* replace with our versions */ StructCopy(&MP_vtbl_env, &PL_vtbl_env, MGVTBL); StructCopy(&MP_vtbl_envelem, &PL_vtbl_envelem, MGVTBL); } void modperl_env_unload(void) { /* restore originals */ StructCopy(&MP_PERL_vtbl_env, &PL_vtbl_env, MGVTBL); StructCopy(&MP_PERL_vtbl_envelem, &PL_vtbl_envelem, MGVTBL); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_env.h0000644000104000010010000000420112540623202021641 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_ENV_H #define MODPERL_ENV_H #ifndef ENVHV # define ENVHV GvHV(PL_envgv) #endif #define modperl_env_untie(mg_flags) \ MP_magical_untie(ENVHV, mg_flags) #define modperl_env_tie(mg_flags) \ MP_magical_tie(ENVHV, mg_flags) #define modperl_envelem_tie(sv, key, klen) \ sv_magic(sv, (SV *)NULL, 'e', key, klen) void modperl_env_hash_keys(pTHX); void modperl_env_clear(pTHX); void modperl_env_hv_store(pTHX_ const char *key, const char *val); void modperl_env_sync_srv_env_hash2table(pTHX_ apr_pool_t *p, modperl_config_srv_t *scfg); void modperl_env_sync_dir_env_hash2table(pTHX_ apr_pool_t *p, modperl_config_dir_t *dcfg); void modperl_env_configure_server(pTHX_ apr_pool_t *p, server_rec *s); void modperl_env_configure_request_srv(pTHX_ request_rec *r); void modperl_env_configure_request_dir(pTHX_ request_rec *r); void modperl_env_default_populate(pTHX); void modperl_env_request_populate(pTHX_ request_rec *r); void modperl_env_request_unpopulate(pTHX_ request_rec *r); void modperl_env_request_tie(pTHX_ request_rec *r); void modperl_env_request_untie(pTHX_ request_rec *r); void modperl_env_init(void); void modperl_env_unload(void); #endif /* MODPERL_ENV_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_error.c0000644000104000010010000000640412540623202022204 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" static const char *MP_error_strings[] = { "exit was called", /* MODPERL_RC_EXIT */ "filter handler has failed", /* MODPERL_FILTER_ERROR */ }; #define MP_error_strings_size \ sizeof(MP_error_strings) / sizeof(MP_error_strings[0]) char *modperl_error_strerror(pTHX_ apr_status_t rc) { char *ptr; char buf[256]; if (rc >= APR_OS_START_USERERR && rc < APR_OS_START_USERERR + MP_error_strings_size) { /* custom mod_perl errors */ ptr = (char*)MP_error_strings[(int)(rc - APR_OS_START_USERERR)]; } else { /* apache apr errors */ ptr = apr_strerror(rc, buf, sizeof(buf)); } /* must copy the string and not return a pointer to the local * address. Using a single (per interpreter) static buffer. */ return Perl_form(aTHX_ "%s", ptr ? ptr : "unknown error"); } /* modperl_croak notes: under -T we can't really do anything when die * was called in the stacked eval_sv (which is the case when a * response handler calls a filter handler and that filter calls die * ""). for example trying to require a file in modperl_croak(), will * cause 'panic: POPSTACK' and the process will exit. Dave fixed that * in perl Change 23209 by davem@davem-percy on 2004/08/09 19:48:57, * which will hopefully appear in perl 5.8.6. for now workaround this * perl bug by setting the taint mode off for the APR/Error loading. */ /* croak with $@ as a APR::Error object * rc - set to apr_status_t value * file - set to the callers filename * line - set to the callers line number * func - set to the function name */ void modperl_croak(pTHX_ apr_status_t rc, const char* func) { HV *stash; HV *data; int is_tainted = PL_tainted; /* see the explanation above */ if (is_tainted) { TAINT_NOT; } Perl_require_pv(aTHX_ "APR/Error.pm"); if (is_tainted) { TAINT; } if (SvTRUE(ERRSV)) { Perl_croak(aTHX_ (char *)NULL); } stash = gv_stashpvn("APR::Error", 10, FALSE); data = newHV(); /* $@ = bless {}, "APR::Error"; */ sv_setsv(ERRSV, sv_bless(newRV_noinc((SV*)data), stash)); sv_setiv(*hv_fetch(data, "rc", 2, 1), rc); sv_setpv(*hv_fetch(data, "file", 4, 1), CopFILE(PL_curcop)); sv_setiv(*hv_fetch(data, "line", 4, 1), CopLINE(PL_curcop)); sv_setpv(*hv_fetch(data, "func", 4, 1), func); Perl_croak(aTHX_ (char *)NULL); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_error.h0000644000104000010010000001262112540623202022207 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_ERROR_H #define MODPERL_ERROR_H /*** mod_perl custom errors come here ***/ /* to check whether $@ is set by ModPerl::Util::exit */ #define MODPERL_RC_EXIT APR_OS_START_USERERR + 0 /* indicate the filter error problem */ #define MODPERL_FILTER_ERROR APR_OS_START_USERERR + 1 /** * return the string representation of the error code * @param rc error code * @return the error string * * The return value must be immediately copied unless used only in a * limited visible scope where it's clear that Perl_form() is not * called again (which could happen indirectly). If unsure, copy. */ char *modperl_error_strerror(pTHX_ apr_status_t rc); void modperl_croak(pTHX_ apr_status_t rc, const char* func); #ifdef USE_ITHREADS #define MP_PUTBACK_IF_USED() STMT_START \ { \ modperl_interp_t *interp = modperl_thx_interp_get(aTHX); \ if (interp && interp->refcnt > 1) { \ modperl_interp_unselect(interp); \ } \ } STMT_END #else #define MP_PUTBACK_IF_USED() NOOP #endif #define MP_CROAK_PUTBACK(rc, func) STMT_START \ { \ MP_PUTBACK_IF_USED(); \ modperl_croak(aTHX_ rc, func); \ } STMT_END #define MP_RUN_CROAK(rc_run, func) STMT_START \ { \ apr_status_t rc = rc_run; \ if (rc != APR_SUCCESS) { \ modperl_croak(aTHX_ rc, func); \ } \ } STMT_END #define MP_RUN_CROAK_PUTBACK(rc_run, func) STMT_START \ { \ apr_status_t rc = rc_run; \ if (rc != APR_SUCCESS) { \ MP_PUTBACK_IF_USED(); \ modperl_croak(aTHX_ rc, func); \ } \ } STMT_END #define MP_RUN_CROAK_RESET_OK(s, rc_run, func) STMT_START \ { \ apr_status_t rc = rc_run; \ if (rc != APR_SUCCESS) { \ if (APR_STATUS_IS_ECONNRESET(rc) || \ APR_STATUS_IS_ECONNABORTED(rc)) { \ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, \ "%s got: %s", func, \ modperl_error_strerror(aTHX_ rc)); \ } \ else { \ modperl_croak(aTHX_ rc, func); \ } \ } \ } STMT_END #define MP_RUN_CROAK_RESET_OK_PUTBACK(s, rc_run, func) STMT_START \ { \ apr_status_t rc = rc_run; \ if (rc != APR_SUCCESS) { \ if (APR_STATUS_IS_ECONNRESET(rc) || \ APR_STATUS_IS_ECONNABORTED(rc)) { \ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, \ "%s got: %s", func, \ modperl_error_strerror(aTHX_ rc)); \ } \ else { \ MP_PUTBACK_IF_USED(); \ modperl_croak(aTHX_ rc, func); \ } \ } \ } STMT_END #endif /* MODPERL_ERROR_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_filter.c0000644000104000010010000013061012540623202022335 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* helper funcs */ #define MP_FILTER_NAME_FORMAT " %s\n\n\t" #define MP_FILTER_NAME(f) \ (is_modperl_filter(f) \ ? modperl_handler_name( \ ((modperl_filter_ctx_t *)(f)->ctx)->handler) \ : (f)->frec->name) #define MP_FILTER_TYPE(filter) \ (is_modperl_filter(filter->f) \ ? ((modperl_filter_ctx_t *)(filter)->f->ctx)->handler->attrs & \ MP_FILTER_CONNECTION_HANDLER ? "connection" : "request" \ : "unknown") #define MP_FILTER_MODE(filter) \ (filter->mode == MP_INPUT_FILTER_MODE ? "input" : "output") #define MP_FILTER_POOL(f) f->r ? f->r->pool : f->c->pool /* allocate wbucket memory using a sub-pool and not a ap_filter_t * pool, since we may need many of these if the filter is invoked * multiple times */ #define WBUCKET_INIT(filter) \ if (!filter->wbucket) { \ modperl_wbucket_t *wb = \ (modperl_wbucket_t *)apr_pcalloc(filter->temp_pool, \ sizeof(*wb)); \ wb->pool = filter->pool; \ wb->filters = &(filter->f->next); \ wb->outcnt = 0; \ wb->r = NULL; \ wb->header_parse = 0; \ filter->wbucket = wb; \ } #define FILTER_FREE(filter) \ apr_pool_destroy(filter->temp_pool); /* Save the value of $@ if it was set */ #define MP_FILTER_SAVE_ERRSV(tmpsv) \ if (SvTRUE(ERRSV)) { \ tmpsv = newSVsv(ERRSV); \ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \ "Saving $@='%s'", \ MP_FILTER_NAME(filter->f), \ SvPVX(tmpsv) \ ); \ } /* Restore previously saved value of $@. if there was a filter error * it'd have been logged by modperl_errsv call following * modperl_callback */ #define MP_FILTER_RESTORE_ERRSV(tmpsv) \ if (tmpsv) { \ sv_setsv(ERRSV, tmpsv); \ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT \ "Restoring $@='%s'", \ MP_FILTER_NAME(filter->f), \ SvPVX(tmpsv) \ ); \ } /* this function is for tracing only, it's not optimized for performance */ static int is_modperl_filter(ap_filter_t *f) { const char *name = f->frec->name; /* frec->name is always lowercased */ if (!strcasecmp(name, MP_FILTER_CONNECTION_INPUT_NAME) || !strcasecmp(name, MP_FILTER_CONNECTION_OUTPUT_NAME) || !strcasecmp(name, MP_FILTER_REQUEST_INPUT_NAME) || !strcasecmp(name, MP_FILTER_REQUEST_OUTPUT_NAME) ) { return 1; } else { return 0; } } MP_INLINE static apr_status_t send_input_eos(modperl_filter_t *filter) { apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc; apr_bucket *b = apr_bucket_eos_create(ba); APR_BRIGADE_INSERT_TAIL(filter->bb_out, b); ((modperl_filter_ctx_t *)filter->f->ctx)->sent_eos = 1; MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: EOS bucket", MP_FILTER_NAME(filter->f)); return APR_SUCCESS; } MP_INLINE static apr_status_t send_input_flush(modperl_filter_t *filter) { apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc; apr_bucket *b = apr_bucket_flush_create(ba); APR_BRIGADE_INSERT_TAIL(filter->bb_out, b); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: FLUSH bucket", MP_FILTER_NAME(filter->f)); return APR_SUCCESS; } MP_INLINE static apr_status_t send_output_eos(ap_filter_t *f) { apr_bucket_alloc_t *ba = f->c->bucket_alloc; apr_bucket_brigade *bb = apr_brigade_create(MP_FILTER_POOL(f), ba); apr_bucket *b = apr_bucket_eos_create(ba); APR_BRIGADE_INSERT_TAIL(bb, b); ((modperl_filter_ctx_t *)f->ctx)->sent_eos = 1; MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: EOS bucket in separate bb", MP_FILTER_NAME(f)); return ap_pass_brigade(f->next, bb); } MP_INLINE static apr_status_t send_output_flush(ap_filter_t *f) { apr_bucket_alloc_t *ba = f->c->bucket_alloc; apr_bucket_brigade *bb = apr_brigade_create(MP_FILTER_POOL(f), ba); apr_bucket *b = apr_bucket_flush_create(ba); APR_BRIGADE_INSERT_TAIL(bb, b); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: FLUSH bucket in separate bb", MP_FILTER_NAME(f)); return ap_pass_brigade(f, bb); } /* simple buffer api */ MP_INLINE apr_status_t modperl_wbucket_pass(modperl_wbucket_t *wb, const char *buf, apr_size_t len, int add_flush_bucket) { apr_bucket_alloc_t *ba = (*wb->filters)->c->bucket_alloc; apr_bucket_brigade *bb; apr_bucket *bucket; /* reset the counter to 0 as early as possible and in one place, * since this function will always either pass the data out (and * it has 'len' already) or return an error. */ wb->outcnt = 0; if (wb->header_parse) { request_rec *r = wb->r; const char *body; int status; MP_TRACE_f(MP_FUNC, "parsing headers: %db [%s]", len, MP_TRACE_STR_TRUNC(wb->pool, buf, len)); status = modperl_cgi_header_parse(r, (char *)buf, &len, &body); wb->header_parse = 0; /* only once per-request */ if (status == HTTP_MOVED_TEMPORARILY) { return APR_SUCCESS; /* XXX: HTTP_MOVED_TEMPORARILY ? */ } else if (status != OK) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, "%s did not send an HTTP header", r->uri); r->status = status; /* XXX: body == NULL here */ return APR_SUCCESS; } else if (!len) { return APR_SUCCESS; } buf = body; } /* this is a note for filter writers who may decide that there is * a bug in mod_perl. We send a transient bucket. That means that * this bucket can't be stored inside a filter without copying the * data in it. This is done automatically by apr_bucket_setaside, * which is written exactly for the purpose to make setaside * operation transparent to the kind of bucket. */ bucket = apr_bucket_transient_create(buf, len, ba); bb = apr_brigade_create(wb->pool, ba); APR_BRIGADE_INSERT_TAIL(bb, bucket); if (add_flush_bucket) { /* append the flush bucket rather then calling ap_rflush, to * prevent a creation of yet another bb, which will cause an * extra call for each filter in the chain */ apr_bucket *bucket = apr_bucket_flush_create(ba); APR_BRIGADE_INSERT_TAIL(bb, bucket); } MP_TRACE_f(MP_FUNC, "\n\n\twrite out: %db [%s]" "\t\tfrom %s\n\t\tto %s filter handler", len, MP_TRACE_STR_TRUNC(wb->pool, buf, len), ((wb->r && wb->filters == &wb->r->output_filters) ? "response handler" : "current filter handler"), MP_FILTER_NAME(*(wb->filters))); return ap_pass_brigade(*(wb->filters), bb); } /* flush data if any, * if add_flush_bucket is TRUE * if there is data to flush * a flush bucket is added to the tail of bb with data * else * a flush bucket is sent in its own bb * else * nothing is sent */ MP_INLINE apr_status_t modperl_wbucket_flush(modperl_wbucket_t *wb, int add_flush_bucket) { apr_status_t rv = APR_SUCCESS; if (wb->outcnt) { rv = modperl_wbucket_pass(wb, wb->outbuf, wb->outcnt, add_flush_bucket); } else if (add_flush_bucket) { rv = send_output_flush(*(wb->filters)); } return rv; } MP_INLINE apr_status_t modperl_wbucket_write(pTHX_ modperl_wbucket_t *wb, const char *buf, apr_size_t *wlen) { apr_size_t len = *wlen; *wlen = 0; if ((len + wb->outcnt) > sizeof(wb->outbuf)) { apr_status_t rv; if ((rv = modperl_wbucket_flush(wb, FALSE)) != APR_SUCCESS) { return rv; } } if (len >= sizeof(wb->outbuf)) { *wlen = len; return modperl_wbucket_pass(wb, buf, len, FALSE); } else { memcpy(&wb->outbuf[wb->outcnt], buf, len); wb->outcnt += len; *wlen = len; return APR_SUCCESS; } } /* generic filter routines */ /* all ap_filter_t filter cleanups should go here */ static apr_status_t modperl_filter_f_cleanup(void *data) { ap_filter_t *f = (ap_filter_t *)data; modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(f->ctx); /* mod_perl filter ctx cleanup */ if (ctx->data){ #ifdef USE_ITHREADS dTHXa(ctx->interp->perl); // MP_ASSERT_CONTEXT(aTHX); #endif if (SvOK(ctx->data) && SvREFCNT(ctx->data)) { SvREFCNT_dec(ctx->data); ctx->data = NULL; } MP_INTERP_PUTBACK(ctx->interp, aTHX); } return APR_SUCCESS; } modperl_filter_t *modperl_filter_new(ap_filter_t *f, apr_bucket_brigade *bb, modperl_filter_mode_e mode, ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes) { apr_pool_t *p = MP_FILTER_POOL(f); apr_pool_t *temp_pool; modperl_filter_t *filter; /* we can't allocate memory from the pool here, since potentially * a filter can be called hundreds of times during the same * request/connection resulting in enormous memory demands * (sizeof(*filter)*number of invocations). so we use a sub-pool * which will get destroyed at the end of each modperl_filter * invocation. */ apr_status_t rv = apr_pool_create(&temp_pool, p); if (rv != APR_SUCCESS) { /* XXX: how do we handle the error? assert? */ return NULL; } filter = (modperl_filter_t *)apr_pcalloc(temp_pool, sizeof(*filter)); #ifdef MP_DEBUG apr_pool_tag(temp_pool, "mod_perl temp filter"); #endif filter->temp_pool = temp_pool; filter->mode = mode; filter->f = f; filter->pool = p; filter->wbucket = NULL; if (mode == MP_INPUT_FILTER_MODE) { filter->bb_in = NULL; filter->bb_out = bb; filter->input_mode = input_mode; filter->block = block; filter->readbytes = readbytes; } else { filter->bb_in = bb; filter->bb_out = NULL; } MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "new: %s %s filter (modperl_filter_t *0x%lx), " "f (ap_filter_t *0x%lx)", MP_FILTER_NAME(f), MP_FILTER_TYPE(filter), MP_FILTER_MODE(filter), (unsigned long)filter, (unsigned long)filter->f); return filter; } static void modperl_filter_mg_set(pTHX_ SV *obj, modperl_filter_t *filter) { sv_magic(SvRV(obj), (SV *)NULL, PERL_MAGIC_ext, NULL, -1); SvMAGIC(SvRV(obj))->mg_ptr = (char *)filter; } modperl_filter_t *modperl_filter_mg_get(pTHX_ SV *obj) { MAGIC *mg = mg_find(SvRV(obj), PERL_MAGIC_ext); return mg ? (modperl_filter_t *)mg->mg_ptr : NULL; } /* eval "package Foo; \&init_handler" */ int modperl_filter_resolve_init_handler(pTHX_ modperl_handler_t *handler, apr_pool_t *p) { char *init_handler_pv_code = NULL; if (handler->mgv_cv) { GV *gv = modperl_mgv_lookup(aTHX_ handler->mgv_cv); if (gv) { CV *cv = modperl_mgv_cv(gv); if (cv && SvMAGICAL(cv)) { MAGIC *mg = mg_find((SV*)(cv), PERL_MAGIC_ext); init_handler_pv_code = mg ? mg->mg_ptr : NULL; } else { /* XXX: should we complain in such a case? */ return 0; } } } if (init_handler_pv_code) { char *package_name = modperl_mgv_as_string(aTHX_ handler->mgv_cv, p, 1); /* fprintf(stderr, "PACKAGE: %s\n", package_name ); */ /* eval the code in the parent handler's package's context */ char *code = apr_pstrcat(p, "package ", package_name, ";", init_handler_pv_code, NULL); SV *sv; modperl_handler_t *init_handler; ENTER;SAVETMPS; sv = eval_pv(code, TRUE); /* fprintf(stderr, "code: %s\n", code); */ init_handler = modperl_handler_new_from_sv(aTHX_ p, sv); FREETMPS;LEAVE; if (init_handler) { modperl_mgv_resolve(aTHX_ init_handler, p, init_handler->name, 1); MP_TRACE_h(MP_FUNC, "found init handler %s", modperl_handler_name(init_handler)); if (!(init_handler->attrs & MP_FILTER_INIT_HANDLER)) { Perl_croak(aTHX_ "handler %s doesn't have " "the FilterInitHandler attribute set", modperl_handler_name(init_handler)); } handler->next = init_handler; return 1; } else { Perl_croak(aTHX_ "failed to eval code: %s", code); } } return 1; } static int modperl_run_filter_init(ap_filter_t *f, modperl_filter_mode_e mode, modperl_handler_t *handler) { AV *args = (AV *)NULL; int status; request_rec *r = f->r; conn_rec *c = f->c; server_rec *s = r ? r->server : c->base_server; apr_pool_t *p = r ? r->pool : c->pool; modperl_filter_t *filter = modperl_filter_new(f, NULL, mode, 0, 0, 0); MP_dINTERPa(r, c, s); MP_TRACE_h(MP_FUNC, "running filter init handler %s", modperl_handler_name(handler)); modperl_handler_make_args(aTHX_ &args, "Apache2::Filter", f, NULL); modperl_filter_mg_set(aTHX_ AvARRAY(args)[0], filter); /* XXX filter_init return status is propagated back to Apache over * in C land, making it possible to use filter_init to return, say, * BAD_REQUEST. this implementation, however, ignores the return status * even though we're trapping it here - modperl_filter_add_request sees * the error and propagates it, but modperl_output_filter_add_request * is void so the error is lost */ if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); } FILTER_FREE(filter); SvREFCNT_dec((SV*)args); MP_INTERP_PUTBACK(interp, aTHX); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "return: %d", modperl_handler_name(handler), status); return status; } int modperl_run_filter(modperl_filter_t *filter) { AV *args = (AV *)NULL; SV *errsv = (SV *)NULL; int status; modperl_handler_t *handler = ((modperl_filter_ctx_t *)filter->f->ctx)->handler; request_rec *r = filter->f->r; conn_rec *c = filter->f->c; server_rec *s = r ? r->server : c->base_server; apr_pool_t *p = r ? r->pool : c->pool; MP_dINTERPa(r, c, s); MP_FILTER_SAVE_ERRSV(errsv); modperl_handler_make_args(aTHX_ &args, "Apache2::Filter", filter->f, "APR::Brigade", (filter->mode == MP_INPUT_FILTER_MODE ? filter->bb_out : filter->bb_in), NULL); modperl_filter_mg_set(aTHX_ AvARRAY(args)[0], filter); if (filter->mode == MP_INPUT_FILTER_MODE) { av_push(args, newSViv(filter->input_mode)); av_push(args, newSViv(filter->block)); av_push(args, newSViv(filter->readbytes)); } /* while filters are VOID handlers, we need to log any errors, * because most perl coders will forget to check the return errors * from read() and print() calls. and if the caller is not a perl * program they won't make any sense of ERRSV or $! */ if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) { status = modperl_errsv(aTHX_ status, r, s); } SvREFCNT_dec((SV*)args); /* when the streaming filter is invoked it should be able to send * extra data, after the read in a while() loop is finished. * Therefore we need to postpone propogating the EOS bucket, up * until the filter handler is returned and only then send the EOS * bucket if the stream had one. */ if (filter->seen_eos) { filter->eos = 1; filter->seen_eos = 0; } if (filter->mode == MP_INPUT_FILTER_MODE) { if (filter->bb_in) { if (status == DECLINED) { /* make sure the filter doesn't try to make mod_perl * pass the bucket brigade through after it called * $f->read(), since it causes a pre-fetch of the * bb */ MP_CROAK_PUTBACK(MODPERL_FILTER_ERROR, "a filter calling $f->read " "must return OK and not DECLINED"); } /* in the streaming mode filter->bb_in is populated on the * first modperl_input_filter_read, so it must be * destroyed at the end of the filter invocation */ apr_brigade_destroy(filter->bb_in); filter->bb_in = NULL; } MP_RUN_CROAK_RESET_OK_PUTBACK(s, modperl_input_filter_flush(filter), "Apache2::Filter internal flush"); } else { MP_RUN_CROAK_RESET_OK_PUTBACK(s, modperl_output_filter_flush(filter), "Apache2::Filter internal flush"); } MP_FILTER_RESTORE_ERRSV(errsv); MP_INTERP_PUTBACK(interp, aTHX); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "return: %d", modperl_handler_name(handler), status); return status; } /* unrolled APR_BRIGADE_FOREACH loop */ #define MP_FILTER_EMPTY(filter) \ APR_BRIGADE_EMPTY(filter->bb_in) #define MP_FILTER_SENTINEL(filter) \ APR_BRIGADE_SENTINEL(filter->bb_in) #define MP_FILTER_FIRST(filter) \ APR_BRIGADE_FIRST(filter->bb_in) #define MP_FILTER_NEXT(filter) \ APR_BUCKET_NEXT(filter->bucket) #define MP_FILTER_IS_EOS(filter) \ APR_BUCKET_IS_EOS(filter->bucket) #define MP_FILTER_IS_FLUSH(filter) \ APR_BUCKET_IS_FLUSH(filter->bucket) MP_INLINE static int get_bucket(modperl_filter_t *filter) { if (!filter->bb_in || MP_FILTER_EMPTY(filter)) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "read in: bucket brigade is empty", MP_FILTER_NAME(filter->f)); return 0; } if (!filter->bucket) { filter->bucket = MP_FILTER_FIRST(filter); } else if (filter->bucket != MP_FILTER_SENTINEL(filter)) { filter->bucket = MP_FILTER_NEXT(filter); } if (filter->bucket == MP_FILTER_SENTINEL(filter)) { filter->bucket = NULL; /* can't destroy bb_in since the next read will need a brigade * to try to read from */ apr_brigade_cleanup(filter->bb_in); return 0; } if (MP_FILTER_IS_EOS(filter)) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "read in: EOS bucket", MP_FILTER_NAME(filter->f)); filter->seen_eos = 1; /* there should be only one EOS sent, modperl_filter_read will * not come here, since filter->seen_eos is set */ return 0; } else if (MP_FILTER_IS_FLUSH(filter)) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "read in: FLUSH bucket", MP_FILTER_NAME(filter->f)); filter->flush = 1; return 0; } else { return 1; } } MP_INLINE static apr_size_t modperl_filter_read(pTHX_ modperl_filter_t *filter, SV *buffer, apr_size_t wanted) { int num_buckets = 0; apr_size_t len = 0; (void)SvUPGRADE(buffer, SVt_PV); SvCUR(buffer) = 0; /* calling SvPOK_only here may leave buffer an invalid state since * SvPVX may be NULL. But it's very likely that something is copied. * So, we turn the POK flag on here. Later we check if SvPVX is NULL * and turn the flag off again if so. */ SvPOK_only(buffer); /* sometimes the EOS bucket arrives in the same brigade with other * buckets, so that particular read() will not return 0 and will * be called again if called in the while ($filter->read(...)) * loop. In that case we return 0. */ if (filter->seen_eos) { return 0; } /* modperl_brigade_dump(filter->bb_in, NULL); */ MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "wanted: %db", MP_FILTER_NAME(filter->f), wanted); if (filter->remaining) { if (filter->remaining >= wanted) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "eating and returning %d [%s]\n\tof " "remaining %db", MP_FILTER_NAME(filter->f), wanted, MP_TRACE_STR_TRUNC(filter->pool, filter->leftover, wanted), filter->remaining); SvGROW(buffer, wanted+1); sv_catpvn(buffer, filter->leftover, wanted); filter->leftover += wanted; filter->remaining -= wanted; return wanted; } else { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "eating remaining %db", MP_FILTER_NAME(filter->f), filter->remaining); SvGROW(buffer, filter->remaining+1); sv_catpvn(buffer, filter->leftover, filter->remaining); len = filter->remaining; filter->remaining = 0; filter->leftover = NULL; } } while (1) { const char *buf; apr_size_t buf_len; if (!get_bucket(filter)) { break; } num_buckets++; filter->rc = apr_bucket_read(filter->bucket, &buf, &buf_len, 0); if (filter->rc == APR_SUCCESS) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "read in: %s bucket with %db (0x%lx)", MP_FILTER_NAME(filter->f), filter->bucket->type->name, buf_len, (unsigned long)filter->bucket); } else { SvREFCNT_dec(buffer); modperl_croak(aTHX_ filter->rc, "Apache2::Filter::read"); } if (buf_len) { if ((SvCUR(buffer) + buf_len) >= wanted) { int nibble = wanted - SvCUR(buffer); SvGROW(buffer, SvCUR(buffer)+nibble+1); sv_catpvn(buffer, buf, nibble); filter->leftover = (char *)buf+nibble; filter->remaining = buf_len - nibble; len += nibble; break; } else { len += buf_len; SvGROW(buffer, SvCUR(buffer)+buf_len+1); sv_catpvn(buffer, buf, buf_len); } } } if (!SvPVX(buffer)) { SvPOK_off(buffer); } MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "return: %db from %d bucket%s [%s]\n\t(%db leftover)", MP_FILTER_NAME(filter->f), len, num_buckets, ((num_buckets == 1) ? "" : "s"), MP_TRACE_STR_TRUNC(filter->pool, SvPVX(buffer), len), filter->remaining); return len; } MP_INLINE apr_size_t modperl_input_filter_read(pTHX_ modperl_filter_t *filter, SV *buffer, apr_size_t wanted) { apr_size_t len = 0; if (!filter->bb_in) { /* This should be read only once per handler invocation! */ filter->bb_in = apr_brigade_create(filter->pool, filter->f->c->bucket_alloc); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "retrieving bb: 0x%lx", MP_FILTER_NAME(filter->f), (unsigned long)(filter->bb_in)); MP_RUN_CROAK(ap_get_brigade(filter->f->next, filter->bb_in, filter->input_mode, filter->block, filter->readbytes), "Apache2::Filter::read"); } len = modperl_filter_read(aTHX_ filter, buffer, wanted); if (filter->flush && len == 0) { /* if len > 0 then $filter->write will flush */ apr_status_t rc = modperl_input_filter_flush(filter); if (rc != APR_SUCCESS) { SvREFCNT_dec(buffer); modperl_croak(aTHX_ rc, "Apache2::Filter::read"); } } return len; } MP_INLINE apr_size_t modperl_output_filter_read(pTHX_ modperl_filter_t *filter, SV *buffer, apr_size_t wanted) { apr_size_t len = 0; len = modperl_filter_read(aTHX_ filter, buffer, wanted); if (filter->flush && len == 0) { /* if len > 0 then $filter->write will flush */ apr_status_t rc = modperl_output_filter_flush(filter); if (rc != APR_SUCCESS) { SvREFCNT_dec(buffer); modperl_croak(aTHX_ rc, "Apache2::Filter::read"); } } return len; } MP_INLINE apr_status_t modperl_input_filter_flush(modperl_filter_t *filter) { if (((modperl_filter_ctx_t *)filter->f->ctx)->sent_eos) { /* no data should be sent after EOS has been sent */ return filter->rc; } if (filter->flush) { filter->rc = send_input_flush(filter); filter->flush = 0; } if (filter->eos) { filter->rc = send_input_eos(filter); filter->eos = 0; } return filter->rc; } MP_INLINE apr_status_t modperl_output_filter_flush(modperl_filter_t *filter) { int add_flush_bucket = FALSE; if (((modperl_filter_ctx_t *)filter->f->ctx)->sent_eos) { /* no data should be sent after EOS has been sent */ return filter->rc; } if (filter->flush) { add_flush_bucket = TRUE; filter->flush = 0; } WBUCKET_INIT(filter); filter->rc = modperl_wbucket_flush(filter->wbucket, add_flush_bucket); if (filter->rc != APR_SUCCESS) { return filter->rc; } if (filter->eos) { filter->rc = send_output_eos(filter->f); if (filter->bb_in) { apr_brigade_destroy(filter->bb_in); filter->bb_in = NULL; } filter->eos = 0; } return filter->rc; } MP_INLINE apr_status_t modperl_input_filter_write(pTHX_ modperl_filter_t *filter, const char *buf, apr_size_t *len) { apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc; char *copy = apr_pmemdup(filter->pool, buf, *len); apr_bucket *bucket = apr_bucket_transient_create(copy, *len, ba); MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: %db [%s]:", MP_FILTER_NAME(filter->f), *len, MP_TRACE_STR_TRUNC(filter->pool, copy, *len)); APR_BRIGADE_INSERT_TAIL(filter->bb_out, bucket); /* modperl_brigade_dump(filter->bb_out, NULL); */ return APR_SUCCESS; } MP_INLINE apr_status_t modperl_output_filter_write(pTHX_ modperl_filter_t *filter, const char *buf, apr_size_t *len) { WBUCKET_INIT(filter); return modperl_wbucket_write(aTHX_ filter->wbucket, buf, len); } apr_status_t modperl_output_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb) { modperl_filter_t *filter; int status; if (((modperl_filter_ctx_t *)f->ctx)->sent_eos) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write_out: EOS was already sent, " "passing through the brigade", MP_FILTER_NAME(f)); return ap_pass_brigade(f->next, bb); } else { filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE, 0, 0, 0); status = modperl_run_filter(filter); FILTER_FREE(filter); } switch (status) { case OK: return APR_SUCCESS; case DECLINED: return ap_pass_brigade(f->next, bb); default: return status; /*XXX*/ } } apr_status_t modperl_input_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb, ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes) { modperl_filter_t *filter; int status; if (((modperl_filter_ctx_t *)f->ctx)->sent_eos) { MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT "write out: EOS was already sent, " "passing through the brigade", MP_FILTER_NAME(f)); return ap_get_brigade(f->next, bb, input_mode, block, readbytes); } else { filter = modperl_filter_new(f, bb, MP_INPUT_FILTER_MODE, input_mode, block, readbytes); status = modperl_run_filter(filter); FILTER_FREE(filter); } switch (status) { case OK: return APR_SUCCESS; case DECLINED: return ap_get_brigade(f->next, bb, input_mode, block, readbytes); case HTTP_INTERNAL_SERVER_ERROR: /* XXX: later may introduce separate error codes for * modperl_run_filter and modperl_run_filter_init */ return MODPERL_FILTER_ERROR; default: return status; /*XXX*/ } } static int modperl_filter_add_connection(conn_rec *c, int idx, const char *name, modperl_filter_add_t addfunc, const char *type) { modperl_config_dir_t *dcfg = modperl_config_dir_get_defaults(c->base_server); MpAV *av; if ((av = dcfg->handlers_per_dir[idx])) { modperl_handler_t **handlers = (modperl_handler_t **)av->elts; int i; for (i=0; inelts; i++) { modperl_filter_ctx_t *ctx; ap_filter_t *f; /* process non-mod_perl filter handlers */ if ((handlers[i]->attrs & MP_FILTER_HTTPD_HANDLER)) { /* non-mp2 filters below PROTOCOL level can't be added * at the connection level, so we need to go through * the pain of figuring out the type of the filter */ ap_filter_rec_t *frec; char *normalized_name = apr_pstrdup(c->pool, handlers[i]->name); ap_str_tolower(normalized_name); frec = idx == MP_INPUT_FILTER_HANDLER ? ap_get_input_filter_handle(normalized_name) : ap_get_output_filter_handle(normalized_name); if (frec && frec->ftype < AP_FTYPE_PROTOCOL) { MP_TRACE_f(MP_FUNC, "a non-mod_perl %s handler %s " "skipped (not a connection filter)", type, handlers[i]->name); continue; } addfunc(handlers[i]->name, NULL, NULL, c); MP_TRACE_f(MP_FUNC, "a non-mod_perl %s handler %s configured " "(connection)", type, handlers[i]->name); continue; } /* skip non-connection level filters, e.g. request filters * configured outside the resource container */ if (!(handlers[i]->attrs & MP_FILTER_CONNECTION_HANDLER)) { MP_TRACE_f(MP_FUNC, "%s is not a FilterConnection handler, skipping", handlers[i]->name); continue; } ctx = (modperl_filter_ctx_t *)apr_pcalloc(c->pool, sizeof(*ctx)); ctx->handler = handlers[i]; f = addfunc(name, (void*)ctx, NULL, c); /* ap_filter_t filter cleanup */ apr_pool_cleanup_register(c->pool, (void *)f, modperl_filter_f_cleanup, apr_pool_cleanup_null); if (handlers[i]->attrs & MP_FILTER_HAS_INIT_HANDLER && handlers[i]->next) { int status = modperl_run_filter_init( f, (idx == MP_INPUT_FILTER_HANDLER ? MP_INPUT_FILTER_MODE : MP_OUTPUT_FILTER_MODE), handlers[i]->next); if (status != OK) { return status; } } MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)", type, handlers[i]->name); } return OK; } MP_TRACE_h(MP_FUNC, "no %s handlers configured (connection)", type); return DECLINED; } static int modperl_filter_add_request(request_rec *r, int idx, const char *name, modperl_filter_add_t addfunc, const char *type, ap_filter_t *filters) { MP_dDCFG; MpAV *av; if ((av = dcfg->handlers_per_dir[idx])) { modperl_handler_t **handlers = (modperl_handler_t **)av->elts; int i; for (i=0; inelts; i++) { modperl_filter_ctx_t *ctx; int registered = 0; ap_filter_t *f; /* process non-mod_perl filter handlers */ if ((handlers[i]->attrs & MP_FILTER_HTTPD_HANDLER)) { addfunc(handlers[i]->name, NULL, r, r->connection); MP_TRACE_f(MP_FUNC, "a non-mod_perl %s handler %s configured (%s)", type, handlers[i]->name, r->uri); continue; } /* skip non-request level filters, e.g. connection filters * configured outside the resource container, merged into * resource's dcfg->handlers_per_dir[] entry. */ if ((handlers[i]->attrs & MP_FILTER_CONNECTION_HANDLER)) { MP_TRACE_f(MP_FUNC, "%s is not a FilterRequest handler, skipping", handlers[i]->name); continue; } /* XXX: I fail to see where this feature is used, since * modperl_filter_add_connection doesn't register request * filters. may be it'll be still useful when the same * filter handler is configured to run more than once? * e.g. snooping filter [stas] */ f = filters; while (f) { const char *fname = f->frec->name; /* XXX: I think this won't work as f->frec->name gets * lowercased when added to the chain */ if (*fname == 'M' && strEQ(fname, name)) { modperl_handler_t *ctx_handler = ((modperl_filter_ctx_t *)f->ctx)->handler; if (modperl_handler_equal(ctx_handler, handlers[i])) { /* skip if modperl_filter_add_connection * already registered this handler * XXX: set a flag in the modperl_handler_t instead */ registered = 1; break; } } f = f->next; } if (registered) { MP_TRACE_f(MP_FUNC, "%s %s already registered", handlers[i]->name, type); continue; } ctx = (modperl_filter_ctx_t *)apr_pcalloc(r->pool, sizeof(*ctx)); ctx->handler = handlers[i]; f = addfunc(name, (void*)ctx, r, r->connection); /* ap_filter_t filter cleanup */ apr_pool_cleanup_register(r->pool, (void *)f, modperl_filter_f_cleanup, apr_pool_cleanup_null); if (handlers[i]->attrs & MP_FILTER_HAS_INIT_HANDLER && handlers[i]->next) { int status = modperl_run_filter_init( f, (idx == MP_INPUT_FILTER_HANDLER ? MP_INPUT_FILTER_MODE : MP_OUTPUT_FILTER_MODE), handlers[i]->next); if (status != OK) { return status; } } MP_TRACE_h(MP_FUNC, "%s handler %s configured (%s)", type, handlers[i]->name, r->uri); } return OK; } MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)", type, r->uri); return DECLINED; } void modperl_output_filter_add_connection(conn_rec *c) { modperl_filter_add_connection(c, MP_OUTPUT_FILTER_HANDLER, MP_FILTER_CONNECTION_OUTPUT_NAME, ap_add_output_filter, "OutputFilter"); } void modperl_output_filter_add_request(request_rec *r) { modperl_filter_add_request(r, MP_OUTPUT_FILTER_HANDLER, MP_FILTER_REQUEST_OUTPUT_NAME, ap_add_output_filter, "OutputFilter", r->connection->output_filters); } void modperl_input_filter_add_connection(conn_rec *c) { modperl_filter_add_connection(c, MP_INPUT_FILTER_HANDLER, MP_FILTER_CONNECTION_INPUT_NAME, ap_add_input_filter, "InputFilter"); } void modperl_input_filter_add_request(request_rec *r) { modperl_filter_add_request(r, MP_INPUT_FILTER_HANDLER, MP_FILTER_REQUEST_INPUT_NAME, ap_add_input_filter, "InputFilter", r->connection->input_filters); } void modperl_filter_runtime_add(pTHX_ request_rec *r, conn_rec *c, const char *name, modperl_filter_mode_e mode, modperl_filter_add_t addfunc, SV *callback, const char *type) { apr_pool_t *pool = r ? r->pool : c->pool; modperl_handler_t *handler = modperl_handler_new_from_sv(aTHX_ pool, callback); if (handler) { ap_filter_t *f; modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)apr_pcalloc(pool, sizeof(*ctx)); ctx->handler = handler; f = addfunc(name, (void*)ctx, r, c); /* ap_filter_t filter cleanup */ apr_pool_cleanup_register(pool, (void *)f, modperl_filter_f_cleanup, apr_pool_cleanup_null); /* has to resolve early so we can check for init functions */ if (!modperl_mgv_resolve(aTHX_ handler, pool, handler->name, TRUE)) { Perl_croak(aTHX_ "unable to resolve handler %s\n", modperl_handler_name(handler)); } /* verify that the filter handler is of the right kind */ if (r == NULL) { /* needs to have the FilterConnectionHandler attribute */ if (!(handler->attrs & MP_FILTER_CONNECTION_HANDLER)) { Perl_croak(aTHX_ "Can't add connection filter handler '%s' " "since it doesn't have the " "FilterConnectionHandler attribute set", modperl_handler_name(handler)); } } else { /* needs to have the FilterRequestHandler attribute, but * since by default request filters are not required to * have the FilterRequestHandler attribute, croak only if * some other attribute is set, but not * FilterRequestHandler */ if (handler->attrs && !(handler->attrs & MP_FILTER_REQUEST_HANDLER)) { Perl_croak(aTHX_ "Can't add request filter handler '%s' " "since it doesn't have the " "FilterRequestHandler attribute set", modperl_handler_name(handler)); } } if (handler->attrs & MP_FILTER_HAS_INIT_HANDLER && handler->next) { int status = modperl_run_filter_init(f, mode, handler->next); if (status != OK) { modperl_croak(aTHX_ status, strEQ("InputFilter", type) ? "Apache2::Filter::add_input_filter" : "Apache2::Filter::add_output_filter"); } } MP_TRACE_h(MP_FUNC, "%s handler %s configured (connection)", type, name); return; } Perl_croak(aTHX_ "unable to resolve handler 0x%lx\n", (unsigned long)callback); } void modperl_brigade_dump(apr_bucket_brigade *bb, apr_file_t *file) { apr_bucket *bucket; int i = 0; #ifndef WIN32 if (file == NULL) { file = modperl_global_get_server_rec()->error_log; } apr_file_printf(file, "dump of brigade 0x%lx\n", (unsigned long)bb); for (bucket = APR_BRIGADE_FIRST(bb); bucket != APR_BRIGADE_SENTINEL(bb); bucket = APR_BUCKET_NEXT(bucket)) { apr_file_printf(file, " %d: bucket=%s(0x%lx), length=%ld, data=0x%lx\n", i, bucket->type->name, (unsigned long)bucket, (long)bucket->length, (unsigned long)bucket->data); /* apr_file_printf(file, " : %s\n", (char *)bucket->data); */ i++; } #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_filter.h0000644000104000010010000001213312540623202022341 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_FILTER_H #define MODPERL_FILTER_H #define MP_FILTER_CONNECTION_OUTPUT_NAME "MODPERL_CONNECTION_OUTPUT" #define MP_FILTER_CONNECTION_INPUT_NAME "MODPERL_CONNECTION_INPUT" #define MP_FILTER_REQUEST_OUTPUT_NAME "MODPERL_REQUEST_OUTPUT" #define MP_FILTER_REQUEST_INPUT_NAME "MODPERL_REQUEST_INPUT" #define MP_FILTER_CONNECTION_HANDLER 0x01 #define MP_FILTER_REQUEST_HANDLER 0x02 #define MP_FILTER_HAS_INIT_HANDLER 0x04 #define MP_FILTER_INIT_HANDLER 0x08 #define MP_FILTER_HTTPD_HANDLER 0x10 typedef ap_filter_t * MP_FUNC_T(modperl_filter_add_t) (const char *, void *, request_rec *, conn_rec *); /* simple buffer api */ MP_INLINE apr_status_t modperl_wbucket_pass(modperl_wbucket_t *b, const char *buf, apr_size_t len, int add_flush_bucket); MP_INLINE apr_status_t modperl_wbucket_flush(modperl_wbucket_t *b, int add_flush_bucket); MP_INLINE apr_status_t modperl_wbucket_write(pTHX_ modperl_wbucket_t *b, const char *buf, apr_size_t *wlen); /* generic filter routines */ modperl_filter_t *modperl_filter_new(ap_filter_t *f, apr_bucket_brigade *bb, modperl_filter_mode_e mode, ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes); modperl_filter_t *modperl_filter_mg_get(pTHX_ SV *obj); int modperl_filter_resolve_init_handler(pTHX_ modperl_handler_t *handler, apr_pool_t *p); int modperl_run_filter(modperl_filter_t *filter); /* output filters */ apr_status_t modperl_output_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb); void modperl_output_filter_add_connection(conn_rec *c); void modperl_output_filter_add_request(request_rec *r); MP_INLINE apr_status_t modperl_output_filter_flush(modperl_filter_t *filter); MP_INLINE apr_status_t modperl_input_filter_flush(modperl_filter_t *filter); MP_INLINE apr_size_t modperl_output_filter_read(pTHX_ modperl_filter_t *filter, SV *buffer, apr_size_t wanted); MP_INLINE apr_status_t modperl_output_filter_write(pTHX_ modperl_filter_t *filter, const char *buf, apr_size_t *len); void modperl_brigade_dump(apr_bucket_brigade *bb, apr_file_t *file); /* input filters */ apr_status_t modperl_input_filter_handler(ap_filter_t *f, apr_bucket_brigade *bb, ap_input_mode_t input_mode, apr_read_type_e block, apr_off_t readbytes); void modperl_input_filter_add_connection(conn_rec *c); void modperl_input_filter_add_request(request_rec *r); MP_INLINE apr_size_t modperl_input_filter_read(pTHX_ modperl_filter_t *filter, SV *buffer, apr_size_t wanted); MP_INLINE apr_status_t modperl_input_filter_write(pTHX_ modperl_filter_t *filter, const char *buf, apr_size_t *len); void modperl_filter_runtime_add(pTHX_ request_rec *r, conn_rec *c, const char *name, modperl_filter_mode_e mode, modperl_filter_add_t addfunc, SV *callback, const char *type); #endif /* MODPERL_FILTER_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_global.c0000644000104000010010000002272012540623202022312 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" void modperl_global_request_cfg_set(request_rec *r) { MP_dDCFG; MP_dRCFG; /* only if PerlOptions +GlobalRequest and not done already */ if (MpDirGLOBAL_REQUEST(dcfg) && !MpReqSET_GLOBAL_REQUEST(rcfg)) { modperl_global_request_set(r); } } void modperl_global_request_set(request_rec *r) { MP_dRCFG; request_rec *old_r = NULL; /* reset old value, important for subrequests */ (void)modperl_tls_get_request_rec(&old_r); modperl_tls_reset_cleanup_request_rec(r->pool, old_r); modperl_tls_set_request_rec(r); /* so 'PerlOptions +GlobalRequest' doesnt wipe us out */ MpReqSET_GLOBAL_REQUEST_On(rcfg); } /* get/set */ request_rec *modperl_global_request(pTHX_ SV *svr) { request_rec *cur = NULL; apr_status_t status = modperl_tls_get_request_rec(&cur); if (status != APR_SUCCESS) { /* an internal problem */ Perl_croak(aTHX_ "failed to retrieve the request object"); } if (GIMME_V != G_VOID && !cur) { /* wrong configuration */ Perl_croak(aTHX_ "Global $r object is not available. Set:\n" "\tPerlOptions +GlobalRequest\nin httpd.conf"); } if (svr) { modperl_global_request_obj_set(aTHX_ svr); } return cur; } void modperl_global_request_obj_set(pTHX_ SV *svr) { /* XXX: support sublassing */ request_rec *r = modperl_sv2request_rec(aTHX_ svr); modperl_global_request_set(r); } #if MP_THREADED static apr_status_t modperl_global_cleanup(void *data) { modperl_global_t *global = (modperl_global_t *)data; MP_TRACE_g(MP_FUNC, "destroy lock for %s", global->name); MUTEX_DESTROY(&global->glock); return APR_SUCCESS; } #endif void modperl_global_init(modperl_global_t *global, apr_pool_t *p, void *data, const char *name) { Zero(global, 1, modperl_global_t); global->data = data; global->name = name; #if MP_THREADED MUTEX_INIT(&global->glock); apr_pool_cleanup_register(p, (void *)global, modperl_global_cleanup, apr_pool_cleanup_null); #endif MP_TRACE_g(MP_FUNC, "init %s", name); } void modperl_global_lock(modperl_global_t *global) { #if MP_THREADED MP_TRACE_g(MP_FUNC, "locking %s", global->name); MUTEX_LOCK(&global->glock); #endif } void modperl_global_unlock(modperl_global_t *global) { #if MP_THREADED MP_TRACE_g(MP_FUNC, "unlocking %s", global->name); MUTEX_UNLOCK(&global->glock); #endif } void *modperl_global_get(modperl_global_t *global) { return global->data; } void modperl_global_set(modperl_global_t *global, void *data) { global->data = data; } /* hopefully there wont be many of these */ #define MP_GLOBAL_IMPL(gname, type) \ \ static modperl_global_t MP_global_##gname; \ \ void modperl_global_init_##gname(apr_pool_t *p, \ type gname) \ { \ modperl_global_init(&MP_global_##gname, p, \ (void *)gname, #gname); \ } \ \ void modperl_global_lock_##gname(void) \ { \ modperl_global_lock(&MP_global_##gname); \ } \ \ void modperl_global_unlock_##gname(void) \ { \ modperl_global_unlock(&MP_global_##gname); \ } \ \ type modperl_global_get_##gname(void) \ { \ return (type ) \ modperl_global_get(&MP_global_##gname); \ } \ \ void modperl_global_set_##gname(void *data) \ { \ modperl_global_set(&MP_global_##gname, data); \ } \ MP_GLOBAL_IMPL(pconf, apr_pool_t *) MP_GLOBAL_IMPL(server_rec, server_rec *) /*** anon handlers code ***/ static modperl_global_t MP_global_anon_cnt; void modperl_global_anon_cnt_init(apr_pool_t *p) { int *data = (int *)apr_pcalloc(p, sizeof(int)); *data = 0; modperl_global_init(&MP_global_anon_cnt, p, (void *)data, "anon_cnt"); } int modperl_global_anon_cnt_next(void) { int next; /* XXX: inline lock/unlock? */ modperl_global_lock(&MP_global_anon_cnt); next = ++*(int *)(MP_global_anon_cnt.data); modperl_global_unlock(&MP_global_anon_cnt); return next; } /*** TLS ***/ #if MP_THREADED static apr_status_t modperl_tls_cleanup(void *data) { return apr_threadkey_private_delete((apr_threadkey_t *)data); } #endif apr_status_t modperl_tls_create(apr_pool_t *p, modperl_tls_t **key) { #if MP_THREADED apr_status_t status = apr_threadkey_private_create(key, NULL, p); apr_pool_cleanup_register(p, (void *)*key, modperl_tls_cleanup, apr_pool_cleanup_null); return status; #else *key = apr_pcalloc(p, sizeof(**key)); return APR_SUCCESS; #endif } apr_status_t modperl_tls_get(modperl_tls_t *key, void **data) { #if MP_THREADED if (!key) { *data = NULL; return APR_SUCCESS; } return apr_threadkey_private_get(data, key); #else *data = modperl_global_get((modperl_global_t *)key); return APR_SUCCESS; #endif } apr_status_t modperl_tls_set(modperl_tls_t *key, void *data) { #if MP_THREADED return apr_threadkey_private_set(data, key); #else modperl_global_set((modperl_global_t *)key, data); return APR_SUCCESS; #endif } typedef struct { modperl_tls_t *key; void *data; } modperl_tls_cleanup_data_t; static apr_status_t modperl_tls_reset(void *data) { modperl_tls_cleanup_data_t *cdata = (modperl_tls_cleanup_data_t *)data; return modperl_tls_set(cdata->key, cdata->data); } void modperl_tls_reset_cleanup(apr_pool_t *p, modperl_tls_t *key, void *data) { modperl_tls_cleanup_data_t *cdata = (modperl_tls_cleanup_data_t *)apr_palloc(p, sizeof(*cdata)); cdata->key = key; cdata->data = data; apr_pool_cleanup_register(p, (void *)cdata, modperl_tls_reset, apr_pool_cleanup_null); } /* hopefully there wont be many of these either */ #define MP_TLS_IMPL(gname, type) \ \ static modperl_tls_t *MP_tls_##gname; \ \ apr_status_t \ modperl_tls_create_##gname(apr_pool_t *p) \ { \ return modperl_tls_create(p, &MP_tls_##gname); \ } \ \ apr_status_t modperl_tls_get_##gname(type *data) \ { \ void *ptr; \ apr_status_t status = \ modperl_tls_get(MP_tls_##gname, &ptr); \ *data = (type )ptr; \ return status; \ } \ \ apr_status_t modperl_tls_set_##gname(void *data) \ { \ return modperl_tls_set(MP_tls_##gname, data); \ } \ \ void modperl_tls_reset_cleanup_##gname(apr_pool_t *p, \ type data) \ { \ modperl_tls_reset_cleanup(p, MP_tls_##gname, \ (void *)data); \ } MP_TLS_IMPL(request_rec, request_rec *) /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_global.h0000644000104000010010000000573612540623202022327 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_GLOBAL_H #define MODPERL_GLOBAL_H typedef struct { #if MP_THREADED perl_mutex glock; #endif int flags; void *data; const char *name; } modperl_global_t; #if MP_THREADED typedef apr_threadkey_t modperl_tls_t; #else typedef modperl_global_t modperl_tls_t; #endif void modperl_global_request_cfg_set(request_rec *r); request_rec *modperl_global_request(pTHX_ SV *svr); void modperl_global_request_set(request_rec *r); void modperl_global_request_obj_set(pTHX_ SV *svr); void modperl_global_init(modperl_global_t *global, apr_pool_t *p, void *data, const char *name); void modperl_global_lock(modperl_global_t *global); void modperl_global_unlock(modperl_global_t *global); void *modperl_global_get(modperl_global_t *global); void modperl_global_set(modperl_global_t *global, void *data); #define MP_GLOBAL_DECL(gname, type) \ void modperl_global_init_##gname(apr_pool_t *p, type gname); \ void modperl_global_lock_##gname(void); \ void modperl_global_unlock_##gname(void); \ type modperl_global_get_##gname(void); \ void modperl_global_set_##gname(void *) /* modperl_global_get_pconf returns a thread un-safe object */ MP_GLOBAL_DECL(pconf, apr_pool_t *); /* modperl_global_get_server_rec returns a thread un-safe object */ MP_GLOBAL_DECL(server_rec, server_rec *); void modperl_global_anon_cnt_init(apr_pool_t *p); int modperl_global_anon_cnt_next(void); apr_status_t modperl_tls_create(apr_pool_t *p, modperl_tls_t **key); apr_status_t modperl_tls_get(modperl_tls_t *key, void **data); apr_status_t modperl_tls_set(modperl_tls_t *key, void *data); void modperl_tls_reset_cleanup(apr_pool_t *p, modperl_tls_t *key, void *data); #define MP_TLS_DECL(gname, type) \ apr_status_t modperl_tls_create_##gname(apr_pool_t *p); \ apr_status_t modperl_tls_get_##gname(type *data); \ apr_status_t modperl_tls_set_##gname(void *data); \ void modperl_tls_reset_cleanup_##gname(apr_pool_t *p, type data) MP_TLS_DECL(request_rec, request_rec *); #endif /* MODPERL_GLOBAL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_gtop.c0000644000104000010010000001036312540623202022023 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #ifdef MP_USE_GTOP static int modperl_gtop_size_string(size_t size, char *size_string) { if (size == (size_t)-1) { apr_snprintf(size_string, MP_GTOP_SSS, "-"); } else if (!size) { apr_snprintf(size_string, MP_GTOP_SSS, "0k"); } else if (size < 1024) { apr_snprintf(size_string, MP_GTOP_SSS, "1k"); } else if (size < 1048576) { apr_snprintf(size_string, MP_GTOP_SSS, "%dk", (int)(size + 512) / 1024); } else if (size < 103809024) { apr_snprintf(size_string, MP_GTOP_SSS, "%.1fM", size / 1048576.0); } else { apr_snprintf(size_string, MP_GTOP_SSS, "%dM", (int)(size + 524288) / 1048576); } return 1; } static apr_status_t modperl_gtop_exit(void *data) { glibtop_close(); return APR_SUCCESS; } modperl_gtop_t *modperl_gtop_new(apr_pool_t *p) { modperl_gtop_t *gtop = (modperl_gtop_t *)apr_pcalloc(p, sizeof(*gtop)); gtop->pid = getpid(); glibtop_init(); apr_pool_cleanup_register(p, NULL, modperl_gtop_exit, apr_pool_cleanup_null); return gtop; } void modperl_gtop_get_proc_mem_before(modperl_gtop_t *gtop) { glibtop_get_proc_mem(>op->before.proc_mem, gtop->pid); } void modperl_gtop_get_proc_mem_after(modperl_gtop_t *gtop) { glibtop_get_proc_mem(>op->after.proc_mem, gtop->pid); } #define modperl_gtop_diff(item) \ (gtop->after.item - gtop->before.item) #define ss_fmt "size=%s, vsize=%s, resident=%s, share=%s, rss=%s" #define SS_TYPE_BEFORE 1 #define SS_TYPE_AFTER 2 #define SS_TYPE_DIFF 3 /* * XXX: this is pretty ugly, * but avoids allocating buffers for the size string */ static void modperl_gtop_proc_mem_size_string(modperl_gtop_t *gtop, int type) { int is_diff = (type == SS_TYPE_DIFF); glibtop_proc_mem *pm = NULL; if (!is_diff) { pm = (type == SS_TYPE_BEFORE) ? >op->before.proc_mem : >op->after.proc_mem; } #define ss_call(item) \ modperl_gtop_size_string(is_diff ? \ modperl_gtop_diff(proc_mem.item) : pm->item, \ gtop->proc_mem_ss.item) ss_call(size); ss_call(vsize); ss_call(resident); ss_call(share); ss_call(rss); #undef ss_call } void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop, char *when, const char *func, char *msg) { #define ss_item(item) gtop->proc_mem_ss.item fprintf(stderr, "%s : %s %s: " ss_fmt "\n", func, (msg ? msg : ""), when, ss_item(size), ss_item(vsize), ss_item(resident), ss_item(share), ss_item(rss)); #undef ss_item } void modperl_gtop_report_proc_mem_diff(modperl_gtop_t *gtop, const char *func, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_DIFF); modperl_gtop_report_proc_mem(gtop, "diff", func, msg); } void modperl_gtop_report_proc_mem_before(modperl_gtop_t *gtop, const char *func, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_BEFORE); modperl_gtop_report_proc_mem(gtop, "before", func, msg); } void modperl_gtop_report_proc_mem_after(modperl_gtop_t *gtop, const char *func, char *msg) { modperl_gtop_proc_mem_size_string(gtop, SS_TYPE_AFTER); modperl_gtop_report_proc_mem(gtop, "after", func, msg); } #endif /* MP_USE_GTOP */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_gtop.h0000644000104000010010000000522412540623202022030 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_GTOP_H #define MODPERL_GTOP_H #ifndef MP_TRACE # undef MP_USE_GTOP #endif #ifdef MP_USE_GTOP /* prevent undef symbol errors (glibtop_error_vr) */ #define __GLIBTOP_ERROR_H__ #include #include #include #ifndef GTOP_2_5_PLUS #include #endif #include #include #include #define MP_GTOP_SSS 16 typedef struct { char size[MP_GTOP_SSS]; char vsize[MP_GTOP_SSS]; char resident[MP_GTOP_SSS]; char share[MP_GTOP_SSS]; char rss[MP_GTOP_SSS]; } modperl_gtop_proc_mem_ss; typedef struct { glibtop_union before; glibtop_union after; pid_t pid; modperl_gtop_proc_mem_ss proc_mem_ss; } modperl_gtop_t; modperl_gtop_t *modperl_gtop_new(apr_pool_t *p); void modperl_gtop_get_proc_mem_before(modperl_gtop_t *gtop); void modperl_gtop_get_proc_mem_after(modperl_gtop_t *gtop); void modperl_gtop_report_proc_mem(modperl_gtop_t *gtop, char *when, const char *func, char *msg); void modperl_gtop_report_proc_mem_diff(modperl_gtop_t *gtop, const char* func, char *msg); void modperl_gtop_report_proc_mem_before(modperl_gtop_t *gtop, const char* func, char *msg); void modperl_gtop_report_proc_mem_after(modperl_gtop_t *gtop, const char* func, char *msg); #define modperl_gtop_do_proc_mem_before(func, msg) \ modperl_gtop_get_proc_mem_before(scfg->gtop); \ modperl_gtop_report_proc_mem_before(scfg->gtop, func, msg) #define modperl_gtop_do_proc_mem_after(func, msg) \ modperl_gtop_get_proc_mem_after(scfg->gtop); \ modperl_gtop_report_proc_mem_after(scfg->gtop, func, msg); \ modperl_gtop_report_proc_mem_diff(scfg->gtop, func, msg) #endif /* MP_USE_GTOP */ #endif /* MODPERL_GTOP_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_handler.c0000644000104000010010000004566512540623202022504 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" modperl_handler_t *modperl_handler_new(apr_pool_t *p, const char *name) { modperl_handler_t *handler = (modperl_handler_t *)apr_pcalloc(p, sizeof(*handler)); switch (*name) { case '+': ++name; MpHandlerAUTOLOAD_On(handler); break; case '-': ++name; /* XXX: currently a noop; should disable autoload of given handler * if PerlOptions +AutoLoad is configured * see: modperl_hash_handlers in modperl_mgv.c */ MpHandlerAUTOLOAD_Off(handler); break; } /* not necessary due to apr_pcalloc */ /* handler->cv = NULL; */ handler->name = name; MP_TRACE_h(MP_FUNC, "new handler %s", handler->name); return handler; } /* How anon-subs are handled: * We have two ways anon-subs can be registered * A) at startup from httpd.conf: * PerlTransHandler 'sub { ... }' * B) run-time perl code * $r->push_handlers(PerlTransHandler => sub { .... }); * $s->push_handlers(PerlTransHandler => sub { .... }); * * In the case of non-threaded perl, we just compile A or grab B and * store it in the mod_perl struct and call it when it's used. No * problems here * * In the case of threads, things get more complicated. we no longer * can store the CV value of the compiled anon-sub, since when * perl_clone is called each interpreter will have a different CV * value. since we need to be able to have 1 entry for each anon-sub * across all interpreters a different solution is needed. to remind * in the case of named subs, we just store the name of the sub and * look its corresponding CV when we need it. * * The used solution: each process has a global counter, which always * grows. Every time a new anon-sub is encountered, a new ID is * allocated from that process-global counter and that ID is stored in * the mod_perl struct. The compiled CV is stored as * $PL_modglobal{ANONSUB}{$id} = CV; * when perl_clone is called, each clone will clone that CV value, but * we will still be able to find it, since we stored it in the * hash. so we retrieve the CV value, whatever it is and we run it. * * that explanation can be written and run in perl: * * use threads; * our %h; * $h{x} = eval 'sub { print qq[this is sub @_\n] }'; * $h{x}->("main"); * threads->new(sub { $h{x}->(threads->self->tid)}); * * XXX: more nuances will follow */ void modperl_handler_anon_init(pTHX_ apr_pool_t *p) { modperl_modglobal_key_t *gkey = modperl_modglobal_lookup(aTHX_ "ANONSUB"); MP_TRACE_h(MP_FUNC, "init $PL_modglobal{ANONSUB} = []"); (void)MP_MODGLOBAL_STORE_HV(gkey); } /* allocate and populate the anon handler sub-struct */ MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p) { /* re-use modperl_mgv_t entry which is otherwise is not used * by anon handlers */ modperl_mgv_t *anon = (modperl_mgv_t *)apr_pcalloc(p, sizeof(*anon)); anon->name = apr_psprintf(p, "anon%d", modperl_global_anon_cnt_next()); anon->len = strlen(anon->name); PERL_HASH(anon->hash, anon->name, anon->len); MP_TRACE_h(MP_FUNC, "new anon handler: '%s'", anon->name); return anon; } MP_INLINE void modperl_handler_anon_add(pTHX_ modperl_mgv_t *anon, CV *cv) { modperl_modglobal_key_t *gkey = modperl_modglobal_lookup(aTHX_ "ANONSUB"); HE *he = MP_MODGLOBAL_FETCH(gkey); HV *hv; if (!(he && (hv = (HV*)HeVAL(he)))) { Perl_croak(aTHX_ "modperl_handler_anon_add: " "can't find ANONSUB top entry (get)"); } SvREFCNT_inc(cv); if (!(*hv_store(hv, anon->name, anon->len, (SV*)cv, anon->hash))) { SvREFCNT_dec(cv); Perl_croak(aTHX_ "hv_store of anonsub '%s' has failed!", anon->name); } MP_TRACE_h(MP_FUNC, "anonsub '%s' added", anon->name); } MP_INLINE CV *modperl_handler_anon_get(pTHX_ modperl_mgv_t *anon) { modperl_modglobal_key_t *gkey = modperl_modglobal_lookup(aTHX_ "ANONSUB"); HE *he = MP_MODGLOBAL_FETCH(gkey); HV *hv; SV *sv; if (!(he && (hv = (HV*)HeVAL(he)))) { Perl_croak(aTHX_ "modperl_handler_anon_get: " "can't find ANONSUB top entry (get)"); } if ((he = hv_fetch_he(hv, anon->name, anon->len, anon->hash))) { sv = HeVAL(he); MP_TRACE_h(MP_FUNC, "anonsub gets name '%s'", anon->name); } else { Perl_croak(aTHX_ "can't find ANONSUB's '%s' entry", anon->name); } return (CV*)sv; } static modperl_handler_t *modperl_handler_new_anon(pTHX_ apr_pool_t *p, CV *cv) { modperl_handler_t *handler = (modperl_handler_t *)apr_pcalloc(p, sizeof(*handler)); MpHandlerPARSED_On(handler); MpHandlerANON_On(handler); #ifdef USE_ITHREADS handler->cv = NULL; handler->name = NULL; handler->mgv_obj = modperl_handler_anon_next(aTHX_ p); modperl_handler_anon_add(aTHX_ handler->mgv_obj, cv); #else /* it's safe to cache and later use the cv, since the same perl * interpeter is always used */ SvREFCNT_inc((SV*)cv); handler->cv = cv; handler->name = NULL; MP_TRACE_h(MP_FUNC, "new cached cv anon handler"); #endif return handler; } MP_INLINE const char *modperl_handler_name(modperl_handler_t *handler) { /* a handler containing an anonymous sub doesn't have a normal sub * name */ if (handler->name) { return handler->name; } else { /* anon sub stores the internal modperl name in mgv_obj */ return handler->mgv_obj ? handler->mgv_obj->name : "anonsub"; } } int modperl_handler_resolve(pTHX_ modperl_handler_t **handp, apr_pool_t *p, server_rec *s) { int duped=0; modperl_handler_t *handler = *handp; #ifdef USE_ITHREADS if (modperl_threaded_mpm() && p && !MpHandlerPARSED(handler) && !MpHandlerDYNAMIC(handler)) { /* * under threaded mpm we cannot update the handler structure * at request time without locking, so just copy it */ handler = *handp = modperl_handler_dup(p, handler); duped = 1; } #endif MP_TRACE_h_do(MpHandler_dump_flags(handler, modperl_handler_name(handler))); if (!MpHandlerPARSED(handler)) { apr_pool_t *rp = duped ? p : s->process->pconf; MpHandlerAUTOLOAD_On(handler); MP_TRACE_h(MP_FUNC, "[%s] handler %s hasn't yet been resolved, " "attempting to resolve using %s pool 0x%lx", modperl_server_desc(s, p), modperl_handler_name(handler), duped ? "current" : "server conf", (unsigned long)rp); if (!modperl_mgv_resolve(aTHX_ handler, rp, handler->name, FALSE)) { modperl_errsv_prepend(aTHX_ "failed to resolve handler `%s': ", handler->name); return HTTP_INTERNAL_SERVER_ERROR; } } return OK; } modperl_handler_t *modperl_handler_dup(apr_pool_t *p, modperl_handler_t *h) { MP_TRACE_h(MP_FUNC, "dup handler %s", modperl_handler_name(h)); return modperl_handler_new(p, h->name); } int modperl_handler_equal(modperl_handler_t *h1, modperl_handler_t *h2) { if (h1->mgv_cv && h2->mgv_cv) { return modperl_mgv_equal(h1->mgv_cv, h2->mgv_cv); } return strEQ(h1->name, h2->name); } MpAV *modperl_handler_array_merge(apr_pool_t *p, MpAV *base_a, MpAV *add_a) { int i, j; modperl_handler_t **base_h, **add_h; MpAV *mrg_a; if (!add_a) { return base_a; } if (!base_a) { return add_a; } mrg_a = apr_array_copy(p, base_a); base_h = (modperl_handler_t **)base_a->elts; add_h = (modperl_handler_t **)add_a->elts; for (i=0; inelts; i++) { for (j=0; jnelts; j++) { if (modperl_handler_equal(base_h[i], add_h[j])) { MP_TRACE_d(MP_FUNC, "both base and new config contain %s", add_h[j]->name); } else { modperl_handler_array_push(mrg_a, add_h[j]); MP_TRACE_d(MP_FUNC, "base does not contain %s", add_h[j]->name); } } } return mrg_a; } void modperl_handler_make_args(pTHX_ AV **avp, ...) { va_list args; if (!*avp) { *avp = newAV(); /* XXX: cache an intialized AV* per-request */ } va_start(args, avp); for (;;) { char *classname = va_arg(args, char *); void *ptr; SV *sv; if (classname == NULL) { break; } ptr = va_arg(args, void *); switch (*classname) { case 'A': if (strEQ(classname, "APR::Table")) { sv = modperl_hash_tie(aTHX_ classname, (SV *)NULL, ptr); break; } case 'I': if (strEQ(classname, "IV")) { sv = ptr ? newSViv(PTR2IV(ptr)) : &PL_sv_undef; break; } case 'P': if (strEQ(classname, "PV")) { sv = ptr ? newSVpv((char *)ptr, 0) : &PL_sv_undef; break; } case 'H': if (strEQ(classname, "HV")) { sv = newRV_noinc((SV*)ptr); break; } default: sv = modperl_ptr2obj(aTHX_ classname, ptr); break; } av_push(*avp, sv); } va_end(args); } #define set_desc(dtype) \ if (desc) *desc = modperl_handler_desc_##dtype(idx) /* We should be able to use PERL_GET_CONTEXT here. The rcfg condition * makes sure there is a request being processed. The action > GET part * means it is a $r->set_handlers or $r->push_handlers operation. This * can only happen if called by perl code. */ #define check_modify(dtype) \ if ((action > MP_HANDLER_ACTION_GET) && rcfg) { \ dTHXa(PERL_GET_CONTEXT); \ MP_ASSERT(aTHX+0); \ Perl_croak(aTHX_ "too late to modify %s handlers", \ modperl_handler_desc_##dtype(idx)); \ } /* * generic function to lookup handlers for use in modperl_callback(), * $r->{push,set,get}_handlers, $s->{push,set,get}_handlers * $s->push/set at startup time are the same as configuring Perl*Handlers * $r->push/set at request time will create entries in r->request_config * push will first merge with configured handlers, unless an entry * in r->request_config already exists. in this case, push or set has * already been called for the given handler, * r->request_config entries then override those in r->per_dir_config */ MpAV **modperl_handler_lookup_handlers(modperl_config_dir_t *dcfg, modperl_config_srv_t *scfg, modperl_config_req_t *rcfg, apr_pool_t *p, int type, int idx, modperl_handler_action_e action, const char **desc) { MpAV **avp = NULL, **ravp = NULL; switch (type) { case MP_HANDLER_TYPE_PER_DIR: avp = &dcfg->handlers_per_dir[idx]; if (rcfg) { ravp = &rcfg->handlers_per_dir[idx]; } set_desc(per_dir); break; case MP_HANDLER_TYPE_PER_SRV: avp = &scfg->handlers_per_srv[idx]; if (rcfg) { ravp = &rcfg->handlers_per_srv[idx]; } set_desc(per_srv); break; case MP_HANDLER_TYPE_PRE_CONNECTION: avp = &scfg->handlers_pre_connection[idx]; check_modify(pre_connection); set_desc(pre_connection); break; case MP_HANDLER_TYPE_CONNECTION: avp = &scfg->handlers_connection[idx]; check_modify(connection); set_desc(connection); break; case MP_HANDLER_TYPE_FILES: avp = &scfg->handlers_files[idx]; check_modify(files); set_desc(files); break; case MP_HANDLER_TYPE_PROCESS: avp = &scfg->handlers_process[idx]; check_modify(files); set_desc(process); break; }; if (!avp) { /* should never happen */ #if 0 fprintf(stderr, "PANIC: no such handler type: %d\n", type); #endif return NULL; } switch (action) { case MP_HANDLER_ACTION_GET: /* just a lookup */ break; case MP_HANDLER_ACTION_PUSH: if (ravp) { if (!*ravp) { if (*avp) { /* merge with existing configured handlers */ *ravp = apr_array_copy(p, *avp); } else { /* no request handlers have been previously pushed or set */ *ravp = modperl_handler_array_new(p); } } } else if (!*avp) { /* directly modify the configuration at startup time */ *avp = modperl_handler_array_new(p); } break; case MP_HANDLER_ACTION_SET: if (ravp) { if (*ravp) { /* wipe out existing pushed/set request handlers */ (*ravp)->nelts = 0; } else { /* no request handlers have been previously pushed or set */ *ravp = modperl_handler_array_new(p); } } else if (*avp) { /* wipe out existing configuration, only at startup time */ (*avp)->nelts = 0; } else { /* no configured handlers for this phase */ *avp = modperl_handler_array_new(p); } break; } return (ravp && *ravp) ? ravp : avp; } MpAV **modperl_handler_get_handlers(request_rec *r, conn_rec *c, server_rec *s, apr_pool_t *p, const char *name, modperl_handler_action_e action) { MP_dSCFG(s); MP_dDCFG; MP_dRCFG; int idx, type; if (!r) { /* so $s->{push,set}_handlers can configured request-time handlers */ dcfg = modperl_config_dir_get_defaults(s); } if ((idx = modperl_handler_lookup(name, &type)) == DECLINED) { return FALSE; } return modperl_handler_lookup_handlers(dcfg, scfg, rcfg, p, type, idx, action, NULL); } modperl_handler_t *modperl_handler_new_from_sv(pTHX_ apr_pool_t *p, SV *sv) { char *name = NULL; GV *gv; if (SvROK(sv)) { sv = SvRV(sv); } switch (SvTYPE(sv)) { case SVt_PV: name = SvPVX(sv); return modperl_handler_new(p, apr_pstrdup(p, name)); break; case SVt_PVCV: if (CvANON((CV*)sv)) { return modperl_handler_new_anon(aTHX_ p, (CV*)sv); } if (!(gv = CvGV((CV*)sv))) { Perl_croak(aTHX_ "can't resolve the code reference"); } name = apr_pstrcat(p, HvNAME(GvSTASH(gv)), "::", GvNAME(gv), NULL); return modperl_handler_new(p, name); default: break; }; return NULL; } int modperl_handler_push_handlers(pTHX_ apr_pool_t *p, MpAV *handlers, SV *sv) { modperl_handler_t *handler = modperl_handler_new_from_sv(aTHX_ p, sv); if (handler) { modperl_handler_array_push(handlers, handler); return TRUE; } MP_TRACE_h(MP_FUNC, "unable to push_handler 0x%lx", (unsigned long)sv); return FALSE; } /* convert array header of modperl_handlers_t's to AV ref of CV refs */ SV *modperl_handler_perl_get_handlers(pTHX_ MpAV **handp, apr_pool_t *p) { AV *av = newAV(); int i; modperl_handler_t **handlers; if (!(handp && *handp)) { return &PL_sv_undef; } av_extend(av, (*handp)->nelts - 1); handlers = (modperl_handler_t **)(*handp)->elts; for (i=0; i<(*handp)->nelts; i++) { modperl_handler_t *handler = NULL; GV *gv; if (MpHandlerPARSED(handlers[i])) { handler = handlers[i]; } else { #ifdef USE_ITHREADS if (!MpHandlerDYNAMIC(handlers[i])) { handler = modperl_handler_dup(p, handlers[i]); } #endif if (!handler) { handler = handlers[i]; } if (!modperl_mgv_resolve(aTHX_ handler, p, handler->name, TRUE)) { MP_TRACE_h(MP_FUNC, "failed to resolve handler %s", handler->name); } } if (handler->mgv_cv) { if ((gv = modperl_mgv_lookup(aTHX_ handler->mgv_cv))) { CV *cv = modperl_mgv_cv(gv); av_push(av, newRV_inc((SV*)cv)); } } else { av_push(av, newSVpv(handler->name, 0)); } } return newRV_noinc((SV*)av); } #define push_sv_handler \ if ((modperl_handler_push_handlers(aTHX_ p, *handlers, sv))) { \ MpHandlerDYNAMIC_On(modperl_handler_array_last(*handlers)); \ } /* allow push/set of single cv ref or array ref of cv refs */ int modperl_handler_perl_add_handlers(pTHX_ request_rec *r, conn_rec *c, server_rec *s, apr_pool_t *p, const char *name, SV *sv, modperl_handler_action_e action) { I32 i; AV *av = (AV *)NULL; MpAV **handlers = modperl_handler_get_handlers(r, c, s, p, name, action); if (!(handlers && *handlers)) { return FALSE; } if (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVAV)) { av = (AV*)SvRV(sv); for (i=0; i <= AvFILL(av); i++) { sv = *av_fetch(av, i, FALSE); push_sv_handler; } } else { push_sv_handler; } return TRUE; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_handler.h0000644000104000010010000000720412540623202022474 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_HANDLER_H #define MODPERL_HANDLER_H typedef enum { MP_HANDLER_ACTION_GET, MP_HANDLER_ACTION_PUSH, MP_HANDLER_ACTION_SET } modperl_handler_action_e; void modperl_handler_anon_init(pTHX_ apr_pool_t *p); MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p); MP_INLINE void modperl_handler_anon_add(pTHX_ modperl_mgv_t *anon, CV *cv); MP_INLINE CV *modperl_handler_anon_get(pTHX_ modperl_mgv_t *anon); #define modperl_handler_array_new(p) \ apr_array_make(p, 1, sizeof(modperl_handler_t *)) #define modperl_handler_array_push(handlers, h) \ *(modperl_handler_t **)apr_array_push(handlers) = h #define modperl_handler_array_item(handlers, idx) \ ((modperl_handler_t **)(handlers)->elts)[idx] #define modperl_handler_array_last(handlers) \ modperl_handler_array_item(handlers, ((handlers)->nelts - 1)) modperl_handler_t *modperl_handler_new(apr_pool_t *p, const char *name); modperl_handler_t *modperl_handler_new_from_sv(pTHX_ apr_pool_t *p, SV *sv); MP_INLINE const char *modperl_handler_name(modperl_handler_t *handler); int modperl_handler_resolve(pTHX_ modperl_handler_t **handp, apr_pool_t *p, server_rec *s); modperl_handler_t *modperl_handler_dup(apr_pool_t *p, modperl_handler_t *h); int modperl_handler_equal(modperl_handler_t *h1, modperl_handler_t *h2); MpAV *modperl_handler_array_merge(apr_pool_t *p, MpAV *base_a, MpAV *add_a); void modperl_handler_make_args(pTHX_ AV **avp, ...); MpAV **modperl_handler_lookup_handlers(modperl_config_dir_t *dcfg, modperl_config_srv_t *scfg, modperl_config_req_t *rcfg, apr_pool_t *p, int type, int idx, modperl_handler_action_e action, const char **desc); MpAV **modperl_handler_get_handlers(request_rec *r, conn_rec *c,server_rec *s, apr_pool_t *p, const char *name, modperl_handler_action_e action); int modperl_handler_push_handlers(pTHX_ apr_pool_t *p, MpAV *handlers, SV *sv); SV *modperl_handler_perl_get_handlers(pTHX_ MpAV **handp, apr_pool_t *p); int modperl_handler_perl_add_handlers(pTHX_ request_rec *r, conn_rec *c, server_rec *s, apr_pool_t *p, const char *name, SV *sv, modperl_handler_action_e action); #endif /* MODPERL_HANDLER_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_interp.c0000644000104000010010000004106012540623202022351 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* * XXX: this is not the most efficent interpreter pool implementation * but it will do for proof-of-concept */ #ifdef USE_ITHREADS void modperl_interp_clone_init(modperl_interp_t *interp) { dTHXa(interp->perl); MpInterpCLONED_On(interp); MP_ASSERT_CONTEXT(aTHX); /* clear @DynaLoader::dl_librefs so we only dlclose() those * which are opened by the clone */ modperl_xs_dl_handles_clear(aTHX); } modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip, PerlInterpreter *perl) { UV clone_flags = CLONEf_KEEP_PTR_TABLE; modperl_interp_t *interp = (modperl_interp_t *)malloc(sizeof(*interp)); memset(interp, '\0', sizeof(*interp)); interp->mip = mip; interp->refcnt = 0; if (perl) { #ifdef MP_USE_GTOP MP_dSCFG(mip->server); MP_TRACE_m_do( modperl_gtop_do_proc_mem_before(MP_FUNC, "perl_clone"); ); #endif #if defined(WIN32) && defined(CLONEf_CLONE_HOST) clone_flags |= CLONEf_CLONE_HOST; #endif PERL_SET_CONTEXT(perl); interp->perl = perl_clone(perl, clone_flags); MP_ASSERT_CONTEXT(interp->perl); { PTR_TBL_t *source = modperl_module_config_table_get(perl, FALSE); if (source) { PTR_TBL_t *table = modperl_svptr_table_clone(interp->perl, perl, source); modperl_module_config_table_set(interp->perl, table); } } /* * we keep the PL_ptr_table past perl_clone so it can be used * within modperl_svptr_table_clone. Perl_sv_dup() uses it. * Don't confuse our svptr_table with Perl's ptr_table. They * are different things, although they use the same type. */ if ((clone_flags & CLONEf_KEEP_PTR_TABLE)) { dTHXa(interp->perl); ptr_table_free(PL_ptr_table); PL_ptr_table = NULL; } modperl_interp_clone_init(interp); PERL_SET_CONTEXT(perl); #ifdef MP_USE_GTOP MP_TRACE_m_do( modperl_gtop_do_proc_mem_after(MP_FUNC, "perl_clone"); ); #endif } MP_TRACE_i(MP_FUNC, "0x%lx / perl: 0x%lx / parent perl: 0x%lx", (unsigned long)interp, (unsigned long)interp->perl, (unsigned long)perl); return interp; } void modperl_interp_destroy(modperl_interp_t *interp) { void **handles; dTHXa(interp->perl); PERL_SET_CONTEXT(interp->perl); MP_TRACE_i(MP_FUNC, "interp == 0x%lx / perl: 0x%lx", (unsigned long)interp, (unsigned long)interp->perl); if (MpInterpIN_USE(interp)) { MP_TRACE_i(MP_FUNC, "*error - still in use!*"); } handles = modperl_xs_dl_handles_get(aTHX); modperl_perl_destruct(interp->perl); modperl_xs_dl_handles_close(handles); free(interp); } apr_status_t modperl_interp_cleanup(void *data) { modperl_interp_destroy((modperl_interp_t *)data); return APR_SUCCESS; } modperl_interp_t *modperl_interp_get(server_rec *s) { MP_dSCFG(s); modperl_interp_t *interp = NULL; modperl_interp_pool_t *mip = scfg->mip; modperl_list_t *head; head = modperl_tipool_pop(mip->tipool); interp = (modperl_interp_t *)head->data; MP_TRACE_i(MP_FUNC, "head == 0x%lx, parent == 0x%lx", (unsigned long)head, (unsigned long)mip->parent); MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)", (unsigned long)interp, (unsigned long)interp->perl); #ifdef MP_TRACE interp->tid = MP_TIDF; MP_TRACE_i(MP_FUNC, "thread == 0x%lx", interp->tid); #endif MpInterpIN_USE_On(interp); return interp; } apr_status_t modperl_interp_pool_destroy(void *data) { modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data; if (mip->tipool) { modperl_tipool_destroy(mip->tipool); mip->tipool = NULL; } if (MpInterpBASE(mip->parent)) { /* multiple mips might share the same parent * make sure its only destroyed once */ MP_TRACE_i(MP_FUNC, "parent == 0x%lx", (unsigned long)mip->parent); modperl_interp_destroy(mip->parent); } return APR_SUCCESS; } static void *interp_pool_grow(modperl_tipool_t *tipool, void *data) { modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data; MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool"); return (void *)modperl_interp_new(mip, mip->parent->perl); } static void interp_pool_shrink(modperl_tipool_t *tipool, void *data, void *item) { modperl_interp_destroy((modperl_interp_t *)item); } static void interp_pool_dump(modperl_tipool_t *tipool, void *data, modperl_list_t *listp) { while (listp) { modperl_interp_t *interp = (modperl_interp_t *)listp->data; MP_TRACE_i(MP_FUNC, "listp==0x%lx, interp==0x%lx, requests=%d", (unsigned long)listp, (unsigned long)interp, interp->num_requests); listp = listp->next; } } static modperl_tipool_vtbl_t interp_pool_func = { interp_pool_grow, interp_pool_grow, interp_pool_shrink, interp_pool_shrink, interp_pool_dump, }; void modperl_interp_init(server_rec *s, apr_pool_t *p, PerlInterpreter *perl) { apr_pool_t *server_pool = modperl_server_pool(); pTHX; MP_dSCFG(s); modperl_interp_pool_t *mip = (modperl_interp_pool_t *)apr_pcalloc(p, sizeof(*mip)); MP_TRACE_i(MP_FUNC, "server=%s", modperl_server_desc(s, p)); if (modperl_threaded_mpm()) { mip->tipool = modperl_tipool_new(p, scfg->interp_pool_cfg, &interp_pool_func, mip); } mip->server = s; mip->parent = modperl_interp_new(mip, NULL); aTHX = mip->parent->perl = perl; /* this happens post-config in mod_perl.c:modperl_init_clones() */ /* modperl_tipool_init(tipool); */ apr_pool_cleanup_register(server_pool, (void*)mip, modperl_interp_pool_destroy, apr_pool_cleanup_null); scfg->mip = mip; } apr_status_t modperl_interp_unselect(void *data) { modperl_interp_t *interp = (modperl_interp_t *)data; modperl_interp_pool_t *mip = interp->mip; MP_ASSERT(interp && MpInterpIN_USE(interp) && interp->refcnt > 0); MP_TRACE_i(MP_FUNC, "unselect(interp=%pp): refcnt=%d", interp, interp->refcnt); --interp->refcnt; if (interp->refcnt > 0) { MP_TRACE_i(MP_FUNC, "interp=0x%lx, refcnt=%d -- interp still in use", (unsigned long)interp, interp->refcnt); return APR_SUCCESS; } if (!MpInterpIN_USE(interp)){ MP_TRACE_i(MP_FUNC, "interp=0x%pp, refcnt=%d -- interp already not in use", interp, interp->refcnt); return APR_SUCCESS; } MpInterpIN_USE_Off(interp); modperl_thx_interp_set(interp->perl, NULL); #ifdef MP_DEBUG PERL_SET_CONTEXT(NULL); #endif if (interp == mip->parent) { MP_TRACE_i(MP_FUNC, "parent interp=%pp freed", interp); } else { interp->ccfg->interp = NULL; modperl_tipool_putback_data(mip->tipool, data, interp->num_requests); MP_TRACE_i(MP_FUNC, "interp=%pp freed, tipool(size=%ld, in_use=%ld)", interp, mip->tipool->size, mip->tipool->in_use); } return APR_SUCCESS; } /* XXX: * interp is marked as in_use for the scope of the pool it is * stashed in. this is done to avoid the tipool->tlock whenever * possible. neither approach is ideal. */ #define MP_INTERP_KEY "MODPERL_INTERP" #define get_interp(p) \ (void)apr_pool_userdata_get((void **)&interp, MP_INTERP_KEY, p) #define set_interp(p) \ (void)apr_pool_userdata_set((void *)interp, MP_INTERP_KEY, \ modperl_interp_unselect, \ p) modperl_interp_t *modperl_interp_pool_get(apr_pool_t *p) { modperl_interp_t *interp = NULL; get_interp(p); return interp; } void modperl_interp_pool_set(apr_pool_t *p, modperl_interp_t *interp) { (void)apr_pool_userdata_set((void *)interp, MP_INTERP_KEY, NULL, p); } /* * used in the case where we don't have a request_rec or conn_rec, * such as for directive handlers per-{dir,srv} create and merge. * "request time pool" is most likely a request_rec->pool. */ modperl_interp_t *modperl_interp_pool_select(apr_pool_t *p, server_rec *s) { int is_startup = (p == s->process->pconf); modperl_interp_t *interp = NULL; if (is_startup) { MP_dSCFG(s); if (scfg) { MP_TRACE_i(MP_FUNC, "using parent interpreter at startup"); if (!scfg->mip) { /* we get here if directive handlers are invoked * before server merge. */ modperl_init_vhost(s, p, NULL); if (!scfg->mip) { /* FIXME: We get here if global "server_rec" == s, scfg->mip * is not created then. I'm not sure if that's bug or * bad/good design decicision. For now just return NULL. */ return NULL; } } interp = scfg->mip->parent; } else { if (!(interp = modperl_interp_pool_get(p))) { interp = modperl_interp_get(s); modperl_interp_pool_set(p, interp); MP_TRACE_i(MP_FUNC, "set interp %pp in pconf pool %pp", interp, p); } else { MP_TRACE_i(MP_FUNC, "found interp %pp in pconf pool %pp", interp, p); } } MpInterpIN_USE_On(interp); interp->refcnt++; /* set context (THX) for this thread */ PERL_SET_CONTEXT(interp->perl); /* let the perl interpreter point back to its interp */ modperl_thx_interp_set(interp->perl, interp); return interp; } else { request_rec *r; apr_pool_userdata_get((void **)&r, "MODPERL_R", p); MP_ASSERT(r); MP_TRACE_i(MP_FUNC, "found userdata MODPERL_R in pool %#lx as %lx", (unsigned long)r->pool, (unsigned long)r); return modperl_interp_select(r, NULL, NULL); } } modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c, server_rec *s) { MP_dSCFG((r ? s=r->server : c ? s=c->base_server : s)); MP_dDCFG; modperl_config_con_t *ccfg; const char *desc = NULL; modperl_interp_t *interp = NULL; apr_pool_t *p = NULL; /* What does the following condition mean? * (r || c): if true we are at runtime. There is some kind of request * being processed. * threaded_mpm: self-explanatory * * Thus, it is true if we are either at initialization time or at runtime * but with prefork-MPM. */ if (!((r || c) && modperl_threaded_mpm())) { interp = scfg->mip->parent; MpInterpIN_USE_On(interp); interp->refcnt++; /* XXX: if no VirtualHosts w/ PerlOptions +Parent we can skip this */ PERL_SET_CONTEXT(interp->perl); /* let the perl interpreter point back to its interp */ modperl_thx_interp_set(interp->perl, interp); MP_TRACE_i(MP_FUNC, "using parent 0x%pp (perl=0x%pp) for %s:%d refcnt set to %d", interp, interp->perl, s->server_hostname, s->port, interp->refcnt); return interp; } if(!c) c = r->connection; ccfg = modperl_config_con_get(c); if (ccfg && ccfg->interp) { ccfg->interp->refcnt++; MP_TRACE_i(MP_FUNC, "found interp 0x%lx in con config, refcnt incremented to %d", (unsigned long)ccfg->interp, ccfg->interp->refcnt); /* set context (THX) for this thread */ PERL_SET_CONTEXT(ccfg->interp->perl); /* modperl_thx_interp_set() is not called here because the interp * already belongs to the perl interpreter */ return ccfg->interp; } MP_TRACE_i(MP_FUNC, "fetching interp for %s:%d", s->server_hostname, s->port); interp = modperl_interp_get(s); MP_TRACE_i(MP_FUNC, " --> got %pp (perl=%pp)", interp, interp->perl); ++interp->num_requests; /* should only get here once per request */ interp->refcnt = 1; /* set context (THX) for this thread */ PERL_SET_CONTEXT(interp->perl); /* let the perl interpreter point back to its interp */ modperl_thx_interp_set(interp->perl, interp); /* make sure ccfg is initialized */ modperl_config_con_init(c, ccfg); ccfg->interp = interp; interp->ccfg = ccfg; MP_TRACE_i(MP_FUNC, "pulled interp %pp (perl=%pp) from mip, num_requests is %d", interp, interp->perl, interp->num_requests); return interp; } /* currently up to the caller if mip needs locking */ void modperl_interp_mip_walk(PerlInterpreter *current_perl, PerlInterpreter *parent_perl, modperl_interp_pool_t *mip, modperl_interp_mip_walker_t walker, void *data) { modperl_list_t *head = mip->tipool ? mip->tipool->idle : NULL; if (!current_perl) { current_perl = PERL_GET_CONTEXT; } if (parent_perl) { PERL_SET_CONTEXT(parent_perl); walker(parent_perl, mip, data); } while (head) { PerlInterpreter *perl = ((modperl_interp_t *)head->data)->perl; PERL_SET_CONTEXT(perl); walker(perl, mip, data); head = head->next; } PERL_SET_CONTEXT(current_perl); } void modperl_interp_mip_walk_servers(PerlInterpreter *current_perl, server_rec *base_server, modperl_interp_mip_walker_t walker, void *data) { server_rec *s = base_server->next; modperl_config_srv_t *base_scfg = modperl_config_srv_get(base_server); PerlInterpreter *base_perl = base_scfg->mip->parent->perl; modperl_interp_mip_walk(current_perl, base_perl, base_scfg->mip, walker, data); while (s) { MP_dSCFG(s); PerlInterpreter *perl = scfg->mip->parent->perl; modperl_interp_pool_t *mip = scfg->mip; /* skip vhosts who share parent perl */ if (perl == base_perl) { perl = NULL; } /* skip vhosts who share parent mip */ if (scfg->mip == base_scfg->mip) { mip = NULL; } if (perl || mip) { modperl_interp_mip_walk(current_perl, perl, mip, walker, data); } s = s->next; } } #define MP_THX_INTERP_KEY "modperl2::thx_interp_key" modperl_interp_t *modperl_thx_interp_get(pTHX) { modperl_interp_t *interp; SV **svp = hv_fetch(PL_modglobal, MP_THX_INTERP_KEY, strlen(MP_THX_INTERP_KEY), 0); if (!svp) return NULL; interp = INT2PTR(modperl_interp_t *, SvIV(*svp)); return interp; } void modperl_thx_interp_set(pTHX_ modperl_interp_t *interp) { (void)hv_store(PL_modglobal, MP_THX_INTERP_KEY, strlen(MP_THX_INTERP_KEY), newSViv(PTR2IV(interp)), 0); return; } #else void modperl_interp_init(server_rec *s, apr_pool_t *p, PerlInterpreter *perl) { MP_dSCFG(s); scfg->perl = perl; } apr_status_t modperl_interp_cleanup(void *data) { return APR_SUCCESS; } #endif /* USE_ITHREADS */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_interp.h0000644000104000010010000001415512540623202022363 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_INTERP_H #define MODPERL_INTERP_H void modperl_interp_init(server_rec *s, apr_pool_t *p, PerlInterpreter *perl); apr_status_t modperl_interp_cleanup(void *data); #ifdef USE_ITHREADS modperl_interp_t *modperl_thx_interp_get(PerlInterpreter *thx); void modperl_thx_interp_set(PerlInterpreter *thx, modperl_interp_t *interp); void modperl_interp_clone_init(modperl_interp_t *interp); modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip, PerlInterpreter *perl); void modperl_interp_destroy(modperl_interp_t *interp); modperl_interp_t *modperl_interp_get(server_rec *s); apr_status_t modperl_interp_unselect(void *data); modperl_interp_t *modperl_interp_pool_get(apr_pool_t *p); void modperl_interp_pool_set(apr_pool_t *p, modperl_interp_t *interp); modperl_interp_t *modperl_interp_pool_select(apr_pool_t *p, server_rec *s); modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c, server_rec *s); #define MP_dINTERP pTHX; modperl_interp_t *interp = NULL #define MP_INTERPa(r, c, s) \ MP_TRACE_i(MP_FUNC, "selecting interp: r=%pp, c=%pp, s=%pp", \ (r), (c), (s)); \ interp = modperl_interp_select((r), (c), (s)); \ if (interp) { \ MP_TRACE_i(MP_FUNC, " --> got (0x%pp)->refcnt=%d, perl=%pp", \ interp, interp->refcnt, interp->perl); \ aTHX = interp->perl; \ } \ else { \ aTHX = NULL; \ MP_TRACE_i(MP_FUNC, " --> failed"); \ } \ NOOP #define MP_dINTERPa(r, c, s) \ MP_dINTERP; \ MP_INTERPa((r), (c), (s)) #define MP_INTERP_POOLa(p, s) \ MP_TRACE_i(MP_FUNC, "selecting interp: p=%pp, s=%pp", (p), (s)); \ interp = modperl_interp_pool_select((p), (s)); \ if (interp) { \ MP_TRACE_i(MP_FUNC, " --> got (0x%pp)->refcnt=%d", \ interp, interp->refcnt); \ aTHX = interp->perl; \ } \ else { \ aTHX = NULL; \ MP_TRACE_i(MP_FUNC, " --> failed"); \ } \ NOOP #define MP_dINTERP_POOLa(p, s) \ MP_dINTERP; \ MP_INTERP_POOLa((p), (s)) #ifdef MP_DEBUG #define MP_INTERP_PUTBACK(interp, thx) \ MP_TRACE_i(MP_FUNC, "unselecting interp: (0x%pp)->refcnt=%ld", \ (interp), (interp)->refcnt); \ modperl_interp_unselect(interp); \ interp = NULL; \ if( thx ) thx = NULL #else /* MP_DEBUG */ #define MP_INTERP_PUTBACK(interp, thx) \ modperl_interp_unselect(interp) #endif #define MP_INTERP_REFCNT_inc(interp) (interp)->refcnt++ #define MP_INTERP_REFCNT_dec(interp) MP_INTERP_PUTBACK(interp, NULL) #define MP_HAS_INTERP(interp) (interp != NULL) #define MP_aTHX aTHX apr_status_t modperl_interp_pool_destroy(void *data); typedef apr_status_t (*modperl_interp_mip_walker_t)(pTHX_ modperl_interp_pool_t *mip, void *data); void modperl_interp_mip_walk(PerlInterpreter *current_perl, PerlInterpreter *parent_perl, modperl_interp_pool_t *mip, modperl_interp_mip_walker_t walker, void *data); void modperl_interp_mip_walk_servers(PerlInterpreter *current_perl, server_rec *base_server, modperl_interp_mip_walker_t walker, void *data); #else #define MP_dINTERP dNOOP #define MP_INTERPa(r, c, s) NOOP #define MP_dINTERPa(r, c, s) NOOP #define MP_INTERP_POOLa(p, s) NOOP #define MP_dINTERP_POOLa(p, s) NOOP #define MP_INTERP_PUTBACK(interp, thx) NOOP #define MP_INTERP_REFCNT_inc(interp) NOOP #define MP_INTERP_REFCNT_dec(interp) NOOP #define MP_HAS_INTERP(interp) (1) #define MP_aTHX 0 #endif /* USE_ITHREADS */ #endif /* MODPERL_INTERP_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_io.c0000644000104000010010000001230712540623202021461 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #define TIEHANDLE(handle,r) \ modperl_io_handle_tie(aTHX_ handle, "Apache2::RequestRec", (void *)r) #define TIED(handle) \ modperl_io_handle_tied(aTHX_ handle, "Apache2::RequestRec") MP_INLINE void modperl_io_handle_tie(pTHX_ GV *handle, char *classname, void *ptr) { SV *obj = modperl_ptr2obj(aTHX_ classname, ptr); modperl_io_handle_untie(aTHX_ handle); sv_magic(TIEHANDLE_SV(handle), obj, PERL_MAGIC_tiedscalar, (char *)NULL, 0); SvREFCNT_dec(obj); /* since sv_magic did SvREFCNT_inc */ MP_TRACE_r(MP_FUNC, "tie *%s(0x%lx) => %s, REFCNT=%d", GvNAME(handle), (unsigned long)handle, classname, SvREFCNT(TIEHANDLE_SV(handle))); } MP_INLINE GV *modperl_io_tie_stdin(pTHX_ request_rec *r) { #if defined(MP_IO_TIE_SFIO) /* XXX */ #else dHANDLE("STDIN"); if (TIED(handle)) { return handle; } TIEHANDLE(handle, r); return handle; #endif } MP_INLINE GV *modperl_io_tie_stdout(pTHX_ request_rec *r) { #if defined(MP_IO_TIE_SFIO) /* XXX */ #else dHANDLE("STDOUT"); if (TIED(handle)) { return handle; } IoFLUSH_off(PL_defoutgv); /* $|=0 */ TIEHANDLE(handle, r); return handle; #endif } MP_INLINE int modperl_io_handle_tied(pTHX_ GV *handle, char *classname) { MAGIC *mg; SV *sv = TIEHANDLE_SV(handle); if (SvMAGICAL(sv) && (mg = mg_find(sv, PERL_MAGIC_tiedscalar))) { char *package = HvNAME(SvSTASH((SV*)SvRV(mg->mg_obj))); if (!strEQ(package, classname)) { MP_TRACE_r(MP_FUNC, "%s tied to %s", GvNAME(handle), package); return TRUE; } } return FALSE; } MP_INLINE void modperl_io_handle_untie(pTHX_ GV *handle) { #ifdef MP_TRACE if (mg_find(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar)) { MP_TRACE_r(MP_FUNC, "untie *%s(0x%lx), REFCNT=%d", GvNAME(handle), (unsigned long)handle, SvREFCNT(TIEHANDLE_SV(handle))); } #endif sv_unmagic(TIEHANDLE_SV(handle), PERL_MAGIC_tiedscalar); } MP_INLINE static void modperl_io_perlio_override_stdhandle(pTHX_ request_rec *r, int mode) { dHANDLE(mode == O_RDONLY ? "STDIN" : "STDOUT"); int status; SV *sv = sv_newmortal(); MP_TRACE_o(MP_FUNC, "start STD%s", mode == O_RDONLY ? "IN" : "OUT"); save_gp(handle, 1); sv_setref_pv(sv, "Apache2::RequestRec", (void*)r); status = do_open9(handle, mode == O_RDONLY ? "<:Apache2" : ">:Apache2", 9, FALSE, mode, 0, (PerlIO *)NULL, sv, 1); if (status == 0) { Perl_croak(aTHX_ "Failed to open STD%s: %" SVf, mode == O_RDONLY ? "IN" : "OUT", get_sv("!", TRUE)); } MP_TRACE_o(MP_FUNC, "end STD%s", mode==O_RDONLY ? "IN" : "OUT"); } MP_INLINE static void modperl_io_perlio_restore_stdhandle(pTHX_ int mode) { GV *handle_orig = gv_fetchpv(mode == O_RDONLY ? "STDIN" : "STDOUT", FALSE, SVt_PVIO); MP_TRACE_o(MP_FUNC, "start STD%s", mode == O_RDONLY ? "IN" : "OUT"); /* since closing unflushed STDOUT may trigger a subrequest * (e.g. via mod_include), resulting in potential another response * handler call, which may try to close STDOUT too. We will * segfault, if that subrequest doesn't return before the the top * level STDOUT is attempted to be closed. To prevent this * situation always explicitly flush STDOUT, before reopening it. */ if (mode != O_RDONLY && GvIOn(handle_orig) && IoOFP(GvIOn(handle_orig)) && (PerlIO_flush(IoOFP(GvIOn(handle_orig))) == -1)) { Perl_croak(aTHX_ "Failed to flush STDOUT: %" SVf, get_sv("!", TRUE)); } /* close the overriding filehandle */ do_close(handle_orig, FALSE); MP_TRACE_o(MP_FUNC, "end STD%s", mode == O_RDONLY ? "IN" : "OUT"); } MP_INLINE GV *modperl_io_perlio_override_stdin(pTHX_ request_rec *r) { modperl_io_perlio_override_stdhandle(aTHX_ r, O_RDONLY); return NULL; } MP_INLINE GV *modperl_io_perlio_override_stdout(pTHX_ request_rec *r) { modperl_io_perlio_override_stdhandle(aTHX_ r, O_WRONLY); return NULL; } MP_INLINE void modperl_io_perlio_restore_stdin(pTHX_ GV *handle) { modperl_io_perlio_restore_stdhandle(aTHX_ O_RDONLY); } MP_INLINE void modperl_io_perlio_restore_stdout(pTHX_ GV *handle) { modperl_io_perlio_restore_stdhandle(aTHX_ O_WRONLY); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_io.h0000644000104000010010000000533212540623203021467 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_IO_H #define MODPERL_IO_H #include "modperl_io_apache.h" /* * bleedperl change #11639 switch tied handle magic * from living in the gv to the GvIOp(gv), so we have to deal * with both to support 5.6.x */ #if MP_PERL_VERSION_AT_LEAST(5, 7, 0) # define TIEHANDLE_SV(handle) (SV*)GvIOp((SV*)handle) #else # define TIEHANDLE_SV(handle) (SV*)handle #endif #define dHANDLE(name) GV *handle = gv_fetchpv(name, TRUE, SVt_PVIO) #define IoFLUSH_off(gv) \ IoFLAGS(GvIOp((gv))) &= ~IOf_FLUSH #define IoFLUSH_on(gv) \ IoFLAGS(GvIOp((gv))) |= IOf_FLUSH #define IoFLUSH(gv) \ (IoFLAGS(GvIOp((gv))) & IOf_FLUSH) MP_INLINE void modperl_io_handle_tie(pTHX_ GV *handle, char *classname, void *ptr); MP_INLINE GV *modperl_io_tie_stdout(pTHX_ request_rec *r); MP_INLINE GV *modperl_io_tie_stdin(pTHX_ request_rec *r); MP_INLINE int modperl_io_handle_tied(pTHX_ GV *handle, char *classname); MP_INLINE void modperl_io_handle_untie(pTHX_ GV *handle); MP_INLINE GV *modperl_io_perlio_override_stdin(pTHX_ request_rec *r); MP_INLINE GV *modperl_io_perlio_override_stdout(pTHX_ request_rec *r); MP_INLINE void modperl_io_perlio_restore_stdin(pTHX_ GV *handle); MP_INLINE void modperl_io_perlio_restore_stdout(pTHX_ GV *handle); #if defined(MP_IO_TIE_SFIO) /* XXX */ #elif defined(MP_IO_TIE_PERLIO) #define modperl_io_override_stdin modperl_io_perlio_override_stdin #define modperl_io_override_stdout modperl_io_perlio_override_stdout #define modperl_io_restore_stdin modperl_io_perlio_restore_stdin #define modperl_io_restore_stdout modperl_io_perlio_restore_stdout #else #define modperl_io_override_stdin modperl_io_tie_stdin #define modperl_io_override_stdout modperl_io_tie_stdout #define modperl_io_restore_stdin modperl_io_handle_untie #define modperl_io_restore_stdout modperl_io_handle_untie #endif #endif /* MODPERL_IO_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_io_apache.c0000644000104000010010000002327212540623203022766 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #ifdef MP_IO_TIE_PERLIO /*************************** * The PerlIO Apache layer * ***************************/ /* PerlIO ":Apache2" layer is used to use the Apache callbacks to read * from STDIN and write to STDOUT. The PerlIO API is documented in * perliol.pod */ typedef struct { struct _PerlIO base; request_rec *r; } PerlIOApache; /* _open just allocates the layer, _pushed does the real job of * filling the data in */ static PerlIO * PerlIOApache_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args) { if (!f) { f = PerlIO_allocate(aTHX); } if ( (f = PerlIO_push(aTHX_ f, self, mode, args[0])) ) { PerlIOBase(f)->flags |= PERLIO_F_OPEN; } MP_TRACE_o(MP_FUNC, "mode %s", mode); return f; } /* this callback is used by pushed() and binmode() to add the layer */ static IV PerlIOApache_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab) { IV code; PerlIOApache *st = PerlIOSelf(f, PerlIOApache); if (arg) { st->r = modperl_sv2request_rec(aTHX_ arg); MP_TRACE_o(MP_FUNC, "stored request_rec obj: 0x%lx", st->r); } else { Perl_croak(aTHX_"failed to insert the :Apache2 layer. " "Apache2::RequestRec object argument is required"); /* XXX: try to get Apache2->request? */ } /* this method also sets the right flags according to the * 'mode' */ code = PerlIOBase_pushed(aTHX_ f, mode, (SV *)NULL, tab); return code; } static SV * PerlIOApache_getarg(pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags) { PerlIOApache *st = PerlIOSelf(f, PerlIOApache); SV *sv; if (!st->r) { Perl_croak(aTHX_ "an attempt to getarg from a stale io handle"); } sv = newSV(0); sv_setref_pv(sv, "Apache2::RequestRec", (void*)(st->r)); MP_TRACE_o(MP_FUNC, "retrieved request_rec obj: 0x%lx", st->r); return sv; } static IV PerlIOApache_fileno(pTHX_ PerlIO *f) { /* XXX: we could return STDIN => 0, STDOUT => 1, but that wouldn't * be correct, as the IO goes through the socket, may be we should * return the filedescriptor of the socket? * * -1 in this case indicates that the layer cannot provide fileno */ MP_TRACE_o(MP_FUNC, "did nothing"); return -1; } static SSize_t PerlIOApache_read(pTHX_ PerlIO *f, void *vbuf, Size_t count) { PerlIOApache *st = PerlIOSelf(f, PerlIOApache); request_rec *r = st->r; if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD) || PerlIOBase(f)->flags & (PERLIO_F_EOF|PERLIO_F_ERROR)) { return 0; } return modperl_request_read(aTHX_ r, (char*)vbuf, count); } static SSize_t PerlIOApache_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) { PerlIOApache *st = PerlIOSelf(f, PerlIOApache); modperl_config_req_t *rcfg = modperl_config_req_get(st->r); apr_size_t bytes = 0; if (!(PerlIOBase(f)->flags & PERLIO_F_CANWRITE)) { return 0; } MP_CHECK_WBUCKET_INIT("print"); MP_TRACE_o(MP_FUNC, "%4db [%s]", count, MP_TRACE_STR_TRUNC(rcfg->wbucket->pool, vbuf, count)); MP_RUN_CROAK(modperl_wbucket_write(aTHX_ rcfg->wbucket, vbuf, &count), ":Apache2 IO write"); bytes += count; return (SSize_t) bytes; } static IV PerlIOApache_flush(pTHX_ PerlIO *f) { PerlIOApache *st = PerlIOSelf(f, PerlIOApache); modperl_config_req_t *rcfg; if (!st->r) { Perl_warn(aTHX_ "an attempt to flush a stale IO handle"); return -1; } /* no flush on readonly io handle */ if (! (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) ) { return -1; } rcfg = modperl_config_req_get(st->r); MP_CHECK_WBUCKET_INIT("flush"); MP_TRACE_o(MP_FUNC, "%4db [%s]", rcfg->wbucket->outcnt, MP_TRACE_STR_TRUNC(rcfg->wbucket->pool, rcfg->wbucket->outbuf, rcfg->wbucket->outcnt)); MP_RUN_CROAK_RESET_OK(st->r->server, modperl_wbucket_flush(rcfg->wbucket, FALSE), ":Apache2 IO flush"); return 0; } /* 5.8.0 doesn't export PerlIOBase_noop_fail, so we duplicate it here */ static IV PerlIOApache_noop_fail(pTHX_ PerlIO *f) { return -1; } static IV PerlIOApache_close(pTHX_ PerlIO *f) { IV code = PerlIOBase_close(aTHX_ f); PerlIOApache *st = PerlIOSelf(f, PerlIOApache); MP_TRACE_o(MP_FUNC, "done with request_rec obj: 0x%lx", st->r); /* prevent possible bugs where a stale r will be attempted to be * reused (e.g. dupped filehandle) */ st->r = NULL; return code; } static IV PerlIOApache_popped(pTHX_ PerlIO *f) { /* XXX: just temp for tracing */ MP_TRACE_o(MP_FUNC, "done"); return PerlIOBase_popped(aTHX_ f); } static PerlIO_funcs PerlIO_Apache = { sizeof(PerlIO_funcs), "Apache2", sizeof(PerlIOApache), PERLIO_K_MULTIARG | PERLIO_K_RAW, PerlIOApache_pushed, PerlIOApache_popped, PerlIOApache_open, PerlIOBase_binmode, PerlIOApache_getarg, PerlIOApache_fileno, PerlIOBase_dup, PerlIOApache_read, PerlIOBase_unread, PerlIOApache_write, NULL, /* can't seek on STD{IN|OUT}, fail on call*/ NULL, /* can't tell on STD{IN|OUT}, fail on call*/ PerlIOApache_close, PerlIOApache_flush, PerlIOApache_noop_fail, /* fill */ PerlIOBase_eof, PerlIOBase_error, PerlIOBase_clearerr, PerlIOBase_setlinebuf, NULL, /* get_base */ NULL, /* get_bufsiz */ NULL, /* get_ptr */ NULL, /* get_cnt */ NULL, /* set_ptrcnt */ }; /* ***** End of PerlIOApache tab ***** */ MP_INLINE void modperl_io_apache_init(pTHX) { PerlIO_define_layer(aTHX_ &PerlIO_Apache); } #endif /* defined MP_IO_TIE_PERLIO */ /****** Other request IO functions *******/ MP_INLINE SSize_t modperl_request_read(pTHX_ request_rec *r, char *buffer, Size_t len) { SSize_t total = 0; Size_t wanted = len; int seen_eos = 0; char *tmp = buffer; apr_bucket_brigade *bb; if (len <= 0) { return 0; } bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); if (bb == NULL) { r->connection->keepalive = AP_CONN_CLOSE; Perl_croak(aTHX_ "failed to create bucket brigade"); } do { apr_size_t read; apr_status_t rc; rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, APR_BLOCK_READ, len); if (rc != APR_SUCCESS) { /* if we fail here, we want to stop trying to read data * from the client. */ r->connection->keepalive = AP_CONN_CLOSE; apr_brigade_destroy(bb); modperl_croak(aTHX_ rc, "Apache2::RequestIO::read"); } /* If this fails, it means that a filter is written * incorrectly and that it needs to learn how to properly * handle APR_BLOCK_READ requests by returning data when * requested. */ if (APR_BRIGADE_EMPTY(bb)) { apr_brigade_destroy(bb); /* we can't tell which filter is broken, since others may * just pass data through */ Perl_croak(aTHX_ "Apache2::RequestIO::read: " "Aborting read from client. " "One of the input filters is broken. " "It returned an empty bucket brigade for " "the APR_BLOCK_READ mode request"); } if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { seen_eos = 1; } read = len; rc = apr_brigade_flatten(bb, tmp, &read); if (rc != APR_SUCCESS) { apr_brigade_destroy(bb); modperl_croak(aTHX_ rc, "Apache2::RequestIO::read"); } total += read; tmp += read; len -= read; /* XXX: what happens if the downstream filter returns more * data than the caller has asked for? We can't return more * data than requested, so it needs to be stored somewhere and * dealt with on the subsequent calls to this function. or may * be we should just assert, blaming a bad filter. at the * moment I couldn't find a spec telling whether it's wrong * for the filter to return more data than it was asked for in * the AP_MODE_READBYTES mode. */ apr_brigade_cleanup(bb); } while (len > 0 && !seen_eos); apr_brigade_destroy(bb); MP_TRACE_o(MP_FUNC, "wanted %db, read %db [%s]", wanted, total, MP_TRACE_STR_TRUNC(r->pool, buffer, total)); return total; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_io_apache.h0000644000104000010010000000373712540623203022777 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_IO_APACHE_H #define MODPERL_IO_APACHE_H #ifdef PERLIO_LAYERS #include "perliol.h" /* XXX: should this be a Makefile.PL config option? */ #define MP_IO_TIE_PERLIO #include "apr_portable.h" #include "apr_file_io.h" #include "apr_errno.h" typedef enum { MODPERL_IO_APACHE_HOOK_READ, MODPERL_IO_APACHE_HOOK_WRITE } modperl_io_apache_hook_e; #define PERLIO_Apache_DEBUG MP_INLINE void modperl_io_apache_init(pTHX); #else /* #ifdef PERLIO_LAYERS */ #define modperl_io_apache_init(pTHX) #endif /* #ifdef PERLIO_LAYERS */ /** * read 'len' bytes from the request record 'r' into 'buffer' * * this call will block until all 'len' bytes are read, eof is reached * or will return an error otherwise * * @param r request record * @param buffer preallocated buffer of size 'len' to store the data in * @param len how many bytes to read * @return how many bytes were read, * -1 on error (in which case ERRSV ($!) is set) */ MP_INLINE SSize_t modperl_request_read(pTHX_ request_rec *r, char *buffer, Size_t len); #endif /* MODPERL_IO_APACHE_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_log.c0000644000104000010010000000161312540623203021632 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_log.h" /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_log.h0000644000104000010010000000375012540623203021643 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_LOG_H #define MODPERL_LOG_H #include "modperl_common_log.h" #include "modperl_apache_includes.h" #define modperl_trace_level_set_apache(s, level) \ modperl_trace_level_set(s->error_log, level); #define modperl_log_warn(s, msg) \ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, "%s", msg) #define modperl_log_error(s, msg) \ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "%s", msg) #define modperl_log_notice(s, msg) \ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, "%s", msg) #define modperl_log_debug(s, msg) \ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "%s", msg) #define modperl_log_reason(r, msg, file) \ ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, \ "access to %s failed for %s, reason: %s", \ file, \ ap_get_remote_host(r->connection, \ r->per_dir_config, REMOTE_NAME, \ NULL), \ msg) #endif /* MODPERL_LOG_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_mgv.c0000644000104000010010000003706212540623203021651 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* * mgv = ModPerl Glob Value || Mostly Glob Value * as close to GV as we can get without actually using a GV * need config structures to be free of Perl structures */ #define modperl_mgv_new_w_name(mgv, p, n, copy) \ mgv = modperl_mgv_new(p); \ mgv->len = strlen(n); \ mgv->name = (copy ? apr_pstrndup(p, n, mgv->len) : n) #define modperl_mgv_new_name(mgv, p, n) \ modperl_mgv_new_w_name(mgv, p, n, 1) #define modperl_mgv_new_namen(mgv, p, n) \ modperl_mgv_new_w_name(mgv, p, n, 0) int modperl_mgv_equal(modperl_mgv_t *mgv1, modperl_mgv_t *mgv2) { for (; mgv1 && mgv2; mgv1=mgv1->next, mgv2=mgv2->next) { if (mgv1->hash != mgv2->hash) { return FALSE; } if (mgv1->len != mgv2->len) { return FALSE; } if (memNE(mgv1->name, mgv2->name, mgv1->len)) { return FALSE; } } return TRUE; } modperl_mgv_t *modperl_mgv_new(apr_pool_t *p) { return (modperl_mgv_t *)apr_pcalloc(p, sizeof(modperl_mgv_t)); } #define modperl_mgv_get_next(mgv) \ if (mgv->name) { \ mgv->next = modperl_mgv_new(p); \ mgv = mgv->next; \ } #define modperl_mgv_hash(mgv) \ PERL_HASH(mgv->hash, mgv->name, mgv->len) /* MP_TRACE_h(MP_FUNC, "%s...hash=%ld", mgv->name, mgv->hash) */ modperl_mgv_t *modperl_mgv_compile(pTHX_ apr_pool_t *p, register const char *name) { register const char *namend; I32 len; modperl_mgv_t *symbol = modperl_mgv_new(p); modperl_mgv_t *mgv = symbol; /* @mgv = split '::', $name */ for (namend = name; *namend; namend++) { if (*namend == ':' && namend[1] == ':') { if ((len = (namend - name)) > 0) { modperl_mgv_get_next(mgv); mgv->name = apr_palloc(p, len+3); Copy(name, mgv->name, len, char); mgv->name[len++] = ':'; mgv->name[len++] = ':'; mgv->name[len] = '\0'; mgv->len = len; modperl_mgv_hash(mgv); } name = namend + 2; } } modperl_mgv_get_next(mgv); mgv->len = namend - name; mgv->name = apr_pstrndup(p, name, mgv->len); modperl_mgv_hash(mgv); return symbol; } void modperl_mgv_append(pTHX_ apr_pool_t *p, modperl_mgv_t *symbol, const char *name) { modperl_mgv_t *mgv = symbol; while (mgv->next) { mgv = mgv->next; } mgv->name = apr_pstrcat(p, mgv->name, "::", NULL); mgv->len += 2; modperl_mgv_hash(mgv); mgv->next = modperl_mgv_compile(aTHX_ p, name); } /* faster replacement for gv_fetchpv() */ GV *modperl_mgv_lookup(pTHX_ modperl_mgv_t *symbol) { HV *stash = PL_defstash; modperl_mgv_t *mgv; if (!symbol->hash) { /* special case for MyClass->handler */ return (GV*)sv_2mortal(newSVpvn(symbol->name, symbol->len)); } for (mgv = symbol; mgv; mgv = mgv->next) { HE *he = hv_fetch_he(stash, mgv->name, mgv->len, mgv->hash); if (he) { if (mgv->next) { stash = GvHV((GV *)HeVAL(he)); } else { return (GV *)HeVAL(he); } } else { return (GV *)NULL; } } return (GV *)NULL; } #ifdef USE_ITHREADS MP_INLINE GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, server_rec *s, apr_pool_t *p) { MP_dSCFG(s); GV *gv = modperl_mgv_lookup(aTHX_ symbol); if (gv || !MpSrvPARENT(scfg)) { return gv; } /* * this VirtualHost has its own parent interpreter * must require the module again with this server's THX */ modperl_mgv_require_module(aTHX_ symbol, s, p); return modperl_mgv_lookup(aTHX_ symbol); } #else MP_INLINE GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, server_rec *s, apr_pool_t *p) { return modperl_mgv_lookup(aTHX_ symbol); } #endif /* currently used for complex filters attributes parsing */ /* XXX: may want to generalize it for any handlers */ #define MODPERL_MGV_DEEP_RESOLVE(handler, p) \ if (handler->attrs & MP_FILTER_HAS_INIT_HANDLER) { \ modperl_filter_resolve_init_handler(aTHX_ handler, p); \ } int modperl_mgv_resolve(pTHX_ modperl_handler_t *handler, apr_pool_t *p, const char *name, int logfailure) { CV *cv; GV *gv; HV *stash = (HV *)NULL; char *handler_name = "handler"; char *tmp; if (MpHandlerANON(handler)) { /* already resolved anonymous handler */ return 1; } if (strnEQ(name, "sub ", 4)) { SV *sv; CV *cv; MpHandlerPARSED_On(handler); MpHandlerANON_On(handler); ENTER;SAVETMPS; sv = eval_pv(name, TRUE); if (!(SvROK(sv) && (cv = (CV*)SvRV(sv)) && (CvFLAGS(cv) & CVf_ANON))) { Perl_croak(aTHX_ "expected anonymous sub, got '%s'\n", name); } #ifdef USE_ITHREADS handler->cv = NULL; handler->name = NULL; handler->mgv_obj = modperl_handler_anon_next(aTHX_ p); modperl_handler_anon_add(aTHX_ handler->mgv_obj, cv); MP_TRACE_h(MP_FUNC, "new anon handler"); #else SvREFCNT_inc(cv); handler->cv = cv; handler->name = NULL; MP_TRACE_h(MP_FUNC, "new cached-cv anon handler"); #endif FREETMPS;LEAVE; return 1; } if ((tmp = strstr((char *)name, "->"))) { int package_len = strlen(name) - strlen(tmp); char *package = apr_pstrndup(p, name, package_len); name = package; handler_name = &tmp[2]; MpHandlerMETHOD_On(handler); if (*package == '$') { GV *gv; SV *obj; handler->mgv_obj = modperl_mgv_compile(aTHX_ p, package + 1); gv = modperl_mgv_lookup(aTHX_ handler->mgv_obj); obj = gv ? GvSV(gv) : (SV *)NULL; if (SvTRUE(obj)) { if (SvROK(obj) && sv_isobject(obj)) { stash = SvSTASH(SvRV(obj)); MpHandlerOBJECT_On(handler); MP_TRACE_h(MP_FUNC, "handler object %s isa %s", package, HvNAME(stash)); } else { MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s", package, SvPV_nolen(obj)); return 0; } } else { MP_TRACE_h(MP_FUNC, "failed to thaw %s", package); return 0; } } if (!stash) { if ((stash = gv_stashpvn(package, package_len, FALSE))) { MP_TRACE_h(MP_FUNC, "handler method %s isa %s", name, HvNAME(stash)); } } } else { if ((cv = get_cv(name, FALSE))) { handler->attrs = *modperl_code_attrs(aTHX_ cv); handler->mgv_cv = modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(CvGV(cv)))); modperl_mgv_append(aTHX_ p, handler->mgv_cv, GvNAME(CvGV(cv))); MpHandlerPARSED_On(handler); MODPERL_MGV_DEEP_RESOLVE(handler, p); return 1; } } if (!stash && MpHandlerAUTOLOAD(handler)) { if (!modperl_perl_module_loaded(aTHX_ name)) { /* not in %INC */ MP_TRACE_h(MP_FUNC, "package %s not in %INC, attempting to load it", name); if (modperl_require_module(aTHX_ name, logfailure)) { MP_TRACE_h(MP_FUNC, "loaded %s package", name); } else { if (logfailure) { /* the caller doesn't handle the error checking */ Perl_croak(aTHX_ "failed to load %s package\n", name); } else { /* the caller handles the error checking */ MP_TRACE_h(MP_FUNC, "failed to load %s package", name); return 0; } } } else { MP_TRACE_h(MP_FUNC, "package %s seems to be loaded", name); } } /* try to lookup the stash only after loading the module, to avoid * the case where a stash is autovivified by a user before the * module was loaded, preventing from loading the module */ if (!(stash || (stash = gv_stashpv(name, FALSE)))) { MP_TRACE_h(MP_FUNC, "%s's stash is not found", name); return 0; } if ((gv = gv_fetchmethod(stash, handler_name)) && (cv = GvCV(gv))) { if (CvFLAGS(cv) & CVf_METHOD) { /* sub foo : method {}; */ MpHandlerMETHOD_On(handler); } if (!stash) { return 0; } if (MpHandlerMETHOD(handler) && !handler->mgv_obj) { char *name = HvNAME(stash); if (!name) { name = ""; } modperl_mgv_new_name(handler->mgv_obj, p, name); } handler->attrs = *modperl_code_attrs(aTHX_ cv); /* note: this is the real function after @ISA lookup */ handler->mgv_cv = modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(gv))); modperl_mgv_append(aTHX_ p, handler->mgv_cv, handler_name); MpHandlerPARSED_On(handler); MP_TRACE_h(MP_FUNC, "found `%s' in class `%s' as a %s", handler_name, HvNAME(stash), MpHandlerMETHOD(handler) ? "method" : "function"); MODPERL_MGV_DEEP_RESOLVE(handler, p); return 1; } /* at least modperl_hash_handlers needs to verify that an * autoloaded-marked handler needs to be loaded, since it doesn't * check success failure, and handlers marked to be autoloaded are * the same as PerlModule and the failure should be fatal */ if (MpHandlerAUTOLOAD(handler)) { Perl_croak(aTHX_ "failed to resolve handler %s\n", name); } #ifdef MP_TRACE /* complain only if the class was actually loaded/created */ if (stash) { MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'", handler_name, name); } #endif return 0; } modperl_mgv_t *modperl_mgv_last(modperl_mgv_t *symbol) { while (symbol->next) { symbol = symbol->next; } return symbol; } char *modperl_mgv_last_name(modperl_mgv_t *symbol) { symbol = modperl_mgv_last(symbol); return symbol->name; } char *modperl_mgv_as_string(pTHX_ modperl_mgv_t *symbol, apr_pool_t *p, int package) { char *string, *ptr; modperl_mgv_t *mgv; int len = 0; for (mgv = symbol; (package ? mgv->next : mgv); mgv = mgv->next) { len += mgv->len; } ptr = string = apr_palloc(p, len+1); for (mgv = symbol; (package ? mgv->next : mgv); mgv = mgv->next) { Copy(mgv->name, ptr, mgv->len, char); ptr += mgv->len; } if (package) { *(ptr-2) = '\0'; /* trim trailing :: */ } else { *ptr = '\0'; } return string; } #ifdef USE_ITHREADS int modperl_mgv_require_module(pTHX_ modperl_mgv_t *symbol, server_rec *s, apr_pool_t *p) { char *package = modperl_mgv_as_string(aTHX_ symbol, p, 1); if (modperl_require_module(aTHX_ package, TRUE)) { MP_TRACE_h(MP_FUNC, "reloaded %s for server %s", package, modperl_server_desc(s, p)); return TRUE; } return FALSE; } #endif /* precompute the hash(es) for handler names, preload handlers * configured to be autoloaded */ static void modperl_hash_handlers(pTHX_ apr_pool_t *p, server_rec *s, MpAV *entry, void *data) { MP_dSCFG(s); int i; modperl_handler_t **handlers; if (!entry) { return; } handlers = (modperl_handler_t **)entry->elts; for (i=0; i < entry->nelts; i++) { modperl_handler_t *handler = handlers[i]; if (MpHandlerFAKE(handler)) { /* do nothing with fake handlers */ } else if (MpHandlerPARSED(handler)) { #ifdef USE_ITHREADS if ((MpSrvPARENT(scfg) && MpSrvAUTOLOAD(scfg)) && !modperl_mgv_lookup(aTHX_ handler->mgv_cv)) { /* * this VirtualHost has its own parent interpreter * must require the module again with this server's THX */ modperl_mgv_require_module(aTHX_ handler->mgv_cv, s, p); } #endif MP_TRACE_h(MP_FUNC, "%s already resolved in server %s", modperl_handler_name(handler), modperl_server_desc(s, p)); } else { if (MpSrvAUTOLOAD(scfg)) { MpHandlerAUTOLOAD_On(handler); } modperl_mgv_resolve(aTHX_ handler, p, handler->name, TRUE); } } } static int modperl_hash_handlers_dir(apr_pool_t *p, server_rec *s, void *cfg, char *d, void *data) { int i; modperl_config_dir_t *dir_cfg = (modperl_config_dir_t *)cfg; dTHXa(data); if (!dir_cfg) { return 1; } for (i=0; i < MP_HANDLER_NUM_PER_DIR; i++) { modperl_hash_handlers(aTHX_ p, s, dir_cfg->handlers_per_dir[i], data); } return 1; } static int modperl_hash_handlers_srv(apr_pool_t *p, server_rec *s, void *cfg, void *data) { int i; modperl_config_srv_t *scfg = (modperl_config_srv_t *)cfg; dTHXa(data); for (i=0; i < MP_HANDLER_NUM_PER_SRV; i++) { modperl_hash_handlers(aTHX_ p, s, scfg->handlers_per_srv[i], data); } for (i=0; i < MP_HANDLER_NUM_PROCESS; i++) { modperl_hash_handlers(aTHX_ p, s, scfg->handlers_process[i], data); } for (i=0; i < MP_HANDLER_NUM_CONNECTION; i++) { modperl_hash_handlers(aTHX_ p, s, scfg->handlers_connection[i], data); } for (i=0; i < MP_HANDLER_NUM_FILES; i++) { modperl_hash_handlers(aTHX_ p, s, scfg->handlers_files[i], data); } return 1; } void modperl_mgv_hash_handlers(apr_pool_t *p, server_rec *s) { MP_dINTERPa(NULL, NULL, s); ap_pcw_walk_config(p, s, &perl_module, #ifdef USE_ITHREADS aTHX, #else NULL, #endif modperl_hash_handlers_dir, modperl_hash_handlers_srv); MP_INTERP_PUTBACK(interp, aTHX); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_mgv.h0000644000104000010010000000412112540623203021644 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_MGV_H #define MODPERL_MGV_H modperl_mgv_t *modperl_mgv_new(apr_pool_t *p); int modperl_mgv_equal(modperl_mgv_t *mgv1, modperl_mgv_t *mgv2); modperl_mgv_t *modperl_mgv_compile(pTHX_ apr_pool_t *p, const char *name); GV *modperl_mgv_lookup(pTHX_ modperl_mgv_t *symbol); GV *modperl_mgv_lookup_autoload(pTHX_ modperl_mgv_t *symbol, server_rec *s, apr_pool_t *p); int modperl_mgv_resolve(pTHX_ modperl_handler_t *handler, apr_pool_t *p, const char *name, int logfailure); void modperl_mgv_append(pTHX_ apr_pool_t *p, modperl_mgv_t *symbol, const char *name); modperl_mgv_t *modperl_mgv_last(modperl_mgv_t *symbol); char *modperl_mgv_last_name(modperl_mgv_t *symbol); char *modperl_mgv_as_string(pTHX_ modperl_mgv_t *symbol, apr_pool_t *p, int package); #ifdef USE_ITHREADS int modperl_mgv_require_module(pTHX_ modperl_mgv_t *symbol, server_rec *s, apr_pool_t *p); #endif void modperl_mgv_hash_handlers(apr_pool_t *p, server_rec *s); #define modperl_mgv_sv(sv) \ (isGV(sv) ? GvSV(sv) : (SV*)sv) #define modperl_mgv_cv(sv) \ GvCV(sv) #endif /* MODPERL_MGV_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_module.c0000644000104000010010000006260112540623203022342 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" typedef struct { modperl_mgv_t *dir_create; modperl_mgv_t *dir_merge; modperl_mgv_t *srv_create; modperl_mgv_t *srv_merge; int namelen; } modperl_module_info_t; typedef struct { server_rec *server; modperl_module_info_t *minfo; } modperl_module_cfg_t; #define MP_MODULE_INFO(modp) \ (modperl_module_info_t *)modp->dynamic_load_handle #define MP_MODULE_CFG_MINFO(ptr) \ ((modperl_module_cfg_t *)ptr)->minfo static modperl_module_cfg_t *modperl_module_cfg_new(apr_pool_t *p) { modperl_module_cfg_t *cfg = (modperl_module_cfg_t *)apr_pcalloc(p, sizeof(*cfg)); return cfg; } static modperl_module_cmd_data_t *modperl_module_cmd_data_new(apr_pool_t *p) { modperl_module_cmd_data_t *cmd_data = (modperl_module_cmd_data_t *)apr_pcalloc(p, sizeof(*cmd_data)); return cmd_data; } static void *modperl_module_config_dir_create(apr_pool_t *p, char *dir) { return modperl_module_cfg_new(p); } static void *modperl_module_config_srv_create(apr_pool_t *p, server_rec *s) { return modperl_module_cfg_new(p); } static SV **modperl_module_config_hash_get(pTHX_ int create) { SV **svp; /* XXX: could make this lookup faster */ svp = hv_fetch(PL_modglobal, "ModPerl::Module::ConfigTable", MP_SSTRLEN("ModPerl::Module::ConfigTable"), create); return svp; } void modperl_module_config_table_set(pTHX_ PTR_TBL_t *table) { SV **svp = modperl_module_config_hash_get(aTHX_ TRUE); sv_setiv(*svp, PTR2IV(table)); } PTR_TBL_t *modperl_module_config_table_get(pTHX_ int create) { PTR_TBL_t *table = NULL; SV *sv, **svp = modperl_module_config_hash_get(aTHX_ create); if (!svp) { return NULL; } sv = *svp; if (!SvIOK(sv) && create) { table = modperl_svptr_table_new(aTHX); sv_setiv(sv, PTR2IV(table)); } else { table = INT2PTR(PTR_TBL_t *, SvIV(sv)); } return table; } typedef struct { #ifdef USE_ITHREADS modperl_interp_t *interp; #endif PTR_TBL_t *table; void *ptr; } config_obj_cleanup_t; /* * any per-dir CREATE or MERGE that happens at request time * needs to be removed from the pointer table. */ static apr_status_t modperl_module_config_obj_cleanup(void *data) { config_obj_cleanup_t *cleanup = (config_obj_cleanup_t *)data; #ifdef USE_ITHREADS dTHXa(cleanup->interp->perl); MP_ASSERT_CONTEXT(aTHX); #endif modperl_svptr_table_delete(aTHX_ cleanup->table, cleanup->ptr); MP_TRACE_c(MP_FUNC, "deleting ptr %pp from table %pp", cleanup->ptr, cleanup->table); MP_INTERP_PUTBACK(cleanup->interp, aTHX); return APR_SUCCESS; } static void modperl_module_config_obj_cleanup_register(pTHX_ apr_pool_t *p, PTR_TBL_t *table, void *ptr) { config_obj_cleanup_t *cleanup = (config_obj_cleanup_t *)apr_palloc(p, sizeof(*cleanup)); cleanup->table = table; cleanup->ptr = ptr; #ifdef USE_ITHREADS cleanup->interp = modperl_thx_interp_get(aTHX); MP_INTERP_REFCNT_inc(cleanup->interp); #endif apr_pool_cleanup_register(p, cleanup, modperl_module_config_obj_cleanup, apr_pool_cleanup_null); } #define MP_CFG_MERGE_DIR 1 #define MP_CFG_MERGE_SRV 2 /* * XXX: vhosts may have different parent interpreters. */ static void *modperl_module_config_merge(apr_pool_t *p, void *basev, void *addv, int type) { GV *gv; modperl_mgv_t *method; modperl_module_cfg_t *mrg = NULL, *tmp, *base = (modperl_module_cfg_t *)basev, *add = (modperl_module_cfg_t *)addv; server_rec *s; int is_startup; PTR_TBL_t *table; SV *mrg_obj = (SV *)NULL, *base_obj, *add_obj; MP_dINTERP; /* if the module is loaded in vhost, base==NULL */ tmp = (base && base->server) ? base : add; if (tmp && !tmp->server) { /* no directives for this module were encountered so far */ return basev; } s = tmp->server; is_startup = (p == s->process->pconf); MP_INTERP_POOLa(p, s); table = modperl_module_config_table_get(aTHX_ TRUE); base_obj = modperl_svptr_table_fetch(aTHX_ table, base); add_obj = modperl_svptr_table_fetch(aTHX_ table, add); if (!base_obj || (base_obj == add_obj)) { MP_INTERP_PUTBACK(interp, aTHX); return addv; } mrg = modperl_module_cfg_new(p); memcpy(mrg, tmp, sizeof(*mrg)); method = (type == MP_CFG_MERGE_DIR) ? mrg->minfo->dir_merge : mrg->minfo->srv_merge; if (method && (gv = modperl_mgv_lookup(aTHX_ method))) { int count; dSP; MP_TRACE_c(MP_FUNC, "calling %s->%s", SvCLASS(base_obj), modperl_mgv_last_name(method)); ENTER;SAVETMPS; PUSHMARK(sp); XPUSHs(base_obj);XPUSHs(add_obj); PUTBACK; count = call_sv((SV*)GvCV(gv), G_EVAL|G_SCALAR); SPAGAIN; if (count == 1) { mrg_obj = SvREFCNT_inc(POPs); } PUTBACK; FREETMPS;LEAVE; if (SvTRUE(ERRSV)) { /* XXX: should die here. */ (void)modperl_errsv(aTHX_ HTTP_INTERNAL_SERVER_ERROR, NULL, NULL); } } else { mrg_obj = SvREFCNT_inc(add_obj); } modperl_svptr_table_store(aTHX_ table, mrg, mrg_obj); if (!is_startup) { modperl_module_config_obj_cleanup_register(aTHX_ p, table, mrg); } MP_INTERP_PUTBACK(interp, aTHX); return (void *)mrg; } static void *modperl_module_config_dir_merge(apr_pool_t *p, void *basev, void *addv) { return modperl_module_config_merge(p, basev, addv, MP_CFG_MERGE_DIR); } static void *modperl_module_config_srv_merge(apr_pool_t *p, void *basev, void *addv) { return modperl_module_config_merge(p, basev, addv, MP_CFG_MERGE_SRV); } #define modperl_bless_cmd_parms(parms) \ sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::CmdParms", (void *)parms)) static const char * modperl_module_config_create_obj(pTHX_ apr_pool_t *p, PTR_TBL_t *table, modperl_module_cfg_t *cfg, modperl_module_cmd_data_t *info, modperl_mgv_t *method, cmd_parms *parms, SV **obj) { const char *mname = info->modp->name; modperl_module_info_t *minfo = MP_MODULE_INFO(info->modp); GV *gv; int is_startup = (p == parms->server->process->pconf); /* * XXX: if MPM is not threaded, we could modify the * modperl_module_cfg_t * directly and avoid the ptr_table * altogether. */ if ((*obj = (SV*)modperl_svptr_table_fetch(aTHX_ table, cfg))) { /* object already exists */ return NULL; } MP_TRACE_c(MP_FUNC, "%s cfg=0x%lx for %s.%s", method ? modperl_mgv_last_name(method) : "NULL", (unsigned long)cfg, mname, parms->cmd->name); /* used by merge functions to get a Perl interp */ cfg->server = parms->server; cfg->minfo = minfo; if (method && (gv = modperl_mgv_lookup(aTHX_ method))) { int count; dSP; ENTER;SAVETMPS; PUSHMARK(sp); XPUSHs(sv_2mortal(newSVpv(mname, minfo->namelen))); XPUSHs(modperl_bless_cmd_parms(parms)); PUTBACK; count = call_sv((SV*)GvCV(gv), G_EVAL|G_SCALAR); SPAGAIN; if (count == 1) { *obj = SvREFCNT_inc(POPs); } PUTBACK; FREETMPS;LEAVE; if (SvTRUE(ERRSV)) { return SvPVX(ERRSV); } } else { HV *stash = gv_stashpvn(mname, minfo->namelen, FALSE); /* return bless {}, $class */ *obj = newRV_noinc((SV*)newHV()); *obj = sv_bless(*obj, stash); } if (!is_startup) { modperl_module_config_obj_cleanup_register(aTHX_ p, table, cfg); } modperl_svptr_table_store(aTHX_ table, cfg, *obj); return NULL; } #define PUSH_STR_ARG(arg) \ if (arg) XPUSHs(sv_2mortal(newSVpv(arg,0))) static const char *modperl_module_cmd_take123(cmd_parms *parms, void *mconfig, const char *one, const char *two, const char *three) { modperl_module_cfg_t *cfg = (modperl_module_cfg_t *)mconfig; const char *retval = NULL, *errmsg; const command_rec *cmd = parms->cmd; server_rec *s = parms->server; apr_pool_t *p = parms->pool; modperl_module_cmd_data_t *info = (modperl_module_cmd_data_t *)cmd->cmd_data; modperl_module_info_t *minfo = MP_MODULE_INFO(info->modp); modperl_module_cfg_t *srv_cfg; int modules_alias = 0; int count; PTR_TBL_t *table; SV *obj = (SV *)NULL; MP_dINTERP_POOLa(p, s); table = modperl_module_config_table_get(aTHX_ TRUE); if (s->is_virtual) { MP_dSCFG(s); /* if the Perl module is loaded in the base server and a vhost * has configuration directives from that module, but no * mod_perl.c directives, scfg == NULL when * modperl_module_cmd_take123 is run. If the directive * callback wants to do something with the mod_perl config * object, it'll segfault, since it doesn't exist yet, because * this happens before server configs are merged. So we create * a temp struct and fill it in with things that might be * needed by the Perl callback. */ if (!scfg) { scfg = modperl_config_srv_new(p, s); modperl_set_module_config(s->module_config, scfg); scfg->server = s; } /* if PerlLoadModule Foo is called from the base server, but * Foo's directives are used inside a vhost, we need to * temporary link to the base server config's 'modules' * member. e.g. so Apache2::Module->get_config() can be called * from a custom directive's callback, before the server/vhost * config merge is performed */ if (!scfg->modules) { modperl_config_srv_t *base_scfg = modperl_config_srv_get(modperl_global_get_server_rec()); if (base_scfg->modules) { scfg->modules = base_scfg->modules; modules_alias = 1; } } } errmsg = modperl_module_config_create_obj(aTHX_ p, table, cfg, info, minfo->dir_create, parms, &obj); if (errmsg) { MP_INTERP_PUTBACK(interp, aTHX); return errmsg; } if (obj) { MP_TRACE_c(MP_FUNC, "found per-dir obj=0x%lx for %s.%s", (unsigned long)obj, info->modp->name, cmd->name); } /* XXX: could delay creation of srv_obj until * Apache2::ModuleConfig->get is called. */ srv_cfg = ap_get_module_config(s->module_config, info->modp); if (srv_cfg) { SV *srv_obj; errmsg = modperl_module_config_create_obj(aTHX_ p, table, srv_cfg, info, minfo->srv_create, parms, &srv_obj); if (errmsg) { MP_INTERP_PUTBACK(interp, aTHX); return errmsg; } if (srv_obj) { MP_TRACE_c(MP_FUNC, "found per-srv obj=0x%lx for %s.%s", (unsigned long)srv_obj, info->modp->name, cmd->name); } } { dSP; ENTER;SAVETMPS; PUSHMARK(SP); EXTEND(SP, 2); PUSHs(obj); PUSHs(modperl_bless_cmd_parms(parms)); if (cmd->args_how != NO_ARGS) { PUSH_STR_ARG(one); PUSH_STR_ARG(two); PUSH_STR_ARG(three); } PUTBACK; count = call_method(info->func_name, G_EVAL|G_SCALAR); SPAGAIN; if (count == 1) { SV *sv = POPs; if (SvPOK(sv) && strEQ(SvPVX(sv), DECLINE_CMD)) { retval = DECLINE_CMD; } } PUTBACK; FREETMPS;LEAVE; } if (SvTRUE(ERRSV)) { retval = SvPVX(ERRSV); } MP_INTERP_PUTBACK(interp, aTHX); if (modules_alias) { MP_dSCFG(s); /* unalias the temp aliasing */ scfg->modules = NULL; } return retval; } static const char *modperl_module_cmd_take1(cmd_parms *parms, void *mconfig, const char *one) { return modperl_module_cmd_take123(parms, mconfig, one, NULL, NULL); } static const char *modperl_module_cmd_take2(cmd_parms *parms, void *mconfig, const char *one, const char *two) { return modperl_module_cmd_take123(parms, mconfig, one, two, NULL); } static const char *modperl_module_cmd_flag(cmd_parms *parms, void *mconfig, int flag) { char buf[2]; apr_snprintf(buf, sizeof(buf), "%d", flag); return modperl_module_cmd_take123(parms, mconfig, buf, NULL, NULL); } static const char *modperl_module_cmd_no_args(cmd_parms *parms, void *mconfig) { return modperl_module_cmd_take123(parms, mconfig, NULL, NULL, NULL); } #define modperl_module_cmd_raw_args modperl_module_cmd_take1 #define modperl_module_cmd_iterate modperl_module_cmd_take1 #define modperl_module_cmd_iterate2 modperl_module_cmd_take2 #define modperl_module_cmd_take12 modperl_module_cmd_take2 #define modperl_module_cmd_take23 modperl_module_cmd_take123 #define modperl_module_cmd_take3 modperl_module_cmd_take123 #define modperl_module_cmd_take13 modperl_module_cmd_take123 #if defined(AP_HAVE_DESIGNATED_INITIALIZER) # define modperl_module_cmd_func_set(cmd, name) \ cmd->func.name = modperl_module_cmd_##name #else # define modperl_module_cmd_func_set(cmd, name) \ cmd->func = modperl_module_cmd_##name #endif static int modperl_module_cmd_lookup(command_rec *cmd) { switch (cmd->args_how) { case TAKE1: case ITERATE: modperl_module_cmd_func_set(cmd, take1); break; case TAKE2: case ITERATE2: case TAKE12: modperl_module_cmd_func_set(cmd, take2); break; case TAKE3: case TAKE23: case TAKE123: case TAKE13: modperl_module_cmd_func_set(cmd, take3); break; case RAW_ARGS: modperl_module_cmd_func_set(cmd, raw_args); break; case FLAG: modperl_module_cmd_func_set(cmd, flag); break; case NO_ARGS: modperl_module_cmd_func_set(cmd, no_args); break; default: return FALSE; } return TRUE; } static apr_status_t modperl_module_remove(void *data) { module *modp = (module *)data; ap_remove_loaded_module(modp); return APR_SUCCESS; } static const char *modperl_module_cmd_fetch(pTHX_ SV *obj, const char *name, SV **retval) { const char *errmsg = NULL; if (*retval) { SvREFCNT_dec(*retval); *retval = (SV *)NULL; } if (sv_isobject(obj)) { int count; dSP; ENTER;SAVETMPS; PUSHMARK(SP); XPUSHs(obj); PUTBACK; count = call_method(name, G_EVAL|G_SCALAR); SPAGAIN; if (count == 1) { SV *sv = POPs; if (SvTRUE(sv)) { *retval = SvREFCNT_inc(sv); } } if (!*retval) { errmsg = Perl_form(aTHX_ "%s->%s did not return a %svalue", SvCLASS(obj), name, count ? "true " : ""); } PUTBACK; FREETMPS;LEAVE; if (SvTRUE(ERRSV)) { errmsg = SvPVX(ERRSV); } } else if (SvROK(obj) && (SvTYPE(SvRV(obj)) == SVt_PVHV)) { HV *hv = (HV*)SvRV(obj); SV **svp = hv_fetch(hv, name, strlen(name), 0); if (svp) { *retval = SvREFCNT_inc(*svp); } else { errmsg = Perl_form(aTHX_ "HASH key %s does not exist", name); } } else { errmsg = "command entry is not an object or a HASH reference"; } return errmsg; } static const char *modperl_module_add_cmds(apr_pool_t *p, server_rec *s, module *modp, SV *mod_cmds) { const char *errmsg; apr_array_header_t *cmds; command_rec *cmd; AV *module_cmds; I32 i, fill; MP_dINTERPa(NULL, NULL, s); module_cmds = (AV*)SvRV(mod_cmds); fill = AvFILL(module_cmds); cmds = apr_array_make(p, fill+1, sizeof(command_rec)); for (i=0; i<=fill; i++) { SV *val = (SV *)NULL; STRLEN len; SV *obj = AvARRAY(module_cmds)[i]; modperl_module_cmd_data_t *info = modperl_module_cmd_data_new(p); info->modp = modp; cmd = apr_array_push(cmds); if ((errmsg = modperl_module_cmd_fetch(aTHX_ obj, "name", &val))) { MP_INTERP_PUTBACK(interp, aTHX); return errmsg; } cmd->name = apr_pstrdup(p, SvPV(val, len)); if ((errmsg = modperl_module_cmd_fetch(aTHX_ obj, "args_how", &val))) { /* XXX default based on $self->func prototype */ cmd->args_how = TAKE1; /* default */ } else { if (SvIOK(val)) { cmd->args_how = SvIV(val); } else { cmd->args_how = SvIV(modperl_constants_lookup_apache2_const(aTHX_ SvPV(val, len))); } } if (!modperl_module_cmd_lookup(cmd)) { MP_INTERP_PUTBACK(interp, aTHX); return apr_psprintf(p, "no command function defined for args_how=%d", cmd->args_how); } if ((errmsg = modperl_module_cmd_fetch(aTHX_ obj, "func", &val))) { info->func_name = cmd->name; /* default */ } else { info->func_name = apr_pstrdup(p, SvPV(val, len)); } if ((errmsg = modperl_module_cmd_fetch(aTHX_ obj, "req_override", &val))) { cmd->req_override = OR_ALL; /* default */ } else { if (SvIOK(val)) { cmd->req_override = SvIV(val); } else { cmd->req_override = SvIV(modperl_constants_lookup_apache2_const(aTHX_ SvPV(val, len))); } } if ((errmsg = modperl_module_cmd_fetch(aTHX_ obj, "errmsg", &val))) { /* default */ /* XXX generate help msg based on args_how */ cmd->errmsg = apr_pstrcat(p, cmd->name, " command", NULL); } else { cmd->errmsg = apr_pstrdup(p, SvPV(val, len)); } cmd->cmd_data = info; /* no default if undefined */ if (!(errmsg = modperl_module_cmd_fetch(aTHX_ obj, "cmd_data", &val))) { info->cmd_data = apr_pstrdup(p, SvPV(val, len)); } if (val) { SvREFCNT_dec(val); val = (SV *)NULL; } } cmd = apr_array_push(cmds); cmd->name = NULL; modp->cmds = (command_rec *)cmds->elts; MP_INTERP_PUTBACK(interp, aTHX); return NULL; } static void modperl_module_insert(module *modp) { /* * insert after mod_perl, rather the top of the list. * (see ap_add_module; does not insert into ap_top_module list if * m->next != NULL) * this way, modperl config merging happens before this module. */ modp->next = perl_module.next; perl_module.next = modp; } #define MP_isGV(gv) (gv && isGV(gv)) static modperl_mgv_t *modperl_module_fetch_method(pTHX_ apr_pool_t *p, module *modp, const char *method) { modperl_mgv_t *mgv; HV *stash = gv_stashpv(modp->name, FALSE); GV *gv = gv_fetchmethod_autoload(stash, method, FALSE); MP_TRACE_c(MP_FUNC, "looking for method %s in package `%s'...%sfound", method, modp->name, MP_isGV(gv) ? "" : "not "); if (!MP_isGV(gv)) { return NULL; } mgv = modperl_mgv_compile(aTHX_ p, apr_pstrcat(p, modp->name, "::", method, NULL)); return mgv; } const char *modperl_module_add(apr_pool_t *p, server_rec *s, const char *name, SV *mod_cmds) { MP_dSCFG(s); const char *errmsg; module *modp; modperl_module_info_t *minfo; MP_dINTERPa(NULL, NULL, s); modp = (module *)apr_pcalloc(p, sizeof(*modp)); minfo = (modperl_module_info_t *)apr_pcalloc(p, sizeof(*minfo)); /* STANDARD20_MODULE_STUFF */ modp->version = MODULE_MAGIC_NUMBER_MAJOR; modp->minor_version = MODULE_MAGIC_NUMBER_MINOR; modp->module_index = -1; modp->name = apr_pstrdup(p, name); modp->magic = MODULE_MAGIC_COOKIE; /* use this slot for our context */ modp->dynamic_load_handle = minfo; /* * XXX: we should lookup here if the Perl methods exist, * and set these pointers only if they do. */ modp->create_dir_config = modperl_module_config_dir_create; modp->merge_dir_config = modperl_module_config_dir_merge; modp->create_server_config = modperl_module_config_srv_create; modp->merge_server_config = modperl_module_config_srv_merge; minfo->namelen = strlen(name); minfo->dir_create = modperl_module_fetch_method(aTHX_ p, modp, "DIR_CREATE"); minfo->dir_merge = modperl_module_fetch_method(aTHX_ p, modp, "DIR_MERGE"); minfo->srv_create = modperl_module_fetch_method(aTHX_ p, modp, "SERVER_CREATE"); minfo->srv_merge = modperl_module_fetch_method(aTHX_ p, modp, "SERVER_MERGE"); modp->cmds = NULL; if ((errmsg = modperl_module_add_cmds(p, s, modp, mod_cmds))) { MP_INTERP_PUTBACK(interp, aTHX); return errmsg; } modperl_module_insert(modp); mp_add_loaded_module(modp, p, modp->name); apr_pool_cleanup_register(p, modp, modperl_module_remove, apr_pool_cleanup_null); ap_single_module_configure(p, s, modp); if (!scfg->modules) { scfg->modules = apr_hash_make(p); } apr_hash_set(scfg->modules, apr_pstrdup(p, name), APR_HASH_KEY_STRING, modp); #ifdef USE_ITHREADS /* * if the Perl module is loaded in the base server and a vhost * has configuration directives from that module, but no mod_perl.c * directives, scfg == NULL when modperl_module_cmd_take123 is run. * this happens before server configs are merged, so we stash a pointer * to what will be merged as the parent interp later. i.e. "safe hack" */ if (!modperl_interp_pool_get(p)) { /* for vhosts */ MP_TRACE_i(MP_FUNC, "set interp 0x%lx in pconf pool 0x%lx", (unsigned long)scfg->mip->parent, (unsigned long)p); modperl_interp_pool_set(p, scfg->mip->parent); } #endif MP_INTERP_PUTBACK(interp, aTHX); return NULL; } SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s, ap_conf_vector_t *v) { MP_dSCFG(s); module *modp; const char *name; void *ptr; PTR_TBL_t *table; SV *obj; if (!v) { v = s->module_config; } if (SvROK(pmodule)) { name = SvCLASS(pmodule); } else { STRLEN n_a; name = SvPV(pmodule, n_a); } if (!(scfg->modules && (modp = apr_hash_get(scfg->modules, name, APR_HASH_KEY_STRING)))) { return &PL_sv_undef; } if (!(ptr = ap_get_module_config(v, modp))) { return &PL_sv_undef; } if (!(table = modperl_module_config_table_get(aTHX_ FALSE))) { return &PL_sv_undef; } if (!(obj = modperl_svptr_table_fetch(aTHX_ table, ptr))) { return &PL_sv_undef; } return obj; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_module.h0000644000104000010010000000247412540623203022351 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_MODULE_H #define MODPERL_MODULE_H PTR_TBL_t *modperl_module_config_table_get(pTHX_ int create); void modperl_module_config_table_set(pTHX_ PTR_TBL_t *table); const char *modperl_module_add(apr_pool_t *p, server_rec *s, const char *name, SV *mod_cmds); SV *modperl_module_config_get_obj(pTHX_ SV *pmodule, server_rec *s, ap_conf_vector_t *v); #endif /* MODPERL_MODULE_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_options.c0000644000104000010010000001116212540623203022544 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* re-use the ->unset field to determine options type */ #define MpOptionsType(o) (o)->unset #define MpOptionsTypeDir(o) MpOptionsType(o) == MpDir_f_UNSET #define MpOptionsTypeSrv(o) MpOptionsType(o) == MpSrv_f_UNSET #define MpOptionsTypeDir_set(o) MpOptionsType(o) = MpDir_f_UNSET #define MpOptionsTypeSrv_set(o) MpOptionsType(o) = MpSrv_f_UNSET #define MP_OPTIONS_TYPE_DIR MpDir_f_UNSET #define MP_OPTIONS_TYPE_SRV MpSrv_f_UNSET static modperl_opts_t flags_lookup(modperl_options_t *o, const char *str) { switch (MpOptionsType(o)) { case MP_OPTIONS_TYPE_SRV: return modperl_flags_lookup_srv(str); case MP_OPTIONS_TYPE_DIR: return modperl_flags_lookup_dir(str); default: return '\0'; }; } static const char *type_lookup(modperl_options_t *o) { switch (MpOptionsType(o)) { case MP_OPTIONS_TYPE_SRV: return "server"; case MP_OPTIONS_TYPE_DIR: return "directory"; default: return "unknown"; }; } modperl_options_t *modperl_options_new(apr_pool_t *p, int type) { modperl_options_t *options = (modperl_options_t *)apr_pcalloc(p, sizeof(*options)); options->opts = options->unset = (type == MpSrvType ? MpSrv_f_UNSET : MpDir_f_UNSET); return options; } const char *modperl_options_set(apr_pool_t *p, modperl_options_t *o, const char *str) { modperl_opts_t opt; char action = '\0'; const char *error = NULL; if (*str == '+' || *str == '-') { action = *(str++); } if ((opt = flags_lookup(o, str)) == -1) { error = apr_pstrcat(p, "Invalid per-", type_lookup(o), " PerlOption: ", str, NULL); if (MpOptionsTypeDir(o)) { modperl_options_t dummy; MpOptionsTypeSrv_set(&dummy); if (flags_lookup(&dummy, str) == -1) { error = apr_pstrcat(p, error, " (only allowed per-server)", NULL); } } return error; } #ifndef USE_ITHREADS else if (MpOptionsTypeSrv(o)) { if (MpSrvOPT_ITHREAD_ONLY(opt)) { return apr_pstrcat(p, "PerlOption `", str, "' requires an ithreads enabled Perl", NULL); } } #endif o->opts_seen |= opt; if (action == '-') { o->opts_remove |= opt; o->opts_add &= ~opt; o->opts &= ~opt; } else if (action == '+') { o->opts_add |= opt; o->opts_remove &= ~opt; o->opts |= opt; } else { o->opts |= opt; } return NULL; } modperl_options_t *modperl_options_merge(apr_pool_t *p, modperl_options_t *base, modperl_options_t *add) { modperl_options_t *conf = modperl_options_new(p, 0); memcpy((char *)conf, (const char *)base, sizeof(*base)); if (add->opts & add->unset) { /* there was no explicit setting of add->opts, so we merge * preserve the invariant (opts_add & opts_remove) == 0 */ conf->opts_add = (conf->opts_add & ~add->opts_remove) | add->opts_add; conf->opts_remove = (conf->opts_remove & ~add->opts_add) | add->opts_remove; conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add; } else { /* otherwise we just copy, because an explicit opts setting * overrides all earlier +/- modifiers */ conf->opts = add->opts; conf->opts_add = add->opts_add; conf->opts_remove = add->opts_remove; } conf->opts_seen |= add->opts_seen; return conf; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_options.h0000644000104000010010000000247312540623203022556 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_OPTIONS_H #define MODPERL_OPTIONS_H modperl_options_t *modperl_options_new(apr_pool_t *p, int type); const char *modperl_options_set(apr_pool_t *p, modperl_options_t *o, const char *s); modperl_options_t *modperl_options_merge(apr_pool_t *p, modperl_options_t *base, modperl_options_t *new); #endif /* MODPERL_OPTIONS_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_pcw.c0000644000104000010010000001106212540623203021641 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* * pcw == Parsed Config Walker * generic functions for walking parsed config using callbacks */ void ap_pcw_walk_location_config(apr_pool_t *pconf, server_rec *s, core_server_config *sconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data) { int i; ap_conf_vector_t **urls; if( !sconf->sec_url ) return; urls = (ap_conf_vector_t **)sconf->sec_url->elts; for (i = 0; i < sconf->sec_url->nelts; i++) { core_dir_config *conf = ap_get_module_config(urls[i], &core_module); void *dir_cfg = ap_get_module_config(urls[i], modp); if (!dir_cb(pconf, s, dir_cfg, conf->d, data)) { break; } } } void ap_pcw_walk_directory_config(apr_pool_t *pconf, server_rec *s, core_server_config *sconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data) { int i; ap_conf_vector_t **dirs; if( !sconf->sec_dir ) return; dirs = (ap_conf_vector_t **)sconf->sec_dir->elts; for (i = 0; i < sconf->sec_dir->nelts; i++) { core_dir_config *conf = ap_get_module_config(dirs[i], &core_module); void *dir_cfg = ap_get_module_config(dirs[i], modp); if (!dir_cb(pconf, s, dir_cfg, conf->d, data)) { break; } } } void ap_pcw_walk_files_config(apr_pool_t *pconf, server_rec *s, core_dir_config *dconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data) { int i; ap_conf_vector_t **dirs; if( !dconf->sec_file ) return; dirs = (ap_conf_vector_t **)dconf->sec_file->elts; for (i = 0; i < dconf->sec_file->nelts; i++) { core_dir_config *conf = ap_get_module_config(dirs[i], &core_module); void *dir_cfg = ap_get_module_config(dirs[i], modp); if (!dir_cb(pconf, s, dir_cfg, conf->d, data)) { break; } } } void ap_pcw_walk_default_config(apr_pool_t *pconf, server_rec *s, module *modp, ap_pcw_dir_cb_t dir_cb, void *data) { core_dir_config *conf = ap_get_module_config(s->lookup_defaults, &core_module); void *dir_cfg = ap_get_module_config(s->lookup_defaults, modp); dir_cb(pconf, s, dir_cfg, conf->d, data); } void ap_pcw_walk_server_config(apr_pool_t *pconf, server_rec *s, module *modp, ap_pcw_srv_cb_t srv_cb, void *data) { void *cfg = ap_get_module_config(s->module_config, modp); if (!cfg) { return; } srv_cb(pconf, s, cfg, data); } void ap_pcw_walk_config(apr_pool_t *pconf, server_rec *s, module *modp, void *data, ap_pcw_dir_cb_t dir_cb, ap_pcw_srv_cb_t srv_cb) { for (; s; s = s->next) { core_dir_config *dconf = ap_get_module_config(s->lookup_defaults, &core_module); core_server_config *sconf = ap_get_module_config(s->module_config, &core_module); if (dir_cb) { ap_pcw_walk_location_config(pconf, s, sconf, modp, dir_cb, data); ap_pcw_walk_directory_config(pconf, s, sconf, modp, dir_cb, data); ap_pcw_walk_files_config(pconf, s, dconf, modp, dir_cb, data); ap_pcw_walk_default_config(pconf, s, modp, dir_cb, data); } if (srv_cb) { ap_pcw_walk_server_config(pconf, s, modp, srv_cb, data); } } } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_pcw.h0000644000104000010010000000462112540623203021651 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_PCW_H #define MODPERL_PCW_H typedef int (*ap_pcw_dir_cb_t) (apr_pool_t *, server_rec *, void *, char *, void *); typedef int (*ap_pcw_srv_cb_t) (apr_pool_t *, server_rec *, void *, void *); void ap_pcw_walk_location_config(apr_pool_t *pconf, server_rec *s, core_server_config *sconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data); void ap_pcw_walk_directory_config(apr_pool_t *pconf, server_rec *s, core_server_config *sconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data); void ap_pcw_walk_files_config(apr_pool_t *pconf, server_rec *s, core_dir_config *dconf, module *modp, ap_pcw_dir_cb_t dir_cb, void *data); void ap_pcw_walk_default_config(apr_pool_t *pconf, server_rec *s, module *modp, ap_pcw_dir_cb_t dir_cb, void *data); void ap_pcw_walk_server_config(apr_pool_t *pconf, server_rec *s, module *modp, ap_pcw_srv_cb_t srv_cb, void *data); void ap_pcw_walk_config(apr_pool_t *pconf, server_rec *s, module *modp, void *data, ap_pcw_dir_cb_t dir_cb, ap_pcw_srv_cb_t srv_cb); #endif /* MODPERL_PCW_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl.c0000644000104000010010000001736412540623203022025 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* this module contains mod_perl small tweaks to the Perl runtime * others (larger tweaks) are in their own modules, e.g. modperl_env.c */ typedef struct { const char *name; const char *sub_name; const char *core_name; } modperl_perl_core_global_t; #define MP_PERL_CORE_GLOBAL_ENT(name) \ { name, "ModPerl::Util::" name, "CORE::GLOBAL::" name } static modperl_perl_core_global_t MP_perl_core_global_entries[] = { MP_PERL_CORE_GLOBAL_ENT("exit"), { NULL }, }; XS(XS_ModPerl__Util_exit); /* prototype to pass -Wmissing-prototypes */ XS(XS_ModPerl__Util_exit) { dXSARGS; int status; if (items < 0 || items > 1) { Perl_croak(aTHX_ "Usage: ModPerl::Util::exit(status=0)"); } /* default: 0 */ status = items < 1 ? 0 : (int)SvIV(ST(0)); modperl_perl_exit(aTHX_ status); XSRETURN_EMPTY; } void modperl_perl_core_global_init(pTHX) { modperl_perl_core_global_t *cglobals = MP_perl_core_global_entries; while (cglobals->name) { GV *gv = gv_fetchpv(cglobals->core_name, TRUE, SVt_PVCV); #ifdef MUTABLE_CV GvCV_set(gv, MUTABLE_CV(SvREFCNT_inc(get_cv(cglobals->sub_name, TRUE)))); #else GvCV_set(gv, (CV*)(SvREFCNT_inc(get_cv(cglobals->sub_name, TRUE)))); #endif GvIMPORTED_CV_on(gv); cglobals++; } newXS("ModPerl::Util::exit", XS_ModPerl__Util_exit, __FILE__); } static void modperl_perl_ids_get(modperl_perl_ids_t *ids) { ids->pid = (I32)getpid(); #ifdef MP_MAINTAIN_PPID ids->ppid = (I32)getppid(); #endif #ifndef WIN32 ids->uid = getuid(); ids->euid = geteuid(); ids->gid = getgid(); ids->egid = getegid(); MP_TRACE_r(MP_FUNC, "pid=%d, " #ifdef MP_MAINTAIN_PPID "ppid=%d, " #endif "uid=%" Uid_t_f ", euid=%" Uid_t_f ", " "gid=%" Gid_t_f ", egid=%" Gid_t_f, (int)ids->pid, #ifdef MP_MAINTAIN_PPID (int)ids->ppid, #endif ids->uid, ids->euid, ids->gid, ids->egid); #endif /* #ifndef WIN32 */ } static void modperl_perl_init_ids(pTHX_ modperl_perl_ids_t *ids) { sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), ids->pid); #if !MP_PERL_VERSION_AT_LEAST(5, 16, 0) #ifndef WIN32 PL_uid = ids->uid; PL_euid = ids->euid; PL_gid = ids->gid; PL_egid = ids->egid; #endif #ifdef MP_MAINTAIN_PPID PL_ppid = ids->ppid; #endif #endif } #ifdef USE_ITHREADS static apr_status_t modperl_perl_init_ids_mip(pTHX_ modperl_interp_pool_t *mip, void *data) { modperl_perl_init_ids(aTHX_ (modperl_perl_ids_t *)data); return APR_SUCCESS; } #endif /* USE_ITHREADS */ void modperl_perl_init_ids_server(server_rec *s) { modperl_perl_ids_t ids; modperl_perl_ids_get(&ids); #ifdef USE_ITHREADS modperl_interp_mip_walk_servers(NULL, s, modperl_perl_init_ids_mip, (void*)&ids); #else modperl_perl_init_ids(aTHX_ &ids); #endif } void modperl_perl_destruct(PerlInterpreter *perl) { char **orig_environ = NULL; PTR_TBL_t *module_commands; dTHXa(perl); PERL_SET_CONTEXT(perl); modperl_perl_call_endav(aTHX); PL_perl_destruct_level = modperl_perl_destruct_level(); #ifdef USE_ENVIRON_ARRAY /* XXX: otherwise Perl may try to free() environ multiple times * but it wasn't Perl that modified environ * at least, not if modperl is doing things right * this is a bug in Perl. */ # ifdef WIN32 /* * PL_origenviron = environ; doesn't work under win32 service. * we pull a different stunt here that has the same effect of * tricking perl into _not_ freeing the real 'environ' array. * instead temporarily swap with a dummy array we malloc * here which is ok to let perl free. */ orig_environ = environ; environ = safemalloc(2 * sizeof(char *)); environ[0] = NULL; # else PL_origenviron = environ; # endif #endif { dTHXa(perl); if ((module_commands = modperl_module_config_table_get(aTHX_ FALSE))) { modperl_svptr_table_destroy(aTHX_ module_commands); } } perl_destruct(perl); /* XXX: big bug in 5.6.1 fixed in 5.7.2+ * XXX: try to find a workaround for 5.6.1 */ #if defined(WIN32) && !defined(CLONEf_CLONE_HOST) # define MP_NO_PERL_FREE #endif #ifndef MP_NO_PERL_FREE perl_free(perl); #endif #ifdef USE_ENVIRON_ARRAY if (orig_environ) { environ = orig_environ; } #endif } void modperl_perl_call_endav(pTHX) { if (PL_endav) { modperl_perl_call_list(aTHX_ PL_endav, "END"); } } #if !(MP_PERL_VERSION_AT_MOST(5, 8, 0)) && \ (defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)) #define MP_NEED_HASH_SEED_FIXUP #endif #ifdef MP_NEED_HASH_SEED_FIXUP static UV MP_init_hash_seed = 0; static bool MP_init_hash_seed_set = FALSE; #endif /* see modperl_hash_seed_set() */ void modperl_hash_seed_init(apr_pool_t *p) { #ifdef MP_NEED_HASH_SEED_FIXUP char *s; /* check if there is a specific hash seed passed via the env var * and if that's the case -- use it */ apr_status_t rv = apr_env_get(&s, "PERL_HASH_SEED", p); if (rv == APR_SUCCESS) { if (s) { while (isSPACE(*s)) s++; } if (s && isDIGIT(*s)) { MP_init_hash_seed = (UV)Atol(s); /* XXX: Atoul()? */ MP_init_hash_seed_set = TRUE; } } /* calculate our own random hash seed */ if (!MP_init_hash_seed_set) { apr_uuid_t *uuid = (apr_uuid_t *)apr_palloc(p, sizeof(apr_uuid_t)); char buf[APR_UUID_FORMATTED_LENGTH + 1]; int i; apr_initialize(); apr_uuid_get(uuid); apr_uuid_format(buf, uuid); /* fprintf(stderr, "UUID: %s\n", buf); */ /* XXX: need a better alg to convert uuid string into a seed */ for (i=0; buf[i]; i++){ MP_init_hash_seed += (UV)(i+1)*(buf[i]+MP_init_hash_seed); } MP_init_hash_seed_set = TRUE; } #endif } /* before 5.8.1, perl was using HASH_SEED=0, starting from 5.8.1 * it randomizes if perl was compiled with ccflags -DUSE_HASH_SEED * or -DUSE_HASH_SEED_EXPLICIT, in which case we need to tell perl * to use the same seed everywhere */ void modperl_hash_seed_set(pTHX) { #ifdef MP_NEED_HASH_SEED_FIXUP if (MP_init_hash_seed_set) { #if MP_PERL_VERSION_AT_LEAST(5, 17, 6) memcpy(&PL_hash_seed, &MP_init_hash_seed, sizeof(PL_hash_seed) > sizeof(MP_init_hash_seed) ? sizeof(MP_init_hash_seed) : sizeof(PL_hash_seed)); PL_hash_seed_set = MP_init_hash_seed_set; #elif MP_PERL_VERSION_AT_LEAST(5, 8, 2) PL_rehash_seed = MP_init_hash_seed; PL_rehash_seed_set = MP_init_hash_seed_set; #else PL_hash_seed = MP_init_hash_seed; PL_hash_seed_set = MP_init_hash_seed_set; #endif } #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl.h0000644000104000010010000000364412540623203022026 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_PERL_H #define MODPERL_PERL_H /* starting from 5.8.1 perl caches ppids, so we need to maintain our * own. some distros fetch fake 5.8.0 with changes from 5.8.1, so we * need to do that for those fake 5.8.0 as well. real 5.8.0 doesn't * have THREADS_HAVE_PIDS defined. */ #if MP_PERL_VERSION_AT_LEAST(5, 8, 0) && THREADS_HAVE_PIDS #define MP_MAINTAIN_PPID #endif typedef struct { I32 pid; Uid_t uid, euid; Gid_t gid, egid; #ifdef MP_MAINTAIN_PPID Uid_t ppid; #endif } modperl_perl_ids_t; void modperl_perl_core_global_init(pTHX); void modperl_perl_init_ids_server(server_rec *s); void modperl_perl_destruct(PerlInterpreter *perl); void modperl_perl_call_endav(pTHX); void modperl_hash_seed_init(apr_pool_t *p); void modperl_hash_seed_set(pTHX); #ifndef GvCV_set # define GvCV_set(gv, cv) (GvCV(gv)=(cv)) #endif #ifndef GvGP_set # define GvGP_set(gv, gp) (GvGP(gv)=(gp)) #endif #ifndef Newx # define Newx(v,n,t) New(0,v,n,t) #endif #ifndef Newxz # define Newxz(v,n,t) Newz(0,v,n,t) #endif #endif /* MODPERL_PERL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl_global.c0000644000104000010010000003336712540623203023346 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* XXX: PL_modglobal thingers might be useful elsewhere */ #define MP_MODGLOBAL_ENT(key) \ {key, "ModPerl::" key, MP_SSTRLEN("ModPerl::") + MP_SSTRLEN(key), 0} static modperl_modglobal_key_t MP_modglobal_keys[] = { MP_MODGLOBAL_ENT("END"), MP_MODGLOBAL_ENT("ANONSUB"), { NULL }, }; void modperl_modglobal_hash_keys(pTHX) { modperl_modglobal_key_t *gkey = MP_modglobal_keys; while (gkey->name) { PERL_HASH(gkey->hash, gkey->val, gkey->len); gkey++; } } modperl_modglobal_key_t *modperl_modglobal_lookup(pTHX_ const char *name) { modperl_modglobal_key_t *gkey = MP_modglobal_keys; while (gkey->name) { if (strEQ(gkey->name, name)) { return gkey; } gkey++; } return NULL; } static void modperl_perl_global_init(pTHX_ modperl_perl_globals_t *globals) { globals->env.gv = PL_envgv; globals->inc.gv = PL_incgv; globals->defout.gv = PL_defoutgv; globals->rs.sv = &PL_rs; globals->end.av = &PL_endav; globals->end.key = MP_MODGLOBAL_END; } /* * if (exists $PL_modglobal{$key}{$package}) { * return $PL_modglobal{$key}{$package}; * } * elsif ($autovivify) { * return $PL_modglobal{$key}{$package} = []; * } * else { * return (AV *)NULL; # a null pointer in C of course :) * } */ static AV *modperl_perl_global_avcv_fetch(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen, I32 autovivify) { HE *he = MP_MODGLOBAL_FETCH(gkey); HV *hv; if (!(he && (hv = (HV*)HeVAL(he)))) { if (autovivify) { hv = MP_MODGLOBAL_STORE_HV(gkey); } else { return (AV *)NULL; } } if ((he = hv_fetch_he(hv, (char *)package, packlen, 0))) { return (AV*)HeVAL(he); } else { if (autovivify) { return (AV*)*hv_store(hv, package, packlen, (SV*)newAV(), 0); } else { return (AV *)NULL; } } } /* autovivify $PL_modglobal{$key}{$package} if it doesn't exist yet, * so that in modperl_perl_global_avcv_set we will know whether to * store blocks in it or keep them in the original list. * * For example in the case of END blocks, if * $PL_modglobal{END}{$package} exists, modperl_perl_global_avcv_set * will push newly encountered END blocks to it, otherwise it'll keep * them in PL_endav. */ void modperl_perl_global_avcv_register(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen) { AV *av = modperl_perl_global_avcv_fetch(aTHX_ gkey, package, packlen, TRUE); MP_TRACE_g(MP_FUNC, "register PL_modglobal %s::%s (has %d entries)", package, (char*)gkey->name, av ? 1+av_len(av) : 0); } /* if (exists $PL_modglobal{$key}{$package}) { * for my $cv (@{ $PL_modglobal{$key}{$package} }) { * $cv->(); * } * } */ void modperl_perl_global_avcv_call(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen) { AV *av = modperl_perl_global_avcv_fetch(aTHX_ gkey, package, packlen, FALSE); MP_TRACE_g(MP_FUNC, "run PL_modglobal %s::%s (has %d entries)", package, (char*)gkey->name, av ? 1+av_len(av) : 0); if (av) { modperl_perl_call_list(aTHX_ av, gkey->name); } } /* if (exists $PL_modglobal{$key}{$package}) { * @{ $PL_modglobal{$key}{$package} } = (); * } */ void modperl_perl_global_avcv_clear(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen) { AV *av = modperl_perl_global_avcv_fetch(aTHX_ gkey, package, packlen, FALSE); MP_TRACE_g(MP_FUNC, "clear PL_modglobal %s::%s (has %d entries)", package, (char*)gkey->name, av ? 1+av_len(av) : 0); if (av) { av_clear(av); } } static int modperl_perl_global_avcv_set(pTHX_ SV *sv, MAGIC *mg) { AV *mav, *av = (AV*)sv; const char *package = HvNAME(PL_curstash); I32 packlen = strlen(package); modperl_modglobal_key_t *gkey = (modperl_modglobal_key_t *)mg->mg_ptr; /* the argument sv, is the original list perl was operating on. * (e.g. PL_endav). So now if we find that we have package/cv name * (e.g. Foo/END) registered for set-aside, we remove the cv that * was just unshifted in and push it into * $PL_modglobal{$key}{$package}. Otherwise we do nothing, which * keeps the unshifted cv (e.g. END block) in its original av * (e.g. PL_endav) */ mav = modperl_perl_global_avcv_fetch(aTHX_ gkey, package, packlen, FALSE); if (!mav) { MP_TRACE_g(MP_FUNC, "%s::%s is not going to PL_modglobal", package, (char*)gkey->name); /* keep it in the tied list (e.g. PL_endav) */ return 1; } MP_TRACE_g(MP_FUNC, "%s::%s is going into PL_modglobal", package, (char*)gkey->name); sv = av_shift(av); /* push @{ $PL_modglobal{$key}{$package} }, $cv */ av_store(mav, AvFILLp(mav)+1, sv); /* print scalar @{ $PL_modglobal{$key}{$package} } */ MP_TRACE_g(MP_FUNC, "%s::%s av now has %d entries", package, (char*)gkey->name, 1+av_len(mav)); return 1; } static MGVTBL modperl_vtbl_global_avcv_t = { 0, modperl_perl_global_avcv_set, 0, 0, 0, }; static void modperl_perl_global_avcv_tie(pTHX_ modperl_modglobal_key_e key, AV *av) { if (!SvMAGIC((SV*)av)) { MAGIC *mg; Newxz(mg, 1, MAGIC); mg->mg_virtual = &modperl_vtbl_global_avcv_t; mg->mg_ptr = (char *)&MP_modglobal_keys[key]; mg->mg_len = -1; /* prevent free() of mg->mg_ptr */ SvMAGIC((SV*)av) = mg; } SvSMAGICAL_on((SV*)av); } static void modperl_perl_global_avcv_untie(pTHX_ AV *av) { SvSMAGICAL_off((SV*)av); } static void modperl_perl_global_avcv_save(pTHX_ modperl_perl_global_avcv_t *avcv) { if (!*avcv->av) { *avcv->av = newAV(); } modperl_perl_global_avcv_tie(aTHX_ avcv->key, *avcv->av); } static void modperl_perl_global_avcv_restore(pTHX_ modperl_perl_global_avcv_t *avcv) { modperl_perl_global_avcv_untie(aTHX_ *avcv->av); } /* * newHVhv is not good enough since it does not copy magic. * XXX: 5.8.0+ newHVhv has some code thats faster than hv_iternext */ static HV *copyENV(pTHX_ HV *ohv) { HE *entry, *hv_eiter; I32 hv_riter; register HV *hv; STRLEN hv_max = HvMAX(ohv); STRLEN hv_fill = HvFILL(ohv); hv = newHV(); while (hv_max && hv_max + 1 >= hv_fill * 2) { hv_max = hv_max / 2; /* Is always 2^n-1 */ } HvMAX(hv) = hv_max; if (!hv_fill) { return hv; } hv_riter = HvRITER(ohv); /* current root of iterator */ hv_eiter = HvEITER(ohv); /* current entry of iterator */ hv_iterinit(ohv); while ((entry = hv_iternext(ohv))) { SV *sv = newSVsv(HeVAL(entry)); modperl_envelem_tie(sv, HeKEY(entry), HeKLEN(entry)); (void)hv_store(hv, HeKEY(entry), HeKLEN(entry), sv, HeHASH(entry)); } HvRITER(ohv) = hv_riter; HvEITER(ohv) = hv_eiter; hv_magic(hv, (GV *)NULL, 'E'); TAINT_NOT; return hv; } static void modperl_perl_global_gvhv_save(pTHX_ modperl_perl_global_gvhv_t *gvhv) { HV *hv = GvHV(gvhv->gv); #if 0 U32 mg_flags; MAGIC *mg = SvMAGIC(hv); /* * there should only be a small number of entries in %ENV * at this point: modperl_env.c:modperl_env_const_vars[], * PerlPassEnv and top-level PerlSetEnv * XXX: still; could have have something faster than newHVhv() * especially if we add another GVHV to the globals table that * might have more entries */ /* makes newHVhv() faster in bleedperl */ MP_magical_untie(hv, mg_flags); gvhv->tmphv = newHVhv(hv); TAINT_NOT; /* reapply magic flags */ MP_magical_tie(hv, mg_flags); MP_magical_tie(gvhv->tmphv, mg_flags); if (mg && mg->mg_type && !SvMAGIC(gvhv->tmphv)) { /* propagate SvMAGIC(hv) to SvMAGIC(gvhv->tmphv) */ /* XXX: maybe newHVhv should do this? */ hv_magic(gvhv->tmphv, (GV *)NULL, mg->mg_type); } #else gvhv->tmphv = copyENV(aTHX_ hv); #endif gvhv->orighv = hv; GvHV(gvhv->gv) = gvhv->tmphv; } static void modperl_perl_global_gvhv_restore(pTHX_ modperl_perl_global_gvhv_t *gvhv) { U32 mg_flags; GvHV(gvhv->gv) = gvhv->orighv; /* loose magic for hv_clear() * e.g. for %ENV don't want to clear environ array */ MP_magical_untie(gvhv->tmphv, mg_flags); SvREFCNT_dec(gvhv->tmphv); /* avoiding -Wall warning */ mg_flags = mg_flags; } static void modperl_perl_global_gvav_save(pTHX_ modperl_perl_global_gvav_t *gvav) { gvav->origav = GvAV(gvav->gv); gvav->tmpav = newAV(); modperl_perl_av_push_elts_ref(aTHX_ gvav->tmpav, gvav->origav); GvAV(gvav->gv) = gvav->tmpav; } static void modperl_perl_global_gvav_restore(pTHX_ modperl_perl_global_gvav_t *gvav) { GvAV(gvav->gv) = gvav->origav; SvREFCNT_dec(gvav->tmpav); } static void modperl_perl_global_gvio_save(pTHX_ modperl_perl_global_gvio_t *gvio) { gvio->flags = IoFLAGS(GvIOp(gvio->gv)); } static void modperl_perl_global_gvio_restore(pTHX_ modperl_perl_global_gvio_t *gvio) { IoFLAGS(GvIOp(gvio->gv)) = gvio->flags; } static void modperl_perl_global_svpv_save(pTHX_ modperl_perl_global_svpv_t *svpv) { svpv->cur = SvCUR(*svpv->sv); strncpy(svpv->pv, SvPVX(*svpv->sv), sizeof(svpv->pv)); } static void modperl_perl_global_svpv_restore(pTHX_ modperl_perl_global_svpv_t *svpv) { sv_setpvn(*svpv->sv, svpv->pv, svpv->cur); } typedef enum { MP_GLOBAL_AVCV, MP_GLOBAL_GVHV, MP_GLOBAL_GVAV, MP_GLOBAL_GVIO, MP_GLOBAL_SVPV } modperl_perl_global_types_e; typedef struct { char *name; int offset; modperl_perl_global_types_e type; } modperl_perl_global_entry_t; #define MP_GLOBAL_OFFSET(m) \ STRUCT_OFFSET(modperl_perl_globals_t, m) static modperl_perl_global_entry_t MP_perl_global_entries[] = { {"END", MP_GLOBAL_OFFSET(end), MP_GLOBAL_AVCV}, /* END */ {"ENV", MP_GLOBAL_OFFSET(env), MP_GLOBAL_GVHV}, /* %ENV */ {"INC", MP_GLOBAL_OFFSET(inc), MP_GLOBAL_GVAV}, /* @INC */ {"STDOUT", MP_GLOBAL_OFFSET(defout), MP_GLOBAL_GVIO}, /* $| */ {"/", MP_GLOBAL_OFFSET(rs), MP_GLOBAL_SVPV}, /* $/ */ {NULL} }; #define MP_PERL_GLOBAL_SAVE(type, ptr) \ modperl_perl_global_##type##_save( \ aTHX_ (modperl_perl_global_##type##_t *)&(*ptr)) #define MP_PERL_GLOBAL_RESTORE(type, ptr) \ modperl_perl_global_##type##_restore( \ aTHX_ (modperl_perl_global_##type##_t *)&(*ptr)) #define MP_dGLOBAL_PTR(globals, entries) \ apr_uint64_t **ptr = (apr_uint64_t **) \ ((char *)globals + (int)(long)entries->offset) static void modperl_perl_global_save(pTHX_ modperl_perl_globals_t *globals, modperl_perl_global_entry_t *entries) { modperl_perl_global_init(aTHX_ globals); while (entries->name) { MP_dGLOBAL_PTR(globals, entries); switch (entries->type) { case MP_GLOBAL_AVCV: MP_PERL_GLOBAL_SAVE(avcv, ptr); break; case MP_GLOBAL_GVHV: MP_PERL_GLOBAL_SAVE(gvhv, ptr); break; case MP_GLOBAL_GVAV: MP_PERL_GLOBAL_SAVE(gvav, ptr); break; case MP_GLOBAL_GVIO: MP_PERL_GLOBAL_SAVE(gvio, ptr); break; case MP_GLOBAL_SVPV: MP_PERL_GLOBAL_SAVE(svpv, ptr); break; } entries++; } } static void modperl_perl_global_restore(pTHX_ modperl_perl_globals_t *globals, modperl_perl_global_entry_t *entries) { while (entries->name) { MP_dGLOBAL_PTR(globals, entries); switch (entries->type) { case MP_GLOBAL_AVCV: MP_PERL_GLOBAL_RESTORE(avcv, ptr); break; case MP_GLOBAL_GVHV: MP_PERL_GLOBAL_RESTORE(gvhv, ptr); break; case MP_GLOBAL_GVAV: MP_PERL_GLOBAL_RESTORE(gvav, ptr); break; case MP_GLOBAL_GVIO: MP_PERL_GLOBAL_RESTORE(gvio, ptr); break; case MP_GLOBAL_SVPV: MP_PERL_GLOBAL_RESTORE(svpv, ptr); break; } entries++; } } void modperl_perl_global_request_save(pTHX_ request_rec *r) { MP_dRCFG; modperl_perl_global_save(aTHX_ &rcfg->perl_globals, MP_perl_global_entries); } void modperl_perl_global_request_restore(pTHX_ request_rec *r) { MP_dRCFG; modperl_perl_global_restore(aTHX_ &rcfg->perl_globals, MP_perl_global_entries); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl_global.h0000644000104000010010000000547012540623203023345 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_PERL_GLOBAL_H #define MODPERL_PERL_GLOBAL_H #define MP_MODGLOBAL_FETCH(gkey) \ hv_fetch_he(PL_modglobal, (char *)gkey->val, gkey->len, gkey->hash) #define MP_MODGLOBAL_STORE_HV(gkey) \ (HV*)*hv_store(PL_modglobal, gkey->val, gkey->len, \ (SV*)newHV(), gkey->hash) typedef struct { const char *name; const char *val; I32 len; U32 hash; } modperl_modglobal_key_t; typedef enum { MP_MODGLOBAL_END } modperl_modglobal_key_e; typedef struct { AV **av; modperl_modglobal_key_e key; } modperl_perl_global_avcv_t; typedef struct { GV *gv; AV *tmpav; AV *origav; } modperl_perl_global_gvav_t; typedef struct { GV *gv; HV *tmphv; HV *orighv; } modperl_perl_global_gvhv_t; typedef struct { GV *gv; char flags; } modperl_perl_global_gvio_t; typedef struct { SV **sv; char pv[256]; /* XXX: only need enough for $/ at the moment */ I32 cur; } modperl_perl_global_svpv_t; typedef struct { modperl_perl_global_avcv_t end; modperl_perl_global_gvhv_t env; modperl_perl_global_gvav_t inc; modperl_perl_global_gvio_t defout; modperl_perl_global_svpv_t rs; } modperl_perl_globals_t; void modperl_modglobal_hash_keys(pTHX); modperl_modglobal_key_t *modperl_modglobal_lookup(pTHX_ const char *name); void modperl_perl_global_request_save(pTHX_ request_rec *r); void modperl_perl_global_request_restore(pTHX_ request_rec *r); void modperl_perl_global_avcv_register(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen); void modperl_perl_global_avcv_call(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen); void modperl_perl_global_avcv_clear(pTHX_ modperl_modglobal_key_t *gkey, const char *package, I32 packlen); #endif /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl_includes.h0000644000104000010010000000765412540623203023721 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_PERL_INCLUDES_H #define MODPERL_PERL_INCLUDES_H /* header files for Perl */ #ifndef PERL_NO_GET_CONTEXT # define PERL_NO_GET_CONTEXT #endif #define PERLIO_NOT_STDIO 0 #include "config.h" /* * sizeof(struct PerlInterpreter) changes #ifdef USE_LARGE_FILES * apache-2.0 cannot be compiled with lfs because of sendfile.h * the PERL_CORE optimization is a no-no in this case */ #if defined(USE_ITHREADS) && !defined(USE_LARGE_FILES) # define PERL_CORE #endif #ifdef MP_SOURCE_SCAN /* XXX: C::Scan does not properly remove __attribute__ within * function prototypes; so we just rip them all out via cpp */ # undef __attribute__ # define __attribute__(arg) # ifdef MP_SOURCE_SCAN_NEED_ITHREADS /* just need to have pTHX_ defined for proper prototypes */ # define USE_ITHREADS # endif #endif #ifdef WIN32 # define uid_t perl_uid_t # define gid_t perl_gid_t # ifdef exit # undef exit # endif #endif /* needed starting from 5.8.2 to access the PERL_HASH_INTERNAL macro * in hv.h. we use it in modperl_util.c */ #define PERL_HASH_INTERNAL_ACCESS #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #if defined(WIN32) && defined(USE_LARGE_FILES) # ifdef malloc # undef malloc # endif # ifdef free # undef free # endif #endif #include "modperl_perl_unembed.h" /* avoiding -Wall warning */ #undef dNOOP #define dNOOP extern int __attribute__ ((unused)) Perl___notused___modperl #ifndef G_METHOD # define G_METHOD 64 #endif #ifndef PERL_MAGIC_tied # define PERL_MAGIC_tied 'P' #endif #ifndef PERL_MAGIC_tiedscalar # define PERL_MAGIC_tiedscalar 'q' #endif #ifndef PERL_MAGIC_ext # define PERL_MAGIC_ext '~' #endif #if defined(__APPLE__) && !defined(PERL_CORE) && !defined(environ) # include # define environ (*_NSGetEnviron()) #endif /* sv_copypv was added in perl 5.7.3 */ #ifndef sv_copypv # define sv_copypv(dsv, ssv) \ STMT_START { \ STRLEN len; \ char *s; \ s = SvPV(ssv, len); \ sv_setpvn(dsv, s, len); \ if (SvUTF8(ssv)) { \ SvUTF8_on(dsv); \ } \ else { \ SvUTF8_off(dsv); \ } \ } STMT_END #endif /* perl bug workaround: with USE_ITHREADS perl leaks pthread_key_t on * every reload of libperl.{a,so} (it's allocated on the very first * perl_alloc() and never freed). This becomes a problem on apache * restart: if the OS limit is 1024, 1024 restarts later things will * start crashing */ /* XXX: once and if it's fixed in perl, we need to disable it for the * versions that have it fixed, otherwise it'll crash because it'll be * freed twice */ #ifdef USE_ITHREADS #define MP_PERL_FREE_THREAD_KEY_WORKAROUND \ if (PL_curinterp) { \ FREE_THREAD_KEY; \ PL_curinterp = NULL; \ } #else #define MP_PERL_FREE_THREAD_KEY_WORKAROUND #endif #endif /* MODPERL_PERL_INCLUDES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_perl_pp.c0000644000104000010010000000520712540623203022515 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" static enum opcode MP_pp_map[] = { #ifdef MP_REFGEN_FIXUP OP_SREFGEN, #endif OP_REQUIRE }; typedef OP * (*modperl_pp_t)(pTHX); static modperl_pp_t MP_PERL_ppaddr[MP_OP_max]; #ifdef MP_REFGEN_FIXUP /* * nasty workaround for bug fixed in bleedperl (11536 + 11553) * XXX: when 5.8.0 is released + stable, we will require 5.8.0 * if ithreads are enabled. */ static OP *modperl_pp_srefgen(pTHX) { dSP; OP *o; SV *sv = *SP; if (SvPADTMP(sv) && IS_PADGV(sv)) { /* prevent S_refto from making a copy of the GV, * tricking it to SvREFCNT_inc and point to this one instead. */ SvPADTMP_off(sv); } else { sv = (SV *)NULL; } /* o = Perl_pp_srefgen(aTHX) */ o = MP_PERL_ppaddr[MP_OP_SREFGEN](aTHX); if (sv) { /* restore original flags */ SvPADTMP_on(sv); } return o; } #endif /* MP_REFGEN_FIXUP */ static OP *modperl_pp_require(pTHX) { /* nothing yet */ return MP_PERL_ppaddr[MP_OP_REQUIRE](aTHX); } static modperl_pp_t MP_ppaddr[] = { #ifdef MP_REFGEN_FIXUP modperl_pp_srefgen, #endif modperl_pp_require }; void modperl_perl_pp_set(modperl_perl_opcode_e idx) { int pl_idx = MP_pp_map[idx]; /* save original */ MP_PERL_ppaddr[idx] = PL_ppaddr[pl_idx]; /* replace with our own */ PL_ppaddr[pl_idx] = MP_ppaddr[idx]; } void modperl_perl_pp_set_all(void) { int i; for (i=0; itbl_max = source->tbl_max; tbl->tbl_items = source->tbl_items; Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t *); dst_ary = tbl->tbl_ary; src_ary = source->tbl_ary; Zero(&parms, 1, CLONE_PARAMS); parms.flags = 0; parms.stashes = newAV(); for (i=0; i < source->tbl_max; i++, dst_ary++, src_ary++) { PTR_TBL_ENT_t *src_ent, *dst_ent=NULL; if (!*src_ary) { continue; } for (src_ent = *src_ary; src_ent; src_ent = src_ent->next) { if (dst_ent == NULL) { Newxz(dst_ent, 1, PTR_TBL_ENT_t); *dst_ary = dst_ent; } else { Newxz(dst_ent->next, 1, PTR_TBL_ENT_t); dst_ent = dst_ent->next; } /* key is just a pointer we do not modify, no need to copy */ dst_ent->oldval = src_ent->oldval; dst_ent->newval = my_sv_dup((SV*)src_ent->newval, &parms); } } SvREFCNT_dec(parms.stashes); return tbl; } #endif /* * need to free the SV values in addition to ptr_table_free */ void modperl_svptr_table_destroy(pTHX_ PTR_TBL_t *tbl) { UV i; PTR_TBL_ENT_t **ary = tbl->tbl_ary; for (i=0; i < tbl->tbl_max; i++, ary++) { PTR_TBL_ENT_t *ent; if (!*ary) { continue; } for (ent = *ary; ent; ent = ent->next) { if (!ent->newval) { continue; } SvREFCNT_dec((SV*)ent->newval); ent->newval = NULL; } } modperl_svptr_table_free(aTHX_ tbl); } /* * the Perl ptr_table_ api does not provide a function to remove * an entry from the table. we need to SvREFCNT_dec the SV value * anyhow. */ void modperl_svptr_table_delete(pTHX_ PTR_TBL_t *tbl, void *key) { PTR_TBL_ENT_t *entry, **oentry; UV hash = PTR2UV(key); oentry = &tbl->tbl_ary[hash & tbl->tbl_max]; entry = *oentry; for (; entry; oentry = &entry->next, entry = *oentry) { if (entry->oldval == key) { *oentry = entry->next; SvREFCNT_dec((SV*)entry->newval); Safefree(entry); tbl->tbl_items--; return; } } } /* * XXX: the following are a copy of the Perl 5.8.0 Perl_ptr_table api * renamed s/Perl_ptr/modperl_svptr/g; * two reasons: * these functions do not exist without -DUSE_ITHREADS * the clear/free functions do not exist in 5.6.x */ /* create a new pointer-mapping table */ PTR_TBL_t * modperl_svptr_table_new(pTHX) { PTR_TBL_t *tbl; Newxz(tbl, 1, PTR_TBL_t); tbl->tbl_max = 511; tbl->tbl_items = 0; Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*); return tbl; } /* map an existing pointer using a table */ void * modperl_svptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv) { PTR_TBL_ENT_t *tblent; UV hash = PTR2UV(sv); MP_ASSERT(tbl); tblent = tbl->tbl_ary[hash & tbl->tbl_max]; for (; tblent; tblent = tblent->next) { if (tblent->oldval == sv) return tblent->newval; } return (void*)NULL; } /* add a new entry to a pointer-mapping table */ void modperl_svptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv) { PTR_TBL_ENT_t *tblent, **otblent; /* XXX this may be pessimal on platforms where pointers aren't good * hash values e.g. if they grow faster in the most significant * bits */ UV hash = PTR2UV(oldv); bool i = 1; MP_ASSERT(tbl); otblent = &tbl->tbl_ary[hash & tbl->tbl_max]; for (tblent = *otblent; tblent; i=0, tblent = tblent->next) { if (tblent->oldval == oldv) { tblent->newval = newv; return; } } Newxz(tblent, 1, PTR_TBL_ENT_t); tblent->oldval = oldv; tblent->newval = newv; tblent->next = *otblent; *otblent = tblent; tbl->tbl_items++; if (i && tbl->tbl_items > tbl->tbl_max) modperl_svptr_table_split(aTHX_ tbl); } /* double the hash bucket size of an existing ptr table */ void modperl_svptr_table_split(pTHX_ PTR_TBL_t *tbl) { PTR_TBL_ENT_t **ary = tbl->tbl_ary; UV oldsize = tbl->tbl_max + 1; UV newsize = oldsize * 2; UV i; Renew(ary, newsize, PTR_TBL_ENT_t*); Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*); tbl->tbl_max = --newsize; tbl->tbl_ary = ary; for (i=0; i < oldsize; i++, ary++) { PTR_TBL_ENT_t **curentp, **entp, *ent; if (!*ary) continue; curentp = ary + oldsize; for (entp = ary, ent = *ary; ent; ent = *entp) { if ((newsize & PTR2UV(ent->oldval)) != i) { *entp = ent->next; ent->next = *curentp; *curentp = ent; continue; } else entp = &ent->next; } } } /* remove all the entries from a ptr table */ void modperl_svptr_table_clear(pTHX_ PTR_TBL_t *tbl) { register PTR_TBL_ENT_t **array; register PTR_TBL_ENT_t *entry; register PTR_TBL_ENT_t *oentry = (PTR_TBL_ENT_t *)NULL; UV riter = 0; UV max; if (!tbl || !tbl->tbl_items) { return; } array = tbl->tbl_ary; entry = array[0]; max = tbl->tbl_max; for (;;) { if (entry) { oentry = entry; entry = entry->next; Safefree(oentry); } if (!entry) { if (++riter > max) { break; } entry = array[riter]; } } tbl->tbl_items = 0; } /* clear and free a ptr table */ void modperl_svptr_table_free(pTHX_ PTR_TBL_t *tbl) { if (!tbl) { return; } modperl_svptr_table_clear(aTHX_ tbl); Safefree(tbl->tbl_ary); Safefree(tbl); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_svptr_table.h0000644000104000010010000000350112540623203023401 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_SVPTR_TABLE_H #define MODPERL_SVPTR_TABLE_H #ifdef USE_ITHREADS PTR_TBL_t *modperl_svptr_table_clone(pTHX_ PerlInterpreter *proto_perl, PTR_TBL_t *source); #endif void modperl_svptr_table_destroy(pTHX_ PTR_TBL_t *tbl); void modperl_svptr_table_delete(pTHX_ PTR_TBL_t *tbl, void *key); /* * XXX: the following are a copy of the Perl 5.8.0 Perl_ptr_table api * renamed s/Perl_ptr/modperl_svptr/g; * two reasons: * these functions do not exist without -DUSE_ITHREADS * the clear/free functions do not exist in 5.6.x */ PTR_TBL_t * modperl_svptr_table_new(pTHX); void * modperl_svptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv); void modperl_svptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv); void modperl_svptr_table_split(pTHX_ PTR_TBL_t *tbl); void modperl_svptr_table_clear(pTHX_ PTR_TBL_t *tbl); void modperl_svptr_table_free(pTHX_ PTR_TBL_t *tbl); #endif /* MODPERL_SVPTR_TABLE_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_sys.c0000644000104000010010000000403012540623203021663 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_largefiles.h" #include "mod_perl.h" /* * Stat_t needs flags in modperl_largefiles.h */ int modperl_sys_is_dir(pTHX_ SV *sv) { Stat_t statbuf; STRLEN n_a; char *name = SvPV(sv, n_a); if (PerlLIO_stat(name, &statbuf) < 0) { return 0; } return S_ISDIR(statbuf.st_mode); } /* * Perl does not provide this abstraction. * APR does, but requires a pool. efforts to expose this area of apr * failed. so we roll our own. *sigh* */ int modperl_sys_dlclose(void *handle) { #if defined(MP_SYS_DL_DLOPEN) #ifdef I_DLFCN #include #else #include #include #endif return dlclose(handle) == 0; #elif defined(MP_SYS_DL_DYLD) return NSUnLinkModule(handle, FALSE); #elif defined(MP_SYS_DL_HPUX) #include shl_unload((shl_t)handle); return 1; #elif defined(MP_SYS_DL_WIN32) return FreeLibrary(handle); #elif defined(MP_SYS_DL_BEOS) return unload_add_on(handle) < B_NO_ERROR; #elif defined(MP_SYS_DL_DLLLOAD) return dllfree(handle) == 0; #elif defined(MP_SYS_DL_AIX) return dlclose(handle) == 0; #else #error "modperl_sys_dlclose not defined on this platform" return 0; #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_sys.h0000644000104000010010000000221612540623203021674 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_SYS_H #define MODPERL_SYS_H /* * system specific type stuff. * hopefully won't be much here since Perl/APR/Apache * take care of most portablity issues. */ int modperl_sys_is_dir(pTHX_ SV *sv); int modperl_sys_dlclose(void *handle); #endif /* MODPERL_SYS_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_time.h0000644000104000010010000000326712540623203022023 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_TIME_H #define MODPERL_TIME_H #ifdef HZ # define MP_HZ HZ #else # define MP_HZ 100 #endif #ifdef MP_TRACE #define dMP_TIMES \ struct tms start_time; \ struct tms end_time #else #define dMP_TIMES dNOOP #endif #define MP_START_TIMES() \ MP_TRACE_t_do((void)PerlProc_times(&start_time)) #define MP_END_TIMES() \ MP_TRACE_t_do((void)PerlProc_times(&end_time)) #define MP_PRINT_TIMES(label) \ MP_TRACE_t_do({ \ double utime = \ (double)(end_time.tms_utime - start_time.tms_utime)/MP_HZ; \ double stime = \ (double)(end_time.tms_stime - start_time.tms_stime)/MP_HZ; \ if (utime || stime) { \ MP_TRACE_t(MP_FUNC, "%s %5.2f user %5.2f sys", \ label, utime, stime); \ } \ }) #endif /* MODPERL_TIME_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_tipool.c0000644000104000010010000002607612540623203022371 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #ifdef USE_ITHREADS /* * tipool == "thread item pool" * this module is intended to provide generic stuctures/functions * for managing a "pool" of a given items (data structures) within a threaded * process. at the moment, mod_perl uses this module to manage a pool * of PerlInterpreter objects. it should be quite easy to reuse for * other data, such as database connection handles and the like. * while it is "generic" it is also tuned for Apache, making use of * apr_pool_t and the like, and implementing start/max/{min,max}_spare/ * max_requests configuration. * this is another "proof-of-concept", plenty of room for improvement here */ modperl_list_t *modperl_list_new() { modperl_list_t *listp = (modperl_list_t *)malloc(sizeof(*listp)); memset(listp, '\0', sizeof(*listp)); return listp; } modperl_list_t *modperl_list_last(modperl_list_t *list) { while (list->next) { list = list->next; } return list; } modperl_list_t *modperl_list_first(modperl_list_t *list) { while (list->prev) { list = list->prev; } return list; } modperl_list_t *modperl_list_append(modperl_list_t *list, modperl_list_t *new_list) { modperl_list_t *last; new_list->prev = new_list->next = NULL; if (!list) { return new_list; } last = modperl_list_last(list); last->next = new_list; new_list->prev = last; return list; } modperl_list_t *modperl_list_prepend(modperl_list_t *list, modperl_list_t *new_list) { new_list->prev = new_list->next = NULL; if (!list) { return new_list; } if (list->prev) { list->prev->next = new_list; new_list->prev = list->prev; } list->prev = new_list; new_list->next = list; return new_list; } modperl_list_t *modperl_list_remove(modperl_list_t *list, modperl_list_t *rlist) { modperl_list_t *tmp = list; while (tmp) { if (tmp != rlist) { tmp = tmp->next; } else { if (tmp->prev) { tmp->prev->next = tmp->next; } if (tmp->next) { tmp->next->prev = tmp->prev; } if (list == tmp) { list = list->next; } break; } } #ifdef MP_TRACE if (!tmp) { /* should never happen */ MP_TRACE_i(MP_FUNC, "failed to find 0x%lx in list 0x%lx", (unsigned long)rlist, (unsigned long)list); } #endif return list; } modperl_list_t *modperl_list_remove_data(modperl_list_t *list, void *data, modperl_list_t **listp) { modperl_list_t *tmp = list; while (tmp) { if (tmp->data != data) { tmp = tmp->next; } else { *listp = tmp; if (tmp->prev) { tmp->prev->next = tmp->next; } if (tmp->next) { tmp->next->prev = tmp->prev; } if (list == tmp) { list = list->next; } break; } } return list; } modperl_tipool_t *modperl_tipool_new(apr_pool_t *p, modperl_tipool_config_t *cfg, modperl_tipool_vtbl_t *func, void *data) { modperl_tipool_t *tipool = (modperl_tipool_t *)apr_pcalloc(p, sizeof(*tipool)); tipool->cfg = cfg; tipool->func = func; tipool->data = data; MUTEX_INIT(&tipool->tiplock); COND_INIT(&tipool->available); return tipool; } void modperl_tipool_init(modperl_tipool_t *tipool) { int i; for (i=0; icfg->start; i++) { void *item = (*tipool->func->tipool_sgrow)(tipool, tipool->data); modperl_tipool_add(tipool, item); } MP_TRACE_i(MP_FUNC, "start=%d, max=%d, min_spare=%d, max_spare=%d", tipool->cfg->start, tipool->cfg->max, tipool->cfg->min_spare, tipool->cfg->max_spare); } void modperl_tipool_destroy(modperl_tipool_t *tipool) { while (tipool->idle) { modperl_list_t *listp; if (tipool->func->tipool_destroy) { (*tipool->func->tipool_destroy)(tipool, tipool->data, tipool->idle->data); } tipool->size--; listp = tipool->idle->next; free(tipool->idle); tipool->idle = listp; } if (tipool->busy) { MP_TRACE_i(MP_FUNC, "ERROR: %d items still in use", tipool->in_use); } MUTEX_DESTROY(&tipool->tiplock); COND_DESTROY(&tipool->available); } void modperl_tipool_add(modperl_tipool_t *tipool, void *data) { modperl_list_t *listp = modperl_list_new(); listp->data = data; /* assuming tipool->tiplock has already been acquired */ tipool->idle = modperl_list_append(tipool->idle, listp); tipool->size++; MP_TRACE_i(MP_FUNC, "added 0x%lx (size=%d)", (unsigned long)listp, tipool->size); } void modperl_tipool_remove(modperl_tipool_t *tipool, modperl_list_t *listp) { /* assuming tipool->tiplock has already been acquired */ tipool->idle = modperl_list_remove(tipool->idle, listp); tipool->size--; MP_TRACE_i(MP_FUNC, "removed 0x%lx (size=%d)", (unsigned long)listp, tipool->size); } modperl_list_t *modperl_tipool_pop(modperl_tipool_t *tipool) { modperl_list_t *head; modperl_tipool_lock(tipool); if (tipool->size == tipool->in_use) { if (tipool->size < tipool->cfg->max) { MP_TRACE_i(MP_FUNC, "no idle items, size %d < %d max", tipool->size, tipool->cfg->max); if (tipool->func->tipool_rgrow) { void * item = (*tipool->func->tipool_rgrow)(tipool, tipool->data); modperl_tipool_add(tipool, item); } } /* block until an item becomes available */ modperl_tipool_wait(tipool); } head = tipool->idle; tipool->idle = modperl_list_remove(tipool->idle, head); tipool->busy = modperl_list_append(tipool->busy, head); tipool->in_use++; /* XXX: this should never happen */ if (!head) { MP_TRACE_i(MP_FUNC, "PANIC: no items available, %d of %d in use", tipool->in_use, tipool->size); abort(); } modperl_tipool_unlock(tipool); return head; } static void modperl_tipool_putback_base(modperl_tipool_t *tipool, modperl_list_t *listp, void *data, int num_requests) { int max_spare, max_requests; modperl_tipool_lock(tipool); /* remove from busy list, add back to idle */ /* XXX: option to sort list, e.g. on num_requests */ if (listp) { tipool->busy = modperl_list_remove(tipool->busy, listp); } else { tipool->busy = modperl_list_remove_data(tipool->busy, data, &listp); } if (!listp) { /* XXX: Attempt to putback something that was never there */ modperl_tipool_unlock(tipool); return; } tipool->idle = modperl_list_prepend(tipool->idle, listp); tipool->in_use--; #ifdef MP_TRACE if (!tipool->busy && tipool->func->tipool_dump) { MP_TRACE_i(MP_FUNC, "all items idle:"); MP_TRACE_i_do((*tipool->func->tipool_dump)(tipool, tipool->data, tipool->idle)); } #endif MP_TRACE_i(MP_FUNC, "0x%lx now available (%d in use, %d running)", (unsigned long)listp->data, tipool->in_use, tipool->size); modperl_tipool_broadcast(tipool); if (tipool->in_use == (tipool->cfg->max - 1)) { /* hurry up, another thread may be blocking */ modperl_tipool_unlock(tipool); return; } max_spare = ((tipool->size - tipool->in_use) > tipool->cfg->max_spare); max_requests = ((num_requests > 0) && (num_requests > tipool->cfg->max_requests)); if (max_spare) { MP_TRACE_i(MP_FUNC, "shrinking pool: max_spare=%d, only %d of %d in use", tipool->cfg->max_spare, tipool->in_use, tipool->size); } else if (max_requests) { MP_TRACE_i(MP_FUNC, "shrinking pool: max requests %d reached", tipool->cfg->max_requests); } /* XXX: this management should probably be happening elsewhere * like in a thread spawned at startup */ if (max_spare || max_requests) { modperl_tipool_remove(tipool, listp); if (tipool->func->tipool_destroy) { (*tipool->func->tipool_destroy)(tipool, tipool->data, listp->data); } free(listp); /* gone for good */ if (max_requests && ((tipool->size - tipool->in_use) < tipool->cfg->min_spare)) { if (tipool->func->tipool_rgrow) { void *item = (*tipool->func->tipool_rgrow)(tipool, tipool->data); MP_TRACE_i(MP_FUNC, "growing pool: min_spare=%d, %d of %d in use", tipool->cfg->min_spare, tipool->in_use, tipool->size); modperl_tipool_add(tipool, item); } } } modperl_tipool_unlock(tipool); } /* _data functions are so structures (e.g. modperl_interp_t) don't * need to maintain a pointer back to the modperl_list_t */ void modperl_tipool_putback_data(modperl_tipool_t *tipool, void *data, int num_requests) { modperl_tipool_putback_base(tipool, NULL, data, num_requests); } void modperl_tipool_putback(modperl_tipool_t *tipool, modperl_list_t *listp, int num_requests) { modperl_tipool_putback_base(tipool, listp, NULL, num_requests); } #endif /* USE_ITHREADS */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_tipool.h0000644000104000010010000000664112540623203022372 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_TIPOOL_H #define MODPERL_TIPOOL_H #ifdef USE_ITHREADS modperl_list_t *modperl_list_new(void); modperl_list_t *modperl_list_last(modperl_list_t *list); modperl_list_t *modperl_list_first(modperl_list_t *list); modperl_list_t *modperl_list_append(modperl_list_t *list, modperl_list_t *new_list); modperl_list_t *modperl_list_prepend(modperl_list_t *list, modperl_list_t *new_list); modperl_list_t *modperl_list_remove(modperl_list_t *list, modperl_list_t *rlist); modperl_tipool_t *modperl_tipool_new(apr_pool_t *p, modperl_tipool_config_t *cfg, modperl_tipool_vtbl_t *func, void *data); void modperl_tipool_init(modperl_tipool_t *tipool); void modperl_tipool_destroy(modperl_tipool_t *tipool); void modperl_tipool_add(modperl_tipool_t *tipool, void *data); void modperl_tipool_remove(modperl_tipool_t *tipool, modperl_list_t *listp); modperl_list_t *modperl_list_remove_data(modperl_list_t *list, void *data, modperl_list_t **listp); modperl_list_t *modperl_tipool_pop(modperl_tipool_t *tipool); void modperl_tipool_putback(modperl_tipool_t *tipool, modperl_list_t *listp, int num_requests); void modperl_tipool_putback_data(modperl_tipool_t *tipool, void *data, int num_requests); #define modperl_tipool_wait(tipool) \ while (tipool->size == tipool->in_use) { \ MP_TRACE_i(MP_FUNC, \ "waiting for available tipool item in thread 0x%lx", \ MP_TIDF); \ MP_TRACE_i(MP_FUNC, "(%d items in use, %d alive)", \ tipool->in_use, tipool->size); \ COND_WAIT(&tipool->available, &tipool->tiplock); \ } #define modperl_tipool_broadcast(tipool) \ MP_TRACE_i(MP_FUNC, "broadcast available tipool item"); \ COND_SIGNAL(&tipool->available) #define modperl_tipool_lock(tipool) \ MP_TRACE_i(MP_FUNC, "about to lock tipool in thread 0x%lx", MP_TIDF); \ MUTEX_LOCK(&tipool->tiplock); \ MP_TRACE_i(MP_FUNC, "acquired tipool lock") #define modperl_tipool_unlock(tipool) \ MP_TRACE_i(MP_FUNC, "about to unlock tipool in thread 0x%lx", MP_TIDF); \ MUTEX_UNLOCK(&tipool->tiplock); \ MP_TRACE_i(MP_FUNC, "released tipool lock") #endif /* USE_ITHREADS */ #endif /* MODPERL_TIPOOL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_types.h0000644000104000010010000001566312540623203022234 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_TYPES_H #define MODPERL_TYPES_H #ifndef MP_IOBUFSIZE # ifdef AP_IOBUFSIZE # define MP_IOBUFSIZE AP_IOBUFSIZE # else # define MP_IOBUFSIZE 8192 # endif #endif /* aliases */ typedef request_rec subrequest_rec; typedef apr_array_header_t MpAV; typedef apr_table_t MpHV; typedef char char_len; /* see xs/typemap */ /* mod_perl structures */ typedef struct { request_rec *r; conn_rec *c; server_rec *s; } modperl_rcs_t; typedef struct modperl_config_con_t modperl_config_con_t; #ifdef USE_ITHREADS typedef struct modperl_list_t modperl_list_t; struct modperl_list_t { modperl_list_t *prev, *next; void *data; }; typedef struct modperl_interp_t modperl_interp_t; typedef struct modperl_interp_pool_t modperl_interp_pool_t; typedef struct modperl_tipool_t modperl_tipool_t; typedef struct modperl_tipool_config_t modperl_tipool_config_t; struct modperl_interp_t { modperl_interp_pool_t *mip; PerlInterpreter *perl; int num_requests; U8 flags; modperl_config_con_t *ccfg; int refcnt; #ifdef MP_TRACE unsigned long tid; #endif }; typedef struct { /* s == startup grow * r == runtime grow */ void * (*tipool_sgrow)(modperl_tipool_t *tipool, void *data); void * (*tipool_rgrow)(modperl_tipool_t *tipool, void *data); void (*tipool_shrink)(modperl_tipool_t *tipool, void *data, void *item); void (*tipool_destroy)(modperl_tipool_t *tipool, void *data, void *item); void (*tipool_dump)(modperl_tipool_t *tipool, void *data, modperl_list_t *listp); } modperl_tipool_vtbl_t; struct modperl_tipool_config_t { int start; /* number of items to create at startup */ int min_spare; /* minimum number of spare items */ int max_spare; /* maximum number of spare items */ int max; /* maximum number of items */ int max_requests; /* maximum number of requests per item */ }; struct modperl_tipool_t { perl_mutex tiplock; perl_cond available; modperl_list_t *idle, *busy; int in_use; /* number of items currrently in use */ int size; /* current number of items */ void *data; /* user data */ modperl_tipool_config_t *cfg; modperl_tipool_vtbl_t *func; }; struct modperl_interp_pool_t { server_rec *server; modperl_tipool_t *tipool; modperl_interp_t *parent; /* from which to perl_clone() */ }; #endif /* USE_ITHREADS */ typedef U32 modperl_opts_t; typedef struct { modperl_opts_t opts; modperl_opts_t opts_add; modperl_opts_t opts_remove; modperl_opts_t opts_override; modperl_opts_t opts_seen; int unset; } modperl_options_t; typedef struct { MpHV *setvars; MpHV *configvars; MpHV *SetEnv; MpHV *PassEnv; MpAV *PerlRequire, *PerlModule, *PerlPostConfigRequire; MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; MpAV *handlers_files[MP_HANDLER_NUM_FILES]; MpAV *handlers_process[MP_HANDLER_NUM_PROCESS]; MpAV *handlers_pre_connection[MP_HANDLER_NUM_PRE_CONNECTION]; MpAV *handlers_connection[MP_HANDLER_NUM_CONNECTION]; #ifdef USE_ITHREADS modperl_interp_pool_t *mip; modperl_tipool_config_t *interp_pool_cfg; #else PerlInterpreter *perl; #endif #ifdef MP_USE_GTOP modperl_gtop_t *gtop; #endif MpAV *argv; modperl_options_t *flags; apr_hash_t *modules; server_rec *server; } modperl_config_srv_t; typedef struct { char *location; char *PerlDispatchHandler; MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; MpHV *SetEnv; MpHV *setvars; MpHV *configvars; modperl_options_t *flags; } modperl_config_dir_t; typedef struct { const char *file; modperl_config_dir_t *dcfg; } modperl_require_file_t; typedef struct modperl_mgv_t modperl_mgv_t; struct modperl_mgv_t { char *name; int len; UV hash; modperl_mgv_t *next; }; typedef struct modperl_handler_t modperl_handler_t; struct modperl_handler_t { /* could be: * - the lightweight gv for named subs * - the lookup data in $PL_modperl{ANONSUB} */ modperl_mgv_t *mgv_obj; modperl_mgv_t *mgv_cv; /* could be: * - a subroutine name for named subs * - NULL for anon subs */ const char *name; CV *cv; U8 flags; U16 attrs; modperl_handler_t *next; }; #define MP_HANDLER_TYPE_CHAR 1 #define MP_HANDLER_TYPE_SV 2 typedef struct { int outcnt; char outbuf[MP_IOBUFSIZE]; apr_pool_t *pool; ap_filter_t **filters; int header_parse; request_rec *r; } modperl_wbucket_t; typedef enum { MP_INPUT_FILTER_MODE, MP_OUTPUT_FILTER_MODE } modperl_filter_mode_e; typedef struct { int seen_eos; int eos; int flush; ap_filter_t *f; char *leftover; apr_ssize_t remaining; modperl_wbucket_t *wbucket; apr_bucket *bucket; apr_bucket_brigade *bb_in; apr_bucket_brigade *bb_out; ap_input_mode_t input_mode; apr_read_type_e block; apr_off_t readbytes; apr_status_t rc; modperl_filter_mode_e mode; apr_pool_t *pool; apr_pool_t *temp_pool; } modperl_filter_t; typedef struct { int sent_eos; SV *data; modperl_handler_t *handler; #ifdef USE_ITHREADS modperl_interp_t *interp; #endif } modperl_filter_ctx_t; typedef struct { HV *pnotes; apr_pool_t *pool; #ifdef USE_ITHREADS modperl_interp_t *interp; #endif } modperl_pnotes_t; typedef struct { modperl_pnotes_t pnotes; SV *global_request_obj; U8 flags; int status; modperl_wbucket_t *wbucket; MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR]; MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV]; modperl_perl_globals_t perl_globals; } modperl_config_req_t; struct modperl_config_con_t { modperl_pnotes_t pnotes; #ifdef USE_ITHREADS modperl_interp_t *interp; #endif }; typedef struct { apr_pool_t *pool; void *data; } modperl_cleanup_data_t; typedef struct { module *modp; const char *cmd_data; const char *func_name; } modperl_module_cmd_data_t; typedef enum { MP_HOOK_RUN_ALL, MP_HOOK_RUN_FIRST, MP_HOOK_VOID } modperl_hook_run_mode_e; #endif /* MODPERL_TYPES_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_util.c0000644000104000010010000010450112540623203022026 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" int modperl_require_module(pTHX_ const char *pv, int logfailure) { SV *sv; dSP; PUSHSTACKi(PERLSI_REQUIRE); ENTER;SAVETMPS; PUTBACK; sv = sv_newmortal(); sv_setpv(sv, "require "); sv_catpv(sv, pv); eval_sv(sv, G_DISCARD); SPAGAIN; POPSTACK; FREETMPS;LEAVE; if (SvTRUE(ERRSV)) { if (logfailure) { (void)modperl_errsv(aTHX_ HTTP_INTERNAL_SERVER_ERROR, NULL, NULL); } return FALSE; } return TRUE; } int modperl_require_file(pTHX_ const char *pv, int logfailure) { require_pv(pv); if (SvTRUE(ERRSV)) { if (logfailure) { (void)modperl_errsv(aTHX_ HTTP_INTERNAL_SERVER_ERROR, NULL, NULL); } return FALSE; } return TRUE; } static SV *modperl_hv_request_find(pTHX_ SV *in, char *classname, CV *cv) { static char *r_keys[] = { "r", "_r", NULL }; HV *hv = (HV *)SvRV(in); SV *sv = (SV *)NULL; int i; for (i=0; r_keys[i]; i++) { int klen = i + 1; /* assumes r_keys[] will never change */ SV **svp; if ((svp = hv_fetch(hv, r_keys[i], klen, FALSE)) && (sv = *svp)) { if (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVHV)) { /* dig deeper */ return modperl_hv_request_find(aTHX_ sv, classname, cv); } break; } } if (!sv) { Perl_croak(aTHX_ "method `%s' invoked by a `%s' object with no `r' key!", cv ? GvNAME(CvGV(cv)) : "unknown", (SvRV(in) && SvSTASH(SvRV(in))) ? HvNAME(SvSTASH(SvRV(in))) : "unknown"); } return SvROK(sv) ? SvRV(sv) : sv; } /* notice that if sv is not an Apache2::ServerRec object and * Apache2->request is not available, the returned global object might * be not thread-safe under threaded mpms, so use with care */ MP_INLINE server_rec *modperl_sv2server_rec(pTHX_ SV *sv) { if (SvOBJECT(sv) || (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG))) { return INT2PTR(server_rec *, SvObjIV(sv)); } /* next see if we have Apache2->request available */ { request_rec *r = NULL; (void)modperl_tls_get_request_rec(&r); if (r) { return r->server; } } /* modperl_global_get_server_rec is not thread safe w/o locking */ return modperl_global_get_server_rec(); } MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv) { return modperl_xs_sv2request_rec(aTHX_ sv, NULL, (CV *)NULL); } request_rec *modperl_xs_sv2request_rec(pTHX_ SV *in, char *classname, CV *cv) { SV *sv = (SV *)NULL; MAGIC *mg; if (SvROK(in)) { SV *rv = (SV*)SvRV(in); switch (SvTYPE(rv)) { case SVt_PVMG: sv = rv; break; case SVt_PVHV: sv = modperl_hv_request_find(aTHX_ in, classname, cv); break; default: Perl_croak(aTHX_ "panic: unsupported request_rec type %d", (int)SvTYPE(rv)); } } /* might be Apache2::ServerRec::warn method */ if (!sv && !(classname && SvPOK(in) && !strEQ(classname, SvPVX(in)))) { request_rec *r = NULL; (void)modperl_tls_get_request_rec(&r); if (!r) { Perl_croak(aTHX_ "Apache2->%s called without setting Apache2->request!", cv ? GvNAME(CvGV(cv)) : "unknown"); } return r; } /* there could be pool magic attached to custom $r object, so make * sure that mg->mg_ptr is set */ if ((mg = mg_find(sv, PERL_MAGIC_ext)) && mg->mg_ptr) { return (request_rec *)mg->mg_ptr; } else { if (classname && !sv_derived_from(in, classname)) { /* XXX: find something faster than sv_derived_from */ return NULL; } return INT2PTR(request_rec *, SvIV(sv)); } return NULL; } MP_INLINE SV *modperl_newSVsv_obj(pTHX_ SV *stashsv, SV *obj) { SV *newobj; if (!obj) { obj = stashsv; stashsv = (SV *)NULL; } newobj = newSVsv(obj); if (stashsv) { HV *stash = gv_stashsv(stashsv, TRUE); return sv_bless(newobj, stash); } return newobj; } MP_INLINE SV *modperl_ptr2obj(pTHX_ char *classname, void *ptr) { SV *sv = newSV(0); MP_TRACE_h(MP_FUNC, "sv_setref_pv(%s, 0x%lx)", classname, (unsigned long)ptr); sv_setref_pv(sv, classname, ptr); return sv; } int modperl_errsv(pTHX_ int status, request_rec *r, server_rec *s) { SV *sv = ERRSV; STRLEN n_a; if (SvTRUE(sv)) { if (sv_derived_from(sv, "APR::Error") && SvIVx(sv) == MODPERL_RC_EXIT) { /* ModPerl::Util::exit was called */ return OK; } #if 0 if (modperl_sv_is_http_code(ERRSV, &status)) { return status; } #endif if (r) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "%s", SvPV(sv, n_a)); } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "%s", SvPV(sv, n_a)); } return status; } return status; } /* prepends the passed sprintf-like arguments to ERRSV, which also * gets stringified on the way */ void modperl_errsv_prepend(pTHX_ const char *pat, ...) { SV *sv; va_list args; va_start(args, pat); sv = vnewSVpvf(pat, &args); va_end(args); sv_catsv(sv, ERRSV); sv_copypv(ERRSV, sv); sv_free(sv); } #define dl_librefs "DynaLoader::dl_librefs" #define dl_modules "DynaLoader::dl_modules" void modperl_xs_dl_handles_clear(pTHX) { AV *librefs = get_av(dl_librefs, FALSE); if (librefs) { av_clear(librefs); } } void **modperl_xs_dl_handles_get(pTHX) { I32 i; AV *librefs = get_av(dl_librefs, FALSE); AV *modules = get_av(dl_modules, FALSE); void **handles; if (!librefs) { MP_TRACE_r(MP_FUNC, "Could not get @%s for unloading.", dl_librefs); return NULL; } if (!(AvFILL(librefs) >= 0)) { /* dl_librefs and dl_modules are empty */ return NULL; } handles = (void **)malloc(sizeof(void *) * (AvFILL(librefs)+2)); for (i=0; i<=AvFILL(librefs); i++) { void *handle; SV *handle_sv = *av_fetch(librefs, i, FALSE); SV *module_sv = *av_fetch(modules, i, FALSE); if(!handle_sv) { MP_TRACE_r(MP_FUNC, "Could not fetch $%s[%d]!", dl_librefs, (int)i); continue; } handle = INT2PTR(void *, SvIV(handle_sv)); MP_TRACE_r(MP_FUNC, "%s dl handle == 0x%lx", SvPVX(module_sv), (unsigned long)handle); if (handle) { handles[i] = handle; } } av_clear(modules); av_clear(librefs); handles[i] = (void *)0; return handles; } void modperl_xs_dl_handles_close(void **handles) { int i; if (!handles) { return; } for (i=0; handles[i]; i++) { MP_TRACE_r(MP_FUNC, "close 0x%lx", (unsigned long)handles[i]); modperl_sys_dlclose(handles[i]); } free(handles); } /* XXX: There is no XS accessible splice() */ static void modperl_av_remove_entry(pTHX_ AV *av, I32 index) { I32 i; AV *tmpav = newAV(); /* stash the entries _before_ the item to delete */ for (i=0; i<=index; i++) { av_store(tmpav, i, SvREFCNT_inc(av_shift(av))); } /* make size at the beginning of the array */ av_unshift(av, index-1); /* add stashed entries back */ for (i=0; ipool = p; cdata->data = data; return cdata; } MP_INLINE void modperl_perl_av_push_elts_ref(pTHX_ AV *dst, AV *src) { I32 i, j, src_fill = AvFILLp(src), dst_fill = AvFILLp(dst); av_extend(dst, src_fill); AvFILLp(dst) += src_fill+1; for (i=dst_fill+1, j=0; j<=AvFILLp(src); i++, j++) { AvARRAY(dst)[i] = SvREFCNT_inc(AvARRAY(src)[j]); } } /* * similar to hv_fetch_ent, but takes string key and key len rather than SV * also skips magic and utf8 fu, since we are only dealing with internal tables */ HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv, register char *key, register I32 klen, register U32 hash) { register XPVHV *xhv; register HE *entry; xhv = (XPVHV *)SvANY(hv); if (!HvARRAY(hv)) { return 0; } #ifdef HvREHASH if (HvREHASH(hv)) { PERL_HASH_INTERNAL(hash, key, klen); } else #endif if (!hash) { PERL_HASH(hash, key, klen); } entry = ((HE**)HvARRAY(hv))[hash & (I32)xhv->xhv_max]; for (; entry; entry = HeNEXT(entry)) { if (HeHASH(entry) != hash) { continue; } if (HeKLEN(entry) != klen) { continue; } if (HeKEY(entry) != key && memNE(HeKEY(entry), key, klen)) { continue; } return entry; } return 0; } void modperl_str_toupper(char *str) { while (*str) { *str = apr_toupper(*str); ++str; } } /* XXX: same as Perl_do_sprintf(); * but Perl_do_sprintf() is not part of the "public" api */ void modperl_perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg) { STRLEN patlen; char *pat = SvPV(*sarg, patlen); bool do_taint = FALSE; sv_vsetpvfn(sv, pat, patlen, (va_list *)NULL, sarg + 1, len - 1, &do_taint); SvSETMAGIC(sv); if (do_taint) { SvTAINTED_on(sv); } } void modperl_perl_call_list(pTHX_ AV *subs, const char *name) { I32 i, oldscope = PL_scopestack_ix; SV **ary = AvARRAY(subs); MP_TRACE_g(MP_FUNC, MP_TRACEf_PERLID " running %d %s subs", MP_TRACEv_PERLID_ AvFILLp(subs)+1, name); for (i=0; i<=AvFILLp(subs); i++) { CV *cv = (CV*)ary[i]; SV *atsv = ERRSV; PUSHMARK(PL_stack_sp); call_sv((SV*)cv, G_EVAL|G_DISCARD); if (SvCUR(atsv)) { Perl_sv_catpvf(aTHX_ atsv, "%s failed--call queue aborted", name); while (PL_scopestack_ix > oldscope) { LEAVE; } Perl_croak(aTHX_ "%s", SvPVX(atsv)); } } } void modperl_perl_exit(pTHX_ int status) { ENTER; SAVESPTR(PL_diehook); PL_diehook = (SV *)NULL; modperl_croak(aTHX_ MODPERL_RC_EXIT, "ModPerl::Util::exit"); } MP_INLINE SV *modperl_dir_config(pTHX_ request_rec *r, server_rec *s, char *key, SV *sv_val) { SV *retval = &PL_sv_undef; if (r && r->per_dir_config) { MP_dDCFG; retval = modperl_table_get_set(aTHX_ dcfg->configvars, key, sv_val, FALSE); } if (!SvOK(retval)) { if (s && s->module_config) { MP_dSCFG(s); SvREFCNT_dec(retval); /* in case above did newSV(0) */ retval = modperl_table_get_set(aTHX_ scfg->configvars, key, sv_val, FALSE); } else { retval = &PL_sv_undef; } } return retval; } SV *modperl_table_get_set(pTHX_ apr_table_t *table, char *key, SV *sv_val, int do_taint) { SV *retval = &PL_sv_undef; if (table == NULL) { /* do nothing */ } else if (key == NULL) { retval = modperl_hash_tie(aTHX_ "APR::Table", (SV *)NULL, (void*)table); } else if (!sv_val) { /* no val was passed */ char *val; if ((val = (char *)apr_table_get(table, key))) { retval = newSVpv(val, 0); } else { retval = newSV(0); } if (do_taint) { SvTAINTED_on(retval); } } else if (!SvOK(sv_val)) { /* val was passed in as undef */ apr_table_unset(table, key); } else { apr_table_set(table, key, SvPV_nolen(sv_val)); } return retval; } static char *package2filename(const char *package, int *len) { const char *s; char *d; char *filename; filename = malloc((strlen(package)+4)*sizeof(char)); for (s = package, d = filename; *s; s++, d++) { if (*s == ':' && s[1] == ':') { *d = '/'; s++; } else { *d = *s; } } *d++ = '.'; *d++ = 'p'; *d++ = 'm'; *d = '\0'; *len = d - filename; return filename; } MP_INLINE int modperl_perl_module_loaded(pTHX_ const char *name) { SV **svp; int len; char *filename = package2filename(name, &len); svp = hv_fetch(GvHVn(PL_incgv), filename, len, 0); free(filename); return (svp && *svp != &PL_sv_undef) ? 1 : 0; } #define SLURP_SUCCESS(action) \ if (rc != APR_SUCCESS) { \ SvREFCNT_dec(sv); \ modperl_croak(aTHX_ rc, \ apr_psprintf(r->pool, \ "slurp_filename('%s') / " action, \ r->filename)); \ } MP_INLINE SV *modperl_slurp_filename(pTHX_ request_rec *r, int tainted) { SV *sv; apr_status_t rc; apr_size_t size; apr_file_t *file; size = r->finfo.size; sv = newSV(size); /* XXX: could have checked whether r->finfo.filehand is valid and * save the apr_file_open call, but apache gives us no API to * check whether filehand is valid. we can't test whether it's * NULL or not, as it may contain garbagea */ rc = apr_file_open(&file, r->filename, APR_READ|APR_BINARY, APR_OS_DEFAULT, r->pool); SLURP_SUCCESS("opening"); rc = apr_file_read(file, SvPVX(sv), &size); SLURP_SUCCESS("reading"); MP_TRACE_o(MP_FUNC, "read %d bytes from '%s'", size, r->filename); if (r->finfo.size != size) { SvREFCNT_dec(sv); Perl_croak(aTHX_ "Error: read %d bytes, expected %d ('%s')", size, (apr_size_t)r->finfo.size, r->filename); } rc = apr_file_close(file); SLURP_SUCCESS("closing"); SvPVX(sv)[size] = '\0'; SvCUR_set(sv, size); SvPOK_on(sv); if (tainted) { SvTAINTED_on(sv); } else { SvTAINTED_off(sv); } return newRV_noinc(sv); } #define MP_VALID_PKG_CHAR(c) (isalnum(c) ||(c) == '_') #define MP_VALID_PATH_DELIM(c) ((c) == '/' || (c) =='\\') char *modperl_file2package(apr_pool_t *p, const char *file) { char *package; char *c; const char *f; int len = strlen(file)+1; /* First, skip invalid prefix characters */ while (!MP_VALID_PKG_CHAR(*file)) { file++; len--; } /* Then figure out how big the package name will be like */ for (f = file; *f; f++) { if (MP_VALID_PATH_DELIM(*f)) { len++; } } package = apr_pcalloc(p, len); /* Then, replace bad characters with '_' */ for (c = package; *file; c++, file++) { if (MP_VALID_PKG_CHAR(*file)) { *c = *file; } else if (MP_VALID_PATH_DELIM(*file)) { /* Eliminate subsequent duplicate path delim */ while (*(file+1) && MP_VALID_PATH_DELIM(*(file+1))) { file++; } /* path delim not until end of line */ if (*(file+1)) { *c = *(c+1) = ':'; c++; } } else { *c = '_'; } } return package; } SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array) { AV *av = newAV(); if (array) { int i; for (i = 0; i < array->nelts; i++) { av_push(av, newSVpv(((char **)array->elts)[i], 0)); } } return newRV_noinc((SV*)av); } apr_array_header_t *modperl_avrv2apr_array_header(pTHX_ apr_pool_t *p, SV *avrv) { AV *av; apr_array_header_t *array; int i, av_size; if (!(SvROK(avrv) && (SvTYPE(SvRV(avrv)) == SVt_PVAV))) { Perl_croak(aTHX_ "Not an array reference"); } av = (AV*)SvRV(avrv); av_size = av_len(av); array = apr_array_make(p, av_size+1, sizeof(char *)); for (i = 0; i <= av_size; i++) { SV *sv = *av_fetch(av, i, FALSE); char **entry = (char **)apr_array_push(array); *entry = apr_pstrdup(p, SvPV_nolen(sv)); } return array; } /* Remove a package from %INC */ static void modperl_package_delete_from_inc(pTHX_ const char *package) { int len; char *filename = package2filename(package, &len); (void)hv_delete(GvHVn(PL_incgv), filename, len, G_DISCARD); free(filename); } /* Destroy a package's stash */ #define MP_STASH_SUBSTASH(key, len) ((len >= 2) && \ (key[len-1] == ':') && \ (key[len-2] == ':')) #define MP_STASH_DEBUGGER(key, len) ((len >= 2) && \ (key[0] == '_') && \ (key[1] == '<')) #define MP_SAFE_STASH(key, len) (!(MP_STASH_SUBSTASH(key,len)|| \ (MP_STASH_DEBUGGER(key, len)))) static void modperl_package_clear_stash(pTHX_ const char *package) { HV *stash; if ((stash = gv_stashpv(package, FALSE))) { HE *he; I32 len; char *key; hv_iterinit(stash); while ((he = hv_iternext(stash))) { key = hv_iterkey(he, &len); if (MP_SAFE_STASH(key, len)) { SV *val = hv_iterval(stash, he); /* The safe thing to do is to skip over stash entries * that don't come from the package we are trying to * unload */ if (GvSTASH(val) == stash) { (void)hv_delete(stash, key, len, G_DISCARD); } } } } } /* Unload a module as completely and cleanly as possible */ void modperl_package_unload(pTHX_ const char *package) { I32 dl_index; modperl_package_clear_stash(aTHX_ package); modperl_package_delete_from_inc(aTHX_ package); if (modperl_package_is_dynamic(aTHX_ package, &dl_index)) { modperl_package_unload_dynamic(aTHX_ package, dl_index); } } #define MP_RESTART_COUNT_KEY "mod_perl_restart_count" /* passing the main server object here, just because we don't have the * modperl_server_pool available yet, later on we can access it * through the modperl_server_pool() call. */ void modperl_restart_count_inc(server_rec *base_server) { void *data; int *counter; apr_pool_t *p = base_server->process->pool; apr_pool_userdata_get(&data, MP_RESTART_COUNT_KEY, p); if (data) { counter = data; (*counter)++; } else { counter = apr_palloc(p, sizeof *counter); *counter = 1; apr_pool_userdata_set(counter, MP_RESTART_COUNT_KEY, apr_pool_cleanup_null, p); } } int modperl_restart_count(void) { void *data; apr_pool_userdata_get(&data, MP_RESTART_COUNT_KEY, modperl_global_get_server_rec()->process->pool); return data ? *(int *)data : 0; } static MP_INLINE apr_status_t modperl_cleanup_pnotes(void *data) { modperl_pnotes_t *pnotes = data; dTHXa(pnotes->interp->perl); MP_ASSERT_CONTEXT(aTHX); SvREFCNT_dec(pnotes->pnotes); pnotes->pnotes = NULL; pnotes->pool = NULL; MP_INTERP_PUTBACK(pnotes->interp, aTHX); return APR_SUCCESS; } void modperl_pnotes_kill(void *data) { modperl_pnotes_t *pnotes = data; if( !pnotes->pnotes ) return; apr_pool_cleanup_kill(pnotes->pool, pnotes, modperl_cleanup_pnotes); modperl_cleanup_pnotes(pnotes); } SV *modperl_pnotes(pTHX_ modperl_pnotes_t *pnotes, SV *key, SV *val, apr_pool_t *pool) { SV *retval = (SV *)NULL; if (!pnotes->pnotes) { pnotes->pool = pool; #ifdef USE_ITHREADS pnotes->interp = modperl_thx_interp_get(aTHX); pnotes->interp->refcnt++; MP_TRACE_i(MP_FUNC, "TO: (0x%lx)->refcnt incremented to %ld", pnotes->interp, pnotes->interp->refcnt); #endif pnotes->pnotes = newHV(); apr_pool_cleanup_register(pool, pnotes, modperl_cleanup_pnotes, apr_pool_cleanup_null); } if (key) { STRLEN len; char *k = SvPV(key, len); if (val) { retval = *hv_store(pnotes->pnotes, k, len, SvREFCNT_inc(val), 0); } else if (hv_exists(pnotes->pnotes, k, len)) { retval = *hv_fetch(pnotes->pnotes, k, len, FALSE); } return retval ? SvREFCNT_inc(retval) : &PL_sv_undef; } return newRV_inc((SV *)pnotes->pnotes); } U16 *modperl_code_attrs(pTHX_ CV *cv) { MAGIC *mg; if (!(SvMAGICAL(cv) && (mg = mg_find((SV*)cv, PERL_MAGIC_ext)))) { sv_magic((SV*)cv, (SV *)NULL, PERL_MAGIC_ext, NULL, -1); } mg = mg_find((SV*)cv, PERL_MAGIC_ext); return &(mg->mg_private); } #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) static apr_hash_t *global_authz_providers = NULL; static apr_hash_t *global_authn_providers = NULL; typedef struct { SV *cb1; SV *cb2; modperl_handler_t *cb1_handler; modperl_handler_t *cb2_handler; } auth_callback; static apr_status_t cleanup_perl_global_providers(void *ctx) { global_authz_providers = NULL; global_authn_providers = NULL; return APR_SUCCESS; } static authz_status perl_check_authorization(request_rec *r, const char *require_args, const void *parsed_require_args) { authz_status ret = AUTHZ_DENIED; int count; AV *args = Nullav; const char *key; auth_callback *ab; MP_dINTERPa(r, NULL, NULL); if (global_authz_providers == NULL) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } key = apr_table_get(r->notes, AUTHZ_PROVIDER_NAME_NOTE); ab = apr_hash_get(global_authz_providers, key, APR_HASH_KEY_STRING); if (ab == NULL) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } if (ab->cb1 == NULL) { if (ab->cb1_handler == NULL) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } modperl_handler_make_args(aTHX_ &args, "Apache2::RequestRec", r, "PV", require_args, NULL); ret = modperl_callback(aTHX_ ab->cb1_handler, r->pool, r, r->server, args); SvREFCNT_dec((SV*)args); MP_INTERP_PUTBACK(interp, aTHX); return ret; } { dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::RequestRec", r))); XPUSHs(sv_2mortal(newSVpv(require_args, 0))); PUTBACK; count = call_sv(ab->cb1, G_SCALAR); SPAGAIN; if (count == 1) { ret = (authz_status) POPi; } PUTBACK; FREETMPS; LEAVE; } MP_INTERP_PUTBACK(interp, aTHX); return ret; } static const char *perl_parse_require_line(cmd_parms *cmd, const char *require_line, const void **parsed_require_line) { char *ret = NULL; void *key; auth_callback *ab; if (global_authz_providers == NULL || apr_hash_count(global_authz_providers) == 0) { return NULL; } apr_pool_userdata_get(&key, AUTHZ_PROVIDER_NAME_NOTE, cmd->temp_pool); ab = apr_hash_get(global_authz_providers, (char *) key, APR_HASH_KEY_STRING); if (ab == NULL || ab->cb2 == NULL) { return NULL; } { /* PerlAddAuthzProvider currently does not support an optional second * handler, so ab->cb2 should always be NULL above and we will never get * here. If such support is added in the future then this code will be * reached, but cannot succeed in the absence of an interpreter. The * second handler would be called at init to check a Require line for * errors, but in the current design there is no interpreter available * at that time. */ MP_dINTERP_POOLa(cmd->pool, cmd->server); if (!MP_HAS_INTERP(interp)) { return "Require handler is not currently supported in this context"; } { SV *ret_sv; int count; dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::CmdParms", cmd))); XPUSHs(sv_2mortal(newSVpv(require_line, 0))); PUTBACK; count = call_sv(ab->cb2, G_SCALAR); SPAGAIN; if (count == 1) { ret_sv = POPs; if (SvOK(ret_sv)) { char *tmp = SvPV_nolen(ret_sv); if (*tmp != '\0') { ret = apr_pstrdup(cmd->pool, tmp); } } } PUTBACK; FREETMPS; LEAVE; } MP_INTERP_PUTBACK(interp, aTHX); } return ret; } static authn_status perl_check_password(request_rec *r, const char *user, const char *password) { authn_status ret = AUTH_DENIED; int count; AV *args = Nullav; const char *key; auth_callback *ab; MP_dINTERPa(r, NULL, NULL); if (global_authn_providers == NULL) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } key = apr_table_get(r->notes, AUTHN_PROVIDER_NAME_NOTE); ab = apr_hash_get(global_authn_providers, key, APR_HASH_KEY_STRING); if (ab == NULL || ab->cb1) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } if (ab->cb1 == NULL) { if (ab->cb1_handler == NULL) { MP_INTERP_PUTBACK(interp, aTHX); return ret; } modperl_handler_make_args(aTHX_ &args, "Apache2::RequestRec", r, "PV", user, "PV", password, NULL); ret = modperl_callback(aTHX_ ab->cb1_handler, r->pool, r, r->server, args); SvREFCNT_dec((SV*)args); MP_INTERP_PUTBACK(interp, aTHX); return ret; } { dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::RequestRec", r))); XPUSHs(sv_2mortal(newSVpv(user, 0))); XPUSHs(sv_2mortal(newSVpv(password, 0))); PUTBACK; count = call_sv(ab->cb1, G_SCALAR); SPAGAIN; if (count == 1) { ret = (authn_status) POPi; } PUTBACK; FREETMPS; LEAVE; } MP_INTERP_PUTBACK(interp, aTHX); return ret; } static authn_status perl_get_realm_hash(request_rec *r, const char *user, const char *realm, char **rethash) { authn_status ret = AUTH_USER_NOT_FOUND; const char *key; auth_callback *ab; if (global_authn_providers == NULL || apr_hash_count(global_authn_providers) == 0) { return AUTH_GENERAL_ERROR; } key = apr_table_get(r->notes, AUTHN_PROVIDER_NAME_NOTE); ab = apr_hash_get(global_authn_providers, key, APR_HASH_KEY_STRING); if (ab == NULL || ab->cb2 == NULL) { return AUTH_GENERAL_ERROR; } { /* PerlAddAuthnProvider currently does not support an optional second * handler, so ab->cb2 should always be NULL above and we will never get * here. If such support is added in the future then this code will be * reached. Unlike the PerlAddAuthzProvider case, the second handler here * would be called during request_rec processing to obtain a password hash * for the realm so there should be no problem grabbing an interpreter. */ MP_dINTERPa(r, NULL, NULL); { SV* rh = sv_2mortal(newSVpv("", 0)); int count; dSP; ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::RequestRec", r))); XPUSHs(sv_2mortal(newSVpv(user, 0))); XPUSHs(sv_2mortal(newSVpv(realm, 0))); XPUSHs(newRV_noinc(rh)); PUTBACK; count = call_sv(ab->cb2, G_SCALAR); SPAGAIN; if (count == 1) { const char *tmp = SvPV_nolen(rh); ret = (authn_status) POPi; if (*tmp != '\0') { *rethash = apr_pstrdup(r->pool, tmp); } } PUTBACK; FREETMPS; LEAVE; } MP_INTERP_PUTBACK(interp, aTHX); } return ret; } static const authz_provider authz_perl_provider = { perl_check_authorization, perl_parse_require_line }; static const authn_provider authn_perl_provider = { perl_check_password, perl_get_realm_hash }; static apr_status_t register_auth_provider(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, auth_callback *ab, int type) { void *provider_ = NULL; if (global_authz_providers == NULL) { global_authz_providers = apr_hash_make(pool); global_authn_providers = apr_hash_make(pool); /* We have to use pre_cleanup here, otherwise this cleanup method * would be called after another cleanup method which unloads * mod_perl module. */ apr_pool_pre_cleanup_register(pool, NULL, cleanup_perl_global_providers); } if (strcmp(provider_group, AUTHZ_PROVIDER_GROUP) == 0) { provider_ = (void *) &authz_perl_provider; apr_hash_set(global_authz_providers, provider_name, APR_HASH_KEY_STRING, ab); } else { provider_ = (void *) &authn_perl_provider; apr_hash_set(global_authn_providers, provider_name, APR_HASH_KEY_STRING, ab); } return ap_register_auth_provider(pool, provider_group, provider_name, provider_version, provider_, type); } apr_status_t modperl_register_auth_provider(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, SV *callback1, SV *callback2, int type) { char *provider_name_dup; auth_callback *ab = NULL; provider_name_dup = apr_pstrdup(pool, provider_name); ab = apr_pcalloc(pool, sizeof(auth_callback)); ab->cb1 = callback1; ab->cb2 = callback2; return register_auth_provider(pool, provider_group, provider_name_dup, provider_version, ab, type); } apr_status_t modperl_register_auth_provider_name(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, const char *callback1, const char *callback2, int type) { char *provider_name_dup; auth_callback *ab = NULL; provider_name_dup = apr_pstrdup(pool, provider_name); ab = apr_pcalloc(pool, sizeof(auth_callback)); ab->cb1_handler = modperl_handler_new(pool, callback1); if (callback2) { ab->cb2_handler = modperl_handler_new(pool, callback2); } return register_auth_provider(pool, provider_group, provider_name_dup, provider_version, ab, type); } #endif /* httpd-2.4 */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/modperl_util.h0000644000104000010010000001442712540623203022042 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_UTIL_H #define MODPERL_UTIL_H #include "modperl_common_util.h" /* check whether the response phase has been initialized already */ #define MP_CHECK_WBUCKET_INIT(func) \ if (!rcfg->wbucket) { \ Perl_croak(aTHX_ "%s: " func " can't be called " \ "before the response phase", MP_FUNC); \ } /* turn off cgi header parsing. in case we are already inside * modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, MP_HOOK_RUN_FIRST); * but haven't sent any data yet, it's too late to change * MpReqPARSE_HEADERS, so change the wbucket's private flag directly */ #define MP_CGI_HEADER_PARSER_OFF(rcfg) \ MpReqPARSE_HEADERS_Off(rcfg); \ if (rcfg->wbucket) { \ rcfg->wbucket->header_parse = 0; \ } MP_INLINE server_rec *modperl_sv2server_rec(pTHX_ SV *sv); MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv); request_rec *modperl_xs_sv2request_rec(pTHX_ SV *sv, char *classname, CV *cv); MP_INLINE SV *modperl_newSVsv_obj(pTHX_ SV *stashsv, SV *obj); MP_INLINE SV *modperl_ptr2obj(pTHX_ char *classname, void *ptr); int modperl_errsv(pTHX_ int status, request_rec *r, server_rec *s); void modperl_errsv_prepend(pTHX_ const char *pat, ...); int modperl_require_module(pTHX_ const char *pv, int logfailure); int modperl_require_file(pTHX_ const char *pv, int logfailure); void modperl_xs_dl_handles_clear(pTHX); void **modperl_xs_dl_handles_get(pTHX); void modperl_xs_dl_handles_close(void **handles); modperl_cleanup_data_t *modperl_cleanup_data_new(apr_pool_t *p, void *data); MP_INLINE void modperl_perl_av_push_elts_ref(pTHX_ AV *dst, AV *src); HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv, register char *key, register I32 klen, register U32 hash); #define hv_fetch_he(hv,k,l,h) \ modperl_perl_hv_fetch_he(aTHX_ hv, k, l, h) void modperl_str_toupper(char *str); void modperl_perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg); void modperl_perl_call_list(pTHX_ AV *subs, const char *name); void modperl_perl_exit(pTHX_ int status); MP_INLINE SV *modperl_dir_config(pTHX_ request_rec *r, server_rec *s, char *key, SV *sv_val); SV *modperl_table_get_set(pTHX_ apr_table_t *table, char *key, SV *sv_val, int do_taint); MP_INLINE int modperl_perl_module_loaded(pTHX_ const char *name); /** * slurp the contents of r->filename and return them as a scalar * @param r request record * @param tainted whether the SV should be marked tainted or not * @return a PV scalar with the contents of the file */ SV *modperl_slurp_filename(pTHX_ request_rec *r, int tainted); char *modperl_file2package(apr_pool_t *p, const char *file); SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array); apr_array_header_t *modperl_avrv2apr_array_header(pTHX_ apr_pool_t *p, SV *avrv); void modperl_package_unload(pTHX_ const char *package); #if defined(MP_TRACE) && defined(USE_ITHREADS) #define MP_TRACEf_PERLID "perl id 0x%lx" #define MP_TRACEv_PERLID (unsigned long)my_perl #define MP_TRACEv_PERLID_ MP_TRACEv_PERLID, #define MP_TRACEv__PERLID ,MP_TRACEv_PERLID #else #define MP_TRACEf_PERLID #define MP_TRACEv_PERLID #define MP_TRACEv_PERLID_ #define MP_TRACEv__PERLID #endif /* USE_ITHREADS */ /* dumping hundreds of lines in the trace, makes it less useful. Get a * string chunk of MP_TRACE_STR_LEN bytes or less. Not too long so it * won't wrap when posted in email. Notice that we copy 'count' bytes * of the string even if count < MP_TRACE_STR_LEN, because the 'str' * buffer doesn't necessarily have \0 terminator at 'count'. As this * is for debug tracing, not to be used in production, it doesn't make * any difference if it's not efficient. */ #define MP_TRACE_STR_LEN 35 #define MP_TRACE_STR_TRUNC(p, str, count) \ count < MP_TRACE_STR_LEN \ ? (char *)apr_pstrmemdup(p, str, count) \ : (char *)apr_psprintf(p, "%s...", \ apr_pstrmemdup(p, str, MP_TRACE_STR_LEN)) /* functions maintaining the amount of times mod_perl was restarted, * e.g. on Apache start, it restarts itself, so the count will be * first 1, and on on restart 2 */ void modperl_restart_count_inc(server_rec *base_server); int modperl_restart_count(void); void modperl_pnotes_kill(void *data); SV *modperl_pnotes(pTHX_ modperl_pnotes_t *pnotes, SV *key, SV *val, apr_pool_t *pool ); U16 *modperl_code_attrs(pTHX_ CV *cv); #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) apr_status_t modperl_register_auth_provider(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, SV *callback1, SV *callback2, int type); apr_status_t modperl_register_auth_provider_name(apr_pool_t *pool, const char *provider_group, const char *provider_name, const char *provider_version, const char *callback1, const char *callback2, int type); #endif #endif /* MODPERL_UTIL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/mod_perl.c0000644000104000010010000010116212540623203021130 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* make sure that mod_perl won't try to start itself, while it's * already starting. If the flag's value is 1 * it's still starting, * when it's 2 it is running */ static int MP_init_status = 0; #define MP_IS_NOT_RUNNING (MP_init_status == 0 ? 1 : 0) #define MP_IS_STARTING (MP_init_status == 1 ? 1 : 0) #define MP_IS_RUNNING (MP_init_status == 2 ? 1 : 0) /* false while there is only the parent process and may be child * processes, but no threads around, useful for allowing things that * don't require locking and won't affect other threads. It should * become true just before the child_init phase */ static int MP_threads_started = 0; int modperl_threads_started(void) { return MP_threads_started; } static int MP_threaded_mpm = 0; int modperl_threaded_mpm(void) { return MP_threaded_mpm; } /* sometimes non-threaded mpm also needs to know whether it's still * starting up or after post_config) */ static int MP_post_post_config_phase = 0; int modperl_post_post_config_phase(void) { return MP_post_post_config_phase; } #ifndef USE_ITHREADS static apr_status_t modperl_shutdown(void *data) { modperl_cleanup_data_t *cdata = (modperl_cleanup_data_t *)data; PerlInterpreter *perl = (PerlInterpreter *)cdata->data; void **handles; handles = modperl_xs_dl_handles_get(aTHX); MP_TRACE_i(MP_FUNC, "destroying interpreter=0x%lx", (unsigned long)perl); modperl_perl_destruct(perl); modperl_xs_dl_handles_close(handles); return APR_SUCCESS; } #endif static const char *MP_xs_loaders[] = { "Apache2", "APR", NULL, }; #define MP_xs_loader_name "%s::XSLoader::BOOTSTRAP" /* ugly hack to have access to startup pool and server during xs_init */ static struct { apr_pool_t *p; server_rec *s; } MP_boot_data = {NULL,NULL}; #define MP_boot_data_set(pool, server) \ MP_boot_data.p = pool; \ MP_boot_data.s = server #define MP_dBOOT_DATA \ apr_pool_t *p = MP_boot_data.p; \ server_rec *s = MP_boot_data.s static void modperl_boot(pTHX_ void *data) { MP_dBOOT_DATA; int i; modperl_env_clear(aTHX); modperl_env_default_populate(aTHX); modperl_env_configure_server(aTHX_ p, s); modperl_perl_core_global_init(aTHX); for (i=0; MP_xs_loaders[i]; i++) { char *name = Perl_form(aTHX_ MP_xs_loader_name, MP_xs_loaders[i]); newCONSTSUB(PL_defstash, name, newSViv(1)); } /* outside mod_perl this is done by ModPerl::Const.xs */ newXS("ModPerl::Const::compile", XS_modperl_const_compile, __FILE__); /* make sure DynaLoader is loaded before XSLoader * - to workaround bug in 5.6.1 that can trigger a segv * when using modperl as a dso * - also needed when sections are loaded from +Parent vhost */ modperl_require_module(aTHX_ "DynaLoader", FALSE); IoFLUSH_on(PL_stderrgv); /* unbuffer STDERR */ } static void modperl_xs_init(pTHX) { xs_init(aTHX); /* see modperl_xsinit.c */ /* XXX: in 5.7.2+ we can call the body of modperl_boot here * but in 5.6.1 the Perl runtime is not properly setup yet * so we have to pull this stunt to delay */ SAVEDESTRUCTOR_X(modperl_boot, 0); } /* * the "server_pool" is a subpool of the parent pool (aka "pconf") * this is where we register the cleanups that teardown the interpreter. * the parent process will run the cleanups since server_pool is a subpool * of pconf. we manually clear the server_pool to run cleanups in the * child processes * * the "server_user_pool" is a subpool of the "server_pool", this is * the pool which is exposed to users, so that they can register * cleanup callbacks. This is needed so that the perl cleanups won't * be run before user cleanups are executed. * */ static apr_pool_t *server_pool = NULL; static apr_pool_t *server_user_pool = NULL; apr_pool_t *modperl_server_pool(void) { return server_pool; } apr_pool_t *modperl_server_user_pool(void) { return server_user_pool; } static void set_taint_var(PerlInterpreter *perl) { dTHXa(perl); /* 5.7.3+ has a built-in special ${^TAINT}, backport it to 5.6.0+ */ #if MP_PERL_VERSION_AT_MOST(5, 7, 2) { GV *gv = gv_fetchpv("\024AINT", GV_ADDMULTI, SVt_IV); sv_setiv(GvSV(gv), PL_tainting); SvREADONLY_on(GvSV(gv)); } #endif /* perl v < 5.7.3 */ #ifdef MP_COMPAT_1X { GV *gv = gv_fetchpv("Apache2::__T", GV_ADDMULTI, SVt_PV); sv_setiv(GvSV(gv), PL_tainting); SvREADONLY_on(GvSV(gv)); } #endif /* MP_COMPAT_1X */ } PerlInterpreter *modperl_startup(server_rec *s, apr_pool_t *p) { AV *endav; dTHXa(NULL); MP_dSCFG(s); PerlInterpreter *perl; int status; char **argv; int argc; #ifndef USE_ITHREADS modperl_cleanup_data_t *cdata; #endif /* ensure that we start the base server's perl, before vhost's * one, if modperl_startup was called by vhost before the former * was started */ if (MP_init_status != 2) { server_rec *base_server = modperl_global_get_server_rec(); PerlInterpreter *base_perl; MP_init_status = 2; /* calls itself, so set the flag early */ base_perl = modperl_startup(base_server, p); if (base_server == s ) { return base_perl; } } #ifdef MP_TRACE { server_rec *base_server = modperl_global_get_server_rec(); const char *desc = modperl_server_desc(s, p); if (base_server == s) { MP_init_status = 1; /* temporarily reset MP_init_status */ MP_TRACE_i(MP_FUNC, "starting the parent perl for the base server", desc); MP_init_status = 2; } else { MP_TRACE_i(MP_FUNC, "starting the parent perl for vhost %s", desc); } } #endif #ifdef MP_USE_GTOP MP_TRACE_m_do( modperl_gtop_do_proc_mem_before(MP_FUNC, "perl_parse"); ); #endif argv = modperl_config_srv_argv_init(scfg, &argc); if (!(perl = perl_alloc())) { perror("perl_alloc"); exit(1); } #ifdef USE_ITHREADS aTHX = perl; #endif perl_construct(perl); modperl_hash_seed_set(aTHX); modperl_io_apache_init(aTHX); PL_perl_destruct_level = 2; MP_boot_data_set(p, s); status = perl_parse(perl, modperl_xs_init, argc, argv, NULL); MP_boot_data_set(NULL, NULL); if (status) { perror("perl_parse"); exit(1); } /* suspend END blocks to be run at server shutdown */ endav = PL_endav; PL_endav = (AV *)NULL; /* This was fixed in 5.9.0/5.8.1 (17775), but won't compile after 19122 */ #if MP_PERL_VERSION(5, 8, 0) && \ defined(USE_REENTRANT_API) && defined(HAS_CRYPT_R) && defined(__GLIBC__) /* workaround perl5.8.0/glibc bug */ PL_reentrant_buffer->_crypt_struct.current_saltbits = 0; #endif /* We need to reset $0 to argv[0] (httpd) since perl_parse() will * have set it to '-e'. Being magic-aware ensures that some * OS-specific magic will happen (i.e. setproctitle() on *BSDs) */ PL_origalen = strlen(argv[0]) + 1; sv_setpv_mg(get_sv("0",0), argv[0]); perl_run(perl); #ifdef USE_ITHREADS /* base server / virtual host w/ +Parent gets its own mip */ modperl_interp_init(s, p, perl); /* mark the parent perl to be destroyed */ MpInterpBASE_On(scfg->mip->parent); #endif PL_endav = endav; set_taint_var(perl); MP_TRACE_i(MP_FUNC, "constructed interpreter=0x%lx", (unsigned long)perl); #ifdef MP_USE_GTOP MP_TRACE_m_do( modperl_gtop_do_proc_mem_after(MP_FUNC, "perl_parse"); ); #endif #ifdef MP_COMPAT_1X { char *path, *path1; apr_finfo_t finfo; /* 1) push @INC, $ServerRoot */ av_push(GvAV(PL_incgv), newSVpv(ap_server_root, 0)); /* 2) push @INC, $ServerRoot/lib/perl only if it exists */ apr_filepath_merge(&path, ap_server_root, "lib", APR_FILEPATH_NATIVE, p); apr_filepath_merge(&path1, path, "perl", APR_FILEPATH_NATIVE, p); if (APR_SUCCESS == apr_stat(&finfo, path1, APR_FINFO_TYPE, p)) { if (finfo.filetype == APR_DIR) { av_push(GvAV(PL_incgv), newSVpv(path1, 0)); } } } #endif /* MP_COMPAT_1X */ /* base perl and each vhost +Parent should have this init'ed */ modperl_handler_anon_init(aTHX_ p); if (!modperl_config_apply_PerlRequire(s, scfg, perl, p)) { exit(1); } if (!modperl_config_apply_PerlModule(s, scfg, perl, p)) { exit(1); } #ifndef USE_ITHREADS cdata = modperl_cleanup_data_new(server_pool, (void*)perl); apr_pool_cleanup_register(server_pool, cdata, modperl_shutdown, apr_pool_cleanup_null); #endif return perl; } int modperl_init_vhost(server_rec *s, apr_pool_t *p, server_rec *base_server) { MP_dSCFG(s); modperl_config_srv_t *base_scfg; PerlInterpreter *base_perl; PerlInterpreter *perl; const char *vhost = modperl_server_desc(s, p); if (!scfg) { MP_TRACE_i(MP_FUNC, "server %s has no mod_perl config", vhost); return OK; } if (base_server == NULL) { base_server = modperl_global_get_server_rec(); } MP_TRACE_i(MP_FUNC, "Init vhost %s: s=0x%lx, base_s=0x%lx", vhost, s, base_server); if (base_server == s) { MP_TRACE_i(MP_FUNC, "base server is not vhost, skipping %s", vhost); return OK; } base_scfg = modperl_config_srv_get(base_server); #ifdef USE_ITHREADS perl = base_perl = base_scfg->mip->parent->perl; #else perl = base_perl = base_scfg->perl; #endif /* USE_ITHREADS */ #ifdef USE_ITHREADS if (scfg->mip) { MP_TRACE_i(MP_FUNC, "server %s already initialized", vhost); return OK; } /* the base server could have mod_perl callbacks disabled, but it * still needs perl to drive the vhosts */ if (!MpSrvENABLE(scfg) && s->is_virtual) { MP_TRACE_i(MP_FUNC, "mod_perl disabled for server %s", vhost); scfg->mip = NULL; return OK; } PERL_SET_CONTEXT(perl); modperl_thx_interp_set(perl, base_scfg->mip->parent); #endif /* USE_ITHREADS */ MP_TRACE_d_do(MpSrv_dump_flags(scfg, s->server_hostname)); /* if alloc flags is On, virtual host gets its own parent perl */ if (MpSrvPARENT(scfg)) { perl = modperl_startup(s, p); MP_TRACE_i(MP_FUNC, "created parent interpreter for VirtualHost %s", modperl_server_desc(s, p)); } else { #ifdef USE_ITHREADS /* virtual host w/ +Clone gets its own mip */ if (MpSrvCLONE(scfg)) { modperl_interp_init(s, p, perl); } #endif if (!modperl_config_apply_PerlRequire(s, scfg, perl, p)) { return HTTP_INTERNAL_SERVER_ERROR; } if (!modperl_config_apply_PerlModule(s, scfg, perl, p)) { return HTTP_INTERNAL_SERVER_ERROR; } } #ifdef USE_ITHREADS if (!scfg->mip) { /* since mips are created after merge_server_configs() * need to point to the base mip here if this vhost * doesn't have its own */ MP_TRACE_i(MP_FUNC, "%s mip inherited from %s", vhost, modperl_server_desc(base_server, p)); scfg->mip = base_scfg->mip; } #endif /* USE_ITHREADS */ return OK; } void modperl_init(server_rec *base_server, apr_pool_t *p) { server_rec *s; PerlInterpreter *base_perl; #if defined(MP_TRACE) || defined(USE_ITHREADS) modperl_config_srv_t *base_scfg = modperl_config_srv_get(base_server); #endif MP_TRACE_d_do(MpSrv_dump_flags(base_scfg, base_server->server_hostname)); #ifndef USE_ITHREADS if (modperl_threaded_mpm()) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, base_server, "cannot use threaded MPM without ithreads enabled Perl"); exit(1); } #endif base_perl = modperl_startup(base_server, p); for (s=base_server->next; s; s=s->next) { if (modperl_init_vhost(s, p, base_server) != OK) { exit(1); /*XXX*/ } } #ifdef USE_ITHREADS /* after other parent perls were started in vhosts, make sure that * the context is set to the base_perl */ PERL_SET_CONTEXT(base_perl); modperl_thx_interp_set(base_perl, base_scfg->mip->parent); #endif } static int modperl_post_config_require(server_rec *s, apr_pool_t *p) { for (; s; s=s->next) { MP_dSCFG(s); if (!modperl_config_apply_PerlPostConfigRequire(s, scfg, p)) { return FALSE; } } return TRUE; } #ifdef USE_ITHREADS static void modperl_init_clones(server_rec *s, apr_pool_t *p) { #ifdef MP_TRACE modperl_config_srv_t *base_scfg = modperl_config_srv_get(s); char *base_name = modperl_server_desc(s, p); #endif /* MP_TRACE */ if (!modperl_threaded_mpm()) { MP_TRACE_i(MP_FUNC, "no clones created for non-threaded mpm"); return; } for (; s; s=s->next) { MP_dSCFG(s); #ifdef MP_TRACE char *name = modperl_server_desc(s, p); #else char *name = NULL; #endif /* MP_TRACE */ if (scfg->mip->tipool->idle) { #ifdef MP_TRACE if (scfg->mip == base_scfg->mip) { MP_TRACE_i(MP_FUNC, "%s interp pool inherited from %s", name, base_name); } else { MP_TRACE_i(MP_FUNC, "%s interp pool already initialized", name); } #endif /* MP_TRACE */ } else { MP_TRACE_i(MP_FUNC, "initializing interp pool for %s", name); modperl_tipool_init(scfg->mip->tipool); } } } #endif /* USE_ITHREADS */ void modperl_init_globals(server_rec *s, apr_pool_t *pconf) { ap_mpm_query(AP_MPMQ_IS_THREADED, &MP_threaded_mpm); MP_TRACE_g(MP_FUNC, "mod_perl globals are configured"); modperl_global_init_pconf(pconf, pconf); modperl_global_init_server_rec(pconf, s); modperl_tls_create_request_rec(pconf); /* init the counter to 0 */ modperl_global_anon_cnt_init(pconf); } /* * modperl_sys_{init,term} are things that happen * once per-parent process, not per-interpreter */ static apr_status_t modperl_sys_init(void) { int argc = 0; char **argv = NULL, **env = NULL; MP_TRACE_i(MP_FUNC, "mod_perl sys init"); /* not every OS uses those vars in PERL_SYS_INIT3 macro */ argc = argc; argv = argv; env = env; PERL_SYS_INIT3(&argc, &argv, &env); #if 0 /*XXX*/ #ifdef PTHREAD_ATFORK if (!ap_exists_config_define("PERL_PTHREAD_ATFORK_DONE")) { PTHREAD_ATFORK(Perl_atfork_lock, Perl_atfork_unlock, Perl_atfork_unlock); *(char **)apr_array_push(ap_server_config_defines) = "PERL_PTHREAD_ATFORK_DONE"; } #endif #endif /* modifies PL_ppaddr */ modperl_perl_pp_set_all(); /* modifies PL_vtbl_env{elem} */ modperl_env_init(); return APR_SUCCESS; } static apr_status_t modperl_sys_term(void *data) { /* PERL_SYS_TERM() needs 'my_perl' as of 5.9.5 */ #if MP_PERL_VERSION_AT_LEAST(5, 9, 5) && defined(USE_ITHREADS) modperl_cleanup_data_t *cdata = (modperl_cleanup_data_t *)data; PERL_UNUSED_DECL PerlInterpreter *my_perl = cdata == NULL ? NULL : (PerlInterpreter *)cdata->data; #endif MP_init_status = 0; MP_threads_started = 0; MP_post_post_config_phase = 0; MP_PERL_FREE_THREAD_KEY_WORKAROUND; MP_TRACE_i(MP_FUNC, "mod_perl sys term"); modperl_env_unload(); modperl_perl_pp_unset_all(); PERL_SYS_TERM(); return APR_SUCCESS; } int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { if (MP_IS_STARTING || MP_IS_RUNNING) { return OK; } MP_init_status = 1; /* now starting */ modperl_restart_count_inc(s); apr_pool_create(&server_pool, pconf); apr_pool_tag(server_pool, "mod_perl server pool"); apr_pool_create(&server_user_pool, pconf); apr_pool_tag(server_user_pool, "mod_perl server user pool"); modperl_sys_init(); apr_pool_cleanup_register(server_pool, NULL, modperl_sys_term, apr_pool_cleanup_null); modperl_init(s, pconf); return OK; } /* * if we need to init earlier than post_config, * e.g. sections or directive handlers. */ int modperl_run(void) { return modperl_hook_init(modperl_global_get_pconf(), NULL, NULL, modperl_global_get_server_rec()); } int modperl_is_running(void) { return MP_IS_RUNNING; } int modperl_hook_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) { #if AP_MODULE_MAGIC_AT_LEAST(20110329,0) ap_reserve_module_slots_directive("PerlLoadModule"); #endif /* we can't have PerlPreConfigHandler without first configuring mod_perl */ /* perl 5.8.1+ */ modperl_hash_seed_init(p); return OK; } static int modperl_hook_pre_connection(conn_rec *c, void *csd) { modperl_input_filter_add_connection(c); modperl_output_filter_add_connection(c); return OK; } static int modperl_hook_post_config_last(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { /* in the threaded environment, no server_rec/process_rec * modifications should be done beyond this point */ #ifdef USE_ITHREADS MP_dSCFG(s); dTHXa(scfg->mip->parent->perl); #endif if (!modperl_post_config_require(s, pconf)) { exit(1); } if (modperl_threaded_mpm()) { MP_threads_started = 1; } MP_post_post_config_phase = 1; #ifdef MP_TRACE /* httpd core open_logs handler re-opens s->error_log, which might * change, even though it still points to the same physical file * (.e.g on win32 the filehandle will be different. Therefore * reset the tracing logfile setting here, since this is the * earliest place, happening after the open_logs phase. * * Moreover, we need to dup the filehandle so that when the server * shuts down, we will be able to log to error_log after Apache * has closed it (which happens too early for our likening). */ { apr_file_t *dup; MP_RUN_CROAK(apr_file_dup(&dup, s->error_log, pconf), "mod_perl core post_config"); modperl_trace_logfile_set(dup); } #endif #if MP_PERL_VERSION_AT_LEAST(5, 9, 0) #define MP_PERL_VERSION_STAMP "Perl/%" SVf #else #define MP_PERL_VERSION_STAMP "Perl/v%vd" #endif ap_add_version_component(pconf, MP_VERSION_STRING); ap_add_version_component(pconf, Perl_form(aTHX_ MP_PERL_VERSION_STAMP, PL_patchlevel)); modperl_mgv_hash_handlers(pconf, s); modperl_modglobal_hash_keys(aTHX); modperl_env_hash_keys(aTHX); #ifdef USE_ITHREADS modperl_init_clones(s, pconf); #endif #ifdef MP_NEED_HASH_SEED_FIXUP ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, "mod_perl: using Perl HASH_SEED: %"UVuf, MP_init_hash_seed); #endif return OK; } static int modperl_hook_create_request(request_rec *r) { MP_dRCFG; #ifdef USE_ITHREADS /* XXX: this is necessary to make modperl_interp_pool_select() work * which is used at runtime only to merge dir-configs by * modperl_module_config_merge(). * * Since most requests won't need it it would be good to add some logic * (cheaper logic in terms of CPU cycles) to identify those cases and * avoid the hash operation. */ MP_TRACE_i(MP_FUNC, "setting userdata MODPERL_R in pool %#lx to %lx", (unsigned long)r->pool, (unsigned long)r); (void)apr_pool_userdata_set((void *)r, "MODPERL_R", NULL, r->pool); #endif modperl_config_req_init(r, rcfg); modperl_config_req_cleanup_register(r, rcfg); /* set the default for cgi header parsing On as early as possible * so $r->content_type in any phase after header_parser could turn * it off. wb->header_parse will be set to 1 only if this flag * wasn't turned off and MpDirPARSE_HEADERS is on */ MpReqPARSE_HEADERS_On(rcfg); return OK; } static int modperl_hook_post_read_request(request_rec *r) { #ifdef USE_ITHREADS MP_TRACE_i(MP_FUNC, "%s %s:%d%s", r->method, r->connection->local_addr->hostname, r->connection->local_addr->port, r->unparsed_uri); #endif /* if 'PerlOptions +GlobalRequest' is outside a container */ modperl_global_request_cfg_set(r); return OK; } static int modperl_hook_header_parser(request_rec *r) { /* if 'PerlOptions +GlobalRequest' is inside a container */ modperl_global_request_cfg_set(r); return OK; } static int modperl_destruct_level = 2; /* default is full tear down */ int modperl_perl_destruct_level(void) { return modperl_destruct_level; } #ifdef USE_ITHREADS static apr_status_t modperl_perl_call_endav_mip(pTHX_ modperl_interp_pool_t *mip, void *data) { modperl_perl_call_endav(aTHX); return APR_SUCCESS; } #endif /* USE_ITHREADS */ static apr_status_t modperl_child_exit(void *data) { char *level = NULL; server_rec *s = (server_rec *)data; modperl_callback_process(MP_CHILD_EXIT_HANDLER, server_pool, s, MP_HOOK_VOID); if ((level = getenv("PERL_DESTRUCT_LEVEL"))) { modperl_destruct_level = atoi(level); } else { /* default to no teardown in the children */ modperl_destruct_level = 0; } if (modperl_destruct_level) { apr_pool_clear(server_pool); } else { /* run the END blocks of this child process if * modperl_perl_destruct is not called for this process */ #ifdef USE_ITHREADS modperl_interp_mip_walk_servers(NULL, s, modperl_perl_call_endav_mip, (void*)NULL); #else modperl_perl_call_endav(aTHX); #endif } server_pool = NULL; return APR_SUCCESS; } static void modperl_hook_child_init(apr_pool_t *p, server_rec *s) { modperl_perl_init_ids_server(s); apr_pool_cleanup_register(p, (void *)s, modperl_child_exit, apr_pool_cleanup_null); } #define MP_FILTER_HANDLER(f) f, NULL void modperl_register_hooks(apr_pool_t *p) { #ifdef USE_ITHREADS APR_REGISTER_OPTIONAL_FN(modperl_interp_unselect); APR_REGISTER_OPTIONAL_FN(modperl_thx_interp_get); #endif /* for and Apache2->define("MODPERL2") */ *(char **)apr_array_push(ap_server_config_defines) = apr_pstrdup(p, "MODPERL2"); ap_hook_pre_config(modperl_hook_pre_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_open_logs(modperl_hook_init, NULL, NULL, APR_HOOK_FIRST); ap_hook_post_config(modperl_hook_post_config_last, NULL, NULL, APR_HOOK_REALLY_LAST); ap_hook_handler(modperl_response_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_handler(modperl_response_handler_cgi, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_insert_filter(modperl_output_filter_add_request, NULL, NULL, APR_HOOK_LAST); ap_hook_insert_filter(modperl_input_filter_add_request, NULL, NULL, APR_HOOK_LAST); ap_register_output_filter(MP_FILTER_REQUEST_OUTPUT_NAME, MP_FILTER_HANDLER(modperl_output_filter_handler), AP_FTYPE_RESOURCE); ap_register_input_filter(MP_FILTER_REQUEST_INPUT_NAME, MP_FILTER_HANDLER(modperl_input_filter_handler), AP_FTYPE_RESOURCE); ap_register_output_filter(MP_FILTER_CONNECTION_OUTPUT_NAME, MP_FILTER_HANDLER(modperl_output_filter_handler), AP_FTYPE_CONNECTION); ap_register_input_filter(MP_FILTER_CONNECTION_INPUT_NAME, MP_FILTER_HANDLER(modperl_input_filter_handler), AP_FTYPE_CONNECTION); ap_hook_pre_connection(modperl_hook_pre_connection, NULL, NULL, APR_HOOK_FIRST); ap_hook_create_request(modperl_hook_create_request, NULL, NULL, APR_HOOK_MIDDLE); /* both of these hooks need to run really, really first. * otherwise, the global request_rec will be set up _after_ some * Perl handlers run. */ ap_hook_post_read_request(modperl_hook_post_read_request, NULL, NULL, MODPERL_HOOK_REALLY_REALLY_FIRST); ap_hook_header_parser(modperl_hook_header_parser, NULL, NULL, MODPERL_HOOK_REALLY_REALLY_FIRST); ap_hook_child_init(modperl_hook_child_init, NULL, NULL, MODPERL_HOOK_REALLY_REALLY_FIRST); modperl_register_handler_hooks(); } static const command_rec modperl_cmds[] = { MP_CMD_SRV_ITERATE("PerlSwitches", switches, "Perl Switches"), MP_CMD_DIR_ITERATE("PerlModule", modules, "PerlModule"), MP_CMD_DIR_ITERATE("PerlRequire", requires, "PerlRequire"), MP_CMD_SRV_ITERATE("PerlConfigRequire", config_requires, "PerlConfigRequire"), MP_CMD_SRV_ITERATE("PerlPostConfigRequire", post_config_requires, "PerlPostConfigRequire"), #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) MP_CMD_SRV_TAKE2("PerlAddAuthzProvider", authz_provider, "PerlAddAuthzProvider"), MP_CMD_SRV_TAKE2("PerlAddAuthnProvider", authn_provider, "PerlAddAuthnProvider"), #endif MP_CMD_DIR_ITERATE("PerlOptions", options, "Perl Options"), MP_CMD_DIR_ITERATE("PerlInitHandler", init_handlers, "Subroutine name"), MP_CMD_DIR_TAKE2("PerlSetVar", set_var, "PerlSetVar"), MP_CMD_DIR_ITERATE2("PerlAddVar", add_var, "PerlAddVar"), MP_CMD_DIR_TAKE2("PerlSetEnv", set_env, "PerlSetEnv"), MP_CMD_SRV_TAKE1("PerlPassEnv", pass_env, "PerlPassEnv"), MP_CMD_DIR_RAW_ARGS_ON_READ("wbucket) { rcfg->wbucket = (modperl_wbucket_t *)apr_palloc(r->pool, sizeof(*rcfg->wbucket)); } wb = rcfg->wbucket; /* setup buffer for output */ wb->pool = r->pool; wb->filters = &r->output_filters; wb->outcnt = 0; wb->header_parse = MpDirPARSE_HEADERS(dcfg) && MpReqPARSE_HEADERS(rcfg) ? 1 : 0; wb->r = r; } apr_status_t modperl_response_finish(request_rec *r) { MP_dRCFG; /* flush output buffer */ return modperl_wbucket_flush(rcfg->wbucket, FALSE); } static int modperl_response_handler_run(request_rec *r) { int retval; modperl_response_init(r); retval = modperl_callback_per_dir(MP_RESPONSE_HANDLER, r, MP_HOOK_RUN_FIRST); if ((retval == DECLINED) && r->content_type) { r->handler = r->content_type; /* let http_core or whatever try */ } return retval; } int modperl_response_handler(request_rec *r) { MP_dDCFG; apr_status_t retval, rc; MP_dINTERP; if (!strEQ(r->handler, "modperl")) { return DECLINED; } MP_INTERPa(r, r->connection, r->server); /* default is -SetupEnv, add if PerlOption +SetupEnv */ if (MpDirSETUP_ENV(dcfg)) { modperl_env_request_populate(aTHX_ r); } retval = modperl_response_handler_run(r); rc = modperl_response_finish(r); if (rc != APR_SUCCESS) { retval = rc; } MP_INTERP_PUTBACK(interp, aTHX); return retval; } int modperl_response_handler_cgi(request_rec *r) { MP_dDCFG; GV *h_stdin, *h_stdout; apr_status_t retval, rc; MP_dRCFG; MP_dINTERP; if (!strEQ(r->handler, "perl-script")) { return DECLINED; } MP_INTERPa(r, r->connection, r->server); modperl_perl_global_request_save(aTHX_ r); /* default is +SetupEnv, skip if PerlOption -SetupEnv */ if (MpDirSETUP_ENV(dcfg) || !MpDirSeenSETUP_ENV(dcfg)) { modperl_env_request_populate(aTHX_ r); } /* default is +GlobalRequest, skip if PerlOption -GlobalRequest */ if (MpDirGLOBAL_REQUEST(dcfg) || !MpDirSeenGLOBAL_REQUEST(dcfg)) { modperl_global_request_set(r); } /* need to create a block around the IO setup so the temp vars * will be automatically cleaned up when we are done with IO */ ENTER;SAVETMPS; h_stdin = modperl_io_override_stdin(aTHX_ r); h_stdout = modperl_io_override_stdout(aTHX_ r); modperl_env_request_tie(aTHX_ r); retval = modperl_response_handler_run(r); modperl_env_request_untie(aTHX_ r); modperl_perl_global_request_restore(aTHX_ r); modperl_io_restore_stdin(aTHX_ h_stdin); modperl_io_restore_stdout(aTHX_ h_stdout); FREETMPS;LEAVE; MP_INTERP_PUTBACK(interp, aTHX); /* flush output buffer after interpreter is putback */ rc = modperl_response_finish(r); if (rc != APR_SUCCESS) { retval = rc; } switch (rcfg->status) { case HTTP_MOVED_TEMPORARILY: /* set by modperl_cgi_header_parse */ retval = HTTP_MOVED_TEMPORARILY; break; } return retval; } /* This ugly hack pulls in any function listed in * modperl_exports.c. Otherwise, the over-zealous * linker would remove unused api functions */ const void *modperl_suck_in_ugly_hack(void); const void *modperl_suck_in_ugly_hack(void) { extern const void *modperl_ugly_hack; return modperl_ugly_hack; } module AP_MODULE_DECLARE_DATA perl_module = { STANDARD20_MODULE_STUFF, modperl_config_dir_create, /* dir config creater */ modperl_config_dir_merge, /* dir merger --- default is to override */ modperl_config_srv_create, /* server config */ modperl_config_srv_merge, /* merge server config */ modperl_cmds, /* table of config file commands */ modperl_register_hooks, /* register hooks */ }; /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/src/modules/perl/mod_perl.h0000644000104000010010000001550012540623203021135 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MOD_PERL_H #define MOD_PERL_H #include "modperl_apache_includes.h" #include "modperl_common_includes.h" #include "modperl_apache_compat.h" #ifdef WIN32 #define MP_THREADED 1 #else #define MP_THREADED (defined(USE_ITHREADS) && APR_HAS_THREADS) #endif extern module AP_MODULE_DECLARE_DATA perl_module; #include "modperl_error.h" #include "modperl_flags.h" #include "modperl_hooks.h" #include "modperl_perl_global.h" #include "modperl_perl_pp.h" #include "modperl_sys.h" #include "modperl_const.h" #include "modperl_constants.h" /* both perl and apr have largefile support enabled */ #if defined(USE_LARGE_FILES) && APR_HAS_LARGE_FILES #define MP_LARGE_FILES_ENABLED #endif /* both perl and apr have largefile support disabled */ #if (!defined(USE_LARGE_FILES)) && !APR_HAS_LARGE_FILES #define MP_LARGE_FILES_DISABLED #endif /* perl largefile support is enabled, apr support is disabled */ #if defined(USE_LARGE_FILES) && !APR_HAS_LARGE_FILES #define MP_LARGE_FILES_PERL_ONLY #endif /* apr largefile support is enabled, perl support is disabled */ #if (!defined(USE_LARGE_FILES)) && APR_HAS_LARGE_FILES #define MP_LARGE_FILES_APR_ONLY #endif /* conflict due to not have either both perl and apr * support enabled or both disabled */ #if defined(MP_LARGE_FILES_APR_ONLY) || defined(MP_LARGE_FILES_PERL_ONLY) #define MP_LARGE_FILES_CONFLICT #endif #ifdef MP_USE_GTOP #include "modperl_gtop.h" #endif #include "modperl_time.h" #include "modperl_types.h" #include "modperl_util.h" #include "modperl_config.h" #include "modperl_cmd.h" #include "modperl_handler.h" #include "modperl_callback.h" #include "modperl_tipool.h" #include "modperl_interp.h" #include "modperl_log.h" #include "modperl_options.h" #include "modperl_directives.h" #include "modperl_io.h" #include "modperl_io_apache.h" #include "modperl_filter.h" #include "modperl_bucket.h" #include "modperl_pcw.h" #include "modperl_mgv.h" #include "modperl_global.h" #include "modperl_env.h" #include "modperl_cgi.h" #include "modperl_perl.h" #include "modperl_svptr_table.h" #include "modperl_module.h" #include "modperl_debug.h" int modperl_threads_started(void); int modperl_threaded_mpm(void); int modperl_post_post_config_phase(void); #define MP_CROAK_IF_THREADS_STARTED(what) \ if (modperl_threads_started()) { \ Perl_croak(aTHX_ "Can't run '%s' in the threaded " \ "environment after server startup", what); \ } #define MP_CROAK_IF_THREADED_MPM(what) \ if (modperl_threaded_mpm()) { \ Perl_croak(aTHX_ "Can't run '%s' in a threaded mpm", \ what); \ } #define MP_CROAK_IF_POST_POST_CONFIG_PHASE(what) \ if (modperl_post_post_config_phase()) { \ Perl_croak(aTHX_ "Can't run '%s' after server startup", \ what); \ } int modperl_init_vhost(server_rec *s, apr_pool_t *p, server_rec *base_server); void modperl_init(server_rec *s, apr_pool_t *p); void modperl_init_globals(server_rec *s, apr_pool_t *pconf); int modperl_run(void); int modperl_is_running(void); int modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s); int modperl_hook_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp); void modperl_register_hooks(apr_pool_t *p); apr_pool_t *modperl_server_pool(void); apr_pool_t *modperl_server_user_pool(void); PerlInterpreter *modperl_startup(server_rec *s, apr_pool_t *p); int modperl_perl_destruct_level(void); void xs_init(pTHX); void modperl_response_init(request_rec *r); apr_status_t modperl_response_finish(request_rec *r); int modperl_response_handler(request_rec *r); int modperl_response_handler_cgi(request_rec *r); #define MgTypeExt(mg) (mg->mg_type == '~') typedef void MP_FUNC_NONSTD_T(modperl_var_modify_t) (apr_table_t *, apr_table_t *, const char *, const char *); /* we need to hook a few internal things before APR_HOOK_REALLY_FIRST */ #define MODPERL_HOOK_REALLY_REALLY_FIRST (-20) #ifdef USE_ITHREADS APR_DECLARE_OPTIONAL_FN(apr_status_t,modperl_interp_unselect,(void *)); APR_DECLARE_OPTIONAL_FN(modperl_interp_t *,modperl_thx_interp_get,(PerlInterpreter *)); #endif /* * perl context overriding and restoration is required when * PerlOptions +Parent/+Clone is used in vhosts, and perl is used to * at the server startup. So that sections, PerlLoadModule, * PerlModule and PerlRequire are all run using the right perl context * and restore to the original context when they are done. * * As of perl-5.8.3 it's unfortunate that it uses PERL_GET_CONTEXT and * doesn't rely on the passed pTHX internally. When and if perl is * fixed to always use pTHX if available, this context switching mess * can be removed. */ #ifdef USE_ITHREADS #define MP_PERL_CONTEXT_DECLARE \ PerlInterpreter *orig_perl = NULL; \ pTHX; #define MP_PERL_CONTEXT_STORE \ orig_perl = PERL_GET_CONTEXT; #define MP_PERL_CONTEXT_OVERRIDE(new_perl) \ aTHX = new_perl; \ PERL_SET_CONTEXT(aTHX); #define MP_PERL_CONTEXT_STORE_OVERRIDE(new_perl) \ MP_PERL_CONTEXT_STORE; \ MP_PERL_CONTEXT_OVERRIDE(new_perl) #define MP_PERL_CONTEXT_RESTORE \ if (orig_perl) { \ PERL_SET_CONTEXT(orig_perl); \ } #else /* #ifdef USE_ITHREADS */ #define MP_PERL_CONTEXT_DECLARE #define MP_PERL_CONTEXT_STORE #define MP_PERL_CONTEXT_OVERRIDE(new_perl) #define MP_PERL_CONTEXT_STORE_OVERRIDE(new_perl) #define MP_PERL_CONTEXT_RESTORE #endif /* end of #ifdef USE_ITHREADS */ #endif /* MOD_PERL_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/STATUS0000644000104000010010000000272112540623203014731 0ustar AdministratorsNonemod_perl 2.0 STATUS: -*-text-*- Last modified at [$Date: 2013-04-18 03:21:34 +0100 (Thu, 18 Apr 2013) $] Release: -------- 2.000.08 : Released Apr 17, 2013 2.000.07 : Released Jun 05, 2012 2.000.06 : Released Apr 24, 2012 2.000.05 : Released Feb 07, 2011 2.000.04 : Released Apr 16, 2008 2.000.03 : Released Nov 29, 2006 2.000.02 : Released Oct 20, 2005 2.000.01 : Released Jun 17, 2005 2.000.00 : Released May 20, 2005 1.999.23 : Released May 03, 2005 1.999.22 : Released Apr 14, 2005 1.999.21 : Released Jan 22, 2005 1.999.20 : Released Jan 05, 2005 1.99_19 : Released Dec 22, 2004 1.99_18 : Released Dec 12, 2004 1.99_17 : Released Oct 22, 2004 1.99_16 : Released Aug 22, 2004 1.99_15 : Released Aug 20, 2004 1.99_14 : Released May 21, 2004 1.99_13 : Released Mar 08, 2004 1.99_12 : Released Dec 22, 2003 1.99_11 : Released Nov 10, 2003 1.99_10 : Released Sep 30, 2003 1.99_09 : Released Apr 28, 2003 1.99_08 : Released Jan 10, 2003 1.99_07 : Released Sep 27, 2002 1.99_06 : Not released 1.99_05 : Released Aug 20, 2002 1.99_04 : Released Jun 21, 2002 1.99_03 : Released Jun 16, 2002 1.99_02 : Released Jun 01, 2002 1.99_01 : Released Apr 06, 2002 Issues, bugs and features and their implementation status are spread across several files under the todo/ directory mod_perl-2.0.9/SVN-MOVE0000644000177200010010000000253112540623203013216 0ustar SteveNoneThis file tracks the things that need to be done to accomplish the move of modperl projects to SVN: * missing commit template files (à là CVS) PR: Obtained from: Submitted by: Reviewed by: ... * commit messages should trim the unrelated crap in the file path e.g. currently we get: --- perl/modperl/docs/trunk/src/search/swish.conf (original) +++ perl/modperl/docs/trunk/src/search/swish.conf Fri Nov 19 21:23:25 2004 and it should be: --- src/search/swish.conf (original) +++ src/search/swish.conf Fri Nov 19 21:23:25 2004 so it can be applied/edited easily. * improve the commit message subject line to print only important info (currently may print 100 files listed in the subject), e.g.: Subject: svn commit: r105803 - in httpd/test/trunk/perl-framework: . Apache-Test Apache-Test/lib/Apache Apache-Test/t Apache-Test/t/conf c-modules c-modules/authany c-modules/client_add_filter c-modules/eat_post c-modules/echo_post c-modules/echo_post_chunk c-modules/input_body_filter c-modules/list_modules c-modules/nntp_like c-modules/random_chunk c-modules/test_apr_uri c-modules/test_pass_brigade c-modules/test_rwrite c-modules/test_ssl t t/conf t/conf/ssl t/htdocs/modules/access/htaccess t/htdocs/modules/cgi t/htdocs/modules/rewrite t/modules Proposed Subject format: $svn_id $first_subdir/$first_file ($trunk) mod_perl-2.0.9/t/0000755000104000010010000000000012540623174014233 5ustar AdministratorsNonemod_perl-2.0.9/t/apache/0000755000104000010010000000000012540623203015445 5ustar AdministratorsNonemod_perl-2.0.9/t/apache/add_config.t0000644000104000010010000000050712540623203017711 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # the handler is configured in modperl_extra.pl via # Apache2::ServerUtil->server->add_config use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/apache/add_config"; mod_perl-2.0.9/t/apache/cgihandler.t0000644000104000010010000000104612540623203017733 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 2; my $location = "/TestApache__cgihandler"; my $expected = "1..3\nok 1\nok 2\nok 3\n"; my $received = POST_BODY $location, content => $expected; ok t_cmp $received, $expected, "POST cgihandler"; $received = GET_BODY $location; ok t_cmp $received, $expected, "GET cgihandler"; mod_perl-2.0.9/t/apache/constants.t0000644000104000010010000000426312540623203017653 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use ExtUtils::testlib; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; # -compile puts constants into the Apache2:: namespace use Apache2::Const -compile => qw(:http :common :mpmq :proxy TAKE23 &OPT_EXECCGI DECLINE_CMD DIR_MAGIC_TYPE CRLF); # without -compile, constants are in the # caller namespace. also defaults to :common use Apache2::Const; plan tests => 18; ok t_cmp(REDIRECT, 302, 'REDIRECT'); ok t_cmp(AUTH_REQUIRED, 401, 'AUTH_REQUIRED'); ok t_cmp(OK, 0, 'OK'); ok t_cmp(Apache2::Const::OK, 0, 'Apache2::Const::OK'); ok t_cmp(Apache2::Const::DECLINED, -1, 'Apache2::Const::DECLINED'); ok t_cmp(Apache2::Const::HTTP_GONE, 410, 'Apache2::Const::HTTP_GONE'); ok t_cmp(Apache2::Const::DIR_MAGIC_TYPE, 'httpd/unix-directory', 'Apache2::Const::DIR_MAGIC_TYPE'); ok t_cmp(Apache2::Const::MPMQ_MAX_SPARE_DAEMONS, 9, 'Apache2::Const::MPMQ_MAX_SPARE_DAEMONS'); ok t_cmp(Apache2::Const::PROXYREQ_REVERSE, 2, 'Apache2::Const::PROXYREQ_REVERSE'); # the rest of the tests don't fit into the t_cmp() meme # for one reason or anothre... print "testing Apache2::Const::OPT_EXECCGI is defined\n"; ok defined Apache2::Const::OPT_EXECCGI; print "testing Apache2::Const::DECLINE_CMD\n"; ok Apache2::Const::DECLINE_CMD eq "\x07\x08"; # try and weed out EBCDIC - this is the test httpd uses if (chr(0xC1) eq 'A') { print "testing Apache2::Const::CRLF (EBCDIC)\n"; ok Apache2::Const::CRLF eq "\r\n"; } else { print "testing Apache2::Const::CRLF (ASCII)\n"; ok Apache2::Const::CRLF eq "\015\012"; } print "testing M_GET not yet defined\n"; ok ! defined &M_GET; Apache2::Const->import('M_GET'); print "testing M_GET now defined\n"; ok defined &M_GET; for (qw(BOGUS :bogus -foobar)) { eval { Apache2::Const->import($_) }; print "testing bogus import $_\n"; ok $@; } print "testing explicit call to compile()\n"; eval { Apache2::Const::compile() }; ok $@; mod_perl-2.0.9/t/apache/content_length_header.t0000644000104000010010000001355012540623203022161 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 12 * 2 + 3; my $location = "/TestApache__content_length_header"; # 1. because Apache proclaims itself governor of the C-L header via # the C-L filter (ap_content_length_filter at # httpd-2.0/server/protocol.c), test whether GET and HEAD behave the # same wrt C-L under varying circumstances. for the most part GET # and HEAD should behave exactly the same. however, when Apache # sees a HEAD request with a C-L header of zero it takes special # action and removes the C-L header. this is done to protect against # handlers that called r->header_only (which was ok in 1.3 but is # not in 2.0). So, GET and HEAD behave the same except when the # content handler (plus filters) end up sending no content. see # the lengthy comments in ap_http_header_filter in http_protocol.c. # # for more discussion on # why it is important to get HEAD requests right, see these threads # from the mod_perl list # http://marc.theaimsgroup.com/?l=apache-modperl&m=108647669726915&w=2 # http://marc.theaimsgroup.com/?t=109122984600001&r=1&w=2 # as well as this bug report from mozilla, which shows how they # are using HEAD requests in the wild # http://bugzilla.mozilla.org/show_bug.cgi?id=245447 foreach my $method (qw(GET HEAD)) { no strict qw(refs); { # if the response handler sends no data, and sets no C-L header, # the client doesn't get C-L header at all. # # in 2.0 GET requests get a C-L of zero, while HEAD requests do # not due to special processing. my $uri = $location; my $res = $method->($uri); my $cl = 0; my $head_cl = undef; ok t_cmp $res->code, 200, "$method $uri code"; ok t_cmp ($res->header('Content-Length'), $method eq 'GET' ? $cl : $head_cl, "$method $uri C-L header"); ok t_cmp $res->content, "", "$method $uri content"; } { # if the response handler sends no data and sets C-L header, # the client should receive the set content length. in 2.1 # this is the way it happens. see protocol.c -r1.150 -r1.151 # # in 2.0 the client doesn't get C-L header for HEAD requests # due to special processing, and GET requests get a calculated # C-L of zero. my $uri = "$location?set_content_length"; my $res = $method->($uri); my $cl = 0; my $head_cl; ## 2.2.1, 2.0.56, 2.0.57 were not released ## but we use the versions the changes went into ## to protect against wierd SVN checkout building. ## XXX: I'm starting to think this test is more ## trouble then its worth. if (have_min_apache_version("2.2.1")) { $head_cl = 25; } elsif (have_min_apache_version("2.2.0")) { # $head_cl = undef; # avoid warnings } elsif (have_min_apache_version("2.0.56")) { $head_cl = 25; } else { # $head_cl = undef; # avoid warnings } ok t_cmp $res->code, 200, "$method $uri code"; ok t_cmp ($res->header('Content-Length'), $method eq 'GET' ? $cl : $head_cl, "$method $uri C-L header"); ok t_cmp $res->content, "", "$method $uri content"; } { # if the response handler sends data, and sets no C-L header, # the client doesn't get C-L header. my $uri = "$location?send_body"; my $res = $method->($uri); ok t_cmp $res->code, 200, "$method $uri code"; ok t_cmp $res->header('Content-Length'), undef, "$method $uri C-L header"; my $content = $method eq 'GET' ? 'This is a response string' : ''; ok t_cmp $res->content, $content, "$method $uri content"; } { # if the response handler sends data (e.g. one char string), and # sets C-L header, the client gets the C-L header my $uri = "$location?send_body+set_content_length"; my $res = $method->($uri); ok t_cmp $res->code, 200, "$method $uri code"; ok t_cmp $res->header('Content-Length'), 25, "$method $uri C-L header"; my $content = $method eq 'GET' ? 'This is a response string' : ''; ok t_cmp $res->content, $content, "$method $uri content"; } } # 2. even though the spec says that content handlers should send an # identical response for GET and HEAD requests, some folks try to # avoid the overhead of generating the response body, which Apache is # going to discard anyway for HEAD requests. The following discussion # assumes that we deal with a HEAD request. # # When Apache sees EOS and no headers and no response body were sent, # ap_content_length_filter (httpd-2.0/server/protocol.c) sets C-L to # 0. Later on ap_http_header_filter # (httpd-2.0/modules/http/http_protocol.c) removes the C-L header for # the HEAD requests # # the workaround is to force the sending of the response headers, # before EOS was sent. The simplest solution is to use rflush(): # # if ($r->header_only) { # HEAD # $body_len = calculate_body_len(); # $r->set_content_length($body_len); # $r->rflush; # } # else { # GET # # generate and send the body # } # # now if the handler sets the C-L header it'll be delivered to the # client unmodified. { # if the response handler sends data (e.g. one char string), and # sets C-L header, the client gets the C-L header my $uri = "$location?head_no_body+set_content_length"; my $res = HEAD $uri; ok t_cmp $res->code, 200, "HEAD $uri code"; ok t_cmp $res->header('Content-Length'), 25, "HEAD $uri C-L header"; ok t_cmp $res->content, '', "HEAD $uri content"; } mod_perl-2.0.9/t/apache/discard_rbody.t0000644000104000010010000000103112540623203020435 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache::TestRequest; my $location = "/TestApache__discard_rbody"; my $content = "Y" x 100000; # more than one bucket plan tests => 3; for my $test (qw(none partial all)) { my $received = POST_BODY "$location?$test", content => $content; ok t_cmp($received, $test, "data consumption: $test"); } mod_perl-2.0.9/t/apache/post.t0000644000104000010010000000112712540623203016620 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 2; my $location = "/TestApache__post"; my $str; my @data = (arizona => 'wildcats'); my %data = @data; $str = POST_BODY $location, content => "@data"; ok $str; my $data = join '&', map { "$_=$data{$_}" } keys %data; $str = POST_BODY $location, content => $data; ok t_cmp($str, join(':', length($data), $data), "POST"); mod_perl-2.0.9/t/apache/read.t0000644000104000010010000000235012540623203016545 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use File::Spec::Functions qw(catfile); plan tests => 1; #force test to go over http, since this doesn't work with t/TEST -ssl Apache::TestRequest::scheme('http'); my $location = "/TestApache__read"; my $socket = Apache::TestRequest::vhost_socket('default'); my $file = catfile Apache::Test::vars('serverroot'), "..", 'Makefile'; open my $fh, $file or die "open $file: $!"; my $data = join '', <$fh>; close $fh; my $size = length $data; for my $string ("POST $location http/1.0", "Content-length: $size", "") { my $line = "$string\r\n"; syswrite $socket, $line, length($line); } my $written = 0; my $bufsiz = 240; my $sleeps = 2; while ($written < length($data)) { my $remain = length($data) - $written; my $len = $remain > $bufsiz ? $bufsiz : $remain; $written += syswrite $socket, $data, $len, $written; sleep 1 if $sleeps-- > 0; } while (<$socket>) { last if /^\015?\012$/; #skip over headers } my $return = join '', <$socket>; ok $data eq $return; mod_perl-2.0.9/t/apache/read2.t0000644000104000010010000000040312540623203016624 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::TestRequest 'POST_BODY_ASSERT'; print POST_BODY_ASSERT "/TestApache__read2", content => "foobar"; mod_perl-2.0.9/t/apache/read3.t0000644000177200010010000000041012540623203014722 0ustar SteveNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::TestRequest 'POST_BODY_ASSERT'; print POST_BODY_ASSERT "/TestApache__read3", content => "foobar"x2000; mod_perl-2.0.9/t/apache/read4.t0000644000177200010010000000040512540623203014727 0ustar SteveNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::TestRequest 'POST_BODY_ASSERT'; print POST_BODY_ASSERT "/TestApache__read4", content => "foobar"x2; mod_perl-2.0.9/t/apache/scanhdrs.t0000644000104000010010000000125312540623203017440 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 4; my $module = 'TestApache::scanhdrs'; my $location = "/" . Apache::TestRequest::module2path($module); my $res = GET $location; t_debug $res->as_string; ok t_cmp($res->content, qr/^ok 1$/m); ok t_cmp($res->header('Content-Type'), 'text/test-output', "standard header"); ok t_cmp($res->header('X-Perl-Module'), $module, "custom header"); ok t_cmp($res->message, qr/beer/); mod_perl-2.0.9/t/apache/scanhdrs2.t0000644000104000010010000000155512540623203017527 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 5, need 'HTML::HeadParser'; my $module = 'TestApache__scanhdrs2'; my $location = "/$module"; my $redirect = 'http://perl.apache.org/'; my $res = GET "$location?$redirect", redirect_ok => 0; ok t_cmp($res->header('Location')||'', $redirect, "Location header"); ok t_cmp($res->code, 302, "status == 302"); $redirect = '/index.html'; $res = GET "$location?$redirect", redirect_ok => 0; ok t_cmp(!$res->header('Location'), 1, "no Location header"); ok t_cmp($res->code, 200, "status == 200"); ok t_cmp($res->content, qr{welcome to}, "content is index.html"); mod_perl-2.0.9/t/apache/send_cgi_header.t0000644000104000010010000000144212540623203020716 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 4; my $location = "/TestApache__send_cgi_header"; my $res = GET $location; ok t_cmp($res->header('X-Foo'), 'X-Bar', "header test"); ok t_cmp($res->header('Set-Cookie'), 'Bad Programmer, No cookie!', "header test2"); my $expected = "\0\0This not the end of the world\0\0\n"; my $received = $res->content; ok t_cmp(length($received), length($expected), "body length test"); # \000 aren't seen when printed ok t_cmp($received, $expected, "body content test"); mod_perl-2.0.9/t/api/0000755000104000010010000000000012540623203014775 5ustar AdministratorsNonemod_perl-2.0.9/t/api/access2.t0000644000104000010010000000171112540623203016505 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; if (!have_min_apache_version("2.4.0")) { plan tests => 6, need need_lwp, need_auth, need_access, 'mod_version.c', 'HTML::HeadParser'; my $location = "/TestAPI__access2"; ok !GET_OK $location; my $rc = GET_RC $location; ok t_cmp $rc, 401, "no credentials passed"; # bad user ok !GET_OK $location, username => 'root', password => '1234'; # good user/bad pass ok !GET_OK $location, username => 'goo', password => 'foo'; # good user/good pass ok GET_OK $location, username => 'goo', password => 'goopass'; # any user/any pass POST works ok POST_OK $location, username => 'bar', password => 'goopass1', content => "a"; } else { plan tests => 1, need {"mod_perl is not compiled with httpd-2.2" => 0}; } mod_perl-2.0.9/t/api/access2_24.t0000644000104000010010000000151612540623203017015 0ustar AdministratorsNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; if (have_min_apache_version("2.4.0")) { plan tests => 6, need need_lwp, need_auth, need_access, 'mod_access_compat.c', 'mod_version.c', 'HTML::HeadParser'; my $location = "/TestAPI__access2"; ok !GET_OK $location; my $rc = GET_RC $location; ok t_cmp $rc, 401, "no credentials passed"; # bad user ok !GET_OK $location, username => 'root', password => '1234'; # good user/bad pass ok !GET_OK $location, username => 'goo', password => 'foo'; # good user/good pass ok GET_OK $location, username => 'goo', password => 'goopass'; # any user/any pass POST works ok POST_OK $location, username => 'bar', password => 'goopass1', content => "a"; } else { plan tests => 1, need {"mod_perl is not compiled with httpd-2.4" => 0}; } mod_perl-2.0.9/t/api/add_config.t0000644000104000010010000000065712540623203017247 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestAPI::add_config'; my $url = Apache::TestRequest::module2url($module) . "/"; t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/api/content_encoding.t0000644000104000010010000000145712540623203020511 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, need_min_module_version("Compress::Zlib", "1.09"); my $location = '/TestAPI__content_encoding'; my $expected = 'This is a clear text'; my $res = POST $location, content => $expected; my $received = $res->content; #t_debug($received); if ($res->header('Content-Encoding') =~ /gzip/) { require Compress::Zlib; # gzip already produces data in a network order, so no extra # transformation seem to be necessary $received = Compress::Zlib::memGunzip($received); } ok t_cmp $received, $expected, "Content-Encoding: gzip test"; mod_perl-2.0.9/t/api/custom_response.t0000644000104000010010000000272112540623203020414 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile); use Apache2::Const -compile => qw(FORBIDDEN); my $module = 'TestAPI::custom_response'; my $location = '/' . Apache::TestRequest::module2path($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); my $file = catfile Apache::Test::vars('documentroot'), qw(api custom_response.txt); open my $fh, $file or die "Can't open $file: $!"; my $data = do { binmode $fh; local $/; <$fh> }; close $fh; plan tests => 4, need need_lwp, 'HTML::HeadParser'; { # custom text response my $expected = "This_is_a_custom_text_response"; my $res = GET "$location?$expected"; ok t_cmp $res->code, Apache2::Const::FORBIDDEN, "custom text response (code)"; ok t_cmp $res->content, $expected, "custom text response (body)"; } { # custom relative url response my $url = "/api/custom_response.txt"; my $res = GET "$location?$url"; ok t_cmp $res->content, $data, "custom file response (body)"; } { my $url = "http://$hostport/api/custom_response.txt"; # custom full url response my $res = GET "$location?$url"; ok t_cmp $res->content, $data, "custom file response (body)"; } mod_perl-2.0.9/t/api/err_headers_out.t0000644000104000010010000000372012540623203020336 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 6, need 'HTML::HeadParser'; my $location = '/TestAPI__err_headers_out'; { # with 2xx responses any of the err_headers_out and headers_out # headers make it through my $res = GET "$location?200"; #t_debug $res->as_string; ok t_cmp $res->code, 200, "OK"; # HTTP::Headers 6.00 makes the next 2 tests fail. When the response comes # in the header name is stored as "x-err_headers_out". But when it is to # be read below it is referred as "x-err-headers-out" and hence not found. local $HTTP::Headers::TRANSLATE_UNDERSCORE= $HTTP::Headers::TRANSLATE_UNDERSCORE; undef $HTTP::Headers::TRANSLATE_UNDERSCORE if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION >= 6.00; ok t_cmp $res->header('X-err_headers_out'), "err_headers_out", "X-err_headers_out: made it"; ok t_cmp $res->header('X-headers_out'), "headers_out", "X-headers_out: made it"; } { # with non-2xx responses only the err_headers_out headers make it # through. the headers_out do not make it. my $res = GET "$location?404"; #t_debug $res->as_string; ok t_cmp $res->code, 404, "not found"; # HTTP::Headers 6.00 makes this test fail. When the response comes in # the header name is stored as "x-err_headers_out". But when it is to # be read below it is referred as "x-err-headers-out" and hence not found. local $HTTP::Headers::TRANSLATE_UNDERSCORE= $HTTP::Headers::TRANSLATE_UNDERSCORE; undef $HTTP::Headers::TRANSLATE_UNDERSCORE if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION >= 6.00; ok t_cmp $res->header('X-err_headers_out'), "err_headers_out", "X-err_headers_out: made it"; ok !$res->header('X-headers_out'); } mod_perl-2.0.9/t/api/internal_redirect.t0000644000104000010010000000175312540623203020665 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # test internal redirects originating from 'SetHandler modperl' and # 'SetHandler perl-script' main handlers, and sub-requests handled by # the handlers of the same and the opposite kind use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $uri = "/TestAPI__internal_redirect"; my %map = ( "modperl => modperl" => "${uri}_modperl?uri=${uri}_modperl", "perl-script => modperl" => "${uri}_perl_script?uri=${uri}_modperl", "perl-script => perl-script" => "${uri}_perl_script?uri=${uri}_perl_script", "modperl => perl-script" => "${uri}_modperl?uri=${uri}_perl_script", ); plan tests => scalar keys %map; while (my ($key, $val) = each %map) { my $expected = "internal redirect: $key"; my $received = GET_BODY_ASSERT $val; ok t_cmp($received, $expected); } mod_perl-2.0.9/t/api/internal_redirect_handler.t0000644000104000010010000000103712540623203022355 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $uri = "/TestAPI__internal_redirect_handler"; my @ct_types = qw(text/plain text/html); plan tests => scalar @ct_types; for my $type (@ct_types) { my $expected = $type; my $received = GET_BODY_ASSERT "$uri?ct=$type"; ok t_cmp $received, $expected, "Content-type: $type"; } mod_perl-2.0.9/t/api/in_out_filters.t0000644000104000010010000000113312540623203020205 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $location = '/TestAPI__in_out_filters'; my $content = join '', 'AA'..'ZZ', 1..99999; my $expected = lc $content; my $received = POST_BODY $location, content => $content; # don't use t_cmp in this test, because the data length is 500K. # You don't want to see 500K * 2 when you run t/TEST -verbose ok $received eq $expected; mod_perl-2.0.9/t/api/lookup_misc.t0000644000104000010010000000160012540623203017503 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec; my $uri = "/TestAPI__lookup_misc"; my $file = File::Spec->rel2abs(__FILE__); open my $fh, $file or die "Can't open $file: $!"; my $data = do { binmode $fh; local $/; <$fh> }; close $fh; plan tests => 2; # lookup_file { my $args = "subreq=lookup_file;file=$file"; my $expected = $data; my $received = GET_BODY_ASSERT "$uri?$args"; t_debug "lookup_file"; ok $received eq $expected; } # lookup_method_uri { my $args = "subreq=lookup_method_uri;uri=/lookup_method_uri"; my $expected = "ok"; my $received = GET_BODY_ASSERT "$uri?$args"; ok t_cmp $received, $expected, "lookup_method_uri"; } mod_perl-2.0.9/t/api/lookup_uri.t0000644000104000010010000000163512540623203017357 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $uri = "/TestAPI__lookup_uri"; use constant PREFIX => 0; use constant SUFFIX => 1; my %opts = ( first => [2, 2], # all filters run twice second => [1, 2], # the top level req filter skipped for the subreq none => [1, 1], # no request filters run by subreq default => [1, 1], # same as none ); plan tests => scalar keys %opts; while (my ($filter, $runs) = each %opts) { my $args = "subreq=lookup_uri;filter=$filter"; my $prefix = "pre+" x $runs->[PREFIX]; my $suffix = "+suf" x $runs->[SUFFIX]; my $expected = "$prefix$args$suffix"; my $received = GET_BODY_ASSERT "$uri?$args"; ok t_cmp $received, $expected, "$args"; } mod_perl-2.0.9/t/api/request_rec.t0000644000104000010010000000045412540623203017506 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest 'GET_BODY_ASSERT'; print GET_BODY_ASSERT "/TestAPI__request_rec/my_path_info?my_args=3"; mod_perl-2.0.9/t/api/rflush.t0000644000104000010010000000115612540623203016470 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; my $location = '/TestAPI__rflush'; plan tests => 2; { my $response = GET_BODY "$location?nontied"; ok t_cmp($response, "[1][2][3][4][56]", "non-tied rflush creates bucket brigades"); } { my $response = GET_BODY "$location?tied"; ok t_cmp($response, "[1][2][3456]", "tied STDOUT internal rflush creates bucket brigades"); } mod_perl-2.0.9/t/api/sendfile.t0000644000104000010010000000325312540623203016756 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile); my $url = '/TestAPI__sendfile'; my $file = catfile Apache::Test::vars('serverroot'), 'response/TestAPI/sendfile.pm'; my $contents; open my $fh, $file or die "can't open $file: $!"; # need binmode on Win32 so as not to strip \r, which # are included when sending with sendfile(). binmode $fh; { local $/; $contents = <$fh>; } close $fh; plan tests => 7, need 'HTML::HeadParser'; { my $header = "This is a header\n"; my $footer = "This is a footer\n"; my $received = GET_BODY "$url?withwrapper"; my $expected = join '', $header, $contents, $footer; #t_debug($received); ok $received && $received eq $expected; } { my $received = GET_BODY "$url?offset"; my $expected = substr $contents, 3; #t_debug($received); ok $received && $received eq $expected; } { my $received = GET_BODY "$url?len"; my $expected = substr $contents, 3, 50; #t_debug($received); ok $received && $received eq $expected; } { # rc is checked and handled by the code my $res = GET "$url?noexist.txt"; ok t_cmp($res->code, 500, "failed sendfile"); #t_debug($res->content); ok $res->content =~ /an internal error/; } { # rc is not checked in this one, testing the exception throwing my $res = GET "$url?noexist-n-nocheck.txt"; ok t_cmp($res->code, 500, "failed sendfile"); #t_debug($res->content); ok $res->content =~ /an internal error/; } mod_perl-2.0.9/t/api/slurp_filename.t0000644000104000010010000000052412540623203020170 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::TestRequest 'GET_BODY_ASSERT'; # we want r->filename to be "/slurp/slurp.pl", even though the # response handler is TestAPI::slurp_filename print GET_BODY_ASSERT "/slurp/slurp.pl"; mod_perl-2.0.9/t/api/status.t0000644000104000010010000000277512540623203016520 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # testing $r->status/status_line use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 6; my $location = "/TestAPI__status"; { # test a valid HTTP/1.1 status code (303). In this test # the handler returns OK, but sets a custom status. Apache will # lookup the message "See Other" on its own my $code = 303; # Apache2::Const::HTTP_SEE_OTHER my $message = "See Other"; my $res = GET "$location?$code="; ok t_cmp $res->code, $code, "code"; ok t_cmp $res->message, $message, "code message"; ok t_cmp $res->content, "", "content"; } { # test a non-existing HTTP/1.1 status code (499). In this test # the handler returns OK, but sets a custom status_line. # it also tries to set status (to a different value), but it # should be ignored by Apache, since status_line is supposed to # override status. the handler also sets a custom code message # modules/http/http_filters.c r372958 # httpd 'zaps' the status_line if it doesn't match the status # as of 2.2.1 (not released) so 2.2.2 (released) my $code = 499; # not in HTTP/1.1 my $message = "FooBared"; my $res = GET "$location?$code=$message"; ok t_cmp $res->code, $code, "code"; ok t_cmp $res->message, $message, "code message"; ok t_cmp $res->content, "", "content"; } mod_perl-2.0.9/t/apr/0000755000104000010010000000000012540623203015006 5ustar AdministratorsNonemod_perl-2.0.9/t/apr/constants.t0000644000104000010010000000112312540623203017204 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use ExtUtils::testlib; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Const -compile => qw(:common POLLIN :filetype); use APR::Const qw(:hook); plan tests => 5; ok ! defined &POLLIN; ok t_cmp (APR::Const::SUCCESS, 0, 'APR::Const::SUCCESS'); ok t_cmp (APR::Const::POLLIN, 0x001, 'APR::Const::POLLIN'); ok t_cmp (HOOK_LAST, 20, 'HOOK_LAST'); ok t_cmp (APR::Const::FILETYPE_UNKFILE, 127, 'APR::UNKFILE'); mod_perl-2.0.9/t/apr/pool_lifetime.t0000644000104000010010000000114512540623203020023 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; Apache::TestRequest::user_agent(keep_alive => 1); plan tests => 2, need 'HTML::HeadParser'; my $module = 'TestAPR::pool_lifetime'; my $location = '/' . Apache::TestRequest::module2path($module); for (1..2) { my $expected = "Pong"; my $received = GET $location; ok t_cmp( $received->content, $expected, "Pong", ); } mod_perl-2.0.9/t/apr-ext/0000755000104000010010000000000012540623203015604 5ustar AdministratorsNonemod_perl-2.0.9/t/apr-ext/base64.t0000644000104000010010000000050012540623203017050 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::base64; plan tests => TestAPRlib::base64::num_of_tests(); TestAPRlib::base64::test(); mod_perl-2.0.9/t/apr-ext/brigade.t0000644000104000010010000000050312540623203017364 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::brigade; plan tests => TestAPRlib::brigade::num_of_tests(); TestAPRlib::brigade::test(); mod_perl-2.0.9/t/apr-ext/bucket.t0000644000104000010010000000050012540623203017241 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::bucket; plan tests => TestAPRlib::bucket::num_of_tests(); TestAPRlib::bucket::test(); mod_perl-2.0.9/t/apr-ext/date.t0000644000104000010010000000047212540623203016711 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::date; plan tests => TestAPRlib::date::num_of_tests(); TestAPRlib::date::test(); mod_perl-2.0.9/t/apr-ext/error.t0000644000104000010010000000047512540623203017130 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::error; plan tests => TestAPRlib::error::num_of_tests(); TestAPRlib::error::test(); mod_perl-2.0.9/t/apr-ext/finfo.t0000644000104000010010000000047512540623203017100 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::finfo; plan tests => TestAPRlib::finfo::num_of_tests(); TestAPRlib::finfo::test(); mod_perl-2.0.9/t/apr-ext/os.t0000644000104000010010000000046412540623203016416 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::os; plan tests => TestAPRlib::os::num_of_tests(); TestAPRlib::os::test(); mod_perl-2.0.9/t/apr-ext/pool.t0000644000104000010010000000047212540623203016745 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::pool; plan tests => TestAPRlib::pool::num_of_tests(); TestAPRlib::pool::test(); mod_perl-2.0.9/t/apr-ext/status.t0000644000104000010010000000050012540623203017307 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::status; plan tests => TestAPRlib::status::num_of_tests(); TestAPRlib::status::test(); mod_perl-2.0.9/t/apr-ext/string.t0000644000104000010010000000050012540623203017272 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::string; plan tests => TestAPRlib::string::num_of_tests(); TestAPRlib::string::test(); mod_perl-2.0.9/t/apr-ext/table.t0000644000104000010010000000047512540623203017066 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::table; plan tests => TestAPRlib::table::num_of_tests(); TestAPRlib::table::test(); mod_perl-2.0.9/t/apr-ext/threadmutex.t0000644000104000010010000000053512540623203020326 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::threadmutex; plan tests => TestAPRlib::threadmutex::num_of_tests(), need_threads; TestAPRlib::threadmutex::test(); mod_perl-2.0.9/t/apr-ext/threadrwlock.t0000644000104000010010000000054012540623203020461 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::threadrwlock; plan tests => TestAPRlib::threadrwlock::num_of_tests(), need_threads; TestAPRlib::threadrwlock::test(); mod_perl-2.0.9/t/apr-ext/uri.t0000644000104000010010000000046712540623203016577 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::uri; plan tests => TestAPRlib::uri::num_of_tests(); TestAPRlib::uri::test(); mod_perl-2.0.9/t/apr-ext/util.t0000644000104000010010000000047212540623203016751 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::util; plan tests => TestAPRlib::util::num_of_tests(); TestAPRlib::util::test(); mod_perl-2.0.9/t/apr-ext/uuid.t0000644000104000010010000000202112540623203016732 0ustar AdministratorsNone#!perl -T # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Build (); # XXX: only when apr-config is found APR will be linked against # libapr/libaprutil, probably need a more intuitive method for this # prerequisite # also need to check whether we build against the source tree, in # which case we APR.so won't be linked against libapr/libaprutil # In order to do this for all the apr-ext tests, could have # a wrapper around plan() that does a check like ####### # my $build = Apache2::Build->build_config; # # my $has_apr_config = $build->{apr_config_path} && # !$build->httpd_is_source_tree; # plan tests => TestAPRlib::uuid::num_of_tests(), # need {"the build couldn't find apr-config" => $has_apr_config}; ###### # that is called from some TestAPRlib::common. use TestAPRlib::uuid; plan tests => TestAPRlib::uuid::num_of_tests(); TestAPRlib::uuid::test(); mod_perl-2.0.9/t/compat/0000755000104000010010000000000012540623203015507 5ustar AdministratorsNonemod_perl-2.0.9/t/compat/conn_authen.t0000644000104000010010000000062112540623203020174 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 1, need need_lwp, need_auth, 'HTML::HeadParser'; my $location = "/TestCompat__conn_authen"; ok GET_OK $location, username => 'dougm', password => 'foo'; mod_perl-2.0.9/t/compat/request_body.t0000644000104000010010000000301112540623203020374 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 5; my $location = "/TestCompat__request_body"; # $r->send_http_header('text/plain'); { my @data = (test => 'content-type'); ok t_cmp( HEAD(query(@data))->content_type(), "text/plain", q{$r->send_http_header('text/plain')} ); } # $r->content { my @data = (test => 'content'); my $content = join '=', @data; ok t_cmp( POST_BODY($location, content => $content), "@data", q{$r->content via POST} ); } # $r->Apache2::args { my @data = (test => 'args'); ok t_cmp( GET_BODY(query(@data)), "@data", q{$r->Apache2::args} ); } # encoding/decoding { my %data = ( test => 'decoding', body => '%DC%DC+%EC%2E+%D6%D6+%D6%2F', ); ok t_cmp( GET_BODY(query(%data)), $data{body}, q{decoding} ); } # big POST { my %data = ( test => 'big_input', body => ('x' x 819_235), ); my $content = join '=', %data; ok t_cmp( POST_BODY($location, content => $content), length($data{body}), q{big POST} ); } ### helper subs ### sub query { my (%args) = (@_ % 2) ? %{+shift} : @_; "$location?" . join '&', map { "$_=$args{$_}" } keys %args; } mod_perl-2.0.9/t/compat/send_fd.t0000644000104000010010000000115112540623203017274 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use File::Spec::Functions qw(catfile); plan tests => 3, need 'HTML::HeadParser'; my $config = Apache::Test::config(); my $url = '/TestCompat__send_fd'; my $data = GET_BODY($url); ok $data; my $module = catfile Apache::Test::vars('serverroot'), 'response/TestCompat/send_fd.pm'; ok length($data) == -s $module; $data = GET_BODY("$url?noexist.txt"); ok $data =~ /Not Found/; mod_perl-2.0.9/t/conf/0000755000104000010010000000000012540623203015151 5ustar AdministratorsNonemod_perl-2.0.9/t/conf/extra.conf.in0000644000104000010010000000634412540623203017557 0ustar AdministratorsNone# needed to test $r->psignature ServerSignature On # The following tests require more than one interpreter during the # same request: # # perls Test # ----------- # 2 t/modules/apache_status # 2 t/filter/both_str_req_proxy # 2 t/modules/proxy # # the following tests will clone a new perl interpreter via # ithreads.pm regardless of how many interpreters mod_perl has: # # t/perl/ithreads # t/perl/ithreads2 # # therefore we need at most 2 interpreters, the missing one loading on # demand, but we start only with 1, so the startup is quick, # especially since we immediately restart. We also want MaxSpare to be # the same as Max, since we have more than one test that requires more # than one interpreter, so don't waste time to kill and start a new # one later -- keep it around once spawned # # Adjust PerlInterpMax and PerlInterpMaxSpare if the requirements change PerlInterpStart 1 PerlInterpMax 2 PerlInterpMinSpare 1 PerlInterpMaxSpare 2 # make sure that we test under Taint and warnings mode enabled PerlSwitches -wT PerlChildExitHandler ModPerl::Test::exit_handler PerlModule TestExit::FromPerlModule #for t/modules/include.t AddOutputFilter INCLUDES .shtml # #virtual include of a script that sets content type is # considered the same as #cmd by mod_include, # therefore can't use IncludesNOEXEC here Options Indexes FollowSymLinks Includes SetHandler perl-script Options +ExecCGI +IncludesNoExec PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders +GlobalRequest AddOutputFilter INCLUDES .spl # This should not be touched, since we're running with mod_perl 2 PerlModule Doesnt::Exist # # keep everything self-contained, to avoid problems with sandboxes # which break when things try to run off /tmp ScriptSock logs/cgisock SetEnv TMPDIR @t_logs@ # pass ld_library_path for non standard lib locations # [rt.cpan.org #66085] PassEnv LD_LIBRARY_PATH # # PerlSetVar StatusOptionsAll On # PerlSetVar StatusDumper On # PerlSetVar StatusPeek On # PerlSetVar StatusLexInfo On # PerlSetVar StatusDeparse On # PerlSetVar StatusDeparseOptions "-p -sC" PerlSetVar StatusTerse On # PerlSetVar StatusTerseSize On # PerlSetVar StatusTerseSizeMainSummary On SetHandler modperl PerlResponseHandler Apache2::Status # for TestApache::util PerlPassEnv LC_CTYPE PerlPassEnv LC_TIME # for TestCompat::apache_file PerlPassEnv TMPDIR PerlPassEnv TEMP # see t/filter/out_apache.t # this filter is on purpose configured outside the Location PerlSetOutputFilter INCLUDES Options +Includes mod_perl-2.0.9/t/conf/extra.last.conf.in0000644000177200010010000000702112540623203016611 0ustar SteveNonePerlModule Apache2::Module PerlPostConfigRequire @ServerRoot@/conf/post_config_startup.pl ### --------------------------------- ### use Apache::Test (); if (Apache::Test::have_module('mod_alias.c')) { push @Alias, ['/perl_sections', '@DocumentRoot@']; $Location{'/perl_sections'} = { 'PerlInitHandler' => 'ModPerl::Test::add_config', 'AuthType' => 'Basic', 'AuthName' => 'PerlSection', 'PerlAuthenHandler' => 'TestHooks::authen_basic', }; } #Test tied %Location use TestCommon::TiePerlSection (); tie %Location, 'TestCommon::TiePerlSection'; $Location{'/tied'} = 'test_tied'; $Apache2::PerlSections::Save = 1; $Location{'/perl_sections_saved'} = { 'AuthName' => 'PerlSection', }; #This is a comment $TestDirective::perl::comments="yes"; $TestDirective::perl::PACKAGE = __PACKAGE__; $Apache2::PerlSections::Save = 1; $TestDirective::perl::filename = __FILE__; $TestDirective::perl::dollar_zero = $0; $TestDirective::perl::line = __LINE__; #Handle re-entrant sections use File::Spec; my $file = File::Spec->catfile('@ServerRoot@', 'conf', 'perlsection.conf'); open my $fh, ">$file" or die "Can't open $file: $!"; print $fh join "\n", ('', '$TestDirective::perl::Included++;', ''); close $fh; $Include = $file; #Deprecated access to Apache2::ReadConfig:: still works use Apache::Test (); if (Apache::Test::have_module('mod_alias.c')) { push @Apache2::ReadConfig::Alias, ['/perl_sections_readconfig', '@DocumentRoot@']; $Apache2::ReadConfig::Location{'/perl_sections_readconfig'} = { 'PerlInitHandler' => 'ModPerl::Test::add_config', 'AuthType' => 'Basic', 'AuthName' => 'PerlSection', 'PerlAuthenHandler' => 'TestHooks::authen_basic', }; } $TestDirective::perl::base_server = Apache2::PerlSections->server; # make sure that these are set at the earliest possible time die '$ENV{MOD_PERL} not set!' unless $ENV{MOD_PERL}; die '$ENV{MOD_PERL_API_VERSION} not set!' unless $ENV{MOD_PERL_API_VERSION} == 2; $TestDirective::perl::vhost_server = Apache2::PerlSections->server; ### --------------------------------- ### Perl $TestDirective::perl::worked="yes"; ### --------------------------------- ### =pod The following line is not seen by Apache PerlSetVar TestDirective__pod_hidden whatever =over apache PerlSetVar TestDirective__pod_over_worked yes =back This is some more pod =cut PerlSetVar TestDirective__pod_cut_worked yes #This used to trigger a segfault on startup #See http://thread.gmane.org/gmane.comp.apache.mod-perl/22750 PerlSwitches +inherit PerlOptions +Parent Perl 1 #Single-line $PerlConfig if (Apache::Test::have_module('mod_alias.c')) { $PerlConfig = "Alias /perl_sections_perlconfig_scalar @DocumentRoot@"; } #Multi-line $PerlConfig if (Apache::Test::have_module('mod_alias.c')) { $PerlConfig = "Alias /perl_sections_perlconfig_scalar1 @DocumentRoot@ Alias /perl_sections_perlconfig_scalar2 @DocumentRoot@ "; } #@PerlConfig if (Apache::Test::have_module('mod_alias.c')) { @PerlConfig = ("Alias /perl_sections_perlconfig_array1 @DocumentRoot@", "Alias /perl_sections_perlconfig_array2 @DocumentRoot@", ); } mod_perl-2.0.9/t/conf/modperl_extra.pl0000644000104000010010000001076512540623203020364 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- ########################################################## ### IMPORTANT: only things that must be run absolutely ### ### during the config phase should be in this file ### ########################################################## # # On the 2nd pass, during server-internal restart, none of the code # running from this file (config phase) will be able to log any STDERR # messages. This is because Apache redirects STDERR to /dev/null until # the open_logs phase. That means that any of the code fails, the # error message will be lost (but it should have failed on the 1st # pass, when STDERR goes to the console and any error messages are # properly logged). Therefore avoid putting any code here (unless # there is no other way) and instead put all the code to be run at the # server startup into post_config_startup.pl. when the latter is run, # STDERR is sent to $ErrorLog. # use strict; use warnings FATAL => 'all'; die '$ENV{MOD_PERL} not set!' unless $ENV{MOD_PERL}; die '$ENV{MOD_PERL_API_VERSION} not set!' unless $ENV{MOD_PERL_API_VERSION} == 2; use File::Spec::Functions qw(canonpath catdir); use Apache2::ServerUtil (); use Apache2::ServerRec (); use Apache2::Process (); use Apache2::Log (); use Apache2::Const -compile => ':common'; reorg_INC(); startup_info(); test_add_config(); test_add_version_component(); test_hooks_startup(); test_modperl_env(); ### only subs below this line ### # need to run from config phase, since we want to adjust @INC as early # as possible sub reorg_INC { # after Apache2 has pushed blib and core dirs including Apache2 on # top reorg @INC to have first devel libs, then blib libs, and # only then perl core libs my $pool = Apache2::ServerUtil->server->process->pool; my $project_root = canonpath Apache2::ServerUtil::server_root_relative($pool, ".."); my (@a, @b, @c); for (@INC) { if (m|^\Q$project_root\E|) { m|blib| ? push @b, $_ : push @a, $_; } else { push @c, $_; } } @INC = (@a, @b, @c); } # this can be run from post_config_startup.pl, but then it'll do the # logging twice, so in this case it's actually good to have this code # run during config phase, so it's logged only once (even though it's # run the second time, but STDERR == /dev/null) sub startup_info { my $ap_mods = scalar grep { /^Apache2/ } keys %INC; my $apr_mods = scalar grep { /^APR/ } keys %INC; Apache2::Log->info("$ap_mods Apache2:: modules loaded"); Apache2::ServerRec->log->info("$apr_mods APR:: modules loaded"); my $server = Apache2::ServerUtil->server; my $vhosts = 0; for (my $s = $server->next; $s; $s = $s->next) { $vhosts++; } $server->log->info("base server + $vhosts vhosts ready to run tests"); } # need to run from config phase, since it changes server config sub test_add_config { # testing $s->add_config() my $conf = <<'EOC'; # must use PerlModule here to check for segfaults PerlModule Apache::TestHandler SetHandler perl-script PerlResponseHandler Apache::TestHandler::ok1 EOC Apache2::ServerUtil->server->add_config([split /\n/, $conf]); # test a directive that triggers an early startup, so we get an # attempt to use perl's mip early Apache2::ServerUtil->server->add_config(['', '1;', '']); } # need to run from config phase, since it registers PerlPostConfigHandler sub test_add_version_component { Apache2::ServerUtil->server->push_handlers( PerlPostConfigHandler => \&add_my_version); sub add_my_version { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; $s->add_version_component("world domination series/2.0"); return Apache2::Const::OK; } } # cleanup files for TestHooks::startup which can't be done from the # test itself because the files are created at the server startup and # the test needing these files may run more than once (t/SMOKE) # # we need to run it at config phase since we need to cleanup before # the open_logs phase sub test_hooks_startup { require Apache::Test; my $dir = catdir Apache::Test::vars('documentroot'), qw(hooks startup); for (<$dir/*>) { my $file = ($_ =~ /(.*(?:open_logs|post_config)-\d+)/); unlink $file; } } sub test_modperl_env { # see t/response/TestModperl/env.pm $ENV{MODPERL_EXTRA_PL} = __FILE__; } 1; mod_perl-2.0.9/t/conf/post_config_startup.pl0000644000104000010010000001040412540623203021601 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- ########################################################## ### this file contains code that should be run on the ### ### server startup but not during the config phase ### ########################################################## use strict; use warnings FATAL => 'all'; use Socket (); # test DynaLoader vs. XSLoader workaround for 5.6.x use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Process (); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Connection (); use Apache2::Log (); use APR::Table (); use APR::Pool (); use ModPerl::Util (); #for CORE::GLOBAL::exit use Apache2::Const -compile => ':common'; END { warn "END in modperl_extra.pl, pid=$$\n"; } test_apache_resource(); test_apache_status(); test_loglevel(); test_perl_ithreads(); test_server_shutdown_cleanup_register(); test_method_obj(); ### only subs below this line ### sub test_apache_resource { ### Apache2::Resource tests # load first for the menu require Apache2::Status; # uncomment for local tests #$ENV{PERL_RLIMIT_DEFAULTS} = 1; #$Apache2::Resource::Debug = 1; # requires optional BSD::Resource return unless eval { require BSD::Resource }; require Apache2::Resource; } sub test_apache_status { ### Apache2::Status tests require Apache2::Status; require Apache2::Module; Apache2::Status->menu_item( 'test_menu' => "Test Menu Entry", sub { my ($r) = @_; return ["This is just a test entry"]; } ) if Apache2::Module::loaded('Apache2::Status'); } # test startup loglevel setting (under threaded mpms loglevel can be # changed only before threads are started) so here we test whether we # can still set it after restart sub test_loglevel { use Apache2::Const -compile => 'LOG_INFO'; my $s = Apache2::ServerUtil->server; my $oldloglevel = $s->loglevel(Apache2::Const::LOG_INFO); # restore $s->loglevel($oldloglevel); } sub test_perl_ithreads { # this is needed for TestPerl::ithreads # one should be able to boot ithreads at the server startup and # then access the ithreads setup at run-time when a perl # interpreter is running on a different native threads (testing # that perl interpreters and ithreads aren't related to the native # threads they are running on). This should work starting from # perl-5.8.1 and higher. use Config; if ($] >= 5.008001 && $Config{useithreads}) { eval { require threads; "threads"->import() }; } } sub test_server_shutdown_cleanup_register { Apache2::ServerUtil::server_shutdown_cleanup_register sub { warn <<'EOF'; *** done with server_shutdown_cleanup_register *** ******************************************************************************** EOF }; Apache2::ServerUtil::server_shutdown_cleanup_register sub { die "testing server_shutdown_cleanup_register\n"; }; Apache2::ServerUtil::server_shutdown_cleanup_register sub { warn <<'EOF'; ******************************************************************************** *** This is a test for Apache2::ServerUtil::server_shutdown_cleanup_register *** *** Following a line consisting only of * characters there should be a line *** *** containing *** *** "cleanup died: testing server_shutdown_cleanup_register". *** *** The next line should then read *** *** "done with server_shutdown_cleanup_register" *** ******************************************************************************** EOF }; } sub ModPerl::Test::exit_handler { my ($p, $s) = @_; $s->log->info("Child process pid=$$ is exiting"); Apache2::Const::OK; } sub test_method_obj { # see t/modperl/methodobj require TestModperl::methodobj; $TestModperl::MethodObj = TestModperl::methodobj->new; } sub ModPerl::Test::add_config { my $r = shift; #test adding config at request time $r->add_config(['require valid-user']); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/directive/0000755000104000010010000000000012540623203016202 5ustar AdministratorsNonemod_perl-2.0.9/t/directive/perl.t0000644000104000010010000000137112540623203017333 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 8, need need_auth, 'mod_alias.c', 'HTML::HeadParser'; #so we don't have to require lwp my @auth = (Authorization => 'Basic ZG91Z206Zm9v'); #dougm:foo foreach my $location ("/perl_sections/index.html", "/perl_sections_readconfig/index.html") { sok { ! GET_OK $location; }; sok { my $rc = GET_RC $location; $rc == 401; }; sok { GET_OK $location, @auth; }; sok { ! GET_OK $location, $auth[0], $auth[1] . 'bogus'; }; } mod_perl-2.0.9/t/directive/perlcleanuphandler.t0000644000104000010010000000131012540623203022232 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest 'GET_BODY'; plan tests => 3, need_lwp; my $module = 'TestDirective::perlcleanuphandler'; Apache::TestRequest::user_agent(reset => 1, keep_alive=>1); sub u {Apache::TestRequest::module2url($module, {path=>$_[0]})} t_debug("connecting to ".u('')); ok t_cmp GET_BODY(u('/get?incr')), 'UNDEF', 'before increment'; ok t_cmp GET_BODY(u('/get')), '1', 'incremented'; (undef)=GET_BODY(u('/index.html?incr')); ok t_cmp GET_BODY(u('/get')), '2', 'incremented again'; mod_perl-2.0.9/t/directive/perlloadmodule2.t0000644000104000010010000000153212540623203021462 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $url = "/TestDirective__perlloadmodule2"; plan tests => 3; { my $location = "$url?srv"; my $expected = "srv: one two"; my $received = GET_BODY $location; ok t_cmp($received, $expected, "access server settings"); } { my $location = "$url?"; my $expected = "dir: one two three four"; my $received = GET_BODY $location; ok t_cmp($received, $expected, "server/dir merge"); } { my $location = "$url/subdir"; my $expected = "dir: one two three four five six"; my $received = GET_BODY $location; ok t_cmp($received, $expected, "server/dir/subdir merge"); } mod_perl-2.0.9/t/directive/perlloadmodule3.t0000644000104000010010000000462612540623203021472 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = "TestDirective::perlloadmodule3"; my $config = Apache::Test::config(); my $base_hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); # XXX: probably a good idea to split into more sub-tests, that test # smaller portions of information, but requires a more elaborate # logic. Alternatively could use diff($expected, $received). plan tests => 3; t_debug("connecting to $base_hostport"); { my $expected = < 'all'; use Apache::TestRequest; use Apache::Test; my $module = "TestDirective::perlloadmodule4"; my $config = Apache::Test::config(); Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); print GET_BODY_ASSERT "http://$hostport/$path"; mod_perl-2.0.9/t/directive/perlloadmodule5.t0000644000104000010010000000100112540623203021454 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest; use Apache::Test; my $module = "TestDirective::perlloadmodule5"; my $config = Apache::Test::config(); Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); print GET_BODY_ASSERT "http://$hostport/$path"; mod_perl-2.0.9/t/directive/perlloadmodule6.t0000644000104000010010000000100112540623203021455 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest; use Apache::Test; my $module = "TestDirective::perlloadmodule6"; my $config = Apache::Test::config(); Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); print GET_BODY_ASSERT "http://$hostport/$path"; mod_perl-2.0.9/t/directive/perlmodule.t0000644000104000010010000000136512540623203020544 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # this test tests PerlRequire configuration directive ######################################################################## use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestDirective::perlmodule'; plan tests => 1; Apache::TestRequest::module($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); t_debug("connecting to $hostport"); ok t_cmp(GET_BODY("/$path"), $module, "testing PerlModule in $module"); mod_perl-2.0.9/t/directive/perlrequire.t0000644000104000010010000000204712540623203020731 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # this test tests PerlRequire configuration directive ######################################################################## use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $config = Apache::Test::config(); my $path = Apache::TestRequest::module2path('TestDirective::perlrequire'); my %checks = ( 'default' => 'PerlRequired by Parent', 'TestDirective::perlrequire' => 'PerlRequired by VirtualHost', ); delete $checks{'TestDirective::perlrequire'} unless have_perl 'ithreads'; plan tests => scalar keys %checks; for my $module (sort keys %checks) { Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); ok t_cmp(GET_BODY("http://$hostport/$path"), $checks{$module}, "testing PerlRequire in $module"); } mod_perl-2.0.9/t/directive/setupenv.t0000644000104000010010000000230512540623203020240 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 3; my $location = '/TestDirective__setupenv'; my $env = GET_BODY $location; ok $env; my %env; for my $line (split /\n/, $env) { next unless $line =~ /=/; my ($key, $val) = split /=/, $line, 2; $env{$key} = $val || ''; } ok t_cmp $env{REQUEST_URI}, $location, "testing REQUEST_URI"; { # on Win32, some user environment variables, like HOME, may be # passed through (via Apache?) if set, while system environment # variables are not. so try to find an existing shell variable # (that is not passed by Apache) and use it in the test to make # sure mod_perl doesn't see it my $var; for (qw(SHELL USER OS)) { $var = $_, last if exists $ENV{$_}; } if (defined $var) { ok t_cmp $env{$var}, undef, "env var $var=$ENV{$var} is ". "set in shell, but shouldn't be seen inside mod_perl"; } else { skip "couldn't find a suitable env var to test against", 0; } } mod_perl-2.0.9/t/error/0000755000104000010010000000000012540623203015355 5ustar AdministratorsNonemod_perl-2.0.9/t/error/runtime.t0000644000104000010010000000205512540623203017227 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $location = "/TestError__runtime"; my @untrapped = qw(plain_mp_error plain_non_mp_error die_hook_confess_mp_error die_hook_confess_non_mp_error die_hook_custom_mp_error die_hook_custom_non_mp_error); my @trapped = qw(eval_block_mp_error eval_block_non_mp_error eval_string_mp_error eval_block_non_error overload_test); plan tests => @untrapped + @trapped; for my $type (@untrapped) { my $res = GET("$location?$type"); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 error on $type exception", ); } for my $type (@trapped) { my $body = GET_BODY("$location?$type"); ok t_cmp( $body, "ok $type", "200 on $type exception", ); } mod_perl-2.0.9/t/error/syntax.t0000644000104000010010000000072412540623203017073 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = "/TestError__syntax"; t_client_log_error_is_expected(); my $res = GET($location); #t_debug($res->content); ok t_cmp( $res->code, 500, "500 error on syntax error", ); mod_perl-2.0.9/t/filter/0000755000104000010010000000000012540623204015512 5ustar AdministratorsNonemod_perl-2.0.9/t/filter/both_str_con_add.t0000644000104000010010000000135112540623203021171 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(MODPERL 2.0 RULES); # blocking socket bug fixed in 2.0.52 my $ok = $^O !~ /^(Open|Net)BSD$/i || need_min_apache_version('2.0.52'); plan tests => 1 + @test_strings, $ok; my $module = "TestFilter::both_str_con_add"; my $socket = Apache::TestRequest::vhost_socket($module); ok $socket; for my $str (@test_strings) { print $socket "$str\n"; chomp(my $reply = <$socket>||''); $str = lc $str; $str =~ s/modperl/mod_perl/; ok t_cmp($reply, $str); } mod_perl-2.0.9/t/filter/both_str_native_remove.t0000644000104000010010000000313612540623203022450 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 8, need 'deflate', 'include', need_min_module_version("Compress::Zlib", "1.09"); require Compress::Zlib; my $base = '/TestFilter__both_str_native_remove'; # 1. check if DEFLATE input and INCLUDES output filter work { my $location = $base; my $received = POST_BODY $location, content => Compress::Zlib::memGzip('gzipped text'), 'Content-Encoding' => "gzip"; ok t_cmp $received, qr/xSSI OK/, "INCLUDES filter"; ok t_cmp $received, qr/content: gzipped text/, "DEFLATE filter"; } # 2. check if DEFLATE input and INCLUDES output filter can be removed { my $location = "$base?remove"; my $received = POST_BODY $location, content => 'plain text'; ok t_cmp $received, qr/input1: [\w,]+deflate/, "DEFLATE filter is present"; ok !t_cmp $received, qr/input2: [\w,]+deflate/, "DEFLATE filter is removed"; ok t_cmp $received, qr/content: plain text/, "DEFLATE filter wasn't invoked"; ok t_cmp $received, qr/output1: modperl_request_output,includes,modperl_request_output,/, "INCLUDES filter is present"; ok t_cmp $received, qr/output2: modperl_request_output,(?!includes)/, "INCLUDES filter is removed"; ok t_cmp $received, qr/xx/, "INCLUDES filter wasn't invoked"; } mod_perl-2.0.9/t/filter/both_str_req_add.t0000644000104000010010000000124012540623203021176 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $data = join ' ', 'A'..'Z', 0..9; my $expected = lc $data; # that's what the input filter does $expected =~ s/\s+//g; # that's what the output filter does $expected .= "end"; # that's what the anon output filter does my $location = '/TestFilter__both_str_req_add'; my $response = POST_BODY $location, content => $data; ok t_cmp($response, $expected, "lc input and reverse output filters"); mod_perl-2.0.9/t/filter/both_str_req_mix.t0000644000104000010010000000217312540623203021251 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, need 'deflate', 'include', need_min_module_version("Compress::Zlib", "1.09"); require Compress::Zlib; my $location = '/TestFilter__both_str_req_mix'; my $request_orig = ''; my $response_orig = 'This is a clear text'; # gzip already produces data in a network order, so no extra # transformation seem to be necessary my $content = Compress::Zlib::memGzip($request_orig); my $response_raw = POST_BODY $location, content => $content, 'Accept-Encoding' => "gzip", 'Content-Encoding' => "gzip"; #t_debug($response_raw); my $response_clear = Compress::Zlib::memGunzip($response_raw); #t_debug($response_clear); my $expected = $response_orig; (my $received = $response_clear) =~ s{\r?\n$}{}; ok t_cmp($received, $expected, "mixing httpd and mod_perl filters, while preserving order"); mod_perl-2.0.9/t/filter/both_str_req_proxy.t0000644000104000010010000000140012540623203021625 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; my @modules = qw(mod_proxy proxy_http.c); push @modules, 'mod_access_compat.c' if have_min_apache_version("2.4.0"); plan tests => 1, need need_module(@modules), need_access; my $data = join ' ', 'A'..'Z', 0..9; my $expected = lc $data; # that's what the input filter does $expected =~ s/\s+//g; # that's what the output filter does my $location = '/TestFilter__both_str_req_proxy/foo'; my $response = POST_BODY $location, content => $data; ok t_cmp($response, $expected, "lc input and reverse output filters"); mod_perl-2.0.9/t/filter/in_autoload.t0000644000104000010010000000075112540623203020177 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_autoload'; my $data = "[Foo BaR] "; my $expected = lc $data; my $received = POST_BODY $location, content => $data; ok t_cmp($received, $expected, "input stream filter lc autoloaded") mod_perl-2.0.9/t/filter/in_bbs_body.t0000644000104000010010000000063112540623203020147 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest; my $location = '/TestFilter__in_bbs_body'; print GET_BODY_ASSERT $location; for my $x (2..3) { my $data = scalar reverse "ok $x\n"; print POST_BODY_ASSERT $location, content => $data; } mod_perl-2.0.9/t/filter/in_bbs_consume.t0000644000104000010010000000127112540623203020664 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_bbs_consume'; # send a message bigger than 8k, so to make sure that the input filter # will get more than one bucket brigade with data. my $length = 40 * 1024 + 7; # ~40k+ (~6 incoming bucket brigades) my $expected = join '', 'a'..'z'; my $data = $expected . "x" x $length; my $received = POST_BODY $location, content => $data; ok t_cmp($received, $expected, "input bbs filter full consume") mod_perl-2.0.9/t/filter/in_bbs_inject_header.t0000644000104000010010000000362412540623203022003 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestFilter::in_bbs_inject_header'; my $location = "/" . Apache::TestRequest::module2path($module); Apache::TestRequest::scheme('http'); #force http for t/TEST -ssl Apache::TestRequest::module($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); my $content = "This body shouldn't be seen by the filter"; my $header1_key = 'X-My-Protocol'; my $header1_val = 'POST-IT'; my %headers = ( 'X-Extra-Header2' => 'Value 2', 'X-Extra-Header3' => 'Value 3', ); my $keep_alive_times = 4; my $non_keep_alive_times = 4; my $tests = 2 + keys %headers; my $times = $non_keep_alive_times + $keep_alive_times + 1; plan tests => $tests * $times; # try non-keepalive conn validate(POST($location, content => $content)) for 1..$non_keep_alive_times; # try keepalive conns Apache::TestRequest::user_agent(reset => 1, keep_alive => 1); validate(POST($location, content => $content)) for 1..$keep_alive_times; # try non-keepalive conn Apache::TestRequest::user_agent(reset => 1, keep_alive => 0); validate(POST($location, content => $content)); # 4 sub-tests sub validate { my $res = shift; die join "\n", "request has failed (the response code was: " . $res->code . ")", "see t/logs/error_log for more details\n" unless $res->is_success; ok t_cmp($res->content, $content, "body"); ok t_cmp($res->header($header1_key), $header1_val, "injected header $header1_key"); for my $key (sort keys %headers) { ok t_cmp($res->header($key), $headers{$key}, "injected header $key"); } } mod_perl-2.0.9/t/filter/in_bbs_msg.t0000644000104000010010000000104612540623203020001 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::Test (); use Apache::TestUtil; use Apache::TestRequest 'GET_BODY_ASSERT'; my $module = 'TestFilter::in_bbs_msg'; Apache::TestRequest::scheme('http'); #force http for t/TEST -ssl Apache::TestRequest::module($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); print GET_BODY_ASSERT "/input_filter.html"; mod_perl-2.0.9/t/filter/in_bbs_underrun.t0000644000104000010010000000127512540623203021061 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_bbs_underrun'; # send a message of about 40k, so to make sure that the input filter # will get several bucket brigades with data (about 8k/brigade) my $length = 40 * 1024 + 7; # ~40k+ (~6 incoming bucket brigades) my $data = "x" x $length; my $received = POST_BODY $location, content => $data; my $expected = "read $length chars"; ok t_cmp($received, $expected, "input bbs filter underrun test") mod_perl-2.0.9/t/filter/in_error.t0000644000104000010010000000065112540623203017517 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_error'; my $res = POST $location, content => 'foo'; ok t_cmp($res->code, 500, "an error in a filter should cause 500"); mod_perl-2.0.9/t/filter/in_init_basic.t0000644000104000010010000000111412540623203020465 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $content = "content ok\n"; # older httpds may run the input request filter twice my $expected = join '', $content, "init 1\n", "run [12]\n"; my $location = '/TestFilter__in_init_basic'; my $response = POST_BODY $location, content => $content; ok t_cmp($response, qr/$expected/, "test filter init functionality"); mod_perl-2.0.9/t/filter/in_str_bin_data.t0000644000104000010010000000141712540623203021020 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 4; my $base = "/TestFilter__in_str_bin_data"; my @locations = map {$base . $_ } ('', '_filter'); my $expected = "123\001456\000789"; # test the binary data read/print w/ and w/o pass through filter for my $location (@locations) { my $received = POST_BODY_ASSERT $location, content => $expected; ok t_cmp(length($received), length($expected), "$location binary response length"); ok t_cmp($received, $expected, "$location binary response data"); } mod_perl-2.0.9/t/filter/in_str_consume.t0000644000104000010010000000117512540623203020731 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # see the explanations in in_str_consume.pm use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_str_consume'; my $data = "*" x 80000; # about 78K => ~10 bbs my $expected = 105; t_debug "sent " . length($data) . "B, expecting ${expected}B to make through"; my $received = POST_BODY $location, content => $data; ok t_cmp($received, $expected, "input stream filter partial consume") mod_perl-2.0.9/t/filter/in_str_declined.t0000644000104000010010000000060212540623204021022 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest 'POST_BODY_ASSERT';; my $location = '/TestFilter__in_str_declined'; my $chunk = "1234567890"; my $data = $chunk x 2000; print POST_BODY_ASSERT $location, content => $data; mod_perl-2.0.9/t/filter/in_str_declined_read.t0000644000104000010010000000060712540623204022022 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest 'POST_BODY_ASSERT';; my $location = '/TestFilter__in_str_declined_read'; my $chunk = "1234567890"; my $data = $chunk x 2000; print POST_BODY_ASSERT $location, content => $data; mod_perl-2.0.9/t/filter/in_str_lc.t0000644000104000010010000000076612540623204017664 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_str_lc'; my $chunk = "[Foo BaR] "; my $data = $chunk x 250; my $expected = lc $data; my $received = POST_BODY $location, content => $data; ok t_cmp($received, $expected, "input stream filter lc") mod_perl-2.0.9/t/filter/in_str_msg.t0000644000104000010010000000110012540623204020033 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::Test (); use Apache::TestUtil; use Apache::TestRequest 'POST_BODY_ASSERT'; my $module = 'TestFilter::in_str_msg'; Apache::TestRequest::scheme('http'); #force http for t/TEST -ssl Apache::TestRequest::module($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); print POST_BODY_ASSERT "/input_filter.html", content => "upcase me"; mod_perl-2.0.9/t/filter/in_str_sandwich.t0000644000104000010010000000075512540623204021064 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = '/TestFilter__in_str_sandwich'; my $expected = join "\n", qw(HEADER BODY TAIL), ''; my $received = POST_BODY $location, content => "BODY\n"; ok t_cmp($received, $expected, "input stream filter sandwich") mod_perl-2.0.9/t/filter/out_apache.t0000644000104000010010000000236312540623204020013 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # test the situation where a native apache response filter is # configured outside the block with PerlSet*Filter # directive. In this case we need to make sure that mod_perl doesn't # try to add it as connection filter # see the server side config in t/conf/extra.conf.in use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest 'GET_BODY_ASSERT'; use TestCommon::LogDiff; use File::Spec::Functions qw(catfile); my $path = catfile Apache::Test::vars('serverroot'), qw(logs error_log); plan tests => 2, need 'include', 'HTML::HeadParser'; my $module = 'filter_out_apache'; my $config = Apache::Test::config(); Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); my $logdiff = TestCommon::LogDiff->new($path); my $expected = qr/welcome to/; my $response = GET_BODY_ASSERT "http://$hostport/"; ok t_cmp $response, qr/$expected/, "success"; ok !t_cmp $logdiff->diff, qr/content filter was added without a request: includes/, "shouldn't [error] complain in error_log"; mod_perl-2.0.9/t/filter/out_bbs_ctx.t0000644000104000010010000000142412540623204020213 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $blocks = 33; my $invoked = 34; # 33 bb made of data and 1 flush bucket (unbuffered print) # 1 bb with EOS bucket my $sig = join "\n", "received $blocks complete blocks", "filter invoked $invoked times\n"; my $data = "#" x $blocks . "x" x $blocks; my $expected = join "\n", $data, $sig; { # test the filtering of the mod_perl response handler my $location = '/TestFilter__out_bbs_ctx'; my $response = GET_BODY $location; ok t_cmp($response, $expected, "context filter"); } mod_perl-2.0.9/t/filter/out_bbs_filebucket.t0000644000104000010010000000222712540623204021534 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catdir catfile); my $url = '/TestFilter__out_bbs_filebucket'; my $dir = catdir Apache::Test::vars('documentroot'), qw(filter); my @sizes = qw(1 100 500 1000 5000); plan tests => 2 * scalar @sizes; for my $size (@sizes) { my ($file, $data) = write_file($size); my $received = GET_BODY "$url?$file"; my $received_size = length $received; my $expected_size = $size * 1024; ok t_cmp length($received), length($data), "length"; ok $received && $received eq uc($data); unlink $file; } sub write_file { my $size = shift; my $data = "abcd" x ($size * 256); my $file = catfile $dir, "data_${size}k.txt"; open my $fh, ">$file" or die "can't open $file: $!"; # need binmode on Win32 so as not to strip \r, which # are included when sending with sendfile(). binmode $fh; print $fh $data; close $fh; return ($file, $data); } mod_perl-2.0.9/t/filter/out_init_basic.t0000644000104000010010000000117012540623204020671 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $content = "content ok\n"; my $expected = join '', "init 1\n", "run 1\n", $content, "run 2\n"; # newer Apache versions may make yet another call, so you will see # "run 3\n" as well. my $location = '/TestFilter__out_init_basic'; my $response = POST_BODY $location, content => $content; ok t_cmp($response, qr/^$expected/, "test filter init functionality"); mod_perl-2.0.9/t/filter/out_str_buffer.t0000644000104000010010000000126112540623204020727 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 2; my $sep = "-0-"; my $data = join $sep, "aa" .. "zz"; (my $expected = $data) =~ s/$sep//g; my $expected_len = length $expected; my $location = '/TestFilter__out_str_buffer'; my $res = POST $location, content => $data; #t_debug $res->as_string; my $received_len = $res->header('Content-Length') || 0; ok t_cmp $received_len, $expected_len, "Content-Length header"; ok t_cmp $res->content, $expected, "filtered data"; mod_perl-2.0.9/t/filter/out_str_ctx.t0000644000104000010010000000152512540623204020257 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $blocks = 33; my $invoked = 67; # 33 bb made of data and 1 flush bucket (unbuffered print) # 33 bb made of 1 flush bucket (rflush) # 1 bb with EOS bucket my $sig = join "\n", "received $blocks complete blocks", "filter invoked $invoked times\n"; my $data = "#" x $blocks . "x" x $blocks; my $expected = join "\n", $data, $sig; { # test the filtering of the mod_perl response handler my $location = '/TestFilter__out_str_ctx'; my $response = GET_BODY $location; ok t_cmp($response, $expected, "context stream filter"); } mod_perl-2.0.9/t/filter/out_str_declined.t0000644000104000010010000000074012540623204021226 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $expected = 11; # 10 flushes and 1 EOS bb my $location = '/TestFilter__out_str_declined'; my $response = GET_BODY $location; ok t_cmp($response, $expected, "an output filter handler returning DECLINED"); mod_perl-2.0.9/t/filter/out_str_lc.t0000644000104000010010000000054312540623204020056 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 1, need 'mod_alias'; my $location = "/top_dir/Makefile"; my $str = GET_BODY $location; ok $str !~ /[A-Z]/; mod_perl-2.0.9/t/filter/out_str_remove.t0000644000104000010010000000070012540623204020750 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $expected = "F_O_O_b_a_r_"; my $location = '/TestFilter__out_str_remove'; my $response = GET_BODY $location; ok t_cmp($response, $expected, "a filter that removes itself"); mod_perl-2.0.9/t/filter/out_str_req_eos.t0000644000104000010010000000115012540623204021110 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, ['include']; my $location = '/TestFilter__out_str_req_eos'; my $content = 'BODY'; my $prefix = 'PREFIX_'; my $suffix = '_SUFFIX'; my $expected = join '', $prefix, $content, $suffix; my $received = POST_BODY $location, content => $content; ok t_cmp($received, $expected, "testing the EOS bucket forwarding through the mp filters chains"); mod_perl-2.0.9/t/filter/out_str_req_mix.t0000644000104000010010000000117012540623204021121 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, ['include']; my $location = '/TestFilter__out_str_req_mix'; my $content = ''; my $expected = 'This is a clear text'; my $received = POST_BODY $location, content => $content; $received =~ s{\r?\n$}{}; ok t_cmp($expected, $received, "mixing output httpd and mod_perl filters, while preserving order"); mod_perl-2.0.9/t/filter/out_str_reverse.t0000644000104000010010000000201112540623204021123 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 2; my @data = (join('', 'a'..'z'), join('', 0..9)); my $reversed_data = join '', map { scalar(reverse $_) . "\n" } @data; my $normal_data = join '', map { $_ . "\n" } @data; #t_debug($reversed_data); my $sig = "Reversed by mod_perl 2.0\n"; my $expected = $normal_data . $sig; { # test the filtering of the mod_perl response handler my $location = '/TestFilter__out_str_reverse'; my $response = POST_BODY $location, content => $reversed_data; ok t_cmp($response, $expected, "reverse filter"); } { # test the filtering of the non-mod_perl response handler (file) my $location = '/filter/reverse.txt'; my $response = GET_BODY $location; $response =~ s/\r//g; ok t_cmp($response, $expected, "reverse filter"); } mod_perl-2.0.9/t/filter/out_str_subreq_default.t0000644000104000010010000000151712540623204022467 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache::TestConfig (); plan tests => 1, need 'mod_alias'; my $location = '/TestFilter__out_str_subreq_default'; my $content1 = "content\n"; my $content2 = "more content\n"; my $filter = "filter\n"; my $subrequest = "default-handler subrequest\n"; my $expected = join '', $content1, $subrequest, $content2, $filter; my $received = GET_BODY $location; # Win32 and Cygwin fix for line endings $received =~ s{\r}{}g if Apache::TestConfig::WIN32 || Apache::TestConfig::CYGWIN; ok t_cmp($received, $expected, "testing filter-originated lookup_uri() call to core served URI"); mod_perl-2.0.9/t/filter/out_str_subreq_modperl.t0000644000104000010010000000124312540623204022501 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1; my $location = '/TestFilter__out_str_subreq_modperl'; my $content1 = "content\n"; my $content2 = "more content\n"; my $filter = "filter\n"; my $subrequest = "modperl subrequest\n"; my $expected = join '', $content1, $subrequest, $content2, $filter; my $received = GET_BODY $location; ok t_cmp($received, $expected, "testing filter-originated lookup_uri() call to modperl-served URI"); mod_perl-2.0.9/t/filter/TestFilter/0000755000104000010010000000000012540623204017577 5ustar AdministratorsNonemod_perl-2.0.9/t/filter/TestFilter/both_str_con_add.pm0000644000104000010010000000447012540623204023435 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::both_str_con_add; # insert an input filter which lowers the case of the data # insert an output filter which adjusts s/modperl/mod_perl/ # see also TestFilter::echo_filter use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Bucket (); use APR::Brigade (); use APR::Error (); use APR::Socket; use base qw(Apache2::Filter); use APR::Const -compile => qw(SUCCESS EOF SO_NONBLOCK); use Apache2::Const -compile => qw(OK MODE_GETLINE); sub pre_connection { my Apache2::Connection $c = shift; $c->add_input_filter(\&in_filter); $c->add_output_filter(\&out_filter); return Apache2::Const::OK; } sub in_filter : FilterConnectionHandler { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $filter->print(lc $buffer); } # test that $filter->ctx works here $filter->ctx(1); Apache2::Const::OK; } sub out_filter : FilterConnectionHandler { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $buffer =~ s/modperl/mod_perl/; $filter->print($buffer); } Apache2::Const::OK; } sub handler { my Apache2::Connection $c = shift; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); for (;;) { $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if $bb->is_empty; my $b = APR::Bucket::flush_create($c->bucket_alloc); $bb->insert_tail($b); $c->output_filters->pass_brigade($bb); # fflush is the equivalent of the previous 3 lines of code: # but it's tested elsewhere, here testing flush_create # $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } 1; __END__ PerlModule TestFilter::both_str_con_add PerlPreConnectionHandler TestFilter::both_str_con_add::pre_connection PerlProcessConnectionHandler TestFilter::both_str_con_add mod_perl-2.0.9/t/filter/TestFilter/both_str_native_remove.pm0000644000104000010010000000675212540623204024716 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::both_str_native_remove; # this tests verifies that we can remove input and output native # (non-mod_perl filters) use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::FilterRec (); use APR::Table (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK DECLINED M_POST); # this filter removes the next filter in chain and itself sub remove_includes { my $f = shift; my $args = $f->r->args || ''; if ($args eq 'remove') { my $ff = $f->next; $ff->remove if $ff && $ff->frec->name eq 'includes'; } $f->remove; return Apache2::Const::DECLINED; } # this filter removes the next filter in chain and itself sub remove_deflate { my $f = shift; my $args = $f->r->args || ''; if ($args eq 'remove') { for (my $ff = $f->r->input_filters; $ff; $ff = $ff->next) { if ($ff->frec->name eq 'deflate') { $ff->remove; last; } } } $f->remove; return Apache2::Const::DECLINED; } # this filter appends the output filter list at eos sub print_out_flist { my $f = shift; unless ($f->ctx) { $f->ctx(1); $f->r->headers_out->unset('Content-Length'); } while ($f->read(my $buffer, 1024)) { $f->print($buffer); } if ($f->seen_eos) { my $flist = join ',', get_flist($f->r->output_filters); $f->print("output2: $flist\n"); } return Apache2::Const::OK; } sub store_in_flist { my $f = shift; my $r = $f->r; unless ($f->ctx) { my $x = $r->pnotes('INPUT_FILTERS') || []; push @$x, join ',', get_flist($f->r->input_filters); $r->pnotes('INPUT_FILTERS' => $x); } return Apache2::Const::DECLINED; } sub response { my $r = shift; # just to make sure that print() won't flush, or we would get the # count wrong local $| = 0; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print("content: " . TestCommon::Utils::read_post($r) ."\n"); } my $i=1; for (@{ $r->pnotes('INPUT_FILTERS')||[] }) { $r->print("input$i: $_\n"); $i++; } $r->subprocess_env(SSI_TEST => 'SSI OK'); $r->printf("output1: %s\n", join ',', get_flist($r->output_filters)); $r->rflush; # this sends the data in the buffer + flush bucket $r->print('xx'."\n"); Apache2::Const::OK; } sub get_flist { my $f = shift; my @flist = (); for (; $f; $f = $f->next) { push @flist, $f->frec->name; } return @flist; } 1; __DATA__ Options +Includes SetHandler modperl PerlModule TestFilter::both_str_native_remove PerlResponseHandler TestFilter::both_str_native_remove::response PerlOutputFilterHandler TestFilter::both_str_native_remove::remove_includes PerlSetOutputFilter INCLUDES PerlOutputFilterHandler TestFilter::both_str_native_remove::print_out_flist PerlInputFilterHandler TestFilter::both_str_native_remove::store_in_flist PerlInputFilterHandler TestFilter::both_str_native_remove::remove_deflate PerlSetInputFilter DEFLATE PerlInputFilterHandler TestFilter::both_str_native_remove::store_in_flist mod_perl-2.0.9/t/filter/TestFilter/both_str_req_add.pm0000644000104000010010000000346712540623204023452 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::both_str_req_add; # insert an input filter which lowers the case of the data # insert an output filter which strips spaces use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub header_parser { my $r = shift; # test adding by coderef $r->add_input_filter(\&in_filter); # test adding by sub's name $r->add_output_filter("out_filter"); # test adding anon sub $r->add_output_filter(sub { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $buffer .= "end"; $filter->print($buffer); } return Apache2::Const::OK; }); return Apache2::Const::DECLINED; } sub in_filter { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $filter->print(lc $buffer); } Apache2::Const::OK; } sub out_filter { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $buffer =~ s/\s+//g; $filter->print($buffer); } Apache2::Const::OK; } sub handler { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::both_str_req_add SetHandler modperl PerlHeaderParserHandler TestFilter::both_str_req_add::header_parser PerlResponseHandler TestFilter::both_str_req_add mod_perl-2.0.9/t/filter/TestFilter/both_str_req_mix.pm0000644000104000010010000001064012540623204023506 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::both_str_req_mix; # this is an elaborated test, where we mix several apache and mod_perl # filters, both input and output and verifying that they can work # together, preserving the order when the filters are of the same # priority # in this test the client, the client sends a compressed body, # 'DEFLATE' deflates it, then mod_perl filter 'transparent' filter # passes data through as-is. The following 'in_adjust' mod_perl filter # removes the string 'INPUT' from incoming data. The response handler # simply passes the data through. Next output filters get to work: # 'out_adjust_before_ssi' fixups the data to a valid SSI directive, by # removing the string 'OUTPUT' from the outgoing data, then the # 'INCLUDES' filter fetches the virtual file, and finally # 'out_adjust_after_ssi' fixes the file contents returned by SSI, by # removing the string 'REMOVE' # # Here is a visual representation of the transformations: # # => # # compressed data # # => DEFLATE # # # # => transparent # # # # => in_adjust # # # # <=> response handler # # # # <= out_adjust_before_ssi # # # # <= out_adjust_before_ssi # # # # <= INCLUDES # # This is a REMOVEclear text # # <= out_adjust_after_ssi # # This is a clear text # # <= DEFLATE # # compressed data # # <= use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant DEBUG => 1; sub transparent { my $filter = shift; while ($filter->read(my $buffer, 1024)){ debug "transparent buffer: $buffer"; $buffer =~ s/foo//; $filter->print($buffer); } $filter->print(""); Apache2::Const::OK; } sub in_adjust { adjust("INPUT", @_)} sub out_adjust_before_ssi { adjust("OUTPUT", @_)} sub out_adjust_after_ssi { adjust("REMOVE", @_)} sub adjust { my ($string, $filter) = @_; my $sig = "adjust($string):"; while ($filter->read(my $buffer, 1024)){ debug "$sig before: $buffer"; $buffer =~ s/$string//; debug "$sig after: $buffer"; $filter->print($buffer); } Apache2::Const::OK; } sub handler { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::both_str_req_mix Options +Includes # DEFLATE has a higher priority (AP_FTYPE_CONTENT_SET=20) than # mod_perl request filters (AP_FTYPE_RESOURCE=10), so it's going # to filter input first no matter how we insert other mod_perl # filters. (mod_perl connection filter handlers have an even # higher priority (AP_FTYPE_PROTOCOL = 30), see # include/util_filter.h for those definitions). # # PerlSetInputFilter is only useful for preserving the # insertion order of filters with the same priority SetInputFilter DEFLATE #PerlInputFilterHandler TestCommon::FilterDebug::snoop_request PerlInputFilterHandler TestFilter::both_str_req_mix::in_adjust PerlInputFilterHandler TestFilter::both_str_req_mix::transparent # here INCLUDES and adjust are both of the same priority # (AP_FTYPE_RESOURCE), so PerlSetOutputFilter PerlOutputFilterHandler TestFilter::both_str_req_mix::out_adjust_before_ssi PerlSetOutputFilter INCLUDES PerlOutputFilterHandler TestFilter::both_str_req_mix::out_adjust_after_ssi #PerlOutputFilterHandler TestCommon::FilterDebug::snoop_request PerlSetOutputFilter DEFLATE SetHandler modperl PerlResponseHandler TestFilter::both_str_req_mix mod_perl-2.0.9/t/filter/TestFilter/both_str_req_proxy.pm0000644000104000010010000000524412540623204024076 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::both_str_req_proxy; # very similar to TestFilter::both_str_req_add, but the request is # proxified. we filter the POSTed body before it goes via the proxy and # we filter the response after it returned from the proxy use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub in_filter { my $filter = shift; debug "input filter"; while ($filter->read(my $buffer, 1024)) { $filter->print(lc $buffer); } Apache2::Const::OK; } sub out_filter { my $filter = shift; debug "output filter"; while ($filter->read(my $buffer, 1024)) { $buffer =~ s/\s+//g; $filter->print($buffer); } Apache2::Const::OK; } sub handler { my $r = shift; debug "response handler"; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } return Apache2::Const::OK; } 1; __DATA__ Order Deny,Allow Deny from all Allow from @servername@ 2.4.1> Order Deny,Allow Deny from all Allow from @servername@ ProxyRequests Off ProxyPass /TestFilter__both_str_req_proxy/ \ http://@servername@:@port@/TestFilter__both_str_req_proxy_content/ ProxyPassReverse /TestFilter__both_str_req_proxy/ \ http://@servername@:@port@/TestFilter__both_str_req_proxy_content/ PerlModule TestFilter::both_str_req_proxy PerlInputFilterHandler TestFilter::both_str_req_proxy::in_filter PerlOutputFilterHandler TestFilter::both_str_req_proxy::out_filter SetHandler modperl PerlResponseHandler TestFilter::both_str_req_proxy mod_perl-2.0.9/t/filter/TestFilter/in_autoload.pm0000644000104000010010000000210612540623204022432 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_autoload; # test that PerlInputFilterHandler autoloads the module containing the # handler (since it's ::handler and not a custom sub name we don't # have to explicitly call PerlModule) # # no point testing PerlOutputFilterHandler as it does the same use strict; use warnings FATAL => 'all'; use Apache2::Filter (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK); sub handler { my $filter = shift; while ($filter->read(my $buffer, 1024)) { debug "filter read: $buffer"; $filter->print(lc $buffer); } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestCommon::Handlers SetHandler modperl PerlResponseHandler TestCommon::Handlers::pass_through_response_handler # no PerlModule TestFilter::in_load on purpose PerlInputFilterHandler TestFilter::in_autoload mod_perl-2.0.9/t/filter/TestFilter/in_bbs_body.pm0000644000104000010010000000262712540623204022415 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_bbs_body; use strict; use warnings FATAL => 'all'; use base qw(Apache2::Filter); #so we inherit MODIFY_CODE_ATTRIBUTES use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Brigade (); use APR::Bucket (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use APR::Const -compile => ':common'; sub handler : FilterRequestHandler { my ($filter, $bb, $mode, $block, $readbytes) = @_; $filter->next->get_brigade($bb, $mode, $block, $readbytes); for (my $b = $bb->first; $b; $b = $bb->next($b)) { last if $b->is_eos; if ($b->read(my $data)) { #warn"[$data]\n"; my $nb = APR::Bucket->new($bb->bucket_alloc, scalar reverse $data); $b->insert_before($nb); $b->delete; $b = $nb; } } Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); $r->puts($data); } else { $r->puts("1..3\nok 1\n"); } Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_bbs_body PerlResponseHandler TestFilter::in_bbs_body::response mod_perl-2.0.9/t/filter/TestFilter/in_bbs_consume.pm0000644000104000010010000000565612540623204023136 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_bbs_consume; # this test consumes a chunk of input, then consumes and throws away # the rest of the data, finally returns to the caller that initial # chunk. This all happens during a single filter invocation. Even # though there about 6-7 incoming data brigades. use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::Connection (); use APR::Brigade (); use APR::Bucket (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant READ_SIZE => 26; sub handler { my ($filter, $bb, $mode, $block, $readbytes) = @_; my $ba = $filter->r->connection->bucket_alloc; my $seen_eos = 0; my $satisfied = 0; my $buffer = ''; debug_sub "filter called"; until ($satisfied) { my $tbb = APR::Brigade->new($filter->r->pool, $ba); $filter->next->get_brigade($tbb, $mode, $block, READ_SIZE); debug "asking for a bb of " . READ_SIZE . " bytes\n"; my $data; ($data, $seen_eos) = bb_data_n_eos($tbb); $tbb->destroy; $buffer .= $data; length($buffer) < READ_SIZE ? redo : $satisfied++; } # consume all the remaining input do { my $tbb = APR::Brigade->new($filter->r->pool, $ba); $filter->next->get_brigade($tbb, $mode, $block, $readbytes); debug "discarding the next bb"; $seen_eos = bb_data_n_eos($tbb, 1); # only scan $tbb->destroy; } while (!$seen_eos); if ($seen_eos) { # flush the remainder $bb->insert_tail(APR::Bucket->new($ba, $buffer)); $bb->insert_tail(APR::Bucket::eos_create($ba)); debug "seen eos, sending: " . length($buffer) . " bytes"; } else { die "Something is wrong, this filter should have been called only once"; } return Apache2::Const::OK; } # if $scan_only is true, don't read the data, just look for eos sub bb_data_n_eos { my ($bb, $scan_only) = @_; if ($scan_only) { for (my $b = $bb->first; $b; $b = $bb->next($b)) { return 1 if $b->is_eos; } return 0; } my $seen_eos = 0; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); #warn "HANDLER READ: $data\n"; $r->print($data); } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_bbs_consume PerlResponseHandler TestFilter::in_bbs_consume::response mod_perl-2.0.9/t/filter/TestFilter/in_bbs_inject_header.pm0000644000104000010010000002111612540623204024236 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_bbs_inject_header; # this filter demonstrates two things: # 1. how to write a filter that will work only on HTTP headers # 2. how to inject extra HTTP headers # # the first task is simple for non-keepalive connections -- as soon as # a bucket which matches /^[\r\n]+$/ is read we can store that event # in the filter context and simply 'return Apache2::Const::DECLINED on the # future invocation, so not to slow things. # # it becomes much trickier with keepalive connection, since Apache # provides no API to tell you whether a new request is coming in. We # use $c->keepalives to figure out when a new request is coming in, by # comparing the previously stored keepalives count, which gets # incremented by Apache when the HTTP response headers are generated. # # # the second task is a bit trickier, as the headers_in core httpd # filter is picky and it wants each header to arrive in a separate # bucket, and moreover this bucket needs to be in its own brigade. # so this test arranges for this to happen. # # the test shows how to push headers at the end of all headers # and in the middle, whichever way you prefer. use strict; use warnings FATAL => 'all'; use base qw(Apache2::Filter); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Connection (); use APR::Brigade (); use APR::Bucket (); use APR::Table (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK DECLINED CONN_KEEPALIVE); use APR::Const -compile => ':common'; my $header1_key = 'X-My-Protocol'; my $header1_val = 'POST-IT'; my %headers = ( 'X-Extra-Header2' => 'Value 2', 'X-Extra-Header3' => 'Value 3', ); my $request_body = "This body shouldn't be seen by the filter"; # returns 1 if a bucket with a header was inserted to the $bb's tail, # otherwise returns 0 (i.e. if there are no buckets to insert) sub inject_header_bucket { my ($bb, $ctx) = @_; return 0 unless @{ $ctx->{buckets} }; my $b = shift @{ $ctx->{buckets} }; $bb->insert_tail($b); if (1) { # extra debug, wasting cycles $b->read(my $data); debug "injected header: [$data]"; } else { debug "injected header"; } # next filter invocations will bring the request body if any if ($ctx->{seen_body_separator} && !@{ $ctx->{buckets} }) { $ctx->{done_with_headers} = 1; $ctx->{seen_body_separator} = 0; } return 1; } sub context { my $filter = shift; my $ctx = $filter->ctx; my $c = $filter->c; unless ($ctx) { debug "filter context init"; $ctx = { buckets => [], done_with_headers => 0, seen_body_separator => 0, keepalives => $c->keepalives, }; # since we are going to manipulate the reference stored in # ctx, it's enough to store it only once, we will get the same # reference in the following invocations of that filter $filter->ctx($ctx); return $ctx; } if ($c->keepalive == Apache2::Const::CONN_KEEPALIVE && $ctx->{done_with_headers} && $c->keepalives > $ctx->{keepalives}) { debug "a new request resetting the input filter state"; $ctx->{buckets} = []; $ctx->{done_with_headers} = 0; $ctx->{seen_body_separator} = 0; $ctx->{keepalives} = $c->keepalives; } return $ctx; } sub handler : FilterConnectionHandler { my ($filter, $bb, $mode, $block, $readbytes) = @_; debug join '', "-" x 20 , " input filter called -", "-" x 20; my $ctx = context($filter); my $c = $filter->c; # reset the filter state, we start a new request if ($c->keepalive == Apache2::Const::CONN_KEEPALIVE && $ctx->{done_with_headers} && $c->notes->get('reset_request')) { debug "a new request resetting the input filter state"; $c->notes->set('reset_request' => 0); $ctx->{buckets} = []; $ctx->{seen_body_separator} = 0; $ctx->{done_with_headers} = 0; } # handling the HTTP request body if ($ctx->{done_with_headers}) { # XXX: when the bug in httpd filter will be fixed all the # code in this branch will be replaced with: # $filter->remove; # return Apache2::Const::DECLINED; # at the moment (2.0.48) it doesn't work # so meanwhile tell the mod_perl filter core to pass-through # the brigade unmodified debug "passing the body through unmodified"; return Apache2::Const::DECLINED; } # any custom HTTP header buckets to inject? return Apache2::Const::OK if inject_header_bucket($bb, $ctx); # normal HTTP headers processing my $ctx_bb = APR::Brigade->new($c->pool, $c->bucket_alloc); my $rv = $filter->next->get_brigade($ctx_bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; while (!$ctx_bb->is_empty) { my $b = $ctx_bb->first; if ($b->is_eos) { debug "EOS!!!"; $b->remove; $bb->insert_tail($b); last; } $b->read(my $data); # remove must happen after read, since it may cause split and # some new buckets inserted behind - if remove called too # early, those buckets will be lost $b->remove; debug "filter read:\n[$data]"; # check that we really work only on the headers die "This filter should not ever receive the request body, " . "but HTTP headers" if ($data||'') eq $request_body; if ($data and $data =~ /^POST/) { # demonstrate how to add a header while processing other headers my $header = "$header1_key: $header1_val\n"; push @{ $ctx->{buckets} }, APR::Bucket->new($c->bucket_alloc, $header); debug "queued header [$header]"; } elsif ($data =~ /^[\r\n]+$/) { # normally the body will start coming in the next call to # get_brigade, so if your filter only wants to work with # the headers, it can decline all other invocations if that # flag is set. However since in this test we need to send # a few extra bucket brigades, we will turn another flag # 'done_with_headers' when 'seen_body_separator' is on and # all headers were sent out debug "END of original HTTP Headers"; $ctx->{seen_body_separator}++; # we hit the headers and body separator, which is a good # time to add extra headers: for my $key (keys %headers) { my $header = "$key: $headers{$key}\n"; push @{ $ctx->{buckets} }, APR::Bucket->new($c->bucket_alloc, $header); debug "queued header [$header]"; } # but at the same time we must ensure that the # the separator header will be sent as a last header # so we send one newly added header and push the separator # to the end of the queue # XXX: this is broken: the bucket must be set-aside before # it can be stashed away (missing $b->setaside wrapper) push @{ $ctx->{buckets} }, $b; debug "queued header [$data]"; inject_header_bucket($bb, $ctx); next; # inject_header_bucket already called insert_tail # notice that if we didn't inject any headers, this will # still work ok, as inject_header_bucket will send the # separator header which we just pushed to its queue } else { # fall through } $bb->insert_tail($b); } return Apache2::Const::OK; } sub response { my $r = shift; # propogate the input headers and the input back to the client # as we need to do the validations on the client side $r->headers_out->set($header1_key => $r->headers_in->get($header1_key)||''); for my $key (sort keys %headers) { $r->headers_out->set($key => $r->headers_in->get($key)||''); } my $data = TestCommon::Utils::read_post($r); $r->print($data); Apache2::Const::OK; } 1; __END__ PerlModule TestFilter::in_bbs_inject_header PerlInputFilterHandler TestFilter::in_bbs_inject_header SetHandler modperl PerlResponseHandler TestFilter::in_bbs_inject_header::response mod_perl-2.0.9/t/filter/TestFilter/in_bbs_msg.pm0000644000104000010010000000351612540623204022244 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_bbs_msg; use strict; use warnings FATAL => 'all'; use base qw(Apache2::Filter); use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Brigade (); use APR::Bucket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => ':common'; use Apache::TestTrace; my $from_url = '/input_filter.html'; my $to_url = '/TestFilter__in_bbs_msg'; sub handler : FilterConnectionHandler { my ($filter, $bb, $mode, $block, $readbytes) = @_; debug "FILTER CALLED"; $filter->next->get_brigade($bb, $mode, $block, $readbytes); for (my $b = $bb->first; $b; $b = $bb->next($b)) { last if $b->is_eos; if ($b->read(my $data)) { next unless $data =~ s|GET $from_url|GET $to_url|; debug "GET line rewritten to be:\n$data"; my $nb = APR::Bucket->new($bb->bucket_alloc, $data); $b->insert_before($nb); $b->delete; $b = $nb; } # XXX: currently a bug in httpd doesn't allow to remove # the first connection filter. once it's fixed adjust the test # to test that it was invoked only once. # debug "removing the filter"; # $filter->remove; # this filter is no longer needed } Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->puts("1..1\nok 1\n"); Apache2::Const::OK; } 1; __END__ PerlModule TestFilter::in_bbs_msg PerlInputFilterHandler TestFilter::in_bbs_msg SetHandler modperl PerlResponseHandler TestFilter::in_bbs_msg::response mod_perl-2.0.9/t/filter/TestFilter/in_bbs_underrun.pm0000644000104000010010000001111512540623204023312 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_bbs_underrun; # this test exercises the underrun filter concept. Sometimes filters # need to read at least N bytes before they can apply their # transformation. It's quite possible that reading one bucket brigade # is not enough. But two or more are needed. # # When the filter realizes that it doesn't have enough data, it can # stash the read data in the context, and wait for the next # invocation, meanwhile it must return an empty bb to the filter that # has called it. This is not efficient. Instead of returning an empty # bb to a caller, the input filter can initiate the retrieval of extra # bucket brigades, after one was received. Notice that this is # absolutely transparent to any filters before or after the current # filter. # # to see the filter at work, run it as: # t/TEST -trace=debug -v filter/in_bbs_underrun # # and look in the error_log. You will see something like: # # ==> TestFilter::in_bbs_underrun::handler : filter called # ==> asking for a bb # ==> asking for a bb # ==> asking for a bb # ==> storing the remainder: 7611 bytes # ==> TestFilter::in_bbs_underrun::handler : filter called # ==> asking for a bb # ==> asking for a bb # ==> storing the remainder: 7222 bytes # ==> TestFilter::in_bbs_underrun::handler : filter called # ==> asking for a bb # ==> seen eos, flushing the remaining: 8182 bytes # # it's clear from the log that the filter was invoked 3 times, however # it has consumed 6 bucket brigades # # finally, we have to note that this is impossible to do with # streaming filters, since they can only read data from one bucket # brigade. So you must process bucket brigades. # use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant SIZE => 1024*16 + 5; # ~16k sub handler { my ($filter, $bb, $mode, $block, $readbytes) = @_; my $ba = $filter->r->connection->bucket_alloc; my $ctx = $filter->ctx; my $buffer = defined $ctx ? $ctx : ''; $ctx = ''; # reset my $seen_eos = 0; my $data; debug_sub "filter called"; # fetch and consume bucket brigades untill we have at least SIZE # bytes to work with do { my $tbb = APR::Brigade->new($filter->r->pool, $ba); $filter->next->get_brigade($tbb, $mode, $block, $readbytes); debug "asking for a bb"; ($data, $seen_eos) = flatten_bb($tbb); $tbb->destroy; $buffer .= $data; } while (!$seen_eos && length($buffer) < SIZE); # now create a bucket per chunk of SIZE size and put the remainder # in ctx for (split_buffer($buffer)) { if (length($_) == SIZE) { $bb->insert_tail(APR::Bucket->new($bb->bucket_alloc, $_)); } else { $ctx .= $_; } } if ($seen_eos) { # flush the remainder $bb->insert_tail(APR::Bucket->new($bb->bucket_alloc, $ctx)); $bb->insert_tail(APR::Bucket::eos_create($ba)); debug "seen eos, flushing the remaining: " . length($ctx) . " bytes"; } else { # will re-use the remainder on the next invocation $filter->ctx($ctx); debug "storing the remainder: " . length($ctx) . " bytes"; } return Apache2::Const::OK; } # split in words of SIZE chars and a remainder sub split_buffer { my $buffer = shift; if ($] < 5.007) { my @words = $buffer =~ /(.{@{[SIZE]}}|.+)/g; return @words; } else { # available only since 5.7.x+ return unpack "(A" . SIZE . ")*", $buffer; } } sub flatten_bb { my ($bb) = shift; my $seen_eos = 0; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); #warn "HANDLER READ: $data\n"; my $length = length $data; $r->print("read $length chars"); } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_bbs_underrun PerlResponseHandler TestFilter::in_bbs_underrun::response PerlInputFilterHandler TestFilter::in_bbs_underrun::handler #PerlInputFilterHandler TestCommon::FilterDebug::snoop_request mod_perl-2.0.9/t/filter/TestFilter/in_error.pm0000644000104000010010000000257312540623204021763 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_error; # errors in filters should be properly propogated to httpd # XXX: need to test output as well, and separately connection and # request filters use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use APR::Table (); use Apache::TestTrace; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub handler { my $filter = shift; debug join '', "-" x 20 , " filter called ", "-" x 20; die "This filter must die"; return Apache2::Const::OK; } sub response { my $r = shift; # cause taint problems, as there was a bug (panic: POPSTACK) # caused when APR/Error.pm was attempted to be loaded from # $r->read() when the latter was trying to croak about the failed # read, due to the filter returning 500 eval { system('echo', 'hello') }; t_server_log_error_is_expected(2); my $len = $r->read(my $data, $r->headers_in->{'Content-Length'}); $r->content_type('text/plain'); $r->print("it shouldn't be printed, because the input filter has died"); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_error PerlResponseHandler TestFilter::in_error::response mod_perl-2.0.9/t/filter/TestFilter/in_init_basic.pm0000644000104000010010000000415612540623204022735 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_init_basic; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use base qw(Apache2::Filter); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant READ_SIZE => 1024; # this filter is expected to be called once # it'll set a note, with the count sub transparent_init : FilterInitHandler { my $filter = shift; my $ctx = $filter->ctx; $ctx->{init}++; $filter->r->notes->set(init => $ctx->{init}); $filter->ctx($ctx); return Apache2::Const::OK; } # this filter passes the data through unmodified and sets a note # counting how many times it was invoked sub transparent : FilterRequestHandler FilterHasInitHandler(\&transparent_init) { my ($filter, $bb, $mode, $block, $readbytes) = @_; my $ctx = $filter->ctx; $ctx->{run}++; $filter->r->notes->set(run => $ctx->{run}); $filter->ctx($ctx); $filter->next->get_brigade($bb, $mode, $block, $readbytes); return Apache2::Const::OK; } # this filter is not supposed to get a chance to run, since its init # handler immediately removes it sub suicide_init : FilterInitHandler { shift->remove(); Apache2::Const::OK } sub suicide : FilterHasInitHandler(\&suicide_init) { die "this filter is not supposed to have a chance to run"; } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } my @keys = qw(init run); my %times = map { $_ => $r->notes->get($_)||0 } @keys; $r->print("$_ $times{$_}\n") for @keys; Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_init_basic PerlResponseHandler TestFilter::in_init_basic::response PerlInputFilterHandler TestFilter::in_init_basic::suicide PerlInputFilterHandler TestFilter::in_init_basic::transparent mod_perl-2.0.9/t/filter/TestFilter/in_str_bin_data.pm0000644000104000010010000000264612540623204023264 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_bin_data; # test that $r->print and $f->print handle binary data correctly # (e.g. doesn't truncate on "\0" if there is more data after it) use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::Filter (); use Apache::TestTrace; use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub pass_through { my $f = shift; while ($f->read(my $buffer, 1024)) { debug "read: " . length ($buffer) . "b [$buffer]"; $f->print($buffer); } return Apache2::Const::OK; } sub handler { my $r = shift; if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); my $length = length $data; debug "pass through $length bytes of $data\n"; $r->print($data); } Apache2::Const::OK; } 1; __END__ PerlModule TestFilter::in_str_bin_data PerlInputFilterHandler TestFilter::in_str_bin_data::pass_through SetHandler modperl PerlResponseHandler TestFilter::in_str_bin_data SetHandler modperl PerlResponseHandler TestFilter::in_str_bin_data mod_perl-2.0.9/t/filter/TestFilter/in_str_consume.pm0000644000104000010010000001250012540623204023162 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_consume; # this test verifies that streaming filters framework handles # gracefully the case when a filter doesn't print anything at all to # the caller. # the real problem is that in the streaming filters we can't consume # more than one bucket brigade during a single filter invocation, # which we can in non-stream filters., (e.g. see in_bbs_underrun.pm) # # it seems that this works just fine (2.0.46+) and older httpds # had problems when a filter invocation hasn't printed a thing. # # currently if the streaming filter doesn't print anything, the # upstream filter gets an empty brigade brigade (easily verified with # the snooping debug filter). Of course if the filter returns # Apache2::Const::DECLINED the unconsumed data will be passed to upstream filter # # However this filter has a problem. Since it doesn't consume all the # data, the client is left with un-read data, and when the response is # sent a client get the broken pipe on the socket. It seems that LWP # on linux handles that situation gracefully, but not on win32, where # it silently dies. Other clients may have similar problems as # well. The proper solution is to consume all the data till EOS and # just drop it on the floor if it's unneeded. Unfortunately we waste # the resources of passing the data through all filters in the chain # and doing a wasteful work, but currently there is no way to tell the # in_core network filter to discard all the data without passing it # upstream. Notice that in this test we solve the problem in a # different manner, we simply call $r->discard_request_body which does # the trick. However it's inappropriate for a stand-alone filter, who # should read all the data in instead. # # this test receives about 10 bbs # it reads only the first 23 bytes of each bb and discards the rest # since it wants only 105 bytes it partially consumes only the first 5 bbs # since it doesn't read all the data in, it'll never see EOS # therefore once it has read all 105 bytes, it manually sets the EOS flag # and the rest of the bbs are ignored, the filter is invoked only 5 times # # to debug this filter run it as: # # t/TEST -v -trace=debug filter/in_str_consume # # to enable upstream and downstream filter snooping, uncomment the # snooping filters directives at the end of this file and rerun: # t/TEST -conf # # to see what happens inside the filter, assuming that you built # mod_perl with MP_TRACE=1, run: # env MOD_PERL_TRACE=f t/TEST -v -trace=debug filter/in_str_consume # use strict; use warnings FATAL => 'all'; use Apache2::Filter (); use Apache::TestTrace; use Apache2::RequestRec (); use Apache2::RequestIO (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant READ_BYTES_TOTAL => 105; use constant READ_BYTES_FIRST => 23; sub handler { my $filter = shift; my $ctx = $filter->ctx || { data => '', count => '1'}; debug "FILTER INVOKED: $ctx->{count}"; # read untill READ_BYTES read, no matter how many filter # invocations it'll take my $wanted_total = READ_BYTES_TOTAL - length $ctx->{data}; my $wanted_current = READ_BYTES_FIRST; my $wanted = $wanted_total; $wanted = $wanted_current if $wanted > $wanted_current; debug "total wanted: $wanted_total bytes"; debug "this bb wanted: $wanted bytes"; while ($wanted) { my $len = $filter->read(my $buffer, $wanted); $ctx->{data} .= $buffer; $wanted_total -= $len; $wanted -= $len; debug "FILTER READ: [$buffer]"; debug "FILTER READ: $len ($wanted_total more to go)"; last unless $len; # no more data to read in this bb } $ctx->{count}++; unless ($wanted_total) { # we don't want to read the rest if there is anything left $filter->seen_eos(1); # but we really should, though we workaround it in the # response handler, by calling $r->discard_request_body } if ($filter->seen_eos) { # flush the data if we are done $filter->print($ctx->{data}); } else { # store the data away $filter->ctx($ctx); # notice that it seems to work even though we don't print # anything. the upstream filter gets an empty bb. # alternatively could print the chunks of data that we read, # if we don't need to have it as a whole chunk } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); # tell Apache to get rid of the rest of the request body # if we don't a client will get a broken pipe and may fail to # handle this situation gracefully $r->discard_request_body; my $len = length $data; debug "HANDLER READ: $len bytes\n"; $r->print($len); } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_str_consume PerlResponseHandler TestFilter::in_str_consume::response #PerlInputFilterHandler TestCommon::FilterDebug::snoop_request PerlInputFilterHandler TestFilter::in_str_consume::handler #PerlInputFilterHandler TestCommon::FilterDebug::snoop_request mod_perl-2.0.9/t/filter/TestFilter/in_str_declined.pm0000644000104000010010000000343012540623204023262 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_declined; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK DECLINED M_POST); # make sure that if the input filter returns DECLINED without # reading/printing data the data flow is not broken sub handler { my $filter = shift; my $ctx = $filter->ctx; $ctx->{invoked}++; $filter->ctx($ctx); # can't use $f->seen_eos, since we don't read the data, so # we have to set the note on each invocation $filter->r->notes->set(invoked => $ctx->{invoked}); #warn "filter was invoked $ctx->{invoked} times\n"; return Apache2::Const::DECLINED; } sub response { my $r = shift; plan $r, tests => 2; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { # consume the data so the input filter is invoked my $data = TestCommon::Utils::read_post($r); ok t_cmp(length $data, 20000, "the request body received ok"); } # ~20k of input makes it four bucket brigades: # - 2 full bucket brigades of 8k # - 1 half full brigade ~4k # - 1 bucket brigade with EOS bucket # however different Apache versions may send extra bb or split # data differently so we can't rely on the exact count my $invoked = $r->notes->get('invoked') || 0; ok $invoked > 1; Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_str_declined PerlResponseHandler TestFilter::in_str_declined::response mod_perl-2.0.9/t/filter/TestFilter/in_str_declined_read.pm0000644000104000010010000000236512540623204024263 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_declined_read; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK DECLINED M_POST); # a filter must not return DECLINED after calling $r->read, since the # latter already fetches the bucket brigade in which case it's up to # the user to complete reading it and send it out # thefore this filter must fail sub handler { my $filter = shift; # this causes a fetch of bb $filter->read(my $buffer, 10); return Apache2::Const::DECLINED; } sub response { my $r = shift; plan $r, tests => 1; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { # this should fail, because of the failing filter eval { TestCommon::Utils::read_post($r) }; ok $@; } Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_str_declined_read PerlResponseHandler TestFilter::in_str_declined_read::response mod_perl-2.0.9/t/filter/TestFilter/in_str_lc.pm0000644000104000010010000000172212540623204022113 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_lc; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub handler { my $filter = shift; while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; $filter->print(lc $buffer); } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); #warn "HANDLER READ: $data\n"; $r->print($data); } Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_str_lc PerlResponseHandler TestFilter::in_str_lc::response mod_perl-2.0.9/t/filter/TestFilter/in_str_msg.pm0000644000104000010010000000542712540623204022311 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_msg; # test: # - input connection filter rewriting the first HTTP header POST # - input request filter configured outside the resource container # should work just fine (via PerlOptions +MergeHandlers) # - input connection filter configured inside the resource container # is silently skipped (at the moment we can't complain about such, # since there could be connection filters from outside the resource # container that will get merged inside the resource dir_config use strict; use warnings FATAL => 'all'; use base qw(Apache2::Filter); use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Brigade (); use APR::Bucket (); use Apache::Test; use Apache::TestUtil; use TestCommon::Utils (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => ':common'; my $from_url = '/input_filter.html'; my $to_url = '/TestFilter__in_str_msg'; sub con : FilterConnectionHandler { my $filter = shift; #warn "FILTER con CALLED\n"; my $ctx = $filter->ctx; while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; unless ($ctx) { $buffer =~ s|POST $from_url|POST $to_url|; $ctx = 1; # done } $filter->print($buffer); } $filter->ctx($ctx) if $ctx; return Apache2::Const::OK; } sub req : FilterRequestHandler { my $filter = shift; #warn "FILTER req CALLED\n"; while ($filter->read(my $buffer, 1024)) { $buffer =~ s/upcase me/UPCASED/; $filter->print($buffer); } return Apache2::Const::OK; } sub con_skip : FilterConnectionHandler { my $filter = shift; #warn "FILTER con_skip CALLED\n"; while ($filter->read(my $buffer, 1024)) { $filter->print("I'm a bogus filter. Don't run me\n"); } return Apache2::Const::OK; } my $expected = "UPCASED"; sub response { my $r = shift; plan $r, tests => 1; my $received = TestCommon::Utils::read_post($r); ok t_cmp($received, $expected, "request filter must have upcased the data"); Apache2::Const::OK; } 1; __END__ PerlModule TestFilter::in_str_msg PerlInputFilterHandler TestFilter::in_str_msg::con # this request filter is outside the resource container and it # should work just fine because of PerlOptions +MergeHandlers PerlInputFilterHandler TestFilter::in_str_msg::req SetHandler modperl PerlOptions +MergeHandlers PerlInputFilterHandler TestFilter::in_str_msg::con_skip PerlResponseHandler TestFilter::in_str_msg::response mod_perl-2.0.9/t/filter/TestFilter/in_str_sandwich.pm0000644000104000010010000000244112540623204023314 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::in_str_sandwich; # this test verifies whether the filter can pre-insert data (using # context) and post-insert data (using the seen_eos flag) use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub handler { my $filter = shift; my $ctx = $filter->ctx; unless ($ctx) { $filter->print("HEADER\n"); $filter->ctx(1); } while ($filter->read(my $buffer, 1024)) { #warn "FILTER READ: $buffer\n"; $filter->print($buffer); } if ($filter->seen_eos) { $filter->print("TAIL\n"); } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); #warn "HANDLER READ: $data\n"; $r->print($data); } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::in_str_sandwich PerlResponseHandler TestFilter::in_str_sandwich::response mod_perl-2.0.9/t/filter/TestFilter/out_bbs_basic.pm0000644000104000010010000000333012540623204022732 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_bbs_basic; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use APR::Brigade (); use APR::Bucket (); use APR::BucketType (); use Apache2::Const -compile => 'OK'; #XXX: Not implemented yet, required by Test.pm sub Apache::TestToString::PRINTF {} sub handler { my ($filter, $bb) = @_; unless ($filter->ctx) { Apache::TestToString->start; plan tests => 4; my $ba = $filter->r->connection->bucket_alloc; #should only have 1 bucket from the response() below for (my $b = $bb->first; $b; $b = $bb->next($b)) { ok $b->type->name; ok $b->length == 2; $b->read(my $data); ok (defined $data and $data eq 'ok'); } my $tests = Apache::TestToString->finish; my $brigade = APR::Brigade->new($filter->r->pool, $ba); my $b = APR::Bucket->new($ba, $tests); $brigade->insert_tail($b); my $ok = $brigade->first->type->name =~ /mod_perl/ ? 4 : 0; $brigade->insert_tail(APR::Bucket->new($ba, "ok $ok\n")); $brigade->insert_tail(APR::Bucket::eos_create($ba)); $filter->next->pass_brigade($brigade); $filter->ctx(1); # flag that we have run this already } Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->puts("ok"); 0; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_bbs_basic PerlResponseHandler TestFilter::out_bbs_basic::response mod_perl-2.0.9/t/filter/TestFilter/out_bbs_ctx.pm0000644000104000010010000000610312540623204022450 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_bbs_ctx; # this is the same test as TestFilter::context_stream, but uses the # bucket brigade API use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Brigade (); use APR::Bucket (); use APR::BucketType (); use base qw(Apache2::Filter); use Apache::TestTrace; use Apache2::Const -compile => qw(OK M_POST); use APR::Const -compile => ':common'; use constant BLOCK_SIZE => 5003; sub handler { my ($filter, $bb) = @_; debug "filter got called"; my $c = $filter->c; my $ba = $c->bucket_alloc; my $bb_ctx = APR::Brigade->new($c->pool, $ba); my $ctx = $filter->ctx; $ctx->{invoked}++; my $data = exists $ctx->{data} ? $ctx->{data} : ''; while (my $b = $bb->first) { if ($b->is_eos) { debug "got EOS"; # flush the remainings and send a stats signature $bb_ctx->insert_tail(APR::Bucket->new($ba, "$data\n")) if $data; my $sig = join "\n", "received $ctx->{blocks} complete blocks", "filter invoked $ctx->{invoked} times\n"; $bb_ctx->insert_tail(APR::Bucket->new($ba, $sig)); $b->remove; $bb_ctx->insert_tail($b); last; } if ($b->read(my $bdata)) { debug "got data"; $b->delete; $data .= $bdata; my $len = length $data; my $blocks = 0; if ($len >= BLOCK_SIZE) { $blocks = int($len / BLOCK_SIZE); $len = $len % BLOCK_SIZE; $data = substr $data, $blocks*BLOCK_SIZE, $len; $ctx->{blocks} += $blocks; } if ($blocks) { my $nb = APR::Bucket->new($ba, "#" x $blocks); $bb_ctx->insert_tail($nb); } } else { debug "got bucket with no data: type: " . $b->type->name; $b->remove; $bb_ctx->insert_tail($b); } } $ctx->{data} = $data; $filter->ctx($ctx); my $rv = $filter->next->pass_brigade($bb_ctx); return $rv unless $rv == APR::Const::SUCCESS; return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); # just to make sure that print() won't flush, or we would get the # count wrong local $| = 0; # make sure that: # - we send big enough data so it won't fit into one buffer # - use chunk size which doesn't nicely fit into a buffer size, so # we have something to store in the context between filter calls my $blocks = 33; my $block_size = BLOCK_SIZE + 1; my $block = "x" x $block_size; for (1..$blocks) { $r->print($block); $r->rflush; # so the filter reads a chunk at a time } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_bbs_ctx PerlResponseHandler TestFilter::out_bbs_ctx::response mod_perl-2.0.9/t/filter/TestFilter/out_bbs_filebucket.pm0000644000104000010010000000273712540623204024000 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_bbs_filebucket; # testing how the filter handles file buckets use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter; use Apache2::URI (); use APR::Brigade (); use APR::Bucket (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK); use APR::Const -compile => qw(SUCCESS); use constant BLOCK_SIZE => 5003; sub handler { my ($filter, $bb) = @_; debug "FILTER INVOKED"; my $cnt = 0; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $cnt++; debug "reading bucket #$cnt"; last if $b->is_eos; if (my $len = $b->read(my $data)) { my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data); $b->insert_before($nb); $b->delete; $b = $nb; } } return $filter->next->pass_brigade($bb); } sub response { my $r = shift; debug "\n-------- new request ----------"; $r->content_type('text/plain'); my $file = $r->args; Apache2::URI::unescape_url($file); $r->sendfile($file); return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_bbs_filebucket PerlResponseHandler TestFilter::out_bbs_filebucket::response PerlOutputFilterHandler TestFilter::out_bbs_filebucket::handler mod_perl-2.0.9/t/filter/TestFilter/out_init_basic.pm0000644000104000010010000000401512540623204023130 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_init_basic; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use base qw(Apache2::Filter); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant READ_SIZE => 1024; # this filter is expected to be called once # it'll set a note, with the count sub init : FilterInitHandler { my $filter = shift; #warn "**** init was invoked\n"; my $ctx = $filter->ctx; $ctx->{init}++; $filter->r->notes->set(init => $ctx->{init}); $filter->ctx($ctx); #warn "**** init is exiting\n"; return Apache2::Const::OK; } # testing whether we can get the pre handler callback in evolved way sub get_pre_handler { return \&TestFilter::out_init_basic::init } # this filter adds a count for each time it is invoked sub transparent : FilterRequestHandler FilterHasInitHandler(get_pre_handler()) { my ($filter, $bb) = @_; #warn "**** filter was invoked\n"; my $ctx = $filter->ctx; $filter->print('run ', ++$ctx->{run}, "\n"); $filter->ctx($ctx); my $rv = $filter->next->pass_brigade($bb); return $rv unless $rv == APR::Const::SUCCESS; #warn "**** filter is exiting\n"; return Apache2::Const::OK; } sub response { my $r = shift; #warn "**** content was invoked\n"; $r->content_type('text/plain'); my $data; if ($r->method_number == Apache2::Const::M_POST) { $data = TestCommon::Utils::read_post($r); } $r->print('init ', $r->notes->get('init'), "\n"); $r->print($data) if $data; #warn "**** content is exiting\n"; Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_init_basic PerlResponseHandler TestFilter::out_init_basic::response PerlOutputFilterHandler TestFilter::out_init_basic::transparent mod_perl-2.0.9/t/filter/TestFilter/out_str_api.pm0000644000104000010010000000441612540623204022472 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_api; # Test Apache2::FilterRec and Apache2::Filter accessors use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::FilterRec (); use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::Const -compile => 'OK'; my $response_data = "blah blah blah"; #XXX: else pp_untie complains: #untie attempted while %d inner references still exist sub Apache2::Filter::UNTIE {} sub Apache2::Filter::PRINTF {} sub handler { my $filter = shift; my $data = ''; while ($filter->read(my $buffer, 1024)) { $data .= $buffer; } tie *STDOUT, $filter; plan tests => 8; ok t_cmp($data, $response_data, "response data"); ok $filter->isa('Apache2::Filter'); { my $frec = $filter->frec; ok $frec->isa('Apache2::FilterRec'); ok t_cmp($frec->name, "modperl_request_output", '$frec->name'); my $next = $filter->next; ok t_cmp($next->frec->name, "modperl_request_output", '$filter->next->frec->name'); $next = $next->next; # since we can't ensure that the next filter will be the same, # as it's not under control, just check that we get some name my $name = $next->frec->name; t_debug("next->next name: $name"); ok $name; } my $r = $filter->r; ok $r->isa('Apache2::RequestRec'); my $path = '/' . Apache::TestRequest::module2path(__PACKAGE__); ok t_cmp($r->uri, $path, "path"); untie *STDOUT; # we have done the job $filter->remove; Apache2::Const::OK; } sub pass_through { return Apache2::Const::DECLINED; } sub response { my $r = shift; $r->content_type('text/plain'); $r->puts($response_data); Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::out_str_api SetHandler modperl PerlResponseHandler TestFilter::out_str_api::response PerlOutputFilterHandler TestFilter::out_str_api PerlOutputFilterHandler TestFilter::out_str_api::pass_through mod_perl-2.0.9/t/filter/TestFilter/out_str_buffer.pm0000644000104000010010000000460412540623204023171 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_buffer; # in this test we want to buffer the data, modify the length of the # response, set the c-l header and make sure that the client sees the # right thing # # notice that a bucket brigades based filter must be used. The streaming # API lets FLUSH buckets through which causes an early flush of HTTP # response headers use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Table (); use APR::Bucket (); use APR::Brigade (); use TestCommon::Utils (); use base qw(Apache2::Filter); use Apache2::Const -compile => qw(OK M_POST); use APR::Const -compile => ':common'; sub flatten_bb { my ($bb) = shift; my $seen_eos = 0; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); } sub handler { my ($filter, $bb) = @_; my $ctx = $filter->ctx; # no need to unset the C-L header, since this filter makes sure to # correct it before any headers go out. #unless ($ctx) { # $filter->r->headers_out->unset('Content-Length'); #} my $data = exists $ctx->{data} ? $ctx->{data} : ''; $ctx->{invoked}++; my ($bdata, $seen_eos) = flatten_bb($bb); $bdata =~ s/-//g; $data .= $bdata if $bdata; if ($seen_eos) { my $len = length $data; $filter->r->headers_out->set('Content-Length', $len); $filter->print($data) if $data; } else { # store context for all but the last invocation $ctx->{data} = $data; $filter->ctx($ctx); } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); my $data = ''; if ($r->method_number == Apache2::Const::M_POST) { $data = TestCommon::Utils::read_post($r); $r->headers_out->set('Content-Length' => length $data); } for my $chunk (split /0/, $data) { $r->print($chunk); $r->rflush; # so the filter reads a chunk at a time } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_buffer PerlResponseHandler TestFilter::out_str_buffer::response mod_perl-2.0.9/t/filter/TestFilter/out_str_ctx.pm0000644000104000010010000000450712540623204022520 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_ctx; # this is the same test as TestFilter::context, but uses the streaming # API use strict; use warnings;# FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use base qw(Apache2::Filter); use Apache2::Const -compile => qw(OK M_POST); use APR::Const -compile => ':common'; use constant BLOCK_SIZE => 5003; use constant READ_SIZE => 1024; sub handler { my $filter = shift; my $ctx = $filter->ctx; my $data = exists $ctx->{data} ? $ctx->{data} : ''; $ctx->{invoked}++; while ($filter->read(my $bdata, READ_SIZE)) { $data .= $bdata; my $len = length $data; my $blocks = 0; if ($len >= BLOCK_SIZE) { $blocks = int($len / BLOCK_SIZE); $len = $len % BLOCK_SIZE; $data = substr $data, $blocks*BLOCK_SIZE, $len; $ctx->{blocks} += $blocks; } if ($blocks) { $filter->print("#" x $blocks); } } if ($filter->seen_eos) { # flush the remaining data and add a statistics signature $filter->print("$data\n") if $data; my $sig = join "\n", "received $ctx->{blocks} complete blocks", "filter invoked $ctx->{invoked} times\n"; $filter->print($sig); } else { # store context for all but the last invocation $ctx->{data} = $data; $filter->ctx($ctx); } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); # just to make sure that print() flushes, or we would get the # count wrong local $| = 1; # make sure that # - we send big enough data so it won't fit into one buffer # - use chunk size which doesn't nicely fit into a buffer size, so # we have something to store in the context between filter calls my $blocks = 33; my $block_size = BLOCK_SIZE + 1; my $block = "x" x $block_size; for (1..$blocks) { $r->print($block); $r->rflush; # so the filter reads a chunk at a time } return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_ctx PerlResponseHandler TestFilter::out_str_ctx::response mod_perl-2.0.9/t/filter/TestFilter/out_str_declined.pm0000644000104000010010000000445412540623204023472 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_declined; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK DECLINED); use constant READ_SIZE => 1024; # make sure that if the input filter returns DECLINED without # reading/printing data the data flow is not broken sub decline { my $filter = shift; my $ctx = $filter->ctx; $ctx->{invoked}++; $filter->ctx($ctx); # can't use $f->seen_eos, since we don't read the data, so # we have to set the note on each invocation $filter->r->notes->set(invoked => $ctx->{invoked}); #warn "decline filter was invoked $ctx->{invoked} times\n"; return Apache2::Const::DECLINED; } # this filter ignores all the data that comes through, though on the # last invocation it prints how many times the filter 'decline' was called # which it could count by itself, but we want to test that # 'return Apache2::Const::DECLINED' works properly in output filters sub black_hole { my $filter = shift; my $ctx = $filter->ctx; $ctx->{invoked}++; $filter->ctx($ctx); #warn "black_hole filter was invoked $ctx->{invoked} times\n"; while ($filter->read(my $data, READ_SIZE)) { #warn "black_hole data: $data\n"; # let the data fall between the chairs } if ($filter->seen_eos) { my $invoked = $filter->r->notes->get('invoked') || 0; $filter->print($invoked); } return Apache2::Const::OK; } sub response { my $r = shift; # just to make sure that print() won't flush, or we would get the # count wrong local $| = 0; $r->content_type('text/plain'); for (1..10) { $r->print("a"); # this buffers the data $r->rflush; # this sends the data in the buffer + flush bucket } Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_declined PerlResponseHandler TestFilter::out_str_declined::response PerlOutputFilterHandler TestFilter::out_str_declined::decline PerlOutputFilterHandler TestFilter::out_str_declined::black_hole mod_perl-2.0.9/t/filter/TestFilter/out_str_eval.pm0000644000104000010010000000234012540623204022642 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_eval; # at some point there was a problem when eval {} in a non-filter # handler wasn't functioning when a filter was involved. the $@ value # was getting lost when t_cmp was doing print of debug values. and a # new invocation of a filter handler resets the value of $@. use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK DECLINED); # dummy pass_through filter was good enough to trigger the problem sub handler { return Apache2::Const::DECLINED; } sub response { my $r = shift; plan $r, tests => 1; # test that filters don't reset $@ eval { i_do_not_exist_really_i_do_not() }; # trigger the filter invocation, before using $@ $r->print("# whatever"); $r->rflush; ok t_cmp($@, qr/Undefined subroutine/, "some croak"); return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_eval PerlResponseHandler TestFilter::out_str_eval::response mod_perl-2.0.9/t/filter/TestFilter/out_str_lc.pm0000644000104000010010000000141212540623204022310 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_lc; use strict; use warnings FATAL => 'all'; use Apache2::Filter (); use TestCommon::Utils; use Apache2::Const -compile => 'OK'; sub handler { my $filter = shift; while ($filter->read(my $buffer, 1024)) { # test that read() returns tainted data die "read() has returned untainted data" unless TestCommon::Utils::is_tainted($buffer); $filter->print(lc $buffer); } Apache2::Const::OK; } 1; __DATA__ PerlOutputFilterHandler TestFilter::out_str_lc Alias /top_dir @top_dir@ mod_perl-2.0.9/t/filter/TestFilter/out_str_remove.pm0000644000104000010010000000322112540623204023207 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_remove; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK); use constant READ_SIZE => 1024; # this filter reads the first bb, upcases the data in it and removes itself sub upcase_n_remove { my $filter = shift; #warn "filter upcase_n_remove called\n"; while ($filter->read(my $buffer, 1024)) { $filter->print(uc $buffer); } $filter->remove; return Apache2::Const::OK; } # this filter inserts underscores after each character it receives sub insert_underscores { my $filter = shift; #warn "filter insert_underscores called\n"; while ($filter->read(my $buffer, 1024)) { $buffer =~ s/(.)/$1_/g; $filter->print($buffer); } return Apache2::Const::OK; } sub response { my $r = shift; # just to make sure that print() won't flush, or we would get the # count wrong local $| = 0; $r->content_type('text/plain'); $r->print("Foo"); $r->rflush; # this sends the data in the buffer + flush bucket $r->print("bar"); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_remove PerlResponseHandler TestFilter::out_str_remove::response PerlOutputFilterHandler TestFilter::out_str_remove::insert_underscores PerlOutputFilterHandler TestFilter::out_str_remove::upcase_n_remove mod_perl-2.0.9/t/filter/TestFilter/out_str_req_eos.pm0000644000104000010010000000337512540623204023361 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_req_eos; # here we test how EOS is passed from one streaming filter to another, # making sure that it's not lost use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); my $prefix = 'PREFIX_'; my $suffix = '_SUFFIX'; sub add_prefix { my $filter = shift; #warn "add_prefix called\n"; unless ($filter->ctx) { $filter->print($prefix); $filter->ctx(1); } while ($filter->read(my $buffer, 1024)){ #warn "add_prefix read: [$buffer]\n"; $filter->print($buffer); } Apache2::Const::OK; } sub add_suffix { my $filter = shift; #warn "add_suffix called\n"; while ($filter->read(my $buffer, 1024)){ #warn "add_suffix read: [$buffer]\n"; $filter->print($buffer); } if ($filter->seen_eos) { $filter->print($suffix); $filter->ctx(1); } Apache2::Const::OK; } sub handler { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::out_str_req_eos SetHandler modperl PerlResponseHandler TestFilter::out_str_req_eos PerlOutputFilterHandler TestFilter::out_str_req_eos::add_prefix PerlOutputFilterHandler TestFilter::out_str_req_eos::add_suffix mod_perl-2.0.9/t/filter/TestFilter/out_str_req_mix.pm0000644000104000010010000000521212540623204023360 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_req_mix; # in this test we verify that we can preserve the mixed order of # modperl and non-modperl filters using the PerlSetOutputFilter # directive, instead of SetOutputFilter for non-modperl filters. # # response handler prints a mangled SSI directive: # # (which it receives via POST from the client) # # adjust() filter is configured to be called first and it removes the # string 'REMOVE' from the response handler's output, so that SSI will # find the fixed resource specification: # # # the INCLUDES filter, which is configured to be next on the stack # (mod_include) processes the directive and returns the contents of # file "/includes/clear.shtml", which is: # This is a REMOVEclear text # # finally the second mod_perl filter (which happens to be the same # adjust() filter, but to all purposes it's a separate filter) # configured to run after the INCLUDES filter fixes the data sent by # the INCLUDES filter to be: # This is a clear text # # and this is what the client is expecting to receive # # WARNING: notice that the adjust() filter assumes that it'll receive # the word REMOVE in a single bucket, which is good enough for the # test because we control all the used filters and normally Apache # core filters won't split short data into several buckets. However # filter developers shouldn't make any assumptions, since any data can # be split by any of the upstream filters. use strict; use warnings FATAL => 'all'; use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); sub adjust { my $filter = shift; #warn "adjust called\n"; while ($filter->read(my $buffer, 1024)){ $buffer =~ s/REMOVE//; $filter->print($buffer); } Apache2::Const::OK; } sub handler { my $r = shift; $r->content_type('text/plain'); if ($r->method_number == Apache2::Const::M_POST) { $r->print(TestCommon::Utils::read_post($r)); } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::out_str_req_mix Options +Includes PerlOutputFilterHandler TestFilter::out_str_req_mix::adjust PerlSetOutputFilter INCLUDES PerlOutputFilterHandler TestFilter::out_str_req_mix::adjust SetHandler modperl PerlResponseHandler TestFilter::out_str_req_mix mod_perl-2.0.9/t/filter/TestFilter/out_str_reverse.pm0000644000104000010010000000427012540623204023372 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_reverse; # this filter tests how the data can be set-aside between filter # invocations. here we collect a single line (which terminates with a # new line) before we apply the reversing transformation. use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK M_POST); use constant BUFF_LEN => 2; use constant signature => "Reversed by mod_perl 2.0\n"; sub handler { my $f = shift; #warn "called\n"; my $leftover = $f->ctx; # We are about to change the length of the response body. Hence, we # have to adjust the content-length header. unless (defined $leftover) { # 1st invocation $f->r->headers_out->{'Content-Length'}+=length signature if exists $f->r->headers_out->{'Content-Length'}; } while ($f->read(my $buffer, BUFF_LEN)) { #warn "buffer: [$buffer]\n"; $buffer = $leftover . $buffer if defined $leftover; $leftover = undef; while ($buffer =~ /([^\r\n]*)([\r\n]*)/g) { $leftover = $1, last unless $2; $f->print(scalar(reverse $1), $2); } } if ($f->seen_eos) { $f->print(scalar reverse $leftover) if defined $leftover; $f->print(signature); } else { $f->ctx($leftover) if defined $leftover; } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); # unbuffer stdout, so we get the data split across several bbs local $_ = 1; if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); $r->print($_) for grep length $_, split /(.{5})/, $data; } return Apache2::Const::OK; } 1; __DATA__ PerlModule TestFilter::out_str_reverse PerlOutputFilterHandler TestFilter::out_str_reverse SetHandler modperl PerlResponseHandler TestFilter::out_str_reverse::response mod_perl-2.0.9/t/filter/TestFilter/out_str_subreq_default.pm0000644000104000010010000000346112540623204024725 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_subreq_default; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK); # include the contents of a subrequest # in the filter, a la mod_include's # sub include { my $filter = shift; unless ($filter->ctx) { # don't forget to remove the C-L header $filter->r->headers_out->unset('Content-Length'); $filter->ctx(1); } while ($filter->read(my $buffer, 1024)){ if ($buffer eq "\n") { my $sub = $filter->r->lookup_uri('/default_subrequest/subrequest.txt'); my $rc = $sub->run; } else { # send all other data along unaltered $filter->print($buffer); } } # add our own at the end if ($filter->seen_eos) { $filter->print("filter\n"); $filter->ctx(1); } return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->print("content\n"); $r->rflush; $r->print("\n"); $r->rflush; $r->print("more content\n"); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_subreq_default PerlResponseHandler TestFilter::out_str_subreq_default::response PerlOutputFilterHandler TestFilter::out_str_subreq_default::include Alias /default_subrequest @DocumentRoot@/filter SetHandler default-handler mod_perl-2.0.9/t/filter/TestFilter/out_str_subreq_modperl.pm0000644000104000010010000000363312540623204024744 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestFilter::out_str_subreq_modperl; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK); # include the contents of a subrequest # in the filter, a la mod_include's # sub include { my $filter = shift; unless ($filter->ctx) { # don't forget to remove the C-L header $filter->r->headers_out->unset('Content-Length'); $filter->ctx(1); } while ($filter->read(my $buffer, 1024)){ if ($buffer eq "\n") { my $sub = $filter->r->lookup_uri('/modperl_subrequest'); my $rc = $sub->run; } else { # send all other data along unaltered $filter->print($buffer); } } # add our own at the end if ($filter->seen_eos) { $filter->print("filter\n"); $filter->ctx(1); } return Apache2::Const::OK; } sub subrequest { my $r = shift; $r->content_type('text/plain'); $r->print("modperl subrequest\n"); return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->print("content\n"); $r->rflush; $r->print("\n"); $r->rflush; $r->print("more content\n"); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlModule TestFilter::out_str_subreq_modperl PerlResponseHandler TestFilter::out_str_subreq_modperl::response PerlOutputFilterHandler TestFilter::out_str_subreq_modperl::include SetHandler modperl PerlResponseHandler TestFilter::out_str_subreq_modperl::subrequest mod_perl-2.0.9/t/filter/TestFilter/with_subrequest.pm0000644000177200010010000000121312540623204021466 0ustar SteveNonepackage TestFilter::with_subrequest; use strict; use warnings FATAL => 'all'; use Apache2::Filter (); use Apache2::SubRequest (); use TestCommon::Utils; use Apache2::Const -compile => 'OK'; sub handler { my $f = shift; my $r = $f->r; my $subr; while ($f->read(my $buffer, 1024)) { $f->print(lc $buffer); if (!$subr) { $subr = $r->lookup_uri($r->uri); my $rc = $subr->run; } } Apache2::Const::OK; } 1; __DATA__ PerlOutputFilterHandler TestFilter::with_subrequest Alias /with_subrequest @top_dir@ mod_perl-2.0.9/t/filter/with_subrequest.t0000644000177200010010000000033212540623204017231 0ustar SteveNoneuse strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 1, need 'mod_alias'; my $location = "/with_subrequest/Makefile"; my $str = GET_BODY $location; ok $str !~ /[A-Z]/; mod_perl-2.0.9/t/hooks/0000755000104000010010000000000012540623204015350 5ustar AdministratorsNonemod_perl-2.0.9/t/hooks/access.t0000644000104000010010000000075712540623204017007 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 4, need 'HTML::HeadParser'; my $location = "/TestHooks__access"; ok ! GET_OK $location; my $rc = GET_RC $location; ok $rc == 403; ok GET_OK $location, 'X-Forwarded-For' => '127.0.0.1'; ok ! GET_OK $location, 'X-Forwarded-For' => '666.0.0.1'; mod_perl-2.0.9/t/hooks/authen_basic.t0000644000104000010010000000134412540623204020164 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 4, need need_lwp, need_auth, 'HTML::HeadParser'; my $location = "/TestHooks__authen_basic"; sok { ! GET_OK $location; }; sok { my $rc = GET_RC $location; $rc == 401; }; sok { GET_OK $location, username => 'dougm', password => 'foo'; }; # since LWP 5.815, the user agent retains credentials # tell Apache::TestRequest to reinitialize its global agent Apache::TestRequest::user_agent(reset => 1); sok { ! GET_OK $location, username => 'dougm', password => 'wrong'; }; mod_perl-2.0.9/t/hooks/authen_digest.t0000644000104000010010000000255012540623204020362 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 7, need need_lwp, 'auth_digest', 'HTML::HeadParser'; my $location = '/TestHooks__authen_digest'; { my $response = GET $location; ok t_cmp($response->code, 200, 'handler returned HTTP_OK'); my $wwwauth = $response->header('WWW-Authenticate'); t_debug('response had no WWW-Authenticate header'); ok (!$wwwauth); } { my $response = GET "$location?fail"; ok t_cmp($response->code, 401, 'handler returned HTTP_UNAUTHORIZED'); my $wwwauth = $response->header('WWW-Authenticate'); t_debug('response had a WWW-Authenticate header'); ok ($wwwauth); ok t_cmp($wwwauth, qr/^Digest/, 'response is using Digest authentication scheme'); ok t_cmp($wwwauth, qr/realm="Simple Digest"/, 'WWW-Authenticate header contains the proper realm'); ok t_cmp($wwwauth, qr/nonce="/, 'WWW-Authenticate header contains a nonce'); # other fields, such as qop, are added only if add additional # configuration directives, such as AuthDigestQop } mod_perl-2.0.9/t/hooks/authz.t0000644000104000010010000000125212540623204016670 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 4, need need_lwp, 'HTML::HeadParser'; my $location = "/TestHooks__authz"; ok ! GET_OK $location; my $rc = GET_RC $location; ok $rc == 401; ok GET_OK $location, username => 'dougm', password => 'foo'; # since LWP 5.815, the user agent retains credentials # tell Apache::TestRequest to reinitialize its global agent Apache::TestRequest::user_agent(reset => 1); ok ! GET_OK $location, username => 'jobbob', password => 'whatever'; mod_perl-2.0.9/t/hooks/cleanup.t0000644000104000010010000000275012540623204017170 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile catdir); use constant SIZE => 10; use constant TRIES => 20; my $file = catfile Apache::Test::vars("documentroot"), "hooks", "cleanup"; plan tests => 2; { # this registers and performs cleanups, but we test whether the # cleanup was run only in the next sub-test my $location = "/TestHooks__cleanup"; my $expected = 'ok'; my $received = GET_BODY $location; ok t_cmp($received, $expected, "register req cleanup"); } { # this sub-tests checks that the cleanup stage was run successfully # since Apache destroys the request rec after the logging has been # finished, we have to give it some time to get there # and fill in the file. (wait 0.25 .. 5 sec) my $t = 0; select undef, undef, undef, 0.25 until -e $file && -s _ == SIZE || $t++ == TRIES; unless (-e $file) { t_debug("can't find $file"); ok 0; } else { open my $fh, $file or die "Can't open $file: $!"; my $received = <$fh> || ''; close $fh; my $expected = "cleanup ok"; ok t_cmp($received, $expected, "verify req cleanup execution"); # XXX: while Apache::TestUtil fails to cleanup by itself unlink $file; } } mod_perl-2.0.9/t/hooks/cleanup2.t0000644000104000010010000000272312540623204017252 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use File::Spec::Functions qw(catfile catdir); use constant TRIES => 20; my $vars = Apache::Test::config->{vars}; my $dir = catdir $vars->{documentroot}, "hooks"; my $file = catfile $dir, "cleanup2"; plan tests => 2; { # cleanup, just to make sure we start with virgin state if (-e $file) { unlink $file or die "Couldn't remove $file"; } # this registers and performs cleanups, but we test whether the # cleanup was run only in the next sub-test my $location = "/TestHooks__cleanup2"; my $expected = 'cleanup2 is ok'; my $received = GET_BODY $location; ok t_cmp($received, $expected, "register req cleanup"); } { # this sub-tests checks that the cleanup stage was run successfully # which is supposed to remove the file that was created # # since Apache destroys the request rec after the logging has been # finished, we have to give it some time to get there # and remove in the file. (wait 0.25 .. 5 sec) my $t = 0; select undef, undef, undef, 0.25 until !-e $file || $t++ == TRIES; if (-e $file) { t_debug("$file wasn't removed by the cleanup phase"); ok 0; unlink $file; # cleanup } else { ok 1; } } mod_perl-2.0.9/t/hooks/error.t0000644000104000010010000000140512540623204016666 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 2; { my $location = "/TestHooks__error"; my $expected = qr/^Error: Undefined subroutine/; my $received = GET_BODY $location; ok t_cmp($received, $expected, "error-notes set on ErrorDocument"); } { my $error_seed_text = 'seed_text'; my $location = "/TestHooks__error?$error_seed_text"; my $expected = qr/^Error: \Q$error_seed_text\E, Undefined subroutine/; my $received = GET_BODY $location; ok t_cmp($received, $expected, "seeded error-notes set on ErrorDocument"); } mod_perl-2.0.9/t/hooks/hookrun.t0000644000104000010010000000142212540623204017221 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestHooks::hookrun'; my $config = Apache::Test::config(); my $path = Apache::TestRequest::module2path($module); Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); plan tests => 10; my $ret = GET "http://$hostport/$path?die"; ok t_cmp $ret->code, 500, '$r->die'; my $body = GET_BODY_ASSERT "http://$hostport/$path?normal"; for my $line (split /\n/, $body) { my ($phase, $value) = split /:/, $line; ok t_cmp $value, 1, "$phase"; } mod_perl-2.0.9/t/hooks/init.t0000644000104000010010000000110512540623204016475 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestHooks::init'; Apache::TestRequest::module($module); my $path = Apache::TestRequest::module2path($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); print GET_BODY_ASSERT "http://$hostport/$path"; mod_perl-2.0.9/t/hooks/inlined_handlers.t0000644000104000010010000000106112540623204021035 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use TestCommon::SameInterp; plan tests => 2, need 'HTML::HeadParser'; my $location = "/TestHooks__inlined_handlers"; my $expected = "ok"; for (1..2) { my $received = GET $location; ok t_cmp( $received->content, $expected, "anonymous handlers in httpd.conf test", ); } mod_perl-2.0.9/t/hooks/push_handlers.t0000644000104000010010000000116412540623204020376 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my @refs = qw(conf conf1 conf2 coderef full_coderef coderef1 coderef2 coderef3); my @anon = qw(anonymous anonymous1 coderef4 anonymous3); my @strings = (@refs, @anon); my $location = "/TestHooks__push_handlers"; my $expected = join "\n", @strings, ''; my $received = GET_BODY $location; ok t_cmp($received, $expected, "push_handlers ways"); mod_perl-2.0.9/t/hooks/push_handlers_anon.t0000644000104000010010000000072312540623204021411 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # the handler is configured in modperl_extra.pl via # Apache2::ServerUtil->server->add_config use Apache::TestUtil; use Apache::TestRequest 'GET_BODY_ASSERT'; my $module = 'TestHooks::push_handlers_anon'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/hooks/stacked_handlers.t0000644000104000010010000000070712540623204021037 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1; my $location = "/TestHooks__stacked_handlers"; my $expected = join "\n", qw(one two three), ''; my $received = GET_BODY $location; ok t_cmp($received, $expected, "stacked_handlers"); mod_perl-2.0.9/t/hooks/stacked_handlers2.t0000644000104000010010000000211212540623204021111 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest; use Apache::Test; use Apache::TestUtil; my $module = "TestHooks::stacked_handlers2"; Apache::TestRequest::module($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); my $path = Apache::TestRequest::module2path($module); my $location = "http://$hostport/$path"; t_debug("connecting to $location"); plan tests => 1; my $expected = q!ran 2 PerlPostReadRequestHandler handlers ran 1 PerlTransHandler handlers ran 1 PerlMapToStorageHandler handlers ran 4 PerlHeaderParserHandler handlers ran 2 PerlAccessHandler handlers ran 2 PerlAuthenHandler handlers ran 2 PerlAuthzHandler handlers ran 1 PerlTypeHandler handlers ran 4 PerlFixupHandler handlers ran 2 PerlResponseHandler handlers ran 2 PerlOutputFilterHandler handlers!; chomp(my $received = GET_BODY_ASSERT $location); ok t_cmp($received, $expected, "stacked_handlers"); mod_perl-2.0.9/t/hooks/startup.t0000644000104000010010000000143412540623204017241 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $config = Apache::Test::config(); my $path = Apache::TestRequest::module2path('TestHooks::startup'); my @modules = qw(default TestHooks::startup); plan tests => scalar @modules; my $expected = join '', "open_logs ok\n", "post_config ok\n"; for my $module (sort @modules) { Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); ok t_cmp(GET_BODY_ASSERT("http://$hostport/$path"), $expected, "testing PostConfig"); } mod_perl-2.0.9/t/hooks/TestHooks/0000755000104000010010000000000012540623204017273 5ustar AdministratorsNonemod_perl-2.0.9/t/hooks/TestHooks/access.pm0000644000104000010010000000245312540623204021076 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::access; # demonstrates the phases execution (sometimes users claim that # PerlInitHandler is running more than once # run with: # t/TEST -trace=debug -v hooks/access use strict; use warnings FATAL => 'all'; use APR::Table (); use Apache2::Access (); use Apache2::RequestRec (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK FORBIDDEN); my $allowed_ips = qr{^(10|127)\.}; sub handler { my $r = shift; my $fake_ip = $r->headers_in->get('X-Forwarded-For') || ""; debug "access: " . ($fake_ip =~ $allowed_ips ? "OK\n" : "FORBIDDEN\n"); return Apache2::Const::FORBIDDEN unless $fake_ip =~ $allowed_ips; Apache2::Const::OK; } sub fixup { debug "fixup\n"; Apache2::Const::OK } sub init { debug "init\n"; Apache2::Const::OK } 1; __DATA__ PerlModule TestHooks::access PerlAccessHandler TestHooks::access PerlInitHandler TestHooks::access::init PerlFixupHandler TestHooks::access::fixup PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl # # PerlAccessHandler TestHooks::access # mod_perl-2.0.9/t/hooks/TestHooks/authen_basic.pm0000644000104000010010000000252212540623204022257 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::authen_basic; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Access (); use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED SERVER_ERROR); use constant APACHE24 => have_min_apache_version('2.4.0'); sub handler { my $r = shift; my ($rc, $sent_pw) = $r->get_basic_auth_pw; return $rc if $rc != Apache2::Const::OK; my $user = $r->user; # We don't have to check for valid-user in 2.4.0+. If there is bug # in require valid-user handling, it will result in failed test with # bad username/password. if (!APACHE24) { my $requirement = $r->requires->[0]->{requirement}; return Apache2::Const::SERVER_ERROR unless $requirement eq 'valid-user'; } unless ($user eq 'dougm' and $sent_pw eq 'foo') { $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } Apache2::Const::OK; } 1; __DATA__ require valid-user AuthType Basic AuthName simple PerlAuthenHandler TestHooks::authen_basic PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl mod_perl-2.0.9/t/hooks/TestHooks/authen_digest.pm0000644000104000010010000000202112540623204022447 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::authen_digest; use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED); sub handler { my $r = shift; # we don't need to do the entire Digest auth round # trip just to see if note_digest_auth_failure is # functioning properly - see authen_digest.t for the # header checks if ($r->args) { $r->note_digest_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } $r->user("user"); $r->ap_auth_type("Digest"); return Apache2::Const::OK; } 1; __DATA__ PerlAuthenHandler TestHooks::authen_digest PerlResponseHandler Apache::TestHandler::ok SetHandler modperl require valid-user AuthType Digest AuthName "Simple Digest" mod_perl-2.0.9/t/hooks/TestHooks/authz.pm0000644000104000010010000000217712540623204020773 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::authz; use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED); sub auth_any { my $self = shift; my $r = shift; my ($res, $sent_pw) = $r->get_basic_auth_pw; return $res if $res != Apache2::Const::OK; unless($r->user and $sent_pw) { # testing $r->note_auth_failure: # AuthType Basic + note_auth_failure == note_basic_auth_failure; $r->note_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } return Apache2::Const::OK; } sub handler { my $r = shift; my $user = $r->user; return Apache2::Const::HTTP_UNAUTHORIZED unless $user; return Apache2::Const::HTTP_UNAUTHORIZED unless "dougm" eq $user; Apache2::Const::OK; } 1; __DATA__ require user dougm AuthType Basic AuthName simple PerlModule TestHooks::authz PerlAuthenHandler TestHooks::authz->auth_any PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl mod_perl-2.0.9/t/hooks/TestHooks/cleanup.pm0000644000104000010010000000270412540623204021263 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::cleanup; # test various ways to assign cleanup handlers use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use File::Spec::Functions qw(catfile); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK DECLINED); sub get_file { catfile Apache::Test::vars("documentroot"), "hooks", "cleanup"; } sub handler { my $r = shift; $r->content_type('text/plain'); $r->print('ok'); $r->pnotes(items => ["cleanup"," ok"]); $r->push_handlers(PerlCleanupHandler => \&cleanup2); return Apache2::Const::OK; } sub cleanup1 { my $r = shift; my $items = $r->pnotes('items'); die "no items" unless $items; my $item = $items ? $items->[0] : ''; #warn "cleanup CALLED\n"; t_write_file(get_file(), $item); return Apache2::Const::OK; } sub cleanup2 { my $r = shift; my $items = $r->pnotes('items'); my $item = $items ? $items->[1] : ''; #warn "cleanup2 CALLED\n"; t_append_file(get_file(), $item); return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlCleanupHandler TestHooks::cleanup::cleanup1 PerlResponseHandler TestHooks::cleanup mod_perl-2.0.9/t/hooks/TestHooks/cleanup2.pm0000644000104000010010000000247412540623204021351 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::cleanup2; # test the cleanup handler removing a temp file use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use File::Spec::Functions qw(catfile); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use APR::Pool (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => 'SUCCESS'; my $file = catfile Apache::Test::config->{vars}->{documentroot}, "hooks", "cleanup2"; sub handler { my $r = shift; $r->content_type('text/plain'); t_write_file($file, "cleanup2 is ok"); my $status = $r->sendfile($file); die "sendfile has failed" unless $status == APR::Const::SUCCESS; $r->pool->cleanup_register(\&cleanup, $file); return Apache2::Const::OK; } sub cleanup { my $file_arg = shift; debug_sub "called"; die "Can't find file: $file_arg" unless -e $file_arg; unlink $file_arg or die "failed to unlink $file_arg"; return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlResponseHandler TestHooks::cleanup2 mod_perl-2.0.9/t/hooks/TestHooks/error.pm0000644000104000010010000000173612540623204020771 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::error; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; use APR::Table (); sub handler { my $r = shift; my $args = $r->args(); if (defined($args) && $args ne '') { $r->notes->set('error-notes' => $args); } &bomb(); Apache2::Const::OK; } sub fail { my $r = shift; $r->print('Error: '.$r->prev->notes->get('error-notes')); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlResponseHandler TestHooks::error ErrorDocument 500 /TestHooks__error__fail SetHandler modperl PerlResponseHandler TestHooks::error::fail mod_perl-2.0.9/t/hooks/TestHooks/fixup.pm0000644000104000010010000000113612540623204020765 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::fixup; use strict; use warnings FATAL => 'all'; use Apache::Test; use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->notes->set(ok => 1); Apache2::Const::OK; } sub response { my $r = shift; plan $r, tests => 1; ok $r->notes->get('ok'); Apache2::Const::OK; } 1; __DATA__ PerlResponseHandler TestHooks::fixup::response SetHandler modperl mod_perl-2.0.9/t/hooks/TestHooks/headerparser.pm0000644000104000010010000000124312540623204022276 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::headerparser; use strict; use warnings FATAL => 'all'; use Apache::Test; use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->notes->set(headerparser => 'set'); Apache2::Const::OK; } sub response { my $r = shift; plan $r, tests => 1; ok $r->notes->get('headerparser') eq 'set'; Apache2::Const::OK; } 1; __DATA__ PerlOptions +SetupEnv PerlResponseHandler TestHooks::headerparser::response SetHandler modperl mod_perl-2.0.9/t/hooks/TestHooks/hookrun.pm0000644000104000010010000001074612540623204021326 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::hookrun; # this test runs all Apache phases from within the very first http # phase # XXX: may be improve the test to do a full-blown test, where each # phase does something useful. # see also TestProtocol::pseudo_http use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::HookRun (); use APR::Table (); use ModPerl::Util (); use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::Const -compile => qw(OK DECLINED DONE SERVER_ERROR); my $path = '/' . Apache::TestRequest::module2path(__PACKAGE__); my @phases = qw( PerlPostReadRequestHandler PerlTransHandler PerlMapToStorageHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlResponseHandler PerlLogHandler ); sub post_read_request { my $r = shift; my $rc; $r->push_handlers(PerlTransHandler => \&any); $r->push_handlers(PerlMapToStorageHandler => \&any); $r->push_handlers(PerlHeaderParserHandler => \&any); $r->push_handlers(PerlAccessHandler => \&any); $r->push_handlers(PerlAuthenHandler => \&any); $r->push_handlers(PerlAuthzHandler => \&any); $r->push_handlers(PerlTypeHandler => \&any); $r->push_handlers(PerlFixupHandler => \&any); $r->push_handlers(PerlLogHandler => \&any); any($r); # indicate that the post_read_request phase was run # for the full Apache logic for running phases starting from # post_read_request and ending with fixup see # ap_process_request_internal in httpd-2.0/server/request.c $rc = $r->run_translate_name; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_map_to_storage; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; # this must be run all a big havoc will happen in the following # phases $r->location_merge($path); $rc = $r->run_header_parser; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; my $args = $r->args || ''; if ($args eq 'die') { $r->die(Apache2::Const::SERVER_ERROR); return Apache2::Const::DONE; } $rc = $r->run_access_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_auth_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_check_user_id; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_type_checker; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_fixups; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; # $r->run_handler is called internally by $r->invoke_handler, # invoke_handler sets all kind of filters, and does a few other # things but it's possible to call $r->run_handler, bypassing # invoke_handler $rc = $r->invoke_handler; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; $rc = $r->run_log_transaction; return $rc unless $rc == Apache2::Const::OK or $rc == Apache2::Const::DECLINED; return Apache2::Const::DONE; # Apache runs ap_finalize_request_protocol on return of this # handler } sub any { my $r = shift; my $callback = ModPerl::Util::current_callback(); debug "running $callback\n"; $r->notes->set($callback => 1); # unset the callback that was already run $r->set_handlers($callback => []); Apache2::Const::OK; } sub response { my $r = shift; my @pre_response = (@phases)[0..($#phases-2)]; plan tests => scalar(@pre_response); for my $phase (@pre_response) { my $note = $r->notes->get($phase); $r->print("$phase:$note\n"); } Apache2::Const::OK; } 1; __END__ PerlModule TestHooks::hookrun PerlPostReadRequestHandler TestHooks::hookrun::post_read_request SetHandler modperl PerlResponseHandler TestHooks::hookrun::response AuthName modperl AuthType none Require valid-user mod_perl-2.0.9/t/hooks/TestHooks/init.pm0000644000104000010010000000244112540623204020575 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::init; use strict; use warnings FATAL => 'all'; use Apache::Test; use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK DECLINED); sub first { my $r = shift; $r->notes->set(ok1 => 1); Apache2::Const::OK; } sub second { my $r = shift; my $ok = $r->notes->get('ok1') || 0; $r->notes->set(ok2 => $ok + 1); Apache2::Const::OK; } sub handler { my $r = shift; my $ok = $r->notes->get('ok2') || 0; $r->notes->set(ok3 => $ok + 1); Apache2::Const::DECLINED; } sub response { my $r = shift; my $tests = 3; plan $r, tests => $tests; for my $x (1..$tests) { my $val = $r->notes->get("ok$x") || 0; ok $val == $x; } Apache2::Const::OK; } 1; __DATA__ PerlModule TestHooks::init PerlInitHandler TestHooks::init::first PerlInitHandler TestHooks::init::second PerlResponseHandler TestHooks::init PerlResponseHandler TestHooks::init::response SetHandler modperl mod_perl-2.0.9/t/hooks/TestHooks/inlined_handlers.pm0000644000104000010010000000162312540623204023135 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::inlined_handlers; # this test exercises httpd.conf inlined one-liner handlers, like: # PerlFixupHandler 'sub { use Apache2::Const qw(DECLINED); DECLINED }' # previously there was a bug in non-ithreaded-perl implementation # where the cached compiled CODE ref didn't have the reference count # right. use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->print('ok'); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlFixupHandler 'sub { use Apache2::Const qw(DECLINED); DECLINED }' PerlResponseHandler TestHooks::inlined_handlers mod_perl-2.0.9/t/hooks/TestHooks/push_handlers.pm0000644000104000010010000000410412540623204022467 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::push_handlers; # test various ways to push handlers use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK DECLINED DONE); sub handler { my $r = shift; $r->handler("modperl"); $r->push_handlers(PerlResponseHandler => \&coderef); $r->push_handlers(PerlResponseHandler => \&TestHooks::push_handlers::full_coderef); $r->push_handlers(PerlResponseHandler => [\&coderef1, __PACKAGE__.'::coderef2', \&coderef3]); $r->push_handlers(PerlResponseHandler => sub { return say(shift, "anonymous") }); $r->push_handlers(PerlResponseHandler => [sub { return say(shift, "anonymous1") }, \&coderef4, sub { return say(shift, "anonymous3") }, ]); $r->push_handlers(PerlResponseHandler => \&end); return Apache2::Const::DECLINED; } sub end { return Apache2::Const::DONE } sub say { shift->print(shift,"\n"); return Apache2::Const::DECLINED } sub conf { # this one is configured from httpd.conf my $r= shift; $r->content_type('text/plain'); return say($r, "conf"); } sub conf1 { return say(shift, "conf1") } sub conf2 { return say(shift, "conf2") } sub coderef { return say(shift, "coderef") } sub coderef1 { return say(shift, "coderef1") } sub coderef2 { return say(shift, "coderef2") } sub coderef3 { return say(shift, "coderef3") } sub coderef4 { return say(shift, "coderef4") } sub full_coderef { return say(shift, "full_coderef") } 1; __DATA__ SetHandler modperl PerlHeaderParserHandler TestHooks::push_handlers PerlResponseHandler TestHooks::push_handlers::conf PerlResponseHandler TestHooks::push_handlers::conf1 TestHooks::push_handlers::conf2 mod_perl-2.0.9/t/hooks/TestHooks/push_handlers_anon.pm0000644000104000010010000000335212540623204023506 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::push_handlers_anon; # in addition to other anon sub handler tests in push_handlers*, here # we test an anon sub added at the server startup. in order not to mess # with the rest of the test suite, we run it in its own vhost use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::ServerUtil (); use APR::Pool (); use Apache2::Const -compile => qw(OK DECLINED); use Apache::Test; use Apache::TestUtil; sub add_note { my $r = shift; my $count = $r->notes->get("add_note") || 0; $count++; $r->notes->set("add_note", $count); Apache2::Const::DECLINED; } # PerlFixupHandlers added at the server startup should add 3 notes sub handler { my $r = shift; plan $r, tests => 1; my $count = $r->notes->get("add_note") || 0; ok t_cmp $count, 3, "$count callbacks"; Apache2::Const::OK; } 1; __DATA__ # APACHE_TEST_CONFIG_ORDER 1000 PerlModule TestHooks::push_handlers_anon my $s = Apache2::PerlSections->server; $s->push_handlers(PerlFixupHandler => sub { &TestHooks::push_handlers_anon::add_note }); $s->push_handlers(PerlFixupHandler => \&TestHooks::push_handlers_anon::add_note ); $s->push_handlers(PerlFixupHandler => "TestHooks::push_handlers_anon::add_note" ); SetHandler modperl PerlResponseHandler TestHooks::push_handlers_anon mod_perl-2.0.9/t/hooks/TestHooks/push_handlers_blessed.pm0000644000104000010010000000166212540623204024176 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::push_handlers_blessed; # test that we # - can push and execute blessed anon handlers use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $r = shift; plan $r, tests => 1; my $sub = sub { ok 1; return Apache2::Const::OK; }; my $handler = bless $sub, __PACKAGE__; $r->push_handlers(PerlResponseHandler => $handler); return Apache2::Const::DECLINED; } 1; __DATA__ SetHandler modperl PerlResponseHandler TestHooks::push_handlers_blessed mod_perl-2.0.9/t/hooks/TestHooks/push_handlers_same_phase.pm0000644000104000010010000000363012540623204024657 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::push_handlers_same_phase; # test that we # - can push handlers into the same phase that is currently running # - cannot switch 'perl-script' to 'modperl' and vice versa once # inside the response phase use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $r = shift; my $counter = $r->notes->get('counter') || 0; $r->notes->set(counter => $counter+1); $r->push_handlers(PerlResponseHandler => \&real_response); return Apache2::Const::DECLINED; } sub real_response { my $r = shift; plan $r, tests => 3; # test that we don't rerun all the handlers again (it should no # longer happen as we don't allow switching 'perl-script' <=> # 'modperl' on the go, but test anyway) my $counter = $r->notes->get('counter') || 0; ok t_cmp($counter, 1, __PACKAGE__ . "::handler must have been called only once"); my @handlers = @{ $r->get_handlers('PerlResponseHandler') || []}; ok t_cmp(scalar(@handlers), 2, "there should be 2 response handlers"); # once running inside the response phase it shouldn't be possible # to switch from 'perl-script' to 'modperl' and vice versa eval { $r->handler("perl-script") }; ok t_cmp($@, qr/Can't switch from/, "can't switch from 'perl-script' to 'modperl' inside " . "the response phase"); return Apache2::Const::OK; } 1; __END__ SetHandler modperl PerlResponseHandler TestHooks::push_handlers_same_phase mod_perl-2.0.9/t/hooks/TestHooks/set_handlers.pm0000644000104000010010000000231612540623204022306 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::set_handlers; # test various ways to reset/unset handlers list use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # the first way to reset the handlers list is to pass undef # access handler phase will be not called for mp $r->set_handlers(PerlAccessHandler => undef); # the second way to reset the handlers list is to pass [] # fixup must be not executed $r->set_handlers(PerlFixupHandler => \&fixup); $r->set_handlers(PerlFixupHandler => []); # normal override $r->set_handlers(PerlResponseHandler => sub { die "not to be called"}); $r->set_handlers(PerlResponseHandler => [\&Apache::TestHandler::ok1]); $r->handler("modperl"); return Apache2::Const::OK; } sub fixup { die "fixup must not be executed"; } 1; __DATA__ PerlHeaderParserHandler TestHooks::set_handlers mod_perl-2.0.9/t/hooks/TestHooks/stacked_handlers.pm0000644000104000010010000000254112540623204023131 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::stacked_handlers; # this test exercises the execution of the stacked handlers and test # whether the execution breaks when something different than OK or # DECLINED is returned use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => qw(OK DECLINED DONE); sub handler { my $r = shift; $r->handler("modperl"); $r->push_handlers(PerlResponseHandler => [\&one, \&two, \&three, \&four]); return Apache2::Const::OK; } sub one { my $r = shift; $r->content_type('text/plain'); $r->print("one\n"); return Apache2::Const::DECLINED; } sub two { my $r = shift; $r->print("two\n"); return Apache2::Const::DECLINED; } sub three { my $r = shift; $r->print("three\n"); return Apache2::Const::DONE; } # this one shouldn't get called, because the handler 'three' has # returned DONE sub four { my $r = shift; $r->print("four\n"); return Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlHeaderParserHandler TestHooks::stacked_handlers mod_perl-2.0.9/t/hooks/TestHooks/stacked_handlers2.pm0000644000104000010010000001206112540623204023211 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::stacked_handlers2; # this test exercises the execution of the stacked handlers # connection, translation, authen, authz, type, and response # phases should end for the first handler that returns OK use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use ModPerl::Util (); use APR::Table; use Apache2::Const -compile => qw(OK DECLINED AUTH_REQUIRED SERVER_ERROR); sub ok { callback(shift); return Apache2::Const::OK; } sub ok_authen { my $r = shift; callback($r); $r->user("user"); $r->ap_auth_type("Basic"); return Apache2::Const::OK; } sub declined { callback(shift); return Apache2::Const::DECLINED; } sub auth_required { callback(shift); return Apache2::Const::AUTH_REQUIRED; } sub server_error { callback(shift); return Apache2::Const::SERVER_ERROR; } sub push_handlers { my $r = shift; $r->push_handlers(PerlFixupHandler => \&ok); callback($r); return Apache2::Const::OK; } sub callback { my $obj = shift; my ($r, $callback); if ($obj->isa('Apache2::Filter')) { $r = $obj->r; $callback = 'PerlOutputFilterHandler'; } else { $r = $obj } $callback ||= ModPerl::Util::current_callback; my $count = $r->notes->get($callback) || 0; $r->notes->set($callback, ++$count); } sub handler { my $r = shift; $r->content_type('text/plain'); callback($r); foreach my $callback (qw(PerlPostReadRequestHandler PerlTransHandler PerlMapToStorageHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlResponseHandler)) { my $count = $r->notes->get($callback) || 0; $r->print("ran $count $callback handlers\n"); } return Apache2::Const::OK; } sub passthru { my $filter = shift; unless ($filter->ctx) { callback($filter); $filter->ctx({seen => 1}); } while ($filter->read(my $buffer, 1024)) { $filter->print($buffer); } # this should be ignored? Apache2::Const::OK; } sub filter { my $filter = shift; unless ($filter->ctx) { callback($filter); $filter->ctx({seen => 1}); } while ($filter->read(my $buffer, 1024)) { $filter->print($buffer); } if ($filter->seen_eos) { my $count = $filter->r->notes->get('PerlOutputFilterHandler') || 0; $filter->print("ran $count PerlOutputFilterHandler handlers\n"); } # this should be ignored? Apache2::Const::OK; } 1; __DATA__ # create a new virtual host so we can test (almost all) all the hooks PerlModule TestHooks::stacked_handlers2 # all 2 run PerlPostReadRequestHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok # 1 run, 1 left behind PerlTransHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error # 1 run, 1 left behind PerlMapToStorageHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error # all 4 run PerlHeaderParserHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::declined PerlHeaderParserHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok # all 2 run PerlAccessHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok # 2 run, 1 left behind PerlAuthenHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok_authen PerlAuthenHandler TestHooks::stacked_handlers2::auth_required # 2 run, 1 left behind PerlAuthzHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2::ok PerlAuthzHandler TestHooks::stacked_handlers2::auth_required # 1 run, 1 left behind PerlTypeHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers3::server_error # all 4 run PerlFixupHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::ok PerlFixupHandler TestHooks::stacked_handlers2::push_handlers # 2 run, 2 left behind PerlResponseHandler TestHooks::stacked_handlers2::declined TestHooks::stacked_handlers2 PerlResponseHandler TestHooks::stacked_handlers2::ok TestHooks::stacked_handlers2::server_error SetHandler modperl AuthType Basic Require valid-user PerlOutputFilterHandler TestHooks::stacked_handlers2::passthru TestHooks::stacked_handlers2::filter mod_perl-2.0.9/t/hooks/TestHooks/startup.pm0000644000104000010010000000730612540623204021341 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::startup; # test PerlPostConfigHandler and PerlOpenLogsHandler phases # also test that we can run things on vhost entries from these phases use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache::TestTrace; use APR::Table; use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::RequestRec (); use Apache2::RequestIO (); use File::Spec::Functions qw(catfile catdir); use File::Path qw(mkpath); use Apache2::Const -compile => 'OK'; my $dir = catdir Apache::Test::vars("documentroot"), 'hooks', 'startup'; sub open_logs { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; # main server run("open_logs", $s); for (my $vhost_s = $s->next; $vhost_s; $vhost_s = $vhost_s->next) { my $port = $vhost_s->port; my $val = $vhost_s->dir_config->{PostConfig}; # we have one vhost that we want to run open_logs for next unless $val && $val eq 'VHost'; run("open_logs", $vhost_s); } Apache2::Const::OK; } sub post_config { my ($conf_pool, $log_pool, $temp_pool, $s) = @_; # main server run("post_config", $s); for (my $vhost_s = $s->next; $vhost_s; $vhost_s = $vhost_s->next) { my $port = $vhost_s->port; my $val = $vhost_s->dir_config->{PostConfig}; # we have one vhost that we want to run post_config for next unless $val && $val eq 'VHost'; run("post_config", $vhost_s); } Apache2::Const::OK; } sub run { my ($phase, $s) = @_; my $val = $s->dir_config->{PostConfig} or die "Can't read PostConfig var"; # make sure that these are set at the earliest possible time die '$ENV{MOD_PERL} not set!' unless $ENV{MOD_PERL}; die '$ENV{MOD_PERL_API_VERSION} not set!' unless $ENV{MOD_PERL_API_VERSION} == 2; my $port = $s->port; my $file = catfile $dir, "$phase-$port"; mkpath $dir, 0, 0755; open my $fh, ">$file" or die "can't open $file: $!"; print $fh $val; close $fh; debug "Phase $phase is completed for server at port $port"; } sub handler { my $r = shift; $r->content_type('text/plain'); my $s = $r->server; my $expected = $s->dir_config->{PostConfig} or die "Can't read PostConfig var"; my $port = $s->port; for my $phase (qw(open_logs post_config)) { my $file = catfile $dir, "$phase-$port"; open my $fh, "$file" or die "can't open $file: $!"; my $received = <$fh> || ''; close $fh; # can't cleanup the file here, because t/SMOKE may run this # test more than once, so we cleanup on startup in modperl_extra.pl # unlink $file; if ($expected eq $received) { $r->print("$phase ok\n"); } else { warn "phase: $phase\n"; warn "port: $port\n"; warn "expected: $expected\n"; warn "received: $received\n"; } } Apache2::Const::OK; } 1; __DATA__ PerlSetVar PostConfig VHost PerlModule TestHooks::startup PerlPostConfigHandler TestHooks::startup::post_config PerlOpenLogsHandler TestHooks::startup::open_logs SetHandler modperl PerlResponseHandler TestHooks::startup PerlSetVar PostConfig Main PerlModule TestHooks::startup PerlPostConfigHandler TestHooks::startup::post_config PerlOpenLogsHandler TestHooks::startup::open_logs SetHandler modperl PerlResponseHandler TestHooks::startup mod_perl-2.0.9/t/hooks/TestHooks/trans.pm0000644000104000010010000000206412540623204020762 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestHooks::trans; use strict; use warnings FATAL => 'all'; use Apache::TestConfig (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK DECLINED); my %trans = ( '/TestHooks/trans.pm' => sub { my $r = shift; $r->filename(__FILE__); Apache2::Const::OK; }, '/phooey' => sub { my $r = shift; $r->filename(__FILE__); #filename is currently required $r->uri('/TestHooks::trans'); Apache2::Const::OK; }, ); sub handler { my $r = shift; my $uri = $r->uri; my $handler = $trans{ $uri }; return Apache2::Const::DECLINED unless $handler; $handler->($r); } 1; __DATA__ PerlTransHandler TestHooks::trans PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl mod_perl-2.0.9/t/hooks/trans.t0000644000104000010010000000144412540623204016667 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::Const ':common'; my $module = 'TestHooks::trans'; Apache::TestRequest::module($module); my $path = Apache::TestRequest::module2path($module); my $config = Apache::Test::config(); my $hostport = Apache::TestRequest::hostport($config); t_debug("connecting to $hostport"); plan tests => 3, need 'HTML::HeadParser'; t_client_log_error_is_expected(); ok t_cmp GET_RC("http://$hostport/nope"), NOT_FOUND; my $body = GET_BODY "http://$hostport/TestHooks/trans.pm"; ok $body =~ /package $module/; ok GET_OK "http://$hostport/phooey"; mod_perl-2.0.9/t/htdocs/0000755000104000010010000000000012540623174015517 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/api/0000755000104000010010000000000012540623204016262 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/api/auth-groups0000644000177200010010000000003212540623204016555 0ustar SteveNonebar: goo bar tar: mar far mod_perl-2.0.9/t/htdocs/api/auth-users0000644000177200010010000000012412540623204016401 0ustar SteveNonegoo:$apr1$g.mxW/..$p8ILT9D4345OO6vtYt8mT0 bar:$apr1$ALRiO/..$GxXWAshiDKPmFGUA7r66e/ mod_perl-2.0.9/t/htdocs/api/custom_response.txt0000644000177200010010000000004312540623204020347 0ustar SteveNoneThis is a custom file/url response mod_perl-2.0.9/t/htdocs/api/slurp.pl0000644000104000010010000000037412540623204017770 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- my $z = <
footer
mod_perl-2.0.9/t/htdocs/includes/header.shtml0000644000177200010010000000024612540623204017721 0ustar SteveNone <!--#echo var="QUERY_STRING" -->

mod_perl-2.0.9/t/htdocs/includes/test.shtml0000644000177200010010000000044512540623204017451 0ustar SteveNone

[back]

mod_perl-2.0.9/t/htdocs/includes-registry/0000755000104000010010000000000012540623205021166 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/includes-registry/cgipm.pl0000644000104000010010000000037312540623205022625 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache2::compat (); use CGI (); my $cgi = CGI->new; print $cgi->header; print "cgi.pm\n"; __END__ mod_perl-2.0.9/t/htdocs/includes-registry/test.pl0000644000104000010010000000032212540623205022477 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- print "Content-type: text/html\n\n"; print "Hello World
\n"; mod_perl-2.0.9/t/htdocs/includes-registry/test.spl0000644000177200010010000000110512540623205020761 0ustar SteveNoneuse strict; #XXX: this test needs to be more robust. #various output buffers spread across multiple prints #more mod_include features mixed and checking that the output #is *exactly* what we expected, not just matching a few patterns. print "Content-type: text/html\n\n"; my $r = shift; my $test_string = 'Perl-SSI'; $r->subprocess_env->set(MY_TEST => $test_string); print <
Local date is
Brought to you by
EOF mod_perl-2.0.9/t/htdocs/merge3/0000755000104000010010000000000012540623205016674 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/merge3/htaccess0000644000177200010010000000034712540623205016517 0ustar SteveNone# htaccess file for t/response/TestModperl/merge.pm PerlSetEnv MergeSetEnv3 SetEnv3Merge3Val PerlSetVar MergeSetVar3 SetVar3Merge3Val PerlSetVar MergeAddVar3 AddVar3Merge3Val1 PerlAddVar MergeAddVar3 AddVar3Merge3Val2 mod_perl-2.0.9/t/htdocs/modperl/0000755000104000010010000000000012540623172017157 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/modperl/setupenv2/0000755000104000010010000000000012540623205021107 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/modperl/setupenv2/config_require.pl0000644000104000010010000000050112540623205024441 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- TestModperl::setupenv2::register_mixed(); TestModperl::setupenv2::register_perl(); $ENV{EnvChangeMixedTest} = "config_require"; $ENV{EnvChangePerlTest} = "config_require"; 1; mod_perl-2.0.9/t/htdocs/modperl/setupenv2/module.pm0000644000104000010010000000054512540623205022736 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package htdocs::modperl::setupenv2::module; TestModperl::setupenv2::register_mixed(); TestModperl::setupenv2::register_perl(); $ENV{EnvChangeMixedTest} = "perlmodule"; $ENV{EnvChangePerlTest} = "perlmodule"; 1; mod_perl-2.0.9/t/htdocs/modperl/setupenv2/post_config_require.pl0000644000104000010010000000051312540623205025511 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- TestModperl::setupenv2::register_mixed(); TestModperl::setupenv2::register_perl(); $ENV{EnvChangeMixedTest} = "post_config_require"; $ENV{EnvChangePerlTest} = "post_config_require"; 1; mod_perl-2.0.9/t/htdocs/modperl/setupenv2/require.pl0000644000104000010010000000046312540623205023123 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- TestModperl::setupenv2::register_mixed(); TestModperl::setupenv2::register_perl(); $ENV{EnvChangeMixedTest} = "require"; $ENV{EnvChangePerlTest} = "require"; 1; mod_perl-2.0.9/t/htdocs/perlio/0000755000104000010010000000000012540623205017004 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/perlio/MoonRise.jpeg0000644€ÿÿÿÿ00010010000001172211727205002021121 0ustar ????????NoneÿØÿàJFIF``ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ‰Í"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ùþ—RÐqF)ÔPqF)Ô´ÜQŠZZnÓFÓN ŠnÓFÓO h»µOµkYøU¾¶ûE½”A+aý  Sº³¸³“eÄLÛ<ƒô#ƒ@\©´Ñ´Óé=è»MM:Šn(Å>’€Š1N¤ Å§Q@ Å&)Ԙ†Z1Å-%§b€(´¦Š0h¸4cŠ~ .ÒE3¸æ·Ö—gÒ€#ë[Ó#ÖÊe‚äÜê„©ùW=óíZ(µL¥nm£§`ŒÒàzÖVf£ïKŽiØsF:÷¢À6jLZLQE€b¤Û“ÔQ´Ðtb¤Úi6œô Rb¤Á¤Á )ô $ ]ŒÝiÂ{WLp³dó!¿(ïFåô&¥x·>•´p3dûDWÝÏ @cýÑVÅ·µ8[{V«/dº¨¥óžômcÞ¯‹jpµö­V\ÉöÈÏÚǹüèòϽi ojwÙ½ªÖ^/lŒ¿(ôÅ(„úV µö§}—Ú­eâöÆW”}(òMk}›Ú²ŸJ¯ìñ{s'É>”žIô­²ûQö_jÙÈ=¹“äŸCA„úV·ÙI£ì§ÒìôÜÉòO¥'’}+_ì§Ò²ŸJ?³{s#É>”y$tëZßeö£ì§Ò—örndyMK±½Mjý”úR}”úTÿf¡ûs+kúš_Òµ ±ô¤û)ô¨yj·-O§2ÚJè£Ó"ã’jÜzd>™Åz©SG+œ™Ë­™=ªE±'µuÑé–ý6Õ¤Ómÿç—ó§Í/xâÖÁðÔƒOlýÞk¸L‡<[“øU¤ÓcÿE£ÛA Ò8§7÷MJºc÷kÐÆ1öQŸ\а–iÚ¾±Ð9eÜóµÒ˜ÿ ©äýÃùW£-¨Ï§à*E´ÿa*—Š]ƒÙÈó‘¢ÊGŸÊ¤Ǥ-ùW£ <ÿ?…H,úp£ð©úßý“<ähôò[ò£ûùäÕé×·Ëù F´Þð¥õ°öO¹ç#Ã÷óÄÒÎO^‰ö,¼*hôø&Fzb“ÆXj‹}O6>¸RA‹ÞøGçòνK½ŽY=Oz‚K9áæ…‹lü#ót(ãJ|=(v¦̬OÖ£h\d*çÕ_Ybök¹ÆÉè)ãÃr°'tCêâ»mrW!ãÑ)ÖÖó¼ŸC}9l†áœTK,˜Häzn§‡î¸úRùƒ™q虄HÓF¬G LJ֫­ƒH&5 ñ¹‡?UÜOi1Zc¶>òÊ?àU 3]FçĦ×cžž˜4ù¶Ìÿhã&„¤·5áÕ¡·$vt u¨åÖ¬ äîñô5‰quÒnÚªp2'qõª4A²rG¥ «+ÛÉךÂ\#(.3êÆ³]'ÚÇ2.Ñ“ò‘z®!9 ã9àÔS^ÆL¤·“ÐzV±¥Ë¢D¹ßqd–Qÿ/-Å2_´ÆP¹q½C)'¨üê´“Fyù³õ¦IxHU.ÅW '¥iÈÌù‚9-ær °vU%›nâ@÷Ç@*Ó¼w80Ú:m£¯ÖªéúýÖž%û+Gœ0äD9ÿ9¡u9d•¤–Ffc–ã>´”e}¿¹£cwOÒÖHîÖHc˜€Aê0:žÕ]Ò(‰ƒ.N àU¼Õ6™‡SœäÒùÁÆLŽHîýt(J÷lNJÖHÑŠXó5G¾*Èg\0d*{® fA%¨Èš'sŒ >Ü~†µàÕìmãt‡K€ŒÆîÎÄqïíS4ÖÊà¬÷’;eAèH#sÈüñUSP…$ß´h{a›ƒùÓ…è2ïÄ=€ :N/±:a€rz`Õ›{y®FaecïäÖ{]´³yƒj8N_ƒY•'‚Y7òX˜Ç?Z‰)ÛD8òßQ÷·vŽÉ=¼ˆTu+‘ùô¨„Ïë[2xÚãfÏ.?sŠÆ¹Ôa¼Ÿ{D±d ˜ÔO­ehþ8•%ð±Âg= ?CJóH„m¼w¥o®ÙÃföÆ)œÀf+{€?ȃ[³–Ú+{Ëf¹°-÷âGJži_á+–=$d<Ùë"ý*äa×󭸵m…»éÁÆNIàžsútª¨é®!±dpCbðçµZ›þV'üÆKJÄcxôëÖ¡bì¬Ã¸ÜGAšÞ¸Ö´ýM•.­íжKÊ [ê*¨¼Óm/^xãI"dÚЃò°=åÛÚ­T•µŽ¢p]ÌVnOÌ?:ŒžûÀí[+¦Úêé0¬q¤ŒAŒK(ñŒç¨çô§[xbKŸµåÂGnÛD›r$>Ã<ŒsWí –º²—CŸ~I犀’[±Ÿq]e·‡`ºµ¡ò\ù›dcžðçŽôMimg§È³é¡V b}Ø%›vxïϨéKë1Ùì^ìäI-·$Nj†EÚpăèke糂HßO±ž·d—rT©+ÏläÔ×ÚŽ•w¨Í6±c!¸;C42ñÀÇcƒÆ+_jï±<‹¹Ì±'ç$uéP¾ÌðÀ¥^•4ósvž|¾aÛ¶M½IÀËšéSÂ01½”†XÎþ}G¸È§:ñ§ñ 4e=<Œÿ´?:¶ŠOü´þûçx/$’Q²2mP ÇN?•]’ÚÍ£·’Ûäfdàá³èLWí;’¡r$Æôÿ¾‡5rÂÊKˈáV_˜àAÅZ-¤—-Z¤^^Ü©“#-ÆAß8>Ô‘é’–"+t•ãzÍÇ×Ö§Ú¦´e*vz£jO_œµ”±Ü¡”g ñ«–Þ¾)þÆ&Î ½;ô¬›=sS°ƒÊ¶Ìj2q·qóÚŸ7Šu—P­}sµÆ@Q·#ÛŽz\Ïë/DÑ¥©nÑ6­¡>“,¡nDÑÇŒ‘sØöýk(>?*EmFîi 1ÜLWæ‘NXŒwÅMkª¤,k4p§#(7}+xó(ÙêÌš‹zh"Ê}jA)õ&¶íáÓu¨R(íÅ«)rB¶}=kf@P %˜±n e{öàæ±ž*œ>=j„žÇeüé¸=x­]Ãw:$ŠvI=»ýÉW×ÐZÅx'‰CI¨§¡eÀ5¬*Bkš/C9EÅÙ“y߇ҵ:ò®Gz«žõ»€‡@’þêäÛËŸÝ«ãi×½œ ½àŒ[ØÎ[«ƒ† ¦qýiææá²!cÓ¢²Ùp7lܤà7;MFBnû‹WȘG·»d2 |©Éù9ªNì¤FZ­–Œü¬ÊÙr?•5¤“¡.ÙìX𥠢âjD…|³ŒŽÆ¦„à™#ÝÓæ*>£iúeõä/$2Ú¤kÃ,²?‘ëøWG¦NL«¬_[˜Ìx R°äwü+ ³ŒvW5„[ÝØ¥i­Á“TØÌG™H8äŽyçÖŸ¨é‰muæ\^=Ö—üfÚMÍvÜPzvëÚ´äÔ|'d\Æ­3rrŠO®p{q\Ÿˆ5M&òE}6ÒKWÆk… ;e@®z|󞉥èk'ǥͻŸ }…ZÞÖê;/Œ€Ã¸ÉÇéÞ¹á}-ˈeœlv ó(èMgùŠs»sqÙ±Q4‰×kþð=þ•Û +výNyUm±Ñm,mS¨C)iÅ$2…lc£Ó<Ö‚[›´KøIÍ»º)d’d'éÇùüëÍbG˜n08ö¬¥…”¾Ö¾…ªéh‘V¡p¤…ç9«öëv$!bf)ó×§z‹JþÎ$‹Ï7£)Æ:úg4éd¶ ¶È ÑÉÁo¨®žfݬek+—|Õ2ª\À°í?6R>ü“¬gÄJ« äÅåùQ9ë¸ã?hˆî~Ì¢æÍDíÃyc’=ê^ƒZ–¯yÑß«më‰NT>q@¿¼‹oúNvð6¾Ÿj¦²³8Ž8rO Ôóy®gÓ„hŠŒ ö&—.º¡ÜÓÓ¼Ae1–ö’›HÇuéõ§Ë¯<îòÏ´²»îi Y»rqX‹<\æúOnýzšr̃?"ŸJNŒ[½µhûŒ~)ŸÌ–ÎÙä8Ëy{{cñÿëUŸøN®ÔþåÌyì0ÏsÍpí2¸"¯ÐRnãµdðtžè¯o.çS/ˆd¾¹Sy4ì¹ÇÌFÑõWM¦ÞéÖÜÄðî_pŽjó‚3œÔ±K±SÈ©©„Œ•“±Q¬Ó»=/WðÖŸ­i¯y§$6ÓrÊã?Þôú×eª\é*–×¶¬#Ù pA ýEC¿y͵YBàÚ¨I4²o‘ƒž™eùŠšT'á7uÐr©Þ:3Öt§°Ôl Ù 3B£÷@ ù~Ÿ­`ßøÖG³Jöòä•LîB;c¸®vËÅ·Ö–‘ÛFшãû£gNþÔš‡‹µ+°3:½ §ù×4p؈M¸;#WVœ–¨Â¾²»²žxäñÁ`§A¥?O­o'Š5(™Ø\üλKíôÉê>µJçZ’äþú Gêr`\äã'#¿½(:›I’QèÉ´½ëYƒþ%ÓÃ%Ç$Û³Øúþ|}*ׇ4§Õnä³¹¶‘e^<.Óò¤ç¦È>äU]7ÄSi—>}¬0Býö¦ü3Š}Ç‹õ[‰|϶4lÄ¡8ü+9Æ»º[~F‘tÕ™ézv‡mb]¼”fC¬Ç%ºg$ךø¿GµÓõö$ùRd´h¹ŸNJϹ×õ€LºËgœ8ü«.[©‹4ÒêXÖx|-Zs攇V´d¬‘$ž^ý³;w`ã>ŸZ„î‚§^¿.Uq]“#xäš².&a˶š«CZ¶þüÍ)Yj5©T– eÔ.?•=Z0~aøÿOwÿÓÿ×Süê :­ Q,ÏIH?CKæÛdcŽ3Àª_ãRᣔ9‰÷äôñ£v^*1ßëH>õ¹1qŽ´Â˜z¥ ë@îHšÒßõ¨Û·ÒšzS°\VnO57rh=éßðªHA»é»ÎO4‡©¦”ì€s9oZzc}Óþ{Óµ€F8¦1â”õ4×û´€a"›¸ ;Šg¯ÔÐÿÙ mod_perl-2.0.9/t/htdocs/perlio/redrum.txt0000644000177200010010000000054012540623205017141 0ustar SteveNoneALL wORk and NO play mAKes Jack A dull BoY. ALl WORK and no plAy makEs JaCk a dULl boY. All wORk AND no PLAy mAkes JACk A DULL boy. AlL WORK and nO play MAKES JacK a dUlL bOy. ALL wOrK ANd no PLAY makes JACk A dULl Boy. All woRk and NO play mAKes Jack a Dull BOY. alL work and no pLaY makeS JaCk a dull boy. aLL wORK aND nO pLAY mAKES Jack A dULL bOY. mod_perl-2.0.9/t/htdocs/protocols/0000755000104000010010000000000012540623205017536 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/protocols/basic-auth0000644000177200010010000000005312540623205017576 0ustar SteveNonestas:$apr1$qnKIk...$TRSGo5zlwo3LMc0R/iLWo/ mod_perl-2.0.9/t/htdocs/TestAPI__add_config/0000755000104000010010000000000012540623205021257 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/TestAPI__add_config/htaccess0000644000177200010010000000002712540623205021075 0ustar SteveNoneTestAddConfig Htaccess mod_perl-2.0.9/t/htdocs/vhost/0000755000104000010010000000000012540623205016655 5ustar AdministratorsNonemod_perl-2.0.9/t/htdocs/vhost/post_config.pl0000644000104000010010000000044612540623205021530 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache2::ServerUtil (); $TestVhost::config::restart_count = Apache2::ServerUtil::restart_count(); 1; mod_perl-2.0.9/t/htdocs/vhost/startup.pl0000644000104000010010000000173412540623205020721 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use warnings; use strict; use Apache2::ServerUtil (); use Apache2::ServerRec (); use File::Spec::Functions qw(catdir); # base server # XXX: at the moment this is wrong, since it return the base server $s # and not the vhost's one. needs to be fixed. my $s = Apache2::ServerUtil->server; my $vhost_doc_root = catdir Apache2::ServerUtil::server_root, qw(htdocs vhost); # testing $s->add_config() in vhost my $conf = <<"EOC"; # must use PerlModule here to check for segfaults # and that the module is loaded by vhost PerlModule TestVhost::config PerlSetVar DocumentRootCheck $vhost_doc_root SetHandler modperl PerlResponseHandler TestVhost::config::my_handler EOC $s->add_config([split /\n/, $conf]); # this used to have problems on win32 $s->add_config(['', '1;', '']); 1; mod_perl-2.0.9/t/lib/0000755000104000010010000000000012540623173015000 5ustar AdministratorsNonemod_perl-2.0.9/t/lib/TestAPRlib/0000755000104000010010000000000012540623205016745 5ustar AdministratorsNonemod_perl-2.0.9/t/lib/TestAPRlib/base64.pm0000644000104000010010000000130712540623205020370 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::base64; # testing APR::Base64 API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Base64; sub num_of_tests { return 3; } sub test { my $str = '12345qwert!@#$%'; my $encoded = APR::Base64::encode($str); t_debug("encoded string: $encoded"); ok t_cmp($encoded, 'MTIzNDVxd2VydCFAIyQl', 'encode'); ok t_cmp(APR::Base64::encode_len(length $str), length $encoded, "encoded length"); ok t_cmp(APR::Base64::decode($encoded), $str, "decode"); } 1; mod_perl-2.0.9/t/lib/TestAPRlib/brigade.pm0000644000104000010010000000540112540623205020700 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::brigade; # testing APR::Brigade in this tests. # Other tests do that too: # TestAPR::flatten : flatten() # TestAPR::bucket : is_empty(), first(), last() use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Pool (); use APR::Brigade (); use APR::Bucket (); use APR::BucketAlloc (); use Apache2::Const -compile => 'OK'; sub num_of_tests { return 14; } sub test { my $p = APR::Pool->new(); my $ba = APR::BucketAlloc->new($p); # basic + pool + destroy { my $bb = APR::Brigade->new($p, $ba); t_debug('$bb is defined'); ok defined $bb; t_debug('$bb ISA APR::Brigade object'); ok $bb->isa('APR::Brigade'); my $pool = $bb->pool; t_debug('$pool is defined'); ok defined $pool; t_debug('$pool ISA APR::Pool object'); ok $pool->isa('APR::Pool'); t_debug("destroy"); $bb->destroy; ok 1; } # concat / split / length / flatten { my $bb1 = APR::Brigade->new($p, $ba); $bb1->insert_head(APR::Bucket->new($ba, "11")); $bb1->insert_tail(APR::Bucket->new($ba, "12")); my $bb2 = APR::Brigade->new($p, $ba); $bb2->insert_head(APR::Bucket->new($ba, "21")); $bb2->insert_tail(APR::Bucket->new($ba, "22")); # concat $bb1->concat($bb2); # bb1: 11, 12, 21, 22 ok t_cmp($bb1->length, 8, "total data length in bb"); my $len = $bb1->flatten(my $data); ok t_cmp($len, 8, "bb flatten/len"); ok t_cmp($data, "11122122", "bb flatten/data"); t_debug('$bb2 is empty'); ok $bb2->is_empty; # split my $b = $bb1->first; # 11 $b = $bb1->next($b); # 12 my $bb3 = $bb1->split($b); # bb1: 11, bb3: 12, 21, 22 $len = $bb1->flatten($data); ok t_cmp($len, 2, "bb1 flatten/len"); ok t_cmp($data, "11", "bb1 flatten/data"); $len = $bb3->flatten($data); ok t_cmp($len, 6, "bb3 flatten/len"); ok t_cmp($data, "122122", "bb3 flatten/data"); } # out-of-scope pools { my $bb1 = APR::Brigade->new(APR::Pool->new, $ba); $bb1->insert_head(APR::Bucket->new($ba, "11")); $bb1->insert_tail(APR::Bucket->new($ba, "12")); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK my $len = $bb1->flatten(my $data); ok t_cmp($data, "1112", "correct data"); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/bucket.pm0000644000104000010010000001401012540623205020554 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::bucket; # a mix of APR::Bucket and APR::BucketType tests use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use TestCommon::Utils; use APR::Pool (); use APR::Bucket (); use APR::BucketAlloc (); use APR::BucketType (); use APR::Table (); use APR::Const -compile => 'SUCCESS'; sub num_of_tests { return 21; } sub test { my $pool = APR::Pool->new(); my $ba = APR::BucketAlloc->new($pool); # new: basic { my $data = "foobar"; my $b = APR::Bucket->new($ba, $data); t_debug('$b is defined'); ok defined $b; t_debug('$b ISA APR::Bucket object'); ok $b->isa('APR::Bucket'); my $type = $b->type; ok t_cmp $type->name, 'mod_perl SV bucket', "type"; ok t_cmp $b->length, length($data), "modperl b->length"; } # new: offset { my $data = "foobartar"; my $offset = 3; my $real = substr $data, $offset; my $b = APR::Bucket->new($ba, $data, $offset); my $rlen = $b->read(my $read); ok t_cmp $read, $real, 'new($data, $offset)/buffer'; ok t_cmp $rlen, length($read), 'new($data, $offset)/len'; ok t_cmp $b->start, $offset, 'offset'; } # new: offset+len { my $data = "foobartar"; my $offset = 3; my $len = 3; my $real = substr $data, $offset, $len; my $b = APR::Bucket->new($ba, $data, $offset, $len); my $rlen = $b->read(my $read); ok t_cmp $read, $real, 'new($data, $offset, $len)/buffer'; ok t_cmp $rlen, length($read), 'new($data, $offse, $lent)/len'; } # new: offset+ too big len { my $data = "foobartar"; my $offset = 3; my $len = 10; my $real = substr $data, $offset, $len; my $b = eval { APR::Bucket->new($ba, $data, $offset, $len) }; ok t_cmp $@, qr/the length argument can't be bigger than the total/, 'new($data, $offset, $len_too_big)'; } # modification of the source variable, affects the data # inside the bucket { my $data = "A" x 10; my $orig = $data; my $b = APR::Bucket->new($ba, $data); $data =~ s/^..../BBBB/; $b->read(my $read); ok t_cmp $read, $data, "data inside the bucket should get affected by " . "the changes to the Perl variable it's created from"; } # APR::Bucket->new() with the argument PADTMP (which happens when # some function is re-entered) and the same SV is passed to # different buckets, which must be detected and copied away. { my @buckets = (); my @data = qw(ABCD EF); my @received = (); for my $str (@data) { my $b = func($ba, $str); push @buckets, $b; } # the creating of buckets and reading from them is done # separately on purpose for my $b (@buckets) { $b->read(my $out); push @received, $out; } # here we used to get: two pv: "ef\0d"\0, "ef"\0, as you can see # the first bucket had corrupted data. my @expected = map { lc } @data; ok t_cmp \@received, \@expected, "new(PADTMP SV)"; # this function will pass the same SV to new(), causing two # buckets point to the same SV, and having the latest bucket's # data override the previous one sub func { my $ba = shift; my $data = shift; return APR::Bucket->new($ba, lc $data); } } # read data is tainted { my $data = "xxx"; my $b = APR::Bucket->new($ba, $data); $b->read(my $read); ok t_cmp $read, $data, 'new($data)'; ok TestCommon::Utils::is_tainted($read); } # remove/destroy { my $b = APR::Bucket->new($ba, "aaa"); # remove $b when it's not attached to anything (not sure if # that should be an error) $b->remove; ok 1; # a dangling bucket needs to be destroyed $b->destroy; ok 1; # real remove from bb is tested in many other filter tests } # setaside { my $data = "A" x 10; my $expected = $data; my $b = APR::Bucket->new($ba, $data); my $status = $b->setaside($pool); ok t_cmp $status, APR::Const::SUCCESS, "setaside status"; $data =~ s/^..../BBBB/; $b->read(my $read); ok t_cmp $read, $expected, "data inside the setaside bucket is unaffected by " . "changes to the Perl variable it's created from"; $b->destroy; } # alloc_create on out-of-scope pools { # later may move that into a dedicated bucket_alloc test my $ba = APR::BucketAlloc->new(APR::Pool->new); # here if the pool is gone of scope destroy() will segfault $ba->destroy; ok 1; } # setaside on out-of-scope pools { # note that at the moment APR internally handles the situation # when the pool goes out of scope, so modperl doesn't need to do # any special handling of the pool object passed to setaside() # to insure that it survives as long as $b is alive # # to make sure that this doesn't change internally in APR, the # sub-test remains here my $data = "A" x 10; my $orig = $data; my $b = APR::Bucket->new($ba, $data); my $status = $b->setaside(APR::Pool->new); ok t_cmp $status, APR::Const::SUCCESS, "setaside status"; # try to overwrite the temp pool data my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK $b->read(my $read); ok t_cmp $read, $data, "data inside the setaside bucket is not corrupted"; $b->destroy; } $ba->destroy; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/date.pm0000644000104000010010000000413012540623205020216 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::date; # testing APR::Date API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Date (); my @http_dates = ( 'Sun, 06 Nov 1994 08:49:37 GMT', # RFC 822, updated by RFC 1123 'Sunday, 06-Nov-94 08:49:37 GMT', # RFC 850, obsoleted by RFC 1036 'Sun Nov 6 08:49:37 1994', # ANSI C's asctime() format ); my @rfc_dates = ( 'Sun, 06 Nov 1994 08:49:37 GMT' , # RFC 822, updated by RFC 1123 'Sunday, 06-Nov-94 08:49:37 GMT', # RFC 850, obsoleted by RFC 1036 'Sun Nov 6 08:49:37 1994', # ANSI C's asctime() format 'Sun, 6 Nov 1994 08:49:37 GMT', # RFC 822, updated by RFC 1123 'Sun, 06 Nov 94 08:49:37 GMT', # RFC 822 'Sun, 6 Nov 94 08:49:37 GMT', # RFC 822 'Sun, 06 Nov 94 8:49:37 GMT', # Unknown [Elm 70.85] 'Sun, 6 Nov 94 8:49:37 GMT', # Unknown [Elm 70.85] 'Sun, 6 Nov 1994 08:49:37 GMT', # Unknown [Postfix] ); my @bogus_dates = ( 'Sun, 06 Nov 94 08:49 GMT', # Unknown [drtr@ast.cam.ac.uk] 'Sun, 6 Nov 94 08:49 GMT', # Unknown [drtr@ast.cam.ac.uk] ); my $date_msec = 784111777; my $bogus_date_msec = 784111740; sub num_of_tests { return @http_dates + @rfc_dates + @bogus_dates; } sub test { # parse_http for my $date_str (@http_dates) { ok t_cmp(APR::Date::parse_http($date_str), $date_msec, "parse_http: $date_str"); #t_debug "testing : parse_http: $date_str"; } # parse_rfc for my $date_str (@rfc_dates) { ok t_cmp(APR::Date::parse_rfc($date_str), $date_msec, "parse_rfc: $date_str"); #t_debug "testing : parse_rfc: $date_str"; } # parse_rfc (bogus formats) for my $date_str (@bogus_dates) { ok t_cmp(APR::Date::parse_rfc($date_str), $bogus_date_msec, "parse_rfc: $date_str"); #t_debug "testing : parse_rfc: $date_str"; } } 1; mod_perl-2.0.9/t/lib/TestAPRlib/error.pm0000644000104000010010000000055212540623205020436 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::error; # testing APR::Error API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Error; sub num_of_tests { return 1; } sub test { ok 1; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/finfo.pm0000644000104000010010000001204112540623205020402 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::finfo; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache::TestConfig; use File::Spec::Functions qw(catfile); use Fcntl qw(:mode); use APR::Finfo (); use APR::Pool (); use constant WIN32 => Apache::TestConfig::WIN32; use constant OSX => Apache::TestConfig::OSX; use constant APACHE_2_0_49_PLUS => have_min_apache_version('2.0.49'); use constant APACHE_2_2_PLUS => have_min_apache_version('2.2.0'); use APR::Const -compile => qw(SUCCESS FINFO_NORM FILETYPE_REG FPROT_WREAD FPROT_WWRITE FPROT_WEXECUTE); sub num_of_tests { return 27; } sub test { # for the file to be tested, use the httpd.conf generated # by testing, so that it has a ctime that won't (usually) # encounter a bug in Win32's stat() function for files that # span across DST season boundaries. my $file = catfile Apache::Test::vars->{t_dir}, 'conf', 'httpd.conf'; my $pool = APR::Pool->new(); # populate the finfo struct first my $finfo = APR::Finfo::stat($file, APR::Const::FINFO_NORM, $pool); ok $finfo->isa('APR::Finfo'); # now, get information from perl's stat() my %stat; @stat{qw(device inode protection nlink user group size atime mtime ctime)} = (stat $file)[0..5, 7..10]; compare_with_perl($finfo, \%stat); # tests for stuff not in perl's stat { # BACK_COMPAT_MARKER - fixed as of 2.0.49. if (WIN32 && !APACHE_2_0_49_PLUS) { skip "finfo.fname requires Apache 2.0.49 or later", 0; } else { ok t_cmp($finfo->fname, $file, '$finfo->fname()'); } ok t_cmp($finfo->filetype, APR::Const::FILETYPE_REG, '$finfo->filetype()'); } # stat() on out-of-scope pools { my $finfo = APR::Finfo::stat($file, APR::Const::FINFO_NORM, APR::Pool->new); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK compare_with_perl($finfo, \%stat); } } sub compare_with_perl { my ($finfo, $stat) = @_; # skip certain tests on Win32 and others my %skip = (); if (WIN32) { # atime is wrong on NTFS, but OK on FAT32 %skip = map {$_ => 1} qw(device inode user group atime); } elsif (OSX) { # XXX both apr and perl report incorrect group values. sometimes. # XXX skip until we can really figure out what is going on. %skip = (group => 1); } # compare stat fields between perl and apr_stat { foreach my $method (qw(device inode nlink user group size atime mtime ctime)) { if ($skip{$method}) { skip "different file semantics", 0; } else { ok t_cmp($finfo->$method(), $stat->{$method}, "\$finfo->$method()"); } } } # stat tests (same as perl's stat) { # XXX: untested # ->name # XXX: are there any platforms csize is available at all? # We don't want to see the skipped message all the time if # it's not really used anywhere # if (my $csize = $finfo->csize) { # # The storage size is at least as big as the file size # # perl's stat() doesn't have the equivalent of csize # t_debug "csize=$csize, size=$stat{size}"; # ok $csize >= $stat{size}; # } # else { # skip "csize is not available on this platform", 0; # } # match world bits # on Win32, there's a bug in the apr library supplied # with Apache/2.2 that causes the following two tests # to fail. This is slated to be fixed after apr-1.2.7. if (WIN32 and APACHE_2_2_PLUS) { skip "broken apr stat on Win32", 0; } else { ok t_cmp($finfo->protection & APR::Const::FPROT_WREAD, $stat->{protection} & S_IROTH, '$finfo->protection() & APR::Const::FPROT_WREAD'); } if (WIN32 and APACHE_2_2_PLUS) { skip "broken apr stat on Win32", 0; } else { ok t_cmp($finfo->protection & APR::Const::FPROT_WWRITE, $stat->{protection} & S_IWOTH, '$finfo->protection() & APR::Const::FPROT_WWRITE'); } if (WIN32) { skip "different file semantics", 0; } else { ok t_cmp($finfo->protection & APR::Const::FPROT_WEXECUTE, $stat->{protection} & S_IXOTH, '$finfo->protection() & APR::Const::FPROT_WEXECUTE'); } } } 1; mod_perl-2.0.9/t/lib/TestAPRlib/os.pm0000644000104000010010000000054412540623205017727 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::os; # testing APR::OS API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::OS (); sub num_of_tests { return 1; } sub test { ok 1; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/pool.pm0000644000104000010010000003272012540623205020260 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::pool; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use APR::Pool (); use APR::Table (); sub num_of_tests { return 77; } sub test { my $pool = APR::Pool->new(); my $table = APR::Table::make($pool, 2); ### custom pools ### # test: explicit pool object destroy destroys the custom pool { my $p = APR::Pool->new; $p->cleanup_register(\&set_cleanup, [$table, 'new destroy']); ok t_cmp(ancestry_count($p), 1, "a new pool has one ancestor: the global pool"); # explicity destroy the object $p->destroy; my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 1, "should be 1 note"); ok t_cmp($notes[0], 'new destroy'); $table->clear; } # test: lexical scoping DESTROYs the custom pool { { my $p = APR::Pool->new; ok t_cmp(ancestry_count($p), 1, "a new pool has one ancestor: the global pool"); $p->cleanup_register(\&set_cleanup, [$table, 'new scoped']); } my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 1, "should be 1 note"); ok t_cmp($notes[0], 'new scoped'); $table->clear; } ### custom pools + sub-pools ### # test: basic pool and sub-pool tests + implicit destroy of pool objects { { my ($pp, $sp) = both_pools_create_ok($table); } both_pools_destroy_ok($table); $table->clear; } # test: explicitly destroying a parent pool should destroy its # sub-pool { my ($pp, $sp) = both_pools_create_ok($table); # destroying $pp should destroy the subpool $sp too $pp->destroy; both_pools_destroy_ok($table); $table->clear; } # test: destroying a sub-pool before the parent pool { my ($pp, $sp) = both_pools_create_ok($table); $sp->destroy; $pp->destroy; both_pools_destroy_ok($table); $table->clear; } # test: destroying a sub-pool explicitly after the parent pool destroy # the parent pool should have already destroyed the child pool, so # the object is invalid { my ($pp, $sp) = both_pools_create_ok($table); $pp->destroy; $sp->destroy; both_pools_destroy_ok($table); $table->clear; } # test: destroying a sub-pool before the parent pool and trying to # call APR::Pool methods on the a subpool object which points to a # destroyed pool { my ($pp, $sp) = both_pools_create_ok($table); # parent pool destroys child pool $pp->destroy; # this should "gracefully" fail, since $sp's guts were # destroyed when the parent pool was destroyed eval { $pp = $sp->parent_get }; ok t_cmp($@, qr/invalid pool object/, "parent pool destroys child pool"); # since pool $sp now contains 0 pointer, if we try to make a # new pool out of it, it's the same as APR->new (i.e. it'll # use the global top level pool for it), so the resulting pool # should have an ancestry length of exactly 1 my $ssp = $sp->new; ok t_cmp(ancestry_count($ssp), 1, "a new pool has one ancestor: the global pool"); both_pools_destroy_ok($table); $table->clear; } # test: make sure that one pool won't destroy/affect another pool, # which happened to be allocated at the same memory address after # the pointer to the first pool was destroyed { my $pp2; { my $pp = APR::Pool->new; $pp->destroy; # $pp2 ideally should take the exact place of apr_pool # previously pointed to by $pp $pp2 = APR::Pool->new; # $pp object didn't go away yet (it'll when exiting this # scope). in the previous implementation, $pp will be # destroyed second time on the exit of the scope and it # could happen to work, because $pp2 pointer has allocated # exactly the same address. and if so it would have killed # the pool that $pp2 points to # this should "gracefully" fail, since $pp's guts were # destroyed when the parent pool was destroyed # must make sure that it won't try to hijack the new pool # $pp2 that (hopefully) took over $pp's place eval { $pp->parent_get }; ok t_cmp($@, qr/invalid pool object/, "a dead pool is a dead pool"); } # next make sure that $pp2's pool is still alive $pp2->cleanup_register(\&set_cleanup, [$table, 'overtake']); $pp2->destroy; my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 1, "should be 1 note"); ok t_cmp($notes[0], 'overtake'); $table->clear; } # test: similar to the previous test, but this time, the parent # pool destroys the child pool. a second allocation of a new pair # of the parent and child pools take over exactly the same # allocations. so if there are any ghost objects, they must not # find the other pools and use them as they own. for example they # could destroy the pools, and the perl objects of the pair would # have no idea that someone has destroyed the pools without their # knowledge. the previous implementation suffered from this # problem. the new implementation uses an SV which is stored in # the object and in the pool. when the pool is destroyed the SV # gets its IVX pointer set to 0, which affects any perl object # that is a ref to that SV. so once an apr pool is destroyed all # perl objects pointing to it get automatically invalidated and # there is no risk of hijacking newly created pools that happen to # be at the same memory address. { my ($pp2, $sp2); { my $pp = APR::Pool->new; my $sp = $pp->new; # parent destroys $sp $pp->destroy; # hopefully these pool will take over the $pp and $sp # allocations ($pp2, $sp2) = both_pools_create_ok($table); } # $pp and $sp shouldn't have triggered any cleanups my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 0, "should be 0 notes"); $table->clear; # parent pool destroys child pool $pp2->destroy; both_pools_destroy_ok($table); $table->clear; } # test: only when the last references to the pool object is gone # it should get destroyed { my $cp; { my $sp = APR::Pool->new(); $sp->cleanup_register(\&set_cleanup, [$table, 'several references']); $cp = $sp; # destroy of $sp shouldn't call apr_pool_destroy, because # $cp still references to it } my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 0, "should be 0 notes"); $table->clear; # now the last copy is gone and the cleanup hooks will be called $cp->destroy; @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 1, "should be 1 note"); ok t_cmp($notes[0], 'several references'); $table->clear; } { # and another variation my $pp = APR::Pool->new(); my $sp = $pp->new; my $gp = $pp->parent_get; my $pp2 = $sp->parent_get; # parent destroys children $pp->destroy; # grand parent ($pool) is undestroyable (core pool) $gp->destroy; # now all custom pools are destroyed - $sp and $pp2 point nowhere $pp2->destroy; $sp->destroy; ok 1; } # cleanup_register using a function name as a callback { { my $p = APR::Pool->new; $p->cleanup_register('set_cleanup', [$table, 'function name']); } my @notes = $table->get('cleanup'); ok t_cmp($notes[0], 'function name', "function name callback"); $table->clear; } # cleanup_register using an anon sub callback { { my $p = APR::Pool->new; $p->cleanup_register(sub { &set_cleanup }, [$table, 'anon sub']); } my @notes = $table->get('cleanup'); ok t_cmp($notes[0], 'anon sub', "anon callback"); $table->clear; } # registered callbacks are run in reversed order LIFO { { my $p = APR::Pool->new; $p->cleanup_register(\&add_cleanup, [$table, 'first']); $p->cleanup_register(\&add_cleanup, [$table, 'second']); } my @notes = $table->get('cleanup'); ok t_cmp($notes[0], 'second', "two cleanup functions"); ok t_cmp($notes[1], 'first', "two cleanup functions"); $table->clear; } # undefined cleanup subs { my $p = APR::Pool->new; $p->cleanup_register('TestAPR::pool::some_non_existing_sub', 1); my @warnings; local $SIG{__WARN__} = sub {push @warnings, @_}; $p->destroy; ok t_cmp($warnings[0], qr/Undefined subroutine/, "non existing function"); } { my $p = APR::Pool->new; $p->cleanup_register(\&non_existing1, 1); my @warnings; local $SIG{__WARN__} = sub {push @warnings, @_}; $p->destroy; ok t_cmp($warnings[0], qr/Undefined subroutine/, "non existing function"); } # cleanups throwing exceptions { my $p = APR::Pool->new; $p->cleanup_register(sub {die "1\n"}, 1); $p->cleanup_register(sub {die "2\n"}, 1); my @warnings; local $SIG{__WARN__} = sub {push @warnings, @_}; local $@="to be preserved"; undef $p; ok t_cmp(\@warnings, [map "APR::Pool: cleanup died: $_\n", 2, 1], "exceptions thrown by cleanups"); ok t_cmp($@, "to be preserved", '$@ is preserved'); } ### $p->clear ### { my ($pp, $sp) = both_pools_create_ok($table); $pp->clear; # both pools should have run their cleanups both_pools_destroy_ok($table); # sub-pool $sp should be now bogus, as clear() destroys # subpools eval { $sp->parent_get }; ok t_cmp($@, qr/invalid pool object/, "clear destroys sub pools"); # now we should be able to use the parent pool without # allocating it $pp->cleanup_register(\&set_cleanup, [$table, 're-using pool']); $pp->destroy; my @notes = $table->get('cleanup'); ok t_cmp('re-using pool', $notes[0]); $table->clear; } # a pool can be tagged, so when doing low level apr_pool tracing # (when apr is compiled with -DAPR_POOL_DEBUG) it's possible to # grep(1) for a certain tag, so it's a useful method { my $p = APR::Pool->new; $p->tag("my pool"); # though there is no way we can get back the value to test, # since there is no apr_pool_tag read accessor ok 1; } # out-of-scope pools { my $sp = APR::Pool->new->new; # the parent temp pool must stick around ok t_cmp(2, ancestry_count($sp), "parent pool is still alive + global pool"); } # other stuff { my $p = APR::Pool->new; # find some method that wants a pool object and try to pass it # an object that was already destroyed e.g. APR::Table::make($p, 2); # only available with -DAPR_POOL_DEBUG #my $num_bytes = $p->num_bytes; #ok $num_bytes; } } # returns how many ancestor generations the pool has (parent, # grandparent, etc.) sub ancestry_count { my $child = shift; my $gen = 0; while (my $parent = $child->parent_get) { # prevent possible endless loops die "child pool reports to be its own parent, corruption!" if $parent == $child; $gen++; die "child knows its parent, but the parent denies having that child" unless $parent->is_ancestor($child); $child = $parent; } return $gen; } sub add_cleanup { my $arg = shift; debug "adding cleanup note: $arg->[1]"; $arg->[0]->add(cleanup => $arg->[1]); 1; } sub set_cleanup { my $arg = shift; debug "setting cleanup note: $arg->[1]"; $arg->[0]->set(cleanup => $arg->[1]); 1; } # +4 tests sub both_pools_create_ok { my $table = shift; my $pp = APR::Pool->new; ok t_cmp(1, $pp->isa('APR::Pool'), "isa('APR::Pool')"); ok t_cmp(1, ancestry_count($pp), "a new pool has one ancestor: the global pool"); my $sp = $pp->new; ok t_cmp($sp->isa('APR::Pool'), 1, "isa('APR::Pool')"); ok t_cmp(ancestry_count($sp), 2, "a subpool has 2 ancestors: the parent and global pools"); $pp->cleanup_register(\&add_cleanup, [$table, 'parent']); $sp->cleanup_register(\&set_cleanup, [$table, 'child']); return ($pp, $sp); } # +3 tests sub both_pools_destroy_ok { my $table = shift; my @notes = $table->get('cleanup'); ok t_cmp(scalar(@notes), 2, "should be 2 notes"); ok t_cmp($notes[0], 'child'); ok t_cmp($notes[1], 'parent'); } 1; mod_perl-2.0.9/t/lib/TestAPRlib/status.pm0000644000104000010010000000077212540623205020634 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::status; # Testing APR::Status use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Const -compile => qw(EAGAIN ENOPOLL); use APR::Status (); sub num_of_tests { return 2; } sub test { ok APR::Status::is_EAGAIN(APR::Const::EAGAIN); ok ! APR::Status::is_EAGAIN(APR::Const::ENOPOLL); } 1; mod_perl-2.0.9/t/lib/TestAPRlib/string.pm0000644000104000010010000000127212540623205020613 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::string; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::String (); my %size_string = ( '-1' => " - ", 0 => " 0 ", 42 => " 42 ", 42_000 => " 41K", 42_000_000 => " 40M", # 42_000_000_000 => "40G", ); sub num_of_tests { return scalar keys %size_string; } sub test { t_debug("size_string"); while (my ($k, $v) = each %size_string) { ok t_cmp($v, APR::String::format_size($k)); } } 1; mod_perl-2.0.9/t/lib/TestAPRlib/table.pm0000644000104000010010000002465612540623205020407 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::table; # testing APR::Table API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Table (); use APR::Pool (); use APR::Const -compile => ':table'; use constant TABLE_SIZE => 20; our $filter_count; sub num_of_tests { my $tests = 56; # tied hash values() for a table w/ multiple values for the same # key $tests += 2 if $] >= 5.008; return $tests; } sub test { $filter_count = 0; my $pool = APR::Pool->new(); my $table = APR::Table::make($pool, TABLE_SIZE); ok UNIVERSAL::isa($table, 'APR::Table'); # get on non-existing key { # in scalar context my $val = $table->get('foo'); ok t_cmp($val, undef, '$val = $table->get("no_such_key")'); # in list context my @val = $table->get('foo'); ok t_cmp(+@val, 0, '@val = $table->get("no_such_key")'); } # set/add/get/copy normal values { $table->set(foo => 'bar'); # get scalar context my $val = $table->get('foo'); ok t_cmp($val, 'bar', '$val = $table->get("foo")'); # add + get list context $table->add(foo => 'tar'); $table->add(foo => 'kar'); my @val = $table->get('foo'); ok @val == 3 && $val[0] eq 'bar' && $val[1] eq 'tar' && $val[2] eq 'kar'; # copy $table->set(too => 'boo'); my $table_copy = $table->copy($pool); my $val_copy = $table->get('too'); ok t_cmp($val_copy, 'boo', '$val = $table->get("too")'); my @val_copy = $table_copy->get('foo'); ok @val_copy == 3 && $val_copy[0] eq 'bar' && $val_copy[1] eq 'tar' && $val_copy[2] eq 'kar'; } # make sure 0 comes through as 0 and not undef { $table->set(foo => 0); my $zero = $table->get('foo'); ok t_cmp($zero, 0, 'table value 0 is not undef'); } # unset { $table->set(foo => "bar"); $table->unset('foo'); ok t_cmp(+$table->get('foo'), undef, '$table->unset("foo")'); } # merge { $table->set( merge => '1'); $table->merge(merge => 'a'); my $val = $table->get('merge'); ok t_cmp($val, "1, a", 'one val $table->merge(...)'); # if there is more than one value for the same key, merge does # the job only for the first value $table->add( merge => '2'); $table->merge(merge => 'b'); my @val = $table->get('merge'); ok t_cmp($val[0], "1, a, b", '$table->merge(...)'); ok t_cmp($val[1], "2", 'two values $table->merge(...)'); # if the key is not found, works like set/add $table->merge(miss => 'a'); my $val_miss = $table->get('miss'); ok t_cmp($val_miss, "a", 'no value $table->merge(...)'); } # clear { $table->set(foo => 0); $table->set(bar => 1); $table->clear(); # t_cmp forces scalar context on get ok t_cmp($table->get('foo'), undef, '$table->clear'); ok t_cmp($table->get('bar'), undef, '$table->clear'); } # filtering { for (1..TABLE_SIZE) { $table->set(chr($_+97), $_); } # Simple filtering $filter_count = 0; $table->do("my_filter"); ok t_cmp($filter_count, TABLE_SIZE); # Filtering aborting in the middle $filter_count = 0; $table->do("my_filter_stop"); ok t_cmp($filter_count, int(TABLE_SIZE)/2) ; # Filtering with anon sub $filter_count=0; $table->do(sub { my ($key,$value) = @_; $filter_count++; unless ($key eq chr($value+97)) { die "arguments I recieved are bogus($key,$value)"; } return 1; }); ok t_cmp($filter_count, TABLE_SIZE, "table size"); $filter_count = 0; $table->do("my_filter", "c", "b", "e"); ok t_cmp($filter_count, 3, "table size"); } #Tied interface { my $table = APR::Table::make($pool, TABLE_SIZE); ok UNIVERSAL::isa($table, 'HASH'); ok UNIVERSAL::isa($table, 'HASH') && tied(%$table); ok $table->{'foo'} = 'bar'; # scalar context ok $table->{'foo'} eq 'bar'; ok delete $table->{'foo'} || 1; ok not exists $table->{'foo'}; for (1..TABLE_SIZE) { $table->{chr($_+97)} = $_; } $filter_count = 0; foreach my $key (sort keys %$table) { my_filter($key, $table->{$key}); } ok $filter_count == TABLE_SIZE; } # each, values { my $table = APR::Table::make($pool, 2); $table->add("first" => 1); $table->add("second" => 2); $table->add("first" => 3); my $i = 0; while (my ($a,$b) = each %$table) { my $key = ("first", "second")[$i % 2]; my $val = ++$i; ok t_cmp $a, $key, "table each: key test"; ok t_cmp $b, $val, "table each: value test"; ok t_cmp $table->{$a}, $val, "table each: get test"; ok t_cmp tied(%$table)->FETCH($a), $val, "table each: tied get test"; } # this doesn't work with Perl < 5.8 if ($] >= 5.008) { ok t_cmp "1,2,3", join(",", values %$table), "table values"; ok t_cmp "first,1,second,2,first,3", join(",", %$table), "table entries"; } } # overlap and compress routines { my $base = APR::Table::make($pool, TABLE_SIZE); my $add = APR::Table::make($pool, TABLE_SIZE); $base->set(foo => 'one'); $base->add(foo => 'two'); $add->set(foo => 'three'); $add->set(bar => 'beer'); my $overlay = $base->overlay($add, $pool); my @foo = $overlay->get('foo'); my @bar = $overlay->get('bar'); ok t_cmp(+@foo, 3); ok t_cmp($bar[0], 'beer'); my $overlay2 = $overlay->copy($pool); # compress/merge $overlay->compress(APR::Const::OVERLAP_TABLES_MERGE); # $add first, then $base ok t_cmp($overlay->get('foo'), 'three, one, two', "\$overlay->compress/merge"); ok t_cmp($overlay->get('bar'), 'beer', "\$overlay->compress/merge"); # compress/set $overlay->compress(APR::Const::OVERLAP_TABLES_SET); # $add first, then $base ok t_cmp($overlay2->get('foo'), 'three', "\$overlay->compress/set"); ok t_cmp($overlay2->get('bar'), 'beer', "\$overlay->compress/set"); } # overlap set { my $base = APR::Table::make($pool, TABLE_SIZE); my $add = APR::Table::make($pool, TABLE_SIZE); $base->set(bar => 'beer'); $base->set(foo => 'one'); $base->add(foo => 'two'); $add->set(foo => 'three'); $base->overlap($add, APR::Const::OVERLAP_TABLES_SET); my @foo = $base->get('foo'); my @bar = $base->get('bar'); ok t_cmp(+@foo, 1, 'overlap/set'); ok t_cmp($foo[0], 'three'); ok t_cmp($bar[0], 'beer'); } # overlap merge { my $base = APR::Table::make($pool, TABLE_SIZE); my $add = APR::Table::make($pool, TABLE_SIZE); $base->set(foo => 'one'); $base->add(foo => 'two'); $add->set(foo => 'three'); $add->set(bar => 'beer'); $base->overlap($add, APR::Const::OVERLAP_TABLES_MERGE); my @foo = $base->get('foo'); my @bar = $base->get('bar'); ok t_cmp(+@foo, 1, 'overlap/set'); ok t_cmp($foo[0], 'one, two, three'); ok t_cmp($bar[0], 'beer'); } # temp pool objects. # testing here that the temp pool object doesn't go out of scope # before the object based on it was freed. the following tests # were previously segfaulting when using apr1/httpd2.1 built w/ # --enable-pool-debug CPPFLAGS="-DAPR_BUCKET_DEBUG", # the affected methods are: # - make # - copy # - overlay { { my $table = APR::Table::make(APR::Pool->new, 10); $table->set($_ => $_) for 1..20; ok t_cmp $table->get(20), 20, "no segfault"; } my $pool = APR::Pool->new; my $table = APR::Table::make($pool, 10); $table->set($_ => $_) for 1..20; my $table_copy = $table->copy($pool->new); { # verify that the temp pool used to create $table_copy was # not freed, by allocating a new table to fill with a # different data. if that former pool was freed # $table_copy will now contain bogus data (and may # segfault) my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'a'..'z'; ok t_cmp $table->get('z'), 'z', "helper test"; } ok t_cmp $table_copy->get(20), 20, "no segfault/valid data"; my $table2 = APR::Table::make($pool, 1); $table2->set($_**2 => $_**2) for 1..20; my $table2_copy = APR::Table::make($pool, 1); $table2_copy->set($_ => $_) for 1..20; my $overlay = $table2_copy->overlay($table2, $pool->new); { # see the comment for above's: # $table_copy = $table->copy(APR::Pool->new); my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; ok t_cmp $table->get('za'), 'za', "helper test"; } ok t_cmp $overlay->get(20), 20, "no segfault/valid data"; } { { my $p = APR::Pool->new; $p->cleanup_register(sub { "whatever" }); $table = APR::Table::make($p, 10) }; $table->set(a => 5); ok t_cmp $table->get("a"), 5, "no segfault"; } } sub my_filter { my ($key, $value) = @_; $filter_count++; unless ($key eq chr($value+97)) { die "arguments I received are bogus($key,$value)"; } return 1; } sub my_filter_stop { my ($key, $value) = @_; $filter_count++; unless ($key eq chr($value+97)) { die "arguments I received are bogus($key,$value)"; } return $filter_count == int(TABLE_SIZE)/2 ? 0 : 1; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/threadmutex.pm0000644000104000010010000000256012540623205021640 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::threadmutex; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Const -compile => qw(EBUSY SUCCESS); use APR::Pool(); sub num_of_tests { return 5; } sub test { require APR::ThreadMutex; my $pool = APR::Pool->new(); my $mutex = APR::ThreadMutex->new($pool); ok $mutex; ok t_cmp($mutex->lock, APR::Const::SUCCESS, 'lock == APR::Const::SUCCESS'); #XXX: don't get what we expect on win23 #need to use APR_STATUS_IS_EBUSY ? # ok t_cmp($mutex->trylock, APR::Const::EBUSY, # 'trylock == APR::Const::EBUSY'); ok t_cmp($mutex->unlock, APR::Const::SUCCESS, 'unlock == APR::Const::SUCCESS'); # out-of-scope pool { my $mutex = APR::ThreadMutex->new(APR::Pool->new); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK ok t_cmp($mutex->lock, APR::Const::SUCCESS, 'lock == APR::Const::SUCCESS'); ok t_cmp($mutex->unlock, APR::Const::SUCCESS, 'unlock == APR::Const::SUCCESS'); } } 1; mod_perl-2.0.9/t/lib/TestAPRlib/threadrwlock.pm0000644000104000010010000000160612540623205021777 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::threadrwlock; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Const -compile => qw(EBUSY SUCCESS); use APR::Pool(); sub num_of_tests { return 5; } sub test { require APR::ThreadRWLock; my $pool = APR::Pool->new(); my $mutex = APR::ThreadRWLock->new($pool); ok $mutex; ok t_cmp($mutex->rdlock, APR::Const::SUCCESS, 'rdlock == APR::Const::SUCCESS'); ok t_cmp($mutex->unlock, APR::Const::SUCCESS, 'unlock == APR::Const::SUCCESS'); ok t_cmp($mutex->wrlock, APR::Const::SUCCESS, 'wrlock == APR::Const::SUCCESS'); ok t_cmp($mutex->unlock, APR::Const::SUCCESS, 'unlock == APR::Const::SUCCESS'); } 1; mod_perl-2.0.9/t/lib/TestAPRlib/uri.pm0000644000104000010010000001452712540623205020113 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::uri; # Testing APR::URI (more tests in TestAPI::uri) use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::URI (); use APR::Pool (); use APR::Const -compile => qw(URI_UNP_OMITSITEPART URI_UNP_OMITUSER URI_UNP_REVEALPASSWORD URI_UNP_OMITQUERY URI_UNP_OMITPASSWORD URI_UNP_OMITPATHINFO ); my %default_ports = ( ftp => 21, gopher => 70, http => 80, https => 443, nntp => 119, prospero => 191, snews => 563, wais => 210, ); my %url = ( scheme => ["http", "ftp" ], user => ["user", "log" ], password => ["password", "pass" ], hostname => ["www.example.com", "ftp.example.com"], port => [8000, 21 ], path => ["/path/file.pl", "/pub" ], query => ["query", undef ], fragment => ["fragment", undef ], ); my @keys_urls = qw(scheme user password hostname port path query fragment); my @keys_hostinfo = qw(user password hostname port); sub num_of_tests { return 36; } sub test { my $pool = APR::Pool->new(); ### parse ### my $url0 = sprintf "%s://%s:%s\@%s:%d%s?%s#%s", map { $url{$_}[0] } @keys_urls; # warn "URL: $url\n"; my $hostinfo0 = sprintf "%s:%s\@%s:%d", map { $url{$_}[0] } @keys_hostinfo; my $parsed = APR::URI->parse($pool, $url0); ok $parsed; ok $parsed->isa('APR::URI'); for my $method (keys %url) { no strict 'refs'; ok t_cmp($parsed->$method, $url{$method}[0], $method); } ok t_cmp($parsed->hostinfo, $hostinfo0, "hostinfo"); for my $method (keys %url) { no strict 'refs'; $parsed->$method($url{$method}[1]); t_debug("$method: " . ($url{$method}[1]||'undef') . " => " . ($parsed->$method||'undef')); } ### unparse ### my $url_unparsed = $parsed->unparse; # hostinfo is unaffected, since it's simply a field in the parsed # record, and it's populated when parse is called, but when # individual fields used to compose it are updated, it doesn't get # updated: so we see the old value here ok t_cmp($parsed->hostinfo, $hostinfo0, "hostinfo"); # - since 21 is the default port for ftp, unparse omits it # - if no flags are passed to unparse, APR::Const::URI_UNP_OMITPASSWORD # is passed by default -- it hides the password my $url1 = sprintf "%s://%s\@%s%s", map { $url{$_}[1] } grep !/^(password|port)$/, @keys_urls; ok t_cmp($url_unparsed, $url1, "unparsed url"); # various unparse flags # { # restore the query/fragment fields first my $query_new = "my_query"; my $fragment_new = "my_fragment"; $parsed->query($query_new); $parsed->fragment($fragment_new); local $url{query}[1] = $query_new; local $url{fragment}[1] = $fragment_new; # omit the site part { my $url_unparsed = $parsed->unparse(APR::Const::URI_UNP_OMITSITEPART); my $url2 = sprintf "%s?%s#%s", map { $url{$_}[1] } qw(path query fragment); ok t_cmp($url_unparsed, $url2, "unparsed url: omit site"); } # this time the password should appear as XXXXXXXX { local $url{password}[1] = "XXXXXXXX"; my $url_unparsed = $parsed->unparse(0); my $url2 = sprintf "%s://%s:%s\@%s%s?%s#%s", map { $url{$_}[1] } grep !/^port$/, @keys_urls; ok t_cmp($url_unparsed, $url2, "unparsed url:reveal passwd"); } # this time the user and the password should appear { my $url_unparsed = $parsed->unparse(APR::Const::URI_UNP_REVEALPASSWORD); my $url2 = sprintf "%s://%s:%s\@%s%s?%s#%s", map { $url{$_}[1] } grep !/^port$/, @keys_urls; ok t_cmp($url_unparsed, $url2, "unparsed url:reveal passwd"); } # omit the user part / show password { my $url_unparsed = $parsed->unparse( APR::Const::URI_UNP_OMITUSER|APR::Const::URI_UNP_REVEALPASSWORD); my $url2 = sprintf "%s://:%s\@%s%s?%s#%s", map { $url{$_}[1] } grep !/^(port|user)$/, @keys_urls; ok t_cmp($url_unparsed, $url2, "unparsed url: omit user"); } # omit the path, query and fragment strings { my $url_unparsed = $parsed->unparse( APR::Const::URI_UNP_OMITPATHINFO|APR::Const::URI_UNP_REVEALPASSWORD); my $url2 = sprintf "%s://%s:%s\@%s", map { $url{$_}[1] } grep !/^(port|path|query|fragment)$/, @keys_urls; ok t_cmp($url_unparsed, $url2, "unparsed url: omit path"); } # omit the query and fragment strings { my $url_unparsed = $parsed->unparse( APR::Const::URI_UNP_OMITQUERY|APR::Const::URI_UNP_OMITPASSWORD); my $url2 = sprintf "%s://%s\@%s%s", map { $url{$_}[1] } grep !/^(password|port|query|fragment)$/, @keys_urls; ok t_cmp($url_unparsed, $url2, "unparsed url: omit query"); } } ### port_of_scheme ### while (my ($scheme, $port) = each %default_ports) { my $apr_port = APR::URI::port_of_scheme($scheme); ok t_cmp($apr_port, $port, "scheme: $scheme"); } # parse + out-of-scope pools { my $url0 = sprintf "%s://%s:%s\@%s:%d%s?%s#%s", map { $url{$_}[0] } @keys_urls; # warn "URL: $url\n"; my $hostinfo0 = sprintf "%s:%s\@%s:%d", map { $url{$_}[0] } @keys_hostinfo; require APR::Pool; my $parsed = APR::URI->parse(APR::Pool->new, $url0); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; for my $method (keys %url) { no strict 'refs'; ok t_cmp($parsed->$method, $url{$method}[0], $method); } ok t_cmp($parsed->hostinfo, $hostinfo0, "hostinfo"); } } 1; mod_perl-2.0.9/t/lib/TestAPRlib/util.pm0000644000104000010010000000260412540623205020262 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::util; # test APR::Util use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Util (); use constant CRYPT_WORKS => $^O !~ /^(MSWin32|beos|NetWare)$/; my $clear = "this is some text"; # to get the hash values used: # htpasswd -nb[sm] user "this is some text" my %hashes = ( crypt => 'pHM3JfnL6isho', md5 => '$apr1$Kld6H/..$o5OPPPWslI3zB20S54u9s1', sha1 => '{SHA}A5NpTRa4TethLkfOYlK9NfDYbAY=', ); # BACK_COMPAT_MARKER (sha1 support added in 2.0.50) delete $hashes{sha1} unless have_min_apache_version('2.0.50'); sub num_of_tests { return 1 + scalar keys %hashes; } sub test { # password_validate { ok ! APR::Util::password_validate("one", "two"); while (my ($mode, $hash) = each %hashes) { t_debug($mode); if ($mode eq 'crypt' && !CRYPT_WORKS) { t_debug("crypt is not supported on $^O"); ok 1; # don't make noise } else { ok APR::Util::password_validate($clear, $hash); } } } #this function seems unstable on certain platforms # my $blen = 10; # my $bytes = APR::generate_random_bytes($blen); # ok length($bytes) == $blen; } 1; mod_perl-2.0.9/t/lib/TestAPRlib/uuid.pm0000644000104000010010000000117312540623205020253 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPRlib::uuid; use strict; use warnings FATAL => 'all'; use Apache::Test; my $dummy_uuid = 'd48889bb-d11d-b211-8567-ec81968c93c6'; require APR; require APR::UUID; #XXX: apr_generate_random_bytes may block forever on /dev/random # my $uuid = APR::UUID->new->format; sub num_of_tests { return 3; } sub test { my $uuid = $dummy_uuid; ok $uuid; my $uuid_parsed = APR::UUID->parse($uuid); ok $uuid_parsed; ok $uuid eq $uuid_parsed->format; } 1; mod_perl-2.0.9/t/lib/TestCommon/0000755000104000010010000000000012540623205017064 5ustar AdministratorsNonemod_perl-2.0.9/t/lib/TestCommon/FilterDebug.pm0000644000104000010010000000453012540623205021620 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::FilterDebug; use strict; use warnings FATAL => 'all'; use base qw(Apache2::Filter); use APR::Brigade (); use APR::Bucket (); use APR::BucketType (); use Apache2::Const -compile => qw(OK DECLINED); use APR::Const -compile => ':common'; # to use these functions add any or all of these filter handlers # PerlModule TestCommon::FilterDebug # PerlInputFilterHandler TestCommon::FilterDebug::snoop_request # PerlInputFilterHandler TestCommon::FilterDebug::snoop_connection # PerlOutputFilterHandler TestCommon::FilterDebug::snoop_request # PerlOutputFilterHandler TestCommon::FilterDebug::snoop_connection # sub snoop_connection : FilterConnectionHandler { snoop("connection", @_) } sub snoop_request : FilterRequestHandler { snoop("request", @_) } sub snoop { my $type = shift; my ($filter, $bb, $mode, $block, $readbytes) = @_; # filter args # $mode, $block, $readbytes are passed only for input filters my $stream = defined $mode ? "input" : "output"; # read the data and pass-through the bucket brigades unchanged if (defined $mode) { # input filter my $rv = $filter->next->get_brigade($bb, $mode, $block, $readbytes); return $rv unless $rv == APR::Const::SUCCESS; bb_dump($type, $stream, $bb); } else { # output filter bb_dump($type, $stream, $bb); my $rv = $filter->next->pass_brigade($bb); return $rv unless $rv == APR::Const::SUCCESS; } #if ($bb->is_empty) { # return -1; #} return Apache2::Const::OK; } sub bb_dump { my ($type, $stream, $bb) = @_; my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $b->read(my $bdata); push @data, $b->type->name, $bdata; } # send the sniffed info to STDERR so not to interfere with normal # output my $direction = $stream eq 'output' ? ">>>" : "<<<"; print STDERR "\n$direction $type $stream filter\n"; unless (@data) { print STDERR " No buckets\n"; return; } my $c = 1; while (my ($btype, $data) = splice @data, 0, 2) { print STDERR " o bucket $c: $btype\n"; print STDERR "[$data]\n"; $c++; } } 1; __END__ mod_perl-2.0.9/t/lib/TestCommon/Handlers.pm0000644000104000010010000000233412540623205021164 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::Handlers; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use TestCommon::Utils (); use Apache::TestTrace; use Apache2::Const -compile => qw(M_POST OK); # read the posted body and send it back to the client as is sub pass_through_response_handler { my $r = shift; if ($r->method_number == Apache2::Const::M_POST) { my $data = TestCommon::Utils::read_post($r); debug "pass_through_handler read: $data\n"; $r->print($data); } Apache2::Const::OK; } 1; __END__ =head1 NAME TestCommon::Handlers - Common Handlers =head1 Synopsis # PerlModule TestCommon::Handlers # PerlResponseHandler TestCommon::Handlers::pass_through_response_handler =head1 Description Various commonly used handlers =head1 API =head2 pass_through_response_handler # PerlModule TestCommon::Handlers # PerlResponseHandler TestCommon::Handlers::pass_through_response_handler this is a response handler, which reads the posted body and sends it back to the client as is. =cut mod_perl-2.0.9/t/lib/TestCommon/LogDiff.pm0000644000104000010010000000343412540623205020740 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::LogDiff; use strict; use warnings FATAL => 'all'; use POSIX (); sub new { my $class = shift; my $path = shift; open my $fh, "<$path" or die "Can't open $path: $!"; seek $fh, 0, POSIX::SEEK_END(); my $pos = tell $fh; my %self = ( path => $path, fh => $fh, pos => $pos, ); return bless \%self, $class; } sub DESTROY { my $self = shift; close $self->{fh}; } sub diff { my $self = shift; # XXX: is it possible that some system will be slow to flush the # buffers and we may need to wait a bit and retry if we see no new # logged data? my $fh = $self->{fh}; seek $fh, $self->{pos}, POSIX::SEEK_SET(); # not really needed local $/; # slurp mode my $diff = <$fh>; seek $fh, 0, POSIX::SEEK_END(); $self->{pos} = tell $fh; return defined $diff ? $diff : ''; } 1; __END__ =head1 NAME TestCommon::LogDiff - get log file diffs =head1 Synopsis use TestCommon::LogDiff; use Apache::Test; plan tests => 2; my $path = "/tmp/mylog"; open my $fh, ">>$path" or die "Can't open $path: $!"; my $logdiff = TestCommon::LogDiff->new($path); print $fh "foo 123\n"; my $expected = qr/^foo/; ok t_cmp $logdiff->diff, $expected; print $fh "bar\n"; my $expected = 'bar'; ok t_cmp $logdiff->diff, $expected; =head1 Description Useful for testing the warning, error and other messages going into the log file. =head1 API =head2 new open the log file and point the filehandle pointer to its end. =head2 diff extract any newly logged information since the last check and move the filehandle to the end of the file. =cut mod_perl-2.0.9/t/lib/TestCommon/MemoryLeak.pm0000644000104000010010000000530612540623205021473 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::MemoryLeak; # handy functions to measure memory leaks. since it measures the total # memory size of the process and not just perl leaks, you get your # C/XS leaks discovered too # # For example to test TestAPR::Pool::handler for leaks, add to its # top: # # TestCommon::MemoryLeak::start(); # # and just before returning from the handler add: # # TestCommon::MemoryLeak::end(); # # now start the server with only worker server # # % t/TEST -maxclients 1 -start # # of course use maxclients 1 only if your test be handled with one # client, e.g. proxy tests need at least two clients. # # Now repeat the same test several times (more than 3) # # % t/TEST -run apr/pool -times=10 # # t/logs/error_log will include something like: # # size vsize resident share rss # 196k 132k 196k 0M 196k # 104k 132k 104k 0M 104k # 16k 0k 16k 0k 16k # 0k 0k 0k 0k 0k # 0k 0k 0k 0k 0k # 0k 0k 0k 0k 0k # # as you can see the first few runs were allocating memory, but the # following runs should consume no more memory. The leak tester measures # the extra memory allocated by the process since the last test. Notice # that perl and apr pools usually allocate more memory than they # need, so some leaks can be hard to see, unless many tests (like a # hundred) were run. use strict; use warnings FATAL => 'all'; # XXX: as of 5.8.4 when spawning ithreads we get an annoying # Attempt to free unreferenced scalar ... perlbug #24660 # because of $gtop's CLONE'd object, so pretend that we have no gtop # for now if perl is threaded # GTop v0.12 is the first version that will work under threaded mpms use Config; use constant HAS_GTOP => eval { !$Config{useithreads} && require GTop && GTop->VERSION >= 0.12 }; my $gtop = HAS_GTOP ? GTop->new : undef; my @attrs = qw(size vsize resident share rss); my $format = "%8s %8s %8s %8s %8s\n"; my %before; sub start { die "No GTop avaible, bailing out" unless HAS_GTOP; unless (keys %before) { my $before = $gtop->proc_mem($$); %before = map { $_ => $before->$_() } @attrs; # print the header once warn sprintf $format, @attrs; } } sub end { die "No GTop avaible, bailing out" unless HAS_GTOP; my $after = $gtop->proc_mem($$); my %after = map {$_ => $after->$_()} @attrs; warn sprintf $format, map GTop::size_string($after{$_} - $before{$_}), @attrs; %before = %after; } 1; __END__ mod_perl-2.0.9/t/lib/TestCommon/SameInterp.pm0000644000104000010010000000767712540623205021512 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::SameInterp; use Apache::Test; use Apache::TestUtil; use Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(same_interp_req same_interp_req_body same_interp_skip_not_found); sub same_interp_req { my $res = eval { Apache::TestRequest::same_interp_do(@_); }; return undef if $@ && $@ =~ /unable to find interp/; die $@ if $@; return $res; } sub same_interp_req_body { my $res = same_interp_req(@_); return $res ? $res->content : ""; } sub same_interp_skip_not_found { my $skip_cond = shift; if ($skip_cond) { skip "Skip couldn't find the same interpreter", 0; } else { my ($package, $filename, $line) = caller; # trick ok() into reporting the caller filename/line when a # sub-test fails in sok() return eval < 3; my $url = "/path"; my $same_interp = Apache::TestRequest::same_interp_tie($url); ok $same_interp; my $expected = 1; my $skip = 0; # test GET over the same same_interp for (1..2) { $expected++; my $res = same_interp_req($same_interp, \&GET, $url, foo => 'bar'); $skip++ unless defined $res; same_interp_skip_not_found( $skip, defined $res && $res->content, $expected, "GET over the same interp" ); } =head1 Description In addition to same_interp base blocks from Apache::TestRequest, this helper module provides extra wrappers to simplify the writing of tests META: consider merging those into Apache::TestRequest (or add a new module, e.g. Apache::TestRequestSameInterp) =head1 API =head2 C normally one runs: my $res = GET $url, @data; in the same_interp framework one runs my $res = Apache::TestRequest::same_interp_do($same_interp, \&GET, $url, @data); but if there is a failure to find the same interpreter we get an exception. and there could be other exceptions as well (e.g. failure to run the request). This wrapper handles all exceptions, returning C if the exception was in a failure to find the same interpreter, re-throws the exception otherwise. If there is no exception, the response object is returned. So one passes the same arguments to this wrapper as you'd to Apache::TestRequest::same_interp_do: my $res = same_interp_req($same_interp, \&GET, $url, @data); =head2 C This function calls C> and extracts the response body if the response object is defined. (sort of GET_BODY for same_interp) =head2 C make the tests resistant to a failure of finding the same perl interpreter, which happens randomly and not an error. so instead of running: my $res = same_interp_req($same_interp, \&GET, $url, @data); ok t_cmp(defined $res && $res->content, $expected, "comment") one can run: my $res = same_interp_req($same_interp, \&GET, $url, @data); $skip = defined $res ? 0 : 1; same_interp_skip_not_found( $skip, defined $res && $res->content, $expected, "comment" ); the first argument is used to decide whether to skip the sub-test, the rest of the arguments are passed to 'ok t_cmp'. This wrapper is smart enough to report the correct line number as if ok() was run in the test file itself and not in the wrapper, by doing: my ($package, $filename, $line) = caller; return eval < receives C<@_>, containing all but the skip argument, as if the wrapper was never called. =cut mod_perl-2.0.9/t/lib/TestCommon/TiePerlSection.pm0000644000104000010010000000114312540623205022312 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::TiePerlSection; use strict; use warnings FATAL => 'all'; # the following is needed for the tied %Location test in # sections. Unfortunately it can't be defined in the section itself # due to the bug in perl: # http://rt.perl.org:80/rt3/Ticket/Display.html?id=29018 use Tie::Hash; our @ISA = qw(Tie::StdHash); sub FETCH { my ($hash, $key) = @_; if ($key eq '/tied') { return 'TIED'; } return $hash->{$key}; } 1; mod_perl-2.0.9/t/lib/TestCommon/Utils.pm0000644000104000010010000000452712540623205020532 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCommon::Utils; use strict; use warnings FATAL => 'all'; use APR::Brigade (); use APR::Bucket (); use Apache2::Filter (); use Apache2::Connection (); use Apache2::Const -compile => qw(MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; # perl 5.6.x only triggers taint protection on strings which are at # least one char long sub is_tainted { return ! eval { eval join '', '#', map defined() ? substr($_, 0, 0) : (), @_; 1; }; } # to enable debug start with: (or simply run with -trace=debug) # t/TEST -trace=debug -start sub read_post { my $r = shift; my $debug = shift || 0; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; my $count = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); $count++; warn "read_post: bb $count\n" if $debug; while (!$bb->is_empty) { my $b = $bb->first; if ($b->is_eos) { warn "read_post: EOS bucket:\n" if $debug; $seen_eos++; last; } if ($b->read(my $buf)) { warn "read_post: DATA bucket: [$buf]\n" if $debug; $data .= $buf; } $b->delete; } } while (!$seen_eos); $bb->destroy; return $data; } 1; __END__ =head1 NAME TestCommon::Utils - Common Test Utils =head1 Synopsis use TestCommon::Utils; # test whether some SV is tainted $b->read(my $data); ok TestCommon::Utils::is_tainted($data); my $data = TestCommon::Utils::read_post($r); =head1 Description Various handy testing utils =head1 API =head2 is_tainted is_tainted(@data); returns I if at least one element in C<@data> is tainted, I otherwise. =head2 read_post my $data = TestCommon::Utils::read_post($r); my $data = TestCommon::Utils::read_post($r, $debug); reads the posted data using bucket brigades manipulation. To enable debug pass a true argument C<$debug> =cut mod_perl-2.0.9/t/lib/TestExit/0000755000104000010010000000000012540623205016545 5ustar AdministratorsNonemod_perl-2.0.9/t/lib/TestExit/FromPerlModule.pm0000644000104000010010000000105512540623205022000 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestExit::FromPerlModule; use strict; use warnings FATAL => qw(all); use Apache2::ServerRec; use Apache2::ServerUtil; use Apache2::Log; use Apache2::Const -compile => qw(OK); sub exit_handler { my ($p, $s) = @_; $s->log->info("Child process pid=$$ is exiting - server push"); Apache2::Const::OK; } Apache2::ServerUtil->server->push_handlers(PerlChildExitHandler => \&exit_handler); 1; mod_perl-2.0.9/t/modperl/0000755000104000010010000000000012540623205015670 5ustar AdministratorsNonemod_perl-2.0.9/t/modperl/cookie.t0000644000104000010010000000352712540623205017335 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # The Cookie HTTP header can be accessed via $r->headers_in and in certain # situations via $ENV{HTTP_COOKIE}. # # 'SetHandler perl-script', combined with 'PerlOptions -SetupEnv', or # 'SetHandler modperl' do not populate %ENV with CGI variables. So in # this test we call $r->subprocess_env, which adds them on demand, and # we are able to get the cookie via %ENV. # # the last sub-test makes sure that mod_cgi env vars don't persist # and are properly re-set at the end of each request. # # since the test is run against the same interpreter we also test that # the cookie value doesn't persist if it makes it to %ENV. use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; Apache::TestRequest::user_agent(keep_alive => 1); plan tests => 3, need 'HTML::HeadParser'; my $module = 'TestModperl::cookie'; my $location = '/' . Apache::TestRequest::module2path($module); my $cookie = 'foo=bar'; my %cookies = ( header => $cookie, env => $cookie, nocookie => '', ); # 'nocookie' must be run last, server-side shouldn't find a cookie # (testing that %ENV is reset to its original values for vars set by # $r->subprocess_env, which is run internally for 'perl-script') # this requires that all the tests are run against the same interpter my @tests_ordered = qw(header env nocookie); GET $location; for my $test (@tests_ordered) { my $expected = $test eq 'nocookie' ? '' : "bar"; my @headers = (); push @headers, (Cookie => $cookies{$test}) unless $test eq 'nocookie'; my $received = GET "$location?$test", @headers; ok t_cmp( $received->content, $expected, "perl-script+SetupEnv/cookie: $test" ); } mod_perl-2.0.9/t/modperl/cookie2.t0000644000104000010010000000241312540623205017410 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; # The Cookie HTTP header can be accessed via $r->headers_in and in certain # situations via $ENV{HTTP_COOKIE}. # # in this test we shouldn't be able get the cookie via %ENV, # since 'SetHandler modperl' doesn't set up CGI env var. unless the # handler calls "$r->subprocess_env" by itself # # since the test is run against the same interpreter we also test that # the cookie value doesn't persist if it makes it to %ENV. use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; Apache::TestRequest::user_agent(keep_alive => 1); plan tests => 3, need 'HTML::HeadParser'; my $module = 'TestModperl::cookie2'; my $location = '/' . Apache::TestRequest::module2path($module); my %expected = ( header => "header", subprocess_env => "subprocess_env", env => '', ); my @tests_ordered = qw(header subprocess_env env); for my $test (@tests_ordered) { my $cookie = "key=$test"; my $received = GET "$location?$test", Cookie => $cookie; ok t_cmp( $received->content, $expected{$test}, "perl-script+SetupEnv/cookie: $test", ); } mod_perl-2.0.9/t/modperl/exit.t0000644000104000010010000000145012540623205017026 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest 'GET_BODY_ASSERT'; use Apache::Test; use Apache::TestUtil; use ModPerl::Const -compile => 'EXIT'; my $location = "/TestModperl__exit"; plan tests => 3; { ok t_cmp(GET_BODY_ASSERT("$location?noneval"), 'exited', "exit in non eval context"); } { my $exit_excpt = ModPerl::EXIT; my $body = GET_BODY_ASSERT("$location?eval"); ok t_cmp($body, qr/^ModPerl::Util::exit: \($exit_excpt\) exit was called/, "exit in eval context"); ok !t_cmp($body, qr/must not be reached/, "exit in eval context"); } mod_perl-2.0.9/t/modperl/getc.t0000644000104000010010000000066612540623205017007 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 2; my $location = "/TestModperl__getc"; my $expect = join '', 'a'..'Z'; my $str = POST_BODY $location, content => $expect; ok $str; ok t_cmp($str, $expect, 'getc'); mod_perl-2.0.9/t/modperl/local_env.t0000644000104000010010000000072312540623205020021 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; plan tests => 1, skip_reason('local %ENV is still broken'); my $module = 'TestModperl::local_env'; my $url = Apache::TestRequest::module2url($module); t_debug "connecting to $url"; print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/merge.t0000644000104000010010000000106612540623205017157 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestModperl::merge'; my $url = Apache::TestRequest::module2url($module, {path => '/merge/'}); # test server-to-container merging (without overrides) for: # PerlSetEnv # PerlPassEnv # PerlSetVar # PerlAddVar t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/merge2.t0000644000104000010010000000106412540623205017237 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestModperl::merge'; my $url = Apache::TestRequest::module2url($module, {path => '/merge2/'}); # test server-to-container merging (with overrides) for: # PerlSetEnv # PerlPassEnv # PerlSetVar # PerlAddVar t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/merge3.t0000644000104000010010000000107512540623205017242 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestModperl::merge'; my $url = Apache::TestRequest::module2url($module, {path => '/merge3/'}); # test multi-level merging (server-to-container-to-htaccess) for: # PerlSetEnv # PerlPassEnv # PerlSetVar # PerlAddVar t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/perl_options.t0000644000104000010010000000063112540623205020572 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestModperl::perl_options'; my $url = Apache::TestRequest::module2url($module); t_debug "connecting to $url"; print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/perl_options2.t0000644000104000010010000000063212540623205020655 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestModperl::perl_options2'; my $url = Apache::TestRequest::module2url($module); t_debug "connecting to $url"; print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/modperl/pnotes.t0000644000104000010010000000145412540623205017371 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestModperl::pnotes'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); plan tests => (26 * 3), need_lwp; # first with keepalives Apache::TestRequest::user_agent(reset => 1, keep_alive => 1); t_debug("issuing first request"); print GET_BODY_ASSERT "$url?1"; # now close the connection t_debug("issuing second request"); print GET_BODY_ASSERT "$url?2", Connection => 'close'; # finally, check for a cleared $c->pnotes t_debug("issuing final request"); print GET_BODY_ASSERT "$url?3"; mod_perl-2.0.9/t/modperl/pnotes2.t0000644000104000010010000000157112540623205017453 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY); use Apache::Test; use Apache::TestUtil; use Apache::TestUtil qw/t_start_error_log_watch t_finish_error_log_watch/; my $module = 'TestModperl::pnotes2'; my $url = Apache::TestRequest::module2url($module); my ($u, $ok); t_debug("connecting to $url"); plan tests => 12, need_lwp; Apache::TestRequest::user_agent(reset => 1, keep_alive => 0); for my $i (1..12) { t_client_log_warn_is_expected(); t_start_error_log_watch; $u="$url?$i"; $ok=GET_BODY $u; select undef, undef, undef, 0.2; # give it time to write the logfile ok t_cmp scalar(grep { /pnotes are destroyed after cleanup passed/; } t_finish_error_log_watch), 1, $u; } mod_perl-2.0.9/t/modperl/post_utf8.t0000644000104000010010000000215212540623205020010 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest; my $location = "/TestModperl__post_utf8"; # From A.S.Pushkin's "Evgeniy Onegin" my $data_ascii = "I love you, (why lying?), but I belong to another"; my $data_utf8 = "\x{042F} \x{0432}\x{0430}\x{0441} \x{043B}\x{044E}" . "\x{0431}\x{043B}\x{044E} (\x{043A} \x{0447}\x{0435}\x{043C}\x{0443} " . "\x{043B}\x{0443}\x{043A}\x{0430}\x{0432}\x{0438}\x{0442}\x{044C}?),\n" . "\x{041D}\x{043E} \x{044F} \x{0434}\x{0440}\x{0443}\x{0433}\x{043E}" . "\x{043C}\x{0443} \x{043E}\x{0442}\x{0434}\x{0430}\x{043D}\x{0430};"; my $data = join '=', $data_ascii, $data_utf8; # must encode the utf8 request body # we will skip the response any way if perl < 5.008 utf8::encode($data) if $] >= 5.008; # Accept-Charset is not really needed, since we don't expect the # server side to send anything back but plain ASCII. print POST_BODY_ASSERT $location, content => $data, 'Accept-Charset' => "ISO-8859-1,UTF-8"; mod_perl-2.0.9/t/modperl/print_utf8.t0000644000104000010010000000163512540623205020164 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; # utf encode/decode was added only in 5.8.0 # XXX: currently binmode is only available with perlio (used on the # server side on the tied/perlio STDOUT) plan tests => 1, need need_min_perl_version(5.008), need_perl('perlio'); my $location = "/TestModperl__print_utf8"; my $expected = "Hello Ayhan \x{263A} perlio rules!"; my $res = GET $location; my $received = $res->content; # response body includes wide-chars, but perl doesn't know about it utf8::decode($received) if ($res->header('Content-Type')||'') =~ /utf-8/i; # needed for debugging print out of utf8 strings binmode(STDOUT, ':utf8'); ok t_cmp($received, $expected, 'UTF8 response via tied/perlio STDOUT'); mod_perl-2.0.9/t/modperl/print_utf8_2.t0000644000104000010010000000176212540623205020406 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Config; # utf encode/decode was added only in 5.8.0 # perlio is needed only for the client side, because it calls binmode(STDOUT, ':utf8'); plan tests => 1, need_min_perl_version(5.008); my $location = "/TestModperl__print_utf8_2"; my $expected = "\$r->print() just works \x{263A}"; my $res = GET $location; my $received = $res->content; # response body includes wide-chars, but perl doesn't know about it utf8::decode($received) if ($res->header('Content-Type')||'') =~ /utf-8/i; if ($Config{useperlio}) { # needed for debugging print out of utf8 strings # but works only if perl is built w/ perlio binmode(STDOUT, ':utf8'); ok t_cmp($received, $expected, 'UTF8 response via $r->print'); } else { ok $expected eq $received; } mod_perl-2.0.9/t/modperl/readline.t0000644000104000010010000000072012540623205017637 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 2; my $location = "/TestModperl__readline"; my $expect = join "\n", map { $_ x 24 } 'a'..'e'; my $str = POST_BODY $location, content => $expect; ok $str; ok t_cmp($str, $expect, 'readline'); mod_perl-2.0.9/t/modperl/request_rec_perlio_api.t0000644000104000010010000000165012540623205022603 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Config; my $uri = "/TestModperl__request_rec_perlio_api"; plan tests => 2, need { "perl $]: TIEd IO is used instead of PerlIO" => ($] >= 5.008 && $Config{useperlio}) }; { my $content = join "", 'a'..'j', 'k'..'t'; my $location = "$uri?STDIN"; my $expected = join "", 'a'..'j', "# please", 'k'..'t'; my $received = POST_BODY_ASSERT $location, content => $content; ok t_cmp($received, $expected, "STDIN tests"); } { my $location = "$uri?STDOUT"; my $expected = "life is hard and then you die! next you reincarnate..."; my $received = GET_BODY_ASSERT $location; ok t_cmp($received, $expected, "STDOUT tests"); } mod_perl-2.0.9/t/modperl/setupenv.t0000644000104000010010000000270112540623205017726 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestModperl::setupenv'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); my @locations = ("${url}_mpdefault", "${url}_mpsetup", "${url}_mpdefault", # make sure %ENV is cleared "${url}_mpvoid", "${url}_mpsetupvoid", "${url}_psdefault", "${url}_psnosetup", "${url}_psvoid", "${url}_psnosetupvoid"); # plan the tests from a handler so we can run # tests from within handlers across multiple requests # # this requires keepalives and a per-connection interpreter # to make certain we can plan in one request and test in another # which requires LWP unless (need_lwp() && need_module('mod_env')) { plan tests => 63, 0; } Apache::TestRequest::user_agent(keep_alive => 1); print GET_BODY_ASSERT join '?', $url, scalar @locations; # this tests for when %ENV is populated with CGI variables # as well as the contents of the subprocess_env table # # see setupenv.pm for a full description of the tests foreach my $location (@locations) { t_debug("trying $location"); print GET_BODY_ASSERT $location; } mod_perl-2.0.9/t/modperl/setupenv2.t0000644000104000010010000000221412540623205020007 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $location = "/TestModperl__setupenv2"; my %expected = ( mixed => [qw(loadmodule conf1 conf2 require conf3 config_require conf4 perlmodule conf5 conf5 conf6 conf7 conf8 post_config_require)], perl => [qw(loadmodule require config_require perlmodule post_config_require)], ); plan tests => 2 + scalar(@{ $expected{mixed} }) + scalar(@{ $expected{perl} }); while (my ($k, $v) = each %expected) { my @expected = @$v; my $elements = scalar @expected; my $received = GET_BODY "$location?$k"; t_debug "$k: $received"; my @received = split / /, $received; ok t_cmp $received[$_], $expected[$_] for 0..$#expected; ok t_cmp scalar(@received), scalar(@expected), "elements"; if (@received > @expected) { t_debug "unexpected elements: " . join " ", @received[$elements..$#received]; } } mod_perl-2.0.9/t/modperl/status.t0000644000104000010010000000644312540623205017407 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil qw(t_cmp t_server_log_error_is_expected); use Apache2::Const -compile => qw(OK DECLINED NOT_FOUND SERVER_ERROR FORBIDDEN HTTP_OK); plan tests => 15, need 'HTML::HeadParser'; my $base = "/TestModperl__status"; # valid Apache return codes { my $uri = join '?', $base, Apache2::Const::OK; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::HTTP_OK, $uri); } { my $uri = join '?', $base, Apache2::Const::DECLINED; my $code = GET_RC $uri; # no Alias to map us to DocumentRoot ok t_cmp($code, Apache2::Const::NOT_FOUND, $uri); } # standard HTTP status codes { my $uri = join '?', $base, Apache2::Const::NOT_FOUND; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::NOT_FOUND, $uri); } { my $uri = join '?', $base, Apache2::Const::FORBIDDEN; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::FORBIDDEN, $uri); } { my $uri = join '?', $base, Apache2::Const::SERVER_ERROR; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::SERVER_ERROR, $uri); } # apache translates non-HTTP codes into 500 # see ap_index_of_response { my $uri = join '?', $base, 601; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::SERVER_ERROR, $uri); } { my $uri = join '?', $base, 313; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::SERVER_ERROR, $uri); } { my $uri = join '?', $base, 1; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::SERVER_ERROR, $uri); } # HTTP_OK is treated as an error, since it's not # OK, DECLINED, or DONE. while apache's lookups # succeed so the 200 is propagated to the client, # there's an error beneath that 200 code. { my $uri = join '?', $base, Apache2::Const::HTTP_OK; my $response = GET $uri; ok t_cmp($response->code, Apache2::Const::HTTP_OK, $uri); ok t_cmp($response->content, qr/server encountered an internal error/, $uri); } # mod_perl-specific implementation tests { # ModPerl::Util::exit - voids return OK my $uri = join '?', $base, 'exit'; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::HTTP_OK, $uri); } { # die gets trapped my $uri = join '?', $base, 'die'; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::SERVER_ERROR, $uri); } { my $uri = join '?', $base, 'foobar'; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::HTTP_OK, $uri); } { my $uri = join '?', $base, 'foo9bar'; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::HTTP_OK, $uri); } { my $uri = join '?', $base, 'undef'; my $code = GET_RC $uri; ok t_cmp($code, Apache2::Const::HTTP_OK, $uri); } mod_perl-2.0.9/t/modules/0000755000104000010010000000000012540623205015676 5ustar AdministratorsNonemod_perl-2.0.9/t/modules/apache_resource.t0000644000104000010010000000171712540623205021221 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; plan tests => 1, need qw[BSD::Resource], { "CGI.pm (2.93 or higher) or Apache2::Request is needed" => !!(eval { require CGI && $CGI::VERSION >= 2.93 } || eval { require Apache2::Request })}; { # Apache2::Status menu inserted by Apache::Resource my $url = '/status/perl?rlimit'; my $body = GET_BODY_ASSERT $url; ok $body =~ /RLIMIT_CPU/; } # more tests would be nice, but I'm not sure how to write those w/o # causing problems to the rest of the test suite. # we could enable $ENV{PERL_RLIMIT_DEFAULTS} = 1; before loading # Apache2::Resource, which sets certain default values (works for me) # but it's not guaranteed that it'll work for others (since it's very # OS specific) mod_perl-2.0.9/t/modules/apache_status.t0000644000104000010010000000264612540623205020717 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; my $base_url = '/status/perl'; my @opts = qw(script myconfig rgysubs section_config env isa_tree symdump inc inh_tree sig); plan tests => @opts + 5, need 'HTML::HeadParser', { "CGI.pm (2.93 or higher) or Apache2::Request is needed" => !!(eval { require CGI && $CGI::VERSION >= 2.93 } || eval { require Apache2::Request })}; { my $url = "$base_url"; my $body = GET_BODY_ASSERT $url; # expecting: Embedded Perl version v5.8.2 for ... my $pver = $^V ? sprintf "v%vd", $^V : $]; ok t_cmp($body, qr[Embedded Perl version $pver for]); # menu_item, part 1 # expecting: Test Entry ok $body =~ /Test Menu Entry/; } { # menu_item, part 2 my $url = "$base_url?test_menu"; my $body = GET_BODY_ASSERT $url; ok $body =~ /This is just a test entry/; } for my $opt (@opts) { my $url = "$base_url?$opt"; ok GET_BODY_ASSERT $url; } # B::Terse has an issue with XS, but Apache::Status shouldn't crash on # that { # Syntax Tree Dump: syntax and execution order options for (qw(slow exec)) { my $url = "$base_url/$_/Apache2::Const::OK?noh_b_terse"; ok GET_OK $url; } } mod_perl-2.0.9/t/modules/cgi.t0000644000104000010010000000267412540623205016636 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache2::Build (); my $build = Apache2::Build->build_config; use constant HAVE_LWP => have_lwp(); my $tests = 4; $tests += 1 if HAVE_LWP; plan tests => $tests, need need_min_module_version('CGI', 3.08), {"MP_COMPAT_1X is disabled" => $build->{MP_COMPAT_1X}}; my $module = 'TestModules::cgi'; my $location = '/' . Apache::TestRequest::module2path($module); my($res, $str); sok { my $url = "$location?PARAM=2"; $res = GET $url; $str = $res->content; t_cmp($str, "ok 2", "GET $url"); }; sok { my $content = 'PARAM=%33'; $str = POST_BODY $location, content => $content; t_cmp($str, "ok 3", "POST $location\n$content"); }; if (HAVE_LWP) { sok { t_client_log_warn_is_expected(4) if $] < 5.008 && require CGI && $CGI::VERSION < 3.06; $str = UPLOAD_BODY $location, content => 4; t_cmp($str, "ok 4", 'file upload'); }; } sok { my $header = 'Content-type'; $res = GET $location; t_cmp($res->header($header), qr{^text/test-output}, "$header header"); }; sok { my $header = 'X-Perl-Module'; $res = GET $location; t_cmp($res->header($header), $module, "$header header"); }; mod_perl-2.0.9/t/modules/cgi2.t0000644000104000010010000000260512540623205016712 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache2::Build (); my $build = Apache2::Build->build_config; use constant HAVE_LWP => have_lwp(); my $tests = 4; $tests += 1 if HAVE_LWP; plan tests => $tests, need need_min_module_version(CGI => 3.08); my $module = 'TestModules::cgi2'; my $location = '/' . Apache::TestRequest::module2path($module); my($res, $str); sok { my $url = "$location?PARAM=2"; $res = GET $url; $str = $res->content; t_cmp($str, "ok 2", "GET $url"); }; sok { my $content = 'PARAM=%33'; $str = POST_BODY $location, content => $content; t_cmp($str, "ok 3", "POST $location\n$content"); }; if (HAVE_LWP) { sok { t_client_log_warn_is_expected(4) if $] < 5.008 && require CGI && $CGI::VERSION < 3.06; $str = UPLOAD_BODY $location, content => 4; t_cmp($str, "ok 4", 'file upload'); }; } sok { my $header = 'Content-type'; $res = GET $location; t_cmp($res->header($header), qr{^text/test-output}, "$header header"); }; sok { my $header = 'X-Perl-Module'; $res = GET $location; t_cmp($res->header($header), $module, "$header header"); }; mod_perl-2.0.9/t/modules/cgipost.t0000644000104000010010000000207512540623205017537 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(POST_BODY_ASSERT); my $module = 'TestModules::cgipost'; my $url = '/' . Apache::TestRequest::module2path($module); my @data = (25, 50, 75, 100, 125, 150); plan tests => scalar(@data), need_min_module_version(CGI => 3.08); foreach my $post (@data) { my %param = (); foreach my $key (1 .. $post) { $param{$key} = 'data' x $key; } my $post_data = join '&', map { "$_=$param{$_}" } sort { $a <=> $b } keys %param; my $expected = join ':', map { $param{$_} } sort { $a <=> $b } keys %param; my $e_length = length $expected; my $received = POST_BODY_ASSERT $url, content => $post_data; my $r_length = length $received; t_debug "expected $e_length bytes, received $r_length bytes\n"; ok ($expected eq $received); } mod_perl-2.0.9/t/modules/cgipost2.t0000644000104000010010000000207612540623205017622 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest qw(POST_BODY_ASSERT); my $module = 'TestModules::cgipost2'; my $url = '/' . Apache::TestRequest::module2path($module); my @data = (25, 50, 75, 100, 125, 150); plan tests => scalar(@data), need_min_module_version(CGI => 3.08); foreach my $post (@data) { my %param = (); foreach my $key (1 .. $post) { $param{$key} = 'data' x $key; } my $post_data = join '&', map { "$_=$param{$_}" } sort { $a <=> $b } keys %param; my $expected = join ':', map { $param{$_} } sort { $a <=> $b } keys %param; my $e_length = length $expected; my $received = POST_BODY_ASSERT $url, content => $post_data; my $r_length = length $received; t_debug "expected $e_length bytes, received $r_length bytes\n"; ok ($expected eq $received); } mod_perl-2.0.9/t/modules/cgiupload.t0000644000104000010010000000206112540623205020031 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::Build (); use File::Spec::Functions qw(catfile); my $build = Apache2::Build->build_config; plan tests => 2, need need_lwp(), need need_min_module_version('CGI', 3.08), {"MP_COMPAT_1X is disabled" => $build->{MP_COMPAT_1X}}; my $location = "/TestModules__cgiupload"; my $filename; my $pod = 'pod/perlfunc.pod'; for (@INC) { if (-e "$_/$pod") { $filename = "$_/$pod"; last; } } $filename ||= catfile Apache::Test::vars('serverroot'), "..", 'Makefile'; for (1,2) { t_client_log_warn_is_expected(4) if $] < 5.008 && require CGI && $CGI::VERSION < 3.06; my $str = UPLOAD_BODY $location, filename => $filename; my $body_len = length $str; my $file_len = -s $filename; t_debug "body_len=$body_len, file_len=$file_len"; ok $body_len == $file_len; } mod_perl-2.0.9/t/modules/cgiupload2.t0000644000104000010010000000176512540623205020125 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::Build (); use File::Spec::Functions qw(catfile); my $build = Apache2::Build->build_config; plan tests => 2, need need_lwp(), need_min_module_version(CGI => 3.08); my $location = "/TestModules__cgiupload2"; my $filename; my $pod = 'pod/perlfunc.pod'; for (@INC) { if (-e "$_/$pod") { $filename = "$_/$pod"; last; } } $filename ||= catfile Apache::Test::vars('serverroot'), "..", 'Makefile'; for (1,2) { t_client_log_warn_is_expected(4) if $] < 5.008 && require CGI && $CGI::VERSION < 3.06; my $str = UPLOAD_BODY $location, filename => $filename; my $body_len = length $str; my $file_len = -s $filename; t_debug "body_len=$body_len, file_len=$file_len"; ok $body_len == $file_len; } mod_perl-2.0.9/t/modules/include.t0000644000104000010010000000133612540623205017511 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; #test for mod_include include virtual of a mod_perl script my @patterns = ( 'mod_perl mod_include test', 'Hello World', 'cgi.pm', 'footer', ); plan tests => 2 + @patterns, need need_module('mod_include', 'mod_mime'), need_min_module_version(CGI => 3.08); my $location = "/includes/test.shtml"; my($res, $str); $res = GET $location; ok $res->is_success; $str = $res->content; ok $str; for my $pat (@patterns) { ok t_cmp($str, qr{$pat}, "/$pat/"); } mod_perl-2.0.9/t/modules/include2.t0000644000104000010010000000135112540623205017570 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; #test for mod_include parsing of mod_perl script output #XXX: needs to be more robust. see t/htdocs/includes-registry/test.spl my @patterns = ( 'Perl-SSI', #MY_TEST 'mod_perl', #SERVER_SOFTWARE ); plan tests => 2 + @patterns, ['include', 'mod_mime', 'HTML::HeadParser']; my $location = "/includes-registry/test.spl"; my($res, $str); $res = GET $location; ok $res->is_success; $str = $res->content; ok $str; for my $pat (@patterns) { ok t_cmp($str, qr{$pat}, "/$pat/"); } mod_perl-2.0.9/t/modules/include_subreq.t0000644000104000010010000000106012540623205021064 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; my $module = 'TestModules::include_subreq'; my $location = '/' . Apache::TestRequest::module2path($module); plan tests => 1, ['include']; my($res, $str); my $expected = "subreq is quite ok"; my $received = GET_BODY_ASSERT "$location/one"; ok t_cmp($received, $expected, "handler => filter => handler"); mod_perl-2.0.9/t/modules/proxy.t0000644000104000010010000000123712540623205017247 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestModules::proxy'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); my @modules = qw(mod_proxy proxy_http.c); push @modules, 'mod_access_compat' if have_min_apache_version("2.4.0"); plan tests => 1, need need_module(@modules), need_access; my $expected = "ok"; my $received = GET_BODY_ASSERT $url; ok t_cmp($received, $expected, "internally proxified request"); mod_perl-2.0.9/t/perl/0000755000104000010010000000000012540623205015170 5ustar AdministratorsNonemod_perl-2.0.9/t/perl/hash_attack.t0000644000104000010010000000100612540623205017624 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache::TestRequest 'GET_BODY_ASSERT'; plan tests => 1, need { "relevant only for perl 5.8.2 and up to 5.17.6" => ($] >= 5.008002 && $] < 5.017006) }; my $expected = "ok"; my $received = GET_BODY_ASSERT "/TestPerl__hash_attack"; ok($expected eq $received); mod_perl-2.0.9/t/preconnection/0000755000104000010010000000000012540623205017074 5ustar AdministratorsNonemod_perl-2.0.9/t/preconnection/note.t0000644000104000010010000000106512540623205020230 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; my $module = 'TestPreConnection::note'; my $url = Apache::TestRequest::module2url($module); my $config = Apache::Test::config(); my $remote_addr = $config->{vars}->{remote_addr}; t_debug("connecting to $url"); plan tests => 1; ok t_cmp( GET_BODY_ASSERT($url), $remote_addr, "connection notes"); mod_perl-2.0.9/t/preconnection/TestPreConnection/0000755000104000010010000000000012540623205022502 5ustar AdministratorsNonemod_perl-2.0.9/t/preconnection/TestPreConnection/note.pm0000644000104000010010000000210312540623205024001 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestPreConnection::note; use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use Apache::TestTrace; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); use constant APACHE24 => have_min_apache_version('2.4.0'); sub handler { my Apache2::Connection $c = shift; my $ip = APACHE24 ? $c->client_ip : $c->remote_ip; debug "ip: $ip"; $c->notes->set(preconnection => $ip); return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->print($r->connection->notes->get('preconnection') || ''); return Apache2::Const::OK } 1; __END__ PerlPreConnectionHandler TestPreConnection::note SetHandler modperl PerlResponseHandler TestPreConnection::note::response mod_perl-2.0.9/t/protocol/0000755000104000010010000000000012540623205016067 5ustar AdministratorsNonemod_perl-2.0.9/t/protocol/echo_bbs.t0000644000104000010010000000103712540623205020021 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(hello wonderful world); plan tests => 1 + @test_strings; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_bbs'); ok $socket; for (@test_strings) { print $socket "$_\n"; chomp(my $reply = <$socket>||''); ok t_cmp($reply, uc($_)); } mod_perl-2.0.9/t/protocol/echo_bbs2.t0000644000104000010010000000102612540623205020101 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(hello world); plan tests => 1 + @test_strings; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_bbs2'); ok $socket; for (@test_strings) { print $socket "$_\n"; chomp(my $reply = <$socket>||''); ok t_cmp($reply, uc($_)); } mod_perl-2.0.9/t/protocol/echo_block.t0000644000104000010010000000121012540623205020336 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(hello world); # blocking socket bug fixed in 2.0.52 my $ok = $^O !~ /^(Open|Net)BSD$/i || need_min_apache_version('2.0.52'); plan tests => 1 + @test_strings, $ok; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_block'); ok $socket; for (@test_strings) { print $socket "$_\n"; chomp(my $reply = <$socket>||''); ok t_cmp($reply, $_); } mod_perl-2.0.9/t/protocol/echo_filter.t0000644000104000010010000000121512540623205020536 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(hello world); # blocking socket bug fixed in 2.0.52 my $ok = $^O !~ /^(Open|Net)BSD$/i || need_min_apache_version('2.0.52'); plan tests => 1 + @test_strings, $ok; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_filter'); ok $socket; for (@test_strings) { print $socket "$_\n"; chomp(my $reply = <$socket>||''); ok t_cmp($reply, uc($_)); } mod_perl-2.0.9/t/protocol/echo_nonblock.t0000644000104000010010000000137212540623205021062 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); plan tests => 3; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_nonblock'); ok $socket; my $received; my $expected; $expected = "nonblocking"; print $socket "$expected\n"; chomp($received = <$socket> || ''); ok t_cmp $received, $expected, "no timeout"; # now get a timed out request $expected = "TIMEUP"; sleep 1; # try to ensure a CPU context switch for the server print $socket "should timeout\n"; chomp($received = <$socket> || ''); ok t_cmp $received, $expected, "timed out"; mod_perl-2.0.9/t/protocol/echo_timeout.t0000644000104000010010000000103612540623205020740 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my @test_strings = qw(good bye cruel world); plan tests => 1 + @test_strings; my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_timeout'); ok $socket; for (@test_strings) { print $socket "$_\n"; chomp(my $reply = <$socket>||''); ok t_cmp($reply, $_); } mod_perl-2.0.9/t/protocol/pseudo_http.t0000644000104000010010000000734412540623205020622 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest (); my $module = 'TestProtocol::pseudo_http'; { # debug Apache::TestRequest::module($module); my $hostport = Apache::TestRequest::hostport(Apache::Test::config()); t_debug("connecting to $hostport"); } my $login = "stas"; my $passgood = "foobar"; my $passbad = "foObaR"; # blocking socket bug fixed in 2.0.52 my $ok = $^O !~ /^(Open|Net)BSD$/i || need_min_apache_version('2.0.52'); my @modules = (); push @modules, 'mod_access_compat.c' if have_min_apache_version("2.4.0"); plan tests => 13, need need_auth, need_access, @modules, $ok; { # supply correct credential when prompted for such and ask the # server get the secret datetime information my $socket = Apache::TestRequest::vhost_socket($module); ok $socket; #################################################################### # ACTION SEND RECEIVE # # greeting HELO # HELO # Login: # # login $login # Password # # good pass $passgood # banner Welcome to TestProtocol::pseudo_http # Available commands: date quit # date date # The time is: Sat Jul 8 23:51:47 2006 # # eot quit # Goodbye { my $response = ""; $response = Send($socket, 'HELO'); ok t_cmp($response, 'HELO', 'greeting 1'); $response = getline($socket); ok t_cmp($response, 'Login:', 'greeeting 2') } { my $response = Send($socket, $login); ok t_cmp($response, 'Password:', 'login'); } { my $response = ""; $response = Send($socket, $passgood); ok t_cmp($response, 'Welcome to TestProtocol::pseudo_http', 'good pass'); $response = getline($socket); ok t_cmp($response, 'Available commands: date quit', 'banner'); } { my $response = Send($socket, 'date'); ok t_cmp($response, qr/The time is:/, 'date'); } { my $response = Send($socket, 'quit'); ok t_cmp($response, 'Goodbye', 'eot'); } } { # supply correct credential when prompted for such and ask the # server get the secret datetime information my $socket = Apache::TestRequest::vhost_socket($module); ok $socket; #################################################################### # ACTION SEND RECEIVE # # greeting HELO # HELO # Login: # # login $login # Password # # bad pass $passbad # Access Denied # # eot quit # Goodbye { my $response = ""; $response = Send($socket, 'HELO'); ok t_cmp($response, 'HELO', 'greeting 1'); $response = getline($socket); ok t_cmp($response, 'Login:', 'greeeting 2') } { my $response = Send($socket, $login); ok t_cmp($response, 'Password:', 'login'); } { my $response = ""; $response = Send($socket, $passbad); ok t_cmp($response, 'Access Denied', 'eot'); } } ## send() is reserved sub Send { my ($socket, $str) = @_; t_debug("send: $str"); print $socket $str; chomp(my $recv = <$socket> || ''); t_debug("recv: $recv"); return $recv; } sub getline { my ($socket) = @_; chomp(my $recv = <$socket> || ''); t_debug("getline: $recv"); return $recv; } mod_perl-2.0.9/t/protocol/TestProtocol/0000755000104000010010000000000012540623205020530 5ustar AdministratorsNonemod_perl-2.0.9/t/protocol/TestProtocol/echo_bbs.pm0000644000104000010010000000357612540623205022645 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_bbs; # this test is similar to TestProtocol::echo_filter, but performs the # manipulations on the buckets inside the connection handler, rather # then using filter # it also demonstrates how to use a single bucket bridade to do all # the manipulation use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use APR::Bucket (); use APR::Brigade (); use APR::Error (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK MODE_GETLINE); use APR::Const -compile => qw(SUCCESS SO_NONBLOCK); use APR::Status (); sub handler { my $c = shift; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); while (1) { debug "asking new line"; my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; for (my $b = $bb->first; $b; $b = $bb->next($b)) { last if $b->is_eos; debug "processing new line"; if ($b->read(my $data)) { last if $data =~ /^[\r\n]+$/; my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data); # head->...->$nb->$b ->...->tail # XXX: the next 3 lines could be replaced with a # wrapper function $b->replace($nb); $b->insert_before($nb); $b->delete; $b = $nb; } } $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/protocol/TestProtocol/echo_bbs2.pm0000644000104000010010000000334512540623205022721 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_bbs2; # similar to TestProtocol::echo_bbs but here re-using one bucket # brigade for input and output, using flatten to slurp all the data in # the bucket brigade, and cleanup to get rid of the old buckets use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use APR::Bucket (); use APR::Brigade (); use APR::Error (); use Apache2::Const -compile => qw(OK MODE_GETLINE); use APR::Const -compile => qw(SUCCESS SO_NONBLOCK); use APR::Status (); sub handler { my $c = shift; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); my $bb_in = APR::Brigade->new($c->pool, $c->bucket_alloc); my $bb_out = APR::Brigade->new($c->pool, $c->bucket_alloc); my $last = 0; while (1) { my $rc = $c->input_filters->get_brigade($bb_in, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; next unless $bb_in->flatten(my $data); #warn "read: [$data]\n"; last if $data =~ /^[\r\n]+$/; # transform data here my $bucket = APR::Bucket->new($bb_in->bucket_alloc, uc $data); $bb_out->insert_tail($bucket); $c->output_filters->fflush($bb_out); $bb_in->cleanup; $bb_out->cleanup; } # XXX: add DESTROY and remove explicit calls $bb_in->destroy; $bb_out->destroy; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/protocol/TestProtocol/echo_block.pm0000644000104000010010000000246012540623205023160 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_block; # this test reads from/writes to the socket doing blocking IO # # see TestProtocol::echo_timeout for how to do the same with # nonblocking IO but using the timeout use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use TestCommon::Utils; use Apache2::Const -compile => 'OK'; use APR::Const -compile => qw(SO_NONBLOCK); use constant BUFF_LEN => 1024; sub handler { my Apache2::Connection $c = shift; my APR::Socket $socket = $c->client_socket; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode my $nonblocking = $socket->opt_get(APR::Const::SO_NONBLOCK); if ($nonblocking) { $socket->opt_set(APR::Const::SO_NONBLOCK, 0); # test that we really *are* in the blocking mode !$socket->opt_get(APR::Const::SO_NONBLOCK) or die "failed to set blocking mode"; } while ($socket->recv(my $buffer, BUFF_LEN)) { die "recv() has returned untainted data:" unless TestCommon::Utils::is_tainted($buffer); $socket->send($buffer); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/protocol/TestProtocol/echo_filter.pm0000644000104000010010000000322012540623205023346 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_filter; # see also TestFilter::both_str_con_add use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use APR::Bucket (); use APR::Brigade (); use APR::Error (); use base qw(Apache2::Filter); use APR::Const -compile => qw(SUCCESS SO_NONBLOCK); use APR::Status (); use Apache2::Const -compile => qw(OK MODE_GETLINE); use constant BUFF_LEN => 1024; sub uc_filter : FilterConnectionHandler { my $filter = shift; while ($filter->read(my $buffer, BUFF_LEN)) { $filter->print(uc $buffer); } return Apache2::Const::OK; } sub handler { my $c = shift; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc); while (1) { my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE); last if APR::Status::is_EOF($rc); die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS; # fflush is the equivalent of the following 3 lines of code: # # my $b = APR::Bucket::flush_create($c->bucket_alloc); # $bb->insert_tail($b); # $c->output_filters->pass_brigade($bb); $c->output_filters->fflush($bb); } $bb->destroy; Apache2::Const::OK; } 1; __END__ PerlModule TestProtocol::echo_filter PerlOutputFilterHandler TestProtocol::echo_filter::uc_filter mod_perl-2.0.9/t/protocol/TestProtocol/echo_nonblock.pm0000644000104000010010000000454212540623205023676 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_nonblock; # this test reads from/writes to the socket doing nonblocking IO use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use APR::Error (); use Apache::TestTrace; use Apache2::Const -compile => 'OK'; use APR::Const -compile => qw(SO_NONBLOCK SUCCESS POLLIN); use APR::Status (); use constant BUFF_LEN => 1024; sub handler { my $c = shift; my $socket = $c->client_socket; $socket->opt_set(APR::Const::SO_NONBLOCK, 1); my $counter = 0; my $timeout = 0; while (1) { debug "counter: $counter"; if ($counter == 1) { # this will certainly cause timeout $timeout = 0; } else { # Wait up to ten seconds for data to arrive. $timeout = 10_000_000; } $counter++; my $rc = $socket->poll($c->pool, $timeout, APR::Const::POLLIN); if ($rc == APR::Const::SUCCESS) { my $buf; my $len = eval { $socket->recv($buf, BUFF_LEN) }; if ($@) { # rethrow die $@ unless ref $@ eq 'APR::Error' && (APR::Status::is_ECONNABORTED($@) || APR::Status::is_ECONNRESET($@)); # ECONNABORTED == 103 # ECONNRESET == 104 # ECONNABORTED is not an application error # XXX: we don't really test that we always get this # condition, since it depends on the timing of the # client closing the socket. may be it'd be possible # to make sure that APR::Const::ECONNABORTED was received # when $counter == 2 if we have slept enough, but how # much is enough is unknown debug "caught '104: Connection reset by peer' error"; last; } last unless $len; debug "sending: $buf"; $socket->send($buf); } elsif (APR::Status::is_TIMEUP($rc)) { debug "timeout"; $socket->send("TIMEUP\n"); } else { die "poll error: $rc: " . APR::Error::strerror($rc); } } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/protocol/TestProtocol/echo_timeout.pm0000644000104000010010000000263412540623205023557 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::echo_timeout; # this test reads from/writes to the socket doing nonblocking IO but # using the timeout # # see TestProtocol::echo_block for how to do the same with blocking IO use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use APR::Socket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => qw(SO_NONBLOCK); use APR::Status (); use constant BUFF_LEN => 1024; sub handler { my Apache2::Connection $c = shift; my APR::Socket $socket = $c->client_socket; # starting from Apache 2.0.49 several platforms require you to set # the socket to a blocking IO mode $c->client_socket->opt_set(APR::Const::SO_NONBLOCK, 0); # set timeout (20 sec) so later we can do error checking on # read/write timeouts $socket->timeout_set(20_000_000); while (1) { my $buff; my $rlen = eval { $socket->recv($buff, BUFF_LEN) }; if ($@) { die "timed out, giving up: $@" if APR::Status::is_TIMEUP($@); die $@; } last unless $rlen; # EOF my $wlen = eval { $socket->send($buff) }; if ($@) { die "timed out, giving up: $@" if APR::Status::is_TIMEUP($@); die $@; } } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/protocol/TestProtocol/pseudo_http.pm0000644000104000010010000001110012540623205023415 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestProtocol::pseudo_http; # this is a more advanced protocol implementation. While using a # simplistic socket communication, the protocol uses an almost # complete HTTP AAA (access and authentication, but not authorization, # which can be easily added) provided by mod_auth (but can be # implemented in perl too) # # see the protocols.pod document for the explanations of the code use strict; use warnings FATAL => 'all'; use Apache2::Connection (); use Apache2::RequestUtil (); use Apache2::HookRun (); use Apache2::Access (); use APR::Socket (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK DONE DECLINED); use APR::Const -compile => qw(SO_NONBLOCK); my @cmds = qw(date quit); my %commands = map { $_, \&{$_} } @cmds; sub handler { my $c = shift; my $socket = $c->client_socket; if ($socket->opt_get(APR::Const::SO_NONBLOCK)) { $socket->opt_set(APR::Const::SO_NONBLOCK => 0); } if ((my $rc = greet($c)) != Apache2::Const::OK) { $socket->send("Say HELO first\n"); return $rc; } if ((my $rc = login($c)) != Apache2::Const::OK) { $socket->send("Access Denied\n"); return $rc; } $socket->send("Welcome to " . __PACKAGE__ . "\nAvailable commands: @cmds\n"); while (1) { my $cmd; next unless $cmd = getline($socket); if (my $sub = $commands{$cmd}) { last unless $sub->($socket) == Apache2::Const::OK; } else { $socket->send("Commands: @cmds\n"); } } return Apache2::Const::OK; } sub greet { my $c = shift; my $socket = $c->client_socket; $socket->send("HELO\n"); my $reply = getline($socket) || ''; return $reply eq 'HELO' ? Apache2::Const::OK : Apache2::Const::DECLINED; } sub login { my $c = shift; my $r = Apache2::RequestRec->new($c); # test whether we can invoke modperl HTTP handlers on the fake $r $r->push_handlers(PerlAccessHandler => \&my_access); $r->location_merge(__PACKAGE__); for my $method (qw(run_access_checker run_check_user_id run_auth_checker)) { my $rc = $r->$method(); if ($rc != Apache2::Const::OK and $rc != Apache2::Const::DECLINED) { return $rc; } last unless $r->some_auth_required; unless ($r->user) { my $socket = $c->client_socket; my $username = prompt($socket, "Login"); my $password = prompt($socket, "Password"); $r->set_basic_credentials($username, $password); } } return Apache2::Const::OK; } sub my_access { # just test that we can invoke a mod_perl HTTP handler debug "running my_access"; return Apache2::Const::OK; } sub getline { my $socket = shift; my $line; $socket->recv($line, 1024); return unless $line; $line =~ s/[\r\n]*$//; return $line; } sub prompt { my ($socket, $msg) = @_; $socket->send("$msg:\n"); getline($socket); } sub date { my $socket = shift; $socket->send("The time is: " . scalar(localtime) . "\n"); return Apache2::Const::OK; } sub quit { my $socket = shift; $socket->send("Goodbye\n"); return Apache2::Const::DONE } 1; __END__ PerlProcessConnectionHandler TestProtocol::pseudo_http Order Deny,Allow Allow from @servername@ 2.4.1> Order Deny,Allow Allow from @servername@ # htpasswd -mbc basic-auth stas foobar # using md5 password so it'll work on win32 too AuthUserFile @ServerRoot@/htdocs/protocols/basic-auth AuthName TestProtocol::pseudo_http AuthType Basic Require user stas Satisfy any 2.4.1> Satisfy any mod_perl-2.0.9/t/response/0000755000104000010010000000000012540623174016071 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestApache/0000755000104000010010000000000012540623206020106 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestApache/cgihandler.pm0000644000104000010010000000214112540623205022541 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::cgihandler; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => qw(OK M_POST); #test the 1.x style perl-script handler sub handler { my $r = shift; $ENV{FOO} = 2; if ($r->method_number == Apache2::Const::M_POST) { my $cl = $r->headers_in->get('content-length'); my $buff; #XXX: working around a bug in ithreads Perl #that would cause modules/cgi #3 to fail # read STDIN, $buff, $cl; read 'STDIN', $buff, $cl; print $buff; } else { print "1..3\n"; print "ok 1\n", "ok ", "$ENV{FOO}\n"; #XXX: current implementation of tie %ENV to $r->subprocess_env # is not threadsafe # my $foo = $r->subprocess_env->get('FOO'); my $foo = $ENV{FOO}; $foo++; print "ok $foo\n"; } Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlResponseHandler TestApache::cgihandler mod_perl-2.0.9/t/response/TestApache/conftree.pm0000644000104000010010000000504512540623205022254 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::conftree; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestConfig (); use Apache2::Directive (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $cfg = Apache::Test::config(); my $node_count = node_count(); plan $r, tests => 8 + (5*$node_count); ok $cfg; my $vars = $cfg->{vars}; ok $vars; my $tree = Apache2::Directive::conftree(); ok $tree; my $hostname_lookups = $tree->lookup('HostnameLookups'); ok t_cmp($hostname_lookups, "Off"); my $documentroot = $tree->lookup('DocumentRoot'); ok t_cmp(ref($tree->as_hash()), 'HASH', 'as_hash'); ok t_cmp($documentroot, qq("$vars->{documentroot}")); ok t_cmp($tree->lookup("DocumentRoot"), qq("$vars->{documentroot}")); #XXX: This test isn't so good, but its quite problematic to try #and _really_ compare $cfg and $tree... { my %vhosts = map { $cfg->{vhosts}{$_}{name} => { %{$cfg->{vhosts}{$_}}, index => $_ } } keys %{$cfg->{vhosts}}; for my $v (keys %vhosts) { $vhosts{ $vhosts{$v}{index} } = $vhosts{$v}; } my $vhost_failed; for my $vhost ($tree->lookup("VirtualHost")) { unless (exists $vhosts{$vhost->{'ServerName'} || $vhost->{'PerlProcessConnectionHandler'}}) { $vhost_failed++; } } ok !$vhost_failed; } traverse_tree ( \&test_node ); Apache2::Const::OK; } sub test_node { my ($data, $node) = @_; ok $node->directive; #Args can be null for argless directives ok $node->args || 1; #As string can be null for containers ok $node->as_string || 1; ok $node->filename; ok $node->line_num; } sub traverse_tree { my ($sub, $data) = @_; my $node = Apache2::Directive::conftree(); while ($node) { $sub->($data, $node); if (my $kid = $node->first_child) { $node = $kid; } elsif (my $next = $node->next) { $node = $next; } else { if (my $parent = $node->parent) { $node = $parent->next; } else { $node = undef; } } } return; } sub node_count { my $node_count = 0; traverse_tree( sub { ${$_[0]}++ }, \$node_count ); return $node_count; } 1; mod_perl-2.0.9/t/response/TestApache/content_length_header.pm0000644000104000010010000000162012540623205024765 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::content_length_header; # see the client t/apache/content_length_header.t for the comments use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Response (); use Apache2::Const -compile => 'OK'; my $body = "This is a response string"; sub handler { my $r = shift; $r->content_type('text/plain'); my $args = $r->args || ''; if ($args =~ /set_content_length/) { $r->set_content_length(length $body); } if ($args =~ /send_body/) { $r->print($body); } if ($args =~ /head_no_body/) { if ($r->header_only) { # see #2 in the discussion in the client $r->rflush; } } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/daemon.pm0000644000104000010010000000151412540623205021707 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::daemon; # Apache2::ServerUtil tests use strict; use warnings FATAL => 'all'; use Apache2::ServerUtil (); use Apache::TestConfig (); use Apache::TestUtil; use Apache::Test; use constant WIN32 => Apache::TestConfig::WIN32; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 2; my $user_id = Apache2::ServerUtil->user_id; my $user_id_expected = WIN32 ? 0 : $<; ok t_cmp $user_id, $user_id_expected, "user id"; my $group_id = Apache2::ServerUtil->group_id; my ($group_id_expected) = WIN32 ? 0 : ($( =~ /^(\d+)/); ok t_cmp $group_id, $group_id_expected, "group id"; Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestApache/discard_rbody.pm0000644000104000010010000000325112540623205023254 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::discard_rbody; # test $r->discard_request_body when the input body wasn't read at # all, read partially or completely. use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Connection (); use Apache2::Filter (); use APR::Brigade (); use APR::Error (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub handler { my $r = shift; $r->content_type('text/plain'); my $test = $r->args; if ($test eq 'none') { # don't read the request body } elsif ($test eq 'partial') { # read some of request POSTed data (IOBUFSIZE bytes), # but not all of it my $filters = $r->input_filters(); my $ba = $r->connection->bucket_alloc; my $bb = APR::Brigade->new($r->pool, $ba); $filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); } elsif ($test eq 'all') { # consume all of the request body my $data = TestCommon::Utils::read_post($r); die "failed to consume all the data" unless length($data) == 100000; } # now get rid of the rest of the input data should work, no matter # how little or how much of the body was read my $rc = $r->discard_request_body; die APR::Error::strerror($rc) unless $rc == Apache2::Const::OK; $r->print($test); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/post.pm0000644000104000010010000000103212540623205021424 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::post; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use TestCommon::Utils (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); my $data = TestCommon::Utils::read_post($r) || ""; $r->puts(join ':', length($data), $data); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/read.pm0000644000104000010010000000223112540623205021354 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::read; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use TestCommon::Utils; use Apache2::Const -compile => 'OK'; use constant BUFSIZ => 512; #small for testing sub handler { my $r = shift; $r->content_type('text/plain'); my $cl = $r->headers_in->get('content-length'); my $buffer = ""; my $bufsiz = $r->args || BUFSIZ; my $offset = 0; while (my $remain = $cl - $offset) { my $len = $remain >= $bufsiz ? $bufsiz : $remain; my $read = $r->read($buffer, $len, $offset); if ($read != $len) { die "read only ${read}b, while ${len}b were requested\n"; } last unless $read > 0; $offset += $read; } die "read() has returned untainted data:" unless TestCommon::Utils::is_tainted($buffer); # make sure we dont block after all data is read my $n = $r->read(my $x, BUFSIZ); die unless $n == 0; $r->puts($buffer); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/read2.pm0000644000104000010010000000235112540623205021441 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::read2; # extra tests in addition to TestApache::read use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); my $expected = "foobar"; sub handler { my $r = shift; # test the case where the buffer to be filled has set magic # attached. which is the case when one passes an non-existing hash # entry value. it's not autovivified when passed to the function # and it's not undef. running SetMAGIC inside read accomplishes # the autovivication in this particular case. my $data; my $len = $r->read($data->{buffer}, $r->headers_in->{'Content-Length'}); # only print the plan out after reading to avoid chances of a deadlock # see http://mail-archives.apache.org/mod_mbox/perl-dev/201408.mbox/%3C20140809104131.GA3670@estella.local.invalid%3E plan $r, tests => 1; ok t_cmp($data->{buffer}, $expected, "reading into an autovivified hash entry"); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/read3.pm0000644000104000010010000000175612540623205021452 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::read3; # extra tests in addition to TestApache::read use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); my $expected = "foobar"x2000; sub handler { my $r = shift; # test to read data up to end of file is signaled my $data = ''; my $where = 0; my $len; do { $len = $r->read($data, 100, $where); $where += $len; } while ($len > 0); # only print the plan out after reading to avoid chances of a deadlock # see http://mail-archives.apache.org/mod_mbox/perl-dev/201408.mbox/%3C20140809104131.GA3670@estella.local.invalid%3E plan $r, tests => 1; ok t_cmp($data, $expected, "reading up to end of file"); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/read4.pm0000644000177200010010000000602512540623205017544 0ustar SteveNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::read4; # extra tests in addition to TestApache::read use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); my @expected = ("123foo", "123456".("\0"x(1000-length("123456")))."bar", "123f", "23f\0\0o", qr/\bread-?only\b/, $^V, "ARo", qr/\bread-?only\b/, ".........", # Reading into $1 (the test above) eats up input since perl # 5.10. This was also the version that blessed $^V as a # "version" object. (ref $^V ? "\0\0ar" : "\0\0bar"), "12", ""); sub X::TIESCALAR {bless []=>'X'} sub X::FETCH {$_[0]->[0]} sub X::STORE {$_[0]->[0]=$_[1]} sub handler { my $r = shift; plan $r, tests => 12; my $test = 0; # we get the string "foobarfoobar" as input here # this test consumes 3 bytes my $data = 12345; $r->read($data, 3, -2); ok t_cmp($data, $expected[$test++], "negative offset"); # "barfoobar" still to be read $data = 123456; # now $data is a valid IV but has a PV buffer assigned. # read() has to convert to a valid PV. $r->read($data, 3, 1000); ok t_cmp($data, $expected[$test++], "offset > length of string"); # "foobar" still to be read $r->read($data, 1, 3); ok t_cmp($data, $expected[$test++], "shrink string"); # "oobar" still to be read substr($data, 0, 1) = ''; # set the OOK flag (PV starts at offset 1) $r->read($data, 1, 5); ok t_cmp($data, $expected[$test++], "PV with OOK flag set"); # "obar" still to be read # this test dies BEFORE reading anything eval {$r->read($^V, 1)}; ok t_cmp($@, $expected[$test++], "read-only \$^V"); ok t_cmp($^V, $expected[$test++], "\$^V untouched"); # "obar" still to be read $data=[]; eval {$r->read($data, 1, 2)}; ok t_cmp($data, $expected[$test++], "passing an RV as data"); # "bar" still to be read # this test consumes the "b" although it should not "........."=~/(.*)/; eval {$r->read($1, 1)}; my $x="$1"; # just in case ok t_cmp($@, $expected[$test++], "read-only \$1"); ok t_cmp($x, $expected[$test++], "\$1 untouched"); # "ar" still to be read # now eat up the rest of input tie $data, 'X'; $data=''; $r->read($data, 100, 2); ok t_cmp(tied($data)->[0], $expected[$test++], "read into a tied buffer"); untie $data; # input is empty $data=123456; $r->read($data, 1000, 2); ok t_cmp($data, $expected[$test++], "read at eof"); # input is empty $r->read($data, 1000); ok t_cmp($data, $expected[$test++], "repeated read at eof"); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestApache/scanhdrs.pm0000644000104000010010000000117612540623205022255 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::scanhdrs; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::compat (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; print "Status: 200 Bottles of beer on the wall\n"; print 'X-Perl-Module', ': ', __PACKAGE__; print "\r\n"; print "Content-type: text/test-"; print "output\n"; print "\n"; print "ok 1\n"; Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions +ParseHeaders mod_perl-2.0.9/t/response/TestApache/scanhdrs2.pm0000644000104000010010000000072112540623205022332 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::scanhdrs2; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $location = $r->args; print "Location: $location\n\n"; Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions +ParseHeaders mod_perl-2.0.9/t/response/TestApache/send_cgi_header.pm0000644000104000010010000000143712540623205023533 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::send_cgi_header; use strict; use warnings FATAL => 'all'; use Apache2::Response (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # at the same time test the \0 binary at the beginning of the data my $response = <send_cgi_header($response); Apache2::Const::OK; } 1; __END__ # this should work regardless whether parse headers is on or off PerlOptions -ParseHeaders mod_perl-2.0.9/t/response/TestApache/subprocess.pm0000644000104000010010000001234112540623205022634 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::subprocess; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Build; use File::Spec::Functions qw(catfile catdir); use IO::Select (); use Apache2::Const -compile => 'OK'; use Config; my $perl = Apache2::Build->build_config()->perl_config('perlpath'); my %scripts = ( argv => 'print STDOUT "@ARGV";', env => 'print STDOUT $ENV{SubProcess}', in_out => 'print STDOUT scalar ;', in_err => 'print STDERR scalar ;', ); sub APACHE_TEST_CONFIGURE { my ($class, $self) = @_; my $vars = $self->{vars}; my $target_dir = catdir $vars->{documentroot}, "util"; while (my ($file, $code) = each %scripts) { $file = catfile $target_dir, "$file.pl"; $self->write_perlscript($file, "$code\n"); } } sub handler { my $r = shift; my $cfg = Apache::Test::config(); my $vars = $cfg->{vars}; plan $r, tests => 5, need qw(APR::PerlIO Apache2::SubProcess); my $target_dir = catfile $vars->{documentroot}, "util"; { # test: passing argv + void context my $script = catfile $target_dir, "argv.pl"; my @argv = qw(foo bar); $r->spawn_proc_prog($perl, [$script, @argv]); # can't really test if something is still returned since it # will be no longer void context ok 1; } { # test: passing argv + scalar context my $script = catfile $target_dir, "argv.pl"; my @argv = qw(foo bar); my $out_fh = $r->spawn_proc_prog($perl, [$script, @argv]); my $output = read_data($out_fh); ok t_cmp([split / /, $output], \@argv, "passing ARGV" ); } { # test: passing env to subprocess through subprocess_env my $script = catfile $target_dir, "env.pl"; my $value = "my cool proc"; $r->subprocess_env->set(SubProcess => $value); my $out_fh = $r->spawn_proc_prog($perl, [$script]); my $output = read_data($out_fh); ok t_cmp($output, $value, "passing env via subprocess_env" ); } { # test: subproc's stdin -> stdout + list context my $script = catfile $target_dir, "in_out.pl"; my $value = "my cool proc\r\n"; # must have \n for my ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($perl, [$script]); print $in_fh $value; (my $output = read_data($out_fh)) =~ s/[\r\n]{1,2}/\r\n/; ok t_cmp($output, $value, "testing subproc's stdin -> stdout + list context" ); } { # test: subproc's stdin -> stderr + list context my $script = catfile $target_dir, "in_err.pl"; my $value = "my stderr\r\n"; # must have \n for my ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($perl, [$script]); print $in_fh $value; (my $output = read_data($err_fh)) =~ s/[\r\n]{1,2}/\r\n/; ok t_cmp($output, $value, "testing subproc's stdin -> stderr + list context" ); } # could test send_fd($out), send_fd($err), but currently it's only in # compat.pm. # these are wannabe's # ok t_cmp( # Apache2::SubProcess::spawn_proc_sub($r, $sub, \@args), # Apache2::SUCCESS, # "spawn a subprocess and run a subroutine in it" # ); # ok t_cmp( # Apache2::SubProcess::spawn_thread_prog($r, $command, \@argv), # Apache2::SUCCESS, # "spawn thread and run a program in it" # ); # ok t_cmp( # Apache2::SubProcess::spawn_thread_sub($r, $sub, \@args), # Apache2::SUCCESS, # "spawn thread and run a subroutine in it" # ); Apache2::Const::OK; } sub read_data { my ($fh) = @_; my @data = (); my $sel = IO::Select->new($fh); # here is the catch: # # non-PerlIO pipe fh needs to select if the other end is not fast # enough to send the data, since the read is non-blocking # # PerlIO-based pipe fh on the other hand does the select # internally via apr_wait_for_io_or_timeout() in # apr_file_read() (on *nix, but not on Win32). # But you cannot call select() on the # PerlIO-based, because its fileno() returns (-1), remember that # apr_file_t is an opaque object, and on certain platforms # fileno() is different from unix # # so we use the following wrapper: if we are under perlio we just # go ahead and read the data, but with a short sleep first on Win32; # if we are under non-perlio we first # select for a few secs. (XXX: is 10 secs enough?) # # btw: we use perlIO only for perl 5.7+ # if (APR::PerlIO::PERLIO_LAYERS_ARE_ENABLED() || $sel->can_read(10)) { sleep(1) if $^O eq 'MSWin32' && APR::PerlIO::PERLIO_LAYERS_ARE_ENABLED(); @data = wantarray ? (<$fh>) : <$fh>; } if (wantarray) { return @data; } else { return defined $data[0] ? $data[0] : ''; } } 1; mod_perl-2.0.9/t/response/TestApache/util.pm0000644000104000010010000000735012540623205021425 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::util; # Apache2::Util tests use strict; use warnings FATAL => 'all'; # to fully test this test the following locale settings need to be run: # # some /^en_/ locale, e.g. /^en_GB* # LC_CTYPE=en_GB.UTF-8 LC_TIME=en_GB.UTF-8 t/TEST -verbose apache/util.t # LC_CTYPE=en_GB LC_TIME=en_GB t/TEST -verbose apache/util.t # # some non-/^en_/ locale, e.g. ru_RU # LC_CTYPE=ru_RU.UTF-8 LC_TIME=ru_RU.UTF-8 t/TEST -verbose apache/util.t # LC_CTYPE=ru_RU LC_TIME=ru_RU t/TEST -verbose apache/util.t # regex matching (LC_CTYPE) of strftime-like (LC_TIME) strings use locale; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Util (); use APR::Date (); use Apache::TestUtil; use Apache::Test; use Apache2::Const -compile => 'OK'; # those are passed via PerlPassEnv my $locale = $ENV{LC_TIME} || ''; my $parse_time_ok = $locale =~ /^en_/ ? 1 : 0; my $locale_is_utf8 = $locale =~ /UTF-8$/ ? 1 : 0; sub handler { my $r = shift; plan $r, tests => 8; # ht_time { my $time = time; my $fmt = "%a, %d %b %Y %H:%M:%S %Z"; my $fmtdate; $fmtdate = Apache2::Util::ht_time($r->pool); time_cmp($fmtdate, $time, 'Apache2::Util::ht_time($pool)', 0); $fmtdate = Apache2::Util::ht_time($r->pool, $time); time_cmp($fmtdate, $time, 'Apache2::Util::ht_time($pool, $time)', 1); $fmtdate = Apache2::Util::ht_time($r->pool, $time, $fmt); time_cmp($fmtdate, $time, 'Apache2::Util::ht_time($pool, $time, $fmt)', 1); my $gmt = 0; $fmtdate = Apache2::Util::ht_time($r->pool, $time, $fmt, $gmt); time_cmp($fmtdate, $time, 'Apache2::Util::ht_time($pool, $time, $fmt, $gmt)', 0); } # escape_path { my ($uri, $received, $expected); $uri = "a 'long' file?.html"; ($expected = $uri) =~ s/([\s?;])/sprintf "%%%x", ord $1/ge; $received = Apache2::Util::escape_path($uri, $r->pool); ok t_cmp $received, $expected, "Apache2::Util::escape_path / partial=1 / default"; $received = Apache2::Util::escape_path($uri, $r->pool, 1); ok t_cmp $received, $expected, "Apache2::Util::escape_path / partial=1 / explicit"; $received = Apache2::Util::escape_path($uri, $r->pool, 0); ok t_cmp $received, $expected, "Apache2::Util::escape_path / partial=0"; $uri = "a 'long' file?.html:"; ($expected = $uri) =~ s/([\s?;])/sprintf "%%%x", ord $1/ge; # XXX: why does it prepend ./ only if it sees : or :/? $expected = "./$expected"; $received = Apache2::Util::escape_path($uri, $r->pool, 0); ok t_cmp $received, $expected, "Apache2::Util::escape_path / partial=0 / ./ prefix "; } Apache2::Const::OK; } my $fmtdate_re = qr/^\w+, \d\d \w+ \d\d\d\d \d\d:\d\d:\d\d/; sub time_cmp { my ($fmtdate, $time, $comment, $exact_match) = @_; if ($parse_time_ok && $exact_match) { my $ptime = APR::Date::parse_http($fmtdate); t_debug "fmtdate: $fmtdate"; ok t_cmp $ptime, $time, $comment; } else { if ($locale_is_utf8) { if (have_min_perl_version(5.008)) { require Encode; # perl doesn't know yet that $fmtdate is a utf8 string $fmtdate = Encode::decode_utf8($fmtdate); } else { skip "Skip locale $locale needs perl 5.8.0+", 0; return; } } ok t_cmp $fmtdate, $fmtdate_re, $comment; } } 1; __END__ mod_perl-2.0.9/t/response/TestApache/write.pm0000644000104000010010000000116612540623205021601 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestApache::write; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; use constant BUFSIZ => 512; #small for testing sub handler { my $r = shift; $r->content_type('text/plain'); $r->write("1..2"); $r->write("\n", 1); my $ok = "ok 1\n"; $r->write($ok, 2); $r->write($ok, -1, 2); $ok = "not ok 2\n"; $r->write($ok, 5, 4); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/0000755000104000010010000000000012540623206017336 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestAPI/access.pm0000644000104000010010000000320612540623206021136 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::access; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Access (); use Apache2::Const -compile => qw(OK :options :override :satisfy); sub handler { my $r = shift; plan $r, tests => 11; $r->allow_methods(1, qw(GET POST)); ok 1; ok $r->allow_options & Apache2::Const::OPT_INDEXES; ok !($r->allow_options & Apache2::Const::OPT_EXECCGI); ok !($r->allow_overrides & Apache2::Const::OR_LIMIT); ok t_cmp $r->satisfies, Apache2::Const::SATISFY_NOSPEC, "satisfies"; ok t_cmp $r->auth_name, 'modperl', "auth_name"; $r->auth_name('modperl_test'); ok t_cmp $r->auth_name, 'modperl_test', "auth_name"; $r->auth_name('modperl'); ok t_cmp $r->auth_type, 'none', "auth_type"; $r->auth_type('Basic'); ok t_cmp $r->auth_type, 'Basic', "auth_type"; $r->auth_type('none'); ok !$r->some_auth_required; # XXX: this test requires a running identd, which we have no way # to figure out whether it's running, or how to start one. so for # now just check that the method is call-able. my $remote_logname = $r->get_remote_logname() || ''; t_debug "get_remote_logname: $remote_logname"; ok 1; Apache2::Const::OK; } 1; __END__ Options None Options Indexes FollowSymLinks AuthName modperl AuthType none # this directive was moved from core in Apache 2.1 # since we're not testing that identd is running # anyway we probably don't need to include it at all #IdentityCheck On mod_perl-2.0.9/t/response/TestAPI/access2.pm0000644000104000010010000000635012540623206021223 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::access2; # testing $r->requires # in the POST test it returns: # # [ # { # 'method_mask' => -1, # 'requirement' => 'user goo bar' # }, # { # 'method_mask' => -1, # 'requirement' => 'group bar tar' # } # { # 'method_mask' => 4, # 'requirement' => 'valid-user' # } # ]; # # otherwise it returns the same, sans the 'valid-user' entry # # also test: # - $r->some_auth_required when it's required # - $r->satisfies when Satisfy is set use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache2::RequestRec (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED SERVER_ERROR M_POST :satisfy); my $users = "goo bar"; my $groups = "bar tar"; my %users = ( goo => "goopass", bar => "barpass", ); sub handler { my $r = shift; die '$r->some_auth_required failed' unless $r->some_auth_required; my $satisfies = $r->satisfies; die "wanted satisfies=" . Apache2::Const::SATISFY_ALL . ", got $satisfies" unless $r->satisfies() == Apache2::Const::SATISFY_ALL; my ($rc, $sent_pw) = $r->get_basic_auth_pw; return $rc if $rc != Apache2::Const::OK; # extract just the requirement entries my %require = map { my ($k, $v) = split /\s+/, $_->{requirement}, 2; ($k, $v||'') } @{ $r->requires }; debug \%require; # silly (we don't check user/pass here), just checking when # the Limit options are getting through if ($r->method_number == Apache2::Const::M_POST) { if (exists $require{"valid-user"}) { return Apache2::Const::OK; } else { return Apache2::Const::SERVER_ERROR; } } else { # non-POST requests shouldn't see the Limit enclosed entry return Apache2::Const::SERVER_ERROR if exists $require{"valid-user"}; } return Apache2::Const::SERVER_ERROR unless $require{user} eq $users; return Apache2::Const::SERVER_ERROR unless $require{group} eq $groups; my $user = $r->user; my $pass = $users{$user} || ''; unless (defined $pass and $sent_pw eq $pass) { $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } Apache2::Const::OK; } 1; __DATA__ PerlAuthenHandler TestAPI::access2 PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl # needed to test $r->satisfies Allow from All AuthType Basic AuthName "Access" Require user goo bar Require group bar tar Require valid-user Satisfy All # htpasswd -mbc auth-users goo foo # htpasswd -mb auth-users bar mar # using md5 password so it'll work on win32 too AuthUserFile @DocumentRoot@/api/auth-users # group: user1 user2 ... AuthGroupFile @DocumentRoot@/api/auth-groups mod_perl-2.0.9/t/response/TestAPI/access2_24.pm0000644000104000010010000000621012540623206021523 0ustar AdministratorsNonepackage TestAPI::access2_24; # testing $r->requires # in the POST test it returns: # # [ # { # 'method_mask' => -1, # 'requirement' => 'user goo bar' # }, # { # 'method_mask' => -1, # 'requirement' => 'group bar tar' # } # { # 'method_mask' => 4, # 'requirement' => 'valid-user' # } # ]; # # otherwise it returns the same, sans the 'valid-user' entry # # also test: # - $r->some_auth_required when it's required # - $r->satisfies when Satisfy is set use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache2::RequestRec (); use Apache::TestTrace; use Apache2::Const -compile => qw(OK HTTP_UNAUTHORIZED SERVER_ERROR AUTHZ_GRANTED AUTHZ_DENIED M_POST :satisfy AUTHZ_DENIED_NO_USER); my $users = "goo bar"; my $groups = "xar tar"; my %users = ( goo => "goopass", bar => "barpass", ); sub authz_handler { my $self = shift; my $r = shift; my $requires = shift; if (!$r->user) { return Apache2::Const::AUTHZ_DENIED_NO_USER; } return Apache2::Const::SERVER_ERROR unless $requires eq $users or $requires eq $groups; my @require_args = split(/\s+/, $requires); if (grep {$_ eq $r->user} @require_args) { return Apache2::Const::AUTHZ_GRANTED; } return Apache2::Const::AUTHZ_DENIED; } sub authn_handler { my $self = shift; my $r = shift; die '$r->some_auth_required failed' unless $r->some_auth_required; my $satisfies = $r->satisfies; die "wanted satisfies=" . Apache2::Const::SATISFY_ALL . ", got $satisfies" unless $r->satisfies() == Apache2::Const::SATISFY_ALL; my ($rc, $sent_pw) = $r->get_basic_auth_pw; return $rc if $rc != Apache2::Const::OK; if ($r->method_number == Apache2::Const::M_POST) { return Apache2::Const::OK; } my $user = $r->user; my $pass = $users{$user} || ''; unless (defined $pass and $sent_pw eq $pass) { $r->note_basic_auth_failure; return Apache2::Const::HTTP_UNAUTHORIZED; } Apache2::Const::OK; } 1; __DATA__ 2.4.1> PerlAddAuthzProvider my-user TestAPI::access2_24->authz_handler PerlAddAuthzProvider my-group TestAPI::access2_24->authz_handler PerlAuthenHandler TestAPI::access2_24->authn_handler PerlResponseHandler Apache::TestHandler::ok1 SetHandler modperl # needed to test $r->satisfies Allow from All AuthType Basic AuthName "Access" Require my-user goo bar Require my-group xar tar Require valid-user Satisfy All # htpasswd -mbc auth-users goo foo # htpasswd -mb auth-users bar mar # using md5 password so it'll work on win32 too AuthUserFile @DocumentRoot@/api/auth-users # group: user1 user2 ... AuthGroupFile @DocumentRoot@/api/auth-groups mod_perl-2.0.9/t/response/TestAPI/add_config.pm0000644000104000010010000000740112540623206021753 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::add_config; use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache2::CmdParms (); use Apache2::RequestUtil (); use Apache2::Directive (); use Apache2::ServerUtil (); use base qw(Apache2::Module); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw( OK DECLINED :options ); use constant KEY => "TestAddConfig"; use constant APACHE22 => have_min_apache_version('2.2.0'); use constant APACHE24 => have_min_apache_version('2.4.0'); my @directives = ( { name => KEY, cmd_data => 'cmd_data', errmsg => 'errmsg', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub TestAddConfig { my ($self, $parms, $args) = @_; my $srv_cfg = $self->get_config($parms->server); $srv_cfg->{override_opts} = $parms->override_opts(); } sub map2storage { my $r = shift; my $o = APACHE22 ? '=All,SymLinksIfOwnerMatch' : ''; eval { $r->add_config(['AllowOverride All Options'.$o]); }; $r->pnotes(add_config1 => "$@"); eval { $r->add_config(['Options ExecCGI'], -1, '/', 0); }; $r->pnotes(add_config2 => "$@"); # We can set AllowOverride only from .htacces in 2.4.0+ if (!APACHE24) { eval { $r->add_config(['AllowOverride Options=FollowSymLinks'], -1); }; $r->pnotes(followsymlinks => "$@"); } eval { my $path="/a/path/to/somewhere"; $r->add_config(['PerlResponseHandler '.__PACKAGE__], -1, $path); # now overwrite the path in place to see if the location pointer # is really copied: see modperl_config_dir_create $path=~tr[a-z][n-za-m]; }; return Apache2::Const::DECLINED; } sub fixup { my ($r) = @_; eval { $r->add_config(['Options ExecCGI'], -1, '/', Apache2::Const::OPT_EXECCGI); }; $r->pnotes(add_config3 => "$@"); eval { $r->server->add_config(['ServerAdmin foo@bar.com']); }; $r->pnotes(add_config4 => "$@"); return Apache2::Const::DECLINED; } sub handler : method { my ($self, $r) = @_; my $cf = $self->get_config($r->server); plan $r, tests => 9; ok t_cmp $r->pnotes('add_config1'), qr/.+\n/; ok t_cmp $r->pnotes('add_config2'), (APACHE22 ? qr/.+\n/ : ''); ok t_cmp $r->pnotes('add_config3'), ''; ok t_cmp $r->pnotes('add_config4'), qr/after server startup/; if (!APACHE24) { ok t_cmp $r->pnotes('followsymlinks'), (APACHE22 ? '': qr/.*\n/); } else { ok 1; } my $expect = Apache2::Const::OPT_ALL | Apache2::Const::OPT_UNSET | (defined &Apache2::Const::OPT_INCNOEXEC ? Apache2::Const::OPT_INCNOEXEC() : 0) | Apache2::Const::OPT_MULTI | Apache2::Const::OPT_SYM_OWNER; ok t_cmp $cf->{override_opts}, $expect; ok t_cmp $r->allow_options, Apache2::Const::OPT_EXECCGI; my $opts = APACHE22 ? Apache2::Const::OPT_SYM_LINKS : $expect; if (!APACHE24) { ok t_cmp $r->allow_override_opts, $opts; } else { ok 1; } ok t_cmp $r->location, '/a/path/to/somewhere'; return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestAPI::add_config AccessFileName htaccess SetHandler modperl AllowOverride All PerlMapToStorageHandler TestAPI::add_config::map2storage PerlFixupHandler TestAPI::add_config::fixup mod_perl-2.0.9/t/response/TestAPI/aplog.pm0000644000104000010010000002156712540623206021011 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::aplog; use strict; use warnings FATAL => 'all'; use Apache2::ServerRec qw(warn); # override warn locally use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::Log (); use Apache2::MPM (); use File::Spec::Functions qw(catfile); use Apache::Test; use Apache::TestUtil; use TestCommon::LogDiff; use Apache2::Const -compile => qw(OK :log); use APR::Const -compile => qw(:error SUCCESS); use constant APACHE24 => have_min_apache_version('2.4.0'); my @LogLevels = qw(emerg alert crit error warn notice info debug); my $package = __PACKAGE__; my $path = catfile Apache::Test::vars('serverroot'), qw(logs error_log); sub handler { my $r = shift; my $s = $r->server; plan $r, tests => (@LogLevels * 2) + 20; my $logdiff = TestCommon::LogDiff->new($path); my $rlog = $r->log; ok $rlog->isa('Apache2::Log::Request'); my $slog = $s->log; ok $slog->isa('Apache2::Log::Server'); t_server_log_warn_is_expected(); $rlog->info($package, " test in progress"); ok t_cmp $logdiff->diff, qr/... TestAPI::aplog test in progress/, '$r->log->info'; my ($file, $line) = Apache2::Log::LOG_MARK; ok $file eq __FILE__; ok $line == __LINE__ - 2; for my $method (@LogLevels) { # wrap in sub {}, else Test.pm tries to run the return value # of ->can ok sub { $rlog->can($method) }; ok sub { $slog->can($method) }; } # log_serror { my $orig_log_level = 0; if (APACHE24) { $orig_log_level = $s->loglevel; $s->loglevel(Apache2::Const::LOG_DEBUG); } t_server_log_warn_is_expected(); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_INFO|Apache2::Const::LOG_STARTUP, APR::Const::SUCCESS, "This log message comes with no header"); ok t_cmp $logdiff->diff, qr/^This log message comes with no header$/m, '$s->log_serror(LOG_MARK, LOG_INFO|LOG_STARTUP...)'; t_server_log_warn_is_expected(); $s->log_serror(__FILE__, __LINE__, Apache2::Const::LOG_DEBUG, APR::Const::SUCCESS, "log_serror test 1"); ok t_cmp $logdiff->diff, qr/: log_serror test 1$/m, '$s->log_serror(__FILE__, __LINE__, LOG_DEBUG...)'; # the APR_EGENERAL error string changed for APR 1.0 my $egeneral = have_min_apache_version('2.1.0') ? qr/Internal error(?: \(specific information not available\))?/ : "Error string not specified yet"; t_server_log_warn_is_expected(); $s->log_serror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_DEBUG, APR::Const::EGENERAL, "log_serror test 2"); ok t_cmp $logdiff->diff, qr/$egeneral: log_serror test 2/, '$s->log_serror(LOG_MARK, LOG_DEBUG, APR::Const::EGENERAL...)'; if (APACHE24) { $s->loglevel($orig_log_level); } } # log_rerror t_server_log_error_is_expected(); $r->log_rerror(Apache2::Log::LOG_MARK, Apache2::Const::LOG_CRIT, APR::Const::ENOTIME, "log_rerror test"); # can't match against the error string, since a locale may kick in if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:crit\] \[pid[^]]+\] .*?: \[[^]]+\] log_rerror test/, '$r->log_rerror(LOG_MARK, LOG_CRIT, APR::Const::ENOTIME...)'; } else { ok t_cmp $logdiff->diff, qr/\[crit\] .*?: log_rerror test/, '$r->log_rerror(LOG_MARK, LOG_CRIT, APR::Const::ENOTIME...)'; } # log_error { t_server_log_error_is_expected(); $r->log_error('$r->log_error test'); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:error\] \[pid[^]]+\] \$r->log_error test/, '$r->log_error(...)'; } else { ok t_cmp $logdiff->diff, qr/\[error\] \$r->log_error test/, '$r->log_error(...)'; } t_server_log_error_is_expected(); $s->log_error('$s->log_error test'); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:error\] \[pid[^]]+\] \$s->log_error test/, '$s->log_error(...)'; } else { ok t_cmp $logdiff->diff, qr/\[error\] \$s->log_error test/, '$s->log_error(...)'; } } # log_reason { t_server_log_error_is_expected(); $r->log_reason('$r->log_reason test'); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:error\] \[pid[^]]+\] access to.*failed.*reason: \$r->log_reason test/, '$r->log_reason(msg)'; } else { ok t_cmp $logdiff->diff, qr/\[error\] access to.*failed.*reason: \$r->log_reason test/, '$r->log_reason(msg)'; } t_server_log_error_is_expected(); $r->log_reason('$r->log_reason filename test','filename'); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:error\] \[pid[^]]+\] access to filename failed.*\$r->log_reason filename test/, '$r->log_reason(msg, filename)'; } else { ok t_cmp $logdiff->diff, qr/\[error\] access to filename failed.*\$r->log_reason filename test/, '$r->log_reason(msg, filename)'; } } # XXX: at the moment we can't change loglevel after server startup # in a threaded mpm environment if (!Apache2::MPM->is_threaded) { my $orig_log_level = $s->loglevel; $s->loglevel(Apache2::Const::LOG_INFO); if ($s->error_fname) { #XXX: does not work under t/TEST -ssl $slog->debug(sub { die "set loglevel no workie" }); # ok t_cmp $logdiff->diff... } t_server_log_warn_is_expected(); $s->loglevel(Apache2::Const::LOG_DEBUG); $slog->debug(sub { ok 1; "$package test done" }); ok t_cmp $logdiff->diff, qr/TestAPI::aplog test done/, '$slog->debug(sub { })'; $s->loglevel($orig_log_level); } else { ok 1; ok 1; } # notice() messages ignore the LogLevel value and always get # logged by Apache design (unless error log is set to syslog) if (!Apache2::MPM->is_threaded) { my $orig_log_level = $s->loglevel; $r->server->loglevel(Apache2::Const::LOG_ERR); my $ignore = $logdiff->diff; # reset fh # notice < error my $msg = "This message should appear with LogLevel=error!"; $r->log->notice($msg); ok t_cmp $logdiff->diff, qr/[notice] .*? $msg/, "notice() logs regardless of LogLevel"; $s->loglevel($orig_log_level); } else { ok 1; } t_server_log_warn_is_expected(); $s->warn('$s->warn test'); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:warn\] \[pid[^]]+\] \$s->warn test/, '$s->warn()'; } else { ok t_cmp $logdiff->diff, qr/\[warn\] \$s->warn test/, '$s->warn()'; } { t_server_log_warn_is_expected(); # this uses global server to get $s internally Apache2::ServerRec::warn("Apache2::ServerRec::warn test"); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:warn\] \[pid[^]]+\] Apache2::ServerRec::warn test/, 'Apache2::ServerRec::warn() w/o Apache2::RequestUtil->request '; } else { ok t_cmp $logdiff->diff, qr/\[warn\] Apache2::ServerRec::warn test/, 'Apache2::ServerRec::warn() w/o Apache2::RequestUtil->request '; } Apache2::RequestUtil->request($r); t_server_log_warn_is_expected(); # this uses the global $r to get $s internally Apache2::ServerRec::warn("Apache2::ServerRec::warn test"); if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:warn\] \[pid[^]]+\] Apache2::ServerRec::warn test/, 'Apache2::ServerRec::warn() w/ Apache2::RequestUtil->request '; } else { ok t_cmp $logdiff->diff, qr/\[warn\] Apache2::ServerRec::warn test/, 'Apache2::ServerRec::warn() w/ Apache2::RequestUtil->request '; } } t_server_log_warn_is_expected(); warn "warn test"; if (APACHE24) { ok t_cmp $logdiff->diff, qr/\[\w*:warn\] \[pid[^]]+\] warn test/, 'overriden via export warn()'; } else { ok t_cmp $logdiff->diff, qr/\[warn\] warn test/, 'overriden via export warn()'; } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/command.pm0000644000104000010010000000177512540623206021324 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::command; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Command (); use Apache2::Module (); use Apache2::Const -compile => qw(OK ITERATE OR_ALL); sub handler { my $r = shift; plan $r, tests => 6; my $mod_perl_module = Apache2::Module::find_linked_module('mod_perl.c'); ok $mod_perl_module; my $cmd = $mod_perl_module->cmds; ok defined $cmd; ok UNIVERSAL::isa($cmd, 'Apache2::Command'); while ($cmd) { if ($cmd->name eq 'PerlResponseHandler') { ok t_cmp($cmd->args_how, Apache2::Const::ITERATE, 'args_how'); ok t_cmp($cmd->errmsg, qr/Subroutine name/, 'errmsg'); ok t_cmp($cmd->req_override, Apache2::Const::OR_ALL, 'req_override'); last; } $cmd = $cmd->next; } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/conn_rec.pm0000644000104000010010000000421512540623206021464 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::conn_rec; # this test module is only for testing fields in the conn_rec listed # in apache_structures.map (but some fields are tested in other tests) use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::Connection (); use Apache2::Const -compile => qw(OK CONN_CLOSE); use constant APACHE24 => have_min_apache_version('2.4.0'); sub handler { my $r = shift; my $c = $r->connection; plan $r, tests => 16; ok $c; ok $c->pool->isa('APR::Pool'); ok $c->base_server->isa('Apache2::ServerRec'); ok $c->client_socket->isa('APR::Socket'); ok $c->local_addr->isa('APR::SockAddr'); if (APACHE24) { ok $c->client_addr->isa('APR::SockAddr'); # client_ip { my $client_ip_org = $c->client_ip; my $client_ip_new = "10.10.10.255"; ok $client_ip_org; $c->client_ip($client_ip_new); ok t_cmp $c->client_ip, $client_ip_new; # restore $c->client_ip($client_ip_org); ok t_cmp $c->client_ip, $client_ip_org; } } else { ok $c->remote_addr->isa('APR::SockAddr'); # remote_ip { my $remote_ip_org = $c->remote_ip; my $remote_ip_new = "10.10.10.255"; ok $remote_ip_org; $c->remote_ip($remote_ip_new); ok t_cmp $c->remote_ip, $remote_ip_new; # restore $c->remote_ip($remote_ip_org); ok t_cmp $c->remote_ip, $remote_ip_org; } } ok $c->remote_host || 1; ok !$c->aborted; ok t_cmp($c->keepalive, Apache2::Const::CONN_CLOSE, "the client has issued a non-keepalive request"); ok $c->local_ip; ok $c->local_host || 1; t_debug "id ", ($c->id == 0 ? "zero" : $c->id); ok $c->id || 1; ok $c->notes; # XXX: missing tests # conn_config Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/conn_util.pm0000644000104000010010000000173112540623206021670 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::conn_util; use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::Connection (); use Apache2::Const -compile => qw(OK REMOTE_HOST REMOTE_NAME REMOTE_NOLOOKUP REMOTE_DOUBLE_REV); sub handler { my $r = shift; my $c = $r->connection; plan $r, tests => 7; ok $c->get_remote_host() || 1; for (Apache2::Const::REMOTE_HOST, Apache2::Const::REMOTE_NAME, Apache2::Const::REMOTE_NOLOOKUP, Apache2::Const::REMOTE_DOUBLE_REV) { ok $c->get_remote_host($_) || 1; } ok $c->get_remote_host(Apache2::Const::REMOTE_HOST, $r->per_dir_config) || 1; ok $c->get_remote_host(Apache2::Const::REMOTE_HOST, $r->per_dir_config) || 1; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/content_encoding.pm0000644000104000010010000000137312540623206023220 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::content_encoding; # tests: $r->content_encoding("gzip"); use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use TestCommon::Utils (); use Apache2::Const -compile => qw(OK DECLINED M_POST); sub handler { my $r = shift; return Apache2::Const::DECLINED unless $r->method_number == Apache2::Const::M_POST; my $data = TestCommon::Utils::read_post($r); require Compress::Zlib; $r->content_type("text/plain"); $r->content_encoding("gzip"); $r->print(Compress::Zlib::memGzip($data)); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/custom_response.pm0000644000104000010010000000142412540623206023125 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::custom_response; # custom_response() doesn't alter the response code, but is used to # replace the standard response body use strict; use warnings FATAL => 'all'; use Apache2::Response (); use Apache2::Const -compile => qw(FORBIDDEN); sub handler { my $r = shift; my $how = $r->args || ''; # warn "$how"; # could be text or url $r->custom_response(Apache2::Const::FORBIDDEN, $how); return Apache2::Const::FORBIDDEN; } 1; __END__ AuthName dummy AuthType none PerlAccessHandler TestAPI::custom_response mod_perl-2.0.9/t/response/TestAPI/err_headers_out.pm0000644000104000010010000000152112540623206023045 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::err_headers_out; # tests: $r->err_headers_out # when sending a non-2xx response one must use $r->err_headers_out to # set extra headers use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use APR::Table (); use Apache2::Const -compile => qw(OK NOT_FOUND); sub handler { my $r = shift; # this header will always make it to the client $r->err_headers_out->add('X-err_headers_out' => "err_headers_out"); # this header will make it to the client only on 2xx response $r->headers_out->add('X-headers_out' => "headers_out"); return $r->args eq "404" ? Apache2::Const::NOT_FOUND : Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/internal_redirect.pm0000644000104000010010000000346512540623206023401 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::internal_redirect; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache::TestTrace; use Apache2::Const -compile => 'OK'; sub modperl { my $r = shift; my %args = map { split('=', $_, 2) } split /[&]/, $r->args; if ($args{main}) { # sub-req $r->content_type('text/plain'); debug "modperl: sub-req: response"; $r->print("internal redirect: $args{main} => modperl"); } else { # main-req my $redirect_uri = $args{uri}; debug "modperl: main-req => $redirect_uri?main=modperl"; $r->internal_redirect("$redirect_uri?main=modperl"); } Apache2::Const::OK; } sub perl_script { my $r = shift; my %args = map { split('=', $_, 2) } split /[&]/, $r->args; if ($args{main}) { # sub-req $r->content_type('text/plain'); debug "perl-script: sub-req: response"; print "internal redirect: $args{main} => perl-script"; } else { # main-req my $redirect_uri = $args{uri}; debug "perl-script: main-req => $redirect_uri?main=perl-script"; $r->internal_redirect("$redirect_uri?main=perl-script"); } Apache2::Const::OK; } 1; __DATA__ PerlModule TestAPI::internal_redirect SetHandler modperl PerlResponseHandler TestAPI::internal_redirect::modperl SetHandler perl-script PerlResponseHandler TestAPI::internal_redirect::perl_script mod_perl-2.0.9/t/response/TestAPI/internal_redirect_handler.pm0000644000104000010010000000176712540623206025101 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::internal_redirect_handler; # $r->internal_redirect_handler() is the same as # $r->internal_redirect() but it uses the same content-type as the # top-level handler use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache2::Const -compile => 'OK'; my $uri = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = shift; my %args = map { split '=', $_, 2 } split /[&]/, $r->args; if ($args{main}) { # sub-req should see the same content-type as the top-level my $ct = $r->content_type; $r->content_type('text/plain'); $r->print($ct); } else { # main-req $r->content_type($args{ct}); $r->internal_redirect_handler("$uri?main=1"); } Apache2::Const::OK; } 1; __DATA__ mod_perl-2.0.9/t/response/TestAPI/in_out_filters.pm0000644000104000010010000000364612540623206022732 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::in_out_filters; # testing: $r->input_filters and $r->output_filters # it's possible to read a POST data and send a response body w/o using # $r->read/$r->print use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use APR::Brigade (); use APR::Bucket (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK M_POST DECLINED MODE_READBYTES); use APR::Const -compile => qw(SUCCESS BLOCK_READ); use constant IOBUFSIZE => 8192; sub handler { my $r = shift; return Apache2::Const::DECLINED unless $r->method_number == Apache2::Const::M_POST; $r->content_type("text/plain"); my $data = read_request_body($r); send_response_body($r, lc($data)); Apache2::Const::OK; } sub send_response_body { my ($r, $data) = @_; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $b = APR::Bucket->new($r->connection->bucket_alloc, $data); $bb->insert_tail($b); $r->output_filters->fflush($bb); $bb->destroy; } sub read_request_body { my $r = shift; my $bb = APR::Brigade->new($r->pool, $r->connection->bucket_alloc); my $data = ''; my $seen_eos = 0; my $count = 0; do { $r->input_filters->get_brigade($bb, Apache2::Const::MODE_READBYTES, APR::Const::BLOCK_READ, IOBUFSIZE); $count++; for (my $b = $bb->first; $b; $b = $bb->next($b)) { if ($b->is_eos) { $seen_eos++; last; } if ($b->read(my $buf)) { $data .= $buf; } $b->delete; } } while (!$seen_eos); $bb->destroy; return $data; } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/lookup_misc.pm0000644000104000010010000000245512540623206022226 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::lookup_misc; # testing misc lookup_ methods. TestAPI::lookup_uri includes the tests # for lookup_uri and for filters, which should be the same for all # other lookup_ methods use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::SubRequest (); use Apache2::URI (); use Apache::TestTrace; use Apache2::Const -compile => 'OK'; my $uri = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = shift; my %args = map { split '=', $_, 2 } split /;/, $r->args; if ($args{subreq} eq 'lookup_file') { Apache2::URI::unescape_url($args{file}); debug "lookup_file($args{file})"; my $subr = $r->lookup_file($args{file}); $subr->run; } elsif ($args{subreq} eq 'lookup_method_uri') { debug "lookup_method_uri($args{uri})"; my $subr = $r->lookup_method_uri("GET", $args{uri}); $subr->run; } else { $r->print("default"); } Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlResponseHandler Apache::TestHandler::ok mod_perl-2.0.9/t/response/TestAPI/lookup_uri.pm0000644000104000010010000000420012540623206022060 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::lookup_uri; # tests $r->lookup_uri and its work with filters use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::SubRequest (); use Apache2::Const -compile => 'OK'; my $uri = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = shift; my $args = $r->args || ''; my %args = map { split '=', $_, 2 } split /;/, $args; if ($args{main}) { $args =~ s/main=1;//; $r->print($args); } else { my $new_args = "$uri?main=1;$args"; my $subr; $args{filter} ||= ''; if ($args{filter} eq 'first') { # run all request filters $subr = $r->lookup_uri($new_args, $r->output_filters); } elsif ($args{filter} eq 'second') { # run all request filters, but the top one $subr = $r->lookup_uri($new_args, $r->output_filters->next); } elsif ($args{filter} eq 'default') { # run none of request filters $subr = $r->lookup_uri($new_args); } elsif ($args{filter} eq 'none') { # run none of request filters $subr = $r->lookup_uri($new_args, $r->proto_output_filters); } else { die "no filter= argument was received"; } $subr->run; } Apache2::Const::OK; } sub prefix_filter { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $filter->print("pre+$buffer"); } Apache2::Const::OK; } sub suffix_filter { my $filter = shift; while ($filter->read(my $buffer, 1024)) { $filter->print("$buffer+suf"); } Apache2::Const::OK; } 1; __DATA__ PerlModule TestAPI::lookup_uri PerlOutputFilterHandler TestAPI::lookup_uri::prefix_filter PerlOutputFilterHandler TestAPI::lookup_uri::suffix_filter mod_perl-2.0.9/t/response/TestAPI/lookup_uri2.pm0000644000104000010010000000214212540623206022145 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::lookup_uri2; use strict; use warnings FATAL => 'all'; use Apache2::SubRequest (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Const -compile => 'OK'; sub myplan { my $r = shift; $r->puts("1..3\nok 1\n"); die "must indicate a sub-request" if $r->is_initial_req(); Apache2::Const::OK; } sub ok3 { my $r = shift; $r->puts("ok 3\n"); Apache2::Const::OK; } sub subrequest { my ($r, $sub) = @_; (my $uri = join '::', __PACKAGE__, $sub) =~ s!::!__!g; $r->lookup_uri($uri)->run; } sub handler { my $r = shift; subrequest($r, 'myplan'); $r->puts("ok 2\n"); subrequest($r, 'ok3'); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl PerlResponseHandler TestAPI::lookup_uri2::myplan SetHandler modperl PerlResponseHandler TestAPI::lookup_uri2::ok3 mod_perl-2.0.9/t/response/TestAPI/module.pm0000644000104000010010000000572512540623206021172 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::module; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestConfig; use Apache::TestUtil; use Apache2::BuildConfig; use Apache2::Module (); use DynaLoader (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $cfg = Apache::Test::config(); my $top_module = Apache2::Module::top_module(); my $module_count = 0; for (my $modp = $top_module; $modp; $modp = $modp->next) { $module_count++; } my $tests = 12 + ( 5 * $module_count ); plan $r, tests => $tests; my $core = Apache2::Module::find_linked_module('core.c'); ok defined $core && $core->name eq 'core.c'; #.c ok t_cmp Apache2::Module::loaded('mod_perl.c'), 1, "Apache2::Module::loaded('mod_perl.c')"; ok t_cmp Apache2::Module::loaded('Apache__Module_foo.c'), 0, "Apache2::Module::loaded('Apache__Module_foo.c')"; #.so { my $build = Apache2::BuildConfig->new; my $expect = $build->should_build_apache ? 0 : 1; ok t_cmp Apache2::Module::loaded('mod_perl.so'), $expect, "Apache2::Module::loaded('mod_perl.so')"; } ok t_cmp Apache2::Module::loaded('Apache__Module__foo.so'), 0, "Apache2::Module::loaded('Apache__Module_foo.so')"; #perl { ok t_cmp Apache2::Module::loaded('Apache2::Module'), 1, "Apache2::Module::loaded('Apache2::Module')"; ok t_cmp Apache2::Module::loaded('Apache__Module_foo'), 0, "Apache2::Module::loaded('Apache__Module_foo')"; # TestAPI::module::foo wasn't loaded but the stash exists $TestAPI::module::foo::test = 1; ok t_cmp Apache2::Module::loaded('TestAPI::module::foo'), 0, "Apache2::Module::loaded('TestAPI::module::foo')"; # module TestAPI wasn't loaded but the stash exists, since # TestAPI::module was loaded ok t_cmp Apache2::Module::loaded('TestAPI'), 0, "Apache2::Module::loaded('TestAPI')"; } #bogus ok t_cmp Apache2::Module::loaded('Apache__Module_foo.foo'), 0, "Apache2::Module::loaded('Apache__Module_foo.foo')"; ok t_cmp Apache2::Module::loaded(''), 0, "Apache2::Module::loaded('')"; ok t_cmp ref($top_module), 'Apache2::Module', 'top_module'; my $mmn_major = $cfg->{httpd_info}{MODULE_MAGIC_NUMBER_MAJOR}; my $mmn_minor = $cfg->{httpd_info}{MODULE_MAGIC_NUMBER_MINOR}; for (my $modp = $top_module; $modp; $modp = $modp->next) { my $name = $modp->name; ok $name; t_debug("Testing module: " . $modp->name); ok t_cmp $modp->ap_api_major_version, $mmn_major; ok $modp->ap_api_minor_version <= $mmn_minor; ok $modp->module_index >= 0; my $cmds = $modp->cmds; ok !defined($cmds) || ref($cmds) eq 'Apache2::Command'; } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/process.pm0000644000104000010010000000160112540623206021350 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::process; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::ServerRec (); use Apache2::Process (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 4; my $s = $r->server; my $proc = $s->process; ok t_cmp(1, $proc->isa('Apache2::Process'), "isa('Apache2::Process')"); my $global_pool = $proc->pool; ok t_cmp(1, $global_pool->isa('APR::Pool'), "pglob isa('APR::Pool')"); my $pconf = $proc->pconf; ok t_cmp(1, $pconf->isa('APR::Pool'), "pconf isa('APR::Pool')"); my $proc_name = $proc->short_name; t_debug($proc_name); ok $proc_name; Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/query.pm0000644000104000010010000001070712540623206021046 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::query; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::MPM (); use Apache2::Const -compile => qw(OK :mpmq); sub handler { my $r = shift; plan $r, tests => 5; # ok, this isn't particularly pretty, but I can't think # of a better way to do it # all of these attributes I pulled right from the C sources # so if, say, leader all of a sudden changes its properties, # these tests will fail my $mpm = lc Apache2::MPM->show; if ($mpm eq 'prefork') { { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_THREADED); ok t_cmp($query, Apache2::Const::MPMQ_NOT_SUPPORTED, "MPMQ_IS_THREADED ($mpm)"); # is_threaded() is just a constsub set to the result from # ap_mpm_query(AP_MPMQ_IS_THREADED) ok t_cmp($query, Apache2::MPM->is_threaded, "Apache2::MPM->is_threaded() equivalent to query(MPMQ_IS_THREADED)"); t_debug('Apache2::MPM->is_threaded returned ' . Apache2::MPM->is_threaded); ok (! Apache2::MPM->is_threaded); } { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_FORKED); ok t_cmp($query, Apache2::Const::MPMQ_DYNAMIC, "MPMQ_IS_FORKED ($mpm)"); } } elsif ($mpm eq 'worker') { { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_THREADED); ok t_cmp($query, Apache2::Const::MPMQ_STATIC, "MPMQ_IS_THREADED ($mpm)"); ok t_cmp($query, Apache2::MPM->is_threaded, "Apache2::MPM->is_threaded() equivalent to query(MPMQ_IS_THREADED)"); t_debug('Apache2::MPM->is_threaded returned ' . Apache2::MPM->is_threaded); ok (Apache2::MPM->is_threaded); } { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_FORKED); ok t_cmp($query, Apache2::Const::MPMQ_DYNAMIC, "MPMQ_IS_FORKED ($mpm)"); } } elsif ($mpm eq 'leader') { { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_THREADED); ok t_cmp($query, Apache2::Const::MPMQ_STATIC, "MPMQ_IS_THREADED ($mpm)"); ok t_cmp($query, Apache2::MPM->is_threaded, "Apache2::MPM->is_threaded() equivalent to query(MPMQ_IS_THREADED)"); t_debug('Apache2::MPM->is_threaded returned ' . Apache2::MPM->is_threaded); ok (Apache2::MPM->is_threaded); } { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_FORKED); ok t_cmp($query, Apache2::Const::MPMQ_DYNAMIC, "MPMQ_IS_FORKED ($mpm)"); } } elsif ($mpm eq 'winnt') { { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_THREADED); ok t_cmp($query, Apache2::Const::MPMQ_STATIC, "MPMQ_IS_THREADED ($mpm)"); ok t_cmp($query, Apache2::MPM->is_threaded, "Apache2::MPM->is_threaded() equivalent to query(MPMQ_IS_THREADED)"); t_debug('Apache2::MPM->is_threaded returned ' . Apache2::MPM->is_threaded); ok (Apache2::MPM->is_threaded); } { my $query = Apache2::MPM->query(Apache2::Const::MPMQ_IS_FORKED); ok t_cmp($query, Apache2::Const::MPMQ_NOT_SUPPORTED, "MPMQ_IS_FORKED ($mpm)"); } } else { skip "skipping MPMQ_IS_THREADED test for $mpm MPM", 0; skip "skipping Apache2::MPM->is_threaded equivalence test for $mpm MPM", 0; skip "skipping MPMQ_IS_FORKED test for $mpm MPM", 0; skip "skipping Apache2::MPM->is_threaded test for $mpm MPM", 0; } # make sure that an undefined MPMQ constant yields undef { my $query = Apache2::MPM->query(72); ok t_cmp($query, undef, "unknown MPMQ value returns undef"); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/request_rec.pm0000644000104000010010000001611312540623206022217 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::request_rec; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::RequestRec (); use Apache2::RequestUtil (); use APR::Finfo (); use APR::Pool (); use Apache2::Const -compile => qw(OK M_GET M_PUT); use APR::Const -compile => qw(FINFO_NORM); #this test module is only for testing fields in the request_rec #listed in apache_structures.map #XXX: GloabalRequest test should be moved elsewhere # as should $| test sub handler { my $r = shift; plan $r, tests => 55; #Apache2::RequestUtil->request($r); #PerlOptions +GlobalRequest takes care my $gr = Apache2::RequestUtil->request; ok $$gr == $$r; my $newr = Apache2::RequestRec->new($r->connection, $r->pool); Apache2::RequestUtil->request($newr); $gr = Apache2::RequestUtil->request; ok $$gr == $$newr; Apache2::RequestUtil->request($r); ok $r->pool->isa('APR::Pool'); ok $r->connection->isa('Apache2::Connection'); ok $r->server->isa('Apache2::ServerRec'); for (qw(next prev main)) { ok (! $r->$_()) || $r->$_()->isa('Apache2::RequestRec'); } ok !$r->assbackwards; ok !$r->proxyreq; # see also TestModules::proxy ok !$r->header_only; ok $r->protocol =~ /http/i; # LWP >=6.00 uses HTTP/1.1, other HTTP/1.0 ok t_cmp $r->proto_num, 1000+substr($r->the_request, -1), 't->proto_num'; ok t_cmp lc($r->hostname), lc($r->get_server_name), '$r->hostname'; { my $old_hostname = $r->hostname("other.hostname"); ok t_cmp $r->hostname, "other.hostname", '$r->hostname rw'; $r->hostname($old_hostname); } ok $r->request_time; ok $r->status_line || 1; ok $r->status || 1; ok t_cmp $r->method, 'GET', '$r->method'; ok t_cmp $r->method_number, Apache2::Const::M_GET, '$r->method_number'; ok $r->headers_in; ok $r->headers_out; # tested in TestAPI::err_headers_out ok $r->err_headers_out; ok $r->subprocess_env; ok $r->notes; ok $r->content_type; ok $r->handler; ok $r->ap_auth_type || 1; ok $r->no_cache || 1; ok !$r->no_local_copy; { local $| = 0; ok t_cmp $r->print("# buffered\n"), 11, "buffered print"; ok t_cmp $r->print(), "0E0", "buffered print"; local $| = 1; my $string = "# not buffered\n"; ok t_cmp $r->print(split //, $string), length($string), "unbuffered print"; } # GET header components { my $args = "my_args=3"; my $path_info = "/my_path_info"; my $base_uri = "/TestAPI__request_rec"; ok t_cmp $r->unparsed_uri, "$base_uri$path_info?$args"; ok t_cmp $r->uri, "$base_uri$path_info", '$r->uri'; ok t_cmp $r->path_info, $path_info, '$r->path_info'; ok t_cmp $r->args, $args, '$r->args'; # LWP uses HTTP/1.1 since 6.00 ok t_cmp $r->the_request, qr!GET \x20 \Q$base_uri$path_info\E\?\Q$args\E \x20 HTTP/1\.\d!x, '$r->the_request'; { my $new_request = "GET $base_uri$path_info?$args&foo=bar HTTP/1.0"; my $old_request = $r->the_request($new_request); ok t_cmp $r->the_request, $new_request, '$r->the_request rw'; $r->the_request($old_request); } ok $r->filename; my $location = '/' . Apache::TestRequest::module2path(__PACKAGE__); ok t_cmp $r->location, $location, '$r->location'; } # bytes_sent { $r->rflush; my $sent = $r->bytes_sent; t_debug "sent so far: $sent bytes"; # at least 100 chars were sent already ok $sent > 100; } # mtime { my $mtime = (stat __FILE__)[9]; $r->mtime($mtime); ok t_cmp $r->mtime, $mtime, "mtime"; } # finfo { my $finfo = APR::Finfo::stat(__FILE__, APR::Const::FINFO_NORM, $r->pool); $r->finfo($finfo); # just one field test, all accessors are fully tested in # TestAPR::finfo ok t_cmp($r->finfo->fname, __FILE__, '$r->finfo'); } # allowed { $r->allowed(1 << Apache2::Const::M_GET); ok $r->allowed & (1 << Apache2::Const::M_GET); ok ! ($r->allowed & (1 << Apache2::Const::M_PUT)); $r->allowed($r->allowed | (1 << Apache2::Const::M_PUT)); ok $r->allowed & (1 << Apache2::Const::M_PUT); } # content_languages { my $def = [qw(fr)]; #default value my $l = [qw(fr us cn)]; #new value if (have_module('mod_mime')) { ok t_cmp $r->content_languages, $def, '$r->content_languages'; } else { skip "Need mod_mime", 0; } my $old = $r->content_languages($l); if (have_module('mod_mime')) { ok t_cmp $old, $def, '$r->content_languages'; } else { skip "Need mod_mime", 0; } ok t_cmp $r->content_languages, $l, '$r->content_languages'; eval { $r->content_languages({}) }; ok t_cmp $@, qr/Not an array reference/, '$r->content_languages(invalid)'; } ### invalid $r { my $r = bless {}, "Apache2::RequestRec"; my $err = q[method `uri' invoked by a `Apache2::RequestRec' ] . q[object with no `r' key!]; eval { $r->uri }; ok t_cmp $@, qr/$err/, "invalid $r object"; } { my $r = bless {}, "NonExisting"; my $err = q[method `uri' invoked by a `NonExisting' ] . q[object with no `r' key!]; eval { Apache2::RequestRec::uri($r) }; ok t_cmp $@, qr/$err/, "invalid $r object"; } { my $r = {}; my $err = q[method `uri' invoked by a `unknown' ] . q[object with no `r' key!]; eval { Apache2::RequestRec::uri($r) }; ok t_cmp $@, qr/$err/, "invalid $r object"; } # out-of-scope pools { my $newr = Apache2::RequestRec->new($r->connection, APR::Pool->new); { require APR::Table; # try to overwrite the pool my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; } # check if $newr is still OK ok $newr->connection->isa('Apache2::Connection'); } # tested in other tests # - input_filters: TestAPI::in_out_filters # - output_filters: TestAPI::in_out_filters # - per_dir_config: in several other tests # - content_encoding: TestAPI::content_encoding # - user: TestHooks::authz / TestHooks::authen # XXX: untested # - request_config # - allowed_xmethods # - allowed_methods Apache2::Const::OK; } 1; __END__ PerlOptions +GlobalRequest DefaultLanguage fr SetHandler modperl PerlResponseHandler TestAPI::request_rec mod_perl-2.0.9/t/response/TestAPI/request_subclass.pm0000644000104000010010000000173712540623206023273 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::request_subclass; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); our @ISA = qw(Apache2::RequestRec); use Apache::Test; use Apache::TestRequest; use Apache2::Const -compile => 'OK'; sub new { my $class = shift; my $r = shift; bless { r => $r }, $class; } my $location = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = __PACKAGE__->new(shift); plan $r, tests => 5; eval { my $gr = Apache2::RequestUtil->request; }; ok $@; ok $r->uri eq $location; ok ((bless { r => $r })->uri eq $location); #nested eval { (bless {})->uri }; ok $@ =~ /no .* key/; eval { (bless [])->uri }; ok $@ =~ /unsupported/; Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions -GlobalRequest mod_perl-2.0.9/t/response/TestAPI/request_util.pm0000644000104000010010000000471512540623206022430 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::request_util; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestUtil (); use Apache2::MPM (); use Apache2::Log (); use APR::Pool (); use Apache2::Const -compile => 'OK'; my %status_lines = ( 200 => '200 OK', 400 => '400 Bad Request', 500 => '500 Internal Server Error', ); sub handler { my $r = shift; plan $r, tests => (scalar keys %status_lines) + 11; # default_type() is gone as of httpd 2.3.2-dev ok !defined(&Apache2::RequestRec::default_type) || $r->default_type; my $document_root = $r->document_root; ok $document_root; if (!Apache2::MPM->is_threaded) { my $path_orig = my $path = '/tmp/foo'; ok t_cmp($document_root, $r->document_root($path)); # make sure that the new docroot string is copied internally, # and later manipulations of the passed scalar don't affect it $path .= "suffix"; ok t_cmp($path_orig, $r->document_root($document_root)); } else { eval { $r->document_root('/tmp/foo') }; ok t_cmp($@, qr/Can't run.*in the threaded env/, "document_root is read-only under threads"); ok 1; } ok $r->get_server_name; ok $r->get_server_port; ok $r->get_limit_req_body || 1; ok $r->is_initial_req; my $sig = $r->psignature("Here is the sig: "); t_debug $sig; ok $sig; my $pattern = qr!(?s)GET /TestAPI__request_util.*Host:.*200 OK.*Content-Type:!; ok t_cmp($r->as_string, $pattern, "test for the request_line, host, status, and few " . "headers that should always be there"); while (my ($code, $line) = each %status_lines) { ok t_cmp(Apache2::RequestUtil::get_status_line($code), $line, "Apache2::RequestUtil::get_status_line($code)"); } if (Apache2::MPM->is_threaded) { eval { $r->child_terminate() }; ok t_cmp($@, qr/Can't run.*in a threaded mpm/, "child_terminate"); } else { t_server_log_error_is_expected(); ok $r->child_terminate() || 1; $r->pool->cleanup_register( sub { my $r = shift; $r->log_error("Process $$ terminates itself\n"); }, $r); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/response.pm0000644000104000010010000000177112540623206021540 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::response; # testing Apache2::Response methods # # XXX: a proper test is needed (at the moment just test that methods # can be invoked as documented) use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::Response (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 7; my $etag = $r->make_etag(); t_debug $etag; ok $etag; $r->set_content_length(0); ok 1; ok $r->meets_conditions || 1; ok $r->rationalize_mtime(time) >= $r->request_time; my $mtime = (stat __FILE__)[9]; $r->update_mtime($mtime); ok $r->mtime == $mtime; ok $r->set_keepalive() || 1; $r->set_last_modified; # $r->custom_response() is tested in TestAPI::custom_response ok 1; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/rflush.pm0000644000104000010010000000402312540623206021176 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::rflush; use strict; use warnings FATAL => 'all'; # this test verifies that rflush flushes bucket brigades use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Filter (); use Apache2::Const -compile => qw(OK); use constant READ_SIZE => 1024; sub bracket { my $filter = shift; my $data = ''; while ($filter->read(my $buffer, 1024)) { $data .= $buffer; } $filter->print("[$data]") if $data; return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); my $args = $r->args || ''; if ($args eq 'nontied') { # print is now unbuffered local $| = 1; $r->print("1"); # send the data in the buffer + flush bucket $r->print("2"); # send the data in the buffer + flush bucket # print is now buffered local $| = 0; $r->print("3"); $r->rflush; # send the data in the buffer + flush bucket $r->print("4"); $r->rflush; # send the data in the buffer + flush bucket $r->print("5"); $r->print("6"); # send the data in the buffer (end of handler) } elsif ($args eq 'tied') { my $oldfh; # print is now unbuffered ("rflush"-like functionality is # called internally) $oldfh = select(STDOUT); $| = 1; select($oldfh); print "1"; # send the data in the buffer + flush bucket print "2"; # print is now buffered $oldfh = select(STDOUT); $| = 0; select($oldfh); print "3"; print "4"; print "5"; print "6"; # send the data in the buffer (end of handler) } Apache2::Const::OK; } 1; __DATA__ SetHandler perl-script PerlModule TestAPI::rflush PerlResponseHandler TestAPI::rflush::response PerlOutputFilterHandler TestAPI::rflush::bracket mod_perl-2.0.9/t/response/TestAPI/sendfile.pm0000644000104000010010000000244512540623206021472 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::sendfile; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Const -compile => 'SUCCESS'; use Apache2::Const -compile => ':common'; sub handler { my $r = shift; $r->content_type('text/plain'); my $args = $r->args; if ($args eq 'withwrapper') { # buffer output up, so we can test that sendfile flushes any # buffered output before sending the file contents out local $|; $r->print("This is a header\n"); $r->sendfile(__FILE__); $r->print("This is a footer\n"); } elsif ($args eq 'offset') { $r->sendfile(__FILE__, 3); } elsif ($args eq 'len') { $r->sendfile(__FILE__, 3, 50); } elsif ($args eq 'noexist-n-nocheck.txt') { eval { $r->sendfile($args) }; return int $@; } else { my $rc = $r->sendfile($args); # warn APR::Error::strerror($rc); return $rc unless $rc == APR::Const::SUCCESS; } # XXX: can't quite test bogus offset and/or len, since ap_send_fd # doesn't provide any error indications return Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/server_const.pm0000644000104000010010000000337312540623206022416 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::server_const; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use File::Spec::Functions qw(canonpath); use Apache2::ServerUtil (); use Apache2::Process (); use APR::Pool (); use Apache2::Const -compile => 'OK'; my $cfg = Apache::Test::config; my $root = $cfg->{vars}->{serverroot}; my $built = $cfg->{httpd_info}->{BUILT}; my $version = $cfg->{httpd_info}->{VERSION}; sub handler { my $r = shift; plan $r, tests => 6; # test Apache2::ServerUtil constant subroutines ok t_filepath_cmp(canonpath(Apache2::ServerUtil::server_root), canonpath($root), 'Apache2::ServerUtil::server_root()'); ok t_cmp(Apache2::ServerUtil::get_server_built, $built, 'Apache2::ServerUtil::get_server_built()'); my $server_descr = Apache2::ServerUtil::get_server_description; ok t_cmp($server_descr, qr/^\Q$version\E/, 'Apache2::ServerUtil::get_server_description()'); # added via $s->add_version_component in t/conf/modperl_extra.pl ok t_cmp($server_descr, qr!\bworld domination series/2\.0\b!, 'Apache2::ServerUtil::get_server_description() -- component'); # assuming ServerTokens Full (default) the banner equals description ok t_cmp(Apache2::ServerUtil::get_server_banner, $server_descr, 'Apache2::ServerUtil::get_server_banner()'); # version is just an alias for banner ok t_cmp(Apache2::ServerUtil::get_server_version, $server_descr, 'Apache2::ServerUtil::get_server_version()'); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/server_rec.pm0000644000104000010010000000273312540623206022040 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::server_rec; # this test module is only for testing fields in the server_rec listed # in apache_structures.map # XXX: This test needs to be mucho improved. currently it justs checks # whether some value is set or not use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $s = $r->server; plan $r, tests => 20; ok $s; ok $s->process; ok $s->next || 1; ok $s->server_admin; ok $s->server_hostname; ok $s->port || 1; ok $s->error_fname || 1; # vhost might not have its own (t/TEST -ssl) # XXX: error_log; ok $s->loglevel; ok $s->is_virtual || 1; # XXX: module_config # XXX: lookup_defaults ok $s->addrs; t_debug("timeout : ", $s->timeout); ok $s->timeout; t_debug("keep_alive_timeout : ", $s->keep_alive_timeout); ok $s->keep_alive_timeout || 1; t_debug("keep_alive_max : ", $s->keep_alive_max); ok $s->keep_alive_max || 1; ok $s->keep_alive || 1; ok $s->path || 1; ok $s->names || 1; ok $s->wild_names || 1; ok $s->limit_req_line; ok $s->limit_req_fieldsize; ok $s->limit_req_fields; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/server_util.pm0000644000104000010010000001037612540623206022246 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::server_util; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use File::Spec::Functions qw(canonpath catfile); use Apache2::RequestRec (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Process (); use APR::Pool (); use Apache2::Const -compile => 'OK'; my $serverroot = Apache::Test::config()->{vars}->{serverroot}; our @ISA = qw(Apache2::RequestRec); sub new { my $class = shift; my $r = shift; bless { r => $r }, $class; } sub handler { my $r = shift; plan $r, tests => 17; { my $s = $r->server; my @expected = qw(ModPerl::Test::exit_handler TestExit::FromPerlModule::exit_handler); my @handlers = @{ $s->get_handlers('PerlChildExitHandler') || []}; ok t_cmp(scalar(@handlers), scalar(@expected), "get_handlers"); } t_debug('Apache2::ServerUtil::exists_config_define'); ok Apache2::ServerUtil::exists_config_define('MODPERL2'); ok ! Apache2::ServerUtil::exists_config_define('FOO'); t_debug('registering method FOO'); ok $r->server->method_register('FOO'); server_root_relative_tests($r); eval { Apache2::ServerUtil::server_shutdown_cleanup_register( sub { Apache2::Const::OK }); }; my $sub = "server_shutdown_cleanup_register"; ok t_cmp $@, qr/Can't run '$sub' after server startup/, "can't register server_shutdown cleanup after server startup"; # on start we get 1, and immediate restart gives 2 ok t_cmp Apache2::ServerUtil::restart_count, 2, "restart count"; Apache2::Const::OK; } # 11 sub-tests sub server_root_relative_tests { my $r = shift; my %pools = ( '$r->pool' => $r->pool, '$r->connection->pool' => $r->connection->pool, '$r->server->process->pool' => $r->server->process->pool, '$r->server->process->pconf' => $r->server->process->pconf, 'Apache2::ServerUtil->server->process->pconf' => Apache2::ServerUtil->server->process->pconf, 'APR::Pool->new' => APR::Pool->new, ); # syntax - an object or pool is required t_debug("Apache2::ServerUtil::server_root_relative() died"); eval { my $dir = Apache2::ServerUtil::server_root_relative() }; t_debug("\$\@: $@"); ok $@; foreach my $p (keys %pools) { # we will leak memory here when calling the function with a # pool whose life is longer than of $r, but it doesn't matter # for the test ok t_filepath_cmp( canonpath(Apache2::ServerUtil::server_root_relative($pools{$p}, 'conf')), catfile($serverroot, 'conf'), "Apache2::ServerUtil:::server_root_relative($p, 'conf')"); } # syntax - unrecognized objects don't segfault { my $obj = bless {}, 'Apache2::Foo'; eval { Apache2::ServerUtil::server_root_relative($obj, 'conf') }; ok t_cmp($@, qr/p is not of type APR::Pool/, "Apache2::ServerUtil::server_root_relative(\$obj, 'conf')"); } # no file argument gives ServerRoot { my $server_root_relative = Apache2::ServerUtil::server_root_relative($r->pool); ok t_filepath_cmp(canonpath($server_root_relative), canonpath($serverroot), 'server_root_relative($pool)'); # Apache2::ServerUtil::server_root is also the ServerRoot constant ok t_filepath_cmp(canonpath(Apache2::ServerUtil::server_root), canonpath($server_root_relative), 'Apache2::ServerUtil::server_root'); } { # absolute paths should resolve to themselves my $dir1 = Apache2::ServerUtil::server_root_relative($r->pool, 'logs'); my $dir2 = Apache2::ServerUtil::server_root_relative($r->pool, $dir1); ok t_filepath_cmp($dir1, $dir2, "absolute path"); } } 1; __END__ mod_perl-2.0.9/t/response/TestAPI/show.pm0000644000104000010010000000105112540623206020651 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::show; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::MPM (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 1; my $mpm = Apache::Test::config->{server}->{mpm}; ok t_cmp(Apache2::MPM->show(), qr!$mpm!i, 'Apache2::MPM->show()'); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/slurp_filename.pm0000644000104000010010000000400312540623206022676 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::slurp_filename; # test slurp_filename()'s taintness options and that it works properly # with utf8 data use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestUtil (); use ModPerl::Util; use Apache2::Const -compile => 'OK'; my $expected = < 5, need 'mod_alias'; { my $data = $r->slurp_filename(0); # untainted my $received = eval $$data; ok t_cmp($received, $expected, "slurp filename untainted"); } { my $data = $r->slurp_filename; # tainted my $received = eval { eval $$data }; ok t_cmp($@, qr/Insecure dependency in eval/, "slurp filename tainted"); ModPerl::Util::untaint($$data); $received = eval $$data; ok t_cmp($received, $expected, "slurp filename untainted"); } { # just in case we will encounter some probs in the future, # here is pure perl function for comparison my $data = slurp_filename_perl($r); # tainted my $received = eval { eval $$data }; ok t_cmp($@, qr/Insecure dependency in eval/, "slurp filename (perl) tainted"); ModPerl::Util::untaint($$data); $received = eval $$data; ok t_cmp($received, $expected, "slurp filename (perl) untainted"); } Apache2::Const::OK; } sub slurp_filename_perl { my $r = shift; open my $fh, $r->filename; local $/; my $data = <$fh>; close $fh; return \$data; } 1; __END__ Alias /slurp/ @DocumentRoot@/api/ SetHandler modperl PerlResponseHandler TestAPI::slurp_filename mod_perl-2.0.9/t/response/TestAPI/status.pm0000644000104000010010000000140612540623206021220 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::status; # see the client for details use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; my $body = "This is a response string"; sub handler { my $r = shift; $r->content_type('text/plain'); my ($code, $string) = split /=/, $r->args || ''; if ($string) { # status_line must be valid and match status # or it is 'zapped' by httpd as of 2.2.1 $r->status($code); $r->status_line("$code $string"); } else { $r->status($code); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPI/sub_request.pm0000644000104000010010000000175112540623206022241 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::sub_request; # basic subrequest tests use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK SERVER_ERROR); my $uri = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = shift; my $args = $r->args || ''; return Apache2::Const::SERVER_ERROR if $args eq 'subreq'; plan $r, tests => 4; my $subr = $r->lookup_uri("$uri?subreq"); ok $subr->isa('Apache2::SubRequest'); ok t_cmp $subr->uri, $uri, "uri"; my $rc = $subr->run; ok t_cmp $rc, Apache2::Const::SERVER_ERROR, "rc"; # test an explicit DESTROY (which happens automatically on the # scope exit) undef $subr; ok 1; Apache2::Const::OK; } 1; __DATA__ mod_perl-2.0.9/t/response/TestAPI/uri.pm0000644000104000010010000001301512540623206020473 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPI::uri; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use APR::Pool (); use APR::URI (); use Apache2::URI (); use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::Const -compile => 'OK'; my $location = '/' . Apache::TestRequest::module2path(__PACKAGE__); sub handler { my $r = shift; plan $r, tests => 24; $r->args('query'); # basic { my $uri = $r->parsed_uri; ok $uri->isa('APR::URI'); ok t_cmp($uri->path, qr/^$location/, "path"); my $up = $uri->unparse; ok t_cmp($up, qr/^$location/, "unparse"); } # construct_server { my $server = $r->construct_server; ok t_cmp(join(':', $r->get_server_name, $r->get_server_port), $server, "construct_server/get_server_name/get_server_port"); } { my $hostname = "example.com"; my $server = $r->construct_server($hostname); ok t_cmp(join(':', $hostname, $r->get_server_port), $server, "construct_server($hostname)"); } { my $hostname = "example.com"; my $port = "9097"; my $server = $r->construct_server($hostname, $port); ok t_cmp(join(':', $hostname, $port), $server, "construct_server($hostname, $port)"); } { my $hostname = "example.com"; my $port = "9097"; my $server = $r->construct_server($hostname, $port, $r->pool->new); ok t_cmp(join(':', $hostname, $port), $server, "construct_server($hostname, $port, new_pool)"); } # construct_url { # if no args are passed then only $r->uri will be included (no # query and no fragment fields) my $curl = $r->construct_url; t_debug("construct_url: $curl"); t_debug("r->uri: " . $r->uri); my $parsed = APR::URI->parse($r->pool, $curl); ok $parsed->isa('APR::URI'); my $up = $parsed->unparse; ok t_cmp($up, qr/$location/, "unparse"); my $path = '/foo/bar'; $parsed->path($path); ok t_cmp($parsed->path, $path, "parsed path"); } { # this time include args in the constructed url my $fragment = "fragment"; $r->parsed_uri->fragment($fragment); my $curl = $r->construct_url(sprintf "%s?%s", $r->uri, $r->args); t_debug("construct_url: $curl"); t_debug("r->uri: ", $r->uri); my $parsed = APR::URI->parse($r->pool, $curl); my $up = $parsed->unparse; ok t_cmp($up, qr/$location/, 'construct_url($uri)'); ok t_cmp($parsed->query, $r->args, "args vs query"); } { # this time include args and a pool object my $curl = $r->construct_url(sprintf "%s?%s", $r->uri, $r->args, $r->pool->new); t_debug("construct_url: $curl"); t_debug("r->uri: ", $r->uri); my $up = APR::URI->parse($r->pool, $curl)->unparse; ok t_cmp($up, qr/$location/, 'construct_url($uri, $pool)'); } # segfault test { # test the segfault in apr < 0.9.2 (fixed on mod_perl side) # passing only the /path my $parsed = APR::URI->parse($r->pool, $r->uri); # set hostname, but not the scheme $parsed->hostname($r->get_server_name); $parsed->port($r->get_server_port); #$parsed->scheme('http'); my $expected = $r->construct_url; my $received = $parsed->unparse; t_debug("the real received is: $received"); # apr < 0.9.2-dev + fix in mpxs_apr_uri_unparse will return # '://localhost.localdomain:8529/TestAPI::uri' # apr >= 0.9.2 with internal fix will return # '//localhost.localdomain:8529/TestAPI::uri' # so in order to test pre-0.9.2 and post-0.9.2-dev we massage it $expected =~ s|^http:||; $received =~ s|^:||; ok t_cmp($received, $expected, "the bogus url is expected when 'hostname' is set " . "but not 'scheme'"); } # parse_uri { my $path = "/foo/bar"; my $query = "query"; my $fragment = "fragment"; my $newr = Apache2::RequestRec->new($r->connection, $r->pool); my $url_string = "$path?$query#$fragment"; # new request $newr->parse_uri($url_string); $newr->path_info('/bar'); ok t_cmp($newr->uri, $path, "uri"); ok t_cmp($newr->args, $query, "args"); ok t_cmp($newr->path_info, '/bar', "path_info"); my $puri = $newr->parsed_uri; ok t_cmp($puri->path, $path, "path"); ok t_cmp($puri->query, $query, "query"); ok t_cmp($puri->fragment, $fragment, "fragment"); #rpath ok t_cmp($puri->rpath, '/foo', "rpath"); my $port = 6767; $puri->port($port); $puri->scheme('ftp'); $puri->hostname('perl.apache.org'); ok t_cmp($puri->port, $port, "port"); ok t_cmp($puri->unparse, "ftp://perl.apache.org:$port$path?$query#$fragment", "unparse"); } # unescape_url { my @c = qw(one two three); my $url_string = join '%20', @c; Apache2::URI::unescape_url($url_string); ok $url_string eq "@c"; } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/0000755000104000010010000000000012540623206017347 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestAPR/base64.pm0000644000104000010010000000075012540623206020773 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::base64; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::base64; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::base64::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::base64::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/brigade.pm0000644000104000010010000000547612540623206021316 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::brigade; # testing APR::Brigade in this tests. # Other tests do that too: # TestAPR::flatten : flatten() # TestAPR::bucket : is_empty(), first(), last() use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use APR::Brigade (); use Apache2::Const -compile => 'OK'; use TestAPRlib::brigade; sub handler { my $r = shift; my $ba = $r->connection->bucket_alloc; plan $r, tests => 14 + TestAPRlib::brigade::num_of_tests(); TestAPRlib::brigade::test(); # basic + pool + destroy { my $bb = APR::Brigade->new($r->pool, $ba); t_debug('$bb is defined'); ok defined $bb; t_debug('$bb ISA APR::Brigade object'); ok $bb->isa('APR::Brigade'); my $pool = $bb->pool; t_debug('$pool is defined'); ok defined $pool; t_debug('$pool ISA APR::Pool object'); ok $pool->isa('APR::Pool'); t_debug("destroy"); $bb->destroy; ok 1; } # concat / split / length / flatten { my $bb1 = APR::Brigade->new($r->pool, $ba); $bb1->insert_head(APR::Bucket->new($ba, "11")); $bb1->insert_tail(APR::Bucket->new($ba, "12")); my $bb2 = APR::Brigade->new($r->pool, $ba); $bb2->insert_head(APR::Bucket->new($ba, "21")); $bb2->insert_tail(APR::Bucket->new($ba, "22")); # concat $bb1->concat($bb2); # bb1: 11, 12, 21, 22 ok t_cmp($bb1->length, 8, "total data length in bb"); my $len = $bb1->flatten(my $data); ok t_cmp($len, 8, "bb flatten/len"); ok t_cmp($data, "11122122", "bb flatten/data"); t_debug('$bb2 is empty'); ok $bb2->is_empty; # split my $b = $bb1->first; # 11 $b = $bb1->next($b); # 12 my $bb3 = $bb1->split($b); # bb1: 11, bb3: 12, 21, 22 $len = $bb1->flatten($data); ok t_cmp($len, 2, "bb1 flatten/len"); ok t_cmp($data, "11", "bb1 flatten/data"); $len = $bb3->flatten($data); ok t_cmp($len, 6, "bb3 flatten/len"); ok t_cmp($data, "122122", "bb3 flatten/data"); } # out-of-scope pools { my $bb1 = APR::Brigade->new(APR::Pool->new, $ba); $bb1->insert_head(APR::Bucket->new($ba, "11")); $bb1->insert_tail(APR::Bucket->new($ba, "12")); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK my $len = $bb1->flatten(my $data); ok t_cmp($data, "1112", "correct data"); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/bucket.pm0000644000104000010010000000740312540623206021166 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::bucket; # a mix of APR::Brigade, APR::Bucket abd APR::BucketType tests use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use APR::Brigade (); use APR::Bucket (); use APR::BucketType (); use Apache2::Connection (); use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; use TestAPRlib::bucket; sub handler { my $r = shift; plan $r, tests => 20 + TestAPRlib::bucket::num_of_tests(); TestAPRlib::bucket::test(); my $ba = $r->connection->bucket_alloc; # eos_create / type / length { my $b = APR::Bucket::eos_create($ba); my $type = $b->type; ok t_cmp($type->name, 'EOS', "eos_create"); ok t_cmp($b->length, 0, "eos b->length"); # buckets with no data to read should return an empty string my $rlen = $b->read(my $read); ok t_cmp($read, "", 'eos b->read/buffer'); ok t_cmp($rlen, 0, 'eos b->read/len'); } # flush_create { my $b = APR::Bucket::flush_create($ba); my $type = $b->type; ok t_cmp($type->name, 'FLUSH', "flush_create"); ok t_cmp($b->length, 0, "flush b->length"); } # insert_after / insert_before / is_eos / is_flush { my $d1 = APR::Bucket->new($ba, "d1"); my $d2 = APR::Bucket->new($ba, "d2"); my $f1 = APR::Bucket::flush_create($ba); my $f2 = APR::Bucket::flush_create($ba); my $e1 = APR::Bucket::eos_create($ba); ### create a chain of buckets my $bb = APR::Brigade->new($r->pool, $ba); # head->tail $bb->insert_head( $d1); # head->d1->tail $d1->insert_after( $d2); # head->d1->d2->tail $d2->insert_before($f1); # head->d1->f1->d2->tail $d2->insert_after( $f2); # head->d1->f1->d2->f2->tail $bb->insert_tail( $e1); # head->d1->f1->d2->f2->e1->tail ### now test my $b = $bb->first; $b->read(my $read); ok t_cmp($read, "d1", "d1 bucket"); $b = $bb->next($b); t_debug("is_flush"); ok $b->is_flush; $b = $bb->next($b); $b->read($read); ok t_cmp($read, "d2", "d2 bucket"); $b = $bb->last(); t_debug("is_eos"); ok $b->is_eos; $b = $bb->prev($b); t_debug("is_flush"); ok $b->is_flush; t_debug("not empty"); ok !$bb->is_empty; # delete all buckets from bb and test that it's empty while (!$bb->is_empty) { my $b = $bb->first; $b->delete; } t_debug("empty"); ok $bb->is_empty; } # check for non-existing buckets first/next/last { my $bb = APR::Brigade->new($r->pool, $ba); ok t_cmp($bb->first, undef, "no first bucket"); ok t_cmp($bb->last, undef, "no last bucket"); ## now there is first my $b = APR::Bucket->new($ba, "bbb"); $bb->insert_head($b); my $b_first = $bb->first; $b->read(my $read); ok t_cmp($read, "bbb", "first bucket"); # but there is no prev ok t_cmp($bb->prev($b_first), undef, "no prev bucket"); # and no next ok t_cmp($bb->next($b_first), undef, "no next bucket"); } # delete+destroy { my $bb = APR::Brigade->new($r->pool, $ba); $bb->insert_head(APR::Bucket->new($ba, "a")); $bb->insert_head(APR::Bucket->new($ba, "b")); my $b1 = $bb->first; $b1->remove; $b1->destroy; ok 1; # delete = remove + destroy my $b2 = $bb->first; $b2->delete; ok 1; } return Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/date.pm0000644000104000010010000000100212540623206020613 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::date; # testing APR::Date API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::date; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::date::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::date::test(); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPR/finfo.pm0000644000104000010010000000147312540623206021013 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::finfo; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use TestAPRlib::finfo; use APR::Finfo (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => qw(FINFO_NORM); sub handler { my $r = shift; my $tests = 1 + TestAPRlib::finfo::num_of_tests(); plan $r, tests => $tests; { my $finfo = $r->finfo; my $isa = $finfo->isa('APR::Finfo'); t_debug "\$r->finfo $finfo"; ok $isa; } # a test assigning to $r->finfo is in TestAPI::request_rec TestAPRlib::finfo::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/flatten.pm0000644000104000010010000000557012540623206021351 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::flatten; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use TestCommon::Utils; use Apache2::RequestRec (); use APR::Bucket (); use APR::Brigade (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 26; # first, create a brigade my $pool = $r->pool; my $ba = $r->connection->bucket_alloc; my $bb = APR::Brigade->new($pool, $ba); # now, let's put several buckets in it for (1 .. 10) { my $data = 'x' x 20000; my $bucket = APR::Bucket->new($ba, $data); $bb->insert_tail($bucket); } # ok, that's 10 buckets of 20,000 = 200,000 characters ok t_cmp($bb->length, 200000, 'APR::Brigade::length()'); # syntax: require a $bb eval { APR::Brigade::flatten("") }; ok t_cmp($@, qr!usage: \$bb->flatten\(\$buf, \[\$wanted\]\)!, 'APR::Brigade::flatten() requires a brigade'); # flatten() will slurp up the entire brigade # equivalent to calling apr_brigade_pflatten { my $len = $bb->flatten(my $data); verify($len, 200000, $data, 1); } # flatten(0) returns 0 bytes { my $len = $bb->flatten(my $data, 0); t_debug('$bb->flatten(0) returns a defined value'); ok (defined $data); verify($len, 0, $data, 0); } # flatten($length) will return the first $length bytes # equivalent to calling apr_brigade_flatten { # small my $len = $bb->flatten(my $data, 30); verify($len, 30, $data, 1); } { # large my $len = $bb->flatten(my $data, 190000); verify($len, 190000, $data, 1); } { # more than enough my $len = $bb->flatten(my $data, 300000); verify($len, 200000, $data, 1); } # fetch from a brigade with no data in it { my $len = APR::Brigade->new($pool, $ba)->flatten(my $data); t_debug('empty brigade returns a defined value'); ok (defined $data); verify($len, 0, $data, 0); } Apache2::Const::OK; } # this sub runs 3 sub-tests with a false $check_content # and 4 otherwise sub verify { my ($len, $expected_len, $data, $check_content) = @_; ok t_cmp($len, $expected_len, "\$bb->flatten(\$data, $len) returned $len bytes"); ok t_cmp(length($data), $len, "\$bb->flatten(\$data, $len) returned all expected data"); ok TestCommon::Utils::is_tainted($data); if ($check_content) { # don't use t_cmp() here, else we get 200,000 characters # to look at in verbose mode t_debug("data all 'x' characters"); ok ($data !~ m/[^x]/); } } 1; mod_perl-2.0.9/t/response/TestAPR/ipsubnet.pm0000644000104000010010000000472012540623206021541 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::ipsubnet; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Connection (); use Apache2::RequestRec (); use APR::Pool (); use APR::IpSubnet (); use APR::SockAddr (); use Apache2::Const -compile => 'OK'; use constant APACHE24 => have_min_apache_version('2.4.0'); sub handler { my $r = shift; my $c = $r->connection; my $p = $r->pool; plan $r, tests => 8; my $ip = APACHE24 ? $c->client_ip : $c->remote_ip; ok $ip; if (APACHE24) { ok t_cmp($c->client_addr->ip_get, $ip, "client_ip eq client_addr->ip_get"); } else { ok t_cmp($c->remote_addr->ip_get, $ip, "remote_ip eq remote_addr->ip_get"); } { my $ipsub = APR::IpSubnet->new($p, $ip); ok $ipsub->test(APACHE24 ? $c->client_addr : $c->remote_addr); } # use IP mask { my $ipsub = APR::IpSubnet->new($p, $ip, "255.0.0.0"); ok $ipsub->test(APACHE24 ? $c->client_addr : $c->remote_addr); } # fail match { if ($ip =~ /^\d+\.\d+\.\d+\.\d+$/) { # arrange for the subnet to match only one IP, which is # one digit off the client IP, ensuring a mismatch (my $mismatch = $ip) =~ s/(?<=\.)(\d+)$/$1 == 255 ? $1-1 : $1+1/e; t_debug($mismatch); my $ipsub = APR::IpSubnet->new($p, $mismatch, $mismatch); ok ! $ipsub->test(APACHE24 ? $c->client_addr : $c->remote_addr); } else { # XXX: similar ipv6 trick? ok 1; } } # bogus IP { my $ipsub = eval { APR::IpSubnet->new($p, "345.234.678.987") }; ok t_cmp($@, qr/The specified IP address is invalid/, "bogus IP"); } # bogus mask { my $ipsub = eval { APR::IpSubnet->new($p, $ip, "255.0") }; ok t_cmp($@, qr/The specified network mask is invalid/, "bogus mask"); } # temp pool { my $ipsub = APR::IpSubnet->new(APR::Pool->new, $ip); # try to overwrite the temp pool data require APR::Table; my $table = APR::Table::make(APR::Pool->new, 50); $table->set($_ => $_) for 'aa'..'za'; # now test that we are still OK ok $ipsub->test(APACHE24 ? $c->client_addr : $c->remote_addr); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/os.pm0000644000104000010010000000120012540623206020317 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::os; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::MPM (); use APR::OS (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 1; if (Apache2::MPM->is_threaded) { my $tid = APR::OS::current_thread_id(); ok t_cmp($tid, $tid, "current thread id: $tid / pid: $$"); } else { ok t_cmp($$, $$, "current process id"); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/perlio.pm0000644000104000010010000002403312540623206021201 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::perlio; # to see what happens inside the io layer, assuming that you built # mod_perl with MP_TRACE=1, run: # env MOD_PERL_TRACE=o t/TEST -v -trace=debug apr/perlio use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Fcntl (); use File::Spec::Functions qw(catfile); use Apache2::Const -compile => qw(OK CRLF); #XXX: APR::LARGE_FILES_CONFLICT constant? #XXX: you can set to zero if largefile support is not enabled in Perl use constant LARGE_FILES_CONFLICT => 1; # apr_file_dup has a bug on win32, # should be fixed in apr 0.9.4 / httpd-2.0.48 require Apache2::Build; use constant APR_WIN32_FILE_DUP_BUG => Apache2::Build::WIN32() && !have_min_apache_version('2.0.48'); sub handler { my $r = shift; my $tests = 22; $tests += 3 unless LARGE_FILES_CONFLICT; $tests += 1 unless APR_WIN32_FILE_DUP_BUG; require APR::PerlIO; plan $r, tests => $tests, need { "This Perl build doesn't support PerlIO layers" => APR::PerlIO::PERLIO_LAYERS_ARE_ENABLED() }; my $vars = Apache::Test::config()->{vars}; my $dir = catfile $vars->{documentroot}, "perlio"; t_mkdir($dir); my $sep = "-- sep --\n"; my @lines = ("This is a test: $$\n", "test line --sep two\n"); my $expected = $lines[0]; my $expected_all = join $sep, @lines; # write file my $file = catfile $dir, "test"; t_debug "open file $file for writing"; my $foo = "bar"; open my $fh, ">:APR", $file, $r->pool or die "Cannot open $file for writing: $!"; ok ref($fh) eq 'GLOB'; t_debug "write to a file:\n$expected\n"; print $fh $expected_all; close $fh; # open() failure test { # workaround for locale setups where the error message may be # in a different language open my $fh, "perlio_this_file_cannot_exist"; my $errno_string = "$!"; # non-existent file my $file = "/this/file/does/not/exist"; if (open my $fh, "<:APR", $file, $r->pool) { t_debug "must not be able to open $file!"; ok 0; close $fh; } else { ok t_cmp("$!", $errno_string, "expected failure"); } } # seek/tell() tests unless (LARGE_FILES_CONFLICT) { open my $fh, "<:APR", $file, $r->pool or die "Cannot open $file for reading: $!"; # read the whole file so we can test the buffer flushed # correctly on seek. my $dummy = join '', <$fh>; # Fcntl::SEEK_SET() my $pos = 3; # rewinds after reading 6 chars above seek $fh, $pos, Fcntl::SEEK_SET(); my $got = tell($fh); ok t_cmp($got, $pos, "seek/tell the file Fcntl::SEEK_SET"); # Fcntl::SEEK_CUR() my $step = 10; $pos = tell($fh) + $step; seek $fh, $step, Fcntl::SEEK_CUR(); $got = tell($fh); ok t_cmp($got, $pos, "seek/tell the file Fcntl::SEEK_CUR"); # Fcntl::SEEK_END() $pos = -s $file; seek $fh, 0, Fcntl::SEEK_END(); $got = tell($fh); ok t_cmp($got, $pos, "seek/tell the file Fcntl::SEEK_END"); close $fh; } # read() tests { open my $fh, "<:APR", $file, $r->pool or die "Cannot open $file for reading: $!"; # basic open test ok ref($fh) eq 'GLOB'; # basic single line read ok t_cmp(scalar(<$fh>), $expected, "single line read"); # slurp mode seek $fh, 0, Fcntl::SEEK_SET(); # rewind to the start local $/; ok t_cmp(scalar(<$fh>), $expected_all, "slurp file"); # test ungetc (a long sep requires read ahead) seek $fh, 0, Fcntl::SEEK_SET(); # rewind to the start local $/ = $sep; my @got_lines = <$fh>; my @expect = ($lines[0] . $sep, $lines[1]); ok t_cmp(\@got_lines, \@expect, "custom complex input record sep read"); close $fh; } # eof() tests { open my $fh, "<:APR", $file, $r->pool or die "Cannot open $file for reading: $!"; ok t_cmp(0, int eof($fh), # returns false, not 0 "not end of file"); # go to the end and read so eof will return 1 seek $fh, 0, Fcntl::SEEK_END(); my $received = <$fh>; t_debug($received); ok t_cmp(eof($fh), 1, "end of file"); close $fh; } # dup() test { open my $fh, "<:APR", $file, $r->pool or die "Cannot open $file for reading: $!"; open my $dup_fh, "<&:APR", $fh or die "Cannot dup $file for reading: $!"; close $fh; ok ref($dup_fh) eq 'GLOB'; my $received = <$dup_fh>; close $dup_fh; unless (APR_WIN32_FILE_DUP_BUG) { ok t_cmp($received, $expected, "read/write a dupped file"); } } # unbuffered write { open my $wfh, ">:APR", $file, $r->pool or die "Cannot open $file for writing: $!"; open my $rfh, "<:APR", $file, $r->pool or die "Cannot open $file for reading: $!"; my $expected = "This is an un buffering write test"; # unbuffer my $oldfh = select($wfh); $| = 1; select($oldfh); print $wfh $expected; # must be flushed to disk immediately ok t_cmp(scalar(<$rfh>), $expected, "file unbuffered write"); # buffer up $oldfh = select($wfh); $| = 0; select($oldfh); print $wfh $expected; # should be buffered up and not flushed ok t_cmp(scalar(<$rfh>), undef, "file buffered write"); close $wfh; close $rfh; } # tests reading and writing text and binary files { for my $file ('MoonRise.jpeg', 'redrum.txt') { my $in = catfile $dir, $file; my $out = catfile $dir, "$file.out"; my ($apr_content, $perl_content); open my $rfh, "<:APR", $in, $r->pool or die "Cannot open $in for reading: $!"; { local $/; $apr_content = <$rfh>; } close $rfh; open my $pfh, "<", $in or die "Cannot open $in for reading: $!"; binmode($pfh); { local $/; $perl_content = <$pfh>; } close $pfh; ok t_cmp(length $apr_content, length $perl_content, "testing data size of $file"); open my $wfh, ">:APR", $out, $r->pool or die "Cannot open $out for writing: $!"; print $wfh $apr_content; close $wfh; ok t_cmp(-s $out, -s $in, "testing file size of $file"); unlink $out; } } # tests for various CRLF and utf-8 issues { my $scratch = catfile $dir, 'scratch.dat'; my $text; my $count = 2000; open my $wfh, ">:crlf", $scratch or die "Cannot open $scratch for writing: $!"; print $wfh 'a' . ((('a' x 14) . "\n") x $count); close $wfh; open my $rfh, "<:APR", $scratch, $r->pool or die "Cannot open $scratch for reading: $!"; { local $/; $text = <$rfh>; } close $rfh; ok t_cmp(count_chars($text, Apache2::Const::CRLF), $count, 'testing for presence of \015\012'); ok t_cmp(count_chars($text, "\n"), $count, 'testing for presence of \n'); open $wfh, ">:APR", $scratch, $r->pool or die "Cannot open $scratch for writing: $!"; print $wfh 'a' . ((('a' x 14) . Apache2::Const::CRLF) x $count); close $wfh; open $rfh, "<:APR", $scratch, $r->pool or die "Cannot open $scratch for reading: $!"; { local $/; $text = <$rfh>; } close $rfh; ok t_cmp(count_chars($text, Apache2::Const::CRLF), $count, 'testing for presence of \015\012'); ok t_cmp(count_chars($text, "\n"), $count, 'testing for presence of \n'); open $rfh, "<:crlf", $scratch or die "Cannot open $scratch for reading: $!"; { local $/; $text = <$rfh>; } close $rfh; ok t_cmp(count_chars($text, Apache2::Const::CRLF), 0, 'testing for presence of \015\012'); ok t_cmp(count_chars($text, "\n"), $count, 'testing for presence of \n'); my $utf8 = "\x{042F} \x{0432}\x{0430}\x{0441} \x{043B}\x{044E}"; open $wfh, ">:APR", $scratch, $r->pool or die "Cannot open $scratch for writing: $!"; binmode($wfh, ':utf8'); print $wfh $utf8; close $wfh; open $rfh, "<:APR", $scratch, $r->pool or die "Cannot open $scratch for reading: $!"; binmode($rfh, ':utf8'); { local $/; $text = <$rfh>; } close $rfh; ok t_cmp($text, $utf8, 'utf8 binmode test'); unlink $scratch; } # XXX: need tests # - for stdin/out/err as they are handled specially # XXX: tmpfile is missing: # consider to use 5.8's syntax: # open $fh, "+>", undef; # cleanup: t_mkdir will remove the whole tree including the file Apache2::Const::OK; } sub count_chars { my ($text, $chars) = @_; my $seen = 0; $seen++ while $text =~ /$chars/g; return $seen; } 1; mod_perl-2.0.9/t/response/TestAPR/pool.pm0000644000104000010010000000322612540623206020661 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::pool; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::RequestRec (); use APR::Pool (); use APR::Table (); use Apache2::Const -compile => 'OK'; use TestAPRlib::pool; sub handler { my $r = shift; plan $r, tests => 4 + TestAPRlib::pool::num_of_tests(); ### native pools ### # explicit destroy shouldn't destroy native pools { my $p = $r->pool; my $count = TestAPRlib::pool::ancestry_count($p); t_debug "\$r->pool has 2 or more ancestors (found $count)"; ok $count >= 2; $p->cleanup_register(\&set_cleanup, [$r, 'native destroy']); $p->destroy; my @notes = $r->notes->get('cleanup'); ok t_cmp(scalar(@notes), 0, "should be 0 notes"); $r->notes->clear; } # implicit DESTROY shouldn't destroy native pools { { my $p = $r->pool; my $count = TestAPRlib::pool::ancestry_count($p); t_debug "\$r->pool has 2 or more ancestors (found $count)"; ok $count >= 2; $p->cleanup_register(\&set_cleanup, [$r, 'native scoped']); } my @notes = $r->notes->get('cleanup'); ok t_cmp(scalar(@notes), 0, "should be 0 notes"); $r->notes->clear; } TestAPRlib::pool::test(); Apache2::Const::OK; } sub set_cleanup { my $arg = shift; debug "setting cleanup note: $arg->[1]"; $arg->[0]->notes->set(cleanup => $arg->[1]); 1; } 1; mod_perl-2.0.9/t/response/TestAPR/pool_lifetime.pm0000644000104000010010000000106312540623206022534 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::pool_lifetime; # this test verifies that if the perl pool object exceeds the # life-span of the underlying pool struct we don't get segfaults use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; my $pool; sub handler { my $r = shift; $r->print("Pong"); $pool = $r->pool; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/sockaddr.pm0000644000104000010010000000204112540623206021474 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::sockaddr; # testing APR::SockAddr API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Connection (); use Apache2::RequestRec (); use APR::SockAddr (); use Apache2::Const -compile => 'OK'; use constant APACHE24 => have_min_apache_version('2.4.0'); sub handler { my $r = shift; my $c = $r->connection; plan $r, tests => 4; my $local = $c->local_addr; my $remote = APACHE24 ? $c->client_addr : $c->remote_addr; ok t_cmp($local->ip_get, $c->local_ip, "local ip"); if (APACHE24) { ok t_cmp($remote->ip_get, $c->client_ip, "client ip"); } else { ok t_cmp($remote->ip_get, $c->remote_ip, "remote ip"); } $r->subprocess_env; ok t_cmp($local->port, $ENV{SERVER_PORT}, "local port"); ok t_cmp($remote->port, $ENV{REMOTE_PORT}, "remote port"); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/socket.pm0000644000104000010010000000234012540623206021174 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::socket; # more tests in t/protocol/TestProtocol/echo_*.pm use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::Connection (); use APR::Socket (); use Apache2::Const -compile => 'OK'; use APR::Const -compile => 'EMISMATCH'; sub handler { my $r = shift; my $tests = 5; plan $r, tests => $tests; my $c = $r->connection; my $socket = $c->client_socket; ok $socket; # in microseconds my $orig_val = $socket->timeout_get(); t_debug "orig timeout was: $orig_val"; ok $orig_val; my $new_val = 30_000_000; # 30 secs $socket->timeout_set($new_val); ok t_cmp($socket->timeout_get(), $new_val, "timeout_get()"); # reset the timeout $socket->timeout_set($orig_val); ok t_cmp($socket->timeout_get(), $orig_val, "timeout_get()"); skip $^O=~/mswin/i ? 'APR::Socket->fileno is not implemented on MSWin' : '', sub { t_debug "client socket fd=".$socket->fileno; $socket->fileno>0 }; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/status.pm0000644000104000010010000000100212540623206021221 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::status; # Testing APR::Status use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::status; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::status::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::status::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/string.pm0000644000104000010010000000076512540623206021223 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::string; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; require TestAPRlib::string; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::string::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::string::test(); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestAPR/table.pm0000644000104000010010000000076012540623206020777 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::table; # testing APR::Table API use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::table; sub handler { my $r = shift; my $tests = TestAPRlib::table::num_of_tests(); plan $r, tests => $tests; TestAPRlib::table::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/threadmutex.pm0000644000104000010010000000102312540623206022233 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::threadmutex; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; use TestAPRlib::threadmutex; sub handler { my $r = shift; my $tests = TestAPRlib::threadmutex::num_of_tests(); plan $r, tests => $tests, need_threads; TestAPRlib::threadmutex::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/threadrwlock.pm0000644000104000010010000000102712540623206022376 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::threadrwlock; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; use TestAPRlib::threadrwlock; sub handler { my $r = shift; my $tests = TestAPRlib::threadrwlock::num_of_tests(); plan $r, tests => $tests, need_threads; TestAPRlib::threadrwlock::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/uri.pm0000644000104000010010000000102012540623206020475 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::uri; # Testing APR::URI (more tests in TestAPI::uri) use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::uri; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::uri::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::uri::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/util.pm0000644000104000010010000000076312540623206020670 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::util; # test APR::Util use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::Const -compile => 'OK'; use TestAPRlib::util; sub handler { my $r = shift; my $num_of_tests = TestAPRlib::util::num_of_tests(); plan $r, tests => $num_of_tests; TestAPRlib::util::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestAPR/uuid.pm0000644000104000010010000000067312540623206020661 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestAPR::uuid; use strict; use warnings FATAL => 'all'; use Apache::Test; use TestAPRlib::uuid; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => TestAPRlib::uuid::num_of_tests(); TestAPRlib::uuid::test(); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestCompat/0000755000104000010010000000000012540623206020150 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestCompat/apache.pm0000644000104000010010000000772312540623206021740 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache; # Apache->"method" and Apache::"function" compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use ModPerl::Util (); use Apache2::compat (); use Apache::Constants qw(DIR_MAGIC_TYPE OPT_EXECCGI :common :response); use File::Spec::Functions qw(catfile canonpath); sub fixup { my $r = shift; Apache->httpd_conf('Options +ExecCGI'); OK; } sub handler { my $r = shift; plan $r, tests => 24; $r->send_http_header('text/plain'); ### Apache-> tests my $fh = Apache->gensym; ok t_cmp(ref($fh), 'GLOB', "Apache->gensym"); ok t_cmp(Apache->module('mod_perl.c'), 1, "Apache2::module('mod_perl.c')"); ok t_cmp(Apache->module('mod_ne_exists.c'), 0, "Apache2::module('mod_ne_exists.c')"); ok t_cmp(Apache->define('MODPERL2'), Apache2::ServerUtil::exists_config_define('MODPERL2'), 'Apache->define'); ok t_cmp($r->current_callback, 'PerlResponseHandler', 'inside PerlResponseHandler'); t_server_log_error_is_expected(); Apache::log_error("Apache::log_error test ok"); ok 1; t_server_log_warn_is_expected(); Apache->warn('Apache->warn ok'); ok 1; t_server_log_warn_is_expected(); Apache::warn('Apache::warn ok'); ok 1; t_server_log_warn_is_expected(); Apache::Server->warn('Apache::Server->warn ok'); ok 1; t_server_log_warn_is_expected(); Apache::Server::warn('Apache::Server::warn ok'); ok 1; # explicitly imported ok t_cmp(DIR_MAGIC_TYPE, "httpd/unix-directory", 'DIR_MAGIC_TYPE'); # :response is ignored, but is now aliased in :common ok t_cmp(REDIRECT, "302", 'REDIRECT'); # from :common ok t_cmp(AUTH_REQUIRED, "401", 'AUTH_REQUIRED'); ok t_cmp(OK, "0", 'OK'); my $exec_cgi = $r->allow_options & Apache2::Const::OPT_EXECCGI; ok t_cmp($exec_cgi, Apache2::Const::OPT_EXECCGI, 'Apache->httpd_conf'); # (Apache||$r)->server_root_relative { my $server_root = Apache::Test::config()->{vars}->{serverroot}; ok t_filepath_cmp(canonpath($Apache::Server::CWD), canonpath($server_root), '$server_root'); ok t_filepath_cmp(canonpath($r->server_root_relative), canonpath($server_root), '$r->server_root_relative()'); ok t_filepath_cmp(canonpath($r->server_root_relative('conf')), catfile($server_root, 'conf'), "\$r->server_root_relative('conf')"); ok t_filepath_cmp(canonpath(Apache->server_root_relative('conf')), catfile($server_root, 'conf'), "Apache2::ServerUtil->server_root_relative('conf')"); ok t_filepath_cmp(canonpath(Apache->server_root_relative), canonpath($server_root), 'Apache2::ServerUtil->server_root_relative()'); my $path = catfile(Apache2::ServerUtil::server_root, 'logs'); ok t_filepath_cmp(canonpath(Apache->server_root_relative($path)), canonpath($path), "Apache->server_root_relative('$path')"); } ok t_cmp(Apache->unescape_url_info("/foo+bar%20baz"), '/foo bar baz', 'Apache->unescape_url_info'); ok t_cmp $Apache::Server::Starting, 0, '$Apache::Server::Starting'; ok t_cmp $Apache::Server::ReStarting, 1, '$Apache::Server::ReStarting'; OK; } 1; __END__ # so we can test whether send_httpd_header() works fine PerlOptions +ParseHeaders +GlobalRequest PerlModule TestCompat::apache PerlFixupHandler TestCompat::apache::fixup mod_perl-2.0.9/t/response/TestCompat/apache_file.pm0000644000104000010010000000566212540623206022737 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache_file; # Apache::File compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK); sub handler { my $r = shift; plan $r, tests => 18; $r->send_http_header('text/plain'); my $cfg = Apache::Test::config(); my $vars = $cfg->{vars}; require Apache::File; my $file = $vars->{t_conf_file}; t_debug "new Apache2::File file object"; ok my $fh = Apache::File->new; t_debug "open itself"; if ($fh->open($file)) { ok 1; t_debug "read from file"; my $read = <$fh>; ok $read; t_debug "close file"; ok $fh->close; } else { t_debug "open $file failed: $!"; ok 0; t_debug "ok: cannot read from the closed fh"; ok 1; t_debug "ok: close file should fail, wasn't opened"; ok !$fh->close; } t_debug "open non-exists"; ok !$fh->open("$file.nochance"); t_debug "new+open"; if (my $fh = Apache::File->new($file)) { ok 1; $fh->close; } else { ok 0; } t_debug "new+open non-exists"; ok !Apache::File->new("$file.yeahright"); # tmpfile my ($tmpfile, $tmpfh) = Apache::File->tmpfile; t_debug "open tmpfile fh"; ok $tmpfh; t_debug "open tmpfile name"; ok $tmpfile; my $write = "test $$"; print $tmpfh $write; seek $tmpfh, 0, 0; ok t_cmp(<$tmpfh>, $write, "write/read from tmpfile"); ok t_cmp($r->discard_request_body, Apache2::Const::OK, "\$r->discard_request_body"); ok t_cmp($r->meets_conditions, Apache2::Const::OK, "\$r->meets_conditions"); my $csize = 10; $r->set_content_length($csize); ok t_cmp($r->headers_out->{"Content-length"}, $csize, "\$r->set_content_length($csize) w/ setting explicit size"); # #$r->set_content_length(); # #TODO # ok t_cmp(0, # XXX: $r->finfo->csize is not available yet # $r->headers_out->{"Content-length"}, # "\$r->set_content_length() w/o setting explicit size"); # XXX: how to test etag? t_debug "\$r->set_etag"; $r->set_etag; ok 1; # $r->update_mtime t_debug "\$r->update_mtime()"; $r->update_mtime; # just check that it's valid ok 1; my $time = time; $r->update_mtime($time); ok t_cmp($r->mtime, $time, "\$r->update_mtime(\$time)/\$r->mtime"); # $r->set_last_modified $r->set_last_modified(); ok t_cmp($r->mtime, $time, "\$r->set_last_modified()"); $r->set_last_modified($time); ok t_cmp($r->mtime, $time, "\$r->set_last_modified(\$time)"); OK; } 1; __END__ PerlOptions +GlobalRequest mod_perl-2.0.9/t/response/TestCompat/apache_module.pm0000644000104000010010000000210512540623206023272 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache_module; # Apache2::Module compat layer tests use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK); my @directives = ( { name => 'TestCompatApacheModuleParms', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub TestCompatApacheModuleParms { my ($self, $parms, $args) = @_; my $config = Apache2::Module->get_config($self, $parms->server); $config->{data} = $args; } sub handler : method { my ($self, $r) = @_; plan $r, tests => 2; my $top_module = Apache2::Module->top_module(); ok t_cmp (ref($top_module), 'Apache2::Module'); my $config = Apache2::Module->get_config($self, $r->server); ok t_cmp ($config->{data}, 'Test'); OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestCompat::apache_module TestCompatApacheModuleParms "Test" mod_perl-2.0.9/t/response/TestCompat/apache_table.pm0000644000104000010010000000132212540623206023074 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache_table; # Apache::Table compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK); sub handler { my $r = shift; plan $r, tests => 2; $r->send_http_header('text/plain'); my $t = Apache::Table->new($r); my $t_class = ref $t; ok t_cmp($t_class, 'APR::Table', "Apache::Table->new"); ok t_cmp($r->is_main, !$r->main, '$r->is_main'); OK; } 1; mod_perl-2.0.9/t/response/TestCompat/apache_uri.pm0000644000104000010010000000353412540623206022613 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache_uri; # Apache::Util compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK); sub handler { my $r = shift; plan $r, tests => 19; { # XXX: rpath is not implemented and not in compat my @methods = qw(scheme hostinfo user password hostname path query fragment port); my $test_uri = 'http://foo:bar@perl.apache.org:80/docs?args#frag'; # Apache2::URI->parse internally returns an object blessed into # APR::URI and all the methods are called on that object for my $uri ($r->parsed_uri, Apache2::URI->parse($r, $test_uri)) { t_debug("URI=" . $uri->unparse); no strict 'refs'; # just check that methods are call-able, the actual # testing happens in TestAPR::uri test for my $meth (@methods) { my $val = $uri->$meth(); t_debug("$meth: " . ($val||'')); ok $val || 1; } } } { Apache2::compat::override_mp2_api('APR::URI::unparse'); # test the segfault in apr < 0.9.2 (fixed on mod_perl side) # passing only the /path my $parsed = $r->parsed_uri; # set hostname, but not the scheme $parsed->hostname($r->get_server_name); $parsed->port($r->get_server_port); #$parsed->scheme('http'); # compat defaults to 'http' like apache-1.3 did ok t_cmp($parsed->unparse, $r->construct_url); Apache2::compat::restore_mp2_api('APR::URI::unparse'); } OK; } 1; mod_perl-2.0.9/t/response/TestCompat/apache_util.pm0000644000104000010010000000561712540623206022775 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::apache_util; # Apache::Util compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK); my %string_size = ( '-1' => " -", 0 => " 0k", 42 => " 1k", 42_000 => " 41k", 42_000_000 => "40.1M", 42_000_000_000 => "40054M", ); # list of platforms on which C (not Perl) crypt() is supported # XXX: add other platforms that are known to have crypt my %crypt_supported = map {$_ => 1} qw(linux); my $crypt_ok = $crypt_supported{lc $^O} ? 1 : 0; my $locale = $ENV{LANG} || $ENV{LC_TIME} || ''; # XXX: will any en_XXX work with http_parse? # XXX: should we set $ENV{LANG} to en_US instead of skipping? my $parse_time_ok = $locale =~ /^en_/ ? 1 : 0; sub handler { my $r = shift; plan $r, tests => 12 + $parse_time_ok*1 + $crypt_ok*2; $r->send_http_header('text/plain'); # size_string() { while (my ($k, $v) = each %string_size) { ok t_cmp($v, Apache::Util::size_string($k)); } } # escape_uri(), escape_path(), unescape_uri() my $uri = "http://foo.com/a file.html"; (my $esc_uri = $uri) =~ s/ /\%20/g; my $uri2 = $uri; $uri = Apache::Util::escape_uri($uri); $uri2 = Apache::Util::escape_path($uri2, $r->pool); ok t_cmp($uri, $esc_uri, "Apache::Util::escape_uri"); ok t_cmp($uri2, $esc_uri, "Apache::Util::escape_path"); ok t_cmp(Apache::Util::unescape_uri($uri2), Apache2::URI::unescape_url($uri), "Apache2::URI::unescape_uri vs Apache::Util::unescape_uri"); ok t_cmp($uri2, $uri, "Apache2::URI::unescape_uri vs Apache::Util::unescape_uri"); # escape_html() my $html = '

"hi"&foo

'; my $esc_html = '<p>"hi"&foo</p>'; ok t_cmp(Apache::Util::escape_html($html), $esc_html, "Apache2::Util::escape_html"); # ht_time(), parsedate() my $time = time; Apache2::compat::override_mp2_api('Apache2::Util::ht_time'); my $fmtdate = Apache2::Util::ht_time($time); Apache2::compat::restore_mp2_api('Apache2::Util::ht_time'); ok t_cmp($fmtdate, $fmtdate, "Apache::Util::ht_time"); if ($parse_time_ok) { my $ptime = Apache::Util::parsedate($fmtdate); ok t_cmp($ptime, $time, "Apache::Util::parsedate"); } if ($crypt_ok) { # not all platforms support C-level crypt my $hash = "aX9eP53k4DGfU"; ok t_cmp(Apache::Util::validate_password("dougm", $hash), 1); ok t_cmp(Apache::Util::validate_password("mguod", $hash), 0); } OK; } 1; __END__ PerlOptions +GlobalRequest mod_perl-2.0.9/t/response/TestCompat/conn_authen.pm0000644000104000010010000000365412540623206023017 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::conn_authen; # compat checks for # $r->connection->auth_type # $r->connection->user # both records don't exist in 2.0 conn_rec and therefore require # 'PerlOptions +GlobalRequest' to retrieve those via Apache2::RequestUtil->request use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Apache::Constants qw(OK REMOTE_HOST); sub handler { my $r = shift; my $req_auth_type = $r->connection->auth_type || ''; die "request auth_type is '$req_auth_type', should be empty" if $req_auth_type; # get_basic_auth_pw populates $r->user and $r->ap_auth_type my ($rc, $sent_pw) = $r->get_basic_auth_pw; return $rc if $rc != Apache2::Const::OK; $req_auth_type = $r->connection->auth_type || ''; die "request auth_type is '$req_auth_type', should be 'Basic'" unless $req_auth_type eq 'Basic'; my $config_auth_type = $r->auth_type || ''; die "httpd.conf auth_type is '$config_auth_type', should be 'Basic'" unless $config_auth_type eq 'Basic'; my $user = $r->connection->user || ''; die "user is '$user', should be 'dougm'" unless $user eq 'dougm'; # make sure we can set both $r->connection->auth_type('sailboat'); $r->connection->user('geoff'); $user = $r->connection->user || ''; die "user is '$user', should be 'geoff'" unless $user eq 'geoff'; $req_auth_type = $r->connection->auth_type || ''; die "request auth_type is '$req_auth_type', should be 'sailboat'" unless $req_auth_type eq 'sailboat'; OK; } 1; __DATA__ require valid-user AuthType Basic AuthName simple SetHandler modperl PerlOptions +GlobalRequest PerlAuthenHandler TestCompat::conn_authen PerlResponseHandler Apache::TestHandler::ok1 mod_perl-2.0.9/t/response/TestCompat/conn_rec.pm0000644000104000010010000000214012540623206022271 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::conn_rec; use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use Apache2::compat (); use Socket qw(sockaddr_in inet_ntoa); use Apache::Constants qw(OK); sub handler { my $r = shift; my $c = $r->connection; plan $r, tests => 4; Apache2::compat::override_mp2_api('Apache2::Connection::local_addr'); my ($local_port, $local_addr) = sockaddr_in($c->local_addr); Apache2::compat::restore_mp2_api('Apache2::Connection::local_addr'); t_debug inet_ntoa($local_addr) . " :$local_port"; ok $local_port; ok inet_ntoa($local_addr); Apache2::compat::override_mp2_api('Apache2::Connection::remote_addr'); my ($remote_port, $remote_addr) = sockaddr_in($c->remote_addr); Apache2::compat::restore_mp2_api('Apache2::Connection::remote_addr'); t_debug inet_ntoa($remote_addr) . " :$remote_port"; ok $remote_port; ok inet_ntoa($remote_addr); OK; } 1; mod_perl-2.0.9/t/response/TestCompat/request.pm0000644000104000010010000001017012540623206022175 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::request; # $r->"method" compat layer tests # these tests are all run and validated on the server side. use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test; use APR::Finfo (); use File::Spec::Functions qw(catfile); use Apache2::compat (); use Apache::Constants qw(OK REMOTE_HOST); sub handler { my $r = shift; plan $r, tests => 22; $r->send_http_header('text/plain'); # header_in() and header_out() and err_header_out() for my $prefix ('err_', '') { my @ways = 'out'; push @ways, 'in' unless $prefix; for my $way (@ways) { my $sub_test = "${prefix}header_$way"; my $sub_good = "${prefix}headers_$way"; my $key = 'header-test'; # scalar context { my $key; if ($way eq 'in') { $key = "user-agent"; # should exist with lwp } else { # outgoing headers aren't set yet, so we set one $key = "X-barabara"; $r->$sub_good->set($key, $key x 2); } ok t_cmp($r->$sub_test($key), $r->$sub_good->get($key), "\$r->$sub_test in scalar context"); } # list context { my @exp = qw(foo bar); $r->$sub_good->add($key => $_) for @exp; ok t_cmp([ $r->$sub_test($key) ], \@exp, "\$r->$sub_test in list context"); } # set { my $exp = $key x 2; $r->$sub_test($key => $exp); my $got = $r->$sub_test($key); ok t_cmp($got, $exp, "\$r->$sub_test set()"); } # unset { my $exp = undef; $r->$sub_test($key => $exp); my $got = $r->$sub_test($key); ok t_cmp($got, $exp, "\$r->$sub_test unset()"); } } } # $r->filename { Apache2::compat::override_mp2_api('Apache2::RequestRec::filename'); my $orig = $r->filename; my $new = catfile Apache::Test::vars("serverroot"), "conf", "httpd.conf"; # in mp1 setting filename, updates $r's finfo (not in mp2) $r->filename($new); ok t_cmp $r->finfo->size, -s $new , "new filesize"; # restore $new = __FILE__; $r->filename($new); ok t_cmp $r->finfo->size, -s $new , "new filesize"; # restore the real 2.0 filename() method, now that we are done # with the compat one Apache2::compat::restore_mp2_api('Apache2::RequestRec::filename'); } # $r->notes { Apache2::compat::override_mp2_api('Apache2::RequestRec::notes'); my $key = 'notes-test'; # get/set scalar context { my $val = 'ok'; $r->notes($key => $val); ok t_cmp($val, $r->notes->get($key), "\$r->notes->get(\$key)"); ok t_cmp($val, $r->notes($key), "\$r->notes(\$key)"); } # unset { my $exp = undef; $r->notes($key => $exp); my $got = $r->notes($key); ok t_cmp($got, $exp, "\$r->notes unset()"); } # get/set list context { my @exp = qw(foo bar); $r->notes->add($key => $_) for @exp; ok t_cmp([ $r->notes($key) ], \@exp, "\$r->notes in list context"); } # restore the real 2.0 notes() method, now that we are done # with the compat one Apache2::compat::restore_mp2_api('Apache2::RequestRec::notes'); } # get_remote_host() ok $r->get_remote_host() || 1; ok $r->get_remote_host(Apache2::Const::REMOTE_HOST) || 1; # post_connection() $r->post_connection(sub { OK }); ok 1; # register_cleanup ok 1; $r->register_cleanup(sub { OK }); OK; } 1; mod_perl-2.0.9/t/response/TestCompat/request_body.pm0000644000104000010010000000235212540623206023215 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::request_body; # $r->"method" tests that are validated by the client use strict; use warnings FATAL => 'all'; use Apache::TestUtil; use Apache::Test (); use Apache2::compat (); use Apache::Constants qw(OK M_POST DECLINED); use subs qw(ok debug); my $gr; sub handler { my $r = shift; $gr = $r; $r->send_http_header('text/plain'); my $cfg = Apache::Test::config(); my $vars = $cfg->{vars}; my %data; if ($r->method_number == M_POST) { %data = $r->content; } else { %data = $r->Apache::args; } return DECLINED unless exists $data{test}; if ($data{test} eq 'content' || $data{test} eq 'args') { $r->print("test $data{test}"); } elsif ($data{test} eq 'decoding') { $r->print(encode($data{body})); } elsif ($data{test} eq 'big_input') { $r->print(length $data{body}); } else { # nothing } OK; } sub encode { my $val = shift; $val =~ s/(.)/sprintf "%%%02X", ord $1/eg; $val =~ s/\%20/+/g; return $val; } 1; __END__ PerlOptions +GlobalRequest mod_perl-2.0.9/t/response/TestCompat/send_fd.pm0000644000104000010010000000110312540623206022103 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestCompat::send_fd; use strict; use warnings FATAL => 'all'; use Apache2::compat (); use Apache2::RequestRec (); use Apache2::Const -compile => ':common'; sub handler { my $r = shift; my $file = $r->args || __FILE__; open my $fh, $file or return Apache2::Const::NOT_FOUND; my $bytes = $r->send_fd($fh); return Apache2::Const::SERVER_ERROR unless $bytes == -s $file; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestDirective/0000755000104000010010000000000012540623206020643 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestDirective/cmdparms.pm0000644000104000010010000000743212540623206023015 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::cmdparms; use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Directive (); use base qw(Apache2::Module); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw( ACCESS_CONF M_GET M_POST M_PUT M_DELETE OK OR_AUTHCFG OR_FILEINFO OR_INDEXES OR_LIMIT OR_OPTIONS RSRC_CONF NOT_IN_LOCATION ); use constant KEY => "TestCmdParms"; my @directives = ( { name => +KEY, cmd_data => 'cmd_data', errmsg => 'errmsg', }, ); Apache2::Module::add(__PACKAGE__, \@directives); my @methods = qw(cmd context directive info override path pool server temp_pool); sub TestCmdParms { my ($self, $parms, $args) = @_; my $srv_cfg = $self->get_config($parms->server); foreach my $method (@methods) { $srv_cfg->{$args}{$method} = $parms->$method(); } $srv_cfg->{$args}{check_ctx} = $parms->check_cmd_context(Apache2::Const::NOT_IN_LOCATION); $srv_cfg->{$args}{limited} = $parms->method_is_limited('GET'); my $directive = $parms->directive; $srv_cfg->{$args}{line_num} = $directive->line_num; $srv_cfg->{$args}{filename} = $directive->filename; } ### response handler ### sub handler : method { my ($self, $r) = @_; my $override; my $srv_cfg = $self->get_config($r->server); plan $r, tests => 11 + ( 7 * keys(%$srv_cfg) ); foreach my $cfg (values %$srv_cfg) { ok t_cmp(ref($cfg->{cmd}), 'Apache2::Command', 'cmd'); ok t_cmp(ref($cfg->{context}), 'Apache2::ConfVector', 'context'); ok t_cmp(ref($cfg->{directive}), 'Apache2::Directive', 'directive'); ok t_cmp(ref($cfg->{pool}), 'APR::Pool', 'pool'); ok t_cmp(ref($cfg->{temp_pool}), 'APR::Pool', 'temp_pool'); ok t_cmp(ref($cfg->{server}), 'Apache2::ServerRec', 'server'); ok t_cmp($cfg->{info}, 'cmd_data', 'cmd_data'); } # vhost { my $vhost = $srv_cfg->{Vhost}; my $wanted = Apache2::Const::RSRC_CONF | Apache2::Const::OR_INDEXES | Apache2::Const::OR_FILEINFO | Apache2::Const::OR_OPTIONS; my $masked = $vhost->{override} & $wanted; ok t_cmp($masked, $wanted, 'override bitmask'); ok t_cmp($vhost->{path}, undef, 'path'); ok t_cmp($vhost->{check_ctx}, undef, 'check_cmd_ctx'); ok $vhost->{limited}; ok t_cmp $vhost->{filename}, qr|httpd.conf$|, "config filename"; ok t_cmp $vhost->{line_num}, qr|^\d+$|, "config filename line_num"; } # Location { my $loc = $srv_cfg->{Location}; my $wanted = Apache2::Const::ACCESS_CONF | Apache2::Const::OR_INDEXES | Apache2::Const::OR_AUTHCFG | Apache2::Const::OR_FILEINFO | Apache2::Const::OR_OPTIONS | Apache2::Const::OR_LIMIT; my $masked = $loc->{override} & $wanted; ok t_cmp($masked, $wanted, 'override bitmask'); ok t_cmp($loc->{path}, '/TestDirective__cmdparms', 'path'); ok t_cmp($loc->{check_ctx}, KEY . ' cannot occur within section', 'check_cmd_ctx'); ok $loc->{limited}; } # Limit { my $limit = $srv_cfg->{Limit}; ok !$limit->{limited}; } return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::cmdparms TestCmdParms "Vhost" TestCmdParms "Location" #FIXME! httpd 2.4 does not allow LimitExcept here # #TestCmdParms "Limit" # mod_perl-2.0.9/t/response/TestDirective/env.pm0000644000104000010010000000445212540623206021776 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::env; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 8; # %ENV ok t_cmp(env_get('srv1'), 'env_dir1', '%ENV per-dir override per-srv'); ok t_cmp(env_get('srv2'), 'env_srv2', '%ENV per-srv'); ok t_cmp(env_get('dir2'), 'env_dir2', '%ENV per-dir'); # setup by Apache::TestRun ok t_cmp($ENV{APACHE_TEST_HOSTNAME}, 'test.host.name', '%ENV PerlPassEnv'); # $r->subprocess_env ok t_cmp(env_get('srv1', $r), 'env_dir1', '$r->subprocess_env per-dir override per-srv'); ok t_cmp(env_get('srv2', $r), 'env_srv2', '$r->subprocess_env per-srv'); ok t_cmp(env_get('dir2', $r), 'env_dir2', '$r->subprocess_env per-dir'); # setup by Apache::TestRun ok t_cmp($r->subprocess_env->get('APACHE_TEST_HOSTNAME'), 'test.host.name', '$r->subprocess_env PerlPassEnv'); Apache2::Const::OK; } sub env_get { my ($name, $r) = @_; my $key = 'TestDirective__env_' . $name; my $value = $ENV{$key}; if ($r) { my @values = $r->subprocess_env->get($key); if (@values > 1) { $value = "too many values for $key!"; } else { $value = $values[0]; } } return $value; } 1; __END__ # SetupEnv ought to have no effect on PerlSetEnv or PerlPassEnv PerlOptions -SetupEnv # per-server entry overwritten by per-directory entry PerlSetEnv TestDirective__env_srv1 env_srv1 # per-server entry not overwritten PerlSetEnv TestDirective__env_srv2 env_srv2 # PerlPassEnv is only per-server PerlPassEnv APACHE_TEST_HOSTNAME # per-directory entry overwrites per-server PerlSetEnv TestDirective__env_srv1 env_dir1 # PerlSetEnv resets the table for each directive PerlSetEnv TestDirective__env_dir2 ToBeLost PerlSetEnv TestDirective__env_dir2 env_dir2 mod_perl-2.0.9/t/response/TestDirective/perlcleanuphandler.pm0000644000104000010010000000372012540623206025053 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlcleanuphandler; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Connection (); use Apache2::ConnectionUtil (); use Apache2::Const -compile => 'OK', 'DECLINED'; # This test is to show an error that occurs if in the whole request cycle # only a PerlCleanupHandler is defined. In this case it is not called. # To check that "/get?incr" is called first. This returns "UNDEF" to the # browser and sets the counter to "1". Next "/get" is called again without # args to check the counter without increment. Then we fetch # "/index.html?incr". Here no other Perl*Handler save the PerlCleanupHandler # is involved. So the next "/get" must return "2" but it shows "1". sub cleanup { my $r=shift; $r->connection->pnotes->{counter}++ if( $r->args eq 'incr' ); return Apache2::Const::OK; } sub get { my $r=shift; $r->content_type('text/plain'); $r->print($r->connection->pnotes->{counter} || "UNDEF"); return Apache2::Const::OK; } 1; __END__ # a new interpreter pool PerlOptions +Parent PerlInterpStart 1 PerlInterpMax 1 PerlInterpMinSpare 0 PerlInterpMaxSpare 1 # PerlInterpScope connection KeepAlive On KeepAliveTimeout 300 MaxKeepAliveRequests 100 # use test system's @INC PerlSwitches -I@serverroot@ PerlRequire "conf/modperl_inc.pl" PerlModule TestDirective::perlcleanuphandler SetHandler modperl PerlResponseHandler TestDirective::perlcleanuphandler::get PerlCleanupHandler TestDirective::perlcleanuphandler::cleanup mod_perl-2.0.9/t/response/TestDirective/perldo.pm0000644000104000010010000000452512540623206022474 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perldo; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; use Apache2::PerlSections; sub handler { my $r = shift; plan $r, tests => 22, need_module('mod_alias'); ok t_cmp('yes', $TestDirective::perl::worked); ok t_cmp($TestDirective::perl::PACKAGE, qr/t::conf::extra_last_conf::line_\d+$/, '__PACKAGE__'); my %Location; { no strict 'refs'; %Location = %{$TestDirective::perl::PACKAGE . '::Location'}; } ok not exists $Location{'/perl_sections'}; ok exists $Location{'/perl_sections_saved'}; ok t_cmp($Location{'/perl_sections_saved'}{'AuthName'}, 'PerlSection'); ok t_cmp($Location{'/tied'}, 'TIED', 'Tied %Location'); ok t_cmp($TestDirective::perl::comments, 'yes', ); ok t_cmp($TestDirective::perl::dollar_zero, qr/extra.last.conf/, '$0'); ok t_cmp($TestDirective::perl::filename, qr/extra.last.conf/, '__FILE__'); # 3 would mean we are still counting lines from the context of the eval ok $TestDirective::perl::line > 3; ok !t_cmp($0, '-e', '$0'); my $target = Apache::Test::vars('target'); ok t_cmp($0, qr/$target/i, '$0'); ok t_cmp($TestDirective::perl::Included, 1, "Include"); my $dump = Apache2::PerlSections->dump; ok t_cmp($dump, qr/__END__/, "Apache2::PerlSections->dump"); eval "package TestDirective::perldo::test;\nno strict;\n$dump"; ok t_cmp($@, "", "PerlSections dump syntax check"); ok t_cmp($TestDirective::perldo::test::Include, qr/perlsection.conf/); #Check for correct Apache2::ServerUtil->server behavior my $bport = $TestDirective::perl::base_server->port; my $vport = $TestDirective::perl::vhost_server->port; ok defined $bport && defined $vport && $vport != $bport; foreach my $url (qw(scalar scalar1 scalar2)) { my $res = GET "/perl_sections_perlconfig_$url/"; ok t_cmp($res->is_success, 1, '$PerlConfig'); } foreach my $url (qw(array1 array2)) { my $res = GET "/perl_sections_perlconfig_$url/"; ok t_cmp($res->is_success, 1, '@PerlConfig'); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestDirective/perlloadmodule.pm0000644000104000010010000000615512540623206024220 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::Const -compile => qw(OK OR_ALL RSRC_CONF TAKE1 TAKE23); use Apache2::CmdParms (); use Apache2::Module (); my @directives = ( { name => 'MyTest', func => __PACKAGE__ . '::MyTest', req_override => Apache2::Const::RSRC_CONF, # req_override => 'RSRC_CONF', #test 1.x compat for strings # args_how => Apache2::Const::TAKE23, args_how => 'TAKE23', #test 1.x compat for strings errmsg => 'A test', }, { name => 'MyOtherTest', cmd_data => 'some info', }, { name => 'ServerTest', req_override => Apache2::Const::RSRC_CONF, } ); Apache2::Module::add(__PACKAGE__, \@directives); sub DIR_CREATE { my ($class, $parms) = @_; bless { path => $parms->path || "/", }, $class; } sub merge { my ($base, $add) = @_; my %new = (); @new{keys %$base, keys %$add} = (values %$base, values %$add); return bless \%new, ref($base); } sub DIR_MERGE { my $class = ref $_[0]; debug "$class->DIR_MERGE\n"; merge(@_); } #sub SERVER_MERGE { # my $class = ref $_[0]; # debug "$class->SERVER_MERGE\n"; # merge(@_); #} sub SERVER_CREATE { my ($class, $parms) = @_; debug "$class->SERVER_CREATE\n"; return bless { name => __PACKAGE__, }, $class; } sub MyTest { my ($self, $parms, @args) = @_; $self->{MyTest} = \@args; $self->{MyTestInfo} = $parms->info; } sub MyOtherTest { my ($self, $parms, $arg) = @_; $self->{MyOtherTest} = $arg; $self->{MyOtherTestInfo} = $parms->info; } sub ServerTest { my ($self, $parms, $arg) = @_; my $srv_cfg = $self->get_config($parms->server); $srv_cfg->{ServerTest} = $arg; } sub get_config { my ($self, $s) = (shift, shift); Apache2::Module::get_config($self, $s, @_); } sub handler : method { my ($self, $r) = @_; my $s = $r->server; my $dir_cfg = $self->get_config($s, $r->per_dir_config); my $srv_cfg = $self->get_config($s); plan $r, tests => 9; t_debug("per-dir config:", $dir_cfg); t_debug("per-srv config:", $srv_cfg); ok $dir_cfg->isa($self); ok $srv_cfg->isa($self); my $path = $dir_cfg->{path}; ok t_cmp($r->uri, qr{^$path}, 'r->uri =~ parms->path'); ok t_cmp($srv_cfg->{name}, $self, '$self eq $srv_cfg->{name}'); ok t_cmp($dir_cfg->{MyOtherTest}, 'value', 'MyOtherTest value'); ok t_cmp($dir_cfg->{MyOtherTestInfo}, 'some info', 'MyOtherTest cmd_data'); ok t_cmp($dir_cfg->{MyTest}, ['one', 'two'], 'MyTest one two'); ok ! $dir_cfg->{MyTestInfo}; ok t_cmp($srv_cfg->{ServerTest}, 'per-server'); Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule MyTest one two ServerTest per-server MyOtherTest value mod_perl-2.0.9/t/response/TestDirective/perlloadmodule2.pm0000644000104000010010000000602312540623206024274 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule2; # in this test the merge is inherits all the values from the ancestors # and adds new values if such were set use strict; use warnings FATAL => 'all'; use Apache2::Const -compile => qw(OK OR_ALL ITERATE); use Apache2::CmdParms (); use Apache2::Module (); my @directives = ( { name => 'MyMergeTest', func => __PACKAGE__ . '::MyMergeTest', req_override => Apache2::Const::OR_ALL, args_how => Apache2::Const::ITERATE, errmsg => 'Values that get merged', }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub merge { my ($base, $add) = @_; my %new = (); # be careful if the object values are references and not scalars. # If that's the case a deep copy must be performed, or the merged # object will affect the based object, which will break things # when DIR_MERGE is called twice for the same $base/$add during # the same request push @{ $new{$_} }, @{ $base->{$_}||[] } for keys %$base; push @{ $new{$_} }, @{ $add->{$_} ||[] } for keys %$add; return bless \%new, ref($base); } sub DIR_MERGE { my $class = ref $_[0]; #warn "$class->DIR_MERGE\n"; merge(@_); } sub SERVER_MERGE { my $class = ref $_[0]; #warn "$class->SERVER_MERGE\n"; merge(@_); } # this variable is of type ITERATE, so it'll get called as many times # as arguments, a single argument at a time. This function is called # only during the server startup and when the directive appears in the # .htaccess files sub MyMergeTest { my ($self, $parms, $arg) = @_; #warn "MyMergeTest: @{[$parms->path||'']}\n\t$arg\n"; push @{ $self->{MyMergeTest} }, $arg; # store the top level srv values in the server struct as well, so # during the request you can query what was the top level (srv) # setting, before it was merged with the current container's # setting if any unless ($parms->path) { my $srv_cfg = $self->get_config($parms->server); push @{ $srv_cfg->{MyMergeTest} }, $arg; } } sub get_config { my ($self, $s) = (shift, shift); Apache2::Module::get_config($self, $s, @_); } sub handler : method { my ($self, $r) = @_; $r->content_type('text/plain'); my $s = $r->server; if (defined $r->args and $r->args eq 'srv') { my $srv_cfg = $self->get_config($s); $r->print("srv: @{ $srv_cfg->{MyMergeTest}||[] }"); } else { my $dir_cfg = $self->get_config($s, $r->per_dir_config); $r->print("dir: @{ $dir_cfg->{MyMergeTest}||[] }"); } return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule2 MyMergeTest one two MyMergeTest three four MyMergeTest five MyMergeTest six mod_perl-2.0.9/t/response/TestDirective/perlloadmodule3.pm0000644000104000010010000001032212540623206024272 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule3; # in this test we test various merging techniques. As a side effect it # tests how mod_perl works when its forced to start early outside # vhosts and how it works with vhosts. See perlloadmodule4.pm and # perlloadmodule5.pm, for similar tests that starts mod_perl early # from a vhost. use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Module (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); my @directives = ( { name => 'MyPlus' }, { name => 'MyList' }, { name => 'MyAppend' }, { name => 'MyOverride' }, ); Apache2::Module::add(__PACKAGE__, \@directives); sub MyPlus { set_val('MyPlus', @_) } sub MyAppend { set_val('MyAppend', @_) } sub MyOverride { set_val('MyOverride', @_) } sub MyList { push_val('MyList', @_) } sub DIR_MERGE { merge(@_) } sub SERVER_MERGE { merge(@_) } sub set_val { my ($key, $self, $parms, $arg) = @_; $self->{$key} = $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); $srv_cfg->{$key} = $arg; } } sub push_val { my ($key, $self, $parms, $arg) = @_; push @{ $self->{$key} }, $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); push @{ $srv_cfg->{$key} }, $arg; } } sub merge { my ($base, $add) = @_; my %mrg = (); for my $key (keys %$base, %$add) { next if exists $mrg{$key}; if ($key eq 'MyPlus') { $mrg{$key} = ($base->{$key}||0) + ($add->{$key}||0); } elsif ($key eq 'MyList') { push @{ $mrg{$key} }, @{ $base->{$key}||[] }, @{ $add->{$key}||[] }; } elsif ($key eq 'MyAppend') { $mrg{$key} = join " ", grep defined, $base->{$key}, $add->{$key}; } else { # override mode $mrg{$key} = $base->{$key} if exists $base->{$key}; $mrg{$key} = $add->{$key} if exists $add->{$key}; } } return bless \%mrg, ref($base); } ### response handler ### use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Module (); use Apache2::Const -compile => qw(OK); sub get_config { Apache2::Module::get_config(__PACKAGE__, @_); } sub handler { my ($r) = @_; my %secs = (); $r->content_type('text/plain'); my $s = $r->server; my $dir_cfg = get_config($s, $r->per_dir_config); my $srv_cfg = get_config($s); if ($s->is_virtual) { $secs{"1: Main Server"} = get_config(Apache2::ServerUtil->server); $secs{"2: Virtual Host"} = $srv_cfg; $secs{"3: Location"} = $dir_cfg; } else { $secs{"1: Main Server"} = $srv_cfg; $secs{"2: Location"} = $dir_cfg; } $r->printf("Processing by %s.\n", $s->is_virtual ? "virtual host" : "main server"); for my $sec (sort keys %secs) { $r->print("\nSection $sec\n"); for my $k (sort keys %{ $secs{$sec}||{} }) { my $v = exists $secs{$sec}->{$k} ? $secs{$sec}->{$k} : 'UNSET'; $v = '[' . (join ", ", map {qq{"$_"}} @$v) . ']' if ref($v) eq 'ARRAY'; $r->printf("%-10s : %s\n", $k, $v); } } return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule3 MyPlus 5 MyList "MainServer" MyAppend "MainServer" MyOverride "MainServer" MyPlus 2 MyList "VHost" MyAppend "VHost" MyOverride "VHost" MyPlus 3 MyList "Dir" MyAppend "Dir" MyOverride "Dir" SetHandler modperl PerlResponseHandler TestDirective::perlloadmodule3 MyPlus 1 MyList "SubDir" MyAppend "SubDir" MyOverride "SubDir" mod_perl-2.0.9/t/response/TestDirective/perlloadmodule4.pm0000644000104000010010000000462412540623206024303 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule4; # XXX: the package is 99% the same as perlloadlmodule5 and 6, just the # configuration is different. Consider removing the code dups. # # in this test we test an early mod_perl startup caused by an # EXEC_ON_READ directive in the baseserver. In this test the # non-native mod_perl directive sets scfg on behalf of mod_perl in # that vhost. # # See also perlloadmodule5.pm, which is almost the same, but uses a # mod_perl native directive before a non-native directive in vhost. In # that test mod_perl sets scfg for that vhost by itself. # # see perlloadmodule6.pm for the case where mod_perl starts early, but # from within the vhost. use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Module (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); use constant KEY => "MyTest4"; my @directives = ({ name => +KEY },); Apache2::Module::add(__PACKAGE__, \@directives); sub MyTest4 { my ($self, $parms, $arg) = @_; $self->{+KEY} = $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); $srv_cfg->{+KEY} = $arg; } } ### response handler ### use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Module (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub get_config { Apache2::Module::get_config(__PACKAGE__, @_); } sub handler { my ($r) = @_; my %secs = (); $r->content_type('text/plain'); my $s = $r->server; my $dir_cfg = get_config($s, $r->per_dir_config); my $srv_cfg = get_config($s); plan $r, tests => 3; ok $s->is_virtual; ok t_cmp($dir_cfg->{+KEY}, "Dir", "Section"); ok t_cmp($srv_cfg->{+KEY}, "Vhost", "Section"); return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule4 # here perlloadmodule sets scfg on behalf of the base server MyTest4 "Vhost" MyTest4 "Dir" SetHandler modperl PerlResponseHandler TestDirective::perlloadmodule4 mod_perl-2.0.9/t/response/TestDirective/perlloadmodule5.pm0000644000104000010010000000457612540623206024312 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule5; # in this test we test an early mod_perl startup caused by an # EXEC_ON_READ directive in the baseserver. In this test we have a # mod_perl native directive before a non-native directive inside vhost # section. Here mod_perl sets scfg for that vhost by itself. # # See also perlloadmodule4.pm, which is almost the same, but has no # mod_perl native directive before a non-native directive in vhost. In # that test the non-native mod_perl directive sets scfg on behalf of # mod_perl in that vhost. # # see perlloadmodule6.pm for the case where mod_perl starts early, but # from within the vhost. use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Module (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); use constant KEY => "MyTest5"; my @directives = ({ name => +KEY },); Apache2::Module::add(__PACKAGE__, \@directives); sub MyTest5 { my ($self, $parms, $arg) = @_; $self->{+KEY} = $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); $srv_cfg->{+KEY} = $arg; } } ### response handler ### use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Module (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub get_config { Apache2::Module::get_config(__PACKAGE__, @_); } sub handler { my ($r) = @_; my %secs = (); $r->content_type('text/plain'); my $s = $r->server; my $dir_cfg = get_config($s, $r->per_dir_config); my $srv_cfg = get_config($s); plan $r, tests => 3; ok $s->is_virtual; ok t_cmp($dir_cfg->{+KEY}, "Dir", "Section"); ok t_cmp($srv_cfg->{+KEY}, "Vhost", "Section"); return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule5 # here mod_perl sets the scfg by itself for this vhost PerlModule File::Spec MyTest5 "Vhost" MyTest5 "Dir" SetHandler modperl PerlResponseHandler TestDirective::perlloadmodule5 mod_perl-2.0.9/t/response/TestDirective/perlloadmodule6.pm0000644000104000010010000000422012540623206024275 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule6; # in this test we test an early mod_perl startup caused by an # EXEC_ON_READ directive in vhost. use strict; use warnings FATAL => 'all'; use Apache2::CmdParms (); use Apache2::Module (); use Apache2::ServerUtil (); use Apache2::Const -compile => qw(OK); use constant KEY => "MyTest6"; my @directives = ({ name => +KEY },); Apache2::Module::add(__PACKAGE__, \@directives); sub MyTest6 { my ($self, $parms, $arg) = @_; $self->{+KEY} = $arg; unless ($parms->path) { my $srv_cfg = Apache2::Module::get_config($self, $parms->server); $srv_cfg->{+KEY} = $arg; } } ### response handler ### use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::Module (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub get_config { Apache2::Module::get_config(__PACKAGE__, @_); } sub handler { my ($r) = @_; my %secs = (); $r->content_type('text/plain'); my $s = $r->server; my $dir_cfg = get_config($s, $r->per_dir_config); my $srv_cfg = get_config($s); plan $r, tests => 3; ok $s->is_virtual; ok t_cmp($dir_cfg->{+KEY}, "Dir", "Section"); ok t_cmp($srv_cfg->{+KEY}, "Vhost", "Section"); return Apache2::Const::OK; } 1; __END__ # XXX: we want to have this configuration section to come first # amongst other perlloadmodule tests (<950), so we can test how # mod_perl starts from vhost. but currently we can't because # PerlSwitches from other tests are ignored, so the test suite fails # to startup. # # tmp solution: ensure that it's configured *after* all other # perlloadmodule tests # # APACHE_TEST_CONFIG_ORDER 951 PerlLoadModule TestDirective::perlloadmodule6 MyTest6 "Vhost" MyTest6 "Dir" SetHandler modperl PerlResponseHandler TestDirective::perlloadmodule6 mod_perl-2.0.9/t/response/TestDirective/perlloadmodule7.pm0000644000104000010010000000300212540623206024273 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlloadmodule7; # this test was written to reproduce a segfault under worker # due to a bug in custom directive implementation, where # the code called from modperl_module_config_merge() was setting the # global context after selecting the new interpreter which was leading # to a segfault in any handler called thereafter, whose context was # different beforehand. use strict; use warnings FATAL => 'all'; use Apache2::Module (); use Apache2::Const -compile => qw(OK); use constant KEY1 => "MyTest7_1"; use constant KEY2 => "MyTest7_2"; my @directives = ({ name => +KEY1 }, { name => +KEY2 }); Apache2::Module::add(__PACKAGE__, \@directives); sub MyTest7_1 { my ($self, $parms, $arg) = @_; $self->{+KEY1} = $arg; } sub MyTest7_2 { my ($self, $parms, $arg) = @_; $self->{+KEY2} = $arg; } ### response handler ### use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub handler { my ($r) = @_; plan $r, tests => 1; ok 1; return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestDirective::perlloadmodule7 MyTest7_1 test MyTest7_2 test SetHandler modperl PerlResponseHandler TestDirective::perlloadmodule7 mod_perl-2.0.9/t/response/TestDirective/perlmodule.pm0000644000104000010010000000273112540623206023354 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlmodule; # This test is similar to TestDirective::perlrequire. Here we test # whether vhost inheriting the parent perl from the base can handle # PerlModule directives. use strict; use warnings FATAL => 'all'; use Apache::Test (); use Apache2::RequestRec (); use Apache2::RequestIO (); use File::Spec::Functions qw(catfile); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); $r->puts($ApacheTest::PerlModuleTest::MAGIC || ''); Apache2::Const::OK; } sub APACHE_TEST_CONFIGURE { my ($class, $self) = @_; my $vars = $self->{vars}; my $target_dir = catfile $vars->{documentroot}, 'testdirective'; my $magic = __PACKAGE__; my $content = <writefile($file, $content, 1); } 1; __END__ # APACHE_TEST_CONFIG_ORDER 940 PerlSwitches -I@documentroot@/testdirective/perlmodule-vh PerlModule ApacheTest::PerlModuleTest SetHandler modperl PerlResponseHandler TestDirective::perlmodule mod_perl-2.0.9/t/response/TestDirective/perlrequire.pm0000644000104000010010000000444212540623206023544 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::perlrequire; # Test whether vhost with 'PerlOptions +Parent', which doesn't inherit # from the base, has its own INC and therefore can have a modules with # the same namespace as the base, but different content. # # Also see the parallel TestDirective::perlmodule handler use strict; use warnings FATAL => 'all'; use Apache::Test (); use Apache2::RequestRec (); use Apache2::RequestIO (); use File::Spec::Functions qw(catfile); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); $r->puts($ApacheTest::PerlRequireTest::MAGIC || ''); Apache2::Const::OK; } my %require_tests = ( main => 'PerlRequired by Parent', vh => 'PerlRequired by VirtualHost', ); sub APACHE_TEST_CONFIGURE { my ($class, $self) = @_; my $vars = $self->{vars}; my $target_dir = catfile $vars->{documentroot}, 'testdirective'; # create two different PerlRequireTest.pm packages to be loaded by # vh and main interpreters, on the fly before the tests start while (my ($test, $magic) = each %require_tests) { my $content = <writefile($file, $content, 1); } } 1; __END__ # APACHE_TEST_CONFIG_ORDER 940 PerlSwitches -I@documentroot@/testdirective/main PerlRequire "ApacheTest/PerlRequireTest.pm" # a new interpreter pool PerlOptions +Parent PerlInterpStart 1 PerlInterpMax 1 PerlInterpMinSpare 1 PerlInterpMaxSpare 1 # use test system's @INC PerlSwitches -I@serverroot@ PerlRequire "conf/modperl_inc.pl" PerlSwitches -I@documentroot@/testdirective/vh PerlRequire "ApacheTest/PerlRequireTest.pm" SetHandler modperl PerlResponseHandler TestDirective::perlrequire mod_perl-2.0.9/t/response/TestDirective/pod.pm0000644000104000010010000000134012540623206021761 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::pod; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 4; ok t_cmp $r->dir_config->get('TestDirective__pod_hidden'), undef; ok t_cmp $r->dir_config->get('TestDirective__pod_over_worked'), 'yes'; ok t_cmp $r->dir_config->get('TestDirective__pod_cut_worked'), 'yes'; #XXX: How to test that __END__ works proprely without cloberring all the other tests? ok t_cmp '__END__', '__END__'; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestDirective/setupenv.pm0000644000104000010010000000106512540623206023054 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestDirective::setupenv; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $ENV{QS} = $r->args if $r->args; while (my ($key, $val) = each %ENV) { next unless $key and $val; $r->puts("$key=$val\n"); } Apache2::Const::OK; } 1; __END__ PerlOptions +SetupEnv mod_perl-2.0.9/t/response/TestError/0000755000104000010010000000000012540623206020016 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestError/api.pm0000644000104000010010000000136512540623206021132 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestError::api; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::RequestIO (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; plan $r, tests => 1; $r->content_type('text/plain'); # PerlOptions -GlobalRequest is in effect eval { my $gr = Apache2::RequestUtil->request; }; ok t_cmp($@, qr/\$r object is not available/, "unavailable global $r object"); return Apache2::Const::OK; } 1; __END__ PerlOptions -GlobalRequest mod_perl-2.0.9/t/response/TestError/runtime.pm0000644000104000010010000000723312540623206022044 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestError::runtime; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Connection (); use APR::Socket (); use APR::Status (); use Apache::TestUtil; use Apache2::Const -compile => qw(OK); use APR::Const -compile => qw(EACCES); use constant SIZE => 2048; sub handler { my $r = shift; my $socket = $r->connection->client_socket; my $args = $r->args; $r->content_type('text/plain'); # set timeout to 0 to make sure that any socket read call will # fail $socket->timeout_set(0); no strict 'refs'; $args->($r, $socket); return Apache2::Const::OK; } sub overload_test { my ($r, $socket) = @_; eval { mp_error($socket) }; die "there should have been an exception" unless $@; die "the exception should have been an APR::Error object" unless ref $@ eq 'APR::Error'; # == && != (expecting an EAGAIN error) die "APR::Status is broken" unless APR::Status::is_EAGAIN($@); die "'==' overload is broken" unless $@ == $@; die "'!=' overload is broken" unless $@ != APR::Const::EACCES; die "'!=' overload is broken" unless APR::Const::EACCES != $@; die "'!=' overload is broken" if $@ != $@; # XXX: add more overload tests $r->print("ok overload_test"); } sub plain_mp_error { my ($r, $socket) = @_; t_server_log_error_is_expected(); mp_error($socket); } sub plain_non_mp_error { my ($r, $socket) = @_; t_server_log_error_is_expected(); non_mp_error($socket); } sub die_hook_confess_mp_error { my ($r, $socket) = @_; local $SIG{__DIE__} = \&APR::Error::confess; t_server_log_error_is_expected(); mp_error($socket); } sub die_hook_confess_non_mp_error { my ($r, $socket) = @_; local $SIG{__DIE__} = \&APR::Error::confess; t_server_log_error_is_expected(); non_mp_error($socket); } sub die_hook_custom_mp_error { my ($r, $socket) = @_; local $SIG{__DIE__} = sub { die "custom die hook: $_[0]" }; t_server_log_error_is_expected(); mp_error($socket); } sub die_hook_custom_non_mp_error { my ($r, $socket) = @_; local $SIG{__DIE__} = sub { die "custom die hook: $_[0]" }; t_server_log_error_is_expected(); non_mp_error($socket); } sub eval_block_mp_error { my ($r, $socket) = @_; # throw in some retry attempts my $tries = 0; RETRY: eval { mp_error($socket) }; if ($@ && ref($@) && APR::Status::is_EAGAIN($@)) { if ($tries++ < 3) { goto RETRY; } else { $r->print("ok eval_block_mp_error"); } } else { die "eval block has failed: $@"; } } sub eval_string_mp_error { my ($r, $socket) = @_; eval '$socket->recv(my $buffer, SIZE)'; if ($@ && ref($@) && APR::Status::is_EAGAIN($@)) { $r->print("ok eval_string_mp_error"); } else { die "eval string has failed: $@"; } } sub eval_block_non_mp_error { my ($r, $socket) = @_; eval { non_mp_error($socket) }; if ($@ && !ref($@)) { $r->print("ok eval_block_non_mp_error"); } else { die "eval eval_non_mp_error has failed: $@"; } } sub eval_block_non_error { my ($r, $socket) = @_; eval { 1; }; if ($@) { die "eval eval_block_non_mp_error has failed"; } $r->print("ok eval_block_non_error"); } sub non_mp_error { no_such_func(); } # fails because of the timeout set earlier in the handler sub mp_error { my $socket = shift; $socket->recv(my $buffer, SIZE); } 1; __END__ mod_perl-2.0.9/t/response/TestError/syntax.pm0000644000104000010010000000100312540623206021674 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestError::syntax; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; $r->content_type('text/plain'); # the following syntax error is here on purpose! lkj;\; $r->print('ok'); return Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/0000755000104000010010000000000012540623207020330 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestModperl/cookie.pm0000644000104000010010000000242312540623206022137 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::cookie; use strict; use warnings FATAL => 'all'; use Apache::TestTrace; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; sub access { my $r = shift; # setup CGI variables early $r->subprocess_env() if $r->args eq 'env'; my ($key, $val) = cookie($r); my $cookie_is_expected = ($r->args eq 'header' or $r->args eq 'env') ? 1 : 0; die "Can't get the cookie" if $cookie_is_expected && !defined $val; return Apache2::Const::OK; } sub handler { my $r = shift; my ($key, $val) = cookie($r); $r->print($val) if defined $val; return Apache2::Const::OK; } sub cookie { my $r = shift; my $header = $r->headers_in->{Cookie} || ''; my $env = $ENV{HTTP_COOKIE} || $ENV{COOKIE} || ''; # from CGI::Cookie debug "cookie (" .$r->args . "): header: [$header], env: [$env]"; return split '=', $r->args eq 'header' ? $header : $env; } 1; __DATA__ SetHandler perl-script PerlModule TestModperl::cookie PerlAccessHandler TestModperl::cookie::access PerlResponseHandler TestModperl::cookie PerlOptions -SetupEnv mod_perl-2.0.9/t/response/TestModperl/cookie2.pm0000644000104000010010000000221712540623206022222 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::cookie2; use strict; use warnings FATAL => 'all'; use Apache::TestTrace; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => 'OK'; sub access { my $r = shift; $r->subprocess_env if $r->args eq 'subprocess_env'; my ($key, $val) = cookie($r); die "I shouldn't get the cookie" if $r->args eq 'env' && defined $val; return Apache2::Const::OK; } sub handler { my $r = shift; my ($key, $val) = cookie($r); $r->print($val) if defined $val; return Apache2::Const::OK; } sub cookie { my $r = shift; my $header = $r->headers_in->{Cookie} || ''; my $env = $ENV{HTTP_COOKIE} || $ENV{COOKIE} || ''; # from CGI::cookie2 debug "cookie (" .$r->args . "): header: [$header], env: [$env]"; return split '=', $r->args eq 'header' ? $header : $env; } 1; __DATA__ SetHandler modperl PerlModule TestModperl::cookie2 PerlAccessHandler TestModperl::cookie2::access PerlResponseHandler TestModperl::cookie2 mod_perl-2.0.9/t/response/TestModperl/current_callback.pm0000644000104000010010000000260512540623206024166 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::current_callback; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use ModPerl::Util; use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $r = shift; plan $r, tests => 1; my $callback = ModPerl::Util::current_callback(); ok t_cmp($callback, 'PerlResponseHandler', 'inside PerlResponseHandler'); #warn "in callback: $callback\n"; Apache2::Const::OK; } sub log { check('Log') } sub fixup { check('Fixup') } sub headerparser { check('HeaderParser') } sub check { my $expected = 'Perl' . shift() . 'Handler'; my $callback = ModPerl::Util::current_callback(); die "expecting $expected callback, instead got $callback" unless $callback eq $expected; #warn "in callback: $callback\n"; return Apache2::Const::OK; } 1; __DATA__ PerlModule TestModperl::current_callback PerlHeaderParserHandler TestModperl::current_callback::headerparser PerlFixupHandler TestModperl::current_callback::fixup PerlResponseHandler TestModperl::current_callback PerlLogHandler TestModperl::current_callback::log SetHandler modperl mod_perl-2.0.9/t/response/TestModperl/dir_config.pm0000644000104000010010000001176612540623206023003 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::dir_config; use strict; use warnings FATAL => 'all'; use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::RequestUtil (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 15; #Apache2::RequestRec::dir_config tests # this test doesn't test all $r->dir_config->*(), since # dir_config() returns a generic APR::Table which is tested in # apr/table.t. # object test my $dir_config = $r->dir_config; ok defined $dir_config && ref($dir_config) eq 'APR::Table'; # make sure trying to get something that's not defined # doesn't blow up my $undef = $r->dir_config('EDOESNOTEXIST'); ok t_cmp($undef, undef, 'no PerlSetVar to get data from'); # PerlAddVar ITERATE2 test { my $key = make_key('1'); my @received = $dir_config->get($key); my @expected = qw(1_SetValue 2_AddValue 3_AddValue 4_AddValue); ok t_cmp(\@received, \@expected, 'PerlAddVar ITERATE2'); } # sub-section inherits from super-section if it doesn't override it { my $key = make_key('_set_in_Base'); ok t_cmp($r->dir_config($key), 'BaseValue', "sub-section inherits from super-section " . "if it doesn't override it"); } # sub-section overrides super-section for the same key { my $key = 'TestModperl__server_rec_Key_set_in_Base'; ok t_cmp($r->dir_config->get($key), 'SubSecValue', "sub-section overrides super-section for the same key"); } { my $key = make_key('0'); # object interface test in a scalar context (for a single # PerlSetVar key) ok t_cmp($dir_config->get($key), 'SetValue0', "table get() in a scalar context"); # direct fetch test in a scalar context (for a single # PerlSetVar key) ok t_cmp($r->dir_config($key), 'SetValue0', "direct value fetch in a scalar context"); } # make sure 0 comes through as 0 and not undef { my $key = 'TestModperl__request_rec_ZeroKey'; ok t_cmp($r->dir_config($key), 0, 'table value 0 is not undef'); } # test non-existent key { my $key = make_key(); ok t_cmp($r->dir_config($key), undef, "non-existent key"); } # test set interface { my $key = make_key(); my $val = "DirConfig"; $r->dir_config($key => $val); ok t_cmp($r->dir_config($key), $val, "set && get"); } # test unset interface { my $key = make_key(); $r->dir_config($key => 'whatever'); $r->dir_config($key => undef); ok t_cmp(undef, $r->dir_config($key), "unset"); } #Apache2::ServerUtil::dir_config tests my $s = $r->server; # this test doesn't test all $s->dir_config->*(), since # dir_config() returns a generic APR::Table which is tested in # apr/table.t. # object test $dir_config = $s->dir_config; ok defined $dir_config && ref($dir_config) eq 'APR::Table'; # PerlAddVar ITERATE2 test { my $key = 'TestModperl__server_rec_Key_set_in_Base'; my @received = $dir_config->get($key); my @expected = qw(1_SetValue 2_AddValue 3_AddValue); ok t_cmp(\@received, \@expected, "testing PerlAddVar ITERATE2 in \$s"); } { # base server test my $bs = Apache2::ServerUtil->server; ok t_cmp(($bs && ref($bs)), 'Apache2::ServerRec', "base server's object retrieval"); my $key = 'TestModperl__server_rec_Key_set_in_Base'; ok t_cmp(scalar ($bs->dir_config->get($key)), '1_SetValue', "read dir_config of the base server"); } Apache2::Const::OK; } my $key_base = "TestModperl__request_rec_Key"; my $counter = 0; sub make_key { return $key_base . (defined $_[0] ? $_[0] : unpack "H*", pack "n", ++$counter . rand(100)); } 1; __END__ PerlSetVar TestModperl__request_rec_Key_set_in_Base BaseValue PerlSetVar TestModperl__server_rec_Key_set_in_Base 1_SetValue PerlAddVar TestModperl__server_rec_Key_set_in_Base 2_AddValue 3_AddValue PerlSetVar TestModperl__request_rec_ZeroKey 0 PerlSetVar TestModperl__request_rec_Key0 SetValue0 PerlSetVar TestModperl__request_rec_Key1 ToBeLost PerlSetVar TestModperl__request_rec_Key1 1_SetValue PerlAddVar TestModperl__request_rec_Key1 2_AddValue PerlAddVar TestModperl__request_rec_Key1 3_AddValue 4_AddValue PerlSetVar TestModperl__server_rec_Key_set_in_Base SubSecValue mod_perl-2.0.9/t/response/TestModperl/endav.pm0000644000104000010010000000324612540623206021767 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::endav; use strict; use warnings FATAL => 'all'; use ModPerl::Global (); use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 4; #just to make sure we dont segv with bogus values my $not = 'NoSuchPackage'; for my $name ('END', $not) { ModPerl::Global::special_list_call( $name => $not); ModPerl::Global::special_list_clear($name => $not); } # register the current package to set its END blocks aside ModPerl::Global::special_list_register(END => __PACKAGE__); # clear anything that was previously set ModPerl::Global::special_list_clear(END => __PACKAGE__); eval 'END { ok 1 }'; # now run them twice:ok 1 (1), ok 1 (2) ModPerl::Global::special_list_call(END => __PACKAGE__); ModPerl::Global::special_list_call(END => __PACKAGE__); ModPerl::Global::special_list_clear(END => __PACKAGE__); #should do nothing ModPerl::Global::special_list_call( END => __PACKAGE__); # this we've already registered this package's END blocks, adding # new ones will set them aside eval 'END { ok 1 }'; # so this will run ok 1 (3) ModPerl::Global::special_list_call( END => __PACKAGE__); ModPerl::Global::special_list_clear(END => __PACKAGE__); ModPerl::Global::special_list_clear(END => __PACKAGE__); #should do nothing ModPerl::Global::special_list_call( END => __PACKAGE__); # one plain ok 1 (4) ok 1; Apache2::Const::OK; } 1; __END__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/env.pm0000644000104000010010000000361612540623206021463 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::env; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 23 + keys(%ENV); my $env = $r->subprocess_env; ok $ENV{MODPERL_EXTRA_PL}; #set in t/conf/modperl_extra.pl ok $ENV{MOD_PERL}; ok $ENV{MOD_PERL_API_VERSION}; ok $ENV{SERVER_SOFTWARE}; ok $env->get('SERVER_SOFTWARE'); { $ENV{FOO} = 2; ok $ENV{FOO} == 2; ok $env->get('FOO') == 2; $ENV{FOO}++; ok $ENV{FOO} == 3; ok $env->get('FOO') == 3; $ENV{FOO} .= 6; ok $ENV{FOO} == 36; ok $env->get('FOO') == 36; delete $ENV{FOO}; ok ! $ENV{FOO}; ok ! $env->get('FOO'); } { local %ENV = (FOO => 1, BAR => 2); ok $ENV{FOO} == 1; ok $env->get('FOO') == 1; ok ! $ENV{SERVER_SOFTWARE}; ok ! $env->get('SERVER_SOFTWARE'); } ok ! $ENV{FOO}; skip "r->subprocess_env + local() doesnt fully work yet", 1; #ok ! $env->get('FOO'); { my $key = 'SERVER_SOFTWARE'; my $val = $ENV{SERVER_SOFTWARE}; ok $val; ok t_cmp $env->get($key), $val, '$r->subprocess_env->get($key)'; ok t_cmp $r->subprocess_env($key), $val, '$r->subprocess_env($key)'; $val = 'BAR'; $r->subprocess_env($key => $val); ok t_cmp $r->subprocess_env($key), $val, '$r->subprocess_env($key => $val)'; } # make sure each key can be deleted for my $key (sort keys %ENV) { eval { delete $ENV{$key}; }; ok t_cmp($@, '', $key); } Apache2::Const::OK; } 1; __END__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/exit.pm0000644000104000010010000000220112540623206021631 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::exit; # there is no need to call ModPerl::Util::exit() explicitly, a plain # exit() will do. We do the explicit fully qualified call in this # test, in case something has messed up with CORE::GLOBAL::exit and we # want to make sure that we test the right API use strict; use warnings FATAL => 'all'; use ModPerl::Util (); use Apache2::Const -compile => 'OK'; use ModPerl::Const -compile => 'EXIT'; sub handler { my $r = shift; $r->content_type('text/plain'); my $args = $r->args; if ($args eq 'eval') { eval { my $whatever = 1; ModPerl::Util::exit(); }; # test whether we can stringify our custom error messages $r->print("$@"); ModPerl::Util::exit if $@ && ref $@ && $@ == ModPerl::EXIT; } elsif ($args eq 'noneval') { $r->print("exited"); ModPerl::Util::exit(); } # must not be reached $r->print("must not be reached"); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/getc.pm0000644000104000010010000000103112540623206021602 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::getc; use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; untie *STDIN; tie *STDIN, $r; while (my $c = getc) { die "got more than 1 char" unless length($c) == 1; $r->puts($c); } untie *STDIN; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModperl/interpreter.pm0000644000104000010010000000440312540623206023231 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::interpreter; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::MPM (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $is_threaded=Apache2::MPM->is_threaded; plan $r, tests => $is_threaded?17:5, need need_threads, {"perl >= 5.8.1 is required (this is $])" => ($] >= 5.008001)}; require ModPerl::Interpreter; require ModPerl::InterpPool; require ModPerl::TiPool; require ModPerl::TiPoolConfig; my $interp = ModPerl::Interpreter->current; ok t_cmp(ref($interp), 'ModPerl::Interpreter', 'interp is a ModPerl::Interpreter'); ok t_cmp($$interp==${ModPerl::Interpreter::current()}, !!1, 'ModPerl::Interpreter->current == ModPerl::Interpreter::current'); my $mip = $interp->mip; ok t_cmp(ref($mip), 'ModPerl::InterpPool', 'interp->mip is a ModPerl::InterpPool'); ok t_cmp(${$mip->server}==${$r->server}, !!1, 'mip->server == r->server'); ok t_cmp(ref($mip->parent), 'ModPerl::Interpreter', 'mip->parent is a ModPerl::Interpreter'); if($is_threaded) { ok t_cmp($interp->perl!=0, !!1, 'interp->perl'); ok t_cmp($interp->num_requests>0, !!1, 'interp->num_requests'); ok t_cmp($interp->refcnt>0, !!1, 'interp->refcnt'); my $tipool = $mip->tipool; ok t_cmp(ref($tipool), 'ModPerl::TiPool', 'mip->tipool is a ModPerl::TiPool'); ok t_cmp($tipool->in_use!=0, !!1, 'tipool->in_use'); ok t_cmp($tipool->size!=0, !!1, 'tipool->size'); my $tipcfg = $tipool->cfg; ok t_cmp(ref($tipcfg), 'ModPerl::TiPoolConfig', 'tipool->cfg is a ModPerl::TiPoolConfig'); ok t_cmp($tipcfg->start!=0, !!1, 'tipcfg->start'); ok t_cmp($tipcfg->min_spare!=0, !!1, 'tipcfg->min_spare'); ok t_cmp($tipcfg->max_spare!=0, !!1, 'tipcfg->max_spare'); ok t_cmp($tipcfg->max!=0, !!1, 'tipcfg->max'); ok t_cmp($tipcfg->max_requests!=0, !!1, 'tipcfg->max_requests'); } Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/io_nested_with_closed_stds.pm0000644000104000010010000000350712540623206026264 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::io_nested_with_closed_stds; # test that we can successfully override STD(IN|OUT) for # 'perl-script', even if they are closed. Here we use # internal_redirect(), which causes a nested override of already # overriden STD streams # in this test we can't use my $foo as a filehandle, since perl 5.6 # doesn't know how to dup via: 'open STDIN, "<&", $oldin' # so use the old FOO filehandle style use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $args = $r->args || ''; if ($args eq 'redirect') { # sub-req $r->content_type('text/plain'); # do not use plan() here, since it messes up with STDOUT, # which affects this test. print "1..1\nok 1\n"; } else { # main-req my $redirect_uri = $r->uri . "?redirect"; # we must close STDIN as well, due to a perl bug (5.8.0 - 5.8.3 # w/useperlio), which emits a warning if dup is called with # one of the STD streams is closed. # but we must restore the STD streams so not to affect other # tests. open OLDIN, "<&STDIN" or die "Can't dup STDIN: $!"; open OLDOUT, ">&STDOUT" or die "Can't dup STDOUT: $!"; close STDIN; close STDOUT; $r->internal_redirect($redirect_uri); open STDIN, "<&OLDIN" or die "Can't dup OLDIN: $!"; open STDOUT, ">&OLDOUT" or die "Can't dup OLDOUT: $!"; close OLDIN; close OLDOUT; } Apache2::Const::OK; } 1; __DATA__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/io_with_closed_stds.pm0000644000104000010010000000347312540623206024724 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::io_with_closed_stds; # test that we can successfully override STD(IN|OUT) for # 'perl-script', even if they are closed. # in this test we can't use my $foo as a filehandle, since perl 5.6 # doesn't know how to dup via: 'open STDIN, "<&", $oldin' # so use the old FOO filehandle style, which is also global, so we # don't even need to pass it around (very bad code style, but I see no # better solution if we want to have this test run under perl 5.6) use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestUtil (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache::Test; use Apache2::Const -compile => 'OK'; sub fixup { my $r = shift; # we must close STDIN as well, due to a perl bug (5.8.0 - 5.8.3 # w/useperlio), which emits a warning if dup is called with # one of the STD streams is closed. open OLDIN, "<&STDIN" or die "Can't dup STDIN: $!"; open OLDOUT, ">&STDOUT" or die "Can't dup STDOUT: $!"; close STDIN; close STDOUT; Apache2::Const::OK; } sub handler { my $r = shift; plan $r, tests => 1; ok 1; Apache2::Const::OK; } sub cleanup { my $r = shift; # restore the STD(IN|OUT) streams so not to affect other tests. open STDIN, "<&OLDIN" or die "Can't dup OLDIN: $!"; open STDOUT, ">&OLDOUT" or die "Can't dup OLDOUT: $!"; close OLDIN; close OLDOUT; Apache2::Const::OK; } 1; __DATA__ PerlModule TestModperl::io_with_closed_stds SetHandler perl-script PerlFixupHandler TestModperl::io_with_closed_stds::fixup PerlResponseHandler TestModperl::io_with_closed_stds PerlCleanupHandler TestModperl::io_with_closed_stds::cleanup mod_perl-2.0.9/t/response/TestModperl/local_env.pm0000644000104000010010000000250712540623206022633 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::local_env; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; # local %ENV used to cause segfaults # Report: http://thread.gmane.org/gmane.comp.apache.mod-perl/22236 # Fixed in: http://svn.apache.org/viewcvs.cgi?rev=357236&view=rev sub handler { my $r = shift; plan $r, tests => 6; my %copy_ENV = %ENV; ## this is not a deep copy; ok t_cmp($ENV{MOD_PERL_API_VERSION}, 2, "\$ENV{MOD_PERL_API_VERSION} is 2 before local \%ENV"); { local %ENV; ok t_cmp($ENV{MOD_PERL_API_VERSION}, undef, "\$ENV{MOD_PERL_API_VERSION} is undef after local \%ENV"); ok t_cmp(scalar keys %ENV, 0, "\%ENV has 0 keys after local"); $ENV{LOCAL} = 1; ok t_cmp($ENV{LOCAL}, 1, "can set value after local, but still in block"); } ok t_cmp($ENV{LOCAL}, undef, "valuee set in local {} block is gone after leaving scope"); ok t_cmp(\%copy_ENV, \%ENV, "\%ENV was restored correctly"); Apache2::Const::OK; } 1; __END__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/merge.pm0000644000104000010010000001501612540623206021767 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::merge; use strict; use warnings FATAL => 'all'; use Apache2::ServerRec (); use Apache2::ServerUtil (); use Apache2::RequestUtil (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; # this is the configuration and handler for t/modperl/merge.t, # t/modperl/merge2.t, and t/modperl/merge3.t. see any of those # tests and/or the below configuration for more details # result tables for the below tests (trying to make the code more # simple...) the hash itself represents a request # the keys to the main hash represent merge levels - 1 for the # non-overriding merge, 2 for an overriding merge, and 3 for a # two-level merge the rest should be self-explanatory - settings and # expected values. our %merge1 = ( 1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'], PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'], PerlSetVar => [MergeSetVar1 => 'SetVar1Val'], PerlAddVar => [MergeAddVar1 => ['AddVar1Val1', 'AddVar1Val2']], }, 2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Val'], PerlSetVar => [MergeSetVar2 => 'SetVar2Val'], PerlAddVar => [MergeAddVar2 => ['AddVar2Val1', 'AddVar2Val2']], }, 3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Val'], PerlSetVar => [MergeSetVar3 => 'SetVar3Val'], PerlAddVar => [MergeAddVar3 => ['AddVar3Val1', 'AddVar3Val2']], }, ); our %merge2 = ( 1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'], PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'], PerlSetVar => [MergeSetVar1 => 'SetVar1Val'], PerlAddVar => [MergeAddVar1 => ['AddVar1Val1', 'AddVar1Val2']], }, 2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Merge2Val'], PerlSetVar => [MergeSetVar2 => 'SetVar2Merge2Val'], PerlAddVar => [MergeAddVar2 => ['AddVar2Merge2Val1', 'AddVar2Merge2Val2']], }, 3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Val'], PerlSetVar => [MergeSetVar3 => 'SetVar3Val'], PerlAddVar => [MergeAddVar3 => ['AddVar3Val1', 'AddVar3Val2']], }, ); our %merge3 = ( 1 => { PerlPassEnv => [APACHE_TEST_HOSTTYPE => 'z80'], PerlSetEnv => [MergeSetEnv1 => 'SetEnv1Val'], PerlSetVar => [MergeSetVar1 => 'SetVar1Val'], PerlAddVar => [MergeAddVar1 => ['AddVar1Val1', 'AddVar1Val2']], }, 2 => { PerlSetEnv => [MergeSetEnv2 => 'SetEnv2Merge3Val'], PerlSetVar => [MergeSetVar2 => 'SetVar2Merge3Val'], PerlAddVar => [MergeAddVar2 => ['AddVar2Merge3Val1', 'AddVar2Merge3Val2']], }, 3 => { PerlSetEnv => [MergeSetEnv3 => 'SetEnv3Merge3Val'], PerlSetVar => [MergeSetVar3 => 'SetVar3Merge3Val'], PerlAddVar => [MergeAddVar3 => ['AddVar3Merge3Val1', 'AddVar3Merge3Val2']], }, ); sub handler { my $r = shift; plan $r, tests => 10; my $uri = $r->uri; my $hash; if ($uri =~ m/(merge3)/) { $hash = $1; } elsif ($uri =~ m/(merge2)/) { $hash = $1; } else { $hash = 'merge1'; } t_debug("testing against results in $hash"); no strict qw(refs); foreach my $level (sort keys %$hash) { foreach my $directive (sort keys %{ $hash->{$level} }) { my $key = $hash->{$level}->{$directive}->[0]; my $value = $hash->{$level}->{$directive}->[1]; my @expected = ref $value ? @$value : $value; my $comment = join ' ', $directive, $key, @expected; if ($directive =~ m/Env/) { my $received = $ENV{$key}; ok t_cmp($received, $expected[0], $comment); } elsif ($directive =~ m/Set/) { my $received = $r->dir_config->get($key); ok t_cmp($received, $expected[0], $comment); } else { my @received = $r->dir_config->get($key); ok t_cmp(\@received, \@expected, $comment); } } } Apache2::Const::OK; } 1; __END__ PerlModule TestModperl::merge # these should pass through all merges untouched PerlPassEnv APACHE_TEST_HOSTTYPE PerlSetEnv MergeSetEnv1 SetEnv1Val PerlSetVar MergeSetVar1 SetVar1Val PerlSetVar MergeAddVar1 AddVar1Val1 PerlAddVar MergeAddVar1 AddVar1Val2 # these are overridden in /merge2 and /merge3 PerlSetEnv MergeSetEnv2 SetEnv2Val PerlSetVar MergeSetVar2 SetVar2Val PerlSetVar MergeAddVar2 AddVar2Val1 PerlAddVar MergeAddVar2 AddVar2Val2 # these are overridden in /merge3 only PerlSetEnv MergeSetEnv3 SetEnv3Val PerlSetVar MergeSetVar3 SetVar3Val PerlSetVar MergeAddVar3 AddVar3Val1 PerlAddVar MergeAddVar3 AddVar3Val2 # same as per-server level SetHandler perl-script PerlResponseHandler TestModperl::merge # overrides "2" values - "1" and "3" values left untouched PerlSetEnv MergeSetEnv2 SetEnv2Merge2Val PerlSetVar MergeSetVar2 SetVar2Merge2Val PerlSetVar MergeAddVar2 AddVar2Merge2Val1 PerlAddVar MergeAddVar2 AddVar2Merge2Val2 SetHandler perl-script PerlResponseHandler TestModperl::merge AccessFileName htaccess # overrides "2" values PerlSetEnv MergeSetEnv2 SetEnv2Merge3Val PerlSetVar MergeSetVar2 SetVar2Merge3Val PerlSetVar MergeAddVar2 AddVar2Merge3Val1 PerlAddVar MergeAddVar2 AddVar2Merge3Val2 SetHandler perl-script PerlResponseHandler TestModperl::merge # override "3" values AllowOverride all mod_perl-2.0.9/t/response/TestModperl/method.pm0000644000104000010010000000176412540623206022155 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::method; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestRequest; use Apache2::Const -compile => 'OK'; sub new { my $class = shift; bless { perl_version => $], }, $class; } sub handler : method { my ($self, $r) = @_; my $tests = 3; my $is_obj = ref($self); if ($is_obj) { $tests += 1; } plan $r, tests => $tests; ok t_cmp(scalar @_, 2, '@_ == 2'); my $class = ref($self) || $self; ok t_cmp($class, $class, 'handler class'); ok t_cmp( $r->uri, '/' . Apache::TestRequest::module2path($class), '$r->uri eq $location'); if ($is_obj) { ok t_cmp($self->{perl_version}, $], 'object handler data'); } Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/methodname.pm0000644000104000010010000000100012540623206022775 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::methodname; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; use TestModperl::method (); #no : method attribute required when -> config syntax is used sub response { TestModperl::method::handler(@_); } 1; __END__ PerlResponseHandler TestModperl::methodname->response mod_perl-2.0.9/t/response/TestModperl/methodobj.pm0000644000104000010010000000060512540623206022641 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::methodobj; use strict; use warnings FATAL => 'all'; use Apache2::Const -compile => 'OK'; use TestModperl::method (); our @ISA = qw(TestModperl::method); 1; __END__ PerlResponseHandler $TestModperl::MethodObj->handler mod_perl-2.0.9/t/response/TestModperl/perl.pm0000644000104000010010000000112012540623206021621 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::perl; # this test includes tests for buggy Perl functions for which mod_perl # provides a workaround use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 1; ok t_cmp("SNXJvM5I.PJrE", crypt("testing", "SNXJvM5I.PJrE"), "crypt"); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/perl_options.pm0000644000104000010010000000341012540623206023400 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::perl_options; # test whether PerlOptions options are enabled use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); my @srv_plus = qw(ChildInit ChildExit Fixup); my @srv_minus = qw(PreConnection ProcessConnection Autoload Log InputFilter OutputFilter); my @dir_plus = qw(ParseHeaders MergeHandlers); my @dir_minus = qw(SetupEnv GlobalRequest); sub handler { my $r = shift; plan $r, tests => @srv_plus + @srv_minus + @dir_plus + @dir_minus; my $s = $r->server; ok t_cmp($s->is_perl_option_enabled($_), 1, "PerlOptions +$_") for @srv_plus; ok t_cmp($s->is_perl_option_enabled($_), 0, "PerlOptions -$_") for @srv_minus; ok t_cmp($r->is_perl_option_enabled($_), 1, "PerlOptions +$_") for @dir_plus; ok t_cmp($r->is_perl_option_enabled($_), 0, "PerlOptions -$_") for @dir_minus; return Apache2::Const::OK; } 1; __DATA__ PerlOptions -PreConnection -ProcessConnection PerlOptions -Autoload -Log -InputFilter -OutputFilter PerlOptions +ChildInit +ChildExit PerlModule TestModperl::perl_options PerlOptions +ParseHeaders SetHandler modperl PerlOptions -GlobalRequest -SetupEnv PerlOptions +MergeHandlers PerlResponseHandler TestModperl::perl_options mod_perl-2.0.9/t/response/TestModperl/perl_options2.pm0000644000104000010010000000257612540623206023476 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::perl_options2; # test whether PerlOptions None works use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK); my @srv = qw( OpenLogs PostConfig ChildInit ChildExit PreConnection ProcessConnection InputFilter OutputFilter PostReadRequest Trans MapToStorage HeaderParser Access Authen Authz Type Fixup Log Cleanup ); sub handler { my $r = shift; plan $r, tests => scalar @srv, skip_reason('PerlOptions None is broken'); my $s = $r->server; ok t_cmp($s->is_perl_option_enabled($_), 0, "$_ is off under PerlOptions None") for @srv; ok t_cmp($s->is_perl_option_enabled('Response'), 1, "Response is off under PerlOptions None"); return Apache2::Const::OK; } 1; __DATA__ PerlOptions None +Response SetHandler modperl PerlResponseHandler TestModperl::perl_options2 mod_perl-2.0.9/t/response/TestModperl/pnotes.pm0000644000104000010010000000722112540623206022177 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::pnotes; use strict; use warnings FATAL => 'all'; use Apache2::RequestUtil (); use Apache2::ConnectionUtil (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; # make it ok to call ok() here while plan()ing elsewhere Apache::Test::init_test_pm($r); Test::_reset_globals() if Test->can('_reset_globals'); $Test::ntest = 1 + (26 * ($r->args - 1)); $Test::planned = 26; my $c = $r->connection; # we call this handler 3 times. # $r->pnotes('request') should be unset each time # $c->pnotes('connection') should be unset the first # time but set the second time due to the keepalive # request. the second request then cleans up after # itself, leaving $c->pnotes again unset at the # start of the third request if ($r->args == 2) { ok t_cmp($c->pnotes('connection'), 'CSET', '$c->pnotes() persists across keepalive requests'); } else { t_debug('testing $c->pnotes is empty'); ok (! $c->pnotes('connection')); } # $r->pnotes should be reset each time t_debug('testing $r->pnotes is empty'); ok (! $r->pnotes('request')); foreach my $map ({type => 'r', object => $r}, {type => 'c', object => $c}) { my $type = $map->{type}; my $o = $map->{object}; t_debug("testing $type->pnotes call"); ok $o->pnotes; ok t_cmp($o->pnotes('pnotes_foo', 'pnotes_bar'), 'pnotes_bar', "$type->pnotes(key,val)"); ok t_cmp($o->pnotes('pnotes_foo'), 'pnotes_bar', "$type->pnotes(key)"); ok t_cmp(ref($o->pnotes), 'HASH', "ref($type->pnotes)"); ok t_cmp($o->pnotes()->{'pnotes_foo'}, 'pnotes_bar', "$type->pnotes()->{}"); # unset the entry (but the entry remains with undef value) $o->pnotes('pnotes_foo', undef); ok t_cmp($o->pnotes('pnotes_foo'), undef, "unset $type contents"); my $exists = exists $o->pnotes->{'pnotes_foo'}; $exists = 1 if $] < 5.008001; # changed in perl 5.8.1 ok $exists; # now delete completely (possible only via the hash inteface) delete $o->pnotes()->{'pnotes_foo'}; ok t_cmp($o->pnotes('pnotes_foo'), undef, "deleted $type contents"); ok !exists $o->pnotes->{'pnotes_foo'}; # test blessed references, like DBI # DBD::DBM ships with DBI... if (have_module(qw(DBI DBD::DBM))) { my $dbh = DBI->connect('dbi:DBM:'); $o->pnotes(DBH => $dbh); my $pdbh = $o->pnotes('DBH'); ok t_cmp(ref($pdbh), 'DBI::db', "ref($type->pnotes('DBH'))"); my $quote = $pdbh->quote("quoth'me"); # see the DBI manpage for why quote() returns the string # wrapped in ' marks ok t_cmp($quote, "'quoth\\'me'", '$pdbh->quote() works'); } else { skip ('skipping $dbh retrival test - no DBI or DBD::DBM'); skip ('skipping $dbh->quote() test - no DBI or DBD::DBM'); } } # set pnotes so we can test unset on later connections $r->pnotes(request => 'RSET'); $c->pnotes(connection => 'CSET'); ok t_cmp($r->pnotes('request'), 'RSET', '$r->pnotes() set'); ok t_cmp($c->pnotes('connection'), 'CSET', '$c->pnotes() set'); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/pnotes2.pm0000644000104000010010000000463312540623207022266 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::pnotes2; use strict; use warnings FATAL => 'all'; use Apache2::Log (); use Apache2::RequestUtil (); use Apache2::ConnectionUtil (); use Apache2::Const -compile => 'OK'; { package TestModerl::pnotes2::x; use strict; use warnings FATAL => 'all'; sub new {shift;bless [@_];} sub DESTROY {my $f=shift @{$_[0]}; $f->(@{$_[0]});} } sub line { our $cleanup; Apache2::ServerRec::warn "pnotes are destroyed after cleanup ".$cleanup; } sub cleanup { our $cleanup; $cleanup='passed'; return Apache2::Const::OK; } sub handler { my $r = shift; our $cleanup; $cleanup=''; $r->push_handlers( PerlCleanupHandler=>__PACKAGE__.'::cleanup' ); if(!defined $r->args) { } elsif($r->args == 1) { $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); } elsif($r->args == 2) { $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); } elsif($r->args == 3) { $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); $r->pnotes(x2 => 2); } elsif($r->args == 4) { $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); $r->pnotes->{x2} = 2; } elsif($r->args == 5) { $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); $r->pnotes->{x2} = 2; } elsif($r->args == 6) { $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); $r->pnotes(x2 => 2); } elsif($r->args == 7) { $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); } elsif($r->args == 8) { $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); } elsif($r->args == 9) { $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); $r->connection->pnotes(x2 => 2); } elsif($r->args == 10) { $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); $r->connection->pnotes->{x2} = 2; } elsif($r->args == 11) { $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line)); $r->connection->pnotes->{x2} = 2; } elsif($r->args == 12) { $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line); $r->connection->pnotes(x2 => 2); } $r->content_type('text/plain'); $r->print("OK"); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/post_utf8.pm0000644000104000010010000000427612540623207022632 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::post_utf8; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::RequestRec (); use Apache2::RequestIO (); use APR::Table (); use TestCommon::Utils (); use Apache2::Const -compile => 'OK'; my $expected_ascii = "I love you, (why lying?), but I belong to another"; my $expected_utf8 = "\x{042F} \x{0432}\x{0430}\x{0441} \x{043B}\x{044E}" . "\x{0431}\x{043B}\x{044E} (\x{043A} \x{0447}\x{0435}\x{043C}\x{0443} " . "\x{043B}\x{0443}\x{043A}\x{0430}\x{0432}\x{0438}\x{0442}\x{044C}?),\n" . "\x{041D}\x{043E} \x{044F} \x{0434}\x{0440}\x{0443}\x{0433}\x{043E}" . "\x{043C}\x{0443} \x{043E}\x{0442}\x{0434}\x{0430}\x{043D}\x{0430};"; sub handler { my $r = shift; # # visual debug, e.g. in lynx/mozilla # $r->content_type("text/plain; charset=utf-8"); # $r->print("expected: $expected_utf8\n"); # utf encode/decode was added only in 5.8.0 # XXX: currently binmode is only available with perlio (used on the # server side on the tied/perlio STDOUT) plan $r, tests => 2, need need_min_perl_version(5.008), need_perl('perlio'); my $received = TestCommon::Utils::read_post($r) || ""; # workaround for perl-5.8.0, which doesn't decode correctly a # tainted variable require ModPerl::Util; ModPerl::Util::untaint($received) if $] == 5.008; # assume that we know that it's utf8 require Encode; # since 5.8.0 $received = Encode::decode('utf8', $received); # utf8::decode() doesn't work under -T my ($received_ascii, $received_utf8) = split /=/, $received; ok t_cmp($received_ascii, $expected_ascii, "ascii"); ok $expected_utf8 eq $received_utf8; # if you want to see the utf8 data run with: # t/TEST -trace=debug -v modperl/post_utf8 # and look for this data in t/logs/error_log # needed for sending utf-8 to STDERR for debug binmode(STDERR, ':utf8'); debug "expected: $expected_utf8"; debug "received: $received_utf8"; Apache2::Const::OK; } 1; __END__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/print.pm0000644000104000010010000000155312540623207022026 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::print; use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 6; binmode STDOUT; #Apache2::RequestRec::BINMODE (noop) ok 1; ok 2; { # print should return true on success, even # if it sends no data. my $rc = print ''; ok ($rc); ok ($rc == 0); # 0E0 is still numerically 0 } { my $rc = print "# 11 bytes\n"; # don't forget the newline ok ($rc == 11); } printf "ok %d\n", 6; Apache2::Const::OK; } END { my $package = __PACKAGE__; warn "END in $package, pid=$$\n"; } 1; mod_perl-2.0.9/t/response/TestModperl/printf.pm0000644000104000010010000000273712540623207022201 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::printf; use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::RequestRec (); use APR::Table (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; my $tests = 4; $r->printf("1..%d\n", $tests); # ok 1 $r->printf("ok"); $r->printf(" %d\n", 1); # ok 2 my $fmt = "%s%s %d\n"; $r->printf($fmt, qw(o k), 2); # ok 3 my @a = ("ok %d%c", 3, ord("\n")); $r->PRINTF(@a); # ok 4 (gets input from the fixup handler via notes) { my $note = $r->notes->get("fixup") || ''; my $ok = $note =~ /\$r->printf can't be called before the response phase/; $r->print("not ") unless $ok; $r->print("ok 4\n"); $r->print("# either fixup was successful at printing to the\n", "# client (which shouldn't happen before the\n", "# response phase), or the note was lost/never set\n") unless $ok; $r->notes->clear; } Apache2::Const::OK; } sub fixup { my $r = shift; # it's not possible to send a response body before the response # phase eval { $r->printf("whatever") }; $r->notes->set(fixup => "$@") if $@; Apache2::Const::OK; } 1; __END__ PerlModule TestModperl::printf PerlFixupHandler TestModperl::printf::fixup mod_perl-2.0.9/t/response/TestModperl/print_utf8.pm0000644000104000010010000000172512540623207022775 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::print_utf8; # testing the utf8-encoded response via a tied STDOUT/perlio STDOUT, # the latter if perl was built with perlio. # see Modperl/print_utf8_2.pm for $r->print # must test against a tied STDOUT/perlio STDOUT. $r->print does the # right thing without any extra provisions use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain; charset=UTF-8'); # prevent warning: "Wide character in print" binmode(STDOUT, ':utf8'); # Apache2::RequestRec::BINMODE() # must be non-$r->print(), so we go through the tied STDOUT # \x{263A} == :-) print "Hello Ayhan \x{263A} perlio rules!"; Apache2::Const::OK; } 1; __DATA__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/print_utf8_2.pm0000644000104000010010000000133212540623207023210 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::print_utf8_2; # testing the utf8-encoded response via direct $r->print, which does the # right thing without any extra provisions. # see print_utf8.pm for tied STDOUT/perlio STDOUT, which requires extra work use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain; charset=UTF-8'); # \x{263A} == :-) $r->print("\$r->print() just works \x{263A}"); Apache2::Const::OK; } 1; __DATA__ SetHandler modperl mod_perl-2.0.9/t/response/TestModperl/readline.pm0000644000104000010010000000102112540623207022443 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::readline; use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::compat (); #XXX use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; untie *STDIN; tie *STDIN, $r; while (defined(my $line = )) { $r->puts($line); } untie *STDIN; Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModperl/request_rec_perlio_api.pm0000644000104000010010000000507112540623207025415 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::request_rec_perlio_api; # this test is relevant only when the PerlIO STDIN/STDOUT are used (when # $Config{useperlio} is defined.) use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache2::RequestRec (); use Apache::Test; use File::Spec::Functions qw(catfile catdir); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->args eq 'STDIN' ? test_STDIN($r) : test_STDOUT($r); return Apache2::Const::OK; } sub test_STDIN { my $r = shift; { # read the first 10 POST chars my $data; read STDIN, $data, 10; print STDOUT $data; } { # re-open STDIN to something else, and then see if we don't # lose any chars when we restore it to the POST stream open my $stdin, "<&STDIN" or die "Can't dup STDIN: $!"; open STDIN, "<", __FILE__ or die "failed to open STDIN as 'in memory' file : $!"; my $data; read STDIN, $data, length("# please"); print STDOUT $data; close STDIN; open STDIN, "<&", $stdin or die "failed to restore STDIN: $!"; } { # read the last 10 POST chars my $data; read STDIN, $data, 10; print STDOUT $data; } } sub test_STDOUT { my $r = shift; local $| = 0; print STDOUT "life is hard "; my $vars = Apache::Test::config()->{vars}; my $target_dir = catdir $vars->{documentroot}, 'perlio'; my $file = catfile $target_dir, "apache_stdout"; # re-open STDOUT to something else, and then see if we can # continue printing to the client via STDOUT, after restoring it open my $stdout, ">&STDOUT" or die "Can't dup STDOUT: $!"; # this should flush the above print to STDOUT open STDOUT, ">", $file or die "Can't open $file: $!"; print STDOUT "and then "; close STDOUT; # flush things that went into the file as STDOUT open STDOUT, ">&", $stdout or die "failed to restore STDOUT: $!"; open my $fh, $file or die "Can't open $file: $!"; local $\; print <$fh>; # cleanup unlink $file; # close the dupped fh close $stdout; print "you die! "; # now close it completely and restore it, without using any dupped # filehandle close STDOUT; open STDOUT, ">:Apache2", $r or die "can't open STDOUT via :Apache2 layer : $!"; print "next you reincarnate..."; } 1; __DATA__ SetHandler perl-script mod_perl-2.0.9/t/response/TestModperl/request_rec_tie_api.pm0000644000104000010010000000333112540623207024701 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::request_rec_tie_api; # this test is relevant only when the tied STDIN/STDOUT are used (when # $Config{useperlio} is not defined.) use strict; use warnings FATAL => 'all'; use Apache2::RequestIO (); use Apache::Test; use Apache::TestUtil; use Apache::TestConfig; use File::Spec::Functions qw(catfile catdir); use Apache2::Const -compile => 'OK'; use Config; sub handler { my $r = shift; require Apache2::Build; my @todo; push @todo, 1 if Apache2::Build::AIX(); plan $r, tests => 3, todo => \@todo, need { "perl $]: PerlIO is used instead of TIEd IO" => !($] >= 5.008 && $Config{useperlio}) }; # XXX: on AIX 4.3.3 we get: # STDIN STDOUT STDERR # perl : 0 1 2 # mod_perl: 0 0 2 my $fileno = fileno STDOUT; ok $fileno; t_debug "fileno STDOUT: $fileno"; { my $vars = Apache::Test::config()->{vars}; my $target_dir = catdir $vars->{serverroot}, 'logs'; my $file = catfile $target_dir, "stdout"; # test OPEN my $received = open STDOUT, ">", $file or die "Can't open $file: $!"; ok t_cmp($received, 1, "OPEN"); # test CLOSE, which is a noop ok $r->CLOSE; close $file; # restore the tie tie *STDOUT, $r; # flush things that went into the file as STDOUT open my $fh, $file or die "Can't open $file: $!"; local $\; print <$fh>; # cleanup unlink $file; } return Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModperl/setauth.pm0000644000104000010010000000112412540623207022341 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::setauth; use strict; use warnings FATAL => 'all'; use Apache2::Access (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 2; ok t_cmp($r->auth_type(), "none", 'auth_type'); t_server_log_error_is_expected(); $r->get_basic_auth_pw(); ok t_cmp($r->auth_type(), 'Basic', 'default auth_type'); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModperl/setupenv.pm0000644000104000010010000002250412540623207022542 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::setupenv; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use APR::Table (); use Apache::Test; use Apache::TestUtil; use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $r = shift; # how many different URIs will be hit? my $requests = $r->args; # $requests locations with 7 tests each plan $r, tests => $requests * 7; return Apache2::Const::OK; } sub env { my $r = shift; Apache::Test::init_test_pm($r); # tie STDOUT (my $value) = $r->uri =~ /TestModperl__setupenv_(\w+)/; ok t_cmp($ENV{REMOTE_ADDR}, Apache::Test::vars('remote_addr'), 'found REMOTE_ADDR in %ENV'); ok t_cmp($ENV{SRV_SUBPROCESS}, 'server', 'found subprocess_env table entry SRV_SUBPROCESS in %ENV'); ok t_cmp($ENV{DIR_SUBPROCESS}, $value, 'found subprocess_env table entry DIR_SUBPROCESS in %ENV'); ok t_cmp($ENV{DIR_SETENV}, $value, 'found per-directory SetEnv entry in %ENV'); ok t_cmp($ENV{SRV_SETENV}, 'server', 'found per-server SetEnv entry in %ENV'); # PerlSetEnv always set ok t_cmp($ENV{DIR_PERLSETENV}, $value, 'found per-directory PerlSetEnv entry in %ENV'); ok t_cmp($ENV{SRV_PERLSETENV}, 'server', 'found per-server PerlSetEnv entry in %ENV'); return Apache2::Const::OK; } sub noenv { my $r = shift; Apache::Test::init_test_pm($r); # tie STDOUT (my $value) = $r->uri =~ /TestModperl__setupenv_(\w+)/; ok t_cmp($ENV{REMOTE_ADDR}, undef, 'REMOTE_ADDR not found in %ENV'); ok t_cmp($ENV{SRV_SUBPROCESS}, undef, 'subprocess_env table entry SRV_SUBPROCESS not found in %ENV'); ok t_cmp($ENV{DIR_SUBPROCESS}, undef, 'subprocess_env table entry DIR_SUBPROCESS not found in %ENV'); ok t_cmp($ENV{DIR_SETENV}, undef, 'per-directory SetEnv entry not found in %ENV'); ok t_cmp($ENV{SRV_SETENV}, undef, 'per-server SetEnv entry not found in %ENV'); # PerlSetEnv always set ok t_cmp($ENV{DIR_PERLSETENV}, $value, 'found per-directory PerlSetEnv entry in %ENV'); ok t_cmp($ENV{SRV_PERLSETENV}, 'server', 'found per-server PerlSetEnv entry in %ENV'); return Apache2::Const::OK; } sub someenv { my $r = shift; Apache::Test::init_test_pm($r); # tie STDOUT (my $value) = $r->uri =~ /TestModperl__setupenv_(\w+)/; ok t_cmp($ENV{REMOTE_ADDR}, Apache::Test::vars('remote_addr'), 'found REMOTE_ADDR in %ENV'); # set before void call ok t_cmp($ENV{SRV_SUBPROCESS}, 'server', 'found subprocess_env table entry one in %ENV'); ok t_cmp($ENV{DIR_SUBPROCESS}, undef, 'subprocess_env table entry DIR_SUBPROCESS not found in %ENV'); ok t_cmp($ENV{DIR_SETENV}, undef, 'per-directory SetEnv entry not found in %ENV'); ok t_cmp($ENV{SRV_SETENV}, undef, 'per-server SetEnv entry not found in %ENV'); # PerlSetEnv always set ok t_cmp($ENV{DIR_PERLSETENV}, $value, 'found per-directory PerlSetEnv entry in %ENV'); ok t_cmp($ENV{SRV_PERLSETENV}, 'server', 'found per-server PerlSetEnv entry in %ENV'); return Apache2::Const::OK; } sub subenv_void { shift->subprocess_env; return Apache2::Const::OK; } sub subenv_one { shift->subprocess_env->set(SRV_SUBPROCESS => 'server'); return Apache2::Const::OK; } sub subenv_two { my $r = shift; (my $value) = $r->uri =~ /TestModperl__setupenv_(\w+)/; $r->subprocess_env->set(DIR_SUBPROCESS => $value); return Apache2::Const::OK; } 1; __DATA__ # create a separate virtual host so we can use # keepalives - a per-connection interpreter is # the only way to make sure that we can plan in # one request and test in subsequent tests KeepAlive On # # PerlInterpScope connection # PerlModule TestModperl::setupenv PerlPostReadRequestHandler TestModperl::setupenv::subenv_one # SetEnv is affected by +SetupEnv SetEnv SRV_SETENV server # PerlSetEnv is not affected by +SetupEnv or -SetupEnv # it is entirely separate and always set if configured PerlSetEnv SRV_PERLSETENV server # plan SetHandler modperl PerlResponseHandler TestModperl::setupenv # default modperl handler # %ENV should not contain standard CGI variables # or entries from the subprocess_env table SetHandler modperl PerlResponseHandler TestModperl::setupenv::noenv PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV mpdefault PerlSetEnv DIR_PERLSETENV mpdefault # modperl handler + SetupEnv # %ENV should contain CGI variables as well as # anything put into the subprocess_env table SetHandler modperl PerlResponseHandler TestModperl::setupenv::env PerlOptions +SetupEnv PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV mpsetup PerlSetEnv DIR_PERLSETENV mpsetup # $r->subprocess_env in a void context with no args # should do the same as +SetupEnv wrt CGI variables # and entries already in the subprocess_env table # but subprocess_env entries that appear later will # not show up in %ENV SetHandler modperl PerlResponseHandler TestModperl::setupenv::someenv PerlHeaderParserHandler TestModperl::setupenv::subenv_void PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV mpvoid PerlSetEnv DIR_PERLSETENV mpvoid # +SetupEnv should always populate %ENV fully prior # to running the content handler (regardless of when # $r->subprocess_env() was called) to ensure that # %ENV is an accurate representation of the # subprocess_env table SetHandler modperl PerlResponseHandler TestModperl::setupenv::env PerlOptions +SetupEnv PerlHeaderParserHandler TestModperl::setupenv::subenv_void PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV mpsetupvoid PerlSetEnv DIR_PERLSETENV mpsetupvoid # default perl-script handler is equivalent to +SetupEnv # CGI variables and subprocess_env entries will be in %ENV SetHandler perl-script PerlResponseHandler TestModperl::setupenv::env PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV psdefault PerlSetEnv DIR_PERLSETENV psdefault # -SetupEnv should not put CGI variables or subprocess_env # entries in %ENV SetHandler perl-script PerlResponseHandler TestModperl::setupenv::noenv PerlOptions -SetupEnv PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV psnosetup PerlSetEnv DIR_PERLSETENV psnosetup # +SetupEnv should always populate %ENV fully prior # to running the content handler (regardless of when # $r->subprocess_env() was called) to ensure that # %ENV is an accurate representation of the # subprocess_env table SetHandler perl-script PerlResponseHandler TestModperl::setupenv::env PerlHeaderParserHandler TestModperl::setupenv::subenv_void PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV psvoid PerlSetEnv DIR_PERLSETENV psvoid # equivalent to modperl handler with $r->subprocess_env() - # CGI variables are there, but not subprocess_env entries # that are populated after the void call SetHandler perl-script PerlResponseHandler TestModperl::setupenv::someenv PerlOptions -SetupEnv PerlHeaderParserHandler TestModperl::setupenv::subenv_void PerlFixupHandler TestModperl::setupenv::subenv_two SetEnv DIR_SETENV psnosetupvoid PerlSetEnv DIR_PERLSETENV psnosetupvoid mod_perl-2.0.9/t/response/TestModperl/setupenv2.pm0000644000104000010010000000632412540623207022626 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::setupenv2; # Test the mixing of PerlSetEnv in httpd.conf and %ENV of the same # key in PerlRequire, PerlConfigRequire, PerlPostConfigRequire and # sections use strict; use warnings FATAL => 'all'; use Apache2::Const -compile => qw(OK OR_ALL NO_ARGS); use Apache2::CmdParms (); use Apache2::Module (); use Apache2::RequestIO (); use Apache2::RequestRec (); my @directives = ( { name => 'MyEnvRegister', func => __PACKAGE__ . '::MyEnvRegister', req_override => Apache2::Const::OR_ALL, args_how => Apache2::Const::NO_ARGS, errmsg => 'cannot fail :)', }, ); Apache2::Module::add(__PACKAGE__, \@directives); # testing PerlLoadModule $ENV{EnvChangeMixedTest} = 'loadmodule'; $ENV{EnvChangePerlTest} = 'loadmodule'; sub MyEnvRegister { register_mixed(); } sub register_mixed { push @TestModperl::setupenv2::EnvChangeMixedTest, $ENV{EnvChangeMixedTest} || 'notset'; } sub register_perl { push @TestModperl::setupenv2::EnvChangePerlTest, $ENV{EnvChangePerlTest} || 'notset'; } sub get_config { my ($self, $s) = (shift, shift); Apache2::Module::get_config($self, $s, @_); } sub handler { my ($r) = @_; my $args = $r->args || ''; $r->content_type('text/plain'); if ($args eq 'mixed') { my @vals = (@TestModperl::setupenv2::EnvChangeMixedTest, $ENV{EnvChangeMixedTest}); # what's the latest env value $r->print(join " ", @vals); } elsif ($args eq 'perl') { my @vals = (@TestModperl::setupenv2::EnvChangePerlTest, $ENV{EnvChangePerlTest}); # what's the latest env value $r->print(join " ", @vals); } else { die "no such case"; } return Apache2::Const::OK; } 1; __END__ # APACHE_TEST_CONFIG_ORDER 950 PerlLoadModule TestModperl::setupenv2 MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf1" TestModperl::setupenv2::register_mixed(); TestModperl::setupenv2::register_perl(); $ENV{EnvChangeMixedTest} = ""; $ENV{EnvChangePerlTest} = ""; MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf2" PerlRequire "@documentroot@/modperl/setupenv2/require.pl" MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf3" PerlConfigRequire "@documentroot@/modperl/setupenv2/config_require.pl" MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf4" PerlModule htdocs::modperl::setupenv2::module MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf5" MyEnvRegister PerlPostConfigRequire "@documentroot@/modperl/setupenv2/post_config_require.pl" MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf6" MyEnvRegister PerlSetEnv EnvChangeMixedTest "conf7" MyEnvRegister SetHandler modperl PerlResponseHandler TestModperl::setupenv2 PerlSetEnv EnvChangeMixedTest "conf8" # Since PerlPostConfigRequire runs in the post-config phase it will # see 'conf8'. And when it sets that value to 'post_config_require' at # request time $ENV{EnvChangeMixedTest} will see the value set by # PerlPostConfigRequire. mod_perl-2.0.9/t/response/TestModperl/status.pm0000644000104000010010000000122712540623207022213 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::status; use strict; use warnings; use Apache2::RequestRec; use Apache2::Const -compile => qw(DECLINED); use ModPerl::Util; use Apache::TestUtil qw(t_server_log_error_is_expected); sub handler { my $rc = shift->args; if ($rc eq 'die' || $rc eq Apache2::Const::DECLINED || $rc =~ m/foo/) { t_server_log_error_is_expected(); } ModPerl::Util::exit if $rc eq 'exit'; die if $rc eq 'die'; return if $rc eq 'undef'; return $rc; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/stdfd.pm0000644000177200010010000000163312540623207020074 0ustar SteveNonepackage TestModperl::stdfd; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache2::Const -compile => 'OK'; sub fixup { my $r = shift; $r->handler($r->main ? 'perl-script' : 'modperl'); return Apache2::Const::OK; } sub handler { my $r = shift; return Apache2::Const::OK if $r->main; my @fds=(fileno(STDIN), fileno(STDOUT)); $r->lookup_uri($r->uri)->run; $r->print("1..2\n"); $r->print((fileno(STDIN)==$fds[0] ? '' : 'not '). "ok 1 - fileno(STDIN)=".fileno(STDIN)." expected $fds[0]\n"); $r->print((fileno(STDOUT)==$fds[1] ? '' : 'not '). "ok 2 - fileno(STDOUT)=".fileno(STDOUT)." expected $fds[1]\n"); return Apache2::Const::OK; } 1; __DATA__ PerlModule TestModperl::stdfd PerlFixupHandler TestModperl::stdfd::fixup PerlResponseHandler TestModperl::stdfd mod_perl-2.0.9/t/response/TestModperl/stdfd2.pm0000644000177200010010000000161112540623207020152 0ustar SteveNonepackage TestModperl::stdfd2; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::SubRequest (); use Apache2::Const -compile => 'OK'; sub fixup { my $r = shift; $r->handler($r->main ? 'perl-script' : 'modperl'); return Apache2::Const::OK; } sub handler { my $r = shift; return Apache2::Const::OK if $r->main; local *STDIN; open STDIN, '<', $INC{'TestModperl/stdfd2.pm'} or die "Cannot open $INC{'TestModperl/stdfd2.pm'}"; scalar readline STDIN for(1..2); my $expected=$.; $r->lookup_uri($r->uri)->run; $r->print("1..1\n"); $r->print(($.==$expected ? '' : 'not '). "ok 1 - \$.=$. expected $expected\n"); return Apache2::Const::OK; } 1; __DATA__ PerlModule TestModperl::stdfd2 PerlFixupHandler TestModperl::stdfd2::fixup PerlResponseHandler TestModperl::stdfd2 mod_perl-2.0.9/t/response/TestModperl/subenv.pm0000644000104000010010000000474612540623207022203 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::subenv; use strict; use warnings FATAL => 'all'; use Apache2::RequestRec (); use APR::Table (); use Apache::Test; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 31; # subprocess_env in void context with arguments does # nothing to %ENV { my $env = $r->subprocess_env; my $key = 'ONCE'; ok_false($r, $key); $r->subprocess_env($key => 1); # void context but with args ok_true($r, $key); ok ! $ENV{$key}; # %ENV not populated yet } # subprocess_env in void context with no arguments # populates the same as +SetEnv { my $env = $r->subprocess_env; my $key = 'REMOTE_ADDR'; ok_false($r, $key); # still not not there yet ok ! $ENV{$key}; # %ENV not populated yet $r->subprocess_env; # void context with no arguments ok_true($r, $key); ok $ENV{$key}; # mod_cgi emulation } # handlers can use a void context more than once to force # population of %ENV with new table entries { my $env = $r->subprocess_env; my $key = 'AGAIN'; $env->set($key => 1); # new table entry ok_true($r, $key); ok ! $ENV{$key}; # shouldn't affect %ENV yet $r->subprocess_env; # now called in in void context twice ok $ENV{$key}; # so %ENV is populated with new entry } { my $env = $r->subprocess_env; # table may have been overlayed my $key = 'FOO'; $env->set($key => 1); # direct call to set() ok_true($r, $key); ok ! $ENV{$key}; # shouldn't affect %ENV $r->subprocess_env($key => undef); ok_false($r, $key); # removed $r->subprocess_env($key => 1); ok_true($r, $key); # reset ok ! $ENV{$key}; # still shouldn't affect %ENV } Apache2::Const::OK; } sub ok_true { my ($r, $key) = @_; my $env = $r->subprocess_env; ok $env->get($key); ok $env->{$key}; ok $r->subprocess_env($key); } sub ok_false { my ($r, $key) = @_; my $env = $r->subprocess_env; ok ! $env->get($key); ok ! $env->{$key}; ok ! $r->subprocess_env($key); } 1; __END__ PerlOptions -SetupEnv mod_perl-2.0.9/t/response/TestModperl/taint.pm0000644000104000010010000000160612540623207022010 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::taint; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestIO (); use Apache2::RequestUtil (); use Apache2::Build (); use Apache2::Const -compile => 'OK'; my $build = Apache2::Build->build_config; sub handler { my $r = shift; my $tests = $build->{MP_COMPAT_1X} ? 4 : 2; plan $r, tests => $tests; ok t_cmp(${^TAINT}, 1, "\${^TAINT}"); eval { ${^TAINT} = 0 }; ok t_cmp($@, qr/read-only/, "\${^TAINT} is read-only"); if ($build->{MP_COMPAT_1X}) { ok t_cmp($Apache2::__T, 1, "\$Apache2::__T"); eval { $Apache2::__T = 0 }; ok t_cmp($@, qr/read-only/, "\$Apache2::__T is read-only"); } Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModperl/util.pm0000644000104000010010000000102012540623207021634 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModperl::util; # Modperl::Util tests use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use ModPerl::Util (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; plan $r, tests => 1; ok t_cmp ModPerl::Util::current_perl_id(), qr/0x\w+/, "perl interpreter id"; Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModules/0000755000104000010010000000000012540623207020336 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestModules/cgi.pm0000644000104000010010000000231212540623207021434 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgi; use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; unless ($ENV{MOD_PERL}) { die "\$ENV{MOD_PERL} is not set"; } unless ($ENV{MOD_PERL_API_VERSION} == 2) { die "\$ENV{MOD_PERL_API_VERSION} is not set"; } if ($CGI::Q) { die "CGI.pm globals were not reset"; } unless ($CGI::MOD_PERL) { die "CGI.pm does not think this is mod_perl"; } my $cgi = CGI->new; my $param = $cgi->param('PARAM'); my $httpupload = $cgi->param('HTTPUPLOAD'); print $cgi->header('-type' => 'text/test-output', '-X-Perl-Module' => __PACKAGE__); if ($httpupload) { no strict; local $/; my $content = <$httpupload>; print "ok $content"; } elsif ($param) { print "ok $param"; } else { print "no param or upload data\n"; } Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions -SetupEnv mod_perl-2.0.9/t/response/TestModules/cgi2.pm0000644000104000010010000000244412540623207021524 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgi2; # this handler doesn't use the :Apache layer, so CGI.pm needs to do # $r->read(...) instead of read(STDIN,...) use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; unless ($ENV{MOD_PERL}) { die "\$ENV{MOD_PERL} is not set"; } unless ($ENV{MOD_PERL_API_VERSION} == 2) { die "\$ENV{MOD_PERL_API_VERSION} is not set"; } if ($CGI::Q) { die "CGI.pm globals were not reset"; } unless ($CGI::MOD_PERL) { die "CGI.pm does not think this is mod_perl"; } my $cgi = CGI->new($r); my $param = $cgi->param('PARAM'); my $httpupload = $cgi->param('HTTPUPLOAD'); $r->print($cgi->header('-type' => 'text/test-output', '-X-Perl-Module' => __PACKAGE__)); if ($httpupload) { no strict; local $/; my $content = <$httpupload>; $r->print("ok $content"); } elsif ($param) { $r->print("ok $param"); } else { $r->print("no param or upload data\n"); } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModules/cgipost.pm0000644000104000010010000000102612540623207022343 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgipost; use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); my $cgi = CGI->new; print join ":", map { $cgi->param($_) } $cgi->param; Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions +GlobalRequest mod_perl-2.0.9/t/response/TestModules/cgipost2.pm0000644000104000010010000000114012540623207022422 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgipost2; # this handler doesn't use the :Apache layer, so CGI.pm needs to do # $r->read(...) instead of read(STDIN,...) use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); my $cgi = CGI->new($r); $r->print(join ":", map { $cgi->param($_) } $cgi->param); Apache2::Const::OK; } 1; __END__ mod_perl-2.0.9/t/response/TestModules/cgiupload.pm0000644000104000010010000000101712540623207022642 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgiupload; use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $cgi = CGI->new; my $file = $cgi->param('filename'); while (<$file>) { print; } Apache2::Const::OK; } 1; __END__ SetHandler perl-script PerlOptions +GlobalRequest mod_perl-2.0.9/t/response/TestModules/cgiupload2.pm0000644000104000010010000000112312540623207022722 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::cgiupload2; # this handler doesn't use the :Apache layer, so CGI.pm needs to do # $r->read(...) instead of read(STDIN,...) use strict; use warnings FATAL => 'all'; use Apache2::compat (); use CGI (); use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; my $cgi = CGI->new($r); local $\; local $/; my $file = $cgi->param('filename'); $r->print(<$file>); Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestModules/include_subreq.pm0000644000104000010010000000451112540623207023701 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::include_subreq; # this test calls a simple response handler, whose output includes a # simple SSI directive, processed by the INCLUDES output filter, which # triggers another response handler, which again returns an SSI # directive, again processed by INCLUDES, which again calls a response # handler # # main # resp => INCLUDES => => client # => 1st => # subreq => INCLUDES => => # response => => # => 2nd => # subreq => # response # # # # here we test whether :Apache perlio (STDOUT) is reentrant, since the test # overrides STDOUT 3 times, recursively. use strict; use warnings FATAL => 'all'; use Apache::TestTrace; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; $r->content_type('text/plain'); my $path_info = $r->path_info || ''; my $uri = $r->uri; debug "uri: $uri, path_info: $path_info"; if ($path_info eq '/one') { $uri =~ s/one/two/; print qq[subreq ok]; } elsif ($path_info eq '/two') { $uri = "/TestModules__include_subreq_dup/three"; #$uri =~ s/two/three/; print qq[is ]; #print "is"; } elsif ($path_info eq '/three') { print "quite "; } else { die "something is wrong, didn't get path_info"; } Apache2::Const::OK; } 1; __END__ # notice that perl-script is used on purpose here - testing whether # :Apache perlio is reentrant (SetHandler modperl doesn't go through # :Apache perlio layer) SetHandler perl-script PerlSetOutputFilter INCLUDES Options +IncludesNoExec # it's silly that we have to duplicate the resource, but mod_include # otherwise thinks we have a recursive call loop PerlSetOutputFilter INCLUDES Options +IncludesNoExec SetHandler perl-script PerlResponseHandler TestModules::include_subreq mod_perl-2.0.9/t/response/TestModules/proxy.pm0000644000104000010010000000403012540623207022052 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestModules::proxy; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache2::ServerRec (); use Apache2::RequestRec (); use Apache2::RequestIO (); my $uri_real = "/TestModules__proxy_real"; use Apache2::Const -compile => qw(DECLINED OK PROXYREQ_REVERSE); sub proxy { my $r = shift; return Apache2::Const::DECLINED if $r->proxyreq; return Apache2::Const::DECLINED unless $r->uri eq '/TestModules__proxy'; my $s = $r->server; my $real_url = sprintf "http://%s:%d%s", $s->server_hostname, $s->port, $uri_real; $r->proxyreq(Apache2::Const::PROXYREQ_REVERSE); $r->uri($real_url); $r->filename("proxy:$real_url"); $r->handler('proxy-server'); return Apache2::Const::OK; } sub response { my $r = shift; $r->content_type('text/plain'); $r->print("ok"); return Apache2::Const::OK; } 1; __END__ Order Deny,Allow Deny from all Allow from @servername@ 2.4.1> Order Deny,Allow Deny from all Allow from @servername@ PerlModule TestModules::proxy PerlTransHandler TestModules::proxy::proxy SetHandler modperl PerlResponseHandler TestModules::proxy::response mod_perl-2.0.9/t/response/TestPerl/0000755000104000010010000000000012540623207017630 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestPerl/api.pm0000644000104000010010000000317612540623207020746 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestPerl::api; # some perl APIs that we need to test that they work alright under mod_perl use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache::TestTrace; use Apache2::Build; use Apache2::Const -compile => 'OK'; sub handler { my $r = shift; # - XXX: with perl 5.6.1 this test works fine on its own, but if # run in the same interpreter after a test that involves a complex die # call, as in the case of t/filter/in_error, which dies inside a # filter, perl gets messed up here. this can be reproduced by # running: # t/TEST -maxclients 1 t/filter/in_error.t t/perl/api.t # so skip that test for now on 5.6 # # - win32 is an unrelated issue plan $r, tests => 2, need { "getppid() is not implemented on Win32" => !Apache2::Build::WIN32(), "getppid() is having problems with perl 5.6" => !($] < 5.008), }; { # 5.8.1 w/ ithreads has a bug where it caches ppid in PL_ppid, # but updates the record only if perl's fork is called, which # is not the case with mod_perl. This results in getppid() # returning 1. A local workaround in the mod_perl source at # the child_init phase fixes the problem. my $ppid = getppid(); t_debug "ppid $ppid"; ok $ppid > 1; # verify that $pid != $ppid t_debug "pid $$"; ok $ppid != $$; } Apache2::Const::OK; } 1; mod_perl-2.0.9/t/response/TestPerl/hash_attack.pm0000644000104000010010000001360612540623207022446 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestPerl::hash_attack; # if the rehashing of the keys in the stash happens due to the hash attack, # mod_perl must not fail to find the previously cached stash entry (response # and fixup handlers in this test). Moreover it must not fail to find # that entry on the subsequent requests. # # the hash attack is detected when HV_MAX_LENGTH_BEFORE_REHASH keys find # themselves in the same hash bucket on splitting (which happens when the # number of keys crosses the threshold of a power of 2), in which case # starting from 5.8.2 the hash will rehash all its keys using a random hash # seed (PL_new_hash_seed, set in mod_perl or via PERL_HASH_SEED environment # variable) # # Prior to the attack condition hashes use the PL_hash_seed, which is # always 0. # # only in 5.8.1 hashes always use a non-zero PL_hash_seed (unless set # to 0 via PERL_HASH_SEED environment variable or compiled without # -DUSE_HASH_SEED or -DUSE_HASH_SEED_EXPLICIT use strict; use warnings FATAL => 'all'; use Apache::TestTrace; use Apache2::Const -compile => 'OK'; use Math::BigInt; use constant MASK_U32 => 2**32; use constant HASH_SEED => 0; # 5.8.2: always zero before the rehashing use constant THRESHOLD => 14; #define HV_MAX_LENGTH_BEFORE_(SPLIT|REHASH) use constant START => "a"; # create conditions which will trigger a rehash on the current stash # (__PACKAGE__::). Relevant for perl 5.8.2 and higher. sub init { my $r = shift; no strict 'refs'; my @attack_keys = attack(\%{__PACKAGE__ . "::"}) if $] >= 5.008002; # define a new symbol (sub) after the attack has caused a re-hash # check that mod_perl finds that symbol (fixup2) in the stash no warnings 'redefine'; eval qq[sub fixup2 { return Apache2::Const::OK; }]; $r->push_handlers(PerlFixupHandler => \&fixup2); return Apache2::Const::DECLINED; } sub fixup { return Apache2::Const::OK; } sub handler { my $r = shift; $r->print("ok"); return Apache2::Const::OK; } sub buckets { scalar(%{$_[0]}) =~ m#/([0-9]+)\z# ? 0+$1 : 8 } sub attack { my $stash = shift; #require Hash::Util; # avail since 5.8.0 debug "starting attack (it may take a long time!)"; my @keys; # the minimum of bits required to mount the attack on a hash my $min_bits = log(THRESHOLD)/log(2); # if the hash has already been populated with a significant amount # of entries the number of mask bits can be higher my $keys = scalar keys %$stash; my $bits = $keys ? log($keys)/log(2) : 0; $bits = $min_bits if $min_bits > $bits; $bits = ceil($bits); # need to add 3 bits to cover the internal split cases $bits += 3; my $mask = 2**$bits-1; debug "mask: $mask ($bits)"; my $s = START; my $c = 0; # get 2 keys on top of the THRESHOLD my $h; while (@keys < THRESHOLD+2) { next if exists $stash->{$s}; $h = hash($s); next unless ($h & $mask) == 0; $c++; $stash->{$s}++; debug sprintf "%2d: %5s, %08x %s", $c, $s, $h, scalar(%$stash); push @keys, $s; debug "The hash collision attack has been successful" if Internals::HvREHASH(%$stash); } continue { $s++; } # If the rehash hasn't been triggered yet, it's being delayed until the # next bucket split. Add keys until a split occurs. unless (Internals::HvREHASH(%$stash)) { debug "Will add padding keys until hash split"; my $old_buckets = buckets($stash); while (buckets($stash) == $old_buckets) { next if exists $stash->{$s}; $h = hash($s); $c++; $stash->{$s}++; debug sprintf "%2d: %5s, %08x %s", $c, $s, $h, scalar(%$stash); push @keys, $s; debug "The hash collision attack has been successful" if Internals::HvREHASH(%$stash); $s++; } } # this verifies that the attack was mounted successfully. If # HvREHASH is on it is. Otherwise the sequence wasn't successful. die "Failed to mount the hash collision attack" unless Internals::HvREHASH(%$stash); debug "ending attack"; return @keys; } # least integer >= n sub ceil { my $value = shift; return int($value) < $value ? int($value) + 1 : int($value); } # trying to provide the fastest equivalent of C macro's PERL_HASH in # Perl - the main complication is that the C macro uses U32 integer # (unsigned int), which we can't do it Perl (it can do I32, with 'use # integer'). So we outsmart Perl and take modules 2*32 after each # calculation, emulating overflows that happen in C. sub hash { my $s = shift; my @c = split //, $s; my $u = HASH_SEED; for (@c) { # (A % M) + (B % M) == (A + B) % M # This works because '+' produces a NV, which is big enough to hold # the intermidiate result. We only need the % before any "^" and "&" # to get the result in the range for an I32. # and << doesn't work on NV, so using 1 << 10 $u += ord; $u += $u * (1 << 10); $u %= MASK_U32; $u ^= $u >> 6; } $u += $u << 3; $u %= MASK_U32; $u ^= $u >> 11; $u %= MASK_U32; $u += $u << 15; $u %= MASK_U32; $u; } # a bit slower but simpler version sub hash_original { my $s = shift; my @c = split //, $s; my $u = HASH_SEED; for (@c) { $u += ord; $u %= MASK_U32; $u += $u << 10; $u %= MASK_U32; $u ^= $u >> 6; $u %= MASK_U32; } $u += $u << 3; $u %= MASK_U32; $u ^= $u >> 11; $u %= MASK_U32; $u += $u << 15; $u %= MASK_U32; $u; } 1; __END__ PerlModule TestPerl::hash_attack PerlInitHandler TestPerl::hash_attack::init # call twice to verify an access to the same hash value after the rehash PerlFixupHandler TestPerl::hash_attack::fixup TestPerl::hash_attack::fixup mod_perl-2.0.9/t/response/TestPerl/signals.pm0000644000104000010010000000411712540623207021631 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestPerl::signals; use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::BuildConfig; use Apache::TestConfig; use Apache2::MPM (); use POSIX qw(SIGALRM); use constant OSX => Apache::TestConfig::OSX; use Apache2::Const -compile => qw(OK); my $mpm = lc Apache2::MPM->show; # signal handlers don't work anywhere but with prefork, since signals # and threads don't mix # moreover "unsafe"-non-POSIX sighandlers don't work under static prefork sub handler { my $r = shift; my $build = Apache2::BuildConfig->new; my $static = $build->should_build_apache ? 1 : 0; my $tests = $static ? 1 : 2; plan $r, tests => $tests, need { "works only for prefork" => ($mpm eq 'prefork') }; # doesn't work under static prefork if (!$static) { if (OSX) { skip "ALRM can't be used on darwin", 0; } else { local $ENV{PERL_SIGNALS} = "unsafe"; eval { local $SIG{ALRM} = sub { die "alarm" }; alarm 2; run_for_5_sec(); alarm 0; }; ok t_cmp $@, qr/alarm/, "SIGALRM / unsafe %SIG"; } } # POSIX::sigaction doesn't work under 5.6.x if ($] >= 5.008) { my $mask = POSIX::SigSet->new( SIGALRM ); my $action = POSIX::SigAction->new(sub { die "alarm" }, $mask); my $oldaction = POSIX::SigAction->new(); POSIX::sigaction(SIGALRM, $action, $oldaction ); eval { alarm 2; run_for_5_sec(); alarm 0; }; POSIX::sigaction(SIGALRM, $oldaction); # restore original ok t_cmp $@, qr/alarm/, "SIGALRM / POSIX"; } else { skip "POSIX::sigaction doesn't work under 5.6.x", 0; } return Apache2::Const::OK; } sub run_for_5_sec { for (1..20) { # ~5 sec my $x = 3**20; select undef, undef, undef, 0.25; } } 1; __END__ mod_perl-2.0.9/t/response/TestUser/0000755000104000010010000000000012540623207017644 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestUser/rewrite.pm0000644000104000010010000000374112540623207021670 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestUser::rewrite; # test here the technique of rewriting the URI namespace and # pushing/changing the query string (args). Note that in this test we # use a custom maptostorage handler so Apache won't complain that we # didn't set r->filename in the core maptostorage handler. the custom # handler simply shortcuts that phase, with the added benefit of # skipping the ap_directory_walk's stat() calls which speeds up the # whole thing. # # an alternative solution is to return Apache2::Const::DECLINED from the trans # handler, in which case map2storage is not required (but it'll do a # bunch of stat() calls then, which you may want to avoid) use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::URI (); use Apache2::Const -compile => qw(DECLINED OK); my $uri_real = "/TestUser__rewrite_real"; my $args_real = "foo=bar&boo=tar"; sub trans { my $r = shift; return Apache2::Const::DECLINED unless $r->uri eq '/TestUser__rewrite'; $r->uri($uri_real); $r->args($args_real); return Apache2::Const::OK; } sub map2storage { my $r = shift; return Apache2::Const::DECLINED unless $r->uri eq $uri_real; # skip ap_directory_walk stat() calls return Apache2::Const::OK; } sub response { my $r = shift; plan $r, tests => 1; my $args = $r->args(); ok t_cmp($args, $args_real, "args"); return Apache2::Const::OK; } 1; __END__ PerlModule TestUser::rewrite PerlTransHandler TestUser::rewrite::trans PerlMapToStorageHandler TestUser::rewrite::map2storage SetHandler modperl PerlResponseHandler TestUser::rewrite::response mod_perl-2.0.9/t/response/TestVhost/0000755000104000010010000000000012540623207020031 5ustar AdministratorsNonemod_perl-2.0.9/t/response/TestVhost/config.pm0000644000104000010010000000350312540623207021635 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestVhost::config; # Test whether under threaded mpms (and not) a vhost with 'PerlOptions # +Parent', can run sections, which call into config again via # add_config(). use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestUtil; use Apache2::RequestUtil (); use APR::Table (); use File::Spec::Functions qw(canonpath catdir); use Apache2::Const -compile => 'OK'; # initialized in t/htdocs/vhost/post_config.pl our $restart_count; # using a different from 'handler' name on purpose, to make sure # that the module is preloaded at the server startup sub my_handler { my $r = shift; plan $r, tests => 2; { my $expected = $r->document_root; my $received = $r->dir_config->get('DocumentRootCheck'); ok t_cmp(canonpath($received), canonpath($expected), "DocumentRoot"); } { ok t_cmp($restart_count, 2, "PerlPostConfigRequire"); } Apache2::Const::OK; } 1; __END__ DocumentRoot @documentroot@/vhost # a new interpreter pool PerlOptions +Parent PerlInterpStart 1 PerlInterpMax 1 PerlInterpMinSpare 1 PerlInterpMaxSpare 1 # use test system's @INC PerlSwitches -I@serverroot@ # mp2 modules PerlRequire "@serverroot@/conf/modperl_inc.pl" # private to this vhost stuff PerlRequire "@documentroot@/vhost/startup.pl" PerlPostConfigRequire "@documentroot@/vhost/post_config.pl" # container is added via add_config # in t/htdocs/vhost/startup.pl mod_perl-2.0.9/t/response/TestVhost/log.pm0000644000104000010010000000454112540623207021154 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package TestVhost::log; # testing that the warn and other logging functions are writing into # the vhost error_log and not the main one. use strict; use warnings; # don't use: # use warnings FATAL => 'all'; # here as it breaks the $SIG{__WARN__} sub test for perl 5.6, though # it works fine with perl 5.8+ use Apache2::RequestUtil (); use Apache2::Log (); use Apache2::ServerRec qw(warn); # override warn locally use File::Spec::Functions qw(catfile); use Apache::Test; use Apache::TestUtil; use TestCommon::LogDiff; use Apache2::Const -compile => 'OK'; my @methods1 = ( '$r->log->warn', '$r->log_error', '$r->warn', '$s->log->warn', '$s->log_error', '$s->warn', ); my @methods2 = ( 'Apache2::ServerRec::warn', 'warn', ); my $path = catfile Apache::Test::vars('documentroot'), qw(vhost error_log); sub handler { my $r = shift; plan $r, tests => 1 + @methods1 + @methods2; my $s = $r->server; my $logdiff = TestCommon::LogDiff->new($path); ### $r|$s logging for my $m (@methods1) { eval "$m(q[$m])"; ok t_cmp $logdiff->diff, qr/\Q$m/, $m; } ### object-less logging # set Apache2::RequestUtil->request($r) instead of using # PerlOptions +GlobalRequest # in order to make sure that the above tests work fine, # w/o having the global request set Apache2::RequestUtil->request($r); for my $m (@methods2) { eval "$m(q[$m])"; ok t_cmp $logdiff->diff, qr/\Q$m/, $m; } # internal warnings (also needs +GlobalRequest) { no warnings; # avoid FATAL warnings use warnings; local $SIG{__WARN__} = \&Apache2::ServerRec::warn; eval q[my $x = "aaa" + 1;]; ok t_cmp $logdiff->diff, qr/Argument "aaa" isn't numeric in addition/, "internal warning"; } # die logs into the vhost log just fine #die "horrible death!"; Apache2::Const::OK; } 1; __END__ DocumentRoot @documentroot@/vhost ErrorLog @documentroot@/vhost/error_log SetHandler modperl PerlResponseHandler TestVhost::log mod_perl-2.0.9/t/user/0000755000104000010010000000000012540623207015206 5ustar AdministratorsNonemod_perl-2.0.9/t/user/README0000644000177200010010000000020612540623207014163 0ustar SteveNoneThis directory contains userspace tests, such as those that excercise non-unit, multiple-API tests, or Apache integration tests, etc. mod_perl-2.0.9/t/user/rewrite.t0000644000104000010010000000064612540623207017062 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use strict; use warnings FATAL => 'all'; use Apache::TestRequest qw(GET_BODY_ASSERT); use Apache::Test; use Apache::TestUtil; my $module = 'TestUser::rewrite'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/t/vhost/0000755000104000010010000000000012540623207015373 5ustar AdministratorsNonemod_perl-2.0.9/t/vhost/config.t0000644000104000010010000000163312540623207017030 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # the handler is configured in modperl_extra.pl via # Apache2::ServerUtil->server->add_config use Apache::Test; use Apache::TestUtil; use Apache::TestRequest 'GET'; my $module = 'TestVhost::config'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); my $res = GET $url; if ($res->is_success) { print $res->content; } else { if ($res->code == 404) { my $docroot = Apache::Test::vars('documentroot'); die "this test gets its configuration added via " . "$docroot/vhost/startup.pl, this could be the cause " . "of the failure"; } else { die "server side has failed (response code: ", $res->code, "),\n", "see t/logs/error_log for more details\n"; } } mod_perl-2.0.9/t/vhost/log.t0000644000104000010010000000054612540623207016346 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use Apache::TestUtil; use Apache::TestRequest 'GET_BODY_ASSERT'; my $module = 'TestVhost::log'; my $url = Apache::TestRequest::module2url($module); t_debug("connecting to $url"); print GET_BODY_ASSERT $url; mod_perl-2.0.9/todo/0000755000104000010010000000000012540623207014732 5ustar AdministratorsNonemod_perl-2.0.9/todo/2.0.60000644000177200010010000000042112540623207013414 0ustar SteveNoneSHOW STOPPERS ==================== - Windows Segfaults [needs windows developer owner, ] - MANIFEST verifications [needs detail, ] - rt.cpan.org PRs [pgollucci, phred, ] NICE TO HAVE ============= - Smolder, https://issues.apache.org/jira/browse/INFRA-1612 [pgollucci, ] mod_perl-2.0.9/todo/api_status0000644000177200010010000001040112540623207015124 0ustar SteveNoneThis file provides the status of the supported API, via the API documentation files. col1 legend ----------- -: not started/unknown +: in process V: done (for 2.0 release) g = gozer at work col2 legend ----------- -: not started/unknown P: post 2.0 (has API to be polished after 2.0 release) V: done completely - the file path is relative to the modperl-docs cvs repository ######################################################### VV src/docs/2.0/api/Apache.pod VV src/docs/2.0/api/Apache/Access.pod VP src/docs/2.0/api/Apache/CmdParms.pod context VV src/docs/2.0/api/Apache/Command.pod VP src/docs/2.0/api/Apache/Connection.pod conn_config VP src/docs/2.0/api/Apache/Const.pod (this will never be complete, fill it in as we go) VV src/docs/2.0/api/Apache/Directive.pod VP src/docs/2.0/api/Apache/Filter.pod The whole TIE interface VV src/docs/2.0/api/Apache/FilterRec.pod VV src/docs/2.0/api/Apache/HookRun.pod VP src/docs/2.0/api/Apache/Log.pod log_pid VV src/docs/2.0/api/Apache/Module.pod VV src/docs/2.0/api/Apache/PerlSections.pod VV src/docs/2.0/api/Apache/Process.pod VV src/docs/2.0/api/Apache/Reload.pod VV src/docs/2.0/api/Apache/RequestIO.pod VP src/docs/2.0/api/Apache/RequestRec.pod allowed_methods allowed_xmethods content_languages (was in mp1, need to implement APR::ArrayHeader ) request_config used_path_info VV src/docs/2.0/api/Apache/RequestUtil.pod VP src/docs/2.0/api/Apache/Response.pod send_error_response send_mmap VP src/docs/2.0/api/Apache/ServerRec.pod addrs lookup_defaults module_config names wild_names VP src/docs/2.0/api/Apache/ServerUtil.pod error_log2stderr VV src/docs/2.0/api/Apache/SubProcess.pod VV src/docs/2.0/api/Apache/SubRequest.pod internal_fast_redirect lookup_dirent VV src/docs/2.0/api/Apache/URI.pod VV src/docs/2.0/api/Apache/Util.pod VV src/docs/2.0/api/ModPerl/Const.pod VV src/docs/2.0/api/ModPerl/Global.pod VV src/docs/2.0/api/ModPerl/Util.pod VV src/docs/2.0/api/APR.pod VV src/docs/2.0/api/APR/Base64.pod VV src/docs/2.0/api/APR/Brigade.pod VP src/docs/2.0/api/APR/Bucket.pod data start VV src/docs/2.0/api/APR/BucketAlloc.pod VV src/docs/2.0/api/APR/BucketType.pod VP src/docs/2.0/api/APR/Const.pod (this will never be complete, fill it in as we go) VV src/docs/2.0/api/APR/Date.pod VV src/docs/2.0/api/APR/Error.pod VV src/docs/2.0/api/APR/Finfo.pod VV src/docs/2.0/api/APR/IpSubnet.pod VV src/docs/2.0/api/APR/OS.pod +V src/docs/2.0/api/APR/PerlIO.pod (convert to use exceptions) VP src/docs/2.0/api/APR/Pool.pod cleanup_for_exec (clean has some win32 problems) VP src/docs/2.0/api/APR/SockAddr.pod equal VP src/docs/2.0/api/APR/Socket.pod bind close connect listen recvfrom sendto VV src/docs/2.0/api/APR/String.pod VV src/docs/2.0/api/APR/Table.pod VP src/docs/2.0/api/APR/ThreadMutex.pod DESTROY lock new pool_get trylock unlock VV src/docs/2.0/api/APR/URI.pod VP src/docs/2.0/api/APR/Util.pod filepath_name_get password_get VV src/docs/2.0/api/APR/UUID.pod ##################### ### other modules ### ##################### VV src/docs/2.0/api/Apache/Status.pod VV src/docs/2.0/api/Apache/SizeLimit.pod VV src/docs/2.0/api/Apache/Resource.pod VV src/docs/2.0/api/Apache/compat.pod VV src/docs/2.0/api/Apache/porting.pod -- src/docs/2.0/api/ModPerl/BuildMM.pod -- src/docs/2.0/api/ModPerl/MM.pod VV src/docs/2.0/api/ModPerl/MethodLookup.pod -- src/docs/2.0/api/ModPerl/PerlRun.pod -- src/docs/2.0/api/ModPerl/Registry.pod -- src/docs/2.0/api/ModPerl/RegistryBB.pod -- src/docs/2.0/api/ModPerl/RegistryCooker.pod -- src/docs/2.0/api/ModPerl/RegistryLoader.pod ################################ ### Other API related things ### ################################ * the following accessors might be turned into read/write (they are readonly at the moment). if you think that should be the case, please document the change and hopefully add a new sub-test. conn_rec: --------- local_addr remote_addr remote_host aborted local_ip local_host ap_directive_t: --------------- next first_child parent filename line_num mod_perl-2.0.9/todo/bugs_apr_ext0000644000177200010010000000231012540623207015432 0ustar SteveNone######################################## # external (non-mod_perl) APR:: issues # ######################################## * As mike chamberlain told me over irc, apr-ext/perlio was faling for him because of the modperl_perl_gensym not being resolved in APR/PerlIO.so. I didn't see that error since on linux by default symbols resolution is lazy and since that part of the api wasn't tested I did see the problem. On MacOSX the loading is RTLD_NOW (non-lazy) so it detects any missing symbols problems immediately. Luckily DynaLoader allows us to force the non-lazy mode by setting an env var: PERL_DL_NONLAZY=1. We need to force this env variable on when building with MP_MAINTAINER=1. I suppose that it should be added to the autogenerated t/TEST and t/SMOKE. and to t/conf/modperl_extra.pl ($ENV{PERL_DL_NONLAZY}=1) so it affects the server-side as well as the client-side (normally env var aren't propogated to the server). * APR::Pool relies on interpreter management function: modperl_interp_unselect. At the moment I've worked around it by defining an empty function in APR.xs. But a cleaner solution is desirable. * modules that we need to add tests for in apr-ext: APR::IpSubnet mod_perl-2.0.9/todo/bugs_build0000644000177200010010000000772212540623207015103 0ustar SteveNone####################### # Build/Startup Issue # ####################### OS Ver Mod Comments ---------------------------------------------------------------------- OpenBSD 2.9 DSO Builds but won't start, with segfaults in the Perl lexer. I wasn't even able to start mp1-dso with the customly built perl (tried 5.6.1 .. 5.9.0) -- the segfault is again in lexer. It seems that the standard OpenBSD perl package has been heavily patched, when the core system perl 5.6.0 package was built, since I can run 'make test' on mp1-dso, but not with a customly built 5.6.0 with the same options. Since 2.9 is no longer supported by OpenBSD, there is no 5.6.1 or higher to try, so at this moment we simply give up on 2.9. We think that the static mp2 build should work just fine (once it's available). AIX 3.3 DSO Works with -berok to ignore linking errors (symbol resolution). Should replace -berok with a proper symbol resolution at linking time, but I had not much success with using this approach (dlopen fails). AIX 4.3.3 DSO reported to work with mod_perl_1.99_12 and Apache 2.0.48/prefork mpm but doesn't start with worker: http://marc.theaimsgroup.com/?t=106894906200003&r=1&w=2 FreeBSD ?? DSO Works with non-threaded perl (4.8-RELEASE-5.2-RELEASE, 6.0-CURRENT) http://marc.theaimsgroup.com/?l=apache-modperl&m=106399870822612&w=2 The following combo is known to work: http://gossamer-threads.com/lists/modperl/modperl/82887 FreeBSD 5.4-RELEASE gcc 3.4.2 perl 5.8.7 WITH ithreads httpd 2.0.54 apr IS THREADED (worker mpm) mod_perl2.0.1 HPUX11i DSO PA-RISC2.0-thread-multi-LP64 hp-ux loire b.11.11 u 9000800 1756907651 unlimited-user license Cannot load .../modules/mod_perl.so into server: Error 0 http://marc.theaimsgroup.com/?t=108325310800002&r=1&w=2 Bill Rowe gives some hints here http://marc.theaimsgroup.com/?l=apache-modperl&m=108334017416318&w=2 Static works OK! * Does not compile with bleedperl (5.9.x) due to modperl_error.c and Perl_croak() on FreeBSD. This is a PERL bug, but p5p and myself, and not sure where the problem is yet. * gcc 4.x and higher compiles break under -Werror [pgollucci volunteers] * AAA changes in httpd break httpd 2.3.x+ (svn trunk) builds terribly on all platforms. * Need to cleanup functions only needed for certain build flavors (perlio/threads/etc) out of lib/ModPerl/WrapXS.pm:$ithread_exports and use the newer, simpler #ifdef technique (see modperl_io_apache_init for an example) * we should stop generating xs/apache_*, at least for a reason that it's incomplete and will be never complete as we don't keep up with changes with ap_/apr_ namespace. Also we don't have the logic to handle cases where functions aren't available on certain platforms. Importing these unavailable functions may cause loading problems on some platforms (aix?). If developers need to import symbols from ap_/apr_ namespace they should use .exp files installed by httpd/apr/aprutil. * we have a dependency check problem when xs/*/*.h use code from xs/modperl_xs*.h, when the latter change 'make' won't rebuild the dependant files * Testing: Need to put Philippe's smoking test into the core -- shouldn't forget to test with perlio enabled and disabled * source_scan won't create Wrap/Foo/Bar.xs if xs/maps/modperl_functions.map defines only a boot section: MODULE=APR::IO PACKAGE=APR::IO BOOT=1 unless there is at least one function added to the .map file http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=100702825506778&w=2 mod_perl-2.0.9/todo/bugs_mp0000644000177200010010000001203712540623207014413 0ustar SteveNone################# # mod_perl bugs # ################# * local %ENV doesn't work, see t/modperl/local_ent. * PerlOptions None needs to be implemented, see t/modperl/perl_options2.t * PerlIOApache_flush() Setting local $| = 0 doesn't work with regular print statements under ModPerl::* http://p6m7g8.net/MP2/84625 http://www.gossamer-threads.com/lists/modperl/dev/85365 [pgollucci volunteers] * $r->rflush doesn't work. see: http://marc.theaimsgroup.com/?l=apache-modperl&m=103847990813285&w=2 I also see a weird behavior where it does sends FLUSH buckets but they all seem to fall through the data, thus not really flushing anything. this can be easily reproduced with MyApache::FilterSnoop. See also http://www.gossamer-threads.com/lists/modperl/dev/84744?search_string=%23%7C%2C%20flushing%2C%20etc;#84743 for a related $| but not the same issue. [pgollucci volunteers] * early pool destruction issues http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=108872944815382&w=2 * PassEnv/SetEnv propogation in section http://www.gossamer-threads.com/archive/mod_perl_C1/dev_F4/%5BMP2_BUG%5D_PerlPassEnv_issues_P70500/ * there was a report about PerlRun leaking memory. the reporter didn't give any more details, but I suspect that it's due to ModPerl::Util::unload_package() which perfectly fits the timing when the leak was introduced (when PerlRun started to use unload_package). Report: http://gossamer-threads.com/lists/modperl/modperl/77162 * most of the xs wrappers print no "Usage: " when wrong args/wrong number of args are passed, would be nice to add the usage message whenever incorrect arguments error is logged. e.g., when APR::URI->parse() gets the wrong first arg (non-pool) it prints: p is not of type APR::Pool at ... whereas it's not so obvious that the function expected the pool object, neither it specifies which ("arg number") of the arguments is wrong. possible solution: add a new field to the map files, which will be used as a usage message whenever an argument error occurs. * 'SetHandler modperl' doesn't reset $|, so if anything turns it on anywhere, it's going to stay that way. Meaning excessive flushing probably causing a performance hit. I've tried to add the code to reset it, but this requires getting a perl interpreter at the early stage and it breaks several filter tests, which has relied before on the coincidence that both the response handler and the filter were run by the same interpreter (in particular this breaks the code where push_handlers() uses a string as a handler, rather a CODE reference, see t/filter/TestFilter/both_str_rec_add.pm, to reproduce the problem, simply s/modperl/perl-script/) * Apache::PerlSection->dump() will not preserve tied'edness. This is handled proprely in Storable, so either switch dump/restore to non-human readable (-0.5) or borrow the same logic to dump/restore tied objects. * Apache::Log compat issues: Apache->warn, Apache::warn, Apache::Server->warn and Apache->Apache::Server->log_error are all doing: s = modperl_global_get_server_rec(); and this function is thread safe only during the startup. possible solutions: 1) enforce that these functions are used only at the server startup 2) require +GlobalRequest, which gives us r->server, now thread safe (though slow). 3) drop them all from the API and move to compat. [remember that Apache::warn is needed for registry scripts to override warn()] For Apache::warn and registry, the solution is to supply GLOBAL::CORE::warn for the current request and get $r inside of it and] Report: Message-ID: Status: Doug, contemplating * see if we can avoid touching environ[] until a fork() from Perl happens * Apache::Status prints a bogus filename via B::CV (e.g. from the test suite) http://localhost:8529/status/perl/APR::Brigade::bootstrap/FUNCTION?cv_dump Subroutine info for APR::Brigade::bootstrap File: xYµ Package: APR::Brigade ... notice the bogus filename. For some reason this problem doesn't exist with APR::Bucket: http://localhost:8529/status/perl/APR::Bucket::bootstrap/FUNCTION?cv_dump I have tested that the bogus filename comes from $obj->FILE in Apache::Stats::cv_file, where $obj is blessed into B::CV. The problem has been noticed with threaded 5.8.1 perl, didn't test any other builds. Apparently it's a known to p5p problem: http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-08/msg00514.html http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-11/msg01126.html Report: http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=106893251911930&w=2 Priority: Low * mpxs_Apache2__RequestRec_GETC in Apache_RequestIO.h is out to be reimplemented similar to read() w/o using the deprecated client_block interface * Segfaults under Apache::Reload (could be uncovering a bug in mp): http://marc.theaimsgroup.com/?t=111145169900002&r=1&w=2 owner: gozer - mod_perl-2.0.9/todo/bugs_registry0000644000177200010010000000117012540623207015643 0ustar SteveNone########################## # Registry specific bugs # ########################## * An open issue with chdir, which is process-scoped. Arthur Bergman has started the work on ex::threads::safecwd, which is discussed here: http://www.perl.com/pub/a/2002/06/11/threads.html?page=2 RegistryLoader: - chdir() needs to be adjusted when RegistryCooker implements it RegistryCooker: - consider not to use $$ in debug tracing. Not all platforms give out a different pid for different threads. - some problems with setting the DEBUG() constant based on the value of Apache->server->dir_config('ModPerl::RegistryCooker::DEBUG') mod_perl-2.0.9/todo/design_notes0000644000177200010010000000557312540623207015447 0ustar SteveNone(dunno where to put it but don't want to lose these design notes, so just land them here for now) Filters: direct C api mapping -------------------- Apache::register_output_filter($filtername, $callback, $filter_type) Apache::register_input_filter($filtername, $callback, $filter_type) filter_type can be one of: Apache::FTYPE_CONTENT Apache::FTYPE_HTTP_HEADER Apache::FTYPE_TRANSCODE Apache::FTYPE_CONNECTION Apache::FTYPE_NETWORK $r->add_output_filter($name, $ctx) $c->add_output_filter($name, $ctx) $r->add_input_filter($name, $ctx) $c->add_input_filter($name, $ctx) note: $ctx will default to NULL Filters: directives ---------- PerlInputFilterHandler PerlOutputFilterHandler each will be the equivalent of: ap_register_{input,output}_filter($handler_name, $handler, $filter_type) where: $handler_name is the Perl name, at the moment is "MODPERL_OUTPUT" and "MODPERL_INPUT", would be easy to switch that to the handler name $handler is the modperl C callback $filter_type defaults to AP_FTYPE_CONTENT, subroutine attributes can be used to specify the filter_types list above based on attributes, add_{input,output}_filter may need to happen at different times, e.g. input filters who want to filter headers + content vs. input filters who want to filter only content alternative to those directives would be: PerlInputFilter PerlOutputFilter combined with: SetInputFilter SetOutputFilter pros: can use Perl{Input,Output}Filter to register the filter in httpd.conf, rather than using the API. can then call $r->add_{input,output}_filter($filter_name) at request time cons: in the common case, requires two directives that use the same values (the $handler_name) - and/or - PerlSetInputFilter PerlSetOutputFilter as aliases for SetInputFilter, SetOutputFilter which also take care of filter registration (which PerlInputFilter, PerlOutputFilter would have done) pros: similar to Set{Input,Output}Filter only need to use one directive cons: the filter module needs to register the filter in order to add the filter at request time without using a directive however: PerlModule Apache::FooFilter where Apache::FooFilter registers the filter, can provide this functionality without requiring new Perl{Input,Output}Filter directives - in any case - with the C api mapping it should be possible for a PerlModule to register the filter(s), then use the standard Set{Input,Output}Filter directives and the add_{input,output}_filter api at request time. note: no need to maintain a list of PerlFilters (like PerlModule, PerlRequire) since the directives trigger modperl_handler_new(), just like all other Perl*Handlers Filters: {get,set,push}_handlers ----------------------- would be nice for Perl{Input,Output}FilterHandler to work with the modperl {get,set,push}_handlers api just like other Perl*Handlers mod_perl-2.0.9/todo/docs0000644000177200010010000000006712540623207013707 0ustar SteveNonedocs todo is located at modperl-docs/src/docs/2.0/TODO mod_perl-2.0.9/todo/features_deprecated0000644000177200010010000000164212540623207016755 0ustar SteveNonethese features with either: a) never be in 2.0 b) only be in #ifdef MP_DEPRECATED c) be a form that was nothing like 1.xx (e.g. Apache::Leak) d) split off into something standalone on cpan - MaxModPerlRequestsPerChild - $r->seqno, $r->sent_header, $r->query_string, $r->basic_http_header, $r->new_read, $r->write_client, $r->read_client_block, $r->translate_name - $r->content, $r->args in-a-list-context (exist in Apache::compat) - $Apache::Server::Starting, $Apache::Server::ReStarting - modules: + Apache::SIG: dead + Apache::Symbol: unknown + Apache::Leak: could be made useful + Apache::RedirectLogFix: dead + Apache::Include: was just an example + Apache::Debug: could be make useful + Apache::FakeRequest: should be built in + Apache::httpd_conf: dead (to be replaced by new test framework) + Apache::Symdump: unknown + Apache::Opcode: was experimental, needs much attention to be useful mod_perl-2.0.9/todo/features_maybe0000644000177200010010000001614512540623207015756 0ustar SteveNone######################### # Nice to have features # ######################### * If Apache::SubRequest::DESTROY gets invoked more than once on the same object (directly and indirectly via object's exit of scope), memory gets corrupted and some later unrelated requests get affected badly (segfaults in unrelated areas). So we probably need to do the same handling as APR::Pool, where we make sure that no matter how DESTROY is called, it's always called only once, any consequent calls can be made a NOP or assert. BTW, it's easy to reproduce the problem, by simply calling $subrequest->DESTROY 3 times or so in a raw, the server just hangs... * 'apachectl configtest' will not test perl modules, unless section or PerlLoadModule has happeneded to be loaded (since by default we start perl in the post-config phase. A possible solution is to try to detect 'apachectl configtest' and force the interpreter loading during the config phase, so that configtest will actually work for mp2 too. there is also an opinion that there is no problem, and configtest just checks the config file syntax. But the problem is that users might be mislead and think that it tests modperl too, and when doing a restart it may fail, even though configtest said it's OK. * PerlPreConnectionHandler is implemented, but the 'void *csd' arg in the callback is ignored. will require a modification of modperl_callback_run_handlers to pass yet another optional argument. Status: most likely nobody will ever want to use this option, so don't waste time working on it. * Apache::FakeRequest: since APR can be used outside of httpd, and we can alloc request_rec and similar structures, it should be possible to bootstrap an inside-httpd interface and outside-httpd interface. its not really worthwhile looking at until APR actually installs its *.so or *.a libraries somewhere apxs can find them. and, there's a bunch of util functions (e.g. URI stuff) that is supposed to move from httpd into apr-util. * could add support for embedding apache directives into perl directives values, e.g. interpolating $ServerRoot PerlSwitches -I$ServerRoot/lib/perl * Since now we have protocol modules, it'd be nice to have a similar thing to PerlCleanupHandler, which works only for HTTP requests. It should probably be called PerlConnectionCleanupHandler. If we add it we should probably rename PerlCleanupHadndler to PerlRequestCleanupHandler and keep the old name as a deprecated alias. We could also have PerlServerCleanupHandler, but that's exactly what PerlChildExitHandler does. Consider having ServerCleanup as an alias. config features: ---------------- - tie %ENV to r->subprocess_env so stores are added to r->subprocess_env and fetches are looked up in there and elsewhere (e.g. HTTP_* from r->headers_in). see modperl_env.c, current implementation is not threadsafe and requires 5.7.2+ - make 'PerlSetVar $Foo value' work like 'local $Foo = value' for the given location - allow Perl*Handler's to have arguments in config files - allow configuration sections to have read access to internal configuration structures (would be nice if we could tie a %namespace::) - setuid/gid before running any Perl code - implement PerlINC (or similar) as a nicer interface for the working PerlSwitches -Mlib=/home/dev1/lib/perl, to set different @INC for different virtual hosts. See the thread: http://marc.theaimsgroup.com/?t=100554858800001&r=1&w=2 - a possible implementation of PerlOptions +Inherit, similar to +Parent but which allows virtual hosts to inherit everything that was loaded by the main server, at the point of their definition in the config file. This can make it easier to write configuration files where there is a common base of modules to be loaded in all servers. Of course this can be done by putting all these common modules and code into foo.pl and running it from the base server and all virtual hosts. - PerlModule can be made more efficient using Perl_load_module Status: it's possible to implement, but currently there is no way to prevent from Perl logging the loading error messages to the console http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-03/msg00319.html perl language features: ---------------------- - @ARGV magic, tie to query string - sub handler : method ($) {} call $class->new($r) and pass the returned object as the first and only arg to the method handler - some mod_perlIO/PerlIO type methods for xs modules? (e.g. Apache::Peek) - possible to support BEGIN,CHECK,INIT blocks similar to how END is supported via ModPerl::Global::special_list_{call,clear} optimization features: --------------------- - copy-on-write SvPVX - hook Perl malloc into apr_pool - for "compiled handlers" w/ ithreads manage SV allocation via server-lifetime apr_pool_t - "garbage collector" thread to walk padlists looking for certain things worth releasing. - "mip manager" thread to watch # of active interpreters, cloning/destroying when needed (rather than waiting for a request to trigger) - use subpools per-callback/handler (might trim some memory bloat) note: creating subpools requires a malloc mutex lock with threaded mpms api: --- - improve the "stacked handlers" implementation, including: + allow push_handlers to have an additional argument, an array ref, which will be passed to the handler as arguments, e.g. $r->push_handlers("PerlHandler", \&some_sub, ['one', 'two', 'etc']); - might add an alias for $filter->connection (now we have $filter->c), to be more intuitive since we have $r->connection. modules: ------- - core Apache::SubProcess w/ proper CORE::GLOBAL::{fork,exec} support + currently works only with $] >= 5.007003 (see the apache/subprocess test) - It's possible that we will add: #ifdef MP_APACHE_COMPAT modperl_require_module("Apache::compat"); #endif if MP_APACHE_COMPAT Makefile.PL option is true. But this adds bloat, so this is just an option to consider. - Apache::File->tmpfile now lives only in compat. Consider adding APR::File->mktemp (apr_file_mktemp) and a perlio layer defined in terms of apr_file_t to use it. - Apache::MethodList was implemented but was not usefull enough. Thread: http://marc.theaimsgroup.com/?t=109269086600003&r=1&w=2 Patch: http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=109278475112976&q=p6 new modules: ----------- - apache.pm: use apache '1.3b3'; misc new stuff: -------------- - 'make html' - 'make test_report' apache features that would be neat for mod_perl: ----------------------------------------------- - "autoload" hook for configuration directives tools that may help us develop/maintain mp2 ------------------------------------------- - B::Xref - gcov: test code coverage http://apr.apache.org/coverage/index.html http://gozer.ectoplasm.org/mod_perl/coverage/report.html - valgrind (currently valgrind chokes when running apache, long before we get to mod_perl). I've heard that we could use some special #define controls to tell valgrind where to look and where not. - gprof - lxr - tinderbox mod_perl-2.0.9/todo/features_missing0000644000177200010010000001116312540623207016325 0ustar SteveNone######################## # mp1 missing features # ######################## ### try to get this first post 2.0 release ### * mp2 test suite opens many files - quite a few failure reports were due to the low shell file limit. But at the moment we can't tell users why this have the problem. Gisle Aas has suggested that we check whether the shell has a big enough setting for this limit and either die explaining the situation or try to manually raise the limit. http://thread.gmane.org/gmane.comp.apache.mod-perl/16154 once implemented this should be ideally abstracted to be usable by Apache-Test, and have a hook so each project can specify its own min files limit, so other projects can benefit too. * directive handlers are supported but need some work for 1.x compat - Apache::CmdParms::{GETC,getline} needs compat mapping, similar to what Apache::Directive->as_string does, but one char or line at a time - Automatic setting of cmd_args in @APACHE_MODULE_DIRECTIVE based on function prototype * $r->child_terminate: - Apache has no API for this (used to be ap_child_terminate). The current solution is not ideal. Better trying to get ap_child_terminate back in the httpd API. - future ideas for threaded mpms: might consider knocking off the current PerlInterpreter instead. * tied filehandle interface: -EOF, TELL, SEEK -READLINE - proper implementation (see comment in Apache::compat) need to attempt to fix that interface so it'll work with IPC::Open* family * It'd be nice to have PAUSE and the clients support packages with several versions, like mod_perl 1.0 and mod_perl 2.0, since once we release it any dependency on mod_perl will be resolved as mod_perl 2.0, when mod_perl 1.0 may be required instead. owner: stas: talked to autrijus, he will start working on it, but not sure when. we need to ping him every so often. but it'll probably won't happen by the time we release 2.0. ### other, less important things ### * Integrate the new perl feature: PL_use_safe_putenv (starting from perl 5.8.6) http://public.activestate.com/cgi-bin/perlbrowse?patch=23529 this is needed to make it possible mod_php and mod_perl run at the same time. Relevant threads: http://www.gossamer-threads.com/lists/perl/porters/187753 http://www.phpbuilder.com/lists/php-install/2003092/0018.php at the moment recompiling perl with -DPERL_USE_SAFE_PUTENV may or may not work * $r->last is missing (it was provided explicitly by modperl, it's not an apache thing) see modperl/src/modules/perl/Apache.xs * automate generation of xs/tables/current/apr/FunctionTable.pm via Apache::ParseSource. This file contains a subset of functions appearing in ModPerl::FunctionTable that are needed when building APR.so, and is used when generating the def/exp files on Win32/AIX. * Apache::PerlSections missing features for backwards compatibility: - $Apache::ReadConfig::DocumentRoot - Apache::PerlSections->store(filename) Report: Philippe M. Chiasson Status: Philippe M. Chiasson is working on it * PerlOpCodeMask (experimental in 1.xx) * die 404 (consider deprecating it) * mod_perl::import - Apache->import: required for exit/warn overridding - use mod_perl2 qw(2.0 MethodHandlers Authen Authz [...]); used to be able to specify what optionnal feature were required * Apache::test: tobe a compat stub around new test framework * Apache::src: tobe a compat stub around new build framework * hooks ordering is not implemented yet Owner: geoff * $r->finfo: need apr_finfo_t <-> struct stat conversion (might already be there, haven't looked close enough yet) * $r->chdir_file: not safe for threaded environments. should at least unshift @INC with dirname $r->filename. consider overriding open() to resolve relative filenames. * size_string() - can we use apr_strfsize ? * $r->send_fd: need to figure out howto map PerlIO <-> apr_file_t at the moment $r->send_fd is implement in Apache::compat, functions, but does not have the performance benefits of ap_send_fd() however, $r->sendfile is a new function that opens the file for you and calls ap_send_fd() underneath. ap_send_fd() in APR doesn't work with fd's which aren't files and of unknown length, therefore it cannot be used for implementing 1.x compatible send_fd. Solution: send_fd will require the length argument and there will be no send_fd without the length argument as in mp1 Owner: stas * Apache::Debug: Possibly work it differently, but certainly add support for dealing with $^M Report: http://gossamer-threads.com/lists/modperl/modperl/77853 mod_perl-2.0.9/todo/features_new0000644000177200010010000000320012540623207015436 0ustar SteveNone####################### # New features in mp2 # ####################### * extend add_config to support add_config($multi_line_config). If the passed argument is not a ref to an array, but a scalar should use CR?LF to do the line split * PerlFooHandler -Bar is a NOOP when 'PerlOptions AutoLoad' is in effect, whereas it should prevent autloading. See: modperl_handler_new in modperl_handler.c modperl_hash_handlers in modperl_mgv.c * filters tie handle/perlio interface both input/output filters should provide a tiehandle and/or perlio interface. Perl tiehandle methods include the following, '+' indicates must have, '-' indicates not possible / doesn't make sense (though might require noop stubs), '~' indicates would be nice if possible, '?' indicates unsure: + TIEHANDLE + PRINT + PRINTF + WRITE + READLINE + GETC + READ + CLOSE ? UNTIE ? DESTROY + BINMODE (noop) ? OPEN ~ EOF - FILENO ~ SEEK ~ TELL * maybe functions in xs/maps/(apache|apr)_functions.map * Apache->request: need to deal with subclass objects which are not a request_rec (e.g. HASH ref) Owner: gozer * Apache::SizeLimit o Need to work out the details of the implementation of the garbage collection thread for the threaded mpms as originally suggested by doug. The issue with threads is that there is no way to know the thread's size, can we use B::Size and B::TerseSize? prefork: Apache::SizeLimit - done Apache::GTopLimit - Owner: stas threaded: Garbage Collector thread => Ideally the tools should work transparently with threaded and non-threaded mpms, but how? mod_perl-2.0.9/todo/features_optimization0000644000177200010010000000272412540623207017405 0ustar SteveNone############################################### # working features but requiring optimization # ############################################### * all autogenerated xs methods that return char * are now using sv_setpv() which always copies the string. See if we somehow can avoid the copy. If we do so, we need to be careful with method which take a pool argument, such as: Apache::ServerUtil - mpxs_Apache2__ServerUtil_server_root_relative Apache::URI: - ap_construct_server - ap_construct_url APR::URI - mpxs_apr_uri_parse Apache::Util - ap_ht_time - escape_path for which we need to attach the pool object used to create those strings as a magic. * optimize modperl_callback_current_callback_(set|get) to use numerical equivalents of the phase names, instead of doing expensive memory allocs and string comparison operations. And only give the real string in the perl get API. * consider using the temp pool for things that are needed only during the configuration and can be dropped before the actual serving is started. that pool gets destroyed right after the post-config phase is over. * currently when ithreads-enabled perl is used anon-sub handlers are always deparsed and non-cached. there are several cases when this can be optimized. See modperl_handler_new_anon in modperl_handler.c * modperl_package_unload() and modperl_xs_dl_*() share some duplicated logic. The managment of DynaLoaded modules could be somewhat cleaner. mod_perl-2.0.9/todo/features_registry0000644000177200010010000000764612540623207016537 0ustar SteveNone##################### # Registry Features # ##################### - port Apache::PerlRunXS - replace the local implementation of finfo() when ported to mod_perl 2.0 - $r->chdir_file is not handled/implemented, see todo/api.txt unsafe! - $Apache::Server::CWD doesn't exist - need to figure out what's happening with ModPerl::Registry::MarkLine, why it's not on by default? - a cousin of convert_script_to_compiled_handler() in 1.x used to have 'undef &{"$o->[PACKAGE]\::handler"}' to avoid redefine handler() warnings in case a user has used -w. also see the undef_functions on the next line. - child_terminate is not implemented see convert_script_to_compiled_handler(). - print STDERR is buffered in test handlers, whereas warn() works normally. select() helps, but STDERR should be unbuffered in first place. - in namespace_from_filename() should test whether a file is a symlink and if so use readlink() to get the real filename. - documentation - acl support via 'filetest qw(access)'. It was decided that having this feature by default will be too expensive, because of the overhead it adds. The solution was to add a sub-class that will provide that functionality. It wasn't decided whether it'll be in the core or should live on CPAN. Also it wasn't decided whether RegistryCooker should provide the necessary implementation callbacks. See: http://marc.theaimsgroup.com/?t=107636627000001&r=1&w=2 ### optimizations ### - currently the default is to strip __DATA__|__END__ and everything after that, which incurs a little overhead because of the s/// on the contents of the file. This "feature" wasn't in 1.x, so may consider to make it optional. ### nice to have ### - Bjarni R. Einarsson has suggested this Registry hack http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=98961929702745&w=2 Message-ID: <20010511221101.A20868@diskordiah.mmedia.is> - the closure issue: there was a suggestion from raptor to use goto() to leave the code unwrapped in the sub handler, which will solve the closure problem, but the problem is that once you leave a subroutine with goto() you cannot return, because you aren't in the sub anymore. barrie has suggested a different approach, which requires adding special tags to the script which help to parse the code, and shuffle things around without putting subs inside the 'sub handler', but this requires a lot of code understanding from a user, and if its gained it's probably easier to fix the script so closure effect won't happen. However barrie's suggestion can be easily added, by overriding convert_script_to_compiled_handler(). - global variables persistance: could have the cooker option to flush globals in the autogenerated package at the end of each request. (not packages use()'d from this package) - could also try to privide an optional workaround for the problem with libs collisions as explained here: http://perl.apache.org/docs/1.0/guide/porting.html#Name_collisions_with_Modules_and - It's a known kludge with mod_perl scripts coming from mod_cgi which use -M for file mtime comparisons, but are not aware of the fact that $^T is not getting reset on each request. So may be the cooker should have an option to reset $^T on each request. - develop a cooker() that cooks/modifies a registry package based on PerlSetVar variables. So for example a user can modify a behavior of an existing package (stat/donotstat...) and giving it a new name at the same time. Kinda flag-based inheritance. * protect registry classes from bad scripts which try to assassinate $r Report: http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=106153785129782&w=2 Status: (stas) i'm not sure whether we really need this feature, since it's the first time in the last 6 years we had a problem with bad user code of this kind. let's keep it in the patches until we have a real need for it. Priority: very low mod_perl-2.0.9/todo/README0000644000177200010010000000024712540623207013714 0ustar SteveNonethis directory contains notes on whats left to be done: release - showstopper issues for mod_perl 2.0 release features_* - bugs_* - docs - docs todo mod_perl-2.0.9/todo/release0000644000177200010010000000346512540623207014404 0ustar SteveNone################################################## # Things to be resolved for mod_perl 2.0 release # ################################################## -- see also todo/api_status -- see also todo/release-checklist someone has asked to make $r->request_time settable ------------- The following items need more work in order to work with blead-perl: http://svn.apache.org/viewcvs?rev=209859&view=rev perl blead fix: in 5.9.3 HvPMROOT was completely removed, temporary using Perl_Imodglobal_ptr(thx)))->xmg_magic (which fails on perl_clone from ithreads, but otherwise works). this must be replaced with a better solution once we find it. http://svn.apache.org/viewcvs?rev=209861&view=rev blead perl temp fix: some recent change introduced tainting problems, will remove the workaround once blead perl is fixed ------------- MP_STATIC_EXTS=1 must link all extensions but APR.so. At the moment the following are not linked: APR/Const.so APR/PerlIO.so Apache/Const.so ModPerl/Const.so owner: ??? note: when testing MP_STATIC_EXTS=1 build we must ensure that there is no preinstalled mod_perl2. Since if there is a preinstall of a normal build, MP_STATIC_EXTS=1 will be not properly tested, as the preinstalled .so modules will be loaded. A potential solution: when MP_STATIC_EXTS=1 is used change .pm files not to load the .xs extensions! ------------- When running as root and A-T figures it can't run the test suite (perms) it'll ask users if she wants to skip the test suite, if this happens: Skip the test suite? [No] yes Skipping the test suite execution, while returning success status cd ModPerl-Registry && make test she gets to run the registry test suite anyway, since the top level test suite was successful (needed to make cpan/plus installers happy). Not sure what's the best solution here. --------------- mod_perl-2.0.9/todo/tests_issues0000644000177200010010000000244012540623207015511 0ustar SteveNone###################################### # test suite issues and improvements # ###################################### - As the number of tests grows it takes longer to start the test suite. Under threaded mpms it can take a very long time on a loaded machine (10 minutes and more). At the moment we keep on bumping the startup timeout, but there is always someone with a slower/more loaded machine, for whom this timeout is too low, and the tests suite misleadingly fails to start. So may be we must start thinking to split the existing test suite into several smaller suites (for example we already have a separate ModPerl-Registry test suite). If we do perl/ithreads* and any tests definging +Clone/+Parent tests should definitely be moved out from the main suite, as they cause the biggest overhead (due to perl_clone). - TestDirective::perlloadmodule6 should be the first perlloadmodule test to run, so we can test how mod_perl starts from vhost (there was a segfault before). But since other tests define PerlSwitches TestDirective::perlloadmodule6 must be configured afer them. so if we introduce new tests suites, this test needs to be moved there (may be its own test suite or co-existing with other tests which don't use PerlSwitches and trigger early server startup. mod_perl-2.0.9/todo/tests_wanted0000644000177200010010000000122012540623207015453 0ustar SteveNone################# # wanted tests # ################# - test that we properly set the error-notes tably entry on HTTP_INTERNAL_SERVER_ERROR (is sub-request check REDIRECT_ERROR_NOTES) o test with plain handlers o test with registry (as we set it twice? once in registry and once more in the handlers?) mp1 has some sort of related test in t/net/perl/server_error.pl: my $note = $r->prev->notes('error-notes') - We can put Apache::Scoreboard to a good use for Apache::Test. For example we can test with it Apache::SizeLimit or Apache::Watchdog::RunAway, since both kill processes, and we need to make sure that the process went away. mod_perl-2.0.9/util/0000755000104000010010000000000012540623207014742 5ustar AdministratorsNonemod_perl-2.0.9/util/apr_arg_check.pl0000644000104000010010000000220112540623207020042 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use lib qw(lib); use strict; use Apache2::FunctionTable (); #utility for checking apr_ argument conventions my $tx = '_t\s*\*+'; for my $entry (@$Apache2::FunctionTable) { my $name = $entry->{name}; my $args = $entry->{args}; next unless @$args and $name =~ /^apr_/; my $has_type_arg = 0; for my $arg (@$args) { my $type = $arg->{type}; next unless $type =~ s/$tx$//o; $has_type_arg = $name =~ /^\Q$type/; } next unless $has_type_arg; my $i = 0; for my $arg (@$args) { $i++; my $type = $arg->{type}; $type =~ s/$tx//o; if ($name =~ /^\Q$type/) { last if $i == 1; } else { next; } if ($i > 1) { print "'$arg->{name}' should be the first arg:\n"; print " $entry->{return_type}\n $name(", (join ', ', map "$_->{type} $_->{name}", @$args), ")\n\n"; } } } mod_perl-2.0.9/util/apr_pool_check.pl0000644000104000010010000000272312540623207020253 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- #check which apr_ functions do not have access to a pool use lib qw(lib); use strict; use Apache2::SourceTables (); my($functions, @nopool); #incomplete types (C::Scan only scans *.h, not *.c) we know have an apr_pool_t my %private = map { $_, 1 } qw{ apr_dir_t apr_file_t apr_dso_handle_t apr_hash_t apr_hash_index_t apr_lock_t apr_socket_t apr_pollfd_t apr_threadattr_t apr_thread_t apr_threadkey_t apr_procattr_t apr_xlate_t apr_dbm_t apr_xml_parser }; for my $entry (@$Apache2::FunctionTable) { next unless $entry->{name} =~ /^apr_/; $functions++; unless (grep { find_pool($_->{type}) } @{ $entry->{args} }) { push @nopool, $entry; } } my $num_nopool = @nopool; print "$num_nopool functions (out of $functions) do not have access to a pool:\n\n"; for my $entry (@nopool) { print "$entry->{return_type} $entry->{name}(", (join ', ', map "$_->{type} $_->{name}", @{ $entry->{args} }), ")\n\n"; } sub find_pool { my $type = shift; return 1 if $type =~ /^apr_pool_t/; $type =~ s/\s+\*+$//; $type =~ s/^(const|struct)\s+//g; if (my $elts = $Apache2::StructureTable{$type}) { return 1 if $private{$type}; for my $e (@$elts) { next if $e->{type} =~ /^$type/; return 1 if find_pool($e->{type}); } } } mod_perl-2.0.9/util/cvsize.pl0000644000104000010010000000145012540623207016602 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- #get an idea of how much space the XS interface will eat #build/source_scan.pl must be run first #see pod/modperl_sizeof.pod use strict; use Apache2::FunctionTable (); use Apache2::StructureTable (); use constant sizeofCV => 254; my $size = 0; my $subs = 0; for my $entry (@$Apache2::FunctionTable) { $size += sizeofCV + ((length($entry->{name}) + 1) * 2); $subs++; } for my $entry (@$Apache2::StructureTable) { my $elts = $entry->{elts} || []; next unless @$elts; for my $e (@$elts) { $size += sizeofCV + ((length($e->{name}) + 1) * 2); $subs++; } } print "$subs subs, $size estimated bytes\n"; mod_perl-2.0.9/util/getdiff.pl0000644000104000010010000000105212540623207016705 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # this script creates a diff against SVN # and against /dev/null for all files in ARGV # and prints it to STDOUT # # e.g. # getdiff.pl t/modules/newtest t/response/TestModules/NewTest.pm \ # > newtest.patch # # the generated patch can be applied with # patch -p0 < newtest.patch # cvs diff my $o = `svn diff`; for (@ARGV) { $o .= "\n"; $o .= `diff -u /dev/null $_` } print $o; mod_perl-2.0.9/util/methodlookup_check.pl0000644000104000010010000000212412540623207021145 0ustar AdministratorsNone#!/usr/bin/perl # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # this script checks whether all XS methods are known to ModPerl::MethodLookup use strict; use warnings; use lib "lib"; use ModPerl::MethodLookup; # methods/classes ModPerl::MethodLookup knows about my %known = (); for (ModPerl::MethodLookup::avail_methods()) { my ($modules_hint, @modules) = ModPerl::MethodLookup::lookup_method($_); $known{$_} = { map {$_ => 1} @modules}; } # real XS methods my %real = (); my $in = qx{grep -Ir newXS WrapXS}; while ($in =~ m{WrapXS/(\w+)/(\w+)/.*?newXS\("(?:.+)::(.+)"}g) { $real{$3}{"$1\::$2"}++; } # now check what's missing my @miss = (); for my $method (sort keys %real) { for my $module (sort keys %{ $real{$method} }) { #printf "%-25s %s\n", $method, $module unless $known{$method}{$module}; push @miss, sprintf "%-25s %s\n", $module, $method unless $known{$method}{$module}; } } print @miss ? sort(@miss) : "All methods are known by ModPerl::MethodLookup\n"; mod_perl-2.0.9/util/perl_bloat.pl0000644000104000010010000000161312540623207017423 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # perlbloat.pl 'some perlcode' 'more perl code' # perlbloat.pl Foo/Bar.pm Bar/Tar.pm # perlbloat.pl Foo::Bar Bar::Tar no warnings; use GTop (); my $gtop = GTop->new; my $total = 0; for (@ARGV) { my $code = $_; file2package($_) if /\S+\.pm$/; my $before = $gtop->proc_mem($$)->size; if (eval "require $_" ) { eval { $_->import; }; } else { eval $_; die $@ if $@; } my $after = $gtop->proc_mem($$)->size; printf "%-30s added %s\n", $_, GTop::size_string($after - $before); $total += $after - $before; } print "-" x 46, "\n"; printf "Total added %30s\n", GTop::size_string($total); sub file2package { $_[0] =~ s|/|::|g; $_[0] =~ s|\.pm$||; } mod_perl-2.0.9/util/sizeof.pl0000644000104000010010000000242612540623207016602 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- #calculate structure sizes listed in pod/modperl_sizeof.pod via sizeof() use strict; use ExtUtils::Embed; use Config; my $file = shift || 'pod/modperl_sizeof.pod'; open my $pod, $file or die "open $file: $!"; FINDSTRUCT: { while (<$pod>) { next unless /^\s*(\w+)\s*=\s*\{/; my $name = $1; my $size = sizeof($name, $pod); print "sizeof $name => $size\n"; redo FINDSTRUCT; } } sub sizeof { my($struct, $h) = @_; my @elts; while (<$h>) { last if /^\s*\}\;$/; next unless m:(\w+).*?//\s*(.*):; push @elts, "sizeof($2) /* $1 */"; } my $name = "perl_sizeof_$struct"; my $tmpfile = "$name.c"; open my $fh, '>', $tmpfile or die "open $tmpfile: $!"; local $" = " + \n"; print $fh < #define PERLIO_NOT_STDIO 0 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #undef fprintf int main(void) { int size = @elts; fprintf(stdout, "%d", size); return 1; } EOF my $opts = ccopts(); system "$Config{cc} -o $name $tmpfile $opts"; my $size = `$name`; unlink $name, $tmpfile; return $size; } mod_perl-2.0.9/util/source_stats.pl0000644000104000010010000000175012540623207020020 0ustar AdministratorsNone#!/usr/bin/perl -w # please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use lib qw(lib); use strict; use Apache2::FunctionTable (); use Apache2::StructureTable (); my %stats; for my $entry (@$Apache2::FunctionTable) { unless ($entry->{name} =~ /^(ap|apr)_/) { #print "found alien function $entry->{name}\n"; next; } $stats{functions}->{$1}++; } for my $entry (@$Apache2::StructureTable) { my $elts = $entry->{elts}; my $type = $entry->{type}; my $c = $type =~ /^apr_/ ? "apr" : "ap"; @$elts = () if $type =~ /^ap_LINK/; if (@$elts) { $stats{typedef_structs}->{$c}++; $stats{struct_members}->{$c} += @$elts; } else { $stats{typedefs}->{$c}++; } } while (my($name, $tab) = each %stats) { printf "%d %s\n", $tab->{ap} + $tab->{apr}, $name; for (qw(apr ap)) { printf "%6s: %d\n", $_, $tab->{$_}; } } mod_perl-2.0.9/util/xs_check.pl0000644000104000010010000000541712540623207017075 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- use lib qw(Apache-Test/lib lib xs/tables/current); use strict; use warnings qw(FATAL all); use ModPerl::TypeMap (); use ModPerl::FunctionMap (); use ModPerl::StructureMap (); use ModPerl::WrapXS (); use ModPerl::MapUtil qw(disabled_reason); my %check = ( types => ModPerl::TypeMap->new, functions => ModPerl::FunctionMap->new, structures => ModPerl::StructureMap->new, ); my %missing; while (my($things, $obj) = each %check) { $missing{$things} = $obj->check; if (my $missing = $missing{$things}) { my $n = @$missing; print "$n $things are not mapped:\n"; print " $_\n" for sort @$missing; } else { print "all $things are mapped\n"; } } my %check_exists = ( functions => $check{functions}, structure_members => $check{structures}, types => $check{types}, ); while (my($things, $obj) = each %check_exists) { if (my $missing = $obj->check_exists) { my $n = @$missing; print "$n mapped $things do not exist:\n"; print " $_\n" for sort @$missing; } else { print "all mapped $things exist\n"; } } my %unmapped = map { $_,1 } @{ $missing{functions} } if $missing{functions}; my $typemap = $check{types}; my $function_map = $check{functions}; my @missing; for my $entry (@$Apache2::FunctionTable) { my $func; my $name = $entry->{name}; next if $unmapped{$name}; next unless $function_map->{map}->{$name}; next if $func = $typemap->map_function($entry); push @missing, $name; } if (@missing) { my $n = @missing; print "unable to glue $n mapped functions:\n"; print " $_\n" for sort @missing; } else { print "all mapped functions are glued\n"; } my $stats = ModPerl::WrapXS->new->stats; my($total_modules, $total_xsubs); while (my($module, $n) = each %$stats) { $total_modules++; $total_xsubs += $n; } print "$total_modules total modules, ", "$total_xsubs total xsubs\n"; while (my($module, $n) = each %$stats) { print "$module: $n\n"; } for (qw(functions structure_members)) { my $disabled = $check_exists{$_}->disabled; my $total = 0; for my $names (values %$disabled) { $total += @$names; } print "$total $_ are not wrapped:\n"; while (my($r, $names) = each %$disabled) { printf "%4d are %s\n", scalar @$names, disabled_reason($r); } } if (@ARGV) { my $key = '!'; for (qw(functions structure_members)) { my $disabled = $check_exists{$_}->disabled; my $names = $disabled->{$key}; printf "%s $_:\n", disabled_reason($key); for my $name (sort @$names) { print " $name\n"; } } } mod_perl-2.0.9/xs/0000755000104000010010000000000012540623211014412 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/0000755000104000010010000000000012540623207015662 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Access/0000755000104000010010000000000012540623207017063 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Access/Apache2__Access.h0000644000104000010010000001056412540623207022125 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_ap_requires(pTHX_ request_rec *r) { AV *av; HV *hv; register int x; const apr_array_header_t *reqs_arr = #if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=3 0; #else ap_requires(r); #endif require_line *reqs; if (!reqs_arr) { return &PL_sv_undef; } reqs = (require_line *)reqs_arr->elts; av = newAV(); for (x=0; x < reqs_arr->nelts; x++) { /* XXX should we do this or let PerlAuthzHandler? */ if (! (reqs[x].method_mask & (1 << r->method_number))) { continue; } hv = newHV(); (void)hv_store(hv, "method_mask", 11, newSViv((IV)reqs[x].method_mask), 0); (void)hv_store(hv, "requirement", 11, newSVpv(reqs[x].requirement,0), 0); av_push(av, newRV_noinc((SV*)hv)); } return newRV_noinc((SV*)av); } static MP_INLINE void mpxs_ap_allow_methods(pTHX_ I32 items, SV **MARK, SV **SP) { request_rec *r; SV *reset; mpxs_usage_va_2(r, reset, "$r->allow_methods(reset, ...)"); if (SvIV(reset)) { ap_clear_method_list(r->allowed_methods); } while (MARK <= SP) { STRLEN n_a; char *method = SvPV(*MARK, n_a); ap_method_list_add(r->allowed_methods, method); MARK++; } } static MP_INLINE void mpxs_insert_auth_cfg(pTHX_ request_rec *r, char *directive, char *val) { const char *errmsg; AV *config = newAV(); av_push(config, Perl_newSVpvf(aTHX_ "%s %s", directive, val)); errmsg = modperl_config_insert_request(aTHX_ r, newRV_noinc((SV*)config), OR_AUTHCFG, NULL, MP_HTTPD_OVERRIDE_OPTS_UNSET); if (errmsg) { Perl_warn(aTHX_ "Can't change %s to '%s'\n", directive, val); } SvREFCNT_dec((SV*)config); } static MP_INLINE const char *mpxs_Apache2__RequestRec_auth_type(pTHX_ request_rec *r, char *type) { const char *ret = NULL; if (type) { mpxs_insert_auth_cfg(aTHX_ r, "AuthType", type); } ret = ap_auth_type(r); if (!ret) { return "none"; } return ret; } static MP_INLINE const char *mpxs_Apache2__RequestRec_auth_name(pTHX_ request_rec *r, char *name) { if (name) { mpxs_insert_auth_cfg(aTHX_ r, "AuthName", name); } return ap_auth_name(r); } MP_STATIC XS(MPXS_ap_get_basic_auth_pw) { dXSARGS; request_rec *r; const char *sent_pw = NULL; int rc; mpxs_usage_items_1("r"); mpxs_PPCODE({ r = mp_xs_sv2_r(ST(0)); /* Default auth-type to Basic */ if (!ap_auth_type(r)) { mpxs_Apache2__RequestRec_auth_type(aTHX_ r, "Basic"); } rc = ap_get_basic_auth_pw(r, &sent_pw); EXTEND(SP, 2); PUSHs_mortal_iv(rc); if (rc == OK) { PUSHs_mortal_pv(sent_pw); } else { PUSHs(&PL_sv_undef); } }); } static MP_INLINE int mpxs_Apache2__RequestRec_allow_override_opts(pTHX_ request_rec *r) { #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS core_dir_config *cfg = ap_get_module_config(r->per_dir_config, &core_module); return cfg->override_opts; #else return MP_HTTPD_OVERRIDE_OPTS_DEFAULT; #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/CmdParms/0000755000104000010010000000000012540623207017370 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/CmdParms/Apache2__CmdParms.h0000644000104000010010000000313012540623207022726 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_module.h" static MP_INLINE SV *mpxs_Apache2__CmdParms_info(pTHX_ cmd_parms *parms) { const char *data = ((modperl_module_cmd_data_t *)parms->info)->cmd_data; if (data) { return newSVpv(data, 0); } return &PL_sv_undef; } static MP_INLINE void mpxs_Apache2__CmdParms_add_config(pTHX_ cmd_parms *parms, SV *lines) { const char *errmsg = modperl_config_insert_parms(aTHX_ parms, lines); if (errmsg) { Perl_croak(aTHX_ "$parms->add_config() has failed: %s", errmsg); } } static MP_INLINE int mpxs_Apache2__CmdParms_override_opts(pTHX_ cmd_parms *parms) { #ifdef MP_HTTPD_HAS_OVERRIDE_OPTS return parms->override_opts; #else return MP_HTTPD_OVERRIDE_OPTS_DEFAULT; #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Command/0000755000104000010010000000000012540623207017240 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Command/Apache2__Command.h0000644000104000010010000000170712540623207022456 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_Apache2__Command_next(cmd) \ (++cmd, ((cmd && cmd->name) ? cmd : NULL)) /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Connection/0000755000104000010010000000000012540623207017761 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Connection/Apache2__Connection.h0000644000104000010010000000320512540623207023713 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* backwards compat for c->keepalive (see ap_mmn.h) */ #if MODULE_MAGIC_NUMBER < 20020625 typedef int ap_conn_keepalive_e; #endif static MP_INLINE apr_socket_t *mpxs_Apache2__Connection_client_socket(pTHX_ conn_rec *c, apr_socket_t *s) { apr_socket_t *socket = ap_get_module_config(c->conn_config, &core_module); if (s) { ap_set_module_config(c->conn_config, &core_module, s); } return socket; } static MP_INLINE const char *mpxs_Apache2__Connection_get_remote_host(pTHX_ conn_rec *c, int type, ap_conf_vector_t *dir_config) { return ap_get_remote_host(c, (void *)dir_config, type, NULL); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/ConnectionUtil/0000755000104000010010000000000012540623207020617 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h0000644000104000010010000000252712540623207025415 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_Apache2__Connection_pnotes(pTHX_ conn_rec *c, SV *key, SV *val) { MP_dCCFG; modperl_config_con_init(c, ccfg); if (!ccfg) { return &PL_sv_undef; } return modperl_pnotes(aTHX_ &ccfg->pnotes, key, val, c->pool); } static MP_INLINE void mpxs_Apache2__Connection_pnotes_kill(pTHX_ conn_rec *c) { MP_dCCFG; modperl_config_con_init(c, ccfg); if (!ccfg) { return; } modperl_pnotes_kill(&ccfg->pnotes); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Const/0000755000104000010010000000000012540623207016750 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Const/Const.pm0000644000104000010010000000215312540623207020375 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package Apache2::Const; use ModPerl::Const (); use XSLoader (); our $VERSION = do { require mod_perl2; $mod_perl2::VERSION }; our @ISA = qw(ModPerl::Const); XSLoader::load(__PACKAGE__, $VERSION); 1; mod_perl-2.0.9/xs/Apache2/Const/Const.xs0000644000177200010010000000170712540623207016516 0ustar SteveNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #include "modperl_const.h" MODULE = Apache2::Const PACKAGE = Apache2::Const PROTOTYPES: disable BOOT: MP_newModPerlConstXS("Apache2"); mod_perl-2.0.9/xs/Apache2/Const/Makefile.PL0000644000177200010010000000022012540623207017013 0ustar SteveNoneuse lib qw(../lib); use ModPerl::BuildMM (); ModPerl::BuildMM::WriteMakefile( NAME => 'Apache2::Const', VERSION_FROM => 'Const.pm', ); mod_perl-2.0.9/xs/Apache2/Directive/0000755000104000010010000000000012540623207017600 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Directive/Apache2__Directive.h0000644000104000010010000001345712540623207023363 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_Apache2__Directive_conftree() ap_conftree /* XXX: this is only useful for at the moment */ static MP_INLINE SV *mpxs_Apache2__Directive_as_string(pTHX_ ap_directive_t *self) { ap_directive_t *d; SV *sv = newSVpv("", 0); for (d = self->first_child; d; d = d->next) { sv_catpv(sv, d->directive); sv_catpv(sv, " "); sv_catpv(sv, d->args); sv_catpv(sv, "\n"); } return sv; } /* Adds an entry to a hash, vivifying hash/array for multiple entries */ static void hash_insert(pTHX_ HV *hash, const char *key, int keylen, const char *args, int argslen, SV *value) { HV *subhash; AV *args_array; SV **hash_ent = hv_fetch(hash, key, keylen, 0); if (value) { if (!hash_ent) { subhash = newHV(); (void)hv_store(hash, key, keylen, newRV_noinc((SV *)subhash), 0); } else { subhash = (HV *)SvRV(*hash_ent); } (void)hv_store(subhash, args, argslen, value, 0); } else { if (hash_ent) { if (SvROK(*hash_ent) && (SVt_PVAV == SvTYPE(SvRV(*hash_ent)))) { args_array = (AV *)SvRV(*hash_ent); } else { args_array = newAV(); av_push(args_array, newSVsv(*hash_ent)); (void)hv_store(hash, key, keylen, newRV_noinc((SV *)args_array), 0); } av_push(args_array, newSVpv(args, argslen)); } else { (void)hv_store(hash, key, keylen, newSVpv(args, argslen), 0); } } } static MP_INLINE SV *mpxs_Apache2__Directive_as_hash(pTHX_ ap_directive_t *tree) { const char *directive; int directive_len; const char *args; int args_len; HV *hash = newHV(); SV *subtree; while (tree) { directive = tree->directive; directive_len = strlen(directive); args = tree->args; args_len = strlen(args); if (tree->first_child) { /* Skip the prefix '<' */ if ('<' == directive[0]) { directive++; directive_len--; } /* Skip the postfix '>' */ if ('>' == args[args_len-1]) { args_len--; } subtree = mpxs_Apache2__Directive_as_hash(aTHX_ tree->first_child); hash_insert(aTHX_ hash, directive, directive_len, args, args_len, subtree); } else { hash_insert(aTHX_ hash, directive, directive_len, args, args_len, (SV *)NULL); } tree = tree->next; } return newRV_noinc((SV *)hash); } MP_STATIC XS(MPXS_Apache2__Directive_lookup) { dXSARGS; if (items < 2 || items > 3) { Perl_croak(aTHX_ "Usage: Apache2::Directive::lookup(self, key, [args])"); } mpxs_PPCODE({ Apache2__Directive tree; char *value; const char *directive; const char *args; int args_len; int directive_len; char *key = (char *)SvPV_nolen(ST(1)); int scalar_context = (G_SCALAR == GIMME_V); if (SvROK(ST(0)) && sv_derived_from(ST(0), "Apache2::Directive")) { IV tmp = SvIV((SV*)SvRV(ST(0))); tree = INT2PTR(Apache2__Directive,tmp); } else { tree = ap_conftree; } if (items < 3) { value = NULL; } else { value = (char *)SvPV_nolen(ST(2)); } while (tree) { directive = tree->directive; directive_len = strlen(directive); /* Remove starting '<' for container directives */ if (directive[0] == '<') { directive++; directive_len--; } if (0 == strncasecmp(directive, key, directive_len)) { if (value) { args = tree->args; args_len = strlen(args); /* Skip the postfix '>' */ if ('>' == args[args_len-1]) { args_len--; } } if ( (!value) || (0 == strncasecmp(args, value, args_len)) ) { if (tree->first_child) { XPUSHs(sv_2mortal(mpxs_Apache2__Directive_as_hash( aTHX_ tree->first_child))); } else { XPUSHs(sv_2mortal(newSVpv(tree->args, 0))); } if (scalar_context) { break; } } } tree = tree->next ? tree->next : NULL; } }); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Filter/0000755000104000010010000000000012540623207017107 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Filter/Apache2__Filter.h0000644000104000010010000003005112540623207022166 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mp_xs_sv2_modperl_filter(sv) \ ((SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) \ || (Perl_croak(aTHX_ "argument is not a blessed reference"),0) ? \ modperl_filter_mg_get(aTHX_ sv) : NULL) #define mpxs_Apache2__Filter_TIEHANDLE(stashsv, sv) \ modperl_newSVsv_obj(aTHX_ stashsv, sv) #define mpxs_Apache2__Filter_PRINT mpxs_Apache2__Filter_print static MP_INLINE apr_size_t mpxs_Apache2__Filter_print(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; apr_size_t bytes = 0; mpxs_usage_va_1(modperl_filter, "$filter->print(...)"); MP_TRACE_f(MP_FUNC, "from %s", ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name); if (modperl_filter->mode == MP_OUTPUT_FILTER_MODE) { mpxs_write_loop(modperl_output_filter_write, modperl_filter, "Apache2::Filter::print"); } else { mpxs_write_loop(modperl_input_filter_write, modperl_filter, "Apache2::Filter::print"); } /* XXX: ap_rflush if $| */ return bytes; } static MP_INLINE apr_size_t mpxs_Apache2__Filter_read(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; apr_size_t wanted, len=0; SV *buffer; mpxs_usage_va_2(modperl_filter, buffer, "$filter->read(buf, [len])"); MP_TRACE_f(MP_FUNC, "from %s", ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name); if (items > 2) { wanted = SvIV(*MARK); } else { wanted = MP_IOBUFSIZE; } if (modperl_filter->mode == MP_INPUT_FILTER_MODE) { /* XXX: if we ever will have a need to change the read * discipline: (input_mode, block, readbytes) from the filter * we can provide an accessor method to modify the values * supplied by the filter chain */ len = modperl_input_filter_read(aTHX_ modperl_filter, buffer, wanted); } else { len = modperl_output_filter_read(aTHX_ modperl_filter, buffer, wanted); } /* must run any set magic */ SvSETMAGIC(buffer); SvTAINTED_on(buffer); return len; } static MP_INLINE U16 *modperl_filter_attributes(pTHX_ SV *package, SV *cvrv) { return modperl_code_attrs(aTHX_ (CV*)SvRV(cvrv)); } #ifdef MP_TRACE #define trace_attr() \ MP_TRACE_f(MP_FUNC, "applied %s attribute to %s handler", attribute, \ HvNAME(stash)) #else #define trace_attr() #endif /* we can't eval at this stage, since the package is not compiled yet, * we are still parsing the source. */ #define MODPERL_FILTER_ATTACH_ATTR_CODE(cv, string, len) \ { \ char *str; \ len -= 2; /* s/ \( | \) //x */ \ string++; /* skip the opening '(' */ \ Newx(str, len+1, char); \ Copy(string, str, len+1, char); \ str[len] = '\0'; /* remove the closing ')' */ \ sv_magic(cv, (SV *)NULL, '~', NULL, -1); \ SvMAGIC(cv)->mg_ptr = str; \ } MP_STATIC XS(MPXS_modperl_filter_attributes) { dXSARGS; U16 *attrs = modperl_filter_attributes(aTHX_ ST(0), ST(1)); I32 i; #ifdef MP_TRACE HV *stash = gv_stashsv(ST(0), TRUE); #endif for (i=2; i < items; i++) { STRLEN len; char *pv = SvPV(ST(i), len); char *attribute = pv; if (strnEQ(pv, "Filter", 6)) { pv += 6; } switch (*pv) { case 'C': if (strEQ(pv, "ConnectionHandler")) { *attrs |= MP_FILTER_CONNECTION_HANDLER; trace_attr(); continue; } case 'I': if (strEQ(pv, "InitHandler")) { *attrs |= MP_FILTER_INIT_HANDLER; trace_attr(); continue; } case 'H': if (strnEQ(pv, "HasInitHandler", 14)) { STRLEN code_len; pv += 14; /* skip over the attr name */ code_len = len - (pv - attribute); MODPERL_FILTER_ATTACH_ATTR_CODE(SvRV(ST(1)), pv, code_len); *attrs |= MP_FILTER_HAS_INIT_HANDLER; trace_attr(); continue; } case 'R': if (strEQ(pv, "RequestHandler")) { *attrs |= MP_FILTER_REQUEST_HANDLER; trace_attr(); continue; } default: /* XXX: there could be more than one attr to pass through */ XPUSHs_mortal_pv(attribute); XSRETURN(1); } } XSRETURN_EMPTY; } static MP_INLINE SV *mpxs_Apache2__Filter_ctx(pTHX_ ap_filter_t *filter, SV *data) { modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(filter->ctx); /* XXX: is it possible that the same filter, during a single * request or connection cycle, will be invoked by different perl * interpreters? if that happens we are in trouble, if we need to * return an SV living in a different interpreter. may be there is * a way to use one of the perl internal functions to clone an SV * (and it can contain any references) */ if (data != (SV *)NULL) { if (ctx->data) { if (SvOK(ctx->data) && SvREFCNT(ctx->data)) { /* release the previously stored SV so we don't leak * an SV */ SvREFCNT_dec(ctx->data); } } #ifdef USE_ITHREADS if (!ctx->interp) { ctx->interp = modperl_thx_interp_get(aTHX); MP_INTERP_REFCNT_inc(ctx->interp); } #endif ctx->data = SvREFCNT_inc(data); } return ctx->data ? SvREFCNT_inc(ctx->data) : &PL_sv_undef; } static MP_INLINE SV *mpxs_Apache2__Filter_seen_eos(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; if ((items < 1) || (items > 2) || !(mpxs_sv2_obj(modperl_filter, *MARK))) { Perl_croak(aTHX_ "usage: $filter->seen_eos([$set])"); } MARK++; if (items == 2) { modperl_filter->seen_eos = SvTRUE(*MARK) ? 1 : 0; } return modperl_filter->seen_eos ? &PL_sv_yes : &PL_sv_no; } static MP_INLINE void mpxs_Apache2__RequestRec_add_input_filter(pTHX_ request_rec *r, SV *callback) { modperl_filter_runtime_add(aTHX_ r, r->connection, MP_FILTER_REQUEST_INPUT_NAME, MP_INPUT_FILTER_MODE, ap_add_input_filter, callback, "InputFilter"); } static MP_INLINE void mpxs_Apache2__RequestRec_add_output_filter(pTHX_ request_rec *r, SV *callback) { modperl_filter_runtime_add(aTHX_ r, r->connection, MP_FILTER_REQUEST_OUTPUT_NAME, MP_OUTPUT_FILTER_MODE, ap_add_output_filter, callback, "OutputFilter"); } static MP_INLINE void mpxs_Apache2__Connection_add_input_filter(pTHX_ conn_rec *c, SV *callback) { modperl_filter_runtime_add(aTHX_ NULL, c, MP_FILTER_CONNECTION_INPUT_NAME, MP_INPUT_FILTER_MODE, ap_add_input_filter, callback, "InputFilter"); } static MP_INLINE void mpxs_Apache2__Connection_add_output_filter(pTHX_ conn_rec *c, SV *callback) { modperl_filter_runtime_add(aTHX_ NULL, c, MP_FILTER_CONNECTION_OUTPUT_NAME, MP_OUTPUT_FILTER_MODE, ap_add_output_filter, callback, "OutputFilter"); } static MP_INLINE void mpxs_Apache2__Filter_remove(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_filter_t *modperl_filter; ap_filter_t *f; if (items < 1) { Perl_croak(aTHX_ "usage: $filter->remove()"); } modperl_filter = mp_xs_sv2_modperl_filter(*MARK); /* native filter */ if (!modperl_filter) { f = INT2PTR(ap_filter_t *, SvIV(SvRV(*MARK))); MP_TRACE_f(MP_FUNC, " %s\n\n\t non-modperl filter removes itself", f->frec->name); /* the filter can reside in only one chain. hence we try to * remove it from both, the input and output chains, since * unfortunately we can't tell what kind of filter is that and * whether the first call was successful */ ap_remove_input_filter(f); ap_remove_output_filter(f); return; } f = modperl_filter->f; MP_TRACE_f(MP_FUNC, " %s\n\n\tfilter removes itself", ((modperl_filter_ctx_t *)f->ctx)->handler->name); if (modperl_filter->mode == MP_INPUT_FILTER_MODE) { ap_remove_input_filter(f); } else { ap_remove_output_filter(f); } } static MP_INLINE apr_status_t mpxs_Apache2__Filter_fflush(pTHX_ ap_filter_t *filter, apr_bucket_brigade *brigade) { apr_status_t rc = ap_fflush(filter, brigade); /* if users don't bother to check the success, do it on their * behalf */ if (GIMME_V == G_VOID && rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "Apache2::Filter::fflush"); } return rc; } static MP_INLINE apr_status_t mpxs_Apache2__Filter_get_brigade(pTHX_ ap_filter_t *f, apr_bucket_brigade *bb, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) { apr_status_t rc = ap_get_brigade(f, bb, mode, block, readbytes); /* if users don't bother to check the success, do it on their * behalf */ if (GIMME_V == G_VOID && rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "Apache2::Filter::get_brigade"); } return rc; } static MP_INLINE apr_status_t mpxs_Apache2__Filter_pass_brigade(pTHX_ ap_filter_t *f, apr_bucket_brigade *bb) { apr_status_t rc = ap_pass_brigade(f, bb); /* if users don't bother to check the success, do it on their * behalf */ if (GIMME_V == G_VOID && rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "Apache2::Filter::pass_brigade"); } return rc; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Log/0000755000104000010010000000000012540623207016403 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Log/Apache2__Log.h0000644000104000010010000001751712540623207020772 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static void mpxs_Apache2__Log_BOOT(pTHX) { av_push(get_av("Apache2::Log::Request::ISA", TRUE), newSVpv("Apache2::Log", 12)); av_push(get_av("Apache2::Log::Server::ISA", TRUE), newSVpv("Apache2::Log", 12)); } #define croak_inval_obj() \ Perl_croak(aTHX_ "Argument is not an Apache2::RequestRec " \ "or Apache2::ServerRec object") static void mpxs_ap_log_error(pTHX_ int level, SV *sv, SV *msg) { char *file = NULL; int line = 0; char *str; SV *svstr = (SV *)NULL; STRLEN n_a; int lmask = level & APLOG_LEVELMASK; server_rec *s; request_rec *r = NULL; if (SvROK(sv) && sv_isa(sv, "Apache2::Log::Request")) { r = INT2PTR(request_rec *, SvObjIV(sv)); s = r->server; } else if (SvROK(sv) && sv_isa(sv, "Apache2::Log::Server")) { s = INT2PTR(server_rec *, SvObjIV(sv)); } else { s = modperl_global_get_server_rec(); } if ((lmask >= APLOG_DEBUG) && (mp_loglevel(s) >= APLOG_DEBUG)) { COP *cop = PL_curcop; file = CopFILE(cop); /* (caller)[1] */ line = CopLINE(cop); /* (caller)[2] */ } if ((mp_loglevel(s) >= lmask) && SvROK(msg) && (SvTYPE(SvRV(msg)) == SVt_PVCV)) { dSP; ENTER;SAVETMPS; PUSHMARK(sp); (void)call_sv(msg, G_SCALAR); SPAGAIN; svstr = POPs; (void)SvREFCNT_inc(svstr); PUTBACK; FREETMPS;LEAVE; str = SvPV(svstr,n_a); } else { str = SvPV(msg,n_a); } if (r) { ap_log_rerror(file, line, mp_module_index_ level, 0, r, "%s", str); } else { ap_log_error(file, line, mp_module_index_ level, 0, s, "%s", str); } if (svstr) { SvREFCNT_dec(svstr); } } #define MP_LOG_REQUEST 1 #define MP_LOG_SERVER 2 static SV *mpxs_Apache2__Log_log(pTHX_ SV *sv, int logtype) { SV *svretval; void *retval; char *pclass; switch (logtype) { case MP_LOG_REQUEST: pclass = "Apache2::Log::Request"; retval = (void *)modperl_sv2request_rec(aTHX_ sv); break; case MP_LOG_SERVER: pclass = "Apache2::Log::Server"; retval = (void *)modperl_sv2server_rec(aTHX_ sv); break; default: croak_inval_obj(); }; svretval = newSV(0); sv_setref_pv(svretval, pclass, (void*)retval); return svretval; } #define mpxs_Apache2__RequestRec_log(sv) \ mpxs_Apache2__Log_log(aTHX_ sv, MP_LOG_REQUEST) #define mpxs_Apache2__ServerRec_log(sv) \ mpxs_Apache2__Log_log(aTHX_ sv, MP_LOG_SERVER) static MP_INLINE SV *modperl_perl_do_join(pTHX_ SV **mark, SV **sp) { SV *sv = newSV(0); SV *delim; #ifdef WIN32 /* XXX: using PL_sv_no crashes on win32 with 5.6.1 */ delim = newSVpv("", 0); #else delim = SvREFCNT_inc(&PL_sv_no); #endif do_join(sv, delim, mark, sp); SvREFCNT_dec(delim); return sv; } #define my_do_join(m, s) \ modperl_perl_do_join(aTHX_ (m), (s)) MP_STATIC XS(MPXS_Apache2__Log_dispatch) { dXSARGS; SV *msgsv; int level; char *name = GvNAME(CvGV(cv)); if (items < 2) { Perl_croak(aTHX_ "usage: %s::%s(obj, ...)", mpxs_cv_name()); } if (items > 2) { msgsv = my_do_join(MARK+1, SP); } else { msgsv = ST(1); (void)SvREFCNT_inc(msgsv); } switch (*name) { case 'e': if (*(name + 1) == 'r') { level = APLOG_ERR; break; } level = APLOG_EMERG; break; case 'w': level = APLOG_WARNING; break; case 'n': level = APLOG_NOTICE; break; case 'i': level = APLOG_INFO; break; case 'd': level = APLOG_DEBUG; break; case 'a': level = APLOG_ALERT; break; case 'c': level = APLOG_CRIT; break; default: level = APLOG_ERR; /* should never get here */ break; }; mpxs_ap_log_error(aTHX_ level, ST(0), msgsv); SvREFCNT_dec(msgsv); XSRETURN_EMPTY; } MP_STATIC XS(MPXS_Apache2__Log_LOG_MARK) { dXSARGS; ax = ax; /* -Wall */; mpxs_PPCODE({ COP *cop = PL_curcop; if (items) { Perl_croak(aTHX_ "usage %s::%s()", mpxs_cv_name()); } EXTEND(SP, 2); PUSHs_mortal_pv(CopFILE(cop)); PUSHs_mortal_iv(CopLINE(cop)); }); } MP_STATIC XS(MPXS_Apache2__Log_log_xerror) { dXSARGS; SV *msgsv = (SV *)NULL; STRLEN n_a; request_rec *r = NULL; server_rec *s = NULL; char *msgstr; const char *file; int line, level; apr_status_t status; if (items < 6) { Perl_croak(aTHX_ "usage %s::%s(file, line, level, status, ...)", mpxs_cv_name()); } switch (*(GvNAME(CvGV(cv)) + 4)) { /* 4 == log_ */ case 'r': r = modperl_xs_sv2request_rec(aTHX_ ST(0), NULL, cv); break; case 's': s = modperl_sv2server_rec(aTHX_ ST(0)); break; default: croak_inval_obj(); }; file = (const char *)SvPV(ST(1), n_a); line = (int)SvIV(ST(2)); level = (int)SvIV(ST(3)); status = (apr_status_t)SvIV(ST(4)); if (items > 6) { msgsv = my_do_join(MARK+5, SP); } else { msgsv = ST(5); (void)SvREFCNT_inc(msgsv); } msgstr = SvPV(msgsv, n_a); if (r) { ap_log_rerror(file, line, mp_module_index_ level, status, r, "%s", msgstr); } else { ap_log_error(file, line, mp_module_index_ level, status, s, "%s", msgstr); } SvREFCNT_dec(msgsv); XSRETURN_EMPTY; } /* * this function handles: * $r->log_error * $s->log_error * $r->warn * $s->warn * Apache2::ServerRec::warn */ MP_STATIC XS(MPXS_Apache2__Log_log_error) { dXSARGS; request_rec *r = NULL; server_rec *s = NULL; int i = 0; char *errstr = NULL; SV *sv = (SV *)NULL; STRLEN n_a; if (items > 1) { if (sv_isa(ST(0), "Apache2::ServerRec")) { s = INT2PTR(server_rec *, SvObjIV(ST(0))); } else if ((r = modperl_xs_sv2request_rec(aTHX_ ST(0), "Apache2::RequestRec", cv))) { s = r->server; } } if (s) { i = 1; } else { request_rec *r = NULL; (void)modperl_tls_get_request_rec(&r); if (r) { s = r->server; } else { s = modperl_global_get_server_rec(); } } if (items > 1+i) { sv = my_do_join(MARK+i, SP); /* $sv = join '', @_[1..$#_] */ errstr = SvPV(sv,n_a); } else { errstr = SvPV(ST(i),n_a); } switch (*GvNAME(CvGV(cv))) { case 'w': modperl_log_warn(s, errstr); break; default: modperl_log_error(s, errstr); break; } if (sv) { SvREFCNT_dec(sv); } XSRETURN_EMPTY; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Makefile.PL0000644000177200010010000000020512540623207015730 0ustar SteveNoneuse lib qw(../lib); use ModPerl::BuildMM (); ModPerl::BuildMM::WriteMakefile( NAME => "Apache2_build", VERSION => '0.01' ); mod_perl-2.0.9/xs/Apache2/Module/0000755000104000010010000000000012540623207017107 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Module/Apache2__Module.h0000644000104000010010000000571012540623207022172 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_Apache2__Module_top_module() ap_top_module static MP_INLINE int mpxs_Apache2__Module_loaded(pTHX_ char *name) { char nameptr[256]; char *base; module *modp; /* Does the module name have a '.' in it ? */ if ((base = ap_strchr(name, '.'))) { int len = base - name; memcpy(nameptr, name, len); memcpy(nameptr + len, ".c\0", 3); /* check if module is loaded */ if (!(modp = ap_find_linked_module(nameptr))) { return 0; } if (*(base + 1) == 'c') { return 1; } /* if it ends in '.so', check if it was dynamically loaded */ if ((strlen(base+1) == 2) && (*(base + 1) == 's') && (*(base + 2) == 'o') && modp->dynamic_load_handle) { return 1; } return 0; } else { return modperl_perl_module_loaded(aTHX_ name); } } static MP_INLINE SV *mpxs_Apache2__Module_get_config(pTHX_ SV *pmodule, server_rec *s, ap_conf_vector_t *v) { SV *obj = modperl_module_config_get_obj(aTHX_ pmodule, s, v); return SvREFCNT_inc(obj); } static MP_INLINE int mpxs_Apache2__Module_ap_api_major_version(pTHX_ module *mod) { return mod->version; } static MP_INLINE int mpxs_Apache2__Module_ap_api_minor_version(pTHX_ module *mod) { return mod->minor_version; } static MP_INLINE void mpxs_Apache2__Module_add(pTHX_ char *package, SV *cmds) { const char *error; server_rec *s; if (!(SvROK(cmds) && (SvTYPE(SvRV(cmds)) == SVt_PVAV))) { Perl_croak(aTHX_ "Usage: Apache2::Module::add(__PACKAGE__, [])"); } s = modperl_global_get_server_rec(); error = modperl_module_add(s->process->pconf, s, package, cmds); if (error) { Perl_croak(aTHX_ "Apache2::Module::add(%s) failed : %s", package, error); } return; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/MPM/0000755000104000010010000000000012540623207016313 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/MPM/Apache2__MPM.h0000644000104000010010000000422612540623207020603 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_Apache2__MPM_query(pTHX_ SV *self, int query_code) { int mpm_query_info; apr_status_t retval = ap_mpm_query(query_code, &mpm_query_info); if (retval == APR_SUCCESS) { return newSViv(mpm_query_info); } return &PL_sv_undef; } static void mpxs_Apache2__MPM_BOOT(pTHX) { /* implement Apache2::MPM->show and Apache2::MPM->is_threaded * as constant subroutines, since this information will never * change during an interpreter's lifetime */ int mpm_query_info; apr_status_t retval = ap_mpm_query(AP_MPMQ_IS_THREADED, &mpm_query_info); if (retval == APR_SUCCESS) { MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as %i", mpm_query_info); newCONSTSUB(PL_defstash, "Apache2::MPM::is_threaded", newSViv(mpm_query_info)); } else { /* assign false (0) to sub if ap_mpm_query didn't succeed */ MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->is_threaded() as 0"); newCONSTSUB(PL_defstash, "Apache2::MPM::is_threaded", newSViv(0)); } MP_TRACE_g(MP_FUNC, "defined Apache2::MPM->show() as %s", ap_show_mpm()); newCONSTSUB(PL_defstash, "Apache2::MPM::show", newSVpv(ap_show_mpm(), 0)); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/RequestIO/0000755000104000010010000000000012540623207017542 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/RequestIO/Apache2__RequestIO.h0000644000104000010010000002540012540623207023256 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef WIN32 /* win32 not happy with &PL_sv_no */ # define SVNO newSViv(0) # define SVYES newSViv(1) #else # define SVNO &PL_sv_no # define SVYES &PL_sv_yes #endif #define mpxs_Apache2__RequestRec_TIEHANDLE(stashsv, sv) \ modperl_newSVsv_obj(aTHX_ stashsv, sv) #define mpxs_Apache2__RequestRec_PRINT mpxs_Apache2__RequestRec_print #define mpxs_Apache2__RequestRec_PRINTF mpxs_ap_rprintf #define mpxs_Apache2__RequestRec_BINMODE(r) \ r ? SVYES : SVNO /* noop */ #define mpxs_Apache2__RequestRec_CLOSE(r) \ r ? SVYES : SVNO /* noop */ #define mpxs_Apache2__RequestRec_UNTIE(r, refcnt) \ (r && refcnt) ? SVYES : SVNO /* noop */ #define mpxs_output_flush(r, rcfg, name) \ /* if ($|) */ \ if (IoFLUSH(PL_defoutgv)) { \ MP_TRACE_o(MP_FUNC, "(flush) %d bytes [%s]", \ rcfg->wbucket->outcnt, \ apr_pstrmemdup(rcfg->wbucket->pool, rcfg->wbucket->outbuf, \ rcfg->wbucket->outcnt)); \ MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, TRUE), \ name); \ } static MP_INLINE apr_size_t mpxs_ap_rvputs(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_config_req_t *rcfg; apr_size_t bytes = 0; request_rec *r; dMP_TIMES; mpxs_usage_va_1(r, "$r->puts(...)"); rcfg = modperl_config_req_get(r); MP_START_TIMES(); MP_CHECK_WBUCKET_INIT("$r->puts"); mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket, "Apache2::RequestIO::puts"); MP_END_TIMES(); MP_PRINT_TIMES("r->puts"); /* we do not check $| for this method, * only in the functions called by the tied interface */ return bytes; } static MP_INLINE SV *mpxs_Apache2__RequestRec_print(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_config_req_t *rcfg; request_rec *r; /* bytes must be called bytes */ apr_size_t bytes = 0; /* this also magically assings to r ;-) */ mpxs_usage_va_1(r, "$r->print(...)"); rcfg = modperl_config_req_get(r); MP_CHECK_WBUCKET_INIT("$r->print"); mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket, "Apache2::RequestIO::print"); mpxs_output_flush(r, rcfg, "Apache2::RequestIO::print"); return bytes ? newSVuv(bytes) : newSVpvn("0E0", 3); } static MP_INLINE apr_size_t mpxs_ap_rprintf(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_config_req_t *rcfg; request_rec *r; apr_size_t bytes = 0; SV *sv; mpxs_usage_va(2, r, "$r->printf($fmt, ...)"); rcfg = modperl_config_req_get(r); /* XXX: we could have an rcfg->sprintf_buffer to reuse this SV * across requests */ sv = sv_newmortal(); modperl_perl_do_sprintf(aTHX_ sv, items, MARK); bytes = SvCUR(sv); MP_CHECK_WBUCKET_INIT("$r->printf"); MP_TRACE_o(MP_FUNC, "%d bytes [%s]", bytes, SvPVX(sv)); MP_RUN_CROAK(modperl_wbucket_write(aTHX_ rcfg->wbucket, SvPVX(sv), &bytes), "Apache2::RequestIO::printf"); mpxs_output_flush(r, rcfg, "Apache2::RequestIO::printf"); return bytes; } /* alias */ #define mpxs_Apache2__RequestRec_WRITE(r, buffer, len, offset) \ mpxs_Apache2__RequestRec_write(aTHX_ r, buffer, len, offset) static MP_INLINE apr_size_t mpxs_Apache2__RequestRec_write(pTHX_ request_rec *r, SV *buffer, apr_size_t len, apr_off_t offset) { apr_size_t wlen; const char *buf; STRLEN avail; MP_dRCFG; buf = (const char *)SvPV(buffer, avail); if (len == -1) { wlen = offset ? avail - offset : avail; } else { wlen = len; } MP_CHECK_WBUCKET_INIT("$r->write"); MP_RUN_CROAK(modperl_wbucket_write(aTHX_ rcfg->wbucket, buf+offset, &wlen), "Apache2::RequestIO::write"); return wlen; } static MP_INLINE void mpxs_Apache2__RequestRec_rflush(pTHX_ I32 items, SV **MARK, SV **SP) { modperl_config_req_t *rcfg; request_rec *r; /* this also magically assings to r ;-) */ mpxs_usage_va_1(r, "$r->rflush()"); rcfg = modperl_config_req_get(r); MP_CHECK_WBUCKET_INIT("$r->rflush"); MP_TRACE_o(MP_FUNC, "%d bytes [%s]", rcfg->wbucket->outcnt, apr_pstrmemdup(rcfg->wbucket->pool, rcfg->wbucket->outbuf, rcfg->wbucket->outcnt)); MP_RUN_CROAK_RESET_OK(r->server, modperl_wbucket_flush(rcfg->wbucket, TRUE), "Apache2::RequestIO::rflush"); } static MP_INLINE long mpxs_ap_get_client_block(pTHX_ request_rec *r, SV *buffer, int bufsiz) { long nrd = 0; mpxs_sv_grow(buffer, bufsiz); nrd = ap_get_client_block(r, SvPVX(buffer), bufsiz); if (nrd > 0) { mpxs_sv_cur_set(buffer, nrd); SvTAINTED_on(buffer); } else { sv_setpvn(buffer, "", 0); } /* must run any set magic */ SvSETMAGIC(buffer); return nrd; } static MP_INLINE apr_status_t mpxs_setup_client_block(request_rec *r) { if (!r->read_length) { apr_status_t rc; /* only do this once per-request */ if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "mod_perl: ap_setup_client_block failed: %d", rc); return rc; } } return APR_SUCCESS; } #define mpxs_should_client_block(r) \ (r->read_length || ap_should_client_block(r)) #ifndef sv_setpvn_mg # define sv_setpvn_mg sv_setpvn #endif /* alias */ #define mpxs_Apache2__RequestRec_READ(r, buffer, len, offset) \ mpxs_Apache2__RequestRec_read(aTHX_ r, buffer, len, offset) static SV *mpxs_Apache2__RequestRec_read(pTHX_ request_rec *r, SV *buffer, apr_size_t len, apr_off_t offset) { SSize_t total; STRLEN blen; if (!SvOK(buffer)) { sv_setpvn_mg(buffer, "", 0); } (void)SvPV_force(buffer, blen); /* make it a valid PV */ if (len <= 0) { Perl_croak(aTHX_ "The LENGTH argument can't be negative"); } /* handle negative offset */ if (offset < 0) { if (-offset > (int)blen) Perl_croak(aTHX_ "Offset outside string"); offset += blen; } mpxs_sv_grow(buffer, len+offset); /* need to pad with \0 if offset > size of the buffer */ if (offset > SvCUR(buffer)) { Zero(SvEND(buffer), offset - SvCUR(buffer), char); } total = modperl_request_read(aTHX_ r, SvPVX(buffer)+offset, len); /* modperl_request_read can return only >=0. So it's safe to do this. */ /* if total==0 we need to set the buffer length in case it is larger */ mpxs_sv_cur_set(buffer, offset+total); /* must run any set magic */ SvSETMAGIC(buffer); SvTAINTED_on(buffer); return newSViv(total); } static MP_INLINE SV *mpxs_Apache2__RequestRec_GETC(pTHX_ request_rec *r) { char c[1] = "\0"; /* XXX: reimplement similar to read() w/o using the deprecated * client_block interface */ if (mpxs_setup_client_block(r) == APR_SUCCESS) { if (mpxs_should_client_block(r)) { if (ap_get_client_block(r, c, 1) == 1) { return newSVpvn((char *)&c, 1); } } } return &PL_sv_undef; } static MP_INLINE int mpxs_Apache2__RequestRec_OPEN(pTHX_ SV *self, SV *arg1, SV *arg2) { char *name; STRLEN len; SV *arg; dHANDLE("STDOUT"); modperl_io_handle_untie(aTHX_ handle); /* untie *STDOUT */ if (arg2 && self) { arg = newSVsv(arg1); sv_catsv(arg, arg2); } else { arg = arg1; } name = SvPV(arg, len); return do_open(handle, name, len, FALSE, O_RDONLY, 0, (PerlIO *)NULL); } static MP_INLINE int mpxs_Apache2__RequestRec_FILENO(pTHX_ request_rec *r) { dHANDLE("STDOUT"); return PerlIO_fileno(IoOFP(TIEHANDLE_SV(handle))); } static MP_INLINE apr_status_t mpxs_Apache2__RequestRec_sendfile(pTHX_ request_rec *r, const char *filename, apr_off_t offset, apr_size_t len) { apr_size_t nbytes; apr_status_t rc; apr_file_t *fp; rc = apr_file_open(&fp, filename, APR_READ|APR_BINARY, APR_OS_DEFAULT, r->pool); if (rc != APR_SUCCESS) { if (GIMME_V == G_VOID) { modperl_croak(aTHX_ rc, apr_psprintf(r->pool, "Apache2::RequestIO::sendfile('%s')", filename)); } else { return rc; } } if (!len) { apr_finfo_t finfo; apr_file_info_get(&finfo, APR_FINFO_NORM, fp); len = finfo.size; if (offset) { len -= offset; } } /* flush any buffered modperl output */ { modperl_config_req_t *rcfg = modperl_config_req_get(r); MP_CHECK_WBUCKET_INIT("$r->rflush"); if (rcfg->wbucket->outcnt) { MP_TRACE_o(MP_FUNC, "flushing %d bytes [%s]", rcfg->wbucket->outcnt, apr_pstrmemdup(rcfg->wbucket->pool, rcfg->wbucket->outbuf, rcfg->wbucket->outcnt)); MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, TRUE), "Apache2::RequestIO::sendfile"); } } rc = ap_send_fd(fp, r, offset, len, &nbytes); /* apr_file_close(fp); */ /* do not do this */ if (GIMME_V == G_VOID && rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "Apache2::RequestIO::sendfile"); } return rc; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/RequestRec/0000755000104000010010000000000012540623207017744 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/RequestRec/Apache2__RequestRec.h0000644000104000010010000001164612540623207023671 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE const char *mpxs_Apache2__RequestRec_content_type(pTHX_ request_rec *r, SV *type) { const char *retval = r->content_type; if (type) { MP_dRCFG; STRLEN len; const char *val = SvPV(type, len); ap_set_content_type(r, apr_pmemdup(r->pool, val, len+1)); MP_CGI_HEADER_PARSER_OFF(rcfg); } return retval; } static MP_INLINE SV *mpxs_Apache2__RequestRec_content_languages(pTHX_ request_rec *r, SV *languages) { SV *retval = modperl_apr_array_header2avrv(aTHX_ r->content_languages); if (languages) { r->content_languages = modperl_avrv2apr_array_header(aTHX_ r->pool, languages); } return retval; } static MP_INLINE int mpxs_Apache2__RequestRec_proxyreq(pTHX_ request_rec *r, SV *val) { int retval = r->proxyreq; if (!val && !r->proxyreq && r->parsed_uri.scheme && !(r->parsed_uri.hostname && strEQ(r->parsed_uri.scheme, ap_http_scheme(r)) && ap_matches_request_vhost(r, r->parsed_uri.hostname, r->parsed_uri.port_str ? r->parsed_uri.port : ap_default_port(r)))) { retval = r->proxyreq = PROXYREQ_PROXY; r->uri = r->unparsed_uri; /* else mod_proxy will segfault */ r->filename = apr_pstrcat(r->pool, "modperl-proxy:", r->uri, NULL); } if (val) { r->proxyreq = SvIV(val); } return retval; } static MP_INLINE SV *mpxs_Apache2__RequestRec_subprocess_env(pTHX_ request_rec *r, char *key, SV *val) { /* if called in a void context with no arguments, just * populate %ENV and stop. */ if (key == NULL && GIMME_V == G_VOID) { modperl_env_request_populate(aTHX_ r); return &PL_sv_undef; } return modperl_table_get_set(aTHX_ r->subprocess_env, key, val, TRUE); } static MP_INLINE apr_finfo_t *mpxs_Apache2__RequestRec_finfo(pTHX_ request_rec *r, apr_finfo_t *finfo) { if (finfo) { r->finfo = *finfo; } return &r->finfo; } static MP_INLINE const char *mpxs_Apache2__RequestRec_handler(pTHX_ I32 items, SV **MARK, SV **SP) { const char *RETVAL; request_rec *r; mpxs_usage_va_1(r, "$r->handler([$handler])"); RETVAL = (const char *)r->handler; if (items == 2) { if (SvPOK(*MARK)) { char *new_handler = SvPVX(*MARK); /* once inside a response phase, one should not try to * switch response handler types, since they won't take * any affect */ if (strEQ(modperl_callback_current_callback_get(), "PerlResponseHandler")) { switch (*new_handler) { case 'm': if (strEQ(new_handler, "modperl") && strEQ(RETVAL, "perl-script")) { Perl_croak(aTHX_ "Can't switch from 'perl-script' " "to 'modperl' response handler"); } break; case 'p': if (strEQ(new_handler, "perl-script") && strEQ(RETVAL, "modperl")) { Perl_croak(aTHX_ "Can't switch from 'modperl' " "to 'perl-script' response handler"); } break; } } r->handler = (const char *)apr_pstrmemdup(r->pool, new_handler, SvLEN(*MARK)); } else { Perl_croak(aTHX_ "the new_handler argument must be a string"); } } return RETVAL; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/RequestUtil/0000755000104000010010000000000012540623207020150 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/RequestUtil/Apache2__RequestUtil.h0000644000104000010010000003010112540623207024264 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE int mpxs_Apache2__RequestRec_push_handlers(pTHX_ request_rec *r, const char *name, SV *sv) { return modperl_handler_perl_add_handlers(aTHX_ r, NULL, r->server, r->pool, name, sv, MP_HANDLER_ACTION_PUSH); } static MP_INLINE int mpxs_Apache2__RequestRec_set_handlers(pTHX_ request_rec *r, const char *name, SV *sv) { return modperl_handler_perl_add_handlers(aTHX_ r, NULL, r->server, r->pool, name, sv, MP_HANDLER_ACTION_SET); } static MP_INLINE SV *mpxs_Apache2__RequestRec_get_handlers(pTHX_ request_rec *r, const char *name) { MpAV **handp = modperl_handler_get_handlers(r, NULL, r->server, r->pool, name, MP_HANDLER_ACTION_GET); return modperl_handler_perl_get_handlers(aTHX_ handp, r->pool); } /* * XXX: these three should be part of the apache api * for protocol module helpers */ static MP_INLINE SV *mpxs_Apache2__RequestRec_new(pTHX_ SV *classname, conn_rec *c, SV *base_pool_sv) { apr_pool_t *p, *base_pool; request_rec *r; server_rec *s = c->base_server; SV *r_sv; /* see: httpd-2.0/server/protocol.c:ap_read_request */ if (base_pool_sv) { base_pool = mp_xs_sv2_APR__Pool(base_pool_sv); } else { base_pool = c->pool; } apr_pool_create(&p, base_pool); r = apr_pcalloc(p, sizeof(request_rec)); r->pool = p; r->connection = c; r->server = s; r->request_time = apr_time_now(); r->user = NULL; r->ap_auth_type = NULL; r->allowed_methods = ap_make_method_list(p, 1); r->headers_in = apr_table_make(p, 1); r->subprocess_env = apr_table_make(r->pool, 1); r->headers_out = apr_table_make(p, 1); r->err_headers_out = apr_table_make(p, 1); r->notes = apr_table_make(p, 1); r->request_config = ap_create_request_config(p); r->proto_output_filters = c->output_filters; r->output_filters = r->proto_output_filters; r->proto_input_filters = c->input_filters; r->input_filters = r->proto_input_filters; ap_run_create_request(r); r->per_dir_config = s->lookup_defaults; r->sent_bodyct = 0; r->read_length = 0; r->read_body = REQUEST_NO_BODY; r->status = HTTP_OK; r->the_request = "UNKNOWN"; r->hostname = s->server_hostname; r->method = "GET"; r->method_number = M_GET; r->uri = "/"; r->filename = (char *)ap_server_root_relative(p, r->uri); r->assbackwards = 1; r->protocol = "UNKNOWN"; r_sv = sv_setref_pv(newSV(0), "Apache2::RequestRec", (void*)r); if (base_pool_sv) { mpxs_add_pool_magic(r_sv, base_pool_sv); } return r_sv; } static MP_INLINE request_rec *mpxs_Apache2__RequestUtil_request(pTHX_ SV *classname, SV *svr) { /* ignore classname */ return modperl_global_request(aTHX_ svr); } static MP_INLINE int mpxs_Apache2__RequestRec_location_merge(request_rec *r, char *location) { apr_pool_t *p = r->pool; server_rec *s = r->server; core_server_config *sconf = ap_get_module_config(s->module_config, &core_module); ap_conf_vector_t **sec = (ap_conf_vector_t **)sconf->sec_url->elts; int num_sec = sconf->sec_url->nelts; int i; for (i=0; id, location)) { r->per_dir_config = ap_merge_per_dir_configs(p, s->lookup_defaults, sec[i]); return 1; } } return 0; } static MP_INLINE void mpxs_Apache2__RequestRec_set_basic_credentials(request_rec *r, char *username, char *password) { char encoded[1024]; int elen; char *auth_value, *auth_cat; auth_cat = apr_pstrcat(r->pool, username, ":", password, NULL); elen = apr_base64_encode(encoded, auth_cat, strlen(auth_cat)); encoded[elen] = '\0'; auth_value = apr_pstrcat(r->pool, "Basic ", encoded, NULL); apr_table_setn(r->headers_in, "Authorization", auth_value); } static MP_INLINE int mpxs_Apache2__RequestRec_no_cache(pTHX_ request_rec *r, SV *flag) { int retval = r->no_cache; if (flag) { r->no_cache = (int)SvIV(flag); } if (r->no_cache) { apr_table_setn(r->headers_out, "Pragma", "no-cache"); apr_table_setn(r->headers_out, "Cache-control", "no-cache"); } else if (flag) { /* only unset if $r->no_cache(0) */ apr_table_unset(r->headers_out, "Pragma"); apr_table_unset(r->headers_out, "Cache-control"); } return retval; } static MP_INLINE SV *mpxs_Apache2__RequestRec_pnotes(pTHX_ request_rec *r, SV *key, SV *val) { MP_dRCFG; if (!rcfg) { return &PL_sv_undef; } return modperl_pnotes(aTHX_ &rcfg->pnotes, key, val, r->pool); } static MP_INLINE void mpxs_Apache2__RequestRec_pnotes_kill(pTHX_ request_rec *r) { MP_dRCFG; if (!rcfg) { return; } modperl_pnotes_kill(&rcfg->pnotes); } #define mpxs_Apache2__RequestRec_dir_config(r, key, sv_val) \ modperl_dir_config(aTHX_ r, r->server, key, sv_val) #define mpxs_Apache2__RequestRec_slurp_filename(r, tainted) \ modperl_slurp_filename(aTHX_ r, tainted) static MP_INLINE char *mpxs_Apache2__RequestRec_location(request_rec *r) { MP_dDCFG; return dcfg->location; } typedef struct { PerlInterpreter *perl; SV *sv; } sv_str_header_t; static int sv_str_header(void *arg, const char *k, const char *v) { sv_str_header_t *svh = (sv_str_header_t *)arg; dTHXa(svh->perl); Perl_sv_catpvf(aTHX_ svh->sv, "%s: %s\n", k, v); return 1; } static MP_INLINE SV *mpxs_Apache2__RequestRec_as_string(pTHX_ request_rec *r) { sv_str_header_t svh; #ifdef USE_ITHREADS svh.perl = aTHX; #endif svh.sv = newSVpv(r->the_request, 0); sv_catpvn(svh.sv, "\n", 1); apr_table_do((int (*) (void *, const char *, const char *)) sv_str_header, (void *) &svh, r->headers_in, NULL); Perl_sv_catpvf(aTHX_ svh.sv, "\n%s %s\n", r->protocol, r->status_line); apr_table_do((int (*) (void *, const char *, const char *)) sv_str_header, (void *) &svh, r->headers_out, NULL); apr_table_do((int (*) (void *, const char *, const char *)) sv_str_header, (void *) &svh, r->err_headers_out, NULL); sv_catpvn(svh.sv, "\n", 1); return svh.sv; } static MP_INLINE int mpxs_Apache2__RequestRec_is_perl_option_enabled(pTHX_ request_rec *r, const char *name) { return modperl_config_is_perl_option_enabled(aTHX_ r, r->server, name); } static MP_INLINE void mpxs_Apache2__RequestRec_add_config(pTHX_ request_rec *r, SV *lines, int override, char *path, int override_options) { const char *errmsg = modperl_config_insert_request(aTHX_ r, lines, override, path, override_options); if (errmsg) { Perl_croak(aTHX_ "$r->add_config() has failed: %s", errmsg); } } /* in order to ensure that s->document_root doesn't get corrupted by * modperl users setting its value, restore the original value at the * end of each request */ struct mp_docroot_info { const char **docroot; const char *original; }; static apr_status_t restore_docroot(void *data) { struct mp_docroot_info *di = (struct mp_docroot_info *)data; *di->docroot = di->original; return APR_SUCCESS; } static MP_INLINE const char *mpxs_Apache2__RequestRec_document_root(pTHX_ request_rec *r, SV *new_root) { const char *retval = ap_document_root(r); if (new_root) { struct mp_docroot_info *di; core_server_config *conf; MP_CROAK_IF_THREADS_STARTED("setting $r->document_root"); conf = ap_get_module_config(r->server->module_config, &core_module); di = apr_palloc(r->pool, sizeof *di); di->docroot = &conf->ap_document_root; di->original = conf->ap_document_root; apr_pool_cleanup_register(r->pool, di, restore_docroot, restore_docroot); conf->ap_document_root = apr_pstrdup(r->pool, SvPV_nolen(new_root)); } return retval; } static apr_status_t child_terminate(void *data) { apr_pool_t *pool = (apr_pool_t *)data; /* On the first pass, re-register so we end up last */ if (data) { apr_pool_cleanup_register(pool, NULL, child_terminate, apr_pool_cleanup_null); } else { exit(0); } return APR_SUCCESS; } static MP_INLINE void mpxs_Apache2__RequestRec_child_terminate(pTHX_ request_rec *r) { MP_CROAK_IF_THREADED_MPM("$r->child_terminate") apr_pool_cleanup_register(r->pool, r->pool, child_terminate, apr_pool_cleanup_null); } static MP_INLINE apr_status_t mpxs_ap_register_auth_provider(pTHX_ I32 items, SV **MARK, SV **SP) { apr_pool_t *pool; const char *provider_group; const char *provider_name; const char *provider_version; SV *callback1; SV *callback2 = NULL; int type; if (items != 7) Perl_croak(aTHX_ "pool, provider_group, provider_name, " "provider_version, callback1, callback2, type"); if (SvROK(*MARK) && sv_derived_from(*MARK, "APR::Pool")) { IV tmp = SvIV((SV*)SvRV(*MARK)); if (tmp == 0) { Perl_croak(aTHX_ "invalid pool object (already destroyed?)"); } pool = INT2PTR(APR__Pool, tmp); } else { Perl_croak(aTHX_ SvROK(*MARK) ? "pool is not of type APR::Pool" : "pool is not a blessed reference"); } MARK++; provider_group = (const char *)SvPV_nolen(*MARK); MARK++; provider_name = (const char *)SvPV_nolen(*MARK); MARK++; provider_version = (const char *)SvPV_nolen(*MARK); MARK++; callback1 = newSVsv(*MARK); MARK++; callback2 = NULL; if (SvROK(*MARK)) { callback2 = newSVsv(*MARK); } MARK++; type = (int)SvIV(*MARK); return modperl_register_auth_provider(pool, provider_group, provider_name, provider_version, callback1, callback2, type); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Response/0000755000104000010010000000000012540623207017460 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Response/Apache2__Response.h0000644000104000010010000000311412540623207023110 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* XXX: this should probably named $r->cgi_header_parse * and send_cgi_header an alias in Apache2::compat */ #define mpxs_Apache2__RequestRec_send_cgi_header(r, sv) \ { \ MP_dRCFG; \ STRLEN len; \ const char *bodytext; \ MP_CGI_HEADER_PARSER_OFF(rcfg); \ SvPV_force(sv, len); \ modperl_cgi_header_parse(r, SvPVX(sv), (apr_size_t*)&len, &bodytext); \ if (len) {\ MP_CHECK_WBUCKET_INIT("$r->send_cgi_header"); \ modperl_wbucket_write(aTHX_ rcfg->wbucket, bodytext, &len); \ } \ } static MP_INLINE void mpxs_Apache2__RequestRec_set_last_modified(request_rec *r, apr_time_t mtime) { if (mtime) { ap_update_mtime(r, mtime); } ap_set_last_modified(r); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/ServerRec/0000755000104000010010000000000012540623207017562 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/ServerRec/Apache2__ServerRec.h0000644000104000010010000000212312540623207023313 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if AP_SERVER_MAJORVERSION_NUMBER>2 || AP_SERVER_MINORVERSION_NUMBER>=3 #define loglevel log.level static MP_INLINE int mpxs_Apache2__ServerRec_is_virtual(pTHX_ server_rec *s, SV *val) { int retval = s->is_virtual; if (val) { s->is_virtual = SvIV(val); } return retval; } #endif mod_perl-2.0.9/xs/Apache2/ServerRec/ServerRec_pm0000644000177200010010000000024412540623207020200 0ustar SteveNoneuse Exporter (); use Apache2::Log (); # Apache2::ServerRec::loads warn @Apache2::ServerRec::EXPORT_OK = qw(warn); *Apache2::ServerRec::import = \&Exporter::import; mod_perl-2.0.9/xs/Apache2/ServerUtil/0000755000104000010010000000000012540623207017766 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/ServerUtil/Apache2__ServerUtil.h0000644000104000010010000001572512540623207023737 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) #include "unixd.h" #endif #define mpxs_Apache2__ServerUtil_restart_count modperl_restart_count #define mpxs_Apache2__ServerRec_method_register(s, methname) \ ap_method_register(s->process->pconf, methname); #define mpxs_Apache2__ServerRec_add_version_component(s, component) \ ap_add_version_component(s->process->pconf, component); /* XXX: the mpxs_cleanup_t and mpxs_cleanup_run are almost dups with * code in APR__Pool.h (minus interpr member which is not used * here. They should be moved to modperl_common_util - the problem is * modperl_interp_t *, which can't live in modperl_common_* since it * creates a dependency on mod_perl. A possible solution is to use * void * for that slot and cast it to modperl_interp_t * when used */ typedef struct { SV *cv; SV *arg; apr_pool_t *p; #ifdef USE_ITHREADS PerlInterpreter *perl; #endif } mpxs_cleanup2_t; /** * callback wrapper for Perl cleanup subroutines * @param data internal storage */ static apr_status_t mpxs_cleanup_run(void *data) { int count; mpxs_cleanup2_t *cdata = (mpxs_cleanup2_t *)data; #ifdef USE_ITHREADS dTHXa(cdata->perl); #endif dSP; #ifdef USE_ITHREADS PERL_SET_CONTEXT(aTHX); #endif ENTER;SAVETMPS; PUSHMARK(SP); if (cdata->arg) { XPUSHs(cdata->arg); } PUTBACK; save_gp(PL_errgv, 1); /* local *@ */ count = call_sv(cdata->cv, G_SCALAR|G_EVAL); SPAGAIN; if (count == 1) { (void)POPs; /* the return value is ignored */ } if (SvTRUE(ERRSV)) { Perl_warn(aTHX_ "Apache2::ServerUtil: cleanup died: %s", SvPV_nolen(ERRSV)); } PUTBACK; FREETMPS;LEAVE; SvREFCNT_dec(cdata->cv); if (cdata->arg) { SvREFCNT_dec(cdata->arg); } /* the return value is ignored by apr_pool_destroy anyway */ return APR_SUCCESS; } /* this cleanups registered by this function are run only by the * parent interpreter */ static MP_INLINE void mpxs_Apache2__ServerUtil_server_shutdown_cleanup_register(pTHX_ SV *cv, SV *arg) { mpxs_cleanup2_t *data; apr_pool_t *p; MP_CROAK_IF_POST_POST_CONFIG_PHASE("server_shutdown_cleanup_register"); p = modperl_server_user_pool(); /* must use modperl_server_user_pool here to make sure that it's run * before parent perl is destroyed */ data = (mpxs_cleanup2_t *)apr_pcalloc(p, sizeof(*data)); data->cv = SvREFCNT_inc(cv); data->arg = arg ? SvREFCNT_inc(arg) : (SV *)NULL; data->p = p; #ifdef USE_ITHREADS data->perl = aTHX; #endif /* USE_ITHREADS */ apr_pool_cleanup_register(p, data, mpxs_cleanup_run, apr_pool_cleanup_null); } static MP_INLINE int mpxs_Apache2__ServerRec_push_handlers(pTHX_ server_rec *s, const char *name, SV *sv) { return modperl_handler_perl_add_handlers(aTHX_ NULL, NULL, s, s->process->pconf, name, sv, MP_HANDLER_ACTION_PUSH); } static MP_INLINE int mpxs_Apache2__ServerRec_set_handlers(pTHX_ server_rec *s, const char *name, SV *sv) { return modperl_handler_perl_add_handlers(aTHX_ NULL, NULL, s, s->process->pconf, name, sv, MP_HANDLER_ACTION_SET); } static MP_INLINE SV *mpxs_Apache2__ServerRec_get_handlers(pTHX_ server_rec *s, const char *name) { MpAV **handp = modperl_handler_get_handlers(NULL, NULL, s, s->process->pconf, name, MP_HANDLER_ACTION_GET); return modperl_handler_perl_get_handlers(aTHX_ handp, s->process->pconf); } #define mpxs_Apache2__ServerRec_dir_config(s, key, sv_val) \ modperl_dir_config(aTHX_ NULL, s, key, sv_val) #define mpxs_Apache2__ServerUtil_server(classname) modperl_global_get_server_rec() #if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) #define mpxs_Apache2__ServerUtil_user_id(classname) ap_unixd_config.user_id #define mpxs_Apache2__ServerUtil_group_id(classname) ap_unixd_config.group_id #else #define mpxs_Apache2__ServerUtil_user_id(classname) 0 #define mpxs_Apache2__ServerUtil_group_id(classname) 0 #endif static MP_INLINE int mpxs_Apache2__ServerRec_is_perl_option_enabled(pTHX_ server_rec *s, const char *name) { return modperl_config_is_perl_option_enabled(aTHX_ NULL, s, name); } static MP_INLINE void mpxs_Apache2__ServerRec_add_config(pTHX_ server_rec *s, SV *lines) { const char *errmsg; MP_CROAK_IF_POST_POST_CONFIG_PHASE("$s->add_config"); errmsg = modperl_config_insert_server(aTHX_ s, lines); if (errmsg) { Perl_croak(aTHX_ "$s->add_config() has failed: %s", errmsg); } } #define mpxs_Apache2__ServerRec_get_server_banner \ ap_get_server_banner() #define mpxs_Apache2__ServerRec_get_server_description \ ap_get_server_description() #define mpxs_Apache2__ServerRec_get_server_version \ ap_get_server_version() static void mpxs_Apache2__ServerUtil_BOOT(pTHX) { newCONSTSUB(PL_defstash, "Apache2::ServerUtil::server_root", newSVpv(ap_server_root, 0)); newCONSTSUB(PL_defstash, "Apache2::ServerUtil::get_server_built", newSVpv(ap_get_server_built(), 0)); } #if AP_SERVER_MAJORVERSION_NUMBER>2 || \ (AP_SERVER_MAJORVERSION_NUMBER == 2 && AP_SERVER_MINORVERSION_NUMBER>=3) static MP_INLINE int mpxs_Apache2__ServerRec_loglevel(pTHX_ server_rec *s, int loglevel) { if (loglevel) { s->log.level = loglevel; } return s->log.level; } #endif /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/SubProcess/0000755000104000010010000000000012540623207017752 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/SubProcess/Apache2__SubProcess.h0000644000104000010010000001623712540623207023706 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "../../APR/PerlIO/modperl_apr_perlio.h" #ifndef MP_SOURCE_SCAN #include "apr_optional.h" static APR_OPTIONAL_FN_TYPE(modperl_apr_perlio_apr_file_to_glob) *apr_file_to_glob; #endif /* XXX: probably needs a lot more error checkings */ typedef struct { apr_int32_t in_pipe; apr_int32_t out_pipe; apr_int32_t err_pipe; apr_cmdtype_e cmd_type; } exec_info; #undef FAILED /* win32 defines a macro with this name */ #define FAILED(command) ((rc = command) != APR_SUCCESS) #define SET_TIMEOUT(fp) \ apr_file_pipe_timeout_set(fp, \ (int)(apr_time_from_sec(r->server->timeout))) static int modperl_spawn_proc_prog(pTHX_ request_rec *r, const char *command, const char ***argv, apr_file_t **script_in, apr_file_t **script_out, apr_file_t **script_err) { exec_info e_info; apr_pool_t *p; const char * const *env; apr_procattr_t *procattr; apr_proc_t *procnew; apr_status_t rc = APR_SUCCESS; e_info.in_pipe = APR_CHILD_BLOCK; e_info.out_pipe = APR_CHILD_BLOCK; e_info.err_pipe = APR_CHILD_BLOCK; e_info.cmd_type = APR_PROGRAM; p = r->main ? r->main->pool : r->pool; *script_out = *script_in = *script_err = NULL; env = (const char * const *)ap_create_environment(p, r->subprocess_env); if (FAILED(apr_procattr_create(&procattr, p)) || FAILED(apr_procattr_io_set(procattr, e_info.in_pipe, e_info.out_pipe, e_info.err_pipe)) || FAILED(apr_procattr_dir_set(procattr, ap_make_dirstr_parent(r->pool, r->filename))) || FAILED(apr_procattr_cmdtype_set(procattr, e_info.cmd_type))) { /* Something bad happened, tell the world. */ ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r, "couldn't set child process attributes: %s", r->filename); return rc; } procnew = apr_pcalloc(p, sizeof(*procnew)); if (FAILED(ap_os_create_privileged_process(r, procnew, command, *argv, env, procattr, p))) { /* Bad things happened. Everyone should have cleaned up. */ ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r, "couldn't create child process: %d: %s", rc, r->filename); return rc; } apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); if (!(*script_in = procnew->in)) { Perl_croak(aTHX_ "broken program-in stream"); return APR_EBADF; } SET_TIMEOUT(*script_in); if (!(*script_out = procnew->out)) { Perl_croak(aTHX_ "broken program-out stream"); return APR_EBADF; } SET_TIMEOUT(*script_out); if (!(*script_err = procnew->err)) { Perl_croak(aTHX_ "broken program-err stream"); return APR_EBADF; } SET_TIMEOUT(*script_err); return rc; } #define PUSH_FILE_GLOB(fp, type) \ PUSHs(apr_file_to_glob(aTHX_ fp, r->pool, type)) #define PUSH_FILE_GLOB_READ(fp) \ PUSH_FILE_GLOB(fp, MODPERL_APR_PERLIO_HOOK_READ) #define PUSH_FILE_GLOB_WRITE(fp) \ PUSH_FILE_GLOB(fp, MODPERL_APR_PERLIO_HOOK_WRITE) #define CLOSE_SCRIPT_STD(stream) \ rc = apr_file_close(stream); \ if (rc != APR_SUCCESS) { \ XSRETURN_UNDEF; \ } MP_STATIC XS(MPXS_modperl_spawn_proc_prog) { dXSARGS; const char *usage = "Usage: spawn_proc_prog($r, $command, [\\@argv])"; if (items < 2) { Perl_croak(aTHX_ "%s", usage); } SP -= items; { apr_file_t *script_in, *script_out, *script_err; apr_status_t rc; const char **argv; int i=0; AV *av_argv = (AV *)NULL; I32 len=-1, av_items=0; request_rec *r = modperl_xs_sv2request_rec(aTHX_ ST(0), NULL, cv); const char *command = (const char *)SvPV_nolen(ST(1)); if (items == 3) { if (SvROK(ST(2)) && SvTYPE(SvRV(ST(2))) == SVt_PVAV) { av_argv = (AV*)SvRV(ST(2)); len = AvFILLp(av_argv); av_items = len+1; } else { Perl_croak(aTHX_ "%s", usage); } } /* ap_os_create_privileged_process expects ARGV as char * **argv, with terminating NULL and the program itself as a * first item. */ argv = apr_palloc(r->pool, (av_items + 2) * sizeof(char *)); argv[0] = command; if (av_argv) { for (i = 0; i <= len; i++) { argv[i+1] = (const char *)SvPV_nolen(AvARRAY(av_argv)[i]); } } argv[i+1] = NULL; #if 0 for (i=0; i<=len+2; i++) { Perl_warn(aTHX_ "arg: %d %s\n", i, argv[i] ? argv[i] : "NULL"); } #endif rc = modperl_spawn_proc_prog(aTHX_ r, command, &argv, &script_in, &script_out, &script_err); if (rc == APR_SUCCESS) { /* XXX: apr_file_to_glob should be set once in the BOOT: section */ apr_file_to_glob = APR_RETRIEVE_OPTIONAL_FN(modperl_apr_perlio_apr_file_to_glob); if (GIMME_V == G_VOID) { CLOSE_SCRIPT_STD(script_in); CLOSE_SCRIPT_STD(script_out); CLOSE_SCRIPT_STD(script_err); XSRETURN_EMPTY; } else if (GIMME_V == G_SCALAR) { /* XXX: need to do lots of error checking before * putting the object on the stack */ EXTEND(SP, 1); PUSH_FILE_GLOB_READ(script_out); CLOSE_SCRIPT_STD(script_in); CLOSE_SCRIPT_STD(script_err); } else { EXTEND(SP, 3); PUSH_FILE_GLOB_WRITE(script_in); PUSH_FILE_GLOB_READ(script_out); PUSH_FILE_GLOB_READ(script_err); } } else { XSRETURN_UNDEF; } } PUTBACK; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/SubProcess/SubProcess_pm0000644000177200010010000000002412540623207020554 0ustar SteveNoneuse APR::PerlIO (); mod_perl-2.0.9/xs/Apache2/SubRequest/0000755000104000010010000000000012540623207017764 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/SubRequest/Apache2__SubRequest.h0000644000104000010010000000262612540623207023727 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE int mpxs_ap_run_sub_req(pTHX_ request_rec *r) { /* need to flush main request output buffer if any * before running any subrequests, else we get subrequest * output before anything already written in the main request */ if (r->main) { modperl_config_req_t *rcfg = modperl_config_req_get(r->main); if (rcfg->wbucket) { MP_RUN_CROAK(modperl_wbucket_flush(rcfg->wbucket, FALSE), "Apache2::SubRequest::run"); } } return ap_run_sub_req(r); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/URI/0000755000104000010010000000000012540623207016321 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/URI/Apache2__URI.h0000644000104000010010000000253512540623207020620 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE apr_uri_t *mpxs_Apache2__RequestRec_parsed_uri(request_rec *r) { modperl_uri_t *uri = modperl_uri_new(r->pool); uri->uri = r->parsed_uri; uri->path_info = r->path_info; return (apr_uri_t *)uri; } static MP_INLINE char *mpxs_ap_unescape_url(pTHX_ SV *url) { int status; STRLEN n_a; (void)SvPV_force(url, n_a); if ((status = ap_unescape_url(SvPVX(url))) == OK) { SvCUR_set(url, strlen(SvPVX(url))); } return SvPVX(url); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Apache2/Util/0000755000104000010010000000000012540623207016577 5ustar AdministratorsNonemod_perl-2.0.9/xs/Apache2/Util/Apache2__Util.h0000644000104000010010000000171112540623207021347 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define TIME_NOW apr_time_now() #define DEFAULT_TIME_FORMAT "%a, %d %b %Y %H:%M:%S %Z" /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/0000755000104000010010000000000012540623207015041 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/APR/0000755000104000010010000000000012540623207015463 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/APR/apr-test0000644000177200010010000000170312540623207015245 0ustar SteveNone#!perl use Test; plan tests => 8; use blib; use warnings FATAL => 'all'; use strict; use APR (); use APR::UUID (); use APR::Pool (); use APR::Lock (); use APR::Util (); use APR::Base64 (); use APR::Signal (); my $status; my $uuid = APR::UUID->new->format; ok $uuid; my $p = APR::Pool->new; ok $p; my $lock = APR::Lock->new($p, 0, 1, "lock.file"); $status = $lock->acquire and die APR::strerror($status); $status = $lock->release and die APR::strerror($status); $status = APR::password_validate("one", "two"); my $str = APR::strerror($status); ok $str eq "passwords do not match"; ok $status; my $bytes = APR::generate_random_bytes(10); ok length($bytes) == 10; my $encoded = APR::Base64::encode($bytes); #print "encoded=$encoded\n"; ok $encoded; my $decoded = APR::Base64::decode($encoded); ok $decoded eq $bytes; $p->clear; for (1..9) { my $desc = APR::Signal::get_description($_); #print "$_ => $desc\n"; } ok 1; $p->destroy; #XXX mod_perl-2.0.9/xs/APR/APR/APR.pm0000644000104000010010000000264612540623207016453 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package APR; use DynaLoader (); our $VERSION = '0.009000'; our @ISA = qw(DynaLoader); #dlopen("APR.so", RTDL_GLOBAL); so we only need to link libapr.a once # XXX: see xs/ModPerl/Const/Const.pm for issues of using 0x01 use Config (); use constant DL_GLOBAL => ( $Config::Config{dlsrc} eq 'dl_dlopen.xs' && $^O ne 'openbsd' ) ? 0x01 : 0x0; sub dl_load_flags { DL_GLOBAL } unless (defined &APR::XSLoader::BOOTSTRAP) { __PACKAGE__->bootstrap($VERSION); *APR::XSLoader::BOOTSTRAP = sub () { 1 }; } 1; __END__ mod_perl-2.0.9/xs/APR/APR/APR.xs0000644000177200010010000000434312540623207014564 0ustar SteveNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #ifdef MP_HAVE_APR_LIBS # define APR_initialize apr_initialize # define APR_terminate apr_terminate #else # define APR_initialize() # define APR_terminate() #endif #ifdef MP_HAVE_APR_LIBS /* XXX: APR_initialize doesn't initialize apr_hook_global_pool, needed for * work outside httpd, so do it manually PR22605 */ #include "apr_hooks.h" static void extra_apr_init(pTHX) { if (apr_hook_global_pool == NULL) { apr_pool_t *global_pool; apr_status_t rv = apr_pool_create(&global_pool, NULL); if (rv != APR_SUCCESS) { PerlIO_printf(PerlIO_stderr(), "Fatal error: unable to create global pool " "for use with by the scoreboard"); } /* XXX: mutex locking? */ apr_hook_global_pool = global_pool; } { apr_file_t *stderr_apr_handle; apr_status_t rv = apr_file_open_stderr(&stderr_apr_handle, apr_hook_global_pool); if (rv != APR_SUCCESS) { PerlIO_printf(PerlIO_stderr(), "Fatal error: failed to open stderr "); } modperl_trace_level_set(stderr_apr_handle, NULL); } } #else # define extra_apr_init(aTHX) #endif MODULE = APR PACKAGE = APR PROTOTYPES: disable BOOT: file = file; /* -Wall */ APR_initialize(); extra_apr_init(aTHX); void END() CODE: APR_terminate(); mod_perl-2.0.9/xs/APR/APR/Makefile.PL0000644000104000010010000000552312540623207017442 0ustar AdministratorsNoneuse strict; use warnings; use lib qw(../lib); use ModPerl::BuildMM (); require ModPerl::Code; use Apache2::Build (); use Config; use File::Spec::Functions; use constant WIN32 => Apache2::Build::WIN32; use constant CYGWIN => Apache2::Build::CYGWIN; use constant SOLARIS => $^O eq 'solaris'; use constant BUILD_APREXT => Apache2::Build::BUILD_APREXT; my %args; %args = map { split /=/, $_, 2 } @ARGV; $args{NAME} = 'APR'; $args{VERSION_FROM} = 'APR.pm'; my $libs = ''; $libs = delete $args{LIBS} if $args{LIBS}; my $build = ModPerl::BuildMM::build_config(); my $ccopts = $build->ccopts; # avoid referencing &perl_module outside of mod_perl $ccopts .= ' -DMP_IN_XS'; $args{CCFLAGS} = $ccopts; my @apru_link_flags = $build->apru_link_flags; $libs .= join ' ', @apru_link_flags if @apru_link_flags; if (WIN32) { $libs =~ s{/libpath:}{-L}g; $libs =~ s{(\S+)\.lib}{-l$1}g; } if (BUILD_APREXT) { my $mp_apr_lib = $build->mp_apr_lib; if (CYGWIN) { # For Cygwin compatibility, set $mp_apr_lib before the apache libs $libs = qq{ $mp_apr_lib } . $libs; } else { $libs .= qq{ $mp_apr_lib }; } } if (SOLARIS && $libs) { # EU::MM sets LD_RUN_PATH (for linking) based on -L options in LIBS. # LD_RUN_PATH is getting overridden by the specified -R path. # The -R specified is from the perl config's lddflags. # Therefore -R has to be added with the appropriate paths rather # than using LD_RUN_PATH, because it gets overridden. # make sure that all -L, -R from libs are moved # to the beginning of lddflags. my $extralddflags = join " ", $libs =~ /(-[LR]\S+)/g; # -R makes sure that these paths will be used $extralddflags =~ s{-L(\S+)}{-L$1 -R$1}g; $args{LDDLFLAGS} = "" unless exists $args{LDDLFLAGS}; $args{LDDLFLAGS} = join " ", $args{LDDLFLAGS}, $extralddflags, $build->perl_config('lddlflags'); # -R are now copied to LDDFLAGS, but leave -L's in LIBS -- # EU::MM needs it. $libs =~ s{-R\S+}{}g; } $args{LIBS} = [$libs] if $libs; my $srcdir = '../../../src/modules/perl'; # link the following into APR.so so other APR:: modules can be used # outside of httpd my @names = ModPerl::Code::src_apr_ext(); my(@obj, @clean, %src); for (@names) { push @obj, join '.', $_, 'o'; my $cfile = join '.', $_, 'c'; push @clean, $cfile; $src{$cfile} = "$srcdir/$cfile"; } $args{OBJECT} = BUILD_APREXT() ? "APR.o" : "APR.o @obj"; $args{clean} = { FILES => "@clean" }; ModPerl::BuildMM::WriteMakefile(%args); # avoid redefined warnings from imported postamble symbol from # elsewhere in other Makefile.PL files no warnings 'redefine'; sub MY::postamble { my $self = shift; my $string = $self->ModPerl::BuildMM::MY::postamble; $string .= join '', map { "$_: $src{$_}\n\t\$(CP) $src{$_} .\n"; } sort keys %src; return $string; } mod_perl-2.0.9/xs/APR/aprext/0000755000104000010010000000000012540623207016344 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/aprext/Makefile.PL0000644000104000010010000000270312540623207020320 0ustar AdministratorsNoneuse strict; use warnings; use lib qw(../lib); use ModPerl::BuildMM (); require ModPerl::Code; use Apache2::Build (); my $build = ModPerl::BuildMM::build_config(); my $srcdir = '../../../src/modules/perl'; my @names = ModPerl::Code::src_apr_ext(); my(@obj, @clean, %src); for (@names) { push @obj, join '.', $_, 'o'; my $cfile = join '.', $_, 'c'; push @clean, $cfile; $src{$cfile} = "$srcdir/$cfile"; } push @obj, q{modperl_dummy.o}; my @skip = qw(dynamic test); push @skip, q{static} unless (Apache2::Build::BUILD_APREXT); my %args = (NAME => 'lib' . $build->{MP_APR_LIB}, VERSION_FROM => '../APR/APR.pm', SKIP => [ @skip ] , LINKTYPE => 'static', OBJECT => "@obj", clean => { FILES => "@clean" }, ); my $ccopts = $build->ccopts; # avoid referencing &perl_module outside of mod_perl $ccopts .= ' -DMP_IN_XS'; $args{CCFLAGS} = $ccopts; ModPerl::BuildMM::WriteMakefile(%args); # avoid redefined warnings from imported postamble symbol from # elsewhere in other Makefile.PL files no warnings 'redefine'; sub MY::postamble { my $self = shift; my $string = $self->ModPerl::BuildMM::MY::postamble; $string .= join '', map { "$_: $src{$_}\n\t\$(CP) $src{$_} .\n"; } sort keys %src; # BSD make needs an empty target, even if the target is specified in .PHONY $string .= "\ndynamic ::\n"; return $string; } mod_perl-2.0.9/xs/APR/aprext/modperl_dummy.c0000644000104000010010000000214012540623207021362 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" /* FIXME: These functions are called from modperl_trace() in libaprext.lib * but are normally defined in mod_perl.c which can't be included. */ int modperl_is_running(void) { return 0; } int modperl_threads_started(void) { return 0; } int modperl_threaded_mpm(void) { return 0; } mod_perl-2.0.9/xs/APR/Base64/0000755000104000010010000000000012540623207016065 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Base64/APR__Base64.h0000644000104000010010000000367612540623207020137 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* apr_base64_encode_len and apr_base64_encode_binary give length that * includes the terminating '\0' */ #define mpxs_APR__Base64_encode_len(len) (apr_base64_encode_len(len) - 1) static MP_INLINE void mpxs_apr_base64_encode(pTHX_ SV *sv, SV *arg) { STRLEN len; int encoded_len; unsigned char *data = (unsigned char *)SvPV(arg, len); mpxs_sv_grow(sv, apr_base64_encode_len(len) - 1); encoded_len = apr_base64_encode_binary(SvPVX(sv), data, len); mpxs_sv_cur_set(sv, encoded_len - 1); } static MP_INLINE void mpxs_apr_base64_decode(pTHX_ SV *sv, SV *arg) { STRLEN len; int decoded_len; char *data = SvPV(arg, len); mpxs_sv_grow(sv, apr_base64_decode_len(data)); decoded_len = apr_base64_decode_binary((unsigned char *)SvPVX(sv), data); mpxs_sv_cur_set(sv, decoded_len); } MP_STATIC XS(MPXS_apr_base64_encode) { dXSARGS; mpxs_usage_items_1("data"); mpxs_set_targ(mpxs_apr_base64_encode, ST(0)); } MP_STATIC XS(MPXS_apr_base64_decode) { dXSARGS; mpxs_usage_items_1("data"); mpxs_set_targ(mpxs_apr_base64_decode, ST(0)); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Brigade/0000755000104000010010000000000012540623207016376 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Brigade/APR__Brigade.h0000644000104000010010000001171612540623207020753 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE void mpxs_APR__Brigade_cleanup(apr_bucket_brigade *brigade) { /* apr has a broken prototype (passing 'void *' instead of * 'apr_bucket_brigade *', so use a wrapper here */ apr_brigade_cleanup(brigade); } static MP_INLINE SV *mpxs_apr_brigade_create(pTHX_ SV *CLASS, SV *p_sv, apr_bucket_alloc_t *ba) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_bucket_brigade *bb = apr_brigade_create(p, ba); SV *bb_sv = sv_setref_pv(newSV(0), "APR::Brigade", (void*)bb); mpxs_add_pool_magic(bb_sv, p_sv); return bb_sv; } #define get_brigade(brigade, fetch) \ (fetch(brigade) == APR_BRIGADE_SENTINEL(brigade) ? \ NULL : fetch(brigade)) static MP_INLINE apr_bucket *mpxs_APR__Brigade_first(apr_bucket_brigade *brigade) { return get_brigade(brigade, APR_BRIGADE_FIRST); } static MP_INLINE apr_bucket *mpxs_APR__Brigade_last(apr_bucket_brigade *brigade) { return get_brigade(brigade, APR_BRIGADE_LAST); } #define get_bucket(brigade, bucket, fetch) \ (fetch(bucket) == APR_BRIGADE_SENTINEL(brigade) ? \ NULL : fetch(bucket)) static MP_INLINE apr_bucket *mpxs_APR__Brigade_next(apr_bucket_brigade *brigade, apr_bucket *bucket) { return get_bucket(brigade, bucket, APR_BUCKET_NEXT); } static MP_INLINE apr_bucket *mpxs_APR__Brigade_prev(apr_bucket_brigade *brigade, apr_bucket *bucket) { return get_bucket(brigade, bucket, APR_BUCKET_PREV); } static MP_INLINE void mpxs_APR__Brigade_insert_tail(apr_bucket_brigade *brigade, apr_bucket *bucket) { APR_BRIGADE_INSERT_TAIL(brigade, bucket); } static MP_INLINE void mpxs_APR__Brigade_insert_head(apr_bucket_brigade *brigade, apr_bucket *bucket) { APR_BRIGADE_INSERT_HEAD(brigade, bucket); } static MP_INLINE void mpxs_APR__Brigade_concat(apr_bucket_brigade *a, apr_bucket_brigade *b) { APR_BRIGADE_CONCAT(a, b); } static MP_INLINE int mpxs_APR__Brigade_is_empty(apr_bucket_brigade *brigade) { return APR_BRIGADE_EMPTY(brigade); } static MP_INLINE apr_pool_t *mpxs_APR__Brigade_pool(apr_bucket_brigade *brigade) { /* eesh, it's r->pool, and c->pool, but bb->p * let's make Perl consistent, otherwise this could be autogenerated */ return brigade->p; } static MP_INLINE SV *mpxs_APR__Brigade_length(pTHX_ apr_bucket_brigade *bb, int read_all) { apr_off_t length; apr_status_t rv = apr_brigade_length(bb, read_all, &length); /* XXX - we're deviating from the API here a bit in order to * make it more perlish - returning the length instead of * the return code. maybe that's not such a good idea, though... */ if (rv == APR_SUCCESS) { return newSViv((int)length); } return &PL_sv_undef; } #define mp_xs_sv2_bb mp_xs_sv2_APR__Brigade static MP_INLINE apr_size_t mpxs_APR__Brigade_flatten(pTHX_ I32 items, SV **MARK, SV **SP) { apr_bucket_brigade *bb; apr_size_t wanted; apr_status_t rc; SV *buffer; mpxs_usage_va_2(bb, buffer, "$bb->flatten($buf, [$wanted])"); if (items > 2) { /* APR::Brigade->flatten($wanted); */ wanted = SvIV(*MARK); } else { /* APR::Brigade->flatten(); */ /* can't use pflatten, because we can't realloc() memory * allocated by pflatten. and we need to append '\0' to it in * SvPVX. so we copy pflatten's guts here. */ apr_off_t actual; apr_brigade_length(bb, 1, &actual); wanted = (apr_size_t)actual; } (void)SvUPGRADE(buffer, SVt_PV); mpxs_sv_grow(buffer, wanted); rc = apr_brigade_flatten(bb, SvPVX(buffer), &wanted); if (!(rc == APR_SUCCESS || rc == APR_EOF)) { modperl_croak(aTHX_ rc, "APR::Brigade::flatten"); } mpxs_sv_cur_set(buffer, wanted); SvTAINTED_on(buffer); return wanted; } static MP_INLINE void mpxs_APR__Brigade_destroy(pTHX_ apr_bucket_brigade *bb) { MP_RUN_CROAK(apr_brigade_destroy(bb), "APR::Brigade::destroy"); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Bucket/0000755000104000010010000000000012540623207016256 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Bucket/APR__Bucket.h0000644000104000010010000000715512540623207020515 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_bucket.h" #define mpxs_APR__Bucket_delete apr_bucket_delete #define mpxs_APR__Bucket_destroy apr_bucket_destroy static apr_bucket *mpxs_APR__Bucket_new(pTHX_ SV *classname, apr_bucket_alloc_t *list, SV *sv, apr_off_t offset, apr_size_t len) { apr_size_t full_len; if (sv == (SV *)NULL) { sv = newSV(0); (void)SvUPGRADE(sv, SVt_PV); } (void)SvPV(sv, full_len); if (len) { if (len > full_len - offset) { Perl_croak(aTHX_ "APR::Bucket::new: the length argument can't be" " bigger than the total buffer length minus offset"); } } else { len = full_len - offset; } return modperl_bucket_sv_create(aTHX_ list, sv, offset, len); } static MP_INLINE apr_size_t mpxs_APR__Bucket_read(pTHX_ apr_bucket *bucket, SV *buffer, apr_read_type_e block) { apr_size_t len; const char *str; apr_status_t rc = apr_bucket_read(bucket, &str, &len, block); if (!(rc == APR_SUCCESS || rc == APR_EOF)) { modperl_croak(aTHX_ rc, "APR::Bucket::read"); } if (len) { sv_setpvn(buffer, str, len); } else { sv_setpvn(buffer, "", 0); } /* must run any set magic */ SvSETMAGIC(buffer); SvTAINTED_on(buffer); return len; } static MP_INLINE int mpxs_APR__Bucket_is_eos(apr_bucket *bucket) { return APR_BUCKET_IS_EOS(bucket); } static MP_INLINE int mpxs_APR__Bucket_is_flush(apr_bucket *bucket) { return APR_BUCKET_IS_FLUSH(bucket); } static MP_INLINE void mpxs_APR__Bucket_insert_before(apr_bucket *a, apr_bucket *b) { APR_BUCKET_INSERT_BEFORE(a, b); } static MP_INLINE void mpxs_APR__Bucket_insert_after(apr_bucket *a, apr_bucket *b) { APR_BUCKET_INSERT_AFTER(a, b); } static MP_INLINE void mpxs_APR__Bucket_remove(apr_bucket *bucket) { APR_BUCKET_REMOVE(bucket); } static MP_INLINE apr_status_t mpxs_APR__Bucket_setaside(pTHX_ SV *b_sv, SV *p_sv) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_bucket *b = mp_xs_sv2_APR__Bucket(b_sv); apr_status_t rc = apr_bucket_setaside(b, p); /* if users don't bother to check the success, do it on their * behalf */ if (GIMME_V == G_VOID && rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "APR::Bucket::setaside"); } /* No need to call mpxs_add_pool_magic(b_sv, p_sv); since * pool_bucket_cleanup is called by apr_bucket_pool_make (called * by modperl_bucket_sv_setaside) if the pool goes out of scope, * copying the data to the heap. */ return rc; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/BucketAlloc/0000755000104000010010000000000012540623207017231 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/BucketAlloc/APR__BucketAlloc.h0000644000104000010010000000241512540623207022435 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_bucket.h" #define mpxs_APR__BucketAlloc_destroy apr_bucket_alloc_destroy static MP_INLINE SV *mpxs_APR__BucketAlloc_new(pTHX_ SV *CLASS, SV *p_sv) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p); SV *ba_sv = sv_setref_pv(newSV(0), "APR::BucketAlloc", (void*)ba); mpxs_add_pool_magic(ba_sv, p_sv); return ba_sv; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Const/0000755000104000010010000000000012540623207016127 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Const/Const.pm0000644000104000010010000000212012540623207017546 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package APR::Const; use ModPerl::Const (); use APR (); use XSLoader (); our $VERSION = '0.009000'; our @ISA = qw(ModPerl::Const); XSLoader::load(__PACKAGE__, $VERSION); 1; mod_perl-2.0.9/xs/APR/Const/Const.xs0000644000177200010010000000170412540623207015672 0ustar SteveNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #include "modperl_const.h" MODULE = APR::Const PACKAGE = APR::Const PROTOTYPES: disable BOOT: MP_newModPerlConstXS("APR"); mod_perl-2.0.9/xs/APR/Const/Makefile.PL0000644000104000010010000000052712540623207020105 0ustar AdministratorsNoneuse lib qw(../lib); use ModPerl::BuildMM (); use Apache2::Build; my $build = Apache2::Build->build_config(); my $ccopts = $build->ccopts; # avoid referencing &perl_module outside of mod_perl $ccopts .= ' -DMP_IN_XS'; ModPerl::BuildMM::WriteMakefile( NAME => 'APR::Const', VERSION_FROM => 'Const.pm', CCFLAGS => $ccopts, ); mod_perl-2.0.9/xs/APR/Error/0000755000104000010010000000000012540623207016132 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Error/APR__Error.h0000644000104000010010000000167012540623207020241 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_APR__Error_strerror(rc) modperl_error_strerror(aTHX_ rc) /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Error/Error_pm0000644000104000010010000000364712540623207017654 0ustar AdministratorsNonerequire Carp; require Carp::Heavy; use APR::Util (); use overload nomethod => \&fatal, 'bool' => \&str, '==' => \&num_cmp, '!=' => \&num_cmp_not, '0+' => \&num, '""' => \&str; sub fatal { die __PACKAGE__ . ": Can't handle '$_[3]'" } # normally the object is created on the C side, but if you want to # create one from Perl, you can. just pass a hash with args: # rc, file, line, func sub new { my $class = shift; my %args = @_; bless \%args, $class; } # # - even though most of the time the error id is not useful to the end # users, developers may need to know it. For example in case of a # non-english user locale setting, the error string could be # incomprehensible to a developer, but by having the error id it's # possible to find the english equivalent # - the filename and line number are needed because perl doesn't # provide that info when exception objects are involved sub str { return sprintf "%s: (%d) %s at %s line %d", $_[0]->{func}, $_[0]->{rc}, APR::Error::strerror($_[0]->{rc}), $_[0]->{file}, $_[0]->{line}; } sub num { $_[0]->{rc} } sub num_cmp { $_[0]->{rc} == $_[1] } sub num_cmp_not { $_[0]->{rc} != $_[1] } # skip the wrappers from this package from the long callers trace $Carp::CarpInternal{+__PACKAGE__}++; # XXX: Carp::(confess|cluck) see no calls stack when Perl_croak is # called with (char *)NULL (which is the way exception objects are # returned), so we fixup it here (doesn't quite work for croak # caller). sub cluck { if (ref $_[0] eq __PACKAGE__) { Carp::cluck("$_[0]->{func}: ($_[0]->{rc}) " . APR::Error::strerror($_[0]->{rc})); } else { &Carp::cluck; } } sub confess { if (ref $_[0] eq __PACKAGE__) { Carp::confess("$_[0]->{func}: ($_[0]->{rc}) " . APR::Error::strerror($_[0]->{rc})); } else { &Carp::confess; } } mod_perl-2.0.9/xs/APR/Finfo/0000755000104000010010000000000012540623207016102 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Finfo/APR__Finfo.h0000644000104000010010000000253412540623207020161 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_APR__Finfo_stat(pTHX_ const char *fname, apr_int32_t wanted, SV *p_sv) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_finfo_t *finfo = (apr_finfo_t *)apr_pcalloc(p, sizeof(apr_finfo_t)); SV *finfo_sv; MP_RUN_CROAK(apr_stat(finfo, fname, wanted, p), "APR::Finfo::stat"); finfo_sv = sv_setref_pv(newSV(0), "APR::Finfo", (void*)finfo); mpxs_add_pool_magic(finfo_sv, p_sv); return finfo_sv; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/IpSubnet/0000755000104000010010000000000012540623207016572 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/IpSubnet/APR__IpSubnet.h0000644000104000010010000000260512540623207021340 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_apr_ipsubnet_create(pTHX_ SV *classname, SV *p_sv, const char *ipstr, const char *mask_or_numbits) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_ipsubnet_t *ipsub = NULL; SV *ipsub_sv; MP_RUN_CROAK(apr_ipsubnet_create(&ipsub, ipstr, mask_or_numbits, p), "APR::IpSubnet::new"); ipsub_sv = sv_setref_pv(newSV(0), "APR::IpSubnet", (void*)ipsub); mpxs_add_pool_magic(ipsub_sv, p_sv); return ipsub_sv; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Lock/0000755000104000010010000000000012540623207015731 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Lock/APR__Lock.h0000644000104000010010000000156112540623207017636 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Makefile.PL0000644000177200010010000000020112540623207015103 0ustar SteveNoneuse lib qw(../lib); use ModPerl::BuildMM (); ModPerl::BuildMM::WriteMakefile( NAME => "APR_build", VERSION => '0.01' ); mod_perl-2.0.9/xs/APR/OS/0000755000104000010010000000000012540623207015362 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/OS/APR__OS.h0000644000104000010010000000203412540623207016714 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE unsigned long mpxs_APR__OS_current_thread_id(pTHX) { #if APR_HAS_THREADS return (unsigned long)apr_os_thread_current(); #else return 0; #endif } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/PerlIO/0000755000104000010010000000000012540623210016165 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/PerlIO/Makefile.PL0000644000104000010010000000213012540623207020141 0ustar AdministratorsNoneuse lib qw(../lib); use ModPerl::BuildMM (); use Config; use Apache2::Build; use Apache::TestTrace; my $build = Apache2::Build->build_config(); my $ccopts = $build->ccopts; # when uselargefiles is on, -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 # are needed to get the right 'Off_t', without which perlio compiled # with Off_t as 'long long int', doesn't quite work with apr_perlio.c # compiled with Off_t as 'long int' # # On the other handl if apr is built without large files support, we # have binary compatibility problems, if we try to build mod_perl with # -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 # # XXX: it seems that enabling these flags only for apr_perlio/PerlIO # seems to do the trick if ($build->has_large_files_conflict) { $ccopts .= $Config{uselargefiles} ? ' ' . $Config{ccflags_uselargefiles} : ''; } # avoid referencing &perl_module outside of mod_perl $ccopts .= ' -DMP_IN_XS'; ModPerl::BuildMM::WriteMakefile( NAME => 'APR::PerlIO', VERSION_FROM => 'PerlIO.pm', CCFLAGS => $ccopts, OBJECT => 'PerlIO.o modperl_apr_perlio.o' ); mod_perl-2.0.9/xs/APR/PerlIO/modperl_apr_perlio.c0000644000104000010010000004113412540623207022220 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "modperl_largefiles.h" #include "mod_perl.h" #include "modperl_apr_perlio.h" #if defined(PERLIO_LAYERS) && defined(PERLIO_K_MULTIARG) /* 5.7.2+ */ /********************************************************************** * The PerlIO APR layer. * The PerlIO API is documented in perliol.pod. **********************************************************************/ /* * APR::PerlIO implements a PerlIO layer using apr_file_io as the core. */ /* * XXX: Since we cannot snoop on the internal apr_file_io buffer * currently the IO is not buffered on the Perl side so every read * requests a char at a time, which is slow. Consider copying the * relevant code from PerlIOBuf to implement our own buffer, similar * to what PerlIOBuf does or push :perlio layer on top of this layer */ typedef struct { struct _PerlIO base; apr_file_t *file; apr_pool_t *pool; } PerlIOAPR; static IV PerlIOAPR_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab) { IV code = PerlIOBase_pushed(aTHX_ f, mode, arg, tab); if (*PerlIONext(f)) { /* XXX: not sure if we can do anything here, but see * PerlIOUnix_pushed for things that it does */ } return code; } static PerlIO *PerlIOAPR_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args) { SV *arg = (narg > 0) ? *args : PerlIOArg; PerlIOAPR *st; const char *path; apr_int32_t apr_flag; apr_status_t rc; SV *sv; if (!(SvROK(arg) || SvPOK(arg))) { return NULL; } /* XXX: why passing only SV* for arg, check this out in PerlIO_push */ if (!f) { f = PerlIO_push(aTHX_ PerlIO_allocate(aTHX), self, mode, arg); } else { f = PerlIO_push(aTHX_ f, self, mode, arg); } /* grab the last arg as a filepath */ path = (const char *)SvPV_nolen(args[narg-2]); switch (*mode) { case 'a': apr_flag = APR_APPEND | APR_CREATE; break; case 'w': apr_flag = APR_WRITE | APR_CREATE | APR_TRUNCATE; break; case 'r': apr_flag = APR_READ; break; default: Perl_croak(aTHX_ "unknown open mode: %s", mode); } /* APR_BINARY: we always do binary read and PerlIO is supposed * to handle :crlf if any (by pushing this layer at * open(). * APR_BUFFERED: XXX, not sure if it'll be needed if we will push * :perlio (== PerlIOBuf) layer on top */ apr_flag |= APR_BUFFERED | APR_BINARY; st = PerlIOSelf(f, PerlIOAPR); /* XXX: can't reuse a wrapper mp_xs_sv2_APR__Pool */ /* XXX: should probably add checks on pool validity in all other callbacks */ sv = args[narg-1]; if (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) { st->pool = INT2PTR(apr_pool_t *, SvIV((SV*)SvRV(sv))); } else { Perl_croak(aTHX_ "argument is not a blessed reference " "(expecting an APR::Pool derived object)"); } rc = apr_file_open(&st->file, path, apr_flag, APR_OS_DEFAULT, st->pool); MP_TRACE_o(MP_FUNC, "obj=0x%lx, file=0x%lx, name=%s, rc=%d", (unsigned long)f, (unsigned long)st->file, path ? path : "(UNKNOWN)", rc); if (rc != APR_SUCCESS) { /* it just so happens that since $! is tied to errno, we get * it set right via the system call that apr_file_open has * performed internally, no need to do anything special */ PerlIO_pop(aTHX_ f); return NULL; } PerlIOBase(f)->flags |= PERLIO_F_OPEN; return f; } static IV PerlIOAPR_fileno(pTHX_ PerlIO *f) { /* apr_file_t* is an opaque struct, so fileno is not available. * -1 in this case indicates that the layer cannot provide fileno */ return -1; } static PerlIO *PerlIOAPR_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags) { apr_status_t rc; if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) { PerlIOAPR *fst = PerlIOSelf(f, PerlIOAPR); PerlIOAPR *ost = PerlIOSelf(o, PerlIOAPR); rc = apr_file_dup(&fst->file, ost->file, ost->pool); MP_TRACE_o(MP_FUNC, "obj=0x%lx, " "file=0x%lx => 0x%lx, rc=%d", (unsigned long)f, (unsigned long)ost->file, (unsigned long)fst->file, rc); if (rc == APR_SUCCESS) { fst->pool = ost->pool; return f; } } return NULL; } static SSize_t PerlIOAPR_read(pTHX_ PerlIO *f, void *vbuf, Size_t count) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_status_t rc; rc = apr_file_read(st->file, vbuf, &count); MP_TRACE_o(MP_FUNC, "%db [%s]", (int)count, MP_TRACE_STR_TRUNC(st->pool, (char *)vbuf, (int)count)); if (rc == APR_EOF) { PerlIOBase(f)->flags |= PERLIO_F_EOF; return count; } else if (rc != APR_SUCCESS) { modperl_croak(aTHX_ rc, "APR::PerlIO::read"); } return count; } static SSize_t PerlIOAPR_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_status_t rc; MP_TRACE_o(MP_FUNC, "%db [%s]", (int)count, MP_TRACE_STR_TRUNC(st->pool, (char *)vbuf, (int)count)); rc = apr_file_write(st->file, vbuf, &count); if (rc == APR_SUCCESS) { return (SSize_t) count; } PerlIOBase(f)->flags |= PERLIO_F_ERROR; return (SSize_t) -1; } static IV PerlIOAPR_flush(pTHX_ PerlIO *f) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_status_t rc; rc = apr_file_flush(st->file); if (rc == APR_SUCCESS) { return 0; } PerlIOBase(f)->flags |= PERLIO_F_ERROR; return -1; } static IV PerlIOAPR_seek(pTHX_ PerlIO *f, Off_t offset, int whence) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_seek_where_t where; apr_status_t rc; apr_off_t seek_offset = 0; #ifdef MP_LARGE_FILES_CONFLICT if (offset != 0) { Perl_croak(aTHX_ "PerlIO::APR::seek with non-zero offset" "is not supported with Perl built w/ -Duselargefiles" " and APR w/o largefiles support"); } #else seek_offset = offset; #endif /* Flush the fill buffer */ if (PerlIO_flush(f) != 0) { return -1; } switch(whence) { case 0: where = APR_SET; break; case 1: where = APR_CUR; break; case 2: where = APR_END; break; default: Perl_croak(aTHX_ "unknown whence mode: %d", whence); } rc = apr_file_seek(st->file, where, &seek_offset); if (rc == APR_SUCCESS) { return 0; } return -1; } static Off_t PerlIOAPR_tell(pTHX_ PerlIO *f) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_off_t offset = 0; apr_status_t rc; rc = apr_file_seek(st->file, APR_CUR, &offset); if (rc == APR_SUCCESS) { return (Off_t) offset; } return (Off_t) -1; } static IV PerlIOAPR_close(pTHX_ PerlIO *f) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); IV code = PerlIOBase_close(aTHX_ f); apr_status_t rc; #ifdef MP_TRACE const char *new_path = NULL; apr_os_file_t os_file; #ifdef PERL_PHASE_DESTRUCT if (PL_phase != PERL_PHASE_DESTRUCT) { #else if (!PL_dirty) { #endif /* if this is called during perl_destruct we are in trouble */ apr_file_name_get(&new_path, st->file); } rc = apr_os_file_get(&os_file, st->file); if (rc != APR_SUCCESS) { Perl_croak(aTHX_ "filedes retrieval failed!"); } MP_TRACE_o(MP_FUNC, "obj=0x%lx, file=0x%lx, fd=%d, name=%s", (unsigned long)f, (unsigned long)st->file, os_file, new_path ? new_path : "(UNKNOWN)"); #endif #ifdef PERL_PHASE_DESTRUCT if (PL_phase == PERL_PHASE_DESTRUCT) { #else if (PL_dirty) { #endif /* there should not be any PerlIOAPR handles open * during perl_destruct */ Perl_warn(aTHX_ "leaked PerlIOAPR handle 0x%lx", (unsigned long)f); return -1; } rc = apr_file_flush(st->file); if (rc != APR_SUCCESS) { return -1; } rc = apr_file_close(st->file); if (rc != APR_SUCCESS) { return -1; } return code; } #if 0 /* we may use it if the buffering will be done at this layer */ static IV PerlIOAPR_fill(pTHX_ PerlIO *f) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_status_t rc; SSize_t avail; Size_t count = st->base.bufsiz; if (!st->base.buf) { PerlIO_get_base(f); /* allocate via vtable */ } MP_TRACE_o(MP_FUNC, "asked to fill %d chars", count); rc = apr_file_read(st->file, st->base.ptr, &count); if (rc != APR_SUCCESS) { PerlIOBase(f)->flags |= PERLIO_F_ERROR; return -1; } MP_TRACE_o(MP_FUNC, "got to fill %d chars", count); avail = count; /* apr_file_read() sets how many chars were read in count */ if (avail <= 0) { if (avail == 0) { PerlIOBase(f)->flags |= PERLIO_F_EOF; } else { PerlIOBase(f)->flags |= PERLIO_F_ERROR; } return -1; } st->base.end = st->base.buf + avail; /* indicate that the buffer this layer currently holds unconsumed data read from layer below. */ PerlIOBase(f)->flags |= PERLIO_F_RDBUF; return 0; } #endif static IV PerlIOAPR_eof(pTHX_ PerlIO *f) { PerlIOAPR *st = PerlIOSelf(f, PerlIOAPR); apr_status_t rc; rc = apr_file_eof(st->file); switch (rc) { case APR_EOF: return 1; default: return 0; } return -1; } /* 5.8.0 doesn't export PerlIOBase_noop_fail, so we duplicate it here */ static IV PerlIOAPR_noop_fail(pTHX_ PerlIO *f) { return -1; } static PerlIO_funcs PerlIO_APR = { sizeof(PerlIO_funcs), "APR", sizeof(PerlIOAPR), PERLIO_K_MULTIARG | PERLIO_K_RAW, PerlIOAPR_pushed, PerlIOBase_popped, PerlIOAPR_open, PerlIOBase_binmode, /* binmode() is handled by :crlf */ NULL, /* no getarg needed */ PerlIOAPR_fileno, PerlIOAPR_dup, PerlIOAPR_read, PerlIOBase_unread, PerlIOAPR_write, PerlIOAPR_seek, PerlIOAPR_tell, PerlIOAPR_close, PerlIOAPR_flush, /* flush */ PerlIOAPR_noop_fail, /* fill */ PerlIOAPR_eof, PerlIOBase_error, PerlIOBase_clearerr, PerlIOBase_setlinebuf, NULL, /* get_base */ NULL, /* get_bufsiz */ NULL, /* get_ptr */ NULL, /* get_cnt */ NULL, /* set_ptrcnt */ }; void modperl_apr_perlio_init(pTHX) { APR_REGISTER_OPTIONAL_FN(modperl_apr_perlio_apr_file_to_PerlIO); APR_REGISTER_OPTIONAL_FN(modperl_apr_perlio_apr_file_to_glob); PerlIO_define_layer(aTHX_ &PerlIO_APR); } /* ***** End of PerlIOAPR tab ***** */ /* ***** PerlIO <=> apr_file_t helper functions ***** */ PerlIO *modperl_apr_perlio_apr_file_to_PerlIO(pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type) { char *mode; const char *layers = ":APR"; PerlIOAPR *st; PerlIO *f = PerlIO_allocate(aTHX); if (!f) { Perl_croak(aTHX_ "Failed to allocate PerlIO struct"); } switch (type) { case MODPERL_APR_PERLIO_HOOK_WRITE: mode = "w"; break; case MODPERL_APR_PERLIO_HOOK_READ: mode = "r"; break; default: Perl_croak(aTHX_ "unknown MODPERL_APR_PERLIO type: %d", type); }; PerlIO_apply_layers(aTHX_ f, mode, layers); if (!f) { Perl_croak(aTHX_ "Failed to apply the ':APR' layer"); } st = PerlIOSelf(f, PerlIOAPR); #ifdef MP_TRACE { apr_status_t rc; apr_os_file_t os_file; /* convert to the OS representation of file */ rc = apr_os_file_get(&os_file, file); if (rc != APR_SUCCESS) { croak("filedes retrieval failed!"); } MP_TRACE_o(MP_FUNC, "converting to PerlIO fd %d, mode '%s'", os_file, mode); } #endif st->pool = pool; st->file = file; PerlIOBase(f)->flags |= PERLIO_F_OPEN; return f; } static SV *modperl_apr_perlio_PerlIO_to_glob(pTHX_ PerlIO *pio, modperl_apr_perlio_hook_e type) { SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO"); GV *gv = (GV*)SvRV(retval); gv_IOadd(gv); switch (type) { case MODPERL_APR_PERLIO_HOOK_WRITE: /* if IoIFP() is not assigned to it'll be never closed, see * Perl_io_close() */ IoIFP(GvIOp(gv)) = IoOFP(GvIOp(gv)) = pio; IoFLAGS(GvIOp(gv)) |= IOf_FLUSH; IoTYPE(GvIOp(gv)) = IoTYPE_WRONLY; break; case MODPERL_APR_PERLIO_HOOK_READ: IoIFP(GvIOp(gv)) = pio; IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY; break; }; return sv_2mortal(retval); } SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type) { return modperl_apr_perlio_PerlIO_to_glob(aTHX_ modperl_apr_perlio_apr_file_to_PerlIO(aTHX_ file, pool, type), type); } #else /* defined(PERLIO_LAYERS) (5.6.x) */ #ifdef USE_PERLIO /* 5.6.x + -Duseperlio */ #define MP_IO_TYPE PerlIO #else #define MP_IO_TYPE FILE #endif static MP_IO_TYPE *modperl_apr_perlio_apr_file_to_PerlIO(pTHX_ apr_file_t *file, modperl_apr_perlio_hook_e type) { MP_IO_TYPE *retval; char *mode; int fd; apr_os_file_t os_file; apr_status_t rc; switch (type) { case MODPERL_APR_PERLIO_HOOK_WRITE: mode = "w"; break; case MODPERL_APR_PERLIO_HOOK_READ: mode = "r"; break; }; /* convert to the OS representation of file */ rc = apr_os_file_get(&os_file, file); if (rc != APR_SUCCESS) { Perl_croak(aTHX_ "filedes retrieval failed!"); } MP_TRACE_o(MP_FUNC, "converting fd %d", os_file); /* let's try without the dup, it seems to work fine: fd = PerlLIO_dup(os_file); MP_TRACE_o(MP_FUNC, "fd old: %d, new %d", os_file, fd); if (!(retval = PerlIO_fdopen(fd, mode))) { ... } in any case if we later decide to dup, remember to: apr_file_close(file); after PerlIO_fdopen() or that fh will be leaked */ if (!(retval = PerlIO_fdopen(os_file, mode))) { PerlLIO_close(fd); Perl_croak(aTHX_ "fdopen failed!"); } return retval; } SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type) { SV *retval = modperl_perl_gensym(aTHX_ "APR::PerlIO"); GV *gv = (GV*)SvRV(retval); gv_IOadd(gv); switch (type) { case MODPERL_APR_PERLIO_HOOK_WRITE: IoIFP(GvIOp(gv)) = IoOFP(GvIOp(gv)) = modperl_apr_perlio_apr_file_to_PerlIO(aTHX_ file, type); IoFLAGS(GvIOp(gv)) |= IOf_FLUSH; IoTYPE(GvIOp(gv)) = IoTYPE_WRONLY; break; case MODPERL_APR_PERLIO_HOOK_READ: IoIFP(GvIOp(gv)) = modperl_apr_perlio_apr_file_to_PerlIO(aTHX_ file, type); IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY; break; }; return sv_2mortal(retval); } void modperl_apr_perlio_init(pTHX) { APR_REGISTER_OPTIONAL_FN(modperl_apr_perlio_apr_file_to_glob); } #endif /* PERLIO_LAYERS */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/PerlIO/modperl_apr_perlio.h0000644000104000010010000000477712540623207022241 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_APR_PERLIO_H #define MODPERL_APR_PERLIO_H #ifdef PERLIO_LAYERS #include "perliol.h" #else #include "iperlsys.h" #endif #include "apr_portable.h" #include "apr_file_io.h" #include "apr_errno.h" #ifndef MP_SOURCE_SCAN #include "apr_optional.h" #endif /* 5.6.0 */ #ifndef IoTYPE_RDONLY #define IoTYPE_RDONLY '<' #endif #ifndef IoTYPE_WRONLY #define IoTYPE_WRONLY '>' #endif typedef enum { MODPERL_APR_PERLIO_HOOK_READ, MODPERL_APR_PERLIO_HOOK_WRITE } modperl_apr_perlio_hook_e; #ifndef MP_SOURCE_SCAN void modperl_apr_perlio_init(pTHX); #endif /* The following functions can be used from other .so libs, they just * need to load APR::PerlIO perl module first */ #ifndef MP_SOURCE_SCAN #ifdef PERLIO_LAYERS PerlIO *modperl_apr_perlio_apr_file_to_PerlIO(pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type); APR_DECLARE_OPTIONAL_FN(PerlIO *, modperl_apr_perlio_apr_file_to_PerlIO, (pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type)); #endif /* PERLIO_LAYERS */ SV *modperl_apr_perlio_apr_file_to_glob(pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type); APR_DECLARE_OPTIONAL_FN(SV *, modperl_apr_perlio_apr_file_to_glob, (pTHX_ apr_file_t *file, apr_pool_t *pool, modperl_apr_perlio_hook_e type)); #endif /* MP_SOURCE_SCAN */ #endif /* MODPERL_APR_PERLIO_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/PerlIO/PerlIO.pm0000644000104000010010000000231112540623210017652 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package APR::PerlIO; require 5.006001; our $VERSION = '0.009000'; # The PerlIO layer is available only since 5.8.0 (5.7.2@13534) use Config; use constant PERLIO_LAYERS_ARE_ENABLED => $Config{useperlio} && $] >= 5.007003; use APR (); use APR::XSLoader (); APR::XSLoader::load __PACKAGE__; 1; mod_perl-2.0.9/xs/APR/PerlIO/PerlIO.xs0000644000177200010010000000170512540623210015775 0ustar SteveNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #include "modperl_apr_perlio.h" MODULE = APR::PerlIO PACKAGE = APR::PerlIO PROTOTYPES: disabled BOOT: modperl_apr_perlio_init(aTHX); mod_perl-2.0.9/xs/APR/Pool/0000755000104000010010000000000012540623210015744 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Pool/APR__Pool.h0000644000104000010010000003424612540623210017700 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define MP_APR_POOL_NEW "APR::Pool::new" typedef struct { SV *sv; #ifdef USE_ITHREADS PerlInterpreter *perl; modperl_interp_t *interp; #endif } mpxs_pool_account_t; /* XXX: this implementation has a problem with perl ithreads. if a * custom pool is allocated, and then a thread is spawned we now have * two copies of the pool object, each living in a different perl * interpreter, both pointing to the same memory address of the apr * pool. * * need to write a CLONE class method could properly clone the * thread's copied object, but it's tricky: * - it needs to call parent_get() on the copied object and allocate a * new pool from that parent's pool * - it needs to reinstall any registered cleanup callbacks (can we do * that?) may be we can skip those? */ #ifndef MP_SOURCE_SCAN #ifdef USE_ITHREADS #include "apr_optional.h" APR_OPTIONAL_FN_TYPE(modperl_interp_unselect) *modperl_opt_interp_unselect; APR_OPTIONAL_FN_TYPE(modperl_thx_interp_get) *modperl_opt_thx_interp_get; #endif #endif #define MP_APR_POOL_SV_HAS_OWNERSHIP(sv) mpxs_pool_is_custom(sv) /* before the magic is freed, one needs to carefully detach the * dependant pool magic added by mpxs_add_pool_magic (most of the time * it'd be a parent pool), and postpone its destruction, until after * the child pool is destroyed. Since if we don't do that the * destruction of the parent pool will destroy the child pool C guts * and when perl unware of that the rug was pulled under the feet will * continue destructing the child pool, things will crash */ #define MP_APR_POOL_SV_DROPS_OWNERSHIP_RUN(acct) STMT_START { \ MAGIC *mg = mg_find(acct->sv, PERL_MAGIC_ext); \ if (mg && mg->mg_obj) { \ sv_2mortal(mg->mg_obj); \ mg->mg_obj = (SV *)NULL; \ mg->mg_flags &= ~MGf_REFCOUNTED; \ } \ mg_free(acct->sv); \ SvIVX(acct->sv) = 0; \ } STMT_END #ifdef USE_ITHREADS #define MP_APR_POOL_SV_DROPS_OWNERSHIP(acct) STMT_START { \ dTHXa(acct->perl); \ MP_APR_POOL_SV_DROPS_OWNERSHIP_RUN(acct); \ if (modperl_opt_interp_unselect && acct->interp) { \ /* this will decrement the interp refcnt until \ * there are no more references, in which case \ * the interpreter will be putback into the mip \ */ \ MP_TRACE_i(MP_FUNC, "DO: calling interp_unselect(0x%lx)", \ acct->interp); \ (void)modperl_opt_interp_unselect(acct->interp); \ } \ } STMT_END #define MP_APR_POOL_SV_TAKES_OWNERSHIP(acct_sv, pool) STMT_START { \ mpxs_pool_account_t *acct = apr_palloc(pool, sizeof *acct); \ acct->sv = acct_sv; \ acct->perl = aTHX; \ SvIVX(acct_sv) = PTR2IV(pool); \ \ sv_magic(acct_sv, (SV *)NULL, PERL_MAGIC_ext, \ MP_APR_POOL_NEW, sizeof(MP_APR_POOL_NEW)); \ \ apr_pool_cleanup_register(pool, (void *)acct, \ mpxs_apr_pool_cleanup, \ apr_pool_cleanup_null); \ \ /* make sure interpreter is not putback into the mip \ * until this cleanup has run. \ */ \ if (modperl_opt_thx_interp_get) { \ if ((acct->interp = modperl_opt_thx_interp_get(aTHX))) { \ acct->interp->refcnt++; \ MP_TRACE_i(MP_FUNC, "TO: (0x%lx)->refcnt incremented to %ld", \ acct->interp, acct->interp->refcnt); \ } \ } \ } STMT_END #else /* !USE_ITHREADS */ #define MP_APR_POOL_SV_DROPS_OWNERSHIP MP_APR_POOL_SV_DROPS_OWNERSHIP_RUN #define MP_APR_POOL_SV_TAKES_OWNERSHIP(acct_sv, pool) STMT_START { \ mpxs_pool_account_t *acct = apr_palloc(pool, sizeof *acct); \ acct->sv = acct_sv; \ SvIVX(acct_sv) = PTR2IV(pool); \ \ sv_magic(acct_sv, (SV *)NULL, PERL_MAGIC_ext, \ MP_APR_POOL_NEW, sizeof(MP_APR_POOL_NEW)); \ \ apr_pool_cleanup_register(pool, (void *)acct, \ mpxs_apr_pool_cleanup, \ apr_pool_cleanup_null); \ } STMT_END #endif /* USE_ITHREADS */ /* XXX: should we make it a new global tracing category * MOD_PERL_TRACE=p for tracing pool management? */ #define MP_POOL_TRACE_DO 0 #if MP_POOL_TRACE_DO && defined(MP_TRACE) #define MP_POOL_TRACE modperl_trace #else #define MP_POOL_TRACE if (0) modperl_trace #endif /* invalidate all Perl objects referencing the data sv stored in the * pool and the sv itself. this is needed when a parent pool triggers * apr_pool_destroy on its child pools */ static MP_INLINE apr_status_t mpxs_apr_pool_cleanup(void *cleanup_data) { mpxs_pool_account_t *acct = cleanup_data; MP_APR_POOL_SV_DROPS_OWNERSHIP(acct); return APR_SUCCESS; } /** * Create a new pool or subpool. * @param parent_pool_obj an APR::Pool object or an "APR::Pool" class * @return a new pool or subpool */ static MP_INLINE SV *mpxs_apr_pool_create(pTHX_ SV *parent_pool_obj) { apr_pool_t *parent_pool = mpxs_sv_object_deref(parent_pool_obj, apr_pool_t); apr_pool_t *child_pool = NULL; MP_POOL_TRACE(MP_FUNC, "parent pool 0x%l", (unsigned long)parent_pool); (void)apr_pool_create(&child_pool, parent_pool); #if APR_POOL_DEBUG /* useful for pools debugging, can grep for APR::Pool::new */ apr_pool_tag(child_pool, MP_APR_POOL_NEW); #endif /* allocation corruption validation: I saw this happening when the * same pool was destroyed more than once, should be fixed now, * but still the check is not redundant */ if (child_pool == parent_pool) { Perl_croak(aTHX_ "a newly allocated sub-pool 0x%lx " "is the same as its parent 0x%lx, aborting", (unsigned long)child_pool, (unsigned long)parent_pool); } #if APR_POOL_DEBUG /* child <-> parent <-> ... <-> top ancestry traversal */ { apr_pool_t *p = child_pool; apr_pool_t *pp; while ((pp = apr_pool_parent_get(p))) { MP_POOL_TRACE(MP_FUNC, "parent 0x%lx, child 0x%lx", (unsigned long)pp, (unsigned long)p); if (apr_pool_is_ancestor(pp, p)) { MP_POOL_TRACE(MP_FUNC, "0x%lx is a subpool of 0x%lx", (unsigned long)p, (unsigned long)pp); } p = pp; } } #endif { SV *rv = sv_setref_pv(newSV(0), "APR::Pool", (void*)child_pool); SV *sv = SvRV(rv); /* Each newly created pool must be destroyed only once. Calling * apr_pool_destroy will destroy the pool and its children pools, * however a perl object for a sub-pool will still keep a pointer * to the pool which was already destroyed. When this object is * DESTROYed, apr_pool_destroy will be called again. In the best * case it'll try to destroy a non-existing pool, but in the worst * case it'll destroy a different valid pool which has been given * the same memory allocation wrecking havoc. Therefore we must * ensure that when sub-pools are destroyed via the parent pool, * their cleanup callbacks will destroy the guts of their perl * objects, so when those perl objects, pointing to memory * previously allocated by destroyed sub-pools or re-used already * by new pools, will get their time to DESTROY, they won't make a * mess, trying to destroy an already destroyed pool or even worse * a pool allocate in the place of the old one. */ MP_APR_POOL_SV_TAKES_OWNERSHIP(sv, child_pool); MP_POOL_TRACE(MP_FUNC, "sub-pool p: 0x%lx, sv: 0x%lx, rv: 0x%lx", (unsigned long)child_pool, sv, rv); if (parent_pool) { mpxs_add_pool_magic(rv, parent_pool_obj); } return rv; } } static MP_INLINE void mpxs_APR__Pool_clear(pTHX_ SV *obj) { apr_pool_t *p = mp_xs_sv2_APR__Pool(obj); SV *sv = SvRV(obj); if (!MP_APR_POOL_SV_HAS_OWNERSHIP(sv)) { MP_POOL_TRACE(MP_FUNC, "parent pool (0x%lx) is a core pool", (unsigned long)p); apr_pool_clear(p); return; } MP_POOL_TRACE(MP_FUNC, "parent pool (0x%lx) is a custom pool, sv 0x%lx", (unsigned long)p, (unsigned long)sv); apr_pool_clear(p); /* apr_pool_clear runs & removes the cleanup, so we need to restore * it. Since clear triggers mpxs_apr_pool_cleanup call, our * object's guts get nuked too, so we need to restore them too */ MP_APR_POOL_SV_TAKES_OWNERSHIP(sv, p); } typedef struct { SV *cv; SV *arg; apr_pool_t *p; #ifdef USE_ITHREADS PerlInterpreter *perl; modperl_interp_t *interp; #endif } mpxs_cleanup_t; /** * callback wrapper for Perl cleanup subroutines * @param data internal storage */ static apr_status_t mpxs_cleanup_run(void *data) { int count; mpxs_cleanup_t *cdata = (mpxs_cleanup_t *)data; #ifdef USE_ITHREADS dTHXa(cdata->perl); #endif dSP; ENTER;SAVETMPS; PUSHMARK(SP); if (cdata->arg) { XPUSHs(cdata->arg); } PUTBACK; save_gp(PL_errgv, 1); /* local *@ */ count = call_sv(cdata->cv, G_SCALAR|G_EVAL); SPAGAIN; if (count == 1) { (void)POPs; /* the return value is ignored */ } if (SvTRUE(ERRSV)) { Perl_warn(aTHX_ "APR::Pool: cleanup died: %s", SvPV_nolen(ERRSV)); } PUTBACK; FREETMPS;LEAVE; SvREFCNT_dec(cdata->cv); if (cdata->arg) { SvREFCNT_dec(cdata->arg); } #ifdef USE_ITHREADS if (cdata->interp && modperl_opt_interp_unselect) { /* this will decrement the interp refcnt until * there are no more references, in which case * the interpreter will be putback into the mip */ MP_TRACE_i(MP_FUNC, "calling interp_unselect(0x%lx)", cdata->interp); (void)modperl_opt_interp_unselect(cdata->interp); } #endif /* the return value is ignored by apr_pool_destroy anyway */ return APR_SUCCESS; } /** * register cleanups to run * @param p pool with which to associate the cleanup * @param cv subroutine reference to run * @param arg optional argument to pass to the subroutine */ static MP_INLINE void mpxs_apr_pool_cleanup_register(pTHX_ apr_pool_t *p, SV *cv, SV *arg) { mpxs_cleanup_t *data = (mpxs_cleanup_t *)apr_pcalloc(p, sizeof(*data)); data->cv = SvREFCNT_inc(cv); data->arg = arg ? SvREFCNT_inc(arg) : (SV *)NULL; data->p = p; #ifdef USE_ITHREADS data->perl = aTHX; /* make sure interpreter is not putback into the mip * until this cleanup has run. */ if (modperl_opt_thx_interp_get) { if ((data->interp = modperl_opt_thx_interp_get(data->perl))) { data->interp->refcnt++; MP_TRACE_i(MP_FUNC, "(0x%lx)->refcnt incremented to %ld", data->interp, data->interp->refcnt); } } #endif apr_pool_cleanup_register(p, data, mpxs_cleanup_run, apr_pool_cleanup_null); } static MP_INLINE SV * mpxs_apr_pool_parent_get(pTHX_ apr_pool_t *child_pool) { apr_pool_t *parent_pool = apr_pool_parent_get(child_pool); if (parent_pool) { return SvREFCNT_inc(mp_xs_APR__Pool_2obj(parent_pool)); } else { MP_POOL_TRACE(MP_FUNC, "pool (0x%lx) has no parents", (unsigned long)child_pool); return &PL_sv_undef; } } /** * destroy a pool * @param obj an APR::Pool object */ static MP_INLINE void mpxs_apr_pool_DESTROY(pTHX_ SV *obj) { SV *sv = SvRV(obj); if (MP_APR_POOL_SV_HAS_OWNERSHIP(sv)) { apr_pool_t *p = mpxs_sv_object_deref(obj, apr_pool_t); apr_pool_destroy(p); } } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/SockAddr/0000755000104000010010000000000012540623210016525 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/SockAddr/APR__SockAddr.h0000644000104000010010000000204112540623210021226 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE char * mpxs_apr_sockaddr_ip_get(pTHX_ apr_sockaddr_t *sockaddr) { char *addr = NULL; (void)apr_sockaddr_ip_get(&addr, sockaddr); return addr; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Socket/0000755000104000010010000000000012540623210016263 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Socket/APR__Socket.h0000644000104000010010000000745312540623210020536 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE apr_size_t mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket, SV *buffer, apr_size_t len) { apr_status_t rc; mpxs_sv_grow(buffer, len); rc = apr_socket_recv(socket, SvPVX(buffer), &len); if (!(rc == APR_SUCCESS || rc == APR_EOF)) { modperl_croak(aTHX_ rc, "APR::Socket::recv"); } mpxs_sv_cur_set(buffer, len); SvTAINTED_on(buffer); return len; } static MP_INLINE apr_size_t mpxs_apr_socket_send(pTHX_ apr_socket_t *socket, SV *sv_buf, SV *sv_len) { apr_size_t buf_len; char *buffer = SvPV(sv_buf, buf_len); if (sv_len) { if (buf_len < SvIV(sv_len)) { Perl_croak(aTHX_ "the 3rd arg (%d) is bigger than the " "length (%d) of the 2nd argument", (int)SvIV(sv_len), buf_len); } buf_len = SvIV(sv_len); } MP_RUN_CROAK(apr_socket_send(socket, buffer, &buf_len), "APR::Socket::send"); return buf_len; } static MP_INLINE apr_interval_time_t mpxs_apr_socket_timeout_get(pTHX_ I32 items, SV **MARK, SV **SP) { apr_interval_time_t t; APR__Socket APR__Socket; /* this also magically assings to APR_Socket ;-) */ mpxs_usage_va_1(APR__Socket, "$socket->timeout_get()"); MP_RUN_CROAK(apr_socket_timeout_get(APR__Socket, &t), "APR::Socket::timeout_get"); return t; } static MP_INLINE void mpxs_APR__Socket_timeout_set(pTHX_ apr_socket_t *socket, apr_interval_time_t t) { MP_RUN_CROAK(apr_socket_timeout_set(socket, t), "APR::Socket::timeout_set"); } static MP_INLINE apr_int32_t mpxs_APR__Socket_opt_get(pTHX_ apr_socket_t *socket, apr_int32_t opt) { apr_int32_t val; MP_RUN_CROAK(apr_socket_opt_get(socket, opt, &val), "APR::Socket::opt_get"); return val; } static MP_INLINE void mpxs_APR__Socket_opt_set(pTHX_ apr_socket_t *socket, apr_int32_t opt, apr_int32_t val) { MP_RUN_CROAK(apr_socket_opt_set(socket, opt, val), "APR::Socket::opt_set"); } static MP_INLINE apr_status_t mpxs_APR__Socket_poll(apr_socket_t *socket, apr_pool_t *pool, apr_interval_time_t timeout, apr_int16_t reqevents) { apr_pollfd_t fd; apr_int32_t nsds; /* what to poll */ fd.p = pool; fd.desc_type = APR_POLL_SOCKET; fd.desc.s = socket; fd.reqevents = reqevents; fd.rtnevents = 0; /* XXX: not really necessary to set this */ return apr_poll(&fd, 1, &nsds, timeout); } #ifndef WIN32 static MP_INLINE int mpxs_APR__Socket_fileno(pTHX_ apr_socket_t *socket) { apr_os_sock_t s; apr_os_sock_get(&s, socket); return s; } #endif /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Status/0000755000104000010010000000000012540623210016316 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Status/APR__Status.h0000644000104000010010000000250312540623210020613 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "apr_errno.h" #define mpxs_APR__Status_is_EAGAIN APR_STATUS_IS_EAGAIN #define mpxs_APR__Status_is_EACCES APR_STATUS_IS_EACCES #define mpxs_APR__Status_is_ENOENT APR_STATUS_IS_ENOENT #define mpxs_APR__Status_is_EOF APR_STATUS_IS_EOF #define mpxs_APR__Status_is_ECONNABORTED APR_STATUS_IS_ECONNABORTED #define mpxs_APR__Status_is_ECONNRESET APR_STATUS_IS_ECONNRESET #define mpxs_APR__Status_is_TIMEUP APR_STATUS_IS_TIMEUP /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/String/0000755000104000010010000000000012540623210016301 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/String/APR__String.h0000644000104000010010000000201312540623210020555 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE SV *mpxs_APR__String_strfsize(pTHX_ apr_off_t size) { char buff[5]; apr_strfsize(size, buff); return newSVpvn(buff, 4); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Table/0000755000104000010010000000000012540623210016062 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Table/APR__Table.h0000644000104000010010000001520312540623210020124 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_APR__Table_STORE apr_table_set #define mpxs_APR__Table_DELETE apr_table_unset #define mpxs_APR__Table_CLEAR apr_table_clear #define MPXS_DO_TABLE_N_MAGIC_RETURN(call) \ apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); \ apr_table_t *t = call; \ SV *t_sv = modperl_hash_tie(aTHX_ "APR::Table", (SV *)NULL, t); \ mpxs_add_pool_magic(t_sv, p_sv); \ return t_sv; static MP_INLINE SV *mpxs_APR__Table_make(pTHX_ SV *p_sv, int nelts) { MPXS_DO_TABLE_N_MAGIC_RETURN(apr_table_make(p, nelts)); } static MP_INLINE SV *mpxs_APR__Table_copy(pTHX_ apr_table_t *base, SV *p_sv) { MPXS_DO_TABLE_N_MAGIC_RETURN(apr_table_copy(p, base)); } static MP_INLINE SV *mpxs_APR__Table_overlay(pTHX_ apr_table_t *base, apr_table_t *overlay, SV *p_sv) { MPXS_DO_TABLE_N_MAGIC_RETURN(apr_table_overlay(p, overlay, base)); } typedef struct { SV *cv; apr_hash_t *filter; PerlInterpreter *perl; } mpxs_table_do_cb_data_t; typedef int (*mpxs_apr_table_do_cb_t)(void *, const char *, const char *); static int mpxs_apr_table_do_cb(void *data, const char *key, const char *val) { mpxs_table_do_cb_data_t *tdata = (mpxs_table_do_cb_data_t *)data; dTHXa(tdata->perl); dSP; int rv = 0; /* Skip completely if something is wrong */ if (!(tdata && tdata->cv && key && val)) { return 0; } /* Skip entries if not in our filter list */ if (tdata->filter) { if (!apr_hash_get(tdata->filter, key, APR_HASH_KEY_STRING)) { return 1; } } ENTER; SAVETMPS; PUSHMARK(sp); XPUSHs(sv_2mortal(newSVpv(key,0))); XPUSHs(sv_2mortal(newSVpv(val,0))); PUTBACK; rv = call_sv(tdata->cv, 0); SPAGAIN; rv = (1 == rv) ? POPi : 1; PUTBACK; FREETMPS; LEAVE; /* rv of 0 aborts the traversal */ return rv; } static MP_INLINE int mpxs_apr_table_do(pTHX_ I32 items, SV **MARK, SV **SP) { apr_table_t *table; SV *sub; mpxs_table_do_cb_data_t tdata; mpxs_usage_va_2(table, sub, "$table->do(sub, [@filter])"); tdata.cv = sub; tdata.filter = NULL; #ifdef USE_ITHREADS tdata.perl = aTHX; #endif if (items > 2) { char *filter_entry; STRLEN len; tdata.filter = apr_hash_make(apr_table_elts(table)->pool); while (MARK <= SP) { filter_entry = SvPV(*MARK, len); apr_hash_set(tdata.filter, filter_entry, len, "1"); MARK++; } } /* XXX: would be nice to be able to call apr_table_vdo directly, * but I don't think it's possible to create/populate something * that smells like a va_list with our list of filters specs */ apr_table_do(mpxs_apr_table_do_cb, (void *)&tdata, table, NULL); /* Free tdata.filter or wait for the pool to go away? */ /* XXX: return return value of apr_table_do once we require newer httpd */ return 1; } static MP_INLINE int mpxs_APR__Table_EXISTS(apr_table_t *t, const char *key) { return (NULL == apr_table_get(t, key)) ? 0 : 1; } /* Note: SvCUR is used as the iterator state counter, why not ;-? */ #define mpxs_apr_table_iterix(sv) \ SvCUR(SvRV(sv)) #define mpxs_apr_table_nextkey(t, sv) \ ((apr_table_entry_t *) \ apr_table_elts(t)->elts)[mpxs_apr_table_iterix(sv)++].key static MP_INLINE const char *mpxs_APR__Table_NEXTKEY(pTHX_ SV *tsv, SV *key) { apr_table_t *t; SV *rv = modperl_hash_tied_object_rv(aTHX_ "APR::Table", tsv); if (!SvROK(rv)) { Perl_croak(aTHX_ "Usage: $table->NEXTKEY($key): " "first argument not an APR::Table object"); } t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv))); if (apr_is_empty_table(t)) { return NULL; } if (key == NULL) { mpxs_apr_table_iterix(rv) = 0; /* reset iterator index */ } if (mpxs_apr_table_iterix(rv) < apr_table_elts(t)->nelts) { return mpxs_apr_table_nextkey(t, rv); } mpxs_apr_table_iterix(rv) = 0; return NULL; } /* Try to shortcut apr_table_get by fetching the key using the current * iterator (unless it's inactive or points at different key). */ static MP_INLINE const char *mpxs_APR__Table_FETCH(pTHX_ SV *tsv, const char *key) { SV* rv = modperl_hash_tied_object_rv(aTHX_ "APR::Table", tsv); const int i = mpxs_apr_table_iterix(rv); apr_table_t *t = INT2PTR(apr_table_t *, SvIVX(SvRV(rv))); const apr_array_header_t *arr = apr_table_elts(t); apr_table_entry_t *elts = (apr_table_entry_t *)arr->elts; if (i > 0 && i <= arr->nelts && !strcasecmp(key, elts[i-1].key)) { return elts[i-1].val; } else { return apr_table_get(t, key); } } MP_STATIC XS(MPXS_apr_table_get) { dXSARGS; if (items != 2) { Perl_croak(aTHX_ "Usage: $table->get($key)"); } mpxs_PPCODE({ APR__Table t = modperl_hash_tied_object(aTHX_ "APR::Table", ST(0)); const char *key = (const char *)SvPV_nolen(ST(1)); if (!t) { XSRETURN_UNDEF; } if (GIMME_V == G_SCALAR) { const char *val = apr_table_get(t, key); if (val) { XPUSHs(sv_2mortal(newSVpv((char*)val, 0))); } } else { const apr_array_header_t *arr = apr_table_elts(t); apr_table_entry_t *elts = (apr_table_entry_t *)arr->elts; int i; for (i = 0; i < arr->nelts; i++) { if (!elts[i].key || strcasecmp(elts[i].key, key)) { continue; } XPUSHs(sv_2mortal(newSVpv(elts[i].val,0))); } } }); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/ThreadMutex/0000755000104000010010000000000012540623210017265 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/ThreadMutex/APR__ThreadMutex.h0000644000104000010010000000253212540623210022533 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define apr_thread_mutex_DESTROY apr_thread_mutex_destroy static MP_INLINE SV *mpxs_apr_thread_mutex_create(pTHX_ SV *classname, SV *p_sv, unsigned int flags) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_thread_mutex_t *mutex = NULL; SV *mutex_sv; (void)apr_thread_mutex_create(&mutex, flags, p); mutex_sv = sv_setref_pv(newSV(0), "APR::ThreadMutex", (void*)mutex); mpxs_add_pool_magic(mutex_sv, p_sv); return mutex_sv; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/ThreadRWLock/0000755000104000010010000000000012540623210017324 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/ThreadRWLock/APR__ThreadRWLock.h0000644000104000010010000000245312540623210022633 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define apr_thread_rwlock_DESTROY apr_thread_rwlock_destroy static MP_INLINE SV *mpxs_apr_thread_rwlock_create(pTHX_ SV *classname, SV *p_sv) { apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); apr_thread_rwlock_t *rwlock = NULL; SV *rwlock_sv; (void)apr_thread_rwlock_create(&rwlock, p); rwlock_sv = sv_setref_pv(newSV(0), "APR::ThreadRWLock", (void*)rwlock); mpxs_add_pool_magic(rwlock_sv, p_sv); return rwlock_sv; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/URI/0000755000104000010010000000000012540623210015472 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/URI/APR__URI.h0000644000104000010010000000572512540623210017154 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE char *mpxs_apr_uri_unparse(pTHX_ apr_uri_t *uptr, unsigned flags) { /* apr =< 0.9.2-dev segfaults if hostname is set, but scheme is not. * apr >= 0.9.2 simply uses "", which will force the user to set scheme * since apr_uri_unparse is protocol-agnostic, it doesn't use * 'http' as the default fallback anymore. so we use the same solution */ #if APR_MAJOR_VERSION == 0 && APR_MINOR_VERSION == 9 && \ (APR_PATCH_VERSION < 2 || APR_PATCH_VERSION == 2 && defined APR_IS_DEV_VERSION) if (uptr->hostname && !uptr->scheme) { uptr->scheme = ""; } #endif return apr_uri_unparse(((modperl_uri_t *)uptr)->pool, uptr, flags); } static MP_INLINE SV *mpxs_apr_uri_parse(pTHX_ SV *classname, SV *p_sv, const char *uri_string) { SV *uri_sv; apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); modperl_uri_t *uri = modperl_uri_new(p); (void)apr_uri_parse(p, uri_string, &uri->uri); uri_sv = sv_setref_pv(newSV(0), "APR::URI", (void*)uri); mpxs_add_pool_magic(uri_sv, p_sv); return uri_sv; } static MP_INLINE char *mpxs_APR__URI_port(pTHX_ apr_uri_t *uri, SV *portsv) { char *port_str = uri->port_str; if (portsv) { if (SvOK(portsv)) { STRLEN len; char *port = SvPV(portsv, len); uri->port_str = apr_pstrndup(((modperl_uri_t *)uri)->pool, port, len); uri->port = (int)SvIV(portsv); } else { uri->port_str = NULL; uri->port = 0; } } return port_str; } static MP_INLINE SV *mpxs_APR__URI_rpath(pTHX_ apr_uri_t *apr_uri) { modperl_uri_t *uri = (modperl_uri_t *)apr_uri; if (uri->path_info) { int uri_len = strlen(uri->uri.path); int n = strlen(uri->path_info); int set = uri_len - n; if (set > 0) { return newSVpv(uri->uri.path, set); } } else { if (uri->uri.path) { return newSVpv(uri->uri.path, 0); } } return (SV *)NULL; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/Util/0000755000104000010010000000000012540623210015750 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/Util/APR__Util.h0000644000104000010010000000210112540623210017671 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE int mpxs_apr_password_validate(pTHX_ const char *passwd, const char *hash) { return apr_password_validate(passwd, hash) == APR_SUCCESS; } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/APR/UUID/0000755000104000010010000000000012540623210015601 5ustar AdministratorsNonemod_perl-2.0.9/xs/APR/UUID/APR__UUID.h0000644000104000010010000000327312540623210017366 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define mpxs_apr_uuid_alloc() \ (apr_uuid_t *)safemalloc(sizeof(apr_uuid_t)) static MP_INLINE apr_uuid_t *mpxs_apr_uuid_get(pTHX_ SV *CLASS) { apr_uuid_t *uuid = mpxs_apr_uuid_alloc(); apr_uuid_get(uuid); return uuid; } static MP_INLINE void mp_apr_uuid_format(pTHX_ SV *sv, SV *obj) { apr_uuid_t *uuid = mp_xs_sv2_uuid(obj); mpxs_sv_grow(sv, APR_UUID_FORMATTED_LENGTH); apr_uuid_format(SvPVX(sv), uuid); mpxs_sv_cur_set(sv, APR_UUID_FORMATTED_LENGTH); } static MP_INLINE apr_uuid_t *mpxs_apr_uuid_parse(pTHX_ SV *CLASS, char *buf) { apr_uuid_t *uuid = mpxs_apr_uuid_alloc(); apr_uuid_parse(uuid, buf); return uuid; } MP_STATIC XS(MPXS_apr_uuid_format) { dXSARGS; mpxs_usage_items_1("uuid"); mpxs_set_targ(mp_apr_uuid_format, ST(0)); } #define apr_uuid_DESTROY(uuid) safefree(uuid) /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/Makefile.PL0000644000177200010010000000020312540623210014455 0ustar SteveNoneuse lib qw(../lib); use ModPerl::BuildMM (); ModPerl::BuildMM::WriteMakefile( NAME => "ModPerl::XS", VERSION => '0.01' ); mod_perl-2.0.9/xs/maps/0000755000104000010010000000000012540623210015351 5ustar AdministratorsNonemod_perl-2.0.9/xs/maps/apache2_functions.map0000644000104000010010000003514512540623210021453 0ustar AdministratorsNone########## Apache functions ########## #keywords: # MODULE = the module name # e.g. Apache2::Connection -> Apache2/Connection.{pm,xs} # # PACKAGE = the package name functions belong to, defaults to MODULE # value of 'guess' indicates that package name should be # guessed based on first argument found that maps to a Perl class # fallsback on the prefix (ap_ -> Apache2, apr_ -> APR) # # PREFIX = prefix to be stripped # defaults to PACKAGE, converted to C name convention, e.g. # APR::Base64 -> apr_base64_ # if the converted prefix does not match, defaults to ap_ or apr_ #format of entries: # C function name | dispatch function name | argspec | Perl alias # dispatch function name defaults to C function name # if the dispatch name is just a prefix (mpxs_, MPXS_) # the C function name is appended to it # the return type can be specified before the C function name, # defaults to return_type in {Apache2,ModPerl}::FunctionTable # the argspec defaults to arguments in {Apache2,ModPerl}::FunctionTable # argument types can be specified to override those in the FunctionTable # default values can be specified, e.g. arg=default_value # argspec of '...' indicates passthru, calling the function with # (aTHX_ I32 items, SP **sp, SV **MARK) # the alias will be created in the current PACKAGE # function names that do not begin with /^\w/ are skipped # for details see: %ModPerl::MapUtil::disabled_map # in lib/ModPerl/MapUtil.pm MODULE=Apache2::RequestUtil ap_get_status_line #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 ap_register_auth_provider | mpxs_ | ... #_end_ MODULE=Apache2::RequestUtil PACKAGE=guess ap_psignature | | r, prefix >ap_finalize_request_protocol #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } < 2003000 ap_default_type #_end_ ap_get_server_name ap_get_server_port !ap_content_type_tolower ap_is_initial_req >ap_method_registry_init >ap_process_request_internal ?ap_get_mime_headers >ap_rgetline_core ?ap_get_request_note ?ap_register_request_note ~ap_set_content_type #MODULE=Apache2::RequestConfig ~ap_document_root ap_get_limit_req_body ?ap_get_limit_xml_body >ap_core_translate >MODULE=Apache2::Core ap_basic_http_header ap_http_filter ap_send_http_options ap_send_http_trace ap_response_code_string ap_add_file_conf ap_add_per_dir_conf ap_add_per_url_conf ap_limit_section ap_setup_make_content_type >MODULE=Apache2::Listen ap_set_listenbacklog ap_set_listener ap_set_send_buffer_size ap_setup_listeners MODULE=Apache2::SubRequest PACKAGE=Apache2::RequestRec ?ap_sub_req_output_filter >ap_set_sub_req_protocol -ap_finalize_sub_req_protocol ap_internal_redirect | | r, new_uri ap_internal_redirect_handler | | r, new_uri ap_internal_fast_redirect | | r, sub_req ap_sub_req_lookup_dirent | | r, finfo, subtype=AP_SUBREQ_NO_ARGS, next_filter=NULL | lookup_dirent subrequest_rec *:ap_sub_req_lookup_file | | \ r, new_file, next_filter=r->proto_output_filters | lookup_file subrequest_rec *:ap_sub_req_lookup_uri | | \ r, new_uri, next_filter=r->proto_output_filters | lookup_uri subrequest_rec *:ap_sub_req_method_uri | | \ r, method, new_uri, next_filter=r->proto_output_filters | lookup_method_uri PACKAGE=Apache2::SubRequest ISA=Apache2::RequestRec ap_destroy_sub_req | | r | DESTROY ap_run_sub_req | mpxs_ | | run MODULE=Apache2::RequestIO PACKAGE=Apache2::RequestRec ap_discard_request_body !ap_getline ap_get_client_block | mpxs_ | r, SV *:buffer, bufsiz ap_setup_client_block | | r, read_policy=REQUEST_CHUNKED_ERROR ap_should_client_block PREFIX=ap_r ~ap_rwrite ap_rprintf | mpxs_ | ... !ap_rputc ~ap_rputs ap_rvputs | mpxs_ | ... | puts -ap_vrprintf MODULE=Apache2::Response PACKAGE=guess ap_make_etag | | r, force_weak=0 ap_set_content_length | | r, length=r->finfo.csize ap_set_etag ap_meets_conditions ap_rationalize_mtime ap_update_mtime | | r, dependency_mtime=0 ap_send_error_response ~ap_send_fd ap_send_mmap | | r, mm, offset, length ap_set_keepalive -ap_set_last_modified ap_custom_response MODULE=Apache2::Access PACKAGE=Apache2::RequestRec ap_allow_methods | mpxs_ | ... ap_allow_options ap_allow_overrides !ap_allow_standard_methods ap_get_remote_logname SV *:ap_requires | mpxs_ ap_satisfies #MODULE=Apache2::Auth mpxs_Apache2__RequestRec_auth_name | | r, name=NULL mpxs_Apache2__RequestRec_auth_type | | r, type=NULL ap_get_basic_auth_pw | MPXS_ | r ap_note_auth_failure ap_note_basic_auth_failure ap_note_digest_auth_failure ap_some_auth_required !MODULE=Apache2::ScriptUtil PACKAGE=guess ap_add_cgi_vars ap_add_common_vars ap_create_environment ap_find_path_info -ap_scan_script_header_err -ap_scan_script_header_err_core -ap_scan_script_header_err_strs -ap_scan_script_header_err_brigade MODULE=Apache2::ServerUtil PACKAGE=Apache2::ServerRec BOOT=1 ~ap_method_register int:DEFINE_method_register | | server_rec *:s, const char *:methname ~add_version_component void:DEFINE_add_version_component | | server_rec *:s, const char *:component #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 mpxs_Apache2__ServerRec_loglevel | | server_rec *:s, loglevel=0 #_end_ MODULE=Apache2::ServerUtil PACKAGE=Apache2::ServerUtil ap_exists_config_define ap_server_root_relative | | p, fname="" ap_get_server_banner ap_get_server_description ap_get_server_version MODULE=Apache2::ServerUtil PACKAGE=guess ap_error_log2stderr ?ap_replace_stderr_log #MODULE=Apache2::ServerConfig #XXX: thought this might be useful #however it is not exported on win32 !ap_get_local_host ~ap_get_server_built ~ap_server_root MODULE=Apache2::Connection PACKAGE=guess #XXX: thought this might be useful for protocol modules #however it is not exported on win32 !ap_read_request >ap_update_vhost_given_ip mpxs_Apache2__Connection_get_remote_host | | c, type=REMOTE_NAME, dir_config=NULL MODULE=Apache2::Log PACKAGE=guess ?ap_log_assert ~ap_log_error -ap_log_perror ~ap_log_rerror >ap_open_stderr_log >ap_open_logs PACKAGE=Apache2::Log PREFIX=ap_ ap_log_pid MODULE=Apache2::Module module *:DEFINE_top_module -ap_add_loaded_module -ap_add_module -ap_add_named_module ap_find_linked_module -ap_find_module_name ap_remove_loaded_module -ap_remove_module >ap_single_module_configure >ap_setup_prelinked_modules >ap_show_directives >ap_show_modules >ap_register_hooks mpxs_Apache2__Module_loaded mpxs_Apache2__Module_add #ap_get_module_config mpxs_Apache2__Module_get_config | | pmodule, s, v=NULL mpxs_Apache2__Module_ap_api_major_version mpxs_Apache2__Module_ap_api_minor_version MODULE=Apache2::Directive ap_directive_t *:DEFINE_conftree !ap_add_node !ap_build_config !ap_build_cont_config !ap_walk_config >ap_process_config_tree MODULE=Apache2::Filter PACKAGE=guess ~ap_add_output_filter ~ap_add_input_filter -ap_add_input_filter_handle -ap_get_input_filter_handle -ap_add_output_filter_handle -ap_get_output_filter_handle >ap_add_ouput_filters_by_type ~ap_get_brigade mpxs_Apache2__Filter_get_brigade | | \ f, bb, mode=AP_MODE_READBYTES, \ block=APR_BLOCK_READ, \ readbytes=8192 ~ap_pass_brigade mpxs_Apache2__Filter_pass_brigade !ap_register_input_filter !ap_register_output_filter -ap_remove_output_filter -ap_remove_input_filter !ap_save_brigade ap_filter_flush ~ap_fflush mpxs_Apache2__Filter_fflush -ap_fputstrs #int:DEFINE_ap_fputs | | \ # ap_filter_t *:f, apr_bucket_brigade *:bb, const char *:str -ap_fprintf >ap_byterange_filter >ap_http_header_filter >ap_content_length_filter >ap_old_write_filter !MODULE=Apache2::Bucket ap_bucket_error_create ap_bucket_error_make !MODULE=Apache2::Base64 ap_pbase64decode ap_pbase64encode !MODULE=Apache2::ConfigFile ap_cfg_closefile ap_cfg_getc ap_cfg_getline ap_pcfg_open_custom ap_pcfg_openfile >ap_read_config >ap_merge_per_dir_configs >ap_create_conn_config >ap_parse_htaccess >ap_process_resource_config MODULE=Apache2::Command command_rec *:DEFINE_next | | command_rec *:cmd -ap_soak_end_container -ap_set_int_slot -ap_set_file_slot -ap_set_flag_slot -ap_set_string_slot -ap_set_string_slot_lower -ap_set_deprecated MODULE=Apache2::Util ap_ht_time | | p, t=TIME_NOW, fmt=DEFAULT_TIME_FORMAT, gmt=1 !ap_rfc1413 !ap_escape_html | | s, p #escape_uri ap_os_escape_path | | path, p, partial=TRUE | escape_path !ap_explode_recent_gmt !ap_explode_recent_localtime !ap_recent_ctime !ap_recent_rfc822_date MODULE=Apache2::URI PACKAGE=guess ap_parse_uri ap_construct_url | | r, uri=r->uri, p=r->pool ap_construct_server | | r, hostname=ap_get_server_name(r), \ port=ap_get_server_port(r), p=r->pool PACKAGE=Apache2::URI char *:ap_unescape_url | mpxs_ | SV *:url PACKAGE=Apache2::RequestRec mpxs_Apache2__RequestRec_parsed_uri !MODULE=Apache2::StringUtil PACKAGE=guess ap_count_dirs ap_escape_path_segment ap_escape_quotes ap_escape_shell_cmd ap_field_noparam ap_find_last_token ap_find_list_item ap_find_token ap_get_list_item ap_size_list_item ap_getparents ap_get_token -ap_getword -ap_getword_conf -ap_getword_conf_nc -ap_getword_nc -ap_getword_nulls -ap_getword_nulls_nc -ap_getword_white -ap_getword_white_nc -ap_ind -ap_rind ap_is_directory ap_is_matchexp ap_is_rdirectory ap_is_url ap_make_dirstr_parent ap_make_dirstr_prefix ap_make_full_path ap_no2slash ap_os_is_path_absolute ap_resolve_env -ap_strcasecmp_match -ap_strcasestr -ap_strcmp_match ap_stripprefix -ap_str_tolower !MODULE=Apache2::MethodList ap_clear_method_list -ap_copy_method_list ap_make_method_list ap_method_in_list ap_method_list_add ap_method_list_do ap_method_list_remove ap_method_list_vdo ap_method_name_of ap_method_number_of !MODULE=Apache2::PipedLog ap_close_piped_log ap_open_piped_log !MODULE=Apache2::Scoreboard ap_exists_scoreboard_image -ap_update_child_status -ap_time_process_request -ap_create_scoreboard ap_cleanup_scoreboard ap_increment_counts ap_calc_scoreboard_size ap_create_sb_handle ap_get_scoreboard_global ap_get_scoreboard_process ap_get_scoreboard_worker >ap_init_scoreboard >ap_reopen_scoreboard ap_update_child_status_from_indexes !MODULE=Apache2::Hooks ap_location_walk ap_directory_walk ap_file_walk ap_hook_access_checker ap_hook_auth_checker ap_hook_check_user_id ap_hook_child_init >ap_hook_create_connection >ap_hook_get_create_connection ap_hook_default_port ap_hook_fixups ap_hook_handler ap_hook_header_parser ap_hook_http_method ap_hook_insert_filter ap_hook_log_transaction ap_hook_open_logs ap_hook_optional_fn_retrieve ap_hook_post_config ap_hook_post_read_request ap_hook_pre_config ap_hook_pre_connection ap_hook_process_connection ap_hook_translate_name ap_hook_type_checker !ap_hook_quick_handler ap_hook_map_to_storage ap_hook_create_request ap_hook_error_log >ap_hook_pre_mpm -ap_hook_get_suexec_identity -ap_hook_get_access_checker -ap_hook_get_auth_checker -ap_hook_get_check_user_id -ap_hook_get_child_init -ap_hook_get_create_request -ap_hook_get_default_port -ap_hook_get_error_log -ap_hook_get_fixups -ap_hook_get_get_mgmt_items -ap_hook_get_get_suexec_identity -ap_hook_get_handler -ap_hook_get_header_parser -ap_hook_get_http_method -ap_hook_get_insert_filter -ap_hook_get_log_transaction -ap_hook_get_map_to_storage -ap_hook_get_mgmt_items -ap_hook_get_open_logs -ap_hook_get_optional_fn_retrieve -ap_hook_get_post_config -ap_hook_get_post_read_request -ap_hook_get_pre_config -ap_hook_get_pre_connection -ap_hook_get_pre_mpm -ap_hook_get_process_connection -ap_hook_get_quick_handler -ap_hook_get_translate_name -ap_hook_get_type_checker MODULE=Apache2::HookRun PACKAGE=guess -ap_run_get_suexec_identity -ap_run_optional_fn_retrieve >ap_run_pre_config >ap_run_open_logs >ap_run_post_config >ap_run_insert_filter >ap_run_child_init ?ap_run_default_port ?ap_run_http_method >ap_run_create_connection >ap_run_pre_connection >ap_run_process_connection ap_run_post_read_request ap_run_translate_name ap_run_header_parser ap_run_access_checker ap_run_check_user_id ap_run_auth_checker ap_run_type_checker ap_run_fixups ap_run_handler ap_run_log_transaction >ap_run_rewrite_args ?ap_run_create_request >ap_run_error_log >ap_run_get_mgmt_items ap_run_map_to_storage >ap_run_pre_mpm !ap_run_quick_handler ap_invoke_handler ap_die | | r, type !MODULE=Apache2::MD5 ap_md5 ap_md5_binary ap_md5contextTo64 ap_md5digest -MODULE=Apache2::Regexp ap_pregcomp ap_pregfree ap_pregsub ap_regerror ap_regexec !MODULE=Apache2::VHost -ap_set_name_virtual_host -ap_fini_vhost_config -ap_init_vhost_config ap_matches_request_vhost ap_parse_vhost_addrs -ap_update_vhost_from_headers -ap_fixup_virtual_hosts !MODULE=Apache2::HTTPCore >ap_process_request >ap_make_content_type >ap_core_reorder_directories >ap_index_of_response !MODULE=Apache2::XML ap_xml_parse_input MODULE=Apache2::MPM PACKAGE=Apache2::MPM BOOT=1 ~ap_mpm_query ~ap_show_mpm >ap_mpm_run ?ap_os_create_privileged_process ?ap_wait_or_timeout ?ap_graceful_stop_signalled ?ap_process_child_status ?ap_reclaim_child_processes ?ap_sock_disable_nagle ?ap_gname2id ?ap_uname2id ?ap_lingering_close ?ap_mpm_pod_check ?ap_mpm_pod_close ?ap_mpm_pod_killpg ?ap_mpm_pod_open ?ap_mpm_pod_signal ?ap_mpm_set_accept_lock_mech ?ap_mpm_set_coredumpdir ?ap_mpm_set_lockfile ?ap_mpm_set_max_requests ?ap_mpm_set_pidfile ?ap_mpm_set_scoreboard ?ap_listen_pre_config #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 MODULE=Apache2::Provider ap_register_provider #_end_ mod_perl-2.0.9/xs/maps/apache2_structures.map0000644000104000010010000001505212540623210021661 0ustar AdministratorsNone########## Apache structures ########## # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm # the mapping happens in lib/ModPerl/StructureMap.pm: sub parse # '<' => 'auto-generated but gives only a read-only access' # '&' => 'RDWR accessor to a char* field, supporting undef arg' # '$' => 'RONLY accessor, with WRITE accessor before child_init' # '%' => like $, but makes sure that for the write accessor the # original perl scalar can change or go away w/o affecting # the object # my %disabled_map = ( # '!' => 'disabled or not yet implemented', # '~' => 'implemented but not auto-generated', # '-' => 'likely never be available to Perl', # '>' => '"private" to apache', # '?' => 'unclassified', # ); IGNORE: ap_LINK_ ap_filter_func ap_bucket_error ap_listen_rec core_net_rec < pool < connection < server < next < prev < main the_request assbackwards ~ proxyreq < header_only < protocol < proto_num hostname < request_time status_line status method method_number allowed allowed_xmethods allowed_methods > sent_bodyct bytes_sent mtime > chunked > range > clength - remaining > read_length > read_body > read_chunked > expecting_100 headers_in headers_out err_headers_out ~ subprocess_env notes ~ content_type ~ handler content_encoding ~ content_languages > vlist_validator user ap_auth_type ~ no_cache no_local_copy < unparsed_uri uri filename - canonical_filename path_info args ~ finfo ~ parsed_uri used_path_info < per_dir_config < request_config ! htaccess output_filters input_filters proto_output_filters proto_input_filters ? eos_sent #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 < useragent_addr useragent_ip #_end_ < process < next - defn_name - defn_line_number % server_admin % server_hostname #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 % server_scheme #_end_ $ port % error_fname $ error_log $ loglevel #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 ~ is_virtual #_else_ < is_virtual #_end_ < module_config < lookup_defaults < addrs $ timeout $ keep_alive_timeout $ keep_alive_max $ keep_alive % path - pathlen % names % wild_names $ limit_req_line $ limit_req_fieldsize $ limit_req_fields #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 context #_end_ < pool < base_server > vhost_lookup_data < local_addr #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 < client_addr client_ip #_end_ < local_ip < local_host < remote_addr remote_ip < remote_host - remote_logname < aborted keepalive ? double_reverse keepalives < id < conn_config notes input_filters output_filters < sbh < bucket_alloc #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 < log < log_id #_end_ ! next host_addr host_port virthost ~ version ~ minor_version < module_index < name ! dynamic_load_handle < next > magic - rewrite_args > create_dir_config > merge_dir_config > create_server_config > merge_server_config < cmds > register_hooks < pool < pconf - argc ! argv < short_name < name ! func ! cmd_data < req_override < args_how < errmsg < name - filter_func ! ftype - next < frec ~ ctx next r c ! method_mask method_list < directive < args < next < first_child < parent ! data < filename < line_num ! getch getstr close param name line_number ! uid gid userdir ! user_name user_id group_id suexec_enabled ! dir override htaccess next ! p fds program pid - info < override ! limited ! limited_xmethods ! xlimited ! config_file < directive < pool < temp_pool < server < path < cmd < context ! err_directive - override_opts ! description name vtype v ! s_value i_value h_value ! pod_in pod_out p sa mod_perl-2.0.9/xs/maps/apache2_types.map0000644000177200010010000000466212540623210016706 0ustar SteveNone########## Apache types ########## struct server_rec | Apache2::ServerRec struct server_addr_rec | Apache2::ServerAddr struct conn_rec | Apache2::Connection struct request_rec | Apache2::RequestRec struct subrequest_rec | Apache2::SubRequest struct process_rec | Apache2::Process struct ap_method_list_t | Apache2::MethodList struct piped_log | Apache2::PipedLog struct module | Apache2::Module struct module_struct | Apache2::Module ap_conn_keepalive_e | IV #config stuff struct command_rec | Apache2::Command enum cmd_how | IV cmd_func | UNDEFINED struct cmd_parms | Apache2::CmdParms struct ap_configfile_t | Apache2::ConfigFile struct htaccess_result | UNDEFINED struct ap_directive_t | Apache2::Directive struct ap_conf_vector_t | Apache2::ConfVector #system-ish stuff ap_mgmt_type_e | IV ap_mgmt_value | UNDEFINED ap_scoreboard_e | IV struct process_score | UNDEFINED struct worker_score | UNDEFINED struct ap_pod_t | UNDEFINED ap_unix_identity_t | UNDEFINED #filters struct ap_filter_t | Apache2::Filter struct ap_filter_rec_t | Apache2::FilterRec ap_filter_type | Apache2::FilterType ap_filter_func | UNDEFINED ap_out_filter_func | UNDEFINED ap_in_filter_func | UNDEFINED ap_input_mode_t | IV ########## Standard types ########## int | IV int * | PTR unsigned int | UV signed int | IV long | IV long int | IV unsigned long | UV unsigned | UV double | NV char * | PV const char * | PV const char ** | UNDEFINED char const * | PV unsigned char * | PV const unsigned char * | PV char ** | UNDEFINED char *** | UNDEFINED const char * const * | UNDEFINED char | CHAR const char | CHAR const unsigned char | U_CHAR unsigned char | U_CHAR void * | PTR void ** | UNDEFINED const void * | PTR const void ** | UNDEFINED void | VOID ... | UNDEFINED #varargs va_list | UNDEFINED ########## Misc types ########## time_t | NV uid_t | IV gid_t | IV pid_t | IV size_t | IV size_t * | UNDEFINED struct regex_t regmatch_t struct pthread_mutex_t struct iovec | NOTIMPL mod_perl-2.0.9/xs/maps/apr_functions.map0000644000104000010010000003416412540623210020732 0ustar AdministratorsNone########## APR Functions ########## # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm !MODULE=APR::Poll apr_poll_socket_add apr_poll_socket_clear apr_poll_data_get apr_poll_revents_get apr_poll_socket_mask apr_poll apr_poll_socket_remove apr_poll_data_set apr_poll_setup !MODULE=APR::Time -apr_ctime apr_implode_time -apr_time_now -apr_sleep apr_rfc822_date apr_strftime apr_time_exp_gmt_get apr_time_ansi_put apr_time_exp_get apr_time_exp_gmt apr_time_exp_lt apr_time_exp_tz MODULE=APR::Date -apr_date_checkmask apr_date_parse_http apr_date_parse_rfc !MODULE=APR::Array apr_array_append apr_array_cat apr_array_pstrcat apr_array_copy apr_array_copy_hdr apr_array_make apr_array_push MODULE=APR::Socket apr_socket_bind !apr_socket_accept apr_socket_listen apr_socket_connect ~apr_socket_recv mpxs_APR__Socket_recv apr_socket_recvfrom apr_socket_send | mpxs_ | sock, SV *:buf, SV *:len=(SV *)NULL apr_socket_sendto !apr_socket_shutdown -apr_socket_inherit_set -apr_socket_inherit_unset #_if_ $^O !~ /mswin/i mpxs_APR__Socket_fileno | | apr_socket_t *:socket #_end_ MODULE=APR::Socket apr_socket_close !apr_socket_create !apr_socket_addr_get !apr_socket_data_get !apr_socket_data_set ~apr_socket_opt_get mpxs_APR__Socket_opt_get ~apr_socket_opt_set mpxs_APR__Socket_opt_set apr_socket_timeout_get | mpxs_ | ... ~apr_socket_timeout_set mpxs_APR__Socket_timeout_set -apr_socket_sendfile -apr_socket_sendv !apr_socket_from_file mpxs_APR__Socket_poll MODULE=APR::SockAddr !apr_sockaddr_info_get char *:apr_sockaddr_ip_get | mpxs_ | sockaddr apr_sockaddr_equal MODULE=APR::Brigade SV *:apr_brigade_create | mpxs_ | SV *:CLASS, SV *:p_sv, list | new ~apr_brigade_destroy mpxs_APR__Brigade_destroy !apr_brigade_partition !apr_brigade_printf -apr_brigade_putstrs apr_brigade_split -apr_brigade_to_iovec -apr_brigade_vprintf -apr_brigade_vputstrs ~apr_brigade_length !apr_brigade_write !apr_brigade_puts -apr_brigade_putc ~ apr_brigade_cleanup mpxs_APR__Brigade_cleanup ~apr_brigade_flatten ~apr_brigade_pflatten ?apr_brigade_split_line mpxs_APR__Brigade_first #APR_BRIGADE_FIRST mpxs_APR__Brigade_last #APR_BRIGADE_LAST mpxs_APR__Brigade_prev #APR_BUCKET_PREV mpxs_APR__Brigade_next #APR_BUCKET_NEXT mpxs_APR__Brigade_insert_tail #APR_BRIGADE_INSERT_TAIL mpxs_APR__Brigade_insert_head #APR_BRIGADE_INSERT_HEAD mpxs_APR__Brigade_concat #APR_BRIGADE_CONCAT mpxs_APR__Brigade_is_empty #APR_BRIGADE_EMPTY mpxs_APR__Brigade_length | | bb, read_all=1 mpxs_APR__Brigade_flatten | | ... mpxs_APR__Brigade_pool MODULE=APR::Bucket mpxs_APR__Bucket_is_flush #APR_BUCKET_IS_FLUSH mpxs_APR__Bucket_is_eos #APR_BUCKET_IS_EOS mpxs_APR__Bucket_insert_after #APR_BUCKET_INSERT_AFTER mpxs_APR__Bucket_insert_before #APR_BUCKET_INSERT_AFTER mpxs_APR__Bucket_remove #APR_BUCKET_REMOVE #apr_bucket_read mpxs_APR__Bucket_read | | bucket, buffer, block=APR_BLOCK_READ #modperl_bucket_sv_create mpxs_APR__Bucket_new | | classname, list, sv, offset=0, len=0 void:DEFINE_destroy | | apr_bucket:bucket void:DEFINE_delete | | apr_bucket:bucket ~apr_bucket_setaside mpxs_APR__Bucket_setaside >apr_bucket_free !apr_bucket_copy_notimpl !apr_bucket_shared_copy apr_bucket_eos_create !apr_bucket_file_create !apr_bucket_file_enable_mmap apr_bucket_flush_create !apr_bucket_heap_create !apr_bucket_immortal_create !apr_bucket_mmap_create !apr_bucket_pipe_create !apr_bucket_pool_create !apr_bucket_socket_create !apr_bucket_transient_create !apr_bucket_shared_destroy !apr_bucket_eos_make !apr_bucket_file_make !apr_bucket_flush_make !apr_bucket_heap_make !apr_bucket_immortal_make !apr_bucket_mmap_make !apr_bucket_pipe_make !apr_bucket_pool_make !apr_bucket_shared_make !apr_bucket_socket_make !apr_bucket_transient_make !apr_bucket_setaside_notimpl !apr_bucket_split_notimpl !apr_bucket_shared_split !apr_bucket_simple_split !apr_bucket_simple_copy !apr_bucket_destroy_noop !apr_bucket_setaside_noop MODULE=APR::BucketAlloc >apr_bucket_alloc ~apr_bucket_alloc_create mpxs_APR__BucketAlloc_new void:DEFINE_destroy | | apr_bucket_alloc_t *:ba MODULE=APR::Pool -apr_pool_num_bytes | | p, recurse=0 #only available with -DAPR_POOL_DEBUG apr_pool_cleanup_for_exec ~apr_pool_clear mpxs_APR__Pool_clear >apr_pool_clear_debug ~apr_pool_destroy DEFINE_destroy | mpxs_apr_pool_DESTROY | SV *:obj DEFINE_DESTROY | mpxs_apr_pool_DESTROY | SV *:obj >apr_pool_destroy_debug SV *:DEFINE_new | mpxs_apr_pool_create | SV *:parent_pool_obj -apr_pool_create_ex >apr_pool_create_ex_debug !apr_pool_userdata_get !apr_pool_userdata_set -apr_pool_userdata_setn !apr_pool_cleanup_kill !apr_pool_cleanup_run -apr_pool_cleanup_null apr_pool_cleanup_register | mpxs_ | p, SV *:cv, SV *:arg=(SV *)NULL !apr_pool_note_subprocess -apr_palloc >apr_palloc_debug >apr_pcalloc_debug -apr_pcalloc -apr_pmemdup !apr_pool_child_cleanup_set !apr_pool_abort_get SV *:apr_pool_parent_get | mpxs_ apr_pool_is_ancestor -apr_pool_abort_set >apr_pool_initialize >apr_pool_terminate apr_pool_tag -MODULE=APR::Allocator apr_allocator_alloc apr_allocator_create apr_allocator_destroy apr_allocator_free apr_allocator_mutex_get apr_allocator_owner_get apr_allocator_mutex_set apr_allocator_owner_set -MODULE=APR::Atomic apr_atomic_add apr_atomic_cas apr_atomic_dec apr_atomic_inc apr_atomic_init apr_atomic_set !MODULE=APR::GlobalMutex apr_global_mutex_child_init apr_global_mutex_create apr_global_mutex_destroy apr_global_mutex_lock apr_global_mutex_pool_get apr_global_mutex_trylock apr_global_mutex_unlock MODULE=APR::ThreadMutex PREFIX=apr_thread_mutex_ SV *:apr_thread_mutex_create | mpxs_ | \ SV *:classname, SV *:p_sv, flags=APR_THREAD_MUTEX_DEFAULT | new void:apr_thread_mutex_destroy | | | apr_thread_mutex_DESTROY apr_thread_mutex_lock apr_thread_mutex_trylock apr_thread_mutex_unlock apr_thread_mutex_pool_get !MODULE=APR::ProcMutex apr_proc_mutex_child_init apr_proc_mutex_create apr_proc_mutex_destroy apr_proc_mutex_lock apr_proc_mutex_pool_get apr_proc_mutex_trylock apr_proc_mutex_unlock MODULE=APR::Table apr_table_clear ~apr_table_copy mpxs_APR__Table_copy ~apr_table_make mpxs_APR__Table_make apr_table_overlap ~apr_table_overlay mpxs_APR__Table_overlay apr_table_compress apr_table_add -apr_table_addn apr_table_do | mpxs_ | ... apr_table_get | MPXS_ | ... apr_table_merge -apr_table_mergen apr_table_set -apr_table_setn apr_table_unset -apr_table_vdo void:DEFINE_STORE | | apr_table_t *:t, const char *:key, const char *:value void:DEFINE_DELETE | | apr_table_t *:t, const char *:key void:DEFINE_CLEAR | | apr_table_t *:t const char *:DEFINE_FIRSTKEY | mpxs_APR__Table_NEXTKEY | SV *:tsv, SV *:key=(SV *)NULL mpxs_APR__Table_NEXTKEY | | SV *:tsv, SV *:key=&PL_sv_undef mpxs_APR__Table_FETCH mpxs_APR__Table_EXISTS !MODULE=APR::File -apr_file_append -apr_file_attrs_set -apr_file_copy -apr_file_dup2 apr_file_mktemp -apr_file_open -apr_file_close -apr_file_namedpipe_create apr_file_pipe_create -apr_file_dup -apr_file_flush -apr_file_eof -apr_file_gets -apr_file_printf -apr_file_write_full -apr_file_read_full -apr_file_getc -apr_file_ungetc -apr_file_putc -apr_file_puts -apr_file_read -apr_file_write -apr_file_writev -apr_file_seek apr_file_data_get apr_file_info_get apr_file_name_get apr_file_pool_get apr_file_pipe_timeout_get apr_file_pipe_timeout_set apr_file_lock apr_file_unlock apr_file_open_stderr apr_file_open_stdout -apr_file_remove -apr_file_rename apr_file_data_set apr_file_perms_set -apr_file_flags_get -apr_file_open_stdin -apr_file_set_inherit -apr_file_unset_inherit -apr_file_trunc apr_filepath_get apr_filepath_merge apr_filepath_root apr_filepath_set MODULE=APR::Finfo -apr_lstat ~apr_stat mpxs_APR__Finfo_stat !MODULE=APR::String apr_collapse_spaces -apr_cpystrn apr_fnmatch apr_fnmatch_test -apr_psprintf -apr_pstrcat -apr_pstrcatv -apr_pstrdup -apr_pstrndup -apr_pstrmemdup -apr_pvsprintf apr_strnatcasecmp apr_strnatcmp -apr_tokenize_to_argv -apr_strtok -apr_itoa -apr_ltoa -apr_off_t_toa MODULE=APR::String SV *:apr_strfsize | mpxs_APR__String_strfsize | size | format_size !MODULE=APR::StrMatch apr_strmatch_precompile !MODULE=APR::ProcAttr apr_procattr_create apr_procattr_child_err_set apr_procattr_child_in_set apr_procattr_child_out_set apr_procattr_cmdtype_set apr_procattr_detach_set apr_procattr_dir_set apr_procattr_io_set apr_procattr_limit_set !MODULE=APR::Proc apr_proc_create apr_proc_fork apr_proc_kill apr_proc_wait apr_proc_detach -apr_proc_other_child_read -apr_proc_other_child_register -apr_proc_other_child_unregister -apr_proc_other_child_check -apr_proc_wait_all_procs -MODULE=APR::Thread apr_thread_create apr_thread_data_get apr_thread_data_set apr_thread_detach apr_thread_exit apr_thread_join apr_thread_once apr_thread_once_init apr_thread_pool_get apr_thread_yield -MODULE=APR::ThreadCond apr_thread_cond_broadcast apr_thread_cond_create apr_thread_cond_destroy apr_thread_cond_signal apr_thread_cond_wait apr_thread_cond_pool_get apr_thread_cond_timedwait MODULE=APR::ThreadRWLock PREFIX=apr_thread_rwlock_ SV *:apr_thread_rwlock_create | mpxs_ | SV *:classname, SV *:p_sv | new void:apr_thread_rwlock_destroy | | | apr_thread_rwlock_DESTROY apr_thread_rwlock_rdlock apr_thread_rwlock_tryrdlock apr_thread_rwlock_trywrlock apr_thread_rwlock_unlock apr_thread_rwlock_wrlock apr_thread_rwlock_pool_get -MODULE=APR::ThreadKey apr_threadkey_data_get apr_threadkey_data_set apr_threadkey_private_get apr_threadkey_private_set apr_threadkey_private_create apr_threadkey_private_delete -MODULE=APR::ThreadAttr apr_threadattr_create apr_threadattr_detach_set apr_threadattr_detach_get !MODULE=APR::Version apr_version apr_version_string -MODULE=APR::DBM apr_dbm_close apr_dbm_delete apr_dbm_exists apr_dbm_fetch apr_dbm_firstkey apr_dbm_freedatum apr_dbm_geterror apr_dbm_get_usednames apr_dbm_get_usednames_ex apr_dbm_nextkey apr_dbm_open apr_dbm_open_ex apr_dbm_store -MODULE=APR::SDBM apr_sdbm_close apr_sdbm_delete apr_sdbm_fetch apr_sdbm_firstkey apr_sdbm_lock apr_sdbm_nextkey apr_sdbm_open apr_sdbm_rdonly apr_sdbm_store apr_sdbm_unlock -MODULE=APR::Dir apr_dir_close apr_dir_open apr_dir_read apr_dir_rewind apr_dir_make apr_dir_remove !MODULE=APR::DSO apr_dso_error apr_dso_load apr_dso_sym apr_dso_unload MODULE=APR::Util apr_filepath_name_get apr_password_get int:apr_password_validate | mpxs_ -apr_snprintf -apr_vformatter -apr_vsnprintf # only available if APR_HAS_RANDOM -apr_generate_random_bytes MODULE=APR::Error ~apr_strerror char *:DEFINE_strerror | | apr_status_t:rc !MODULE=APR::General -apr_app_initialize -apr_initialize -apr_terminate -apr_terminate2 MODULE=APR::Signal -apr_signal #not available on all platforms !apr_signal_description_get -apr_signal_init -apr_setup_signal_thread !apr_signal_thread MODULE=APR::UUID apr_uuid_format | MPXS_ | uuid apr_uuid_t *:apr_uuid_get | mpxs_ | SV *:CLASS | new apr_uuid_t *:apr_uuid_parse | mpxs_ | SV *:CLASS,char *:buf | parse apr_uuid_DESTROY | | uuid !MODULE=APR::Hook apr_hook_deregister_all apr_hook_sort_register -apr_register_optional_fn apr_hook_debug_show apr_hook_sort_all apr_optional_hook_add apr_optional_hook_get !MODULE=APR::User apr_gid_name_get apr_uid_homepath_get apr_uid_name_get apr_uid_get apr_gid_get apr_uid_current !MODULE=APR::NetLib -apr_gethostname !apr_getnameinfo -apr_getservbyname !apr_parse_addr_port MODULE=APR::IpSubnet SV *:apr_ipsubnet_create | mpxs_ | \ SV *:CLASS, SV *:p_sv, ipstr, mask_or_numbits=NULL | new apr_ipsubnet_test !MODULE=APR::Getopt apr_getopt apr_getopt_long apr_getopt_init !MODULE=APR::Shm apr_shm_create apr_shm_destroy apr_shm_attach apr_shm_detach apr_shm_baseaddr_get apr_shm_size_get apr_shm_pool_get !MODULE=APR::Hash apr_hash_copy apr_hash_count apr_hash_first apr_hash_get apr_hash_merge apr_hash_next apr_hash_set apr_hash_this apr_hash_make apr_hash_overlay apr_hash_pool_get !MODULE=APR::MD5 apr_md5 apr_md5_encode apr_md5_final apr_md5_init apr_md5_set_xlate apr_md5_update !MODULE=APR::MD4 apr_md4 apr_md4_final apr_md4_init apr_md4_set_xlate apr_md4_update !MODULE=APR::SHA1 apr_sha1_base64 apr_sha1_final apr_sha1_init apr_sha1_update apr_sha1_update_binary MODULE=APR::Base64 apr_base64_decode | MPXS_ | coded_src apr_base64_encode | MPXS_ | plain_src int:DEFINE_encode_len | | int:len -apr_base64_decode_len -apr_base64_encode_binary -apr_base64_decode_binary MODULE=APR::URI !apr_uri_parse_hostinfo SV *:apr_uri_parse | mpxs_ | SV *:classname, SV *:p_sv, uri | parse apr_uri_unparse | mpxs_ | \ uptr, flags=APR_URI_UNP_OMITPASSWORD | unparse #special case to set both uri->port and uri->port_str mpxs_APR__URI_port | | uri, portsv=(SV *)NULL mpxs_APR__URI_rpath apr_uri_port_of_scheme !MODULE=Apache2::XML apr_text_append apr_xml_parser_create apr_xml_parser_feed apr_xml_parser_done apr_xml_parser_geterror apr_xml_to_text apr_xml_empty_elem apr_xml_quote_string apr_xml_quote_elem apr_xml_insert_uri apr_xml_parse_file !MODULE=APR::Mmap apr_mmap_create apr_mmap_delete apr_mmap_offset apr_mmap_dup !MODULE=APR::Xlate apr_xlate_close apr_xlate_conv_buffer apr_xlate_conv_byte apr_xlate_get_sb apr_xlate_open MODULE=APR::OS mpxs_APR__OS_current_thread_id -apr_os_dir_get -apr_os_exp_time_get -apr_os_file_get -apr_os_imp_time_get #_if_ $^O !~ /mswin/i ~apr_os_sock_get #_else_ -apr_os_sock_get #_end_ -apr_os_thread_get -apr_os_threadkey_get -apr_os_sock_make -apr_os_dir_put -apr_os_exp_time_put -apr_os_file_put -apr_os_imp_time_put -apr_os_sock_put -apr_os_thread_put -apr_os_threadkey_put -apr_os_dso_handle_get -apr_os_dso_handle_put ~apr_os_thread_current -apr_os_thread_equal -apr_os_global_mutex_get -apr_os_proc_mutex_get -apr_os_proc_mutex_put -apr_os_shm_get -apr_os_shm_put MODULE=APR::Status PREFIX=mpxs_APR__STATUS_ int:DEFINE_is_EAGAIN | | apr_status_t:rc int:DEFINE_is_EACCES | | apr_status_t:rc int:DEFINE_is_ENOENT | | apr_status_t:rc int:DEFINE_is_EOF | | apr_status_t:rc int:DEFINE_is_ECONNABORTED | | apr_status_t:rc int:DEFINE_is_ECONNRESET | | apr_status_t:rc int:DEFINE_is_TIMEUP | | apr_status_t:rc mod_perl-2.0.9/xs/maps/apr_structures.map0000644000177200010010000000430412540623210017235 0ustar SteveNone########## APR structures ########## # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm IGNORE: apr_pool_t apr_os_ apr_vformatter_buff_t apr_pool_t \ apr_table_t apr_in_addr_t apr_bucket_ apr_md5_ctx_t apr_sha1_ctx_t \ apr_md4_ctx_t apr_sdbm_datum_t apr_memnode_t \ apr_uuid_t apr_datum_t apr_mmap_t apr_hdtr_t apr_ipsubnet_t \ apr_strmatch_pattern apr_version_t #buckets < name - num_func - destroy - read - setaside - split - copy > link < type < length < start < data > free > list ~ pool > list < bucket_alloc - pool < valid < protection < filetype < user < group < inode < device < nlink < size < csize < atime < mtime < ctime < fname < name - filehand - pool - hostname - servname < port - sa - salen - ipaddr_len - addr_str_len - ipaddr_ptr - next - family ! pid in out err ! tm_usec tm_sec tm_min tm_hour tm_mday tm_mon tm_year tm_wday tm_yday tm_isdst tm_gmtoff #generic data structures ! > pool > elt_size nelts > nalloc elts ! key val > key_checksum #getopt ! - cont - errfn errarg ind - opt - reset argc argv - place - interleave - skip_start - skip_end ! name - optch - has_arg description #XML ! name ns lang first_cdata following_cdata parent next first_child attr last_child ns_scope priv root namespaces first last name ns value next text next & scheme hostinfo & user & password & hostname - port_str & path & query & fragment hostent ~ port - is_initialized - dns_looked_up - dns_resolved mod_perl-2.0.9/xs/maps/apr_types.map0000644000177200010010000001027112540623210016156 0ustar SteveNone########## APR types ########## struct apr_xlate_t | UNDEFINED struct apr_pool_t | APR::Pool apr_abortfunc_t | UNDEFINED #socket stuff struct apr_sockaddr_t | APR::SockAddr apr_os_sock_info_t | APR::SockInfo struct apr_os_sock_t | UNDEFINED struct apr_in_addr_t | APR::InAddr apr_port_t | IV struct apr_socket_t | APR::Socket struct sockaddr | UNDEFINED struct hostent | UNDEFINED apr_shutdown_how_e | UNDEFINED apr_interface_e | UNDEFINED struct apr_ipsubnet_t | APR::IpSubnet #bucket stuff struct apr_bucket | APR::Bucket struct apr_bucket_brigade | APR::Brigade struct apr_bucket_alloc_t | APR::BucketAlloc apr_brigade_flush | UNDEFINED struct apr_bucket_type_t | APR::BucketType apr_read_type_e | IV apr_bucket_file | UNDEFINED apr_bucket_pool | UNDEFINED apr_bucket_heap | UNDEFINED apr_bucket_mmap | UNDEFINED apr_bucket_refcount | UNDEFINED apr_bucket_list | UNDEFINED #apr_bucket_simple | UNDEFINED #apr_bucket_shared | UNDEFINED #uri struct apr_uri_t | APR::URI #uuid struct apr_uuid_t | APR::UUID #crypto stuff struct apr_md5_ctx_t | APR::MD5 struct apr_md4_ctx_t | UNDEFINED struct apr_sha1_ctx_t | APR::SHA1 #getopt struct apr_getopt_t | APR::Getopt struct apr_getopt_option_t | APR::GetoptOption #dso struct apr_dso_handle_t | UNDEFINED struct apr_dso_handle_sym_t | UNDEFINED struct apr_os_dso_handle_t | UNDEFINED #file stuff struct apr_file_t | UNDEFINED struct apr_os_file_t | UNDEFINED struct apr_dir_t | UNDEFINED struct apr_os_dir_t | UNDEFINED apr_seek_where_t | UNDEFINED struct apr_pollfd_t | UNDEFINED apr_fileperms_t | IV struct apr_finfo_t | APR::Finfo apr_filetype_e | IV apr_dev_t | NV apr_ino_t | IV #process stuff struct apr_proc_t | APR::Process struct apr_procattr_t | UNDEFINED enum kill_conditions apr_os_proc_t | UNDEFINED apr_cmdtype_e | UNDEFINED apr_wait_how_e | UNDEFINED apr_other_child_rec_t | UNDEFINED #time stuff struct apr_time_exp_t | APR::ExplodedTime struct apr_os_exp_time_t | UNDEFINED struct apr_os_imp_time_t | NOTIMPL #data structure stuff struct apr_array_header_t | APR::ArrayHeader struct apr_table_t | APR::Table apr_table_entry_t | APR::TableEntry struct apr_hash_t | APR::Hash apr_hash_index_t | APR::HashIndex #lock stuff apr_locktype_e | IV apr_lockmech_e | IV #thread stuff struct apr_threadkey_t | UNDEFINED struct apr_os_threadkey_t | UNDEFINED typedef apr_os_thread_t | UNDEFINED struct apr_thread_t | UNDEFINED apr_thread_start_t | UNDEFINED struct apr_threadattr_t | UNDEFINED struct apr_thread_mutex_t | APR::ThreadMutex struct apr_thread_once_t | UNDEFINED struct apr_thread_cond_t | UNDEFINED struct apr_thread_rwlock_t | APR::ThreadRWLock #signal stuff apr_signum_t | UNDEFINED apr_sigfunc_t | UNDEFINED #shared memory stuff struct apr_mmap_t | APR::Mmap #xml stuff struct apr_text | UNDEFINED struct apr_text_header | UNDEFINED struct apr_xml_elem | UNDEFINED struct apr_xml_doc | UNDEFINED struct apr_xml_attr | UNDEFINED struct apr_xml_ns_scope | UNDEFINED struct apr_xml_parser | UNDEFINED #integer stuff apr_int16_t | IV apr_int32_t | IV apr_int64_t | NV apr_uint16_t | IV apr_uint32_t | IV apr_uint64_t | NV apr_socklen_t | IV apr_ssize_t | IV apr_size_t | UV apr_time_t | NV apr_interval_time_t | NV apr_gid_t | IV apr_uid_t | IV apr_off_t | IV apr_byte_t | CHAR apr_status_t | IV #dualvar? #misc stuff apr_hdtr_t | NOTIMPL #sendfile apr_vformatter_buff_t | NOTIMPL #dbm stuff apr_datum_t | NOTIMPL #sdbm struct apr_dbm_t | NOTIMPL #sdbm struct apr_sdbm_t | NOTIMPL struct apr_sdbm_datum_t| NOTIMPL mod_perl-2.0.9/xs/maps/modperl_functions.map0000644000104000010010000001613612540623210021611 0ustar AdministratorsNone########## mod_perl specific functions ########## # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm MODULE=ModPerl::Util mpxs_ModPerl__Util_untaint | | ... SV *:DEFINE_current_perl_id char *:DEFINE_current_callback DEFINE_unload_package_xs | | const char *:package MODULE=ModPerl::Global mpxs_ModPerl__Global_special_list_call mpxs_ModPerl__Global_special_list_clear mpxs_ModPerl__Global_special_list_register MODULE=Apache2::RequestRec PACKAGE=Apache2::RequestRec mpxs_Apache2__RequestRec_content_type | | r, type=(SV *)NULL mpxs_Apache2__RequestRec_proxyreq | | r, val=(SV *)NULL mpxs_Apache2__RequestRec_subprocess_env | | r, key=NULL, val=(SV *)NULL mpxs_Apache2__RequestRec_finfo | | r, finfo=NULL mpxs_Apache2__RequestRec_handler | | ... mpxs_Apache2__RequestRec_content_languages | | r, languages=(SV *)NULL #_if_ do { \ Apache2::Build->build_config \ ->httpd_version =~ /^(\d+)\.(\d+)\.(\d+)/ \ ? ($1*1000+$2)*1000+$3 \ : die "Cannot get httpd version"; \ } > 2003000 MODULE=Apache2::ServerRec PACKAGE=Apache2::ServerRec mpxs_Apache2__ServerRec_is_virtual | | server_rec *:s, val=(SV *)NULL #_end_ MODULE=Apache2::RequestUtil PACKAGE=guess mpxs_Apache2__RequestRec_push_handlers mpxs_Apache2__RequestRec_set_handlers mpxs_Apache2__RequestRec_get_handlers mpxs_Apache2__RequestRec_is_perl_option_enabled mpxs_Apache2__RequestRec_location mpxs_Apache2__RequestRec_as_string mpxs_Apache2__RequestRec_pnotes | | r, key=(SV *)NULL, val=(SV *)NULL mpxs_Apache2__RequestRec_pnotes_kill | | r mpxs_Apache2__RequestRec_add_config | | r, lines, override=MP_HTTPD_OVERRIDE_HTACCESS, path=NULL, override_options=MP_HTTPD_OVERRIDE_OPTS_UNSET mpxs_Apache2__RequestRec_document_root | | r, new_root=(SV *)NULL mpxs_Apache2__RequestRec_child_terminate #protocol module helpers mpxs_Apache2__RequestRec_location_merge mpxs_Apache2__RequestRec_set_basic_credentials mpxs_Apache2__RequestRec_no_cache | | r, flag=(SV *)NULL PACKAGE=Apache2::RequestRec mpxs_Apache2__RequestRec_new | | classname, c, base_pool_sv=(SV *)NULL SV *:DEFINE_dir_config | | request_rec *:r, char *:key=NULL, SV *:sv_val=(SV *)NULL SV *:DEFINE_slurp_filename | | request_rec *:r, int:tainted=1 MODULE=Apache2::RequestUtil PACKAGE=Apache2::RequestUtil mpxs_Apache2__RequestUtil_request | | classname, svr=(SV *)NULL MODULE=Apache2::RequestIO PACKAGE=Apache2::RequestRec SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=(SV *)NULL SV *:DEFINE_PRINT | | ... apr_size_t:DEFINE_PRINTF | | ... SV *:DEFINE_BINMODE | | request_rec *:r SV *:DEFINE_CLOSE | | request_rec *:r SV *:DEFINE_UNTIE | | request_rec *:r, int:refcnt mpxs_Apache2__RequestRec_sendfile | | r, filename=r->filename, offset=0, len=0 mpxs_Apache2__RequestRec_read | | r, buffer, len, offset=0 SV *:DEFINE_READ | | request_rec *:r, SV *:buffer, apr_size_t:len, apr_off_t:offset=0 mpxs_Apache2__RequestRec_write | | r, buffer, len=-1, offset=0 mpxs_Apache2__RequestRec_print | | ... apr_size_t:DEFINE_WRITE | | \ request_rec *:r, SV *:buffer, apr_size_t:len=-1, apr_off_t:offset=0 mpxs_Apache2__RequestRec_rflush | | ... mpxs_Apache2__RequestRec_GETC mpxs_Apache2__RequestRec_OPEN | | SV *:self, SV *:arg1, SV *:arg2=(SV *)NULL mpxs_Apache2__RequestRec_FILENO MODULE=Apache2::Response PACKAGE=Apache2::RequestRec DEFINE_send_cgi_header | | request_rec *:r, SV *:buffer mpxs_Apache2__RequestRec_set_last_modified | | r, mtime=0 MODULE=Apache2::ServerUtil PACKAGE=guess mpxs_Apache2__ServerRec_push_handlers mpxs_Apache2__ServerRec_set_handlers mpxs_Apache2__ServerRec_get_handlers mpxs_Apache2__ServerRec_is_perl_option_enabled mpxs_Apache2__ServerRec_add_config MODULE=Apache2::ServerUtil PACKAGE=Apache2::ServerRec SV *:DEFINE_dir_config | | server_rec *:s, char *:key=NULL, SV *:sv_val=(SV *)NULL MODULE=Apache2::ServerUtil PACKAGE=Apache2::ServerUtil mpxs_Apache2__ServerUtil_server_shutdown_cleanup_register | | cv, arg=(SV *)NULL int:DEFINE_restart_count MODULE=Apache2::ServerUtil PACKAGE=Apache2::ServerUtil server_rec *:DEFINE_server | | SV *:classname=(SV *)NULL uid_t:DEFINE_user_id | | SV *:classname=(SV *)NULL gid_t:DEFINE_group_id | | SV *:classname=(SV *)NULL MODULE=Apache2::Connection mpxs_Apache2__Connection_client_socket | | c, s=NULL MODULE=Apache2::ConnectionUtil PACKAGE=guess mpxs_Apache2__Connection_pnotes | | c, key=(SV *)NULL, val=(SV *)NULL mpxs_Apache2__Connection_pnotes_kill | | c MODULE=Apache2::Filter modperl_filter_attributes | MPXS_ | ... | MODIFY_CODE_ATTRIBUTES mpxs_Apache2__Filter_print | | ... mpxs_Apache2__Filter_read | | ... mpxs_Apache2__Filter_seen_eos | | ... mpxs_Apache2__Filter_ctx | | filter, data=(SV *)NULL mpxs_Apache2__Filter_remove | | ... SV *:DEFINE_TIEHANDLE | | SV *:stashsv, SV *:sv=(SV *)NULL apr_size_t:DEFINE_PRINT | | ... MODULE=Apache2::Filter PACKAGE=Apache2::RequestRec mpxs_Apache2__RequestRec_add_input_filter mpxs_Apache2__RequestRec_add_output_filter MODULE=Apache2::Filter PACKAGE=Apache2::Connection mpxs_Apache2__Connection_add_input_filter mpxs_Apache2__Connection_add_output_filter MODULE=Apache2::Log PACKAGE=Apache2::Log BOOT=1 DEFINE_error | MPXS_Apache2__Log_dispatch | ... DEFINE_emerg | MPXS_Apache2__Log_dispatch | ... DEFINE_alert | MPXS_Apache2__Log_dispatch | ... DEFINE_warn | MPXS_Apache2__Log_dispatch | ... DEFINE_notice | MPXS_Apache2__Log_dispatch | ... DEFINE_info | MPXS_Apache2__Log_dispatch | ... DEFINE_debug | MPXS_Apache2__Log_dispatch | ... DEFINE_crit | MPXS_Apache2__Log_dispatch | ... DEFINE_LOG_MARK | MPXS_Apache2__Log_LOG_MARK | ... PACKAGE=Apache2::RequestRec SV *:DEFINE_log | | SV *:obj DEFINE_log_rerror | MPXS_Apache2__Log_log_xerror | ... DEFINE_log_error | MPXS_Apache2__Log_log_error | ... DEFINE_warn | MPXS_Apache2__Log_log_error | ... DEFINE_log_reason | modperl_log_reason | request_rec *:r, char *:msg, char *:file=r->uri PACKAGE=Apache2::ServerRec SV *:DEFINE_log | | SV *:obj DEFINE_log_serror | MPXS_Apache2__Log_log_xerror | ... DEFINE_log_error | MPXS_Apache2__Log_log_error | ... DEFINE_warn | MPXS_Apache2__Log_log_error | ... MODULE=Apache2::SubProcess PACKAGE=Apache2::RequestRec # ap_subprocess_ won't work modperl_spawn_proc_prog | MPXS_ | ... | spawn_proc_prog MODULE=Apache2::Directive mpxs_Apache2__Directive_as_string mpxs_Apache2__Directive_as_hash DEFINE_lookup | MPXS_Apache2__Directive_lookup | ... MODULE=Apache2::CmdParms ap_check_cmd_context ap_method_is_limited mpxs_Apache2__CmdParms_info mpxs_Apache2__CmdParms_add_config mpxs_Apache2__CmdParms_override_opts MODULE=Apache2::MPM PACKAGE=Apache2::MPM BOOT=1 mpxs_Apache2__MPM_query MODULE=Apache2::Access PACKAGE=guess mpxs_Apache2__RequestRec_allow_override_opts #_if_ do {use Apache2::Build; Apache2::Build::PERL_HAS_ITHREADS} MODULE=ModPerl::Interpreter mpxs_ModPerl__Interpreter_current | | class=Nullsv #_end_ mod_perl-2.0.9/xs/maps/modperl_structures.map0000644000104000010010000000114612540623210022017 0ustar AdministratorsNone########## ModPerl structures ########## # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm #_if_ do {use Apache2::Build; Apache2::Build::PERL_HAS_ITHREADS} < mip < perl < num_requests < flags - ccfg < refcnt - tid < server < tipool < parent - tiplock - available - idle - busy < in_use < size - data < cfg - func < start < min_spare < max_spare < max < max_requests #_end_ mod_perl-2.0.9/xs/maps/modperl_types.map0000644000104000010010000000102412540623210020733 0ustar AdministratorsNone########## mod_perl types ########## struct modperl_filter_t | Apache2::OutputFilter #_if_ do {use Apache2::Build; Apache2::Build::PERL_HAS_ITHREADS} struct modperl_interp_t | ModPerl::Interpreter struct modperl_interp_pool_t | ModPerl::InterpPool struct modperl_tipool_t | ModPerl::TiPool struct modperl_tipool_config_t | ModPerl::TiPoolConfig PerlInterpreter * | IV #_end_ ########## Perl types ########## SV * | SV I32 | IV I32 * | IV U16 | UV U16 * | UV U32 | UV U32 * | UV mod_perl-2.0.9/xs/ModPerl/0000755000104000010010000000000012540623210015753 5ustar AdministratorsNonemod_perl-2.0.9/xs/ModPerl/Const/0000755000104000010010000000000012540623210017041 5ustar AdministratorsNonemod_perl-2.0.9/xs/ModPerl/Const/Const.pm0000644000104000010010000000417412540623210020473 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # package ModPerl::Const; use DynaLoader (); our $VERSION = do { require mod_perl2; $mod_perl2::VERSION }; our @ISA = qw(DynaLoader); #dlopen("Const.so", RTDL_GLOBAL); #XXX: dl_dlopen.xs check isn't portable; works for hpux # - on aix this is dl_aix.xs, and depending on release, RTDL_GLOBAL is # available or not, e.g. 4.3 doesn't have it in the headers, while # 5.1 does have it # - from looking at ext/DynaLoader/dl_*.xs when 0x01 is used when it's # not supported perl issues a warning and passes the right flag to dlopen # - currently (patchlevel 18958) dl_aix.xs always issues a warning # even when RTDL_GLOBAL is available, patch submitted to p5p use Config (); use constant DL_GLOBAL => ( $Config::Config{dlsrc} eq 'dl_dlopen.xs' && $^O ne 'openbsd' ) ? 0x01 : 0x0; sub dl_load_flags { DL_GLOBAL } #only bootstrap for use outside of mod_perl unless (defined &ModPerl::Const::compile) { __PACKAGE__->bootstrap($VERSION); } sub import { my $class = shift; my $arg; if ($_[0] and $_[0] =~ /^-compile/) { $arg = shift; #just compile the constants subs, export nothing } $arg ||= scalar caller; #compile and export into caller's namespace $class->compile($arg, @_ ? @_ : ':common'); } 1; mod_perl-2.0.9/xs/ModPerl/Const/Const.xs0000644000104000010010000000330212540623210020501 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mod_perl.h" #include "modperl_const.h" #ifndef WIN32 /* FIXME: To define extern perl_module to something so Const.so can be * loaded later. Without this code, loading Const.so fails with * undefined_symbol: perl_module. (Windows does not need this since it * explicitly links against mod_perl.lib anyway.) */ module AP_MODULE_DECLARE_DATA perl_module = { STANDARD20_MODULE_STUFF, NULL, /* dir config creater */ NULL, /* dir merger --- default is to override */ NULL, /* server config */ NULL, /* merge server config */ NULL, /* table of config file commands */ NULL, /* register hooks */ }; #endif MODULE = ModPerl::Const PACKAGE = ModPerl::Const PROTOTYPES: disable BOOT: #XXX: #currently used just for {APR,Apache}/Const.{so,dll} to lookup #XS_modperl_const_compile #linking is fun. newXS("ModPerl::Const::compile", XS_modperl_const_compile, __FILE__); mod_perl-2.0.9/xs/ModPerl/Const/Makefile.PL0000644000104000010010000000140712540623210021015 0ustar AdministratorsNoneuse lib qw(../lib); use ModPerl::BuildMM (); my $srcdir = '../../../src/modules/perl'; #link these two into Const.so so constants can be used outside of httpd my @names = map { "modperl_$_" } qw(const constants); my(@obj, @clean, %src); for (@names) { push @obj, join '.', $_, 'o'; my $cfile = join '.', $_, 'c'; push @clean, $cfile; $src{$cfile} = "$srcdir/$cfile"; } ModPerl::BuildMM::WriteMakefile( NAME => 'ModPerl::Const', VERSION_FROM => 'Const.pm', OBJECT => "Const.o @obj", clean => { FILES => "@clean" }, ); sub MY::postamble { my $self = shift; my $string = $self->ModPerl::BuildMM::MY::postamble; $string .= join '', map { "$_: $src{$_}\n\t\$(CP) $src{$_} .\n"; } sort keys %src; return $string; } mod_perl-2.0.9/xs/ModPerl/Global/0000755000104000010010000000000012540623210017153 5ustar AdministratorsNonemod_perl-2.0.9/xs/ModPerl/Global/ModPerl__Global.h0000644000104000010010000000443012540623210022306 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ typedef void (*mpxs_special_list_do_t)(pTHX_ modperl_modglobal_key_t *, const char *, I32); static int mpxs_special_list_do(pTHX_ const char *name, SV *package, mpxs_special_list_do_t func) { STRLEN packlen; char *packname; modperl_modglobal_key_t *gkey = modperl_modglobal_lookup(aTHX_ name); if (!gkey) { return FALSE; } packname = SvPV(package, packlen); func(aTHX_ gkey, packname, packlen); return TRUE; } static MP_INLINE int mpxs_ModPerl__Global_special_list_call(pTHX_ const char *name, SV *package) { return mpxs_special_list_do(aTHX_ name, package, modperl_perl_global_avcv_call); } static MP_INLINE int mpxs_ModPerl__Global_special_list_clear(pTHX_ const char *name, SV *package) { return mpxs_special_list_do(aTHX_ name, package, modperl_perl_global_avcv_clear); } static MP_INLINE int mpxs_ModPerl__Global_special_list_register(pTHX_ const char *name, SV *package) { return mpxs_special_list_do(aTHX_ name, package, modperl_perl_global_avcv_register); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/ModPerl/Interpreter/0000755000104000010010000000000012540623210020256 5ustar AdministratorsNonemod_perl-2.0.9/xs/ModPerl/Interpreter/ModPerl__Interpreter.h0000644000104000010010000000176512540623210024524 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ static MP_INLINE modperl_interp_t *mpxs_ModPerl__Interpreter_current(pTHX_ SV *class) { return modperl_thx_interp_get(aTHX); } /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/ModPerl/Makefile.PL0000644000177200010010000000017712540623210016031 0ustar SteveNoneuse lib qw(../lib); use ModPerl::BuildMM (); ModPerl::BuildMM::WriteMakefile( NAME => "ModPerl", VERSION => '0.01' ); mod_perl-2.0.9/xs/ModPerl/Util/0000755000104000010010000000000012540623210016670 5ustar AdministratorsNonemod_perl-2.0.9/xs/ModPerl/Util/ModPerl__Util.h0000644000104000010010000000311012540623210021532 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef USE_ITHREADS #define mpxs_ModPerl__Util_current_perl_id() \ Perl_newSVpvf(aTHX_ "0x%lx", (unsigned long)aTHX) #else #define mpxs_ModPerl__Util_current_perl_id() \ Perl_newSVpvf(aTHX_ "0x%lx", (unsigned long)0) #endif static MP_INLINE void mpxs_ModPerl__Util_untaint(pTHX_ I32 items, SV **MARK, SV **SP) { if (!PL_tainting) { return; } while (MARK <= SP) { sv_untaint(*MARK++); } } #define mpxs_ModPerl__Util_current_callback \ modperl_callback_current_callback_get #define mpxs_ModPerl__Util_unload_package_xs(pkg) \ modperl_package_unload(aTHX_ pkg) /* ModPerl::Util::exit lives in mod_perl.so, see modperl_perl.c */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/ModPerl/Util/Util_pm0000644000177200010010000000315312540623210016325 0ustar SteveNone#Extra stuff our $DEFAULT_UNLOAD_METHOD ||= "unload_package_pp"; sub unload_package { goto &$DEFAULT_UNLOAD_METHOD; } sub unload_package_pp { my $package = shift; no strict 'refs'; my $tab = \%{ $package . '::' }; # below we assign to a symbol first before undef'ing it, to avoid # nuking aliases. If we undef directly we may undef not only the # alias but the original function as well for (keys %$tab) { #Skip sub stashes next if /::$/; my $fullname = join '::', $package, $_; # code/hash/array/scalar might be imported make sure the gv # does not point elsewhere before undefing each if (%$fullname) { *{$fullname} = {}; undef %$fullname; } if (@$fullname) { *{$fullname} = []; undef @$fullname; } if ($$fullname) { my $tmp; # argh, no such thing as an anonymous scalar *{$fullname} = \$tmp; undef $$fullname; } if (defined &$fullname) { no warnings; local $^W = 0; if (defined(my $p = prototype $fullname)) { *{$fullname} = eval "sub ($p) {}"; } else { *{$fullname} = sub {}; } undef &$fullname; } if (*{$fullname}{IO}) { local $@; eval { if (fileno $fullname) { close $fullname; } }; } } #Wipe from %INC $package =~ s[::][/]g; $package .= '.pm'; delete $INC{$package}; } mod_perl-2.0.9/xs/modperl_xs_util.h0000644000104000010010000001566212540623210020005 0ustar AdministratorsNone/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODPERL_XS_H #define MODPERL_XS_H /* XXX: should be part of generation */ #undef mp_xs_sv2_r /* defined in modperl_xs_sv_convert.h */ #define mp_xs_sv2_r(sv) modperl_sv2request_rec(aTHX_ sv) #undef mp_xs_sv2_APR__Table #define mp_xs_sv2_APR__Table(sv) \ (apr_table_t *)modperl_hash_tied_object(aTHX_ "APR::Table", sv) #define mpxs_Apache2__RequestRec_pool(r) r->pool #define mpxs_Apache2__Connection_pool(c) c->pool #define mpxs_Apache2__URI_pool(u) ((modperl_uri_t *)u)->pool #define mpxs_APR__URI_pool(u) ((modperl_uri_t *)u)->pool #ifndef dAX # define dAX I32 ax = mark - PL_stack_base + 1 #endif #ifndef dITEMS # define dITEMS I32 items = SP - MARK #endif #define mpxs_PPCODE(code) STMT_START { \ SP -= items; \ code; \ PUTBACK; \ } STMT_END #define PUSHs_mortal_iv(iv) PUSHs(sv_2mortal(newSViv(iv))) #define PUSHs_mortal_pv(pv) PUSHs(sv_2mortal(newSVpv((char *)pv,0))) #define XPUSHs_mortal_iv(iv) EXTEND(SP, 1); PUSHs_mortal_iv(iv) #define XPUSHs_mortal_pv(pv) EXTEND(SP, 1); PUSHs_mortal_pv(pv) /* XXX: replace the old mpxs_sv_ macros with MP_Sv macros */ #define mpxs_sv_grow(sv, len) MP_SvGROW(sv, len) #define mpxs_sv_cur_set(sv, len) MP_SvCUR_set(sv, len) #define mpxs_set_targ(func, arg) \ STMT_START { \ dXSTARG; \ XSprePUSH; \ func(aTHX_ TARG, arg); \ PUSHTARG; \ XSRETURN(1); \ } STMT_END #define mpxs_cv_name() \ HvNAME(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv)) #define mpxs_sv_is_object(sv) \ (SvROK(sv) && (SvTYPE(SvRV(sv)) == SVt_PVMG)) #define mpxs_sv_object_deref(sv, type) \ (mpxs_sv_is_object(sv) ? \ INT2PTR(type *, SvIVX((SV*)SvRV(sv))) : NULL) #define mpxs_sv2_obj(obj, sv) \ (obj = mp_xs_sv2_##obj(sv)) #define mpxs_usage_items_1(arg) \ if (items != 1) { \ Perl_croak(aTHX_ "usage: %s::%s(%s)", \ mpxs_cv_name(), arg); \ } #define mpxs_usage_va(i, obj, msg) \ if ((items < i) || !(mpxs_sv2_obj(obj, *MARK))) { \ Perl_croak(aTHX_ "usage: %s", msg); \ } \ MARK++ #define mpxs_usage_va_1(obj, msg) mpxs_usage_va(1, obj, msg) #define mpxs_usage_va_2(obj, arg, msg) \ mpxs_usage_va(2, obj, msg); \ arg = *MARK++ #define mpxs_write_loop(func, obj, name) \ while (MARK <= SP) { \ apr_size_t wlen; \ char *buf = SvPV(*MARK, wlen); \ MP_TRACE_o(MP_FUNC, "%d bytes [%s]", wlen, buf); \ MP_RUN_CROAK(func(aTHX_ obj, buf, &wlen), name); \ bytes += wlen; \ MARK++; \ } /* custom pool objects created by modperl users (not internal like * r->pool) are marked by magic in SvRV(obj) */ #define mpxs_pool_is_custom(pool) (mg_find(pool, PERL_MAGIC_ext) != NULL) /* several methods need to ensure that the pool that they take as an * object doesn't go out of scope before the object that they return, * since if this happens, the data contained in the later object * becomes corrupted. this macro is used in various xs files where * it's needed */ #if ((PERL_REVISION == 5) && (PERL_VERSION >= 8)) /* sometimes the added magic is the second one (e.g. in case when * the object is generated by modperl_hash_tie, so under 5.8+ * need to use sv_magicext, since sv_magicext does only one magic * of the same type at 5.8+ */ #define mpxs_add_pool_magic_doit(obj, pool_obj) \ sv_magicext(SvRV(obj), pool_obj, PERL_MAGIC_ext, NULL, (char *)NULL, -1) #else #define mpxs_add_pool_magic_doit(obj, pool_obj) \ sv_magic(SvRV(obj), pool_obj, PERL_MAGIC_ext, (char *)NULL, -1) #endif /* add dependency magic only for custom pools. there are all kind of * complications when more than one magic of the same type(in this * case PERL_MAGIC_ext is added), luckily most of the PERL_MAGIC_ext * magic used by modperl-core, uses (SV *)NULL as mg->mg_obj, therefore * the following code tries to workaround the multiple magic issue, by * simply hanging the pool object into the unused slot, incrementing * its refcnt just like sv_magic does internally. In case we ever hit * magic which already has mg->mg_obj taken we will deal with that, * for now we just croak in such a case. */ #define mpxs_add_pool_magic(obj, pool_obj) \ if (mpxs_pool_is_custom(SvRV(pool_obj))) { \ MAGIC *mg = mg_find(SvRV(obj), PERL_MAGIC_ext); \ if (mg) { \ if (mg->mg_obj == (SV *)NULL) { \ mg->mg_obj = SvREFCNT_inc(SvRV(pool_obj)); \ mg->mg_flags |= MGf_REFCOUNTED; \ } \ else { \ Perl_croak(aTHX_ "Fixme: don't know how to " \ "handle magic w/ occupied mg->mg_obj"); \ } \ } \ else { \ mpxs_add_pool_magic_doit(obj, SvRV(pool_obj)); \ } \ } #endif /* MODPERL_XS_H */ /* * Local Variables: * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ mod_perl-2.0.9/xs/tables/0000755000104000010010000000000012540623173015673 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current/0000755000104000010010000000000012540623174017356 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current/Apache2/0000755000104000010010000000000012540623210020610 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current/Apache2/ConstantsTable.pm0000644000104000010010000002536212540623210024102 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package Apache2::ConstantsTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache2::ParseSource/0.02 # ! Mon May 23 14:15:32 2005 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::ConstantsTable = { 'ModPerl' => { 'common' => [ 'MODPERL_RC_EXIT' ] }, 'Apache2::Const' => { 'types' => [ 'DIR_MAGIC_TYPE' ], 'satisfy' => [ 'SATISFY_ALL', 'SATISFY_ANY', 'SATISFY_NOSPEC' ], 'remotehost' => [ 'REMOTE_HOST', 'REMOTE_NAME', 'REMOTE_NOLOOKUP', 'REMOTE_DOUBLE_REV' ], 'platform' => [ 'LF', 'CR', 'CRLF' ], 'override' => [ 'OR_NONE', 'OR_LIMIT', 'OR_OPTIONS', 'OR_FILEINFO', 'OR_AUTHCFG', 'OR_INDEXES', 'OR_UNSET', 'ACCESS_CONF', 'RSRC_CONF', 'EXEC_ON_READ', 'OR_ALL' ], 'options' => [ 'OPT_NONE', 'OPT_INDEXES', 'OPT_INCLUDES', 'OPT_SYM_LINKS', 'OPT_EXECCGI', 'OPT_UNSET', 'OPT_INCNOEXEC', 'OPT_SYM_OWNER', 'OPT_MULTI', 'OPT_ALL' ], 'mpmq' => [ 'AP_MPMQ_NOT_SUPPORTED', 'AP_MPMQ_STATIC', 'AP_MPMQ_DYNAMIC', 'AP_MPMQ_STARTING', 'AP_MPMQ_RUNNING', 'AP_MPMQ_STOPPING', 'AP_MPMQ_MAX_DAEMON_USED', 'AP_MPMQ_IS_THREADED', 'AP_MPMQ_IS_FORKED', 'AP_MPMQ_HARD_LIMIT_DAEMONS', 'AP_MPMQ_HARD_LIMIT_THREADS', 'AP_MPMQ_MAX_THREADS', 'AP_MPMQ_MIN_SPARE_DAEMONS', 'AP_MPMQ_MIN_SPARE_THREADS', 'AP_MPMQ_MAX_SPARE_DAEMONS', 'AP_MPMQ_MAX_SPARE_THREADS', 'AP_MPMQ_MAX_REQUESTS_DAEMON', 'AP_MPMQ_MAX_DAEMONS', 'AP_MPMQ_MPM_STATE' ], 'methods' => [ 'M_GET', 'M_PUT', 'M_POST', 'M_DELETE', 'M_CONNECT', 'M_OPTIONS', 'M_TRACE', 'M_PATCH', 'M_PROPFIND', 'M_PROPPATCH', 'M_MKCOL', 'M_COPY', 'M_MOVE', 'M_LOCK', 'M_UNLOCK', 'M_VERSION_CONTROL', 'M_CHECKOUT', 'M_UNCHECKOUT', 'M_CHECKIN', 'M_UPDATE', 'M_LABEL', 'M_REPORT', 'M_MKWORKSPACE', 'M_MKACTIVITY', 'M_BASELINE_CONTROL', 'M_MERGE', 'M_INVALID', 'METHODS' ], 'log' => [ 'APLOG_EMERG', 'APLOG_ALERT', 'APLOG_CRIT', 'APLOG_ERR', 'APLOG_WARNING', 'APLOG_NOTICE', 'APLOG_INFO', 'APLOG_DEBUG', 'APLOG_LEVELMASK', 'APLOG_TOCLIENT', 'APLOG_STARTUP' ], 'input_mode' => [ 'AP_MODE_READBYTES', 'AP_MODE_GETLINE', 'AP_MODE_EATCRLF', 'AP_MODE_SPECULATIVE', 'AP_MODE_EXHAUSTIVE', 'AP_MODE_INIT' ], 'http' => [ 'HTTP_CONTINUE', 'HTTP_SWITCHING_PROTOCOLS', 'HTTP_PROCESSING', 'HTTP_OK', 'HTTP_CREATED', 'HTTP_ACCEPTED', 'HTTP_NON_AUTHORITATIVE', 'HTTP_NO_CONTENT', 'HTTP_RESET_CONTENT', 'HTTP_PARTIAL_CONTENT', 'HTTP_MULTI_STATUS', 'HTTP_MULTIPLE_CHOICES', 'HTTP_MOVED_PERMANENTLY', 'HTTP_MOVED_TEMPORARILY', 'HTTP_SEE_OTHER', 'HTTP_NOT_MODIFIED', 'HTTP_USE_PROXY', 'HTTP_TEMPORARY_REDIRECT', 'HTTP_BAD_REQUEST', 'HTTP_UNAUTHORIZED', 'HTTP_PAYMENT_REQUIRED', 'HTTP_FORBIDDEN', 'HTTP_NOT_FOUND', 'HTTP_METHOD_NOT_ALLOWED', 'HTTP_NOT_ACCEPTABLE', 'HTTP_PROXY_AUTHENTICATION_REQUIRED', 'HTTP_REQUEST_TIME_OUT', 'HTTP_CONFLICT', 'HTTP_GONE', 'HTTP_LENGTH_REQUIRED', 'HTTP_PRECONDITION_FAILED', 'HTTP_REQUEST_ENTITY_TOO_LARGE', 'HTTP_REQUEST_URI_TOO_LARGE', 'HTTP_UNSUPPORTED_MEDIA_TYPE', 'HTTP_RANGE_NOT_SATISFIABLE', 'HTTP_EXPECTATION_FAILED', 'HTTP_UNPROCESSABLE_ENTITY', 'HTTP_LOCKED', 'HTTP_FAILED_DEPENDENCY', 'HTTP_UPGRADE_REQUIRED', 'HTTP_INTERNAL_SERVER_ERROR', 'HTTP_NOT_IMPLEMENTED', 'HTTP_BAD_GATEWAY', 'HTTP_SERVICE_UNAVAILABLE', 'HTTP_GATEWAY_TIME_OUT', 'HTTP_VARIANT_ALSO_VARIES', 'HTTP_INSUFFICIENT_STORAGE', 'HTTP_NOT_EXTENDED' ], 'filter_type' => [ 'AP_FTYPE_RESOURCE', 'AP_FTYPE_CONTENT_SET', 'AP_FTYPE_PROTOCOL', 'AP_FTYPE_TRANSCODE', 'AP_FTYPE_CONNECTION', 'AP_FTYPE_NETWORK' ], 'context' => [ 'NOT_IN_VIRTUALHOST', 'NOT_IN_LIMIT', 'NOT_IN_DIRECTORY', 'NOT_IN_LOCATION', 'NOT_IN_FILES', 'NOT_IN_DIR_LOC_FILE', 'GLOBAL_ONLY' ], 'conn_keepalive' => [ 'AP_CONN_UNKNOWN', 'AP_CONN_CLOSE', 'AP_CONN_KEEPALIVE' ], 'config' => [ 'DECLINE_CMD' ], 'common' => [ 'DECLINED', 'DONE', 'OK', 'NOT_FOUND', 'FORBIDDEN', 'AUTH_REQUIRED', 'SERVER_ERROR', 'REDIRECT' ], 'cmd_how' => [ 'RAW_ARGS', 'TAKE1', 'TAKE2', 'ITERATE', 'ITERATE2', 'FLAG', 'NO_ARGS', 'TAKE12', 'TAKE3', 'TAKE23', 'TAKE123', 'TAKE13' ], 'proxy' => [ 'PROXYREQ_REVERSE', 'PROXYREQ_NONE', 'PROXYREQ_PROXY', 'PROXYREQ_RESPONSE', ], }, 'APR::Const' => { 'uri' => [ 'APR_URI_FTP_DEFAULT_PORT', 'APR_URI_SSH_DEFAULT_PORT', 'APR_URI_TELNET_DEFAULT_PORT', 'APR_URI_GOPHER_DEFAULT_PORT', 'APR_URI_HTTP_DEFAULT_PORT', 'APR_URI_POP_DEFAULT_PORT', 'APR_URI_NNTP_DEFAULT_PORT', 'APR_URI_IMAP_DEFAULT_PORT', 'APR_URI_PROSPERO_DEFAULT_PORT', 'APR_URI_WAIS_DEFAULT_PORT', 'APR_URI_LDAP_DEFAULT_PORT', 'APR_URI_HTTPS_DEFAULT_PORT', 'APR_URI_RTSP_DEFAULT_PORT', 'APR_URI_SNEWS_DEFAULT_PORT', 'APR_URI_ACAP_DEFAULT_PORT', 'APR_URI_NFS_DEFAULT_PORT', 'APR_URI_TIP_DEFAULT_PORT', 'APR_URI_SIP_DEFAULT_PORT', 'APR_URI_UNP_OMITSITEPART', 'APR_URI_UNP_OMITUSER', 'APR_URI_UNP_OMITPASSWORD', 'APR_URI_UNP_OMITUSERINFO', 'APR_URI_UNP_REVEALPASSWORD', 'APR_URI_UNP_OMITPATHINFO', 'APR_URI_UNP_OMITQUERY' ], 'table' => [ 'APR_OVERLAP_TABLES_SET', 'APR_OVERLAP_TABLES_MERGE' ], 'status' => [ 'APR_TIMEUP' ], 'socket' => [ 'APR_SO_LINGER', 'APR_SO_KEEPALIVE', 'APR_SO_DEBUG', 'APR_SO_NONBLOCK', 'APR_SO_REUSEADDR', 'APR_SO_SNDBUF', 'APR_SO_RCVBUF', 'APR_SO_DISCONNECTED' ], 'shutdown_how' => [ 'APR_SHUTDOWN_READ', 'APR_SHUTDOWN_WRITE', 'APR_SHUTDOWN_READWRITE' ], 'read_type' => [ 'APR_BLOCK_READ', 'APR_NONBLOCK_READ' ], 'poll' => [ 'APR_POLLIN', 'APR_POLLPRI', 'APR_POLLOUT', 'APR_POLLERR', 'APR_POLLHUP', 'APR_POLLNVAL' ], 'lockmech' => [ 'APR_LOCK_FCNTL', 'APR_LOCK_FLOCK', 'APR_LOCK_SYSVSEM', 'APR_LOCK_PROC_PTHREAD', 'APR_LOCK_POSIXSEM', 'APR_LOCK_DEFAULT' ], 'limit' => [ 'APR_LIMIT_CPU', 'APR_LIMIT_MEM', 'APR_LIMIT_NPROC', 'APR_LIMIT_NOFILE' ], 'hook' => [ 'APR_HOOK_REALLY_FIRST', 'APR_HOOK_FIRST', 'APR_HOOK_MIDDLE', 'APR_HOOK_LAST', 'APR_HOOK_REALLY_LAST' ], 'fprot' => [ 'APR_FPROT_USETID', 'APR_FPROT_UREAD', 'APR_FPROT_UWRITE', 'APR_FPROT_UEXECUTE', 'APR_FPROT_GSETID', 'APR_FPROT_GREAD', 'APR_FPROT_GWRITE', 'APR_FPROT_GEXECUTE', 'APR_FPROT_WSTICKY', 'APR_FPROT_WREAD', 'APR_FPROT_WWRITE', 'APR_FPROT_WEXECUTE', 'APR_FPROT_OS_DEFAULT' ], 'fopen' => [ 'APR_FOPEN_READ', 'APR_FOPEN_WRITE', 'APR_FOPEN_CREATE', 'APR_FOPEN_APPEND', 'APR_FOPEN_TRUNCATE', 'APR_FOPEN_BINARY', 'APR_FOPEN_EXCL', 'APR_FOPEN_BUFFERED', 'APR_FOPEN_DELONCLOSE', 'APR_FOPEN_XTHREAD', 'APR_FOPEN_SHARELOCK', 'APR_FOPEN_NOCLEANUP', 'APR_FOPEN_SENDFILE_ENABLED', 'APR_FOPEN_LARGEFILE' ], 'flock' => [ 'APR_FLOCK_SHARED', 'APR_FLOCK_EXCLUSIVE', 'APR_FLOCK_TYPEMASK', 'APR_FLOCK_NONBLOCK' ], 'finfo' => [ 'APR_FINFO_LINK', 'APR_FINFO_MTIME', 'APR_FINFO_CTIME', 'APR_FINFO_ATIME', 'APR_FINFO_SIZE', 'APR_FINFO_CSIZE', 'APR_FINFO_DEV', 'APR_FINFO_INODE', 'APR_FINFO_NLINK', 'APR_FINFO_TYPE', 'APR_FINFO_USER', 'APR_FINFO_GROUP', 'APR_FINFO_UPROT', 'APR_FINFO_GPROT', 'APR_FINFO_WPROT', 'APR_FINFO_ICASE', 'APR_FINFO_NAME', 'APR_FINFO_MIN', 'APR_FINFO_IDENT', 'APR_FINFO_OWNER', 'APR_FINFO_PROT', 'APR_FINFO_NORM', 'APR_FINFO_DIRENT' ], 'filetype' => [ 'APR_FILETYPE_NOFILE', 'APR_FILETYPE_REG', 'APR_FILETYPE_DIR', 'APR_FILETYPE_CHR', 'APR_FILETYPE_BLK', 'APR_FILETYPE_PIPE', 'APR_FILETYPE_LNK', 'APR_FILETYPE_SOCK', 'APR_FILETYPE_UNKFILE' ], 'filepath' => [ 'APR_FILEPATH_NOTABOVEROOT', 'APR_FILEPATH_SECUREROOTTEST', 'APR_FILEPATH_SECUREROOT', 'APR_FILEPATH_NOTRELATIVE', 'APR_FILEPATH_NOTABSOLUTE', 'APR_FILEPATH_NATIVE', 'APR_FILEPATH_TRUENAME', 'APR_FILEPATH_ENCODING_UNKNOWN', 'APR_FILEPATH_ENCODING_LOCALE', 'APR_FILEPATH_ENCODING_UTF8' ], 'error' => [ 'APR_ENOSTAT', 'APR_ENOPOOL', 'APR_EBADDATE', 'APR_EINVALSOCK', 'APR_ENOPROC', 'APR_ENOTIME', 'APR_ENODIR', 'APR_ENOLOCK', 'APR_ENOPOLL', 'APR_ENOSOCKET', 'APR_ENOTHREAD', 'APR_ENOTHDKEY', 'APR_EGENERAL', 'APR_ENOSHMAVAIL', 'APR_EBADIP', 'APR_EBADMASK', 'APR_EDSOOPEN', 'APR_EABSOLUTE', 'APR_ERELATIVE', 'APR_EINCOMPLETE', 'APR_EABOVEROOT', 'APR_EBADPATH', 'APR_EPATHWILD', 'APR_ESYMNOTFOUND', 'APR_EPROC_UNKNOWN', 'APR_EOF', 'APR_EINIT', 'APR_ENOTIMPL', 'APR_EMISMATCH', 'APR_EBUSY', 'APR_EACCES', 'APR_EEXIST', 'APR_ENAMETOOLONG', 'APR_ENOENT', 'APR_ENOTDIR', 'APR_ENOSPC', 'APR_ENOMEM', 'APR_EMFILE', 'APR_ENFILE', 'APR_EBADF', 'APR_EINVAL', 'APR_ESPIPE', 'APR_EAGAIN', 'APR_EINTR', 'APR_ENOTSOCK', 'APR_ECONNREFUSED', 'APR_EINPROGRESS', 'APR_ECONNABORTED', 'APR_ECONNRESET', 'APR_ETIMEDOUT', 'APR_EHOSTUNREACH', 'APR_ENETUNREACH', 'APR_EFTYPE', 'APR_EPIPE', 'APR_EXDEV', 'APR_ENOTEMPTY', 'APR_EXCL', 'APR_END' ], 'common' => [ 'APR_SUCCESS' ], } }; 1; mod_perl-2.0.9/xs/tables/current/Apache2/FunctionTable.pm0000644000104000010010000103301012540623210023701 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package Apache2::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache2::ParseSource/0.02 # ! Mon May 23 14:15:40 2005 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::FunctionTable = [ { 'return_type' => 'void', 'name' => 'ap_add_file_conf', 'args' => [ { 'type' => 'core_dir_config *', 'name' => 'conf' }, { 'type' => 'void *', 'name' => 'url_config' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_input_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_input_filter_handle', 'args' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'f' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_loaded_module', 'args' => [ { 'type' => 'module *', 'name' => 'mod' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_module', 'args' => [ { 'type' => 'module *', 'name' => 'm' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'ap_add_named_module', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_directive_t *', 'name' => 'ap_add_node', 'args' => [ { 'type' => 'ap_directive_t **', 'name' => 'parent' }, { 'type' => 'ap_directive_t *', 'name' => 'current' }, { 'type' => 'ap_directive_t *', 'name' => 'toadd' }, { 'type' => 'int', 'name' => 'child' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_output_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_output_filter_handle', 'args' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'f' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_output_filters_by_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_per_dir_conf', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'void *', 'name' => 'dir_config' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_per_url_conf', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'void *', 'name' => 'url_config' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_version_component', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'const char *', 'name' => 'component' } ] }, { 'return_type' => 'void', 'name' => 'ap_allow_methods', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_allow_options', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_allow_overrides', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_allow_standard_methods', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_auth_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_auth_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_basic_http_header', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eoc_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eoc_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_error_create', 'args' => [ { 'type' => 'int', 'name' => 'error' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_error_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'error' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_build_config', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'apr_pool_t *', 'name' => 'conf_pool' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_build_cont_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'ap_directive_t **', 'name' => 'current' }, { 'type' => 'ap_directive_t **', 'name' => 'curr_parent' }, { 'type' => 'char *', 'name' => 'orig_directive' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_byterange_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'ap_calc_scoreboard_size', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_cfg_closefile', 'args' => [ { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'int', 'name' => 'ap_cfg_getc', 'args' => [ { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'int', 'name' => 'ap_cfg_getline', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'size_t', 'name' => 'bufsize' }, { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_check_cmd_context', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'unsigned', 'name' => 'forbidden' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cleanup_scoreboard', 'args' => [ { 'type' => 'void *', 'name' => 'd' } ] }, { 'return_type' => 'void', 'name' => 'ap_clear_method_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' } ] }, { 'return_type' => 'void', 'name' => 'ap_close_piped_log', 'args' => [ { 'type' => 'piped_log *', 'name' => 'pl' } ] }, { 'return_type' => 'char *', 'name' => 'ap_construct_server', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char *', 'name' => 'ap_construct_url', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_content_length_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'arg0' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'ap_content_type_tolower', 'args' => [ { 'type' => 'char *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_copy_method_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'dest' }, { 'type' => 'ap_method_list_t *', 'name' => 'src' } ] }, { 'return_type' => 'void', 'name' => 'ap_core_reorder_directories', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'arg0' }, { 'type' => 'server_rec *', 'name' => 'arg1' } ] }, { 'return_type' => 'int', 'name' => 'ap_core_translate', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_count_dirs', 'args' => [ { 'type' => 'const char *', 'name' => 'path' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_create_conn_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_conf_vector_t *', 'name' => 'ap_create_per_dir_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_create_request_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_create_sb_handle', 'args' => [ { 'type' => 'ap_sb_handle_t **', 'name' => 'new_sbh' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'child_num' }, { 'type' => 'int', 'name' => 'thread_num' } ] }, { 'return_type' => 'int', 'name' => 'ap_create_scoreboard', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_scoreboard_e', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'ap_custom_response', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'string' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_default_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_destroy_sub_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_die', 'args' => [ { 'type' => 'int', 'name' => 'type' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_directory_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_discard_request_body', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_document_root', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_error_log2stderr', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_escape_errorlog_item', 'args' => [ { 'type' => 'char *', 'name' => 'dest' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'apr_size_t', 'name' => 'buflen' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_html', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_logitem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_path_segment', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_quotes', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'instring' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_shell_cmd', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_exists_config_define', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_exists_scoreboard_image', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_explode_recent_gmt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'tm' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_explode_recent_localtime', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'tm' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fatal_signal_child_setup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fatal_signal_setup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fflush', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'char *', 'name' => 'ap_field_noparam', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'intype' } ] }, { 'return_type' => 'int', 'name' => 'ap_file_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_filter_flush', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'void *', 'name' => 'ctx' } ] }, { 'return_type' => 'void', 'name' => 'ap_finalize_request_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_finalize_sub_req_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'sub_r' } ] }, { 'return_type' => 'const command_rec *', 'name' => 'ap_find_command', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const command_rec *', 'name' => 'cmds' } ] }, { 'return_type' => 'const command_rec *', 'name' => 'ap_find_command_in_modules', 'args' => [ { 'type' => 'const char *', 'name' => 'cmd_name' }, { 'type' => 'module **', 'name' => 'mod' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_last_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'module *', 'name' => 'ap_find_linked_module', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_list_item', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_find_module_name', 'args' => [ { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'void', 'name' => 'ap_fini_vhost_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'main_server' } ] }, { 'return_type' => 'void', 'name' => 'ap_fixup_virtual_hosts', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'main_server' } ] }, { 'return_type' => 'void', 'name' => 'ap_flush_conn', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fprintf', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fputstrs', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_get_basic_auth_pw', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char **', 'name' => 'pw' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_get_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bucket' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'long', 'name' => 'ap_get_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'bufsiz' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_get_input_filter_handle', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'apr_off_t', 'name' => 'ap_get_limit_req_body', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'size_t', 'name' => 'ap_get_limit_xml_body', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_list_item', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'field' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_local_host', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_mime_headers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_mime_headers_core', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'void *', 'name' => 'ap_get_module_config', 'args' => [ { 'type' => 'const ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'const module *', 'name' => 'm' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_get_output_filter_handle', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_remote_host', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' }, { 'type' => 'void *', 'name' => 'dir_config' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int *', 'name' => 'str_is_ip' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_remote_logname', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void **', 'name' => 'ap_get_request_note', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_size_t', 'name' => 'note_num' } ] }, { 'return_type' => 'global_score *', 'name' => 'ap_get_scoreboard_global', 'args' => [] }, { 'return_type' => 'process_score *', 'name' => 'ap_get_scoreboard_process', 'args' => [ { 'type' => 'int', 'name' => 'x' } ] }, { 'return_type' => 'worker_score *', 'name' => 'ap_get_scoreboard_worker', 'args' => [ { 'type' => 'int', 'name' => 'x' }, { 'type' => 'int', 'name' => 'y' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_built', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'ap_get_server_port', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_version', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_description', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_banner', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_status_line', 'args' => [ { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'accept_line' }, { 'type' => 'int', 'name' => 'accept_white' } ] }, { 'return_type' => 'int', 'name' => 'ap_getline', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'n' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'fold' } ] }, { 'return_type' => 'void', 'name' => 'ap_getparents', 'args' => [ { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_conf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_conf_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nulls', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nulls_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_white', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_white_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' } ] }, { 'return_type' => 'gid_t', 'name' => 'ap_gname2id', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_graceful_stop_signalled', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_access_checker', 'args' => [ { 'type' => 'ap_HOOK_access_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_auth_checker', 'args' => [ { 'type' => 'ap_HOOK_auth_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_user_id', 'args' => [ { 'type' => 'ap_HOOK_check_user_id_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_child_init', 'args' => [ { 'type' => 'ap_HOOK_child_init_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_create_connection', 'args' => [ { 'type' => 'ap_HOOK_create_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_create_request', 'args' => [ { 'type' => 'ap_HOOK_create_request_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_default_port', 'args' => [ { 'type' => 'ap_HOOK_default_port_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_error_log', 'args' => [ { 'type' => 'ap_HOOK_error_log_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_fixups', 'args' => [ { 'type' => 'ap_HOOK_fixups_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_access_checker', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_auth_checker', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_check_user_id', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_child_init', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_create_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_create_request', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_default_port', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_error_log', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_fixups', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_get_mgmt_items', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_get_suexec_identity', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_handler', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_header_parser', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_http_method', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_insert_error_filter', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_insert_filter', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_log_transaction', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_map_to_storage', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_get_mgmt_items', 'args' => [ { 'type' => 'ap_HOOK_get_mgmt_items_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_open_logs', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_optional_fn_retrieve', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_post_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_post_read_request', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_mpm', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_process_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_quick_handler', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_status_hook', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_get_suexec_identity', 'args' => [ { 'type' => 'ap_HOOK_get_suexec_identity_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_translate_name', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_type_checker', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_handler', 'args' => [ { 'type' => 'ap_HOOK_handler_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_header_parser', 'args' => [ { 'type' => 'ap_HOOK_header_parser_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_http_method', 'args' => [ { 'type' => 'ap_HOOK_http_method_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_insert_error_filter', 'args' => [ { 'type' => 'ap_HOOK_insert_error_filter_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_insert_filter', 'args' => [ { 'type' => 'ap_HOOK_insert_filter_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_log_transaction', 'args' => [ { 'type' => 'ap_HOOK_log_transaction_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_map_to_storage', 'args' => [ { 'type' => 'ap_HOOK_map_to_storage_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_open_logs', 'args' => [ { 'type' => 'ap_HOOK_open_logs_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_optional_fn_retrieve', 'args' => [ { 'type' => 'ap_HOOK_optional_fn_retrieve_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_post_config', 'args' => [ { 'type' => 'ap_HOOK_post_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_post_read_request', 'args' => [ { 'type' => 'ap_HOOK_post_read_request_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_config', 'args' => [ { 'type' => 'ap_HOOK_pre_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_connection', 'args' => [ { 'type' => 'ap_HOOK_pre_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_mpm', 'args' => [ { 'type' => 'ap_HOOK_pre_mpm_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_process_connection', 'args' => [ { 'type' => 'ap_HOOK_process_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_quick_handler', 'args' => [ { 'type' => 'ap_HOOK_quick_handler_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_status_hook', 'args' => [ { 'type' => 'ap_HOOK_status_hook_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_translate_name', 'args' => [ { 'type' => 'ap_HOOK_translate_name_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_type_checker', 'args' => [ { 'type' => 'ap_HOOK_type_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'char *', 'name' => 'ap_ht_time', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_time_t', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'int', 'name' => 'gmt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_header_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'ap_increment_counts', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_ind', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'char', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_index_of_response', 'args' => [ { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'ap_init_scoreboard', 'args' => [ { 'type' => 'void *', 'name' => 'shared_score' } ] }, { 'return_type' => 'void', 'name' => 'ap_init_vhost_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_init_virtual_host', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'server_rec *', 'name' => 'main_server' }, { 'type' => 'server_rec **', 'name' => 'arg3' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_fast_redirect', 'args' => [ { 'type' => 'request_rec *', 'name' => 'sub_req' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_redirect', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_redirect_handler', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_invoke_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_directory', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_initial_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_matchexp', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_rdirectory', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_recursion_limit_exceeded', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_url', 'args' => [ { 'type' => 'const char *', 'name' => 'u' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_limit_section', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_lingering_close', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'ap_listen_pre_config', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_location_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_assert', 'args' => [ { 'type' => 'const char *', 'name' => 'szExp' }, { 'type' => 'const char *', 'name' => 'szFile' }, { 'type' => 'int', 'name' => 'nLine' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_error', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg6' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_perror', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg6' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_rerror', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg6' } ] }, { 'return_type' => 'void *', 'name' => 'ap_lookup_provider', 'args' => [ { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_make_content_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'type' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_dirstr_parent', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_dirstr_prefix', 'args' => [ { 'type' => 'char *', 'name' => 'd' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_etag', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'force_weak' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_full_path', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const char *', 'name' => 'dir' }, { 'type' => 'const char *', 'name' => 'f' } ] }, { 'return_type' => 'ap_method_list_t *', 'name' => 'ap_make_method_list', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'int', 'name' => 'ap_matches_request_vhost', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'host' }, { 'type' => 'apr_port_t', 'name' => 'port' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const unsigned char *', 'name' => 'string' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5_binary', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const unsigned char *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'len' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5contextTo64', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5digest', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_file_t *', 'name' => 'infile' } ] }, { 'return_type' => 'int', 'name' => 'ap_meets_conditions', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_merge_per_dir_configs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'base' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'new_conf' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_in_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_is_limited', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_add', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_do', 'args' => [ { 'type' => 'int (*comp) (void *urec, const char *mname, int mnum)', 'name' => 'arg0' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const ap_method_list_t *', 'name' => 'ml' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_remove', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_vdo', 'args' => [ { 'type' => 'int (*comp) (void *urec, const char *mname, int mnum)', 'name' => 'arg0' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const ap_method_list_t *', 'name' => 'ml' }, { 'type' => 'va_list', 'name' => 'vp' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_method_name_of', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'methnum' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_number_of', 'args' => [ { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'methname' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_registry_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_check', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_close', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'void', 'name' => 'ap_mpm_pod_killpg', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' }, { 'type' => 'int', 'name' => 'num' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_open', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_pod_t **', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_signal', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_query', 'args' => [ { 'type' => 'int', 'name' => 'query_code' }, { 'type' => 'int *', 'name' => 'result' } ] }, { 'return_type' => 'void', 'name' => 'ap_mpm_rewrite_args', 'args' => [ { 'type' => 'process_rec *', 'name' => 'arg0' } ] }, { 'return_type' => 'int', 'name' => 'ap_mpm_run', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'server_rec *', 'name' => 'server_conf' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_accept_lock_mech', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_coredumpdir', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_lockfile', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_max_mem_free', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_max_requests', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_pidfile', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_scoreboard', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_no2slash', 'args' => [ { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_basic_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_digest_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_old_write_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'ap_open_logs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's_main' } ] }, { 'return_type' => 'piped_log *', 'name' => 'ap_open_piped_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'program' } ] }, { 'return_type' => 'void', 'name' => 'ap_open_stderr_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_os_create_privileged_process', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'apr_proc_t *', 'name' => 'newproc' }, { 'type' => 'const char *', 'name' => 'progname' }, { 'type' => 'const char * const *', 'name' => 'args' }, { 'type' => 'const char * const *', 'name' => 'env' }, { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'char *', 'name' => 'ap_os_escape_path', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'partial' } ] }, { 'return_type' => 'int', 'name' => 'ap_os_is_path_absolute', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'dir' } ] }, { 'return_type' => 'int', 'name' => 'ap_parse_htaccess', 'args' => [ { 'type' => 'ap_conf_vector_t **', 'name' => 'result' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'const char *', 'name' => 'access_name' } ] }, { 'return_type' => 'void', 'name' => 'ap_parse_uri', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'uri' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_parse_vhost_addrs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pass_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bucket' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pbase64decode', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'bufcoded' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pbase64encode', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char *', 'name' => 'string' } ] }, { 'return_type' => 'ap_configfile_t *', 'name' => 'ap_pcfg_open_custom', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'descr' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'int(*getc_func)(void*)', 'name' => 'arg3' }, { 'type' => 'void *(*gets_func) (void *buf, size_t bufsiz, void *param)', 'name' => 'arg4' }, { 'type' => 'int(*close_func)(void *param)', 'name' => 'arg5' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pcfg_openfile', 'args' => [ { 'type' => 'ap_configfile_t **', 'name' => 'ret_cfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'ap_pcw_srv_cb_t', 'name' => 'srv_cb' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_default_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_directory_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_server_config *', 'name' => 'sconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_files_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_dir_config *', 'name' => 'dconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_location_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_server_config *', 'name' => 'sconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_server_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_srv_cb_t', 'name' => 'srv_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'regex_t *', 'name' => 'ap_pregcomp', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'int', 'name' => 'cflags' } ] }, { 'return_type' => 'void', 'name' => 'ap_pregfree', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'regex_t *', 'name' => 'reg' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pregsub', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'size_t', 'name' => 'nmatch' }, { 'type' => 'regmatch_t', 'name' => 'pmatch' } ] }, { 'return_type' => 'int', 'name' => 'ap_process_child_status', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'pid' }, { 'type' => 'apr_exit_why_e', 'name' => 'why' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_config_tree', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_directive_t *', 'name' => 'conftree' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'arg0' } ] }, { 'return_type' => 'int', 'name' => 'ap_process_request_internal', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_resource_config', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_psignature', 'args' => [ { 'type' => 'const char *', 'name' => 'prefix' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'ap_rationalize_mtime', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'mtime' } ] }, { 'return_type' => 'server_rec *', 'name' => 'ap_read_config', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'const char *', 'name' => 'config_name' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_read_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'pid_t *', 'name' => 'mypid' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_read_request', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_recent_ctime', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_recent_rfc822_date', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'ap_reclaim_child_processes', 'args' => [ { 'type' => 'int', 'name' => 'terminate' } ] }, { 'return_type' => 'size_t', 'name' => 'ap_regerror', 'args' => [ { 'type' => 'int', 'name' => 'errcode' }, { 'type' => 'const regex_t *', 'name' => 'preg' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'size_t', 'name' => 'errbuf_size' } ] }, { 'return_type' => 'int', 'name' => 'ap_regexec', 'args' => [ { 'type' => 'regex_t *', 'name' => 'preg' }, { 'type' => 'const char *', 'name' => 'string' }, { 'type' => 'size_t', 'name' => 'nmatch' }, { 'type' => 'regmatch_t', 'name' => 'pmatch' }, { 'type' => 'int', 'name' => 'eflags' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_extra_mpm_process', 'args' => [ { 'type' => 'pid_t', 'name' => 'pid' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_hooks', 'args' => [ { 'type' => 'module *', 'name' => 'm' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_register_input_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_in_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_register_output_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_out_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_register_provider', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' }, { 'type' => 'const void *', 'name' => 'provider' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_register_request_note', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_remove_input_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_loaded_module', 'args' => [ { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_module', 'args' => [ { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_output_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_reopen_scoreboard', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_shm_t **', 'name' => 'shm' }, { 'type' => 'int', 'name' => 'detached' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_replace_stderr_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file' } ] }, { 'return_type' => 'const apr_array_header_t *', 'name' => 'ap_requires', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_resolve_env', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'word' } ] }, { 'return_type' => 'char *', 'name' => 'ap_response_code_string', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'error_index' } ] }, { 'return_type' => 'char *', 'name' => 'ap_rfc1413', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' }, { 'type' => 'server_rec *', 'name' => 'srv' } ] }, { 'return_type' => 'int', 'name' => 'ap_rflush', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_rgetline_core', 'args' => [ { 'type' => 'char **', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' }, { 'type' => 'apr_size_t *', 'name' => 'read' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'fold' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'int', 'name' => 'ap_rind', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'char', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_rprintf', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_rputc', 'args' => [ { 'type' => 'int', 'name' => 'c' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_rputs', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_access_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_auth_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_check_user_id', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_child_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pchild' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'conn_rec *', 'name' => 'ap_run_create_connection', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'apr_socket_t *', 'name' => 'csd' }, { 'type' => 'long', 'name' => 'conn_id' }, { 'type' => 'void *', 'name' => 'sbh' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'alloc' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_create_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'ap_run_default_port', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_error_log', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'errstr' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_fixups', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_get_mgmt_items', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'val' }, { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'ap_unix_identity_t *', 'name' => 'ap_run_get_suexec_identity', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_header_parser', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_run_http_method', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_insert_error_filter', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_insert_filter', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_log_transaction', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_map_to_storage', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_open_logs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_optional_fn_retrieve', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_run_post_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_post_read_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_mpm', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_scoreboard_e', 'name' => 'sb_type' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_process_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_quick_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'lookup_uri' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_rewrite_args', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_status_hook', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_sub_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_translate_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_type_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_rvputs', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => '...', 'name' => 'arg1' } ] }, { 'return_type' => 'int', 'name' => 'ap_rwrite', 'args' => [ { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'nbyte' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_satisfies', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_save_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade **', 'name' => 'save_to' }, { 'type' => 'apr_bucket_brigade **', 'name' => 'b' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_send_error_response', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'recursive_error' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_send_fd', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'int', 'name' => 'ap_send_http_options', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_send_http_trace', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'size_t', 'name' => 'ap_send_mmap', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'size_t', 'name' => 'offset' }, { 'type' => 'size_t', 'name' => 'length' } ] }, { 'return_type' => 'char *', 'name' => 'ap_server_root_relative', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'void *', 'name' => 'ap_set_config_vectors', 'args' => [ { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'section_vector' }, { 'type' => 'const char *section', 'name' => 'arg2' }, { 'type' => 'module *', 'name' => 'mod' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_content_length', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_off_t', 'name' => 'length' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_content_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'ct' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_deprecated', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_etag', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_file_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_flag_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'int', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_int_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'int', 'name' => 'ap_set_keepalive', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_last_modified', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_listenbacklog', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_listener', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'ips' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'const module *', 'name' => 'm' }, { 'type' => 'void *', 'name' => 'val' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_name_virtual_host', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_send_buffer_size', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_string_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_string_slot_lower', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_sub_req_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'rnew' }, { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_setup_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'read_policy' } ] }, { 'return_type' => 'int', 'name' => 'ap_setup_listeners', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_setup_make_content_type', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'ap_setup_prelinked_modules', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' } ] }, { 'return_type' => 'int', 'name' => 'ap_should_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_show_directives', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_show_modules', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_show_mpm', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_signal_server', 'args' => [ { 'type' => 'int *', 'name' => 'arg0' }, { 'type' => 'apr_pool_t *', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'ap_single_module_configure', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_size_list_item', 'args' => [ { 'type' => 'const char **', 'name' => 'field' }, { 'type' => 'int *', 'name' => 'len' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_soak_end_container', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'char *', 'name' => 'directive' } ] }, { 'return_type' => 'int', 'name' => 'ap_some_auth_required', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_str_tolower', 'args' => [ { 'type' => 'char *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_strcasecmp_match', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'expected' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strcasestr', 'args' => [ { 'type' => 'const char *', 'name' => 's1' }, { 'type' => 'const char *', 'name' => 's2' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strchr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strchr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_strcmp_match', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'expected' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_stripprefix', 'args' => [ { 'type' => 'const char *', 'name' => 'bigstring' }, { 'type' => 'const char *', 'name' => 'prefix' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strrchr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strrchr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strstr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strstr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'c' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_dirent', 'args' => [ { 'type' => 'const apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'subtype' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_file', 'args' => [ { 'type' => 'const char *', 'name' => 'new_file' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_uri', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_method_uri', 'args' => [ { 'type' => 'const char *', 'name' => 'method' }, { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_sub_req_output_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'void', 'name' => 'ap_time_process_request', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'uid_t', 'name' => 'ap_uname2id', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_url', 'args' => [ { 'type' => 'char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_url_keep2f', 'args' => [ { 'type' => 'char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'ap_unregister_extra_mpm_process', 'args' => [ { 'type' => 'pid_t', 'name' => 'pid' } ] }, { 'return_type' => 'int', 'name' => 'ap_update_child_status', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_update_child_status_from_indexes', 'args' => [ { 'type' => 'int', 'name' => 'child_num' }, { 'type' => 'int', 'name' => 'thread_num' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_mtime', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'dependency_mtime' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_vhost_from_headers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_vhost_given_ip', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' } ] }, { 'return_type' => 'int', 'name' => 'ap_vrprintf', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'vlist' } ] }, { 'return_type' => 'void', 'name' => 'ap_wait_or_timeout', 'args' => [ { 'type' => 'apr_exit_why_e *', 'name' => 'status' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_proc_t *', 'name' => 'ret' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_walk_config', 'args' => [ { 'type' => 'ap_directive_t *', 'name' => 'conftree' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'section_vector' } ] }, { 'return_type' => 'int', 'name' => 'ap_xml_parse_input', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_xml_doc **', 'name' => 'pdoc' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_accept', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_pool_t *', 'name' => 'connection_pool' } ] }, { 'return_type' => 'apr_memnode_t *', 'name' => 'apr_allocator_alloc', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_allocator_create', 'args' => [ { 'type' => 'apr_allocator_t **', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_destroy', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_free', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_memnode_t *', 'name' => 'memnode' } ] }, { 'return_type' => 'apr_thread_mutex_t *', 'name' => 'apr_allocator_get_mutex', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_allocator_get_owner', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_max_free_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'apr_thread_mutex_t *', 'name' => 'apr_allocator_mutex_get', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_mutex_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_allocator_owner_get', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_owner_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_set_max_free', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_set_mutex', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_set_owner', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_app_initialize', 'args' => [ { 'type' => 'int *', 'name' => 'argc' }, { 'type' => 'char const * const * *', 'name' => 'argv' }, { 'type' => 'char const * const * *', 'name' => 'env' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_append', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'first' }, { 'type' => 'const apr_array_header_t *', 'name' => 'second' } ] }, { 'return_type' => 'void', 'name' => 'apr_array_cat', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'dst' }, { 'type' => 'const apr_array_header_t *', 'name' => 'src' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_copy_hdr', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' }, { 'type' => 'int', 'name' => 'elt_size' } ] }, { 'return_type' => 'void *', 'name' => 'apr_array_pop', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'char *', 'name' => 'apr_array_pstrcat', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' }, { 'type' => 'const char', 'name' => 'sep' } ] }, { 'return_type' => 'void *', 'name' => 'apr_array_push', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_int64_t', 'name' => 'apr_atoi64', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' } ] }, { 'return_type' => 'void', 'name' => 'apr_atomic_add', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_cas', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'long', 'name' => 'with' }, { 'type' => 'long', 'name' => 'cmp' } ] }, { 'return_type' => 'int', 'name' => 'apr_atomic_dec', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' } ] }, { 'return_type' => 'void', 'name' => 'apr_atomic_inc', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_atomic_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_atomic_set', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode', 'args' => [ { 'type' => 'char *', 'name' => 'plain_dst' }, { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode_binary', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'plain_dst' }, { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode_len', 'args' => [ { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode', 'args' => [ { 'type' => 'char *', 'name' => 'coded_dst' }, { 'type' => 'const char *', 'name' => 'plain_src' }, { 'type' => 'int', 'name' => 'len_plain_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode_binary', 'args' => [ { 'type' => 'char *', 'name' => 'coded_dst' }, { 'type' => 'const unsigned char *', 'name' => 'plain_src' }, { 'type' => 'int', 'name' => 'len_plain_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode_len', 'args' => [ { 'type' => 'int', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bind', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket_brigade *', 'name' => 'apr_brigade_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_destroy', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_flatten', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char *', 'name' => 'c' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_length', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'int', 'name' => 'read_all' }, { 'type' => 'apr_off_t *', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_partition', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_off_t', 'name' => 'point' }, { 'type' => 'apr_bucket **', 'name' => 'after_point' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_pflatten', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char **', 'name' => 'c' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_printf', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg4' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_putc', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_puts', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_putstrs', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_bucket_brigade *', 'name' => 'apr_brigade_split', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_bucket *', 'name' => 'e' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_split_line', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bbOut' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bbIn' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'maxbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_to_iovec', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'struct iovec *', 'name' => 'vec' }, { 'type' => 'int *', 'name' => 'nvec' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_vprintf', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'va' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_vputstrs', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'va_list', 'name' => 'va' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_write', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_writev', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' } ] }, { 'return_type' => 'void *', 'name' => 'apr_bucket_alloc', 'args' => [ { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket_alloc_t *', 'name' => 'apr_bucket_alloc_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_bucket_alloc_t *', 'name' => 'apr_bucket_alloc_create_ex', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_alloc_destroy', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_copy_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'e' }, { 'type' => 'apr_bucket **', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_destroy_noop', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_eos_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_eos_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_file_create', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_file_enable_mmap', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'enabled' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_file_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_flush_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_flush_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_free', 'args' => [ { 'type' => 'void *', 'name' => 'block' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_heap_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'void (*free_func)(void *data)', 'name' => 'arg2' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_heap_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'void (*free_func)(void *data)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_immortal_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_immortal_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_mmap_create', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_mmap_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pipe_create', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thispipe' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pipe_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_file_t *', 'name' => 'thispipe' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pool_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pool_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_setaside_noop', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_setaside_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_shared_copy', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket **', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'apr_bucket_shared_destroy', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_shared_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_shared_split', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_simple_copy', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket **', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_simple_split', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_socket_create', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thissock' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_socket_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_socket_t *', 'name' => 'thissock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_split_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_transient_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_transient_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'char *', 'name' => 'apr_collapse_spaces', 'args' => [ { 'type' => 'char *', 'name' => 'dest' }, { 'type' => 'const char *', 'name' => 'src' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_connect', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'char *', 'name' => 'apr_cpystrn', 'args' => [ { 'type' => 'char *', 'name' => 'dst' }, { 'type' => 'const char *', 'name' => 'src' }, { 'type' => 'apr_size_t', 'name' => 'dst_size' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ctime', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_current_userid', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'apr_date_checkmask', 'args' => [ { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'mask' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_date_parse_http', 'args' => [ { 'type' => 'const char *', 'name' => 'date' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_date_parse_rfc', 'args' => [ { 'type' => 'const char *', 'name' => 'date' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_close', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_delete', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbm_exists', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_fetch', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' }, { 'type' => 'apr_datum_t *', 'name' => 'pvalue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_firstkey', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t *', 'name' => 'pkey' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_freedatum', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_get_usednames', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'pathname' }, { 'type' => 'const char **', 'name' => 'used1' }, { 'type' => 'const char **', 'name' => 'used2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_get_usednames_ex', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'pathname' }, { 'type' => 'const char **', 'name' => 'used1' }, { 'type' => 'const char **', 'name' => 'used2' } ] }, { 'return_type' => 'char *', 'name' => 'apr_dbm_geterror', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'int *', 'name' => 'errcode' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'apr_size_t', 'name' => 'errbufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_nextkey', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t *', 'name' => 'pkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_open', 'args' => [ { 'type' => 'apr_dbm_t **', 'name' => 'dbm' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_open_ex', 'args' => [ { 'type' => 'apr_dbm_t **', 'name' => 'dbm' }, { 'type' => 'const char*', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_store', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' }, { 'type' => 'apr_datum_t', 'name' => 'value' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_close', 'args' => [ { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_make', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_make_recursive', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_open', 'args' => [ { 'type' => 'apr_dir_t **', 'name' => 'new_dir' }, { 'type' => 'const char *', 'name' => 'dirname' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_read', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_remove', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_rewind', 'args' => [ { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_dso_error', 'args' => [ { 'type' => 'apr_dso_handle_t *', 'name' => 'dso' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_load', 'args' => [ { 'type' => 'apr_dso_handle_t **', 'name' => 'res_handle' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_sym', 'args' => [ { 'type' => 'apr_dso_handle_sym_t *', 'name' => 'ressym' }, { 'type' => 'apr_dso_handle_t *', 'name' => 'handle' }, { 'type' => 'const char *', 'name' => 'symname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_unload', 'args' => [ { 'type' => 'apr_dso_handle_t *', 'name' => 'handle' } ] }, { 'return_type' => 'void', 'name' => 'apr_dynamic_fn_register', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'apr_opt_fn_t *', 'name' => 'pfn' } ] }, { 'return_type' => 'apr_opt_fn_t *', 'name' => 'apr_dynamic_fn_retrieve', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_delete', 'args' => [ { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_get', 'args' => [ { 'type' => 'char **', 'name' => 'value' }, { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_set', 'args' => [ { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'const char *', 'name' => 'value' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_explode_localtime', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_explode_time', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' }, { 'type' => 'apr_int32_t', 'name' => 'offs' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_append', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_attrs_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_fileattrs_t', 'name' => 'attributes' }, { 'type' => 'apr_fileattrs_t', 'name' => 'attr_mask' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_close', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_copy', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_data_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_dup', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_dup2', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_eof', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fptr' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'apr_file_flags_get', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_flush', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_getc', 'args' => [ { 'type' => 'char *', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_gets', 'args' => [ { 'type' => 'char *', 'name' => 'str' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_info_get', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_inherit_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_inherit_unset', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_lock', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_mktemp', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'fp' }, { 'type' => 'char *', 'name' => 'templ' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_mtime_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_name_get', 'args' => [ { 'type' => 'const char **', 'name' => 'new_path' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_namedpipe_create', 'args' => [ { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'newf' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'flag' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stderr', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stdin', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stdout', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_perms_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_create', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'in' }, { 'type' => 'apr_file_t **', 'name' => 'out' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_timeout_get', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thepipe' }, { 'type' => 'apr_interval_time_t *', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_timeout_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thepipe' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_file_pool_get', 'args' => [ { 'type' => 'const apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'int', 'name' => 'apr_file_printf', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fptr' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_putc', 'args' => [ { 'type' => 'char', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_puts', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_read', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'void *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_read_full', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'void *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' }, { 'type' => 'apr_size_t *', 'name' => 'bytes_read' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_remove', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_rename', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_seek', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_seek_where_t', 'name' => 'where' }, { 'type' => 'apr_off_t *', 'name' => 'offset' } ] }, { 'return_type' => 'void', 'name' => 'apr_file_set_inherit', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_setaside', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_trunc', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fp' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_ungetc', 'args' => [ { 'type' => 'char', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_unlock', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'void', 'name' => 'apr_file_unset_inherit', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_write', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_write_full', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' }, { 'type' => 'apr_size_t *', 'name' => 'bytes_written' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_writev', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_filename_of_pathname', 'args' => [ { 'type' => 'const char *', 'name' => 'pathname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_encoding', 'args' => [ { 'type' => 'int *', 'name' => 'style' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_get', 'args' => [ { 'type' => 'char **', 'name' => 'path' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_list_merge', 'args' => [ { 'type' => 'char **', 'name' => 'liststr' }, { 'type' => 'apr_array_header_t *', 'name' => 'pathelts' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_list_split', 'args' => [ { 'type' => 'apr_array_header_t **', 'name' => 'pathelts' }, { 'type' => 'const char *', 'name' => 'liststr' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_merge', 'args' => [ { 'type' => 'char **', 'name' => 'newpath' }, { 'type' => 'const char *', 'name' => 'rootpath' }, { 'type' => 'const char *', 'name' => 'addpath' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_filepath_name_get', 'args' => [ { 'type' => 'const char *', 'name' => 'pathname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_root', 'args' => [ { 'type' => 'const char **', 'name' => 'rootpath' }, { 'type' => 'const char **', 'name' => 'filepath' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_set', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_fnmatch', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'const char *', 'name' => 'strings' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'return_type' => 'int', 'name' => 'apr_fnmatch_test', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_generate_random_bytes', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_get_groupid', 'args' => [ { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'groupname' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_get_groupname', 'args' => [ { 'type' => 'char **', 'name' => 'groupname' }, { 'type' => 'apr_gid_t', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_get_home_directory', 'args' => [ { 'type' => 'char **', 'name' => 'dirname' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_get_userid', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_get_username', 'args' => [ { 'type' => 'char **', 'name' => 'username' }, { 'type' => 'apr_uid_t', 'name' => 'userid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gethostname', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getnameinfo', 'args' => [ { 'type' => 'char **', 'name' => 'hostname' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' }, { 'type' => 'apr_int32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt', 'args' => [ { 'type' => 'apr_getopt_t *', 'name' => 'os' }, { 'type' => 'const char *', 'name' => 'opts' }, { 'type' => 'char *', 'name' => 'option_ch' }, { 'type' => 'const char **', 'name' => 'option_arg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt_init', 'args' => [ { 'type' => 'apr_getopt_t **', 'name' => 'os' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'const char * const *', 'name' => 'argv' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt_long', 'args' => [ { 'type' => 'apr_getopt_t *', 'name' => 'os' }, { 'type' => 'const apr_getopt_option_t *', 'name' => 'opts' }, { 'type' => 'int *', 'name' => 'option_ch' }, { 'type' => 'const char **', 'name' => 'option_arg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getservbyname', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' }, { 'type' => 'const char *', 'name' => 'servname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getsocketopt', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t *', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gid_get', 'args' => [ { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'groupname' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gid_name_get', 'args' => [ { 'type' => 'char **', 'name' => 'groupname' }, { 'type' => 'apr_gid_t', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_child_init', 'args' => [ { 'type' => 'apr_global_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_create', 'args' => [ { 'type' => 'apr_global_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_lockmech_e', 'name' => 'mech' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_destroy', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_lock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_global_mutex_pool_get', 'args' => [ { 'type' => 'const apr_global_mutex_t *', 'name' => 'theglobal_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_trylock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_unlock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_group_name_get', 'args' => [ { 'type' => 'char **', 'name' => 'groupname' }, { 'type' => 'apr_gid_t', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const apr_hash_t *', 'name' => 'h' } ] }, { 'return_type' => 'unsigned int', 'name' => 'apr_hash_count', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'apr_hash_index_t *', 'name' => 'apr_hash_first', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'void *', 'name' => 'apr_hash_get', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' }, { 'type' => 'const void *', 'name' => 'key' }, { 'type' => 'apr_ssize_t', 'name' => 'klen' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_hash_t *', 'name' => 'h1' }, { 'type' => 'const apr_hash_t *', 'name' => 'h2' }, { 'type' => 'void * (*merger)(apr_pool_t *p, const void *key, apr_ssize_t klen, const void *h1_val, const void *h2_val, const void *data)', 'name' => 'arg3' }, { 'type' => 'const void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_hash_index_t *', 'name' => 'apr_hash_next', 'args' => [ { 'type' => 'apr_hash_index_t *', 'name' => 'hi' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_overlay', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_hash_t *', 'name' => 'overlay' }, { 'type' => 'const apr_hash_t *', 'name' => 'base' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_hash_pool_get', 'args' => [ { 'type' => 'const apr_hash_t *', 'name' => 'thehash' } ] }, { 'return_type' => 'void', 'name' => 'apr_hash_set', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' }, { 'type' => 'const void *', 'name' => 'key' }, { 'type' => 'apr_ssize_t', 'name' => 'klen' }, { 'type' => 'const void *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_hash_this', 'args' => [ { 'type' => 'apr_hash_index_t *', 'name' => 'hi' }, { 'type' => 'const void **', 'name' => 'key' }, { 'type' => 'apr_ssize_t *', 'name' => 'klen' }, { 'type' => 'void **', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_hook_debug_show', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' } ] }, { 'return_type' => 'void', 'name' => 'apr_hook_deregister_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_hook_sort_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_hook_sort_register', 'args' => [ { 'type' => 'const char *', 'name' => 'szHookName' }, { 'type' => 'apr_array_header_t **', 'name' => 'aHooks' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_implode_gmt', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'apr_time_exp_t *', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_initialize', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ipsubnet_create', 'args' => [ { 'type' => 'apr_ipsubnet_t **', 'name' => 'ipsub' }, { 'type' => 'const char *', 'name' => 'ipstr' }, { 'type' => 'const char *', 'name' => 'mask_or_numbits' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'apr_ipsubnet_test', 'args' => [ { 'type' => 'apr_ipsubnet_t *', 'name' => 'ipsub' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'int', 'name' => 'apr_is_empty_array', 'args' => [ { 'type' => 'const apr_array_header_t *', 'name' => 'a' } ] }, { 'return_type' => 'int', 'name' => 'apr_is_empty_table', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_is_fnmatch', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' } ] }, { 'return_type' => 'char *', 'name' => 'apr_itoa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_listen', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'backlog' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_lstat', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'char *', 'name' => 'apr_ltoa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'long', 'name' => 'n' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_init', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_set_xlate', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_update', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'const void *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_encode', 'args' => [ { 'type' => 'const char *', 'name' => 'password' }, { 'type' => 'const char *', 'name' => 'salt' }, { 'type' => 'char *', 'name' => 'result' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_init', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_set_xlate', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_update', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' }, { 'type' => 'const void *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_create', 'args' => [ { 'type' => 'apr_mmap_t **', 'name' => 'newmmap' }, { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'apr_int32_t', 'name' => 'flag' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_delete', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_dup', 'args' => [ { 'type' => 'apr_mmap_t **', 'name' => 'new_mmap' }, { 'type' => 'apr_mmap_t *', 'name' => 'old_mmap' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'transfer_ownership' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_offset', 'args' => [ { 'type' => 'void **', 'name' => 'addr' }, { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'char *', 'name' => 'apr_off_t_toa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_off_t', 'name' => 'n' } ] }, { 'return_type' => 'void', 'name' => 'apr_optional_hook_add', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'void (*pfn)(void)', 'name' => 'arg1' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_optional_hook_get', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_os_default_encoding', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dir_get', 'args' => [ { 'type' => 'apr_os_dir_t **', 'name' => 'thedir' }, { 'type' => 'apr_dir_t *', 'name' => 'dir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dir_put', 'args' => [ { 'type' => 'apr_dir_t **', 'name' => 'dir' }, { 'type' => 'apr_os_dir_t *', 'name' => 'thedir' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dso_handle_get', 'args' => [ { 'type' => 'apr_os_dso_handle_t *', 'name' => 'dso' }, { 'type' => 'apr_dso_handle_t *', 'name' => 'aprdso' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dso_handle_put', 'args' => [ { 'type' => 'apr_dso_handle_t **', 'name' => 'dso' }, { 'type' => 'apr_os_dso_handle_t', 'name' => 'thedso' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_exp_time_get', 'args' => [ { 'type' => 'apr_os_exp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_time_exp_t *', 'name' => 'aprtime' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_exp_time_put', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'aprtime' }, { 'type' => 'apr_os_exp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_file_get', 'args' => [ { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_file_put', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_global_mutex_get', 'args' => [ { 'type' => 'apr_os_global_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_global_mutex_t *', 'name' => 'pmutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_imp_time_get', 'args' => [ { 'type' => 'apr_os_imp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_time_t *', 'name' => 'aprtime' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_imp_time_put', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'aprtime' }, { 'type' => 'apr_os_imp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_os_locale_encoding', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_pipe_put', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_pipe_put_ex', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'int', 'name' => 'register_cleanup' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_proc_mutex_get', 'args' => [ { 'type' => 'apr_os_proc_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_proc_mutex_t *', 'name' => 'pmutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_proc_mutex_put', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'pmutex' }, { 'type' => 'apr_os_proc_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_shm_get', 'args' => [ { 'type' => 'apr_os_shm_t *', 'name' => 'osshm' }, { 'type' => 'apr_shm_t *', 'name' => 'shm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_shm_put', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'shm' }, { 'type' => 'apr_os_shm_t *', 'name' => 'osshm' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_get', 'args' => [ { 'type' => 'apr_os_sock_t *', 'name' => 'thesock' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_make', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'apr_sock' }, { 'type' => 'apr_os_sock_info_t *', 'name' => 'os_sock_info' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_put', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'sock' }, { 'type' => 'apr_os_sock_t *', 'name' => 'thesock' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_os_thread_t', 'name' => 'apr_os_thread_current', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_os_thread_equal', 'args' => [ { 'type' => 'apr_os_thread_t', 'name' => 'tid1' }, { 'type' => 'apr_os_thread_t', 'name' => 'tid2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_thread_get', 'args' => [ { 'type' => 'apr_os_thread_t **', 'name' => 'thethd' }, { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_thread_put', 'args' => [ { 'type' => 'apr_thread_t **', 'name' => 'thd' }, { 'type' => 'apr_os_thread_t *', 'name' => 'thethd' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_threadkey_get', 'args' => [ { 'type' => 'apr_os_threadkey_t *', 'name' => 'thekey' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_threadkey_put', 'args' => [ { 'type' => 'apr_threadkey_t **', 'name' => 'key' }, { 'type' => 'apr_os_threadkey_t *', 'name' => 'thekey' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'void *', 'name' => 'apr_palloc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'void *', 'name' => 'apr_palloc_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_parse_addr_port', 'args' => [ { 'type' => 'char **', 'name' => 'addr' }, { 'type' => 'char **', 'name' => 'scope_id' }, { 'type' => 'apr_port_t *', 'name' => 'port' }, { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_password_get', 'args' => [ { 'type' => 'const char *', 'name' => 'prompt' }, { 'type' => 'char *', 'name' => 'pwbuf' }, { 'type' => 'apr_size_t *', 'name' => 'bufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_password_validate', 'args' => [ { 'type' => 'const char *', 'name' => 'passwd' }, { 'type' => 'const char *', 'name' => 'hash' } ] }, { 'return_type' => 'void *', 'name' => 'apr_pcalloc_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'void *', 'name' => 'apr_pmemdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'm' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_int32_t', 'name' => 'numsock' }, { 'type' => 'apr_int32_t *', 'name' => 'nsds' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_revents_get', 'args' => [ { 'type' => 'apr_int16_t *', 'name' => 'event' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_setup', 'args' => [ { 'type' => 'apr_pollfd_t **', 'name' => 'new_poll' }, { 'type' => 'apr_int32_t', 'name' => 'num' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_socket_add', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int16_t', 'name' => 'event' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_socket_clear', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_int16_t', 'name' => 'events' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_socket_mask', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int16_t', 'name' => 'events' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll_socket_remove', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_add', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'const apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_create', 'args' => [ { 'type' => 'apr_pollset_t **', 'name' => 'pollset' }, { 'type' => 'apr_uint32_t', 'name' => 'size' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_destroy', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_poll', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_int32_t *', 'name' => 'num' }, { 'type' => 'const apr_pollfd_t **', 'name' => 'descriptors' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_remove', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'const apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_abortfunc_t', 'name' => 'apr_pool_abort_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_abort_set', 'args' => [ { 'type' => 'apr_abortfunc_t', 'name' => 'abortfunc' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_allocator_t *', 'name' => 'apr_pool_allocator_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_child_cleanup_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*plain_cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_status_t (*child_cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_for_exec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_kill', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_cleanup_null', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*plain_cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_status_t (*child_cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_cleanup_run', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_clear', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_clear_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_ex', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_pool_t *', 'name' => 'parent' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_ex_debug', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_pool_t *', 'name' => 'parent' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_destroy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_destroy_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_abortfunc_t', 'name' => 'apr_pool_get_abort', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_pool_get_parent', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_initialize', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_pool_is_ancestor', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'apr_pool_t *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_note_subprocess', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'apr_kill_conditions_e', 'name' => 'how' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_pool_parent_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_set_abort', 'args' => [ { 'type' => 'apr_abortfunc_t', 'name' => 'abortfunc' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_tag', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'tag' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_terminate', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_set', 'args' => [ { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_setn', 'args' => [ { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_create', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'new_proc' }, { 'type' => 'const char *', 'name' => 'progname' }, { 'type' => 'const char * const *', 'name' => 'args' }, { 'type' => 'const char * const *', 'name' => 'env' }, { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_detach', 'args' => [ { 'type' => 'int', 'name' => 'daemonize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_fork', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_kill', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int', 'name' => 'sig' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_child_init', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_create', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_lockmech_e', 'name' => 'mech' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_defname', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_destroy', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_lock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_lockfile', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_name', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_proc_mutex_pool_get', 'args' => [ { 'type' => 'const apr_proc_mutex_t *', 'name' => 'theproc_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_trylock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_unlock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_other_child_alert', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int', 'name' => 'reason' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_check', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_other_child_read', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_refresh', 'args' => [ { 'type' => 'apr_other_child_rec_t *', 'name' => 'ocr' }, { 'type' => 'int', 'name' => 'reason' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_refresh_all', 'args' => [ { 'type' => 'int', 'name' => 'reason' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_register', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'void (*maintenance) (int reason, void *, int status)', 'name' => 'arg1' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_file_t *', 'name' => 'write_fd' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_unregister', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_wait', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_exit_why_e *', 'name' => 'exitwhy' }, { 'type' => 'apr_wait_how_e', 'name' => 'waithow' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_wait_all_procs', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_exit_why_e *', 'name' => 'exitwhy' }, { 'type' => 'apr_wait_how_e', 'name' => 'waithow' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_err_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_err' }, { 'type' => 'apr_file_t *', 'name' => 'parent_err' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_errfn_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_child_errfn_t *', 'name' => 'errfn' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_in_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_in' }, { 'type' => 'apr_file_t *', 'name' => 'parent_in' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_out_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_out' }, { 'type' => 'apr_file_t *', 'name' => 'parent_out' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_cmdtype_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_cmdtype_e', 'name' => 'cmd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_create', 'args' => [ { 'type' => 'apr_procattr_t **', 'name' => 'new_attr' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_detach_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'detach' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_dir_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'const char *', 'name' => 'dir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_error_check_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'chk' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_io_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'in' }, { 'type' => 'apr_int32_t', 'name' => 'out' }, { 'type' => 'apr_int32_t', 'name' => 'err' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_limit_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'what' }, { 'type' => 'struct rlimit *', 'name' => 'limit' } ] }, { 'return_type' => 'char *', 'name' => 'apr_psprintf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrcat', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => '...', 'name' => 'arg1' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrcatv', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrmemdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrndup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pvsprintf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_create', 'args' => [ { 'type' => 'apr_queue_t **', 'name' => 'queue' }, { 'type' => 'unsigned int', 'name' => 'queue_capacity' }, { 'type' => 'apr_pool_t *', 'name' => 'a' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_interrupt_all', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_pop', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_push', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'unsigned int', 'name' => 'apr_queue_size', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_term', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_trypop', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_trypush', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_recv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_recvfrom', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'from' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'apr_register_optional_fn', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'apr_opt_fn_t *', 'name' => 'pfn' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_acquire', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'void **', 'name' => 'resource' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_create', 'args' => [ { 'type' => 'apr_reslist_t **', 'name' => 'reslist' }, { 'type' => 'int', 'name' => 'min' }, { 'type' => 'int', 'name' => 'smax' }, { 'type' => 'int', 'name' => 'hmax' }, { 'type' => 'apr_interval_time_t', 'name' => 'ttl' }, { 'type' => 'apr_reslist_constructor', 'name' => 'con' }, { 'type' => 'apr_reslist_destructor', 'name' => 'de' }, { 'type' => 'void *', 'name' => 'params' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_destroy', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_release', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'void *', 'name' => 'resource' } ] }, { 'return_type' => 'apr_opt_fn_t *', 'name' => 'apr_retrieve_optional_fn', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rfc822_date', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_close', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_delete', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'const apr_sdbm_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_fetch', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'value' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_firstkey', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_lock', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_nextkey', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_open', 'args' => [ { 'type' => 'apr_sdbm_t **', 'name' => 'db' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'apr_sdbm_rdonly', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_store', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'key' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'value' }, { 'type' => 'int', 'name' => 'opt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_unlock', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_send', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sendfile', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'apr_hdtr_t *', 'name' => 'hdtr' }, { 'type' => 'apr_off_t *', 'name' => 'offset' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_int32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sendto', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'where' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sendv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_int32_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_setsocketopt', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_setup_signal_thread', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_sha1_base64', 'args' => [ { 'type' => 'const char *', 'name' => 'clear' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'char *', 'name' => 'out' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_init', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_update', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'unsigned int', 'name' => 'inputLen' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_update_binary', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'unsigned int', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_attach', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'm' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void *', 'name' => 'apr_shm_baseaddr_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_create', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'm' }, { 'type' => 'apr_size_t', 'name' => 'reqsize' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_destroy', 'args' => [ { 'type' => 'apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_detach', 'args' => [ { 'type' => 'apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_shm_pool_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'theshm' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_shm_size_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'void', 'name' => 'apr_show_hook', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shutdown', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' }, { 'type' => 'apr_shutdown_how_e', 'name' => 'how' } ] }, { 'return_type' => 'apr_sigfunc_t *', 'name' => 'apr_signal', 'args' => [ { 'type' => 'int', 'name' => 'signo' }, { 'type' => 'apr_sigfunc_t * func', 'name' => 'arg1' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_signal_description_get', 'args' => [ { 'type' => 'int', 'name' => 'signum' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_signal_get_description', 'args' => [ { 'type' => 'int', 'name' => 'signum' } ] }, { 'return_type' => 'void', 'name' => 'apr_signal_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pglobal' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_signal_thread', 'args' => [ { 'type' => 'int(*signal_handler)(int signum)', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'apr_sleep', 'args' => [ { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_snprintf', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'int', 'name' => 'apr_sockaddr_equal', 'args' => [ { 'type' => 'const apr_sockaddr_t *', 'name' => 'addr1' }, { 'type' => 'const apr_sockaddr_t *', 'name' => 'addr2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_info_get', 'args' => [ { 'type' => 'apr_sockaddr_t **', 'name' => 'sa' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_int32_t', 'name' => 'family' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_ip_get', 'args' => [ { 'type' => 'char **', 'name' => 'addr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_ip_set', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' }, { 'type' => 'const char *', 'name' => 'addr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_port_get', 'args' => [ { 'type' => 'apr_port_t *', 'name' => 'port' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_port_set', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' }, { 'type' => 'apr_port_t', 'name' => 'port' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_accept', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_pool_t *', 'name' => 'connection_pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_addr_get', 'args' => [ { 'type' => 'apr_sockaddr_t **', 'name' => 'sa' }, { 'type' => 'apr_interface_e', 'name' => 'which' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_atmark', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'atmark' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_bind', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_close', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_connect', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_create', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'int', 'name' => 'family' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_create_ex', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'int', 'name' => 'family' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int', 'name' => 'protocol' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_data_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void*)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_from_file', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'newsock' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_inherit_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_inherit_unset', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_listen', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'backlog' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_opt_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t *', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_opt_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_protocol_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'protocol' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_recv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_recvfrom', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'from' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_send', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendfile', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'apr_hdtr_t *', 'name' => 'hdtr' }, { 'type' => 'apr_off_t *', 'name' => 'offset' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_int32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendto', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'where' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_int32_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'apr_socket_set_inherit', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'skt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_shutdown', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' }, { 'type' => 'apr_shutdown_how_e', 'name' => 'how' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_timeout_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_interval_time_t *', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_timeout_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'apr_socket_unset_inherit', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'skt' } ] }, { 'return_type' => 'void', 'name' => 'apr_sort_hooks', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_stat', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strerror', 'args' => [ { 'type' => 'apr_status_t', 'name' => 'statcode' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strfsize', 'args' => [ { 'type' => 'apr_off_t', 'name' => 'size' }, { 'type' => 'char *', 'name' => 'buf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_strftime', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'apr_size_t *', 'name' => 'retsize' }, { 'type' => 'apr_size_t', 'name' => 'max' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => 'apr_time_exp_t *', 'name' => 'tm' } ] }, { 'return_type' => 'const apr_strmatch_pattern *', 'name' => 'apr_strmatch_precompile', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'case_sensitive' } ] }, { 'return_type' => 'int', 'name' => 'apr_strnatcasecmp', 'args' => [ { 'type' => 'char const *', 'name' => 'a' }, { 'type' => 'char const *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'apr_strnatcmp', 'args' => [ { 'type' => 'char const *', 'name' => 'a' }, { 'type' => 'char const *', 'name' => 'b' } ] }, { 'return_type' => 'apr_int64_t', 'name' => 'apr_strtoi64', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'char **', 'name' => 'end' }, { 'type' => 'int', 'name' => 'base' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strtok', 'args' => [ { 'type' => 'char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'sep' }, { 'type' => 'char **', 'name' => 'last' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_add', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_addn', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_clear', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_compress', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_table_do', 'args' => [ { 'type' => 'void *', 'name' => 'comp' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'const apr_array_header_t *', 'name' => 'apr_table_elts', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_table_get', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_merge', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_mergen', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_overlap', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 'a' }, { 'type' => 'const apr_table_t *', 'name' => 'b' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_overlay', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_table_t *', 'name' => 'overlay' }, { 'type' => 'const apr_table_t *', 'name' => 'base' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_set', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_setn', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_unset', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'int', 'name' => 'apr_table_vdo', 'args' => [ { 'type' => 'void *', 'name' => 'comp' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => 'va_list', 'name' => 'vp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_temp_dir_get', 'args' => [ { 'type' => 'const char **', 'name' => 'temp_dir' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_terminate', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_terminate2', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_text_append', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_text_header *', 'name' => 'hdr' }, { 'type' => 'const char *', 'name' => 'text' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_broadcast', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_create', 'args' => [ { 'type' => 'apr_thread_cond_t **', 'name' => 'cond' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_destroy', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_cond_pool_get', 'args' => [ { 'type' => 'const apr_thread_cond_t *', 'name' => 'thethread_cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_signal', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_timedwait', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_wait', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_create', 'args' => [ { 'type' => 'apr_thread_t **', 'name' => 'new_thread' }, { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_thread_start_t func', 'name' => 'arg2' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_thread_t *', 'name' => 'thread' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_data_set', 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup) (void *)', 'name' => 'arg2' }, { 'type' => 'apr_thread_t *', 'name' => 'thread' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_detach', 'args' => [ { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_exit', 'args' => [ { 'type' => 'apr_thread_t *', 'name' => 'thd' }, { 'type' => 'apr_status_t', 'name' => 'retval' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_join', 'args' => [ { 'type' => 'apr_status_t *', 'name' => 'retval' }, { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_create', 'args' => [ { 'type' => 'apr_thread_mutex_t **', 'name' => 'mutex' }, { 'type' => 'unsigned int', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_destroy', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_lock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_mutex_pool_get', 'args' => [ { 'type' => 'const apr_thread_mutex_t *', 'name' => 'thethread_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_trylock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_unlock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_once', 'args' => [ { 'type' => 'apr_thread_once_t *', 'name' => 'control' }, { 'type' => 'void (*func)(void)', 'name' => 'arg1' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_once_init', 'args' => [ { 'type' => 'apr_thread_once_t **', 'name' => 'control' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_pool_get', 'args' => [ { 'type' => 'const apr_thread_t *', 'name' => 'thethread' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_create', 'args' => [ { 'type' => 'apr_thread_rwlock_t **', 'name' => 'rwlock' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_destroy', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_rwlock_pool_get', 'args' => [ { 'type' => 'const apr_thread_rwlock_t *', 'name' => 'thethread_rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_rdlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_tryrdlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_trywrlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_unlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_wrlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'void', 'name' => 'apr_thread_yield', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_create', 'args' => [ { 'type' => 'apr_threadattr_t **', 'name' => 'new_attr' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_detach_get', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_detach_set', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_threadkey_t *', 'name' => 'threadkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_data_set', 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup) (void *)', 'name' => 'arg2' }, { 'type' => 'apr_threadkey_t *', 'name' => 'threadkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_create', 'args' => [ { 'type' => 'apr_threadkey_t **', 'name' => 'key' }, { 'type' => 'void (*dest)(void *)', 'name' => 'arg1' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_delete', 'args' => [ { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_get', 'args' => [ { 'type' => 'void **', 'name' => 'new_mem' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_set', 'args' => [ { 'type' => 'void *', 'name' => 'priv' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_ansi_put', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'time_t', 'name' => 'input' } ] }, { 'return_type' => 'void', 'name' => 'apr_time_clock_hires', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_get', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'apr_time_exp_t *', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_gmt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_gmt_get', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'apr_time_exp_t *', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_lt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_tz', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' }, { 'type' => 'apr_int32_t', 'name' => 'offs' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_time_now', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_tokenize_to_argv', 'args' => [ { 'type' => 'const char *', 'name' => 'arg_str' }, { 'type' => 'char ***', 'name' => 'argv_out' }, { 'type' => 'apr_pool_t *', 'name' => 'token_context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_current', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_get', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_homepath_get', 'args' => [ { 'type' => 'char **', 'name' => 'dirname' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_name_get', 'args' => [ { 'type' => 'char **', 'name' => 'username' }, { 'type' => 'apr_uid_t', 'name' => 'userid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'apr_uri_default_port_for_scheme', 'args' => [ { 'type' => 'const char *', 'name' => 'scheme_str' } ] }, { 'return_type' => 'int', 'name' => 'apr_uri_parse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'uri' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' } ] }, { 'return_type' => 'int', 'name' => 'apr_uri_parse_hostinfo', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostinfo' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'apr_uri_port_of_scheme', 'args' => [ { 'type' => 'const char *', 'name' => 'scheme_str' } ] }, { 'return_type' => 'char *', 'name' => 'apr_uri_unparse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_uri_t *', 'name' => 'uptr' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'void', 'name' => 'apr_uuid_format', 'args' => [ { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'const apr_uuid_t *', 'name' => 'uuid' } ] }, { 'return_type' => 'void', 'name' => 'apr_uuid_get', 'args' => [ { 'type' => 'apr_uuid_t *', 'name' => 'uuid' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uuid_parse', 'args' => [ { 'type' => 'apr_uuid_t *', 'name' => 'uuid' }, { 'type' => 'const char *', 'name' => 'uuid_str' } ] }, { 'return_type' => 'void', 'name' => 'apr_version', 'args' => [ { 'type' => 'apr_version_t *', 'name' => 'pvsn' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_version_string', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_vformatter', 'args' => [ { 'type' => 'int (*flush_func)(apr_vformatter_buff_t *b)', 'name' => 'arg0' }, { 'type' => 'apr_vformatter_buff_t *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'int', 'name' => 'apr_vsnprintf', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_wait_for_io_or_timeout', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'apr_socket_t *', 'name' => 's' }, { 'type' => 'int', 'name' => 'for_read' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_close', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_conv_buffer', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'const char *', 'name' => 'inbuf' }, { 'type' => 'apr_size_t *', 'name' => 'inbytes_left' }, { 'type' => 'char *', 'name' => 'outbuf' }, { 'type' => 'apr_size_t *', 'name' => 'outbytes_left' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'apr_xlate_conv_byte', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'unsigned char', 'name' => 'inchar' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_get_sb', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'int *', 'name' => 'onoff' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_open', 'args' => [ { 'type' => 'apr_xlate_t **', 'name' => 'convset' }, { 'type' => 'const char *', 'name' => 'topage' }, { 'type' => 'const char *', 'name' => 'frompage' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_sb_get', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'int *', 'name' => 'onoff' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_xml_empty_elem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_xml_elem *', 'name' => 'elem' } ] }, { 'return_type' => 'int', 'name' => 'apr_xml_insert_uri', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'uri_array' }, { 'type' => 'const char *', 'name' => 'uri' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parse_file', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_xml_parser **', 'name' => 'parser' }, { 'type' => 'apr_xml_doc **', 'name' => 'ppdoc' }, { 'type' => 'apr_file_t *', 'name' => 'xmlfd' }, { 'type' => 'apr_size_t', 'name' => 'buffer_length' } ] }, { 'return_type' => 'apr_xml_parser *', 'name' => 'apr_xml_parser_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parser_done', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'apr_xml_doc **', 'name' => 'pdoc' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parser_feed', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'char *', 'name' => 'apr_xml_parser_geterror', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'apr_size_t', 'name' => 'errbufsize' } ] }, { 'return_type' => 'void', 'name' => 'apr_xml_quote_elem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_xml_elem *', 'name' => 'elem' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_xml_quote_string', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'quotes' } ] }, { 'return_type' => 'void', 'name' => 'apr_xml_to_text', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_xml_elem *', 'name' => 'elem' }, { 'type' => 'int', 'name' => 'style' }, { 'type' => 'apr_array_header_t *', 'name' => 'namespaces' }, { 'type' => 'int *', 'name' => 'ns_map' }, { 'type' => 'const char **', 'name' => 'pbuf' }, { 'type' => 'apr_size_t *', 'name' => 'psize' } ] } ]; 1; mod_perl-2.0.9/xs/tables/current/Apache2/StructureTable.pm0000644000104000010010000017404112540623210024125 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package Apache2::StructureTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache::ParseSource/0.02 # ! Fri Dec 10 14:14:10 2004 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::StructureTable = [ { 'type' => 'ap_HOOK_access_checker_t', 'elts' => [] }, { 'type' => 'ap_HOOK_auth_checker_t', 'elts' => [] }, { 'type' => 'ap_HOOK_check_user_id_t', 'elts' => [] }, { 'type' => 'ap_HOOK_child_init_t', 'elts' => [] }, { 'type' => 'ap_HOOK_create_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_create_request_t', 'elts' => [] }, { 'type' => 'ap_HOOK_default_port_t', 'elts' => [] }, { 'type' => 'ap_HOOK_error_log_t', 'elts' => [] }, { 'type' => 'ap_HOOK_fixups_t', 'elts' => [] }, { 'type' => 'ap_HOOK_get_mgmt_items_t', 'elts' => [] }, { 'type' => 'ap_HOOK_get_suexec_identity_t', 'elts' => [] }, { 'type' => 'ap_HOOK_handler_t', 'elts' => [] }, { 'type' => 'ap_HOOK_header_parser_t', 'elts' => [] }, { 'type' => 'ap_HOOK_http_method_t', 'elts' => [] }, { 'type' => 'ap_HOOK_insert_error_filter_t', 'elts' => [] }, { 'type' => 'ap_HOOK_insert_filter_t', 'elts' => [] }, { 'type' => 'ap_HOOK_log_transaction_t', 'elts' => [] }, { 'type' => 'ap_HOOK_map_to_storage_t', 'elts' => [] }, { 'type' => 'ap_HOOK_open_logs_t', 'elts' => [] }, { 'type' => 'ap_HOOK_optional_fn_retrieve_t', 'elts' => [] }, { 'type' => 'ap_HOOK_post_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_post_read_request_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_mpm_t', 'elts' => [] }, { 'type' => 'ap_HOOK_process_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_quick_handler_t', 'elts' => [] }, { 'type' => 'ap_HOOK_status_hook_t', 'elts' => [] }, { 'type' => 'ap_HOOK_translate_name_t', 'elts' => [] }, { 'type' => 'ap_HOOK_type_checker_t', 'elts' => [] }, { 'type' => 'ap_LINK_access_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_access_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_auth_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_auth_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_check_user_id_t', 'elts' => [ { 'type' => 'ap_HOOK_check_user_id_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_child_init_t', 'elts' => [ { 'type' => 'ap_HOOK_child_init_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_create_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_create_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_create_request_t', 'elts' => [ { 'type' => 'ap_HOOK_create_request_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_default_port_t', 'elts' => [ { 'type' => 'ap_HOOK_default_port_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_error_log_t', 'elts' => [ { 'type' => 'ap_HOOK_error_log_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_fixups_t', 'elts' => [ { 'type' => 'ap_HOOK_fixups_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_get_mgmt_items_t', 'elts' => [ { 'type' => 'ap_HOOK_get_mgmt_items_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_get_suexec_identity_t', 'elts' => [ { 'type' => 'ap_HOOK_get_suexec_identity_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_handler_t', 'elts' => [ { 'type' => 'ap_HOOK_handler_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_header_parser_t', 'elts' => [ { 'type' => 'ap_HOOK_header_parser_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_http_method_t', 'elts' => [ { 'type' => 'ap_HOOK_http_method_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_insert_error_filter_t', 'elts' => [ { 'type' => 'ap_HOOK_insert_error_filter_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_insert_filter_t', 'elts' => [ { 'type' => 'ap_HOOK_insert_filter_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_log_transaction_t', 'elts' => [ { 'type' => 'ap_HOOK_log_transaction_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_map_to_storage_t', 'elts' => [ { 'type' => 'ap_HOOK_map_to_storage_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_open_logs_t', 'elts' => [ { 'type' => 'ap_HOOK_open_logs_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_optional_fn_retrieve_t', 'elts' => [ { 'type' => 'ap_HOOK_optional_fn_retrieve_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_post_config_t', 'elts' => [ { 'type' => 'ap_HOOK_post_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_post_read_request_t', 'elts' => [ { 'type' => 'ap_HOOK_post_read_request_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_config_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_mpm_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_mpm_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_process_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_process_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_quick_handler_t', 'elts' => [ { 'type' => 'ap_HOOK_quick_handler_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_status_hook_t', 'elts' => [ { 'type' => 'ap_HOOK_status_hook_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_translate_name_t', 'elts' => [ { 'type' => 'ap_HOOK_translate_name_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_type_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_type_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_bucket_error', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'data' } ] }, { 'type' => 'ap_conf_vector_t', 'elts' => [] }, { 'type' => 'ap_configfile_t', 'elts' => [ { 'type' => 'int(*) (void *param)', 'name' => 'getch' }, { 'type' => 'void *(*) (void *buf, size_t bufsiz, void *param)', 'name' => 'getstr' }, { 'type' => 'int(*) (void *param)', 'name' => 'close' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'unsigned', 'name' => 'line_number' } ] }, { 'type' => 'ap_conn_keepalive_e', 'elts' => [] }, { 'type' => 'ap_directive_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'directive' }, { 'type' => 'const char *', 'name' => 'args' }, { 'type' => 'ap_directive_t *', 'name' => 'next' }, { 'type' => 'ap_directive_t *', 'name' => 'first_child' }, { 'type' => 'ap_directive_t *', 'name' => 'parent' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'int', 'name' => 'line_num' } ] }, { 'type' => 'ap_filter_func', 'elts' => [ { 'type' => 'ap_out_filter_func', 'name' => 'out_func' }, { 'type' => 'ap_in_filter_func', 'name' => 'in_func' } ] }, { 'type' => 'ap_filter_rec_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init_func' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' }, { 'type' => 'ap_filter_rec_t *', 'name' => 'next' } ] }, { 'type' => 'ap_filter_t', 'elts' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'frec' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'ap_filter_t *', 'name' => 'next' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'type' => 'ap_filter_type', 'elts' => [] }, { 'type' => 'ap_generation_t', 'elts' => [] }, { 'type' => 'ap_in_filter_func', 'elts' => [] }, { 'type' => 'ap_init_filter_func', 'elts' => [] }, { 'type' => 'ap_input_mode_t', 'elts' => [] }, { 'type' => 'ap_listen_rec', 'elts' => [ { 'type' => 'ap_listen_rec *', 'name' => 'next' }, { 'type' => 'apr_socket_t *', 'name' => 'sd' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'bind_addr' }, { 'type' => 'accept_function', 'name' => 'accept_func' }, { 'type' => 'int', 'name' => 'active' } ] }, { 'type' => 'ap_method_list_t', 'elts' => [ { 'type' => 'apr_int64_t', 'name' => 'method_mask' }, { 'type' => 'apr_array_header_t *', 'name' => 'method_list' } ] }, { 'type' => 'ap_mgmt_item_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'description' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_mgmt_type_e', 'name' => 'vtype' }, { 'type' => 'ap_mgmt_value', 'name' => 'v' } ] }, { 'type' => 'ap_mgmt_type_e', 'elts' => [] }, { 'type' => 'ap_mgmt_value', 'elts' => [ { 'type' => 'const char *', 'name' => 's_value' }, { 'type' => 'long', 'name' => 'i_value' }, { 'type' => 'apr_hash_t *', 'name' => 'h_value' } ] }, { 'type' => 'ap_out_filter_func', 'elts' => [] }, { 'type' => 'ap_pcw_dir_cb_t', 'elts' => [] }, { 'type' => 'ap_pcw_srv_cb_t', 'elts' => [] }, { 'type' => 'ap_pod_t', 'elts' => [ { 'type' => 'apr_file_t *', 'name' => 'pod_in' }, { 'type' => 'apr_file_t *', 'name' => 'pod_out' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'type' => 'ap_sb_handle_t', 'elts' => [] }, { 'type' => 'ap_scoreboard_e', 'elts' => [] }, { 'type' => 'ap_unix_identity_t', 'elts' => [ { 'type' => 'uid_t', 'name' => 'uid' }, { 'type' => 'gid_t', 'name' => 'gid' }, { 'type' => 'int', 'name' => 'userdir' } ] }, { 'type' => 'apr_OFN_ap_logio_add_bytes_out_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_signal_server_t', 'elts' => [] }, { 'type' => 'apr_OFN_modperl_interp_unselect_t', 'elts' => [] }, { 'type' => 'apr_abortfunc_t', 'elts' => [] }, { 'type' => 'apr_allocator_t', 'elts' => [] }, { 'type' => 'apr_array_header_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'int', 'name' => 'elt_size' }, { 'type' => 'int', 'name' => 'nelts' }, { 'type' => 'int', 'name' => 'nalloc' }, { 'type' => 'char *', 'name' => 'elts' } ] }, { 'type' => 'apr_brigade_flush', 'elts' => [] }, { 'type' => 'apr_bucket', 'elts' => [ { 'type' => '_ANON 53', 'name' => 'link' }, { 'type' => 'const apr_bucket_type_t *', 'name' => 'type' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'void(*)(void *e)', 'name' => 'free' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'type' => 'apr_bucket_alloc_t', 'elts' => [] }, { 'type' => 'apr_bucket_brigade', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_list', 'name' => 'list' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'bucket_alloc' } ] }, { 'type' => 'apr_bucket_file', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_pool_t *', 'name' => 'readpool' }, { 'type' => 'int', 'name' => 'can_mmap' } ] }, { 'type' => 'apr_bucket_heap', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'char *', 'name' => 'base' }, { 'type' => 'apr_size_t', 'name' => 'alloc_len' }, { 'type' => 'void(*)(void *data)', 'name' => 'free_func' } ] }, { 'type' => 'apr_bucket_mmap', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'apr_mmap_t *', 'name' => 'mmap' } ] }, { 'type' => 'apr_bucket_pool', 'elts' => [ { 'type' => 'apr_bucket_heap', 'name' => 'heap' }, { 'type' => 'const char *', 'name' => 'base' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'type' => 'apr_bucket_refcount', 'elts' => [ { 'type' => 'int', 'name' => 'refcount' } ] }, { 'type' => 'apr_bucket_structs', 'elts' => [] }, { 'type' => 'apr_bucket_type_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'num_func' }, { 'type' => 'int', 'name' => 'is_metadata' }, { 'type' => 'void(*)(void *data)', 'name' => 'destroy' }, { 'type' => 'apr_status_t(*)(apr_bucket *b, const char **str, apr_size_t *len, apr_read_type_e block)', 'name' => 'read' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_pool_t *pool)', 'name' => 'setaside' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_size_t point)', 'name' => 'split' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_bucket **c)', 'name' => 'copy' } ] }, { 'type' => 'apr_byte_t', 'elts' => [] }, { 'type' => 'apr_child_errfn_t', 'elts' => [] }, { 'type' => 'apr_cmdtype_e', 'elts' => [] }, { 'type' => 'apr_datatype_e', 'elts' => [] }, { 'type' => 'apr_datum_t', 'elts' => [ { 'type' => 'char *', 'name' => 'dptr' }, { 'type' => 'apr_size_t', 'name' => 'dsize' } ] }, { 'type' => 'apr_dbm_t', 'elts' => [] }, { 'type' => 'apr_descriptor', 'elts' => [ { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'apr_socket_t *', 'name' => 's' } ] }, { 'type' => 'apr_dev_t', 'elts' => [] }, { 'type' => 'apr_dir_t', 'elts' => [] }, { 'type' => 'apr_dso_handle_sym_t', 'elts' => [] }, { 'type' => 'apr_dso_handle_t', 'elts' => [] }, { 'type' => 'apr_exit_why_e', 'elts' => [] }, { 'type' => 'apr_file_t', 'elts' => [] }, { 'type' => 'apr_fileattrs_t', 'elts' => [] }, { 'type' => 'apr_fileperms_t', 'elts' => [] }, { 'type' => 'apr_filetype_e', 'elts' => [] }, { 'type' => 'apr_finfo_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_int32_t', 'name' => 'valid' }, { 'type' => 'apr_fileperms_t', 'name' => 'protection' }, { 'type' => 'apr_filetype_e', 'name' => 'filetype' }, { 'type' => 'apr_uid_t', 'name' => 'user' }, { 'type' => 'apr_gid_t', 'name' => 'group' }, { 'type' => 'apr_ino_t', 'name' => 'inode' }, { 'type' => 'apr_dev_t', 'name' => 'device' }, { 'type' => 'apr_int32_t', 'name' => 'nlink' }, { 'type' => 'apr_off_t', 'name' => 'size' }, { 'type' => 'apr_off_t', 'name' => 'csize' }, { 'type' => 'apr_time_t', 'name' => 'atime' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'apr_time_t', 'name' => 'ctime' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_file_t *', 'name' => 'filehand' } ] }, { 'type' => 'apr_getopt_err_fn_t', 'elts' => [] }, { 'type' => 'apr_getopt_option_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'optch' }, { 'type' => 'int', 'name' => 'has_arg' }, { 'type' => 'const char *', 'name' => 'description' } ] }, { 'type' => 'apr_getopt_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'cont' }, { 'type' => 'apr_getopt_err_fn_t *', 'name' => 'errfn' }, { 'type' => 'void *', 'name' => 'errarg' }, { 'type' => 'int', 'name' => 'ind' }, { 'type' => 'int', 'name' => 'opt' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'const char **', 'name' => 'argv' }, { 'type' => 'char const *', 'name' => 'place' }, { 'type' => 'int', 'name' => 'interleave' }, { 'type' => 'int', 'name' => 'skip_start' }, { 'type' => 'int', 'name' => 'skip_end' } ] }, { 'type' => 'apr_gid_t', 'elts' => [] }, { 'type' => 'apr_global_mutex_t', 'elts' => [] }, { 'type' => 'apr_hash_index_t', 'elts' => [] }, { 'type' => 'apr_hash_t', 'elts' => [] }, { 'type' => 'apr_hdtr_t', 'elts' => [ { 'type' => 'iovec *', 'name' => 'headers' }, { 'type' => 'int', 'name' => 'numheaders' }, { 'type' => 'iovec *', 'name' => 'trailers' }, { 'type' => 'int', 'name' => 'numtrailers' } ] }, { 'type' => 'apr_in_addr_t', 'elts' => [ { 'type' => 'in_addr_t', 'name' => 's_addr' } ] }, { 'type' => 'apr_ino_t', 'elts' => [] }, { 'type' => 'apr_int16_t', 'elts' => [] }, { 'type' => 'apr_int32_t', 'elts' => [] }, { 'type' => 'apr_int64_t', 'elts' => [] }, { 'type' => 'apr_interface_e', 'elts' => [] }, { 'type' => 'apr_interval_time_t', 'elts' => [] }, { 'type' => 'apr_ipsubnet_t', 'elts' => [] }, { 'type' => 'apr_kill_conditions_e', 'elts' => [] }, { 'type' => 'apr_lockmech_e', 'elts' => [] }, { 'type' => 'apr_md4_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[4]', 'name' => 'state' }, { 'type' => 'apr_uint32_t[2]', 'name' => 'count' }, { 'type' => 'unsigned char[64]', 'name' => 'buffer' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'type' => 'apr_md5_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[4]', 'name' => 'state' }, { 'type' => 'apr_uint32_t[2]', 'name' => 'count' }, { 'type' => 'unsigned char[64]', 'name' => 'buffer' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'type' => 'apr_memnode_t', 'elts' => [ { 'type' => 'apr_memnode_t *', 'name' => 'next' }, { 'type' => 'apr_memnode_t **', 'name' => 'ref' }, { 'type' => 'apr_uint32_t', 'name' => 'index' }, { 'type' => 'apr_uint32_t', 'name' => 'free_index' }, { 'type' => 'char *', 'name' => 'first_avail' }, { 'type' => 'char *', 'name' => 'endp' } ] }, { 'type' => 'apr_mmap_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'cntxt' }, { 'type' => 'void *', 'name' => 'mm' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'int', 'name' => 'unused' }, { 'type' => '_ANON 51', 'name' => 'link' } ] }, { 'type' => 'apr_off_t', 'elts' => [] }, { 'type' => 'apr_opt_fn_t', 'elts' => [] }, { 'type' => 'apr_os_dir_t', 'elts' => [] }, { 'type' => 'apr_os_dso_handle_t', 'elts' => [] }, { 'type' => 'apr_os_exp_time_t', 'elts' => [ { 'type' => 'int', 'name' => 'tm_sec' }, { 'type' => 'int', 'name' => 'tm_min' }, { 'type' => 'int', 'name' => 'tm_hour' }, { 'type' => 'int', 'name' => 'tm_mday' }, { 'type' => 'int', 'name' => 'tm_mon' }, { 'type' => 'int', 'name' => 'tm_year' }, { 'type' => 'int', 'name' => 'tm_wday' }, { 'type' => 'int', 'name' => 'tm_yday' }, { 'type' => 'int', 'name' => 'tm_isdst' }, { 'type' => 'long int', 'name' => 'tm_gmtoff' }, { 'type' => '__const char *', 'name' => 'tm_zone' } ] }, { 'type' => 'apr_os_file_t', 'elts' => [] }, { 'type' => 'apr_os_global_mutex_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_proc_mutex_t *', 'name' => 'proc_mutex' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'thread_mutex' } ] }, { 'type' => 'apr_os_imp_time_t', 'elts' => [ { 'type' => '__time_t', 'name' => 'tv_sec' }, { 'type' => '__suseconds_t', 'name' => 'tv_usec' } ] }, { 'type' => 'apr_os_proc_mutex_t', 'elts' => [ { 'type' => 'int', 'name' => 'crossproc' }, { 'type' => 'pthread_mutex_t *', 'name' => 'pthread_interproc' }, { 'type' => 'pthread_mutex_t *', 'name' => 'intraproc' } ] }, { 'type' => 'apr_os_proc_t', 'elts' => [] }, { 'type' => 'apr_os_shm_t', 'elts' => [] }, { 'type' => 'apr_os_sock_info_t', 'elts' => [ { 'type' => 'apr_os_sock_t *', 'name' => 'os_sock' }, { 'type' => 'sockaddr *', 'name' => 'local' }, { 'type' => 'sockaddr *', 'name' => 'remote' }, { 'type' => 'int', 'name' => 'family' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'type' => 'apr_os_sock_t', 'elts' => [] }, { 'type' => 'apr_os_thread_t', 'elts' => [] }, { 'type' => 'apr_os_threadkey_t', 'elts' => [] }, { 'type' => 'apr_other_child_rec_t', 'elts' => [] }, { 'type' => 'apr_pollfd_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_datatype_e', 'name' => 'desc_type' }, { 'type' => 'apr_int16_t', 'name' => 'reqevents' }, { 'type' => 'apr_int16_t', 'name' => 'rtnevents' }, { 'type' => 'apr_descriptor', 'name' => 'desc' }, { 'type' => 'void *', 'name' => 'client_data' } ] }, { 'type' => 'apr_pollset_t', 'elts' => [] }, { 'type' => 'apr_pool_t', 'elts' => [] }, { 'type' => 'apr_port_t', 'elts' => [] }, { 'type' => 'apr_proc_mutex_t', 'elts' => [] }, { 'type' => 'apr_proc_t', 'elts' => [ { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'apr_file_t *', 'name' => 'in' }, { 'type' => 'apr_file_t *', 'name' => 'out' }, { 'type' => 'apr_file_t *', 'name' => 'err' } ] }, { 'type' => 'apr_procattr_t', 'elts' => [] }, { 'type' => 'apr_queue_t', 'elts' => [] }, { 'type' => 'apr_read_type_e', 'elts' => [] }, { 'type' => 'apr_reslist_constructor', 'elts' => [] }, { 'type' => 'apr_reslist_destructor', 'elts' => [] }, { 'type' => 'apr_reslist_t', 'elts' => [] }, { 'type' => 'apr_sdbm_datum_t', 'elts' => [ { 'type' => 'char *', 'name' => 'dptr' }, { 'type' => 'int', 'name' => 'dsize' } ] }, { 'type' => 'apr_sdbm_t', 'elts' => [] }, { 'type' => 'apr_seek_where_t', 'elts' => [] }, { 'type' => 'apr_sha1_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[5]', 'name' => 'digest' }, { 'type' => 'apr_uint32_t', 'name' => 'count_lo' }, { 'type' => 'apr_uint32_t', 'name' => 'count_hi' }, { 'type' => 'apr_uint32_t[16]', 'name' => 'data' }, { 'type' => 'int', 'name' => 'local' } ] }, { 'type' => 'apr_shm_t', 'elts' => [] }, { 'type' => 'apr_short_interval_time_t', 'elts' => [] }, { 'type' => 'apr_shutdown_how_e', 'elts' => [] }, { 'type' => 'apr_sigfunc_t', 'elts' => [] }, { 'type' => 'apr_signum_t', 'elts' => [] }, { 'type' => 'apr_size_t', 'elts' => [] }, { 'type' => 'apr_sockaddr_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'char *', 'name' => 'hostname' }, { 'type' => 'char *', 'name' => 'servname' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_int32_t', 'name' => 'family' }, { 'type' => 'union _ANON 1', 'name' => 'sa' }, { 'type' => 'apr_socklen_t', 'name' => 'salen' }, { 'type' => 'int', 'name' => 'ipaddr_len' }, { 'type' => 'int', 'name' => 'addr_str_len' }, { 'type' => 'void *', 'name' => 'ipaddr_ptr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'next' } ] }, { 'type' => 'apr_socket_t', 'elts' => [] }, { 'type' => 'apr_socklen_t', 'elts' => [] }, { 'type' => 'apr_ssize_t', 'elts' => [] }, { 'type' => 'apr_status_t', 'elts' => [] }, { 'type' => 'apr_strmatch_pattern', 'elts' => [ { 'type' => 'const char *(*)(const apr_strmatch_pattern *this_pattern, const char *s, apr_size_t slen)', 'name' => 'compare' }, { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'void *', 'name' => 'context' } ] }, { 'type' => 'apr_table_entry_t', 'elts' => [ { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'char *', 'name' => 'val' }, { 'type' => 'apr_uint32_t', 'name' => 'key_checksum' } ] }, { 'type' => 'apr_table_t', 'elts' => [] }, { 'type' => 'apr_text', 'elts' => [ { 'type' => 'const char *', 'name' => 'text' }, { 'type' => 'apr_text *', 'name' => 'next' } ] }, { 'type' => 'apr_text_header', 'elts' => [ { 'type' => 'apr_text *', 'name' => 'first' }, { 'type' => 'apr_text *', 'name' => 'last' } ] }, { 'type' => 'apr_thread_cond_t', 'elts' => [] }, { 'type' => 'apr_thread_mutex_t', 'elts' => [] }, { 'type' => 'apr_thread_once_t', 'elts' => [] }, { 'type' => 'apr_thread_rwlock_t', 'elts' => [] }, { 'type' => 'apr_thread_start_t', 'elts' => [] }, { 'type' => 'apr_thread_t', 'elts' => [] }, { 'type' => 'apr_threadattr_t', 'elts' => [] }, { 'type' => 'apr_threadkey_t', 'elts' => [] }, { 'type' => 'apr_time_exp_t', 'elts' => [ { 'type' => 'apr_int32_t', 'name' => 'tm_usec' }, { 'type' => 'apr_int32_t', 'name' => 'tm_sec' }, { 'type' => 'apr_int32_t', 'name' => 'tm_min' }, { 'type' => 'apr_int32_t', 'name' => 'tm_hour' }, { 'type' => 'apr_int32_t', 'name' => 'tm_mday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_mon' }, { 'type' => 'apr_int32_t', 'name' => 'tm_year' }, { 'type' => 'apr_int32_t', 'name' => 'tm_wday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_yday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_isdst' }, { 'type' => 'apr_int32_t', 'name' => 'tm_gmtoff' } ] }, { 'type' => 'apr_time_t', 'elts' => [] }, { 'type' => 'apr_uid_t', 'elts' => [] }, { 'type' => 'apr_uint16_t', 'elts' => [] }, { 'type' => 'apr_uint32_t', 'elts' => [] }, { 'type' => 'apr_uint64_t', 'elts' => [] }, { 'type' => 'apr_uri_t', 'elts' => [ { 'type' => 'char *', 'name' => 'scheme' }, { 'type' => 'char *', 'name' => 'hostinfo' }, { 'type' => 'char *', 'name' => 'user' }, { 'type' => 'char *', 'name' => 'password' }, { 'type' => 'char *', 'name' => 'hostname' }, { 'type' => 'char *', 'name' => 'port_str' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'char *', 'name' => 'query' }, { 'type' => 'char *', 'name' => 'fragment' }, { 'type' => 'hostent *', 'name' => 'hostent' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'unsigned', 'name' => 'is_initialized' }, { 'type' => 'unsigned', 'name' => 'dns_looked_up' }, { 'type' => 'unsigned', 'name' => 'dns_resolved' } ] }, { 'type' => 'apr_uuid_t', 'elts' => [ { 'type' => 'unsigned char[16]', 'name' => 'data' } ] }, { 'type' => 'apr_version_t', 'elts' => [ { 'type' => 'int', 'name' => 'major' }, { 'type' => 'int', 'name' => 'minor' }, { 'type' => 'int', 'name' => 'patch' }, { 'type' => 'int', 'name' => 'is_dev' } ] }, { 'type' => 'apr_vformatter_buff_t', 'elts' => [ { 'type' => 'char *', 'name' => 'curpos' }, { 'type' => 'char *', 'name' => 'endpos' } ] }, { 'type' => 'apr_wait_how_e', 'elts' => [] }, { 'type' => 'apr_xlate_t', 'elts' => [] }, { 'type' => 'apr_xml_attr', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'ns' }, { 'type' => 'const char *', 'name' => 'value' }, { 'type' => 'apr_xml_attr *', 'name' => 'next' } ] }, { 'type' => 'apr_xml_doc', 'elts' => [ { 'type' => 'apr_xml_elem *', 'name' => 'root' }, { 'type' => 'apr_array_header_t *', 'name' => 'namespaces' } ] }, { 'type' => 'apr_xml_elem', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'ns' }, { 'type' => 'const char *', 'name' => 'lang' }, { 'type' => 'apr_text_header', 'name' => 'first_cdata' }, { 'type' => 'apr_text_header', 'name' => 'following_cdata' }, { 'type' => 'apr_xml_elem *', 'name' => 'parent' }, { 'type' => 'apr_xml_elem *', 'name' => 'next' }, { 'type' => 'apr_xml_elem *', 'name' => 'first_child' }, { 'type' => 'apr_xml_attr *', 'name' => 'attr' }, { 'type' => 'apr_xml_elem *', 'name' => 'last_child' }, { 'type' => 'apr_xml_ns_scope *', 'name' => 'ns_scope' }, { 'type' => 'void *', 'name' => 'priv' } ] }, { 'type' => 'apr_xml_parser', 'elts' => [] }, { 'type' => 'cmd_func', 'elts' => [] }, { 'type' => 'cmd_parms', 'elts' => [ { 'type' => 'void *', 'name' => 'info' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'apr_int64_t', 'name' => 'limited' }, { 'type' => 'apr_array_header_t *', 'name' => 'limited_xmethods' }, { 'type' => 'ap_method_list_t *', 'name' => 'xlimited' }, { 'type' => 'ap_configfile_t *', 'name' => 'config_file' }, { 'type' => 'ap_directive_t *', 'name' => 'directive' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'const command_rec *', 'name' => 'cmd' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'context' }, { 'type' => 'const ap_directive_t *', 'name' => 'err_directive' } ] }, { 'type' => 'command_rec', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'cmd_func', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'cmd_data' }, { 'type' => 'int', 'name' => 'req_override' }, { 'type' => 'enum cmd_how', 'name' => 'args_how' }, { 'type' => 'const char *', 'name' => 'errmsg' } ] }, { 'type' => 'conn_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'server_rec *', 'name' => 'base_server' }, { 'type' => 'void *', 'name' => 'vhost_lookup_data' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'local_addr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'remote_addr' }, { 'type' => 'char *', 'name' => 'remote_ip' }, { 'type' => 'char *', 'name' => 'remote_host' }, { 'type' => 'char *', 'name' => 'remote_logname' }, { 'type' => 'unsigned', 'name' => 'aborted' }, { 'type' => 'ap_conn_keepalive_e', 'name' => 'keepalive' }, { 'type' => 'signed int', 'name' => 'double_reverse' }, { 'type' => 'int', 'name' => 'keepalives' }, { 'type' => 'char *', 'name' => 'local_ip' }, { 'type' => 'char *', 'name' => 'local_host' }, { 'type' => 'long', 'name' => 'id' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'conn_config' }, { 'type' => 'apr_table_t *', 'name' => 'notes' }, { 'type' => 'ap_filter_t *', 'name' => 'input_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'output_filters' }, { 'type' => 'void *', 'name' => 'sbh' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'bucket_alloc' } ] }, { 'type' => 'core_net_rec', 'elts' => [] }, { 'type' => 'htaccess_result', 'elts' => [ { 'type' => 'const char *', 'name' => 'dir' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'htaccess' }, { 'type' => 'const struct htaccess_result *', 'name' => 'next' } ] }, { 'type' => 'modperl_uri_t', 'elts' => [ { 'type' => 'apr_uri_t', 'name' => 'uri' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'char *', 'name' => 'path_info' } ] }, { 'type' => 'module', 'elts' => [ { 'type' => 'int', 'name' => 'version' }, { 'type' => 'int', 'name' => 'minor_version' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'dynamic_load_handle' }, { 'type' => 'module_struct *', 'name' => 'next' }, { 'type' => 'unsigned long', 'name' => 'magic' }, { 'type' => 'void(*) (process_rec *process)', 'name' => 'rewrite_args' }, { 'type' => 'void *(*) (apr_pool_t *p, char *dir)', 'name' => 'create_dir_config' }, { 'type' => 'void *(*) (apr_pool_t *p, void *base_conf, void *new_conf)', 'name' => 'merge_dir_config' }, { 'type' => 'void *(*) (apr_pool_t *p, server_rec *s)', 'name' => 'create_server_config' }, { 'type' => 'void *(*) (apr_pool_t *p, void *base_conf, void *new_conf)', 'name' => 'merge_server_config' }, { 'type' => 'const command_rec *', 'name' => 'cmds' }, { 'type' => 'void(*) (apr_pool_t *p)', 'name' => 'register_hooks' } ] }, { 'type' => 'piped_log', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_file_t *[2]', 'name' => 'fds' }, { 'type' => 'char *', 'name' => 'program' }, { 'type' => 'apr_proc_t *', 'name' => 'pid' } ] }, { 'type' => 'process_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'const char * const *', 'name' => 'argv' }, { 'type' => 'const char *', 'name' => 'short_name' } ] }, { 'type' => 'request_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'conn_rec *', 'name' => 'connection' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'request_rec *', 'name' => 'next' }, { 'type' => 'request_rec *', 'name' => 'prev' }, { 'type' => 'request_rec *', 'name' => 'main' }, { 'type' => 'char *', 'name' => 'the_request' }, { 'type' => 'int', 'name' => 'assbackwards' }, { 'type' => 'int', 'name' => 'proxyreq' }, { 'type' => 'int', 'name' => 'header_only' }, { 'type' => 'char *', 'name' => 'protocol' }, { 'type' => 'int', 'name' => 'proto_num' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_time_t', 'name' => 'request_time' }, { 'type' => 'const char *', 'name' => 'status_line' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'method' }, { 'type' => 'int', 'name' => 'method_number' }, { 'type' => 'apr_int64_t', 'name' => 'allowed' }, { 'type' => 'apr_array_header_t *', 'name' => 'allowed_xmethods' }, { 'type' => 'ap_method_list_t *', 'name' => 'allowed_methods' }, { 'type' => 'apr_off_t', 'name' => 'sent_bodyct' }, { 'type' => 'apr_off_t', 'name' => 'bytes_sent' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'int', 'name' => 'chunked' }, { 'type' => 'const char *', 'name' => 'range' }, { 'type' => 'apr_off_t', 'name' => 'clength' }, { 'type' => 'apr_off_t', 'name' => 'remaining' }, { 'type' => 'apr_off_t', 'name' => 'read_length' }, { 'type' => 'int', 'name' => 'read_body' }, { 'type' => 'int', 'name' => 'read_chunked' }, { 'type' => 'unsigned', 'name' => 'expecting_100' }, { 'type' => 'apr_table_t *', 'name' => 'headers_in' }, { 'type' => 'apr_table_t *', 'name' => 'headers_out' }, { 'type' => 'apr_table_t *', 'name' => 'err_headers_out' }, { 'type' => 'apr_table_t *', 'name' => 'subprocess_env' }, { 'type' => 'apr_table_t *', 'name' => 'notes' }, { 'type' => 'const char *', 'name' => 'content_type' }, { 'type' => 'const char *', 'name' => 'handler' }, { 'type' => 'const char *', 'name' => 'content_encoding' }, { 'type' => 'apr_array_header_t *', 'name' => 'content_languages' }, { 'type' => 'char *', 'name' => 'vlist_validator' }, { 'type' => 'char *', 'name' => 'user' }, { 'type' => 'char *', 'name' => 'ap_auth_type' }, { 'type' => 'int', 'name' => 'no_cache' }, { 'type' => 'int', 'name' => 'no_local_copy' }, { 'type' => 'char *', 'name' => 'unparsed_uri' }, { 'type' => 'char *', 'name' => 'uri' }, { 'type' => 'char *', 'name' => 'filename' }, { 'type' => 'char *', 'name' => 'canonical_filename' }, { 'type' => 'char *', 'name' => 'path_info' }, { 'type' => 'char *', 'name' => 'args' }, { 'type' => 'apr_finfo_t', 'name' => 'finfo' }, { 'type' => 'apr_uri_t', 'name' => 'parsed_uri' }, { 'type' => 'int', 'name' => 'used_path_info' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'per_dir_config' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'request_config' }, { 'type' => 'const struct htaccess_result *', 'name' => 'htaccess' }, { 'type' => 'ap_filter_t *', 'name' => 'output_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'input_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'proto_output_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'proto_input_filters' }, { 'type' => 'int', 'name' => 'eos_sent' } ] }, { 'type' => 'server_addr_rec', 'elts' => [ { 'type' => 'server_addr_rec *', 'name' => 'next' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'host_addr' }, { 'type' => 'apr_port_t', 'name' => 'host_port' }, { 'type' => 'char *', 'name' => 'virthost' } ] }, { 'type' => 'server_rec', 'elts' => [ { 'type' => 'process_rec *', 'name' => 'process' }, { 'type' => 'server_rec *', 'name' => 'next' }, { 'type' => 'const char *', 'name' => 'defn_name' }, { 'type' => 'unsigned', 'name' => 'defn_line_number' }, { 'type' => 'char *', 'name' => 'server_admin' }, { 'type' => 'char *', 'name' => 'server_hostname' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'char *', 'name' => 'error_fname' }, { 'type' => 'apr_file_t *', 'name' => 'error_log' }, { 'type' => 'int', 'name' => 'loglevel' }, { 'type' => 'int', 'name' => 'is_virtual' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'module_config' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'lookup_defaults' }, { 'type' => 'server_addr_rec *', 'name' => 'addrs' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_interval_time_t', 'name' => 'keep_alive_timeout' }, { 'type' => 'int', 'name' => 'keep_alive_max' }, { 'type' => 'int', 'name' => 'keep_alive' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'pathlen' }, { 'type' => 'apr_array_header_t *', 'name' => 'names' }, { 'type' => 'apr_array_header_t *', 'name' => 'wild_names' }, { 'type' => 'int', 'name' => 'limit_req_line' }, { 'type' => 'int', 'name' => 'limit_req_fieldsize' }, { 'type' => 'int', 'name' => 'limit_req_fields' } ] }, { 'type' => 'subrequest_rec', 'elts' => [] }, { 'type' => 'unixd_config_rec', 'elts' => [ { 'type' => 'const char *', 'name' => 'user_name' }, { 'type' => 'uid_t', 'name' => 'user_id' }, { 'type' => 'gid_t', 'name' => 'group_id' }, { 'type' => 'int', 'name' => 'suexec_enabled' } ] }, { 'type' => 'modperl_interp_t', 'elts' => [ { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'int', 'name' => 'num_requests' }, { 'type' => 'U8', 'name' => 'flags' }, { 'type' => 'modperl_config_con_t *', 'name' => 'ccfg' }, { 'type' => 'int', 'name' => 'refcnt' }, { 'type' => 'unsigned long', 'name' => 'tid' } ] }, { 'type' => 'modperl_interp_pool_t', 'elts' => [ { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'tipool_cfg' }, { 'type' => 'modperl_interp_t *', 'name' => 'parent' } ] }, { 'type' => 'modperl_tipool_t', 'elts' => [ { 'type' => 'perl_mutex', 'name' => 'tiplock' }, { 'type' => 'perl_cond', 'name' => 'available' }, { 'type' => 'modperl_list_t *', 'name' => 'idle' }, { 'type' => 'modperl_list_t *', 'name' => 'busy' }, { 'type' => 'int', 'name' => 'in_use' }, { 'type' => 'int', 'name' => 'size' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'cfg' }, { 'type' => 'modperl_tipool_vtbl_t *', 'name' => 'func' } ] }, { 'type' => 'modperl_tipool_config_t', 'elts' => [ { 'type' => 'int', 'name' => 'start' }, { 'type' => 'int', 'name' => 'min_spare' }, { 'type' => 'int', 'name' => 'max_spare' }, { 'type' => 'int', 'name' => 'max' }, { 'type' => 'int', 'name' => 'max_requests' } ] } ]; 1; mod_perl-2.0.9/xs/tables/current/APR/0000755000104000010010000000000012540623210017767 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current/APR/FunctionTable.pm0000644000104000010010000001050612540623210023064 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package APR::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: this file was manually generated on # ! Tue Jun 22 22:00:00 2004 # ! It contains a subset of functions appearing in # ! ModPerl::FunctionTable used to build APR.so # ! Eventually this will be autogenerated by # ! Apache::ParseSource # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $APR::FunctionTable = [ { 'return_type' => 'void', 'name' => 'modperl_trace', 'args' => [ { 'type' => 'const char *', 'name' => 'func' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_level_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile' }, { 'type' => 'const char *', 'name' => 'level' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_logfile_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile_new' } ] }, { 'return_type' => 'unsigned long', 'name' => 'modperl_debug_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'void *', 'name' => 'p' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_hash_tied_object', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_sv_setref_uv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'rv' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'UV', 'name' => 'uv' } ] }, { 'return_type' => 'modperl_uri_t *', 'name' => 'modperl_uri_new', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_gensym', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'pack' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_error_strerror', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' } ] }, { 'return_type' => 'void', 'name' => 'modperl_croak', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' }, { 'type' => 'const char*', 'name' => 'func' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_unselect', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'modperl_bucket_sv_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, ]; 1; mod_perl-2.0.9/xs/tables/current/ModPerl/0000755000104000010010000000000012540623210020707 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current/ModPerl/FunctionTable.pm0000644000104000010010000045240412540623210024013 0ustar AdministratorsNone# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*- package ModPerl::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by ModPerl::ParseSource/0.01 # ! Mon May 23 14:15:47 2005 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $ModPerl::FunctionTable = [ { 'return_type' => 'int', 'name' => 'modperl_access_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_apr_array_header2avrv', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_array_header_t *', 'name' => 'array' } ] }, { 'return_type' => 'int', 'name' => 'modperl_authen_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_authz_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'modperl_avrv2apr_array_header', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'avrv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_brigade_dump', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'modperl_bucket_sv_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'AV *', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_files', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_per_dir', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_per_srv', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_pre_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'void', 'name' => 'modperl_callback_process', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_run_handlers', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_cgi_header_parse', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'const char **', 'name' => 'body' } ] }, { 'return_type' => 'void', 'name' => 'modperl_child_init_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_cleanup_data_t *', 'name' => 'modperl_cleanup_data_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_END', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_access_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_add_var', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authen_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authz_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_child_exit_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_child_init_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_cleanup_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_config_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_fixup_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_header_parser_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_init_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_input_filter_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max_requests', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max_spare', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_min_spare', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_start', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_load_module', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_log_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_map_to_storage_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_modules', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_open_logs_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_options', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_output_filter_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pass_env', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_perl', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_perldo', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pod', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pod_cut', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_config_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_config_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_read_request_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pre_connection_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_process_connection_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_cmd_push_filter_handlers', 'args' => [ { 'type' => 'MpAV **', 'name' => 'handlers' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_cmd_push_handlers', 'args' => [ { 'type' => 'MpAV **', 'name' => 'handlers' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_response_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_env', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_input_filter', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_output_filter', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_var', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_switches', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_trace', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_trans_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_type_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'U16 *', 'name' => 'modperl_code_attrs', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlModule', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlPostConfigRequire', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlRequire', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_dir_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char *', 'name' => 'dir' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_dir_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'basev' }, { 'type' => 'void *', 'name' => 'addv' } ] }, { 'return_type' => 'modperl_config_dir_t *', 'name' => 'modperl_config_dir_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptmp' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'conf' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_parms', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_request', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'lines' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_server', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_is_perl_option_enabled', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_config_req_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_config_req_t *', 'name' => 'modperl_config_req_new', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'modperl_config_con_t *', 'name' => 'modperl_config_con_new', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_config_request_cleanup', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char **', 'name' => 'modperl_config_srv_argv_init', 'args' => [ { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'int *', 'name' => 'argc' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_srv_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_srv_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'basev' }, { 'type' => 'void *', 'name' => 'addv' } ] }, { 'return_type' => 'modperl_config_srv_t *', 'name' => 'modperl_config_srv_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_const_compile', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'const char *', 'name' => 'arg' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_apache2_const', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_apr_const', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_modperl', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_apache2_const', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_apr_const', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_modperl', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_croak', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' }, { 'type' => 'const char*', 'name' => 'func' } ] }, { 'return_type' => 'unsigned long', 'name' => 'modperl_debug_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_dir_config', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'sv_val' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_clear', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_request_dir', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_request_srv', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_server', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_default_populate', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_hash_keys', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_hv_store', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_init', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_populate', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_tie', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_unpopulate', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_untie', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_sync_dir_env_hash2table', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_config_dir_t *', 'name' => 'dcfg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_sync_srv_env_hash2table', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_unload', 'args' => [] }, { 'return_type' => 'char *', 'name' => 'modperl_error_strerror', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' } ] }, { 'return_type' => 'int', 'name' => 'modperl_errsv', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_errsv_prepend', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pat' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_file2package', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file' } ] }, { 'return_type' => 'U32 *', 'name' => 'modperl_filter_attributes', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'SV *', 'name' => 'package' }, { 'type' => 'SV *', 'name' => 'cvrv' } ] }, { 'return_type' => 'modperl_filter_t *', 'name' => 'modperl_filter_mg_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'modperl_filter_t *', 'name' => 'modperl_filter_new', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'modperl_filter_mode_e', 'name' => 'mode' }, { 'type' => 'ap_input_mode_t', 'name' => 'input_mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'int', 'name' => 'modperl_filter_resolve_init_handler', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_filter_runtime_add', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'modperl_filter_mode_e', 'name' => 'mode' }, { 'type' => 'modperl_filter_add_t', 'name' => 'addfunc' }, { 'type' => 'SV *', 'name' => 'callback' }, { 'type' => 'const char *', 'name' => 'type' } ] }, { 'return_type' => 'int', 'name' => 'modperl_fixup_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'U32', 'name' => 'modperl_flags_lookup_dir', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'U32', 'name' => 'modperl_flags_lookup_srv', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_get_perl_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_anon_cnt_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_global_anon_cnt_next', 'args' => [] }, { 'return_type' => 'void *', 'name' => 'modperl_global_get', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_global_get_pconf', 'args' => [] }, { 'return_type' => 'server_rec *', 'name' => 'modperl_global_get_server_rec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_init', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_init_pconf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_init_server_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec * server_rec', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock_pconf', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock_server_rec', 'args' => [] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_global_request', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_cfg_set', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_obj_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_set', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set_pconf', 'args' => [ { 'type' => 'void *', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set_server_rec', 'args' => [ { 'type' => 'void *', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock_pconf', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock_server_rec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_handler_anon_add', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'anon' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'CV *', 'name' => 'modperl_handler_anon_get', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'anon' } ] }, { 'return_type' => 'void', 'name' => 'modperl_handler_anon_init', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_handler_anon_next', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'MpAV *', 'name' => 'modperl_handler_array_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'MpAV *', 'name' => 'base_a' }, { 'type' => 'MpAV *', 'name' => 'add_a' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_files', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_per_dir', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_per_srv', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_pre_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_process', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_dup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_handler_t *', 'name' => 'h' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_equal', 'args' => [ { 'type' => 'modperl_handler_t *', 'name' => 'h1' }, { 'type' => 'modperl_handler_t *', 'name' => 'h2' } ] }, { 'return_type' => 'MpAV **', 'name' => 'modperl_handler_get_handlers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_lookup', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int *', 'name' => 'type' } ] }, { 'return_type' => 'MpAV **', 'name' => 'modperl_handler_lookup_handlers', 'args' => [ { 'type' => 'modperl_config_dir_t *', 'name' => 'dcfg' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'modperl_config_req_t *', 'name' => 'rcfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' }, { 'type' => 'const char **', 'name' => 'desc' } ] }, { 'return_type' => 'void', 'name' => 'modperl_handler_make_args', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'AV **', 'name' => 'avp' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_name', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_handler_t *', 'name' => 'handler' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_new_from_sv', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_perl_add_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_handler_perl_get_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'MpAV **', 'name' => 'handp' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_push_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'MpAV *', 'name' => 'handlers' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_resolve', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t **', 'name' => 'handp' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_hash_seed_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_hash_seed_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'void *', 'name' => 'p' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_hash_tied_object', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tied_object_rv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_header_parser_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_hook_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_hook_pre_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_init', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_init_globals', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'int', 'name' => 'modperl_init_vhost', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'base_server' } ] }, { 'return_type' => 'void', 'name' => 'modperl_input_filter_add_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'modperl_input_filter_add_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_handler', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'ap_input_mode_t', 'name' => 'input_mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'modperl_input_filter_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'wanted' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_clone_init', 'args' => [ { 'type' => 'modperl_interp_t *', 'name' => 'interp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_destroy', 'args' => [ { 'type' => 'modperl_interp_t *', 'name' => 'interp' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_get', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_init', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_mip_walk', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'current_perl' }, { 'type' => 'PerlInterpreter *', 'name' => 'parent_perl' }, { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'modperl_interp_mip_walker_t', 'name' => 'walker' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_mip_walk_servers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'current_perl' }, { 'type' => 'server_rec *', 'name' => 'base_server' }, { 'type' => 'modperl_interp_mip_walker_t', 'name' => 'walker' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_new', 'args' => [ { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_pool_destroy', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_pool_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_pool_select', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_pool_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_interp_t *', 'name' => 'interp' }, { 'type' => 'int', 'name' => 'cleanup' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_select', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_unselect', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_apache_init', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_handle_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'void *', 'name' => 'ptr' } ] }, { 'return_type' => 'int', 'name' => 'modperl_io_handle_tied', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' }, { 'type' => 'char *', 'name' => 'classname' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_handle_untie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_perlio_override_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_perlio_override_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_perlio_restore_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_perlio_restore_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_tie_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_tie_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_is_running', 'args' => [] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_append', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'new_list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_first', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_last', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_new', 'args' => [] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_prepend', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'new_list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_remove', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'rlist' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_remove_data', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'modperl_list_t **', 'name' => 'listp' } ] }, { 'return_type' => 'int', 'name' => 'modperl_log_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_map_to_storage_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_mgv_append', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_mgv_as_string', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'package' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_compile', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_equal', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'mgv1' }, { 'type' => 'modperl_mgv_t *', 'name' => 'mgv2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_mgv_hash_handlers', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_last', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_mgv_last_name', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_mgv_lookup', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_mgv_lookup_autoload', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_require_module', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_resolve', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'void', 'name' => 'modperl_modglobal_hash_keys', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'modperl_modglobal_key_t *', 'name' => 'modperl_modglobal_lookup', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_module_add', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'mod_cmds' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_module_config_get_obj', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'pmodule' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'v' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_module_config_table_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'create' } ] }, { 'return_type' => 'void', 'name' => 'modperl_module_config_table_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'table' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_newSVsv_obj', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'stashsv' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'int', 'name' => 'modperl_open_logs_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_options_t *', 'name' => 'modperl_options_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_options_t *', 'name' => 'base' }, { 'type' => 'modperl_options_t *new', 'name' => 'arg2' } ] }, { 'return_type' => 'modperl_options_t *', 'name' => 'modperl_options_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_options_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_options_t *', 'name' => 'o' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_output_filter_add_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'modperl_output_filter_add_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_handler', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'modperl_output_filter_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'wanted' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'modperl_package_unload', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'package' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_av_push_elts_ref', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'AV *', 'name' => 'dst' }, { 'type' => 'AV *', 'name' => 'src' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_call_endav', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_call_list', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'AV *', 'name' => 'subs' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_core_global_init', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_destruct', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'int', 'name' => 'modperl_perl_destruct_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_do_join', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_do_sprintf', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'I32', 'name' => 'len' }, { 'type' => 'SV **', 'name' => 'sarg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_exit', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_gensym', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'pack' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_call', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_clear', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_register', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_request_restore', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_request_save', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'HE *', 'name' => 'modperl_perl_hv_fetch_he', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'HV *', 'name' => 'hv' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'I32', 'name' => 'klen' }, { 'type' => 'U32', 'name' => 'hash' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_init_ids_server', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_perl_module_loaded', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_set', 'args' => [ { 'type' => 'modperl_perl_opcode_e', 'name' => 'idx' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_set_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_unset', 'args' => [ { 'type' => 'modperl_perl_opcode_e', 'name' => 'idx' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_unset_all', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_sv_setref_uv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'rv' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'UV', 'name' => 'uv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_pnotes', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'HV **', 'name' => 'pnotes' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_pnotes_kill', 'args' => [ { 'type' => 'void *', 'name' => 'cl_data' } ] }, { 'return_type' => 'int', 'name' => 'modperl_post_config_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_post_post_config_phase', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_post_read_request_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_pre_connection_handler', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'int', 'name' => 'modperl_process_connection_handler', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_ptr2obj', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'void *', 'name' => 'ptr' } ] }, { 'return_type' => 'void', 'name' => 'modperl_register_handler_hooks', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_register_hooks', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ssize_t', 'name' => 'modperl_request_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'size_t', 'name' => 'len' } ] }, { 'return_type' => 'int', 'name' => 'modperl_require_file', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pv' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'int', 'name' => 'modperl_require_module', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pv' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_response_finish', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_response_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_response_handler_cgi', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_response_init', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_restart_count', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_restart_count_inc', 'args' => [ { 'type' => 'server_rec *', 'name' => 'base_server' } ] }, { 'return_type' => 'int', 'name' => 'modperl_run', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_run_filter', 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_server_desc', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_server_pool', 'args' => [] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_server_user_pool', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_set_perl_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'void *', 'name' => 'cfg' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_slurp_filename', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'tainted' } ] }, { 'return_type' => 'int', 'name' => 'modperl_spawn_proc_prog', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'command' }, { 'type' => 'const char ***', 'name' => 'argv' }, { 'type' => 'apr_file_t **', 'name' => 'script_in' }, { 'type' => 'apr_file_t **', 'name' => 'script_out' }, { 'type' => 'apr_file_t **', 'name' => 'script_err' } ] }, { 'return_type' => 'PerlInterpreter *', 'name' => 'modperl_startup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_str_toupper', 'args' => [ { 'type' => 'char *', 'name' => 'str' } ] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_sv2request_rec', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'server_rec *', 'name' => 'modperl_sv2server_rec', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_clear', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_svptr_table_clone', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PerlInterpreter *', 'name' => 'proto_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'source' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_delete', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'key' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_destroy', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_svptr_table_fetch', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_free', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_svptr_table_new', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_split', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_store', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'oldv' }, { 'type' => 'void *', 'name' => 'newv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_sys_dlclose', 'args' => [ { 'type' => 'void *', 'name' => 'handle' } ] }, { 'return_type' => 'int', 'name' => 'modperl_sys_is_dir', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_table_get_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'table' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'sv_val' }, { 'type' => 'int', 'name' => 'do_taint' } ] }, { 'return_type' => 'int', 'name' => 'modperl_threaded_mpm', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_threads_started', 'args' => [] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_thx_interp_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'thx', }, ], }, { 'return_type' => 'void', 'name' => 'modperl_thx_interp_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'thx', }, { 'type' => 'modperl_interp_t *', 'name' => 'interp', }, ], }, { 'return_type' => 'void', 'name' => 'modperl_tipool_add', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_destroy', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_init', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'modperl_tipool_t *', 'name' => 'modperl_tipool_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'cfg' }, { 'type' => 'void *', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_tipool_pop', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_putback', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_list_t *', 'name' => 'listp' }, { 'type' => 'int', 'name' => 'num_requests' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_putback_data', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'int', 'name' => 'num_requests' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_remove', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_list_t *', 'name' => 'listp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tls_t **', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_create_request_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_get', 'args' => [ { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_get_request_rec', 'args' => [ { 'type' => 'request_rec * *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tls_reset_cleanup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tls_reset_cleanup_request_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'request_rec *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_set', 'args' => [ { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_set_request_rec', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace', 'args' => [ { 'type' => 'const char *', 'name' => 'func' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_level_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile' }, { 'type' => 'const char *', 'name' => 'level' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_logfile_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile_new' } ] }, { 'return_type' => 'int', 'name' => 'modperl_trans_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_type_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'modperl_uri_t *', 'name' => 'modperl_uri_new', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'add_flush_bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_pass', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'int', 'name' => 'add_flush_bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'wlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_xs_dl_handles_clear', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_xs_dl_handles_close', 'args' => [ { 'type' => 'void **', 'name' => 'handles' } ] }, { 'return_type' => 'void **', 'name' => 'modperl_xs_dl_handles_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_xs_sv2request_rec', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_cleanup', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_concat', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'a' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_destroy', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_first', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Brigade_flatten', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_insert_head', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_insert_tail', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Brigade_is_empty', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_last', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Brigade_length', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'int', 'name' => 'read_all' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_next', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'mpxs_APR__Brigade_pool', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_prev', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__BucketAlloc_new', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_insert_after', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_insert_before', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Bucket_is_eos', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Bucket_is_flush', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Bucket_new', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Bucket_read', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_read_type_e', 'name' => 'block' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_remove', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_APR__Bucket_setaside', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'b_sv' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Finfo_stat', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'U32', 'name' => 'mpxs_APR__OS_current_thread_id', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Pool_clear', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'mpxs_APR__Socket_opt_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_int32_t', 'name' => 'opt' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Socket_opt_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_APR__Socket_poll', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_int16_t', 'name' => 'reqevents' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Socket_recv', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Socket_timeout_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Socket_fileno', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__String_strfsize', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_off_t', 'name' => 'size' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Table_EXISTS', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_APR__Table_FETCH', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_APR__Table_NEXTKEY', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'SV *', 'name' => 'key' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_copy', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'base' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_make', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_overlay', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'base' }, { 'type' => 'apr_table_t *', 'name' => 'overlay' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_APR__URI_port', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'uri' }, { 'type' => 'SV *', 'name' => 'portsv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__URI_rpath', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'apr_uri' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__CmdParms_add_config', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__CmdParms_info', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__CmdParms_override_opts', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_add_input_filter', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_add_output_filter', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'apr_socket_t *', 'name' => 'mpxs_Apache2__Connection_client_socket', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'apr_socket_t *', 'name' => 's' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__Connection_get_remote_host', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'dir_config' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Connection_pnotes', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_pnotes_kill', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Directive_as_hash', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_directive_t *', 'name' => 'tree' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Directive_as_string', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_directive_t *', 'name' => 'self' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Filter_ctx', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_fflush', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_get_brigade', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_pass_brigade', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__Filter_print', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__Filter_read', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Filter_remove', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Filter_seen_eos', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Log_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Log_log', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'int', 'name' => 'logtype' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__MPM_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__MPM_query', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'self' }, { 'type' => 'int', 'name' => 'query_code' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Module_add', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'package' }, { 'type' => 'SV *', 'name' => 'cmds' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_ap_api_major_version', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_ap_api_minor_version', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Module_get_config', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'pmodule' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'v' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_loaded', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_FILENO', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_GETC', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_OPEN', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'self' }, { 'type' => 'SV *', 'name' => 'arg1' }, { 'type' => 'SV *', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_config', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'lines' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_input_filter', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_output_filter', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_allow_override_opts', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_as_string', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_auth_name', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_auth_type', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_child_terminate', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_content_languages', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'languages' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_content_type', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'type' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_document_root', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'new_root' } ] }, { 'return_type' => 'apr_finfo_t *', 'name' => 'mpxs_Apache2__RequestRec_finfo', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_finfo_t *', 'name' => 'finfo' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_get_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_handler', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_is_perl_option_enabled', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_Apache2__RequestRec_location', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_location_merge', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'location' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_new', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'base_pool_sv' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_no_cache', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'flag' } ] }, { 'return_type' => 'apr_uri_t *', 'name' => 'mpxs_Apache2__RequestRec_parsed_uri', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_pnotes', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_pnotes_kill', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_print', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_proxyreq', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_push_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_read', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_rflush', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__RequestRec_sendfile', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_set_basic_credentials', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'username' }, { 'type' => 'char *', 'name' => 'password' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_set_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => '', 'name' => 'mpxs_Apache2__RequestRec_set_last_modified', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'mtime' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_subprocess_env', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__RequestRec_write', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'request_rec *', 'name' => 'mpxs_Apache2__RequestUtil_request', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerRec_add_config', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__ServerRec_get_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_is_perl_option_enabled', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_push_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_set_handlers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerUtil_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerUtil_server_shutdown_cleanup_register', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'cv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_call', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_clear', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_register', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ModPerl__Util_untaint', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ap_allow_methods', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'long', 'name' => 'mpxs_ap_get_client_block', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'int', 'name' => 'bufsiz' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ap_log_error', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'msg' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_ap_requires', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_ap_rprintf', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ap_run_sub_req', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_ap_rvputs', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_ap_unescape_url', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'url' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_base64_decode', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_base64_encode', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_brigade_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'ba' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_ipsubnet_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'const char *', 'name' => 'ipstr' }, { 'type' => 'const char *', 'name' => 'mask_or_numbits' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_password_validate', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'passwd' }, { 'type' => 'const char *', 'name' => 'hash' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_pool_DESTROY', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_pool_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'cleanup_data' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_pool_cleanup_register', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'cv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_pool_create', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'parent_pool_obj' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_pool_parent_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'child_pool' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_sockaddr_ip_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_apr_socket_send', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'SV *', 'name' => 'sv_buf' }, { 'type' => 'SV *', 'name' => 'sv_len' } ] }, { 'return_type' => 'apr_interval_time_t', 'name' => 'mpxs_apr_socket_timeout_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_table_do', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_table_do_cb', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_thread_mutex_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'unsigned int', 'name' => 'flags' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_thread_rwlock_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_uri_parse', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'const char *', 'name' => 'uri_string' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_apr_uri_unparse', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_uuid_t *', 'name' => 'mpxs_apr_uuid_get', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' } ] }, { 'return_type' => 'apr_uuid_t *', 'name' => 'mpxs_apr_uuid_parse', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'char *', 'name' => 'buf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_cleanup_run', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_insert_auth_cfg', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'directive' }, { 'type' => 'char *', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_setup_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_special_list_do', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' }, { 'type' => 'mpxs_special_list_do_t', 'name' => 'func' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'mpxs_ModPerl__Interpreter_current', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'class' } ] } ]; 1; mod_perl-2.0.9/xs/tables/current24/0000755000104000010010000000000012540623174017524 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current24/Apache2/0000755000104000010010000000000012540623211020757 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current24/Apache2/ConstantsTable.pm0000644000104000010010000003064012540623210024243 0ustar AdministratorsNonepackage Apache2::ConstantsTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache2::ParseSource/0.02 # ! Mon Jul 1 12:38:09 2013 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::ConstantsTable = { 'ModPerl' => { 'common' => [ 'MODPERL_RC_EXIT' ] }, 'Apache2::Const' => { 'types' => [ 'DIR_MAGIC_TYPE' ], 'satisfy' => [ 'SATISFY_ALL', 'SATISFY_ANY', 'SATISFY_NOSPEC' ], 'remotehost' => [ 'REMOTE_HOST', 'REMOTE_NAME', 'REMOTE_NOLOOKUP', 'REMOTE_DOUBLE_REV' ], 'proxy' => [ 'PROXYREQ_NONE', 'PROXYREQ_PROXY', 'PROXYREQ_REVERSE', 'PROXYREQ_RESPONSE' ], 'platform' => [ 'LF', 'CR', 'CRLF', 'CRLF_ASCII' ], 'override' => [ 'OR_NONE', 'OR_LIMIT', 'OR_OPTIONS', 'OR_FILEINFO', 'OR_AUTHCFG', 'OR_INDEXES', 'OR_UNSET', 'ACCESS_CONF', 'RSRC_CONF', 'EXEC_ON_READ', 'OR_ALL' ], 'options' => [ 'OPT_NONE', 'OPT_INDEXES', 'OPT_INCLUDES', 'OPT_SYM_LINKS', 'OPT_EXECCGI', 'OPT_UNSET', 'OPT_INC_WITH_EXEC', 'OPT_SYM_OWNER', 'OPT_MULTI', 'OPT_ALL' ], 'mpmq' => [ 'AP_MPMQ_NOT_SUPPORTED', 'AP_MPMQ_STATIC', 'AP_MPMQ_DYNAMIC', 'AP_MPMQ_STARTING', 'AP_MPMQ_RUNNING', 'AP_MPMQ_STOPPING', 'AP_MPMQ_MAX_DAEMON_USED', 'AP_MPMQ_IS_THREADED', 'AP_MPMQ_IS_FORKED', 'AP_MPMQ_HARD_LIMIT_DAEMONS', 'AP_MPMQ_HARD_LIMIT_THREADS', 'AP_MPMQ_MAX_THREADS', 'AP_MPMQ_MIN_SPARE_DAEMONS', 'AP_MPMQ_MIN_SPARE_THREADS', 'AP_MPMQ_MAX_SPARE_DAEMONS', 'AP_MPMQ_MAX_SPARE_THREADS', 'AP_MPMQ_MAX_REQUESTS_DAEMON', 'AP_MPMQ_MAX_DAEMONS', 'AP_MPMQ_MPM_STATE', 'AP_MPMQ_IS_ASYNC', 'AP_MPMQ_GENERATION', 'AP_MPMQ_HAS_SERF' ], 'methods' => [ 'M_GET', 'M_PUT', 'M_POST', 'M_DELETE', 'M_CONNECT', 'M_OPTIONS', 'M_TRACE', 'M_PATCH', 'M_PROPFIND', 'M_PROPPATCH', 'M_MKCOL', 'M_COPY', 'M_MOVE', 'M_LOCK', 'M_UNLOCK', 'M_VERSION_CONTROL', 'M_CHECKOUT', 'M_UNCHECKOUT', 'M_CHECKIN', 'M_UPDATE', 'M_LABEL', 'M_REPORT', 'M_MKWORKSPACE', 'M_MKACTIVITY', 'M_BASELINE_CONTROL', 'M_MERGE', 'M_INVALID', 'METHODS' ], 'log' => [ 'APLOG_EMERG', 'APLOG_ALERT', 'APLOG_CRIT', 'APLOG_ERR', 'APLOG_WARNING', 'APLOG_NOTICE', 'APLOG_INFO', 'APLOG_DEBUG', 'APLOG_TRACE1', 'APLOG_TRACE2', 'APLOG_TRACE3', 'APLOG_TRACE4', 'APLOG_TRACE5', 'APLOG_TRACE6', 'APLOG_TRACE7', 'APLOG_TRACE8', 'APLOG_LEVELMASK', 'APLOG_TOCLIENT', 'APLOG_STARTUP', 'APLOG_NO_MODULE', 'APLOG_MODULE_INDEX' ], 'input_mode' => [ 'AP_MODE_READBYTES', 'AP_MODE_GETLINE', 'AP_MODE_EATCRLF', 'AP_MODE_SPECULATIVE', 'AP_MODE_EXHAUSTIVE', 'AP_MODE_INIT' ], 'http' => [ 'HTTP_CONTINUE', 'HTTP_SWITCHING_PROTOCOLS', 'HTTP_PROCESSING', 'HTTP_OK', 'HTTP_CREATED', 'HTTP_ACCEPTED', 'HTTP_NON_AUTHORITATIVE', 'HTTP_NO_CONTENT', 'HTTP_RESET_CONTENT', 'HTTP_PARTIAL_CONTENT', 'HTTP_MULTI_STATUS', 'HTTP_ALREADY_REPORTED', 'HTTP_IM_USED', 'HTTP_MULTIPLE_CHOICES', 'HTTP_MOVED_PERMANENTLY', 'HTTP_MOVED_TEMPORARILY', 'HTTP_SEE_OTHER', 'HTTP_NOT_MODIFIED', 'HTTP_USE_PROXY', 'HTTP_TEMPORARY_REDIRECT', 'HTTP_PERMANENT_REDIRECT', 'HTTP_BAD_REQUEST', 'HTTP_UNAUTHORIZED', 'HTTP_PAYMENT_REQUIRED', 'HTTP_FORBIDDEN', 'HTTP_NOT_FOUND', 'HTTP_METHOD_NOT_ALLOWED', 'HTTP_NOT_ACCEPTABLE', 'HTTP_PROXY_AUTHENTICATION_REQUIRED', 'HTTP_REQUEST_TIME_OUT', 'HTTP_CONFLICT', 'HTTP_GONE', 'HTTP_LENGTH_REQUIRED', 'HTTP_PRECONDITION_FAILED', 'HTTP_REQUEST_ENTITY_TOO_LARGE', 'HTTP_REQUEST_URI_TOO_LARGE', 'HTTP_UNSUPPORTED_MEDIA_TYPE', 'HTTP_RANGE_NOT_SATISFIABLE', 'HTTP_EXPECTATION_FAILED', 'HTTP_UNPROCESSABLE_ENTITY', 'HTTP_LOCKED', 'HTTP_FAILED_DEPENDENCY', 'HTTP_UPGRADE_REQUIRED', 'HTTP_PRECONDITION_REQUIRED', 'HTTP_TOO_MANY_REQUESTS', 'HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE', 'HTTP_INTERNAL_SERVER_ERROR', 'HTTP_NOT_IMPLEMENTED', 'HTTP_BAD_GATEWAY', 'HTTP_SERVICE_UNAVAILABLE', 'HTTP_GATEWAY_TIME_OUT', 'HTTP_VARIANT_ALSO_VARIES', 'HTTP_INSUFFICIENT_STORAGE', 'HTTP_LOOP_DETECTED', 'HTTP_NOT_EXTENDED', 'HTTP_NETWORK_AUTHENTICATION_REQUIRED' ], 'filter_type' => [ 'AP_FTYPE_RESOURCE', 'AP_FTYPE_CONTENT_SET', 'AP_FTYPE_PROTOCOL', 'AP_FTYPE_TRANSCODE', 'AP_FTYPE_CONNECTION', 'AP_FTYPE_NETWORK' ], 'context' => [ 'NOT_IN_VIRTUALHOST', 'NOT_IN_LIMIT', 'NOT_IN_DIRECTORY', 'NOT_IN_LOCATION', 'NOT_IN_FILES', 'NOT_IN_HTACCESS', 'NOT_IN_DIR_LOC_FILE', 'GLOBAL_ONLY' ], 'conn_keepalive' => [ 'AP_CONN_UNKNOWN', 'AP_CONN_CLOSE', 'AP_CONN_KEEPALIVE' ], 'config' => [ 'DECLINE_CMD' ], 'common' => [ 'OK', 'DECLINED', 'DONE', 'NOT_FOUND', 'FORBIDDEN', 'AUTH_REQUIRED', 'SERVER_ERROR', 'REDIRECT' ], 'cmd_how' => [ 'RAW_ARGS', 'TAKE1', 'TAKE2', 'ITERATE', 'ITERATE2', 'FLAG', 'NO_ARGS', 'TAKE12', 'TAKE3', 'TAKE23', 'TAKE123', 'TAKE13', 'TAKE_ARGV' ], 'authz_status' => [ 'AUTHZ_DENIED', 'AUTHZ_GRANTED', 'AUTHZ_NEUTRAL', 'AUTHZ_GENERAL_ERROR', 'AUTHZ_DENIED_NO_USER' ], 'authn_status' => [ 'AUTH_DENIED', 'AUTH_GRANTED', 'AUTH_USER_FOUND', 'AUTH_USER_NOT_FOUND', 'AUTH_GENERAL_ERROR' ], 'auth' => [ 'AUTHN_PROVIDER_GROUP', 'AUTHZ_PROVIDER_GROUP', 'AUTHN_PROVIDER_VERSION', 'AUTHZ_PROVIDER_VERSION', 'AUTHN_DEFAULT_PROVIDER', 'AUTHN_PROVIDER_NAME_NOTE', 'AUTHZ_PROVIDER_NAME_NOTE', 'AUTHN_PREFIX', 'AUTHZ_PREFIX', 'AP_AUTH_INTERNAL_PER_URI', 'AP_AUTH_INTERNAL_PER_CONF', 'AP_AUTH_INTERNAL_MASK' ] }, 'APR::Const' => { 'uri' => [ 'APR_URI_FTP_DEFAULT_PORT', 'APR_URI_SSH_DEFAULT_PORT', 'APR_URI_TELNET_DEFAULT_PORT', 'APR_URI_GOPHER_DEFAULT_PORT', 'APR_URI_HTTP_DEFAULT_PORT', 'APR_URI_POP_DEFAULT_PORT', 'APR_URI_NNTP_DEFAULT_PORT', 'APR_URI_IMAP_DEFAULT_PORT', 'APR_URI_PROSPERO_DEFAULT_PORT', 'APR_URI_WAIS_DEFAULT_PORT', 'APR_URI_LDAP_DEFAULT_PORT', 'APR_URI_HTTPS_DEFAULT_PORT', 'APR_URI_RTSP_DEFAULT_PORT', 'APR_URI_SNEWS_DEFAULT_PORT', 'APR_URI_ACAP_DEFAULT_PORT', 'APR_URI_NFS_DEFAULT_PORT', 'APR_URI_TIP_DEFAULT_PORT', 'APR_URI_SIP_DEFAULT_PORT', 'APR_URI_UNP_OMITSITEPART', 'APR_URI_UNP_OMITUSER', 'APR_URI_UNP_OMITPASSWORD', 'APR_URI_UNP_OMITUSERINFO', 'APR_URI_UNP_REVEALPASSWORD', 'APR_URI_UNP_OMITPATHINFO', 'APR_URI_UNP_OMITQUERY' ], 'table' => [ 'APR_OVERLAP_TABLES_SET', 'APR_OVERLAP_TABLES_MERGE' ], 'status' => [ 'APR_TIMEUP' ], 'socket' => [ 'APR_SO_LINGER', 'APR_SO_KEEPALIVE', 'APR_SO_DEBUG', 'APR_SO_NONBLOCK', 'APR_SO_REUSEADDR', 'APR_SO_SNDBUF', 'APR_SO_RCVBUF', 'APR_SO_DISCONNECTED' ], 'shutdown_how' => [ 'APR_SHUTDOWN_READ', 'APR_SHUTDOWN_WRITE', 'APR_SHUTDOWN_READWRITE' ], 'read_type' => [ 'APR_BLOCK_READ', 'APR_NONBLOCK_READ' ], 'poll' => [ 'APR_POLLIN', 'APR_POLLPRI', 'APR_POLLOUT', 'APR_POLLERR', 'APR_POLLHUP', 'APR_POLLNVAL', 'APR_POLLSET_THREADSAFE', 'APR_POLLSET_NOCOPY', 'APR_POLLSET_WAKEABLE', 'APR_POLLSET_NODEFAULT' ], 'lockmech' => [ 'APR_LOCK_FCNTL', 'APR_LOCK_FLOCK', 'APR_LOCK_SYSVSEM', 'APR_LOCK_PROC_PTHREAD', 'APR_LOCK_POSIXSEM', 'APR_LOCK_DEFAULT' ], 'limit' => [ 'APR_LIMIT_CPU', 'APR_LIMIT_MEM', 'APR_LIMIT_NPROC', 'APR_LIMIT_NOFILE' ], 'hook' => [ 'APR_HOOK_REALLY_FIRST', 'APR_HOOK_FIRST', 'APR_HOOK_MIDDLE', 'APR_HOOK_LAST', 'APR_HOOK_REALLY_LAST' ], 'fprot' => [ 'APR_FPROT_USETID', 'APR_FPROT_UREAD', 'APR_FPROT_UWRITE', 'APR_FPROT_UEXECUTE', 'APR_FPROT_GSETID', 'APR_FPROT_GREAD', 'APR_FPROT_GWRITE', 'APR_FPROT_GEXECUTE', 'APR_FPROT_WSTICKY', 'APR_FPROT_WREAD', 'APR_FPROT_WWRITE', 'APR_FPROT_WEXECUTE', 'APR_FPROT_OS_DEFAULT', 'APR_FPROT_FILE_SOURCE_PERMS' ], 'fopen' => [ 'APR_FOPEN_READ', 'APR_FOPEN_WRITE', 'APR_FOPEN_CREATE', 'APR_FOPEN_APPEND', 'APR_FOPEN_TRUNCATE', 'APR_FOPEN_BINARY', 'APR_FOPEN_EXCL', 'APR_FOPEN_BUFFERED', 'APR_FOPEN_DELONCLOSE', 'APR_FOPEN_XTHREAD', 'APR_FOPEN_SHARELOCK', 'APR_FOPEN_NOCLEANUP', 'APR_FOPEN_SENDFILE_ENABLED', 'APR_FOPEN_LARGEFILE', 'APR_FOPEN_SPARSE' ], 'flock' => [ 'APR_FLOCK_SHARED', 'APR_FLOCK_EXCLUSIVE', 'APR_FLOCK_TYPEMASK', 'APR_FLOCK_NONBLOCK' ], 'finfo' => [ 'APR_FINFO_LINK', 'APR_FINFO_MTIME', 'APR_FINFO_CTIME', 'APR_FINFO_ATIME', 'APR_FINFO_SIZE', 'APR_FINFO_CSIZE', 'APR_FINFO_DEV', 'APR_FINFO_INODE', 'APR_FINFO_NLINK', 'APR_FINFO_TYPE', 'APR_FINFO_USER', 'APR_FINFO_GROUP', 'APR_FINFO_UPROT', 'APR_FINFO_GPROT', 'APR_FINFO_WPROT', 'APR_FINFO_ICASE', 'APR_FINFO_NAME', 'APR_FINFO_MIN', 'APR_FINFO_IDENT', 'APR_FINFO_OWNER', 'APR_FINFO_PROT', 'APR_FINFO_NORM', 'APR_FINFO_DIRENT' ], 'filetype' => [ 'APR_FILETYPE_NOFILE', 'APR_FILETYPE_REG', 'APR_FILETYPE_DIR', 'APR_FILETYPE_CHR', 'APR_FILETYPE_BLK', 'APR_FILETYPE_PIPE', 'APR_FILETYPE_LNK', 'APR_FILETYPE_SOCK', 'APR_FILETYPE_UNKFILE' ], 'filepath' => [ 'APR_FILEPATH_NOTABOVEROOT', 'APR_FILEPATH_SECUREROOTTEST', 'APR_FILEPATH_SECUREROOT', 'APR_FILEPATH_NOTRELATIVE', 'APR_FILEPATH_NOTABSOLUTE', 'APR_FILEPATH_NATIVE', 'APR_FILEPATH_TRUENAME', 'APR_FILEPATH_ENCODING_UNKNOWN', 'APR_FILEPATH_ENCODING_LOCALE', 'APR_FILEPATH_ENCODING_UTF8' ], 'error' => [ 'APR_ENOSTAT', 'APR_ENOPOOL', 'APR_EBADDATE', 'APR_EINVALSOCK', 'APR_ENOPROC', 'APR_ENOTIME', 'APR_ENODIR', 'APR_ENOLOCK', 'APR_ENOPOLL', 'APR_ENOSOCKET', 'APR_ENOTHREAD', 'APR_ENOTHDKEY', 'APR_EGENERAL', 'APR_ENOSHMAVAIL', 'APR_EBADIP', 'APR_EBADMASK', 'APR_EDSOOPEN', 'APR_EABSOLUTE', 'APR_ERELATIVE', 'APR_EINCOMPLETE', 'APR_EABOVEROOT', 'APR_EBADPATH', 'APR_EPATHWILD', 'APR_ESYMNOTFOUND', 'APR_EPROC_UNKNOWN', 'APR_ENOTENOUGHENTROPY', 'APR_EOF', 'APR_EINIT', 'APR_ENOTIMPL', 'APR_EMISMATCH', 'APR_EBUSY', 'APR_EACCES', 'APR_EEXIST', 'APR_ENAMETOOLONG', 'APR_ENOENT', 'APR_ENOTDIR', 'APR_ENOSPC', 'APR_ENOMEM', 'APR_EMFILE', 'APR_ENFILE', 'APR_EBADF', 'APR_EINVAL', 'APR_ESPIPE', 'APR_EAGAIN', 'APR_EINTR', 'APR_ENOTSOCK', 'APR_ECONNREFUSED', 'APR_EINPROGRESS', 'APR_ECONNABORTED', 'APR_ECONNRESET', 'APR_ETIMEDOUT', 'APR_EHOSTUNREACH', 'APR_ENETUNREACH', 'APR_EFTYPE', 'APR_EPIPE', 'APR_EXDEV', 'APR_ENOTEMPTY', 'APR_EAFNOSUPPORT', 'APR_EXCL', 'APR_END', 'APR_ENOKEY', 'APR_ENOIV', 'APR_EKEYTYPE', 'APR_ENOSPACE', 'APR_ECRYPT', 'APR_EPADDING', 'APR_EKEYLENGTH', 'APR_ENOCIPHER', 'APR_ENODIGEST', 'APR_ENOENGINE', 'APR_EINITENGINE', 'APR_EREINIT' ], 'common' => [ 'APR_SUCCESS' ] } }; 1; mod_perl-2.0.9/xs/tables/current24/Apache2/FunctionTable.pm0000644000104000010010000137703412540623211024071 0ustar AdministratorsNonepackage Apache2::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache2::ParseSource/0.02 # ! Mon Jul 1 12:38:14 2013 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::FunctionTable = [ { 'return_type' => 'void', 'name' => 'ap_abort_on_oom', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_add_cgi_vars', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_common_vars', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_file_conf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'core_dir_config *', 'name' => 'conf' }, { 'type' => 'void *', 'name' => 'url_config' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_add_if_conf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'core_dir_config *', 'name' => 'conf' }, { 'type' => 'void *', 'name' => 'url_config' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_input_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_input_filter_handle', 'args' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'f' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_add_loaded_module', 'args' => [ { 'type' => 'module *', 'name' => 'mod' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_add_module', 'args' => [ { 'type' => 'module *', 'name' => 'm' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'ap_directive_t *', 'name' => 'ap_add_node', 'args' => [ { 'type' => 'ap_directive_t **', 'name' => 'parent' }, { 'type' => 'ap_directive_t *', 'name' => 'current' }, { 'type' => 'ap_directive_t *', 'name' => 'toadd' }, { 'type' => 'int', 'name' => 'child' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_output_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'ap_filter_t *', 'name' => 'ap_add_output_filter_handle', 'args' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'f' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_output_filters_by_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_per_dir_conf', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'void *', 'name' => 'dir_config' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_per_url_conf', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'void *', 'name' => 'url_config' } ] }, { 'return_type' => 'void', 'name' => 'ap_add_version_component', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'const char *', 'name' => 'component' } ] }, { 'return_type' => 'void', 'name' => 'ap_allow_methods', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_allow_options', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_allow_overrides', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_allow_standard_methods', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'char *', 'name' => 'ap_append_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'string' }, { 'type' => 'const char *', 'name' => 'delim' } ] }, { 'return_type' => 'void', 'name' => 'ap_args_to_table', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_table_t **', 'name' => 'table' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_auth_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_auth_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_basic_http_header', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'void', 'name' => 'ap_bin2hex', 'args' => [ { 'type' => 'const void *', 'name' => 'src' }, { 'type' => 'apr_size_t', 'name' => 'srclen' }, { 'type' => 'char *', 'name' => 'dest' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eoc_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eoc_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eor_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_eor_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_error_create', 'args' => [ { 'type' => 'int', 'name' => 'error' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'ap_bucket_error_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'error' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_build_config', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'apr_pool_t *', 'name' => 'conf_pool' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_build_cont_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'ap_directive_t **', 'name' => 'current' }, { 'type' => 'ap_directive_t **', 'name' => 'curr_parent' }, { 'type' => 'char *', 'name' => 'orig_directive' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_byterange_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'ap_calc_scoreboard_size', 'args' => [] }, { 'return_type' => 'void *', 'name' => 'ap_calloc', 'args' => [ { 'type' => 'size_t', 'name' => 'nelem' }, { 'type' => 'size_t', 'name' => 'size' } ] }, { 'return_type' => 'int', 'name' => 'ap_cfg_closefile', 'args' => [ { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cfg_getc', 'args' => [ { 'type' => 'char *', 'name' => 'ch' }, { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cfg_getline', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' }, { 'type' => 'ap_configfile_t *', 'name' => 'cfp' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_check_cmd_context', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'unsigned', 'name' => 'forbidden' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_check_mpm', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cleanup_scoreboard', 'args' => [ { 'type' => 'void *', 'name' => 'd' } ] }, { 'return_type' => 'void', 'name' => 'ap_clear_auth_internal', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_clear_method_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' } ] }, { 'return_type' => 'void', 'name' => 'ap_close_listeners', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_close_piped_log', 'args' => [ { 'type' => 'piped_log *', 'name' => 'pl' } ] }, { 'return_type' => 'int', 'name' => 'ap_close_selected_listeners', 'args' => [ { 'type' => 'ap_slave_t *', 'name' => 'arg0' } ] }, { 'return_type' => 'char *', 'name' => 'ap_construct_server', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char *', 'name' => 'ap_construct_url', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_content_length_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'arg0' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'ap_content_type_tolower', 'args' => [ { 'type' => 'char *', 'name' => 's' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_context_document_root', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_context_prefix', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_check_string', 'args' => [ { 'type' => 'const char *', 'name' => 'string' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_read', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const char **', 'name' => 'val' }, { 'type' => 'int', 'name' => 'remove' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_remove', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'attrs' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_remove2', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name2' }, { 'type' => 'const char *', 'name' => 'attrs2' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_write', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'val' }, { 'type' => 'const char *', 'name' => 'attrs' }, { 'type' => 'long', 'name' => 'maxage' }, { 'type' => '...', 'name' => 'arg5' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_cookie_write2', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name2' }, { 'type' => 'const char *', 'name' => 'val' }, { 'type' => 'const char *', 'name' => 'attrs2' }, { 'type' => 'long', 'name' => 'maxage' }, { 'type' => '...', 'name' => 'arg5' } ] }, { 'return_type' => 'void', 'name' => 'ap_copy_method_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'dest' }, { 'type' => 'ap_method_list_t *', 'name' => 'src' } ] }, { 'return_type' => 'void', 'name' => 'ap_core_child_status', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'ap_generation_t', 'name' => 'gen' }, { 'type' => 'int', 'name' => 'slot' }, { 'type' => 'mpm_child_status', 'name' => 'status' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_core_input_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_core_output_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'ap_core_reorder_directories', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'arg0' }, { 'type' => 'server_rec *', 'name' => 'arg1' } ] }, { 'return_type' => 'int', 'name' => 'ap_core_translate', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_count_dirs', 'args' => [ { 'type' => 'const char *', 'name' => 'path' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_create_conn_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'char **', 'name' => 'ap_create_environment', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'ap_conf_vector_t *', 'name' => 'ap_create_per_dir_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_create_request_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_create_sb_handle', 'args' => [ { 'type' => 'ap_sb_handle_t **', 'name' => 'new_sbh' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'child_num' }, { 'type' => 'int', 'name' => 'thread_num' } ] }, { 'return_type' => 'int', 'name' => 'ap_create_scoreboard', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_scoreboard_e', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'ap_custom_response', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'string' } ] }, { 'return_type' => 'ap_dbd_t*', 'name' => 'ap_dbd_acquire', 'args' => [ { 'type' => 'request_rec*', 'name' => 'arg0' } ] }, { 'return_type' => 'ap_dbd_t*', 'name' => 'ap_dbd_cacquire', 'args' => [ { 'type' => 'conn_rec*', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'ap_dbd_close', 'args' => [ { 'type' => 'server_rec*', 'name' => 'arg0' }, { 'type' => 'ap_dbd_t*', 'name' => 'arg1' } ] }, { 'return_type' => 'ap_dbd_t*', 'name' => 'ap_dbd_open', 'args' => [ { 'type' => 'apr_pool_t*', 'name' => 'arg0' }, { 'type' => 'server_rec*', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'ap_dbd_prepare', 'args' => [ { 'type' => 'server_rec*', 'name' => 'arg0' }, { 'type' => 'const char*', 'name' => 'arg1' }, { 'type' => 'const char*', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'ap_destroy_sub_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_die', 'args' => [ { 'type' => 'int', 'name' => 'type' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_directory_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_discard_request_body', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_document_root', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_dump_mutexes', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_file_t *', 'name' => 'out' } ] }, { 'return_type' => 'void', 'name' => 'ap_error_log2stderr', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_escape_errorlog_item', 'args' => [ { 'type' => 'char *', 'name' => 'dest' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'apr_size_t', 'name' => 'buflen' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_html2', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'toasc' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_logitem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_path_segment', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_path_segment_buffer', 'args' => [ { 'type' => 'char *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_quotes', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'instring' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_shell_cmd', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_urlencoded', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_escape_urlencoded_buffer', 'args' => [ { 'type' => 'char *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_exists_config_define', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_exists_scoreboard_image', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_explode_recent_gmt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'tm' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_explode_recent_localtime', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'tm' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'ap_expr_exec', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const ap_expr_info_t *', 'name' => 'expr' }, { 'type' => 'const char **', 'name' => 'err' } ] }, { 'return_type' => 'int', 'name' => 'ap_expr_exec_ctx', 'args' => [ { 'type' => 'ap_expr_eval_ctx_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'int', 'name' => 'ap_expr_exec_re', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const ap_expr_info_t *', 'name' => 'expr' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t *', 'name' => 'pmatch' }, { 'type' => 'const char **', 'name' => 'source' }, { 'type' => 'const char **', 'name' => 'err' } ] }, { 'return_type' => 'void', 'name' => 'ap_expr_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'int', 'name' => 'ap_expr_lookup_default', 'args' => [ { 'type' => 'ap_expr_lookup_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_expr_parse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'ap_expr_info_t *', 'name' => 'info' }, { 'type' => 'const char *', 'name' => 'expr' }, { 'type' => 'ap_expr_lookup_fn_t *', 'name' => 'lookup_fn' } ] }, { 'return_type' => 'ap_expr_info_t *', 'name' => 'ap_expr_parse_cmd_mi', 'args' => [ { 'type' => 'const cmd_parms *', 'name' => 'cmd' }, { 'type' => 'const char *', 'name' => 'expr' }, { 'type' => 'unsigned int', 'name' => 'flags' }, { 'type' => 'const char **', 'name' => 'err' }, { 'type' => 'ap_expr_lookup_fn_t *', 'name' => 'lookup_fn' }, { 'type' => 'int', 'name' => 'module_index' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_expr_str_exec', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const ap_expr_info_t *', 'name' => 'expr' }, { 'type' => 'const char **', 'name' => 'err' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_expr_str_exec_re', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const ap_expr_info_t *', 'name' => 'expr' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t *', 'name' => 'pmatch' }, { 'type' => 'const char **', 'name' => 'source' }, { 'type' => 'const char **', 'name' => 'err' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fatal_signal_child_setup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fatal_signal_setup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'in_pconf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fflush', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'char *', 'name' => 'ap_field_noparam', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'intype' } ] }, { 'return_type' => 'int', 'name' => 'ap_file_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_filter_flush', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'void *', 'name' => 'ctx' } ] }, { 'return_type' => 'void', 'name' => 'ap_filter_protocol', 'args' => [ { 'type' => 'ap_filter_t*', 'name' => 'f' }, { 'type' => 'unsigned int', 'name' => 'proto_flags' } ] }, { 'return_type' => 'void', 'name' => 'ap_finalize_request_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_finalize_sub_req_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'sub_r' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_child_by_pid', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'pid' } ] }, { 'return_type' => 'const command_rec *', 'name' => 'ap_find_command', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const command_rec *', 'name' => 'cmds' } ] }, { 'return_type' => 'const command_rec *', 'name' => 'ap_find_command_in_modules', 'args' => [ { 'type' => 'const char *', 'name' => 'cmd_name' }, { 'type' => 'module **', 'name' => 'mod' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_last_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'module *', 'name' => 'ap_find_linked_module', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_list_item', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_find_module_name', 'args' => [ { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_find_module_short_name', 'args' => [ { 'type' => 'int', 'name' => 'module_index' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_path_info', 'args' => [ { 'type' => 'const char *', 'name' => 'uri' }, { 'type' => 'const char *', 'name' => 'path_info' } ] }, { 'return_type' => 'int', 'name' => 'ap_find_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'line' }, { 'type' => 'const char *', 'name' => 'tok' } ] }, { 'return_type' => 'void', 'name' => 'ap_fini_vhost_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'main_server' } ] }, { 'return_type' => 'void', 'name' => 'ap_fixup_virtual_hosts', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'main_server' } ] }, { 'return_type' => 'void', 'name' => 'ap_flush_conn', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fprintf', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_fputstrs', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_get_basic_auth_pw', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char **', 'name' => 'pw' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_get_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bucket' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'long', 'name' => 'ap_get_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'bufsiz' } ] }, { 'return_type' => 'int', 'name' => 'ap_get_conn_module_loglevel', 'args' => [ { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'int', 'name' => 'index' } ] }, { 'return_type' => 'int', 'name' => 'ap_get_conn_server_module_loglevel', 'args' => [ { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'int', 'name' => 'index' } ] }, { 'return_type' => 'apr_socket_t *', 'name' => 'ap_get_conn_socket', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void *', 'name' => 'ap_get_core_module_config', 'args' => [ { 'type' => 'const ap_conf_vector_t *', 'name' => 'cv' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_get_input_filter_handle', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'apr_off_t', 'name' => 'ap_get_limit_req_body', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_get_limit_xml_body', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_list_item', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'field' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_loadavg', 'args' => [ { 'type' => 'ap_loadavg_t *', 'name' => 'ld' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_local_host', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_mime_headers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_mime_headers_core', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'void *', 'name' => 'ap_get_module_config', 'args' => [ { 'type' => 'const ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'const module *', 'name' => 'm' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_get_output_filter_handle', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_remote_host', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' }, { 'type' => 'void *', 'name' => 'dir_config' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int *', 'name' => 'str_is_ip' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_remote_logname', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_get_request_module_loglevel', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'index' } ] }, { 'return_type' => 'void **', 'name' => 'ap_get_request_note', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_size_t', 'name' => 'note_num' } ] }, { 'return_type' => 'global_score *', 'name' => 'ap_get_scoreboard_global', 'args' => [] }, { 'return_type' => 'process_score *', 'name' => 'ap_get_scoreboard_process', 'args' => [ { 'type' => 'int', 'name' => 'x' } ] }, { 'return_type' => 'worker_score *', 'name' => 'ap_get_scoreboard_worker', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' } ] }, { 'return_type' => 'worker_score *', 'name' => 'ap_get_scoreboard_worker_from_indexes', 'args' => [ { 'type' => 'int', 'name' => 'child_num' }, { 'type' => 'int', 'name' => 'thread_num' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_banner', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_built', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_description', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_get_server_module_loglevel', 'args' => [ { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'int', 'name' => 'index' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_name_for_url', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'ap_get_server_port', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char*', 'name' => 'ap_get_server_protocol', 'args' => [ { 'type' => 'server_rec*', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_get_server_revision', 'args' => [ { 'type' => 'ap_version_t *', 'name' => 'version' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_server_version', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_get_sload', 'args' => [ { 'type' => 'ap_sload_t *', 'name' => 'ld' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_get_status_line', 'args' => [ { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'char *', 'name' => 'ap_get_token', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'accept_line' }, { 'type' => 'int', 'name' => 'accept_white' } ] }, { 'return_type' => 'int', 'name' => 'ap_getline', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'n' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'fold' } ] }, { 'return_type' => 'void', 'name' => 'ap_getparents', 'args' => [ { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_conf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_conf_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nulls', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_nulls_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' }, { 'type' => 'char', 'name' => 'stop' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_white', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'line' } ] }, { 'return_type' => 'char *', 'name' => 'ap_getword_white_nc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_global_mutex_create', 'args' => [ { 'type' => 'apr_global_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char **', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'instance_id' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_int32_t', 'name' => 'options' } ] }, { 'return_type' => 'gid_t', 'name' => 'ap_gname2id', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_access_checker', 'args' => [ { 'type' => 'ap_HOOK_access_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_access_checker_ex', 'args' => [ { 'type' => 'ap_HOOK_access_checker_ex_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_auth_checker', 'args' => [ { 'type' => 'ap_HOOK_auth_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_access', 'args' => [ { 'type' => 'ap_HOOK_access_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_access_ex', 'args' => [ { 'type' => 'ap_HOOK_access_checker_ex_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_authn', 'args' => [ { 'type' => 'ap_HOOK_check_user_id_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_authz', 'args' => [ { 'type' => 'ap_HOOK_auth_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_config', 'args' => [ { 'type' => 'ap_HOOK_check_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_check_user_id', 'args' => [ { 'type' => 'ap_HOOK_check_user_id_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_child_init', 'args' => [ { 'type' => 'ap_HOOK_child_init_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_child_status', 'args' => [ { 'type' => 'ap_HOOK_child_status_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_create_connection', 'args' => [ { 'type' => 'ap_HOOK_create_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_create_request', 'args' => [ { 'type' => 'ap_HOOK_create_request_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_default_port', 'args' => [ { 'type' => 'ap_HOOK_default_port_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_drop_privileges', 'args' => [ { 'type' => 'ap_HOOK_drop_privileges_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_end_generation', 'args' => [ { 'type' => 'ap_HOOK_end_generation_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_error_log', 'args' => [ { 'type' => 'ap_HOOK_error_log_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_expr_lookup', 'args' => [ { 'type' => 'ap_HOOK_expr_lookup_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_fixups', 'args' => [ { 'type' => 'ap_HOOK_fixups_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_generate_log_id', 'args' => [ { 'type' => 'ap_HOOK_generate_log_id_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_access_checker', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_access_checker_ex', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_auth_checker', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_check_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_check_user_id', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_child_init', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_child_status', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_create_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_create_request', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_default_port', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_drop_privileges', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_end_generation', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_error_log', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_expr_lookup', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_fixups', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_generate_log_id', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_get_mgmt_items', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_get_suexec_identity', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_handler', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_header_parser', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_http_scheme', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_insert_error_filter', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_insert_filter', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_insert_network_bucket', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_log_transaction', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_map_to_storage', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_get_mgmt_items', 'args' => [ { 'type' => 'ap_HOOK_get_mgmt_items_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_monitor', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_mpm', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_mpm_get_name', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_mpm_query', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_mpm_register_timed_callback', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_note_auth_failure', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_open_logs', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_optional_fn_retrieve', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_post_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_post_read_request', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_mpm', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_pre_read_request', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_process_connection', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_quick_handler', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_session_decode', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_session_encode', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_session_load', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_session_save', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_status_hook', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_get_suexec_identity', 'args' => [ { 'type' => 'ap_HOOK_get_suexec_identity_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_test_config', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_translate_name', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_type_checker', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_watchdog_exit', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_watchdog_init', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_watchdog_need', 'args' => [] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_hook_get_watchdog_step', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_hook_handler', 'args' => [ { 'type' => 'ap_HOOK_handler_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_header_parser', 'args' => [ { 'type' => 'ap_HOOK_header_parser_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_http_scheme', 'args' => [ { 'type' => 'ap_HOOK_http_scheme_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_insert_error_filter', 'args' => [ { 'type' => 'ap_HOOK_insert_error_filter_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_insert_filter', 'args' => [ { 'type' => 'ap_HOOK_insert_filter_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_insert_network_bucket', 'args' => [ { 'type' => 'ap_HOOK_insert_network_bucket_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_log_transaction', 'args' => [ { 'type' => 'ap_HOOK_log_transaction_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_map_to_storage', 'args' => [ { 'type' => 'ap_HOOK_map_to_storage_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_monitor', 'args' => [ { 'type' => 'ap_HOOK_monitor_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_mpm', 'args' => [ { 'type' => 'ap_HOOK_mpm_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_mpm_get_name', 'args' => [ { 'type' => 'ap_HOOK_mpm_get_name_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_mpm_query', 'args' => [ { 'type' => 'ap_HOOK_mpm_query_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_mpm_register_timed_callback', 'args' => [ { 'type' => 'ap_HOOK_mpm_register_timed_callback_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_note_auth_failure', 'args' => [ { 'type' => 'ap_HOOK_note_auth_failure_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_open_logs', 'args' => [ { 'type' => 'ap_HOOK_open_logs_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_optional_fn_retrieve', 'args' => [ { 'type' => 'ap_HOOK_optional_fn_retrieve_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_post_config', 'args' => [ { 'type' => 'ap_HOOK_post_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_post_read_request', 'args' => [ { 'type' => 'ap_HOOK_post_read_request_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_config', 'args' => [ { 'type' => 'ap_HOOK_pre_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_connection', 'args' => [ { 'type' => 'ap_HOOK_pre_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_mpm', 'args' => [ { 'type' => 'ap_HOOK_pre_mpm_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_pre_read_request', 'args' => [ { 'type' => 'ap_HOOK_pre_read_request_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_process_connection', 'args' => [ { 'type' => 'ap_HOOK_process_connection_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_quick_handler', 'args' => [ { 'type' => 'ap_HOOK_quick_handler_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_session_decode', 'args' => [ { 'type' => 'ap_HOOK_session_decode_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_session_encode', 'args' => [ { 'type' => 'ap_HOOK_session_encode_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_session_load', 'args' => [ { 'type' => 'ap_HOOK_session_load_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_session_save', 'args' => [ { 'type' => 'ap_HOOK_session_save_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_status_hook', 'args' => [ { 'type' => 'ap_HOOK_status_hook_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_test_config', 'args' => [ { 'type' => 'ap_HOOK_test_config_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_translate_name', 'args' => [ { 'type' => 'ap_HOOK_translate_name_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_type_checker', 'args' => [ { 'type' => 'ap_HOOK_type_checker_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_watchdog_exit', 'args' => [ { 'type' => 'ap_HOOK_watchdog_exit_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_watchdog_init', 'args' => [ { 'type' => 'ap_HOOK_watchdog_init_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_watchdog_need', 'args' => [ { 'type' => 'ap_HOOK_watchdog_need_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'void', 'name' => 'ap_hook_watchdog_step', 'args' => [ { 'type' => 'ap_HOOK_watchdog_step_t *', 'name' => 'pf' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'char *', 'name' => 'ap_ht_time', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_time_t', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'int', 'name' => 'gmt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_chunk_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_header_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_http_outerror_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'ap_if_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_increment_counts', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_ind', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'char', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_index_of_response', 'args' => [ { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'ap_init_rng', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_init_scoreboard', 'args' => [ { 'type' => 'void *', 'name' => 'shared_score' } ] }, { 'return_type' => 'void', 'name' => 'ap_init_vhost_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_init_virtual_host', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'server_rec *', 'name' => 'main_server' }, { 'type' => 'server_rec **', 'name' => 'ps' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_fast_redirect', 'args' => [ { 'type' => 'request_rec *', 'name' => 'sub_req' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_redirect', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_internal_redirect_handler', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_invoke_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_directory', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_initial_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_matchexp', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_rdirectory', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_recursion_limit_exceeded', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_is_url', 'args' => [ { 'type' => 'const char *', 'name' => 'u' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_limit_section', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_lingering_close', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_list_provider_groups', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'ap_list_provider_names', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_version' } ] }, { 'return_type' => 'void', 'name' => 'ap_listen_pre_config', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_location_walk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_assert', 'args' => [ { 'type' => 'const char *', 'name' => 'szExp' }, { 'type' => 'const char *', 'name' => 'szFile' }, { 'type' => 'int', 'name' => 'nLine' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_cerror_', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg7' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_command_line', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_cserror_', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg8' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_error_', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg7' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_perror_', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg7' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'void', 'name' => 'ap_log_rerror_', 'args' => [ { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg7' } ] }, { 'return_type' => 'void', 'name' => 'ap_logs_child_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void *', 'name' => 'ap_lookup_provider', 'args' => [ { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_make_content_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'type' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_dirstr_parent', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_dirstr_prefix', 'args' => [ { 'type' => 'char *', 'name' => 'd' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_etag', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'force_weak' } ] }, { 'return_type' => 'char *', 'name' => 'ap_make_full_path', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const char *', 'name' => 'dir' }, { 'type' => 'const char *', 'name' => 'f' } ] }, { 'return_type' => 'ap_method_list_t *', 'name' => 'ap_make_method_list', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'void *', 'name' => 'ap_malloc', 'args' => [ { 'type' => 'size_t', 'name' => 'size' } ] }, { 'return_type' => 'int', 'name' => 'ap_matches_request_vhost', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'host' }, { 'type' => 'apr_port_t', 'name' => 'port' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const unsigned char *', 'name' => 'string' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5_binary', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'const unsigned char *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'len' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5contextTo64', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'char *', 'name' => 'ap_md5digest', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_file_t *', 'name' => 'infile' } ] }, { 'return_type' => 'int', 'name' => 'ap_meets_conditions', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_merge_log_config', 'args' => [ { 'type' => 'const struct ap_logconf *', 'name' => 'old_conf' }, { 'type' => 'struct ap_logconf *', 'name' => 'new_conf' } ] }, { 'return_type' => 'ap_conf_vector_t*', 'name' => 'ap_merge_per_dir_configs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'base' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'new_conf' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_in_list', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_is_limited', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_add', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_list_remove', 'args' => [ { 'type' => 'ap_method_list_t *', 'name' => 'l' }, { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_method_name_of', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'methnum' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_number_of', 'args' => [ { 'type' => 'const char *', 'name' => 'method' } ] }, { 'return_type' => 'int', 'name' => 'ap_method_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'methname' } ] }, { 'return_type' => 'void', 'name' => 'ap_method_registry_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_mpm_dump_pidfile', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_file_t *', 'name' => 'out' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_end_gen_helper', 'args' => [ { 'type' => 'void *unused', 'name' => 'arg0' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_check', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_close', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'void', 'name' => 'ap_mpm_pod_killpg', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' }, { 'type' => 'int', 'name' => 'num' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_open', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_pod_t **', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_pod_signal', 'args' => [ { 'type' => 'ap_pod_t *', 'name' => 'pod' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_query', 'args' => [ { 'type' => 'int', 'name' => 'query_code' }, { 'type' => 'int *', 'name' => 'result' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_register_timed_callback', 'args' => [ { 'type' => 'apr_time_t', 'name' => 't' }, { 'type' => 'ap_mpm_callback_fn_t *', 'name' => 'cbfn' }, { 'type' => 'void *', 'name' => 'baton' } ] }, { 'return_type' => 'void', 'name' => 'ap_mpm_rewrite_args', 'args' => [ { 'type' => 'process_rec *', 'name' => 'arg0' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mpm_safe_kill', 'args' => [ { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'int', 'name' => 'sig' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_coredumpdir', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_graceful_shutdown', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_max_mem_free', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_max_requests', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_pidfile', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_mpm_set_thread_stacksize', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_mutex_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_mutex_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'const char *', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'default_dir' }, { 'type' => 'apr_lockmech_e', 'name' => 'default_mech' }, { 'type' => 'apr_int32_t', 'name' => 'options' } ] }, { 'return_type' => 'struct ap_logconf *', 'name' => 'ap_new_log_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const struct ap_logconf *', 'name' => 'old' } ] }, { 'return_type' => 'void', 'name' => 'ap_no2slash', 'args' => [ { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_basic_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_note_digest_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_old_write_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'ap_open_logs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's_main' } ] }, { 'return_type' => 'piped_log *', 'name' => 'ap_open_piped_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'program' } ] }, { 'return_type' => 'piped_log *', 'name' => 'ap_open_piped_log_ex', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'program' }, { 'type' => 'apr_cmdtype_e', 'name' => 'cmdtype' } ] }, { 'return_type' => 'void', 'name' => 'ap_open_stderr_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_os_create_privileged_process', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'apr_proc_t *', 'name' => 'newproc' }, { 'type' => 'const char *', 'name' => 'progname' }, { 'type' => 'const char * const *', 'name' => 'args' }, { 'type' => 'const char * const *', 'name' => 'env' }, { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'char *', 'name' => 'ap_os_escape_path', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'partial' } ] }, { 'return_type' => 'int', 'name' => 'ap_os_is_path_absolute', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'dir' } ] }, { 'return_type' => 'int', 'name' => 'ap_parse_form_data', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'struct ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_array_header_t **', 'name' => 'ptr' }, { 'type' => 'apr_size_t', 'name' => 'num' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'int', 'name' => 'ap_parse_htaccess', 'args' => [ { 'type' => 'ap_conf_vector_t **', 'name' => 'result' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'int', 'name' => 'override_opts' }, { 'type' => 'apr_table_t *', 'name' => 'override_list' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'const char *', 'name' => 'access_name' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_parse_log_level', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'int *', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_parse_mutex', 'args' => [ { 'type' => 'const char *', 'name' => 'arg' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_lockmech_e *', 'name' => 'mutexmech' }, { 'type' => 'const char **', 'name' => 'mutexfile' } ] }, { 'return_type' => 'void', 'name' => 'ap_parse_uri', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'uri' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_parse_vhost_addrs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pass_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pass_brigade_fchk', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bucket' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pbase64decode', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'bufcoded' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pbase64encode', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char *', 'name' => 'string' } ] }, { 'return_type' => 'ap_configfile_t *', 'name' => 'ap_pcfg_open_custom', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'descr' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'apr_status_t (*getc_func) (char *ch, void *param)', 'name' => 'arg3' }, { 'type' => 'apr_status_t (*gets_func) (void *buf, apr_size_t bufsiz, void *param)', 'name' => 'arg4' }, { 'type' => 'apr_status_t (*close_func) (void *param)', 'name' => 'arg5' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pcfg_openfile', 'args' => [ { 'type' => 'ap_configfile_t **', 'name' => 'ret_cfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_pcfg_strerror', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_configfile_t *', 'name' => 'cfp' }, { 'type' => 'apr_status_t', 'name' => 'rc' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'ap_pcw_srv_cb_t', 'name' => 'srv_cb' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_default_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_directory_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_server_config *', 'name' => 'sconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_files_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_dir_config *', 'name' => 'dconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_location_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'core_server_config *', 'name' => 'sconf' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_dir_cb_t', 'name' => 'dir_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'ap_pcw_walk_server_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'modp' }, { 'type' => 'ap_pcw_srv_cb_t', 'name' => 'srv_cb' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_file_t *', 'name' => 'ap_piped_log_read_fd', 'args' => [ { 'type' => 'piped_log *', 'name' => 'pl' } ] }, { 'return_type' => 'apr_file_t *', 'name' => 'ap_piped_log_write_fd', 'args' => [ { 'type' => 'piped_log *', 'name' => 'pl' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pool_cleanup_set_null', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'ap_regex_t *', 'name' => 'ap_pregcomp', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'int', 'name' => 'cflags' } ] }, { 'return_type' => 'void', 'name' => 'ap_pregfree', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_regex_t *', 'name' => 'reg' } ] }, { 'return_type' => 'char *', 'name' => 'ap_pregsub', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t', 'name' => 'pmatch' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pregsub_ex', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'result' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t', 'name' => 'pmatch' }, { 'type' => 'apr_size_t', 'name' => 'maxlen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_proc_mutex_create', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char **', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'instance_id' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_int32_t', 'name' => 'options' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_async_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_process_child_status', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'pid' }, { 'type' => 'apr_exit_why_e', 'name' => 'why' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'int', 'name' => 'ap_process_config_tree', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_directive_t *', 'name' => 'conftree' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_process_fnmatch_configs', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'int', 'name' => 'optional' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_process_request_after_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_process_request_internal', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_process_resource_config', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_psignature', 'args' => [ { 'type' => 'const char *', 'name' => 'prefix' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_pstr2_alnum', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'src' }, { 'type' => 'const char **', 'name' => 'dest' } ] }, { 'return_type' => 'void', 'name' => 'ap_random_insecure_bytes', 'args' => [ { 'type' => 'void *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'void', 'name' => 'ap_random_parent_after_fork', 'args' => [] }, { 'return_type' => 'apr_uint32_t', 'name' => 'ap_random_pick', 'args' => [ { 'type' => 'apr_uint32_t', 'name' => 'min' }, { 'type' => 'apr_uint32_t', 'name' => 'max' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'ap_rationalize_mtime', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'mtime' } ] }, { 'return_type' => 'server_rec *', 'name' => 'ap_read_config', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'const char *', 'name' => 'config_name' }, { 'type' => 'ap_directive_t **', 'name' => 'conftree' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_read_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'pid_t *', 'name' => 'mypid' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_read_request', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void *', 'name' => 'ap_realloc', 'args' => [ { 'type' => 'void *', 'name' => 'ptr' }, { 'type' => 'size_t', 'name' => 'size' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_recent_ctime', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_recent_ctime_ex', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' }, { 'type' => 'int', 'name' => 'option' }, { 'type' => 'int *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_recent_rfc822_date', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'ap_reclaim_child_processes', 'args' => [ { 'type' => 'int', 'name' => 'terminate' }, { 'type' => 'ap_reclaim_callback_fn_t *', 'name' => 'mpm_callback' } ] }, { 'return_type' => 'int', 'name' => 'ap_regcomp', 'args' => [ { 'type' => 'ap_regex_t *', 'name' => 'preg' }, { 'type' => 'const char *', 'name' => 'regex' }, { 'type' => 'int', 'name' => 'cflags' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_regerror', 'args' => [ { 'type' => 'int', 'name' => 'errcode' }, { 'type' => 'const ap_regex_t *', 'name' => 'preg' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'apr_size_t', 'name' => 'errbuf_size' } ] }, { 'return_type' => 'int', 'name' => 'ap_regexec', 'args' => [ { 'type' => 'const ap_regex_t *', 'name' => 'preg' }, { 'type' => 'const char *', 'name' => 'string' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t *', 'name' => 'pmatch' }, { 'type' => 'int', 'name' => 'eflags' } ] }, { 'return_type' => 'int', 'name' => 'ap_regexec_len', 'args' => [ { 'type' => 'const ap_regex_t *', 'name' => 'preg' }, { 'type' => 'const char *', 'name' => 'buff' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t *', 'name' => 'pmatch' }, { 'type' => 'int', 'name' => 'eflags' } ] }, { 'return_type' => 'void', 'name' => 'ap_regfree', 'args' => [ { 'type' => 'ap_regex_t *', 'name' => 'preg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_register_auth_provider', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' }, { 'type' => 'const void *', 'name' => 'provider' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_config_hooks', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_errorlog_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char *', 'name' => 'tag' }, { 'type' => 'ap_errorlog_handler_fn_t *', 'name' => 'handler' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_extra_mpm_process', 'args' => [ { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'ap_generation_t', 'name' => 'gen' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_hooks', 'args' => [ { 'type' => 'module *', 'name' => 'm' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_register_input_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_in_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' } ] }, { 'return_type' => 'void', 'name' => 'ap_register_log_hooks', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_register_output_filter', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_out_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' } ] }, { 'return_type' => 'ap_filter_rec_t *', 'name' => 'ap_register_output_filter_protocol', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_out_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' }, { 'type' => 'unsigned int', 'name' => 'proto_flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_register_provider', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' }, { 'type' => 'const void *', 'name' => 'provider' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_register_request_note', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_relieve_child_processes', 'args' => [ { 'type' => 'ap_reclaim_callback_fn_t *', 'name' => 'mpm_callback' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_input_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_loaded_module', 'args' => [ { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_module', 'args' => [ { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_output_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' } ] }, { 'return_type' => 'void', 'name' => 'ap_remove_pid', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_reopen_scoreboard', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_shm_t **', 'name' => 'shm' }, { 'type' => 'int', 'name' => 'detached' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_replace_stderr_log', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file' } ] }, { 'return_type' => 'int', 'name' => 'ap_request_has_body', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_reserve_module_slots', 'args' => [ { 'type' => 'int', 'name' => 'count' } ] }, { 'return_type' => 'void', 'name' => 'ap_reserve_module_slots_directive', 'args' => [ { 'type' => 'const char *', 'name' => 'directive' } ] }, { 'return_type' => 'void', 'name' => 'ap_reset_module_loglevels', 'args' => [ { 'type' => 'struct ap_logconf *', 'name' => 'l' }, { 'type' => 'int', 'name' => 'val' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_resolve_env', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'word' } ] }, { 'return_type' => 'char *', 'name' => 'ap_response_code_string', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'error_index' } ] }, { 'return_type' => 'void *', 'name' => 'ap_retained_data_create', 'args' => [ { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'void *', 'name' => 'ap_retained_data_get', 'args' => [ { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'int', 'name' => 'ap_rflush', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_rgetline_core', 'args' => [ { 'type' => 'char **', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' }, { 'type' => 'apr_size_t *', 'name' => 'read' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'fold' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'int', 'name' => 'ap_rind', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'char', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_rprintf', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'int', 'name' => 'ap_rputc', 'args' => [ { 'type' => 'int', 'name' => 'c' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_rputs', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_access_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_access_checker_ex', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_auth_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_check_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_check_user_id', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_child_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pchild' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_child_status', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'ap_generation_t', 'name' => 'gen' }, { 'type' => 'int', 'name' => 'slot' }, { 'type' => 'mpm_child_status', 'name' => 'state' } ] }, { 'return_type' => 'conn_rec *', 'name' => 'ap_run_create_connection', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'apr_socket_t *', 'name' => 'csd' }, { 'type' => 'long', 'name' => 'conn_id' }, { 'type' => 'void *', 'name' => 'sbh' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'alloc' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_create_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'ap_run_default_port', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_drop_privileges', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pchild' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_end_generation', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_generation_t', 'name' => 'gen' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_error_log', 'args' => [ { 'type' => 'const ap_errorlog_info *', 'name' => 'info' }, { 'type' => 'const char *', 'name' => 'errstr' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_expr_lookup', 'args' => [ { 'type' => 'ap_expr_lookup_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_fixups', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_generate_log_id', 'args' => [ { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'const char **', 'name' => 'id' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_get_mgmt_items', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'val' }, { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'ap_unix_identity_t *', 'name' => 'ap_run_get_suexec_identity', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_header_parser', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_run_http_scheme', 'args' => [ { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_insert_error_filter', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_insert_filter', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_insert_network_bucket', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_log_transaction', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_map_to_storage', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_monitor', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_mpm', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'server_rec *', 'name' => 'server_conf' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_run_mpm_get_name', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_run_mpm_query', 'args' => [ { 'type' => 'int', 'name' => 'query_code' }, { 'type' => 'int *', 'name' => 'result' }, { 'type' => 'apr_status_t *', 'name' => 'rv' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_mpm_register_timed_callback', 'args' => [ { 'type' => 'apr_time_t', 'name' => 't' }, { 'type' => 'ap_mpm_callback_fn_t *', 'name' => 'cbfn' }, { 'type' => 'void *', 'name' => 'baton' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_note_auth_failure', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'auth_type' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_open_logs', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_optional_fn_retrieve', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_run_post_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_post_read_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_pre_mpm', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'ap_scoreboard_e', 'name' => 'sb_type' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_pre_read_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_process_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_quick_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'lookup_uri' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_rewrite_args', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_session_decode', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'session_rec *', 'name' => 'z' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_session_encode', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'session_rec *', 'name' => 'z' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_session_load', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'session_rec **', 'name' => 'z' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_run_session_save', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'session_rec *', 'name' => 'z' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_status_hook', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_sub_req', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_run_test_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_translate_name', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_type_checker', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_watchdog_exit', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_watchdog_init', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_watchdog_need', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'parent' }, { 'type' => 'int', 'name' => 'singleton' } ] }, { 'return_type' => 'int', 'name' => 'ap_run_watchdog_step', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'char *', 'name' => 'ap_runtime_dir_relative', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'int', 'name' => 'ap_rvputs', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => '...', 'name' => 'arg1' } ] }, { 'return_type' => 'int', 'name' => 'ap_rwrite', 'args' => [ { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'nbyte' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'ap_rxplus_t*', 'name' => 'ap_rxplus_compile', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'pattern' } ] }, { 'return_type' => 'int', 'name' => 'ap_rxplus_exec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'ap_rxplus_t *', 'name' => 'rx' }, { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'char **', 'name' => 'newpattern' } ] }, { 'return_type' => 'void', 'name' => 'ap_rxplus_match', 'args' => [ { 'type' => 'ap_rxplus_t *', 'name' => 'rx' }, { 'type' => 'int', 'name' => 'n' }, { 'type' => 'int *', 'name' => 'len' }, { 'type' => 'const char **', 'name' => 'match' } ] }, { 'return_type' => 'char*', 'name' => 'ap_rxplus_pmatch', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'ap_rxplus_t *', 'name' => 'rx' }, { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'int', 'name' => 'ap_satisfies', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_save_brigade', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade **', 'name' => 'save_to' }, { 'type' => 'apr_bucket_brigade **', 'name' => 'b' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'char *', 'name' => 'buffer' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_brigade', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char *', 'name' => 'buffer' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_brigade_ex', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'int', 'name' => 'module_index' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_core', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'int (*getsfunc) (char *, int, void *)', 'name' => 'arg2' }, { 'type' => 'void *', 'name' => 'getsfunc_data' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_core_ex', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'int (*getsfunc) (char *, int, void *)', 'name' => 'arg2' }, { 'type' => 'void *', 'name' => 'getsfunc_data' }, { 'type' => 'int', 'name' => 'module_index' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_ex', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'int', 'name' => 'module_index' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_strs', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'const char **', 'name' => 'termch' }, { 'type' => 'int *', 'name' => 'termarg' }, { 'type' => '...', 'name' => 'arg4' } ] }, { 'return_type' => 'int', 'name' => 'ap_scan_script_header_err_strs_ex', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'const char **', 'name' => 'termch' }, { 'type' => 'int *', 'name' => 'termarg' }, { 'type' => '...', 'name' => 'arg5' } ] }, { 'return_type' => 'void', 'name' => 'ap_send_error_response', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'recursive_error' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_send_fd', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'int', 'name' => 'ap_send_http_options', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_send_http_trace', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_send_interim_response', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'send_headers' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'ap_send_mmap', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_size_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'char *', 'name' => 'ap_server_root_relative', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fname' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_accept_ranges', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void *', 'name' => 'ap_set_config_vectors', 'args' => [ { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'section_vector' }, { 'type' => 'const char *section', 'name' => 'arg2' }, { 'type' => 'module *', 'name' => 'mod' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_content_length', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_off_t', 'name' => 'length' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_content_type', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'ct' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_context_info', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'prefix' }, { 'type' => 'const char *', 'name' => 'document_root' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_core_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'void *', 'name' => 'val' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_deprecated', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_document_root', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'document_root' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_etag', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_extended_status', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'int', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_file_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_flag_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'int', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_flag_slot_char', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'int', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_int_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'int', 'name' => 'ap_set_keepalive', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_last_modified', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_listenbacklog', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_listener', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'char *const', 'name' => 'argv' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'const module *', 'name' => 'm' }, { 'type' => 'void *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_module_loglevel', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'struct ap_logconf *', 'name' => 'l' }, { 'type' => 'int', 'name' => 'index' }, { 'type' => 'int', 'name' => 'level' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_mutex', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_name_virtual_host', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_receive_buffer_size', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_reqtail', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'int', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_scoreboard', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_send_buffer_size', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_server_protocol', 'args' => [ { 'type' => 'server_rec*', 'name' => 's' }, { 'type' => 'const char*', 'name' => 'proto' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_string_slot', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_set_string_slot_lower', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'void *', 'name' => 'struct_ptr' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'ap_set_sub_req_protocol', 'args' => [ { 'type' => 'request_rec *', 'name' => 'rnew' }, { 'type' => 'const request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_setup_auth_internal', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'int', 'name' => 'ap_setup_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'read_policy' } ] }, { 'return_type' => 'int', 'name' => 'ap_setup_listeners', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_setup_make_content_type', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_setup_prelinked_modules', 'args' => [ { 'type' => 'process_rec *', 'name' => 'process' } ] }, { 'return_type' => 'int', 'name' => 'ap_should_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_show_directives', 'args' => [] }, { 'return_type' => 'void', 'name' => 'ap_show_modules', 'args' => [] }, { 'return_type' => 'const char *', 'name' => 'ap_show_mpm', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_signal_server', 'args' => [ { 'type' => 'int *', 'name' => 'arg0' }, { 'type' => 'apr_pool_t *', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'ap_single_module_configure', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'module *', 'name' => 'm' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_size_list_item', 'args' => [ { 'type' => 'const char **', 'name' => 'field' }, { 'type' => 'int *', 'name' => 'len' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_soak_end_container', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'char *', 'name' => 'directive' } ] }, { 'return_type' => 'int', 'name' => 'ap_some_auth_required', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_start_lingering_close', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_state_query', 'args' => [ { 'type' => 'int', 'name' => 'query_code' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_str2_alnum', 'args' => [ { 'type' => 'const char *', 'name' => 'src' }, { 'type' => 'char *', 'name' => 'dest' } ] }, { 'return_type' => 'void', 'name' => 'ap_str_tolower', 'args' => [ { 'type' => 'char *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'ap_str_toupper', 'args' => [ { 'type' => 'char *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'ap_strcasecmp_match', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'expected' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strcasestr', 'args' => [ { 'type' => 'const char *', 'name' => 's1' }, { 'type' => 'const char *', 'name' => 's2' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strchr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strchr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_strcmp_match', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'expected' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_stripprefix', 'args' => [ { 'type' => 'const char *', 'name' => 'bigstring' }, { 'type' => 'const char *', 'name' => 'prefix' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strrchr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strrchr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'c' } ] }, { 'return_type' => 'char *', 'name' => 'ap_strstr', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'c' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_strstr_c', 'args' => [ { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'c' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_dirent', 'args' => [ { 'type' => 'const apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'subtype' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_file', 'args' => [ { 'type' => 'const char *', 'name' => 'new_file' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_lookup_uri', 'args' => [ { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'request_rec *', 'name' => 'ap_sub_req_method_uri', 'args' => [ { 'type' => 'const char *', 'name' => 'method' }, { 'type' => 'const char *', 'name' => 'new_uri' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'ap_filter_t *', 'name' => 'next_filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_sub_req_output_filter', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'int', 'name' => 'ap_sys_privileges_handlers', 'args' => [ { 'type' => 'int', 'name' => 'inc' } ] }, { 'return_type' => 'void', 'name' => 'ap_time_process_request', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_timeout_parameter_parse', 'args' => [ { 'type' => 'const char *', 'name' => 'timeout_parameter' }, { 'type' => 'apr_interval_time_t *', 'name' => 'timeout' }, { 'type' => 'const char *', 'name' => 'default_time_unit' } ] }, { 'return_type' => 'uid_t', 'name' => 'ap_uname2id', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_all', 'args' => [ { 'type' => 'char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_url', 'args' => [ { 'type' => 'char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_url_keep2f', 'args' => [ { 'type' => 'char *', 'name' => 'url' }, { 'type' => 'int', 'name' => 'decode_slashes' } ] }, { 'return_type' => 'int', 'name' => 'ap_unescape_urlencoded', 'args' => [ { 'type' => 'char *', 'name' => 'query' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_unixd_accept', 'args' => [ { 'type' => 'void **', 'name' => 'accepted' }, { 'type' => 'ap_listen_rec *', 'name' => 'lr' }, { 'type' => 'apr_pool_t *', 'name' => 'ptrans' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_unixd_set_global_mutex_perms', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'gmutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_unixd_set_proc_mutex_perms', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'pmutex' } ] }, { 'return_type' => 'void', 'name' => 'ap_unixd_set_rlimit', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'cmd' }, { 'type' => 'struct rlimit **', 'name' => 'plimit' }, { 'type' => 'const char *', 'name' => 'arg' }, { 'type' => 'const char *', 'name' => 'arg2' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'int', 'name' => 'ap_unixd_setup_child', 'args' => [] }, { 'return_type' => 'int', 'name' => 'ap_unregister_extra_mpm_process', 'args' => [ { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'ap_generation_t *', 'name' => 'old_gen' } ] }, { 'return_type' => 'int', 'name' => 'ap_update_child_status', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'ap_update_child_status_from_conn', 'args' => [ { 'type' => 'ap_sb_handle_t *', 'name' => 'sbh' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'int', 'name' => 'ap_update_child_status_from_indexes', 'args' => [ { 'type' => 'int', 'name' => 'child_num' }, { 'type' => 'int', 'name' => 'thread_num' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_mtime', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'dependency_mtime' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_vhost_from_headers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'ap_update_vhost_given_ip', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_varbuf_cfg_getline', 'args' => [ { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'ap_configfile_t *', 'name' => 'cfp' }, { 'type' => 'apr_size_t', 'name' => 'max_len' } ] }, { 'return_type' => 'void', 'name' => 'ap_varbuf_free', 'args' => [ { 'type' => 'struct ap_varbuf *', 'name' => 'vb' } ] }, { 'return_type' => 'void', 'name' => 'ap_varbuf_grow', 'args' => [ { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'apr_size_t', 'name' => 'new_size' } ] }, { 'return_type' => 'void', 'name' => 'ap_varbuf_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'apr_size_t', 'name' => 'init_size' } ] }, { 'return_type' => 'char *', 'name' => 'ap_varbuf_pdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'const char *', 'name' => 'prepend' }, { 'type' => 'apr_size_t', 'name' => 'prepend_len' }, { 'type' => 'const char *', 'name' => 'append' }, { 'type' => 'apr_size_t', 'name' => 'append_len' }, { 'type' => 'apr_size_t *', 'name' => 'new_len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'ap_varbuf_regsub', 'args' => [ { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'const char *', 'name' => 'source' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t', 'name' => 'pmatch' }, { 'type' => 'apr_size_t', 'name' => 'maxlen' } ] }, { 'return_type' => 'void', 'name' => 'ap_varbuf_strmemcat', 'args' => [ { 'type' => 'struct ap_varbuf *', 'name' => 'vb' }, { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'int', 'name' => 'len' } ] }, { 'return_type' => 'int', 'name' => 'ap_vhost_iterate_given_conn', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'conn' }, { 'type' => 'ap_vhost_iterate_conn_cb', 'name' => 'func_cb' }, { 'type' => 'void*', 'name' => 'baton' } ] }, { 'return_type' => 'int', 'name' => 'ap_vrprintf', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'vlist' } ] }, { 'return_type' => 'void', 'name' => 'ap_wait_or_timeout', 'args' => [ { 'type' => 'apr_exit_why_e *', 'name' => 'status' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_proc_t *', 'name' => 'ret' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'const char *', 'name' => 'ap_walk_config', 'args' => [ { 'type' => 'ap_directive_t *', 'name' => 'conftree' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'section_vector' } ] }, { 'return_type' => 'int', 'name' => 'ap_xml_parse_input', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_xml_doc **', 'name' => 'pdoc' } ] }, { 'return_type' => 'apr_memnode_t *', 'name' => 'apr_allocator_alloc', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_allocator_create', 'args' => [ { 'type' => 'apr_allocator_t **', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_destroy', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_free', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_memnode_t *', 'name' => 'memnode' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_max_free_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'apr_thread_mutex_t *', 'name' => 'apr_allocator_mutex_get', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_mutex_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_allocator_owner_get', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_allocator_owner_set', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_app_initialize', 'args' => [ { 'type' => 'int *', 'name' => 'argc' }, { 'type' => 'char const * const * *', 'name' => 'argv' }, { 'type' => 'char const * const * *', 'name' => 'env' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_append', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'first' }, { 'type' => 'const apr_array_header_t *', 'name' => 'second' } ] }, { 'return_type' => 'void', 'name' => 'apr_array_cat', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'dst' }, { 'type' => 'const apr_array_header_t *', 'name' => 'src' } ] }, { 'return_type' => 'void', 'name' => 'apr_array_clear', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_copy_hdr', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_array_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' }, { 'type' => 'int', 'name' => 'elt_size' } ] }, { 'return_type' => 'void *', 'name' => 'apr_array_pop', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'char *', 'name' => 'apr_array_pstrcat', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_array_header_t *', 'name' => 'arr' }, { 'type' => 'const char', 'name' => 'sep' } ] }, { 'return_type' => 'void *', 'name' => 'apr_array_push', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'arr' } ] }, { 'return_type' => 'apr_int64_t', 'name' => 'apr_atoi64', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_add32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_cas32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'with' }, { 'type' => 'apr_uint32_t', 'name' => 'cmp' } ] }, { 'return_type' => 'void*', 'name' => 'apr_atomic_casptr', 'args' => [ { 'type' => 'volatile void **', 'name' => 'mem' }, { 'type' => 'void *', 'name' => 'with' }, { 'type' => 'const void *', 'name' => 'cmp' } ] }, { 'return_type' => 'int', 'name' => 'apr_atomic_dec32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_inc32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_atomic_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_read32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' } ] }, { 'return_type' => 'void', 'name' => 'apr_atomic_set32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_atomic_sub32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_atomic_xchg32', 'args' => [ { 'type' => 'volatile apr_uint32_t *', 'name' => 'mem' }, { 'type' => 'apr_uint32_t', 'name' => 'val' } ] }, { 'return_type' => 'void*', 'name' => 'apr_atomic_xchgptr', 'args' => [ { 'type' => 'volatile void **', 'name' => 'mem' }, { 'type' => 'void *', 'name' => 'with' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode', 'args' => [ { 'type' => 'char *', 'name' => 'plain_dst' }, { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode_binary', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'plain_dst' }, { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_decode_len', 'args' => [ { 'type' => 'const char *', 'name' => 'coded_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode', 'args' => [ { 'type' => 'char *', 'name' => 'coded_dst' }, { 'type' => 'const char *', 'name' => 'plain_src' }, { 'type' => 'int', 'name' => 'len_plain_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode_binary', 'args' => [ { 'type' => 'char *', 'name' => 'coded_dst' }, { 'type' => 'const unsigned char *', 'name' => 'plain_src' }, { 'type' => 'int', 'name' => 'len_plain_src' } ] }, { 'return_type' => 'int', 'name' => 'apr_base64_encode_len', 'args' => [ { 'type' => 'int', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket_brigade *', 'name' => 'apr_brigade_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_destroy', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_flatten', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char *', 'name' => 'c' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_brigade_insert_file', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_off_t', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_length', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'int', 'name' => 'read_all' }, { 'type' => 'apr_off_t *', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_partition', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_off_t', 'name' => 'point' }, { 'type' => 'apr_bucket **', 'name' => 'after_point' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_pflatten', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'char **', 'name' => 'c' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_printf', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg4' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_putc', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char', 'name' => 'c' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_puts', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_putstrs', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_bucket_brigade *', 'name' => 'apr_brigade_split', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_bucket *', 'name' => 'e' } ] }, { 'return_type' => 'apr_bucket_brigade *', 'name' => 'apr_brigade_split_ex', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_bucket *', 'name' => 'e' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'a' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_split_line', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bbOut' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bbIn' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'maxbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_to_iovec', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'struct iovec *', 'name' => 'vec' }, { 'type' => 'int *', 'name' => 'nvec' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_vprintf', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'va' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_vputstrs', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'va_list', 'name' => 'va' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_write', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_brigade_writev', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'b' }, { 'type' => 'apr_brigade_flush', 'name' => 'flush' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' } ] }, { 'return_type' => 'void *', 'name' => 'apr_bucket_alloc', 'args' => [ { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket_alloc_t *', 'name' => 'apr_bucket_alloc_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_bucket_alloc_t *', 'name' => 'apr_bucket_alloc_create_ex', 'args' => [ { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_alloc_destroy', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_copy_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'e' }, { 'type' => 'apr_bucket **', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_destroy_noop', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_eos_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_eos_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_file_create', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_file_enable_mmap', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'enabled' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_file_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_flush_create', 'args' => [ { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_flush_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'apr_bucket_free', 'args' => [ { 'type' => 'void *', 'name' => 'block' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_heap_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'void (*free_func)(void *data)', 'name' => 'arg2' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_heap_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'void (*free_func)(void *data)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_immortal_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_immortal_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_mmap_create', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_mmap_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pipe_create', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thispipe' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pipe_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_file_t *', 'name' => 'thispipe' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pool_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_pool_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_setaside_noop', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_setaside_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_shared_copy', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket **', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'apr_bucket_shared_destroy', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_shared_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_shared_split', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_simple_copy', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket **', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_simple_split', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_socket_create', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thissock' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_socket_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'apr_socket_t *', 'name' => 'thissock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_bucket_split_notimpl', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'data' }, { 'type' => 'apr_size_t', 'name' => 'point' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_transient_create', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'apr_bucket_transient_make', 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbyte' } ] }, { 'return_type' => 'char *', 'name' => 'apr_collapse_spaces', 'args' => [ { 'type' => 'char *', 'name' => 'dest' }, { 'type' => 'const char *', 'name' => 'src' } ] }, { 'return_type' => 'char *', 'name' => 'apr_cpystrn', 'args' => [ { 'type' => 'char *', 'name' => 'dst' }, { 'type' => 'const char *', 'name' => 'src' }, { 'type' => 'apr_size_t', 'name' => 'dst_size' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_cleanup', 'args' => [ { 'type' => 'apr_crypto_block_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_decrypt', 'args' => [ { 'type' => 'unsigned char **', 'name' => 'out' }, { 'type' => 'apr_size_t *', 'name' => 'outlen' }, { 'type' => 'const unsigned char *', 'name' => 'in' }, { 'type' => 'apr_size_t', 'name' => 'inlen' }, { 'type' => 'apr_crypto_block_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_decrypt_finish', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'out' }, { 'type' => 'apr_size_t *', 'name' => 'outlen' }, { 'type' => 'apr_crypto_block_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_decrypt_init', 'args' => [ { 'type' => 'apr_crypto_block_t **', 'name' => 'ctx' }, { 'type' => 'apr_size_t *', 'name' => 'blockSize' }, { 'type' => 'const unsigned char *', 'name' => 'iv' }, { 'type' => 'const apr_crypto_key_t *', 'name' => 'key' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_encrypt', 'args' => [ { 'type' => 'unsigned char **', 'name' => 'out' }, { 'type' => 'apr_size_t *', 'name' => 'outlen' }, { 'type' => 'const unsigned char *', 'name' => 'in' }, { 'type' => 'apr_size_t', 'name' => 'inlen' }, { 'type' => 'apr_crypto_block_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_encrypt_finish', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'out' }, { 'type' => 'apr_size_t *', 'name' => 'outlen' }, { 'type' => 'apr_crypto_block_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_block_encrypt_init', 'args' => [ { 'type' => 'apr_crypto_block_t **', 'name' => 'ctx' }, { 'type' => 'const unsigned char **', 'name' => 'iv' }, { 'type' => 'const apr_crypto_key_t *', 'name' => 'key' }, { 'type' => 'apr_size_t *', 'name' => 'blockSize' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_cleanup', 'args' => [ { 'type' => 'apr_crypto_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_clear', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'void *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_crypto_driver_name', 'args' => [ { 'type' => 'const apr_crypto_driver_t *', 'name' => 'driver' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_error', 'args' => [ { 'type' => 'const apu_err_t **', 'name' => 'result' }, { 'type' => 'const apr_crypto_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_get_block_key_modes', 'args' => [ { 'type' => 'apr_hash_t **', 'name' => 'modes' }, { 'type' => 'const apr_crypto_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_get_block_key_types', 'args' => [ { 'type' => 'apr_hash_t **', 'name' => 'types' }, { 'type' => 'const apr_crypto_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_get_driver', 'args' => [ { 'type' => 'const apr_crypto_driver_t **', 'name' => 'driver' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'params' }, { 'type' => 'const apu_err_t **', 'name' => 'result' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_make', 'args' => [ { 'type' => 'apr_crypto_t **', 'name' => 'f' }, { 'type' => 'const apr_crypto_driver_t *', 'name' => 'driver' }, { 'type' => 'const char *', 'name' => 'params' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_passphrase', 'args' => [ { 'type' => 'apr_crypto_key_t **', 'name' => 'key' }, { 'type' => 'apr_size_t *', 'name' => 'ivSize' }, { 'type' => 'const char *', 'name' => 'pass' }, { 'type' => 'apr_size_t', 'name' => 'passLen' }, { 'type' => 'const unsigned char *', 'name' => 'salt' }, { 'type' => 'apr_size_t', 'name' => 'saltLen' }, { 'type' => 'const apr_crypto_block_key_type_e', 'name' => 'type' }, { 'type' => 'const apr_crypto_block_key_mode_e', 'name' => 'mode' }, { 'type' => 'const int', 'name' => 'doPad' }, { 'type' => 'const int', 'name' => 'iterations' }, { 'type' => 'const apr_crypto_t *', 'name' => 'f' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_crypto_hash_t *', 'name' => 'apr_crypto_sha256_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_crypto_shutdown', 'args' => [ { 'type' => 'const apr_crypto_driver_t *', 'name' => 'driver' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ctime', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_date_checkmask', 'args' => [ { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'mask' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_date_parse_http', 'args' => [ { 'type' => 'const char *', 'name' => 'date' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_date_parse_rfc', 'args' => [ { 'type' => 'const char *', 'name' => 'date' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_check_conn', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_close', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_datum_get', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_row_t *', 'name' => 'row' }, { 'type' => 'int', 'name' => 'col' }, { 'type' => 'apr_dbd_type_e', 'name' => 'type' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_dbd_error', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int', 'name' => 'errnum' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_dbd_escape', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'string' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_get_driver', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const apr_dbd_driver_t **', 'name' => 'driver' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_dbd_get_entry', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_row_t *', 'name' => 'row' }, { 'type' => 'int', 'name' => 'col' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_dbd_get_name', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_results_t *', 'name' => 'res' }, { 'type' => 'int', 'name' => 'col' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_get_row', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_results_t *', 'name' => 'res' }, { 'type' => 'apr_dbd_row_t **', 'name' => 'row' }, { 'type' => 'int', 'name' => 'rownum' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_dbd_name', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' } ] }, { 'return_type' => 'void*', 'name' => 'apr_dbd_native_handle', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_num_cols', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_results_t *', 'name' => 'res' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_num_tuples', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_results_t *', 'name' => 'res' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_open', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'params' }, { 'type' => 'apr_dbd_t **', 'name' => 'handle' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbd_open_ex', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'params' }, { 'type' => 'apr_dbd_t **', 'name' => 'handle' }, { 'type' => 'const char **', 'name' => 'error' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pbquery', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int *', 'name' => 'nrows' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'const void **', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pbselect', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_results_t **', 'name' => 'res' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'random' }, { 'type' => 'const void **', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pquery', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int *', 'name' => 'nrows' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'nargs' }, { 'type' => 'const char **', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_prepare', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'const char *', 'name' => 'query' }, { 'type' => 'const char *', 'name' => 'label' }, { 'type' => 'apr_dbd_prepared_t **', 'name' => 'statement' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pselect', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_results_t **', 'name' => 'res' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'random' }, { 'type' => 'int', 'name' => 'nargs' }, { 'type' => 'const char **', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pvbquery', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int *', 'name' => 'nrows' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => '...', 'name' => 'arg5' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pvbselect', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_results_t **', 'name' => 'res' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'random' }, { 'type' => '...', 'name' => 'arg6' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pvquery', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int *', 'name' => 'nrows' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => '...', 'name' => 'arg5' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_pvselect', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_results_t **', 'name' => 'res' }, { 'type' => 'apr_dbd_prepared_t *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'random' }, { 'type' => '...', 'name' => 'arg6' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_query', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'int *', 'name' => 'nrows' }, { 'type' => 'const char *', 'name' => 'statement' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_select', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_results_t **', 'name' => 'res' }, { 'type' => 'const char *', 'name' => 'statement' }, { 'type' => 'int', 'name' => 'random' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_set_dbname', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_transaction_end', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_transaction_t *', 'name' => 'trans' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_transaction_mode_get', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_transaction_t *', 'name' => 'trans' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_transaction_mode_set', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_dbd_transaction_t *', 'name' => 'trans' }, { 'type' => 'int', 'name' => 'mode' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbd_transaction_start', 'args' => [ { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'apr_dbd_transaction_t **', 'name' => 'trans' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_close', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_delete', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'int', 'name' => 'apr_dbm_exists', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_fetch', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' }, { 'type' => 'apr_datum_t *', 'name' => 'pvalue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_firstkey', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t *', 'name' => 'pkey' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_freedatum', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'apr_dbm_get_usednames', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'pathname' }, { 'type' => 'const char **', 'name' => 'used1' }, { 'type' => 'const char **', 'name' => 'used2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_get_usednames_ex', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'pathname' }, { 'type' => 'const char **', 'name' => 'used1' }, { 'type' => 'const char **', 'name' => 'used2' } ] }, { 'return_type' => 'char *', 'name' => 'apr_dbm_geterror', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'int *', 'name' => 'errcode' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'apr_size_t', 'name' => 'errbufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_nextkey', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t *', 'name' => 'pkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_open', 'args' => [ { 'type' => 'apr_dbm_t **', 'name' => 'dbm' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_open_ex', 'args' => [ { 'type' => 'apr_dbm_t **', 'name' => 'dbm' }, { 'type' => 'const char*', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dbm_store', 'args' => [ { 'type' => 'apr_dbm_t *', 'name' => 'dbm' }, { 'type' => 'apr_datum_t', 'name' => 'key' }, { 'type' => 'apr_datum_t', 'name' => 'value' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_close', 'args' => [ { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_make', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_make_recursive', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_open', 'args' => [ { 'type' => 'apr_dir_t **', 'name' => 'new_dir' }, { 'type' => 'const char *', 'name' => 'dirname' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_read', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_remove', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dir_rewind', 'args' => [ { 'type' => 'apr_dir_t *', 'name' => 'thedir' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_dso_error', 'args' => [ { 'type' => 'apr_dso_handle_t *', 'name' => 'dso' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_load', 'args' => [ { 'type' => 'apr_dso_handle_t **', 'name' => 'res_handle' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'ctx' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_sym', 'args' => [ { 'type' => 'apr_dso_handle_sym_t *', 'name' => 'ressym' }, { 'type' => 'apr_dso_handle_t *', 'name' => 'handle' }, { 'type' => 'const char *', 'name' => 'symname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_dso_unload', 'args' => [ { 'type' => 'apr_dso_handle_t *', 'name' => 'handle' } ] }, { 'return_type' => 'void', 'name' => 'apr_dynamic_fn_register', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'apr_opt_fn_t *', 'name' => 'pfn' } ] }, { 'return_type' => 'apr_opt_fn_t *', 'name' => 'apr_dynamic_fn_retrieve', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_delete', 'args' => [ { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_get', 'args' => [ { 'type' => 'char **', 'name' => 'value' }, { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_env_set', 'args' => [ { 'type' => 'const char *', 'name' => 'envvar' }, { 'type' => 'const char *', 'name' => 'value' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_append', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_attrs_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_fileattrs_t', 'name' => 'attributes' }, { 'type' => 'apr_fileattrs_t', 'name' => 'attr_mask' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_buffer_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_file_buffer_size_get', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_close', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_copy', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_data_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_datasync', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_dup', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_dup2', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_eof', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fptr' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'apr_file_flags_get', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'f' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_flush', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_getc', 'args' => [ { 'type' => 'char *', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_gets', 'args' => [ { 'type' => 'char *', 'name' => 'str' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_info_get', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_inherit_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_inherit_unset', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_link', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_lock', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_mktemp', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'fp' }, { 'type' => 'char *', 'name' => 'templ' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_mtime_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_name_get', 'args' => [ { 'type' => 'const char **', 'name' => 'new_path' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_namedpipe_create', 'args' => [ { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'newf' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'flag' }, { 'type' => 'apr_fileperms_t', 'name' => 'perm' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_flags_stderr', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_flags_stdin', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_flags_stdout', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stderr', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stdin', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_open_stdout', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_perms_set', 'args' => [ { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_create', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'in' }, { 'type' => 'apr_file_t **', 'name' => 'out' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_create_ex', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'in' }, { 'type' => 'apr_file_t **', 'name' => 'out' }, { 'type' => 'apr_int32_t', 'name' => 'blocking' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_timeout_get', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thepipe' }, { 'type' => 'apr_interval_time_t *', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_pipe_timeout_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thepipe' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_file_pool_get', 'args' => [ { 'type' => 'const apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'int', 'name' => 'apr_file_printf', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fptr' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_putc', 'args' => [ { 'type' => 'char', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_puts', 'args' => [ { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_read', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'void *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_read_full', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'void *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' }, { 'type' => 'apr_size_t *', 'name' => 'bytes_read' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_remove', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_rename', 'args' => [ { 'type' => 'const char *', 'name' => 'from_path' }, { 'type' => 'const char *', 'name' => 'to_path' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_seek', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_seek_where_t', 'name' => 'where' }, { 'type' => 'apr_off_t *', 'name' => 'offset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_setaside', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'new_file' }, { 'type' => 'apr_file_t *', 'name' => 'old_file' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_sync', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_trunc', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'fp' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_ungetc', 'args' => [ { 'type' => 'char', 'name' => 'ch' }, { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_unlock', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_write', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_write_full', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const void *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' }, { 'type' => 'apr_size_t *', 'name' => 'bytes_written' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_writev', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_file_writev_full', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'thefile' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_encoding', 'args' => [ { 'type' => 'int *', 'name' => 'style' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_get', 'args' => [ { 'type' => 'char **', 'name' => 'path' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_list_merge', 'args' => [ { 'type' => 'char **', 'name' => 'liststr' }, { 'type' => 'apr_array_header_t *', 'name' => 'pathelts' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_list_split', 'args' => [ { 'type' => 'apr_array_header_t **', 'name' => 'pathelts' }, { 'type' => 'const char *', 'name' => 'liststr' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_merge', 'args' => [ { 'type' => 'char **', 'name' => 'newpath' }, { 'type' => 'const char *', 'name' => 'rootpath' }, { 'type' => 'const char *', 'name' => 'addpath' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_filepath_name_get', 'args' => [ { 'type' => 'const char *', 'name' => 'pathname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_root', 'args' => [ { 'type' => 'const char **', 'name' => 'rootpath' }, { 'type' => 'const char **', 'name' => 'filepath' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_filepath_set', 'args' => [ { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_fnmatch', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'const char *', 'name' => 'strings' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'return_type' => 'int', 'name' => 'apr_fnmatch_test', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_generate_random_bytes', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'length' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gethostname', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getnameinfo', 'args' => [ { 'type' => 'char **', 'name' => 'hostname' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' }, { 'type' => 'apr_int32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt', 'args' => [ { 'type' => 'apr_getopt_t *', 'name' => 'os' }, { 'type' => 'const char *', 'name' => 'opts' }, { 'type' => 'char *', 'name' => 'option_ch' }, { 'type' => 'const char **', 'name' => 'option_arg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt_init', 'args' => [ { 'type' => 'apr_getopt_t **', 'name' => 'os' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'const char * const *', 'name' => 'argv' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getopt_long', 'args' => [ { 'type' => 'apr_getopt_t *', 'name' => 'os' }, { 'type' => 'const apr_getopt_option_t *', 'name' => 'opts' }, { 'type' => 'int *', 'name' => 'option_ch' }, { 'type' => 'const char **', 'name' => 'option_arg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_getservbyname', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' }, { 'type' => 'const char *', 'name' => 'servname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gid_get', 'args' => [ { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'groupname' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_gid_name_get', 'args' => [ { 'type' => 'char **', 'name' => 'groupname' }, { 'type' => 'apr_gid_t', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_child_init', 'args' => [ { 'type' => 'apr_global_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_create', 'args' => [ { 'type' => 'apr_global_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_lockmech_e', 'name' => 'mech' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_destroy', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_lock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_global_mutex_lockfile', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_global_mutex_name', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_global_mutex_pool_get', 'args' => [ { 'type' => 'const apr_global_mutex_t *', 'name' => 'theglobal_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_trylock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_global_mutex_unlock', 'args' => [ { 'type' => 'apr_global_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'void', 'name' => 'apr_hash_clear', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const apr_hash_t *', 'name' => 'h' } ] }, { 'return_type' => 'unsigned int', 'name' => 'apr_hash_count', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'int', 'name' => 'apr_hash_do', 'args' => [ { 'type' => 'apr_hash_do_callback_fn_t *comp', 'name' => 'arg0' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'apr_hash_index_t *', 'name' => 'apr_hash_first', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_hash_t *', 'name' => 'ht' } ] }, { 'return_type' => 'void *', 'name' => 'apr_hash_get', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' }, { 'type' => 'const void *', 'name' => 'key' }, { 'type' => 'apr_ssize_t', 'name' => 'klen' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_make_custom', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_hashfunc_t', 'name' => 'hash_func' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_hash_t *', 'name' => 'h1' }, { 'type' => 'const apr_hash_t *', 'name' => 'h2' }, { 'type' => 'void * (*merger)(apr_pool_t *p, const void *key, apr_ssize_t klen, const void *h1_val, const void *h2_val, const void *data)', 'name' => 'arg3' }, { 'type' => 'const void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_hash_index_t *', 'name' => 'apr_hash_next', 'args' => [ { 'type' => 'apr_hash_index_t *', 'name' => 'hi' } ] }, { 'return_type' => 'apr_hash_t *', 'name' => 'apr_hash_overlay', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_hash_t *', 'name' => 'overlay' }, { 'type' => 'const apr_hash_t *', 'name' => 'base' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_hash_pool_get', 'args' => [ { 'type' => 'const apr_hash_t *', 'name' => 'thehash' } ] }, { 'return_type' => 'void', 'name' => 'apr_hash_set', 'args' => [ { 'type' => 'apr_hash_t *', 'name' => 'ht' }, { 'type' => 'const void *', 'name' => 'key' }, { 'type' => 'apr_ssize_t', 'name' => 'klen' }, { 'type' => 'const void *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_hash_this', 'args' => [ { 'type' => 'apr_hash_index_t *', 'name' => 'hi' }, { 'type' => 'const void **', 'name' => 'key' }, { 'type' => 'apr_ssize_t *', 'name' => 'klen' }, { 'type' => 'void **', 'name' => 'val' } ] }, { 'return_type' => 'unsigned int', 'name' => 'apr_hashfunc_default', 'args' => [ { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_ssize_t *', 'name' => 'klen' } ] }, { 'return_type' => 'void', 'name' => 'apr_hook_debug_show', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' } ] }, { 'return_type' => 'void', 'name' => 'apr_hook_deregister_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_hook_sort_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_hook_sort_register', 'args' => [ { 'type' => 'const char *', 'name' => 'szHookName' }, { 'type' => 'apr_array_header_t **', 'name' => 'aHooks' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_initialize', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ipsubnet_create', 'args' => [ { 'type' => 'apr_ipsubnet_t **', 'name' => 'ipsub' }, { 'type' => 'const char *', 'name' => 'ipstr' }, { 'type' => 'const char *', 'name' => 'mask_or_numbits' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'apr_ipsubnet_test', 'args' => [ { 'type' => 'apr_ipsubnet_t *', 'name' => 'ipsub' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'int', 'name' => 'apr_is_empty_array', 'args' => [ { 'type' => 'const apr_array_header_t *', 'name' => 'a' } ] }, { 'return_type' => 'int', 'name' => 'apr_is_empty_table', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'char *', 'name' => 'apr_itoa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_get_option', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'LDAP *', 'name' => 'ldap' }, { 'type' => 'int', 'name' => 'option' }, { 'type' => 'void *', 'name' => 'outvalue' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_info', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'LDAP **', 'name' => 'ldap' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'int', 'name' => 'portno' }, { 'type' => 'int', 'name' => 'secure' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_is_ldap_url', 'args' => [ { 'type' => 'const char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_is_ldapi_url', 'args' => [ { 'type' => 'const char *', 'name' => 'url' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_is_ldaps_url', 'args' => [ { 'type' => 'const char *', 'name' => 'url' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ldap_rebind_add', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'LDAP *', 'name' => 'ld' }, { 'type' => 'const char *', 'name' => 'bindDN' }, { 'type' => 'const char *', 'name' => 'bindPW' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ldap_rebind_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_ldap_rebind_remove', 'args' => [ { 'type' => 'LDAP *', 'name' => 'ld' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_set_option', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'LDAP *', 'name' => 'ldap' }, { 'type' => 'int', 'name' => 'option' }, { 'type' => 'const void *', 'name' => 'invalue' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_ssl_deinit', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_ldap_ssl_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'cert_auth_file' }, { 'type' => 'int', 'name' => 'cert_file_type' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_url_parse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'url_in' }, { 'type' => 'apr_ldap_url_desc_t **', 'name' => 'ludpp' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'int', 'name' => 'apr_ldap_url_parse_ext', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'url_in' }, { 'type' => 'apr_ldap_url_desc_t **', 'name' => 'ludpp' }, { 'type' => 'apr_ldap_err_t **', 'name' => 'result_err' } ] }, { 'return_type' => 'char *', 'name' => 'apr_ltoa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'long', 'name' => 'n' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_match_glob', 'args' => [ { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'apr_array_header_t **', 'name' => 'result' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mcast_hops', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_byte_t', 'name' => 'ttl' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mcast_interface', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'iface' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mcast_join', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'join' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'iface' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'source' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mcast_leave', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'addr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'iface' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'source' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mcast_loopback', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_byte_t', 'name' => 'opt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_init', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_set_xlate', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md4_update', 'args' => [ { 'type' => 'apr_md4_ctx_t *', 'name' => 'context' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'const void *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_encode', 'args' => [ { 'type' => 'const char *', 'name' => 'password' }, { 'type' => 'const char *', 'name' => 'salt' }, { 'type' => 'char *', 'name' => 'result' }, { 'type' => 'apr_size_t', 'name' => 'nbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_init', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_set_xlate', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_md5_update', 'args' => [ { 'type' => 'apr_md5_ctx_t *', 'name' => 'context' }, { 'type' => 'const void *', 'name' => 'input' }, { 'type' => 'apr_size_t', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_add', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'char *', 'name' => 'baton' }, { 'type' => 'const apr_size_t', 'name' => 'data_size' }, { 'type' => 'apr_uint32_t', 'name' => 'timeout' }, { 'type' => 'apr_uint16_t', 'name' => 'flags' } ] }, { 'return_type' => 'void', 'name' => 'apr_memcache_add_multget_key', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'data_pool' }, { 'type' => 'const char*', 'name' => 'key' }, { 'type' => 'apr_hash_t **', 'name' => 'values' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_add_server', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'apr_memcache_server_t *', 'name' => 'server' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint16_t', 'name' => 'max_servers' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' }, { 'type' => 'apr_memcache_t **', 'name' => 'mc' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_decr', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_int32_t', 'name' => 'n' }, { 'type' => 'apr_uint32_t *', 'name' => 'new_value' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_delete', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_uint32_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_disable_server', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'apr_memcache_server_t *', 'name' => 'ms' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_enable_server', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'apr_memcache_server_t *', 'name' => 'ms' } ] }, { 'return_type' => 'apr_memcache_server_t *', 'name' => 'apr_memcache_find_server', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'host' }, { 'type' => 'apr_port_t', 'name' => 'port' } ] }, { 'return_type' => 'apr_memcache_server_t *', 'name' => 'apr_memcache_find_server_hash', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const apr_uint32_t', 'name' => 'hash' } ] }, { 'return_type' => 'apr_memcache_server_t *', 'name' => 'apr_memcache_find_server_hash_default', 'args' => [ { 'type' => 'void *', 'name' => 'baton' }, { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const apr_uint32_t', 'name' => 'hash' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_getp', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char*', 'name' => 'key' }, { 'type' => 'char **', 'name' => 'baton' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_uint16_t *', 'name' => 'flags' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_memcache_hash', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'const apr_size_t', 'name' => 'data_len' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_memcache_hash_crc32', 'args' => [ { 'type' => 'void *', 'name' => 'baton' }, { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'const apr_size_t', 'name' => 'data_len' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_memcache_hash_default', 'args' => [ { 'type' => 'void *', 'name' => 'baton' }, { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'const apr_size_t', 'name' => 'data_len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_incr', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_int32_t', 'name' => 'n' }, { 'type' => 'apr_uint32_t *', 'name' => 'nv' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_multgetp', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'apr_pool_t *', 'name' => 'data_pool' }, { 'type' => 'apr_hash_t *', 'name' => 'values' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_replace', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'char *', 'name' => 'baton' }, { 'type' => 'const apr_size_t', 'name' => 'data_size' }, { 'type' => 'apr_uint32_t', 'name' => 'timeout' }, { 'type' => 'apr_uint16_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_server_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'host' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_uint32_t', 'name' => 'min' }, { 'type' => 'apr_uint32_t', 'name' => 'smax' }, { 'type' => 'apr_uint32_t', 'name' => 'max' }, { 'type' => 'apr_uint32_t', 'name' => 'ttl' }, { 'type' => 'apr_memcache_server_t **', 'name' => 'ns' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_set', 'args' => [ { 'type' => 'apr_memcache_t *', 'name' => 'mc' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'char *', 'name' => 'baton' }, { 'type' => 'const apr_size_t', 'name' => 'data_size' }, { 'type' => 'apr_uint32_t', 'name' => 'timeout' }, { 'type' => 'apr_uint16_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_stats', 'args' => [ { 'type' => 'apr_memcache_server_t *', 'name' => 'ms' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_memcache_stats_t **', 'name' => 'stats' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_memcache_version', 'args' => [ { 'type' => 'apr_memcache_server_t *', 'name' => 'ms' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char **', 'name' => 'baton' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_create', 'args' => [ { 'type' => 'apr_mmap_t **', 'name' => 'newmmap' }, { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'apr_int32_t', 'name' => 'flag' }, { 'type' => 'apr_pool_t *', 'name' => 'cntxt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_delete', 'args' => [ { 'type' => 'apr_mmap_t *', 'name' => 'mm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_dup', 'args' => [ { 'type' => 'apr_mmap_t **', 'name' => 'new_mmap' }, { 'type' => 'apr_mmap_t *', 'name' => 'old_mmap' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_mmap_offset', 'args' => [ { 'type' => 'void **', 'name' => 'addr' }, { 'type' => 'apr_mmap_t *', 'name' => 'mm' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'char *', 'name' => 'apr_off_t_toa', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_off_t', 'name' => 'n' } ] }, { 'return_type' => 'void', 'name' => 'apr_optional_hook_add', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'void (*pfn)(void)', 'name' => 'arg1' }, { 'type' => 'const char * const *', 'name' => 'aszPre' }, { 'type' => 'const char * const *', 'name' => 'aszSucc' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'apr_optional_hook_get', 'args' => [ { 'type' => 'const char *', 'name' => 'szName' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_os_default_encoding', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dir_get', 'args' => [ { 'type' => 'apr_os_dir_t **', 'name' => 'thedir' }, { 'type' => 'apr_dir_t *', 'name' => 'dir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dir_put', 'args' => [ { 'type' => 'apr_dir_t **', 'name' => 'dir' }, { 'type' => 'apr_os_dir_t *', 'name' => 'thedir' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dso_handle_get', 'args' => [ { 'type' => 'apr_os_dso_handle_t *', 'name' => 'dso' }, { 'type' => 'apr_dso_handle_t *', 'name' => 'aprdso' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_dso_handle_put', 'args' => [ { 'type' => 'apr_dso_handle_t **', 'name' => 'dso' }, { 'type' => 'apr_os_dso_handle_t', 'name' => 'thedso' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_exp_time_get', 'args' => [ { 'type' => 'apr_os_exp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_time_exp_t *', 'name' => 'aprtime' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_exp_time_put', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'aprtime' }, { 'type' => 'apr_os_exp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_file_get', 'args' => [ { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_file_put', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_global_mutex_get', 'args' => [ { 'type' => 'apr_os_global_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_global_mutex_t *', 'name' => 'pmutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_imp_time_get', 'args' => [ { 'type' => 'apr_os_imp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_time_t *', 'name' => 'aprtime' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_imp_time_put', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'aprtime' }, { 'type' => 'apr_os_imp_time_t **', 'name' => 'ostime' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'const char*', 'name' => 'apr_os_locale_encoding', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_pipe_put', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_pipe_put_ex', 'args' => [ { 'type' => 'apr_file_t **', 'name' => 'file' }, { 'type' => 'apr_os_file_t *', 'name' => 'thefile' }, { 'type' => 'int', 'name' => 'register_cleanup' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_proc_mutex_get', 'args' => [ { 'type' => 'apr_os_proc_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_proc_mutex_t *', 'name' => 'pmutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_proc_mutex_put', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'pmutex' }, { 'type' => 'apr_os_proc_mutex_t *', 'name' => 'ospmutex' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_shm_get', 'args' => [ { 'type' => 'apr_os_shm_t *', 'name' => 'osshm' }, { 'type' => 'apr_shm_t *', 'name' => 'shm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_shm_put', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'shm' }, { 'type' => 'apr_os_shm_t *', 'name' => 'osshm' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_get', 'args' => [ { 'type' => 'apr_os_sock_t *', 'name' => 'thesock' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_make', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'apr_sock' }, { 'type' => 'apr_os_sock_info_t *', 'name' => 'os_sock_info' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_sock_put', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'sock' }, { 'type' => 'apr_os_sock_t *', 'name' => 'thesock' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_os_thread_t', 'name' => 'apr_os_thread_current', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_os_thread_equal', 'args' => [ { 'type' => 'apr_os_thread_t', 'name' => 'tid1' }, { 'type' => 'apr_os_thread_t', 'name' => 'tid2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_thread_get', 'args' => [ { 'type' => 'apr_os_thread_t **', 'name' => 'thethd' }, { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_thread_put', 'args' => [ { 'type' => 'apr_thread_t **', 'name' => 'thd' }, { 'type' => 'apr_os_thread_t *', 'name' => 'thethd' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_threadkey_get', 'args' => [ { 'type' => 'apr_os_threadkey_t *', 'name' => 'thekey' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_threadkey_put', 'args' => [ { 'type' => 'apr_threadkey_t **', 'name' => 'key' }, { 'type' => 'apr_os_threadkey_t *', 'name' => 'thekey' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_os_uuid_get', 'args' => [ { 'type' => 'unsigned char *', 'name' => 'uuid_data' } ] }, { 'return_type' => 'void *', 'name' => 'apr_palloc', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' } ] }, { 'return_type' => 'void *', 'name' => 'apr_palloc_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_parse_addr_port', 'args' => [ { 'type' => 'char **', 'name' => 'addr' }, { 'type' => 'char **', 'name' => 'scope_id' }, { 'type' => 'apr_port_t *', 'name' => 'port' }, { 'type' => 'const char *', 'name' => 'str' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_password_get', 'args' => [ { 'type' => 'const char *', 'name' => 'prompt' }, { 'type' => 'char *', 'name' => 'pwbuf' }, { 'type' => 'apr_size_t *', 'name' => 'bufsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_password_validate', 'args' => [ { 'type' => 'const char *', 'name' => 'passwd' }, { 'type' => 'const char *', 'name' => 'hash' } ] }, { 'return_type' => 'void *', 'name' => 'apr_pcalloc_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'void *', 'name' => 'apr_pmemdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'm' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_poll', 'args' => [ { 'type' => 'apr_pollfd_t *', 'name' => 'aprset' }, { 'type' => 'apr_int32_t', 'name' => 'numsock' }, { 'type' => 'apr_int32_t *', 'name' => 'nsds' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_poll_method_defname', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollcb_add', 'args' => [ { 'type' => 'apr_pollcb_t *', 'name' => 'pollcb' }, { 'type' => 'apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollcb_create', 'args' => [ { 'type' => 'apr_pollcb_t **', 'name' => 'pollcb' }, { 'type' => 'apr_uint32_t', 'name' => 'size' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollcb_create_ex', 'args' => [ { 'type' => 'apr_pollcb_t **', 'name' => 'pollcb' }, { 'type' => 'apr_uint32_t', 'name' => 'size' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' }, { 'type' => 'apr_pollset_method_e', 'name' => 'method' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollcb_poll', 'args' => [ { 'type' => 'apr_pollcb_t *', 'name' => 'pollcb' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_pollcb_cb_t', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'baton' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollcb_remove', 'args' => [ { 'type' => 'apr_pollcb_t *', 'name' => 'pollcb' }, { 'type' => 'apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_add', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'const apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_create', 'args' => [ { 'type' => 'apr_pollset_t **', 'name' => 'pollset' }, { 'type' => 'apr_uint32_t', 'name' => 'size' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_create_ex', 'args' => [ { 'type' => 'apr_pollset_t **', 'name' => 'pollset' }, { 'type' => 'apr_uint32_t', 'name' => 'size' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' }, { 'type' => 'apr_pollset_method_e', 'name' => 'method' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_destroy', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_pollset_method_name', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_poll', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_int32_t *', 'name' => 'num' }, { 'type' => 'const apr_pollfd_t **', 'name' => 'descriptors' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_remove', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' }, { 'type' => 'const apr_pollfd_t *', 'name' => 'descriptor' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pollset_wakeup', 'args' => [ { 'type' => 'apr_pollset_t *', 'name' => 'pollset' } ] }, { 'return_type' => 'apr_abortfunc_t', 'name' => 'apr_pool_abort_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_abort_set', 'args' => [ { 'type' => 'apr_abortfunc_t', 'name' => 'abortfunc' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_allocator_t *', 'name' => 'apr_pool_allocator_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_child_cleanup_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*plain_cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_status_t (*child_cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_for_exec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_kill', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_cleanup_null', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_cleanup_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*plain_cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_status_t (*child_cleanup)(void *)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_cleanup_run', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_clear', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_clear_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_core_ex', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_core_ex_debug', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_ex', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_pool_t *', 'name' => 'parent' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_ex_debug', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_pool_t *', 'name' => 'parent' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_unmanaged_ex', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_create_unmanaged_ex_debug', 'args' => [ { 'type' => 'apr_pool_t **', 'name' => 'newpool' }, { 'type' => 'apr_abortfunc_t', 'name' => 'abort_fn' }, { 'type' => 'apr_allocator_t *', 'name' => 'allocator' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_destroy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_destroy_debug', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file_line' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_initialize', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_pool_is_ancestor', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'apr_pool_t *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_note_subprocess', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'a' }, { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'apr_kill_conditions_e', 'name' => 'how' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_pool_parent_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_pre_cleanup_register', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'apr_status_t (*plain_cleanup)(void *)', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_tag', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'tag' } ] }, { 'return_type' => 'void', 'name' => 'apr_pool_terminate', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_set', 'args' => [ { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_pool_userdata_setn', 'args' => [ { 'type' => 'const void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void *)', 'name' => 'arg2' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_create', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'new_proc' }, { 'type' => 'const char *', 'name' => 'progname' }, { 'type' => 'const char * const *', 'name' => 'args' }, { 'type' => 'const char * const *', 'name' => 'env' }, { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_detach', 'args' => [ { 'type' => 'int', 'name' => 'daemonize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_fork', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_kill', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int', 'name' => 'sig' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_child_init', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_create', 'args' => [ { 'type' => 'apr_proc_mutex_t **', 'name' => 'mutex' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_lockmech_e', 'name' => 'mech' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_defname', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_destroy', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_lock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_lockfile', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_proc_mutex_name', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_proc_mutex_pool_get', 'args' => [ { 'type' => 'const apr_proc_mutex_t *', 'name' => 'theproc_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_trylock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_mutex_unlock', 'args' => [ { 'type' => 'apr_proc_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_other_child_alert', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int', 'name' => 'reason' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_refresh', 'args' => [ { 'type' => 'apr_other_child_rec_t *', 'name' => 'ocr' }, { 'type' => 'int', 'name' => 'reason' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_refresh_all', 'args' => [ { 'type' => 'int', 'name' => 'reason' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_register', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'void (*maintenance) (int reason, void *, int status)', 'name' => 'arg1' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_file_t *', 'name' => 'write_fd' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_proc_other_child_unregister', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_wait', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_exit_why_e *', 'name' => 'exitwhy' }, { 'type' => 'apr_wait_how_e', 'name' => 'waithow' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_proc_wait_all_procs', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' }, { 'type' => 'int *', 'name' => 'exitcode' }, { 'type' => 'apr_exit_why_e *', 'name' => 'exitwhy' }, { 'type' => 'apr_wait_how_e', 'name' => 'waithow' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_addrspace_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'addrspace' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_err_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_err' }, { 'type' => 'apr_file_t *', 'name' => 'parent_err' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_errfn_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_child_errfn_t *', 'name' => 'errfn' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_in_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_in' }, { 'type' => 'apr_file_t *', 'name' => 'parent_in' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_child_out_set', 'args' => [ { 'type' => 'struct apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_file_t *', 'name' => 'child_out' }, { 'type' => 'apr_file_t *', 'name' => 'parent_out' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_cmdtype_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_cmdtype_e', 'name' => 'cmd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_create', 'args' => [ { 'type' => 'apr_procattr_t **', 'name' => 'new_attr' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_detach_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'detach' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_dir_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'const char *', 'name' => 'dir' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_error_check_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'chk' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_group_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'const char *', 'name' => 'groupname' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_io_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'in' }, { 'type' => 'apr_int32_t', 'name' => 'out' }, { 'type' => 'apr_int32_t', 'name' => 'err' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_limit_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'what' }, { 'type' => 'struct rlimit *', 'name' => 'limit' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_procattr_user_set', 'args' => [ { 'type' => 'apr_procattr_t *', 'name' => 'attr' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'const char *', 'name' => 'password' } ] }, { 'return_type' => 'char *', 'name' => 'apr_psprintf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrcat', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => '...', 'name' => 'arg1' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrcatv', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_size_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'nbytes' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrmemdup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pstrndup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'apr_size_t', 'name' => 'n' } ] }, { 'return_type' => 'char *', 'name' => 'apr_pvsprintf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_create', 'args' => [ { 'type' => 'apr_queue_t **', 'name' => 'queue' }, { 'type' => 'unsigned int', 'name' => 'queue_capacity' }, { 'type' => 'apr_pool_t *', 'name' => 'a' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_interrupt_all', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_pop', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_push', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'unsigned int', 'name' => 'apr_queue_size', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_term', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_trypop', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_queue_trypush', 'args' => [ { 'type' => 'apr_queue_t *', 'name' => 'queue' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'apr_random_add_entropy', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'g' }, { 'type' => 'const void *', 'name' => 'entropy_' }, { 'type' => 'apr_size_t', 'name' => 'bytes' } ] }, { 'return_type' => 'void', 'name' => 'apr_random_after_fork', 'args' => [ { 'type' => 'apr_proc_t *', 'name' => 'proc' } ] }, { 'return_type' => 'void', 'name' => 'apr_random_barrier', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'g' } ] }, { 'return_type' => 'void', 'name' => 'apr_random_init', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'g' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_crypto_hash_t *', 'name' => 'pool_hash' }, { 'type' => 'apr_crypto_hash_t *', 'name' => 'key_hash' }, { 'type' => 'apr_crypto_hash_t *', 'name' => 'prng_hash' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_random_insecure_bytes', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'g' }, { 'type' => 'void *', 'name' => 'random' }, { 'type' => 'apr_size_t', 'name' => 'bytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_random_insecure_ready', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_random_secure_bytes', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'g' }, { 'type' => 'void *', 'name' => 'random' }, { 'type' => 'apr_size_t', 'name' => 'bytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_random_secure_ready', 'args' => [ { 'type' => 'apr_random_t *', 'name' => 'r' } ] }, { 'return_type' => 'apr_random_t *', 'name' => 'apr_random_standard_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_acquire', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'void **', 'name' => 'resource' } ] }, { 'return_type' => 'apr_uint32_t', 'name' => 'apr_reslist_acquired_count', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' } ] }, { 'return_type' => 'void', 'name' => 'apr_reslist_cleanup_order_set', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'apr_uint32_t', 'name' => 'mode' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_create', 'args' => [ { 'type' => 'apr_reslist_t **', 'name' => 'reslist' }, { 'type' => 'int', 'name' => 'min' }, { 'type' => 'int', 'name' => 'smax' }, { 'type' => 'int', 'name' => 'hmax' }, { 'type' => 'apr_interval_time_t', 'name' => 'ttl' }, { 'type' => 'apr_reslist_constructor', 'name' => 'con' }, { 'type' => 'apr_reslist_destructor', 'name' => 'de' }, { 'type' => 'void *', 'name' => 'params' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_destroy', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_invalidate', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'void *', 'name' => 'resource' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_maintain', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_reslist_release', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'void *', 'name' => 'resource' } ] }, { 'return_type' => 'void', 'name' => 'apr_reslist_timeout_set', 'args' => [ { 'type' => 'apr_reslist_t *', 'name' => 'reslist' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rfc822_date', 'args' => [ { 'type' => 'char *', 'name' => 'date_str' }, { 'type' => 'apr_time_t', 'name' => 't' } ] }, { 'return_type' => 'void *', 'name' => 'apr_rmm_addr_get', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'apr_rmm_off_t', 'name' => 'entity' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rmm_attach', 'args' => [ { 'type' => 'apr_rmm_t **', 'name' => 'rmm' }, { 'type' => 'apr_anylock_t *', 'name' => 'lock' }, { 'type' => 'void *', 'name' => 'membuf' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_rmm_off_t', 'name' => 'apr_rmm_calloc', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'apr_size_t', 'name' => 'reqsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rmm_destroy', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rmm_detach', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rmm_free', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'apr_rmm_off_t', 'name' => 'entity' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_rmm_init', 'args' => [ { 'type' => 'apr_rmm_t **', 'name' => 'rmm' }, { 'type' => 'apr_anylock_t *', 'name' => 'lock' }, { 'type' => 'void *', 'name' => 'membuf' }, { 'type' => 'apr_size_t', 'name' => 'memsize' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_rmm_off_t', 'name' => 'apr_rmm_malloc', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'apr_size_t', 'name' => 'reqsize' } ] }, { 'return_type' => 'apr_rmm_off_t', 'name' => 'apr_rmm_offset_get', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'void *', 'name' => 'entity' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_rmm_overhead_get', 'args' => [ { 'type' => 'int', 'name' => 'n' } ] }, { 'return_type' => 'apr_rmm_off_t', 'name' => 'apr_rmm_realloc', 'args' => [ { 'type' => 'apr_rmm_t *', 'name' => 'rmm' }, { 'type' => 'void *', 'name' => 'entity' }, { 'type' => 'apr_size_t', 'name' => 'reqsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_close', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_delete', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'const apr_sdbm_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_fetch', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'value' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_firstkey', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_lock', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_nextkey', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_open', 'args' => [ { 'type' => 'apr_sdbm_t **', 'name' => 'db' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_int32_t', 'name' => 'mode' }, { 'type' => 'apr_fileperms_t', 'name' => 'perms' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'apr_sdbm_rdonly', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_store', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'key' }, { 'type' => 'apr_sdbm_datum_t', 'name' => 'value' }, { 'type' => 'int', 'name' => 'opt' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sdbm_unlock', 'args' => [ { 'type' => 'apr_sdbm_t *', 'name' => 'db' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_setup_signal_thread', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_sha1_base64', 'args' => [ { 'type' => 'const char *', 'name' => 'clear' }, { 'type' => 'int', 'name' => 'len' }, { 'type' => 'char *', 'name' => 'out' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_final', 'args' => [ { 'type' => 'unsigned char', 'name' => 'digest' }, { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_init', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_update', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' }, { 'type' => 'const char *', 'name' => 'input' }, { 'type' => 'unsigned int', 'name' => 'inputLen' } ] }, { 'return_type' => 'void', 'name' => 'apr_sha1_update_binary', 'args' => [ { 'type' => 'apr_sha1_ctx_t *', 'name' => 'context' }, { 'type' => 'const unsigned char *', 'name' => 'input' }, { 'type' => 'unsigned int', 'name' => 'inputLen' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_attach', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'm' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'void *', 'name' => 'apr_shm_baseaddr_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_create', 'args' => [ { 'type' => 'apr_shm_t **', 'name' => 'm' }, { 'type' => 'apr_size_t', 'name' => 'reqsize' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_destroy', 'args' => [ { 'type' => 'apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_detach', 'args' => [ { 'type' => 'apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_shm_pool_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'theshm' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_shm_remove', 'args' => [ { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_shm_size_get', 'args' => [ { 'type' => 'const apr_shm_t *', 'name' => 'm' } ] }, { 'return_type' => 'apr_sigfunc_t *', 'name' => 'apr_signal', 'args' => [ { 'type' => 'int', 'name' => 'signo' }, { 'type' => 'apr_sigfunc_t *', 'name' => 'func' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_signal_block', 'args' => [ { 'type' => 'int', 'name' => 'signum' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_signal_description_get', 'args' => [ { 'type' => 'int', 'name' => 'signum' } ] }, { 'return_type' => 'void', 'name' => 'apr_signal_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pglobal' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_signal_thread', 'args' => [ { 'type' => 'int(*signal_handler)(int signum)', 'name' => 'arg0' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_signal_unblock', 'args' => [ { 'type' => 'int', 'name' => 'signum' } ] }, { 'return_type' => 'void', 'name' => 'apr_sleep', 'args' => [ { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_snprintf', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'int', 'name' => 'apr_sockaddr_equal', 'args' => [ { 'type' => 'const apr_sockaddr_t *', 'name' => 'addr1' }, { 'type' => 'const apr_sockaddr_t *', 'name' => 'addr2' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_info_get', 'args' => [ { 'type' => 'apr_sockaddr_t **', 'name' => 'sa' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_int32_t', 'name' => 'family' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_ip_get', 'args' => [ { 'type' => 'char **', 'name' => 'addr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_sockaddr_ip_getbuf', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'buflen' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_accept', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_pool_t *', 'name' => 'connection_pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_addr_get', 'args' => [ { 'type' => 'apr_sockaddr_t **', 'name' => 'sa' }, { 'type' => 'apr_interface_e', 'name' => 'which' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_atmark', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'atmark' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_atreadeof', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'atreadeof' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_bind', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_close', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_connect', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sa' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_create', 'args' => [ { 'type' => 'apr_socket_t **', 'name' => 'new_sock' }, { 'type' => 'int', 'name' => 'family' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int', 'name' => 'protocol' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_data_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup)(void*)', 'name' => 'arg3' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_inherit_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_inherit_unset', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_listen', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'backlog' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_opt_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t *', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_opt_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t', 'name' => 'on' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_socket_pool_get', 'args' => [ { 'type' => 'const apr_socket_t *', 'name' => 'thesocket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_protocol_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'protocol' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_recv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_recvfrom', 'args' => [ { 'type' => 'apr_sockaddr_t *', 'name' => 'from' }, { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_send', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendfile', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_file_t *', 'name' => 'file' }, { 'type' => 'apr_hdtr_t *', 'name' => 'hdtr' }, { 'type' => 'apr_off_t *', 'name' => 'offset' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'apr_int32_t', 'name' => 'flags' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendto', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'where' }, { 'type' => 'apr_int32_t', 'name' => 'flags' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_sendv', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'const struct iovec *', 'name' => 'vec' }, { 'type' => 'apr_int32_t', 'name' => 'nvec' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_shutdown', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'thesocket' }, { 'type' => 'apr_shutdown_how_e', 'name' => 'how' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_timeout_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_interval_time_t *', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_timeout_set', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_socket_type_get', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'sock' }, { 'type' => 'int *', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_stat', 'args' => [ { 'type' => 'apr_finfo_t *', 'name' => 'finfo' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strerror', 'args' => [ { 'type' => 'apr_status_t', 'name' => 'statcode' }, { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'bufsize' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strfsize', 'args' => [ { 'type' => 'apr_off_t', 'name' => 'size' }, { 'type' => 'char *', 'name' => 'buf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_strftime', 'args' => [ { 'type' => 'char *', 'name' => 's' }, { 'type' => 'apr_size_t *', 'name' => 'retsize' }, { 'type' => 'apr_size_t', 'name' => 'max' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => 'apr_time_exp_t *', 'name' => 'tm' } ] }, { 'return_type' => 'const apr_strmatch_pattern *', 'name' => 'apr_strmatch_precompile', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'case_sensitive' } ] }, { 'return_type' => 'int', 'name' => 'apr_strnatcasecmp', 'args' => [ { 'type' => 'char const *', 'name' => 'a' }, { 'type' => 'char const *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'apr_strnatcmp', 'args' => [ { 'type' => 'char const *', 'name' => 'a' }, { 'type' => 'char const *', 'name' => 'b' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_strtoff', 'args' => [ { 'type' => 'apr_off_t *', 'name' => 'offset' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'char **', 'name' => 'end' }, { 'type' => 'int', 'name' => 'base' } ] }, { 'return_type' => 'apr_int64_t', 'name' => 'apr_strtoi64', 'args' => [ { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'char **', 'name' => 'end' }, { 'type' => 'int', 'name' => 'base' } ] }, { 'return_type' => 'char *', 'name' => 'apr_strtok', 'args' => [ { 'type' => 'char *', 'name' => 'str' }, { 'type' => 'const char *', 'name' => 'sep' }, { 'type' => 'char **', 'name' => 'last' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_add', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_addn', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_clear', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_clone', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_compress', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_copy', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'int', 'name' => 'apr_table_do', 'args' => [ { 'type' => 'void *comp', 'name' => 'arg0' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => '...', 'name' => 'arg3' } ] }, { 'return_type' => 'const apr_array_header_t *', 'name' => 'apr_table_elts', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_table_get', 'args' => [ { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_make', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_merge', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_mergen', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_overlap', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 'a' }, { 'type' => 'const apr_table_t *', 'name' => 'b' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_table_t *', 'name' => 'apr_table_overlay', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_table_t *', 'name' => 'overlay' }, { 'type' => 'const apr_table_t *', 'name' => 'base' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_set', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_setn', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'apr_table_unset', 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'int', 'name' => 'apr_table_vdo', 'args' => [ { 'type' => 'void *comp', 'name' => 'arg0' }, { 'type' => 'void *', 'name' => 'rec' }, { 'type' => 'const apr_table_t *', 'name' => 't' }, { 'type' => 'va_list', 'name' => 'vp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_temp_dir_get', 'args' => [ { 'type' => 'const char **', 'name' => 'temp_dir' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'apr_terminate', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_terminate2', 'args' => [] }, { 'return_type' => 'void', 'name' => 'apr_text_append', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_text_header *', 'name' => 'hdr' }, { 'type' => 'const char *', 'name' => 'text' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_broadcast', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_create', 'args' => [ { 'type' => 'apr_thread_cond_t **', 'name' => 'cond' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_destroy', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_cond_pool_get', 'args' => [ { 'type' => 'const apr_thread_cond_t *', 'name' => 'thethread_cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_signal', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_timedwait', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_cond_wait', 'args' => [ { 'type' => 'apr_thread_cond_t *', 'name' => 'cond' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_create', 'args' => [ { 'type' => 'apr_thread_t **', 'name' => 'new_thread' }, { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_thread_start_t', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_thread_t *', 'name' => 'thread' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_data_set', 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup) (void *)', 'name' => 'arg2' }, { 'type' => 'apr_thread_t *', 'name' => 'thread' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_detach', 'args' => [ { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_exit', 'args' => [ { 'type' => 'apr_thread_t *', 'name' => 'thd' }, { 'type' => 'apr_status_t', 'name' => 'retval' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_join', 'args' => [ { 'type' => 'apr_status_t *', 'name' => 'retval' }, { 'type' => 'apr_thread_t *', 'name' => 'thd' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_create', 'args' => [ { 'type' => 'apr_thread_mutex_t **', 'name' => 'mutex' }, { 'type' => 'unsigned int', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_destroy', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_lock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_mutex_pool_get', 'args' => [ { 'type' => 'const apr_thread_mutex_t *', 'name' => 'thethread_mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_trylock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_mutex_unlock', 'args' => [ { 'type' => 'apr_thread_mutex_t *', 'name' => 'mutex' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_once', 'args' => [ { 'type' => 'apr_thread_once_t *', 'name' => 'control' }, { 'type' => 'void (*func)(void)', 'name' => 'arg1' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_once_init', 'args' => [ { 'type' => 'apr_thread_once_t **', 'name' => 'control' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_busy_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_create', 'args' => [ { 'type' => 'apr_thread_pool_t **', 'name' => 'me' }, { 'type' => 'apr_size_t', 'name' => 'init_threads' }, { 'type' => 'apr_size_t', 'name' => 'max_threads' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_destroy', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_pool_get', 'args' => [ { 'type' => 'const apr_thread_t *', 'name' => 'thethread' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_idle_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_idle_max_get', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_idle_max_set', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_size_t', 'name' => 'cnt' } ] }, { 'return_type' => 'apr_interval_time_t', 'name' => 'apr_thread_pool_idle_wait_get', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_interval_time_t', 'name' => 'apr_thread_pool_idle_wait_set', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_push', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_thread_start_t', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'apr_byte_t', 'name' => 'priority' }, { 'type' => 'void *', 'name' => 'owner' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_schedule', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_thread_start_t', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'apr_interval_time_t', 'name' => 'time' }, { 'type' => 'void *', 'name' => 'owner' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_scheduled_tasks_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_task_owner_get', 'args' => [ { 'type' => 'apr_thread_t *', 'name' => 'thd' }, { 'type' => 'void **', 'name' => 'owner' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_tasks_cancel', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'void *', 'name' => 'owner' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_tasks_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_tasks_high_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_tasks_run_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_thread_max_get', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_thread_max_set', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_size_t', 'name' => 'cnt' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_threads_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_threads_high_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_threads_idle_timeout_count', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_threshold_get', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'apr_thread_pool_threshold_set', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_size_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_pool_top', 'args' => [ { 'type' => 'apr_thread_pool_t *', 'name' => 'me' }, { 'type' => 'apr_thread_start_t', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'apr_byte_t', 'name' => 'priority' }, { 'type' => 'void *', 'name' => 'owner' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_create', 'args' => [ { 'type' => 'apr_thread_rwlock_t **', 'name' => 'rwlock' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_destroy', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'apr_thread_rwlock_pool_get', 'args' => [ { 'type' => 'const apr_thread_rwlock_t *', 'name' => 'thethread_rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_rdlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_tryrdlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_trywrlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_unlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_thread_rwlock_wrlock', 'args' => [ { 'type' => 'apr_thread_rwlock_t *', 'name' => 'rwlock' } ] }, { 'return_type' => 'void', 'name' => 'apr_thread_yield', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_create', 'args' => [ { 'type' => 'apr_threadattr_t **', 'name' => 'new_attr' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_detach_get', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_detach_set', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_int32_t', 'name' => 'on' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_guardsize_set', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_size_t', 'name' => 'guardsize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadattr_stacksize_set', 'args' => [ { 'type' => 'apr_threadattr_t *', 'name' => 'attr' }, { 'type' => 'apr_size_t', 'name' => 'stacksize' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_data_get', 'args' => [ { 'type' => 'void **', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_threadkey_t *', 'name' => 'threadkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_data_set', 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_status_t (*cleanup) (void *)', 'name' => 'arg2' }, { 'type' => 'apr_threadkey_t *', 'name' => 'threadkey' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_create', 'args' => [ { 'type' => 'apr_threadkey_t **', 'name' => 'key' }, { 'type' => 'void (*dest)(void *)', 'name' => 'arg1' }, { 'type' => 'apr_pool_t *', 'name' => 'cont' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_delete', 'args' => [ { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_get', 'args' => [ { 'type' => 'void **', 'name' => 'new_mem' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_threadkey_private_set', 'args' => [ { 'type' => 'void *', 'name' => 'priv' }, { 'type' => 'apr_threadkey_t *', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_ansi_put', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'time_t', 'name' => 'input' } ] }, { 'return_type' => 'void', 'name' => 'apr_time_clock_hires', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_get', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'apr_time_exp_t *', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_gmt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_gmt_get', 'args' => [ { 'type' => 'apr_time_t *', 'name' => 'result' }, { 'type' => 'apr_time_exp_t *', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_lt', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_time_exp_tz', 'args' => [ { 'type' => 'apr_time_exp_t *', 'name' => 'result' }, { 'type' => 'apr_time_t', 'name' => 'input' }, { 'type' => 'apr_int32_t', 'name' => 'offs' } ] }, { 'return_type' => 'apr_time_t', 'name' => 'apr_time_now', 'args' => [] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_tokenize_to_argv', 'args' => [ { 'type' => 'const char *', 'name' => 'arg_str' }, { 'type' => 'char ***', 'name' => 'argv_out' }, { 'type' => 'apr_pool_t *', 'name' => 'token_context' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_current', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_get', 'args' => [ { 'type' => 'apr_uid_t *', 'name' => 'userid' }, { 'type' => 'apr_gid_t *', 'name' => 'groupid' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_homepath_get', 'args' => [ { 'type' => 'char **', 'name' => 'dirname' }, { 'type' => 'const char *', 'name' => 'username' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uid_name_get', 'args' => [ { 'type' => 'char **', 'name' => 'username' }, { 'type' => 'apr_uid_t', 'name' => 'userid' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uri_parse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'uri' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uri_parse_hostinfo', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'hostinfo' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' } ] }, { 'return_type' => 'apr_port_t', 'name' => 'apr_uri_port_of_scheme', 'args' => [ { 'type' => 'const char *', 'name' => 'scheme_str' } ] }, { 'return_type' => 'char *', 'name' => 'apr_uri_unparse', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_uri_t *', 'name' => 'uptr' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'void', 'name' => 'apr_uuid_format', 'args' => [ { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'const apr_uuid_t *', 'name' => 'uuid' } ] }, { 'return_type' => 'void', 'name' => 'apr_uuid_get', 'args' => [ { 'type' => 'apr_uuid_t *', 'name' => 'uuid' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_uuid_parse', 'args' => [ { 'type' => 'apr_uuid_t *', 'name' => 'uuid' }, { 'type' => 'const char *', 'name' => 'uuid_str' } ] }, { 'return_type' => 'void', 'name' => 'apr_version', 'args' => [ { 'type' => 'apr_version_t *', 'name' => 'pvsn' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_version_string', 'args' => [] }, { 'return_type' => 'int', 'name' => 'apr_vformatter', 'args' => [ { 'type' => 'int (*flush_func)(apr_vformatter_buff_t *b)', 'name' => 'arg0' }, { 'type' => 'apr_vformatter_buff_t *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'int', 'name' => 'apr_vsnprintf', 'args' => [ { 'type' => 'char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'const char *', 'name' => 'format' }, { 'type' => 'va_list', 'name' => 'ap' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_wait_for_io_or_timeout', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'apr_socket_t *', 'name' => 's' }, { 'type' => 'int', 'name' => 'for_read' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_close', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_conv_buffer', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'const char *', 'name' => 'inbuf' }, { 'type' => 'apr_size_t *', 'name' => 'inbytes_left' }, { 'type' => 'char *', 'name' => 'outbuf' }, { 'type' => 'apr_size_t *', 'name' => 'outbytes_left' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'apr_xlate_conv_byte', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'unsigned char', 'name' => 'inchar' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_open', 'args' => [ { 'type' => 'apr_xlate_t **', 'name' => 'convset' }, { 'type' => 'const char *', 'name' => 'topage' }, { 'type' => 'const char *', 'name' => 'frompage' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xlate_sb_get', 'args' => [ { 'type' => 'apr_xlate_t *', 'name' => 'convset' }, { 'type' => 'int *', 'name' => 'onoff' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_xml_empty_elem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_xml_elem *', 'name' => 'elem' } ] }, { 'return_type' => 'int', 'name' => 'apr_xml_insert_uri', 'args' => [ { 'type' => 'apr_array_header_t *', 'name' => 'uri_array' }, { 'type' => 'const char *', 'name' => 'uri' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parse_file', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_xml_parser **', 'name' => 'parser' }, { 'type' => 'apr_xml_doc **', 'name' => 'ppdoc' }, { 'type' => 'apr_file_t *', 'name' => 'xmlfd' }, { 'type' => 'apr_size_t', 'name' => 'buffer_length' } ] }, { 'return_type' => 'apr_xml_parser *', 'name' => 'apr_xml_parser_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parser_done', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'apr_xml_doc **', 'name' => 'pdoc' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'apr_xml_parser_feed', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'const char *', 'name' => 'data' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'char *', 'name' => 'apr_xml_parser_geterror', 'args' => [ { 'type' => 'apr_xml_parser *', 'name' => 'parser' }, { 'type' => 'char *', 'name' => 'errbuf' }, { 'type' => 'apr_size_t', 'name' => 'errbufsize' } ] }, { 'return_type' => 'void', 'name' => 'apr_xml_quote_elem', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_xml_elem *', 'name' => 'elem' } ] }, { 'return_type' => 'const char *', 'name' => 'apr_xml_quote_string', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 's' }, { 'type' => 'int', 'name' => 'quotes' } ] }, { 'return_type' => 'void', 'name' => 'apr_xml_to_text', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const apr_xml_elem *', 'name' => 'elem' }, { 'type' => 'int', 'name' => 'style' }, { 'type' => 'apr_array_header_t *', 'name' => 'namespaces' }, { 'type' => 'int *', 'name' => 'ns_map' }, { 'type' => 'const char **', 'name' => 'pbuf' }, { 'type' => 'apr_size_t *', 'name' => 'psize' } ] } ]; 1; mod_perl-2.0.9/xs/tables/current24/Apache2/StructureTable.pm0000644000104000010010000030553012540623211024273 0ustar AdministratorsNonepackage Apache2::StructureTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache2::ParseSource/0.02 # ! Mon Jul 1 12:38:15 2013 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $Apache2::StructureTable = [ { 'type' => 'ap_HOOK_access_checker_ex_t', 'elts' => [] }, { 'type' => 'ap_HOOK_access_checker_t', 'elts' => [] }, { 'type' => 'ap_HOOK_auth_checker_t', 'elts' => [] }, { 'type' => 'ap_HOOK_check_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_check_user_id_t', 'elts' => [] }, { 'type' => 'ap_HOOK_child_init_t', 'elts' => [] }, { 'type' => 'ap_HOOK_child_status_t', 'elts' => [] }, { 'type' => 'ap_HOOK_create_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_create_request_t', 'elts' => [] }, { 'type' => 'ap_HOOK_default_port_t', 'elts' => [] }, { 'type' => 'ap_HOOK_drop_privileges_t', 'elts' => [] }, { 'type' => 'ap_HOOK_end_generation_t', 'elts' => [] }, { 'type' => 'ap_HOOK_error_log_t', 'elts' => [] }, { 'type' => 'ap_HOOK_expr_lookup_t', 'elts' => [] }, { 'type' => 'ap_HOOK_fixups_t', 'elts' => [] }, { 'type' => 'ap_HOOK_generate_log_id_t', 'elts' => [] }, { 'type' => 'ap_HOOK_get_mgmt_items_t', 'elts' => [] }, { 'type' => 'ap_HOOK_get_suexec_identity_t', 'elts' => [] }, { 'type' => 'ap_HOOK_handler_t', 'elts' => [] }, { 'type' => 'ap_HOOK_header_parser_t', 'elts' => [] }, { 'type' => 'ap_HOOK_http_scheme_t', 'elts' => [] }, { 'type' => 'ap_HOOK_insert_error_filter_t', 'elts' => [] }, { 'type' => 'ap_HOOK_insert_filter_t', 'elts' => [] }, { 'type' => 'ap_HOOK_insert_network_bucket_t', 'elts' => [] }, { 'type' => 'ap_HOOK_log_transaction_t', 'elts' => [] }, { 'type' => 'ap_HOOK_map_to_storage_t', 'elts' => [] }, { 'type' => 'ap_HOOK_monitor_t', 'elts' => [] }, { 'type' => 'ap_HOOK_mpm_get_name_t', 'elts' => [] }, { 'type' => 'ap_HOOK_mpm_query_t', 'elts' => [] }, { 'type' => 'ap_HOOK_mpm_register_timed_callback_t', 'elts' => [] }, { 'type' => 'ap_HOOK_mpm_t', 'elts' => [] }, { 'type' => 'ap_HOOK_note_auth_failure_t', 'elts' => [] }, { 'type' => 'ap_HOOK_open_logs_t', 'elts' => [] }, { 'type' => 'ap_HOOK_optional_fn_retrieve_t', 'elts' => [] }, { 'type' => 'ap_HOOK_post_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_post_read_request_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_mpm_t', 'elts' => [] }, { 'type' => 'ap_HOOK_pre_read_request_t', 'elts' => [] }, { 'type' => 'ap_HOOK_process_connection_t', 'elts' => [] }, { 'type' => 'ap_HOOK_quick_handler_t', 'elts' => [] }, { 'type' => 'ap_HOOK_session_decode_t', 'elts' => [] }, { 'type' => 'ap_HOOK_session_encode_t', 'elts' => [] }, { 'type' => 'ap_HOOK_session_load_t', 'elts' => [] }, { 'type' => 'ap_HOOK_session_save_t', 'elts' => [] }, { 'type' => 'ap_HOOK_status_hook_t', 'elts' => [] }, { 'type' => 'ap_HOOK_test_config_t', 'elts' => [] }, { 'type' => 'ap_HOOK_translate_name_t', 'elts' => [] }, { 'type' => 'ap_HOOK_type_checker_t', 'elts' => [] }, { 'type' => 'ap_HOOK_watchdog_exit_t', 'elts' => [] }, { 'type' => 'ap_HOOK_watchdog_init_t', 'elts' => [] }, { 'type' => 'ap_HOOK_watchdog_need_t', 'elts' => [] }, { 'type' => 'ap_HOOK_watchdog_step_t', 'elts' => [] }, { 'type' => 'ap_LINK_access_checker_ex_t', 'elts' => [ { 'type' => 'ap_HOOK_access_checker_ex_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_access_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_access_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_auth_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_auth_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_check_config_t', 'elts' => [ { 'type' => 'ap_HOOK_check_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_check_user_id_t', 'elts' => [ { 'type' => 'ap_HOOK_check_user_id_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_child_init_t', 'elts' => [ { 'type' => 'ap_HOOK_child_init_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_child_status_t', 'elts' => [ { 'type' => 'ap_HOOK_child_status_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_create_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_create_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_create_request_t', 'elts' => [ { 'type' => 'ap_HOOK_create_request_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_default_port_t', 'elts' => [ { 'type' => 'ap_HOOK_default_port_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_drop_privileges_t', 'elts' => [ { 'type' => 'ap_HOOK_drop_privileges_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_end_generation_t', 'elts' => [ { 'type' => 'ap_HOOK_end_generation_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_error_log_t', 'elts' => [ { 'type' => 'ap_HOOK_error_log_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_expr_lookup_t', 'elts' => [ { 'type' => 'ap_HOOK_expr_lookup_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_fixups_t', 'elts' => [ { 'type' => 'ap_HOOK_fixups_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_generate_log_id_t', 'elts' => [ { 'type' => 'ap_HOOK_generate_log_id_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_get_mgmt_items_t', 'elts' => [ { 'type' => 'ap_HOOK_get_mgmt_items_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_get_suexec_identity_t', 'elts' => [ { 'type' => 'ap_HOOK_get_suexec_identity_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_handler_t', 'elts' => [ { 'type' => 'ap_HOOK_handler_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_header_parser_t', 'elts' => [ { 'type' => 'ap_HOOK_header_parser_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_http_scheme_t', 'elts' => [ { 'type' => 'ap_HOOK_http_scheme_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_insert_error_filter_t', 'elts' => [ { 'type' => 'ap_HOOK_insert_error_filter_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_insert_filter_t', 'elts' => [ { 'type' => 'ap_HOOK_insert_filter_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_insert_network_bucket_t', 'elts' => [ { 'type' => 'ap_HOOK_insert_network_bucket_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_log_transaction_t', 'elts' => [ { 'type' => 'ap_HOOK_log_transaction_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_map_to_storage_t', 'elts' => [ { 'type' => 'ap_HOOK_map_to_storage_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_monitor_t', 'elts' => [ { 'type' => 'ap_HOOK_monitor_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_mpm_get_name_t', 'elts' => [ { 'type' => 'ap_HOOK_mpm_get_name_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_mpm_query_t', 'elts' => [ { 'type' => 'ap_HOOK_mpm_query_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_mpm_register_timed_callback_t', 'elts' => [ { 'type' => 'ap_HOOK_mpm_register_timed_callback_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_mpm_t', 'elts' => [ { 'type' => 'ap_HOOK_mpm_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_note_auth_failure_t', 'elts' => [ { 'type' => 'ap_HOOK_note_auth_failure_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_open_logs_t', 'elts' => [ { 'type' => 'ap_HOOK_open_logs_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_optional_fn_retrieve_t', 'elts' => [ { 'type' => 'ap_HOOK_optional_fn_retrieve_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_post_config_t', 'elts' => [ { 'type' => 'ap_HOOK_post_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_post_read_request_t', 'elts' => [ { 'type' => 'ap_HOOK_post_read_request_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_config_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_mpm_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_mpm_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_pre_read_request_t', 'elts' => [ { 'type' => 'ap_HOOK_pre_read_request_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_process_connection_t', 'elts' => [ { 'type' => 'ap_HOOK_process_connection_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_quick_handler_t', 'elts' => [ { 'type' => 'ap_HOOK_quick_handler_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_session_decode_t', 'elts' => [ { 'type' => 'ap_HOOK_session_decode_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_session_encode_t', 'elts' => [ { 'type' => 'ap_HOOK_session_encode_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_session_load_t', 'elts' => [ { 'type' => 'ap_HOOK_session_load_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_session_save_t', 'elts' => [ { 'type' => 'ap_HOOK_session_save_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_status_hook_t', 'elts' => [ { 'type' => 'ap_HOOK_status_hook_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_test_config_t', 'elts' => [ { 'type' => 'ap_HOOK_test_config_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_translate_name_t', 'elts' => [ { 'type' => 'ap_HOOK_translate_name_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_type_checker_t', 'elts' => [ { 'type' => 'ap_HOOK_type_checker_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_watchdog_exit_t', 'elts' => [ { 'type' => 'ap_HOOK_watchdog_exit_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_watchdog_init_t', 'elts' => [ { 'type' => 'ap_HOOK_watchdog_init_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_watchdog_need_t', 'elts' => [ { 'type' => 'ap_HOOK_watchdog_need_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_LINK_watchdog_step_t', 'elts' => [ { 'type' => 'ap_HOOK_watchdog_step_t *', 'name' => 'pFunc' }, { 'type' => 'const char *', 'name' => 'szName' }, { 'type' => 'const char * const *', 'name' => 'aszPredecessors' }, { 'type' => 'const char * const *', 'name' => 'aszSuccessors' }, { 'type' => 'int', 'name' => 'nOrder' } ] }, { 'type' => 'ap_bucket_error', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'data' } ] }, { 'type' => 'ap_conf_vector_t', 'elts' => [] }, { 'type' => 'ap_configfile_t', 'elts' => [ { 'type' => 'apr_status_t(*) (char *ch, void *param)', 'name' => 'getch' }, { 'type' => 'apr_status_t(*) (void *buf, apr_size_t bufsiz, void *param)', 'name' => 'getstr' }, { 'type' => 'apr_status_t(*) (void *param)', 'name' => 'close' }, { 'type' => 'void *', 'name' => 'param' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'unsigned', 'name' => 'line_number' } ] }, { 'type' => 'ap_conn_keepalive_e', 'elts' => [] }, { 'type' => 'ap_cookie_do', 'elts' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'const char *', 'name' => 'encoded' }, { 'type' => 'apr_table_t *', 'name' => 'new_cookies' }, { 'type' => 'int', 'name' => 'duplicated' } ] }, { 'type' => 'ap_dbd_t', 'elts' => [ { 'type' => 'apr_dbd_t *', 'name' => 'handle' }, { 'type' => 'const apr_dbd_driver_t *', 'name' => 'driver' }, { 'type' => 'apr_hash_t *', 'name' => 'prepared' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' } ] }, { 'type' => 'ap_directive_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'directive' }, { 'type' => 'const char *', 'name' => 'args' }, { 'type' => 'ap_directive_t *', 'name' => 'next' }, { 'type' => 'ap_directive_t *', 'name' => 'first_child' }, { 'type' => 'ap_directive_t *', 'name' => 'parent' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'int', 'name' => 'line_num' }, { 'type' => 'ap_directive_t *', 'name' => 'last' } ] }, { 'type' => 'ap_errorlog_format_item', 'elts' => [ { 'type' => 'ap_errorlog_handler_fn_t *', 'name' => 'func' }, { 'type' => 'const char *', 'name' => 'arg' }, { 'type' => 'unsigned int', 'name' => 'flags' }, { 'type' => 'unsigned int', 'name' => 'min_loglevel' } ] }, { 'type' => 'ap_errorlog_handler', 'elts' => [ { 'type' => 'ap_errorlog_handler_fn_t *', 'name' => 'func' }, { 'type' => 'int', 'name' => 'flags' } ] }, { 'type' => 'ap_errorlog_handler_fn_t', 'elts' => [] }, { 'type' => 'ap_errorlog_info', 'elts' => [ { 'type' => 'const server_rec *', 'name' => 's' }, { 'type' => 'const conn_rec *', 'name' => 'c' }, { 'type' => 'const request_rec *', 'name' => 'r' }, { 'type' => 'const request_rec *', 'name' => 'rmain' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'file' }, { 'type' => 'int', 'name' => 'line' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'int', 'name' => 'using_syslog' }, { 'type' => 'int', 'name' => 'startup' }, { 'type' => 'const char *', 'name' => 'format' } ] }, { 'type' => 'ap_expr_eval_ctx_t', 'elts' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char **', 'name' => 'err' }, { 'type' => 'const ap_expr_info_t *', 'name' => 'info' }, { 'type' => 'ap_regmatch_t *', 'name' => 're_pmatch' }, { 'type' => 'apr_size_t', 'name' => 're_nmatch' }, { 'type' => 'const char **', 'name' => 're_source' }, { 'type' => 'const char **', 'name' => 'vary_this' }, { 'type' => 'const char **', 'name' => 'result_string' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'int', 'name' => 'reclvl' } ] }, { 'type' => 'ap_expr_info_t', 'elts' => [ { 'type' => 'ap_expr_t *', 'name' => 'root_node' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'unsigned int', 'name' => 'line_number' }, { 'type' => 'unsigned int', 'name' => 'flags' }, { 'type' => 'int', 'name' => 'module_index' } ] }, { 'type' => 'ap_expr_list_func_t', 'elts' => [] }, { 'type' => 'ap_expr_lookup_fn_t', 'elts' => [] }, { 'type' => 'ap_expr_lookup_parms', 'elts' => [ { 'type' => 'int', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'flags' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'const void **', 'name' => 'func' }, { 'type' => 'const void **', 'name' => 'data' }, { 'type' => 'const char **', 'name' => 'err' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'type' => 'ap_expr_op_binary_t', 'elts' => [] }, { 'type' => 'ap_expr_op_unary_t', 'elts' => [] }, { 'type' => 'ap_expr_string_func_t', 'elts' => [] }, { 'type' => 'ap_expr_t', 'elts' => [] }, { 'type' => 'ap_expr_var_func_t', 'elts' => [] }, { 'type' => 'ap_filter_func', 'elts' => [ { 'type' => 'ap_out_filter_func', 'name' => 'out_func' }, { 'type' => 'ap_in_filter_func', 'name' => 'in_func' } ] }, { 'type' => 'ap_filter_provider_t', 'elts' => [] }, { 'type' => 'ap_filter_rec_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_filter_func', 'name' => 'filter_func' }, { 'type' => 'ap_init_filter_func', 'name' => 'filter_init_func' }, { 'type' => 'ap_filter_rec_t *', 'name' => 'next' }, { 'type' => 'ap_filter_provider_t *', 'name' => 'providers' }, { 'type' => 'ap_filter_type', 'name' => 'ftype' }, { 'type' => 'int', 'name' => 'debug' }, { 'type' => 'unsigned int', 'name' => 'proto_flags' } ] }, { 'type' => 'ap_filter_t', 'elts' => [ { 'type' => 'ap_filter_rec_t *', 'name' => 'frec' }, { 'type' => 'void *', 'name' => 'ctx' }, { 'type' => 'ap_filter_t *', 'name' => 'next' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'type' => 'ap_filter_type', 'elts' => [] }, { 'type' => 'ap_form_pair_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'value' } ] }, { 'type' => 'ap_generation_t', 'elts' => [] }, { 'type' => 'ap_in_filter_func', 'elts' => [] }, { 'type' => 'ap_init_filter_func', 'elts' => [] }, { 'type' => 'ap_input_mode_t', 'elts' => [] }, { 'type' => 'ap_list_provider_groups_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_version' } ] }, { 'type' => 'ap_list_provider_names_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'provider_name' } ] }, { 'type' => 'ap_listen_rec', 'elts' => [ { 'type' => 'ap_listen_rec *', 'name' => 'next' }, { 'type' => 'apr_socket_t *', 'name' => 'sd' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'bind_addr' }, { 'type' => 'accept_function', 'name' => 'accept_func' }, { 'type' => 'int', 'name' => 'active' }, { 'type' => 'const char *', 'name' => 'protocol' }, { 'type' => 'ap_slave_t *', 'name' => 'slave' } ] }, { 'type' => 'ap_loadavg_t', 'elts' => [ { 'type' => 'float', 'name' => 'loadavg' }, { 'type' => 'float', 'name' => 'loadavg5' }, { 'type' => 'float', 'name' => 'loadavg15' } ] }, { 'type' => 'ap_method_list_t', 'elts' => [ { 'type' => 'apr_int64_t', 'name' => 'method_mask' }, { 'type' => 'apr_array_header_t *', 'name' => 'method_list' } ] }, { 'type' => 'ap_mgmt_item_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'description' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'ap_mgmt_type_e', 'name' => 'vtype' }, { 'type' => 'ap_mgmt_value', 'name' => 'v' } ] }, { 'type' => 'ap_mgmt_type_e', 'elts' => [] }, { 'type' => 'ap_mgmt_value', 'elts' => [ { 'type' => 'const char *', 'name' => 's_value' }, { 'type' => 'long', 'name' => 'i_value' }, { 'type' => 'apr_hash_t *', 'name' => 'h_value' } ] }, { 'type' => 'ap_module_symbol_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'module *', 'name' => 'modp' } ] }, { 'type' => 'ap_mpm_callback_fn_t', 'elts' => [] }, { 'type' => 'ap_out_filter_func', 'elts' => [] }, { 'type' => 'ap_pcw_dir_cb_t', 'elts' => [] }, { 'type' => 'ap_pcw_srv_cb_t', 'elts' => [] }, { 'type' => 'ap_pod_t', 'elts' => [ { 'type' => 'apr_file_t *', 'name' => 'pod_in' }, { 'type' => 'apr_file_t *', 'name' => 'pod_out' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'type' => 'ap_reclaim_callback_fn_t', 'elts' => [] }, { 'type' => 'ap_regex_t', 'elts' => [ { 'type' => 'void *', 'name' => 're_pcre' }, { 'type' => 'int', 'name' => 're_nsub' }, { 'type' => 'apr_size_t', 'name' => 're_erroffset' } ] }, { 'type' => 'ap_regmatch_t', 'elts' => [ { 'type' => 'int', 'name' => 'rm_so' }, { 'type' => 'int', 'name' => 'rm_eo' } ] }, { 'type' => 'ap_rxplus_t', 'elts' => [ { 'type' => 'ap_regex_t', 'name' => 'rx' }, { 'type' => 'apr_uint32_t', 'name' => 'flags' }, { 'type' => 'const char *', 'name' => 'subs' }, { 'type' => 'const char *', 'name' => 'match' }, { 'type' => 'apr_size_t', 'name' => 'nmatch' }, { 'type' => 'ap_regmatch_t *', 'name' => 'pmatch' } ] }, { 'type' => 'ap_sb_handle_t', 'elts' => [] }, { 'type' => 'ap_scoreboard_e', 'elts' => [] }, { 'type' => 'ap_slave_t', 'elts' => [] }, { 'type' => 'ap_sload_t', 'elts' => [ { 'type' => 'int', 'name' => 'idle' }, { 'type' => 'int', 'name' => 'busy' }, { 'type' => 'apr_off_t', 'name' => 'bytes_served' }, { 'type' => 'unsigned long', 'name' => 'access_count' } ] }, { 'type' => 'ap_slotmem_callback_fn_t', 'elts' => [] }, { 'type' => 'ap_slotmem_instance_t', 'elts' => [] }, { 'type' => 'ap_slotmem_provider_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, ap_slotmem_callback_fn_t *func, void *data, apr_pool_t *pool)', 'name' => 'doall' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t **inst, const char *name, apr_size_t item_size, unsigned int item_num, ap_slotmem_type_t type, apr_pool_t *pool)', 'name' => 'create' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t **inst, const char *name, apr_size_t *item_size, unsigned int *item_num, apr_pool_t *pool)', 'name' => 'attach' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, unsigned int item_id, void**mem)', 'name' => 'dptr' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, unsigned int item_id, unsigned char *dest, apr_size_t dest_len)', 'name' => 'get' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *slot, unsigned int item_id, unsigned char *src, apr_size_t src_len)', 'name' => 'put' }, { 'type' => 'unsigned int(*)(ap_slotmem_instance_t *s)', 'name' => 'num_slots' }, { 'type' => 'unsigned int(*)(ap_slotmem_instance_t *s)', 'name' => 'num_free_slots' }, { 'type' => 'apr_size_t(*)(ap_slotmem_instance_t *s)', 'name' => 'slot_size' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, unsigned int *item_id)', 'name' => 'grab' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, unsigned int item_id)', 'name' => 'release' }, { 'type' => 'apr_status_t(*)(ap_slotmem_instance_t *s, unsigned int item_id)', 'name' => 'fgrab' } ] }, { 'type' => 'ap_slotmem_type_t', 'elts' => [] }, { 'type' => 'ap_socache_instance_t', 'elts' => [] }, { 'type' => 'ap_socache_iterator_t', 'elts' => [] }, { 'type' => 'ap_unix_identity_t', 'elts' => [ { 'type' => 'uid_t', 'name' => 'uid' }, { 'type' => 'gid_t', 'name' => 'gid' }, { 'type' => 'int', 'name' => 'userdir' } ] }, { 'type' => 'ap_version_t', 'elts' => [ { 'type' => 'int', 'name' => 'major' }, { 'type' => 'int', 'name' => 'minor' }, { 'type' => 'int', 'name' => 'patch' }, { 'type' => 'const char *', 'name' => 'add_string' } ] }, { 'type' => 'ap_vhost_iterate_conn_cb', 'elts' => [] }, { 'type' => 'ap_watchdog_callback_fn_t', 'elts' => [] }, { 'type' => 'ap_watchdog_t', 'elts' => [] }, { 'type' => 'apr_OFN_access_compat_ap_satisfies_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_authn_cache_store_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_dbd_acquire_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_dbd_cacquire_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_dbd_close_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_dbd_open_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_dbd_prepare_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_find_loaded_module_symbol_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_ident_lookup_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_logio_add_bytes_in_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_logio_add_bytes_out_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_logio_get_last_bytes_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_register_rewrite_mapfunc_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_request_insert_filter_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_request_remove_filter_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_session_get_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_session_load_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_session_save_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_session_set_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_signal_server_t', 'elts' => [] }, { 'type' => 'apr_OFN_ap_watchdog_get_instance_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_watchdog_register_callback_t ', 'elts' => [] }, { 'type' => 'apr_OFN_ap_watchdog_set_callback_interval_t ', 'elts' => [] }, { 'type' => 'apr_OFN_authn_ap_auth_name_t', 'elts' => [] }, { 'type' => 'apr_OFN_authn_ap_auth_type_t', 'elts' => [] }, { 'type' => 'apr_OFN_authn_ap_list_provider_names_t ', 'elts' => [] }, { 'type' => 'apr_OFN_authz_ap_list_provider_names_t ', 'elts' => [] }, { 'type' => 'apr_OFN_authz_some_auth_required_t', 'elts' => [] }, { 'type' => 'apr_OFN_modperl_interp_unselect_t', 'elts' => [] }, { 'type' => 'apr_OFN_modperl_thx_interp_get_t', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_cache_check_subgroups_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_cache_checkuserid_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_cache_compare_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_cache_comparedn_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_cache_getuserdn_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_connection_close_t', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_connection_find_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_connection_open_t ', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_connection_unbind_t', 'elts' => [] }, { 'type' => 'apr_OFN_uldap_ssl_supported_t', 'elts' => [] }, { 'type' => 'apr_OFN_xml2enc_charset_t ', 'elts' => [] }, { 'type' => 'apr_OFN_xml2enc_filter_t ', 'elts' => [] }, { 'type' => 'apr_abortfunc_t', 'elts' => [] }, { 'type' => 'apr_allocator_t', 'elts' => [] }, { 'type' => 'apr_anylock_t', 'elts' => [ { 'type' => 'int', 'name' => 'type' }, { 'type' => 'union apr_anylock_u_t', 'name' => 'lock' } ] }, { 'type' => 'apr_array_header_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'int', 'name' => 'elt_size' }, { 'type' => 'int', 'name' => 'nelts' }, { 'type' => 'int', 'name' => 'nalloc' }, { 'type' => 'char *', 'name' => 'elts' } ] }, { 'type' => 'apr_brigade_flush', 'elts' => [] }, { 'type' => 'apr_bucket', 'elts' => [ { 'type' => '_ANON 68', 'name' => 'link' }, { 'type' => 'const apr_bucket_type_t *', 'name' => 'type' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'apr_off_t', 'name' => 'start' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'void(*)(void *e)', 'name' => 'free' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'type' => 'apr_bucket_alloc_t', 'elts' => [] }, { 'type' => 'apr_bucket_brigade', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_bucket_list', 'name' => 'list' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'bucket_alloc' } ] }, { 'type' => 'apr_bucket_file', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'apr_file_t *', 'name' => 'fd' }, { 'type' => 'apr_pool_t *', 'name' => 'readpool' }, { 'type' => 'int', 'name' => 'can_mmap' } ] }, { 'type' => 'apr_bucket_heap', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'char *', 'name' => 'base' }, { 'type' => 'apr_size_t', 'name' => 'alloc_len' }, { 'type' => 'void(*)(void *data)', 'name' => 'free_func' } ] }, { 'type' => 'apr_bucket_mmap', 'elts' => [ { 'type' => 'apr_bucket_refcount', 'name' => 'refcount' }, { 'type' => 'apr_mmap_t *', 'name' => 'mmap' } ] }, { 'type' => 'apr_bucket_pool', 'elts' => [ { 'type' => 'apr_bucket_heap', 'name' => 'heap' }, { 'type' => 'const char *', 'name' => 'base' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' } ] }, { 'type' => 'apr_bucket_refcount', 'elts' => [ { 'type' => 'int', 'name' => 'refcount' } ] }, { 'type' => 'apr_bucket_structs', 'elts' => [] }, { 'type' => 'apr_bucket_type_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'num_func' }, { 'type' => 'int', 'name' => 'is_metadata' }, { 'type' => 'void(*)(void *data)', 'name' => 'destroy' }, { 'type' => 'apr_status_t(*)(apr_bucket *b, const char **str, apr_size_t *len, apr_read_type_e block)', 'name' => 'read' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_pool_t *pool)', 'name' => 'setaside' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_size_t point)', 'name' => 'split' }, { 'type' => 'apr_status_t(*)(apr_bucket *e, apr_bucket **c)', 'name' => 'copy' } ] }, { 'type' => 'apr_byte_t', 'elts' => [] }, { 'type' => 'apr_child_errfn_t', 'elts' => [] }, { 'type' => 'apr_cmdtype_e', 'elts' => [] }, { 'type' => 'apr_crypto_block_key_mode_e', 'elts' => [] }, { 'type' => 'apr_crypto_block_key_type_e', 'elts' => [] }, { 'type' => 'apr_crypto_block_t', 'elts' => [] }, { 'type' => 'apr_crypto_config_t', 'elts' => [] }, { 'type' => 'apr_crypto_driver_t', 'elts' => [] }, { 'type' => 'apr_crypto_hash_add_t', 'elts' => [] }, { 'type' => 'apr_crypto_hash_finish_t', 'elts' => [] }, { 'type' => 'apr_crypto_hash_init_t', 'elts' => [] }, { 'type' => 'apr_crypto_hash_t', 'elts' => [ { 'type' => 'apr_crypto_hash_init_t *', 'name' => 'init' }, { 'type' => 'apr_crypto_hash_add_t *', 'name' => 'add' }, { 'type' => 'apr_crypto_hash_finish_t *', 'name' => 'finish' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'type' => 'apr_crypto_key_t', 'elts' => [] }, { 'type' => 'apr_crypto_t', 'elts' => [] }, { 'type' => 'apr_datatype_e', 'elts' => [] }, { 'type' => 'apr_datum_t', 'elts' => [ { 'type' => 'char *', 'name' => 'dptr' }, { 'type' => 'apr_size_t', 'name' => 'dsize' } ] }, { 'type' => 'apr_dbd_driver_t', 'elts' => [] }, { 'type' => 'apr_dbd_prepared_t', 'elts' => [] }, { 'type' => 'apr_dbd_results_t', 'elts' => [] }, { 'type' => 'apr_dbd_row_t', 'elts' => [] }, { 'type' => 'apr_dbd_t', 'elts' => [] }, { 'type' => 'apr_dbd_transaction_t', 'elts' => [] }, { 'type' => 'apr_dbd_type_e', 'elts' => [] }, { 'type' => 'apr_dbm_t', 'elts' => [] }, { 'type' => 'apr_descriptor', 'elts' => [ { 'type' => 'apr_file_t *', 'name' => 'f' }, { 'type' => 'apr_socket_t *', 'name' => 's' } ] }, { 'type' => 'apr_dev_t', 'elts' => [] }, { 'type' => 'apr_dir_t', 'elts' => [] }, { 'type' => 'apr_dso_handle_sym_t', 'elts' => [] }, { 'type' => 'apr_dso_handle_t', 'elts' => [] }, { 'type' => 'apr_exit_why_e', 'elts' => [] }, { 'type' => 'apr_file_t', 'elts' => [] }, { 'type' => 'apr_fileattrs_t', 'elts' => [] }, { 'type' => 'apr_fileperms_t', 'elts' => [] }, { 'type' => 'apr_filetype_e', 'elts' => [] }, { 'type' => 'apr_finfo_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_int32_t', 'name' => 'valid' }, { 'type' => 'apr_fileperms_t', 'name' => 'protection' }, { 'type' => 'apr_filetype_e', 'name' => 'filetype' }, { 'type' => 'apr_uid_t', 'name' => 'user' }, { 'type' => 'apr_gid_t', 'name' => 'group' }, { 'type' => 'apr_ino_t', 'name' => 'inode' }, { 'type' => 'apr_dev_t', 'name' => 'device' }, { 'type' => 'apr_int32_t', 'name' => 'nlink' }, { 'type' => 'apr_off_t', 'name' => 'size' }, { 'type' => 'apr_off_t', 'name' => 'csize' }, { 'type' => 'apr_time_t', 'name' => 'atime' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'apr_time_t', 'name' => 'ctime' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_file_t *', 'name' => 'filehand' } ] }, { 'type' => 'apr_getopt_err_fn_t', 'elts' => [] }, { 'type' => 'apr_getopt_option_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'optch' }, { 'type' => 'int', 'name' => 'has_arg' }, { 'type' => 'const char *', 'name' => 'description' } ] }, { 'type' => 'apr_getopt_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'cont' }, { 'type' => 'apr_getopt_err_fn_t *', 'name' => 'errfn' }, { 'type' => 'void *', 'name' => 'errarg' }, { 'type' => 'int', 'name' => 'ind' }, { 'type' => 'int', 'name' => 'opt' }, { 'type' => 'int', 'name' => 'reset' }, { 'type' => 'int', 'name' => 'argc' }, { 'type' => 'const char **', 'name' => 'argv' }, { 'type' => 'char const *', 'name' => 'place' }, { 'type' => 'int', 'name' => 'interleave' }, { 'type' => 'int', 'name' => 'skip_start' }, { 'type' => 'int', 'name' => 'skip_end' } ] }, { 'type' => 'apr_gid_t', 'elts' => [] }, { 'type' => 'apr_global_mutex_t', 'elts' => [] }, { 'type' => 'apr_hash_do_callback_fn_t', 'elts' => [] }, { 'type' => 'apr_hash_index_t', 'elts' => [] }, { 'type' => 'apr_hash_t', 'elts' => [] }, { 'type' => 'apr_hashfunc_t', 'elts' => [] }, { 'type' => 'apr_hdtr_t', 'elts' => [ { 'type' => 'iovec *', 'name' => 'headers' }, { 'type' => 'int', 'name' => 'numheaders' }, { 'type' => 'iovec *', 'name' => 'trailers' }, { 'type' => 'int', 'name' => 'numtrailers' } ] }, { 'type' => 'apr_in_addr_t', 'elts' => [ { 'type' => 'in_addr_t', 'name' => 's_addr' } ] }, { 'type' => 'apr_ino_t', 'elts' => [] }, { 'type' => 'apr_int16_t', 'elts' => [] }, { 'type' => 'apr_int32_t', 'elts' => [] }, { 'type' => 'apr_int64_t', 'elts' => [] }, { 'type' => 'apr_interface_e', 'elts' => [] }, { 'type' => 'apr_interval_time_t', 'elts' => [] }, { 'type' => 'apr_ipsubnet_t', 'elts' => [] }, { 'type' => 'apr_kill_conditions_e', 'elts' => [] }, { 'type' => 'apr_ldap_err_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'reason' }, { 'type' => 'const char *', 'name' => 'msg' }, { 'type' => 'int', 'name' => 'rc' } ] }, { 'type' => 'apr_ldap_opt_tls_cert_t', 'elts' => [ { 'type' => 'int', 'name' => 'type' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'const char *', 'name' => 'password' } ] }, { 'type' => 'apr_ldap_url_desc_t', 'elts' => [ { 'type' => 'apr_ldap_url_desc_t *', 'name' => 'lud_next' }, { 'type' => 'char *', 'name' => 'lud_scheme' }, { 'type' => 'char *', 'name' => 'lud_host' }, { 'type' => 'int', 'name' => 'lud_port' }, { 'type' => 'char *', 'name' => 'lud_dn' }, { 'type' => 'char **', 'name' => 'lud_attrs' }, { 'type' => 'int', 'name' => 'lud_scope' }, { 'type' => 'char *', 'name' => 'lud_filter' }, { 'type' => 'char **', 'name' => 'lud_exts' }, { 'type' => 'int', 'name' => 'lud_crit_exts' } ] }, { 'type' => 'apr_lockmech_e', 'elts' => [] }, { 'type' => 'apr_md4_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[4]', 'name' => 'state' }, { 'type' => 'apr_uint32_t[2]', 'name' => 'count' }, { 'type' => 'unsigned char[64]', 'name' => 'buffer' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'type' => 'apr_md5_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[4]', 'name' => 'state' }, { 'type' => 'apr_uint32_t[2]', 'name' => 'count' }, { 'type' => 'unsigned char[64]', 'name' => 'buffer' }, { 'type' => 'apr_xlate_t *', 'name' => 'xlate' } ] }, { 'type' => 'apr_memcache_conn_t', 'elts' => [] }, { 'type' => 'apr_memcache_hash_func', 'elts' => [] }, { 'type' => 'apr_memcache_server_func', 'elts' => [] }, { 'type' => 'apr_memcache_server_status_t', 'elts' => [] }, { 'type' => 'apr_memcache_server_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'host' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_memcache_server_status_t', 'name' => 'status' }, { 'type' => 'apr_reslist_t *', 'name' => 'conns' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'lock' }, { 'type' => 'apr_time_t', 'name' => 'btime' } ] }, { 'type' => 'apr_memcache_stats_t', 'elts' => [ { 'type' => 'const char *', 'name' => 'version' }, { 'type' => 'apr_uint32_t', 'name' => 'pid' }, { 'type' => 'apr_uint32_t', 'name' => 'uptime' }, { 'type' => 'apr_time_t', 'name' => 'time' }, { 'type' => 'apr_uint32_t', 'name' => 'pointer_size' }, { 'type' => 'apr_time_t', 'name' => 'rusage_user' }, { 'type' => 'apr_time_t', 'name' => 'rusage_system' }, { 'type' => 'apr_uint32_t', 'name' => 'curr_items' }, { 'type' => 'apr_uint32_t', 'name' => 'total_items' }, { 'type' => 'apr_uint64_t', 'name' => 'bytes' }, { 'type' => 'apr_uint32_t', 'name' => 'curr_connections' }, { 'type' => 'apr_uint32_t', 'name' => 'total_connections' }, { 'type' => 'apr_uint32_t', 'name' => 'connection_structures' }, { 'type' => 'apr_uint32_t', 'name' => 'cmd_get' }, { 'type' => 'apr_uint32_t', 'name' => 'cmd_set' }, { 'type' => 'apr_uint32_t', 'name' => 'get_hits' }, { 'type' => 'apr_uint32_t', 'name' => 'get_misses' }, { 'type' => 'apr_uint64_t', 'name' => 'evictions' }, { 'type' => 'apr_uint64_t', 'name' => 'bytes_read' }, { 'type' => 'apr_uint64_t', 'name' => 'bytes_written' }, { 'type' => 'apr_uint32_t', 'name' => 'limit_maxbytes' }, { 'type' => 'apr_uint32_t', 'name' => 'threads' } ] }, { 'type' => 'apr_memcache_t', 'elts' => [ { 'type' => 'apr_uint32_t', 'name' => 'flags' }, { 'type' => 'apr_uint16_t', 'name' => 'nalloc' }, { 'type' => 'apr_uint16_t', 'name' => 'ntotal' }, { 'type' => 'apr_memcache_server_t **', 'name' => 'live_servers' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'hash_baton' }, { 'type' => 'apr_memcache_hash_func', 'name' => 'hash_func' }, { 'type' => 'void *', 'name' => 'server_baton' }, { 'type' => 'apr_memcache_server_func', 'name' => 'server_func' } ] }, { 'type' => 'apr_memcache_value_t', 'elts' => [ { 'type' => 'apr_status_t', 'name' => 'status' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'char *', 'name' => 'data' }, { 'type' => 'apr_uint16_t', 'name' => 'flags' } ] }, { 'type' => 'apr_memnode_t', 'elts' => [ { 'type' => 'apr_memnode_t *', 'name' => 'next' }, { 'type' => 'apr_memnode_t **', 'name' => 'ref' }, { 'type' => 'apr_uint32_t', 'name' => 'index' }, { 'type' => 'apr_uint32_t', 'name' => 'free_index' }, { 'type' => 'char *', 'name' => 'first_avail' }, { 'type' => 'char *', 'name' => 'endp' } ] }, { 'type' => 'apr_mmap_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'cntxt' }, { 'type' => 'void *', 'name' => 'mm' }, { 'type' => 'apr_size_t', 'name' => 'size' }, { 'type' => '_ANON 66', 'name' => 'link' } ] }, { 'type' => 'apr_off_t', 'elts' => [] }, { 'type' => 'apr_opt_fn_t', 'elts' => [] }, { 'type' => 'apr_os_dir_t', 'elts' => [] }, { 'type' => 'apr_os_dso_handle_t', 'elts' => [] }, { 'type' => 'apr_os_exp_time_t', 'elts' => [ { 'type' => 'int', 'name' => 'tm_sec' }, { 'type' => 'int', 'name' => 'tm_min' }, { 'type' => 'int', 'name' => 'tm_hour' }, { 'type' => 'int', 'name' => 'tm_mday' }, { 'type' => 'int', 'name' => 'tm_mon' }, { 'type' => 'int', 'name' => 'tm_year' }, { 'type' => 'int', 'name' => 'tm_wday' }, { 'type' => 'int', 'name' => 'tm_yday' }, { 'type' => 'int', 'name' => 'tm_isdst' }, { 'type' => 'long int', 'name' => 'tm_gmtoff' }, { 'type' => 'const char *', 'name' => 'tm_zone' } ] }, { 'type' => 'apr_os_file_t', 'elts' => [] }, { 'type' => 'apr_os_global_mutex_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_proc_mutex_t *', 'name' => 'proc_mutex' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'thread_mutex' } ] }, { 'type' => 'apr_os_imp_time_t', 'elts' => [ { 'type' => '__time_t', 'name' => 'tv_sec' }, { 'type' => '__suseconds_t', 'name' => 'tv_usec' } ] }, { 'type' => 'apr_os_proc_mutex_t', 'elts' => [ { 'type' => 'int', 'name' => 'crossproc' }, { 'type' => 'pthread_mutex_t *', 'name' => 'pthread_interproc' }, { 'type' => 'pthread_mutex_t *', 'name' => 'intraproc' } ] }, { 'type' => 'apr_os_proc_t', 'elts' => [] }, { 'type' => 'apr_os_shm_t', 'elts' => [] }, { 'type' => 'apr_os_sock_info_t', 'elts' => [ { 'type' => 'apr_os_sock_t *', 'name' => 'os_sock' }, { 'type' => 'sockaddr *', 'name' => 'local' }, { 'type' => 'sockaddr *', 'name' => 'remote' }, { 'type' => 'int', 'name' => 'family' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int', 'name' => 'protocol' } ] }, { 'type' => 'apr_os_sock_t', 'elts' => [] }, { 'type' => 'apr_os_thread_t', 'elts' => [] }, { 'type' => 'apr_os_threadkey_t', 'elts' => [] }, { 'type' => 'apr_other_child_rec_t', 'elts' => [] }, { 'type' => 'apr_pollcb_cb_t', 'elts' => [] }, { 'type' => 'apr_pollcb_t', 'elts' => [] }, { 'type' => 'apr_pollfd_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_datatype_e', 'name' => 'desc_type' }, { 'type' => 'apr_int16_t', 'name' => 'reqevents' }, { 'type' => 'apr_int16_t', 'name' => 'rtnevents' }, { 'type' => 'apr_descriptor', 'name' => 'desc' }, { 'type' => 'void *', 'name' => 'client_data' } ] }, { 'type' => 'apr_pollset_method_e', 'elts' => [] }, { 'type' => 'apr_pollset_t', 'elts' => [] }, { 'type' => 'apr_pool_t', 'elts' => [] }, { 'type' => 'apr_port_t', 'elts' => [] }, { 'type' => 'apr_proc_mutex_t', 'elts' => [] }, { 'type' => 'apr_proc_t', 'elts' => [ { 'type' => 'pid_t', 'name' => 'pid' }, { 'type' => 'apr_file_t *', 'name' => 'in' }, { 'type' => 'apr_file_t *', 'name' => 'out' }, { 'type' => 'apr_file_t *', 'name' => 'err' } ] }, { 'type' => 'apr_procattr_t', 'elts' => [] }, { 'type' => 'apr_queue_t', 'elts' => [] }, { 'type' => 'apr_random_t', 'elts' => [] }, { 'type' => 'apr_read_type_e', 'elts' => [] }, { 'type' => 'apr_reslist_constructor', 'elts' => [] }, { 'type' => 'apr_reslist_destructor', 'elts' => [] }, { 'type' => 'apr_reslist_t', 'elts' => [] }, { 'type' => 'apr_rmm_off_t', 'elts' => [] }, { 'type' => 'apr_rmm_t', 'elts' => [] }, { 'type' => 'apr_sdbm_datum_t', 'elts' => [ { 'type' => 'char *', 'name' => 'dptr' }, { 'type' => 'int', 'name' => 'dsize' } ] }, { 'type' => 'apr_sdbm_t', 'elts' => [] }, { 'type' => 'apr_seek_where_t', 'elts' => [] }, { 'type' => 'apr_sha1_ctx_t', 'elts' => [ { 'type' => 'apr_uint32_t[5]', 'name' => 'digest' }, { 'type' => 'apr_uint32_t', 'name' => 'count_lo' }, { 'type' => 'apr_uint32_t', 'name' => 'count_hi' }, { 'type' => 'apr_uint32_t[16]', 'name' => 'data' }, { 'type' => 'int', 'name' => 'local' } ] }, { 'type' => 'apr_shm_t', 'elts' => [] }, { 'type' => 'apr_short_interval_time_t', 'elts' => [] }, { 'type' => 'apr_shutdown_how_e', 'elts' => [] }, { 'type' => 'apr_sigfunc_t', 'elts' => [] }, { 'type' => 'apr_signum_t', 'elts' => [] }, { 'type' => 'apr_size_t', 'elts' => [] }, { 'type' => 'apr_sockaddr_t', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'char *', 'name' => 'hostname' }, { 'type' => 'char *', 'name' => 'servname' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'apr_int32_t', 'name' => 'family' }, { 'type' => 'apr_socklen_t', 'name' => 'salen' }, { 'type' => 'int', 'name' => 'ipaddr_len' }, { 'type' => 'int', 'name' => 'addr_str_len' }, { 'type' => 'void *', 'name' => 'ipaddr_ptr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'next' }, { 'type' => 'union _ANON 1', 'name' => 'sa' } ] }, { 'type' => 'apr_socket_t', 'elts' => [] }, { 'type' => 'apr_socklen_t', 'elts' => [] }, { 'type' => 'apr_ssize_t', 'elts' => [] }, { 'type' => 'apr_status_t', 'elts' => [] }, { 'type' => 'apr_strmatch_pattern', 'elts' => [ { 'type' => 'const char *(*)(const apr_strmatch_pattern *this_pattern, const char *s, apr_size_t slen)', 'name' => 'compare' }, { 'type' => 'const char *', 'name' => 'pattern' }, { 'type' => 'apr_size_t', 'name' => 'length' }, { 'type' => 'void *', 'name' => 'context' } ] }, { 'type' => 'apr_table_entry_t', 'elts' => [ { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'char *', 'name' => 'val' }, { 'type' => 'apr_uint32_t', 'name' => 'key_checksum' } ] }, { 'type' => 'apr_table_t', 'elts' => [] }, { 'type' => 'apr_text', 'elts' => [ { 'type' => 'const char *', 'name' => 'text' }, { 'type' => 'apr_text *', 'name' => 'next' } ] }, { 'type' => 'apr_text_header', 'elts' => [ { 'type' => 'apr_text *', 'name' => 'first' }, { 'type' => 'apr_text *', 'name' => 'last' } ] }, { 'type' => 'apr_thread_cond_t', 'elts' => [] }, { 'type' => 'apr_thread_mutex_t', 'elts' => [] }, { 'type' => 'apr_thread_once_t', 'elts' => [] }, { 'type' => 'apr_thread_pool_t', 'elts' => [] }, { 'type' => 'apr_thread_rwlock_t', 'elts' => [] }, { 'type' => 'apr_thread_start_t', 'elts' => [] }, { 'type' => 'apr_thread_t', 'elts' => [] }, { 'type' => 'apr_threadattr_t', 'elts' => [] }, { 'type' => 'apr_threadkey_t', 'elts' => [] }, { 'type' => 'apr_time_exp_t', 'elts' => [ { 'type' => 'apr_int32_t', 'name' => 'tm_usec' }, { 'type' => 'apr_int32_t', 'name' => 'tm_sec' }, { 'type' => 'apr_int32_t', 'name' => 'tm_min' }, { 'type' => 'apr_int32_t', 'name' => 'tm_hour' }, { 'type' => 'apr_int32_t', 'name' => 'tm_mday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_mon' }, { 'type' => 'apr_int32_t', 'name' => 'tm_year' }, { 'type' => 'apr_int32_t', 'name' => 'tm_wday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_yday' }, { 'type' => 'apr_int32_t', 'name' => 'tm_isdst' }, { 'type' => 'apr_int32_t', 'name' => 'tm_gmtoff' } ] }, { 'type' => 'apr_time_t', 'elts' => [] }, { 'type' => 'apr_uid_t', 'elts' => [] }, { 'type' => 'apr_uint16_t', 'elts' => [] }, { 'type' => 'apr_uint32_t', 'elts' => [] }, { 'type' => 'apr_uint64_t', 'elts' => [] }, { 'type' => 'apr_uintptr_t', 'elts' => [] }, { 'type' => 'apr_uri_t', 'elts' => [ { 'type' => 'char *', 'name' => 'scheme' }, { 'type' => 'char *', 'name' => 'hostinfo' }, { 'type' => 'char *', 'name' => 'user' }, { 'type' => 'char *', 'name' => 'password' }, { 'type' => 'char *', 'name' => 'hostname' }, { 'type' => 'char *', 'name' => 'port_str' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'char *', 'name' => 'query' }, { 'type' => 'char *', 'name' => 'fragment' }, { 'type' => 'hostent *', 'name' => 'hostent' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'unsigned', 'name' => 'is_initialized' }, { 'type' => 'unsigned', 'name' => 'dns_looked_up' }, { 'type' => 'unsigned', 'name' => 'dns_resolved' } ] }, { 'type' => 'apr_uuid_t', 'elts' => [ { 'type' => 'unsigned char[16]', 'name' => 'data' } ] }, { 'type' => 'apr_version_t', 'elts' => [ { 'type' => 'int', 'name' => 'major' }, { 'type' => 'int', 'name' => 'minor' }, { 'type' => 'int', 'name' => 'patch' }, { 'type' => 'int', 'name' => 'is_dev' } ] }, { 'type' => 'apr_vformatter_buff_t', 'elts' => [ { 'type' => 'char *', 'name' => 'curpos' }, { 'type' => 'char *', 'name' => 'endpos' } ] }, { 'type' => 'apr_wait_how_e', 'elts' => [] }, { 'type' => 'apr_xlate_t', 'elts' => [] }, { 'type' => 'apr_xml_attr', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'ns' }, { 'type' => 'const char *', 'name' => 'value' }, { 'type' => 'apr_xml_attr *', 'name' => 'next' } ] }, { 'type' => 'apr_xml_doc', 'elts' => [ { 'type' => 'apr_xml_elem *', 'name' => 'root' }, { 'type' => 'apr_array_header_t *', 'name' => 'namespaces' } ] }, { 'type' => 'apr_xml_elem', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'ns' }, { 'type' => 'const char *', 'name' => 'lang' }, { 'type' => 'apr_text_header', 'name' => 'first_cdata' }, { 'type' => 'apr_text_header', 'name' => 'following_cdata' }, { 'type' => 'apr_xml_elem *', 'name' => 'parent' }, { 'type' => 'apr_xml_elem *', 'name' => 'next' }, { 'type' => 'apr_xml_elem *', 'name' => 'first_child' }, { 'type' => 'apr_xml_attr *', 'name' => 'attr' }, { 'type' => 'apr_xml_elem *', 'name' => 'last_child' }, { 'type' => 'apr_xml_ns_scope *', 'name' => 'ns_scope' }, { 'type' => 'void *', 'name' => 'priv' } ] }, { 'type' => 'apr_xml_parser', 'elts' => [] }, { 'type' => 'cmd_parms', 'elts' => [ { 'type' => 'void *', 'name' => 'info' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'int', 'name' => 'override_opts' }, { 'type' => 'apr_table_t *', 'name' => 'override_list' }, { 'type' => 'apr_int64_t', 'name' => 'limited' }, { 'type' => 'apr_array_header_t *', 'name' => 'limited_xmethods' }, { 'type' => 'ap_method_list_t *', 'name' => 'xlimited' }, { 'type' => 'ap_configfile_t *', 'name' => 'config_file' }, { 'type' => 'ap_directive_t *', 'name' => 'directive' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'temp_pool' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'const command_rec *', 'name' => 'cmd' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'context' }, { 'type' => 'const ap_directive_t *', 'name' => 'err_directive' } ] }, { 'type' => 'command_rec', 'elts' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'cmd_func', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'cmd_data' }, { 'type' => 'int', 'name' => 'req_override' }, { 'type' => 'enum cmd_how', 'name' => 'args_how' }, { 'type' => 'const char *', 'name' => 'errmsg' } ] }, { 'type' => 'conn_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'server_rec *', 'name' => 'base_server' }, { 'type' => 'void *', 'name' => 'vhost_lookup_data' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'local_addr' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'client_addr' }, { 'type' => 'char *', 'name' => 'client_ip' }, { 'type' => 'char *', 'name' => 'remote_host' }, { 'type' => 'char *', 'name' => 'remote_logname' }, { 'type' => 'char *', 'name' => 'local_ip' }, { 'type' => 'char *', 'name' => 'local_host' }, { 'type' => 'long', 'name' => 'id' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'conn_config' }, { 'type' => 'apr_table_t *', 'name' => 'notes' }, { 'type' => 'ap_filter_t *', 'name' => 'input_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'output_filters' }, { 'type' => 'void *', 'name' => 'sbh' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'bucket_alloc' }, { 'type' => 'conn_state_t *', 'name' => 'cs' }, { 'type' => 'int', 'name' => 'data_in_input_filters' }, { 'type' => 'int', 'name' => 'data_in_output_filters' }, { 'type' => 'unsigned int', 'name' => 'clogging_input_filters' }, { 'type' => 'signed int', 'name' => 'double_reverse' }, { 'type' => 'unsigned', 'name' => 'aborted' }, { 'type' => 'ap_conn_keepalive_e', 'name' => 'keepalive' }, { 'type' => 'int', 'name' => 'keepalives' }, { 'type' => 'const struct ap_logconf *', 'name' => 'log' }, { 'type' => 'const char *', 'name' => 'log_id' }, { 'type' => 'apr_thread_t *', 'name' => 'current_thread' } ] }, { 'type' => 'core_net_rec', 'elts' => [] }, { 'type' => 'htaccess_result', 'elts' => [ { 'type' => 'const char *', 'name' => 'dir' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'int', 'name' => 'override_opts' }, { 'type' => 'apr_table_t *', 'name' => 'override_list' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'htaccess' }, { 'type' => 'const struct htaccess_result *', 'name' => 'next' } ] }, { 'type' => 'modperl_uri_t', 'elts' => [ { 'type' => 'apr_uri_t', 'name' => 'uri' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'char *', 'name' => 'path_info' } ] }, { 'type' => 'module', 'elts' => [ { 'type' => 'int', 'name' => 'version' }, { 'type' => 'int', 'name' => 'minor_version' }, { 'type' => 'int', 'name' => 'module_index' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'void *', 'name' => 'dynamic_load_handle' }, { 'type' => 'module_struct *', 'name' => 'next' }, { 'type' => 'unsigned long', 'name' => 'magic' }, { 'type' => 'void(*) (process_rec *process)', 'name' => 'rewrite_args' }, { 'type' => 'void *(*) (apr_pool_t *p, char *dir)', 'name' => 'create_dir_config' }, { 'type' => 'void *(*) (apr_pool_t *p, void *base_conf, void *new_conf)', 'name' => 'merge_dir_config' }, { 'type' => 'void *(*) (apr_pool_t *p, server_rec *s)', 'name' => 'create_server_config' }, { 'type' => 'void *(*) (apr_pool_t *p, void *base_conf, void *new_conf)', 'name' => 'merge_server_config' }, { 'type' => 'const command_rec *', 'name' => 'cmds' }, { 'type' => 'void(*) (apr_pool_t *p)', 'name' => 'register_hooks' } ] }, { 'type' => 'piped_log', 'elts' => [] }, { 'type' => 'process_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'const char *', 'name' => 'short_name' }, { 'type' => 'const char * const *', 'name' => 'argv' }, { 'type' => 'int', 'name' => 'argc' } ] }, { 'type' => 'request_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'conn_rec *', 'name' => 'connection' }, { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'request_rec *', 'name' => 'next' }, { 'type' => 'request_rec *', 'name' => 'prev' }, { 'type' => 'request_rec *', 'name' => 'main' }, { 'type' => 'char *', 'name' => 'the_request' }, { 'type' => 'int', 'name' => 'assbackwards' }, { 'type' => 'int', 'name' => 'proxyreq' }, { 'type' => 'int', 'name' => 'header_only' }, { 'type' => 'int', 'name' => 'proto_num' }, { 'type' => 'char *', 'name' => 'protocol' }, { 'type' => 'const char *', 'name' => 'hostname' }, { 'type' => 'apr_time_t', 'name' => 'request_time' }, { 'type' => 'const char *', 'name' => 'status_line' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'int', 'name' => 'method_number' }, { 'type' => 'const char *', 'name' => 'method' }, { 'type' => 'apr_int64_t', 'name' => 'allowed' }, { 'type' => 'apr_array_header_t *', 'name' => 'allowed_xmethods' }, { 'type' => 'ap_method_list_t *', 'name' => 'allowed_methods' }, { 'type' => 'apr_off_t', 'name' => 'sent_bodyct' }, { 'type' => 'apr_off_t', 'name' => 'bytes_sent' }, { 'type' => 'apr_time_t', 'name' => 'mtime' }, { 'type' => 'const char *', 'name' => 'range' }, { 'type' => 'apr_off_t', 'name' => 'clength' }, { 'type' => 'int', 'name' => 'chunked' }, { 'type' => 'int', 'name' => 'read_body' }, { 'type' => 'int', 'name' => 'read_chunked' }, { 'type' => 'unsigned', 'name' => 'expecting_100' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'kept_body' }, { 'type' => 'apr_table_t *', 'name' => 'body_table' }, { 'type' => 'apr_off_t', 'name' => 'remaining' }, { 'type' => 'apr_off_t', 'name' => 'read_length' }, { 'type' => 'apr_table_t *', 'name' => 'headers_in' }, { 'type' => 'apr_table_t *', 'name' => 'headers_out' }, { 'type' => 'apr_table_t *', 'name' => 'err_headers_out' }, { 'type' => 'apr_table_t *', 'name' => 'subprocess_env' }, { 'type' => 'apr_table_t *', 'name' => 'notes' }, { 'type' => 'const char *', 'name' => 'content_type' }, { 'type' => 'const char *', 'name' => 'handler' }, { 'type' => 'const char *', 'name' => 'content_encoding' }, { 'type' => 'apr_array_header_t *', 'name' => 'content_languages' }, { 'type' => 'char *', 'name' => 'vlist_validator' }, { 'type' => 'char *', 'name' => 'user' }, { 'type' => 'char *', 'name' => 'ap_auth_type' }, { 'type' => 'char *', 'name' => 'unparsed_uri' }, { 'type' => 'char *', 'name' => 'uri' }, { 'type' => 'char *', 'name' => 'filename' }, { 'type' => 'char *', 'name' => 'canonical_filename' }, { 'type' => 'char *', 'name' => 'path_info' }, { 'type' => 'char *', 'name' => 'args' }, { 'type' => 'int', 'name' => 'used_path_info' }, { 'type' => 'int', 'name' => 'eos_sent' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'per_dir_config' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'request_config' }, { 'type' => 'const struct ap_logconf *', 'name' => 'log' }, { 'type' => 'const char *', 'name' => 'log_id' }, { 'type' => 'const struct htaccess_result *', 'name' => 'htaccess' }, { 'type' => 'ap_filter_t *', 'name' => 'output_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'input_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'proto_output_filters' }, { 'type' => 'ap_filter_t *', 'name' => 'proto_input_filters' }, { 'type' => 'int', 'name' => 'no_cache' }, { 'type' => 'int', 'name' => 'no_local_copy' }, { 'type' => 'apr_thread_mutex_t *', 'name' => 'invoke_mtx' }, { 'type' => 'apr_uri_t', 'name' => 'parsed_uri' }, { 'type' => 'apr_finfo_t', 'name' => 'finfo' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'useragent_addr' }, { 'type' => 'char *', 'name' => 'useragent_ip' } ] }, { 'type' => 'server_addr_rec', 'elts' => [ { 'type' => 'server_addr_rec *', 'name' => 'next' }, { 'type' => 'char *', 'name' => 'virthost' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'host_addr' }, { 'type' => 'apr_port_t', 'name' => 'host_port' } ] }, { 'type' => 'server_rec', 'elts' => [ { 'type' => 'process_rec *', 'name' => 'process' }, { 'type' => 'server_rec *', 'name' => 'next' }, { 'type' => 'char *', 'name' => 'error_fname' }, { 'type' => 'apr_file_t *', 'name' => 'error_log' }, { 'type' => 'ap_logconf', 'name' => 'log' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'module_config' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'lookup_defaults' }, { 'type' => 'const char *', 'name' => 'defn_name' }, { 'type' => 'unsigned', 'name' => 'defn_line_number' }, { 'type' => 'char', 'name' => 'is_virtual' }, { 'type' => 'apr_port_t', 'name' => 'port' }, { 'type' => 'const char *', 'name' => 'server_scheme' }, { 'type' => 'char *', 'name' => 'server_admin' }, { 'type' => 'char *', 'name' => 'server_hostname' }, { 'type' => 'server_addr_rec *', 'name' => 'addrs' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_interval_time_t', 'name' => 'keep_alive_timeout' }, { 'type' => 'int', 'name' => 'keep_alive_max' }, { 'type' => 'int', 'name' => 'keep_alive' }, { 'type' => 'apr_array_header_t *', 'name' => 'names' }, { 'type' => 'apr_array_header_t *', 'name' => 'wild_names' }, { 'type' => 'const char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'pathlen' }, { 'type' => 'int', 'name' => 'limit_req_line' }, { 'type' => 'int', 'name' => 'limit_req_fieldsize' }, { 'type' => 'int', 'name' => 'limit_req_fields' }, { 'type' => 'void *', 'name' => 'context' } ] }, { 'type' => 'session_rec', 'elts' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_uuid_t *', 'name' => 'uuid' }, { 'type' => 'const char *', 'name' => 'remote_user' }, { 'type' => 'apr_table_t *', 'name' => 'entries' }, { 'type' => 'const char *', 'name' => 'encoded' }, { 'type' => 'apr_time_t', 'name' => 'expiry' }, { 'type' => 'long', 'name' => 'maxage' }, { 'type' => 'int', 'name' => 'dirty' }, { 'type' => 'int', 'name' => 'cached' }, { 'type' => 'int', 'name' => 'written' } ] }, { 'type' => 'subrequest_rec', 'elts' => [] }, { 'type' => 'unixd_config_rec', 'elts' => [ { 'type' => 'const char *', 'name' => 'user_name' }, { 'type' => 'const char *', 'name' => 'group_name' }, { 'type' => 'uid_t', 'name' => 'user_id' }, { 'type' => 'gid_t', 'name' => 'group_id' }, { 'type' => 'int', 'name' => 'suexec_enabled' }, { 'type' => 'const char *', 'name' => 'chroot_dir' }, { 'type' => 'const char *', 'name' => 'suexec_disabled_reason' } ] }, { 'type' => 'modperl_interp_t', 'elts' => [ { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'int', 'name' => 'num_requests' }, { 'type' => 'U8', 'name' => 'flags' }, { 'type' => 'modperl_config_con_t *', 'name' => 'ccfg' }, { 'type' => 'int', 'name' => 'refcnt' }, { 'type' => 'unsigned long', 'name' => 'tid' } ] }, { 'type' => 'modperl_interp_pool_t', 'elts' => [ { 'type' => 'server_rec *', 'name' => 'server' }, { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'tipool_cfg' }, { 'type' => 'modperl_interp_t *', 'name' => 'parent' } ] }, { 'type' => 'modperl_tipool_t', 'elts' => [ { 'type' => 'perl_mutex', 'name' => 'tiplock' }, { 'type' => 'perl_cond', 'name' => 'available' }, { 'type' => 'modperl_list_t *', 'name' => 'idle' }, { 'type' => 'modperl_list_t *', 'name' => 'busy' }, { 'type' => 'int', 'name' => 'in_use' }, { 'type' => 'int', 'name' => 'size' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'cfg' }, { 'type' => 'modperl_tipool_vtbl_t *', 'name' => 'func' } ] }, { 'type' => 'modperl_tipool_config_t', 'elts' => [ { 'type' => 'int', 'name' => 'start' }, { 'type' => 'int', 'name' => 'min_spare' }, { 'type' => 'int', 'name' => 'max_spare' }, { 'type' => 'int', 'name' => 'max' }, { 'type' => 'int', 'name' => 'max_requests' } ] } ]; 1; mod_perl-2.0.9/xs/tables/current24/APR/0000755000104000010010000000000012540623211020136 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current24/APR/FunctionTable.pm0000644000104000010010000001026512540623211023235 0ustar AdministratorsNonepackage APR::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: this file was manually generated on # ! Tue Jun 22 22:00:00 2004 # ! It contains a subset of functions appearing in # ! ModPerl::FunctionTable used to build APR.so # ! Eventually this will be autogenerated by # ! Apache::ParseSource # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $APR::FunctionTable = [ { 'return_type' => 'void', 'name' => 'modperl_trace', 'args' => [ { 'type' => 'const char *', 'name' => 'func' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_level_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile' }, { 'type' => 'const char *', 'name' => 'level' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_logfile_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile_new' } ] }, { 'return_type' => 'unsigned long', 'name' => 'modperl_debug_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'void *', 'name' => 'p' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_hash_tied_object', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_sv_setref_uv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'rv' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'UV', 'name' => 'uv' } ] }, { 'return_type' => 'modperl_uri_t *', 'name' => 'modperl_uri_new', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_gensym', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'pack' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_error_strerror', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' } ] }, { 'return_type' => 'void', 'name' => 'modperl_croak', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' }, { 'type' => 'const char*', 'name' => 'func' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_unselect', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'modperl_bucket_sv_create', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, ]; 1; mod_perl-2.0.9/xs/tables/current24/ModPerl/0000755000104000010010000000000012540623211021056 5ustar AdministratorsNonemod_perl-2.0.9/xs/tables/current24/ModPerl/FunctionTable.pm0000644000104000010010000046335612540623211024172 0ustar AdministratorsNonepackage ModPerl::FunctionTable; # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by ModPerl::ParseSource/0.01 # ! Mon Jul 1 12:38:19 2013 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $ModPerl::FunctionTable = [ { 'return_type' => 'int', 'name' => 'modperl_access_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_apr_array_header2avrv', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_array_header_t *', 'name' => 'array' } ] }, { 'return_type' => 'int', 'name' => 'modperl_authen_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_authz_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_array_header_t *', 'name' => 'modperl_avrv2apr_array_header', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'avrv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_brigade_dump', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'apr_file_t *', 'name' => 'file' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'modperl_bucket_sv_create', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'AV *', 'name' => 'args' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_files', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_per_dir', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_per_srv', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_pre_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'void', 'name' => 'modperl_callback_process', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_callback_run_handlers', 'args' => [ { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'modperl_hook_run_mode_e', 'name' => 'run_mode' } ] }, { 'return_type' => 'int', 'name' => 'modperl_cgi_header_parse', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'apr_size_t *', 'name' => 'len' }, { 'type' => 'const char **', 'name' => 'body' } ] }, { 'return_type' => 'void', 'name' => 'modperl_child_init_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_cleanup_data_t *', 'name' => 'modperl_cleanup_data_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_END', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_access_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_add_var', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authen_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authn_provider', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authz_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_authz_provider', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_child_exit_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_child_init_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_cleanup_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_config_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_fixup_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_header_parser_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_init_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_input_filter_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max_requests', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_max_spare', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_min_spare', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_interp_start', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_load_module', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_log_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_map_to_storage_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_modules', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_open_logs_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_options', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_output_filter_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pass_env', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_perl', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_perldo', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pod', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pod_cut', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_config_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_config_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_post_read_request_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_pre_connection_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_process_connection_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_cmd_push_filter_handlers', 'args' => [ { 'type' => 'MpAV **', 'name' => 'handlers' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_cmd_push_handlers', 'args' => [ { 'type' => 'MpAV **', 'name' => 'handlers' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_requires', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_response_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_env', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_input_filter', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_output_filter', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_set_var', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg1' }, { 'type' => 'const char *', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_switches', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_trace', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'mconfig' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_trans_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_cmd_type_handlers', 'args' => [ { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'void *', 'name' => 'dummy' }, { 'type' => 'const char *', 'name' => 'arg' } ] }, { 'return_type' => 'U16 *', 'name' => 'modperl_code_attrs', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlModule', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlPostConfigRequire', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_apply_PerlRequire', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_config_con_t *', 'name' => 'modperl_config_con_new', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_dir_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'char *', 'name' => 'dir' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_dir_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'basev' }, { 'type' => 'void *', 'name' => 'addv' } ] }, { 'return_type' => 'modperl_config_dir_t *', 'name' => 'modperl_config_dir_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'ptmp' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'conf' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_parms', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_request', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'lines' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_config_insert_server', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'int', 'name' => 'modperl_config_is_perl_option_enabled', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_config_req_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_config_req_t *', 'name' => 'modperl_config_req_new', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_config_request_cleanup', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'char **', 'name' => 'modperl_config_srv_argv_init', 'args' => [ { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'int *', 'name' => 'argc' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_srv_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_config_srv_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'basev' }, { 'type' => 'void *', 'name' => 'addv' } ] }, { 'return_type' => 'modperl_config_srv_t *', 'name' => 'modperl_config_srv_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_const_compile', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'const char *', 'name' => 'arg' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_apache2_const', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_apr_const', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char **', 'name' => 'modperl_constants_group_lookup_modperl', 'args' => [ { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_apache2_const', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_apr_const', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_constants_lookup_modperl', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_croak', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' }, { 'type' => 'const char*', 'name' => 'func' } ] }, { 'return_type' => 'unsigned long', 'name' => 'modperl_debug_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_dir_config', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'sv_val' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_clear', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_request_dir', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_request_srv', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_configure_server', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_default_populate', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_hash_keys', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_hv_store', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_init', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_populate', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_tie', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_unpopulate', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_request_untie', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_sync_dir_env_hash2table', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_config_dir_t *', 'name' => 'dcfg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_sync_srv_env_hash2table', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_env_unload', 'args' => [] }, { 'return_type' => 'char *', 'name' => 'modperl_error_strerror', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_status_t', 'name' => 'rc' } ] }, { 'return_type' => 'int', 'name' => 'modperl_errsv', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'status' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_errsv_prepend', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pat' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_file2package', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'file' } ] }, { 'return_type' => 'U16 *', 'name' => 'modperl_filter_attributes', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'package' }, { 'type' => 'SV *', 'name' => 'cvrv' } ] }, { 'return_type' => 'modperl_filter_t *', 'name' => 'modperl_filter_mg_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'modperl_filter_t *', 'name' => 'modperl_filter_new', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'modperl_filter_mode_e', 'name' => 'mode' }, { 'type' => 'ap_input_mode_t', 'name' => 'input_mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'int', 'name' => 'modperl_filter_resolve_init_handler', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_filter_runtime_add', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'modperl_filter_mode_e', 'name' => 'mode' }, { 'type' => 'modperl_filter_add_t', 'name' => 'addfunc' }, { 'type' => 'SV *', 'name' => 'callback' }, { 'type' => 'const char *', 'name' => 'type' } ] }, { 'return_type' => 'int', 'name' => 'modperl_fixup_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'U32', 'name' => 'modperl_flags_lookup_dir', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'U32', 'name' => 'modperl_flags_lookup_srv', 'args' => [ { 'type' => 'const char *', 'name' => 'str' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_get_perl_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_anon_cnt_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_global_anon_cnt_next', 'args' => [] }, { 'return_type' => 'void *', 'name' => 'modperl_global_get', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_global_get_pconf', 'args' => [] }, { 'return_type' => 'server_rec *', 'name' => 'modperl_global_get_server_rec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_init', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_init_pconf', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_init_server_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec * server_rec', 'name' => 'arg1' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock_pconf', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_lock_server_rec', 'args' => [] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_global_request', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_cfg_set', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_obj_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_request_set', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set_pconf', 'args' => [ { 'type' => 'void *', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_set_server_rec', 'args' => [ { 'type' => 'void *', 'name' => 'arg0' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock', 'args' => [ { 'type' => 'modperl_global_t *', 'name' => 'global' } ] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock_pconf', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_global_unlock_server_rec', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_handler_anon_add', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'anon' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'CV *', 'name' => 'modperl_handler_anon_get', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'anon' } ] }, { 'return_type' => 'void', 'name' => 'modperl_handler_anon_init', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_handler_anon_next', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'MpAV *', 'name' => 'modperl_handler_array_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'MpAV *', 'name' => 'base_a' }, { 'type' => 'MpAV *', 'name' => 'add_a' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_files', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_per_dir', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_per_srv', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_pre_connection', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_desc_process', 'args' => [ { 'type' => 'int', 'name' => 'idx' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_dup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_handler_t *', 'name' => 'h' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_equal', 'args' => [ { 'type' => 'modperl_handler_t *', 'name' => 'h1' }, { 'type' => 'modperl_handler_t *', 'name' => 'h2' } ] }, { 'return_type' => 'MpAV **', 'name' => 'modperl_handler_get_handlers', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_lookup', 'args' => [ { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int *', 'name' => 'type' } ] }, { 'return_type' => 'MpAV **', 'name' => 'modperl_handler_lookup_handlers', 'args' => [ { 'type' => 'modperl_config_dir_t *', 'name' => 'dcfg' }, { 'type' => 'modperl_config_srv_t *', 'name' => 'scfg' }, { 'type' => 'modperl_config_req_t *', 'name' => 'rcfg' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'int', 'name' => 'idx' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' }, { 'type' => 'const char **', 'name' => 'desc' } ] }, { 'return_type' => 'void', 'name' => 'modperl_handler_make_args', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'AV **', 'name' => 'avp' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_handler_name', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_handler_t *', 'name' => 'handler' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'modperl_handler_t *', 'name' => 'modperl_handler_new_from_sv', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_perl_add_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'modperl_handler_action_e', 'name' => 'action' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_handler_perl_get_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'MpAV **', 'name' => 'handp' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_push_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'MpAV *', 'name' => 'handlers' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_handler_resolve', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t **', 'name' => 'handp' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_hash_seed_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_hash_seed_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'void *', 'name' => 'p' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_hash_tied_object', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_hash_tied_object_rv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'tsv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_header_parser_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_hook_init', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_hook_pre_config', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_init', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_init_globals', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'pconf' } ] }, { 'return_type' => 'int', 'name' => 'modperl_init_vhost', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 'base_server' } ] }, { 'return_type' => 'void', 'name' => 'modperl_input_filter_add_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'modperl_input_filter_add_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_handler', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'ap_input_mode_t', 'name' => 'input_mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'modperl_input_filter_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'wanted' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_input_filter_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_clone_init', 'args' => [ { 'type' => 'modperl_interp_t *', 'name' => 'interp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_destroy', 'args' => [ { 'type' => 'modperl_interp_t *', 'name' => 'interp' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_get', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_init', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_mip_walk', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'current_perl' }, { 'type' => 'PerlInterpreter *', 'name' => 'parent_perl' }, { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'modperl_interp_mip_walker_t', 'name' => 'walker' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_mip_walk_servers', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'current_perl' }, { 'type' => 'server_rec *', 'name' => 'base_server' }, { 'type' => 'modperl_interp_mip_walker_t', 'name' => 'walker' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_new', 'args' => [ { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_pool_destroy', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_pool_get', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_pool_select', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_interp_pool_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_interp_t *', 'name' => 'interp' }, { 'type' => 'int', 'name' => 'cleanup' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_interp_select', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_interp_unselect', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_apache_init', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_handle_tie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'void *', 'name' => 'ptr' } ] }, { 'return_type' => 'int', 'name' => 'modperl_io_handle_tied', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' }, { 'type' => 'char *', 'name' => 'classname' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_handle_untie', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_perlio_override_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_perlio_override_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_perlio_restore_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'void', 'name' => 'modperl_io_perlio_restore_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'GV *', 'name' => 'handle' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_tie_stdin', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_io_tie_stdout', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_is_running', 'args' => [] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_append', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'new_list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_first', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_last', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_new', 'args' => [] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_prepend', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'new_list' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_remove', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'modperl_list_t *', 'name' => 'rlist' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_remove_data', 'args' => [ { 'type' => 'modperl_list_t *', 'name' => 'list' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'modperl_list_t **', 'name' => 'listp' } ] }, { 'return_type' => 'int', 'name' => 'modperl_log_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_map_to_storage_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_mgv_append', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_mgv_as_string', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'package' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_compile', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_equal', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'mgv1' }, { 'type' => 'modperl_mgv_t *', 'name' => 'mgv2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_mgv_hash_handlers', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_last', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_mgv_last_name', 'args' => [ { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_mgv_lookup', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' } ] }, { 'return_type' => 'GV *', 'name' => 'modperl_mgv_lookup_autoload', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'modperl_mgv_t *', 'name' => 'modperl_mgv_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_require_module', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_mgv_t *', 'name' => 'symbol' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'int', 'name' => 'modperl_mgv_resolve', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_handler_t *', 'name' => 'handler' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'void', 'name' => 'modperl_modglobal_hash_keys', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'modperl_modglobal_key_t *', 'name' => 'modperl_modglobal_lookup', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_module_add', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'mod_cmds' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_module_config_get_obj', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'pmodule' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'v' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_module_config_table_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'create' } ] }, { 'return_type' => 'void', 'name' => 'modperl_module_config_table_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'table' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_newSVsv_obj', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'stashsv' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'int', 'name' => 'modperl_open_logs_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'modperl_options_t *', 'name' => 'modperl_options_merge', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_options_t *', 'name' => 'base' }, { 'type' => 'modperl_options_t *new', 'name' => 'arg2' } ] }, { 'return_type' => 'modperl_options_t *', 'name' => 'modperl_options_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'const char *', 'name' => 'modperl_options_set', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_options_t *', 'name' => 'o' }, { 'type' => 'const char *', 'name' => 's' } ] }, { 'return_type' => 'void', 'name' => 'modperl_output_filter_add_connection', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'modperl_output_filter_add_request', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_handler', 'args' => [ { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'modperl_output_filter_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'wanted' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_output_filter_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_filter_t *', 'name' => 'filter' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'modperl_package_unload', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'package' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_av_push_elts_ref', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'AV *', 'name' => 'dst' }, { 'type' => 'AV *', 'name' => 'src' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_call_endav', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_call_list', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'AV *', 'name' => 'subs' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_core_global_init', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_destruct', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'perl' } ] }, { 'return_type' => 'int', 'name' => 'modperl_perl_destruct_level', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_do_join', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_do_sprintf', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'I32', 'name' => 'len' }, { 'type' => 'SV **', 'name' => 'sarg' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_exit', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'status' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_gensym', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'pack' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_call', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_clear', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_avcv_register', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_modglobal_key_t *', 'name' => 'gkey' }, { 'type' => 'const char *', 'name' => 'package' }, { 'type' => 'I32', 'name' => 'packlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_request_restore', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_global_request_save', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'HE *', 'name' => 'modperl_perl_hv_fetch_he', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'HV *', 'name' => 'hv' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'I32', 'name' => 'klen' }, { 'type' => 'U32', 'name' => 'hash' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_init_ids_server', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_perl_module_loaded', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_set', 'args' => [ { 'type' => 'modperl_perl_opcode_e', 'name' => 'idx' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_set_all', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_unset', 'args' => [ { 'type' => 'modperl_perl_opcode_e', 'name' => 'idx' } ] }, { 'return_type' => 'void', 'name' => 'modperl_perl_pp_unset_all', 'args' => [] }, { 'return_type' => 'SV *', 'name' => 'modperl_perl_sv_setref_uv', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'rv' }, { 'type' => 'const char *', 'name' => 'classname' }, { 'type' => 'UV', 'name' => 'uv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_pnotes', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'HV **', 'name' => 'pnotes' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'void', 'name' => 'modperl_pnotes_kill', 'args' => [ { 'type' => 'void *', 'name' => 'cl_data' } ] }, { 'return_type' => 'int', 'name' => 'modperl_post_config_handler', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pconf' }, { 'type' => 'apr_pool_t *', 'name' => 'plog' }, { 'type' => 'apr_pool_t *', 'name' => 'ptemp' }, { 'type' => 'server_rec *', 'name' => 's' } ] }, { 'return_type' => 'int', 'name' => 'modperl_post_post_config_phase', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_post_read_request_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_pre_connection_handler', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'void *', 'name' => 'csd' } ] }, { 'return_type' => 'int', 'name' => 'modperl_process_connection_handler', 'args' => [ { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_ptr2obj', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'void *', 'name' => 'ptr' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_register_auth_provider', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' }, { 'type' => 'SV *', 'name' => 'callback1' }, { 'type' => 'SV *', 'name' => 'callback2' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_register_auth_provider_name', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'const char *', 'name' => 'provider_group' }, { 'type' => 'const char *', 'name' => 'provider_name' }, { 'type' => 'const char *', 'name' => 'provider_version' }, { 'type' => 'const char *', 'name' => 'callback1' }, { 'type' => 'const char *', 'name' => 'callback2' }, { 'type' => 'int', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'modperl_register_handler_hooks', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_register_hooks', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'ssize_t', 'name' => 'modperl_request_read', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'buffer' }, { 'type' => 'size_t', 'name' => 'len' } ] }, { 'return_type' => 'int', 'name' => 'modperl_require_file', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pv' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'int', 'name' => 'modperl_require_module', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'pv' }, { 'type' => 'int', 'name' => 'logfailure' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_response_finish', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_response_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_response_handler_cgi', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'void', 'name' => 'modperl_response_init', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_restart_count', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_restart_count_inc', 'args' => [ { 'type' => 'server_rec *', 'name' => 'base_server' } ] }, { 'return_type' => 'int', 'name' => 'modperl_run', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_run_filter', 'args' => [ { 'type' => 'modperl_filter_t *', 'name' => 'filter' } ] }, { 'return_type' => 'char *', 'name' => 'modperl_server_desc', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_server_pool', 'args' => [] }, { 'return_type' => 'apr_pool_t *', 'name' => 'modperl_server_user_pool', 'args' => [] }, { 'return_type' => 'void', 'name' => 'modperl_set_perl_module_config', 'args' => [ { 'type' => 'ap_conf_vector_t *', 'name' => 'cv' }, { 'type' => 'void *', 'name' => 'cfg' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_slurp_filename', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'int', 'name' => 'tainted' } ] }, { 'return_type' => 'int', 'name' => 'modperl_spawn_proc_prog', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'command' }, { 'type' => 'const char ***', 'name' => 'argv' }, { 'type' => 'apr_file_t **', 'name' => 'script_in' }, { 'type' => 'apr_file_t **', 'name' => 'script_out' }, { 'type' => 'apr_file_t **', 'name' => 'script_err' } ] }, { 'return_type' => 'PerlInterpreter *', 'name' => 'modperl_startup', 'args' => [ { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'void', 'name' => 'modperl_str_toupper', 'args' => [ { 'type' => 'char *', 'name' => 'str' } ] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_sv2request_rec', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'server_rec *', 'name' => 'modperl_sv2server_rec', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_clear', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_svptr_table_clone', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PerlInterpreter *', 'name' => 'proto_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'source' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_delete', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'key' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_destroy', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'void *', 'name' => 'modperl_svptr_table_fetch', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_free', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'PTR_TBL_t *', 'name' => 'modperl_svptr_table_new', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_split', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_svptr_table_store', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'PTR_TBL_t *', 'name' => 'tbl' }, { 'type' => 'void *', 'name' => 'oldv' }, { 'type' => 'void *', 'name' => 'newv' } ] }, { 'return_type' => 'int', 'name' => 'modperl_sys_dlclose', 'args' => [ { 'type' => 'void *', 'name' => 'handle' } ] }, { 'return_type' => 'int', 'name' => 'modperl_sys_is_dir', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'SV *', 'name' => 'modperl_table_get_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'table' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'sv_val' }, { 'type' => 'int', 'name' => 'do_taint' } ] }, { 'return_type' => 'int', 'name' => 'modperl_threaded_mpm', 'args' => [] }, { 'return_type' => 'int', 'name' => 'modperl_threads_started', 'args' => [] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'modperl_thx_interp_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'thx' } ] }, { 'return_type' => 'void', 'name' => 'modperl_thx_interp_set', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'thx' }, { 'type' => 'modperl_interp_t *', 'name' => 'interp' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_add', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_destroy', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_init', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'modperl_tipool_t *', 'name' => 'modperl_tipool_new', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tipool_config_t *', 'name' => 'cfg' }, { 'type' => 'void *', 'name' => 'func' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_tipool_pop', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_putback', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_list_t *', 'name' => 'listp' }, { 'type' => 'int', 'name' => 'num_requests' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_putback_data', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'int', 'name' => 'num_requests' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tipool_remove', 'args' => [ { 'type' => 'modperl_tipool_t *', 'name' => 'tipool' }, { 'type' => 'modperl_list_t *', 'name' => 'listp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_create', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tls_t **', 'name' => 'key' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_create_request_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_get', 'args' => [ { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void **', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_get_request_rec', 'args' => [ { 'type' => 'request_rec * *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tls_reset_cleanup', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_tls_reset_cleanup_request_rec', 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'request_rec *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_set', 'args' => [ { 'type' => 'modperl_tls_t *', 'name' => 'key' }, { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_tls_set_request_rec', 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace', 'args' => [ { 'type' => 'const char *', 'name' => 'func' }, { 'type' => 'const char *', 'name' => 'fmt' }, { 'type' => '...', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_level_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile' }, { 'type' => 'const char *', 'name' => 'level' } ] }, { 'return_type' => 'void', 'name' => 'modperl_trace_logfile_set', 'args' => [ { 'type' => 'apr_file_t *', 'name' => 'logfile_new' } ] }, { 'return_type' => 'int', 'name' => 'modperl_trans_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'modperl_type_handler', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'modperl_uri_t *', 'name' => 'modperl_uri_new', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'apr_pool_t *', 'name' => 'p' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_flush', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'int', 'name' => 'add_flush_bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_pass', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'int', 'name' => 'add_flush_bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'modperl_wbucket_write', 'attr' => [ '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'modperl_wbucket_t *', 'name' => 'b' }, { 'type' => 'const char *', 'name' => 'buf' }, { 'type' => 'apr_size_t *', 'name' => 'wlen' } ] }, { 'return_type' => 'void', 'name' => 'modperl_xs_dl_handles_clear', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'modperl_xs_dl_handles_close', 'args' => [ { 'type' => 'void **', 'name' => 'handles' } ] }, { 'return_type' => 'void **', 'name' => 'modperl_xs_dl_handles_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'request_rec *', 'name' => 'modperl_xs_sv2request_rec', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'char *', 'name' => 'classname' }, { 'type' => 'CV *', 'name' => 'cv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_cleanup', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_concat', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'a' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_destroy', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_first', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Brigade_flatten', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_insert_head', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Brigade_insert_tail', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Brigade_is_empty', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_last', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Brigade_length', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'int', 'name' => 'read_all' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_next', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_pool_t *', 'name' => 'mpxs_APR__Brigade_pool', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Brigade_prev', 'args' => [ { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__BucketAlloc_new', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_insert_after', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_insert_before', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'a' }, { 'type' => 'apr_bucket *', 'name' => 'b' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Bucket_is_eos', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Bucket_is_flush', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_bucket *', 'name' => 'mpxs_APR__Bucket_new', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'list' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Bucket_read', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_bucket *', 'name' => 'bucket' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_read_type_e', 'name' => 'block' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Bucket_remove', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_bucket *', 'name' => 'bucket' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_APR__Bucket_setaside', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'b_sv' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Finfo_stat', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'fname' }, { 'type' => 'apr_int32_t', 'name' => 'wanted' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'unsigned long', 'name' => 'mpxs_APR__OS_current_thread_id', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Pool_clear', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Socket_fileno', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' } ] }, { 'return_type' => 'apr_int32_t', 'name' => 'mpxs_APR__Socket_opt_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_int32_t', 'name' => 'opt' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Socket_opt_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_int32_t', 'name' => 'opt' }, { 'type' => 'apr_int32_t', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_APR__Socket_poll', 'args' => [ { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_pool_t *', 'name' => 'pool' }, { 'type' => 'apr_interval_time_t', 'name' => 'timeout' }, { 'type' => 'apr_int16_t', 'name' => 'reqevents' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Socket_recv', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_APR__Socket_timeout_set', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'apr_interval_time_t', 'name' => 't' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__String_strfsize', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_off_t', 'name' => 'size' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_APR__Table_EXISTS', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'apr_table_t *', 'name' => 't' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_APR__Table_FETCH', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'const char *', 'name' => 'key' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_APR__Table_NEXTKEY', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'tsv' }, { 'type' => 'SV *', 'name' => 'key' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_copy', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'base' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_make', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'int', 'name' => 'nelts' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__Table_overlay', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_table_t *', 'name' => 'base' }, { 'type' => 'apr_table_t *', 'name' => 'overlay' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_APR__URI_port', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'uri' }, { 'type' => 'SV *', 'name' => 'portsv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_APR__URI_rpath', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'apr_uri' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__CmdParms_add_config', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__CmdParms_info', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__CmdParms_override_opts', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'cmd_parms *', 'name' => 'parms' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_add_input_filter', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_add_output_filter', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'apr_socket_t *', 'name' => 'mpxs_Apache2__Connection_client_socket', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'apr_socket_t *', 'name' => 's' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__Connection_get_remote_host', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'int', 'name' => 'type' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'dir_config' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Connection_pnotes', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Connection_pnotes_kill', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'conn_rec *', 'name' => 'c' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Directive_as_hash', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_directive_t *', 'name' => 'tree' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Directive_as_string', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_directive_t *', 'name' => 'self' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Filter_ctx', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'SV *', 'name' => 'data' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_fflush', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'filter' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'brigade' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_get_brigade', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' }, { 'type' => 'ap_input_mode_t', 'name' => 'mode' }, { 'type' => 'apr_read_type_e', 'name' => 'block' }, { 'type' => 'apr_off_t', 'name' => 'readbytes' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__Filter_pass_brigade', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'ap_filter_t *', 'name' => 'f' }, { 'type' => 'apr_bucket_brigade *', 'name' => 'bb' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__Filter_print', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__Filter_read', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Filter_remove', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Filter_seen_eos', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Log_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Log_log', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'int', 'name' => 'logtype' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__MPM_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__MPM_query', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'self' }, { 'type' => 'int', 'name' => 'query_code' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__Module_add', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'package' }, { 'type' => 'SV *', 'name' => 'cmds' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_ap_api_major_version', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_ap_api_minor_version', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'module *', 'name' => 'mod' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__Module_get_config', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'pmodule' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'ap_conf_vector_t *', 'name' => 'v' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__Module_loaded', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_FILENO', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_GETC', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_OPEN', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'self' }, { 'type' => 'SV *', 'name' => 'arg1' }, { 'type' => 'SV *', 'name' => 'arg2' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_config', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'lines' }, { 'type' => 'int', 'name' => 'override' }, { 'type' => 'char *', 'name' => 'path' }, { 'type' => 'int', 'name' => 'override_options' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_input_filter', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_add_output_filter', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'callback' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_allow_override_opts', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_as_string', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_auth_name', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_auth_type', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'type' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_child_terminate', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_content_languages', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'languages' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_content_type', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'type' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_document_root', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'new_root' } ] }, { 'return_type' => 'apr_finfo_t *', 'name' => 'mpxs_Apache2__RequestRec_finfo', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_finfo_t *', 'name' => 'finfo' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_get_handlers', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'const char *', 'name' => 'mpxs_Apache2__RequestRec_handler', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_is_perl_option_enabled', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_Apache2__RequestRec_location', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_location_merge', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'location' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_new', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'conn_rec *', 'name' => 'c' }, { 'type' => 'SV *', 'name' => 'base_pool_sv' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_no_cache', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'flag' } ] }, { 'return_type' => 'apr_uri_t *', 'name' => 'mpxs_Apache2__RequestRec_parsed_uri', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_pnotes', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_pnotes_kill', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_print', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_proxyreq', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_push_handlers', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_read', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_rflush', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_Apache2__RequestRec_sendfile', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'filename' }, { 'type' => 'apr_off_t', 'name' => 'offset' }, { 'type' => 'apr_size_t', 'name' => 'len' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__RequestRec_set_basic_credentials', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'username' }, { 'type' => 'char *', 'name' => 'password' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__RequestRec_set_handlers', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => '', 'name' => 'mpxs_Apache2__RequestRec_set_last_modified', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'apr_time_t', 'name' => 'mtime' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__RequestRec_subprocess_env', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'key' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_Apache2__RequestRec_write', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'apr_size_t', 'name' => 'len' }, { 'type' => 'apr_off_t', 'name' => 'offset' } ] }, { 'return_type' => 'request_rec *', 'name' => 'mpxs_Apache2__RequestUtil_request', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'svr' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerRec_add_config', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'SV *', 'name' => 'lines' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_Apache2__ServerRec_get_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_is_perl_option_enabled', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_is_virtual', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'SV *', 'name' => 'val' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_loglevel', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'int', 'name' => 'loglevel' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_push_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_Apache2__ServerRec_set_handlers', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'server_rec *', 'name' => 's' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'sv' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerUtil_BOOT', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_Apache2__ServerUtil_server_shutdown_cleanup_register', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'cv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_call', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_clear', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ModPerl__Global_special_list_register', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ModPerl__Util_untaint', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ap_allow_methods', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'long', 'name' => 'mpxs_ap_get_client_block', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'SV *', 'name' => 'buffer' }, { 'type' => 'int', 'name' => 'bufsiz' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_ap_log_error', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'int', 'name' => 'level' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'msg' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_ap_register_auth_provider', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_ap_requires', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_ap_rprintf', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_ap_run_sub_req', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_ap_rvputs', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_ap_unescape_url', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'url' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_base64_decode', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_base64_encode', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'sv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_brigade_create', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'apr_bucket_alloc_t *', 'name' => 'ba' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_ipsubnet_create', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'const char *', 'name' => 'ipstr' }, { 'type' => 'const char *', 'name' => 'mask_or_numbits' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_password_validate', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'passwd' }, { 'type' => 'const char *', 'name' => 'hash' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_pool_DESTROY', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'obj' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_pool_cleanup', 'args' => [ { 'type' => 'void *', 'name' => 'cleanup_data' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_apr_pool_cleanup_register', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'p' }, { 'type' => 'SV *', 'name' => 'cv' }, { 'type' => 'SV *', 'name' => 'arg' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_pool_create', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'parent_pool_obj' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_pool_parent_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_pool_t *', 'name' => 'child_pool' } ] }, { 'return_type' => '', 'name' => 'mpxs_apr_sockaddr_ip_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_sockaddr_t *', 'name' => 'sockaddr' } ] }, { 'return_type' => 'apr_size_t', 'name' => 'mpxs_apr_socket_send', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_socket_t *', 'name' => 'socket' }, { 'type' => 'SV *', 'name' => 'sv_buf' }, { 'type' => 'SV *', 'name' => 'sv_len' } ] }, { 'return_type' => 'apr_interval_time_t', 'name' => 'mpxs_apr_socket_timeout_get', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_table_do', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'I32', 'name' => 'items' }, { 'type' => 'SV **', 'name' => 'mark' }, { 'type' => 'SV **', 'name' => 'sp' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_apr_table_do_cb', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'void *', 'name' => 'data' }, { 'type' => 'const char *', 'name' => 'key' }, { 'type' => 'const char *', 'name' => 'val' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_thread_mutex_create', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'unsigned int', 'name' => 'flags' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_thread_rwlock_create', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' } ] }, { 'return_type' => 'SV *', 'name' => 'mpxs_apr_uri_parse', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'classname' }, { 'type' => 'SV *', 'name' => 'p_sv' }, { 'type' => 'const char *', 'name' => 'uri_string' } ] }, { 'return_type' => 'char *', 'name' => 'mpxs_apr_uri_unparse', 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'apr_uri_t *', 'name' => 'uptr' }, { 'type' => 'unsigned', 'name' => 'flags' } ] }, { 'return_type' => 'apr_uuid_t *', 'name' => 'mpxs_apr_uuid_get', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' } ] }, { 'return_type' => 'apr_uuid_t *', 'name' => 'mpxs_apr_uuid_parse', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'CLASS' }, { 'type' => 'char *', 'name' => 'buf' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_cleanup_run', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'void *', 'name' => 'data' } ] }, { 'return_type' => 'void', 'name' => 'mpxs_insert_auth_cfg', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'request_rec *', 'name' => 'r' }, { 'type' => 'char *', 'name' => 'directive' }, { 'type' => 'char *', 'name' => 'val' } ] }, { 'return_type' => 'apr_status_t', 'name' => 'mpxs_setup_client_block', 'args' => [ { 'type' => 'request_rec *', 'name' => 'r' } ] }, { 'return_type' => 'int', 'name' => 'mpxs_special_list_do', 'attr' => [ 'static' ], 'args' => [ { 'type' => 'PerlInterpreter*', 'name' => 'my_perl' }, { 'type' => 'const char *', 'name' => 'name' }, { 'type' => 'SV *', 'name' => 'package' }, { 'type' => 'mpxs_special_list_do_t', 'name' => 'func' } ] }, { 'return_type' => 'modperl_interp_t *', 'name' => 'mpxs_ModPerl__Interpreter_current', 'attr' => [ 'static', '__inline__' ], 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' }, { 'type' => 'SV *', 'name' => 'class' } ] } ]; 1; mod_perl-2.0.9/xs/typemap0000644000177200010010000000436212540623211014120 0ustar SteveNoneTYPEMAP void * T_VPTR char_len * T_CHAR_LEN const char_len * T_CONST_CHAR_LEN ###################################################################### OUTPUT T_POOLOBJ sv_setref_pv($arg, \"${ntype}\", (void*)$var); T_APACHEOBJ sv_setref_pv($arg, \"${ntype}\", (void*)$var); T_HASHOBJ $arg = modperl_hash_tie(aTHX_ \"${ntype}\", $arg, $var); T_VPTR sv_setiv($arg, PTR2IV($var)); T_UVPTR sv_setuv($arg, PTR2UV($var)); T_APR_TIME sv_setnv($arg, (NV)(apr_time_sec($var))); T_UVOBJ modperl_perl_sv_setref_uv(aTHX_ $arg, \"${ntype}\", (UV)$var); ###################################################################### INPUT T_PTROBJ if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) { IV tmp = SvIV((SV*)SvRV($arg)); $var = INT2PTR($type, tmp); } else { Perl_croak(aTHX_ SvROK($arg) ? \"$var is not of type ${ntype}\" : \"$var is not a blessed reference\"); } T_POOLOBJ if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) { IV tmp = SvIV((SV*)SvRV($arg)); if (tmp == 0) { Perl_croak(aTHX_ \"invalid pool object (already destroyed?)\"); } $var = INT2PTR($type, tmp); } else { Perl_croak(aTHX_ SvROK($arg) ? \"$var is not of type ${ntype}\" : \"$var is not a blessed reference\"); } T_UVOBJ if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) { UV tmp = SvUV((SV*)SvRV($arg)); $var = INT2PTR($type, tmp); } else { Perl_croak(aTHX_ SvROK($arg) ? \"$var is not of type ${ntype}\" : \"$var is not a blessed reference\"); } T_APACHEOBJ $var = modperl_xs_sv2request_rec(aTHX_ $arg, \"$ntype\", cv) T_HASHOBJ $var = modperl_hash_tied_object(aTHX_ \"${ntype}\", $arg) T_APACHEREF $var = modperl_xs_sv2request_rec(aTHX_ $arg, \"$ntype\", cv) T_VPTR $var = INT2PTR($type, SvIV(SvROK($arg) ? SvRV($arg) : $arg)) T_UVPTR $var = INT2PTR($type, SvUV(SvROK($arg) ? SvRV($arg) : $arg)) T_APR_TIME $var = (apr_time_t)(apr_time_from_sec(SvNV($arg))) T_CHAR_LEN $var = (char *)SvPV($arg, ${var}_len) T_CONST_CHAR_LEN $var = (const char *)SvPV($arg, ${var}_len)

Please install the } . qq{$module module.

FYI: Porting CPAN modules to mod_perl 2.0 Status