diff --git a/Bug.pm b/Bug.pm index 9e8e44c55bfbcbd7da31f65ada9d12218d2abff1..94bd628e2498d4f8b124724e594fc6c43925742b 100755 --- a/Bug.pm +++ b/Bug.pm @@ -140,7 +140,7 @@ sub initBug { reporter, bug_file_loc, short_desc, target_milestone, qa_contact, status_whiteboard, DATE_FORMAT(creation_ts,'%Y.%m.%d %H:%i'), - delta_ts, sum(votes.count), + delta_ts, ifnull(sum(votes.vote_count),0), reporter_accessible, cclist_accessible, estimated_time, remaining_time from bugs left join votes using(bug_id), diff --git a/Bugzilla.pm b/Bugzilla.pm index cded650d7df659f6cd73c9368ea522aa8b872d5f..871b76a54502d98de24f2ef0a5a858b58c9168da 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -61,7 +61,7 @@ sub login { # $::COOKIE{'Bugzilla_login'} from a userid to a loginname # (for backwards compat) if (defined $_user) { - return $_user->{id}; + return $_user; } $type = LOGIN_NORMAL unless defined $type; @@ -77,17 +77,15 @@ sub login { # Compat stuff $::userid = $userid; - &::ConfirmGroup($userid); # Evil compat hack. The cookie stores the id now, not the name, but # old code still looks at this to get the current user's email # so it needs to be set. - $::COOKIE{'Bugzilla_login'} = $_user->{email}; - - $::vars->{'user'} = &::GetUserInfo($userid); + $::COOKIE{'Bugzilla_login'} = $_user->login; } else { # Old compat stuff + undef $_user; $::userid = 0; delete $::COOKIE{'Bugzilla_login'}; delete $::COOKIE{'Bugzilla_logincookie'}; @@ -97,7 +95,12 @@ sub login { # - use Bugzilla->user instead! } - return $userid || 0; + return $_user; +} + +sub logout { + undef $_user; + $::userid = 0; } my $_dbh; @@ -257,8 +260,16 @@ or if the login code has not yet been run. =item C<login> -Logs in a user, returning the userid, or C<0> if there is no logged in user. -See L<Bugzilla::Auth>. +Logs in a user, returning a C<Bugzilla::User> object, or C<undef> if there is +no logged in user. See L<Bugzilla::Auth|Bugzilla::Auth> and +L<Bugzilla::User|Bugzilla::User>. + +=item C<logout> + +Logs out the current user. For the moment, this will just cause calls to +C<user> to return C<undef>. Eventually this will handle deleting cookies from +the browser and values from the database, which is currently all handled +by C<relogin.cgi>. =item C<dbh> diff --git a/Bugzilla/Auth.pm b/Bugzilla/Auth.pm index 902ae0f0515bc3fcc1db99677e6aa44842c3b057..21d4409604a64bada0c03171d4db824fe52fa809 100644 --- a/Bugzilla/Auth.pm +++ b/Bugzilla/Auth.pm @@ -29,6 +29,12 @@ use Bugzilla::Constants; # 'inherit' from the main loginmethod BEGIN { my $loginmethod = Param("loginmethod"); + if ($loginmethod =~ /^([A-Za-z0-9_\.\-]+)$/) { + $loginmethod = $1; + } + else { + die "Badly-named loginmethod '$loginmethod'"; + } require "Bugzilla/Auth/" . $loginmethod . ".pm"; our @ISA; diff --git a/Bugzilla/Auth/CGI.pm b/Bugzilla/Auth/CGI.pm index 034013bda0279a71c07ba1871dcae5fb611348fd..e223c9fee5a387e0e46dd477556c14ba236d62f6 100644 --- a/Bugzilla/Auth/CGI.pm +++ b/Bugzilla/Auth/CGI.pm @@ -32,6 +32,7 @@ use strict; use Bugzilla::Config; use Bugzilla::Constants; +use Bugzilla::Error; use Bugzilla::Util; sub login { @@ -70,9 +71,13 @@ sub login { undef, $userid, $ipaddr); my $logincookie = $dbh->selectrow_array("SELECT LAST_INSERT_ID()"); - my $cookiepath = Param("cookiepath"); - print "Set-Cookie: Bugzilla_login=$userid ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; - print "Set-Cookie: Bugzilla_logincookie=$logincookie ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; + + $cgi->send_cookie(-name => 'Bugzilla_login', + -value => $userid, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); + $cgi->send_cookie(-name => 'Bugzilla_logincookie', + -value => $logincookie, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); # compat code. The cookie value is used for logouts, and that # isn't generic yet. @@ -98,12 +103,12 @@ sub login { # An error may have occurred with the login mechanism if ($authres == AUTH_ERROR) { - $::vars->{'authmethod'} = lc($authmethod); - $::vars->{'userid'} = $userid; - $::vars->{'auth_err_tag'} = $extra; - $::vars->{'info'} = $info; - - &::ThrowCodeError("auth_err"); + ThrowCodeError("auth_err", + { authmethod => lc($authmethod), + userid => $userid, + auth_err_tag => $extra, + info => $info + }); } # We can load the page if the login was ok, or there was no data @@ -120,7 +125,7 @@ sub login { if ($authres == AUTH_NODATA && $type == LOGIN_REQUIRED) { # Throw up the login page - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); my $template = Bugzilla->template; $template->process("account/auth/login.html.tmpl", @@ -130,7 +135,7 @@ sub login { 'caneditaccount' => Bugzilla::Auth->can_edit, } ) - || &::ThrowTemplateError($template->error()); + || ThrowTemplateError($template->error()); # This seems like as good as time as any to get rid of old # crufty junk in the logincookies table. Get rid of any entry @@ -146,26 +151,29 @@ sub login { # the password was just wrong. (This makes it harder for a cracker # to find account names by brute force) if ($authres == AUTH_LOGINFAILED) { - &::ThrowUserError("invalid_username_or_password"); + ThrowUserError("invalid_username_or_password"); } # The account may be disabled if ($authres == AUTH_DISABLED) { # Clear the cookie - my $cookiepath = Param("cookiepath"); - print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n"; - print "Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n"; + + $cgi->send_cookie(-name => 'Bugzilla_login', + -expires => "Tue, 15-Sep-1998 21:49:00 GMT"); + $cgi->send_cookie(-name => 'Bugzilla_logincookie', + -expires => "Tue, 15-Sep-1998 21:49:00 GMT"); + # and throw a user error - &::ThrowUserError("account_disabled", - {'disabled_reason' => $extra}); + ThrowUserError("account_disabled", + {'disabled_reason' => $extra}); } # If we get here, then we've run out of options, which shouldn't happen - &::ThrowCodeError("authres_unhandled", - { authres => $authres, - type => $type, - } - ); + ThrowCodeError("authres_unhandled", + { authres => $authres, + type => $type, + } + ); } diff --git a/Bugzilla/Auth/CVS/Entries b/Bugzilla/Auth/CVS/Entries index e01083adca8a6ec33811d5ed6af9e7708d07a9dc..0e723439d5016af94a16310789d81da7719ccb5d 100644 --- a/Bugzilla/Auth/CVS/Entries +++ b/Bugzilla/Auth/CVS/Entries @@ -1,5 +1,5 @@ -/CGI.pm/1.2/Fri Apr 18 23:53:51 2003//TBUGZILLA-2_17_4 -/Cookie.pm/1.1/Sat Mar 22 04:47:18 2003//TBUGZILLA-2_17_4 -/DB.pm/1.1/Sat Mar 22 04:47:18 2003//TBUGZILLA-2_17_4 -/LDAP.pm/1.2/Sat Apr 5 02:21:54 2003//TBUGZILLA-2_17_4 +/CGI.pm/1.4/Sun Sep 14 06:05:21 2003//TBUGZILLA-2_17_5 +/Cookie.pm/1.1/Sat Mar 22 04:47:18 2003//TBUGZILLA-2_17_5 +/DB.pm/1.3/Sun Oct 26 05:43:29 2003//TBUGZILLA-2_17_5 +/LDAP.pm/1.4/Mon Jul 14 13:35:12 2003//TBUGZILLA-2_17_5 D diff --git a/Bugzilla/Auth/CVS/Tag b/Bugzilla/Auth/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/Bugzilla/Auth/CVS/Tag +++ b/Bugzilla/Auth/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/Bugzilla/Auth/DB.pm b/Bugzilla/Auth/DB.pm index 55e4bc7c020d105db29cce7d3c351dd814c58ced..29fbc6fa452475926761f5d130036eee75c09e4a 100644 --- a/Bugzilla/Auth/DB.pm +++ b/Bugzilla/Auth/DB.pm @@ -71,7 +71,7 @@ sub authenticate { # Now we know that the user has logged in successfully, # so delete any password tokens for them require Token; - Token::DeletePasswordTokens("user logged in"); + Token::DeletePasswordTokens($userid, "user_logged_in"); # The user may have had their account disabled return (AUTH_DISABLED, $userid, $disabledtext) @@ -89,7 +89,7 @@ __END__ =head1 NAME -Bugzilla::DB - database authentication for Bugzilla +Bugzilla::Auth::DB - database authentication for Bugzilla =head1 SUMMARY diff --git a/Bugzilla/Auth/LDAP.pm b/Bugzilla/Auth/LDAP.pm index 8d2f03fbcb2ad21a254a0aa65aa8b805b1f5458c..c34c3698fe3d9d9f9575f05f31dff9ea8e1eb1ea 100644 --- a/Bugzilla/Auth/LDAP.pm +++ b/Bugzilla/Auth/LDAP.pm @@ -78,13 +78,13 @@ sub authenticate { if($mesg->code) { return (AUTH_ERROR, undef, "connect_failed", - { errstr => $mesg->err }); + { errstr => $mesg->error }); } # We've got our anonymous bind; let's look up this user. $mesg = $LDAPconn->search( base => Param("LDAPBaseDN"), scope => "sub", - filter => Param("LDAPuidattribute") . "=$username", + filter => '(&(' . Param("LDAPuidattribute") . "=$username)" . Param("LDAPfilter") . ')', attrs => ['dn'], ); return (AUTH_LOGINFAILED, undef, "lookup_failure") @@ -102,7 +102,7 @@ sub authenticate { # mail attribute for this user. $mesg = $LDAPconn->search( base => Param("LDAPBaseDN"), scope => "sub", - filter => Param("LDAPuidattribute") . "=$username", + filter => '(&(' . Param("LDAPuidattribute") . "=$username)" . Param("LDAPfilter") . ')', ); my $user_entry = $mesg->shift_entry if !$mesg->code && $mesg->count; if(!$user_entry || !$user_entry->exists(Param("LDAPmailattribute"))) { diff --git a/Bugzilla/BugMail.pm b/Bugzilla/BugMail.pm index 55c88004b8d6fb8f10ef78ad72df4cb10b87dc3d..7937fe1765a5ea3c6c13c9db0e3cdc755a73d129 100644 --- a/Bugzilla/BugMail.pm +++ b/Bugzilla/BugMail.pm @@ -107,18 +107,10 @@ END sub Send($;$) { my ($id, $recipients) = (@_); - # This doesn't work if its not in a sub. Probably something to do with the + # This only works in a sub. Probably something to do with the # require abuse we do. GetVersionTable(); - # Since any email recipients must be rederived if the user has not - # been rederived since the most recent group change, figure out when that - # is once and determine the need to rederive users using the same DB - # access that gets the user's email address each time a person is - # processed. - SendSQL("SELECT MAX(last_changed) FROM groups"); - ($last_changed) = FetchSQLData(); - # Make sure to clean up _all_ package vars here. Yuck... $nametoexclude = $recipients->{'changer'} || ""; @{$force{'CClist'}} = (exists $recipients->{'cc'} && @@ -518,10 +510,10 @@ sub getEmailAttributes (\%\@$) { push (@flags, 'CC'); } - # These next few lines are for finding out who's been added - # to the Owner, QA, CC, etc. fields. It does not effect - # the @flags array at all, but is run here because it does - # effect filtering later and we're already in the loop. + # These next few lines find out who has been added + # to the Owner, QA, CC, etc. fields. They do not affect + # the @flags array at all, but are run here because they + # affect filtering later and we're already in the loop. if ($fieldName eq 'AssignedTo') { push (@{$force{'Owner'}}, $new); } elsif ($fieldName eq 'QAcontact') { @@ -563,9 +555,9 @@ sub getEmailAttributes (\%\@$) { sub filterEmailGroup ($$$) { # This function figures out who should receive email about the bug - # based on the user's role with regard to the bug (assignee, reporter + # based on the user's role with respect to the bug (assignee, reporter, # etc.), the changes that occurred (new comments, attachment added, - # status changed etc.) and the user's email preferences. + # status changed, etc.) and the user's email preferences. # Returns a filtered list of those users who would receive email # about these changes, and adds the names of those users who would @@ -577,7 +569,7 @@ sub filterEmailGroup ($$$) { my @users = split( /,/ , $users ); # Treat users who are in the process of being removed from this role - # as if they were still in it. + # as if they still have it. push @users, @{$force{$role}}; # If this installation supports user watching, add to the list those @@ -607,7 +599,7 @@ sub filterEmailGroup ($$$) { # (no idea why unregistered users should even be on this list, # but the code that was here before I re-wrote it allows this), # then we do not have any preferences for them, so assume the - # default preference to receive all mail for any reason. + # default preference is to receive all mail. my $userid = DBname_to_id($user); if (!$userid) { push(@recipients, $user); @@ -618,10 +610,10 @@ sub filterEmailGroup ($$$) { SendSQL("SELECT emailflags FROM profiles WHERE userid = $userid"); my $prefs = FetchOneColumn(); - # If the user's preferences are empty, assume the default preference - # to receive all mail. This happens when the installation upgraded - # from a version of Bugzilla without email preferences to one with - # them, but the user has not set their preferences yet. + # If the user's preferences are empty, it means the user has not set + # their mail preferences after the installation upgraded from a + # version of Bugzilla without email preferences to one with them. In + # this case, assume they want to receive all mail. if (!defined($prefs) || $prefs !~ /email/) { push(@recipients, $user); next; @@ -637,7 +629,7 @@ sub filterEmailGroup ($$$) { # If this user is the one who made the change in the first place, # and they prefer not to receive mail about their own changes, # filter them from the list. - if (lc($user) eq $nametoexclude && $prefs{'ExcludeSelf'} eq 'on') { + if (lc($user) eq lc($nametoexclude) && $prefs{'ExcludeSelf'} eq 'on') { push(@excludedAddresses, $user); next; } @@ -710,19 +702,13 @@ sub NewProcessOnePerson ($$$$$$$$$$$$$) { return; } - - SendSQL("SELECT userid, (refreshed_when > " . SqlQuote($last_changed) . - ") FROM profiles WHERE login_name = " . SqlQuote($person)); - my ($userid, $current) = (FetchSQLData()); + # This routine should really get passed a userid + # This rederives groups as a side effect + my $user = Bugzilla::User->new_from_login($person); + my $userid = $user->id; $seen{$person} = 1; - detaint_natural($userid); - - if (!$current) { - DeriveGroup($userid); - } - # if this person doesn't have permission to see info on this bug, # return. # @@ -732,15 +718,14 @@ sub NewProcessOnePerson ($$$$$$$$$$$$$) { # quietly disappear from their radar. # return unless CanSeeBug($id, $userid); - # Drop any non-insiders if the comment is private - return if (Param("insidergroup") && + return if (Param("insidergroup") && ($anyprivate != 0) && - (!UserInGroup(Param("insidergroup"), $userid))); + (!$user->groups->{Param("insidergroup")})); # We shouldn't send changedmail if this is a dependency mail, and any of - # the depending bugs is not visible to the user. + # the depending bugs are not visible to the user. foreach my $dep_id (@depbugs) { my $save_id = $dep_id; detaint_natural($dep_id) || warn("Unexpected Error: \@depbugs contains a non-numeric value: '$save_id'") @@ -759,10 +744,10 @@ sub NewProcessOnePerson ($$$$$$$$$$$$$) { if (! $value) { next; } - # Don't send estimated_time if user not in the group, or not enabled + # Only send estimated_time if it is enabled and the user is in the group if ($f ne 'estimated_time' || - UserInGroup(Param('timetrackinggroup'), $userid)) { - + $user->groups->{Param('timetrackinggroup')}) { + my $desc = $fielddescription{$f}; $head .= FormatDouble($desc, $value); } @@ -781,7 +766,7 @@ sub NewProcessOnePerson ($$$$$$$$$$$$$) { ($diff->{'fieldname'} eq 'estimated_time' || $diff->{'fieldname'} eq 'remaining_time' || $diff->{'fieldname'} eq 'work_time')) { - if (UserInGroup(Param("timetrackinggroup"), $userid)) { + if ($user->groups->{Param("timetrackinggroup")}) { $add_diff = 1; } } else { @@ -846,7 +831,7 @@ sub NewProcessOnePerson ($$$$$$$$$$$$$) { # since if the bug didn't change, you wouldn't be getting mail # in the first place! see http://bugzilla.mozilla.org/show_bug.cgi?id=29820 # for details. - $substs{"neworchanged"} = $isnew ? 'New: ' : ''; + $substs{"neworchanged"} = $isnew ? ' New: ' : ''; $substs{"to"} = $person; $substs{"cc"} = ''; $substs{"bugid"} = $id; diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index 3c00ed347a2bf49ca67b1293e0ef547d2e10849a..bc70d2f32114c928382cd4eea091a4d4a008ee3d 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -23,11 +23,12 @@ use strict; package Bugzilla::CGI; -use CGI qw(-no_xhtml -oldstyle_urls :private_tempfiles); +use CGI qw(-no_xhtml -oldstyle_urls :private_tempfiles :unique_headers); use base qw(CGI); use Bugzilla::Util; +use Bugzilla::Config; # We need to disable output buffering - see bug 179174 $| = 1; @@ -44,6 +45,9 @@ sub new { my $self = $class->SUPER::new(@args); + # Make sure that we don't send any charset headers + $self->charset(''); + # Check for errors # All of the Bugzilla code wants to do this, so do it here instead of # in each script @@ -62,20 +66,18 @@ sub new { # multipart requests, and so should never happen unless there is a # browser bug. - # Using CGI.pm to do this means that ThrowCodeError prints the - # content-type again... - #print $self->header(-status => $err); - print "Status: $err\n"; - - my $vars = {}; - if ($err =~ m/(\d{3})\s(.*)/) { - $vars->{http_error_code} = $1; - $vars->{http_error_string} = $2; - } else { - $vars->{http_error_string} = $err; - } - - &::ThrowCodeError("cgi_error", $vars); + print $self->header(-status => $err); + + # ThrowCodeError wants to print the header, so it grabs Bugzilla->cgi + # which creates a new Bugzilla::CGI object, which fails again, which + # ends up here, and calls ThrowCodeError, and then recurses forever. + # So don't use it. + # In fact, we can't use templates at all, because we need a CGI object + # to determine the template lang as well as the current url (from the + # template) + # Since this is an internal error which indicates a severe browser bug, + # just die. + die "CGI parsing error: $err"; } return $self; @@ -105,6 +107,41 @@ sub canonicalise_query { return join("&", @parameters); } +# CGI.pm makes this nph, but apache doesn't like that +sub multipart_init { + my $self = shift; + + unshift(@_, '-nph' => undef); + + return $self->SUPER::multipart_init(@_); +} + +# The various parts of Bugzilla which create cookies don't want to have to +# pass them arround to all of the callers. Instead, store them locally here, +# and then output as required from |headers|. +# This is done instead of just printing the result from the script, because +# we need to use |$r->header_out| under mod_perl (which is what CGI.pm +# does, and we need to match, plus if we don't |print| anything, we can turn +# off mod_perl/Apache's header parsing for a small perf gain) +sub send_cookie { + my $self = shift; + + # Add the default path in + unshift(@_, '-path' => Param('cookiepath')); + + # Use CGI::Cookie directly, because CGI.pm's |cookie| method gives the + # current value if there isn't a -value attribute, which happens when + # we're expiring an entry. + require CGI::Cookie; + my $cookie = CGI::Cookie->new(@_); + + # XXX - mod_perl + print "Set-Cookie: $cookie\r\n"; + + return; +} + + 1; __END__ @@ -149,4 +186,16 @@ I<Bugzilla::CGI> also includes additional functions. This returns a sorted string of the parameters, suitable for use in a url. Values in C<@exclude> are not included in the result. +=item C<send_cookie> + +This routine is identical to CGI.pm's C<cookie> routine, except that the cookie +is sent to the browser, rather than returned. This should be used by all +Bugzilla code (instead of C<cookie> or the C<-cookie> argument to C<header>), +so that under mod_perl the headers can be sent correctly, using C<print> or +the mod_perl APIs as appropriate. + =back + +=head1 SEE ALSO + +L<CGI|CGI>, L<CGI::Cookie|CGI::Cookie> diff --git a/Bugzilla/CVS/Entries b/Bugzilla/CVS/Entries index f698a9713861f83cc3e61e992b6f6cb623981d49..1a9f45262ce93f3e9003d2e4416da94425d8468b 100644 --- a/Bugzilla/CVS/Entries +++ b/Bugzilla/CVS/Entries @@ -1,16 +1,18 @@ -/.cvsignore/1.1/Mon Aug 26 22:24:55 2002//TBUGZILLA-2_17_4 -/Auth.pm/1.1/Sat Mar 22 04:47:15 2003//TBUGZILLA-2_17_4 -/BugMail.pm/1.3/Tue Apr 8 23:29:35 2003//TBUGZILLA-2_17_4 -/CGI.pm/1.4/Fri Jan 10 23:51:35 2003//TBUGZILLA-2_17_4 -/Config.pm/1.15/Thu Apr 24 22:02:35 2003//TBUGZILLA-2_17_4 -/Constants.pm/1.2/Sat Mar 22 04:47:15 2003//TBUGZILLA-2_17_4 -/DB.pm/1.8/Sat Mar 22 04:47:15 2003//TBUGZILLA-2_17_4 -/Error.pm/1.1/Wed Apr 2 12:35:05 2003//TBUGZILLA-2_17_4 -/Flag.pm/1.10/Fri Apr 25 05:41:25 2003//TBUGZILLA-2_17_4 -/FlagType.pm/1.2/Fri Apr 25 05:41:27 2003//TBUGZILLA-2_17_4 -/Search.pm/1.39/Wed Apr 2 12:35:05 2003//TBUGZILLA-2_17_4 -/Template.pm/1.4/Wed Apr 9 09:29:17 2003//TBUGZILLA-2_17_4 -/User.pm/1.13/Thu Nov 28 10:49:46 2002//TBUGZILLA-2_17_4 -/Util.pm/1.10/Fri Apr 25 05:41:27 2003//TBUGZILLA-2_17_4 +/.cvsignore/1.1/Mon Aug 26 22:24:55 2002//TBUGZILLA-2_17_5 +/Auth.pm/1.2/Sat Oct 18 22:46:22 2003//TBUGZILLA-2_17_5 +/BugMail.pm/1.7/Thu Aug 14 17:49:08 2003//TBUGZILLA-2_17_5 +/CGI.pm/1.6/Fri May 9 02:32:21 2003//TBUGZILLA-2_17_5 +/Chart.pm/1.1/Wed Jun 25 23:23:10 2003//TBUGZILLA-2_17_5 +/Config.pm/1.16/Mon Nov 3 03:33:36 2003//TBUGZILLA-2_17_5 +/Constants.pm/1.3/Mon May 5 01:15:34 2003//TBUGZILLA-2_17_5 +/DB.pm/1.8/Sat Mar 22 04:47:15 2003//TBUGZILLA-2_17_5 +/Error.pm/1.4/Sun Sep 14 06:05:10 2003//TBUGZILLA-2_17_5 +/Flag.pm/1.14/Sat Oct 25 01:34:33 2003//TBUGZILLA-2_17_5 +/FlagType.pm/1.4/Sun Sep 14 06:05:10 2003//TBUGZILLA-2_17_5 +/Search.pm/1.47/Sun Nov 2 15:22:42 2003//TBUGZILLA-2_17_5 +/Series.pm/1.1/Wed Jun 25 23:23:10 2003//TBUGZILLA-2_17_5 +/Template.pm/1.12/Wed Sep 17 22:12:56 2003//TBUGZILLA-2_17_5 +/User.pm/1.16/Sun Sep 14 06:05:10 2003//TBUGZILLA-2_17_5 +/Util.pm/1.11/Fri Aug 22 13:55:16 2003//TBUGZILLA-2_17_5 D/Auth//// D/Template//// diff --git a/Bugzilla/CVS/Tag b/Bugzilla/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/Bugzilla/CVS/Tag +++ b/Bugzilla/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/Bugzilla/Chart.pm b/Bugzilla/Chart.pm new file mode 100644 index 0000000000000000000000000000000000000000..03b5e4173ae0a012e2b91190c6e4872244424298 --- /dev/null +++ b/Bugzilla/Chart.pm @@ -0,0 +1,351 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Gervase Markham <gerv@gerv.net> + +use strict; +use lib "."; + +# This module represents a chart. +# +# Note that it is perfectly legal for the 'lines' member variable of this +# class (which is an array of Bugzilla::Series objects) to have empty members +# in it. If this is true, the 'labels' array will also have empty members at +# the same points. +package Bugzilla::Chart; + +use Bugzilla::Util; +use Bugzilla::Series; + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + + # Create a ref to an empty hash and bless it + my $self = {}; + bless($self, $class); + + if ($#_ == 0) { + # Construct from a CGI object. + $self->init($_[0]); + } + else { + die("CGI object not passed in - invalid number of args \($#_\)($_)"); + } + + return $self; +} + +sub init { + my $self = shift; + my $cgi = shift; + + # The data structure is a list of lists (lines) of Series objects. + # There is a separate list for the labels. + # + # The URL encoding is: + # line0=67&line0=73&line1=81&line2=67... + # &label0=B+/+R+/+NEW&label1=... + # &select0=1&select3=1... + # &cumulate=1&datefrom=2002-02-03&dateto=2002-04-04&ctype=html... + # >=1&labelgt=Grand+Total + foreach my $param ($cgi->param()) { + # Store all the lines + if ($param =~ /^line(\d+)$/) { + foreach my $series_id ($cgi->param($param)) { + detaint_natural($series_id) + || &::ThrowCodeError("invalid_series_id"); + push(@{$self->{'lines'}[$1]}, + new Bugzilla::Series($series_id)); + } + } + + # Store all the labels + if ($param =~ /^label(\d+)$/) { + $self->{'labels'}[$1] = $cgi->param($param); + } + } + + # Store the miscellaneous metadata + $self->{'cumulate'} = $cgi->param('cumulate') ? 1 : 0; + $self->{'gt'} = $cgi->param('gt') ? 1 : 0; + $self->{'labelgt'} = $cgi->param('labelgt'); + $self->{'datefrom'} = $cgi->param('datefrom'); + $self->{'dateto'} = $cgi->param('dateto'); + + # Make sure the dates are ones we are able to interpret + foreach my $date ('datefrom', 'dateto') { + if ($self->{$date}) { + $self->{$date} = &::str2time($self->{$date}) + || ThrowUserError("illegal_date", { date => $self->{$date}}); + } + } + + # datefrom can't be after dateto + if ($self->{'datefrom'} && $self->{'dateto'} && + $self->{'datefrom'} > $self->{'dateto'}) + { + &::ThrowUserError("misarranged_dates", + {'datefrom' => $cgi->param('datefrom'), + 'dateto' => $cgi->param('dateto')}); + } +} + +# Alter Chart so that the selected series are added to it. +sub add { + my $self = shift; + my @series_ids = @_; + + # If we are going from < 2 to >= 2 series, add the Grand Total line. + if (!$self->{'gt'}) { + my $current_size = scalar($self->getSeriesIDs()); + if ($current_size < 2 && + $current_size + scalar(@series_ids) >= 2) + { + $self->{'gt'} = 1; + } + } + + # Create new Series and push them on to the list of lines. + # Note that new lines have no label; the display template is responsible + # for inventing something sensible. + foreach my $series_id (@series_ids) { + my $series = new Bugzilla::Series($series_id); + push(@{$self->{'lines'}}, [$series]); + push(@{$self->{'labels'}}, ""); + } +} + +# Alter Chart so that the selections are removed from it. +sub remove { + my $self = shift; + my @line_ids = @_; + + foreach my $line_id (@line_ids) { + if ($line_id == 65536) { + # Magic value - delete Grand Total. + $self->{'gt'} = 0; + } + else { + delete($self->{'lines'}->[$line_id]); + delete($self->{'labels'}->[$line_id]); + } + } +} + +# Alter Chart so that the selections are summed. +sub sum { + my $self = shift; + my @line_ids = @_; + + # We can't add the Grand Total to things. + @line_ids = grep(!/^65536$/, @line_ids); + + # We can't add less than two things. + return if scalar(@line_ids) < 2; + + my @series; + my $label = ""; + my $biggestlength = 0; + + # We rescue the Series objects of all the series involved in the sum. + foreach my $line_id (@line_ids) { + my @line = @{$self->{'lines'}->[$line_id]}; + + foreach my $series (@line) { + push(@series, $series); + } + + # We keep the label that labels the line with the most series. + if (scalar(@line) > $biggestlength) { + $biggestlength = scalar(@line); + $label = $self->{'labels'}->[$line_id]; + } + } + + $self->remove(@line_ids); + + push(@{$self->{'lines'}}, \@series); + push(@{$self->{'labels'}}, $label); +} + +sub data { + my $self = shift; + $self->{'_data'} ||= $self->readData(); + return $self->{'_data'}; +} + +# Convert the Chart's data into a plottable form in $self->{'_data'}. +sub readData { + my $self = shift; + my @data; + + my $series_ids = join(",", $self->getSeriesIDs()); + + # Work out the date boundaries for our data. + my $dbh = Bugzilla->dbh; + + # The date used is the one given if it's in a sensible range; otherwise, + # it's the earliest or latest date in the database as appropriate. + my $datefrom = $dbh->selectrow_array("SELECT MIN(date) FROM series_data " . + "WHERE series_id IN ($series_ids)"); + $datefrom = &::str2time($datefrom); + + if ($self->{'datefrom'} && $self->{'datefrom'} > $datefrom) { + $datefrom = $self->{'datefrom'}; + } + + my $dateto = $dbh->selectrow_array("SELECT MAX(date) FROM series_data " . + "WHERE series_id IN ($series_ids)"); + $dateto = &::str2time($dateto); + + if ($self->{'dateto'} && $self->{'dateto'} < $dateto) { + $dateto = $self->{'dateto'}; + } + + # Prepare the query which retrieves the data for each series + my $query = "SELECT TO_DAYS(date) - TO_DAYS(FROM_UNIXTIME($datefrom)), " . + "value FROM series_data " . + "WHERE series_id = ? " . + "AND date >= FROM_UNIXTIME($datefrom)"; + if ($dateto) { + $query .= " AND date <= FROM_UNIXTIME($dateto)"; + } + + my $sth = $dbh->prepare($query); + + my $gt_index = $self->{'gt'} ? scalar(@{$self->{'lines'}}) : undef; + my $line_index = 0; + + foreach my $line (@{$self->{'lines'}}) { + # Even if we end up with no data, we need an empty arrayref to prevent + # errors in the PNG-generating code + $data[$line_index] = []; + + foreach my $series (@$line) { + + # Get the data for this series and add it on + $sth->execute($series->{'series_id'}); + my $points = $sth->fetchall_arrayref(); + + foreach my $point (@$points) { + my ($datediff, $value) = @$point; + $data[$line_index][$datediff] ||= 0; + $data[$line_index][$datediff] += $value; + + # Add to the grand total, if we are doing that + if ($gt_index) { + $data[$gt_index][$datediff] ||= 0; + $data[$gt_index][$datediff] += $value; + } + } + } + + $line_index++; + } + + # Add the x-axis labels into the data structure + my $date_progression = generateDateProgression($datefrom, $dateto); + unshift(@data, $date_progression); + + if ($self->{'gt'}) { + # Add Grand Total to label list + push(@{$self->{'labels'}}, $self->{'labelgt'}); + + $data[$gt_index] ||= []; + } + + return \@data; +} + +# Flatten the data structure into a list of series_ids +sub getSeriesIDs { + my $self = shift; + my @series_ids; + + foreach my $line (@{$self->{'lines'}}) { + foreach my $series (@$line) { + push(@series_ids, $series->{'series_id'}); + } + } + + return @series_ids; +} + +# Class method to get the data necessary to populate the "select series" +# widgets on various pages. +sub getVisibleSeries { + my %cats; + + # Get all visible series + my $dbh = Bugzilla->dbh; + my $serieses = $dbh->selectall_arrayref("SELECT cc1.name, cc2.name, " . + "series.name, series.series_id " . + "FROM series " . + "LEFT JOIN series_categories AS cc1 " . + " ON series.category = cc1.category_id " . + "LEFT JOIN series_categories AS cc2 " . + " ON series.subcategory = cc2.category_id " . + "LEFT JOIN user_series_map AS ucm " . + " ON series.series_id = ucm.series_id " . + "WHERE ucm.user_id = 0 OR ucm.user_id = $::userid"); + + foreach my $series (@$serieses) { + my ($cat, $subcat, $name, $series_id) = @$series; + $cats{$cat}{$subcat}{$name} = $series_id; + } + + return \%cats; +} + +sub generateDateProgression { + my ($datefrom, $dateto) = @_; + my @progression; + + $dateto = $dateto || time(); + my $oneday = 60 * 60 * 24; + + # When the from and to dates are converted by str2time(), you end up with + # a time figure representing midnight at the beginning of that day. We + # adjust the times by 1/3 and 2/3 of a day respectively to prevent + # edge conditions in time2str(). + $datefrom += $oneday / 3; + $dateto += (2 * $oneday) / 3; + + while ($datefrom < $dateto) { + push (@progression, &::time2str("%Y-%m-%d", $datefrom)); + $datefrom += $oneday; + } + + return \@progression; +} + +sub dump { + my $self = shift; + + # Make sure we've read in our data + my $data = $self->data; + + require Data::Dumper; + print "<pre>Bugzilla::Chart object:\n"; + print Data::Dumper::Dumper($self); + print "</pre>"; +} + +1; diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm index 5f17a60871dd478b9de34c8ab67d1d42f18847b3..7e2cb513f81c3514488d694138febd49d0b7c5a9 100644 --- a/Bugzilla/Config.pm +++ b/Bugzilla/Config.pm @@ -51,7 +51,7 @@ use Bugzilla::Util; Exporter::export_ok_tags('admin', 'db'); # Bugzilla version -$Bugzilla::Config::VERSION = "2.17.4"; +$Bugzilla::Config::VERSION = "2.17.5"; use Safe; diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 5e6b5365d44b47338afac5edc32f3736ae4d914c..a1bf74ba07272d8c0d1a30e54fc528516a15f321 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -47,7 +47,8 @@ use base qw(Exporter); LOGIN_NORMAL LOGIN_REQUIRED ); - + +@Bugzilla::Constants::EXPORT_OK = qw(contenttypes); # CONSTANTS # @@ -94,4 +95,14 @@ use constant LOGIN_OPTIONAL => 0; use constant LOGIN_NORMAL => 1; use constant LOGIN_REQUIRED => 2; +use constant contenttypes => + { + "html" => "text/html" , + "rdf" => "application/xml" , + "xml" => "text/xml" , + "js" => "application/x-javascript" , + "csv" => "text/plain" , + "png" => "image/png" , + }; + 1; diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm index 64314121a6adb2d3168c53ff54530a1601eba731..e511a575c6214f47b12029185a981a132129afb5 100644 --- a/Bugzilla/Error.pm +++ b/Bugzilla/Error.pm @@ -19,33 +19,75 @@ # # Contributor(s): Bradley Baetz <bbaetz@acm.org> -use strict; - package Bugzilla::Error; +use strict; use base qw(Exporter); -@Bugzilla::Error::EXPORT = qw(ThrowUserError); +@Bugzilla::Error::EXPORT = qw(ThrowCodeError ThrowTemplateError ThrowUserError); -sub ThrowUserError { - my ($error, $vars, $unlock_tables) = @_; +use Bugzilla::Config; +use Bugzilla::Util; + +sub _throw_error { + my ($name, $error, $vars, $unlock_tables) = @_; $vars ||= {}; $vars->{error} = $error; - # Need to do this until User.pm goes in, so that the footer is correct - $vars->{user} = $::vars->{user}; - Bugzilla->dbh->do("UNLOCK TABLES") if $unlock_tables; - # XXX - mod_perl - print "Content-type: text/html\n\n" if !$::vars->{'header_done'}; + print Bugzilla->cgi->header(); + + my $template = Bugzilla->template; + $template->process($name, $vars) + || ThrowTemplateError($template->error()); + + exit; +} + +sub ThrowUserError { + _throw_error("global/user-error.html.tmpl", @_); +} + +sub ThrowCodeError { + _throw_error("global/code-error.html.tmpl", @_); +} + +sub ThrowTemplateError { + my ($template_err) = @_; + + my $vars = {}; + + $vars->{'template_error_msg'} = $template_err; + $vars->{'error'} = "template_error"; my $template = Bugzilla->template; - $template->process("global/user-error.html.tmpl", $vars) - || &::ThrowTemplateError($template->error()); + # Try a template first; but if this one fails too, fall back + # on plain old print statements. + if (!$template->process("global/code-error.html.tmpl", $vars)) { + my $maintainer = Param('maintainer'); + my $error = html_quote($vars->{'template_error_msg'}); + my $error2 = html_quote($template->error()); + print <<END; + <tt> + <p> + Bugzilla has suffered an internal error. Please save this page and + send it to $maintainer with details of what you were doing at the + time this message appeared. + </p> + <script type="text/javascript"> <!-- + document.write("<p>URL: " + document.location + "</p>"); + // --> + </script> + <p>Template->process() failed twice.<br> + First error: $error<br> + Second error: $error2</p> + </tt> +END + } exit; } @@ -86,6 +128,25 @@ error handling code will unlock the database tables. In the long term, this argument will go away, to be replaced by transactional C<rollback> calls. There is no timeframe for doing so, however. +=item C<ThrowCodeError> + +This function is used when an internal check detects an error of some sort. +This usually indicates a bug in Bugzilla, although it can occur if the user +manually constructs urls without correct parameters. + +This function's behaviour is similar to C<ThrowUserError>, except that the +template used to display errors is I<global/code-error.html.tmpl>. In addition +if the hashref used as the optional second argument contains a key I<variables> +then the contents of the hashref (which is expected to be another hashref) will +be displayed after the error message, as a debugging aid. + +=item C<ThrowTemplateError> + +This function should only be called if a C<template-<gt>process()> fails. +It tries another template first, because often one template being +broken or missing doesn't mean that they all are. But it falls back to +a print statement as a last-ditch error. + =back =head1 SEE ALSO diff --git a/Bugzilla/Flag.pm b/Bugzilla/Flag.pm index a327f292214671a02ecb0dca02fb8abd6dfa79c0..a766e9e6fecfd5f6530410fb1d874ef023709608 100644 --- a/Bugzilla/Flag.pm +++ b/Bugzilla/Flag.pm @@ -153,17 +153,17 @@ sub validate { # Make sure the flag exists. my $flag = get($id); - $flag || &::ThrowCodeError("flag_nonexistent", { id => $id }); + $flag || ThrowCodeError("flag_nonexistent", { id => $id }); # Make sure the user chose a valid status. grep($status eq $_, qw(X + - ?)) - || &::ThrowCodeError("flag_status_invalid", - { id => $id , status => $status }); + || ThrowCodeError("flag_status_invalid", + { id => $id, status => $status }); # Make sure the user didn't request the flag unless it's requestable. if ($status eq '?' && !$flag->{type}->{is_requestable}) { ThrowCodeError("flag_status_invalid", - { id => $id , status => $status }); + { id => $id, status => $status }); } # Make sure the requestee is authorized to access the bug. @@ -177,18 +177,14 @@ sub validate { if ($requestee_email ne $flag->{'requestee'}->{'email'}) { # We know the requestee exists because we ran # Bugzilla::User::match_field before getting here. - # ConfirmGroup makes sure their group settings - # are up-to-date or calls DeriveGroups to update them. - my $requestee_id = &::DBname_to_id($requestee_email); - &::ConfirmGroup($requestee_id); + my $requestee = Bugzilla::User->new_from_login($requestee_email); # Throw an error if the user can't see the bug. - if (!&::CanSeeBug($bug_id, $requestee_id)) + if (!&::CanSeeBug($bug_id, $requestee->id)) { ThrowUserError("flag_requestee_unauthorized", { flag_type => $flag->{'type'}, - requestee => - new Bugzilla::User($requestee_id), + requestee => $requestee, bug_id => $bug_id, attach_id => $flag->{target}->{attachment}->{id} }); @@ -198,13 +194,12 @@ sub validate { # the requestee isn't in the group of insiders who can see it. if ($flag->{target}->{attachment}->{exists} && $data->{'isprivate'} - && &::Param("insidergroup") - && !&::UserInGroup(&::Param("insidergroup"), $requestee_id)) + && Param("insidergroup") + && !$requestee->in_group(Param("insidergroup"))) { ThrowUserError("flag_requestee_unauthorized_attachment", { flag_type => $flag->{'type'}, - requestee => - new Bugzilla::User($requestee_id), + requestee => $requestee, bug_id => $bug_id, attach_id => $flag->{target}->{attachment}->{id} }); @@ -236,7 +231,7 @@ sub process { my @old_summaries; foreach my $flag (@$flags) { my $summary = $flag->{'type'}->{'name'} . $flag->{'status'}; - $summary .= "($flag->{'requestee'}->{'email'})" if $flag->{'requestee'}; + $summary .= "(" . $flag->{'requestee'}->login . ")" if $flag->{'requestee'}; push(@old_summaries, $summary); } @@ -275,7 +270,7 @@ sub process { my @new_summaries; foreach my $flag (@$flags) { my $summary = $flag->{'type'}->{'name'} . $flag->{'status'}; - $summary .= "($flag->{'requestee'}->{'email'})" if $flag->{'requestee'}; + $summary .= "(" . $flag->{'requestee'}->login . ")" if $flag->{'requestee'}; push(@new_summaries, $summary); } @@ -307,7 +302,7 @@ sub create { # Insert a record for the flag into the flags table. my $attach_id = $flag->{'target'}->{'attachment'}->{'id'} || "NULL"; - my $requestee_id = $flag->{'requestee'} ? $flag->{'requestee'}->{'id'} : "NULL"; + my $requestee_id = $flag->{'requestee'} ? $flag->{'requestee'}->id : "NULL"; &::SendSQL("INSERT INTO flags (id, type_id, bug_id, attach_id, requestee_id, setter_id, status, @@ -317,15 +312,15 @@ sub create { $flag->{'target'}->{'bug'}->{'id'}, $attach_id, $requestee_id, - $flag->{'setter'}->{'id'}, + " . $flag->{'setter'}->id . ", '$flag->{'status'}', $timestamp, $timestamp)"); # Send an email notifying the relevant parties about the flag creation. - if ($flag->{'requestee'} - && ($flag->{'requestee'}->email_prefs->{'FlagRequestee'} - || $flag->{'type'}->{'cc_list'})) + if (($flag->{'requestee'} + && $flag->{'requestee'}->email_prefs->{'FlagRequestee'}) + || $flag->{'type'}->{'cc_list'}) { notify($flag, "request/email.txt.tmpl"); } @@ -380,7 +375,7 @@ sub modify { # the flag isn't specifically requestable || $status ne "?" # or the flag isn't being requested || ($flag->{'requestee'} # or the requestee hasn't changed - && ($requestee_email eq $flag->{'requestee'}->{'email'}))); + && ($requestee_email eq $flag->{'requestee'}->login))); # Since the status is validated, we know it's safe, but it's still # tainted, so we have to detaint it before using it in a query. @@ -568,14 +563,15 @@ sub notify { { my @new_cc_list; foreach my $cc (split(/[, ]+/, $flag->{'type'}->{'cc_list'})) { - my $user_id = &::DBname_to_id($cc) || next; - # re-derive permissions if necessary - &::ConfirmGroup($user_id, TABLES_ALREADY_LOCKED); + my $ccuser = Bugzilla::User->new_from_login($cc, + TABLES_ALREADY_LOCKED) + || next; + next if $flag->{'target'}->{'bug'}->{'restricted'} - && !&::CanSeeBug($flag->{'target'}->{'bug'}->{'id'}, $user_id); + && !&::CanSeeBug($flag->{'target'}->{'bug'}->{'id'}, $ccuser->id); next if $flag->{'target'}->{'attachment'}->{'isprivate'} && Param("insidergroup") - && !&::UserInGroup(Param("insidergroup"), $user_id); + && !$ccuser->in_group(Param("insidergroup")); push(@new_cc_list, $cc); } $flag->{'type'}->{'cc_list'} = join(", ", @new_cc_list); @@ -587,8 +583,8 @@ sub notify { my $rv = $::template->process($template_file, $::vars, \$message); if (!$rv) { - print "Content-Type: text/html\n\n" unless $::vars->{'header_done'}; - &::ThrowTemplateError($::template->error()); + Bugzilla->cgi->header(); + ThrowTemplateError($::template->error()); } my $delivery_mode = Param("sendmailnow") ? "" : "-ODeliveryMode=deferred"; @@ -646,7 +642,7 @@ sub perlify_record { id => $id , type => Bugzilla::FlagType::get($type_id) , target => GetTarget($bug_id, $attach_id) , - requestee => new Bugzilla::User($requestee_id) , + requestee => $requestee_id ? new Bugzilla::User($requestee_id) : undef, setter => new Bugzilla::User($setter_id) , status => $status , }; diff --git a/Bugzilla/FlagType.pm b/Bugzilla/FlagType.pm index 523f601901bee148b44beca79a056de798aed325..6c3492ba26b85a56ceef31ca6c0d704a4b19e18a 100644 --- a/Bugzilla/FlagType.pm +++ b/Bugzilla/FlagType.pm @@ -198,13 +198,13 @@ sub validate { # Make sure the flag type exists. my $flag_type = get($id); $flag_type - || &::ThrowCodeError("flag_type_nonexistent", { id => $id }); + || ThrowCodeError("flag_type_nonexistent", { id => $id }); # Make sure the value of the field is a valid status. grep($status eq $_, qw(X + - ?)) - || &::ThrowCodeError("flag_status_invalid", - { id => $id , status => $status }); - + || ThrowCodeError("flag_status_invalid", + { id => $id , status => $status }); + # Make sure the user didn't request the flag unless it's requestable. if ($status eq '?' && !$flag_type->{is_requestable}) { ThrowCodeError("flag_status_invalid", @@ -219,20 +219,17 @@ sub validate { && trim($data->{"requestee_type-$id"})) { my $requestee_email = trim($data->{"requestee_type-$id"}); - my $requestee_id = &::DBname_to_id($requestee_email); # We know the requestee exists because we ran # Bugzilla::User::match_field before getting here. - # ConfirmGroup makes sure their group settings - # are up-to-date or calls DeriveGroups to update them. - &::ConfirmGroup($requestee_id); + my $requestee = Bugzilla::User->new_from_login($requestee_email); # Throw an error if the user can't see the bug. - if (!&::CanSeeBug($bug_id, $requestee_id)) + if (!&::CanSeeBug($bug_id, $requestee->id)) { ThrowUserError("flag_requestee_unauthorized", { flag_type => $flag_type, - requestee => new Bugzilla::User($requestee_id), + requestee => $requestee, bug_id => $bug_id, attach_id => $attach_id }); } @@ -240,13 +237,13 @@ sub validate { # Throw an error if the target is a private attachment and # the requestee isn't in the group of insiders who can see it. if ($attach_id - && &::Param("insidergroup") + && Param("insidergroup") && $data->{'isprivate'} - && !&::UserInGroup(&::Param("insidergroup"), $requestee_id)) + && !$requestee->in_group(Param("insidergroup"))) { ThrowUserError("flag_requestee_unauthorized_attachment", { flag_type => $flag_type, - requestee => new Bugzilla::User($requestee_id), + requestee => $requestee, bug_id => $bug_id, attach_id => $attach_id }); } diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 1637671f07544c087f5f3ececcbdec05ba527d66..3a211e078e1cb564d14fcc4c7f81d424c52ac58e 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -34,6 +34,7 @@ use vars qw($userid); package Bugzilla::Search; use Bugzilla::Config; +use Bugzilla::Error; use Bugzilla::Util; use Date::Format; @@ -57,6 +58,7 @@ sub init { my $self = shift; my $fieldsref = $self->{'fields'}; my $params = $self->{'params'}; + my $user = $self->{'user'} || Bugzilla->user; my $debug = 0; @@ -103,7 +105,7 @@ sub init { my $c = trim($params->param('votes')); if ($c ne "") { if ($c !~ /^[0-9]*$/) { - &::ThrowUserError("illegal_at_least_x_votes", + ThrowUserError("illegal_at_least_x_votes", { value => $c }); } push(@specialchart, ["votes", "greaterthan", $c - 1]); @@ -120,12 +122,23 @@ sub init { # If the user has selected all of either status or resolution, change to # selecting none. This is functionally equivalent, but quite a lot faster. + # Also, if the status is __open__ or __closed__, translate those + # into their equivalent lists of open and closed statuses. if ($params->param('bug_status')) { my @bug_statuses = $params->param('bug_status'); - - if (scalar(@bug_statuses) == scalar(@::legal_bug_status)) { + if (scalar(@bug_statuses) == scalar(@::legal_bug_status) + || $bug_statuses[0] eq "__all__") + { $params->delete('bug_status'); } + elsif ($bug_statuses[0] eq '__open__') { + $params->param('bug_status', map(&::IsOpenedState($_) ? $_ : undef, + @::legal_bug_status)); + } + elsif ($bug_statuses[0] eq "__closed__") { + $params->param('bug_status', map(&::IsOpenedState($_) ? undef : $_, + @::legal_bug_status)); + } } if ($params->param('resolution')) { @@ -212,64 +225,65 @@ sub init { } } - - if (defined $params->param('changedin')) { - my $c = trim($params->param('changedin')); - if ($c ne "") { - if ($c !~ /^[0-9]*$/) { - &::ThrowUserError("illegal_changed_in_last_x_days", - { value => $c }); - } - push(@specialchart, ["changedin", - "lessthan", $c + 1]); + # 2003-05-20: The 'changedin' field is no longer in the UI, but we continue + # to process it because it will appear in stored queries and bookmarks. + my $changedin = $params->param('changedin') || ''; + $changedin = trim($changedin); + if ($changedin) { + if ($changedin !~ /^[0-9]*$/) { + ThrowUserError("illegal_changed_in_last_x_days", + { value => $changedin }); } + push(@specialchart, ["changedin", "lessthan", $changedin + 1]); } + my $chfieldfrom = $params->param('chfieldfrom') || ''; + my $chfieldto = $params->param('chfieldto') || ''; my @chfield = $params->param('chfield'); - - if (@chfield) { - my $which = lsearch(\@chfield, "[Bug creation]"); - if ($which >= 0) { - splice(@chfield, $which, 1); - push(@specialchart, ["creation_ts", "greaterthan", - SqlifyDate($params->param('chfieldfrom'))]); - my $to = $params->param('chfieldto'); - if (defined $to) { - $to = trim($to); - if ($to ne "" && $to !~ /^now$/i) { - push(@specialchart, ["creation_ts", "lessthan", - SqlifyDate($to)]); + my $chvalue = $params->param('chfieldvalue') || ''; + my $lcchfieldfrom = trim(lc($chfieldfrom)); + my $lcchfieldto = trim(lc($chfieldto)); + $chvalue = trim($chvalue); + + $lcchfieldfrom = '' if ($lcchfieldfrom eq 'now'); + $lcchfieldto = '' if ($lcchfieldto eq 'now'); + if ($lcchfieldfrom ne '' || $lcchfieldto ne '') { + my $sql_chfrom = $lcchfieldfrom ? &::SqlQuote(SqlifyDate($lcchfieldfrom)):''; + my $sql_chto = $lcchfieldto ? &::SqlQuote(SqlifyDate($lcchfieldto)) :''; + my $sql_chvalue = $chvalue ne '' ? &::SqlQuote($chvalue) : ''; + if(!@chfield) { + push(@wherepart, "bugs.delta_ts >= $sql_chfrom") if ($sql_chfrom); + push(@wherepart, "bugs.delta_ts <= $sql_chto") if ($sql_chto); + } else { + push(@supptables, "bugs_activity actcheck"); + my $sql_bugschanged = ''; + my @list; + foreach my $f (@chfield) { + if ($f eq "[Bug creation]") { + my @l; + push(@l, "creation_ts >= $sql_chfrom") if($sql_chfrom); + push(@l, "creation_ts <= $sql_chto") if($sql_chto); + $sql_bugschanged = "(" . join(' AND ', @l) . ")"; + } else { + push(@list, "\nactcheck.fieldid = " . &::GetFieldID($f)); } } - } - } - - if (@chfield) { - push(@supptables, "bugs_activity actcheck"); - - my @list; - foreach my $f (@chfield) { - push(@list, "\nactcheck.fieldid = " . &::GetFieldID($f)); - } - push(@wherepart, "actcheck.bug_id = bugs.bug_id"); - push(@wherepart, "(" . join(' OR ', @list) . ")"); - push(@wherepart, "actcheck.bug_when >= " . - &::SqlQuote(SqlifyDate($params->param('chfieldfrom')))); - my $to = $params->param('chfieldto'); - if (defined $to) { - $to = trim($to); - if ($to ne "" && $to !~ /^now$/i) { - push(@wherepart, "actcheck.bug_when <= " . - &::SqlQuote(SqlifyDate($to))); - } - } - my $value = $params->param('chfieldvalue'); - if (defined $value) { - $value = trim($value); - if ($value ne "") { - push(@wherepart, "actcheck.added = " . - &::SqlQuote($value)) + if(@list) { + $sql_bugschanged .= ' OR ' if($sql_bugschanged ne ''); + $sql_bugschanged .= "(actcheck.bug_id = bugs.bug_id AND " . + "(" . join(' OR ', @list) . ")"; + if($sql_chfrom) { + $sql_bugschanged .= " AND actcheck.bug_when >= $sql_chfrom"; + } + if($sql_chto) { + $sql_bugschanged .= " AND actcheck.bug_when <= $sql_chto"; + } + if($sql_chvalue) { + $sql_bugschanged .= " AND actcheck.added = $sql_chvalue"; + } + $sql_bugschanged .= ')'; } + push(@wherepart, "($sql_bugschanged)"); } } @@ -286,6 +300,10 @@ sub init { } } + if (defined $params->param('content')) { + push(@specialchart, ['content', 'matches', $params->param('content')]); + } + my $chartid; my $sequence = 0; # $type_id is used by the code that queries for attachment flags. @@ -363,6 +381,55 @@ sub init { push(@wherepart, "$table.bug_id = bugs.bug_id"); $term = "$table.bug_when > " . &::SqlQuote(SqlifyDate($v)); }, + "^content,matches" => sub { + # "content" is an alias for columns containing text for which we + # can search a full-text index and retrieve results by relevance, + # currently just bug comments (and summaries to some degree). + # There's only one way to search a full-text index + # ("MATCH (...) AGAINST (...)"), so we only accept the "matches" + # operator, which is specific to full-text index searches. + + # Add the longdescs table to the query so we can search comments. + my $table = "longdescs_$chartid"; + push(@supptables, "INNER JOIN longdescs $table ON bugs.bug_id " . + "= $table.bug_id"); + if (Param("insidergroup") + && !&::UserInGroup(Param("insidergroup"))) + { + push(@wherepart, "$table.isprivate < 1"); + } + push(@wherepart, "$table.bug_id = bugs.bug_id"); + + # Create search terms to add to the SELECT and WHERE clauses. + # $term1 searches comments. + # $term2 searches summaries, which contributes to the relevance + # ranking in SELECT but doesn't limit which bugs get retrieved. + my $term1 = "MATCH($table.thetext) AGAINST(".&::SqlQuote($v).")"; + my $term2 = "MATCH(bugs.short_desc) AGAINST(".&::SqlQuote($v).")"; + + # The term to use in the WHERE clause. + $term = $term1; + + # In order to sort by relevance, we SELECT the relevance value + # and give it an alias so we can add it to the SORT BY clause + # when we build that clause in buglist.cgi. We also flag the + # query in Bugzilla with the "sorted_by_relevance" flag + # so buglist.cgi knows to sort by relevance instead of anything + # else the user selected. + # + # Note: MySQL calculates relevance for each comment separately, + # so we need to do some additional calculations to get an overall + # relevance value, which we do by calculating the average (mean) + # comment relevance and then adding the summary relevance, if any. + # This weights summary relevance heavily, which makes sense + # since summaries are short and thus highly significant. + # + # Note: We should be calculating the average relevance of all + # comments for a bug, not just matching comments, but that's hard + # (see http://bugzilla.mozilla.org/show_bug.cgi?id=145588#c35). + push(@fields, "(SUM($term1)/COUNT($term1) + $term2) AS relevance"); + $self->{'sorted_by_relevance'} = 1; + }, "^long_?desc," => sub { my $table = "longdescs_$chartid"; push(@supptables, "longdescs $table"); @@ -460,10 +527,10 @@ sub init { $t = "greaterthan"; } if ($field eq "ispatch" && $v ne "0" && $v ne "1") { - &::ThrowUserError("illegal_attachment_is_patch"); + ThrowUserError("illegal_attachment_is_patch"); } if ($field eq "isobsolete" && $v ne "0" && $v ne "1") { - &::ThrowUserError("illegal_is_obsolete"); + ThrowUserError("illegal_is_obsolete"); } $f = "$table.$field"; }, @@ -766,7 +833,7 @@ sub init { # by pressing the OR button at the right end of the chart. Extra # charts are created by pressing "Add another boolean chart". # -# Each chart consists of an artibrary number of rows and columns. +# Each chart consists of an arbitrary number of rows and columns. # The terms within a row are ORed together. The expressions represented # by each row are ANDed together. The expressions represented by each # chart are ANDed together. @@ -793,7 +860,7 @@ sub init { # The terms within a single row of a boolean chart are all constraints # on a single piece of data. If you're looking for a bug that has two # different people cc'd on it, then you need to use two boolean charts. -# This will find bugs with one CC mathing 'foo@blah.org' and and another +# This will find bugs with one CC matching 'foo@blah.org' and and another # CC matching 'bar@blah.org'. # # -------------------------------------------------------------- @@ -816,7 +883,7 @@ sub init { # bar@blah.org # -------------------------------------------------------------- -# $chartid is the number of the current chart whose SQL we're contructing +# $chartid is the number of the current chart whose SQL we're constructing # $row is the current row of the current chart # names for table aliases are constructed using $chartid and $row @@ -864,12 +931,12 @@ sub init { # chart -1 is generated by other code above, not from the user- # submitted form, so we'll blindly accept any values in chart -1 if ((!$chartfields{$f}) && ($chart != -1)) { - &::ThrowCodeError("invalid_field_name", {field => $f}); + ThrowCodeError("invalid_field_name", {field => $f}); } # This is either from the internal chart (in which case we # already know about it), or it was in %chartfields, so it is - # a valid field name, which means that its ok. + # a valid field name, which means that it's ok. trick_taint($f); $q = &::SqlQuote($v); my $func; @@ -898,9 +965,10 @@ sub init { } else { # This field and this type don't work together. - $::vars->{'field'} = $params->param("field$chart-$row-$col"); - $::vars->{'type'} = $params->param("type$chart-$row-$col"); - &::ThrowCodeError("field_type_mismatch"); + ThrowCodeError("field_type_mismatch", + { field => $params->param("field$chart-$row-$col"), + type => $params->param("type$chart-$row-$col"), + }); } } if (@orlist) { @@ -929,23 +997,24 @@ sub init { " LEFT JOIN bug_group_map " . " ON bug_group_map.bug_id = bugs.bug_id "; - if (defined @{$::vars->{user}{groupids}} && @{$::vars->{user}{groupids}} > 0) { - $query .= " AND bug_group_map.group_id NOT IN (" . join(',', @{$::vars->{user}{groupids}}) . ") "; - } + if ($user) { + if (%{$user->groups}) { + $query .= " AND bug_group_map.group_id NOT IN (" . join(',', values(%{$user->groups})) . ") "; + } - if ($::vars->{user}{userid}) { - $query .= " LEFT JOIN cc ON cc.bug_id = bugs.bug_id AND cc.who = $::userid "; + $query .= " LEFT JOIN cc ON cc.bug_id = bugs.bug_id AND cc.who = " . $user->id; } $query .= " WHERE " . join(' AND ', (@wherepart, @andlist)) . " AND ((bug_group_map.group_id IS NULL)"; - if ($::vars->{user}{userid}) { - $query .= " OR (bugs.reporter_accessible = 1 AND bugs.reporter = $::userid) " . + if ($user) { + my $userid = $user->id; + $query .= " OR (bugs.reporter_accessible = 1 AND bugs.reporter = $userid) " . " OR (bugs.cclist_accessible = 1 AND cc.who IS NOT NULL) " . - " OR (bugs.assigned_to = $::userid) "; + " OR (bugs.assigned_to = $userid) "; if (Param('useqacontact')) { - $query .= "OR (bugs.qa_contact = $::userid) "; + $query .= "OR (bugs.qa_contact = $userid) "; } } @@ -969,6 +1038,10 @@ sub init { sub SqlifyDate { my ($str) = @_; $str = "" if !defined $str; + if ($str eq "") { + my ($sec, $min, $hour, $mday, $month, $year, $wday) = localtime(time()); + return sprintf("%4d-%02d-%02d 00:00:00", $year+1900, $month+1, $mday); + } if ($str =~ /^-?(\d+)([dDwWmMyY])$/) { # relative date my ($amount, $unit, $date) = ($1, lc $2, time); my ($sec, $min, $hour, $mday, $month, $year, $wday) = localtime($date); @@ -992,13 +1065,13 @@ sub SqlifyDate { } my $date = str2time($str); if (!defined($date)) { - &::ThrowUserError("illegal_date", { date => $str }); + ThrowUserError("illegal_date", { date => $str }); } return time2str("%Y-%m-%d %H:%M:%S", $date); } -# ListIDsForEmail returns an string with a comma-joined list -# of userids matching an email address +# ListIDsForEmail returns a string with a comma-joined list +# of userids matching email addresses # according to the type specified. # Currently, this only supports anyexact and substring matches. # Substring matches will return up to 50 matching userids diff --git a/Bugzilla/Series.pm b/Bugzilla/Series.pm new file mode 100644 index 0000000000000000000000000000000000000000..bc11389c92c92ec86c33c3233cef00d904a199f6 --- /dev/null +++ b/Bugzilla/Series.pm @@ -0,0 +1,262 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Gervase Markham <gerv@gerv.net> + +use strict; +use lib "."; + +# This module implements a series - a set of data to be plotted on a chart. +package Bugzilla::Series; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::User; + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + + # Create a ref to an empty hash and bless it + my $self = {}; + bless($self, $class); + + if ($#_ == 0) { + if (ref($_[0])) { + # We've been given a CGI object + $self->readParametersFromCGI($_[0]); + $self->createInDatabase(); + } + else { + # We've been given a series_id. + $self->initFromDatabase($_[0]); + } + } + elsif ($#_ >= 3) { + $self->initFromParameters(@_); + } + else { + die("Bad parameters passed in - invalid number of args \($#_\)($_)"); + } + + return $self->{'already_exists'} ? $self->{'series_id'} : $self; +} + +sub initFromDatabase { + my $self = shift; + my $series_id = shift; + + &::detaint_natural($series_id) + || &::ThrowCodeError("invalid_series_id", { 'series_id' => $series_id }); + + my $dbh = Bugzilla->dbh; + my @series = $dbh->selectrow_array("SELECT series.series_id, cc1.name, " . + "cc2.name, series.name, series.creator, series.frequency, " . + "series.query " . + "FROM series " . + "LEFT JOIN series_categories AS cc1 " . + " ON series.category = cc1.category_id " . + "LEFT JOIN series_categories AS cc2 " . + " ON series.subcategory = cc2.category_id " . + "WHERE series.series_id = $series_id"); + + if (@series) { + $self->initFromParameters(@series); + } + else { + &::ThrowCodeError("invalid_series_id", { 'series_id' => $series_id }); + } +} + +sub initFromParameters { + my $self = shift; + + # The first four parameters are compulsory, unless you immediately call + # createInDatabase(), in which case series_id can be left off. + ($self->{'series_id'}, $self->{'category'}, $self->{'subcategory'}, + $self->{'name'}, $self->{'creator'}, $self->{'frequency'}, + $self->{'query'}) = @_; + + $self->{'public'} = $self->isSubscribed(0); + $self->{'subscribed'} = $self->isSubscribed($::userid); +} + +sub createInDatabase { + my $self = shift; + + # Lock some tables + my $dbh = Bugzilla->dbh; + $dbh->do("LOCK TABLES series_categories WRITE, series WRITE, " . + "user_series_map WRITE"); + + my $category_id = getCategoryID($self->{'category'}); + my $subcategory_id = getCategoryID($self->{'subcategory'}); + + $self->{'creator'} = $::userid; + + # Check for the series currently existing + trick_taint($self->{'name'}); + $self->{'series_id'} = $dbh->selectrow_array("SELECT series_id " . + "FROM series WHERE category = $category_id " . + "AND subcategory = $subcategory_id AND name = " . + $dbh->quote($self->{'name'})); + + if ($self->{'series_id'}) { + $self->{'already_exists'} = 1; + } + else { + trick_taint($self->{'query'}); + + # Insert the new series into the series table + $dbh->do("INSERT INTO series (creator, category, subcategory, " . + "name, frequency, query) VALUES ($self->{'creator'}, " . + "$category_id, $subcategory_id, " . + $dbh->quote($self->{'name'}) . ", $self->{'frequency'}," . + $dbh->quote($self->{'query'}) . ")"); + + # Retrieve series_id + $self->{'series_id'} = $dbh->selectrow_array("SELECT MAX(series_id) " . + "FROM series"); + $self->{'series_id'} + || &::ThrowCodeError("missing_series_id", { 'series' => $self }); + + # Subscribe user to the newly-created series. + $self->subscribe($::userid); + # Public series are subscribed to by userid 0. + $self->subscribe(0) if ($self->{'public'} && $::userid != 0); + } + + $dbh->do("UNLOCK TABLES"); +} + +# Get a category or subcategory IDs, creating the category if it doesn't exist. +sub getCategoryID { + my ($category) = @_; + my $category_id; + my $dbh = Bugzilla->dbh; + + # This seems for the best idiom for "Do A. Then maybe do B and A again." + while (1) { + # We are quoting this to put it in the DB, so we can remove taint + trick_taint($category); + + $category_id = $dbh->selectrow_array("SELECT category_id " . + "from series_categories " . + "WHERE name =" . $dbh->quote($category)); + last if $category_id; + + $dbh->do("INSERT INTO series_categories (name) " . + "VALUES (" . $dbh->quote($category) . ")"); + } + + return $category_id; +} + +sub readParametersFromCGI { + my $self = shift; + my $cgi = shift; + + $self->{'category'} = $cgi->param('category') + || $cgi->param('newcategory') + || &::ThrowUserError("missing_category"); + + $self->{'subcategory'} = $cgi->param('subcategory') + || $cgi->param('newsubcategory') + || &::ThrowUserError("missing_subcategory"); + + $self->{'name'} = $cgi->param('name') + || &::ThrowUserError("missing_name"); + + $self->{'frequency'} = $cgi->param('frequency'); + detaint_natural($self->{'frequency'}) + || &::ThrowUserError("missing_frequency"); + + $self->{'public'} = $cgi->param('public') ? 1 : 0; + + $self->{'query'} = $cgi->canonicalise_query("format", "ctype", "action", + "category", "subcategory", "name", + "frequency", "public", "query_format"); +} + +sub alter { + my $self = shift; + my $cgi = shift; + + my $old_public = $self->{'public'}; + + # Note: $self->{'query'} will be meaningless after this call + $self->readParametersFromCGI($cgi); + + my $category_id = getCategoryID($self->{'category'}); + my $subcategory_id = getCategoryID($self->{'subcategory'}); + + # Update the entry + trick_taint($self->{'name'}); + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE series SET " . + "category = $category_id, subcategory = $subcategory_id " . + ", name = " . $dbh->quote($self->{'name'}) . + ", frequency = $self->{'frequency'} " . + "WHERE series_id = $self->{'series_id'}"); + + # Update the publicness of this query. + if ($old_public && !$self->{'public'}) { + $self->unsubscribe(0); + } + elsif (!$old_public && $self->{'public'}) { + $self->subscribe(0); + } +} + +sub subscribe { + my $self = shift; + my $userid = shift; + + if (!$self->isSubscribed($userid)) { + # Subscribe current user to series_id + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO user_series_map " . + "VALUES($userid, $self->{'series_id'})"); + } +} + +sub unsubscribe { + my $self = shift; + my $userid = shift; + + if ($self->isSubscribed($userid)) { + # Remove current user's subscription to series_id + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM user_series_map " . + "WHERE user_id = $userid AND series_id = $self->{'series_id'}"); + } +} + +sub isSubscribed { + my $self = shift; + my $userid = shift; + + my $dbh = Bugzilla->dbh; + my $issubscribed = $dbh->selectrow_array("SELECT 1 FROM user_series_map " . + "WHERE user_id = $userid " . + "AND series_id = $self->{'series_id'}"); + return $issubscribed; +} + +1; diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index e596af2269f5406eb492cabad54a77c71e10fcf7..f9342e11f599f3deccffa82362fa17cfb0e50f07 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -121,6 +121,13 @@ $Template::Stash::LIST_OPS->{ containsany } = return 0; }; +# Allow us to still get the scalar if we use the list operation ".0" on it, +# as we often do for defaults in query.cgi and other places. +$Template::Stash::SCALAR_OPS->{ 0 } = + sub { + return $_[0]; + }; + # Add a "substr" method to the Template Toolkit's "scalar" object # that returns a substring of a string. $Template::Stash::SCALAR_OPS->{ substr } = @@ -187,6 +194,7 @@ sub create { $var =~ s/([\\\'\"])/\\$1/g; $var =~ s/\n/\\n/g; $var =~ s/\r/\\r/g; + $var =~ s/\@/\\x40/g; # anti-spam for email addresses return $var; }, @@ -211,6 +219,10 @@ sub create { # a full URL that may have characters that need encoding. url_quote => \&Bugzilla::Util::url_quote , + # This filter is similar to url_quote but used a \ instead of a % + # as prefix. In addition it replaces a ' ' by a '_'. + css_class_quote => \&Bugzilla::Util::css_class_quote , + quoteUrls => \&::quoteUrls , bug_link => [ sub { @@ -237,6 +249,19 @@ sub create { # Format a time for display (more info in Bugzilla::Util) time => \&Bugzilla::Util::format_time, + + # Override html filter to obscure the '@' in user visible strings + # See bug 120030 for details + html => sub { + my ($var) = Template::Filters::html_filter(@_); + $var =~ s/\@/\@/g; + return $var; + }, + + # We force filtering of every variable in key security-critical + # places; we have a none filter for people to use when they + # really, really don't want a variable to be changed. + none => sub { return $_[0]; } , }, PLUGIN_BASE => 'Bugzilla::Template::Plugin', @@ -249,14 +274,13 @@ sub create { # Function to create date strings 'time2str' => \&Date::Format::time2str, - # Function for processing global parameters that contain references - # to other global parameters. - 'PerformSubsts' => \&::PerformSubsts , - # Generic linear search function 'lsearch' => \&Bugzilla::Util::lsearch, - # UserInGroup - you probably want to cache this + # Currently logged in user, if any + 'user' => sub { return Bugzilla->user; }, + + # UserInGroup. Deprecated - use the user.* functions instead 'UserInGroup' => \&::UserInGroup, # SendBugMail - sends mail about a bug, using Bugzilla::BugMail.pm @@ -265,10 +289,6 @@ sub create { require Bugzilla::BugMail; Bugzilla::BugMail::Send($id, $mailrecipients); }, - - # SyncAnyPendingShadowChanges - # - called in the footer to sync the shadowdb - 'SyncAnyPendingShadowChanges' => \&::SyncAnyPendingShadowChanges, # Bugzilla version # This could be made a ref, or even a CONSTANT with TT2.08 diff --git a/Bugzilla/Template/CVS/Tag b/Bugzilla/Template/CVS/Tag index a3b2d0dcc6bb99eac32a9ac2b70191062f02d5f6..9850221a0eb3c0ab21c87ec0e071c7a10c0e874f 100644 --- a/Bugzilla/Template/CVS/Tag +++ b/Bugzilla/Template/CVS/Tag @@ -1 +1 @@ -TBUGZILLA-2_17_4 +TBUGZILLA-2_17_5 diff --git a/Bugzilla/Template/Plugin/CVS/Entries b/Bugzilla/Template/Plugin/CVS/Entries index d34dd138fd7c6940c19b9664ebf58d2f7623206c..36fa4b22fd94025c32b8108c98fbc61a8db54286 100644 --- a/Bugzilla/Template/Plugin/CVS/Entries +++ b/Bugzilla/Template/Plugin/CVS/Entries @@ -1,2 +1,2 @@ -/Bugzilla.pm/1.2/Fri Feb 7 07:19:15 2003//TBUGZILLA-2_17_4 +/Bugzilla.pm/1.2/Fri Feb 7 07:19:15 2003//TBUGZILLA-2_17_5 D diff --git a/Bugzilla/Template/Plugin/CVS/Tag b/Bugzilla/Template/Plugin/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/Bugzilla/Template/Plugin/CVS/Tag +++ b/Bugzilla/Template/Plugin/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index 46f520b7778496d14b9dd88763bf6063f9e8015d..32e624913db5e32a2e36a0b9954f79dcca02d830 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -19,6 +19,8 @@ # # Contributor(s): Myk Melez <myk@mozilla.org> # Erik Stambaugh <not_erik@dasbistro.com> +# Bradley Baetz <bbaetz@acm.org> +# Joel Peshkin <bugreport@peshkin.net> ################################################################################ # Module Initialization @@ -30,57 +32,312 @@ use strict; # This module implements utilities for dealing with Bugzilla users. package Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Util; + ################################################################################ # Functions ################################################################################ -my $user_cache = {}; sub new { - # Returns a hash of information about a particular user. + my $invocant = shift; + return $invocant->_create("userid=?", @_); +} +# This routine is sort of evil. Nothing except the login stuff should +# be dealing with addresses as an input, and they can get the id as a +# side effect of the other sql they have to do anyway. +# Bugzilla::BugMail still does this, probably as a left over from the +# pre-id days. Provide this as a helper, but don't document it, and hope +# that it can go away. +# The request flag stuff also does this, but it really should be passing +# in the id its already had to validate (or the User.pm object, of course) +sub new_from_login { + my $invocant = shift; + return $invocant->_create("login_name=?", @_); +} + +# Internal helper for the above |new| methods +# $cond is a string (including a placeholder ?) for the search +# requirement for the profiles table +sub _create { my $invocant = shift; my $class = ref($invocant) || $invocant; - - my $exists = 1; - my ($id, $name, $email) = @_; - - return undef if !$id; - return $user_cache->{$id} if exists($user_cache->{$id}); - - my $self = { 'id' => $id }; - - bless($self, $class); - - if (!$name && !$email) { - &::PushGlobalSQLState(); - &::SendSQL("SELECT 1, realname, login_name FROM profiles WHERE userid = $id"); - ($exists, $name, $email) = &::FetchSQLData(); - &::PopGlobalSQLState(); + + my $cond = shift; + my $val = shift; + + # We're checking for validity here, so any value is OK + trick_taint($val); + + my $tables_locked_for_derive_groups = shift; + + my $dbh = Bugzilla->dbh; + + my ($id, + $login, + $name, + $mybugslink) = $dbh->selectrow_array(qq{SELECT userid, + login_name, + realname, + mybugslink + FROM profiles + WHERE $cond}, + undef, + $val); + + return undef unless defined $id; + + my $self = { id => $id, + name => $name, + login => $login, + showmybugslink => $mybugslink, + }; + + bless ($self, $class); + + # Now update any old group information if needed + my $result = $dbh->selectrow_array(q{SELECT 1 + FROM profiles, groups + WHERE userid=? + AND profiles.refreshed_when <= + groups.last_changed}, + undef, + $id); + + if ($result) { + $self->derive_groups($tables_locked_for_derive_groups); } - - $self->{'name'} = $name; - $self->{'email'} = $email || "__UNKNOWN__"; - $self->{'exists'} = $exists; - - # Generate a string to identify the user by name + email if the user - # has a name or by email only if she doesn't. - $self->{'identity'} = $name ? "$name <$email>" : $email; - - # Generate a user "nickname" -- i.e. a shorter, not-necessarily-unique name - # by which to identify the user. Currently the part of the user's email - # address before the at sign (@), but that could change, especially if we - # implement usernames not dependent on email address. - my @email_components = split("@", $email); - $self->{'nick'} = $email_components[0]; - - $user_cache->{$id} = $self; - + return $self; } +# Accessors for user attributes +sub id { $_[0]->{id}; } +sub login { $_[0]->{login}; } +sub email { $_[0]->{login}; } +sub name { $_[0]->{name}; } +sub showmybugslink { $_[0]->{showmybugslink}; } + +# Generate a string to identify the user by name + email if the user +# has a name or by email only if she doesn't. +sub identity { + my $self = shift; + + if (!defined $self->{identity}) { + $self->{identity} = + $self->{name} ? "$self->{name} <$self->{login}>" : $self->{login}; + } + + return $self->{identity}; +} + +sub nick { + my $self = shift; + + if (!defined $self->{nick}) { + $self->{nick} = (split(/@/, $self->{login}, 2))[0]; + } + + return $self->{nick}; +} + +sub queries { + my $self = shift; + + return $self->{queries} if defined $self->{queries}; + + my $dbh = Bugzilla->dbh; + my $sth = $dbh->prepare(q{ SELECT name, query, linkinfooter + FROM namedqueries + WHERE userid=? + ORDER BY UPPER(name)}); + $sth->execute($self->{id}); + + my @queries; + while (my $row = $sth->fetch) { + push (@queries, { + name => $row->[0], + query => $row->[1], + linkinfooter => $row->[2], + }); + } + $self->{queries} = \@queries; + + return $self->{queries}; +} + +sub flush_queries_cache { + my $self = shift; + + delete $self->{queries}; +} + +sub groups { + my $self = shift; + + return $self->{groups} if defined $self->{groups}; + + my $dbh = Bugzilla->dbh; + my $groups = $dbh->selectcol_arrayref(q{SELECT DISTINCT groups.name, group_id + FROM groups, user_group_map + WHERE groups.id=user_group_map.group_id + AND user_id=? + AND isbless=0}, + { Columns=>[1,2] }, + $self->{id}); + + # The above gives us an arrayref [name, id, name, id, ...] + # Convert that into a hashref + my %groups = @$groups; + $self->{groups} = \%groups; + + return $self->{groups}; +} + +sub in_group { + my ($self, $group) = @_; + + # If we already have the info, just return it. + return defined($self->{groups}->{$group}) if defined $self->{groups}; + + # Otherwise, go check for it + + my $dbh = Bugzilla->dbh; + + my $res = $dbh->selectrow(q{SELECT 1 + FROM groups, user_group_map + WHERE groups.id=user_group_map.group_id + AND user_group_map.user_id=? + AND isbless=0 + AND groups.name=?}, + undef, + $self->id, + $group); + + return defined($res); +} + +sub derive_groups { + my ($self, $already_locked) = @_; + + my $id = $self->id; + + my $dbh = Bugzilla->dbh; + + my $sth; + + $dbh->do(q{LOCK TABLES profiles WRITE, + user_group_map WRITE, + group_group_map READ, + groups READ}) unless $already_locked; + + # avoid races, we are only up to date as of the BEGINNING of this process + my $time = $dbh->selectrow_array("SELECT NOW()"); + + # first remove any old derived stuff for this user + $dbh->do(q{DELETE FROM user_group_map + WHERE user_id = ? + AND isderived = 1}, + undef, + $id); + + my %groupidsadded = (); + # add derived records for any matching regexps + + $sth = $dbh->prepare("SELECT id, userregexp FROM groups WHERE userregexp != ''"); + $sth->execute; + + my $group_insert; + while (my $row = $sth->fetch) { + if ($self->{login} =~ m/$row->[1]/i) { + $group_insert ||= $dbh->prepare(q{INSERT INTO user_group_map + (user_id, group_id, isbless, isderived) + VALUES (?, ?, 0, 1)}); + $groupidsadded{$row->[0]} = 1; + $group_insert->execute($id, $row->[0]); + } + } + + # Get a list of the groups of which the user is a member. + my %groupidschecked = (); + + my @groupidstocheck = @{$dbh->selectcol_arrayref(q{SELECT group_id + FROM user_group_map + WHERE user_id=?}, + undef, + $id)}; + + # Each group needs to be checked for inherited memberships once. + my $group_sth; + while (@groupidstocheck) { + my $group = shift @groupidstocheck; + if (!defined($groupidschecked{"$group"})) { + $groupidschecked{"$group"} = 1; + $group_sth ||= $dbh->prepare(q{SELECT grantor_id + FROM group_group_map + WHERE member_id=? + AND isbless=0}); + $group_sth->execute($group); + while (my $groupid = $group_sth->fetchrow_array) { + if (!defined($groupidschecked{"$groupid"})) { + push(@groupidstocheck,$groupid); + } + if (!$groupidsadded{$groupid}) { + $groupidsadded{$groupid} = 1; + $group_insert ||= $dbh->prepare(q{INSERT INTO user_group_map + (user_id, group_id, isbless, isderived) + VALUES (?, ?, 0, 1)}); + $group_insert->execute($id, $groupid); + } + } + } + } + + $dbh->do(q{UPDATE profiles + SET refreshed_when = ? + WHERE userid=?}, + undef, + $time, + $id); + $dbh->do("UNLOCK TABLES") unless $already_locked; +} + +sub can_bless { + my $self = shift; + + return $self->{can_bless} if defined $self->{can_bless}; + + my $dbh = Bugzilla->dbh; + # First check if the user can explicitly bless a group + my $res = $dbh->selectrow_arrayref(q{SELECT 1 + FROM user_group_map + WHERE user_id=? + AND isbless=1}, + undef, + $self->{id}); + if (!$res) { + # Now check if user is a member of a group that can bless a group + $res = $dbh->selectrow_arrayref(q{SELECT 1 + FROM user_group_map, group_group_map + WHERE user_group_map.user_id=? + AND user_group_map.group_id=member_id + AND group_group_map.isbless=1}, + undef, + $self->{id}); + } + + $self->{can_bless} = $res ? 1 : 0; + + return $self->{can_bless}; +} + sub match { # Generates a list of users whose login name (email address) or real name # matches a substring or wildcard. + # This is also called if matches are disabled (for error checking), but + # in this case only the exact match code will end up running. # $str contains the string to match, while $limit contains the # maximum number of records to retrieve. @@ -99,7 +356,8 @@ sub match { my $wildstr = $str; - if ($wildstr =~ s/\*/\%/g) { # don't do wildcards if no '*' in the string + if ($wildstr =~ s/\*/\%/g && # don't do wildcards if no '*' in the string + Param('usermatchmode') ne 'off') { # or if we only want exact matches # Build the query. my $sqlstr = &::SqlQuote($wildstr); @@ -159,7 +417,7 @@ sub match { # order @users by alpha - @users = sort { uc($a->{'email'}) cmp uc($b->{'email'}) } @users; + @users = sort { uc($a->login) cmp uc($b->login) } @users; return \@users; } @@ -251,9 +509,6 @@ sub match_field { } $fields = $expanded_fields; - # Skip all of this if the option has been turned off - return 1 if (&::Param('usermatchmode') eq 'off'); - for my $field (keys %{$fields}) { # Tolerate fields that do not exist. @@ -297,9 +552,10 @@ sub match_field { } else { # bad argument - $vars->{'argument'} = $fields->{$field}->{'type'}; - $vars->{'function'} = 'Bugzilla::User::match_field'; - &::ThrowCodeError('bad_arg'); + ThrowCodeError('bad_arg', + { argument => $fields->{$field}->{'type'}, + function => 'Bugzilla::User::match_field', + }); } for my $query (@queries) { @@ -312,14 +568,14 @@ sub match_field { # skip confirmation for exact matches if ((scalar(@{$users}) == 1) - && (@{$users}[0]->{'email'} eq $query)) + && (@{$users}[0]->{'login'} eq $query)) { # delimit with spaces if necessary if ($vars->{'form'}->{$field}) { $vars->{'form'}->{$field} .= " "; } - $vars->{'form'}->{$field} .= @{$users}[0]->{'email'}; - push @{$vars->{'mform'}->{$field}}, @{$users}[0]->{'email'}; + $vars->{'form'}->{$field} .= @{$users}[0]->{'login'}; + push @{$vars->{'mform'}->{$field}}, @{$users}[0]->{'login'}; next; } @@ -333,8 +589,8 @@ sub match_field { if ($vars->{'form'}->{$field}) { $vars->{'form'}->{$field} .= " "; } - $vars->{'form'}->{$field} .= @{$users}[0]->{'email'}; - push @{$vars->{'mform'}->{$field}}, @{$users}[0]->{'email'}; + $vars->{'form'}->{$field} .= @{$users}[0]->{'login'}; + push @{$vars->{'mform'}->{$field}}, @{$users}[0]->{'login'}; $need_confirm = 1 if &::Param('confirmuniqueusermatch'); } @@ -366,10 +622,10 @@ sub match_field { $vars->{'matches'} = $matches; # matches that were made $vars->{'matchsuccess'} = $matchsuccess; # continue or fail - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); $::template->process("global/confirm-user-match.html.tmpl", $vars) - || &::ThrowTemplateError($::template->error()); + || ThrowTemplateError($::template->error()); exit; @@ -443,3 +699,159 @@ sub email_prefs { } 1; + +__END__ + +=head1 NAME + +Bugzilla::User - Object for a Bugzilla user + +=head1 SYNOPSIS + + use Bugzilla::User; + + my $user = new Bugzilla::User($id); + +=head1 DESCRIPTION + +This package handles Bugzilla users. Data obtained from here is read-only; +there is currently no way to modify a user from this package. + +Note that the currently logged in user (if any) is available via +L<Bugzilla-E<gt>user|Bugzilla/"user">. + +=head1 METHODS + +=over 4 + +=item C<new($userid)> + +Creates a new C<Bugzilla::User> object for the given user id. Returns +C<undef> if no matching user is found. + +=begin undocumented + +=item C<new_from_login($login)> + +Creates a new C<Bugzilla::User> object given the provided login. Returns +C<undef> if no matching user is found. + +This routine should not be required in general; most scripts should be using +userids instead. + +This routine and C<new> both take an extra optional argument, which is +passed as the argument to C<derive_groups> to avoid locking. See that +routine's documentation for details. + +=end undocumented + +=item C<id> + +Returns the userid for this user. + +=item C<login> + +Returns the login name for this user. + +=item C<email> + +Returns the user's email address. Currently this is the same value as the +login. + +=item C<name> + +Returns the 'real' name for this user, if any. + +=item C<showmybugslink> + +Returns C<1> if the user has set his preference to show the 'My Bugs' link in +the page footer, and C<0> otherwise. + +=item C<identity> + +Retruns a string for the identity of the user. This will be of the form +C<name E<lt>emailE<gt>> if the user has specified a name, and C<email> +otherwise. + +=item C<nick> + +Returns a user "nickname" -- i.e. a shorter, not-necessarily-unique name by +which to identify the user. Currently the part of the user's email address +before the at sign (@), but that could change, especially if we implement +usernames not dependent on email address. + +=item C<queries> + +Returns an array of the user's named queries, sorted in a case-insensitive +order by name. Each entry is a hash with three keys: + +=over + +=item * + +name - The name of the query + +=item * + +query - The text for the query + +=item * + +linkinfooter - Whether or not the query should be displayed in the footer. + +=back + +=item C<flush_queries_cache> + +Some code modifies the set of stored queries. Because C<Bugzilla::User> does +not handle these modifications, but does cache the result of calling C<queries> +internally, such code must call this method to flush the cached result. + +=item C<groups> + +Returns a hashref of group names for groups the user is a member of. The keys +are the names of the groups, whilst the values are the respective group ids. +(This is so that a set of all groupids for groups the user is in can be +obtained by C<values(%{$user->groups})>.) + +=item C<in_group> + +Determines whether or not a user is in the given group. This method is mainly +intended for cases where we are not looking at the currently logged in user, +and only need to make a quick check for the group, where calling C<groups> +and getting all of the groups would be overkill. + +=item C<derive_groups> + +Bugzilla allows for group inheritance. When data about the user (or any of the +groups) changes, the database must be updated. Handling updated groups is taken +care of by the constructor. However, when updating the email address, the +user may be placed into different groups, based on a new email regexp. This +method should be called in such a case to force reresolution of these groups. + +=begin undocumented + +This routine takes an optional argument. If true, then this routine will not +lock the tables, but will rely on the caller to ahve done so itsself. + +This is required because mysql will only execute a query if all of the tables +are locked, or if none of them are, not a mixture. If the caller has already +done some locking, then this routine would fail. Thus the caller needs to lock +all the tables required by this method, and then C<derive_groups> won't do +any locking. + +This is a really ugly solution, and when Bugzilla supports transactions +instead of using the explicit table locking we were forced to do when thats +all MySQL supported, this will go away. + +=end undocumented + +=item C<can_bless> + +Returns C<1> if the user can bless at least one group. Otherwise returns C<0>. + +=back + +=head1 SEE ALSO + +L<Bugzilla|Bugzilla> diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 511ba2592c5c69d0e1dd1de2b78d1dd1f62d3b44..c0d671744cb6d524e26290e11f1b499eedfff20c 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -30,6 +30,7 @@ use strict; use base qw(Exporter); @Bugzilla::Util::EXPORT = qw(is_tainted trick_taint detaint_natural html_quote url_quote value_quote xml_quote + css_class_quote lsearch max min trim format_time); @@ -73,6 +74,13 @@ sub url_quote { return $toencode; } +sub css_class_quote { + my ($toencode) = (@_); + $toencode =~ s/ /_/g; + $toencode =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("&#x%x;",ord($1))/eg; + return $toencode; +} + sub value_quote { my ($var) = (@_); $var =~ s/\&/\&/g; @@ -260,6 +268,11 @@ replaced with their appropriate HTML entities. Quotes characters so that they may be included as part of a url. +=item C<css_class_quote($val)> + +Quotes characters so that they may be used as CSS class names. Spaces +are replaced by underscores. + =item C<value_quote($val)> As well as escaping html like C<html_quote>, this routine converts newlines diff --git a/CGI.pl b/CGI.pl index 74b81c9da94d2078db7424caed400143c5426674..982b067b224d1f1e1ce2cac3b031dea94acb4aad 100644 --- a/CGI.pl +++ b/CGI.pl @@ -42,7 +42,7 @@ use Bugzilla::Error; sub CGI_pl_sillyness { my $zz; - $zz = %::dontchange; + $zz = $::buffer; } use CGI::Carp qw(fatalsToBrowser); @@ -55,11 +55,11 @@ use vars qw($template $vars); # to the user about the downtime. (do)editparams.cgi is exempted from # this message, of course, since it needs to be available in order for # the administrator to open Bugzilla back up. -if (Param("shutdownhtml") && $0 !~ m:[\\/](do)?editparams.cgi$:) { +if (Param("shutdownhtml") && $0 !~ m:(^|[\\/])(do)?editparams\.cgi$:) { $::vars->{'message'} = "shutdown"; # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return an HTML message about the downtime. $::template->process("global/message.html.tmpl", $::vars) @@ -95,14 +95,15 @@ sub CheckFormField (\%$;\@) { SendSQL("SELECT description FROM fielddefs WHERE name=" . SqlQuote($fieldname)); my $result = FetchOneColumn(); + my $field; if ($result) { - $vars->{'field'} = $result; + $field = $result; } else { - $vars->{'field'} = $fieldname; + $field = $fieldname; } - ThrowCodeError("illegal_field", undef, "abort"); + ThrowCodeError("illegal_field", { field => $field }, "abort"); } } @@ -113,8 +114,7 @@ sub CheckFormFieldDefined (\%$) { ) = @_; if (!defined $formRef->{$fieldname}) { - $vars->{'field'} = $fieldname; - ThrowCodeError("undefined_field"); + ThrowCodeError("undefined_field", { field => $fieldname }); } } @@ -202,53 +202,6 @@ sub quietly_check_login { return Bugzilla->login($_[0] ? LOGIN_OPTIONAL : LOGIN_NORMAL); } -# Populate a hash with information about this user. -sub GetUserInfo { - my ($userid) = (@_); - my %user; - my @queries; - my %groups; - my @groupids; - - # No info if not logged in - return \%user if ($userid == 0); - - $user{'login'} = $::COOKIE{"Bugzilla_login"}; - $user{'userid'} = $userid; - - SendSQL("SELECT mybugslink, realname " . - "FROM profiles WHERE userid = $userid"); - ($user{'showmybugslink'}, $user{'realname'}) = FetchSQLData(); - - SendSQL("SELECT name, query, linkinfooter FROM namedqueries " . - "WHERE userid = $userid"); - while (MoreSQLData()) { - my %query; - ($query{'name'}, $query{'query'}, $query{'linkinfooter'}) = - FetchSQLData(); - push(@queries, \%query); - } - - $user{'queries'} = \@queries; - - $user{'canblessany'} = UserCanBlessAnything(); - - SendSQL("SELECT DISTINCT id, name FROM groups, user_group_map " . - "WHERE groups.id = user_group_map.group_id " . - "AND user_id = $userid " . - "AND NOT isbless"); - while (MoreSQLData()) { - my ($id, $name) = FetchSQLData(); - push(@groupids,$id); - $groups{$name} = 1; - } - - $user{'groups'} = \%groups; - $user{'groupids'} = \@groupids; - - return \%user; -} - sub CheckEmailSyntax { my ($addr) = (@_); my $match = Param('emailregexp'); @@ -288,81 +241,6 @@ sub PutFooter { || ThrowTemplateError($::template->error()); } -############################################################################### -# Error handling -# -# If you are doing incremental output, set $vars->{'header_done'} once you've -# done the header. -# -# You can call Throw*Error with extra template variables in one pass by using -# the $extra_vars hash reference parameter: -# ThrowUserError("some_tag", { bug_id => $bug_id, size => 127 }); -############################################################################### - -# For "this shouldn't happen"-type places in the code. -# The contents of $extra_vars get printed out in the template - useful for -# debugging info. -sub ThrowCodeError { - ($vars->{'error'}, my $extra_vars, my $unlock_tables) = (@_); - - SendSQL("UNLOCK TABLES") if $unlock_tables; - - # If we don't have this test here, then the %@extra_vars vivifies - # the hashref, and then setting $vars->{'variables'} uses an empty hashref - # so the error template prints out a bogus header for the empty hash - if (defined $extra_vars) { - # Copy the extra_vars into the vars hash - foreach my $var (keys %$extra_vars) { - $vars->{$var} = $extra_vars->{$var}; - } - - # We may one day log something to file here also. - $vars->{'variables'} = $extra_vars; - } - - print "Content-type: text/html\n\n" if !$vars->{'header_done'}; - $template->process("global/code-error.html.tmpl", $vars) - || ThrowTemplateError($template->error()); - - exit; -} - -# This function should only be called if a template->process() fails. -# It tries another template first, because often one template being -# broken or missing doesn't mean that they all are. But it falls back on -# a print statement. -# The Content-Type will already have been printed. -sub ThrowTemplateError { - ($vars->{'template_error_msg'}) = (@_); - $vars->{'error'} = "template_error"; - - # Try a template first; but if this one fails too, fall back - # on plain old print statements. - if (!$template->process("global/code-error.html.tmpl", $vars)) { - my $maintainer = Param('maintainer'); - my $error = html_quote($vars->{'template_error_msg'}); - my $error2 = html_quote($template->error()); - print <<END; - <tt> - <p> - Bugzilla has suffered an internal error. Please save this page and - send it to $maintainer with details of what you were doing at the - time this message appeared. - </p> - <script type="text/javascript"> <!-- - document.write("<p>URL: " + document.location + "</p>"); - // --> - </script> - <p>Template->process() failed twice.<br> - First error: $error<br> - Second error: $error2</p> - </tt> -END - } - - exit; -} - sub CheckIfVotedConfirmed { my ($id, $who) = (@_); SendSQL("SELECT bugs.votes, bugs.bug_status, products.votestoconfirm, " . diff --git a/CVS/Entries b/CVS/Entries index 4a5f8b07c5b2bd487b3d58b89e34e7d0e172b94b..f552b7b6c316d47ba930e1821ca46e22777eaf8c 100644 --- a/CVS/Entries +++ b/CVS/Entries @@ -1,76 +1,79 @@ -/.cvsignore/1.6/Mon May 13 22:28:26 2002//TBUGZILLA-2_17_4 -/1x1.gif/1.1/Wed Aug 26 06:14:15 1998/-kb/TBUGZILLA-2_17_4 -/Attachment.pm/1.14/Fri Apr 25 05:41:20 2003//TBUGZILLA-2_17_4 -/Bug.pm/1.31/Wed Apr 9 09:29:15 2003//TBUGZILLA-2_17_4 -/Bugzilla.pm/1.6/Sat Mar 22 04:47:09 2003//TBUGZILLA-2_17_4 -/CGI.pl/1.202/Wed Apr 2 12:35:00 2003//TBUGZILLA-2_17_4 -/README/1.51/Fri Nov 22 03:29:20 2002//TBUGZILLA-2_17_4 -/RelationSet.pm/1.8/Mon Aug 26 06:16:49 2002//TBUGZILLA-2_17_4 -/Token.pm/1.18/Sat Mar 22 04:47:09 2003//TBUGZILLA-2_17_4 -/UPGRADING/1.1/Fri Aug 10 22:35:21 2001//TBUGZILLA-2_17_4 -/UPGRADING-pre-2.8/1.3/Thu Mar 27 00:06:37 2003//TBUGZILLA-2_17_4 -/ant.jpg/1.2/Wed Aug 26 22:36:05 1998/-kb/TBUGZILLA-2_17_4 -/attachment.cgi/1.40/Fri Apr 25 05:41:21 2003//TBUGZILLA-2_17_4 -/bug_status.html/1.14/Wed Feb 26 22:01:47 2003//TBUGZILLA-2_17_4 -/buglist.cgi/1.223/Sun Mar 30 03:27:08 2003//TBUGZILLA-2_17_4 -/bugwritinghelp.html/1.3/Mon Apr 15 02:47:53 2002//TBUGZILLA-2_17_4 -/bugzilla.dtd/1.8/Sun Dec 15 09:23:55 2002//TBUGZILLA-2_17_4 -/checksetup.pl/1.229/Thu Apr 24 23:11:59 2003//TBUGZILLA-2_17_4 -/colchange.cgi/1.34/Thu Mar 27 00:06:39 2003//TBUGZILLA-2_17_4 -/collectstats.pl/1.30/Mon Apr 21 15:08:27 2003//TBUGZILLA-2_17_4 -/createaccount.cgi/1.29/Thu Mar 27 00:06:39 2003//TBUGZILLA-2_17_4 -/defparams.pl/1.115/Thu Apr 24 22:41:07 2003//TBUGZILLA-2_17_4 -/describecomponents.cgi/1.21/Wed Apr 2 12:35:00 2003//TBUGZILLA-2_17_4 -/describekeywords.cgi/1.10/Thu Mar 27 00:06:39 2003//TBUGZILLA-2_17_4 -/doeditparams.cgi/1.25/Thu Mar 27 00:06:39 2003//TBUGZILLA-2_17_4 -/duplicates.cgi/1.36/Thu Apr 24 20:49:27 2003//TBUGZILLA-2_17_4 -/duplicates.xul/1.1/Tue Nov 5 01:54:01 2002//TBUGZILLA-2_17_4 -/editcomponents.cgi/1.30/Thu Mar 27 00:06:40 2003//TBUGZILLA-2_17_4 -/editflagtypes.cgi/1.4/Thu Mar 27 00:06:40 2003//TBUGZILLA-2_17_4 -/editgroups.cgi/1.26/Thu Mar 27 00:06:40 2003//TBUGZILLA-2_17_4 -/editkeywords.cgi/1.13/Thu Mar 27 00:06:40 2003//TBUGZILLA-2_17_4 -/editmilestones.cgi/1.15/Sun Mar 30 02:46:21 2003//TBUGZILLA-2_17_4 -/editparams.cgi/1.19/Thu Mar 27 00:06:41 2003//TBUGZILLA-2_17_4 -/editproducts.cgi/1.35/Thu Mar 27 00:06:41 2003//TBUGZILLA-2_17_4 -/editusers.cgi/1.43/Thu Apr 24 23:12:00 2003//TBUGZILLA-2_17_4 -/editversions.cgi/1.16/Sun Mar 30 02:46:21 2003//TBUGZILLA-2_17_4 -/enter_bug.cgi/1.83/Thu Mar 27 00:06:42 2003//TBUGZILLA-2_17_4 -/globals.pl/1.237/Fri Apr 25 05:41:21 2003//TBUGZILLA-2_17_4 -/importxml.pl/1.32/Fri Apr 25 04:16:01 2003//TBUGZILLA-2_17_4 -/index.cgi/1.10/Thu Mar 27 00:06:43 2003//TBUGZILLA-2_17_4 -/localconfig.js/1.1/Wed Feb 28 23:07:25 2001//TBUGZILLA-2_17_4 -/long_list.cgi/1.34/Thu Mar 27 00:06:44 2003//TBUGZILLA-2_17_4 -/move.pl/1.20/Thu Mar 27 00:06:45 2003//TBUGZILLA-2_17_4 -/page.cgi/1.8/Thu Mar 27 00:06:45 2003//TBUGZILLA-2_17_4 -/post_bug.cgi/1.81/Wed Apr 2 12:35:01 2003//TBUGZILLA-2_17_4 -/process_bug.cgi/1.183/Fri Apr 25 05:41:21 2003//TBUGZILLA-2_17_4 -/productmenu.js/1.1/Sat Sep 28 18:42:29 2002//TBUGZILLA-2_17_4 -/query.cgi/1.115/Thu Mar 27 00:06:46 2003//TBUGZILLA-2_17_4 -/queryhelp.cgi/1.18/Thu Mar 27 00:06:46 2003//TBUGZILLA-2_17_4 -/quicksearch.html/1.3/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_17_4 -/quicksearch.js/1.10/Sun Jan 12 08:16:03 2003//TBUGZILLA-2_17_4 -/quicksearchhack.html/1.4/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_17_4 -/quips.cgi/1.20/Thu Mar 27 00:06:46 2003//TBUGZILLA-2_17_4 -/relogin.cgi/1.21/Thu Mar 27 00:06:46 2003//TBUGZILLA-2_17_4 -/report.cgi/1.14/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/reports.cgi/1.67/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/request.cgi/1.8/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/robots.txt/1.2/Wed Apr 24 18:11:00 2002//TBUGZILLA-2_17_4 -/runtests.pl/1.3/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/runtests.sh/1.7/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/sanitycheck.cgi/1.65/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_4 -/show_activity.cgi/1.12/Thu Mar 27 00:06:48 2003//TBUGZILLA-2_17_4 -/show_bug.cgi/1.23/Thu Mar 27 00:06:48 2003//TBUGZILLA-2_17_4 -/showattachment.cgi/1.13/Thu Mar 27 00:06:48 2003//TBUGZILLA-2_17_4 -/showdependencygraph.cgi/1.28/Thu Apr 24 21:17:31 2003//TBUGZILLA-2_17_4 -/showdependencytree.cgi/1.26/Thu Mar 27 00:06:48 2003//TBUGZILLA-2_17_4 -/sidebar.cgi/1.11/Thu Mar 27 00:06:48 2003//TBUGZILLA-2_17_4 -/token.cgi/1.16/Wed Apr 2 12:35:02 2003//TBUGZILLA-2_17_4 -/userprefs.cgi/1.48/Wed Apr 2 12:35:02 2003//TBUGZILLA-2_17_4 -/votehelp.html/1.10/Mon Apr 15 02:47:56 2002//TBUGZILLA-2_17_4 -/votes.cgi/1.9/Thu Mar 27 00:06:49 2003//TBUGZILLA-2_17_4 -/whineatnews.pl/1.10/Thu Mar 27 00:06:50 2003//TBUGZILLA-2_17_4 -/xml.cgi/1.12/Thu Mar 27 00:06:50 2003//TBUGZILLA-2_17_4 +/.cvsignore/1.6/Mon May 13 22:28:26 2002//TBUGZILLA-2_17_5 +/1x1.gif/1.1/Wed Aug 26 06:14:15 1998/-kb/TBUGZILLA-2_17_5 +/Attachment.pm/1.14/Fri Apr 25 05:41:20 2003//TBUGZILLA-2_17_5 +/Bug.pm/1.33/Tue Sep 2 06:54:58 2003//TBUGZILLA-2_17_5 +/Bugzilla.pm/1.8/Sat Jun 7 13:59:24 2003//TBUGZILLA-2_17_5 +/CGI.pl/1.209/Thu Oct 30 01:31:57 2003//TBUGZILLA-2_17_5 +/QUICKSTART/1.1/Fri Oct 10 02:22:39 2003//TBUGZILLA-2_17_5 +/README/1.52/Fri Oct 10 02:22:39 2003//TBUGZILLA-2_17_5 +/RelationSet.pm/1.8/Mon Aug 26 06:16:49 2002//TBUGZILLA-2_17_5 +/Token.pm/1.20/Sun Sep 14 06:04:40 2003//TBUGZILLA-2_17_5 +/UPGRADING/1.1/Fri Aug 10 22:35:21 2001//TBUGZILLA-2_17_5 +/UPGRADING-pre-2.8/1.3/Thu Mar 27 00:06:37 2003//TBUGZILLA-2_17_5 +/ant.jpg/1.2/Wed Aug 26 22:36:05 1998/-kb/TBUGZILLA-2_17_5 +/attachment.cgi/1.48/Sun Nov 2 07:36:10 2003//TBUGZILLA-2_17_5 +/bug_status.html/1.16/Thu Oct 30 17:12:30 2003//TBUGZILLA-2_17_5 +/buglist.cgi/1.236/Sat Nov 1 20:02:47 2003//TBUGZILLA-2_17_5 +/bugwritinghelp.html/1.3/Mon Apr 15 02:47:53 2002//TBUGZILLA-2_17_5 +/bugzilla.dtd/1.8/Sun Dec 15 09:23:55 2002//TBUGZILLA-2_17_5 +/chart.cgi/1.2/Mon Jun 30 22:23:17 2003//TBUGZILLA-2_17_5 +/checksetup.pl/1.251/Thu Sep 18 12:17:15 2003//TBUGZILLA-2_17_5 +/colchange.cgi/1.36/Tue May 13 04:59:35 2003//TBUGZILLA-2_17_5 +/collectstats.pl/1.32/Sun Nov 2 15:22:41 2003//TBUGZILLA-2_17_5 +/config.cgi/1.3/Mon Jun 23 18:01:36 2003//TBUGZILLA-2_17_5 +/createaccount.cgi/1.30/Mon May 5 01:15:20 2003//TBUGZILLA-2_17_5 +/defparams.pl/1.119/Tue Sep 2 01:43:37 2003//TBUGZILLA-2_17_5 +/describecomponents.cgi/1.23/Mon Nov 3 03:25:51 2003//TBUGZILLA-2_17_5 +/describekeywords.cgi/1.11/Mon May 5 01:15:21 2003//TBUGZILLA-2_17_5 +/doeditparams.cgi/1.28/Tue Sep 2 01:47:15 2003//TBUGZILLA-2_17_5 +/duplicates.cgi/1.39/Sun Oct 26 14:01:04 2003//TBUGZILLA-2_17_5 +/duplicates.xul/1.1/Tue Nov 5 01:54:01 2002//TBUGZILLA-2_17_5 +/editcomponents.cgi/1.33/Fri Sep 26 23:47:07 2003//TBUGZILLA-2_17_5 +/editflagtypes.cgi/1.5/Mon May 5 01:15:22 2003//TBUGZILLA-2_17_5 +/editgroups.cgi/1.28/Fri Sep 26 23:47:07 2003//TBUGZILLA-2_17_5 +/editkeywords.cgi/1.16/Mon Nov 3 03:31:30 2003//TBUGZILLA-2_17_5 +/editmilestones.cgi/1.17/Thu Sep 25 19:59:44 2003//TBUGZILLA-2_17_5 +/editparams.cgi/1.20/Mon May 5 01:15:24 2003//TBUGZILLA-2_17_5 +/editproducts.cgi/1.40/Sun Oct 26 02:37:48 2003//TBUGZILLA-2_17_5 +/editusers.cgi/1.47/Fri Sep 26 23:47:07 2003//TBUGZILLA-2_17_5 +/editversions.cgi/1.17/Mon May 5 01:15:24 2003//TBUGZILLA-2_17_5 +/enter_bug.cgi/1.86/Thu Sep 11 03:54:12 2003//TBUGZILLA-2_17_5 +/globals.pl/1.249/Thu Oct 30 17:18:16 2003//TBUGZILLA-2_17_5 +/importxml.pl/1.34/Fri Jul 18 17:11:01 2003//TBUGZILLA-2_17_5 +/index.cgi/1.11/Mon May 5 01:15:27 2003//TBUGZILLA-2_17_5 +/localconfig.js/1.2/Thu Jul 17 22:49:47 2003//TBUGZILLA-2_17_5 +/long_list.cgi/1.36/Tue Aug 5 00:31:19 2003//TBUGZILLA-2_17_5 +/move.pl/1.22/Thu Oct 16 06:30:01 2003//TBUGZILLA-2_17_5 +/page.cgi/1.10/Sun Aug 24 19:46:25 2003//TBUGZILLA-2_17_5 +/post_bug.cgi/1.85/Tue Oct 7 07:02:15 2003//TBUGZILLA-2_17_5 +/process_bug.cgi/1.197/Tue Oct 28 06:37:40 2003//TBUGZILLA-2_17_5 +/productmenu.js/1.1/Sat Sep 28 18:42:29 2002//TBUGZILLA-2_17_5 +/query.cgi/1.122/Fri Oct 31 19:06:59 2003//TBUGZILLA-2_17_5 +/queryhelp.cgi/1.21/Fri Jun 13 02:50:50 2003//TBUGZILLA-2_17_5 +/quicksearch.html/1.3/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_17_5 +/quicksearch.js/1.10/Sun Jan 12 08:16:03 2003//TBUGZILLA-2_17_5 +/quicksearchhack.html/1.4/Mon Apr 15 02:47:55 2002//TBUGZILLA-2_17_5 +/quips.cgi/1.21/Mon May 5 01:15:28 2003//TBUGZILLA-2_17_5 +/relogin.cgi/1.23/Tue Jun 3 09:47:43 2003//TBUGZILLA-2_17_5 +/report.cgi/1.20/Sun Sep 14 23:00:09 2003//TBUGZILLA-2_17_5 +/reports.cgi/1.68/Mon May 5 01:15:29 2003//TBUGZILLA-2_17_5 +/request.cgi/1.10/Sun Sep 14 06:04:53 2003//TBUGZILLA-2_17_5 +/robots.txt/1.2/Wed Apr 24 18:11:00 2002//TBUGZILLA-2_17_5 +/runtests.pl/1.3/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_5 +/runtests.sh/1.7/Thu Mar 27 00:06:47 2003//TBUGZILLA-2_17_5 +/sanitycheck.cgi/1.68/Tue Sep 2 01:37:55 2003//TBUGZILLA-2_17_5 +/show_activity.cgi/1.13/Mon May 5 01:15:29 2003//TBUGZILLA-2_17_5 +/show_bug.cgi/1.25/Wed Aug 20 00:45:40 2003//TBUGZILLA-2_17_5 +/showattachment.cgi/1.14/Mon May 5 01:15:29 2003//TBUGZILLA-2_17_5 +/showdependencygraph.cgi/1.30/Sun Oct 26 05:39:18 2003//TBUGZILLA-2_17_5 +/showdependencytree.cgi/1.27/Mon May 5 01:15:30 2003//TBUGZILLA-2_17_5 +/sidebar.cgi/1.13/Tue Jun 3 09:47:44 2003//TBUGZILLA-2_17_5 +/token.cgi/1.20/Wed Sep 24 07:44:22 2003//TBUGZILLA-2_17_5 +/userprefs.cgi/1.50/Tue Jun 3 09:47:46 2003//TBUGZILLA-2_17_5 +/votehelp.html/1.10/Mon Apr 15 02:47:56 2002//TBUGZILLA-2_17_5 +/votes.cgi/1.15/Mon Nov 3 03:20:49 2003//TBUGZILLA-2_17_5 +/whineatnews.pl/1.10/Thu Mar 27 00:06:50 2003//TBUGZILLA-2_17_5 +/xml.cgi/1.12/Thu Mar 27 00:06:50 2003//TBUGZILLA-2_17_5 D/Bugzilla//// D/contrib//// D/css//// diff --git a/CVS/Tag b/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/CVS/Tag +++ b/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/QUICKSTART b/QUICKSTART new file mode 100644 index 0000000000000000000000000000000000000000..9a9a387bd07532d9670ff46a57f891a9731acfe4 --- /dev/null +++ b/QUICKSTART @@ -0,0 +1,85 @@ +Bugzilla Quick Start Guide +========================== +(or, how to get Bugzilla up and running in 10 steps) +Christian Reis <kiko@async.com.br> + +This express installation guide is for "normal" Bugzilla installations, +which means a Linux or Unix system on which Apache, Perl, MySQL and +Sendmail are available. For other configurations, please see Section 4 +of the Bugzilla Guide in the docs/ directory. + +1. Decide from which URL and directory under your webserver root you + will be serving the Bugzilla webpages from. + +2. Unpack distribution into the chosen directory (there is no copy or + installation involved). + +3. Run ./checksetup.pl, look for unsolved requirements, install them. + You can run checksetup as many times as necessary to check if + everything required is installed. + + This will usually include assorted Perl modules, MySQL and sendmail. + + After a successful dependency check, checksetup should complain that + localconfig needs to be edited. + +4. Edit the localconfig file, in particular the $webservergroup and + $db_* variables. In particular, $db_name and $db_user will define + your database setup in step 5. + + If you want to change platforms, operating systems, severities and + priorities, this can also be done in localconfig at this time. + +5. Using the name you provided as $db_name above, create a MySQL database + for Bugzilla. You should also create a user permission for the name + supplied as $db_user with read/write access to that database. + + If you are not familiar with MySQL permissions, it's a good idea to + use the mysql_setpermission script that is installed with the MySQL + distribution, and be sure to read section 4.1.6 in the Bugzilla Guide. + +6. Run checksetup.pl once more; if all goes well, it should set up the + Bugzilla database for you. If not, move back to step 5. + + checksetup.pl should ask you, this time, for the administrator's + email address and password. These will be used for the initial + Bugzilla administrator account. + +7. Configure Apache (or install and configure, if you don't have one up + yet) to point to the Bugzilla directory. You should enable and + activate mod_cgi, and add the configuration entries + + Options +ExecCGI + AllowOverride Limit + DirectoryIndex index.cgi + + to your Bugzilla <Directory> block. You may also need + + AddHandler cgi-script .cgi + + if you don't have that in your Apache configuration file yet. + +8. Visit the URL you chose for Bugzilla. You should log in as the + administrator by following the "Log in" link and supplying the + account information you provided in step 6. + +9. Scroll to the bottom of the page after logging in, and select + "parameters". Set up the relevant parameters for your local setup. + + See section 4.2 of the Bugzilla Guide for a in-depth description of + some of the configuration parameters available. + +10. That's it. If anything unexpected comes up: + + - read the error message carefully, + - backtrack through the steps above, + - check the official installation guide, which is section 4 in the + Bugzilla Guide, included in the docs/ directory in various + formats. + +Support and installation questions should be directed to the +mozilla-webtools@mozilla.org mailing list -- don't write to the +developer mailing list: your post *will* be ignored if you do. + +Further support information is at http://www.bugzilla.org/discussion.html + diff --git a/README b/README index d5c4c0b9378cb77a34294938db8434ac54586026..d29229ca4e72cf3fc44904aa88c6b6c598c0f77a 100644 --- a/README +++ b/README @@ -1,10 +1,13 @@ * This README is no longer used to house installation instructions. Instead, it contains pointers to where you may find the information you need. -* Installation instructions are now found in docs/, with a variety of document -types available. Please refer to these documents when installing, configuring, -and maintaining your Bugzilla installation. A helpful starting point is -docs/txt/Bugzilla-Guide.txt, or with a web browser at docs/html/index.html. +* A quick installation guide is provided in the QUICKSTART file. + +* Complete installation instructions are found in docs/, with a +variety of document types available. Please refer to these documents +when installing, configuring, and maintaining your Bugzilla +installation. A helpful starting point is docs/txt/Bugzilla-Guide.txt, +or with a web browser at docs/html/index.html. * Release notes for people upgrading to a new version of Bugzilla are available at docs/rel_notes.txt. diff --git a/Token.pm b/Token.pm index 97d2da41d93ad5abb7f52ca8cdbdfb12d73f741a..f7be40ab355b3d5e0b295a7f1f0aceb457842224 100644 --- a/Token.pm +++ b/Token.pm @@ -30,6 +30,7 @@ use strict; package Token; use Bugzilla::Config; +use Bugzilla::Error; use Date::Format; @@ -88,7 +89,7 @@ sub IssueEmailChangeToken { my $message; $template->process("account/email/change-old.txt.tmpl", $vars, \$message) - || &::ThrowTemplateError($template->error()); + || ThrowTemplateError($template->error()); open SENDMAIL, "|/usr/lib/sendmail -t -i"; print SENDMAIL $message; @@ -99,7 +100,7 @@ sub IssueEmailChangeToken { $message = ""; $template->process("account/email/change-new.txt.tmpl", $vars, \$message) - || &::ThrowTemplateError($template->error()); + || ThrowTemplateError($template->error()); open SENDMAIL, "|/usr/lib/sendmail -t -i"; print SENDMAIL $message; @@ -146,7 +147,7 @@ sub IssuePasswordToken { my $message = ""; $template->process("account/password/forgotten-password.txt.tmpl", $vars, \$message) - || &::ThrowTemplateError($template->error()); + || ThrowTemplateError($template->error()); open SENDMAIL, "|/usr/lib/sendmail -t -i"; print SENDMAIL $message; @@ -176,7 +177,7 @@ sub GenerateUniqueToken { ++$tries; if ($tries > 100) { - &::ThrowCodeError("token_generation_error"); + ThrowCodeError("token_generation_error"); } $token = &::GenerateRandomPassword(); @@ -225,7 +226,7 @@ sub Cancel { my $message; $template->process("account/cancel-token.txt.tmpl", $vars, \$message) - || &::ThrowTemplateError($template->error()); + || ThrowTemplateError($template->error()); open SENDMAIL, "|/usr/lib/sendmail -t -i"; print SENDMAIL $message; @@ -246,7 +247,7 @@ sub DeletePasswordTokens { "WHERE userid=? AND tokentype='password'"); $sth->execute($userid); while (my $token = $sth->fetchrow_array) { - Token::Cancel($token, "user_logged_in"); + Token::Cancel($token, $reason); } } diff --git a/attachment.cgi b/attachment.cgi index 621477ed5acc201b61dad7973ccb4a1702d2413d..7063609ee7a47703f64add4537d077c6feabdb56 100755 --- a/attachment.cgi +++ b/attachment.cgi @@ -22,6 +22,7 @@ # Myk Melez <myk@mozilla.org> # Daniel Raichle <draichle@gmx.net> # Dave Miller <justdave@syndicomm.com> +# Alexander J. Vincent <ajvincent@juno.com> ################################################################################ # Script Initialization @@ -33,7 +34,6 @@ use strict; use lib qw(.); use vars qw( - $cgi $template $vars ); @@ -63,6 +63,8 @@ quietly_check_login(); # to just above validateID(). my $bugid; +my $cgi = Bugzilla->cgi; + ################################################################################ # Main Body Execution ################################################################################ @@ -79,6 +81,21 @@ if ($action eq "view") validateID(); view(); } +elsif ($action eq "interdiff") +{ + validateID('oldid'); + validateID('newid'); + validateFormat("html", "raw"); + validateContext(); + interdiff(); +} +elsif ($action eq "diff") +{ + validateID(); + validateFormat("html", "raw"); + validateContext(); + diff(); +} elsif ($action eq "viewall") { ValidateBugID($::FORM{'bugid'}); @@ -137,7 +154,7 @@ elsif ($action eq "update") } else { - ThrowCodeError("unknown_action"); + ThrowCodeError("unknown_action", { action => $action }); } exit; @@ -148,16 +165,18 @@ exit; sub validateID { + my $param = @_ ? $_[0] : 'id'; + # Validate the value of the "id" form field, which must contain an # integer that is the ID of an existing attachment. - $vars->{'attach_id'} = $::FORM{'id'}; + $vars->{'attach_id'} = $::FORM{$param}; - detaint_natural($::FORM{'id'}) + detaint_natural($::FORM{$param}) || ThrowUserError("invalid_attach_id"); # Make sure the attachment exists in the database. - SendSQL("SELECT bug_id, isprivate FROM attachments WHERE attach_id = $::FORM{'id'}"); + SendSQL("SELECT bug_id, isprivate FROM attachments WHERE attach_id = $::FORM{$param}"); MoreSQLData() || ThrowUserError("invalid_attach_id"); @@ -169,6 +188,28 @@ sub validateID } } +sub validateFormat +{ + $::FORM{'format'} ||= $_[0]; + if (! grep { $_ eq $::FORM{'format'} } @_) + { + $vars->{'format'} = $::FORM{'format'}; + $vars->{'formats'} = \@_; + ThrowUserError("invalid_format"); + } +} + +sub validateContext +{ + $::FORM{'context'} ||= "patch"; + if ($::FORM{'context'} ne "file" && $::FORM{'context'} ne "patch") { + $vars->{'context'} = $::FORM{'context'}; + detaint_natural($::FORM{'context'}) + || ThrowUserError("invalid_context"); + delete $vars->{'context'}; + } +} + sub validateCanEdit { my ($attach_id) = (@_); @@ -262,8 +303,8 @@ sub validateContentType } else { - $vars->{'contenttypemethod'} = $::FORM{'contenttypemethod'}; - ThrowCodeError("illegal_content_type_method"); + ThrowCodeError("illegal_content_type_method", + { contenttypemethod => $::FORM{'contenttypemethod'} }); } if ( $::FORM{'contenttype'} !~ /^(application|audio|image|message|model|multipart|text|video)\/.+$/ ) @@ -347,13 +388,11 @@ sub validateObsolete # Make sure the attachment id is valid and the user has permissions to view # the bug to which it is attached. foreach my $attachid (@{$::MFORM{'obsolete'}}) { - # my $vars after ThrowCodeError is updated to not use the global - # vars hash - + my $vars = {}; $vars->{'attach_id'} = $attachid; detaint_natural($attachid) - || ThrowCodeError("invalid_attach_id_to_obsolete"); + || ThrowCodeError("invalid_attach_id_to_obsolete", $vars); SendSQL("SELECT bug_id, isobsolete, description FROM attachments WHERE attach_id = $attachid"); @@ -370,12 +409,12 @@ sub validateObsolete { $vars->{'my_bug_id'} = $::FORM{'bugid'}; $vars->{'attach_bug_id'} = $bugid; - ThrowCodeError("mismatched_bug_ids_on_obsolete"); + ThrowCodeError("mismatched_bug_ids_on_obsolete", $vars); } if ( $isobsolete ) { - ThrowCodeError("attachment_already_obsolete"); + ThrowCodeError("attachment_already_obsolete", $vars); } # Check that the user can modify this attachment @@ -395,17 +434,270 @@ sub view # Retrieve the attachment content and its content type from the database. SendSQL("SELECT mimetype, filename, thedata FROM attachments WHERE attach_id = $::FORM{'id'}"); my ($contenttype, $filename, $thedata) = FetchSQLData(); + + # Bug 111522: allow overriding content-type manually in the posted $::FORM. + if ($::FORM{'content_type'}) + { + $::FORM{'contenttypemethod'} = 'manual'; + $::FORM{'contenttypeentry'} = $::FORM{'content_type'}; + validateContentType(); + $contenttype = $::FORM{'content_type'}; + } # Return the appropriate HTTP response headers. $filename =~ s/^.*[\/\\]//; my $filesize = length($thedata); - print qq{Content-Type: $contenttype; name="$filename"\n}; - print qq{Content-Disposition: inline; filename=$filename\n}; - print qq{Content-Length: $filesize\n}; - print qq{\n$thedata}; + print Bugzilla->cgi->header(-type=>"$contenttype; name=\"$filename\"", + -content_disposition=> "inline; filename=$filename", + -content_length => $filesize); + + print $thedata; +} + +sub interdiff +{ + # Get old patch data + my ($old_bugid, $old_description, $old_filename, $old_file_list) = + get_unified_diff($::FORM{'oldid'}); + + # Get new patch data + my ($new_bugid, $new_description, $new_filename, $new_file_list) = + get_unified_diff($::FORM{'newid'}); + + my $warning = warn_if_interdiff_might_fail($old_file_list, $new_file_list); + + # + # send through interdiff, send output directly to template + # + # Must hack path so that interdiff will work. + # + $ENV{'PATH'} = $::diffpath; + open my $interdiff_fh, "$::interdiffbin $old_filename $new_filename|"; + binmode $interdiff_fh; + my ($reader, $last_reader) = setup_patch_readers(""); + if ($::FORM{'format'} eq "raw") + { + require PatchReader::DiffPrinter::raw; + $last_reader->sends_data_to(new PatchReader::DiffPrinter::raw()); + # Actually print out the patch + print $cgi->header(-type => 'text/plain', + -expires => '+3M'); + } + else + { + $vars->{warning} = $warning if $warning; + $vars->{bugid} = $new_bugid; + $vars->{oldid} = $::FORM{'oldid'}; + $vars->{old_desc} = $old_description; + $vars->{newid} = $::FORM{'newid'}; + $vars->{new_desc} = $new_description; + delete $vars->{attachid}; + delete $vars->{do_context}; + delete $vars->{context}; + setup_template_patch_reader($last_reader); + } + $reader->iterate_fh($interdiff_fh, "interdiff #$::FORM{'oldid'} #$::FORM{'newid'}"); + close $interdiff_fh; + $ENV{'PATH'} = ''; + + # + # Delete temporary files + # + unlink($old_filename) or warn "Could not unlink $old_filename: $!"; + unlink($new_filename) or warn "Could not unlink $new_filename: $!"; } +sub get_unified_diff +{ + my ($id) = @_; + + # Bring in the modules we need + require PatchReader::Raw; + require PatchReader::FixPatchRoot; + require PatchReader::DiffPrinter::raw; + require PatchReader::PatchInfoGrabber; + require File::Temp; + + # Get the patch + SendSQL("SELECT bug_id, description, ispatch, thedata FROM attachments WHERE attach_id = $id"); + my ($bugid, $description, $ispatch, $thedata) = FetchSQLData(); + if (!$ispatch) { + $vars->{'attach_id'} = $id; + ThrowCodeError("must_be_patch"); + } + + # Reads in the patch, converting to unified diff in a temp file + my $reader = new PatchReader::Raw; + my $last_reader = $reader; + + # fixes patch root (makes canonical if possible) + if (Param('cvsroot')) { + my $fix_patch_root = new PatchReader::FixPatchRoot(Param('cvsroot')); + $last_reader->sends_data_to($fix_patch_root); + $last_reader = $fix_patch_root; + } + + # Grabs the patch file info + my $patch_info_grabber = new PatchReader::PatchInfoGrabber(); + $last_reader->sends_data_to($patch_info_grabber); + $last_reader = $patch_info_grabber; + + # Prints out to temporary file + my ($fh, $filename) = File::Temp::tempfile(); + my $raw_printer = new PatchReader::DiffPrinter::raw($fh); + $last_reader->sends_data_to($raw_printer); + $last_reader = $raw_printer; + + # Iterate! + $reader->iterate_string($id, $thedata); + + return ($bugid, $description, $filename, $patch_info_grabber->patch_info()->{files}); +} + +sub warn_if_interdiff_might_fail { + my ($old_file_list, $new_file_list) = @_; + # Verify that the list of files diffed is the same + my @old_files = sort keys %{$old_file_list}; + my @new_files = sort keys %{$new_file_list}; + if (@old_files != @new_files || + join(' ', @old_files) ne join(' ', @new_files)) { + return "interdiff1"; + } + + # Verify that the revisions in the files are the same + foreach my $file (keys %{$old_file_list}) { + if ($old_file_list->{$file}{old_revision} ne + $new_file_list->{$file}{old_revision}) { + return "interdiff2"; + } + } + + return undef; +} + +sub setup_patch_readers { + my ($diff_root) = @_; + + # + # Parameters: + # format=raw|html + # context=patch|file|0-n + # collapsed=0|1 + # headers=0|1 + # + + # Define the patch readers + # The reader that reads the patch in (whatever its format) + require PatchReader::Raw; + my $reader = new PatchReader::Raw; + my $last_reader = $reader; + # Fix the patch root if we have a cvs root + if (Param('cvsroot')) + { + require PatchReader::FixPatchRoot; + $last_reader->sends_data_to(new PatchReader::FixPatchRoot(Param('cvsroot'))); + $last_reader->sends_data_to->diff_root($diff_root) if defined($diff_root); + $last_reader = $last_reader->sends_data_to; + } + # Add in cvs context if we have the necessary info to do it + if ($::FORM{'context'} ne "patch" && $::cvsbin && Param('cvsroot_get')) + { + require PatchReader::AddCVSContext; + $last_reader->sends_data_to( + new PatchReader::AddCVSContext($::FORM{'context'}, + Param('cvsroot_get'))); + $last_reader = $last_reader->sends_data_to; + } + return ($reader, $last_reader); +} + +sub setup_template_patch_reader +{ + my ($last_reader) = @_; + + require PatchReader::DiffPrinter::template; + + my $format = $::FORM{'format'}; + + # Define the vars for templates + if (defined($::FORM{'headers'})) { + $vars->{headers} = $::FORM{'headers'}; + } else { + $vars->{headers} = 1 if !defined($::FORM{'headers'}); + } + $vars->{collapsed} = $::FORM{'collapsed'}; + $vars->{context} = $::FORM{'context'}; + $vars->{do_context} = $::cvsbin && Param('cvsroot_get') && !$vars->{'newid'}; + + # Print everything out + print $cgi->header(-type => 'text/html', + -expires => '+3M'); + $last_reader->sends_data_to(new PatchReader::DiffPrinter::template($template, + "attachment/diff-header.$format.tmpl", + "attachment/diff-file.$format.tmpl", + "attachment/diff-footer.$format.tmpl", + { %{$vars}, + bonsai_url => Param('bonsai_url'), + lxr_url => Param('lxr_url'), + lxr_root => Param('lxr_root'), + })); +} + +sub diff +{ + # Get patch data + SendSQL("SELECT bug_id, description, ispatch, thedata FROM attachments WHERE attach_id = $::FORM{'id'}"); + my ($bugid, $description, $ispatch, $thedata) = FetchSQLData(); + + # If it is not a patch, view normally + if (!$ispatch) + { + view(); + return; + } + + my ($reader, $last_reader) = setup_patch_readers(); + + if ($::FORM{'format'} eq "raw") + { + require PatchReader::DiffPrinter::raw; + $last_reader->sends_data_to(new PatchReader::DiffPrinter::raw()); + # Actually print out the patch + use vars qw($cgi); + print $cgi->header(-type => 'text/plain', + -expires => '+3M'); + $reader->iterate_string("Attachment " . $::FORM{'id'}, $thedata); + } + else + { + $vars->{other_patches} = []; + if ($::interdiffbin && $::diffpath) { + # Get list of attachments on this bug. + # Ignore the current patch, but select the one right before it + # chronologically. + SendSQL("SELECT attach_id, description FROM attachments WHERE bug_id = $bugid AND ispatch = 1 ORDER BY creation_ts DESC"); + my $select_next_patch = 0; + while (my ($other_id, $other_desc) = FetchSQLData()) { + if ($other_id eq $::FORM{'id'}) { + $select_next_patch = 1; + } else { + push @{$vars->{other_patches}}, { id => $other_id, desc => $other_desc, selected => $select_next_patch }; + if ($select_next_patch) { + $select_next_patch = 0; + } + } + } + } + + $vars->{bugid} = $bugid; + $vars->{attachid} = $::FORM{'id'}; + $vars->{description} = $description; + setup_template_patch_reader($last_reader); + # Actually print out the patch + $reader->iterate_string("Attachment " . $::FORM{'id'}, $thedata); + } +} sub viewall { @@ -450,8 +742,7 @@ sub viewall $vars->{'bugsummary'} = $bugsummary; $vars->{'GetBugLink'} = \&GetBugLink; - # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("attachment/show-multiple.html.tmpl", $vars) @@ -495,8 +786,7 @@ sub enter $vars->{'bugsummary'} = $bugsummary; $vars->{'GetBugLink'} = \&GetBugLink; - # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("attachment/create.html.tmpl", $vars) @@ -604,8 +894,7 @@ sub insert $vars->{'contenttypemethod'} = $::FORM{'contenttypemethod'}; $vars->{'contenttype'} = $::FORM{'contenttype'}; - # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("attachment/created.html.tmpl", $vars) @@ -667,8 +956,12 @@ sub edit $vars->{'attachments'} = \@bugattachments; $vars->{'GetBugLink'} = \&GetBugLink; - # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + # Determine if PatchReader is installed + eval { + require PatchReader; + $vars->{'patchviewerinstalled'} = 1; + }; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("attachment/edit.html.tmpl", $vars) @@ -695,11 +988,11 @@ sub update "flaginclusions AS i READ, flagexclusions AS e READ, " . # cc, bug_group_map, user_group_map, and groups are in here so we # can check the permissions of flag requestees and email addresses - # on the flag type cc: lists via the ConfirmGroup and CanSeeBug - # function calls in Flag::notify. group_group_map is in here in case - # ConfirmGroup needs to call DeriveGroup. profiles and user_group_map - # would be READ locks instead of WRITE locks if it weren't for - # DeriveGroup, which needs to write to those tables. + # on the flag type cc: lists via the CanSeeBug + # function call in Flag::notify. group_group_map is in here in case + # Bugzilla::User needs to rederive groups. profiles and + # user_group_map would be READ locks instead of WRITE locks if it + # weren't for derive_groups, which needs to write to those tables. "bugs READ, profiles WRITE, " . "cc READ, bug_group_map READ, user_group_map WRITE, " . "group_group_map READ, groups READ"); @@ -815,8 +1108,7 @@ sub update $vars->{'attachid'} = $::FORM{'id'}; $vars->{'bugid'} = $bugid; - # Return the appropriate HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("attachment/updated.html.tmpl", $vars) diff --git a/bug_status.html b/bug_status.html index 6f5bc635223aa2861d8aeba0fdb179649025a4f3..3ac554509ad2976937210f99eedf94e9efed1408 100755 --- a/bug_status.html +++ b/bug_status.html @@ -117,6 +117,9 @@ certain status transitions are allowed. code produces no clues as to why this behavior would occur. If more information appears later, please re-assign the bug, for now, file it. +<DT><B>MOVED</B> +<DD> The problem was specific to a related product whose bugs are tracked in + another bug database. The bug has been moved to that database. </DL> </TABLE> @@ -164,7 +167,7 @@ This is the hardware platform against which the bug was reported. Legal platforms include: <UL> -<LI> All (happens on all platform; cross-platform bug) +<LI> All (happens on all platforms; cross-platform bug) <LI> Macintosh <LI> PC <LI> Sun diff --git a/buglist.cgi b/buglist.cgi index 4acd5d55ec959602e5c9eee07eadf121bfc57718..fa664c251c7e8f3bdf7d7a37061713bdba2e0d37 100755 --- a/buglist.cgi +++ b/buglist.cgi @@ -33,7 +33,7 @@ use strict; use lib qw(.); -use vars qw($cgi $template $vars); +use vars qw($template $vars); use Bugzilla; use Bugzilla::Search; @@ -56,10 +56,12 @@ use vars qw($db_name $userid @versions); +my $cgi = Bugzilla->cgi; + if (length($::buffer) == 0) { - print "Refresh: 10; URL=query.cgi\n"; + print $cgi->header(-refresh=> '10; URL=query.cgi'); ThrowUserError("buglist_parameters_required"); -} +} ConnectToDatabase(); @@ -73,7 +75,7 @@ my $dotweak = $::FORM{'tweak'} ? 1 : 0; # Log the user in if ($dotweak) { confirm_login(); - UserInGroup("editbugs") || ThrowUserError("insufficient_perms_for_multi"); + UserInGroup("editbugs") || ThrowUserError("insufficient_privs_for_multi"); GetVersionTable(); } else { @@ -131,8 +133,7 @@ if ($::FORM{'regetlastlist'}) { if ($::buffer =~ /&cmd-/) { my $url = "query.cgi?$::buffer#chart"; - print "Refresh: 0; URL=$url\n"; - print "Content-Type: text/html\n\n"; + print $cgi->redirect(-location => $url); # Generate and return the UI (HTML page) from the appropriate template. $vars->{'message'} = "buglist_adding_field"; $vars->{'url'} = $url; @@ -172,6 +173,18 @@ sub LookupNamedQuery { return $result; } +sub LookupSeries { + my ($series_id) = @_; + detaint_natural($series_id) || ThrowCodeError("invalid_series_id"); + + my $dbh = Bugzilla->dbh; + my $result = $dbh->selectrow_array("SELECT query FROM series " . + "WHERE series_id = $series_id"); + $result + || ThrowCodeError("invalid_series_id", {'series_id' => $series_id}); + return $result; +} + sub GetQuip { my $quip; @@ -255,10 +268,15 @@ if ($::FORM{'cmdtype'} eq "dorem") { $params = new Bugzilla::CGI($::buffer); $order = $params->param('order') || $order; } + elsif ($::FORM{'remaction'} eq "runseries") { + $::buffer = LookupSeries($::FORM{"series_id"}); + $vars->{'title'} = "Bug List: $::FORM{'namedcmd'}"; + $params = new Bugzilla::CGI($::buffer); + $order = $params->param('order') || $order; + } elsif ($::FORM{'remaction'} eq "load") { my $url = "query.cgi?" . LookupNamedQuery($::FORM{"namedcmd"}); - print "Refresh: 0; URL=$url\n"; - print "Content-Type: text/html\n\n"; + print $cgi->redirect(-location=>$url); # Generate and return the UI (HTML page) from the appropriate template. $vars->{'message'} = "buglist_load_named_query"; $vars->{'namedcmd'} = $::FORM{'namedcmd'}; @@ -272,17 +290,11 @@ if ($::FORM{'cmdtype'} eq "dorem") { my $userid = DBNameToIdAndCheck($::COOKIE{"Bugzilla_login"}); my $qname = SqlQuote($::FORM{'namedcmd'}); SendSQL("DELETE FROM namedqueries WHERE userid = $userid AND name = $qname"); - # Now remove this query from the footer - my $count = 0; - foreach my $q (@{$::vars->{'user'}{'queries'}}) { - if ($q->{'name'} eq $::FORM{'namedcmd'}) { - splice(@{$::vars->{'user'}{'queries'}}, $count, 1); - last; - } - $count++; - } - print "Content-Type: text/html\n\n"; + # Now reset the cached queries + Bugzilla->user->flush_queries_cache(); + + print $cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $vars->{'message'} = "buglist_query_gone"; $vars->{'namedcmd'} = $::FORM{'namedcmd'}; @@ -317,6 +329,14 @@ elsif ($::FORM{'cmdtype'} eq "doit" && $::FORM{'remember'}) { my $tofooter = $::FORM{'tofooter'} ? 1 : 0; + $vars->{'message'} = "buglist_new_named_query"; + + # We want to display the correct message. Check if it existed before + # we insert, because ->queries may fetch from the db anyway + if (grep { $_->{name} eq $name } @{Bugzilla->user->queries()}) { + $vars->{'message'} = "buglist_updated_named_query"; + } + SendSQL("SELECT query FROM namedqueries WHERE userid = $userid AND name = $qname"); if (FetchOneColumn()) { SendSQL("UPDATE namedqueries @@ -327,24 +347,11 @@ elsif ($::FORM{'cmdtype'} eq "doit" && $::FORM{'remember'}) { SendSQL("REPLACE INTO namedqueries (userid, name, query, linkinfooter) VALUES ($userid, $qname, $qbuffer, $tofooter)"); } - - my $new_in_footer = $tofooter; - - # Don't add it to the list if they are reusing an existing query name. - foreach my $query (@{$vars->{'user'}{'queries'}}) { - if ($query->{'name'} eq $name && $query->{'linkinfooter'} == 1) { - $new_in_footer = 0; - } - } - - if ($new_in_footer) { - my %query = (name => $name, - query => $::buffer, - linkinfooter => $tofooter); - push(@{$vars->{'user'}{'queries'}}, \%query); - } - - $vars->{'message'} = "buglist_new_named_query"; + + # Make sure to invalidate any cached query data, so that the footer is + # correctly displayed + Bugzilla->user->flush_queries_cache(); + $vars->{'queryname'} = $name; } } @@ -378,6 +385,7 @@ sub DefineColumn { # Column: ID Name Title DefineColumn("bug_id" , "bugs.bug_id" , "ID" ); +DefineColumn("alias" , "bugs.alias" , "Alias" ); DefineColumn("opendate" , "bugs.creation_ts" , "Opened" ); DefineColumn("changeddate" , "bugs.delta_ts" , "Changed" ); DefineColumn("bug_severity" , "bugs.bug_severity" , "Severity" ); @@ -477,8 +485,11 @@ if (!UserInGroup(Param("timetrackinggroup"))) { # Generate the list of columns that will be selected in the SQL query. -# The bug ID is always selected because bug IDs are always displayed -my @selectcolumns = ("bug_id"); +# The bug ID is always selected because bug IDs are always displayed. +# Severity, priority, resolution and status are required for buglist +# CSS classes. +my @selectcolumns = ("bug_id", "bug_severity", "priority", "bug_status", + "resolution"); # remaining and actual_time are required for precentage_complete calculation: if (lsearch(\@displaycolumns, "percentage_complete") >= 0) { @@ -533,14 +544,14 @@ if ($order) { # Accept an order fragment matching a column name, with # asc|desc optionally following (to specify the direction) if (!grep($fragment =~ /^\Q$_\E(\s+(asc|desc))?$/, @columnnames)) { - $vars->{'fragment'} = $fragment; + my $vars = { fragment => $fragment }; if ($order_from_cookie) { - my $cookiepath = Param("cookiepath"); - print "Set-Cookie: LASTORDER= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n"; - ThrowCodeError("invalid_column_name_cookie"); + $cgi->send_cookie(-name => 'LASTORDER', + -expires => 'Tue, 15-Sep-1998 21:49:00 GMT'); + ThrowCodeError("invalid_column_name_cookie", $vars); } else { - ThrowCodeError("invalid_column_name_form"); + ThrowCodeError("invalid_column_name_form", $vars); } } } @@ -608,6 +619,15 @@ if ($db_order =~ /bugs.target_milestone/) { $query =~ s/\sWHERE\s/ LEFT JOIN milestones ms_order ON ms_order.value = bugs.target_milestone AND ms_order.product_id = bugs.product_id WHERE /; } +# Even more disgusting hack: if we are doing a full text search, +# order by relevance instead of anything else, and limit to 200 results. +if ($search->{'sorted_by_relevance'}) { + $db_order = $order = "relevance DESC LIMIT 200"; + $vars->{'sorted_by_relevance'} = 1; +} + + + $query .= " ORDER BY $db_order " if ($order); @@ -615,18 +635,23 @@ $query .= " ORDER BY $db_order " if ($order); # Query Execution ################################################################################ +if ($::FORM{'debug'}) { + $vars->{'debug'} = 1; + $vars->{'query'} = $query; +} + # Time to use server push to display an interim message to the user until # the query completes and we can display the bug list. if ($serverpush) { - # Generate HTTP headers. - print "Content-Disposition: inline; filename=$filename\n"; - print "Content-Type: multipart/x-mixed-replace;boundary=thisrandomstring\n\n"; - print "--thisrandomstring\n"; - print "Content-Type: text/html\n\n"; + print $cgi->multipart_init(-content_disposition => "inline; filename=$filename"); + + print $cgi->multipart_start(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("list/server-push.html.tmpl", $vars) || ThrowTemplateError($template->error()); + + print $cgi->multipart_end(); } # Connect to the shadow database if this installation is using one to improve @@ -752,11 +777,6 @@ if (scalar(@bugowners) > 1 && UserInGroup('editbugs')) { $vars->{'bugowners'} = $bugowners; } -if ($::FORM{'debug'}) { - $vars->{'debug'} = 1; - $vars->{'query'} = $query; -} - # Whether or not to split the column titles across two rows to make # the list more compact. $vars->{'splitheader'} = $::COOKIE{'SPLITHEADER'} ? 1 : 0; @@ -800,39 +820,46 @@ if ($dotweak) { # HTTP Header Generation ################################################################################ -# If we are doing server push, output a separator string. -print "\n--thisrandomstring\n" if $serverpush; - # Generate HTTP headers -# Suggest a name for the bug list if the user wants to save it as a file. -# If we are doing server push, then we did this already in the HTTP headers -# that started the server push, so we don't have to do it again here. -print "Content-Disposition: inline; filename=$filename\n" unless $serverpush; +my $contenttype; if ($format->{'extension'} eq "html") { my $cookiepath = Param("cookiepath"); - print "Content-Type: text/html\n"; if ($order) { - my $qorder = url_quote($order); - print "Set-Cookie: LASTORDER=$qorder ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; + $cgi->send_cookie(-name => 'LASTORDER', + -value => $order, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); } my $bugids = join(":", @bugidlist); # See also Bug 111999 if (length($bugids) < 4000) { - print "Set-Cookie: BUGLIST=$bugids ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; + $cgi->send_cookie(-name => 'BUGLIST', + -value => $bugids, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); } else { - print "Set-Cookie: BUGLIST= ; path=$cookiepath; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; + $cgi->send_cookie(-name => 'BUGLIST', + -expires => 'Tue, 15-Sep-1998 21:49:00 GMT'); $vars->{'toolong'} = 1; } + + $contenttype = "text/html"; } else { - print "Content-Type: $format->{'ctype'}\n"; + $contenttype = $format->{'ctype'}; } -print "\n"; # end HTTP headers +if ($serverpush) { + print $cgi->multipart_start(-type=>$contenttype); +} else { + # Suggest a name for the bug list if the user wants to save it as a file. + # If we are doing server push, then we did this already in the HTTP headers + # that started the server push, so we don't have to do it again here. + print $cgi->header(-type => $contenttype, + -content_disposition => "inline; filename=$filename"); +} ################################################################################ @@ -848,4 +875,4 @@ $template->process($format->{'template'}, $vars) # Script Conclusion ################################################################################ -print "\n--thisrandomstring--\n" if $serverpush; +print $cgi->multipart_final() if $serverpush; diff --git a/chart.cgi b/chart.cgi new file mode 100755 index 0000000000000000000000000000000000000000..8ab299aba054942082f0ae89b9799ab4bea01c40 --- /dev/null +++ b/chart.cgi @@ -0,0 +1,312 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Gervase Markham <gerv@gerv.net> + +# Glossary: +# series: An individual, defined set of data plotted over time. +# line: A set of one or more series, to be summed and drawn as a single +# line when the series is plotted. +# chart: A set of lines +# So when you select rows in the UI, you are selecting one or more lines, not +# series. + +# Generic Charting TODO: +# +# JS-less chart creation - hard. +# Broken image on error or no data - need to do much better. +# Centralise permission checking, so UserInGroup('editbugs') not scattered +# everywhere. +# Better protection on collectstats.pl for second run in a day +# User documentation :-) +# +# Bonus: +# Offer subscription when you get a "series already exists" error? + +use strict; +use lib qw(.); + +require "CGI.pl"; +use Bugzilla::Chart; +use Bugzilla::Series; + +use vars qw($cgi $template $vars); + +# Go back to query.cgi if we are adding a boolean chart parameter. +if (grep(/^cmd-/, $cgi->param())) { + my $params = $cgi->canonicalise_query("format", "ctype", "action"); + print "Location: query.cgi?format=" . $cgi->param('query_format') . + ($params ? "&$params" : "") . "\n\n"; + exit; +} + +my $template = Bugzilla->template; +my $action = $cgi->param('action'); +my $series_id = $cgi->param('series_id'); + +# Because some actions are chosen by buttons, we can't encode them as the value +# of the action param, because that value is localisation-dependent. So, we +# encode it in the name, as "action-<action>". Some params even contain the +# series_id they apply to (e.g. subscribe, unsubscribe.) +my @actions = grep(/^action-/, $cgi->param()); +if ($actions[0] && $actions[0] =~ /^action-([^\d]+)(\d*)$/) { + $action = $1; + $series_id = $2 if $2; +} + +$action ||= "assemble"; + +# Go to buglist.cgi if we are doing a search. +if ($action eq "search") { + my $params = $cgi->canonicalise_query("format", "ctype", "action"); + print "Location: buglist.cgi" . ($params ? "?$params" : "") . "\n\n"; + exit; +} + +ConnectToDatabase(); + +confirm_login(); + +# All these actions relate to chart construction. +if ($action =~ /^(assemble|add|remove|sum|subscribe|unsubscribe)$/) { + # These two need to be done before the creation of the Chart object, so + # that the changes they make will be reflected in it. + if ($action =~ /^subscribe|unsubscribe$/) { + my $series = new Bugzilla::Series($series_id); + $series->$action($::userid); + } + + my $chart = new Bugzilla::Chart($cgi); + + if ($action =~ /^remove|sum$/) { + $chart->$action(getSelectedLines()); + } + elsif ($action eq "add") { + my @series_ids = getAndValidateSeriesIDs(); + $chart->add(@series_ids); + } + + view($chart); +} +elsif ($action eq "plot") { + plot(); +} +elsif ($action eq "wrap") { + # For CSV "wrap", we go straight to "plot". + if ($cgi->param('ctype') && $cgi->param('ctype') eq "csv") { + plot(); + } + else { + wrap(); + } +} +elsif ($action eq "create") { + assertCanCreate($cgi); + my $series = new Bugzilla::Series($cgi); + + if (ref($series)) { + $vars->{'message'} = "series_created"; + } + else { + $vars->{'message'} = "series_already_exists"; + $series = new Bugzilla::Series($series); + } + + $vars->{'series'} = $series; + + print "Content-Type: text/html\n\n"; + $template->process("global/message.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +elsif ($action eq "edit") { + $series_id || ThrowCodeError("invalid_series_id"); + assertCanEdit($series_id); + + my $series = new Bugzilla::Series($series_id); + edit($series); +} +elsif ($action eq "alter") { + $series_id || ThrowCodeError("invalid_series_id"); + assertCanEdit($series_id); + + my $series = new Bugzilla::Series($series_id); + $series->alter($cgi); + edit($series); +} +else { + ThrowCodeError("unknown_action"); +} + +exit; + +# Find any selected series and return either the first or all of them. +sub getAndValidateSeriesIDs { + my @series_ids = grep(/^\d+$/, $cgi->param("name")); + + return wantarray ? @series_ids : $series_ids[0]; +} + +# Return a list of IDs of all the lines selected in the UI. +sub getSelectedLines { + my @ids = map { /^select(\d+)$/ ? $1 : () } $cgi->param(); + + return @ids; +} + +# Check if the user is the owner of series_id or is an admin. +sub assertCanEdit { + my ($series_id) = @_; + + return if UserInGroup("admin"); + + my $dbh = Bugzilla->dbh; + my $iscreator = $dbh->selectrow_array("SELECT creator = ? FROM series " . + "WHERE series_id = ?", undef, + $::userid, $series_id); + $iscreator || ThrowUserError("illegal_series_edit"); +} + +# Check if the user is permitted to create this series with these parameters. +sub assertCanCreate { + my ($cgi) = shift; + + UserInGroup("editbugs") || ThrowUserError("illegal_series_creation"); + + # Only admins may create public queries + UserInGroup('admin') || $cgi->delete('public'); + + # Check permission for frequency + my $min_freq = 7; + if ($cgi->param('frequency') < $min_freq && !UserInGroup("admin")) { + ThrowUserError("illegal_frequency", { 'minimum' => $min_freq }); + } +} + +sub validateWidthAndHeight { + $vars->{'width'} = $cgi->param('width'); + $vars->{'height'} = $cgi->param('height'); + + if (defined($vars->{'width'})) { + (detaint_natural($vars->{'width'}) && $vars->{'width'} > 0) + || ThrowCodeError("invalid_dimensions"); + } + + if (defined($vars->{'height'})) { + (detaint_natural($vars->{'height'}) && $vars->{'height'} > 0) + || ThrowCodeError("invalid_dimensions"); + } + + # The equivalent of 2000 square seems like a very reasonable maximum size. + # This is merely meant to prevent accidental or deliberate DOS, and should + # have no effect in practice. + if ($vars->{'width'} && $vars->{'height'}) { + (($vars->{'width'} * $vars->{'height'}) <= 4000000) + || ThrowUserError("chart_too_large"); + } +} + +sub edit { + my $series = shift; + + $vars->{'category'} = Bugzilla::Chart::getVisibleSeries(); + $vars->{'creator'} = new Bugzilla::User($series->{'creator'}); + + # If we've got any parameters, use those in preference to the values + # read from the database. This is a bit ugly, but I can't see a better + # way to make this work in the no-JS situation. + if ($cgi->param('category') || $cgi->param('subcategory') || + $cgi->param('name') || $cgi->param('frequency') || + $cgi->param('public')) + { + $vars->{'default'} = new Bugzilla::Series($series->{'series_id'}, + $cgi->param('category') || $series->{'category'}, + $cgi->param('subcategory') || $series->{'subcategory'}, + $cgi->param('name') || $series->{'name'}, + $series->{'creator'}, + $cgi->param('frequency') || $series->{'frequency'}); + + $vars->{'default'}{'public'} + = $cgi->param('public') || $series->{'public'}; + } + else { + $vars->{'default'} = $series; + } + + print "Content-Type: text/html\n\n"; + $template->process("reports/edit-series.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +sub plot { + validateWidthAndHeight(); + $vars->{'chart'} = new Bugzilla::Chart($cgi); + + my $format = &::GetFormat("reports/chart", + "", + $cgi->param('ctype')); + + # Debugging PNGs is a pain; we need to be able to see the error messages + if ($cgi->param('debug')) { + print "Content-Type: text/html\n\n"; + $vars->{'chart'}->dump(); + } + + print "Content-Type: $format->{'ctype'}\n\n"; + $template->process($format->{'template'}, $vars) + || ThrowTemplateError($template->error()); +} + +sub wrap { + validateWidthAndHeight(); + + # We create a Chart object so we can validate the parameters + my $chart = new Bugzilla::Chart($cgi); + + $vars->{'time'} = time(); + + $vars->{'imagebase'} = $cgi->canonicalise_query( + "action", "action-wrap", "ctype", "format", "width", "height"); + + print "Content-Type:text/html\n\n"; + $template->process("reports/chart.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +sub view { + my $chart = shift; + + # Set defaults + foreach my $field ('category', 'subcategory', 'name', 'ctype') { + $vars->{'default'}{$field} = $cgi->param($field) || 0; + } + + # Pass the state object to the display UI. + $vars->{'chart'} = $chart; + $vars->{'category'} = Bugzilla::Chart::getVisibleSeries(); + + print "Content-Type: text/html\n\n"; + + # If we have having problems with bad data, we can set debug=1 to dump + # the data structure. + $chart->dump() if $cgi->param('debug'); + + $template->process("reports/create-chart.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} diff --git a/checksetup.pl b/checksetup.pl index 7c44eaa6807e351d8c0b6e371a7aa150b9dd2e6a..15d5231fb162acd111b65a6810030f9af8cdf6af 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -26,6 +26,7 @@ # Jacob Steenhagen <jake@bugzilla.org> # Bradley Baetz <bbaetz@student.usyd.edu.au> # Tobias Burnus <burnus@net-b.de> +# Gervase Markham <gerv@gerv.net> # # # Direct any questions on this source code to @@ -112,6 +113,8 @@ # use strict; +use lib "."; + use vars qw( $db_name %answer ); use Bugzilla::Constants; @@ -211,7 +214,7 @@ my $modules = [ }, { name => 'CGI', - version => '2.88' + version => '2.93' }, { name => 'Data::Dumper', @@ -265,6 +268,7 @@ my $chartbase = have_vers("Chart::Base","0.99"); my $xmlparser = have_vers("XML::Parser",0); my $gdgraph = have_vers("GD::Graph",0); my $gdtextalign = have_vers("GD::Text::Align",0); +my $patchreader = have_vers("PatchReader",0); print "\n" unless $silent; if ((!$gd || !$chartbase) && !$silent) { @@ -292,6 +296,17 @@ if ((!$gd || !$gdgraph || !$gdtextalign) && !$silent) { "-e'install \"GD::Text::Align\"'\n" if !$gdtextalign; print "\n"; } +if (!$patchreader && !$silent) { + print "If you want to see pretty HTML views of patches, you should "; + print "install the \nPatchReader module, which can be downloaded at:\n"; + print "http://search.cpan.org/CPAN/authors/id/J/JK/JKEISER/PatchReader-0.9.2.tar.gz\n"; + print "When you get it, do the following to install:\n"; + print "tar xzvf PatchReader-0.9.2.tar.gz\n"; + print "cd PatchReader-0.9.2\n"; + print "perl Makefile.PL\n"; + print "make install\n\n"; +} + if (%missing) { print "\n\n"; print "Bugzilla requires some Perl modules which are either missing from your\n", @@ -376,11 +391,18 @@ checksetup.pl, and re-enter your answers. EOT die "Syntax error in localconfig"; } + +sub LocalVarExists ($) +{ + my ($name) = @_; + return $main::{$name}; # if localconfig declared it, we're done. +} + my $newstuff = ""; sub LocalVar ($$) { my ($name, $definition) = @_; - return if ($main::{$name}); # if localconfig declared it, we're done. + return if LocalVarExists($name); # if localconfig declared it, we're done. $newstuff .= " " . $name; open FILE, '>>localconfig'; print FILE ($answer{$name} or $definition), "\n\n"; @@ -388,7 +410,6 @@ sub LocalVar ($$) } - # # Set up the defaults for the --LOCAL-- variables below: # @@ -408,15 +429,16 @@ LocalVar('index_html', <<'END'); $index_html = 0; END -my $mysql_binaries = `which mysql`; -if ($mysql_binaries =~ /no mysql/) { - # If which didn't find it, just provide a reasonable default - $mysql_binaries = "/usr/bin"; -} else { - $mysql_binaries =~ s:/mysql\n$::; -} +if (!LocalVarExists('mysqlpath')) { + my $mysql_binaries = `which mysql`; + if ($mysql_binaries =~ /no mysql/ || $mysql_binaries eq '') { + # If which didn't find it, just provide a reasonable default + $mysql_binaries = "/usr/bin"; + } else { + $mysql_binaries =~ s:/mysql\n$::; + } -LocalVar('mysqlpath', <<"END"); + LocalVar('mysqlpath', <<"END"); # # In order to do certain functions in Bugzilla (such as sync the shadow # database), we require the MySQL Binaries (mysql, mysqldump, and mysqladmin). @@ -425,6 +447,75 @@ LocalVar('mysqlpath', <<"END"); # Please specify only the directory name, with no trailing slash. \$mysqlpath = "$mysql_binaries"; END +} + + +if (!LocalVarExists('cvsbin')) { + my $cvs_executable = `which cvs`; + if ($cvs_executable =~ /no cvs/ || $cvs_executable eq '') { + # If which didn't find it, just set to blank + $cvs_executable = ""; + } else { + chomp $cvs_executable; + } + + LocalVar('cvsbin', <<"END"); +# +# For some optional functions of Bugzilla (such as the pretty-print patch +# viewer), we need the cvs binary to access files and revisions. +# Because it's possible that this program is not in your path, you can specify +# its location here. Please specify the full path to the executable. +\$cvsbin = "$cvs_executable"; +END +} + + +if (!LocalVarExists('interdiffbin')) { + my $interdiff_executable = `which interdiff`; + if ($interdiff_executable =~ /no interdiff/ || $interdiff_executable eq '') { + if (!$silent) { + print "\nOPTIONAL NOTE: If you want to "; + print "be able to use the\n 'difference between two patches' "; + print "feature of Bugzilla (requires\n the PatchReader Perl module "; + print "as well), you should install\n patchutils from "; + print "http://cyberelk.net/tim/patchutils/\n\n"; + } + + # If which didn't find it, set to blank + $interdiff_executable = ""; + } else { + chomp $interdiff_executable; + } + + LocalVar('interdiffbin', <<"END"); + +# +# For some optional functions of Bugzilla (such as the pretty-print patch +# viewer), we need the interdiff binary to make diffs between two patches. +# Because it's possible that this program is not in your path, you can specify +# its location here. Please specify the full path to the executable. +\$interdiffbin = "$interdiff_executable"; +END +} + + +if (!LocalVarExists('diffpath')) { + my $diff_binaries = `which diff`; + if ($diff_binaries =~ /no diff/ || $diff_binaries eq '') { + # If which didn't find it, set to blank + $diff_binaries = ""; + } else { + $diff_binaries =~ s:/diff\n$::; + } + + LocalVar('diffpath', <<"END"); + +# +# The interdiff feature needs diff, so we have to have that path. +# Please specify only the directory name, with no trailing slash. +\$diffpath = "$diff_binaries"; +END +} LocalVar('create_htaccess', <<'END'); @@ -540,6 +631,7 @@ LocalVar('opsys', ' "Windows 2000", "Windows NT", "Windows XP", + "Windows Server 2003", "Mac System 7", "Mac System 7.5", "Mac System 7.6.1", @@ -551,7 +643,7 @@ LocalVar('opsys', ' "Mac OS X 10.1", "Mac OS X 10.2", "Linux", - "BSDI", + "BSD/OS", "FreeBSD", "NetBSD", "OpenBSD", @@ -587,24 +679,6 @@ LocalVar('platforms', ' ); '); - - -LocalVar('contenttypes', ' -# -# The types of content that template files can generate, indexed by file extension. -# -$contenttypes = { - "html" => "text/html" , - "rdf" => "application/xml" , - "xml" => "text/xml" , - "js" => "application/x-javascript" , - "csv" => "text/plain" , - "png" => "image/png" , -}; -'); - - - if ($newstuff ne "") { print "\nThis version of Bugzilla contains some variables that you may want\n", "to change and adapt to your local settings. Please edit the file\n", @@ -1004,6 +1078,7 @@ END bug_link => [ sub { return sub { return $_; } }, 1], csv => sub { return $_; }, time => sub { return $_; }, + none => sub { return $_; } , }, }) || die ("Could not create Template Provider: " . Template::Provider->error() . "\n"); @@ -1158,6 +1233,7 @@ if ($my_webservergroup) { fixPerms('Bugzilla', $<, $webservergid, 027, 1); fixPerms('template', $<, $webservergid, 027, 1); fixPerms('css', $<, $webservergid, 027, 1); + fixPerms('js', $<, $webservergid, 027, 1); chmod 0644, 'globals.pl'; chmod 0644, 'RelationSet.pm'; @@ -1183,6 +1259,7 @@ if ($my_webservergroup) { fixPerms('Bugzilla', $<, $gid, 022, 1); fixPerms('template', $<, $gid, 022, 1); fixPerms('css', $<, $gid, 022, 1); + fixPerms('js', $<, $gid, 022, 1); # Don't use fixPerms here, because it won't change perms on the directory # unless its using recursion @@ -1356,7 +1433,7 @@ print "\n" unless $silent; # safer than the make*.sh shell scripts used to be, because they won't # delete existing tables. # -# If you want intentionally do this, yon can always drop a table and re-run +# If you want to intentionally do this, you can always drop a table and re-run # checksetup, e.g. like this: # # $ mysql bugs @@ -1474,7 +1551,7 @@ $table{bugs} = bug_severity enum($my_severities) not null, bug_status enum("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED", "RESOLVED", "VERIFIED", "CLOSED") not null, creation_ts datetime not null, - delta_ts timestamp, + delta_ts timestamp not null, short_desc mediumtext, op_sys enum($my_opsys) not null, priority enum($my_priorities) not null, @@ -1514,6 +1591,8 @@ $table{bugs} = index (target_milestone), index (qa_contact), index (votes), + + fulltext (short_desc), unique(alias)'; @@ -1542,7 +1621,8 @@ $table{longdescs} = isprivate tinyint not null default 0, index(bug_id), index(who), - index(bug_when)'; + index(bug_when), + fulltext (thetext)'; $table{components} = @@ -1659,7 +1739,7 @@ $table{versions} = $table{votes} = 'who mediumint not null, bug_id mediumint not null, - count smallint not null, + vote_count smallint not null, index(who), index(bug_id)'; @@ -1753,6 +1833,42 @@ $table{group_control_map} = unique(product_id, group_id), index(group_id)'; +# 2003-06-26 gerv@gerv.net, bug 16009 +# Generic charting over time of arbitrary queries. +# Queries are disabled when frequency == 0. +$table{series} = + 'series_id mediumint auto_increment primary key, + creator mediumint not null, + category smallint not null, + subcategory smallint not null, + name varchar(64) not null, + frequency smallint not null, + last_viewed datetime default null, + query mediumtext not null, + + index(creator), + unique(creator, category, subcategory, name)'; + +$table{series_data} = + 'series_id mediumint not null, + date datetime not null, + value mediumint not null, + + unique(series_id, date)'; + +$table{user_series_map} = + 'user_id mediumint not null, + series_id mediumint not null, + + index(series_id), + unique(user_id, series_id)'; + +$table{series_categories} = + 'category_id smallint auto_increment primary key, + name varchar(64) not null, + + unique(name)'; + ########################################################################### # Create tables ########################################################################### @@ -1782,7 +1898,8 @@ if(scalar(@isam_tables)) { # Get a list of the existing tables (if any) in the database -my @tables = map { $_ =~ s/.*\.//; $_ } $dbh->tables; +$sth = $dbh->table_info(undef, undef, undef, "TABLE"); +my @tables = @{$dbh->selectcol_arrayref($sth, { Columns => [3] })}; #print 'Tables: ', join " ", @tables, "\n"; # add lines here if you add more --LOCAL-- config vars that end up in the enums: @@ -1930,6 +2047,8 @@ AddFDef("setters.login_name", "Flag Setter", 0); AddFDef("work_time", "Hours Worked", 0); AddFDef("percentage_complete", "Percentage Complete", 0); +AddFDef("content", "Content", 0); + ########################################################################### # Detect changed local settings ########################################################################### @@ -2120,7 +2239,7 @@ sub RenameField ($$$) if ($$ref[1] ne $newname) { print "Updating field $field in table $table ...\n"; my $type = $$ref[1]; - $type .= " NOT NULL" if $$ref[3]; + $type .= " NOT NULL" if !$$ref[2]; $dbh->do("ALTER TABLE $table CHANGE $field $newname $type"); @@ -3546,6 +3665,109 @@ if ($mapcnt == 0) { } } +# 2003-06-26 Copy the old charting data into the database, and create the +# queries that will keep it all running. When the old charting system goes +# away, if this code ever runs, it'll just find no files and do nothing. +my $series_exists = $dbh->selectrow_array("SELECT 1 FROM series LIMIT 1"); + +if (!$series_exists) { + print "Migrating old chart data into database ...\n" unless $silent; + + require Bugzilla::Series; + + # We prepare the handle to insert the series data + my$seriesdatasth = $dbh->prepare("INSERT INTO series_data " . + "(series_id, date, value) " . + "VALUES (?, ?, ?)"); + + # Fields in the data file (matches the current collectstats.pl) + my @statuses = + qw(NEW ASSIGNED REOPENED UNCONFIRMED RESOLVED VERIFIED CLOSED); + my @resolutions = + qw(FIXED INVALID WONTFIX LATER REMIND DUPLICATE WORKSFORME MOVED); + my @fields = (@statuses, @resolutions); + + # We have a localisation problem here. Where do we get these values? + my $all_name = "-All-"; + my $open_name = "All Open"; + + # We can't give the Series we create a meaningful owner; that's not a big + # problem. But we do need to set this global, otherwise Series.pm objects. + $::userid = 0; + + my $products = $dbh->selectall_arrayref("SELECT name FROM products"); + + foreach my $product ((map { $_->[0] } @$products), "-All-") { + # First, create the series + my %queries; + my %seriesids; + + my $query_prod = ""; + if ($product ne "-All-") { + $query_prod = "product=" . html_quote($product) . "&"; + } + + # The query for statuses is different to that for resolutions. + $queries{$_} = ($query_prod . "bug_status=$_") foreach (@statuses); + $queries{$_} = ($query_prod . "resolution=$_") foreach (@resolutions); + + foreach my $field (@fields) { + # Create a Series for each field in this product + my $series = new Bugzilla::Series(-1, $product, $all_name, + $field, $::userid, 1, + $queries{$field}); + $series->createInDatabase(); + $seriesids{$field} = $series->{'series_id'}; + } + + # We also add a new query for "Open", so that migrated products get + # the same set as new products (see editproducts.cgi.) + my @openedstatuses = ("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"); + my $query = join("&", map { "bug_status=$_" } @openedstatuses); + my $series = new Bugzilla::Series(-1, $product, $all_name, + $open_name, $::userid, 1, + $query_prod . $query); + $series->createInDatabase(); + + # Now, we attempt to read in historical data, if any + # Convert the name in the same way that collectstats.pl does + my $product_file = $product; + $product_file =~ s/\//-/gs; + $product_file = "data/mining/$product_file"; + + # There are many reasons that this might fail (e.g. no stats for this + # product), so we don't worry if it does. + open(IN, $product_file) or next; + + # The data files should be in a standard format, even for old + # Bugzillas, because of the conversion code further up this file. + my %data; + + while (<IN>) { + if (/^(\d+\|.*)/) { + my @numbers = split(/\||\r/, $1); + for my $i (0 .. $#fields) { + # $numbers[0] is the date + $data{$fields[$i]}{$numbers[0]} = $numbers[$i + 1]; + } + } + } + + close(IN); + + foreach my $field (@fields) { + # Insert values into series_data: series_id, date, value + my %fielddata = %{$data{$field}}; + foreach my $date (keys %fielddata) { + # We prepared this above + $seriesdatasth->execute($seriesids{$field}, + $dbh->quote($date), + $fielddata{$date} || 0); + } + } + } +} + # If you had to change the --TABLE-- definition in any way, then add your # differential change code *** A B O V E *** this comment. # @@ -3752,16 +3974,18 @@ if ($sth->rows == 0) { system("stty","-echo"); # disable input echoing while( $pass1 ne $pass2 ) { - while( $pass1 eq "" || $pass1 !~ /^[a-zA-Z0-9-_]{3,16}$/ ) { + while( $pass1 eq "" || $pass1 !~ /^[[:print:]]{3,16}$/ ) { print "Enter a password for the administrator account: "; $pass1 = $answer{'ADMIN_PASSWORD'} || ($silent && die("cant preload ADMIN_PASSWORD")) || <STDIN>; chomp $pass1; if(! $pass1 ) { - print "\n\nIt's just plain stupid to not have a password. Try again!\n"; + print "\n\nAn empty password is a security risk. Try again!\n"; } elsif ( $pass1 !~ /^.{3,16}$/ ) { - print "The password must be 3-16 characters in length."; + print "\n\nThe password must be 3-16 characters in length.\n"; + } elsif ( $pass1 !~ /^[[:print:]]{3,16}$/ ) { + print "\n\nThe password contains non-printable characters.\n"; } } print "\nPlease retype the password to verify: "; @@ -3826,6 +4050,15 @@ if ($sth->rows == 0) { print "\n$login is now set up as an administrator account.\n"; } +# Add fulltext indexes for bug summaries and descriptions/comments. +if (!defined GetIndexDef('bugs', 'short_desc')) { + print "Adding full-text index for short_desc column in bugs table...\n"; + $dbh->do('ALTER TABLE bugs ADD FULLTEXT (short_desc)'); +} +if (!defined GetIndexDef('longdescs', 'thetext')) { + print "Adding full-text index for thetext column in longdescs table...\n"; + $dbh->do('ALTER TABLE longdescs ADD FULLTEXT (thetext)'); +} # 2002 November, myk@mozilla.org, bug 178841: # @@ -3869,11 +4102,21 @@ if (TableExists('shadowlog')) { $dbh->do("DROP TABLE shadowlog"); } -# 2003-04-24 - myk@mozilla.org/bbaetz@acm.org, bug 201018 -# Force all cached groups to be updated at login, due to security -# At the next schema change, this should be moved inside that block so that the -# update doesn't happen on every run -$dbh->do("UPDATE profiles SET refreshed_when='1900-01-01 00:00:00'"); +# 2003-04-XX - bugzilla@chimpychompy.org (GavinS) +# +# Bug 180086 (http://bugzilla.mozilla.org/show_bug.cgi?id=180086) +# +# Renaming the 'count' column in the votes table because Sybase doesn't +# like it +if (GetFieldDef('votes', 'count')) { + # 2003-04-24 - myk@mozilla.org/bbaetz@acm.org, bug 201018 + # Force all cached groups to be updated at login, due to security bug + # Do this here, inside the next schema change block, so that it doesn't + # get invalidated on every checksetup run. + $dbh->do("UPDATE profiles SET refreshed_when='1900-01-01 00:00:00'"); + + RenameField ('votes', 'count', 'vote_count'); +} # # Final checks... diff --git a/colchange.cgi b/colchange.cgi index 5e28a46229c5fbb33195fc765833092f4ee5f1e2..e5b8e6f79298f745a3ac5d98620b60b1d64288bf 100755 --- a/colchange.cgi +++ b/colchange.cgi @@ -32,6 +32,8 @@ use vars qw( $vars ); +use Bugzilla; + require "CGI.pl"; ConnectToDatabase(); @@ -39,6 +41,8 @@ quietly_check_login(); GetVersionTable(); +my $cgi = Bugzilla->cgi; + # The master list not only says what fields are possible, but what order # they get displayed in. my @masterlist = ("opendate", "changeddate", "bug_severity", "priority", @@ -47,6 +51,9 @@ my @masterlist = ("opendate", "changeddate", "bug_severity", "priority", "resolution", "product", "component", "version", "op_sys", "votes"); +if (Param("usebugaliases")) { + unshift(@masterlist, "alias"); +} if (Param("usetargetmilestone")) { push(@masterlist, "target_milestone"); } @@ -87,12 +94,15 @@ if (defined $::FORM{'rememberedquery'}) { } my $list = join(" ", @collist); my $urlbase = Param("urlbase"); - my $cookiepath = Param("cookiepath"); - - print "Set-Cookie: COLUMNLIST=$list ; path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; - print "Set-Cookie: SPLITHEADER=$::FORM{'splitheader'} ; path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; - print "Refresh: 0; URL=buglist.cgi?$::FORM{'rememberedquery'}\n"; - print "Content-type: text/html\n\n"; + + $cgi->send_cookie(-name => 'COLUMNLIST', + -value => $list, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); + $cgi->send_cookie(-name => 'SPLITHEADER', + -value => $::FORM{'splitheader'}, + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); + + print $cgi->redirect("buglist.cgi?$::FORM{'rememberedquery'}"); $vars->{'message'} = "change_columns"; $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); @@ -111,6 +121,6 @@ $vars->{'splitheader'} = $::COOKIE{'SPLITHEADER'} ? 1 : 0; $vars->{'buffer'} = $::buffer; # Generate and return the UI (HTML page) from the appropriate template. -print "Content-type: text/html\n\n"; +print $cgi->header(); $template->process("list/change-columns.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/collectstats.pl b/collectstats.pl index eedeaa35b0d4d27cca833d2b36784085ca1c4611..5c1f6d499edaa7ec56202f2c28150252ba031a66 100755 --- a/collectstats.pl +++ b/collectstats.pl @@ -32,7 +32,10 @@ use strict; use IO::Handle; use vars @::legal_product; +use lib "."; require "globals.pl"; +use Bugzilla::Search; +use Bugzilla::User; use Bugzilla; @@ -79,6 +82,8 @@ my $tend = time; &calculate_dupes(); +CollectSeriesData(); + # Generate a static RDF file containing the default view of the duplicates data. open(CGI, "GATEWAY_INTERFACE=cmdline REQUEST_METHOD=GET QUERY_STRING=ctype=rdf ./duplicates.cgi |") || die "can't fork duplicates.cgi: $!"; @@ -421,3 +426,71 @@ sub delta_time { my $seconds = $delta - ($minutes * 60) - ($hours * 3600); return sprintf("%02d:%02d:%02d" , $hours, $minutes, $seconds); } + +sub CollectSeriesData { + # We need some way of randomising the distribution of series, such that + # all of the series which are to be run every 7 days don't run on the same + # day. This is because this might put the server under severe load if a + # particular frequency, such as once a week, is very common. We achieve + # this by only running queries when: + # (days_since_epoch + series_id) % frequency = 0. So they'll run every + # <frequency> days, but the start date depends on the series_id. + my $days_since_epoch = int(time() / (60 * 60 * 24)); + my $today = today_dash(); + + CleanupChartTables() if ($days_since_epoch % 7 == 0); + + my $dbh = Bugzilla->dbh; + my $serieses = $dbh->selectall_hashref("SELECT series_id, query, creator " . + "FROM series " . + "WHERE frequency != 0 AND " . + "($days_since_epoch + series_id) % frequency = 0", + "series_id"); + + # We prepare the insertion into the data table, for efficiency. + my $sth = $dbh->prepare("INSERT INTO series_data " . + "(series_id, date, value) " . + "VALUES (?, " . $dbh->quote($today) . ", ?)"); + + foreach my $series_id (keys %$serieses) { + # We set up the user for Search.pm's permission checking - each series + # runs with the permissions of its creator. + my $user = new Bugzilla::User($serieses->{$series_id}->{'creator'}); + + my $cgi = new Bugzilla::CGI($serieses->{$series_id}->{'query'}); + my $search = new Bugzilla::Search('params' => $cgi, + 'fields' => ["bugs.bug_id"], + 'user' => $user); + my $sql = $search->getSQL(); + + # We need to count the returned rows. Without subselects, we can't + # do this directly in the SQL for all queries. So we do it by hand. + my $data = $dbh->selectall_arrayref($sql); + + my $count = scalar(@$data) || 0; + + $sth->execute($series_id, $count); + } +} + +sub CleanupChartTables { + my $dbh = Bugzilla->dbh; + + $dbh->do("LOCK TABLES series WRITE, user_series_map AS usm READ"); + + # Find all those that no-one subscribes to + my $series_data = $dbh->selectall_arrayref("SELECT series.series_id " . + "FROM series LEFT JOIN user_series_map AS usm " . + "ON series.series_id = usm.series_id " . + "WHERE usm.series_id IS NULL"); + + my $series_ids = join(",", map({ $_->[0] } @$series_data)); + + # Stop collecting data on all series which no-one is subscribed to. + if ($series_ids) { + $dbh->do("UPDATE series SET frequency = 0 " . + "WHERE series_id IN($series_ids)"); + } + + $dbh->do("UNLOCK TABLES"); +} diff --git a/config.cgi b/config.cgi new file mode 100755 index 0000000000000000000000000000000000000000..a02ff8c7bc514618097833e8c8efa615f5061944 --- /dev/null +++ b/config.cgi @@ -0,0 +1,102 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (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.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Terry Weissman <terry@mozilla.org> +# Myk Melez <myk@mozilla.org> + +################################################################################ +# Script Initialization +################################################################################ + +# Make it harder for us to do dangerous things in Perl. +use diagnostics; +use strict; + +# Include the Bugzilla CGI and general utility library. +use lib qw(.); +require "CGI.pl"; + +# Connect to the database so we can check whether the user is a member +# of each product group. +ConnectToDatabase(); + +# Retrieve this installation's configuration. +GetVersionTable(); + +# Suppress "used only once" warnings. +use vars + qw( + @legal_priority + @legal_severity + @legal_platform + @legal_opsys + @legal_resolution + + @legal_components + @legal_target_milestone + @legal_versions + @legal_keywords + + %FORM + ); + +# Use the global template variables defined in globals.pl +# to generate the output. +use vars qw($template $vars); + +# Pass a bunch of Bugzilla configuration to the templates. +$vars->{'priority'} = \@::legal_priority; +$vars->{'severity'} = \@::legal_severity; +$vars->{'platform'} = \@::legal_platform; +$vars->{'op_sys'} = \@::legal_opsys; +$vars->{'keyword'} = \@::legal_keywords; +$vars->{'resolution'} = \@::legal_resolution; +$vars->{'status'} = \@::legal_bug_status; + +# Include lists of products, components, versions, and target milestones. +my $selectables = GetSelectableProductHash(); +foreach my $selectable (keys %$selectables) { + $vars->{$selectable} = $selectables->{$selectable}; +} + +# Create separate lists of open versus resolved statuses. This should really +# be made part of the configuration. +my @open_status; +my @closed_status; +foreach my $status (@::legal_bug_status) { + IsOpenedState($status) ? push(@open_status, $status) + : push(@closed_status, $status); +} +$vars->{'open_status'} = \@open_status; +$vars->{'closed_status'} = \@closed_status; + +# Generate a list of fields that can be queried. +$vars->{'field'} = [GetFieldDefs()]; + +# Determine how the user would like to receive the output; +# default is JavaScript. +my $format = GetFormat("config", $::FORM{'format'}, $::FORM{'ctype'} || "js"); + +# Return HTTP headers. +print "Content-Type: $format->{'ctype'}\n\n"; + +# Generate the configuration file and return it to the user. +$template->process($format->{'template'}, $vars) + || ThrowTemplateError($template->error()); diff --git a/contrib/CVS/Entries b/contrib/CVS/Entries index e10f4f776add04371d2db823bca3001e70a9e0c3..937d4d689ffa2babb92b35e38525ce56a27e624b 100644 --- a/contrib/CVS/Entries +++ b/contrib/CVS/Entries @@ -1,14 +1,15 @@ -/BugzillaEmail.pm/1.2/Mon Aug 26 06:17:21 2002//TBUGZILLA-2_17_4 -/README/1.5/Tue Apr 22 04:11:32 2003//TBUGZILLA-2_17_4 -/README.Mailif/1.3/Wed Mar 15 23:39:03 2000//TBUGZILLA-2_17_4 -/bug_email.pl/1.15/Sat Jan 25 04:39:14 2003//TBUGZILLA-2_17_4 -/bugmail_help.html/1.1/Tue Mar 7 17:36:48 2000//TBUGZILLA-2_17_4 -/bugzilla.procmailrc/1.1/Wed Mar 15 23:39:09 2000//TBUGZILLA-2_17_4 -/bugzilla_email_append.pl/1.5/Tue Sep 3 06:39:01 2002//TBUGZILLA-2_17_4 -/bugzilla_ldapsync.rb/1.1/Tue Apr 22 04:11:32 2003//TBUGZILLA-2_17_4 -/cvs-update.sh/1.3/Tue Aug 27 04:27:58 2002//TBUGZILLA-2_17_4 -/gnats2bz.pl/1.6/Thu Jan 31 14:29:21 2002//TBUGZILLA-2_17_4 -/jb2bz.py/1.1/Wed Feb 13 14:59:30 2002//TBUGZILLA-2_17_4 -/mysqld-watcher.pl/1.5/Thu Mar 27 00:06:53 2003//TBUGZILLA-2_17_4 -/yp_nomail.sh/1.1/Tue Sep 12 23:50:31 2000//TBUGZILLA-2_17_4 +/BugzillaEmail.pm/1.2/Mon Aug 26 06:17:21 2002//TBUGZILLA-2_17_5 +/README/1.6/Fri Oct 31 14:00:19 2003//TBUGZILLA-2_17_5 +/README.Mailif/1.3/Wed Mar 15 23:39:03 2000//TBUGZILLA-2_17_5 +/bug_email.pl/1.16/Fri Aug 22 14:59:13 2003//TBUGZILLA-2_17_5 +/bugmail_help.html/1.1/Tue Mar 7 17:36:48 2000//TBUGZILLA-2_17_5 +/bugzilla.procmailrc/1.1/Wed Mar 15 23:39:09 2000//TBUGZILLA-2_17_5 +/bugzilla_email_append.pl/1.5/Tue Sep 3 06:39:01 2002//TBUGZILLA-2_17_5 +/bugzilla_ldapsync.rb/1.2/Sat Apr 26 16:35:04 2003//TBUGZILLA-2_17_5 +/cvs-update.sh/1.3/Tue Aug 27 04:27:58 2002//TBUGZILLA-2_17_5 +/gnats2bz.pl/1.6/Thu Jan 31 14:29:21 2002//TBUGZILLA-2_17_5 +/jb2bz.py/1.1/Wed Feb 13 14:59:30 2002//TBUGZILLA-2_17_5 +/mysqld-watcher.pl/1.5/Thu Mar 27 00:06:53 2003//TBUGZILLA-2_17_5 +/yp_nomail.sh/1.1/Tue Sep 12 23:50:31 2000//TBUGZILLA-2_17_5 +D/bug-bugzilla//// D/cmdline//// diff --git a/contrib/CVS/Tag b/contrib/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/contrib/CVS/Tag +++ b/contrib/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/contrib/README b/contrib/README index 85089e50ca2125e10017f1a6397c8bebe448d41f..e26d00d400da5b2e41d26fa96150101470ed0462 100644 --- a/contrib/README +++ b/contrib/README @@ -5,8 +5,11 @@ be useful to you. This directory includes: + bug-bugzilla/ -- A standalone bug submission script. + mysqld-watcher.pl -- This script can be installed as a frequent cron job to clean up stalled/dead queries. + gnats2bz.pl -- A perl script to help import bugs from a GNATS database into a Bugzilla database. Contributed by Tom Schutter <tom@platte.com> @@ -20,6 +23,7 @@ This directory includes: yp_nomail.sh -- Script you can run via cron that regularly updates the nomail file for terminated employees + bugzilla_ldapsync.rb -- Script you can run via cron that queries an LDAP server for e-mail addresses to add Bugzilla users for. Will optionally disable Bugzilla users with diff --git a/contrib/bug-bugzilla/CVS/Entries b/contrib/bug-bugzilla/CVS/Entries new file mode 100644 index 0000000000000000000000000000000000000000..88f6f5096972f081cc0fe76bf7c1f7c4fa89e116 --- /dev/null +++ b/contrib/bug-bugzilla/CVS/Entries @@ -0,0 +1,5 @@ +/README/1.1/Fri Oct 31 14:00:20 2003//TBUGZILLA-2_17_5 +/bug-bugzilla/1.1/Fri Oct 31 14:00:20 2003//TBUGZILLA-2_17_5 +/bug-bugzilla.xml/1.1/Fri Oct 31 14:00:20 2003//TBUGZILLA-2_17_5 +/bugdata.txt/1.1/Fri Oct 31 14:00:20 2003//TBUGZILLA-2_17_5 +D diff --git a/contrib/bug-bugzilla/CVS/Repository b/contrib/bug-bugzilla/CVS/Repository new file mode 100644 index 0000000000000000000000000000000000000000..3e8132c9402be780bc7563bab967ddcb51c91968 --- /dev/null +++ b/contrib/bug-bugzilla/CVS/Repository @@ -0,0 +1 @@ +mozilla/webtools/bugzilla/contrib/bug-bugzilla diff --git a/contrib/bug-bugzilla/CVS/Root b/contrib/bug-bugzilla/CVS/Root new file mode 100644 index 0000000000000000000000000000000000000000..cdb6f4a0739a0dc53e628026726036377dec3637 --- /dev/null +++ b/contrib/bug-bugzilla/CVS/Root @@ -0,0 +1 @@ +:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot diff --git a/contrib/bug-bugzilla/CVS/Tag b/contrib/bug-bugzilla/CVS/Tag new file mode 100644 index 0000000000000000000000000000000000000000..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd --- /dev/null +++ b/contrib/bug-bugzilla/CVS/Tag @@ -0,0 +1 @@ +NBUGZILLA-2_17_5 diff --git a/contrib/bug-bugzilla/README b/contrib/bug-bugzilla/README new file mode 100644 index 0000000000000000000000000000000000000000..08bc3d85c67d869582d680b1b067d2e7005fe537 --- /dev/null +++ b/contrib/bug-bugzilla/README @@ -0,0 +1,46 @@ +Bug-Bugzilla +============ + +Authors: Christian Reis <kiko@async.com.br> + Eric Raymond <esr@thyrsus.com> + +Bug-Bugzilla is a simple Python program that creates bugs in a Bugzilla +instance. It takes as input text resembling message headers (RFC-822 +formatted) via standard input, or optionally a number of commandline +parameters. It communicates using HTTP, which allows it to work over a +network. + +Requirements +------------ + +Its only requirement is Python 2.3 or higher; you should have the +"python" executable in your path. + +Usage Notes +----------- + +* Please constrain testing to your own installation of Bugzilla, or use +* http://landfill.bugzilla.org/ for testing purposes -- opening test +* bugs on production instances of Bugzilla is definitely not a good idea + +Run "bug-bugzilla --help" for a description of the possible options. + +An example input file, named bugdata.txt, is provided. You can pipe it +in as standard input to bug-bugzilla, providing a Bugzilla URI through +the command-line. + +Note that you must create a ~/.netrc entry to authenticate against the +Bugzilla instance. The entry's machine field is a *quoted* Bugzilla URI, +the login field is your ID on that host, and the password field is the +your password password. An example entry follows: + + machine "http://bugzilla.mozilla.org/" + login foo@bar.loo + password snarf + +Documentation +------------- + +Documentation for bug-bugzilla is provided in Docbook format; see +bug-bugzilla.xml. + diff --git a/contrib/bug-bugzilla/bug-bugzilla b/contrib/bug-bugzilla/bug-bugzilla new file mode 100755 index 0000000000000000000000000000000000000000..e16a968e7616ec371e18f966806adafabd1f5b94 --- /dev/null +++ b/contrib/bug-bugzilla/bug-bugzilla @@ -0,0 +1,279 @@ +#!/usr/bin/env python +# +# bug-bugzilla: a command-line script to post bugs to a Bugzilla instance +# +# Authors: Christian Reis <kiko@async.com.br> +# Eric S. Raymond <esr@thyrsus.com> +# +# This is version 0.5. +# +# For a usage hint run bug-bugzilla --help +# +# TODO: use RDF output to pick up valid options, as in +# http://www.async.com.br/~kiko/mybugzilla/config.cgi?ctype=rdf + +import sys + +def error(m): + sys.stderr.write("bug-bugzilla: %s\n" % m) + sys.stderr.flush() + sys.exit(1) + +if sys.version[:6] < '2.3.0': + error("you must upgrade to Python 2.3 or higher to use this script.") + +import urllib, re, os, netrc, email.Parser, optparse + +# Set up some aliases -- partly to hide the less friendly fieldnames +# behind the names actually used for them in the stock web page presentation, +# and partly to provide a place for mappings if the Bugzilla fieldnames +# ever change. +field_aliases = (('hardware', 'rep_platform'), + ('os', 'op_sys'), + ('summary', 'short_desc'), + ('description', 'comment'), + ('depends-on', 'dependson'), + ('status', 'bug_status'), + ('severity', 'bug_severity'), + ('URL', 'bug_file_loc'),) + +def header_to_field(hdr): + hdr = hdr.lower().replace("-", "_") + for (alias, name) in field_aliases: + if hdr == alias: + hdr = name + break + return hdr + +def field_to_header(hdr): + hdr = "-".join(map(lambda x: x.capitalize(), hdr.split("_"))) + for (alias, name) in field_aliases: + if hdr == name: + hdr = alias + break + return hdr + +def setup_parser(): + # Take override values from the command line + parser = optparse.OptionParser(usage="usage: %prog [options] bugzilla-url") + parser.add_option('-b', '--status', dest='bug_status', + help='Set the Status field.') + parser.add_option('-u', '--url', dest='bug_file_loc', + help='Set the URL field.') + parser.add_option('-p', '--product', dest='product', + help='Set the Product field.') + parser.add_option('-v', '--version', dest='version', + help='Set the Version field.') + parser.add_option('-c', '--component', dest='component', + help='Set the Component field.') + parser.add_option('-s', '--summary', dest='short_desc', + help='Set the Summary field.') + parser.add_option('-H', '--hardware', dest='rep_platform', + help='Set the Hardware field.') + parser.add_option('-o', '--os', dest='op_sys', + help='Set the Operating-system field.') + parser.add_option('-r', '--priority', dest='priority', + help='Set the Priority field.') + parser.add_option('-x', '--severity', dest='bug_severity', + help='Set the Severity field.') + parser.add_option('-d', '--description', dest='comment', + help='Set the Description field.') + parser.add_option('-a', '--assigned-to', dest='assigned_to', + help='Set the Assigned-To field.') + parser.add_option('-C', '--cc', dest='cc', + help='Set the Cc field.') + parser.add_option('-k', '--keywords', dest='keywords', + help='Set the Keywords field.') + parser.add_option('-D', '--depends-on', dest='dependson', + help='Set the Depends-On field.') + parser.add_option('-B', '--blocked', dest='blocked', + help='Set the Blocked field.') + parser.add_option('-n', '--no-stdin', dest='read', + default=True, action='store_false', + help='Suppress reading fields from stdin.') + return parser + +# Fetch user's credential for access to this Bugzilla instance. +def get_credentials(bugzilla): + # Work around a quirk in the Python implementation. + # The URL has to be quoted, otherwise the parser barfs on the colon. + # But the parser doesn't strip the quotes. + authenticate_on = '"' + bugzilla + '"' + try: + credentials = netrc.netrc() + except netrc.NetrcParseError, e: + error("ill-formed .netrc: %s:%s %s" % (e.filename, e.lineno, e.msg)) + except IOError, e: + error("missing .netrc file %s" % str(e).split()[-1]) + ret = credentials.authenticators(authenticate_on) + if not ret: + # Apparently, an invalid machine URL will cause credentials == None + error("no credentials for Bugzilla instance at %s" % bugzilla) + return ret + +def process_options(options): + data = {} + # Initialize bug report fields from message on standard input + if options.read: + message_parser = email.Parser.Parser() + message = message_parser.parse(sys.stdin) + for (key, value) in message.items(): + data.update({header_to_field(key) : value}) + if not 'comment' in data: + data['comment'] = message.get_payload() + + # Merge in options from the command line; they override what's on stdin. + for (key, value) in options.__dict__.items(): + if key != 'read' and value != None: + data[key] = value + return data + +def ensure_defaults(data): + # Provide some defaults if the user did not supply them. + if 'op_sys' not in data: + if sys.platform.startswith('linux'): + data['op_sys'] = 'Linux' + if 'rep_platform' not in data: + data['rep_platform'] = 'PC' + if 'bug_status' not in data: + data['bug_status'] = 'NEW' + if 'bug_severity' not in data: + data['bug_severity'] = 'normal' + if 'bug_file_loc' not in data: + data['bug_file_loc'] = 'http://' # Yes, Bugzilla needs this + if 'priority' not in data: + data['priority'] = 'P2' + +def validate_fields(data): + # Fields for validation + required_fields = ( + "bug_status", "bug_file_loc", "product", "version", "component", + "short_desc", "rep_platform", "op_sys", "priority", "bug_severity", + "comment", + ) + legal_fields = required_fields + ( + "assigned_to", "cc", "keywords", "dependson", "blocked", + ) + my_fields = data.keys() + for field in my_fields: + if field not in legal_fields: + error("invalid field: %s" % field_to_header(field)) + for field in required_fields: + if field not in my_fields: + error("required field missing: %s" % field_to_header(field)) + + if not data['short_desc']: + error("summary for bug submission must not be empty") + + if not data['comment']: + error("comment for bug submission must not be empty") + +# +# POST-specific functions +# + +def submit_bug_POST(bugzilla, data): + # Move the request over the wire + postdata = urllib.urlencode(data) + url = urllib.urlopen("%s/post_bug.cgi" % bugzilla, postdata) + ret = url.read() + check_result_POST(ret, data) + +def check_result_POST(ret, data): + # XXX We can move pre-validation out of here as soon as we pick up + # the valid options from config.cgi -- it will become a simple + # assertion and ID-grabbing step. + # + # XXX: We use get() here which may return None, but since the user + # might not have provided these options, we don't want to die on + # them. + version = data.get('version') + product = data.get('product') + component = data.get('component') + priority = data.get('priority') + severity = data.get('bug_severity') + status = data.get('bug_status') + assignee = data.get('assigned_to') + platform = data.get('rep_platform') + opsys = data.get('op_sys') + keywords = data.get('keywords') + deps = data.get('dependson', '') + " " + data.get('blocked', '') + deps = deps.replace(" ", ", ") + # XXX: we should really not be using plain find() here, as it can + # match the bug content inadvertedly + if ret.find("A legal Version was not") != -1: + error("version %r does not exist for component %s:%s" % + (version, product, component)) + if ret.find("A legal Priority was not") != -1: + error("priority %r does not exist in " + "this Bugzilla instance" % priority) + if ret.find("A legal Severity was not") != -1: + error("severity %r does not exist in " + "this Bugzilla instance" % severity) + if ret.find("A legal Status was not") != -1: + error("status %r is not a valid creation status in " + "this Bugzilla instance" % status) + if ret.find("A legal Platform was not") != -1: + error("platform %r is not a valid platform in " + "this Bugzilla instance" % platform) + if ret.find("A legal OS/Version was not") != -1: + error("%r is not a valid OS in " + "this Bugzilla instance" % opsys) + if ret.find("Invalid Username") != -1: + error("invalid credentials submitted") + if ret.find("Component Needed") != -1: + error("the component %r does not exist in " + "this Bugzilla instance" % component) + if ret.find("Unknown Keyword") != -1: + error("keyword(s) %r not registered in " + "this Bugzilla instance" % keywords) + if ret.find("The product name") != -1: + error("Product %r does not exist in this " + "Bugzilla instance" % product) + # XXX: this should be smarter + if ret.find("does not exist") != -1: + error("Could not mark dependencies for bugs %s: one or " + "more bugs didn't exist in this Bugzilla instance" % deps) + if ret.find("Match Failed") != -1: + # XXX: invalid CC hits on this error too + error("the bug assignee %r isn't registered in " + "this Bugzilla instance" % assignee) + # If all is well, return bug number posted + m = re.search("Bug ([0-9]+) Submitted", ret) + if not m: + print ret + error("Internal error: bug id not found; please report a bug") + id = m.group(1) + print "Bug %s posted." % id + +# +# +# + +if __name__ == "__main__": + parser = setup_parser() + + # Parser will print help and exit here if we specified --help + (options, args) = parser.parse_args() + + if len(args) != 1: + parser.error("missing Bugzilla host URL") + + bugzilla = args[0] + data = process_options(options) + + login, account, password = get_credentials(bugzilla) + if "@" not in login: # no use even trying to submit + error("login %r is invalid (it should be an email address)" % login) + + ensure_defaults(data) + validate_fields(data) + + # Attach authentication information + data.update({'Bugzilla_login' : login, + 'Bugzilla_password' : password, + 'GoAheadAndLogIn' : 1, + 'form_name' : 'enter_bug'}) + + submit_bug_POST(bugzilla, data) + diff --git a/contrib/bug-bugzilla/bug-bugzilla.xml b/contrib/bug-bugzilla/bug-bugzilla.xml new file mode 100644 index 0000000000000000000000000000000000000000..da8a34c772396d0cd2c3cb8611b77ac69a4ea799 --- /dev/null +++ b/contrib/bug-bugzilla/bug-bugzilla.xml @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!DOCTYPE refentry PUBLIC + "-//OASIS//DTD DocBook XML V4.1.2//EN" + "docbook/docbookx.dtd"> +<refentry id='bug-bugzilla.1'> +<refmeta> +<refentrytitle>bug-bugzilla</refentrytitle> +<manvolnum>1</manvolnum> +<refmiscinfo class='date'>Oct 30, 2003</refmiscinfo> +</refmeta> +<refnamediv id='name'> +<refname>bug-bugzilla</refname> +<refpurpose>post bugs to a Bugzilla instance</refpurpose> +</refnamediv> +<refsynopsisdiv id='synopsis'> + +<cmdsynopsis> + <command>bug-bugzilla</command> + <arg choice='opt'>--status <replaceable>bug_status</replaceable></arg> + <arg choice='opt'>--url <replaceable>bug_file_loc</replaceable></arg> + <arg choice='opt'>--product <replaceable>product</replaceable></arg> + <arg choice='opt'>--version <replaceable>version</replaceable></arg> + <arg choice='opt'>--component <replaceable>component</replaceable></arg> + <arg choice='opt'>--summary <replaceable>short_desc</replaceable></arg> + <arg choice='opt'>--hardware <replaceable>rep_platform</replaceable></arg> + <arg choice='opt'>--os <replaceable>op_sys</replaceable></arg> + <arg choice='opt'>--priority <replaceable>priority</replaceable></arg> + <arg choice='opt'>--severity <replaceable>bug_severity</replaceable></arg> + <arg choice='opt'>--assigned-to <replaceable>assigned-to</replaceable></arg> + <arg choice='opt'>--cc <replaceable>cc</replaceable></arg> + <arg choice='opt'>--keywords <replaceable>keywords</replaceable></arg> + <arg choice='opt'>--depends-on <replaceable>dependson</replaceable></arg> + <arg choice='opt'>--blocked <replaceable>blocked</replaceable></arg> + <arg choice='opt'>--description <replaceable>comment</replaceable></arg> + <arg choice='opt'>--no-read </arg> + <arg choice='plain'><replaceable>bugzilla-url</replaceable></arg> +</cmdsynopsis> + +</refsynopsisdiv> + +<refsect1 id='description'><title>DESCRIPTION</title> + +<para><application>bug-bugzilla</application> is a command-line tool +for posting bug reports to any instance of Bugzilla. It accepts on +standard input text resembling an RFC-822 message. The headers of +that message, and its body, are used to set error-report field values. +More field values are merged in from command-line options. If required +fields have not been set, <application>bug-bugzilla</application> +tries to compute them. Finally, the resulting error report is +validated. If all required fields are present, and there are no +illegal fields or values, the report is shipped off to the Mozilla +instance specified by the single positional argument. Login/password +credentials are read from the calling user's <filename>~/.netrc</filename> +file.</para> + +<para>The program accepts the following options to set or override fields:</para> +<variablelist> +<varlistentry> +<term>-b. --bug-status</term> +<listitem> +<para>Set the bug_status field, overriding the Status header from +standard input if present. (The stock Bugzilla web presentation +identifies this field as <quote>Status</quote>.)</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-u, --url</term> +<listitem> +<para>Set the bug_file_loc field, overriding the URL header from +standard input if present. (The stock Bugzilla web presentation +identifies this field as <quote>URL</quote>.)</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-p, --product</term> +<listitem> +<para>Set the product field, overriding the Product header from +standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-v, --version</term> +<listitem><para>Set the version field, overriding the Version header +from standard input if necessary.</para></listitem> +</varlistentry> +<varlistentry> +<term>-c, --component</term> +<listitem><para>Set the component field, overriding the Component header +from standard input if necessary.</para></listitem> +</varlistentry> +<varlistentry> +<term>-s, --summary</term> +<listitem><para>Set the short_desc field, overriding the Summary header +from standard input if necessary. (The stock Bugzilla web presentation +identifies this field as <quote>Summary</quote>.)</para></listitem> +</varlistentry> +<varlistentry> +<term>-H, --hardware</term> +<listitem><para>Set the rep_platform field, overriding the Hardware header +from standard input if necessary. (The stock Bugzilla web presentation +identifies this field as <quote>Hardware</quote>.)</para></listitem> +</varlistentry> +<varlistentry> +<term>-o, --os</term> +<listitem><para>Set the op_sys field, overriding the Operating-System header +from standard input if necessary. (The stock Bugzilla web presentation +identifies this field as <quote>OS</quote>.)</para></listitem> +</varlistentry> +<varlistentry> +<term>-r, --priority</term> +<listitem><para>Set the priority field, overriding the Priority header +from standard input if necessary.</para></listitem> +</varlistentry> +<varlistentry> +<term>-x, --severity</term> +<listitem><para>Set the severity field, overriding the Severity header +from standard input if necessary.</para></listitem> +</varlistentry> +<varlistentry> +<term>-d, --description</term> +<listitem><para>Set the comment field, overriding the Description header +from standard input if necessary. (The stock Bugzilla web presentation +identifies this field as <quote>Description</quote>.) If there is a +message body and no Description field and this option is not +specified, the message body is used as a description. +</para></listitem> +</varlistentry> +<varlistentry> +<term>-a, --assigned-to</term> +<listitem> +<para>Set the optional assigned_to field, overriding the Assigned-To +header from standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-C, --cc</term> +<listitem> +<para>Set the optional cc field, overriding the Cc +header from standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-k, --keywords</term> +<listitem> +<para>Set the optional keywords field, overriding the Keywords +header from standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-D, --depends-on</term> +<listitem> +<para>Set the optional dependson field, overriding the Depends-On +header from standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-B, --assigned-to</term> +<listitem> +<para>Set the optional blocked field, overriding the Blocked +header from standard input if necessary.</para> +</listitem> +</varlistentry> +<varlistentry> +<term>-n, --no-stdin</term> +<listitem><para>Suppress reading fields from standard input.</para></listitem> +</varlistentry> +<varlistentry> +<term>-h, --help</term> +<listitem><para>Print usage help and exit.</para></listitem> +</varlistentry> +</variablelist> + +<para>This program will try to deduce OS and Hardware if those are not +specified. If it fails, validation will fail before shipping the +report.</para> + +<para>There is expected to be a single positional argument following +any options. It should be the URL of the Bugzilla instance to which +the bug is to be submitted.</para> + +</refsect1> +<refsect1 id='files'><title>FILES</title> +<variablelist> +<varlistentry> +<term><filename>~/.netrc</filename></term> +<listitem><para>Must contain an entry in which the machine field is +the Bugzilla instance URL, the login field is your ID on that host, and the +password field is the right password. The URL in the machine field +must be enclosed in double quotes.</para></listitem> +</varlistentry> +</variablelist> + +</refsect1> +<refsect1 id='author'><title>AUTHORS</title> +<para>Christian Reis <kiko@async.com.br>, Eric S. Raymond +<esr@thyrsus.com>.</para> +</refsect1> +</refentry> + diff --git a/contrib/bug-bugzilla/bugdata.txt b/contrib/bug-bugzilla/bugdata.txt new file mode 100644 index 0000000000000000000000000000000000000000..56f70b9f1b1aaffe4ad84c79582b05251e73ac36 --- /dev/null +++ b/contrib/bug-bugzilla/bugdata.txt @@ -0,0 +1,11 @@ +Product: FoodReplicator +Component: Salt +Version: 1.0 +Priority: P2 +Hardware: PC +OS: Linux +Severity: critical +Summary: Impending electron shortage + +We need an emergency supply of electrons. + diff --git a/contrib/bug_email.pl b/contrib/bug_email.pl index b30b1c046259ab055fe9c623af6e0cec2ad25187..a1e537cfed623416250b71163b4c6608a30075c1 100755 --- a/contrib/bug_email.pl +++ b/contrib/bug_email.pl @@ -37,7 +37,7 @@ # # You need to work with bug_email.pl the MIME::Parser installed. # -# $Id: bug_email.pl,v 1.15 2003/01/25 04:39:14 jake%bugzilla.org Exp $ +# $Id: bug_email.pl,v 1.16 2003/08/22 14:59:13 justdave%syndicomm.com Exp $ ############################################################### # 02/12/2000 (SML) @@ -76,6 +76,11 @@ push @INC, "."; require "globals.pl"; require "BugzillaEmail.pm"; +use lib "."; +use lib "../"; +use Bugzilla::Constants; +use Bugzilla::BugMail; + my @mailerrors = (); # Buffer for Errors in the mail my @mailwarnings = (); # Buffer for Warnings found in the mail my $critical_err = 0; # Counter for critical errors - must be zero for success @@ -555,52 +560,6 @@ END return( $ret ); } -############################################################### -# groupBitToString( $ ) -# converts a given number back to the groupsetting-names -# This function accepts single numbers as added bits or -# Strings with +-Signs -sub groupBitToString( $ ) -{ - my ($bits) = @_; - my $type; - my @bitlist = (); - my $ret = ""; - - if( $bits =~ /^\d+$/ ) { # only numbers - $type = 1; - - } elsif( $bits =~ /^(\s*\d+\s*\+\s*)+/ ) { - $type = 2; - } else { - # Error: unknown format ! - $type = 0; - } - - $bits =~ s/\s*//g; - # - # Query for groupset-Information - SendSQL( "Select Bit,Name, Description from groups where isbuggroup=1" ); - my @line; - while( MoreSQLData() ){ - @line = FetchSQLData(); - - if( $type == 1 ) { - if( ((0+$bits) & (0+$line[0])) == 0+$line[0] ) { - $ret .= sprintf( "%s ", $line[1] ); - } - } elsif( $type == 2 ) { - if( $bits =~ /$line[0]/ ) { - $ret .= sprintf( "%s ", $line[1] ); - } - } - } - - return( $ret ); -} - - - #------------------------------ # # dump_entity ENTITY, NAME @@ -763,12 +722,10 @@ $SenderShort =~ s/^.*?([a-zA-Z0-9_.-]+?\@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+).*$/$1 $SenderShort = findUser($SenderShort); -print "SenderShort is $SenderShort\n"; if (!defined($SenderShort)) { $SenderShort = $Sender; $SenderShort =~ s/^.*?([a-zA-Z0-9_.-]+?\@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+).*$/$1/; } -print "The sendershort is now $SenderShort\n"; my $Subject = ""; $Subject = $entity->get( 'Subject' ); @@ -1011,97 +968,29 @@ $Control{'version'} = $Version; # GroupsSet: Protections for Bug info. This paramter controls the visiblility of the # given bug. An Error in the given Buggroup is not a blocker, a default is taken. # -# The GroupSet is accepted in three ways: As single number like 65536 -# As added numbers like 65536 + 6 +8 -# As literals linked with whitespaces, plus-signs or kommas +# The GroupSet is accepted only as literals linked with whitespaces, plus-signs or kommas # my $GroupSet = ""; +my %GroupArr = (); $GroupSet = $Control{'groupset'} if( defined( $Control{ 'groupset' })); # # Fetch the default value for groupsetting -SendSQL("select bit from groups where name=" . SqlQuote( "ReadInternal" )); +my $DefaultGroup = 'ReadInternal'; +SendSQL("select id from groups where name=" . SqlQuote( $DefaultGroup )); my $default_group = FetchOneColumn(); if( $GroupSet eq "" ) { - # To bad: Groupset does not contain anything -> set to default - $GroupSet = $default_group; + # Too bad: Groupset does not contain anything -> set to default + $GroupArr{$DefaultGroup} = $default_group if(defined( $default_group )); # # Give the user a hint my $Text = "You did not send a value for optional key \@groupset, which controls\n"; - $Text .= "the Permissions of the bug. It was set to a default value 'Internal Bug'\n"; - $Text .= "Probably the QA will change that if desired.\n"; + $Text .= "the Permissions of the bug. It will be set to a default value 'Internal Bug'\n"; + $Text .= "if the group '$DefaultGroup' exists. The QA may change that.\n"; BugMailError( 0, $Text ); -} elsif( $GroupSet =~ /^\d+$/ ) { - # Numerical Groups (no +-signs), the GroupSet must be the sum of the bits - # - my $grp_num = $GroupSet; - # print "Numeric: $GroupSet\n"; - SendSQL("select bit from groups where isbuggroup=1 order by bit"); - my @Groups = FetchAllSQLData(); - - # DANGEROUS: This code implies, that perl *CAN* cope with large numbers - # Its probably better to allow only one default-group when mailing ! - my $Val = "0"; - foreach ( @Groups ) { - # print 0+$grp_num & 0+$_ , "\n"; - if ( ( (0+$grp_num) & (0+$_) ) == 0+$_ ) { - $Val .= sprintf( "+%d", $_ ); - } - } - if( $Val eq "0" ) { - # No valid group found - my $Text = "The number you sent for the groupset of the bug was wrong.\n" . - "It was not the sum of valid bits, which are:\n\t"; - $Text .= join( "\n\t", @Groups ) . "\n"; - $Text .= "The groupset for your bug is set to default $default_group, which\n" . - "means 'ReadInternal'"; - - BugMailError( 0, $Text ); - $GroupSet = $default_group; - } else { - $GroupSet = $Val; - } - -} elsif( $GroupSet =~ /^(\s*\d+\s*\+\s*)+/ ) { - # - # Groupset given as String with added numbers like 65536+131072 - # The strings are splitted and checked if the numbers are in the DB - my @bits = split( /\s*\+\s*/, $GroupSet ); - my $new_groupset = "0"; - # Get all bits for groupsetting - SendSQL("select bit from groups where isbuggroup=1" ); - my @db_bits = FetchAllSQLData(); - - # ... and check, if the given bits and the one in the DB fit together - foreach my $bit ( @bits ) { - # print "The Bit is: $bit \n"; - if( lsearch( \@db_bits, $bit ) == -1 ) { - # Bit not found ! - my $Text = "Checking the Group-Settings: You sent the Groupset-Bit $bit\n" . - "which is not a valid Groupset-Bit. It will be skipped !\n\n"; - BugMailError( 0, $Text ); - } else { - # Cool bit, add to the result-String - $new_groupset .= "+" . $bit; - } - } - - # Is the new-String larger than 0 - if( $new_groupset eq "0" ) { - $new_groupset = $default_group; - - my $Text = "All given Groupsetting-Bits are invalid. Setting Groupsetting to\n" . - "default-Value $new_groupset, what means 'ReadInternal'\n\n"; - - BugMailError( 0, $Text ); - } - # Restore to Groupset-Variable - $GroupSet = $new_groupset; - } else { # literal e.g. 'ReadInternal' - my $Value = "0"; my $gserr = 0; my $Text = ""; @@ -1109,37 +998,29 @@ if( $GroupSet eq "" ) { # Split literal Groupsettings either on Whitespaces, +-Signs or , # Then search for every Literal in the DB - col name foreach ( split /\s+|\s*\+\s*|\s*,\s*/, $GroupSet ) { - SendSQL("select bit, Name from groups where name=" . SqlQuote($_)); + SendSQL("select id, Name from groups where name=" . SqlQuote($_)); my( $bval, $bname ) = FetchSQLData(); if( defined( $bname ) && $_ eq $bname ) { - $Value .= sprintf( "+%d", $bval ); + $GroupArr{$bname} = $bval; } else { $Text .= "You sent the wrong GroupSet-String $_\n"; $gserr = 1; } } + # # Give help if wrong GroupSet-String came if( $gserr > 0 ) { # There happend errors $Text .= "Here are all valid literal Groupsetting-strings:\n\t"; - SendSQL( "select name from groups where isbuggroup=1" ); + SendSQL( "select g.name from groups g, user_group_map u where u.user_id=".$Control{'reporter'}. + " and g.isbuggroup=1 and g.id = u.group_id group by g.name;" ); $Text .= join( "\n\t", FetchAllSQLData()) . "\n"; BugMailError( 0, $Text ); } - - # - # Check if anything was right, if not -> set default - if( $Value eq "0" ) { - $Value = $default_group; - $Text .= "\nThe group will be set to $default_group, what means 'ReadInternal'\n\n"; - } - - $GroupSet = $Value; } # End of checking groupsets - -$Control{'groupset'} = $GroupSet; +delete $Control{'groupset'}; # ################################################################################### # Checking is finished @@ -1198,7 +1079,6 @@ END $val = $Control{ $field }; $val = DBID_to_name( $val ) if( $field =~ /reporter|assigned_to|qa_contact/ ); - $val = groupBitToString( $val ) if( $field =~ /groupset/ ); $tmp_reply .= sprintf( " \@%-15s = %-15s\n", $field, $val ); @@ -1206,6 +1086,10 @@ END $reporter = $val; } } + # + # Display GroupArr + # + $tmp_reply .= sprintf( " \@%-15s = %-15s\n", 'groupset', join(',', keys %GroupArr) ); $tmp_reply .= " ... and your error-description !\n"; @@ -1227,7 +1111,6 @@ END $state = SqlQuote("NEW"); } - $query .= $state . ", \'$bug_when\', $ever_confirmed)\n"; # $query .= SqlQuote( "NEW" ) . ", now(), " . SqlQuote($comment) . " )\n"; @@ -1246,13 +1129,24 @@ END SendSQL($long_desc_query); # Cool, the mail was successful - system("./processmail", $id, $SenderShort); + # system("./processmail", $id, $SenderShort); } else { - $id = 0xFFFF; # TEST ! + $id = 0xFFFFFFFF; # TEST ! print "\n-------------------------------------------------------------------------\n"; print "$query\n"; } + # + # Handle GroupArr + # + foreach my $grp (keys %GroupArr) { + if( ! $test) { + SendSQL("INSERT INTO bug_group_map SET bug_id=$id, group_id=$GroupArr{$grp}"); + } else { + print "INSERT INTO bug_group_map SET bug_id=$id, group_id=$GroupArr{$grp}\n"; + } + } + # # handle Attachments # @@ -1266,6 +1160,8 @@ END # # Send the 'you did it'-reply Reply( $SenderShort, $Message_ID,"Bugzilla success (ID $id)", $reply ); + + Bugzilla::BugMail::Send($id) if( ! $test); } else { # There were critical errors in the mail - the bug couldnt be inserted. ! diff --git a/contrib/bugzilla_ldapsync.rb b/contrib/bugzilla_ldapsync.rb index 3a0d926ab8d610c17c5c20609882f6a0cab3b5d6..4fca2a7da9f1fc43c2113e507dc1b16cf3ca0f20 100755 --- a/contrib/bugzilla_ldapsync.rb +++ b/contrib/bugzilla_ldapsync.rb @@ -4,7 +4,7 @@ # and makes nice bugzilla user entries out of them. Also disables Bugzilla users # that are not found in LDAP. -# $Id: bugzilla_ldapsync.rb,v 1.1 2003/04/22 04:11:32 justdave%syndicomm.com Exp $ +# $Id: bugzilla_ldapsync.rb,v 1.2 2003/04/26 16:35:04 jake%bugzilla.org Exp $ require 'ldap' require 'dbi' @@ -50,7 +50,7 @@ noRemove = optHash['--noremove'] || nil defaultPass = optHash['--defaultpass'] || 'bugzilla' if (! dbPassword) - puts "bugzilla_ldapsync (c) 2003 Thomas Stromberg <thomas+bugzilla@stromberg.org>" + puts "bugzilla_ldapsync v1.3 (c) 2003 Thomas Stromberg <thomas+bugzilla@stromberg.org>" puts "" puts " -d | --dbname name of MySQL database [#{dbName}]" puts " -u | --dbuser username for MySQL database [#{dbUser}]" @@ -78,8 +78,8 @@ if (checkMode) end -bugzillaUsers = Array.new -ldapUsers = Array.new +bugzillaUsers = Hash.new +ldapUsers = Hash.new encPassword = defaultPass.crypt('xx') sqlNewUser = "INSERT INTO profiles VALUES ('', ?, '#{encPassword}', ?, '', 1, NULL, '0000-00-00 00:00:00');" @@ -87,8 +87,12 @@ sqlNewUser = "INSERT INTO profiles VALUES ('', ?, '#{encPassword}', ?, '', 1, NU dbh = DBI.connect("DBI:Mysql:#{dbName}", dbUser, dbPassword) # select all e-mail addresses where there is no disabledtext defined. Only valid users, please! -dbh.select_all('select login_name from profiles WHERE disabledtext = ""') { |row| - bugzillaUsers.push(row[0].downcase) +dbh.select_all('select login_name, realname, disabledtext from profiles') { |row| + login = row[0].downcase + bugzillaUsers[login] = Hash.new + bugzillaUsers[login]['desc'] = row[1] + bugzillaUsers[login]['disabled'] = row[2] + #puts "bugzilla has #{login} - \"#{bugzillaUsers[login]['desc']}\" (#{bugzillaUsers[login]['disabled']})" } @@ -116,33 +120,64 @@ LDAP::Conn.new(ldapHost, 389).bind{|conn| else desc = entry.vals("cn")[0] end - - # slash out apostrophes. This is not how we are supposed to do it. - desc.sub!('\'', "\\'") + + # take care of the whitespace. + desc.sub!("\s+$", "") + desc.sub!("^\s+", "") + + # dumb hack. should be properly escaped, and apostrophes should never ever ever be in email. email.sub!("\'", "%") email.sub!('%', "\'") - ldapUsers.push(email.downcase) - - # while we are in this loop, lets go ahead and add the new users to Bugzilla - if (! bugzillaUsers.include?(email.downcase)) - if (! checkMode) - dbh.do(sqlNewUser, email, desc) - end - puts "added #{email} - #{desc}" - end - end + email=email.downcase + ldapUsers[email.downcase] = Hash.new + ldapUsers[email.downcase]['desc'] = desc + ldapUsers[email.downcase]['disabled'] = nil + #puts "ldap has #{email} - #{ldapUsers[email.downcase]['desc']}" + end } } # This is the loop that takes the users that we found in Bugzilla originally, and # checks to see if they are still in the LDAP server. If they are not, away they go! + +ldapUsers.each_key { |user| + # user does not exist at all. + #puts "checking ldap user #{user}" + if (! bugzillaUsers[user]) + puts "+ Adding #{user} - #{ldapUsers[user]['desc']}" + + if (! checkMode) + dbh.do(sqlNewUser, user, ldapUsers[user]['desc']) + end + + # short-circuit now. + next + end + + if (bugzillaUsers[user]['desc'] != ldapUsers[user]['desc']) + puts "* Changing #{user} from \"#{bugzillaUsers[user]['desc']}\" to \"#{ldapUsers[user]['desc']}\"" + if (! checkMode) + # not efficient. + dbh.do("UPDATE profiles SET realname = ? WHERE login_name = ?", ldapUsers[user]['desc'], user) + end + end + + if (bugzillaUsers[user]['disabled'].length > 0) + puts "+ Enabling #{user} (was \"#{bugzillaUsers[user]['disabled']}\")" + if (! checkMode) + dbh.do("UPDATE profiles SET disabledtext = NULL WHERE login_name=\"#{user}\"") + end + end +} + if (! noRemove) - bugzillaUsers.each { |user| - if (! ldapUsers.include?(user)) + bugzillaUsers.each_key { |user| + if ((bugzillaUsers[user]['disabled'].length < 1) && (! ldapUsers[user])) + puts "- Disabling #{user} (#{bugzillaUsers[user]['disabled']})" + if (! checkMode) - dbh.do("UPDATE profiles SET disabledtext = \'auto-disabled by sync\' WHERE login_name=\"#{user}\"") + dbh.do("UPDATE profiles SET disabledtext = \'auto-disabled by ldap sync\' WHERE login_name=\"#{user}\"") end - puts "disabled #{user}" end } end diff --git a/contrib/cmdline/CVS/Entries b/contrib/cmdline/CVS/Entries index 2a693c1cd16f3dd9bac21be1bfcd5b937a6917cd..642f2fb39523cf9c2cff3bd46bc0de70a84064a0 100644 --- a/contrib/cmdline/CVS/Entries +++ b/contrib/cmdline/CVS/Entries @@ -1,4 +1,4 @@ -/buglist/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_4 -/bugs/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_4 -/query.conf/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_4 +/buglist/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_5 +/bugs/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_5 +/query.conf/1.1/Thu Nov 15 17:04:58 2001//TBUGZILLA-2_17_5 D diff --git a/contrib/cmdline/CVS/Tag b/contrib/cmdline/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/contrib/cmdline/CVS/Tag +++ b/contrib/cmdline/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/createaccount.cgi b/createaccount.cgi index dec8e716c72f4dcbeca3a55b63a900f0bb29157c..cce598ac952e7e22aa74cd69d9d881690df24c0a 100755 --- a/createaccount.cgi +++ b/createaccount.cgi @@ -47,13 +47,16 @@ unless (Bugzilla::Auth->can_edit) { ThrowUserError("auth_cant_create_account"); } +my $cgi = Bugzilla->cgi; + # Clear out the login cookies. Make people log in again if they create an # account; otherwise, they'll probably get confused. -my $cookiepath = Param("cookiepath"); -print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT -Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT\n"; +$cgi->send_cookie(-name => 'Bugzilla_login', + -expires => 'Tue, 15-Sep-1998 21:49:00 GMT'); +$cgi->send_cookie(-name => 'Bugzilla_logincookie', + -expires => 'Tue, 15-Sep-1998 21:49:00 GMT'); -print "Content-Type: text/html\n\n"; +print $cgi->header(); my $login = $::FORM{'login'}; diff --git a/css/CVS/Entries b/css/CVS/Entries index 662409aadff7b8830b5f5c437230817b2c37d716..07f22ec6f16c635ad4d0cf042b525486c989a219 100644 --- a/css/CVS/Entries +++ b/css/CVS/Entries @@ -1,6 +1,6 @@ -/buglist.css/1.2/Fri Jan 10 08:59:05 2003//TBUGZILLA-2_17_4 -/duplicates.css/1.2/Fri Nov 15 22:04:04 2002//TBUGZILLA-2_17_4 -/edit_bug.css/1.2/Tue Nov 19 01:14:59 2002//TBUGZILLA-2_17_4 -/panel.css/1.1/Wed Dec 12 22:41:11 2001//TBUGZILLA-2_17_4 -/show_multiple.css/1.1/Sat Aug 24 14:43:49 2002//TBUGZILLA-2_17_4 +/buglist.css/1.2/Fri Jan 10 08:59:05 2003//TBUGZILLA-2_17_5 +/duplicates.css/1.2/Fri Nov 15 22:04:04 2002//TBUGZILLA-2_17_5 +/edit_bug.css/1.4/Sun Jul 27 01:16:43 2003//TBUGZILLA-2_17_5 +/panel.css/1.1/Wed Dec 12 22:41:11 2001//TBUGZILLA-2_17_5 +/show_multiple.css/1.1/Sat Aug 24 14:43:49 2002//TBUGZILLA-2_17_5 D diff --git a/css/CVS/Tag b/css/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/css/CVS/Tag +++ b/css/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/css/edit_bug.css b/css/edit_bug.css index a836f7e4c39c82e071b7d59e4d3f22372edbaf03..d5576f39130d0f3718cd84b37c152aabcd810ecf 100644 --- a/css/edit_bug.css +++ b/css/edit_bug.css @@ -1,4 +1,7 @@ .bz_private { color: darkred ; background : #f3eeee ; } +.bz_disabled { color: #a0a0a0 ; } + +.bz_obsolete { text-decoration: line-through underline; } table#flags th, table#flags td { vertical-align: baseline; text-align: left; } diff --git a/defparams.pl b/defparams.pl index 15232ad4696685030c1fc4bc7e7858f7247359f9..0727364e66892fd359fcb1ce34ab1c357852a25c 100644 --- a/defparams.pl +++ b/defparams.pl @@ -47,6 +47,7 @@ use strict; use vars qw(@param_list); +use File::Spec; # for find_languages # Checking functions for the various values # Some generic checking functions are included in Bugzilla::Config @@ -148,6 +149,35 @@ sub check_loginmethod { return ""; } +sub check_languages { + my @languages = split /,/, trim($_); + if(!scalar(@languages)) { + return "You need to specify a language tag." + } + foreach my $language (@languages) { + if( ! -d 'template/'.trim($language).'/custom' + && ! -d 'template/'.trim($language).'/default') { + return "The template directory for $language does not exist"; + } + } + return ""; +} + +sub find_languages { + my @languages = (); + opendir(DIR, "template") || return "Can't open 'template' directory: $!"; + my @langdirs = grep { /^[a-z-]+$/i } readdir(DIR); + closedir DIR; + + foreach my $lang (@langdirs) { + next if($lang =~ /^CVS$/i); + my $deft_path = File::Spec->catdir('template', $lang, 'default'); + my $cust_path = File::Spec->catdir('template', $lang, 'custom'); + push(@languages, $lang) if(-d $deft_path or -d $cust_path); + } + return join(', ', @languages); +} + # OK, here are the parameter definitions themselves. # # Each definition is a hash with keys: @@ -233,9 +263,11 @@ sub check_loginmethod { 'to be displayed. Note that you must install the appropriate ' . 'language pack before adding a language to this Param. The ' . 'language used is the one in this list with the highest ' . - 'q-value in the user\'s Accept-Language header.' , + 'q-value in the user\'s Accept-Language header.<br>' . + 'Available languages: ' . find_languages() , type => 't' , - default => 'en' + default => 'en' , + checker => \&check_languages }, { @@ -243,7 +275,8 @@ sub check_loginmethod { desc => 'The UI language Bugzilla falls back on if no suitable ' . 'language is found in the user\'s Accept-Language header.' , type => 't' , - default => 'en' + default => 'en' , + checker => \&check_languages }, { @@ -388,6 +421,14 @@ sub check_loginmethod { default => 'mail' }, + { + name => 'LDAPfilter', + desc => 'LDAP filter to AND with the <tt>LDAPuidattribute</tt> for ' . + 'filtering the list of valid users.', + type => 't', + default => '', + }, + { name => 'loginmethod', desc => 'The type of login authentication to use: @@ -598,24 +639,6 @@ You will get this message once a day until you\'ve dealt with these bugs! default => 0 }, - { - name => 'nummilestones', - desc => 'If using Target Milestone, how many milestones do you wish to - appear?', - type => 't', - default => 10, - checker => \&check_numeric - }, - - { - name => 'curmilestone', - desc => 'If using Target Milestone, Which milestone are we working ' . - 'toward right now?', - type => 't', - default => 1, - checker => \&check_numeric - }, - { name => 'musthavemilestoneonaccept', desc => 'If you are using Target Milestone, do you want to require that ' . @@ -1049,6 +1072,73 @@ Reason: %reason% default => 1, }, +# Added for Patch Viewer stuff (attachment.cgi?action=diff) + { + name => 'cvsroot', + desc => 'The <a href="http://www.cvshome.org">CVS</a> root that most ' . + 'users of your system will be using for "cvs diff". Used in ' . + 'Patch Viewer ("Diff" option on patches) to figure out where ' . + 'patches are rooted even if users did the "cvs diff" from ' . + 'different places in the directory structure. (NOTE: if your ' . + 'CVS repository is remote and requires a password, you must ' . + 'either ensure the Bugzilla user has done a "cvs login" or ' . + 'specify the password ' . + '<a href="http://www.cvshome.org/docs/manual/cvs_2.html#SEC26">as ' . + 'part of the CVS root.</a>) Leave this blank if you have no ' . + 'CVS repository.', + type => 't', + default => '', + }, + + { + name => 'cvsroot_get', + desc => 'The CVS root Bugzilla will be using to get patches from. ' . + 'Some installations may want to mirror their CVS repository on ' . + 'the Bugzilla server or even have it on that same server, and ' . + 'thus the repository can be the local file system (and much ' . + 'faster). Make this the same as cvsroot if you don\'t ' . + 'understand what this is (if cvsroot is blank, make this blank ' . + 'too).', + type => 't', + default => '', + }, + + { + name => 'bonsai_url', + desc => 'The URL to a ' . + '<a href="http://www.mozilla.org/bonsai.html">Bonsai</a> ' . + 'server containing information about your CVS repository. ' . + 'Patch Viewer will use this information to create links to ' . + 'bonsai\'s blame for each section of a patch (it will append ' . + '"/cvsblame.cgi?..." to this url). Leave this blank if you ' . + 'don\'t understand what this is.', + type => 't', + default => '' + }, + + { + name => 'lxr_url', + desc => 'The URL to an ' . + '<a href="http://sourceforge.net/projects/lxr">LXR</a> server ' . + 'that indexes your CVS repository. Patch Viewer will use this ' . + 'information to create links to LXR for each file in a patch. ' . + 'Leave this blank if you don\'t understand what this is.', + type => 't', + default => '' + }, + + { + name => 'lxr_root', + desc => 'Some LXR installations do not index the CVS repository from ' . + 'the root--' . + '<a href="http://lxr.mozilla.org/mozilla">Mozilla\'s</a>, for ' . + 'example, starts indexing under <code>mozilla/</code>. This ' . + 'means URLs are relative to that extra path under the root. ' . + 'Enter this if you have a similar situation. Leave it blank ' . + 'if you don\'t know what this is.', + type => 't', + default => '', + }, ); 1; diff --git a/describecomponents.cgi b/describecomponents.cgi index bdb824b82d019b678ba5756d2e77d6770997977f..05af919491e3b132933cf4f3c041a977cfce6147 100755 --- a/describecomponents.cgi +++ b/describecomponents.cgi @@ -31,6 +31,8 @@ use strict; use lib qw(.); +use Bugzilla; + require "CGI.pl"; ConnectToDatabase(); @@ -38,11 +40,13 @@ quietly_check_login(); GetVersionTable(); +my $cgi = Bugzilla->cgi; + if (!defined $::FORM{'product'}) { # Reference to a subset of %::proddesc, which the user is allowed to see my %products; - if (AnyDefaultGroups()) { + if (AnyEntryGroups()) { # OK, now only add products the user can see confirm_login() unless $::userid; foreach my $p (@::legal_product) { @@ -63,7 +67,7 @@ if (!defined $::FORM{'product'}) { $::vars->{'proddesc'} = \%products; $::vars->{'target'} = "describecomponents.cgi"; - print "Content-type: text/html\n\n"; + print $cgi->header(); $::template->process("global/choose-product.html.tmpl", $::vars) || ThrowTemplateError($::template->error()); exit; @@ -118,7 +122,7 @@ while (MoreSQLData()) { $::vars->{'product'} = $product; $::vars->{'components'} = \@components; -print "Content-type: text/html\n\n"; +print $cgi->header(); $::template->process("reports/components.html.tmpl", $::vars) || ThrowTemplateError($::template->error()); diff --git a/describekeywords.cgi b/describekeywords.cgi index 0ff538b63a05449cb4b68a87a1c25619b400e4b5..60c5a9fd8eb44a357b3598e7495da80afb12802b 100755 --- a/describekeywords.cgi +++ b/describekeywords.cgi @@ -24,6 +24,8 @@ use strict; use lib "."; +use Bugzilla; + require "CGI.pl"; # Use the global template variables. @@ -33,6 +35,8 @@ ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + SendSQL("SELECT keyworddefs.name, keyworddefs.description, COUNT(keywords.bug_id) FROM keyworddefs LEFT JOIN keywords ON keyworddefs.id=keywords.keywordid @@ -52,6 +56,6 @@ while (MoreSQLData()) { $vars->{'keywords'} = \@keywords; $vars->{'caneditkeywords'} = UserInGroup("editkeywords"); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); $template->process("reports/keywords.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/docs/CVS/Entries b/docs/CVS/Entries index 6a30d3d5c99f7d088c1dda1d3406d95f4f4e97f3..66f04173dcb54fbb9ef973ab96d96ffdd7e99d9b 100644 --- a/docs/CVS/Entries +++ b/docs/CVS/Entries @@ -1,7 +1,8 @@ -/README.docs/1.9/Wed Apr 23 03:23:04 2003//TBUGZILLA-2_17_4 -/makedocs.pl/1.4/Wed Apr 23 02:04:01 2003//TBUGZILLA-2_17_4 -/rel_notes.txt/1.23/Fri Apr 25 00:22:41 2003//TBUGZILLA-2_17_4 +/README.docs/1.9/Wed Apr 23 03:23:04 2003//TBUGZILLA-2_17_5 +/makedocs.pl/1.6/Tue Jul 8 01:31:05 2003//TBUGZILLA-2_17_5 +/rel_notes.txt/1.23/Fri Apr 25 00:22:41 2003//TBUGZILLA-2_17_5 D/html//// D/images//// +D/pdf//// D/txt//// D/xml//// diff --git a/docs/CVS/Tag b/docs/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/docs/CVS/Tag +++ b/docs/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/docs/html/Bugzilla-Guide.html b/docs/html/Bugzilla-Guide.html index 694648c261af56d8f170251054aca8934e080b02..3b3283361bf011f114fcfe7f066f32ae7aae77eb 100644 --- a/docs/html/Bugzilla-Guide.html +++ b/docs/html/Bugzilla-Guide.html @@ -1,11 +1,10 @@ <HTML ><HEAD ><TITLE ->The Bugzilla Guide - 2.17.4 Development Release</TITLE +>The Bugzilla Guide - 2.17.5 Development Release</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><META +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><META NAME="KEYWORD" CONTENT="Bugzilla"><META NAME="KEYWORD" @@ -43,7 +42,7 @@ CLASS="title" ><A NAME="AEN2" ></A ->The Bugzilla Guide - 2.17.4 Development Release</H1 +>The Bugzilla Guide - 2.17.5 Development Release</H1 ><H3 CLASS="author" ><A @@ -61,7 +60,7 @@ CLASS="corpauthor" >The Bugzilla Team</H3 ><P CLASS="pubdate" ->2003-04-23<BR></P +>2003-11-01<BR></P ><DIV ><DIV CLASS="abstract" @@ -85,7 +84,7 @@ NAME="AEN14" HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation" TARGET="_top" >Bugzilla Documentation</A -> compontent. +> component. </P ><P >This is a development version of this guide. Information in it @@ -93,6 +92,14 @@ TARGET="_top" (which will correspond with the 2.18 release of Bugzilla). </P ><P +> The most current version of this document can always be found on the + <A +HREF="http://www.bugzilla.org/documentation.html" +TARGET="_top" +>Bugzilla Documentation Page</A +>. + </P +><P ></P ></DIV ></DIV @@ -448,11 +455,16 @@ CLASS="LOT" ></DT ><DT >4-1. <A +HREF="#install-mysql-packets" +>Set Max Packet Size in MySQL</A +></DT +><DT +>4-2. <A HREF="#trouble-filetemp-errors" >Other File::Temp error messages</A ></DT ><DT ->4-2. <A +>4-3. <A HREF="#trouble-filetemp-patch" >Patch for File::Temp in Perl 5.6.0</A ></DT @@ -468,6 +480,11 @@ CLASS="LOT" ></DT ><DT >4-1. <A +HREF="#install-perlmodules-cpan" +>Installing perl modules with CPAN</A +></DT +><DT +>4-2. <A HREF="#http-apache-htaccess" ><TT CLASS="filename" @@ -507,7 +524,7 @@ NAME="copyright" ></A >1.1. Copyright Information</H1 ><A -NAME="AEN33" +NAME="AEN35" ></A ><TABLE BORDER="0" @@ -526,9 +543,9 @@ VALIGN="TOP" ><P > Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation - License, Version 1.1 or any later version published by the + License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no - Front-Cover Texts, and with no Back-Cover Texts. A copy of + Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in <A HREF="#gfdl" >Appendix E</A @@ -579,15 +596,15 @@ NAME="disclaimer" </P ><P > All copyrights are held by their respective owners, unless - specifically noted otherwise. Use of a term in this document + specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. </P ><P > Naming of particular products or brands should not be seen as - endorsements, with the exception of the term "GNU/Linux". We + endorsements, with the exception of the term "GNU/Linux". We wholeheartedly endorse the use of GNU/Linux in every situation - where it is appropriate. It is an extremely versatile, stable, + where it is appropriate. It is an extremely versatile, stable, and robust operating system that offers an ideal operating environment for Bugzilla. </P @@ -602,10 +619,10 @@ NAME="disclaimer" documented or fixed in the code, security holes surely exist. Great care should be taken both in the installation and usage of this software. Carefully consider the implications of installing - other network services with Bugzilla. The Bugzilla development + other network services with Bugzilla. The Bugzilla development team members, Netscape Communications, America Online Inc., and any affiliated developers or sponsors assume no liability for - your use of this product. You have the source code to this + your use of this product. You have the source code to this product, and are responsible for auditing it yourself to ensure your security needs are met. </P @@ -619,7 +636,7 @@ NAME="newversions" ></A >1.3. New Versions</H1 ><P -> This is the 2.17.4 version of The Bugzilla Guide. It is so named +> This is the 2.17.5 version of The Bugzilla Guide. It is so named to match the current version of Bugzilla. This version of the guide, like its associated Bugzilla version is a @@ -635,7 +652,7 @@ NAME="newversions" > The newest version of this guide can always be found at <A HREF="http://www.bugzilla.org" TARGET="_top" ->bugzilla.org</A +>http://www.bugzilla.org</A >; including documentation for past releases and the current development version. </P @@ -650,13 +667,12 @@ TARGET="_top" </P ><P > The latest version of this document can always be checked out via CVS. - Please follow the instructions available at - <A + Please follow the <A HREF="http://www.mozilla.org/cvs.html" TARGET="_top" ->the Mozilla CVS page</A ->, - and check out the <TT +>Mozilla CVS</A +> + instructions and check out the <TT CLASS="filename" >mozilla/webtools/bugzilla/docs/</TT > @@ -788,13 +804,13 @@ HREF="news://news.mozilla.org/netscape/public/mozilla/webtools" TARGET="_top" >news://news.mozilla.org/netscape/public/mozilla/webtools</A > - newsgroup. Without your discussions, insight, suggestions, and patches, + newsgroup. Without your discussions, insight, suggestions, and patches, this could never have happened. </P ><P > Thanks also go to the following people for significant contributions to this documentation (in alphabetical order): - Andrew Pearson, Ben FrantzDale, Eric Hanson, Gervase Markham, Joe Robins, Kevin Brannen, Ron Teitelbaum, Spencer Smith, Zach Liption + Andrew Pearson, Ben FrantzDale, Eric Hanson, Gervase Markham, Joe Robins, Kevin Brannen, Martin Wulffeld, Ron Teitelbaum, Spencer Smith, Zach Liption . </P ></DIV @@ -811,7 +827,7 @@ NAME="conventions" ><DIV CLASS="informaltable" ><A -NAME="AEN110" +NAME="AEN113" ></A ><P ></P @@ -1371,8 +1387,8 @@ NAME="myaccount" <A HREF="http://landfill.bugzilla.org/bugzilla-tip/" TARGET="_top" -> http://landfill.bugzilla.org/bugzilla-tip/</A -> +>http://landfill.bugzilla.org/bugzilla-tip/</A +>. </P ><P ></P @@ -1707,25 +1723,20 @@ NAME="query" <A HREF="http://landfill.bugzilla.org/bugzilla-tip/query.cgi" TARGET="_top" -> landfill.bugzilla.org/bugzilla-tip/query.cgi</A -> - - .</P +>http://landfill.bugzilla.org/bugzilla-tip/query.cgi</A +>.</P ><P >The Search page has controls for selecting different possible - values for all of the fields in a bug, as described above. Once you've - defined a search, you can either run it, or save it as a Remembered - Query, which can optionally appear in the footer of your pages.</P + values for all of the fields in a bug, as described above. For some + fields, multiple values can be selected. In those cases, Bugzilla + returns bugs where the content of the field matches one of the selected + values. If none is selected, then the field can take any value.</P ><P ->Highly advanced querying is done using Boolean Charts, which have - their own - <A -HREF="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html" -TARGET="_top" -> context-sensitive help</A -> - - .</P +>Once you've defined a search, you can either run it, or save it + as a Remembered Query, which can optionally appear in the footer of + your pages.</P +><P +>Highly advanced querying is done using Boolean Charts.</P ></DIV ><DIV CLASS="section" @@ -1861,6 +1872,172 @@ TARGET="_top" ></LI ></OL ></DIV +><DIV +CLASS="section" +><HR><H2 +CLASS="section" +><A +NAME="patchviewer" +></A +>3.1.6. Patch Viewer</H2 +><P +>Viewing and reviewing patches in Bugzilla is often difficult due to + lack of context, improper format and the inherent readability issues that + raw patches present. Patch Viewer is an enhancement to Bugzilla designed + to fix that by offering increased context, linking to sections, and + integrating with Bonsai, LXR and CVS.</P +><P +>Patch viewer allows you to:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>View patches in color, with side-by-side view rather than trying + to interpret the contents of the patch.</TD +></TR +><TR +><TD +>See the difference between two patches.</TD +></TR +><TR +><TD +>Get more context in a patch.</TD +></TR +><TR +><TD +>Collapse and expand sections of a patch for easy + reading.</TD +></TR +><TR +><TD +>Link to a particular section of a patch for discussion or + review</TD +></TR +><TR +><TD +>Go to Bonsai or LXR to see more context, blame, and + cross-references for the part of the patch you are looking at</TD +></TR +><TR +><TD +>Create a rawtext unified format diff out of any patch, no + matter what format it came from</TD +></TR +></TBODY +></TABLE +><P +></P +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_view" +></A +>3.1.6.1. Viewing Patches in Patch Viewer</H3 +><P +>The main way to view a patch in patch viewer is to click on the + "Diff" link next to a patch in the Attachments list on a bug. You may + also do this within the edit window by clicking the "View Attachment As + Diff" button in the Edit Attachment screen.</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_diff" +></A +>3.1.6.2. Seeing the Difference Between Two Patches</H3 +><P +>To see the difference between two patches, you must first view the + newer patch in Patch Viewer. Then select the older patch from the + dropdown at the top of the page ("Differences between [dropdown] and + this patch") and click the "Diff" button. This will show you what + is new or changed in the newer patch.</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_context" +></A +>3.1.6.3. Getting More Context in a Patch</H3 +><P +>To get more context in a patch, you put a number in the textbox at + the top of Patch Viewer ("Patch / File / [textbox]") and hit enter. + This will give you that many lines of context before and after each + change. Alternatively, you can click on the "File" link there and it + will show each change in the full context of the file. This feature only + works against files that were diffed using "cvs diff".</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_collapse" +></A +>3.1.6.4. Collapsing and Expanding Sections of a Patch</H3 +><P +>To view only a certain set of files in a patch (for example, if a + patch is absolutely huge and you want to only review part of it at a + time), you can click the "(+)" and "(-)" links next to each file (to + expand it or collapse it). If you want to collapse all files or expand + all files, you can click the "Collapse All" and "Expand All" links at the + top of the page.</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_link" +></A +>3.1.6.5. Linking to a Section of a Patch</H3 +><P +>To link to a section of a patch (for example, if you want to be + able to give someone a URL to show them which part you are talking + about) you simply click the "Link Here" link on the section header. The + resulting URL can be copied and used in discussion. (Copy Link + Location in Mozilla works as well.)</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_bonsai_lxr" +></A +>3.1.6.6. Going to Bonsai and LXR</H3 +><P +>To go to Bonsai to get blame for the lines you are interested in, + you can click the "Lines XX-YY" link on the section header you are + interested in. This works even if the patch is against an old + version of the file, since Bonsai stores all versions of the file.</P +><P +>To go to LXR, you click on the filename on the file header + (unfortunately, since LXR only does the most recent version, line + numbers are likely to rot).</P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="patchviewer_unified_diff" +></A +>3.1.6.7. Creating a Unified Diff</H3 +><P +>If the patch is not in a format that you like, you can turn it + into a unified diff format by clicking the "Raw Unified" link at the top + of the page.</P +></DIV +></DIV ></DIV ><DIV CLASS="section" @@ -1878,7 +2055,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN370" +NAME="AEN407" ></A >3.2.1. Autolinkification</H2 ><P @@ -2026,7 +2203,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN399" +NAME="AEN436" ></A >3.2.5. Filing Bugs</H2 ><P @@ -2178,34 +2355,21 @@ CLASS="section" NAME="stepbystep" ></A >4.1. Step-by-step Install</H1 -><DIV -CLASS="section" -><H2 -CLASS="section" -><A -NAME="intstall-into" -></A ->4.1.1. Introduction</H2 ><P ->Bugzilla has been successfully installed under Solaris, Linux, - and Win32. Win32 is not yet officially supported, but many people - have got it working fine. - Please see +>Bugzilla has been successfully installed under many different + operating systems including almost all Unix clones and + <SPAN +CLASS="productname" +>Microsoft Windows</SPAN +>. Many + operating systems have utilities that make installation easier or quirks + that make it harder. We have tried to collect that information in <A -HREF="#os-win32" ->Section 4.3.1</A -> - for further advice on getting Bugzilla to work on Microsoft - Windows.</P -></DIV -><DIV -CLASS="section" -><HR><H2 -CLASS="section" -><A -NAME="install-package-list" -></A ->4.1.2. Package List</H2 +HREF="#os-specific" +>Section 4.3</A +>, so be sure to check out that section before + you start your installation. + </P ><DIV CLASS="note" ><P @@ -2227,264 +2391,232 @@ ALT="Note"></TD ALIGN="LEFT" VALIGN="TOP" ><P -> If you are running the very most recent - version of Perl and MySQL (both the executables and development - libraries) on your system, you can skip these manual installation - steps for the Perl modules by using Bundle::Bugzilla; see +>Windows is one of those operating systems that has many quirks + and is not yet officially supported by the Bugzilla team. If you wish + to install Bugzilla on Windows, be sure to see <A -HREF="#bundlebugzilla" ->Using Bundle::Bugzilla instead of manually installing Perl modules</A +HREF="#os-win32" +>Section 4.3.1</A >. </P ></TD ></TR ></TABLE ></DIV +><DIV +CLASS="warning" ><P ->The software packages necessary for the proper running of - Bugzilla (with download links) are: - <P ></P +><TABLE +CLASS="warning" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/warning.gif" +HSPACE="5" +ALT="Warning"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>While installing Bugzilla, it is a good idea to ensure that there + is some kind of firewall between you and the rest of the Internet + as your machine may be insecure for periods during the install. Many + installation steps require an active Internet connection to complete, + but you must take care to ensure that at no point is your machine + vulnerable to an attack.</P +></TD +></TR +></TABLE +></DIV +><P +>This guide assumes that you already have your operating system + installed, network configured, and have administrative access to the + shell on the machine you are installing Bugzilla onto. It is possible to + install and run Bugzilla without administrative access, but you have to + either make sure all the required software is installed or get somebody + with administrative access to install it for you. + </P +><P +>The listing below is a basic step-by-step list. More information + can be found in the sections below. Minimum versions will be + included in parenthesis where appropriate. + </P +><DIV +CLASS="procedure" ><OL TYPE="1" ><LI ><P -> <A -HREF="http://www.mysql.com/" -TARGET="_top" ->MySQL database server</A +><A +HREF="#install-mysql" +>Install MySQL</A > - (3.23.41 or greater) - </P + (3.23.41) + </P ></LI ><LI ><P -> <A -HREF="http://www.perl.org" -TARGET="_top" ->Perl</A +><A +HREF="#install-perl" +>Install Perl</A > - (5.6, 5.6.1 is recommended if you wish to - use Bundle::Bugzilla) - </P + (5.6) + </P ></LI ><LI ><P ->Perl Modules (minimum version): - <P -></P -><OL -TYPE="a" -><LI -><P -> <A -HREF="http://www.template-toolkit.org" -TARGET="_top" ->Template</A +><A +HREF="#install-perlmodules" +>Install Perl Modules</A > - (v2.08) - </P + </P ></LI ><LI ><P -> <A -HREF="http://www.perldoc.com/perl5.6/lib/File/Temp.html" -TARGET="_top" -> File::Temp</A +><A +HREF="#install-webserver" +>Install a Webserver</A > - (1.804) (Prerequisite for Template) - </P + </P ></LI ><LI ><P -> <A -HREF="http://www.cpan.org/modules/by-module/AppConfig/" -TARGET="_top" ->AppConfig - </A +><A +HREF="#install-bzfiles" +>Put Bugzilla in the Webspace</A > - (1.52) - </P + </P ></LI ><LI ><P -> <A -HREF="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz" -TARGET="_top" ->Text::Wrap</A -> - (2001.0131) - </P +><A +HREF="#install-setupdatabase" +>Setup the MySQL Database</A +> + </P ></LI -><LI +></OL +></DIV +><DIV +CLASS="section" +><HR><H2 +CLASS="section" +><A +NAME="install-mysql" +></A +>4.1.1. MySQL</H2 ><P -> <A -HREF="http://search.cpan.org/search?dist=File-Spec" +>Visit the MySQL homepage at + <A +HREF="http://www.mysql.com" TARGET="_top" ->File::Spec - </A +>http://www.mysql.com</A > - (0.82) + to grab and install the latest stable release of the server. </P -></LI -><LI +><DIV +CLASS="note" ><P -> <A -HREF="http://www.cpan.org/modules/by-module/Data/" -TARGET="_top" ->Data::Dumper - </A -> - (any) - </P -></LI -><LI +></P +><TABLE +CLASS="note" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" ><P -> <A -HREF="http://www.cpan.org/modules/by-module/Mysql/" -TARGET="_top" ->DBD::mysql - </A -> - (2.1010) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/DBI/" -TARGET="_top" ->DBI</A -> - (1.32) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/Date/" -TARGET="_top" ->Date::Parse - </A -> - (2.21) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/CGI/" -TARGET="_top" ->CGI - </A -> - (2.88) - </P -></LI -></OL -> - and, optionally: - <P -></P -><OL -TYPE="a" -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/GD/" -TARGET="_top" ->GD</A -> - (1.20) for bug charting - </P -></LI -><LI -><P -> GD::Graph - (any) for bug charting - </P -></LI -><LI -><P -> GD::Text::Align - (any) for bug charting - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/Chart/" -TARGET="_top" ->Chart::Base - </A +> Many of the binary + versions of MySQL store their data files in + <TT +CLASS="filename" +>/var</TT +>. + On some Unix systems, this is part of a smaller root partition, + and may not have room for your bug database. You can set the data + directory as an option to <TT +CLASS="filename" +>configure</TT > - (0.99c) for bug charting - </P -></LI -><LI + if you build MySQL from source yourself.</P +></TD +></TR +></TABLE +></DIV ><P -> XML::Parser - (any) for the XML interface +>If you install from something other than a packaging/installation + system (such as .rpm, .dep, .exe, or .msi) you will need to configure + your system so the MySQL server daemon will come back up whenever + your machine reboots. </P -></LI -><LI ><P -> MIME::Parser - (any) for the email interface +>If you wish to have attachments larger than 64K, you will have to + configure MySQL to accept large packets. This is done by adding the text + in <A +HREF="#install-mysql-packets" +>Figure 4-1</A +> to your + <TT +CLASS="filename" +>my.conf</TT +> file. There is also a parameter in Bugzilla + for setting the maximum allowable attachment size. + + You should set this value to be slightly larger than that parameter. </P -></LI -></OL -> - </P -></LI -><LI -><P -> The web server of your choice. - <A -HREF="http://www.apache.org/" -TARGET="_top" ->Apache</A -> - is highly recommended. - </P -></LI -></OL -> - - <DIV -CLASS="warning" +><DIV +CLASS="figure" +><A +NAME="install-mysql-packets" +></A ><P +><B +>Figure 4-1. Set Max Packet Size in MySQL</B ></P ><TABLE -CLASS="warning" -WIDTH="100%" BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" -><IMG -SRC="../images/warning.gif" -HSPACE="5" -ALT="Warning"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P ->It is a good idea, while installing Bugzilla, to ensure that there - is some kind of firewall between you and the rest of the Internet, - because your machine may be insecure for periods during the install. - Many - installation steps require an active Internet connection to complete, - but you must take care to ensure that at no point is your machine - vulnerable to an attack.</P +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> [mysqld] +# Allow packets up to 1M +set-variable = max_allowed_packet=1M + </PRE +></FONT ></TD ></TR ></TABLE ></DIV -> - +><P +>If you are running Bugzilla and MySQL on the same machine, you may + also wish to utilize the <TT +CLASS="option" +>skip-networking</TT +> option as + mentioned in <A +HREF="#security-mysql" +>Section 5.6.2</A +> for the added security. </P ></DIV ><DIV @@ -2492,131 +2624,209 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="install-mysql" +NAME="install-perl" ></A ->4.1.3. MySQL</H2 +>4.1.2. Perl</H2 ><P ->Visit the MySQL homepage at - <A -HREF="http://www.mysql.com" +>Any machine that doesn't have Perl on it is a sad machine indeed. + Perl can be got in source form from <A +HREF="http://www.perl.com" TARGET="_top" ->www.mysql.com</A -> - to grab and install the latest stable release of the server. +>http://www.perl.com</A +>. + There are also binary versions available for many platforms, most of which + are linked to from perl.com. + Although Bugzilla runs with perl 5.6, + it's a good idea to be up to the very latest version + if you can when running Bugzilla. As of this writing, that is Perl + version 5.8.</P +></DIV +><DIV +CLASS="section" +><HR><H2 +CLASS="section" +><A +NAME="install-perlmodules" +></A +>4.1.3. Perl Modules</H2 +><P +>Perl modules can be found using + <A +HREF="#gloss-cpan" +><I +CLASS="glossterm" +>CPAN</I +></A +> on Unix based systems or + <A +HREF="#gloss-ppm" +><I +CLASS="glossterm" +>PPM</I +></A +> on Win32. The root servers + have a real tendency to bog down, so please use mirrors. + </P +><P +>Good instuctions can be found for using each of these services on + their respective websites. The basics can be found in + <A +HREF="#install-perlmodules-cpan" +>Example 4-1</A +> for CPAN and + <A +HREF="#win32-perlmodules" +>Section 4.3.1.2</A +> for PPM. </P ><DIV -CLASS="note" +CLASS="example" +><A +NAME="install-perlmodules-cpan" +></A ><P +><B +>Example 4-1. Installing perl modules with CPAN</B ></P -><TABLE -CLASS="note" -WIDTH="100%" +><P +>The easy way: + <TABLE BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" -><IMG -SRC="../images/note.gif" -HSPACE="5" -ALT="Note"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P -> Many of the binary - versions of MySQL store their data files in - <TT -CLASS="filename" ->/var</TT ->. - On some Unix systems, this is part of a smaller root partition, - and may not have room for your bug database. You can set the data - directory as an option to <TT -CLASS="filename" ->configure</TT -> - if you build MySQL from source yourself.</P +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT +CLASS="prompt" +>bash#</TT +> perl -MCPAN -e 'install "<modulename>"' + </PRE +></FONT ></TD ></TR ></TABLE -></DIV -><P ->If you install from something other than an RPM or Debian - package, you will need to add <TT -CLASS="filename" ->mysqld</TT > - to your init scripts so the server daemon will come back up whenever - your machine reboots. Further discussion of UNIX init sequences are - beyond the scope of this guide. - </P + </P ><P ->Change your init script to start - <TT -CLASS="filename" ->mysqld</TT +>Or the hard way: + <TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT +CLASS="prompt" +>bash#</TT +> tar xzvf <module>.tar.gz <A +NAME="cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A > - with the ability to accept large packets. By default, - <TT -CLASS="filename" ->mysqld</TT +<TT +CLASS="prompt" +>bash#</TT +> cd <module> <A +NAME="cpan-moduledir" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A > - only accepts packets up to 64K long. This limits the size of - attachments you may put on bugs. If you add - <TT -CLASS="option" ->-O max_allowed_packet=1M</TT +<TT +CLASS="prompt" +>bash#</TT +> perl Makefile.PL +<TT +CLASS="prompt" +>bash#</TT +> make +<TT +CLASS="prompt" +>bash#</TT +> make test +<TT +CLASS="prompt" +>bash#</TT +> make install + </PRE +></FONT +></TD +></TR +></TABLE > - to the command that starts - <TT + <DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="#cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></DT +><DD +>This assumes that you've already downloaded the + <TT CLASS="filename" ->mysqld</TT -> - (or <TT +><module>.tar.gz</TT +> to the current working + directory. + </DD +><DT +><A +HREF="#cpan-moduledir" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A +></DT +><DD +>The process of untaring the module as defined in + <A +HREF="#cpan-moduletar" +><A +HREF="#cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></A +> will create the + <TT CLASS="filename" ->safe_mysqld</TT ->), - then you will be able to have attachments up to about 1 megabyte. - There is a Bugzilla parameter for maximum attachment size; - you should configure it to match the value you choose here.</P -><P ->If you plan on running Bugzilla and MySQL on the same machine, - consider using the - <TT -CLASS="option" ->--skip-networking</TT +><module></TT +> directory. + </DD +></DL +></DIV > - option in the init script. This enhances security by preventing - network access to MySQL.</P + </P ></DIV ><DIV -CLASS="section" -><HR><H2 -CLASS="section" -><A -NAME="install-perl" -></A ->4.1.4. Perl</H2 -><P ->Any machine that doesn't have Perl on it is a sad machine indeed. - Perl can be got in source form from - <A -HREF="http://www.perl.com" -TARGET="_top" ->perl.com</A -> for the rare - *nix systems which don't have it. - Although Bugzilla runs with perl 5.6, - it's a good idea to be up to the very latest version - if you can when running Bugzilla. As of this writing, that is Perl - version 5.8.</P -><DIV CLASS="tip" -><A -NAME="bundlebugzilla" -></A ><P ></P ><TABLE @@ -2636,249 +2846,442 @@ ALT="Tip"></TD ALIGN="LEFT" VALIGN="TOP" ><P ->You can skip the following Perl module installation steps by - installing +>Many people complain that Perl modules will not install for + them. Most times, the error messages complain that they are missing a + file in <SPAN -CLASS="productname" ->Bundle::Bugzilla</SPAN -> - - from - <A -HREF="#gloss-cpan" -><I -CLASS="glossterm" ->CPAN</I -></A ->, - which installs all required modules for you.</P -><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->perl -MCPAN -e 'install "Bundle::Bugzilla"'</B -> - </TT +CLASS="QUOTE" +>"@INC"</SPAN +>. + Virtually every time, this error is due to permissions being set too + restrictively for you to compile Perl modules or not having the + necessary Perl development libraries installed on your system. + Consult your local UNIX systems administrator for help solving these + permissions issues; if you + <EM +>are</EM > - </P -><P ->Bundle::Bugzilla doesn't include GD, Chart::Base, or - MIME::Parser, which are not essential to a basic Bugzilla install. If - installing this bundle fails, you should install each module - individually to isolate the problem.</P + the local UNIX sysadmin, please consult the newsgroup/mailing list + for further assistance or hire someone to help you out.</P ></TD ></TR ></TABLE ></DIV -></DIV -><DIV -CLASS="section" -><HR><H2 -CLASS="section" -><A -NAME="perl-modules" -></A ->4.1.5. Perl Modules</H2 ><P +>Perl Modules (minimum version): + <P +></P +><OL +TYPE="1" +><LI +><P +> <A +HREF="#install-modules-bundle-bugzilla" +>Bundle::Bugzilla</A +> + (Will allow you to skip the rest) + </P +></LI +><LI +><P +> <A +HREF="#install-modules-appconfig" +>AppConfig</A +> + (1.52) + </P +></LI +><LI +><P +> <A +HREF="#install-modules-cgi" +>CGI</A > - All Perl modules can be found on the - <A -HREF="http://www.cpan.org" -TARGET="_top" ->Comprehensive Perl - Archive Network</A -> (CPAN). The - CPAN servers have a real tendency to bog down, so please use mirrors. - </P + (2.88) + </P +></LI +><LI ><P ->Quality, general Perl module installation instructions can be - found on the CPAN website, but the easy thing to do is to just use the - CPAN shell which does all the hard work for you. - To use the CPAN shell to install a module: - </P +> <A +HREF="#install-modules-data-dumper" +>Data::Dumper</A +> + (any) + </P +></LI +><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="#install-modules-date-format" +>Date::Format</A > - <B -CLASS="command" ->perl -MCPAN -e 'install "<modulename>"'</B + (2.21) + </P +></LI +><LI +><P +> <A +HREF="#install-modules-dbi" +>DBI</A +> + (1.32) + </P +></LI +><LI +><P +> <A +HREF="#install-modules-dbd-mysql" +>DBD::mysql</A > - </TT + (2.1010) + </P +></LI +><LI +><P +> <A +HREF="#install-file-spec" +>File::Spec</A > - </P + (0.82) + </P +></LI +><LI ><P -> To do it the hard way: - </P +> <A +HREF="#install-modules-file-temp" +>File::Temp</A +> + (any) + </P +></LI +><LI ><P ->Untar the module tarball -- it should create its own - directory</P +> <A +HREF="#install-modules-template" +>Template Toolkit</A +> + (2.08) + </P +></LI +><LI ><P ->CD to the directory just created, and enter the following - commands: +> <A +HREF="#install-modules-text-wrap" +>Text::Wrap</A +> + (2001.0131) + </P +></LI +></OL +> + + and, optionally: <P ></P ><OL TYPE="1" ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->perl Makefile.PL</B -> - </TT +> <A +HREF="#install-modules-gd" +>GD</A > + (1.20) for bug charting </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->make</B +> <A +HREF="#install-modules-chart-base" +>Chart::Base</A > - </TT + (0.99c) for bug charting + </P +></LI +><LI +><P +> <A +HREF="#install-modules-xml-parser" +>XML::Parser</A > + (any) for the XML interface </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->make test</B -> - </TT +> <A +HREF="#install-modules-gd-graph" +>GD::Graph</A > + (any) for bug charting </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="#install-modules-gd-text-align" +>GD::Text::Align</A > - - <B -CLASS="command" ->make install</B + (any) for bug charting + </P +></LI +><LI +><P +> <A +HREF="#install-modules-mime-parser" +>MIME::Parser</A > - </TT + (any) for the email interface + </P +></LI +><LI +><P +> <A +HREF="#install-modules-patchreader" +>PatchReader</A > + (0.9.1) for pretty HTML view of patches </P ></LI ></OL -> +> </P ><DIV -CLASS="warning" +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-bundle-bugzilla" +></A +>4.1.3.1. Bundle::Bugzilla</H3 ><P -></P +>If you are running at least perl 5.6.1, you can save yourself a lot + of time by using Bundle::Bugzilla. This bundle contains every module + required to get Bugzilla running. It does not include GD and friends, but + these are not required for a base install and can always be added later + if the need arises. + </P +><P +>Assuming your perl was installed with CPAN (most unix installations + are), using Bundle::Bugzilla is really easy. Simply follow along with the + commands below. + </P ><TABLE -CLASS="warning" -WIDTH="100%" BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT +CLASS="prompt" +>bash#</TT +> <B +CLASS="command" +>perl -MCPAN -eshell</B +> <A +NAME="bundle-cpanconfig" ><IMG -SRC="../images/warning.gif" -HSPACE="5" -ALT="Warning"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P ->Many people complain that Perl modules will not install for - them. Most times, the error messages complain that they are missing a - file in - <SPAN -CLASS="QUOTE" ->"@INC"</SPAN ->. - Virtually every time, this error is due to permissions being set too - restrictively for you to compile Perl modules or not having the - necessary Perl development libraries installed on your system. - Consult your local UNIX systems administrator for help solving these - permissions issues; if you - <EM ->are</EM +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A > - the local UNIX sysadmin, please consult the newsgroup/mailing list - for further assistance or hire someone to help you out.</P +cpan shell -- CPAN exploration and modules installation (v1.63) +ReadLine support enabled + +<TT +CLASS="prompt" +>cpan></TT +> + + </PRE +></FONT ></TD ></TR ></TABLE +><DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="#bundle-cpanconfig" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></DT +><DD +>At this point, unless you've used CPAN on this machine before, + you'll have to go through a series of configuration steps. + </DD +></DL +></DIV ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN566" +NAME="install-modules-appconfig" ></A ->4.1.5.1. DBI</H3 +>4.1.3.2. AppConfig (1.52)</H3 ><P ->The DBI module is a generic Perl module used the - MySQL-related modules. As long as your Perl installation was done - correctly the DBI module should be a breeze. It's a mixed Perl/C - module, but Perl's MakeMaker system simplifies the C compilation - greatly.</P +>Dependency for Template Toolkit. We probably don't need to + specifically check for it anymore. + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-cgi" +></A +>4.1.3.3. CGI (2.88)</H3 +><P +>The CGI module parses form elements and cookies and does many + other usefule things. It come as a part of recent perl distributions, but + Bugzilla needs a fairly new version. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/CGI.pm/" +TARGET="_top" +>http://search.cpan.org/dist/CGI.pm/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/CGI.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/CGI.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/CGI.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/CGI.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN569" +NAME="install-modules-data-dumper" ></A ->4.1.5.2. Data::Dumper</H3 +>4.1.3.4. Data::Dumper (any)</H3 ><P >The Data::Dumper module provides data structure persistence for Perl (similar to Java's serialization). It comes with later sub-releases of Perl 5.004, but a re-installation just to be sure it's - available won't hurt anything.</P + available won't hurt anything. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Data-Dumper/" +TARGET="_top" +>http://search.cpan.org/dist/Data-Dumper/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Data-Dumper.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Data-Dumper.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/Data/Dumper.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/Data/Dumper.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-date-format" +></A +>4.1.3.5. TimeDate modules (2.21)</H3 +><P +>Many of the more common date/time/calendar related Perl modules + have been grouped into a bundle similar to the MySQL modules bundle. + This bundle is stored on the CPAN under the name TimeDate. + The component module we're most interested in is the Date::Format + module, but installing all of them is probably a good idea anyway. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/TimeDate/" +TARGET="_top" +>http://search.cpan.org/dist/TimeDate/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/TimeDate.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/TimeDate.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/TimeDate/lib/Date/Format.pm" +TARGET="_top" +>http://search.cpan.org/dist/TimeDate/lib/Date/Format.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-dbi" +></A +>4.1.3.6. DBI (1.32)</H3 +><P +>The DBI module is a generic Perl module used the + MySQL-related modules. As long as your Perl installation was done + correctly the DBI module should be a breeze. It's a mixed Perl/C + module, but Perl's MakeMaker system simplifies the C compilation + greatly.</P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/DBI/" +TARGET="_top" +>http://search.cpan.org/dist/DBI/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBI.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBI.zip</A +><br> + Documentation: <A +HREF="http://dbi.perl.org/doc/" +TARGET="_top" +>http://dbi.perl.org/doc/</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN572" +NAME="install-modules-dbd-mysql" ></A ->4.1.5.3. MySQL-related modules</H3 +>4.1.3.7. MySQL-related modules</H3 ><P >The Perl/MySQL interface requires a few mutually-dependent Perl modules. These modules are grouped together into the the @@ -2896,34 +3299,161 @@ NAME="AEN572" with a null password should find itself with sufficient access to run tests on the 'test' database which MySQL created upon installation. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/DBD-mysql/" +TARGET="_top" +>http://search.cpan.org/dist/DBD-mysql/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBD-Mysql.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBD-Mysql.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pod" +TARGET="_top" +>http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pod</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-file-spec" +></A +>4.1.3.8. File::Spec (0.82)</H3 +><P +>File::Spec is a perl module that allows file operations, such as + generating full path names, to work cross platform. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/File-Spec/" +TARGET="_top" +>http://search.cpan.org/dist/File-Spec/</A +><br> + PPM Download Page: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/File/Spec.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/File/Spec.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-file-temp" +></A +>4.1.3.9. File::Temp (any)</H3 +><P +>File::Temp is used to generate a temporary filename that is + guaranteed to be unique. It comes as a standard part of perl + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/File-Spec/" +TARGET="_top" +>http://search.cpan.org/dist/File-Spec/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/File/Temp.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/File/Temp.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-template" +></A +>4.1.3.10. Template Toolkit (2.08)</H3 +><P +>When you install Template Toolkit, you'll get asked various + questions about features to enable. The defaults are fine, except + that it is recommended you use the high speed XS Stash of the Template + Toolkit, in order to achieve best performance. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Template-Toolkit/" +TARGET="_top" +>http://search.cpan.org/dist/Template-Toolkit/</A +><br> + PPM Download Link: <A +HREF="http://openinteract.sourceforge.net/ppmpackages/5.6/Template-Toolkit.tar.gz" +TARGET="_top" +>http://openinteract.sourceforge.net/ppmpackages/5.6/Template-Toolkit.tar.gz</A +><br> + Documentation: <A +HREF="http://www.template-toolkit.org/docs.html" +TARGET="_top" +>http://www.template-toolkit.org/docs.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN577" +NAME="install-modules-text-wrap" ></A ->4.1.5.4. TimeDate modules</H3 +>4.1.3.11. Text::Wrap (2001.0131)</H3 ><P ->Many of the more common date/time/calendar related Perl modules - have been grouped into a bundle similar to the MySQL modules bundle. - This bundle is stored on the CPAN under the name TimeDate. - The component module we're most interested in is the Date::Format - module, but installing all of them is probably a good idea anyway. +>Text::Wrap is designed to proved intelligent text wrapping. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Text-Tabs+Wrap/" +TARGET="_top" +>http://search.cpan.org/dist/Text-Tabs+Wrap/</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/Text/Wrap.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/Text/Wrap.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN580" +NAME="install-modules-gd" ></A ->4.1.5.5. GD (optional)</H3 +>4.1.3.12. GD (1.20) [optional]</H3 ><P >The GD library was written by Thomas Boutell a long while ago to - programatically generate images in C. Since then it's become the + programmatically generate images in C. Since then it's become the defacto standard for programmatic image construction. The Perl bindings to it found in the GD library are used on millions of web pages to generate graphs on the fly. That's what Bugzilla will be using it for @@ -2967,36 +3497,261 @@ CLASS="classname" ></TR ></TABLE ></DIV +><DIV +CLASS="tip" +><P +></P +><TABLE +CLASS="tip" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/tip.gif" +HSPACE="5" +ALT="Tip"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>The version of the GD perl module you need is very closely tied + to the <TT +CLASS="classname" +>libgd</TT +> version installed on your system. + If you have a version 1.x of <TT +CLASS="classname" +>libgd</TT +> the 2.x + versions of the GD perl module won't work for you. + </P +></TD +></TR +></TABLE +></DIV +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GD/" +TARGET="_top" +>http://search.cpan.org/dist/GD/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GD.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GD.zip</A +><br> + Documentation: <A +HREF="http://stein.cshl.org/WWW/software/GD/" +TARGET="_top" +>http://stein.cshl.org/WWW/software/GD/</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN587" +NAME="install-modules-chart-base" ></A ->4.1.5.6. Chart::Base (optional)</H3 +>4.1.3.13. Chart::Base (0.99c) [optional]</H3 ><P >The Chart module provides Bugzilla with on-the-fly charting abilities. It can be installed in the usual fashion after it has been fetched from CPAN. Note that earlier versions that 0.99c used GIFs, which are no longer supported by the latest versions of GD.</P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Chart/" +TARGET="_top" +>http://search.cpan.org/dist/Chart/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Chart.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Chart.zip</A +><br> + </P ></DIV ><DIV CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN590" +NAME="install-modules-xml-parser" ></A ->4.1.5.7. Template Toolkit</H3 +>4.1.3.14. XML::Parser (any) [Optional]</H3 ><P ->When you install Template Toolkit, you'll get asked various - questions about features to enable. The defaults are fine, except - that it is recommended you use the high speed XS Stash of the Template - Toolkit, in order to achieve best performance. +>XML::Parser is used by the <TT +CLASS="filename" +>importxml.pl</TT +> + script. You only need it if you are going to be importing bugs (such as + for bug moving). XML::Parser requires that the + <TT +CLASS="classname" +>expat</TT +> library is already installed on your machine. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/XML-Parser/" +TARGET="_top" +>http://search.cpan.org/dist/XML-Parser/</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.6.1/lib/XML/Parser.html" +TARGET="_top" +>http://www.perldoc.com/perl5.6.1/lib/XML/Parser.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-gd-graph" +></A +>4.1.3.15. GD::Graph (any) [Optional]</H3 +><P +>In addition to GD listed above, the reporting interface of Bugzilla + needs to have the GD::Graph module installed. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GDGraph/" +TARGET="_top" +>http://search.cpan.org/dist/GDGraph/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDGraph.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDGraph.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/GDGraph/Graph.pm" +TARGET="_top" +>http://search.cpan.org/dist/GDGraph/Graph.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-gd-text-align" +></A +>4.1.3.16. GD::Text::Align (any) [Optional]</H3 +><P +>GD::Text::Align, as the name implies, is used to draw aligned + strings of text. It is needed by the reporting interface. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GDTextUtil/" +TARGET="_top" +>http://search.cpan.org/dist/GDTextUtil/</A +><br> + PPM Download Page: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDTextUtil.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDTextUtil.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/GDTextUtil/Text/Align.pm" +TARGET="_top" +>http://search.cpan.org/dist/GDTextUtil/Text/Align.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-mime-parser" +></A +>4.1.3.17. MIME::Parser (any) [Optional]</H3 +><P +>MIME::Parser is only needed if you want to use the e-mail interface + located in the <TT +CLASS="filename" +>contrib</TT +> directory. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/MIME-tools/" +TARGET="_top" +>http://search.cpan.org/dist/MIME-tools/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/MIME-tools.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/MIME-tools.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/MIME-tools/lib/MIME/Parser.pm" +TARGET="_top" +>http://search.cpan.org/dist/MIME-tools/lib/MIME/Parser.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><HR><H3 +CLASS="section" +><A +NAME="install-modules-patchreader" +></A +>4.1.3.18. PatchReader (0.9.1) [Optional]</H3 +><P +>PatchReader is only needed if you want to use Patch Viewer, a + Bugzilla feature to format patches in a pretty HTML fashion. There are a + number of optional parameters you can configure Patch Viewer with as well, + including cvsroot, cvsroot_get, lxr_root, bonsai_url, lxr_url, and + lxr_root. Patch Viewer also optionally will use cvs, diff and interdiff + utilities if they exist on the system (interdiff can be found in the + patchutils package at <A +HREF="http://cyberelk.net/tim/patchutils/" +TARGET="_top" +>http://cyberelk.net/tim/patchutils/</A +>. + These programs' locations can be configured in localconfig. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/author/JKEISER/PatchReader/" +TARGET="_top" +>http://search.cpan.org/author/JKEISER/PatchReader/</A +><br> + Documentation: <A +HREF="http://www.johnkeiser.com/mozilla/Patch_Viewer.html" +TARGET="_top" +>http://www.johnkeiser.com/mozilla/Patch_Viewer.html</A +><br> + </P ></DIV ></DIV ><DIV @@ -3004,9 +3759,9 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="sbs-http" +NAME="install-webserver" ></A ->4.1.6. HTTP Server</H2 +>4.1.4. HTTP Server</H2 ><P >You have freedom of choice here, pretty much any web server that is capable of running <A @@ -3046,7 +3801,12 @@ VALIGN="TOP" >We strongly recommend Apache as the web server to use. The Bugzilla Guide installation instructions, in general, assume you are using Apache. If you have got Bugzilla working using another webserver, - please share your experiences with us.</P + please share your experiences with us by filing a bug in <A +HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation" +TARGET="_top" +>Bugzilla Documentation</A +>. + </P ></TD ></TR ></TABLE @@ -3057,9 +3817,9 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN600" +NAME="install-bzfiles" ></A ->4.1.7. Bugzilla</H2 +>4.1.5. Bugzilla</H2 ><P >You should untar the Bugzilla files into a directory that you're willing to make writable by the default web server user (probably @@ -3122,103 +3882,120 @@ CLASS="filename" >checksetup.pl</TT > script, which locks down your installation.</P +><DIV +CLASS="caution" +><P +></P +><TABLE +CLASS="caution" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/caution.gif" +HSPACE="5" +ALT="Caution"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>The default Bugzilla distribution is not designed to be placed + in a <TT +CLASS="filename" +>cgi-bin</TT +> directory (this + includes any directory which is configured using the + <TT +CLASS="option" +>ScriptAlias</TT +> directive of Apache). This will probably + change as part of + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=44659" +TARGET="_top" +>bug + 44659</A +>. + </P +></TD +></TR +></TABLE +></DIV ></DIV ><DIV CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN611" +NAME="install-setupdatabase" ></A ->4.1.8. Setting Up the MySQL Database</H2 +>4.1.6. Setting Up the MySQL Database</H2 ><P >After you've gotten all the software installed and working you're ready to start preparing the database for its life as the back end to a high quality bug tracker.</P ><P ->First, you'll want to fix MySQL permissions to allow access from - Bugzilla. For the purpose of this Installation section, the Bugzilla - username will be +>This first thing you'll want to do is make sure you've given the <SPAN CLASS="QUOTE" ->"bugs"</SPAN ->, and will have minimal permissions. +>"root"</SPAN +> user a password as suggested in + <A +HREF="#security-mysql" +>Section 5.6.2</A +>. For clarity, these instructions will + assume that your MySQL user for Bugzilla will be <SPAN +CLASS="QUOTE" +>"bugs_user"</SPAN +>, + the database will be called <SPAN +CLASS="QUOTE" +>"bugs_db"</SPAN +> and the password for + the <SPAN +CLASS="QUOTE" +>"bugs_user"</SPAN +> user is <SPAN +CLASS="QUOTE" +>"bugs_password"</SPAN +>. You + should, of course, substitute the values you intend to use for your site. </P +><DIV +CLASS="note" ><P ->Begin by giving the MySQL root user a password. MySQL passwords are limited - to 16 characters. - <P ></P ><TABLE +CLASS="note" +WIDTH="100%" BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->mysql -u root mysql</B -> - </TT -> - </TD -></TR -><TR -><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->mysql></TT -> - - <B -CLASS="command" ->UPDATE user SET Password=PASSWORD('<new_password'>) - WHERE user='root';</B -> - </TT -> - </TD -></TR ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->mysql></TT -> - - <B -CLASS="command" ->FLUSH PRIVILEGES;</B -> - </TT -> - </TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Most people use <SPAN +CLASS="QUOTE" +>"bugs"</SPAN +> for both the user and + database name. + </P +></TD ></TR -></TBODY ></TABLE -><P -></P -> - - From this point on, if you need to access MySQL as the MySQL root user, - you will need to use - <B -CLASS="command" ->mysql -u root -p</B -> - - and enter <new_password>. Remember that MySQL user names have - nothing to do with Unix user names (login names).</P +></DIV ><P >Next, we use an SQL <B CLASS="command" @@ -3226,19 +4003,18 @@ CLASS="command" > command to create a <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > - user, and grant sufficient permissions for checksetup.pl, which we'll use later, to work its magic. This also restricts the <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > user to operations within a database called <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_db"</SPAN >, and only allows the account to connect from <SPAN CLASS="QUOTE" @@ -3246,55 +4022,31 @@ CLASS="QUOTE" >. Modify it to reflect your setup if you will be connecting from another machine or as a different user.</P -><P ->Remember to set <bugs_password> to some unique password. - <P -></P ><TABLE BORDER="0" -><TBODY +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT CLASS="prompt" >mysql></TT -> - - <B -CLASS="command" ->GRANT SELECT,INSERT,UPDATE,DELETE,INDEX, - ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost - IDENTIFIED BY '<bugs_password>';</B -> - </TT -> - </TD -></TR -><TR -><TD -> <TT -CLASS="computeroutput" -> <TT +> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE, + DROP,REFERENCES ON bugs_db.* TO bugs_user@localhost + IDENTIFIED BY 'bugs_password'; +<TT CLASS="prompt" >mysql></TT -> - - <B -CLASS="command" ->FLUSH PRIVILEGES;</B -> - </TT -> - </TD +> FLUSH PRIVILEGES; + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE -><P -></P -> - </P ><DIV CLASS="note" ><P @@ -3317,7 +4069,14 @@ ALIGN="LEFT" VALIGN="TOP" ><P >If you are using MySQL 4, the bugs user also needs to be granted - the LOCK TABLES and CREATE TEMPORARY TABLES permissions. + the <TT +CLASS="computeroutput" +>LOCK TABLES</TT +> and + <TT +CLASS="computeroutput" +>CREATE TEMPORARY TABLES</TT +> permissions. </P ></TD ></TR @@ -3329,9 +4088,9 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN649" +NAME="AEN795" ></A ->4.1.9. <TT +>4.1.7. <TT CLASS="filename" >checksetup.pl</TT ></H2 @@ -3340,10 +4099,11 @@ CLASS="filename" <A HREF="mailto:holgerschurig@nikocity.de" TARGET="_top" ->Holger Schurig </A +>Holger Schurig</A > for writing this script!) - This script is designed to make sure your MySQL database and other + This script is designed to make sure your perl modules are the correct + version and your MySQL database and other configuration options are consistent with the Bugzilla CGI files. It will make sure Bugzilla files and directories have reasonable permissions, set up the @@ -3352,35 +4112,28 @@ CLASS="filename" >data</TT > directory, and create all the MySQL tables. - <P -></P + </P ><TABLE BORDER="0" -><TBODY +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT CLASS="prompt" >bash#</TT -> - - <B -CLASS="command" ->./checksetup.pl</B -> - </TT -> - </TD +> ./checksetup.pl + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE ><P -></P -> - - The first time you run it, it will create a file called +> The first time you run it, it will create a file called <TT CLASS="filename" >localconfig</TT @@ -3408,7 +4161,7 @@ CLASS="QUOTE" >database name: <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_db"</SPAN > if you're following these directions</P ></LI @@ -3417,7 +4170,7 @@ CLASS="QUOTE" >MySQL username: <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > if you're following these directions</P ></LI @@ -3426,9 +4179,12 @@ CLASS="QUOTE" >Password for the <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > - MySQL account; (<bugs_password>) above</P + MySQL account; (<SPAN +CLASS="QUOTE" +>"bugs_password"</SPAN +> above)</P ></LI ></OL > @@ -3482,9 +4238,9 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN681" +NAME="AEN826" ></A ->4.1.10. Configuring Bugzilla</H2 +>4.1.8. Configuring Bugzilla</H2 ><P > You should run through the parameters on the Edit Parameters page (link in the footer) and set them all to appropriate values. @@ -3508,7 +4264,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN687" +NAME="AEN832" ></A >4.2.1. Dependency Charts</H2 ><P @@ -3572,7 +4328,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN702" +NAME="AEN847" ></A >4.2.2. Bug Graphs</H2 ><P @@ -3631,7 +4387,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN715" +NAME="AEN860" ></A >4.2.3. The Whining Cron</H2 ><P @@ -3723,13 +4479,12 @@ CLASS="section" NAME="bzldap" ></A >4.2.4. LDAP Authentication</H2 -><P -> <DIV -CLASS="warning" +><DIV +CLASS="note" ><P ></P ><TABLE -CLASS="warning" +CLASS="note" WIDTH="100%" BORDER="0" ><TR @@ -3738,23 +4493,32 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" ><IMG -SRC="../images/warning.gif" +SRC="../images/note.gif" HSPACE="5" -ALT="Warning"></TD +ALT="Note"></TD ><TD ALIGN="LEFT" VALIGN="TOP" ><P ->This information on using the LDAP - authentication options with Bugzilla is old, and the authors do - not know of anyone who has tested it. Approach with caution. +>LDAP authentication has been rewritten for the 2.18 release of + Bugzilla. It no longer requires the Mozilla::LDAP module and now uses + Net::LDAP instead. This rewrite was part of a larger landing that + allowed for additional authentication schemes to be easily added + (<A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=180642" +TARGET="_top" +>bug + 180642</A +>). + </P +><P +>This patch originally landed in 21-Mar-2003 and was included + in the 2.17.4 development release. </P ></TD ></TR ></TABLE ></DIV -> - </P ><P > The existing authentication scheme for Bugzilla uses email addresses as the primary user ID, and a @@ -3773,92 +4537,189 @@ VALIGN="TOP" email address, not LDAP username. You still assign bugs by email address, query on users by email address, etc. </P +><DIV +CLASS="caution" ><P ->Using LDAP for Bugzilla authentication requires the - Mozilla::LDAP (aka PerLDAP) Perl module. The - Mozilla::LDAP module in turn requires Netscape's Directory SDK for C. - After you have installed the SDK, then install the PerLDAP module. - Mozilla::LDAP and the Directory SDK for C are both - <A -HREF="http://www.mozilla.org/directory/" +></P +><TABLE +CLASS="caution" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/caution.gif" +HSPACE="5" +ALT="Caution"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Because the Bugzilla account is not created until the first time + a user logs in, a user who has not yet logged is unknown to Bugzilla. + This means they cannot be used as an assignee or QA contact (default or + otherwise), added to any cc list, or any other such operation. One + possible workaround is the <TT +CLASS="filename" +>bugzilla_ldapsync.rb</TT +> + script in the + <A +HREF="#gloss-contrib" +><I +CLASS="glossterm" +><TT +CLASS="filename" +>contrib</TT +></I +></A +> directory. Another possible solution is fixing + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=201069" TARGET="_top" ->available for - download</A -> from mozilla.org. - </P +>bug + 201069</A +>. + </P +></TD +></TR +></TABLE +></DIV ><P -> Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP - directory for - authentication. Be very careful when setting up this parameter; if you - set LDAP authentication, but do not have a valid LDAP directory set up, - you will not be able to log back in to Bugzilla once you log out. (If - this happens, you can get back in by manually editing the data/params - file, and setting useLDAP back to 0.) - </P +>Parameters required to use LDAP Authentication:</P ><P ->If using LDAP, you must set the - three additional parameters: Set LDAPserver to the name (and optionally - port) of your LDAP server. If no port is specified, it defaults to the - default port of 389. (e.g "ldap.mycompany.com" or - "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching - for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids - must be unique under the DN specified here. Set LDAPmailattribute to - the name of the attribute in your LDAP directory which contains the - primary email address. On most directory servers available, this is - "mail", but you may need to change this. - </P +></P +><DIV +CLASS="variablelist" +><DL +><DT +><A +NAME="param-loginmethod" +></A +>loginmethod</DT +><DD ><P ->You can also try using <A -HREF="http://www.openldap.org/" -TARGET="_top" -> OpenLDAP</A -> with Bugzilla, using any of a number of administration - tools. You should apply the patch attached this bug: - <A -HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=158630" -TARGET="_top" -> http://bugzilla.mozilla.org/show_bug.cgi?id=158630</A ->, then set - the following object classes for your users: - - <P +>This parameter should be set to <SPAN +CLASS="QUOTE" +>"LDAP"</SPAN +> + <EM +>only</EM +> if you will be using an LDAP directory + for authentication. If you set this param to <SPAN +CLASS="QUOTE" +>"LDAP"</SPAN +> but + fail to set up the other parameters listed below you will not be + able to log back in to Bugzilla one you log out. If this happens + to you, you will need to manually edit + <TT +CLASS="filename" +>data/params</TT +> and set loginmethod to + <SPAN +CLASS="QUOTE" +>"DB"</SPAN +>. + </P +></DD +><DT +><A +NAME="param-LDAPserver" +></A +>LDAPserver</DT +><DD +><P +>This parameter should be set to the name (and optionally the + port) of your LDAP server. If no port is specified, it assumes + the default LDAP port of 389. + </P +><P +>Ex. <SPAN +CLASS="QUOTE" +>"ldap.company.com"</SPAN +> + or <SPAN +CLASS="QUOTE" +>"ldap.company.com:3268"</SPAN +> + </P +></DD +><DT +><A +NAME="param-LDAPbinddn" +></A +>LDAPbinddn [Optional]</DT +><DD +><P +>Some LDAP servers will not allow an anonymous bind to search + the directory. If this is the case with your configuration you + should set the LDAPbinddn parameter to the user account Bugzilla + should use instead of the anonymous bind. + </P +><P +>Ex. <SPAN +CLASS="QUOTE" +>"cn=default,cn=user:password"</SPAN ></P -><OL -TYPE="1" -><LI +></DD +><DT +><A +NAME="param-LDAPBaseDN" +></A +>LDAPBaseDN</DT +><DD ><P ->objectClass: person</P -></LI -><LI +>The LDAPBaseDN parameter should be set to the location in + your LDAP tree that you would like to search for e-mail addresses. + Your uids should be unique under the DN specified here. + </P ><P ->objectClass: organizationalPerson</P -></LI -><LI +>Ex. <SPAN +CLASS="QUOTE" +>"ou=People,o=Company"</SPAN +></P +></DD +><DT +><A +NAME="param-LDAPuidattribute" +></A +>LDAPuidattribute</DT +><DD ><P ->objectClass: inetOrgPerson</P -></LI -><LI +>The LDAPuidattribute parameter should be set to the attribute + which contains the unique UID of your users. The value retrieved + from this attribute will be used when attempting to bind as the + user to confirm their password. + </P ><P ->objectClass: top</P -></LI -><LI +>Ex. <SPAN +CLASS="QUOTE" +>"uid"</SPAN +></P +></DD +><DT +><A +NAME="param-LDAPmailattribute" +></A +>LDAPmailattribute</DT +><DD ><P ->objectClass: posixAccount</P -></LI -><LI +>The LDAPmailattribute parameter should be the name of the + attribute which contains the e-mail address your users will enter + into the Bugzilla login boxes. + </P ><P ->objectClass: shadowAccount</P -></LI -></OL -> - - Please note that this patch <EM ->has not</EM -> yet been - accepted by the Bugzilla team, and so you may need to do some - manual tweaking. That said, it looks like Net::LDAP is probably - the way to go in the future. - </P +>Ex. <SPAN +CLASS="QUOTE" +>"mail"</SPAN +></P +></DD +></DL +></DIV ></DIV ><DIV CLASS="section" @@ -3875,17 +4736,23 @@ NAME="content-type" incorporate the code changes necessary to fulfill the CERT advisory requirements mentioned in <A -HREF="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3" +HREF="http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3" TARGET="_top" -> http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A +>http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3</A >. - Executing the following code snippet from a UNIX command shell will - rectify the problem if your Bugzilla installation is intended for an - English-speaking audience. As always, be sure your Bugzilla - installation has a good backup before making changes, and I recommend - you understand what the script is doing before executing it.</P + Making the change below will fix the problem if your installation is for + an English speaking audience. + </P ><P -> <TABLE +>Telling Bugzilla to output a charset as part of the HTTP header is + much easier in version 2.18 and higher (including any cvs + pull after 4-May-2003 and development release after 2.17.5) than it was + in previous versions. Simply locate the following line in + <TT +CLASS="filename" +>Bugzilla/CGI.pm</TT +>: + <TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" @@ -3895,38 +4762,34 @@ WIDTH="100%" COLOR="#000000" ><PRE CLASS="programlisting" -> bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl - </PRE +> # Make sure that we don't send any charset headers + $self->charset(''); + </PRE ></FONT ></TD ></TR ></TABLE > - </P -><P ->All this one-liner command does is search for all instances of - <SPAN -CLASS="QUOTE" ->"Content-type: text/html"</SPAN -> - - and replaces it with - <SPAN -CLASS="QUOTE" ->"Content-Type: text/html; charset=ISO-8859-1"</SPAN + and change it to: + <TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> # Send all data using the ISO-8859-1 charset + $self->charset('ISO-8859-1'); + </PRE +></FONT +></TD +></TR +></TABLE > - - . This specification prevents possible Javascript attacks on the - browser, and is suggested for all English-speaking sites. For - non-English-speaking Bugzilla sites, I suggest changing - <SPAN -CLASS="QUOTE" ->"ISO-8859-1"</SPAN ->, above, to - <SPAN -CLASS="QUOTE" ->"UTF-8"</SPAN ->.</P + </P ><DIV CLASS="note" ><P @@ -3950,13 +4813,13 @@ VALIGN="TOP" ><P >Using <meta> tags to set the charset is not recommended, as there's a bug in Netscape 4.x which causes pages - marked up in this way to load twice. See + marked up in this way to load twice. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=126266" TARGET="_top" ->bug - 126266</A -> for more information including progress toward making +>bug 126266</A +> + for more information including progress toward making bugzilla charset aware by default. </P ></TD @@ -4034,10 +4897,10 @@ CLASS="filename" which can limit connections by ip-address. You may download this module at <A -HREF="http://www.snert.com/Software/Throttle/" +HREF="http://www.snert.com/Software/mod_throttle/" TARGET="_top" -> http://www.snert.com/Software/Throttle/</A ->. +>http://www.snert.com/Software/mod_throttle/</A +>. Follow the instructions to install into your Apache install. <EM >This module only functions with the Apache web @@ -4051,7 +4914,7 @@ CLASS="command" command provided by this module to accomplish this goal. See the <A -HREF="http://www.snert.com/Software/Throttle/" +HREF="http://www.snert.com/Software/mod_throttle/" TARGET="_top" >Module Instructions</A @@ -4134,19 +4997,23 @@ CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="win32-perl-modules" +NAME="win32-perlmodules" ></A >4.3.1.2. Perl Modules on Win32</H3 ><P >Bugzilla on Windows requires the same perl modules found in <A -HREF="#install-package-list" ->Section 4.1.2</A +HREF="#install-perlmodules" +>Section 4.1.3</A >. The main difference is that - windows uses <B -CLASS="command" ->ppm</B -> instead of CPAN. + windows uses <A +HREF="#gloss-ppm" +><I +CLASS="glossterm" +>PPM</I +></A +> instead of + CPAN. </P ><TABLE BORDER="0" @@ -4344,6 +5211,86 @@ CLASS="programlisting" ></TR ></TABLE ></DIV +><DIV +CLASS="section" +><HR><H4 +CLASS="section" +><A +NAME="win32-code-bugmail" +></A +>4.3.1.3.2. Changes to <TT +CLASS="filename" +>BugMail.pm</TT +></H4 +><P +>To make bug e-mail work on Win32 (until + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=84876" +TARGET="_top" +>bug + 84876</A +> lands), the + simplest way is to have Net::SMTP installed and change this (in + <TT +CLASS="filename" +>Bugzilla/BugMail.pm</TT +>):</P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i") || + die "Can't open sendmail"; + +print SENDMAIL trim($msg) . "\n"; +close SENDMAIL; + </PRE +></FONT +></TD +></TR +></TABLE +><P +>to</P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> use Net::SMTP; +my $smtp_server = 'smtp.mycompany.com'; # change this + +# Use die on error, so that the mail will be in the 'unsent mails' and +# can be sent from the sanity check page. +my $smtp = Net::SMTP->new($smtp_server) || + die 'Cannot connect to server \'$smtp_server\''; + +$smtp->mail('bugzilla-daemon@mycompany.com'); # change this +$smtp->to($person); +$smtp->data(); +$smtp->datasend($msg); +$smtp->dataend(); +$smtp->quit; + </PRE +></FONT +></TD +></TR +></TABLE +><P +>Don't forget to change the name of your SMTP server and the + domain of the sending e-mail address (after the '@') in the above + lines of code.</P +></DIV ></DIV ><DIV CLASS="section" @@ -4433,110 +5380,172 @@ TARGET="_top" >.</P ><P >Follow the instructions for setting up Fink. Once it's installed, - you'll want to run the following as root: - <B -CLASS="command" ->fink install gd</B -> + you'll want to use it to install the gd2 package. </P ><P >It will prompt you for a number of dependencies, type 'y' and hit - enter to install all of the dependencies. Then watch it work.</P -><P ->To prevent creating conflicts with the software that Apple installs - by default, Fink creates its own directory tree at /sw where it installs - most of the software that it installs. This means your libraries and - headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib - and /usr/local/include. Because of these changed locations for the - libraries, the Perl GD module will not install directly via CPAN, because it - looks for the specific paths instead of getting them from your - environment. But there's a way around that :-)</P -><P ->Instead of typing - <SPAN -CLASS="QUOTE" ->"install GD"</SPAN -> - at the - <TT -CLASS="prompt" ->cpan></TT -> - prompt, type - <B -CLASS="command" ->look GD</B ->. - This should go through the motions of downloading the latest version of - the GD module, then it will open a shell and drop you into the build - directory. Apply <A -HREF="../xml/gd-makefile.patch" -TARGET="_top" ->this patch</A -> - to the Makefile.PL file (save the - patch into a file and use the command - <B -CLASS="command" ->patch < patchfile</B ->.) + enter to install all of the dependencies and then watch it work. You will + then be able to use <A +HREF="#gloss-cpan" +><I +CLASS="glossterm" +>CPAN</I +></A +> to + install the GD perl module. </P +><DIV +CLASS="note" ><P ->Then, run these commands to finish the installation of the GD - module: - <P ></P ><TABLE +CLASS="note" +WIDTH="100%" BORDER="0" -><TBODY ><TR ><TD -> <B -CLASS="command" ->perl Makefile.PL</B -> - </TD -></TR -><TR +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD ><TD -> <B -CLASS="command" ->make</B -> - </TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>To prevent creating conflicts with the software that Apple + installs by default, Fink creates its own directory tree at + <TT +CLASS="filename" +>/sw</TT +> where it installs most of + the software that it installs. This means your libraries and headers be + at <TT +CLASS="filename" +>/sw/lib</TT +> and + <TT +CLASS="filename" +>/sw/include</TT +> instead of + <TT +CLASS="filename" +>/usr/lib</TT +> and + <TT +CLASS="filename" +>/usr/local/include</TT +>. When the + Perl module config script asks where your libgd is, be sure to tell it + <TT +CLASS="filename" +>/sw/lib</TT +>. + </P +></TD ></TR +></TABLE +></DIV +><P +>Also available via Fink is expat. Once running using fink to + install the expat package you will be able to install + XML::Parser using CPAN. There is one caveat. Unlike recent versions of + the GD module, XML::Parser doesn't prompt for the location of the + required libraries. When using CPAN, you will need to use the following + command sequence: + </P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <B -CLASS="command" ->make test</B +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> # perl -MCPAN -e'look XML::Parser' <A +NAME="macosx-look" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A > - </TD -></TR -><TR -><TD -> <B -CLASS="command" ->make install</B +# perl Makefile.PL EXPATLIBPATH=/sw/lib EXPATINCPATH=/sw/include +# make; make test; make install <A +NAME="macosx-make" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A > - </TD -></TR -><TR -><TD ->And don't forget to run - <B -CLASS="command" ->exit</B +# exit <A +NAME="macosx-exit" +><IMG +SRC="../images/callouts/3.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(3)"></A > - - to get back to CPAN.</TD + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE -><P -></P -> - </P +><DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="#macosx-look" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +><A +HREF="#macosx-exit" +><IMG +SRC="../images/callouts/3.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(3)"></A +></DT +><DD +>The look command will download the module and spawn a + new shell with the extracted files as the current working directory. + The exit command will return you to your original shell. + </DD +><DT +><A +HREF="#macosx-make" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A +></DT +><DD +>You should watch the output from these make commands, + especially <SPAN +CLASS="QUOTE" +>"make test"</SPAN +> as errors may prevent XML::Parser + from functioning correctly with Bugzilla. + </DD +></DL +></DIV ></DIV ><DIV CLASS="section" @@ -4597,7 +5606,7 @@ CLASS="prompt" > <B CLASS="command" >urpmi perl-MailTools</B -> <A +> <A NAME="test-mailtools" ><IMG SRC="../images/callouts/1.gif" @@ -4690,7 +5699,7 @@ CLASS="command" >./checksetup.pl</B > (shown in <A HREF="#http-apache-htaccess" ->Example 4-1</A +>Example 4-2</A > for the curious) are allowed to override Apache's normal access permissions or else important password information may be exposed to the @@ -4811,7 +5820,7 @@ NAME="http-apache-htaccess" ></A ><P ><B ->Example 4-1. <TT +>Example 4-2. <TT CLASS="filename" >.htaccess</TT > files for Apache</B @@ -4990,7 +5999,7 @@ CLASS="productname" <A HREF="http://support.microsoft.com/support/kb/articles/Q245/2/25.asp" TARGET="_top" ->Q245225 </A +>Q245225</A > for <SPAN CLASS="productname" @@ -5122,12 +6131,11 @@ VALIGN="TOP" <TT CLASS="filename" >localconfig</TT ->. For more information, see +>. For more information, see <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=186383" TARGET="_top" ->bug - 186383</A +> bug 186383</A > or <A HREF="http://online.securityfocus.com/bid/6501" TARGET="_top" @@ -5219,7 +6227,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN977" +NAME="AEN1157" ></A >4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1</H2 ><P @@ -5244,7 +6252,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN982" +NAME="AEN1162" ></A >4.5.2. DBD::Sponge::db prepare failed</H2 ><P @@ -5400,7 +6408,7 @@ CLASS="productname" 5.6.0. Many minor variations of this error have been reported. Examples can be found in <A HREF="#trouble-filetemp-errors" ->Figure 4-1</A +>Figure 4-2</A >. </P ><DIV @@ -5410,7 +6418,7 @@ NAME="trouble-filetemp-errors" ></A ><P ><B ->Figure 4-1. Other File::Temp error messages</B +>Figure 4-2. Other File::Temp error messages</B ></P ><TABLE BORDER="0" @@ -5441,7 +6449,7 @@ at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 233. or higher solved the problem for them. A less involved fix is to apply the patch in <A HREF="#trouble-filetemp-patch" ->Figure 4-2</A +>Figure 4-3</A >. The patch is also available as a <A HREF="../xml/filetemp.patch" @@ -5456,7 +6464,7 @@ NAME="trouble-filetemp-patch" ></A ><P ><B ->Figure 4-2. Patch for File::Temp in Perl 5.6.0</B +>Figure 4-3. Patch for File::Temp in Perl 5.6.0</B ></P ><TABLE BORDER="0" @@ -6442,7 +7450,7 @@ TYPE="1" ><P ><EM >Maximum Votes a person can put on a single - bug"</EM + bug</EM >: It should probably be some number lower than the "Maximum votes per person". Don't set this field to "0" if @@ -6986,12 +7994,11 @@ NAME="security-access" not be accessible is rather complicated. A new installation method is currently in the works which should solve this by allowing files that shouldn't be accessible from the web to be placed in directory - outside the webroot. See + outside the webroot. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=44659" TARGET="_top" ->bug - 44659</A +> bug 44659</A > for more information. </P ><P @@ -7322,16 +8329,20 @@ TARGET="_top" </P ><P > Templatization also makes localized versions of Bugzilla possible, - for the first time. In the future, a Bugzilla installation may - have templates installed for multiple localizations, and select - which ones to use based on the user's browser language setting. + for the first time. As of version 2.17.4 which will soon + become 2.18, it's possible to have Bugzilla's language determined by + the user's browser. More information is available in + <A +HREF="#template-http-accept" +>Section 5.7.5</A +>. </P ><DIV CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN1425" +NAME="AEN1606" ></A >5.7.1. What to Edit</H2 ><P @@ -7429,12 +8440,47 @@ ALT="Note"></TD ALIGN="LEFT" VALIGN="TOP" ><P -> Don't directly edit the compiled templates in - <TT +> Don't directly edit the compiled templates in + <TT +CLASS="filename" +>data/template/*</TT +> - your + changes will be lost when Template Toolkit recompiles them. + </P +></TD +></TR +></TABLE +></DIV +><DIV +CLASS="note" +><P +></P +><TABLE +CLASS="note" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>It is recommended that you run <B +CLASS="command" +>./checksetup.pl</B +> + after any template edits, especially if you've created a new file in + the <TT CLASS="filename" ->data/template/*</TT -> - your - changes will be lost when Template Toolkit recompiles them. +>custom</TT +> directory. </P ></TD ></TR @@ -7446,7 +8492,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN1444" +NAME="AEN1629" ></A >5.7.2. How To Edit Templates</H2 ><P @@ -7528,7 +8574,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN1454" +NAME="AEN1639" ></A >5.7.3. Template Formats</H2 ><P @@ -7590,7 +8636,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN1467" +NAME="AEN1652" ></A >5.7.4. Particular Templates</H2 ><P @@ -7774,6 +8820,48 @@ CLASS="programlisting" would appear in the initial checkin comment. </P ></DIV +><DIV +CLASS="section" +><HR><H2 +CLASS="section" +><A +NAME="template-http-accept" +></A +>5.7.5. Configuring Bugzilla to Detect the User's Language</H2 +><P +>Begining in version 2.18 (first introduced in version + 2.17.4), it's now possible to have the users web browser tell Bugzilla + which language templates to use for each visitor (using the HTTP_ACCEPT + header). For this to work, Bugzilla needs to have the correct language + templates installed for the version of Bugzilla you are using. Many + language templates can be obtained from <A +HREF="http://www.bugzilla.org/download.html#localizations" +TARGET="_top" +>http://www.bugzilla.org/download.html#localizations</A +>. Instructions + for submitting new languages are also available from that location. + </P +><P +>After untarring the localizations (or creating your own) in the + <TT +CLASS="filename" +>[Bugzilla_Root]/template</TT +> directory, + you must update the <TT +CLASS="option" +>languages</TT +> parameter to contain any + localizations you'd like to permit. You may also wish to set the + <TT +CLASS="option" +>defaultlanguage</TT +> parameter to something other than + <SPAN +CLASS="QUOTE" +>"en"</SPAN +> if you don't want Engish to be the default language. + </P +></DIV ></DIV ><DIV CLASS="section" @@ -7890,7 +8978,7 @@ COLOR="#000000" ><PRE CLASS="programlisting" > if ($field eq "qacontact") { - if (UserInGroup("quality_assurance")) { + if (Bugzilla->user->groups("quality_assurance")) { return 1; } else { @@ -7915,7 +9003,7 @@ COLOR="#000000" ><PRE CLASS="programlisting" > if (($field eq "priority") && - ($vars->{'user'}{'login'} =~ /.*\@example\.com$/)) + (Bugzilla->user->email =~ /.*\@example\.com$/)) { if ($oldvalue eq "P1") { return 1; @@ -7954,6 +9042,36 @@ CLASS="section" NAME="upgrading" ></A >5.9. Upgrading to New Releases</H1 +><DIV +CLASS="warning" +><P +></P +><TABLE +CLASS="warning" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/warning.gif" +HSPACE="5" +ALT="Warning"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Upgrading is a one-way process. You should backup your database + and current Bugzilla directory before attempting the upgrade. If you wish + to revert to the old Bugzilla version for any reason, you will have to + restore from these backups. + </P +></TD +></TR +></TABLE +></DIV ><P >Upgrading Bugzilla is something we all want to do from time to time, be it to get new features or pick up the latest security fix. How easy @@ -8509,11 +9627,10 @@ CLASS="filename" ><P >There is also a CVSZilla project, based upon somewhat dated Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to - email. Check it out at: - <A + email. Check it out at: <A HREF="http://homepages.kcbbs.gen.nz/~tonyg/" TARGET="_top" -> http://homepages.kcbbs.gen.nz/~tonyg/</A +>http://homepages.kcbbs.gen.nz/~tonyg/</A >. </P ></DIV @@ -8531,7 +9648,7 @@ NAME="scm" <A HREF="http://www.ravenbrook.com/project/p4dti/" TARGET="_top" -> http://www.ravenbrook.com/project/p4dti</A +>http://www.ravenbrook.com/project/p4dti/</A > . @@ -8545,7 +9662,7 @@ CLASS="QUOTE" <A HREF="http://public.perforce.com/public/perforce/p4dti/index.html" TARGET="_top" -> http://public.perforce.com/public/perforce/p4dti/index.html</A +>http://public.perforce.com/public/perforce/p4dti/index.html</A > .</P @@ -9002,7 +10119,7 @@ HREF="#faq-use-changeaddress" ><DT >A.7.2. <A HREF="#faq-use-query" -> The query page is very confusing. Isn't there a simpler way to query? +> The query page is very confusing. Isn't there a simpler way to query? </A ></DT ><DT @@ -9016,7 +10133,7 @@ HREF="#faq-use-accept" >A.7.4. <A HREF="#faq-use-attachment" > I can't upload anything into the database via the "Create Attachment" - link. What am I doing wrong? + link. What am I doing wrong? </A ></DT ><DT @@ -9025,6 +10142,12 @@ HREF="#faq-use-keyword" > How do I change a keyword in Bugzilla, once some bugs are using it? </A ></DT +><DT +>A.7.6. <A +HREF="#faq-use-close" +> Why can't I close bugs from the "Change Several Bugs at Once" page? + </A +></DT ></DL ></DD ><DT @@ -9092,8 +10215,8 @@ CLASS="answer" information at <A HREF="http://www.bugzilla.org/" TARGET="_top" -> http://www.bugzilla.org/</A -> +>http://www.bugzilla.org/</A +>. </P ></DIV ></DIV @@ -9121,8 +10244,8 @@ CLASS="answer" See details at <A HREF="http://www.mozilla.org/MPL/" TARGET="_top" -> http://www.mozilla.org/MPL/</A -> +>http://www.mozilla.org/MPL/</A +>. </P ></DIV ></DIV @@ -9158,7 +10281,7 @@ TARGET="_top" > <A HREF="http://www.collab.net/" TARGET="_top" ->www.collab.net</A +>http://www.collab.net/</A > offers Bugzilla as part of their standard offering to large projects. They do have some minimum fees that are pretty hefty, and generally @@ -9196,85 +10319,26 @@ CLASS="answer" There are <EM >dozens</EM > of major companies with public - Bugzilla sites to track bugs in their products. A few include: - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD ->Netscape/AOL</TD -></TR -><TR -><TD ->Mozilla.org</TD -></TR -><TR -><TD ->NASA</TD -></TR -><TR -><TD ->Red Hat Software</TD -></TR -><TR -><TD ->SuSe Corp</TD -></TR -><TR -><TD ->The Horde Project</TD -></TR -><TR -><TD ->AbiSource</TD -></TR -><TR -><TD ->Real Time Enterprises, Inc</TD -></TR -><TR -><TD ->Eggheads.org</TD -></TR -><TR -><TD ->Strata Software</TD -></TR -><TR -><TD ->RockLinux</TD -></TR -><TR -><TD ->Creative Labs (makers of SoundBlaster)</TD -></TR -><TR -><TD ->The Apache Foundation</TD -></TR -><TR -><TD ->The Gnome Foundation</TD -></TR -><TR -><TD ->Ximian</TD -></TR -><TR -><TD ->Linux-Mandrake</TD -></TR -></TBODY -></TABLE -><P -></P -> - </P -><P -> Suffice to say, there are more than enough huge projects using Bugzilla - that we can safely say it's extremely popular. + Bugzilla sites to track bugs in their products. We have a fairly + complete list available on our website at + <A +HREF="http://bugzilla.org/installation_list.html" +TARGET="_top" +>http://bugzilla.org/installation_list.html</A +>. If you + have an installation of Bugzilla and would like to be added to the + list, whether it's a public install or not, simply e-mail + Gerv <TT +CLASS="email" +><<A +HREF="mailto:gerv@mozilla.org" +>gerv@mozilla.org</A +>></TT +>. Keep in mind that it's kinda + difficult to get onto the <SPAN +CLASS="QUOTE" +>"high-profile"</SPAN +> list ;). </P ></DIV ></DIV @@ -9304,7 +10368,7 @@ HREF="http://www.bugzilla.org/who_we_are.html" TARGET="_top" >core team</A >, - led by Dave Miller (justdave@netscape.com). + led by Dave Miller (justdave@bugzilla.org). </P ></DIV ></DIV @@ -9368,8 +10432,8 @@ CLASS="answer" > </B > It may be that the support has not been built yet, or that you - have not yet found it. Bugzilla is making tremendous strides in - usability, customizability, scalability, and user interface. It + have not yet found it. Bugzilla is making tremendous strides in + usability, customizability, scalability, and user interface. It is widely considered the most complete and popular open-source bug-tracking software in existence. </P @@ -9412,16 +10476,16 @@ CLASS="answer" </P ><P > There is currently work in progress to make Bugzilla work on - PostgreSQL and Sybase in the default distribution. You can track - the progress of these initiatives in bugs <A + PostgreSQL and Sybase in the default distribution. You can track + the progress of these initiatives in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=98304" TARGET="_top" ->98304</A +>bug 98304</A > and <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=173130" TARGET="_top" ->173130</A +>bug 173130</A > respectively. </P @@ -9461,11 +10525,11 @@ CLASS="filename" > because when Terry first started writing the code for mozilla.org he needed a version of Perl and other tools that were completely under his - control. This location was abandoned for the 2.18 release in favor + control. This location was abandoned for the 2.18 release in favor of the more sensible <TT CLASS="filename" >/usr/bin/perl</TT ->. If you +>. If you installed an older verion of Bugzilla and created the symlink we suggested, you can remove it now (provided that you don't have anything else, such as Bonsai, using it and you don't intend to @@ -9498,7 +10562,7 @@ CLASS="answer" > </B > Yes, the following bit of perl magic will change all the shebang - lines. Be sure to change <TT + lines. Be sure to change <TT CLASS="filename" >/usr/local/bin/perl</TT > @@ -9605,7 +10669,7 @@ CLASS="answer" ><B > </B > - It is web and e-mail based. You can edit bugs by sending specially + It is web and e-mail based. You can edit bugs by sending specially formatted email to a properly configured Bugzilla, or control via the web. </P ></DIV @@ -9708,7 +10772,7 @@ CLASS="answer" > </B > Yes - any sort of attachment is allowed, although administrators can - configure a maximum size. + configure a maximum size. Bugzilla gives the user the option of either using the MIME-type supplied by the browser, choosing from a pre-defined list or manually typing any arbitrary MIME-type. @@ -9737,17 +10801,17 @@ CLASS="answer" ><B > </B > - Yes. However, modifying some fields, notably those related to bug + Yes. However, modifying some fields, notably those related to bug progression states, also require adjusting the program logic to compensate for the change. </P ><P > There is no GUI for adding fields to Bugzilla at this - time. You can follow development of this feature at + time. You can follow development of this feature in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=91037" TARGET="_top" ->http://bugzilla.mozilla.org/show_bug.cgi?id=91037</A +>bug 91037</A > </P ></DIV @@ -9773,12 +10837,12 @@ CLASS="answer" ><B > </B > - Yes. Look at <A + Yes. Look at <A HREF="http://bugzilla.mozilla.org/report.cgi" TARGET="_top" -> http://bugzilla.mozilla.org/report.cgi</A -> for samples of what - Bugzilla can do in reporting and graphing. +>http://bugzilla.mozilla.org/report.cgi</A +> + for samples of what Bugzilla can do in reporting and graphing. </P ><P > If you can not get the reports you want from the included reporting @@ -9811,7 +10875,7 @@ CLASS="answer" ><B > </B > - Email notification is user-configurable. By default, the bug id and + Email notification is user-configurable. By default, the bug id and Summary of the bug report accompany each email notification, along with a list of the changes made. </P @@ -9889,7 +10953,7 @@ VALIGN="TOP" > If you decide to use the bugzilla_email integration features to allow Bugzilla to record responses to mail with the associated bug, you may need to caution your users to set their mailer to "respond - to messages in the format in which they were sent". For security reasons + to messages in the format in which they were sent". For security reasons Bugzilla ignores HTML tags in comments, and if a user sends HTML-based email into Bugzilla the resulting comment looks downright awful. </P @@ -9926,7 +10990,7 @@ CLASS="answer" > Bugzilla can output buglists as HTML (the default), CSV or RDF. The link for CSV can be found at the bottom of the buglist in HTML - format. This CSV format can easily be imported into MS Excel or + format. This CSV format can easily be imported into MS Excel or other spread-sheet applications. </P ><P @@ -9934,7 +10998,7 @@ CLASS="answer" <TT CLASS="computeroutput" >&ctype=rdf</TT -> to the URL. RDF +> to the URL. RDF is meant to be machine readable and thus it is assumed that the URL would be generated progmatically so there is no user visible link to this format. @@ -9984,15 +11048,15 @@ CLASS="answer" ><B > </B > - Yes. For more information including available translated templates, + Yes. For more information including available translated templates, see <A HREF="http://www.bugzilla.org/download.html#localizations" TARGET="_top" >http://www.bugzilla.org/download.html#localizations</A >. The admin interfaces are still not included in these translated - templates and is therefore still English only. Also, there may be - issues with the charset not being declared. See <A + templates and is therefore still English only. Also, there may be + issues with the charset not being declared. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=126266" TARGET="_top" >bug 126226</A @@ -10022,7 +11086,7 @@ CLASS="answer" ><B > </B > - Yes. No. Yes (using the CSV format). + Yes. No. Yes (using the CSV format). </P ></DIV ></DIV @@ -10047,7 +11111,7 @@ CLASS="answer" ><B > </B > - You have no idea. Bugzilla's query interface, particularly with the + You have no idea. Bugzilla's query interface, particularly with the advanced Boolean operators, is incredibly versatile. </P ></DIV @@ -10074,7 +11138,7 @@ CLASS="answer" ><B > </B > - Bugzilla does not lock records. It provides mid-air collision detection, + Bugzilla does not lock records. It provides mid-air collision detection, and offers the offending user a choice of options to deal with the conflict. </P ></DIV @@ -10104,8 +11168,8 @@ CLASS="answer" at <A HREF="http://www.mysql.com/doc/B/a/Backup.html" TARGET="_top" -> http://www.mysql.com/doc/B/a/Backup.html</A -> +>http://www.mysql.com/doc/B/a/Backup.html</A +>. </P ></DIV ></DIV @@ -10129,8 +11193,8 @@ CLASS="answer" ><B > </B > - Yes. However, commits to the database must wait - until the tables are unlocked. Bugzilla databases are typically + Yes. However, commits to the database must wait + until the tables are unlocked. Bugzilla databases are typically very small, and backups routinely take less than a minute. </P ></DIV @@ -10164,7 +11228,7 @@ CLASS="answer" </P ><P > Commercial Bug-tracking software typically costs somewhere upwards - of $20,000 or more for 5-10 floating licenses. Bugzilla consultation + of $20,000 or more for 5-10 floating licenses. Bugzilla consultation is available from skilled members of the newsgroup. Simple questions are answered there and then. </P @@ -10194,9 +11258,9 @@ CLASS="answer" ><B > </B > - It all depends on your level of commitment. Someone with much Bugzilla + It all depends on your level of commitment. Someone with much Bugzilla experience can get you up and running in less than a day, and - your Bugzilla install can run untended for years. If your + your Bugzilla install can run untended for years. If your Bugzilla strategy is critical to your business workflow, hire somebody with reasonable UNIX or Perl skills to handle your process management and bug-tracking maintenance & customization. @@ -10224,7 +11288,7 @@ CLASS="answer" ><B > </B > - No. MySQL asks, if you find their product valuable, that you purchase + No. MySQL asks, if you find their product valuable, that you purchase a support contract from them that suits your needs. </P ></DIV @@ -10258,7 +11322,7 @@ CLASS="answer" ><B > </B > - Run MySQL like this: "mysqld --skip-grant-tables". Please remember <EM + Run MySQL like this: "mysqld --skip-grant-tables". Please remember <EM >this makes MySQL as secure as taping a $100 to the floor of a football stadium bathroom for safekeeping.</EM @@ -10407,11 +11471,11 @@ CLASS="answer" ><B > </B > - Try Klaas Freitag's excellent patch for "whineatassigned" functionality. - You can find it at <A + Try Klaas Freitag's excellent patch for "whineatassigned" + functionality. You can find it in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=6679" TARGET="_top" ->http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A +>bug 6679</A >. This patch is against an older version of Bugzilla, so you must apply the diffs manually. @@ -10443,7 +11507,7 @@ CLASS="answer" You can call bug_email.pl directly from your aliases file, with an entry like this: <A -NAME="AEN1886" +NAME="AEN2067" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -10454,7 +11518,7 @@ CLASS="BLOCKQUOTE" > However, this is fairly nasty and subject to problems; you also need to set up your smrsh (sendmail restricted shell) to allow - it. In a pinch, though, it can work. + it. In a pinch, though, it can work. </P ></DIV ></DIV @@ -10571,7 +11635,7 @@ CLASS="answer" </P ><P > If you never receive mail from Bugzilla, chances you do not have - sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked + sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked to, "/usr/lib/sendmail". </P ></DIV @@ -10606,7 +11670,7 @@ CLASS="answer" > Red Hat's old version of Bugzilla (based on 2.8) worked on Oracle. Red Hat's newer version (based on 2.17.1 and soon to be merged into - the main distribution) runs on PostgreSQL. At this time we know of + the main distribution) runs on PostgreSQL. At this time we know of no recent ports of Bugzilla to Oracle but do intend to support it in the future (possibly the 2.20 time-frame). </P @@ -10645,15 +11709,15 @@ CLASS="filename" it finishes without errors, you're <EM >probably</EM -> OK. If it doesn't come back +> OK. If it doesn't come back OK (i.e. any red letters), there are certain things - Bugzilla can recover from and certain things it can't. If + Bugzilla can recover from and certain things it can't. If it can't auto-recover, I hope you're familiar with mysqladmin commands or have installed another way to - manage your database. Sanity Check, although it is a good + manage your database. Sanity Check, although it is a good basic check on your database integrity, by no means is a substitute for competent database administration and - avoiding deletion of data. It is not exhaustive, and was + avoiding deletion of data. It is not exhaustive, and was created to do a basic check for the most common problems in Bugzilla databases. </P @@ -10686,7 +11750,7 @@ CLASS="command" >mysql</B > command line utility to manually insert, delete and modify table - information. There are also more intuitive GUI clients available. + information. There are also more intuitive GUI clients available. Personal favorites of the Bugzilla team are <A HREF="http://www.phpmyadmin.net/" TARGET="_top" @@ -10782,7 +11846,7 @@ CLASS="answer" ><B > </B > - Well, you can synchronize or you can move bugs. Synchronization will + Well, you can synchronize or you can move bugs. Synchronization will only work one way -- you can create a read-only copy of the database at one site, and have it regularly updated at intervals from the main database. @@ -10852,8 +11916,8 @@ CLASS="answer" ><B > </B > - Not currently. Bundle::Bugzilla enormously simplifies Bugzilla - installation on UNIX systems. If someone can volunteer to + Not currently. Bundle::Bugzilla enormously simplifies Bugzilla + installation on UNIX systems. If someone can volunteer to create a suitable PPM bundle for Win32, it would be appreciated. </P ></DIV @@ -10887,7 +11951,7 @@ CLASS="answer" ><P > Microsoft has some advice on this matter, as well: <A -NAME="AEN1969" +NAME="AEN2150" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -10968,10 +12032,10 @@ CLASS="command" I reckon TimeDate and Data::Dumper come with the activeperl. You can check the ActiveState site for packages for installation through PPM. <A -HREF=" http://www.activestate.com/Packages/" +HREF="http://www.activestate.com/Packages/" TARGET="_top" -> http://www.activestate.com/Packages/</A -> +>http://www.activestate.com/Packages/</A +>. </P ></DIV ></DIV @@ -11019,7 +12083,7 @@ NAME="faq-use-query" ><B >A.7.2. </B > - The query page is very confusing. Isn't there a simpler way to query? + The query page is very confusing. Isn't there a simpler way to query? </P ></DIV ><DIV @@ -11056,8 +12120,7 @@ CLASS="answer" > </B > The current behavior is acceptable to bugzilla.mozilla.org and most - users. You have your choice of patches - to change this behavior, however. + users. You have your choice of patches to change this behavior, however. <P ></P ><TABLE @@ -11084,8 +12147,8 @@ TARGET="_top" ><P ></P > - Note that these patches are somewhat dated. You will need to apply - them manually. + Note that these patches are somewhat dated. You will need to apply + them manually. </P ></DIV ></DIV @@ -11101,7 +12164,7 @@ NAME="faq-use-attachment" >A.7.4. </B > I can't upload anything into the database via the "Create Attachment" - link. What am I doing wrong? + link. What am I doing wrong? </P ></DIV ><DIV @@ -11111,7 +12174,7 @@ CLASS="answer" > </B > The most likely cause is a very old browser or a browser that is - incompatible with file upload via POST. Download the latest Netscape, + incompatible with file upload via POST. Download the latest Netscape, Microsoft, or Mozilla browser to handle uploads correctly. </P ></DIV @@ -11137,11 +12200,48 @@ CLASS="answer" > </B > In the Bugzilla administrator UI, edit the keyword and it will let you - replace the old keyword name with a new one. This will cause a problem - with the keyword cache. Run sanitycheck.cgi to fix it. + replace the old keyword name with a new one. This will cause a problem + with the keyword cache. Run sanitycheck.cgi to fix it. </P ></DIV ></DIV +><DIV +CLASS="qandaentry" +><DIV +CLASS="question" +><P +><A +NAME="faq-use-close" +></A +><B +>A.7.6. </B +> + Why can't I close bugs from the "Change Several Bugs at Once" page? + </P +></DIV +><DIV +CLASS="answer" +><P +><B +> </B +> + The logic flow currently used is RESOLVED, then VERIFIED, then CLOSED. + You <EM +>can</EM +> mass-CLOSE bugs from the change several + bugs at once page. <EM +>but</EM +>, every bug listed on the + page has to be in VERIFIED state before the control to do it will show + up on the form. You can also mass-VERIFY, but every bug listed has to be + RESOLVED in order for the control to show up on the form. The logic + behind this is that if you pick one of the bugs that's not VERIFIED and + try to CLOSE it, the bug change will fail miserably (thus killing any + changes in the list after it while doing the bulk change) so it doesn't + even give you the choice. + </P +></DIV +></DIV ></DIV ><DIV CLASS="qandadiv" @@ -11171,7 +12271,7 @@ CLASS="answer" > </B > Gerv and Myk suggest a 2-space indent, with embedded code sections on - their own line, in line with outer tags. Like this:</P + their own line, in line with outer tags. Like this:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" @@ -11206,7 +12306,7 @@ CLASS="programlisting" ><P >Please note that many have differing opinions on this subject, and the existing templates in Bugzilla espouse both this and a 4-space - style. Either is acceptable; the above is preferred.</P + style. Either is acceptable; the above is preferred.</P ></DIV ></DIV ><DIV @@ -11244,7 +12344,7 @@ TARGET="_top" >here</A >. This list includes bugs for the 2.18 release that have already - been fixed and checked into CVS. Please consult the + been fixed and checked into CVS. Please consult the <A HREF="http://www.bugzilla.org/" TARGET="_top" @@ -11276,14 +12376,13 @@ CLASS="answer" ><B > </B > - This is well-documented here: <A + This is well-documented in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=49862" TARGET="_top" -> http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A ->. Ultimately, it's as easy - as adding the "---" priority field to your localconfig file in the appropriate area, - re-running checksetup.pl, and then changing the default priority in your browser using - "editparams.cgi". +> bug 49862</A +>. Ultimately, it's as easy as adding the "---" priority field to your + localconfig file in the appropriate area, re-running checksetup.pl, and then changing the + default priority in your browser using "editparams.cgi". </P ></DIV ></DIV @@ -11332,7 +12431,7 @@ TARGET="_top" or new source file by clicking "Create a new attachment" link on the bug page you've just created, and include any descriptions of database changes you may make, into the bug - ID you submitted in step #1. Be sure and click the "Patch" checkbox + ID you submitted in step #1. Be sure and click the "Patch" checkbox to indicate the text you are sending is a patch! </P ></LI @@ -11340,7 +12439,7 @@ TARGET="_top" ><P > Announce your patch and the associated URL (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in - the newsgroup (netscape.public.mozilla.webtools). You'll get a really + the newsgroup (netscape.public.mozilla.webtools). You'll get a really good, fairly immediate reaction to the implications of your patch, which will also give us an idea how well-received the change would be. @@ -11490,7 +12589,7 @@ NAME="dbdoc" ><P >But Certain Death speaks up -- a tiny voice, from the dark corners of the conference room. "I have a concern," the voice hisses from the - darkness, "about the use of the word 'verified'.</P + darkness, "about the use of the word 'verified'."</P ><P >The room, previously filled with happy chatter, lapses into reverential silence as Certain Death (better known as the Vice President @@ -11517,7 +12616,7 @@ CLASS="section" ><HR><H2 CLASS="section" ><A -NAME="AEN2091" +NAME="AEN2279" ></A >B.2.1. Bugzilla Database Basics</H2 ><P @@ -11536,14 +12635,12 @@ CLASS="QUOTE" >"tinyint"</SPAN > - entry in MySQL. I recommend you refer to the MySQL documentation, - available at + entry in MySQL. I recommend you refer to the <A -HREF="http://www.mysql.com/doc.html" +HREF="http://www.mysql.com/documentation/" TARGET="_top" ->MySQL.com</A +>MySQL documentation</A > - . Below are the basics you need to know about the Bugzilla database. Check the chart above for more details.</P ><P @@ -11587,7 +12684,7 @@ HREF="http://www.mysql.com/php/manual.php3?section=Privilege_system" TARGET="_top" >MySQL searchable documentation</A ->. +>. </P ></LI ><LI @@ -11633,7 +12730,7 @@ CLASS="section" ><HR><H3 CLASS="section" ><A -NAME="AEN2118" +NAME="AEN2306" ></A >B.2.1.1. Bugzilla Database Tables</H3 ><P @@ -11704,14 +12801,14 @@ CLASS="programlisting" ><P CLASS="literallayout" ><br> - Here's an overview of what each table does. Most columns in each table have<br> + Here's an overview of what each table does. Most columns in each table have<br> descriptive names that make it fairly trivial to figure out their jobs.<br> <br> -attachments: This table stores all attachments to bugs. It tends to be your<br> +attachments: This table stores all attachments to bugs. It tends to be your<br> largest table, yet also generally has the fewest entries because file<br> attachments are so (relatively) large.<br> <br> -bugs: This is the core of your system. The bugs table stores most of the<br> +bugs: This is the core of your system. The bugs table stores most of the<br> current information about a bug, with the exception of the info stored in the<br> other tables.<br> <br> @@ -11719,26 +12816,26 @@ bugs_activity: This stores information regarding when -- a history file.<br> <br> cc: This tiny table simply stores all the CC information for any bug which has<br> -any entries in the CC field of the bug. Note that, like most other tables in<br> +any entries in the CC field of the bug. Note that, like most other tables in<br> Bugzilla, it does not refer to users by their user names, but by their unique<br> userid, stored as a primary key in the profiles table.<br> <br> components: This stores the programs and components (or products and<br> -components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program"<br> +components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program"<br> (product) field is the full name of the product, rather than some other unique<br> identifier, like bug_id and user_id are elsewhere in the database.<br> <br> dependencies: Stores data about those cool dependency trees.<br> <br> -fielddefs: A nifty table that defines other tables. For instance, when you<br> +fielddefs: A nifty table that defines other tables. For instance, when you<br> submit a form that changes the value of "AssignedTo" this table allows<br> translation to the actual field name "assigned_to" for entry into MySQL.<br> <br> -groups: defines bitmasks for groups. A bitmask is a number that can uniquely<br> -identify group memberships. For instance, say the group that is allowed to<br> +groups: defines bitmasks for groups. A bitmask is a number that can uniquely<br> +identify group memberships. For instance, say the group that is allowed to<br> tweak parameters is assigned a value of "1", the group that is allowed to edit<br> users is assigned a "2", and the group that is allowed to create new groups is<br> -assigned the bitmask of "4". By uniquely combining the group bitmasks (much<br> +assigned the bitmask of "4". By uniquely combining the group bitmasks (much<br> like the chmod command in UNIX,) you can identify a user is allowed to tweak<br> parameters and create groups, but not edit users, by giving him a bitmask of<br> "5", or a user allowed to edit users and create groups, but not tweak<br> @@ -11753,15 +12850,15 @@ keywords: Unlike what you'd think, this table  associated with which bug id's.<br> <br> logincookies: This stores every login cookie ever assigned to you for every<br> -machine you've ever logged into Bugzilla from. Curiously, it never does any<br> -housecleaning -- I see cookies in this file I've not used for months. However,<br> +machine you've ever logged into Bugzilla from. Curiously, it never does any<br> +housecleaning -- I see cookies in this file I've not used for months. However,<br> since Bugzilla never expires your cookie (for convenience' sake), it makes<br> sense.<br> <br> longdescs: The meat of bugzilla -- here is where all user comments are stored!<br> You've only got 2^24 bytes per comment (it's a mediumtext field), so speak<br> sparingly -- that's only the amount of space the Old Testament from the Bible<br> -would take (uncompressed, 16 megabytes). Each comment is keyed to the<br> +would take (uncompressed, 16 megabytes). Each comment is keyed to the<br> bug_id to which it's attached, so the order is necessarily chronological, for<br> comments are played back in the order in which they are received.<br> <br> @@ -11769,12 +12866,12 @@ milestones: Interesting that milestones are assoc in this table, but Bugzilla does not yet support differing milestones by<br> product through the standard configuration interfaces.<br> <br> -namedqueries: This is where everybody stores their "custom queries". Very<br> +namedqueries: This is where everybody stores their "custom queries". Very<br> cool feature; it beats the tar out of having to bookmark each cool query you<br> construct.<br> <br> products: What products you have, whether new bug entries are allowed for the<br> -product, what milestone you're working toward on that product, votes, etc. It<br> +product, what milestone you're working toward on that product, votes, etc. It<br> will be nice when the components table supports these same features, so you<br> could close a particular component for bug entry without having to close an<br> entire product...<br> @@ -11809,7 +12906,7 @@ mysql> show columns from table;<br> mysql> select * from table;<br> <br> -- note: this is a very bad idea to do on, for instance, the "bugs" table if<br> -you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or<br> +you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or<br> 50,000 bugs play across your screen.<br> <br> You can limit the display from above a little with the command, where<br> @@ -11822,7 +12919,7 @@ mysql> select * from table where (column mysql> select * from table where (column != "some info");<br> <br> Let's take our example from the introduction, and assume you need to change<br> -the word "verified" to "approved" in the resolution field. We know from the<br> +the word "verified" to "approved" in the resolution field. We know from the<br> above information that the resolution is likely to be stored in the "bugs"<br> table. Note we'll need to change a little perl code as well as this database<br> change, but I won't plunge into that in this document. Let's verify the<br> @@ -11833,10 +12930,10 @@ mysql> show columns from bugs<br> (exceedingly long output truncated here)<br> | bug_status| enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED')||MUL | UNCONFIRMED||<br> <br> - Sorry about that long line. We see from this that the "bug status" column is<br> + Sorry about that long line. We see from this that the "bug status" column is<br> an "enum field", which is a MySQL peculiarity where a string type field can<br> -only have certain types of entries. While I think this is very cool, it's not<br> -standard SQL. Anyway, we need to add the possible enum field entry<br> +only have certain types of entries. While I think this is very cool, it's not<br> +standard SQL. Anyway, we need to add the possible enum field entry<br> 'APPROVED' by altering the "bugs" table.<br> <br> mysql> ALTER table bugs CHANGE bug_status bug_status<br> @@ -11852,15 +12949,15 @@ mysql> show columns from bugs;<br> <br> you'll see that the bug_status field has an extra "APPROVED" enum that's<br> available! Cool thing, too, is that this is reflected on your query page as<br> -well -- you can query by the new status. But how's it fit into the existing<br> +well -- you can query by the new status. But how's it fit into the existing<br> scheme of things?<br> Looks like you need to go back and look for instances of the word "verified"<br> in the perl code for Bugzilla -- wherever you find "verified", change it to<br> "approved" and you're in business (make sure that's a case-insensitive search).<br> Although you can query by the enum field, you can't give something a status<br> -of "APPROVED" until you make the perl changes. Note that this change I<br> +of "APPROVED" until you make the perl changes. Note that this change I<br> mentioned can also be done by editing checksetup.pl, which automates a lot of<br> -this. But you need to know this stuff anyway, right?<br> +this. But you need to know this stuff anyway, right?<br> </P ></DIV ></DIV @@ -12045,8 +13142,8 @@ NAME="variants" <A HREF="http://linas.org/linux/pm.html" TARGET="_top" -> http://linas.org/linux/pm.html</A -> +>http://linas.org/linux/pm.html</A +>. </P ><DIV CLASS="section" @@ -12058,26 +13155,25 @@ NAME="variant-redhat" >D.1. Red Hat Bugzilla</H1 ><P >Red Hat's old fork of Bugzilla which was based on version 2.8 is now - obsolete. The newest version in use is based on version 2.17.1 and is in - the process of being integrated into the main Bugzilla source tree. The + obsolete. The newest version in use is based on version 2.17.1 and is in + the process of being integrated into the main Bugzilla source tree. The back-end is modified to work with PostgreSQL instead of MySQL and they have custom templates to get their desired look and feel, but other than that it - is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of + is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of effort to make sure that the changes he made could be integrated back into the main tree. <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=98304" TARGET="_top" ->Bug - 98304</A -> exists to track this integration. +>Bug 98304</A +> + exists to track this integration. </P ><P ->URL: - <A +>URL: <A HREF="http://bugzilla.redhat.com/bugzilla/" TARGET="_top" -> http://bugzilla.redhat.com/bugzilla/</A +>http://bugzilla.redhat.com/bugzilla/</A > </P ><P @@ -12130,11 +13226,10 @@ NAME="variant-scarab" >Scarab is a new open source bug-tracking system built using Java Servlet technology. It is currently at version 1.0 beta 13.</P ><P ->URL: - <A +>URL: <A HREF="http://scarab.tigris.org/" TARGET="_top" ->http://scarab.tigris.org</A +>http://scarab.tigris.org/</A > </P ><P @@ -12156,12 +13251,10 @@ CLASS="QUOTE" > functionality.</P ><P ->URL: - <A +>URL: <A HREF="http://www.perforce.com/perforce/technotes/note052.html" TARGET="_top" -> http://www.perforce.com/perforce/technotes/note052.html - </A +>http://www.perforce.com/perforce/technotes/note052.html</A > </P ><P @@ -12180,11 +13273,10 @@ NAME="variant-sourceforge" distributed free software and open source projects over the Internet. It has a built-in bug tracker, but it's not highly thought of.</P ><P ->URL: - <A +>URL: <A HREF="http://www.sourceforge.net" TARGET="_top" -> http://www.sourceforge.net</A +>http://www.sourceforge.net</A > </P ><P @@ -12201,7 +13293,7 @@ NAME="gfdl" ><P >Version 1.1, March 2000</P ><A -NAME="AEN2206" +NAME="AEN2394" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -12639,10 +13731,8 @@ NAME="gfdl-10" <A HREF="http://www.gnu.org/copyleft/" TARGET="_top" -> http://www.gnu.org/copyleft/</A -> - - .</P +>http://www.gnu.org/copyleft/</A +>.</P ><P >Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of @@ -12666,7 +13756,7 @@ NAME="gfdl-howto" of the License in the document and put the following copyright and license notices just after the title page:</P ><A -NAME="AEN2296" +NAME="AEN2484" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -12703,7 +13793,7 @@ CLASS="glossdiv" ><H1 CLASS="glossdiv" ><A -NAME="AEN2301" +NAME="AEN2489" ></A >0-9, high ascii</H1 ><DL @@ -12986,13 +14076,9 @@ NAME="gloss-component" NAME="gloss-cpan" ></A ><B -> <SPAN -CLASS="acronym" ->CPAN</SPAN -> - </B +>Comprehensive Perl Archive Network</B ></DT -><DD +> (CPAN)<DD ><P > <SPAN CLASS="acronym" @@ -13012,6 +14098,62 @@ CLASS="glossterm" modules - encapsulated chunks of code for performing a particular task.</P ></DD +><DT +><A +NAME="gloss-contrib" +></A +><B +><TT +CLASS="filename" +>contrib</TT +></B +></DT +><DD +><P +>The <TT +CLASS="filename" +>contrib</TT +> directory is + a location to put scripts that have been contributed to Bugzilla but + are not a part of the official distribution. These scripts are written + by third parties and may be in languages other than perl. For those + that are in perl, there may be additional modules or other requirements + than those of the offical distribution. + <DIV +CLASS="note" +><P +></P +><TABLE +CLASS="note" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Scripts in the <TT +CLASS="filename" +>contrib</TT +> + directory are not offically supported by the Bugzilla team and may + break in between versions. + </P +></TD +></TR +></TABLE +></DIV +> + </P +></DD ></DL ></DIV ><DIV @@ -13233,6 +14375,22 @@ NAME="gloss-p" >P</H1 ><DL ><DT +><A +NAME="gloss-ppm" +></A +><B +>Perl Package Manager</B +></DT +> (PPM)<DD +><P +><A +HREF="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/" +TARGET="_top" +>http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/</A +> + </P +></DD +><DT ><B >Product</B ></DT @@ -13330,6 +14488,23 @@ NAME="gloss-rdbms" that stores information in tables that are related to each other. </P ></DD +><DT +><A +NAME="gloss-regexp" +></A +><B +>Regular Expression</B +></DT +> (regexp)<DD +><P +>A regular expression is an expression used for pattern matching. + <A +HREF="http://perldoc.com/perl5.6/pod/perlre.html#Regular-Expressions" +TARGET="_top" +>Documentation</A +> + </P +></DD ></DL ></DIV ><DIV @@ -13482,7 +14657,7 @@ NAME="gloss-zarro" Terry had the following to say: </P ><A -NAME="AEN2515" +NAME="AEN2724" ></A ><TABLE BORDER="0" diff --git a/docs/html/CVS/Entries b/docs/html/CVS/Entries index c983d0ba954bebfe7ba971df7bfcb083f3e58c6b..9066139a9ffab5d8339cfc97ff80b1ec1e201520 100644 --- a/docs/html/CVS/Entries +++ b/docs/html/CVS/Entries @@ -1,62 +1,62 @@ -/Bugzilla-Guide.html/1.23/Wed Apr 23 02:32:52 2003//TBUGZILLA-2_17_4 -/about.html/1.10/Sun Feb 16 15:43:19 2003//TBUGZILLA-2_17_4 -/administration.html/1.15/Wed Apr 23 02:32:54 2003//TBUGZILLA-2_17_4 -/cmdline.html/1.10/Sun Feb 16 15:43:21 2003//TBUGZILLA-2_17_4 -/conventions.html/1.14/Sun Feb 16 15:43:21 2003//TBUGZILLA-2_17_4 -/copyright.html/1.14/Sun Feb 16 15:43:21 2003//TBUGZILLA-2_17_4 -/credits.html/1.11/Sun Feb 16 15:43:21 2003//TBUGZILLA-2_17_4 -/cust-change-permissions.html/1.2/Sun Feb 16 15:43:22 2003//TBUGZILLA-2_17_4 -/cust-templates.html/1.9/Wed Apr 23 02:32:54 2003//TBUGZILLA-2_17_4 -/database.html/1.9/Sun Feb 16 15:43:23 2003//TBUGZILLA-2_17_4 -/dbdoc.html/1.17/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/dbmodify.html/1.2/Sun Feb 16 15:43:24 2003//TBUGZILLA-2_17_4 -/disclaimer.html/1.10/Sun Feb 16 15:43:24 2003//TBUGZILLA-2_17_4 -/extraconfig.html/1.9/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/faq.html/1.18/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/gfdl-0.html/1.5/Sun Feb 16 15:43:25 2003//TBUGZILLA-2_17_4 -/gfdl-1.html/1.5/Sun Feb 16 15:43:25 2003//TBUGZILLA-2_17_4 -/gfdl-10.html/1.5/Sun Feb 16 15:43:25 2003//TBUGZILLA-2_17_4 -/gfdl-2.html/1.5/Sun Feb 16 15:43:28 2003//TBUGZILLA-2_17_4 -/gfdl-3.html/1.5/Sun Feb 16 15:43:28 2003//TBUGZILLA-2_17_4 -/gfdl-4.html/1.5/Sun Feb 16 15:43:28 2003//TBUGZILLA-2_17_4 -/gfdl-5.html/1.5/Sun Feb 16 15:43:28 2003//TBUGZILLA-2_17_4 -/gfdl-6.html/1.5/Sun Feb 16 15:43:29 2003//TBUGZILLA-2_17_4 -/gfdl-7.html/1.5/Sun Feb 16 15:43:29 2003//TBUGZILLA-2_17_4 -/gfdl-8.html/1.5/Sun Feb 16 15:43:29 2003//TBUGZILLA-2_17_4 -/gfdl-9.html/1.5/Sun Feb 16 15:43:29 2003//TBUGZILLA-2_17_4 -/gfdl-howto.html/1.8/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/gfdl.html/1.16/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/glossary.html/1.19/Wed Apr 23 02:32:56 2003//TBUGZILLA-2_17_4 -/groups.html/1.5/Sun Feb 16 15:43:32 2003//TBUGZILLA-2_17_4 -/hintsandtips.html/1.7/Sun Feb 16 15:43:32 2003//TBUGZILLA-2_17_4 -/how.html/1.13/Sun Feb 16 15:43:32 2003//TBUGZILLA-2_17_4 -/http.html/1.3/Sun Feb 16 15:43:33 2003//TBUGZILLA-2_17_4 -/index.html/1.18/Wed Apr 23 02:32:57 2003//TBUGZILLA-2_17_4 -/installation.html/1.18/Wed Apr 23 02:32:57 2003//TBUGZILLA-2_17_4 -/integration.html/1.11/Sun Feb 16 15:43:33 2003//TBUGZILLA-2_17_4 -/introduction.html/1.4/Sun Feb 16 15:43:33 2003//TBUGZILLA-2_17_4 -/newversions.html/1.12/Sun Feb 16 15:43:34 2003//TBUGZILLA-2_17_4 -/os-specific.html/1.4/Wed Apr 23 02:32:57 2003//TBUGZILLA-2_17_4 -/parameters.html/1.5/Sun Feb 16 15:43:35 2003//TBUGZILLA-2_17_4 -/patches.html/1.13/Sun Feb 16 15:43:35 2003//TBUGZILLA-2_17_4 -/programadmin.html/1.13/Sun Feb 16 15:43:36 2003//TBUGZILLA-2_17_4 -/rewrite.html/1.6/Sun Feb 16 15:43:36 2003//TBUGZILLA-2_17_4 -/security.html/1.14/Sun Feb 16 15:43:37 2003//TBUGZILLA-2_17_4 -/stepbystep.html/1.16/Wed Apr 23 02:32:57 2003//TBUGZILLA-2_17_4 -/troubleshooting.html/1.9/Wed Apr 23 02:32:57 2003//TBUGZILLA-2_17_4 -/upgrading.html/1.6/Sun Feb 16 15:43:41 2003//TBUGZILLA-2_17_4 -/useradmin.html/1.11/Sun Feb 16 15:43:41 2003//TBUGZILLA-2_17_4 -/userpreferences.html/1.4/Sun Feb 16 15:43:41 2003//TBUGZILLA-2_17_4 -/using.html/1.14/Sun Feb 16 15:43:41 2003//TBUGZILLA-2_17_4 -/variant-fenris.html/1.7/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variant-issuezilla.html/1.7/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variant-perforce.html/1.7/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variant-redhat.html/1.1/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variant-scarab.html/1.8/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variant-sourceforge.html/1.8/Sun Feb 16 15:43:42 2003//TBUGZILLA-2_17_4 -/variants.html/1.11/Sun Feb 16 15:43:43 2003//TBUGZILLA-2_17_4 -/voting.html/1.4/Sun Feb 16 15:43:43 2003//TBUGZILLA-2_17_4 -/whatis.html/1.11/Sun Feb 16 15:43:43 2003//TBUGZILLA-2_17_4 -/why.html/1.10/Sun Feb 16 15:43:43 2003//TBUGZILLA-2_17_4 -/win32.html/1.13/Sat Feb 15 06:12:28 2003//TBUGZILLA-2_17_4 +/Bugzilla-Guide.html/1.31/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/about.html/1.13/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/administration.html/1.22/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/cmdline.html/1.13/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/conventions.html/1.19/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/copyright.html/1.19/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/credits.html/1.15/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/cust-change-permissions.html/1.6/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/cust-templates.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/database.html/1.12/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/dbdoc.html/1.24/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/dbmodify.html/1.5/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/disclaimer.html/1.14/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/extraconfig.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/faq.html/1.25/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-0.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-1.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-10.html/1.9/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-2.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-3.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-4.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-5.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-6.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-7.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-8.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-9.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl-howto.html/1.15/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/gfdl.html/1.23/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/glossary.html/1.27/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/groups.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/hintsandtips.html/1.12/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/how.html/1.17/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/http.html/1.7/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/index.html/1.24/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/installation.html/1.25/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/integration.html/1.15/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/introduction.html/1.7/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/newversions.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/os-specific.html/1.10/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/parameters.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/patches.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/programadmin.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/rewrite.html/1.9/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/security.html/1.18/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/stepbystep.html/1.23/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/troubleshooting.html/1.16/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/upgrading.html/1.10/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/useradmin.html/1.14/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/userpreferences.html/1.7/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/using.html/1.19/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-fenris.html/1.10/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-issuezilla.html/1.10/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-perforce.html/1.11/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-redhat.html/1.5/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-scarab.html/1.12/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variant-sourceforge.html/1.12/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/variants.html/1.15/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/voting.html/1.8/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/whatis.html/1.14/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/why.html/1.13/Sun Nov 2 14:04:28 2003//TBUGZILLA-2_17_5 +/win32.html/1.13/Sat Feb 15 06:12:28 2003//TBUGZILLA-2_17_5 D diff --git a/docs/html/CVS/Tag b/docs/html/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/docs/html/CVS/Tag +++ b/docs/html/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/docs/html/about.html b/docs/html/about.html index ce7d431911816c4fe3d12471c18f1fd3523f2be0..3d5d1b9ae1499a4ccc4083a6a45938f6ff7d3bf8 100644 --- a/docs/html/about.html +++ b/docs/html/about.html @@ -4,13 +4,12 @@ >About This Guide</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="NEXT" TITLE="Copyright Information" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -151,7 +150,7 @@ ACCESSKEY="N" WIDTH="33%" ALIGN="left" VALIGN="top" ->The Bugzilla Guide - 2.17.4 Development Release</TD +>The Bugzilla Guide - 2.17.5 Development Release</TD ><TD WIDTH="34%" ALIGN="center" diff --git a/docs/html/administration.html b/docs/html/administration.html index f8a11132827c9cf22bd14add12775e05ee0beaea..44c45eb874b58cb78c136d9b592aef7fa317c345 100644 --- a/docs/html/administration.html +++ b/docs/html/administration.html @@ -4,10 +4,9 @@ >Administering Bugzilla</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Troubleshooting" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -180,24 +179,29 @@ HREF="cust-templates.html" ><DL ><DT >5.7.1. <A -HREF="cust-templates.html#AEN1425" +HREF="cust-templates.html#AEN1606" >What to Edit</A ></DT ><DT >5.7.2. <A -HREF="cust-templates.html#AEN1444" +HREF="cust-templates.html#AEN1629" >How To Edit Templates</A ></DT ><DT >5.7.3. <A -HREF="cust-templates.html#AEN1454" +HREF="cust-templates.html#AEN1639" >Template Formats</A ></DT ><DT >5.7.4. <A -HREF="cust-templates.html#AEN1467" +HREF="cust-templates.html#AEN1652" >Particular Templates</A ></DT +><DT +>5.7.5. <A +HREF="cust-templates.html#template-http-accept" +>Configuring Bugzilla to Detect the User's Language</A +></DT ></DL ></DD ><DT diff --git a/docs/html/cmdline.html b/docs/html/cmdline.html index 200304fe847a3d60b7f3208681514cee7fabc7e0..70af1510a48b1a1065f008c64639293da96aba4b 100644 --- a/docs/html/cmdline.html +++ b/docs/html/cmdline.html @@ -4,10 +4,9 @@ >Command-line Bugzilla Queries</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Useful Patches and Utilities for Bugzilla" @@ -40,7 +39,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/conventions.html b/docs/html/conventions.html index 6964b1df67cec0a33f480c3600a6b735517b9561..5ba3317d3dbb97f8719d91e03bd80a926b336990 100644 --- a/docs/html/conventions.html +++ b/docs/html/conventions.html @@ -4,10 +4,9 @@ >Document Conventions</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="About This Guide" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -81,7 +80,7 @@ NAME="conventions" ><DIV CLASS="informaltable" ><A -NAME="AEN110" +NAME="AEN113" ></A ><P ></P diff --git a/docs/html/copyright.html b/docs/html/copyright.html index 83b9d7bd9ad05a13cd9a52a135bc875f004c9fde..26885185749eb7e8ce3df621eb0b6de31a6f2f66 100644 --- a/docs/html/copyright.html +++ b/docs/html/copyright.html @@ -4,10 +4,9 @@ >Copyright Information</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="About This Guide" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -77,7 +76,7 @@ NAME="copyright" ></A >1.1. Copyright Information</H1 ><A -NAME="AEN33" +NAME="AEN35" ></A ><TABLE BORDER="0" @@ -96,9 +95,9 @@ VALIGN="TOP" ><P > Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation - License, Version 1.1 or any later version published by the + License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no - Front-Cover Texts, and with no Back-Cover Texts. A copy of + Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in <A HREF="gfdl.html" >Appendix E</A diff --git a/docs/html/credits.html b/docs/html/credits.html index ff4603d0d3254af49e1f78d22e877c1dd4b985c5..5993eebeb3a5892b6a0a36a738ab685c6067054b 100644 --- a/docs/html/credits.html +++ b/docs/html/credits.html @@ -4,10 +4,9 @@ >Credits</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="About This Guide" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -184,13 +183,13 @@ HREF="news://news.mozilla.org/netscape/public/mozilla/webtools" TARGET="_top" >news://news.mozilla.org/netscape/public/mozilla/webtools</A > - newsgroup. Without your discussions, insight, suggestions, and patches, + newsgroup. Without your discussions, insight, suggestions, and patches, this could never have happened. </P ><P > Thanks also go to the following people for significant contributions to this documentation (in alphabetical order): - Andrew Pearson, Ben FrantzDale, Eric Hanson, Gervase Markham, Joe Robins, Kevin Brannen, Ron Teitelbaum, Spencer Smith, Zach Liption + Andrew Pearson, Ben FrantzDale, Eric Hanson, Gervase Markham, Joe Robins, Kevin Brannen, Martin Wulffeld, Ron Teitelbaum, Spencer Smith, Zach Liption . </P ></DIV diff --git a/docs/html/cust-change-permissions.html b/docs/html/cust-change-permissions.html index 465896d0bee09c7614b935ae9f9c56095b9784d3..cb123985d2f2a77acddd74f3a5402af9aa0b98c1 100644 --- a/docs/html/cust-change-permissions.html +++ b/docs/html/cust-change-permissions.html @@ -4,10 +4,9 @@ >Change Permission Customization</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -183,7 +182,7 @@ COLOR="#000000" ><PRE CLASS="programlisting" > if ($field eq "qacontact") { - if (UserInGroup("quality_assurance")) { + if (Bugzilla->user->groups("quality_assurance")) { return 1; } else { @@ -208,7 +207,7 @@ COLOR="#000000" ><PRE CLASS="programlisting" > if (($field eq "priority") && - ($vars->{'user'}{'login'} =~ /.*\@example\.com$/)) + (Bugzilla->user->email =~ /.*\@example\.com$/)) { if ($oldvalue eq "P1") { return 1; diff --git a/docs/html/cust-templates.html b/docs/html/cust-templates.html index e34e1815ad4af112a3f84fa711273e1b3b390866..a981513c8ace6803a5dba8f25b85bd02b1517ea1 100644 --- a/docs/html/cust-templates.html +++ b/docs/html/cust-templates.html @@ -4,10 +4,9 @@ >Template Customization</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -90,16 +89,20 @@ TARGET="_top" </P ><P > Templatization also makes localized versions of Bugzilla possible, - for the first time. In the future, a Bugzilla installation may - have templates installed for multiple localizations, and select - which ones to use based on the user's browser language setting. + for the first time. As of version 2.17.4 which will soon + become 2.18, it's possible to have Bugzilla's language determined by + the user's browser. More information is available in + <A +HREF="cust-templates.html#template-http-accept" +>Section 5.7.5</A +>. </P ><DIV CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN1425" +NAME="AEN1606" ></A >5.7.1. What to Edit</H2 ><P @@ -208,13 +211,48 @@ CLASS="filename" ></TR ></TABLE ></DIV +><DIV +CLASS="note" +><P +></P +><TABLE +CLASS="note" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>It is recommended that you run <B +CLASS="command" +>./checksetup.pl</B +> + after any template edits, especially if you've created a new file in + the <TT +CLASS="filename" +>custom</TT +> directory. + </P +></TD +></TR +></TABLE +></DIV ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN1444" +NAME="AEN1629" ></A >5.7.2. How To Edit Templates</H2 ><P @@ -296,7 +334,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN1454" +NAME="AEN1639" ></A >5.7.3. Template Formats</H2 ><P @@ -358,7 +396,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN1467" +NAME="AEN1652" ></A >5.7.4. Particular Templates</H2 ><P @@ -542,6 +580,48 @@ CLASS="programlisting" would appear in the initial checkin comment. </P ></DIV +><DIV +CLASS="section" +><H2 +CLASS="section" +><A +NAME="template-http-accept" +></A +>5.7.5. Configuring Bugzilla to Detect the User's Language</H2 +><P +>Begining in version 2.18 (first introduced in version + 2.17.4), it's now possible to have the users web browser tell Bugzilla + which language templates to use for each visitor (using the HTTP_ACCEPT + header). For this to work, Bugzilla needs to have the correct language + templates installed for the version of Bugzilla you are using. Many + language templates can be obtained from <A +HREF="http://www.bugzilla.org/download.html#localizations" +TARGET="_top" +>http://www.bugzilla.org/download.html#localizations</A +>. Instructions + for submitting new languages are also available from that location. + </P +><P +>After untarring the localizations (or creating your own) in the + <TT +CLASS="filename" +>[Bugzilla_Root]/template</TT +> directory, + you must update the <TT +CLASS="option" +>languages</TT +> parameter to contain any + localizations you'd like to permit. You may also wish to set the + <TT +CLASS="option" +>defaultlanguage</TT +> parameter to something other than + <SPAN +CLASS="QUOTE" +>"en"</SPAN +> if you don't want Engish to be the default language. + </P +></DIV ></DIV ><DIV CLASS="NAVFOOTER" diff --git a/docs/html/database.html b/docs/html/database.html index dbb8b9fa415318ce62717742c6326d5f36e40f79..d9bc26c2cad143dae3179ef0d4f20a397b466627 100644 --- a/docs/html/database.html +++ b/docs/html/database.html @@ -4,10 +4,9 @@ >The Bugzilla Database</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="The Bugzilla FAQ" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/dbdoc.html b/docs/html/dbdoc.html index 8e0109d0d91f7095bf9dcc71785a8d706ae5c53d..8f250c0f64a0a2c4c14a9ddf4a1a5c275900334c 100644 --- a/docs/html/dbdoc.html +++ b/docs/html/dbdoc.html @@ -4,10 +4,9 @@ >MySQL Bugzilla Database Introduction</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="The Bugzilla Database" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -108,7 +107,7 @@ NAME="dbdoc" ><P >But Certain Death speaks up -- a tiny voice, from the dark corners of the conference room. "I have a concern," the voice hisses from the - darkness, "about the use of the word 'verified'.</P + darkness, "about the use of the word 'verified'."</P ><P >The room, previously filled with happy chatter, lapses into reverential silence as Certain Death (better known as the Vice President @@ -135,7 +134,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN2091" +NAME="AEN2279" ></A >B.2.1. Bugzilla Database Basics</H2 ><P @@ -154,14 +153,12 @@ CLASS="QUOTE" >"tinyint"</SPAN > - entry in MySQL. I recommend you refer to the MySQL documentation, - available at + entry in MySQL. I recommend you refer to the <A -HREF="http://www.mysql.com/doc.html" +HREF="http://www.mysql.com/documentation/" TARGET="_top" ->MySQL.com</A +>MySQL documentation</A > - . Below are the basics you need to know about the Bugzilla database. Check the chart above for more details.</P ><P @@ -205,7 +202,7 @@ HREF="http://www.mysql.com/php/manual.php3?section=Privilege_system" TARGET="_top" >MySQL searchable documentation</A ->. +>. </P ></LI ><LI @@ -251,7 +248,7 @@ CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN2118" +NAME="AEN2306" ></A >B.2.1.1. Bugzilla Database Tables</H3 ><P @@ -322,14 +319,14 @@ CLASS="programlisting" ><P CLASS="literallayout" ><br> - Here's an overview of what each table does. Most columns in each table have<br> + Here's an overview of what each table does. Most columns in each table have<br> descriptive names that make it fairly trivial to figure out their jobs.<br> <br> -attachments: This table stores all attachments to bugs. It tends to be your<br> +attachments: This table stores all attachments to bugs. It tends to be your<br> largest table, yet also generally has the fewest entries because file<br> attachments are so (relatively) large.<br> <br> -bugs: This is the core of your system. The bugs table stores most of the<br> +bugs: This is the core of your system. The bugs table stores most of the<br> current information about a bug, with the exception of the info stored in the<br> other tables.<br> <br> @@ -337,26 +334,26 @@ bugs_activity: This stores information regarding when -- a history file.<br> <br> cc: This tiny table simply stores all the CC information for any bug which has<br> -any entries in the CC field of the bug. Note that, like most other tables in<br> +any entries in the CC field of the bug. Note that, like most other tables in<br> Bugzilla, it does not refer to users by their user names, but by their unique<br> userid, stored as a primary key in the profiles table.<br> <br> components: This stores the programs and components (or products and<br> -components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program"<br> +components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program"<br> (product) field is the full name of the product, rather than some other unique<br> identifier, like bug_id and user_id are elsewhere in the database.<br> <br> dependencies: Stores data about those cool dependency trees.<br> <br> -fielddefs: A nifty table that defines other tables. For instance, when you<br> +fielddefs: A nifty table that defines other tables. For instance, when you<br> submit a form that changes the value of "AssignedTo" this table allows<br> translation to the actual field name "assigned_to" for entry into MySQL.<br> <br> -groups: defines bitmasks for groups. A bitmask is a number that can uniquely<br> -identify group memberships. For instance, say the group that is allowed to<br> +groups: defines bitmasks for groups. A bitmask is a number that can uniquely<br> +identify group memberships. For instance, say the group that is allowed to<br> tweak parameters is assigned a value of "1", the group that is allowed to edit<br> users is assigned a "2", and the group that is allowed to create new groups is<br> -assigned the bitmask of "4". By uniquely combining the group bitmasks (much<br> +assigned the bitmask of "4". By uniquely combining the group bitmasks (much<br> like the chmod command in UNIX,) you can identify a user is allowed to tweak<br> parameters and create groups, but not edit users, by giving him a bitmask of<br> "5", or a user allowed to edit users and create groups, but not tweak<br> @@ -371,15 +368,15 @@ keywords: Unlike what you'd think, this table  associated with which bug id's.<br> <br> logincookies: This stores every login cookie ever assigned to you for every<br> -machine you've ever logged into Bugzilla from. Curiously, it never does any<br> -housecleaning -- I see cookies in this file I've not used for months. However,<br> +machine you've ever logged into Bugzilla from. Curiously, it never does any<br> +housecleaning -- I see cookies in this file I've not used for months. However,<br> since Bugzilla never expires your cookie (for convenience' sake), it makes<br> sense.<br> <br> longdescs: The meat of bugzilla -- here is where all user comments are stored!<br> You've only got 2^24 bytes per comment (it's a mediumtext field), so speak<br> sparingly -- that's only the amount of space the Old Testament from the Bible<br> -would take (uncompressed, 16 megabytes). Each comment is keyed to the<br> +would take (uncompressed, 16 megabytes). Each comment is keyed to the<br> bug_id to which it's attached, so the order is necessarily chronological, for<br> comments are played back in the order in which they are received.<br> <br> @@ -387,12 +384,12 @@ milestones: Interesting that milestones are assoc in this table, but Bugzilla does not yet support differing milestones by<br> product through the standard configuration interfaces.<br> <br> -namedqueries: This is where everybody stores their "custom queries". Very<br> +namedqueries: This is where everybody stores their "custom queries". Very<br> cool feature; it beats the tar out of having to bookmark each cool query you<br> construct.<br> <br> products: What products you have, whether new bug entries are allowed for the<br> -product, what milestone you're working toward on that product, votes, etc. It<br> +product, what milestone you're working toward on that product, votes, etc. It<br> will be nice when the components table supports these same features, so you<br> could close a particular component for bug entry without having to close an<br> entire product...<br> @@ -427,7 +424,7 @@ mysql> show columns from table;<br> mysql> select * from table;<br> <br> -- note: this is a very bad idea to do on, for instance, the "bugs" table if<br> -you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or<br> +you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or<br> 50,000 bugs play across your screen.<br> <br> You can limit the display from above a little with the command, where<br> @@ -440,7 +437,7 @@ mysql> select * from table where (column mysql> select * from table where (column != "some info");<br> <br> Let's take our example from the introduction, and assume you need to change<br> -the word "verified" to "approved" in the resolution field. We know from the<br> +the word "verified" to "approved" in the resolution field. We know from the<br> above information that the resolution is likely to be stored in the "bugs"<br> table. Note we'll need to change a little perl code as well as this database<br> change, but I won't plunge into that in this document. Let's verify the<br> @@ -451,10 +448,10 @@ mysql> show columns from bugs<br> (exceedingly long output truncated here)<br> | bug_status| enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED')||MUL | UNCONFIRMED||<br> <br> - Sorry about that long line. We see from this that the "bug status" column is<br> + Sorry about that long line. We see from this that the "bug status" column is<br> an "enum field", which is a MySQL peculiarity where a string type field can<br> -only have certain types of entries. While I think this is very cool, it's not<br> -standard SQL. Anyway, we need to add the possible enum field entry<br> +only have certain types of entries. While I think this is very cool, it's not<br> +standard SQL. Anyway, we need to add the possible enum field entry<br> 'APPROVED' by altering the "bugs" table.<br> <br> mysql> ALTER table bugs CHANGE bug_status bug_status<br> @@ -470,15 +467,15 @@ mysql> show columns from bugs;<br> <br> you'll see that the bug_status field has an extra "APPROVED" enum that's<br> available! Cool thing, too, is that this is reflected on your query page as<br> -well -- you can query by the new status. But how's it fit into the existing<br> +well -- you can query by the new status. But how's it fit into the existing<br> scheme of things?<br> Looks like you need to go back and look for instances of the word "verified"<br> in the perl code for Bugzilla -- wherever you find "verified", change it to<br> "approved" and you're in business (make sure that's a case-insensitive search).<br> Although you can query by the enum field, you can't give something a status<br> -of "APPROVED" until you make the perl changes. Note that this change I<br> +of "APPROVED" until you make the perl changes. Note that this change I<br> mentioned can also be done by editing checksetup.pl, which automates a lot of<br> -this. But you need to know this stuff anyway, right?<br> +this. But you need to know this stuff anyway, right?<br> </P ></DIV ></DIV diff --git a/docs/html/dbmodify.html b/docs/html/dbmodify.html index 835cf0b4cf018f11b8dd3b9faa0c6173aeb7836f..5d52c3ac81f962f2759f2467508664ad15e17a06 100644 --- a/docs/html/dbmodify.html +++ b/docs/html/dbmodify.html @@ -4,10 +4,9 @@ >Modifying Your Running System</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="The Bugzilla Database" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/disclaimer.html b/docs/html/disclaimer.html index ce2420afa1e9bb99f25e99a8d57a84d5eff3c560..23e2557856404a446dc1aaba417c1245faa79b83 100644 --- a/docs/html/disclaimer.html +++ b/docs/html/disclaimer.html @@ -4,10 +4,9 @@ >Disclaimer</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="About This Guide" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -87,15 +86,15 @@ NAME="disclaimer" </P ><P > All copyrights are held by their respective owners, unless - specifically noted otherwise. Use of a term in this document + specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. </P ><P > Naming of particular products or brands should not be seen as - endorsements, with the exception of the term "GNU/Linux". We + endorsements, with the exception of the term "GNU/Linux". We wholeheartedly endorse the use of GNU/Linux in every situation - where it is appropriate. It is an extremely versatile, stable, + where it is appropriate. It is an extremely versatile, stable, and robust operating system that offers an ideal operating environment for Bugzilla. </P @@ -110,10 +109,10 @@ NAME="disclaimer" documented or fixed in the code, security holes surely exist. Great care should be taken both in the installation and usage of this software. Carefully consider the implications of installing - other network services with Bugzilla. The Bugzilla development + other network services with Bugzilla. The Bugzilla development team members, Netscape Communications, America Online Inc., and any affiliated developers or sponsors assume no liability for - your use of this product. You have the source code to this + your use of this product. You have the source code to this product, and are responsible for auditing it yourself to ensure your security needs are met. </P diff --git a/docs/html/extraconfig.html b/docs/html/extraconfig.html index 0bd60486a847a959d36f43670e41385c1af261a7..ff8540d10dfe0d01ec518124bc4f36bfebc74b2c 100644 --- a/docs/html/extraconfig.html +++ b/docs/html/extraconfig.html @@ -4,10 +4,9 @@ >Optional Additional Configuration</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Installation" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -81,7 +80,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN687" +NAME="AEN832" ></A >4.2.1. Dependency Charts</H2 ><P @@ -145,7 +144,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN702" +NAME="AEN847" ></A >4.2.2. Bug Graphs</H2 ><P @@ -204,7 +203,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN715" +NAME="AEN860" ></A >4.2.3. The Whining Cron</H2 ><P @@ -296,13 +295,12 @@ CLASS="section" NAME="bzldap" ></A >4.2.4. LDAP Authentication</H2 -><P -> <DIV -CLASS="warning" +><DIV +CLASS="note" ><P ></P ><TABLE -CLASS="warning" +CLASS="note" WIDTH="100%" BORDER="0" ><TR @@ -311,23 +309,32 @@ WIDTH="25" ALIGN="CENTER" VALIGN="TOP" ><IMG -SRC="../images/warning.gif" +SRC="../images/note.gif" HSPACE="5" -ALT="Warning"></TD +ALT="Note"></TD ><TD ALIGN="LEFT" VALIGN="TOP" ><P ->This information on using the LDAP - authentication options with Bugzilla is old, and the authors do - not know of anyone who has tested it. Approach with caution. +>LDAP authentication has been rewritten for the 2.18 release of + Bugzilla. It no longer requires the Mozilla::LDAP module and now uses + Net::LDAP instead. This rewrite was part of a larger landing that + allowed for additional authentication schemes to be easily added + (<A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=180642" +TARGET="_top" +>bug + 180642</A +>). + </P +><P +>This patch originally landed in 21-Mar-2003 and was included + in the 2.17.4 development release. </P ></TD ></TR ></TABLE ></DIV -> - </P ><P > The existing authentication scheme for Bugzilla uses email addresses as the primary user ID, and a @@ -346,92 +353,189 @@ VALIGN="TOP" email address, not LDAP username. You still assign bugs by email address, query on users by email address, etc. </P +><DIV +CLASS="caution" ><P ->Using LDAP for Bugzilla authentication requires the - Mozilla::LDAP (aka PerLDAP) Perl module. The - Mozilla::LDAP module in turn requires Netscape's Directory SDK for C. - After you have installed the SDK, then install the PerLDAP module. - Mozilla::LDAP and the Directory SDK for C are both - <A -HREF="http://www.mozilla.org/directory/" +></P +><TABLE +CLASS="caution" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/caution.gif" +HSPACE="5" +ALT="Caution"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Because the Bugzilla account is not created until the first time + a user logs in, a user who has not yet logged is unknown to Bugzilla. + This means they cannot be used as an assignee or QA contact (default or + otherwise), added to any cc list, or any other such operation. One + possible workaround is the <TT +CLASS="filename" +>bugzilla_ldapsync.rb</TT +> + script in the + <A +HREF="glossary.html#gloss-contrib" +><I +CLASS="glossterm" +><TT +CLASS="filename" +>contrib</TT +></I +></A +> directory. Another possible solution is fixing + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=201069" TARGET="_top" ->available for - download</A -> from mozilla.org. - </P +>bug + 201069</A +>. + </P +></TD +></TR +></TABLE +></DIV ><P -> Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP - directory for - authentication. Be very careful when setting up this parameter; if you - set LDAP authentication, but do not have a valid LDAP directory set up, - you will not be able to log back in to Bugzilla once you log out. (If - this happens, you can get back in by manually editing the data/params - file, and setting useLDAP back to 0.) - </P +>Parameters required to use LDAP Authentication:</P ><P ->If using LDAP, you must set the - three additional parameters: Set LDAPserver to the name (and optionally - port) of your LDAP server. If no port is specified, it defaults to the - default port of 389. (e.g "ldap.mycompany.com" or - "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching - for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids - must be unique under the DN specified here. Set LDAPmailattribute to - the name of the attribute in your LDAP directory which contains the - primary email address. On most directory servers available, this is - "mail", but you may need to change this. - </P +></P +><DIV +CLASS="variablelist" +><DL +><DT +><A +NAME="param-loginmethod" +></A +>loginmethod</DT +><DD ><P ->You can also try using <A -HREF="http://www.openldap.org/" -TARGET="_top" -> OpenLDAP</A -> with Bugzilla, using any of a number of administration - tools. You should apply the patch attached this bug: - <A -HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=158630" -TARGET="_top" -> http://bugzilla.mozilla.org/show_bug.cgi?id=158630</A ->, then set - the following object classes for your users: - - <P +>This parameter should be set to <SPAN +CLASS="QUOTE" +>"LDAP"</SPAN +> + <EM +>only</EM +> if you will be using an LDAP directory + for authentication. If you set this param to <SPAN +CLASS="QUOTE" +>"LDAP"</SPAN +> but + fail to set up the other parameters listed below you will not be + able to log back in to Bugzilla one you log out. If this happens + to you, you will need to manually edit + <TT +CLASS="filename" +>data/params</TT +> and set loginmethod to + <SPAN +CLASS="QUOTE" +>"DB"</SPAN +>. + </P +></DD +><DT +><A +NAME="param-LDAPserver" +></A +>LDAPserver</DT +><DD +><P +>This parameter should be set to the name (and optionally the + port) of your LDAP server. If no port is specified, it assumes + the default LDAP port of 389. + </P +><P +>Ex. <SPAN +CLASS="QUOTE" +>"ldap.company.com"</SPAN +> + or <SPAN +CLASS="QUOTE" +>"ldap.company.com:3268"</SPAN +> + </P +></DD +><DT +><A +NAME="param-LDAPbinddn" +></A +>LDAPbinddn [Optional]</DT +><DD +><P +>Some LDAP servers will not allow an anonymous bind to search + the directory. If this is the case with your configuration you + should set the LDAPbinddn parameter to the user account Bugzilla + should use instead of the anonymous bind. + </P +><P +>Ex. <SPAN +CLASS="QUOTE" +>"cn=default,cn=user:password"</SPAN ></P -><OL -TYPE="1" -><LI +></DD +><DT +><A +NAME="param-LDAPBaseDN" +></A +>LDAPBaseDN</DT +><DD ><P ->objectClass: person</P -></LI -><LI +>The LDAPBaseDN parameter should be set to the location in + your LDAP tree that you would like to search for e-mail addresses. + Your uids should be unique under the DN specified here. + </P ><P ->objectClass: organizationalPerson</P -></LI -><LI +>Ex. <SPAN +CLASS="QUOTE" +>"ou=People,o=Company"</SPAN +></P +></DD +><DT +><A +NAME="param-LDAPuidattribute" +></A +>LDAPuidattribute</DT +><DD ><P ->objectClass: inetOrgPerson</P -></LI -><LI +>The LDAPuidattribute parameter should be set to the attribute + which contains the unique UID of your users. The value retrieved + from this attribute will be used when attempting to bind as the + user to confirm their password. + </P ><P ->objectClass: top</P -></LI -><LI +>Ex. <SPAN +CLASS="QUOTE" +>"uid"</SPAN +></P +></DD +><DT +><A +NAME="param-LDAPmailattribute" +></A +>LDAPmailattribute</DT +><DD ><P ->objectClass: posixAccount</P -></LI -><LI +>The LDAPmailattribute parameter should be the name of the + attribute which contains the e-mail address your users will enter + into the Bugzilla login boxes. + </P ><P ->objectClass: shadowAccount</P -></LI -></OL -> - - Please note that this patch <EM ->has not</EM -> yet been - accepted by the Bugzilla team, and so you may need to do some - manual tweaking. That said, it looks like Net::LDAP is probably - the way to go in the future. - </P +>Ex. <SPAN +CLASS="QUOTE" +>"mail"</SPAN +></P +></DD +></DL +></DIV ></DIV ><DIV CLASS="section" @@ -448,17 +552,23 @@ NAME="content-type" incorporate the code changes necessary to fulfill the CERT advisory requirements mentioned in <A -HREF="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3" +HREF="http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3" TARGET="_top" -> http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</A +>http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3</A >. - Executing the following code snippet from a UNIX command shell will - rectify the problem if your Bugzilla installation is intended for an - English-speaking audience. As always, be sure your Bugzilla - installation has a good backup before making changes, and I recommend - you understand what the script is doing before executing it.</P + Making the change below will fix the problem if your installation is for + an English speaking audience. + </P ><P -> <TABLE +>Telling Bugzilla to output a charset as part of the HTTP header is + much easier in version 2.18 and higher (including any cvs + pull after 4-May-2003 and development release after 2.17.5) than it was + in previous versions. Simply locate the following line in + <TT +CLASS="filename" +>Bugzilla/CGI.pm</TT +>: + <TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" @@ -468,38 +578,34 @@ WIDTH="100%" COLOR="#000000" ><PRE CLASS="programlisting" -> bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl - </PRE +> # Make sure that we don't send any charset headers + $self->charset(''); + </PRE ></FONT ></TD ></TR ></TABLE > - </P -><P ->All this one-liner command does is search for all instances of - <SPAN -CLASS="QUOTE" ->"Content-type: text/html"</SPAN -> - - and replaces it with - <SPAN -CLASS="QUOTE" ->"Content-Type: text/html; charset=ISO-8859-1"</SPAN + and change it to: + <TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> # Send all data using the ISO-8859-1 charset + $self->charset('ISO-8859-1'); + </PRE +></FONT +></TD +></TR +></TABLE > - - . This specification prevents possible Javascript attacks on the - browser, and is suggested for all English-speaking sites. For - non-English-speaking Bugzilla sites, I suggest changing - <SPAN -CLASS="QUOTE" ->"ISO-8859-1"</SPAN ->, above, to - <SPAN -CLASS="QUOTE" ->"UTF-8"</SPAN ->.</P + </P ><DIV CLASS="note" ><P @@ -523,13 +629,13 @@ VALIGN="TOP" ><P >Using <meta> tags to set the charset is not recommended, as there's a bug in Netscape 4.x which causes pages - marked up in this way to load twice. See + marked up in this way to load twice. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=126266" TARGET="_top" ->bug - 126266</A -> for more information including progress toward making +>bug 126266</A +> + for more information including progress toward making bugzilla charset aware by default. </P ></TD @@ -607,10 +713,10 @@ CLASS="filename" which can limit connections by ip-address. You may download this module at <A -HREF="http://www.snert.com/Software/Throttle/" +HREF="http://www.snert.com/Software/mod_throttle/" TARGET="_top" -> http://www.snert.com/Software/Throttle/</A ->. +>http://www.snert.com/Software/mod_throttle/</A +>. Follow the instructions to install into your Apache install. <EM >This module only functions with the Apache web @@ -624,7 +730,7 @@ CLASS="command" command provided by this module to accomplish this goal. See the <A -HREF="http://www.snert.com/Software/Throttle/" +HREF="http://www.snert.com/Software/mod_throttle/" TARGET="_top" >Module Instructions</A diff --git a/docs/html/faq.html b/docs/html/faq.html index a45b7b7e34b3e89cd106b83497b628a103f7e38c..9ec11cd4060045c2b30858c087acf43eb0addaee 100644 --- a/docs/html/faq.html +++ b/docs/html/faq.html @@ -4,10 +4,9 @@ >The Bugzilla FAQ</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Integrating Bugzilla with Third-Party Tools" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -497,7 +496,7 @@ HREF="faq.html#faq-use-changeaddress" ><DT >A.7.2. <A HREF="faq.html#faq-use-query" -> The query page is very confusing. Isn't there a simpler way to query? +> The query page is very confusing. Isn't there a simpler way to query? </A ></DT ><DT @@ -511,7 +510,7 @@ HREF="faq.html#faq-use-accept" >A.7.4. <A HREF="faq.html#faq-use-attachment" > I can't upload anything into the database via the "Create Attachment" - link. What am I doing wrong? + link. What am I doing wrong? </A ></DT ><DT @@ -520,6 +519,12 @@ HREF="faq.html#faq-use-keyword" > How do I change a keyword in Bugzilla, once some bugs are using it? </A ></DT +><DT +>A.7.6. <A +HREF="faq.html#faq-use-close" +> Why can't I close bugs from the "Change Several Bugs at Once" page? + </A +></DT ></DL ></DD ><DT @@ -587,8 +592,8 @@ CLASS="answer" information at <A HREF="http://www.bugzilla.org/" TARGET="_top" -> http://www.bugzilla.org/</A -> +>http://www.bugzilla.org/</A +>. </P ></DIV ></DIV @@ -616,8 +621,8 @@ CLASS="answer" See details at <A HREF="http://www.mozilla.org/MPL/" TARGET="_top" -> http://www.mozilla.org/MPL/</A -> +>http://www.mozilla.org/MPL/</A +>. </P ></DIV ></DIV @@ -653,7 +658,7 @@ TARGET="_top" > <A HREF="http://www.collab.net/" TARGET="_top" ->www.collab.net</A +>http://www.collab.net/</A > offers Bugzilla as part of their standard offering to large projects. They do have some minimum fees that are pretty hefty, and generally @@ -691,85 +696,26 @@ CLASS="answer" There are <EM >dozens</EM > of major companies with public - Bugzilla sites to track bugs in their products. A few include: - <P -></P -><TABLE -BORDER="0" -><TBODY -><TR -><TD ->Netscape/AOL</TD -></TR -><TR -><TD ->Mozilla.org</TD -></TR -><TR -><TD ->NASA</TD -></TR -><TR -><TD ->Red Hat Software</TD -></TR -><TR -><TD ->SuSe Corp</TD -></TR -><TR -><TD ->The Horde Project</TD -></TR -><TR -><TD ->AbiSource</TD -></TR -><TR -><TD ->Real Time Enterprises, Inc</TD -></TR -><TR -><TD ->Eggheads.org</TD -></TR -><TR -><TD ->Strata Software</TD -></TR -><TR -><TD ->RockLinux</TD -></TR -><TR -><TD ->Creative Labs (makers of SoundBlaster)</TD -></TR -><TR -><TD ->The Apache Foundation</TD -></TR -><TR -><TD ->The Gnome Foundation</TD -></TR -><TR -><TD ->Ximian</TD -></TR -><TR -><TD ->Linux-Mandrake</TD -></TR -></TBODY -></TABLE -><P -></P -> - </P -><P -> Suffice to say, there are more than enough huge projects using Bugzilla - that we can safely say it's extremely popular. + Bugzilla sites to track bugs in their products. We have a fairly + complete list available on our website at + <A +HREF="http://bugzilla.org/installation_list.html" +TARGET="_top" +>http://bugzilla.org/installation_list.html</A +>. If you + have an installation of Bugzilla and would like to be added to the + list, whether it's a public install or not, simply e-mail + Gerv <TT +CLASS="email" +><<A +HREF="mailto:gerv@mozilla.org" +>gerv@mozilla.org</A +>></TT +>. Keep in mind that it's kinda + difficult to get onto the <SPAN +CLASS="QUOTE" +>"high-profile"</SPAN +> list ;). </P ></DIV ></DIV @@ -799,7 +745,7 @@ HREF="http://www.bugzilla.org/who_we_are.html" TARGET="_top" >core team</A >, - led by Dave Miller (justdave@netscape.com). + led by Dave Miller (justdave@bugzilla.org). </P ></DIV ></DIV @@ -863,8 +809,8 @@ CLASS="answer" > </B > It may be that the support has not been built yet, or that you - have not yet found it. Bugzilla is making tremendous strides in - usability, customizability, scalability, and user interface. It + have not yet found it. Bugzilla is making tremendous strides in + usability, customizability, scalability, and user interface. It is widely considered the most complete and popular open-source bug-tracking software in existence. </P @@ -907,16 +853,16 @@ CLASS="answer" </P ><P > There is currently work in progress to make Bugzilla work on - PostgreSQL and Sybase in the default distribution. You can track - the progress of these initiatives in bugs <A + PostgreSQL and Sybase in the default distribution. You can track + the progress of these initiatives in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=98304" TARGET="_top" ->98304</A +>bug 98304</A > and <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=173130" TARGET="_top" ->173130</A +>bug 173130</A > respectively. </P @@ -956,11 +902,11 @@ CLASS="filename" > because when Terry first started writing the code for mozilla.org he needed a version of Perl and other tools that were completely under his - control. This location was abandoned for the 2.18 release in favor + control. This location was abandoned for the 2.18 release in favor of the more sensible <TT CLASS="filename" >/usr/bin/perl</TT ->. If you +>. If you installed an older verion of Bugzilla and created the symlink we suggested, you can remove it now (provided that you don't have anything else, such as Bonsai, using it and you don't intend to @@ -993,7 +939,7 @@ CLASS="answer" > </B > Yes, the following bit of perl magic will change all the shebang - lines. Be sure to change <TT + lines. Be sure to change <TT CLASS="filename" >/usr/local/bin/perl</TT > @@ -1100,7 +1046,7 @@ CLASS="answer" ><B > </B > - It is web and e-mail based. You can edit bugs by sending specially + It is web and e-mail based. You can edit bugs by sending specially formatted email to a properly configured Bugzilla, or control via the web. </P ></DIV @@ -1203,7 +1149,7 @@ CLASS="answer" > </B > Yes - any sort of attachment is allowed, although administrators can - configure a maximum size. + configure a maximum size. Bugzilla gives the user the option of either using the MIME-type supplied by the browser, choosing from a pre-defined list or manually typing any arbitrary MIME-type. @@ -1232,17 +1178,17 @@ CLASS="answer" ><B > </B > - Yes. However, modifying some fields, notably those related to bug + Yes. However, modifying some fields, notably those related to bug progression states, also require adjusting the program logic to compensate for the change. </P ><P > There is no GUI for adding fields to Bugzilla at this - time. You can follow development of this feature at + time. You can follow development of this feature in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=91037" TARGET="_top" ->http://bugzilla.mozilla.org/show_bug.cgi?id=91037</A +>bug 91037</A > </P ></DIV @@ -1268,12 +1214,12 @@ CLASS="answer" ><B > </B > - Yes. Look at <A + Yes. Look at <A HREF="http://bugzilla.mozilla.org/report.cgi" TARGET="_top" -> http://bugzilla.mozilla.org/report.cgi</A -> for samples of what - Bugzilla can do in reporting and graphing. +>http://bugzilla.mozilla.org/report.cgi</A +> + for samples of what Bugzilla can do in reporting and graphing. </P ><P > If you can not get the reports you want from the included reporting @@ -1306,7 +1252,7 @@ CLASS="answer" ><B > </B > - Email notification is user-configurable. By default, the bug id and + Email notification is user-configurable. By default, the bug id and Summary of the bug report accompany each email notification, along with a list of the changes made. </P @@ -1384,7 +1330,7 @@ VALIGN="TOP" > If you decide to use the bugzilla_email integration features to allow Bugzilla to record responses to mail with the associated bug, you may need to caution your users to set their mailer to "respond - to messages in the format in which they were sent". For security reasons + to messages in the format in which they were sent". For security reasons Bugzilla ignores HTML tags in comments, and if a user sends HTML-based email into Bugzilla the resulting comment looks downright awful. </P @@ -1421,7 +1367,7 @@ CLASS="answer" > Bugzilla can output buglists as HTML (the default), CSV or RDF. The link for CSV can be found at the bottom of the buglist in HTML - format. This CSV format can easily be imported into MS Excel or + format. This CSV format can easily be imported into MS Excel or other spread-sheet applications. </P ><P @@ -1429,7 +1375,7 @@ CLASS="answer" <TT CLASS="computeroutput" >&ctype=rdf</TT -> to the URL. RDF +> to the URL. RDF is meant to be machine readable and thus it is assumed that the URL would be generated progmatically so there is no user visible link to this format. @@ -1479,15 +1425,15 @@ CLASS="answer" ><B > </B > - Yes. For more information including available translated templates, + Yes. For more information including available translated templates, see <A HREF="http://www.bugzilla.org/download.html#localizations" TARGET="_top" >http://www.bugzilla.org/download.html#localizations</A >. The admin interfaces are still not included in these translated - templates and is therefore still English only. Also, there may be - issues with the charset not being declared. See <A + templates and is therefore still English only. Also, there may be + issues with the charset not being declared. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=126266" TARGET="_top" >bug 126226</A @@ -1517,7 +1463,7 @@ CLASS="answer" ><B > </B > - Yes. No. Yes (using the CSV format). + Yes. No. Yes (using the CSV format). </P ></DIV ></DIV @@ -1542,7 +1488,7 @@ CLASS="answer" ><B > </B > - You have no idea. Bugzilla's query interface, particularly with the + You have no idea. Bugzilla's query interface, particularly with the advanced Boolean operators, is incredibly versatile. </P ></DIV @@ -1569,7 +1515,7 @@ CLASS="answer" ><B > </B > - Bugzilla does not lock records. It provides mid-air collision detection, + Bugzilla does not lock records. It provides mid-air collision detection, and offers the offending user a choice of options to deal with the conflict. </P ></DIV @@ -1599,8 +1545,8 @@ CLASS="answer" at <A HREF="http://www.mysql.com/doc/B/a/Backup.html" TARGET="_top" -> http://www.mysql.com/doc/B/a/Backup.html</A -> +>http://www.mysql.com/doc/B/a/Backup.html</A +>. </P ></DIV ></DIV @@ -1624,8 +1570,8 @@ CLASS="answer" ><B > </B > - Yes. However, commits to the database must wait - until the tables are unlocked. Bugzilla databases are typically + Yes. However, commits to the database must wait + until the tables are unlocked. Bugzilla databases are typically very small, and backups routinely take less than a minute. </P ></DIV @@ -1659,7 +1605,7 @@ CLASS="answer" </P ><P > Commercial Bug-tracking software typically costs somewhere upwards - of $20,000 or more for 5-10 floating licenses. Bugzilla consultation + of $20,000 or more for 5-10 floating licenses. Bugzilla consultation is available from skilled members of the newsgroup. Simple questions are answered there and then. </P @@ -1689,9 +1635,9 @@ CLASS="answer" ><B > </B > - It all depends on your level of commitment. Someone with much Bugzilla + It all depends on your level of commitment. Someone with much Bugzilla experience can get you up and running in less than a day, and - your Bugzilla install can run untended for years. If your + your Bugzilla install can run untended for years. If your Bugzilla strategy is critical to your business workflow, hire somebody with reasonable UNIX or Perl skills to handle your process management and bug-tracking maintenance & customization. @@ -1719,7 +1665,7 @@ CLASS="answer" ><B > </B > - No. MySQL asks, if you find their product valuable, that you purchase + No. MySQL asks, if you find their product valuable, that you purchase a support contract from them that suits your needs. </P ></DIV @@ -1753,7 +1699,7 @@ CLASS="answer" ><B > </B > - Run MySQL like this: "mysqld --skip-grant-tables". Please remember <EM + Run MySQL like this: "mysqld --skip-grant-tables". Please remember <EM >this makes MySQL as secure as taping a $100 to the floor of a football stadium bathroom for safekeeping.</EM @@ -1902,11 +1848,11 @@ CLASS="answer" ><B > </B > - Try Klaas Freitag's excellent patch for "whineatassigned" functionality. - You can find it at <A + Try Klaas Freitag's excellent patch for "whineatassigned" + functionality. You can find it in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=6679" TARGET="_top" ->http://bugzilla.mozilla.org/show_bug.cgi?id=6679</A +>bug 6679</A >. This patch is against an older version of Bugzilla, so you must apply the diffs manually. @@ -1938,7 +1884,7 @@ CLASS="answer" You can call bug_email.pl directly from your aliases file, with an entry like this: <A -NAME="AEN1886" +NAME="AEN2067" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -1949,7 +1895,7 @@ CLASS="BLOCKQUOTE" > However, this is fairly nasty and subject to problems; you also need to set up your smrsh (sendmail restricted shell) to allow - it. In a pinch, though, it can work. + it. In a pinch, though, it can work. </P ></DIV ></DIV @@ -2066,7 +2012,7 @@ CLASS="answer" </P ><P > If you never receive mail from Bugzilla, chances you do not have - sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked + sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked to, "/usr/lib/sendmail". </P ></DIV @@ -2101,7 +2047,7 @@ CLASS="answer" > Red Hat's old version of Bugzilla (based on 2.8) worked on Oracle. Red Hat's newer version (based on 2.17.1 and soon to be merged into - the main distribution) runs on PostgreSQL. At this time we know of + the main distribution) runs on PostgreSQL. At this time we know of no recent ports of Bugzilla to Oracle but do intend to support it in the future (possibly the 2.20 time-frame). </P @@ -2140,15 +2086,15 @@ CLASS="filename" it finishes without errors, you're <EM >probably</EM -> OK. If it doesn't come back +> OK. If it doesn't come back OK (i.e. any red letters), there are certain things - Bugzilla can recover from and certain things it can't. If + Bugzilla can recover from and certain things it can't. If it can't auto-recover, I hope you're familiar with mysqladmin commands or have installed another way to - manage your database. Sanity Check, although it is a good + manage your database. Sanity Check, although it is a good basic check on your database integrity, by no means is a substitute for competent database administration and - avoiding deletion of data. It is not exhaustive, and was + avoiding deletion of data. It is not exhaustive, and was created to do a basic check for the most common problems in Bugzilla databases. </P @@ -2181,7 +2127,7 @@ CLASS="command" >mysql</B > command line utility to manually insert, delete and modify table - information. There are also more intuitive GUI clients available. + information. There are also more intuitive GUI clients available. Personal favorites of the Bugzilla team are <A HREF="http://www.phpmyadmin.net/" TARGET="_top" @@ -2277,7 +2223,7 @@ CLASS="answer" ><B > </B > - Well, you can synchronize or you can move bugs. Synchronization will + Well, you can synchronize or you can move bugs. Synchronization will only work one way -- you can create a read-only copy of the database at one site, and have it regularly updated at intervals from the main database. @@ -2347,8 +2293,8 @@ CLASS="answer" ><B > </B > - Not currently. Bundle::Bugzilla enormously simplifies Bugzilla - installation on UNIX systems. If someone can volunteer to + Not currently. Bundle::Bugzilla enormously simplifies Bugzilla + installation on UNIX systems. If someone can volunteer to create a suitable PPM bundle for Win32, it would be appreciated. </P ></DIV @@ -2382,7 +2328,7 @@ CLASS="answer" ><P > Microsoft has some advice on this matter, as well: <A -NAME="AEN1969" +NAME="AEN2150" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" @@ -2463,10 +2409,10 @@ CLASS="command" I reckon TimeDate and Data::Dumper come with the activeperl. You can check the ActiveState site for packages for installation through PPM. <A -HREF=" http://www.activestate.com/Packages/" +HREF="http://www.activestate.com/Packages/" TARGET="_top" -> http://www.activestate.com/Packages/</A -> +>http://www.activestate.com/Packages/</A +>. </P ></DIV ></DIV @@ -2514,7 +2460,7 @@ NAME="faq-use-query" ><B >A.7.2. </B > - The query page is very confusing. Isn't there a simpler way to query? + The query page is very confusing. Isn't there a simpler way to query? </P ></DIV ><DIV @@ -2551,8 +2497,7 @@ CLASS="answer" > </B > The current behavior is acceptable to bugzilla.mozilla.org and most - users. You have your choice of patches - to change this behavior, however. + users. You have your choice of patches to change this behavior, however. <P ></P ><TABLE @@ -2579,8 +2524,8 @@ TARGET="_top" ><P ></P > - Note that these patches are somewhat dated. You will need to apply - them manually. + Note that these patches are somewhat dated. You will need to apply + them manually. </P ></DIV ></DIV @@ -2596,7 +2541,7 @@ NAME="faq-use-attachment" >A.7.4. </B > I can't upload anything into the database via the "Create Attachment" - link. What am I doing wrong? + link. What am I doing wrong? </P ></DIV ><DIV @@ -2606,7 +2551,7 @@ CLASS="answer" > </B > The most likely cause is a very old browser or a browser that is - incompatible with file upload via POST. Download the latest Netscape, + incompatible with file upload via POST. Download the latest Netscape, Microsoft, or Mozilla browser to handle uploads correctly. </P ></DIV @@ -2632,11 +2577,48 @@ CLASS="answer" > </B > In the Bugzilla administrator UI, edit the keyword and it will let you - replace the old keyword name with a new one. This will cause a problem - with the keyword cache. Run sanitycheck.cgi to fix it. + replace the old keyword name with a new one. This will cause a problem + with the keyword cache. Run sanitycheck.cgi to fix it. </P ></DIV ></DIV +><DIV +CLASS="qandaentry" +><DIV +CLASS="question" +><P +><A +NAME="faq-use-close" +></A +><B +>A.7.6. </B +> + Why can't I close bugs from the "Change Several Bugs at Once" page? + </P +></DIV +><DIV +CLASS="answer" +><P +><B +> </B +> + The logic flow currently used is RESOLVED, then VERIFIED, then CLOSED. + You <EM +>can</EM +> mass-CLOSE bugs from the change several + bugs at once page. <EM +>but</EM +>, every bug listed on the + page has to be in VERIFIED state before the control to do it will show + up on the form. You can also mass-VERIFY, but every bug listed has to be + RESOLVED in order for the control to show up on the form. The logic + behind this is that if you pick one of the bugs that's not VERIFIED and + try to CLOSE it, the bug change will fail miserably (thus killing any + changes in the list after it while doing the bulk change) so it doesn't + even give you the choice. + </P +></DIV +></DIV ></DIV ><DIV CLASS="qandadiv" @@ -2666,7 +2648,7 @@ CLASS="answer" > </B > Gerv and Myk suggest a 2-space indent, with embedded code sections on - their own line, in line with outer tags. Like this:</P + their own line, in line with outer tags. Like this:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" @@ -2701,7 +2683,7 @@ CLASS="programlisting" ><P >Please note that many have differing opinions on this subject, and the existing templates in Bugzilla espouse both this and a 4-space - style. Either is acceptable; the above is preferred.</P + style. Either is acceptable; the above is preferred.</P ></DIV ></DIV ><DIV @@ -2739,7 +2721,7 @@ TARGET="_top" >here</A >. This list includes bugs for the 2.18 release that have already - been fixed and checked into CVS. Please consult the + been fixed and checked into CVS. Please consult the <A HREF="http://www.bugzilla.org/" TARGET="_top" @@ -2771,14 +2753,13 @@ CLASS="answer" ><B > </B > - This is well-documented here: <A + This is well-documented in <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=49862" TARGET="_top" -> http://bugzilla.mozilla.org/show_bug.cgi?id=49862</A ->. Ultimately, it's as easy - as adding the "---" priority field to your localconfig file in the appropriate area, - re-running checksetup.pl, and then changing the default priority in your browser using - "editparams.cgi". +> bug 49862</A +>. Ultimately, it's as easy as adding the "---" priority field to your + localconfig file in the appropriate area, re-running checksetup.pl, and then changing the + default priority in your browser using "editparams.cgi". </P ></DIV ></DIV @@ -2827,7 +2808,7 @@ TARGET="_top" or new source file by clicking "Create a new attachment" link on the bug page you've just created, and include any descriptions of database changes you may make, into the bug - ID you submitted in step #1. Be sure and click the "Patch" checkbox + ID you submitted in step #1. Be sure and click the "Patch" checkbox to indicate the text you are sending is a patch! </P ></LI @@ -2835,7 +2816,7 @@ TARGET="_top" ><P > Announce your patch and the associated URL (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in - the newsgroup (netscape.public.mozilla.webtools). You'll get a really + the newsgroup (netscape.public.mozilla.webtools). You'll get a really good, fairly immediate reaction to the implications of your patch, which will also give us an idea how well-received the change would be. diff --git a/docs/html/gfdl-0.html b/docs/html/gfdl-0.html index 867d140211def0b6f5eb4279217a195bbdf4303d..7b74083107fc82fcc867515a9eb2fd4b47f12836 100644 --- a/docs/html/gfdl-0.html +++ b/docs/html/gfdl-0.html @@ -4,10 +4,9 @@ >PREAMBLE</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-1.html b/docs/html/gfdl-1.html index cd5763be95a62c369419152ab4d35e4c57574784..45a1d994a64044acc15cddfca658bf0acda4409b 100644 --- a/docs/html/gfdl-1.html +++ b/docs/html/gfdl-1.html @@ -4,10 +4,9 @@ >APPLICABILITY AND DEFINITIONS</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-10.html b/docs/html/gfdl-10.html index 4a14d7c6294ed3cbba5dc0cf1a10125e475e7324..080f8b7f8ef490cf4633743b42e40169770c5a83 100644 --- a/docs/html/gfdl-10.html +++ b/docs/html/gfdl-10.html @@ -4,10 +4,9 @@ >FUTURE REVISIONS OF THIS LICENSE</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -84,10 +83,8 @@ NAME="gfdl-10" <A HREF="http://www.gnu.org/copyleft/" TARGET="_top" -> http://www.gnu.org/copyleft/</A -> - - .</P +>http://www.gnu.org/copyleft/</A +>.</P ><P >Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of diff --git a/docs/html/gfdl-2.html b/docs/html/gfdl-2.html index 7edc97514eb164d62875a61582977e93562602aa..bd6c41c3ff38dbdb981c83ef637cf4acc53dd521 100644 --- a/docs/html/gfdl-2.html +++ b/docs/html/gfdl-2.html @@ -4,10 +4,9 @@ >VERBATIM COPYING</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-3.html b/docs/html/gfdl-3.html index 81355bbdb1c70584f6296e3a9e51015c7fbf684f..0db6ed8afe2de226c998f8a641c60a8f35823c63 100644 --- a/docs/html/gfdl-3.html +++ b/docs/html/gfdl-3.html @@ -4,10 +4,9 @@ >COPYING IN QUANTITY</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-4.html b/docs/html/gfdl-4.html index 47176bd395e93d161d7bd835e2fbe1af97ddc10c..c5d7d5957a03da19c64d19d0c3d6a3eebf7fd43b 100644 --- a/docs/html/gfdl-4.html +++ b/docs/html/gfdl-4.html @@ -4,10 +4,9 @@ >MODIFICATIONS</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-5.html b/docs/html/gfdl-5.html index e5ca8972af8656c9ad5c3e276f56615d4bd2e69c..eed6fc5c409ef4265d55a4961ef3102c15f3aca6 100644 --- a/docs/html/gfdl-5.html +++ b/docs/html/gfdl-5.html @@ -4,10 +4,9 @@ >COMBINING DOCUMENTS</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-6.html b/docs/html/gfdl-6.html index b0bca86c5e24b92cc3bf99d60d6ea4bc286d2aca..724af41baed9a5e06f8dc10c136f28ceffacfa83 100644 --- a/docs/html/gfdl-6.html +++ b/docs/html/gfdl-6.html @@ -4,10 +4,9 @@ >COLLECTIONS OF DOCUMENTS</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-7.html b/docs/html/gfdl-7.html index b9742e57d69cc8f28052a85e8cfacb40edadad1f..d22a95f7f5e69f125f4e8dc8e0392d8583dff679 100644 --- a/docs/html/gfdl-7.html +++ b/docs/html/gfdl-7.html @@ -4,10 +4,9 @@ >AGGREGATION WITH INDEPENDENT WORKS</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-8.html b/docs/html/gfdl-8.html index fe770bf335ec4eaa4ed3a385d40f9d4ceca818da..8b89b2fed4a637e26fc3d8bc09ad17c51a6d3e47 100644 --- a/docs/html/gfdl-8.html +++ b/docs/html/gfdl-8.html @@ -4,10 +4,9 @@ >TRANSLATION</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-9.html b/docs/html/gfdl-9.html index 9574a7e4bf708f45fb3600928fc0b9face4cc176..b23394dc6d84eb00dcbb5cefc7eaacfac567c570 100644 --- a/docs/html/gfdl-9.html +++ b/docs/html/gfdl-9.html @@ -4,10 +4,9 @@ >TERMINATION</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/gfdl-howto.html b/docs/html/gfdl-howto.html index 5ba320953b1cf2f77fe976f7f2668e4556bb4cf0..1a45954f3dd71f6a24404d11a3dcb9908d9ab43c 100644 --- a/docs/html/gfdl-howto.html +++ b/docs/html/gfdl-howto.html @@ -4,10 +4,9 @@ >How to use this License for your documents</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="GNU Free Documentation License" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -81,7 +80,7 @@ NAME="gfdl-howto" of the License in the document and put the following copyright and license notices just after the title page:</P ><A -NAME="AEN2296" +NAME="AEN2484" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" diff --git a/docs/html/gfdl.html b/docs/html/gfdl.html index 367e5c33af277a4f0de60c1e7df363d9128a9f7a..55e19a9d67344985ed03239cb217a7491c4064e0 100644 --- a/docs/html/gfdl.html +++ b/docs/html/gfdl.html @@ -4,10 +4,9 @@ >GNU Free Documentation License</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="SourceForge" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -144,7 +143,7 @@ HREF="gfdl-howto.html" ><P >Version 1.1, March 2000</P ><A -NAME="AEN2206" +NAME="AEN2394" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" diff --git a/docs/html/glossary.html b/docs/html/glossary.html index 3894e8a9b6cc37e6b13551ef6085adbad73a4ca7..1eb4e732b8000b31de8bf18d0d08a51abb240951 100644 --- a/docs/html/glossary.html +++ b/docs/html/glossary.html @@ -4,10 +4,9 @@ >Glossary</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="How to use this License for your documents" @@ -31,7 +30,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -70,7 +69,7 @@ CLASS="glossdiv" ><H1 CLASS="glossdiv" ><A -NAME="AEN2301" +NAME="AEN2489" ></A >0-9, high ascii</H1 ><DL @@ -353,13 +352,9 @@ NAME="gloss-component" NAME="gloss-cpan" ></A ><B -> <SPAN -CLASS="acronym" ->CPAN</SPAN -> - </B +>Comprehensive Perl Archive Network</B ></DT -><DD +> (CPAN)<DD ><P > <SPAN CLASS="acronym" @@ -379,6 +374,62 @@ CLASS="glossterm" modules - encapsulated chunks of code for performing a particular task.</P ></DD +><DT +><A +NAME="gloss-contrib" +></A +><B +><TT +CLASS="filename" +>contrib</TT +></B +></DT +><DD +><P +>The <TT +CLASS="filename" +>contrib</TT +> directory is + a location to put scripts that have been contributed to Bugzilla but + are not a part of the official distribution. These scripts are written + by third parties and may be in languages other than perl. For those + that are in perl, there may be additional modules or other requirements + than those of the offical distribution. + <DIV +CLASS="note" +><P +></P +><TABLE +CLASS="note" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Scripts in the <TT +CLASS="filename" +>contrib</TT +> + directory are not offically supported by the Bugzilla team and may + break in between versions. + </P +></TD +></TR +></TABLE +></DIV +> + </P +></DD ></DL ></DIV ><DIV @@ -600,6 +651,22 @@ NAME="gloss-p" >P</H1 ><DL ><DT +><A +NAME="gloss-ppm" +></A +><B +>Perl Package Manager</B +></DT +> (PPM)<DD +><P +><A +HREF="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/" +TARGET="_top" +>http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/</A +> + </P +></DD +><DT ><B >Product</B ></DT @@ -697,6 +764,23 @@ NAME="gloss-rdbms" that stores information in tables that are related to each other. </P ></DD +><DT +><A +NAME="gloss-regexp" +></A +><B +>Regular Expression</B +></DT +> (regexp)<DD +><P +>A regular expression is an expression used for pattern matching. + <A +HREF="http://perldoc.com/perl5.6/pod/perlre.html#Regular-Expressions" +TARGET="_top" +>Documentation</A +> + </P +></DD ></DL ></DIV ><DIV @@ -849,7 +933,7 @@ NAME="gloss-zarro" Terry had the following to say: </P ><A -NAME="AEN2515" +NAME="AEN2724" ></A ><TABLE BORDER="0" diff --git a/docs/html/groups.html b/docs/html/groups.html index dc326202ca095e7f2c9f93a7795c07f6d0609486..2f54154778a8da9f688a3f692860c1eaa109599c 100644 --- a/docs/html/groups.html +++ b/docs/html/groups.html @@ -4,10 +4,9 @@ >Groups and Group Security</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/hintsandtips.html b/docs/html/hintsandtips.html index 397c86065cf2f5281ee6936c508659b85ef41be2..c3b2ed8e4d9ad41c89b04100630273b30a2d671f 100644 --- a/docs/html/hintsandtips.html +++ b/docs/html/hintsandtips.html @@ -4,10 +4,9 @@ >Hints and Tips</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Using Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -84,7 +83,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN370" +NAME="AEN407" ></A >3.2.1. Autolinkification</H2 ><P @@ -232,7 +231,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN399" +NAME="AEN436" ></A >3.2.5. Filing Bugs</H2 ><P diff --git a/docs/html/how.html b/docs/html/how.html index 1ff255e2c4b25f604f64c3137a506681c02228f3..9b0f26f485a3f65c77c35fe9744965ec3f47cd91 100644 --- a/docs/html/how.html +++ b/docs/html/how.html @@ -4,10 +4,9 @@ >How do I use Bugzilla?</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Using Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -105,8 +104,8 @@ NAME="myaccount" <A HREF="http://landfill.bugzilla.org/bugzilla-tip/" TARGET="_top" -> http://landfill.bugzilla.org/bugzilla-tip/</A -> +>http://landfill.bugzilla.org/bugzilla-tip/</A +>. </P ><P ></P @@ -441,25 +440,20 @@ NAME="query" <A HREF="http://landfill.bugzilla.org/bugzilla-tip/query.cgi" TARGET="_top" -> landfill.bugzilla.org/bugzilla-tip/query.cgi</A -> - - .</P +>http://landfill.bugzilla.org/bugzilla-tip/query.cgi</A +>.</P ><P >The Search page has controls for selecting different possible - values for all of the fields in a bug, as described above. Once you've - defined a search, you can either run it, or save it as a Remembered - Query, which can optionally appear in the footer of your pages.</P + values for all of the fields in a bug, as described above. For some + fields, multiple values can be selected. In those cases, Bugzilla + returns bugs where the content of the field matches one of the selected + values. If none is selected, then the field can take any value.</P ><P ->Highly advanced querying is done using Boolean Charts, which have - their own - <A -HREF="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html" -TARGET="_top" -> context-sensitive help</A -> - - .</P +>Once you've defined a search, you can either run it, or save it + as a Remembered Query, which can optionally appear in the footer of + your pages.</P +><P +>Highly advanced querying is done using Boolean Charts.</P ></DIV ><DIV CLASS="section" @@ -595,6 +589,172 @@ TARGET="_top" ></LI ></OL ></DIV +><DIV +CLASS="section" +><H2 +CLASS="section" +><A +NAME="patchviewer" +></A +>3.1.6. Patch Viewer</H2 +><P +>Viewing and reviewing patches in Bugzilla is often difficult due to + lack of context, improper format and the inherent readability issues that + raw patches present. Patch Viewer is an enhancement to Bugzilla designed + to fix that by offering increased context, linking to sections, and + integrating with Bonsai, LXR and CVS.</P +><P +>Patch viewer allows you to:</P +><P +></P +><TABLE +BORDER="0" +><TBODY +><TR +><TD +>View patches in color, with side-by-side view rather than trying + to interpret the contents of the patch.</TD +></TR +><TR +><TD +>See the difference between two patches.</TD +></TR +><TR +><TD +>Get more context in a patch.</TD +></TR +><TR +><TD +>Collapse and expand sections of a patch for easy + reading.</TD +></TR +><TR +><TD +>Link to a particular section of a patch for discussion or + review</TD +></TR +><TR +><TD +>Go to Bonsai or LXR to see more context, blame, and + cross-references for the part of the patch you are looking at</TD +></TR +><TR +><TD +>Create a rawtext unified format diff out of any patch, no + matter what format it came from</TD +></TR +></TBODY +></TABLE +><P +></P +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_view" +></A +>3.1.6.1. Viewing Patches in Patch Viewer</H3 +><P +>The main way to view a patch in patch viewer is to click on the + "Diff" link next to a patch in the Attachments list on a bug. You may + also do this within the edit window by clicking the "View Attachment As + Diff" button in the Edit Attachment screen.</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_diff" +></A +>3.1.6.2. Seeing the Difference Between Two Patches</H3 +><P +>To see the difference between two patches, you must first view the + newer patch in Patch Viewer. Then select the older patch from the + dropdown at the top of the page ("Differences between [dropdown] and + this patch") and click the "Diff" button. This will show you what + is new or changed in the newer patch.</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_context" +></A +>3.1.6.3. Getting More Context in a Patch</H3 +><P +>To get more context in a patch, you put a number in the textbox at + the top of Patch Viewer ("Patch / File / [textbox]") and hit enter. + This will give you that many lines of context before and after each + change. Alternatively, you can click on the "File" link there and it + will show each change in the full context of the file. This feature only + works against files that were diffed using "cvs diff".</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_collapse" +></A +>3.1.6.4. Collapsing and Expanding Sections of a Patch</H3 +><P +>To view only a certain set of files in a patch (for example, if a + patch is absolutely huge and you want to only review part of it at a + time), you can click the "(+)" and "(-)" links next to each file (to + expand it or collapse it). If you want to collapse all files or expand + all files, you can click the "Collapse All" and "Expand All" links at the + top of the page.</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_link" +></A +>3.1.6.5. Linking to a Section of a Patch</H3 +><P +>To link to a section of a patch (for example, if you want to be + able to give someone a URL to show them which part you are talking + about) you simply click the "Link Here" link on the section header. The + resulting URL can be copied and used in discussion. (Copy Link + Location in Mozilla works as well.)</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_bonsai_lxr" +></A +>3.1.6.6. Going to Bonsai and LXR</H3 +><P +>To go to Bonsai to get blame for the lines you are interested in, + you can click the "Lines XX-YY" link on the section header you are + interested in. This works even if the patch is against an old + version of the file, since Bonsai stores all versions of the file.</P +><P +>To go to LXR, you click on the filename on the file header + (unfortunately, since LXR only does the most recent version, line + numbers are likely to rot).</P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="patchviewer_unified_diff" +></A +>3.1.6.7. Creating a Unified Diff</H3 +><P +>If the patch is not in a format that you like, you can turn it + into a unified diff format by clicking the "Raw Unified" link at the top + of the page.</P +></DIV +></DIV ></DIV ><DIV CLASS="NAVFOOTER" diff --git a/docs/html/http.html b/docs/html/http.html index 38c8b2956e4572acff2eff25409733560adbb109..8f3b76d05e770bdab9338cc10053f94526169153 100644 --- a/docs/html/http.html +++ b/docs/html/http.html @@ -4,10 +4,9 @@ >HTTP Server Configuration</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Installation" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -120,7 +119,7 @@ CLASS="command" >./checksetup.pl</B > (shown in <A HREF="http.html#http-apache-htaccess" ->Example 4-1</A +>Example 4-2</A > for the curious) are allowed to override Apache's normal access permissions or else important password information may be exposed to the @@ -241,7 +240,7 @@ NAME="http-apache-htaccess" ></A ><P ><B ->Example 4-1. <TT +>Example 4-2. <TT CLASS="filename" >.htaccess</TT > files for Apache</B @@ -420,7 +419,7 @@ CLASS="productname" <A HREF="http://support.microsoft.com/support/kb/articles/Q245/2/25.asp" TARGET="_top" ->Q245225 </A +>Q245225</A > for <SPAN CLASS="productname" @@ -552,12 +551,11 @@ VALIGN="TOP" <TT CLASS="filename" >localconfig</TT ->. For more information, see +>. For more information, see <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=186383" TARGET="_top" ->bug - 186383</A +> bug 186383</A > or <A HREF="http://online.securityfocus.com/bid/6501" TARGET="_top" diff --git a/docs/html/index.html b/docs/html/index.html index 3cabc43e5bfdebd7f447a750bf1913398d1e7ffe..3c91d11aaf7d9e52b873a35dcb8af1f7e1dcb921 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -1,11 +1,10 @@ <HTML ><HEAD ><TITLE ->The Bugzilla Guide - 2.17.4 Development Release</TITLE +>The Bugzilla Guide - 2.17.5 Development Release</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="NEXT" TITLE="About This Guide" HREF="about.html"><META @@ -46,7 +45,7 @@ CLASS="title" ><A NAME="AEN2" ></A ->The Bugzilla Guide - 2.17.4 Development Release</H1 +>The Bugzilla Guide - 2.17.5 Development Release</H1 ><H3 CLASS="author" ><A @@ -64,7 +63,7 @@ CLASS="corpauthor" >The Bugzilla Team</H3 ><P CLASS="pubdate" ->2003-04-23<BR></P +>2003-11-01<BR></P ><DIV ><DIV CLASS="abstract" @@ -88,7 +87,7 @@ NAME="AEN14" HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation" TARGET="_top" >Bugzilla Documentation</A -> compontent. +> component. </P ><P >This is a development version of this guide. Information in it @@ -96,6 +95,14 @@ TARGET="_top" (which will correspond with the 2.18 release of Bugzilla). </P ><P +> The most current version of this document can always be found on the + <A +HREF="http://www.bugzilla.org/documentation.html" +TARGET="_top" +>Bugzilla Documentation Page</A +>. + </P +><P ></P ></DIV ></DIV @@ -451,11 +458,16 @@ CLASS="LOT" ></DT ><DT >4-1. <A +HREF="stepbystep.html#install-mysql-packets" +>Set Max Packet Size in MySQL</A +></DT +><DT +>4-2. <A HREF="troubleshooting.html#trouble-filetemp-errors" >Other File::Temp error messages</A ></DT ><DT ->4-2. <A +>4-3. <A HREF="troubleshooting.html#trouble-filetemp-patch" >Patch for File::Temp in Perl 5.6.0</A ></DT @@ -471,6 +483,11 @@ CLASS="LOT" ></DT ><DT >4-1. <A +HREF="stepbystep.html#install-perlmodules-cpan" +>Installing perl modules with CPAN</A +></DT +><DT +>4-2. <A HREF="http.html#http-apache-htaccess" ><TT CLASS="filename" diff --git a/docs/html/installation.html b/docs/html/installation.html index f3cf6892ea28d77df3146a670418d08f4c963159..ac764366b138d002d6eabc9b028a15539702e95e 100644 --- a/docs/html/installation.html +++ b/docs/html/installation.html @@ -4,10 +4,9 @@ >Installation</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="User Preferences" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -88,55 +87,45 @@ HREF="stepbystep.html" ><DL ><DT >4.1.1. <A -HREF="stepbystep.html#intstall-into" ->Introduction</A -></DT -><DT ->4.1.2. <A -HREF="stepbystep.html#install-package-list" ->Package List</A -></DT -><DT ->4.1.3. <A HREF="stepbystep.html#install-mysql" >MySQL</A ></DT ><DT ->4.1.4. <A +>4.1.2. <A HREF="stepbystep.html#install-perl" >Perl</A ></DT ><DT ->4.1.5. <A -HREF="stepbystep.html#perl-modules" +>4.1.3. <A +HREF="stepbystep.html#install-perlmodules" >Perl Modules</A ></DT ><DT ->4.1.6. <A -HREF="stepbystep.html#sbs-http" +>4.1.4. <A +HREF="stepbystep.html#install-webserver" >HTTP Server</A ></DT ><DT ->4.1.7. <A -HREF="stepbystep.html#AEN600" +>4.1.5. <A +HREF="stepbystep.html#install-bzfiles" >Bugzilla</A ></DT ><DT ->4.1.8. <A -HREF="stepbystep.html#AEN611" +>4.1.6. <A +HREF="stepbystep.html#install-setupdatabase" >Setting Up the MySQL Database</A ></DT ><DT ->4.1.9. <A -HREF="stepbystep.html#AEN649" +>4.1.7. <A +HREF="stepbystep.html#AEN795" ><TT CLASS="filename" >checksetup.pl</TT ></A ></DT ><DT ->4.1.10. <A -HREF="stepbystep.html#AEN681" +>4.1.8. <A +HREF="stepbystep.html#AEN826" >Configuring Bugzilla</A ></DT ></DL @@ -150,17 +139,17 @@ HREF="extraconfig.html" ><DL ><DT >4.2.1. <A -HREF="extraconfig.html#AEN687" +HREF="extraconfig.html#AEN832" >Dependency Charts</A ></DT ><DT >4.2.2. <A -HREF="extraconfig.html#AEN702" +HREF="extraconfig.html#AEN847" >Bug Graphs</A ></DT ><DT >4.2.3. <A -HREF="extraconfig.html#AEN715" +HREF="extraconfig.html#AEN860" >The Whining Cron</A ></DT ><DT @@ -268,12 +257,12 @@ HREF="troubleshooting.html" ><DL ><DT >4.5.1. <A -HREF="troubleshooting.html#AEN977" +HREF="troubleshooting.html#AEN1157" >Bundle::Bugzilla makes me upgrade to Perl 5.6.1</A ></DT ><DT >4.5.2. <A -HREF="troubleshooting.html#AEN982" +HREF="troubleshooting.html#AEN1162" >DBD::Sponge::db prepare failed</A ></DT ><DT diff --git a/docs/html/integration.html b/docs/html/integration.html index 6f99cd39d818b5dc43ec3dec21aaaae35fe4f74a..95de9c9edf438c1ced8109da51b985448ca23b86 100644 --- a/docs/html/integration.html +++ b/docs/html/integration.html @@ -4,10 +4,9 @@ >Integrating Bugzilla with Third-Party Tools</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -131,11 +130,10 @@ CLASS="filename" ><P >There is also a CVSZilla project, based upon somewhat dated Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to - email. Check it out at: - <A + email. Check it out at: <A HREF="http://homepages.kcbbs.gen.nz/~tonyg/" TARGET="_top" -> http://homepages.kcbbs.gen.nz/~tonyg/</A +>http://homepages.kcbbs.gen.nz/~tonyg/</A >. </P ></DIV @@ -153,7 +151,7 @@ NAME="scm" <A HREF="http://www.ravenbrook.com/project/p4dti/" TARGET="_top" -> http://www.ravenbrook.com/project/p4dti</A +>http://www.ravenbrook.com/project/p4dti/</A > . @@ -167,7 +165,7 @@ CLASS="QUOTE" <A HREF="http://public.perforce.com/public/perforce/p4dti/index.html" TARGET="_top" -> http://public.perforce.com/public/perforce/p4dti/index.html</A +>http://public.perforce.com/public/perforce/p4dti/index.html</A > .</P diff --git a/docs/html/introduction.html b/docs/html/introduction.html index 93a0f2c541677d5a6361209f1cca4d5978d827de..f29b8c9c71a0b98cf512d097e06da4345b2ee6bc 100644 --- a/docs/html/introduction.html +++ b/docs/html/introduction.html @@ -4,10 +4,9 @@ >Introduction</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Document Conventions" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/newversions.html b/docs/html/newversions.html index f8cc4cb70b2b309b3f253b8a7b8f8d964a65ba10..4648dd8429f7bb4310a2e003b5b1eb7cf3a1cb20 100644 --- a/docs/html/newversions.html +++ b/docs/html/newversions.html @@ -4,10 +4,9 @@ >New Versions</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="About This Guide" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -77,7 +76,7 @@ NAME="newversions" ></A >1.3. New Versions</H1 ><P -> This is the 2.17.4 version of The Bugzilla Guide. It is so named +> This is the 2.17.5 version of The Bugzilla Guide. It is so named to match the current version of Bugzilla. This version of the guide, like its associated Bugzilla version is a @@ -93,7 +92,7 @@ NAME="newversions" > The newest version of this guide can always be found at <A HREF="http://www.bugzilla.org" TARGET="_top" ->bugzilla.org</A +>http://www.bugzilla.org</A >; including documentation for past releases and the current development version. </P @@ -108,13 +107,12 @@ TARGET="_top" </P ><P > The latest version of this document can always be checked out via CVS. - Please follow the instructions available at - <A + Please follow the <A HREF="http://www.mozilla.org/cvs.html" TARGET="_top" ->the Mozilla CVS page</A ->, - and check out the <TT +>Mozilla CVS</A +> + instructions and check out the <TT CLASS="filename" >mozilla/webtools/bugzilla/docs/</TT > diff --git a/docs/html/os-specific.html b/docs/html/os-specific.html index cdafc2b4549204fed21cb8e8d39209cb7d43a6fa..f3d786844f66e2994ced26fb72723728c9fabab4 100644 --- a/docs/html/os-specific.html +++ b/docs/html/os-specific.html @@ -4,10 +4,9 @@ >OS Specific Installation Notes</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Installation" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -143,19 +142,23 @@ CLASS="section" ><H3 CLASS="section" ><A -NAME="win32-perl-modules" +NAME="win32-perlmodules" ></A >4.3.1.2. Perl Modules on Win32</H3 ><P >Bugzilla on Windows requires the same perl modules found in <A -HREF="stepbystep.html#install-package-list" ->Section 4.1.2</A +HREF="stepbystep.html#install-perlmodules" +>Section 4.1.3</A >. The main difference is that - windows uses <B -CLASS="command" ->ppm</B -> instead of CPAN. + windows uses <A +HREF="glossary.html#gloss-ppm" +><I +CLASS="glossterm" +>PPM</I +></A +> instead of + CPAN. </P ><TABLE BORDER="0" @@ -353,6 +356,86 @@ CLASS="programlisting" ></TR ></TABLE ></DIV +><DIV +CLASS="section" +><H4 +CLASS="section" +><A +NAME="win32-code-bugmail" +></A +>4.3.1.3.2. Changes to <TT +CLASS="filename" +>BugMail.pm</TT +></H4 +><P +>To make bug e-mail work on Win32 (until + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=84876" +TARGET="_top" +>bug + 84876</A +> lands), the + simplest way is to have Net::SMTP installed and change this (in + <TT +CLASS="filename" +>Bugzilla/BugMail.pm</TT +>):</P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i") || + die "Can't open sendmail"; + +print SENDMAIL trim($msg) . "\n"; +close SENDMAIL; + </PRE +></FONT +></TD +></TR +></TABLE +><P +>to</P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> use Net::SMTP; +my $smtp_server = 'smtp.mycompany.com'; # change this + +# Use die on error, so that the mail will be in the 'unsent mails' and +# can be sent from the sanity check page. +my $smtp = Net::SMTP->new($smtp_server) || + die 'Cannot connect to server \'$smtp_server\''; + +$smtp->mail('bugzilla-daemon@mycompany.com'); # change this +$smtp->to($person); +$smtp->data(); +$smtp->datasend($msg); +$smtp->dataend(); +$smtp->quit; + </PRE +></FONT +></TD +></TR +></TABLE +><P +>Don't forget to change the name of your SMTP server and the + domain of the sending e-mail address (after the '@') in the above + lines of code.</P +></DIV ></DIV ><DIV CLASS="section" @@ -442,110 +525,172 @@ TARGET="_top" >.</P ><P >Follow the instructions for setting up Fink. Once it's installed, - you'll want to run the following as root: - <B -CLASS="command" ->fink install gd</B -> + you'll want to use it to install the gd2 package. </P ><P >It will prompt you for a number of dependencies, type 'y' and hit - enter to install all of the dependencies. Then watch it work.</P -><P ->To prevent creating conflicts with the software that Apple installs - by default, Fink creates its own directory tree at /sw where it installs - most of the software that it installs. This means your libraries and - headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib - and /usr/local/include. Because of these changed locations for the - libraries, the Perl GD module will not install directly via CPAN, because it - looks for the specific paths instead of getting them from your - environment. But there's a way around that :-)</P -><P ->Instead of typing - <SPAN -CLASS="QUOTE" ->"install GD"</SPAN -> - at the - <TT -CLASS="prompt" ->cpan></TT -> - prompt, type - <B -CLASS="command" ->look GD</B ->. - This should go through the motions of downloading the latest version of - the GD module, then it will open a shell and drop you into the build - directory. Apply <A -HREF="../xml/gd-makefile.patch" -TARGET="_top" ->this patch</A -> - to the Makefile.PL file (save the - patch into a file and use the command - <B -CLASS="command" ->patch < patchfile</B ->.) + enter to install all of the dependencies and then watch it work. You will + then be able to use <A +HREF="glossary.html#gloss-cpan" +><I +CLASS="glossterm" +>CPAN</I +></A +> to + install the GD perl module. </P +><DIV +CLASS="note" ><P ->Then, run these commands to finish the installation of the GD - module: - <P ></P ><TABLE +CLASS="note" +WIDTH="100%" BORDER="0" -><TBODY ><TR ><TD -> <B -CLASS="command" ->perl Makefile.PL</B -> - </TD -></TR -><TR +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD ><TD -> <B -CLASS="command" ->make</B -> - </TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>To prevent creating conflicts with the software that Apple + installs by default, Fink creates its own directory tree at + <TT +CLASS="filename" +>/sw</TT +> where it installs most of + the software that it installs. This means your libraries and headers be + at <TT +CLASS="filename" +>/sw/lib</TT +> and + <TT +CLASS="filename" +>/sw/include</TT +> instead of + <TT +CLASS="filename" +>/usr/lib</TT +> and + <TT +CLASS="filename" +>/usr/local/include</TT +>. When the + Perl module config script asks where your libgd is, be sure to tell it + <TT +CLASS="filename" +>/sw/lib</TT +>. + </P +></TD ></TR +></TABLE +></DIV +><P +>Also available via Fink is expat. Once running using fink to + install the expat package you will be able to install + XML::Parser using CPAN. There is one caveat. Unlike recent versions of + the GD module, XML::Parser doesn't prompt for the location of the + required libraries. When using CPAN, you will need to use the following + command sequence: + </P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <B -CLASS="command" ->make test</B +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> # perl -MCPAN -e'look XML::Parser' <A +NAME="macosx-look" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A > - </TD -></TR -><TR -><TD -> <B -CLASS="command" ->make install</B +# perl Makefile.PL EXPATLIBPATH=/sw/lib EXPATINCPATH=/sw/include +# make; make test; make install <A +NAME="macosx-make" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A > - </TD -></TR -><TR -><TD ->And don't forget to run - <B -CLASS="command" ->exit</B +# exit <A +NAME="macosx-exit" +><IMG +SRC="../images/callouts/3.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(3)"></A > - - to get back to CPAN.</TD + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE -><P -></P -> - </P +><DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="os-specific.html#macosx-look" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +><A +HREF="os-specific.html#macosx-exit" +><IMG +SRC="../images/callouts/3.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(3)"></A +></DT +><DD +>The look command will download the module and spawn a + new shell with the extracted files as the current working directory. + The exit command will return you to your original shell. + </DD +><DT +><A +HREF="os-specific.html#macosx-make" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A +></DT +><DD +>You should watch the output from these make commands, + especially <SPAN +CLASS="QUOTE" +>"make test"</SPAN +> as errors may prevent XML::Parser + from functioning correctly with Bugzilla. + </DD +></DL +></DIV ></DIV ><DIV CLASS="section" @@ -606,7 +751,7 @@ CLASS="prompt" > <B CLASS="command" >urpmi perl-MailTools</B -> <A +> <A NAME="test-mailtools" ><IMG SRC="../images/callouts/1.gif" diff --git a/docs/html/parameters.html b/docs/html/parameters.html index 4954363b40bd21a01904b52a54a59a6fdb5b33cb..3cb7af23ff4cd6e582a2569977f9bb2e64c6e249 100644 --- a/docs/html/parameters.html +++ b/docs/html/parameters.html @@ -4,10 +4,9 @@ >Bugzilla Configuration</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/patches.html b/docs/html/patches.html index c554c3ef92b7f8d19fdd7e80251d178d216d279a..c2791a34cbeed15f5d4c238dde9ad010cf1151fb 100644 --- a/docs/html/patches.html +++ b/docs/html/patches.html @@ -4,10 +4,9 @@ >Useful Patches and Utilities for Bugzilla</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="MySQL Bugzilla Database Introduction" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/programadmin.html b/docs/html/programadmin.html index 4b5b962ec14a9532aa94fd3394db6e8fa9d1322a..f72058bfd53cf604181676751db35ad4747ef787 100644 --- a/docs/html/programadmin.html +++ b/docs/html/programadmin.html @@ -4,10 +4,9 @@ >Product, Component, Milestone, and Version Administration</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/rewrite.html b/docs/html/rewrite.html index 7ffb0552d2ea128c42f2b715b38ece2d9515c161..e986b814e08e1c8fddae88ea03b04b14091d667b 100644 --- a/docs/html/rewrite.html +++ b/docs/html/rewrite.html @@ -7,10 +7,9 @@ magic</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Useful Patches and Utilities for Bugzilla" @@ -40,7 +39,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/security.html b/docs/html/security.html index 47f212524a2c2588185e023fd02177fcb55a4fd6..c3fa0749992bdcad3172e062d610d117544e9b31 100644 --- a/docs/html/security.html +++ b/docs/html/security.html @@ -4,10 +4,9 @@ >Bugzilla Security</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -406,12 +405,11 @@ NAME="security-access" not be accessible is rather complicated. A new installation method is currently in the works which should solve this by allowing files that shouldn't be accessible from the web to be placed in directory - outside the webroot. See + outside the webroot. See <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=44659" TARGET="_top" ->bug - 44659</A +> bug 44659</A > for more information. </P ><P diff --git a/docs/html/stepbystep.html b/docs/html/stepbystep.html index 33244655f39a9b36d379fc0697d17b2e5694cbe5..48e443702b2a1d4325e5abd4ff81f6fa3ec4fa72 100644 --- a/docs/html/stepbystep.html +++ b/docs/html/stepbystep.html @@ -4,10 +4,9 @@ >Step-by-step Install</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Installation" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -76,34 +75,21 @@ CLASS="section" NAME="stepbystep" ></A >4.1. Step-by-step Install</H1 -><DIV -CLASS="section" -><H2 -CLASS="section" -><A -NAME="intstall-into" -></A ->4.1.1. Introduction</H2 ><P ->Bugzilla has been successfully installed under Solaris, Linux, - and Win32. Win32 is not yet officially supported, but many people - have got it working fine. - Please see +>Bugzilla has been successfully installed under many different + operating systems including almost all Unix clones and + <SPAN +CLASS="productname" +>Microsoft Windows</SPAN +>. Many + operating systems have utilities that make installation easier or quirks + that make it harder. We have tried to collect that information in <A -HREF="os-specific.html#os-win32" ->Section 4.3.1</A -> - for further advice on getting Bugzilla to work on Microsoft - Windows.</P -></DIV -><DIV -CLASS="section" -><H2 -CLASS="section" -><A -NAME="install-package-list" -></A ->4.1.2. Package List</H2 +HREF="os-specific.html" +>Section 4.3</A +>, so be sure to check out that section before + you start your installation. + </P ><DIV CLASS="note" ><P @@ -125,265 +111,117 @@ ALT="Note"></TD ALIGN="LEFT" VALIGN="TOP" ><P -> If you are running the very most recent - version of Perl and MySQL (both the executables and development - libraries) on your system, you can skip these manual installation - steps for the Perl modules by using Bundle::Bugzilla; see +>Windows is one of those operating systems that has many quirks + and is not yet officially supported by the Bugzilla team. If you wish + to install Bugzilla on Windows, be sure to see <A -HREF="stepbystep.html#bundlebugzilla" ->Using Bundle::Bugzilla instead of manually installing Perl modules</A +HREF="os-specific.html#os-win32" +>Section 4.3.1</A >. </P ></TD ></TR ></TABLE ></DIV +><DIV +CLASS="warning" ><P ->The software packages necessary for the proper running of - Bugzilla (with download links) are: - <P ></P -><OL -TYPE="1" -><LI +><TABLE +CLASS="warning" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/warning.gif" +HSPACE="5" +ALT="Warning"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" ><P -> <A -HREF="http://www.mysql.com/" -TARGET="_top" ->MySQL database server</A -> - (3.23.41 or greater) - </P -></LI -><LI +>While installing Bugzilla, it is a good idea to ensure that there + is some kind of firewall between you and the rest of the Internet + as your machine may be insecure for periods during the install. Many + installation steps require an active Internet connection to complete, + but you must take care to ensure that at no point is your machine + vulnerable to an attack.</P +></TD +></TR +></TABLE +></DIV ><P -> <A -HREF="http://www.perl.org" -TARGET="_top" ->Perl</A -> - (5.6, 5.6.1 is recommended if you wish to - use Bundle::Bugzilla) - </P -></LI -><LI +>This guide assumes that you already have your operating system + installed, network configured, and have administrative access to the + shell on the machine you are installing Bugzilla onto. It is possible to + install and run Bugzilla without administrative access, but you have to + either make sure all the required software is installed or get somebody + with administrative access to install it for you. + </P ><P ->Perl Modules (minimum version): - <P -></P +>The listing below is a basic step-by-step list. More information + can be found in the sections below. Minimum versions will be + included in parenthesis where appropriate. + </P +><DIV +CLASS="procedure" ><OL -TYPE="a" +TYPE="1" ><LI ><P -> <A -HREF="http://www.template-toolkit.org" -TARGET="_top" ->Template</A +><A +HREF="stepbystep.html#install-mysql" +>Install MySQL</A > - (v2.08) - </P + (3.23.41) + </P ></LI ><LI ><P -> <A -HREF="http://www.perldoc.com/perl5.6/lib/File/Temp.html" -TARGET="_top" -> File::Temp</A +><A +HREF="stepbystep.html#install-perl" +>Install Perl</A > - (1.804) (Prerequisite for Template) - </P + (5.6) + </P ></LI ><LI ><P -> <A -HREF="http://www.cpan.org/modules/by-module/AppConfig/" -TARGET="_top" ->AppConfig - </A +><A +HREF="stepbystep.html#install-perlmodules" +>Install Perl Modules</A > - (1.52) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz" -TARGET="_top" ->Text::Wrap</A -> - (2001.0131) - </P + </P ></LI ><LI ><P -> <A -HREF="http://search.cpan.org/search?dist=File-Spec" -TARGET="_top" ->File::Spec - </A +><A +HREF="stepbystep.html#install-webserver" +>Install a Webserver</A > - (0.82) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/Data/" -TARGET="_top" ->Data::Dumper - </A -> - (any) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/Mysql/" -TARGET="_top" ->DBD::mysql - </A -> - (2.1010) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/DBI/" -TARGET="_top" ->DBI</A -> - (1.32) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/Date/" -TARGET="_top" ->Date::Parse - </A -> - (2.21) - </P -></LI -><LI -><P -> <A -HREF="http://www.cpan.org/modules/by-module/CGI/" -TARGET="_top" ->CGI - </A -> - (2.88) - </P + </P ></LI -></OL -> - and, optionally: - <P -></P -><OL -TYPE="a" ><LI ><P -> <A -HREF="http://www.cpan.org/modules/by-module/GD/" -TARGET="_top" ->GD</A +><A +HREF="stepbystep.html#install-bzfiles" +>Put Bugzilla in the Webspace</A > - (1.20) for bug charting - </P -></LI -><LI -><P -> GD::Graph - (any) for bug charting - </P -></LI -><LI -><P -> GD::Text::Align - (any) for bug charting - </P + </P ></LI ><LI ><P -> <A -HREF="http://www.cpan.org/modules/by-module/Chart/" -TARGET="_top" ->Chart::Base - </A +><A +HREF="stepbystep.html#install-setupdatabase" +>Setup the MySQL Database</A > - (0.99c) for bug charting - </P -></LI -><LI -><P -> XML::Parser - (any) for the XML interface - </P -></LI -><LI -><P -> MIME::Parser - (any) for the email interface - </P -></LI -></OL -> - </P -></LI -><LI -><P -> The web server of your choice. - <A -HREF="http://www.apache.org/" -TARGET="_top" ->Apache</A -> - is highly recommended. - </P + </P ></LI ></OL -> - - <DIV -CLASS="warning" -><P -></P -><TABLE -CLASS="warning" -WIDTH="100%" -BORDER="0" -><TR -><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" -><IMG -SRC="../images/warning.gif" -HSPACE="5" -ALT="Warning"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P ->It is a good idea, while installing Bugzilla, to ensure that there - is some kind of firewall between you and the rest of the Internet, - because your machine may be insecure for periods during the install. - Many - installation steps require an active Internet connection to complete, - but you must take care to ensure that at no point is your machine - vulnerable to an attack.</P -></TD -></TR -></TABLE -></DIV -> - - </P ></DIV ><DIV CLASS="section" @@ -392,13 +230,13 @@ CLASS="section" ><A NAME="install-mysql" ></A ->4.1.3. MySQL</H2 +>4.1.1. MySQL</H2 ><P >Visit the MySQL homepage at <A HREF="http://www.mysql.com" TARGET="_top" ->www.mysql.com</A +>http://www.mysql.com</A > to grab and install the latest stable release of the server. </P @@ -441,53 +279,65 @@ CLASS="filename" ></TABLE ></DIV ><P ->If you install from something other than an RPM or Debian - package, you will need to add <TT -CLASS="filename" ->mysqld</TT -> - to your init scripts so the server daemon will come back up whenever - your machine reboots. Further discussion of UNIX init sequences are - beyond the scope of this guide. +>If you install from something other than a packaging/installation + system (such as .rpm, .dep, .exe, or .msi) you will need to configure + your system so the MySQL server daemon will come back up whenever + your machine reboots. </P ><P ->Change your init script to start - <TT -CLASS="filename" ->mysqld</TT -> - with the ability to accept large packets. By default, +>If you wish to have attachments larger than 64K, you will have to + configure MySQL to accept large packets. This is done by adding the text + in <A +HREF="stepbystep.html#install-mysql-packets" +>Figure 4-1</A +> to your <TT CLASS="filename" ->mysqld</TT -> - only accepts packets up to 64K long. This limits the size of - attachments you may put on bugs. If you add - <TT -CLASS="option" ->-O max_allowed_packet=1M</TT -> - to the command that starts - <TT -CLASS="filename" ->mysqld</TT -> - (or <TT -CLASS="filename" ->safe_mysqld</TT ->), - then you will be able to have attachments up to about 1 megabyte. - There is a Bugzilla parameter for maximum attachment size; - you should configure it to match the value you choose here.</P -><P ->If you plan on running Bugzilla and MySQL on the same machine, - consider using the - <TT +>my.conf</TT +> file. There is also a parameter in Bugzilla + for setting the maximum allowable attachment size. + + You should set this value to be slightly larger than that parameter. + </P +><DIV +CLASS="figure" +><A +NAME="install-mysql-packets" +></A +><P +><B +>Figure 4-1. Set Max Packet Size in MySQL</B +></P +><TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="programlisting" +> [mysqld] +# Allow packets up to 1M +set-variable = max_allowed_packet=1M + </PRE +></FONT +></TD +></TR +></TABLE +></DIV +><P +>If you are running Bugzilla and MySQL on the same machine, you may + also wish to utilize the <TT CLASS="option" ->--skip-networking</TT -> - option in the init script. This enhances security by preventing - network access to MySQL.</P +>skip-networking</TT +> option as + mentioned in <A +HREF="security.html#security-mysql" +>Section 5.6.2</A +> for the added security. + </P ></DIV ><DIV CLASS="section" @@ -496,287 +346,662 @@ CLASS="section" ><A NAME="install-perl" ></A ->4.1.4. Perl</H2 +>4.1.2. Perl</H2 ><P >Any machine that doesn't have Perl on it is a sad machine indeed. - Perl can be got in source form from - <A + Perl can be got in source form from <A HREF="http://www.perl.com" TARGET="_top" ->perl.com</A -> for the rare - *nix systems which don't have it. +>http://www.perl.com</A +>. + There are also binary versions available for many platforms, most of which + are linked to from perl.com. Although Bugzilla runs with perl 5.6, it's a good idea to be up to the very latest version if you can when running Bugzilla. As of this writing, that is Perl version 5.8.</P +></DIV ><DIV -CLASS="tip" +CLASS="section" +><H2 +CLASS="section" ><A -NAME="bundlebugzilla" +NAME="install-perlmodules" ></A +>4.1.3. Perl Modules</H2 ><P -></P -><TABLE -CLASS="tip" -WIDTH="100%" -BORDER="0" -><TR -><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" -><IMG -SRC="../images/tip.gif" -HSPACE="5" -ALT="Tip"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P ->You can skip the following Perl module installation steps by - installing - <SPAN -CLASS="productname" ->Bundle::Bugzilla</SPAN -> - - from - <A +>Perl modules can be found using + <A HREF="glossary.html#gloss-cpan" ><I CLASS="glossterm" >CPAN</I ></A ->, - which installs all required modules for you.</P +> on Unix based systems or + <A +HREF="glossary.html#gloss-ppm" +><I +CLASS="glossterm" +>PPM</I +></A +> on Win32. The root servers + have a real tendency to bog down, so please use mirrors. + </P ><P -> <TT -CLASS="computeroutput" -> <TT +>Good instuctions can be found for using each of these services on + their respective websites. The basics can be found in + <A +HREF="stepbystep.html#install-perlmodules-cpan" +>Example 4-1</A +> for CPAN and + <A +HREF="os-specific.html#win32-perlmodules" +>Section 4.3.1.2</A +> for PPM. + </P +><DIV +CLASS="example" +><A +NAME="install-perlmodules-cpan" +></A +><P +><B +>Example 4-1. Installing perl modules with CPAN</B +></P +><P +>The easy way: + <TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT CLASS="prompt" >bash#</TT -> - - <B -CLASS="command" ->perl -MCPAN -e 'install "Bundle::Bugzilla"'</B -> - </TT +> perl -MCPAN -e 'install "<modulename>"' + </PRE +></FONT +></TD +></TR +></TABLE > </P ><P ->Bundle::Bugzilla doesn't include GD, Chart::Base, or - MIME::Parser, which are not essential to a basic Bugzilla install. If - installing this bundle fails, you should install each module - individually to isolate the problem.</P +>Or the hard way: + <TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" +><TR +><TD +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT +CLASS="prompt" +>bash#</TT +> tar xzvf <module>.tar.gz <A +NAME="cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +> +<TT +CLASS="prompt" +>bash#</TT +> cd <module> <A +NAME="cpan-moduledir" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A +> +<TT +CLASS="prompt" +>bash#</TT +> perl Makefile.PL +<TT +CLASS="prompt" +>bash#</TT +> make +<TT +CLASS="prompt" +>bash#</TT +> make test +<TT +CLASS="prompt" +>bash#</TT +> make install + </PRE +></FONT ></TD ></TR ></TABLE +> + <DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="stepbystep.html#cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></DT +><DD +>This assumes that you've already downloaded the + <TT +CLASS="filename" +><module>.tar.gz</TT +> to the current working + directory. + </DD +><DT +><A +HREF="stepbystep.html#cpan-moduledir" +><IMG +SRC="../images/callouts/2.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(2)"></A +></DT +><DD +>The process of untaring the module as defined in + <A +HREF="stepbystep.html#cpan-moduletar" +><A +HREF="stepbystep.html#cpan-moduletar" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></A +> will create the + <TT +CLASS="filename" +><module></TT +> directory. + </DD +></DL ></DIV +> + </P ></DIV ><DIV -CLASS="section" -><H2 -CLASS="section" -><A -NAME="perl-modules" -></A ->4.1.5. Perl Modules</H2 +CLASS="tip" ><P -> - All Perl modules can be found on the - <A -HREF="http://www.cpan.org" -TARGET="_top" ->Comprehensive Perl - Archive Network</A -> (CPAN). The - CPAN servers have a real tendency to bog down, so please use mirrors. - </P -><P ->Quality, general Perl module installation instructions can be - found on the CPAN website, but the easy thing to do is to just use the - CPAN shell which does all the hard work for you. - To use the CPAN shell to install a module: - </P +></P +><TABLE +CLASS="tip" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/tip.gif" +HSPACE="5" +ALT="Tip"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - <B -CLASS="command" ->perl -MCPAN -e 'install "<modulename>"'</B -> - </TT +>Many people complain that Perl modules will not install for + them. Most times, the error messages complain that they are missing a + file in + <SPAN +CLASS="QUOTE" +>"@INC"</SPAN +>. + Virtually every time, this error is due to permissions being set too + restrictively for you to compile Perl modules or not having the + necessary Perl development libraries installed on your system. + Consult your local UNIX systems administrator for help solving these + permissions issues; if you + <EM +>are</EM > - </P -><P -> To do it the hard way: - </P -><P ->Untar the module tarball -- it should create its own - directory</P + the local UNIX sysadmin, please consult the newsgroup/mailing list + for further assistance or hire someone to help you out.</P +></TD +></TR +></TABLE +></DIV ><P ->CD to the directory just created, and enter the following - commands: +>Perl Modules (minimum version): <P ></P ><OL TYPE="1" ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="stepbystep.html#install-modules-bundle-bugzilla" +>Bundle::Bugzilla</A > - - <B -CLASS="command" ->perl Makefile.PL</B + (Will allow you to skip the rest) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-appconfig" +>AppConfig</A +> + (1.52) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-cgi" +>CGI</A +> + (2.88) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-data-dumper" +>Data::Dumper</A +> + (any) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-date-format" +>Date::Format</A > - </TT + (2.21) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-dbi" +>DBI</A +> + (1.32) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-dbd-mysql" +>DBD::mysql</A > + (2.1010) </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="stepbystep.html#install-file-spec" +>File::Spec</A > - - <B -CLASS="command" ->make</B + (0.82) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-file-temp" +>File::Temp</A > - </TT + (any) + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-template" +>Template Toolkit</A > + (2.08) </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="stepbystep.html#install-modules-text-wrap" +>Text::Wrap</A +> + (2001.0131) + </P +></LI +></OL > - <B -CLASS="command" ->make test</B + and, optionally: + <P +></P +><OL +TYPE="1" +><LI +><P +> <A +HREF="stepbystep.html#install-modules-gd" +>GD</A > - </TT + (1.20) for bug charting + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-chart-base" +>Chart::Base</A > + (0.99c) for bug charting </P ></LI ><LI ><P -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT +> <A +HREF="stepbystep.html#install-modules-xml-parser" +>XML::Parser</A > - - <B -CLASS="command" ->make install</B + (any) for the XML interface + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-gd-graph" +>GD::Graph</A > - </TT + (any) for bug charting + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-gd-text-align" +>GD::Text::Align</A > + (any) for bug charting </P ></LI -></OL +><LI +><P +> <A +HREF="stepbystep.html#install-modules-mime-parser" +>MIME::Parser</A +> + (any) for the email interface + </P +></LI +><LI +><P +> <A +HREF="stepbystep.html#install-modules-patchreader" +>PatchReader</A > + (0.9.1) for pretty HTML view of patches + </P +></LI +></OL +> </P ><DIV -CLASS="warning" +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-bundle-bugzilla" +></A +>4.1.3.1. Bundle::Bugzilla</H3 ><P -></P +>If you are running at least perl 5.6.1, you can save yourself a lot + of time by using Bundle::Bugzilla. This bundle contains every module + required to get Bugzilla running. It does not include GD and friends, but + these are not required for a base install and can always be added later + if the need arises. + </P +><P +>Assuming your perl was installed with CPAN (most unix installations + are), using Bundle::Bugzilla is really easy. Simply follow along with the + commands below. + </P ><TABLE -CLASS="warning" -WIDTH="100%" BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -WIDTH="25" -ALIGN="CENTER" -VALIGN="TOP" +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT +CLASS="prompt" +>bash#</TT +> <B +CLASS="command" +>perl -MCPAN -eshell</B +> <A +NAME="bundle-cpanconfig" ><IMG -SRC="../images/warning.gif" -HSPACE="5" -ALT="Warning"></TD -><TD -ALIGN="LEFT" -VALIGN="TOP" -><P ->Many people complain that Perl modules will not install for - them. Most times, the error messages complain that they are missing a - file in - <SPAN -CLASS="QUOTE" ->"@INC"</SPAN ->. - Virtually every time, this error is due to permissions being set too - restrictively for you to compile Perl modules or not having the - necessary Perl development libraries installed on your system. - Consult your local UNIX systems administrator for help solving these - permissions issues; if you - <EM ->are</EM +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A > - the local UNIX sysadmin, please consult the newsgroup/mailing list - for further assistance or hire someone to help you out.</P +cpan shell -- CPAN exploration and modules installation (v1.63) +ReadLine support enabled + +<TT +CLASS="prompt" +>cpan></TT +> + + </PRE +></FONT ></TD ></TR ></TABLE +><DIV +CLASS="calloutlist" +><DL +COMPACT="COMPACT" +><DT +><A +HREF="stepbystep.html#bundle-cpanconfig" +><IMG +SRC="../images/callouts/1.gif" +HSPACE="0" +VSPACE="0" +BORDER="0" +ALT="(1)"></A +></DT +><DD +>At this point, unless you've used CPAN on this machine before, + you'll have to go through a series of configuration steps. + </DD +></DL +></DIV ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN566" +NAME="install-modules-appconfig" ></A ->4.1.5.1. DBI</H3 +>4.1.3.2. AppConfig (1.52)</H3 ><P ->The DBI module is a generic Perl module used the - MySQL-related modules. As long as your Perl installation was done - correctly the DBI module should be a breeze. It's a mixed Perl/C - module, but Perl's MakeMaker system simplifies the C compilation - greatly.</P +>Dependency for Template Toolkit. We probably don't need to + specifically check for it anymore. + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN569" +NAME="install-modules-cgi" ></A ->4.1.5.2. Data::Dumper</H3 +>4.1.3.3. CGI (2.88)</H3 +><P +>The CGI module parses form elements and cookies and does many + other usefule things. It come as a part of recent perl distributions, but + Bugzilla needs a fairly new version. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/CGI.pm/" +TARGET="_top" +>http://search.cpan.org/dist/CGI.pm/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/CGI.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/CGI.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/CGI.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/CGI.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-data-dumper" +></A +>4.1.3.4. Data::Dumper (any)</H3 ><P >The Data::Dumper module provides data structure persistence for Perl (similar to Java's serialization). It comes with later sub-releases of Perl 5.004, but a re-installation just to be sure it's - available won't hurt anything.</P + available won't hurt anything. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Data-Dumper/" +TARGET="_top" +>http://search.cpan.org/dist/Data-Dumper/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Data-Dumper.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Data-Dumper.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/Data/Dumper.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/Data/Dumper.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN572" +NAME="install-modules-date-format" ></A ->4.1.5.3. MySQL-related modules</H3 +>4.1.3.5. TimeDate modules (2.21)</H3 +><P +>Many of the more common date/time/calendar related Perl modules + have been grouped into a bundle similar to the MySQL modules bundle. + This bundle is stored on the CPAN under the name TimeDate. + The component module we're most interested in is the Date::Format + module, but installing all of them is probably a good idea anyway. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/TimeDate/" +TARGET="_top" +>http://search.cpan.org/dist/TimeDate/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/TimeDate.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/TimeDate.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/TimeDate/lib/Date/Format.pm" +TARGET="_top" +>http://search.cpan.org/dist/TimeDate/lib/Date/Format.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-dbi" +></A +>4.1.3.6. DBI (1.32)</H3 +><P +>The DBI module is a generic Perl module used the + MySQL-related modules. As long as your Perl installation was done + correctly the DBI module should be a breeze. It's a mixed Perl/C + module, but Perl's MakeMaker system simplifies the C compilation + greatly.</P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/DBI/" +TARGET="_top" +>http://search.cpan.org/dist/DBI/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBI.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBI.zip</A +><br> + Documentation: <A +HREF="http://dbi.perl.org/doc/" +TARGET="_top" +>http://dbi.perl.org/doc/</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-dbd-mysql" +></A +>4.1.3.7. MySQL-related modules</H3 ><P >The Perl/MySQL interface requires a few mutually-dependent Perl modules. These modules are grouped together into the the @@ -794,34 +1019,161 @@ NAME="AEN572" with a null password should find itself with sufficient access to run tests on the 'test' database which MySQL created upon installation. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/DBD-mysql/" +TARGET="_top" +>http://search.cpan.org/dist/DBD-mysql/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBD-Mysql.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBD-Mysql.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pod" +TARGET="_top" +>http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pod</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-file-spec" +></A +>4.1.3.8. File::Spec (0.82)</H3 +><P +>File::Spec is a perl module that allows file operations, such as + generating full path names, to work cross platform. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/File-Spec/" +TARGET="_top" +>http://search.cpan.org/dist/File-Spec/</A +><br> + PPM Download Page: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/File/Spec.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/File/Spec.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-file-temp" +></A +>4.1.3.9. File::Temp (any)</H3 +><P +>File::Temp is used to generate a temporary filename that is + guaranteed to be unique. It comes as a standard part of perl + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/File-Spec/" +TARGET="_top" +>http://search.cpan.org/dist/File-Spec/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/File/Temp.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/File/Temp.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-template" +></A +>4.1.3.10. Template Toolkit (2.08)</H3 +><P +>When you install Template Toolkit, you'll get asked various + questions about features to enable. The defaults are fine, except + that it is recommended you use the high speed XS Stash of the Template + Toolkit, in order to achieve best performance. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Template-Toolkit/" +TARGET="_top" +>http://search.cpan.org/dist/Template-Toolkit/</A +><br> + PPM Download Link: <A +HREF="http://openinteract.sourceforge.net/ppmpackages/5.6/Template-Toolkit.tar.gz" +TARGET="_top" +>http://openinteract.sourceforge.net/ppmpackages/5.6/Template-Toolkit.tar.gz</A +><br> + Documentation: <A +HREF="http://www.template-toolkit.org/docs.html" +TARGET="_top" +>http://www.template-toolkit.org/docs.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN577" +NAME="install-modules-text-wrap" ></A ->4.1.5.4. TimeDate modules</H3 +>4.1.3.11. Text::Wrap (2001.0131)</H3 ><P ->Many of the more common date/time/calendar related Perl modules - have been grouped into a bundle similar to the MySQL modules bundle. - This bundle is stored on the CPAN under the name TimeDate. - The component module we're most interested in is the Date::Format - module, but installing all of them is probably a good idea anyway. +>Text::Wrap is designed to proved intelligent text wrapping. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Text-Tabs+Wrap/" +TARGET="_top" +>http://search.cpan.org/dist/Text-Tabs+Wrap/</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.8.0/lib/Text/Wrap.html" +TARGET="_top" +>http://www.perldoc.com/perl5.8.0/lib/Text/Wrap.html</A +><br> + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN580" +NAME="install-modules-gd" ></A ->4.1.5.5. GD (optional)</H3 +>4.1.3.12. GD (1.20) [optional]</H3 ><P >The GD library was written by Thomas Boutell a long while ago to - programatically generate images in C. Since then it's become the + programmatically generate images in C. Since then it's become the defacto standard for programmatic image construction. The Perl bindings to it found in the GD library are used on millions of web pages to generate graphs on the fly. That's what Bugzilla will be using it for @@ -865,36 +1217,261 @@ CLASS="classname" ></TR ></TABLE ></DIV +><DIV +CLASS="tip" +><P +></P +><TABLE +CLASS="tip" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/tip.gif" +HSPACE="5" +ALT="Tip"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>The version of the GD perl module you need is very closely tied + to the <TT +CLASS="classname" +>libgd</TT +> version installed on your system. + If you have a version 1.x of <TT +CLASS="classname" +>libgd</TT +> the 2.x + versions of the GD perl module won't work for you. + </P +></TD +></TR +></TABLE +></DIV +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GD/" +TARGET="_top" +>http://search.cpan.org/dist/GD/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GD.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GD.zip</A +><br> + Documentation: <A +HREF="http://stein.cshl.org/WWW/software/GD/" +TARGET="_top" +>http://stein.cshl.org/WWW/software/GD/</A +><br> + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN587" +NAME="install-modules-chart-base" ></A ->4.1.5.6. Chart::Base (optional)</H3 +>4.1.3.13. Chart::Base (0.99c) [optional]</H3 ><P >The Chart module provides Bugzilla with on-the-fly charting abilities. It can be installed in the usual fashion after it has been fetched from CPAN. Note that earlier versions that 0.99c used GIFs, which are no longer supported by the latest versions of GD.</P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/Chart/" +TARGET="_top" +>http://search.cpan.org/dist/Chart/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Chart.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Chart.zip</A +><br> + </P ></DIV ><DIV CLASS="section" ><H3 CLASS="section" ><A -NAME="AEN590" +NAME="install-modules-xml-parser" ></A ->4.1.5.7. Template Toolkit</H3 +>4.1.3.14. XML::Parser (any) [Optional]</H3 ><P ->When you install Template Toolkit, you'll get asked various - questions about features to enable. The defaults are fine, except - that it is recommended you use the high speed XS Stash of the Template - Toolkit, in order to achieve best performance. +>XML::Parser is used by the <TT +CLASS="filename" +>importxml.pl</TT +> + script. You only need it if you are going to be importing bugs (such as + for bug moving). XML::Parser requires that the + <TT +CLASS="classname" +>expat</TT +> library is already installed on your machine. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/XML-Parser/" +TARGET="_top" +>http://search.cpan.org/dist/XML-Parser/</A +><br> + Documentation: <A +HREF="http://www.perldoc.com/perl5.6.1/lib/XML/Parser.html" +TARGET="_top" +>http://www.perldoc.com/perl5.6.1/lib/XML/Parser.html</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-gd-graph" +></A +>4.1.3.15. GD::Graph (any) [Optional]</H3 +><P +>In addition to GD listed above, the reporting interface of Bugzilla + needs to have the GD::Graph module installed. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GDGraph/" +TARGET="_top" +>http://search.cpan.org/dist/GDGraph/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDGraph.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDGraph.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/GDGraph/Graph.pm" +TARGET="_top" +>http://search.cpan.org/dist/GDGraph/Graph.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-gd-text-align" +></A +>4.1.3.16. GD::Text::Align (any) [Optional]</H3 +><P +>GD::Text::Align, as the name implies, is used to draw aligned + strings of text. It is needed by the reporting interface. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/GDTextUtil/" +TARGET="_top" +>http://search.cpan.org/dist/GDTextUtil/</A +><br> + PPM Download Page: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDTextUtil.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDTextUtil.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/GDTextUtil/Text/Align.pm" +TARGET="_top" +>http://search.cpan.org/dist/GDTextUtil/Text/Align.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-mime-parser" +></A +>4.1.3.17. MIME::Parser (any) [Optional]</H3 +><P +>MIME::Parser is only needed if you want to use the e-mail interface + located in the <TT +CLASS="filename" +>contrib</TT +> directory. + </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/dist/MIME-tools/" +TARGET="_top" +>http://search.cpan.org/dist/MIME-tools/</A +><br> + PPM Download Link: <A +HREF="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/MIME-tools.zip" +TARGET="_top" +>http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/MIME-tools.zip</A +><br> + Documentation: <A +HREF="http://search.cpan.org/dist/MIME-tools/lib/MIME/Parser.pm" +TARGET="_top" +>http://search.cpan.org/dist/MIME-tools/lib/MIME/Parser.pm</A +><br> + </P +></DIV +><DIV +CLASS="section" +><H3 +CLASS="section" +><A +NAME="install-modules-patchreader" +></A +>4.1.3.18. PatchReader (0.9.1) [Optional]</H3 +><P +>PatchReader is only needed if you want to use Patch Viewer, a + Bugzilla feature to format patches in a pretty HTML fashion. There are a + number of optional parameters you can configure Patch Viewer with as well, + including cvsroot, cvsroot_get, lxr_root, bonsai_url, lxr_url, and + lxr_root. Patch Viewer also optionally will use cvs, diff and interdiff + utilities if they exist on the system (interdiff can be found in the + patchutils package at <A +HREF="http://cyberelk.net/tim/patchutils/" +TARGET="_top" +>http://cyberelk.net/tim/patchutils/</A +>. + These programs' locations can be configured in localconfig. </P +><P +CLASS="literallayout" +><br> + CPAN Download Page: <A +HREF="http://search.cpan.org/author/JKEISER/PatchReader/" +TARGET="_top" +>http://search.cpan.org/author/JKEISER/PatchReader/</A +><br> + Documentation: <A +HREF="http://www.johnkeiser.com/mozilla/Patch_Viewer.html" +TARGET="_top" +>http://www.johnkeiser.com/mozilla/Patch_Viewer.html</A +><br> + </P ></DIV ></DIV ><DIV @@ -902,9 +1479,9 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="sbs-http" +NAME="install-webserver" ></A ->4.1.6. HTTP Server</H2 +>4.1.4. HTTP Server</H2 ><P >You have freedom of choice here, pretty much any web server that is capable of running <A @@ -944,7 +1521,12 @@ VALIGN="TOP" >We strongly recommend Apache as the web server to use. The Bugzilla Guide installation instructions, in general, assume you are using Apache. If you have got Bugzilla working using another webserver, - please share your experiences with us.</P + please share your experiences with us by filing a bug in <A +HREF="http://bugzilla.mozilla.org/enter_bug.cgi?product=Bugzilla&component=Documentation" +TARGET="_top" +>Bugzilla Documentation</A +>. + </P ></TD ></TR ></TABLE @@ -955,9 +1537,9 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN600" +NAME="install-bzfiles" ></A ->4.1.7. Bugzilla</H2 +>4.1.5. Bugzilla</H2 ><P >You should untar the Bugzilla files into a directory that you're willing to make writable by the default web server user (probably @@ -1020,103 +1602,120 @@ CLASS="filename" >checksetup.pl</TT > script, which locks down your installation.</P +><DIV +CLASS="caution" +><P +></P +><TABLE +CLASS="caution" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/caution.gif" +HSPACE="5" +ALT="Caution"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>The default Bugzilla distribution is not designed to be placed + in a <TT +CLASS="filename" +>cgi-bin</TT +> directory (this + includes any directory which is configured using the + <TT +CLASS="option" +>ScriptAlias</TT +> directive of Apache). This will probably + change as part of + <A +HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=44659" +TARGET="_top" +>bug + 44659</A +>. + </P +></TD +></TR +></TABLE +></DIV ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN611" +NAME="install-setupdatabase" ></A ->4.1.8. Setting Up the MySQL Database</H2 +>4.1.6. Setting Up the MySQL Database</H2 ><P >After you've gotten all the software installed and working you're ready to start preparing the database for its life as the back end to a high quality bug tracker.</P ><P ->First, you'll want to fix MySQL permissions to allow access from - Bugzilla. For the purpose of this Installation section, the Bugzilla - username will be +>This first thing you'll want to do is make sure you've given the <SPAN CLASS="QUOTE" ->"bugs"</SPAN ->, and will have minimal permissions. +>"root"</SPAN +> user a password as suggested in + <A +HREF="security.html#security-mysql" +>Section 5.6.2</A +>. For clarity, these instructions will + assume that your MySQL user for Bugzilla will be <SPAN +CLASS="QUOTE" +>"bugs_user"</SPAN +>, + the database will be called <SPAN +CLASS="QUOTE" +>"bugs_db"</SPAN +> and the password for + the <SPAN +CLASS="QUOTE" +>"bugs_user"</SPAN +> user is <SPAN +CLASS="QUOTE" +>"bugs_password"</SPAN +>. You + should, of course, substitute the values you intend to use for your site. </P +><DIV +CLASS="note" ><P ->Begin by giving the MySQL root user a password. MySQL passwords are limited - to 16 characters. - <P ></P ><TABLE +CLASS="note" +WIDTH="100%" BORDER="0" -><TBODY -><TR -><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->bash#</TT -> - - <B -CLASS="command" ->mysql -u root mysql</B -> - </TT -> - </TD -></TR ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->mysql></TT -> - - <B -CLASS="command" ->UPDATE user SET Password=PASSWORD('<new_password'>) - WHERE user='root';</B -> - </TT -> - </TD -></TR -><TR +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/note.gif" +HSPACE="5" +ALT="Note"></TD ><TD -> <TT -CLASS="computeroutput" -> <TT -CLASS="prompt" ->mysql></TT -> - - <B -CLASS="command" ->FLUSH PRIVILEGES;</B -> - </TT -> - </TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Most people use <SPAN +CLASS="QUOTE" +>"bugs"</SPAN +> for both the user and + database name. + </P +></TD ></TR -></TBODY ></TABLE -><P -></P -> - - From this point on, if you need to access MySQL as the MySQL root user, - you will need to use - <B -CLASS="command" ->mysql -u root -p</B -> - - and enter <new_password>. Remember that MySQL user names have - nothing to do with Unix user names (login names).</P +></DIV ><P >Next, we use an SQL <B CLASS="command" @@ -1124,19 +1723,18 @@ CLASS="command" > command to create a <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > - user, and grant sufficient permissions for checksetup.pl, which we'll use later, to work its magic. This also restricts the <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > user to operations within a database called <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_db"</SPAN >, and only allows the account to connect from <SPAN CLASS="QUOTE" @@ -1144,55 +1742,31 @@ CLASS="QUOTE" >. Modify it to reflect your setup if you will be connecting from another machine or as a different user.</P -><P ->Remember to set <bugs_password> to some unique password. - <P -></P ><TABLE BORDER="0" -><TBODY +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT CLASS="prompt" >mysql></TT -> - - <B -CLASS="command" ->GRANT SELECT,INSERT,UPDATE,DELETE,INDEX, - ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost - IDENTIFIED BY '<bugs_password>';</B -> - </TT -> - </TD -></TR -><TR -><TD -> <TT -CLASS="computeroutput" -> <TT +> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE, + DROP,REFERENCES ON bugs_db.* TO bugs_user@localhost + IDENTIFIED BY 'bugs_password'; +<TT CLASS="prompt" >mysql></TT -> - - <B -CLASS="command" ->FLUSH PRIVILEGES;</B -> - </TT -> - </TD +> FLUSH PRIVILEGES; + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE -><P -></P -> - </P ><DIV CLASS="note" ><P @@ -1215,7 +1789,14 @@ ALIGN="LEFT" VALIGN="TOP" ><P >If you are using MySQL 4, the bugs user also needs to be granted - the LOCK TABLES and CREATE TEMPORARY TABLES permissions. + the <TT +CLASS="computeroutput" +>LOCK TABLES</TT +> and + <TT +CLASS="computeroutput" +>CREATE TEMPORARY TABLES</TT +> permissions. </P ></TD ></TR @@ -1227,9 +1808,9 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN649" +NAME="AEN795" ></A ->4.1.9. <TT +>4.1.7. <TT CLASS="filename" >checksetup.pl</TT ></H2 @@ -1238,10 +1819,11 @@ CLASS="filename" <A HREF="mailto:holgerschurig@nikocity.de" TARGET="_top" ->Holger Schurig </A +>Holger Schurig</A > for writing this script!) - This script is designed to make sure your MySQL database and other + This script is designed to make sure your perl modules are the correct + version and your MySQL database and other configuration options are consistent with the Bugzilla CGI files. It will make sure Bugzilla files and directories have reasonable permissions, set up the @@ -1250,35 +1832,28 @@ CLASS="filename" >data</TT > directory, and create all the MySQL tables. - <P -></P + </P ><TABLE BORDER="0" -><TBODY +BGCOLOR="#E0E0E0" +WIDTH="100%" ><TR ><TD -> <TT -CLASS="computeroutput" -> <TT +><FONT +COLOR="#000000" +><PRE +CLASS="screen" +> <TT CLASS="prompt" >bash#</TT -> - - <B -CLASS="command" ->./checksetup.pl</B -> - </TT -> - </TD +> ./checksetup.pl + </PRE +></FONT +></TD ></TR -></TBODY ></TABLE ><P -></P -> - - The first time you run it, it will create a file called +> The first time you run it, it will create a file called <TT CLASS="filename" >localconfig</TT @@ -1306,7 +1881,7 @@ CLASS="QUOTE" >database name: <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_db"</SPAN > if you're following these directions</P ></LI @@ -1315,7 +1890,7 @@ CLASS="QUOTE" >MySQL username: <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > if you're following these directions</P ></LI @@ -1324,9 +1899,12 @@ CLASS="QUOTE" >Password for the <SPAN CLASS="QUOTE" ->"bugs"</SPAN +>"bugs_user"</SPAN > - MySQL account; (<bugs_password>) above</P + MySQL account; (<SPAN +CLASS="QUOTE" +>"bugs_password"</SPAN +> above)</P ></LI ></OL > @@ -1380,9 +1958,9 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN681" +NAME="AEN826" ></A ->4.1.10. Configuring Bugzilla</H2 +>4.1.8. Configuring Bugzilla</H2 ><P > You should run through the parameters on the Edit Parameters page (link in the footer) and set them all to appropriate values. diff --git a/docs/html/troubleshooting.html b/docs/html/troubleshooting.html index 5dd2d17142bd9a3f68a8dbc40aa034bf972a718b..07bfcda2383f152b95040ad8bdffc3dd9ff17266 100644 --- a/docs/html/troubleshooting.html +++ b/docs/html/troubleshooting.html @@ -4,10 +4,9 @@ >Troubleshooting</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Installation" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -85,7 +84,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN977" +NAME="AEN1157" ></A >4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1</H2 ><P @@ -110,7 +109,7 @@ CLASS="section" ><H2 CLASS="section" ><A -NAME="AEN982" +NAME="AEN1162" ></A >4.5.2. DBD::Sponge::db prepare failed</H2 ><P @@ -266,7 +265,7 @@ CLASS="productname" 5.6.0. Many minor variations of this error have been reported. Examples can be found in <A HREF="troubleshooting.html#trouble-filetemp-errors" ->Figure 4-1</A +>Figure 4-2</A >. </P ><DIV @@ -276,7 +275,7 @@ NAME="trouble-filetemp-errors" ></A ><P ><B ->Figure 4-1. Other File::Temp error messages</B +>Figure 4-2. Other File::Temp error messages</B ></P ><TABLE BORDER="0" @@ -307,7 +306,7 @@ at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 233. or higher solved the problem for them. A less involved fix is to apply the patch in <A HREF="troubleshooting.html#trouble-filetemp-patch" ->Figure 4-2</A +>Figure 4-3</A >. The patch is also available as a <A HREF="../xml/filetemp.patch" @@ -322,7 +321,7 @@ NAME="trouble-filetemp-patch" ></A ><P ><B ->Figure 4-2. Patch for File::Temp in Perl 5.6.0</B +>Figure 4-3. Patch for File::Temp in Perl 5.6.0</B ></P ><TABLE BORDER="0" diff --git a/docs/html/upgrading.html b/docs/html/upgrading.html index f59442061dc1cdefa3a035bcb1ad53970142ccde..c4ce31cb1595115e5bd976d6490aae49e282f244 100644 --- a/docs/html/upgrading.html +++ b/docs/html/upgrading.html @@ -4,10 +4,9 @@ >Upgrading to New Releases</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -76,6 +75,36 @@ CLASS="section" NAME="upgrading" ></A >5.9. Upgrading to New Releases</H1 +><DIV +CLASS="warning" +><P +></P +><TABLE +CLASS="warning" +WIDTH="100%" +BORDER="0" +><TR +><TD +WIDTH="25" +ALIGN="CENTER" +VALIGN="TOP" +><IMG +SRC="../images/warning.gif" +HSPACE="5" +ALT="Warning"></TD +><TD +ALIGN="LEFT" +VALIGN="TOP" +><P +>Upgrading is a one-way process. You should backup your database + and current Bugzilla directory before attempting the upgrade. If you wish + to revert to the old Bugzilla version for any reason, you will have to + restore from these backups. + </P +></TD +></TR +></TABLE +></DIV ><P >Upgrading Bugzilla is something we all want to do from time to time, be it to get new features or pick up the latest security fix. How easy diff --git a/docs/html/useradmin.html b/docs/html/useradmin.html index 89bd94da525d16fffd606281ba13015ca8ac6f62..af4df13157b1a2b2e696eb20100f358387038bcb 100644 --- a/docs/html/useradmin.html +++ b/docs/html/useradmin.html @@ -4,10 +4,9 @@ >User Administration</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/userpreferences.html b/docs/html/userpreferences.html index 6eb40d050288b39510f454cea7acf13099d60d30..d6bbde5d0e642eac2c55e8a590de3b4ab76985d6 100644 --- a/docs/html/userpreferences.html +++ b/docs/html/userpreferences.html @@ -4,10 +4,9 @@ >User Preferences</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Using Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/using.html b/docs/html/using.html index 80d1e1225cc4f02b86616c22f0bb4a007d2ac915..ce518187a2c91152c5eaffcdb4ea3b50274e5370 100644 --- a/docs/html/using.html +++ b/docs/html/using.html @@ -4,10 +4,9 @@ >Using Bugzilla</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Why Should We Use Bugzilla?" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -111,6 +110,11 @@ HREF="how.html#list" HREF="how.html#bugreports" >Filing Bugs</A ></DT +><DT +>3.1.6. <A +HREF="how.html#patchviewer" +>Patch Viewer</A +></DT ></DL ></DD ><DT @@ -122,7 +126,7 @@ HREF="hintsandtips.html" ><DL ><DT >3.2.1. <A -HREF="hintsandtips.html#AEN370" +HREF="hintsandtips.html#AEN407" >Autolinkification</A ></DT ><DT @@ -142,7 +146,7 @@ HREF="hintsandtips.html#attachments" ></DT ><DT >3.2.5. <A -HREF="hintsandtips.html#AEN399" +HREF="hintsandtips.html#AEN436" >Filing Bugs</A ></DT ></DL diff --git a/docs/html/variant-fenris.html b/docs/html/variant-fenris.html index 80504de9625f2e925799227a6c712bba547b9292..13afcbcc23f5c14c202824dc6c2f1d379b381c6d 100644 --- a/docs/html/variant-fenris.html +++ b/docs/html/variant-fenris.html @@ -4,10 +4,9 @@ >Loki Bugzilla (Fenris)</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/variant-issuezilla.html b/docs/html/variant-issuezilla.html index 253e3cda5f43ec1cb8fe2e26b51cb0abe5a0b068..599b04a7e4e37ca857f4c657112cff22f6d97d7f 100644 --- a/docs/html/variant-issuezilla.html +++ b/docs/html/variant-issuezilla.html @@ -4,10 +4,9 @@ >Issuezilla</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/variant-perforce.html b/docs/html/variant-perforce.html index 7a6f2c097c7905fd30d83ab05385f1bfe2fcaed7..7f90944f7c6afbaaffc25be0e7cfe520a19dfaa8 100644 --- a/docs/html/variant-perforce.html +++ b/docs/html/variant-perforce.html @@ -4,10 +4,9 @@ >Perforce SCM</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -84,12 +83,10 @@ CLASS="QUOTE" > functionality.</P ><P ->URL: - <A +>URL: <A HREF="http://www.perforce.com/perforce/technotes/note052.html" TARGET="_top" -> http://www.perforce.com/perforce/technotes/note052.html - </A +>http://www.perforce.com/perforce/technotes/note052.html</A > </P ><P diff --git a/docs/html/variant-redhat.html b/docs/html/variant-redhat.html index 735fe03ed547adb7214e298a612b7d19f2b272d7..8560dac6c4db86e537eca7c32aac2f3c1a083d86 100644 --- a/docs/html/variant-redhat.html +++ b/docs/html/variant-redhat.html @@ -4,10 +4,9 @@ >Red Hat Bugzilla</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -78,26 +77,25 @@ NAME="variant-redhat" >D.1. Red Hat Bugzilla</H1 ><P >Red Hat's old fork of Bugzilla which was based on version 2.8 is now - obsolete. The newest version in use is based on version 2.17.1 and is in - the process of being integrated into the main Bugzilla source tree. The + obsolete. The newest version in use is based on version 2.17.1 and is in + the process of being integrated into the main Bugzilla source tree. The back-end is modified to work with PostgreSQL instead of MySQL and they have custom templates to get their desired look and feel, but other than that it - is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of + is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of effort to make sure that the changes he made could be integrated back into the main tree. <A HREF="http://bugzilla.mozilla.org/show_bug.cgi?id=98304" TARGET="_top" ->Bug - 98304</A -> exists to track this integration. +>Bug 98304</A +> + exists to track this integration. </P ><P ->URL: - <A +>URL: <A HREF="http://bugzilla.redhat.com/bugzilla/" TARGET="_top" -> http://bugzilla.redhat.com/bugzilla/</A +>http://bugzilla.redhat.com/bugzilla/</A > </P ><P diff --git a/docs/html/variant-scarab.html b/docs/html/variant-scarab.html index 4e5fc3b992d59b46fbc2f690e9ca1fc69054a5a2..d7684ed2639af781aeb19e1a2613a51011ca77fb 100644 --- a/docs/html/variant-scarab.html +++ b/docs/html/variant-scarab.html @@ -4,10 +4,9 @@ >Scarab</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -80,11 +79,10 @@ NAME="variant-scarab" >Scarab is a new open source bug-tracking system built using Java Servlet technology. It is currently at version 1.0 beta 13.</P ><P ->URL: - <A +>URL: <A HREF="http://scarab.tigris.org/" TARGET="_top" ->http://scarab.tigris.org</A +>http://scarab.tigris.org/</A > </P ><P diff --git a/docs/html/variant-sourceforge.html b/docs/html/variant-sourceforge.html index f46f30b9b26261a69ca88dd1bc59cbf37069617b..b9601607f636266e73e79d81a9f746de9b9ee9b1 100644 --- a/docs/html/variant-sourceforge.html +++ b/docs/html/variant-sourceforge.html @@ -4,10 +4,9 @@ >SourceForge</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Bugzilla Variants and Competitors" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -81,11 +80,10 @@ NAME="variant-sourceforge" distributed free software and open source projects over the Internet. It has a built-in bug tracker, but it's not highly thought of.</P ><P ->URL: - <A +>URL: <A HREF="http://www.sourceforge.net" TARGET="_top" -> http://www.sourceforge.net</A +>http://www.sourceforge.net</A > </P ><P diff --git a/docs/html/variants.html b/docs/html/variants.html index f8c23cd7daa93e0b2958f322f3fb4c756877cd10..731738863d6f727814c8345ce2e4f663907581cd 100644 --- a/docs/html/variants.html +++ b/docs/html/variants.html @@ -4,10 +4,9 @@ >Bugzilla Variants and Competitors</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Command-line Bugzilla Queries" @@ -34,7 +33,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -119,8 +118,8 @@ HREF="variant-sourceforge.html" <A HREF="http://linas.org/linux/pm.html" TARGET="_top" -> http://linas.org/linux/pm.html</A -> +>http://linas.org/linux/pm.html</A +>. </P ></DIV ><DIV diff --git a/docs/html/voting.html b/docs/html/voting.html index 78b0c381c200b0a47f6009f7d60f825c16e6a916..f791108b03b8373b95256c4e78c70833121896c2 100644 --- a/docs/html/voting.html +++ b/docs/html/voting.html @@ -4,10 +4,9 @@ >Voting</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Administering Bugzilla" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD @@ -106,7 +105,7 @@ TYPE="1" ><P ><EM >Maximum Votes a person can put on a single - bug"</EM + bug</EM >: It should probably be some number lower than the "Maximum votes per person". Don't set this field to "0" if diff --git a/docs/html/whatis.html b/docs/html/whatis.html index c813aaf1f4f103d7e80b999ffb4d3e4c9a8ba9cc..e92d899a3b560cf93e6a8a6356e1f9445a7aa312 100644 --- a/docs/html/whatis.html +++ b/docs/html/whatis.html @@ -4,10 +4,9 @@ >What is Bugzilla?</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Introduction" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/html/why.html b/docs/html/why.html index e6a254cee3142158f60a11cc4ace438f9d51b10b..d1e3b813e6171e1655bea08177d83439a2365e92 100644 --- a/docs/html/why.html +++ b/docs/html/why.html @@ -4,10 +4,9 @@ >Why Should We Use Bugzilla?</TITLE ><META NAME="GENERATOR" -CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ -"><LINK +CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" -TITLE="The Bugzilla Guide - 2.17.4 Development Release" +TITLE="The Bugzilla Guide - 2.17.5 Development Release" HREF="index.html"><LINK REL="UP" TITLE="Introduction" @@ -37,7 +36,7 @@ CELLSPACING="0" ><TH COLSPAN="3" ALIGN="center" ->The Bugzilla Guide - 2.17.4 Development Release</TH +>The Bugzilla Guide - 2.17.5 Development Release</TH ></TR ><TR ><TD diff --git a/docs/images/CVS/Entries b/docs/images/CVS/Entries index 2633c69bf273f064a2a41b559d76e72344e97307..aee3b275143b92f8602cd364adb96de038dd8d9e 100644 --- a/docs/images/CVS/Entries +++ b/docs/images/CVS/Entries @@ -1,5 +1,5 @@ -/caution.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_4 -/note.gif/1.1/Thu Aug 23 14:30:18 2001/-kb/TBUGZILLA-2_17_4 -/tip.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_4 -/warning.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_4 -D +/caution.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_5 +/note.gif/1.1/Thu Aug 23 14:30:18 2001/-kb/TBUGZILLA-2_17_5 +/tip.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_5 +/warning.gif/1.2/Wed May 8 21:16:44 2002/-kb/TBUGZILLA-2_17_5 +D/callouts//// diff --git a/docs/images/CVS/Tag b/docs/images/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/docs/images/CVS/Tag +++ b/docs/images/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/docs/images/callouts/1.gif b/docs/images/callouts/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..79fd388a8cd79cad63ec42565f37da1dab8542dc Binary files /dev/null and b/docs/images/callouts/1.gif differ diff --git a/docs/images/callouts/2.gif b/docs/images/callouts/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9be050e4bca48c7e5844343af03c010fd4a1dfc Binary files /dev/null and b/docs/images/callouts/2.gif differ diff --git a/docs/images/callouts/3.gif b/docs/images/callouts/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..73635e3f79802d4fe8661b013f541b464ae65c26 Binary files /dev/null and b/docs/images/callouts/3.gif differ diff --git a/docs/images/callouts/CVS/Entries b/docs/images/callouts/CVS/Entries new file mode 100644 index 0000000000000000000000000000000000000000..31b9e9b8dfa3c975a7ab3b80e6e07eb2e36526ab --- /dev/null +++ b/docs/images/callouts/CVS/Entries @@ -0,0 +1,4 @@ +/1.gif/1.1/Sat May 17 01:27:53 2003//TBUGZILLA-2_17_5 +/2.gif/1.1/Sat May 17 01:27:54 2003//TBUGZILLA-2_17_5 +/3.gif/1.1/Thu Jul 3 20:23:39 2003//TBUGZILLA-2_17_5 +D diff --git a/docs/images/callouts/CVS/Repository b/docs/images/callouts/CVS/Repository new file mode 100644 index 0000000000000000000000000000000000000000..27b3ee77b0da8aaaed2c1b1135c46f384ab10f5a --- /dev/null +++ b/docs/images/callouts/CVS/Repository @@ -0,0 +1 @@ +mozilla/webtools/bugzilla/docs/images/callouts diff --git a/docs/images/callouts/CVS/Root b/docs/images/callouts/CVS/Root new file mode 100644 index 0000000000000000000000000000000000000000..cdb6f4a0739a0dc53e628026726036377dec3637 --- /dev/null +++ b/docs/images/callouts/CVS/Root @@ -0,0 +1 @@ +:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot diff --git a/docs/images/callouts/CVS/Tag b/docs/images/callouts/CVS/Tag new file mode 100644 index 0000000000000000000000000000000000000000..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd --- /dev/null +++ b/docs/images/callouts/CVS/Tag @@ -0,0 +1 @@ +NBUGZILLA-2_17_5 diff --git a/docs/makedocs.pl b/docs/makedocs.pl index 18fdf0a620e5dd41ed14440da094b202e02a5374..0b1eea47d721daed12e59709a2d7ec40047e7fd4 100644 --- a/docs/makedocs.pl +++ b/docs/makedocs.pl @@ -19,6 +19,7 @@ # Rights Reserved. # # Contributor(s): Matthew Tuck <matty@chariot.net.au> +# Jacob Steenhagen <jake@bugzilla.org> # This script compiles all the documentation. @@ -55,7 +56,7 @@ sub MakeDocs($$) { my ($name, $cmdline) = @_; - print "Creating $name documentation ...\n"; + print "Creating $name documentation ...\n" if defined $name; print "$cmdline\n\n"; system $cmdline; print "\n"; @@ -76,3 +77,17 @@ MakeDocs('big HTML', "jade -V nochunks -t sgml -i html -d " . "../xml/Bugzilla-Guide.xml > Bugzilla-Guide.html"); MakeDocs('big text', "lynx -dump -justify=off -nolist Bugzilla-Guide.html " . "> ../txt/Bugzilla-Guide.txt"); + +if (! grep("--with-pdf", @ARGV)) { + exit; +} + +MakeDocs('PDF', "jade -t tex -d $LDP_HOME/ldp.dsl\#print $JADE_PUB/xml.dcl " . + '../xml/Bugzilla-Guide.xml'); +chdir '../pdf'; +MakeDocs(undef, 'mv ../xml/Bugzilla-Guide.tex .'); +MakeDocs(undef, 'pdfjadetex Bugzilla-Guide.tex'); +MakeDocs(undef, 'pdfjadetex Bugzilla-Guide.tex'); +MakeDocs(undef, 'pdfjadetex Bugzilla-Guide.tex'); +MakeDocs(undef, 'rm Bugzilla-Guide.tex Bugzilla-Guide.log Bugzilla-Guide.aux'); + diff --git a/docs/pdf/Bugzilla-Guide.pdf b/docs/pdf/Bugzilla-Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b25113562964e937e4faf59e88831f7df67b140e --- /dev/null +++ b/docs/pdf/Bugzilla-Guide.pdf @@ -0,0 +1,19063 @@ +%PDF-1.4 +1 0 obj +<< /S /GoTo /D (1.0) >> +endobj +4 0 obj +(The Bugzilla Guide 2.17.5 Development Release) +endobj +5 0 obj +<< /S /GoTo /D (2.0) >> +endobj +8 0 obj +(Table of Contents) +endobj +9 0 obj +<< /S /GoTo /D (3.0) >> +endobj +12 0 obj +(List of Figures) +endobj +13 0 obj +<< /S /GoTo /D (4.0) >> +endobj +16 0 obj +(List of Examples) +endobj +17 0 obj +<< /S /GoTo /D (5.0) >> +endobj +20 0 obj +(Chapter 1. About This Guide) +endobj +21 0 obj +<< /S /GoTo /D (6.0) >> +endobj +24 0 obj +(1.1. Copyright Information) +endobj +25 0 obj +<< /S /GoTo /D (7.0) >> +endobj +28 0 obj +(1.2. Disclaimer) +endobj +29 0 obj +<< /S /GoTo /D (8.0) >> +endobj +32 0 obj +(1.3. New Versions) +endobj +33 0 obj +<< /S /GoTo /D (9.0) >> +endobj +36 0 obj +(1.4. Credits) +endobj +37 0 obj +<< /S /GoTo /D (10.0) >> +endobj +40 0 obj +(1.5. Document Conventions) +endobj +41 0 obj +<< /S /GoTo /D (11.0) >> +endobj +44 0 obj +(Chapter 2. Introduction) +endobj +45 0 obj +<< /S /GoTo /D (12.0) >> +endobj +48 0 obj +(2.1. What is Bugzilla?) +endobj +49 0 obj +<< /S /GoTo /D (13.0) >> +endobj +52 0 obj +(2.2. Why Should We Use Bugzilla?) +endobj +53 0 obj +<< /S /GoTo /D (14.0) >> +endobj +56 0 obj +(Chapter 3. Using Bugzilla) +endobj +57 0 obj +<< /S /GoTo /D (15.0) >> +endobj +60 0 obj +(3.1. How do I use Bugzilla?) +endobj +61 0 obj +<< /S /GoTo /D (15.1.1) >> +endobj +64 0 obj +(3.1.1. Create a Bugzilla Account) +endobj +65 0 obj +<< /S /GoTo /D (15.2.1) >> +endobj +68 0 obj +(3.1.2. Anatomy of a Bug) +endobj +69 0 obj +<< /S /GoTo /D (15.3.1) >> +endobj +72 0 obj +(3.1.3. Searching for Bugs) +endobj +73 0 obj +<< /S /GoTo /D (15.4.1) >> +endobj +76 0 obj +(3.1.4. Bug Lists) +endobj +77 0 obj +<< /S /GoTo /D (15.5.1) >> +endobj +80 0 obj +(3.1.5. Filing Bugs) +endobj +81 0 obj +<< /S /GoTo /D (15.6.1) >> +endobj +84 0 obj +(3.1.6. Patch Viewer) +endobj +85 0 obj +<< /S /GoTo /D (15.6.1.2) >> +endobj +88 0 obj +(3.1.6.1. Viewing Patches in Patch Viewer) +endobj +89 0 obj +<< /S /GoTo /D (15.6.2.2) >> +endobj +92 0 obj +(3.1.6.2. Seeing the Difference Between Two Patches) +endobj +93 0 obj +<< /S /GoTo /D (15.6.3.2) >> +endobj +96 0 obj +(3.1.6.3. Getting More Context in a Patch) +endobj +97 0 obj +<< /S /GoTo /D (15.6.4.2) >> +endobj +100 0 obj +(3.1.6.4. Collapsing and Expanding Sections of a Patch) +endobj +101 0 obj +<< /S /GoTo /D (15.6.5.2) >> +endobj +104 0 obj +(3.1.6.5. Linking to a Section of a Patch) +endobj +105 0 obj +<< /S /GoTo /D (15.6.6.2) >> +endobj +108 0 obj +(3.1.6.6. Going to Bonsai and LXR) +endobj +109 0 obj +<< /S /GoTo /D (15.6.7.2) >> +endobj +112 0 obj +(3.1.6.7. Creating a Unified Diff) +endobj +113 0 obj +<< /S /GoTo /D (16.0) >> +endobj +116 0 obj +(3.2. Hints and Tips) +endobj +117 0 obj +<< /S /GoTo /D (16.7.1) >> +endobj +120 0 obj +(3.2.1. Autolinkification) +endobj +121 0 obj +<< /S /GoTo /D (16.8.1) >> +endobj +124 0 obj +(3.2.2. Quicksearch) +endobj +125 0 obj +<< /S /GoTo /D (16.9.1) >> +endobj +128 0 obj +(3.2.3. Comments) +endobj +129 0 obj +<< /S /GoTo /D (16.10.1) >> +endobj +132 0 obj +(3.2.4. Attachments) +endobj +133 0 obj +<< /S /GoTo /D (16.11.1) >> +endobj +136 0 obj +(3.2.5. Filing Bugs) +endobj +137 0 obj +<< /S /GoTo /D (17.0) >> +endobj +140 0 obj +(3.3. User Preferences) +endobj +141 0 obj +<< /S /GoTo /D (17.12.1) >> +endobj +144 0 obj +(3.3.1. Account Settings) +endobj +145 0 obj +<< /S /GoTo /D (17.13.1) >> +endobj +148 0 obj +(3.3.2. Email Settings) +endobj +149 0 obj +<< /S /GoTo /D (17.14.1) >> +endobj +152 0 obj +(3.3.3. Page Footer) +endobj +153 0 obj +<< /S /GoTo /D (17.15.1) >> +endobj +156 0 obj +(3.3.4. Permissions) +endobj +157 0 obj +<< /S /GoTo /D (18.0) >> +endobj +160 0 obj +(Chapter 4. Installation) +endobj +161 0 obj +<< /S /GoTo /D (19.0) >> +endobj +164 0 obj +(4.1. Stepbystep Install) +endobj +165 0 obj +<< /S /GoTo /D (19.16.1) >> +endobj +168 0 obj +(4.1.1. MySQL) +endobj +169 0 obj +<< /S /GoTo /D (19.17.1) >> +endobj +172 0 obj +(4.1.2. Perl) +endobj +173 0 obj +<< /S /GoTo /D (19.18.1) >> +endobj +176 0 obj +(4.1.3. Perl Modules) +endobj +177 0 obj +<< /S /GoTo /D (19.18.8.2) >> +endobj +180 0 obj +(4.1.3.1. Bundle::Bugzilla) +endobj +181 0 obj +<< /S /GoTo /D (19.18.9.2) >> +endobj +184 0 obj +(4.1.3.2. AppConfig \(1.52\)) +endobj +185 0 obj +<< /S /GoTo /D (19.18.10.2) >> +endobj +188 0 obj +(4.1.3.3. CGI \(2.88\)) +endobj +189 0 obj +<< /S /GoTo /D (19.18.11.2) >> +endobj +192 0 obj +(4.1.3.4. Data::Dumper \(any\)) +endobj +193 0 obj +<< /S /GoTo /D (19.18.12.2) >> +endobj +196 0 obj +(4.1.3.5. TimeDate modules \(2.21\)) +endobj +197 0 obj +<< /S /GoTo /D (19.18.13.2) >> +endobj +200 0 obj +(4.1.3.6. DBI \(1.32\)) +endobj +201 0 obj +<< /S /GoTo /D (19.18.14.2) >> +endobj +204 0 obj +(4.1.3.7. MySQLrelated modules) +endobj +205 0 obj +<< /S /GoTo /D (19.18.15.2) >> +endobj +208 0 obj +(4.1.3.8. File::Spec \(0.82\)) +endobj +209 0 obj +<< /S /GoTo /D (19.18.16.2) >> +endobj +212 0 obj +(4.1.3.9. File::Temp \(any\)) +endobj +213 0 obj +<< /S /GoTo /D (19.18.17.2) >> +endobj +216 0 obj +(4.1.3.10. Template Toolkit \(2.08\)) +endobj +217 0 obj +<< /S /GoTo /D (19.18.18.2) >> +endobj +220 0 obj +(4.1.3.11. Text::Wrap \(2001.0131\)) +endobj +221 0 obj +<< /S /GoTo /D (19.18.19.2) >> +endobj +224 0 obj +(4.1.3.12. GD \(1.20\) [optional]) +endobj +225 0 obj +<< /S /GoTo /D (19.18.20.2) >> +endobj +228 0 obj +(4.1.3.13. Chart::Base \(0.99c\) [optional]) +endobj +229 0 obj +<< /S /GoTo /D (19.18.21.2) >> +endobj +232 0 obj +(4.1.3.14. XML::Parser \(any\) [Optional]) +endobj +233 0 obj +<< /S /GoTo /D (19.18.22.2) >> +endobj +236 0 obj +(4.1.3.15. GD::Graph \(any\) [Optional]) +endobj +237 0 obj +<< /S /GoTo /D (19.18.23.2) >> +endobj +240 0 obj +(4.1.3.16. GD::Text::Align \(any\) [Optional]) +endobj +241 0 obj +<< /S /GoTo /D (19.18.24.2) >> +endobj +244 0 obj +(4.1.3.17. MIME::Parser \(any\) [Optional]) +endobj +245 0 obj +<< /S /GoTo /D (19.18.25.2) >> +endobj +248 0 obj +(4.1.3.18. PatchReader \(0.9.1\) [Optional]) +endobj +249 0 obj +<< /S /GoTo /D (19.19.1) >> +endobj +252 0 obj +(4.1.4. HTTP Server) +endobj +253 0 obj +<< /S /GoTo /D (19.20.1) >> +endobj +256 0 obj +(4.1.5. Bugzilla) +endobj +257 0 obj +<< /S /GoTo /D (19.21.1) >> +endobj +260 0 obj +(4.1.6. Setting Up the MySQL Database) +endobj +261 0 obj +<< /S /GoTo /D (19.22.1) >> +endobj +264 0 obj +(4.1.7. checksetup.pl) +endobj +265 0 obj +<< /S /GoTo /D (19.23.1) >> +endobj +268 0 obj +(4.1.8. Configuring Bugzilla) +endobj +269 0 obj +<< /S /GoTo /D (20.0) >> +endobj +272 0 obj +(4.2. Optional Additional Configuration) +endobj +273 0 obj +<< /S /GoTo /D (20.24.1) >> +endobj +276 0 obj +(4.2.1. Dependency Charts) +endobj +277 0 obj +<< /S /GoTo /D (20.25.1) >> +endobj +280 0 obj +(4.2.2. Bug Graphs) +endobj +281 0 obj +<< /S /GoTo /D (20.26.1) >> +endobj +284 0 obj +(4.2.3. The Whining Cron) +endobj +285 0 obj +<< /S /GoTo /D (20.27.1) >> +endobj +288 0 obj +(4.2.4. LDAP Authentication) +endobj +289 0 obj +<< /S /GoTo /D (20.28.1) >> +endobj +292 0 obj +(4.2.5. Preventing untrusted Bugzilla content from executing malicious Javascript code) +endobj +293 0 obj +<< /S /GoTo /D (20.29.1) >> +endobj +296 0 obj +(4.2.6. directoryindex for the Bugzilla default page.) +endobj +297 0 obj +<< /S /GoTo /D (20.30.1) >> +endobj +300 0 obj +(4.2.7. Bugzilla and modperl) +endobj +301 0 obj +<< /S /GoTo /D (20.31.1) >> +endobj +304 0 obj +(4.2.8. modthrottle and Security) +endobj +305 0 obj +<< /S /GoTo /D (21.0) >> +endobj +308 0 obj +(4.3. OS Specific Installation Notes) +endobj +309 0 obj +<< /S /GoTo /D (21.32.1) >> +endobj +312 0 obj +(4.3.1. Microsoft Windows) +endobj +313 0 obj +<< /S /GoTo /D (21.32.26.2) >> +endobj +316 0 obj +(4.3.1.1. Win32 Perl) +endobj +317 0 obj +<< /S /GoTo /D (21.32.27.2) >> +endobj +320 0 obj +(4.3.1.2. Perl Modules on Win32) +endobj +321 0 obj +<< /S /GoTo /D (21.32.28.2) >> +endobj +324 0 obj +(4.3.1.3. Code changes required to run on win32) +endobj +325 0 obj +<< /S /GoTo /D (21.32.28.1.3) >> +endobj +328 0 obj +(4.3.1.3.1. Changes to checksetup.pl) +endobj +329 0 obj +<< /S /GoTo /D (21.32.28.2.3) >> +endobj +332 0 obj +(4.3.1.3.2. Changes to BugMail.pm) +endobj +333 0 obj +<< /S /GoTo /D (21.32.29.2) >> +endobj +336 0 obj +(4.3.1.4. Serving the web pages) +endobj +337 0 obj +<< /S /GoTo /D (21.33.1) >> +endobj +340 0 obj +(4.3.2. Mac OS X) +endobj +341 0 obj +<< /S /GoTo /D (21.34.1) >> +endobj +344 0 obj +(4.3.3. LinuxMandrake 8.0) +endobj +345 0 obj +<< /S /GoTo /D (22.0) >> +endobj +348 0 obj +(4.4. HTTP Server Configuration) +endobj +349 0 obj +<< /S /GoTo /D (22.35.1) >> +endobj +352 0 obj +(4.4.1. Apache httpd) +endobj +353 0 obj +<< /S /GoTo /D (22.36.1) >> +endobj +356 0 obj +(4.4.2. Microsoft Internet Information Services) +endobj +357 0 obj +<< /S /GoTo /D (22.37.1) >> +endobj +360 0 obj +(4.4.3. AOL Server) +endobj +361 0 obj +<< /S /GoTo /D (23.0) >> +endobj +364 0 obj +(4.5. Troubleshooting) +endobj +365 0 obj +<< /S /GoTo /D (23.38.1) >> +endobj +368 0 obj +(4.5.1. Bundle::Bugzilla makes me upgrade to Perl 5.6.1) +endobj +369 0 obj +<< /S /GoTo /D (23.39.1) >> +endobj +372 0 obj +(4.5.2. DBD::Sponge::db prepare failed) +endobj +373 0 obj +<< /S /GoTo /D (23.40.1) >> +endobj +376 0 obj +(4.5.3. cannot chdir\(/var/spool/mqueue\)) +endobj +377 0 obj +<< /S /GoTo /D (23.41.1) >> +endobj +380 0 obj +(4.5.4. Your vendor has not defined Fcntl macro ONOINHERIT) +endobj +381 0 obj +<< /S /GoTo /D (24.0) >> +endobj +384 0 obj +(Chapter 5. Administering Bugzilla) +endobj +385 0 obj +<< /S /GoTo /D (25.0) >> +endobj +388 0 obj +(5.1. Bugzilla Configuration) +endobj +389 0 obj +<< /S /GoTo /D (26.0) >> +endobj +392 0 obj +(5.2. User Administration) +endobj +393 0 obj +<< /S /GoTo /D (26.42.1) >> +endobj +396 0 obj +(5.2.1. Creating the Default User) +endobj +397 0 obj +<< /S /GoTo /D (26.43.1) >> +endobj +400 0 obj +(5.2.2. Managing Other Users) +endobj +401 0 obj +<< /S /GoTo /D (26.43.30.2) >> +endobj +404 0 obj +(5.2.2.1. Creating new users) +endobj +405 0 obj +<< /S /GoTo /D (26.43.31.2) >> +endobj +408 0 obj +(5.2.2.2. Modifying Users) +endobj +409 0 obj +<< /S /GoTo /D (27.0) >> +endobj +412 0 obj +(5.3. Product, Component, Milestone, and Version Administration) +endobj +413 0 obj +<< /S /GoTo /D (27.44.1) >> +endobj +416 0 obj +(5.3.1. Products) +endobj +417 0 obj +<< /S /GoTo /D (27.45.1) >> +endobj +420 0 obj +(5.3.2. Components) +endobj +421 0 obj +<< /S /GoTo /D (27.46.1) >> +endobj +424 0 obj +(5.3.3. Versions) +endobj +425 0 obj +<< /S /GoTo /D (27.47.1) >> +endobj +428 0 obj +(5.3.4. Milestones) +endobj +429 0 obj +<< /S /GoTo /D (28.0) >> +endobj +432 0 obj +(5.4. Voting) +endobj +433 0 obj +<< /S /GoTo /D (29.0) >> +endobj +436 0 obj +(5.5. Groups and Group Security) +endobj +437 0 obj +<< /S /GoTo /D (30.0) >> +endobj +440 0 obj +(5.6. Bugzilla Security) +endobj +441 0 obj +<< /S /GoTo /D (30.48.1) >> +endobj +444 0 obj +(5.6.1. TCP/IP Ports) +endobj +445 0 obj +<< /S /GoTo /D (30.49.1) >> +endobj +448 0 obj +(5.6.2. MySQL) +endobj +449 0 obj +<< /S /GoTo /D (30.50.1) >> +endobj +452 0 obj +(5.6.3. Daemon Accounts) +endobj +453 0 obj +<< /S /GoTo /D (30.51.1) >> +endobj +456 0 obj +(5.6.4. Web Server Access Controls) +endobj +457 0 obj +<< /S /GoTo /D (31.0) >> +endobj +460 0 obj +(5.7. Template Customization) +endobj +461 0 obj +<< /S /GoTo /D (31.52.1) >> +endobj +464 0 obj +(5.7.1. What to Edit) +endobj +465 0 obj +<< /S /GoTo /D (31.53.1) >> +endobj +468 0 obj +(5.7.2. How To Edit Templates) +endobj +469 0 obj +<< /S /GoTo /D (31.54.1) >> +endobj +472 0 obj +(5.7.3. Template Formats) +endobj +473 0 obj +<< /S /GoTo /D (31.55.1) >> +endobj +476 0 obj +(5.7.4. Particular Templates) +endobj +477 0 obj +<< /S /GoTo /D (31.56.1) >> +endobj +480 0 obj +(5.7.5. Configuring Bugzilla to Detect the User's Language) +endobj +481 0 obj +<< /S /GoTo /D (32.0) >> +endobj +484 0 obj +(5.8. Change Permission Customization) +endobj +485 0 obj +<< /S /GoTo /D (33.0) >> +endobj +488 0 obj +(5.9. Upgrading to New Releases) +endobj +489 0 obj +<< /S /GoTo /D (34.0) >> +endobj +492 0 obj +(5.10. Integrating Bugzilla with ThirdParty Tools) +endobj +493 0 obj +<< /S /GoTo /D (34.57.1) >> +endobj +496 0 obj +(5.10.1. Bonsai) +endobj +497 0 obj +<< /S /GoTo /D (34.58.1) >> +endobj +500 0 obj +(5.10.2. CVS) +endobj +501 0 obj +<< /S /GoTo /D (34.59.1) >> +endobj +504 0 obj +(5.10.3. Perforce SCM) +endobj +505 0 obj +<< /S /GoTo /D (34.60.1) >> +endobj +508 0 obj +(5.10.4. Tinderbox/Tinderbox2) +endobj +509 0 obj +<< /S /GoTo /D (35.0) >> +endobj +512 0 obj +(Appendix A. The Bugzilla FAQ) +endobj +513 0 obj +<< /S /GoTo /D (36.0) >> +endobj +516 0 obj +(Appendix B. The Bugzilla Database) +endobj +517 0 obj +<< /S /GoTo /D (37.0) >> +endobj +520 0 obj +(B.1. Modifying Your Running System) +endobj +521 0 obj +<< /S /GoTo /D (38.0) >> +endobj +524 0 obj +(B.2. MySQL Bugzilla Database Introduction) +endobj +525 0 obj +<< /S /GoTo /D (38.61.1) >> +endobj +528 0 obj +(B.2.1. Bugzilla Database Basics) +endobj +529 0 obj +<< /S /GoTo /D (38.61.32.2) >> +endobj +532 0 obj +(B.2.1.1. Bugzilla Database Tables) +endobj +533 0 obj +<< /S /GoTo /D (39.0) >> +endobj +536 0 obj +(Appendix C. Useful Patches and Utilities for Bugzilla) +endobj +537 0 obj +<< /S /GoTo /D (40.0) >> +endobj +540 0 obj +(C.1. Apache modrewrite magic) +endobj +541 0 obj +<< /S /GoTo /D (41.0) >> +endobj +544 0 obj +(C.2. Commandline Bugzilla Queries) +endobj +545 0 obj +<< /S /GoTo /D (42.0) >> +endobj +548 0 obj +(Appendix D. Bugzilla Variants and Competitors) +endobj +549 0 obj +<< /S /GoTo /D (43.0) >> +endobj +552 0 obj +(D.1. Red Hat Bugzilla) +endobj +553 0 obj +<< /S /GoTo /D (44.0) >> +endobj +556 0 obj +(D.2. Loki Bugzilla \(Fenris\)) +endobj +557 0 obj +<< /S /GoTo /D (45.0) >> +endobj +560 0 obj +(D.3. Issuezilla) +endobj +561 0 obj +<< /S /GoTo /D (46.0) >> +endobj +564 0 obj +(D.4. Scarab) +endobj +565 0 obj +<< /S /GoTo /D (47.0) >> +endobj +568 0 obj +(D.5. Perforce SCM) +endobj +569 0 obj +<< /S /GoTo /D (48.0) >> +endobj +572 0 obj +(D.6. SourceForge) +endobj +573 0 obj +<< /S /GoTo /D (49.0) >> +endobj +576 0 obj +(Appendix E. GNU Free Documentation License) +endobj +577 0 obj +<< /S /GoTo /D (50.0) >> +endobj +580 0 obj +(0. PREAMBLE) +endobj +581 0 obj +<< /S /GoTo /D (51.0) >> +endobj +584 0 obj +(1. APPLICABILITY AND DEFINITIONS) +endobj +585 0 obj +<< /S /GoTo /D (52.0) >> +endobj +588 0 obj +(2. VERBATIM COPYING) +endobj +589 0 obj +<< /S /GoTo /D (53.0) >> +endobj +592 0 obj +(3. COPYING IN QUANTITY) +endobj +593 0 obj +<< /S /GoTo /D (54.0) >> +endobj +596 0 obj +(4. MODIFICATIONS) +endobj +597 0 obj +<< /S /GoTo /D (55.0) >> +endobj +600 0 obj +(5. COMBINING DOCUMENTS) +endobj +601 0 obj +<< /S /GoTo /D (56.0) >> +endobj +604 0 obj +(6. COLLECTIONS OF DOCUMENTS) +endobj +605 0 obj +<< /S /GoTo /D (57.0) >> +endobj +608 0 obj +(7. AGGREGATION WITH INDEPENDENT WORKS) +endobj +609 0 obj +<< /S /GoTo /D (58.0) >> +endobj +612 0 obj +(8. TRANSLATION) +endobj +613 0 obj +<< /S /GoTo /D (59.0) >> +endobj +616 0 obj +(9. TERMINATION) +endobj +617 0 obj +<< /S /GoTo /D (60.0) >> +endobj +620 0 obj +(10. FUTURE REVISIONS OF THIS LICENSE) +endobj +621 0 obj +<< /S /GoTo /D (61.0) >> +endobj +624 0 obj +(How to use this License for your documents) +endobj +625 0 obj +<< /S /GoTo /D (62.0) >> +endobj +628 0 obj +(Glossary) +endobj +629 0 obj +<< /S /GoTo /D (63.0) >> +endobj +632 0 obj +(09, high ascii) +endobj +633 0 obj +<< /S /GoTo /D (63.61.33.2) >> +endobj +636 0 obj +(.htaccess) +endobj +637 0 obj +<< /S /GoTo /D (64.0) >> +endobj +640 0 obj +(A) +endobj +641 0 obj +<< /S /GoTo /D (64.61.34.2) >> +endobj +644 0 obj +(Apache) +endobj +645 0 obj +<< /S /GoTo /D (64.61.34.3.3) >> +endobj +648 0 obj +(Useful Directives when configuring Bugzilla) +endobj +649 0 obj +<< /S /GoTo /D (65.0) >> +endobj +652 0 obj +(B) +endobj +653 0 obj +<< /S /GoTo /D (65.61.35.2) >> +endobj +656 0 obj +(Bug) +endobj +657 0 obj +<< /S /GoTo /D (65.61.36.2) >> +endobj +660 0 obj +(Bug Number) +endobj +661 0 obj +<< /S /GoTo /D (65.61.37.2) >> +endobj +664 0 obj +(Bugzilla) +endobj +665 0 obj +<< /S /GoTo /D (66.0) >> +endobj +668 0 obj +(C) +endobj +669 0 obj +<< /S /GoTo /D (66.61.38.2) >> +endobj +672 0 obj +(Common Gateway Interface) +endobj +673 0 obj +<< /S /GoTo /D (66.61.39.2) >> +endobj +676 0 obj +(Component) +endobj +677 0 obj +<< /S /GoTo /D (66.61.40.2) >> +endobj +680 0 obj +(Comprehensive Perl Archive Network) +endobj +681 0 obj +<< /S /GoTo /D (66.61.41.2) >> +endobj +684 0 obj +(contrib) +endobj +685 0 obj +<< /S /GoTo /D (67.0) >> +endobj +688 0 obj +(D) +endobj +689 0 obj +<< /S /GoTo /D (67.61.42.2) >> +endobj +692 0 obj +(daemon) +endobj +693 0 obj +<< /S /GoTo /D (68.0) >> +endobj +696 0 obj +(G) +endobj +697 0 obj +<< /S /GoTo /D (68.61.43.2) >> +endobj +700 0 obj +(Groups) +endobj +701 0 obj +<< /S /GoTo /D (69.0) >> +endobj +704 0 obj +(J) +endobj +705 0 obj +<< /S /GoTo /D (69.61.44.2) >> +endobj +708 0 obj +(JavaScript) +endobj +709 0 obj +<< /S /GoTo /D (70.0) >> +endobj +712 0 obj +(M) +endobj +713 0 obj +<< /S /GoTo /D (70.61.45.2) >> +endobj +716 0 obj +(Message Transport Agent) +endobj +717 0 obj +<< /S /GoTo /D (70.61.46.2) >> +endobj +720 0 obj +(MySQL) +endobj +721 0 obj +<< /S /GoTo /D (71.0) >> +endobj +724 0 obj +(P) +endobj +725 0 obj +<< /S /GoTo /D (71.61.47.2) >> +endobj +728 0 obj +(Perl Package Manager) +endobj +729 0 obj +<< /S /GoTo /D (71.61.48.2) >> +endobj +732 0 obj +(Product) +endobj +733 0 obj +<< /S /GoTo /D (71.61.49.2) >> +endobj +736 0 obj +(Perl) +endobj +737 0 obj +<< /S /GoTo /D (72.0) >> +endobj +740 0 obj +(Q) +endobj +741 0 obj +<< /S /GoTo /D (72.61.50.2) >> +endobj +744 0 obj +(QA) +endobj +745 0 obj +<< /S /GoTo /D (73.0) >> +endobj +748 0 obj +(R) +endobj +749 0 obj +<< /S /GoTo /D (73.61.51.2) >> +endobj +752 0 obj +(Relational DataBase Managment System) +endobj +753 0 obj +<< /S /GoTo /D (73.61.52.2) >> +endobj +756 0 obj +(Regular Expression) +endobj +757 0 obj +<< /S /GoTo /D (74.0) >> +endobj +760 0 obj +(S) +endobj +761 0 obj +<< /S /GoTo /D (74.61.53.2) >> +endobj +764 0 obj +(SGML ) +endobj +765 0 obj +<< /S /GoTo /D (75.0) >> +endobj +768 0 obj +(T) +endobj +769 0 obj +<< /S /GoTo /D (75.61.54.2) >> +endobj +772 0 obj +(Target Milestone) +endobj +773 0 obj +<< /S /GoTo /D (75.61.55.2) >> +endobj +776 0 obj +(Tool Command Language) +endobj +777 0 obj +<< /S /GoTo /D (76.0) >> +endobj +780 0 obj +(Z) +endobj +781 0 obj +<< /S /GoTo /D (76.61.56.2) >> +endobj +784 0 obj +(Zarro Boogs Found) +endobj +785 0 obj +<< /S /GoTo /D [786 0 R /Fit ] >> +endobj +788 0 obj << +/Length 273 +/Filter /FlateDecode +>> +stream +xڍ��J1���9n3�d���PDsi���V�V��w�Yă�2 3��O2(4/��5Nl�g���i�����r�C�P?���%#ȂoE|h=M�k D$�����,�P/����S�-���P%�'��J�����I�:Kt�{�<�y�}N�|a�FX���Nl��B�1�8;Iܥq�M2��H�����6�����@[������9�K���Ku�I�{.��� �a�?^e�P:\��&~�<! ������`�o@endstream +endobj +786 0 obj << +/Type /Page +/Contents 788 0 R +/Resources 787 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +>> endobj +789 0 obj << +/D [786 0 R /XYZ 71.731 729.265 null] +>> endobj +790 0 obj << +/D [786 0 R /XYZ 71.731 718.306 null] +>> endobj +791 0 obj << +/D [786 0 R /XYZ 71.731 718.306 null] +>> endobj +2 0 obj << +/D [786 0 R /XYZ 432.797 667.995 null] +>> endobj +787 0 obj << +/Font << /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +797 0 obj << +/Length 891 +/Filter /FlateDecode +>> +stream +xڍUߏ�6~߿�� +����t�����SOZ]�P��N8@p������{�$Ѯ�*���ߌ$��A�Y��H+����Ȼ;N�ݎ�y +�+�8� +V�Y_Ux��m~I��b�.��$)Y�����p��(N�2|X�o�0��-}C�E�"��h>ʈ��9��('�Ώr�B����{�..�I�Uн�<<Cz���1����O�<dh<�y�j�GKL *��Q�Z�)�N�r�Ǔ�/'kI(�h��}�9������^w�*�I�Ŝ� _sVV9��kH+�e��FՋ�@�^M�:��|/��_��� �`��˰E�!J�pic3��s?�W?k#Gv[���(�!���k׃�=�������tn"ܝN��9Gh��D� ��I� �Y��k���@���G�[�f� eJ:e���U�!f���?C����o����\jx�O���p+��z�E�b`��Q���'��<��A��hlg)�|� ``���S'�VRUd���5���I �2O��x�ݰ���صh��^�/U�휎��j���n[�(� ���+I��'Zt���aX��q�z�e+�Ig���fC�]>s[~��<ܸ��DY�n�O�j�ڼ�(?�j<� �|�h��_������fR�h���Œ|��A�]������.�f-��瑡�넃_�{/�-.��Y������ � ���"%e�Dm��+p�]$�GT�3@�]@���K���]_wtˀo�j5�R������.W�m�g�������>ڦQ�;`�zЉ�֭�v���f u���\1��_�gJ=��W�/�m�%�'?��D+_���|�vy�nV�V}s�ưΌ�J���������%+y����%�9�endstream +endobj +796 0 obj << +/Type /Page +/Contents 797 0 R +/Resources 795 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +>> endobj +798 0 obj << +/D [796 0 R /XYZ 71.731 729.265 null] +>> endobj +795 0 obj << +/Font << /F23 793 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +803 0 obj << +/Length 56097 +/Filter /FlateDecode +>> +stream +xڜ�]�dם�����.�����+�fF�� +��a�"�$����=z��Z��<��1��w��D����������ϧ���/�������~�Ow��������y<���t����������������o>$��o���������NO�����S����/O����������������������?�|������ן����������ۉ���������w��x�7���6���������䑷�9�6�����_��������~��������Y����r�{}���;�ܽ�����w��y�㛞>����ty}��"���,�K��z9��Xu��ځ�����$���j�/���g����P;�����(��,�K���}/Rݟ��v���}�W����P;�@�>�{����P;���}��e����38���?{��u�?{C������j~�go�x]}=��Jϲ�����U�go�x�n?�� ���j����(���go�xU���>���YT��u�.ORݟ��v���}��Rݟ��v���}g����P;�z�>�;�e.ϲ������T�go�x�>��/Vݟ��v���rz�?���aV�u��|��&Ǚ�YF��u����?{C��u�梁?{C��u�.Rݟ��v�u��}��gY]��c����� ���c8�/8��j���pg���j^W�G�����gY]����E~���P;�@}:�=[u��ځ�����Ux<{C������1<�/8�YV��u���?{C��u��_$�Go�w@n��E~���@;���}�Rϲ���gp�_�Ƴ7�<P�O�Ϊ��7�<P_N����x��ځ������o�x��%�@�����?{C���q{^~���P;�@�>�G�en<{C������1<Hu<��x�n�E~���P;�@�>�{�en<{C��u��Vݟ��v�u�u��䗹�,�K���}�|{��1��{<�_���+�|9]^���� �������˳�R�gQ]����d���j�ۧ�x���� ���cxx���� �����c�Hu<��x�n���T�go�x�n��I���7�<P���Ϊ��7����ߝ�_��<��x�^N�W����P;�@}<=?[u��ځ�����U���7���^��A��i�͎; ��@�ou�Yq��<���?{��u���?�̳7���>l��Tdz�.���)���� ���c�� �go�x���ίVݟ��v�u����$/O�,�K��z9��_ Ƴ7�<POOOVݟ��v���}��$��P;���}��$ϲ����p���� ���c��'y��ځ��1ȿ ��0+�:��}����(�w@n��5�go�x�>���I���v���r�{���� ���/w�Gyv�gY]���N����j����h���j��� �N�� ������p��x��%�@�>�{�5n<{C��u���I���v���}wVݟ��v�U���������YT�����*/��P;�@}<=<[u��ځ��I���x�Yq�����/�y��%�@�>�G����P;�@�>��{����P;�@�>yv�go�x]��>�{��gY]��c8?Hu��ځ��1ȳ�<{C������j���j^W/w�ˋ�2�gY]��Ӌ<;ɳ7�<PO�'����P;�@�>�G�en<{C������1ȳ�<��x�n�Ū��7�<P��A��i�Yq��ȳ�<{��������D�eu <P��@����j���{yv�go�x�>��_��?{C�������^���YV�����,�N�� ���cx���� ���c�g'y��ځ����c�g'y��%�@�>�{����P;�@�>yv�go�x�n�<;ɳ7����ܝβ0�gY]��ӓE�=zì���t��'y�ځ����٪��7����n��<>ɳ�.���)��<{C��u���?{C��u���I���v�U��n��?�γ�����1���?{C��u���I���v���|z��ϔgo�x]=ߝ�da"ϲ����Gy|�go�x�>��?{C��u�da"��P;�z�}�8��lv��}���� �����m�<{��u����I���v�u��}���YV��u��.������d.��[�6�f��٧hh���9.o�=�����_�=�}�}�v����}%��/�<���x&��2Y������m��_����4�d��������ן��|����v���}�����?}��ox�����������oT;���JM�����Qg���%���JM�����R��F�������F���m���&t ���R��F�������Q�@�+5�oT;���F��oR�@�+5�oT;���JM�����R��F���m���&u ���R��F�������Q�@�+5�oT;���F��oR�@�+5�oT;�� +�o4+����L�����Qg���%���JM�����R��F�������Q�@�u��I]������Q�@�+5�oT;���JM�����Qg���%���JM�����R��F�������Q�@�u��I]���̽����0�+p��Q�8�+3�oD;���B}���r�[���ځ��Vj�ߨv �����7���o���7�K �����7���o����jr�[���ځ��6����r�[���ځ��Vj�ߨv �����7���o���Mf�a�[����d�q�[��#ځ��Vj�ߨv ���:�ߤ.���Vj�ߨv �����7���o����jr�ۨ��M���o����jr�[���ځ��Vj�ߨv ���:�ߤ.���Vj�ߨv �����7���o���7���oC��Md�q�[��#ځ��Vj�ߨv �����7���o���7�K �����7���o����jr�[���ځ��6����r�[���ځ��Vj�ߨv �����7���o����A]������Q�@�+5�oT;�� +�o4+���Ɯ�oB�@�+5�oT;���JM�����R��F���m���&u ���R��F�������Q�@�+5�oT;���F��oR�@�+5�oT;���JM�����R��F���m���&u ���R��F�������F��������@�u��I]������Q�@�+5�oT;���JM�����Qg���%���JM�����R��F�������Q�@�u��I]������Q�@�+5�oT;���JM�����Qg���%�� +�o4+����L�����R��F���m���&u ���R��F�������Q�@�+5�oT;���B}���r�[���ځ��Vj�ߨv �����7���o���7�K �����7���o����jr�[���ځ��6h��dv��9��HV�����7���o����jr�ۨ��M���o�/��7����[���_�C�����o���ߊ�����������ǟ~�ݟ�韾���w1|:=���yW���y{��?W�Ǘ���x�<���>;������{��_�:�eu <P/������P;�@}:]�Nm��?{C�������{�Jݟ��v�u�y��:�eu <P�����F���7�<P�����,��?{C��u�?{C������1�;t�͎; ���|���� ���3����� �ԗ�����w��ځ����k��,��gY]����٪��7�<P�N�ORݟ��v���}���x��ځ�&�����<��x����f5����f5����f5������R�@^�QjVcP�@^�QjVcP�@\�Q�X�A��x5Ƙs5��%�Wc���T;�Wc���T;�Wc���T;�Wc�:WcH]y5F�Y�A�y5F�Y�A�y5F�Y�A�y5ƨs5��%�Wc���T;�Wc���T;�Wc���T;�Wc�:WcH]y5F�Y�A�q5F�c5͊��ef5������R�@^�QjVcP�@^�QjVcP�@^�QjVcP�@^�1�\�!u ���f5����f5����f5������R�@^�QjVcP�@^�QjVcP�@^�QjVcP�@^�1�\�!u ��e�1(~����+�Wc���D;�Wc����ȫ1J�j�ȫ1J�j�ȫ1J�j�ȫ1F��1�.���ԬƠځ��ԬƠځ��ԬƠځ�cԹC�ȫ1J�j�ȫ1J�j�ȫ1J�j���1�j���1��1HV��(3�1�v ��(5�1�v ��u�Ɛ��j�R��j�j�R��j�j�R��j�j�Q�j�K ��(5�1�v ��(5�1�v ��(5�1�v ��u�Ɛ��j�R��j�j�R��j�j�B�j���1��j�ǫ1��j�ȫ1J�j�ȫ1J�j�ȫ1F��1�.���ԬƠځ��ԬƠځ��ԬƠځ�cԹC�ȫ1J�j�ȫ1J�j�ȫ1J�j�ȫ1B}_�u ���f5����f5������4+�Wc�9Wc]y5F�Y�A�y5F�Y�A�y5F�Y�A�y5ƨs5��%�Wc���T;�Wc���T;�Wc���T;�Wc�:WcH]y5F�Y�A�y5F�Y�A�y5F�Y�A�y5ƨs5��%�Wc���T;Wc:VcЬ8^�QfVc�@^�1�\�!u ���f5����f5����f5������R�@^�QjVcP�@^�QjVcP�@^�QjVcP�@^�1�\�!u ���f5����f5����f5������R�@\�Q�X�A��x5F�Y�A�y5F�Y�A�y5ƨs5��%�Wc���T;�Wc���T;�Wc���T;�Wc����ȫ1J�j�ȫ1J�j�ȫ1J�j�ȫ1F��1�.���ԬƠځ��ԬƠځ��ԬƠځ�cЬƐ�q��ȱ�d��j�2��h�j�R��j�j�Q�j�K ��/���|���q��p5��E�3��\ޚ�8�?�o�\�f��������y�7�����������ן�6,��v+0�+?q��G2sj��=������|z���xeĐ!��xbĐY!��x_Đ�!��p\D����xYĀ!��xVĐY!��xSĐ�!��xPD�sOȎ�5CfL�Ȋ�)CfI�Ȋ�CfF�Ȋ�������1���!3 Bd��|�!�Bd��v�!3Bd��p� �n�ǫ!��h�Ǔ!��b��{!Fs!~�έ;��B��"+�gB��"+�7B��"+�B9�A��8^1d�A��8�1d�A��8�1dfA��8����xĐ!��xĐY!��xĐ�!��xD�sȎ�Cf�Ȋ� #�?����3�Ab���� ���������dz����Ǜ����ǃ��{@v�}2cDVO}2KDV�|23DV�|rn|��q��a�|Yq<�aȬ{Yq��a�L{Yq<�!ȹ�d�Ѫ��Q�>Dᤇ�Ƣq�x�À�� ��x��6���qL.q��a�yYq<�aȬxYq��a�LxYq<�!ȹ�d��z�!3�Ad��t�!��Ad��n�!3�Ad��h� �f�Nj��`��s��Z��[��T��CB�N��+�#�}�f��Ċ�}Cf��Ȋ�qA�m ;��9�a"+�g9�U"+�79�I"+�99�8��8^�0d�8��8��0d�8��8��0df8��8�������x�Ð� ��x~ÐY� ��p{Ècz���a8�!��n�Wa��a��n�Xq<�a�,nYq��a��mYq<�!ȹ�d��҆!3�Ad��̆!��Ad��Ɔ!3�Ad���� �����̸����̲�ǻ�̬�ǣ���M�cr��E CfP�Ȋ�9 CfM�Ȋ�- #�) ?������+�̈���̂�����|������@v/g2�DV�f2�DVof2�DVfr�e��q��aȌeYq<�a�,eYq��a��dYq<�!ȹ�d��B�!3�Ad��<��:��xÀ�� ��xC�sȎ�UCf�Ȋ�ICf�Ȋ�=Cf�Ȋ�1A�- ;��0�!"+�g0�"+�70� "+�09�/��8^�0d�/��8��0d�/��80df/��8��ܼ���p�c����a<wa��]�Xq�ua�L]Yq<t!ȹsd��ʅ!3rAd��ą!�pAd��!3oAd���m�}��\�x�� ��x�Y� ��x��� ��x�B�s�Ȏ�5Cf̂Ȋ�)CfɂȊ�CfƂȊ�!f�� +���>��|��^Ab��v�!3]Ad��p� �n�ǫ�� F+�-�fŇ���Ɋ÷��+�n�����d�xd߬x���/��������v�sW�~�+���B�������5���Z�;�O����b���@;�@}9�>Xu��ځ����Sy��2�x��%�@�>����V��� ���c8[u��ځ��1��Q)u��ځ�է����[�Fϲ����ˋU�go�x�>�.�ORݟ��v��:�n���T;��s�:�sH]y@G�Y�A�yCG��A�yFG���A�qIǠ��!��xLG�Y�A�yOG��A�yRG���A�yUǨsV��%��u��eT;��u��qT;��u��}T;�v��>���#;J����;;J����S;J����k;F�s;�.�<���,�ځ���Ԍ�ځ8��б��f���1���K ��(5�;�v ��(5<�v O�(5<�v ��u����R�ăj��R3ƃj��R�ǃj�"�Q�$�K ��(5�<�v ��(5�<�v O�(5�<�v ��u���@�R�Ѓj�F�B�H��3=��N��K=F�S=�.�<֣Ԭ��ځ�ף���ځ<٣�l��ځ��c�9�C���=J�r���=J�x���=J�~��>F�>�.�<�Ԭ��ځ�����ځ<��l��ځ��c�9�C�H�>��}P���> +�>(V��(3�>�v /��}��5��}��uT;��}���T;�'~���T;�W~�:g~H]y�G�Y�A�y�G��A�y�G���A�y�Ǩs��%�G���T;�w���T;�����T;���2;�9���8��RfF��@�Rjv�P�@^2�"u �1 �f ��= �f��I �f��U ��Y R�@Rj��P�@�RjƁP�@�Rj��P�@^2�"u � �f%�� �f(�ĩ ��� 4+ׂ�� ";����� D;�7���� T;�g���� T;����:��H]y<H�YB�y?H�B�yBH��B�yEȨsF��%�����%!T;�����1!T;�焔�=!T;����>)�ȣBJͪ�ȻBJͰ���B +�BhV�s�����R�0�j�ƐR32�j�̐R�3�j�ҐQ���K � )5kC�v � )5�C�v O)5�C�v �u�����R�<�j���R3>�j���R�?�j��Q��K �)5+D�v �)t�Yq<E��l!ځ�Fd�9GD�ȃDJ�"�țDJ�(�ȳDJ�.���DF��D�.�<N�Ԭ�ځ�O���ځ<Q��l�ځ�Rd�9SD��CEJ�R��[EJ�X��sEJ�^�ȋEF��E�.�8Z�бZ�f��n�23\�h�t�R�]�j�z�Q�|�K )5F�v o)5#F�v �)5;F�v / �}��5�nj��5#T;�����A#T;�'���M#T;�W��:g�H]y�H�Y6B�y�H�7B�y�H��7B�q�Ƞ�8"��p�H�c�Ɋ�#ef���#�f���#�ι#R�@<:��q�G�"c��Ë�n��2ztϣG�_>?���xd=z�G���w��/?�:&���������������O_��Z������]\��|z�������g/��+��?���I]�����Q�@�E+5�hT;{� +�h4+�{�Ɯ�hB�@�E+5�hT;�{�JM/��^�RӋF��m�ً&u �^�RӋF������Q�@�E+5�hT;�{�F��hR�@�E+5�hT;�{�JM/��^�RӋF��m�ً&u �^�RӋF����ыF�������@�Eu��I]�����Q�@�E+5�hT;�{�JM/��^�Qg/��%�{�JM/��^�RӋF������Q�@�Eu��I]�����Q�@�E+5�hT;�{�JM/��^�Qg/��%�z���{�(~�^�G/Ŋ�^�2ӋF��-��^4�k ����^4�Ƚh���jr/Z��E�ځ܋6��E��r/Z��E�ځ܋VjzѨv ����^4�Ƚh��^4�K ����^4�Ƚh���jr/Z��E�ځ؋6hz�dv��9z�HV����^4�Ƚh���jr/ڨ�M�Ƚh���jr/Z��E�ځ܋VjzѨv ���:{Ѥ.�܋VjzѨv ����^4�Ƚh���jr/ڨ�M�Ƚh���jr/Z��E�ځ؋V��E�Yq؋6dz�Dv����^4�Ƚh���jr/Z��E�ځ܋6��E��r/Z��E�ځ܋VjzѨv ����^4�Ƚh��^4�K ����^4�Ƚh���jr/Z��E�ځ܋�{/�5�{�JM/��^�RӋF����ыF��m�ً&t �^�RӋF������Q�@�E+5�hT;�{�F��hR�@�E+5�hT;�{�JM/��^�RӋF��m�ً&u �^�RӋF������Q�@�E+5�hT;�{�F��hR�@�E+5�hT;{� +�h4+�{��L/��^�Qg/��%�{�JM/��^�RӋF������Q�@�Eu��I]�����Q�@�E+5�hT;�{�JM/��^�Qg/��%�{�JM/��^�RӋF������Q�@�Eu��I]���ыF�������@�E+5�hT;�{�F��hR�@�E+5�hT;�{�JM/��^�RӋF��-��^4�k ����^4�Ƚh���jr/Z��E�ځ܋6��E��r/Z��E�ځ܋VjzѨv ����^4���h��Mf�a/Z���d�q/Z��E#ځ܋VjzѨv ���:{Ѥ.�܋>.��^4���Ex��^��l��x�~�~�֏��������߂�����=�.��/4��#��g����Ͽ�����_��߽��?}����>���z�?��:_�No�}�vy���}�N㗗���������P;��p��C��gY]����D�=zì�r���ܟ��v���}Vݟ��v�u�q��?K��YV��u��/Rݟ��v���}g����P;�@�>������P;��t>]^�:�eu <P/������P;�@}:]��_#Ƴ7�<P_N/O�Rݟ��v�uu��uy��x��%�@�>������P;�@�>����3���v���}�Vݟ��v�u�e��_��G��r����x�ځ���Yu��ځ����������P;��z>ݿ�/8�YV���rz~���� ���oϟ䗹�� ���cx�_pƳ7��^8��>���YT��u�.ORݟ��v���}��Rݟ��v���OA9ulK�ځ�-��lK��ⶔSǶ���RN�R�v mK9tߖb��p[J�ٖBt �m)��m)V;���:��X�@ܖr�ؖb�q[J�ٖBu �m)��m)V;���:��X�@ܖr�ؖb�q[J�ٖBu �m)��m)V;���:��X�@ܖr�ؖb�q[J�ٖBu �m)��m)V;����oK�Yq�-�̱-�hⶔR�-����RN�R�v nK9ulK�ځ�-�Ա-�jⶔR�-����RN�R�v nK9ulK�ځ�-�Ա-�jⶔR�-����RN�R�v nK9ulK�ځ�-�Ա-�jⶔR�-���R���-���0ږr�-�b�ᶔ3Ƕ���RF��R����-�Ա-�jⶔSǶ���RN�R�v nK)5�R�.��-�Ա-�jⶔSǶ���RN�R�v nK)5�R�.��-�Ա-�jⶔSǶ���RN�R�v mK)tlK��q�-��}[�Ɋ�m)g�m)F;���:��X�@ܖRj��P]q[ʩc[���m)��m)V;���:��X�@ܖRj��P]q[ʩc[���m)��m)V;���:��X�@ܖRj��P]q[ʩc[���m)��m)V;����oK�Yq�-�ȱ-�d�ᶔ3Ƕ���RN�R�v nK9ulK�ځ�-��lK��ⶔSǶ���RN�R�v nK9ulK�ځ�-��lK��ⶔSǶ���RN�R�v nK9ulK�ځ�-eԹ-E���RN�R�v nK9ulK�ځ�-��}[�͊�m)ef[ +�%���:��X�@ܖr�ؖb�q[ʩc[���m)�f[ +�%���:��X�@ܖr�ؖb�q[ʩc[���m)�f[ +�%���:��X�@ܖr�ؖb�q[ʩc[���m)�f[ +�%���:��X�@ږr�-�f�ᶔ3Ƕ���RJͶ�K nK9ulK�ځ�-�Ա-�jⶔSǶ���RJͶ�K nK9ulK�ځ�-�Ա-�jⶔSǶ���RJͶ�K nK9ulK�ځ�-�Ա-�jⶔSǶ���RJͶ�K mK9tߖb��p[ʙc[���m)��m)V;����m)T�@ܖr�ؖb�q[ʩc[���m)��m)V;���:��H]q[ʩc[���m)��m)V;���:��X�@ܖRj��P]q[ʩc[���m)��m)V;���:��X�@ږR�ؖB��h[ʑ�����R��R�v nK9ulK�ځ�-��lK����%�m)~����/�p�-/��7C�6��m���g�/�O����q;��_���}[�<֥��?����G?����������O�����\������}���9��<X��� �s7����&|~�M@�y7��s7��%�w���T;�w���T;�w���T;�w������Ȼ J�n�Ȼ J�n�Ȼ J�n�Ȼ F�� �.������&�ځ�����&�ځ���б��f��n�1�n�K �&(5� �v �&(5� �v �&(5� �v �&u�&���n�R���j�n�R���j�n�R���j�n�Q�n�K �&(5� �v �&(5� �v �&(5� �v �&u�&���n�R���j�n�B�n�ǻ ��n�Ȼ F�� �.������&�ځ�����&�ځ�����&�ځ��`Թ�@�Ȼ J�n�Ȼ J�n�Ȼ J�n�Ȼ F�� �.������&�ځ�����&�ځ�����&�ځ��`Թ�@�H� ��wP��� +� (V�&(3� �v �&�}7�5�w���T;�w���T;�w���T;�w�:wH]y7A��M@�y7A��M@�y7A��M@�y7��s7��%�w���T;�w���T;�w���T;w��2;w9v��8�MPfv�@�MPjvP�@�M0��M u ���f7����f7����f7������R�@�MPjvP�@�MPjvP�@�MPjvP�@�M0��M u ���f7����f7������4+w��";�w���D;�w���T;�w���T;�w�:wH]y7A��M@�y7A��M@�y7A��M@�y7��s7��%�w���T;�w���T;�w���T;�w������Ȼ J�n�Ȼ J�n��� +� hV�&s�&��n�R���j�n�R���j�n�R���j�n�Q�n�K �&(5� �v �&(5� �v �&(5� �v �&u�&���n�R���j�n�R���j�n�R���j�n�Q�n�K �&(5� �v �&(t�&�Yq�����& ځ��`Թ�@�Ȼ J�n�Ȼ J�n�Ȼ J�n�Ȼ F�� �.������&�ځ�����&�ځ�����&�ځ��`Թ�@�Ȼ J�n�Ȼ J�n�Ȼ J�n�Ȼ F�� �.����б��f��n�2���h�n�R���j�n�Q�n�K �&(5� �v �&(5� �v �&(5� �v �&�}7�5�w���T;�w���T;�w���T;�w�:wH]y7A��M@�y7A��M@�y7A��M@�q7���M ��p7A�c7Ɋ��ef7����f7������R�@�M8����|�����E�w�_��n���θ������I� �}7�~�&������������������r�������/_zR�����s/�y����w�������������HfU��帪��E��G��U=����jrUO���ځ\�Sj�z�v W��:�z�.�\�Sj�z�v V�:�zhVW������U=�Ϊ�K W������U=����jrUO���ځ\�3�ꑺrUO���ځ\�Sj�z�v W������U=�Ϊ�K W������U=����jrUO���ځ\�3�ꑺRUO�{UŏaX�S��Xq\�Sf�z�v W���^�u 䪞RS�C�����T�P�@��)5U=T;��zF�U=R�@��)5U=T;��zJMU�䪞RS�C���g�Y�#u 䪞RS�C�����T�P�@��)5U=T;�zMU�̎ê�"GUɊ㪞2S�C�����T�P�@��uV�H]����T�P�@��)5U=T;��zJMU�䪞QgU��%��zJMU�䪞RS�C�����T�P�@��uV�H]����T�P�@��)5U=T;�z +U=4+�z�LU�Ȏ㪞2S�C�����T�P�@��)5U=T;��zF�U=R�@��)5U=T;��zJMU�䪞RS�C���g�Y�#u 䪞RS�C�����T�P�@��)5U=T;��zB}�ꁺrUO���ځ\�Sj�z�v V�:�zhVW��9�z�.�\�Sj�z�v W������U=����jrUϨ��G��U=����jrUO���ځ\�Sj�z�v W��:�z�.�\�Sj�z�v W������U=����jrUϨ��G��U=����jbUO����f�qUO���!ځ\�3�ꑺrUO���ځ\�Sj�z�v W������U=�Ϊ�K W������U=����jrUO���ځ\�3�ꑺrUO���ځ\�Sj�z�v W������U=�Ϊ�K V�:�zhVW������U=����jrUϨ��G��U=����jrUO���ځ\�Sj�z�v W���^�u 䪞RS�C�����T�P�@��)5U=T;��zF�U=R�@��)5U=T;��zJMU�䪞RS�C���g�T���8��)rT���8��)3U=D;��zJMU�䪞QgU��%��z�}2W��U�/r\�;~���O�/b�[?�O���[�x9�ܿ\����<��>�SJx?��ǥ��~�ه�����O��S�xy=���۟��/8��������������k\1�go�x���^��?{C��������v3f��,�K���} +o������j���p���� ���cx�S��� ���O����7ߍ:�eu <P���Ū��7�<P�N��'����P;�@}9����R�go�x]�� +{y��x��%�@��÷�1����P;�@�>���|W��� ���c����� ���/�� �2�?�f���x�_pƳ7�<P���Ϊ��7�<P_Nϯ��w��ځ������E~�ϲ�����U�go�x�n�$�̍go�x�nã��3���v��N���1<85Ϣ����py���� ���c����� ���c8[u��ځ����1ܹ/sy��%�@���^_��?{C����t~���� �ԗӓ� ��� �⮓��o��U�x��%�@�>�'����P;�@�>��{����P;�@�>���T�go�x]�l�E��YV��u����?{C��u����x��ځ�X+Rj�P�@�?2�?"u ��#�f����#�f����#�f����#���#R�@�?Rj�P�@�?R�?B��x�H��?B�y�Ȩs���%�珔��#T;�珔��#T;�珔��#T;�珌:�H]y�H��?B�y�H��?B�y�H��?B�y�Ȩs���%�珔��#T;�珔��#T;�珔��#T;�珌:�H]i�H�����p�H�c�Ŋ��#ef����#��������R3�j���R3�j���R3�j���Q���K �)5�G�v �)5�G�v �)5�G�v �u������R3�j���R3�j���R3�j���A3Df����"�����G������GJ�����GF��G�.�<����ځ<����ځ<����ځ<d�9D���GJ�����GJ�����GJ�����GF��G�.�<����ځ<����ځ8��1�f����!3Dd����23�h���R3�j���R3�j���Q���K �)5�G�v �)5�G�v �)5�G�v �u������R3�j���R3�j���R3�j���P��@]y�H��?B�y�H��?B�q�H�c�͊��#c��#B�@�?Rj�P�@�?Rj�P�@�?Rj�P�@�?2�?"u ��#�f����#�f����#�f����#���#R�@�?Rj�P�@�?Rj�P�@�?Rj�P�@�?2�?"u ��#�f����#���#4+�珔��#D;�珌:�H]y�H��?B�y�H��?B�y�H��?B�y�Ȩs���%�珔��#T;�珔��#T;�珔��#T;�珌:�H]y�H��?B�y�H��?B�y�H��?B�y�Ȩs���%�:�Ь8�?Rf��@�?Rj�P�@�?2�?"u ��#�f����#�f����#�f����#��������R3�j���R3�j���R3�j���Q���K �)5�G�v �)5�G�v �)5�G�v �4�Gdv�)r�!Yq<���!ځ<����ځ<d�9D���G��c��E��чy:�?:~�o�ry�����g�/�O��./�����{L�<��������������y�7�������寿|�i�u�������ί�x>��~>�K����$����Kҟ_JҤ.�\�VjJҨv �����4��%i���4��%icΒ4�K �����4��%i��$�jrIZ�)I�ځ\�6�,I��rIZ�)I�ځ\�VjJҨv �����4��%i�Β4�K �����4��%i��$�jrIZ�)I�ځ\�6�,I��rIZ�)I�ځX�V�(I�Yq\�VfJ҈v ���:KҤ.�\�VjJҨv �����4��%i��$�jrIڨ�$M��%i��$�jrIZ�)I�ځ\�VjJҨv ���:KҤ.�\�VjJҨv �����4��%i��$�jrIڨ�$M�H%ie�%i?�aIZ��$�b�qIZ�)I#ځ\��{I�5�K�JMI�䒴RS�F��$�Ԕ�Q�@.Iu��I]�$�Ԕ�Q�@.I+5%iT;�K�JMI�䒴QgI��%�K�JMI�䒴RS�F��$�Ԕ�Q�@,I4%i2;KҊ%i$+�K��LI�䒴RS�F��$m�Y�&u 䒴RS�F��$�Ԕ�Q�@.I+5%iT;�K�F�%iR�@.I+5%iT;�K�JMI�䒴RS�F��$m�Y�&u 䒴RS�F��$�Ԕ�Q�@,I+t��Ѭ8,I2%i";�K��LI�䒴RS�F��$�Ԕ�Q�@.Iu��I]�$�Ԕ�Q�@.I+5%iT;�K�JMI�䒴QgI��%�K�JMI�䒴RS�F��$�Ԕ�Q�@.I��$ ��%i��$�jrIZ�)I�ځX�V�(I�Yq\�6�,I�rIZ�)I�ځ\�VjJҨv �����4��%i�Β4�K �����4��%i��$�jrIZ�)I�ځ\�6�,I��rIZ�)I�ځ\�VjJҨv �����4��%i�Β4�K �����4��%i���4��%ie�$�hrIڨ�$M��%i��$�jrIZ�)I�ځ\�VjJҨv ���:KҤ.�\�VjJҨv �����4��%i��$�jrIڨ�$M��%i��$�jrIZ�)I�ځ\�VjJҨv ���:KҤ.�X�V�(I�Yq\�VfJ҈v �����4��%i�Β4�K �����4��%i��$�jrIZ�)I�ځ\��{I�5�K�JMI�䒴RS�F��$�Ԕ�Q�@.Iu��I]�$�Ԕ�Q�@.I+5%iT;�K�JMI�Ē�AS�&��$��Q�F��$�̔��@.I+5%iT;�K�F�%iR�@.I�z]I_d��?��qI��E~�p��������;_/I�ϯ��z���><n_���Q�3�I�(���㯣�cע��������}��Ͽ~nm��'�����y��AKzV���g����W�>�T�P�@�T)tT�Ь8�T)3�*D;�+UF��*R�@�T)5�*T;�+UJM� +��J�RS�B��Re�Y�"u �J�RS�B��R��T�P�@�T)5�*T;�+UF��*R�@�T)5�*T;�+UJM� +��J�RS�B��Re�Y�"u �J�2�J�ðR��Q�B��R��T��@�T ��R�ȕ*��R�jr�J��T�ځ\�Rj*U�v W��:+U�.�\�Rj*U�v W���J�ȕ*��R�jr�ʨ�RE�ȕ*��R�jr�J��T�ځ\�Rj*U�v V��J���*E�J�Ǖ*e�R�hr�J��T�ځ\�2�T��r�J��T�ځ\�Rj*U�v W���J�ȕ*��J�K W���J�ȕ*��R�jr�J��T�ځ\�2�T��r�J��T�ځ\�Rj*U�v V�:*UhVV��J�Ǖ*e�R�hr�J��T�ځ\�Rj*U�v W��:+U�.�\�Rj*U�v W���J�ȕ*��R�jr�ʨ�RE�ȕ*��R�jr�J��T�ځ\�Rj*U�v W���^�u �J�RS�B��R��T�P�@�T)tT�Ь8�TsV�]�R��T�P�@�T)5�*T;�+UJM� +��J�Qg���%�+UJM� +��J�RS�B��R��T�P�@�TuV�H]�R��T�P�@�T)5�*T;�+UJM� +��J�Qg���%�+UJM� +��J�BG� +͊�J�2S�B��Re�Y�"u �J�RS�B��R��T�P�@�T)5�*T;�+UF��*R�@�T)5�*T;�+UJM� +��J�RS�B��Re�Y�"u �J�RS�B��R��T�P�@�T)5�*T;�+UF��*R�@�T)tT�Ь8�T)3�*D;�+UJM� +��J�Qg���%�+UJM� +��J�RS�B��R��T�P�@�T ��R�ȕ*��R�jr�J��T�ځ\�Rj*U�v W��:+U�.�\�Rj*U�v W���J�ȕ*��R�jb�ʠ�T��qX�R�T!Yq\�Rf*U�v W���J�ȕ*��J�K W��@�R�/2*U^�Ru�"K��|�R����-+U�T��G��_���_��_���k���w �<���@~�I�\^�jT��������^���~~ ����.��] ���J�j�w%Tj�+!��ߕP�����v WB���JH��ߕP�����v WB���ځ�] ���J�j�w%4�����.��] ���J�j�w%Tj�+!��ߕP�����v WB�� +-�K Wh�� +-��Z�� +-��Ze�B�hr�֨�BK��Z��B�jr�V��Тځ\�Uj*��v Wh�:+��.�\�Uj*��v Wh�� +-��Z��B�jr�֨�BK��Z��B�jr�V��Тځ\�Uj*��v Wh�:+��.�T�U�^�E�cVh8*�(VWh�� +-��Z��WhA]�B��ThQ�@��*5ZT;�+�JM��� +�Qg���%�+�JM��� +�RS�E��B��ThQ�@��uVhI]�B��ThQ�@��*5ZT;�+�JM��� +�AS�%��B��Q�E��B��Th�@��*5ZT;�+�F�ZR�@��*5ZT;�+�JM��� +�RS�E��Bk�Y�%u � +�RS�E��B��ThQ�@��*5ZT;�+�F�ZR�@��*5ZT;�+�JM��� +�BG�͊� +�!S�%��B��Th�@��*5ZT;�+�JM��� +�Qg���%�+�JM��� +�RS�E��B��ThQ�@��uVhI]�B��ThQ�@��*5ZT;�+�JM��� +�P�+����\�Uj*��v Wh�� +-��Z�� +-��Zc� +-�K Wh�� +-��Z��B�jr�V��Тځ\�5�В�r�V��Тځ\�Uj*��v Wh�� +-��Z�� +-�K Wh�� +-��Z��B�jr�V��Тځ\�5�В�r�V��ТځX�U�ТYq\�Uf*��v Wh�:+��.�\�Uj*��v Wh�� +-��Z��B�jr�֨�BK��Z��B�jr�V��Тځ\�Uj*��v Wh�:+��.�\�Uj*��v Wh�� +-��Z��B�jr�֨�BK��Z�� +-��Ze�B�hr�V��Тځ\�5�В�r�V��Тځ\�Uj*��v Wh�� +-��Z��WhA]�B��ThQ�@��*5ZT;�+�JM��� +�Qg���%�+�JM��� +�RS�E��B��ThQ�@��4Z2;+��Z$+�+��L��� +�RS�E��Bk�Y�%u � +-�?M�_dTh?��q���E�� +�����e�+�y&�˨���/?��w���?���_�2볿\+�^�_���/u��?�ϦUJ>��a��ʋ�JY�@l�:u�JY�@l�*5�RT�@l�:u�JY�@l�:u�JY�@l�:u�JY�@l�*5�RT�@l�:u�JY�@l�:u�JY�@l�:u�JY�@l�*5�RT�@l�:u�JY�@j�:to��Yq�*u�h�2ځ�*UjZ��.��*u�h��ځ�*u�h��ځ�*u�h��ځ�*UjZ��.��*u�h��ځ�*u�h��ځ�*u�h��ځ�*UjZ��.��*u�h��ځ�*u�h��ځ�*u�h��ځ�*UjZ��.��*u�V)�èU���U�b�a�ԙ�U�hb�Ԩ�UJ���R��V)���R��V)���R��V)���R��U����R��V)���R��V)���R��V)���R��U����R��V)���R��V)���R��V)�H�R��V)�G�RG�R&+[���RF;[�N�RV;[�JM��%[�N�RV;[�N�RV;[�N�RV;[�JM��%[�N�RV;[�N�RV;[�N�RV;[�JM��%[�N�RV;[�N�RV;�Z��[�lV�J9Z�Hv�J�9Z��v �J�:Z��v �J�:Z��v �J��V)�K �J�:Z��v �J�:Z��v �J�:Z��v �J��V)�K �J�:Z��v �J�:Z��v �J�:Z��v �J�:[�����*u�h��ځ�*u�h��ځ�*u��*e��U�̴J]�U���*e��U���*e��U���*e��U�ԴJQ]�U���*e��U���*e��U���*e��U�ԴJQ]�U���*e��U���*e��U���*e��U�ԴJQ]�U���*e��U�нU�f�a�ԙ�U�hb�T�i���b�ԩ�U�jb�ԩ�U�jb�ԩ�U�jb�T�i���b�ԩ�U�jb�ԩ�U�jb�ԩ�U�jb�T�i���b�ԩ�U�jb�ԩ�U�jb�ԩ�U�jb�T�i���R�ԡ{��͊�V�3G����V�SG����V�R�*Eu �V�SG����V�SG����V�SG����V�Qg���5[�N�RV;[�N�RV;[�N�RV;[�JM��%[�N�RV;[�N�RV;[�N�RV;�Z� +�R4;�Z���[�LV�J�9Z��v �J�:Z��v �J��V)�K �J��Z��"�C_���U +/��J�o�J_��)�J�G�)}8���o�~���O-���w��~#x�� {y>� ;�\N/�~�^o<���N����t�;_y�+��(�w@���_��?�d�]'_ϧ���"ǣHv�y9=?Kr�Ɋ; �N�o�,ې��LV�����v�!�G����'�w�O��"�(�K����_��?�d���O���r�Ɋ; ����$�G�����y�ɿ{Q�xɎ; /�/�_�?�d��O�/�%�?�d��߾�������0�^�̷�&���y+2�DV�-2sDV�-2[DV/-r-��q<�`Ȭ,Yq��`�L,Yq<�`��+Yq�� �9��d��!��@d��!3�@d��!��@d�� ���s +�̚��[ +FS +~�!fG�Ċ�A� ;�'�"+����"+����"+��9���8�M0dV��8�L0d&��8L0d���8^K�K���x*��YJ ��x'���I ��x$���H ��x!A�s Ȏ�y���}��m��i�>��0���@b��*�m�}�\�x��YD ��x���C ��x���B ��x A�sȎ�Cf�Ȋ� Cf�Ȋ�Cf��Ȋ��A�� ;����"+�w��"+�G��"+����+��7����[����C�����+��#@vO2DV�2�DV�2�DV/r��q<k`ȬYq�i`�LYq<h`��Yq�f �9f�d��!�d@d��!3c@d�ሁdž��p�@x0���x���Y/ ��x����. ��x����- ��x�@�s��Ȏ��Cf��Ȋ�Cf��Ȋ�Cf��Ȋ�AΡ ;�g +��"+�7 +��"+� +�}"+�� n���������2�ǻ��,���F�~�E�A;���5"+���)"+���"+�W9G��8� 0d��8�0d���80d���8^����xv��Y ��xs��� ��xp��� ��xm@�sl�Ȏ�Cfi�ȊÝ#��?��Ȁ�1@b�� �������̺�����̴�����̮��ǫ���@vO +2�DV� 2sDV� 2[DV/ r ��q<#`ȬYq�!`�LYq< `��Yq� �9�d��t��r���x7��� ��x4��� ��x1@�s0�Ȏ��Cf-�Ȋ��Cf*�Ȋ��Cf'�Ȋ㕀���H�1���D�!�@d��>�!3@d��8�!� @d��2� �0��dz���*��Ǜ���$��ǃ������k�B����S��K��}��f�Ċ��Cf�Ȋ��A�� ;���Pf7�z�Q�������[���P����]�+w��3)�?��������I_�&��:���՟����Q�����S����E��/MuT;���JMY�人R�WG���.���:�k �֕��:�Ƚu����jru]�鮣ځ�^7��r�]�i��ځ�aWjJ�v ��:z�hV7ٍ9��.�\fWj��v �ٕ�B;�ȕv��ӎjr�ݨ��N���v��َjr�]�)��ځ\oWj���v 7܍:+�.�\rWjZ�v �ܕ��;��Uw���jr�ݨ��N�ȅw���jb�]���f�q�]��#ځ�|7ꬾ��r�]�i��ځ�Wj +�v W���<��-x��<�K ᕚ&<��]x���jr^��ãځ܈7�ē�r)^�iţځ܋Wj��v W㕚n<���x��z<�K 䕹7�Q��y��<��5ye�'�hrS^��UyP�@.�+5myT;���JMa��ʼRәG��5o�Y�'u ��RӜG��;�Ԕ�Q�@��+5�yT;��F�zR�@.�+5-zT;�{�JM���*�RӥG��Mo�����8,�+r4ꑬ8��+3�zD;�k�JM���f�Qg���%���JM���~�RS�G��b��t�Q�@n�u��I]�h��4�Q�@��+5e{T;���JM���ƽQg��%�K�JM���RS�G��z��ѽG��}o����8.�+3 |D;�;�JM ���R��G���o�Y�'u �2�R��G������Q�@��+5�|T;�[�F��|R�@.�+5�|T;���JM9��z�R��G���/���>�k �����>��=}����jbU_����f�q[ߘ��O�ȅ}����jrg_�)��ځ\�Wjz��v 7��:���.�\�Wj���v ����?��~��Ïjr�ߨ��O��E~��ɏjr�_�)�ځ\�Wj���v 7��:+��.�\�WjZ��v ��:��hVW���n?���~��z?�K ����?�����jr�_����ځ��7����r�_�i��ځ��Wj +��v W����?�ȭ���?�K ����?�������jr�_����ځ��`�9@��#� ++�hV��(3C��v O(5[��v �u���� �R��j�&�R3 +�j�,�R��j�2�Pߧ@]y@�Y@�y@�@�y"@��@�y%��s&��%������T;������T;������T;���2;G9V��8� Pf��@�Pj�P�@^0� u ��Û|�1!��E�7�_d��1"�������G�3x#�����?���?������t��O_~�������s������7����V��e�U�Ѣ@�����x������;�k �ݕ��;��}w���jr�]�黣ځ�w7�컓�r�]�黣ځ�wWj��v ��:��hV�ݍ9��.��wWj��v �ݕ��;��}w���jr�ݨ��N��}w���jr�]�黣ځ�wWj��v �ݍ:��.��wWj��v �ݕ��;��}w���jr�ݨ��N��}w���jb�]���f�q�]��#ځ�w7�컓�r�]�黣ځ�wWj��v �ݕ��;��}w�ξ;�K �ݕ��;��}w���jr�]�黣ځ�w7�컓�r�]�黣ځ�wWj��v �ݕ��;��}w�ξ;�K �ݕ���Q��}w��;��}we��hr�]��}wP�@�+5}wT;���JM��侻R�wG���n��w'u 侻R�wG������Q�@�+5}wT;���F�}wR�@�+5}wT;���JM��侻R�wG���n�����8�+r�ݑ�8�+3}wD;���JM��侻Qgߝ�%���JM��侻R�wG������Q�@�u��I]�����Q�@�+5}wT;���JM��侻Qgߝ�%���JM��侻R�wG�����wG���n��݉�8�+3}wD;���JM��侻R�wG���n��w'u 侻R�wG������Q�@�+5}wT;���F�}wR�@�+5}wT;���JM��侻R�wG���.���;�k �ݕ��;��}w���jb�]���f�q�ݘ��N��}w���jr�]�黣ځ�wWj��v �ݍ:��.��wWj��v �ݕ��;��}w���jr�ݨ��N��}w���jr�]�黣ځ�wWj��v �ݍ:��.��wWj��v ��:��hV�ݕ��;��}w�ξ;�K �ݕ��;��}w���jr�]�黣ځ�w7�컓�r�]�黣ځ�wWj��v �ݕ��;��}w�ξ;�K �ݕ��;��}w���jr�]�黣ځ�w7�컓�b�]���f�q�]��#ځ�wWj��v �ݍ:��.��wWj��v �ݕ��;��}w���jr�]��}wP�@�+5}wT;���JM��侻R�wG���n��w'u 侻R�wG������Q�@�+5}wT;��Mߝ̎þ�"G�Ɋ㾻2�wG������Q�@�u��I]��~\�v}w|��w��"�}������a�yL��|�>�p9=|���o�W�t�>>�3�}���s�����������?~�������e�K��_�������׃���KW�1�K�?��K��/���.�|��\��ځ|��\��ځ|��\��ځ|�j�y�J�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�Jͥ+����ͥ+�������HV_�*3���v _�*5���v _�u^����Rs�j�Rs�j�Rs�j�Q�+�K _�*5���v _�*5���v _�*5���v _�u^����Rs�j�Rs�j⥫Bǥ+�����̥+�Ǘ��̥+�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�F����.�|��\��ځ|��\��ځ|��\��ځ|�j�y�J�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�B}�tu �KW�����KW�����KW��KW4+�/]�9/] ]��U��tE���U��tE���U��tE���ը�ҕ�%�/]��KWT;�/]��KWT;�/]��KWT;�/]�:/]I]��U��tE���U��tE���U��tE���ը�ҕ�%�/]��KWT;/]:.]Ѭ8�tUf.]�@�t5�t%u �KW�����KW�����KW�����KW��KWR�@�tUj.]Q�@�tUj.]Q�@�tUj.]Q�@�t5�t%u �KW�����KW�����KW�����KW��KWR�@�tU�tE����U��tE���U��tE���ը�ҕ�%�/]��KWT;�/]��KWT;�/]��KWT;�/]��~� +�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�Jͥ+�ȗ�F����.�|��\��ځ|��\��ځ|��\��ځx�j�\���qx��q�d��2s�h�Rs�j�Q�+�K _��ͥ�t���^������E�K����������;�tϼ_�ޏK�����<p��O_�?�ǟ��v���/�����������_��˗q���^����w��|��P�~��~��?�ϗ�k�y�?�y����y|���E�N��;��N��;��;R�@�SQj�TP�@�SQj�TP�@�SQ�SA���NŐ�S!���NE��SA��NE��SA��NE��SA��NŨ�N��%��T��;T;��T��;T;��T��;T;��T�:�TH]�NE��SA��NE��SA��NE��SA��NE��w*���|���ܩ�ځ|���ܩ�ځx���q��f��1� +�K ߩ(5w*�v ߩ(5w*�v ߩ(5w*�v ߩuީ���Rs��j�Rs��j�Rs��j�Q� +�K ߩ(5w*�v ߩ(5w*�v ߩ(5w*�v ߩuީ���Rs��j❊Bǝ +��w*�̝ +��w*F�w*�.�|���ܩ�ځ|���ܩ�ځ|���ܩ�ځ|�b�y�B��w*J͝ +��w*J͝ +��w*J͝ +��w*F�w*�.�|���ܩ�ځ|���ܩ�ځ|���ܩ�ځ|�b�y�B��w* +w*hVߩ(3w*�v ߩ(5w*�v ߩuީ���Rs��j�Rs��j�Rs��j�P��T@]�NE��SA��NE��SA��NE��SA��NŨ�N��%��T��;T;��T��;T;��T��;T;�T�;2;�T9�T��8�SQf�T�@�SQj�TP�@�S1�S!u �;��0w*�"�N�Ëߩ��߸�v>��_�Ne<�~�rw*��˯��C����_ƥ�?|���/o�'��ױ�����q���r�r�{_����bWf��g��m��6�����9��"0��j���Q���K ��)5�o�v ��)5�o�v ��)5�o�v ��u�������R3��j���R3��j���R3��j���A3�Ff����"�����o������oJ�����oF��o�.�<��Ԍ��ځ<��Ԍ��ځ<��Ԍ��ځ<�f�9�F���oJ�Q-��G�J�Q-��G�J�Q-��G�F�G��.�|T��բځ|T��բځxT��qT�f��Q�!sTKd��Q�2sT�h�Q�RsT�j�Q�RsT�j�Q�Q�Q-�K �*5G��v �*5G��v �*5G��v �uՒ��Q�RsT�j�Q�RsT�j�Q�RsT�j�Q�PߏjA]��V�9�E���V�9�E��V��͊�ZcΣZB�@>�Uj�jQ�@>�Uj�jQ�@>�Uj�jQ�@>�5�<�%u �Z����Z����Z����Z�ΣZR�@>�Uj�jQ�@>�Uj�jQ�@>�Uj�jQ�@>�5�<�%u �Z���ģZ���Z4+��j���ZD;��j�:�jI]��V�9�E���V�9�E���V�9�E���֨��%��j���ZT;��j���ZT;��j���ZT;��j�:�jI]��V�9�E���V�9�E���V�9�E���֨��%�j:�jѬ8>�Uf�j�@>�Uj�jQ�@>�5�<�%u �Z����Z����Z����Z��Ղ��Q�RsT�j�Q�RsT�j�Q�RsT�j�Q�Q�Q-�K �*5G��v �*5G��v �*5G��v �4G�dv�*r�"Yq|T���"ځ|T��բځ|Tk�yTK��G�t�i�j�E�Q�9>�=~��������|�G����ڇS�g�����/��ǟ�������m��o���N��~�����;��<�}������5?��?=]�� +�Q��?�����7�v �P(57�v �P(t�P�YqxCa��P�q|C���P ځ|C���P�ځ|C���P�ځ|Ca�yCA��7J� ��7J� ��7J� ��7F�7�.�|C���P�ځ|C���P�ځ|C���P�ځ|C!�� +P�@��Pjn(P�@��Pjn(P�@��P踡@������%�o(�� +T;�o(�� +T;�o(�� +T;�o(�:o(H]��B���@���B���@���B���@���¨��%�o(�� +T;�o(�� +T;�o(�� +T;�o(�:o(H]��B���@��B��͊� +e��� +�� +R�@��Pjn(P�@��Pjn(P�@��Pjn(P�@��0꼡 u � +���� +���� +���� +�� +R�@��Pjn(P�@��Pjn(P�@��Pjn(P�@��0꼡 u � +�� +4+�o(�� +D;�o(�� +T;�o(�:o(H]��B���@���B���@���B���@���B��7���|C���P�ځ|C���P�ځ|C���P�ځ|Ca�yCA��7J� ��7J� ��7J� ��7� ��7�7HV�P(37�v �P(57�v �Pu�P��� ��|sC�/2n(>��� ���m�@���t�������㸠�?������u1N&>\L<���}ݾB<��R닟����h������?�<���te��r����y�l�Ɋ; ��4E��5$+w�9fא�8]3d6�8\\S�\C��pnM�cm Ɋí5E��5$+����5";W�9F�8�XS�XXC��p_M�c^ Ɋ�q5#�m5+��Ք����1g�8V�P�8�TS�TC��pP͐�S#��pMM�cL Ɋ�)5E�%5$+w�9fԐ�8Q3d6Ԉ�8\PS�PC��p>M�c= Ɋ��4E��4$+����_";/~9~��8<�U��E����W���/�����x�Η� +�+_�#_+O|9.|��8��U�8�E���א��%���W��Ɋó^E��^$+oz9Nz��8<�5d�y��8��U�8�E���W��Ɋ�;^E�3^$+�x9ox�\���W��Ɋ��]E��]$+�nw����"�1w ��];�v9�v��8<�U��E���^W��\Ɋ�c]C�V�Ȏ�K]E�C]$+�t9�t��8��U�8�E���@א��%���:W��8Ɋ��\E��\$+�r9�r��8<�5dnr��8��U�8�E���W��5.���W��Ŋ�C\C��Ȏ�+\E�#\$+Op9.p��8��U�8�E������%����V���Ɋó[E��[$+on9Nn��8<�5d�m��8��U�8�E����V���Ɋ�;[E�3[$+�l �[";�.l���"�1�k8�kQ�8��U�8�E�����%���V��ɊÓZE��Z$+�i9�i��8<�伥r��KZE�CZ$+�h9�h��8��U�8�E������%���zV��xɊ��YE��Y$+�f9�f��8:�5⸙%���bVy��,z��\V��ZŊ�[YE�SY$+e �;Y";�d��7Ց,���̇�8<�=~��mel�gm�|";�y��}ʷ����B����ˏ?-�c��������� v�͇�����O�۟���B�c�C��/��@�~���E����7�<PO��/Rݟ��v���rz8[u��ځ���oE_�~c��,�K���}�|{��1��{<���Go�w@��./gi���@;��z���p�5�Oו��uT;��ו��uT;�ؕ�vT;�o؍:��I]��]��cG���]�9eG���]��fG���ݨ��%�Oڕ��vT;��ڕ��vT;�ە��vT;o� ��v2;��9�ۑ�8�pWfN��@>rWj��Q�@�s7�<t'u �Sw�����kw�����w�����w�ΣwR�@>{Wj��Q�@�|WjN�Q�@>~Wj��Q�@�7�<�'u �x����+x����Cx��Kx4+o� �cx";��ᕙ{xD;�/╚�xT;��╚�xT;���:�I]�4^���G��:^�9�G��@^���G��Fި�H��%��䕚;yT;�/啚SyT;��啚kyT;����~0��'�J��<��W�J��<���� +��hV��s�����Rs?�j��RsB�j��RsE�j��Q�!=�K ��+5���v _�+5���v �+5��v ��uՓ��Y�RsW�j�e�RsZ�j�q�Rs]�j�}�Q�=�K ��+57��v ^�+t�٣Yq|h��\�#ځ|ko�ylO����Jͽ=���J��=��G�J��=��w�F����.�|z���ޣځ|}�Ԝߣځ|���\�ځ|�o�y�O��g�J�>�ȗ�J�)>����J�5>����F���.�x���q��f��U�2s��h�a�Rs��j�m�Q�q>�K ��+5���v _�+5'��v �+5W��v ����P�5�O���[}T;�����s}T;�����}T;�o��:��I]�l_���G��r_�9�G��x_���G��~ߠ9�'����_��Ɋ�+~e���C~����[~��c~R�@>���w|�~Ϗ/2�?���E������ۯ��g>�ϼ��?����ˏ�����_���?��ww�_�9�?�����çc䧗����� >��ޟ����?���/��������9�����W��^�@����Uq�]Nv�L�<�ьJ3Z8�> �s��s�V��W���P���������R���������x��gY������U/��Q{�@�|~��T/��Q{�@=>�H����څsu�!��A�C��:��:D��CP�A�C��:��:Ĩ�!uR��K����! +\u�5�u�2S� ڃ\��Z��:�Qj�T{����A��Qj�T{����:��1�u�RS��ڃ\�(5u�=�u�RS��ڃ\�u�!��A�C��:��:D��CP�A�C��:��:Ġ�C��9�C��$k��e�A��Qj�T{����:��1�u�RS��ڃ\�(5u�=�u�RS��ڃ\�u�!��A�C��:��:D��CP�A�C��:��:Ĩ�!ur���!�� �!JM�jb��U��YsX�2u�=�u�2S� ڃ\�(5u�=�u�RS��ڃ\�u�!��A�C��:��:D��CP�A�C��:��:Ĩ�!ur���!�� �!JM�jr���!�� �!B��!��A�C��:��:D��CP�A�C��4k��c�:��1�u�RS��ڃ\�(5u�=�u�RS��ڃ\�u�!��A�C��:��:D��CP�A�C��:��:Ĩ�!ur���!�� �!JM�jr���!�� �!F�u�c����A��Q�CЬ9�C��:��:Ĩ�!ur���!�� �!JM�jr���!�� �!F�u�c����A��Qj�T{����A��1�CH�\�(5u�=�u�RS��ڃ\�(5u�=�u�QwB��:D��A��Qf�D{����A��1�CH�\�(5u�=�u�RS��ڃ\�(5u�=�u�P�u�s����A��Qj�T{����A��1�CH�\�(5u�=�u�RS��ڃ\�(5u�=�u�AS���sX�(r�!H��!�L�hr���!�� �!F�u�c��*L�/�ꐛ9�C�_���<���0|���[�˷��t�-�����Z��K���O��2>���������̗>}9=<��|��=><> +AN_�^��Mx�<t���_�����O�����;j����V�<{G��������C/���s��kp:I���������U/��Q{�@}}�����^��������ӥ�2�z��1x�>=|�b�˳w�<P_���R/��Q{�@=��H��g�=�q����exvj�Eu��/�ӋT/��Q{�@=�H�������d�˳w��X=���^���eu�O/_�J����ԗ�ӫU/��Q{�@}}x�?���c���������}�ɳ�����5x����;j����G�^������z�*<?I����?V��_�'��gY������,�˳w�<P�_�����������z�2|����;j~�>�>}���ֳ��������������������U/��Q{�@}}�l^��Q{�c�����Y~�Yϲ:���٪�g�=x����'�ˣw̚; �_�'� g={������Q��YV���z��䷹�����W�U/��Q{�@]'3���� ��0��A��J� T{�op(578P�A������@���Q� R� ��Pjnp�ڃ|�C����j� ���=�78��op�:��2/78P�� +\78P�9������@���P�78@��|�C����j� ���=�78���� ��0��A��J� T{�op(578P�A������@���Q� R� ��Pjnp�ڃ|�C����j� ���=�78�d���P���d�� e��=�78���� ��0��A��J� T{�op(578P�A������@���Q� R� ��Pjnp�ڃ|�C����j� ���=�78��op�:��Rs���J� T{op(t��@����!s��Ȟ��� D{�op(578P�A������@���Q� R� ��Pjnp�ڃ|�C����j� ���=�78��op�:��Rs���J� T{�op(578P�A��!�� P� ��Pjnp�ڃ|�C����j� ��h���0��A��J� T{�op(578P�A������@���Q� R� ��Pjnp�ڃ|�C����j� ���=�78��op�:��Rs���J� T{�op(578P�A��a�}���1�78���� ��P���f�� e��=�78��op�:��Rs���J� T{�op(578P�A��a�}���1�78���� ��Pjnp�ڃ|�C����j� ����A������@���Rs���J� T{�opu�� u� ��h���Pfnp ڃ|�C����j� ����A������@���Rs���J� T{�op�z��9�78���� ��Pjnp�ڃ|�C����j� ����A������@���Rs���J� T{op478��9����u�ɚ��� D{�op_V�����~s���}�ӧó��������ӝ-=}=��퍞�ϿX|���^��8���_�����g����_�������W�:������U���&��,��fo^�8�}�"͢ڃ�*tE�h�G����,�c��Y�&�E�9�Uj�YT{��Y�&�E�9�5�fI��*5�,�=�ѬR͢ڃ�*5�,�=�ѬQw4K��hV��fQ�A�f��h��hV��fQ�A�f���YR� G�JM4�jb4��͢Ys�*3�,�=�ѬQw4K��hV��fQ�A�f��h��hV��fQ�A�f���YR� G�JM4�jr4��D��� G�JM4�jr4k�͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��h��1HѬ2/�,��c�*pE�(�G��L4�hr4+�k4��hV��fQ�A�f��h��hV��fQ�A�f���YR� G�JM4�jr4��D��� G�JM4�jr4k�͒:9�Uj�YT{��Y�&�E�9�Uj�YT{�Y�&�%��0�U�f��9�f��h��hV��fQ�A�f���YR� G�JM4�jr4��D��� G�JM4�jr4k�͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��h��1�ѬR͢ڃ�*5�,�=�ѬBW4�f�a4k�D�D�G��L4�hr4��D��� G�JM4�jr4k�͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��h��1�ѬR͢ڃ�*5�,�=�ѬR͢ڃ� +�͂:9�Uj�YT{��Y�&�E�1�U�fѬ9�f���YB� G�JM4�jr4��D��� G�JM4�jr4k�͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��h��1�ѬR͢ڃ�*5�,�=�ѬR͢ڃ�uG���A�f��h��hV�+�E��8�Uf�YD{��Y��h��1�ѬR͢ڃ�*5�,�=�ѬR͢ڃ�uG���A�f��h��hV��fQ�A�f��h��h֨;�%ur4��D��� G�JM4�jr4��D��� G�F��,�c�Y��h͚�hV��f�A�f��h��h֨;�%ur4��D��� G�JM4�jr4��D��� G�B�F���A�f��h��hV��fQ�A�f��h��h֨;�%ur4��D��� G�JM4�jr4��D��� F�M4Kf�a4���"Ys�*3�,�=���q���Y|�K4{���LjfOw�٧����0�]�$����˟~�����w����H�����1�u��Ƿ:=}|��lfz�|6���6����fF�����z�lfP� 6�R��̨� 6�R��̨� 6�R��̨� 6�Q�g3�:���������\���Q�A���2s4k�3sc�̜�1ș�R���ڃ��+5�9�=ș�R���ڃ��ug椎A�̕�����\���Q�A�̕�����ܨ;3'urf��d�� g�JMf�jrf��d�� g�Fݙ9�c�3s�&3G�13W���Ѭ9�̕�����ܨ;3'urf��d�� g�JMf�jrf��d�� g�Fݙ9�c�3s�&3G�93Wj2sT{�3s�&3G�937���I���+5�9�=ș�R���ڃ��+5�9�=ș�QwfN���\�����1���2sk�3se&3G�93�53urf��d�� g�JMf�jrf��d�� g�Fݙ9�c�3s�&3G�93Wj2sT{�3s�&3G�937���I���+5�9�=ș�R���ڃ��+5�9�=���A����s��+re�H�g��Lf�hrf��d�� g�Fݙ9�c�3s�&3G�93Wj2sT{�3s�&3G�937���I���+5�9�=ș�R���ڃ��+5�9�=ș�QwfN���\���Q�A�̕�����\�+3G��037d2s"{�3se&3G�93Wj2sT{�3s�&3G�937���I���+5�9�=ș�R���ڃ��+5�9�=ș�QwfN���\���Q�A�̕�����\���Q�A�̅z��A����+5�9�=ș�R���ڃ��+te�h�g��ܙ9�c�3s�&3G�93Wj2sT{�3s�&3G�937���I���+5�9�=ș�R���ڃ��+5�9�=ș�QwfN���\���Q�A�̕�����\���Q�A�̍�3sR� g�JMf�jbf�Е��Ys��+3�9�=ș�QwfN���\���Q�A�̕�����\���Q�A�̍�3sR� g�JMf�jrf��d�� g�JMf�jrfnԝ��:93Wj2sT{�3s�&3G�93Wj2sT{�3s��̜�1���BWf�f�qf��d�� g�JMf�jrfnԝ��:93Wj2sT{�3s�&3G�93Wj2sT{�3s�^3sP� g�JMf�jrf��d�� g�JMf�jrfnԝ��:93Wj2sT{�3s�&3G�93Wj2sT{3s�&3'��03W��̑�9�̕������8�V�9��%3�y �̏����l淿$w:qf��If��2��������_y�v����N�n��/G����×���m=t�n4������/�Ac~y��1x�>=|�b�˳w�<PWt��T��� W�JMŏjr�/�k���_���Q�A�������_���Q�A����+~R� W�JMŏjrů�T��� V� +]?�5��1w�O��_���Q�A�������_���Q�A����+~R� W�JMŏjrů�T��� W�JMŏjr�o�]�:��Wj*~T{�+~���G���Wj*~T{�+~��1��RS�ڃX�+tU�h�W��Lŏhr�o�]�:��Wj*~T{�+~���G���Wj*~T{�+~��1��RS�ڃ\�+5?�=��RS�ڃ\�uW���A�������_���Q�A�������ߨ��'uRů�Kŏ��V� +\?�5��2S�#ڃ\��Z�:��Wj*~T{�+~���G���Wj*~T{�+~��1��RS�ڃ\�+5?�=��RS�ڃ\�uW���A�������_���Q�A������Ċߠ����9���*~$k�+~e��G���Wj*~T{�+~��1��RS�ڃ\�+5?�=��RS�ڃ\�uW���A�������_���Q�A�������ߨ��'urů�T��� W�JMŏjbů�U�YsX�2?�=��2S�#ڃ\�+5?�=��RS�ڃ\�uW���A�������_���Q�A�������ߨ��'urů�T��� W�JMŏjrů�T��� W�B�V���A�������_���Q�A���*~4k�+~c�1��RS�ڃ\�+5?�=��RS�ڃ\�uW���A�������_���Q�A�������ߨ��'urů�T��� W�JMŏjrů�T��� W�F�?�c�+~���G���W��Ѭ9�������ߨ��'urů�T��� W�JMŏjrů�T��� W�F�?�c�+~���G���Wj*~T{�+~���G���7��I�\�+5?�=��RS�ڃ\�+5?�=��Qw�O�Ċ_���G���Wf*~D{�+~���G���7��I�\�+5?�=��RS�ڃ\�+5?�=��P�?�s�+~���G���Wj*~T{�+~���G���7��I�\�+5?�=��RS�ڃ\�+5?�=��AS��sX�+rU�H�W��Lŏhr������R�T����g~X���?����H�����ͯ�~����8�����z��������统����nDž������Ț��>y�ˏ�1�m�!��Ys�2]9�5�U�!�Ys��r�@���LNNd�qLnȴ�D���F\!9��c��pW� �7�LBNd�q@n���D���L<Nd�q:.�]��s܍2�8�5�Ѹ!ӌYs\�2�8�5ǹ� w-d�q+nȤ�D���L'Nd�q%n�D�D�'�܅8�=�}�!��Ys�q��ގqn���$�g��U8�=�M�!��Ys�2=8�5�5�!�Ys��r��@�w��LNd�qn�4�D���L�Nd�q�-�]�s�~2�7�5��!�}Ys\}2�7�5�ɷ w� d�Q�m�K�M����F[�7q�c\z0�7�5Ǚ�}�Zy�c�oC&�&��8�6d�n"k��nC&�&��8��.���9� ���Ț�ېi���9.� ���Ț�[������6dRn"k�CnC��&���6d"n"kn!���ư�6�ʷɻ�xۀi�I�9.� �p�Ț�l[������6d�m"k��mC��&���6dbm"k�SmA�RȞ�Nېɴ��9�� �F�Ț�Bې ���9γ��l {��lC&�&��8�6d�l"k�l#�(���1L���"��ۀɱI�9�� ��Ț�ې ���9ΰ�+l {�lC&�&��8�6d�k"k��kC&�&��8��.���9� ��Ț��ڐi���9.� ���Ț���>y����1ǭ�!�ZYsZ2�5�5���WdM��'�܅5�=�}�!�WYsW2m5�5�e�!VYs�UrW�@�7ՆLRMd�qPm���D��ԆLLMd�qJ-�]R�s�Q25�5��!�PYs\P25�5��� w= d�q;mȤ�D���F\�4��c\M0�4�5�ɴ w1 d�q/m���D��҆L+Md�q)mȄ�D�g҂ܕ4�=Ǎ�!�HYsH2}4�5�u�!GYs�Fr��@�wцLMd�qm�4�D�цLMd�q-�]C�s�Bq��ގqm�t�$�WІLMd�q-�]@�s�?2�3�5��!�>Ys\>2�3�5���}�Z=�c��gC&y&��8x6dzg"k�kgC&v&��8u�.���9� �̙Ț��ِi���9.� ���ȚüY����1l����f�n�8l6`�fk����NWE��������a�|�^��x�N�|��%�y&M���4��?����.��o���_>�X������Oϧòy}R8��z��?)��9��pV{?)ܩ��f���v� +�Y�AL���[nR� ��N]97�=�A�SW��jb���u�ڃ�u+5]7�c�n�����ĸ۩��f���v�%�f��0�VfoD� V�N]�7�=���SW��jb���{�ڃ�{+5�7�c�o������۩��f���v� +�Y�AL�����1���SW��jb���U��ڃ;uE�� f�JM���ܩ+g�)w�g��w� +��AL�&�1�U�SW�jb��U��ڃ؆;u��� ��JM���Bܩ+g�1w��Y�A�ĝ�BqV{Sq��Gub-�ԕ��ڃ�;u�� 6�N]�8�=�ٸRӍ�:�w�t���1��x��Y�9�ǝ�rF{r��9��SWF�jbH��U��ڃؒ;u��� ��JMO��Ģܩ+)g�1*w��Y�A�ʝ��rV{�r��-Gub]�ԕ��ڃ�;u�� 6�N]�9�=H��BWg�f�Qi��Kj�d�al��U�3ڃ؛;u�� &�JMs����ܩ+;g�1<w�*�Y�Alϝ��sV{�s��?Gub��ԕ��ڃ�;uU�� v�N]!:�=�)�RӢ�:�Fw���Y�Aҝ��tV{��t�^�t6k��tE�.ɞ�2ݙ+Mg�1Nw��Y�A�ӝ�uV{u��QGub��ԕ��ڃ�;u��� ��N]�:�=���Rӫ�:�Xw�J�Y�A�֝��uV{�u��p���tݨ�]'ub��ԕ��ڃ�;u�� 5��D�l�f��Lǎ�Ēݩ+eg�1fw��Y�A�ٝ��vV{�v��iGub��ԕ��ڃ�;u���� ��N]q;�=�y�Rӷ�:�pw�J�Y�A�ܝ�*wV{;w��Н���]�i�Q�X�;u��� ���l�6��\�;�=�ٻRӽ�:�|w�J�Y�A�ߝ��wV{�w������^�i�Q�X�;ue�� ��N]%<�=�-�SW�jb����A,❺�xV{�x��*���.ީ+�g�1�Wj�xT� �����l���\�<�=���SW$�jb&��t�A,坺RyV{cy��Z���^ީ+�g�1�7�n�I��X�;ue�� ��N]�<�=���SW<�jb>����A,蝺zV{#z�����Ďީ+�g�)�W�j���9��y�陬9Ꝺ�zF{�zL��G��ߞ�}����۟<����?�}���w��o��ׇ��>|��L�T�O���߿|��˿��?~�����?����a��Wg�7��}�zֿ����!x����K�O�_�^O�����;h�/O��zy��ڃ��×��R�<{G����]70�>�@��s JT{��%(5�P�A>��ԜK@��\�P��@��|.A�9��j���\�=����s �� �K0�>�@��s JT{��%(5�P�A<���u.͚�s ����|.A�9��j���\�=����s �� �K0�>�@��s JT{��%(5�P�A>��ԜK@��\�Q��R� �KPj�%�ڃ|.A�9��j���\�=�����%�:�\�Rs.��s +]�Ь9>��̜K@��\�Q��R� �KPj�%�ڃ|.A�9��j���\�=�����%�:�\�Rs.��s JT{��%(5�P�A>�`�}.��1����s �� �KPj�%�ڃ|.A�9��j���s ��A:���˹o��\�k��%(3��A>� ��P� �KPj�%�ڃ|.A�9��j���\�=�����%�:�\�Rs.��s JT{��%(5�P�A>�`�}.��1����s �� �KPj�%�ڃ|.A�9��j���\�=����% Ys|.A�9��h���\�=�����%�:�\�Rs.��s JT{��%(5�P�A>�`�}.��1����s �� �KPj�%�ڃ|.A�9��j���s ��A>��ԜK@��\�Rs.��s +]�Ь9<�`ȜK ���\�2s.��s JT{��%(5�P�A>�`�}.��1����s �� �KPj�%�ڃ|.A�9��j���s ��A>��ԜK@��\�Rs.��s JT{��%�z.�9����s �� �KPj�%�ڃx.A��\�5�����%:�\�Rs.��s JT{��%(5�P�A>�`�}.��1����s �� �KPj�%�ڃ|.A�9��j���s ��A>��ԜK@��\�Rs.��s JT{��%u�K u���\�=����%�Ys|.A�9��h���s ��A>��ԜK@��\�Rs.��s JT{��%u�K u���\�=����s �� �KPj�%�ڃ|.���\�c��%(5�P�A>��ԜK@��\�Rs.��s F��H�x.A��\�5����s �� �KPj�%�ڃ|.���\�c��%(5�P�A>��ԜK@��\�Rs.��s B��K�u���\�=����s �� �KPj�%�ڃ|.���\�c��%(5�P�A>��ԜK@��\�Rs.��s 2{�%(r�K@���\�2s.��s ��?���q9�p�p.��=~�|z}x~�O��(��K����B=^r��矧>,��Cy&N�d�����?��_/�˿~��?���_�w����W������я�5�����͋g��_�YT{�Y��l͚�l֘;�%tr6��d��� g�JM6�jr6��d��� g�F��,�c��Y�&�E�9�Uj�YT{��Y�&�E�9�5��fI���*5�,�=�٬R�͢ڃ��*5�,�=�٬Qw6K��lV��fQ�A�f��Y4k��Ye&�E�9�5��fI���*5�,�=�٬R�͢ڃ��*5�,�=�٬Qw6K��lV��fQ�A�f��l��lV��fQ�A�f���YR� g�JM6�jr6��d��� g�JM6�jr6kԝ͒:)�U�%�E�v�Y�lŚ�lV��f�A�f�z�fA����*5�,�=�٬R�͢ڃ��*5�,�=�٬Qw6K��lV��fQ�A�f��l��lV��fQ�A�f���YR� g�JM6�jr6��d��� g�JM6�jb6k�d�d�f��\�,�5�٬2��"ڃ��*5�,�=�٬Qw6K��lV��fQ�A�f��l��lV��fQ�A�f���YR� g�JM6�jr6��d��� g�JM6�jr6kԝ͒:9�Uj�YT{��Y�&�E�1�U��fѬ9�f �l�Ȟ�lV��f�A�f��l��lV��fQ�A�f���YR� g�JM6�jr6��d��� g�JM6�jr6kԝ͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y�^�YP� g�JM6�jr6��d��� f� +]�,�5�٬1w6K��lV��fQ�A�f��l��lV��fQ�A�f���YR� g�JM6�jr6��d��� g�JM6�jr6kԝ͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��l��1�٬R�͢ڃ��*te�h�g��L6�hr6kԝ͒:9�Uj�YT{��Y�&�E�9�Uj�YT{��Y��l��1�٬R�͢ڃ��*5�,�=�٬R�͢ڃ��ug���A�f��l��lV��fQ�A�f��l��l֨;�%ub6�Е͢Ys��*3�,�=�٬R�͢ڃ��ug���A�f��l��lV��fQ�A�f��l��lV��l�9�٬R�͢ڃ��*5�,�=�٬R�͢ڃ��ug���A�f��l��lV��fQ�A�f��l��l֠�f��9�f��Y$k��Ye&�E�9���Sd���l��5 �=~���>��fߢ��9f��d��+��o����D��|���˕� ��r�����ܟ!|�ǟ!��E�3�Q�A�a��3�Q�A�a���&u�g+514�=�1�RC�ڃC+t��h�����14�c�ch�&�F�9�VjbhT{�ch�&�F�9�6ꎡI�C+514�=�1�RC�ڃC+514�=�1�QwM��Z���Q�A������Z���Q�A����chR� ��JM�jb��C�YsC+314�=�1�QwM��Z���Q�A������Z���Q�A����chR� ��JM�jr���Ш� ��JM�jrm�C�:9�VjbhT{�ch�&�F�9�VjbhT{�ch����1H1�2/14��cC+p��(����L�hr-�k ��Z���Q�A������Z���Q�A����chR� ��JM�jr���Ш� ��JM�jrm�C�:9�VjbhT{�ch�&�F�9�VjbhT{ch�&�&��0�V䊡��9������Z���Q�A����chR� ��JM�jr���Ш� ��JM�jrm�C�:9�VjbhT{�ch�&�F�9�VjbhT{�ch����1�1�RC�ڃC+514�=�1�BW�f�am���D����L�hr���Ш� ��JM�jrm�C�:9�VjbhT{�ch�&�F�9�VjbhT{�ch����1�1�RC�ڃC+514�=�1�RC�ڃC�C�:9�VjbhT{�ch�&�F�1�V芡Ѭ9����chB� ��JM�jr���Ш� ��JM�jrm�C�:9�VjbhT{�ch�&�F�9�VjbhT{�ch����1�1�RC�ڃC+514�=�1�RC�ڃCu�Ф�A������Z�+�F��8�VfbhD{�ch����1�1�RC�ڃC+514�=�1�RC�ڃCu�Ф�A������Z���Q�A������ڨ;�&ur���Ш� ��JM�jr���Ш� ��F�14�cch��͚�Z����A������ڨ;�&ur���Ш� ��JM�jr���Ш� ��B��Р�A������Z���Q�A������ڨ;�&ur���Ш� ��JM�jr���Ш� ��MMf�a��C#YsC+314�=�14E�"������7�1��{���!�����������O+���:}���~�������������O���� 5��t�-��������×o�đ^u=t������������˳w�<P_���6K��g�=x�a����gQ����ҕ�����]� �Q�Aݕ�����ݨ;t'ur�Ԅ�� ��JM�jb����Ys�s�Aݕ�����]� �Q�Aݕ�����ݨ;t'ur�Ԅ�� ��JM�jr�Ԅ�� ��Fݡ;�c�Cw�&tG�9tWjBwT{�Cw�&tG�9t7��I��+5�;�=���BW�f�q�̄�� ��Fݡ;�c�Cw�&tG�9tWjBwT{�Cw�&tG�9t7��I��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��ʼ��(ގa����Xs�+3�;�=ȡ�P��;�s�Cw�&tG�9tWjBwT{�Cw�&tG�9t7��I��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�A� �Н̞��]�+tG��8tWfBwD{�Cw�&tG�9t7��I��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� �� +]�;�5���!��s�+3�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�.�k����]� �Q�Aݕ�����]�+tG��8t7�� ��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�n���:9tWjBwT{Cw���͚��]� ��Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�n���:9tWjBwT{�Cw�&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ�u�A��Bw4k�Cwe&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ����:9tWjBwT{�Cw�&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ�4�;�=���"W�d�q�̄�� ��DZ� +��=.���k�C����3?�����R���뙄�� ݿ�����~�闏����zr���>�܍�����q���E nG�9nWj�vT{��v�^�vP� ��JMjrܮ����� ��JMjr�n���:9nWj�vT{��v�&nG�1nW��Ѭ9�ۍ��vB� ��JMjrܮ����� ��JMjr�n���:9nWj�vT{��v�&nG�9nWj�vT{��v��1�q�R��ڃ�+5q;�=�q�R��ڃ�u����A�ە���ĸ]�+nG��8nWf�vD{��v��1�q�R��ڃ�+5q;�=�q�R��ڃ�u����A�ە����]���Q�A�ە����ݨ;n'urܮ����� ��JMjrܮ����� ��F�q;�c��ve^�vo�0nW���Q�9�ە����]��9�q�R��ڃ�+5q;�=�q�R��ڃ�u����A�ە����]���Q�A�ە����ݨ;n'urܮ����� ��JMjrܮ����� ��M�Nf�aܮ��#Ys�+3q;�=�q�R��ڃ�u����A�ە����]���Q�A�ە����ݨ;n'urܮ����� ��JMjrܮ����� ��F�q;�c��v�&nG�9nWj�vT{�v���͚øݐ�ۉ�9�ە����]���Q�A�ە����ݨ;n'urܮ����� ��JMjrܮ����� ��F�q;�c��v�&nG�9nWj�vT{��v�&nG�9n�5nurܮ����� ��JMjbܮ���Ys�s�턎A�ە����]���Q�A�ە����ݨ;n'urܮ����� ��JMjrܮ����� ��F�q;�c��v�&nG�9nWj�vT{��v�&nG�9n7��I��+5q;�=�q�BWf�qܮ���� ��F�q;�c��v�&nG�9nWj�vT{��v�&nG�9n7��I��+5q;�=�q�R��ڃ�+5q;�=�q�Qw�N��]���Q�A�ە����]���Q�A�ۍ��vR� �� +]q;�5�q�2�#ڃ�+5q;�=�q�Qw�N��]���Q�A�ە����]���Q�A�ۅz��A���+5q;�=�q�R��ڃ�+5q;�=�q�Qw�N��]���Q�A�ە����]���Q�A�� ���̞ø]�+nG��8nWf�vD{����X[�������5 n?~��/�_ο�?k���>=�9=|��s��DO�_�兞�/���#o/�������~��_���wa���G��o�0k�t�9� k:=|��OI�������̟����C��/�zy��ڃ����U/��Q{�@}}���5�zy��ڃ�ϧ����gY�����"�o��1k�< >��yy�ڃ��k�l�˳w��X�|���]<��gY������5�zy��ڃ���p����;j��/����S���;j~��������Q׳�������ժ�g�=x��<<}�?G�g�=x��>��|����;j~���M?}��z��1x�������z��ڃ����$��g�=x����V�<{G������A�4|y�͞; �_�����������z�|����;j��_���˳w�<8ztzx|��pֳ���u]�Rj�J�ڃ|VJ�9+�j�Y)���=�g��z=+��RJ�Y)T{��J)5g�P�A>+�Ԝ�B����Q�Y)R� ��Rj�J�ڃ|VJ�9+�j�Y)���Rh���2�>+E��RJ�Y)T{��J)5g�P�A>+�Ԝ�B����Q�Y)R� ��Rj�J�ڃ|VJ�9+�j�Y)���=�g����J�:���RsV +��RJ�Y)T{��J)5g�P�A>+e�}V��1�g����R�� ��R�:+�f��Y)e��=�g����J�:���RsV +��RJ�Y)T{��J)5g�P�A>+e�}V��1�g����R�� ��Rj�J�ڃ|VJ�9+�j�Y)��R��A>+�Ԝ�B����RsV +��RJ�Y)T{��Ju��"u�Y)e^�J�x;�g���J�Xs|VJ�9+�h�Y)�^�J�:���RsV +��RJ�Y)T{��J)5g�P�A>+e�}V��1�g����R�� ��Rj�J�ڃ|VJ�9+�j�Y)��R��A>+�Ԝ�B����RsV +��RJ�Y)T{�J4g���9<+��uV +ɚ�R��Y)D{��J)5g�P�A>+e�}V��1�g����R�� ��Rj�J�ڃ|VJ�9+�j�Y)��R��A>+�Ԝ�B����RsV +��RJ�Y)T{��Ju��"u�Y)���=�g����R�� ��R�:+�f��Y)C��=�g����R�� ��Rj�J�ڃ|VJ�9+�j�Y)��R��A>+�Ԝ�B����RsV +��RJ�Y)T{��Ju��"u�Y)���=�g����R�� ��Rj�J�ڃ|VJ�׳R��A>+�Ԝ�B����RsV +�ijR +]g�Ь9>+e�}V��1�g����R�� ��Rj�J�ڃ|VJ�9+�j�Y)��R��A>+�Ԝ�B����RsV +��RJ�Y)T{��Ju��"u�Y)���=�g����R�� ��Rj�J�ڃ|Vʨ���c��J)5g�P�A<+��uV +͚�R��Y)D{��Ju��"u�Y)���=�g����R�� ��Rj�J�ڃ|Vʨ���c��J)5g�P�A>+�Ԝ�B����RsV +��RF�g�H�|VJ�9+�j�Y)���=�g����R�� ��2�>+E�ijR +]g�Ь9>+�̜�B����RsV +��RF�g�H�|VJ�9+�j�Y)���=�g����R�� ������s��J)5g�P�A>+�Ԝ�B����RsV +��RF�g�H�|VJ�9+�j�Y)���=�g����R�� ��2h�J��sxVJ���5�g����R�� ��:>���J�{\�Jݼ������{|��sRtV��]��y��__�|x�j=�G.g�N�Կ���~���7���g��z�y��=ǧ���>���|te*m=�h�}�ö���8n�Y�Al띺�zV{�z�����Ķި��'ub[���ֳڃ��;u���� ��N]m=�=�m�R�֣:��w�j�Y�Al띺�zV{��z�^�z6k�ze��Gtb[���ֳڃ��;u���� ��N]m=�=�m�R�֣:��w�j�Y�Al띺�zV{�z�����Ķ^�i�Q���;u���� ��N]m=�=�m�SW[�jb[�Դ���Al띺�zV{��z�^�z6k�zg����Ķ^�i�Q���;u���� ��N]m=�=�m�SW[�jb[�Դ���Al띺�zV{�z�����Ķީ��g���Wj�zT� ��N]m=�=�m�SW[�jb[���ֳڃ��+5m=�c�zg~k�Y���ށ���Śöޙ��g���7�n�I����;u���� ��N]m=�=�m�SW[�jb[�Դ���Al띺�zV{�z�����Ķީ��g���Wj�zT� ��N]m=�=�m�SW[�jb[���ֳڃ��+t��h�������L����\m=�=�m�SW[�jb[�Դ���Al띺�zV{�z�����Ķީ��g���Wj�zT� ��N]m=�=�m�SW[�jb[���ֳڃ��+5m=�c�z�����Ķީ��g���w襭g�樭W�j��9l띹�zF{�z�����Ķީ��g���Wj�zT� ��N]m=�=�m�SW[�jb[���ֳڃ��+5m=�c�z�����Ķީ��g���w�j�Y�Al덺�zR� ��N]m=�=�m�SW[�jR[��K[�f�a[�̴���Al띺�zV{�z�����Ķީ��g���Wj�zT� ��N]m=�=�m�SW[�jb[���ֳڃ��+5m=�c�z�����Ķީ��g���w�j�Y�Al땚��1�m�SW[�jR[��K[�f�a[����3ڃ��+5m=�c�z�����Ķީ��g���w�j�Y�Al땚��1�m�SW[�jb[���ֳڃ��;u���� ��JM[��Ķީ��g���w�j�Y�Al띺�zV{�z���GuR[��K[�f�a[����3ڃ��;u���� ��JM[��Ķީ��g���w�j�Y�Al띺�zV{�z��9�m�SW[�jb[���ֳڃ��;u���� ��JM[��Ķީ��g���w�j�Y�Al띺�zV{��z���͞��ޑ���ɚöޙ��g����B�n[������8n��=~�|z}x�����b?n�O����B�����ç�ώ��<��>}�?����|�u�xz��~�����b�/������b��{����?z����Q6{�|zx}�Se^����������ɪ�g�=x��>|�j|/��Q{��j�:�`�}���1�w����� �ePj�2�ڃ|�A��ˀj�]�^�2�:�.�Rs���J�]T{��2(5wP�A��`�}���1�w����� �ePj�2�ڃx�A��.�5�w���2:�.�Rs���J�]T{��2(5wP�A��`�}���1�w����� �ePj�2�ڃ|�A��ˀj�]����A�ˠ��e@��.�Rs���J�]T{��2u�e u�]��.�=�w��2�Ys|�A��ˀh�]����A�ˠ��e@��.�Rs���J�]T{��2u�e u�]��.�=�w����� �ePj�2�ڃ|����.�c��2(5wP�A�ˠ��e@��.�Rs���F�wH�t�A���(ގ�]��(��ePf�2 ڃ|�A���A�ˠ��e@��.�Rs���J�]T{��2u�e u�]��.�=�w����� �ePj�2�ڃ|����.�c��2(5wP�A�ˠ��e@��.�Rs��Ļ�]2{�2(r�e@���.�2s���J�]T{��2u�e u�]��.�=�w����� �ePj�2�ڃ|����.�c��2(5wP�A�ˠ��e@��.�Rs���F�wH�|�A��ˀj�]��.�=�w��2�Ysx�����@d��]e�.�=�w����� �ePj�2�ڃ|����.�c��2(5wP�A�ˠ��e@��.�Rs���F�wH�|�A��ˀj�]��.�=�w����� �e��.�s��2(5wP�A�ˠ��e@��.�B�]4k��2s�e t�]��.�=�w����� �ePj�2�ڃ|����.�c��2(5wP�A�ˠ��e@��.�Rs���F�wH�|�A��ˀj�]��.�=�w����� �e0��@��J�]T{�2(t�e@���.�2s���F�wH�|�A��ˀj�]��.�=�w����� �e0��@��J�]T{��2(5wP�A�ˠ��e@��.�Q�]R� �ePj�2�ڃ|�A��ˀj�]��.�=�w���2�:�.�B�]4k��2(3w�A�ˠ��e@��.�Q�]R� �ePj�2�ڃ|�A��ˀj�]��.�=�w�z�����J�]T{��2(5wP�A�ˠ��e@��.�Q�]R� �ePj�2�ڃ|�A��ˀj�]��.�=�w��d��eP�ˀd��]e�.�=�w�� �����7�w��c�e8ݹ�������]��L�2<�����|�u���������z=�dqp�����������C����/y:;�?z��˳w�<P_����R/��Q{�@}}x}��4�^�����������Y��YV���z�2<�J��������Ӕzy��ڃ�?��4A��AsЄ̞�&��AD{��(5MP�A>h��4A����Q�AR� 4Qj��ڃ|�D�9h�j�A�� �=�M�z=h��&J�AT{��(5MP�A>h��4A����Q�AR� 4Qj��ڃ|�D�9h�j�A���&h�41�>hB��&J�AT{��(5MP�A>h��4A����Q�AR� 4Qj��ڃ|�D�9h�j�A�� �=�M����:���Rs���&J�AT{��(5MP�A>hb�}Є�1�M���&�� 4Q�:h�f��Ae� �=�M����:���Rs���&J�AT{��(5MP�A>hb�}Є�1�M���&�� 4Qj��ڃ|�D�9h�j�A��&��A>h��4A����Rs���&J�AT{��u4!u�Ae^��x;�M���Xs|�D�9h�h�A�^��:���Rs���&J�AT{��(5MP�A>hb�}Є�1�M���&�� 4Qj��ڃ|�D�9h�j�A��&��A>h��4A����Rs���&J�AT{�4M��9<h��u�ɚ�&��AD{��(5MP�A>hb�}Є�1�M���&�� 4Qj��ڃ|�D�9h�j�A��&��A>h��4A����Rs���&J�AT{��u4!u�A�� �=�M���&�� 4Q�:h�f��AC� �=�M���&�� 4Qj��ڃ|�D�9h�j�A��&��A>h��4A����Rs���&J�AT{��u4!u�A�� �=�M���&�� 4Qj��ڃ|�D�׃&��A>h��4A����Rs��ă& +]MЬ9>hb�}Є�1�M���&�� 4Qj��ڃ|�D�9h�j�A��&��A>h��4A����Rs���&J�AT{��u4!u�A�� �=�M���&�� 4Qj��ڃ|�Ĩ�� �c��(5MP�A<h��u�͚�&��AD{��u4!u�A�� �=�M���&�� 4Qj��ڃ|�Ĩ�� �c��(5MP�A>h��4A����Rs���&F�MH�|�D�9h�j�A�� �=�M���&�� 41�>hB�ă& +]MЬ9>h��4A����Rs���&F�MH�|�D�9h�j�A�� �=�M���&�� 4��� �s��(5MP�A>h��4A����Rs���&F�MH�|�D�9h�j�A�� �=�M���&�� 41h���sx�D�� �5�M���&�� 4�;� �����k�����8h�x���?�?=�A��L�<�4�������ӏ�����r��qE>�nr��v;�%�}�q���E �ur���dߨ� g�JM��jr���dߨ� g�F��7�c��o�&�F�9�Vj�oT{�o���͚��ۘ;�&tr���dߨ� g�JM��jr���dߨ� g�F��7�c��o�&�F�9�Vj�oT{��o�&�F�9�6�ξI��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQw�M���[�ɾQ�A̾��o4k��oe&�F�9�6�ξI��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQw�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:)�V�%�F�v�o��Ś��[�ɾ�Aξ�z;A���}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQw�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jb�m�d�d�fߊ\�7�5�ٷ2�}#ڃ�}+5�7�=�ٷQw�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�1�V�ʾѬ9̾ ��Ȟ��[�ɾ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o�^�oP� g�JM��jr���dߨ� f� +]�7�5�ٷ1w�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o����1�ٷR�}�ڃ�}+te�h�g��L��hr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o����1�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������ۨ;�&ub��Е}�Ys�}+3�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������[����9�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������۠ɾ��9̾��o$k��oe&�F�9���Yd������5 �>~��<}}>�k����E��������߳�^N��<s;O+���?���?~������������������]��*���7ݏخ����n��8�z�"N�ڃNu�S��A���p +��pJ�+�B��8�Rf�)D{��)��p��1��RN�ڃN)5��=��RN�ڃNu�S��A���p +��pJ� �P�A���p +��pʨ;�"ur8�ԄS�� �SJM8�jr8�ԄS�� �SF���c��)e^�)o�0�R� +�P�9���p +��pJ��p +�9��RN�ڃN)5��=��RN�ڃNu�S��A���p +��pJ� �P�A���p +��pʨ;�"ur8�ԄS�� �SJM8�jr8�ԄS�� �SM8Ef�a8��N!YsN)3��=��RN�ڃNu�S��A���p +��pJ� �P�A���p +��pʨ;�"ur8�ԄS�� �SJM8�jr8�ԄS�� �SF���c��)�&�B�9�Rj�)T{�)��p +͚�pʐ ���9���p +��pJ� �P�A���p +��pʨ;�"ur8�ԄS�� �SJM8�jr8�ԄS�� �SF���c��)�&�B�9�Rj�)T{��)�&�B�9��5�ur8�ԄS�� �SJM8�jb8��N�YsNs�S��A���p +��pJ� �P�A���p +��pʨ;�"ur8�ԄS�� �SJM8�jr8�ԄS�� �SF���c��)�&�B�9�Rj�)T{��)�&�B�9�2��H�N)5��=��BW8�f�q8�̄S�� �SF���c��)�&�B�9�Rj�)T{��)�&�B�9�2��H�N)5��=��RN�ڃN)5��=��Qw8E��pJ� �P�A���p +��pJ� �P�A����)R� �S +]��5��2N!ڃN)5��=��Qw8E��pJ� �P�A���p +��pJ� �P�A��z �@��N)5��=��RN�ڃN)5��=��Qw8E��pJ� �P�A���p +��pJ� �P�A��p�̞�pJ�+�B��8�Rf�)D{�é�H�S��p��5N�é�����p�������6��3�p�q�S�?���?�ۧO����?�ۧϟNg��?O}�Է��q%�{�^_�+��L�ʻg�y�����@�D��I��P�A��z&4k�{&e�gB��g2��H��3)5=�=�=�R�3�ڃ�3)5=�=�=�Qw�D��I��P�A�� ��I��P�A�{&R� �LJMτjrϤ��L�� �LJMτjr�d��3�:�gR�gB�v{&�� Ś�I���Az�@���3)5=�=�=�R�3�ڃ�3)5=�=�=�Qw�D��I��P�A�� ��I��P�A�{&R� �LJMτjrϤ��L�� �LJMτjb�d��Ld��L�\=�5�=�2�3!ڃ�3)5=�=�=�Qw�D��I��P�A�� ��I��P�A�{&R� �LJMτjrϤ��L�� �LJMτjr�d��3�:�gRjz&T{�{&��gB��gR��Ь9����Ȟ�I���A�� ��I��P�A�{&R� �LJMτjrϤ��L�� �LJMτjr�d��3�:�gRjz&T{�{&��gB��gRjz&T{�{&�^{&P� �LJMτjrϤ��L�� �L +]=�5�=�1w�D��I��P�A�� ��I��P�A�{&R� �LJMτjrϤ��L�� �LJMτjr�d��3�:�gRjz&T{�{&��gB��gRjz&T{�{&��1�=�R�3�ڃ�3)t�Lh��L�Lτhr�d��3�:�gRjz&T{�{&��gB��gRjz&T{�{&��1�=�R�3�ڃ�3)5=�=�=�R�3�ڃ�3u�L��A�� ��I��P�A�� ��ɨ�g"ubϤ��3�Ys�3)3=�=�=�R�3�ڃ�3u�L��A�� ��I��P�A�� ��I�מ �9�=�R�3�ڃ�3)5=�=�=�R�3�ڃ�3u�L��A�� ��I��P�A�� �Ğɠ���9��z&$k�{&e�gB��g:nqTτ�q�n^��r�3�ǟ�AP�����rϴ���LO�g�������{��;�����_o�R�;����:������/T�U��������O//��^�����ԗ���G�^������������ +�^�����������$��,�c�@=�>nL��g�=x���o��P���;j��/�'�^������稝>}}q�z��1x�>=|~�u�R/��Q{�@],��|R�=ȟT�Ԕ��� ��F�e'�c��N���D���T�*;Ѭ9.;�����Ө��$ur٩Ԕ��� ��JMىjr٩Ԕ��� ��F�e'�c��N���D���Tj�NT{��N���D���4�.;I�\v*5e'�=�e�RSv�ڃ\v*5e'�=�e�Qw�I���S�����1,;��Nk��Ne��D�����ur٩Ԕ��� ��JMىjr٩Ԕ��� ��F�e'�c��N���D���Tj�NT{��N���D���4�.;I�\v*5e'�=�e�RSv�ڃ\v*5e'�=�e�ASv��sXv*r��H����Lىhr٩Ԕ��� ��F�e'�c��N���D���Tj�NT{��N���D���4�.;I�\v*5e'�=�e�RSv�ڃ\v*5e'�=�e�Qw�I��S�);Q�A.;����IJS���D���4d�N"{��Ne��D���Tj�NT{��N���D���4�.;I�\v*5e'�=�e�RSv�ڃ\v*5e'�=�e�Qw�I��S�);Q�A.;�����S�);Q�A.;�z-;A��\v*5e'�=�e�RSv�ڃXv*t��h�����e'�c��N���D���Tj�NT{��N���D���4�.;I�\v*5e'�=�e�RSv�ڃ\v*5e'�=�e�Qw�I��S�);Q�A.;�����S�);Q�A.;���NR� ��JMىjb٩�Uv�Ys\v*3e'�=�e�Qw�I��S�);Q�A.;�����S�);Q�A.;���NR� ��JMىjr٩Ԕ��� ��JMىjr�i�]v�:��Tj�NT{��N���D���Tj�NT{��N��1�e�BWىf�q٩̔��� ��JMىjr�i�]v�:��Tj�NT{��N���D���Tj�NT{��N�^�NP� ��JMىjr٩Ԕ��� ��JMىjr�i�]v�:��Tj�NT{��N���D���Tj�NT{�N���$���T�*;��9.;������NTe'�ǥ�y (;����,;?�<<}��e�z�Zv>�������������������w?����_�ׇ�����^�↝�����t�iu;������k�/�_�R� �/JM��jr����/�� �/JM��jr�bԝ��:9Qj�T{���&A�9Qj�T{�������1���R���ڃ��(5��=���R���ڃ��u�/��A�_�y�_P���E�+A��8Qf�D{���^�P� �/JM��jr����/�� �/JM��jr�bԝ��:9Qj�T{���&A�9Qj�T{�������1���R���ڃ��(5��=���R���ڃ��4��=���"W��d�q����/�� �/JM��jr�bԝ��:9Qj�T{���&A�9Qj�T{�������1���R���ڃ��(5��=���R���ڃ��u�/��A�_������E��_P�A�_��4k�C&!��8Qf�D{���&A�9Qj�T{�������1���R���ڃ��(5��=���R���ڃ��u�/��A�_������E��_P�A�_������E����9���R���ڃ��(5��=���BW��f�q�b̝�:9Qj�T{���&A�9Qj�T{�������1���R���ڃ��(5��=���R���ڃ��u�/��A�_������E��_P�A�_������Ũ;!ur����/�� �/ +]��5���2�� ڃ��u�/��A�_������E��_P�A�_������Ũ;!ur����/�� �/JM��jr����/�� �/F���c���&A�9Qj�T{���&A�91��_H���(t�/h��/�L��hr����/�� �/F���c���&A�9Qj�T{���&A�9�5ur����/�� �/JM��jr����/�� �/F���c���&A�9Qj�T{���&A�11h�2{�E��ɚ��E��_�A�_�� ���{\�׀���=ο9��������g�}9=|y��������uοy�y���o���y{�~���}�C��?���endstream +endobj +802 0 obj << +/Type /Page +/Contents 803 0 R +/Resources 801 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +/Annots [ 805 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R ] +>> endobj +805 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 679.836 158.096 686.82] +/Subtype /Link +/A << /S /GoTo /D (about) >> +>> endobj +808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 679.836 537.983 686.82] +/Subtype /Link +/A << /S /GoTo /D (about) >> +>> endobj +809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 662.456 203.466 671.367] +/Subtype /Link +/A << /S /GoTo /D (copyright) >> +>> endobj +810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 662.456 537.983 671.367] +/Subtype /Link +/A << /S /GoTo /D (copyright) >> +>> endobj +811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 651.562 156.791 658.416] +/Subtype /Link +/A << /S /GoTo /D (disclaimer) >> +>> endobj +812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 651.562 537.983 658.416] +/Subtype /Link +/A << /S /GoTo /D (disclaimer) >> +>> endobj +813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 638.61 168.438 645.465] +/Subtype /Link +/A << /S /GoTo /D (newversions) >> +>> endobj +814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 638.61 537.983 645.465] +/Subtype /Link +/A << /S /GoTo /D (newversions) >> +>> endobj +815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 625.659 141.858 632.513] +/Subtype /Link +/A << /S /GoTo /D (credits) >> +>> endobj +816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 625.659 537.983 632.513] +/Subtype /Link +/A << /S /GoTo /D (credits) >> +>> endobj +817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 612.708 206.894 619.562] +/Subtype /Link +/A << /S /GoTo /D (conventions) >> +>> endobj +818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 612.708 537.983 619.562] +/Subtype /Link +/A << /S /GoTo /D (conventions) >> +>> endobj +819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 597.345 135.76 604.329] +/Subtype /Link +/A << /S /GoTo /D (introduction) >> +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 597.345 537.983 604.329] +/Subtype /Link +/A << /S /GoTo /D (introduction) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 579.965 184.467 588.877] +/Subtype /Link +/A << /S /GoTo /D (whatis) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 579.965 537.983 588.877] +/Subtype /Link +/A << /S /GoTo /D (whatis) >> +>> endobj +823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 567.014 237.299 575.925] +/Subtype /Link +/A << /S /GoTo /D (why) >> +>> endobj +824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 567.014 537.983 575.925] +/Subtype /Link +/A << /S /GoTo /D (why) >> +>> endobj +825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 551.806 143.421 560.693] +/Subtype /Link +/A << /S /GoTo /D (using) >> +>> endobj +826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 551.806 537.983 560.693] +/Subtype /Link +/A << /S /GoTo /D (using) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 536.329 206.903 545.24] +/Subtype /Link +/A << /S /GoTo /D (how) >> +>> endobj +828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 536.329 537.983 545.24] +/Subtype /Link +/A << /S /GoTo /D (how) >> +>> endobj +829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 523.378 249.872 532.289] +/Subtype /Link +/A << /S /GoTo /D (myaccount) >> +>> endobj +830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 523.378 537.983 532.289] +/Subtype /Link +/A << /S /GoTo /D (myaccount) >> +>> endobj +831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 510.426 218.341 519.338] +/Subtype /Link +/A << /S /GoTo /D (bug_page) >> +>> endobj +832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 510.426 537.983 519.338] +/Subtype /Link +/A << /S /GoTo /D (bug_page) >> +>> endobj +833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 497.475 221.379 506.386] +/Subtype /Link +/A << /S /GoTo /D (query) >> +>> endobj +834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 497.475 537.983 506.386] +/Subtype /Link +/A << /S /GoTo /D (query) >> +>> endobj +835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 484.523 182.933 493.435] +/Subtype /Link +/A << /S /GoTo /D (list) >> +>> endobj +836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 484.523 537.983 493.435] +/Subtype /Link +/A << /S /GoTo /D (list) >> +>> endobj +837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 471.572 191.242 480.483] +/Subtype /Link +/A << /S /GoTo /D (bugreports) >> +>> endobj +838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 471.572 537.983 480.483] +/Subtype /Link +/A << /S /GoTo /D (bugreports) >> +>> endobj +839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 460.678 197.409 467.532] +/Subtype /Link +/A << /S /GoTo /D (patchviewer) >> +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 460.678 537.983 467.532] +/Subtype /Link +/A << /S /GoTo /D (patchviewer) >> +>> endobj +841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 445.669 307.765 454.58] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_view) >> +>> endobj +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 445.669 537.983 454.58] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_view) >> +>> endobj +843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 432.718 352.437 441.629] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_diff) >> +>> endobj +844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 432.718 537.983 441.629] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_diff) >> +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 419.766 305.324 428.678] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_context) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 419.766 537.983 428.678] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_context) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 406.815 359.988 415.726] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_collapse) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 406.815 537.983 415.726] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_collapse) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 393.863 299.107 402.775] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_link) >> +>> endobj +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 393.863 537.983 402.775] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_link) >> +>> endobj +851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 380.912 280.448 389.823] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_bonsai_lxr) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 380.912 537.983 389.823] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_bonsai_lxr) >> +>> endobj +853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 367.96 268.283 376.872] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_unified_diff) >> +>> endobj +854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [533.001 367.96 537.983 376.872] +/Subtype /Link +/A << /S /GoTo /D (patchviewer_unified_diff) >> +>> endobj +855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 355.009 171.397 363.92] +/Subtype /Link +/A << /S /GoTo /D (hintsandtips) >> +>> endobj +856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 355.009 537.983 363.92] +/Subtype /Link +/A << /S /GoTo /D (hintsandtips) >> +>> endobj +857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 344.115 212.542 350.969] +/Subtype /Link +/A << /S /GoTo /D (406) >> +>> endobj +858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 344.115 537.983 350.969] +/Subtype /Link +/A << /S /GoTo /D (406) >> +>> endobj +859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 329.48 194.251 338.017] +/Subtype /Link +/A << /S /GoTo /D (quicksearch) >> +>> endobj +860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 329.48 537.983 338.017] +/Subtype /Link +/A << /S /GoTo /D (quicksearch) >> +>> endobj +861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 318.212 187.636 325.066] +/Subtype /Link +/A << /S /GoTo /D (commenting) >> +>> endobj +862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 318.212 537.983 325.066] +/Subtype /Link +/A << /S /GoTo /D (commenting) >> +>> endobj +863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 305.261 194.819 312.115] +/Subtype /Link +/A << /S /GoTo /D (attachments) >> +>> endobj +864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 305.261 537.983 312.115] +/Subtype /Link +/A << /S /GoTo /D (attachments) >> +>> endobj +865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 290.252 191.242 299.163] +/Subtype /Link +/A << /S /GoTo /D (435) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 290.252 537.983 299.163] +/Subtype /Link +/A << /S /GoTo /D (435) >> +>> endobj +867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 279.358 180.841 286.212] +/Subtype /Link +/A << /S /GoTo /D (userpreferences) >> +>> endobj +868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 279.358 537.983 286.212] +/Subtype /Link +/A << /S /GoTo /D (userpreferences) >> +>> endobj +869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 264.349 212.811 273.26] +/Subtype /Link +/A << /S /GoTo /D (accountsettings) >> +>> endobj +870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 264.349 537.983 273.26] +/Subtype /Link +/A << /S /GoTo /D (accountsettings) >> +>> endobj +871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 251.397 202.858 260.309] +/Subtype /Link +/A << /S /GoTo /D (emailsettings) >> +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 251.397 537.983 260.309] +/Subtype /Link +/A << /S /GoTo /D (emailsettings) >> +>> endobj +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 238.446 192.03 247.357] +/Subtype /Link +/A << /S /GoTo /D (footersettings) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 238.446 537.983 247.357] +/Subtype /Link +/A << /S /GoTo /D (footersettings) >> +>> endobj +875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 227.552 192.617 234.406] +/Subtype /Link +/A << /S /GoTo /D (permissionsettings) >> +>> endobj +876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 227.552 537.983 234.406] +/Subtype /Link +/A << /S /GoTo /D (permissionsettings) >> +>> endobj +877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 212.19 130.41 219.173] +/Subtype /Link +/A << /S /GoTo /D (installation) >> +>> endobj +878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 212.19 537.983 219.173] +/Subtype /Link +/A << /S /GoTo /D (installation) >> +>> endobj +879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 194.81 190.833 203.721] +/Subtype /Link +/A << /S /GoTo /D (stepbystep) >> +>> endobj +880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 194.81 537.983 203.721] +/Subtype /Link +/A << /S /GoTo /D (stepbystep) >> +>> endobj +881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 181.858 177.116 190.77] +/Subtype /Link +/A << /S /GoTo /D (install-mysql) >> +>> endobj +882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 181.858 537.983 190.77] +/Subtype /Link +/A << /S /GoTo /D (install-mysql) >> +>> endobj +883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 170.964 160.508 177.818] +/Subtype /Link +/A << /S /GoTo /D (install-perl) >> +>> endobj +884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 170.964 537.983 177.818] +/Subtype /Link +/A << /S /GoTo /D (install-perl) >> +>> endobj +885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 158.013 197.867 164.867] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules) >> +>> endobj +886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 158.013 537.983 164.867] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules) >> +>> endobj +887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 143.004 243.924 151.915] +/Subtype /Link +/A << /S /GoTo /D (install-modules-bundle-bugzilla) >> +>> endobj +888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 143.004 537.983 151.915] +/Subtype /Link +/A << /S /GoTo /D (install-modules-bundle-bugzilla) >> +>> endobj +889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 130.053 246.685 138.964] +/Subtype /Link +/A << /S /GoTo /D (install-modules-appconfig) >> +>> endobj +890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 130.053 537.983 138.964] +/Subtype /Link +/A << /S /GoTo /D (install-modules-appconfig) >> +>> endobj +891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 117.475 219.556 126.013] +/Subtype /Link +/A << /S /GoTo /D (install-modules-cgi) >> +>> endobj +892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 117.475 537.983 126.013] +/Subtype /Link +/A << /S /GoTo /D (install-modules-cgi) >> +>> endobj +893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 104.15 256.198 113.061] +/Subtype /Link +/A << /S /GoTo /D (install-modules-data-dumper) >> +>> endobj +894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 104.15 537.983 113.061] +/Subtype /Link +/A << /S /GoTo /D (install-modules-data-dumper) >> +>> endobj +804 0 obj << +/D [802 0 R /XYZ 71.731 729.265 null] +>> endobj +6 0 obj << +/D [802 0 R /XYZ 244.332 703.236 null] +>> endobj +801 0 obj << +/Font << /F23 793 0 R /F32 807 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +943 0 obj << +/Length 49034 +/Filter /FlateDecode +>> +stream +xڔ�]�d�a]��_�G�A���.�����C +�#Nx"l�D�"D������쓹O�]�~0?�ֺ�I�:���=~us�ǯ�������w�r�}|��?���W<�;��7�q����p�p{�����{�rx�=��ۛ���������p�x���>�<���_�������髗����W�ׯr(g������p<�����������������>���?����?~���O�������������?<~�?����?�a>�����x����3�zs�;��2_������C���Û�x>�F��o��,[�����{�$���+��XN��x����kw����h���+��o}9}7/�:βu�XO�t���b���������c�v����(���+��k���9<?�*ku�X�w�ֺ��bm����)<�I�v����;���t���k߷OÝ���l]�;���p� ���+��XO��QZ��W� ܱ���k��^�6�}���O/�\βu�X���Һ��bm������d���+��X�OD|����k߷ޝ>���(;��<}���+���(O��Q:��W� ܱ�>�;��f��bm�����Gp+��,[����)�ϸq����;���p#ڌ�W� ܱ���X�v�����[n���7�,[����p��g�X�c}8<>Z�v����;���� ƍ�W� |��x���O�q��p�z��u;{�����c��?���+��XO���v�p�+�N���y�ee�v����:��W� ܱ>^�o�8{��������Z��W� |��|sxx�?��Y�.�����Q��g�X�c=}ֺ��bm����1�˟q��k߷��>�;igٺ�w����V��g�X�c=}G�3n��bm����1�X�v�����Z�on�/�g\u�Xo/�����kw���'k��^�6p��t�S`��,�����3�?Zs��p�z��u;{�����3������kw��O��NZ��W� |�z{�n�u�e�ܱ�>�㽴ng�X�c=}7Һ��bm������b���+��o��9�=�s9���c�=<?ɿ2��W� ܱ>��u;{�����cx�?���+��o�?}���8���c=}wֺ��bm����1ȿ4mG�8��<}���8{E����������l]�;��gp#̍�W� ܱ>n_�:�^�6p��txz����k߷>�n�䏹q��p�z{xz�?p��+��XOÃ�ng�X�c=}rv��W� |��t���$gٺ�w�����Z��W� ܱ�>9;��+��XO�����k߷>��/�:βu�Xo�V���g�v������iw�O��'k��^�6�}���3�㓜e�ܱ�>9>��+��XOý�ng�X�c=}r|��W� |��ps������h]�;���p����kw���A�Or����;֧Ã��L9{�����Ǜ�ͳ���l]�;��Ã���kw���Gk��^�6p�z�^�u;{��������A�g;����(O���T~9zEY����;J�v����;�������[����n�܍3��q||�wO����f����[��<�<���{��i}Μ���cZ��������oܾ��?������Յj}�㗿B�L�o����T�Qs��Q�.�oOO�x|�Aޱng�X�c}<n�u;{��������� +g��^�6�}���c���q��p�z�n�u;{�����c8���Y��W� ܱ�>�k��^�6�}���p����,[�����p�s��ng�X�c}<�<Y�v����;������κ��bm��և��p�s����l]�;���po���+��XO����v�p;��gp'���W� |��x�n�u�e�ܱ�>���17�^�6p�z�n�u;{������{���8{�����O7�?�����l]�;����u;{�������17�^�6pǺ���:�N�6�NeMى��e������ IJ�YG���b�鬣�dk��T֔�h]�Pv:痲���0*;�p+;�X8,;�s��,m ���:�N��@,;�u��lm ���:�N�6�Nge'[�e����D�IJ�YG���b�鬣�dk��t�Qv���Xv*k�N�.@,;�u��lm ���:�N�6�Nge'[He���������)�����ò�9G���b�鬣�dk��T֔�h]�Xv:�(;��@,;�u��lm ���:�N�6�NeMى��e������ IJ�YG���b�鬣�dk��T֔�h]�Xv:�(;��@,;�u��lm ��N����,��J9�NT6�N�e'K�e������ IJ�YG���b٩�);Ѻ���t�Qv���Xv:�(;��@,;�u��lm ��ʚ���Nge'[�e������ IJ�YG���b�i���$� +IJ�YG���b�鬣�dk��tҭ�dg��TΔ�(]�Xv:�(;��@,;�u��lm ���:�N�6�NeMى��e������ IJ�YG���b�鬣�dk��T֔�h]�Xv:�(;��@,;�u��lm ���:�N�6�NeMى��e������ ���I�����ò�9G���b٩�);Ѻ���t�Qv���Xv:�(;��@,;�u��lm ��ʚ���Nge'[�e������ IJ�YG���b٩�);Ѻ���t�Qv���Xv:�(;��@,;�u��lm ��ʚ����N'��Nv�N�e'K�e������ IJSYSv�ub�鬣�dk��t�Qv���Xv:�(;��@,;�u��d]�Xv:�(;��@,;�u��lm ���:�N�6�NeMى��e������ IJ�YG���b�鬣�dk��T�Qv��qTv:�Vv��pXv:�(;Y�@,;�N4e'?Ǘ3��q|�+;�9����K�O���?r�9Μ�ΧQv��_�����~������xk�7ǯ?�彵���o5��o���w_��?<��_<�������� ����?Y ��5~�6��ʚ?Z�~è� ����?Y ��s���~%~4��ʙ?J�~a=���y���𣵁<�W����@�+k�hm ��u�ɺ�y���𣵁<�W����@�+k�hm ��u�ɺ�y���𣵁<�W����@�+k�hm ��4~r6�J9��,��3~�6��ʚ?Z�~c�~�.@�+k�hm ��5~�6��ʚ?Z�~c�~�.@�+k�hm ��5~�6��ʚ?Z�~c�~�.@�+k�hm ��5~�6�J:��,��2~R6��ʙ?J�~è� ���f�����X瀟���ʚ?Z�~è� ���f�����X瀟���ʚ?Z�~è� ���f����_X�~��@�+k�hm ��5~�6�J:��,��s�I��y���𣵁<�W����@�+k�hm ��u�ɺ�y���𣵁<�W����@�+k�hm ��u�ɺ�y���𣵁<�W����@�+k�hm ��u�ɺ�y���𣵁8�W�1�Gg�x���𣴁<�7�9�'����f����_Y3�Gky���𣵁<�7�9�'����f����_Y3�Gky���𣵁<�7�9�'����f����_Y3�Gky���𣵁<�7�9�'�����?:�~�̀� ���f�����X瀟���ʚ?Z�~è� ���f����_X�~��@�+k�hm ��5~�6��ʚ?Z�~c�~�.@�+k�hm ��5~�6��ʚ?Z�~#̀�����R�?*�~�̀� �?��ŀ�c�_<����7�����p����q�<�����Ǐ�~�/�|���������w����w$^��x6�������w���w�\<���W�>�{� �w�(k���W�u�{���߽��y� +Z��^Q���t�߽��y� +J��^1����.@~�����+hm �{EY���6�߽��y� +Z��^1����.@~�����+hm �{EY�n����n)k�-�6��-c��Y �[ʚt� �tKY�n����n)k�-�6��-c��Y �[ʹ�[h��a���#�Bc�8�RΤ[(m �[�zN���9�R֤[hm �[ʚt� �tKY�n����n�L�Ⱥ�9�R֤[hm �[ʚt� �tKY�n����n�L�Ⱥ�9�R֤[hm �[ʚt� �tKY�n����ni�-r6�-��*��r&�Bi9�R֤[hm �[�:�-�.@N��5�Z�閲&�Bk9�R֤[hm �[�:�-�.@N��5�Z�閲&�Bk9�R֤[hm �[�:�-�.@N��5�Z�閲&�Bk1�Rґn��p�ne�-R6��-�L���r���I���@N��5�Z�閱�t����-eM���r���I���@N��5�Z�閱�t����-eM���r���I���@N��5�Z�閰��-��@N��5�Z�閲&�Bk1�Rґn��p�n�L�H��9�R֤[hm �[ʚt� �tKY�n����n�L�Ⱥ�9�R֤[hm �[ʚt� �tKY�n����n�L�Ⱥ�9�R֤[hm �[ʚt� �tKY�n����n�L�Ⱥ�9�R֤[hm �[J:�-t��-�L���r�e�3�"��tKY�n����n)k�-�6��-eM���r�e�3�"��tKY�n����n)k�-�6��-eM���r�e�3�"��tKY�n����n)k�-�6��-eM���r�e�3�"��tKIG����q���I�P�@N��5�Z�閱�t����-eM���r���I���@N��5�Z�閰��-��@N��5�Z�閲&�Bk9�R֤[hm �[�:�-�.@N��5�Z�閲&�Bk9�R֤[hm �[F�t����tK)G����q���I�P�@N��;�>ǖn]<�[���߽��xx�{�tk�9�[/�n�ᛧ��?���s���o�_�u��zz���g�;����|\�_p�}(���@.��5Z������.eM���b�����Bg��R�\(m \�:.�.@.��5Z�����Bk��R�\hm \�:.�.@.��5Z�����Bk��R�\hm \�:.�.@.��5Z�����Bk��R�\hm \�:.�.@*��s+��x ÂK G����q���)�P�@.���\p�ur���)���@.��5Z�����Bk��2�Yp�ur���)���@.��5Z�����Bk��2�Yp�ur���)���@.��5Z�����Bk��2�\�l\J9 +.T�.�L���r���)���@.��u\d]�\p)k +.�6�.eM���r���)���@.��u\d]�\p)k +.�6�.eM���r���)���@.��u\d]�\p)k +.�6�.eM���b�����Bg��2�\�l\ʙ�� �KYSp���\p)k +.�6�.c�Y \ʚ�� �KYSp���\p)k +.�6�.c�Y \ʚ�� �KYSp���\p)k +.�6�.a=\`]�\p)k +.�6�.eM���b�����Bg��2�Yp�tr���)���@.��5Z�����Bk��2�Yp�ur���)���@.��5Z�����Bk��2�Yp�ur���)���@.��5Z�����Bk��2�Yp�ur���)���@,��t\�,\ʙ�� ��Xg�E������Bk��R�\hm \ʚ�� ��Xg�E������Bk��R�\hm \ʚ�� ��Xg�E������Bk��R�\hm \ʚ�� ��Xg�E���������K9Sp���\p)k +.�6�.c�Y \ʚ�� �KYSp���\p)k +.�6�.a=\`]�\p)k +.�6�.eM���r���)���@.��u\d]�\p)k +.�6�.eM���r���)���@,��49��R�����K9Sp���\pQw$ +.|���x(����7\#vk�9\���o�V�?|�����������\tݞ������w��ӟV��x������ݢk���2g����Y���Y?Zȳ~c��~�.@��+kf�hm ���5�~�6�g�ʚY?Zȳ~c��~�.@��+�6�G�%g�J8f�h,���3�~�6�g��z���u�_Y3�Gky֯������<�W�����@�����u�_Y3�Gky֯������<�W�����@�����u�_Y3�Gky֯������<�W�����@��if��l���r��QY8��+gf�(m ���5�~�6�g��:g�d]�<�W�����@��+kf�hm ���5�~�6�g��:g�d]�<�W�����@��+kf�hm ���5�~�6�g��:g�d]�<�W�����@��+kf�hm ���t���Y8��ef��l���3�~�6�g�ʚY?Zȳ~eͬ� �Y���Y?Y ���5�~�6�g�ʚY?Zȳ~eͬ� �Y���Y?Y ���5�~�6�g�ʚY?Zȳ~eͬ� �Y���g�`]�<�W�����@��+kf�hm ���t���Y8�����t�_Y3�Gky֯������<�W�����@�����u�_Y3�Gky֯������<�W�����@�����u�_Y3�Gky֯������<�W�����@�����u�_Y3�Gkq֯�c֏���_93�Giy�o�s�O�ȳ~eͬ� �Y��f֏��_Y3�Gky�o�s�O�ȳ~eͬ� �Y��f֏��_Y3�Gky�o�s�O�ȳ~eͬ� �Y��f֏��_Y3�Gky�o�s�O���~%�~t�g�ʙY?Jȳ~eͬ� �Y���Y?Y ���5�~�6�g�ʚY?Zȳ~eͬ� �Y���g�`]�<�W�����@��+kf�hm ���5�~�6�g��:g�d]�<�W�����@��+kf�hm ���5�~�6g�F�Y?9��~��~T�g�ʙY?Jȳ~��Y?>�6�x�����9�Y��Y����'���Ǚ�Y��f��oa����~�_?}�x;�����ps�;���:ܽ�)��_���/*{k����������w�ov�d]���W�����@��+kv�hm ��5�z�6�w��:w�d]���W�mW��K��p���X8��+gv�(m ������ +�]��fW���^Y��GkyW���գ����7ֹ�'��]��fW���^Y��GkyW���գ����7ֹ�'��]��fW���^Y��GkyW���գ����7�����8��+��գ�p��W���Q�@��+kv�hm ��u��ɺ�yW���գ����W�����@��+kv�hm ��u��ɺ�yW���գ����W�����@��+kv�hm ��u��ɺ�yW���գ����W�����@��+��գ�p��7���I�8��+gv�(m ��5�z�6�w�ʚ]=ZȻzc��z�.@��+kv�hm ��5�z�6�w�ʚ]=ZȻzc��z�.@��+kv�hm ��5�z�6�w�ʚ]=ZȻza=����yW���գ����W�����@��+��գ�p��7ι�'��]��fW���^Y��GkyW���գ����7ֹ�'��]��fW���^Y��GkyW���գ����7ֹ�'��]��fW���^Y��GkyW���գ����7ֹ�'��]��fW���^IǮ���]�rfW����X箞��w�ʚ]=ZȻzeͮ� �]��fW����X箞��w�ʚ]=ZȻzeͮ� �]��fW����X箞��w�ʚ]=ZȻzeͮ� �]��fW����X箞�w�J:v��,��3�z�6�w�ʚ]=ZȻzc��z�.@��+kv�hm ��5�z�6�w�ʚ]=ZȻza=����yW���գ����W�����@��+kv�hm ��u��ɺ�yW���գ����W�����@��+kv�hm ��4�zr6w�J9v��,��3�z�6�w��3p�����v��������������|ϻ�q�bW;v������x���2����������?}����>ޝ��|��B�>�����7�|<��\y��|������gv�ރ�c��^�6p�Z���Gx��,[����Y>Y�v����;��e͋��@~�&�@k9�0�h�ur��� 4��@4�5�Zȁ��&�@k9�0�h�uR���[���KJ8 4� �L���r�!��@�+� eM���r��� 4��@4�5�Zȁ���@��� eM���r��� 4��@4�5�Zȁ���@��� eM���r��� 4��@4�5�Z����&� g�0�P�h��ph(g �6� eM���r�a�3� ��@CYh���h(k �6� eM���r�a�3� ��@CYh���h(k �6� eM���r�a�3� ��@CYh���h(k �6 %�:���Q&� e�8�P�(m ʚ@� �@CYh���h�4Ⱥ�9�P�hm ʚ@� �@CYh���h�4Ⱥ�9�P�hm ʚ@� �@CYh���h�9��� +�@CYh���h(k �6 %�:ǁ�q�@��� eM���r��� 4��@4�5�Zȁ���@��� eM���r��� 4��@4�5�Zȁ���@��� eM���r��� 4��@4�5�Zȁ���@��� eM���b���#�@g�8�P�(m �: �.@4�5�Zȁ��&�@k9�P�hm �: �.@4�5�Zȁ��&�@k9�P�hm �: �.@4�5�Zȁ��&�@k9�P�hm �: �.@4�t�,ʙ@� �@CYh���h�4Ⱥ�9�P�hm ʚ@� �@CYh���h�9��� +�@CYh���h(k �6� eM���r�a�3� ��@CYh���h(k �6� eM���b�a� 4��84�r�,ʙ@� �@c?*P�>�h\<���_|psx���@c��4�F��������o��݇�|<�7����.R�o�_����������s�����߫5�Z�u� �ůcB��A`B���VY3�EkyB���Т��<�5�9�%�� ��fB���VY3�EkyB���Т��<�5�9�%�� ��fB���VY3�EkyB���Т��8�5�Lh��8��*�Т�p<�U�LhQ�@��*k&�hm Oh�uNhɺ�yB���Т��<�U�Lh��@��*k&�hm Oh�uNhɺ�yB���Т��<�U�Lh��@��*k&�hm Oh�uNhɺ�yB���Т��<�U�Lh��@��*�Т�p8�5�LhI�8��*g&�(m Oh�5Z�6�'�ʚ -Z�Zc�Z�.@��*k&�hm Oh�5Z�6�'�ʚ -Z�Zc�Z�.@��*k&�hm Oh�5Z�6�'�ʚ -Z�Za=Oh��yB���Т��<�U�Lh��@��*�Т�p<�5�9�%�� ��fB���VY3�EkyB���Т��<�5�9�%�� ��fB���VY3�EkyB���Т��<�5�9�%�� ��fB���VY3�EkyB���Т��<�5�9�%�� ��fB���VIDŽ��� �rfB����X焖��'�ʚ -Z�Zë́� � ��fB����X焖��'�ʚ -Z�Zë́� � ��fB����X焖��'�ʚ -Z�Zë́� � ��fB����X焖�'�J:&��,Oh�3Z�6�'�ʚ -Z�Zc�Z�.@��*k&�hm Oh�5Z�6�'�ʚ -Z�Za=Oh��yB���Т��<�U�Lh��@��*k&�hm Oh�uNhɺ�yB���Т��<�U�Lh��@��*k&�hm Nh�4Zr6'�J9&��,Oh�3Z�6�'���Z|�mB{�0����v������5�ڜ���ޏ ���O���������������yF����C����7ǯiH{s6�?�}����_L]�bvw��<����� ����-[�;Zg;Z�6w�ʚ-Z �h�u�h��@��:��Ѳ����uֱ�ekqG���Ѣu��Yǎ�� ����-[�;Zg;Z�6�v�J:v��l�h�r�Ѳ�p��uα�eiqG�cG���VY��E�����-[�;Zg;Z�6w��:v�lm �h�5;Z�.@��:��Ѳ����uֱ�ekqG�cG���VY��E�����-[�;Zg;Z�6�v�N��h�Y8��*��Ѣ�q��uα�eiqG�cG����Yǎ�� ���fG���;Zg;Z�6w��:v�lm �h�u�h��@��*kv�h]���uֱ�ekqG�cG����Yǎ�� ����-YW �h�u�h��@��:��Ѳ����u�mG����V9��E�����-[�;Zg;Z�6w��:v�lm �h�5;Z�.@��:��Ѳ����uֱ�ekqG�cG���VY��E�����-[�;Zg;Z�6w��:v�lm �h�5;Z�.@��:��Ѳ����u�mG�����9ǎ�� ���fG���;Zg;Z�6w��:v�lm �h�u�h��@��*kv�h]���uֱ�ekqG�cG����Yǎ�� ���fG���;Zg;Z�6w��:v�lm �h�u�h��@��*kv�h]���u�mG�����9ǎ�� ����-[�;Ze͎�w��:v�lm �h�u�h��@��:��Ѳ����5ֹ�%� +����-[�;Zg;Z�6w��:v�lm �h�5;Z�.@��:��Ѳ����uֱ�ekqG�cG��ҎVIǎ����Sn;ZVw��9v�,m �hq�y}G������c_�v����*���N_�_xG;�\�hƎ�~�������/���^��}oA������M��-=�����#�Ox�8��Oo��ᗣW���Q>�^�$����+��fnjXXϻd��@�%+kv�hm 5�d�6�w�ʚ]2ZȻdc��d�.@�%+kv�hm 5�d�6�w�ʚ]2ZȻdc��d�.@�%+kv�hm 5�d�6�w�ʚ]2Z��d#�.����]�R�]2*ǻd��.� �]��f����.�X�.���w�ʚ]2ZȻde�.� �]��f����.�X�.���w�ʚ]2ZȻde�.� �]��f����.�X�.���w�ʚ]2ZȻde�.� �]���]2:��d��.����]�rf����.YY�KFky����%����K6ֹK&��]��f����.YY�KFky����%����K6ֹK&��]��f����.YY�KFky����%����K��.�+�w�ʚ]2ZȻde�.� �]���]2:ǻd㜻d�.@�%+kv�hm 5�d�6�w�ʚ]2ZȻdc��d�.@�%+kv�hm 5�d�6�w�ʚ]2ZȻdc��d�.@�%+kv�hm 5�d�6�w�ʚ]2ZȻdc��d�.@�%+kv�hm t��Y8�%+gv�(m u�ɺ�y����%����KV����@�%+kv�hm u�ɺ�y����%����KV����@�%+kv�hm u�ɺ�y����%����KV����@�%+kv�hm u�ɺ�q���c�����.Y9�KFiy����%����K6ֹK&��]��f����.YY�KFky����%����K��.�+�w�ʚ]2ZȻde�.� �]��f����.�X�.���w�ʚ]2ZȻde�.� �]��f����.�H�K&g�p���c�����.Y9�KFiy����d|�m�|��K���x���K���E�Kg.vɏ��?|�t����1�}��ۿ��?���R��V��_�{�;<=�u�<����o�߹D�_�\"^�����o��hm /�u.ɺ�y���Y"����DT�,��@^"*k��hm .�4KDr6��J9���,/�3KD�6���ʚ%"Z�KDc�KD�.@^"*k��hm /�5KD�6���ʚ%"Z�KDc�KD�.@^"*k��hm /�5KD�6���ʚ%"Z�KDc�KD�.@^"*k��hm /�5KD�6��J:���,.�2KDR6���ʙ%"J�KDe�� �%��f�����X������ʚ%"Z�KDe�� �%��f�����X������ʚ%"Z�KDe�� �%��f����QX�KD��@^"*k��hm /�5KD�6��J:���,/�s.I��y���Y"����DT�,��@^"*k��hm /�u.ɺ�y���Y"����DT�,��@^"*k��hm /�u.ɺ�y���Y"����DT�,��@^"*k��hm /�u.ɺ�y���Y"����DTұDDg�x���Y"����D4ֹD$��%��f����QY�DDky���Y"����D4ֹD$��%��f����QY�DDky���Y"����D4ֹD$��%��f����QY�DDky���Y"����D4ֹD$��%���%":�KD��� �%��f�����X������ʚ%"Z�KDe�� �%��f����QX�KD��@^"*k��hm /�5KD�6���ʚ%"Z�KDc�KD�.@^"*k��hm /�5KD�6���ʚ%"Z�KD#�����%�R�%"*�KD��� �%��JN-�9�%��c�q�9~��������Dg.��Oc��O���÷������ç�|���~s�zw�x�������8oO���q^s ��y��ůf��˷��\���|ͥ��k.ɺ���Ke�5�hm _s������<.UK��@����u�TY3.Eky\������<.UK��@�iƥ�l�K�r�KQY8�*gƥ(m �K�5�R�6�ǥ�:ǥd]�<.UK��@�*kƥhm �K�5�R�6�ǥ�:ǥd]�<.UK��@�*kƥhm �K�5�R�6�ǥ�:ǥd]�<.UK��@�*kƥhm �K�t�K�Y8�eƥ�l�K�3�R�6�ǥʚq)Z��Re� �q���q)Y �K�5�R�6�ǥʚq)Z��Re� �q���q)Y �K�5�R�6�ǥʚq)Z��Re� �q���ǥ`]�<.UK��@�*kƥhm �K�t�K�Y8����t�TY3.Eky\������<.UK��@����u�TY3.Eky\������<.UK��@����u�TY3.Eky\������<.UK��@����u�TY3.Ekq\��c\����T93.Eiy\j�s\J���Re� �q��f\���TY3.Eky\j�s\J���Re� �q��f\���TY3.Eky\j�s\J���Re� �q��f\���TY3.Eky\j�s\J���R%�Rt�ǥʙq)J��Re� �q���q)Y �K�5�R�6�ǥʚq)Z��Re� �q���ǥ`]�<.UK��@�*kƥhm �K�5�R�6�ǥ�:ǥd]�<.UK��@�*kƥhm �K�5�R�6ǥF�q)9��R��RT�ǥʙq)J��R?�q)>�6.�x��?�2.��2.�;=���KǙ�q���n������������m����p�\�������e���S/_]<�����w����R���i�ůeZ��A`Z����X純����ʚi)Z��Reʹ� �i��fZ����X純����ʚi)Z��Reʹ� �i��fZ����H3-%g�pZ��cZ����T93-EiyZ�������<-5�9-%��i��fZ���TY3-EkyZ�������<-5�9-%��i��fZ���TY3-EkyZ�������<-5�9-%��i��fZ���TY3-EkqZ��cZ�����(3-%e�xZ�������<-U�LK��@��*k��hm OK�uNKɺ�yZ�������<-U�LK��@��*k��hm OK�uNKɺ�yZ�������<-U�LK��@��*k��hm OK��<-� +�i��fZ���TY3-EkqZ��cZ�����8純����ʚi)Z��Reʹ� �i��fZ����X純����ʚi)Z��Reʹ� �i��fZ����X純����ʚi)Z��Reʹ� �i��fZ����X純����ʚi)Z��R%�Rt���ʙi)J��Rc��R�.@��*k��hm OK�5�R�6���ʚi)Z��Rc��R�.@��*k��hm OK�5�R�6���ʚi)Z��Rc��R�.@��*k��hm OK�5�R�6���ʚi)Z��Rc��R�.@��*阖��p<-U�LKQ�@��*k��hm OK�uNKɺ�yZ�������<-U�LK��@��*k��hm OK��<-� +�i��fZ���TY3-EkyZ�������<-5�9-%��i��fZ���TY3-EkyZ�������8-5�LK��8��*嘖��p<-U�LKQ�@���մ�c��^<LK���o�χ��+��_N��z}��/�����i�8�3��ޏ]����?���������:2��i}�����������Hz|y><}�"C�9]>�O���x��x�A�Xs�+p�zwx�{����kw������ʺ��bm����1�u;{������������Z�Y�.����;���ng�X�c}<} ����kw�χG����g��W�ǧ�s��,]�;��g�h���+��XO���_eٺ��bm����)�~�P���k߷ޝ>�;igٺ�w�����o:�v����;���p�?p��+��XOÍ�ng�X�����C�E��gٺ�w�w��g�g��bm����p�d���+��X������k߷>�>��g�e�ܱ�>�{k��^�6p�z��_$��W���Q�>�;�g��"m�����gp+��,[����叹q����;�ӧpc���+��XO��^䏹q�����[�nN� ���Y�.������Z��W� ܱ>���s��kw����A��g�X�����1�K�8���c=}w���8{�����c��?���+��XO��Z��W� |��r�n䏹q��p�z������%l��p�_Y��W���Q>���q����;]��������Y��������Z��W� ܱ�P[YS~���\~+k�o�6��oc��7Y ��ʚ�� ��[YS~���\~+k�o�6��oc��7Y ��ʚ�� ��[YS~���\~+k�o�6�o#M�M��a�����Fe��VΔ�(m ��ʚ�� ���Xg�M��已��Fk��V֔�hm ��ʚ�� ���Xg�M��已��Fk��V֔�hm ��ʚ�� ���Xg�M��已��Fk��V֔�hm ��J:�ot�o�L�M��q���)�Q�@.��5�7Z�已��Fk��6�Y~�ur���)���@.��5�7Z�已��Fk��6�Y~�ur���)���@.��5�7Z�已��Fk���s� ��已��Fk��V֔�hm ��J:�ot��o��7I ��ʚ�� ��[YS~���\~+k�o�6��oc��7Y ��ʚ�� ��[YS~���\~+k�o�6��oc��7Y ��ʚ�� ��[YS~���\~+k�o�6��oc��7Y ��ʚ�� ��[IG����q���)�Q�@.��u��d]�\~+k�o�6��oeM���r���)���@.��u��d]�\~+k�o�6��oeM���r���)���@.��u��d]�\~+k�o�6��oeM���r���)���@.��u��d]�X~+�(��Y8.��3�7J�已��Fk��6�Y~�ur���)���@.��5�7Z�已��Fk���s� ��已��Fk��V֔�hm ��ʚ�� ���Xg�M��已��Fk��V֔�hm ��ʚ�� ���HS~��qX~+�(�QY8.��3�7J���~���o|����x�ۛ��{�9����J�}�?�<�r�=Τ�~���~������?�������_��췿Y�7{�Y����_�rz�q����|j�?0�n�{����(;���;<�ҹ��"m����pwc���+��X�O/��w;{�����/�����u�e�ܱ����u;{���������V���kw��&e��hm _� �����je��hm _͠���� ��5W3���|5��ΫȺ��je��hm _͠���� ī�t\̀�����9�f ���5W3���|5���j�6��fP�\̀����:�f ���5W3���|5���j�6��fP�\̀����:�f ���5W3���|5���j�6��fP�\̀����:�f ���5W3���x5�����Y8��A9s5J�W3뼚����fP�\̀���ʚ���@��AYs5Z�W3뼚����fP�\̀���ʚ���@��AYs5Z�W3뼚����fP�\̀���ʚ���@��AYs5Z�W3뼚����fP��j4^��j%W3��p|5�r�j�6��f���`]�|5���j�6��fP�\̀���ʚ���@���X��d]�|5���j�6��fP�\̀���ʚ���@���X��d]�|5���j�6��fP�\̀���ʚ���@���Hs59�W3(帚����3W3���|5���j�6��f0�y5Y _͠���� ��5W3���|5���j�6��f0�y5Y _͠���� ��5W3���|5���j�6��f0�y5Y _͠���� ��5W3���x5�����Y8���(s5)�W3(g�f@i�je��hm _͠���� ��u^�@��W3(k�f@k�je��hm _͠���� ��u^�@��W3(k�f@k�je��hm _͠���� ���|5XW _͠���� ��5W3���x5�����Y8���8��$]�|5���j�6��fP�\̀���ʚ���@���X��d]�|5���j�6��fP�\̀���ʚ���@���X��d]�|5���j�6��fP�\̀���ʚ���@���X��d]�|5���j�6�fP�q5:�W3(g�f@i�jc�W3�u��ʚ���@��AYs5Z�W3(k�f@k�jc�W3�u��ʚ���@��AYs5Z�W3(k�f@k�jc�W3�u��ʚ���@��AYs5Z�W3(k�f@k�jc�W3�u��J:�f@g��j���(m _͠���� ��u^�@��W3(k�f@k�je��hm _͠���� ���|5XW _͠���� ��5W3���|5���j�6��f0�y5Y _͠���� ��5W3���|5���j�6�f0�\�@����J9�f@e��j���(m _�@� ���9��.�f���j�㕫n���&�j�q&W3<�������?�����?�l���?}���?��_��?������������/�.���������~����]=���1�����q���q=Y ��5�z�6���ʚq=Z��ze� �q���q=Y ��sף���z%�z4���ʙq=J��za=����y\��ף��<�W���@�+k��hm ��u��ɺ�y\��ף��<�W���@�+k��hm ��u��ɺ�y\��ף��<�W���@�+k��hm ��4�zr6��J9���,��3�z�6���ʚq=Z��zc��z�.@�+k��hm ��5�z�6���ʚq=Z��zc��z�.@�+k��hm ��5�z�6���ʚq=Z��zc��z�.@�+k��hm ��5�z�6��J:���,��2�zR6���ʙq=J��ze� �q��f\����X縞����ʚq=Z��ze� �q��f\����X縞����ʚq=Z��ze� �q��f\���^X��z��@�+k��hm ��5�z�6��J:���,��s��I��y\��ף��<�W���@�+k��hm ��u��ɺ�y\��ף��<�W���@�+k��hm ��u��ɺ�y\��ף��<�W���@�+k��hm ��u��ɺ�y\��ף��8�W�1�Gg�x\��ף��<�7�9�'��q��f\���^Y3�Gky\��ף��<�7�9�'��q��f\���^Y3�Gky\��ף��<�7�9�'��q��f\���^Y3�Gky\��ף��<�7�9�'��q���q=:��z�̸� �q��f\����X縞����ʚq=Z��ze� �q��f\���^X��z��@�+k��hm ��5�z�6���ʚq=Z��zc��z�.@�+k��hm ��5�z�6���ʚq=Z��z#����q�R�q=*��z�̸� �q��\���9�q��c��~�9~�{O?k_p\�3�?}���w�������������/w7_}�����Ͽ|���/�_~|��������W���N���E}^EO�C�O����w�c�uQ�,�.J9�(�.@|]����E�����(g��bk�uQ�:^���뢔5��B���E9�x][���r��(�6_��uQlm �.JY�(�.@|]����E�����(g��bk�uQ�:^���뢔5��B���E9�x][H��r��uQ�,�.�9��X�@|]���uQh]���(g��bk�uQ�:^���뢜u�.�� ��E)k^�����r��(�6_��uQlm �.�YG���bѪ�)ZѺ��hu�Q����X�:�(Z��@,Z�u�lm �ʚ���V��R���FE�nE+�E�s���� Ģ�Xg�J��E������ Ģ�YG���b�ꬣhek�hU��h]�X�:�(Z��@,Z�u�lm ��:�V�6�VeMъ��E������ Ģ�YG���b�ꬣhek�hU�Q���qT�:�V���pX�:�(ZY�@,Z�u�lm �ʚ���VgE+[�E������ Ģ�YG���bѪ�)ZѺ��hu�Q����X�:�(Z��@,Z�u�lm �ʚ���VgE+[�E������ ���I�������U)Gъ��a�ꜣhei�hu�Q����X�:�(Z��@,Z�5E+Z ��:�V�6�VgE+[�E������ ĢUYS��ub�ꬣhek�hu�Q����X�:�(Z��@,Z�u�d]�X�:�(Z��@,Z�u�lm �N���,�ʙ���VgE+[�E������ Ģ�YG���bѪ�)ZѺ��hu�Q����X�:�(Z��@,Z�u�lm �ʚ���VgE+[�E������ Ģ�YG���bѪ�)ZѺ��hu�Q����T�:�V���pX�:�(ZY�@,Z�5E+Z ��:�V�6�VgE+[�E������ ĢUYS��ub�ꬣhek�hu�Q����X�:�(Z��@,Z�5E+Z ��:�V�6�VgE+[�E������ ĢUYS��uR��[����a�ꜣhei�hu�Q����X�*k�V�.@,Z�u�lm ��:�V�6�VgE+[�E����+�VgE+[�E������ Ģ�YG���bѪ�)ZѺ��hu�Q����X�:�(Z��@,Z�u�lm �J:�Vt6��V�܊VV�V�E+K�E+d��h���r��1n�{E+<�o{]T���E�8���y�.���������㯟�K�~����?�����������_u������ +wV���_�}����@���5 Z����Dk�4�Y�ur������@���5 Z����Dk�4�Y�ur������@���tT��,W�ʙ +� � +�XgH�����Dk�T�T�hm W�ʚ +� � +�XgH�����Dk�T�T�hm W�ʚ +� � +�XgH�����Dk�T�T�hm W�ʚ +� � +�XgH�H�rn /aX*���X8���3 J����+@��@���5 Z����Dk�T�T�hm W��:+@�.@���5 Z����Dk�T�T�hm W��:+@�.@���5 Z����Dk�T�T�hm V�F� +���� +P)G���q����Q�@���5 Z���� +���+@eM��r������@���5 Z���� +���+@eM��r������@���5 Z���� +���+@eM��r������@���tT��,V�F� +���� +P9S���\*k*@�6�+@eM��rh��$�� +PYS���\*k*@�6�+@eM��rh��$�� +PYS���\*k*@�6�+@eM��r(�� +�+�+@eM��r������@���tT��,W��9+@�.@���5 Z����Dk�T�T�hm W��:+@�.@���5 Z����Dk�T�T�hm W��:+@�.@���5 Z����Dk�T�T�hm W��:+@�.@���5 Z���� +��� +P9S���\��ɺ��T�T�hm W�ʚ +� � +PYS���\��ɺ��T�T�hm W�ʚ +� � +PYS���\��ɺ��T�T�hm W�ʚ +� � +PYS���\��ɺ��T�Q��p\*g*@�6�+@eM��rh��$�� +PYS���\*k*@�6�+@eM��r(�� +�+�+@eM��r������@���5 Z���� +���+@eM��r������@���5 Z����$g�T�Q��p\*g*@�6�+���MU��[x������s|��w��*��O����������grdk�oG������?}�q�g���?\���~s��Ӈ��m�rsx~�����7��x��gf���]� +�3���Z����������H9������̌Ⱥ�93R�dFhm gFʚ�� ��HY������̌Ⱥ�93R�dFhm gFʚ�� ��HY������̌Ⱥ�93R�dFhm gFʚ�� ��HY������̌Ⱥ�)3R�-3B�%3#%�Ǚ�r&3Bi93�sf�ș��&3Bk93R�dFhm gFʚ�� ���XgfD�ș��&3Bk93R�dFhm gFʚ�� ���XgfD�ș��&3Bk93R�dFhm gFʚ�� ���H���q�)�ȌPY8Ό�3�Jș��&3Bk932֙�urf��Ɍ��@Ό�5�Zș��&3Bk932֙�urf��Ɍ��@Ό�5�Zș��&3Bk932֙�urf��Ɍ��@Ό�5�Z�����������(���q�)g2#�6�3#eMf��rf��Ɍ��@Ό�ufFd]��)k2#�6�3#eMf��rf��Ɍ��@Ό�ufFd]��)k2#�6�3#eMf��rf��Ɍ��@Ό����urf��Ɍ��@Ό�5�Z�����������8gfD�ș��&3Bk93R�dFhm gFʚ�� ���XgfD�ș��&3Bk93R�dFhm gFʚ�� ���XgfD�ș��&3Bk93R�dFhm gFʚ�� ���XgfD�ș��&3Bk13Rґ��p�)g2#�6�3#c��Y gFʚ�� ��HY�����)k2#�6�3#c��Y gFʚ�� ��HY�����)k2#�6�3#c��Y gFʚ�� ��HY�����)k2#�6�3#c��Y fFJ:2#t�3#�Lf��rf��Ɍ��@Ό�ufFd]��)k2#�6�3#eMf��rf��Ɍ��@Ό����urf��Ɍ��@Ό�5�Zș��&3Bk932֙�urf��Ɍ��@Ό�5�Zș��&3Bk132�dF�lfFJ92#T�3#�Lf��rfDU�Ȍ�9����1 3���ec�W^6v�r�"��/gGj����|����?}����뿎��O>}���w��no�:��Gz-����ۻ�㗿� O�C�O�v|�x8^��p<�^�6p��|x|�!����+��kl�|�X���Ⱥ��mnʚ������67e�����@~����mnhm ���X���Ⱥ��mnʚ������67e�����@~����mnhm ���XgfI�ș��&�Dk1�TґY��p�Y*g2K�6�3Kc��%Y g�ʚ�� ��RY�Y����Y*k2K�6�3Kc��%Y g�ʚ�� ��RY�Y����Y*k2K�6�3Kc��%Y g�ʚ�� ��RY�Y����Y*k2K�6�3Kc��%Y e�ʹe�h��af��#�Dc�8�T�d�(m g��z�,��9�T�d�hm g�ʚ�� ��RY�Y����Y��,ɺ�9�T�d�hm g�ʚ�� ��RY�Y����Y��,ɺ�9�T�d�hm g�ʚ�� ��RY�Y����Yi2Kr63K��%*Ǚ�r&�Di9�T�d�hm g��:3K�.@�,�5�%Zș��&�Dk9�T�d�hm g��:3K�.@�,�5�%Zș��&�Dk9�T�d�hm g��:3K�.@�,�5�%Zș��&�Dk1�TґY��p�Ye2KR6�3K�Lf��rf���,��@�,�5�%Zș���̒��3KeMf��rf���,��@�,�5�%Zș���̒��3KeMf��rf���,��@�,�5�%Zș���3K��@�,�5�%Zș��&�Dk1�TґY��p�Y��,I��9�T�d�hm g�ʚ�� ��RY�Y����Y��,ɺ�9�T�d�hm g�ʚ�� ��RY�Y����Y��,ɺ�9�T�d�hm g�ʚ�� ��RY�Y����Y��,ɺ�9�T�d�hm f�J:2Kt�3K�Lf��rfi�3�$���RY�Y����Y*k2K�6�3KeMf��rfi�3�$���RY�Y����Y*k2K�6�3KeMf��rfi�3�$���RY�Y����Y*k2K�6�3KeMf��rfi�3�$���RIGf���qf���,Q�@�,�5�%Zș���̒��3KeMf��rf���,��@�,�5�%Zș���3K��@�,�5�%Zș��&�Dk9�T�d�hm g��:3K�.@�,�5�%Zș��&�Dk9�T�d�hm f�F�̒����R)Gf���qf���,Q�@�,�;A�Y�sl���c@f��Kfy��Y�=��9�g�Y�n�����?��O~�ӛ��x��z�:�>+���;�gǗ��ӗ���q�|���y<ܾ��o��v����;������+e��^�6������p{�9���c=}w�Һ��bm����1�~�R���kw����h���+��o=�>��gggٺ�w�w��:/Һ��bm�����]�Z��W� ܱ>�o�W���ɯ�����+�gY��w��GW��hm �ʚ�� ��]Y�������ɺ�9pW��hm �ʚ�� ��]Y�������ɺ�9pW��hm �ʚ�� ��]Y�������ɺ�9pW��hm �J:wt�w�L���r�n�3p'���]Y�����+kw�6�weM���r�n�3p'���]Y�����+kw�6�weM���r�n�3p'���]Y�����+kw�6�weM���r�n�3p'���]9����0ܕp�h,�ʙ�� ��]Xρ;XW �ʚ�� ��]Y�����+kw�6�wc��;Y �ʚ�� ��]Y�����+kw�6�wc��;Y �ʚ�� ��]Y�����+kw�6w#M�N��aஔ#pGe�8pW��(m �ʚ�� ���Xg�N�ȁ��&pGk9pW��hm �ʚ�� ���Xg�N�ȁ��&pGk9pW��hm �ʚ�� ���Xg�N�ȁ��&pGk9pW��hm �J:wtw�L�N��qஜ �Q�@ܕ5�;Zȁ��&pGk9p7���ur ���@ܕ5�;Zȁ��&pGk9p7���ur ���@ܕ5�;Zȁ��&pGk9p�s��ȁ��&pGk9pW��hm �J:wt�w㜁;I �ʚ�� ��]Y�����+kw�6�wc��;Y �ʚ�� ��]Y�����+kw�6�wc��;Y �ʚ�� ��]Y�����+kw�6�wc��;Y �ʚ�� ��]IG����qஜ �Q�@܍u�d]��+kw�6�weM���r ���@܍u�d]��+kw�6�weM���r ���@܍u�d]��+kw�6�weM���r ���@܍u�d]��+���Y8ܕ3�;Jȁ��&pGk9p7���ur ���@ܕ5�;Zȁ��&pGk9p�s��ȁ��&pGk9pW��hm �ʚ�� ���Xg�N�ȁ��&pGk9pW��hm �ʚ�� ���H���q�+��QY8ܕ3�;Jȁ�~��w|�-p�x����7�G���p���}�I�~7�?������~�釟F���?����x����ǯ.l��u?ǝ�3�x�����@܉�rܩ��;��@�;�5q'Z�q��θ����NeM܉�rܩ��;��@�;�5q'Z�q��θ����NeM܉�rܩ��;��@�;�5q'Z�q��θ����NeM܉�bܩ�#�Dg�8�T�ĝ(m ǝ�:�N�.@�;�5q'Z�q��&�Dk9�T�ĝhm ǝ�:�N�.@�;�5q'Z�q��&�Dk9�T�ĝhm ǝ�:�N�.@�;�5q'Z�q��&�Dk9�T�ĝhm ǝ�:�N�.@�;�s�;�x øS G܉��qܩ��;Q�@�;��w�urܩ��;��@�;�5q'Z�q��&�Dk9�4�w�urܩ��;��@�;�5q'Z�q��&�Dk9�4�w�urܩ��;��@�;�5q'Z�q��&�Dk1�4�ĝ�lƝJ9�NT��N�L܉�rܩ��;��@�;�uƝd]�w*k�N�6��NeM܉�rܩ��;��@�;�uƝd]�w*k�N�6��NeM܉�rܩ��;��@�;�uƝd]�w*k�N�6��NeM܉�bܩ�#�Dg�0�4�ĝ�lǝʙ�� �SYw���w*k�N�6��Nc�q'Y ǝʚ�� �SYw���w*k�N�6��Nc�q'Y ǝʚ�� �SYw���w*k�N�6��Na=ǝ`]�w*k�N�6��NeM܉�bܩ�#�Dg�8�4�w�trܩ��;��@�;�5q'Z�q��&�Dk9�4�w�urܩ��;��@�;�5q'Z�q��&�Dk9�4�w�urܩ��;��@�;�5q'Z�q��&�Dk9�4�w�urܩ��;��@�;�tĝ�,ǝʙ�� ��Xg�I��q��&�Dk9�T�ĝhm ǝʚ�� ��Xg�I��q��&�Dk9�T�ĝhm ǝʚ�� ��Xg�I��q��&�Dk9�T�ĝhm ǝʚ�� ��Xg�I��q�������S9w���w*k�N�6��Nc�q'Y ǝʚ�� �SYw���w*k�N�6��Na=ǝ`]�w*k�N�6��NeM܉�rܩ��;��@�;�uƝd]�w*k�N�6��NeM܉�rܩ��;��@�;�4q'9�q�R�����S9w���w�*�����Ǹ�ۍ;���7��x�]b�;Ǚĝ�#����s��������������������w�λ�����g�ۺ���~��=<���.w��{� �㡵���)kz<�6�{<c�=Y �xʚ� �OY�㡵���)kz<�6�{<c�=Y �xʚ� �OIG����q�����P�@��u�xd]���)kz<�6�{<eM���r�������@��u�xd]���)kz<�6�{<eM���r�������@��u�xd]���)kz<�6�{<eM���r�������@��u�xd]���)�����=�����O9�㡴��� ��� +�OY�㡵���)kz<�6�{<eM���r�g���#��OY�㡵���)kz<�6�{<eM���r�g���#��OY�㡵���)kz<�6�{<eM���b�g�����8��r�x�,�xʙ� �OY�㡵������Ⱥ���S��xhm �xʚ� �OY�㡵������Ⱥ���S��xhm �xʚ� �OY�㡵������Ⱥ���S��xhm �xʚ� �OIG����a�g���H�8��3=J�=����Ck��S��xhm �x�:{<�.@��5=Z�=����Ck��S��xhm �x�:{<�.@��5=Z�=����Ck��S��xhm �x�z������S��xhm �xʚ� �OIG����q�g���#��OY�㡵���)kz<�6�{<eM���r�g���#��OY�㡵���)kz<�6�{<eM���r�g���#��OY�㡵���)kz<�6�{<eM���r�g���#��OY�㡵���)����Y8��3=J�=������{<eM���r�������@��5=Z�=������{<eM���r�������@��5=Z�=������{<eM���r�������@��5=Z�=�����{<%=:�=�r��Ci��S��xhm �x�:{<�.@��5=Z�=����Ck��S��xhm �x�z������S��xhm �xʚ� �OY�㡵������Ⱥ���S��xhm �xʚ� �OY�㡵���iz<r6{<�=*�=�r��Ci�����T��ϱ�x�=��s���-ޝ~<���F=^Τ�{=�?����������ׯ%^^���O�?���������9~����?��a�����ϧ��?��O?�y�G_9���ݯgڟ?���w?���_���>|s{sr����ݧ~������vs�6w�|��=�w>��ݍ~�r��7i���;��ݍ� ��n�:�������MY�� ���9������w7g����@����[��ݔ5��к�黛�n���Y8����K��ݜu|wck�Z ~ws��ݍ� ��n�:��������Y�w7�6�����F���ݜu|wck��nlm ~ws��ݍ� ��nʚ�nh]����Y�w7�6��9������w7g����@��:G�ݜr������w7���X�@����w���r��1n����s���T��O������3�����������Wϧ���%���_�n����O���������m;| >�Q���y�ן?m߾>�����W�������o�����[�/���ݞ���嫋_���~�w���~?r���c7�x�A�c�6cg�[������ ��CY{�ub��#�`k1�p�{���{8�=��@�=�5�Z ��:b�6cg�[H���n�;G��R�������9G���b��#�`k1�p�{���{(kb�.@�=�u�lm ��:b�6cg�[����&�@����YG���b��#�`k1�p�{���{�=Ⱥ1�p�{���{8�=��@�=�t�=�Y8�=�3�J ��:b�6cg�[������ ��CY{�ub��#�`k1�p�{���{8�=��@�=�5�Z ��:b�6cg�[������ ��CY{�ub��#�`k)�p�-�`g�0�p�{���{(kb�.@�=�u�lm ��:b�6cg�[����&�@����Y3Bky0�����<R����@��u�`HY3Bky0�����<R����@��u�`HI�`�����rf0���`HY3Bky0d�s0D�ȃ!e�`� ����f0���`HY3Bky0$���XW ��5�!�6�Cʚ�Zȃ!e�`� ������Y ��5�!�6�Cʚ�Zȃ!e�`� ����f0D���`H)�`�����rf0���`h��C��`��1`0���1�x:O����8�����aχ���#z���#������|����W��_��|~�w~sO��y3S�D������7��o[�� r��� �6���Alm �7HY�� �.@|o��������� '������{��s�7�� ��)k����� r��� �6���Alm �7�Y�{���@|o���Ah]��� g� bk�A�:����{��u�7�� ��)k����� r��� �6���Alm �7�Y�{���@|o���Ah]��� ���� 6^��AN��7�����9�xoK�� 2��� ��@|o��������� g� bk�A�:����{��5� B���9�xo[�� r��� �6���Alm �7HY�� �.@|o��������� g� bk�A�:����{��t�7����9��� V���A,m �7�Y�{���@|o��Δ���S2eMJ��rJ��I���@Nɔ5)Z�)��Δ���S2eMJ��rJ��I���@Nɔ5)Z�)��Δ���S2eMJ��rJ��I���@Lɔt�d�,�dF������L9�������)kR2�6�S2eMJ��rJf�3%#��LY�������)kR2�6�S2eMJ��rJf�3%#��LY�������)kR2�6�S2eMJ��rJ&���+�S2eMJ��rJ��I���@Lɔt�d�,�d�9S2�.@Nɔ5)Z�)��&%Ck9%S֤dhm �d�:S2�.@Nɔ5)Z�)��&%Ck9%S֤dhm �d�:S2�.@Nɔ5)Z�)��&%Ck9%S֤dhm �d�:S2�.@Nɔ5)Z�)�������L9��������L�Ⱥ�9%S֤dhm �dʚ�� �LY��������L�Ⱥ�9%S֤dhm �dʚ�� �LY��������L�Ⱥ�9%S֤dhm �dʚ�� �LY��������L�Ⱥ�1%Sґ���p��)gR2�6�S2eMJ��rJf�3%#��LY�������)kR2�6�S2eMJ��rJ&���+�S2eMJ��rJ��I���@Nɔ5)Z�)��Δ���S2eMJ��rJ��I���@Nɔ5)Z�)��&%#g�0%Sʑ���p��)gR2�6�S2����d�[Jv����?�o�{����S�S�q&)�_��������?~|{�������8��})����w�~���_��T^�m�]5�����^g6#��Έ�����}�H��@�H�5 Z���Έ���#eMD��rD���H��@�H�5 Z���Έ���#eMD��rD���H��@�H�5 Z���Έ���"��"��S���a���+>$���˥Ϛ�E�qPH(���ȤBIN�_�Y��|�ϻ;��>��n�k%���y�oP|8��WD�b�qD��D$�� G$B=G$��A�H�����D��HP�A�H�����Ĩ;"!urD��D$�� G$JMD�jrD��D$�� G$F� �c�#�&"A�9"Qj"T{�#�&"A�1"1h"2{#E��ɚ�D��H�A�H�����Ĩ;"!urD��D$�� G$JMD�jrD��D$�� G$F� �c�#�&"A�9"Qj"T{�#�&"A�9"1�HH��(5 �=��R��ڃ�(tE$h�F$�LDBd�qD��D$�� G$JMD�jrD��D$�� G$F� �c�#�&"A�9"Qj"T{�#�&"A�9"1�HH��(5 �=��R��ڃ�(5 �=��P� �s�#�&"A�9"Qj"T{#���͚�Ę;"!trD��D$�� G$JMD�jrD��D$�� G$F� �c�#�&"A�9"Qj"T{�#�&"A�9"1�HH��(5 �=��R��ڃ�(5 �=��QwDB��D��HP�A�H�"4k�#e&"A�9"1�HH��(5 �=��R��ڃ�(5 �=��QwDB��D��HP�A�H�����D��HP�A�H��#R� G$JMD�jrD��D$�� G$JMD�jrDb���:1"Q�HЬ9�H�����D��HP�A�H��#R� G$JMD�jrD��D$�� G$JMD�jrD"�sD��D��HP�A�H�����D��HP�A�H��#R� G$JMD�jrD��D$�� G$JMD�jbDb�D$d�F$�\ �5��2� ڃ�\NTD���)"y�k@Dr��������7����s�����S������)!�Y�E��?�����|�ӫW�ߜ��o?����~x���ϟN��yyx���?=�Ͻ��z}������O����Rr�?~{����C� +��^����yB=��3j^P�_Y���Ϩ=x�[���2u��c���I���'T{���I���'T{���I���'T{���ɨ�{�H��=OJ��<�ڃ�=O +]��f���<)3��h��<u��c���I�I�P�AN���D��DO�I�P�AN�=R� 'zJM��jr���$z�� 'zJM��jr�gԝ�:9�Sj=T{�=�&�C�9�Sj=T{�=��D��1H��2O���0�S�J�P�9N���D��DO��D�9ȉ�R��ڃ��)5��=ȉ�R��ڃ��u'z��AN���D��DO�I�P�AN���D��DϨ;�#ur���$z�� 'zJM��jr���$z�� &zM�Gf�a��ȕ�!Ys��)3��=ȉ�R��ڃ��u'z��AN���D��DO�I�P�AN���D��DϨ;�#ur���$z�� 'zJM��jr���$z�� 'zF݉�c�=�&�C�9�Sj=T{=��D͚�DϐI��9N���D��DO�I�P�AN���D��DϨ;�#ur���$z�� 'zJM��jr���$z�� 'zF݉�c�=�&�C�9�Sj=T{�=�&�C�9��9�ur���$z�� 'zJM��jb��Е�Ys��s'z��AN���D��DO�I�P�AN���D��DϨ;�#ur���$z�� 'zJM��jr���$z�� 'zF݉�c�=�&�C�9�Sj=T{�=�&�C�9�3�N�H���)5��=���BW��f�q���$z�� 'zF݉�c�=�&�C�9�Sj=T{�=�&�C�9�3�N�H���)5��=ȉ�R��ڃ��)5��=ȉ�Qw�G��DO�I�P�AN���D��DO�I�P�AN�=R� &z +]��5lj�2��!ڃ��)5��=ȉ�Qw�G��DO�I�P�AN���D��DO�I�P�AN�zN�@����)5��=ȉ�R��ڃ��)5��=ȉ�Qw�G��DO�I�P�AN���D��DO�I�P�AL��D�̞�DO�+�C��8�Sf=D{�=��D����)�{�k\�^L�.��{��������D=����yZ?�H�2��}����>���ӿ����_������/����I������s=��y{}�Ȼ��:<����o�����yB=��3j^(�W����eu^PW���4��� 7�JM�jr��4��� 7�F��#�c��G��yD��yTj�GT{��G��yD��y4�nI��<*5�#�=�ͣBW�f�q��4��� 7�F��#�c��G��yD��yTj�GT{��G��yD��y4�nI��<*5�#�=�ͣR�<�ڃ�<*5�#�=�ͣQw�H���Q�iQ�An������Q�iQ�An���GR� 5��<5�(>��Q��yD��yTf�GD{��G���GP� 7�JM�jr��4��� 7�JM�jr�h��<�:�yTj�GT{��G��yD��yTj�GT{��G����1�ͣR�<�ڃ�<*5�#�=�ͣR�<�ڃ�<4�#�=�ͣ"W�d�q��4��� 7�JM�jr�h��<�:�yTj�GT{��G��yD��yTj�GT{��G����1�ͣR�<�ڃ�<*5�#�=�ͣR�<�ڃ�<u7���An������Q�iQ�Al��G4k�GC�y$��yTf�GD{��G��yD��yTj�GT{��G����1�ͣR�<�ڃ�<*5�#�=�ͣR�<�ڃ�<u7���An������Q�iQ�An������Q����9�ͣR�<�ڃ�<*5�#�=�ͣBW�f�q�h��<:�yTj�GT{��G��yD��yTj�GT{��G����1�ͣR�<�ڃ�<*5�#�=�ͣR�<�ڃ�<u7���An������Q�iQ�An������Ѩ�y$ur��4��� 6� +]�#�5�ͣ2�<"ڃ�<u7���An������Q�iQ�An������Ѩ�y$ur��4��� 7�JM�jr��4��� 7�F��#�c��G��yD��yTj�GT{��G��yD��y4�nI��<*t5�h�7��L�hr��4��� 7�F��#�c��G��yD��yTj�GT{��G��yD��y�yur��4��� 7�JM�jr��4��� 7�F��#�c��G��yD��yTj�GT{��G��yD��y4h�G2{�GE��ɚ��Q�i�An/{�y����<>�5�y��{�������z��%<�-��������t�~(?snS=������o��×'��ӧ�g��Wo/����_M��g~���y�Try{����z��g���� +S��:Q�A�:�����Ө;�$ur֩�d��� g�JM։jr֩�d��� g�F�Y'�c��N�&�D�9�Tj�NT{��N�&�D�9�4��:I��u*5Y'�=�Y�BW։f�q֩�d��� g�F�Y'�c��N�&�D�9�Tj�NT{��N�&�D�9�4��:I��u*5Y'�=�Y�R�u�ڃ�u*5Y'�=�Y�Qw�I��S��:Q�A�:�����S��:Q�A�:���NR� e��<e�(>ìS�+�D��8�Tf�ND{��N���NP� g�JM։jr֩�d��� g�JM։jr�iԝu�:9�Tj�NT{��N�&�D�9�Tj�NT{��N��1�Y�R�u�ڃ�u*5Y'�=�Y�R�u�ڃ�u4Y'�=�Y�"W։d�q֩�d��� g�JM։jr�iԝu�:9�Tj�NT{��N�&�D�9�Tj�NT{��N��1�Y�R�u�ڃ�u*5Y'�=�Y�R�u�ڃ�uug���A�:�����S��:Q�A�:��N4k�NC&�$��8�Tf�ND{��N�&�D�9�Tj�NT{��N��1�Y�R�u�ڃ�u*5Y'�=�Y�R�u�ڃ�uug���A�:�����S��:Q�A�:�����S���9�Y�R�u�ڃ�u*5Y'�=�Y�BW։f�q�i̝u:9�Tj�NT{��N�&�D�9�Tj�NT{��N��1�Y�R�u�ڃ�u*5Y'�=�Y�R�u�ڃ�uug���A�:�����S��:Q�A�:�����Ө;�$ur֩�d��� f� +]Y'�5�Y�2�u"ڃ�uug���A�:�����S��:Q�A�:�����Ө;�$ur֩�d��� g�JM։jr֩�d��� g�F�Y'�c��N�&�D�9�Tj�NT{��N�&�D�9�4��:I��u*te�h�g��L։hr֩�d��� g�F�Y'�c��N�&�D�9�Tj�NT{��N�&�D�9��9�ur֩�d��� g�JM։jr֩�d��� g�F�Y'�c��N�&�D�9�Tj�NT{��N�&�D�1�4h�N2{�NE��ɚ�S��:�A�:)NY'������Y���cd���d��n��^��s��9뼾z�q��������ӿ��iV�OE +�G0g����p)������[x��_��"�-�ڃ�-(5��=�݂R�-�ڃ�-uw��A���n��nA��P�A���n��n���[ uR���S����1���k��e�[@��[�[�ur���t�� wJM��jr���t�� wF���c����[@��[Pj�T{����[@��[0��H��-(5��=�݂R�-�ڃ�-(5��=�݂A�-��s�-(ruH�w�L��hr���t�� wF���c����[@��[Pj�T{����[@��[0��H��-(5��=�݂R�-�ڃ�-(5��=�݂Qw�@��nA��P�A���n��nA��[@��[0d�"{��e�[@��[Pj�T{����[@��[0��H��-(5��=�݂R�-�ڃ�-(5��=�݂Qw�@��nA��P�A���n��nA��P�A��z�@���-(5��=�݂R�-�ڃ�-(tuh�w����c����[@��[Pj�T{����[@��[0��H��-(5��=�݂R�-�ڃ�-(5��=�݂Qw�@��nA��P�A���n��nA��P�A����R� wJM��jb����-�Ys�-(3��=�݂Qw�@��nA��P�A���n��nA��P�A����R� wJM��jr���t�� wJM��jr�`��-�:�[Pj�T{����[@��[Pj�T{����n��1�݂BW��f�q���t�� wJM��jr�`��-�:�[Pj�T{����[@��[Pj�T{�����P� wJM��jr���t�� wJM��jr�`��-�:�[Pj�T{����[@��[Pj�T{���[ ��[P����9���n��n��E���ǩ[x�k@�p���۾���v���{S���9w7�[����~8��o���t_>��/�|����~~yx�y�o��ˆ�z�j����Ճ������C���*��Z?����]����*F{煮��X�A��Rj�P�xW��uW�j�]�S�]�=�wUN]wU�� �U)5wU��A��r꺫b��ʩ뮊�Ļ*���*V{杖��*T� �U9u�U�ڃxW��uW�j�]�COwUl��U)r�U!�sxW��uW�h�]�S�]�=�wUN]wU�� �U)5wU��A��r꺫b��ʩ뮊�Ļ*���*V{杖��*T� �U9u�U�ڃxW��uW�j�]�S�]�=�wUF�wU��A��r꺫b��ʩ뮊���*���ج9��Rf��xW��uW�j�]�S�]�=�wUN]wU�� �U)5wU��A��r꺫b��ʩ뮊�Ļ*���*V{杖��*T� �U9u�U�ڃxW��uW�j�]�S�]�=�wUJ�]�c煮��X�A��r�鮊͚û*g��*F{杖��*T� �U9u�U�ڃxW��uW�j�]�S�]�=�wUJ�]�c煮��X�A��r꺫b��ʩ뮊�Ļ*�� +�1�wUN]wU�� �U9u�U�ڃxW��uW�j�]�RsW����*���ج9��r溫b��ʩ뮊�Ļ*�� +�1�wUN]wU�� �U9u�U�ڃxW��uW�j�]�Q�]�s煮��X�A��r꺫b��ʩ뮊�Ļ*�� +�1�wUN]wU�� �U9u�U�ڃxW��uW�j�]�B�]�=GwU�<�U1YsxW��uW�h�]��<Wſ�ןy�k\��tW����l^�Ļ��3绪���������������>���_�����j�wx�ǎ�G�������KO���^�zuÿx~��/����ۻ�_�'�'���>����GYO��*5�ޢ:��[��goY�A|�֩��[V{��u�z����go��goQ���S׳��� >{����-�=���:u={�jJͳ���Ax�֙_��e��={��ӳ�,�>{����-�=���u?{K��go����e���[��goY�A|�֩��[V{��Uj��EuN]�ڃ��S׳��� >{����-�=���*5�ޢ:��[��goY�A|�֩��[V{��u�z����go���E����[G�<ɚ�<C��3�A�3��<��<è;� ur������ �JM��jr������ �F�y�c���&�@�9�Pj�T{���&�@�9�0��3H��g(5y�=�y�R�g�ڃ�g(t�h���L�Ad�q������ �JM��jr������ �F�y�c���&�@�9�Pj�T{���&�@�9�0��3H��g(5y�=�y�R�g�ڃ�g(5y�=�y�P�y�s���&�@�9�Pj�T{���<͚�<Ø;� tr������ �JM��jr������ �F�y�c���&�@�9�Pj�T{���&�@�9�0��3H��g(5y�=�y�R�g�ڃ�g(5y�=�y�Qw�A��<C��3P�A�3��4k��e&�@�9�0��3H��g(5y�=�y�R�g�ڃ�g(5y�=�y�Qw�A��<C��3P�A�3��<��<C��3P�A�3���R� �JM��jr������ �JM��jr�aԝg�:1�P��3Ь9�3��<��<C��3P�A�3���R� �JM��jr������ �JM��jr�!�s���<C��3P�A�3��<��<C��3P�A�3���R� �JM��jr������ �JM��jb�a��d���\y�5�y�2�g ڃ�gPS ��=Nyƃ_���b�q���������g��=�;�_������߽{�t��~(?�<�z��{���_������_�p��_�_�Y�������/��������-�=�-��;�;\]��y{��<V�ϲ:/�7Wo�Z���Ϩ=xA�����T���}F����/��?M*���Ϩ=������_��N�Ϣ:/�ǿ7�R=��3j^P���iR���}F����/�����}F������/ë;���eu^Po��d�N���}F�������z��g����]��?�_���&�W���4��YF������֪��}F�������w�z��g����*�����g�Q{�i�����F��gY���_���R=��3j^P��o8�g�Q{��z���ʪ��}F����ׇ�W�����ϲ:/�7Wo���p��>�������[��~��/�wWo��/�~���V��2���Y?�����2����g�Q{��z�� �?�ӏ>c������F� g��3h^�͏ ���~��1xA=�58ȿͭ�}F���}~o���>�� ��JMϏjr�o���:��Wjz~T{�{~���G���Wjz~T{�{~��1�=�R��ڃ��+5=?�=�=�R��ڃ��u����A���y��Q|8�=�WϏb�qϯ����� ��B=����A�������_���Q�A�������ߨ��'urϯ����� ��JMϏjrϯ����� ��F�=?�c�{~���G���Wjz~T{�{~���G���7hz~2{{~E��ɚ�_����A�������ߨ��'urϯ����� ��JMϏjrϯ����� ��F�=?�c�{~���G���Wjz~T{�{~���G���7���I���+5=?�=�=�R��ڃ��+t��h����L�Od�qϯ����� ��JMϏjrϯ����� ��F�=?�c�{~���G���Wjz~T{�{~���G���7���I���+5=?�=�=�R��ڃ��+5=?�=�=�P�=?�s�{~���G���Wjz~T{{~���͚�ߘ��'trϯ����� ��JMϏjrϯ����� ��F�=?�c�{~���G���Wjz~T{�{~���G���7���I���+5=?�=�=�R��ڃ��+5=?�=�=�Qw�O��_���Q�A���z~4k�{~e��G���7���I���+5=?�=�=�R��ڃ��+5=?�=�=�Qw�O��_���Q�A�������_���Q�A����{~R� ��JMϏjrϯ����� ��JMϏjr�o���:��W���Ѭ9�������_���Q�A����{~R� ��JMϏjrϯ����� ��JMϏjr�/�s���_���Q�A�������_���Q�A����{~R� ��JMϏjrϯ����� ��JMϏjb�o���d����\=?�5�=�2��#ڃ��_�UϏ�ǩ��k@����{��?ܽz��{��3��oV���?����������?^^�X_�x��x*o���O�g�q�y�Kw{��n�����ǿ����An������P�iQ�An������Ш�=$ur{�Դ��� ��JM{�jr{�Դ��� ��F��!�c��C��=D��=T�jѬ9n������Ш�=$ur{�Դ��� ��JM{�jr{�Դ��� ��F��!�c��C��=D��=Tj�CT{��C��=D��=4�nI��*5�!�=���R��ڃ�*5�!�=���Qw{H���P���Ňc�*p��(����L{�hr{(�s{���P�iQ�An������P�iQ�An���CR� ��JM{�jr{�Դ��� ��JM{�jr{h���:�=Tj�CT{��C��=D��=Tj�CT{�C��=$��=T�j��9n������P�iQ�An���CR� ��JM{�jr{�Դ��� ��JM{�jr{h���:�=Tj�CT{��C��=D��=Tj�CT{��C�����1���R��ڃ�*5�!�=���BW{�f�a{hȴ�D����L{�hr{�Դ��� ��JM{�jr{h���:�=Tj�CT{��C��=D��=Tj�CT{��C�����1���R��ڃ�*5�!�=���R��ڃ� +���:�=Tj�CT{��C��=D��=T�jѬ9n���CB� ��JM{�jr{�Դ��� ��JM{�jr{h���:�=Tj�CT{��C��=D��=Tj�CT{��C�����1���R��ڃ�*5�!�=���R��ڃ�u����An������P��=D��=Tf�CD{��C�����1���R��ڃ�*5�!�=���R��ڃ�u����An������P�iQ�An������Ш�=$ur{�Դ��� ��JM{�jr{�Դ��� ��F��!�c�C���͚��P�i�An������Ш�=$ur{�Դ��� ��JM{�jr{�Դ��� ��B=����An������P�iQ�An������Ш�=$ur{�Դ��� ��JM{�jr{�Դ��� ��M{Hf�a{���"Ys�*3�!�=����vN���{��������������?ps�ߘ~��b������un���ջ�'��3��Sy�zu����?���_��×��<�y��������Oz����_������O�+��ǿ�����q�x��x�B��.�o��w���~�{�"�>�ڃ�>u����An������Q�iQ�An������Ѩ�}$ur��Դ��� ��JM��jr��Դ��� ��F��#�c��G��}D��}T�jѬ9n������Ѩ�}$ur��Դ��� ��JM��jr��Դ��� ��F��#�c��G��}D��}Tj�GT{��G��}D��}4�nI��>*5�#�=���R�>�ڃ�>*5�#�=���Qw�H���Q���Ňc�>*p��(����L��hr�(�s����Q�iQ�An������Q�iQ�An���GR� ��JM��jr��Դ��� ��JM��jr�h��>�:�}Tj�GT{��G��}D��}Tj�GT{�G��}$��}T�j��9n������Q�iQ�An���GR� ��JM��jr��Դ��� ��JM��jr�h��>�:�}Tj�GT{��G��}D��}Tj�GT{��G�����1���R�>�ڃ�>*5�#�=���BW��f�a�hȴ�D����L��hr��Դ��� ��JM��jr�h��>�:�}Tj�GT{��G��}D��}Tj�GT{��G�����1���R�>�ڃ�>*5�#�=���R�>�ڃ�> +��>�:�}Tj�GT{��G��}D��}T�jѬ9n���GB� ��JM��jr��Դ��� ��JM��jr�h��>�:�}Tj�GT{��G��}D��}Tj�GT{��G�����1���R�>�ڃ�>*5�#�=���R�>�ڃ�>u����An������Q��}D��}Tf�GD{��G�����1���R�>�ڃ�>*5�#�=���R�>�ڃ�>u����An������Q�iQ�An������Ѩ�}$ur��Դ��� ��JM��jr��Դ��� ��F��#�c�G���͚��Q�i�An������Ѩ�}$ur��Դ��� ��JM��jr��Դ��� ��B=����An������Q�iQ�An������Ѩ�}$ur��Դ��� ��JM��jr��Դ��� ��M�Hf�a����>"Ys�>*3�#�=����bO���{����������{����s��]\?���������o�_ߵ���?����m���rF�Y�;��WO�Y;���z���b�\?��||��pu���S���[���������ۛ[��~��/��W���С���>�������`���>���������՝S�ϲ:/�7��x'���>������O�V=��3j^P�n��?��Ys������:��~��1xA=�5����g�Q{���*m�&�F�9�Vj�oT{��o����1�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������ۨ;�&ur���dߨ� f� +]�7�5�ٷ2�}#ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������ۨ;�&ur���dߨ� g�JM��jr���dߨ� g�F��7�c��o�&�F�9�Vj�oT{��o�&�F�9�6�ξI��}+�}��p�o��Ś��[�ɾ�Aξ�zξA���}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQw�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jb�m�d�d�fߊ\�7�5�ٷ2�}#ڃ�}+5�7�=�ٷQw�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�1�V�ʾѬ9̾ ��Ȟ��[�ɾ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o���oP� g�JM��jr���dߨ� f� +]�7�5�ٷ1w�M���[�ɾQ�Aξ������[�ɾQ�Aξ���oR� g�JM��jr���dߨ� g�JM��jr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o����1�ٷR�}�ڃ�}+te�h�g��L��hr�mԝ}�:9�Vj�oT{��o�&�F�9�Vj�oT{��o����1�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������ۨ;�&ub��Е}�Ys�}+3�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������[����9�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ugߤ�Aξ������[�ɾQ�Aξ������۠ɾ��9̾��o$k��oe&�F�9���Yd��{����dߗ��}_?�}�����3ɾ�W�����|����?�|������/�>��症�����ŷ��q?~�᧧�W��A����_����3��OK�e��>�c�|Z����RT{�OK��OKI�|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Zj�}ZJ���R�����R�����R�����R�洔̞��RE��R$k�OK���RD{�OK���RT{�OK��OKI�|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Zj�}ZJ���R�����R�����R�����R���RR� ��*5���� ��*5���� ��*t���YsxZjȜ��s|Z�̜�"ڃ|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Zj�}ZJ���R�����R�����R�����R���RR� ��*5���� ��*5���� ��*5���� �� +�|Z +���R�����R�����R���R4k�OK��OK �|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Z�Ԝ��ڃ|Zj�}ZJ���R�����R�����R�����R���RR� ��*5���� ��*5���� ��*5���� ��u���:��T�9-E��T��͚��Re����R���RR� ��*5���� ��*5���� ��*5���� ��u���:��T�9-E���T�9-E���T�9-E���Ԩ����1ȧ�J�i)�=ȧ�J�i)�=ȧ�J�i)�=ȧ�Fݧ���A<-U�:-E����T�9-E���T�9-E���Ԩ����1ȧ�J�i)�=ȧ�J�i)�=ȧ�J�i)�=ȧ�B=���:��T�9-E���T�9-E���T�9-E���Ԩ����1ȧ�J�i)�=ȧ�J�i)�=ȧ�J�i)�=����i)�=����\��H���*3���� ��^�~T���{�NK�7���������^���������i�M�Q��7/~���ї�7/>|y��B�?�����^����� +�\����#�����W��۫���"O���}F�����#��;�P�A�%���C �9�ߡ��|��=�ߡ��|��=�ߡ��|��=�ߡd��J��A�%��;�P�A�%��;�P�A�%���PB���;����C��1�ߡ��|��=�ߡ��|��=�ߡ��|��=�ߡd��J��A�%��;�P�A�%��;�P�A�%��;�P�A�%���P"u�w()5ߡ�j�w()5ߡ�j�w()5ߡ�j�w(u��c��CI��%T{�CI��;�Ь9�%e�;��A�%���P"u�w()5ߡ�j�w()5ߡ�j�w()5ߡ�j�w(u��c��CI��%T{��CI��%T{��CI��%T{��Cɨ�;�H��JJ�w(�ڃ�JJ�w(�ڃ�JJ�w(�ڃ�JF�ߡD���PR��;�P|8�ߡ���J(���2�J�� ��P�ߡ���PRj�C ���PRjBwT{�Cw�&tG�9t7��I��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�A� �Н̞��]�+tG��8tWfBwD{�Cw�&tG�9t7��I��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� �� +]�;�5���!��s�+3�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�.�s����]� �Q�Aݕ�����]�+tG��8t7�� ��+5�;�=ȡ�R��ڃ�+5�;�=ȡ�Qw�N���]� �Q�Aݕ�����]� �Q�Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�n���:9tWjBwT{Cw���͚��]� ��Aݍ�CwR� ��JM�jr�Ԅ�� ��JM�jr�n���:9tWjBwT{�Cw�&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ�u�A��Bw4k�Cwe&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ����:9tWjBwT{�Cw�&tG�9tWjBwT{�Cw��Н�1ȡ�R��ڃ�+5�;�=ȡ�R��ڃ�4�;�=���"W�d�q�̄�� ��cm���q +���_�=���7���)|����:�������\|w��/�~&?r��߬���/o�������O�����O�=*����?�_= �)��yw�o?�������~������qi~w���~��x��~�͞�@�\��<��3h^Po�n^Y���Ϩ=xA��z����=��3j^x>�p�q��YV������S� �� >����@�=�48u=��j� F�4�:���X�A|����V{hp�z������P��@�S� �� >����@�=H48��@�5�4(34 :���X�A|����V{hp�z������P��@�S� �� >����@�=�48u=��j� J� ��A|����V{hp�z������h`����T� >����@�=H48��@�5�48s=��h� J� ��A|����V{hp�z������h`����T� >����@�=�48u=��j� N]4�ڃ�@�R�@�chp�z������h`����X�A|�A�y��148�� ,>�xz��Ś���h`����H���@�S� �� >����@�=�48u=��j� J� ��A|����V{hp�z������h`����T� >����@�=�48u=��j� N]4�ڃ�@�B� h�=���� L�>����@�=�48u=��j� J� ��A|����V{hp�z������h`����T� >����@�=�48u=��j� N]4�ڃ�@�R�@�chp�z������h`����h`���E���9|����F{hp�z������h`����T� >����@�=�48u=��j� N]4�ڃ�@�R�@�chp�z������h`����X�A|�����R� >����@�=�48u=��j� ==��f�� �� ��A|����V{hp�z������h`����T� >����@�=�48u=��j� N]4�ڃ�@�R�@�chp�z������h`����X�A|�A�y��1�48u=��j� ==��f�� �\40ڃ�@�R�@�chp�z������h`����X�A|�A�y��1�48u=��j� N]4�ڃ�@�S� �� >Р�<Ѐ����h`����X�A|����V{hPjh@u� ==��f�� �\40ڃ�@�S� �� >Р�<Ѐ����h`����X�A|����V{h0�~���9�48u=��j� N]4�ڃ�@�S� �� >Р�<Ѐ����h`����X�A|����V{�hP�z�͞�yz��ɚ���h`��|m������3���K4����ׇ���_��O�U����/��ot��m77o�.���g�D�a=����|���������������O�ӿ�yx�/�^|�i�O>���_~����o������_~8��7W�W���~��xϿ��c���9�����9���/r�a^��y���E�=�9J�E�=�9F�9��A��Qj.rP�A��Qj.rP�A��Qj.rP�A��1��!u�E�Rs��j�E�Rs��j�E�B�E�5�9��E�=�9��E�=�9J�E�=�9J�E�=�9F�9��A��Qj.rP�A��Qj.rP�A��Qj.rP�A��1��!u�E�Rs��j�E�Rs��j�E�Rs��j�E�P�9��A��Qj.rP�A��Qj.rP�A��Q��A���"ǘ�"��1�9J�E�=�9J�E�=�9J�E�=�9F�9��A��Qj.rP�A��Qj.rP�A��Qj.rP�A��1��!u�E�Rs��j�E�Rs��j�E�Rs��j�E�Q�E�c�/r���T{/r�.rЬ9��Qf.r�A��1��!u�E�Rs��j�E�Rs��j�E�Rs��j�E�Q�E�c�/r���T{�/r���T{�/r���T{�/r��/rH�|���\�ڃ|���\�ڃ|���\�ڃ|�c�}�C�ċ���4k�/r���D{�/r���T{�/r��/rH�|���\�ڃ|���\�ڃ|���\�ڃ|�#��E�s�/r���T{�/r���T{�/r���T{�/r��/rH�|���\�ڃ|���\�ڃ|���\�ڃx�c�\��sx���u��d��E�2s��h�E���u�����"���9����"������k��Y?����u�������~�����ͷ�~����Ï//�Y�7���y���>���݃�'�m�K�6�'6�a?�������xb��'6����$u��J���� ?���<��j��J���� ?�i���&�c���T��M��� +\Ol�Xs�Ħ2��&�=�Ol +���&�s���Tj��D���M��MT{���Tj��D���M��'6I��ĦR��&�=�Ol*5Ol�ڃ�ĦR��&�=�Olu?�I��'6��'6Q�A~bS�yb��'6��'6Q�A|bӠyb�̞�'6���D����Me�MD{���Tj��D���M��'6I��ĦRsЏj�A�RsЏj�A�RsЏj�A�Q�A?�c�����~T{�����~T{�����~T{�����I�|Я���ڃ|Я���ڃxЯ�uЏf��A�!s�Od��A�2sЏh�A�RsЏj�A�RsЏj�A�Q�A?�c�����~T{�����~T{�����~T{�����I�|Я���ڃ|Я���ڃ|Я���ڃ|�/��A?�s�����~T{�����~T{���Ѭ9>�7�>�'t�A�RsЏj�A�RsЏj�A�RsЏj�A�Q�A?�c�����~T{�����~T{�����~T{�����I�|Я���ڃ|Я���ڃ|Я���ڃ|�o�}�O��~���ă~���~4k�����~D{�����I�|Я���ڃ|Я���ڃ|Я���ڃ|�o�}�O��~����~����~����~��~R� �+5��� �+5��� �+5��� �u��:�_��͚�~e���~����~��~R� �+5��� �+5��� �+5��� ��|���~����~����~����~��~R� �+5��� �+5��� �+5��� �4�d��+r�#Ys|Я��#ڃ|���\���q:��k�A���c�_?s���p��k>�_?����u����O�>������~��Wo^��__^�y���������//~�����/~�p��;<��?���}�%�oz��q��I?�A���O��"pҏj�I�Q�I?�c�O����~T{�O����~T{�O����~T{�O���O�I�tү��I?���_��Ś�~e���~��O�A��|үԜ��ڃ|үԜ��ڃ|үԜ��ڃ|�o�}�O��~����~����~����~��~R� ��+5'��� ��+5'��� ��+5'��� ��4'�d���+r��#Ys|ү̜�#ڃ|үԜ��ڃ|�o�}�O��~����~����~����~��~R� ��+5'��� ��+5'��� ��+5'��� ��u���:��_�9�G���_�9�G��_��͚Ó~C椟Ȟ�~e���~����~����~��~R� ��+5'��� ��+5'��� ��+5'��� ��u���:��_�9�G���_�9�G���_�9�G���_��~P� ��+5'��� ��+5'��� ��+t���Ys|�o�}�O��~����~����~����~��~R� ��+5'��� ��+5'��� ��+5'��� ��u���:��_�9�G���_�9�G���_�9�G���ߨ����1�'�J�I?�=�'� +]'�h���+3'��� ��u���:��_�9�G���_�9�G���_�9�G���ߨ����1�'�J�I?�=�'�J�I?�=�'�J�I?�=�'�F�'���A>�WjN�Q�A>�WjN�Q�A>�WjN�Q�A>�7�>�'u�I�B�I?�5�'���I?�=�'�J�I?�=�'�F�'���A>�WjN�Q�A>�WjN�Q�A>�WjN�Q�A>�����9�'�J�I?�=�'�J�I?�=�'�J�I?�=�'�F�'���A>�WjN�Q�A>�WjN�Q�A>�WjN�Q�A<�7hN���9<�W�:�G����_�9�G������:����t�����x������9��݁O������:���/�W/>����o�����ŇO�~^����?��ž���ß^�������ŷ��������?���_�����_�������/�����o����_��Ͽ��������CS����>������_>4%u�J͇��� h��|h�j�J͇��� hj���)�c�?4Uj>4E��CS��CST{�?4Uj>4E��CS��?4u�J͇��� h��|h�j⇦ +]��Ys���1�����A��T�����M��MQ�A��T�����M��?4%u�J͇��� h��|h�j�J͇��� hj���)�c�?4Uj>4E��CS��CST{�?4Uj>4E��CS��MI����R�)�=��*t}h�f���̇��� hj���)�c�?4Uj>4E��CS��CST{�?4Uj>4E��CS��MI����R�)�=��*5��ڃ���R�)�=��uhJ��M��MQ�A��T�����M��MQ�A��Ԩ�CSR� ~h����)�5��*3�"ڃ���R�)�=��uhJ��M��MQ�A��T�����M��MQ�A��T��MA�����R�)�=��*5��ڃ���R�)�=��uhJ��M��MQ�A��T�����M��MQ�A��Ԡ�Д̞�M�>4E���CSe�CSD{�?4��Y����Ӈ�~ �����q�����\���]��>�V����ۛ��)����v�>�z?�>��D������_��_/�:�H����endstream +endobj +942 0 obj << +/Type /Page +/Contents 943 0 R +/Resources 941 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +/Annots [ 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R ] +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 706.56 278.146 715.098] +/Subtype /Link +/A << /S /GoTo /D (install-modules-date-format) >> +>> endobj +946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 706.56 537.983 715.098] +/Subtype /Link +/A << /S /GoTo /D (install-modules-date-format) >> +>> endobj +947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 693.609 219.556 702.147] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbi) >> +>> endobj +948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 693.609 537.983 702.147] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbi) >> +>> endobj +949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 680.284 275.177 689.195] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbd-mysql) >> +>> endobj +950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 680.284 537.983 689.195] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbd-mysql) >> +>> endobj +951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 667.333 242.809 676.244] +/Subtype /Link +/A << /S /GoTo /D (install-file-spec) >> +>> endobj +952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 667.333 537.983 676.244] +/Subtype /Link +/A << /S /GoTo /D (install-file-spec) >> +>> endobj +953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 654.381 242.789 663.293] +/Subtype /Link +/A << /S /GoTo /D (install-modules-file-temp) >> +>> endobj +954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 654.381 537.983 663.293] +/Subtype /Link +/A << /S /GoTo /D (install-modules-file-temp) >> +>> endobj +955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 641.43 275.347 650.341] +/Subtype /Link +/A << /S /GoTo /D (install-modules-template) >> +>> endobj +956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 641.43 537.983 650.341] +/Subtype /Link +/A << /S /GoTo /D (install-modules-template) >> +>> endobj +957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 628.478 277.369 637.39] +/Subtype /Link +/A << /S /GoTo /D (install-modules-text-wrap) >> +>> endobj +958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 628.478 537.983 637.39] +/Subtype /Link +/A << /S /GoTo /D (install-modules-text-wrap) >> +>> endobj +959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 615.527 263.551 624.438] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd) >> +>> endobj +960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 615.527 537.983 624.438] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd) >> +>> endobj +961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 602.575 300.631 611.487] +/Subtype /Link +/A << /S /GoTo /D (install-modules-chart-base) >> +>> endobj +962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 602.575 537.983 611.487] +/Subtype /Link +/A << /S /GoTo /D (install-modules-chart-base) >> +>> endobj +963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 589.624 300.602 598.535] +/Subtype /Link +/A << /S /GoTo /D (install-modules-xml-parser) >> +>> endobj +964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 589.624 537.983 598.535] +/Subtype /Link +/A << /S /GoTo /D (install-modules-xml-parser) >> +>> endobj +965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 576.673 293 585.584] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-graph) >> +>> endobj +966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 576.673 537.983 585.584] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-graph) >> +>> endobj +967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 563.721 313.752 572.633] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-text-align) >> +>> endobj +968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 563.721 537.983 572.633] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-text-align) >> +>> endobj +969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 550.77 305.583 559.681] +/Subtype /Link +/A << /S /GoTo /D (install-modules-mime-parser) >> +>> endobj +970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 550.77 537.983 559.681] +/Subtype /Link +/A << /S /GoTo /D (install-modules-mime-parser) >> +>> endobj +971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 537.818 304.069 546.73] +/Subtype /Link +/A << /S /GoTo /D (install-modules-patchreader) >> +>> endobj +972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 537.818 537.983 546.73] +/Subtype /Link +/A << /S /GoTo /D (install-modules-patchreader) >> +>> endobj +973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 526.924 197.708 533.778] +/Subtype /Link +/A << /S /GoTo /D (install-webserver) >> +>> endobj +974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 526.924 537.983 533.778] +/Subtype /Link +/A << /S /GoTo /D (install-webserver) >> +>> endobj +975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 511.915 178.221 520.827] +/Subtype /Link +/A << /S /GoTo /D (install-bzfiles) >> +>> endobj +976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 511.915 537.983 520.827] +/Subtype /Link +/A << /S /GoTo /D (install-bzfiles) >> +>> endobj +977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 498.964 276.173 507.875] +/Subtype /Link +/A << /S /GoTo /D (install-setupdatabase) >> +>> endobj +978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 498.964 537.983 507.875] +/Subtype /Link +/A << /S /GoTo /D (install-setupdatabase) >> +>> endobj +979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 486.762 214.396 494.924] +/Subtype /Link +/A << /S /GoTo /D (794) >> +>> endobj +982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 486.762 537.983 494.924] +/Subtype /Link +/A << /S /GoTo /D (794) >> +>> endobj +983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 473.061 228.871 481.973] +/Subtype /Link +/A << /S /GoTo /D (825) >> +>> endobj +984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 473.061 537.983 481.973] +/Subtype /Link +/A << /S /GoTo /D (825) >> +>> endobj +985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 460.11 250.898 469.021] +/Subtype /Link +/A << /S /GoTo /D (extraconfig) >> +>> endobj +986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 460.11 537.983 469.021] +/Subtype /Link +/A << /S /GoTo /D (extraconfig) >> +>> endobj +987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 447.158 222.605 456.07] +/Subtype /Link +/A << /S /GoTo /D (831) >> +>> endobj +988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 447.158 537.983 456.07] +/Subtype /Link +/A << /S /GoTo /D (831) >> +>> endobj +989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 434.207 192.328 443.118] +/Subtype /Link +/A << /S /GoTo /D (846) >> +>> endobj +990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 434.207 537.983 443.118] +/Subtype /Link +/A << /S /GoTo /D (846) >> +>> endobj +991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 421.255 219.726 430.167] +/Subtype /Link +/A << /S /GoTo /D (859) >> +>> endobj +992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 421.255 537.983 430.167] +/Subtype /Link +/A << /S /GoTo /D (859) >> +>> endobj +993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 410.361 231.78 417.215] +/Subtype /Link +/A << /S /GoTo /D (bzldap) >> +>> endobj +994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 410.361 537.983 417.215] +/Subtype /Link +/A << /S /GoTo /D (bzldap) >> +>> endobj +995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 395.353 462.074 404.264] +/Subtype /Link +/A << /S /GoTo /D (content-type) >> +>> endobj +996 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 395.353 537.983 404.264] +/Subtype /Link +/A << /S /GoTo /D (content-type) >> +>> endobj +997 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 382.401 338.649 391.312] +/Subtype /Link +/A << /S /GoTo /D (directoryindex) >> +>> endobj +998 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 382.401 537.983 391.312] +/Subtype /Link +/A << /S /GoTo /D (directoryindex) >> +>> endobj +999 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 369.45 240.627 378.361] +/Subtype /Link +/A << /S /GoTo /D (mod_perl) >> +>> endobj +1000 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 369.45 537.983 378.361] +/Subtype /Link +/A << /S /GoTo /D (mod_perl) >> +>> endobj +1001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 356.498 261.588 365.41] +/Subtype /Link +/A << /S /GoTo /D (mod-throttle) >> +>> endobj +1002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 356.498 537.983 365.41] +/Subtype /Link +/A << /S /GoTo /D (mod-throttle) >> +>> endobj +1003 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 343.547 233.453 352.458] +/Subtype /Link +/A << /S /GoTo /D (os-specific) >> +>> endobj +1004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 343.547 537.983 352.458] +/Subtype /Link +/A << /S /GoTo /D (os-specific) >> +>> endobj +1005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 332.653 223.78 339.507] +/Subtype /Link +/A << /S /GoTo /D (os-win32) >> +>> endobj +1006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 332.653 537.983 339.507] +/Subtype /Link +/A << /S /GoTo /D (os-win32) >> +>> endobj +1007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 319.701 221.101 326.555] +/Subtype /Link +/A << /S /GoTo /D (win32-perl) >> +>> endobj +1008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 319.701 537.983 326.555] +/Subtype /Link +/A << /S /GoTo /D (win32-perl) >> +>> endobj +1009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 306.75 270.913 313.604] +/Subtype /Link +/A << /S /GoTo /D (win32-perlmodules) >> +>> endobj +1010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 306.75 537.983 313.604] +/Subtype /Link +/A << /S /GoTo /D (win32-perlmodules) >> +>> endobj +1011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 291.741 333 300.652] +/Subtype /Link +/A << /S /GoTo /D (win32-code-changes) >> +>> endobj +1012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 291.741 537.983 300.652] +/Subtype /Link +/A << /S /GoTo /D (win32-code-changes) >> +>> endobj +1013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 278.79 265.763 287.701] +/Subtype /Link +/A << /S /GoTo /D (win32-http) >> +>> endobj +1014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 278.79 537.983 287.701] +/Subtype /Link +/A << /S /GoTo /D (win32-http) >> +>> endobj +1015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 267.895 187.068 274.75] +/Subtype /Link +/A << /S /GoTo /D (os-macosx) >> +>> endobj +1016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 267.895 537.983 274.75] +/Subtype /Link +/A << /S /GoTo /D (os-macosx) >> +>> endobj +1017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 254.824 226.809 261.798] +/Subtype /Link +/A << /S /GoTo /D (os-mandrake) >> +>> endobj +1018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 254.824 537.983 261.798] +/Subtype /Link +/A << /S /GoTo /D (os-mandrake) >> +>> endobj +1019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 239.935 224.169 248.847] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +1020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 239.935 537.983 248.847] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +1021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 226.984 197.858 235.895] +/Subtype /Link +/A << /S /GoTo /D (http-apache) >> +>> endobj +1022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 226.984 537.983 235.895] +/Subtype /Link +/A << /S /GoTo /D (http-apache) >> +>> endobj +1023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 216.09 303.55 222.944] +/Subtype /Link +/A << /S /GoTo /D (http-iis) >> +>> endobj +1024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 216.09 537.983 222.944] +/Subtype /Link +/A << /S /GoTo /D (http-iis) >> +>> endobj +1025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 203.138 192.727 209.992] +/Subtype /Link +/A << /S /GoTo /D (http-aol) >> +>> endobj +1026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 203.138 537.983 209.992] +/Subtype /Link +/A << /S /GoTo /D (http-aol) >> +>> endobj +1027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 188.13 178.59 197.041] +/Subtype /Link +/A << /S /GoTo /D (troubleshooting) >> +>> endobj +1028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 188.13 537.983 197.041] +/Subtype /Link +/A << /S /GoTo /D (troubleshooting) >> +>> endobj +1029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 175.178 340.83 184.09] +/Subtype /Link +/A << /S /GoTo /D (1156) >> +>> endobj +1030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 175.178 537.983 184.09] +/Subtype /Link +/A << /S /GoTo /D (1156) >> +>> endobj +1031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 162.227 273.852 171.138] +/Subtype /Link +/A << /S /GoTo /D (1161) >> +>> endobj +1032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 162.227 537.983 171.138] +/Subtype /Link +/A << /S /GoTo /D (1161) >> +>> endobj +1033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 149.275 274.529 158.187] +/Subtype /Link +/A << /S /GoTo /D (paranoid-security) >> +>> endobj +1034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 149.275 537.983 158.187] +/Subtype /Link +/A << /S /GoTo /D (paranoid-security) >> +>> endobj +1035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 137.3 375.909 145.235] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp) >> +>> endobj +1036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 137.3 537.983 145.235] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp) >> +>> endobj +944 0 obj << +/D [942 0 R /XYZ 71.731 729.265 null] +>> endobj +941 0 obj << +/Font << /F27 800 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1084 0 obj << +/Length 57060 +/Filter /FlateDecode +>> +stream +xڔ�M�l�ye�~�@��u���lJ��a��-7l7`�A +��ү�<w��2�:�G�VI��D�xI0ǻ��<����7�������{|?<�<����7:�O����O//�����}����O��px<�|f�{}x;���>����������o��/�o~�/�s�G~�������w�{|~��o������/?���O��[�۟���?����������_~?��������+i�4�����?����p�P�A�3����c�����Ǹan��A{pG}9���={G�������(���;j�Vߏ�Ƿ�Sdz�.�;����j���;j���'��$���;j����Y�۳w���>>���'��YT����5�^��={G����5<�Ju{��ڃ;��k8Zu{��ڃ����kxxs�x��epG=^�ߥ�={G����p|�����wԷË����;f��&����'�2�����Ū۳w��Q����T�g�=�������T�g�=x[=����Tdz�.�;��kx|�����w���p���g�=������n��Q{��t<<��?�Ƴ�.�;����&����Q{pG}9<�Zu{��ڃ;�������x��ڃ������,��ϲ����ɪ۳w��Q�_��'���;f�����$����A{��r��:�eu�Q���Q�17������z���={G������.����Q{���px��<�eu�QO��W�n��Q{pG}>?/����Q{pG= �����o�o��I��YV����5��s��;j���Q�17������z��Vݞ����m���5<�?�Ƴ�.�;��k��Ǔw����`�-�����v����M�7�����M���px{u��YT���t8�Xu{��ڃ;��[x>Iu{��ڃ;��?t����o����p��x��epG= ��Rݞ�����z��/Rݞ�����z�>Xu{��ڃ��LJ���.ϲ���O�n��Q{pG}>��Zu{��ڃ;�����]�۳w�����_��_��Q6{n�<���n��!kn�<OGin��A{pG='���x��ڃ�է�W�(��,����z���ϸ���w��� �6D�������v8�[u{��ڃ����˛�7�YV���t8����Q{pG}>��Xu{��ڃ;��kx�ƍg�=x[}9 O�O��,����z�NVݞ�����z��q��;j��A������n����@�y�=�d���/���۳w��Q���g'y��ڃ;����ͪ۳w���~��I��$ϲ�Ã��I������z����={G����5ȟ���;j�V��_�I��YV����5<�?�Ƴw��Q�_���I������z���={G������������gQ]w��û�{xy��ڃ;����ժ۳w��Q_�o +�G�5w�<���Gk�et�Q����U�g�=������G�n��Q{pG=�g'y��ڃ������(��,����z��ORݞ�����z���N���w���ۻU�g�=x[==No<��2��>���N���w����Ū۳w��Q�_ó�cn<{G������k�?;ɳ�.�;��k8Yu{��ڃ;��k��Դ=zǬ���ȟ���;h�V��߁&�,����z���N���w��ã��I�������zx}�����o�/�G���<��2��>^��N���w����l���;j��A��$��Q{��z���N�,����z���={G����5ȟ���;j��A��$��Q{���p8�`"ϲ���~}�Ys;���(|�g�=���^^��={G������;�?>ɳ�.�;��[�?>ɳw��Q�_ÓU�g�=������<{G�������k���v�Eu�Q�_�Ѫ۳w��Q�_���I�������zx��)��Q{�z|8<�`"ϲ��g��<{G������b���;j��Ay��ڃ����� ���(�=�C���'I~}�Ys;����D������z����v����v��o��3�����s�^��mV������1=�����G˭g��|����?[y8�t����g��v2�xX.$|�?���?�?�������O������e��':������z3N�O���?�n�|���ɬ� ��JM���2�q�SG��jb���'�ڃ';t��٬9����8�e�d��8���8٩#Nf�1NvꈓY�A����8�e�d��8���8٩#Nf�1NvꈓY�A����8�e�d��8���8٩#Nf�1NvꈓY�A����8�e�d��8���8١[��f�a���'3ڃ'+5q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ����'�x=Fq��8�Ś�8ٙ#Nf�1N6ꌓI]1NvꈓY�A���:�dV{�d��8���8Y���Q]1NvꈓY�A���:�dV{�d��8���8Y���Q]1NvꈓY�A���:�dV{�d��8���8Y�#NF��(Nv�'3Ys';s�Ɍ� ��Nq2�=�q�R'��b���'�ڃ';u�ɬ� ��Nq2�=�q�R'��b���'�ڃ';u�ɬ� ��Nq2�=�q�R'��b���'�ڃ';u�ɬ� ����d6k��dE�8ɞ�8ٙ#Nf�1NvꈓY�A���:�dV{�d�&NFu�8٩#Nf�1NvꈓY�A���:�dV{�d�&NFu�8٩#Nf�1NvꈓY�A���:�dV{�d��8��u�d��8���8٩#Nf�)Nv�'�Ys'+3q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ��Nq2�=�q�SG��jb���'�ڃ'+5q2�� ��Nq2�=Hq�C�8�͚�8ٙ#Nf�1NVj�dT�A���:�dV{�d��8���8٩#Nf�1NVj�dT�A���:�dV{�d��8���8٩#Nf�1NVj�dT�A���:�dV{�d��8���8٩#Nf�1NVj�dT�A�����l����q2�=�q�SG��jb����ɨ.�';u�ɬ� ��Nq2�=�q�SG��jb�l�'��b���'�ڃ';u�ɬ� ��Nq2�=�q�R'��b���'�ڃ';u�ɬ� ��Nq2�=Hq�BG��f�Q���-Nf��0Nv戓�A��!�5q2���\��8>�U����X��߾~��&oOli��H���_����~�J>�?m��p27����y�{ބ �2�\}���`����F���%���r��7`+r��ɚ��_+2�9�5�y�!S�Ysܖr��@���LWNd�qUn�D�D�&�FE9��cܓp�� ���LKNd�qInȄ�D�g�LENd�qC.ș��s�2�8�5���!�Ys��2�8�5�ݸ g6d�q4n�4�D��L0Nd�q.n���D��ₜ�8�=ǡ�!ӉYsX�qD�^�q"n��$��ႜy8�=�q�!ӆYs\�2a8�5�Y�!S�Ys܄r&�@��LNd�q n���D����L Nd�q.ș��s�2 8�5��!�Ys�2�7�5��� g� d�Q�m���&�j +�o��蛸�1N� ��Ě���>yɽ��e�coC��&���6dBo"k�3oC��&����L���9� ���Ț�ې����9N� ���Ț�[�3���8�6d�n"k��nC&�&��8�6djn"k[n!&���0�6��ɻ�ۀ��I�9N� ���Ț�~[�3���8�6d�m"k��mC&�&��8�6d�m"k��mA�dȞ�`ې鵉�9�� �X�Ț�Tې)���9�93m {�#mC��&���6dm"k�l#�:���1l���4��0ۀ�I�9�� �(�Ț�$ې)���9�9sl {�clC��&���6dBl"k�3lC��&����L���9� ���Ț��ڐ����9N� ��Ț���>yɮ��e��kC��&�游6d�k"ksk#�ښ��1n�8Sk{�CkC��&�渲6d"k"k�kC��&�港�̫��9�� ���Ț�ڐ ���9Ϊ ���Ț�Z�3���8�6dzj"k�kjC&�&��8�6dJj"k�;jAΌȞ�ڐi���9,��8j��8�6`�ik��iA�tȞ�pڐ馉�9�� �h�Ț�dڐ)���9�9si {�ciC��&�渔6dBi"k�3iC��&�渑�L���9� �>�Ț�:ڐ����9N� �2�Ț�.Z�3���0�6�h� ��"ڀ �I�9Ρ ��Ț�Z�3���8�6d:h"k�+hC&�&��8�6d +h"k�����%�'�9�� ���Ț��ِ ���9Ξ ��Ț��Y�3y��8x6dzg"k�kgC&v&��8u6dJg"k;g!&s��0r6�h�ɻ��ـ �I�9Λw;]U7Ӈ����g8��ͻ�wOǷ���?ޯ���v5||?�����9���������L��{�����/?�������_�����ÿ|w|������e�����h�?�7�[p�7��ݷ1��!����~����@�C�2�E�R��ڃ�(tT9h�w9�L��hr�c��携r����9�� :JM��jr���D:�� g:F���� �:JM��jr����:�� �:JM��jr�c��쐺r���d;�� �;JM��jr����;�� �;F���� <����0�Q�xP�9�x�����G����u�k�&�A�9�Qj�T{���&�A�9�1��zH]��Qj�T{�����A���QjT{���Ƈ�e�+�&�A�9�QjJT{�[�&�A�1�1hz2{�E��ɚ��G��~�A�~������Ǩ��!u��G��P�A�����H���P�A�:; R�A.�����H���P�A� ��$Ȩ� "u�*H�ɂP�A���2��6H�#B��02d� "{�!e&B�9Rj*!T{�;!�&B�92�l�H]�Rjr!T{��!��B��Rj�!T{��!��n��e��!�&B�9Rj�!T{��!�& B�9!�!u�H�ɈP�A�����ĖH�#&B��8'2��]�(Rj�"T{��"��*B��+Rj�"T{��"�ζ��e��"�&/B�90Rj +#T{�#�&2B�932��H]�4RjR#T{�c#��6B��7Rj�#T{��#����e��#�&;B�1<R�(�Ь9n�������Ȩ�?"u�I�I�P�A���� + ��I� �P�AN��:[$R�A���� �� I�)�P�An���( ��,ɨ�K"u�2I�I�P�A����: ��>I� �P�AN��:%R�A��:2%4k�C%e�TB��URjb%T{�s%��^��e��%�&YB�9ZRj�%T{��%�&\B�9]�]u�zI�ɗP�A���� ��I���P�AΘ�:;&R�A.���� ��I���P�A�� �Ĥɠi���9��9�&$k��&e�lB��m�oqT܄�c���>�M��c雎w����?��7�g�7�����O��i�M�����?�����wB���~�G��_�������WS�'�了���/���A��T�� ��ʨ�U�.���*��U�� ��J�yM�=�/�Rj�8T{��8��8��e��8�&�C�1�S��Ь9�㔙8��8Ψ3�#u�8N���P�A�㔚8��8N���P�A��:�8R�A�㔚8��8N���P�A�㔚8��8Ψ3�#u�8N���P�A�㔚8��8N���P�A��:�8R�A�㔹�q(^�a��ǡXs�)3q�=�q�P/q�� �qJM�jr���q�� �qJM�jrg�Ǒ�r���q�� �qJM�jr���q�� �qF�q�� �qJM�jr���q�� �qJM�jbg��qd��q�q�5�q�2�!ڃ�)5q�=�q�QgG�2�q�Rǡڃ�)5q�=�q�Rǡڃ�u�q�.��)5q�=�q�Rǡڃ�)5q�=�q�QgG�2�q�Rǡڃ�)5q�=�q�BG�f�ag��qD��q�L�hr���q�� �qJM�jrg�Ǒ�r���q�� �qJM�jr���q�� �qF�q�� �qJM�jr���q�� �qJM�jr'�K�:�q�Rǡڃ�)5q�=�q�BG�f�qg���r���q�� �qJM�jr���q�� �qF�q�� �qJM�jr���q�� �qJM�jrg�Ǒ�r���q�� �qJM�jr���q�� �qF�q�� �qJM�jb��ǡYs�)3q�=�q�QgG�2�q�Rǡڃ�)5q�=�q�Rǡڃ�u�q�.��)5q�=�q�Rǡڃ�)5q�=�q�QgG�2�q�Rǡڃ�)5q�=�q�Rǡڃ�u�q�.��)t�qh��q�L�hr���q�� �qF�q�� �qJM�jr���q�� �qJM�jr'�K�:�q�Rǡڃ�)5q�=�q�Rǡڃ�u�q�.��)5q�=�q�Rǡڃ�)5q�=�q�AǑ�s�)r�qH��q�L�hrGe����slq���8���q���w����g��=�O_�~:�����8n<�g.q������w����������@��x�HO�\�7��������>��|�>�n���s�g>h�g>�L�hr�cԙ���r��d>�� g>JM�jr��d>�� g>F���� g>JM�jr��d>�� g>JM�jr�cԙ���r��d>�� g>JM�jr��d>�� g>F���� e>��2��0�Q��|P�9�|������G����u�3�&�A�9�Qj2T{�3�&�A�9�1��|H]9�Qj2T{�3�&�A�9�Qj2T{�3��̇�e�3�&�A�9�Qj2T{�3�&�A�1�1h22{3E��ɚ��G��|�A�|������Ǩ3�!u��G��|P�A�|������G��|P�A�|�:3R�A�|������G��|P�A�|������Ǩ3�!u��G��|P�A�|������G�#�A��0�1d2"{�3e&�A�9�Qj2T{�3�&�A�9�1��|H]9�Qj2T{�3�&�A�9�Qj2T{�3��̇�e�3�&�A�9�Qj2T{�3�&�A�9��%�u��G��|P�A�|������G�#�A��8�1��|]9�Qj2T{�3�&�A�9�Qj2T{�3��̇�e�3�&�A�9�Qj2T{�3�&�A�9�1��|H]9�Qj2T{�3�&�A�9�Qj2T{�3��̇�e�3�&�A�1�Q��|Ь9�|������Ǩ3�!u��G��|P�A�|������G��|P�A�|�:3R�A�|������G��|P�A�|������Ǩ3�!u��G��|P�A�|������G��|P�A�|�:3R�A�|:24k�3e&�A�9�Qj2T{�3��̇�e�3�&�A�9�Qj2T{�3�&�A�9��%�u��G��|P�A�|������G��|P�A�|�:3R�A�|������G��|P�A�|������Ǡ�|��9�|92$k�3e&�A�9���ST惟c�|�>d>��c�|�d>?�zz��g<s�|�[�~�������������+i�8�����^�3ߑ�t�#���#���w$�ڃ��$��w$���;���x +��xJ�#�B��8�Rf�)D{��)��x��e��)�&�B�9�Rj�)T{��)�&�B�9�2ꌧH]9�Rj�)T{��)�&�B�9�Rj�)T{��)��x��e��)�&�B�9�Rj�)T{��)�&�B�9�2ꌧH])�R�O�x=��G<�b�q<���S�� �SB��S���O)5��=��RO�ڃO)5��=��Qg<E�2��RO�ڃO)5��=��RO�ڃOu�S�.�O)5��=��RO�ڃO)5��=��AO��sO)r�SH��S�L<�hr<���S�� �SF���� �SJM<�jr<���S�� �SJM<�jr<e�O��r<���S�� �SJM<�jr<���S�� �SF���� �SJM<�jr<���S�� �S +��5��!O�sO)3��=��RO�ڃO)5��=��Qg<E�2��RO�ڃO)5��=��RO�ڃOu�S�.�O)5��=��RO�ڃO)5��=��P/��� �SJM<�jr<���S�� �S +��5��1g<E�2��RO�ڃO)5��=��RO�ڃOu�S�.�O)5��=��RO�ڃO)5��=��Qg<E�2��RO�ڃO)5��=��RO�ڃOu�S�.�O)5��=��BG<�f�q<���S�� �SF���� �SJM<�jr<���S�� �SJM<�jr<e�O��r<���S�� �SJM<�jr<���S�� �SF���� �SJM<�jr<���S�� �SJM<�jr<e�O��b<��O�YsO)3��=��RO�ڃOu�S�.�O)5��=��RO�ڃO)5��=��P/��� �SJM<�jr<���S�� �SJM<�jr<e�O��r<���S�� �SJM<�jr<���S�� �SM<Ef�a<��O!YsO)3��=���~��)�[<u�1 ���_�������;���|�-�q��v�>�x&�l��idS������_����o?���O�?�Ï�����~9�7�����������x���_~��矶�����/?���_~������o&�>~Dr�����_w��_~F�P��(����������Q�ڃ�3 +�ΟQ����(���Q�ڃ�3 +��g�� ��B��gh�����=�?�Pf~F�h��(���Q�ڃ�3 +��g�� ��¨�g�.��3 +��g�� ��B���=�?�Pj~F�j��(�:FA�2�?�Pj~F�j��(���Q�ڃ�3 +��g�� ��B���Q����(���Q�ڃ�3 +��g�� ��B��gh����g�.��3 +��g�� ��B���=�?�Pj~F�j��(�:FA�2�?�Pj~F�j��(���Q�ڃ�3 +��g�� ��¨�g�.��3 +��g�� ��B���=�?�Pj~F�j��(�:FA�2�?�Pj~F�j��(:~F�f���(���Q ڃ�3 +�ΟQ����(���Q�ڃ�3 +��g�� ��B���=�?�0���� ��B���=�?�Pj~F�j��(���Q�ڃ�3 +�ΟQ����(���Q�ڃ�3 +��g�� ��B���=�?�0���� ��B��gh���B���=�?�Pj~F�j��(�:FA�2�?�Pj~F�j��(���Q�ڃ�3 +��g�� ��B���Q����(���Q�ڃ�3 +��g�� ��B���=�?�0���� ��B���=�?�Pj~F�j��(���Q�ڃ�3 +��gd���B��gH���B���=�?���,_��?��3���qz�����������t�s���~�_��O�������<�R�����_����{�^?���~����b��e��t�m�\�O����tx����?� s{�ڃ;����`���;j�o���G�n��Q{��~<<~�o�Qdz�.�;����j���;j�/�Ǐ�tY�۳w��Q�_�ǿGW����o_ |8 ONͳ���;��k�8V����;j����?Y�P�g�=������U�g�=x[=����7��gY]w����/�Ku{��ڃ;����0[u{��ڃ;����������n���������g]w��w�b���;j�����Q�۳w��Q����I�۳w�����_�I��YV����5<>Iu{��ڃ;��k8�?pƳw��Q�_ÃU�g�=��*����]�17�eu�QO��7��x��ڃ;�x7�R� T{�_6�Լl��Mu�l��e�_6�Լl�ėM(t�l͚�M(3/�@��eF�/� u�M(5/�@��eJ��&P�A~لR� T{�_6a��� R�A~لR� T{�_6�Լl��M(5/�@��eF�/� u�M(5/�@��eJ��&P�A~لR� T{�_6a��� R�Azل2��M�x=�/�P�x��5�/�Pf^6�h��&�zy��� �lB�y��=�/�Pj^6�j��&���M�ڃ�� �ΗM����&���M�ڃ�� ��e�� �lB�y��=�/�0�|��� �lB�y��=�/�Pj^6�j��&���M�ڃ�� ��ed��lB��eH��lB�y��=�/�Pj^6�j��&�:_6A�2�/�Pj^6�j��&���M�ڃ�� ��e�� �l¨�e�.��� ��e�� �lB����j���J�=�W�:�$�����J�=�W��+ �� ^IP踒�f��C�J�=�W��+ �� _IPj�$�ڃ|%A����j���+ �.�|%A����j���J�=�W��+ �� _I0꼒@�2�W��+ �� _IPj�$�ڃ|%A����j��^�$�����J�=�W��+ �� ^IP踒�f��c�+ �.�|%A����j���J�=�W��+ �� _I0꼒@�2�W��+ �� _IPj�$�ڃ|%A����j���+ �.�|%A����j���J�=�W��+ �� _I0꼒@�2�W��+ �� ^IP踒�f��e�J�=�W�:�$�����J�=�W��+ �� _IPj�$�ڃ|%���J�� _IPj�$�ڃ|%A����j���J�=�W�:�$�����J�=�W��+ �� _IPj�$�ڃ|%���J�� ^IP踒�f��e�J�=�W��+ �� _I0꼒@�2�W��+ �� _IPj�$�ڃ|%A����j��^�$�����J�=�W��+ �� _IPj�$�ڃ|%���J�� _IPj�$�ڃ|%A����j���J�=�W�+ d�^IP丒�d��e�J�=�W��u%?�v%��c����ϱ\I8������$�Gr#��`�����%����H���y�HBs�h㙫�����}9�5�u� g\�2�i�"GY�d�aW�ȑ�#Ys�+r4�H��LPNd�aN��Q�#Ysؒ+r��H���J�:r�ǰ"7`"r{rE��ɚ�~\�#G��0W�hǑ�9,� �p�Ȟ�l\��G��W�HƑ�9�9zq$kkqC&'��0W�(ő�9��92q$k#qE�Fɚ�Bܐ ĉ�9��9�p$k��p%ni8��c�+pt�(�V�LNd�a��Q�#Ys+r��H����-8�5�%�!��s��+rT�H�6�� 8�5��"G��d�a�m���D��ߊ�7�5�ݷ"G��d�a����|#YsX|2�7�=������]MQ뭴-�F�zCo��Ś��[�3�r���[���F���V�Ȼ��9��9�n$k�nC&�&��0�V䨺��9l�9�n$k�nE��ɚÚې����9L�9Jn$k;nE��ɚÈ[���F���6�� �1ʷ�����]�a����n�Xsn+rt�H�VۆL�Md�a���Ql#Ys�k+r��H��ڊ�6�5���!j�s�i+rT�H�6ڊ�6�5���"G��d�a�m���D��يe6�5�]�"G��d�Q��ĭ�F�z��l� ���[���F���V�H���9�9:l$k+lC&�&��0�V�(���9�9�k$k�kE��ɚ��ڐ ���9̮9�k$k�kE��ɚ��Z���F�氶䌭�\�0�V�(���9�92k$k�"k%n�5��cXX0�5�=�y�"G]�d�a[�ȑV#YsV+rt�H�VՆLTMd�aR��QT#Ys�S+r��H��Ԋ-5�5�%�!R�s�Q+rT�H�6Ԋ 5�5��"G?�d�a=m���D��ӊ�4�5Gݴ�l��1��8�ik�iC&�&��0�V䨥��9l�9Ri$kCiE�Nɚ�Jڐ����9L�9 +i$k�hE�<ɚ�8Z���F�氌6d�h"{�hE�*ɚ�&Z�#�F��0�V�衑�9�� ��Ȟ�Z�[ ���v� +4�5��"G�d�am��D��ϊ�3�5���"G��d�a����=#YsX=rF�@.s�<+r�H��Ί�3�5���"G�d�a�lȄ�D�fΊ�3�5���"G�d�a���7#YsT7q��������f��ǰkV�ȚQ�9���;]�4�����g8�����{�������7.��3I�O#i�����?���?�t���o������/���w���������2}������B��/���1v�7�f����9�7�h���:�7�j���:�7�j��敚�ͣ����:�7�j��杚c��� �Pj��ڃ|@�������|@�� +�j�]���0��=ȧ������ _0�<@�2����� �Pj��ڃx&@��N��5Ǘ�9O�����Z��=������� �Pjn�ڃ|5���l��� Pj.�ڃ|;@�9�j�����~��=��:O�������=�w��C�� �Pjn �ڃ|M������ Pj. +�ڃxS@����5�g����� _0�<-@�2������� �Pj�ڃ|b@��1�j���3�.�|h@��4�j������=����{�� _0�<9@�2�G����� �Pj�ڃ|z@��=�j������.�t�@�������k��(3w�A�D ��)P�A>F��\#@���Rs����J�MT{��u�% u��J�eT{�o(5� P�A>O���'@��B�Q�R�A>R��\)@��N�Rs����SJͭT{�4� +��9<X��q��ɚ����D{��(5wP�A�\`�y���e��(5�P�A�_��0@����Rs����+F�gH]���Rs����[J�1T{��(5�P�A�h`�yҀ�e��(5W P�A�k��6@��B�m4k�2� ��9>p��\8@��ƁRs����3J͝T{�/u�: u�cJ͵T{��(5P�A>y���<@���Q��R�A>|��\>@����Rs�����J��T{�/ �r�u�� (5WP�A����B@���B�-4k��!s�C t�J�ET{�o"(5GP�A>����E@��2�Q�iR�A>���\G@��>�Rs �� J͍T{��$u�I u�C JͥT{�o%(5�P�A>����K@��b�Q��R�A>���\M@��n�B��4k�O'(3��A��`�y>��e�((5P�A����Q@����RsG��K +F��H]���RsM��{ +J�AT{�O*(57P�A��`�yV��e�+(5�P�A����W@����Rs_��F�'H]�ȂBǕ4k��,(3��A>����Z@��ڂQ�R�A>���\\@���Rst��J��T{�//�rz�u��/(5�P�A����`@���Rs���+F�gH]��Rs���[J�1T{��1(5�P�A��`Мd ���(�"�U$k��2(3��A>�@��m��q�����?�_��������<�g��<��8��?���_�����ފ����e��_�����\���>]:��O���� ��rǯ�t��� w�JMǏjrǯ�t��� w�B�t������+5?�=��R��ڃ��+5?�=��Qg�O�2��R��ڃ��+5?�=��BGǏf�q�o����rǯ�t��� w�JMǏjrǯ�t��� w�F�?�� w�JMǏjrǯ�t��� w�JMǏjr�o���rǯ�t��� w�JMǏjrǯ�t��� w�F�?�� w�JMǏjbǯ���Ys��+3?�=��Qg�O�2��R��ڃ��+5?�=��R��ڃ��uv��.���+5?�=��R��ڃ��+5?�=��Qg�O�2��R��ڃ��+5?�=��R��ڃ��uv��.���+s��Q�Î_���G���Wf:~D{�;~�^:~P�A�������_���Q�A�������ߨ��'u�_���Q�A�������_���Q�A���:;~R�A�������_���Q�A������Ďߠ����9��9:~$k�;~e��G���Wj:~T{�;~�Ύ��e�;~���G���Wj:~T{�;~���G���7���I]��Wj:~T{�;~���G���Wj:~T{�;~�Ύ��e�;~���G���Wj:~T{;~���͚Îߐ����9�������_���Q�A�������ߨ��'u�_���Q�A�������_���Q�A���:;~R�A�������_���Q�A�������_����u�;~���G���Wj:~T{;~���͚�ߘ��'t�_���Q�A�������_���Q�A���:;~R�A�������_���Q�A�������ߨ��'u�_���Q�A�������_���Q�A���:;~R�A������Ď_���G���Wf:~D{�;~�Ύ��e�;~���G���Wj:~T{�;~���G���7���I]��Wj:~T{�;~���G���Wj:~T{�;~�Ύ��e�;~���G���Wj:~T{�;~���G���7���I]��W���Ѭ9�������_���Q�A���:;~R�A�������_���Q�A�������_����u�;~���G���Wj:~T{�;~���G���7���I]��Wj:~T{�;~���G���Wj:~T{;~���'���W�����9������䎟�t�����:���������N�:��:/_������@�<�U�i��������?��?}*�O���s�^�����i/�:�^���g�?�����t�h�>���G�5�C�����ܞ������vx�����o�����7[Fϲ���o��o~+u{��ڃ;��k8Zu{��ڃ;��k��͖R�g�=x[}9N�ۨ�YV���tx{�����wԗ��U�s�x��ڃ;�����??�P�g�=x[}= �Rϲ�����7[Jݞ�����z�>��R�g�=�����G�n��Q{��v��? o���s;��;8�?pƳw��Q����U�g�=���kAJ��!T{��u�"u��CJ��!T{��)5�P�A>?�ԜB����P/�@]���Rs~���CJ��!T{��)5�P�A>?d�y~��e��)5�P�A>?�ԜB����B��!4k��s�"t��CJ��!T{��)5�P�A>?�ԜB����Q��!R�A>?�ԜB����Rs~���CJ��!T{��u�"u��CJ��!T{��)5�P�A>?�ԜB����Q��!R�A>?�ԜB����B��!4k��)3��A>?d�y~��e��)5�P�A>?�ԜB����Rs~���CF��H]���Rs~���CJ��!T{��)5�P�A>?d�y~��e��)5�P�A>?�ԜB����Rs~���CF��H]���2��C(^���!��C(��Rf�!ڃ|~H���C���|~H�9?�j��!����=�燔��C�� �2�<?D�2�燔��C�� �Rj��ڃ|~H�9?�j��!���C�.�|~H�9?�j��!����=�燔��C�� �2h���sx~H����5�燔��C�� �Rj��ڃ|~Ȩ���� �Rj��ڃ|~H�9?�j��!����=�燌:�����!����=�燔��C�� �Rj��ڃ|~Ȩ���� �Rj��ڃ|~H�9?�j��!���Ch��2d��s|~H�9?�h��!����=�燔��C�� �2�<?D�2�燔��C�� �Rj��ڃ|~H�9?�j��!���C�.�|~H�9?�j��!����=�燔��C�� ������ �Rj��ڃ|~H�9?�j��!���Ch��2�<?D�2�燔��C�� �Rj��ڃ|~H�9?�j��!���C�.�|~H�9?�j��!����=�燔��C�� �2�<?D�2�燔��C�� �Rj��ڃ|~H�9?�j��!���C�.�|~H�9?�j��!���Ch��Rf�!ڃ|~Ȩ���� �Rj��ڃ|~H�9?�j��!����=�燌:�����!����=�燔��C�� �Rj��ڃ|~Ȩ���� �Rj��ڃ|~H�9?�j��!����=�燌:�����!���Ch��Rf�!ڃ|~H�9?�j��!���C�.�|~H�9?�j��!����=�燔��C�� ������ �Rj��ڃ|~H�9?�j��!����=�燌:�����!����=�燔��C�� �Rj��ڃx~Ƞ9?Df���!E��CH��Rf�!ڃ|~h���:?��c;?t�1�v������#�:�=�=�����v~�y��o���ۿ�������ǫ���_����������q;�r�?��|=�������gpy�������KT{��K�&�D�9�4�.I]9�Tj�KT{��K�&�D�9�Tj�KT{��K�����e��K�&�D�9�Tj�KT{��K�&�D�9�4�.I]9�Tj�KT{�K���͚��R� .�A.�:�KR�A.������R� .Q�A.������Ҩ3�$u��R� .Q�A.������R� .Q�A.�:�KR�A.������R� .Q�A.������Ҩ3�$u��R�[p���� +�%�5���2\"ڃ\ +�\��rp����� �JMp�jrp����� �F��%�� �JMp�jrp����� �JMp�jrpi�\��rp����� �JMp�jrp����� �MpIf�ap��\"Ys\*3�%�=���R\�ڃ\u��.�\*5�%�=���R\�ڃ\*5�%�=���QgpI�2���R\�ڃ\*5�%�=���R\�ڃ\u��.�\*5�%�=���R\�ڃ\*t�h���LpId�qp����� �JMp�jrp����� �F��%�� �JMp�jrp����� �JMp�jrpi�\��rp����� �JMp�jrp����� �B�����\*5�%�=���R\�ڃ\*t�h��Ɯ�%�� �JMp�jrp����� �JMp�jrpi�\��rp����� �JMp�jrp����� �F��%�� �JMp�jrp����� �JMp�jrpi�\��rp����� � +�%�5���2\"ڃ\u��.�\*5�%�=���R\�ڃ\*5�%�=���QgpI�2���R\�ڃ\*5�%�=���R\�ڃ\u��.�\*5�%�=���R\�ڃ\*5�%�=���QgpI�2���BGp�f�qp����� �JMp�jrpi�\��rp����� �JMp�jrp����� �B�����\*5�%�=���R\�ڃ\*5�%�=���QgpI�2���R\�ڃ\*5�%�=���R\�ڃ\4�%�=���"Gp�d�qp����� �� ��?�\^}���np��9������������-�|����������������_*}��.��Q��������h���e�W�s�eџ?�,��E+5/�F��e�F�/�&u�E+5/�F��e�J�ˢQ�A~Y�R�hT{�_-��ˢA]�e�J�ˢQ�A~Y�R�hT{�_�Լ,��Eu�,��e�_�Լ,��E+5/�F��e� +/�F���e�Ɯ/�&t�E+5�P�A�]���.@��v�Rs�����F��H]�v�Rs�����J��T{�o(5�P�A�]`�y���e�o(5�P�A�]���.@��v�Rs�����F��H]�v�Rs����� +�Ь9�]���.@��v�Q��R�A�]���.@��v�Rs�����J��T{�ou�. u��J��T{�o(5�P�A�]���.@��v�Q��R�A�]���.@��v�Rs�����J��T{�ou�. u����n�x=��8n�Xs|�@��]�h���^n������v�=ȷ����� �.Pjn�ڃ|����v�� �.Pjn�ڃ|�@��]�j����v�=ȷ�:o������v�=ȷ����� �.Pjn�ڃx����]@f���E��H��.Pfn ڃ|�@��]�j������.�|�@��]�j����v�=ȷ����� �.0�]@�2ȷ����� �.Pjn�ڃ|�@��]�j������.�|�@��]�j����v�=��:n�Ysx����]@d���e�v�=ȷ����� �.Pjn�ڃ|����v�� �.Pjn�ڃ|�@��]�j����v�=ȷ�:o������v�=ȷ����� �.Pjn�ڃ|�@������|�@��]�j����v�=��:n�Ys|����v�� �.Pjn�ڃ|�@��]�j����v�=ȷ�:o������v�=ȷ����� �.Pjn�ڃ|����v�� �.Pjn�ڃ|�@��]�j����v�=ȷ�:o������v�=��:n�Ys|�@��]�h������.�|�@��]�j����v�=ȷ����� �.0�]@�2ȷ����� �.Pjn�ڃ|�@��]�j������.�|�@��]�j����v�=ȷ����� �.0�]@�2��:n�Ys|�@��]�h����v�=ȷ�:o������v�=ȷ����� �.Pjn�ڃ|�@������|�@��]�j����v�=ȷ����� �.0�]@�2ȷ����� �.Pjn�ڃ|�@��]�j����v�=��9n Ys|�@��]�h���_�.�ϱ�.��p�`�s����vx��G /�>����������vQ=�3�^p�~�������������/�~n�_�����|>]���{�`f��!�}_}��������u��o�&�F�9�Vj�oT{��o�&�F�9�6�̾I]9�Vj�oT{��o�&�F�1�V�ȾѬ9ξ�9�oB�Aξ������[�ɾQ�Aξ������ۨ3�&u��[�ɾQ�Aξ������[�ɾQ�Aξ�:�oR�Aξ������[�ɾQ�Aξ������ۨ3�&u��[�ɾQ�A̾:�o4k��oe&�F�9�6�̾I]9�Vj�oT{��o�&�F�9�Vj�oT{��o����e��o�&�F�9�Vj�oT{��o�&�F�9�6�̾I]9�Vj�oT{��o�&�F�9�Vj�oT{��o����e��oen�7��c�}+pd�(�g��L��hr�-�K� �:�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ufߤ.��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQg�M�2�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}4�7�=�ٷ"G��d�q���d߈� g�JM��jr�mԙ}��r���dߨ� g�JM��jr���dߨ� g�F��7�� g�JM��jr���dߨ� g�JM��jr�mԙ}��r���dߨ� g�JM��jb��Б}�Ys�}2�7�=�ٷ2�}#ڃ�}+5�7�=�ٷR�}�ڃ�}ufߤ.��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQg�M�2�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}��}��r���dߨ� g�JM��jb��Б}�Ys�}sf߄.��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQg�M�2�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}ufߤ.��}+5�7�=�ٷR�}�ڃ�}+5�7�=�ٷQg�M�2�ٷR�}�ڃ�}+td�h�g��L��hr�mԙ}��r���dߨ� g�JM��jr���dߨ� g�F��7�� g�JM��jr���dߨ� g�JM��jr�mԙ}��r���dߨ� g�JM��jr���dߨ� g�F��7�� f� +�7�5�ٷ2�}#ڃ�}+5�7�=�ٷQg�M�2�ٷR�}�ڃ�}+5�7�=�ٷR�}�ڃ�}��}��r���dߨ� g�JM��jr���dߨ� g�F��7�� g�JM��jr���dߨ� g�JM��jb�m�d�d�fߊ�7�5�ٷ2�}#ڃ�}��*��ϱe�W��q7���K�}���飚>a�=I��8�����?��O���_�/�\f?wޯ��^���v�������3W��ƫ⏇��q�E�_�D��v����xt��(�5�C�N��e��v����]�e�e��v� <<���ݐ�Q${n�<^_%�=�d����W�����Q&kn�%(r_@���� �� �9����qvɚã�7��9����qpɚ�s�̵"{o-(r�Z@���Ђ"ǝ$k��,(q;�����X0`.,��sx_A���5��9n+ YsxYA���5�g�� +D��TP�8��d��AE�{ +H�^SP�8��d��)C��=�w9�( YsxDA���5�9( Ysx>����@d���E�� H�NP�v7��1����q4ŚÓ ���"{�%(r�K@���X�"ǭ$k/%(rJ@���L�!s%�Ȟ� �'��9<���qɚ������9<�`�\F ���.�"�Y$k�"(r�D@���"�"�A$k�!2���9����������CJ�� w=�W8� �XsxA�����?P�8�d���E��H�^>P�8|�d���C���=�79N Ysx�@����5��9� Ysx����t@d��E�3H�9P�q�d��E�H��70�n@`��m�m� л�� +w P�9�j��q��ɚÓ��E"{�(r�3@���"�-$k/(r2@�����!sŀȞ��'��9<`��q��ɚ������9<]`�\. ���n�"��$k�(r�,@���b���^�ѹ�k���*P�8U�b��E�;H�^)P�8R�d��C�B�=�� 9� Ysx�@��6�5�� 9 Ysx����J@d��ME��H�$P�G�d��5E�cH��"�D��2�w9� Ysx�@���5G�� @�z�0�H�9�=��qz�ɚ���w��9�:��qt�ɚÓ���"{� (r�@���"ǭ$k/ (r@���̀!se�Ȟ��'��9<0��q_�ɚ������9<-`�\ ���"�Y$k�� +(q�)���^P�8(�b��9C���=��9N YsxH@����5�W9� YsxB��� @d����E��H�P��d����E��H�� 0d��sx3@��d��5�9� Ysx-@��X��5���KD�� P�v&���1<��q#�Ś����9<`�\ ���6�"�i�$k(r�@���*�"�Q�$kOr^�r��{������9<��q�ɚ�K������9<`�\ ����"� �$k�(r��H�����?�5G�G�O`�Q���-�G�z���Ś���d7�?~���\}����C�u/y����f��<���4z�����������?����~�������t:~s�|�����,n�U�M#|�D�W�r�j��1 k$t�Q�)Q�An�����Q��Q�A.�:GR�A�������Q� Q�AN������Ѩ3w$u��Q�)Q�An������Q��Q�A.�:�GR�A�������Q�#�D��8�TfHD{�+H����e�CH���D���TjbHT{�sH���D���4�L"I]9�Tj�HT{��H�&�D�9�Tj�HT{��H��<��e�I���D���Tj"IT{�3I���D���4�L%I])�T�VK�x=���G0�b�q2��4��� W�B�d����N*5�$�=���RO�ڃ�O*5�$�=��QgBI�2��RSQ�ڃ�Q*5!%�=�)�R�R�ڃ\Su攤.�T*5E%�=�M�RU�ڃ�U*5]%�=�e�A�V��sW*rԕH����L`�hrb��4��� W�F��%�� ��JMi�jrk��Ė�� �JMo�jrqiԙ\��rt��T��� w�JMx�jrz�Դ��� חF��%�� �JM��jr���D��� f� +&�5�%�!�b�sc*35&�=�=�Rd�ڃ�d*5M&�=�U�Qg�I�2�a�RSf�ڃ�f*5q&�=�y�R�g�ڃ\hu&��.�i*5�&�=ȝ�Rj�ڃ�j*5�&�=ȵ�P/�&�� �JM��jr���D��� f� +�&�5��1g�I�2��RSo�ڃ�o*5'�=� �R�p�ڃ\quf��.�r*5%'�=�-�Rs�ڃ�s*5='�=�E�Qg�I�2�Q�RSu�ڃ�u*5a'�=�i�R�v�ڃ\wu杤.�x*5�'�=���BG�f�q��t��� ��F��'�� ǞJM�jr����� '�JM�jr�iԙ}��r��Ԕ��� ��JM��jr������� �F� (�� G�JM�jr�Ԅ��� ��JM�jr jԙ���b��Q��Ys܄*3Q(�=�Y�RӅ�ڃ\�u���.��*5u(�=�}�R��ڃ��*5�(�=ȕ�P/�(�� ��JM)�jr+��Ģ�� �JM/�jr1jԙ���r4��T��� w�JM8�jr:�Դ��� ֣M>Jf�a@��Q�"Ysܐ*3)�=�)��#�ϱ��W��[����������v����g��>��������������O?���w|���_f[�ï�n������w�o������|�=�������q�3�ڹ�?����?������e�S�&�A�9�QjRT{�S�&�A�9�1�LaH]9�QjRT{�S�&�A�9�QjRT{�S����e�S�&�A�9�QjRT{�S�&�A�9�1�LaH])�Q� x=�)�G +�b�q +�̤0�� �0B��0�����(5)�=�)�R� ڃ��(5)�=�)�Qg +C�2�)�R� ڃ��(5)�=�)�R� ڃ��u�0�.���(5)�=�)�R� ڃ��(5)�=�)�A��s��(r�0H��0�L +�hr +�Ԥ0�� �0F�)�� �0JM +�jr +�Ԥ0�� �0JM +�jr +cԙ�r +�Ԥ0�� �0JM +�jr +�Ԥ0�� �0F�)�� �0JM +�jr +�Ԥ0�� �0 +)�5�)�!���s��(3)�=�)�R� ڃ��(5)�=�)�Qg +C�2�)�R� ڃ��(5)�=�)�R� ڃ��u�0�.���(5)�=�)�R� ڃ��(5)�=�)�P/)�� �0JM +�jr +�Ԥ0�� �0 +)�5�)�1g +C�2�)�R� ڃ��(5)�=�)�R� ڃ��u�0�.���(5)�=�)�R� ڃ��(5)�=�)�Qg +C�2�)�R� ڃ��(5)�=�)�R� ڃ��u�0�.���(5)�=�)�BG +�f�q +�̤0�� �0F�)�� �0JM +�jr +�Ԥ0�� �0JM +�jr +cԙ�r +�Ԥ0�� �0JM +�jr +�Ԥ0�� �0F�)�� �0JM +�jr +�Ԥ0�� �0JM +�jr +cԙ�b +�Б Ys��(3)�=�)�R� ڃ��u�0�.���(5)�=�)�R� ڃ��(5)�=�)�P/)�� �0JM +�jr +�Ԥ0�� �0JM +�jr +cԙ�r +�Ԥ0�� �0JM +�jr +�Ԥ0�� �0M +Cf�a +�ȑ� Ys��(3)�=�)%"��ϱ�0WR�������>��)�U�������=��^�o~��L�B�ב����ׇo�˿���/?���_�������/?���痫}����\y���=���\�xx|x�ϛ��?��_O��v��P�g�=�����՛U�g�=��n��S�x{�5�o�3�|{�� ��N�y{�=�o�Sj�^�j��딚�סڃ��:�ηב���딚�סڃ��:���u�� ��N�y{�=�o�3�|{�� ��N�y{�=�o�Sj�^�j��딚�סڃ��:�ηב���딚�סڃ��:���סYs��:e��u�� '�F��.�� '�JM��jr���$��� '�JM��jr�kԙ쒺r���$��� '�JM��jr���$��� '�F��.�� '�JM��jr���$��� '�JM��jr�kԙ쒺R���-�E�z�]�dŚ�dW�Iv�ANv�zIvA]9�Uj�]T{��]�&�E�9�Uj�]T{��]��d��e��]�&�E�9�Uj�]T{��]�&�E�9�5�LvI]9�Uj�]T{��]�&�E�9�Uj�]T{�]�&�%��0�U�Hv��9Nv��d��dW�IvQ�ANv�:�]R�ANv��d��dW�IvQ�ANv��d��dר3�%u�dW�IvQ�ANv��d��dW�IvQ�ANv�:�]R�ANv��d��dW�IvQ�ALv:�]4k�]C&�%��8�Uf�]D{��]�&�E�9�Uj�]T{��]��d��e��]�&�E�9�Uj�]T{��]�&�E�9�5�LvI]9�Uj�]T{��]�&�E�9�Uj�]T{��]�^�]P�ANv��d��dW�IvQ�ALv:�]4k��]c�d��e��]�&�E�9�Uj�]T{��]�&�E�9�5�LvI]9�Uj�]T{��]�&�E�9�Uj�]T{��]��d��e��]�&�E�9�Uj�]T{��]�&�E�9�5�LvI]9�Uj�]T{�]��d͚�dW�Iv�ANv�:�]R�ANv��d��dW�IvQ�ANv��d��dר3�%u�dW�IvQ�ANv��d��dW�IvQ�ANv�:�]R�ANv��d��dW�IvQ�ANv��d��dר3�%u�dW�#�E��8�Uf�]D{��]�&�E�9�5�LvI]9�Uj�]T{��]�&�E�9�Uj�]T{��]�^�]P�ANv��d��dW�IvQ�ANv��d��dר3�%u�dW�IvQ�ANv��d��dW�IvQ�ALv �d�̞�dW�#�E��8�Uf�]D{��]JNE���cKv�>���n���9�ʷ�=�����u�D�Ǽ��_����W_~�����?~Y?���'����0]�������q�/�������?��O:�����������w>�����o���xx|rj�Eu�QO��ӋT�g�=������W�n��Q{pG= G�n��Q{p����QgqN�2�ŹRS��ڃ\�+5�9�=�ŹBGq�f�qqn�Y��rq���� �JMq�jrq���� �F��9�� �JMq�jrq���� �JMq�jrqn�Y���rq���� �JMq�jrq���� �F��9�� �JMq�jbq��Q��Ys\�+3�9�=�ŹQgqN�2�ŹRS��ڃ\�+5�9�=�ŹRS��ڃ\�u�.�\�+5�9�=�ŹRS��ڃ\�+5�9�=�ŹQgqN�2�ŹRS��ڃ\�+5�9�=�ŹRS��ڃ\�u�.�T�+s+�Q���\��8G��8Wf�sD{��s�^�sP�A.Ε�����\�)�Q�A.Ε�����ܨ�8'u��\�)�Q�A.Ε�����\�)�Q�A.:�sR�A.Ε�����\�)�Q�A.Ε�����ܠ)���9,�9�s$k��se�8G��8Wj�sT{��s����e��s��8G��8Wj�sT{��s��8G��87�,�I]�8Wj�sT{��s��8G��8Wj�sT{��s����e��s��8G��8Wj�sT{�s���͚��ܐ)Ή�9.Ε�����\�)�Q�A.Ε�����ܨ�8'u��\�)�Q�A.Ε�����\�)�Q�A.:�sR�A.Ε�����\�)�Q�A.Ε�����\����u��s��8G��8Wj�sT{�s���͚��ܘ�8't��\�)�Q�A.Ε�����\�)�Q�A.:�sR�A.Ε�����\�)�Q�A.Ε�����ܨ�8'u��\�)�Q�A.Ε�����\�)�Q�A.:�sR�A.Ε�����\��8G��8Wf�sD{��s����e��s��8G��8Wj�sT{��s��8G��87�,�I]�8Wj�sT{��s��8G��8Wj�sT{��s����e��s��8G��8Wj�sT{��s��8G��87�,�I]�8W�(�Ѭ9.Ε�����\�)�Q�A.:�sR�A.Ε�����\�)�Q�A.Ε�����\����u��s��8G��8Wj�sT{��s��8G��87�,�I]�8Wj�sT{��s��8G��8Wj�sT{�s��8'��8W�(Α�9.Ε����✲iQ���؊������+������z��|<���q�����=>����跇o���O���V������3����Pw�=2��0��� �� �=� �R���ڃ��)5 �=� �QgBF�2� �R���ڃ��)t$dh�'d�LB�hrBfԙ���rB��$d�� 'dJMB�jrB��$d�� 'dF� �� 'dJMB�jrB��$d�� 'dJMB�jrBfԙ���rB��$d�� 'dJMB�jrB��$d�� 'dF� �� %d��2��0!S�H�P�9NȔ����L����u�2�&!C�9!Sj2T{�2�&!C�9!3�L�H]9!Sj2T{�2�&!C�9!Sj2T{�2�΄��e�2�&!C�9!Sj2T{�2�&!C�1!3h22{2E��ɚ�L�I��ANȔ����̨3!#u�L�I�P�ANȔ����L�I�P�ANȌ:2R�ANȔ����L�I�P�ANȔ����̨3!#u�L�I�P�ANȔ���ĄL�#!C��0!3d2"{�2e&!C�9!Sj2T{�2�&!C�9!3�L�H]9!Sj2T{�2�&!C�9!Sj2T{�2�΄��e�2�&!C�9!Sj2T{�2�&!C�9!�%!u�L�I�P�ANȔ���ĄL�#!C��8!3�L�]9!Sj2T{�2�&!C�9!Sj2T{�2�΄��e�2�&!C�9!Sj2T{�2�&!C�9!3�L�H]9!Sj2T{�2�&!C�9!Sj2T{�2�΄��e�2�&!C�1!S�H�Ь9NȔ����̨3!#u�L�I�P�ANȔ����L�I�P�ANȌ:2R�ANȔ����L�I�P�ANȔ����̨3!#u�L�I�P�ANȔ����L�I�P�ANȌ:2R�AL�:24k�2e&!C�9!Sj2T{�2�΄��e�2�&!C�9!Sj2T{�2�&!C�9!�%!u�L�I�P�ANȔ����L�I�P�ANȌ:2R�ANȔ����L�I�P�ANȔ���Ą̠I���9L�92$k�2e&!C�9!ۯ�TB��cKȮ>���nB��9����NB��U���g���������_�;>��/��˯�^|x�����܋=���by-!|������ǀ���k ����ڃ�ZB�浄�� ��P�y-!�=ȯ%4�|-!�� ��P�y-!�=ȯ%Tj^K�j�k ����ڃ�ZB�Φ��e��R��)E��)Uj�RT{��R��)E��)5�lJI]�)Uj�RT{�R���͚�T�iJ�AnJ�:�RR�AnJ�����T�iJQ�AnJ�����Ԩ�)%u�T�iJQ�AnJ�����T�iJQ�AnJ�:�RR�AnJ�����T�iJQ�AnJ�����Ԩ�)%u��T�[S���6� +M)�5�M�2Ӕ"ڃܔ +�Ҕ��rS��4��� 7�JMS�jrS��4��� 7�F�M)�� 7�JMS�jrS��4��� 7�JMS�jrSj�ٔ��rS��4��� 7�JMS�jrS��4��� 6�MSJf�aS��є"Ysܔ*3M)�=�M�RӔ�ڃܔu6��.�ܔ*5M)�=�M�RӔ�ڃܔ*5M)�=�M�QgSJ�2�M�RӔ�ڃܔ*5M)�=�M�RӔ�ڃܔu6��.�ܔ*5M)�=�M�RӔ�ڃؔ*t4�h�6��LSJd�qS��4��� 7�JMS�jrS��4��� 7�F�M)�� 7�JMS�jrS��4��� 7�JMS�jrSj�ٔ��rS��4��� 7�JMS�jrS��4��� 7�B�4����ܔ*5M)�=�M�RӔ�ڃؔ*t4�h�7�ƜM)�� 7�JMS�jrS��4��� 7�JMS�jrSj�ٔ��rS��4��� 7�JMS�jrS��4��� 7�F�M)�� 7�JMS�jrS��4��� 7�JMS�jrSj�ٔ��rS��4��� 6� +M)�5�M�2Ӕ"ڃܔu6��.�ܔ*5M)�=�M�RӔ�ڃܔ*5M)�=�M�QgSJ�2�M�RӔ�ڃܔ*5M)�=�M�RӔ�ڃܔu6��.�ܔ*5M)�=�M�RӔ�ڃܔ*5M)�=�M�QgSJ�2�M�BGS�f�qS��4��� 7�JMS�jrSj�ٔ��rS��4��� 7�JMS�jrS��4��� 7�B�4����ܔ*5M)�=�M�RӔ�ڃܔ*5M)�=�M�QgSJ�2�M�RӔ�ڃܔ*5M)�=�M�RӔ�ڃؔ4M)�=�M�"GS�d�qS��4��� 7��E�jJ�slM���xz�mJ�?�_�Z���I��H�ҧQ���G?��/_~��o����Ǘ�ǟ9S���^S:���<����o?} +H��9 ��Ț��А���9N ��Ț��P�37��864dZC"k�KCC&4$��834d*C"k�CA��Ȟ��А���9��8�B��8-4`�Bk��BAάȞ�Аi +��9. + ���Ț�А� ��9n 9SB {�CBC�#$��"4d"B"k�BC� $������9� �v�Ț�rА ��9� �j�Ț�fP�3�Tvw=re���J� y���|�%����60@Z�KD�X����'�g��v�y���:^��JYUE��:G�An}A�.��-h�Q$�2���LS�Ċ��u�\�'�8. 2A"+���LA�Ȋ�z�!�$��(�Y ��h����8n2�@"+�+��L#�Ȋ�>� gȎ�2�!�$�� h���8�2-@"+;�BL� +���F����0n�0�?+���L�Ȋ�ޟ g�Ȏ�ҟ!��#���g����8��2m?"+��~��U? ;��~�LϏȊ㖟!S�#���g�4���8�� r����8.�2�>"+��}�L��Ȋ�Z�G����0�� /�>�*�}L��Ċ�6�!S�#���g�4���8�� r����8.�2>"+�|�L��Ȋ���!��#�⸻'�Y��㸸g�����8n�2�="+�+{�Lc�Ȋ��u�\��'�8.�2]="+��z�LQ�ȊÚ�GK���0�� pV�@�8.�2�<"+��y�L9�Ȋ�j�!��#�⸗'�Y��㸔g�t�8n�2�<"+��x�L�Ȋ�.� gȎ�"�!��#�⸅gȔ���8��2 <"+��w���; ;��w�L��Ȋ��G���0��0�;+�;w���; ;�w�LߎȊ㶝!S�#��jg�4투8�� r���8.�2;"+�v�L��Ȋ�z�!Ӯ#��['�Y���Xg��ꈬ8n�2�:"+�+u�L��Ȋ�>� g�Ȏ�2�G����0n�0E:+�kt�L��Ȋ�� g�Ȏ��!ӟ#��=gȔ爬8��2�9"+�{s��smn�\�4g�t戬8n�2�9"+��r�L[�Ȋ㮜 gUȎ㢜!ӓ#��%gȔ䈬8��2 9"+�qBL=� +�r��F7���0n�0�8+�kq��.Պ���Jq�w�N��K��>����"O�G��<�R��(����/������߾~�������o?���_~�������w�n��_��������㫌���������ûo����/?����O���������ˮ����ot����S����_���/���j⽃S����'J���K ^=8u�=�ځx���q��j��C��6+��9���8��p�8�`��©� +���;��CV;O!��[T�@��p�8�`�� ©�"��ě���V;�"���T�@��p�8�`��8©�:������ V;O$�:o$H]�J©�L���C ��K V;�n%�K�Yqx.���K ��ńS����GNW�v �M8uN�ځx:���N�����S����N�v �P8uQ�ځxF���Q���%�S�)���N��v �S8uT�ځxR���T���U�S�Y�H��.+ج8��p�8�`��B���@u ���V;�,�:�,X�@��p�8�`���B���@u �k��sV;.�:..X�@��p�8�`���B���@u �����V;�/�:�/X�@��p�8�`��C���@u �+�nglVb8s\b0ځx���q��j�9�Rs����N'�v e8u\e�ځx���q��j�i�Q�m�k ^g8u�g�ځx���q��j⍆SǑ��gJ͝�K ^j8u�j�ځx���q��j⽆S���H' +7hv]m8r;�`���pÙ�r���� � 0��?��|����� x��?p��;�0i|�?���_6ݞ�R��9�x&�l�Ϲ����/?�3�����/��}���������y|��??~�߾ڼ9<�����'��o�v֍3iJ/��.�~w���_5e�i�ԡ۰)��Ӧ�ۦ�v ��*5�.�8p�Աp�j�ƩS��)��3�N;��v .�*5S��.�8v�Աv�j�ީS��)����N���v ��*5���.�8|�Ա|�j���S��)���N���v .�*5��.�0���+�,^����!T+�P�9�P�@\C5�C%u �AT��ETV;7Q�:FQY�@�Eu��Ee�qU��FEu �qT��uTV;�Q�:RY�@�Hu��He�q%U��IEu ġT���TV;�R�:�RY�@�Ku��Ke�i1U�c2͎��TGn��LV�:s�2ځ8��Ա��j�z�R3�����N��v n�:u���ځ8��Ա��j⒪R3����c�NM��䊑RS1B��b��T�P�@�uV�H]�b��T�P�@�)5#T;+F +#4++F�LňȎ㊑2S1B��b��T�P�@�)5#T;�+FF�#R�@�)5#T;�+FJM��䊑RS1B��bd�Y1"u 䊑RS1B��b��T�P�@�)5#T;�+FB=W�@]�b��T�P�@�)5#T;+F +#4+�+FƜ#B�@�)5#T;�+FJM��䊑RS1B��bd�Y1"u 䊑RS1B��b��T�P�@�)5#T;�+FF�#R�@�)5#T;�+FJM��䊑RS1B��bd�Y1"u 䊑RS1B��b��Q1B��b��T��@�uV�H]�b��T�P�@�)5#T;�+FJM��䊑Qgň�%�+FJM��䊑RS1B��b��T�P�@�uV�H]�b��T�P�@�)5#T;�+FJM��䊑Qgň�%+F +#4+�+F�L��䊑RS1B��bd�Y1"u 䊑RS1B��b��T�P�@�)5#T;�+FB=W�@]�b��T�P�@�)5#T;�+FJM��䊑Qgň�%�+FJM��䊑RS1B��b��T�P�@�4#2;+F�#$+�+F�L����bD��c�]�T���c��r�������b4�*FF������4�a��%�����ۇw����?|����o����̽�?ܽ\c���Ϸ�{�����Ǽ-�|�|��'§?�/�}�"o�۳W�|[�;�wRϲ��w��ӟS�n�^Q;pG=�^�����+jÍU�g����z<�|xt�x��%pG�;<���W�۳W��Q7OVݞ��v���|xx|�����w�y��h�Y$u ���RSD�����QD�������@�?u�I]�����Q�@�?*5�GT;��JM�����Qg���%��JM�����RSD������Q�@�?u�I]�����Q�@�?*5�GT;��JM�����Qg���%�����(^�a�Q����b�q�Q��?"ځ\�����G����jr�Q��?�ځ\Tjꏨv ��:돤.�\Tjꏨv ����#���G����jr�Ѩ��H���G����jr�Q��?�ځ\Tjꏨv � ��#���GE��#���Ge���hr�Q��?�ځ\4�?��r�Q��?�ځ\Tjꏨv ����#���G���#�K ����#���G����jr�Q��?�ځ\4�?��r�Q��?�ځ\Tjꏨv �:�hV� ��#���Ge���hr�Q��?�ځ\Tjꏨv ��:돤.�\Tjꏨv ����#���G����jr�Ѩ��H���G����jr�Q��?�ځ\Tjꏨv ��z�?��r�Q��?�ځ\Tjꏨv �:�hV��9도.�\Tjꏨv ����#���G����jr�Ѩ��H���G����jr�Q��?�ځ\Tjꏨv ��:돤.�\Tjꏨv ����#���G����jr�Ѩ��H���G����jb�Q����f�q�Q��?"ځ\4�?��r�Q��?�ځ\Tjꏨv ����#���G���#�K ����#���G����jr�Q��?�ځ\4�?��r�Q��?�ځ\Tjꏨv ����#���G���#�K �:�hV����#���G����jr�Ѩ��H���G����jr�Q��?�ځ\Tjꏨv ��z�?��r�Q��?�ځ\Tjꏨv ����#���G���#�K ����#���G����jr�Q��?�ځX4h�dv�9�HV����#�����ƞ�?�{l�Nj��[��������X�l�����o�ƿ������û��~�>[���������/�?�����|���?���?���������~���_����7�~��������?p>�t�r�/���"���q���q�|�+۽X~���(V_,+3ˈv _,�|����J��2���J��2���J��2���F�ˤ.�|���\,�ځ|���\,�ځ|���\,�ځ|�l�y�L���J��2���J��2���J��2�����2��ˊ�HV_,+3ˈv _,+5˨v _,u^,���ŲRs��j�ŲRs��j�ŲRs��j�ŲQ��2�K _,+5˨v _,+5˨v _,+5˨v _,u^,���ŲRs��j�ŲRs��j�ŲB��2��ˆ��2������2���J��2���J��2���F�ˤ.�|���\,�ځ|���\,�ځ|���\,�ځ|�l�y�L���J��2���J��2���J��2���B=_,���ŲRs��j�ŲRs��j�ŲB��2���Ɯ˄.�|���\,�ځ|���\,�ځ|���\,�ځ|�l�y�L���J��2���J��2���J��2���F�ˤ.�|���\,�ځ|���\,�ځ|���\,�ځ|�l�y�L���J��2��� +�hV_,+3ˈv _,u^,���ŲRs��j�ŲRs��j�ŲRs��j�ŲQ��2�K _,+5˨v _,+5˨v _,+5˨v _,u^,���ŲRs��j�ŲRs��j�ŲRs��j�ŲQ��2�K ^,+t\,�Yq|���\,#ځ|���\,�ځ|�l�y�L���J��2���J��2���J��2���B=_,���ŲRs��j�ŲRs��j�ŲRs��j�ŲQ��2�K _,+5˨v _,+5˨v _,+5˨v ^,4�dv^,+r\,#Yq|���\,#ځ|��D�.��=��������������p�������P��������7�Cyf�,���������������M�s���<���Oϧ��p���C����v������[���e��vȻ���(���+h���n�^Q;pG}><}�~�g�����r����Fϲ��w��'�n�^Q;pG���ܩ۳W��QO?���n�^Q;��s��ӏ�ީy�5pG=����={E����cx�}�n�^Q;pG=��Vݞ��v�����c�yv�x��%pG�;�3��n�^Q;pG}<�C�U�g����>���^1+n�Kg�����'�2����U�g�����O�)5ߒC��[rJͷ�P�@���Q��H]�[rJͷ�P�@���R�-9T;��%��|K��o�u~K��%��%��|K��o�)5ߒC��[rJͷ�P�@���Q��H]�[rJͷ�P�@���BǷ�Ь8���2�-9D;��%g��-9R�@���R�-9T;��%��|K��o�)5ߒC��[rF�ߒ#u �o�)5ߒC��[rJͷ�P�@���R�-9T;��%g��-9R�@���R�-9T;��%��|K��o�)5ߒC��[rF�ߒ#u �o�)s[f@�2�8�P�8^fPf��@^f�y��5����eT;����eT;����eT;���:�H]y�A�Yf@�y�A�Yf@�y�A�Yf@�y���s���%����eT;����eT;����eT;��e2;�9���8^fPf��@^fPj�P�@^f0�\f u �e�f���e�f���e�f���e��eR�@^fPj�P�@^fPj�P�@^fPj�P�@^f0�\f u �e�f���e�f���e��e4+��e";����eD;����eT;����eT;���:�H]y�A�Yf@�y�A�Yf@�y�A�Yf@�y���s���%����eT;����eT;����eT;���z^f�u �e�f���e�f���e��e4+���9�]y�A�Yf@�y�A�Yf@�y�A�Yf@�y���s���%����eT;����eT;����eT;���:�H]y�A�Yf@�y�A�Yf@�y�A�Yf@�y���s���%����eT;�:�Ь8^fPf��@^f0�\f u �e�f���e�f���e�f���e��eR�@^fPj�P�@^fPj�P�@^fPj�P�@^f0�\f u �e�f���e�f���e�f���e��eR�@\fP�Xf@��x�A�Yf@�y�A�Yf@�y���s���%����eT;����eT;����eT;���z^f�u �e�f���e�f���e�f���e��eR�@^fPj�P�@^fPj�P�@^fPj�P�@\f0h���8\fP�Xf@��x�A�Yf@�y�am@-3�{l��3����,3�^Yfx�]��#/3�g�2��Xf�����W�������mr�}�'��o��U�����yD�5�|����������xcb{��%pG�;<��((u{��ځ;������z��={E��u�c(5k�v �m4kdv�m(3k�v �m(5k�v �m(5k�v �mu�m���چR���j�چR���j�چR���j�چP�k������Ԭm�ځ���Ԭm�ځ���Ԭm�ځ��aԹ�A��kJ����kJ����k +khV�ms�m��چR���j�چR���j�چR���j�چQ���K �m(5k�v �m(5k�v �m(5k�v �mu�m���چR���j�چR���j�چR���j�چQ���K �m(5k�v �m(t�m�Yq���̬m ځ��aԹ�A��kJ����kJ����kJ����kF�k�.����Ԭm�ځ���Ԭm�ځ���Ԭm�ځ��aԹ�A��kJ����kJ����kJ����kF�k�.�����mm��0\�P�X�@��xmC�Y�@�ymC�� P�@^�Pj�6P�@^�Pj�6P�@^�Pj�6P�@^�0�\� u � �fm�� �fm�� �fm�� �ε R�@^�Pj�6P�@^�Pj�6P�@^�Pj�6P�@\�0h�6��8\�P�X�@��xmC�Y�@�ymC�Y�@�ymèsm��%��6��� T;��6��� T;��6��� T;��6�:�6H]ymC�Y�@�ymC�Y�@�ymC�Y�@�ymèsm��%��6��� T;��6��� T;�6:�6Ь8\�0d�6��8^�Pf�6�@^�Pj�6P�@^�Pj�6P�@^�0�\� u � �fm�� �fm�� �fm�� �ε R�@^�Pj�6P�@^�Pj�6P�@^�Pj�6P�@^��ym�5��6��� T;��6��� T;�6:�6Ь8^�0�\� t � �fm�� �fm�� �fm�� �ε R�@^�Pj�6P�@^�Pj�6P�@^�Pj�6P�@^�0�\� u � �fm�� �fm�� �fm�� �ε R�@^�Pj�6P�@\�P�X�@��xmC�Y�@�ymèsm��%��6��� T;��6��� T;��6��� T;��6�:�6H]ymC�Y�@�ymC�Y�@�ymC�Y�@�ymèsm��%��6��� T;��6��� T;��6��� T;��6�:�6H]qmC�cm͊� efm�� �fm�� �ε R�@^�Pj�6P�@^�Pj�6P�@^�Pj�6P�@^��ym�5��6��� T;��6��� T;��6��� T;��6�:�6H]ymC�Y�@�ymC�Y�@�ymC�Y�@�qmàY� ��pmC�cmɊ� efm�� �k����������{,k�+k�g�_���[wck��>}��_�����G�����V������������n��ٹ����|~��j𫷀f0�ǽ`C�Ld�q)ؐ�Yq�6�(x�u`�60��]`C� +Ld�qؐ�Yq�6dJ�DVW�9�@v� ��/���_C��Kd�q�א)�Yq\��l��q��5d*�DV~ ��/��m_C��Kd�q�W���d�q�א��YqX�5���x� _��Kb�q�W���d�q�א��Yq\�5dz�DV�z �R/�Ǖ^A�F/��}^C��Kd�q�א��Yq��5d��DV�x9[�@vwx � +/��^C��Kd�q{א)�Yq\��l��q��5�V�%�" +K�F�]�.ø�k�vI�8��^'�m�}r�㮮!S�%�⸨k��t��8n�2%]"+�+��� ] ;����L=�Ȋ�r�!��%�⸙k�s��8�� +r�r��8��2�\"+���L�Ȋ�6�!S�%�Ⰺ+�4q�0��o�pɻ����%�⸁k�p��8�� +r�o��8��2�["+����L�Ȋ�֭!S�%��r+�ٸ��ok��m��8.�2]["+����LіȊ㚭 g�Ȏ㎭!S�%��`k��k��8l�q�k ��j��Ҭ�¸Wk��jI�8.�2�Z"+���L��Ȋ�:� g�Ȏ�.�!S�%��Hk��h��8n�2%Z"+�+��� Z ;����L}�Ȋ��!ӝ%��9k�g��8��^'ϭ�}r��ά!S�%��0k��e��8l�q�e �㪬�gSĎ㞬!S�%��$k�td��8n�2Y"+�뱂��X ;����L5�Ȋ�b�!Ӌ%��kȔb��8�� +r6b��8��2uX"+�˰�L�Ȋ�&�!S�%��+�ق��k�T`��8,�q�_ ����S~%���*��|���j��^��8.�2�W"+���L�Ȋ㺫 g�Ȏ㮫!Su%���j��\��8n�2%W"+�+��� W ;����L��Ȋ�r�!�m%���j�[��8�� +r�Z��8�qTZ ��B��g%���jȔY��8�� +r6Y��8�25V"+�K��L��Ȋ��!S`%�⸾z�<�W��%����Lu�Ȋ��!�[%�⸵jȔV��8�� +r6V��8�2uU"+�˪�LW�Ȋ㦪!ST%�Ⱖ*ĴT�0�oTTɻオ�O%�⸝�[�T�Tz���z�ݯ����;�7����g���gf7�~tS����û�_����������G��+S�������ou<�'���ϝ&x�Yj�x��V���Z���&��لjr�I�)7�ځ\o2��7��r�I��8�ځXrR�h9�Yq�sRf�N�v W��:�N�.��vRj�N�v �����ȝ'���jr�ɨ��D���'����jr�I�i?�ځ�Rj +P�v W��:;P�.�܂RjjP�v ���&��](���jrʨ�E�H�(en�(/ð��ъB������@�F �܍u �v�RS�B�� ��4�P�@�H)5%)T;�kRF�=)R�@nJ)5U)T;��RJM[ +�侔RS�B��2e�ٙ"u �֔RS�B��8��4�P�@�N)5�)T;�SM�̎��"G� +Ɋ��2ӢB��G���P�@�Ruv�H]�M��ԩP�@.T)5�*T;�;UJM� +��Z�Qg���%��UJM� +��r�RӮB��_���P�@�Xuv�H]�e��ԬP�@.Z)5M+T;�V +e+4+�V�LߊȎ�ƕ2S�B��t�Դ�P�@�])5�+T;��WF��+R�@n_)5�+T;�XJM���RS�B���e���"u �&�RS�B����Դ�P�@�c)5�,T;�+YB=w�@]����ԲP�@.f)5�,T;�Y +�,4+��YƜ�,B�@nh)5-T;�KZJMK�䞖RS�B���e���"u 䶖RS�B�����4�P�@�l)5�-T;�k[F��-R�@nn)5�-T;��[JM{����RS�B���e���"u ��RS�B��ȥ���B��˥̔��@�su��H]�ѥ�T�P�@.u)5�.T;�{]JM���j�Qg���%��]JM��䂗R��B���Ԕ�P�@�yu��H]���T�P�@.{)5m/T;��^JM���ʗQg��%[_ +�/4+��_�L����RS�B���e���"u ��RSC���Դ�P�@�)5E0T;��`B=w�@]� ����P�@.�)5�0T;�;aJM)��Z�Qg/��%��aJM5��r�R�C�����P�@��412;[b�51$+��b�LS���~�I���=���e9k�.���� <�}�I;�[���������t�����x|�/tw{~��Lyy��JQ�������������/�?�o�?ܼ������~}���͏����.vw���'��x�W_~ߎ^8]���������z�7���+j���G�n�^Q;pG}><?>Iu{��ځo����=Hu<�����~��Rݞ��v��z�1�}�����w�ӏ�֪۳W�|[}>�n�=�f�퐧���(���+h���U�g����>�>�?�۳W�|[�p<ܞ�����,�K��zwxz�����w��_梁={E����cx���^Q;�������p��<�����~w�Rݞ��v��z�1�>Iu{��ځ;��e���2�ځ�]f���̨.��if��o3�ځ�uf���3�ځ�f�n_hf������G�]�3�N�if��K�N�jf��c�N_kf��{�J��Q]��N�lf���N�mf����N_nf����J�� �K �8u��ځ8t��1t�j�ЉS�� ��C'J�� �K �8u��ځ4t��m�͊ág��F;�N���T�@:q�:a�q�ĩc��ġ���V;�N���T�@:q�:a�q�ĩc��ġ���V;�N���T�@:q�:a�q�ĩc��ġ���V;�N���T�@:q握/�h�ā�� ��C'�C'�v �u����ЉS�� ��C'NC'�v �8u��ځ8t������ЉS�� ��C'NC'�v �8u��ځ8t������ЉS�� ��C'NC'�v �8u��ځ4t��1t�f��Љ#��&+�N�9�N�@:q�:a�q�D�:Au ġ���V;�N�:�NX�@:q�:a�q�D�:Au ġ���V;�N�:�NX�@:q�:a�q�D�:Au ġ���V;�N�:�NX�@:q�6t�f��Љ"�� ��C'�C'�v �8u��ځ8t��1t�j�ЉR3t���C'NC'�v �8u��ځ8t��1t�j�ЉR3t���C'NC'�v �8u��ځ8t��1t�j�ЉQ�� �k �8u��ځ8t��1t�j�ЉC��6+�N���D�@:q�:a�q�ĩc��ġ���V;�N���T�@:q�:a�q�ĩc��ġ���V;�N���T�@:q�:a�q�ĩc��ġ���V;�N���T�@:q�:a�i�ġ�� ��C'�C'�v �(5C'�.�8t��1t�j�ЉS�� ��C'NC'�v �(5C'�.�8t��1t�j�ЉS�� ��C'NC'�v �(5C'�.�8t��1t�j�ЉS�� ��C'NC'�v �(5C'�.�4t��m�͊ág��F;�N�:�NX�@:Qj�NP]q�ĩc��ġ���V;�N�:�NX�@:1�:!u ġ���V;�N�:�NX�@:q�:a�q�D�:Au ġ���V;�N�:�NX�@:q�:a�i�D�c�͎��GnC'LV�8s�0ځ8t;f����3���p�7t�������V���������N��������ۧ��/o��Ӆ�������no�$� �M�x��لׯ� �v �&(5� �v �&(5� �v �&u�&���l�R3��j�l�R3��j�l�R3��j�l�Pϳ ���<����&�ځ<����&�ځ<����&�ځ<�`�9�@�ȳ J�l�ȳ J�l��� +� hV�&s�&��l�R3��j�l�R3��j�l�R3��j�l�Q�l�K �&(5� �v �&(5� �v �&(5� �v �&u�&���l�R3��j�l�R3��j�l�R3��j�l�Q�l�K �&(5� �v �&(t�&�Yq<����& ځ<�`�9�@�ȳ J�l�ȳ J�l�ȳ J�l�ȳ F�� �.�<����&�ځ<����&�ځ<����&�ځ<�`�9�@�ȳ J�l�ȳ J�l�ȳ J�l�ȳ F�� �.�4���m6��0�MP��M@��x6A��M@�y6A���P�@�MPjfP�@�MPjfP�@�MPjfP�@�M0�M u ���f6����f6����f6������R�@�MPjfP�@�MPjfP�@�MPjfP�@�M0hf��8�MP�M@��x6A��M@�y6A��M@�y6��s6��%�g���T;�g���T;�g���T;�g�:gH]y6A��M@�y6A��M@�y6A��M@�y6��s6��%�g���T;�g���T;g:fЬ8�M0df��8�MPff�@�MPjfP�@�MPjfP�@�M0�M u ���f6����f6����f6������R�@�MPjfP�@�MPjfP�@�MPjfP�@�M�y6�5�g���T;�g���T;g:fЬ8�M0�M t ���f6����f6����f6������R�@�MPjfP�@�MPjfP�@�MPjfP�@�M0�M u ���f6����f6����f6������R�@�MPjfP�@�MP�M@��x6A��M@�y6��s6��%�g���T;�g���T;�g���T;�g�:gH]y6A��M@�y6A��M@�y6A��M@�y6��s6��%�g���T;�g���T;�g���T;�g�:gH]q6A�c6͊��ef6����f6������R�@�MPjfP�@�MPjfP�@�MPjfP�@�M�y6�5�g���T;�g���T;�g���T;�g�:gH]y6A��M@�y6A��M@�y6A��M@�q6���M ��p6A�c6Ɋ��ef6��ل�M���f.^�q6a�=~����}fn�|��W����'�?���B��Y�/4��#�l�q'��_���_��?����7�~�������ۗ/�_������������n3�������/��O�K��?���"f���W�_pz�"Pp"u 䂓RSpB����QpB������@.8u�H]����P�@.8)5'T;�NJM� �䂓Qg���%�NJM� �䂓RSpB�����P�@.8u�H]����P�@.8)5'T;�NJM� �䂓Qg���%� +N�� +N(^�a�I����b�q�I�)8!ځ\p����'����jr�I�)8�ځ\pRj +N�v ��:N�.�\pRj +N�v ������'����jr�ɨ��D��'����jr�I�)8�ځ\pRj +N�v �����'E����'e���hr�I�)8�ځ\p2�,8��r�I�)8�ځ\pRj +N�v ������'��K ������'����jr�I�)8�ځ\p2�,8��r�I�)8�ځ\pRj +N�v �: +NhV�����'e���hr�I�)8�ځ\pRj +N�v ��:N�.�\pRj +N�v ������'����jr�ɨ��D��'����jr�I�)8�ځ\pRj +N�v ��z.8��r�I�)8�ځ\pRj +N�v �: +NhV��9N�.�\pRj +N�v ������'����jr�ɨ��D��'����jr�I�)8�ځ\pRj +N�v ��:N�.�\pRj +N�v ������'����jr�ɨ��D��'����jb�I����f�q�I�)8!ځ\p2�,8��r�I�)8�ځ\pRj +N�v ������'��K ������'����jr�I�)8�ځ\p2�,8��r�I�)8�ځ\pRj +N�v ������'��K �: +NhV������'����jr�ɨ��D��'����jr�I�)8�ځ\pRj +N�v ��z.8��r�I�)8�ځ\pRj +N�v ������'��K ������'����jr�I�)8�ځXp2h +Ndv�9 +NHV������'�∂��Vp�x (8���E���b���� ���xd+8ݦ�����߆}|7>�7_���O�����_��>��?ܽ����5�W=�*N�~���ױ���E���~�Λ~R�@��Wjn�Q�@��Wjn�Q�@��Wjn�Q�@��7��'u ��~en7�(^��M��M?��7���M?��7�B=���M�Rsӏj�M�Rsӏj�M�Rsӏj�M�Q�M?�K ��+57��v ��+57��v ��+57��v ��u�����M�Rsӏj�M�Rsӏj�M�Rsӏj�M�As�Of��M�"�M?��7���M?��7�J�M?��7�F�7��.�|ӯ����ځ|ӯ����ځ|ӯ����ځ|�o�y�O��7�J�M?��7�J�M?��7�J�M?��7�F�7��.�|ӯ����ځ|ӯ����ځxӯ�qӏf��M�!s�Od��M�2sӏh�M�Rsӏj�M�Rsӏj�M�Q�M?�K ��+57��v ��+57��v ��+57��v ��u�����M�Rsӏj�M�Rsӏj�M�Rsӏj�M�P�7����|ӯ����ځ|ӯ����ځxӯ�qӏf��M�1�M?�K ��+57��v ��+57��v ��+57��v ��u�����M�Rsӏj�M�Rsӏj�M�Rsӏj�M�Q�M?�K ��+57��v ��+57��v ��+57��v ��u�����M�Rsӏj�M�B�M?��7���M?��7�F�7��.�|ӯ����ځ|ӯ����ځ|ӯ����ځ|�o�y�O��7�J�M?��7�J�M?��7�J�M?��7�F�7��.�|ӯ����ځ|ӯ����ځ|ӯ����ځ|�o�y�O��7� +7�hV��+37��v ��+57��v ��u�����M�Rsӏj�M�Rsӏj�M�Rsӏj�M�P�7����|ӯ����ځ|ӯ����ځ|ӯ����ځ|�o�y�O��7�J�M?��7�J�M?��7�J�M?��7��M?��7��7�HV��+37��v ������~|�����5��=~w���7~+��g���C�����O���o���L����7���%����}�������R�݇�O��3�����/����/�\����J^�|���%��T��|���/�(t|�͊�/�(3_*A��K%F�_*!u �/�(5_*A��K%J͗JP�@�R�R�T;��Tb���R�@�R�R�T;��T�Դ�P�@n5)5�&T;�[MF��&R�@n5)5�&T;�[MJM� ��V�R�jB���d��j"u �V�2�V��a�jR�h5�Xq�jRfZM�v ���zn5��r�I�i5�ځ�jRjZM�v ����V�ȭ&��V�K ����V�ȭ&��Մjr�I�i5�ځ�j2�l5��r�I�i5�ځ�jRjZM�v ����V���&���Df�a�I��Մd�q�I�i5!ځ�jRjZM�v ���:[M�.��jRjZM�v ����V�ȭ&��Մjr�ɨ��D�ȭ&��Մjr�I�i5�ځ�jRjZM�v ���:[M�.��jRjZM�v ����V���&��V���&C��Dd�q�I�i5!ځ�jRjZM�v ����V�ȭ&��V�K ����V�ȭ&��Մjr�I�i5�ځ�j2�l5��r�I�i5�ځ�jRjZM�v ����V�ȭ&��[M����jRjZM�v ����V���&��V�ǭ&c�V�K ����V�ȭ&��Մjr�I�i5�ځ�j2�l5��r�I�i5�ځ�jRjZM�v ����V�ȭ&��V�K ����V�ȭ&��Մjr�I�i5�ځ�j2�l5��r�I�i5�ځ�jR�h5�Yq�jRfZM�v ���:[M�.��jRjZM�v ����V�ȭ&��Մjr�ɨ��D�ȭ&��Մjr�I�i5�ځ�jRjZM�v ���:[M�.��jRjZM�v ����V�ȭ&��Մjr�ɨ��D���&��V�ǭ&e�Մhr�I�i5�ځ�j2�l5��r�I�i5�ځ�jRjZM�v ����V�ȭ&��[M����jRjZM�v ����V�ȭ&��Մjr�ɨ��D�ȭ&��Մjr�I�i5�ځ�jRjZM�v ���V���&E�V�ǭ&e�Մhr�i���ZM�[���5�w[M������J����p���/ͥ���[M�<sn5�^�?��y����ݿ����[7���?]��;��O�w�M��^�_�������wT;�ܕ�wT;�ܕ�wT;�܍:�I]��]�ہ;��ax��q��b��2s��h�P��|����ځ|����ځ|����ځ|�n�y�N���J́;���J́;���J́;���F��.�|����ځ|����ځ|����ځx�n����qx��q��d��2s��h�Rs��j�Q�;�K �+5�v �+5�v �+5�v �u����Rs��j�Rs��j�Rs��j�Q�;�K �+5�v �+5�v �+t��Yqx�n���q|���#ځ|����ځ|����ځ|�n�y�N���J́;���J́;���J́;���F��.�|����ځ|����ځ|����ځ|�.��;�k �+5�v �+5�v �+t��Yq|�n�y�N���J́;���J́;���J́;���F��.�|����ځ|����ځ|����ځ|�n�y�N���J́;���J́;���J́;���F��.�|����ځx��q��f��2s��h�Q�;�K �+5�v �+5�v �+5�v �u����Rs��j�Rs��j�Rs��j�Q�;�K �+5�v �+5�v �+5�v �u���⁻Bǁ;����́;���J́;���F��.�|����ځ|����ځ|����ځ|�.��;�k �+5�v �+5�v �+5�v �u����Rs��j�Rs��j�Rs��j⁻As�Nf�ၻ"ǁ;����́;��������c;p�x 8p���߆?��������zw�K�[�<O?���ܟ���~�������3y���0���ۧ������Ǜw���ϟ�m���_�4��������ο���o���u������`��t�j��T�8�ܾ�o]�/m~����������4+��u��|���o]u~��%��u��|���o](5ߺ@��[Jͷ.P�@�օQ�.H]�[Jͷ.P�@�օR�T;��u��|���o]uV�H]� +��T�P�@�)5U T;��@JM��*�Qg��%��@�ܪ@(^�aH�� +�b�qH��!ځ\� +��U �� +�jrH���ځ\Rj�@�v W��:�@�.�\Rj�@�v W���*��U �� +�jrȨ� +D��U �� +�jrH���ځ\Rj�@�v V��*��U E�*��U e� +�hrH���ځ\2���rH���ځ\Rj�@�v W���*��U ��*�K W���*��U �� +�jrH���ځ\2���rH���ځ\Rj�@�v V�:�@hVV��*��U e� +�hrH���ځ\Rj�@�v W��:�@�.�\Rj�@�v W���*��U �� +�jrȨ� +D��U �� +�jrH���ځ\Rj�@�v W��z���rH���ځ\Rj�@�v V�:�@hVW��9�@�.�\Rj�@�v W���*��U �� +�jrȨ� +D��U �� +�jrH���ځ\Rj�@�v W��:�@�.�\Rj�@�v W���*��U �� +�jrȨ� +D��U �� +�jbH�� +�f�qH��!ځ\2���rH���ځ\Rj�@�v W���*��U ��*�K W���*��U �� +�jrH���ځ\2���rH���ځ\Rj�@�v W���*��U ��*�K V�:�@hVW���*��U �� +�jrȨ� +D��U �� +�jrH���ځ\Rj�@�v W��z���rH���ځ\Rj�@�v W���*��U ��*�K W���*��U �� +�jrH���ځX2h�@dvV�9�@HVW���*��U ꧈*��V�x���U������w��ݾ���:�/�@������7�I�<�U�������;�*~z>�=n�����?lo~<��_���|���_?O^�?����ǟ?��������>�~�x�7>�q��A��������C���ק�wχǛ��^� u{��ځo����͇G��gY]wԻ���?̝�={E����p�d���+j�χ���;u{��ځ;}�ӏ���Jϲ��[�ͩ�N�jR�Ρ[��͊�:�3G����:�RS�Cu �:�SG����:�SG����:�SG����:�RS�Cu �:�SG����:�SG����:�SG����:�RS�Cu �:�SG����:�SG����:�SG����:�RS�Cu �:�3��X��:��:��u:g�:��u:��:�k ��:�t�v ��:�t�v ��:�t�v �锚:�K ��:�t�v ��:�t�v ��:�t�v �锚:�K ��:�t�v ��:�t�v ��:�t�v ��:�thv����阬8��9s���@��9u��X�@��)5u:T�@��9u��X�@��9u��X�@��9u��X�@��)5u:T�@��9u��X�@��9u��X�@��9u��X�@��)5u:T�@��9u��X�@��9u��X�@��9t�ӱYqT�S��!�qX�s��1ځX�s�ӱځX�s�ӱځX�Sj�t�.�X�s�ӱځX�s�ӱځX�s�ӱځX�Sj�t�.�X�s�ӱځX�s�ӱځX�s�ӱځX�3�ӑ�b�Ω�N�jb�Ω�N�jR�Ρ[��͊�:�2S�Ct �:�SG����:�SG����:�SG����:�RS�Cu �:�SG����:�SG����:�SG����:�RS�Cu �:�SG����:�SG����:�SG����:�RS�Cu �:�SG����:�C�:��u:g�:��u:��N���u:��:��u:��:��u:��:��u:��N���u:��:��u:��:��u:��:��u:��N���u:��:��u:��:��u:��:��u:��N��Hu:�nu:6+�t�u:F;�tNu:V;�tJM��%�tNu:V;�tNu:V;�tNu:V;�tF�u:R�@��9u��X�@��9u��X�@��9u��X�@��)5u:T�@��9u��X�@��9u��X�@��9u��X�@��)t����8��9r��1YqX�s��1ځX��f����{�x��5��t�u��ߊ�R�{9x��6���V��e�?����|������˧�3Y?�����������^5���/�S;��ݎ�织���lR���,R�_|�G��-�FEd�q�J��Cd�q�ʐ)PYqX�2�hOx��)�:Eb�qqJ��7d�qkʐ)MYq\�2dSDV������e)Aή��M)C�(Ed�qMʐiIYqܑ2d*RDV�9�Q@v���r���(C�Ed�q/ʐ�EYq\���D�qԈ2�V�"�" +�PFm(�.øe�T�H�8.B]'�=�}r���!S�"��e�4���8�?2�'"+��O���' ;��O�L�Ȋ�ړ!�z"���d�T���8.< r����8n;2e'"+��N�LӉȊ㞓!Ss"���$�t���0l8o�Ȼ�z��n"���d�T���8.6 r����8n52�&"+�+M�L��Ȋ�>�!Sg"���$��e���d����8�12-&"+�;L�L��Ȋ�� g Ȏ���!S^"�⸺d�4���8�-qԖ��Ғ��Y�¸�d��H�8�+2m%"+��J�LU�Ȋ㢒 gO Ȏ㖒!SR"�⸢d�4���8�'2�$"+��I���$ ;��I�L1�Ȋ�Z�!�J"�⸓d�T���8.$]'�}�}r��6�!SF"�⸊d�4���8�!qԐ����g Ď��!S@"��~dȴ���8�2�#"+��G���# ;�[G�L�Ȋ�ʑ!�8"��od�ԍ��8. rv���8n2E#"+�kF�LˈȊ㎑!S1"��`$��/��]dȔ���8�q4���^�S+"��T$��)��Qd����8�2m""+��D�L��Ȋ�"� g�Ȏ��!S""��Bd�4���8�2�!"+��C���! ;��C�Lq�Ȋ�ڐ!�"��3d�T���8. r����8lq���㪐�"��'d�Ԅ��8. rv���8n2!"+��A�L;�Ȋ�n�!S "��t�<����%�[A�L)�Ȋ�J�!�"��d�ԁ��8. rv���8n2E "+�k@�L�Ȋ��!S"���$����0l�o�Ȼ����!����[WQ�z���s~(�����O+Ο�z:�~�)9���������x&����_�j����n�}�����߶���/����w������~}]��;�x��_Ⱥ����B������ y������g�^�|����r)5��B���\F���"u ��r)5��B���\JM���>�RS(C��Rf��)#u �V�RS+C��X���,C��[�̔��@��u��H]�a��T�P�@.�)5-3T;�{fJM��䪙Qg�%��fJM���R�8C��s�Ԕ�P�@��u��H]�y��T�P�@.�)5�3T;��gJM �� +�Qg��%�Zh��jh(^�aM����b�qM�)�!ځ\G깏�ȍ4����jr)M�i��ځ�KSj�i�v Wӌ:�i�.��NSj�i�v Ԕ����5����jrMͨ��F��M5����jrYM�i��ځ�WSj +k�v V������5E�����5e���hrwM�)��ځ\_3�쯑�r�M����ځ\bSjZl�v �ؔ�"��U6��.�K �ٔ�:�ȅ6��цjr�M�)��ځ\k3�쵑�r�M����ځ\nSj�m�v ��: +nhVV�����-7e��hr�M�i��ځ�uSj�n�v �:�n�.��xSj*o�v �ޔ���Ƚ7����jr�ͨ��F���7����jrN�i��ځ܁SjJp�v ���z����rN��¡ځ\�Sj�p�v ��: +qhVW�9;q�.�܊Sjjq�v 㔚f���8���jr=Ψ�G�� 9��"�jrIN�iɡځܓSj�r�v W�:�r�.�ܖSj�r�v 攚��ȝ9��4�jrmΨ�7G���9��:�jbyN��=�f�qN�)�!ځ\�3��Б�r�N��ѡځ\�Sj�t�v w锚2��u:��>�K 7ꔚJ�ȥ:��U�jr�N�)֡ځ\�3��֑�r�N��סځ\�Sjv�v w씚���5;�Ξ�K 6�:�vhV�픙���};��p�jr�Ψ�sG�ȭ;��v�jr�N�iޡځܽSj�w�v ��z�߁�rO���ځ\�SjZx�v ��"��U<��.�K ��:�ȅ<����jr'O�)�ځX�3hzydv6�9�yHV��v�����>�*��{l ���x�٭�����w�^:zw�]�����\㑭�w-��4Zx������������p��{=g�Oq�U�Ϗ���+���.����E�O/� ��yCݞ��v�������'f��,�K��zwxz�����w���������+j��?�*u{��ځo��ߜ~�Nͳ���;���p�(���+j��T�g�����~G�n�^Q;�m�x�1�<;u<����ޝ���T�g����>���Ҫ۳W��Q���O��G���6y{<����2����U�g�����~�Rݞ��v��z�)��Iu{��ځ;=�ӏ�N��YV��u���%T;����%T;����%T;���:�H]yI@�Y@�yI@�Y@�yI@�Y@�yI��sI��%����%T;�:�Ь8^Pf��@^0�\ u �%�fI���%�fI���%�fI���%��%R�@^Pj�P�@^Pj�P�@^Pj�P�@^0�\ u �%�fI���%�fI���%�fI���%��%R�@ZP�$��e. (p, �Xq�$��, ځ�$ ����k / (5K�v / (5K�v / (5K�v / u. ���R�$�j�R�$�j�R�$�j�Q���K / (5K�v / (5K�v / (5K�v . 4Kdv. (r, Yq�$��, ځ�$��, �ځ�$`Թ$@��KJ͒���KJ͒���KJ͒���KF�K�.��$��, �ځ�$��, �ځ�$��, �ځ�$`Թ$@��KJ͒���KJ͒���K +KhV. 2KDv/ (3K�v / (5K�v / (5K�v / u. ���R�$�j�R�$�j�R�$�j�Q���K / (5K�v / (5K�v / (5K�v / ��$���KJ͒���KJ͒���K +KhV/ s. ��R�$�j�R�$�j�R�$�j�Q���K / (5K�v / (5K�v / (5K�v / u. ���R�$�j�R�$�j�R�$�j�Q���K / (5K�v . (t, �Yq�$��, ځ�$`Թ$@��KJ͒���KJ͒���KJ͒���KF�K�.��$��, �ځ�$��, �ځ�$��, �ځ�$`Թ$@��KJ͒���KJ͒���KJ͒���KF�K�.��$�б$�f��2�$�h�R�$�j�Q���K / (5K�v / (5K�v / (5K�v / ��$���KJ͒���KJ͒���KJ͒���KF�K�.��$��, �ځ�$��, �ځ�$��, �ځ�$`�, ��q�$�ȱ$�d��2�$�h��~^- �{lK�K��q�$��V,. ܝ����%��ȶ$p;��������/�������������N���u9��p��_��ٷV�>�;[��ڳ�|���-��/-eT;�[�F�-eR�@n)+5-eT;�[�JMK�Ė�BGK͊㖲1gK��%�[�JMK�䖲R�RF����Դ�Q�@n)u��I]���Դ�Q�@n)+5-eT;�[�JMK�䖲QgK��%�[�JMK�䖲R�RF����Դ�Q�@n)u��I]���Դ�Q�@l)+t��Ѭ8n)+3-eD;�[�F�-eR�@n)+5-eT;�[�JMK�䖲R�RF���l��R&u 䖲R�RF����Դ�Q�@n)+5-eT;�[�F�-eR�@n)+5-eT;�[�JMK�䖲R�RF���l��R&u ���2��2��a�RV�h)�Xq�RVfZʈv ���zn)��rKY�i)�ځ�RVjZʨv �����2��-e�Ζ2�K �����2��-e����jrKY�i)�ځ�R6�l)��rKY�i)�ځ�RVjZʨv �����2��-e���Lf�aKY����d�qKY�i)#ځ�RVjZʨv ���:[ʤ.��RVjZʨv �����2��-e����jrK٨��L��-e����jrKY�i)�ځ�RVjZʨv ���:[ʤ.��RVjZʨv �����2��-e���2��-eC��Ld�qKY�i)#ځ�RVjZʨv �����2��-e�Ζ2�K �����2��-e����jrKY�i)�ځ�R6�l)��rKY�i)�ځ�RVjZʨv �����2��-e��[ʠ���RVjZʨv �����2��-e���2��-ecΖ2�K �����2��-e����jrKY�i)�ځ�R6�l)��rKY�i)�ځ�RVjZʨv �����2��-e�Ζ2�K �����2��-e����jrKY�i)�ځ�R6�l)��rKY�i)�ځ�RV�h)�Yq�RVfZʈv ���:[ʤ.��RVjZʨv �����2��-e����jrK٨��L��-e����jrKY�i)�ځ�RVjZʨv ���:[ʤ.��RVjZʨv �����2��-e����jrK٨��L��-e���2��-ee���hrKY�i)�ځ�R6�l)��rKY�i)�ځ�RVjZʨv �����2��-e��[ʠ���RVjZʨv �����2��-e����jrK٨��L��-e����jrKY�i)�ځ�RVjZʨv �� ��2��-eE��2��-ee���hrKy�^�Z��[K��5����KK��[�����ݖ�xdk)ߍ���|��ۧ��o���;��?]D�n"��w;�7�;|��{��jy���^���p�{�E�P�g����>>�\�(u{��ځo������oYu<���������={E����p��(���+j�χ�߲T�����V�N?���gY]w�ӏ���F�۳W��QO?��߲T����w�ӏ�֪۳W�|[}>�n�=�f�퐧���(���+h���U�g����>�>�?�۳W�|[�p<�>˿��gY]wԻ�ӓU�g����>n�_�ƳW��QO?������w&MN?�{��YT����c�{�����wԱ�ԌƠځ<�ԌƠځ<c�9C�ȣ1J�h�ȣ1J�h���1 +�1hV��s����h�R3�j�h�R3�j�h�R3�j�h�Q�h�K ��(5�1�v ��(5�1�v ��(5�1�v ��u�Ɛ��h�R3�j�h�R3�j�h�R3�j�h�Q�h�K ��(5�1�v ��(t�ƠYq<�̌� ځ<c�9C�ȣ1J�h�ȣ1J�h�ȣ1J�h�ȣ1F��1�.�<�ԌƠځ<�ԌƠځ<�ԌƠځ<c�9C�ȣ1J�h�ȣ1J�h�ȣ1J�h�ȣ1F��1�.�4��m4��0�Q��A��x4F��A�y4F���P�@�QjFcP�@�QjFcP�@�QjFcP�@�1��!u ���f4����f4����f4������R�@�QjFcP�@�QjFcP�@�QjFcP�@�1hFc��8�Q��A��x4F��A�y4F��A�y4ƨs4��%�Gc���T;�Gc���T;�Gc���T;�Gc�:GcH]y4F��A�y4F��A�y4F��A�y4ƨs4��%�Gc���T;�Gc���T;Gc:FcЬ8�1dFc��8�QfFc�@�QjFcP�@�QjFcP�@�1��!u ���f4����f4����f4������R�@�QjFcP�@�QjFcP�@�QjFcP�@��y4�5�Gc���T;�Gc���T;Gc:FcЬ8�1��!t ���f4����f4����f4������R�@�QjFcP�@�QjFcP�@�QjFcP�@�1��!u ���f4����f4����f4������R�@�QjFcP�@�Q��A��x4F��A�y4ƨs4��%�Gc���T;�Gc���T;�Gc���T;�Gc�:GcH]y4F��A�y4F��A�y4F��A�y4ƨs4��%�Gc���T;�Gc���T;�Gc���T;�Gc�:GcH]q4F�c4͊��ef4����f4������R�@�QjFcP�@�QjFcP�@�QjFcP�@��y4�5�Gc���T;�Gc���T;�Gc���T;�Gc�:GcH]y4F��A�y4F��A�y4F��A�q4Ơ�!��p4F�c4Ɋ��ef4��ј�%5�ﱍ�\�����2s�ј�����Gc�#�h�����?~���_^��_���9��`�����`����G'�j<s�V���������k�an�^A;pG}>|������wFj�����)��gY]wԱڣ����ځ<�����ځ<�����ځ<d�9D��3@J���3@J���3@J���3@F�3@�.�<�����ځ<�����ځ<�����ځ8d�����q<����!ځ<�����ځ<�����ځ<d�9D��3@J���3@J���3@J���3@B=������R3�j��R3�j��R3�j��Q��K ��)53@�v ��)53@�v ��)t���Yq<d�9D��3@J���3@J���3@J���3@F�3@�.�<�����ځ<�����ځ<�����ځ<d�9D��3@J���3@J���3@J���3@F�3@�.�<�����ځ8��1�f���23�h��Q��K ��)53@�v ��)53@�v ��)53@�v ��u������R3�j��R3�j��R3�j��Q��K ��)53@�v ��)53@�v ��)53@�v ��u������2� /�pH�cŊ� ef�� ��g�@]yH��B�yH��B�yH��B�yȨs��%�g��� T;�g��� T;�g��� T;�g��:g�H]yH��B�yH��B�yH��B�qȠ�"��pH�cɊ� ef�� �f�� �� R�@�Rjf�P�@�Rjf�P�@�Rjf�P�@�2�"u � �f�� �f�� �f�� �� R�@�Rjf�P�@�Rjf�P�@�R�B��pȐ�"��xH��B�yH��B�yH��B�yȨs��%�g��� T;�g��� T;�g��� T;�g��:g�H]yH��B�yH��B�yH��B�yH�� P�@�Rjf�P�@�Rjf�P�@�R�B��xȘs��%�g��� T;�g��� T;�g��� T;�g��:g�H]yH��B�yH��B�yH��B�yȨs��%�g��� T;�g��� T;�g��� T;�g��:g�H]yH��B�qH�c͊� ef�� �� R�@�Rjf�P�@�Rjf�P�@�Rjf�P�@�2�"u � �f�� �f�� �f�� �� R�@�Rjf�P�@�Rjf�P�@�Rjf�P�@�2�"u � �� 4+�g��� D;�g��� T;�g��:g�H]yH��B�yH��B�yH��B�yH�� P�@�Rjf�P�@�Rjf�P�@�Rjf�P�@�2�"u � �f�� �f�� �f�� �f�̎� E� $+�g��� D;�g���m���6t�0���� <�}�I;�������<Ow?�.��||��s�����������x��}�߽�9�D��ѐ��endstream +endobj +1083 0 obj << +/Type /Page +/Contents 1084 0 R +/Resources 1082 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +/Annots [ 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R ] +>> endobj +1086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 706.321 180.502 715.208] +/Subtype /Link +/A << /S /GoTo /D (administration) >> +>> endobj +1087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 706.321 537.983 715.208] +/Subtype /Link +/A << /S /GoTo /D (administration) >> +>> endobj +1088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 690.844 204.681 699.756] +/Subtype /Link +/A << /S /GoTo /D (parameters) >> +>> endobj +1089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 690.844 537.983 699.756] +/Subtype /Link +/A << /S /GoTo /D (parameters) >> +>> endobj +1090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 679.95 194.709 686.804] +/Subtype /Link +/A << /S /GoTo /D (useradmin) >> +>> endobj +1091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 679.95 537.983 686.804] +/Subtype /Link +/A << /S /GoTo /D (useradmin) >> +>> endobj +1092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 664.942 247.002 673.853] +/Subtype /Link +/A << /S /GoTo /D (defaultuser) >> +>> endobj +1093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 664.942 537.983 673.853] +/Subtype /Link +/A << /S /GoTo /D (defaultuser) >> +>> endobj +1094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 651.99 235.207 660.902] +/Subtype /Link +/A << /S /GoTo /D (manageusers) >> +>> endobj +1095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 651.99 537.983 660.902] +/Subtype /Link +/A << /S /GoTo /D (manageusers) >> +>> endobj +1096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 639.039 251.954 647.95] +/Subtype /Link +/A << /S /GoTo /D (createnewusers) >> +>> endobj +1097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 639.039 537.983 647.95] +/Subtype /Link +/A << /S /GoTo /D (createnewusers) >> +>> endobj +1098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 626.087 243.636 634.999] +/Subtype /Link +/A << /S /GoTo /D (modifyusers) >> +>> endobj +1099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 626.087 537.983 634.999] +/Subtype /Link +/A << /S /GoTo /D (modifyusers) >> +>> endobj +1100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 613.136 355.494 622.047] +/Subtype /Link +/A << /S /GoTo /D (programadmin) >> +>> endobj +1101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 613.136 537.983 622.047] +/Subtype /Link +/A << /S /GoTo /D (programadmin) >> +>> endobj +1102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 602.242 179.327 609.096] +/Subtype /Link +/A << /S /GoTo /D (products) >> +>> endobj +1103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 602.242 537.983 609.096] +/Subtype /Link +/A << /S /GoTo /D (products) >> +>> endobj +1104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 587.233 194.829 596.144] +/Subtype /Link +/A << /S /GoTo /D (components) >> +>> endobj +1105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 587.233 537.983 596.144] +/Subtype /Link +/A << /S /GoTo /D (components) >> +>> endobj +1106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 576.219 178.769 583.193] +/Subtype /Link +/A << /S /GoTo /D (versions) >> +>> endobj +1107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 576.219 537.983 583.193] +/Subtype /Link +/A << /S /GoTo /D (versions) >> +>> endobj +1108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 563.268 188.184 570.242] +/Subtype /Link +/A << /S /GoTo /D (milestones) >> +>> endobj +1109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 563.268 537.983 570.242] +/Subtype /Link +/A << /S /GoTo /D (milestones) >> +>> endobj +1110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 548.379 139.467 557.29] +/Subtype /Link +/A << /S /GoTo /D (voting) >> +>> endobj +1111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 548.379 537.983 557.29] +/Subtype /Link +/A << /S /GoTo /D (voting) >> +>> endobj +1112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 535.427 222.923 544.339] +/Subtype /Link +/A << /S /GoTo /D (groups) >> +>> endobj +1113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 535.427 537.983 544.339] +/Subtype /Link +/A << /S /GoTo /D (groups) >> +>> endobj +1114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 522.476 182.535 531.387] +/Subtype /Link +/A << /S /GoTo /D (security) >> +>> endobj +1115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 522.476 537.983 531.387] +/Subtype /Link +/A << /S /GoTo /D (security) >> +>> endobj +1116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 511.582 197.329 518.436] +/Subtype /Link +/A << /S /GoTo /D (security-networking) >> +>> endobj +1117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 511.582 537.983 518.436] +/Subtype /Link +/A << /S /GoTo /D (security-networking) >> +>> endobj +1118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 496.573 177.116 505.484] +/Subtype /Link +/A << /S /GoTo /D (security-mysql) >> +>> endobj +1119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 496.573 537.983 505.484] +/Subtype /Link +/A << /S /GoTo /D (security-mysql) >> +>> endobj +1120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 485.679 218.331 492.533] +/Subtype /Link +/A << /S /GoTo /D (security-daemon) >> +>> endobj +1121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 485.679 537.983 492.533] +/Subtype /Link +/A << /S /GoTo /D (security-daemon) >> +>> endobj +1122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 472.727 258.33 479.581] +/Subtype /Link +/A << /S /GoTo /D (security-access) >> +>> endobj +1123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 472.727 537.983 479.581] +/Subtype /Link +/A << /S /GoTo /D (security-access) >> +>> endobj +1124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 457.719 210.619 466.63] +/Subtype /Link +/A << /S /GoTo /D (cust-templates) >> +>> endobj +1125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 457.719 537.983 466.63] +/Subtype /Link +/A << /S /GoTo /D (cust-templates) >> +>> endobj +1126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 446.824 195.377 453.679] +/Subtype /Link +/A << /S /GoTo /D (1605) >> +>> endobj +1127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 446.824 537.983 453.679] +/Subtype /Link +/A << /S /GoTo /D (1605) >> +>> endobj +1128 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 431.816 238.734 440.727] +/Subtype /Link +/A << /S /GoTo /D (1628) >> +>> endobj +1129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 431.816 537.983 440.727] +/Subtype /Link +/A << /S /GoTo /D (1628) >> +>> endobj +1130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 418.864 216.388 427.776] +/Subtype /Link +/A << /S /GoTo /D (1638) >> +>> endobj +1131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 418.864 537.983 427.776] +/Subtype /Link +/A << /S /GoTo /D (1638) >> +>> endobj +1132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 405.913 226.34 414.824] +/Subtype /Link +/A << /S /GoTo /D (1651) >> +>> endobj +1133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 405.913 537.983 414.824] +/Subtype /Link +/A << /S /GoTo /D (1651) >> +>> endobj +1134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 392.961 351.988 401.873] +/Subtype /Link +/A << /S /GoTo /D (template-http-accept) >> +>> endobj +1135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 392.961 537.983 401.873] +/Subtype /Link +/A << /S /GoTo /D (template-http-accept) >> +>> endobj +1136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 380.01 250.897 388.921] +/Subtype /Link +/A << /S /GoTo /D (cust-change-permissions) >> +>> endobj +1137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 380.01 537.983 388.921] +/Subtype /Link +/A << /S /GoTo /D (cust-change-permissions) >> +>> endobj +1138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 367.059 224.328 375.97] +/Subtype /Link +/A << /S /GoTo /D (upgrading) >> +>> endobj +1139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 367.059 537.983 375.97] +/Subtype /Link +/A << /S /GoTo /D (upgrading) >> +>> endobj +1140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 354.107 291.296 363.019] +/Subtype /Link +/A << /S /GoTo /D (integration) >> +>> endobj +1141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 354.107 537.983 363.019] +/Subtype /Link +/A << /S /GoTo /D (integration) >> +>> endobj +1142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 343.213 177.115 350.067] +/Subtype /Link +/A << /S /GoTo /D (bonsai) >> +>> endobj +1143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 343.213 537.983 350.067] +/Subtype /Link +/A << /S /GoTo /D (bonsai) >> +>> endobj +1144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 330.262 168.817 337.116] +/Subtype /Link +/A << /S /GoTo /D (cvs) >> +>> endobj +1145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 330.262 537.983 337.116] +/Subtype /Link +/A << /S /GoTo /D (cvs) >> +>> endobj +1146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 317.31 206.714 324.164] +/Subtype /Link +/A << /S /GoTo /D (scm) >> +>> endobj +1147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 317.31 537.983 324.164] +/Subtype /Link +/A << /S /GoTo /D (scm) >> +>> endobj +1148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 304.359 239.501 311.213] +/Subtype /Link +/A << /S /GoTo /D (tinderbox) >> +>> endobj +1149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 304.359 537.983 311.213] +/Subtype /Link +/A << /S /GoTo /D (tinderbox) >> +>> endobj +1150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 287.093 160.059 295.98] +/Subtype /Link +/A << /S /GoTo /D (faq) >> +>> endobj +1151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 287.093 537.983 295.98] +/Subtype /Link +/A << /S /GoTo /D (faq) >> +>> endobj +1152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 271.751 179.117 280.638] +/Subtype /Link +/A << /S /GoTo /D (database) >> +>> endobj +1153 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 271.751 537.983 280.638] +/Subtype /Link +/A << /S /GoTo /D (database) >> +>> endobj +1154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 256.274 247.869 265.185] +/Subtype /Link +/A << /S /GoTo /D (dbmodify) >> +>> endobj +1155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 256.274 537.983 265.185] +/Subtype /Link +/A << /S /GoTo /D (dbmodify) >> +>> endobj +1156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 243.323 274.399 252.234] +/Subtype /Link +/A << /S /GoTo /D (dbdoc) >> +>> endobj +1157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 243.323 537.983 252.234] +/Subtype /Link +/A << /S /GoTo /D (dbdoc) >> +>> endobj +1158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.552 230.371 247.391 239.283] +/Subtype /Link +/A << /S /GoTo /D (2278) >> +>> endobj +1159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 230.371 537.983 239.283] +/Subtype /Link +/A << /S /GoTo /D (2278) >> +>> endobj +1160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.462 217.42 278.524 226.331] +/Subtype /Link +/A << /S /GoTo /D (2305) >> +>> endobj +1161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 217.42 537.983 226.331] +/Subtype /Link +/A << /S /GoTo /D (2305) >> +>> endobj +1162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 202.212 252.64 211.098] +/Subtype /Link +/A << /S /GoTo /D (patches) >> +>> endobj +1163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 202.212 537.983 211.098] +/Subtype /Link +/A << /S /GoTo /D (patches) >> +>> endobj +1164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 186.735 233.673 195.646] +/Subtype /Link +/A << /S /GoTo /D (rewrite) >> +>> endobj +1165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 186.735 537.983 195.646] +/Subtype /Link +/A << /S /GoTo /D (rewrite) >> +>> endobj +1166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 173.783 244.242 182.695] +/Subtype /Link +/A << /S /GoTo /D (cmdline) >> +>> endobj +1167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 173.783 537.983 182.695] +/Subtype /Link +/A << /S /GoTo /D (cmdline) >> +>> endobj +1168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 158.575 231.6 167.462] +/Subtype /Link +/A << /S /GoTo /D (variants) >> +>> endobj +1169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 158.575 537.983 167.462] +/Subtype /Link +/A << /S /GoTo /D (variants) >> +>> endobj +1170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 143.099 184.467 152.01] +/Subtype /Link +/A << /S /GoTo /D (variant-redhat) >> +>> endobj +1171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 143.099 537.983 152.01] +/Subtype /Link +/A << /S /GoTo /D (variant-redhat) >> +>> endobj +1172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 130.147 204.392 139.058] +/Subtype /Link +/A << /S /GoTo /D (variant-fenris) >> +>> endobj +1173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 130.147 537.983 139.058] +/Subtype /Link +/A << /S /GoTo /D (variant-fenris) >> +>> endobj +1174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 119.253 152.916 126.107] +/Subtype /Link +/A << /S /GoTo /D (variant-issuezilla) >> +>> endobj +1175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 119.253 537.983 126.107] +/Subtype /Link +/A << /S /GoTo /D (variant-issuezilla) >> +>> endobj +1176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 106.302 142.396 113.156] +/Subtype /Link +/A << /S /GoTo /D (variant-scarab) >> +>> endobj +1177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 106.302 537.983 113.156] +/Subtype /Link +/A << /S /GoTo /D (variant-scarab) >> +>> endobj +1085 0 obj << +/D [1083 0 R /XYZ 71.731 729.265 null] +>> endobj +1082 0 obj << +/Font << /F32 807 0 R /F27 800 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1226 0 obj << +/Length 21095 +/Filter /FlateDecode +>> +stream +xڕ�˒,ׁ��y=���By����D��M�Aբ��0#�������^��� ������^��x��^��_=,�������r]���z�<?}����������[~�/�q����ty�,���o�������x��_/�����ק����/����ۙ_��/��o./_��^��_���_�39���?������Ϳ^����O���������ï~�������/����������a~���r{���8�\O��?a}|�ӗ�|�^_�=�u={�v��z;�.V]��x_��OCףlv�����Y����w��<Xu={�v��z;���_���ځ����\�:β:���ˋU׳j��ٞ���=P;pG]^�ӓT׳j�U/�kxtj:��k�>Ku={�v��������S׳j��k8[u={�v�}������S�YV���zz~}��z�@����t�Yu={�v��z;=�_��G̊�O^Χ������N�;������=P;pG]���E����w��-<^���=P;�z]^�U��,�S�����ˣT׳j��k8�8��ځ;�����=P;��x>=��s�,�S��z==���q�@������b���ځ;�m�<�G�q�@���������q��)pG]^ãU׳j��k��X���C.��*���h�W��wp��8����.��,̍�j��[x��z�@���vz|�?�����/�כ���q��)pG��_���=P;pG}Z��s��ځ;���䏹q�@����my �RgY�w��5\叹q�@��uy �cn�=P;pG]^�٪����kx�?��YV��uy �|;y ~��N�/Yףb���o��p��ځw�������~��,�s��z=]����=P;pG]���U����w��7:u=s�v�}�����T�YV��uy �'��g��Q��p~��z�@��u��V]��x_�<�^^���eu +�Q��姃T׳j�O����g��Qo���T׳j�W��k��Ǵe��v������GȊ�!��x��z����uy�y��ځ����\�:β:��[8˟q��ځ;���߆���w����j���ځ�է���M��f�eu +�Q�����8{�v���tz~��z�@��uy O�g�8{�v�}�yy ���8����.��j���ځ;���͓�=P;pG]^���z���������ϛ�(��C./������wԧӓ�v��j��ͪ����ӓ�v���N�;��� ����ځ;������=P;pG]^��v��j�W_��p��8����.��"ƍ�j��k��Nr�@��uy V]��xW}|x8=���q9����^N������ځ;����Ū���wԗ�����Yq�����֜et +�Q�w�d���ځ;��/R]����.oA^;���𧻓�5\�:β:��k8?Ju={�v����y�$g��Q_N�W��g���^Nכ�1���N�;��t��Nr�@����t}��z�@��uy O���8{�v�}�qy ��Iβ:��k�Zu={�v���������Yq;��䵓�=@;����Y��YV��uy��I����>�.��I������^nV]��x_}~8]䵓�eu +�Q/�y�$g��Q���d���ځ;��䵓�=P;����y�$gY�w��5\���=P;pG]^��v��j��k��Nr�@������t����eu +�Q/�g�~>z`V��t:��'9{�v���rz~��z�@�������哜eu +�Q�� /���ځ;�����=P;pG]^��|��j�U��� ��v:��k8[u={�v����y�$g��Q_NO��3��ځ�����A&r��)pG����哜=P;pG}:=<[u={�v����Y����𧻓�5���G��ry���|ry�-��h���������/+<]n����g>>����q}9���ˬ/�(>���nQ</���z�-�Y�(���?��o��7ߜ����oߜo_����hx/}q[���������a�����|��ݺ�g̡��e����<�˽���g��Y�8��ORgY�w�u�éc��Ľ���V;�>�:�>X�@��P���@��p�Ùc��Ľ���V;�>�:�>X�@��Pj�>P�q�éc��Ľ���V;�>�:�>X�@��0��A��{N{�v �}8u�}�ځ���Ա��j�އR�����{N{�v �}8u�}�ځ����u�͊ýef��)�>�:�>X�@��p���`�q�éc��Ľ�f��)�>�:�>X�@��p���`�q�éc��Ľ�f��)�>�:�>X�@��p���`�q�éc��Ľ�f��)�>�:�>X�@��p���f��އ3����{J���S �}8u�}�ځ���Ա��j�އS����{J���S �}8u�}�ځ���Ա��j�އS����{J���S �}8u�}�ځ���Ա��j�އS����{J���S �}8�����h�Á����{�{�v �}u�� uĽ���V;�>�:�>X�@��p���`�q�C���@u +Ľ���V;�>�:�>X�@��p���`�q�C���@u +Ľ���V;�>�:�>X�@��p���`�i�C�c�͎��G�{LV�}8s�}0ځ���Ա��j�އR�����{N{�v �}8u�}�ځ���Ա��j�އR�����{N{�v �}8u�}�ځ���Ա��j�އR�����{N{�v �}8u�}�ځ����u�͊��E��$;�>�9�>�@��p���`�q�éc��Ľ�f��)�>�:�>X�@��p���`�q�éc��Ľ�f��)�>�:�>X�@��p���`�q�éc��Ľ�n{����Ա��j�އS���H{]�>ج8��Pf�>�q�éc��Ľ���V;�>�:�>X�@��Pj�>P�q�éc��Ľ���V;�>�:�>X�@��Pj�>P�q�éc��Ľ���V;�>�:�>X�@��Pj�>P�q�éc������{lV�}8s�}0ځ�����}�:�އS����{N{�v �}8u�}�ځ�����}�:�އS����{N{�v �}8u�}�ځ�����}�:�އS����{N{�v �}8u�}�ځ�����}�:�އC6+�>�9�>�@��p���`�q�C���@u +Ľ���V;�>�:�>X�@��p���`�q�è���s �}8u�}�ځ���Ա��j�އS����{J���S �}8u�}�ځ���Ա��j�އS���H{ +{hv�}8r��`��p�Ùc��Ľܮ8�����|��c����>�9�? ^���m�����ǽ3/����_��痜�^ޟg'��۱���������|^����?���?��?~��������]���ׯ��?����e��uyϷ����ϧ����/�{%p��F�����x +�Yq�4dʀDVW �& ��=@An5@ ;�K��L�Ȋ��!S�$���gȴ���8�� r���q\�3dzDV���8J~�ʟ��#���'ȭ�d�q�ϐ��Yq��3d�~DV������?An? ;�~�L��Ȋ�v�!S�#���g�4���8�� r���q\�3d:}DV7��B��u>C��Gd�q�O�[�Ȏ�"��q���g�Q�#�cW������cONq\�3d�{DV7����ǵ=C��Gd�qgO�[eȎ�!��#�⸭gȔ���8��2M="+�{z��jz@v������ =C��Gd�q=ϐi�Yq��b�y�V�7zy�}�V�S�#�⸒g�4�8�� r���q\�3d�xDV7��"��5<C��Gd�qO�[Ȏ��!ӿ#��}gȔ8��2�;"+�{w��jw@v�����Ǎ;C�pGd�a�Έ�mG��0�� /U;�*��vLώĊ㖝!S�#��bg�4숬8�� r���q\�3d�uDV7��b�ǵ:C�UGd�q�N�[�Ȏ�B�!ӧ#��MgȔ鈬8��2M:"+�{t��{�n���Dg�t般8n�2:"+�sF�9?�qwN�[uĎ��!ӛ#��5gȔ戬8��2�9"+��r���r@v������M9C�(Gd�qMΐi�Yqܑ�V��� g��㈬8n�2�8"+��q�L3�Ȋ�^� �Z�ǥ8C�Gd�a#Έ�G��0��0m8+��p�ܪp@v����-8C�Gd�qΐi�Yq��V���f�t߈�8n�2�7"+�ko�L�Ȋ�Λ ���Dž7C��Fd�q�͐)�Yq\u3d�nDV����܀�8,�qt��� 7��Fb�q�͐i�Yq�m�Vm���f��ڈ�8n�2�6"+�+m�L��Ȋ�>�1�^g�'�8.�2]6"+��l�L��Ȋ��!�b#���&ȭ�d�q�͐�Yq�^3d�kDVW������5!��`�ai�x��F��0n�0�5+��j�+�V��X�j���r����>ćOS�Uծ�i����ϻ^�������<������/~���}���G�n˟�?~�!��_����Ǩ��߯��z�S���Ǻ�1������Ѿ|�;�^ϲ:����f���ځ;��:�R�oT;�?���|����}u��7�S �[���7�ȟ�Vj>��j�羕��}�ځ��o��s�dv�[���7�ȟ�Vj>��j�羕��}�ځ��o�n��&u +��}+5��F��s�J��Q�@�ܷR�oT;�?�-���}�:�羕��}�ځ��o��sߨv �[���7�ȟ�6���oR�@�ܷR�oT;�?���|����}+t|�͊��}s��7�S �[���7�ȟ�Vj>��j�羕��}�ځ��o�n��N�����{�ځ<��,|�ځ��Ԍ|�ځ<�a�m��)��>���T;��>���T;��>���T;�'?��m~�:��R3��j���B�����������F��?H�yD���A�yD�YA�yD�A�y +Ĩ��S ��(5s �v �(5� �v o�(5� �v ςu�!u +�e�f��q�f��}�f ���n!�N����u&ŏa8����b��V�23�h�\�P��B@�y1D��A�y4D�Y A�y7D�A�y:Ĩ�v�S ��(5�!�v �(5"�v o�(5#"�v ψu�!u +�%�fJ��1�fM��=�fP��I�fS�̎�UE�Y$+��E��eD;��E��qT;��E��틐:�R31�j�ȈR�2�j�ΈR34�j�ԈQ��R�@^Qj�FP�@QjGP�@�QjFGP�@�1�;B���#J�����#J�����# +$hVN�2$Dv��(33$�v �(5K$�v o�(5c$�v ϑu�#!u +�E�f���Q�f���]�f���i�n�$�N��N��̓�ځ<P��,��ځ�Q�Ԍ��ځ<S"���P�@^*Qj�JP�@+Qj�JP�@�+Q�,A��x�Ę�f �S ��(5�%�v �(5�%�v o�(5�%�v ϗu�/!u +��f����f����f���)�n[&�N��f��̙�ځ<h��,��ځ�i�Ԍ��ځ<kb�mׄ�)��M��iT;�M:�MЬ8�7QfN�@�81�qB��+'J�� ��C'J�� ��['J�� ��s'F��NH�y�D��<A�y�D�Y=A�y�D�>A�y�Ĩ�� �S ��(5�'�v �(5(�v o�(5#(�v Ϡu�A!u +�%��)4+��P��5D;��P��AT;�'Q��m��:�*�R3��j�0�R���j�6�R3��j�<�P��Q@�y!E��HA�y$E�YIA�y'E�JA�y*Ũ�V +�S ��(5s)�v �(5�)�v o�(5�)�v Φ4�)dv.�(rL� Yq<��̬� ځ��B� b@�c]P��0���6Tֿ�*O����3n��#ot*���~��W����}����_��~��O�}s��ӏ����{������𝕕/}o5 x�&����k_>�$H��&���$P�@�I(55 T;�kJMM�䚄Q���S �$�����5 ��&�jrMB��I�ځ\�0�V� u +���2ך�ð&��Q�@��&���$�@�I��&��5 ��&�jrMB��I�ځ\�Pjj�v �$���$H��&���$P�@�I(55 T;�kJMM�䚄Q���S �$�����5 ��&�jrMB��I�ځX�0hjdv�$9jHV�$�����5 ��&�jrM¨[M��)�kJMM�䚄RS�@��&���$P�@�Iu�I�:rMB��I�ځ\�Pjj�v �$�����5 �n5 R�@�I(55 T;�kJMM�Ě�BGM͊Ú�!S� ��&���$�@�I(55 T;�kJMM�䚄Q���S �$�����5 ��&�jrMB��I�ځ\�0�V� u +䚄RS�@��&���$P�@�I(55 T;�kB}�I�:rMB��I�ځ\�Pjj�v �$:jhV�$���$��&���$P�@�I(55 T;�kJMM�䚄Q���S �$�����5 ��&�jrMB��I�ځ\�0�V� u +䚄RS�@��&���$P�@�I(55 T;�kF�j�N�\�Pjj�v �$:jhV�$�����5 �n5 R�@�I(55 T;�kJMM�䚄RS�@��&aԭ&A��5 ��&�jrMB��I�ځ\�Pjj�v �$���$H��&���$P�@�I(55 T;�kJMM�䚄Q���S �$:jhV�$�����5 ��&�jrM¨[M��)�kJMM�䚄RS�@��&���$P�@�I��&��5 ��&�jrMB��I�ځ\�Pjj�v �$���$H��&���$P�@�I(55 T;�kJMM�Ě�AS� ��&��Q�@��&���$�@�I��~Q���Xkj�����$���(��&1��=�e�$�˷��7ק����|���O�_��_}������~���A���;��/���/�����a��}x���}� ��8T;�?��|8���u�p�S 8N��p���Sj>�j��:>�f��㌹}8��)�?��|8���)5�C���qJ͇�P�@�p�Q�Ǒ:�㔚ǡځ��8���q�v 8N��p���3���8R�@�p�R��8T;�?��|8���)5�C���qF�>G���Sj>�j��:>�f��㔙�!ځ��8�n�#u +��)5�C���qJ͇�P�@�p�RӈF��mԭM�ȍh���jr#Z�iD�ځ܈VjѨv 7���5�I����4�Q�@nD+5�hT;��JM#��F�Q�F4�S 5���6�Q���h�F4�Ǎhe��hr#Z��hP�@nD+5�hT;��JM#��F�RӈF��mԭM�ȍh���jr#Z�iD�ځ܈VjѨv 7���5�I����4�Q�@nD+5�hT;��JM#��F�Aӈ&����шF����4��@nD+5�hT;��F�ѤN�܈VjѨv 7���F4�ȍh���jr#ڨ[#��)��JM#��F�RӈF����4�Q�@nDukD�:r#Z�iD�ځ܈VjѨv 6�:�hV6� �F4�Ǎhe��hr#Z�iD�ځ܈VjѨv 7���5�I����4�Q�@nD+5�hT;��JM#��F�Q�F4�S 7���F4�ȍh���jr#Z�iD�ځ܈�{#�9��JM#��F�RӈF����шF��m̭M�ȍh���jr#Z�iD�ځ܈VjѨv 7���5�I����4�Q�@nD+5�hT;��JM#��F�Q�F4�S 7���F4�ȍh���jr#Z�iD�ځ܈6�ֈ&u +�F�RӈF����шF����4��@nDukD�:r#Z�iD�ځ܈VjѨv 7���F4�ȍh�n�hR�@nD+5�hT;��JM#��F�RӈF��mԭM�ȍh���jr#Z�iD�ځ܈VjѨv 7���5�I����шF����4��@nD+5�hT;��F�ѤN�܈VjѨv 7���F4�ȍh���jr#Z��hP�@nD+5�hT;��JM#��F�RӈF��mԭM�ȍh���jr#Z�iD�ځ܈VjѨv 6� �F4���hE�F4�Ǎhe��hr#�J���ϱ6�?<��u���S#���z�����]O]}��>}���������?}�����>(w��z}���n�ϵ<���;��J��*������/Z��N��*UjZ��v �J��V)�ȭR��U�jr�Ԩ[���)�[�JM���V�R�*E��U�ԴJQ�@n�uk��:r�T�i��ځ�*UjZ��v �J��V)�ȭR�n�RR�@n�*5�RT;[� +�R4+�[��L���V�Q�V)�S �J��V)�ȭR��U�jr�T�i��ځ�*5��*%u +�V�R�*E��U�ԴJQ�@n�*5�RT;�[�F�Z��N��*UjZ��v �J��V)�ȭR��U�jr�Ԩ[���)�Z��\[�(~�V�G�Ŋ�V�2�*E��U*��V)�s �J��V)�ȭR��U�jr�T�i��ځ�*5��*%u +�V�R�*E��U�ԴJQ�@n�*5�RT;�[�F�Z��N��*UjZ��v �J��V)�ȭR��U�jb�Ԡi���q�*U�h�"Yq�*UfZ��v �J��V)�ȭR�n�RR�@n�*5�RT;�[�JM���V�R�*E��UjԭUJ�ȭR��U�jr�T�i��ځ�*UjZ��v �J���JI��U�ԴJQ�@n�*5�RT;[� +�R4+[��L��Ȏ�V�2�*E��U�ԴJQ�@n�*5�RT;�[�F�Z��N��*UjZ��v �J��V)�ȭR��U�jr�Ԩ[���)�[�JM���V�R�*E��U�ԴJQ�@n� +��U +�ȭR��U�jr�T�i��ځ�*U�h��Yq�*5��*%t +�V�R�*E��U�ԴJQ�@n�*5�RT;�[�F�Z��N��*UjZ��v �J��V)�ȭR��U�jr�Ԩ[���)�[�JM���V�R�*E��U�ԴJQ�@n�uk��:r�T�i��ځ�*U�h��Yq�*UfZ��v �J���JI��U�ԴJQ�@n�*5�RT;�[�JM���V�Q�V)�S �J��V)�ȭR��U�jr�T�i��ځ�*5��*%u +�V�R�*E��U�ԴJQ�@n�*5�RT;�[�F�Z��N��*U�h��Yq�*UfZ��v �J��V)�ȭR�n�RR�@n�*5�RT;�[�JM���V�R�*E��U*��V)�s �J��V)�ȭR��U�jr�T�i��ځ�*5��*%u +�V�R�*E��U�ԴJQ�@n�*5�RT;[�M��̎�V�"G�Ɋ�V�2�*E��U�߈T�R|��U��1�U����wv��<\�U:��=��h����_�ͧ_�3�������������o�^�~�������C����<���{rG]�����N/o��W��������/���8����^O//V]����>�.o��W����w��5��5�R׳j�|�yy �N�YT��u|�Z��6����Vj���j�oa�ځ�-l�n��&u +�oa+5��F��[�Jͷ�Q�@��B�j�ǫ��V�y�@�Y-@�y�@�Y-@�y�@�Y-@�y����j�S �(5��v �(5��v �(5��v �u[- u +���f������f������f������n��N��Z�Ԭ�ځ�Z�бZ�f��j�2�Z�h�j�Q��R�@^-PjVP�@^-PjVP�@^-PjVP�@^-0�Z@�ȫJ�j�ȫJ�j�ȫJ�j�ȫF�VH�y�@�Y-@�y�@�Y-@�y�@�Y-@�y����j�S �(s]-@�c�(p��Xq�Z�̬ ځ�Z ���P�@^-PjVP�@^-PjVP�@^-PjVP�@^-0�Z@�ȫJ�j�ȫJ�j�ȫJ�j�ȫF�VH�y�@�Y-@�y�@�Y-@�y�@�Y-@�q���Y- ��p�@�c��Ɋ��ef������f������n��N��Z�Ԭ�ځ�Z�Ԭ�ځ�Z�Ԭ�ځ�Z`�m���)�W���T;�W���T;�W���T;�W����:�j�R�Z�j�j�R�Z�j�j�B�j�����j�ǫ��j�ȫJ�j�ȫJ�j�ȫF�VH�y�@�Y-@�y�@�Y-@�y�@�Y-@�y����j�S �(5��v �(5��v �(5��v ��}���9�W���T;�W���T;W:VЬ8^-0�Z@�ȫJ�j�ȫJ�j�ȫJ�j�ȫF�VH�y�@�Y-@�y�@�Y-@�y�@�Y-@�y����j�S �(5��v �(5��v �(5��v �u[- u +���f��������4+�W���D;�W����:�j�R�Z�j�j�R�Z�j�j�R�Z�j�j�Q��R�@^-PjVP�@^-PjVP�@^-PjVP�@^-0�Z@�ȫJ�j�ȫJ�j�ȫJ�j�ȫF�VH�q�@�c��͊��ef������f������n��N��Z�Ԭ�ځ�Z�Ԭ�ځ�Z�Ԭ�ځ�Z ���P�@^-PjVP�@^-PjVP�@^-PjVP�@^-0�Z@�ȫJ�j�ȫJ�j�ȫJ�j����j�����HV�(3��v �P _��s����qw�`�9��oa?�.���o��} �������-�_��?����~���v��O��ޑ�9Ο�a�η��7�g̙��6��)�ˆDvV 9��HV�9j�HV�9:�HV6 ��!���BE�v!���BE�j!���BE�^!���BC�THd�a�P��Q�d�Q�P�k���aX&T���Xq�$4d��Dv�9Z�HVv9*�HV9��HV� �� ���AE�� ���AE�� ���AE�� ���AC�0Hd�a]P��-�d�aWP��*�d�aQP��'�d�aKА) �qPT�� r��������0,*ptQ�8l +r+9�a-P���d�a'P���d�a!P���d�aА)�qXT�h"Yq�T�"YqXT���"Yq��4d +�Dv��9�HVv�9�HV�9zHV���8JVU���6����}?����e?E����M?C��Gd�a�O���d�a�O���d�a�O��߇d�a�ϐ)��qX�S�h�!Yq��S��!YqX�S���!Yq��3d +}Dv��9�|HVv�9�|HV������F->�y�>����=E�����=E�����=C��Gd�amO����d�agO����d�aaO����d�a[ϐ)��qX�S�h�!Yq��S��!YqX�S���!Yq���V�r��z�"G;Ɋ�n�"G5Ɋ�b��^�ð�g���H�8��)r4�8��)r��8,�)rt�8l�2E<";kx�-<$+;x�<$+x��;$+�w�L��Ȏ��"G�Ɋ�ޝ"G�Ɋ�ҝ"G�Ɋ�Ɲ!S�#��n��ѶC��k�ĵj���0,�)p��P�8l�2%;";+v� ;$+�u��:$+�u��:$+�u�L��Ȏ�Z�"G�Ɋ�N�"G�Ɋ�B�"G�Ɋ�6�!S�#��J��ѤC��G��Q�C��D��ѡC��Ag���8��)qm�!�1�s +�9+�s��9$+[s�Li�Ȏ�ʜ"GcɊþ�"G]Ɋò�"GWɊæ� ���S��9ZrHVv�9*rHV�9�qHV���r���8E�f���8E�Z���8E�N�G�8#�B�Fu8�m8�>�aN�� +�b�an��ezp���|x������C�S��}�=�^�? ��8��<�[ �w���W�7{?����c!����:qO����or��_��w;q[+y��|x��^ʗ��_LA�⸚��tS�@n�u���:rAE�i��ځ�QQjJ*�v �T��� +��M�nUR�@.�(5mT;��*JMa��ʊR�YA���bԭ�B�������jrwE�)��ځ\_Qj�+�v 7X��UXH��Ģ̵ł��0�(pYP�8��(3]D;��,B}���:r�E�i��ځ�iQjJ-�v �Z��^����n�R�@.�(5�T;��-JM��䊋R�qA���bԭ�B��E���jr�E�)��ځ\wQj�.�v 6^�����E���ǽe���hr�E�龠ځ�~1�V!u +��RӀA���Ԕ`P�@��(5=T;��0Fݪ0�N�\�Qj�0�v �a��B�ȕ���jr+ƨ[-��)��1JM3��n�RS�A����яA��!c�Td��8.�(3-D;�{2JMQ�䪌RӕA��-cԭ.C�ȅ��1�jrgF�)͠ځ\�Qjz3�v 7g��UgH��<�ԴgP�@��(5T;�+4JM����P�k4�\�Qj�4�v wi��2 ��u��> �Ǎcn�B�@.�(5�T;�{5JM���j�RӭA��]cԭ^C����a�jr�F�)٠ځ\�Qjz6�v 7m��UmH��l�ԴmP�@��(5�T;�+7JM���֍Q�� �S o��� ������ ���e��hrǨ[��)�K8JM���RS�A�����tqP�@n�u��:r!G�i�ځ��QjJ9�v �r��^����n�R�@.�(5�T;��9JMA�䊎R��A���cԭ�C��E�����]e���hr]G���ځ��1�V�!u +�ҎR��A�����wP�@��(5�T;��;B}��:r�G�i�ځ��QjJ<�v �x����M�nUR�@.�(5mT;��<JM���J�R��A���c��z��8,�(r4{��8��(3�D;��=TO�|�����1�����w�^O�/X�G>?Ш���LJ���?~��_|s>��~+�������㿭���w���ߜ��v���~�����������ޕ���?�x�/}��������-D���n!~�ڿ����-DT;�o!u��H�ȷ��[��v �BTjn!�ځ|Q����j�-D��"���9n!"Yq|Q����h�-D��"�ȷ���B$u +�[�J�-DT;�o!*5�Q�@�����BD���Q�[��N�|Q����j�-D��"�ȷ��[��v �B4�v��)�o!*5�Q�@�����BD���B�-D4+o!2���8�����BD���Rs��[�J�-DT;�o!u��H�ȷ��[��v �BTjn!�ځ|Q����j�-D�n�I���Rs��[�J�-DT;�o!*5�Q�@��(��[��|Q����j�-D��"���:n!�Yq|ј�-DB�@�����BD���Rs��[�J�-DT;�o!u��H�ȷ��[��v �BTjn!�ځ|Q����j�-D�n�I���Rs��[�J�-DT;�o!*5�Q�@��h��"�S �BTjn!�ځxQ��"�Ƿ��[��v �B4�v��)�o!*5�Q�@�����BD���Rs��[�F�n!�:�-D��"�ȷ��[��v �BTjn!�ځ|Ѩ�-DR�@�����BD���Rs��[�J�-DT;�o!u��H���:n!�Yq|Q����h�-D��"�ȷ���B$u +�[�J�-DT;�o!*5�Q�@�����BD���P�o!�:�-D��"�ȷ��[��v �BTjn!�ځ|Ѩ�-DR�@�����BD���Rs��[�J�-DT;o!4���8����qɊ�[���-DD;�o!�-9q�c�������-������ߦ�_���8��@�q��?��~��������.o���=~~���|���r�_�O���/�>>�����n��{rG]��x_��Ooי�e��v���v>Ks={�v�������g��Qo��W�뻞=P;��z>]���g�q��)pG��^^���=P;pG}>]��Q�R׳j��kx�J]��x��ay �N�YT��uy �g��g��Q����7$���=P;pG]^�٪������5<ܜ:β:�����T׳j�ϧ�ͪ���w�����>z`V�}�r>�_���et +�Q�w�l���ځ;���.R]����.o��*���ځ�����RgY�w��5\���=P;pG]^�Y��g��Q���`���ځ����7*u�eu +�Q������3����>�^���=P;pG��������w�����'�g�eu +�Q�w���S�ځ�a*��S�Yq�a*e��T�v �ʨۇ�H���TJ͇�P�@�0�R�a*T;�?L��|� +��Su�0�S �J��0���Rj>L�j�S�ځ�a*�n�"u +�S)5�B���TJ͇�P�@�0�R�a*T;�?Le���T�N��a*e��B�c~�J���T(V�J��0�������@���TJ͇�P�@�0�R�a*T;�?L��|� +��Su�0�S �J��0���Rj&!P�@��Pj&!P�@��0�6 A�ȓJ�$�ȓJ�$�ȓJ�$����$�����HVOB(3��v OB(5��v OBu�� u +�I�f��I�f��I�f��I�n��N�< ��LB�ځ< ��LB�ځ< ��LB�ځ< a�m��)�'!��IT;�'!��IT;'!:&!Ь8��0d&!��8��Pf&!�@��Pj&!P�@��Pj&!P�@��0�6 A�ȓJ�$�ȓJ�$�ȓJ�$�ȓF�&!H�yB���@�yB���@�yB���@�yB���< ��LB�ځ< ��LB�ځ8 ��1 �f��$�1�IB�@��Pj&!P�@��Pj&!P�@��Pj&!P�@��0�6 A�ȓJ�$�ȓJ�$�ȓJ�$�ȓF�&!H�yB���@�yB���@�yB���@�y¨�$�S OB(5��v NB(tLB�Yq< ��LB ځ< a�m��)�'!��IT;�'!��IT;�'!��IT;�'!��MB�:�$�R3 �j�$�R3 �j�$�R3 �j�$�Q�IR�@��Pj&!P�@��Pj&!P�@��Pj&!P�@��0�6 A��� +�hVOB(3��v OB(5��v OBu�� u +�I�f��I�f��I�f��I��OB�:�$�R3 �j�$�R3 �j�$�R3 �j�$�Q�IR�@��Pj&!P�@��Pj&!P�@��Pj&!P�@��0h&!��8��P䘄@��xB���@�yb�@MB�s����ywb�9��S���x|�I�q��^3 ����o�O_�,������������ +q=�>��'̡��xgbLG|� �E�j��R�E�j��A�EAf���2�E�h��R�E�j��R�E�j��Q�- +R�@ޢPj�(P�@ޢPj�(P�@ޢPj�(P�@ޢ���s oQ(5[�v oQ(5[�v oQ(5[�v oQuۢ u +�- +�f���- +�f���- +��- +4+��(��mQ:��R�E�j��R�E�j��R�E�j��Q�- +R�@ޢPj�(P�@ޢPj�(P�@ޢPj�(P�@ޢ0�EA��[J���[J���[J���[Fݶ(H�y�B�٢@�q�B�c�͊�- +ef���- +�n[�N��E��lQ�ځ�E��lQ�ځ�E��lQ�ځ�Ea�m���)��(��- +T;��(��- +T;��(��- +T;��(��mQ�:��R�E�j��R�E�j��R�E�j��Q�- +R�@ڢP�E���0ܢP�آ@��x�B�٢@�y�B��[��E��lQ�ځ�E��lQ�ځ�E��lQ�ځ�Ea�m���)��(��- +T;��(��- +T;��(��- +T;��(��mQ�:��R�E�j��R�E�j��R�E�j��A�EAf���"���[����[J���[Fݶ(H�y�B�٢@�y�B�٢@�y�B�٢@�y�¨��S oQ(5[�v oQ(5[�v oQ(5[�v oQuۢ u +�- +�f���- +�f���- +��- +4+�(�- +";��(��- +D;��(��- +T;��(��- +T;��(��mQ�:��R�E�j��R�E�j��R�E�j��Q�- +R�@ޢPj�(P�@ޢPj�(P�@ޢPj�(P�@ޢ���s oQ(5[�v oQ(5[�v nQ(tlQ�Yq�Ea�m���)��(��- +T;��(��- +T;��(��- +T;��(��mQ�:��R�E�j��R�E�j��R�E�j��Q�- +R�@ޢPj�(P�@ޢPj�(P�@ޢPj�(P�@ޢ0�EA��[J���[ +[hVoQ(3[�v oQuۢ u +�- +�f���- +�f���- +�f���- +�n[�N��E��lQ�ځ�E��lQ�ځ�E��lQ�ځ�Ea�m���)��(��- +T;��(��- +T;��(��- +T;��(��mQ�:��B���[����[J���[Fݶ(H�y�B�٢@�y�B�٢@�y�B�٢@�y�B��[��E��lQ�ځ�E��lQ�ځ�E��lQ�ځ�Ea�m���)��(��- +T;��(��- +T;��(��- +T;�(�- +2;�(9�(��8ޢPf�(�@ޢ�e�E�ϱnQ|xآ��i���[��S�_���8��@����1�����?�����������O�������ث��o�_���>����~���+�/�����1?�y���_��[�����������[ؤN�t[��-l?��-l�[�(V��Vfna#ځ|[�ﷰA���Rs��[�J�-lT;�oa+5��Q�@��m��6�S ��Vjna�ځ|[����j�-l��6�ȷ�����&u +�[�J�-lT;�oa+5��Q�@������F���As�̎�[؊����8������F���Rs��[�F�na�:�-l��6�ȷ���[بv ��Vjna�ځ|ۨ�-lR�@������F���Rs��[�J�-lT;�oau��M�ȷ���[بv ��Vjna�ځx[��6���� �[�Dv��Vfna#ځ|[����j�-l��6�ȷ�����&u +�[�J�-lT;�oa+5��Q�@������F���Q�[ؤN�|[����j�-l��6�ȷ���[بv ����-lP�@������F���Rs��[� +��Ѭ8��m��6�S ��Vjna�ځ|[����j�-l��6�ȷ�����&u +�[�J�-lT;�oa+5��Q�@������F���Q�[ؤN�|[����j�-l��6�ȷ���[بv ��6�v��)�oa+5��Q�@����q͊�[���-lD;�oau��M�ȷ���[بv ��Vjna�ځ|[����j�-l�n��I���Rs��[�J�-lT;�oa+5��Q�@��m��6�S ��Vjna�ځ|[����j�-l��6�ȷ�����&u +�[� +��Ѭ8������F���Rs��[�F�na�:�-l��6�ȷ���[بv ��Vjna�ځ|[�ﷰA���Rs��[�J�-lT;�oa+5��Q�@��m��6�S ��Vjna�ځ|[����j�-l��6���� �[�dv��V丅�d��-le�6�ȷ����[���-������㟻����_/x{y{���������z��?^���i���_�>.]���?�5���������ϟ������������������#����_�?ٗ�o�ǽ����;��m�~��'|�xG�y�]��xG�y�ݨ��;�S O�+5�v O�+5�v O�+5�T;��F���N�T.P�Z.@�c�8�(V���r������@��\�ԔP�@.(5�T;��JM����r�Q�r�S ���r�����\�jr�@�)�ځ\.0�V. u +�r�RS.@��\�ԔP�@.(5�T;�M��̎�r�"G��Ɋ�r�2S.@��\�ԔP�@.u+�:r�@�)�ځ\.Pj��v ���r����n�R�@.(5�T;��JM����r�RS.@��\`ԭ\@�����\�jr�@�)�ځX.P�(�YqX.0d�Dv���r�����\�jr�@�)�ځ\.0�V. u +�r�RS.@��\�ԔP�@.(5�T;��F���N�\.Pj��v ���r�����\�jr�@���P�@.(5�T;��JM����r�BG��͊�r�1�r�S ���r�����\�jr�@�)�ځ\.0�V. u +�r�RS.@��\�ԔP�@.(5�T;��F���N�\.Pj��v ���r�����\�jr���[���)��JM����r�BG��͊�r�2S.@��\`ԭ\@�����\�jr�@�)�ځ\.Pj��v ����H��\�ԔP�@.(5�T;��JM����r�Q�r�S ���r�����\�jr�@�)�ځ\.0�V. u +�r�BG��͊�r�2S.@��\�ԔP�@.u+�:r�@�)�ځ\.Pj��v ���r������@��\�ԔP�@.(5�T;��JM����r�Q�r�S ���r�����\�jr�@�)�ځX.0h�dv�9�HV���r����+�\�ϱ�><���c����������_�?�/ ��O/�a�O��ϟ�@����39��@��~���������X�����ω��f������_���|z���2�qr���|��������ރ�Q׳j�ϧ��S׳j��@���=P;�zY^ãT�YV��uy o��Q����w��5���G��g��Q��p��z�@����uy o��Ѩ�,�S��z=����G��g��Q�O�7��g��Qo�חW��g���>�O��RgY�w��5��^���C.���,���ځ;�����=P;�������17β:��[��s��ځ;���V]����.��A��g���>�O�W�cn�eu +�Q���ͪ���w����E�1b�=P;pG��n����8{�v�}u�s��T�YV��uy ����8{�v��������3����.��b���ځ������ףlv�������3����.�������w��������g�����O����3β:���ˋU׳j�ϧ˳�17����.��I��g��_~X^ãSs�9pG]^��Y����w��5\^���=P;pG]^�٪������5<�s9����^Oϯ�R]����>��7��g��Qo�g����Yq����t~q?pr��)pG]���U׳j��;x�Hu={�v�����ǫT׳j�W��k�Ju�eu +�Q��py��z�@��uy g�g�=P;pG]^ÃU׳j�Wϧ�w|r��)pG���n��8{�v���|zx��z�@���vz�g���>-��I��gY�w��5<Zu={�v��������Yq;�����8{�v�}�yy����N�;������8{�v�������g��Qo��W�cn�=P;pg����z��<β:�c�M��~C�y�M��~C�y�M��~C�y�ͨ���S o�)5�o�v o�)5�o�v o�)5�o�v o�u�~#u +��7e��o(~��7��7+��ߔ��7D;��߄������oJ�����oJ�����oJ�����oFݶ�H�y�M��~C�y�M��~C�y�M��~C�y�ͨ���S o�)5�o�v o�)5�o�v o�)5�o�v n�4�odvn�)rl�!Yq����l�!ځ����l��ځ��f�m���)��ߔ��7T;��ߔ��7T;��ߔ��7T;��ߌ�m��:���R���j���R���j���R���j���Q��7R�@�~Sj��P�@�~Sj��P�@�~S��~C��p�͐�~#��x�M��~C�y�M��~C�y�M��~C�y�ͨ���S o�)5�o�v o�)5�o�v o�)5�o�v o�u�~#u +��7�f� ���7�f� ���7�f� ���7��o��:���R���j���R���j���B�����o�ܶ��y�M��~C�y�M��~C�y�M��~C�y�ͨ���S o�)5�o�v o�)5�o�v o�)5�o�v o�u�~#u +��7�f� ���7�f� ���7�f� ���7�n�o�N�����l��ځ���б��f����2���h���Q��7R�@�~Sj��P�@�~Sj��P�@�~Sj��P�@�~3��F���oJ�����oJ�����oJ�����oFݶ�H�y�M��~C�y�M��~C�y�M��~C�y�ͨ���S n�)tl��Yq����l�!ځ����l��ځ��f�m���)��ߔ��7T;��ߔ��7T;��ߔ��7T;��߄������oJ�����oJ�����oJ�����oFݶ�H�y�M��~C�y�M��~C�y�M��~C�q�͠�~#��p�M�c� Ɋ��7ef� �����q3���ϱn�}x�������s�o�=>������o������������W�������{���H�?!Tղendstream +endobj +1225 0 obj << +/Type /Page +/Contents 1226 0 R +/Resources 1224 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 794 0 R +/Annots [ 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R ] +>> endobj +1228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 708.244 172.562 715.098] +/Subtype /Link +/A << /S /GoTo /D (variant-perforce) >> +>> endobj +1229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 708.244 537.983 715.098] +/Subtype /Link +/A << /S /GoTo /D (variant-perforce) >> +>> endobj +1230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 693.235 165.868 702.147] +/Subtype /Link +/A << /S /GoTo /D (variant-sourceforge) >> +>> endobj +1231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 693.235 537.983 702.147] +/Subtype /Link +/A << /S /GoTo /D (variant-sourceforge) >> +>> endobj +1232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 679.93 229.548 686.914] +/Subtype /Link +/A << /S /GoTo /D (gfdl) >> +>> endobj +1233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 679.93 537.983 686.914] +/Subtype /Link +/A << /S /GoTo /D (gfdl) >> +>> endobj +1234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 664.608 158.744 671.462] +/Subtype /Link +/A << /S /GoTo /D (gfdl-0) >> +>> endobj +1235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 664.608 537.983 671.462] +/Subtype /Link +/A << /S /GoTo /D (gfdl-0) >> +>> endobj +1236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 651.656 268.303 658.511] +/Subtype /Link +/A << /S /GoTo /D (gfdl-1) >> +>> endobj +1237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 651.656 537.983 658.511] +/Subtype /Link +/A << /S /GoTo /D (gfdl-1) >> +>> endobj +1238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 638.705 202.938 645.559] +/Subtype /Link +/A << /S /GoTo /D (gfdl-2) >> +>> endobj +1239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 638.705 537.983 645.559] +/Subtype /Link +/A << /S /GoTo /D (gfdl-2) >> +>> endobj +1240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 624.07 216.328 632.608] +/Subtype /Link +/A << /S /GoTo /D (gfdl-3) >> +>> endobj +1241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 624.07 537.983 632.608] +/Subtype /Link +/A << /S /GoTo /D (gfdl-3) >> +>> endobj +1242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 612.802 183.083 619.656] +/Subtype /Link +/A << /S /GoTo /D (gfdl-4) >> +>> endobj +1243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 612.802 537.983 619.656] +/Subtype /Link +/A << /S /GoTo /D (gfdl-4) >> +>> endobj +1244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 599.851 227.636 606.705] +/Subtype /Link +/A << /S /GoTo /D (gfdl-5) >> +>> endobj +1245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 599.851 537.983 606.705] +/Subtype /Link +/A << /S /GoTo /D (gfdl-5) >> +>> endobj +1246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 586.899 253.379 593.753] +/Subtype /Link +/A << /S /GoTo /D (gfdl-6) >> +>> endobj +1247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 586.899 537.983 593.753] +/Subtype /Link +/A << /S /GoTo /D (gfdl-6) >> +>> endobj +1248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 573.948 315.107 580.802] +/Subtype /Link +/A << /S /GoTo /D (gfdl-7) >> +>> endobj +1249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 573.948 537.983 580.802] +/Subtype /Link +/A << /S /GoTo /D (gfdl-7) >> +>> endobj +1250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 560.996 174.226 567.85] +/Subtype /Link +/A << /S /GoTo /D (gfdl-8) >> +>> endobj +1251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 560.996 537.983 567.85] +/Subtype /Link +/A << /S /GoTo /D (gfdl-8) >> +>> endobj +1252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 547.925 173.32 554.899] +/Subtype /Link +/A << /S /GoTo /D (gfdl-9) >> +>> endobj +1253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 547.925 537.983 554.899] +/Subtype /Link +/A << /S /GoTo /D (gfdl-9) >> +>> endobj +1254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 535.093 287.142 541.948] +/Subtype /Link +/A << /S /GoTo /D (gfdl-10) >> +>> endobj +1255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 535.093 537.983 541.948] +/Subtype /Link +/A << /S /GoTo /D (gfdl-10) >> +>> endobj +1256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [95.641 520.085 271.65 528.996] +/Subtype /Link +/A << /S /GoTo /D (gfdl-howto) >> +>> endobj +1257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 520.085 537.983 528.996] +/Subtype /Link +/A << /S /GoTo /D (gfdl-howto) >> +>> endobj +1258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 504.877 109.369 513.763] +/Subtype /Link +/A << /S /GoTo /D (glossary) >> +>> endobj +1259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 504.877 537.983 513.763] +/Subtype /Link +/A << /S /GoTo /D (glossary) >> +>> endobj +1227 0 obj << +/D [1225 0 R /XYZ 71.731 729.265 null] +>> endobj +1224 0 obj << +/Font << /F27 800 0 R /F32 807 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1278 0 obj << +/Length 10703 +/Filter /FlateDecode +>> +stream +xڕ�O�\�A��?���B7s��dR1 � `!�Va�.K����_�>���w��baw�o�k{dg���ծ����.�C�����ϧW������w���k=q<���i_~��|{:\���������|�ů��^�w��t{���M�������?��������������o��~��?����������������N_��z��ݙ�5\^����p�t��%߮K�O��_�����?����;x��^���ެ����_}�����}�S=�f}��_����_/�a=ҋ^���<�Iݯ��|�O=s��Y^�������?w/�z��np���9U����yY˟������>8P�S8Bu;;Q}�z(����,���@-�a���D���Z�z +���D���Z�.U�����u��ΙZϲ� ��r�^Bu;;Q}p����%U����u9��m����D����<��N��,���@-�ᘪ�ى��<��o�щis�<�C��S�NP|���3؇j=�j78P�3X÷�zv���@-Oa���ى���o��\=;Q}�zٕ_ц׳�v���/�����>8PO�|�6W�NT��1�·�zv���c�Z�1T�YV���Z�!|��g'������\=;Q}p��ǰ��vv���c�V�.|��gY�jy��tr"ޏ ��rM���ND����p ���� ���n�\/�[���C���T��NT��)������>8P�c8Cu;;Q}𱺖�p�z��np��ǰ?��vv���@-�a=��vv���@-�a���ىꃏ��n�ܲ78�e�����;��vv���@=-�K�ng'���?�Bu;;Q}�z(�!��i;ʦ� ��¿V����dy��54���jy���ݦ���>�X=�G��z��np������q��D���ZC��!tv���@�.�-U������r���Գ�v������ �ى����ϩ����>8P�c8��q��D����<�c�nSϲ� �������>8P�c؇�q��D���ZC�7���Ĵ���<���f;ʤ� ���v�����>8PO����ֳ��u�]Su;;Q}�z�-�K�Wϲ� �ò;��6��D���Z�)U���jy��=����>�X���p�z��np��ǰ���ى��<�5|��g'���v�����>�P=�v����,���@�/������D���zZ��T��NT��%����Ĵ���Z�A�֪��v��<�S�ng'�����P��NT��)�;�ىꃏ�}y�P�gY�jy�1T���jy��Ntv���@�,�[�ng'�>V��p���t��np��k�����>8PO�ᜪ�ى��<�S�6W�NT|��c?v���v��<�C�ng'���¿5mG'�� ���������<�5T�YV���Z�A�����>8PO�>�؉�NT���rM���D����y��Ï��,���@�/��c':;Q}p���pJ���D���ZC�����>�X���~�DgY�jy�T��NT��1�;�ى��<��c':;Q}�z�-�-T�YV����_�)���Ĵ�yZ���':;A}p�^��%U���������,���@-O!����NT��1Su;;Q}p���~�Dg'�>TO����A[gQ�jyk�ng'�������D���zYN�g�ىꃏ�u���`BgY��~9�>�ى����Ω����>8P�c� ���>�Xݗ����e��dyǐ�|tB�܀, �%tv���@-��Otd�W��t]f�pW�ܿ����u�^�rR�o뿊���j|�;brZ�l��&�������l�������_���^���������_~���7���?���e������x��ze�-��DK>�~������U��3R�|�ꃜ|F��OT}���Dm�'�� '����U��3R�|�ꃜ|F��OT}���Dm�'�� '����U��3R�|�ꃜ|F��OT}���Dm�'�� '����U��3Bk��q��J>�AN>�%��v��|F��OT}���HU�r��J>Q�AN>�%��v��|F��OT}���HU�r��J>Q�AN>�%��v��|F��OT}���HU�r��J>Q�AN>�%��v��|F�|�x?��g��E���32�|"ꃜ|�s� j?��g�*�D�9��T%��� '����U��3Q[�Ij7��g�*�D�9��T%��� '����U��3Q[�Ij7��g�*�D�9��T%��� '����U��3A�|��s�|FdM>��9N>#S�'�>��g�*�D�9�LԖ|�� r��J>Q�AN>#U�'�>��g�*�D�9�LԖ|�� r��J>Q�AN>#U�'�>��g�*�D�9�LԖ|�� r��J>Q�AN>#U�'�>��g���M���3!�|�s�|F��OD}���HU�r��J>Q�AN>�%��v��|F��OT}���HU�r��J>Q�AN>�%��v��|F��OT}���HU�r��J>Q�AN>�9����3R�|�ꃜ|F��OT}����'�6��gb���n���HU�r��J>Q�AN>#U�'�>��g����n���HU�r��J>Q�AN>#U�'�>��g����n���HU�r��J>Q�AN>#U�'�>��g����n���HU�b��5�D��8��L%��� '��ڒOR�AN>#U�'�>��g�*�D�9��T%��� '��ڒOR�AN>#U�'�>��g�*�D�9��T%��� '��ڒOR�AN>#U�'�>��g�*�D�9��T%��� '��ڒOR�AL>#�&�h�'����Q��3R�|�ꃜ|&jK>I�9��T%��� '����U��3R�|�ꃜ|�s� j?��g�*�D�9��T%��� '����U��3Q[�Ij7��g�*�D�9��T%��� '����U��3A�|��s�|FdM>��9N>#S�'�>��'Ɖ��_ǖ|��a�|�_G�|�9�<�C�c�Y�l��a��N�O�|���o��S�0�������pZ���Q{y8?���T1&��Z�y��ǘ/_Ę�� ǘ��U�3Q[�Ij7�1f�*�D�9ƌTŘ�� ǘ��U�3Q[�Ij7�1f�*�D�9ƌTŘ�� ǘ��U�3Q[�Ij7�1f�*�D�1ƌ�c�iscF�bLD}�c�Dm1&�� ǘ��U�3Rc��cF�bLT}�c�Dm1&�� ǘ��U�3Rc��cF�bLT}�c�Dm1&�� ǘ��U�3Rc��cF�bLT}�c�Dm1&�� Ř��Ř(ޏa��5�D��8ƌLŘ�� ǘ��c��r���1Q�A�1#U1&�>�1f�*�D�9�L�c�� r���1Q�A�1#U1&�>�1f�*�D�9�L�c�� r���1Q�A�1#U1&�>�1f�*�D�1�LPŘd�ƘYcL$m�c��T���r���1Q�A�1�Ř�v�cF�bLT}�c�HU���r���1Q�A�1�Ř�v�cF�bLT}�c�HU���r���1Q�A�1�Ř�v�cF�bLT}�c�HU���b��5�D��0�LHŘD�ǘ��Q�3Rc��cF�bLT}�c�Dm1&�� ǘ��U�3Rc��cF�bLT}�c�Dm1&�� ǘ��U�3Rc��cF�bLT}�c�@}�1A�9ƌTŘ�� ǘ��U�3Bk����q���-�$��3Rc��cF�bLT}�c�HU���r���-�$��3Rc��cF�bLT}�c�HU���r���-�$��3Rc��cF�bLT}�c�HU���r���-�$��3Rc��cFh�1Ѵ9�1#S1&�>�1f����n�c�HU���r���1Q�A�1#U1&�>�1f����n�c�HU���r���1Q�A�1#U1&�>�1f����n�c�HU���r���1Q�A�1#U1&�>�1f����nc��1&�6�1fd*�D�9ƌTŘ�� ǘ��bLR�A�1#U1&�>�1f�*�D�9ƌTŘ�� ǘ��c��r���1Q�A�1#U1&�>�1f�*�D�9�L�c�� r���1Q�A�1#U1&�>�1f�*�D�1�LPŘd�ƘYcL$m�c��T���r�I�`c���b̻�q���u�ՙ���Uy�����]j����6��>~z�����?}���wy���?�����_>=}�yϹ�ݙQ�#[��������ӻ~�����s�8��~zQo����������Û���o��eW~�_������:zv�@����P��2.Y�A,3���� ��ZDV}�HU��j7�b���U�1Sk�Ȫb����@d��@�T��v�X fj-Y�A*3t+ٴ9,3���� ����n�L�"�>�b���U�1Sk�Ȫb��*Q��@��Z ��X fj-Y�A,3���� ����n�L�"�>�b���U�1Sk�Ȫb��*Q��@���"��cT f�V �hsX ff-�A,�����X fj-Y�A,3���� ��ZDV}�HU��j7�b���U�1Sk�Ȫb����@d��@�T��v�X fj-Y�A,3���� ��ZDV}� +��"�>GbFn"�6�bf��Q�1Sk�Ȫb��*Q��@��Z ��X fj-Y�A,3���� ����n�L�"�>�b���U�1Sk�Ȫb��*Q��@��Z ��X fj-Y�A*3t+ٴ9*#��H���YDF}�L�"�>�b���U�1RU �� b����@d��@��Z ��X fj-Y�A,#U"�� ��ZDV}�L�"�>�b���U�1Q[�Hj?�b���U�1Sk�ȪR���[�Ȧ�a��*��@��Z ��X fj-Y�A,3���� ����n�L�"�>�b���U�1Sk�Ȫb��*Q��@��Z ��X fj-Y�A,3���� ����n�L�"�>Hb�n"�6�bf��Q�1RU �� b����@d��@��Z ��X fj-Y�A,#U"�� ��ZDV}�L�"�>�b���U�1RU �� b����@d��@��Z ��X fj-Y�A,#U"�� ���l���YDF}�L�"�>�b��@D��1Sk�Ȫb����@d��@��Z ��X &j+I��@��Z ��X fj-Y�A,3���� ����n�L�"�>�b���U�1Sk�ȪR���@D��@�ȭ@d��@��Z 2�X b�6/�u|>s�2�a�H��_�u���ӿ �<p;�Ձ��?1���pzu-��O�֧Oc= ����ӻo�y���v���t��w������o~~����_|�ww\NOj/��Ѭ�c�Q?�+?��>������姉w��^���v�I�{L��R�Ed=��� �C���e�v�I����ې2is�ß��'�|�纬�5�Q}n@n�z��[T��9�Ո�_������Fd��T$m�=5![���q���ꖉ�9��R�2�6��rB�X&��WȖ+�s+'�Ze"m�K�T�L��q�������9n��%�@�� �>�H��:9k�L���� �2�D��.9 [���q���j���9.�RA2�6�9rB�F&��EȖ"�s"'�:d"m�+�T�L��q���*���9����@��� ���H���8!is�'��c"m���l�1�>G�qn�1qwSX'Z������8U�hs�����xLvs'�c"m��T`L��q^������9n����@��� ���H��8!is�'��b"m�{�l91�>�1qB�%&��$NH��D�g� ���H�Æ8�hc'^�ɻ�z8�hs�'��a"m���l�0�>��pB�&��NH�D��� �Z�H��V8 [*��q(��ꄉ�9��R�0�6ljpB�&��Ȗ�s'��`"m����TL��a��� +&�~���S��q���I�9��R10�6�)pB�&��Ȗ�s'�`"m���T�L��q������9n���@��� ��H���7!�is��&��_"m�{�9�����n�c߄T�K��q雐 +}��9�|�V�ޏq��-���8�MH��D� ���H��7!U�is��d�z��9�zRM/�6�EoB*�%��8�MHռD����R^ }�CބT�K��qś��x��9NxR/�6��n@�|H��x7!��isX�&b w ��l7U�hs��dKv��9vR�.�6ǵnB*�%��8�MH��D�w��2] }�#݄T�K��q��� +t��9�sRu.�6�mn@�4H��07!��is\�&��\"m��܄T�K��q��-���0�M���x?�%n*�%��8�MHU�D�7��\ }�܄TK��q}���o��9NoR�-�6���|�n�d7��mB��%�游MH�D�� �ږH���6 [j��qh���l��9�lR�-�6ljmB��%�氯 D���Ƶ�W�Z��Ǹ�M@��$�g�ö3�j�ElQ��k8�M��EtI��Im�'��zæ�yz=�������w���c���?l��������<���3��gn� ~������S3�X��/�`���������%�e���a��khng'���rإ�vv���@�.�[��>�X����鯈D�gY��a�\Ru;;Q}p������'�H��NT��1<��������>8���c8f�����P��NT�5�T]���5��{P�A�) Q�U�v�|Y@���T}���T]���Z�@���ր�l�� �����P�A�; Ruy��>��D��@���DmW�� �%��[P�A�G Ru���>�W D��@��6�Dm� �� ���P�A�S Ru���>�� +D��@��f�DmW�� �����P�A�_ B�h�_1��c�Q�[�]3@j7� D�n@����H�e�� _7��o�U��]9@j7ȗD�n@��ށH���� _=��{�U���]?@j7�D�n @���H�%�� _C����U��]E@j7H�D�v��cxA� P�9�� 2u'�>ȷ�����|1A��fT}��&�T]N������� P�A�� Q��v�|IA��T}��)�T]T���U��� +P�A�� Q�u�v�|aA���T}��,�T]Z�����{P�A�� Auu�>��Dd���I���"S �|�A��T}�o1H�v��� _d����U�"U���|�A��>T}�o4H�v��� _j����U�{ "U��|�A��nT}�o7H�v��� _p����U�;"U���x�A��{д9�� !u��>ǗD�n;@����HՅ�� _y����U�[�]{@j7�D�n>@���H���� _����U��]�@j7ȗ D�nA@���H�E�� _���U����:P�A�!Ru#�>�w"D�.E@��Z���"�is|3Bb����r�H���� ߏ�� U�+"Uw$��|KB��kH����H�M �� ߕ��,U��"U�%��|cB��+H��҄Hխ �� ߛ��8U�"Uw'��|{B���H���H� +�� ޡ��4m��Q�Lݣ���M +�ڮR ���"U�)��|�B��BT}��T�Tݩ��� +�ڮU ��"U7+��|�B��rT}��W�Tݯ��� �ڮX ��K"U�,��|�B��T}��Z�Tݵ���m�ڮ[ ��"�������K�A�v!Ru��>�7/$j�z��n�/_�Tݾ������P�A��!Ru�>ȷ0��5���|C��&T}��b�T]ƀ��u���P�A��!Qە�v�|)C��VT}��e�T]̀������P�A��!Au=�>�4Dd��I��;"S�4 �|M�6�Ӏ�c����f��M ����}���������vU�~zUç����y���{���ᇗ������՝���o�x�� +��շ0�����/�lT}���HU���r�� +�Q�A���٤v�fG��lT}���HU���b��5�F��8�N�f� r�� +�Q�A�#Ua6�>�av�*�F�9�N�f�� r�� +�Q�A�#Ua6�>�av�*�F�9�N�f�� r�� +�Q�A�#Ua6�>�av�*�F�9�N�f�� r�� +�Q�A�#���h��ّ�0Q�0;Q[�Mj7�av�*�F�9̎T�٨� �ّ�0U�0;Q[�Mj7�av�*�F�9̎T�٨� �ّ�0U�0;Q[�Mj7�av�*�F�9̎T�٨� �ّ�0U�0;Q[�Mj7Havdna6��cfG` �Q�9�#Sa6�>�av�>�٠��fG��lT}���HU���r�� +�Q�A���٤v�fG��lT}���HU���r�� +�Q�A���٤v�fG��lT}���HU���r�� +�Q�A�Ta6�>�avD�0I��0;2f#�fG��lT}���Dma6�� �ّ�0U�0;Rf��fG��lT}���Dma6�� �ّ�0U�0;Rf��fG��lT}���Dma6�� �ّ�0U�0;Rf��fGh �Ѵ9�Ra6�>�avd*�F�9̎T�٨� �ّ�0U�0;Q[�Mj7�av�*�F�9̎T�٨� �ّ�0U�0;Q[�Mj7�av�*�F�9̎T�٨� �ّ�0U�0;P��lP�A�#Ua6�>�av�*�F�1̎�f�isf'f� �9̎T�٨� �ّ�0U�0;Rf��f'j�I�9̎T�٨� �ّ�0U�0;Rf��f'j�I�9̎T�٨� �ّ�0U�0;Rf��f'j�I�9̎T�٨� ��Z�l4m����T���r���-�&��0;Rf��fG��lT}���HU���r���-�&��0;Rf��fG��lT}���HU���r���-�&��0;Rf��fG��lT}���HU���r���-�&��0;Bk����q�� +��A�#Ua6�>�av��0��n���HU���r�� +�Q�A�#Ua6�>�av�>�٠��fG��lT}���HU���r�� +�Q�A���٤v�fG��lT}���HU���r�� +�Q�A�Ta6�>�avD�0I��0;2f#�f�S�(��ױ����8���.�^9�>����f�#[�}���?������?������?����E�˯�G-���n_~~���_~���������瑪/?G����#U_~����scj?ȍ}���G����T5��� 7����U��>Q[cOj7ȍ}���G����T5��� 6�Z{4m���l�=�� 7����U��>R�أ���G�{T}��Dm�=�� 7����U��>R�أ���G�{T}��Dm�=�� 7����U��>R�أ���G�{T}��Dm�=�� 7����U��>Bkc���qc�j��An��5��v���G�{T}��HUc��rc�j�Q�An��5��v���G�{T}��HUc��rc�j�Q�An��5��v���G�{T}��HUc��rc�j�Q�An��5��v���G��أx?��}��E���>2��#����scj?ȍ}���G����T5��� 7����U��>Q[cOj7ȍ}���G����T5��� 7����U��>Q[cOj7ȍ}���G����T5��� 7����U��>A�ؓ�s��Gdm쑴9n�#S�=�>ȍ}���G���O��ؓ� rc�j�Q�An�#U�=�>ȍ}���G���O��ؓ� rc�j�Q�An�#U�=�>ȍ}���G���O��ؓ� rc�j�Q�An�#U�=�>��}���M���>!���s��G�{D}��HUc��rc�j�Q�An��5��v���G�{T}��HUc��rc�j�Q�An��5��v���G�{T}��HUc��rc�j�Q�An�������>R�أ���G�{T}���=�6Ǎ}b�ƞ�n��HUc��rc�j�Q�An�#U�=�>ȍ}��ƞ�n��HUc��rc�j�Q�An�#U�=�>ȍ}��ƞ�n��HUc��rc�j�Q�An�#U�=�>ȍ}��ƞ�n��HUc��bc���G�渱�L5��� 7���{R�An�#U�=�>ȍ}���G����T5��� 7���{R�An�#U�=�>ȍ}���G����T5��� 7���{R�An�#U�=�>ȍ}���G����T5��� 7���{R�Al�#�6�h�7����Q��>R�أ���'jk�I����T5��� 7����U��>R�أ����scj?ȍ}���G����T5��� 7����U��>Q[cOj7ȍ}���G����T5��� 7����U��>A�ؓ�s��Gdm쑴9n�#S�=�>ȍ�8�{|[c�����~�:���w��톑��\�����{��ꉧ���>�^����rhlendstream +endobj +1277 0 obj << +/Type /Page +/Contents 1278 0 R +/Resources 1276 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +/Annots [ 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R ] +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 677.798 217.314 686.71] +/Subtype /Link +/A << /S /GoTo /D (install-mysql-packets) >> +>> endobj +1281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 677.798 537.983 686.71] +/Subtype /Link +/A << /S /GoTo /D (install-mysql-packets) >> +>> endobj +1282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 664.847 220.721 673.758] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-errors) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 664.847 537.983 673.758] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-errors) >> +>> endobj +1284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 651.896 223.361 660.807] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-patch) >> +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 651.896 537.983 660.807] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-patch) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 586.265 230.215 595.176] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules-cpan) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 586.265 537.983 595.176] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules-cpan) >> +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 573.313 204.532 582.225] +/Subtype /Link +/A << /S /GoTo /D (http-apache-htaccess) >> +>> endobj +1289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 573.313 537.983 582.225] +/Subtype /Link +/A << /S /GoTo /D (http-apache-htaccess) >> +>> endobj +1290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 560.362 178.55 569.273] +/Subtype /Link +/A << /S /GoTo /D (upgrade-cvs) >> +>> endobj +1291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 560.362 537.983 569.273] +/Subtype /Link +/A << /S /GoTo /D (upgrade-cvs) >> +>> endobj +1292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 547.41 199.292 556.322] +/Subtype /Link +/A << /S /GoTo /D (upgrade-tarball) >> +>> endobj +1293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 547.41 537.983 556.322] +/Subtype /Link +/A << /S /GoTo /D (upgrade-tarball) >> +>> endobj +1294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 534.459 189.05 543.37] +/Subtype /Link +/A << /S /GoTo /D (upgrade-patches) >> +>> endobj +1295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [528.02 534.459 537.983 543.37] +/Subtype /Link +/A << /S /GoTo /D (upgrade-patches) >> +>> endobj +1279 0 obj << +/D [1277 0 R /XYZ 71.731 729.265 null] +>> endobj +10 0 obj << +/D [1277 0 R /XYZ 214.067 703.236 null] +>> endobj +14 0 obj << +/D [1277 0 R /XYZ 235.902 611.702 null] +>> endobj +1276 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1307 0 obj << +/Length 2637 +/Filter /FlateDecode +>> +stream +xڍYY��~�_1�U5��%*~�{�&eo��c�R�<@$$1C +@zV���u�&5U�F���}|�һ�һU�r�d�8[wU�&��Aχ7�H,��8+2�ot|���n>�������Y~�%�X�=o�Y�<����s���q��v�y�*�4����=����3�ahj=����Hi����@� ̞��jE��8(y��YZDG������lgYYש��F����x�\��5�����UJ�>i�5ޣ�<_%�&_���)�뚙��o�S&�q�,�{��f���f1e��1�ٺ�Y�߳�$�m5t���L�]`�N�������_�x��D�o4[�����~j*m��Eg�u��,M�H;�6r��H��ʐq��*>B���4r6O#��ði�Gs��F�т��=��Z������hG�4�G��@�����M�g�X�df�V�0�Qh>��EW8��O�A������B\��t��-��y����ғ��N� YP���T�2��f����{���:��#�/[��χ�5U;Ժ-�˛�Ǩ���Mw�|u3��Af>����ť"����M�|����{�. ��o�d�9��"�;�S���"^�����e�G�e�|X��H*��r3K�d�rn��z�t��^�� �錧@���s8�w��M۪���n�-�R`#�t 9+_��2�i�OxЋEt�E�W�*�k��i���A{rf�s�L�:|ݘq���G����%�����"�$X�� �}M!��\c�\�fRM�}[p��u�c�e���zh� +�\A����M�Ѧ�W�2V�4�$���� +-٪���: ��q�u �}��-!�Ԧi����-٤� +8�\ؾ��i���>(����pUU�]s�W����~��rxS�F\�A�ƹ���4��rg��h�3�+�t�ƿ�Lr�EjR�թ#tX���Y'�"$[��-]�^]��U�v�iZ"Q��{�;�ʙ��hxͭ#�" +�D�o�F�P���^NvJI��ݏ�cjc�g +�8~?'I�1�R}��b�e%�3���L�A%��i�� h�/���nT+3�w��F�Ii�%(�|r�O��\��:�A1uģ�!zhq�<=O�y\����f�*xN�k�N�Z����y� �=3�,�qH���TۊNc W�X��k�u�m�����d`$�(#�,�AA �f�8�����m +�d��$��*���������@w��wZ���M-��T�O)坪u�܋�V���E��}��>���M����Z�j;[fZ�I=r7�_k�t���d�ҩ�aJ�8�}|���Y�dH��I�R$32�5�����`�۟3|�.�qL��ʄK"@��m�"<��x����w�B���;N2�&}r[' +=�,�e�S���zfqQ�||��q���y�'HmAhY�!���x�1x � +�W�i�oZ-���j36F �,�.��i�)�L�GJf˨~tF�^�G��5ך�Ϩjԣ_7P�C�K�Ο��sWe���T�`N��9��I {m;4�Œ�@=E��r��z�ԤE6���L�IW!�JUA��w�P�e�ƀ5ۖ��}�tP#��&02?�/!��;���| A�o�z����Hr5��IR�>4w�=@��yj��n�xo�t�� +@���kMgB���8������Qu(B�*��lՓ�h�!�y�D�9KN�ps��k�X��mfy� ��a��M{�s�Zې�s��N&�| �C�Ũ��)$��,�'*�_h��A'� QY�2 +{ ��2:v`"�L�~؏�p������T��/ƴ�܍L41!�-�U�Z�8�d(A�����3�B��导3��'Wm\�"���T�Q �o���F�*���Rb�r\D�[��0I�y>��V�eN�pA�JhUx3�>Г��YN���tU�`WE���fF/����{_����#d��=ak"��W`q�殮�*c�L���,;1q)Ϣ��X!��b�S���J���s<����������f��;��`sFJJD��eY>�;%X!��$e#�;��<N�+�1T���V���-�q<M苰e# �D/���kx���j,OMR+h���ņ�rN�9�Є���CA������g.WϏ����m�;�x +��q���\�E�ye1�]0���f���x-W�|-�����A�"f���do�kT��X����T_�����f�kA^~}5�(�Ņ ���Ƀ�䎊J�1$v��M��2�a�������'�Z��,��|����bw>0fΓ/�KE��e:j���ߺ��dD�V{ev�� e������1�#e&(���)p�����|P�WhĀ/CT��(��h�|����.L7���cTcGxi�q��z�߀�x�����j��Qe���m�@|���4�O(����>p���N��p��v^�^Oxp�[��9��y/hԐ�j�s�L��J.���Iz&"�����5���>�V�n��{�H�Ѿ�}�����. ������U�x��ٯ�^P-�ה�uQ7����L������vB�g�t�n,?-ʸLW7_�Eb~�7c8�1�y' hI�Ţ��|9Q���z�?�F�endstream +endobj +1306 0 obj << +/Type /Page +/Contents 1307 0 R +/Resources 1305 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +/Annots [ 1310 0 R ] +>> endobj +1310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.655 597.034 414.738 605.054] +/Subtype /Link +/A << /S /GoTo /D (gfdl) >> +>> endobj +897 0 obj << +/D [1306 0 R /XYZ 71.731 718.306 null] +>> endobj +18 0 obj << +/D [1306 0 R /XYZ 350.659 703.236 null] +>> endobj +898 0 obj << +/D [1306 0 R /XYZ 71.731 692.504 null] +>> endobj +22 0 obj << +/D [1306 0 R /XYZ 285.389 651.159 null] +>> endobj +1308 0 obj << +/D [1306 0 R /XYZ 71.731 647.329 null] +>> endobj +1309 0 obj << +/D [1306 0 R /XYZ 71.731 630.114 null] +>> endobj +1311 0 obj << +/D [1306 0 R /XYZ 277.932 587.319 null] +>> endobj +1312 0 obj << +/D [1306 0 R /XYZ 71.731 580.396 null] +>> endobj +899 0 obj << +/D [1306 0 R /XYZ 71.731 549.296 null] +>> endobj +26 0 obj << +/D [1306 0 R /XYZ 191.962 506.199 null] +>> endobj +1313 0 obj << +/D [1306 0 R /XYZ 71.731 497.376 null] +>> endobj +1314 0 obj << +/D [1306 0 R /XYZ 71.731 440.705 null] +>> endobj +1315 0 obj << +/D [1306 0 R /XYZ 71.731 407.763 null] +>> endobj +1316 0 obj << +/D [1306 0 R /XYZ 71.731 363.927 null] +>> endobj +1317 0 obj << +/D [1306 0 R /XYZ 71.731 333.043 null] +>> endobj +900 0 obj << +/D [1306 0 R /XYZ 71.731 250.353 null] +>> endobj +30 0 obj << +/D [1306 0 R /XYZ 216.752 207.256 null] +>> endobj +1318 0 obj << +/D [1306 0 R /XYZ 71.731 198.433 null] +>> endobj +1319 0 obj << +/D [1306 0 R /XYZ 71.731 139.704 null] +>> endobj +1320 0 obj << +/D [1306 0 R /XYZ 303.653 128.91 null] +>> endobj +1321 0 obj << +/D [1306 0 R /XYZ 71.731 48.817 null] +>> endobj +1305 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1324 0 obj << +/Length 2215 +/Filter /FlateDecode +>> +stream +xڭY[o�~�_a���D�Ų�(�������$���-17��#R������eDz� DCr8$g>?��(��h���E�x��t�oބ�5�|x��)����\ܾ���$�e��'�ۻ�,��t1-�8��xt[�{������4N�q���Jw���R�>t�����~~syۏ�&�`�%�N���/�s�K� ����nK99M�l\���� +�tMUw�%�z��6��V�h�T4V�*�*)�}/��OUU�J��!De4I+����x?�/��� �.���|�8��`�^����2g��aims6�><<L��8�U���(��9KAo���[E�p\ +q�(��D�X��� ++p���.�(�C����+ܢQ�$ +��O<����K��c�,�p�T��w�� H�ʎF�NW���)��`C�_iv<�%�?6��]2�������f�^U�v9:��+0p(�"��cܖ���%e��9b2��`�H�8�9L��j]�� +p3�Zp����]XGs�<�0�ʶRR(O�e��8��6��l�A TA�ωnG��q-��z�j]{ILb�x\� +a�6��Z���^Wʔ�tG���#�@wUA핢�S������誫��吝Vۊ� .Ʉ�'T�00Pε�+`'�1r�xϫ@4S���!>U!H6�:�Ͼw����y����&�������q�bd`�4�d��@�/��]+e�0���˝@�~#5����^��?P���{�cM�tMP���+�Z��*aӵm� +;u���|�X�Fr����ո��n�>�v����Vw��TJ�R�UV���T���@hT.h�YK���.��5h!��5�����3�iK���� �k��i0�y;��F�q�ےX�#������{��Z�9�:ρ��� ��0� ��Z��3�/�l���+a�G0�uE��]�B��q�B�/���A�e>��H��(S���y�Z��_�b>?g�S�ev����坦��M̂8�G�;�'�2 +��g�Neʨ�e?�6�*!;� +��}��e9�j资��������<�즔 �+zKʧwM�8�f�z#XE�B4!����2\�>��IEe�F��"���X�|�=��Bi&]����^+�[sGC�*}���6�#9/Pa�1��D���W�S�x| ����W���5���l����K���O��s���x� �`���0CU����8�+8t�����Q[ê��㑏�8�}�㹕�wpض��M��B@�s\��d�P�ׂ���c�*Ov1���w��MX��G����O����Z����i/�������*y�]����.�'�vuMc̖��-�:�!��"���*��#�����:~P +{8G/� �^�n:���բ�5w4���$�MKG��ɘ�Q����O�}f�8j��_:2�^I� %g�kɁ�(�'i:f�H�ި���C�d/�+��n��[i �"(F�e���!�C<^���=�/�^�tGi��}C8�̙n���h08�-����:��g��c �#�yb��!����Z��}�dCr�"��0��W#';��Uz��}�A�]w��A�5�N� F#�����C%*4������#�I;��c��#������D��\�q����s��ͫ6߿b��?����Ȍ���"�+ҿ��\]��|���Y����]���������3�I��y�֎�5��Vq���[�����Ua��-s�i�������F�J��w�/�s�0� � +�f/��F��t�J���Y��P���֚�iΦS/XjiM.9m�U��)��-��xjl ��&� }�̀���Pf�]u�=���eo���\a���7������W���2���(����id�9b��*#�{�t3��8Dn-���&;�]L�|%h�������Z!m�=V&�[+�B�; {Q��eS +8��^Q �2��-����꾭��_f�V���� w��ɿ�0ݟ�E%OH��U9IE���A��e��_�����Ys��^)W��+��x)&�0^-�ވU<�o\W��U���]� K�SYY�D�a��4�]7���.��K���qE�l7����{� ��%01�A��L�����x��'ݜAG[�s(�ώ]:� ���/[��i�a�[����~)��_��k;endstream +endobj +1323 0 obj << +/Type /Page +/Contents 1324 0 R +/Resources 1322 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +/Annots [ 1349 0 R ] +>> endobj +1349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [127.073 341.555 174.116 348.409] +/Subtype /Link +/A << /S /GoTo /D (variant-redhat) >> +>> endobj +1325 0 obj << +/D [1323 0 R /XYZ 71.731 741.22 null] +>> endobj +1326 0 obj << +/D [1323 0 R /XYZ 71.731 718.306 null] +>> endobj +1327 0 obj << +/D [1323 0 R /XYZ 430.127 708.344 null] +>> endobj +1328 0 obj << +/D [1323 0 R /XYZ 193.204 664.508 null] +>> endobj +1329 0 obj << +/D [1323 0 R /XYZ 71.731 658.119 null] +>> endobj +1330 0 obj << +/D [1323 0 R /XYZ 71.731 633.624 null] +>> endobj +901 0 obj << +/D [1323 0 R /XYZ 71.731 626.486 null] +>> endobj +34 0 obj << +/D [1323 0 R /XYZ 164.538 583.388 null] +>> endobj +1331 0 obj << +/D [1323 0 R /XYZ 71.731 574.565 null] +>> endobj +1332 0 obj << +/D [1323 0 R /XYZ 71.731 533.769 null] +>> endobj +1333 0 obj << +/D [1323 0 R /XYZ 71.731 518.825 null] +>> endobj +1334 0 obj << +/D [1323 0 R /XYZ 154.5 508.031 null] +>> endobj +1335 0 obj << +/D [1323 0 R /XYZ 71.731 507.843 null] +>> endobj +1336 0 obj << +/D [1323 0 R /XYZ 91.656 490.098 null] +>> endobj +1337 0 obj << +/D [1323 0 R /XYZ 71.731 477.979 null] +>> endobj +1338 0 obj << +/D [1323 0 R /XYZ 138.849 467.184 null] +>> endobj +1339 0 obj << +/D [1323 0 R /XYZ 71.731 465.027 null] +>> endobj +1340 0 obj << +/D [1323 0 R /XYZ 91.656 449.251 null] +>> endobj +1341 0 obj << +/D [1323 0 R /XYZ 71.731 424.18 null] +>> endobj +1342 0 obj << +/D [1323 0 R /XYZ 137.315 413.386 null] +>> endobj +1343 0 obj << +/D [1323 0 R /XYZ 71.731 411.978 null] +>> endobj +1344 0 obj << +/D [1323 0 R /XYZ 91.656 395.453 null] +>> endobj +1345 0 obj << +/D [1323 0 R /XYZ 71.731 383.334 null] +>> endobj +1346 0 obj << +/D [1323 0 R /XYZ 136.508 372.539 null] +>> endobj +1347 0 obj << +/D [1323 0 R /XYZ 71.731 372.351 null] +>> endobj +1348 0 obj << +/D [1323 0 R /XYZ 91.656 354.606 null] +>> endobj +1350 0 obj << +/D [1323 0 R /XYZ 71.731 331.593 null] +>> endobj +1351 0 obj << +/D [1323 0 R /XYZ 128.578 318.741 null] +>> endobj +1352 0 obj << +/D [1323 0 R /XYZ 71.731 317.333 null] +>> endobj +1353 0 obj << +/D [1323 0 R /XYZ 91.656 300.808 null] +>> endobj +1354 0 obj << +/D [1323 0 R /XYZ 71.731 277.794 null] +>> endobj +1355 0 obj << +/D [1323 0 R /XYZ 145.324 264.942 null] +>> endobj +1356 0 obj << +/D [1323 0 R /XYZ 71.731 262.786 null] +>> endobj +1357 0 obj << +/D [1323 0 R /XYZ 91.656 247.01 null] +>> endobj +1358 0 obj << +/D [1323 0 R /XYZ 71.731 239.872 null] +>> endobj +1359 0 obj << +/D [1323 0 R /XYZ 232.258 229.077 null] +>> endobj +1360 0 obj << +/D [1323 0 R /XYZ 71.731 208.987 null] +>> endobj +1361 0 obj << +/D [1323 0 R /XYZ 71.731 185.241 null] +>> endobj +1362 0 obj << +/D [1323 0 R /XYZ 144.606 185.241 null] +>> endobj +1363 0 obj << +/D [1323 0 R /XYZ 214.411 185.241 null] +>> endobj +1364 0 obj << +/D [1323 0 R /XYZ 270.937 185.241 null] +>> endobj +1365 0 obj << +/D [1323 0 R /XYZ 351.553 185.241 null] +>> endobj +1366 0 obj << +/D [1323 0 R /XYZ 402.559 185.241 null] +>> endobj +1367 0 obj << +/D [1323 0 R /XYZ 469.655 185.241 null] +>> endobj +1368 0 obj << +/D [1323 0 R /XYZ 71.731 172.29 null] +>> endobj +1369 0 obj << +/D [1323 0 R /XYZ 140.493 172.29 null] +>> endobj +1370 0 obj << +/D [1323 0 R /XYZ 203.864 172.29 null] +>> endobj +902 0 obj << +/D [1323 0 R /XYZ 71.731 165.152 null] +>> endobj +38 0 obj << +/D [1323 0 R /XYZ 297.751 122.054 null] +>> endobj +1371 0 obj << +/D [1323 0 R /XYZ 71.731 121.839 null] +>> endobj +1372 0 obj << +/D [1323 0 R /XYZ 71.731 113.231 null] +>> endobj +1373 0 obj << +/D [1323 0 R /XYZ 71.731 98.338 null] +>> endobj +1322 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1376 0 obj << +/Length 1114 +/Filter /FlateDecode +>> +stream +x��W]o�6}��а�Ĉ��PlH��m0mg�E���髒�,����D�/k1�0���=���^^�(��$F� d�-�Ym�ɋI0IF6g���%�Q�2A��:b� .E$)A��h��?��3�<!<�1����j���bk[?z��+3����],�p9�(S�(��f��I�$�d*�gvn�ec��V%0��2�ֵэ.�"C�R���4��1�V��j�"����)�Y3&"?�g���~������%ʇKFi��K|?Wi��Җ���(�\DB)��ɂ�?��Ӄm��8�(�hԘh��-�����������d ��`�x1C� �@��!W���r!������[��%c��h�� Vq�1F�K��U���T1H�xW�ٍ��~�.m�VM��D\ �F�p��0�f`�5�� �#�1] +�W}^ڲ����E�P����,l��4��Q�����q��W>r�s�~��?���������!�p�%���R��� �{W���L�o���ƄCI�9����WնD" ���#�\WM�{��Ū1�v����Ӷ6K;DZ��\w�)]�:���)����)h�?�vq(�\J�2l=*ˡԓR����;��N:_�aT5Ý���ٹ1]��z,G���L�P$���g"I*�+��͍��k]��1�����C� �cٞ��,������w���* +]��!�U�zV���f ɽ�}ȥw�D@8�s���ܾ_�s�!��Q@����i��UQwSt�b0���ڵ� �k�\ Mεn�lCaؚjWL������5����Əe=�=rЈ�����9G�xĺe��F�q����$���E���_��� +�w����o���{=0� w����ݫӳ_/zw龫����~6����)֬�gO�7P�������\�i�d]�8�p���M^�����wt`���b�%�`+<�$#�I��Б�w��|�y�'�����(h���NK���P7Va���ͨ0�r�g54�?O�h��Asgfc��PJD +���a�D)R;g�F�� jB�8N��i���g'w�� ��+,�~5ݛLv�S +���G� +�"�z�;#endstream +endobj +1375 0 obj << +/Type /Page +/Contents 1376 0 R +/Resources 1374 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +/Annots [ 1380 0 R ] +>> endobj +1380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.336 388.335 343.551 403.279] +/Subtype /Link +/A << /S /GoTo /D (gloss-bugzilla) >> +>> endobj +1377 0 obj << +/D [1375 0 R /XYZ 71.731 718.306 null] +>> endobj +1374 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F44 1379 0 R /F35 981 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1384 0 obj << +/Length 2472 +/Filter /FlateDecode +>> +stream +xڕYݏ� ߿b����?b'���v�[l�s8t�pn���J��r%y�}I�v�؎Q����D�'����!�/|؆�6�_���4y�����]��4��$��D�:���~?�3�~�ç(~�?M��ǞK�Q�><�{ +�X�W�h��"���k�WQ�l��տ��� +�~&8U�<#?�n�,���� +a�T��oO�-�J��g�>��}�$Q�'(L�°8������iOk�����i��j������̛���S���&�*������˼�u�NZ� SG#��z&��V V#��.yĮ��VQ�Ѽ!��0��I�m�j�S�e�� ՜�TDn��Zc��K��F�C%���P�ki^�R�T��>�. ��S�h��SY$oܩKkeM�7>�� ��\�m��*lJ!������e"�$DiNZ�ϴh�D}j�IR-�2���/0�#UJ�ײ�D��<�n��,k+�T��)�e�5V�ᱭ���5@�n����5+����A��m]f Ġ��vCt�Z 2-(6J[d�偢C W���/RW�r����}��H%�w*��D��WZ���,��'�QrK.�Vi��4� 5�X�d��3h*A��ۗK��+[�<���THKl�Y��\�D��� +I ����B�U��`�as�M�J�U˃�2��av1X�4�<m��N#��Ӗ��#vd&P-���I��� ߝ���vVlYt(�y�k�Z�qC��{�T�$� �J��p}5�Д\w;xw��k��@X���#՞�[2�s^Z>[�i�_�^��g��*��@�ѥ �B���=�\(��i�x��j�J��Z�Y��UEB8�H:e��Y +�j��=c8����0�ʃ���3ʛxo<Y��*jT]g`�x�����*��\H�,�:��\���}|�P>� �8���X&Yh��>������Q�:�EQ2b��h�����L1�O�]����_H�>��F +����lv;?��=43tL0[D`��-C ���3U���j�&��ޒq���Iإ��Y�H� +x��$�������^h� d�%�̖!3A8�������Me8T��os@p8�^0���a�K��-c0f>�`��3�N��!��s�Χ�H_���A�`�(�{vo�8��v���)��3[l�|��?3 �\�g��VdŹ������H����������/�q�f�[�# z��7����=��9"_c0ڵ����J��Qg-&�T&+�Y���w�&�ޅj@3VG����E�&��B6�������� Y��n;G݂2tI�e�$wY��;�S��Cq�I|_�4s(2��cf�(���Pp��VwD籌e� �������W>��"��5��9���O�����f �Xh�l�1�@�tw=0,�z��8� +z� у����H88�� ���O��}�.4s�1�`cfˀ����p�+oSI+;��@�Թ4�Ot���� ++�������j:K��q�(�z���L����2�c�#�?�i�R{���ǧe���`���W��L�ǘ�2c�#8ܿ���|]l8's������AZ��W�))�zڸ`}��\�u +��t�iʨOS�S|���B�U����ʿ��0?�H��6��Ejop�r�(�o��x�L�$^�!��2ev�h ٲ��6��VHGeww���Yf�.KrIe��#5�X��'�B9�C� D�H�3%�6��)�B��)��M����%��t��$��g^$�M��"g�%�~(����X^S��/x*k��K=�Zų`:i�i���K�6|qF�٦�;e�Kc���Ӷ����%en�!a&��m��x��Zѵj�$����L�ɓ���NexCɴ���R�{8τ�(��<����r���l�᭻�\)K��qR8Ke:���K�t���T�QއXt��}��Jg0P��28�D]JCURc(��Ǫ��(�WQ8�>�Ah�<@$l�NJ�Ԙ�|�&ʹĠ��E�DS�1� �,?,X��Ť��5 3�Z�./ mt�JN����K��c�U�?��Q|T���l�O��ǂd�6pt�yl�K�U +sp�@��P��� +���L��Wۉ�;����~�����9w�Q��!{��갘�ז�b#@�h�I�`V��)zI �Z�o���z�I.�5,�V-*m1��n�8�7�J�Cw�u�����S��Wiףt�t�x�s�!`���b�o +{ؑ�����xG1�n��;-7^�)�1T�.gꔜ�p>����*���u�& ����7m�/TY���vq�;v@�(��Y���2.�^8m]��ĞZ�lx���^��������`���`A� �\5����&�H�>�}�U[����9o�r;���4��H:)'s��.�.�V;;��%�H���� �͆��-��x��{B��endstream +endobj +1383 0 obj << +/Type /Page +/Contents 1384 0 R +/Resources 1382 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +>> endobj +903 0 obj << +/D [1383 0 R /XYZ 71.731 718.306 null] +>> endobj +42 0 obj << +/D [1383 0 R /XYZ 298.58 703.236 null] +>> endobj +904 0 obj << +/D [1383 0 R /XYZ 71.731 692.504 null] +>> endobj +46 0 obj << +/D [1383 0 R /XYZ 247.756 651.159 null] +>> endobj +1385 0 obj << +/D [1383 0 R /XYZ 71.731 638.721 null] +>> endobj +1386 0 obj << +/D [1383 0 R /XYZ 71.731 544.753 null] +>> endobj +1387 0 obj << +/D [1383 0 R /XYZ 299.594 533.959 null] +>> endobj +1388 0 obj << +/D [1383 0 R /XYZ 71.731 526.821 null] +>> endobj +1389 0 obj << +/D [1383 0 R /XYZ 81.694 506.063 null] +>> endobj +1390 0 obj << +/D [1383 0 R /XYZ 71.731 503.907 null] +>> endobj +1391 0 obj << +/D [1383 0 R /XYZ 81.694 488.131 null] +>> endobj +1392 0 obj << +/D [1383 0 R /XYZ 71.731 485.974 null] +>> endobj +1393 0 obj << +/D [1383 0 R /XYZ 81.694 470.198 null] +>> endobj +1394 0 obj << +/D [1383 0 R /XYZ 71.731 468.041 null] +>> endobj +1395 0 obj << +/D [1383 0 R /XYZ 81.694 452.265 null] +>> endobj +1396 0 obj << +/D [1383 0 R /XYZ 71.731 450.108 null] +>> endobj +1397 0 obj << +/D [1383 0 R /XYZ 81.694 434.332 null] +>> endobj +1398 0 obj << +/D [1383 0 R /XYZ 71.731 432.176 null] +>> endobj +1399 0 obj << +/D [1383 0 R /XYZ 81.694 416.4 null] +>> endobj +1400 0 obj << +/D [1383 0 R /XYZ 71.731 414.243 null] +>> endobj +1401 0 obj << +/D [1383 0 R /XYZ 81.694 398.467 null] +>> endobj +1402 0 obj << +/D [1383 0 R /XYZ 71.731 396.31 null] +>> endobj +1403 0 obj << +/D [1383 0 R /XYZ 81.694 380.534 null] +>> endobj +1404 0 obj << +/D [1383 0 R /XYZ 71.731 379.095 null] +>> endobj +1405 0 obj << +/D [1383 0 R /XYZ 81.694 362.601 null] +>> endobj +1406 0 obj << +/D [1383 0 R /XYZ 71.731 361.162 null] +>> endobj +1407 0 obj << +/D [1383 0 R /XYZ 81.694 344.669 null] +>> endobj +1408 0 obj << +/D [1383 0 R /XYZ 71.731 342.512 null] +>> endobj +1409 0 obj << +/D [1383 0 R /XYZ 81.694 326.736 null] +>> endobj +1410 0 obj << +/D [1383 0 R /XYZ 71.731 324.579 null] +>> endobj +1411 0 obj << +/D [1383 0 R /XYZ 81.694 308.803 null] +>> endobj +905 0 obj << +/D [1383 0 R /XYZ 71.731 285.889 null] +>> endobj +50 0 obj << +/D [1383 0 R /XYZ 352.03 240.635 null] +>> endobj +1412 0 obj << +/D [1383 0 R /XYZ 71.731 228.197 null] +>> endobj +1413 0 obj << +/D [1383 0 R /XYZ 71.731 173.083 null] +>> endobj +1414 0 obj << +/D [1383 0 R /XYZ 71.731 48.817 null] +>> endobj +1382 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1417 0 obj << +/Length 1365 +/Filter /FlateDecode +>> +stream +x�}WK��6���Ҍ��ò�^2ٝ>�&�Lw�Kۃ,����������f��"A�|��l��/�UYR���I�*g�x��vp��M�fY\��=���\�u�^���l�,�2�gU�'u��������[��E^�Q����du�,#չ�J5��>�v����ZYTɺ.��P�y�Q^�= +K�X.�CwΒ�>.�#�M��С�o�*��R/yT�8.-d���*�pF��;��"��y��E�'�|��ePOn�WE$ ~��S����G�6Į���V���-�3t`�u ��$������0�9�Ŝ��ZLv8����u���#ks��Җ8>:ᄙ����X1����(�,��Y�K�p�<Y������!�Fub?�8K��ƑVGc35;��Y4'Z��}�0r7���@�KQ��?��kA�,�Or��L7���Q,@�b����-��l�l�������^ދ�l�����T�{i�7�{~���4r;�\��F[�%1�QN�L�!D�k{V̔?E�7vN�?⢌^?���[9�ϋw��n��,��?��^}�3�� %�l���h������HF��V��ܐ��<���Z`�{k�?���xUFI� jl �qVG�kPp�m�7eG��Ւ(���x����p��D���Bc���Wr�p�.^d��5S{/ي�i5�nd>,��r��O���!%P�7��h�qa��w$58��aY�E���΅�A"� 8��� }Lʗ�cS��( Ӂ�Z�)R0�L�����mlH��E��D�=/@�o$�e~;�h[�&h^r8�mPڱX皁hb-B`@��9�,q���������k�u��EVE�(�~������Y`�v �&��u+D����b;�:�'�@��.t��Y}��CmG�Y9����S$���� �ol�=}���=�����dkh��Fh�f +(�W@S�7z㣄����1�U5�Ar���h��0\.�4c6���55'���{SE��m�a*��,oK���j��+:y�Hf�q�}�6g��yR�ϐA����\� z2��u +F[����_4�߭V#���}�2��B�@�������XV?�A�&��@����֒,��{��lgþǡ'�p<�Q�������U���gQ����uƜ�x*^�~+ �lj�����7 +V#Zi��q�l��_`.?4�Yu���t�Њ<�5�}��O0�!ĚV=\5)��1�����M"N%��^�!�(�~ �E�f!�+:ۍ�M��䠡P9�:|@���P_� �-XM-Lxc-4�s�Tȃ=���x�� �pdž}�D}stZ�>��5Ώ�e��Y��?g�� ʢH���#R~�������Ul�endstream +endobj +1416 0 obj << +/Type /Page +/Contents 1417 0 R +/Resources 1415 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1296 0 R +>> endobj +1418 0 obj << +/D [1416 0 R /XYZ 71.731 718.306 null] +>> endobj +1419 0 obj << +/D [1416 0 R /XYZ 137.275 708.344 null] +>> endobj +1420 0 obj << +/D [1416 0 R /XYZ 310.75 651.557 null] +>> endobj +1421 0 obj << +/D [1416 0 R /XYZ 504.239 651.557 null] +>> endobj +1422 0 obj << +/D [1416 0 R /XYZ 71.731 618.516 null] +>> endobj +1423 0 obj << +/D [1416 0 R /XYZ 250.271 581.818 null] +>> endobj +1424 0 obj << +/D [1416 0 R /XYZ 71.731 550.834 null] +>> endobj +1415 0 obj << +/Font << /F33 896 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1427 0 obj << +/Length 2575 +/Filter /FlateDecode +>> +stream +xڝko�����ྜR؊R���v�"h��,��[���BdI�M�_�yQ�l9�"r8��I�W��W��!|�� ��*߿��/Q��A�xaq���m«���Ϗ�n>�U�I�]=>�\�� �����s�Sm���u�n����S�[�<l�]V��������#5����D(t}����ڏ�W� ��3=���N�27KB��n�"��]i�ב:F�}��<ɛ���UֲZ��M�WG��@���v��<�7%p��ӝR���È��@�Mo��^ ��`�?��_=/�*<(���,��l_����}{{sS�Z�ܧ��s�pp�lo�`��$�<�uW�;Pd�9�f��B�iQW9�7{�� #��:���w����-����1<Z��4�+����.XL�9"M�3V�h�\7�u��Q]Y ���1��F�(�6���h��U?tDf�VO���@q<h�{]�0v@i�P��Cߣ=��Z[�@9�)�X����� x�@H���~�Z�w�*2�I���{Y�~S��]O��=��{��>��#�ߩ�G�ECC�B�{��� �D�'��0 G���yׁ�Չ��}�78֢Oz�DD�]�ۋ|��E�F�C(9;,����;ӟШ��9l������g�b!]��5�*!ƆM2��b_֥�;�S@�50�v�`D�>���C��9B"�\9��d)&�����!tL��]3`0)xJ:�- �t�1����� +���tB-r]t%�%��P�SJI,�������������!C|��㘒��M=H[i�F�Х�%(� 笉ᝐA�3^��M�h���w�-[��}B��eU�/�~�1�A�ǖBOLI�5��W�L�,���¶�UY��x7�>%c����H�UY�ޢ��<hRS�����p����F��"nY��oZ���sh;J��ʂ�-�$-!)���Hct�2H�=�}D�'���qĹh��2������ �'d��_0-����~��!9ԽA����j�S(x�A�,�����a��z�Q���⌶0%=�1�{b�_1��+).�pA,FU�������|����Zwdx�C$�)����a�,���Ѣ��!lJ���VC �� +��a#'=D�ʈ��D$�"L��PI��r�xəC��;������G�G�`��5H0p�'-�H�[��IH�b�@E�����6�����n�Tʿ�6G��n#(\(\r�s^�w�7x�����К0�<4[���J`��Gd��=]UP�&xa5��Q����}��1�}��Vm����n�6c �P�g��̑��a@f�k�FfP��R$X{� �[,s���������H���cC���Z�SC�sCdT�6���1,����I��8�a��i^J��RG#�sH_�RP!�iV���XO0M���'�:�&�S\�`��+��Y(r�M��#�fkU/��^��e^(�#���B;�B�}�иB�90�,lVu_��c�{%��`DD�;�6�J3���h��4L�P�B�a� � ��U\�P)��R�<�?6��-ۦ���r=�O��/X��C$���;���=ت�7l���o6���{������9d00}+T����H�+XY�?x$ں����,~�KpR4|3%��O��-�kZ�CC�P@ \�0��U�IW�[���mrA�`��#<hUa��>v`��VwͯFnϽ@D!m���U��^�`�ܙDҁ (�H��h��YyB|u��"�Dک=��W�˳�=�ynݫ����+I�J�-�*��&�b��H�<��������{|ZN�A�B�J�L��K�֢���,��n�=� 1}�n��y��;M1��D�H���=Ag��^����x)�F"��Tg��B��\}��������O��;��W<�F�(3�d[b�7N0��2��*)�r>%F3;��y��v�t�V<�n�[-IvW��,���~���ϏLj%�`�Fy��G��i��!���G�o����Q��M$�&���������ߞ_n��H.������Y��g��ܽ�s���`����B�9�"���DK#wfV����Y�+��5��?� �O?�a|2��T���\@m5\��j��K���J��X:��<=�]wBnT��xs���x�����^���j���Ѷ��X�}+�ݡć���V%�LXT~��m�ص^4�� B �:�ox���f��b<����VĜ�z�K�!���f�X9�+���>���ᓫh�.N��S��'�� f�i���<YAW/��,s�%_�FhO���� ��P�/]-l�6��V].�Q&����.������ (ߢ����C}�m�Y�����6������_�cG�E��zB{��+��~���x"�_K^�DP�]�K���-{ju���rY��kƩ�.�G�i2�BѴ�#�1�H���!�+�'�J�m@�wx�|Ԛ�6'�HM:Y��}�Pژ������_)����/�]��>��U>q�iX*��䔑��������1endstream +endobj +1426 0 obj << +/Type /Page +/Contents 1427 0 R +/Resources 1425 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +906 0 obj << +/D [1426 0 R /XYZ 71.731 718.306 null] +>> endobj +54 0 obj << +/D [1426 0 R /XYZ 320.829 703.236 null] +>> endobj +907 0 obj << +/D [1426 0 R /XYZ 71.731 692.184 null] +>> endobj +58 0 obj << +/D [1426 0 R /XYZ 292.465 651.159 null] +>> endobj +1428 0 obj << +/D [1426 0 R /XYZ 71.731 638.721 null] +>> endobj +1429 0 obj << +/D [1426 0 R /XYZ 506.431 629.6 null] +>> endobj +908 0 obj << +/D [1426 0 R /XYZ 71.731 588.589 null] +>> endobj +62 0 obj << +/D [1426 0 R /XYZ 288.585 551.373 null] +>> endobj +1430 0 obj << +/D [1426 0 R /XYZ 71.731 541.008 null] +>> endobj +1431 0 obj << +/D [1426 0 R /XYZ 71.731 505.346 null] +>> endobj +1432 0 obj << +/D [1426 0 R /XYZ 71.731 503.189 null] +>> endobj +1433 0 obj << +/D [1426 0 R /XYZ 71.731 498.208 null] +>> endobj +1434 0 obj << +/D [1426 0 R /XYZ 89.664 477.451 null] +>> endobj +1435 0 obj << +/D [1426 0 R /XYZ 128.486 477.451 null] +>> endobj +1436 0 obj << +/D [1426 0 R /XYZ 171.417 464.499 null] +>> endobj +1437 0 obj << +/D [1426 0 R /XYZ 71.731 462.342 null] +>> endobj +1438 0 obj << +/D [1426 0 R /XYZ 89.664 446.566 null] +>> endobj +1439 0 obj << +/D [1426 0 R /XYZ 71.731 418.507 null] +>> endobj +1440 0 obj << +/D [1426 0 R /XYZ 89.664 402.731 null] +>> endobj +1441 0 obj << +/D [1426 0 R /XYZ 128.07 402.731 null] +>> endobj +1442 0 obj << +/D [1426 0 R /XYZ 269.817 389.779 null] +>> endobj +1443 0 obj << +/D [1426 0 R /XYZ 71.731 382.641 null] +>> endobj +909 0 obj << +/D [1426 0 R /XYZ 71.731 351.757 null] +>> endobj +66 0 obj << +/D [1426 0 R /XYZ 233.927 314.542 null] +>> endobj +1444 0 obj << +/D [1426 0 R /XYZ 71.731 304.177 null] +>> endobj +1445 0 obj << +/D [1426 0 R /XYZ 71.731 281.466 null] +>> endobj +1446 0 obj << +/D [1426 0 R /XYZ 71.731 253.406 null] +>> endobj +1447 0 obj << +/D [1426 0 R /XYZ 71.731 248.425 null] +>> endobj +1448 0 obj << +/D [1426 0 R /XYZ 89.664 227.667 null] +>> endobj +1449 0 obj << +/D [1426 0 R /XYZ 92.611 227.667 null] +>> endobj +1450 0 obj << +/D [1426 0 R /XYZ 89.664 196.783 null] +>> endobj +1451 0 obj << +/D [1426 0 R /XYZ 71.731 196.783 null] +>> endobj +1425 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1455 0 obj << +/Length 3369 +/Filter /FlateDecode +>> +stream +xڍZ[�۶~����%�� ^��M�4�$�I3��<$$��H� }r�뻋]�&R��A�,������gs��� J�sc��&=�:lN���+�)�L��|�����Rnbr�x�xR +�P�"���c����<�����]������Eu��7��EY&�?~�ꯏ=C_�"���5Y����}�x0�!��̚~�vA*X�1I������n8�$��!ߩJ5II� +�;���';����O[���^�}.ڜ{rE��g_�;簅%PSZ�j���������ʱ�Ҷ���,��qx����Ҳ��E�I��}���?���Q�K��}�jS1߅0���Q$\�[��G4fƢ�M�u�xE�o������C�xO��~8���M��ۤʰ�l?)]��w����Xx̕V4:S�n�h +�s��Iږ/���'-�4��1�$5�'Ow�J�K**��ӬǦ>S +j���/�M1퓢����pQ�Ye���S'<�+7�8Qo��+b�1���Mݝ�QHx���4���5���@�'1�ˁ�����38��; B�]�T���h'ˊ#~�Q5�j��Rk]<�,Hh��II��Ǻ�B��f�0 3�}�/&%5�=��Rw�I�D5�l2��]�Q�I�s�vgX������y��v�U���v�u�*/|�k`��j��]�zX=OxN|��4���IP>r��^�Xg�g��� �w�ӧʊ�q�N�/EF� %�j�ݭF�K]!l�nc���vP�v<��UQ���ඨ�UQ3 .�[�5�����^����_>�� Z0��!fѾc���H�u�I��{g���eK��V��]�oW%f���m 4�f�U��Kx�{I�#ޟ��9i^��I��p*�R�"ZUY�@�x�>ZA�D�75���&N?>�c��9�� �)p���,����$G���z>���S�4; �bA��'�#Y��R%�w����lp�x��R{Pg���f�6*�)�$|00 S�ݶ�"�Jܴ䤧c��?t�2��p�Y�C&A����x���.�xO�Q +''���}'��I0��5m�^R��^0V�җ o@��� +�6I����)�(��3l��l��/�X��L�s^�9�ŷ��WM�N��U8�6��ۉ-iB�8�Ma�y'�ɞ���5�G`�b�0�����cMq��OM���6�`�\�7�Y�M^G��|��VvQ�K� +8���Ѭ�I�ӢU�]���%�1���<|�Dz����Bg�?���O�)��S��|'q�:��s�æ��仢����]1�D`BmuKWe�{����ޛ�fuo�?3^ݛk^��f�{�7������q��5��z9����;Qn�}mG���F�B� 0���NĆ�Uw���� 7���������s��g<��9�Ɖ�v��Iat��F�*v<���ϮK+���(��>���U��; ����Kp%�v���=/I�iW&�ě��F]z;WX#�y��������p�fC��\�v2 ��9��v��]��y�@{�6f�SS��o�|: +7�����1�����n� �"����F���+�W��15��=��D������ j��~���-S'�w�k����Q���=�4O��Vg�+�o�c��؟d.�����<`H�A$��}poBd Y�S�8��fu"3�s''�&�?C�E��$a<��(��=��m���ԧG�FQ[K^�7�Z3϶�>J&a�SY��!4Ԁ~���r)���q����tӽ&��0�����E�yQ�53�;V3<WH7� a!3iff_����AulP�jP(�����UH�xe31֟�+L��6�,(�^yU�v瘌B�W����SzU�IG�Nt��h�v5I���>hg�gz-p� �7&�B1���]6Ȟ��"�8�7�0i�Dۓj��cQ��q�M���ص�q��<�i�`���o��aߐD 8� +���FIK���qƱ�h'���K�Ǹ�PM��JNF��g�e����0p��r�aHf�;@y+��=P�+����C�z��q�w4�ph�jJ9�0����;?w���M��2��>!:;��i���[G�Ƚ:�!�;�X77CE�r�d��o��ʹ��\��3X�=Ws�Ș�'�0�f)���o�0��z�x��OW��Xx�M1�kR$#��L�5��2�2^����{��E�$E�i& I��1�$3�����9)J���Uu��%�h�`�|'�)�dM�La����\`u_�3�3������k�$Ń��I\L�x"�m�fl�#�1�m��>ͩJH�D��2$X�Ц����e�!JiS�m�.b�M|]�~8}k�u#m5Z����~TO2�HRgmBᇳ m�he�l��� Г7�1���)>V3����c�{ +�o��.��T�j A���0�㡱ql��C#����!r�0�}����h������?h� ���,��������l6�9L�v�r��AI�7r{���?�o��o��2H�컂����B����iZ7��1�:�7��[�����RЭf�X�ݜ��13C�L�/GD�}���8��D���Չ?�Ij�j�k�� ��s3�1"Y�*S���IXݗ��D���e8a�.� +zjp#�!��|���]��1�eT�uLuQʚ qnn�&2�n�����@%+t��.ph�M���QT3w�Ĉ +�tf�jAs:����s��[����=��|� +u2\X� �!�(�=�����o��p�y�F�� +�!XL�y�|4�j�� 덩��E��(�y�Gф�qzT�9U/ɉ�L���?{�4�,N��uPҝ�C�ʤ/��?"X�ORQV���v�fr�fy-{XK�_w�/va�J��EZ� +7�,��v�b^n�̯��vP�_s�m/_�}[&Uf<�R�����h���q�����j��� �K�S9�i��D�'4Ofڦ.�Fq$�*љ �W�bp.z���71��f���0�B��� +��Wژ:8�b����x6Б�_���y���iS<!Ì��T�I�(��[��u�po�0����Z�] �.W���f�#E/�H^�C��>R�w4f���oQ0�4 +b��g�P��7Q0�w2�z��$#��k(�I����L�l�?�۷7��1��θ�p�W�v�����'1�g&ٳ�ȴ���pn {`-��Gz���?���#�m�V6�jb��G�FZ T���M�X,Z���GOu=���\��>�g�������� m�i���B�<�é��_P�_C���ױ��W�vo��e�� +zr�E`�Û�r�+��K�8�Lb�����^s�m쳥endstream +endobj +1454 0 obj << +/Type /Page +/Contents 1455 0 R +/Resources 1453 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +911 0 obj << +/D [1454 0 R /XYZ 71.731 741.22 null] +>> endobj +1456 0 obj << +/D [1454 0 R /XYZ 71.731 706.187 null] +>> endobj +1457 0 obj << +/D [1454 0 R /XYZ 89.664 688.254 null] +>> endobj +1458 0 obj << +/D [1454 0 R /XYZ 92.571 688.254 null] +>> endobj +1459 0 obj << +/D [1454 0 R /XYZ 71.731 660.194 null] +>> endobj +1460 0 obj << +/D [1454 0 R /XYZ 89.664 644.419 null] +>> endobj +1461 0 obj << +/D [1454 0 R /XYZ 92.154 644.419 null] +>> endobj +1462 0 obj << +/D [1454 0 R /XYZ 71.731 642.262 null] +>> endobj +1463 0 obj << +/D [1454 0 R /XYZ 89.664 626.486 null] +>> endobj +1464 0 obj << +/D [1454 0 R /XYZ 92.154 626.486 null] +>> endobj +1465 0 obj << +/D [1454 0 R /XYZ 71.731 624.329 null] +>> endobj +1466 0 obj << +/D [1454 0 R /XYZ 89.664 608.553 null] +>> endobj +1467 0 obj << +/D [1454 0 R /XYZ 92.154 608.553 null] +>> endobj +1468 0 obj << +/D [1454 0 R /XYZ 71.731 606.396 null] +>> endobj +1469 0 obj << +/D [1454 0 R /XYZ 89.664 590.62 null] +>> endobj +1470 0 obj << +/D [1454 0 R /XYZ 92.154 590.62 null] +>> endobj +1471 0 obj << +/D [1454 0 R /XYZ 71.731 588.463 null] +>> endobj +1472 0 obj << +/D [1454 0 R /XYZ 89.664 572.688 null] +>> endobj +1473 0 obj << +/D [1454 0 R /XYZ 93.177 572.688 null] +>> endobj +1474 0 obj << +/D [1454 0 R /XYZ 71.731 557.579 null] +>> endobj +1475 0 obj << +/D [1454 0 R /XYZ 89.664 541.803 null] +>> endobj +1476 0 obj << +/D [1454 0 R /XYZ 92.154 541.803 null] +>> endobj +1477 0 obj << +/D [1454 0 R /XYZ 71.731 539.646 null] +>> endobj +1478 0 obj << +/D [1454 0 R /XYZ 89.664 523.871 null] +>> endobj +1479 0 obj << +/D [1454 0 R /XYZ 92.93 523.871 null] +>> endobj +1480 0 obj << +/D [1454 0 R /XYZ 71.731 508.762 null] +>> endobj +1481 0 obj << +/D [1454 0 R /XYZ 89.664 492.986 null] +>> endobj +1482 0 obj << +/D [1454 0 R /XYZ 92.077 492.986 null] +>> endobj +1483 0 obj << +/D [1454 0 R /XYZ 71.731 477.878 null] +>> endobj +1484 0 obj << +/D [1454 0 R /XYZ 89.664 462.102 null] +>> endobj +1485 0 obj << +/D [1454 0 R /XYZ 93.198 462.102 null] +>> endobj +1486 0 obj << +/D [1454 0 R /XYZ 71.731 446.994 null] +>> endobj +1487 0 obj << +/D [1454 0 R /XYZ 89.664 431.218 null] +>> endobj +1488 0 obj << +/D [1454 0 R /XYZ 92.614 431.218 null] +>> endobj +1489 0 obj << +/D [1454 0 R /XYZ 71.731 403.158 null] +>> endobj +1490 0 obj << +/D [1454 0 R /XYZ 89.664 387.382 null] +>> endobj +1491 0 obj << +/D [1454 0 R /XYZ 92.154 387.382 null] +>> endobj +1492 0 obj << +/D [1454 0 R /XYZ 71.731 385.226 null] +>> endobj +1493 0 obj << +/D [1454 0 R /XYZ 89.664 369.45 null] +>> endobj +1494 0 obj << +/D [1454 0 R /XYZ 92.154 369.45 null] +>> endobj +1495 0 obj << +/D [1454 0 R /XYZ 71.731 367.293 null] +>> endobj +1496 0 obj << +/D [1454 0 R /XYZ 89.664 351.517 null] +>> endobj +1497 0 obj << +/D [1454 0 R /XYZ 92.238 351.517 null] +>> endobj +1498 0 obj << +/D [1454 0 R /XYZ 71.731 338.466 null] +>> endobj +1499 0 obj << +/D [1454 0 R /XYZ 89.664 320.633 null] +>> endobj +1500 0 obj << +/D [1454 0 R /XYZ 92.06 320.633 null] +>> endobj +1501 0 obj << +/D [1454 0 R /XYZ 71.731 305.524 null] +>> endobj +1502 0 obj << +/D [1454 0 R /XYZ 89.664 289.749 null] +>> endobj +1503 0 obj << +/D [1454 0 R /XYZ 92.154 289.749 null] +>> endobj +1504 0 obj << +/D [1454 0 R /XYZ 71.731 287.592 null] +>> endobj +1505 0 obj << +/D [1454 0 R /XYZ 89.664 271.816 null] +>> endobj +1506 0 obj << +/D [1454 0 R /XYZ 91.937 271.816 null] +>> endobj +910 0 obj << +/D [1454 0 R /XYZ 71.731 251.726 null] +>> endobj +70 0 obj << +/D [1454 0 R /XYZ 243.223 214.511 null] +>> endobj +1507 0 obj << +/D [1454 0 R /XYZ 71.731 204.146 null] +>> endobj +1508 0 obj << +/D [1454 0 R /XYZ 245.796 181.435 null] +>> endobj +1509 0 obj << +/D [1454 0 R /XYZ 71.731 174.297 null] +>> endobj +1510 0 obj << +/D [1454 0 R /XYZ 71.731 130.461 null] +>> endobj +1453 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1513 0 obj << +/Length 2519 +/Filter /FlateDecode +>> +stream +xڥَ����_��K$`D��(ʏ6l�vv&�� �Ȗ�1�ֲ���|}���y������>�/6��;�ۅ� �^oY�j�8���W>�X������W�?��b���p�x\Da�q���l��c���"=Ѭ��v�=��U��D÷��?�,��?����cp�}��ɝ�@*��H9�6�F���'y*�g���?V�v�֙�i�V4�~R�7W+Y����*EZ��m���@"\�����b�dK���Eȋ]���g�����f����n~:�� \>��M���h��\��Ɋ{��Z /�H�p��� `�� +����������mj�{4},�����������>¸:�,�9�J? �RT� �x{V���P�Ǖ�, MM�՝�L���� *�D'Ijm���Hw�I�bt�T�����?t肦�� ��}!�Ur�1^����a��T��f�Nm�J������]�����V�R��u~&C%����UcP�q|xf�z)��_#|2U�UM�B�9��M������X�r$&��})h�`�g�flSi� ������uR�C��������1��apQ�7d\C�����,����b�Y9��� 2d���,�;/���K�V�$z�(G)��@Y���Ę�S7��ǚU�z-riPެ�mU�N�/�D e���"͊�bz��X3Ek�o:� ��Q�ȿY%�3��Ep����-1�v�3�����T�l@����pF�sD@4K�����>i96ֱ^)�3����C?aR?;7���6���#� +'��6.���Tg�{O���Dc:#���*:F��ш�Q)�y!�_����J#v�G�t��Jp�V��DM ,�n�sRr*ڃ�sG�,�d�4Gٗ�sJ�o"o�h�I}�͎�[g1�&�sM������|�K3�C6ݘ!&��7��;����I����N�:<��b��/��8��w2E�G��U���_��T��U�F��b�t���^����N�)�W�!�+��a?���N��4w/� u+�� �q\$��x����A�{�0��r��A��[J�n�z[{���tݨ�QYg���p�ƾ�;$��h��d���kS-\�Aa!��P�Sk�x��.5�il>�m�������I���~"(���z&�u��Ɯ~]���7�������S(_�#��������<{��Jx�G~ǻ�/��13N@��O¢���B���eƛV!a�ϊ�h�|��~�~r�®��u���Yg���� +�F�!�"%����ܨ��䁼*,=t�h�\oK�0u��M +���_�^�Ӥ�6�!�X�_����}�4�.��:�]����� �r?#U6�=� +�ja#aLѽ��@66�ś��Oi�?�݆W���&�I���P�9 �h�ڈ��l�{���AŶ��?kdŧ(_r���J\�\���&���D�s�0�i��D FEH�ktN��2�=-��u��aVم���.�9��\�F�HЗ#�O7 +j�ֹ����.*0����|ֹ��ò,�v��� +��vB���|Ӂ��g.���3H��Ma%{/��9X�o��܄=ya��ѷQ)����η��-������]�=�o�����6�ȆY-x��2�������SRNz�.>�+@��_���C �r�Hv�丯�HzQ���"���*�G�ઊ\�zYEn��<K�i)232' +���,�wW��]��%z�ZWY�o�-���,��\e�\��.a�̲�'�"�ܓJ�h \v]�����w3]����`���QiN���S�j.�a~j�����)�&`؞��Unw�W��6ȋ��&�;��h�������<ܱ�u^�\��fG�~4z����?jE�i�X�� T�qrS�g�i�;�TE״hZt��٩��A�RIs7)<4��\ס/�G��r��2�{}ӆo�u��U�]������I+5HW^��~[AV"�cs��g�aણ����6q��.�ڝ��*画| �}ӂ:��� +ت�e�����7S��m%b��� +���� �3���Qh'7��i�y"YXK���2���$=@9eP�!g�Z��>?p��6�e*-�<�I�����G_m?���C.�lJl�%_�0��u��T��"lE��j.�<��}�>� 8��%F9�}X�*�����b��Pa��r�� ӹ���3��Z��c�|?Q{ɷO]V=js��+��K�������o�L�{�T8�����v��7�� 67gGr���Q��rԻ� A�e�����5~�^�˭]���r dZ�4mD�,���W���e�>ش��Vx�J����27O���M[V�;��x��(͘��h���>=k1��?���64�1#��O;��v��Pb����cd��E���[�ֱÀ��yz.u�j�����ǎ�"Z�_�Q�%��濧���?O��!n6�+Hfr�O�KH�x�!endstream +endobj +1512 0 obj << +/Type /Page +/Contents 1513 0 R +/Resources 1511 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +1514 0 obj << +/D [1512 0 R /XYZ 71.731 729.265 null] +>> endobj +1515 0 obj << +/D [1512 0 R /XYZ 71.731 718.306 null] +>> endobj +74 0 obj << +/D [1512 0 R /XYZ 176.973 663.99 null] +>> endobj +1516 0 obj << +/D [1512 0 R /XYZ 71.731 653.625 null] +>> endobj +1517 0 obj << +/D [1512 0 R /XYZ 71.731 623.776 null] +>> endobj +1518 0 obj << +/D [1512 0 R /XYZ 71.731 582.097 null] +>> endobj +1519 0 obj << +/D [1512 0 R /XYZ 71.731 582.097 null] +>> endobj +912 0 obj << +/D [1512 0 R /XYZ 71.731 521.5 null] +>> endobj +78 0 obj << +/D [1512 0 R /XYZ 189.727 482.128 null] +>> endobj +1520 0 obj << +/D [1512 0 R /XYZ 71.731 471.763 null] +>> endobj +1521 0 obj << +/D [1512 0 R /XYZ 434.226 462.003 null] +>> endobj +1522 0 obj << +/D [1512 0 R /XYZ 71.731 403.059 null] +>> endobj +1523 0 obj << +/D [1512 0 R /XYZ 71.731 390.108 null] +>> endobj +1524 0 obj << +/D [1512 0 R /XYZ 71.731 385.126 null] +>> endobj +1525 0 obj << +/D [1512 0 R /XYZ 89.664 364.369 null] +>> endobj +1526 0 obj << +/D [1512 0 R /XYZ 118.177 364.369 null] +>> endobj +1527 0 obj << +/D [1512 0 R /XYZ 435.626 364.369 null] +>> endobj +1528 0 obj << +/D [1512 0 R /XYZ 71.731 349.261 null] +>> endobj +1529 0 obj << +/D [1512 0 R /XYZ 89.664 333.485 null] +>> endobj +1530 0 obj << +/D [1512 0 R /XYZ 71.731 331.328 null] +>> endobj +1531 0 obj << +/D [1512 0 R /XYZ 89.664 315.552 null] +>> endobj +1532 0 obj << +/D [1512 0 R /XYZ 71.731 300.444 null] +>> endobj +1533 0 obj << +/D [1512 0 R /XYZ 89.664 284.668 null] +>> endobj +913 0 obj << +/D [1512 0 R /XYZ 71.731 277.53 null] +>> endobj +82 0 obj << +/D [1512 0 R /XYZ 200.128 240.314 null] +>> endobj +1534 0 obj << +/D [1512 0 R /XYZ 71.731 232.962 null] +>> endobj +1535 0 obj << +/D [1512 0 R /XYZ 71.731 187.149 null] +>> endobj +1536 0 obj << +/D [1512 0 R /XYZ 71.731 158.421 null] +>> endobj +1537 0 obj << +/D [1512 0 R /XYZ 71.731 158.421 null] +>> endobj +1511 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1540 0 obj << +/Length 2153 +/Filter /FlateDecode +>> +stream +xڭ]��6콿"ȓ�%�m�+����6܀�� -�>8��u�����~�H��e�����Z�(�ⷔp��p��~&�m�(M��E�8�ʛ!cle���=���G![����a�4]d"��$Z<�?x�N�E�n����>}���Hû��wU�����//^?X����m.�)���*�F���ϢE侈c-қ�X+�M_T4nY��wo�H��48�B��I�6J���������Y�h��ֵ}���Av�)eOЃa�NL�Rt��8�pWUy��c;0#Iݶ��R��%m��#A��d���OW��WsM�WDro��#����(�X�v��[4H���uѰυ��p=��Č+���H^�]{�3�m��M4�&�.6"��(��~��[�����g��j���J�~�U�b{V��S 3�w\����h�?��D������ �FOB�g��� �!f�2[Pq�T�S�e]����ne�Y��[�B]5��X�� �� dI�T�(Og�(�������$I�5��Di��-�n�w}�_�!:��QK��[�[��!� +ƍ�Jʽv���a�V�c�Z;���危��s���Ig�x0ByɌ"���Ox3�b�58,�媄��������pm�~�^�W�.�uhb +��F9�`wR]�>M�W��}:���W9m�M:�M����>z,�wVD��$���~M3�h08=�Fl=�B���x�� �fK���(@�7t��v%����oc�V�R��5ڔ��̦�izLS02����eCK:�� +�`��DgQw�R��_A�P�H�j�>��>2?]�4٪7tA�%�i�Q�I!B� pt�a>����J;;�Ɇ�[���q��yW#TS$�S�MQ��u+����<7�G��� �_�����X�բx�h<7���;JE���ݖ��tVʢ�p�jl�{�AM���#]��YW0`��~�}j��}�t��J0����i7�� �{Z����6>L�H�x_�i�(�czQc��;���VM�c��}F&� ���[�@�e�TGW)#���N�Zi8�V�����vIwk�e9_ր�ʑ�}\����H��x �ʯX EV�Ro�J^� +=/kyaH��V%Z�"FN�º���N@�j��0��S5@�P7���֪� �Lg�B �k���ӥ���X�q�UM�\b��lWy��;�ʼn��0^@���� iW�i#�M��;̥�����_.0��ߡ�Tpߠ�V��$y�G�^Ч���=)��:����yh5�'�w�ҖS�,�����w�\ׇ�e�n��t���zP���ګrD0 ��n��T�1ǃu�#��o��1�L��fA��[���SϚ��6Q&cQL±�`� +��mK&f.{ze�@ ��ڑa�L.[t�M���AP�d.���b�T|[��9* +������d�zI��(r��)㣳8�y.��ن������)��W�/�z9�P/_;�`2 +f��5�C�k�s��֘��� ��=p��v���c�g�$�,fn�(�Җ�`n� d�b;�Yò�`X!���O�����"��vTgqVqa�oϲm�D�?��O�ᔞL� g�_O /(�oݔjkB��Z�����bP��������4�N�5.�����n����40f��rw�h��d�w���p���Ps� SR�Q�֝�X��KU�6�Y��yW���r���6�h�W��`O<q���p��Ֆ�z$�kK�rc��R�qe�{Y�ٞ8��ۛ��Opn��7�g�ӹw�����`�sz��!�ę�t��>`�1�q1��@'{Ez�`����%�ѳ,�\{���n�����Ʒr�-g�ޔ�R�a��jK��%y�d*�����MX6��2�1�A���@_~qH��b�L�4�7���̛�v=���+K�*ƚ&�Q��<F����cB�� �O���o�Q�9�BL�J��v+���1���߁Fޮi�u-� ��y ��i��=��ؒ�@cIژCΩ�4`�D�\c��P�UaLh8ڷ����m��t2+� �j[ۂj���R����O�� k���ͼk�����o q��a��_F��!� �TP���~D���Ǵlzendstream +endobj +1539 0 obj << +/Type /Page +/Contents 1540 0 R +/Resources 1538 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +1541 0 obj << +/D [1539 0 R /XYZ 71.731 729.265 null] +>> endobj +914 0 obj << +/D [1539 0 R /XYZ 71.731 695.064 null] +>> endobj +86 0 obj << +/D [1539 0 R /XYZ 299.665 660.593 null] +>> endobj +1542 0 obj << +/D [1539 0 R /XYZ 71.731 651.955 null] +>> endobj +915 0 obj << +/D [1539 0 R /XYZ 71.731 610.68 null] +>> endobj +90 0 obj << +/D [1539 0 R /XYZ 364.509 575.313 null] +>> endobj +1543 0 obj << +/D [1539 0 R /XYZ 71.731 566.675 null] +>> endobj +916 0 obj << +/D [1539 0 R /XYZ 71.731 523.343 null] +>> endobj +94 0 obj << +/D [1539 0 R /XYZ 295.625 490.033 null] +>> endobj +1544 0 obj << +/D [1539 0 R /XYZ 71.731 481.395 null] +>> endobj +917 0 obj << +/D [1539 0 R /XYZ 71.731 425.111 null] +>> endobj +98 0 obj << +/D [1539 0 R /XYZ 378.198 391.801 null] +>> endobj +1545 0 obj << +/D [1539 0 R /XYZ 71.731 383.163 null] +>> endobj +918 0 obj << +/D [1539 0 R /XYZ 71.731 339.831 null] +>> endobj +102 0 obj << +/D [1539 0 R /XYZ 288.511 306.521 null] +>> endobj +1546 0 obj << +/D [1539 0 R /XYZ 71.731 297.883 null] +>> endobj +919 0 obj << +/D [1539 0 R /XYZ 71.731 254.551 null] +>> endobj +106 0 obj << +/D [1539 0 R /XYZ 259.078 221.241 null] +>> endobj +1547 0 obj << +/D [1539 0 R /XYZ 71.731 212.603 null] +>> endobj +1548 0 obj << +/D [1539 0 R /XYZ 71.731 171.328 null] +>> endobj +920 0 obj << +/D [1539 0 R /XYZ 71.731 138.386 null] +>> endobj +1538 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1551 0 obj << +/Length 1953 +/Filter /FlateDecode +>> +stream +xڍM�۶��_��%��M$E�^j�4u2ɴ�ȇN�DAc�`0�2����.(>Iv2�<����~S�"��b�KR�I�-��M�8�����L�f��������o�X�a�����H�E�/6" �,Yl�� ^N��jX��, +DH�GSwGߏ��릑���߽��v��MX�:y�;�����2��?.*B��N)�anP�M�JZR0I�Ǯ�o%jO����*�����ba�����-�����Չ����i�����Zi�}]�H@SZ�Q��n�+�l�80TO�~%b���}}X%Yp����0�>�]�Z�(Wq� c;��@�h!g��O�o��yڱ��!�{��椗G�����0�3��& +�<f/&���X����cۺ7=��a��Ƕ'��hTek�������G�E�����- +��9����G����2�e��'�J��W����#t��<33��9?B���$�b6Ļ����j���K%ݳ�,�d���ae�n[E��@���F���*��7Kk�4��^�&�����{�� �e���.q�!L�P'$�\�YydM�+�`SVg�X^�Q��~Pօ9�]h��b�h7h4��@}ʲ�m���ڜ�bX�Q�D��G�`�l���`xH���Ms��VR�vZ���Wz�Ж-Z+5X�3 F� I1��L�p�[�2~�7H�B�l{P�� +r��.�D�͘#v��~��|>�r���%�q��L���3�r�@� +џd�?@��@c�aI�+*�G�jN�~�J��w��_k=rn���|��`vw��(!G�0*9XH[���f�I�!M�D0;��L<�*����J��$�d��U�je�X�|Tl/��ɽ� ++ >n0�,�#��� [���sZ�?h_�4��*&������{w{͆�� ��w�H +�РA�p!��~���YLm������� I���tc���4���){�醥9��ܻ$U��� ����K�d� +�)֞���n��#jd̓��������p�#+(��$] =$������'�3-$$K��{�ƺ��|2JT�����殸�'N,�@I}�Z�"�����@��ʹh�� A��x>ŜZ�I"�����ԍ9(��C��_w���i�)�'e�>��k��K5��!GM'��qD��a0w�� 8��q ���v`�;����(BTKb�s[^�L +Z�h��"�'�L!4K���h#TK:u�H�a��ض�y��4�̭��Hްj�����UNI�O�����<y���4�?2��Mʆx~/���ce�M��a�)f&�s��Y���йV��q�`��IFHJ��Ͳ�i�T���㯐���0+�����Eq��A� ��)�uv� +' Cg�A�j N�OD)�,���2?IgT�{5�(���_��Óm8���goQL�,��B���y0 �h���9��~lB��R"�R"���$��v����#*�������1�S�p������"��F�r,>�C��˷`Dj�j�4��_�踃���4)3��37� ���`�%�z��?ro�Ƞ���oi�,��7��k�"�} �V^0�l ꕆfN��|u9� Bq����6F�����vU��tbqn���qs6����@�3mJ��o��`��KT^g��=�4��à �U�G�yNA+������9�@C����`��S��1�1��h��!�Z���}6^^��ݜk_N�o33�#�"�l��d߫�����6���Ã�`o�YE�� +O�����o8����w��i�ڃ��O�A%~�IN�xj6��w�����ȗ���$��dF�.F��Q��Љ�w}���5�S�����H��u�](�nz����nހ?���p���j�ao���ؕ���,�17�L��q����%� S#�endstream +endobj +1550 0 obj << +/Type /Page +/Contents 1551 0 R +/Resources 1549 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +1552 0 obj << +/D [1550 0 R /XYZ 71.731 729.265 null] +>> endobj +925 0 obj << +/D [1550 0 R /XYZ 71.731 741.22 null] +>> endobj +110 0 obj << +/D [1550 0 R /XYZ 240.476 708.344 null] +>> endobj +1553 0 obj << +/D [1550 0 R /XYZ 71.731 699.706 null] +>> endobj +921 0 obj << +/D [1550 0 R /XYZ 71.731 649.4 null] +>> endobj +114 0 obj << +/D [1550 0 R /XYZ 223.845 606.302 null] +>> endobj +1554 0 obj << +/D [1550 0 R /XYZ 71.731 594.131 null] +>> endobj +922 0 obj << +/D [1550 0 R /XYZ 71.731 582.586 null] +>> endobj +118 0 obj << +/D [1550 0 R /XYZ 223.569 545.371 null] +>> endobj +1555 0 obj << +/D [1550 0 R /XYZ 71.731 538.019 null] +>> endobj +1556 0 obj << +/D [1550 0 R /XYZ 280.568 499.343 null] +>> endobj +1557 0 obj << +/D [1550 0 R /XYZ 71.731 466.267 null] +>> endobj +1558 0 obj << +/D [1550 0 R /XYZ 71.731 466.267 null] +>> endobj +1559 0 obj << +/D [1550 0 R /XYZ 71.731 387.539 null] +>> endobj +923 0 obj << +/D [1550 0 R /XYZ 71.731 356.555 null] +>> endobj +122 0 obj << +/D [1550 0 R /XYZ 197.015 317.282 null] +>> endobj +1560 0 obj << +/D [1550 0 R /XYZ 71.731 309.363 null] +>> endobj +1561 0 obj << +/D [1550 0 R /XYZ 103.934 284.206 null] +>> endobj +1562 0 obj << +/D [1550 0 R /XYZ 105.405 271.255 null] +>> endobj +1563 0 obj << +/D [1550 0 R /XYZ 71.731 264.116 null] +>> endobj +1564 0 obj << +/D [1550 0 R /XYZ 352.773 253.322 null] +>> endobj +924 0 obj << +/D [1550 0 R /XYZ 71.731 235.29 null] +>> endobj +126 0 obj << +/D [1550 0 R /XYZ 185.739 196.017 null] +>> endobj +1565 0 obj << +/D [1550 0 R /XYZ 71.731 188.664 null] +>> endobj +1549 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1568 0 obj << +/Length 2171 +/Filter /FlateDecode +>> +stream +xڍXK����P��T�D�o1���n2�u���V%�}���I0���ӍnP�4�t`�эF?�n(X������"����ɪh��V'X�뻀wly�v����ݷ��h��y��UE~���, +�}��O�}%�A��m��ȧ�W������T]��/����x�L����ћ:�=7J��E)w��ޏ�����n�Y{o����$¨�!J��-t��v0> թ%�ap�cOT+���.��}����,�)�Bv�x��:�68��:��`P�X��>3�q:��R�+�GGIL%@ʓ64��w��{GX��V����k��o[���l�p�%��H7�V-Ͻ1��4�@D�K1(�7��[=�x$�"Z1�>Eg�1��*���i���~D�v^e μ3?k��0��_��ҽ'���,ۆ&{1T6�*��L/��MG��|�N�{'�XTc�l���-���0U�Alhp2i���/�I>���Ӊ�%�Cg]�b���Z:}&u�i��^�����0�������8��c +��@�RK3�9N<��q�yx�����6&~[�'��n%UiZ�3�Kv8�4�BI;m$�hK" +a��N�f��B�ˡ��=Ɖ�Mk�����B찎�W E��p���4e4� N�7�$�\�ƹ�JY��h����*<[q��U\ސx�m×�x��V�0��2�����;�r۩�Zc���k��fy���������j���T��w�HC$"��O>���������nކDL�����e>�M}U#N��� I4��×�V�5҆FcA�R�� ���@?�Z� O!�J$�vH�S)�� ��G���)8�.���n��q�!gYw�^�M����\0����Y��A^C +�6ۮ�g�V�k��0H("��1�>^E/��[XOX�0VR5�/�P����x��g�HM�F<�-t��� ��(4T��J�l��<����$Š,j�_�́1�htNo�p[,`�|Z}�2�W���Q��Y�ؕkLB��� ��P�8/�.�4:�8O5X��U+x�j�[vy�%Ia�m"N��0F=a^����F�H���P�� �C��ܻ��������QXGi0`*\,�����狽e]�}��>gWe�^,���B��J�0F +�|Ɋ����:�c}�J��Rࢫ>K���0�h�_3��u�v����Nl���m % �&��=T��5�|�3��md��}���p�Zx���&Q�{�+�w��P��}�3�PD�:M�_z�Ɉ��B��Z�]8J�.w�A9v�:�5��t5� +J���_aXp�R��(W���j~���-+���ɜ��0�f���a�0ȥ�r��2bx�'���^�����d�'�����}��D��}����^VU���_�ʋ�h0t��� ��K��&���$����~��b�� ��G[?���~8�hU��iv�ԉSG�-Z��t��D�a��d���LWONm�=�.��2y��E�e���=@�B�X�q�(��B�<C~����bo��N�n���!KL��wA����/�~�f�z,�.Dt�����WbW�R˲�Ι�a^�Z��/���� ���|,��WÙF��g�/9}�0imׅ#���:]h.!����N��P֎(�mq�m��ؓ��DDQ�Y7����:ʠ����Bpf�;�Ft�r�P��0���`��l�������;9�=F�pVG``���X tG�5�����Yk��Lu&t% ��8Mߋ�� ��)"��"b�#�ҭm���b�C� ! +ګ㞠��U�+�S���;�,)COa�!DT���ˬ��6��I��AƘ^|��W���RB7D�K�S�Ȥ~�3�i��i&@��V�S�_�%����[h�}1����.G[=��d�+zW�ch�'� n=�wrr49wvʱ� M��6��;~�bM8�"�/U앲�-cο�x�Ͱ���R�:�����A�ڊ�=:/�3���6р �_�0hD)���3z�C7�d om�'ӻ���E��z[��t��A���R�k|������[g��a]� +|X��R_*UTW���d��j�l8t�o��W������ٛ_�����{:!x� ��woO�?�8��endstream +endobj +1567 0 obj << +/Type /Page +/Contents 1568 0 R +/Resources 1566 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1452 0 R +>> endobj +1569 0 obj << +/D [1567 0 R /XYZ 71.731 729.265 null] +>> endobj +1570 0 obj << +/D [1567 0 R /XYZ 71.731 718.306 null] +>> endobj +130 0 obj << +/D [1567 0 R /XYZ 198.349 651.039 null] +>> endobj +1571 0 obj << +/D [1567 0 R /XYZ 71.731 643.686 null] +>> endobj +1572 0 obj << +/D [1567 0 R /XYZ 71.731 599.93 null] +>> endobj +1573 0 obj << +/D [1567 0 R /XYZ 71.731 579.94 null] +>> endobj +926 0 obj << +/D [1567 0 R /XYZ 71.731 536.105 null] +>> endobj +134 0 obj << +/D [1567 0 R /XYZ 189.727 498.889 null] +>> endobj +1574 0 obj << +/D [1567 0 R /XYZ 71.731 488.524 null] +>> endobj +1575 0 obj << +/D [1567 0 R /XYZ 71.731 458.675 null] +>> endobj +1576 0 obj << +/D [1567 0 R /XYZ 71.731 429.848 null] +>> endobj +927 0 obj << +/D [1567 0 R /XYZ 71.731 386.944 null] +>> endobj +138 0 obj << +/D [1567 0 R /XYZ 246.672 343.847 null] +>> endobj +1577 0 obj << +/D [1567 0 R /XYZ 71.731 335.024 null] +>> endobj +928 0 obj << +/D [1567 0 R /XYZ 71.731 307.179 null] +>> endobj +142 0 obj << +/D [1567 0 R /XYZ 229.58 269.964 null] +>> endobj +1578 0 obj << +/D [1567 0 R /XYZ 71.731 259.599 null] +>> endobj +1579 0 obj << +/D [1567 0 R /XYZ 406.408 236.888 null] +>> endobj +1580 0 obj << +/D [1567 0 R /XYZ 512.678 236.888 null] +>> endobj +929 0 obj << +/D [1567 0 R /XYZ 71.731 203.847 null] +>> endobj +146 0 obj << +/D [1567 0 R /XYZ 210.471 166.631 null] +>> endobj +1581 0 obj << +/D [1567 0 R /XYZ 71.731 156.266 null] +>> endobj +1566 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1584 0 obj << +/Length 1061 +/Filter /FlateDecode +>> +stream +xڅVͳ�4���"�ҙא��2p`��{n�^;��v�_��%��uY&K?˒�/�Hr���+�����fe�$���'G���`�5���d^vO߾��d�m�*������m��*�MS&����������u��i����)}$�e9���Q��������j���l����S�yp��nNŻ囬�����lW�Tj��<��tq�M�'�F���{&x���Rx9���Lo�ID!��!؟$AoރfGt�<��<�?�a\��&��i����|"�bBz� ���jU��G<+ ,df�p��B��E�m9#��"y��q$�b�*!G�=�Q��U��Bx�[�:@��7���b����Rޟ��T�2-ܝT��fU6�Y���F��2Z�W�R��(]� &`��Vh�@Ti�����Q� Q�F3���OB%ѳ5d�q�ަ��6�ȣ��hZOfT����&��6�^�l��Z,���l�u�fm����w$�x�+��*K�ev!�6{�h�n`=��X7Ě��"��FO��Ī��FO�>��LĀ@�E���[J�H( �C�u)�8���С���^P_(�6��7l��h�?��W<R�m�怬�"k���8LJ+�-5���yQCw�`�c��f������m�_1.����7��5��PLe�����r��M��6$�Y�3�Ԭ�q�6��%a/0uB5�x?��g��!X�g� 4=���ڳ{%Hd֫%n�.�γUG������m:X3���jK�����^���B��[ ��t��D^c�p��jhN��asa�K����W +(�M���S���J8.��I0�x�c�=��G0/.������1�D�D��uA��i�k�����й�0�Sc4���Tu� +�y�s���� :�6�H��E��Iae"i�O���!���[���\�S���͡��g��\�����);,='�h�2�W�1�Js!� :��ȟ�/�c��!&��3��9�cG�@���R�9#�M�����?*�Qo�M�}���&���Ԕ�,/�RQ��ѣ��8>�uendstream +endobj +1583 0 obj << +/Type /Page +/Contents 1584 0 R +/Resources 1582 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +>> endobj +1585 0 obj << +/D [1583 0 R /XYZ 71.731 729.265 null] +>> endobj +1586 0 obj << +/D [1583 0 R /XYZ 71.731 718.306 null] +>> endobj +1587 0 obj << +/D [1583 0 R /XYZ 71.731 680.284 null] +>> endobj +1588 0 obj << +/D [1583 0 R /XYZ 71.731 665.34 null] +>> endobj +930 0 obj << +/D [1583 0 R /XYZ 71.731 616.289 null] +>> endobj +150 0 obj << +/D [1583 0 R /XYZ 194.088 576.917 null] +>> endobj +1589 0 obj << +/D [1583 0 R /XYZ 71.731 566.552 null] +>> endobj +931 0 obj << +/D [1583 0 R /XYZ 71.731 536.702 null] +>> endobj +154 0 obj << +/D [1583 0 R /XYZ 196.498 499.487 null] +>> endobj +1590 0 obj << +/D [1583 0 R /XYZ 71.731 492.135 null] +>> endobj +1582 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1594 0 obj << +/Length 2474 +/Filter /FlateDecode +>> +stream +xڭْ�6v#Rw�=jR;�IugS[Id�nk[=:�����LY�*���r�J����T�4�F�B%�<=�gX���d�(I���o,n�0y���o���M�+�$�WO��J +&���/��Ź��f��l j?4]_�u�W������E#S�d�h��D��C$$o{��y�ۨ`����?A�x�U.�$d4J�Y4�����&l���Xt�Q�� MuCY�;u�Fka�{��=���f#�5����F��nu��9���<D���:Z�����ZQ�L���v�����4(k�h�\4{<)N*����cU��3D�7��� [���ُ�tl��ф���֎ +�3BkZ����J3@,�ԩx����U�b��.�����MKs���}�b�U�W�Ȋ\�(�8^��ѕ=�ϛ�n +���o��� +�g��h]Pi��%���9��Ĝ�R{�����B�d��}'yz�Q��"G�,���xiG"����h�8�,�B�����P�c�uC�Ih=��G]�P�3v�v�����}�20̵V�[��i8�hߒ�#28D���p��DP�����7E8�DF k*�%$��������4a��Gӹ)��K�}�@��gc +vN��!4Z�f�^F��ocxC�ս��� PeU�x�3�p>�E�6֪a/�CNJf�ҩ�RBdN����^'��Zڨ&�Vݑ! ��L��������;�E{��G�i}m�a +A��bp�(�o���z@��}�_#�x]G����#���,^$�`�_#B�⚚����h�Pd䰟~�-X�����/�^8 +��|%E���V��?�� *���2Y�A{-\<G�u�l�(i&�[^��"�k Eg�8�`��&��A���VfJd�7xk�;�U���Gδ�*��ź�5 ���-�y6f�{�sֲ�� [[�"�]=�VOqu��3/U��0`����h���9ƶ��^V6y���� w�sȀ]�BU��%�I�k;ʕ�u�����F��<V�v�MHA@J���&/��� �Bތ Re��|?�� q>G�A�K +᭹;f0+�&GN����S����1C�����Ti�f�X�rq�t�u�]��)��#]�PSC�K=�*p4��qE��n��n�Wnf�l���Ȏҋ����Q��P7|�X�뫐Xpt*��(�e5�(�Zy^�'> +f�� ����㇎��o�\DP1�)Ł�#�O�r�<�cm�N��I سY�]�[]��hv��1\K�^��tqSL��Ѹa�6���C�kp0ֱo���������|��Ьyy���И�+�pZ����L�#ϔrN��&Ɍ�~8���鍠�IP�����^wծva�L�Upk�fN�.~�� ��u�EJmC�T��`��PŜ=��U~�8/�Rad��K!�#�aGo���k������5���u����/�0�g�]!;��#��������"�"2\5� �W\b�D�Ӈ�= +��l]1��Q�T Қ�9�5;��J�l�=،GP����lR.�RYpg�3XSAj��;�\��t�{ �yD�uN4 i��Ŧ�n���r�ڹ�ڶ|'y��\`�~�h�����T��ܚs[���]�_!$k!d8�RC�z0� A��V�Gݢuݎ�AP��|��"I�e����C���Ƿ��1�_�\�2[��Y�.�$� �_�ؾ$�HBW��F�\���6 ��ژ��m,p��q5����g���Y�,��!���T"� +�]P��R����� ���/P�W�s5W�����f:I�HJ��gp�|��L����E2=������WN�W��_�v�n9����Qr�� #)12\d��� Y�� +��kr�+'H��N �̻����{�4��=�� i�:�7bH��d1&Yvr��3$w%;b���ϒ�녥G��+��g�)��b�`�� �/�2��^aI��0��O �#�x �?vB��n��&;�\�x�G�Y�ų�z�jᅾ?����+�b���S-���f��-T���,ϯG�5$R�Ɣ�W�R�k�������^,pO�� ��o��G���&#�|������A�䝘tN����!g�����j��C!P�#k��+����b�Z#%b�b��碝�N&)�B�����'���SS����Pͯ$�=��Z렙s�/���-�%�- ���� k���@c��U�ڿ���7*���XY|OWԹ� ��D����{c�U�\��OJ�`�?]��:jhnd�0�jV��,{s�<�{u�ל݇˫g.p�kՂ����V��P�{�\�Q"�$g��֓<����~��CkŅ�� �RO6�����3Q&2�.���V�Kc؉T9$���}�rߎ���qendstream +endobj +1593 0 obj << +/Type /Page +/Contents 1594 0 R +/Resources 1592 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +/Annots [ 1598 0 R 1601 0 R 1608 0 R 1610 0 R 1612 0 R 1614 0 R 1616 0 R 1618 0 R ] +>> endobj +1598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [252.226 601.54 297.904 610.452] +/Subtype /Link +/A << /S /GoTo /D (os-specific) >> +>> endobj +1601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.249 550.494 429.585 559.084] +/Subtype /Link +/A << /S /GoTo /D (os-win32) >> +>> endobj +1608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 321.187 149.718 330.098] +/Subtype /Link +/A << /S /GoTo /D (install-mysql) >> +>> endobj +1610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 303.628 133.11 312.166] +/Subtype /Link +/A << /S /GoTo /D (install-perl) >> +>> endobj +1612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 287.379 170.47 294.233] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules) >> +>> endobj +1614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 269.446 166.176 276.3] +/Subtype /Link +/A << /S /GoTo /D (install-webserver) >> +>> endobj +1616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 249.456 206.743 258.367] +/Subtype /Link +/A << /S /GoTo /D (install-bzfiles) >> +>> endobj +1618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.664 231.523 201.175 240.435] +/Subtype /Link +/A << /S /GoTo /D (install-setupdatabase) >> +>> endobj +1595 0 obj << +/D [1593 0 R /XYZ 71.731 729.265 null] +>> endobj +932 0 obj << +/D [1593 0 R /XYZ 71.731 718.306 null] +>> endobj +158 0 obj << +/D [1593 0 R /XYZ 287.548 703.236 null] +>> endobj +933 0 obj << +/D [1593 0 R /XYZ 71.731 692.504 null] +>> endobj +162 0 obj << +/D [1593 0 R /XYZ 263.681 651.159 null] +>> endobj +1596 0 obj << +/D [1593 0 R /XYZ 71.731 638.988 null] +>> endobj +1597 0 obj << +/D [1593 0 R /XYZ 71.731 616.649 null] +>> endobj +1599 0 obj << +/D [1593 0 R /XYZ 71.731 590.646 null] +>> endobj +1600 0 obj << +/D [1593 0 R /XYZ 71.731 575.702 null] +>> endobj +1602 0 obj << +/D [1593 0 R /XYZ 76.712 535.852 null] +>> endobj +1603 0 obj << +/D [1593 0 R /XYZ 118.555 492.306 null] +>> endobj +1604 0 obj << +/D [1593 0 R /XYZ 71.731 428.845 null] +>> endobj +1605 0 obj << +/D [1593 0 R /XYZ 71.731 374.985 null] +>> endobj +1606 0 obj << +/D [1593 0 R /XYZ 71.731 349.082 null] +>> endobj +1607 0 obj << +/D [1593 0 R /XYZ 71.731 339.12 null] +>> endobj +1609 0 obj << +/D [1593 0 R /XYZ 71.731 321.187 null] +>> endobj +1611 0 obj << +/D [1593 0 R /XYZ 71.731 303.628 null] +>> endobj +1613 0 obj << +/D [1593 0 R /XYZ 71.731 287.379 null] +>> endobj +1615 0 obj << +/D [1593 0 R /XYZ 71.731 269.446 null] +>> endobj +1617 0 obj << +/D [1593 0 R /XYZ 71.731 249.456 null] +>> endobj +934 0 obj << +/D [1593 0 R /XYZ 71.731 231.523 null] +>> endobj +166 0 obj << +/D [1593 0 R /XYZ 161.035 194.308 null] +>> endobj +1619 0 obj << +/D [1593 0 R /XYZ 71.731 184.165 null] +>> endobj +1620 0 obj << +/D [1593 0 R /XYZ 195.934 174.183 null] +>> endobj +1621 0 obj << +/D [1593 0 R /XYZ 71.731 172.026 null] +>> endobj +1622 0 obj << +/D [1593 0 R /XYZ 71.731 157.082 null] +>> endobj +1623 0 obj << +/D [1593 0 R /XYZ 359.457 147.583 null] +>> endobj +1624 0 obj << +/D [1593 0 R /XYZ 101.627 124.27 null] +>> endobj +1592 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F44 1379 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1627 0 obj << +/Length 2390 +/Filter /FlateDecode +>> +stream +xڭY�o�F����~X�g5�w�H���#w9l�C[kl��+�q����!%��h��"@�E��#g,��E(E�B�b����8����F2ŚI�=�o��u��w�]x^ b�/BW��W�����{}hL�Z+�Yz�����Y���,V�?��滇N��"��YeZ��6*�h�nʉ��yV�������<R'%Eh��ʜz5t��4����L��q�m������7�Hߥ�}�s �Ìs|�>n��}M��� wsh�f%��3�3<U� +"�S`%G�9� v;��1�BaLB�oJj7e��ݱ24\��@g���b��g������t�z���w�69����J�r���D�ど��0+�/|ΰ�N�\o��Ce˲�E�CpW]�V�l5��4�[�v�W�aQ4����hj��t���rg��uڳ������/:�G$�rněl?˜i�fc�H�k�����3���r�)n@�eR����x�V' y��t��C���(����P��O�Nt5[�u�h�cF���)�D{k9��\W�?+��������ȶ6���������-%�@��,���D���9"�c���͌ �����@tV�HM�AW:7�����{b���t� �>>A'��d����������i~�)\��J����~�8���:>�r�b����@�>n��1K�xoZ0��a� ���h�����:Kw�&;Ө\�-\�P3�u|)�������*Q\< y�<�&���V�;�L�{k�6�� +�?N�>�M|%K��J�5?�f��](OJ}�Z���㟨�Qlbp�؇-�*�ЖwWx���O�J�А�+j�|�� �d�?��W�d����e��*� ���-����:� +qG�'Z�"�N�е -%��:gf�7 �oh����3s��=�hˉg�M��/����(�|��`�!=�Ӝ���ab�uKߏ��@9��;3�L��� +*>T1�(�j��"Ӭ{DST1B�ޛ�E%_BM�ҝ���[�Y�J9� ܁x�8�L��t��9Vis^]P*w!=(�쉬�E��ڃ9��-O�w�0���|g�쪗�6R�7��%p�R?"����.�b���0���=:N���m�m��]�jjj�\� �L��u�6��=2ݮl��B �eË���r�����4�/;�N֞��&W�z�Pǫ��6���cZ��L}��jp����*�i���`�+�]�dko�>@�K����˺!�rK3�}��=�h��҂�5���U�z�mZ�۬A6�q��³�A�D��� F����=�A���jڼŴQӼ��]Y&4�&�Z��5��`l�Q�<�I�a��i�c����B�o���&��X�q������%��^����ä{�P7��ٮ��b�*iq%�����;\;�+�cf�ףطH7���;����-�J.1���X3|1���-��n��yD��M�cF�nz��p��Ǵ��1��I$���B�s�"K6�������k���[���j��2����Ř�=�����P +�YyL3k7�Ew��Yy�.f +?��9��՚��gZӄ���h��h���u�q�����bÈ7�W�_a�^.8����!3pJSǚ�c�VUY�.�A?�F�"p���3�8�-�`�rp +�k�T��`�ɪ�S�vP=���ˢ�I+���@���ܴi�d� M�G��\2�\����sPy��ӊ)�pCQW���Ub�u�f�@#6(�g��K�?����(�Y�L2+Y��^`{}�]����?�^"����D<��̫1b4)��ܚ ����wN��fV�����v��rU[K��]� nl�c>��c�,C��K"��d+��~�1zO�x����>�渧������ �K��%��8�>�(0A����������{���[�[�"�����>���S������^��0��E!���{]%���蓷��������+���kr)v/�B�c"�@8�oD\�&�X_�9�w���6�P�O��~L�_9�;��l�̈�_����?��Ͽ�=,`����m��Gï�R�$��tУ���8~�oI��4����k���E:}2�>�/�o ��+�u]�~.�6��p۸�!�������<,'�Rwwi���G�IJ��Q�E�@_��(j�v�Dw��{ٳ��O#�SZA�7��}�ډ�JN4�cP���e�~p^;ѩ����H���I����*�`�m�W�����%�g��>%�}g��T@���Z���5��k���BP��g2ͬ�T����@`������x�=����/|Ղ��?z��>0�ɕ�Wڪe�B���/�SI����endstream +endobj +1626 0 obj << +/Type /Page +/Contents 1627 0 R +/Resources 1625 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +/Annots [ 1631 0 R 1636 0 R 1640 0 R 1641 0 R 1643 0 R 1644 0 R 1662 0 R ] +>> endobj +1631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.243 662.351 233.635 671.263] +/Subtype /Link +/A << /S /GoTo /D (install-mysql-packets) >> +>> endobj +1636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.269 529.051 217.573 537.963] +/Subtype /Link +/A << /S /GoTo /D (security-mysql) >> +>> endobj +1640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.604 361.24 236.77 370.152] +/Subtype /Link +/A << /S /GoTo /D (gloss-cpan) >> +>> endobj +1641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.187 361.24 372.059 370.152] +/Subtype /Link +/A << /S /GoTo /D (gloss-ppm) >> +>> endobj +1643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [81.972 317.405 133.16 326.316] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules-cpan) >> +>> endobj +1644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.779 317.405 254.554 326.316] +/Subtype /Link +/A << /S /GoTo /D (win32-perlmodules) >> +>> endobj +1662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [286.394 97.928 294.245 107.138] +/Subtype /Link +/A << /S /GoTo /D (cpan-moduletar) >> +>> endobj +1628 0 obj << +/D [1626 0 R /XYZ 71.731 729.265 null] +>> endobj +1629 0 obj << +/D [1626 0 R /XYZ 71.731 718.306 null] +>> endobj +1630 0 obj << +/D [1626 0 R /XYZ 71.731 688.254 null] +>> endobj +1632 0 obj << +/D [1626 0 R /XYZ 268.947 664.508 null] +>> endobj +1297 0 obj << +/D [1626 0 R /XYZ 71.731 649.4 null] +>> endobj +1633 0 obj << +/D [1626 0 R /XYZ 71.731 611.676 null] +>> endobj +1634 0 obj << +/D [1626 0 R /XYZ 71.731 557.111 null] +>> endobj +1635 0 obj << +/D [1626 0 R /XYZ 457.285 544.159 null] +>> endobj +935 0 obj << +/D [1626 0 R /XYZ 71.731 524.07 null] +>> endobj +170 0 obj << +/D [1626 0 R /XYZ 138.296 486.854 null] +>> endobj +1637 0 obj << +/D [1626 0 R /XYZ 71.731 479.502 null] +>> endobj +1638 0 obj << +/D [1626 0 R /XYZ 468.002 466.73 null] +>> endobj +936 0 obj << +/D [1626 0 R /XYZ 71.731 420.737 null] +>> endobj +174 0 obj << +/D [1626 0 R /XYZ 200.472 383.522 null] +>> endobj +1639 0 obj << +/D [1626 0 R /XYZ 71.731 376.169 null] +>> endobj +1642 0 obj << +/D [1626 0 R /XYZ 71.731 343.308 null] +>> endobj +1300 0 obj << +/D [1626 0 R /XYZ 71.731 317.405 null] +>> endobj +1645 0 obj << +/D [1626 0 R /XYZ 71.731 279.681 null] +>> endobj +1646 0 obj << +/D [1626 0 R /XYZ 71.731 261.614 null] +>> endobj +1647 0 obj << +/D [1626 0 R /XYZ 71.731 261.614 null] +>> endobj +1648 0 obj << +/D [1626 0 R /XYZ 71.731 235.477 null] +>> endobj +1649 0 obj << +/D [1626 0 R /XYZ 71.731 215.387 null] +>> endobj +1650 0 obj << +/D [1626 0 R /XYZ 71.731 215.387 null] +>> endobj +1653 0 obj << +/D [1626 0 R /XYZ 71.731 204.48 null] +>> endobj +1654 0 obj << +/D [1626 0 R /XYZ 71.731 194.043 null] +>> endobj +1655 0 obj << +/D [1626 0 R /XYZ 71.731 181.168 null] +>> endobj +1656 0 obj << +/D [1626 0 R /XYZ 71.731 170.731 null] +>> endobj +1657 0 obj << +/D [1626 0 R /XYZ 71.731 159.075 null] +>> endobj +1658 0 obj << +/D [1626 0 R /XYZ 71.731 135.95 null] +>> endobj +1659 0 obj << +/D [1626 0 R /XYZ 71.731 135.95 null] +>> endobj +1660 0 obj << +/D [1626 0 R /XYZ 289.921 118.017 null] +>> endobj +1661 0 obj << +/D [1626 0 R /XYZ 71.731 115.861 null] +>> endobj +1663 0 obj << +/D [1626 0 R /XYZ 355.664 100.085 null] +>> endobj +1625 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F23 793 0 R /F51 1652 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1669 0 obj << +/Length 2348 +/Filter /FlateDecode +>> +stream +xڭZMs��ϯ�Q�c���%k{�q*ޚJ��Ves�%Zb-EjIj&ίO7�!Q"ٻ)�|�?�� ���y�g�V��?U~����l�y��qǐ��~���gcf�J#3[�͂ R��b�$�g��?���������y����j��,����ſV����d)4�J#�q���`!�T�(�fQ���O-�UqX��O���ԩ2�-#�%�:��/�l~��C�Sz]�eVT��vYG�/����T��7�2o)�(����JA�����x�q��{Eɗ�exW�1h�� D��i\E@����<q���w�<��$����|;����1��ПyѶE�����?{�_�F_�2�7|��~��P�x;B?��;�u��[�mF�{�;"T�\��gMq������ +4��{�ZW{͙w<os�њ�4yۑ\ź+�pDWyN:)��/�G�X���~.�; s5�����ך +��e��W��-︵*_��gO�[���Zև}^q�e��,�7ϸ�93o0���{L�}o;�C�<���%�L���z�!� ����矨�Zj)�m�EU���XWsų�!���5��%���/mN�ɡ2Ǽ�gި '���a/8�8�9�s�0*��HA���h��v~�$UQ���b[�m{��:N�E2���!C-C����[�E�45�����>+J�@ʢ�Zg�a��sm�sI���5�퐻�ᒶ��u�;����zH�;�>v�����`�Q�=XVI@���7%E�1�z(������8݁,L�����@����OT���%� w=-=�W� I��m�|Q0f�����U�Cc�U�+2+��Y��M�/����`�Ȯ9��S�ID�8�h[G��e��8 +����]�P!�5Ɣo�}�cv��o�Kq�;�!�rBdE5��Ԟ +�P��!�ܟsh�1VN����מ��h"���/F4� �*Աgu�*� �A$�4�a�4p�j�4�u�+��Y=<=|��FHvCDc�|r��<lz���ľ��d��@�����n��4%��3�Ǭ˖�����k�)�%/0B2�CXa�7��y�.9?�T�IJ�ϘI�3 ���ںE���S�� +$�U�3��n����*mB�!#��A�"?�0N��ג��, +q�L +��M +1�u�+'D����d�\p�?��S��Y��o���{�`�F�:c&=��Oz~h�����{�����{�k9�Fy�]�0�U�!al.���מ�$��&�,�3)C�n2)���-"��=V����퐯�; _��/��aD����o�,���i��E�=̔�V�) Fl� �Ċ1}V$�j{�|��8���.nC}s��Z���m�Xib#jw=�P��F�ΛTah�VN�-��f:(� ���;�i���q���"/�`B�KMp�jQ�3dJFXM&�#�n�D`�4��"Mp���[.l���ðE�8�h]�M꛷Bx�^{ڜ�J�;�*M�9 ��$˪�G4�?���ԩO%�3�D����L�5���JFlݢ��ʩ�c��8�XE*D0D���/�\��6V>��V���o3^�#�qK��.k:�R7.��1�O�gȔ4��{ � �@�!=J����sf�X�H6u���$���>M��/H��a3�C��"#�n�H`�D����/��}Yӎ����Ƣ?F4��C/J.l_�.�:}H��(�.o��]�:��j���fR8��VFl�"��� �c���'X�vc_�8=�0�Q��A_X�%��f���k�,�3)C�/0#�nJ`��B�.7ߕ�vpϭ�6���)د�:����M����!���[��&�r��X�<�|/GF�a":�aD�:�M8�����1����u +�H>��0S�9���g�� �I��gE�u��_�l3&���M%8�hW�$�.l�D��M�u����-k_��w�V�1v�m��Z�NOi������/ě=xn�� +J]Ҏ�^��{|�2���`�D|�g^~`Is�*{�lK;*��kN��mI�PEJ�jj�UT���{���Za~�l?�����[s�}bK^ߩ�HoQ0ɝ��N�U���}<�) +r�A��!�����.+��ͭ"|-�����v����ƾ��\����־.����.�P�����s6Wa\ZT��aCp����%N鷦ȫM��r�/����+W��;ؼk��R��4N3^艂�.�@�����u��a<���;_�r�l����<�B�vʪܡ��h�vW��Y��D�⓴3d�" /�=�5b���ԃ�����ܨ�endstream +endobj +1668 0 obj << +/Type /Page +/Contents 1669 0 R +/Resources 1667 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +/Annots [ 1681 0 R 1684 0 R 1687 0 R 1690 0 R 1693 0 R 1696 0 R 1699 0 R 1702 0 R 1705 0 R 1708 0 R 1711 0 R 1715 0 R 1718 0 R 1721 0 R 1724 0 R 1727 0 R 1730 0 R 1733 0 R ] +>> endobj +1681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 526.361 160.238 535.273] +/Subtype /Link +/A << /S /GoTo /D (install-modules-bundle-bugzilla) >> +>> endobj +1684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 508.428 136.438 517.34] +/Subtype /Link +/A << /S /GoTo /D (install-modules-appconfig) >> +>> endobj +1687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 490.869 109.31 499.407] +/Subtype /Link +/A << /S /GoTo /D (install-modules-cgi) >> +>> endobj +1690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 472.563 149.15 481.474] +/Subtype /Link +/A << /S /GoTo /D (install-modules-data-dumper) >> +>> endobj +1693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 455.004 145.135 463.542] +/Subtype /Link +/A << /S /GoTo /D (install-modules-date-format) >> +>> endobj +1696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 437.071 109.31 445.609] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbi) >> +>> endobj +1699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 418.765 143.083 427.676] +/Subtype /Link +/A << /S /GoTo /D (install-modules-dbd-mysql) >> +>> endobj +1702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 400.832 132.562 409.743] +/Subtype /Link +/A << /S /GoTo /D (install-file-spec) >> +>> endobj +1705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 382.899 135.74 391.811] +/Subtype /Link +/A << /S /GoTo /D (install-modules-file-temp) >> +>> endobj +1708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 364.966 160.119 373.878] +/Subtype /Link +/A << /S /GoTo /D (install-modules-template) >> +>> endobj +1711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 347.034 137.235 355.945] +/Subtype /Link +/A << /S /GoTo /D (install-modules-text-wrap) >> +>> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 301.206 106.54 310.117] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd) >> +>> endobj +1718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 283.273 139.197 292.184] +/Subtype /Link +/A << /S /GoTo /D (install-modules-chart-base) >> +>> endobj +1721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 265.34 144.577 274.251] +/Subtype /Link +/A << /S /GoTo /D (install-modules-xml-parser) >> +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 247.407 136.976 256.319] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-graph) >> +>> endobj +1727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 229.475 157.728 238.386] +/Subtype /Link +/A << /S /GoTo /D (install-modules-gd-text-align) >> +>> endobj +1730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 211.542 149.558 220.453] +/Subtype /Link +/A << /S /GoTo /D (install-modules-mime-parser) >> +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [92.154 193.609 142.356 202.52] +/Subtype /Link +/A << /S /GoTo /D (install-modules-patchreader) >> +>> endobj +1670 0 obj << +/D [1668 0 R /XYZ 71.731 729.265 null] +>> endobj +1671 0 obj << +/D [1668 0 R /XYZ 71.731 690.411 null] +>> endobj +1672 0 obj << +/D [1668 0 R /XYZ 71.731 670.486 null] +>> endobj +1673 0 obj << +/D [1668 0 R /XYZ 204.375 647.173 null] +>> endobj +1674 0 obj << +/D [1668 0 R /XYZ 465.976 623.861 null] +>> endobj +1677 0 obj << +/D [1668 0 R /XYZ 71.731 584.309 null] +>> endobj +1678 0 obj << +/D [1668 0 R /XYZ 212.442 571.357 null] +>> endobj +1679 0 obj << +/D [1668 0 R /XYZ 71.731 559.612 null] +>> endobj +1680 0 obj << +/D [1668 0 R /XYZ 89.664 528.518 null] +>> endobj +1682 0 obj << +/D [1668 0 R /XYZ 71.731 526.361 null] +>> endobj +1683 0 obj << +/D [1668 0 R /XYZ 89.664 510.585 null] +>> endobj +1685 0 obj << +/D [1668 0 R /XYZ 71.731 508.428 null] +>> endobj +1686 0 obj << +/D [1668 0 R /XYZ 89.664 492.653 null] +>> endobj +1688 0 obj << +/D [1668 0 R /XYZ 71.731 490.869 null] +>> endobj +1689 0 obj << +/D [1668 0 R /XYZ 89.664 474.72 null] +>> endobj +1691 0 obj << +/D [1668 0 R /XYZ 71.731 472.563 null] +>> endobj +1692 0 obj << +/D [1668 0 R /XYZ 89.664 456.787 null] +>> endobj +1694 0 obj << +/D [1668 0 R /XYZ 71.731 455.004 null] +>> endobj +1695 0 obj << +/D [1668 0 R /XYZ 89.664 438.854 null] +>> endobj +1697 0 obj << +/D [1668 0 R /XYZ 71.731 437.071 null] +>> endobj +1698 0 obj << +/D [1668 0 R /XYZ 89.664 420.922 null] +>> endobj +1700 0 obj << +/D [1668 0 R /XYZ 71.731 418.765 null] +>> endobj +1701 0 obj << +/D [1668 0 R /XYZ 89.664 402.989 null] +>> endobj +1703 0 obj << +/D [1668 0 R /XYZ 71.731 400.832 null] +>> endobj +1704 0 obj << +/D [1668 0 R /XYZ 89.664 385.056 null] +>> endobj +1706 0 obj << +/D [1668 0 R /XYZ 71.731 382.899 null] +>> endobj +1707 0 obj << +/D [1668 0 R /XYZ 89.664 367.123 null] +>> endobj +1709 0 obj << +/D [1668 0 R /XYZ 71.731 364.966 null] +>> endobj +1710 0 obj << +/D [1668 0 R /XYZ 89.664 349.191 null] +>> endobj +1712 0 obj << +/D [1668 0 R /XYZ 139.257 331.258 null] +>> endobj +1713 0 obj << +/D [1668 0 R /XYZ 71.731 324.12 null] +>> endobj +1714 0 obj << +/D [1668 0 R /XYZ 89.664 303.362 null] +>> endobj +1716 0 obj << +/D [1668 0 R /XYZ 71.731 301.206 null] +>> endobj +1717 0 obj << +/D [1668 0 R /XYZ 89.664 285.43 null] +>> endobj +1719 0 obj << +/D [1668 0 R /XYZ 71.731 283.273 null] +>> endobj +1720 0 obj << +/D [1668 0 R /XYZ 89.664 267.497 null] +>> endobj +1722 0 obj << +/D [1668 0 R /XYZ 71.731 265.34 null] +>> endobj +1723 0 obj << +/D [1668 0 R /XYZ 89.664 249.564 null] +>> endobj +1725 0 obj << +/D [1668 0 R /XYZ 71.731 247.407 null] +>> endobj +1726 0 obj << +/D [1668 0 R /XYZ 89.664 231.631 null] +>> endobj +1728 0 obj << +/D [1668 0 R /XYZ 71.731 229.475 null] +>> endobj +1729 0 obj << +/D [1668 0 R /XYZ 89.664 213.699 null] +>> endobj +1731 0 obj << +/D [1668 0 R /XYZ 71.731 211.542 null] +>> endobj +1732 0 obj << +/D [1668 0 R /XYZ 89.664 195.766 null] +>> endobj +937 0 obj << +/D [1668 0 R /XYZ 76.712 177.833 null] +>> endobj +178 0 obj << +/D [1668 0 R /XYZ 209.249 143.362 null] +>> endobj +1734 0 obj << +/D [1668 0 R /XYZ 71.731 134.725 null] +>> endobj +1667 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F53 1676 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1737 0 obj << +/Length 1665 +/Filter /FlateDecode +>> +stream +x��X_��6�O`��Z��7���h�nk�=�{Pl]�m�}w�)ʉ}I��!�(��H�H)|�Ï/R��>AƂ$^��������n9\��Nx^�/�7a��X�����"���" ���ź�cy�m/;� b1��kt/�J��j�?��/~^4�aʲU�UcF�k��h�x(��(2�\i=�e�u�0��{5t8����*�=9�_ +M�̔�]+�-\�9Y������د��imhJ�/�g�A5q�N���r�9��������a���=V���I��'�B�2t8��ˬ�?�u����{UU� b8���J�>�qp��$�l���M������Q�;^����Ai�Y�3�t#��≑'Kd��īx��ܜ��ҽ��C����;YUv/?��i��0��?�<��`y��O 8�'�5oEC�I2�q�{T,�[���Ju���ǧA�����&�8��*C�!G~���P6��1���z��� +5Cb�sj�B��K�ؼ�S"�}���Kx�,Sϴa��s�^~��iˉ�)8WK�h�� +�p�F���ϖ�*��Q��a���H�G�#h]#Lqt'�b��Rk��L`������V��_L�� '�k�}��@5 +���D�F-�SIꞾ�j>�~�0�p{3�.7>нl��$5�Sh�<�P�ֺ�Ϣ�1�B`MMW˫���*���Y� :��$�F��)d��Y��V���B�BM�)+8���eo���H�m�6��VR���j�Ӵ�&T�u'|u+�Mϩ�!-����%����F;ktc'��˷�ZM<ZO]�}w�t�շxh�52�9�����X�5M���F���lzK7��R&Cf�B��ڞ�f +$C��h�~Pi�l!c��]?J���U̴,����$�*R��P�6,uߕD�`Z�+�!�B�[ [�g�J,��tײc(<�&�Y�A>u5��ۄ�I��۰��SS)a�e�������K��xD��;��A6A2n=<��dm�������@a��h[�Q3�����=����,2-����l��<?����*���j�9&��� ȍ��&ӆ�����K���]U�������W�s�]_Wg�uv����&�����������,| O���oFP��/%e���t����TP��O#��!�nd�l����@�w��0B#uY���K�����-�-�$^ZmX�EU~6N�s1�#���ಬ�u�8X'm������--L;�L=�+f2ߏ�a�⦓���Ŀ����F�Z;9��ь�É���2�;/֘Y�� ݼښR���i�R�xg��_�sb����_�*j�&Z�1lc�uY�j�0;\j��/����cC�w��9�ငZuv�O�P\�J�<��p�@" V +���g�r�}8�_�Bs[�V�.]�(n��F�V)l��"����7�V����~�[:qL�"�t��.a2i\�=8��1�DS�ڂ�20�jL9Q��� �-H�<`���j��O̦��d�ʝ<���j5�����of�-2��>m/#�L}�q�{��H��"fKW9><EU�k!������y��R�����D/�ɣ���i\�O��Y��u��؊�_}CYN��R�<���9���G��[endstream +endobj +1736 0 obj << +/Type /Page +/Contents 1737 0 R +/Resources 1735 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +>> endobj +1738 0 obj << +/D [1736 0 R /XYZ 71.731 729.265 null] +>> endobj +1739 0 obj << +/D [1736 0 R /XYZ 71.731 718.306 null] +>> endobj +1740 0 obj << +/D [1736 0 R /XYZ 71.731 683.273 null] +>> endobj +1741 0 obj << +/D [1736 0 R /XYZ 71.731 683.273 null] +>> endobj +1742 0 obj << +/D [1736 0 R /XYZ 101.32 673.773 null] +>> endobj +1745 0 obj << +/D [1736 0 R /XYZ 71.731 638.804 null] +>> endobj +1746 0 obj << +/D [1736 0 R /XYZ 71.731 603.836 null] +>> endobj +1747 0 obj << +/D [1736 0 R /XYZ 71.731 593.873 null] +>> endobj +938 0 obj << +/D [1736 0 R /XYZ 71.731 550.869 null] +>> endobj +182 0 obj << +/D [1736 0 R /XYZ 210.577 517.559 null] +>> endobj +1748 0 obj << +/D [1736 0 R /XYZ 71.731 508.922 null] +>> endobj +939 0 obj << +/D [1736 0 R /XYZ 71.731 491.492 null] +>> endobj +186 0 obj << +/D [1736 0 R /XYZ 170.742 458.182 null] +>> endobj +1749 0 obj << +/D [1736 0 R /XYZ 71.731 449.73 null] +>> endobj +1750 0 obj << +/D [1736 0 R /XYZ 71.731 414.182 null] +>> endobj +1751 0 obj << +/D [1736 0 R /XYZ 188.024 403.387 null] +>> endobj +1752 0 obj << +/D [1736 0 R /XYZ 181.907 390.436 null] +>> endobj +1753 0 obj << +/D [1736 0 R /XYZ 158.345 377.484 null] +>> endobj +940 0 obj << +/D [1736 0 R /XYZ 71.731 354.57 null] +>> endobj +190 0 obj << +/D [1736 0 R /XYZ 225.616 319.103 null] +>> endobj +1754 0 obj << +/D [1736 0 R /XYZ 71.731 310.651 null] +>> endobj +1755 0 obj << +/D [1736 0 R /XYZ 71.731 275.103 null] +>> endobj +1756 0 obj << +/D [1736 0 R /XYZ 188.024 264.309 null] +>> endobj +1757 0 obj << +/D [1736 0 R /XYZ 181.907 251.357 null] +>> endobj +1758 0 obj << +/D [1736 0 R /XYZ 158.345 238.406 null] +>> endobj +1037 0 obj << +/D [1736 0 R /XYZ 71.731 215.492 null] +>> endobj +194 0 obj << +/D [1736 0 R /XYZ 255.778 180.025 null] +>> endobj +1759 0 obj << +/D [1736 0 R /XYZ 71.731 171.573 null] +>> endobj +1760 0 obj << +/D [1736 0 R /XYZ 71.731 123.074 null] +>> endobj +1761 0 obj << +/D [1736 0 R /XYZ 188.024 112.279 null] +>> endobj +1762 0 obj << +/D [1736 0 R /XYZ 181.907 99.328 null] +>> endobj +1735 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F55 1744 0 R /F51 1652 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1765 0 obj << +/Length 1626 +/Filter /FlateDecode +>> +stream +x��XYo�F~��Л) �)�����I�"N]D/EӇ����2���3�3<l+FAa������=�|�fI�&|µ��YV�����~�ĂE�7�3�]���z�6w��r��x�D����l���\�Ec��/��w�.}��ֈ�F�����go7��8J�u=�L/�ě0�Y�*^�?u���:sUg])+c _�/{c��k���<p�nֈʭ�<H�����x�y;��W�H�P[���A�Ժ�mJ��G� p�q����fc�i`X���+LC�:Wo�����>L�� X�$T��jmUl�r�W�:X'NY�]�L��W��NVR��x�RD�+�keN\�g���#d��-�F4ݛi]~͆���Ѽ`α�4qn%�!����5���y�����6�|�Zk���� +r19x��� ����I`�<A����tipm��q�$�����9 1Y�eo�@3�X�<��Ό��:H��Ǹ䍀EDjv��Y2�ʦP�|?��� ���0sI8��Q}����R`bV���e=�BX�/o���y��V\��0vUQ��8����G���`;��H�w�N��7?��^U��7 (]���_l�F���ȯ�\k�o�i��ׯʻ*�vQW��-���'��L��[�6��1�:�^�� 714˴S�ŝ�S��a�ꡱ�`Ǽ�ݑ����;��.-1}�M7 ��t�b�E.Y����%��8���[3w�뮡�S�$�83�Y���(d{ n�������]�-0�P��Al�Q8IO��t��Ni�4��dے�AQ���y؇�C�1U�����-͉-��m��e@*���6~�>l@�5��# ۩���f�)�`C�9#�P��_9|�� ���2ˮ��k�CbJ|Hj��rt9�$4u�!YJNmy��a��W��8+��K�T֫�% +E��YO' ��O�6l�+?���8��� ���������q(8-H���S�c����:����(�괇hݲ�I�8���h�l��� ��P���B\t��.-��[U(s$�A�=QTd �"G�������VCNL��T8"-���{�&���~D"�n#���(f0� +�7�T�L���=Q�>���r_�v������|q䜣ʢ�D�s��N��+���$��������� +�-G{b#�2�$q��1�8`Ug!�T#��֩�9�Lݱn0���mPݬtw�� +f +�?؛��Id����Y�Ww|ޣ�<�_������x��#��e��^e{ލ��N�W��t��j�W�_z��Z�xJ��.Wtt����ܓb�վ'�\yv�6u��[Hʷ�w����/ +�M�E�`-��Q&����P�]{ ݵ�Ŋ�J���î��63v㎱z +�O�� +�;�9{7���*Q�^C�܍�=��q����~!r1�L��{���������p8ا_��~l�#b��o���=�o��E�]?@�f����lF� +�9�<�7�W�:>���.R;�E�aT����ay����͘����i�|H7��uB��?6@����*ǧK�k^i.�+���s��M�Ye#4��'r��]<���Y�n$���3�<� 'wZ0�A�h��� ��`endstream +endobj +1764 0 obj << +/Type /Page +/Contents 1765 0 R +/Resources 1763 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1591 0 R +>> endobj +1766 0 obj << +/D [1764 0 R /XYZ 71.731 729.265 null] +>> endobj +1767 0 obj << +/D [1764 0 R /XYZ 158.345 708.344 null] +>> endobj +1038 0 obj << +/D [1764 0 R /XYZ 71.731 685.43 null] +>> endobj +198 0 obj << +/D [1764 0 R /XYZ 170.073 649.963 null] +>> endobj +1768 0 obj << +/D [1764 0 R /XYZ 71.731 641.51 null] +>> endobj +1769 0 obj << +/D [1764 0 R /XYZ 71.731 593.011 null] +>> endobj +1770 0 obj << +/D [1764 0 R /XYZ 188.024 582.217 null] +>> endobj +1771 0 obj << +/D [1764 0 R /XYZ 181.907 569.265 null] +>> endobj +1772 0 obj << +/D [1764 0 R /XYZ 158.345 556.314 null] +>> endobj +1039 0 obj << +/D [1764 0 R /XYZ 71.731 533.4 null] +>> endobj +202 0 obj << +/D [1764 0 R /XYZ 251.785 497.933 null] +>> endobj +1773 0 obj << +/D [1764 0 R /XYZ 71.731 489.481 null] +>> endobj +1774 0 obj << +/D [1764 0 R /XYZ 71.731 458.914 null] +>> endobj +1775 0 obj << +/D [1764 0 R /XYZ 71.731 391.233 null] +>> endobj +1776 0 obj << +/D [1764 0 R /XYZ 71.731 353.31 null] +>> endobj +1777 0 obj << +/D [1764 0 R /XYZ 188.024 342.516 null] +>> endobj +1778 0 obj << +/D [1764 0 R /XYZ 181.907 329.564 null] +>> endobj +1779 0 obj << +/D [1764 0 R /XYZ 158.345 316.613 null] +>> endobj +1040 0 obj << +/D [1764 0 R /XYZ 71.731 293.699 null] +>> endobj +206 0 obj << +/D [1764 0 R /XYZ 206.619 258.232 null] +>> endobj +1780 0 obj << +/D [1764 0 R /XYZ 71.731 249.779 null] +>> endobj +1781 0 obj << +/D [1764 0 R /XYZ 71.731 227.183 null] +>> endobj +1782 0 obj << +/D [1764 0 R /XYZ 188.024 216.389 null] +>> endobj +1783 0 obj << +/D [1764 0 R /XYZ 182.306 203.437 null] +>> endobj +1784 0 obj << +/D [1764 0 R /XYZ 158.345 190.486 null] +>> endobj +1041 0 obj << +/D [1764 0 R /XYZ 71.731 167.572 null] +>> endobj +210 0 obj << +/D [1764 0 R /XYZ 206.308 132.105 null] +>> endobj +1785 0 obj << +/D [1764 0 R /XYZ 71.731 123.652 null] +>> endobj +1763 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1788 0 obj << +/Length 1793 +/Filter /FlateDecode +>> +stream +x��Xݏ�8���n��I����8huTړ�7qk�8����ߌ��]����ۓ�|�o��Y?>�8�bX��Ei2+��lO^<��c�YG<O����xV�"�g��l�JY%�,�X�D�u�6xZ���a���0X1Z_vƊ�V�n�~���g뽦$�X���4f�9�&����I:�ūs5/���k��Rϣ$��-*�\�y��|D�����ri�<�b(kV��cz��<�-+e��j��M/�%��-x� +���ի�i�Cu7�Z�ԴL�V!�G4EB��d�n� ��+o�@���z�L?}Zl�Q����Bw����b�ubwv]�rleg]�O������I�z r��ҥ��ˡIX��e�6���z���l{V۶A%�x�9hI0�^�bX$���g1�!�A��y�D@!ȉ����͍�Dx&a��V����AK�_ײCg��N��QTht�,�ꒃ:�4^^~8�a0����6�� ]Vt��i�ң!��G�ѣ%�[)@�i�`5��Nlɼ}��M%��H���d �ѻ0�:yqO�I��O��Ag�$���ۭ�)��:HH)��*ti.b����l-�R�]M;�K�_�!�+LM$���O�,G��6u��B�p�5�DY+yh"n������D�zhEWB<��T��_���>.���i8��S�'`3zJ���%��h� ��ý1̊a�c��?�m�r����.�`�?��W��ѣ�A�G����<������/�+��ZI�v����~�� +�XL�0�M�v�����D�����UFFP���� }���~ޏ�-Q��7��}qyH'gQ�2�(ou�����w3���Aa1$ +��pG�[��e-Nd�x�u�ۉ� `�Ddǃ��t���0�����������D�BTK)^6 ���7�U��؎���SF�7�X>�ӄ�f����W�j�(� VKz��� +���2�`�u�*bE�pd�S� '�B���qe���T0"�'5WPDڨ���7����h�l�*O�NL嘲�=�/�4�p��K��UІn����Xo�6��tH&��p�Z/R�ד�/�l`��w�輆�9�i� +=w�����U�6{ە���Ӵ } +�]��ɷ���A;;����Rlq�Һ�r'pv��g������l;F='D7l���mi���dz������R9>�E�����,��%1@H�A&5Dr�D.��v28��ȇQ�kQ�j� �/�X51�w��$j�� �Ӟu���`�Ǯ4�;�Lä���+ۋ鍲�(q�3�>��8������8l��()�t�0��U�z����� +���<X�E�A6��g�L��Q`�B�V�@0xVѡT1��`�E����$��?�o����3F��[b��UC�q$e���1X�� +�<h�+�,aD�"JuH���b/N�F᮫x�sBOk���ă����b`*���ġi��h�U�"��� +�^��']� +r0ʕY�R��jS �&B�;plu56��;H:wG���t�{He��t�>�荌@�)�<��(�Y�o믕_��_?�|�Zv�X�'5P ��5]�`:挧�$�XDG��C-�DZO�zj8�D�Y��9�W��nfa�y(S -��)4{En��N���bYNY�=!q��N��0����ôC(���i��%�j4ײ_t}q���B��������4u�w���zi���t����)�0 ��7��X�>�%�`4 A[y��/`���34�endstream +endobj +1787 0 obj << +/Type /Page +/Contents 1788 0 R +/Resources 1786 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +>> endobj +1789 0 obj << +/D [1787 0 R /XYZ 71.731 729.265 null] +>> endobj +1790 0 obj << +/D [1787 0 R /XYZ 71.731 718.306 null] +>> endobj +1791 0 obj << +/D [1787 0 R /XYZ 188.024 708.344 null] +>> endobj +1792 0 obj << +/D [1787 0 R /XYZ 181.907 695.392 null] +>> endobj +1793 0 obj << +/D [1787 0 R /XYZ 158.345 682.441 null] +>> endobj +1042 0 obj << +/D [1787 0 R /XYZ 71.731 659.527 null] +>> endobj +214 0 obj << +/D [1787 0 R /XYZ 249.454 624.06 null] +>> endobj +1794 0 obj << +/D [1787 0 R /XYZ 71.731 615.608 null] +>> endobj +1795 0 obj << +/D [1787 0 R /XYZ 71.731 567.108 null] +>> endobj +1796 0 obj << +/D [1787 0 R /XYZ 188.024 556.314 null] +>> endobj +1797 0 obj << +/D [1787 0 R /XYZ 181.907 543.362 null] +>> endobj +1798 0 obj << +/D [1787 0 R /XYZ 158.345 530.411 null] +>> endobj +1043 0 obj << +/D [1787 0 R /XYZ 71.731 507.497 null] +>> endobj +218 0 obj << +/D [1787 0 R /XYZ 250.901 472.03 null] +>> endobj +1799 0 obj << +/D [1787 0 R /XYZ 71.731 463.578 null] +>> endobj +1800 0 obj << +/D [1787 0 R /XYZ 71.731 440.981 null] +>> endobj +1801 0 obj << +/D [1787 0 R /XYZ 188.024 430.187 null] +>> endobj +1802 0 obj << +/D [1787 0 R /XYZ 158.345 417.235 null] +>> endobj +1044 0 obj << +/D [1787 0 R /XYZ 71.731 394.321 null] +>> endobj +222 0 obj << +/D [1787 0 R /XYZ 231.844 358.854 null] +>> endobj +1803 0 obj << +/D [1787 0 R /XYZ 71.731 350.402 null] +>> endobj +1804 0 obj << +/D [1787 0 R /XYZ 71.731 298.914 null] +>> endobj +1805 0 obj << +/D [1787 0 R /XYZ 71.731 283.97 null] +>> endobj +1806 0 obj << +/D [1787 0 R /XYZ 91.656 262.814 null] +>> endobj +1807 0 obj << +/D [1787 0 R /XYZ 142.743 262.814 null] +>> endobj +1808 0 obj << +/D [1787 0 R /XYZ 76.712 234.521 null] +>> endobj +1809 0 obj << +/D [1787 0 R /XYZ 71.731 214.595 null] +>> endobj +1810 0 obj << +/D [1787 0 R /XYZ 383.487 202.939 null] +>> endobj +1811 0 obj << +/D [1787 0 R /XYZ 200.497 191.283 null] +>> endobj +1812 0 obj << +/D [1787 0 R /XYZ 71.731 163.387 null] +>> endobj +1813 0 obj << +/D [1787 0 R /XYZ 188.024 150.436 null] +>> endobj +1814 0 obj << +/D [1787 0 R /XYZ 181.907 137.484 null] +>> endobj +1815 0 obj << +/D [1787 0 R /XYZ 158.345 124.533 null] +>> endobj +1045 0 obj << +/D [1787 0 R /XYZ 71.731 101.619 null] +>> endobj +1786 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1819 0 obj << +/Length 1311 +/Filter /FlateDecode +>> +stream +x��XKo�8��W�(%�a[�5MkdѴ9x�]�=�m�D�H�q�9T,�I��Iw��15��DG!��hJ�4�G��h����"m���u'|w���\^�x��l���Q�LH��i�Y����]�Zͻ����|^7J��bZ�f�m����彥4��l?�L�̛(QJ�45��Q�3'��&!�Ą�Ə��8g<==�_2�Q�5LÐdY��/�5���q�LQ�#�� ��ZX�VKfuk\ֲ�VN�vrLS�(�B��v�S@2p��ĕl|]r�k�{��F�h6�c+Q -�"��v�r��b�L +�6/�->u��VmY�����S��Yc��{��nÍ �Xޒ�(f�1F=��f�u^Z{��[w�F��qyo?�����%Ӹ2ZXW k�?L�x��!�o���p��Z�-�?�7(ܕ"/Q�:��F����mĞڶ��t�a�� @˕F�8�����wif �G��"�$��+9�Ro�T�(�5Jن�q[j�@��./I��nLg�&(�ҁEZ�@qnoo��Q4ߏ-�-�� ˵0�16���$�u��г�;8����U����_��?[QʗM�@�u�� G�!)�>%)�rF��L+���8�ߎc@bgL*D � ��j~�Uj:�&�uf�'>�2W�,��-.����h��%��l4���箮H[�[�LI���*�D� Z�{L�fr�;�5�ؘ"���:���?�X�)����ҹ��{�7�Fl˴qњL��e� +6��\Q2�w;��]k6�����7ɼ���w�p䵫���Q��.e��e�<����>��Xu�ۣF�l���腮�A��mg�'��EV�� G��m`��ksr�R�y�d��y��%y�x�ۍ'�GZVW2�myW�dBh�y1�A1R8_�z%SG���|��X[��] XQ-��X��މ� +��]�� +g����"�����pk�]����<�ma���Ա������c+��}��w��V��ֿ���\T�U�w.����Q�L���8Qu[?œ���Ih �zw0���ĦyL���nT�N�ڔ�!�na�Qo������,:f���>��#Jw���)D;_��[h��V�*V�g��b|��?��� ��M�(�O=|i��e`(,Ҟ͊�c�����W��zŃ�`�>7��&<���������b���dت����������9��PD��Ì1�g�\6���y�I#k?�0��Z�,b.f�$�ĜM^�&˾��R��[����Ra�r��t�A?)�Ɍ���ɯ�#g7�hF¨WbB��c�.�-�����endstream +endobj +1818 0 obj << +/Type /Page +/Contents 1819 0 R +/Resources 1817 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +>> endobj +1820 0 obj << +/D [1818 0 R /XYZ 71.731 729.265 null] +>> endobj +226 0 obj << +/D [1818 0 R /XYZ 288.547 708.344 null] +>> endobj +1821 0 obj << +/D [1818 0 R /XYZ 71.731 699.891 null] +>> endobj +1822 0 obj << +/D [1818 0 R /XYZ 71.731 653.45 null] +>> endobj +1823 0 obj << +/D [1818 0 R /XYZ 188.024 640.598 null] +>> endobj +1824 0 obj << +/D [1818 0 R /XYZ 181.907 627.646 null] +>> endobj +1046 0 obj << +/D [1818 0 R /XYZ 71.731 604.732 null] +>> endobj +230 0 obj << +/D [1818 0 R /XYZ 282.88 569.265 null] +>> endobj +1825 0 obj << +/D [1818 0 R /XYZ 71.731 560.813 null] +>> endobj +1826 0 obj << +/D [1818 0 R /XYZ 185.855 550.336 null] +>> endobj +1827 0 obj << +/D [1818 0 R /XYZ 263.261 537.385 null] +>> endobj +1828 0 obj << +/D [1818 0 R /XYZ 71.731 525.265 null] +>> endobj +1829 0 obj << +/D [1818 0 R /XYZ 188.024 514.471 null] +>> endobj +1830 0 obj << +/D [1818 0 R /XYZ 158.345 501.519 null] +>> endobj +1047 0 obj << +/D [1818 0 R /XYZ 71.731 478.605 null] +>> endobj +234 0 obj << +/D [1818 0 R /XYZ 274.105 443.138 null] +>> endobj +1831 0 obj << +/D [1818 0 R /XYZ 71.731 434.686 null] +>> endobj +1832 0 obj << +/D [1818 0 R /XYZ 71.731 412.09 null] +>> endobj +1833 0 obj << +/D [1818 0 R /XYZ 188.024 401.295 null] +>> endobj +1834 0 obj << +/D [1818 0 R /XYZ 181.907 388.344 null] +>> endobj +1835 0 obj << +/D [1818 0 R /XYZ 158.345 375.392 null] +>> endobj +1048 0 obj << +/D [1818 0 R /XYZ 71.731 352.478 null] +>> endobj +238 0 obj << +/D [1818 0 R /XYZ 300.431 317.011 null] +>> endobj +1836 0 obj << +/D [1818 0 R /XYZ 71.731 308.374 null] +>> endobj +1837 0 obj << +/D [1818 0 R /XYZ 71.731 285.963 null] +>> endobj +1838 0 obj << +/D [1818 0 R /XYZ 188.024 275.168 null] +>> endobj +1839 0 obj << +/D [1818 0 R /XYZ 182.306 262.217 null] +>> endobj +1840 0 obj << +/D [1818 0 R /XYZ 158.345 249.265 null] +>> endobj +1049 0 obj << +/D [1818 0 R /XYZ 71.731 226.351 null] +>> endobj +242 0 obj << +/D [1818 0 R /XYZ 288.858 190.884 null] +>> endobj +1841 0 obj << +/D [1818 0 R /XYZ 71.731 182.432 null] +>> endobj +1842 0 obj << +/D [1818 0 R /XYZ 401.471 171.955 null] +>> endobj +1843 0 obj << +/D [1818 0 R /XYZ 71.731 159.836 null] +>> endobj +1844 0 obj << +/D [1818 0 R /XYZ 188.024 149.041 null] +>> endobj +1845 0 obj << +/D [1818 0 R /XYZ 181.907 136.09 null] +>> endobj +1846 0 obj << +/D [1818 0 R /XYZ 158.345 123.138 null] +>> endobj +1050 0 obj << +/D [1818 0 R /XYZ 71.731 100.224 null] +>> endobj +1817 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1849 0 obj << +/Length 2548 +/Filter /FlateDecode +>> +stream +xڥY[��6~?��O8�%Jԥ��"M�\��f{�],� �%�R�,���q}g8�$_������\șo�>� �"�X�Ç'��b����V^�y�ceXV3��7w�|��$���"B�p��|�b�����H�^���0����>���/U���y{�r3j~Ē���1����/<�%B�9�+7f~hk�1�y1��λ��:i�-=�)~�i� ���p]�0���ܠ�i�-U�主X�̄'Zɻ�'P�$1v��ï稺:Ѩ�2��Y���"Ѥ���+����Q���A�\r�Aa�:�ė������Λ�;��C+�E�T{H{bhP�4������}o<x�Yz�?���G�����w����cĻ)�U���p�[:&8s��Q���ABug��9YZ��L�\��={���!iڱ��jjDeU�[ϳj��zoT� _����cO{����i/ay�%�S}n?����٪�K�OC[����]�4�@��Ɉ2��s?�]��N�ȞJ:��O#B�6�s�>�#�hHYÁ��`s"�ju��˾��������h�ǟˮ��� H,$��S���1/,@2]8�f�N h��[Oz�@�1����,){L�f=5�}�|�^g�ZEY=�Z��<���b�n�n�<D�NK���U{��� M+�i��h +�m>��f��[ڜ(e=m��2�� �+�=���p/�~�=/����R��F������x�aܤmV��Ik� �cg�N��P���?^�yx�����7n��ʆ��{�湎����~Ŝ)�GDYv���:�J�Ҥ��E�"c�*��� y����gqƃd�� �����t�������e�����F�-n�`�K;�>I�]��0F]A`ĬPe&��0wO�*�|4"�$��^n� +�BjZZ����P��I��1�4��ꢆ^��/��0?�YB-�j��bt��zs��L���˥��UP�E�ϕuY[6�� �Q���u�J�&�k�X��Yr!-y���UЛ��ap�.��!�`$!���5�e5㹲&Y�Q*+R�(�J�T�Ke�#ݪ��pg�*g@�Ѓ�zF�n �;���Q����&ؘ����:-h��/6kKR=@�f�ld�EW���6a��������!�^�`�%��g�ޅa�@������i�c�rJ)$�[�+ �ˈ��� g��3����b9oXG +�p��0��v�Ÿ���4t {Y�=�a��]���q�� �Bk�C�/ �xhY1���7��]\C.�UOK3O�lnY��h�s�i���[��c�<`�;N�n*�v���}�Uc:c(B���<���dB)�L7�!�a�B�-�<���p�Yj�� M�R���_���,+J��li 6�M���_KlF>�e��˿C����x�d�Dl�j`~z���ku,��!�uL�:6����%.J��C5)�P�4��,?2��Y�L$�9N��R�mV�ҰW퉦T�pM��x�����m��Ԧ��R��ٱ-{�c8۞.,�%=��h�0�,�g��u6��I�o�fj0T�|�ܯ�V�'t�uV�퐞���L�>5��p�۱�`{tȡ� h5�y�D`����)c�R�m���e�,����OG�/&d=o��Cu#y?"d<NO����p:lUUf�-����|�Y1���Ԕ�FA<]��:�#4�����Ҳ�Uw,.���Q[ ���44�a��C8�ȃ�<�-����݉�&E&�-ͨ>���z�c=*J��t/�(�%̼��.'U`�,G����m��4�ӚȲm�o]u��w�!H;B�QN�<�] +���BJ�JaN��:T��C|t]�mZ������N���FT���8q�#�.����_�4��_�����ʮc{D��eq@-��5%8��$������]P�j ĩIN`ȠBu%5�I<F�~n��@�{8391c?�� qq{��������Ș:��M7Ei苦_%<�զZ?�j/A�(+�,�Mx�z:��~eZ�k���o22"{�d?4���B�|��V���M�Y�Y1>� ���;�����w�����G���6�����E-�[��+�?�!s�s����ǒ�_�r��{���( N2�ͻ�K"h+�] XY[Vp�Qp��������P,8<EB�ڂ��<7o�s�[�� � ����G�%<T<]P}[P�0�n�t #�meKAj�p�7ժ��r_�o8ÌG�-J�4n*�f���č� +��$�r�-o�o�HX��MH2����f�/v�#K�K[���g�x)��h���r��O4�˜��A�!�ȥ��������YU�ݵ���ṏ��x���)/�y�Iwٷ���{�+�QV��ވJ �a�IM�x�zqtv8Z+`�)�4 �P$�/��j�� ]z�s<����3v�g/���cY�r��2�~��<6�$�*��x4�����H�ػ�S��|a8������|Lb��?�m��endstream +endobj +1848 0 obj << +/Type /Page +/Contents 1849 0 R +/Resources 1847 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +/Annots [ 1857 0 R 1858 0 R 1859 0 R ] +>> endobj +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [417.862 507.213 435.526 516.124] +/Subtype /Link +/A << /S /GoTo /D (gloss-cgi) >> +>> endobj +1858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [508.095 507.213 537.983 516.124] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +1859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 494.262 84.184 503.173] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +1850 0 obj << +/D [1848 0 R /XYZ 71.731 729.265 null] +>> endobj +246 0 obj << +/D [1848 0 R /XYZ 291.835 708.344 null] +>> endobj +1851 0 obj << +/D [1848 0 R /XYZ 71.731 699.891 null] +>> endobj +1852 0 obj << +/D [1848 0 R /XYZ 402.523 650.56 null] +>> endobj +1853 0 obj << +/D [1848 0 R /XYZ 71.731 625.489 null] +>> endobj +1854 0 obj << +/D [1848 0 R /XYZ 188.024 614.695 null] +>> endobj +1855 0 obj << +/D [1848 0 R /XYZ 158.345 601.743 null] +>> endobj +1051 0 obj << +/D [1848 0 R /XYZ 71.731 568.867 null] +>> endobj +250 0 obj << +/D [1848 0 R /XYZ 197.861 529.494 null] +>> endobj +1856 0 obj << +/D [1848 0 R /XYZ 71.731 522.142 null] +>> endobj +1860 0 obj << +/D [1848 0 R /XYZ 71.731 494.262 null] +>> endobj +1861 0 obj << +/D [1848 0 R /XYZ 71.731 479.318 null] +>> endobj +1862 0 obj << +/D [1848 0 R /XYZ 254.099 446.506 null] +>> endobj +1052 0 obj << +/D [1848 0 R /XYZ 71.731 418.61 null] +>> endobj +254 0 obj << +/D [1848 0 R /XYZ 166.615 379.238 null] +>> endobj +1863 0 obj << +/D [1848 0 R /XYZ 71.731 368.873 null] +>> endobj +1864 0 obj << +/D [1848 0 R /XYZ 132.932 346.162 null] +>> endobj +1865 0 obj << +/D [1848 0 R /XYZ 71.731 333.21 null] +>> endobj +1866 0 obj << +/D [1848 0 R /XYZ 71.731 331.054 null] +>> endobj +1867 0 obj << +/D [1848 0 R /XYZ 71.731 316.11 null] +>> endobj +1868 0 obj << +/D [1848 0 R /XYZ 471.372 306.61 null] +>> endobj +1869 0 obj << +/D [1848 0 R /XYZ 169.232 294.954 null] +>> endobj +1870 0 obj << +/D [1848 0 R /XYZ 71.731 267.059 null] +>> endobj +1871 0 obj << +/D [1848 0 R /XYZ 249.114 241.156 null] +>> endobj +1872 0 obj << +/D [1848 0 R /XYZ 71.731 238.999 null] +>> endobj +1873 0 obj << +/D [1848 0 R /XYZ 118.555 203.447 null] +>> endobj +1874 0 obj << +/D [1848 0 R /XYZ 392.84 191.97 null] +>> endobj +1875 0 obj << +/D [1848 0 R /XYZ 272.177 180.314 null] +>> endobj +1876 0 obj << +/D [1848 0 R /XYZ 128.526 168.658 null] +>> endobj +1053 0 obj << +/D [1848 0 R /XYZ 71.731 146.738 null] +>> endobj +1847 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F44 1379 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1880 0 obj << +/Length 2435 +/Filter /FlateDecode +>> +stream +xڭْ��}�©}9esu�U���v�:�cb{R�ʤR�-�J˒W�����P��c��)@'m L�Y���� ����;s���O�,�3ʸ��q���{�D"��b3p]_D�7[��=X��a���C��ñ홆+h�沊�,��"�s��w�E��s��Ua4Ή4�3�\�>��Oe"t-%�+,�Ah̓�J�-}|9�X��<����@ӻ����LPR`�6c���l蠑g���!����H1�mQU��2r���.���,6���2���-)�)YB��Da���o@�Y�e�ߘC����h�P&������� +k�dK������F�%��`�"�H�D +Yƫ�%Jn�(A`�iإ��~��,�P\72�C�4�-o)�T�y�h8���!��.E�|��f�v)�������h(��i9�hUI㺠UMmc��ZiVS�^.�nӡ�3$����m;eQT0��TKe(��KI� +/��YYo����'.ㆎ0=w�{����h�q�\�c�}B��y�Rn�D��{�S����W�k������=]����֑�ݣ��y�������|�5���я�Z�C��k�l�@����]\�:�1nA���0|�9���jq�����I��ͣ���M��;�zM���z�CuBc�Â3X/����Ⅳ��jkg%/�1�8g�%�[�)�#w��&A�_��j������x�}>h\&��RV�����kA淡 q(�I�o� LҼ: ;��]�f��ɴJyg�U�4bE*���_1*���n�g��6�8��dK:$�!�B���6V/@7C�d��eQ�z9��蛅 ��pl�vB#���-����5v=��`욐:�B���;���G�$E@�ӈN��_6#K�f�G�4�yZ�2u C[��*�{%:R�[AV+�T��F�d�ʡk#-Sۖ*��T�p�4��4���ܧRR@�2~%�.Y��)�X� Gn'��>�C�\�?w� +.� MPX�Y"�@q� +� ���� ��*���6] �S>��8����P�+��L1.i�D)� �sT���#i��NPr�6�ֹ�3",�L�y�Ơ,+�6^%m&{ƅ8�����y)�P7e�'0r� +�a�����u�aF)�Ҥ��ab��t���$�ts&�6Q��9V3:X<*-0��������V��x��mcyT�쨙MR*#� �V:�nD�1�6�|�B%��M������a�q��XG>9�MӘO&����i>�-F_>cԸ�YLFw�����n�����b2��&��4��A;�٣�q7{�<�M�'����dN䟟h\�E i� +�G-��%e�?7���St��M�����v}�J��%��._!ż��DE`�@(:"�?)�����b�y6���a�i2��4����LB(�� ��WD.��b���N�9�����e��R&�����U�"��v:�Q�R�ay��%+-y�cOɵ�re&�W� ���ex��_����z��#�I�}z��d\Lq���yv3�J���Ch����Ա��j�tF�; ���=K�>؇@�6=a�Ȟ7�0`ٜ��P't�!t8�Z��vS� Y����f!*�옼Z��2=T�ֿ������2Ԫ���yAX��V}��W��L���}�fU�a�p$������)V\;�5�LϢ]�O��+��M�\Q�,�h7.-zKM��_'2��XOs%���Nׅ[���T�XQ���u�%L�� �M��*ʒ�?|PoVJ�e����Z��y U:����BDz�� �{�Bf�z�̨)�2�A�\�X& �L��S� |c.��L���z1n?Mi�|�܂�� U����!~�;� +�ɹ6>���:Ee�K�]�1�i~ՓC,�<^���Z#����\�4��s��=q5���6Z����Ԫ%ׅ��<��G��!DGm�d�uE�pڍ����3rG�#�J���h��c�A�T��i�0P�t��FT�S��PS�����2����s�&�ヨ< ���8rr/V�#S��Dι癠#@��*Ns^�i�nLM=@5��2�9�M���b<Lz4�0�k��4�WY���K�(}t�w�z�u#`��u?�-�-��;>�#���{��v>�`�+&���}L���`�������� ,0�lgl e��9yp�A�,��Fb������-Wy��R�Ur�~���7P'~��kY�Zy�` ӭ�o��x��z|ˉq��2�KʶaY�ue�8��(x`���Oy}_�Wx����;88�|h5z���JRm��F�c�zP�=^���&��$xA��'�к���j��\T�)��� +�Y���V�t�ω���.��BQmW��iQN���lH��&��ֺ���)���F��endstream +endobj +1879 0 obj << +/Type /Page +/Contents 1880 0 R +/Resources 1878 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +/Annots [ 1885 0 R ] +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.054 654.675 535.492 663.587] +/Subtype /Link +/A << /S /GoTo /D (security-mysql) >> +>> endobj +1881 0 obj << +/D [1879 0 R /XYZ 71.731 729.265 null] +>> endobj +258 0 obj << +/D [1879 0 R /XYZ 330.031 707.841 null] +>> endobj +1882 0 obj << +/D [1879 0 R /XYZ 71.731 697.476 null] +>> endobj +1883 0 obj << +/D [1879 0 R /XYZ 71.731 667.627 null] +>> endobj +1884 0 obj << +/D [1879 0 R /XYZ 325.89 656.832 null] +>> endobj +1886 0 obj << +/D [1879 0 R /XYZ 416.139 643.881 null] +>> endobj +1887 0 obj << +/D [1879 0 R /XYZ 109.664 630.929 null] +>> endobj +1888 0 obj << +/D [1879 0 R /XYZ 254.167 630.929 null] +>> endobj +1889 0 obj << +/D [1879 0 R /XYZ 333.562 630.929 null] +>> endobj +1890 0 obj << +/D [1879 0 R /XYZ 71.731 615.821 null] +>> endobj +1891 0 obj << +/D [1879 0 R /XYZ 71.731 600.877 null] +>> endobj +1892 0 obj << +/D [1879 0 R /XYZ 185.336 591.378 null] +>> endobj +1893 0 obj << +/D [1879 0 R /XYZ 71.731 563.482 null] +>> endobj +1894 0 obj << +/D [1879 0 R /XYZ 162.738 550.531 null] +>> endobj +1895 0 obj << +/D [1879 0 R /XYZ 290.139 550.531 null] +>> endobj +1896 0 obj << +/D [1879 0 R /XYZ 374.294 537.579 null] +>> endobj +1897 0 obj << +/D [1879 0 R /XYZ 134.641 524.628 null] +>> endobj +1898 0 obj << +/D [1879 0 R /XYZ 360.351 524.628 null] +>> endobj +1899 0 obj << +/D [1879 0 R /XYZ 71.731 499.557 null] +>> endobj +1900 0 obj << +/D [1879 0 R /XYZ 71.731 499.557 null] +>> endobj +1901 0 obj << +/D [1879 0 R /XYZ 71.731 465.337 null] +>> endobj +1902 0 obj << +/D [1879 0 R /XYZ 71.731 443.432 null] +>> endobj +1903 0 obj << +/D [1879 0 R /XYZ 71.731 423.507 null] +>> endobj +1904 0 obj << +/D [1879 0 R /XYZ 388.236 411.851 null] +>> endobj +1905 0 obj << +/D [1879 0 R /XYZ 460.513 411.851 null] +>> endobj +1054 0 obj << +/D [1879 0 R /XYZ 71.731 372.299 null] +>> endobj +262 0 obj << +/D [1879 0 R /XYZ 212.323 332.927 null] +>> endobj +1906 0 obj << +/D [1879 0 R /XYZ 71.731 324.004 null] +>> endobj +1907 0 obj << +/D [1879 0 R /XYZ 314.442 312.802 null] +>> endobj +1908 0 obj << +/D [1879 0 R /XYZ 292.451 273.948 null] +>> endobj +1909 0 obj << +/D [1879 0 R /XYZ 71.731 261.828 null] +>> endobj +1910 0 obj << +/D [1879 0 R /XYZ 71.731 261.828 null] +>> endobj +1911 0 obj << +/D [1879 0 R /XYZ 71.731 230.71 null] +>> endobj +1912 0 obj << +/D [1879 0 R /XYZ 272.346 217.759 null] +>> endobj +1913 0 obj << +/D [1879 0 R /XYZ 71.731 210.621 null] +>> endobj +1914 0 obj << +/D [1879 0 R /XYZ 71.731 181.794 null] +>> endobj +1915 0 obj << +/D [1879 0 R /XYZ 205.936 168.942 null] +>> endobj +1916 0 obj << +/D [1879 0 R /XYZ 71.731 161.804 null] +>> endobj +1917 0 obj << +/D [1879 0 R /XYZ 89.664 141.046 null] +>> endobj +1918 0 obj << +/D [1879 0 R /XYZ 177.513 141.046 null] +>> endobj +1919 0 obj << +/D [1879 0 R /XYZ 71.731 138.89 null] +>> endobj +1920 0 obj << +/D [1879 0 R /XYZ 89.664 123.114 null] +>> endobj +1921 0 obj << +/D [1879 0 R /XYZ 153.294 123.114 null] +>> endobj +1922 0 obj << +/D [1879 0 R /XYZ 71.731 120.957 null] +>> endobj +1923 0 obj << +/D [1879 0 R /XYZ 89.664 105.181 null] +>> endobj +1924 0 obj << +/D [1879 0 R /XYZ 168.248 105.181 null] +>> endobj +1925 0 obj << +/D [1879 0 R /XYZ 71.731 103.024 null] +>> endobj +1878 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F44 1379 0 R /F32 807 0 R /F35 981 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1928 0 obj << +/Length 2183 +/Filter /FlateDecode +>> +stream +xڅk������|�$�Fc���ٻ���k�z;-P�b;�1~��w6��K���8�E���(��[�+~rIy0��p�`����v>����e����˻ǿx�*I�^�+�E���sE����� +���l��Y��Ɵ�A��R�l���^������)�"���]a� n쮶��u�98:��|؍N3�EAyAą@q"��_��X^�q��G��^�End�V��κ�3R־e��"'�w��v�Y���q�{X�a�O�?~��τ�Ҵ�g>��ٹnƈ��]�B|���H��j+�&`��8���4��]ۑ��� +ؼC�G���z#�M��zȵ.���Y�#�t�nd��(�@��i c�=� �Ҿn�Q%�h��;f��=]����� M�{����G`7+bZ��+\h�DW]J�YqF�����M)��]Ox.�Z�" $)���fq:K��h�M�fH�vx�8�6�Ìl��Zi��� <���90mR��C�0�"�*� a��T�0�$,��}M�]��H���:|IJ�@���<���f�e�@���`���WjZy+����}�tN�$3,fJ��x�,����)�+m��[F4��շ�L:C�:c�c�]��jT?������X&�ʌ�l�Om��`g�f���$E"y���D2��1;�*��㩘�[7^�F�5[C +�A�N�j�,�C��c�Zu��Q��"6�d\{�`�ȤʚŃTQ����й%��@�2����������'+R��/��R�AdTp�Ǎb�՞��V$���3X����`�0�����:҇l`Ծ�� #�_)bAgh���=@���.�cJ�rH�+麮���7��0��v<�J^@�zU�pс���3�����w��x����y��&K���[pŞ�9�<�[zB�y���J�}��%���e�|ـ�U5����l1�����g����c�'8kӱ��g6�e� =��O����Q�3��2� �������1�!��=h �H�emq��^��3�,���˺^("�H��$�.;�/J�*�=g�fp���ɥ��n`H/^�N�%S�1��&˛��H����p;$�:Ϙ��j���_�qJ������3Z�N\) �ڡW]���L!i�Te�@��um��[db$n��Lk(�!!:�������jQ"HS���=��W����h1 �lsX��sS�:PGh��h�5|�|w\t�Pρj�a@Ȳ�:��3�Dm\�=#�����K���)��������p���0n��*���.�m�osM��$��3���N�ժ�*7�,`�T�@���U�q�6�1Ӷ�)���J��q4m��'t�oB�f�h� +����Ƿ�� t&�x���NF��>b�� 4��Ao��!o�z( ��d(\g!��gY�jSH���u�X�2�k��-�Zd��2�^�5�=� d��?��L.���~��\��ʳ�l4Uyn�lԔ��Zg���x�h�����i�lP� ��L�l&��WCq�m��!<���s�0����n��� s��5̌7fW)Ӭ���R}Y9�]e��蠫yR�t �����]�����b���13�lŷ����̥A&�L#����ŕ{�eN��Ǣ���ଵ�(�|͛z����³�����)�u���/#�X���.�C&�p�O�ڰ�n�����t:Q��$L� �3�5�y^Aaj tЮ$%87�U��,�DJm2�Ԇ�&�|̂�?H̯W�Ι� +ⓣ�q4/I�F� ���?��$�rU�4��0���>}���d�<Ɗ����r*�47՚]��,�G�^H^����`��MtM#֍9�q�:uLfu����V���5�l�!������_>��ݣ����GۛS>M5���t�p�5 YP�#��&*���H�>��Lv�5d������~��� ��ʗ���P�s�ܸ"��oj����#��f,����ةϱU�TL�@L��IϨ%㞐������g�U%?���-kXb�~(���(�4ՠc=\�T{B��SY���}�<�O��2kP���$}��c���G���7����űDL����d}����|�endstream +endobj +1927 0 obj << +/Type /Page +/Contents 1928 0 R +/Resources 1926 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +/Annots [ 1939 0 R ] +>> endobj +1939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.64 492.867 308.471 501.778] +/Subtype /Link +/A << /S /GoTo /D (parameters) >> +>> endobj +1929 0 obj << +/D [1927 0 R /XYZ 71.731 729.265 null] +>> endobj +1930 0 obj << +/D [1927 0 R /XYZ 89.664 708.344 null] +>> endobj +1931 0 obj << +/D [1927 0 R /XYZ 158.864 708.344 null] +>> endobj +1932 0 obj << +/D [1927 0 R /XYZ 285.109 708.344 null] +>> endobj +1933 0 obj << +/D [1927 0 R /XYZ 71.731 685.43 null] +>> endobj +1934 0 obj << +/D [1927 0 R /XYZ 224.504 672.478 null] +>> endobj +1935 0 obj << +/D [1927 0 R /XYZ 425.117 672.478 null] +>> endobj +1936 0 obj << +/D [1927 0 R /XYZ 71.731 631.467 null] +>> endobj +1937 0 obj << +/D [1927 0 R /XYZ 71.731 616.523 null] +>> endobj +1055 0 obj << +/D [1927 0 R /XYZ 71.731 567.472 null] +>> endobj +266 0 obj << +/D [1927 0 R /XYZ 251.888 528.1 null] +>> endobj +1938 0 obj << +/D [1927 0 R /XYZ 71.731 517.735 null] +>> endobj +1056 0 obj << +/D [1927 0 R /XYZ 71.731 477.923 null] +>> endobj +270 0 obj << +/D [1927 0 R /XYZ 381.468 434.825 null] +>> endobj +1057 0 obj << +/D [1927 0 R /XYZ 71.731 430.995 null] +>> endobj +274 0 obj << +/D [1927 0 R /XYZ 246.48 395.453 null] +>> endobj +1940 0 obj << +/D [1927 0 R /XYZ 71.731 385.31 null] +>> endobj +1941 0 obj << +/D [1927 0 R /XYZ 71.731 355.239 null] +>> endobj +1942 0 obj << +/D [1927 0 R /XYZ 71.731 355.239 null] +>> endobj +1943 0 obj << +/D [1927 0 R /XYZ 71.731 350.258 null] +>> endobj +1944 0 obj << +/D [1927 0 R /XYZ 89.664 329.5 null] +>> endobj +1945 0 obj << +/D [1927 0 R /XYZ 290.772 329.5 null] +>> endobj +1946 0 obj << +/D [1927 0 R /XYZ 71.731 314.392 null] +>> endobj +1947 0 obj << +/D [1927 0 R /XYZ 89.664 298.616 null] +>> endobj +1948 0 obj << +/D [1927 0 R /XYZ 71.731 296.459 null] +>> endobj +1949 0 obj << +/D [1927 0 R /XYZ 89.664 280.683 null] +>> endobj +1950 0 obj << +/D [1927 0 R /XYZ 71.731 257.769 null] +>> endobj +1951 0 obj << +/D [1927 0 R /XYZ 198.091 244.818 null] +>> endobj +1952 0 obj << +/D [1927 0 R /XYZ 465.445 244.818 null] +>> endobj +1058 0 obj << +/D [1927 0 R /XYZ 71.731 198.825 null] +>> endobj +278 0 obj << +/D [1927 0 R /XYZ 193.715 161.61 null] +>> endobj +1953 0 obj << +/D [1927 0 R /XYZ 71.731 151.245 null] +>> endobj +1954 0 obj << +/D [1927 0 R /XYZ 71.731 121.396 null] +>> endobj +1955 0 obj << +/D [1927 0 R /XYZ 201.683 110.601 null] +>> endobj +1926 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1958 0 obj << +/Length 2158 +/Filter /FlateDecode +>> +stream +x�}i����� +c�!r1��5=��lL�,�b��h��cѶ�r$*����.ʲ=������t���/^��*S�$�J�|���E�=���.�PH��Ǘw�?��RU��^v�,+T��2M�&OV/�?����̰�< +2��g;:ݶ�5�]���/��%�i��M�Ue<ͽ6�j����$*�VEU��,I�W=~��ȑ�* +$���H�z���:,�( S��0���Va��,�39SG���[�m��?��i�a�N��5���n�u�p�3���?�q۷-쀧ܨ�-���w���J�$��T���}�N�8 +z^��<2t��$ +~[�y`s��hj�A�u|�'ۖQ�B�_[��0��1�$NB�|�=/��>D�n�;9x=��ͱ���%f��8����*�`��db��b��������U�̺�pJ"'���u�&I`{1#Mb��a��[�7vS۞���sX���Q������{��v���}�8=�%�~dt�c,�ğ�Y�w��6ڂ��3�-ャ7r�>����N��tr�A��H���U�=-���~ �W�x���[[m3��&БA��?����h�-cN�����LǼ)�����c�+ʈc��5f \��i�u���6�petrk4x��,S���?3�u(�S�T(N��F��>کY4����oT����J�"�{ks毮kb�0��:��j����N�ZΉ͟Z7�� c�l�7� "�_Q����4����9N�#l�>��Y@��7܋E "���G0%�%��T�߫>���2��'1�v֜m2���T�����\�/�Q�ɲ�:�F�3��d��J�h�I���Lc9Yx��*�u +�r�I�$)��3`e�>D����Jj���K���e�f�.)��!7[i0P +���PL �XyAs�m$����14�zèC���O5��s��C�yZ�O�܀�<#��1D��ޅ�#�5ƛE��82�����x�U��Mf�d\g�g�lTYq�~�y#/�G�b!'N��-e����1��6 +�?�_ h�s� ,���$*ƀo�Y�([�����*^>;�ڞ�mo�f�����1���'OO�A�l�2-���h�W8pj,�/&�v$ ��l܂)���A*^qD��-"䄬���� +`�E>�h���J�T,.�I�/�b���UB�֏q:1�s'CWp����l�B�7����^�> l�{$@l���� �MTd�e������Q�ǹ�p�~�?By�5� +��7�6����Z���Bi�@\Ŏ��|�����[�/z�+܈�I��(����aV�.a�#�v�c0w��ReN���\�>��_}}�f0C2o6� �J8��ft��Jt[�H���}�����+��ĵ�Y� �JJv"���X�4�ǡ�4�W�)̟?=�y�k��\���>�|��~�.�z��a,�r���@x���ӖT����X��VP���̓�Kf��� �f�7~k��12[�&���a&�g$����{"N��u��mz�v��$>��o�x@_�-�vZF�ئ���h����uiw��+�zʖ^8�����`���Ln��t���F�}�{R˼@ؽ�r7Lg��A��ۭ�d�/����`8��JR���`5�A����ʇ��1�7�x��u��5=�n�q��zj{�ݵ��=/���d$p�K������e��46X�{��G�i�ϒ>�z��'+�;��}��ZT,C�v��x��ܭd��%� h7 ����$��O <@�W3+��h��G,D}�$h~��*z�pA�C�x�s̉Q]�q���Q�X������+�& ��w=��4.`Mb?.��k:9��� l�b6�g+���)��pl�����"�����܂�����u}�u�^L���־�:��d���{���zƙ�k������<��ae��p�]��'���I����\�M + �?�j!LU�48=�"�4�/*���,���-����>��R��ѽ�=�R�/��}0��%��c��2�W��dj\��$�t��^�<�����_'3Mo/R�v'�4:u�ˤ��m��\~�G���o�9<8��3A7%�~�����endstream +endobj +1957 0 obj << +/Type /Page +/Contents 1958 0 R +/Resources 1956 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 1816 0 R +>> endobj +1959 0 obj << +/D [1957 0 R /XYZ 71.731 729.265 null] +>> endobj +1960 0 obj << +/D [1957 0 R /XYZ 71.731 741.22 null] +>> endobj +1961 0 obj << +/D [1957 0 R /XYZ 71.731 708.344 null] +>> endobj +1962 0 obj << +/D [1957 0 R /XYZ 71.731 708.344 null] +>> endobj +1963 0 obj << +/D [1957 0 R /XYZ 71.731 683.843 null] +>> endobj +1059 0 obj << +/D [1957 0 R /XYZ 71.731 663.753 null] +>> endobj +282 0 obj << +/D [1957 0 R /XYZ 234.86 626.538 null] +>> endobj +1964 0 obj << +/D [1957 0 R /XYZ 71.731 616.173 null] +>> endobj +1965 0 obj << +/D [1957 0 R /XYZ 71.731 573.372 null] +>> endobj +1966 0 obj << +/D [1957 0 R /XYZ 71.731 531.693 null] +>> endobj +1967 0 obj << +/D [1957 0 R /XYZ 71.731 531.693 null] +>> endobj +1968 0 obj << +/D [1957 0 R /XYZ 71.731 521.512 null] +>> endobj +1969 0 obj << +/D [1957 0 R /XYZ 71.731 506.568 null] +>> endobj +1970 0 obj << +/D [1957 0 R /XYZ 71.731 471.298 null] +>> endobj +1060 0 obj << +/D [1957 0 R /XYZ 71.731 402.797 null] +>> endobj +286 0 obj << +/D [1957 0 R /XYZ 254.069 363.425 null] +>> endobj +1971 0 obj << +/D [1957 0 R /XYZ 71.731 363.246 null] +>> endobj +1972 0 obj << +/D [1957 0 R /XYZ 71.731 346.11 null] +>> endobj +1973 0 obj << +/D [1957 0 R /XYZ 256.617 311.32 null] +>> endobj +1974 0 obj << +/D [1957 0 R /XYZ 71.731 304.344 null] +>> endobj +1975 0 obj << +/D [1957 0 R /XYZ 71.731 266.787 null] +>> endobj +1976 0 obj << +/D [1957 0 R /XYZ 71.731 148.068 null] +>> endobj +1956 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F55 1744 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1979 0 obj << +/Length 2032 +/Filter /FlateDecode +>> +stream +xڭXm��6���Bm`�_� 8d���"���އCZ��u�EG/�����ᐒlٛ�Q���p��y�R�R �3��Ay���-���;�Щ�3�������r�'2x�J%,q�J��X�������v�8Z)F�wM��}�צY~���LJ�S,S�g��`�PLEyr���כ����ݟ�����t�� +b�ip��2hu�������T�YL�d��:����s��Ta!'R��2��I�`rd$Y�I�eiF�)����� +2ȤUy�X����L��.����PI��wnp?l�WC*�(K34=�D��#acz��.z]����c��S��s�}}p>�qpޒ��+�휟���_=����X��"Z�����9Kb���l�6�,�-�sh�4f���S��� M��3z}��]4n��gϴ�, +f�3�y�6N�*����F;=����7Ζi��t�>EqT��dG���f )(�=**gE%+��Ou�a%�����l(0�[DQ���F/eI�}�����P/�z�6 ���9�dB�� 6��4�G�}�d�� ����R��.\�"��V�`a��|��GwL����=7%k���Q��$����+�m}����g�̽�9i�T0� ��E��:�L�^�$�>��q�!���K%��ً.����|גG����gU���1���Y1J�-d��`�3{��XGzx����-I�����GInA��ɓۈ������ݝ[G��`�i��]������`�QR���^�}D8[0����`ƚ���a�������j0����'*O�2�Ja�,W�f��h���Z�Q�k�����7�������k�z�V�����`��K[_y�@�<��X7�bg��\�����/�Q0��x6u����bB� ��[d!���U0>b_�����^ þ�1r�Hժ��x~B�w��r�2�/xC_���4�gҙ��s[]I�ސ�g3�� 0K�) �a�����~:x�W��m��Sqr\���f�Je1L<v*��p�8������� �鰳t�zR�X2�*>-T�<l���h8�@�qV��z�P�>�ެr����C9%G���ܣ&A�w>|�Ug�(��5qJ���)�M}J V$�s��=���g$�d�ĥ$�kuӝZ�$q�2�Ai��C�C�Л>ӛ��~V�<e� +��CYU�ŝMh��c"X���,���v�� O���̈�-?�D��{��|m��P�b��b�h��@N���*����{1���5��*3��L̙B&S����.Yv�&Ov�f���FX�lvQ��J�!��M��b5"������hv�1�)�q�%X8�Y�f� +F{z��ꎺ������������A��Aq �t�m�h��I�����)~��,g�u�~�D�?��&�`��Js8�F1��;�j��Tvui�+)��3�B�L�'(|���j���_ܩ|��H�C����ș�k��*�o�$��\K[� �}��a�`93��z���v1PfmI u�m]-��V�sQLe'��C�;e��j��+ˢ�>�ޙ����olm�ۡ�O�P�w�lvAHw�}L������2g���nM�q4~��������-uK�R7P� +'��wv/\�Ӝ#�0�oޏ�y=�w����:������/��������\d���h3s�p�U�y�i��bum����M.;7:�T@�*=�@\7c3�^��Vko����ԩ�|�����S�����%tx� 2|[���t��?kn}8������A�oD�c塩���?j��m���'�'t]���3�����ּ�a"ݿ�7���G������(SI���73w y^eBެ�.��%��!H�4S�]����iW��bGo�G����֍�������Z����gD��,�ރ���F��MkB������6�R��2�b�<�WȸV����Y�H�j�7���2t�$�cd�vH����f8[�܋�'�x���̓��g�Xd,��^:�"/=�H���endstream +endobj +1978 0 obj << +/Type /Page +/Contents 1979 0 R +/Resources 1977 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +/Annots [ 1984 0 R ] +>> endobj +1984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [272.104 644.277 306.198 652.866] +/Subtype /Link +/A << /S /GoTo /D (gloss-contrib) >> +>> endobj +1980 0 obj << +/D [1978 0 R /XYZ 71.731 729.265 null] +>> endobj +1981 0 obj << +/D [1978 0 R /XYZ 71.731 741.22 null] +>> endobj +1982 0 obj << +/D [1978 0 R /XYZ 118.555 692.718 null] +>> endobj +1983 0 obj << +/D [1978 0 R /XYZ 118.555 646.272 null] +>> endobj +1987 0 obj << +/D [1978 0 R /XYZ 492.354 646.272 null] +>> endobj +1988 0 obj << +/D [1978 0 R /XYZ 71.731 603.784 null] +>> endobj +1989 0 obj << +/D [1978 0 R /XYZ 71.731 588.84 null] +>> endobj +1990 0 obj << +/D [1978 0 R /XYZ 71.731 575.888 null] +>> endobj +1991 0 obj << +/D [1978 0 R /XYZ 91.656 560.112 null] +>> endobj +1992 0 obj << +/D [1978 0 R /XYZ 220.329 560.112 null] +>> endobj +1993 0 obj << +/D [1978 0 R /XYZ 257.513 560.112 null] +>> endobj +1994 0 obj << +/D [1978 0 R /XYZ 162.267 547.161 null] +>> endobj +1995 0 obj << +/D [1978 0 R /XYZ 446.625 534.21 null] +>> endobj +1996 0 obj << +/D [1978 0 R /XYZ 154.759 521.258 null] +>> endobj +1997 0 obj << +/D [1978 0 R /XYZ 71.731 509.139 null] +>> endobj +1998 0 obj << +/D [1978 0 R /XYZ 71.731 498.245 null] +>> endobj +1999 0 obj << +/D [1978 0 R /XYZ 91.656 480.411 null] +>> endobj +2000 0 obj << +/D [1978 0 R /XYZ 71.731 460.322 null] +>> endobj +2001 0 obj << +/D [1978 0 R /XYZ 107.706 449.527 null] +>> endobj +2002 0 obj << +/D [1978 0 R /XYZ 204.851 449.527 null] +>> endobj +2003 0 obj << +/D [1978 0 R /XYZ 71.731 421.632 null] +>> endobj +2004 0 obj << +/D [1978 0 R /XYZ 71.731 406.523 null] +>> endobj +2005 0 obj << +/D [1978 0 R /XYZ 91.656 390.748 null] +>> endobj +2006 0 obj << +/D [1978 0 R /XYZ 71.731 357.707 null] +>> endobj +2007 0 obj << +/D [1978 0 R /XYZ 107.706 346.912 null] +>> endobj +2008 0 obj << +/D [1978 0 R /XYZ 71.731 319.017 null] +>> endobj +2009 0 obj << +/D [1978 0 R /XYZ 71.731 305.966 null] +>> endobj +2010 0 obj << +/D [1978 0 R /XYZ 91.656 288.132 null] +>> endobj +2011 0 obj << +/D [1978 0 R /XYZ 71.731 268.043 null] +>> endobj +2012 0 obj << +/D [1978 0 R /XYZ 107.706 257.248 null] +>> endobj +2013 0 obj << +/D [1978 0 R /XYZ 71.731 229.353 null] +>> endobj +2014 0 obj << +/D [1978 0 R /XYZ 71.731 216.302 null] +>> endobj +2015 0 obj << +/D [1978 0 R /XYZ 91.656 198.469 null] +>> endobj +2016 0 obj << +/D [1978 0 R /XYZ 71.731 178.379 null] +>> endobj +2017 0 obj << +/D [1978 0 R /XYZ 107.706 167.584 null] +>> endobj +1977 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F35 981 0 R /F60 1986 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2022 0 obj << +/Length 1951 +/Filter /FlateDecode +>> +stream +xڍX_��6�O�������������h{�����=4��k[>˞���)҉'IELI$ER?RT�*��\eRd|�B�i�*�W�j+?����3����a���Q�*D�F��vǩ(�d�E�ȓp����۫~������}�:;��Qcm��7?���wJ�Ly�Ecf�k��d��T��(��1?�_ǁ���Vհ�8��0�Q���i�X�k6�".�^,�O��E�+����B�4I�;����^�Q~�l�ܫA���vo��"��Y�YU�D����͇}]�,M7���/�"O��Zz` UU 0�����L����P y6Y=X�¡n�tw�Iݍ�(�?L�?@3p+�ḫ�|0Ok�������{�>1�>�a��o�|�h%c�G����OC晓�s �g��aи�#�Yw;���q��+��l �0b�L�퀁5-��&��.'�n�;��[��em&K?)�9*Q��~�7�4;��h +!CB��U�H�7�� �Ml�@�>?`���F'�hM�K3af��`f�0t���������g�5}������[� ��dߐ����ԩ��m 5�?uW��7�B�e��B ����v�ҠCCK@��Y��w;5�� D��P�����4�64R�cm�,;��M��[����^�"lpa���8�����u�x���̽�ͨ���X����{�}[��n G�b?���W���v����eb��H�1xv�cn�����әl?�~�I����yN�E���zB�n�]S�= l�1Z������k��Yg�ͦ�,^daA�!����F��%�|�z���Ŕg�@: �[ ���| ����r�*g�����Z"����*ЮJ��:��`�B(dΛw�z���~ +����Lx��q:P��|F~ȱGKD?�� +*ԖJ*L��/��$�1m ��:�ט���k�n��'e`y&%M�{w�@�,|���ئ9�@{qɀ�EX����u�7�UcJ�5]�g�}���4�#d�zF!�(Y�P ]��#A���07�~�}{YN�@����ͥ6_�pOpw�p����}��S(J�s�(; LA�F�n�t�y�j<�T�L��8�k�=�����k������>x��}{�����~�$c4U�%��&漹������'/�HTjTDM֕<o7���r��_~�'�/_��W\}�¨��^�-�J$Ed!�t�jF;A�x�-�#�������kq=��4��2����y��3_V���Lv�']�����ZRv������"/҇:���h�W=�R��m,�h��8g����㳋����]�a�����7�GzSO�n�Ӿf��ZG��G� �����.]!h�ִp�fe��iJx�|-2��T���aw�.�<`��K����u�7���D��-�."h�Z�Z +��@��r+X����~;�q�kwq\�1Gbর��1��>p�v��r�5O,��DW���f_l`3x�ؔ��d��S�����]A�R�гԀ��+�%�q��[��r��v<o~�V���0Llx�W�ĕ�$��ej]��}-%�� ������T���h�Z���Ϟ܁'�_}K,�7��8�J��^�3�XÕ3��jh�7v$j���N�����=��mOzљ��=�YW�*D>�9��PЗ1KQ�){֝�s�YS;}�}��x��wb �������g�'��r)Hg��zlJ������s�)�G�<�s�&��ɜ�p_�w�5G���մ���������7��lT|�N2�E��6�6�{=4�@Ό���=]�:;��p��e���zN�{��"���s- A��3 ��Ű�y�)�",���F%t�]ò���$�z�Ӎt��R<փ鰃|C���µ����M`_�=v�L���2p�̾�?Չ��o�� g%hJ��ٿP�;���Rendstream +endobj +2021 0 obj << +/Type /Page +/Contents 2022 0 R +/Resources 2020 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +>> endobj +2023 0 obj << +/D [2021 0 R /XYZ 71.731 729.265 null] +>> endobj +2024 0 obj << +/D [2021 0 R /XYZ 71.731 718.306 null] +>> endobj +2025 0 obj << +/D [2021 0 R /XYZ 71.731 708.244 null] +>> endobj +2026 0 obj << +/D [2021 0 R /XYZ 91.656 690.411 null] +>> endobj +1061 0 obj << +/D [2021 0 R /XYZ 71.731 636.613 null] +>> endobj +290 0 obj << +/D [2021 0 R /XYZ 249.837 578.59 null] +>> endobj +2027 0 obj << +/D [2021 0 R /XYZ 71.731 568.448 null] +>> endobj +2028 0 obj << +/D [2021 0 R /XYZ 446.581 545.514 null] +>> endobj +2029 0 obj << +/D [2021 0 R /XYZ 71.731 525.425 null] +>> endobj +2030 0 obj << +/D [2021 0 R /XYZ 155.058 488.727 null] +>> endobj +2031 0 obj << +/D [2021 0 R /XYZ 71.731 476.608 null] +>> endobj +2032 0 obj << +/D [2021 0 R /XYZ 71.731 408.762 null] +>> endobj +2033 0 obj << +/D [2021 0 R /XYZ 76.712 354.331 null] +>> endobj +2034 0 obj << +/D [2021 0 R /XYZ 71.731 339.387 null] +>> endobj +2035 0 obj << +/D [2021 0 R /XYZ 279.863 316.075 null] +>> endobj +1062 0 obj << +/D [2021 0 R /XYZ 71.731 276.523 null] +>> endobj +294 0 obj << +/D [2021 0 R /XYZ 420.154 237.151 null] +>> endobj +2036 0 obj << +/D [2021 0 R /XYZ 71.731 226.786 null] +>> endobj +2037 0 obj << +/D [2021 0 R /XYZ 96.109 204.075 null] +>> endobj +2038 0 obj << +/D [2021 0 R /XYZ 358.981 204.075 null] +>> endobj +2039 0 obj << +/D [2021 0 R /XYZ 417.761 204.075 null] +>> endobj +1063 0 obj << +/D [2021 0 R /XYZ 71.731 196.937 null] +>> endobj +298 0 obj << +/D [2021 0 R /XYZ 262.074 159.721 null] +>> endobj +2040 0 obj << +/D [2021 0 R /XYZ 71.731 149.356 null] +>> endobj +1064 0 obj << +/D [2021 0 R /XYZ 71.731 119.507 null] +>> endobj +2020 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F35 981 0 R /F44 1379 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2043 0 obj << +/Length 2467 +/Filter /FlateDecode +>> +stream +xڅk�۸�{~�{ +X�zK>��Hr�a�n���!(��@K�Z�$�z�����lo������pޤ���`�*��nT�&��y�/�`��7�`�e5�y��f�!��I���nǩڄ�"�B�'�����~�����U��^��{���k=V�]���o��x�D���ѫ�8�+i�h�*�Sǝ��T$M�@2�,��d�j��mT��@�[�>�{;��a�3�8e�nK8S�{���j|� �I-� JU�Z�� +@?��v\��0������j�h��=4�T�� O���m*��e�{��m�2թ�F��V���︗���V2kt�O��Uc�j���2L�O����Ђ���������[����WdezdG�#M�eŕΘRƬ!X8 �R� ���;�x��ྛ��[���{!C��A��u��L[T�Cǽ[�z�jxrs�F?3�����3s\�ރ�{���:��\.J9xy\���;gΖf*�3�)4��j�m[S��\�n�����̼,����r��+�X@���d��T�ND�HzX�Fe~z��q�~\���2M<5��Ua���ݍ@�؛���k�%Q�}@[���4a$N��h�~r�%{ZA�Ȅ��� +]*Ȓ8�R^��8�Eߏtn�}��b�p��m���0�vS[�����9T�G|�$$a�<�������õY��X�:�7��p�4�>Z8����x2���#Ϳ�!,���k�Y�綀�Ύ�����x��Ui�}v�Im �s�ZV�� +��,z +ئ���:�Ӎ�du��`�X���s�x+�qR=�?����+2z�퍰3`���[c{�U��l0�^H��Tg2 j�R(����Hq����T���g���UU�|�#��+3�0PI�N�> = I�1zS0؎���`0K�ip�@a��>,me��aX�$![a��wd��-�\ G���Hi�8�"���T���*���L�Q�g�^h��6F�Y�f��_���5ht)#���:�C�9����yeE�%�@�S����ʵ��q~�(!�Nډ0��`�xu�R��Nm �GR��|��8�/JͅP�0�.~��mI�l��n�����N�!2�В@�]��i����L/C +=ȡ�Zok�����u2 ��W��@$��_�G�FN7���l(xI�2 ���(`��R������-��F�� �9e' +�q�И�Q��Pg�������[�y骖��PC�_l15�uQM�k�0�,w Aگ�_K� (����,U<U����d����G̯�ğ�5�>b��N���4�EGYxLW�$���著��3�SՖ���w�өS��_X�Y<W +�(���8��H�D���|���-��?��g��<= (O3(�?�__����G�sNN� +#�DO��2쬿`;cJnPts@v]�u�bc!v�A�qp�c�/�"������CJi�n;t}e��� RD������E6�X�p��L�_l�E�0� 6�J��<�C۞ �[[}��~��q����6h�>7��!�~�m�����)��8%�(t�@ � å')#�f�I�l��}��0;R@��Ծ��-�5���y!�P��^ಳ(F[��<!����'�|��lC�%�����9��Pt��q��/�*.��NO{^��a�hkȑma��ڮ�!P{d<�)`� +�OU�7NV���� ȅ�:�38� )�)�؆�b~�/4Tp�v�ֶ��K�+�csE�e��x� �n}3J�]C�[/�ô�74B�2����I�6`'��Da�q���3oG jAF�Si��>S4�O���P܇��PZ���!�)n���dH]_"b> +��+1��i[���E��Jb��!Ԑƙ;S +�Ϸ^�>V/��-� �(� J��\ S�g@$��\�׆G���`V�\e�����e����Y�W����{����0_�U-�rC +jH�̳�⌃6����[��>@�6���eF���[ ����:m�_3o���˹,� �������ִ��ycA��ҍ��j���U�{1���O���H�0�� }�������/�W��aX��U���Ic_��ff�P]ؑ[�1Jк�g��;���� ]�����3U�9���A7�ב<�.��A���P�w��;j� +��E��U�I_|Gu8���ΎuI�.Q�fļc�^t�>��������/!{Ō���%害������5���*g�7���OR��w���6pR�%�T��6-(���C�J�w��&}��ùbw�M:>���a6�<� ��_nB��Gu���#��+L�4`��� ��9>>�7���a�� Y����ɽ�������j�� {���ʕ��0��#!L��O�5���ٛ�endstream +endobj +2042 0 obj << +/Type /Page +/Contents 2043 0 R +/Resources 2041 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +/Annots [ 2060 0 R 2061 0 R ] +>> endobj +2060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [330.238 188.44 383.277 197.351] +/Subtype /Link +/A << /S /GoTo /D (install-perlmodules) >> +>> endobj +2061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [91.377 177.545 112.249 184.4] +/Subtype /Link +/A << /S /GoTo /D (gloss-ppm) >> +>> endobj +2044 0 obj << +/D [2042 0 R /XYZ 71.731 729.265 null] +>> endobj +302 0 obj << +/D [2042 0 R /XYZ 294.669 707.841 null] +>> endobj +2045 0 obj << +/D [2042 0 R /XYZ 71.731 697.698 null] +>> endobj +2046 0 obj << +/D [2042 0 R /XYZ 153.714 661.813 null] +>> endobj +2047 0 obj << +/D [2042 0 R /XYZ 71.731 648.862 null] +>> endobj +2048 0 obj << +/D [2042 0 R /XYZ 489.149 648.862 null] +>> endobj +2049 0 obj << +/D [2042 0 R /XYZ 315.11 635.911 null] +>> endobj +2050 0 obj << +/D [2042 0 R /XYZ 191.09 622.959 null] +>> endobj +1065 0 obj << +/D [2042 0 R /XYZ 71.731 594.964 null] +>> endobj +306 0 obj << +/D [2042 0 R /XYZ 349.188 549.809 null] +>> endobj +2051 0 obj << +/D [2042 0 R /XYZ 71.731 537.638 null] +>> endobj +2052 0 obj << +/D [2042 0 R /XYZ 71.731 495.209 null] +>> endobj +2053 0 obj << +/D [2042 0 R /XYZ 440.415 484.415 null] +>> endobj +1066 0 obj << +/D [2042 0 R /XYZ 71.731 469.306 null] +>> endobj +310 0 obj << +/D [2042 0 R /XYZ 242.621 432.091 null] +>> endobj +2054 0 obj << +/D [2042 0 R /XYZ 71.731 424.739 null] +>> endobj +2055 0 obj << +/D [2042 0 R /XYZ 71.731 365.974 null] +>> endobj +1067 0 obj << +/D [2042 0 R /XYZ 71.731 314.168 null] +>> endobj +314 0 obj << +/D [2042 0 R /XYZ 175.703 281.854 null] +>> endobj +2056 0 obj << +/D [2042 0 R /XYZ 71.731 275.727 null] +>> endobj +2057 0 obj << +/D [2042 0 R /XYZ 231.715 262.925 null] +>> endobj +2058 0 obj << +/D [2042 0 R /XYZ 131.775 249.974 null] +>> endobj +1068 0 obj << +/D [2042 0 R /XYZ 71.731 242.836 null] +>> endobj +318 0 obj << +/D [2042 0 R /XYZ 245.449 209.525 null] +>> endobj +2059 0 obj << +/D [2042 0 R /XYZ 71.731 203.399 null] +>> endobj +2062 0 obj << +/D [2042 0 R /XYZ 71.731 167.583 null] +>> endobj +2063 0 obj << +/D [2042 0 R /XYZ 120.149 156.026 null] +>> endobj +2064 0 obj << +/D [2042 0 R /XYZ 71.731 144.37 null] +>> endobj +2041 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F55 1744 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2067 0 obj << +/Length 1595 +/Filter /FlateDecode +>> +stream +xڭko�6�{~�� �ĴޒSC�C��P���"16ITE�n�����N�]']� A����O*���L�@d�B�i2)�#��_~: +�b�$��gˣ��(�,�"�&˛I�b&�, +E���e���|]tV��Y��^,�h�-꺰J��?�?�\�kJ�L,��ƌ4ք�$kR�f�4I'���(��1���g�p� +0��aBR�4˵���<��k= ��4L<F����^롮�L���$���fʉ�k] �4̥� ;��������C�:�� �=�t6��Һ�UV0j-"�'3vs``2rvG�E1�"��rJ���O�����|nm(t��W.0���E%ֶ��ۨ6 +�2 3�V�XC���v�`ĎNAP��}eR�4��v��h�n����'S�sh!��G��h�\ BԎa�З�3���h�����b��@p��0XP�T�@�P\�X:O����+5D]b��V+c �L�y_x��.���k�T�%%OV��P"�u�#|���2�(����l��� ���-���ϯ�.��1l +�q[@"�H�z0�A�I��E�z2�D�R��"���,���JTb"�z�)4���A��C�Y�ء%@��J� ȶ3��)I��7��C�w�4�NA���� ����\X�4x��d�n�9��Q�:<]�"p�?�OL�;M��� ��a�{fQ�N��e��^��(�����G��Y�����}��|��cO��"��Ђ�������AB��#@�u��Ѡ̏X��5�r�w�e���CY B,��HbdIS�#��{a-�&�/�[ř��pq�Q!J�iX�;���x`qv��p��(ʜx�C@�%T���ϧLȑuKE�)��%i��@��.c��^��y�0�خ�HH46���E4�`�E0_ +#����ʮ�������6��� ��(��D74X�c���4�j.qƾcQ�ԏP���s�B�������=m��w��#_Dy�7P�q�ȩ�Ci;��@�a�ù\���H;t����l���W �\�D�IY��6�)@�h�)�J�Z���� �g��f9h�0�Eʋ���K}����3�wת-z�q@�9�qil֪\�ݑ�����b���1����Z7�E���� ���Q�`����IO��A���(t� �Em4A��LcC�ew���l�A!���_�jϛ�����h�'��w[�^�{��o�}Ԑ����6Ib/��$�m-{Y�Z����zd9�a��#�YWa�3��'9k +����n@$s��@aɻ+{\\p��yy�g閌_6��)x��ż7�Tu�D����E[���&��� b��ܲJx��*���D;��� +�kiϰ6�\.���zcc�s��%����&���m����3�Cx�f̂^?4�����Ok�����/.�^�rʭ�y>�~� S�빑mEYw�=^��/��,��r��ϟ]�qЦ{o� +�<��yў0+�B�w�i�`�:!!<N��ob����w8J0��A����jY��WGYk#��>��Ö���"���{Kr����G\��KA�a��'�����)�endstream +endobj +2066 0 obj << +/Type /Page +/Contents 2067 0 R +/Resources 2065 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +>> endobj +2068 0 obj << +/D [2066 0 R /XYZ 71.731 729.265 null] +>> endobj +2069 0 obj << +/D [2066 0 R /XYZ 71.731 741.22 null] +>> endobj +2070 0 obj << +/D [2066 0 R /XYZ 71.731 718.306 null] +>> endobj +2071 0 obj << +/D [2066 0 R /XYZ 501.687 708.344 null] +>> endobj +2072 0 obj << +/D [2066 0 R /XYZ 446.018 696.687 null] +>> endobj +2073 0 obj << +/D [2066 0 R /XYZ 76.712 668.394 null] +>> endobj +2074 0 obj << +/D [2066 0 R /XYZ 71.731 648.468 null] +>> endobj +2075 0 obj << +/D [2066 0 R /XYZ 398.383 636.812 null] +>> endobj +1069 0 obj << +/D [2066 0 R /XYZ 71.731 608.917 null] +>> endobj +322 0 obj << +/D [2066 0 R /XYZ 339.476 573.45 null] +>> endobj +2076 0 obj << +/D [2066 0 R /XYZ 71.731 564.812 null] +>> endobj +2077 0 obj << +/D [2066 0 R /XYZ 71.731 515.666 null] +>> endobj +2078 0 obj << +/D [2066 0 R /XYZ 71.731 513.509 null] +>> endobj +326 0 obj << +/D [2066 0 R /XYZ 243.097 485.28 null] +>> endobj +2079 0 obj << +/D [2066 0 R /XYZ 71.731 478.082 null] +>> endobj +2080 0 obj << +/D [2066 0 R /XYZ 82.521 467.347 null] +>> endobj +2081 0 obj << +/D [2066 0 R /XYZ 71.731 455.228 null] +>> endobj +2082 0 obj << +/D [2066 0 R /XYZ 71.731 424.11 null] +>> endobj +2083 0 obj << +/D [2066 0 R /XYZ 71.731 401.096 null] +>> endobj +2084 0 obj << +/D [2066 0 R /XYZ 71.731 367.92 null] +>> endobj +2085 0 obj << +/D [2066 0 R /XYZ 71.731 342.849 null] +>> endobj +2086 0 obj << +/D [2066 0 R /XYZ 71.731 311.731 null] +>> endobj +2087 0 obj << +/D [2066 0 R /XYZ 71.731 288.717 null] +>> endobj +2088 0 obj << +/D [2066 0 R /XYZ 71.731 255.542 null] +>> endobj +330 0 obj << +/D [2066 0 R /XYZ 226.957 222.665 null] +>> endobj +2089 0 obj << +/D [2066 0 R /XYZ 71.731 215.467 null] +>> endobj +2090 0 obj << +/D [2066 0 R /XYZ 239.683 204.732 null] +>> endobj +2091 0 obj << +/D [2066 0 R /XYZ 329.471 191.781 null] +>> endobj +2092 0 obj << +/D [2066 0 R /XYZ 71.731 179.661 null] +>> endobj +2065 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F27 800 0 R /F55 1744 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2095 0 obj << +/Length 2315 +/Filter /FlateDecode +>> +stream +xڍXm��6��_a�,kY�$KNpE��R䀤�z��ĵu+Q:��χ���pHK�}�b�������l��e,�b�&��tV4���v~z��ұ,G<?l_����ln��l�4K�u���,�y��|�-��;���~��i$!��6����Z����o����hJ�,����x�kx6X�/�a�$�Ӣ60:����F�h��,\���8j�X��(�$������#�ŀ+][��LL���t�Ҳ��7ĕ��0��Œ]���:�0���"��o��8�w +͡�^�Ø�V�����*+G���(�����-�d �:�FT5Q��v���U�y~TZ*3>�=��P��� 5�=�y��f�D +U����,����^�٭�'�����;4U�ӗ(���sF���fE�(�֓+\\;'�j��E��,�;���O����|� +�p�P�,�"����y�:͜������%�^ +ٴ��iܠ�2vF�rzLk���^��$ݾ��-���'��eK+���[���q����+�t���'��c����&<N�����^�9�����G8�A��J4�j�h<�Ǟ(!b�|cA�u���V/X��' ^T����0��TY����\R&!�(�^jMt�x�"9�>�~NQ��J]��Í+�� +U�Z��̥��RRiMK1�K�+pn<�o��y7�1+4 㐅�Tgy��f�(�Z�{� +)�$wDtb{�'���cPo9�ط֪8���K�P;������gU��Vv�W����F?����"䑣�.}h��;�sJĮ��V ������r� ��OA>����(x ���):�]d���f�x�gml!��M�KH�!d4-��D�R�>��h��<��.ː�>�46��s����@� qq �7-A�Q�V�:�s���w�q:qv&�&e��h�"�6X�,��-��P_}xV7�ś0��Y��a����,GL7�Z��ռ���4\�ɍ� s���;���_ B�}l{���M~,�ZG|^� ���U�ɢ����.�Q�;��^���izj�����y��a�&/^��x�kA7>On=�r@�y��r���kA�q_�.�o��,��||R���8-^8y�h�|�:�8�D*�@�4E���S�J[�O�?��y��i�4��Bc˷�&�Kz,��B���E����@>B�*6��1��� +�2d ��~�*�B/y���\p�s0M��4Tc h�A��Zl����0K=��W,K�@�1���:���(���r}ip LJ���˖�,�q���X=�� pal�q���ә�.�-��$��&)�F^qk�1'��\� +l�� �N��렭뛒D�4��H��&`��e�y_U����Q��]�V �� �5�]�GW ���'���8�r��<Z?w���(�����_�6v������ mM�6��F4�M#a����l��f��E_�v�Gl���#4��\�ۣ�a=����o��v�e�(����TQK�q��S�[n�-7����Ç�O��p��= ���P�}M��9��qu���)�������^�c<=S�RO#ܧ��Zľ�A;i��JN� &~�_Z�Qs����g��ݐ�@���w���ݰ hNO s�'�h@;i�D�u}F7�V���`6�[����9όD骩jѻEE�JZ�v�w�,6P�?�2&���T:Dw��C,�*g��=��1���D�+\�g_���{E� +<�_�H��N���*iVb���qz��L=���H��Ǣ��5a���/�菶-k\�ֈD��&���K���� +/��i�wd�k5�i��B�L���/��X�N$^Y�/9�]�'?A��/��HA�5�[%���6�GD�;[�9U,�-e�\�#Rbv�9w�������C�TI�a9�~/��'<�u�kN�b�H�{��l|���m���Ɔ�Kr���o�?.ky�^W�'��r>c)��>��<��͏�ׂ쏈������&\'��Jύ�q#�Y�O��Жo�?l�l���{x��]��ff�o��C8���]� fP̠V�RP�"��@�Thq�B +�>�ۣ���(�&��C�� [�D�� ���</7k��#��ʸ���;n�c��K��-�^�%I-�� �8 +9�x$�O�ndy�2�8NP�C��z��q�i�!�B��pk�2�f,p�/��tl���n6R(G�g��m�:l)�16ˑ����~��d7��8�o� D������r�y)�r/���������O�;endstream +endobj +2094 0 obj << +/Type /Page +/Contents 2095 0 R +/Resources 2093 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +/Annots [ 2100 0 R 2101 0 R 2111 0 R ] +>> endobj +2100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.526 390.272 191.829 399.183] +/Subtype /Link +/A << /S /GoTo /D (security-access) >> +>> endobj +2101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [478.054 390.272 522.885 399.183] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +2111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.482 150.351 269.647 159.263] +/Subtype /Link +/A << /S /GoTo /D (gloss-cpan) >> +>> endobj +2096 0 obj << +/D [2094 0 R /XYZ 71.731 729.265 null] +>> endobj +2097 0 obj << +/D [2094 0 R /XYZ 71.731 718.306 null] +>> endobj +2098 0 obj << +/D [2094 0 R /XYZ 71.731 513.574 null] +>> endobj +1070 0 obj << +/D [2094 0 R /XYZ 71.731 472.628 null] +>> endobj +334 0 obj << +/D [2094 0 R /XYZ 244.612 437.26 null] +>> endobj +2099 0 obj << +/D [2094 0 R /XYZ 71.731 428.623 null] +>> endobj +2102 0 obj << +/D [2094 0 R /XYZ 71.731 390.272 null] +>> endobj +2103 0 obj << +/D [2094 0 R /XYZ 71.731 375.328 null] +>> endobj +2104 0 obj << +/D [2094 0 R /XYZ 290.116 365.828 null] +>> endobj +2105 0 obj << +/D [2094 0 R /XYZ 180.511 342.516 null] +>> endobj +1071 0 obj << +/D [2094 0 R /XYZ 71.731 304.658 null] +>> endobj +338 0 obj << +/D [2094 0 R /XYZ 177.791 265.285 null] +>> endobj +2106 0 obj << +/D [2094 0 R /XYZ 71.731 257.933 null] +>> endobj +2107 0 obj << +/D [2094 0 R /XYZ 71.731 225.071 null] +>> endobj +2108 0 obj << +/D [2094 0 R /XYZ 303.549 201.325 null] +>> endobj +2109 0 obj << +/D [2094 0 R /XYZ 71.731 194.187 null] +>> endobj +2110 0 obj << +/D [2094 0 R /XYZ 71.731 176.254 null] +>> endobj +2112 0 obj << +/D [2094 0 R /XYZ 71.731 150.351 null] +>> endobj +2113 0 obj << +/D [2094 0 R /XYZ 71.731 135.407 null] +>> endobj +2114 0 obj << +/D [2094 0 R /XYZ 121.876 114.252 null] +>> endobj +2093 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2117 0 obj << +/Length 2197 +/Filter /FlateDecode +>> +stream +xڵ]��6�}E�>�L4����{���n�������=8�21ƱS�nv��)R�gf{=�`R�H��HJ f>��Y�4��̅L�Y�{��a�㛀)L�ph�/�\�Y.�$�-7�(JD.�YJ��r�\�ӻ��^u�}/��kt_�u�Wm3����7�/GIq��<_U��L��g��ST&D'���DEF�k}���J���c(� m���� UѬ��a�"�R&@6US��ZMYʼn�)+ا*��E(S��L�FR�(�l�]V/����G�3|ڲ�_�2KE��@�~ߪ��~�x����yA��4�k�C��e�|�}�H�.����(p��ya���"%����H3�U�"�y.}�:���k+=�W���Zv]��W�5/觶IB�����!�,?Z����� F� ��/�(1t7��4� +���s{EU+c�4�~� +��P5O���W�־�^�SS�nh��y��A� ��r�Yn���&7�s��/ʧ��ہ$*�n�SVuW8�3Ы>�S��O����{@QE�1P�<U��a�K��3p4�$�#h,߶ၒ���i��i@ީR5=�D�iL#`f��/����/��!5_� +�4o�D��~��}���(\�ަ���{x�LJ3��Ý��oCՁ��f�j�]�� ܞ�|4!�քW����`��(����,Wg�7m]����q��v��3�j�UAD�s��ςH��~7_$���UW���}�����m��H�7�~K\��#W)c#���0�S�KD%���}�6U���'���HL����������I���,�>ߎ3N�4F��ځ��A�z��� �㉊j��q���X}���U��y��J��`�k�ޡ1�� ���%�Pm�P^�x�5�% ܔ��P� �&���3 aA��a��� Ь�@4ukJ4��v�X�`����/0_B��̣#��VY��ߞ0����8ye�X'����W��)��ü���Sc�=�c��պ�ٷ��<�=Y �7sM�8��N�C�l2�����smW=VM������e�l����мn��=2'�rg�C��L�_5W�?�Zl��v���}�%���v��CO��@�)4�`�Z��h���"T�*+H&τ�2<]�YF#�0�̺�H봕���� \�� kv^�Epӡ����ДX���+��4b�@����o��6W�,��5�<�UW�EC1u������O�����uq��L��qh�(_�����2�G��Y +@�q��4�X��!��m�*`xr��= 3�f�:j�8�܈�$��P�{����|�c���� V�ԇ��CfB�j�<�'�L.p�A�~WM�W�4���Wu�ۜ�b�6$���i1F�z�(�q�(/��S��[����W�[ޕ�ܤ^�}2ێ����h�x_rl��Bs�r�Z\�[U>iH}{���Ib�W�:Fvӎ u����g�j�(�� +�*��C㶁�3��.xYQwp�d��Z&��;���4���Wk1�"-xgn_�*��;n/��Db������ۯ��Y�VO�����3��m������i������p%\�m���Z��"/�g]���:d��A��[���F�P�e��,��Vh�� +mI� ]���}�B�K�P�]�&#���{��b�EoZ�G���s�THH�nqJ�����K���A?��8��_2n�}d� +��Y� +D���2J\u[�Sй��r��\J� �m�K��� �*��"tKI�ͮ���x�����Z���%5x�Ň�ʂ�X�r�4��k�oY��y!��4X��sh&o�gl���ǻ�M$p�U�L��~˥�kΉ0]vվG���8�l�_zYA��[(Mv�i��$����S�ds��[P����U�ܶ�Ƨ����=$���di�K�YԊ�|8{����T.Ǧ�@��l�)���PP&��K�[7W�tы�s��Jw��D�� �d^�IX��C4��9#��Ϫ����DL.�!�MQ _�4��?c4>8��3H�Y�G:i�>�,P?�X�xAӐ�����[�<���=̯�rؙ�_R{I�&B����4@���˼n�'ˎ�Ӭ��v�� �8j+�P�����Vߡl��o�"�o\,-�$o� +��LP��_�Kb*�?�<V�endstream +endobj +2116 0 obj << +/Type /Page +/Contents 2117 0 R +/Resources 2115 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2018 0 R +/Annots [ 2147 0 R 2148 0 R ] +>> endobj +2147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 172.006 89.395 180.917] +/Subtype /Link +/A << /S /GoTo /D (gloss-cgi) >> +>> endobj +2148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.109 159.055 353.412 167.966] +/Subtype /Link +/A << /S /GoTo /D (security-access) >> +>> endobj +2118 0 obj << +/D [2116 0 R /XYZ 71.731 729.265 null] +>> endobj +2119 0 obj << +/D [2116 0 R /XYZ 91.656 708.344 null] +>> endobj +2120 0 obj << +/D [2116 0 R /XYZ 146.368 708.344 null] +>> endobj +2121 0 obj << +/D [2116 0 R /XYZ 244.807 708.344 null] +>> endobj +2122 0 obj << +/D [2116 0 R /XYZ 304.36 708.344 null] +>> endobj +2123 0 obj << +/D [2116 0 R /XYZ 255.29 696.687 null] +>> endobj +2124 0 obj << +/D [2116 0 R /XYZ 71.731 668.792 null] +>> endobj +2125 0 obj << +/D [2116 0 R /XYZ 71.731 604.867 null] +>> endobj +2126 0 obj << +/D [2116 0 R /XYZ 71.731 548.742 null] +>> endobj +2127 0 obj << +/D [2116 0 R /XYZ 71.731 538.78 null] +>> endobj +2128 0 obj << +/D [2116 0 R /XYZ 71.731 500.757 null] +>> endobj +2129 0 obj << +/D [2116 0 R /XYZ 359.37 484.981 null] +>> endobj +1072 0 obj << +/D [2116 0 R /XYZ 71.731 464.892 null] +>> endobj +342 0 obj << +/D [2116 0 R /XYZ 245.404 427.676 null] +>> endobj +2130 0 obj << +/D [2116 0 R /XYZ 71.731 420.324 null] +>> endobj +2131 0 obj << +/D [2116 0 R /XYZ 125.246 394.6 null] +>> endobj +2132 0 obj << +/D [2116 0 R /XYZ 71.731 381.649 null] +>> endobj +2133 0 obj << +/D [2116 0 R /XYZ 71.731 369.529 null] +>> endobj +2134 0 obj << +/D [2116 0 R /XYZ 71.731 369.529 null] +>> endobj +2135 0 obj << +/D [2116 0 R /XYZ 101.32 360.03 null] +>> endobj +2136 0 obj << +/D [2116 0 R /XYZ 71.731 358.815 null] +>> endobj +2137 0 obj << +/D [2116 0 R /XYZ 101.32 348.374 null] +>> endobj +2138 0 obj << +/D [2116 0 R /XYZ 71.731 347.159 null] +>> endobj +2139 0 obj << +/D [2116 0 R /XYZ 101.32 336.717 null] +>> endobj +2140 0 obj << +/D [2116 0 R /XYZ 71.731 335.502 null] +>> endobj +2141 0 obj << +/D [2116 0 R /XYZ 101.32 325.061 null] +>> endobj +2142 0 obj << +/D [2116 0 R /XYZ 71.731 323.846 null] +>> endobj +2143 0 obj << +/D [2116 0 R /XYZ 101.32 313.405 null] +>> endobj +2144 0 obj << +/D [2116 0 R /XYZ 71.731 301.748 null] +>> endobj +2145 0 obj << +/D [2116 0 R /XYZ 71.731 291.786 null] +>> endobj +1073 0 obj << +/D [2116 0 R /XYZ 71.731 251.771 null] +>> endobj +346 0 obj << +/D [2116 0 R /XYZ 326.362 208.673 null] +>> endobj +2146 0 obj << +/D [2116 0 R /XYZ 71.731 196.236 null] +>> endobj +2149 0 obj << +/D [2116 0 R /XYZ 71.731 154.073 null] +>> endobj +1074 0 obj << +/D [2116 0 R /XYZ 71.731 130.228 null] +>> endobj +2115 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F44 1379 0 R /F27 800 0 R /F51 1652 0 R /F23 793 0 R /F32 807 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2152 0 obj << +/Length 2062 +/Filter /FlateDecode +>> +stream +xڥX�o�������W\��G�S�q`��~h����+kI���ٙ�dzl� �cv^;�ٓ��&�"���&?<�6����d +�I����gׯ�`��4 +6�w�0�D�M�"Q������>k�m]_yN(������l���ny��v���X�I�2�f��ld(�0Bu�U^"d�mB +�Jĉs�f�Vz�^�|?m�����d��q}OH?4nz �R�kT^4�v�V*���t�hy0�a�r����iv��=Gg�u:o��0�I/{��h0��r,�����c�J0�-YU�h�m}�jFZ5lC����~�4q�ـ~@ӥ/R��I�X:eO߶kZ�U�4˛�w���SA+F|���=x��̜���A�we;�f3�`�U=s�����9ȅ�1"�i��@m�_%A��G`,)�C���ׁ���2a:��҆j�a*�0doIC�w:��i��Y�?Oœ�kpm����؊�Z�"���$\y�����9�$�\��+H�N����<�4�h&��j��Svh+M�C�_ � B�i�L������pJ�ԦW�8�ؕ�_$�d�(G���a������`^��o�rz����U�{ +���$^$ dá�{�����a�ӕ�`����ԪZi��?b�6]�4� +5�h�# v�E�ޟڦ�|�X�߽� �[�AL������O��)��0�'h�i�8�jt�@�e�#*�;&�q��VY�q��[���Ɓ&eMd�S�l������x_�J� �3UQ�M�����?��6��Q�Qӕq |����N������gu��xC�eO��N���4RE_��^�,]�vDz�'�f�2��E+��=�2^)ٽ����<��T ��,�'��d�4�h��1B+~�����L�|�xJ�����{�{��S"�ǣd*�!_��p~�Y�tCP�"�Z��&@Ac�\ +*�B�C~p������|�=���^�7��w��Q_�Q�5VVY߳v���[�C�f� +���!�Г2��،�:�ۉ�M#� H��1w���HX�Ʊ�B�@�8D���p:E'N��A*�Ȇ9� �_�����,0���,fN ̸!�#�Wq�*������ab6�B-YM��U��k/b�(E$��)���A��p�y&� q.��K�g +˥�t��5XF"��7�3����v�07��K�v���1��7����M�B�`g���ܘvW�fby�M�VO\R{��st) +�X�R-�2��X9��4ބ ^zOCj␔ą���/�'�s����0�pQ��S�!1�9Am[��F�=�b�`a�+����fú�|6+�c?��b��K�V������x��]s9�^��9��qJ�$i�5L���_K�-��z�I�� +�@t*��=~x�a����C9�σy!5/P7�:$��͠9A�G?���ga��6`��!xh:~B6m(g��`�~O�"�x̸|�[?t�j%�3l�����}��}�@�#-�'��[9�}0"��G�$��V�4�ȔG5s�9��{�\� +��ɧE2�J����\��In�HY�^%^z����\���Y�)�T^F�9{��z� +�8`�ڈ����eH��KE��)x�Я߽�ۛ�}���??x���o]x����;G�s +颩�h��~�a�c+� �\��Е��S�nj�@/N4$�8d��7�Jc.>%�]ە�He�ِ-R���^#��ـM#���D��]Bij��h�xQ5yVa�Pދ�� �S�{���~4|%�тw��Gֲk��G3rB��O���ͪ�j��Q��繶]q��������ї��S���Rh�ׯ*7����m��0�`}�/,��ؘc�6D�"^NQ1���p`\e�;>���X��;�|�OF�~��_`&x�,���G��n T��#��"��빢�㾤{��h����j<_q�4V�e]���s��X��Ɋ���9�Ѽ���� O��0�d)z����E�|kM��f��S���ʧ~>��^~�O[�@%�Ko�����h��endstream +endobj +2151 0 obj << +/Type /Page +/Contents 2152 0 R +/Resources 2150 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +/Annots [ 2157 0 R 2161 0 R 2171 0 R ] +>> endobj +2157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.269 659.965 276.942 668.986] +/Subtype /Link +/A << /S /GoTo /D (http-apache-htaccess) >> +>> endobj +2161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [495.542 616.129 537.983 625.041] +/Subtype /Link +/A << /S /GoTo /D (gloss-javascript) >> +>> endobj +2171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [422.403 413.85 453.001 422.44] +/Subtype /Link +/A << /S /GoTo /D (gloss-apache) >> +>> endobj +2153 0 obj << +/D [2151 0 R /XYZ 71.731 729.265 null] +>> endobj +350 0 obj << +/D [2151 0 R /XYZ 203.126 708.149 null] +>> endobj +2154 0 obj << +/D [2151 0 R /XYZ 71.731 698.007 null] +>> endobj +2155 0 obj << +/D [2151 0 R /XYZ 470.257 675.073 null] +>> endobj +2156 0 obj << +/D [2151 0 R /XYZ 116.407 662.122 null] +>> endobj +2158 0 obj << +/D [2151 0 R /XYZ 71.731 642.032 null] +>> endobj +2159 0 obj << +/D [2151 0 R /XYZ 403.87 631.238 null] +>> endobj +2160 0 obj << +/D [2151 0 R /XYZ 268.887 618.286 null] +>> endobj +2162 0 obj << +/D [2151 0 R /XYZ 92.483 592.383 null] +>> endobj +2163 0 obj << +/D [2151 0 R /XYZ 71.731 585.245 null] +>> endobj +2164 0 obj << +/D [2151 0 R /XYZ 71.731 562.331 null] +>> endobj +2165 0 obj << +/D [2151 0 R /XYZ 71.731 531.213 null] +>> endobj +2166 0 obj << +/D [2151 0 R /XYZ 108.448 518.261 null] +>> endobj +2167 0 obj << +/D [2151 0 R /XYZ 158.88 505.31 null] +>> endobj +2168 0 obj << +/D [2151 0 R /XYZ 71.731 480.239 null] +>> endobj +2169 0 obj << +/D [2151 0 R /XYZ 71.731 447.427 null] +>> endobj +2170 0 obj << +/D [2151 0 R /XYZ 71.731 427.502 null] +>> endobj +1301 0 obj << +/D [2151 0 R /XYZ 76.712 397.913 null] +>> endobj +2172 0 obj << +/D [2151 0 R /XYZ 71.731 353.051 null] +>> endobj +2173 0 obj << +/D [2151 0 R /XYZ 71.731 353.051 null] +>> endobj +2174 0 obj << +/D [2151 0 R /XYZ 71.731 336.092 null] +>> endobj +2175 0 obj << +/D [2151 0 R /XYZ 71.731 238.909 null] +>> endobj +2176 0 obj << +/D [2151 0 R /XYZ 71.731 238.909 null] +>> endobj +2177 0 obj << +/D [2151 0 R /XYZ 71.731 219.927 null] +>> endobj +2178 0 obj << +/D [2151 0 R /XYZ 71.731 122.745 null] +>> endobj +2179 0 obj << +/D [2151 0 R /XYZ 71.731 122.745 null] +>> endobj +2150 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F44 1379 0 R /F53 1676 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2185 0 obj << +/Length 1664 +/Filter /FlateDecode +>> +stream +x��X��6�~�JE��z���c� +!�GA@��j�V�Ļ��M�<� +����d�o�~�=��f<{�ă��9��� Q8I7'�d+ON���و���Ľ��Iȟ\/'A�D���/X��u��y��u���L��0�^�m'�BvyUN�_?;y|���s����`,�!�p��X����A���0�E����ڮ�ӎf2MU�Ҹ��8��U�c�j��[+����Sߪ�vO��4[k0���V�&]3�u,�6h>5�E�|�2_�]�;� +b��ӵ,W*��� ��� �fW�Ǫ�A�#$}2���R5��v�Ec`�f�m�(��y�����T�wh�Qq�}�Bv���|�͒�?��~�2�]u���c�hg�yQT���r���D0�1!B�q�w��T�qħ���(Xq�g>��~�����Ӌ +Q���,�j�^��:g��g]����*_��ߵ��2������ǁ�����=�>��Ϡ�3H2���9���W<,v<\��*+��J��1., ��i����xF�" �� @� �Ds���Wϟ�������E���:��֝9l�!b����e�_�LR��|�ڠCb��.5 +ꖺ���$n_۸� �<S�A�q�����c����O}�}��:����P���>��Ϣ��̽��Яt�}shg��W�&���c�E�6S��j�骄6[��l�כ 5YM|�-�{�M�Rڃ��о��<ơ���+(?"��-D,t5?#v$-i����("5J�ZP�T��͔��*i�vʱ8uS�K��^�4M�u: C��Ցq�Ɓa ��4�����J5�k+R��P�f�=]�=&���k���$p�u��}g��Fф��b�����mvӭ.8�&��T��U���Īo���V+������ni�z�,M_���'Wk��u��gf����|����7S������9���h�� +�;�J�B�f$�.O3y-�Z1M�������u۾���6V<^v��a�A��B\�BG���;(��q��Z�(t�%��� ��f�7���y��4p>��?�����I�$l�PQ"%���W: +1UgG<nc��C����6p�F7b�7Ͷ� �(&{p@�G�,O�(4ň�/܈��)�� +Iԯ�F�F~�̵�:rI�4r0��-����:3���8b�T�Ԉ����)��W�%)���݉sk�fs(և]�a�d'��0�zGW Lҗ���oF��R09#�˖�:[t��i~��Q�<���k��K���FL�%3ƽ/!��Ġ;d��}���, +�;�[�;��B��H��q|��|�p�Z��Z���s^>�kF��Z+���2�������ŗc����'�3�:�e�o�u��X��Z.F�C�[���\�$��ӣ:�f�@��jw�25�T=P�NM�kx��=�=0�Sɏ�WX�ڠ��yv4խi~�����HԆp��Xd̺�`�S`>jK�.�����|��_�-�2x�1���0�^��,����w*3,��v�8X4�ʆ~���\^���i��3�X+rFV���Ǧ�К4\��6�+��jEI�@9�--�x������M�����{F�T�Nq8�Bz��T٨�[��L�H������g`98�P��V���/��s��_�s��endstream +endobj +2184 0 obj << +/Type /Page +/Contents 2185 0 R +/Resources 2183 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +/Annots [ 2204 0 R 2207 0 R ] +>> endobj +2204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.345 212.583 218.649 219.437] +/Subtype /Link +/A << /S /GoTo /D (security-access) >> +>> endobj +2207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [263.538 115.163 281.201 124.075] +/Subtype /Link +/A << /S /GoTo /D (gloss-cgi) >> +>> endobj +2186 0 obj << +/D [2184 0 R /XYZ 71.731 729.265 null] +>> endobj +2187 0 obj << +/D [2184 0 R /XYZ 71.731 718.306 null] +>> endobj +2188 0 obj << +/D [2184 0 R /XYZ 71.731 516.862 null] +>> endobj +2189 0 obj << +/D [2184 0 R /XYZ 71.731 516.862 null] +>> endobj +2190 0 obj << +/D [2184 0 R /XYZ 71.731 497.521 null] +>> endobj +2191 0 obj << +/D [2184 0 R /XYZ 71.731 447.323 null] +>> endobj +2192 0 obj << +/D [2184 0 R /XYZ 71.731 447.323 null] +>> endobj +2193 0 obj << +/D [2184 0 R /XYZ 71.731 427.982 null] +>> endobj +1075 0 obj << +/D [2184 0 R /XYZ 71.731 354.869 null] +>> endobj +354 0 obj << +/D [2184 0 R /XYZ 378.233 315.497 null] +>> endobj +2194 0 obj << +/D [2184 0 R /XYZ 71.731 308.145 null] +>> endobj +2195 0 obj << +/D [2184 0 R /XYZ 322.352 295.372 null] +>> endobj +2196 0 obj << +/D [2184 0 R /XYZ 454.197 295.372 null] +>> endobj +2197 0 obj << +/D [2184 0 R /XYZ 224.304 269.47 null] +>> endobj +2198 0 obj << +/D [2184 0 R /XYZ 71.731 256.518 null] +>> endobj +2199 0 obj << +/D [2184 0 R /XYZ 207.414 256.518 null] +>> endobj +2200 0 obj << +/D [2184 0 R /XYZ 521.584 256.518 null] +>> endobj +2201 0 obj << +/D [2184 0 R /XYZ 71.731 238.486 null] +>> endobj +2202 0 obj << +/D [2184 0 R /XYZ 358.177 225.634 null] +>> endobj +2203 0 obj << +/D [2184 0 R /XYZ 461.001 225.634 null] +>> endobj +1076 0 obj << +/D [2184 0 R /XYZ 71.731 207.602 null] +>> endobj +358 0 obj << +/D [2184 0 R /XYZ 190.114 168.329 null] +>> endobj +2205 0 obj << +/D [2184 0 R /XYZ 71.731 160.977 null] +>> endobj +2206 0 obj << +/D [2184 0 R /XYZ 71.731 130.172 null] +>> endobj +2183 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F23 793 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2210 0 obj << +/Length 2245 +/Filter /FlateDecode +>> +stream +xڵk����� +#�pr��E��c���]�����lIp�%��E�=��+���i�+gS�z0����p�$_��㋄�D�'�X�E�� ;Xyy��ʡ�&8��o�_ ��X���v!e̲H-�TE�����E��閫H��d�}��k=Tm�����/�O��HX��'��83i��,�?T�2!����؛�J�a��R�����[ӽ_r��8/Z�7ϖ< ���PZ8�Z��&F6\��U�!V:�M��T�(L�aզ�%n�� �i^�e$�ZZ�;�w��Xu2Y*����T�qV��!B��_|3��S���i~g�o�EL��_�w�a`t�.9��i֗�X���4s� +Y���<;�S����[��b;��Tσ����[Ng�b"QƑ�� +��N�_�A��D�� �����`#���J�m[���H�r�#h�6�i���9/u�3W����s+�z3�>T{�+�(�����0V�888��j�{S���Q`��0��1�e<w<^M�|wET�zq�� +��o;��zP�[2�r���3h*="�����m�k�Զ��x[����WXA��Y��1/�|�/�h~?p!�0aj����'8���Pje�Mޗ�h�����������z֗O���V�t��8��"�<�)Lpa9�6��Y���s,��z0R�(U����[l�ۡ� �?��Qn��ٕwf�f�߽�0��Ў���>.H����Y�m��7��. +(L_����7�,�GI��,�Ģ3��ͷ7;Qc�E�4��A{ތ��K��$�tR�ĂK(t6�����t!�2�ڃ}��Pͺ��͕P'i=��*Ċ�XЎ�� $�t�7�?������@��PZp|�l�*k�Vl�Tھ���!�)���mt��Y��x���fhҷ�}�ݶd�d����Xa��ȶ5B�(���� ++���x�{���C�-,�<�Q�n'��-l.2��ﻦ�a�Y%������k'�#GUsR����Ro�GB���w�)XJ��jv9�������e���m�[Cǀ����`���SU���ض�F�xr�+U�b:l+��x�g��*�4���6u�d�z��N��4сz������*�H%a�^�+Nj����$E}!4��}D8Oc1��|,�쟑E���2���; +��o_m�ac1�w�h��`�s�ma6E;�|۵{u�7��Q�%��UL+��&����c�(��P��n$3���z���A!�㎄���V*l�(���4q������/ar��O�@G;V�Yp��A�������C��t�(�%�Q�"ȗ$���$>4(���R �R:�s�"u��������#x���DŽ/B��"���e�ϋk8�[}l +�ae���.l��#��t}(�Q} �$\���2�C�����ك3���#2��V8k�F��A=�,koĐ�7m�p�2���[��� �3�S���V�" c�� ID�(��u +��$����"�6ŌD������ׇ��! #����6#&ԉ�#_�A���Ugr*�XQ94M��堯���ʶ Q�!�/�s��J� t�L�o�wl�ۃ�������bR���I��7;(�8�U�.�h���z���������~��讙���f�O�xj�@,�A���q�K_S���nB���O�%������ta.�t~ӹ��d��: �������d����|<kTD��v¤�?/ع�ˋ7�D_�vsw�~�C3�����gW�)D�T��b�o��j�\V�d��*��L�6_�n��{� +ں�Ox2v��zoUe��P6���EtXZ|lh�hl`����F��Z�'DHzӎn��gO��g�� i��Q��;:8�5}rHt��6�4v~��IO$p�;���ں�����XA`BgO��= ��8�+�*�Q3=:���V!@��uK���R�h;����Ѓ;��ȶ���;�v洡��{.�������|$݃|���#����i��F�!�q��t��E�k*�B�ЛzK�0 ��v�j`4x %���`""t�x�X٬m�W�� 웯#W]@U7n����w��p�#�ڸ>�gG�0V�{���uE[�ob�2_C����'AD��v�����V����#�NP�mՉ���N��Q��Qd���/�H�Ϛu�L.S{�x����2{0V��C�s�6�������}d�endstream +endobj +2209 0 obj << +/Type /Page +/Contents 2210 0 R +/Resources 2208 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +/Annots [ 2215 0 R ] +>> endobj +2215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [400.843 706.187 418.596 715.098] +/Subtype /Link +/A << /S /GoTo /D (gloss-tcl) >> +>> endobj +2211 0 obj << +/D [2209 0 R /XYZ 71.731 729.265 null] +>> endobj +2212 0 obj << +/D [2209 0 R /XYZ 71.731 741.22 null] +>> endobj +2213 0 obj << +/D [2209 0 R /XYZ 71.731 718.306 null] +>> endobj +2214 0 obj << +/D [2209 0 R /XYZ 228.687 708.344 null] +>> endobj +2216 0 obj << +/D [2209 0 R /XYZ 71.731 695.392 null] +>> endobj +2217 0 obj << +/D [2209 0 R /XYZ 71.731 682.441 null] +>> endobj +2218 0 obj << +/D [2209 0 R /XYZ 71.731 670.321 null] +>> endobj +2219 0 obj << +/D [2209 0 R /XYZ 71.731 509.29 null] +>> endobj +2220 0 obj << +/D [2209 0 R /XYZ 118.555 465.745 null] +>> endobj +2221 0 obj << +/D [2209 0 R /XYZ 168.112 445.624 null] +>> endobj +2222 0 obj << +/D [2209 0 R /XYZ 328.223 445.624 null] +>> endobj +2223 0 obj << +/D [2209 0 R /XYZ 129.019 433.968 null] +>> endobj +2224 0 obj << +/D [2209 0 R /XYZ 71.731 422.01 null] +>> endobj +2225 0 obj << +/D [2209 0 R /XYZ 71.731 402.085 null] +>> endobj +2226 0 obj << +/D [2209 0 R /XYZ 440.06 395.49 null] +>> endobj +2227 0 obj << +/D [2209 0 R /XYZ 218.914 383.834 null] +>> endobj +2228 0 obj << +/D [2209 0 R /XYZ 71.731 376.965 null] +>> endobj +2229 0 obj << +/D [2209 0 R /XYZ 247.393 367.196 null] +>> endobj +2230 0 obj << +/D [2209 0 R /XYZ 122.052 355.54 null] +>> endobj +2231 0 obj << +/D [2209 0 R /XYZ 151.246 355.54 null] +>> endobj +2232 0 obj << +/D [2209 0 R /XYZ 180.441 355.54 null] +>> endobj +2233 0 obj << +/D [2209 0 R /XYZ 227.083 355.54 null] +>> endobj +2234 0 obj << +/D [2209 0 R /XYZ 278.209 355.54 null] +>> endobj +1077 0 obj << +/D [2209 0 R /XYZ 71.731 317.682 null] +>> endobj +362 0 obj << +/D [2209 0 R /XYZ 239.15 272.428 null] +>> endobj +2235 0 obj << +/D [2209 0 R /XYZ 71.731 259.99 null] +>> endobj +1078 0 obj << +/D [2209 0 R /XYZ 71.731 248.712 null] +>> endobj +366 0 obj << +/D [2209 0 R /XYZ 442.833 211.496 null] +>> endobj +2236 0 obj << +/D [2209 0 R /XYZ 71.731 201.131 null] +>> endobj +2237 0 obj << +/D [2209 0 R /XYZ 129.185 191.372 null] +>> endobj +2238 0 obj << +/D [2209 0 R /XYZ 71.731 184.234 null] +>> endobj +1079 0 obj << +/D [2209 0 R /XYZ 71.731 127.446 null] +>> endobj +2208 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2242 0 obj << +/Length 1612 +/Filter /FlateDecode +>> +stream +x���n�F��_�����kE.o� �R��G)E��0(re%���j����R�c��Cc ;�;��ZY=���o1߆���{n/Ώ��ܼ9�4�@��pNfGÉm�Bzvo��9��B��|����Y�q���FT�wM�a��ueYԤ���1��h<[srm�����04��Y���2}8���a.�(�g'g�Ѵ��]`����9ݔ�(�J�f��HPJ �o�5{n2�E³%�s�X�,�}��)��6DUɊnsQ�ѝF������RD)i5B#�@D�y��F{G���;�E��?ft��tMٷ\��'4��e/郦�����+'h^��i���Q��B�ˢ��Sf���Yl��Y��]f`�yV�,�1���g���`w��d�mN��� ������B�]������N��gS:����> ߊ*�i#�Y:���+sB�ִ�0T@�l�̮�d��J?tL/.Ю惉Zk�������;��ș;�ލ'�W�z�#h���o�;X���볓�ӛcX/o�8��e�&�,�t0�Ӑ�jL�?�,����;}v�A�����e�,��`�Wڤ��ٰV>E��d���4T���lu@�nWu �Nh@�dQ,pH��Q(�����h�I*���n��>I�ؘ�E�4U:��>���B�td���q�gEx���.����[G�m�� �\�G�}��EVUN���r��x�S����(")E� +~!��"�{,CZ�":_}C�?����?��7�e�R)���T�R��d��j���. +Ͷ��v�9�q�u��u��uQVp�2I+�?���"�� �l�lE+�U]�$��`X;t�. �M{.�誠:(�UAӡn�X,p���1}{��ñ��h�e.�V�i�a���B�K��Ԅq�6KB��]�ST�4�ѴD܂��Ӭ4�R}�Y� �I�u���\�:JY��<[{ [ǎ�⥈��EӖ����6�q��5W��4=4Kڑ�;�Դ�Hc6wR4�j��Ɠڋ�۞�}�-vbP�O��H�29&4_�F)�_h�:q�ւ6�+H���I d-W'�!�І��蠍�Y���2�l#Zr�h�rA+z<��������N��Uٵ!��伀��5�4^]��w]�v�r|( ַ+�d1�)�h�FE�ŕ��nZ�uy��JB���4��i��4���˨N �O�H���!XׁD �B�N��̣��������>��i��|��$���!\�T�<���Qw� �^Hӆ�%�A��o��x1��s4���H�e��JN��Y����:�����3ڸ�c&#�2*����K���~�F�m�\xXF�w�k��.���M�jD��Z�(Dz� ���'��ȶH�ql�9�}���4����X�3�B��ؖ�� ��7�k+-�3���m(X�ǟ���<�{��f��r0�VA��62����ȩ-{MM�.�B��.�켦_�s��F�V�.�V���m�P�T% �DP��|�t���p"�4ö�Ԩ�C���)���C�CTx8��y�]e�wjuٲ��ƿ]\���ߨ�����?/�#2��'3٠�d�#����~9��7����endstream +endobj +2241 0 obj << +/Type /Page +/Contents 2242 0 R +/Resources 2240 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +/Annots [ 2261 0 R ] +>> endobj +2261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.979 193.465 321.762 202.376] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-errors) >> +>> endobj +2243 0 obj << +/D [2241 0 R /XYZ 71.731 729.265 null] +>> endobj +370 0 obj << +/D [2241 0 R /XYZ 330.146 707.841 null] +>> endobj +2244 0 obj << +/D [2241 0 R /XYZ 71.731 697.476 null] +>> endobj +2245 0 obj << +/D [2241 0 R /XYZ 71.731 620.117 null] +>> endobj +2246 0 obj << +/D [2241 0 R /XYZ 139.576 608.214 null] +>> endobj +2247 0 obj << +/D [2241 0 R /XYZ 71.731 596.095 null] +>> endobj +2248 0 obj << +/D [2241 0 R /XYZ 71.731 528.959 null] +>> endobj +2249 0 obj << +/D [2241 0 R /XYZ 71.731 504.937 null] +>> endobj +2250 0 obj << +/D [2241 0 R /XYZ 71.731 437.801 null] +>> endobj +1080 0 obj << +/D [2241 0 R /XYZ 71.731 419.134 null] +>> endobj +374 0 obj << +/D [2241 0 R /XYZ 333.589 381.544 null] +>> endobj +2251 0 obj << +/D [2241 0 R /XYZ 71.731 371.402 null] +>> endobj +2252 0 obj << +/D [2241 0 R /XYZ 402.991 361.42 null] +>> endobj +2253 0 obj << +/D [2241 0 R /XYZ 71.731 336.349 null] +>> endobj +2254 0 obj << +/D [2241 0 R /XYZ 71.731 298.954 null] +>> endobj +2255 0 obj << +/D [2241 0 R /XYZ 153.454 286.003 null] +>> endobj +2256 0 obj << +/D [2241 0 R /XYZ 340.372 286.003 null] +>> endobj +2257 0 obj << +/D [2241 0 R /XYZ 415.55 286.003 null] +>> endobj +2258 0 obj << +/D [2241 0 R /XYZ 463.061 286.003 null] +>> endobj +1081 0 obj << +/D [2241 0 R /XYZ 71.731 265.913 null] +>> endobj +378 0 obj << +/D [2241 0 R /XYZ 491.725 228.698 null] +>> endobj +2259 0 obj << +/D [2241 0 R /XYZ 71.731 219.803 null] +>> endobj +2260 0 obj << +/D [2241 0 R /XYZ 236.591 208.573 null] +>> endobj +1298 0 obj << +/D [2241 0 R /XYZ 71.731 193.465 null] +>> endobj +2262 0 obj << +/D [2241 0 R /XYZ 71.731 155.741 null] +>> endobj +2240 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2265 0 obj << +/Length 891 +/Filter /FlateDecode +>> +stream +x��V[o�6~ϯ�`��")��4h��A��)2C��l˶�ݠ�С��۱�a�xxx.߹B̢�1K1�|8xD�֪���^n/��p��{ �&���oE$���l� �$��R>'��V��۾ޥM�������]��iQ�}^W�?�7ɣ'�+���`&�S4� +��hbI"C5��X�DRj��U��л�C��{$֙�2{�W��U�H�骭��_$7�>�?\=||��� `��)��75v��k�"_zM����~t��WOI�7ϋ�K��!M�J�@��>�ֽ9W���+? #|?�Y[g��du�0���K�;L؆�fM��:JΔ��4P��m���j�FTm;]��AcfH�lj�]�ݍ�^W��6vv +5m�,����}|..��E֙h�� 4|���QM��|s���D)����wx�!��6M�a�h�h�~�3�'�Ȕ"�sKB� ���I�=��NO i��|;�E��O}s��x��$�阮�o3�ɹ,���E7� ;�;͋tY=9<���� ]�I���sYx��������LO�|��e$K�"a$��r�� 31|p`y���8k�s�@�q�D��]6��6����4pV �i&�a�\�5[�`VI��0-,�R:�l ,�D�1�1�f�)��l��lvj�q��1��gL�zx��]N�+�8ӴB�����O(�m���m��/�Uj���w�_���n����M��%|���l�u���ah��q��c�3ݢz��M�r}�pǷo����{�6��yv���39�\����ϗ��Z�v�}}..�t%J��"`�Q�c?��q��W?P���W5�#UM=[5yP�Ým~;���L��+�9��<$�OF�#?x�G���7�Zendstream +endobj +2264 0 obj << +/Type /Page +/Contents 2265 0 R +/Resources 2263 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +/Annots [ 2268 0 R ] +>> endobj +2268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.722 635.353 219.505 644.264] +/Subtype /Link +/A << /S /GoTo /D (trouble-filetemp-patch) >> +>> endobj +2266 0 obj << +/D [2264 0 R /XYZ 71.731 729.265 null] +>> endobj +2267 0 obj << +/D [2264 0 R /XYZ 71.731 663.412 null] +>> endobj +2269 0 obj << +/D [2264 0 R /XYZ 349.925 637.509 null] +>> endobj +1299 0 obj << +/D [2264 0 R /XYZ 71.731 635.353 null] +>> endobj +2270 0 obj << +/D [2264 0 R /XYZ 71.731 597.629 null] +>> endobj +2263 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F27 800 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2273 0 obj << +/Length 3165 +/Filter /FlateDecode +>> +stream +xڍ�n���|���5�Ց�{ޒ iZ$)�8(�>�w�I܈R��;7j���!r8��s%7z�/zȣ ���@e�C��0��`$Y�TA���>��,���·�>���YZ><.a�8{x�����ѧɌ�{��4��7u��x;��|����]����7"偊R$�*�h�A�g��}g�_�P�QO��N�Pe) +dV��x�:��]�15����j�pd���G��������I��7�&�����s��a�=���0�W���t9�+t���a3 q��:X�0�ۛ���K�TP�-�G3j�D )5���^@��"��ϏQ�3�Q�{�E*`��J�S�'�t4��;���]�#�<0���o��V��уFpG2͙i�����N�=���L'b�LF)��h��M�����p9sڬ�?/.���iP�� �~��&�Ұ2(Btū���Ln��.�e��X�y�qPFjû��0�?��V�$�$����>Q��U!Q9M�M�:+����w�)�����Qu]���G5[!!�r�ہ��y��k_:!t���KO��$�+�>�UF��^�3�<9��A�8��g�:�Plى/������5�W���wm�U*��*;�] K8���vƹ�a��+Ww5���v�{�a*H�-�y�^�3�������rT/�y�V&� ����(�:�����Ͱ�E�H�%%��A�2�\���83��>��:iT�;��e�[]E�lѤ=k^����c��e�d�ʬ�����?u�!큿�Z+E��o�߸).'9��8}(`�3��(��8�e��i:}�����kp�6�l�vbY�G"T���̢��4B"&�ଡ଼�*��C3���U/6����Z�0PI� +{C�� ����YYR�A��_���=+�(�*�ge7x�ke��7V8i���k��'�����s5�9����|e{a(�'���j�����0��;���®�d����6��&�D�j4@���# � � ��{�@�F�OcV!�V}�4�2��˧yƹ{������=�k^����?X�1�4�-GX������ Q��|�q��yc8���X�n4�Qa�B�Lj�褸����Q5c���q��'n:˃��!3N�x�Kc oredY��v�\ �`����_P��(��BW��kx�Sc/e�R�8Bd�y#bZ�ǂ����%�J�"���t�tL��*{F��v�_�ۜ^�9?-�vsgu`�C����p,��~C`�q�k��$��N%��i��t/�aii"[�kc<9��WӭԺ�M-ix���^��uhb+r�`�Q� �/f��N"k|b<���!�!�{���ؠl ��(�y���m�P��<y� � +��"t}�T�Q��J��,�Z���P1(}�9�[���P���;��w=�%�K�ޮ�P�A�y�_nTq��+e��z\<�����-�{7�V��R��;��}���t@��aC�vk�cí���^� �o�z�3�4��ZBn'�\r[X��^+��o���OXj�;�vp:ّ��إak� ��B�U&�ױ�� 8��>Ê�}��PD���=H��r�hf��" +��;VOB��l��K������Z��aո����Y*v�r+�c�-y(��Ʈ@�Z�j@����Paq�A�P�E ��&���B�<ѝ��h��Y]�O�!�1�T�sOw�P�g8���Ҝ��9�M����?�8�X�Xm�v��Ip%&B���LM[�P);,QH�JV��~��f�*�m%]K�F�#�N� +R��W��x�fn���v2TU�bQ�$��p�.�T��\�B�k�I%��(�]z��D�x��1��*�K7�H� �7#�i��(H���0q *�a�B�<z��\52�N|�F�14˦9O��$l>��j�b�hoܑ{*�,N|_�y����L�]�^���^��sv�4��r�֦I���tBY<o����Q�p0����y}�\o�����1N�hv.}��?��ѭ�pyٱ�w��3QI���Q�P�#�&_�e�)�q?]{(͉KqP�<R6��y��|$��ڞ<���Aا��D�=cN���{8�qLa�� BR"���z���/�"�'=�w}��#]F��H�#�i��H������'S�<�+&)��K�y�=�E� +���̪� ��/&n�Ht��ܰ���b��ɔk�4�@v~A��e,mq!,O��{PpF��r) M3ر��v�bC$��P�$�Q�ӑW�! F��Z������E ms*W�L#v�B�< y\���n��mr� C��H!�s�ۚ6KI�~�Rmxd�����R���l�ꞹ!5Y�&�c�s�Z���v���0��jM���6ő(,�ξc���nlpFs�T2 �p���ֻ�x<��N�h�W�� O���v�.A�`S?bw}�F��ŅBtڪ�z=E���p�$c�[�r]�}K!�F��:�'tK���c�Mש�zʕ�X�x�η��}Д�S%�B��F�ܺ��� a|�-����9���kDw ���0�S-7Qy�J�1��X����n���G+�_��AdǛ�\gk�D��Q��jRI,�أd��̤��^�eE�×J�3ʽ�O0p1ٽ��ѻ���r/,՚�k�Iʽ�����ˢ N�Uŗ$������}�h1��V#!��Z?�%��n�-.�;Z���Bxb ��QH�3f�iC5�'��������O\�eI����#��(=ӒΗ�ϥ���R��<0A%�Ü��(['{ʛt�u�F"b���-�|��)�|5<�� +j���-�lj�AaC����`}��ߺ�0�S�q��}2P6�Z�b �@�jA��NР��&��ٛA/��/���z�k�F�,K%Aj�E�:�ܵ-A�%�w�����u���,R�'�cMo�W敖0gu���l���N��INi#hpڊ��9s�C,~�|�ٍL�$�a0�$��69?��a��c +%���_@���J(:AB����6i���M��(H�d����PYjPg}�q�W�N+��w�RC����{PP������ƫ�QE*O���KF�2ל��Z>�endstream +endobj +2272 0 obj << +/Type /Page +/Contents 2273 0 R +/Resources 2271 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2180 0 R +>> endobj +2274 0 obj << +/D [2272 0 R /XYZ 71.731 729.265 null] +>> endobj +1178 0 obj << +/D [2272 0 R /XYZ 71.731 718.306 null] +>> endobj +382 0 obj << +/D [2272 0 R /XYZ 402.325 703.236 null] +>> endobj +1179 0 obj << +/D [2272 0 R /XYZ 71.731 692.184 null] +>> endobj +386 0 obj << +/D [2272 0 R /XYZ 288.867 651.159 null] +>> endobj +2275 0 obj << +/D [2272 0 R /XYZ 71.731 638.721 null] +>> endobj +2276 0 obj << +/D [2272 0 R /XYZ 71.731 601.54 null] +>> endobj +2277 0 obj << +/D [2272 0 R /XYZ 71.731 601.54 null] +>> endobj +2278 0 obj << +/D [2272 0 R /XYZ 71.731 591.578 null] +>> endobj +2279 0 obj << +/D [2272 0 R /XYZ 93.912 575.802 null] +>> endobj +2280 0 obj << +/D [2272 0 R /XYZ 71.731 560.694 null] +>> endobj +2281 0 obj << +/D [2272 0 R /XYZ 92.411 544.918 null] +>> endobj +2282 0 obj << +/D [2272 0 R /XYZ 71.731 526.885 null] +>> endobj +2283 0 obj << +/D [2272 0 R /XYZ 263.001 514.033 null] +>> endobj +2284 0 obj << +/D [2272 0 R /XYZ 500.364 514.033 null] +>> endobj +2285 0 obj << +/D [2272 0 R /XYZ 99.905 501.082 null] +>> endobj +2286 0 obj << +/D [2272 0 R /XYZ 71.731 499.674 null] +>> endobj +2287 0 obj << +/D [2272 0 R /XYZ 91.654 483.149 null] +>> endobj +2288 0 obj << +/D [2272 0 R /XYZ 71.731 480.992 null] +>> endobj +2289 0 obj << +/D [2272 0 R /XYZ 93.633 465.217 null] +>> endobj +2290 0 obj << +/D [2272 0 R /XYZ 361.631 452.265 null] +>> endobj +2291 0 obj << +/D [2272 0 R /XYZ 71.731 411.254 null] +>> endobj +2292 0 obj << +/D [2272 0 R /XYZ 93.609 395.478 null] +>> endobj +2293 0 obj << +/D [2272 0 R /XYZ 71.731 310.631 null] +>> endobj +2294 0 obj << +/D [2272 0 R /XYZ 108.531 299.837 null] +>> endobj +2295 0 obj << +/D [2272 0 R /XYZ 71.731 253.844 null] +>> endobj +2296 0 obj << +/D [2272 0 R /XYZ 244.077 243.05 null] +>> endobj +2297 0 obj << +/D [2272 0 R /XYZ 71.731 222.96 null] +>> endobj +2298 0 obj << +/D [2272 0 R /XYZ 71.731 184.106 null] +>> endobj +2299 0 obj << +/D [2272 0 R /XYZ 93.092 168.33 null] +>> endobj +2300 0 obj << +/D [2272 0 R /XYZ 71.731 140.27 null] +>> endobj +2301 0 obj << +/D [2272 0 R /XYZ 92.12 124.494 null] +>> endobj +2271 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F32 807 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2304 0 obj << +/Length 3146 +/Filter /FlateDecode +>> +stream +xڍZY�ܶ~ׯ��KfR3��y�e9%?خxS�T�����$h��j���x̱J�J���n�}|�Y����C�9I�?s�8z(�w�� f�������4�>����A�9Y<<B�u7{H�I#������9��o�~�n"���˦j+�U{�oǭ�9����|����}|�dGA�di�z��J??��K3'�Ç�M� I��e �x��[/ڼrgP��2`���/�9���Yq��Ac^����}��U��S]���3��Aq��= +�=�Z3�m�v<���j�T��FQj��8 �+3Ib�@G +��|'��9U[?�|F)�� ��cU<ss�s�'{E�z�Bz��8pՋ���e��f�Zy���C�0ՠ��;s��� �7 r&���5�tz%(��8o��N�eť���g�e�Rp��0>����xNUY+���� �|��{Y�y��Ė�J�ܶc9���ؖ���䙣ʇ�W��K!�w�]� +l�n��f�/�/J�L�Дa9_+��=���!?����pet��z��O��?�5��M�PmCM�R=��`��ٰa�v +�+]�h���} ''fFYxp�:_>!�~�Un� +��X|AA����xAA;Y�� 5��:�q9]}}�1�e�Ս��ǃ8���xD�v�I�C%���9#:���� ��8���V�}���qA��~����4w}NHp_�]����u����r;� ��l��?r��!/��;�"H��D�͏��Y�p��8 (�o�뷊G��0���앑�|uH�ӵ�|��N�pk;������ב�Ł�3Oh�̜Ev��Zr1Zȇ��l�{��&t7b!/g�������ŭ"��rZ��RbO��S[�����6��N��H�ZS��<���b'N�����������h)�b�0��3d�������R��7[Y�beA�MFdx��ة�CG��<��B��s<d��q$g�#Ċ=�Z��a�D�ՐjY�rU]�jctQ�>��� +osfk�\'����&1� ��-����g4�\�$Cd-3jJ6���q������q�zhQ�BD����M�jE��,��sY�K�Æ�a�߉���v���R� .A�'�6U��7*�3�$�t�s��#� �����F�]D���¢���� ��{�Ŧ��=?�"H\�ێ����i��\ͻ�j7�}��.�_��l)��Ue�z9�N.},�7���������F7ڱ9��A��$����`�`}�Z~¥����U'�������_E�H��ǟ~����︇�D1��:b���`!$����+[V��/��q���+����4 r ��%�=[�n�~:2 ��a�,B�?p���!3����-�d +-��;&0U�կK�.�H&� �vvC�n�a� &�*z-^�g +8s�W%�Y�I�Cy�\�~,�J����5��}Ex���Q�_?�� ����,a��^�f��9n����3�]�r_���^���^�p�4�W�1X���_n ��I�p�`���u��A2��Hk��x�`��G�U!>��yc��i�`4`RF�h�H��F8c���-͓��w<@i�yV��ٌf���x字a=��vbτǎ�n�%� y Al��k1��F��Q5��tc��\b��� �B��K�g��ಖ�"*��B�Q5�`Ew�$Y�4�|����@�R`X�x�ƚw���˻���jB +�RH�����Й"BJ����m���s= �Dv ܞ;G�!�[�U� �j�C���^]��F4!�(�ˍ��)�+���x���`�-E+gR�ޤ���0��ƛ���y���g�:�LF�4�8�X��N�U�y%�6~���l�����5��tpZ��Հ}[na��g�-��/�-J���y��V��"X��U��[Xa4�2Ԕ$4�rk�#a*����h�|�|>9i��7L�3�9ab��'�;A��=)|�y�^y� �۳}����T�~�m*�ؑ��WQR5�U��!%��H�+���F��(�LF-����G� +�^,�6� +3<���-�z;@��j�$X%�92�*p���yȍ,�"RfՋ'4#I?�0��< +�n�H�^�Wij\ yČ�Z>��ObwQ��E��8��v���������s�7_�'����%���b�]nUÍ�op$C�����a�B|q^A�����bAs^X��=xqC�W�ť����R��N��K>���o�@� [�������3��M�ݝ��Tv��eI��Fi��!����<���P�r;N�: +���C�"��]�U1�ȴu�<P����6�6'�I����:�:�������J�Z�) c����r���!���*�!��9N�;���uT�d!�����o<]W���7���EW ݐ)�ו�^�@�/ou�P0�#)�N7wYh�\����Gܭ +��8�z+0� LxR���Dګ���� +X���A�g��'`��Ԭ���Ӂ\p]�=��}�qXB�T�L#�+��L����R��@���t���@�'��w&�]� t��H9���`���pܖL�9v� ��$,��j�nim�2� +���J�����oB16�{��{F�=4� ��q4������FI�~?l�� B���D� �'�0����o}� �SG*��B��]��<��؟(���7w�Q����g0��ß*h(?2�H�G�pD�S4�� +a(U��B7�p!��+�얢�+d}�0�ѫ�e�\�n��T�)��� ��;��l�WW�b5��#?��GH��Or���r�T۠�O^"��Ri����!`�K��n�!� +�T�(��7vqS��|~����t�k*p/~"��������C�G���ݧ���u�,�3�u1z%pb����T� f0B�Jl0N�!1�s� ��4��[-�(����q���;'d�YJַ�pr��e��S%Z�eK9Vv�ĺ��ʟ![��ͤ�����0V`�P�R����ⷖ�F�$���������Dó�ԧ�qSٗ+!�����h����� +��n� [���<O�� ��N +��-�9�\�mI�'07qAM���_�\��R��?endstream +endobj +2303 0 obj << +/Type /Page +/Contents 2304 0 R +/Resources 2302 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +>> endobj +2305 0 obj << +/D [2303 0 R /XYZ 71.731 729.265 null] +>> endobj +1182 0 obj << +/D [2303 0 R /XYZ 71.731 741.22 null] +>> endobj +2306 0 obj << +/D [2303 0 R /XYZ 71.731 718.306 null] +>> endobj +2307 0 obj << +/D [2303 0 R /XYZ 71.731 693.235 null] +>> endobj +2308 0 obj << +/D [2303 0 R /XYZ 91.596 677.46 null] +>> endobj +2309 0 obj << +/D [2303 0 R /XYZ 446.601 664.508 null] +>> endobj +2310 0 obj << +/D [2303 0 R /XYZ 71.731 649.4 null] +>> endobj +2311 0 obj << +/D [2303 0 R /XYZ 92.321 633.624 null] +>> endobj +2312 0 obj << +/D [2303 0 R /XYZ 71.731 618.516 null] +>> endobj +2313 0 obj << +/D [2303 0 R /XYZ 93.135 602.74 null] +>> endobj +2314 0 obj << +/D [2303 0 R /XYZ 71.731 574.68 null] +>> endobj +2315 0 obj << +/D [2303 0 R /XYZ 92.974 558.904 null] +>> endobj +2316 0 obj << +/D [2303 0 R /XYZ 71.731 530.844 null] +>> endobj +2317 0 obj << +/D [2303 0 R /XYZ 92.856 515.068 null] +>> endobj +2318 0 obj << +/D [2303 0 R /XYZ 71.731 469.076 null] +>> endobj +2319 0 obj << +/D [2303 0 R /XYZ 292.521 447.92 null] +>> endobj +2320 0 obj << +/D [2303 0 R /XYZ 71.731 430.82 null] +>> endobj +2321 0 obj << +/D [2303 0 R /XYZ 74.222 357.161 null] +>> endobj +2322 0 obj << +/D [2303 0 R /XYZ 92.957 339.228 null] +>> endobj +2323 0 obj << +/D [2303 0 R /XYZ 416.79 326.276 null] +>> endobj +1180 0 obj << +/D [2303 0 R /XYZ 71.731 275.303 null] +>> endobj +390 0 obj << +/D [2303 0 R /XYZ 269.758 232.205 null] +>> endobj +1181 0 obj << +/D [2303 0 R /XYZ 71.731 231.99 null] +>> endobj +394 0 obj << +/D [2303 0 R /XYZ 283.793 192.833 null] +>> endobj +2324 0 obj << +/D [2303 0 R /XYZ 71.731 182.468 null] +>> endobj +2325 0 obj << +/D [2303 0 R /XYZ 71.731 144.649 null] +>> endobj +2326 0 obj << +/D [2303 0 R /XYZ 71.731 129.705 null] +>> endobj +2302 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F32 807 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2330 0 obj << +/Length 2603 +/Filter /FlateDecode +>> +stream +xڍ˒��_����* ! >��v�8){w+і+�@���,E�|����(��fR:��ht7��-\�y��S����*? +��;wq�����b-$����w�I�E��H/6�E�*v�E�}���b����ᘝ;�,�~�:����TTE��:0��~�9��e�-���ۻ7��P�*M���Y��~�^x��A� +�&�0U.���ʇ�'ίY�-=�9�V���Iw����y�Ӣz��Si"_w�ց +bo���?4&���A�<�',�)�����g%���@��U�ԣu-������A�BH���:��ݮ�N�l/£,v_IU����GC\x�>�,��²�,��]W�D�=M�;2t�B���Y��'p�����`]6(�3���8Yc��^�t8��>L�sEŸ��q[�L 6'�)[#,J�V~YF��@���?��`��� ���Y�l{��R�\ꞑ�i�F�v5��I �-N '� �'�4��8���s��JEˡr��8p������-:5 �8���8 +=�x���f�����g�6��7���*��{���A�,yU��-���� +���I�j���3��<��a$�O���!���}]�Ɠ���0��,�*�[%��y���tƟʌ]����i��8y��4�NH�|�ã��z��^�=a���4/���foNb�ƴ�� �=G +��h�����`ZS�ה(^�%d�n8�y���Hr�sy�G�=� �)RpD�Ã���b�G*�-|�x�tAp��C� �<4��+��k7��������3�-�����<�:��&*��Ƽ���K�"�z�P��r�]1_sʊ�QE�G�5��sԄc811��`�f�<�c=q��atf�!�#�g,�u�+�� ��E�9m텮 +�l���yߣj����`7TOyNޟNR p�Sq�u�M��T �|,�� ���+ �S��6q�R�'�t'���hTTm�U;r�����&n��J���ʭAGM����8�%)䦶���9�m�=� +��"�Lt��7��Pm�>�9�CE +��1��D (w%ԕ�Q��}_c�R���x�`|�Ir��u5����G ^�m���b�x��):��Ƭ���/e=V����i�=��ѿ��oʼ�J�Y��/�� �P�̚˱�d�������a�7��kM ]�O�i4�����Aš}���v��eRa�N!2�!Ǚ]���1�6-���rQ���#��D�k��F���v���(��Q�oEN� �)�ӏ9y2�C�Y����o�J�졕 �����M%%~V�_�@ + +�܌�o8�0��[��`%D���������K��g���&�8�4�m�ñc�!��q�� ;���ŃJ�0;2n+�vYk�L��@�;xh��߶���ŔuŔ ��{�l_�� �{��� �NcZ,�J�a�$�_-=�"<��f�cf�\k��!�"[E�@<Q��mV<o�4�1N������0�bb�aXN���]��ক�kC��s>~¸����H|>0�w�[�q��br<�����a .@VlS�j �OT84'�@ޭ�����6 � +�����J^��B�/Pxn:�f�ͺ���t=�c�AFL���.U����m���&�^��� �eo[�]�m�m�߰�u���Ye��Q�Z�|n�༟u�����J"�������a�����Rড��3a� +�����d&|�I�<?���K-�%h�����?s� Q�o]�=SJ��RS�C*�b倫�wKL�<�.�dH�Y��R<�^���5��+���NҔ�p>� �*Db۞�<���?S��d�2���=��M�s���������m��%���b�v�0.1���a��F1�w�6뮋[F������S�H*�$D$�$AD���Wl%aK���y� 40��Rp�e��) ���,gC�^̸�r������<��x+f��ގ���i�$�����L6� \�J�p.t�5�L5x�����������uU�V�l��"�u�6��;u'�JÛ=rȗ�a���D+7կ܈���Y�77n*����+�X�gl>�������4� +����0���"ۅEC�!,}]ts�8���=0�_8�o�f}WCS�8�" +�մ���gxv�Ш`o>��b�!�,fI�g�Y�m9���S,=h���q��ե�=���o��~R��]�� ��Ͷ�}\�����v��T54���l�$����f't���J�ȁ��-�{ہ'�'�/��f�����{A�{��y.HF�+��|P��.ga&�Θj���CHÏ\��Uge�ve�3�p $N��j�3��#��n����q���VH���y@hxf�+�Bs��*��ͽ��}��pT�`�1Ko,������qhy�����lC�������(S���R�����8�Y�WZ����+��hc_J�j��~�"rIA��!t�^1���^�;s:O��;^g��imH�:����;��Ih��\f����q9������q +�ܑ? +Y�5�z�Z�^If1�1Xc��F��?#���%V�endstream +endobj +2329 0 obj << +/Type /Page +/Contents 2330 0 R +/Resources 2328 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +>> endobj +2331 0 obj << +/D [2329 0 R /XYZ 71.731 729.265 null] +>> endobj +2332 0 obj << +/D [2329 0 R /XYZ 71.731 741.22 null] +>> endobj +398 0 obj << +/D [2329 0 R /XYZ 264.312 659.009 null] +>> endobj +1183 0 obj << +/D [2329 0 R /XYZ 71.731 655.817 null] +>> endobj +402 0 obj << +/D [2329 0 R /XYZ 224.863 624.538 null] +>> endobj +2333 0 obj << +/D [2329 0 R /XYZ 71.731 615.9 null] +>> endobj +2334 0 obj << +/D [2329 0 R /XYZ 71.731 577.549 null] +>> endobj +2335 0 obj << +/D [2329 0 R /XYZ 71.731 572.568 null] +>> endobj +2336 0 obj << +/D [2329 0 R /XYZ 89.664 551.811 null] +>> endobj +2337 0 obj << +/D [2329 0 R /XYZ 71.731 549.654 null] +>> endobj +2338 0 obj << +/D [2329 0 R /XYZ 89.664 533.878 null] +>> endobj +2339 0 obj << +/D [2329 0 R /XYZ 71.731 531.721 null] +>> endobj +2340 0 obj << +/D [2329 0 R /XYZ 71.731 516.777 null] +>> endobj +2341 0 obj << +/D [2329 0 R /XYZ 244.012 507.278 null] +>> endobj +2342 0 obj << +/D [2329 0 R /XYZ 441.891 483.965 null] +>> endobj +1184 0 obj << +/D [2329 0 R /XYZ 71.731 414.824 null] +>> endobj +406 0 obj << +/D [2329 0 R /XYZ 207.755 379.357 null] +>> endobj +2343 0 obj << +/D [2329 0 R /XYZ 71.731 370.72 null] +>> endobj +2344 0 obj << +/D [2329 0 R /XYZ 71.731 342.396 null] +>> endobj +2345 0 obj << +/D [2329 0 R /XYZ 260.836 316.593 null] +>> endobj +2346 0 obj << +/D [2329 0 R /XYZ 300.296 303.641 null] +>> endobj +2347 0 obj << +/D [2329 0 R /XYZ 71.731 283.552 null] +>> endobj +2348 0 obj << +/D [2329 0 R /XYZ 71.731 270.6 null] +>> endobj +2349 0 obj << +/D [2329 0 R /XYZ 71.731 265.619 null] +>> endobj +2350 0 obj << +/D [2329 0 R /XYZ 81.694 244.862 null] +>> endobj +2351 0 obj << +/D [2329 0 R /XYZ 84.124 244.862 null] +>> endobj +2352 0 obj << +/D [2329 0 R /XYZ 71.731 217.176 null] +>> endobj +2353 0 obj << +/D [2329 0 R /XYZ 81.694 201.026 null] +>> endobj +2354 0 obj << +/D [2329 0 R /XYZ 84.184 201.026 null] +>> endobj +2355 0 obj << +/D [2329 0 R /XYZ 71.731 198.869 null] +>> endobj +2356 0 obj << +/D [2329 0 R /XYZ 81.694 183.093 null] +>> endobj +2357 0 obj << +/D [2329 0 R /XYZ 85.242 183.093 null] +>> endobj +2358 0 obj << +/D [2329 0 R /XYZ 71.731 167.985 null] +>> endobj +2359 0 obj << +/D [2329 0 R /XYZ 81.694 153.504 null] +>> endobj +2360 0 obj << +/D [2329 0 R /XYZ 85.005 153.504 null] +>> endobj +2361 0 obj << +/D [2329 0 R /XYZ 438.462 130.192 null] +>> endobj +2328 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F44 1379 0 R /F53 1676 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2364 0 obj << +/Length 2927 +/Filter /FlateDecode +>> +stream +xڝ]��6�}��/���H}�I�=�@r�����֢m]l��l�_3R�� ���p��7��.����"O�����.����`lʦ������_�X$, ��i��]�En��gq�O�o��Cz�e����uF����x^� ��Yy����xLW�?������DĒX�d�>_l<Β�C�?~��]d��+���^�?�%�XTr�{��ÿڭ��F��#:s{зo���s=����I+-d�Q?Dq�(F�"L"G����:iU�\@?�����?�x!` NX("���e�C 2�b'�U���s��f��W+���ʀ�۲)�M$L� ��Q��2?D�h�����LC�a_�������>���χ�����䁖��q�PN���F�� +7p�iA U�M�i�|�k�?���i��~}�S��v'�9����ڧ�D�����IW�u.��Yj���8eC�(iY��y%���M��x�Ȃ��&-=c���_}7�}q].��!�:�?�y��AF�#I%��L�ɚ�=(ίT/�C�3�B�ӗ�=�B� 5e=U0��`<[�E�l�!1k�Jn��`慪S*u^�@��7��7���l�&�qļ�fD�P����Y���<�P�Y��Q�e�bL��� )���V~��u.ғ�;�xm�b&b����C(�w;/�*arHQ��P�� �J��3��ʓ�+����C�=��RI�(Y���шiåA.�����\~�ˊ`/�0K�g�V�1Y�uI�b �ڄ��;(���}*��'zL��&�][�D��8�<�ȏ�F:��vUyZ�@e�I�6����m#�p��`�3�)��v6">04�q��C�ܖ���4�3�1睝�C0ɵ��.*!���)��f��vyG��#Y'n�q�h�)�d�t�lI�&�F1�x7��nd�����Q�rjك����N�iM��G�ַE�4h:��1����h�Ӎ�2����Qz�L����K�/nࢇ�2����&ȼQ���Z0dS��w8sl0�Y��}Y����j%"j����J�����5��5C�8cڡ9�-��aJۘr����j� +�2 �\��ܥ^h����bzVen�Yr[eΜ��=�M��Wو�@eB�Q����u����`�:5���T1�(E?Q <�~ �C�d�@�X�!��5�0���^N�`����Y�R'���(����o�h�/0W�L��}! ��:n4����{W8�b� �b�#Ec1N�6� ��� tBR�}E��z�1�xf*�Afݖ��,j54s+�9c������Ό�Z�;�z��]cŗ���h �sYhYL�5�,A�㾉*��r�� ��e~�����E���$�ZH~p�\�Y����d�%�K ҋ�%��Ne��.�-�A���K�aIf|Bx!eK�E�*֊���o/�j@���T��z���N�Mu�iǟ���=�P��>��BM���x3s� D�=T?$akA��̩Q�19M���TRF����E6�hO���fgs"�!FÝ�ԕ����!�=��l�ig��mQ�\��y��}�R����}���������Av��ݞ�rߣZҷ����L�'V?`�V�e�`�[4H��ha��qz���*ԭ��DW��F�_&x�l�N�`��&p1m9�A�@ڂ� +C:�yr����������1fXO7t^+jA�G\Ы�E�7�-�����ΐ��W��Z���y'�mʢN�]����X���4���4�� �Aх�r_D��{7��!-�o��v��z�\����c�x�Mg���x�Ÿ�nW����1�q5���qZ �k��2��/�b[u���GΓ���ZJ���b.�YI�q8:�pY�Mס����`Z��CMӂ(>l�;%�VE��5���i���bl��)�)\�rӷ3�r�ֿ��0�[w�Mw�犚3�Q��^o��n� ���~_�6���e�A��Q�i౽h��캦��m?��+n�~�2g��p��'������{g�t�"ӯ����ӵ���膷�����D�/��&�C�0:�) `5?r�6վP@��u�}�����+���l�ϧlj�Id� �9���6lgN�㞖���yD|��`@��3u�n���B�"�YM��(�Ca[�}�1N J쑣�r�Kt ��D�v�?�u�����ӭ�oo���ZZJ�=�˛�?ٽ�7&U� @�z?O�.����k;v���_�6<��"�жM(����bҡ��`Fb�E����ٍ���\��5�y�X�W�xM����6��w��j�Qk_� +�p�_�/R���˶�$8g�^_w:5�gD|�L��D˙7�M�x�>��M���L���$i�A>v�=��y��2|��ř�����O@X7I��0%L��2�~m��E3)+���D�ب���t�ōd;+i���)j�3=nL=���`S�5?������<��D`�l#T�i�C1��x��3� P�)�r�<h�zC������!��4�vtopz>r5|+̤�O�Ѧ�|HφzJ���T�+����\S�u�7-�k�=��_�t� ]����l��*l��ҋ���ķ���Z���8��.�}^� �g��r����>7d�MW��i���VQ����qZ.�"�ba���Ĵ��ME��ަ0H�%jԷ�������[¾g�hN�t���pg�MG�Zb �]�yLN�cG�n>�Vv8�;֯ho��.��:w�澅�����,�-k���4y�m ��BG�k��^8�(O�iS��k��BPS��~�ǧo���w�~��3�Ǒ�oi��{��������2� �Y|��C��C��v$+��"3���7�Jendstream +endobj +2363 0 obj << +/Type /Page +/Contents 2364 0 R +/Resources 2362 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +/Annots [ 2398 0 R ] +>> endobj +2398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 172.951 111.126 181.862] +/Subtype /Link +/A << /S /GoTo /D (gloss-product) >> +>> endobj +2365 0 obj << +/D [2363 0 R /XYZ 71.731 729.265 null] +>> endobj +2366 0 obj << +/D [2363 0 R /XYZ 108.593 689.705 null] +>> endobj +2367 0 obj << +/D [2363 0 R /XYZ 71.731 651.25 null] +>> endobj +2368 0 obj << +/D [2363 0 R /XYZ 222.628 632.999 null] +>> endobj +2369 0 obj << +/D [2363 0 R /XYZ 71.731 605.103 null] +>> endobj +2370 0 obj << +/D [2363 0 R /XYZ 81.694 587.17 null] +>> endobj +2371 0 obj << +/D [2363 0 R /XYZ 85.31 587.17 null] +>> endobj +2372 0 obj << +/D [2363 0 R /XYZ 71.731 572.062 null] +>> endobj +2373 0 obj << +/D [2363 0 R /XYZ 81.694 556.286 null] +>> endobj +2374 0 obj << +/D [2363 0 R /XYZ 84.202 556.286 null] +>> endobj +2375 0 obj << +/D [2363 0 R /XYZ 71.731 541.178 null] +>> endobj +2376 0 obj << +/D [2363 0 R /XYZ 81.694 525.402 null] +>> endobj +2377 0 obj << +/D [2363 0 R /XYZ 84.184 525.402 null] +>> endobj +2378 0 obj << +/D [2363 0 R /XYZ 71.731 523.245 null] +>> endobj +2379 0 obj << +/D [2363 0 R /XYZ 81.694 507.469 null] +>> endobj +2380 0 obj << +/D [2363 0 R /XYZ 83.951 507.469 null] +>> endobj +2381 0 obj << +/D [2363 0 R /XYZ 71.731 492.361 null] +>> endobj +2382 0 obj << +/D [2363 0 R /XYZ 81.694 476.585 null] +>> endobj +2383 0 obj << +/D [2363 0 R /XYZ 84.926 476.585 null] +>> endobj +2384 0 obj << +/D [2363 0 R /XYZ 71.731 448.525 null] +>> endobj +2385 0 obj << +/D [2363 0 R /XYZ 81.694 432.75 null] +>> endobj +2386 0 obj << +/D [2363 0 R /XYZ 84.098 432.75 null] +>> endobj +2387 0 obj << +/D [2363 0 R /XYZ 71.731 404.69 null] +>> endobj +2388 0 obj << +/D [2363 0 R /XYZ 81.694 388.914 null] +>> endobj +2389 0 obj << +/D [2363 0 R /XYZ 83.968 388.914 null] +>> endobj +2390 0 obj << +/D [2363 0 R /XYZ 71.731 373.806 null] +>> endobj +2391 0 obj << +/D [2363 0 R /XYZ 81.694 358.03 null] +>> endobj +2392 0 obj << +/D [2363 0 R /XYZ 84.184 358.03 null] +>> endobj +2393 0 obj << +/D [2363 0 R /XYZ 377.232 358.03 null] +>> endobj +2394 0 obj << +/D [2363 0 R /XYZ 71.731 355.873 null] +>> endobj +2395 0 obj << +/D [2363 0 R /XYZ 81.694 340.097 null] +>> endobj +2396 0 obj << +/D [2363 0 R /XYZ 84.15 340.097 null] +>> endobj +1185 0 obj << +/D [2363 0 R /XYZ 71.731 300.082 null] +>> endobj +410 0 obj << +/D [2363 0 R /XYZ 193.202 234.605 null] +>> endobj +1186 0 obj << +/D [2363 0 R /XYZ 71.731 234.389 null] +>> endobj +414 0 obj << +/D [2363 0 R /XYZ 173.502 195.232 null] +>> endobj +2397 0 obj << +/D [2363 0 R /XYZ 71.731 187.88 null] +>> endobj +2399 0 obj << +/D [2363 0 R /XYZ 71.731 142.067 null] +>> endobj +2362 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F53 1676 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2403 0 obj << +/Length 2256 +/Filter /FlateDecode +>> +stream +xڭَ����_!��0��E2~���;kg=�A��CKlI �x��|}���y��`����]]]U]wqܕ��U�ڡ?^l{�`u�^9�������r��y���/|���_=W[DZC'^��gG��zN�e=�ť����+���m��\U�W��@k����Tl������w��v���������<Ӊl���=o"�*H�C)E-i-�'�/����RIs��:�/����j9�vMk�P�{8�� ɠt�=���n���5�my�E�#����L塦����՚�Dz�hU�Qa��:�yF5;��ݲj:�Y�0 +��ͪ��˪Y�=";V )�u�6IX=�ʿ�J�#5틺6�+��\�il����E�u8�c�ڟ��-��5��{Dy?�mh���W�qtD� ��,�d�����Ԫ�9�<���#��8�L�~&��E^c�����OZ?�{2 d5��/��7"q0� tYjZ;K싆O���~H�J&�9%a�7�c5'�ʼ.��;��U�d�����bHK��Y�B�pQ���?�~Q�=sM�/�� r&i�6':��]ώW?�����Ȉ�y�v |~n����ڌ��Rh`+�qR\��>+��L�6��IE�u�T�Q��H�+�N��I��l$ 3��ן>=}�����{T��Z�7��J��u�5�%��u�}���U��x��"��kt�45�qP���=8�0+�7�E&+2p�J�"���r�P�vW ,���O�o{(DYEv)r���z��<�v���q� �ȳD��oU;���O��K8�e�ش{�O6sf���8�~-�Op����EôJtMZC�SN�p(2~�(�:��ֿ~\w��#�!�p����?�������R4d���r�n$��7X���9���A��p�U�*�^���9��: ��#��Q�@�@�O%�jv?��m���G��c��2'P&��?���J����D��,�P ���)�k�+�Pq8eBV�#/�@.��E�^�ګਔp��^�����7��묦� .�q�% +���[v/�E_7;ԋ����Gm߇\�c r.�h�: stf E�#�w'p�Tz}����ޜK�Q5]¤��9���p%DF�kU@ѽ#8���[�� +�w���H��\4)s�ˎӭ/���,?��z�G���\+�w��8eW����EM+�:�i�䄅~��g���KB�͍N����)L�nJiD�%NNDFOf'���;[-j +J�ځ�[� $9�~���:���/���c�����KQ�ԇ�Yd���� ���C��l����[#v�# ��p�T4o ���i�I�u)[ˡ�nL�<����I[1�ޣz��@D�2�O�t}���Hd�hhu���W��섉:�z�b٨v J?��p�&�9�.� �w�%%����:�I�iNS��+r�_j�� 7�����df���v7�F�m[)#�P ��R���l��kL�&��;S~B?�����u�� ֏\;za���� eq�����б�{Dv~L{LT� +H�7��x��偘o]�I��t�۱,�Ù�)�,���^�������kϩl�o9�*�pfU�(�����U��{Dy���C�SB�y�X�1�&���;� ���Y��uo�]ߍ�}�U�s� ��R{���Z���c�nŠFe.�)���ne�������~ 抋�P���$�N���h�r������ZֆA'>��{�`S�{�(�'-ND>��4��F��;a�\' +��,�]Uu��r���AB�b/*95����m�7����6@��AH��Q���n6�:<ŅF X�r�z������9�vU����� �`D[�v�w�'q`��:L�q-�q`�m��+<~]QL-/j&65�@��^bÿY��4hj�5��:���Kkͅ��JjYQ1��i����K0��lj����2[�͗�V����*�����Seg.U�Ŋ=���T��{DV��?Qs!�`�J�|��ػ4P�zN�adGQ���gV���X�'x����#�����fp3���<�x���E1�<�ъA�_L�4\�^'��J="��=lǻ�O���u)���c�ҡ��T��x��r@���t��D&��bK�B��8�]Xg�����RL�z���Gd����]�:�~27yp����}9�-U?���}x���lә��R"/���Q^���;���<(�3D�y�?#�r�/8c'�endstream +endobj +2402 0 obj << +/Type /Page +/Contents 2403 0 R +/Resources 2401 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +>> endobj +2404 0 obj << +/D [2402 0 R /XYZ 71.731 729.265 null] +>> endobj +2405 0 obj << +/D [2402 0 R /XYZ 71.731 718.306 null] +>> endobj +2406 0 obj << +/D [2402 0 R /XYZ 71.731 706.187 null] +>> endobj +2407 0 obj << +/D [2402 0 R /XYZ 71.731 701.206 null] +>> endobj +2408 0 obj << +/D [2402 0 R /XYZ 89.664 680.448 null] +>> endobj +2409 0 obj << +/D [2402 0 R /XYZ 71.731 678.291 null] +>> endobj +2410 0 obj << +/D [2402 0 R /XYZ 89.664 662.516 null] +>> endobj +2411 0 obj << +/D [2402 0 R /XYZ 71.731 660.359 null] +>> endobj +2412 0 obj << +/D [2402 0 R /XYZ 89.664 644.583 null] +>> endobj +2413 0 obj << +/D [2402 0 R /XYZ 71.731 637.445 null] +>> endobj +1187 0 obj << +/D [2402 0 R /XYZ 71.731 593.609 null] +>> endobj +418 0 obj << +/D [2402 0 R /XYZ 199.282 556.394 null] +>> endobj +2414 0 obj << +/D [2402 0 R /XYZ 71.731 546.251 null] +>> endobj +2415 0 obj << +/D [2402 0 R /XYZ 71.731 490.277 null] +>> endobj +2416 0 obj << +/D [2402 0 R /XYZ 510.307 440.628 null] +>> endobj +2417 0 obj << +/D [2402 0 R /XYZ 71.731 420.538 null] +>> endobj +2418 0 obj << +/D [2402 0 R /XYZ 71.731 407.587 null] +>> endobj +2419 0 obj << +/D [2402 0 R /XYZ 71.731 402.605 null] +>> endobj +2420 0 obj << +/D [2402 0 R /XYZ 89.664 381.848 null] +>> endobj +2421 0 obj << +/D [2402 0 R /XYZ 71.731 379.691 null] +>> endobj +2422 0 obj << +/D [2402 0 R /XYZ 89.664 363.915 null] +>> endobj +2423 0 obj << +/D [2402 0 R /XYZ 71.731 361.758 null] +>> endobj +2424 0 obj << +/D [2402 0 R /XYZ 89.664 345.983 null] +>> endobj +1188 0 obj << +/D [2402 0 R /XYZ 71.731 312.942 null] +>> endobj +422 0 obj << +/D [2402 0 R /XYZ 171.278 275.726 null] +>> endobj +2425 0 obj << +/D [2402 0 R /XYZ 71.731 268.374 null] +>> endobj +2426 0 obj << +/D [2402 0 R /XYZ 71.731 235.512 null] +>> endobj +2427 0 obj << +/D [2402 0 R /XYZ 71.731 224.618 null] +>> endobj +2428 0 obj << +/D [2402 0 R /XYZ 71.731 219.636 null] +>> endobj +2429 0 obj << +/D [2402 0 R /XYZ 89.664 196.822 null] +>> endobj +2430 0 obj << +/D [2402 0 R /XYZ 71.731 194.665 null] +>> endobj +2431 0 obj << +/D [2402 0 R /XYZ 89.664 178.889 null] +>> endobj +2432 0 obj << +/D [2402 0 R /XYZ 71.731 163.781 null] +>> endobj +2433 0 obj << +/D [2402 0 R /XYZ 89.664 148.005 null] +>> endobj +1189 0 obj << +/D [2402 0 R /XYZ 71.731 140.867 null] +>> endobj +2401 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2436 0 obj << +/Length 2407 +/Filter /FlateDecode +>> +stream +xڍYK�� �ϯp��R��䴳ӝ��N'5ۻ�T6ڢm�ڒK����� @����A|����GZ�"��Y!E��'�D�g���]4�����I�X0�£����/�I2�D�'���,�"QDլHbQf���O��V���E�EA&��c�o�f������c(�͟�n���>�����Iv��*���9���d&S��9*���L��/�HQ���4;=�����k�qo�lGBƙ]�Q��I�zM��Q}(�`��0ǡ40[eh�;R�S-Ov4�̉Ɨa� ��E��Pf��i`��Y ��g��f4v���a�ߟ M�� +c|�|hD1�Qj~ ��K�V8e���� �-�ƒ��22q""�q�wZ �X4��/�������U��l@�V�������ݚ� F�ߒY ~�.��Ap�"�En�y��@ti:�ř�i����%Lӵ�! +�� +�v�ʺZq���$"w�����]}\�~�5ͽ�������]>�k����q�\(��ϙ{�� +=�Q�Y���썾Y�NR�<+�~�8h8�6v�D�^�V\���k�Q".�a z�<X��3��^�3��|��4����pܙԪe�zJB�_���a�@� +�䑼x�jz#��GC���� nY����y�^�5��d'lQ�/p�\L�{�O��!�������(49�j��-�(!��5�Hs�|L�[�o��R���#{���|?���;9����1ր`ʾ�lyɪ�[(k�aX@��ܲ^"E�inZ�I(�ޥ���wG��-�~h��'9[*)�r ٔ�O�!�c��)�X;�$y0��5�� +�w����Rr���ʖ# ���!;��M�0D�������,�G���D��mV["i�*�9tCcL[P/sX�W566�)f7� 3��nU�" ��~����(� R2��: +_� I�`�ָ}��}��YZ�!�;h��H�!� :��4��N�l�d�4իA��3/K�]�:��|���}�S��F�Ԭ;��������_�;l��ߊ��Z3шe�3�202<B���=�FhZЀ��Ʊ�%�A=)&|���\q�M�`Z@���#���:奷��Yo�{�'lQ�#ՅJr(A���'�B�C����":���t�3�JL � 5�j��͍wt�� {��{��Y,���i6��H�a�8��^�Sv�L�%S�������� +r��He���3�`���T����M�4�L��� +��JJ�dɳ=��:�֬�E�08tLL��V$�)SB��*��o�FU,�&f1���;8z̒�(�����%,�,�b�|��.ۄPB��!L��= q��m����W��&�5���Q7ɸ�3�O��O7�����z��(FA�=S���Dg����ļ�f��^�P�1�d!b�Yp ��2CKFRDi�UwM�-� �^��^S�Ȳʮ�-�qŤ��9T���2�;E?���0:��ȖW��;��`��7�F3'>�8co��� G���^,]G��(D��p�֍#�،Ğx��)�iv�p�' +����+e̻T�]f���:3�k=�b��f)�,�T����p�J�V��#[���4rИ��.�41��%l�0���u�(yx$f_�ur/�J�F�F�m�o���8a̒�VCV^9Е��s�>0��h�}��O���~y���Өc6z��̅�����;��^��=c���;\q�`���7]�N����g�g�<]1���ઃw��Zը��|��2�?�D�����i��q��īsz3}��_v�����_��]ݬY����b����q��Tq�x4�0�#�{�"�MsO���}�Q��o �o6���w��G�f��ʳ��W�X���sQ��6�e!��&InY�)�ޚ/�i�`�5���}Sߛ�q +=)]r@˺� ����,O2*E�JKh�/��� 3��߹����nğ˝�Ϲ +���2�DT�1����ܽ�_���/&��9Ó=z#�Ͻ�N�a��O�',��͜`?���5]z��[h3z�?3�a�o���E,��ֈ�Q,Rt{n�j�r!��Eg�k1����&+�z�^�9�"�w��`������2�'�2w�Cc��pG�}0`�p�|T�N_��i�e�R�v��O�wu�+Swz�˃�r�{t�e貢�n>��8qߏ���f�3����Yo��D����d?��V*B���P��;|F��z��No%%i���<S�ژ��T���K��%t+��י*��:���֪�c�T�H�9+���S�F�����v�������fvs���A9��s�4�+���L8@�nE�I�å�(eq��Ƒ�"$��Q��h�n�ux)��eendstream +endobj +2435 0 obj << +/Type /Page +/Contents 2436 0 R +/Resources 2434 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +>> endobj +2437 0 obj << +/D [2435 0 R /XYZ 71.731 729.265 null] +>> endobj +1191 0 obj << +/D [2435 0 R /XYZ 71.731 741.22 null] +>> endobj +426 0 obj << +/D [2435 0 R /XYZ 185.753 707.841 null] +>> endobj +2438 0 obj << +/D [2435 0 R /XYZ 71.731 700.488 null] +>> endobj +2439 0 obj << +/D [2435 0 R /XYZ 71.731 672.608 null] +>> endobj +2440 0 obj << +/D [2435 0 R /XYZ 71.731 657.664 null] +>> endobj +2441 0 obj << +/D [2435 0 R /XYZ 71.731 608.613 null] +>> endobj +2442 0 obj << +/D [2435 0 R /XYZ 71.731 594.222 null] +>> endobj +2443 0 obj << +/D [2435 0 R /XYZ 71.731 589.241 null] +>> endobj +2444 0 obj << +/D [2435 0 R /XYZ 89.664 567.766 null] +>> endobj +2445 0 obj << +/D [2435 0 R /XYZ 71.731 565.609 null] +>> endobj +2446 0 obj << +/D [2435 0 R /XYZ 89.664 549.833 null] +>> endobj +2447 0 obj << +/D [2435 0 R /XYZ 71.731 547.677 null] +>> endobj +2448 0 obj << +/D [2435 0 R /XYZ 89.664 531.901 null] +>> endobj +2449 0 obj << +/D [2435 0 R /XYZ 71.731 492.947 null] +>> endobj +2450 0 obj << +/D [2435 0 R /XYZ 89.664 475.114 null] +>> endobj +2451 0 obj << +/D [2435 0 R /XYZ 71.731 460.005 null] +>> endobj +2452 0 obj << +/D [2435 0 R /XYZ 71.731 445.061 null] +>> endobj +1190 0 obj << +/D [2435 0 R /XYZ 71.731 356.459 null] +>> endobj +430 0 obj << +/D [2435 0 R /XYZ 157.239 311.204 null] +>> endobj +2453 0 obj << +/D [2435 0 R /XYZ 71.731 298.766 null] +>> endobj +2454 0 obj << +/D [2435 0 R /XYZ 71.731 243.653 null] +>> endobj +2455 0 obj << +/D [2435 0 R /XYZ 71.731 230.701 null] +>> endobj +2456 0 obj << +/D [2435 0 R /XYZ 71.731 225.72 null] +>> endobj +2457 0 obj << +/D [2435 0 R /XYZ 89.664 204.963 null] +>> endobj +2458 0 obj << +/D [2435 0 R /XYZ 71.731 202.806 null] +>> endobj +2459 0 obj << +/D [2435 0 R /XYZ 89.664 187.03 null] +>> endobj +2460 0 obj << +/D [2435 0 R /XYZ 89.664 187.03 null] +>> endobj +2461 0 obj << +/D [2435 0 R /XYZ 71.731 184.873 null] +>> endobj +2462 0 obj << +/D [2435 0 R /XYZ 89.664 169.097 null] +>> endobj +2463 0 obj << +/D [2435 0 R /XYZ 89.664 169.097 null] +>> endobj +2464 0 obj << +/D [2435 0 R /XYZ 71.731 143.095 null] +>> endobj +2465 0 obj << +/D [2435 0 R /XYZ 89.664 125.262 null] +>> endobj +2466 0 obj << +/D [2435 0 R /XYZ 89.664 125.262 null] +>> endobj +2467 0 obj << +/D [2435 0 R /XYZ 71.731 110.153 null] +>> endobj +2434 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2470 0 obj << +/Length 2688 +/Filter /FlateDecode +>> +stream +xڝ]o�6�=��(��<���=u��.�@�p�)���bɱ���Jr�ܯ�ΐ�dY�[[��p�g8&���_�I�(����q��o��|y0ĖA��w7�A�M&�Xm����E�g�DI�Fr�P��=䧡��2�H���X5U�U�DKߝ���U]�w�=�x���ҎT"�T��F����l�/2,��w��B��A&�c@P`z�P��87Ck�ki�U�3�H�_ͮ$���g�;�{��ǟ���3負�p��?�d����\������"��ܗ] d�iaWW��4���S��7Z~`Um�D� B^�0�����RŬ(m�$��w�c{>�4ϛb����ݹ��&���K"�2��}ǸT��uݢd�4%qq�}�ˇ��o-�V}[� 4yD�O�̀���8�� ����\��/��q�e�� +ٕݐW�x*�S] +�<XF���U�P�i�EGi)2��rx&��@�14u�V~2�1"��m���k���=�܂Ҥ,*��'87���OR�wD[��o5�H��Z)�+H��g�����H2���CGeV+^m�ɜ~����(��ϐ4h�h"�<�G����5ӕ���}�j�K�Wv/T�W1�Oqh�G,_3,�1Мu ��{�1�3��t�0�ӈ�A���m��� +z��s[��G���+JȾ1���P�4��A��렁=?� K䏵�Je�l������+DGaD�Д��A�kz0��}=�>�ڦΊqm:1̿��汴ۑ}Q�� ���h��f3q�I0��j�ph��0����-gdu�3ξ=�Nݕ�ʪ�P�����R��?��`�apr �H6vj��"=���?��jόV{C��Xv��:M��r�|�qqj������ځ�vB�<�vB/�z��^��ID�vW�q�����^��ОG����Y*�8]ՉsM'���t�@�U���������ЂK� s�����=G@����p�"� ��{�� �Iq�����i�;;�Wi�� IF�n�s��5(�5#N����o�D�d������@uJ�"�4�i#M�|I�N��؎Ƽ�K,NQ0�Jg,��K���%�✦��e�J'�8����6+K��L�I����d��*C�@a��I��|c����O��w-�Q��Z��j�1����%�׃l�6YOHS��`c0�JT)�c�f�I�>ho�_ +>] >�8 2�&v��<�bN��u�i���D��A$A6�{�ۦ춙���M��fKч�u��J��H�mw���ᗚ����K/�/��ߥ�5[)��c�"h�d��wc��d� +\cW)�4 �h��Y[7t#g��9���=0E1�R���>5��K����.���/k�%"�հv`���A�ka�@�հ^����K{ZO���v�NfR��N���m��q���b�Y�^C�&1C�y�T��%��d +$���]}.l�g��P�⒣��rR�>ܥ �{�sn��?�y8K$�1�\�Y�0h��+�gh��Dz.��\��"H5���\�>;� +�|߶�"�j)p�4ZW�sUi�Z�.�z]i+�gh��qol�=p����tKt�V5�;��%�0�!f-�$=xmi���w�hR�̑�) +�ԺW�D"���j���d��Y����Vh���,5td�gT�4X���=}ĵ�K�uuBS�/!_���^�PX�O�w�w�"��K<��_���"{��&��ҟ5����Hg���M���M7���s�,�3��<�9��$��-��Ƹ��v�L���/�KWZ��IS������q���Ĩ� +T "?�@���/������)�y~��ÿ�VY,�@m�ejӕ���Ǜ[L�980T��ᠽ�\b�f�,.v�{�P(<���BE�F&���K��a!�5x��,7)8tL��8��E��FL�_������̅��/,� �'+�G�sB8PxM�n���4� �K��|�ڎ-��.��0h�&�n��M۽��ߢ@g� �P~lQ����[��,����j3�C�X�C�4-�bV�0Yw��5���Nw��3�0��5�PL����{n�(o�ٷͷG8���%����%,7�p{� '�^�~{�ȧ@���o���� ��MɎ2C;���8���!;:�u���PDXLi���-"��3��4Z��i(�d�<0 �U���O�5�3�H�͞�$Ä�\���ە���$ ˶� +cn͇Ʋ����cB���@C괯�fb�`�9I�]�[�N,���v���9��oU���t�P5>�[�E����M�NWM�ɦmm�9-��)�[dk^(��* S�;�ݾk�w�c����5�CkP-t�� +�Ğ�l3�?�ƽ��kJ�$����nW�K���mH��H�M��Mn=2d{:�zΉ�IG����Y�����$zՊ<� 7y��iZ�rC��i�A�'�E�F���cu��Ψ���!X_�;�{�������Izh�%U����k�2�҇�f� �� ���^,#��B�{�ɭ���n�nEG&eJ(�$̬�u��n���իʐ�DNud|�u�������}���U m:8�^k8$_�p01i�,�`�OSB8������WF���]�d + +5H��\�C�KJ�a�Hendstream +endobj +2469 0 obj << +/Type /Page +/Contents 2470 0 R +/Resources 2468 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2327 0 R +>> endobj +2471 0 obj << +/D [2469 0 R /XYZ 71.731 729.265 null] +>> endobj +2472 0 obj << +/D [2469 0 R /XYZ 71.731 741.22 null] +>> endobj +2473 0 obj << +/D [2469 0 R /XYZ 89.664 708.344 null] +>> endobj +434 0 obj << +/D [2469 0 R /XYZ 330.304 658.108 null] +>> endobj +2474 0 obj << +/D [2469 0 R /XYZ 71.731 645.937 null] +>> endobj +2475 0 obj << +/D [2469 0 R /XYZ 376.087 623.597 null] +>> endobj +2476 0 obj << +/D [2469 0 R /XYZ 71.731 616.459 null] +>> endobj +2477 0 obj << +/D [2469 0 R /XYZ 71.731 598.527 null] +>> endobj +2478 0 obj << +/D [2469 0 R /XYZ 280.339 587.732 null] +>> endobj +2479 0 obj << +/D [2469 0 R /XYZ 71.731 554.691 null] +>> endobj +2480 0 obj << +/D [2469 0 R /XYZ 71.731 541.74 null] +>> endobj +2481 0 obj << +/D [2469 0 R /XYZ 71.731 536.758 null] +>> endobj +2482 0 obj << +/D [2469 0 R /XYZ 89.664 516.001 null] +>> endobj +2483 0 obj << +/D [2469 0 R /XYZ 71.731 513.844 null] +>> endobj +2484 0 obj << +/D [2469 0 R /XYZ 89.664 498.068 null] +>> endobj +2485 0 obj << +/D [2469 0 R /XYZ 71.731 470.009 null] +>> endobj +2486 0 obj << +/D [2469 0 R /XYZ 89.664 454.233 null] +>> endobj +2487 0 obj << +/D [2469 0 R /XYZ 71.731 413.221 null] +>> endobj +2488 0 obj << +/D [2469 0 R /XYZ 89.664 397.446 null] +>> endobj +2489 0 obj << +/D [2469 0 R /XYZ 195.805 397.446 null] +>> endobj +2490 0 obj << +/D [2469 0 R /XYZ 334.793 397.446 null] +>> endobj +2491 0 obj << +/D [2469 0 R /XYZ 71.731 390.307 null] +>> endobj +2492 0 obj << +/D [2469 0 R /XYZ 71.731 377.356 null] +>> endobj +2493 0 obj << +/D [2469 0 R /XYZ 71.731 372.375 null] +>> endobj +2494 0 obj << +/D [2469 0 R /XYZ 89.664 351.617 null] +>> endobj +2495 0 obj << +/D [2469 0 R /XYZ 131.167 351.617 null] +>> endobj +2496 0 obj << +/D [2469 0 R /XYZ 71.731 349.461 null] +>> endobj +2497 0 obj << +/D [2469 0 R /XYZ 89.664 333.685 null] +>> endobj +2498 0 obj << +/D [2469 0 R /XYZ 300.451 333.685 null] +>> endobj +2499 0 obj << +/D [2469 0 R /XYZ 450.128 333.685 null] +>> endobj +2500 0 obj << +/D [2469 0 R /XYZ 71.731 331.528 null] +>> endobj +2501 0 obj << +/D [2469 0 R /XYZ 89.664 315.752 null] +>> endobj +2502 0 obj << +/D [2469 0 R /XYZ 135.13 315.752 null] +>> endobj +2503 0 obj << +/D [2469 0 R /XYZ 174.159 315.752 null] +>> endobj +2504 0 obj << +/D [2469 0 R /XYZ 250.842 315.752 null] +>> endobj +2505 0 obj << +/D [2469 0 R /XYZ 341.239 315.752 null] +>> endobj +2506 0 obj << +/D [2469 0 R /XYZ 467.454 302.8 null] +>> endobj +2507 0 obj << +/D [2469 0 R /XYZ 71.731 300.644 null] +>> endobj +2508 0 obj << +/D [2469 0 R /XYZ 136.488 262.08 null] +>> endobj +2509 0 obj << +/D [2469 0 R /XYZ 76.712 202.407 null] +>> endobj +2510 0 obj << +/D [2469 0 R /XYZ 89.664 184.475 null] +>> endobj +2511 0 obj << +/D [2469 0 R /XYZ 71.731 164.385 null] +>> endobj +2512 0 obj << +/D [2469 0 R /XYZ 353.441 153.59 null] +>> endobj +2513 0 obj << +/D [2469 0 R /XYZ 280.021 140.639 null] +>> endobj +2514 0 obj << +/D [2469 0 R /XYZ 175.77 127.687 null] +>> endobj +2515 0 obj << +/D [2469 0 R /XYZ 397.028 127.687 null] +>> endobj +1192 0 obj << +/D [2469 0 R /XYZ 71.731 120.549 null] +>> endobj +2468 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2518 0 obj << +/Length 2483 +/Filter /FlateDecode +>> +stream +xڵk������ +}hk +8�q�$E�p;>'���4(� �ĕĚ��|����%�]�q���ٙ�y/�'>�ӓ�VsC�� �&��?Y��7Z0f�2༺��zc�$Uil&w�I��j� T�����M�km=���E�Ǘ�����E�fЫn������̦��}wq}w���J�x=�H��L�\:B�{���� ����' ���խ]vu��υ�ڨhN�� �O���Or�;����_ rj0�t�U��Im'��ۋ���,�U�$O�ೂ7"1륙ŁQ>L��� c���2Qd@It럧��eu��^� �I�!��N�~>(S�*6s:q3#9�ԑW�gKW}��`��6G�E������4��J`C�F^Q5m��pUàM6 |��4�<ːu�г/��͖������[ue)˥m�:�=����m�s��p�eM���h�U�5K�5�c���U�G��uW�,*���uM��j��.�����v��j�mP�)*B�6[n��7E����#E�O� �Ro�Ѕ������:��֩��PY*FK�?�\<����}�zM����:�\X��m@g���j�0*h�:�[#�r� U�B��-hF�֠�̤��FQp�����0FB�+��p[���F�V~���v���uA~�8��ݵ��q�d�(#ΝxWh(J؟��D +�����i/y��±�������`c!��e/�d-C��u�#�R��pŕ�ઞ���my�+rm +�vᵃh�����C�;�7�:�ޮx���Y��Hm��+�~ ����p%Ix��m�K�$�q�t�m��<�a��0B���q��`��-;dN)�A��ߴ�+!@�j�xt(U���S��MP�r]�mW�L��g�AW�>�A���R���?֥D��1�xODJ�`�$Oץ]C��2%:�>�����lmV�#��nj����n,$��c�n � �ȟN39&X��w���XZ�l�s�z��{��N(�v��9�#hw�E 'Εr46��j+�H�-_|�#KĦFFc.���{=B��[4Ei������dY���H� +�I���;��%[�՚fF �ڍ�E�2��Skܪ�Ջ�g���kUŵ�X�pE +�cud��_����:�S����!�j����W�ҭ�}}s����73d!�{�ȁ}9h/�8�'���@^�ѥ��8�\7�su++������R1�+o\c/y>̔ ^U���6rZ)ų�� +������v��5"��f-t�M�9k����)�A�?�N�Ry���6+�É�a��g)$�/O�I0���<R��T��Cr&�w7���ݖO@��'�P���9�Zjʲq]���r*F�ڳ�#��?�<V��e�UM�*_����f�ϡ2؟ ުgS ��Ɣ�,0�����H�A������v�I����l�Af�qao � �m�e��h6�g�iHV���%�>R�'(���oy#ly}ie�%�4[�s� �����j<z=��Y��m�1��(H6��{T{F��ä����~K7|�@��9�@r�� ���ϳt�)v O{s˞ە-�vóc�Ggmۂ{�qQ �N��¸�d���W�Ƭ�J!4�`��'pa�p9(�NKGڮ�P�˖�+4-D���K��J�Kؑ��.�Уd���W�A�*�}'Y����IH�%���8�7�[f�lQ�E[�F1�۞)y;"�j�Z�#u1��k���5I?�`�I�[��) _~� �kL�1��Gޤ#��`H�Ͷ2˄�q���H�m+�Z꽄�_����P��/�晑�)���7���!I�ݹ$����ד ��z����8\�*:#��7��.���!^�ぷy��Y��:���,�:{��'8h�Ŝ������h��mh]�P�Gx�z�G��XȠ��0��x���]�q�4�ŚS�أ;��=�٠��1*��My�yԔ��,�GM9���M��3���X4M|̵8�Ls�5qp(d�he3/�lQZ^�/����3"���r�:z�����ϔ3^��M��g���<�S'�ђ�nH��llgb���dc%����T�r%���q؆��]�F�����\*����"k6���g�N��{��ؗT3"9���D��똲 Uh�P~}����I�y���<c3���o��Ӷ�_��!��cQ������D�����^�#���;����0v31d#�2�y����N�m�{�[`,��Tǂ�Kƙ�������g�2K��?��7�~�������﮿��}>��]���,w�Xʹ�b�v}�0�9��h�0��;���?��� �|X�`P�� �ͩ�⩙P��-��D���1̢���Q������d�zܔ')4��z���� �ή��Fp�<Y�:��,?�����eR�K�<�����?fQF�eE�P�Aa���Ɯ�B��endstream +endobj +2517 0 obj << +/Type /Page +/Contents 2518 0 R +/Resources 2516 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +>> endobj +2519 0 obj << +/D [2517 0 R /XYZ 71.731 729.265 null] +>> endobj +438 0 obj << +/D [2517 0 R /XYZ 243.952 705.748 null] +>> endobj +2520 0 obj << +/D [2517 0 R /XYZ 71.731 701.917 null] +>> endobj +2521 0 obj << +/D [2517 0 R /XYZ 118.555 659.727 null] +>> endobj +2522 0 obj << +/D [2517 0 R /XYZ 71.731 596.175 null] +>> endobj +2523 0 obj << +/D [2517 0 R /XYZ 376.425 577.924 null] +>> endobj +2524 0 obj << +/D [2517 0 R /XYZ 76.712 561.286 null] +>> endobj +2525 0 obj << +/D [2517 0 R /XYZ 118.555 517.741 null] +>> endobj +1193 0 obj << +/D [2517 0 R /XYZ 71.731 474.114 null] +>> endobj +442 0 obj << +/D [2517 0 R /XYZ 198.219 441.61 null] +>> endobj +2526 0 obj << +/D [2517 0 R /XYZ 71.731 434.258 null] +>> endobj +1194 0 obj << +/D [2517 0 R /XYZ 71.731 375.493 null] +>> endobj +446 0 obj << +/D [2517 0 R /XYZ 161.035 338.278 null] +>> endobj +2527 0 obj << +/D [2517 0 R /XYZ 71.731 328.135 null] +>> endobj +2528 0 obj << +/D [2517 0 R /XYZ 101.07 292.25 null] +>> endobj +2529 0 obj << +/D [2517 0 R /XYZ 406.78 292.25 null] +>> endobj +2530 0 obj << +/D [2517 0 R /XYZ 71.731 290.093 null] +>> endobj +2531 0 obj << +/D [2517 0 R /XYZ 71.731 285.112 null] +>> endobj +2532 0 obj << +/D [2517 0 R /XYZ 89.664 264.355 null] +>> endobj +2533 0 obj << +/D [2517 0 R /XYZ 420.396 264.355 null] +>> endobj +2534 0 obj << +/D [2517 0 R /XYZ 71.731 251.304 null] +>> endobj +2535 0 obj << +/D [2517 0 R /XYZ 89.664 233.471 null] +>> endobj +2536 0 obj << +/D [2517 0 R /XYZ 71.731 213.381 null] +>> endobj +2537 0 obj << +/D [2517 0 R /XYZ 71.731 213.381 null] +>> endobj +2538 0 obj << +/D [2517 0 R /XYZ 71.731 202.474 null] +>> endobj +2539 0 obj << +/D [2517 0 R /XYZ 71.731 190.958 null] +>> endobj +2540 0 obj << +/D [2517 0 R /XYZ 323.148 180.569 null] +>> endobj +2541 0 obj << +/D [2517 0 R /XYZ 71.731 179.161 null] +>> endobj +2542 0 obj << +/D [2517 0 R /XYZ 71.731 152.275 null] +>> endobj +2543 0 obj << +/D [2517 0 R /XYZ 268.677 139.324 null] +>> endobj +2544 0 obj << +/D [2517 0 R /XYZ 377.566 139.324 null] +>> endobj +2545 0 obj << +/D [2517 0 R /XYZ 76.712 108.44 null] +>> endobj +2516 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F27 800 0 R /F35 981 0 R /F60 1986 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2549 0 obj << +/Length 2396 +/Filter /FlateDecode +>> +stream +xڕY[��� ~ϯ0Ї��s4�{����v��E��(6�B��c%���%�_rHIcK�����8�C~��r��O�")"�����]�����H��0�Ƣyz~��������y��]WDn��<%�@���_���+��F�j�凲.[�/��z���y�YU���翿���(;�"������A,T�V�D�e8�n,<�UPѤ�$��'.'"���g�uَ�y�M�lQ���z�)�9�;�i��f~:}��?��kZ��M��{�4ۗ5R�p;�k���c�ۊ��Zܖ�:Ĕ%��^�Sf�n˼h�$/�t[���ź�^��ut�y��5��Vcl� ;�k����X!�nOԦy>��QN����U��*��㚦�hR�+�Uf Ѭ2�"�t��Ǣ�'*�־��A3��9/ +/�@�P�^d�~9���K�먠a@KXoB�u��_����lC�4� +�s18FU�5�gCñ�\7� p�쿡!�nF�Dr-����b`.�n�|��w-ѕ�U��|�NZ��z�+B�cx��1���uCm��C^^�*&�Q��3��qO���l�h�Q�SZV��<��>��h��Ϻ�J3��<��|g�!���>�8���@�']�vP@�����F \����A����(�录�dȧ%X`|��T@�ps�(v�����2��];��@�T����6'�N'7��N�g{�O[j�����A�Dèd�j�@$ʱ !��TL�;ĝ��:��`B��+l�`� �?*偹�j��Ӥ�k��� �M�X���XCU�s��P�]����<R�-��k�{�h��oʎ���mU�r��]+��@�h4J�-,��)2``�� !���>��2�a�͝�6���蚦5q�E�f�V�Ҷ� �N�00�s�Z@n�U�1�������ii*|��аgvh\3�]��4KD�I�@���k���ñ)e[��qe�h1�p�O��s��#n��pgC@6(=m5'���O�� 6/�H��$d#�)Ҏ�>��o�J+�@�� �{��g��p�+[�̐ߌn?��LE�H�KN���>��T�� �B�.��g24��1��Zeʮn�,Wx�_�-�#E����8�B��#&�SL@���l4��p>�l��\����G��1���T�a�"D�d82�-@��nJ���[i�,@ʗ�b�E.R�ŭʆgu��q%/���^�sjt����X:�%3�m_d��g���(�Ղ�#(b��(e[t��G�i��o;���&?��� +�<�C:-�?�0+�N��)��&͔4�� ��p?8�_��)�^�7 �3{R�F1�qr�f�`5�Y�W�]j �2��;9\�R*����s���������I7�I�&�M�����ۘ���]�����J��<d\��+hi��D��X��!�K�!H�u��Q��:m����g��7�p�r�r)'(.r��g5�f�$�X0 � �p��r�v���g�FO���u�4PULW���ϫ���eU�l�A�+1>S��t�ɘ���-�K����%=İۤT��CB� Ev�<�ӻ�\S�t�ʜ(HR,-�t������栤@�Aju��|T��/�vж4���f[]Qno���b�J�~��9��x�2�wkP�6��0h&���ȁd��t ���nyapu��C���O���>#�L�~4�P ��.�a/4��a�P���X��}|d��6�.`������L(����e�'� ��%��2⠇AY���\���_lT��K��7��dx������sx����$x5�%IW߂�cA���N|[�����sH��V��W`ss�\lڕy��ٓ�%��FɢŘdc�L&�������b_(wQ��4mY�>�-��gK�z�����w� �����"�CI�0g�$V���~�� +����XA��mv��XD���%M4W/�I�]�\��K�K�]�%�ixץ�筅���Y)>-�Q <y��r�W��A��D�������0�=4��'s�3<������"!yڥw��*���@�� ntЉ檃2�=�K��s�3��!]�|�l����7m0�\3Sܱ�\�]�E_�o�����\͵7BJN� �VHY4WBj��R��Ԃ�ː��SH=B]�C�<�,x��(�YPS��m��h������5�>�,K���E}����NS��MGu��� >nf�$y���2h3�Ƣ����5s%��a�$���x˒��\������߅D�Q��0�\��ܳ�\�}+̥ϭ`���I��P�-�T��W7]W'���]m�^�9��XF7Qn"����X��La����I<���~Vendstream +endobj +2548 0 obj << +/Type /Page +/Contents 2549 0 R +/Resources 2547 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +>> endobj +2550 0 obj << +/D [2548 0 R /XYZ 71.731 729.265 null] +>> endobj +2551 0 obj << +/D [2548 0 R /XYZ 89.664 708.344 null] +>> endobj +2552 0 obj << +/D [2548 0 R /XYZ 281.473 695.392 null] +>> endobj +2553 0 obj << +/D [2548 0 R /XYZ 71.731 688.254 null] +>> endobj +2554 0 obj << +/D [2548 0 R /XYZ 76.712 625.853 null] +>> endobj +2555 0 obj << +/D [2548 0 R /XYZ 89.664 607.92 null] +>> endobj +1195 0 obj << +/D [2548 0 R /XYZ 71.731 587.831 null] +>> endobj +450 0 obj << +/D [2548 0 R /XYZ 237.557 550.615 null] +>> endobj +2556 0 obj << +/D [2548 0 R /XYZ 71.731 543.263 null] +>> endobj +2557 0 obj << +/D [2548 0 R /XYZ 423.419 530.491 null] +>> endobj +2558 0 obj << +/D [2548 0 R /XYZ 460.496 530.491 null] +>> endobj +2559 0 obj << +/D [2548 0 R /XYZ 82.515 517.539 null] +>> endobj +2560 0 obj << +/D [2548 0 R /XYZ 479.607 517.539 null] +>> endobj +2561 0 obj << +/D [2548 0 R /XYZ 325.761 504.588 null] +>> endobj +2562 0 obj << +/D [2548 0 R /XYZ 71.731 489.48 null] +>> endobj +2563 0 obj << +/D [2548 0 R /XYZ 71.731 474.536 null] +>> endobj +2564 0 obj << +/D [2548 0 R /XYZ 206.855 465.036 null] +>> endobj +2565 0 obj << +/D [2548 0 R /XYZ 492.082 465.036 null] +>> endobj +2566 0 obj << +/D [2548 0 R /XYZ 150.917 453.38 null] +>> endobj +1196 0 obj << +/D [2548 0 R /XYZ 71.731 413.828 null] +>> endobj +454 0 obj << +/D [2548 0 R /XYZ 307.091 374.456 null] +>> endobj +2567 0 obj << +/D [2548 0 R /XYZ 71.731 367.103 null] +>> endobj +2568 0 obj << +/D [2548 0 R /XYZ 319.938 315.477 null] +>> endobj +2569 0 obj << +/D [2548 0 R /XYZ 71.731 302.426 null] +>> endobj +2570 0 obj << +/D [2548 0 R /XYZ 71.731 297.445 null] +>> endobj +2571 0 obj << +/D [2548 0 R /XYZ 81.694 274.63 null] +>> endobj +2572 0 obj << +/D [2548 0 R /XYZ 71.731 272.473 null] +>> endobj +2573 0 obj << +/D [2548 0 R /XYZ 71.731 272.473 null] +>> endobj +2574 0 obj << +/D [2548 0 R /XYZ 91.656 261.679 null] +>> endobj +2575 0 obj << +/D [2548 0 R /XYZ 120.717 261.679 null] +>> endobj +2576 0 obj << +/D [2548 0 R /XYZ 120.717 261.679 null] +>> endobj +2577 0 obj << +/D [2548 0 R /XYZ 147.218 261.679 null] +>> endobj +2578 0 obj << +/D [2548 0 R /XYZ 147.218 261.679 null] +>> endobj +2579 0 obj << +/D [2548 0 R /XYZ 222.137 261.679 null] +>> endobj +2580 0 obj << +/D [2548 0 R /XYZ 222.137 261.679 null] +>> endobj +2581 0 obj << +/D [2548 0 R /XYZ 71.731 260.239 null] +>> endobj +2582 0 obj << +/D [2548 0 R /XYZ 91.656 248.727 null] +>> endobj +2583 0 obj << +/D [2548 0 R /XYZ 135.691 248.727 null] +>> endobj +2584 0 obj << +/D [2548 0 R /XYZ 135.691 248.727 null] +>> endobj +2585 0 obj << +/D [2548 0 R /XYZ 215.989 248.727 null] +>> endobj +2586 0 obj << +/D [2548 0 R /XYZ 215.989 248.727 null] +>> endobj +2587 0 obj << +/D [2548 0 R /XYZ 76.712 230.795 null] +>> endobj +2588 0 obj << +/D [2548 0 R /XYZ 81.694 217.843 null] +>> endobj +2589 0 obj << +/D [2548 0 R /XYZ 92.483 217.843 null] +>> endobj +2590 0 obj << +/D [2548 0 R /XYZ 71.731 217.655 null] +>> endobj +2591 0 obj << +/D [2548 0 R /XYZ 71.731 217.655 null] +>> endobj +2592 0 obj << +/D [2548 0 R /XYZ 91.656 204.892 null] +>> endobj +2593 0 obj << +/D [2548 0 R /XYZ 71.731 202.735 null] +>> endobj +2594 0 obj << +/D [2548 0 R /XYZ 91.656 191.94 null] +>> endobj +2595 0 obj << +/D [2548 0 R /XYZ 135.691 191.94 null] +>> endobj +2596 0 obj << +/D [2548 0 R /XYZ 135.691 191.94 null] +>> endobj +2597 0 obj << +/D [2548 0 R /XYZ 76.712 174.007 null] +>> endobj +2598 0 obj << +/D [2548 0 R /XYZ 81.694 161.056 null] +>> endobj +2599 0 obj << +/D [2548 0 R /XYZ 92.483 161.056 null] +>> endobj +2600 0 obj << +/D [2548 0 R /XYZ 71.731 160.348 null] +>> endobj +2601 0 obj << +/D [2548 0 R /XYZ 71.731 160.348 null] +>> endobj +2602 0 obj << +/D [2548 0 R /XYZ 91.656 148.105 null] +>> endobj +2603 0 obj << +/D [2548 0 R /XYZ 71.731 145.948 null] +>> endobj +2604 0 obj << +/D [2548 0 R /XYZ 71.731 145.948 null] +>> endobj +2605 0 obj << +/D [2548 0 R /XYZ 101.619 135.153 null] +>> endobj +2606 0 obj << +/D [2548 0 R /XYZ 71.731 132.996 null] +>> endobj +2607 0 obj << +/D [2548 0 R /XYZ 101.619 122.202 null] +>> endobj +2608 0 obj << +/D [2548 0 R /XYZ 142.884 122.202 null] +>> endobj +2609 0 obj << +/D [2548 0 R /XYZ 142.884 122.202 null] +>> endobj +2610 0 obj << +/D [2548 0 R /XYZ 76.712 104.269 null] +>> endobj +2547 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2613 0 obj << +/Length 2388 +/Filter /FlateDecode +>> +stream +xڥYݏ�߿Bo��5O$E}\�n�^p��ȶ@�˃lӖ���Jr\�_�)ɒl�[,��p~�p>i��ǽ��X�G�LD�[�o3?<qK��$����Ӈ�Rz)K#�n�0X�^,K��^7����ٱ��b)T�+F�O�CQ �历^N���}����ǧ��v�J�,M���*b"I��X*�,M�Y��p� a2�#�؋��,�#�|B����L=��m���i�z'��Ut��s���\4���Tl�{�N�85�}��:�S�i��."X����.J�����%Yh&2��%�4d<���n��.�C�d������d�B�,��u}isԷRHC~_ +=�M)X�GR��=��}*��˩����W(�����Y�%�026�@���+�Ď$�k�"bI�Z��`��c�}ޱ����Y���hɶ#řR�]1���"�1���E̠�]��S���6U�݂'~;v%���7=�LX��6��ܴ K��&�h�mb�>�����l�SI��$�4���1�rKqȔ��)�d����!��rj<"w�����kn�o��>�00����6��e`�䁁͠=4���� �ߥ4�b��������4���L�+�|�4�J���q����J#�*��� hn*�%y�4S��J3E�(��������2�nF��_���Ր���7�c#]J��M^j��6���\�P�*�E{�N[��N���s�8r�]����� �"����6[�u�L�Y�B| ��v+Eٴ����O�v�VdKA��$aa4�a�r@d��32a�s=�y���B:� �թ�6� ��<��:��_ɡɫ�~Cb���� �)&�bZrR$dVV���_i�����B@��Q�M|^���j����嶛P�!k��ī~��FO�#��n<�Bt~|�"p4��D8cFx�_��v��!��>Q!X����.���Q�c�ppM�+`IH��_&� ���� +��t[�������74!M�� eo(��Q�v��=���-�lU�}�� �̱2z`F����Ķ�#�/%�ԥn�i\7G�. ��P�z����p������U�-fr�H@�t`,U��2�ai���ӄA4�M�f���Du�P���W�F����D��~���Z�.��*���}�'_������i��6w$'����:۪&+�ӑ0Hi���'l�����ר������W�n�荙B�҇��,�h ﶌ��5g�fM;o�����[�Fx܅�v���Z�=�4�����i�s����?$��x��^��.m�k�U�lih��K������Q�����o�#����'$�`2N=�R�e���O�<��������ǃ�Z� ��� ܮd2�8��!��� XGʓ�"�X�������%�,�#Z���v N�'/�56H�l^�p�(6��`�.̓�maG��n~�?mz��tб���/ԩusڛ ��F�M��1t{�� 8��6@����n_�ȃ܊A��:��������ʀA`������P!8�j���N�)Ă�~��.Bkhi��ylC�F)�Ml%�Kz��(�h��I�3��������x���p91��Cp��PZS�<H�@���<C9�đ��v��� +�WZ�\p�q��ۄ��������2��}Qپ���s����+�_W�c�2�6��.�� �)�&���frF@�����A���$c'�����Yl�@��屮����Y� �o��$f$� �kW�� �Ս�#SѡXl�W|0v����Դա����q���� Ez�s�aVE~��/�]h�3 +Z�id�g��dE��Hl��Z�z�fħEfnK�x�eն}B���/�T�pm�s���숺����"H�F0O�0���L����������M��x��BH��u!���|��2RgmU74��Jj����Q���$��[U�ѐ�5���zO-~��{���y.��5�N����63��U�o���7t.v*��I{m_i��(T��=�q��zy� ����$*ۥ��b�Z�s�D�7O�]�mx��R�8M]~v?N��!��ϩ�h��S�f�4b�J��@E:�� �-� + uM�V|#kClK@�$��������R �L�-�}�]�4�P�Ǒ~[4#�O#���0�"��� �i��B;Ձ�2��%�m����I�i�h]6�n�4G����:���Z�x�S�� e�)��by��m}�|X���P�Ք�f�%��eC8U43V݇���g�$VO&�0xF�G �G@G�M��G��C��E5f�G.&��.���?b���3�a�v|���'��t� ��cb +�����S��oNendstream +endobj +2612 0 obj << +/Type /Page +/Contents 2613 0 R +/Resources 2611 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +/Annots [ 2649 0 R 2650 0 R 2660 0 R 2664 0 R ] +>> endobj +2649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.453 486.473 417.051 495.063] +/Subtype /Link +/A << /S /GoTo /D (gloss-apache) >> +>> endobj +2650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.426 475.485 322.761 483.407] +/Subtype /Link +/A << /S /GoTo /D (http-apache) >> +>> endobj +2660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.086 297.962 228.112 306.444] +/Subtype /Link +/A << /S /GoTo /D (http) >> +>> endobj +2664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [119.979 113.683 172.283 120.537] +/Subtype /Link +/A << /S /GoTo /D (template-http-accept) >> +>> endobj +2614 0 obj << +/D [2612 0 R /XYZ 71.731 729.265 null] +>> endobj +2615 0 obj << +/D [2612 0 R /XYZ 91.656 708.344 null] +>> endobj +2616 0 obj << +/D [2612 0 R /XYZ 71.731 706.187 null] +>> endobj +2617 0 obj << +/D [2612 0 R /XYZ 71.731 706.187 null] +>> endobj +2618 0 obj << +/D [2612 0 R /XYZ 101.619 695.392 null] +>> endobj +2619 0 obj << +/D [2612 0 R /XYZ 71.731 693.235 null] +>> endobj +2620 0 obj << +/D [2612 0 R /XYZ 101.619 682.441 null] +>> endobj +2621 0 obj << +/D [2612 0 R /XYZ 145.653 682.441 null] +>> endobj +2622 0 obj << +/D [2612 0 R /XYZ 145.653 682.441 null] +>> endobj +2623 0 obj << +/D [2612 0 R /XYZ 177.534 682.441 null] +>> endobj +2624 0 obj << +/D [2612 0 R /XYZ 177.534 682.441 null] +>> endobj +2625 0 obj << +/D [2612 0 R /XYZ 209.414 682.441 null] +>> endobj +2626 0 obj << +/D [2612 0 R /XYZ 209.414 682.441 null] +>> endobj +2627 0 obj << +/D [2612 0 R /XYZ 241.294 682.441 null] +>> endobj +2628 0 obj << +/D [2612 0 R /XYZ 241.294 682.441 null] +>> endobj +2629 0 obj << +/D [2612 0 R /XYZ 76.712 664.508 null] +>> endobj +2630 0 obj << +/D [2612 0 R /XYZ 91.656 651.557 null] +>> endobj +2631 0 obj << +/D [2612 0 R /XYZ 71.731 649.4 null] +>> endobj +2632 0 obj << +/D [2612 0 R /XYZ 71.731 649.4 null] +>> endobj +2633 0 obj << +/D [2612 0 R /XYZ 101.619 638.605 null] +>> endobj +2634 0 obj << +/D [2612 0 R /XYZ 76.712 602.74 null] +>> endobj +2635 0 obj << +/D [2612 0 R /XYZ 81.694 589.788 null] +>> endobj +2636 0 obj << +/D [2612 0 R /XYZ 92.483 589.788 null] +>> endobj +2637 0 obj << +/D [2612 0 R /XYZ 71.731 588.381 null] +>> endobj +2638 0 obj << +/D [2612 0 R /XYZ 71.731 588.381 null] +>> endobj +2639 0 obj << +/D [2612 0 R /XYZ 91.656 576.837 null] +>> endobj +2640 0 obj << +/D [2612 0 R /XYZ 76.712 558.904 null] +>> endobj +2641 0 obj << +/D [2612 0 R /XYZ 81.694 545.953 null] +>> endobj +2642 0 obj << +/D [2612 0 R /XYZ 92.483 545.953 null] +>> endobj +2643 0 obj << +/D [2612 0 R /XYZ 71.731 544.545 null] +>> endobj +2644 0 obj << +/D [2612 0 R /XYZ 71.731 544.545 null] +>> endobj +2645 0 obj << +/D [2612 0 R /XYZ 91.656 533.001 null] +>> endobj +2646 0 obj << +/D [2612 0 R /XYZ 71.731 515.068 null] +>> endobj +2647 0 obj << +/D [2612 0 R /XYZ 71.731 500.125 null] +>> endobj +2648 0 obj << +/D [2612 0 R /XYZ 277.369 488.468 null] +>> endobj +2651 0 obj << +/D [2612 0 R /XYZ 71.731 448.917 null] +>> endobj +2652 0 obj << +/D [2612 0 R /XYZ 71.731 423.014 null] +>> endobj +2653 0 obj << +/D [2612 0 R /XYZ 315.219 410.062 null] +>> endobj +2654 0 obj << +/D [2612 0 R /XYZ 71.731 397.111 null] +>> endobj +2655 0 obj << +/D [2612 0 R /XYZ 89.166 397.111 null] +>> endobj +2656 0 obj << +/D [2612 0 R /XYZ 71.731 397.011 null] +>> endobj +2657 0 obj << +/D [2612 0 R /XYZ 118.555 361.46 null] +>> endobj +2658 0 obj << +/D [2612 0 R /XYZ 71.731 326.369 null] +>> endobj +2659 0 obj << +/D [2612 0 R /XYZ 71.731 306.444 null] +>> endobj +1197 0 obj << +/D [2612 0 R /XYZ 71.731 250.335 null] +>> endobj +458 0 obj << +/D [2612 0 R /XYZ 303.155 205.08 null] +>> endobj +2661 0 obj << +/D [2612 0 R /XYZ 71.731 192.909 null] +>> endobj +2662 0 obj << +/D [2612 0 R /XYZ 468.963 183.521 null] +>> endobj +2663 0 obj << +/D [2612 0 R /XYZ 71.731 150.48 null] +>> endobj +1198 0 obj << +/D [2612 0 R /XYZ 71.731 113.683 null] +>> endobj +2611 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R /F53 1676 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2667 0 obj << +/Length 3324 +/Filter /FlateDecode +>> +stream +xڝɒ����B�x����ع��K�RN�8�T�JQ$$1C4�'��>����lWj ��{7��9���b}��Rۋ�]^�svX��;W0��r\�|������K�4�w/�]�8v줻���$�v/ſ���Y;�n�B� +m����˦�^6}5�]��SYU���/z��e�;�c;M��%������;7�� B�;��N����v��8��q� �����9��Ngw���B:��:�?�q`e<��w]K�(�{/���ˎ���<�gFTx�kOp���xÌyڇ�%{U�U6�� W7o�]��ʰ7=�`��B��)zƬ���ބ���I������^׳Ӑ96��.+�@/M'�l�/x`��YQv*t���~��|;Y-�DZ�+<%�`�y0ber�nyP)�����U�k��:���p���H�~�ډ��{��w� |��SA;���V��u]Ȣ��z�S�)����:�*��`�YU����γ��)J��b� PgR���Te/�c�� +�r|�E��� �N�\��=�����[5��q��C�!�P]���PFt0C5��O����~��N��2x.=�^8���а����+�`�[�"0W���oH�PN��~����~h{����d6�����0]p��zN��=�k�����fb����kٶ�M��^ +�J�[o%ɉ.[7�U���1��Ď��x�q|�<��J�o�����#D��� R�{�� ��A=�I�o$J����/y=z�K#{ȥ�/�B�l���h�C ��SGR�)0��p�x]��s&X��A��1��a���mj2_P1qF^�Q̥��U����Ɨ=������:��M[l���Znm;T�ӑ��͇~��kى�ʍE�$�<B��B��!��Yua�_��B� +(3r��GP�\4�A�D�G��_��o�Kc���Nq +N90���L�xp1���>o�XG)��� ʓ�D����(\��c[<�1����C�����,(�P�9�V"?qtQb4���]ʜ}Y$^��d"��x��d�.J<��pD�z�`1�$���[�LJ��Mf5�B��(���B�fpT��L��9�M��-��L�� �/�A��ydž舍�66쇑�1�p�(���~I�`-��<ƛ@�,�!.d�S�]q��e�m�u���Yd;�>b�||!'M���)O�Fv�/��@f�v��q��/GH;Pn"@X��SҨ�$]Y(s�����E�b3�m�\f~Řa��kS�0�T,3�E�EͿ�t�y�ˉ��_�V�ߺr�.{$�=2y�g��@tR�[�˱��0��ND��$�������F��K4 fU���WP�p����a._�z��i�8K/�Ċ��H���,y�1��#D�1��y " +X�쿔�F�0s�(���ǎY!�D���`3�1�ۊ���l�a<��x�uLR��:bI�!c~e��FS���y�BBÔ06NHcD"VF���(��b�×�xNٌB����>���r]V}����E!��W\xj,6i���yV�U���l�T��`!�[B�R���7OjS�cF�H��� e��b�D D��x`���>��s]��|���e���_s-�hC�,-b0V�.-W6��kzP��oL�5���L�4㨟Na0�7Ť9k�@1W0��J�NU������#I9��){��Kj�&Rb;��gۣ��R.�OAu��ISL���}1�!�.6�5��k��yW`x#����}�cd�����X������^U�cd��x��b)d���ˉfj�Ԗ->��^�( PJ�B�L���;�+lZ��6�U�|�T=��W6%I���lj��z4����,;ך�(�R��(�-����� �� �";��?g� ��ЎR���^7OT�� +g\��H�=��u[V��uf��'&���⩚Ά�yʑ~{OW��T��Է�,;!`.C\/�NBFjY##H_��E�h�=B;Ķ��BϬb4���R���~n/�ū�0t*H�BK�����eȩ'MÔ/edsNaI^�`��Q��{��&&�|���]U��_{5���V�DE��zfWv�~o��hV-AXB��q����o!r��%��?1t?}DEW��(�rZ�ð�%?�����D�8l� {Pĝ��PW�у.����k���is`�uǚ�;7��Ij'p�1�m�k��'��o�W�x�Okلh4)`�+���c��V��ُ8�Vs A���Y� ���E� +,e�.�u �N��4&E�{����6��C�������K���'�pk�0}c<t�i���Gc� �=��ܑ ��:J� 7;n����^j$.R �ey�$��0�E7>f�l�PIW��bW�`-'L��l��l����e�E��G��йC�����v�v�y�q��0F��D��;����i��-���n����`Yl�����:�B:U������Hu{p �$�Ä����~�Ey��p�Y| +!ҰF���K�;}I�j.�"�yj����-�E�� +Q�4�>�:Cr25&�q8��da�K���w�2��tg��+��� 72�,�u%>�|?�9u�=��\� ���eB(Sҏ�YB<Ϲ���ǁ�TtGb�8��:��s:0_�2ξya�h�?ΐ��L�f=uRim���0-M�p���ܟ���)�=Ȯ�F:�����f;S�#��`�b���7Y�/7<�����; � +i�+)�'�L �;�/׃��Qcc�BP⊊�<�*4q���H 3bG�q�s$� Ks +���z�;m�ס&�R [4�Q�7��L ����R����y�Ͻ�J��3N��<]��z���2�Y3�������-M��sCQ�����G����ӛ�\5�hUc���]�m���㧴G��X������ԛGbA02�dx���ַpV�������]�M����F��"�g^�Dpo���+ ���w.Df3��o髣�C�֤����������� MJV����`��\�i2��X�R� `%Y�eZd���r�U"��Y%@f��9RK���o�?'ŵ8Xτ��B�6$)FU����x`g6DԸ��z�����^a���taA$ 'K�+Ί)��a������Y����Fq'�>_\)���mFL�PP�ͺ��������h�0�������USWJ&���/��?��?e"�|��S�S�/X��J�t츻�My�?)�$P�%n���03����L�A��C�AA��~���#w�:endstream +endobj +2666 0 obj << +/Type /Page +/Contents 2667 0 R +/Resources 2665 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +>> endobj +2668 0 obj << +/D [2666 0 R /XYZ 71.731 729.265 null] +>> endobj +462 0 obj << +/D [2666 0 R /XYZ 195.293 707.841 null] +>> endobj +2669 0 obj << +/D [2666 0 R /XYZ 71.731 700.488 null] +>> endobj +2670 0 obj << +/D [2666 0 R /XYZ 421.533 674.765 null] +>> endobj +2671 0 obj << +/D [2666 0 R /XYZ 412.022 661.813 null] +>> endobj +2672 0 obj << +/D [2666 0 R /XYZ 71.731 648.862 null] +>> endobj +2673 0 obj << +/D [2666 0 R /XYZ 227.3 648.862 null] +>> endobj +2674 0 obj << +/D [2666 0 R /XYZ 321.865 648.862 null] +>> endobj +2675 0 obj << +/D [2666 0 R /XYZ 180.472 635.911 null] +>> endobj +2676 0 obj << +/D [2666 0 R /XYZ 71.731 628.772 null] +>> endobj +2677 0 obj << +/D [2666 0 R /XYZ 380.048 617.978 null] +>> endobj +2678 0 obj << +/D [2666 0 R /XYZ 111.263 592.075 null] +>> endobj +2679 0 obj << +/D [2666 0 R /XYZ 71.731 584.937 null] +>> endobj +2680 0 obj << +/D [2666 0 R /XYZ 71.731 567.004 null] +>> endobj +2681 0 obj << +/D [2666 0 R /XYZ 419.612 556.209 null] +>> endobj +2682 0 obj << +/D [2666 0 R /XYZ 71.731 484.314 null] +>> endobj +2683 0 obj << +/D [2666 0 R /XYZ 71.731 432.508 null] +>> endobj +2684 0 obj << +/D [2666 0 R /XYZ 71.731 417.564 null] +>> endobj +2685 0 obj << +/D [2666 0 R /XYZ 294.824 408.065 null] +>> endobj +2686 0 obj << +/D [2666 0 R /XYZ 76.712 379.771 null] +>> endobj +2687 0 obj << +/D [2666 0 R /XYZ 71.731 359.846 null] +>> endobj +2688 0 obj << +/D [2666 0 R /XYZ 241.861 348.19 null] +>> endobj +2689 0 obj << +/D [2666 0 R /XYZ 130.032 336.533 null] +>> endobj +1199 0 obj << +/D [2666 0 R /XYZ 71.731 308.638 null] +>> endobj +466 0 obj << +/D [2666 0 R /XYZ 267.224 269.265 null] +>> endobj +2690 0 obj << +/D [2666 0 R /XYZ 71.731 259.123 null] +>> endobj +2691 0 obj << +/D [2666 0 R /XYZ 419.408 236.19 null] +>> endobj +2692 0 obj << +/D [2666 0 R /XYZ 71.731 203.149 null] +>> endobj +2693 0 obj << +/D [2666 0 R /XYZ 71.731 146.361 null] +>> endobj +2665 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2696 0 obj << +/Length 2875 +/Filter /FlateDecode +>> +stream +xڍk�۸�{~��(�2���iYAzEr�I��G��-�^Q�m�+��D����;�J����ACr8���p�/�e�����r?Z��m�*��a�ë�1��ppޭ_ݿ��Y���x��͒ � �eq��h�.��}{G-��"J/�����˦�`�l�4������ײ����뿼zXg�q���E�,�Q6�g�V~�$����Ԇ�8]yZ�G8>������>{� +�2�y�8Ѵ�ѷPL*�n�J�֢�����¶ﴪi�� �dUt7>����ԣ}�'q�E�g���N�'�B������,ρ�����P���E�9��Rˍmq��Ƚ�< +�^Ӏ�lx�}q~A�$���Z);�O��n����g�/�A�ܼ�˪ �����h��a�@�� #6[�3�]�`��e��Ʈƨ,���Шa{�^�/�^��04��FV{���Q�>�K� �ފ����Ө��<ʦ鲁h��4_��� ��<`���#�㰑�$�Q�=5j�`@Ihņ��g+��%FD��3P��4j�Qi��� B�(�W� +T�8����i|���≢ �8�4���; CWȠB��`�з�7u��@u�z[��D3�yP�۪�J���T�h +�x��)��WX�|�0��if�؊2�|P���[)"?1S�D~A�S��&���FG#LΦ��n�"+u�mwK��`�?ip��������y��w��j���9�����t]�p�|�@�3&]X�/3H�$s�g~���k<m�μ���cZN^�H�?bH䳪qC�y�~xD���y5R�bSV�>�q^�4)�Z���&�aN5���Ɛ6qm�6q�WA�����l��>��1 �;f����{Okp�e&�&g� q{$k0�N���0=v��ߏ��' �Uȵ�&����WȢ�z�&V�Ї����� /��B��0N���������w����.͝A��3F�,���Δl�+ �~�����O�SfR�y���iS$D.�V,`M>JO+k#+B���Rv��e�s�nI��1 �$gw��ӕ�J��Y���^�Wƪh��H.NL)� ACpxF�G���麯t��4���������}+�4O��R�B 37��!(�*��'C�=Ha��;fp�S0�(M��Vv��w�}ڵ�q���.�K�h��� �"iŅ�0T�o�L��V�rRQ +rc�� ;�M�\b�0�4��| Y�v��aq�����T��@��H��@H���2���}K�o�Dqr��{�6�(�<�+��t}�Q?�>��g��v���h�K��(7 �����Sp��̚��٦Bbc�H^{�Rտ�C�H}R]'���+��p��� ��TH�^^�\��\���~�� �V�Ő_nQ��KÒ:=��9q�w�i!���[U�1b4e�9�y��9� ��z��ܩ���`L�S�l������$"�ע}���@b�ұS=�h��*G��`V}53��JЈ�mgڶ4f��L!���ă:`v���ӌz:2i֝kH<H���1&����3����' +H�2��ƃ�R��O� W�JA�v���.C?�R�D[W����@z� �'�{�hϒ�2�� +��JוE~��e؍<:J�D��̌Z�k cf@��Kpw����R3�O���F������GC��;<z�E%�6�=��P��jZ-�4��L���(CJ��7D������-Y�!�z��QQ_���ӆ�= +�Ȓ1�g&Dwi�U�Ў���t���I�,�PUj�&�7��d���_:C�D~�GL��~��JB#����L�hBz'z��dw���tb�S��~/��� +��'�3�� * +I��ڥP�*�-%�PW.1Q�,!�`*M�KL����H�ׁy�m_��v��(�M"Q�"�^��w�Y�����ӥC��y����4��KQ���T����#;�m�L2#����n��~ř�+?XY��>��!�l�L��]�Lx&X��� +7����FT�(����K�A^�9���6+�U���!���$�?��^YDz2��Ť�K(%A(:�l�����ɼ�oD��4b��`�pC�v�9�9�dnʰ-O�M�^�x�J�ݺ��1�5!D�4ܲ��G���^ �O��T�Ϛ��z�V���S���oW����%]������U�<�p_�]��3n\8w֢�D��q���z� ���1���B������{p�./D^�z9��o{9�,r�<�<3�P� ���2��d� +B��a\Z�x���i.=��E��S�7٘��I��6��M��} +�3 WNZaE��t�jح ޭ�h`]n��_F�=>�:�h6�J�6�,¾�8�2��`�WngEف�W����r�RO�sO�EV>����t[�F�nd�d\�3��s�k]�|!�D�#a~)����7ص�=��t�j�epr�5 ��q��ފ��K�&��!x�R��M37~�e!�,��/����f�����U�mwy���"ɡj^�ҿ#\��_EN�F�P5���I8�l�:T����0�,!d�) +(�p +n����w�a�/z�}E���/,�������>A���e�\��۔ə��;�K�;O��z�w��������� =ؽ��$μE-�����l�4��c�ľ����>L�V� �X�a�Ha/��'<Ҳ�~u$ɝWg����bC��ߝ�U,8�2뮝��i)�25��6̴�7$�&,�C`��#���q�[�D��Ȣ�#��W.�������G������2�����k_���>�endstream +endobj +2695 0 obj << +/Type /Page +/Contents 2696 0 R +/Resources 2694 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +>> endobj +2697 0 obj << +/D [2695 0 R /XYZ 71.731 729.265 null] +>> endobj +2698 0 obj << +/D [2695 0 R /XYZ 71.731 718.306 null] +>> endobj +2699 0 obj << +/D [2695 0 R /XYZ 71.731 680.284 null] +>> endobj +2700 0 obj << +/D [2695 0 R /XYZ 71.731 665.34 null] +>> endobj +2701 0 obj << +/D [2695 0 R /XYZ 266.919 644.184 null] +>> endobj +1200 0 obj << +/D [2695 0 R /XYZ 71.731 616.289 null] +>> endobj +470 0 obj << +/D [2695 0 R /XYZ 234.314 576.917 null] +>> endobj +2702 0 obj << +/D [2695 0 R /XYZ 71.731 566.774 null] +>> endobj +2703 0 obj << +/D [2695 0 R /XYZ 399.839 543.841 null] +>> endobj +2704 0 obj << +/D [2695 0 R /XYZ 71.731 523.751 null] +>> endobj +2705 0 obj << +/D [2695 0 R /XYZ 71.731 492.867 null] +>> endobj +2706 0 obj << +/D [2695 0 R /XYZ 71.731 449.031 null] +>> endobj +2707 0 obj << +/D [2695 0 R /XYZ 71.731 431.098 null] +>> endobj +2708 0 obj << +/D [2695 0 R /XYZ 429.295 420.304 null] +>> endobj +2709 0 obj << +/D [2695 0 R /XYZ 86.135 407.352 null] +>> endobj +2710 0 obj << +/D [2695 0 R /XYZ 71.731 387.263 null] +>> endobj +2711 0 obj << +/D [2695 0 R /XYZ 154.754 376.468 null] +>> endobj +2712 0 obj << +/D [2695 0 R /XYZ 102.167 363.517 null] +>> endobj +1201 0 obj << +/D [2695 0 R /XYZ 71.731 357.128 null] +>> endobj +474 0 obj << +/D [2695 0 R /XYZ 251.73 319.163 null] +>> endobj +2713 0 obj << +/D [2695 0 R /XYZ 71.731 309.02 null] +>> endobj +2714 0 obj << +/D [2695 0 R /XYZ 71.731 291.9 null] +>> endobj +2715 0 obj << +/D [2695 0 R /XYZ 71.731 291.9 null] +>> endobj +2716 0 obj << +/D [2695 0 R /XYZ 71.731 273.968 null] +>> endobj +2717 0 obj << +/D [2695 0 R /XYZ 71.731 273.968 null] +>> endobj +2718 0 obj << +/D [2695 0 R /XYZ 71.731 230.132 null] +>> endobj +2719 0 obj << +/D [2695 0 R /XYZ 71.731 230.132 null] +>> endobj +2720 0 obj << +/D [2695 0 R /XYZ 71.731 173.345 null] +>> endobj +2721 0 obj << +/D [2695 0 R /XYZ 71.731 173.345 null] +>> endobj +2722 0 obj << +/D [2695 0 R /XYZ 71.731 142.461 null] +>> endobj +2723 0 obj << +/D [2695 0 R /XYZ 71.731 142.461 null] +>> endobj +2694 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R /F35 981 0 R /F32 807 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2726 0 obj << +/Length 2740 +/Filter /FlateDecode +>> +stream +xڕi�۸�{~��b�2��:�n��M���E�-�6K4$j��_߹(�G�x�3��p:�E�ϊ8,R�$�0ɳY�<�f[���X(��~B�����M��V�*Og��2��"Z͊4 �,�=�;up���'Yd!�iMx�n�b�����������ߟ�~egi�����y�k���~~�Q��%���'Q0l�n���t�/S+�( +k��k@���Z�I��8�´(A��v������7 �N3⠶ ���h#DG�X!����~X7� l�a�T�� 2��j�ZN���$�U#\d���Q�nf�~��+9�^W�E��(���e���wTq;m:I0)�#�%C[=R�KL�:�Ɂg#,v�$��Q�t��֮6�C�+������K��^Aжߍj�A"�DL��H���ݱ3�l��81X�DT[�㵪>3�*��y,M�'���*�(�"����.���3�E�� +�Rk�O&!�F4� +(Q��料WF�Tv�'{X=��D�������t~��E�v��G; P��gF����;�����z�]�8ϳ��y��p��2u;_��ζ�n#�0����"B����Y���h!b�A�ot�:�:S��eѣ���;V_a�r� P�lg��#����,=��"H�f� �.��T�d��/;�%G?��F���vB +;{���[pۍ��0m��m/�V!�OCeE�R� �%��(�0I ��W��<,2OqK�mHM�š��B�0���8-���ct�GeШGF ]|@9��2�q*�"c9�A��y����'!e�;�_*�j�����8�֬$GI1��#Un�0 pR ]�;�hU혖.`�,����1��$GS�f�OgO؝a^%^��/�Z��x��V�G�x�/4 j��Z�:�O(�Q�d�<�����<�!�7���z��Z��p� =n[ʔ�02��V�qx��a�%��Q�A�IG!#ŭ�|�p��L����^_�F?���a�5��#����RFc�,c@���@A����U�0{�#��LP�O��������y�A��א�F.�x�<�w��s!b+���Rb�3����ݭ��X��BKwY��v05m +���`T����D�cW���s�g��,b�"�j���3j�5�;��w��d���)�=�K.�`Ӎ��a�c2�KE���4GZ�STn��FVk0�H��p��f%�����*�4��%[`��c]����L�fa�����^�kBV��2�>���/�i��6�4�|����ڳ9Ɣp#T�y�I�Dī�+�a�E�R�&���J�D����?H�����p�$�?|�.4���,�q�<S��f�B��˃o�g`��3`Ϣ$\f��uz�1>Y���ߖ�r���ʢ0Or�\�Y�)���^��Z��$��tP�Y��B�����+VP��5c$�덕O_��4�BV�4���Epх�ތ7FX�Rʋ弄Yf!8�y3�P���hR�Pc�yڡY��At'���F��R:�`�=}�(�: �V=T�<���)�'��$�� +�S@@��kǂ�(]~���ԏ+�l3:ם(��-�Z3�6Ԭ�<W������J!�d�I+������#��S}J�}����e���@�V�����|.�}�E��o�gTİE�G���!%M��2,�`;����u^}w�˘cI +����Hu����}^�^"��E��*P�o�T73թdS?zpUٮ��+�{�q�jC����yoЈ��'�^��\w��*��&c����>�y���rp�%��<^�.�H�G���}�������\�6��{�pi���k�G������fk/�u�a�ϸ���z��+��'���k�7P<Ԍ����$��/� �7J��G��p|�K�L�©G�jK4�c��Ϟ�K��x q�비A����ݯ(���E?����R�����Ap����u��<����?�;nx�����91��ȹ��堔��<�o<\s�D�%Oaq5>:��A��1�"\Ju��Ar�P}�n-��G�:؞�jP��@��8�K�SP�t=�zu�\{��H�s��ќ�,���Q<�e�ɴ���#<PX� 0��lB�L��^P����hB� JX���ûO�1���/_�{`�N�Zw\�b�P$��|�rT�MU��!y��U�ZS&Y%�P����'&A��I`h��A}H.�l�)�s��=�����LE�p��N֒�B��;v���y�ӓ�IM�aE�_sv�]�S%m:jT`��+�i�8�T��uZ�ê��ڽU5���[���W*樇�o[~�@��<SP�w�)1�9��rC8���|A7�va��O6t��O��t�ٸ= +nJr$ꋊ�ʈϥ +Ja�S��4��/���vy���2*F�Ux�q��@,Ǐ���g����*�'Y!�7-�G��������z>N���V� +�;֔� d7P\r%�,���̻�C�ժĔ[�B%��/x���)��5�}�AuP}���H�T̶��4x�'�K��Ѵk@�S�0 �݁s��<� +�� +� .��H���%����^���g&�N���^^��)d����y��FЍ�,��C�����˫���ڶ?��u��_�[~�^�r��a��H|#�rY9��N~j[�a��A�Dr�{b�a��\�J��[�^��/a��endstream +endobj +2725 0 obj << +/Type /Page +/Contents 2726 0 R +/Resources 2724 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2546 0 R +>> endobj +2727 0 obj << +/D [2725 0 R /XYZ 71.731 729.265 null] +>> endobj +2728 0 obj << +/D [2725 0 R /XYZ 71.731 741.22 null] +>> endobj +2729 0 obj << +/D [2725 0 R /XYZ 71.731 718.306 null] +>> endobj +2730 0 obj << +/D [2725 0 R /XYZ 71.731 718.306 null] +>> endobj +2731 0 obj << +/D [2725 0 R /XYZ 71.731 649.4 null] +>> endobj +2732 0 obj << +/D [2725 0 R /XYZ 71.731 649.4 null] +>> endobj +2733 0 obj << +/D [2725 0 R /XYZ 208.705 638.605 null] +>> endobj +2734 0 obj << +/D [2725 0 R /XYZ 119.701 586.8 null] +>> endobj +2735 0 obj << +/D [2725 0 R /XYZ 71.731 579.661 null] +>> endobj +2736 0 obj << +/D [2725 0 R /XYZ 262.962 568.867 null] +>> endobj +2737 0 obj << +/D [2725 0 R /XYZ 71.731 555.915 null] +>> endobj +2738 0 obj << +/D [2725 0 R /XYZ 230.076 555.915 null] +>> endobj +2739 0 obj << +/D [2725 0 R /XYZ 418.17 555.915 null] +>> endobj +2740 0 obj << +/D [2725 0 R /XYZ 122.357 542.964 null] +>> endobj +2741 0 obj << +/D [2725 0 R /XYZ 71.731 522.874 null] +>> endobj +2742 0 obj << +/D [2725 0 R /XYZ 188.071 512.08 null] +>> endobj +2743 0 obj << +/D [2725 0 R /XYZ 71.731 479.039 null] +>> endobj +2744 0 obj << +/D [2725 0 R /XYZ 71.731 456.125 null] +>> endobj +2745 0 obj << +/D [2725 0 R /XYZ 71.731 411.592 null] +>> endobj +2746 0 obj << +/D [2725 0 R /XYZ 71.731 369.116 null] +>> endobj +1202 0 obj << +/D [2725 0 R /XYZ 71.731 327.507 null] +>> endobj +478 0 obj << +/D [2725 0 R /XYZ 461.484 290.291 null] +>> endobj +2747 0 obj << +/D [2725 0 R /XYZ 71.731 279.926 null] +>> endobj +2748 0 obj << +/D [2725 0 R /XYZ 238.956 231.313 null] +>> endobj +2749 0 obj << +/D [2725 0 R /XYZ 71.731 211.223 null] +>> endobj +2750 0 obj << +/D [2725 0 R /XYZ 326.858 200.428 null] +>> endobj +2751 0 obj << +/D [2725 0 R /XYZ 117.651 187.477 null] +>> endobj +2752 0 obj << +/D [2725 0 R /XYZ 71.731 174.526 null] +>> endobj +2753 0 obj << +/D [2725 0 R /XYZ 294.096 174.526 null] +>> endobj +1203 0 obj << +/D [2725 0 R /XYZ 71.731 157.425 null] +>> endobj +2724 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2756 0 obj << +/Length 2545 +/Filter /FlateDecode +>> +stream +xڥk����� +c{Hl`��z�R�n�P i �$h����%�(���d�q�K��B��p8�7i5��O�R�!|��$�,����-�|}��b)$� ����Oa8[y�$�=of��{����a�eq0{.~����3�b��<�������:��j˨�~����mY��/��ܽ~����[e�G�h��J�@�(�pN?��(#�b/C��%Ea�?7��v��s����w]����Q�*zq͒U���~�ş �7����8��j���*��f�����?[& L%��k���r�f�����$��(A�����86�@���ȟ�B���x��YF�|�2���V���)�x�Y�X�a0ߐ�tj�vu_<�\^W��5�7��}�N��ݛ���<��d�c/�A�.\���}� +F�^@�F%'C� fUw"^��Ƞ4����FP�Kb>d.�W�7H`�q�z��k��>�Y��@o2#�I5oѡ.�x�Q�h��T��oe7�9��oqh) +���9�'�T9�R��v7�,D�`GBLO���HH�Y�����S�B��A����$����dT�ZQ�qBVI�W�,��<S+"XҩJ/�G���&a�'#* +}/�P�?�=�M�[0�fzJ����d�4�lZ�]YRP��t���)�bھ����;;��\��jޔ5j�h�{`4Y(�R;wډ�f� cW%��90�#�u�J�`�vڊ��bS����e`�Xс9�}�&<^�q�gsw�ڱ�x� �La����4L[W�98w���E�S��m�;�I@��Kƿ�!�#�Z8Qv�/L[������y���.������R��ss��i�J�Vd�0I��'��cPJ�؎�F�#C2'L1ا+���8�2��S� �b�$�7MSM%<;A[!;���%2�A� !�^�c�n���d%]���]���`)��EPƠ'�E�c ����{��!{�]��v�Ec�ǹ\*<w& � �y] h +�v����P��ִ�0�Z�1�<��Z< �+e;���tG-�Cw�L}`N F�V�Ԯ���)4�xcXPJ���G�;2���T��7Np���Eky<�L~ ��@����c즯rj�������0�a|�+� ��l����o_�Z2�dMY���>�*^>M� +U�������:>l����xQ��ڦ�,%]ȕzQ(l��s��!�s0���h4�Sr��Bh����������{��l�5� 5A0��à+ �z�}ۚ�! +x�]�f�\�KV� +���3/"M�?pp��c�bK�c +��a�� +8q�hj� +%�Ec2��Z�鹨��c1�Ώ�E$I&�dr�yL:c�|`��.���P�P�o�|E�&Lc�l7Գ�(�f�2���Q:)u��2_J!�#S|Ȍ�I���8�`�[^Y0�3�SdzCg�0��H�>�Ef��hlg���lH;��7e�_CR�g��S IXw��X���nԯ!a3)�����r|#h����ж�k'���s��6���I�ʀPi�4�w��X�fK�&��CY,�����Lԇ +,�j����A�����x7�g쀑���cƘw�}A��,�<���8���E/7��iԗ�S*����:c-���TDdo�����PUڶR��5[�B ���e׀ ��͇,P�Ɲ'���k4oO� +H�P��aԶ����x���Hdhp��1�����J��g�[�01�2��`-�{M�5�A�p>���"4�a�Y 7_��y�$ߏ���'���%;�%�6�9�,����ax䕽�+��B:���iw\�<�aN�U�H�x�!O�i]����Y�����I&?I�&����,�pba�f$�����B�XajPX +�L2��E��e�Z���D����>�L%"���V���nw��r�DQN�̨}u�6��]<���VuC��놻T�mϳ��r���n��R)������{M��7�쏂��w9�遚����6N��-@�1�4�x���t{�pl%�TH�Ҳ6*RL�҆�����Թ�����wC�z����`����>��z�W@���]0��`J���0)}@���G�x�������e�:��˺~+ɒr���|7� ��l&m�d{���;[��F�mZ�݅x��g6��u�����?.���"N�Z�Ɇ��F6��h)Z��a�S�p9(�`I�>�}���/�4�H4��/��$F+[vmod�z���+T�����\l*Y"�Ux��8��[��ԋ-=������i��Y[��n��)�����U��wS���c���W� �����w�ƫ�ڹ�չ!���@�?���&��EdJg��w��d���w=��C?��ɝ�O�G���L��a��0xC�<�1����<���N���)��A�@�l���3}SJ�_���?L����u��m�?�tʦ���<���>�|���(�2�~�g��կLq�y~00A!��C?]��_ܙ�&endstream +endobj +2755 0 obj << +/Type /Page +/Contents 2756 0 R +/Resources 2754 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +>> endobj +2757 0 obj << +/D [2755 0 R /XYZ 71.731 729.265 null] +>> endobj +482 0 obj << +/D [2755 0 R /XYZ 388.991 705.748 null] +>> endobj +2758 0 obj << +/D [2755 0 R /XYZ 71.731 701.917 null] +>> endobj +2759 0 obj << +/D [2755 0 R /XYZ 118.555 659.727 null] +>> endobj +2760 0 obj << +/D [2755 0 R /XYZ 71.731 555.34 null] +>> endobj +2761 0 obj << +/D [2755 0 R /XYZ 395.22 529.537 null] +>> endobj +2762 0 obj << +/D [2755 0 R /XYZ 109.161 516.585 null] +>> endobj +2763 0 obj << +/D [2755 0 R /XYZ 71.731 496.496 null] +>> endobj +2764 0 obj << +/D [2755 0 R /XYZ 71.731 447.679 null] +>> endobj +2765 0 obj << +/D [2755 0 R /XYZ 71.731 373.158 null] +>> endobj +2766 0 obj << +/D [2755 0 R /XYZ 71.731 318.428 null] +>> endobj +2767 0 obj << +/D [2755 0 R /XYZ 71.731 254.603 null] +>> endobj +2768 0 obj << +/D [2755 0 R /XYZ 71.731 117.582 null] +>> endobj +2754 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2772 0 obj << +/Length 2445 +/Filter /FlateDecode +>> +stream +xڥi�+���� +#��XkGsO�//�k�A�m�"/(d[^Ov���6N����"5�ÞE[,CQIQ�$˕rIy�q��j��9�'��˝d�-�l4o��y�*I��+�qD�$��sE���Ï��O�ju�ٺ��}?;�i�6�O�'B��6r��[�ej���Ww_<��/I�-�gi����Q?)}E�ȉ���F��N��H��Ӯ���S��4�lC�Y�i���� ~x/=���U�U��2��xH�G�W[W +��VJ���/31ć��1��q�>��ӄҿ���o�G��]�dĩ�mWD$�x�cB�o3㌔�Y����kܯ��L<�s�����]W$����6���nԙ���Z��X���Y�%���N��ݟT�'K�:-�=���:;��H��:e�f�p�uӌ����-���� 7�nap2�gB�*..�s(`�@SJ +���f����-|ظ����ৄfs �ҿl$l��zG��ek���>��|�{�6.`��k�Z�)j@�D�FH��w8S�!=v�w�A��ELU6M��4a�Dh�P�n�i"+�g¦9�(�!G�N +�V=|�u���^�� 3/L|Z��јn��^e�>�F�����䓬|��̺�h�¢@x2bbA"�<��s��f�H�j�KOD�;��*>I��>{��,ʜ��4�]�s/�`v*����H�,>a�<��?���_����*�����nN=p��Q.D����UO�:��04q ߯MP���;�i��f��% �����i�����'gu�����/wH�C���,�HoU������o{N�]�8N�x�ZC�Yl�6p.��=�/1h*�� ϑ���5B:�6>ض.� +�rP|z'�J�]�@钡�ج��a��&Z�z^�����#�����Й�U]�1CZ� ����Tv&�`f����]E�3��� %F�Nay�9��wu����v����DR��NQ��֣�C~��V���G|�t#h��8�� +֕/isb%}A��������r)b{�/��A� �SR'Y�11��&zeA'�xb�+2/�P\Z4���cmb��F^Ό�x�-���j������#�8����?�o9��}�9��H �����l��#�����)��52ǜٞ��]�h�Ph{����Ȥ 3E�le�Is=�A�=�v<��<�u��'ͬ9K2_��o2�F�8H[��g�`�Y&���F��W:�FC�Q��U�W��-�L�#2Ij�4��.� +"���AW�80M�Y_q���GcC�f�r�����zKׇ������0���]7� *l���%ׄ��C&�H����Ep�(Q~Z��W����4e=�1�ʴh�ZSo��- �e;_hnٙ)^��\��v���y }���ͬa��w�; j��O��[i�i_�.���-�5�WO���2ۈ��Z���@�#���Qi����aiѴ��L6����r�Ƒ�ލ�"��f�U�lp�r&+N���ɺyԼdQ�����M߲~���m2�Y��K!���3ɢ6��tM�����IN��E3Ͳ� #~m��:L���-���A3 Jso�\��� {�e��b��J[�od�V�;*�7\8 + �ђ�,͢�SFW��� ����3Ͳ� �!��l��=�M_ +��t����=��1S�YUe���J��� ���J��6s͂;�U�Ւ�,ɒ�6W|��I���ޢd&Y�<f3t�,�cwT�~8�`` � +kEC.O��r�Pi�v����O@���L��c�}O�"@'JO�����˫ �^�\=�)���5:A_������e�LK�e�},>�v��^iz��8yS�ζVl�"�e�C>9ӈ���E�k�gc�A�Z�C�pa���.��65�x�͍���i�w�n�VƎ%�G>��ž6��X���@Z3עË��|����J3���ɑ�����o\!C�^y��S������0"�v�}�j#@^;�o���Bk��Fd3ot@��x��[��Rn�Z���KK��Ƭ$&���g��Y�ѤOE�.�WVU�����*PWu�T�dԌ~�ȩ��߾��� 8S�~�$���v���ޚK��[1���)����ɐ0�o{��J6�>����qC��Yh4ѝ�c:2��uZ�^�Z_E���4�$��"�S��<�4�^��32Ƹ��!ge�Ӟabp�jx 3�Xn��S��譽�Hh���j�C{�����hq-�O'�Чa�7A�� ��|`��<{����3�/?���H�!'`B�s�=#��<-,80� �%Q�`�(�c�tYލ���ܪ���\Q���K��wp���E,�Ż�d�c���q-��On�\8���n[endstream +endobj +2771 0 obj << +/Type /Page +/Contents 2772 0 R +/Resources 2770 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +/Annots [ 2789 0 R 2792 0 R 2795 0 R ] +>> endobj +2789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.14 284.979 192.328 293.89] +/Subtype /Link +/A << /S /GoTo /D (upgrade-cvs) >> +>> endobj +2792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.157 267.046 254.345 275.957] +/Subtype /Link +/A << /S /GoTo /D (upgrade-tarball) >> +>> endobj +2795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.225 249.113 265.413 258.025] +/Subtype /Link +/A << /S /GoTo /D (upgrade-patches) >> +>> endobj +2773 0 obj << +/D [2771 0 R /XYZ 71.731 729.265 null] +>> endobj +2774 0 obj << +/D [2771 0 R /XYZ 71.731 572.09 null] +>> endobj +2775 0 obj << +/D [2771 0 R /XYZ 242.937 561.295 null] +>> endobj +2776 0 obj << +/D [2771 0 R /XYZ 410.176 561.295 null] +>> endobj +1204 0 obj << +/D [2771 0 R /XYZ 71.731 541.206 null] +>> endobj +486 0 obj << +/D [2771 0 R /XYZ 331.698 498.108 null] +>> endobj +2777 0 obj << +/D [2771 0 R /XYZ 71.731 494.278 null] +>> endobj +2778 0 obj << +/D [2771 0 R /XYZ 118.555 452.087 null] +>> endobj +2779 0 obj << +/D [2771 0 R /XYZ 71.731 398.498 null] +>> endobj +2780 0 obj << +/D [2771 0 R /XYZ 71.731 376.635 null] +>> endobj +2781 0 obj << +/D [2771 0 R /XYZ 71.731 371.654 null] +>> endobj +2782 0 obj << +/D [2771 0 R /XYZ 81.694 350.896 null] +>> endobj +2783 0 obj << +/D [2771 0 R /XYZ 71.731 348.74 null] +>> endobj +2784 0 obj << +/D [2771 0 R /XYZ 81.694 332.964 null] +>> endobj +2785 0 obj << +/D [2771 0 R /XYZ 71.731 325.826 null] +>> endobj +2786 0 obj << +/D [2771 0 R /XYZ 71.731 312.874 null] +>> endobj +2787 0 obj << +/D [2771 0 R /XYZ 71.731 307.893 null] +>> endobj +2788 0 obj << +/D [2771 0 R /XYZ 89.664 287.136 null] +>> endobj +2790 0 obj << +/D [2771 0 R /XYZ 71.731 284.979 null] +>> endobj +2791 0 obj << +/D [2771 0 R /XYZ 89.664 269.203 null] +>> endobj +2793 0 obj << +/D [2771 0 R /XYZ 71.731 267.046 null] +>> endobj +2794 0 obj << +/D [2771 0 R /XYZ 89.664 251.27 null] +>> endobj +2796 0 obj << +/D [2771 0 R /XYZ 71.731 244.132 null] +>> endobj +2797 0 obj << +/D [2771 0 R /XYZ 71.731 215.305 null] +>> endobj +2798 0 obj << +/D [2771 0 R /XYZ 71.731 182.364 null] +>> endobj +2770 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2801 0 obj << +/Length 2062 +/Filter /FlateDecode +>> +stream +xڥko�6�{~�?� ĴD��|��E��bq��}a!K��;YԊT����g(˱�.����8/2��βPd22Mf��.���˷w!c,e9�y��[�3�f���h���� Y�ϲH�u"g�����C�Y�/�2 扠�Mu�����n�z;,���Ϻi�����ٌ��(�:zU<�s%����y5����؉�9��2ʢ�Z������5��ni���!F���.z�y�kk����;���X��]UX����i|D��7#})�THA�Q̮ץ���9Ja #��yThD0�2�"�蝎�E�*PH�u�D��Dʼn��_Β"%EhA�V-d2?Ѣ�uk�s�UEpݿ��w��T�[A��C�od�E��Y��V���Lv�yh�QZ�G�����&��Iݖ=�k�O<H� ݾ/��=1Q�8�(0�<LY�{Z)Sv����y"�35�`�0��;�] MQM�e�(<8:;�3t�>s_��)6Fӷ�j�%(�����q��uk,H\�����0�2@�'�5�T�!�E`�@�Ǣ_�N�����v8��e �!D`��.Al��̸��K����h��D�Ivq��C��Ͱ5���e�2��C�s� γ+���=c��ua�`��Y 8��u�:�ߐ�9�-C�t?]��`j�u^��ϏA��HÜ�r�2Q����8��%(�:���-�ҙׅ�3�^����� O�N�������4@A�7�|�aɬ�-�-������#��:"!�VP.�z�8p���1:\��E +E��PI�&EC�R����I�d��)�#�)����aA�����3�V��}�dφ�Z�^�oŶ�X�!%(R��(��X�=H�$sq��,����K�>=��U�AȎ,�s��{2�KQ����A�����G������qp��b ��Piv,�`�{ZN��O�yp3ą�A�mw�͓'�hrԆ�+j��RIC�"@W�Q�sv�p-��O�|<��d���� ��N#s�� ;[�� ���r�M Y3^S�-��+BM&��B�,gk��i�ʯ���c/x1���|�GC������d�z�w��0��~��CgT�� )�?�n��z0�8���}��+'d�� �Ǵ�(wP�N���U����42�� #~����ht~������oy��|��f)?��G���g��<��F١]s�"M7 ��P��yq�@X5��T�4+����B�a��<������T��Ԯ�r� I{ �3=V�#q�v�y$�8�Eq!�c�����߃YM����/�Nw���"0P(�<��j������#!�,�D��J��"^vMaɲ`7 ��|��faW�x֑�Y�"H(���떮R�2\�"�d�5Z�3gL�%��R������H&z��` m����d@7��$nd_�' D�z쭂�� ����4��۔�D����(��c�G)���;�j��t�� ���d���x>�%<9��d�q��=a�ŋ�����r�P�v�4O�nP]g����+��n��"��"�U�5��D"��n|�p����i�[�-�Kkh�wH���V���yˤ��oA����.`�wّՍP�p�̽:�ߺ��� ��ՁCH�S�p��*�m���\7p��|�__q�h����c}�1H�MCu�̜%)RI����LDHv��e�3v�,Cȝ��:0Q���]r8��"�_��f"�1>'�̸]�i5q<�n�z�G�ț�\j��@f��� t'��A�e~v�g�����S�]�|��0S"6wŒ_5����E���f�Z��ƃ\qO ��t �8Jp����9Fl�r'g�'�2� aQ7x}�yq����@���/FŢ�B�dA� ���o4�yfBjsqVA� +|0�K(���{�p^a�y�� ^|���Ž����|��V.j��kb?� ��`g��� +���[l.Wݰ]���jݘ�yb�/mp>b�����o��Z����3���h"��JO�M��^9�9�"��Mendstream +endobj +2800 0 obj << +/Type /Page +/Contents 2801 0 R +/Resources 2799 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +>> endobj +2802 0 obj << +/D [2800 0 R /XYZ 71.731 729.265 null] +>> endobj +2803 0 obj << +/D [2800 0 R /XYZ 71.731 718.306 null] +>> endobj +2804 0 obj << +/D [2800 0 R /XYZ 71.731 675.303 null] +>> endobj +2805 0 obj << +/D [2800 0 R /XYZ 329.032 664.508 null] +>> endobj +1302 0 obj << +/D [2800 0 R /XYZ 71.731 649.4 null] +>> endobj +2806 0 obj << +/D [2800 0 R /XYZ 71.731 611.676 null] +>> endobj +2807 0 obj << +/D [2800 0 R /XYZ 222.086 578.73 null] +>> endobj +2808 0 obj << +/D [2800 0 R /XYZ 71.731 561.629 null] +>> endobj +2809 0 obj << +/D [2800 0 R /XYZ 71.731 494.645 null] +>> endobj +2810 0 obj << +/D [2800 0 R /XYZ 104.01 482.989 null] +>> endobj +2811 0 obj << +/D [2800 0 R /XYZ 104.01 471.333 null] +>> endobj +2812 0 obj << +/D [2800 0 R /XYZ 147.048 448.02 null] +>> endobj +2813 0 obj << +/D [2800 0 R /XYZ 104.01 436.364 null] +>> endobj +2814 0 obj << +/D [2800 0 R /XYZ 71.731 361.445 null] +>> endobj +2815 0 obj << +/D [2800 0 R /XYZ 71.731 361.445 null] +>> endobj +2816 0 obj << +/D [2800 0 R /XYZ 98.63 325.893 null] +>> endobj +2817 0 obj << +/D [2800 0 R /XYZ 206.266 314.416 null] +>> endobj +2818 0 obj << +/D [2800 0 R /XYZ 313.253 314.416 null] +>> endobj +2819 0 obj << +/D [2800 0 R /XYZ 71.731 279.146 null] +>> endobj +2820 0 obj << +/D [2800 0 R /XYZ 71.731 259.221 null] +>> endobj +2821 0 obj << +/D [2800 0 R /XYZ 201.17 252.626 null] +>> endobj +1303 0 obj << +/D [2800 0 R /XYZ 71.731 193.846 null] +>> endobj +2822 0 obj << +/D [2800 0 R /XYZ 71.731 148.985 null] +>> endobj +2823 0 obj << +/D [2800 0 R /XYZ 71.731 117.966 null] +>> endobj +2824 0 obj << +/D [2800 0 R /XYZ 104.01 108.467 null] +>> endobj +2825 0 obj << +/D [2800 0 R /XYZ 104.01 96.81 null] +>> endobj +2799 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F23 793 0 R /F44 1379 0 R /F55 1744 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2828 0 obj << +/Length 1748 +/Filter /FlateDecode +>> +stream +xڵ]��6��~E�Œ����C7l��0]�q�ږg˗��~�(;Nr�^�9Q�D�e��ᏯΒ��1G����W��p��Ƒl4/oo���*cY�n����Y�g�$,���x�}w��)��FD�1_�j��x�V�z9��W}Pu-�on�yu;뎂�ei�y͕}��J��훶�,Ck�/��F��ľ��FS�����ՆsG�e����E"سH2�E#{����ݞ��H������{L0 cՇk�'��Ƥv����f��'a�ݠ*���|�Y��aOF-�w�L?��|�u�]�����G:�1 +:R��vұ�u.�\[W�U������䳕n�k�4��� +?ߍ� e6w�Gs>c�}u���BaB���b<�9]D��m�m�C��J3v�����>�)O��,�U���C�����U@�� ~��x��!(@gY��r������Y�j@�� ^Gw%b�لQ���UX+Bѵ)g!�a�2.�l�X��'�����'��.�;l2���P%Ȟ)y�b(�s�]��``:�릑m1�7A�y;m�m�@�Մ��㑧�D~<��@dʡ$ wkyH��{B��Ӏ�-��*J#U��MY�N���Y���� '��jQFmlm�� +��,�[i�n��b�P}�=[&��ڎkV���%ڈ��5��������Z��Ү������g��B�3���++ն� +�?�_r�,I�S^���[k�{��<�8��1�=�ۺ,��Bq�t��%�ԓ�%��niW���]�/"d>T�EN|av��ς4c-ݗ��"O9ؔ.�t�WF ��|X���M��ڳ"b�/�g�\s��)G��K�ZCir�xX�)�1�ƾ�]W����<n�d[�M �Yɵ�Fr�#�{����@�FB�wyb�[���St�- N�.x�P�6�)n^��MW���������zY̍�8(�t�Y' \������,��\� !h���Wdʅl���z���R4�-��qK�RZ���E=�N^��$wz�ɀ��B�ڝ�S�Y��Xi"���d&�=��?w�%8��%����#8 �T�,=FOy�-ѷi���]�>�c]Ђ�Jd�PG&YT]��M0��g� +f������.ئ�"�H�9jk������֦��Zpo���3�Ce�U9���%���<A��s�����f��8.�r�q�MiTS�iR���J5'pW���0�tyN���3ǣ�ɂȧ�� ��&p��N��pv�C��!x +�1@���T��s�d?Z�^�ѝdM�x_��ef�E��rȩ>D�o��dZA+tv�d���Rܠh�X��;ZN� n����0c����t!����{ ��F��'�tQ��fs���l�����^^ą]t<�?D�����`騏�v��^�_��mC�ԭc;GJ-�B���������AW�`����aC,�C +O<@f�'z�)"�ax`=�� +ߵ4T'�l�Y)af����j�%"k�l�hk��ۺ�)�������:Ǝ6�����N����=�����}}=��h���M�|��������Ǫ�m7��rg�����;�o�&���_�����e������^���-���)�����q�������wd��̰*lU�����!��(��_|��(��k���}�.����Z�$�h`[ĸ���8h�S�<���Dr��1)���Q�1���kM���]gendstream +endobj +2827 0 obj << +/Type /Page +/Contents 2828 0 R +/Resources 2826 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +>> endobj +2829 0 obj << +/D [2827 0 R /XYZ 71.731 729.265 null] +>> endobj +2830 0 obj << +/D [2827 0 R /XYZ 71.731 718.306 null] +>> endobj +2831 0 obj << +/D [2827 0 R /XYZ 104.01 696.687 null] +>> endobj +2832 0 obj << +/D [2827 0 R /XYZ 71.731 660.311 null] +>> endobj +2833 0 obj << +/D [2827 0 R /XYZ 104.01 638.406 null] +>> endobj +2834 0 obj << +/D [2827 0 R /XYZ 104.01 626.75 null] +>> endobj +2835 0 obj << +/D [2827 0 R /XYZ 104.01 615.093 null] +>> endobj +2836 0 obj << +/D [2827 0 R /XYZ 104.01 603.437 null] +>> endobj +2837 0 obj << +/D [2827 0 R /XYZ 104.01 591.781 null] +>> endobj +2838 0 obj << +/D [2827 0 R /XYZ 104.01 580.125 null] +>> endobj +2839 0 obj << +/D [2827 0 R /XYZ 104.01 568.468 null] +>> endobj +2840 0 obj << +/D [2827 0 R /XYZ 104.01 556.812 null] +>> endobj +2841 0 obj << +/D [2827 0 R /XYZ 71.731 555.597 null] +>> endobj +2842 0 obj << +/D [2827 0 R /XYZ 71.731 528.518 null] +>> endobj +2843 0 obj << +/D [2827 0 R /XYZ 71.731 528.518 null] +>> endobj +2844 0 obj << +/D [2827 0 R /XYZ 98.63 489.954 null] +>> endobj +2845 0 obj << +/D [2827 0 R /XYZ 117.295 481.49 null] +>> endobj +2846 0 obj << +/D [2827 0 R /XYZ 447.404 469.833 null] +>> endobj +2847 0 obj << +/D [2827 0 R /XYZ 71.731 446.327 null] +>> endobj +2848 0 obj << +/D [2827 0 R /XYZ 71.731 426.402 null] +>> endobj +1304 0 obj << +/D [2827 0 R /XYZ 71.731 361.234 null] +>> endobj +2849 0 obj << +/D [2827 0 R /XYZ 71.731 316.372 null] +>> endobj +2850 0 obj << +/D [2827 0 R /XYZ 71.731 233.548 null] +>> endobj +2851 0 obj << +/D [2827 0 R /XYZ 104.01 224.048 null] +>> endobj +2852 0 obj << +/D [2827 0 R /XYZ 104.01 212.392 null] +>> endobj +2853 0 obj << +/D [2827 0 R /XYZ 71.731 211.177 null] +>> endobj +2854 0 obj << +/D [2827 0 R /XYZ 104.01 189.079 null] +>> endobj +2855 0 obj << +/D [2827 0 R /XYZ 104.01 177.423 null] +>> endobj +2856 0 obj << +/D [2827 0 R /XYZ 71.731 125.817 null] +>> endobj +2857 0 obj << +/D [2827 0 R /XYZ 71.731 125.817 null] +>> endobj +2826 0 obj << +/Font << /F33 896 0 R /F60 1986 0 R /F35 981 0 R /F55 1744 0 R /F23 793 0 R /F44 1379 0 R /F32 807 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2860 0 obj << +/Length 2288 +/Filter /FlateDecode +>> +stream +xڝXY��F~�_A�� �x4���xm�x���&��Ȗ��GƓ���[%���vW��������x��;���A��8r���sv����WX������m:����y�:��T�eN*����x�7��vK7��E�����.��z��t?.���ϲ�����wo�{Ga��4|Q=�� +C��~���G���>}�x��o�{�Cn څI��*�B������ݿ��<Ǎ�V?|I�+|W"�,T��7���=�� t|�S�� ���8KT���,3e۠�o�vR�,�~������Ä��o�n����e�-ڑ'E��a_�K?Z�x�����ى�3fy���+!�{���4�J��/z&�͙+F�����1��c�>^[��T8 +�-DL�P�U�hV��i�6���(: +3�7q� �U���6_��m�9撔���g/�.��ױ�mq��(�7�n�qgLt�g�]B%�|5����{��W�g�8D؋��˛_���Z�w��Nt(��g����NJO:xl�an� u���V^���o&�=�1G|?�g)�N�Y +&*�#�Z�9'R������`w���r? +@���<zؗ�`�~��4�v�bx��e +��V=������e����M)�$'��W� +"zE��0����4�x�wcz[�t�x���Am�C�.�3�0��ԉ�Ly:�}�;cb�t�$��S`�m���Zx�������z�Br>?>C��/U���J�K�N</����"9SU����J��E#UB��qB(/��u��!""o���S�E{��:�Z> X�3��,n�6t��+�>� S�K������`�0�<�mL��ڦ`^T�0~��Mg�|/ۙ�7o�j3���m좲Q5��y��煋?J(:"�F=OjSXf�斉@��$$���"z�IOl=�ّ�W�I��TT<���tF�����[���X�n���3�됺��zX�hR�n�~]q���!*:��]�~l'ȁ �-8#����p�%�mMi���͌ �D%�vt(����[x��ur_⌹�8(T���=Z�OP�S�&��c�@F�O[%&��ۋ�&�[Z(�e���J��� �-�թ3 ;������Ԧ�x��a����X�"������oQ�ZI� ��x�9���Wݣ�@y7���!%-���l*�J�YU�5Wt$ig�RL}~i����6�=c�FB��`e��˻� <�'�vџA�,�\�-,+���9Lb�8:)��,����AP��J/q���Y�q���L%���� ?���_��$��U&ֆ9�I��L�}e�B�F<� +А�q ���oxV�~8��M�xr*Pf�3�ݝ�������2�(,��_�X:ɓ����Rap*�Q�����+ܲ�n�t2�Ƽ�v��F�6�������_O%�ܬ7�_%Z�ů�=u����O@��dp<r����'�,��vjk9�2�H1L��������i�3i��m<���ḿ)�b}���ü-��v�g����!qy�^b�w��v��o8^~%��)��Z͈� ��T�k����l� (��y�������<@��c���jg���������wku����P��Zb�m�zHmr.���ǿjo�N�/�~&������pL�9D���� 5!Jf�E���X"j�ڸ��I@ݶ�E�U�a "���IDO�`?��əOOOT�Y65��m �Z4^����cV܊!��f�fL�^��TX�e;v�@��\9�:-����v����T(F�Q�'������^�c|��q�i���nu/��w'���U���C;|'�k����a9�fK|H�:�h ���k![q)6Z���j?�R�oU���G�W�8�ER��h������r0T��'���ު�:$���C�U��խ�:��3�f�6�C�X�7*�)]D �`�DS����fh/.[�n��dV����25��@���9�-`�(�dx�F�Hˢ��WyO}rN�ϙ):GF-��v���F?BE ���24L��Q1��C�{~�?�v �:M�S���[�c5������;��_��2��6�2��� ��Q�"˶|2��k����_��Tu�?T� ^�n�$��U�E#K��C��YL%�E�OM�'\ێ����~/��T����`-��>�U���OĊ�NJ�]��u5�K.u�_���NU�'/~�>�\}�Ty�$�,���z��, +�endstream +endobj +2859 0 obj << +/Type /Page +/Contents 2860 0 R +/Resources 2858 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +/Annots [ 2864 0 R 2866 0 R 2867 0 R 2868 0 R ] +>> endobj +2864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.465 667.589 196.793 676.179] +/Subtype /Link +/A << /S /GoTo /D (upgrade-cvs) >> +>> endobj +2866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.528 506.885 410.209 515.797] +/Subtype /Link +/A << /S /GoTo /D (cvs) >> +>> endobj +2867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.336 480.983 537.983 489.894] +/Subtype /Link +/A << /S /GoTo /D (tinderbox) >> +>> endobj +2868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [71.731 468.031 267.724 476.943] +/Subtype /Link +/A << /S /GoTo /D (tinderbox) >> +>> endobj +2861 0 obj << +/D [2859 0 R /XYZ 71.731 729.265 null] +>> endobj +2862 0 obj << +/D [2859 0 R /XYZ 98.63 692.718 null] +>> endobj +2863 0 obj << +/D [2859 0 R /XYZ 367.55 681.241 null] +>> endobj +1205 0 obj << +/D [2859 0 R /XYZ 71.731 613.794 null] +>> endobj +490 0 obj << +/D [2859 0 R /XYZ 459.177 568.539 null] +>> endobj +1206 0 obj << +/D [2859 0 R /XYZ 71.731 564.709 null] +>> endobj +494 0 obj << +/D [2859 0 R /XYZ 167.419 529.167 null] +>> endobj +2865 0 obj << +/D [2859 0 R /XYZ 71.731 521.815 null] +>> endobj +1207 0 obj << +/D [2859 0 R /XYZ 71.731 463.05 null] +>> endobj +498 0 obj << +/D [2859 0 R /XYZ 149.084 425.834 null] +>> endobj +2869 0 obj << +/D [2859 0 R /XYZ 71.731 418.482 null] +>> endobj +2870 0 obj << +/D [2859 0 R /XYZ 71.731 398.572 null] +>> endobj +2871 0 obj << +/D [2859 0 R /XYZ 331.48 374.826 null] +>> endobj +2872 0 obj << +/D [2859 0 R /XYZ 86.396 348.923 null] +>> endobj +2873 0 obj << +/D [2859 0 R /XYZ 71.731 341.785 null] +>> endobj +2874 0 obj << +/D [2859 0 R /XYZ 225.881 318.039 null] +>> endobj +1208 0 obj << +/D [2859 0 R /XYZ 71.731 310.9 null] +>> endobj +502 0 obj << +/D [2859 0 R /XYZ 212.652 273.685 null] +>> endobj +2875 0 obj << +/D [2859 0 R /XYZ 71.731 266.333 null] +>> endobj +2876 0 obj << +/D [2859 0 R /XYZ 417.78 253.56 null] +>> endobj +2877 0 obj << +/D [2859 0 R /XYZ 77.412 240.609 null] +>> endobj +2878 0 obj << +/D [2859 0 R /XYZ 102.715 227.657 null] +>> endobj +2879 0 obj << +/D [2859 0 R /XYZ 71.731 220.519 null] +>> endobj +1209 0 obj << +/D [2859 0 R /XYZ 71.731 163.732 null] +>> endobj +506 0 obj << +/D [2859 0 R /XYZ 269.391 126.517 null] +>> endobj +2880 0 obj << +/D [2859 0 R /XYZ 71.731 119.164 null] +>> endobj +2858 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F44 1379 0 R /F35 981 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2883 0 obj << +/Length 2349 +/Filter /FlateDecode +>> +stream +xڕY��۶�=��_j����Z���֦�Z��PK�m)�DU��:��xGY���2��#y�;�}��/\�/\mC�'��(KWE�"Xa����w$Y�Gi�;�^o�|���o_<|ū(�4_=&)A�Gq�z,��~���+�?6^�ݭ_��}�$ ���4�n�֯6I��y���?��v��y#�`��-�}�j ���m8��p��h�R���ԦVN�|�)C�Bm�t����,�(-7Q�>U@s��k*&��R�t�8Z�/��0��}�-;9��&?Ow�ӫ(��+/���6�C��x�(����� +�W{C��Au���A ��a�p���^���3���E<�����ql��g��Z�W��g��g�W +÷9զr��Lm`]_ ����o������p:�6Y������I_ �0_>a��-=oI'���i�����6e��P�]��+�� ��՟�����~Tk��t��q���t]v�K>RJ#�FҘ���kk���ǟ~�s�ϙ�{e���y�Sе�������}�^��\e�n�u* �����5�L��<�o��Zд��5��D�%�K�H� +'\�{����&��RD����d��� �,i���� Oݺ#�Ʒ�!|�'� ���{c�tc�܅�}{�S���a��q���C�q��g����7���� +t�J���O49�V�m��d��z/�}�y�lw�Œ�,�j�VޱI[wu;��;�A��"[8��i̙b���}^�&�G���<����X"VO��2�n��Ի}�GB�8�ѵp@ن�����$�`L�(��J`jA�J�i���8�_�!8h�=`����Qr��A�=ѭ+/�t1�1�/6�h�;�eC�8�w�p�o�U�[��q����m����&N�?��Z�F����Z�#�6� +H'#��\>�a:Q��0�xkՌ��r���><&��K����g�V�wg��SK��9/���b�#�s�QO,3ͤc�g���4��oF1��_T]�$fUJ�QR ����$y��s��p�m�s�z���EA3]�ݾl��Ap�};cy���x���T9����0Y�%�X��s@W�����r?�����.���'�:T���G���m +��@��ܣn|�*���.02ޡ<��|:��@�3�k��AA��:�sV� ����w�</�̂$N[6<m� `f��{�����|)ax�'�y�<+ �&���N3�8���4Q| +�zf�kx�3����O��r�p���ޞ�v��:r�ga�~|�S_s��q�u�]��-o�+�ֿ��엙�Uy��.��´�JN�T��/�,X��TQ����FQ\�����ӍJ�@@}�6H�;��塟��U��>�oj� +�Nn!��a��9#E�:�4x���x��c�N��� T��{s]d�c�Xm� �p��~Ԧ������!�������,����������B��p� �t�ME�=�g���R?�B� �}�(�5��\��B%E�� ~�$b�Pk껁`�|�j%W +�VPo�Y)�� +@?]���0��M��0�3u�����b���F��$�H�a�/l��Y@�A_�Ƣ�i��j^�au�l�j�L���h*5L���`S�m�`6���Id0rO +CzR4���?>3,����Gh�r���N���TH��5Uֶl�m���)��_uu�t�����(:R��"�Z�p�36 +.��y�v���lX�A +36&���נ���&i����C���Y�LR*�!V�(�8�$��ȱ��2۠U��R��XX�O +���t�|Z2?T��&��e��P����Q�� �TK�>�]L~R/��{�ٛ��X���@��F-��1�e�!���J�tˈ�5�0��\�t��y3䐴@&�J5H4�3��}TOT�3;UIK�������`(��"R��zLζ��r��c�J�Z{�+�u_m��������-�Lx_n']��]V���/��(M n��pMMA�γ]���,�aP�T��_�eB�b�=��ХD� \.[�7�#o~��]R��ܧl4��{ �=��1v(&��;�.T7�����l���J��Vֽqd���e�8K��z3�[N)�M�0g|�<8��F$,��'��w�; ,CGM�@a�l1Vƻhm��~��� sh�� � +�ZT[�]�I@%���Y��A��6���v�|����3���SB�0��mĆ�Y��P�-h���"�� o��R��K�Y��%`LW����q�k��"���p{���ûl�옷�i���1A-��Z���ɭ������endstream +endobj +2882 0 obj << +/Type /Page +/Contents 2883 0 R +/Resources 2881 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2769 0 R +>> endobj +2884 0 obj << +/D [2882 0 R /XYZ 71.731 729.265 null] +>> endobj +1210 0 obj << +/D [2882 0 R /XYZ 71.731 718.306 null] +>> endobj +510 0 obj << +/D [2882 0 R /XYZ 366.546 703.236 null] +>> endobj +2885 0 obj << +/D [2882 0 R /XYZ 71.731 681.855 null] +>> endobj +2886 0 obj << +/D [2882 0 R /XYZ 71.731 671.343 null] +>> endobj +2887 0 obj << +/D [2882 0 R /XYZ 71.731 666.361 null] +>> endobj +2888 0 obj << +/D [2882 0 R /XYZ 71.731 661.38 null] +>> endobj +2889 0 obj << +/D [2882 0 R /XYZ 71.731 638.889 null] +>> endobj +2890 0 obj << +/D [2882 0 R /XYZ 71.731 615.552 null] +>> endobj +2891 0 obj << +/D [2882 0 R /XYZ 346.348 599.776 null] +>> endobj +2892 0 obj << +/D [2882 0 R /XYZ 71.731 597.619 null] +>> endobj +2893 0 obj << +/D [2882 0 R /XYZ 71.731 574.705 null] +>> endobj +2894 0 obj << +/D [2882 0 R /XYZ 354.338 558.929 null] +>> endobj +2895 0 obj << +/D [2882 0 R /XYZ 71.731 556.772 null] +>> endobj +2896 0 obj << +/D [2882 0 R /XYZ 71.731 533.858 null] +>> endobj +2897 0 obj << +/D [2882 0 R /XYZ 71.731 528.877 null] +>> endobj +2898 0 obj << +/D [2882 0 R /XYZ 71.731 497.993 null] +>> endobj +2899 0 obj << +/D [2882 0 R /XYZ 71.731 497.993 null] +>> endobj +2900 0 obj << +/D [2882 0 R /XYZ 71.731 467.109 null] +>> endobj +2901 0 obj << +/D [2882 0 R /XYZ 74.222 425.43 null] +>> endobj +2902 0 obj << +/D [2882 0 R /XYZ 71.731 400.359 null] +>> endobj +2903 0 obj << +/D [2882 0 R /XYZ 135.784 384.583 null] +>> endobj +2904 0 obj << +/D [2882 0 R /XYZ 266.838 371.632 null] +>> endobj +2905 0 obj << +/D [2882 0 R /XYZ 95.641 345.729 null] +>> endobj +2906 0 obj << +/D [2882 0 R /XYZ 404.72 345.729 null] +>> endobj +2907 0 obj << +/D [2882 0 R /XYZ 71.731 343.572 null] +>> endobj +2908 0 obj << +/D [2882 0 R /XYZ 71.731 320.658 null] +>> endobj +2909 0 obj << +/D [2882 0 R /XYZ 105.325 304.882 null] +>> endobj +2910 0 obj << +/D [2882 0 R /XYZ 71.731 302.725 null] +>> endobj +2911 0 obj << +/D [2882 0 R /XYZ 71.731 279.811 null] +>> endobj +2912 0 obj << +/D [2882 0 R /XYZ 71.731 205.091 null] +>> endobj +2913 0 obj << +/D [2882 0 R /XYZ 74.222 163.412 null] +>> endobj +2914 0 obj << +/D [2882 0 R /XYZ 71.731 138.341 null] +>> endobj +2881 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F32 807 0 R /F33 896 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2917 0 obj << +/Length 1997 +/Filter /FlateDecode +>> +stream +xڍXm����_��� +N�}�v ���$�ES�.�eo��I*W��g�3�V'�p��p^��U:I�/�,�x�Ð�q�('��U2���__�,1c��H�~�j�!�'u\/��j3)�2��<��2���E��{9���YV&ѻ��U'��?lW}/h�a��e�nZ$ѧ�W{�~uҠ̗q]�/*d��̖g-�2^�dR�yQx%W�p��"�Z-��z�V3vRH%�bN#.V�v{����o�O��ྡ�³�H蜆L�N�{�\�g� �� �,z=l�\i�T jx�hU�_��#���~�v���,��'�?7ϓ��{m���W��ah���D��;��/@��/e�ʹ�Q�V�S�;�W炆o�p◃�|�&l}?tbh�ɾ%ίI����=)1�t�9~T���f ��@�X��@s58i6S��h8��a���b��4�n�d>��ۿ��Y���\�=�!8q7[����}�u|T�/����q �)��*��9i\��8vS�����?�iI����OK��ѫ��i$��bII�s����"�v?��r���V��~���-f$�:�����Rp�B"4��^5�\�GO��&ڨ����4o:m�@�Z6�'N0���7F��R +˻�f��:8����Y�~�fe$T/�=�C�gu��ii�aΏ��F�o Z{h��Q�s*��6����WdI柉cs0� ̓S��6�,���>[[p1����;��̑����~��;�{���vH��/�%�F+)��c���(J���kϦ:bZ3 "� �����Z���i��2jPN �У�6,�x��@�H +"�lZ�.�x�'7e�j���y���Y��c�$�:�'_������(}�I��22DТ�nE�OC@õv��L��0��3���Va}8�/$4��0D���K�)h,3:}��Xbɿ/���`ج���!��rR��E�<Β�E�k�k=X��ֽ���0�c�E��qM^�E6�eD����$��1�|��A���N��ᕎ ��ݥ�^�.@Q&_�N��/�0���ҝ��2@���2]�`|���z�U��9o(��P���"?�:���^F����ĺ���H2�]���a&OFQ_�bB�mt���]�qX �� (�"�Z`�<����y�C�,�C�h��� +�O�����ݾ�N�����``�ɲ��� �F�hu/�:�{���C����$Հ���2�S ���iEkF��g �F�U�;:XF�1��H�a +��UX<�B���B>qn������σ��>�� w���N>�#1к�����c�դ{B� h���b5F +N�t�A�<�I�h�-�Q���9u� �.���qt�}`�ʭL^Da91��O��EB�����@� _�� �����:�sߔ�i�i��,q�}^���`����� ��a}��x7�=�� ���2y�w��s��4�\����0���'iQsx=)O�������m|��\w�dqQ�������Jl˹�Cbء��C�OJ�����P�2�)VY�K�9>�#��v�NM���:�u~�tC��F��mļ�w�z���{ +hB��������@Ǫ�fO�g~x�"0Ow�JN��٘�� p0L�#G^������ƣ���8{��Z|��&����w�9�l�ǜ[�+���x���ڴ����� I�k��_~���9v��( +O��w���~�#Ri�ݾ��W�2.�S^����$t �鵡U����9�G��>��ra��o�F�G�+��In�X�q����nm0|<q�:��1�r�����1�-�з~��,���_��99���*���L���G���,�QcU�E����'βe��X���{���`�����8a�� +�C�/��z3$������6l��o|g����ʬ��,�/)���K��M��bd\endstream +endobj +2916 0 obj << +/Type /Page +/Contents 2917 0 R +/Resources 2915 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +>> endobj +2918 0 obj << +/D [2916 0 R /XYZ 71.731 729.265 null] +>> endobj +2919 0 obj << +/D [2916 0 R /XYZ 71.731 718.306 null] +>> endobj +2920 0 obj << +/D [2916 0 R /XYZ 207.132 682.441 null] +>> endobj +2921 0 obj << +/D [2916 0 R /XYZ 74.222 664.508 null] +>> endobj +2922 0 obj << +/D [2916 0 R /XYZ 71.731 639.437 null] +>> endobj +2923 0 obj << +/D [2916 0 R /XYZ 71.731 605.629 null] +>> endobj +2924 0 obj << +/D [2916 0 R /XYZ 283.834 579.826 null] +>> endobj +2925 0 obj << +/D [2916 0 R /XYZ 112.518 566.874 null] +>> endobj +2926 0 obj << +/D [2916 0 R /XYZ 71.731 559.736 null] +>> endobj +2927 0 obj << +/D [2916 0 R /XYZ 74.222 531.009 null] +>> endobj +2928 0 obj << +/D [2916 0 R /XYZ 148.772 508.095 null] +>> endobj +2929 0 obj << +/D [2916 0 R /XYZ 71.731 506.687 null] +>> endobj +2930 0 obj << +/D [2916 0 R /XYZ 368.158 490.162 null] +>> endobj +2931 0 obj << +/D [2916 0 R /XYZ 95.641 451.308 null] +>> endobj +2932 0 obj << +/D [2916 0 R /XYZ 71.731 423.248 null] +>> endobj +2933 0 obj << +/D [2916 0 R /XYZ 223.933 402.491 null] +>> endobj +2934 0 obj << +/D [2916 0 R /XYZ 71.731 387.382 null] +>> endobj +2935 0 obj << +/D [2916 0 R /XYZ 437.576 371.606 null] +>> endobj +2936 0 obj << +/D [2916 0 R /XYZ 71.731 346.536 null] +>> endobj +2937 0 obj << +/D [2916 0 R /XYZ 74.222 302.466 null] +>> endobj +2938 0 obj << +/D [2916 0 R /XYZ 71.731 277.395 null] +>> endobj +2939 0 obj << +/D [2916 0 R /XYZ 71.731 249.499 null] +>> endobj +2940 0 obj << +/D [2916 0 R /XYZ 71.731 249.499 null] +>> endobj +2941 0 obj << +/D [2916 0 R /XYZ 71.731 216.757 null] +>> endobj +2942 0 obj << +/D [2916 0 R /XYZ 71.731 216.757 null] +>> endobj +2943 0 obj << +/D [2916 0 R /XYZ 71.731 196.832 null] +>> endobj +2944 0 obj << +/D [2916 0 R /XYZ 74.222 146.351 null] +>> endobj +2915 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F32 807 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2948 0 obj << +/Length 2348 +/Filter /FlateDecode +>> +stream +xڍێ۶�=_�͓���l�r�"�n.݃�4m݇�Ӣ�%�fWU������p��d{��D����t|�/�Z��r�d&��*�^DW;Xy�"f�)�L8��7�f��U�JgW���<^��3K�l�\�����Fօ�2�&�(x�w��4��v���4{7��E�z2���'�������`1[��l�U&=�9�ɑ��"L��d�����1��q��n�%�#b��,����L��$0��G��n���5�W�n ^h�tG���$Q�y�IB���J�F���(Jr��}��Q Z9&#.oЍl�U����a�ʊ7�=o- +}5eA�q��l������BK��-�[گ�F���.h �P���SPH��������r���B�Iݎ��9���C$ϒ�e�k[�V�ZYЪ�z�^łV���F���vz)� +�v�&�D��v�V�4���o�w�G �o�ٟ�� {�K.�\������<JTm%�����*�k�4�$[�I�K�G���4�,�d�)S%+�m0T�|ښ�C����Ԡ�:�+��s��M�f4Y9I��^N8�}�R��g��T!_�q�G}y?PAO�Q�p�ޫ��~B���ȼ��S��.��%�E�x�3�6����hi.Y V;��L��)ٽ�cݷ� ����)|�/��<m��������m9��9��� ���4���j�9�[v*V��^ؓ�$dm������rx� 1�4_�w����5�0��Rގ�d��yOM��=~�@T4E��yud']�ڽfdtm�)Z'��.�J� &p�f-�b��Ւ7;�")yM�GE;ӡ���T����dj���&�ҁ?Q'��>^ɱSݲ�6��7]� ����2f4���8E<�L��Q3[�DM�u��X��E N�7��9���/N�����6{Mv�]��2|04�6��琝{��bz|Wgq�R�r��Oܹ?��_��O�������1PQ�K�#sN��F.6��$?� +* �2'����@>�!�w캢�T NIS����(�!c�����"$������N}�\ȷ���,�(ץ�#H7��H�BC�P�~�+��=�?���C�S�5M�(�V�����7-�i��� -�k폆6���-7���U8:8�#�u`�=$���v��?Mz��(�A�ӏ`#/�3B)����,�R6�Uq6,@j�ԇ�܋J3� i�Ԅ۴ +��l��픏��d�Ҽ"�>���7���D)-�o!tg�,�9�����>͡���,�(�� �$��x3p1��d\w0�^���g��(�Q��,�ec����Ϩ�Qv�|=[�$���u�r�k�j��=����h���I/���b��q>7�����,�k�\ӗJ� +��J�U.�����hQ�O��S-+��:c{�PA��Nv�͢w*W"4:��}�b�j�T�f/�@��FF+������}��= \�ā(���7�-���m�{�K_���[Ua����u�1�p^�A7����3>|+��z�j��[�\��8�-���������wR��&i� �x͂� �C�ݟ��;�J?�Ӱ ^�<�(��K�<�˙.�'��{yT4%�=U��z3b��5P�ȩ`��<V+i[��,Ɩ���%����\�=�l�Y�J~k\52�����y��)�z���s�w�N�U����V�ֿo����n�N�* >h�S�@d�lbw�<�rob�"����W ��k�B#�q�'�Gk 8��>c ����Nvi��&�/x���SH�Z��3���`'--a2C3�h��f($��Z3>�l�[ږ�y���و���@�U�����t�b�K�MP�h�5���^��*�Mψ:�[�p���d^(p$�0w�pI�_�V�Ii�=zs{��B��y�$��0��q��5 7tw�D���3������s^òg.�x�^�i�EP��� +R +|��>� ]U�ܗ���_=`��U���S�L���Qy#��- � +p0�D �b��T�T&S/q��s����^��D��|)K�j�1'u������}�?iY|- +����o=F���,����}kKφ�b�Q}�����8r_��_�Np��������d��7��G.=a�b�2�p��Xo<K�J�>�ǫ6c!���%��[��]i���ׂ���*N.��vUEM:�lG{��^ +t�������ȹ�<e��w����z�B���;v���� _��9��ճ�"�dz��lor̘��������0�/ڿa��{)�,�4����wwD��u0Fc!����^>�� �/�yf���Q��#Y$Y%���X<�W�9�����endstream +endobj +2947 0 obj << +/Type /Page +/Contents 2948 0 R +/Resources 2946 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +>> endobj +2949 0 obj << +/D [2947 0 R /XYZ 71.731 729.265 null] +>> endobj +2950 0 obj << +/D [2947 0 R /XYZ 71.731 695.293 null] +>> endobj +2951 0 obj << +/D [2947 0 R /XYZ 71.731 662.351 null] +>> endobj +2952 0 obj << +/D [2947 0 R /XYZ 71.731 639.437 null] +>> endobj +2953 0 obj << +/D [2947 0 R /XYZ 71.731 610.61 null] +>> endobj +2954 0 obj << +/D [2947 0 R /XYZ 71.731 585.639 null] +>> endobj +2955 0 obj << +/D [2947 0 R /XYZ 71.731 567.706 null] +>> endobj +2956 0 obj << +/D [2947 0 R /XYZ 71.731 531.841 null] +>> endobj +2957 0 obj << +/D [2947 0 R /XYZ 71.731 515.965 null] +>> endobj +2958 0 obj << +/D [2947 0 R /XYZ 71.731 490.994 null] +>> endobj +2959 0 obj << +/D [2947 0 R /XYZ 71.731 447.158 null] +>> endobj +2960 0 obj << +/D [2947 0 R /XYZ 71.731 411.293 null] +>> endobj +2961 0 obj << +/D [2947 0 R /XYZ 71.731 375.427 null] +>> endobj +2962 0 obj << +/D [2947 0 R /XYZ 523.238 364.633 null] +>> endobj +2963 0 obj << +/D [2947 0 R /XYZ 74.222 333.748 null] +>> endobj +2964 0 obj << +/D [2947 0 R /XYZ 71.731 295.726 null] +>> endobj +2965 0 obj << +/D [2947 0 R /XYZ 146.578 279.95 null] +>> endobj +2966 0 obj << +/D [2947 0 R /XYZ 71.731 272.812 null] +>> endobj +2967 0 obj << +/D [2947 0 R /XYZ 74.222 205.23 null] +>> endobj +2968 0 obj << +/D [2947 0 R /XYZ 71.731 180.159 null] +>> endobj +2969 0 obj << +/D [2947 0 R /XYZ 71.731 149.275 null] +>> endobj +2970 0 obj << +/D [2947 0 R /XYZ 71.731 126.361 null] +>> endobj +2971 0 obj << +/D [2947 0 R /XYZ 71.731 110.486 null] +>> endobj +2946 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2974 0 obj << +/Length 2643 +/Filter /FlateDecode +>> +stream +xڍk�������hm��ZO[���k�H4�6-��@K�%�,�"u{�_�ΐ�l��8�tx����n�>QDYzW�_l�N0��!�X��d�w��o��.�,���0 vxN�4�ۗ�Y��:ٖ���:J7�W}����w�鏺iAo�a�.^-���������⇽� ��A��?K�[sMe4R��A����]'�%2 +�M�����( ����5�+�qв�4��2�,>,�ffǨO͈�g:ћ�X���=�|�x�:�W�E���k�B�Z�H�ݚI[�Y��;K�\���5��ek�2�:���H�G�b���4�+Թ*���wU�J��5�4N������Cu�7����e�7�T��Ei��+���(K���,�R�*q�)FT�0��bz��uk�in=�C9/�ᢥ��2q +3�R�/M�PdO�&�NT¸0]��P}I���N�zr)�X\�a��$�nԦ��BkU��Ȓ`fmE�� g�<�J���*|1�a�6�9[����xJ��]P7���{I|^�u�Z���<o�ۭ��Za�1�0�rW�=d[�t������ ��A��h�/���ى��Նw�RhPg�[O���G����?����d����J�V�"��L�%������B�M#���4ċ�����v. C0XE#&���"��(S�'�6���5%�p��8UƑR}: ;�4���禛`��] oQ0�t���71� ��e��L9��0v""'�Aҷ�}�N����Ζ�h�6�`S�V����h=S��㩆o:>�6�k��x>��V��F�^�bX��K ��(�|��r.l@ȟ���g����+�jhJ�Nk��̮!�A����F�x >ST@�K��}��dS��~d|$к�h�9�#�[���VΦ5�1�Zv]��4��A��.�����\�p����i������c!���B$>�>5�����Z����ԘD�Z�t^��N!M���Y�_�w��I7$�P���ъ DS�&^��'������,w�E@�����{B�J��I$��%��e��)9(c��S��RgL�ŭxn(�%����-rǗ�'$ +H�u�L�_71M{�U*�Rc�JC����@kO(�AD.��r�̑_Mj"���e��# +��U0@�c�(�٪��a�5}[Y`RC+�{�Ja�^s�M'MUh�pX�s��߷}y���i之��tO�?~�)���v��5�(��(�[Ù�Xee;H��P�d�/��˶���AӨ64U3�p�^���H26`)PKn؍�h8�V�\����� �Zn�iJ+d/���<es鵽|��X���M*vS�2ٙ�Ԥ��C�C��$��M�nZ��E_w��u[4Ciy�.��? F>��r��=�VpPL�f� iC�}о��&�kS���Rgs��J�A��YG1���C��>�әP[��!ǰ8t�Sb9J!�:�&ZF��Lxe��"��!No��@�s��+���0���T�`}d�c��54��-�Gz�t����m��� +X �,��ҫi��"���N��G�xB��p�m��m�V�Ӯ��y�.n?v<�ͶNV�]/��t��-W�<cׇ�5}}��v�i̫���\�������H��,M䒵k,9�L�V��0O@��<�Y5�RC:�΄���*��Z_G�h�t=t>�M˙��=��(; f��NA�w���%PH'[WHG_z��qb8hs���8j����Fj�A'�R��J�I? М�q���D&[�"C[���IJ���d(���(�O����HD���A��8+��f�@��&kR����놲�M/Z�P�0W�zE����2�������i����w̏ ��h +![ݗԱ��eP�s�F�e�h�{�4Dy��L�=˞J�Br,&�Ĕbl{�82�dfr ��$�7�dΨ�r��4�.e��zyT=�6���� +���:� �� ��nd[��Vq��?(�S����x��0"���a�5���-eр�J6��No>f#FYe4�ҝ�:} +0�S� +��j�/Ą�P���qY��� �z�'3�[�]��<���\���b����V3�",�'Hh]���D����ʫ�ȹ�o����i��0i�����r\������$ ��� �H����k$�|���]>K�������M��<lj)z[^a�9*z���خꅖ��e�[<�����3�.�CLkۄtQ�R�r�KM8n���iZ�4�R�u�L�V�"�{�"Eڶ�%^�T#Ѹ�h�a��z���|;1�`�ɟo��/ ��ȯQnzK���5`��M2zB�T��2"zlc��A���x�.I��6��W6�B��1��j��DQ�y�Ak"ו�q�38�<~�x\*��k�nuA��I'if��h]��o����~�X�*�T7+��a/��N�Í^j�a��<_���]�BU�p������s]�E�K���/Ki�pu&���N��7/7і>���.*�eJ�ET�-���#%7��kA� ���:DM��G0�.��p�����%W?ӥ���)Hg�}������~eendstream +endobj +2973 0 obj << +/Type /Page +/Contents 2974 0 R +/Resources 2972 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +>> endobj +2975 0 obj << +/D [2973 0 R /XYZ 71.731 729.265 null] +>> endobj +2976 0 obj << +/D [2973 0 R /XYZ 71.731 706.187 null] +>> endobj +2977 0 obj << +/D [2973 0 R /XYZ 428.12 691.706 null] +>> endobj +2978 0 obj << +/D [2973 0 R /XYZ 71.731 674.605 null] +>> endobj +2979 0 obj << +/D [2973 0 R /XYZ 71.731 602.242 null] +>> endobj +2980 0 obj << +/D [2973 0 R /XYZ 71.731 551.268 null] +>> endobj +2981 0 obj << +/D [2973 0 R /XYZ 71.731 502.451 null] +>> endobj +2982 0 obj << +/D [2973 0 R /XYZ 361.335 491.656 null] +>> endobj +2983 0 obj << +/D [2973 0 R /XYZ 71.731 460.673 null] +>> endobj +2984 0 obj << +/D [2973 0 R /XYZ 378.982 447.821 null] +>> endobj +2985 0 obj << +/D [2973 0 R /XYZ 340.628 434.869 null] +>> endobj +2986 0 obj << +/D [2973 0 R /XYZ 71.731 414.78 null] +>> endobj +2987 0 obj << +/D [2973 0 R /XYZ 244.777 403.985 null] +>> endobj +2988 0 obj << +/D [2973 0 R /XYZ 74.222 373.101 null] +>> endobj +2989 0 obj << +/D [2973 0 R /XYZ 71.731 348.03 null] +>> endobj +2990 0 obj << +/D [2973 0 R /XYZ 376.156 332.254 null] +>> endobj +2991 0 obj << +/D [2973 0 R /XYZ 330.329 306.351 null] +>> endobj +2992 0 obj << +/D [2973 0 R /XYZ 71.731 293.3 null] +>> endobj +2993 0 obj << +/D [2973 0 R /XYZ 71.731 268.329 null] +>> endobj +2994 0 obj << +/D [2973 0 R /XYZ 71.731 250.396 null] +>> endobj +2995 0 obj << +/D [2973 0 R /XYZ 71.731 227.482 null] +>> endobj +2996 0 obj << +/D [2973 0 R /XYZ 71.731 198.655 null] +>> endobj +2997 0 obj << +/D [2973 0 R /XYZ 71.731 160.732 null] +>> endobj +2998 0 obj << +/D [2973 0 R /XYZ 71.731 129.848 null] +>> endobj +2972 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F23 793 0 R /F44 1379 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3001 0 obj << +/Length 2511 +/Filter /FlateDecode +>> +stream +xڍYm���~�bqZXk�b�r�n��M��6h��d��ٕDG������%yWw)X �oC��t|�_|���M +�d&��l^E7���*�Ki����|u�>Mo��v��<�oVq�8N��y��<V�ޞN�����2ɢ�m��ǣb�?������Eg���* +~Z�����8X���p��_5ҷyie2Z���� +���0]���$��!Nx�>ٌ-�U��604-���Qy�h`���|�O,�U��NY(����3�T���Y����-� ��|��o��#�q����J �X�vrio:�&J碮�"ɂ���Ѹ�`��~;d�_��Q`z.��.~����f]W8��8he�YP����g펴�֗��,��M��4��݀5H����G�N�.����|>/�Y6�[����LywW���X��5��m�a�7�y��;w�G�}G+��{�:�g'N6��w��:հ|C�����2���e�����>1��( +�E��;�����p��A�G���4�Y.8��D��$�@��ֱ{�c}�:]��'�j%#����6�vWU��'�x:%ͳ��r�%���*>xݼ�NN�m�٭?f�tceG;�;��,��q��%��z�y�����N}%rX��"g&y.��#�moqm�%<`i��781����J�L,҆��*� ���H_�=z�L��K:�\�]�M�[Wh��}�O��x�� p�n%yU�{��%��� %��'Բ\%'8Ftp@�5����0�=��}��UC�gm��{1I�!g忝��v�/�IS�Ċ��ٙ�����4@]�Em����YKp�%��~�;���c�#�j Ǿ<��KcE��� ���0�r.����ni�KtE,����r�L�#܆�:G�y�un��q.��j[���T������3 WFR�v���b�ħj���Ƹc��2R`#�j��.ȶ咙@��f�iER�ճ���a�?��w�Sݞ��T�;�Y����J���)A��]PD�Қ�c@�s �����o����F��?I��rs��&�n�(��Z�60��]�^�-ci�%5�X���I�֥j-%�4^�0��rT`b�kGy5��y�]�Z��}� ��A��eR��倒�-�=���Ĕ��9�R�[��0���Ɋv9�&�G��!g�����U櫍���<KX'��')�D��]ш��f���yb��7A|�ҸH��a�3@sR�6�\�&�'�I��e��i�P�`e��� �EN F)4 ���J�cq��eO|)����Y�'Q���ͅ�}.��>c��ɰ�I�q��v��q\H�i����.mgb�6�@��̕Eә���!�[a&�����}[ ���� �қ���xz[tʕof0�|o7��Q�^�,�Ė�l#K��?J'�k�2lT�BV|4܄�X���'*��D�%�|��hE�o��XyPn��L#d?z��o�y�"%B�Pb2�R����JbA ��Qm���P,�~,���SS���+����@3J�����@|1�"f�R�/H����J-�(;� ? w� +闙�GO��${�t�h-(�,tO�L'x��C + +x�w��H?��&:ț�e<��/P���?�`d�U�Q���/�:pH�{�S<+��. +cl��#��UB~�+��k�bV�y1���s�$���,��D�1_ I��<WpɗF�0�Ŏ��d����ǞSD��o�I��"};�;�c���Y�b�{� �Y+�뼸iH��A���V��5;~�v��/�`�����E i��`��ͷ|�Q12x∺c5�H��-�c��7-�RF�'�E�>ꂕ�?�ƻ�22N�!�+���nX�Gƾxy���Bog�(��U���ܳ�GU�p���J'|"�l�S<�@G���D�w�u��]��})�����)f�P��gh�=l��J�B �K�u^d�ա�A.:|� �*���`�FZ�e�t�W8n�7��#ɿC@��v�n��JTY�ubVW X)]dT9� ��7@��CL���\������!vA���r�&R�-�Y�ޞ*�/����+Z�t���u�U?֊��N1����<�y �7'O=�,O8յ]��,b9�n�n����'�rt>�<�t;���1\J�w!J�����t����7T�o�s�;v�|�<c8��+^�"� F���0��9H���#�4�#�Yܺ�_��)`rBߌ�L���C��0W�?��8�o���<8����~H�ߟ�+�&�b��+M�f�<��02$ƥ\S�,��OX�^��~���Ҷ��i_����K +Y|����VK�1���Gϗ�L`%l��X�&,0Q,$2����hk� +�vr��� }é'pp;����Y�_�1��~65�h�P��?�~���3|�Ӆ�v���<�|�ו�ɋW�d��a\k��ҏ$/����;endstream +endobj +3000 0 obj << +/Type /Page +/Contents 3001 0 R +/Resources 2999 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +>> endobj +3002 0 obj << +/D [3000 0 R /XYZ 71.731 729.265 null] +>> endobj +3003 0 obj << +/D [3000 0 R /XYZ 71.731 706.187 null] +>> endobj +3004 0 obj << +/D [3000 0 R /XYZ 196.632 677.46 null] +>> endobj +3005 0 obj << +/D [3000 0 R /XYZ 71.731 675.303 null] +>> endobj +3006 0 obj << +/D [3000 0 R /XYZ 71.731 652.389 null] +>> endobj +3007 0 obj << +/D [3000 0 R /XYZ 71.731 621.504 null] +>> endobj +3008 0 obj << +/D [3000 0 R /XYZ 71.731 572.688 null] +>> endobj +3009 0 obj << +/D [3000 0 R /XYZ 71.731 536.822 null] +>> endobj +3010 0 obj << +/D [3000 0 R /XYZ 74.222 482.192 null] +>> endobj +3011 0 obj << +/D [3000 0 R /XYZ 71.731 431.218 null] +>> endobj +3012 0 obj << +/D [3000 0 R /XYZ 71.731 374.431 null] +>> endobj +3013 0 obj << +/D [3000 0 R /XYZ 71.731 340.623 null] +>> endobj +3014 0 obj << +/D [3000 0 R /XYZ 71.731 297.719 null] +>> endobj +3015 0 obj << +/D [3000 0 R /XYZ 71.731 297.719 null] +>> endobj +3016 0 obj << +/D [3000 0 R /XYZ 71.731 274.939 null] +>> endobj +3017 0 obj << +/D [3000 0 R /XYZ 71.731 238.939 null] +>> endobj +3018 0 obj << +/D [3000 0 R /XYZ 376.711 223.163 null] +>> endobj +3019 0 obj << +/D [3000 0 R /XYZ 71.731 208.174 null] +>> endobj +3020 0 obj << +/D [3000 0 R /XYZ 71.731 185.141 null] +>> endobj +3021 0 obj << +/D [3000 0 R /XYZ 71.731 141.305 null] +>> endobj +2999 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3024 0 obj << +/Length 2545 +/Filter /FlateDecode +>> +stream +xڕYi�����_!��R���M�9�w&v�Fv����lI̐l�M�� ?>U]U%�c����^��n�3��Y�i�`�I<���l=x�ĒE�#�/Va8۸�$�=�f��k�'�u��8��G���2�=�K�ǃ���~����2�=,|?v^-"��q���?��v���Y��nRdnw�w���$�Mzk7�"��� ]\o��g��sC/��Q��7���n=�8e}�T��N���Ǩ�o��D��=/�d�j�1�ndX���͡-Y����u�5c�LM���F�����s�:��h�<�z�j ]6{it���-��K?p7l�N�%ھ����O?~O��p���75j�5 ������ނ�x��ew�Y�a�J7{ղ �����0c��V�,S�I�XÁ��>�>�S<P�!��o��5�� UyOw$Ӫ*��� +n�6�|���&@�V�� +e�<v�5.���9� +�x�We]�<ˆ�}cU1��[H���F�uX?�2gM�.k;�o}2�� +��� t7�*L��#w��묬��<�:My�?�/>L����l�C��nc-���N��� +�L���_;5X�gMGr���U���И5X9�d�[nV���kuM�rN�:�j���dx���Gj(yO���O��"N� +�@��.��^�4d�"t�5+K�������ٶ�E +���PB"ϖ���ت�jU�+��ً���*�5*�j�+x�S���tO�<���v+�d)5�ǻPȶ�0H����x�4%��8u�4f4Y��-�^�.��$ٰ$y��}�¿�~0dJ�����a�eU�u@ +�N�n ��H}��kv,���ױ � �d�s'��շ�^=�P+���q�=Bų>WˎP����y_�}��5?t�U����?��9�����ڬvi�u��\Qe�y\��4_Ω�������2���QO{1�ɟ���0�Ԏ��-{2��yA��`�Z}3B?���w�����28Pv����i�㕍A�A�8�2�V��6�8���P��R�xT�HoCd�U� A��A�\,|�1ta촰���?U�X|hU�e{�e�I!^>媪*��h�C�,�ba��ʌ)������s���f�'��f +H + +,��`�}�t]�'I��Q�w���Պ�Ea�����k��W��Vy������o��w8��O���qHI�M��Nb�4e�xT٘n�{�fU��!�%�jM��ow��8���m�����N2���iv�HdM��j=��Wz�#V���Z]z�xD4*��jd�[^<\{��t�KA��/�����=��eU���}�b���$�qv�y*=���b��ܩ=�! �A�qC�le�ef�b��u�-����K}��K�r���ɀ��n�o�I�n�,2U��s��Uo�U��T�m�\x�*װt��F3>��,K^u�307��AZ�!�97��$ߝ�P�Z�A�Aj1�(P0��_x��Y4}������ʰD���m���T�q�rWݚ�M0�3>7���J�W��D��)����U5f�c��csp;���݉u�����%��(W�g�;f�����o�I;HO���+�%:%��Ɉ��ʍ�-\�V��\2&�2M��`5��4fU@AE�&���ǂ��X�p����.N^��c0;�r�c�d0� ���K��DU�30^�4��Yq�xD�vnKU09�e�d&����ݡE�_il���ϓ/�~��� +������r�ad�1�I���5�]^@�K���K��A�������t�������;�F��栐�[$z~; ��(����o���t�p�H��g*�Y��nӮ'�-��G�W7kk����d��5/n�W�wt�:"�L/�!DAA��*c����5n�x>�煌$�� + +�m|�'�� %kB\Nf��?��`(��Z<Lbׇ3�I�#ZF�H<���@�X�`ֵ�UA+�.�CFˣ�`��RY"u��ۄ��^��p���4ЪV3������e9�c7���2��8yYN=�V��F���(�P�$�q��. n�L����b��l&�o������o����$�I:cm�m+�Y�@|�r�\���� ��\�� f���������W/���p���u$Ok��cs]��JX�B��%��\$h鯟�j��=dJK~@ +�D0�lD(\=��>>ۮ�o� ��L$��n�i��A?B�����Xh|��m�k���qh�y �ҳ������/�٘:���D_|Q�� ��<�^����S`�DRtC��8���}�&�`�[2LU�O�ݟwV+!&+sD�2���bN��Mt��O#�Np��k���/#�ٗ��f� ��Nl"=� +oQ<�%r��nF�Ȃwԁ8�o�Xa�%�qB�,�`�r�(a��Μ�/��I�ܥ�{aa�ƾ���:�Fg1���;�@���B�jA�Q�Yvr?Wa�����h���"7iF�!8�I�0��s?�ݮ�?[�O$endstream +endobj +3023 0 obj << +/Type /Page +/Contents 3024 0 R +/Resources 3022 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +/Annots [ 3046 0 R ] +>> endobj +3046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.787 272.115 228.214 281.026] +/Subtype /Link +/A << /S /GoTo /D (gloss-mta) >> +>> endobj +3025 0 obj << +/D [3023 0 R /XYZ 71.731 729.265 null] +>> endobj +3026 0 obj << +/D [3023 0 R /XYZ 71.731 741.22 null] +>> endobj +3027 0 obj << +/D [3023 0 R /XYZ 71.731 693.235 null] +>> endobj +3028 0 obj << +/D [3023 0 R /XYZ 71.731 652.389 null] +>> endobj +3029 0 obj << +/D [3023 0 R /XYZ 71.731 652.389 null] +>> endobj +3030 0 obj << +/D [3023 0 R /XYZ 71.731 629.609 null] +>> endobj +3031 0 obj << +/D [3023 0 R /XYZ 71.731 595.666 null] +>> endobj +3032 0 obj << +/D [3023 0 R /XYZ 152.916 564.882 null] +>> endobj +3033 0 obj << +/D [3023 0 R /XYZ 71.731 564.173 null] +>> endobj +3034 0 obj << +/D [3023 0 R /XYZ 71.731 539.811 null] +>> endobj +3035 0 obj << +/D [3023 0 R /XYZ 71.731 508.927 null] +>> endobj +3036 0 obj << +/D [3023 0 R /XYZ 71.731 486.013 null] +>> endobj +3037 0 obj << +/D [3023 0 R /XYZ 446.273 470.237 null] +>> endobj +3038 0 obj << +/D [3023 0 R /XYZ 71.731 455.128 null] +>> endobj +3039 0 obj << +/D [3023 0 R /XYZ 71.731 432.214 null] +>> endobj +3040 0 obj << +/D [3023 0 R /XYZ 416.335 416.438 null] +>> endobj +3041 0 obj << +/D [3023 0 R /XYZ 71.731 404.319 null] +>> endobj +3042 0 obj << +/D [3023 0 R /XYZ 71.731 366.76 null] +>> endobj +3043 0 obj << +/D [3023 0 R /XYZ 71.731 343.846 null] +>> endobj +3044 0 obj << +/D [3023 0 R /XYZ 71.731 312.961 null] +>> endobj +3045 0 obj << +/D [3023 0 R /XYZ 71.731 290.047 null] +>> endobj +3047 0 obj << +/D [3023 0 R /XYZ 356.244 274.271 null] +>> endobj +3048 0 obj << +/D [3023 0 R /XYZ 122.507 261.32 null] +>> endobj +3049 0 obj << +/D [3023 0 R /XYZ 451.381 261.32 null] +>> endobj +3050 0 obj << +/D [3023 0 R /XYZ 128.577 248.369 null] +>> endobj +3051 0 obj << +/D [3023 0 R /XYZ 71.731 243.199 null] +>> endobj +3052 0 obj << +/D [3023 0 R /XYZ 160.936 230.436 null] +>> endobj +3053 0 obj << +/D [3023 0 R /XYZ 252.253 230.436 null] +>> endobj +3054 0 obj << +/D [3023 0 R /XYZ 324.163 230.436 null] +>> endobj +3055 0 obj << +/D [3023 0 R /XYZ 74.222 212.503 null] +>> endobj +3056 0 obj << +/D [3023 0 R /XYZ 71.731 187.432 null] +>> endobj +3057 0 obj << +/D [3023 0 R /XYZ 71.731 138.615 null] +>> endobj +3022 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3061 0 obj << +/Length 2835 +/Filter /FlateDecode +>> +stream +xڥk�۶��� +�_B͜p|�ʗ����%�$���I���� +AFQ~}��y�ێ��b ,�V0��_0��E0�K�ɬh���V���b!$��7Owo�h�T�4�=�gq����B�'����{�ۙ��~�/���^+����7�揪�5�� �^�c�{?��電�?M$Q��y�I&�5��KwY?WQ��������W��dFj '�ͲL> +.=� ���@a +� ��s��9\J�5�/oV薁�P����Fh�հe��^��+��\���>�2���ij<�j§�Mo����5�'���g?�Wz��$��O�������s�TXU�|������ۛ�L������2 ���E�8�lG�� �$�8�8,Ƚ�ʪu�%����㲲C_��!���\��a�~l-Ӹ�~���͇��P�x=�}+!�d*��e|n;����zS�V6�u�`�n�VF�\�]k�Q/� OJ!� Wmy��wx�иQ�tp&���_k�Y[���Y�B_PUc���1(O1�S#��p���g���掫�g�tf��j�%a.'K+��w�)�y����]�M�Iו +ޥ����q�/��覷�_�Ǒ�����0�, +������)�3)(b-k1�\��r�MJ� c'K�z�w�}T������������ �#���m���@7ae����`�}���n�ڛ��U݂ �H� Fϔ��/6�/=�y$L�)�a[٭A�Js�B���H�anz�pxG{�s`�<qoDR'A+H�*��7���8�F�R�� υ��o�m�����t1�(Xb��t��,}���J�W��V��xғ��6��>E|�x���T�&�N�1 +b�0=�0N�66�ᣣ 2-$�r n�����s��(ّ%�x�2:�'tb�9!!F�C���%`u�L��[l�����Y/\�C�n�R4�#�%�FQ���Z벡� +<Pw�<�z��j��.z�J��A�5��Ç����� +#v����W�GR��A����Wh����Z���ٲ�ąQX h�n��ߦmU0HF�`'�L0'��k�����P���i������h�}��Wv��q��Gg������Xvꗯߎ��(��Lt��=y���J�<Ɩ�d"�xHX8C1�q`2�#�/Ѝ��G��~/��S�y-R�FFV����>�G����� ��A_m͍Wn ���ո���ݪ6�=�`� ϓp�j?#�F�O����\b�j=�H�5�� lG1�,8�3}�%t���rZ�D��FTF�� �D�Z�99���k����4��㔞F뭐lLkz�4���<�F�ôi�s*9�-L��S&x����H�~��9���S?H+e(�E��e�.W��ƶ���?G� � �=# +�VAj+'�6��\��*I\�$�{�ta��,�üg]���;�;xT�#�Ѻ]��Da�|8�ԉ8 �P! ��� Oax����j}`��ڸ�`�B�1��H�)Z Lz�;9xӑ���+_��3�86��yPL������ �`�?:D��hq�0k)�C��mt�'�춻��%*�S��0�|x����4�Ϊ5�'}� �I��;�� ���}W��)9߹��q +��ex(Y{��9]ڇ�X-�CQ���ԟY;��}�p]�[#>n��(%����o*�e�=��U��e�u^�A��0%�\����z��x�C�У�.#,J[�>8q,(I9@�������K��"��<Y,�s�[lzp���J��W���a��Φ���&� K�C?�\=�H�&��A������Z����!���~����C<GO挗|�����r;�S.� ����P�W�[�^8��P���]�K�H] �RĎ�Y����An���T���yĞ���G����M9�+�/ �X�p W%f�*� �]�k�Һ�\[[�TA�����Ā<�E�*��v����?+���7��o���!q��R(V�Yof�w利@��2��O���ݍ-��E�g*��F��n���@E�H*��ċ}���{�?A���\�KQ�J���b�Y6Y+x|i�eS�p��h����v��+s�C�z�.YSp�&�\�K=5E=��j!^ $'r���in�҄oLIP���<�K�)1��u��y�{��z�2BC ��|�g�j+�l�w#yN���Y�Z~����])U��Of'��?�C�����r���Q�S�JT"�՝^&*��Y��#�`ɟE�w���>�C[l����8kn�e�;�^RjQ5 ��,7c=T;�<� �YC +��cS �r&�q�CmP���X����J��������9�0F�F-9�~��r��D.ܙUq��M'��;����%���o� ��B#?��}e�z���>oXb�)�f��I!͓�B���u�pUY�5�X��q0�J=�=uv�@��)Y�� P�O�5SK�Xù_�93�~�d�P�Zn�!t�����`ub'e�C~� +P�9�wmz@�p *�}�Ն�_Zz4?,;9���� +�o�=���C2|Yw��g $j/��t+)�*���X�P�qY�˪4Bؤ�U� ����Ɋ�~{$u�������n��x����u�Ot�4b������ό��bA��d�ת,-0z4{���E)���d�dE�$C��>/(>�3vM��yM0���'��8�Tr�4��qR�� +gV����I�K�N}��կm��� -�]����k�\�Lt��W��� ��/�G��X,sC� ņ�K��^��Fk�endstream +endobj +3060 0 obj << +/Type /Page +/Contents 3061 0 R +/Resources 3059 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 2945 0 R +>> endobj +3062 0 obj << +/D [3060 0 R /XYZ 71.731 729.265 null] +>> endobj +3063 0 obj << +/D [3060 0 R /XYZ 71.731 718.306 null] +>> endobj +3064 0 obj << +/D [3060 0 R /XYZ 71.731 696.359 null] +>> endobj +3065 0 obj << +/D [3060 0 R /XYZ 71.731 673.31 null] +>> endobj +3066 0 obj << +/D [3060 0 R /XYZ 71.731 629.475 null] +>> endobj +3067 0 obj << +/D [3060 0 R /XYZ 71.731 606.56 null] +>> endobj +3068 0 obj << +/D [3060 0 R /XYZ 129.491 590.785 null] +>> endobj +3069 0 obj << +/D [3060 0 R /XYZ 220.1 590.785 null] +>> endobj +3070 0 obj << +/D [3060 0 R /XYZ 265.018 577.833 null] +>> endobj +3071 0 obj << +/D [3060 0 R /XYZ 71.731 510.919 null] +>> endobj +3072 0 obj << +/D [3060 0 R /XYZ 71.731 488.005 null] +>> endobj +3073 0 obj << +/D [3060 0 R /XYZ 396.199 459.278 null] +>> endobj +3074 0 obj << +/D [3060 0 R /XYZ 236.4 433.375 null] +>> endobj +3075 0 obj << +/D [3060 0 R /XYZ 441.444 433.375 null] +>> endobj +3076 0 obj << +/D [3060 0 R /XYZ 71.731 418.267 null] +>> endobj +3077 0 obj << +/D [3060 0 R /XYZ 71.731 395.353 null] +>> endobj +3078 0 obj << +/D [3060 0 R /XYZ 439.947 353.674 null] +>> endobj +3079 0 obj << +/D [3060 0 R /XYZ 71.731 351.517 null] +>> endobj +3080 0 obj << +/D [3060 0 R /XYZ 142.466 312.953 null] +>> endobj +3081 0 obj << +/D [3060 0 R /XYZ 74.222 264.937 null] +>> endobj +3082 0 obj << +/D [3060 0 R /XYZ 71.731 239.866 null] +>> endobj +3083 0 obj << +/D [3060 0 R /XYZ 71.731 204 null] +>> endobj +3084 0 obj << +/D [3060 0 R /XYZ 71.731 162.222 null] +>> endobj +3085 0 obj << +/D [3060 0 R /XYZ 71.731 108.523 null] +>> endobj +3059 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F35 981 0 R /F23 793 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3088 0 obj << +/Length 2246 +/Filter /FlateDecode +>> +stream +xڕkoۺ�{�Q���Ŋ���`�C�,��� [Rtú�D�B��(����;��P�l9� ����~�v&s�s&�c���v�$���'[����a���z0����{�di/��y3������Q�N��[�JI�c:s���ަ�y'i���7�2A_�S� ��Sn�}��翼��s�A���2�^e���r��4��#��}����F M�L��J�E�&�g/���|ܱq��� t��`A��DC�REccT �J��ݗ���2u���u[��X�CP��P~�s^ZF��yx�q� +k���3�l怶�~��?d^NA���?9@��S7�^�hU�Fd}�--���/���c{�K����H�(״�� �G�J� .od-�X�vX�}��'3�˺�L�:�f:�ݷ�"�����ȁ@o�h�۔��"��oS�G9�����5�d��"�lZ�&{ê,�:G�hU��%��U�~��]�������"�T;�����c��+&���j�˲�̣(� �^�8Z�0k�F�5�q-E3ԧj�F�3I�����}�hq���C�$e�qx� ���e���'�»�������n�c�C4��bk<�� �F��r���Ǝ��0�����h����s'c��ژ��"ת�U��/�i`��;ޝ�9Y���0�P��"`!r,��%�ClؾliB�I����`72� K;��2�h�1.t�mk0Q�_��o��h�;V3Lc�c� +5�`��̃���:��{�Z<���i��� C�`QE���F��"q�Lh� �A�|� FC�3��C%��/_ϯd��%�����wj8 +u@З��o�x���;(�����u�� ;�N��a +`�K~Kc٫:�� \�EӀu�q9T ��e�]�Eh4�����g�9x�$�����8-�1�>W�L�2���ӧ�r����,T���K�܀��=X@VL�,GђV�3�jM^��?�TYC�Bu�5��U�N�#^����+$��kZ�(�I�nw��XxX#�^p"<��f�=���ove����QL}/"����g\��� �'r�Շ�j������V �]�}ܤ�nᩡz�#� +�tTá��9Cc8t� س+F�]F�T�� +r��g|�!�Փ�d|j�'̉�2�f�M;TU]6"���q����D���T�Qǐf� ohC���|`<��OY �)�� ������6}��#x�/�Z�lt��&��j>�~�5V��8"��؉Z�`V5�:]�i�Q;�L��J!��cDa�d�vT���N�٤�.X�sc>oM"�q��yA�)3�=�^f�1���na����Un�.�]���e�6�֡!Af�(�0��IKմ�(ӎt��Zv�E��3�Ⱦ��+�U�����X��/�b�W����K��˶I��/�"��D7���rU��=�q:sʓ3�K�q�7N3����&G�P�1�9������@�ϼN�Y�s�����6Mg�]�T�77///�"9{YL�v\�7���s�9����U�u���+�a�k���N����^#o��#�៕����Ї��npA�ymr�W� ����+��*�?��ʪ.s����6���p�:��Af��8%��x��QE���4T�v��*�:'��m/��=�������e��{��m7����5���z�����*����>���n���w^�i��|��=P�����M�}�4���zB��P��ê���k�Jr)�Ř�7p�k����a�5�6Lb���;dh�c�]� ���T�����ʱkWw�st�R��� ����ì�ZV�R�#~3雑w��w�O�����Jp�z�B^~!����p^YuݞnKu��:�*���H+}��E��kkRK��cz����4��ѵ��f4lK3R7�)��V7���d�V�ݔ�xa�a�Xˍ�M|�ԗ]������=���nt�DK�ZLp]j��+A�J�I�~~�s1q:���;Zx�}�{����zozpcN�:��g�;�fhWP���7�^k�C���;z�c����С[#��b^"|�>zO� �е�լ�����T��<�F�!9�M���FIo�� D���@����t-� z��ۤ��� ��%�^U��'��FhU �<�`橧��4j�����0m������,~dGN��OJ��_�7��A�o=�s?�R��e��endstream +endobj +3087 0 obj << +/Type /Page +/Contents 3088 0 R +/Resources 3086 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3089 0 obj << +/D [3087 0 R /XYZ 71.731 729.265 null] +>> endobj +3090 0 obj << +/D [3087 0 R /XYZ 71.731 741.22 null] +>> endobj +3091 0 obj << +/D [3087 0 R /XYZ 71.731 718.306 null] +>> endobj +3092 0 obj << +/D [3087 0 R /XYZ 71.731 696.359 null] +>> endobj +3093 0 obj << +/D [3087 0 R /XYZ 71.731 673.31 null] +>> endobj +3094 0 obj << +/D [3087 0 R /XYZ 71.731 655.377 null] +>> endobj +3095 0 obj << +/D [3087 0 R /XYZ 71.731 632.463 null] +>> endobj +3096 0 obj << +/D [3087 0 R /XYZ 71.731 601.579 null] +>> endobj +3097 0 obj << +/D [3087 0 R /XYZ 71.731 578.665 null] +>> endobj +3098 0 obj << +/D [3087 0 R /XYZ 71.731 531.905 null] +>> endobj +3099 0 obj << +/D [3087 0 R /XYZ 297.791 519.054 null] +>> endobj +3100 0 obj << +/D [3087 0 R /XYZ 71.731 507.651 null] +>> endobj +3101 0 obj << +/D [3087 0 R /XYZ 74.222 432.877 null] +>> endobj +3102 0 obj << +/D [3087 0 R /XYZ 71.731 407.806 null] +>> endobj +3103 0 obj << +/D [3087 0 R /XYZ 300.601 392.03 null] +>> endobj +3104 0 obj << +/D [3087 0 R /XYZ 71.731 387.382 null] +>> endobj +3105 0 obj << +/D [3087 0 R /XYZ 113.574 369.116 null] +>> endobj +3106 0 obj << +/D [3087 0 R /XYZ 71.731 366.959 null] +>> endobj +3107 0 obj << +/D [3087 0 R /XYZ 113.574 351.183 null] +>> endobj +3108 0 obj << +/D [3087 0 R /XYZ 71.731 351.084 null] +>> endobj +3109 0 obj << +/D [3087 0 R /XYZ 113.574 333.25 null] +>> endobj +3110 0 obj << +/D [3087 0 R /XYZ 71.731 331.093 null] +>> endobj +3111 0 obj << +/D [3087 0 R /XYZ 113.574 315.318 null] +>> endobj +3112 0 obj << +/D [3087 0 R /XYZ 71.731 313.161 null] +>> endobj +3113 0 obj << +/D [3087 0 R /XYZ 113.574 297.385 null] +>> endobj +3114 0 obj << +/D [3087 0 R /XYZ 116.065 297.385 null] +>> endobj +3115 0 obj << +/D [3087 0 R /XYZ 140.075 297.385 null] +>> endobj +3116 0 obj << +/D [3087 0 R /XYZ 214.923 266.501 null] +>> endobj +3117 0 obj << +/D [3087 0 R /XYZ 71.731 254.381 null] +>> endobj +3118 0 obj << +/D [3087 0 R /XYZ 71.731 254.381 null] +>> endobj +3119 0 obj << +/D [3087 0 R /XYZ 71.731 231.602 null] +>> endobj +3120 0 obj << +/D [3087 0 R /XYZ 71.731 208.553 null] +>> endobj +3121 0 obj << +/D [3087 0 R /XYZ 71.731 179.726 null] +>> endobj +3122 0 obj << +/D [3087 0 R /XYZ 71.731 154.755 null] +>> endobj +3123 0 obj << +/D [3087 0 R /XYZ 71.731 123.871 null] +>> endobj +3086 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3127 0 obj << +/Length 2288 +/Filter /FlateDecode +>> +stream +xڝko�8�{�`Q��m�u�ȶ�&���%�.��-Ѷ.�hHt���g���4�C�����<d��?4��iC0w�$��+o���__��1a�I痻Wga8���$ݭF��3��,Fw����v+�,O��s�]�6�&��������~윏#����ϻ�Zܵ��ԝ���2iq�rt\�c7��Io�Qd�������]�1�\��2�\�.�ǹ��j�kd��s�{�jh�,�F������ jE�-ʉHS��'|��wZ�������F���y�mP�W�.]����Ξ�3%�j�;�����LR�h�|= ����(�h�"O�����"۔l����hvEIC�\�ly@L ���s�]]�J��@S����X|̰0���p�3n�h�� �WMJ��M`��qi�p1�Q;Z1c�:�k�v�M�Qy�PcC�B�ٴlYY;u�Q�YUzc$�d�>%0[V���D=�c���(v����'/=�2�8 '$� ؞'��E��v�o �x���z����9�ճ���Mh-�M 6t�u�3�� ��O3/�M�U���Ah8?9�<�z<r�Ӫ:O�+�=C�����������=��8l����Ѫ���ҭM��3�0�sd�fh�����=� -3��=_ć�Ӭ�2�-�[����)��@}%�2�8&@߆��H��a$6��TTm���n[(a��B'݃_Wk~�euk�:)��j�k.Z��s��RX���>��Q��=k�Vo����L�,<ԪZSؙ�<|�.���9���=��D��:������(h�G�x��h���W9Zx���(�>9N���JU ���@���\oh���j-`ʙ���ۻ�4�X1�A���3\���ްJ?Iݤb+A +�G�V�Zi^S +��%�d}'�ȗ��5�"Ra?E����䬗mR4�0�H��L�����X���:0��-D��Uھb��8�>�]ӽ}��(WU��L� T��ʼ�]m�_���Oy�O�T�M����.0+$�8�ΝZn����ٟ��U���:���������T�lk@����/�g�m��y���{���aS*�����FT���Fz� `����!���&/�h[�=���S���U�X�^���m�fE[L[��k���Ol�Z˗�d:�Z�)N�Gh_nq�f�&lS�&��fq{���9_�OiO�rg_��7WWG��}�����{��mf$#�z�0��S?f �V��`��x��*b�o�a�d��0��h�3=)vH�a����͡�ؙ�M�(����ݧ����j;�*WEG� @���N�b��=]k�x�_@1�1|�C��l#�g|F9�h�� ��kL��B�����ĸgd�6�nIת`����u�}IԾ��i�^�w[�R�أ��>Ѡ���?Q4|�q#�sJuQ�n�}��nM�NpЌ�Fm}��r�ȓ��r��f�A�$O��OH8��T�a�l��V7�0��$�x���w�$?j�A'���g�d3A4&��EȊ �(`���{���Lc��?UA?�E��k�ox])��e�����V���q��ӁO���:��L�%@ B����_�}���ڿ����=6g����)0~^�x]���K��-�rm����N��V�� ����8�e��ƀ����8=�d���W-��I�� �T8Ȉ3��7�K�ޣ<�>����S>㿜Em6��m�k���{�5�"�+�ζ�X�BV�j��?U=_��*�H�VR��|���٭�TCT,�4[*��\B�<�.Y�,˥�2F���L2I����������AT��Q�ګ:A�}����ź9�(|�F��\�#[:���-{|HTss�ͪ���^��ĉ�����$�`wuA�J)�����=w�N�Y�zHi:�tq}�8wI�G~�NVr�s�;�5�ǭx~���}昽�q����H|�9�D&Go��>=9�b���K�<�:T����,×4�Y��ޔ�#Π1S%4�ث�ڄ���]�E�7� �o�������9���� =.i�s����c�ۺ�4��1j�p�//�����Hf�:�]U�T6���m$���;�I���B�a�c23�Ua��W��AV�W�&VImAV�zͪ�$s�4��ၟ��B`6L��ɡ�h5���4���j�5[���^��M�=V������X6�r�^�Fs�槦������ E��B�y�;��j��u�5�N�f�̟~����� q0s��A���� ���?Ǥvcendstream +endobj +3126 0 obj << +/Type /Page +/Contents 3127 0 R +/Resources 3125 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3128 0 obj << +/D [3126 0 R /XYZ 71.731 729.265 null] +>> endobj +3129 0 obj << +/D [3126 0 R /XYZ 71.731 693.235 null] +>> endobj +3130 0 obj << +/D [3126 0 R /XYZ 71.731 659.861 null] +>> endobj +3131 0 obj << +/D [3126 0 R /XYZ 71.731 624.663 null] +>> endobj +3132 0 obj << +/D [3126 0 R /XYZ 71.731 601.749 null] +>> endobj +3133 0 obj << +/D [3126 0 R /XYZ 71.731 570.865 null] +>> endobj +3134 0 obj << +/D [3126 0 R /XYZ 71.731 547.95 null] +>> endobj +3135 0 obj << +/D [3126 0 R /XYZ 71.731 517.066 null] +>> endobj +3136 0 obj << +/D [3126 0 R /XYZ 71.731 494.152 null] +>> endobj +3137 0 obj << +/D [3126 0 R /XYZ 443.356 478.376 null] +>> endobj +3138 0 obj << +/D [3126 0 R /XYZ 278.259 465.425 null] +>> endobj +3139 0 obj << +/D [3126 0 R /XYZ 71.731 401.5 null] +>> endobj +3140 0 obj << +/D [3126 0 R /XYZ 71.731 401.5 null] +>> endobj +3141 0 obj << +/D [3126 0 R /XYZ 71.731 378.72 null] +>> endobj +3142 0 obj << +/D [3126 0 R /XYZ 71.731 355.672 null] +>> endobj +3143 0 obj << +/D [3126 0 R /XYZ 71.731 316.882 null] +>> endobj +3144 0 obj << +/D [3126 0 R /XYZ 71.731 166.435 null] +>> endobj +3145 0 obj << +/D [3126 0 R /XYZ 71.731 134.102 null] +>> endobj +3125 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3148 0 obj << +/Length 2255 +/Filter /FlateDecode +>> +stream +xڕY�ܶ��b�R-z�%Q����+����Map%�.c�����ۿ�3굯s�"�C�p�?�y�{��sb?u�(\d�W�b+?���mX� �ۧW��1�H�4b���E��N��0�IB��ۺ�kQ�����Cs���4x�m�+�������B�n���W�y�˫��A���N���J�<�Z���i�D����� ��1q|Ž~��#�#?����-oI���w�n�h�sY�\(H�Fn�f_Y����ߢ��m�=P��O+Z�ae�ĵڭ ^�Z�,?��W7t�m[���QBKrv+ϪhX5+/�6�z!U�dyk�U��N�����o�Hwp���?�t������{�Gz�Ty��o�;z���o��]|'5^o+��g)��i�uM#ʳv����wB����ܓE��e&v��a����@����p��;2_�K�J�l�g;�|Z�&��\����x ��Ė(W��[ш�w��p�̴߶��E�q'0IU�a�O� ��9c�':~�Z(�F)FgVt�0����)Ɯ +�GMQZG��a�|^A��]�h�F�%1���͖�����c��:n`���wh�8Q �J��������,�뱩~Yk&+/��F�l��~��B˙����p����\�\�&UI�m�zS��nH�!�a����DBg��3}��=��0�u6qSr�\jO*1K3���0i'xS���7�� 2p�$�L}d��c���㟇�����fɫ�c +2������PM�Y5�=����N*�� �gċN����G�貄���֎,3�I�{Q�ڰ-m�^ φ��7^~��>����_�Ϊ��%���Ea�U�a]�I��`� �'�b�&�O�3E��l�Q&(?F]ld�F�F�C��h厷�8`�=�?���2�ru&� 3u���L�<��M����(�`FN�x:"E����� ��*��=�m��9V7ݩ^C- p���oh�vӕ���ɩD��N]ܜ�*J'�j:�鄰/�0�jl�='��\ �!�(a�^�\�5o�N�ϖ���AU/4| �<:U~-��z�/a4�[���0d3ނ��-�FX��d.����b�+����]4w�˜��A�:�;�z{¤����G�ͩK��y� ������(��.p�3����D�� 5� y���c:�?�:|��m���!؏��4��p�N����='I�,K�sѥ'< +��td��RÃB��.=�.�&5Q0��.*�����S�Q���.�L�?])u�3�r����-�O�aԫ����.'�0���9y��N��Y�fT*&�2?��X��"+[F`�$ 9)!��M��3��\]p`.�ㅪ��X��I0�`,DV�cp��q<�w���� +�}Җ���{(�a�kvo[�m��.�@o(!\ï��8�"Rk q^�b9b��֡��>Z�����>q�=��D��9XY#�*kd�J����͇+��k��Fo@ �d��u�k4Pv��qCt��a��;�Fԇ���.[�@�M +ɭ��� ��V��������*�����/�}c�wQw�>��/�^#�\fԻ����-�������w��e>�W�\*N,�(�� �����Y���tF����x/r� ���+˪+u:�Ĕ'�R����Fi���a�Y���_i�k{��^������_ +l�x��i�PU�)%��*6�)J�xN�<W���j�A KѪ��©�56M� +�ź��B�xv����ɣ�@��6��4�/��6U��А��l�j�� �Ln�A����J8�Xg�gL�O��z*H�r�_��D� m�o��#����/TE��D u6t�Xn4���i4<Z����ٍ���|T����ˮG�#�[���������Y72]�:Ã����T�Wd�5��cq<��>�' �xxԐQX����Ɓ�{�n U���*���r�(n��B�L�J��y'�w��v�}���hT��R{�<��:bF�k�3q���UCh�u!�~{SB��� T��o��x����z.D�3'�bq5R&L#����#匸�#�x��>`����\a��bS�⾺���j4#T0Y�ڣ��dnF����V�5������S����٥� �z��F��jQ�=CKv�p����깥�bC���(L� �<��������N0����B�8�_���r����O��AE"�ҟN%�ZXe�endstream +endobj +3147 0 obj << +/Type /Page +/Contents 3148 0 R +/Resources 3146 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3149 0 obj << +/D [3147 0 R /XYZ 71.731 729.265 null] +>> endobj +3150 0 obj << +/D [3147 0 R /XYZ 74.222 708.344 null] +>> endobj +3151 0 obj << +/D [3147 0 R /XYZ 71.731 683.273 null] +>> endobj +3152 0 obj << +/D [3147 0 R /XYZ 111.572 667.497 null] +>> endobj +3153 0 obj << +/D [3147 0 R /XYZ 71.731 647.407 null] +>> endobj +3154 0 obj << +/D [3147 0 R /XYZ 264.896 636.613 null] +>> endobj +3155 0 obj << +/D [3147 0 R /XYZ 110.286 610.71 null] +>> endobj +3156 0 obj << +/D [3147 0 R /XYZ 74.222 579.826 null] +>> endobj +3157 0 obj << +/D [3147 0 R /XYZ 71.731 543.861 null] +>> endobj +3158 0 obj << +/D [3147 0 R /XYZ 206.128 526.027 null] +>> endobj +3159 0 obj << +/D [3147 0 R /XYZ 71.731 497.968 null] +>> endobj +3160 0 obj << +/D [3147 0 R /XYZ 71.731 475.054 null] +>> endobj +3161 0 obj << +/D [3147 0 R /XYZ 71.731 470.072 null] +>> endobj +3162 0 obj << +/D [3147 0 R /XYZ 71.731 467.582 null] +>> endobj +3163 0 obj << +/D [3147 0 R /XYZ 113.574 449.315 null] +>> endobj +3164 0 obj << +/D [3147 0 R /XYZ 288.626 449.315 null] +>> endobj +3165 0 obj << +/D [3147 0 R /XYZ 293.05 449.315 null] +>> endobj +3166 0 obj << +/D [3147 0 R /XYZ 71.731 434.207 null] +>> endobj +3167 0 obj << +/D [3147 0 R /XYZ 113.574 418.431 null] +>> endobj +3168 0 obj << +/D [3147 0 R /XYZ 388.75 418.431 null] +>> endobj +3169 0 obj << +/D [3147 0 R /XYZ 71.731 377.42 null] +>> endobj +3170 0 obj << +/D [3147 0 R /XYZ 113.574 361.644 null] +>> endobj +3171 0 obj << +/D [3147 0 R /XYZ 71.731 320.633 null] +>> endobj +3172 0 obj << +/D [3147 0 R /XYZ 113.574 304.857 null] +>> endobj +3173 0 obj << +/D [3147 0 R /XYZ 71.731 289.749 null] +>> endobj +3174 0 obj << +/D [3147 0 R /XYZ 113.574 273.973 null] +>> endobj +3146 0 obj << +/Font << /F33 896 0 R /F32 807 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3177 0 obj << +/Length 3051 +/Filter /FlateDecode +>> +stream +xڍYݏ���b�/�lŒ,�n�\/-.HڴY�(�>�m+K +%������J��i�V��p8�o����CY�O��4y����G���]��4 �$����*��`��V3��}��(~��A����.�8�������붵uQ���C ��U�p���*#�Gӛ�� }����}�Ҕ���`%�xdY������wB��L�QlR: �<��ܷɢh��l�^ gMU]h�Y��J�7��[�maz[�Z�'Yqn���^Ƕ;y�fP�e}x��LgӗM-k�{�!�,ZP��?��"�_��5Ԁ($Y,=��:g+��s?����0�D�Sw*�q4k�BgCR]����9�.�E�0�[�Na�I��+�em���wR�~]0r�c��ѠaDaBvZy��qn3�C*�<\��(�?��5�98�6��8����Yw��5�i�5� 9'��|-�-��/��|F���)#�ћ�^8�����Pu}�dW���%s������n��=S]��\����B�=>N&?�7Q�2u���"��&?�ۣ�YnB%�OF�]�.U��c+l�n�Y�8��Q�CԳߜ��n��.|II_��E�lE��N�dx�%$G���Pᨏ�bZ��;���`��E�5�X��t@��)q��^R�0d䓟L}T9pf|BFt��~p��&#��2wӜxA?����F��f�t'��t��(KT��s[Y������lP���?EQ��'� +u�ް:�WC�5Y6�lղ���d�v{��Ck�9wA[�� �d��$�f� +�ג\�P�)�r�칡����쬺��9y���5�7�j�fD���E�?B����Y�%�r6I�J +'���Eb��ϩEh��xiN6!7�~%7k��O!�Twj(�_����� +k���� �4Hv>������(C�P�ȵf�ح���ΐ�p��zj�EN�e��)I�N�F=��[��$�Ǩ�����F��J;�W�h�_���u���FO67�L�s-�5q�}g���+ҠJǩ��Nw��Ld��/W0|U ��x�iC��J�=�g������6�ќ�ێ���� ��w� Y�ч ����_��/}�V�Ou���M��E���9�x�,��8��Q�u)Ј�x��|�oUl@�l�I0� ]�9Gv�)��X�t�1*�G��s|J`&����eY@{�����N�˾-��5�5U��H��8�䤋A_ֳ����`�c�0�R70�U�� �N�l�Y���6-��iea4�_�ʞ;n$XtK�*�}���٫K�Hg�N�M9����(�67X@���i�<��1��Lv�|�MS����tC��i1E_�A�Jv4��HIr�t<m�N���JE-u�Fq4M�3�:J�!���Z����!rP/a��sF��}� (E*lɡ�;L �dž��$�Μ57M@��7�s��;H��d�*(j{ 4�� ����a#4�t��{=VW�;6�|��qg7�*��-W��J�������N�՝���"?�� +mH!�>��y!���G���g��t��=I�,�]�=~o�>BT�7��yu*K� �>�1�;x=���iV<���eL�#��0>�_-���n��x��(�����X�v|��K���*M����#^�d%H\9��r���;�yBX-oۂ�>ڽ��Tw��0����P���-����Cx3ixc6���G<)�x�D5 ��f���HɏCJ�G��V��ѫΤ\3�;я֠ ��Jrf%`<WB4Rx%��k �ϥB�2���N�h�'O(�������N����؊,|Clg�J����I����fB)������f�e�^����� 6> S�$�)er�#D���+����W%{���� +-��ک�"N��I��6rbIᨣb�����bg����A�X��͗v��ܻQP*�2b��pa��^��v:��dN*����c��̹o��k�)��y�iH�{��u��2n��Mv����uz�ފvѝ�P�>�Jp��V�2�{ �ֳ3qh\�L{��!sCQ�F����O^,t=2����A��i��y�n�Ť3�%��:�>��B��o�!'�H�R"�.��E�sI�&O���c ��#cZ +:�?�z��)���]���Ԙ�og���$a3�4�,?�X� �k=Nn���mP�{{'���u%�v[}P����n�t��t �1 +��4�U��~�� M�+v+!LJ'��h��8:\V�����2������� +�lK�M�~�Sk�E���� ��W���z+����;�鍗h�oɘ�[�#+�hK[]"/}�I�(+�t2��88��0�&&zm��п�F��`����R�u�g�7vΫ�G?������7�&��8�鋫��'5Ca8��a����!�y鄌|�����g�& �1�[��RPz� +C��F���$4�7���X(�~FG��-��pMsd��IH(�Sc8Ʌ��u��q�y�?�_��&:{S)�Ob������<�}3�o���:��8�o����6�}�x�R��Nο�a��{3t�ܱ�����肻�/\����s�)$6�2�в�1.k�h�y(���|wڑ/W��]'^Də`v$�ɓ@�ZG���`Ă�ZR`}�羡��DWL�s-~@���V�X�|�;١��)�7�݆�BOOzBNO�e=н��g�~Cͦt +��:P5�p���#��j�\�b߿���dx��^7�=ʺ�2��;��<ũ4���^H�}yL��σ�J.E�����P�M�$�Nl��^�j�*�r;Iyۥ9��+)�hG�i%Uv�ID�QR�g�q:��S���E�t*�d �r(2ƭ��K �Z�P��,'��e�Tw�<������fN��=��_�v٤ ��(��|�� +3Y�#xݬC���rs�1�m��Q�Y�{W�秭h0�j&�¿xԇ���u�Z�ӻo�������6؆��_��b5��o�hdǧ�$���3!)���F����͘/bendstream +endobj +3176 0 obj << +/Type /Page +/Contents 3177 0 R +/Resources 3175 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3178 0 obj << +/D [3176 0 R /XYZ 71.731 729.265 null] +>> endobj +1211 0 obj << +/D [3176 0 R /XYZ 71.731 718.306 null] +>> endobj +514 0 obj << +/D [3176 0 R /XYZ 417.262 703.236 null] +>> endobj +3179 0 obj << +/D [3176 0 R /XYZ 71.731 692.184 null] +>> endobj +3180 0 obj << +/D [3176 0 R /XYZ 71.731 671.525 null] +>> endobj +1212 0 obj << +/D [3176 0 R /XYZ 76.712 634.876 null] +>> endobj +518 0 obj << +/D [3176 0 R /XYZ 372.275 589.622 null] +>> endobj +3181 0 obj << +/D [3176 0 R /XYZ 71.731 577.184 null] +>> endobj +3182 0 obj << +/D [3176 0 R /XYZ 413.928 568.063 null] +>> endobj +3183 0 obj << +/D [3176 0 R /XYZ 86.396 555.111 null] +>> endobj +3184 0 obj << +/D [3176 0 R /XYZ 71.731 547.973 null] +>> endobj +3185 0 obj << +/D [3176 0 R /XYZ 492.055 537.179 null] +>> endobj +3186 0 obj << +/D [3176 0 R /XYZ 119.624 524.227 null] +>> endobj +3187 0 obj << +/D [3176 0 R /XYZ 522.491 524.227 null] +>> endobj +3188 0 obj << +/D [3176 0 R /XYZ 71.731 504.138 null] +>> endobj +3189 0 obj << +/D [3176 0 R /XYZ 71.731 504.138 null] +>> endobj +1213 0 obj << +/D [3176 0 R /XYZ 71.731 473.254 null] +>> endobj +522 0 obj << +/D [3176 0 R /XYZ 424.368 430.156 null] +>> endobj +3190 0 obj << +/D [3176 0 R /XYZ 71.731 417.718 null] +>> endobj +3191 0 obj << +/D [3176 0 R /XYZ 71.731 364.662 null] +>> endobj +3192 0 obj << +/D [3176 0 R /XYZ 71.731 292.866 null] +>> endobj +3193 0 obj << +/D [3176 0 R /XYZ 71.731 261.982 null] +>> endobj +3194 0 obj << +/D [3176 0 R /XYZ 71.731 194.301 null] +>> endobj +3195 0 obj << +/D [3176 0 R /XYZ 71.731 162.076 null] +>> endobj +3175 0 obj << +/Font << /F23 793 0 R /F44 1379 0 R /F27 800 0 R /F35 981 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3198 0 obj << +/Length 2193 +/Filter /FlateDecode +>> +stream +xڥXm�ܸ ��_1�~�����g�h�]S���!�ES4�f�[ۚ���M�_R�l��nZ4��E��H>�&\�.���c�D?��EѾ +���W!s��e5�y�}u�>��ŋ�~oR?�<��u-��?���������*J�O�m%�0<��nA����� -���~��O�р4���:~�F�sad�OF��k?Nk�_+P�^�^�`��O�`J�z"i��ȚG5�R%Eonq�ybZ��� ��rڢe�'�vhwM�=���Q�[fG��Y���2\{�����G7L|B�X<4�m'�+�s�ծ��� ���2� �3��*�� ����(�>����䰵WT�{�w����T4�V�F�M���T�4����+Tg�n�%�"�_�n'{����t�G�y�LS�5vʰAJ��]�����4��O+�����2 +�O�0��t��e��24��@�$�#��$��������U��c���c�7�,��H��[��0Pd��)]0��qۄ�}���"�ܡ0}K̙�&Tu�C +GX�u��s��{Z�;]�lW��8���;)�J�4�E6��\W��;�llߎ$�~N⸀5Us�Du�J���xߋVԅ�U=n.�N��8S!�c2u[ 2��8���K\X%�Cg�^�b�ٰ̜��dӛhjO$�Z>�]�@��Bʪ���+pwɒ�ܱ%;5�v�[dӮa)�ڏA���x�%����t�'t��!z��B5C���|Dc�ph�N�N�X��U�����م!i��|Dm4��}�F��}�E���f�`i���,}�G~�Z����K���&t]h7s�~�V�=�'�|���DR���[�<$#z" U��m��ўwe #��X4�l��]�?�*A��;�h�+6�/�?��ԣ'p����L����{�CV<���D*�Y����9fv⩾����}�Z"2V$�ߗY���~�%B� �g�H ���L�)��=t8�%��y���C�M{<�S���r��}��@�F �$HL�<.z���2�=z܈� ��>�����B���ހ)�O +�_��ΐ�Ik�ֽN KU��L"a�V����{z���o����Ew%��ٖ;�l��_q�;٨�C���3.-w�vL��A'%�*��ʼn$���N�������J�ge��:e���.Z�,/%4��ϛ�|���zA�_�C�e5�l�N�����?˒k�ο�n���3��-�ؚ1w�,̩W�"���k��8]�A��Yy��w�Mڡ�7��,6ވ%f, $M�g���� +*������Ȥ81��3J�U��i{BN~Hi�H��Eb��wZ����4{U���O�5[�+�J�n�|a;��n�k�0o�"���W���n(�*�b���Z���9Ҭ��bS�y� ��7$n+�4��G��V^�e �\Z[�O��a`F�QL�lL3�8-x0� rL�gcfS:��R�4F�@�%����e�@7�f�OW0̊�C6q��P�(|d���9tT����_� ��-m��/cI�/4j8����=0{���E�d��%,���4B�m���B3'lGp뮜�E�?T�wn����}��{*�إc�*�Gm$�z�s�o2?�D/B��9ht,h~�4^��Eh|I��X�=b��]Fb���� aN��ji6�%�b��G.�S�G%��/�k<���v�3�}{^6�n���ï�dlp>h�ep��� OK�6��E�4��n�va~��:�� �EEf��3d!8����DO��j��>�9�U)��3?���;}�X ��~?�Bȴ� +O�E��N��q6{A�7o[��E �W��a8G��:� +hA���8�8��J}�Z�:���Ї^�RWR�����y��S�=K���<f_\�(kn��������zm'�(��SB̽'>�7�(+����>]Y˾�S�����{ �7�l�_��v�<m��<o�mB����'j���;eJSDu: ��g�xٰ��A���ݹ�f�.��ܯ(�3�5d<�� +V�Ch�SK� bPR&|�����x\�K)?S+�e����;�9�4?_��e �\�0Fe�D��<W�N��������vq�2{Q,W����Jp�Aul���t�%:Y��0�G����7�4Z���́�����/5���)�endstream +endobj +3197 0 obj << +/Type /Page +/Contents 3198 0 R +/Resources 3196 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3199 0 obj << +/D [3197 0 R /XYZ 71.731 729.265 null] +>> endobj +3200 0 obj << +/D [3197 0 R /XYZ 71.731 718.306 null] +>> endobj +3201 0 obj << +/D [3197 0 R /XYZ 71.731 662.351 null] +>> endobj +1214 0 obj << +/D [3197 0 R /XYZ 71.731 636.448 null] +>> endobj +526 0 obj << +/D [3197 0 R /XYZ 287.007 599.233 null] +>> endobj +3202 0 obj << +/D [3197 0 R /XYZ 71.731 588.868 null] +>> endobj +3203 0 obj << +/D [3197 0 R /XYZ 445.066 566.157 null] +>> endobj +3204 0 obj << +/D [3197 0 R /XYZ 503.263 566.157 null] +>> endobj +3205 0 obj << +/D [3197 0 R /XYZ 270.523 553.205 null] +>> endobj +3206 0 obj << +/D [3197 0 R /XYZ 71.731 533.116 null] +>> endobj +3207 0 obj << +/D [3197 0 R /XYZ 71.731 533.116 null] +>> endobj +3208 0 obj << +/D [3197 0 R /XYZ 71.731 528.135 null] +>> endobj +3209 0 obj << +/D [3197 0 R /XYZ 89.664 507.377 null] +>> endobj +3210 0 obj << +/D [3197 0 R /XYZ 71.731 500.239 null] +>> endobj +3211 0 obj << +/D [3197 0 R /XYZ 71.731 500.239 null] +>> endobj +3212 0 obj << +/D [3197 0 R /XYZ 119.054 489.445 null] +>> endobj +3213 0 obj << +/D [3197 0 R /XYZ 147.008 489.445 null] +>> endobj +3214 0 obj << +/D [3197 0 R /XYZ 71.731 482.441 null] +>> endobj +3215 0 obj << +/D [3197 0 R /XYZ 284.172 471.512 null] +>> endobj +3216 0 obj << +/D [3197 0 R /XYZ 399.456 445.609 null] +>> endobj +3217 0 obj << +/D [3197 0 R /XYZ 76.712 414.725 null] +>> endobj +3218 0 obj << +/D [3197 0 R /XYZ 89.664 396.792 null] +>> endobj +3219 0 obj << +/D [3197 0 R /XYZ 71.731 389.654 null] +>> endobj +3220 0 obj << +/D [3197 0 R /XYZ 71.731 389.654 null] +>> endobj +3221 0 obj << +/D [3197 0 R /XYZ 71.731 372.47 null] +>> endobj +3222 0 obj << +/D [3197 0 R /XYZ 159.123 360.927 null] +>> endobj +3223 0 obj << +/D [3197 0 R /XYZ 304.466 360.927 null] +>> endobj +3224 0 obj << +/D [3197 0 R /XYZ 71.731 353.788 null] +>> endobj +3225 0 obj << +/D [3197 0 R /XYZ 71.731 353.788 null] +>> endobj +3226 0 obj << +/D [3197 0 R /XYZ 119.054 342.994 null] +>> endobj +1215 0 obj << +/D [3197 0 R /XYZ 76.712 307.128 null] +>> endobj +530 0 obj << +/D [3197 0 R /XYZ 259.353 272.658 null] +>> endobj +3227 0 obj << +/D [3197 0 R /XYZ 71.731 264.02 null] +>> endobj +3228 0 obj << +/D [3197 0 R /XYZ 71.731 246.59 null] +>> endobj +3229 0 obj << +/D [3197 0 R /XYZ 71.731 246.59 null] +>> endobj +3230 0 obj << +/D [3197 0 R /XYZ 106.501 235.796 null] +>> endobj +3231 0 obj << +/D [3197 0 R /XYZ 71.731 228.792 null] +>> endobj +3232 0 obj << +/D [3197 0 R /XYZ 234.877 217.863 null] +>> endobj +3233 0 obj << +/D [3197 0 R /XYZ 71.731 210.725 null] +>> endobj +3234 0 obj << +/D [3197 0 R /XYZ 71.731 187.811 null] +>> endobj +3196 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R /F35 981 0 R /F32 807 0 R /F60 1986 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3237 0 obj << +/Length 1360 +/Filter /FlateDecode +>> +stream +xڍXێ�6}߯0���V$ٲ�m�M۠)P�om��%ZfW]���"ߡ4��v�"��̜���̇�`�����W�,)�Yo~zPb�"�̇������l�mV��v?[l"o��g�E��Q8ۦ8��#-S�՝���|���@q���eyN�o?E���Iݿ��~�Z��b�m��M�Ff2���r�A[��[,�5�o�|��NJ5TZ&�Jw��K�4P>o���{F�4�{��#�UW4�:��:�-�F/g.P��>aY��4�+�߮ٵ�K�YJer�]˩T��j��m%)h�OE�] ���U���J�5��%_I�؉�K�|��o��#n'*$��N\i���q֙��0)�h{7�{����m>.! -���q��g*�wn9�I8R6O��s��Qqb� #�o���| ��D�Ʀ?)�U��1�SN%��g.Q8�yU�x+G���>b�M�#� �6QP�쨘���f�.<DY�ys�Yn��{�F��/(/m����矾f��x��~�D��o��1<a�m�E �(�T�{S�Y,���0�I��:���v�CUf���AUk(�G\x%,�������Q�������.�%�2��kbݍG��X�����OB*I[��+� �K��4'=���k�Td�!,�� ��p�}Ǘ5��E*Z[��=�6ȅ��V�8vER ~0y����9&�Y:������xf�00�jw}M�U�a��N��;�ڰ�ò�X-oy���M©�(]W1�fh��m�����2֦�@ʌ�S��Ng҄������=H@w�rx��$Y����2f+�&�$��&�� ���6�W[��c�D�!fJ��܉��n��n7�=�0u���ـI����<#Esf�s?3�|�@��3�#�4E^�"�\��Vހ��$L�����~��.O]���]%�)g��ZK���e*)��(XA��A�ʄf �j.v��$/yq�Qm�'u��Q�ř �RS���"��S��2X���oQ��C�.z�@�D�Lh[�-� �l/�`���X��y���z���mhO��|�&���S ��W�*�E4�t(~0C��e�U>1��(V���w&� +�0�������4�M ��¹�i��6E��% +���C/���0=��S���rt��խ��N7���<a~�����^��)�[K�p���_>j�q��J��4[�3`H� ��v�7l]Çk�{���8��#B�j���g)YV�t�ư�h�M̚�Nx֩�)e��(�MڈCӮ�|\;Z]i[A<�ʀ�9�{��aF��˗���W}��/c/�7�hEF�EDa���Q��\E�~S���^�]endstream +endobj +3236 0 obj << +/Type /Page +/Contents 3237 0 R +/Resources 3235 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3124 0 R +>> endobj +3238 0 obj << +/D [3236 0 R /XYZ 71.731 729.265 null] +>> endobj +3239 0 obj << +/D [3236 0 R /XYZ 71.731 488.966 null] +>> endobj +3235 0 obj << +/Font << /F33 896 0 R /F35 981 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3242 0 obj << +/Length 1870 +/Filter /FlateDecode +>> +stream +xڥX�r�6}�W�z�ԑXQW+�i&n��}h�ަi; ���B�v���� Rn;?��A��ݳg�3���8�,�c����� )�f�#�绫ح��%�ƚ�������6ڮ��a�خ���v�Ỵ��|�K��>�(O٧�t����"��˨��:~fyN�7D�q<�I�z���V�M��]<��t@�75H�uv-�K��X��$_����l���ٜSi!�*�|p�����ֽ�y�Zj�0���WŞ��YeD٧�p�Pq����Y{ �L�y�ud)��v��k����8�Իq� g�q�O��~���ig�����b<_��hꖈ��`SO�8O�$U�(�HJv�T���Q�N�ʁ�9���/�i>i�TO4+ya�o8G����ėaJJJ�ہS���] ��6F��|�CLJ�s�.�B{�?^�s��f�YQ%Y��=�cv�U�"�� +B���3����&�sl9�*(�6�]Zt��c�-7����5��� ��9wy�B58�qI\���4�G�-_��u�;\! ��;ax��� �?�볎�{,����^��'V�rԮ��^�K�����R QKI�>8��\�v��s����s�ֵ�uq�s'w�(N�A5m²�1+�A�9M�V_�6oD{y����1x#��T��a��L*�r2DFt�/��ݸx%{�/B�X�FQ���*���+|�8g�\�iJ�E��.�\�s�/��e;1{�i�"랷��a�mEz�.�u��K�f ��IWd���3�#���a���;���_�E ڜ�'��Φ�쎨|� ��F2�q?G�!E�w�T�Y�l:̣FJ�6��6�M:�˾��(��(��7�$���48XL�#�=CW��u��۪d����lP�k �K�IeO�2؏&9%u��N��}P�.��H��\M+] ȫ�N��Ʒ�[�2�4�;�o:����]�H�;d�����ӉY�@π4�]��A��Jצ�>�Q�v������/jR�'F�� Ϗ)� j�?<�����g��c�2���|Y��jk�[��3H���K�{B^ku�_�q�:b��͗�3���Mk��u䙲��j����P6�����F�%6�S��ȁ��B�f��;D�Q� �a��sG��x�)�H�_���;���d+�n�HS�u�*��T�Zr��kK����8����������8i��P�Π���tL����$T)�`!T)�x@� g_N�R�G��\h�OH>������>����'�CC��S/��K/3����������1�X���K��q\�a���[��.�0](����*Q=��j����ΦB�ze��g�du:��}I�AG�@K�h�۾��"l���c�F���L�µ�Ǫ$z:�]��3��ک��8�k +�Ȓ�Z��� +���g2؋�ܝQ�&sL&��ɀ34t��(k|a�������*��v��ï2��frvE�WFtR�ËK��tEA���4�s='u�MS�2�G~�L��~v�4'0(G���w��2,��Ck��� �&<K�^J\�|�p���m�|n�8\��_�S�y*xx&i[{���p����Q徯���w<[p��3���4a.��D6��rkN�JB���(��{���%��͈�WS,�rR%��ս��I�?O�K�nZ�=�֗1�K�TD��ay�:�z�`��6)t�ӆ6�z"�֞�Y�s#�!EC�,��������{_����_���o�Px'h/���4P�0ZC�ϒ4������� �gH�Y�C��Ƿ#�~���q2�>��-�KwW����6�<{�_/�\������E#\�/��wM�$���endstream +endobj +3241 0 obj << +/Type /Page +/Contents 3242 0 R +/Resources 3240 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +>> endobj +3243 0 obj << +/D [3241 0 R /XYZ 71.731 729.265 null] +>> endobj +3240 0 obj << +/Font << /F33 896 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3247 0 obj << +/Length 1230 +/Filter /FlateDecode +>> +stream +xڭW�o�6~�_����`k�a�V�lH�lkQ�eƊaF�-.��T\�/))Q�ct(�`�"�w�}��)���/�mo��0��u<K�vo~� `��,{{^�n��9�f�����n?���[���Mz�8���?���W��.��w^{�w�cXh���@꿟Gn�<"�ݿvoovƁ8�x�6z�G�g�d�霄@���(Q>k������Qʉ��3��[w����L�ǩ�}>VTn;��So2�������b�+7���5�����儽r�) + �m�^�����ܙ6�Dx��f1�g����X`�5����gw;��$��ď�K�� vp�������՞�%x�^+�� *3gg֤|��w(���N�"X�Еɘ0z�"��C���GiJ�T;3 ��j��=D �s�� �������^�sL�̊��f��h+�hվ�����(��~}��yعI�ܿy�ۄi}x%�#�P��s ��V",ߩq/pZe�9�? 3��t.t���9� y�M�H%IS���ywJz��{q�g�oahU��8�Gp�3��B���9_v���SZ4e�� ��8z,p/։j�5D ���:v�j���P��m�'*T��^�|0����h$�n'���� Bޗ6+���˼������?�\o��@��yѢf��d+X����pl��ŜK�����oGBN.E�\Bn�>�� ��B���$è�sP=�ZT�T��*ŋTs-=�Bd?� �LC����C����mU���Ӫ������w��1i� ڳ��-��e +�OI�g�tQZSƌe���R�1��/#lAJ2�����: ��%eV��|��آ��t�����U9����gG����U��1�5ѵ�Ϋbr��Z�zj(�1��z,g��u����qm�Vm� +u.a#��_G6�����\x��1��'Y�:��^"�O������X+*W�1"cZb�)� ���i���E����P��9�O伋��mr����w%��b5�#hv��5Xd�Rܭ���m0�3Qã)����*�n��͂�4g;Z#�b�����)��l!���z�?aK�'3''��e�:��ʔ�mz6�� ��l���m0�*�,�� ���L����Z��`,U�����2�Tp���ʠ`4���0J�6~9Q«��U-a8h���{>cW�!ؼ���m}����[�Ɗtp����=��34�endstream +endobj +3246 0 obj << +/Type /Page +/Contents 3247 0 R +/Resources 3245 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +>> endobj +3248 0 obj << +/D [3246 0 R /XYZ 71.731 729.265 null] +>> endobj +3245 0 obj << +/Font << /F33 896 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3251 0 obj << +/Length 1408 +/Filter /FlateDecode +>> +stream +xڝWmo�8��_��K@j8 �In�]u۴�S���l�����P��nN��7�/HzҩRm3�y�g�?���L}w:�!���Y8��o��_�O|�c$���=�W'?_�ǃ�;?V��x����`:�YV���n�I��pFA�ٟ]1�,��?i�!�t�r|{�J�����d����;����Q��9L'�g��So�'���o^�a���qJ��^��Q�3Z�]�Ĝ�Gq,V\`0�s�� 8���;� �9#��k'��j�W��J��I�s�_��˫0�x���:S�._������z�x\�?,�ǧ�[��<�Y�=�����Ս^��������ݗ[�tD��{�#���;��u O�($6hM5 b]���`�����&盂��@ZvM1EK�& ��Y�!�Y�1=���i$wXj1��y�b�T<�&i�h3"<1܁����o��GU��"e{�"d��BɊTa��;�:Oz qW����(�%��7'�|=�C)i�J'�F���Mq� O�L�{�!&/]��(�R��(�$0):ah�m����ܐ�BXI� ��V�h�B[zFp]?��ͨ�0�;��ѲL�*�^��� �?<<:ϾwBQb�ZQ8c��V}&x��X�8�*�F5���{�QF{��{�x4ޑ�Ik���WH���z��QJ��5~�P/���.�Q�p�b���JB�c��X�c�ε���4��`��oBx�Z#5�Ĥʲ��1�&ܦL�j���+�RW(Q��� +�cNU��F�rB�}������6Uuk��68Sj�1�"�)q��*Q�.0y�CYK�"Cl�x%o=��u?��O�n.m����|�gm:1Ĵ��_���eb��Zve��s&8���!�J�I�U�C��E͓��:��V�Ô���2�� +v�9��I3^�?9��"�(�V�Qzjd�K�ZWV����H�[�����^i�ݡ-ִ���+V�* +�D�0�)�Ӏ�̙V��;��@r����5���hǶ�KZ2.�}�(��ݲjT�O&��`o)})UA���c�ͣΉ�r\��E�Ʒcu3�ru�D!%�uE�f���;U�͒B�֭'��J�i��p����q���iiĉ_+����qK�3JQtR9�����nWPnC�-�]�O:5�;�X0H�w:]������� +ܫE���e���LY��$Q���=@��%��&����v�:q�7�6�%�۾{4�5�;w@ݸ;w����U�fr�E�nv}b��V���m�8�̸9@�nS�qp��e�*0�����_�xb(��Ĭڹ���F�9��62u/�����(����"���Ij��6��M#/�E�Mا���ܙ?}�[����T������lv쓷ҿ{�^endstream +endobj +3250 0 obj << +/Type /Page +/Contents 3251 0 R +/Resources 3249 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +>> endobj +3252 0 obj << +/D [3250 0 R /XYZ 71.731 729.265 null] +>> endobj +3249 0 obj << +/Font << /F33 896 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3255 0 obj << +/Length 2446 +/Filter /FlateDecode +>> +stream +xڕY[��6~ϯ<{L��Y�6�$g���$�4��%�ft,��YTt��v��/@��|I���� |�u�ąr��b�Ï�/ +'��w����?�,D��B�+���_�$�'�g���y��sE&�զ������*{�<�*Uf����[�έ�߷��tѯg���z&]g�b�e���y��E�斿�y������?����8$CϺ��yQ�8n-'�H"�B�[�C�U��uGD��}^ni��H��n�G��~��"HP����(/���������:��gGOh�v�#��{vMo�ގe��3`�m�����)�����r�kԺ�u)�H��\ +O�|&A��3��/�i��EТ0��PI��$ܫ�%�Y��هZ�UWHw)� ��)*����ۙ{�2I�!Ƒ��t�S�fa�4��'1,�pI� +���#�'�x�pW�a����m����4��5 ��]q$2�Ϥ��n��L�l�>�펨�o^�R��ht +�M>77e��I�uWY���1����DA�IO$������9݃ps(�]ڞE�:�xȴ �?��t^B:�r��I�k �"����t�Ԡ���V��( +��:��m��>S��_��ep�2�th��<���^钅�c�������>�ͮm����� 6Z���/��'/CN�R�n�ko�ƅ*��C�.]��[�@;̢��5;m����_��m�$����.^ E�p���j�N}�Xж=�uU,_��"8�����98���Bΰ��(�G�Y�43К�+�����i�HD~l���Wv����[�Fb�g�h�_J�;�o�~*�9^-���<�[���Q�ߋ���}�Γ�J>D����7p������(Iû�x�Λ�W��a1�̏_���B俖��ȗr�%Ш���4���çJM�q- +�� +h1�o��Z�0��J[TE������9�P��~�J�u�҆5�j�jV��e�V�O-�3����l��z���-��`265eK@����^��s ����[�[�q���{8�l^�(F�(�`�K����y�3T����E��RS:M[�[fR������iЍ:�!���{C�t6�ޟ�,X��^,��v��ٻ7CGD�C�.�Cإ-�k]B+t�X�3sb�����b���j�61��Y�sBX58S�#ևAۻ���aغ��R�$xT-q�*��,mUƊ41MS��{Q�����*��y���C$6�i���g�e$��0��JY �g�̯����r����)��X&CA�lǠ{< �Y���J�g�A�R�Ez���=W�c\Z%�R�\�3��BN�o��.G��%�ҧ@Fb�V�}0�@GJWx!V/vI�����e�W<o Ȋ*��K�Y� � ��NS���/�Ԋ�=;>���V��ʦ�?�g�BG�y�o�"3���D�N�/�摨��Uf��Qŕ� e?��a����DA�R�� &���� ��5�fw���A����ZYgT�$�=[��0jJv�����eT,G����)����S����B=m�H�F�Q��SEA�f]�UK�a��W Jtw���:ۘ��� ��� ��VMWp���W/I�J�,B7 V��e�k�_�cMWU�n�:�����45&��� +�� M`X4ݚ�҆d���^M�I5��跦CX����Ek�<ސx8M7���M�oK����5#Gf�+ப[{\�^l������_��x�K�tݪ��-f�]�O�����i�����S��Vi�)3�ͩ��U�Я�&Ѳ���A�r6�C����8D�B�ݾ$��7P��S�l������/߾����Z�D�>�.*�� �p0�#(+�\��ǎ�/���ueduz�KK���'�L�@��V/� ��N�%#�x�������Ga��~��>;��l���@$-�Z�#Mw��)`?Cģ��!�8IQ�,8T�u��ဳ���8j�vM�}��Q�����O�5W +��쟑����w �$8AƘ0.q�|o>� �G�d��� < +�������}C3���1���J�9ݐF��^:q�n�j��3`,(Z1�&��,�;)�gB}���ݍ�Ǹ�zΏ�m"D�5��T/�� �?�aσ&�� ^z���aG0��*Ǘ����c�U����� �5u��F����L}4�B���:R0FӡP��y��>�R�k�;���v�a⍾����m$�sV�h�/�fq���b����0��O��ភ�Q�wd�2T?���~PN����ź2N����i��R^�5�oң��kw���a�uF{�+C^�� <�����zv�j{�_8�H������'ᜱ�U��Ů��κ}u�M����"����7��"�����{�p=�}��sC��������endstream +endobj +3254 0 obj << +/Type /Page +/Contents 3255 0 R +/Resources 3253 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +>> endobj +3256 0 obj << +/D [3254 0 R /XYZ 71.731 729.265 null] +>> endobj +1216 0 obj << +/D [3254 0 R /XYZ 71.731 718.306 null] +>> endobj +534 0 obj << +/D [3254 0 R /XYZ 150.935 676.38 null] +>> endobj +3257 0 obj << +/D [3254 0 R /XYZ 71.731 654.998 null] +>> endobj +1217 0 obj << +/D [3254 0 R /XYZ 71.731 644.486 null] +>> endobj +538 0 obj << +/D [3254 0 R /XYZ 331.51 601.389 null] +>> endobj +3258 0 obj << +/D [3254 0 R /XYZ 71.731 588.951 null] +>> endobj +3259 0 obj << +/D [3254 0 R /XYZ 112.108 579.83 null] +>> endobj +3260 0 obj << +/D [3254 0 R /XYZ 71.731 564.721 null] +>> endobj +3261 0 obj << +/D [3254 0 R /XYZ 71.731 559.74 null] +>> endobj +3262 0 obj << +/D [3254 0 R /XYZ 89.664 538.983 null] +>> endobj +3263 0 obj << +/D [3254 0 R /XYZ 200.537 538.983 null] +>> endobj +3264 0 obj << +/D [3254 0 R /XYZ 71.731 518.893 null] +>> endobj +3265 0 obj << +/D [3254 0 R /XYZ 76.712 456.492 null] +>> endobj +3266 0 obj << +/D [3254 0 R /XYZ 89.664 438.56 null] +>> endobj +3267 0 obj << +/D [3254 0 R /XYZ 99.347 425.608 null] +>> endobj +1218 0 obj << +/D [3254 0 R /XYZ 71.731 418.47 null] +>> endobj +542 0 obj << +/D [3254 0 R /XYZ 367.334 375.372 null] +>> endobj +3268 0 obj << +/D [3254 0 R /XYZ 71.731 362.934 null] +>> endobj +3269 0 obj << +/D [3254 0 R /XYZ 457.285 353.813 null] +>> endobj +3270 0 obj << +/D [3254 0 R /XYZ 71.731 327.91 null] +>> endobj +3271 0 obj << +/D [3254 0 R /XYZ 130.511 327.91 null] +>> endobj +3272 0 obj << +/D [3254 0 R /XYZ 187.537 327.91 null] +>> endobj +3273 0 obj << +/D [3254 0 R /XYZ 71.731 321.49 null] +>> endobj +3274 0 obj << +/D [3254 0 R /XYZ 71.731 321.49 null] +>> endobj +3275 0 obj << +/D [3254 0 R /XYZ 71.731 276.937 null] +>> endobj +3276 0 obj << +/D [3254 0 R /XYZ 71.731 276.937 null] +>> endobj +3277 0 obj << +/D [3254 0 R /XYZ 71.731 233.101 null] +>> endobj +3278 0 obj << +/D [3254 0 R /XYZ 71.731 189.265 null] +>> endobj +3279 0 obj << +/D [3254 0 R /XYZ 71.731 189.265 null] +>> endobj +3280 0 obj << +/D [3254 0 R /XYZ 237.451 178.471 null] +>> endobj +3281 0 obj << +/D [3254 0 R /XYZ 220.87 152.568 null] +>> endobj +3282 0 obj << +/D [3254 0 R /XYZ 71.731 145.43 null] +>> endobj +3283 0 obj << +/D [3254 0 R /XYZ 257.124 134.635 null] +>> endobj +3284 0 obj << +/D [3254 0 R /XYZ 358.713 134.635 null] +>> endobj +3253 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F55 1744 0 R /F35 981 0 R /F32 807 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3287 0 obj << +/Length 1635 +/Filter /FlateDecode +>> +stream +x��Xݏ�6��"ou����qZú[�;܀��m�08�g[�%7����"�s>֭��P��(���E悉���<�>�B�i2)�+����WK�i*�$���,��b�E��H����͛0���H��d�>X�#F�dY��}��ʶT���p�y����ѯ�͟��sZ�2M}/�T�ZC���^I����J���A����{0=�,�"�в?��cs6z���+:�[�*�ȳ�2�6��J�����9k�Nv���K�B|$_�ޒ���h��� ٲ���0.tͶ*�V�X�n��nK٭���TV6�J���b�«#����Cj r��_��o��!�֖�zM�]�[��h�9c̐��A~�L�#��.��t�c+g�z��"�؎j�5;&[��*���i�x�l����K��m�'�\;C���x`Z�< +D�QY�}ysS�67q�y\��n���,�mj�ȉ&�\�A�Љ�~��B��;���#u�ڋD���z�d�N��&ZX�=]3��'f��3B�v.�N��b��� ���-��쫁��$j5�qG�2��)���$�I'ا�g�{#�-�u��cMa>B +�#.`:m�mi�:ǀ��t! ﺀ�w%M�f8�#����x�DS�+�`o0�� +���t��B���x��SG]�����+�F��)ݡ�S�"�Gm즓�?=�Z����E1bT����>� ��tO�*��>��B�Zݰ��z��^j�n�=�R+Fu�]��~:�����&r�Vݫ���Q�*�g���H9�Ľ�!��G�O ��U!�oO.�z��u�-�C�J��K�b���L@�Q�� m�AYʼ�=Ҕzr�����{M�&�|J�6}'�o�2ր(*�V6�\@ ���d��}�q^1�� `03d�>+�* 8"�D�A�c����MJ&%A4���+j*z>�`)Ql�ת�j��w� �����k�ϭ�y�$7e��z�Һ�0zD�S�$�o�.� ��壭�#]����h �>����~[���x��ʂP���I���&!w���.�>��7��"���B�p2 F�! ��Ǎ��=i8�|FP�=��g�y�7Ҽb�4��2�y�E'x���I�R�k:�X�Ĵ�R���J��*?�H�Ҩ��-��9�id�Ө�k�Ҁ8��0�Jx���q��r>ƍ��RQ� �f��Y���Z#c���`s��ƿ/X���3���j<Ih�� ��y�i��!*¡�! +yC�iI�B�r + ��i��kHkIBt>Y2�7����vzw��x_ ��F�x��W|��Dl;Հ���_��Z",� Vn��n�"��E᷐6�h�;����C�l��@�k�����VE"�'�p�Ϙ���f��l$D?�Fy>U��~��V�g�3_,��獳�獟(B�T��_� ��� +��B��T�Cu�Lt Oz42��'dZ�{ �z��H&T�꛱��--{��1���(���dI+��յ�P��w��٢�`6��;����'Cx�?�o��/�L]z�����a������B����=oy�N!�z�3���f�ٳ��/�t@Af�'�/�8s���SC�_B�-�����endstream +endobj +3286 0 obj << +/Type /Page +/Contents 3287 0 R +/Resources 3285 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +/Annots [ 3299 0 R ] +>> endobj +3299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.875 290.579 380.919 299.49] +/Subtype /Link +/A << /S /GoTo /D (variant-scarab) >> +>> endobj +3288 0 obj << +/D [3286 0 R /XYZ 71.731 729.265 null] +>> endobj +1219 0 obj << +/D [3286 0 R /XYZ 71.731 718.306 null] +>> endobj +546 0 obj << +/D [3286 0 R /XYZ 532.163 703.236 null] +>> endobj +3289 0 obj << +/D [3286 0 R /XYZ 71.731 681.855 null] +>> endobj +3290 0 obj << +/D [3286 0 R /XYZ 71.731 647.597 null] +>> endobj +1220 0 obj << +/D [3286 0 R /XYZ 71.731 645.44 null] +>> endobj +550 0 obj << +/D [3286 0 R /XYZ 243.401 602.342 null] +>> endobj +3291 0 obj << +/D [3286 0 R /XYZ 71.731 589.904 null] +>> endobj +3292 0 obj << +/D [3286 0 R /XYZ 280.89 528.977 null] +>> endobj +3293 0 obj << +/D [3286 0 R /XYZ 71.731 508.888 null] +>> endobj +3294 0 obj << +/D [3286 0 R /XYZ 96.916 498.093 null] +>> endobj +3295 0 obj << +/D [3286 0 R /XYZ 71.731 490.955 null] +>> endobj +1221 0 obj << +/D [3286 0 R /XYZ 71.731 473.022 null] +>> endobj +554 0 obj << +/D [3286 0 R /XYZ 281.671 429.925 null] +>> endobj +3296 0 obj << +/D [3286 0 R /XYZ 71.731 417.487 null] +>> endobj +3297 0 obj << +/D [3286 0 R /XYZ 71.731 388.276 null] +>> endobj +1222 0 obj << +/D [3286 0 R /XYZ 71.731 370.343 null] +>> endobj +558 0 obj << +/D [3286 0 R /XYZ 184.129 327.246 null] +>> endobj +3298 0 obj << +/D [3286 0 R /XYZ 71.731 318.423 null] +>> endobj +3300 0 obj << +/D [3286 0 R /XYZ 71.731 285.597 null] +>> endobj +1223 0 obj << +/D [3286 0 R /XYZ 71.731 267.664 null] +>> endobj +562 0 obj << +/D [3286 0 R /XYZ 164.986 224.567 null] +>> endobj +3301 0 obj << +/D [3286 0 R /XYZ 71.731 215.744 null] +>> endobj +3302 0 obj << +/D [3286 0 R /XYZ 71.731 184.976 null] +>> endobj +3303 0 obj << +/D [3286 0 R /XYZ 96.916 172.124 null] +>> endobj +3304 0 obj << +/D [3286 0 R /XYZ 71.731 164.985 null] +>> endobj +1260 0 obj << +/D [3286 0 R /XYZ 71.731 147.053 null] +>> endobj +3305 0 obj << +/D [3286 0 R /XYZ 71.731 48.817 null] +>> endobj +3285 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3308 0 obj << +/Length 659 +/Filter /FlateDecode +>> +stream +xڵTKs�0��W�Vy�(zD��m)��th�TG�U�#˄��#Yrh)ÁɌ7��Ƿ����~8�r��!Y����PR���3=��e~�s��-.)Mr��h�.��pų�S3F���3x�u�ݨ�0.`�gC���F�S�1�(��ޙ�9�&���m'��ڤ�>�����Y?�b��<�/B�|�`'4��<�i�A��F�)E�2��g��kҔ)A��q�B������K��@ɜ`�X���ZU��qi�Ý���$��A5R4M��>�qFw��P�Q|��&]"�*� +�ƘX`�e����"B��9�u��B��w���`)��a*�ҭh�ݧ+���7ꦘ;"�F?~xw"jk���b�ۍ�]��%�.&}aeQ���~ῈX�m�L�u�&�r�F����;�Jx`���DB$��x�C�����Wq�z�����c���O�o��q.�G��Tn�4��7�b�w(�A�e���f�ZaU[K%ueDW��1#zoTo� +�{����X�ץ �M��7j��.��4�$��;���T#>���ǰ��1�����ѫ�J�J��U\D=�����U�;�݊��s�m��I��iQb!U��~"�'r<��?�3L�|\�u��8x��Ňg����ރ˓���"2%�H9��[���Oendstream +endobj +3307 0 obj << +/Type /Page +/Contents 3308 0 R +/Resources 3306 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3244 0 R +>> endobj +3309 0 obj << +/D [3307 0 R /XYZ 71.731 729.265 null] +>> endobj +566 0 obj << +/D [3307 0 R /XYZ 219.248 705.748 null] +>> endobj +3310 0 obj << +/D [3307 0 R /XYZ 71.731 696.925 null] +>> endobj +3311 0 obj << +/D [3307 0 R /XYZ 386.269 684.189 null] +>> endobj +3312 0 obj << +/D [3307 0 R /XYZ 71.731 659.118 null] +>> endobj +1261 0 obj << +/D [3307 0 R /XYZ 71.731 641.185 null] +>> endobj +570 0 obj << +/D [3307 0 R /XYZ 213.327 598.087 null] +>> endobj +3313 0 obj << +/D [3307 0 R /XYZ 71.731 585.649 null] +>> endobj +3314 0 obj << +/D [3307 0 R /XYZ 71.731 556.439 null] +>> endobj +3315 0 obj << +/D [3307 0 R /XYZ 96.916 545.644 null] +>> endobj +3316 0 obj << +/D [3307 0 R /XYZ 71.731 538.506 null] +>> endobj +3306 0 obj << +/Font << /F33 896 0 R /F23 793 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3319 0 obj << +/Length 2701 +/Filter /FlateDecode +>> +stream +xڭ]s۸�=�£�R3���u}�s;I��}�tz}�H�Bï!����o��R ��t<c���b��P|�_|U�a��'ه�.�*�7��`~}E�ۅI��x���"�_�W����7?�Kҫ$ +w�����w��0IwW������me�Xo��:������x�nКG�t�����5��e�{S�����{W�p�Kq��j���?�qz��0��8�7<������$�"��X���&q�����mׯ�(x��i���,�=ʣ��/�)q����F�q|�ujȻu�ݹ��D%ja���!��" +t�ײ�S�J-�g3 +8M#�vv��>��7J@�8� +��� ��/(�^�V8�Z@�p輠C�zh�8�u5v�-E<S��+c���I�I@��>8m�@Ɓ�yw�'#�Z.��� �� wauR�i�xf�ش��T]w�$�u�U�Wq&q�w����r0����M~���͇��w˶�y���x"i��?}g�^e·���Ro�v@Vl4�3*V����jϪ�#� +�c<t�� �A�OZ�σA�u�s�D���`�+^lZ'�f���s�#y��go#I����g'��<P֞��a�Qݗ&P��G�u9���Q�W����<뙽�Fdo0�7PC��g3�xDHG������gZ��A9�`�i�5�J�1��_.��{ +jj���.B�<��C7e���� ��z`��� �@��$$}���6�� e����a���I�<(Q���6xQh�fX8,q����'S�����K±��@ `'AN�#����~#��ߣ())2�7����2sz� ��x!)4�g +� �L?��о�r�U���0N�)��V�0Oj�Ep*1�d��inȈw���b�A\O. �i�as���i��'��A�������)z�s���"�z?2�2F��q��1%b�V�楟иJF�z7�q��v�1s�2vDWښ� Ql},��R����k}M�3-��0$����l/����p��b��"'*82���iF������ +��Dk�������=�Ry�lj#��j@tQ��(�U���<?���SJ {�;�cl��0�B,�+�AhI��C��M�B����{�JDG^ʭ��.kȮ�ex�/�"�T��!o!@/d��d~cI��|pP(X��y�*������&A�Zd�$a(���EU��6����+E2�8����5T��"3���|�dCgPh,���k�Oz��w�t��eg� �k4��pXFH����AS&�Ē���L[�����<5~$m��P����K�r��}���à�z�m���8��G�a��#����ӧ��oon���?�[@�����������|�qyG�Z\̪��:P}_�UmyN� +y�@�73��a��k0t�&�a�sT������A��T<>���ڭ��W�t���mj��>�Ƹ ����R����p�,��!��������*H�3�:B�s���k�0�"栥f�� �����8dR�wR7��gj��Lq�kE��ڎ��!7�zX������;)Izɉ�C]�0z㠐諯(� +�!� +#%��Kw^-%8h��d�>H�ĉ3�htWLC�%I�;i��S �d���#3y��50Z��l=�{q�D��驾�5%d����jA���qs $G}U3b�we#��?9�q����w��:G�{&�1�%��I���$K��+�_x��)La+�I3�qօO)�b +,����l���8������O+C3i�2�pa0���4�Js�*NLe}�����E���[�t͕���xu�%|����B0��:��¹ ����YC7�xP��F)���'N��{�����C����4����W�om�[�d{S(��L� HH5:"����H����2�@Gʊ �w����N�s' +�#�oTa����{����n�^ �Q +�?/�[�(dp�!�:���n���`��e����� BZ�LN���������Z�Oo,�v�(�D�L2��A����"$�n0%Uo6Gm����~�#iޜ�!g���\�Nv��vsI�D�� +�,�0h�k��z�;����0�'ѻ���w����Vg�T\]Ԧ�o'���r�M����u�MV�k��XT�1�a�V�*��z�ʋ��hx�,��hD�ь5Y0f�tt��`�½?=���}Mj�u�]r <�ƥ��*�_�P�W��3�_2�ܳb��E+_����YԗN�]ʮVo�A�a���~MW0y�.fW���������)�.<Ȍ7g�@.�����I&; �V���D�q�/���^�l~Eؓ��n)�U� +��5>^BQ�K^_�9w{��^d�͋.�I��@T )Fo�*ŏk���T�h� �^�D���cM\�d�0��.����,�n(Sx~~A3�:`�C�W"�` P=�G&�rA�a��������fJrK��b��b�<��b~$N�ݑ�8�eґ@_��K¨��W�ʑI�#�(�_Ϝ���J�N�ڋ(���4�^YD�q�U&?����j��5+I0mQˁา�<켾aT�:)���q�����yb���@��E,aj1+�j`^2��=�����:�����b;��φ�|��'�a�8&��"�z#���;� ���$endstream +endobj +3318 0 obj << +/Type /Page +/Contents 3319 0 R +/Resources 3317 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3320 0 obj << +/D [3318 0 R /XYZ 71.731 729.265 null] +>> endobj +1262 0 obj << +/D [3318 0 R /XYZ 71.731 718.306 null] +>> endobj +574 0 obj << +/D [3318 0 R /XYZ 530.903 703.236 null] +>> endobj +3321 0 obj << +/D [3318 0 R /XYZ 71.731 682.175 null] +>> endobj +3322 0 obj << +/D [3318 0 R /XYZ 71.731 672.06 null] +>> endobj +3323 0 obj << +/D [3318 0 R /XYZ 71.731 662.097 null] +>> endobj +1263 0 obj << +/D [3318 0 R /XYZ 71.731 638.283 null] +>> endobj +578 0 obj << +/D [3318 0 R /XYZ 187.469 594.97 null] +>> endobj +3324 0 obj << +/D [3318 0 R /XYZ 71.731 586.147 null] +>> endobj +3325 0 obj << +/D [3318 0 R /XYZ 71.731 527.418 null] +>> endobj +3326 0 obj << +/D [3318 0 R /XYZ 71.731 485.64 null] +>> endobj +1264 0 obj << +/D [3318 0 R /XYZ 71.731 415.902 null] +>> endobj +582 0 obj << +/D [3318 0 R /XYZ 376.854 370.747 null] +>> endobj +3327 0 obj << +/D [3318 0 R /XYZ 71.731 361.924 null] +>> endobj +3328 0 obj << +/D [3318 0 R /XYZ 71.731 316.147 null] +>> endobj +3329 0 obj << +/D [3318 0 R /XYZ 71.731 285.262 null] +>> endobj +3330 0 obj << +/D [3318 0 R /XYZ 71.731 202.573 null] +>> endobj +3331 0 obj << +/D [3318 0 R /XYZ 71.731 171.688 null] +>> endobj +3332 0 obj << +/D [3318 0 R /XYZ 71.731 140.804 null] +>> endobj +3317 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3336 0 obj << +/Length 3098 +/Filter /FlateDecode +>> +stream +xڅ˒۸��%T���S�r������N<��+���c�������$$�Ń@h4�ݭ��B����z��'ޭ�MvW��»GXy�,�+ٲ������7Ir�[�6����.I�u�dw�$^�Y|�p�W��|�͡��X�Y�^����?x�f�eA�H���ye�~�n:Օ�a軲ЍՋ�<���뇁�,ٮwy�S�ݞ ��v$�q ��I��e�wo7�>��ii,�����p� J�ۗ��W�gG8F��9���1�Ջ(�w��Zu�nT��Qr�U���<��?�q����E!��<G�D4s�e�(^�Dz|}:> ��ҫ���x��Q\xV+��N�*���ۧ����"Հg�U����a\i�J?��;W��k��IY쵖[ږ�@E��{��G����d��'9�#����oգf���V��3}0�͡D'8���Z�Ձ�H�ac��͋��=F�;��:�ey� ��o0=��R.,P +U�J������<_k`= �����s��f�_O�av��'�e�{�}'��Q�B Ӳ)�� �Ε" ��O/��y�Tv'C���'��:Y6G�@��e���Z�<�Q|F�HF�O��E��`�����x�������7`�������WeQ]0�:�J��W�7;X����j��4HÀږ(����Ն3�cs#�h�������px��k��xgB+���Gc�OE[���x�f����ٹ5gt?���`blj���h%<"N$�0�bV_M��M���,�_�dɦ=��ɚ�.��Ľ�#�|v��b9�ʼn�O1�� ���/`5�ygLee[+�R�ݲ9^fd6і%�CV)8�Uq*�B�F8;-[D?`�����-�ךZp�����C�l�0��;c��d_ߞ���.��&��G��E|K3�OeW��#Z-���<�5x.�6���fhP��6�:���*�:��1��S�쬮��dT����'��5Ue��O,:9-�������������hO�:,g�X�[z,��"Bd�$�� n��r���(�[�4e�e�/]��A�Ӳ��@��{�}�9#��jy�C�l8�?A���'�S@)7�U��2c�BN�G"Q��c�ƒA���������!��<�3�<���!wge��)�!�x� ^��b���q�/��ZA��-> ���Yn���^Ԡix#���Ǝ��p���2���+�2La�,\�Ɇ�1{���?_���EB��0|�;C_~�����[�����$��Y�#$_>��C;��B�v�����}�!7��r���w��xXĴ�f~�;@��0~``_/yE�� �Ba�Z�XH%YiL#��h��Aƈ�[Iv��(��%{���+3�<c����-ơ�S�PP�ne��m�T%5����V]$��n� ����*��p��!���{[��<`$??�>2�bk�1�ǘ��3�8��!@T�:t80�10,#A�e$����5�)�����v��3�@�k��Z�k��f���aER�dgϛ�\���}�BH�o��E'��W�9]k*2��� K��z�[Q�x,wd?���͋�Y��+�k� �6�5/��1ꊳR�#��9���B�)%ޢaAun1��Ԝ��|��'Ր�b������&�?2������L�� +\r��nL�x�q��{-����x壯{+��G�3�f��Ň�j��R�Vc�!�K^<_H�xi�F�vI�`P8�4G��8s���d�1wS{va$����2!�+5`���ʨ�O��BGF/M��A�&����w��?�������/?!�H9���1����!�� �N��±8x������5FB)wr����aQ.y��&8ܢ|CT�|��W8� c̾�@� S {� ��8�Ҏ�a�,N�a;TUܼ�H��2�)%��k�;�U��v��8� �!u؈g��4��Hp���G��aoZ𖫗(��IW��l���We:"c��c����$~U��Մ������=y���s�dX�0vo|��y��7����>�=B}�s_�9{ӕ�9�7�8�$�'��P4�8O�u+;ߌ�wN����� ~���n�p�G� �0�N�P�V]i'�� ���e����+_/AO�ԥ%��Y�"��|j���ʐ��~�� C��xjX���R��J��K?�'T0'`���d1p]r�:�>�8`�_@%b,Ug��K�h� N�qFbk�L���P�K��b/����E�s{�����Ւ�K�&�� l�$I��~y֞�he=#���ɋ�"B�#���\xvY�`ߣ��|��%3C�A��ėpj���$�0�1U�iz�y76�$;�s�^cO���4�Q�o O�%gZ�?�Lڕ�J(��Z +S���#V*k��ȵnnrUt=L���}���`�\6���2��N2%u��*$���d��H����{�.w@(�.��&�>,�� M��F�1A*6������S�Fַ�a]�JZqE���t�'_uLՌջ�V� ��u���.����%ĻD��*d�z��>KcW?S���ɰ4ŚxX'���`�e5��,�3*?�TP'��[5�s��P�ᇔ ��*]�d�Ec�t'8���v>��l��n�Q���c���flv!�V��{!F�%���a�U���{+�x�]a��~9p?�X~�y�v@��8�?Me���!��|���Ex�t L�u�'W�@1(�v��p-'n�u�0Մ0'o_�vy�5��,�~-�v����:�:4��yD�2r_�~�2���x����D���h�.O����T��6B�meϞ%�$�a� +<a7tzC����EO�$tY;B��fSݕ;Dwq�SI�V�?�Ԋ�Dd���ob�2^"�W^"�����,�������@y1M�LR`�f�E����(M��S���]YLD�L;�������3_X��w��^t,~�Նom����8�9ٶ����t�Z���b�p�$ZiNln�[������|�G۟�{Ÿe��Y����!A�ɏ�bz���o0�endstream +endobj +3335 0 obj << +/Type /Page +/Contents 3336 0 R +/Resources 3334 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3337 0 obj << +/D [3335 0 R /XYZ 71.731 729.265 null] +>> endobj +3338 0 obj << +/D [3335 0 R /XYZ 71.731 662.351 null] +>> endobj +3339 0 obj << +/D [3335 0 R /XYZ 71.731 592.613 null] +>> endobj +1265 0 obj << +/D [3335 0 R /XYZ 71.731 535.826 null] +>> endobj +586 0 obj << +/D [3335 0 R /XYZ 262.889 492.728 null] +>> endobj +3340 0 obj << +/D [3335 0 R /XYZ 71.731 483.905 null] +>> endobj +3341 0 obj << +/D [3335 0 R /XYZ 71.731 401.331 null] +>> endobj +1266 0 obj << +/D [3335 0 R /XYZ 71.731 381.341 null] +>> endobj +590 0 obj << +/D [3335 0 R /XYZ 284.012 338.244 null] +>> endobj +3342 0 obj << +/D [3335 0 R /XYZ 71.731 328.741 null] +>> endobj +3343 0 obj << +/D [3335 0 R /XYZ 71.731 231.838 null] +>> endobj +3344 0 obj << +/D [3335 0 R /XYZ 71.731 200.953 null] +>> endobj +3334 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3347 0 obj << +/Length 3200 +/Filter /FlateDecode +>> +stream +xڍَ�6�}��Ȁ��:,k�&s$��Ltg��fd�nkG�IN��~�XE���A7`�,V�źI���O�b�����������[=�ȏoCldk������OA�J�d��N� ܻQ���w���z��㼻^e����~�9]���������"�^�#%�|����p.�l�6�J��%?ʲ���>����S��(��d,�\Ì�����5����Z�C��A�� ���ϛlZ�m��wk�snTVm��8�9���F�cU�����jI��֞���U��(��B�_dQP�A��Zj�Yu�K��g�\�E��G����;ϊ�����݄��]�&��"��X]s�l裭��9_���b棃�^�&N���iy���k]ᔿ�c��gj�|�k���(�M'zu�E�qqgp��JĮ/"<c�g�>(�3DQ����_?<|zx�n�x��ï_y�!0�n�S���h�a��/)r��Ek���̨a��$Д�>WY�����A���� ����J����J��$:ne��e�,G�ilD�<v�����7�?�1)�o,9��9�u��kY�ALkYȴ�z����߹:Z��M�j����7�x�xP%��VaC_,?s����Rc�����Wbg�i����/�P�cľ-u�{l\x�G0{,>���R��9W��њ��U�H�g��Ӌ/��ͱa�[6��iF����ִ�ʪ^C��tfX�P;/:l�����ch��� ��*�v�>�O�-�0c�o�Qn���'�nN��v�y�"�Z��{��91'��`��A�P��ox��3��E)r��#���GC��fCP���?��L�����<�TWM��`�e�4��ym��J�uR�@���R�$2���٩m������su+����;aI�"��[Q�w���)��(;��V�+S#kJ#�i�ڹl��.���.hk_'�̭Wn4�Ewѹ(%dEJ�w��:�M��|�6�:�˴`���<ظO!4����U֗�A���{��U$�����ր묍9�ìΎi�����H���lގ�6�2{w���V� }���t��H�R�;��U���]4���M@;� � +SK�l����O>U�X�MDq��_�i�|�-� a%-�2�ی'��0l�,[����`��3��ȁ��� +6��֑D���_�#X��'������, +Ұy˓7F�ń�2�W���u����iSI�bo��ĴƄ��q��1̜�h\��9���uWc�h�"�GH�����*�C�������Y� ��6�N8|B�;��p|>�K��3�h�Ӈ�3ӺF�h��o`@dm�x�"&kt�N��_��i!�m�.K�z�D�0�@�9QG��3%�&���Y6�i�g��ZLf��צWȞ��t0d"Jx���SUw16�l������L��q������'Ge�:����`K"r�x&�V[d|(�˧��sf�eL���,��U��X�2����/0 ��p**Մ���*�A�� �:џt1�QJ?���V�9d��P�=re����(����1v��Iú@6�)"VV�j`�l�2�XL��ƪ�mf27��� +��R�@�>�2�1�A����a ��&ˆՀ�3�����Mк+yK�h'��'&y����=Wx�O;4N�(����@S��B�b��06%#~�Ge��l@� �������L��i{�b��Q�|3(��k�&��5ĔS!d���� +C�;�,Ȭ(��iVF���<a�a�EOH�@uxbTf�b�wh�Z9ނp�]� +����D��5`Ƌ�ѨUϲkL�>��h�h�'�f��ЫR��$9r�r��vC�,����7�ɣ!��GY^�P����1ٺ0}��Pݣ +*�<�ӕ��W�֨���R�1$4��g�KM쐷K_D��,ecԓr�����k�f�d�I_�r ��O�j�PҚ��P���<,���g���;N��2�c-UXx ���ٝ �R� +����S@�>����n��Z�����6�ipfC��&�4�d0PƵ��AWݛ>|�E_��-�%��L6�:?�X�ɷ%Av���P#O>(�!8l]⥏���<w��+�s0��� �=��(XH�?�٣1���h���tl������}����vU����H}C��� +pvG����%3va�t����u����xT�5��>�QrV�esM��q��Z���!���J�۱��b��_ ٰ�Q����@m�����[)��`GeX���"��-�8dW���`�2R�<���=������,)@t� U3�|�Z�*���4E�`h�V-��K_FI�rIX��U�x��>�ЂE_�)�܆�E\��?�U˘R;���ƍ��h6ԩ��}}_� ���`�dq�АZ'_A�`7ǨF��l|�`A��h���Ǔ�k��01*T�mX�c�����}Wx�b�i��E����Y�5�u�h-�����<ƫ���2���;~-)E��g�'ڼ�1�w�Af9�"0�B�W4�Xl�,d�mX�i�wXNk���ǡ�%��@��0\0N}p1Y�jnpj��Զ2�%�rPV���<S��}��Ф���9�����k�6�F��l-�r�L&��"Y,�0se2 ��1��r��]�\�=@;Um���������]�� ���D���%}�I��xΗ)-��-��\�D�m\^�d'~;~N��$��W�� �o�]���Һϊ;�S�D�>M_��ȩ�z�C��ܽ�[���B�5-Q�5`�e���}���1���@{�VE)��m�^����H? D~��� �g+�Oo� +�80� u���a����� ����}7��Ed���# ���2{JcZ�Oi���-Œ��Ҽ�6ύtR=Ex惰��O[�c��va�X��vp>=u�M��d���b��:���$�_�z1���,ı��<{X��R;�~�jpB�Kڪ:5b4x������3Lu%�P�lF���E~ze0��Te����h���-;]�)�X T�!hF�����0# ��{��OF�7�����ה5?��r�mHw����n�?��8-x��ʆa�!d3R>z"B�'��7�=��l��]{�@���ܣ�1��U�endstream +endobj +3346 0 obj << +/Type /Page +/Contents 3347 0 R +/Resources 3345 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3348 0 obj << +/D [3346 0 R /XYZ 71.731 729.265 null] +>> endobj +3349 0 obj << +/D [3346 0 R /XYZ 71.731 741.22 null] +>> endobj +3350 0 obj << +/D [3346 0 R /XYZ 71.731 718.306 null] +>> endobj +1267 0 obj << +/D [3346 0 R /XYZ 71.731 688.254 null] +>> endobj +594 0 obj << +/D [3346 0 R /XYZ 227.047 645.157 null] +>> endobj +3351 0 obj << +/D [3346 0 R /XYZ 71.731 636.334 null] +>> endobj +3352 0 obj << +/D [3346 0 R /XYZ 71.731 582.586 null] +>> endobj +3353 0 obj << +/D [3346 0 R /XYZ 71.731 577.605 null] +>> endobj +3354 0 obj << +/D [3346 0 R /XYZ 89.664 556.848 null] +>> endobj +3355 0 obj << +/D [3346 0 R /XYZ 71.731 528.788 null] +>> endobj +3356 0 obj << +/D [3346 0 R /XYZ 89.664 513.012 null] +>> endobj +3357 0 obj << +/D [3346 0 R /XYZ 71.731 485.326 null] +>> endobj +3358 0 obj << +/D [3346 0 R /XYZ 89.664 469.177 null] +>> endobj +3359 0 obj << +/D [3346 0 R /XYZ 71.731 467.02 null] +>> endobj +3360 0 obj << +/D [3346 0 R /XYZ 89.664 451.244 null] +>> endobj +3361 0 obj << +/D [3346 0 R /XYZ 71.731 449.087 null] +>> endobj +3362 0 obj << +/D [3346 0 R /XYZ 89.664 433.311 null] +>> endobj +3363 0 obj << +/D [3346 0 R /XYZ 71.731 431.154 null] +>> endobj +3364 0 obj << +/D [3346 0 R /XYZ 89.664 415.378 null] +>> endobj +3365 0 obj << +/D [3346 0 R /XYZ 71.731 400.987 null] +>> endobj +3366 0 obj << +/D [3346 0 R /XYZ 89.664 384.494 null] +>> endobj +3367 0 obj << +/D [3346 0 R /XYZ 71.731 371.443 null] +>> endobj +3368 0 obj << +/D [3346 0 R /XYZ 89.664 353.61 null] +>> endobj +3369 0 obj << +/D [3346 0 R /XYZ 71.731 351.453 null] +>> endobj +3370 0 obj << +/D [3346 0 R /XYZ 89.664 335.677 null] +>> endobj +3371 0 obj << +/D [3346 0 R /XYZ 71.731 294.666 null] +>> endobj +3372 0 obj << +/D [3346 0 R /XYZ 89.664 278.89 null] +>> endobj +3373 0 obj << +/D [3346 0 R /XYZ 71.731 237.879 null] +>> endobj +3374 0 obj << +/D [3346 0 R /XYZ 89.664 222.103 null] +>> endobj +3375 0 obj << +/D [3346 0 R /XYZ 71.731 206.995 null] +>> endobj +3376 0 obj << +/D [3346 0 R /XYZ 89.664 191.219 null] +>> endobj +3377 0 obj << +/D [3346 0 R /XYZ 71.731 176.111 null] +>> endobj +3378 0 obj << +/D [3346 0 R /XYZ 89.664 160.335 null] +>> endobj +3379 0 obj << +/D [3346 0 R /XYZ 71.731 158.178 null] +>> endobj +3380 0 obj << +/D [3346 0 R /XYZ 89.664 142.402 null] +>> endobj +3381 0 obj << +/D [3346 0 R /XYZ 71.731 135.264 null] +>> endobj +3345 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3384 0 obj << +/Length 2700 +/Filter /FlateDecode +>> +stream +xڝY�o�߿"��ɀ�Z�2�)�����&���E��l�1�����}�%{/E $���hf8�#�_-�ϿJ�EB�A_m�W�0����a�qxޯ���c^��$�Z��([�a|���"���u���xTU����һ_p���+w>���kfa�)Ŕ�z��|6ou]1��ުʨ�?�~w��Պ�t���?��������lFi��Y������W-�.W�z�-������^�9w��Z���ҍ�t[*��wJmZ��;n��3�Em�,�G��X��п-��*x�י���j���m�~lPTu���&���`�?X�ę��=r�Pa�m�s|���B�5�zX����wbr �6�5�%<`ы~S�Yț����u�F���O�'SS��4� � U��n���2�s^rljT�.,�nyf[C�j�3R�B{]���f,�����T�3}����^����/(�悩 H{��6��0�7�V��fW7LQ�-��c�����3p�@1�h&�n�\)Y�(�US�iVd��[�S,��m���E��R�q~�f����w������{�!E�'G_�7�����D+���k�u�1?�ⴋĠB#WD�?$�v�N�ͫ"o�q���`KS�@��4�ps̍�_H|�yݑ�x��EMF����7�qf$�cAw���]��Y��sYR���UJ�T +��ȼ���� �o��y�N� +��������P�0�#1���=;5�p$�[&Q���_�?�zA8�z&=W�I��D��d�}0U�)yU��%&l�3�ə���-bJ�H���OJ��`��2^�"��7u��ަɫW{�Y\�g߮����ڌ�1GB�=���.����f�/R�������C!(�BQ���f;1��r� 2P&�o �s�Ci�3�Ѧ/H��b�O�ݍ�Nx�Q���N8vc�M��,g�d�X���ӑ7xWp��*Q�X����Q���q���y�TD +��@��)N@(�� +�#��JS�� $�c�oE N��_YXe�L I�bgh�����6R��C�������78�� ���KA�t�NB�Чv� ;�������GR�0�k"RN�N�焁�"��3D4��a�f��,�׆{���u\pc�\�P$vvIː0�%UN8������}S_�f>��5h-�4F5�xN�E8�D��0�m�T`<Υ� �� +|Z#t���"R/^p ����������?����i�"� �ǫi�r$C��և��D�T��(!��n�L� ������U������ +�*N�8y���%�;/�Y�r������^�4�"�B�� +�Ćt`O$}�CG�w��:�-�|��63UW#8�i�]�*K��H�g�p%��ľ�VB�q��"i \���^A�R ���]u��D�s��#d�,�����@�R�i�=2 �H{7}��%�R���b���;I,���|$�qT)��� �����Xr/�+���Ls@#eh�3n�+[ �&CAQۢp������'J ���%�J�!�����3��T���~�?��������������?�f�A !�:PE�^�-�`(�0(�E�@ +�`c�:�_P��wfvv,/��,$�o��3]����J���G���I�e孈��0�vv��#NM���t�;�����c�(�05T҂J���\�N�O�R�d}�J�;�L�j��VsY�0]�T�x��5���b���l�B#Ib�!)/�ՙV +H"��$��������D(ꆉ���6��O)�f���Β�8_��R$'��қ�#FBl=�n���e��$�E��f̐1�����OhHV��)z���ig�@�i�"�,�H<�x.؛Q�� sT�)R ���ǥ�H!A�2s�D�3J,��o�6����8��k��c@+ξ]���;U@�&�kyPu`��m��S�Z5)�fv��0=�-�߄|I�>}���~|~za�����Ex��O�ߟe�駪W���#z�3h7#���o����5d���d��>����)̀���A����!vɸ +�GװsW��2�X.�.�����G�{���1��a+U�O��K��B���d���q��{97�"��S�V�F�nH������9&�u]���l�j�߲�/��+��� ���2��HJ�TA�8<C��1�(����ؽS���6�|����(sdtl�xn��!�/�"M���\��t�L@r"� r9�� \�3a8+s�3���پ�xOj8 K���gA�Y��*��g��쑋ϣ���b���5��ч#~��h����8�U%M\�1��.UB�,M�M��&ܲ�aֺ9M�����nN/���M1-T���X�������7��4��w�T��r{����v�Zz��y�o�럸��tw��=�{Z����/y3g�F��K{�����S'�Nd�� O�i�}��(Z��O>�f�V�`��T�#��Bv�F��W �aA�L������;��0E]�ɪ#�J�S;��ߗÄ��8:n��a��%�;̅��w�P��p>7#������uG��0�����a��U� ��!��ӟ[�W�([d~��?,g��A�XV�i���u�w�/��:�endstream +endobj +3383 0 obj << +/Type /Page +/Contents 3384 0 R +/Resources 3382 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3385 0 obj << +/D [3383 0 R /XYZ 71.731 729.265 null] +>> endobj +3386 0 obj << +/D [3383 0 R /XYZ 71.731 646.476 null] +>> endobj +3387 0 obj << +/D [3383 0 R /XYZ 71.731 561.729 null] +>> endobj +1268 0 obj << +/D [3383 0 R /XYZ 71.731 530.844 null] +>> endobj +598 0 obj << +/D [3383 0 R /XYZ 307.012 487.747 null] +>> endobj +3388 0 obj << +/D [3383 0 R /XYZ 71.731 478.924 null] +>> endobj +3389 0 obj << +/D [3383 0 R /XYZ 71.731 433.147 null] +>> endobj +3390 0 obj << +/D [3383 0 R /XYZ 71.731 365.466 null] +>> endobj +1269 0 obj << +/D [3383 0 R /XYZ 71.731 321.63 null] +>> endobj +602 0 obj << +/D [3383 0 R /XYZ 358.675 276.475 null] +>> endobj +3391 0 obj << +/D [3383 0 R /XYZ 71.731 267.652 null] +>> endobj +3392 0 obj << +/D [3383 0 R /XYZ 71.731 221.875 null] +>> endobj +1270 0 obj << +/D [3383 0 R /XYZ 71.731 178.039 null] +>> endobj +606 0 obj << +/D [3383 0 R /XYZ 465.909 134.942 null] +>> endobj +3393 0 obj << +/D [3383 0 R /XYZ 71.731 126.119 null] +>> endobj +3382 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3396 0 obj << +/Length 2525 +/Filter /FlateDecode +>> +stream +xڍYݏ�6�_a�2���ò���^n�l�n�N��z�Dۼʒ+�u���|Q�doS���hf8��͐N�N��Oc��V~�H&��]0����B��;���w��x��W�x��N���O�d�Ƒ�L��:���p<�27N�$�}����+>N�ī�q�i͔U�iz]��5U���&�e���]���qݙ�ĩ�Z�i��2=J{ӭ����d����a��ar�O�� �� +/�GS�u��U�ix����-�L#��2+`[�<h��J��K��l�#��6 Z��(�p%���nWk4}7M<���3���^�#%��Q^�\��A ���y�e��Z��:��ڊI�$T0����b{�Up��D�p�������I����-�Φ�RD`8�DO)�dYu*[!n�G�S6�F7ڔ;�&Q���O��2�/<C?��� +f9�>�@>-�r]�i1�����x��L+G[��S�3B2�B��J�a��Ó��LZO��#��l�R��O��:X�U"�љ$Lb��X�_<h��M!��Y{#$z��f(���=6��*��Єmn�'����b�<�x��Tݒ��e��u�[7�p��c�,�1���&�� ��������F��Qh��L�\Q�U�Z^mNu q �L�����x����0� L9��ўqw�_0iϦѷ��pjD*��V�DmiSg� �C����*t�I#�S���(L�a�I�GPJp�K�5]z뗇����Uୟ�<�w��gQ�'�j=�������-�[<��\��h�����!�a{�<<T��5���������Ku.:yX�M��f3���j^lkܸ5El�(]��[$�A�H��Hz�p(��r������0������)�"# P���<�� Y���+hX��1��ޗ�&�"��3� +�u}0M�������#:�pT5Q9DJ�������S�5\���T<Sf�)�<� ZJ��ߦ:h�2RTQ�`��aT) +ǐ2��܈�C)���]$��L�D�M+&�,��:��L���7�ޚ�36�2 ���8��OK,� 2v�����P�(٦��l� 1��H��İ�s=W�@~,w�i�����C�[���Od��y�d;1�h��v�W����ќ`H����u9h�"7���2���o��6�K�M�V\�=��^����uS0v>�.�#�j�|��������������V'���f_,�Qا��k&L��[�М6E�$p����6�b aƕ7�G��ƥ�3���F���Uha���gD���1�PJ��ù�zq��V�� ���Hx �7D�;���e�;g]T��ЫL>�)/�s�����:@|g +��-6n*�-C����G`����.�[�ű��H�Ta4�u� n3^=B�f�H�6�{�;��fT�3�4�9S��Q�U�(�FR��v�MA��]gf�����~�H�$�)M��[�%���W%� ]�p�;&��+������(�[L�����y������<�����W��W�~�(���I(��><>�>~���d�Vp��K�L^�mK�Emx��e(p�;.�X<bB����9[�e�9�Zsf��H*}d�@��K�Zv�X�'>�%zP���VnP��^�>_����0���dh)R$3� ��Ҙ��k��a�hj�2c�q/_ �1T�NfL�Z'���q�8��m�@Y���Q"ʠ�AHe��ko��¥�`o�� P��Z���zə}�~=~>� �����W���-vz��ߺ?*rr:*�H��-]��)�$�[q�s�E�U��� � "���z��a��g��X��0�6���|�uԆ���s� �A��B?]���T"?]YhK����= �+[Ő + A�P�{��[�����DC�����2B��v�hӱ��o[��8���b��ъ���nzCZx��O����t�p|.�LC�G5��w,Z����*Ia��Ƭ�_�$����g���ڶ����2x\K;4�v�Z�1�bʅ+~>�o&���^�� �}�}�9n+�+Ŵ���3���9��/\:/��������Ue/?��U���:mM��0�]�X%�u�ˡ{�\F�R(��.�g롋߮�\?Q�y��:5]��L�-�S%iy��r���,cJ�f5NV� +�,�������EA�4eZt:xFdž�a�#� +S��Ґ���D1G���ٖ/X�a����rb5�)�W��^g�a� �~�6��K/P$f��?�m[l]����/\G���w���SY�����,B>����5���B�tf���"�ix_��0�3�n=�DO���-�saq��,7�@下�.h���4P)]�R|z��9#{maQ{��O��>/Ŷ�id=@�GN�n�����m$�`4n�R���H?Å4tj`�~�k�S좾�E�� ����Ⱦެ(�����?x��F��?8͗�2L��/n=��ܒ(��N +z4]��7�kU��A��endstream +endobj +3395 0 obj << +/Type /Page +/Contents 3396 0 R +/Resources 3394 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3397 0 obj << +/D [3395 0 R /XYZ 71.731 729.265 null] +>> endobj +3398 0 obj << +/D [3395 0 R /XYZ 71.731 675.303 null] +>> endobj +1271 0 obj << +/D [3395 0 R /XYZ 71.731 631.467 null] +>> endobj +610 0 obj << +/D [3395 0 R /XYZ 212.69 588.37 null] +>> endobj +3399 0 obj << +/D [3395 0 R /XYZ 71.731 579.547 null] +>> endobj +1272 0 obj << +/D [3395 0 R /XYZ 71.731 494.915 null] +>> endobj +614 0 obj << +/D [3395 0 R /XYZ 208.868 451.818 null] +>> endobj +3400 0 obj << +/D [3395 0 R /XYZ 71.731 442.995 null] +>> endobj +1273 0 obj << +/D [3395 0 R /XYZ 71.731 384.266 null] +>> endobj +618 0 obj << +/D [3395 0 R /XYZ 420.891 341.169 null] +>> endobj +3401 0 obj << +/D [3395 0 R /XYZ 71.731 332.346 null] +>> endobj +3402 0 obj << +/D [3395 0 R /XYZ 179.356 293.707 null] +>> endobj +3403 0 obj << +/D [3395 0 R /XYZ 71.731 286.568 null] +>> endobj +1274 0 obj << +/D [3395 0 R /XYZ 71.731 216.83 null] +>> endobj +622 0 obj << +/D [3395 0 R /XYZ 433.251 173.732 null] +>> endobj +3404 0 obj << +/D [3395 0 R /XYZ 71.731 161.561 null] +>> endobj +3405 0 obj << +/D [3395 0 R /XYZ 71.731 137.065 null] +>> endobj +3406 0 obj << +/D [3395 0 R /XYZ 71.731 127.102 null] +>> endobj +3394 0 obj << +/Font << /F33 896 0 R /F27 800 0 R /F23 793 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3409 0 obj << +/Length 788 +/Filter /FlateDecode +>> +stream +xڕUMo�0��W9�@�ٖ����-�2ðz�a�V����������6M�u�O4�D=I��/��(�9�,��ԫ6�л���Q�"�.d�,�}��ܛ��{���I�<�rE{e��]l���Ճ?�Ӑ����$��OSf|�3) ������l{�+��T�l;��.����@+�y0+���1'���+�z�ԋ(�f���E���2��Ȩ�l��|���qʄQ�� �����KحT�M,7%������\�o&��U�&�Iؕ�m?���(�R�'����!��<�}4�J�V�� ͈�~�¥���]�m�FЏ4�}8T�]p��.^�P���<����Ѹ������Vͮ��6��{�MG�%����bC6~Ҏy����"�׃L�dM#�'�.�4���wd����O���FPC��&���݇cڋ��1&W�]/EM�v;�h��Y� +��M�2��&��a��d�C��U�հ�q0s��v ��� ��q</U�8R҄0�4�C���cF�c����G�����D �?�ݨ{T�č�+잣���7����Z;*��� �8��\CV�K^+�^%�����(� �`��=�Ͷ�!���}g�搨�2��F#+��R��m����:Hx*��XB��0��4�9ӕ][c#x>s��� k �P+]�V��"��U���#i�]7��ք��{3 `O?"ײ�ۃ���-d���Q�^��f��!�r�w�ˋkE��<=�/_!�6��WD����S����9\�C,�篽w��� +!�}endstream +endobj +3408 0 obj << +/Type /Page +/Contents 3409 0 R +/Resources 3407 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3333 0 R +>> endobj +3410 0 obj << +/D [3408 0 R /XYZ 71.731 729.265 null] +>> endobj +3411 0 obj << +/D [3408 0 R /XYZ 71.731 689.765 null] +>> endobj +3412 0 obj << +/D [3408 0 R /XYZ 71.731 647.771 null] +>> endobj +3407 0 obj << +/Font << /F33 896 0 R /F27 800 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3415 0 obj << +/Length 1872 +/Filter /FlateDecode +>> +stream +xڭXK��6��Wh����+R�i�n4�lOm�m�EA��l}g8�,?��!X,4��r�o������H�!*&�lQ�_ŋ-�y���i�3� �o�\eI��2Y�f~|zu��H"fyV-�6��8a"�O�_���X+��������'�`�g�I����W��r%�2���$ik��/+V��Pp��a���FY��Z��8-� �VV�ԭ~�e�S�>ˣ�Z�`��qɳH �4�pYɮ��f��'����ê6��ղϴd3-�����hb�kӡ)z�N������ݖĿ�X���@w�l����Z�c�K82�l[Ր?�lQ�?r��Y^`��3QU~�h�dYE����F�S'��F�v�m�*��쏇��m���x�:E����\��K��R=���5�١�q��Y<���Q�<��;J������I�Q����O�gsHҝ���"�3+z(�e(�,��S�j�]���~���N��aL+�TaW����A�^ZK��s��F�r-�b�����9V�6�n$�*�O^2�S�=|)1�pW�_�G����% ��P�i���)gA��0A��,��xo�4���k�i���Ƹ�id%�5��5=���V�D/�����o`�0��L���7�����εj����^�9�6�ҟew��g��;i�E�u;vjM6��A���F��Z!i�XE~C�3�֯���Y8<���켡A�q�~�륈��W�I�dsvdʳT��:^�#=Z:�W$m �H�L S&�h'Ec���.�����$��#Pp̥4�ٳm��vfu�;���~f�-��Yu�V���y|��gi����i�3-)K��jsh����\t$��Nu$A* l!E4a*�5��*vM�+�������8�w���p��� #�13l�S�����i�k3(���;�4�zG�@ G�~~����C�/��t(��F�V��ø|NG�2���L5s*�f��L�q����G�T��3ؼ�8y���ݿ����Ǜ��>����10�������mk��>�a��\����J��j�ڌ�<�'�z�J�:��@_c��Tـ�^�o�1�%�,�'u���_��S�2W��f�bi(ˣ��I�M���=u n 2jP�6�����Y3<��O˾o����/��Ά������0��*j�u<z;(~�p��6t�qW���:Շq�=lm�[����x�9�Y��Рn�ћY"ʜ����~ +�|�������'��������Sl4j|���$˾�g�>���S?�iEͭ{:d��G�Y(M-.�Q�c���>nH�4�*7 +�/x ͭ�1K��Fau.d�V�:����-��z�o�#S��9;��`������+�95�U�J��<9�-�_�$�����{w��m7:m��c�3����\k��C�~U?�l�W%�`ɤ��C���=�om4�T;�P��;09����[�r�y4o�Bz_P�L�G�d'��N�$O2�����d)7�[4��͜%�;.{���ÍO ����V7�����:�;�H}�k��T�H��)��oF3u�%���D��CwX�N���xe� �_s��Pq�4a =ǰ���Z-���tc�-������v������W!x����qv��ԩJ�KLͻ؋H����_���J��TQ�{3�$����rV�|����cZM�~��u�� �W8�Q��H���U��&��f� +kV�EWa�T���MN8d��g*J�x�|X��KES�έ�_� �K^ܴ�W�NK��d�{A��DP�v���P������cY�endstream +endobj +3414 0 obj << +/Type /Page +/Contents 3415 0 R +/Resources 3413 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +/Annots [ 3461 0 R ] +>> endobj +3461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.699 151.564 428.002 160.475] +/Subtype /Link +/A << /S /GoTo /D (http-apache) >> +>> endobj +3416 0 obj << +/D [3414 0 R /XYZ 71.731 729.265 null] +>> endobj +1275 0 obj << +/D [3414 0 R /XYZ 71.731 718.306 null] +>> endobj +626 0 obj << +/D [3414 0 R /XYZ 160.355 703.236 null] +>> endobj +3417 0 obj << +/D [3414 0 R /XYZ 71.731 692.504 null] +>> endobj +630 0 obj << +/D [3414 0 R /XYZ 185.592 651.159 null] +>> endobj +3418 0 obj << +/D [3414 0 R /XYZ 71.731 638.721 null] +>> endobj +634 0 obj << +/D [3414 0 R /XYZ 117.14 629.6 null] +>> endobj +3419 0 obj << +/D [3414 0 R /XYZ 71.731 624.494 null] +>> endobj +3420 0 obj << +/D [3414 0 R /XYZ 71.731 619.513 null] +>> endobj +3421 0 obj << +/D [3414 0 R /XYZ 118.328 593.735 null] +>> endobj +3422 0 obj << +/D [3414 0 R /XYZ 296.214 580.783 null] +>> endobj +3423 0 obj << +/D [3414 0 R /XYZ 71.731 544.918 null] +>> endobj +638 0 obj << +/D [3414 0 R /XYZ 84.161 499.663 null] +>> endobj +2182 0 obj << +/D [3414 0 R /XYZ 71.731 491.056 null] +>> endobj +642 0 obj << +/D [3414 0 R /XYZ 107.616 478.104 null] +>> endobj +3424 0 obj << +/D [3414 0 R /XYZ 71.731 471.061 null] +>> endobj +3425 0 obj << +/D [3414 0 R /XYZ 71.731 466.079 null] +>> endobj +3426 0 obj << +/D [3414 0 R /XYZ 256.795 429.287 null] +>> endobj +3427 0 obj << +/D [3414 0 R /XYZ 392.166 429.287 null] +>> endobj +3428 0 obj << +/D [3414 0 R /XYZ 71.731 427.13 null] +>> endobj +3429 0 obj << +/D [3414 0 R /XYZ 71.731 413.183 null] +>> endobj +646 0 obj << +/D [3414 0 R /XYZ 320.85 399.798 null] +>> endobj +3430 0 obj << +/D [3414 0 R /XYZ 71.731 387.175 null] +>> endobj +3431 0 obj << +/D [3414 0 R /XYZ 71.731 387.175 null] +>> endobj +3432 0 obj << +/D [3414 0 R /XYZ 71.731 387.175 null] +>> endobj +3433 0 obj << +/D [3414 0 R /XYZ 71.731 375.476 null] +>> endobj +3434 0 obj << +/D [3414 0 R /XYZ 111.582 358.951 null] +>> endobj +3435 0 obj << +/D [3414 0 R /XYZ 71.731 346.832 null] +>> endobj +3436 0 obj << +/D [3414 0 R /XYZ 71.731 346.832 null] +>> endobj +3437 0 obj << +/D [3414 0 R /XYZ 71.731 346.832 null] +>> endobj +3438 0 obj << +/D [3414 0 R /XYZ 71.731 334.629 null] +>> endobj +3439 0 obj << +/D [3414 0 R /XYZ 71.731 334.629 null] +>> endobj +3440 0 obj << +/D [3414 0 R /XYZ 71.731 334.629 null] +>> endobj +3441 0 obj << +/D [3414 0 R /XYZ 71.731 321.678 null] +>> endobj +3442 0 obj << +/D [3414 0 R /XYZ 111.582 305.153 null] +>> endobj +3443 0 obj << +/D [3414 0 R /XYZ 326.852 292.201 null] +>> endobj +3444 0 obj << +/D [3414 0 R /XYZ 71.731 280.082 null] +>> endobj +3445 0 obj << +/D [3414 0 R /XYZ 71.731 280.082 null] +>> endobj +3446 0 obj << +/D [3414 0 R /XYZ 71.731 280.082 null] +>> endobj +3447 0 obj << +/D [3414 0 R /XYZ 71.731 267.88 null] +>> endobj +3448 0 obj << +/D [3414 0 R /XYZ 111.582 251.355 null] +>> endobj +3449 0 obj << +/D [3414 0 R /XYZ 352.018 251.355 null] +>> endobj +3450 0 obj << +/D [3414 0 R /XYZ 135.374 238.403 null] +>> endobj +3451 0 obj << +/D [3414 0 R /XYZ 224.983 238.403 null] +>> endobj +3452 0 obj << +/D [3414 0 R /XYZ 297.992 238.403 null] +>> endobj +3453 0 obj << +/D [3414 0 R /XYZ 419.728 238.403 null] +>> endobj +3454 0 obj << +/D [3414 0 R /XYZ 111.582 225.452 null] +>> endobj +3455 0 obj << +/D [3414 0 R /XYZ 71.731 214.081 null] +>> endobj +3456 0 obj << +/D [3414 0 R /XYZ 71.731 214.081 null] +>> endobj +3457 0 obj << +/D [3414 0 R /XYZ 71.731 214.081 null] +>> endobj +3458 0 obj << +/D [3414 0 R /XYZ 71.731 201.13 null] +>> endobj +3459 0 obj << +/D [3414 0 R /XYZ 111.582 184.605 null] +>> endobj +3460 0 obj << +/D [3414 0 R /XYZ 71.731 164.515 null] +>> endobj +3462 0 obj << +/D [3414 0 R /XYZ 71.731 130.807 null] +>> endobj +3413 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F35 981 0 R /F32 807 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3466 0 obj << +/Length 1696 +/Filter /FlateDecode +>> +stream +xڕXMs�8��Wxz�fb��/ۻ�4�v��Lf��f�DۚH�KJI�_��J���f�� ���#i���'+�R�$�()�E�^ŋ=�|���E�� ��\��*ڬ��rf����o��t!VQ"���n\%."!���c��ßNmm����2Q�oHaس�jR�Jr�K��Ȝ�M�L�4xL�t&q0졙�0 ���Ϻi$��کP�R�����\[�����zeT�C)'A��J�r+-�^uy ����v����%�nh�ʄY\�:��kaQ{��ǘ�+��Z�ǖI�/#j}ӭ��l��l��׳T�����S(Ќ���6�DbPn�b<���VjO(��G��w�#.��i(�� ��ӝh�`�רX����(͋�d��(����'��Ir1C�4��XR0M�GΖk��Ӕ����9��� ?�c'ʞk�+E�{�&s�I�~��Ùg�v��G���Lm9�ǡi�&�>����g��m�SX�>c + +�h�S�3����3&'{���p�{V��`:���b��70��3,_w�6��%+���{�1E�8�9MS-%+�A���*�c��҈�Y�����Ӹq{��j�mLL9�XG� ���U�-�*⋤�|�����_�Đ d����/_a��(`�� ��4�\I�s(���INQ�'z'b�"�IZ�/�9,�eWIS�-�!�6(�3ߘ���d�ƎǦ.e_�c9��k^嬿�-�G�t��AtAig�F�c���F��!O��br띄�=����Gb��&A�"�bI];l�*)4(FgQ.�{ot5�}D¯=I�AME2����N�)�N\2�z$T�e�h:P3>{Az҃a7L(��>Ĵ�?9FN�i�`:��Q@��SO&鸤H�B�]?���[�rƁB�c�ǀ�kR�lZ�`+�����R��ɞ'�F����< �U�0�C����¾��@�hZ]�BA��Vp����?pf�Au�~V��a�4Ի1H+e(DpU�P_����>v�7Ipsy�͕:b4W�;55�2� +F�I�g�xc��Ű �s?�5&�I�������$�F2�_�R��dL9F�xx������PP�Y�"Z�Pv��ױ[G�ܫ���F1�,9�])�vh��Rs�'K���RW����hT�v<��?� � +�<[�>1t�|�� +�"� +����ł3��?� �BЁ�w���(���f��ZG�ʇ�� P�v�,%N&F�O��=�?� ~�CO [����,��A���N�#�l��x��x���l�N 7�)�[�f��t�(F�Z.c� x_AP6��<�Q���.��r��\"�L��liL[��Q��M t�Q��h9,^#�U�s�P~b��V��-�l�����?��a3�[���k"j~�8�QC[5Ҵi��ݯ<ӡ���G����GsU��TzVQ�2Fw��}����~���z���1��Ȃe>I~��9�<���J�RD��;ݫ�I/�&=O3��o%x���^��D\e� +g��b�V���ã>M��"�*^(ѴK6��5��نU�p<�$x��{w��p��s3?����@I�d��t<������'R���:Im�a 3�H[&*\8��1'�X�Eй\}z����)2�]�z���XN*�ߎ9�� ;�FБ��r!�����T5�Nendstream +endobj +3465 0 obj << +/Type /Page +/Contents 3466 0 R +/Resources 3464 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +>> endobj +3467 0 obj << +/D [3465 0 R /XYZ 71.731 729.265 null] +>> endobj +650 0 obj << +/D [3465 0 R /XYZ 84.161 706.118 null] +>> endobj +3468 0 obj << +/D [3465 0 R /XYZ 71.731 697.51 null] +>> endobj +654 0 obj << +/D [3465 0 R /XYZ 91.098 684.559 null] +>> endobj +3469 0 obj << +/D [3465 0 R /XYZ 71.731 677.361 null] +>> endobj +3470 0 obj << +/D [3465 0 R /XYZ 71.731 672.38 null] +>> endobj +3471 0 obj << +/D [3465 0 R /XYZ 101.865 661.645 null] +>> endobj +3472 0 obj << +/D [3465 0 R /XYZ 236.362 648.693 null] +>> endobj +3473 0 obj << +/D [3465 0 R /XYZ 284.401 648.693 null] +>> endobj +3474 0 obj << +/D [3465 0 R /XYZ 71.731 623.289 null] +>> endobj +658 0 obj << +/D [3465 0 R /XYZ 131.506 610.337 null] +>> endobj +3475 0 obj << +/D [3465 0 R /XYZ 71.731 603.139 null] +>> endobj +3476 0 obj << +/D [3465 0 R /XYZ 71.731 598.158 null] +>> endobj +1381 0 obj << +/D [3465 0 R /XYZ 71.731 549.067 null] +>> endobj +662 0 obj << +/D [3465 0 R /XYZ 109.927 536.115 null] +>> endobj +3477 0 obj << +/D [3465 0 R /XYZ 71.731 528.918 null] +>> endobj +3478 0 obj << +/D [3465 0 R /XYZ 71.731 523.936 null] +>> endobj +3479 0 obj << +/D [3465 0 R /XYZ 71.731 490.287 null] +>> endobj +666 0 obj << +/D [3465 0 R /XYZ 84.161 445.033 null] +>> endobj +1877 0 obj << +/D [3465 0 R /XYZ 71.731 436.21 null] +>> endobj +670 0 obj << +/D [3465 0 R /XYZ 202.589 423.474 null] +>> endobj +3480 0 obj << +/D [3465 0 R /XYZ 71.731 416.43 null] +>> endobj +3481 0 obj << +/D [3465 0 R /XYZ 71.731 411.449 null] +>> endobj +3482 0 obj << +/D [3465 0 R /XYZ 71.731 411.449 null] +>> endobj +3483 0 obj << +/D [3465 0 R /XYZ 257.363 387.608 null] +>> endobj +3484 0 obj << +/D [3465 0 R /XYZ 71.731 362.204 null] +>> endobj +674 0 obj << +/D [3465 0 R /XYZ 127.073 349.252 null] +>> endobj +3485 0 obj << +/D [3465 0 R /XYZ 71.731 342.209 null] +>> endobj +3486 0 obj << +/D [3465 0 R /XYZ 71.731 337.227 null] +>> endobj +1664 0 obj << +/D [3465 0 R /XYZ 71.731 275.03 null] +>> endobj +678 0 obj << +/D [3465 0 R /XYZ 248.655 262.079 null] +>> endobj +3487 0 obj << +/D [3465 0 R /XYZ 71.731 255.036 null] +>> endobj +3488 0 obj << +/D [3465 0 R /XYZ 71.731 250.054 null] +>> endobj +3489 0 obj << +/D [3465 0 R /XYZ 71.731 250.054 null] +>> endobj +3490 0 obj << +/D [3465 0 R /XYZ 180.012 239.165 null] +>> endobj +3491 0 obj << +/D [3465 0 R /XYZ 118.495 226.214 null] +>> endobj +2019 0 obj << +/D [3465 0 R /XYZ 71.731 200.809 null] +>> endobj +3492 0 obj << +/D [3465 0 R /XYZ 71.731 200.809 null] +>> endobj +682 0 obj << +/D [3465 0 R /XYZ 109.39 187.857 null] +>> endobj +3493 0 obj << +/D [3465 0 R /XYZ 71.731 182.697 null] +>> endobj +3494 0 obj << +/D [3465 0 R /XYZ 71.731 177.715 null] +>> endobj +3495 0 obj << +/D [3465 0 R /XYZ 109.568 166.238 null] +>> endobj +3496 0 obj << +/D [3465 0 R /XYZ 524.797 142.926 null] +>> endobj +3497 0 obj << +/D [3465 0 R /XYZ 71.731 125.825 null] +>> endobj +3498 0 obj << +/D [3465 0 R /XYZ 195.191 116.326 null] +>> endobj +3464 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R /F55 1744 0 R /F35 981 0 R /F44 1379 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3501 0 obj << +/Length 1172 +/Filter /FlateDecode +>> +stream +xڍVKo�6��W�V�i���-�A �6F/�h���ȢW��u}g8����0`��=C�Y +?>+8+$,�b"W�zw��8y����9J�}�p�d��R�g�W7�_��� �f��%GN�g���ɧ�?��V�*��Jg��R�l���>��7J(� +V��C����xh��s��Dj:��n?93�n?�f�;B��m�-톩 ���������_��N��7�x�Pcz3��v;;::G��o�h�`2:=8���赵}�`p�PQ�\��������qtfG̿hi��5֠rh�n�%�hu[0����ϟH�X{h@���?}Z��Hƫ%D��MbV�>���q��m.�&J�U2�n�-��G0����o�v3�ιJ UY���\j^�L���*�뽮�:�fE.ά*����`�D\�� L!�ݑ��/��i�2��z���d*+g��d</�5��0ib���]Ͱ�Q�|Uõ�W��!�ÀR���E��P�>�}$�7u�;:�ݷ}C'��~j�m�N3b��s�|��=�řzZw���-H�.��ӄK�����;]{D!� �4��E!��;wKL,"Ʊm��=���!��t�6��$H�hh�BA�u�ј�����5x~������A'��m=uz��/�bYV�*��L%v3��J~eɄ��(���~���,/�wc#f�`h�4�7�il��%��avS�RE~��d?k��+֭~���J���W�n��;� �U[���v ݺ�S�!�A5��%t��N��X4�?r�ь�ƾ�z�_Je���0 +t?�q� +������>��:�d��jЙ��~5�**pĺ�I��Y k�|��Im{7�.0�`��4�6�0�gZ 4kG��K�Bß�٣�1�Ǡ�o�?>'��YW^����ǫ +LR�ֹ��Kp{y8�JX�0+/�P��z��D�yU�P䜪��|�Y��C:S�ci�8�lc�1�z�,�&լ���w��UU���4�q��˓K��rV�"\����I`���Z�[�|\�+ ���!�W��g�hڿ��Xc'��*��7�:^�ש����#�\�,d +E_��io����y�B���&Ŗ5Q��ԓK�������BU硼�yu� ��̖�����7��\=� +>R���2�����{��?V�#endstream +endobj +3500 0 obj << +/Type /Page +/Contents 3501 0 R +/Resources 3499 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +>> endobj +3502 0 obj << +/D [3500 0 R /XYZ 71.731 729.265 null] +>> endobj +3503 0 obj << +/D [3500 0 R /XYZ 71.731 662.516 null] +>> endobj +686 0 obj << +/D [3500 0 R /XYZ 84.161 617.261 null] +>> endobj +3504 0 obj << +/D [3500 0 R /XYZ 71.731 608.654 null] +>> endobj +690 0 obj << +/D [3500 0 R /XYZ 109.927 595.702 null] +>> endobj +3505 0 obj << +/D [3500 0 R /XYZ 71.731 590.596 null] +>> endobj +3506 0 obj << +/D [3500 0 R /XYZ 71.731 585.615 null] +>> endobj +3507 0 obj << +/D [3500 0 R /XYZ 408.876 559.837 null] +>> endobj +3508 0 obj << +/D [3500 0 R /XYZ 91.656 546.885 null] +>> endobj +3509 0 obj << +/D [3500 0 R /XYZ 71.731 523.971 null] +>> endobj +694 0 obj << +/D [3500 0 R /XYZ 85.124 478.717 null] +>> endobj +3510 0 obj << +/D [3500 0 R /XYZ 71.731 469.894 null] +>> endobj +698 0 obj << +/D [3500 0 R /XYZ 106.959 457.158 null] +>> endobj +3511 0 obj << +/D [3500 0 R /XYZ 71.731 450.114 null] +>> endobj +3512 0 obj << +/D [3500 0 R /XYZ 71.731 445.133 null] +>> endobj +3513 0 obj << +/D [3500 0 R /XYZ 135.305 434.244 null] +>> endobj +3514 0 obj << +/D [3500 0 R /XYZ 477.105 421.292 null] +>> endobj +3515 0 obj << +/D [3500 0 R /XYZ 91.656 408.341 null] +>> endobj +3516 0 obj << +/D [3500 0 R /XYZ 71.731 385.427 null] +>> endobj +702 0 obj << +/D [3500 0 R /XYZ 81.303 340.172 null] +>> endobj +2181 0 obj << +/D [3500 0 R /XYZ 71.731 331.35 null] +>> endobj +706 0 obj << +/D [3500 0 R /XYZ 121.773 318.613 null] +>> endobj +3517 0 obj << +/D [3500 0 R /XYZ 71.731 311.57 null] +>> endobj +3518 0 obj << +/D [3500 0 R /XYZ 71.731 306.588 null] +>> endobj +3519 0 obj << +/D [3500 0 R /XYZ 71.731 272.785 null] +>> endobj +710 0 obj << +/D [3500 0 R /XYZ 86.071 227.531 null] +>> endobj +3058 0 obj << +/D [3500 0 R /XYZ 71.731 218.923 null] +>> endobj +714 0 obj << +/D [3500 0 R /XYZ 193.573 205.972 null] +>> endobj +3520 0 obj << +/D [3500 0 R /XYZ 71.731 198.774 null] +>> endobj +3521 0 obj << +/D [3500 0 R /XYZ 71.731 193.792 null] +>> endobj +3522 0 obj << +/D [3500 0 R /XYZ 91.656 170.106 null] +>> endobj +3523 0 obj << +/D [3500 0 R /XYZ 438.655 170.106 null] +>> endobj +3524 0 obj << +/D [3500 0 R /XYZ 322.568 157.155 null] +>> endobj +3525 0 obj << +/D [3500 0 R /XYZ 447.32 157.155 null] +>> endobj +3499 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3528 0 obj << +/Length 1655 +/Filter /FlateDecode +>> +stream +xڭ�n7��_�G ������IS��[�6����%-��ܐ�U�����V�?�!9��Z�#��Q�4�%�Y�ģ���F���ƷQ�� ��r9�Ô�Y8�(�=��>�(gy���&^��(=��?�����`�GL� M����s��ԸF�WJ4]���n+�\�o}�� +����|�2@r @��, +���P�G�F8P� +�ׇ���vq̒8{��E9g7�E�,͒!��T��]��^Vg���Fo�l)�`%'A<�5��+0��[+Y�����w��n��$��{��b��*5���|���(çmY!���eO��ʾZ���ޘ�eUrU~G�(GL�E�&�]�m �UE��W�K�V��kp2�J��Z6����rc)��l:M\���X8eY��x�o ��{/�<��3`;͌��mWW��?�p���3A®'M���?M���y��(�P8P���Y���I�m�J[����` r�͆6Ng4>ȅ�51���k�|�����ޟ-Z��?���kF�����Ϟ��3�0ϼ�gYs@�Es:T��#���/_ʾ��F)d#T�ZHP�A�6��a���������(։Ij/dI��ȴ�Y_��0`A�[$�,Y���g�J��_�H?o�O{݉����A�;G]��� ��,��,$?�eGr/����[j�<�5l-*�S�O��z(6��l�F���F��5���UM� �&O�8 +����HI���������!�L��S�1�MC��lQ�O2����ZpM�[���E=�hNjI���rlP���՛��\� �`4���>� ������هA�ӳ� ���-�K���m㊵�B�r�ݛĜO�a�3zb68��a4�]*��$7�'՞N����[�O�����}K��VU�wJ�Jhh�� �����6 +Ж��D�\w;Ӹ��Q�"�noj<�7�����h���� ż2� w�G�&��u+A J��k>F���!mj�'`%�7���FI��2�kS`G��H�$�g����&�,��`��}�6H.Աظ�Pv���co�3�?o �����tJt���rO��\)~�dfغ��¤(B'A�4$O��W�<D���k�T���|#m�-�-�dLE52@@�G:{A�6@�����f�n�ǯEY����ȏ�X�l)�q뤣�\S�����Vǂ�qb1���t�c �ecX��Y^R�@�p��-��hk�Y�?Pm� +�:�N��+A�m��0��3��BS�iD8�u��D�R/�h��Ws�$�:R�3+���^�g,��ô��?j��7�� ��?BD)̆'ddw����)/�����v�=���ֽ�M!�������Zj���j�g4L!�҈'�A)�d�_)t!���nS~73���aWs�I����m'0�rL��P��)0p)P��>w߿�IU[�!˦�����O6+�V�n)�� ��e�YF���R���+M��ĕ�/w�m��Ќ�3:�mM�w��o�wi:6 ����K�hs2<$�:P(-X�kAP�H������'�s +gV���E%��|):wx�M�/^ؘ�ɱ�^������9��H���O�NsczD��A"2����.Fu��%���ڒdendstream +endobj +3527 0 obj << +/Type /Page +/Contents 3528 0 R +/Resources 3526 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +/Annots [ 3534 0 R 3550 0 R ] +>> endobj +3534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [222.931 683.273 255.658 692.184] +/Subtype /Link +/A << /S /GoTo /D (gloss-rdbms) >> +>> endobj +3550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [342.364 542.8 394.667 551.711] +/Subtype /Link +/A << /S /GoTo /D (security-mysql) >> +>> endobj +3529 0 obj << +/D [3527 0 R /XYZ 71.731 729.265 null] +>> endobj +3530 0 obj << +/D [3527 0 R /XYZ 71.731 741.22 null] +>> endobj +3531 0 obj << +/D [3527 0 R /XYZ 71.731 718.306 null] +>> endobj +718 0 obj << +/D [3527 0 R /XYZ 106.052 708.344 null] +>> endobj +3532 0 obj << +/D [3527 0 R /XYZ 71.731 701.3 null] +>> endobj +3533 0 obj << +/D [3527 0 R /XYZ 71.731 696.319 null] +>> endobj +3535 0 obj << +/D [3527 0 R /XYZ 444.255 685.43 null] +>> endobj +3536 0 obj << +/D [3527 0 R /XYZ 71.731 670.321 null] +>> endobj +3537 0 obj << +/D [3527 0 R /XYZ 71.731 655.377 null] +>> endobj +3538 0 obj << +/D [3527 0 R /XYZ 71.731 655.377 null] +>> endobj +3539 0 obj << +/D [3527 0 R /XYZ 71.731 642.426 null] +>> endobj +3540 0 obj << +/D [3527 0 R /XYZ 111.582 626.65 null] +>> endobj +3541 0 obj << +/D [3527 0 R /XYZ 71.731 614.531 null] +>> endobj +3542 0 obj << +/D [3527 0 R /XYZ 71.731 614.531 null] +>> endobj +3543 0 obj << +/D [3527 0 R /XYZ 71.731 601.579 null] +>> endobj +3544 0 obj << +/D [3527 0 R /XYZ 111.582 585.803 null] +>> endobj +3545 0 obj << +/D [3527 0 R /XYZ 315.276 585.803 null] +>> endobj +3546 0 obj << +/D [3527 0 R /XYZ 71.731 573.684 null] +>> endobj +3547 0 obj << +/D [3527 0 R /XYZ 71.731 573.684 null] +>> endobj +3548 0 obj << +/D [3527 0 R /XYZ 71.731 560.732 null] +>> endobj +3549 0 obj << +/D [3527 0 R /XYZ 111.582 544.956 null] +>> endobj +3551 0 obj << +/D [3527 0 R /XYZ 71.731 522.042 null] +>> endobj +722 0 obj << +/D [3527 0 R /XYZ 83.214 476.788 null] +>> endobj +1665 0 obj << +/D [3527 0 R /XYZ 71.731 468.18 null] +>> endobj +726 0 obj << +/D [3527 0 R /XYZ 176.696 455.229 null] +>> endobj +3552 0 obj << +/D [3527 0 R /XYZ 71.731 448.031 null] +>> endobj +3553 0 obj << +/D [3527 0 R /XYZ 71.731 443.05 null] +>> endobj +3554 0 obj << +/D [3527 0 R /XYZ 71.731 443.05 null] +>> endobj +2400 0 obj << +/D [3527 0 R /XYZ 71.731 406.91 null] +>> endobj +730 0 obj << +/D [3527 0 R /XYZ 109.17 393.959 null] +>> endobj +3555 0 obj << +/D [3527 0 R /XYZ 71.731 388.853 null] +>> endobj +3556 0 obj << +/D [3527 0 R /XYZ 71.731 383.872 null] +>> endobj +3557 0 obj << +/D [3527 0 R /XYZ 71.731 319.737 null] +>> endobj +734 0 obj << +/D [3527 0 R /XYZ 90.261 306.786 null] +>> endobj +3558 0 obj << +/D [3527 0 R /XYZ 71.731 301.68 null] +>> endobj +3559 0 obj << +/D [3527 0 R /XYZ 71.731 296.698 null] +>> endobj +3560 0 obj << +/D [3527 0 R /XYZ 134.824 257.969 null] +>> endobj +3561 0 obj << +/D [3527 0 R /XYZ 71.731 235.055 null] +>> endobj +738 0 obj << +/D [3527 0 R /XYZ 85.124 189.8 null] +>> endobj +3562 0 obj << +/D [3527 0 R /XYZ 71.731 180.297 null] +>> endobj +742 0 obj << +/D [3527 0 R /XYZ 86.675 168.241 null] +>> endobj +3563 0 obj << +/D [3527 0 R /XYZ 71.731 162.742 null] +>> endobj +3564 0 obj << +/D [3527 0 R /XYZ 71.731 157.76 null] +>> endobj +3565 0 obj << +/D [3527 0 R /XYZ 71.731 157.76 null] +>> endobj +3566 0 obj << +/D [3527 0 R /XYZ 119.841 145.327 null] +>> endobj +3567 0 obj << +/D [3527 0 R /XYZ 167.644 145.327 null] +>> endobj +3568 0 obj << +/D [3527 0 R /XYZ 249.411 145.327 null] +>> endobj +3569 0 obj << +/D [3527 0 R /XYZ 442.122 119.424 null] +>> endobj +3526 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R /F35 981 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3573 0 obj << +/Length 1433 +/Filter /FlateDecode +>> +stream +xڍW_o�6���9@��r��������pͰv{Pl%�f[�,_���#E)q��Z�I�")�GJI1�%�M�6)|x�x�-��&^`��M�5�y�xƁ����� +�t��Yx�������d�x�-���%� +���b[�}Z���ͩ���SԊ+��,+IA��*v��"z'�x#FIܽX&Q�����ޒ��i���7g� P<��ڙ�vid�^���ˎ��^���H��F��k状a��F�m��k�9�A��Ů Ja�:F��5�����8x"�A#�#)��(mi�Y���^���K�ܧ�0��P.�?��2�ICx�$��8�l��0u����t�6�pNGA������u�^ը���}�� K�s��/q7�?�݁�A����tw�t��A6�5�k�4�����"ω;�91#�ON�=������^��Ç���ʴS\���$�zD������.S�����&��^����}�a�ö5��F:�9a�z�%$e����v(���}U�W~'U��~T��+ ����X��K��� +{��eqQ��V9 AX��R��%�](�����ݒ�2�;�9*�@�j��N����ޕT*�Y��k��C<M��%���<���짖TZ_ ߬�)I��d��3t��Px�rν��$� �;�{"�θɀ%�e�X�D����l~�W�T���BUH�����f�0���E�k�%�y�|�y���9A�/ +P�#�m#/��=��d���5�b¸>e-?n�QH�C�����������k/��O��I�u�BB��K���ZƠ�ɲ�(#n�,`��f d/�l�/ �F�>�0���z��2����M'3Etp��la$ޗ'�~7��*�uА>F4��w���'?LoH����8Nx7��i�g��B��z�>G��G|A�\���v�.[=�</t��f�Ӭ�b����.�J��/�bv�|P����跻�E� ��zz?��k:+(¼�GVށ�AO|% b����7��O>�����C�3ҥ,�ћ��M�� n�RV�p��F�NJKA���-��9�����'"�����# Y�B씏���P&8bKeC�~��(���;�f�k���+�=����v��k�����N����Z}#�ȾQ��#�����_|�m�-�����]GSg�j��}]O�uӧ� _~N�0��d*I +ce��K l���n�;8��F�SF.�p쾦�m�%�=ॷzlnC5��"@XЍ��44)#� ��k���w�)[nл�mJ��d�*!������!<�%F�H���#*�h/�H��8g��}H�ŷ^�z���B���Ơ��?��5�v�~{�����V$��?����~��_!/X̃�Y���߃�=����Qendstream +endobj +3572 0 obj << +/Type /Page +/Contents 3573 0 R +/Resources 3571 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +>> endobj +3574 0 obj << +/D [3572 0 R /XYZ 71.731 729.265 null] +>> endobj +746 0 obj << +/D [3572 0 R /XYZ 84.161 658.108 null] +>> endobj +3570 0 obj << +/D [3572 0 R /XYZ 71.731 649.5 null] +>> endobj +750 0 obj << +/D [3572 0 R /XYZ 263.739 636.549 null] +>> endobj +3575 0 obj << +/D [3572 0 R /XYZ 71.731 629.351 null] +>> endobj +3576 0 obj << +/D [3572 0 R /XYZ 71.731 624.37 null] +>> endobj +3577 0 obj << +/D [3572 0 R /XYZ 71.731 575.279 null] +>> endobj +754 0 obj << +/D [3572 0 R /XYZ 165.299 562.327 null] +>> endobj +3578 0 obj << +/D [3572 0 R /XYZ 71.731 555.129 null] +>> endobj +3579 0 obj << +/D [3572 0 R /XYZ 71.731 550.148 null] +>> endobj +3580 0 obj << +/D [3572 0 R /XYZ 343.928 539.413 null] +>> endobj +3581 0 obj << +/D [3572 0 R /XYZ 71.731 503.548 null] +>> endobj +758 0 obj << +/D [3572 0 R /XYZ 83.214 458.293 null] +>> endobj +3582 0 obj << +/D [3572 0 R /XYZ 71.731 449.471 null] +>> endobj +3583 0 obj << +/D [3572 0 R /XYZ 71.731 449.471 null] +>> endobj +762 0 obj << +/D [3572 0 R /XYZ 103.282 436.734 null] +>> endobj +3584 0 obj << +/D [3572 0 R /XYZ 71.731 431.628 null] +>> endobj +3585 0 obj << +/D [3572 0 R /XYZ 71.731 426.647 null] +>> endobj +3586 0 obj << +/D [3572 0 R /XYZ 71.731 426.647 null] +>> endobj +3587 0 obj << +/D [3572 0 R /XYZ 166.836 413.82 null] +>> endobj +3588 0 obj << +/D [3572 0 R /XYZ 408.475 400.869 null] +>> endobj +3589 0 obj << +/D [3572 0 R /XYZ 243.467 387.917 null] +>> endobj +3590 0 obj << +/D [3572 0 R /XYZ 246.801 387.917 null] +>> endobj +3591 0 obj << +/D [3572 0 R /XYZ 298.91 387.917 null] +>> endobj +3592 0 obj << +/D [3572 0 R /XYZ 448.559 387.917 null] +>> endobj +3593 0 obj << +/D [3572 0 R /XYZ 164.884 374.966 null] +>> endobj +3594 0 obj << +/D [3572 0 R /XYZ 481.157 374.966 null] +>> endobj +3595 0 obj << +/D [3572 0 R /XYZ 132.363 362.014 null] +>> endobj +3596 0 obj << +/D [3572 0 R /XYZ 71.731 339.1 null] +>> endobj +766 0 obj << +/D [3572 0 R /XYZ 82.25 293.846 null] +>> endobj +3597 0 obj << +/D [3572 0 R /XYZ 71.731 285.238 null] +>> endobj +770 0 obj << +/D [3572 0 R /XYZ 150.047 272.287 null] +>> endobj +3598 0 obj << +/D [3572 0 R /XYZ 71.731 265.089 null] +>> endobj +3599 0 obj << +/D [3572 0 R /XYZ 71.731 260.108 null] +>> endobj +3600 0 obj << +/D [3572 0 R /XYZ 192.963 236.421 null] +>> endobj +2239 0 obj << +/D [3572 0 R /XYZ 71.731 185.114 null] +>> endobj +774 0 obj << +/D [3572 0 R /XYZ 193.264 172.162 null] +>> endobj +3601 0 obj << +/D [3572 0 R /XYZ 71.731 164.964 null] +>> endobj +3602 0 obj << +/D [3572 0 R /XYZ 71.731 159.983 null] +>> endobj +3603 0 obj << +/D [3572 0 R /XYZ 71.731 100.431 null] +>> endobj +3571 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3606 0 obj << +/Length 1008 +/Filter /FlateDecode +>> +stream +x�uVK��6��0r�جHY��h���"@�=pm�Ү,��ԍ�}g8C��o��ys(9��'g�U�Z U���!��a��˲�P��l.���:�-.4|X?��Q�3Y %��z7Y�J!e=[o�%_ӿן��J�����BIQ+�Υ*Kl�PU�|�v� ~�c������� +С�J.��u�<�Ze�<��8�{kw'⼦�'��1�>���xC�S���q�2�Io�{6����6 +̒���3wJ�"��1=�h��~V0Xb�T��c��S�ɓ8 +B����{�7s��i�� +d�� ;�A��MU��?ö���~J| �/1�T�])�v��MA�_t�V2y2��xT�HuuO`p�����'�ya6�j~��>��o�ѐ�3�ўlJv��ֲ�Rd�긶�g+�R�K�Y�pT�?�632R�!#G톩��<������9�SG�vP���H��S�'�8��Ph \��(�{>��e�;A�ap�'b��[Ϛ�g�ݝ�΄�@ �C@Q=L�oSY�u�1z3��d�ύ>Mo���Ǭ��\�:�koc��e!<�p�,v�Xw����9 �x}�*�6���!�^ۡ!t�à��jK� +��>��u�՝[��ՕB�x���H ����y��ω��fX�6�b�b�6�^�+�,�_���6rylj�cl�Iu4�u�%�=�nt-�e�ޜˀ$��=!��N���F�l�&3��֫�t����^���l4��q��H����j�؈��R�9�O���:�@0��xh�.4�MK׆h���k�8���"�e�� 3���eX��c7�y�����h���rm�'�����Z�o�S�~h��.-�PB�����%o���a�Q�3������!E/�酻��\&�=O��qp��oj͝�`l��H��y�!�U�=*U�<|_�������ï�集?V���eu���%g��ɓ_|����JЋ:�5��~��{x�endstream +endobj +3605 0 obj << +/Type /Page +/Contents 3606 0 R +/Resources 3604 0 R +/MediaBox [0 0 609.714 789.041] +/Parent 3463 0 R +>> endobj +3607 0 obj << +/D [3605 0 R /XYZ 71.731 729.265 null] +>> endobj +778 0 obj << +/D [3605 0 R /XYZ 82.25 706.118 null] +>> endobj +3608 0 obj << +/D [3605 0 R /XYZ 71.731 697.51 null] +>> endobj +782 0 obj << +/D [3605 0 R /XYZ 163.964 684.559 null] +>> endobj +3609 0 obj << +/D [3605 0 R /XYZ 71.731 677.361 null] +>> endobj +3610 0 obj << +/D [3605 0 R /XYZ 71.731 672.38 null] +>> endobj +3611 0 obj << +/D [3605 0 R /XYZ 71.731 646.536 null] +>> endobj +3612 0 obj << +/D [3605 0 R /XYZ 71.731 636.574 null] +>> endobj +3613 0 obj << +/D [3605 0 R /XYZ 71.731 573.527 null] +>> endobj +3614 0 obj << +/D [3605 0 R /XYZ 469.856 540.499 null] +>> endobj +3604 0 obj << +/Font << /F23 793 0 R /F27 800 0 R /F33 896 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1666 0 obj +[786 0 R /Fit] +endobj +3615 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro 129/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +>> endobj +1986 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Courier-Oblique +>> endobj +1744 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Courier-Bold +>> endobj +1676 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Helvetica-Oblique +>> endobj +1652 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /ZapfDingbats +>> endobj +1379 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Helvetica +>> endobj +981 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Courier +>> endobj +896 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Times-Italic +>> endobj +807 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Times-Bold +>> endobj +800 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Times-Roman +>> endobj +793 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 3615 0 R +/BaseFont /Helvetica-Bold +>> endobj +794 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [786 0 R 796 0 R 802 0 R 942 0 R 1083 0 R 1225 0 R] +>> endobj +1296 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [1277 0 R 1306 0 R 1323 0 R 1375 0 R 1383 0 R 1416 0 R] +>> endobj +1452 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [1426 0 R 1454 0 R 1512 0 R 1539 0 R 1550 0 R 1567 0 R] +>> endobj +1591 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [1583 0 R 1593 0 R 1626 0 R 1668 0 R 1736 0 R 1764 0 R] +>> endobj +1816 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [1787 0 R 1818 0 R 1848 0 R 1879 0 R 1927 0 R 1957 0 R] +>> endobj +2018 0 obj << +/Type /Pages +/Count 6 +/Parent 3616 0 R +/Kids [1978 0 R 2021 0 R 2042 0 R 2066 0 R 2094 0 R 2116 0 R] +>> endobj +2180 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [2151 0 R 2184 0 R 2209 0 R 2241 0 R 2264 0 R 2272 0 R] +>> endobj +2327 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [2303 0 R 2329 0 R 2363 0 R 2402 0 R 2435 0 R 2469 0 R] +>> endobj +2546 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [2517 0 R 2548 0 R 2612 0 R 2666 0 R 2695 0 R 2725 0 R] +>> endobj +2769 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [2755 0 R 2771 0 R 2800 0 R 2827 0 R 2859 0 R 2882 0 R] +>> endobj +2945 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [2916 0 R 2947 0 R 2973 0 R 3000 0 R 3023 0 R 3060 0 R] +>> endobj +3124 0 obj << +/Type /Pages +/Count 6 +/Parent 3617 0 R +/Kids [3087 0 R 3126 0 R 3147 0 R 3176 0 R 3197 0 R 3236 0 R] +>> endobj +3244 0 obj << +/Type /Pages +/Count 6 +/Parent 3618 0 R +/Kids [3241 0 R 3246 0 R 3250 0 R 3254 0 R 3286 0 R 3307 0 R] +>> endobj +3333 0 obj << +/Type /Pages +/Count 6 +/Parent 3618 0 R +/Kids [3318 0 R 3335 0 R 3346 0 R 3383 0 R 3395 0 R 3408 0 R] +>> endobj +3463 0 obj << +/Type /Pages +/Count 6 +/Parent 3618 0 R +/Kids [3414 0 R 3465 0 R 3500 0 R 3527 0 R 3572 0 R 3605 0 R] +>> endobj +3616 0 obj << +/Type /Pages +/Count 36 +/Parent 3619 0 R +/Kids [794 0 R 1296 0 R 1452 0 R 1591 0 R 1816 0 R 2018 0 R] +>> endobj +3617 0 obj << +/Type /Pages +/Count 36 +/Parent 3619 0 R +/Kids [2180 0 R 2327 0 R 2546 0 R 2769 0 R 2945 0 R 3124 0 R] +>> endobj +3618 0 obj << +/Type /Pages +/Count 18 +/Parent 3619 0 R +/Kids [3244 0 R 3333 0 R 3463 0 R] +>> endobj +3619 0 obj << +/Type /Pages +/Count 90 +/Kids [3616 0 R 3617 0 R 3618 0 R] +>> endobj +3620 0 obj << +/Type /Outlines +/First 3 0 R +/Last 779 0 R +/Count 76 +>> endobj +783 0 obj << +/Title 784 0 R +/A 781 0 R +/Parent 779 0 R +>> endobj +779 0 obj << +/Title 780 0 R +/A 777 0 R +/Parent 3620 0 R +/Prev 767 0 R +/First 783 0 R +/Last 783 0 R +/Count -1 +>> endobj +775 0 obj << +/Title 776 0 R +/A 773 0 R +/Parent 771 0 R +>> endobj +771 0 obj << +/Title 772 0 R +/A 769 0 R +/Parent 767 0 R +/First 775 0 R +/Last 775 0 R +/Count -1 +>> endobj +767 0 obj << +/Title 768 0 R +/A 765 0 R +/Parent 3620 0 R +/Prev 759 0 R +/Next 779 0 R +/First 771 0 R +/Last 771 0 R +/Count -1 +>> endobj +763 0 obj << +/Title 764 0 R +/A 761 0 R +/Parent 759 0 R +>> endobj +759 0 obj << +/Title 760 0 R +/A 757 0 R +/Parent 3620 0 R +/Prev 747 0 R +/Next 767 0 R +/First 763 0 R +/Last 763 0 R +/Count -1 +>> endobj +755 0 obj << +/Title 756 0 R +/A 753 0 R +/Parent 751 0 R +>> endobj +751 0 obj << +/Title 752 0 R +/A 749 0 R +/Parent 747 0 R +/First 755 0 R +/Last 755 0 R +/Count -1 +>> endobj +747 0 obj << +/Title 748 0 R +/A 745 0 R +/Parent 3620 0 R +/Prev 739 0 R +/Next 759 0 R +/First 751 0 R +/Last 751 0 R +/Count -1 +>> endobj +743 0 obj << +/Title 744 0 R +/A 741 0 R +/Parent 739 0 R +>> endobj +739 0 obj << +/Title 740 0 R +/A 737 0 R +/Parent 3620 0 R +/Prev 723 0 R +/Next 747 0 R +/First 743 0 R +/Last 743 0 R +/Count -1 +>> endobj +735 0 obj << +/Title 736 0 R +/A 733 0 R +/Parent 727 0 R +/Prev 731 0 R +>> endobj +731 0 obj << +/Title 732 0 R +/A 729 0 R +/Parent 727 0 R +/Next 735 0 R +>> endobj +727 0 obj << +/Title 728 0 R +/A 725 0 R +/Parent 723 0 R +/First 731 0 R +/Last 735 0 R +/Count -2 +>> endobj +723 0 obj << +/Title 724 0 R +/A 721 0 R +/Parent 3620 0 R +/Prev 711 0 R +/Next 739 0 R +/First 727 0 R +/Last 727 0 R +/Count -1 +>> endobj +719 0 obj << +/Title 720 0 R +/A 717 0 R +/Parent 715 0 R +>> endobj +715 0 obj << +/Title 716 0 R +/A 713 0 R +/Parent 711 0 R +/First 719 0 R +/Last 719 0 R +/Count -1 +>> endobj +711 0 obj << +/Title 712 0 R +/A 709 0 R +/Parent 3620 0 R +/Prev 703 0 R +/Next 723 0 R +/First 715 0 R +/Last 715 0 R +/Count -1 +>> endobj +707 0 obj << +/Title 708 0 R +/A 705 0 R +/Parent 703 0 R +>> endobj +703 0 obj << +/Title 704 0 R +/A 701 0 R +/Parent 3620 0 R +/Prev 695 0 R +/Next 711 0 R +/First 707 0 R +/Last 707 0 R +/Count -1 +>> endobj +699 0 obj << +/Title 700 0 R +/A 697 0 R +/Parent 695 0 R +>> endobj +695 0 obj << +/Title 696 0 R +/A 693 0 R +/Parent 3620 0 R +/Prev 687 0 R +/Next 703 0 R +/First 699 0 R +/Last 699 0 R +/Count -1 +>> endobj +691 0 obj << +/Title 692 0 R +/A 689 0 R +/Parent 687 0 R +>> endobj +687 0 obj << +/Title 688 0 R +/A 685 0 R +/Parent 3620 0 R +/Prev 667 0 R +/Next 695 0 R +/First 691 0 R +/Last 691 0 R +/Count -1 +>> endobj +683 0 obj << +/Title 684 0 R +/A 681 0 R +/Parent 671 0 R +/Prev 679 0 R +>> endobj +679 0 obj << +/Title 680 0 R +/A 677 0 R +/Parent 671 0 R +/Prev 675 0 R +/Next 683 0 R +>> endobj +675 0 obj << +/Title 676 0 R +/A 673 0 R +/Parent 671 0 R +/Next 679 0 R +>> endobj +671 0 obj << +/Title 672 0 R +/A 669 0 R +/Parent 667 0 R +/First 675 0 R +/Last 683 0 R +/Count -3 +>> endobj +667 0 obj << +/Title 668 0 R +/A 665 0 R +/Parent 3620 0 R +/Prev 651 0 R +/Next 687 0 R +/First 671 0 R +/Last 671 0 R +/Count -1 +>> endobj +663 0 obj << +/Title 664 0 R +/A 661 0 R +/Parent 655 0 R +/Prev 659 0 R +>> endobj +659 0 obj << +/Title 660 0 R +/A 657 0 R +/Parent 655 0 R +/Next 663 0 R +>> endobj +655 0 obj << +/Title 656 0 R +/A 653 0 R +/Parent 651 0 R +/First 659 0 R +/Last 663 0 R +/Count -2 +>> endobj +651 0 obj << +/Title 652 0 R +/A 649 0 R +/Parent 3620 0 R +/Prev 639 0 R +/Next 667 0 R +/First 655 0 R +/Last 655 0 R +/Count -1 +>> endobj +647 0 obj << +/Title 648 0 R +/A 645 0 R +/Parent 643 0 R +>> endobj +643 0 obj << +/Title 644 0 R +/A 641 0 R +/Parent 639 0 R +/First 647 0 R +/Last 647 0 R +/Count -1 +>> endobj +639 0 obj << +/Title 640 0 R +/A 637 0 R +/Parent 3620 0 R +/Prev 631 0 R +/Next 651 0 R +/First 643 0 R +/Last 643 0 R +/Count -1 +>> endobj +635 0 obj << +/Title 636 0 R +/A 633 0 R +/Parent 631 0 R +>> endobj +631 0 obj << +/Title 632 0 R +/A 629 0 R +/Parent 3620 0 R +/Prev 627 0 R +/Next 639 0 R +/First 635 0 R +/Last 635 0 R +/Count -1 +>> endobj +627 0 obj << +/Title 628 0 R +/A 625 0 R +/Parent 3620 0 R +/Prev 623 0 R +/Next 631 0 R +>> endobj +623 0 obj << +/Title 624 0 R +/A 621 0 R +/Parent 3620 0 R +/Prev 619 0 R +/Next 627 0 R +>> endobj +619 0 obj << +/Title 620 0 R +/A 617 0 R +/Parent 3620 0 R +/Prev 615 0 R +/Next 623 0 R +>> endobj +615 0 obj << +/Title 616 0 R +/A 613 0 R +/Parent 3620 0 R +/Prev 611 0 R +/Next 619 0 R +>> endobj +611 0 obj << +/Title 612 0 R +/A 609 0 R +/Parent 3620 0 R +/Prev 607 0 R +/Next 615 0 R +>> endobj +607 0 obj << +/Title 608 0 R +/A 605 0 R +/Parent 3620 0 R +/Prev 603 0 R +/Next 611 0 R +>> endobj +603 0 obj << +/Title 604 0 R +/A 601 0 R +/Parent 3620 0 R +/Prev 599 0 R +/Next 607 0 R +>> endobj +599 0 obj << +/Title 600 0 R +/A 597 0 R +/Parent 3620 0 R +/Prev 595 0 R +/Next 603 0 R +>> endobj +595 0 obj << +/Title 596 0 R +/A 593 0 R +/Parent 3620 0 R +/Prev 591 0 R +/Next 599 0 R +>> endobj +591 0 obj << +/Title 592 0 R +/A 589 0 R +/Parent 3620 0 R +/Prev 587 0 R +/Next 595 0 R +>> endobj +587 0 obj << +/Title 588 0 R +/A 585 0 R +/Parent 3620 0 R +/Prev 583 0 R +/Next 591 0 R +>> endobj +583 0 obj << +/Title 584 0 R +/A 581 0 R +/Parent 3620 0 R +/Prev 579 0 R +/Next 587 0 R +>> endobj +579 0 obj << +/Title 580 0 R +/A 577 0 R +/Parent 3620 0 R +/Prev 575 0 R +/Next 583 0 R +>> endobj +575 0 obj << +/Title 576 0 R +/A 573 0 R +/Parent 3620 0 R +/Prev 571 0 R +/Next 579 0 R +>> endobj +571 0 obj << +/Title 572 0 R +/A 569 0 R +/Parent 3620 0 R +/Prev 567 0 R +/Next 575 0 R +>> endobj +567 0 obj << +/Title 568 0 R +/A 565 0 R +/Parent 3620 0 R +/Prev 563 0 R +/Next 571 0 R +>> endobj +563 0 obj << +/Title 564 0 R +/A 561 0 R +/Parent 3620 0 R +/Prev 559 0 R +/Next 567 0 R +>> endobj +559 0 obj << +/Title 560 0 R +/A 557 0 R +/Parent 3620 0 R +/Prev 555 0 R +/Next 563 0 R +>> endobj +555 0 obj << +/Title 556 0 R +/A 553 0 R +/Parent 3620 0 R +/Prev 551 0 R +/Next 559 0 R +>> endobj +551 0 obj << +/Title 552 0 R +/A 549 0 R +/Parent 3620 0 R +/Prev 547 0 R +/Next 555 0 R +>> endobj +547 0 obj << +/Title 548 0 R +/A 545 0 R +/Parent 3620 0 R +/Prev 543 0 R +/Next 551 0 R +>> endobj +543 0 obj << +/Title 544 0 R +/A 541 0 R +/Parent 3620 0 R +/Prev 539 0 R +/Next 547 0 R +>> endobj +539 0 obj << +/Title 540 0 R +/A 537 0 R +/Parent 3620 0 R +/Prev 535 0 R +/Next 543 0 R +>> endobj +535 0 obj << +/Title 536 0 R +/A 533 0 R +/Parent 3620 0 R +/Prev 523 0 R +/Next 539 0 R +>> endobj +531 0 obj << +/Title 532 0 R +/A 529 0 R +/Parent 527 0 R +>> endobj +527 0 obj << +/Title 528 0 R +/A 525 0 R +/Parent 523 0 R +/First 531 0 R +/Last 531 0 R +/Count -1 +>> endobj +523 0 obj << +/Title 524 0 R +/A 521 0 R +/Parent 3620 0 R +/Prev 519 0 R +/Next 535 0 R +/First 527 0 R +/Last 527 0 R +/Count -1 +>> endobj +519 0 obj << +/Title 520 0 R +/A 517 0 R +/Parent 3620 0 R +/Prev 515 0 R +/Next 523 0 R +>> endobj +515 0 obj << +/Title 516 0 R +/A 513 0 R +/Parent 3620 0 R +/Prev 511 0 R +/Next 519 0 R +>> endobj +511 0 obj << +/Title 512 0 R +/A 509 0 R +/Parent 3620 0 R +/Prev 491 0 R +/Next 515 0 R +>> endobj +507 0 obj << +/Title 508 0 R +/A 505 0 R +/Parent 491 0 R +/Prev 503 0 R +>> endobj +503 0 obj << +/Title 504 0 R +/A 501 0 R +/Parent 491 0 R +/Prev 499 0 R +/Next 507 0 R +>> endobj +499 0 obj << +/Title 500 0 R +/A 497 0 R +/Parent 491 0 R +/Prev 495 0 R +/Next 503 0 R +>> endobj +495 0 obj << +/Title 496 0 R +/A 493 0 R +/Parent 491 0 R +/Next 499 0 R +>> endobj +491 0 obj << +/Title 492 0 R +/A 489 0 R +/Parent 3620 0 R +/Prev 487 0 R +/Next 511 0 R +/First 495 0 R +/Last 507 0 R +/Count -4 +>> endobj +487 0 obj << +/Title 488 0 R +/A 485 0 R +/Parent 3620 0 R +/Prev 483 0 R +/Next 491 0 R +>> endobj +483 0 obj << +/Title 484 0 R +/A 481 0 R +/Parent 3620 0 R +/Prev 459 0 R +/Next 487 0 R +>> endobj +479 0 obj << +/Title 480 0 R +/A 477 0 R +/Parent 459 0 R +/Prev 475 0 R +>> endobj +475 0 obj << +/Title 476 0 R +/A 473 0 R +/Parent 459 0 R +/Prev 471 0 R +/Next 479 0 R +>> endobj +471 0 obj << +/Title 472 0 R +/A 469 0 R +/Parent 459 0 R +/Prev 467 0 R +/Next 475 0 R +>> endobj +467 0 obj << +/Title 468 0 R +/A 465 0 R +/Parent 459 0 R +/Prev 463 0 R +/Next 471 0 R +>> endobj +463 0 obj << +/Title 464 0 R +/A 461 0 R +/Parent 459 0 R +/Next 467 0 R +>> endobj +459 0 obj << +/Title 460 0 R +/A 457 0 R +/Parent 3620 0 R +/Prev 439 0 R +/Next 483 0 R +/First 463 0 R +/Last 479 0 R +/Count -5 +>> endobj +455 0 obj << +/Title 456 0 R +/A 453 0 R +/Parent 439 0 R +/Prev 451 0 R +>> endobj +451 0 obj << +/Title 452 0 R +/A 449 0 R +/Parent 439 0 R +/Prev 447 0 R +/Next 455 0 R +>> endobj +447 0 obj << +/Title 448 0 R +/A 445 0 R +/Parent 439 0 R +/Prev 443 0 R +/Next 451 0 R +>> endobj +443 0 obj << +/Title 444 0 R +/A 441 0 R +/Parent 439 0 R +/Next 447 0 R +>> endobj +439 0 obj << +/Title 440 0 R +/A 437 0 R +/Parent 3620 0 R +/Prev 435 0 R +/Next 459 0 R +/First 443 0 R +/Last 455 0 R +/Count -4 +>> endobj +435 0 obj << +/Title 436 0 R +/A 433 0 R +/Parent 3620 0 R +/Prev 431 0 R +/Next 439 0 R +>> endobj +431 0 obj << +/Title 432 0 R +/A 429 0 R +/Parent 3620 0 R +/Prev 411 0 R +/Next 435 0 R +>> endobj +427 0 obj << +/Title 428 0 R +/A 425 0 R +/Parent 411 0 R +/Prev 423 0 R +>> endobj +423 0 obj << +/Title 424 0 R +/A 421 0 R +/Parent 411 0 R +/Prev 419 0 R +/Next 427 0 R +>> endobj +419 0 obj << +/Title 420 0 R +/A 417 0 R +/Parent 411 0 R +/Prev 415 0 R +/Next 423 0 R +>> endobj +415 0 obj << +/Title 416 0 R +/A 413 0 R +/Parent 411 0 R +/Next 419 0 R +>> endobj +411 0 obj << +/Title 412 0 R +/A 409 0 R +/Parent 3620 0 R +/Prev 391 0 R +/Next 431 0 R +/First 415 0 R +/Last 427 0 R +/Count -4 +>> endobj +407 0 obj << +/Title 408 0 R +/A 405 0 R +/Parent 399 0 R +/Prev 403 0 R +>> endobj +403 0 obj << +/Title 404 0 R +/A 401 0 R +/Parent 399 0 R +/Next 407 0 R +>> endobj +399 0 obj << +/Title 400 0 R +/A 397 0 R +/Parent 391 0 R +/Prev 395 0 R +/First 403 0 R +/Last 407 0 R +/Count -2 +>> endobj +395 0 obj << +/Title 396 0 R +/A 393 0 R +/Parent 391 0 R +/Next 399 0 R +>> endobj +391 0 obj << +/Title 392 0 R +/A 389 0 R +/Parent 3620 0 R +/Prev 387 0 R +/Next 411 0 R +/First 395 0 R +/Last 399 0 R +/Count -2 +>> endobj +387 0 obj << +/Title 388 0 R +/A 385 0 R +/Parent 3620 0 R +/Prev 383 0 R +/Next 391 0 R +>> endobj +383 0 obj << +/Title 384 0 R +/A 381 0 R +/Parent 3620 0 R +/Prev 363 0 R +/Next 387 0 R +>> endobj +379 0 obj << +/Title 380 0 R +/A 377 0 R +/Parent 363 0 R +/Prev 375 0 R +>> endobj +375 0 obj << +/Title 376 0 R +/A 373 0 R +/Parent 363 0 R +/Prev 371 0 R +/Next 379 0 R +>> endobj +371 0 obj << +/Title 372 0 R +/A 369 0 R +/Parent 363 0 R +/Prev 367 0 R +/Next 375 0 R +>> endobj +367 0 obj << +/Title 368 0 R +/A 365 0 R +/Parent 363 0 R +/Next 371 0 R +>> endobj +363 0 obj << +/Title 364 0 R +/A 361 0 R +/Parent 3620 0 R +/Prev 347 0 R +/Next 383 0 R +/First 367 0 R +/Last 379 0 R +/Count -4 +>> endobj +359 0 obj << +/Title 360 0 R +/A 357 0 R +/Parent 347 0 R +/Prev 355 0 R +>> endobj +355 0 obj << +/Title 356 0 R +/A 353 0 R +/Parent 347 0 R +/Prev 351 0 R +/Next 359 0 R +>> endobj +351 0 obj << +/Title 352 0 R +/A 349 0 R +/Parent 347 0 R +/Next 355 0 R +>> endobj +347 0 obj << +/Title 348 0 R +/A 345 0 R +/Parent 3620 0 R +/Prev 307 0 R +/Next 363 0 R +/First 351 0 R +/Last 359 0 R +/Count -3 +>> endobj +343 0 obj << +/Title 344 0 R +/A 341 0 R +/Parent 307 0 R +/Prev 339 0 R +>> endobj +339 0 obj << +/Title 340 0 R +/A 337 0 R +/Parent 307 0 R +/Prev 311 0 R +/Next 343 0 R +>> endobj +335 0 obj << +/Title 336 0 R +/A 333 0 R +/Parent 311 0 R +/Prev 323 0 R +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 323 0 R +/Prev 327 0 R +>> endobj +327 0 obj << +/Title 328 0 R +/A 325 0 R +/Parent 323 0 R +/Next 331 0 R +>> endobj +323 0 obj << +/Title 324 0 R +/A 321 0 R +/Parent 311 0 R +/Prev 319 0 R +/Next 335 0 R +/First 327 0 R +/Last 331 0 R +/Count -2 +>> endobj +319 0 obj << +/Title 320 0 R +/A 317 0 R +/Parent 311 0 R +/Prev 315 0 R +/Next 323 0 R +>> endobj +315 0 obj << +/Title 316 0 R +/A 313 0 R +/Parent 311 0 R +/Next 319 0 R +>> endobj +311 0 obj << +/Title 312 0 R +/A 309 0 R +/Parent 307 0 R +/Next 339 0 R +/First 315 0 R +/Last 335 0 R +/Count -4 +>> endobj +307 0 obj << +/Title 308 0 R +/A 305 0 R +/Parent 3620 0 R +/Prev 271 0 R +/Next 347 0 R +/First 311 0 R +/Last 343 0 R +/Count -3 +>> endobj +303 0 obj << +/Title 304 0 R +/A 301 0 R +/Parent 271 0 R +/Prev 299 0 R +>> endobj +299 0 obj << +/Title 300 0 R +/A 297 0 R +/Parent 271 0 R +/Prev 295 0 R +/Next 303 0 R +>> endobj +295 0 obj << +/Title 296 0 R +/A 293 0 R +/Parent 271 0 R +/Prev 291 0 R +/Next 299 0 R +>> endobj +291 0 obj << +/Title 292 0 R +/A 289 0 R +/Parent 271 0 R +/Prev 287 0 R +/Next 295 0 R +>> endobj +287 0 obj << +/Title 288 0 R +/A 285 0 R +/Parent 271 0 R +/Prev 283 0 R +/Next 291 0 R +>> endobj +283 0 obj << +/Title 284 0 R +/A 281 0 R +/Parent 271 0 R +/Prev 279 0 R +/Next 287 0 R +>> endobj +279 0 obj << +/Title 280 0 R +/A 277 0 R +/Parent 271 0 R +/Prev 275 0 R +/Next 283 0 R +>> endobj +275 0 obj << +/Title 276 0 R +/A 273 0 R +/Parent 271 0 R +/Next 279 0 R +>> endobj +271 0 obj << +/Title 272 0 R +/A 269 0 R +/Parent 3620 0 R +/Prev 163 0 R +/Next 307 0 R +/First 275 0 R +/Last 303 0 R +/Count -8 +>> endobj +267 0 obj << +/Title 268 0 R +/A 265 0 R +/Parent 163 0 R +/Prev 263 0 R +>> endobj +263 0 obj << +/Title 264 0 R +/A 261 0 R +/Parent 163 0 R +/Prev 259 0 R +/Next 267 0 R +>> endobj +259 0 obj << +/Title 260 0 R +/A 257 0 R +/Parent 163 0 R +/Prev 255 0 R +/Next 263 0 R +>> endobj +255 0 obj << +/Title 256 0 R +/A 253 0 R +/Parent 163 0 R +/Prev 251 0 R +/Next 259 0 R +>> endobj +251 0 obj << +/Title 252 0 R +/A 249 0 R +/Parent 163 0 R +/Prev 175 0 R +/Next 255 0 R +>> endobj +247 0 obj << +/Title 248 0 R +/A 245 0 R +/Parent 175 0 R +/Prev 243 0 R +>> endobj +243 0 obj << +/Title 244 0 R +/A 241 0 R +/Parent 175 0 R +/Prev 239 0 R +/Next 247 0 R +>> endobj +239 0 obj << +/Title 240 0 R +/A 237 0 R +/Parent 175 0 R +/Prev 235 0 R +/Next 243 0 R +>> endobj +235 0 obj << +/Title 236 0 R +/A 233 0 R +/Parent 175 0 R +/Prev 231 0 R +/Next 239 0 R +>> endobj +231 0 obj << +/Title 232 0 R +/A 229 0 R +/Parent 175 0 R +/Prev 227 0 R +/Next 235 0 R +>> endobj +227 0 obj << +/Title 228 0 R +/A 225 0 R +/Parent 175 0 R +/Prev 223 0 R +/Next 231 0 R +>> endobj +223 0 obj << +/Title 224 0 R +/A 221 0 R +/Parent 175 0 R +/Prev 219 0 R +/Next 227 0 R +>> endobj +219 0 obj << +/Title 220 0 R +/A 217 0 R +/Parent 175 0 R +/Prev 215 0 R +/Next 223 0 R +>> endobj +215 0 obj << +/Title 216 0 R +/A 213 0 R +/Parent 175 0 R +/Prev 211 0 R +/Next 219 0 R +>> endobj +211 0 obj << +/Title 212 0 R +/A 209 0 R +/Parent 175 0 R +/Prev 207 0 R +/Next 215 0 R +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 175 0 R +/Prev 203 0 R +/Next 211 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 175 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 175 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 175 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 175 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 175 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 175 0 R +/Prev 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 175 0 R +/Next 183 0 R +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 163 0 R +/Prev 171 0 R +/Next 251 0 R +/First 179 0 R +/Last 247 0 R +/Count -18 +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 163 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 3620 0 R +/Prev 159 0 R +/Next 271 0 R +/First 167 0 R +/Last 267 0 R +/Count -8 +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 3620 0 R +/Prev 139 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 139 0 R +/Prev 151 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 139 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 139 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 3620 0 R +/Prev 115 0 R +/Next 159 0 R +/First 143 0 R +/Last 155 0 R +/Count -4 +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 115 0 R +/Prev 131 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 115 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 115 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 115 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 3620 0 R +/Prev 59 0 R +/Next 139 0 R +/First 119 0 R +/Last 135 0 R +/Count -5 +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 83 0 R +/Prev 107 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 83 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 83 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 83 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 83 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 83 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 59 0 R +/Prev 79 0 R +/First 87 0 R +/Last 111 0 R +/Count -7 +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 59 0 R +/Prev 75 0 R +/Next 83 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 59 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 59 0 R +/Prev 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 59 0 R +/Prev 63 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 59 0 R +/Next 67 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 3620 0 R +/Prev 55 0 R +/Next 115 0 R +/First 63 0 R +/Last 83 0 R +/Count -6 +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 3620 0 R +/Prev 51 0 R +/Next 59 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 3620 0 R +/Prev 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 3620 0 R +/Prev 43 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 3620 0 R +/Prev 39 0 R +/Next 47 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 3620 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 3620 0 R +/Prev 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 3620 0 R +/Prev 27 0 R +/Next 35 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 3620 0 R +/Prev 23 0 R +/Next 31 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 3620 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 3620 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 3620 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 3620 0 R +/Prev 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 3620 0 R +/Prev 3 0 R +/Next 11 0 R +>> endobj +3 0 obj << +/Title 4 0 R +/A 1 0 R +/Parent 3620 0 R +/Next 7 0 R +>> endobj +3621 0 obj << +/Names [(1.0) 2 0 R (10.0) 38 0 R (100) 1364 0 R (1003) 2089 0 R (1004) 2090 0 R (1005) 2091 0 R (1006) 2092 0 R (1007) 2097 0 R (1008) 2069 0 R (1009) 2098 0 R (101) 1365 0 R (1012) 2099 0 R (1015) 2102 0 R (1016) 2103 0 R (1017) 2104 0 R (1018) 2105 0 R (102) 1366 0 R (1022) 2106 0 R (1023) 2107 0 R (1024) 2108 0 R (1025) 2109 0 R (1026) 2110 0 R (1028) 2112 0 R (1029) 2113 0 R (103) 1367 0 R (1030) 2114 0 R (1031) 2119 0 R (1032) 2120 0 R (1033) 2121 0 R (1034) 2122 0 R (1035) 2123 0 R (1036) 2124 0 R (1037) 2125 0 R (104) 1368 0 R (1041) 2126 0 R (1042) 2127 0 R (1044) 2128 0 R (1046) 2129 0 R (1049) 2130 0 R (105) 1369 0 R (1050) 2131 0 R (1051) 2132 0 R (1052) 2133 0 R (1053) 2134 0 R (1054) 2135 0 R (1055) 2136 0 R (1056) 2137 0 R (1057) 2138 0 R (1058) 2139 0 R (1059) 2140 0 R (106) 1370 0 R (1060) 2141 0 R (1062) 2142 0 R (1063) 2143 0 R (1064) 2144 0 R (1065) 2145 0 R (1069) 2146 0 R (1072) 2149 0 R (1076) 2154 0 R (1077) 2155 0 R (1078) 2156 0 R (1080) 2158 0 R (1081) 2159 0 R (1082) 2160 0 R (1084) 2162 0 R (1085) 2163 0 R (1086) 2164 0 R (1087) 2165 0 R (1088) 2166 0 R (1089) 2167 0 R (109) 1371 0 R (1090) 2168 0 R (1091) 2169 0 R (1092) 2170 0 R (1097) 2172 0 R (1098) 2173 0 R (1099) 2174 0 R (11.0) 42 0 R (1100) 2175 0 R (1101) 2176 0 R (1102) 2177 0 R (1103) 2178 0 R (1104) 2179 0 R (1105) 2187 0 R (1106) 2188 0 R (1107) 2189 0 R (1108) 2190 0 R (1109) 2191 0 R (111) 1372 0 R (1110) 2192 0 R (1111) 2193 0 R (1115) 2194 0 R (1116) 2195 0 R (1117) 2196 0 R (1118) 2197 0 R (1119) 2198 0 R (112) 1373 0 R (1120) 2199 0 R (1121) 2200 0 R (1122) 2201 0 R (1123) 2202 0 R (1124) 2203 0 R (1128) 2205 0 R (1129) 2206 0 R (113) 1325 0 R (1131) 2213 0 R (1132) 2214 0 R (1134) 2216 0 R (1135) 2217 0 R (1136) 2218 0 R (1137) 2219 0 R (1138) 2220 0 R (1139) 2221 0 R (1140) 2222 0 R (1141) 2223 0 R (1142) 2224 0 R (1143) 2225 0 R (1144) 2226 0 R (1145) 2227 0 R (1146) 2228 0 R (1147) 2229 0 R (1148) 2230 0 R (1149) 2231 0 R (1150) 2232 0 R (1151) 2233 0 R (1152) 2234 0 R (1155) 2235 0 R (1156) 1078 0 R (1158) 2236 0 R (1159) 2237 0 R (1160) 2238 0 R (1161) 1079 0 R (1163) 2244 0 R (1164) 2212 0 R (1165) 2245 0 R (1166) 2246 0 R (1167) 2247 0 R (1168) 2248 0 R (1169) 2249 0 R (1170) 2250 0 R (1173) 2251 0 R (1174) 2252 0 R (1175) 2253 0 R (1176) 2254 0 R (1177) 2255 0 R (1178) 2256 0 R (1179) 2257 0 R (1180) 2258 0 R (1183) 2259 0 R (1184) 2260 0 R (1188) 2262 0 R (1189) 2267 0 R (1191) 2269 0 R (1194) 2270 0 R (1199) 2275 0 R (12.0) 46 0 R (1200) 2276 0 R (1202) 2277 0 R (1203) 2278 0 R (1205) 2279 0 R (1206) 2280 0 R (1208) 2281 0 R (1209) 2282 0 R (1210) 2283 0 R (1211) 2284 0 R (1212) 2285 0 R (1213) 2286 0 R (1215) 2287 0 R (1216) 2288 0 R (1218) 2289 0 R (1219) 2290 0 R (1220) 2291 0 R (1222) 2292 0 R (1223) 2293 0 R (1224) 2294 0 R (1225) 2295 0 R (1226) 2296 0 R (1227) 2297 0 R (1228) 2298 0 R (1230) 2299 0 R (1231) 2300 0 R (1233) 2301 0 R (1234) 2306 0 R (1235) 2307 0 R (1237) 2308 0 R (1238) 2309 0 R (1239) 2310 0 R (1241) 2311 0 R (1242) 2312 0 R (1244) 2313 0 R (1245) 2314 0 R (1247) 2315 0 R (1248) 2316 0 R (1250) 2317 0 R (1251) 2318 0 R (1252) 2319 0 R (1253) 2320 0 R (1254) 2321 0 R (1256) 2322 0 R (1257) 2323 0 R (1262) 2324 0 R (1263) 2325 0 R (1264) 2326 0 R (1269) 2333 0 R (1270) 2334 0 R (1271) 2335 0 R (1272) 2336 0 R (1273) 2337 0 R (1274) 2338 0 R (1275) 2339 0 R (1276) 2340 0 R (1277) 2341 0 R (1278) 2342 0 R (1281) 2343 0 R (1282) 2344 0 R (1283) 2345 0 R (1284) 2346 0 R (1285) 2347 0 R (1286) 2348 0 R (1287) 2349 0 R (1288) 2350 0 R (1289) 2351 0 R (1290) 2352 0 R (1291) 2353 0 R (1292) 2354 0 R (1293) 2355 0 R (1294) 2356 0 R (1295) 2357 0 R (1296) 2358 0 R (1297) 2359 0 R (1298) 2360 0 R (1299) 2361 0 R (13.0) 50 0 R (1300) 2366 0 R (1301) 2332 0 R (1302) 2367 0 R (1303) 2368 0 R (1304) 2369 0 R (1305) 2370 0 R (1306) 2371 0 R (1307) 2372 0 R (1308) 2373 0 R (1309) 2374 0 R (1310) 2375 0 R (1311) 2376 0 R (1312) 2377 0 R (1313) 2378 0 R (1314) 2379 0 R (1315) 2380 0 R (1316) 2381 0 R (1317) 2382 0 R (1318) 2383 0 R (1319) 2384 0 R (1320) 2385 0 R (1321) 2386 0 R (1322) 2387 0 R (1323) 2388 0 R (1324) 2389 0 R (1325) 2390 0 R (1326) 2391 0 R (1327) 2392 0 R (1328) 2393 0 R (1329) 2394 0 R (1330) 2395 0 R (1331) 2396 0 R (1336) 2397 0 R (1338) 2399 0 R (1339) 2405 0 R (1340) 2406 0 R (1341) 2407 0 R (1342) 2408 0 R (1343) 2409 0 R (1344) 2410 0 R (1345) 2411 0 R (1346) 2412 0 R (1347) 2413 0 R (1350) 2414 0 R (1351) 2415 0 R (1352) 2416 0 R (1353) 2417 0 R (1354) 2418 0 R (1355) 2419 0 R (1356) 2420 0 R (1357) 2421 0 R (1358) 2422 0 R (1359) 2423 0 R (1360) 2424 0 R (1363) 2425 0 R (1364) 2426 0 R (1365) 2427 0 R (1366) 2428 0 R (1367) 2429 0 R (1368) 2430 0 R (1369) 2431 0 R (1370) 2432 0 R (1371) 2433 0 R (1374) 2438 0 R (1375) 2439 0 R (1376) 2440 0 R (1377) 2441 0 R (1378) 2442 0 R (1379) 2443 0 R (1380) 2444 0 R (1381) 2445 0 R (1382) 2446 0 R (1383) 2447 0 R (1384) 2448 0 R (1385) 2449 0 R (1386) 2450 0 R (1387) 2451 0 R (1388) 2452 0 R (1391) 2453 0 R (1392) 2454 0 R (1393) 2455 0 R (1394) 2456 0 R (1395) 2457 0 R (1396) 2458 0 R (1397) 2459 0 R (1398) 2460 0 R (1399) 2461 0 R (14.0) 54 0 R (1400) 2462 0 R (1401) 2463 0 R (1402) 2464 0 R (1403) 2465 0 R (1404) 2466 0 R (1405) 2467 0 R (1406) 2473 0 R (1409) 2474 0 R (1410) 2475 0 R (1411) 2476 0 R (1412) 2477 0 R (1413) 2478 0 R (1414) 2479 0 R (1415) 2480 0 R (1416) 2481 0 R (1417) 2482 0 R (1418) 2483 0 R (1419) 2484 0 R (1420) 2485 0 R (1421) 2486 0 R (1422) 2487 0 R (1423) 2488 0 R (1424) 2489 0 R (1425) 2490 0 R (1426) 2491 0 R (1427) 2492 0 R (1428) 2493 0 R (1429) 2494 0 R (1430) 2495 0 R (1431) 2496 0 R (1432) 2497 0 R (1433) 2498 0 R (1434) 2499 0 R (1435) 2500 0 R (1436) 2501 0 R (1437) 2502 0 R (1438) 2503 0 R (1439) 2504 0 R (1440) 2505 0 R (1441) 2506 0 R (1442) 2507 0 R (1443) 2508 0 R (1444) 2509 0 R (1445) 2510 0 R (1446) 2511 0 R (1447) 2512 0 R (1448) 2513 0 R (1449) 2514 0 R (1450) 2515 0 R (1453) 2520 0 R (1454) 2521 0 R (1455) 2472 0 R (1456) 2522 0 R (1457) 2523 0 R (1458) 2524 0 R (1459) 2525 0 R (1462) 2526 0 R (1465) 2527 0 R (1466) 2528 0 R (1467) 2529 0 R (1468) 2530 0 R (1469) 2531 0 R (1470) 2532 0 R (1471) 2533 0 R (1472) 2534 0 R (1473) 2535 0 R (1474) 2536 0 R (1475) 2537 0 R (1476) 2538 0 R (1477) 2539 0 R (1478) 2540 0 R (1479) 2541 0 R (1480) 2542 0 R (1481) 2543 0 R (1482) 2544 0 R (1483) 2545 0 R (1484) 2551 0 R (1485) 2552 0 R (1486) 2553 0 R (1487) 2554 0 R (1488) 2555 0 R (1491) 2556 0 R (1492) 2557 0 R (1493) 2558 0 R (1494) 2559 0 R (1495) 2560 0 R (1496) 2561 0 R (1497) 2562 0 R (1498) 2563 0 R (1499) 2564 0 R (15.0) 58 0 R (15.1.1) 62 0 R (15.2.1) 66 0 R (15.3.1) 70 0 R (15.4.1) 74 0 R (15.5.1) 78 0 R (15.6.1) 82 0 R (15.6.1.2) 86 0 R (15.6.2.2) 90 0 R (15.6.3.2) 94 0 R (15.6.4.2) 98 0 R (15.6.5.2) 102 0 R (15.6.6.2) 106 0 R (15.6.7.2) 110 0 R (1500) 2565 0 R (1501) 2566 0 R (1504) 2567 0 R (1505) 2568 0 R (1506) 2569 0 R (1507) 2570 0 R (1508) 2571 0 R (1509) 2572 0 R (1510) 2573 0 R (1511) 2574 0 R (1513) 2575 0 R (1514) 2576 0 R (1515) 2577 0 R (1516) 2578 0 R (1517) 2579 0 R (1518) 2580 0 R (1519) 2581 0 R (1520) 2582 0 R (1522) 2583 0 R (1523) 2584 0 R (1524) 2585 0 R (1525) 2586 0 R (1526) 2587 0 R (1527) 2588 0 R (1528) 2589 0 R (1529) 2590 0 R (1530) 2591 0 R (1531) 2592 0 R (1532) 2593 0 R (1533) 2594 0 R (1535) 2595 0 R (1536) 2596 0 R (1537) 2597 0 R (1538) 2598 0 R (1539) 2599 0 R (1540) 2600 0 R (1541) 2601 0 R (1542) 2602 0 R (1543) 2603 0 R (1544) 2604 0 R (1545) 2605 0 R (1546) 2606 0 R (1547) 2607 0 R (1549) 2608 0 R (1550) 2609 0 R (1551) 2610 0 R (1552) 2615 0 R (1553) 2616 0 R (1554) 2617 0 R (1555) 2618 0 R (1556) 2619 0 R (1557) 2620 0 R (1559) 2621 0 R (1560) 2622 0 R (1561) 2623 0 R (1562) 2624 0 R (1563) 2625 0 R (1564) 2626 0 R (1565) 2627 0 R (1566) 2628 0 R (1567) 2629 0 R (1568) 2630 0 R (1569) 2631 0 R (1570) 2632 0 R (1571) 2633 0 R (1572) 2634 0 R (1573) 2635 0 R (1574) 2636 0 R (1575) 2637 0 R (1576) 2638 0 R (1577) 2639 0 R (1578) 2640 0 R (1579) 2641 0 R (1580) 2642 0 R (1581) 2643 0 R (1582) 2644 0 R (1583) 2645 0 R (1584) 2646 0 R (1585) 2647 0 R (1586) 2648 0 R (1589) 2651 0 R (1590) 2652 0 R (1591) 2653 0 R (1592) 2654 0 R (1593) 2655 0 R (1594) 2656 0 R (1595) 2657 0 R (1596) 2658 0 R (1597) 2659 0 R (16.0) 114 0 R (16.10.1) 130 0 R (16.11.1) 134 0 R (16.7.1) 118 0 R (16.8.1) 122 0 R (16.9.1) 126 0 R (1601) 2661 0 R (1602) 2662 0 R (1603) 2663 0 R (1605) 1198 0 R (1607) 2669 0 R (1608) 2670 0 R (1609) 2671 0 R (1610) 2672 0 R (1611) 2673 0 R (1612) 2674 0 R (1613) 2675 0 R (1614) 2676 0 R (1615) 2677 0 R (1616) 2678 0 R (1617) 2679 0 R (1618) 2680 0 R (1619) 2681 0 R (1620) 2682 0 R (1621) 2683 0 R (1622) 2684 0 R (1623) 2685 0 R (1624) 2686 0 R (1625) 2687 0 R (1626) 2688 0 R (1627) 2689 0 R (1628) 1199 0 R (1630) 2690 0 R (1631) 2691 0 R (1632) 2692 0 R (1633) 2693 0 R (1634) 2698 0 R (1635) 2699 0 R (1636) 2700 0 R (1637) 2701 0 R (1638) 1200 0 R (1640) 2702 0 R (1641) 2703 0 R (1642) 2704 0 R (1643) 2705 0 R (1644) 2706 0 R (1645) 2707 0 R (1646) 2708 0 R (1647) 2709 0 R (1648) 2710 0 R (1649) 2711 0 R (1650) 2712 0 R (1651) 1201 0 R (1653) 2713 0 R (1654) 2714 0 R (1655) 2715 0 R (1656) 2716 0 R (1657) 2717 0 R (1658) 2718 0 R (1659) 2719 0 R (1660) 2720 0 R (1661) 2721 0 R (1662) 2722 0 R (1663) 2723 0 R (1664) 2729 0 R (1665) 2730 0 R (1666) 2731 0 R (1667) 2732 0 R (1668) 2733 0 R (1669) 2734 0 R (1670) 2735 0 R (1671) 2736 0 R (1672) 2737 0 R (1673) 2738 0 R (1674) 2739 0 R (1675) 2740 0 R (1676) 2741 0 R (1677) 2742 0 R (1678) 2743 0 R (1679) 2744 0 R (1680) 2745 0 R (1681) 2746 0 R (1684) 2747 0 R (1685) 2748 0 R (1686) 2749 0 R (1687) 2750 0 R (1688) 2751 0 R (1689) 2752 0 R (1690) 2753 0 R (1693) 2758 0 R (1694) 2759 0 R (1695) 2728 0 R (1696) 2760 0 R (1697) 2761 0 R (1698) 2762 0 R (1699) 2763 0 R (17.0) 138 0 R (17.12.1) 142 0 R (17.13.1) 146 0 R (17.14.1) 150 0 R (17.15.1) 154 0 R (1700) 2764 0 R (1701) 2765 0 R (1702) 2766 0 R (1703) 2767 0 R (1704) 2768 0 R (1705) 2774 0 R (1706) 2775 0 R (1707) 2776 0 R (1710) 2777 0 R (1711) 2778 0 R (1712) 2779 0 R (1713) 2780 0 R (1714) 2781 0 R (1715) 2782 0 R (1716) 2783 0 R (1717) 2784 0 R (1718) 2785 0 R (1719) 2786 0 R (1720) 2787 0 R (1721) 2788 0 R (1723) 2790 0 R (1724) 2791 0 R (1726) 2793 0 R (1727) 2794 0 R (1729) 2796 0 R (1730) 2797 0 R (1731) 2798 0 R (1732) 2803 0 R (1733) 2804 0 R (1734) 2805 0 R (1737) 2806 0 R (1738) 2807 0 R (1739) 2808 0 R (1740) 2809 0 R (1741) 2810 0 R (1742) 2811 0 R (1743) 2812 0 R (1744) 2813 0 R (1745) 2814 0 R (1746) 2815 0 R (1747) 2816 0 R (1748) 2817 0 R (1749) 2818 0 R (1750) 2819 0 R (1751) 2820 0 R (1752) 2821 0 R (1755) 2822 0 R (1756) 2823 0 R (1757) 2824 0 R (1758) 2825 0 R (1759) 2830 0 R (1760) 2831 0 R (1761) 2832 0 R (1762) 2833 0 R (1763) 2834 0 R (1764) 2835 0 R (1765) 2836 0 R (1766) 2837 0 R (1767) 2838 0 R (1768) 2839 0 R (1769) 2840 0 R (1770) 2841 0 R (1771) 2842 0 R (1772) 2843 0 R (1773) 2844 0 R (1774) 2845 0 R (1775) 2846 0 R (1776) 2847 0 R (1777) 2848 0 R (1780) 2849 0 R (1781) 2850 0 R (1782) 2851 0 R (1783) 2852 0 R (1784) 2853 0 R (1785) 2854 0 R (1786) 2855 0 R (1787) 2856 0 R (1788) 2857 0 R (1789) 2862 0 R (1796) 2865 0 R (18.0) 158 0 R (1801) 2869 0 R (1802) 2870 0 R (1803) 2871 0 R (1804) 2872 0 R (1805) 2873 0 R (1806) 2874 0 R (1809) 2875 0 R (1810) 2876 0 R (1811) 2877 0 R (1812) 2878 0 R (1813) 2879 0 R (1816) 2880 0 R (1819) 2885 0 R (1820) 2886 0 R (1822) 2888 0 R (1826) 2890 0 R (1828) 2891 0 R (1832) 2893 0 R (1834) 2894 0 R (1838) 2896 0 R (1840) 2897 0 R (1841) 2898 0 R (1842) 2899 0 R (1843) 2900 0 R (1847) 2902 0 R (1849) 2903 0 R (1850) 2904 0 R (1851) 2905 0 R (1852) 2906 0 R (1856) 2908 0 R (1858) 2909 0 R (1862) 2911 0 R (1864) 2912 0 R (1868) 2914 0 R (1870) 2919 0 R (1871) 2920 0 R (1875) 2922 0 R (1877) 2923 0 R (1878) 2924 0 R (1879) 2925 0 R (1880) 2926 0 R (1884) 2928 0 R (1885) 2929 0 R (1887) 2930 0 R (1888) 2931 0 R (189) 1385 0 R (1892) 2933 0 R (1893) 2934 0 R (1895) 2935 0 R (1896) 2936 0 R (19.0) 162 0 R (19.16.1) 166 0 R (19.17.1) 170 0 R (19.18.1) 174 0 R (19.18.10.2) 186 0 R (19.18.11.2) 190 0 R (19.18.12.2) 194 0 R (19.18.13.2) 198 0 R (19.18.14.2) 202 0 R (19.18.15.2) 206 0 R (19.18.16.2) 210 0 R (19.18.17.2) 214 0 R (19.18.18.2) 218 0 R (19.18.19.2) 222 0 R (19.18.20.2) 226 0 R (19.18.21.2) 230 0 R (19.18.22.2) 234 0 R (19.18.23.2) 238 0 R (19.18.24.2) 242 0 R (19.18.25.2) 246 0 R (19.18.8.2) 178 0 R (19.18.9.2) 182 0 R (19.19.1) 250 0 R (19.20.1) 254 0 R (19.21.1) 258 0 R (19.22.1) 262 0 R (19.23.1) 266 0 R (190) 1386 0 R (1900) 2938 0 R (1903) 2940 0 R (1904) 2941 0 R (1905) 2942 0 R (1906) 2943 0 R (191) 1387 0 R (1910) 2950 0 R (1915) 2952 0 R (192) 1388 0 R (1920) 2954 0 R (1925) 2956 0 R (193) 1389 0 R (1930) 2958 0 R (1935) 2960 0 R (1937) 2961 0 R (1938) 2962 0 R (194) 1390 0 R (1942) 2964 0 R (1944) 2965 0 R (1945) 2966 0 R (1949) 2968 0 R (195) 1391 0 R (1954) 2970 0 R (1959) 2976 0 R (196) 1392 0 R (1961) 2977 0 R (1962) 2978 0 R (1966) 2980 0 R (1968) 2981 0 R (1969) 2982 0 R (197) 1393 0 R (1970) 2983 0 R (1971) 2984 0 R (1972) 2985 0 R (1973) 2986 0 R (1974) 2987 0 R (1978) 2989 0 R (198) 1394 0 R (1980) 2990 0 R (1981) 2991 0 R (1985) 2993 0 R (199) 1395 0 R (1990) 2995 0 R (1995) 2997 0 R (2.0) 6 0 R (20.0) 270 0 R (20.24.1) 274 0 R (20.25.1) 278 0 R (20.26.1) 282 0 R (20.27.1) 286 0 R (20.28.1) 290 0 R (20.29.1) 294 0 R (20.30.1) 298 0 R (20.31.1) 302 0 R (200) 1396 0 R (2000) 3003 0 R (2002) 3004 0 R (2006) 3006 0 R (201) 1397 0 R (2011) 3008 0 R (2013) 3009 0 R (2017) 3011 0 R (202) 1398 0 R (2022) 3013 0 R (2025) 3015 0 R (2029) 3017 0 R (203) 1399 0 R (2031) 3018 0 R (2035) 3020 0 R (204) 1400 0 R (2040) 3027 0 R (2043) 3029 0 R (2047) 3031 0 R (2049) 3032 0 R (205) 1401 0 R (2053) 3034 0 R (2058) 3036 0 R (206) 1402 0 R (2060) 3037 0 R (2064) 3039 0 R (2066) 3040 0 R (2067) 3041 0 R (207) 1403 0 R (2071) 3043 0 R (2076) 3045 0 R (2079) 3047 0 R (208) 1404 0 R (2080) 3048 0 R (2081) 3049 0 R (2082) 3050 0 R (2083) 3051 0 R (2084) 3052 0 R (2085) 3053 0 R (2086) 3054 0 R (209) 1405 0 R (2090) 3056 0 R (2092) 3057 0 R (2094) 3026 0 R (2098) 3065 0 R (21.0) 306 0 R (21.32.1) 310 0 R (21.32.26.2) 314 0 R (21.32.27.2) 318 0 R (21.32.28.1.3) 326 0 R (21.32.28.2) 322 0 R (21.32.28.2.3) 330 0 R (21.32.29.2) 334 0 R (21.33.1) 338 0 R (21.34.1) 342 0 R (210) 1406 0 R (2103) 3067 0 R (2105) 3068 0 R (2106) 3069 0 R (2107) 3070 0 R (211) 1407 0 R (2111) 3072 0 R (2113) 3073 0 R (2114) 3074 0 R (2115) 3075 0 R (2119) 3077 0 R (212) 1408 0 R (2121) 3078 0 R (2122) 3079 0 R (2123) 3080 0 R (2127) 3082 0 R (2129) 3083 0 R (213) 1409 0 R (2130) 3084 0 R (2132) 3091 0 R (2136) 3093 0 R (214) 1410 0 R (2141) 3095 0 R (2146) 3097 0 R (2148) 3098 0 R (2149) 3099 0 R (215) 1411 0 R (2150) 3100 0 R (2154) 3102 0 R (2156) 3103 0 R (2157) 3104 0 R (2158) 3105 0 R (2159) 3106 0 R (2160) 3107 0 R (2161) 3108 0 R (2162) 3109 0 R (2163) 3110 0 R (2164) 3111 0 R (2165) 3112 0 R (2166) 3113 0 R (2167) 3114 0 R (2168) 3115 0 R (2169) 3116 0 R (2171) 3118 0 R (2175) 3120 0 R (218) 1412 0 R (2180) 3122 0 R (2185) 3129 0 R (2187) 3090 0 R (219) 1413 0 R (2195) 3132 0 R (22.0) 346 0 R (22.35.1) 350 0 R (22.36.1) 354 0 R (22.37.1) 358 0 R (220) 1418 0 R (2200) 3134 0 R (2205) 3136 0 R (2207) 3137 0 R (2208) 3138 0 R (221) 1419 0 R (2210) 3140 0 R (2214) 3142 0 R (2216) 3143 0 R (2217) 3144 0 R (2218) 3145 0 R (222) 1414 0 R (2222) 3151 0 R (2224) 3152 0 R (2225) 3153 0 R (2226) 3154 0 R (2227) 3155 0 R (2231) 3157 0 R (2233) 3158 0 R (2237) 3160 0 R (2239) 3161 0 R (224) 1420 0 R (2240) 3162 0 R (2241) 3163 0 R (2242) 3164 0 R (2243) 3165 0 R (2244) 3166 0 R (2245) 3167 0 R (2246) 3168 0 R (2247) 3169 0 R (2248) 3170 0 R (2249) 3171 0 R (225) 1421 0 R (2250) 3172 0 R (2251) 3173 0 R (2252) 3174 0 R (2255) 3179 0 R (2256) 3180 0 R (2259) 3181 0 R (226) 1422 0 R (2260) 3182 0 R (2261) 3183 0 R (2262) 3184 0 R (2263) 3185 0 R (2264) 3186 0 R (2265) 3187 0 R (2266) 3188 0 R (2267) 3189 0 R (227) 1423 0 R (2270) 3190 0 R (2271) 3191 0 R (2272) 3192 0 R (2273) 3193 0 R (2274) 3194 0 R (2275) 3195 0 R (2276) 3200 0 R (2277) 3201 0 R (2278) 1214 0 R (228) 1424 0 R (2280) 3202 0 R (2281) 3203 0 R (2282) 3204 0 R (2283) 3205 0 R (2284) 3206 0 R (2285) 3207 0 R (2286) 3208 0 R (2287) 3209 0 R (2288) 3210 0 R (2289) 3211 0 R (2290) 3212 0 R (2291) 3213 0 R (2292) 3214 0 R (2293) 3215 0 R (2294) 3216 0 R (2295) 3217 0 R (2296) 3218 0 R (2297) 3219 0 R (2298) 3220 0 R (2299) 3221 0 R (23.0) 362 0 R (23.38.1) 366 0 R (23.39.1) 370 0 R (23.40.1) 374 0 R (23.41.1) 378 0 R (2300) 3222 0 R (2301) 3223 0 R (2302) 3224 0 R (2303) 3225 0 R (2304) 3226 0 R (2305) 1215 0 R (2307) 3227 0 R (2308) 3228 0 R (2309) 3229 0 R (2310) 3230 0 R (2311) 3231 0 R (2312) 3232 0 R (2313) 3233 0 R (2314) 3234 0 R (2315) 3239 0 R (2318) 3257 0 R (2322) 3258 0 R (2323) 3259 0 R (2324) 3260 0 R (2325) 3261 0 R (2326) 3262 0 R (2327) 3263 0 R (2328) 3264 0 R (2329) 3265 0 R (233) 1428 0 R (2330) 3266 0 R (2331) 3267 0 R (2334) 3268 0 R (2335) 3269 0 R (2336) 3270 0 R (2337) 3271 0 R (2338) 3272 0 R (2339) 3273 0 R (234) 1429 0 R (2340) 3274 0 R (2341) 3275 0 R (2342) 3276 0 R (2343) 3277 0 R (2344) 3278 0 R (2345) 3279 0 R (2346) 3280 0 R (2347) 3281 0 R (2348) 3282 0 R (2349) 3283 0 R (2350) 3284 0 R (2353) 3289 0 R (2354) 3290 0 R (2357) 3291 0 R (2358) 3292 0 R (2359) 3293 0 R (2360) 3294 0 R (2361) 3295 0 R (2364) 3296 0 R (2365) 3297 0 R (2368) 3298 0 R (237) 1430 0 R (2370) 3300 0 R (2373) 3301 0 R (2374) 3302 0 R (2375) 3303 0 R (2376) 3304 0 R (2379) 3310 0 R (238) 1431 0 R (2380) 3311 0 R (2381) 3305 0 R (2383) 3312 0 R (2386) 3313 0 R (2387) 3314 0 R (2388) 3315 0 R (2389) 3316 0 R (239) 1432 0 R (2392) 3321 0 R (2393) 3322 0 R (2394) 3323 0 R (2397) 3324 0 R (2398) 3325 0 R (2399) 3326 0 R (24.0) 382 0 R (240) 1433 0 R (2402) 3327 0 R (2403) 3328 0 R (2404) 3329 0 R (2405) 3330 0 R (2406) 3331 0 R (2407) 3332 0 R (2408) 3338 0 R (2409) 3339 0 R (241) 1434 0 R (2412) 3340 0 R (2413) 3341 0 R (2416) 3342 0 R (2417) 3343 0 R (2418) 3344 0 R (2419) 3350 0 R (242) 1435 0 R (2422) 3351 0 R (2423) 3352 0 R (2424) 3353 0 R (2425) 3354 0 R (2426) 3355 0 R (2427) 3356 0 R (2428) 3357 0 R (2429) 3358 0 R (243) 1436 0 R (2430) 3359 0 R (2431) 3360 0 R (2432) 3361 0 R (2433) 3362 0 R (2434) 3363 0 R (2435) 3364 0 R (2436) 3365 0 R (2437) 3366 0 R (2438) 3367 0 R (2439) 3368 0 R (244) 1437 0 R (2440) 3369 0 R (2441) 3370 0 R (2442) 3371 0 R (2443) 3372 0 R (2444) 3373 0 R (2445) 3374 0 R (2446) 3375 0 R (2447) 3376 0 R (2448) 3377 0 R (2449) 3378 0 R (245) 1438 0 R (2450) 3379 0 R (2451) 3380 0 R (2452) 3381 0 R (2453) 3349 0 R (2454) 3386 0 R (2455) 3387 0 R (2458) 3388 0 R (2459) 3389 0 R (246) 1439 0 R (2460) 3390 0 R (2463) 3391 0 R (2464) 3392 0 R (2467) 3393 0 R (2468) 3398 0 R (247) 1440 0 R (2471) 3399 0 R (2474) 3400 0 R (2477) 3401 0 R (2478) 3402 0 R (2479) 3403 0 R (248) 1441 0 R (2482) 3404 0 R (2483) 3405 0 R (2484) 3406 0 R (2485) 3411 0 R (2486) 3412 0 R (2488) 3417 0 R (249) 1442 0 R (2491) 3418 0 R (2492) 3419 0 R (2493) 3420 0 R (2494) 3421 0 R (2495) 3422 0 R (25.0) 386 0 R (250) 1443 0 R (2500) 3424 0 R (2501) 3425 0 R (2502) 3426 0 R (2503) 3427 0 R (2504) 3428 0 R (2505) 3429 0 R (2507) 3430 0 R (2508) 3431 0 R (2509) 3432 0 R (2510) 3433 0 R (2511) 3434 0 R (2513) 3435 0 R (2514) 3436 0 R (2515) 3437 0 R (2516) 3438 0 R (2517) 3439 0 R (2518) 3440 0 R (2519) 3441 0 R (2520) 3442 0 R (2521) 3443 0 R (2523) 3444 0 R (2524) 3445 0 R (2525) 3446 0 R (2526) 3447 0 R (2527) 3448 0 R (2528) 3449 0 R (2529) 3450 0 R (253) 1444 0 R (2530) 3451 0 R (2531) 3452 0 R (2532) 3453 0 R (2533) 3454 0 R (2535) 3455 0 R (2536) 3456 0 R (2537) 3457 0 R (2538) 3458 0 R (2539) 3459 0 R (254) 1445 0 R (2540) 3460 0 R (2545) 3468 0 R (2546) 3469 0 R (2547) 3470 0 R (2548) 3471 0 R (2549) 3472 0 R (255) 1446 0 R (2550) 3473 0 R (2552) 3474 0 R (2553) 3475 0 R (2554) 3476 0 R (2557) 3477 0 R (2558) 3478 0 R (256) 1447 0 R (2564) 3480 0 R (2565) 3481 0 R (2566) 3482 0 R (2567) 3483 0 R (257) 1448 0 R (2570) 3485 0 R (2571) 3486 0 R (2575) 3487 0 R (2576) 3488 0 R (2577) 3489 0 R (2578) 3490 0 R (2579) 3491 0 R (258) 1449 0 R (2582) 3492 0 R (2583) 3493 0 R (2584) 3494 0 R (2585) 3495 0 R (2586) 3496 0 R (2587) 3497 0 R (2588) 3498 0 R (259) 1450 0 R (2592) 3504 0 R (2593) 3505 0 R (2594) 3506 0 R (2595) 3507 0 R (2596) 3508 0 R (26.0) 390 0 R (26.42.1) 394 0 R (26.43.1) 398 0 R (26.43.30.2) 402 0 R (26.43.31.2) 406 0 R (2601) 3511 0 R (2602) 3512 0 R (2603) 3513 0 R (2604) 3514 0 R (2605) 3515 0 R (2610) 3517 0 R (2611) 3518 0 R (2617) 3520 0 R (2618) 3521 0 R (2619) 3522 0 R (2620) 3523 0 R (2621) 3524 0 R (2622) 3525 0 R (2625) 3532 0 R (2626) 3533 0 R (2628) 3535 0 R (2629) 3536 0 R (2631) 3537 0 R (2632) 3538 0 R (2633) 3539 0 R (2634) 3540 0 R (2636) 3541 0 R (2637) 3542 0 R (2638) 3543 0 R (2639) 3544 0 R (2640) 3545 0 R (2642) 3546 0 R (2643) 3547 0 R (2644) 3548 0 R (2645) 3549 0 R (2652) 3552 0 R (2653) 3553 0 R (2654) 3554 0 R (2657) 3555 0 R (2658) 3556 0 R (2660) 3557 0 R (2661) 3558 0 R (2662) 3559 0 R (2663) 3560 0 R (2667) 3562 0 R (2668) 3563 0 R (2669) 3564 0 R (2670) 3565 0 R (2671) 3566 0 R (2672) 3567 0 R (2673) 3568 0 R (2674) 3569 0 R (2680) 3575 0 R (2681) 3576 0 R (2685) 3578 0 R (2686) 3579 0 R (2687) 3580 0 R (2691) 3582 0 R (2692) 3583 0 R (2693) 3584 0 R (2694) 3585 0 R (2695) 3586 0 R (2696) 3587 0 R (2697) 3588 0 R (2698) 3589 0 R (2699) 3590 0 R (27.0) 410 0 R (27.44.1) 414 0 R (27.45.1) 418 0 R (27.46.1) 422 0 R (27.47.1) 426 0 R (2700) 3591 0 R (2701) 3592 0 R (2702) 3593 0 R (2703) 3594 0 R (2704) 3595 0 R (2709) 3598 0 R (2710) 3599 0 R (2711) 3600 0 R (2715) 3601 0 R (2716) 3602 0 R (2721) 3609 0 R (2722) 3610 0 R (2723) 3611 0 R (2724) 3614 0 R (2725) 3612 0 R (2726) 3613 0 R (28.0) 430 0 R (280) 1456 0 R (281) 1457 0 R (282) 1458 0 R (283) 1459 0 R (284) 1460 0 R (285) 1461 0 R (286) 1462 0 R (287) 1463 0 R (288) 1464 0 R (289) 1465 0 R (29.0) 434 0 R (290) 1466 0 R (291) 1467 0 R (292) 1468 0 R (293) 1469 0 R (294) 1470 0 R (295) 1471 0 R (296) 1472 0 R (297) 1473 0 R (298) 1474 0 R (299) 1475 0 R (3.0) 10 0 R (30.0) 438 0 R (30.48.1) 442 0 R (30.49.1) 446 0 R (30.50.1) 450 0 R (30.51.1) 454 0 R (300) 1476 0 R (301) 1477 0 R (302) 1478 0 R (303) 1479 0 R (304) 1480 0 R (305) 1481 0 R (306) 1482 0 R (307) 1483 0 R (308) 1484 0 R (309) 1485 0 R (31.0) 458 0 R (31.52.1) 462 0 R (31.53.1) 466 0 R (31.54.1) 470 0 R (31.55.1) 474 0 R (31.56.1) 478 0 R (310) 1486 0 R (311) 1487 0 R (312) 1488 0 R (313) 1489 0 R (314) 1490 0 R (315) 1491 0 R (316) 1492 0 R (317) 1493 0 R (318) 1494 0 R (319) 1495 0 R (32.0) 482 0 R (320) 1496 0 R (321) 1497 0 R (322) 1498 0 R (323) 1499 0 R (324) 1500 0 R (325) 1501 0 R (326) 1502 0 R (327) 1503 0 R (328) 1504 0 R (329) 1505 0 R (33.0) 486 0 R (330) 1506 0 R (333) 1507 0 R (334) 1508 0 R (335) 1509 0 R (336) 1510 0 R (337) 1515 0 R (34) 1308 0 R (34.0) 490 0 R (34.57.1) 494 0 R (34.58.1) 498 0 R (34.59.1) 502 0 R (34.60.1) 506 0 R (340) 1516 0 R (341) 1517 0 R (342) 1518 0 R (35) 1311 0 R (35.0) 510 0 R (355) 1520 0 R (356) 1521 0 R (357) 1522 0 R (358) 1523 0 R (359) 1524 0 R (36) 1309 0 R (36.0) 514 0 R (360) 1525 0 R (361) 1526 0 R (362) 1527 0 R (363) 1528 0 R (364) 1529 0 R (365) 1530 0 R (366) 1531 0 R (367) 1532 0 R (368) 1533 0 R (37.0) 518 0 R (371) 1534 0 R (372) 1535 0 R (373) 1536 0 R (38) 1312 0 R (38.0) 522 0 R (38.61.1) 526 0 R (38.61.32.2) 530 0 R (383) 1542 0 R (386) 1543 0 R (389) 1544 0 R (39.0) 534 0 R (392) 1545 0 R (395) 1546 0 R (398) 1547 0 R (399) 1548 0 R (4.0) 14 0 R (40.0) 538 0 R (402) 1553 0 R (405) 1554 0 R (406) 922 0 R (408) 1555 0 R (409) 1556 0 R (41) 1313 0 R (41.0) 542 0 R (410) 1557 0 R (418) 1559 0 R (42) 1314 0 R (42.0) 546 0 R (421) 1560 0 R (422) 1561 0 R (423) 1562 0 R (424) 1563 0 R (425) 1564 0 R (428) 1565 0 R (429) 1570 0 R (43) 1315 0 R (43.0) 550 0 R (432) 1571 0 R (433) 1572 0 R (434) 1573 0 R (435) 926 0 R (437) 1574 0 R (438) 1575 0 R (439) 1576 0 R (44) 1316 0 R (44.0) 554 0 R (442) 1577 0 R (445) 1578 0 R (446) 1579 0 R (447) 1580 0 R (45) 1317 0 R (45.0) 558 0 R (450) 1581 0 R (451) 1586 0 R (452) 1587 0 R (453) 1588 0 R (456) 1589 0 R (459) 1590 0 R (46.0) 562 0 R (464) 1596 0 R (465) 1597 0 R (467) 1599 0 R (468) 1600 0 R (47.0) 566 0 R (470) 1602 0 R (471) 1603 0 R (472) 1604 0 R (473) 1605 0 R (474) 1606 0 R (475) 1607 0 R (478) 1609 0 R (48) 1318 0 R (48.0) 570 0 R (481) 1611 0 R (484) 1613 0 R (487) 1615 0 R (49) 1319 0 R (49.0) 574 0 R (490) 1617 0 R (495) 1619 0 R (496) 1620 0 R (497) 1621 0 R (498) 1622 0 R (499) 1623 0 R (5.0) 18 0 R (50) 1320 0 R (50.0) 578 0 R (500) 1624 0 R (501) 1629 0 R (502) 1630 0 R (504) 1632 0 R (507) 1633 0 R (508) 1634 0 R (509) 1635 0 R (51) 1326 0 R (51.0) 582 0 R (513) 1637 0 R (514) 1638 0 R (517) 1639 0 R (52) 1327 0 R (52.0) 586 0 R (520) 1642 0 R (525) 1645 0 R (526) 1646 0 R (527) 1647 0 R (528) 1648 0 R (529) 1649 0 R (53) 1321 0 R (53.0) 590 0 R (530) 1650 0 R (532) 1653 0 R (534) 1654 0 R (535) 1655 0 R (536) 1656 0 R (537) 1657 0 R (538) 1658 0 R (539) 1659 0 R (54.0) 594 0 R (541) 1660 0 R (542) 1661 0 R (545) 1663 0 R (546) 1671 0 R (547) 1672 0 R (548) 1673 0 R (549) 1674 0 R (55) 1328 0 R (55.0) 598 0 R (550) 1677 0 R (551) 1678 0 R (552) 1679 0 R (553) 1680 0 R (555) 1682 0 R (556) 1683 0 R (558) 1685 0 R (559) 1686 0 R (56) 1329 0 R (56.0) 602 0 R (561) 1688 0 R (562) 1689 0 R (564) 1691 0 R (565) 1692 0 R (567) 1694 0 R (568) 1695 0 R (57) 1330 0 R (57.0) 606 0 R (570) 1697 0 R (571) 1698 0 R (573) 1700 0 R (574) 1701 0 R (576) 1703 0 R (577) 1704 0 R (579) 1706 0 R (58.0) 610 0 R (580) 1707 0 R (582) 1709 0 R (583) 1710 0 R (585) 1712 0 R (586) 1713 0 R (587) 1714 0 R (589) 1716 0 R (59.0) 614 0 R (590) 1717 0 R (592) 1719 0 R (593) 1720 0 R (595) 1722 0 R (596) 1723 0 R (598) 1725 0 R (599) 1726 0 R (6.0) 22 0 R (60) 1331 0 R (60.0) 618 0 R (601) 1728 0 R (602) 1729 0 R (604) 1731 0 R (605) 1732 0 R (609) 1734 0 R (61) 1332 0 R (61.0) 622 0 R (610) 1739 0 R (611) 1740 0 R (612) 1741 0 R (613) 1742 0 R (615) 1745 0 R (616) 1746 0 R (617) 1747 0 R (62.0) 626 0 R (621) 1748 0 R (624) 1749 0 R (625) 1750 0 R (626) 1751 0 R (627) 1752 0 R (628) 1753 0 R (63) 1333 0 R (63.0) 630 0 R (63.61.33.2) 634 0 R (631) 1754 0 R (632) 1755 0 R (633) 1756 0 R (634) 1757 0 R (635) 1758 0 R (638) 1759 0 R (639) 1760 0 R (64) 1334 0 R (64.0) 638 0 R (64.61.34.2) 642 0 R (64.61.34.3.3) 646 0 R (640) 1761 0 R (641) 1762 0 R (642) 1767 0 R (645) 1768 0 R (646) 1769 0 R (647) 1770 0 R (648) 1771 0 R (649) 1772 0 R (65) 1335 0 R (65.0) 650 0 R (65.61.35.2) 654 0 R (65.61.36.2) 658 0 R (65.61.37.2) 662 0 R (652) 1773 0 R (653) 1774 0 R (654) 1775 0 R (655) 1776 0 R (656) 1777 0 R (657) 1778 0 R (658) 1779 0 R (66) 1336 0 R (66.0) 666 0 R (66.61.38.2) 670 0 R (66.61.39.2) 674 0 R (66.61.40.2) 678 0 R (66.61.41.2) 682 0 R (661) 1780 0 R (662) 1781 0 R (663) 1782 0 R (664) 1783 0 R (665) 1784 0 R (668) 1785 0 R (669) 1790 0 R (67.0) 686 0 R (67.61.42.2) 690 0 R (670) 1791 0 R (671) 1792 0 R (672) 1793 0 R (675) 1794 0 R (676) 1795 0 R (677) 1796 0 R (678) 1797 0 R (679) 1798 0 R (68) 1337 0 R (68.0) 694 0 R (68.61.43.2) 698 0 R (682) 1799 0 R (683) 1800 0 R (684) 1801 0 R (685) 1802 0 R (688) 1803 0 R (689) 1804 0 R (69) 1338 0 R (69.0) 702 0 R (69.61.44.2) 706 0 R (690) 1805 0 R (691) 1806 0 R (692) 1807 0 R (693) 1808 0 R (694) 1809 0 R (695) 1810 0 R (696) 1811 0 R (697) 1812 0 R (698) 1813 0 R (699) 1814 0 R (7.0) 26 0 R (70) 1339 0 R (70.0) 710 0 R (70.61.45.2) 714 0 R (70.61.46.2) 718 0 R (700) 1815 0 R (703) 1821 0 R (704) 1822 0 R (705) 1823 0 R (706) 1824 0 R (709) 1825 0 R (71) 1340 0 R (71.0) 722 0 R (71.61.47.2) 726 0 R (71.61.48.2) 730 0 R (71.61.49.2) 734 0 R (710) 1826 0 R (711) 1827 0 R (712) 1828 0 R (713) 1829 0 R (714) 1830 0 R (717) 1831 0 R (718) 1832 0 R (719) 1833 0 R (72.0) 738 0 R (72.61.50.2) 742 0 R (720) 1834 0 R (721) 1835 0 R (724) 1836 0 R (725) 1837 0 R (726) 1838 0 R (727) 1839 0 R (728) 1840 0 R (73) 1341 0 R (73.0) 746 0 R (73.61.51.2) 750 0 R (73.61.52.2) 754 0 R (731) 1841 0 R (732) 1842 0 R (733) 1843 0 R (734) 1844 0 R (735) 1845 0 R (736) 1846 0 R (739) 1851 0 R (74) 1342 0 R (74.0) 758 0 R (74.61.53.2) 762 0 R (740) 1852 0 R (741) 1853 0 R (742) 1854 0 R (743) 1855 0 R (746) 1856 0 R (749) 1860 0 R (75) 1343 0 R (75.0) 766 0 R (75.61.54.2) 770 0 R (75.61.55.2) 774 0 R (750) 1861 0 R (751) 1862 0 R (754) 1863 0 R (755) 1864 0 R (756) 1865 0 R (757) 1866 0 R (758) 1867 0 R (759) 1868 0 R (76) 1344 0 R (76.0) 778 0 R (76.61.56.2) 782 0 R (760) 1869 0 R (761) 1870 0 R (762) 1871 0 R (763) 1872 0 R (764) 1873 0 R (765) 1874 0 R (766) 1875 0 R (767) 1876 0 R (770) 1882 0 R (771) 1883 0 R (772) 1884 0 R (774) 1886 0 R (775) 1887 0 R (776) 1888 0 R (777) 1889 0 R (778) 1890 0 R (779) 1891 0 R (78) 1345 0 R (780) 1892 0 R (781) 1893 0 R (782) 1894 0 R (783) 1895 0 R (784) 1896 0 R (785) 1897 0 R (786) 1898 0 R (787) 1899 0 R (788) 1900 0 R (789) 1901 0 R (79) 1346 0 R (790) 1902 0 R (791) 1903 0 R (792) 1904 0 R (793) 1905 0 R (794) 1054 0 R (797) 1906 0 R (798) 1907 0 R (799) 1908 0 R (8.0) 30 0 R (80) 1347 0 R (800) 1909 0 R (801) 1910 0 R (802) 1911 0 R (803) 1912 0 R (804) 1913 0 R (805) 1914 0 R (806) 1915 0 R (807) 1916 0 R (808) 1917 0 R (809) 1918 0 R (81) 1348 0 R (810) 1919 0 R (811) 1920 0 R (812) 1921 0 R (813) 1922 0 R (814) 1923 0 R (815) 1924 0 R (816) 1925 0 R (817) 1930 0 R (818) 1931 0 R (819) 1932 0 R (820) 1933 0 R (821) 1934 0 R (822) 1935 0 R (823) 1936 0 R (824) 1937 0 R (825) 1055 0 R (827) 1938 0 R (831) 1057 0 R (833) 1940 0 R (834) 1941 0 R (835) 1942 0 R (836) 1943 0 R (837) 1944 0 R (838) 1945 0 R (839) 1946 0 R (84) 1350 0 R (840) 1947 0 R (841) 1948 0 R (842) 1949 0 R (843) 1950 0 R (844) 1951 0 R (845) 1952 0 R (846) 1058 0 R (848) 1953 0 R (849) 1954 0 R (85) 1351 0 R (850) 1955 0 R (851) 1961 0 R (858) 1963 0 R (859) 1059 0 R (86) 1352 0 R (861) 1964 0 R (862) 1965 0 R (863) 1966 0 R (867) 1968 0 R (868) 1969 0 R (869) 1970 0 R (87) 1353 0 R (872) 1971 0 R (873) 1972 0 R (874) 1973 0 R (875) 1974 0 R (876) 1975 0 R (877) 1976 0 R (878) 1982 0 R (879) 1983 0 R (882) 1987 0 R (883) 1960 0 R (884) 1988 0 R (887) 1990 0 R (888) 1991 0 R (889) 1992 0 R (89) 1354 0 R (890) 1993 0 R (891) 1994 0 R (892) 1995 0 R (893) 1996 0 R (896) 1998 0 R (897) 1999 0 R (898) 2000 0 R (899) 2001 0 R (9.0) 34 0 R (90) 1355 0 R (900) 2002 0 R (903) 2004 0 R (904) 2005 0 R (905) 2006 0 R (906) 2007 0 R (909) 2009 0 R (91) 1356 0 R (910) 2010 0 R (911) 2011 0 R (912) 2012 0 R (915) 2014 0 R (916) 2015 0 R (917) 2016 0 R (918) 2017 0 R (92) 1357 0 R (921) 2025 0 R (922) 2026 0 R (923) 1981 0 R (927) 2027 0 R (928) 2028 0 R (929) 2029 0 R (93) 1358 0 R (930) 2030 0 R (931) 2031 0 R (932) 2032 0 R (933) 2033 0 R (934) 2034 0 R (935) 2035 0 R (939) 2036 0 R (94) 1359 0 R (940) 2037 0 R (941) 2038 0 R (942) 2039 0 R (946) 2040 0 R (95) 1360 0 R (950) 2045 0 R (951) 2046 0 R (952) 2047 0 R (953) 2048 0 R (954) 2049 0 R (955) 2050 0 R (958) 2051 0 R (959) 2052 0 R (960) 2053 0 R (963) 2054 0 R (964) 2055 0 R (967) 2056 0 R (968) 2057 0 R (969) 2058 0 R (97) 1361 0 R (972) 2059 0 R (975) 2062 0 R (976) 2063 0 R (977) 2064 0 R (978) 2070 0 R (979) 2071 0 R (98) 1362 0 R (980) 2072 0 R (981) 2073 0 R (982) 2074 0 R (983) 2075 0 R (986) 2076 0 R (987) 2077 0 R (99) 1363 0 R (991) 2079 0 R (992) 2080 0 R (993) 2081 0 R (994) 2082 0 R (995) 2083 0 R (996) 2084 0 R (997) 2085 0 R (998) 2086 0 R (999) 2087 0 R (Doc-Start) 790 0 R (about) 897 0 R (accountsettings) 928 0 R (administration) 1178 0 R (attachments) 925 0 R (bonsai) 1206 0 R (bug_page) 909 0 R (bugreports) 912 0 R (bzldap) 1060 0 R (cmdline) 1218 0 R (commenting) 924 0 R (components) 1187 0 R (content-type) 1061 0 R (conventions) 902 0 R (copyright) 898 0 R (cpan-moduletar) 1666 0 R (createnewusers) 1183 0 R (credits) 901 0 R (cust-change-permissions) 1203 0 R (cust-templates) 1197 0 R (cvs) 1207 0 R (database) 1211 0 R (dbdoc) 1213 0 R (dbmodify) 1212 0 R (defaultuser) 1181 0 R (dir) 2863 0 R (directoryindex) 1062 0 R (disclaimer) 899 0 R (emailsettings) 929 0 R (extraconfig) 1056 0 R (faq) 1210 0 R (faq-db) 3063 0 R (faq-db-corrupted) 3066 0 R (faq-db-manualedit) 3071 0 R (faq-db-oracle) 3064 0 R (faq-db-permissions) 3076 0 R (faq-db-synchronize) 3081 0 R (faq-email) 3028 0 R (faq-email-mailif) 3042 0 R (faq-email-nomail) 3030 0 R (faq-email-nonreceived) 3055 0 R (faq-email-procmail) 3038 0 R (faq-email-sendmailnow) 3044 0 R (faq-email-testing) 3033 0 R (faq-email-whine) 3035 0 R (faq-general) 2887 0 R (faq-general-bonsaitools) 2927 0 R (faq-general-bzmissing) 2913 0 R (faq-general-companies) 2901 0 R (faq-general-compare) 2910 0 R (faq-general-cookie) 2937 0 R (faq-general-information) 2889 0 R (faq-general-license) 2892 0 R (faq-general-maintainers) 2907 0 R (faq-general-mysql) 2921 0 R (faq-general-perlpath) 2932 0 R (faq-general-support) 2895 0 R (faq-hacking) 3139 0 R (faq-hacking-bugzillabugs) 3150 0 R (faq-hacking-patches) 3159 0 R (faq-hacking-priority) 3156 0 R (faq-hacking-templatestyle) 3141 0 R (faq-nt) 3085 0 R (faq-nt-bundle) 3094 0 R (faq-nt-dbi) 3101 0 R (faq-nt-easiest) 3092 0 R (faq-nt-mappings) 3096 0 R (faq-phb) 2939 0 R (faq-phb-attachments) 2957 0 R (faq-phb-backup) 2998 0 R (faq-phb-cclist) 2969 0 R (faq-phb-client) 2944 0 R (faq-phb-cost) 3012 0 R (faq-phb-data) 2979 0 R (faq-phb-email) 2967 0 R (faq-phb-emailapp) 2971 0 R (faq-phb-installtime) 3010 0 R (faq-phb-integration) 2951 0 R (faq-phb-l10n) 2988 0 R (faq-phb-livebackup) 3005 0 R (faq-phb-maintenance) 3007 0 R (faq-phb-midair) 2996 0 R (faq-phb-priorities) 2959 0 R (faq-phb-projects) 2953 0 R (faq-phb-reporting) 2963 0 R (faq-phb-reports) 2992 0 R (faq-phb-searching) 2994 0 R (faq-phb-sorting) 2955 0 R (faq-security) 3014 0 R (faq-security-knownproblems) 3019 0 R (faq-security-mysql) 3016 0 R (faq-security-mysqluser) 3021 0 R (faq-use) 3117 0 R (faq-use-accept) 3123 0 R (faq-use-attachment) 3131 0 R (faq-use-changeaddress) 3119 0 R (faq-use-close) 3135 0 R (faq-use-keyword) 3133 0 R (faq-use-query) 3121 0 R (footersettings) 930 0 R (gfdl) 1262 0 R (gfdl-0) 1263 0 R (gfdl-1) 1264 0 R (gfdl-10) 1273 0 R (gfdl-2) 1265 0 R (gfdl-3) 1266 0 R (gfdl-4) 1267 0 R (gfdl-5) 1268 0 R (gfdl-6) 1269 0 R (gfdl-7) 1270 0 R (gfdl-8) 1271 0 R (gfdl-9) 1272 0 R (gfdl-howto) 1274 0 R (gloss-a) 3423 0 R (gloss-apache) 2182 0 R (gloss-b) 3462 0 R (gloss-bugzilla) 1381 0 R (gloss-c) 3479 0 R (gloss-cgi) 1877 0 R (gloss-component) 3484 0 R (gloss-contrib) 2019 0 R (gloss-cpan) 1664 0 R (gloss-d) 3503 0 R (gloss-g) 3509 0 R (gloss-groups) 3510 0 R (gloss-j) 3516 0 R (gloss-javascript) 2181 0 R (gloss-m) 3519 0 R (gloss-mta) 3058 0 R (gloss-mysql) 3531 0 R (gloss-p) 3551 0 R (gloss-ppm) 1665 0 R (gloss-product) 2400 0 R (gloss-q) 3561 0 R (gloss-r) 3530 0 R (gloss-rdbms) 3570 0 R (gloss-regexp) 3577 0 R (gloss-s) 3581 0 R (gloss-t) 3596 0 R (gloss-target-milestone) 3597 0 R (gloss-tcl) 2239 0 R (gloss-z) 3603 0 R (gloss-zarro) 3608 0 R (glossary) 1275 0 R (groups) 1191 0 R (hintsandtips) 921 0 R (how) 907 0 R (http) 1073 0 R (http-aol) 1076 0 R (http-apache) 1074 0 R (http-apache-htaccess) 1301 0 R (http-iis) 1075 0 R (index) 791 0 R (install-bzfiles) 1052 0 R (install-file-spec) 1040 0 R (install-modules-appconfig) 938 0 R (install-modules-bundle-bugzilla) 937 0 R (install-modules-cgi) 939 0 R (install-modules-chart-base) 1045 0 R (install-modules-data-dumper) 940 0 R (install-modules-date-format) 1037 0 R (install-modules-dbd-mysql) 1039 0 R (install-modules-dbi) 1038 0 R (install-modules-file-temp) 1041 0 R (install-modules-gd) 1044 0 R (install-modules-gd-graph) 1047 0 R (install-modules-gd-text-align) 1048 0 R (install-modules-mime-parser) 1049 0 R (install-modules-patchreader) 1050 0 R (install-modules-template) 1042 0 R (install-modules-text-wrap) 1043 0 R (install-modules-xml-parser) 1046 0 R (install-mysql) 934 0 R (install-mysql-packets) 1297 0 R (install-perl) 935 0 R (install-perlmodules) 936 0 R (install-perlmodules-cpan) 1300 0 R (install-setupdatabase) 1053 0 R (install-webserver) 1051 0 R (installation) 932 0 R (integration) 1205 0 R (introduction) 903 0 R (list) 911 0 R (manageusers) 1182 0 R (milestones) 1189 0 R (mod-throttle) 1064 0 R (mod_perl) 1063 0 R (modifyusers) 1184 0 R (myaccount) 908 0 R (newversions) 900 0 R (os-macosx) 1071 0 R (os-mandrake) 1072 0 R (os-specific) 1065 0 R (os-win32) 1066 0 R (page.1) 789 0 R (page.10) 1552 0 R (page.11) 1569 0 R (page.12) 1585 0 R (page.13) 1595 0 R (page.14) 1628 0 R (page.15) 1670 0 R (page.16) 1738 0 R (page.17) 1766 0 R (page.18) 1789 0 R (page.19) 1820 0 R (page.2) 798 0 R (page.20) 1850 0 R (page.21) 1881 0 R (page.22) 1929 0 R (page.23) 1959 0 R (page.24) 1980 0 R (page.25) 2023 0 R (page.26) 2044 0 R (page.27) 2068 0 R (page.28) 2096 0 R (page.29) 2118 0 R (page.3) 804 0 R (page.30) 2153 0 R (page.31) 2186 0 R (page.32) 2211 0 R (page.33) 2243 0 R (page.34) 2266 0 R (page.35) 2274 0 R (page.36) 2305 0 R (page.37) 2331 0 R (page.38) 2365 0 R (page.39) 2404 0 R (page.4) 944 0 R (page.40) 2437 0 R (page.41) 2471 0 R (page.42) 2519 0 R (page.43) 2550 0 R (page.44) 2614 0 R (page.45) 2668 0 R (page.46) 2697 0 R (page.47) 2727 0 R (page.48) 2757 0 R (page.49) 2773 0 R (page.5) 1085 0 R (page.50) 2802 0 R (page.51) 2829 0 R (page.52) 2861 0 R (page.53) 2884 0 R (page.54) 2918 0 R (page.55) 2949 0 R (page.56) 2975 0 R (page.57) 3002 0 R (page.58) 3025 0 R (page.59) 3062 0 R (page.6) 1227 0 R (page.60) 3089 0 R (page.61) 3128 0 R (page.62) 3149 0 R (page.63) 3178 0 R (page.64) 3199 0 R (page.65) 3238 0 R (page.66) 3243 0 R (page.67) 3248 0 R (page.68) 3252 0 R (page.69) 3256 0 R (page.7) 1279 0 R (page.70) 3288 0 R (page.71) 3309 0 R (page.72) 3320 0 R (page.73) 3337 0 R (page.74) 3348 0 R (page.75) 3385 0 R (page.76) 3397 0 R (page.77) 3410 0 R (page.78) 3416 0 R (page.79) 3467 0 R (page.8) 1514 0 R (page.80) 3502 0 R (page.81) 3529 0 R (page.82) 3574 0 R (page.83) 3607 0 R (page.9) 1541 0 R (param-LDAPBaseDN) 2008 0 R (param-LDAPbinddn) 2003 0 R (param-LDAPmailattribute) 2024 0 R (param-LDAPserver) 1997 0 R (param-LDAPuidattribute) 2013 0 R (param-loginmethod) 1989 0 R (parameters) 1179 0 R (paranoid-security) 1080 0 R (patches) 1216 0 R (patchviewer) 913 0 R (patchviewer_bonsai_lxr) 919 0 R (patchviewer_collapse) 917 0 R (patchviewer_context) 916 0 R (patchviewer_diff) 915 0 R (patchviewer_link) 918 0 R (patchviewer_unified_diff) 920 0 R (patchviewer_view) 914 0 R (permissionsettings) 931 0 R (products) 1186 0 R (programadmin) 1185 0 R (query) 910 0 R (quicksearch) 923 0 R (rewrite) 1217 0 R (scm) 1208 0 R (security) 1192 0 R (security-access) 1196 0 R (security-daemon) 1195 0 R (security-mysql) 1194 0 R (security-networking) 1193 0 R (stepbystep) 933 0 R (table.1) 1377 0 R (table.2) 1451 0 R (table.3) 1519 0 R (table.4) 1537 0 R (table.5) 1558 0 R (table.6) 1962 0 R (table.7) 1967 0 R (table.8) 3130 0 R (template-http-accept) 1202 0 R (tinderbox) 1209 0 R (trouble-filetemp) 1081 0 R (trouble-filetemp-errors) 1298 0 R (trouble-filetemp-patch) 1299 0 R (troubleshooting) 1077 0 R (upgrade-cvs) 1302 0 R (upgrade-patches) 1304 0 R (upgrade-tarball) 1303 0 R (upgrading) 1204 0 R (useradmin) 1180 0 R (userpreferences) 927 0 R (using) 906 0 R (variant-fenris) 1221 0 R (variant-issuezilla) 1222 0 R (variant-perforce) 1260 0 R (variant-redhat) 1220 0 R (variant-scarab) 1223 0 R (variant-sourceforge) 1261 0 R (variants) 1219 0 R (versions) 1188 0 R (voting) 1190 0 R (whatis) 904 0 R (why) 905 0 R (win32-code-bugmail) 2088 0 R (win32-code-changes) 1069 0 R (win32-code-checksetup) 2078 0 R (win32-http) 1070 0 R (win32-perl) 1067 0 R (win32-perlmodules) 1068 0 R] +/Limits [(1.0) (win32-perlmodules)] +>> endobj +3622 0 obj << +/Kids [3621 0 R] +>> endobj +3623 0 obj << +/Dests 3622 0 R +>> endobj +3624 0 obj << +/Type /Catalog +/Pages 3619 0 R +/Outlines 3620 0 R +/Names 3623 0 R +/PageMode /UseOutlines /URI<</Base()>> /ViewerPreferences<<>> +/OpenAction 785 0 R +/PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) +>> endobj +3625 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.10b)/Keywords() +/CreationDate (D:20031102152000) +>> endobj +xref +0 3626 +0000000792 65535 f +0000000009 00000 n +0000018050 00000 n +0000656402 00000 n +0000000048 00000 n +0000000111 00000 n +0000090125 00000 n +0000656317 00000 n +0000000150 00000 n +0000000185 00000 n +0000267180 00000 n +0000656230 00000 n +0000000224 00000 n +0000000258 00000 n +0000267242 00000 n +0000656141 00000 n +0000000298 00000 n +0000000333 00000 n +0000270489 00000 n +0000656052 00000 n +0000000373 00000 n +0000000419 00000 n +0000270613 00000 n +0000655963 00000 n +0000000459 00000 n +0000000504 00000 n +0000270990 00000 n +0000655874 00000 n +0000000544 00000 n +0000000578 00000 n +0000271429 00000 n +0000655785 00000 n +0000000618 00000 n +0000000654 00000 n +0000274881 00000 n +0000655696 00000 n +0000000694 00000 n +0000000725 00000 n +0000277470 00000 n +0000655607 00000 n +0000000766 00000 n +0000000810 00000 n +0000282271 00000 n +0000655518 00000 n +0000000851 00000 n +0000000893 00000 n +0000282394 00000 n +0000655429 00000 n +0000000934 00000 n +0000000975 00000 n +0000284217 00000 n +0000655340 00000 n +0000001016 00000 n +0000001067 00000 n +0000289507 00000 n +0000655251 00000 n +0000001108 00000 n +0000001152 00000 n +0000289631 00000 n +0000655124 00000 n +0000001193 00000 n +0000001239 00000 n +0000289880 00000 n +0000655050 00000 n +0000001282 00000 n +0000001333 00000 n +0000290889 00000 n +0000654963 00000 n +0000001376 00000 n +0000001418 00000 n +0000298458 00000 n +0000654876 00000 n +0000001461 00000 n +0000001505 00000 n +0000301722 00000 n +0000654789 00000 n +0000001548 00000 n +0000001583 00000 n +0000302095 00000 n +0000654702 00000 n +0000001626 00000 n +0000001663 00000 n +0000303103 00000 n +0000654590 00000 n +0000001706 00000 n +0000001744 00000 n +0000305999 00000 n +0000654516 00000 n +0000001789 00000 n +0000001848 00000 n +0000306185 00000 n +0000654429 00000 n +0000001893 00000 n +0000001962 00000 n +0000306372 00000 n +0000654342 00000 n +0000002007 00000 n +0000002066 00000 n +0000306559 00000 n +0000654253 00000 n +0000002111 00000 n +0000002184 00000 n +0000306746 00000 n +0000654162 00000 n +0000002230 00000 n +0000002290 00000 n +0000306934 00000 n +0000654070 00000 n +0000002336 00000 n +0000002388 00000 n +0000309566 00000 n +0000653992 00000 n +0000002434 00000 n +0000002486 00000 n +0000309752 00000 n +0000653860 00000 n +0000002528 00000 n +0000002567 00000 n +0000309940 00000 n +0000653781 00000 n +0000002611 00000 n +0000002655 00000 n +0000310381 00000 n +0000653688 00000 n +0000002699 00000 n +0000002737 00000 n +0000310823 00000 n +0000653595 00000 n +0000002781 00000 n +0000002816 00000 n +0000313563 00000 n +0000653502 00000 n +0000002861 00000 n +0000002899 00000 n +0000313875 00000 n +0000653423 00000 n +0000002944 00000 n +0000002982 00000 n +0000314189 00000 n +0000653290 00000 n +0000003024 00000 n +0000003065 00000 n +0000314377 00000 n +0000653211 00000 n +0000003110 00000 n +0000003153 00000 n +0000314692 00000 n +0000653118 00000 n +0000003198 00000 n +0000003239 00000 n +0000316496 00000 n +0000653025 00000 n +0000003284 00000 n +0000003322 00000 n +0000316684 00000 n +0000652946 00000 n +0000003367 00000 n +0000003405 00000 n +0000321068 00000 n +0000652852 00000 n +0000003447 00000 n +0000003490 00000 n +0000321193 00000 n +0000652719 00000 n +0000003532 00000 n +0000003575 00000 n +0000322263 00000 n +0000652640 00000 n +0000003620 00000 n +0000003652 00000 n +0000327178 00000 n +0000652547 00000 n +0000003697 00000 n +0000003728 00000 n +0000327429 00000 n +0000652414 00000 n +0000003773 00000 n +0000003812 00000 n +0000337395 00000 n +0000652335 00000 n +0000003859 00000 n +0000003904 00000 n +0000340084 00000 n +0000652242 00000 n +0000003951 00000 n +0000003998 00000 n +0000340272 00000 n +0000652149 00000 n +0000004046 00000 n +0000004087 00000 n +0000340713 00000 n +0000652056 00000 n +0000004135 00000 n +0000004184 00000 n +0000341157 00000 n +0000651963 00000 n +0000004232 00000 n +0000004286 00000 n +0000343633 00000 n +0000651870 00000 n +0000004334 00000 n +0000004375 00000 n +0000344074 00000 n +0000651777 00000 n +0000004423 00000 n +0000004472 00000 n +0000344643 00000 n +0000651684 00000 n +0000004520 00000 n +0000004568 00000 n +0000345087 00000 n +0000651591 00000 n +0000004616 00000 n +0000004663 00000 n +0000347691 00000 n +0000651498 00000 n +0000004711 00000 n +0000004766 00000 n +0000348134 00000 n +0000651405 00000 n +0000004814 00000 n +0000004868 00000 n +0000348513 00000 n +0000651312 00000 n +0000004916 00000 n +0000004968 00000 n +0000351168 00000 n +0000651219 00000 n +0000005016 00000 n +0000005078 00000 n +0000351547 00000 n +0000651126 00000 n +0000005126 00000 n +0000005186 00000 n +0000352054 00000 n +0000651033 00000 n +0000005234 00000 n +0000005292 00000 n +0000352497 00000 n +0000650940 00000 n +0000005340 00000 n +0000005404 00000 n +0000352941 00000 n +0000650847 00000 n +0000005452 00000 n +0000005513 00000 n +0000356862 00000 n +0000650768 00000 n +0000005561 00000 n +0000005623 00000 n +0000357305 00000 n +0000650675 00000 n +0000005668 00000 n +0000005706 00000 n +0000357683 00000 n +0000650582 00000 n +0000005751 00000 n +0000005786 00000 n +0000361702 00000 n +0000650489 00000 n +0000005831 00000 n +0000005887 00000 n +0000363289 00000 n +0000650396 00000 n +0000005932 00000 n +0000005972 00000 n +0000367965 00000 n +0000650317 00000 n +0000006017 00000 n +0000006064 00000 n +0000368152 00000 n +0000650184 00000 n +0000006106 00000 n +0000006164 00000 n +0000368278 00000 n +0000650105 00000 n +0000006209 00000 n +0000006253 00000 n +0000369220 00000 n +0000650012 00000 n +0000006298 00000 n +0000006335 00000 n +0000372338 00000 n +0000649919 00000 n +0000006380 00000 n +0000006423 00000 n +0000372904 00000 n +0000649826 00000 n +0000006468 00000 n +0000006514 00000 n +0000380725 00000 n +0000649733 00000 n +0000006559 00000 n +0000006664 00000 n +0000381420 00000 n +0000649640 00000 n +0000006709 00000 n +0000006781 00000 n +0000381800 00000 n +0000649547 00000 n +0000006826 00000 n +0000006873 00000 n +0000385206 00000 n +0000649468 00000 n +0000006918 00000 n +0000006969 00000 n +0000385712 00000 n +0000649335 00000 n +0000007011 00000 n +0000007066 00000 n +0000386028 00000 n +0000649217 00000 n +0000007111 00000 n +0000007155 00000 n +0000386280 00000 n +0000649138 00000 n +0000007203 00000 n +0000007242 00000 n +0000386597 00000 n +0000649045 00000 n +0000007290 00000 n +0000007340 00000 n +0000389420 00000 n +0000648913 00000 n +0000007388 00000 n +0000007454 00000 n +0000389671 00000 n +0000648834 00000 n +0000007504 00000 n +0000007559 00000 n +0000390361 00000 n +0000648755 00000 n +0000007609 00000 n +0000007661 00000 n +0000394090 00000 n +0000648676 00000 n +0000007709 00000 n +0000007759 00000 n +0000394532 00000 n +0000648583 00000 n +0000007804 00000 n +0000007839 00000 n +0000398789 00000 n +0000648504 00000 n +0000007884 00000 n +0000007928 00000 n +0000399921 00000 n +0000648371 00000 n +0000007970 00000 n +0000008020 00000 n +0000403187 00000 n +0000648292 00000 n +0000008065 00000 n +0000008104 00000 n +0000407710 00000 n +0000648199 00000 n +0000008149 00000 n +0000008215 00000 n +0000408472 00000 n +0000648120 00000 n +0000008260 00000 n +0000008297 00000 n +0000412912 00000 n +0000647987 00000 n +0000008339 00000 n +0000008379 00000 n +0000413099 00000 n +0000647908 00000 n +0000008424 00000 n +0000008498 00000 n +0000415622 00000 n +0000647815 00000 n +0000008543 00000 n +0000008600 00000 n +0000416190 00000 n +0000647722 00000 n +0000008645 00000 n +0000008705 00000 n +0000416823 00000 n +0000647643 00000 n +0000008750 00000 n +0000008827 00000 n +0000422485 00000 n +0000647549 00000 n +0000008869 00000 n +0000008922 00000 n +0000422611 00000 n +0000647455 00000 n +0000008964 00000 n +0000009011 00000 n +0000429166 00000 n +0000647322 00000 n +0000009053 00000 n +0000009097 00000 n +0000429291 00000 n +0000647243 00000 n +0000009142 00000 n +0000009194 00000 n +0000432615 00000 n +0000647125 00000 n +0000009239 00000 n +0000009286 00000 n +0000432741 00000 n +0000647046 00000 n +0000009334 00000 n +0000009381 00000 n +0000433497 00000 n +0000646967 00000 n +0000009429 00000 n +0000009473 00000 n +0000440277 00000 n +0000646834 00000 n +0000009515 00000 n +0000009597 00000 n +0000440403 00000 n +0000646755 00000 n +0000009642 00000 n +0000009677 00000 n +0000443885 00000 n +0000646662 00000 n +0000009722 00000 n +0000009759 00000 n +0000444705 00000 n +0000646569 00000 n +0000009804 00000 n +0000009839 00000 n +0000448234 00000 n +0000646490 00000 n +0000009884 00000 n +0000009921 00000 n +0000449305 00000 n +0000646396 00000 n +0000009963 00000 n +0000009994 00000 n +0000453504 00000 n +0000646302 00000 n +0000010036 00000 n +0000010086 00000 n +0000459150 00000 n +0000646169 00000 n +0000010128 00000 n +0000010170 00000 n +0000459657 00000 n +0000646090 00000 n +0000010215 00000 n +0000010254 00000 n +0000459845 00000 n +0000645997 00000 n +0000010299 00000 n +0000010331 00000 n +0000464301 00000 n +0000645904 00000 n +0000010376 00000 n +0000010418 00000 n +0000465125 00000 n +0000645825 00000 n +0000010463 00000 n +0000010516 00000 n +0000474206 00000 n +0000645692 00000 n +0000010558 00000 n +0000010605 00000 n +0000478252 00000 n +0000645613 00000 n +0000010650 00000 n +0000010689 00000 n +0000479709 00000 n +0000645520 00000 n +0000010734 00000 n +0000010782 00000 n +0000483621 00000 n +0000645427 00000 n +0000010827 00000 n +0000010870 00000 n +0000484444 00000 n +0000645334 00000 n +0000010915 00000 n +0000010962 00000 n +0000489599 00000 n +0000645255 00000 n +0000011007 00000 n +0000011084 00000 n +0000493108 00000 n +0000645161 00000 n +0000011126 00000 n +0000011182 00000 n +0000497467 00000 n +0000645067 00000 n +0000011224 00000 n +0000011274 00000 n +0000510316 00000 n +0000644934 00000 n +0000011316 00000 n +0000011384 00000 n +0000510442 00000 n +0000644855 00000 n +0000011429 00000 n +0000011463 00000 n +0000510630 00000 n +0000644762 00000 n +0000011508 00000 n +0000011539 00000 n +0000511133 00000 n +0000644669 00000 n +0000011584 00000 n +0000011624 00000 n +0000511574 00000 n +0000644590 00000 n +0000011669 00000 n +0000011717 00000 n +0000514506 00000 n +0000644496 00000 n +0000011759 00000 n +0000011807 00000 n +0000559156 00000 n +0000644402 00000 n +0000011849 00000 n +0000011902 00000 n +0000559408 00000 n +0000644308 00000 n +0000011944 00000 n +0000011998 00000 n +0000560105 00000 n +0000644175 00000 n +0000012040 00000 n +0000012101 00000 n +0000563322 00000 n +0000644071 00000 n +0000012146 00000 n +0000012197 00000 n +0000565032 00000 n +0000644006 00000 n +0000012245 00000 n +0000012298 00000 n +0000575874 00000 n +0000643912 00000 n +0000012340 00000 n +0000012413 00000 n +0000576062 00000 n +0000643818 00000 n +0000012455 00000 n +0000012503 00000 n +0000576815 00000 n +0000643724 00000 n +0000012545 00000 n +0000012598 00000 n +0000580232 00000 n +0000643630 00000 n +0000012640 00000 n +0000012705 00000 n +0000580483 00000 n +0000643536 00000 n +0000012747 00000 n +0000012788 00000 n +0000580924 00000 n +0000643442 00000 n +0000012830 00000 n +0000012879 00000 n +0000581176 00000 n +0000643348 00000 n +0000012921 00000 n +0000012956 00000 n +0000581428 00000 n +0000643254 00000 n +0000012998 00000 n +0000013029 00000 n +0000582894 00000 n +0000643160 00000 n +0000013071 00000 n +0000013108 00000 n +0000583210 00000 n +0000643066 00000 n +0000013150 00000 n +0000013186 00000 n +0000586656 00000 n +0000642972 00000 n +0000013228 00000 n +0000013290 00000 n +0000586970 00000 n +0000642878 00000 n +0000013332 00000 n +0000013363 00000 n +0000587283 00000 n +0000642784 00000 n +0000013405 00000 n +0000013457 00000 n +0000591378 00000 n +0000642690 00000 n +0000013499 00000 n +0000013538 00000 n +0000591630 00000 n +0000642596 00000 n +0000013580 00000 n +0000013622 00000 n +0000595637 00000 n +0000642502 00000 n +0000013664 00000 n +0000013700 00000 n +0000600906 00000 n +0000642408 00000 n +0000013742 00000 n +0000013784 00000 n +0000601220 00000 n +0000642314 00000 n +0000013826 00000 n +0000013873 00000 n +0000601472 00000 n +0000642220 00000 n +0000013915 00000 n +0000013972 00000 n +0000604616 00000 n +0000642126 00000 n +0000014014 00000 n +0000014048 00000 n +0000604803 00000 n +0000642032 00000 n +0000014090 00000 n +0000014124 00000 n +0000604992 00000 n +0000641938 00000 n +0000014166 00000 n +0000014222 00000 n +0000605307 00000 n +0000641844 00000 n +0000014264 00000 n +0000014326 00000 n +0000609305 00000 n +0000641750 00000 n +0000014368 00000 n +0000014396 00000 n +0000609431 00000 n +0000641617 00000 n +0000014438 00000 n +0000014472 00000 n +0000609557 00000 n +0000641552 00000 n +0000014520 00000 n +0000014549 00000 n +0000609934 00000 n +0000641419 00000 n +0000014591 00000 n +0000014612 00000 n +0000610059 00000 n +0000641315 00000 n +0000014660 00000 n +0000014686 00000 n +0000610501 00000 n +0000641250 00000 n +0000014736 00000 n +0000014799 00000 n +0000614677 00000 n +0000641117 00000 n +0000014841 00000 n +0000014862 00000 n +0000614801 00000 n +0000641013 00000 n +0000014910 00000 n +0000014933 00000 n +0000615243 00000 n +0000640934 00000 n +0000014981 00000 n +0000015011 00000 n +0000615495 00000 n +0000640855 00000 n +0000015059 00000 n +0000015087 00000 n +0000615747 00000 n +0000640722 00000 n +0000015129 00000 n +0000015150 00000 n +0000615871 00000 n +0000640618 00000 n +0000015198 00000 n +0000015242 00000 n +0000616249 00000 n +0000640539 00000 n +0000015290 00000 n +0000015319 00000 n +0000616500 00000 n +0000640446 00000 n +0000015367 00000 n +0000015421 00000 n +0000617006 00000 n +0000640367 00000 n +0000015469 00000 n +0000015496 00000 n +0000619092 00000 n +0000640234 00000 n +0000015538 00000 n +0000015559 00000 n +0000619217 00000 n +0000640169 00000 n +0000015607 00000 n +0000015633 00000 n +0000619596 00000 n +0000640036 00000 n +0000015675 00000 n +0000015696 00000 n +0000619721 00000 n +0000639971 00000 n +0000015744 00000 n +0000015770 00000 n +0000620164 00000 n +0000639838 00000 n +0000015812 00000 n +0000015833 00000 n +0000620288 00000 n +0000639773 00000 n +0000015881 00000 n +0000015911 00000 n +0000620539 00000 n +0000639640 00000 n +0000015953 00000 n +0000015974 00000 n +0000620664 00000 n +0000639536 00000 n +0000016022 00000 n +0000016065 00000 n +0000623608 00000 n +0000639471 00000 n +0000016113 00000 n +0000016138 00000 n +0000624806 00000 n +0000639338 00000 n +0000016180 00000 n +0000016201 00000 n +0000624930 00000 n +0000639234 00000 n +0000016249 00000 n +0000016289 00000 n +0000625242 00000 n +0000639155 00000 n +0000016337 00000 n +0000016364 00000 n +0000625493 00000 n +0000639076 00000 n +0000016412 00000 n +0000016436 00000 n +0000625807 00000 n +0000638943 00000 n +0000016478 00000 n +0000016499 00000 n +0000625930 00000 n +0000638878 00000 n +0000016547 00000 n +0000016569 00000 n +0000628248 00000 n +0000638745 00000 n +0000016611 00000 n +0000016632 00000 n +0000628371 00000 n +0000638641 00000 n +0000016680 00000 n +0000016736 00000 n +0000628622 00000 n +0000638576 00000 n +0000016784 00000 n +0000016822 00000 n +0000628938 00000 n +0000638443 00000 n +0000016864 00000 n +0000016885 00000 n +0000629126 00000 n +0000638378 00000 n +0000016933 00000 n +0000016958 00000 n +0000630013 00000 n +0000638245 00000 n +0000017000 00000 n +0000017021 00000 n +0000630137 00000 n +0000638141 00000 n +0000017069 00000 n +0000017105 00000 n +0000630453 00000 n +0000638076 00000 n +0000017153 00000 n +0000017194 00000 n +0000632080 00000 n +0000637957 00000 n +0000017236 00000 n +0000017257 00000 n +0000632203 00000 n +0000637892 00000 n +0000017305 00000 n +0000017342 00000 n +0000017747 00000 n +0000018110 00000 n +0000017394 00000 n +0000017867 00000 n +0000017928 00000 n +0000017989 00000 n +0000000799 00000 f +0000635417 00000 n +0000635513 00000 n +0000019334 00000 n +0000019153 00000 n +0000018182 00000 n +0000019273 00000 n +0000000806 00000 f +0000635324 00000 n +0000090185 00000 n +0000075596 00000 n +0000019419 00000 n +0000090064 00000 n +0000076432 00000 n +0000000895 00000 f +0000635232 00000 n +0000076578 00000 n +0000076725 00000 n +0000076876 00000 n +0000077028 00000 n +0000077180 00000 n +0000077333 00000 n +0000077485 00000 n +0000077638 00000 n +0000077787 00000 n +0000077937 00000 n +0000078090 00000 n +0000078244 00000 n +0000078397 00000 n +0000078552 00000 n +0000078700 00000 n +0000078849 00000 n +0000078994 00000 n +0000079140 00000 n +0000079287 00000 n +0000079435 00000 n +0000079579 00000 n +0000079724 00000 n +0000079876 00000 n +0000080028 00000 n +0000080179 00000 n +0000080330 00000 n +0000080478 00000 n +0000080626 00000 n +0000080773 00000 n +0000080920 00000 n +0000081073 00000 n +0000081226 00000 n +0000081380 00000 n +0000081534 00000 n +0000081692 00000 n +0000081850 00000 n +0000082009 00000 n +0000082168 00000 n +0000082330 00000 n +0000082492 00000 n +0000082655 00000 n +0000082818 00000 n +0000082977 00000 n +0000083136 00000 n +0000083301 00000 n +0000083466 00000 n +0000083632 00000 n +0000083798 00000 n +0000083951 00000 n +0000084104 00000 n +0000084250 00000 n +0000084395 00000 n +0000084548 00000 n +0000084700 00000 n +0000084853 00000 n +0000085005 00000 n +0000085159 00000 n +0000085312 00000 n +0000085458 00000 n +0000085603 00000 n +0000085760 00000 n +0000085917 00000 n +0000086074 00000 n +0000086230 00000 n +0000086386 00000 n +0000086541 00000 n +0000086697 00000 n +0000086853 00000 n +0000087014 00000 n +0000087174 00000 n +0000087326 00000 n +0000087479 00000 n +0000087630 00000 n +0000087781 00000 n +0000087936 00000 n +0000088090 00000 n +0000088245 00000 n +0000088399 00000 n +0000088561 00000 n +0000088722 00000 n +0000088896 00000 n +0000089069 00000 n +0000089237 00000 n +0000089404 00000 n +0000089566 00000 n +0000089727 00000 n +0000089896 00000 n +0000000980 00000 f +0000635138 00000 n +0000270427 00000 n +0000270551 00000 n +0000270928 00000 n +0000271367 00000 n +0000274819 00000 n +0000277408 00000 n +0000282209 00000 n +0000282332 00000 n +0000284155 00000 n +0000289445 00000 n +0000289569 00000 n +0000289818 00000 n +0000290827 00000 n +0000298396 00000 n +0000295128 00000 n +0000302035 00000 n +0000303042 00000 n +0000305937 00000 n +0000306124 00000 n +0000306310 00000 n +0000306497 00000 n +0000306684 00000 n +0000306872 00000 n +0000307123 00000 n +0000309692 00000 n +0000309878 00000 n +0000310319 00000 n +0000310762 00000 n +0000309505 00000 n +0000313813 00000 n +0000314127 00000 n +0000314315 00000 n +0000314630 00000 n +0000316434 00000 n +0000316622 00000 n +0000321006 00000 n +0000321131 00000 n +0000322201 00000 n +0000327117 00000 n +0000327367 00000 n +0000337333 00000 n +0000340022 00000 n +0000340210 00000 n +0000340652 00000 n +0000154473 00000 n +0000139410 00000 n +0000090296 00000 n +0000154412 00000 n +0000140299 00000 n +0000140468 00000 n +0000140636 00000 n +0000140798 00000 n +0000140959 00000 n +0000141127 00000 n +0000141294 00000 n +0000141454 00000 n +0000141613 00000 n +0000141781 00000 n +0000141948 00000 n +0000142114 00000 n +0000142279 00000 n +0000142446 00000 n +0000142612 00000 n +0000142773 00000 n +0000142933 00000 n +0000143102 00000 n +0000143270 00000 n +0000143439 00000 n +0000143607 00000 n +0000143770 00000 n +0000143936 00000 n +0000144108 00000 n +0000144279 00000 n +0000144448 00000 n +0000144616 00000 n +0000144785 00000 n +0000144953 00000 n +0000145113 00000 n +0000145272 00000 n +0000145430 00000 n +0000145587 00000 n +0000145751 00000 n +0000145914 00000 n +0000001378 00000 f +0000635049 00000 n +0000146060 00000 n +0000146205 00000 n +0000146351 00000 n +0000146496 00000 n +0000146648 00000 n +0000146800 00000 n +0000146945 00000 n +0000147089 00000 n +0000147235 00000 n +0000147380 00000 n +0000147526 00000 n +0000147671 00000 n +0000147819 00000 n +0000147967 00000 n +0000148122 00000 n +0000148276 00000 n +0000148433 00000 n +0000148589 00000 n +0000148739 00000 n +0000148889 00000 n +0000149044 00000 n +0000149198 00000 n +0000149352 00000 n +0000149506 00000 n +0000149657 00000 n +0000149808 00000 n +0000149962 00000 n +0000150115 00000 n +0000150275 00000 n +0000150434 00000 n +0000150592 00000 n +0000150753 00000 n +0000150906 00000 n +0000151058 00000 n +0000151210 00000 n +0000151361 00000 n +0000151516 00000 n +0000151670 00000 n +0000151817 00000 n +0000151964 00000 n +0000152119 00000 n +0000152273 00000 n +0000152423 00000 n +0000152573 00000 n +0000152725 00000 n +0000152876 00000 n +0000153032 00000 n +0000153189 00000 n +0000153335 00000 n +0000153481 00000 n +0000153629 00000 n +0000153776 00000 n +0000153937 00000 n +0000154097 00000 n +0000154255 00000 n +0000341094 00000 n +0000343571 00000 n +0000344013 00000 n +0000344580 00000 n +0000345024 00000 n +0000347628 00000 n +0000348071 00000 n +0000348450 00000 n +0000349400 00000 n +0000351484 00000 n +0000351991 00000 n +0000352434 00000 n +0000352878 00000 n +0000353385 00000 n +0000357242 00000 n +0000357621 00000 n +0000358631 00000 n +0000363226 00000 n +0000367902 00000 n +0000368089 00000 n +0000368215 00000 n +0000369157 00000 n +0000372275 00000 n +0000372841 00000 n +0000380662 00000 n +0000381357 00000 n +0000381737 00000 n +0000381926 00000 n +0000385649 00000 n +0000385965 00000 n +0000386217 00000 n +0000386534 00000 n +0000389357 00000 n +0000394027 00000 n +0000394469 00000 n +0000398726 00000 n +0000399858 00000 n +0000400110 00000 n +0000407647 00000 n +0000408409 00000 n +0000412849 00000 n +0000413036 00000 n +0000413352 00000 n +0000416127 00000 n +0000416760 00000 n +0000226782 00000 n +0000211712 00000 n +0000154571 00000 n +0000226719 00000 n +0000212675 00000 n +0000212832 00000 n +0000212989 00000 n +0000213142 00000 n +0000213295 00000 n +0000213446 00000 n +0000213597 00000 n +0000213752 00000 n +0000213906 00000 n +0000214060 00000 n +0000214213 00000 n +0000214370 00000 n +0000214526 00000 n +0000214681 00000 n +0000214835 00000 n +0000214990 00000 n +0000215145 00000 n +0000215297 00000 n +0000215448 00000 n +0000215602 00000 n +0000215755 00000 n +0000215907 00000 n +0000216058 00000 n +0000216212 00000 n +0000216365 00000 n +0000216513 00000 n +0000216661 00000 n +0000216810 00000 n +0000216959 00000 n +0000217110 00000 n +0000217261 00000 n +0000217424 00000 n +0000217586 00000 n +0000217744 00000 n +0000217901 00000 n +0000218060 00000 n +0000218218 00000 n +0000218376 00000 n +0000218534 00000 n +0000218690 00000 n +0000218846 00000 n +0000218994 00000 n +0000219141 00000 n +0000219289 00000 n +0000219436 00000 n +0000219584 00000 n +0000219731 00000 n +0000219878 00000 n +0000220025 00000 n +0000220189 00000 n +0000220352 00000 n +0000220517 00000 n +0000220682 00000 n +0000220833 00000 n +0000220984 00000 n +0000221138 00000 n +0000221292 00000 n +0000221442 00000 n +0000221591 00000 n +0000221738 00000 n +0000221884 00000 n +0000222030 00000 n +0000222175 00000 n +0000222328 00000 n +0000222480 00000 n +0000222625 00000 n +0000222770 00000 n +0000222921 00000 n +0000223072 00000 n +0000223223 00000 n +0000223374 00000 n +0000223522 00000 n +0000223670 00000 n +0000223818 00000 n +0000223965 00000 n +0000224112 00000 n +0000224258 00000 n +0000224407 00000 n +0000224557 00000 n +0000224707 00000 n +0000224857 00000 n +0000225007 00000 n +0000225157 00000 n +0000225306 00000 n +0000225457 00000 n +0000225613 00000 n +0000225769 00000 n +0000225926 00000 n +0000226083 00000 n +0000226244 00000 n +0000226405 00000 n +0000226562 00000 n +0000422422 00000 n +0000422548 00000 n +0000429103 00000 n +0000429229 00000 n +0000427912 00000 n +0000432678 00000 n +0000433434 00000 n +0000440214 00000 n +0000440340 00000 n +0000443822 00000 n +0000444642 00000 n +0000445335 00000 n +0000449242 00000 n +0000448172 00000 n +0000456223 00000 n +0000459594 00000 n +0000459782 00000 n +0000464238 00000 n +0000465062 00000 n +0000474143 00000 n +0000474457 00000 n +0000479646 00000 n +0000483558 00000 n +0000484381 00000 n +0000489536 00000 n +0000490107 00000 n +0000497404 00000 n +0000510253 00000 n +0000510379 00000 n +0000510568 00000 n +0000511072 00000 n +0000511511 00000 n +0000514443 00000 n +0000559093 00000 n +0000559345 00000 n +0000560042 00000 n +0000563259 00000 n +0000564969 00000 n +0000575811 00000 n +0000575999 00000 n +0000576753 00000 n +0000580169 00000 n +0000580421 00000 n +0000580861 00000 n +0000581113 00000 n +0000581365 00000 n +0000253372 00000 n +0000248070 00000 n +0000226894 00000 n +0000253309 00000 n +0000248493 00000 n +0000248652 00000 n +0000248811 00000 n +0000248973 00000 n +0000249135 00000 n +0000249281 00000 n +0000249427 00000 n +0000249576 00000 n +0000249725 00000 n +0000249874 00000 n +0000250023 00000 n +0000250172 00000 n +0000250321 00000 n +0000250469 00000 n +0000250617 00000 n +0000250766 00000 n +0000250915 00000 n +0000251064 00000 n +0000251213 00000 n +0000251362 00000 n +0000251511 00000 n +0000251660 00000 n +0000251809 00000 n +0000251957 00000 n +0000252105 00000 n +0000252253 00000 n +0000252402 00000 n +0000252552 00000 n +0000252702 00000 n +0000252854 00000 n +0000253007 00000 n +0000253158 00000 n +0000581743 00000 n +0000583147 00000 n +0000586593 00000 n +0000586907 00000 n +0000587220 00000 n +0000591315 00000 n +0000591567 00000 n +0000595574 00000 n +0000600843 00000 n +0000601158 00000 n +0000601409 00000 n +0000604553 00000 n +0000604740 00000 n +0000604929 00000 n +0000605245 00000 n +0000609242 00000 n +0000267304 00000 n +0000264255 00000 n +0000253471 00000 n +0000267117 00000 n +0000264535 00000 n +0000264698 00000 n +0000264861 00000 n +0000265027 00000 n +0000265193 00000 n +0000265358 00000 n +0000265523 00000 n +0000265690 00000 n +0000265857 00000 n +0000266020 00000 n +0000266183 00000 n +0000266336 00000 n +0000266490 00000 n +0000266647 00000 n +0000266804 00000 n +0000266960 00000 n +0000635633 00000 n +0000326866 00000 n +0000417013 00000 n +0000418751 00000 n +0000327618 00000 n +0000404198 00000 n +0000501372 00000 n +0000502442 00000 n +0000506120 00000 n +0000271742 00000 n +0000270134 00000 n +0000267416 00000 n +0000270675 00000 n +0000270738 00000 n +0000270279 00000 n +0000270801 00000 n +0000270865 00000 n +0000271052 00000 n +0000271115 00000 n +0000271178 00000 n +0000271241 00000 n +0000271304 00000 n +0000271491 00000 n +0000271554 00000 n +0000271617 00000 n +0000271680 00000 n +0000277720 00000 n +0000274137 00000 n +0000271841 00000 n +0000274440 00000 n +0000274502 00000 n +0000274565 00000 n +0000274629 00000 n +0000274693 00000 n +0000274756 00000 n +0000274943 00000 n +0000275006 00000 n +0000275069 00000 n +0000275132 00000 n +0000275194 00000 n +0000275257 00000 n +0000275320 00000 n +0000275383 00000 n +0000275447 00000 n +0000275510 00000 n +0000275573 00000 n +0000275635 00000 n +0000275699 00000 n +0000275762 00000 n +0000275825 00000 n +0000275888 00000 n +0000275952 00000 n +0000276015 00000 n +0000274282 00000 n +0000276078 00000 n +0000276141 00000 n +0000276205 00000 n +0000276268 00000 n +0000276331 00000 n +0000276394 00000 n +0000276458 00000 n +0000276521 00000 n +0000276583 00000 n +0000276646 00000 n +0000276710 00000 n +0000276773 00000 n +0000276836 00000 n +0000276900 00000 n +0000276964 00000 n +0000277028 00000 n +0000277092 00000 n +0000277156 00000 n +0000277220 00000 n +0000277282 00000 n +0000277345 00000 n +0000277532 00000 n +0000277595 00000 n +0000277658 00000 n +0000279393 00000 n +0000279027 00000 n +0000277832 00000 n +0000279330 00000 n +0000001651 00000 f +0000634957 00000 n +0000279172 00000 n +0000615432 00000 n +0000284466 00000 n +0000282085 00000 n +0000279532 00000 n +0000282456 00000 n +0000282519 00000 n +0000282582 00000 n +0000282646 00000 n +0000282709 00000 n +0000282772 00000 n +0000282835 00000 n +0000282898 00000 n +0000282961 00000 n +0000283024 00000 n +0000283087 00000 n +0000283150 00000 n +0000283213 00000 n +0000283276 00000 n +0000283339 00000 n +0000283400 00000 n +0000283463 00000 n +0000283526 00000 n +0000283588 00000 n +0000283651 00000 n +0000283714 00000 n +0000283777 00000 n +0000283840 00000 n +0000283903 00000 n +0000283966 00000 n +0000284029 00000 n +0000284092 00000 n +0000284278 00000 n +0000284341 00000 n +0000284404 00000 n +0000286579 00000 n +0000286011 00000 n +0000284565 00000 n +0000286135 00000 n +0000286198 00000 n +0000286262 00000 n +0000286325 00000 n +0000286389 00000 n +0000286452 00000 n +0000286516 00000 n +0000291455 00000 n +0000289321 00000 n +0000286665 00000 n +0000289693 00000 n +0000289756 00000 n +0000289942 00000 n +0000290005 00000 n +0000290068 00000 n +0000290131 00000 n +0000290194 00000 n +0000290257 00000 n +0000290321 00000 n +0000290385 00000 n +0000290448 00000 n +0000290511 00000 n +0000290574 00000 n +0000290637 00000 n +0000290700 00000 n +0000290764 00000 n +0000290951 00000 n +0000291014 00000 n +0000291077 00000 n +0000291140 00000 n +0000291203 00000 n +0000291266 00000 n +0000291329 00000 n +0000291392 00000 n +0000635758 00000 n +0000298773 00000 n +0000295004 00000 n +0000291554 00000 n +0000295189 00000 n +0000295252 00000 n +0000295315 00000 n +0000295378 00000 n +0000295441 00000 n +0000295504 00000 n +0000295567 00000 n +0000295630 00000 n +0000295693 00000 n +0000295756 00000 n +0000295819 00000 n +0000295882 00000 n +0000295945 00000 n +0000296008 00000 n +0000296070 00000 n +0000296132 00000 n +0000296195 00000 n +0000296258 00000 n +0000296321 00000 n +0000296384 00000 n +0000296447 00000 n +0000296510 00000 n +0000296573 00000 n +0000296636 00000 n +0000296698 00000 n +0000296761 00000 n +0000296824 00000 n +0000296887 00000 n +0000296950 00000 n +0000297013 00000 n +0000297076 00000 n +0000297139 00000 n +0000297202 00000 n +0000297265 00000 n +0000297328 00000 n +0000297391 00000 n +0000297454 00000 n +0000297517 00000 n +0000297579 00000 n +0000297641 00000 n +0000297704 00000 n +0000297767 00000 n +0000297830 00000 n +0000297893 00000 n +0000297956 00000 n +0000298018 00000 n +0000298081 00000 n +0000298144 00000 n +0000298207 00000 n +0000298270 00000 n +0000298333 00000 n +0000298520 00000 n +0000298583 00000 n +0000298647 00000 n +0000298710 00000 n +0000303417 00000 n +0000301472 00000 n +0000298872 00000 n +0000301596 00000 n +0000301659 00000 n +0000301783 00000 n +0000301846 00000 n +0000301909 00000 n +0000301972 00000 n +0000302157 00000 n +0000302220 00000 n +0000302284 00000 n +0000302347 00000 n +0000302410 00000 n +0000302473 00000 n +0000302536 00000 n +0000302600 00000 n +0000302664 00000 n +0000302727 00000 n +0000302790 00000 n +0000302853 00000 n +0000302916 00000 n +0000302979 00000 n +0000303165 00000 n +0000303228 00000 n +0000303291 00000 n +0000303354 00000 n +0000307185 00000 n +0000305750 00000 n +0000303516 00000 n +0000305874 00000 n +0000306061 00000 n +0000306247 00000 n +0000306434 00000 n +0000306621 00000 n +0000306809 00000 n +0000306997 00000 n +0000307060 00000 n +0000310949 00000 n +0000309318 00000 n +0000307284 00000 n +0000309442 00000 n +0000309629 00000 n +0000309815 00000 n +0000310003 00000 n +0000310066 00000 n +0000310130 00000 n +0000310193 00000 n +0000310256 00000 n +0000310444 00000 n +0000310507 00000 n +0000310571 00000 n +0000310635 00000 n +0000310698 00000 n +0000310886 00000 n +0000314818 00000 n +0000313313 00000 n +0000311061 00000 n +0000313437 00000 n +0000313500 00000 n +0000313626 00000 n +0000313689 00000 n +0000313751 00000 n +0000313938 00000 n +0000314001 00000 n +0000314064 00000 n +0000314252 00000 n +0000314439 00000 n +0000314502 00000 n +0000314566 00000 n +0000314755 00000 n +0000316810 00000 n +0000316059 00000 n +0000314917 00000 n +0000316183 00000 n +0000316246 00000 n +0000316309 00000 n +0000316372 00000 n +0000316559 00000 n +0000316747 00000 n +0000635883 00000 n +0000322706 00000 n +0000319478 00000 n +0000316923 00000 n +0000320943 00000 n +0000321256 00000 n +0000321319 00000 n +0000319686 00000 n +0000321382 00000 n +0000321445 00000 n +0000319840 00000 n +0000321508 00000 n +0000321571 00000 n +0000321635 00000 n +0000321698 00000 n +0000321761 00000 n +0000321824 00000 n +0000319992 00000 n +0000321886 00000 n +0000320148 00000 n +0000321949 00000 n +0000320302 00000 n +0000322012 00000 n +0000320463 00000 n +0000322075 00000 n +0000320621 00000 n +0000322138 00000 n +0000320779 00000 n +0000322326 00000 n +0000322389 00000 n +0000322453 00000 n +0000322516 00000 n +0000322579 00000 n +0000322643 00000 n +0000328688 00000 n +0000325303 00000 n +0000322832 00000 n +0000326613 00000 n +0000326676 00000 n +0000326739 00000 n +0000325502 00000 n +0000326802 00000 n +0000326927 00000 n +0000326990 00000 n +0000327053 00000 n +0000325667 00000 n +0000327241 00000 n +0000327304 00000 n +0000327492 00000 n +0000325825 00000 n +0000325977 00000 n +0000327555 00000 n +0000326129 00000 n +0000326295 00000 n +0000327681 00000 n +0000327744 00000 n +0000327807 00000 n +0000327870 00000 n +0000327933 00000 n +0000327996 00000 n +0000001675 00000 f +0000634881 00000 n +0000328059 00000 n +0000328121 00000 n +0000328184 00000 n +0000328247 00000 n +0000328310 00000 n +0000328373 00000 n +0000328435 00000 n +0000328497 00000 n +0000328561 00000 n +0000326456 00000 n +0000328624 00000 n +0000616438 00000 n +0000624868 00000 n +0000632743 00000 n +0000337521 00000 n +0000331256 00000 n +0000328827 00000 n +0000334561 00000 n +0000334624 00000 n +0000334687 00000 n +0000334750 00000 n +0000334814 00000 n +0000001743 00000 f +0000634781 00000 n +0000334878 00000 n +0000334941 00000 n +0000335005 00000 n +0000335068 00000 n +0000331554 00000 n +0000335131 00000 n +0000335194 00000 n +0000331728 00000 n +0000335257 00000 n +0000335320 00000 n +0000331895 00000 n +0000335383 00000 n +0000335446 00000 n +0000332056 00000 n +0000335508 00000 n +0000335571 00000 n +0000332225 00000 n +0000335634 00000 n +0000335697 00000 n +0000332395 00000 n +0000335760 00000 n +0000335823 00000 n +0000332556 00000 n +0000335886 00000 n +0000335949 00000 n +0000332724 00000 n +0000336012 00000 n +0000336075 00000 n +0000332884 00000 n +0000336138 00000 n +0000336201 00000 n +0000333051 00000 n +0000336264 00000 n +0000336327 00000 n +0000333218 00000 n +0000336390 00000 n +0000336454 00000 n +0000336516 00000 n +0000333386 00000 n +0000336579 00000 n +0000336642 00000 n +0000333546 00000 n +0000336704 00000 n +0000336767 00000 n +0000333715 00000 n +0000336830 00000 n +0000336892 00000 n +0000333883 00000 n +0000336955 00000 n +0000337018 00000 n +0000334050 00000 n +0000337081 00000 n +0000337144 00000 n +0000334222 00000 n +0000337207 00000 n +0000337270 00000 n +0000334392 00000 n +0000337458 00000 n +0000341473 00000 n +0000339394 00000 n +0000337648 00000 n +0000339518 00000 n +0000339581 00000 n +0000339644 00000 n +0000339707 00000 n +0000339770 00000 n +0000001985 00000 f +0000634686 00000 n +0000339833 00000 n +0000339896 00000 n +0000339959 00000 n +0000340147 00000 n +0000340335 00000 n +0000340397 00000 n +0000340460 00000 n +0000340524 00000 n +0000340588 00000 n +0000340776 00000 n +0000340839 00000 n +0000340902 00000 n +0000340966 00000 n +0000341030 00000 n +0000341220 00000 n +0000341283 00000 n +0000341346 00000 n +0000341410 00000 n +0000345213 00000 n +0000343320 00000 n +0000341613 00000 n +0000343444 00000 n +0000343507 00000 n +0000343696 00000 n +0000343758 00000 n +0000343821 00000 n +0000343885 00000 n +0000343949 00000 n +0000344137 00000 n +0000344200 00000 n +0000344263 00000 n +0000344326 00000 n +0000344388 00000 n +0000344452 00000 n +0000344516 00000 n +0000344706 00000 n +0000344769 00000 n +0000344832 00000 n +0000344896 00000 n +0000344960 00000 n +0000345150 00000 n +0000349463 00000 n +0000347186 00000 n +0000345312 00000 n +0000347310 00000 n +0000347373 00000 n +0000347436 00000 n +0000347500 00000 n +0000347564 00000 n +0000347753 00000 n +0000347816 00000 n +0000347879 00000 n +0000347943 00000 n +0000348007 00000 n +0000348196 00000 n +0000348259 00000 n +0000348322 00000 n +0000348386 00000 n +0000348576 00000 n +0000348639 00000 n +0000348702 00000 n +0000348764 00000 n +0000348827 00000 n +0000348891 00000 n +0000348954 00000 n +0000349017 00000 n +0000349081 00000 n +0000349145 00000 n +0000349208 00000 n +0000349272 00000 n +0000349336 00000 n +0000636008 00000 n +0000353448 00000 n +0000350981 00000 n +0000349589 00000 n +0000351105 00000 n +0000351231 00000 n +0000351294 00000 n +0000351356 00000 n +0000351420 00000 n +0000351609 00000 n +0000351672 00000 n +0000351736 00000 n +0000351800 00000 n +0000351863 00000 n +0000351927 00000 n +0000352117 00000 n +0000352180 00000 n +0000352242 00000 n +0000352306 00000 n +0000352370 00000 n +0000352560 00000 n +0000352623 00000 n +0000352686 00000 n +0000352750 00000 n +0000352814 00000 n +0000353004 00000 n +0000353067 00000 n +0000353131 00000 n +0000353194 00000 n +0000353258 00000 n +0000353321 00000 n +0000358694 00000 n +0000356189 00000 n +0000353560 00000 n +0000356799 00000 n +0000356925 00000 n +0000356988 00000 n +0000357051 00000 n +0000357114 00000 n +0000357178 00000 n +0000357368 00000 n +0000356352 00000 n +0000356505 00000 n +0000356653 00000 n +0000357431 00000 n +0000357494 00000 n +0000357557 00000 n +0000357746 00000 n +0000357809 00000 n +0000357873 00000 n +0000357935 00000 n +0000357998 00000 n +0000358060 00000 n +0000358123 00000 n +0000358187 00000 n +0000358250 00000 n +0000358314 00000 n +0000358377 00000 n +0000358441 00000 n +0000358503 00000 n +0000358567 00000 n +0000615809 00000 n +0000364617 00000 n +0000361336 00000 n +0000358820 00000 n +0000361639 00000 n +0000361765 00000 n +0000361828 00000 n +0000361891 00000 n +0000361481 00000 n +0000361954 00000 n +0000362018 00000 n +0000362082 00000 n +0000362146 00000 n +0000362210 00000 n +0000362273 00000 n +0000362336 00000 n +0000362400 00000 n +0000362463 00000 n +0000362527 00000 n +0000362591 00000 n +0000362655 00000 n +0000362719 00000 n +0000362783 00000 n +0000362846 00000 n +0000362909 00000 n +0000362972 00000 n +0000363035 00000 n +0000363098 00000 n +0000363162 00000 n +0000363352 00000 n +0000363415 00000 n +0000363479 00000 n +0000363543 00000 n +0000363606 00000 n +0000363669 00000 n +0000363731 00000 n +0000363795 00000 n +0000363858 00000 n +0000363921 00000 n +0000363985 00000 n +0000364048 00000 n +0000364111 00000 n +0000364175 00000 n +0000364237 00000 n +0000364300 00000 n +0000364364 00000 n +0000364427 00000 n +0000364490 00000 n +0000364554 00000 n +0000369472 00000 n +0000367034 00000 n +0000364770 00000 n +0000367332 00000 n +0000367395 00000 n +0000367458 00000 n +0000367522 00000 n +0000367586 00000 n +0000367648 00000 n +0000367712 00000 n +0000367776 00000 n +0000367839 00000 n +0000368026 00000 n +0000367179 00000 n +0000368340 00000 n +0000368402 00000 n +0000368465 00000 n +0000368528 00000 n +0000368591 00000 n +0000368652 00000 n +0000368714 00000 n +0000368777 00000 n +0000368840 00000 n +0000368903 00000 n +0000368966 00000 n +0000369029 00000 n +0000369093 00000 n +0000369282 00000 n +0000369345 00000 n +0000369408 00000 n +0000373344 00000 n +0000371837 00000 n +0000369598 00000 n +0000371961 00000 n +0000372024 00000 n +0000372086 00000 n +0000372149 00000 n +0000372212 00000 n +0000372400 00000 n +0000372463 00000 n +0000372526 00000 n +0000372589 00000 n +0000372652 00000 n +0000372715 00000 n +0000372778 00000 n +0000372967 00000 n +0000373030 00000 n +0000373092 00000 n +0000373155 00000 n +0000373218 00000 n +0000373281 00000 n +0000378114 00000 n +0000375597 00000 n +0000373484 00000 n +0000375899 00000 n +0000375962 00000 n +0000376024 00000 n +0000376088 00000 n +0000375742 00000 n +0000000000 00000 f +0000634588 00000 n +0000376152 00000 n +0000376216 00000 n +0000376279 00000 n +0000376341 00000 n +0000376404 00000 n +0000376467 00000 n +0000376531 00000 n +0000376595 00000 n +0000376659 00000 n +0000376722 00000 n +0000376786 00000 n +0000376849 00000 n +0000376912 00000 n +0000376975 00000 n +0000377038 00000 n +0000377102 00000 n +0000377166 00000 n +0000377229 00000 n +0000377292 00000 n +0000377355 00000 n +0000377418 00000 n +0000377482 00000 n +0000377545 00000 n +0000377608 00000 n +0000377671 00000 n +0000377734 00000 n +0000377798 00000 n +0000377861 00000 n +0000377924 00000 n +0000377987 00000 n +0000378050 00000 n +0000636133 00000 n +0000616880 00000 n +0000381989 00000 n +0000380286 00000 n +0000378254 00000 n +0000380410 00000 n +0000380473 00000 n +0000380536 00000 n +0000380599 00000 n +0000380787 00000 n +0000380850 00000 n +0000380914 00000 n +0000380977 00000 n +0000381041 00000 n +0000381104 00000 n +0000381167 00000 n +0000381230 00000 n +0000381293 00000 n +0000381483 00000 n +0000381546 00000 n +0000381609 00000 n +0000381673 00000 n +0000381863 00000 n +0000386912 00000 n +0000384677 00000 n +0000382129 00000 n +0000385143 00000 n +0000385269 00000 n +0000385332 00000 n +0000385396 00000 n +0000385459 00000 n +0000385523 00000 n +0000385586 00000 n +0000385775 00000 n +0000385838 00000 n +0000385901 00000 n +0000386091 00000 n +0000386154 00000 n +0000386343 00000 n +0000386406 00000 n +0000386470 00000 n +0000386660 00000 n +0000384831 00000 n +0000384993 00000 n +0000386723 00000 n +0000386786 00000 n +0000386850 00000 n +0000390678 00000 n +0000388727 00000 n +0000387051 00000 n +0000388851 00000 n +0000388914 00000 n +0000388976 00000 n +0000389039 00000 n +0000389103 00000 n +0000389167 00000 n +0000389230 00000 n +0000389293 00000 n +0000389482 00000 n +0000389545 00000 n +0000389608 00000 n +0000389733 00000 n +0000389796 00000 n +0000389859 00000 n +0000389922 00000 n +0000389984 00000 n +0000390047 00000 n +0000390109 00000 n +0000390172 00000 n +0000390235 00000 n +0000390298 00000 n +0000390424 00000 n +0000390487 00000 n +0000390551 00000 n +0000390615 00000 n +0000395101 00000 n +0000393214 00000 n +0000390818 00000 n +0000393838 00000 n +0000393901 00000 n +0000393964 00000 n +0000394152 00000 n +0000393377 00000 n +0000393536 00000 n +0000394215 00000 n +0000394278 00000 n +0000394341 00000 n +0000394405 00000 n +0000394595 00000 n +0000394658 00000 n +0000394721 00000 n +0000394785 00000 n +0000394848 00000 n +0000393684 00000 n +0000394911 00000 n +0000394974 00000 n +0000395037 00000 n +0000400173 00000 n +0000397505 00000 n +0000395227 00000 n +0000397969 00000 n +0000398032 00000 n +0000398095 00000 n +0000398159 00000 n +0000398223 00000 n +0000398286 00000 n +0000398349 00000 n +0000398412 00000 n +0000398475 00000 n +0000398538 00000 n +0000398600 00000 n +0000398663 00000 n +0000398852 00000 n +0000398915 00000 n +0000398977 00000 n +0000399040 00000 n +0000399103 00000 n +0000399166 00000 n +0000399228 00000 n +0000399291 00000 n +0000399354 00000 n +0000399417 00000 n +0000399480 00000 n +0000399543 00000 n +0000399606 00000 n +0000399669 00000 n +0000399732 00000 n +0000399795 00000 n +0000399984 00000 n +0000397659 00000 n +0000397810 00000 n +0000400047 00000 n +0000404765 00000 n +0000402483 00000 n +0000400340 00000 n +0000403124 00000 n +0000403250 00000 n +0000403313 00000 n +0000403377 00000 n +0000402646 00000 n +0000403441 00000 n +0000403504 00000 n +0000403567 00000 n +0000402810 00000 n +0000403631 00000 n +0000403694 00000 n +0000403757 00000 n +0000403820 00000 n +0000403883 00000 n +0000403947 00000 n +0000404009 00000 n +0000404072 00000 n +0000404135 00000 n +0000402970 00000 n +0000404261 00000 n +0000404324 00000 n +0000404387 00000 n +0000404450 00000 n +0000404513 00000 n +0000404576 00000 n +0000404639 00000 n +0000404702 00000 n +0000636258 00000 n +0000620226 00000 n +0000609996 00000 n +0000408661 00000 n +0000406677 00000 n +0000404932 00000 n +0000407143 00000 n +0000407206 00000 n +0000407269 00000 n +0000407332 00000 n +0000407395 00000 n +0000407458 00000 n +0000407521 00000 n +0000407584 00000 n +0000407773 00000 n +0000407836 00000 n +0000407900 00000 n +0000407964 00000 n +0000408027 00000 n +0000408090 00000 n +0000408154 00000 n +0000408218 00000 n +0000408281 00000 n +0000408345 00000 n +0000406831 00000 n +0000408535 00000 n +0000408598 00000 n +0000406990 00000 n +0000413415 00000 n +0000411099 00000 n +0000408773 00000 n +0000411397 00000 n +0000411460 00000 n +0000411522 00000 n +0000411585 00000 n +0000411244 00000 n +0000411649 00000 n +0000411712 00000 n +0000411775 00000 n +0000411838 00000 n +0000411900 00000 n +0000411964 00000 n +0000412028 00000 n +0000412092 00000 n +0000412156 00000 n +0000412218 00000 n +0000412281 00000 n +0000412343 00000 n +0000412407 00000 n +0000412470 00000 n +0000412534 00000 n +0000412597 00000 n +0000412660 00000 n +0000412723 00000 n +0000412786 00000 n +0000412974 00000 n +0000413162 00000 n +0000413225 00000 n +0000413289 00000 n +0000630390 00000 n +0000417139 00000 n +0000415247 00000 n +0000413554 00000 n +0000415559 00000 n +0000415685 00000 n +0000415748 00000 n +0000415811 00000 n +0000415875 00000 n +0000415938 00000 n +0000416001 00000 n +0000416064 00000 n +0000416253 00000 n +0000416316 00000 n +0000416379 00000 n +0000416442 00000 n +0000416505 00000 n +0000416569 00000 n +0000416633 00000 n +0000416696 00000 n +0000416886 00000 n +0000416949 00000 n +0000415392 00000 n +0000417076 00000 n +0000418877 00000 n +0000418250 00000 n +0000417278 00000 n +0000418561 00000 n +0000418624 00000 n +0000418395 00000 n +0000418687 00000 n +0000418814 00000 n +0000424373 00000 n +0000422235 00000 n +0000418989 00000 n +0000422359 00000 n +0000422674 00000 n +0000422737 00000 n +0000422799 00000 n +0000422861 00000 n +0000422924 00000 n +0000422987 00000 n +0000423050 00000 n +0000423113 00000 n +0000423176 00000 n +0000423240 00000 n +0000423304 00000 n +0000423367 00000 n +0000423430 00000 n +0000423493 00000 n +0000423556 00000 n +0000423619 00000 n +0000423683 00000 n +0000423746 00000 n +0000423809 00000 n +0000423872 00000 n +0000423936 00000 n +0000423999 00000 n +0000424062 00000 n +0000424124 00000 n +0000424187 00000 n +0000424249 00000 n +0000424311 00000 n +0000429543 00000 n +0000427725 00000 n +0000424498 00000 n +0000427849 00000 n +0000427974 00000 n +0000428037 00000 n +0000428100 00000 n +0000428162 00000 n +0000428226 00000 n +0000428287 00000 n +0000428350 00000 n +0000428413 00000 n +0000428475 00000 n +0000428537 00000 n +0000428600 00000 n +0000428663 00000 n +0000428726 00000 n +0000428789 00000 n +0000428852 00000 n +0000428914 00000 n +0000428977 00000 n +0000429040 00000 n +0000429354 00000 n +0000429417 00000 n +0000429480 00000 n +0000636383 00000 n +0000434757 00000 n +0000432366 00000 n +0000429682 00000 n +0000432490 00000 n +0000432553 00000 n +0000432804 00000 n +0000432865 00000 n +0000432928 00000 n +0000432991 00000 n +0000433054 00000 n +0000433117 00000 n +0000433180 00000 n +0000433243 00000 n +0000433306 00000 n +0000433370 00000 n +0000433560 00000 n +0000433622 00000 n +0000433685 00000 n +0000433749 00000 n +0000433813 00000 n +0000433876 00000 n +0000433937 00000 n +0000434000 00000 n +0000434063 00000 n +0000434126 00000 n +0000434189 00000 n +0000434252 00000 n +0000434315 00000 n +0000434378 00000 n +0000434441 00000 n +0000434504 00000 n +0000434567 00000 n +0000434630 00000 n +0000434693 00000 n +0000440591 00000 n +0000437905 00000 n +0000434897 00000 n +0000438206 00000 n +0000438269 00000 n +0000438333 00000 n +0000438395 00000 n +0000438459 00000 n +0000438522 00000 n +0000438584 00000 n +0000438645 00000 n +0000438708 00000 n +0000438771 00000 n +0000438834 00000 n +0000438897 00000 n +0000438960 00000 n +0000439023 00000 n +0000439086 00000 n +0000439149 00000 n +0000439212 00000 n +0000439275 00000 n +0000439338 00000 n +0000439401 00000 n +0000439464 00000 n +0000439526 00000 n +0000439588 00000 n +0000439650 00000 n +0000439713 00000 n +0000439776 00000 n +0000439839 00000 n +0000439901 00000 n +0000439963 00000 n +0000440026 00000 n +0000440089 00000 n +0000440152 00000 n +0000440466 00000 n +0000438050 00000 n +0000440528 00000 n +0000625180 00000 n +0000445398 00000 n +0000443068 00000 n +0000440731 00000 n +0000443192 00000 n +0000443255 00000 n +0000443318 00000 n +0000443381 00000 n +0000443444 00000 n +0000443507 00000 n +0000443570 00000 n +0000443633 00000 n +0000443696 00000 n +0000443759 00000 n +0000443948 00000 n +0000444011 00000 n +0000444074 00000 n +0000444138 00000 n +0000444201 00000 n +0000444264 00000 n +0000444327 00000 n +0000444390 00000 n +0000444453 00000 n +0000444516 00000 n +0000444579 00000 n +0000444768 00000 n +0000444831 00000 n +0000444894 00000 n +0000444957 00000 n +0000445020 00000 n +0000445083 00000 n +0000445146 00000 n +0000445209 00000 n +0000445272 00000 n +0000450310 00000 n +0000447985 00000 n +0000445497 00000 n +0000448109 00000 n +0000448297 00000 n +0000448360 00000 n +0000448423 00000 n +0000448486 00000 n +0000448549 00000 n +0000448612 00000 n +0000448675 00000 n +0000448738 00000 n +0000448801 00000 n +0000448864 00000 n +0000448927 00000 n +0000448990 00000 n +0000449053 00000 n +0000449116 00000 n +0000449179 00000 n +0000449368 00000 n +0000449431 00000 n +0000449494 00000 n +0000449557 00000 n +0000449619 00000 n +0000449682 00000 n +0000449745 00000 n +0000449807 00000 n +0000449869 00000 n +0000449932 00000 n +0000449995 00000 n +0000450058 00000 n +0000450121 00000 n +0000450184 00000 n +0000450247 00000 n +0000456286 00000 n +0000453192 00000 n +0000450423 00000 n +0000453316 00000 n +0000453379 00000 n +0000453441 00000 n +0000453567 00000 n +0000453630 00000 n +0000453694 00000 n +0000453757 00000 n +0000453820 00000 n +0000453884 00000 n +0000453947 00000 n +0000454009 00000 n +0000454072 00000 n +0000454135 00000 n +0000454198 00000 n +0000454261 00000 n +0000454324 00000 n +0000454387 00000 n +0000454450 00000 n +0000454513 00000 n +0000454577 00000 n +0000454641 00000 n +0000454704 00000 n +0000454767 00000 n +0000454830 00000 n +0000454893 00000 n +0000454957 00000 n +0000455020 00000 n +0000455083 00000 n +0000455147 00000 n +0000455211 00000 n +0000455274 00000 n +0000455337 00000 n +0000455400 00000 n +0000455464 00000 n +0000455528 00000 n +0000455592 00000 n +0000455654 00000 n +0000455717 00000 n +0000455780 00000 n +0000455843 00000 n +0000455906 00000 n +0000455969 00000 n +0000456032 00000 n +0000456096 00000 n +0000456159 00000 n +0000461106 00000 n +0000458963 00000 n +0000456399 00000 n +0000459087 00000 n +0000459213 00000 n +0000459276 00000 n +0000459340 00000 n +0000459403 00000 n +0000459467 00000 n +0000459530 00000 n +0000459719 00000 n +0000459908 00000 n +0000459971 00000 n +0000460033 00000 n +0000460095 00000 n +0000460158 00000 n +0000460221 00000 n +0000460284 00000 n +0000460348 00000 n +0000460411 00000 n +0000460474 00000 n +0000460537 00000 n +0000460600 00000 n +0000460663 00000 n +0000460726 00000 n +0000460790 00000 n +0000460853 00000 n +0000460916 00000 n +0000460980 00000 n +0000461044 00000 n +0000636508 00000 n +0000467973 00000 n +0000463736 00000 n +0000461259 00000 n +0000463860 00000 n +0000463923 00000 n +0000463986 00000 n +0000464050 00000 n +0000464113 00000 n +0000464176 00000 n +0000464364 00000 n +0000464427 00000 n +0000464491 00000 n +0000464555 00000 n +0000464618 00000 n +0000464682 00000 n +0000464746 00000 n +0000464808 00000 n +0000464871 00000 n +0000464935 00000 n +0000464999 00000 n +0000465188 00000 n +0000465251 00000 n +0000465315 00000 n +0000465378 00000 n +0000465441 00000 n +0000465503 00000 n +0000465566 00000 n +0000465629 00000 n +0000465692 00000 n +0000465756 00000 n +0000465820 00000 n +0000465884 00000 n +0000465948 00000 n +0000466012 00000 n +0000466076 00000 n +0000466139 00000 n +0000466202 00000 n +0000466266 00000 n +0000466330 00000 n +0000466394 00000 n +0000466458 00000 n +0000466521 00000 n +0000466584 00000 n +0000466647 00000 n +0000466710 00000 n +0000466773 00000 n +0000466836 00000 n +0000466899 00000 n +0000466961 00000 n +0000467024 00000 n +0000467087 00000 n +0000467150 00000 n +0000467213 00000 n +0000467276 00000 n +0000467339 00000 n +0000467402 00000 n +0000467465 00000 n +0000467528 00000 n +0000467591 00000 n +0000467655 00000 n +0000467718 00000 n +0000467782 00000 n +0000467846 00000 n +0000467910 00000 n +0000474520 00000 n +0000470568 00000 n +0000468099 00000 n +0000471363 00000 n +0000471426 00000 n +0000471489 00000 n +0000471552 00000 n +0000471615 00000 n +0000471679 00000 n +0000471742 00000 n +0000471806 00000 n +0000471870 00000 n +0000471934 00000 n +0000471998 00000 n +0000472062 00000 n +0000472126 00000 n +0000472190 00000 n +0000472254 00000 n +0000472318 00000 n +0000472381 00000 n +0000472444 00000 n +0000472505 00000 n +0000472566 00000 n +0000472630 00000 n +0000472692 00000 n +0000472755 00000 n +0000472818 00000 n +0000472881 00000 n +0000472944 00000 n +0000473007 00000 n +0000473070 00000 n +0000473133 00000 n +0000473196 00000 n +0000473259 00000 n +0000473322 00000 n +0000473385 00000 n +0000473448 00000 n +0000473511 00000 n +0000470740 00000 n +0000470896 00000 n +0000473575 00000 n +0000473638 00000 n +0000473701 00000 n +0000473765 00000 n +0000473828 00000 n +0000473891 00000 n +0000473954 00000 n +0000474017 00000 n +0000474080 00000 n +0000471051 00000 n +0000474268 00000 n +0000474331 00000 n +0000474395 00000 n +0000471199 00000 n +0000480024 00000 n +0000478065 00000 n +0000474660 00000 n +0000478189 00000 n +0000478315 00000 n +0000478378 00000 n +0000478442 00000 n +0000478506 00000 n +0000478569 00000 n +0000478631 00000 n +0000478695 00000 n +0000478759 00000 n +0000478822 00000 n +0000478886 00000 n +0000478950 00000 n +0000479013 00000 n +0000479076 00000 n +0000479140 00000 n +0000479203 00000 n +0000479266 00000 n +0000479329 00000 n +0000479393 00000 n +0000479456 00000 n +0000479519 00000 n +0000479582 00000 n +0000479772 00000 n +0000479835 00000 n +0000479898 00000 n +0000479961 00000 n +0000485194 00000 n +0000483119 00000 n +0000480163 00000 n +0000483243 00000 n +0000483306 00000 n +0000483369 00000 n +0000483432 00000 n +0000483494 00000 n +0000483684 00000 n +0000483747 00000 n +0000483811 00000 n +0000483874 00000 n +0000483937 00000 n +0000484000 00000 n +0000484063 00000 n +0000484127 00000 n +0000484190 00000 n +0000484253 00000 n +0000484317 00000 n +0000484506 00000 n +0000484568 00000 n +0000484629 00000 n +0000484690 00000 n +0000484753 00000 n +0000484816 00000 n +0000484879 00000 n +0000484942 00000 n +0000485005 00000 n +0000485068 00000 n +0000485131 00000 n +0000490170 00000 n +0000488154 00000 n +0000485333 00000 n +0000488278 00000 n +0000488341 00000 n +0000488403 00000 n +0000488466 00000 n +0000488529 00000 n +0000488590 00000 n +0000488651 00000 n +0000488715 00000 n +0000488777 00000 n +0000488840 00000 n +0000488904 00000 n +0000488967 00000 n +0000489031 00000 n +0000489094 00000 n +0000489158 00000 n +0000489221 00000 n +0000489284 00000 n +0000489347 00000 n +0000489410 00000 n +0000489473 00000 n +0000489662 00000 n +0000489725 00000 n +0000489789 00000 n +0000489852 00000 n +0000489916 00000 n +0000489980 00000 n +0000490043 00000 n +0000493865 00000 n +0000492921 00000 n +0000490295 00000 n +0000493045 00000 n +0000493171 00000 n +0000493234 00000 n +0000493298 00000 n +0000493360 00000 n +0000493423 00000 n +0000493487 00000 n +0000493550 00000 n +0000493613 00000 n +0000493676 00000 n +0000493739 00000 n +0000493802 00000 n +0000636633 00000 n +0000498726 00000 n +0000496517 00000 n +0000493991 00000 n +0000497151 00000 n +0000497214 00000 n +0000497276 00000 n +0000497340 00000 n +0000497530 00000 n +0000497593 00000 n +0000497657 00000 n +0000497720 00000 n +0000497783 00000 n +0000497846 00000 n +0000497909 00000 n +0000497971 00000 n +0000498034 00000 n +0000498097 00000 n +0000498160 00000 n +0000498223 00000 n +0000496680 00000 n +0000498286 00000 n +0000498349 00000 n +0000496833 00000 n +0000498412 00000 n +0000498475 00000 n +0000496992 00000 n +0000498537 00000 n +0000498600 00000 n +0000498663 00000 n +0000502755 00000 n +0000500995 00000 n +0000498852 00000 n +0000501119 00000 n +0000501182 00000 n +0000501245 00000 n +0000501308 00000 n +0000501433 00000 n +0000501496 00000 n +0000501559 00000 n +0000501622 00000 n +0000501685 00000 n +0000501748 00000 n +0000501811 00000 n +0000501874 00000 n +0000501937 00000 n +0000502000 00000 n +0000502063 00000 n +0000502125 00000 n +0000502189 00000 n +0000502253 00000 n +0000502316 00000 n +0000502379 00000 n +0000502505 00000 n +0000502568 00000 n +0000502631 00000 n +0000502694 00000 n +0000506750 00000 n +0000504737 00000 n +0000502908 00000 n +0000504861 00000 n +0000504924 00000 n +0000504987 00000 n +0000505050 00000 n +0000505113 00000 n +0000505176 00000 n +0000505238 00000 n +0000505301 00000 n +0000505364 00000 n +0000505427 00000 n +0000505490 00000 n +0000505553 00000 n +0000505616 00000 n +0000505679 00000 n +0000505742 00000 n +0000505805 00000 n +0000505867 00000 n +0000505930 00000 n +0000505994 00000 n +0000506057 00000 n +0000506183 00000 n +0000506246 00000 n +0000506309 00000 n +0000506372 00000 n +0000506435 00000 n +0000506498 00000 n +0000506561 00000 n +0000506624 00000 n +0000506687 00000 n +0000511700 00000 n +0000509286 00000 n +0000506917 00000 n +0000510065 00000 n +0000510128 00000 n +0000510190 00000 n +0000509458 00000 n +0000510505 00000 n +0000509613 00000 n +0000509760 00000 n +0000509913 00000 n +0000510693 00000 n +0000510756 00000 n +0000510819 00000 n +0000510882 00000 n +0000510945 00000 n +0000511008 00000 n +0000511196 00000 n +0000511259 00000 n +0000511321 00000 n +0000511384 00000 n +0000511448 00000 n +0000511637 00000 n +0000516462 00000 n +0000514256 00000 n +0000511826 00000 n +0000514380 00000 n +0000514569 00000 n +0000514632 00000 n +0000514695 00000 n +0000514758 00000 n +0000514820 00000 n +0000514883 00000 n +0000514946 00000 n +0000515010 00000 n +0000515073 00000 n +0000515136 00000 n +0000515200 00000 n +0000515263 00000 n +0000515326 00000 n +0000515389 00000 n +0000515452 00000 n +0000515515 00000 n +0000515578 00000 n +0000515640 00000 n +0000515703 00000 n +0000515767 00000 n +0000515831 00000 n +0000515894 00000 n +0000515957 00000 n +0000516020 00000 n +0000516083 00000 n +0000516147 00000 n +0000516210 00000 n +0000516273 00000 n +0000516336 00000 n +0000516399 00000 n +0000520497 00000 n +0000518665 00000 n +0000516587 00000 n +0000518789 00000 n +0000518852 00000 n +0000518915 00000 n +0000518979 00000 n +0000519042 00000 n +0000519105 00000 n +0000519168 00000 n +0000519232 00000 n +0000519296 00000 n +0000519359 00000 n +0000519422 00000 n +0000519486 00000 n +0000519549 00000 n +0000519613 00000 n +0000519676 00000 n +0000519739 00000 n +0000519803 00000 n +0000519866 00000 n +0000519930 00000 n +0000519993 00000 n +0000520056 00000 n +0000520119 00000 n +0000520182 00000 n +0000520245 00000 n +0000520308 00000 n +0000520371 00000 n +0000520434 00000 n +0000636758 00000 n +0000524637 00000 n +0000523065 00000 n +0000520636 00000 n +0000523189 00000 n +0000523252 00000 n +0000523315 00000 n +0000523378 00000 n +0000523441 00000 n +0000523503 00000 n +0000523566 00000 n +0000523629 00000 n +0000523692 00000 n +0000523755 00000 n +0000523818 00000 n +0000523881 00000 n +0000523944 00000 n +0000524007 00000 n +0000524071 00000 n +0000524134 00000 n +0000524197 00000 n +0000524260 00000 n +0000524323 00000 n +0000524385 00000 n +0000524448 00000 n +0000524511 00000 n +0000524574 00000 n +0000529098 00000 n +0000527460 00000 n +0000524736 00000 n +0000527584 00000 n +0000527647 00000 n +0000527710 00000 n +0000527773 00000 n +0000527836 00000 n +0000527899 00000 n +0000527962 00000 n +0000528025 00000 n +0000528089 00000 n +0000528152 00000 n +0000528216 00000 n +0000528280 00000 n +0000528342 00000 n +0000528406 00000 n +0000528469 00000 n +0000528531 00000 n +0000528595 00000 n +0000528659 00000 n +0000528720 00000 n +0000528783 00000 n +0000528846 00000 n +0000528909 00000 n +0000528972 00000 n +0000529035 00000 n +0000533214 00000 n +0000531829 00000 n +0000529237 00000 n +0000531953 00000 n +0000532016 00000 n +0000532079 00000 n +0000532142 00000 n +0000532205 00000 n +0000532268 00000 n +0000532331 00000 n +0000532394 00000 n +0000532457 00000 n +0000532520 00000 n +0000532583 00000 n +0000532646 00000 n +0000532709 00000 n +0000532772 00000 n +0000532835 00000 n +0000532898 00000 n +0000532961 00000 n +0000533025 00000 n +0000533088 00000 n +0000533151 00000 n +0000538259 00000 n +0000535939 00000 n +0000533313 00000 n +0000536237 00000 n +0000536300 00000 n +0000536362 00000 n +0000536425 00000 n +0000536488 00000 n +0000536551 00000 n +0000536614 00000 n +0000536677 00000 n +0000536741 00000 n +0000536804 00000 n +0000536867 00000 n +0000536930 00000 n +0000536993 00000 n +0000537057 00000 n +0000537120 00000 n +0000537183 00000 n +0000537247 00000 n +0000537310 00000 n +0000537372 00000 n +0000537435 00000 n +0000537498 00000 n +0000536084 00000 n +0000537561 00000 n +0000537625 00000 n +0000537688 00000 n +0000537751 00000 n +0000537815 00000 n +0000537878 00000 n +0000537942 00000 n +0000538006 00000 n +0000538070 00000 n +0000538133 00000 n +0000538196 00000 n +0000620601 00000 n +0000542921 00000 n +0000541287 00000 n +0000538371 00000 n +0000541411 00000 n +0000541474 00000 n +0000541537 00000 n +0000541600 00000 n +0000541662 00000 n +0000541725 00000 n +0000541787 00000 n +0000541851 00000 n +0000541913 00000 n +0000541977 00000 n +0000542040 00000 n +0000542103 00000 n +0000542167 00000 n +0000542229 00000 n +0000542293 00000 n +0000542356 00000 n +0000542419 00000 n +0000542483 00000 n +0000542546 00000 n +0000542610 00000 n +0000542673 00000 n +0000542736 00000 n +0000542795 00000 n +0000542858 00000 n +0000547722 00000 n +0000545387 00000 n +0000543060 00000 n +0000545511 00000 n +0000545574 00000 n +0000545636 00000 n +0000545699 00000 n +0000545762 00000 n +0000545824 00000 n +0000545887 00000 n +0000545950 00000 n +0000546013 00000 n +0000546076 00000 n +0000546139 00000 n +0000546203 00000 n +0000546266 00000 n +0000546329 00000 n +0000546392 00000 n +0000546455 00000 n +0000546518 00000 n +0000546582 00000 n +0000546645 00000 n +0000546709 00000 n +0000546772 00000 n +0000546835 00000 n +0000546898 00000 n +0000546962 00000 n +0000547025 00000 n +0000547089 00000 n +0000547153 00000 n +0000547217 00000 n +0000547281 00000 n +0000547344 00000 n +0000547407 00000 n +0000547470 00000 n +0000547533 00000 n +0000547596 00000 n +0000547659 00000 n +0000636883 00000 n +0000551457 00000 n +0000550203 00000 n +0000547834 00000 n +0000550327 00000 n +0000550390 00000 n +0000550453 00000 n +0000550516 00000 n +0000550579 00000 n +0000550642 00000 n +0000550705 00000 n +0000550767 00000 n +0000550830 00000 n +0000550893 00000 n +0000550957 00000 n +0000551021 00000 n +0000551082 00000 n +0000551143 00000 n +0000551205 00000 n +0000551268 00000 n +0000551331 00000 n +0000551394 00000 n +0000555675 00000 n +0000553905 00000 n +0000551569 00000 n +0000554029 00000 n +0000554092 00000 n +0000554155 00000 n +0000554218 00000 n +0000554282 00000 n +0000554345 00000 n +0000554409 00000 n +0000554472 00000 n +0000554535 00000 n +0000554598 00000 n +0000554662 00000 n +0000554725 00000 n +0000554788 00000 n +0000554851 00000 n +0000554914 00000 n +0000554978 00000 n +0000555042 00000 n +0000555105 00000 n +0000555168 00000 n +0000555232 00000 n +0000555295 00000 n +0000555357 00000 n +0000555421 00000 n +0000555484 00000 n +0000555548 00000 n +0000555611 00000 n +0000560546 00000 n +0000558906 00000 n +0000555774 00000 n +0000559030 00000 n +0000559219 00000 n +0000559282 00000 n +0000559471 00000 n +0000559534 00000 n +0000559598 00000 n +0000559661 00000 n +0000559724 00000 n +0000559788 00000 n +0000559852 00000 n +0000559916 00000 n +0000559979 00000 n +0000560168 00000 n +0000560231 00000 n +0000560294 00000 n +0000560357 00000 n +0000560420 00000 n +0000560483 00000 n +0000565598 00000 n +0000562946 00000 n +0000560672 00000 n +0000563070 00000 n +0000563133 00000 n +0000563196 00000 n +0000563385 00000 n +0000563448 00000 n +0000563512 00000 n +0000563576 00000 n +0000563640 00000 n +0000563703 00000 n +0000563766 00000 n +0000563829 00000 n +0000563892 00000 n +0000563955 00000 n +0000564018 00000 n +0000564082 00000 n +0000564146 00000 n +0000564209 00000 n +0000564273 00000 n +0000564337 00000 n +0000564400 00000 n +0000564463 00000 n +0000564526 00000 n +0000564589 00000 n +0000564651 00000 n +0000564715 00000 n +0000564779 00000 n +0000564842 00000 n +0000564905 00000 n +0000565095 00000 n +0000565157 00000 n +0000565219 00000 n +0000565281 00000 n +0000565345 00000 n +0000565408 00000 n +0000565472 00000 n +0000565535 00000 n +0000567428 00000 n +0000567178 00000 n +0000565737 00000 n +0000567302 00000 n +0000567365 00000 n +0000569665 00000 n +0000569478 00000 n +0000567527 00000 n +0000569602 00000 n +0000637008 00000 n +0000571249 00000 n +0000571062 00000 n +0000569751 00000 n +0000571186 00000 n +0000573011 00000 n +0000572824 00000 n +0000571335 00000 n +0000572948 00000 n +0000577949 00000 n +0000575624 00000 n +0000573097 00000 n +0000575748 00000 n +0000575936 00000 n +0000576124 00000 n +0000576187 00000 n +0000576250 00000 n +0000576313 00000 n +0000576375 00000 n +0000576438 00000 n +0000576502 00000 n +0000576565 00000 n +0000576628 00000 n +0000576690 00000 n +0000576878 00000 n +0000576941 00000 n +0000577005 00000 n +0000577067 00000 n +0000577130 00000 n +0000577193 00000 n +0000577255 00000 n +0000577317 00000 n +0000577380 00000 n +0000577443 00000 n +0000577506 00000 n +0000577569 00000 n +0000577632 00000 n +0000577696 00000 n +0000577759 00000 n +0000577821 00000 n +0000577885 00000 n +0000581868 00000 n +0000579804 00000 n +0000578088 00000 n +0000580106 00000 n +0000580295 00000 n +0000580358 00000 n +0000580546 00000 n +0000580609 00000 n +0000580672 00000 n +0000580735 00000 n +0000580798 00000 n +0000580987 00000 n +0000581050 00000 n +0000581239 00000 n +0000579949 00000 n +0000581302 00000 n +0000581491 00000 n +0000581554 00000 n +0000581617 00000 n +0000581680 00000 n +0000581806 00000 n +0000583525 00000 n +0000582707 00000 n +0000581967 00000 n +0000582831 00000 n +0000582957 00000 n +0000583020 00000 n +0000583084 00000 n +0000583273 00000 n +0000583336 00000 n +0000583399 00000 n +0000583462 00000 n +0000587724 00000 n +0000586406 00000 n +0000583624 00000 n +0000586530 00000 n +0000586719 00000 n +0000586782 00000 n +0000586844 00000 n +0000587032 00000 n +0000587095 00000 n +0000587158 00000 n +0000587346 00000 n +0000587409 00000 n +0000587472 00000 n +0000587535 00000 n +0000587598 00000 n +0000587661 00000 n +0000637133 00000 n +0000591882 00000 n +0000591002 00000 n +0000587823 00000 n +0000591126 00000 n +0000591189 00000 n +0000591252 00000 n +0000591441 00000 n +0000591504 00000 n +0000591693 00000 n +0000591756 00000 n +0000591819 00000 n +0000597650 00000 n +0000595262 00000 n +0000591981 00000 n +0000595386 00000 n +0000595449 00000 n +0000595511 00000 n +0000595700 00000 n +0000595763 00000 n +0000595826 00000 n +0000595889 00000 n +0000595952 00000 n +0000596015 00000 n +0000596078 00000 n +0000596141 00000 n +0000596204 00000 n +0000596266 00000 n +0000596329 00000 n +0000596392 00000 n +0000596455 00000 n +0000596518 00000 n +0000596581 00000 n +0000596644 00000 n +0000596707 00000 n +0000596770 00000 n +0000596832 00000 n +0000596895 00000 n +0000596958 00000 n +0000597021 00000 n +0000597083 00000 n +0000597146 00000 n +0000597209 00000 n +0000597272 00000 n +0000597335 00000 n +0000597398 00000 n +0000597461 00000 n +0000597524 00000 n +0000597587 00000 n +0000601598 00000 n +0000600530 00000 n +0000597749 00000 n +0000600654 00000 n +0000600717 00000 n +0000600780 00000 n +0000600969 00000 n +0000601032 00000 n +0000601095 00000 n +0000601283 00000 n +0000601346 00000 n +0000601535 00000 n +0000605559 00000 n +0000604303 00000 n +0000601697 00000 n +0000604427 00000 n +0000604490 00000 n +0000604677 00000 n +0000604866 00000 n +0000605055 00000 n +0000605118 00000 n +0000605182 00000 n +0000605370 00000 n +0000605433 00000 n +0000605496 00000 n +0000606840 00000 n +0000606527 00000 n +0000605658 00000 n +0000606651 00000 n +0000606714 00000 n +0000606777 00000 n +0000612588 00000 n +0000608879 00000 n +0000606926 00000 n +0000609179 00000 n +0000609368 00000 n +0000609494 00000 n +0000609617 00000 n +0000609680 00000 n +0000609743 00000 n +0000609807 00000 n +0000609871 00000 n +0000610122 00000 n +0000610185 00000 n +0000610248 00000 n +0000610312 00000 n +0000610376 00000 n +0000610438 00000 n +0000610563 00000 n +0000610626 00000 n +0000610689 00000 n +0000610752 00000 n +0000610815 00000 n +0000610879 00000 n +0000610942 00000 n +0000611005 00000 n +0000611068 00000 n +0000611131 00000 n +0000611194 00000 n +0000611257 00000 n +0000611320 00000 n +0000611384 00000 n +0000611448 00000 n +0000611511 00000 n +0000611574 00000 n +0000611637 00000 n +0000611699 00000 n +0000611763 00000 n +0000611827 00000 n +0000611891 00000 n +0000611955 00000 n +0000612019 00000 n +0000612083 00000 n +0000612147 00000 n +0000612210 00000 n +0000612273 00000 n +0000612336 00000 n +0000612398 00000 n +0000612462 00000 n +0000609024 00000 n +0000612525 00000 n +0000637258 00000 n +0000617449 00000 n +0000614490 00000 n +0000612713 00000 n +0000614614 00000 n +0000614739 00000 n +0000614863 00000 n +0000614926 00000 n +0000614988 00000 n +0000615052 00000 n +0000615116 00000 n +0000615180 00000 n +0000615306 00000 n +0000615369 00000 n +0000615558 00000 n +0000615621 00000 n +0000615684 00000 n +0000615934 00000 n +0000615996 00000 n +0000616059 00000 n +0000616122 00000 n +0000616186 00000 n +0000616312 00000 n +0000616375 00000 n +0000616563 00000 n +0000616626 00000 n +0000616689 00000 n +0000616752 00000 n +0000616816 00000 n +0000616943 00000 n +0000617068 00000 n +0000617131 00000 n +0000617194 00000 n +0000617258 00000 n +0000617322 00000 n +0000617385 00000 n +0000621107 00000 n +0000618842 00000 n +0000617589 00000 n +0000618966 00000 n +0000619029 00000 n +0000619154 00000 n +0000619280 00000 n +0000619343 00000 n +0000619406 00000 n +0000619470 00000 n +0000619533 00000 n +0000619658 00000 n +0000619784 00000 n +0000619847 00000 n +0000619910 00000 n +0000619974 00000 n +0000620038 00000 n +0000620101 00000 n +0000620351 00000 n +0000620413 00000 n +0000620476 00000 n +0000620727 00000 n +0000620790 00000 n +0000620853 00000 n +0000620916 00000 n +0000620980 00000 n +0000621044 00000 n +0000626435 00000 n +0000622955 00000 n +0000621219 00000 n +0000623420 00000 n +0000623483 00000 n +0000623545 00000 n +0000623671 00000 n +0000623732 00000 n +0000623109 00000 n +0000623795 00000 n +0000623858 00000 n +0000623921 00000 n +0000623984 00000 n +0000624047 00000 n +0000624110 00000 n +0000624173 00000 n +0000624236 00000 n +0000624299 00000 n +0000624362 00000 n +0000624426 00000 n +0000624490 00000 n +0000624553 00000 n +0000624616 00000 n +0000624679 00000 n +0000623264 00000 n +0000624743 00000 n +0000624993 00000 n +0000625056 00000 n +0000625118 00000 n +0000625304 00000 n +0000625367 00000 n +0000625430 00000 n +0000625555 00000 n +0000625617 00000 n +0000625680 00000 n +0000625744 00000 n +0000625867 00000 n +0000625992 00000 n +0000626055 00000 n +0000626117 00000 n +0000626179 00000 n +0000626243 00000 n +0000626307 00000 n +0000626371 00000 n +0000628310 00000 n +0000630705 00000 n +0000628061 00000 n +0000626547 00000 n +0000628185 00000 n +0000628434 00000 n +0000628497 00000 n +0000628559 00000 n +0000628685 00000 n +0000628748 00000 n +0000628811 00000 n +0000628875 00000 n +0000629000 00000 n +0000629063 00000 n +0000629189 00000 n +0000629252 00000 n +0000629315 00000 n +0000629378 00000 n +0000629441 00000 n +0000629505 00000 n +0000629569 00000 n +0000629633 00000 n +0000629696 00000 n +0000629760 00000 n +0000629824 00000 n +0000629888 00000 n +0000629952 00000 n +0000630074 00000 n +0000630200 00000 n +0000630263 00000 n +0000630326 00000 n +0000630516 00000 n +0000630579 00000 n +0000630642 00000 n +0000632644 00000 n +0000631893 00000 n +0000630804 00000 n +0000632017 00000 n +0000632141 00000 n +0000632266 00000 n +0000632329 00000 n +0000632391 00000 n +0000632454 00000 n +0000632517 00000 n +0000632580 00000 n +0000632776 00000 n +0000637383 00000 n +0000637508 00000 n +0000637634 00000 n +0000637733 00000 n +0000637815 00000 n +0000656474 00000 n +0000696079 00000 n +0000696120 00000 n +0000696160 00000 n +0000696391 00000 n +trailer +<< +/Size 3626 +/Root 3624 0 R +/Info 3625 0 R +>> +startxref +696547 +%%EOF diff --git a/docs/pdf/CVS/Entries b/docs/pdf/CVS/Entries new file mode 100644 index 0000000000000000000000000000000000000000..e7dda7aaeecfa1eeb01383911ac0f3381d05d7bf --- /dev/null +++ b/docs/pdf/CVS/Entries @@ -0,0 +1,2 @@ +/Bugzilla-Guide.pdf/1.5/Sun Nov 2 14:04:29 2003//TBUGZILLA-2_17_5 +D diff --git a/docs/pdf/CVS/Repository b/docs/pdf/CVS/Repository new file mode 100644 index 0000000000000000000000000000000000000000..19fdd532b66b507bf26559ec9e6d550c257df6dc --- /dev/null +++ b/docs/pdf/CVS/Repository @@ -0,0 +1 @@ +mozilla/webtools/bugzilla/docs/pdf diff --git a/docs/pdf/CVS/Root b/docs/pdf/CVS/Root new file mode 100644 index 0000000000000000000000000000000000000000..cdb6f4a0739a0dc53e628026726036377dec3637 --- /dev/null +++ b/docs/pdf/CVS/Root @@ -0,0 +1 @@ +:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot diff --git a/docs/pdf/CVS/Tag b/docs/pdf/CVS/Tag new file mode 100644 index 0000000000000000000000000000000000000000..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd --- /dev/null +++ b/docs/pdf/CVS/Tag @@ -0,0 +1 @@ +NBUGZILLA-2_17_5 diff --git a/docs/txt/Bugzilla-Guide.txt b/docs/txt/Bugzilla-Guide.txt index 5195385a0b1909e164b55c2b57efe82e134507d6..39b249eba059a992c528e2d89db70f4af188befd 100644 --- a/docs/txt/Bugzilla-Guide.txt +++ b/docs/txt/Bugzilla-Guide.txt @@ -1,5 +1,4 @@ - -The Bugzilla Guide - 2.17.4 Development Release +The Bugzilla Guide - 2.17.5 Development Release Matthew P. Barnson @@ -7,7 +6,7 @@ Jacob Steenhagen The Bugzilla Team - 2003-04-23 + 2003-11-01 This is the documentation for Bugzilla, the mozilla.org bug-tracking system. Bugzilla is an enterprise-class piece of software that powers @@ -16,11 +15,14 @@ The Bugzilla Team This documentation is maintained in DocBook 4.1.2 XML format. Changes are best submitted as plain text or XML diffs, attached to a bug filed - in the Bugzilla Documentation compontent. + in the Bugzilla Documentation component. This is a development version of this guide. Information in it is subject to change before the 2.18 release of this guide (which will correspond with the 2.18 release of Bugzilla). + + The most current version of this document can always be found on the + Bugzilla Documentation Page. _________________________________________________________________ Table of Contents @@ -102,11 +104,13 @@ The Bugzilla Team Glossary List of Figures - 4-1. Other File::Temp error messages - 4-2. Patch for File::Temp in Perl 5.6.0 + 4-1. Set Max Packet Size in MySQL + 4-2. Other File::Temp error messages + 4-3. Patch for File::Temp in Perl 5.6.0 List of Examples - 4-1. .htaccess files for Apache + 4-1. Installing perl modules with CPAN + 4-2. .htaccess files for Apache 5-1. Upgrading using CVS 5-2. Upgrading using the tarball 5-3. Upgrading using patches @@ -118,13 +122,13 @@ Chapter 1. About This Guide - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.1 or - any later version published by the Free Software Foundation; with no - Invariant Sections, no Front-Cover Texts, and with no Back-Cover - Texts. A copy of the license is included in Appendix E. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with no + Invariant Sections, no Front-Cover Texts, and with no Back-Cover + Texts. A copy of the license is included in Appendix E. - --Copyright (c) 2000-2003 Matthew P. Barnson and The Bugzilla Team + --Copyright (c) 2000-2003 Matthew P. Barnson and The Bugzilla Team If you have any questions regarding this document, its copyright, or publishing this document in non-electronic form, please contact The @@ -170,7 +174,7 @@ Chapter 1. About This Guide 1.3. New Versions - This is the 2.17.4 version of The Bugzilla Guide. It is so named to + This is the 2.17.5 version of The Bugzilla Guide. It is so named to match the current version of Bugzilla. This version of the guide, like its associated Bugzilla version is a development version. Information is subject to change between now and when 2.18 is released. If you are @@ -178,16 +182,16 @@ Chapter 1. About This Guide of these mirrors to make sure you are reading an up-to-date version of the Guide. - The newest version of this guide can always be found at bugzilla.org; - including documentation for past releases and the current development - version. + The newest version of this guide can always be found at + http://www.bugzilla.org; including documentation for past releases and + the current development version. The documentation for the most recent stable release of Bugzilla can also be found at The Linux Documentation Project. The latest version of this document can always be checked out via CVS. - Please follow the instructions available at the Mozilla CVS page, and - check out the mozilla/webtools/bugzilla/docs/ subtree. + Please follow the Mozilla CVS instructions and check out the + mozilla/webtools/bugzilla/docs/ subtree. The Bugzilla Guide is currently only available in English. If you would like to volunteer to translate it, please contact Dave Miller. @@ -234,7 +238,7 @@ Chapter 1. About This Guide Thanks also go to the following people for significant contributions to this documentation (in alphabetical order): Andrew Pearson, Ben FrantzDale, Eric Hanson, Gervase Markham, Joe Robins, Kevin Brannen, - Ron Teitelbaum, Spencer Smith, Zach Liption . + Martin Wulffeld, Ron Teitelbaum, Spencer Smith, Zach Liption . _________________________________________________________________ 1.5. Document Conventions @@ -244,24 +248,28 @@ Chapter 1. About This Guide Descriptions Appearance Warnings + Caution - Don't run with scissors! + Don't run with scissors! Hint + Tip - Would you like a breath mint? + Would you like a breath mint? Notes + Note - Dear John... + Dear John... Information requiring special attention + Warning - Read this or the cat gets it. + Read this or the cat gets it. File Names filename Directory Names directory Commands to be typed command @@ -273,9 +281,9 @@ Chapter 1. About This Guide Emphasized word word Term found in the glossary Bugzilla Code Example -<para> -Beginning and end of paragraph -</para> + <para> + Beginning and end of paragraph + </para> _________________________________________________________________ Chapter 2. Introduction @@ -374,7 +382,7 @@ Chapter 3. Using Bugzilla Consult with the administrator responsible for your installation of Bugzilla for the URL you should use to access it. If you're test-driving Bugzilla, use this URL: - http://landfill.bugzilla.org/bugzilla-tip/ + http://landfill.bugzilla.org/bugzilla-tip/. 1. Click the "Open a new Bugzilla account" link, enter your email address and, optionally, your name in the spaces provided, then @@ -407,22 +415,22 @@ Chapter 3. Using Bugzilla several Components: Administration: Administration of a Bugzilla installation. - Bugzilla-General: Anything that doesn't fit in the other components, - or spans multiple components. + Bugzilla-General: Anything that doesn't fit in the other components, + or spans multiple components. Creating/Changing Bugs: Creating, changing, and viewing bugs. - Documentation: The Bugzilla documentation, including The Bugzilla - Guide. + Documentation: The Bugzilla documentation, including The Bugzilla + Guide. Email: Anything to do with email sent by Bugzilla. Installation: The installation process of Bugzilla. - Query/Buglist: Anything to do with searching for bugs and viewing the - buglists. + Query/Buglist: Anything to do with searching for bugs and viewing the + buglists. Reporting/Charting: Getting reports from Bugzilla. - User Accounts: Anything about managing a user account from the user's - perspective. Saved queries, creating accounts, changing passwords, - logging in, etc. - User Interface: General issues having to do with the user interface - cosmetics (not functionality) including cosmetic issues, HTML - templates, etc. + User Accounts: Anything about managing a user account from the user's + perspective. Saved queries, creating accounts, changing passwords, + logging in, etc. + User Interface: General issues having to do with the user interface + cosmetics (not functionality) including cosmetic issues, HTML + templates, etc. 2. Status and Resolution: These define exactly what state the bug is in - from not even being confirmed as a bug, through to being fixed and the fix confirmed by Quality Assurance. The different @@ -472,15 +480,20 @@ Chapter 3. Using Bugzilla The Bugzilla Search page is is the interface where you can find any bug report, comment, or patch currently in the Bugzilla system. You - can play with it here: landfill.bugzilla.org/bugzilla-tip/query.cgi . + can play with it here: + http://landfill.bugzilla.org/bugzilla-tip/query.cgi. The Search page has controls for selecting different possible values - for all of the fields in a bug, as described above. Once you've - defined a search, you can either run it, or save it as a Remembered - Query, which can optionally appear in the footer of your pages. + for all of the fields in a bug, as described above. For some fields, + multiple values can be selected. In those cases, Bugzilla returns bugs + where the content of the field matches one of the selected values. If + none is selected, then the field can take any value. - Highly advanced querying is done using Boolean Charts, which have - their own context-sensitive help . + Once you've defined a search, you can either run it, or save it as a + Remembered Query, which can optionally appear in the footer of your + pages. + + Highly advanced querying is done using Boolean Charts. _________________________________________________________________ 3.1.4. Bug Lists @@ -528,6 +541,93 @@ Chapter 3. Using Bugzilla 4. Select "Commit" and send in your bug report. _________________________________________________________________ +3.1.6. Patch Viewer + + Viewing and reviewing patches in Bugzilla is often difficult due to + lack of context, improper format and the inherent readability issues + that raw patches present. Patch Viewer is an enhancement to Bugzilla + designed to fix that by offering increased context, linking to + sections, and integrating with Bonsai, LXR and CVS. + + Patch viewer allows you to: + + View patches in color, with side-by-side view rather than trying to + interpret the contents of the patch. + See the difference between two patches. + Get more context in a patch. + Collapse and expand sections of a patch for easy reading. + Link to a particular section of a patch for discussion or review + Go to Bonsai or LXR to see more context, blame, and cross-references + for the part of the patch you are looking at + Create a rawtext unified format diff out of any patch, no matter what + format it came from + _________________________________________________________________ + +3.1.6.1. Viewing Patches in Patch Viewer + + The main way to view a patch in patch viewer is to click on the "Diff" + link next to a patch in the Attachments list on a bug. You may also do + this within the edit window by clicking the "View Attachment As Diff" + button in the Edit Attachment screen. + _________________________________________________________________ + +3.1.6.2. Seeing the Difference Between Two Patches + + To see the difference between two patches, you must first view the + newer patch in Patch Viewer. Then select the older patch from the + dropdown at the top of the page ("Differences between [dropdown] and + this patch") and click the "Diff" button. This will show you what is + new or changed in the newer patch. + _________________________________________________________________ + +3.1.6.3. Getting More Context in a Patch + + To get more context in a patch, you put a number in the textbox at the + top of Patch Viewer ("Patch / File / [textbox]") and hit enter. This + will give you that many lines of context before and after each change. + Alternatively, you can click on the "File" link there and it will show + each change in the full context of the file. This feature only works + against files that were diffed using "cvs diff". + _________________________________________________________________ + +3.1.6.4. Collapsing and Expanding Sections of a Patch + + To view only a certain set of files in a patch (for example, if a + patch is absolutely huge and you want to only review part of it at a + time), you can click the "(+)" and "(-)" links next to each file (to + expand it or collapse it). If you want to collapse all files or expand + all files, you can click the "Collapse All" and "Expand All" links at + the top of the page. + _________________________________________________________________ + +3.1.6.5. Linking to a Section of a Patch + + To link to a section of a patch (for example, if you want to be able + to give someone a URL to show them which part you are talking about) + you simply click the "Link Here" link on the section header. The + resulting URL can be copied and used in discussion. (Copy Link + Location in Mozilla works as well.) + _________________________________________________________________ + +3.1.6.6. Going to Bonsai and LXR + + To go to Bonsai to get blame for the lines you are interested in, you + can click the "Lines XX-YY" link on the section header you are + interested in. This works even if the patch is against an old version + of the file, since Bonsai stores all versions of the file. + + To go to LXR, you click on the filename on the file header + (unfortunately, since LXR only does the most recent version, line + numbers are likely to rot). + _________________________________________________________________ + +3.1.6.7. Creating a Unified Diff + + If the patch is not in a format that you like, you can turn it into a + unified diff format by clicking the "Raw Unified" link at the top of + the page. + _________________________________________________________________ + 3.2. Hints and Tips This section distills some Bugzilla tips and best practices that have @@ -649,8 +749,8 @@ Chapter 3. Using Bugzilla Note - The ability to watch other users may not be available in all Bugzilla - installations. If you can't see it, ask your administrator. + The ability to watch other users may not be available in all Bugzilla + installations. If you can't see it, ask your administrator. _________________________________________________________________ 3.3.3. Page Footer @@ -673,167 +773,241 @@ Chapter 4. Installation 4.1. Step-by-step Install -4.1.1. Introduction + Bugzilla has been successfully installed under many different + operating systems including almost all Unix clones and Microsoft + Windows. Many operating systems have utilities that make installation + easier or quirks that make it harder. We have tried to collect that + information in Section 4.3, so be sure to check out that section + before you start your installation. - Bugzilla has been successfully installed under Solaris, Linux, and - Win32. Win32 is not yet officially supported, but many people have got - it working fine. Please see Section 4.3.1 for further advice on - getting Bugzilla to work on Microsoft Windows. + Note + + Windows is one of those operating systems that has many quirks and is + not yet officially supported by the Bugzilla team. If you wish to + install Bugzilla on Windows, be sure to see Section 4.3.1. + + Warning + + While installing Bugzilla, it is a good idea to ensure that there is + some kind of firewall between you and the rest of the Internet as your + machine may be insecure for periods during the install. Many + installation steps require an active Internet connection to complete, + but you must take care to ensure that at no point is your machine + vulnerable to an attack. + + This guide assumes that you already have your operating system + installed, network configured, and have administrative access to the + shell on the machine you are installing Bugzilla onto. It is possible + to install and run Bugzilla without administrative access, but you + have to either make sure all the required software is installed or get + somebody with administrative access to install it for you. + + The listing below is a basic step-by-step list. More information can + be found in the sections below. Minimum versions will be included in + parenthesis where appropriate. + 1. Install MySQL (3.23.41) + 2. Install Perl (5.6) + 3. Install Perl Modules + 4. Install a Webserver + 5. Put Bugzilla in the Webspace + 6. Setup the MySQL Database _________________________________________________________________ -4.1.2. Package List +4.1.1. MySQL + + Visit the MySQL homepage at http://www.mysql.com to grab and install + the latest stable release of the server. Note - If you are running the very most recent version of Perl and MySQL - (both the executables and development libraries) on your system, you - can skip these manual installation steps for the Perl modules by using - Bundle::Bugzilla; see Using Bundle::Bugzilla instead of manually - installing Perl modules. - - The software packages necessary for the proper running of Bugzilla - (with download links) are: - - 1. MySQL database server (3.23.41 or greater) - 2. Perl (5.6, 5.6.1 is recommended if you wish to use - Bundle::Bugzilla) - 3. Perl Modules (minimum version): - a. Template (v2.08) - b. File::Temp (1.804) (Prerequisite for Template) - c. AppConfig (1.52) - d. Text::Wrap (2001.0131) - e. File::Spec (0.82) - f. Data::Dumper (any) - g. DBD::mysql (2.1010) - h. DBI (1.32) - i. Date::Parse (2.21) - j. CGI (2.88) - and, optionally: - a. GD (1.20) for bug charting - b. GD::Graph (any) for bug charting - c. GD::Text::Align (any) for bug charting - d. Chart::Base (0.99c) for bug charting - e. XML::Parser (any) for the XML interface - f. MIME::Parser (any) for the email interface - 4. The web server of your choice. Apache is highly recommended. + Many of the binary versions of MySQL store their data files in /var. + On some Unix systems, this is part of a smaller root partition, and + may not have room for your bug database. You can set the data + directory as an option to configure if you build MySQL from source + yourself. + + If you install from something other than a packaging/installation + system (such as .rpm, .dep, .exe, or .msi) you will need to configure + your system so the MySQL server daemon will come back up whenever your + machine reboots. + + If you wish to have attachments larger than 64K, you will have to + configure MySQL to accept large packets. This is done by adding the + text in Figure 4-1 to your my.conf file. There is also a parameter in + Bugzilla for setting the maximum allowable attachment size. You should + set this value to be slightly larger than that parameter. + + Figure 4-1. Set Max Packet Size in MySQL + [mysqld] + # Allow packets up to 1M + set-variable = max_allowed_packet=1M + + If you are running Bugzilla and MySQL on the same machine, you may + also wish to utilize the skip-networking option as mentioned in + Section 5.6.2 for the added security. + _________________________________________________________________ - Warning +4.1.2. Perl - It is a good idea, while installing Bugzilla, to ensure that there is - some kind of firewall between you and the rest of the Internet, - because your machine may be insecure for periods during the install. - Many installation steps require an active Internet connection to - complete, but you must take care to ensure that at no point is your - machine vulnerable to an attack. + Any machine that doesn't have Perl on it is a sad machine indeed. Perl + can be got in source form from http://www.perl.com. There are also + binary versions available for many platforms, most of which are linked + to from perl.com. Although Bugzilla runs with perl 5.6, it's a good + idea to be up to the very latest version if you can when running + Bugzilla. As of this writing, that is Perl version 5.8. _________________________________________________________________ -4.1.3. MySQL +4.1.3. Perl Modules - Visit the MySQL homepage at www.mysql.com to grab and install the - latest stable release of the server. + Perl modules can be found using CPAN on Unix based systems or PPM on + Win32. The root servers have a real tendency to bog down, so please + use mirrors. - Note + Good instuctions can be found for using each of these services on + their respective websites. The basics can be found in Example 4-1 for + CPAN and Section 4.3.1.2 for PPM. - Many of the binary versions of MySQL store their data files in /var. - On some Unix systems, this is part of a smaller root partition, and - may not have room for your bug database. You can set the data - directory as an option to configure if you build MySQL from source - yourself. + Example 4-1. Installing perl modules with CPAN - If you install from something other than an RPM or Debian package, you - will need to add mysqld to your init scripts so the server daemon will - come back up whenever your machine reboots. Further discussion of UNIX - init sequences are beyond the scope of this guide. + The easy way: + bash# perl -MCPAN -e 'install "<modulename>"' + + Or the hard way: + bash# tar xzvf <module>.tar.gz (1) + bash# cd <module> (2) + bash# perl Makefile.PL + bash# make + bash# make test + bash# make install + + (1) + This assumes that you've already downloaded the <module>.tar.gz + to the current working directory. + (2) + The process of untaring the module as defined in (1) will + create the <module> directory. - Change your init script to start mysqld with the ability to accept - large packets. By default, mysqld only accepts packets up to 64K long. - This limits the size of attachments you may put on bugs. If you add -O - max_allowed_packet=1M to the command that starts mysqld (or - safe_mysqld), then you will be able to have attachments up to about 1 - megabyte. There is a Bugzilla parameter for maximum attachment size; - you should configure it to match the value you choose here. + Tip - If you plan on running Bugzilla and MySQL on the same machine, - consider using the --skip-networking option in the init script. This - enhances security by preventing network access to MySQL. + Many people complain that Perl modules will not install for them. Most + times, the error messages complain that they are missing a file in + "@INC". Virtually every time, this error is due to permissions being + set too restrictively for you to compile Perl modules or not having + the necessary Perl development libraries installed on your system. + Consult your local UNIX systems administrator for help solving these + permissions issues; if you are the local UNIX sysadmin, please consult + the newsgroup/mailing list for further assistance or hire someone to + help you out. + + Perl Modules (minimum version): + + 1. Bundle::Bugzilla (Will allow you to skip the rest) + 2. AppConfig (1.52) + 3. CGI (2.88) + 4. Data::Dumper (any) + 5. Date::Format (2.21) + 6. DBI (1.32) + 7. DBD::mysql (2.1010) + 8. File::Spec (0.82) + 9. File::Temp (any) + 10. Template Toolkit (2.08) + 11. Text::Wrap (2001.0131) + + and, optionally: + + 1. GD (1.20) for bug charting + 2. Chart::Base (0.99c) for bug charting + 3. XML::Parser (any) for the XML interface + 4. GD::Graph (any) for bug charting + 5. GD::Text::Align (any) for bug charting + 6. MIME::Parser (any) for the email interface + 7. PatchReader (0.9.1) for pretty HTML view of patches _________________________________________________________________ -4.1.4. Perl +4.1.3.1. Bundle::Bugzilla - Any machine that doesn't have Perl on it is a sad machine indeed. Perl - can be got in source form from perl.com for the rare *nix systems - which don't have it. Although Bugzilla runs with perl 5.6, it's a good - idea to be up to the very latest version if you can when running - Bugzilla. As of this writing, that is Perl version 5.8. + If you are running at least perl 5.6.1, you can save yourself a lot of + time by using Bundle::Bugzilla. This bundle contains every module + required to get Bugzilla running. It does not include GD and friends, + but these are not required for a base install and can always be added + later if the need arises. - Tip + Assuming your perl was installed with CPAN (most unix installations + are), using Bundle::Bugzilla is really easy. Simply follow along with + the commands below. + bash# perl -MCPAN -eshell (1) + cpan shell -- CPAN exploration and modules installation (v1.63) + ReadLine support enabled - You can skip the following Perl module installation steps by - installing Bundle::Bugzilla from CPAN, which installs all required - modules for you. + cpan> - bash# perl -MCPAN -e 'install "Bundle::Bugzilla"' - Bundle::Bugzilla doesn't include GD, Chart::Base, or MIME::Parser, - which are not essential to a basic Bugzilla install. If installing - this bundle fails, you should install each module individually to - isolate the problem. + (1) + At this point, unless you've used CPAN on this machine before, + you'll have to go through a series of configuration steps. _________________________________________________________________ -4.1.5. Perl Modules +4.1.3.2. AppConfig (1.52) - All Perl modules can be found on the Comprehensive Perl Archive - Network (CPAN). The CPAN servers have a real tendency to bog down, so - please use mirrors. + Dependency for Template Toolkit. We probably don't need to + specifically check for it anymore. + _________________________________________________________________ - Quality, general Perl module installation instructions can be found on - the CPAN website, but the easy thing to do is to just use the CPAN - shell which does all the hard work for you. To use the CPAN shell to - install a module: +4.1.3.3. CGI (2.88) - bash# perl -MCPAN -e 'install "<modulename>"' + The CGI module parses form elements and cookies and does many other + usefule things. It come as a part of recent perl distributions, but + Bugzilla needs a fairly new version. - To do it the hard way: + CPAN Download Page: http://search.cpan.org/dist/CGI.pm/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/CGI.zip + Documentation: http://www.perldoc.com/perl5.8.0/lib/CGI.html + _________________________________________________________________ - Untar the module tarball -- it should create its own directory +4.1.3.4. Data::Dumper (any) - CD to the directory just created, and enter the following commands: + The Data::Dumper module provides data structure persistence for Perl + (similar to Java's serialization). It comes with later sub-releases of + Perl 5.004, but a re-installation just to be sure it's available won't + hurt anything. - 1. bash# perl Makefile.PL - 2. bash# make - 3. bash# make test - 4. bash# make install + CPAN Download Page: http://search.cpan.org/dist/Data-Dumper/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/Data-Dumper.zip + Documentation: http://www.perldoc.com/perl5.8.0/lib/Data/Dumpe + r.html + _________________________________________________________________ - Warning +4.1.3.5. TimeDate modules (2.21) - Many people complain that Perl modules will not install for them. Most - times, the error messages complain that they are missing a file in - "@INC". Virtually every time, this error is due to permissions being - set too restrictively for you to compile Perl modules or not having - the necessary Perl development libraries installed on your system. - Consult your local UNIX systems administrator for help solving these - permissions issues; if you are the local UNIX sysadmin, please consult - the newsgroup/mailing list for further assistance or hire someone to - help you out. + Many of the more common date/time/calendar related Perl modules have + been grouped into a bundle similar to the MySQL modules bundle. This + bundle is stored on the CPAN under the name TimeDate. The component + module we're most interested in is the Date::Format module, but + installing all of them is probably a good idea anyway. + + CPAN Download Page: http://search.cpan.org/dist/TimeDate/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/TimeDate.zip + Documentation: http://search.cpan.org/dist/TimeDate/lib/Date/F + ormat.pm _________________________________________________________________ -4.1.5.1. DBI +4.1.3.6. DBI (1.32) The DBI module is a generic Perl module used the MySQL-related modules. As long as your Perl installation was done correctly the DBI module should be a breeze. It's a mixed Perl/C module, but Perl's MakeMaker system simplifies the C compilation greatly. - _________________________________________________________________ -4.1.5.2. Data::Dumper - - The Data::Dumper module provides data structure persistence for Perl - (similar to Java's serialization). It comes with later sub-releases of - Perl 5.004, but a re-installation just to be sure it's available won't - hurt anything. + CPAN Download Page: http://search.cpan.org/dist/DBI/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/DBI.zip + Documentation: http://dbi.perl.org/doc/ _________________________________________________________________ -4.1.5.3. MySQL-related modules +4.1.3.7. MySQL-related modules The Perl/MySQL interface requires a few mutually-dependent Perl modules. These modules are grouped together into the the @@ -850,21 +1024,66 @@ Chapter 4. Installation A host of 'localhost' should be fine and a testing user of 'test' with a null password should find itself with sufficient access to run tests on the 'test' database which MySQL created upon installation. + + CPAN Download Page: http://search.cpan.org/dist/DBD-mysql/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/DBD-Mysql.zip + Documentation: http://search.cpan.org/dist/DBD-mysql/lib/DBD/m + ysql.pod _________________________________________________________________ -4.1.5.4. TimeDate modules +4.1.3.8. File::Spec (0.82) - Many of the more common date/time/calendar related Perl modules have - been grouped into a bundle similar to the MySQL modules bundle. This - bundle is stored on the CPAN under the name TimeDate. The component - module we're most interested in is the Date::Format module, but - installing all of them is probably a good idea anyway. + File::Spec is a perl module that allows file operations, such as + generating full path names, to work cross platform. + + CPAN Download Page: http://search.cpan.org/dist/File-Spec/ + PPM Download Page: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/File-Spec.zip + Documentation: http://www.perldoc.com/perl5.8.0/lib/File/Spec. + html + _________________________________________________________________ + +4.1.3.9. File::Temp (any) + + File::Temp is used to generate a temporary filename that is guaranteed + to be unique. It comes as a standard part of perl + + CPAN Download Page: http://search.cpan.org/dist/File-Spec/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/File-Spec.zip + Documentation: http://www.perldoc.com/perl5.8.0/lib/File/Temp. + html + _________________________________________________________________ + +4.1.3.10. Template Toolkit (2.08) + + When you install Template Toolkit, you'll get asked various questions + about features to enable. The defaults are fine, except that it is + recommended you use the high speed XS Stash of the Template Toolkit, + in order to achieve best performance. + + CPAN Download Page: http://search.cpan.org/dist/Template-Toolk + it/ + PPM Download Link: http://openinteract.sourceforge.net/ppmpack + ages/5.6/Template-Toolkit.tar.gz + Documentation: http://www.template-toolkit.org/docs.html + _________________________________________________________________ + +4.1.3.11. Text::Wrap (2001.0131) + + Text::Wrap is designed to proved intelligent text wrapping. + + CPAN Download Page: http://search.cpan.org/dist/Text-Tabs+Wrap + / + Documentation: http://www.perldoc.com/perl5.8.0/lib/Text/Wrap. + html _________________________________________________________________ -4.1.5.5. GD (optional) +4.1.3.12. GD (1.20) [optional] The GD library was written by Thomas Boutell a long while ago to - programatically generate images in C. Since then it's become the + programmatically generate images in C. Since then it's become the defacto standard for programmatic image construction. The Perl bindings to it found in the GD library are used on millions of web pages to generate graphs on the fly. That's what Bugzilla will be @@ -873,29 +1092,101 @@ Chapter 4. Installation Note - The Perl GD library requires some other libraries that may or may not - be installed on your system, including libpng and libgd. The full - requirements are listed in the Perl GD library README. If compiling GD - fails, it's probably because you're missing a required library. + The Perl GD library requires some other libraries that may or may not + be installed on your system, including libpng and libgd. The full + requirements are listed in the Perl GD library README. If compiling GD + fails, it's probably because you're missing a required library. + + Tip + + The version of the GD perl module you need is very closely tied to the + libgd version installed on your system. If you have a version 1.x of + libgd the 2.x versions of the GD perl module won't work for you. + + CPAN Download Page: http://search.cpan.org/dist/GD/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/GD.zip + Documentation: http://stein.cshl.org/WWW/software/GD/ _________________________________________________________________ -4.1.5.6. Chart::Base (optional) +4.1.3.13. Chart::Base (0.99c) [optional] The Chart module provides Bugzilla with on-the-fly charting abilities. It can be installed in the usual fashion after it has been fetched from CPAN. Note that earlier versions that 0.99c used GIFs, which are no longer supported by the latest versions of GD. + + CPAN Download Page: http://search.cpan.org/dist/Chart/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/Chart.zip _________________________________________________________________ -4.1.5.7. Template Toolkit +4.1.3.14. XML::Parser (any) [Optional] - When you install Template Toolkit, you'll get asked various questions - about features to enable. The defaults are fine, except that it is - recommended you use the high speed XS Stash of the Template Toolkit, - in order to achieve best performance. + XML::Parser is used by the importxml.pl script. You only need it if + you are going to be importing bugs (such as for bug moving). + XML::Parser requires that the expat library is already installed on + your machine. + + CPAN Download Page: http://search.cpan.org/dist/XML-Parser/ + Documentation: http://www.perldoc.com/perl5.6.1/lib/XML/Parser + .html + _________________________________________________________________ + +4.1.3.15. GD::Graph (any) [Optional] + + In addition to GD listed above, the reporting interface of Bugzilla + needs to have the GD::Graph module installed. + + CPAN Download Page: http://search.cpan.org/dist/GDGraph/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/GDGraph.zip + Documentation: http://search.cpan.org/dist/GDGraph/Graph.pm + _________________________________________________________________ + +4.1.3.16. GD::Text::Align (any) [Optional] + + GD::Text::Align, as the name implies, is used to draw aligned strings + of text. It is needed by the reporting interface. + + CPAN Download Page: http://search.cpan.org/dist/GDTextUtil/ + PPM Download Page: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/GDTextUtil.zip + Documentation: http://search.cpan.org/dist/GDTextUtil/Text/Ali + gn.pm + _________________________________________________________________ + +4.1.3.17. MIME::Parser (any) [Optional] + + MIME::Parser is only needed if you want to use the e-mail interface + located in the contrib directory. + + CPAN Download Page: http://search.cpan.org/dist/MIME-tools/ + PPM Download Link: http://ppm.activestate.com/PPMPackages/zips + /6xx-builds-only/MIME-tools.zip + Documentation: http://search.cpan.org/dist/MIME-tools/lib/MIME + /Parser.pm + _________________________________________________________________ + +4.1.3.18. PatchReader (0.9.1) [Optional] + + PatchReader is only needed if you want to use Patch Viewer, a Bugzilla + feature to format patches in a pretty HTML fashion. There are a number + of optional parameters you can configure Patch Viewer with as well, + including cvsroot, cvsroot_get, lxr_root, bonsai_url, lxr_url, and + lxr_root. Patch Viewer also optionally will use cvs, diff and + interdiff utilities if they exist on the system (interdiff can be + found in the patchutils package at + http://cyberelk.net/tim/patchutils/. These programs' locations can be + configured in localconfig. + + CPAN Download Page: http://search.cpan.org/author/JKEISER/Patc + hReader/ + Documentation: http://www.johnkeiser.com/mozilla/Patch_Viewer. + html _________________________________________________________________ -4.1.6. HTTP Server +4.1.4. HTTP Server You have freedom of choice here, pretty much any web server that is capable of running CGI scripts will work. Section 4.4 has more @@ -903,13 +1194,14 @@ Chapter 4. Installation Note - We strongly recommend Apache as the web server to use. The Bugzilla - Guide installation instructions, in general, assume you are using - Apache. If you have got Bugzilla working using another webserver, - please share your experiences with us. + We strongly recommend Apache as the web server to use. The Bugzilla + Guide installation instructions, in general, assume you are using + Apache. If you have got Bugzilla working using another webserver, + please share your experiences with us by filing a bug in Bugzilla + Documentation. _________________________________________________________________ -4.1.7. Bugzilla +4.1.5. Bugzilla You should untar the Bugzilla files into a directory that you're willing to make writable by the default web server user (probably @@ -919,69 +1211,67 @@ Chapter 4. Installation Tip - If you symlink the bugzilla directory into your Apache's HTML - hierarchy, you may receive Forbidden errors unless you add the - "FollowSymLinks" directive to the <Directory> entry for the HTML root - in httpd.conf. + If you symlink the bugzilla directory into your Apache's HTML + hierarchy, you may receive Forbidden errors unless you add the + "FollowSymLinks" directive to the <Directory> entry for the HTML root + in httpd.conf. Once all the files are in a web accessible directory, make that directory writable by your webserver's user. This is a temporary step until you run the post-install checksetup.pl script, which locks down your installation. + + Caution + + The default Bugzilla distribution is not designed to be placed in a + cgi-bin directory (this includes any directory which is configured + using the ScriptAlias directive of Apache). This will probably change + as part of bug 44659. _________________________________________________________________ -4.1.8. Setting Up the MySQL Database +4.1.6. Setting Up the MySQL Database After you've gotten all the software installed and working you're ready to start preparing the database for its life as the back end to a high quality bug tracker. - First, you'll want to fix MySQL permissions to allow access from - Bugzilla. For the purpose of this Installation section, the Bugzilla - username will be "bugs", and will have minimal permissions. - - Begin by giving the MySQL root user a password. MySQL passwords are - limited to 16 characters. - - bash# mysql -u root mysql - mysql> UPDATE user SET Password=PASSWORD('<new_password'>) WHERE - user='root'; - mysql> FLUSH PRIVILEGES; - - From this point on, if you need to access MySQL as the MySQL root - user, you will need to use mysql -u root -p and enter <new_password>. - Remember that MySQL user names have nothing to do with Unix user names - (login names). - - Next, we use an SQL GRANT command to create a "bugs" user, and grant - sufficient permissions for checksetup.pl, which we'll use later, to - work its magic. This also restricts the "bugs" user to operations - within a database called "bugs", and only allows the account to - connect from "localhost". Modify it to reflect your setup if you will - be connecting from another machine or as a different user. + This first thing you'll want to do is make sure you've given the + "root" user a password as suggested in Section 5.6.2. For clarity, + these instructions will assume that your MySQL user for Bugzilla will + be "bugs_user", the database will be called "bugs_db" and the password + for the "bugs_user" user is "bugs_password". You should, of course, + substitute the values you intend to use for your site. - Remember to set <bugs_password> to some unique password. + Note - mysql> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX, - ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY - '<bugs_password>'; + Most people use "bugs" for both the user and database name. + + Next, we use an SQL GRANT command to create a "bugs_user" user, and + grant sufficient permissions for checksetup.pl, which we'll use later, + to work its magic. This also restricts the "bugs_user" user to + operations within a database called "bugs_db", and only allows the + account to connect from "localhost". Modify it to reflect your setup + if you will be connecting from another machine or as a different user. + mysql> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE, + DROP,REFERENCES ON bugs_db.* TO bugs_user@localhost + IDENTIFIED BY 'bugs_password'; mysql> FLUSH PRIVILEGES; Note - If you are using MySQL 4, the bugs user also needs to be granted the - LOCK TABLES and CREATE TEMPORARY TABLES permissions. + If you are using MySQL 4, the bugs user also needs to be granted the + LOCK TABLES and CREATE TEMPORARY TABLES permissions. _________________________________________________________________ -4.1.9. checksetup.pl +4.1.7. checksetup.pl Next, run the magic checksetup.pl script. (Many thanks to Holger Schurig for writing this script!) This script is designed to make sure - your MySQL database and other configuration options are consistent - with the Bugzilla CGI files. It will make sure Bugzilla files and - directories have reasonable permissions, set up the data directory, - and create all the MySQL tables. - + your perl modules are the correct version and your MySQL database and + other configuration options are consistent with the Bugzilla CGI + files. It will make sure Bugzilla files and directories have + reasonable permissions, set up the data directory, and create all the + MySQL tables. bash# ./checksetup.pl The first time you run it, it will create a file called localconfig. @@ -992,9 +1282,10 @@ Chapter 4. Installation The connection settings include: 1. server's host: just use "localhost" if the MySQL server is local - 2. database name: "bugs" if you're following these directions - 3. MySQL username: "bugs" if you're following these directions - 4. Password for the "bugs" MySQL account; (<bugs_password>) above + 2. database name: "bugs_db" if you're following these directions + 3. MySQL username: "bugs_user" if you're following these directions + 4. Password for the "bugs_user" MySQL account; ("bugs_password" + above) Once you are happy with the settings, su to the user your web server runs as, and re-run checksetup.pl. (Note: on some security-conscious @@ -1005,12 +1296,12 @@ Chapter 4. Installation Note - The checksetup.pl script is designed so that you can run it at any - time without causing harm. You should run it after any upgrade to - Bugzilla. + The checksetup.pl script is designed so that you can run it at any + time without causing harm. You should run it after any upgrade to + Bugzilla. _________________________________________________________________ -4.1.10. Configuring Bugzilla +4.1.8. Configuring Bugzilla You should run through the parameters on the Edit Parameters page (link in the footer) and set them all to appropriate values. They key @@ -1066,21 +1357,27 @@ Chapter 4. Installation cd <your-bugzilla-directory> ; ./whineatnews.pl - Tip + Tip - Depending on your system, crontab may have several manpages. The - following command should lead you to the most useful page for this - purpose: - man 5 crontab + Depending on your system, crontab may have several manpages. The + following command should lead you to the most useful page for this + purpose: + + man 5 crontab _________________________________________________________________ 4.2.4. LDAP Authentication - Warning + Note - This information on using the LDAP authentication options with - Bugzilla is old, and the authors do not know of anyone who has tested - it. Approach with caution. + LDAP authentication has been rewritten for the 2.18 release of + Bugzilla. It no longer requires the Mozilla::LDAP module and now uses + Net::LDAP instead. This rewrite was part of a larger landing that + allowed for additional authentication schemes to be easily added (bug + 180642). + + This patch originally landed in 21-Mar-2003 and was included in the + 2.17.4 development release. The existing authentication scheme for Bugzilla uses email addresses as the primary user ID, and a password to authenticate that user. All @@ -1098,44 +1395,61 @@ Chapter 4. Installation tasks are still handled by email address, not LDAP username. You still assign bugs by email address, query on users by email address, etc. - Using LDAP for Bugzilla authentication requires the Mozilla::LDAP (aka - PerLDAP) Perl module. The Mozilla::LDAP module in turn requires - Netscape's Directory SDK for C. After you have installed the SDK, then - install the PerLDAP module. Mozilla::LDAP and the Directory SDK for C - are both available for download from mozilla.org. - - Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP - directory for authentication. Be very careful when setting up this - parameter; if you set LDAP authentication, but do not have a valid - LDAP directory set up, you will not be able to log back in to Bugzilla - once you log out. (If this happens, you can get back in by manually - editing the data/params file, and setting useLDAP back to 0.) - - If using LDAP, you must set the three additional parameters: Set - LDAPserver to the name (and optionally port) of your LDAP server. If - no port is specified, it defaults to the default port of 389. (e.g - "ldap.mycompany.com" or "ldap.mycompany.com:1234") Set LDAPBaseDN to - the base DN for searching for users in your LDAP directory. (e.g. - "ou=People,o=MyCompany") uids must be unique under the DN specified - here. Set LDAPmailattribute to the name of the attribute in your LDAP - directory which contains the primary email address. On most directory - servers available, this is "mail", but you may need to change this. - - You can also try using OpenLDAP with Bugzilla, using any of a number - of administration tools. You should apply the patch attached this bug: - http://bugzilla.mozilla.org/show_bug.cgi?id=158630, then set the - following object classes for your users: - - 1. objectClass: person - 2. objectClass: organizationalPerson - 3. objectClass: inetOrgPerson - 4. objectClass: top - 5. objectClass: posixAccount - 6. objectClass: shadowAccount - - Please note that this patch has not yet been accepted by the Bugzilla - team, and so you may need to do some manual tweaking. That said, it - looks like Net::LDAP is probably the way to go in the future. + Caution + + Because the Bugzilla account is not created until the first time a + user logs in, a user who has not yet logged is unknown to Bugzilla. + This means they cannot be used as an assignee or QA contact (default + or otherwise), added to any cc list, or any other such operation. One + possible workaround is the bugzilla_ldapsync.rb script in the contrib + directory. Another possible solution is fixing bug 201069. + + Parameters required to use LDAP Authentication: + + loginmethod + This parameter should be set to "LDAP" only if you will be + using an LDAP directory for authentication. If you set this + param to "LDAP" but fail to set up the other parameters listed + below you will not be able to log back in to Bugzilla one you + log out. If this happens to you, you will need to manually edit + data/params and set loginmethod to "DB". + + LDAPserver + This parameter should be set to the name (and optionally the + port) of your LDAP server. If no port is specified, it assumes + the default LDAP port of 389. + + Ex. "ldap.company.com" or "ldap.company.com:3268" + + LDAPbinddn [Optional] + Some LDAP servers will not allow an anonymous bind to search + the directory. If this is the case with your configuration you + should set the LDAPbinddn parameter to the user account + Bugzilla should use instead of the anonymous bind. + + Ex. "cn=default,cn=user:password" + + LDAPBaseDN + The LDAPBaseDN parameter should be set to the location in your + LDAP tree that you would like to search for e-mail addresses. + Your uids should be unique under the DN specified here. + + Ex. "ou=People,o=Company" + + LDAPuidattribute + The LDAPuidattribute parameter should be set to the attribute + which contains the unique UID of your users. The value + retrieved from this attribute will be used when attempting to + bind as the user to confirm their password. + + Ex. "uid" + + LDAPmailattribute + The LDAPmailattribute parameter should be the name of the + attribute which contains the e-mail address your users will + enter into the Bugzilla login boxes. + + Ex. "mail" _________________________________________________________________ 4.2.5. Preventing untrusted Bugzilla content from executing malicious @@ -1145,29 +1459,28 @@ Javascript code Due to internationalization concerns, we are unable to incorporate the code changes necessary to fulfill the CERT advisory requirements mentioned in - http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3. - Executing the following code snippet from a UNIX command shell will - rectify the problem if your Bugzilla installation is intended for an - English-speaking audience. As always, be sure your Bugzilla - installation has a good backup before making changes, and I recommend - you understand what the script is doing before executing it. - -bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; char -set=ISO-8859-1/i" *.cgi *.pl - - All this one-liner command does is search for all instances of - "Content-type: text/html" and replaces it with "Content-Type: - text/html; charset=ISO-8859-1" . This specification prevents possible - Javascript attacks on the browser, and is suggested for all - English-speaking sites. For non-English-speaking Bugzilla sites, I - suggest changing "ISO-8859-1", above, to "UTF-8". + http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3. + Making the change below will fix the problem if your installation is + for an English speaking audience. + + Telling Bugzilla to output a charset as part of the HTTP header is + much easier in version 2.18 and higher (including any cvs pull after + 4-May-2003 and development release after 2.17.5) than it was in + previous versions. Simply locate the following line in + Bugzilla/CGI.pm: + # Make sure that we don't send any charset headers + $self->charset(''); + + and change it to: + # Send all data using the ISO-8859-1 charset + $self->charset('ISO-8859-1'); Note - Using <meta> tags to set the charset is not recommended, as there's a - bug in Netscape 4.x which causes pages marked up in this way to load - twice. See bug 126266 for more information including progress toward - making bugzilla charset aware by default. + Using <meta> tags to set the charset is not recommended, as there's a + bug in Netscape 4.x which causes pages marked up in this way to load + twice. See bug 126266 for more information including progress toward + making bugzilla charset aware by default. _________________________________________________________________ 4.2.6. directoryindex for the Bugzilla default page. @@ -1191,11 +1504,11 @@ set=ISO-8859-1/i" *.cgi *.pl speeds for other users. If your Bugzilla installation is experiencing this problem , you may install the Apache module mod_throttle which can limit connections by ip-address. You may download this module at - http://www.snert.com/Software/Throttle/. Follow the instructions to - install into your Apache install. This module only functions with the - Apache web server! You may use the ThrottleClientIP command provided - by this module to accomplish this goal. See the Module Instructions - for more information. + http://www.snert.com/Software/mod_throttle/. Follow the instructions + to install into your Apache install. This module only functions with + the Apache web server! You may use the ThrottleClientIP command + provided by this module to accomplish this goal. See the Module + Instructions for more information. _________________________________________________________________ 4.3. OS Specific Installation Notes @@ -1237,19 +1550,19 @@ set=ISO-8859-1/i" *.cgi *.pl 4.3.1.2. Perl Modules on Win32 Bugzilla on Windows requires the same perl modules found in Section - 4.1.2. The main difference is that windows uses ppm instead of CPAN. -C:\perl> ppm <module name> + 4.1.3. The main difference is that windows uses PPM instead of CPAN. + C:\perl> ppm <module name> Note - The above syntax should work for all modules with the exception of - Template Toolkit. The Template Toolkit website suggests using the - instructions on OpenInteract's website. + The above syntax should work for all modules with the exception of + Template Toolkit. The Template Toolkit website suggests using the + instructions on OpenInteract's website. Tip - A complete list of modules that can be installed using ppm can be - found at http://www.activestate.com/PPMPackages/5.6plus. + A complete list of modules that can be installed using ppm can be + found at http://www.activestate.com/PPMPackages/5.6plus. _________________________________________________________________ 4.3.1.3. Code changes required to run on win32 @@ -1265,16 +1578,47 @@ C:\perl> ppm <module name> 4.3.1.3.1. Changes to checksetup.pl In checksetup.pl, the line reading: -my $mysql_binaries = `which mysql`; + my $mysql_binaries = `which mysql`; to -my $mysql_binaries = "D:\\mysql\\bin\\mysql"; + my $mysql_binaries = "D:\\mysql\\bin\\mysql"; And you'll also need to change: -my $webservergid = getgrnam($my_webservergroup) + my $webservergid = getgrnam($my_webservergroup) + + to + my $webservergid = '8' + _________________________________________________________________ + +4.3.1.3.2. Changes to BugMail.pm + + To make bug e-mail work on Win32 (until bug 84876 lands), the simplest + way is to have Net::SMTP installed and change this (in + Bugzilla/BugMail.pm): + open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i") || + die "Can't open sendmail"; + + print SENDMAIL trim($msg) . "\n"; + close SENDMAIL; to -my $webservergid = '8' + use Net::SMTP; + my $smtp_server = 'smtp.mycompany.com'; # change this + + # Use die on error, so that the mail will be in the 'unsent mails' and + # can be sent from the sanity check page. + my $smtp = Net::SMTP->new($smtp_server) || + die 'Cannot connect to server \'$smtp_server\''; + + $smtp->mail('bugzilla-daemon@mycompany.com'); # change this + $smtp->to($person); + $smtp->data(); + $smtp->datasend($msg); + $smtp->dataend(); + $smtp->quit; + + Don't forget to change the name of your SMTP server and the domain of + the sending e-mail address (after the '@') in the above lines of code. _________________________________________________________________ 4.3.1.4. Serving the web pages @@ -1287,10 +1631,10 @@ my $webservergid = '8' Note - If using Apache on windows, you can set the ScriptInterpreterSource - directive in your Apache config, if you don't do this, you'll have to - modify the first line of every script to contain your path to perl - instead of /usr/bin/perl. + If using Apache on windows, you can set the ScriptInterpreterSource + directive in your Apache config, if you don't do this, you'll have to + modify the first line of every script to contain your path to perl + instead of /usr/bin/perl. _________________________________________________________________ 4.3.2. Mac OS X @@ -1305,33 +1649,39 @@ my $webservergid = '8' http://sourceforge.net/projects/fink/. Follow the instructions for setting up Fink. Once it's installed, - you'll want to run the following as root: fink install gd + you'll want to use it to install the gd2 package. It will prompt you for a number of dependencies, type 'y' and hit - enter to install all of the dependencies. Then watch it work. + enter to install all of the dependencies and then watch it work. You + will then be able to use CPAN to install the GD perl module. - To prevent creating conflicts with the software that Apple installs by - default, Fink creates its own directory tree at /sw where it installs - most of the software that it installs. This means your libraries and - headers for libgd will be at /sw/lib and /sw/include instead of - /usr/lib and /usr/local/include. Because of these changed locations - for the libraries, the Perl GD module will not install directly via - CPAN, because it looks for the specific paths instead of getting them - from your environment. But there's a way around that :-) - - Instead of typing "install GD" at the cpan> prompt, type look GD. This - should go through the motions of downloading the latest version of the - GD module, then it will open a shell and drop you into the build - directory. Apply this patch to the Makefile.PL file (save the patch - into a file and use the command patch < patchfile.) - - Then, run these commands to finish the installation of the GD module: + Note - perl Makefile.PL - make - make test - make install - And don't forget to run exit to get back to CPAN. + To prevent creating conflicts with the software that Apple installs by + default, Fink creates its own directory tree at /sw where it installs + most of the software that it installs. This means your libraries and + headers be at /sw/lib and /sw/include instead of /usr/lib and + /usr/local/include. When the Perl module config script asks where your + libgd is, be sure to tell it /sw/lib. + + Also available via Fink is expat. Once running using fink to install + the expat package you will be able to install XML::Parser using CPAN. + There is one caveat. Unlike recent versions of the GD module, + XML::Parser doesn't prompt for the location of the required libraries. + When using CPAN, you will need to use the following command sequence: + # perl -MCPAN -e'look XML::Parser' (1) + # perl Makefile.PL EXPATLIBPATH=/sw/lib EXPATINCPATH=/sw/include + # make; make test; make install (2) + # exit (3) + + (1) (3) + The look command will download the module and spawn a new shell + with the extracted files as the current working directory. The + exit command will return you to your original shell. + (2) + You should watch the output from these make commands, + especially "make test" as errors may prevent XML::Parser from + functioning correctly with Bugzilla. _________________________________________________________________ 4.3.3. Linux-Mandrake 8.0 @@ -1341,13 +1691,13 @@ my $webservergid = '8' utility. If you follow these commands, you should have everything you need for Bugzilla, and ./checksetup.pl should not complain about any missing libraries. You may already have some of these installed. -bash# urpmi perl-mysql -bash# urpmi perl-chart -bash# urpmi perl-gd -bash# urpmi perl-MailTools (1) -bash# urpmi apache-modules + bash# urpmi perl-mysql + bash# urpmi perl-chart + bash# urpmi perl-gd + bash# urpmi perl-MailTools (1) + bash# urpmi apache-modules - (1) + (1) for Bugzilla e-mail integration _________________________________________________________________ @@ -1369,7 +1719,7 @@ bash# urpmi apache-modules Bugzilla. You will have to make sure that Apache is properly configured to run the Bugzilla CGI scripts. You also need to make sure that the .htaccess files created by ./checksetup.pl (shown in Example - 4-1 for the curious) are allowed to override Apache's normal access + 4-2 for the curious) are allowed to override Apache's normal access permissions or else important password information may be exposed to the Internet. @@ -1382,39 +1732,39 @@ bash# urpmi apache-modules To allow files with a .cgi extension to be run, make sure the following line exists and is uncommented: -AddHandler cgi-script .cgi + AddHandler cgi-script .cgi To allow .htaccess files to override permissions and .cgi files to run in the Bugzilla directory, make sure the following two lines are in a Directory directive that applies to the Bugzilla directory on your system (either the Bugzilla directory or one of its parents). -Options +ExecCGI -AllowOverride Limit + Options +ExecCGI + AllowOverride Limit Note - For more information on Apache and its directives, see the glossary - entry on Apache. + For more information on Apache and its directives, see the glossary + entry on Apache. - Example 4-1. .htaccess files for Apache + Example 4-2. .htaccess files for Apache $BUGZILLA_HOME/.htaccess -# don't allow people to retrieve non-cgi executable files or our private data -<FilesMatch ^(.*\.pl|.*localconfig.*|runtests.sh)$> - deny from all -</FilesMatch> -<FilesMatch ^(localconfig.js|localconfig.rdf)$> - allow from all -</FilesMatch> + # don't allow people to retrieve non-cgi executable files or our private data + <FilesMatch ^(.*\.pl|.*localconfig.*|runtests.sh)$> + deny from all + </FilesMatch> + <FilesMatch ^(localconfig.js|localconfig.rdf)$> + allow from all + </FilesMatch> $BUGZILLA_HOME/data/.htaccess -# nothing in this directory is retrievable unless overriden by an .htaccess -# in a subdirectory; the only exception is duplicates.rdf, which is used by -# duplicates.xul and must be loadable over the web -deny from all -<Files duplicates.rdf> - allow from all -</Files> + # nothing in this directory is retrievable unless overriden by an .htaccess + # in a subdirectory; the only exception is duplicates.rdf, which is used by + # duplicates.xul and must be loadable over the web + deny from all + <Files duplicates.rdf> + allow from all + </Files> $BUGZILLA_HOME/data/webdot # Restrict access to .dot files to the public webdot server at research.att.com @@ -1436,14 +1786,14 @@ deny from all Deny from all $BUGZILLA_HOME/Bugzilla/.htaccess -# nothing in this directory is retrievable unless overriden by an .htaccess -# in a subdirectory -deny from all + # nothing in this directory is retrievable unless overriden by an .htaccess + # in a subdirectory + deny from all $BUGZILLA_HOME/template/.htaccess -# nothing in this directory is retrievable unless overriden by an .htaccess -# in a subdirectory -deny from all + # nothing in this directory is retrievable unless overriden by an .htaccess + # in a subdirectory + deny from all _________________________________________________________________ 4.4.2. Microsoft Internet Information Services @@ -1473,36 +1823,36 @@ deny from all aolserver/modules/tcl/filter.tcl file (the filename shouldn't matter) with the following contents (change /bugzilla/ to the web-based path to your Bugzilla installation): -ns_register_filter preauth GET /bugzilla/localconfig filter_deny -ns_register_filter preauth GET /bugzilla/localconfig~ filter_deny -ns_register_filter preauth GET /bugzilla/\#localconfig\# filter_deny -ns_register_filter preauth GET /bugzilla/*.pl filter_deny -ns_register_filter preauth GET /bugzilla/syncshadowdb filter_deny -ns_register_filter preauth GET /bugzilla/runtests.sh filter_deny -ns_register_filter preauth GET /bugzilla/data/* filter_deny -ns_register_filter preauth GET /bugzilla/template/* filter_deny + ns_register_filter preauth GET /bugzilla/localconfig filter_deny + ns_register_filter preauth GET /bugzilla/localconfig~ filter_deny + ns_register_filter preauth GET /bugzilla/\#localconfig\# filter_deny + ns_register_filter preauth GET /bugzilla/*.pl filter_deny + ns_register_filter preauth GET /bugzilla/syncshadowdb filter_deny + ns_register_filter preauth GET /bugzilla/runtests.sh filter_deny + ns_register_filter preauth GET /bugzilla/data/* filter_deny + ns_register_filter preauth GET /bugzilla/template/* filter_deny -proc filter_deny { why } { - ns_log Notice "filter_deny" - return "filter_return" -} + proc filter_deny { why } { + ns_log Notice "filter_deny" + return "filter_return" + } - Warning + Warning - This probably doesn't account for all possible editor backup files so - you may wish to add some additional variations of localconfig. For - more information, see bug 186383 or Bugtraq ID 6501. + This probably doesn't account for all possible editor backup files so + you may wish to add some additional variations of localconfig. For + more information, see bug 186383 or Bugtraq ID 6501. Note - If you are using webdot from research.att.com (the default - configuration for the webdotbase paramater), you will need to allow - access to data/webdot/*.dot for the reasearch.att.com machine. + If you are using webdot from research.att.com (the default + configuration for the webdotbase paramater), you will need to allow + access to data/webdot/*.dot for the reasearch.att.com machine. - If you are using a local installation of GraphViz, you will need to - allow everybody to access *.png, *.gif, *.jpg, and *.map in the - data/webdot directory. + If you are using a local installation of GraphViz, you will need to + allow everybody to access *.png, *.gif, *.jpg, and *.map in the + data/webdot directory. _________________________________________________________________ 4.5. Troubleshooting @@ -1535,18 +1885,18 @@ proc filter_deny { why } { To fix this, go to <path-to-perl>/lib/DBD/sponge.pm in your Perl installation and replace - my $numFields; - if ($attribs->{'NUM_OF_FIELDS'}) { - $numFields = $attribs->{'NUM_OF_FIELDS'}; - } elsif ($attribs->{'NAME'}) { - $numFields = @{$attribs->{NAME}}; + my $numFields; + if ($attribs->{'NUM_OF_FIELDS'}) { + $numFields = $attribs->{'NUM_OF_FIELDS'}; + } elsif ($attribs->{'NAME'}) { + $numFields = @{$attribs->{NAME}}; by - my $numFields; - if ($attribs->{'NUM_OF_FIELDS'}) { - $numFields = $attribs->{'NUM_OF_FIELDS'}; - } elsif ($attribs->{'NAMES'}) { - $numFields = @{$attribs->{NAMES}}; + my $numFields; + if ($attribs->{'NUM_OF_FIELDS'}) { + $numFields = $attribs->{'NUM_OF_FIELDS'}; + } elsif ($attribs->{'NAMES'}) { + $numFields = @{$attribs->{NAMES}}; (note the S added to NAME.) _________________________________________________________________ @@ -1567,41 +1917,41 @@ proc filter_deny { why } { This is caused by a bug in the version of File::Temp that is distributed with perl 5.6.0. Many minor variations of this error have - been reported. Examples can be found in Figure 4-1. + been reported. Examples can be found in Figure 4-2. - Figure 4-1. Other File::Temp error messages -Your vendor has not defined Fcntl macro O_NOINHERIT, used -at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 208. + Figure 4-2. Other File::Temp error messages + Your vendor has not defined Fcntl macro O_NOINHERIT, used + at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 208. -Your vendor has not defined Fcntl macro O_EXLOCK, used -at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 210. + Your vendor has not defined Fcntl macro O_EXLOCK, used + at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 210. -Your vendor has not defined Fcntl macro O_TEMPORARY, used -at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 233. + Your vendor has not defined Fcntl macro O_TEMPORARY, used + at /usr/lib/perl5/site_perl/5.6.0/File/Temp.pm line 233. Numerous people have reported that upgrading to version 5.6.1 or higher solved the problem for them. A less involved fix is to apply - the patch in Figure 4-2. The patch is also available as a patch file. - - Figure 4-2. Patch for File::Temp in Perl 5.6.0 ---- File/Temp.pm.orig Thu Feb 6 16:26:00 2003 -+++ File/Temp.pm Thu Feb 6 16:26:23 2003 -@@ -205,6 +205,7 @@ - # eg CGI::Carp - local $SIG{__DIE__} = sub {}; - local $SIG{__WARN__} = sub {}; -+ local *CORE::GLOBAL::die = sub {}; - $bit = &$func(); - 1; - }; -@@ -226,6 +227,7 @@ - # eg CGI::Carp - local $SIG{__DIE__} = sub {}; - local $SIG{__WARN__} = sub {}; -+ local *CORE::GLOBAL::die = sub {}; - $bit = &$func(); - 1; - }; + the patch in Figure 4-3. The patch is also available as a patch file. + + Figure 4-3. Patch for File::Temp in Perl 5.6.0 + --- File/Temp.pm.orig Thu Feb 6 16:26:00 2003 + +++ File/Temp.pm Thu Feb 6 16:26:23 2003 + @@ -205,6 +205,7 @@ + # eg CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + + local *CORE::GLOBAL::die = sub {}; + $bit = &$func(); + 1; + }; + @@ -226,6 +227,7 @@ + # eg CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + + local *CORE::GLOBAL::die = sub {}; + $bit = &$func(); + 1; + }; _________________________________________________________________ Chapter 5. Administering Bugzilla @@ -1697,12 +2047,12 @@ Chapter 5. Administering Bugzilla wise idea to require comments when users resolve, reassign, or reopen bugs at the very least. - Note + Note - It is generally far better to require a developer comment when - resolving bugs than not. Few things are more annoying to bug database - users than having a developer mark a bug "fixed" without any comment - as to what the fix was (or even that it was truly fixed!) + It is generally far better to require a developer comment when + resolving bugs than not. Few things are more annoying to bug database + users than having a developer mark a bug "fixed" without any comment + as to what the fix was (or even that it was truly fixed!) 13. supportwatchers: Turning on this option allows users to ask to receive copies of all a particular other user's bug email. This is, of course, subject to the groupset restrictions on the bug; if @@ -1725,10 +2075,10 @@ Chapter 5. Administering Bugzilla Tip - If you wish to add more administrative users, add them to the "admin" - group and, optionally, add edit the tweakparams, editusers, - creategroups, editcomponents, and editkeywords groups to add the - entire admin group to those groups. + If you wish to add more administrative users, add them to the "admin" + group and, optionally, add edit the tweakparams, editusers, + creategroups, editcomponents, and editkeywords groups to add the + entire admin group to those groups. _________________________________________________________________ 5.2.2. Managing Other Users @@ -1745,15 +2095,15 @@ Chapter 5. Administering Bugzilla 2. Fill out the form presented. This page is self-explanatory. When done, click "Submit". - Note + Note - Adding a user this way will not send an email informing them of their - username and password. While useful for creating dummy accounts - (watchers which shuttle mail to another system, for instance, or email - addresses which are a mailing list), in general it is preferable to - log out and use the "New Account" button to create users, as it will - pre-populate all the required fields and also notify the user of her - account name and password. + Adding a user this way will not send an email informing them of their + username and password. While useful for creating dummy accounts + (watchers which shuttle mail to another system, for instance, or email + addresses which are a mailing list), in general it is preferable to + log out and use the "New Account" button to create users, as it will + pre-populate all the required fields and also notify the user of her + account name and password. _________________________________________________________________ 5.2.2.2. Modifying Users @@ -1789,13 +2139,13 @@ Chapter 5. Administering Bugzilla Warning - Don't disable the administrator account! + Don't disable the administrator account! - Note + Note - The user can still submit bugs via the e-mail gateway, if you set it - up, even if the disabled text field is filled in. The e-mail gateway - should not be enabled for secure installations of Bugzilla. + The user can still submit bugs via the e-mail gateway, if you set it + up, even if the disabled text field is filled in. The e-mail gateway + should not be enabled for secure installations of Bugzilla. * <groupname>: If you have created some groups, e.g. "securitysensitive", then checkboxes will appear here to allow you to add users to, or remove them from, these groups. @@ -1912,8 +2262,8 @@ Chapter 5. Administering Bugzilla Note - Milestone options will only appear for a Product if you turned on the - "usetargetmilestone" Param in the "Edit Parameters" screen. + Milestone options will only appear for a Product if you turned on the + "usetargetmilestone" Param in the "Edit Parameters" screen. To create new Milestones, set Default Milestones, and set Milestone URL: @@ -1929,12 +2279,12 @@ Chapter 5. Administering Bugzilla 4. From the Edit product screen, you can enter the URL of a page which gives information about your milestones and what they mean. - Tip + Tip - If you want your milestone document to be restricted so that it can - only be viewed by people in a particular Bugzilla group, the best way - is to attach the document to a bug in that group, and make the URL the - URL of that attachment. + If you want your milestone document to be restricted so that it can + only be viewed by people in a particular Bugzilla group, the best way + is to attach the document to a bug in that group, and make the URL the + URL of that attachment. _________________________________________________________________ 5.4. Voting @@ -1953,10 +2303,10 @@ Chapter 5. Administering Bugzilla modify 2. Maximum Votes per person: Setting this field to "0" disables voting. - 3. Maximum Votes a person can put on a single bug": It should - probably be some number lower than the "Maximum votes per person". - Don't set this field to "0" if "Maximum votes per person" is - non-zero; that doesn't make any sense. + 3. Maximum Votes a person can put on a single bug: It should probably + be some number lower than the "Maximum votes per person". Don't + set this field to "0" if "Maximum votes per person" is non-zero; + that doesn't make any sense. 4. Number of votes a bug in this product needs to automatically get out of the UNCONFIRMED state: Setting this field to "0" disables the automatic move of bugs from UNCONFIRMED to NEW. @@ -2008,12 +2358,12 @@ Chapter 5. Administering Bugzilla fulfill the Regular Expression into the new group. When you have finished, click "Add". - Warning + Warning - The User Regexp is a perl regexp and, if not anchored, will match any - part of an address. So, if you do not want to grant access into - 'mycompany.com' to 'badperson@mycompany.com.hacker.net', use - '@mycompany\.com$' as the regexp. + The User Regexp is a perl regexp and, if not anchored, will match any + part of an address. So, if you do not want to grant access into + 'mycompany.com' to 'badperson@mycompany.com.hacker.net', use + '@mycompany\.com$' as the regexp. 4. After you add your new group, edit the new group. On the edit page, you can specify other groups that should be included in this group and which groups should be permitted to add and delete users @@ -2031,24 +2381,24 @@ Chapter 5. Administering Bugzilla Warning - Poorly-configured MySQL and Bugzilla installations have given - attackers full access to systems in the past. Please take these - guidelines seriously, even for Bugzilla machines hidden away behind - your firewall. 80% of all computer trespassers are insiders, not - anonymous crackers. + Poorly-configured MySQL and Bugzilla installations have given + attackers full access to systems in the past. Please take these + guidelines seriously, even for Bugzilla machines hidden away behind + your firewall. 80% of all computer trespassers are insiders, not + anonymous crackers. Note - These instructions must, of necessity, be somewhat vague since - Bugzilla runs on so many different platforms. If you have refinements - of these directions, please submit a bug to Bugzilla Documentation. + These instructions must, of necessity, be somewhat vague since + Bugzilla runs on so many different platforms. If you have refinements + of these directions, please submit a bug to Bugzilla Documentation. - Warning + Warning - This is not meant to be a comprehensive list of every possible - security issue regarding the tools mentioned in this section. There is - no subsitute for reading the information written by the authors of any - software running on your system. + This is not meant to be a comprehensive list of every possible + security issue regarding the tools mentioned in this section. There is + no subsitute for reading the information written by the authors of any + software running on your system. _________________________________________________________________ 5.6.1. TCP/IP Ports @@ -2087,9 +2437,9 @@ mysql> FLUSH PRIVILEGES; should consider disabling networking from within MySQL by adding the following to your /etc/my.conf: -[myslqd] -# Prevent network access to MySQL. -skip-networking + [myslqd] + # Prevent network access to MySQL. + skip-networking 4. You may also consider running MySQL, or even all of Bugzilla in a @@ -2109,10 +2459,10 @@ skip-networking Note - You will need to set the webservergroup to the group you created for - your webserver to run as in localconfig. This will allow - ./checksetup.pl to better adjust the file permissions on your Bugzilla - install so as to not require making anything world-writable. + You will need to set the webservergroup to the group you created for + your webserver to run as in localconfig. This will allow + ./checksetup.pl to better adjust the file permissions on your Bugzilla + install so as to not require making anything world-writable. _________________________________________________________________ 5.6.4. Web Server Access Controls @@ -2147,9 +2497,9 @@ skip-networking Tip - Bugzilla ships with the ability to generate .htaccess files - instructing Apache which files should and should not be accessible. - For more information, see Section 4.4.1. + Bugzilla ships with the ability to generate .htaccess files + instructing Apache which files should and should not be accessible. + For more information, see Section 4.4.1. You should test to make sure that the files mentioned above are not accessible from the Internet, especially your localconfig file which @@ -2158,16 +2508,16 @@ skip-networking we'd try to access http://bugzilla.mozilla.org/localconfig. You should get a 403 Forbidden error. - Caution + Caution - Not following the instructions in this section, including testing, may - result in sensitive information being globally accessible. + Not following the instructions in this section, including testing, may + result in sensitive information being globally accessible. Tip - You should check Section 4.4 to see if instructions have been included - for your web server. You should also compare those instructions with - this list to make sure everything is properly accounted for. + You should check Section 4.4 to see if instructions have been included + for your web server. You should also compare those instructions with + this list to make sure everything is properly accounted for. _________________________________________________________________ 5.7. Template Customization @@ -2179,9 +2529,9 @@ skip-networking upgrade to a newer version in the future. Templatization also makes localized versions of Bugzilla possible, for - the first time. In the future, a Bugzilla installation may have - templates installed for multiple localizations, and select which ones - to use based on the user's browser language setting. + the first time. As of version 2.17.4 which will soon become 2.18, it's + possible to have Bugzilla's language determined by the user's browser. + More information is available in Section 5.7.5. _________________________________________________________________ 5.7.1. What to Edit @@ -2226,8 +2576,14 @@ skip-networking Note - Don't directly edit the compiled templates in data/template/* - your - changes will be lost when Template Toolkit recompiles them. + Don't directly edit the compiled templates in data/template/* - your + changes will be lost when Template Toolkit recompiles them. + + Note + + It is recommended that you run ./checksetup.pl after any template + edits, especially if you've created a new file in the custom + directory. _________________________________________________________________ 5.7.2. How To Edit Templates @@ -2263,9 +2619,9 @@ skip-networking Note - If you are making template changes that you intend on submitting back - for inclusion in standard Bugzilla, you should read the relevant - sections of the Developers' Guide. + If you are making template changes that you intend on submitting back + for inclusion in standard Bugzilla, you should read the relevant + sections of the Developers' Guide. _________________________________________________________________ 5.7.3. Template Formats @@ -2372,15 +2728,33 @@ skip-networking would appear in the initial checkin comment. _________________________________________________________________ +5.7.5. Configuring Bugzilla to Detect the User's Language + + Begining in version 2.18 (first introduced in version 2.17.4), it's + now possible to have the users web browser tell Bugzilla which + language templates to use for each visitor (using the HTTP_ACCEPT + header). For this to work, Bugzilla needs to have the correct language + templates installed for the version of Bugzilla you are using. Many + language templates can be obtained from + http://www.bugzilla.org/download.html#localizations. Instructions for + submitting new languages are also available from that location. + + After untarring the localizations (or creating your own) in the + [Bugzilla_Root]/template directory, you must update the languages + parameter to contain any localizations you'd like to permit. You may + also wish to set the defaultlanguage parameter to something other than + "en" if you don't want Engish to be the default language. + _________________________________________________________________ + 5.8. Change Permission Customization - Warning + Warning - This feature should be considered experimental; the Bugzilla code you - will be changing is not stable, and could change or move between - versions. Be aware that if you make modifications to it, you may have - to re-make them or port them if Bugzilla changes internally between - versions. + This feature should be considered experimental; the Bugzilla code you + will be changing is not stable, and could change or move between + versions. Be aware that if you make modifications to it, you may have + to re-make them or port them if Bugzilla changes internally between + versions. Companies often have rules about which employees, or classes of employees, are allowed to change certain things in the bug system. For @@ -2401,10 +2775,10 @@ skip-networking Certain marked sections should not be changed - these are the "plumbing" which makes the rest of the function work. In between those sections, you'll find snippets of code like: - # Allow the owner to change anything. - if ($ownerid eq $whoid) { - return 1; - } + # Allow the owner to change anything. + if ($ownerid eq $whoid) { + return 1; + } It's fairly obvious what this piece of code does. @@ -2421,27 +2795,27 @@ skip-networking $ownerid has been obtained from the database. You can either add a positive check, which returns 1 (allow) if certain conditions are true, or a negative check, which returns 0 (deny.) E.g.: - if ($field eq "qacontact") { - if (UserInGroup("quality_assurance")) { - return 1; - } - else { - return 0; - } - } + if ($field eq "qacontact") { + if (Bugzilla->user->groups("quality_assurance")) { + return 1; + } + else { + return 0; + } + } This says that only users in the group "quality_assurance" can change the QA Contact field of a bug. Getting more weird: - if (($field eq "priority") && - ($vars->{'user'}{'login'} =~ /.*\@example\.com$/)) - { - if ($oldvalue eq "P1") { - return 1; - } - else { - return 0; - } - } + if (($field eq "priority") && + (Bugzilla->user->email =~ /.*\@example\.com$/)) + { + if ($oldvalue eq "P1") { + return 1; + } + else { + return 0; + } + } This says that if the user is trying to change the priority field, and their email address is @example.com, they can only do so if the old @@ -2454,6 +2828,13 @@ skip-networking 5.9. Upgrading to New Releases + Warning + + Upgrading is a one-way process. You should backup your database and + current Bugzilla directory before attempting the upgrade. If you wish + to revert to the old Bugzilla version for any reason, you will have to + restore from these backups. + Upgrading Bugzilla is something we all want to do from time to time, be it to get new features or pick up the latest security fix. How easy it is to update depends on a few factors. @@ -2503,65 +2884,65 @@ skip-networking Tip - If you can do this, updating using CVS is probably the most painless - method, especially if you have a lot of local changes. -bash$ cd /var/www/html/bugzilla -bash$ cvs login -Logging in to :pserver:anonymous@cvs-mirror.mozilla.org:2401/cvsroot -CVS password: anonymous -bash$ cvs -q update -r BUGZILLA-2_16_2 -dP -P checksetup.pl -P collectstats.pl -P globals.pl -P docs/rel_notes.txt -P template/en/default/list/quips.html.tmpl + If you can do this, updating using CVS is probably the most painless + method, especially if you have a lot of local changes. + bash$ cd /var/www/html/bugzilla + bash$ cvs login + Logging in to :pserver:anonymous@cvs-mirror.mozilla.org:2401/cvsroot + CVS password: anonymous + bash$ cvs -q update -r BUGZILLA-2_16_2 -dP + P checksetup.pl + P collectstats.pl + P globals.pl + P docs/rel_notes.txt + P template/en/default/list/quips.html.tmpl Caution - If a line in the output from cvs update begins with a C that - represents a file with local changes that CVS was unable to properly - merge. You need to resolve these conflicts manually before Bugzilla - (or at least the portion using that file) will be usable. + If a line in the output from cvs update begins with a C that + represents a file with local changes that CVS was unable to properly + merge. You need to resolve these conflicts manually before Bugzilla + (or at least the portion using that file) will be usable. Note - You also need to run ./checksetup.pl before your Bugzilla upgrade will - be complete. + You also need to run ./checksetup.pl before your Bugzilla upgrade will + be complete. Example 5-2. Upgrading using the tarball If you are unable or unwilling to use CVS, another option that's always available is to download the latest tarball. This is the most difficult option to use, especially if you have local changes. -bash$ cd /var/www/html -bash$ wget ftp://ftp.mozilla.org/pub/webtools/bugzilla-2.16.2.tar.gz -Output omitted -bash$ tar xzvf bugzilla-2.16.2.tar.gz -bugzilla-2.16.2/ -bugzilla-2.16.2/.cvsignore -bugzilla-2.16.2/1x1.gif -Output truncated -bash$ cd bugzilla-2.16.2 -bash$ cp ../bugzilla/localconfig* . -bash$ cp -r ../bugzilla/data . -bash$ cd .. -bash$ mv bugzilla bugzilla.old -bash$ mv bugzilla-2.16.2 bugzilla -bash$ cd bugzilla -bash$ ./checksetup.pl -Output omitted + bash$ cd /var/www/html + bash$ wget ftp://ftp.mozilla.org/pub/webtools/bugzilla-2.16.2.tar.gz + Output omitted + bash$ tar xzvf bugzilla-2.16.2.tar.gz + bugzilla-2.16.2/ + bugzilla-2.16.2/.cvsignore + bugzilla-2.16.2/1x1.gif + Output truncated + bash$ cd bugzilla-2.16.2 + bash$ cp ../bugzilla/localconfig* . + bash$ cp -r ../bugzilla/data . + bash$ cd .. + bash$ mv bugzilla bugzilla.old + bash$ mv bugzilla-2.16.2 bugzilla + bash$ cd bugzilla + bash$ ./checksetup.pl + Output omitted Warning - The cp commands both end with periods which is a very important - detail, it tells the shell that the destination directory is the - current working directory. Also, the period at the beginning of the - ./checksetup.pl is important and can not be omitted. + The cp commands both end with periods which is a very important + detail, it tells the shell that the destination directory is the + current working directory. Also, the period at the beginning of the + ./checksetup.pl is important and can not be omitted. Note - You will now have to reapply any changes you have made to your local - installation manually. + You will now have to reapply any changes you have made to your local + installation manually. Example 5-3. Upgrading using patches @@ -2587,9 +2968,9 @@ patching file globals.pl Caution - If you do this, beware that this doesn't change the entires in your - CVS directory so it may make updates using CVS (Example 5-1) more - difficult in the future. + If you do this, beware that this doesn't change the entires in your + CVS directory so it may make updates using CVS (Example 5-1) more + difficult in the future. _________________________________________________________________ 5.10. Integrating Bugzilla with Third-Party Tools @@ -2624,7 +3005,7 @@ patching file globals.pl 5.10.3. Perforce SCM You can find the project page for Bugzilla and Teamtrack Perforce - integration (p4dti) at: http://www.ravenbrook.com/project/p4dti . + integration (p4dti) at: http://www.ravenbrook.com/project/p4dti/ . "p4dti" is now an officially supported product from Perforce, and you can find the "Perforce Public Depot" p4dti page at http://public.perforce.com/public/perforce/p4dti/index.html . @@ -2649,206 +3030,209 @@ Appendix A. The Bugzilla FAQ 1. General Questions A.1.1. Where can I find information about Bugzilla? - A.1.2. What license is Bugzilla distributed under? - A.1.3. How do I get commercial support for Bugzilla? + A.1.2. What license is Bugzilla distributed under? + A.1.3. How do I get commercial support for Bugzilla? A.1.4. What major companies or projects are currently using - Bugzilla for bug-tracking? + Bugzilla for bug-tracking? - A.1.5. Who maintains Bugzilla? + A.1.5. Who maintains Bugzilla? A.1.6. How does Bugzilla stack up against other bug-tracking - databases? + databases? A.1.7. Why doesn't Bugzilla offer this or that feature or - compatibility with this other tracking software? + compatibility with this other tracking software? A.1.8. Why MySQL? I'm interested in seeing Bugzilla run on - Oracle/Sybase/Msql/PostgreSQL/MSSQL. + Oracle/Sybase/Msql/PostgreSQL/MSSQL. - A.1.9. What is /usr/bonsaitools/bin/perl? + A.1.9. What is /usr/bonsaitools/bin/perl? A.1.10. My perl is not located at /usr/bin/perl, is there an easy - way to change it everywhere it needs to be changed? + way to change it everywhere it needs to be changed? - A.1.11. Is there an easy way to change the Bugzilla cookie name? + A.1.11. Is there an easy way to change the Bugzilla cookie name? 2. Managerial Questions A.2.1. Is Bugzilla web-based, or do you have to have specific - software or a specific operating system on your machine? + software or a specific operating system on your machine? - A.2.2. Can Bugzilla integrate with Perforce (SCM software)? - A.2.3. Does Bugzilla allow the user to track multiple projects? + A.2.2. Can Bugzilla integrate with Perforce (SCM software)? + A.2.3. Does Bugzilla allow the user to track multiple projects? A.2.4. If I am on many projects, and search for all bugs assigned to me, will Bugzilla list them for me and allow me to - sort by project, severity etc? + sort by project, severity etc? A.2.5. Does Bugzilla allow attachments (text, screenshots, URLs - etc)? If yes, are there any that are NOT allowed? + etc)? If yes, are there any that are NOT allowed? A.2.6. Does Bugzilla allow us to define our own priorities and levels? Do we have complete freedom to change the labels of fields and format of them, and the choice of - acceptable values? + acceptable values? A.2.7. Does Bugzilla provide any reporting features, metrics, graphs, etc? You know, the type of stuff that management - likes to see. :) + likes to see. :) A.2.8. Is there email notification and if so, what do you see - when you get an email? + when you get an email? A.2.9. Can email notification be set up to send to multiple - people, some on the To List, CC List, BCC List etc? + people, some on the To List, CC List, BCC List etc? A.2.10. Do users have to have any particular type of email - application? + application? A.2.11. Does Bugzilla allow data to be imported and exported? If I had outsiders write up a bug report using a MS Word bug template, could that template be imported into "matching" fields? If I wanted to take the results of a query and - export that data to MS Excel, could I do that? + export that data to MS Excel, could I do that? A.2.12. Has anyone converted Bugzilla to another language to be - used in other countries? Is it localizable? + used in other countries? Is it localizable? A.2.13. Can a user create and save reports? Can they do this in - Word format? Excel format? + Word format? Excel format? A.2.14. Does Bugzilla have the ability to search by word, phrase, - compound search? + compound search? A.2.15. Does Bugzilla provide record locking when there is simultaneous access to the same bug? Does the second person get a notice that the bug is in use or how are - they notified? + they notified? - A.2.16. Are there any backup features provided? + A.2.16. Are there any backup features provided? A.2.17. Can users be on the system while a backup is in progress? - + A.2.18. What type of human resources are needed to be on staff to install and maintain Bugzilla? Specifically, what type of skills does the person need to have? I need to find out if we were to go with Bugzilla, what types of individuals would we need to hire and how much would that cost vs - buying an "Out-of-the-Box" solution. + buying an "Out-of-the-Box" solution. A.2.19. What time frame are we looking at if we decide to hire people to install and maintain the Bugzilla? Is this something that takes hours or weeks to install and a couple of hours per week to maintain and customize or is this a multi-week install process, plus a full time job - for 1 person, 2 people, etc? + for 1 person, 2 people, etc? A.2.20. Is there any licensing fee or other fees for using Bugzilla? Any out-of-pocket cost other than the bodies - needed as identified above? + needed as identified above? 3. Bugzilla Security A.3.1. How do I completely disable MySQL security if it's giving me problems (I've followed the instructions in the - installation section of this guide)? + installation section of this guide)? - A.3.2. Are there any security problems with Bugzilla? + A.3.2. Are there any security problems with Bugzilla? A.3.3. I've implemented the security fixes mentioned in Chris Yeh's security advisory of 5/10/2000 advising not to run MySQL as root, and am running into problems with MySQL no - longer working correctly. + longer working correctly. 4. Bugzilla Email A.4.1. I have a user who doesn't want to receive any more email - from Bugzilla. How do I stop it entirely for this user? + from Bugzilla. How do I stop it entirely for this user? A.4.2. I'm evaluating/testing Bugzilla, and don't want it to send - email to anyone but me. How do I do it? + email to anyone but me. How do I do it? A.4.3. I want whineatnews.pl to whine at something more, or other - than, only new bugs. How do I do it? + than, only new bugs. How do I do it? A.4.4. I don't like/want to use Procmail to hand mail off to - bug_email.pl. What alternatives do I have? + bug_email.pl. What alternatives do I have? A.4.5. How do I set up the email interface to submit/change bugs - via email? + via email? A.4.6. Email takes FOREVER to reach me from Bugzilla -- it's - extremely slow. What gives? + extremely slow. What gives? - A.4.7. How come email from Bugzilla changes never reaches me? + A.4.7. How come email from Bugzilla changes never reaches me? 5. Bugzilla Database - A.5.1. I've heard Bugzilla can be used with Oracle? + A.5.1. I've heard Bugzilla can be used with Oracle? A.5.2. I think my database might be corrupted, or contain invalid - entries. What do I do? + entries. What do I do? - A.5.3. I want to manually edit some entries in my database. How? + A.5.3. I want to manually edit some entries in my database. How? A.5.4. I think I've set up MySQL permissions correctly, but - Bugzilla still can't connect. + Bugzilla still can't connect. A.5.5. How do I synchronize bug information among multiple - different Bugzilla databases? + different Bugzilla databases? 6. Bugzilla and Win32 A.6.1. What is the easiest way to run Bugzilla on Win32 - (Win98+/NT/2K)? + (Win98+/NT/2K)? - A.6.2. Is there a "Bundle::Bugzilla" equivalent for Win32? + A.6.2. Is there a "Bundle::Bugzilla" equivalent for Win32? A.6.3. CGI's are failing with a "something.cgi is not a valid - Windows NT application" error. Why? + Windows NT application" error. Why? A.6.4. I'm having trouble with the perl modules for NT not being - able to talk to to the database. + able to talk to to the database. 7. Bugzilla Usage - A.7.1. How do I change my user name (email address) in Bugzilla? + A.7.1. How do I change my user name (email address) in Bugzilla? A.7.2. The query page is very confusing. Isn't there a simpler - way to query? + way to query? A.7.3. I'm confused by the behavior of the "accept" button in the Show Bug form. Why doesn't it assign the bug to me when I - accept it? + accept it? A.7.4. I can't upload anything into the database via the "Create - Attachment" link. What am I doing wrong? + Attachment" link. What am I doing wrong? A.7.5. How do I change a keyword in Bugzilla, once some bugs are - using it? + using it? + + A.7.6. Why can't I close bugs from the "Change Several Bugs at + Once" page? 8. Bugzilla Hacking - A.8.1. What kind of style should I use for templatization? - A.8.2. What bugs are in Bugzilla right now? + A.8.1. What kind of style should I use for templatization? + A.8.2. What bugs are in Bugzilla right now? A.8.3. How can I change the default priority to a null value? For instance, have the default priority be "---" instead of - "P2"? + "P2"? A.8.4. What's the best way to submit patches? What guidelines - should I follow? + should I follow? 1. General Questions A.1.1. Where can I find information about Bugzilla? You can stay up-to-date with the latest Bugzilla information at - http://www.bugzilla.org/ + http://www.bugzilla.org/. A.1.2. What license is Bugzilla distributed under? Bugzilla is covered by the Mozilla Public License. See details at - http://www.mozilla.org/MPL/ + http://www.mozilla.org/MPL/. A.1.3. How do I get commercial support for Bugzilla? http://bugzilla.org/consulting.html is a list of people and companies who have asked us to list them as consultants for Bugzilla. - www.collab.net offers Bugzilla as part of their standard offering to - large projects. They do have some minimum fees that are pretty hefty, - and generally aren't interested in small projects. + http://www.collab.net/ offers Bugzilla as part of their standard + offering to large projects. They do have some minimum fees that are + pretty hefty, and generally aren't interested in small projects. There are several experienced Bugzilla hackers on the mailing list/newsgroup who are willing to make themselves available for @@ -2859,31 +3243,16 @@ Appendix A. The Bugzilla FAQ for bug-tracking? There are dozens of major companies with public Bugzilla sites to - track bugs in their products. A few include: - - Netscape/AOL - Mozilla.org - NASA - Red Hat Software - SuSe Corp - The Horde Project - AbiSource - Real Time Enterprises, Inc - Eggheads.org - Strata Software - RockLinux - Creative Labs (makers of SoundBlaster) - The Apache Foundation - The Gnome Foundation - Ximian - Linux-Mandrake - - Suffice to say, there are more than enough huge projects using - Bugzilla that we can safely say it's extremely popular. + track bugs in their products. We have a fairly complete list available + on our website at http://bugzilla.org/installation_list.html. If you + have an installation of Bugzilla and would like to be added to the + list, whether it's a public install or not, simply e-mail Gerv + <gerv@mozilla.org>. Keep in mind that it's kinda difficult to get onto + the "high-profile" list ;). A.1.5. Who maintains Bugzilla? - A core team, led by Dave Miller (justdave@netscape.com). + A core team, led by Dave Miller (justdave@bugzilla.org). A.1.6. How does Bugzilla stack up against other bug-tracking databases? @@ -2924,7 +3293,8 @@ Appendix A. The Bugzilla FAQ There is currently work in progress to make Bugzilla work on PostgreSQL and Sybase in the default distribution. You can track the - progress of these initiatives in bugs 98304 and 173130 respectively. + progress of these initiatives in bug 98304 and bug 173130 + respectively. Once both of these are done, adding support for additional database servers should be trivial. @@ -2947,7 +3317,7 @@ Appendix A. The Bugzilla FAQ Yes, the following bit of perl magic will change all the shebang lines. Be sure to change /usr/local/bin/perl to your path to the perl binary. -perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl + perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl A.1.11. Is there an easy way to change the Bugzilla cookie name? @@ -2957,7 +3327,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl Note - Questions likely to be asked by managers. :-) + Questions likely to be asked by managers. :-) A.2.1. Is Bugzilla web-based, or do you have to have specific software or a specific operating system on your machine? @@ -2999,8 +3369,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl compensate for the change. There is no GUI for adding fields to Bugzilla at this time. You can - follow development of this feature at - http://bugzilla.mozilla.org/show_bug.cgi?id=91037 + follow development of this feature in bug 91037 A.2.7. Does Bugzilla provide any reporting features, metrics, graphs, etc? You know, the type of stuff that management likes to see. :) @@ -3035,12 +3404,12 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl Note - If you decide to use the bugzilla_email integration features to allow - Bugzilla to record responses to mail with the associated bug, you may - need to caution your users to set their mailer to "respond to messages - in the format in which they were sent". For security reasons Bugzilla - ignores HTML tags in comments, and if a user sends HTML-based email - into Bugzilla the resulting comment looks downright awful. + If you decide to use the bugzilla_email integration features to allow + Bugzilla to record responses to mail with the associated bug, you may + need to caution your users to set their mailer to "respond to messages + in the format in which they were sent". For security reasons Bugzilla + ignores HTML tags in comments, and if a user sends HTML-based email + into Bugzilla the resulting comment looks downright awful. A.2.11. Does Bugzilla allow data to be imported and exported? If I had outsiders write up a bug report using a MS Word bug template, could @@ -3099,7 +3468,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl MySQL, the database back-end for Bugzilla, allows hot-backup of data. You can find strategies for dealing with backup considerations at - http://www.mysql.com/doc/B/a/Backup.html + http://www.mysql.com/doc/B/a/Backup.html. A.2.17. Can users be on the system while a backup is in progress? @@ -3184,10 +3553,8 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl than, only new bugs. How do I do it? Try Klaas Freitag's excellent patch for "whineatassigned" - functionality. You can find it at - http://bugzilla.mozilla.org/show_bug.cgi?id=6679. This patch is - against an older version of Bugzilla, so you must apply the diffs - manually. + functionality. You can find it in bug 6679. This patch is against an + older version of Bugzilla, so you must apply the diffs manually. A.4.4. I don't like/want to use Procmail to hand mail off to bug_email.pl. What alternatives do I have? @@ -3274,9 +3641,9 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl Warning - Running MySQL with this command line option is very insecure and - should only be done when not connected to the external network as a - troubleshooting step. + Running MySQL with this command line option is very insecure and + should only be done when not connected to the external network as a + troubleshooting step. A.5.5. How do I synchronize bug information among multiple different Bugzilla databases? @@ -3342,7 +3709,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl I reckon TimeDate and Data::Dumper come with the activeperl. You can check the ActiveState site for packages for installation through PPM. - http://www.activestate.com/Packages/ + http://www.activestate.com/Packages/. 7. Bugzilla Usage @@ -3385,24 +3752,38 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl replace the old keyword name with a new one. This will cause a problem with the keyword cache. Run sanitycheck.cgi to fix it. + A.7.6. Why can't I close bugs from the "Change Several Bugs at Once" + page? + + The logic flow currently used is RESOLVED, then VERIFIED, then CLOSED. + You can mass-CLOSE bugs from the change several bugs at once page. + but, every bug listed on the page has to be in VERIFIED state before + the control to do it will show up on the form. You can also + mass-VERIFY, but every bug listed has to be RESOLVED in order for the + control to show up on the form. The logic behind this is that if you + pick one of the bugs that's not VERIFIED and try to CLOSE it, the bug + change will fail miserably (thus killing any changes in the list after + it while doing the bulk change) so it doesn't even give you the + choice. + 8. Bugzilla Hacking A.8.1. What kind of style should I use for templatization? Gerv and Myk suggest a 2-space indent, with embedded code sections on their own line, in line with outer tags. Like this: -<fred> -[% IF foo %] - <bar> - [% FOREACH x = barney %] - <tr> - <td> - [% x %] - </td> - <tr> - [% END %] -[% END %] -</fred> + <fred> + [% IF foo %] + <bar> + [% FOREACH x = barney %] + <tr> + <td> + [% x %] + </td> + <tr> + [% END %] + [% END %] + </fred> Myk also recommends you turn on PRE_CHOMP in the template initialization to prevent bloating of HTML with unnecessary @@ -3426,10 +3807,9 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl A.8.3. How can I change the default priority to a null value? For instance, have the default priority be "---" instead of "P2"? - This is well-documented here: - http://bugzilla.mozilla.org/show_bug.cgi?id=49862. Ultimately, it's as - easy as adding the "---" priority field to your localconfig file in - the appropriate area, re-running checksetup.pl, and then changing the + This is well-documented in bug 49862. Ultimately, it's as easy as + adding the "---" priority field to your localconfig file in the + appropriate area, re-running checksetup.pl, and then changing the default priority in your browser using "editparams.cgi". A.8.4. What's the best way to submit patches? What guidelines should I @@ -3460,9 +3840,9 @@ Appendix B. The Bugzilla Database Note - This document really needs to be updated with more fleshed out - information about primary keys, interrelationships, and maybe some - nifty tables to document dependencies. Any takers? + This document really needs to be updated with more fleshed out + information about primary keys, interrelationships, and maybe some + nifty tables to document dependencies. Any takers? _________________________________________________________________ B.1. Modifying Your Running System @@ -3516,7 +3896,7 @@ B.2. MySQL Bugzilla Database Introduction But Certain Death speaks up -- a tiny voice, from the dark corners of the conference room. "I have a concern," the voice hisses from the - darkness, "about the use of the word 'verified'. + darkness, "about the use of the word 'verified'." The room, previously filled with happy chatter, lapses into reverential silence as Certain Death (better known as the Vice @@ -3546,9 +3926,8 @@ B.2.1. Bugzilla Database Basics internals of MySQL, and if it weren't for this executive order from the Vice President you couldn't care less about the difference between a "bigint" and a "tinyint" entry in MySQL. I recommend you refer to - the MySQL documentation, available at MySQL.com . Below are the basics - you need to know about the Bugzilla database. Check the chart above - for more details. + the MySQL documentation . Below are the basics you need to know about + the Bugzilla database. Check the chart above for more details. 1. To connect to your database: bash# mysql -u root @@ -3577,42 +3956,42 @@ B.2.1.1. Bugzilla Database Tables From the command issued above, ou should have some output that looks like this: -+-------------------+ -| Tables in bugs | -+-------------------+ -| attachments | -| bugs | -| bugs_activity | -| cc | -| components | -| dependencies | -| fielddefs | -| groups | -| keyworddefs | -| keywords | -| logincookies | -| longdescs | -| milestones | -| namedqueries | -| products | -| profiles | -| profiles_activity | -| tokens | -| versions | -| votes | -| watch | -+-------------------+ - - Here's an overview of what each table does. Most columns in each ta - ble have + +-------------------+ + | Tables in bugs | + +-------------------+ + | attachments | + | bugs | + | bugs_activity | + | cc | + | components | + | dependencies | + | fielddefs | + | groups | + | keyworddefs | + | keywords | + | logincookies | + | longdescs | + | milestones | + | namedqueries | + | products | + | profiles | + | profiles_activity | + | tokens | + | versions | + | votes | + | watch | + +-------------------+ + + Here's an overview of what each table does. Most columns in each tab + le have descriptive names that make it fairly trivial to figure out their jobs . - attachments: This table stores all attachments to bugs. It tends to b - e your + attachments: This table stores all attachments to bugs. It tends to be + your largest table, yet also generally has the fewest entries because file attachments are so (relatively) large. - bugs: This is the core of your system. The bugs table stores most of - the + bugs: This is the core of your system. The bugs table stores most of + the current information about a bug, with the exception of the info stored in the other tables. @@ -3621,33 +4000,33 @@ B.2.1.1. Bugzilla Database Tables when -- a history file. cc: This tiny table simply stores all the CC information for any bug which has - any entries in the CC field of the bug. Note that, like most other ta - bles in + any entries in the CC field of the bug. Note that, like most other tab + les in Bugzilla, it does not refer to users by their user names, but by their unique userid, stored as a primary key in the profiles table. components: This stores the programs and components (or products and - components, in newer Bugzilla parlance) for Bugzilla. Curiously, the - "program" + components, in newer Bugzilla parlance) for Bugzilla. Curiously, the " + program" (product) field is the full name of the product, rather than some othe r unique identifier, like bug_id and user_id are elsewhere in the database. dependencies: Stores data about those cool dependency trees. - fielddefs: A nifty table that defines other tables. For instance, wh - en you + fielddefs: A nifty table that defines other tables. For instance, whe + n you submit a form that changes the value of "AssignedTo" this table allows translation to the actual field name "assigned_to" for entry into MySQ L. - groups: defines bitmasks for groups. A bitmask is a number that can - uniquely - identify group memberships. For instance, say the group that is allow - ed to + groups: defines bitmasks for groups. A bitmask is a number that can u + niquely + identify group memberships. For instance, say the group that is allowe + d to tweak parameters is assigned a value of "1", the group that is allowed to edit users is assigned a "2", and the group that is allowed to create new g roups is - assigned the bitmask of "4". By uniquely combining the group bitmasks - (much + assigned the bitmask of "4". By uniquely combining the group bitmasks + (much like the chmod command in UNIX,) you can identify a user is allowed to tweak parameters and create groups, but not edit users, by giving him a bitm @@ -3662,10 +4041,10 @@ B.2.1.1. Bugzilla Database Tables associated with which bug id's. logincookies: This stores every login cookie ever assigned to you for every - machine you've ever logged into Bugzilla from. Curiously, it never do - es any + machine you've ever logged into Bugzilla from. Curiously, it never doe + s any housecleaning -- I see cookies in this file I've not used for months. - However, + However, since Bugzilla never expires your cookie (for convenience' sake), it m akes sense. @@ -3675,7 +4054,7 @@ B.2.1.1. Bugzilla Database Tables peak sparingly -- that's only the amount of space the Old Testament from th e Bible - would take (uncompressed, 16 megabytes). Each comment is keyed to the + would take (uncompressed, 16 megabytes). Each comment is keyed to the bug_id to which it's attached, so the order is necessarily chronologic al, for comments are played back in the order in which they are received. @@ -3685,14 +4064,14 @@ B.2.1.1. Bugzilla Database Tables by product through the standard configuration interfaces. namedqueries: This is where everybody stores their "custom queries". - Very + Very cool feature; it beats the tar out of having to bookmark each cool que ry you construct. products: What products you have, whether new bug entries are allowed for the product, what milestone you're working toward on that product, votes, - etc. It + etc. It will be nice when the components table supports these same features, s o you could close a particular component for bug entry without having to clo @@ -3725,8 +4104,8 @@ B.2.1.1. Bugzilla Database Tables mysql> select * from table; -- note: this is a very bad idea to do on, for instance, the "bugs" table if - you have 50,000 bugs. You'll be sitting there a while until you ctrl- - c or + you have 50,000 bugs. You'll be sitting there a while until you ctrl-c + or 50,000 bugs play across your screen. You can limit the display from above a little with the command, wher e @@ -3737,8 +4116,8 @@ B.2.1.1. Bugzilla Database Tables mysql> select * from table where (column != "some info"); Let's take our example from the introduction, and assume you need to change - the word "verified" to "approved" in the resolution field. We know fr - om the + the word "verified" to "approved" in the resolution field. We know fro + m the above information that the resolution is likely to be stored in the "b ugs" table. Note we'll need to change a little perl code as well as this da @@ -3750,13 +4129,13 @@ B.2.1.1. Bugzilla Database Tables (exceedingly long output truncated here) | bug_status| enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED ','VERIFIED','CLOSED')||MUL | UNCONFIRMED|| - Sorry about that long line. We see from this that the "bug status" - column is + Sorry about that long line. We see from this that the "bug status" c + olumn is an "enum field", which is a MySQL peculiarity where a string type fiel d can - only have certain types of entries. While I think this is very cool, - it's not - standard SQL. Anyway, we need to add the possible enum field entry + only have certain types of entries. While I think this is very cool, i + t's not + standard SQL. Anyway, we need to add the possible enum field entry 'APPROVED' by altering the "bugs" table. mysql> ALTER table bugs CHANGE bug_status bug_status -> enum("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED", "RESOLVED", @@ -3770,8 +4149,8 @@ B.2.1.1. Bugzilla Database Tables at's available! Cool thing, too, is that this is reflected on your query p age as - well -- you can query by the new status. But how's it fit into the ex - isting + well -- you can query by the new status. But how's it fit into the exi + sting scheme of things? Looks like you need to go back and look for instances of the word "v erified" @@ -3781,11 +4160,10 @@ B.2.1.1. Bugzilla Database Tables search). Although you can query by the enum field, you can't give something a s tatus - of "APPROVED" until you make the perl changes. Note that this change - I + of "APPROVED" until you make the perl changes. Note that this change I mentioned can also be done by editing checksetup.pl, which automates a lot of - this. But you need to know this stuff anyway, right? + this. But you need to know this stuff anyway, right? _________________________________________________________________ Appendix C. Useful Patches and Utilities for Bugzilla @@ -3803,10 +4181,10 @@ C.1. Apache mod_rewrite magic spits back http://www.foo.com/show_bug.cgi?id=12345. Try setting up your VirtualHost section for Bugzilla with a rule like this: -<VirtualHost 12.34.56.78> -RewriteEngine On -RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R] -</VirtualHost> + <VirtualHost 12.34.56.78> + RewriteEngine On + RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R] + </VirtualHost> 2. There are many, many more things you can do with mod_rewrite. Please refer to the mod_rewrite documentation at @@ -3853,7 +4231,7 @@ Appendix D. Bugzilla Variants and Competitors I created this section to answer questions about Bugzilla competitors and variants, then found a wonderful site which covers an awful lot of what I wanted to discuss. Rather than quote it in its entirety, I'll - simply refer you here: http://linas.org/linux/pm.html + simply refer you here: http://linas.org/linux/pm.html. _________________________________________________________________ D.1. Red Hat Bugzilla @@ -3897,7 +4275,7 @@ D.4. Scarab Scarab is a new open source bug-tracking system built using Java Servlet technology. It is currently at version 1.0 beta 13. - URL: http://scarab.tigris.org + URL: http://scarab.tigris.org/ This section last updated 18 Jan 2003 _________________________________________________________________ @@ -3907,7 +4285,7 @@ D.5. Perforce SCM Although Perforce isn't really a bug tracker, it can be used as such through the "jobs" functionality. - URL: http://www.perforce.com/perforce/technotes/note052.html + URL: http://www.perforce.com/perforce/technotes/note052.html This section last updated 27 Jul 2002 _________________________________________________________________ @@ -4248,7 +4626,7 @@ Appendix E. GNU Free Documentation License GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See - http://www.gnu.org/copyleft/ . + http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this @@ -4363,11 +4741,24 @@ C creating a Product with no Components will create an error in Bugzilla). - CPAN + Comprehensive Perl Archive Network (CPAN) CPAN stands for the "Comprehensive Perl Archive Network". CPAN maintains a large number of extremely useful Perl modules - encapsulated chunks of code for performing a particular task. + contrib + The contrib directory is a location to put scripts that have + been contributed to Bugzilla but are not a part of the official + distribution. These scripts are written by third parties and + may be in languages other than perl. For those that are in + perl, there may be additional modules or other requirements + than those of the offical distribution. + + Note + + Scripts in the contrib directory are not offically supported by the + Bugzilla team and may break in between versions. + D daemon @@ -4417,6 +4808,9 @@ M P + Perl Package Manager (PPM) + http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/ + Product A Product is a broad category of types of bugs, normally representing a single piece of software or entity. In general, @@ -4448,9 +4842,13 @@ R that stores information in tables that are related to each other. + Regular Expression (regexp) + A regular expression is an expression used for pattern + matching. Documentation + S - SGML + SGML SGML stands for "Standard Generalized Markup Language". Created in the 1980's to provide an extensible means to maintain documentation based upon content instead of presentation, SGML @@ -4486,16 +4884,16 @@ Z - I've been asked to explain this ... way back when, when Netscape - released version 4.0 of its browser, we had a release party. - Naturally, there had been a big push to try and fix every known bug - before the release. Naturally, that hadn't actually happened. (This is - not unique to Netscape or to 4.0; the same thing has happened with - every software project I've ever seen.) Anyway, at the release party, - T-shirts were handed out that said something like "Netscape 4.0: Zarro - Boogs". Just like the software, the T-shirt had no known bugs. Uh-huh. - So, when you query for a list of bugs, and it gets no results, you can - think of this as a friendly reminder. Of *course* there are bugs - matching your query, they just aren't in the bugsystem yet... + I've been asked to explain this ... way back when, when Netscape + released version 4.0 of its browser, we had a release party. + Naturally, there had been a big push to try and fix every known bug + before the release. Naturally, that hadn't actually happened. (This is + not unique to Netscape or to 4.0; the same thing has happened with + every software project I've ever seen.) Anyway, at the release party, + T-shirts were handed out that said something like "Netscape 4.0: Zarro + Boogs". Just like the software, the T-shirt had no known bugs. Uh-huh. + So, when you query for a list of bugs, and it gets no results, you can + think of this as a friendly reminder. Of *course* there are bugs + matching your query, they just aren't in the bugsystem yet... - --Terry Weissman + --Terry Weissman diff --git a/docs/txt/CVS/Entries b/docs/txt/CVS/Entries index 5e9df00ef1c20e6460930b09d28f0392a0d48777..289a2390c04bd1c108cb06e0db7115711986c663 100644 --- a/docs/txt/CVS/Entries +++ b/docs/txt/CVS/Entries @@ -1,2 +1,2 @@ -/Bugzilla-Guide.txt/1.22/Wed Apr 23 02:33:00 2003//TBUGZILLA-2_17_4 +/Bugzilla-Guide.txt/1.30/Sun Nov 2 14:04:29 2003//TBUGZILLA-2_17_5 D diff --git a/docs/txt/CVS/Tag b/docs/txt/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/docs/txt/CVS/Tag +++ b/docs/txt/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/docs/xml/Bugzilla-Guide.xml b/docs/xml/Bugzilla-Guide.xml index 4072aa156a0a8046451240c86514f7afb6ccecef..5ff9555a43495da776a9834f2a9c1bfffe7f6bb8 100644 --- a/docs/xml/Bugzilla-Guide.xml +++ b/docs/xml/Bugzilla-Guide.xml @@ -32,9 +32,9 @@ For a devel release, simple bump bz-ver and bz-date --> -<!ENTITY bz-ver "2.17.4"> +<!ENTITY bz-ver "2.17.5"> <!ENTITY bz-nextver "2.18"> -<!ENTITY bz-date "2003-04-23"> +<!ENTITY bz-date "2003-11-01"> <!ENTITY % bz-devel "INCLUDE"> <!ENTITY bz "http://www.bugzilla.org/"> @@ -47,7 +47,7 @@ <!ENTITY min-mysql-ver "3.23.41"> <!ENTITY min-perl-ver "5.6"> <!ENTITY min-template-ver "2.08"> -<!ENTITY min-file-temp-ver "1.804"> +<!ENTITY min-file-temp-ver "any"> <!ENTITY min-appconfig-ver "1.52"> <!ENTITY min-text-wrap-ver "2001.0131"> <!ENTITY min-file-spec-ver "0.82"> @@ -63,6 +63,7 @@ <!ENTITY min-chart-base-ver "0.99c"> <!ENTITY min-xml-parser-ver "any"> <!ENTITY min-mime-parser-ver "any"> +<!ENTITY min-patchreader-ver "0.9.1"> ]> @@ -121,7 +122,7 @@ try to avoid clutter and feel free to waste space in the code to make it more re <para> This documentation is maintained in DocBook 4.1.2 XML format. Changes are best submitted as plain text or XML diffs, attached - to a bug filed in the &bzg-bugs; compontent. + to a bug filed in the &bzg-bugs; component. </para> <![%bz-devel;[ <para>This is a development version of this guide. Information in it @@ -129,6 +130,12 @@ try to avoid clutter and feel free to waste space in the code to make it more re (which will correspond with the &bz-nextver; release of Bugzilla). </para> ]]> + + <para> + The most current version of this document can always be found on the + <ulink url="http://www.bugzilla.org/documentation.html">Bugzilla Documentation Page</ulink>. + </para> + </abstract> <keywordset> diff --git a/docs/xml/CVS/Entries b/docs/xml/CVS/Entries index 89024b7bf1dbfbd570c1d8c101be660bc4ee7b85..88e0fd0000804f1181f592316ef98b9c648f0591 100644 --- a/docs/xml/CVS/Entries +++ b/docs/xml/CVS/Entries @@ -1,20 +1,19 @@ -/Bugzilla-Guide.xml/1.24/Wed Apr 23 02:24:39 2003//TBUGZILLA-2_17_4 -/about.xml/1.12/Wed Apr 23 02:04:21 2003//TBUGZILLA-2_17_4 -/administration.xml/1.25/Wed Apr 23 02:04:22 2003//TBUGZILLA-2_17_4 -/conventions.xml/1.7/Wed Apr 23 02:04:23 2003//TBUGZILLA-2_17_4 -/database.xml/1.12/Wed Apr 23 02:04:23 2003//TBUGZILLA-2_17_4 -/dbschema.mysql/1.2/Wed May 8 23:19:09 2002//TBUGZILLA-2_17_4 -/faq.xml/1.17/Wed Apr 23 02:04:24 2003//TBUGZILLA-2_17_4 -/filetemp.patch/1.1/Wed Apr 2 00:40:56 2003//TBUGZILLA-2_17_4 -/gd-makefile.patch/1.2/Sat Jul 27 22:03:53 2002//TBUGZILLA-2_17_4 -/gfdl.xml/1.7/Wed Apr 23 02:04:24 2003//TBUGZILLA-2_17_4 -/glossary.xml/1.12/Wed Apr 23 02:04:24 2003//TBUGZILLA-2_17_4 -/index.xml/1.4/Wed Apr 23 02:04:25 2003//TBUGZILLA-2_17_4 -/installation.xml/1.41/Wed Apr 23 02:04:25 2003//TBUGZILLA-2_17_4 -/integration.xml/1.10/Wed Apr 23 02:04:25 2003//TBUGZILLA-2_17_4 -/introduction.xml/1.3/Wed Apr 23 02:04:26 2003//TBUGZILLA-2_17_4 -/patches.xml/1.15/Wed Apr 23 02:04:26 2003//TBUGZILLA-2_17_4 -/requiredsoftware.xml/1.5/Wed Apr 23 02:04:28 2003//TBUGZILLA-2_17_4 -/using.xml/1.12/Wed Apr 23 02:04:28 2003//TBUGZILLA-2_17_4 -/variants.xml/1.12/Wed Apr 23 02:04:28 2003//TBUGZILLA-2_17_4 +/Bugzilla-Guide.xml/1.29/Sun Nov 2 02:37:21 2003//TBUGZILLA-2_17_5 +/about.xml/1.13/Mon May 12 19:31:44 2003//TBUGZILLA-2_17_5 +/administration.xml/1.31/Thu Oct 30 20:45:26 2003//TBUGZILLA-2_17_5 +/conventions.xml/1.7/Wed Apr 23 02:04:23 2003//TBUGZILLA-2_17_5 +/database.xml/1.13/Mon May 12 19:31:46 2003//TBUGZILLA-2_17_5 +/dbschema.mysql/1.2/Wed May 8 23:19:09 2002//TBUGZILLA-2_17_5 +/faq.xml/1.21/Sat Nov 1 09:51:41 2003//TBUGZILLA-2_17_5 +/filetemp.patch/1.1/Wed Apr 2 00:40:56 2003//TBUGZILLA-2_17_5 +/gfdl.xml/1.8/Mon May 12 19:31:46 2003//TBUGZILLA-2_17_5 +/glossary.xml/1.15/Wed Jul 2 18:58:36 2003//TBUGZILLA-2_17_5 +/index.xml/1.4/Wed Apr 23 02:04:25 2003//TBUGZILLA-2_17_5 +/installation.xml/1.55/Thu Oct 30 18:42:21 2003//TBUGZILLA-2_17_5 +/integration.xml/1.11/Mon May 12 19:31:48 2003//TBUGZILLA-2_17_5 +/introduction.xml/1.3/Wed Apr 23 02:04:26 2003//TBUGZILLA-2_17_5 +/patches.xml/1.16/Mon May 12 19:31:48 2003//TBUGZILLA-2_17_5 +/requiredsoftware.xml/1.6/Mon May 12 19:31:48 2003//TBUGZILLA-2_17_5 +/using.xml/1.15/Fri Oct 31 00:01:11 2003//TBUGZILLA-2_17_5 +/variants.xml/1.13/Mon May 12 19:31:50 2003//TBUGZILLA-2_17_5 D diff --git a/docs/xml/CVS/Tag b/docs/xml/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/docs/xml/CVS/Tag +++ b/docs/xml/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/docs/xml/about.xml b/docs/xml/about.xml index f3a9a1c5fee52641915260bdbdbd3d46969d92d2..3b0f18e0fe7543548d48cf2144d7e84d03a8ed07 100644 --- a/docs/xml/about.xml +++ b/docs/xml/about.xml @@ -11,9 +11,9 @@ <para> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation - License, Version 1.1 or any later version published by the + License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no - Front-Cover Texts, and with no Back-Cover Texts. A copy of + Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in <xref linkend="gfdl"/>. </para> </blockquote> @@ -37,15 +37,15 @@ </para> <para> All copyrights are held by their respective owners, unless - specifically noted otherwise. Use of a term in this document + specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. </para> <para> Naming of particular products or brands should not be seen as - endorsements, with the exception of the term "GNU/Linux". We + endorsements, with the exception of the term "GNU/Linux". We wholeheartedly endorse the use of GNU/Linux in every situation - where it is appropriate. It is an extremely versatile, stable, + where it is appropriate. It is an extremely versatile, stable, and robust operating system that offers an ideal operating environment for Bugzilla. </para> @@ -60,10 +60,10 @@ documented or fixed in the code, security holes surely exist. Great care should be taken both in the installation and usage of this software. Carefully consider the implications of installing - other network services with Bugzilla. The Bugzilla development + other network services with Bugzilla. The Bugzilla development team members, Netscape Communications, America Online Inc., and any affiliated developers or sponsors assume no liability for - your use of this product. You have the source code to this + your use of this product. You have the source code to this product, and are responsible for auditing it yourself to ensure your security needs are met. </para> @@ -88,7 +88,7 @@ </para> <para> The newest version of this guide can always be found at <ulink - url="http://www.bugzilla.org">bugzilla.org</ulink>; including + url="http://www.bugzilla.org"/>; including documentation for past releases and the current development version. </para> <para> @@ -98,9 +98,8 @@ </para> <para> The latest version of this document can always be checked out via CVS. - Please follow the instructions available at - <ulink url="http://www.mozilla.org/cvs.html">the Mozilla CVS page</ulink>, - and check out the <filename>mozilla/webtools/bugzilla/docs/</filename> + Please follow the <ulink url="http://www.mozilla.org/cvs.html">Mozilla CVS</ulink> + instructions and check out the <filename>mozilla/webtools/bugzilla/docs/</filename> subtree. </para> <para> @@ -181,7 +180,7 @@ <para> Last but not least, all the members of the <ulink url="news://news.mozilla.org/netscape/public/mozilla/webtools"/> - newsgroup. Without your discussions, insight, suggestions, and patches, + newsgroup. Without your discussions, insight, suggestions, and patches, this could never have happened. </para> <para> @@ -194,6 +193,7 @@ <member>Gervase Markham</member> <member>Joe Robins</member> <member>Kevin Brannen</member> + <member>Martin Wulffeld</member> <member>Ron Teitelbaum</member> <member>Spencer Smith</member> <member>Zach Liption</member> diff --git a/docs/xml/administration.xml b/docs/xml/administration.xml index afe50c789273418f24caccd811740d862a5bbf98..8eb7769a4331b4573aaab4839569faef94887c1b 100644 --- a/docs/xml/administration.xml +++ b/docs/xml/administration.xml @@ -618,7 +618,7 @@ <listitem> <para><emphasis>Maximum Votes a person can put on a single - bug"</emphasis>: + bug</emphasis>: It should probably be some number lower than the "Maximum votes per person". Don't set this field to "0" if "Maximum votes per person" is non-zero; that doesn't make @@ -884,9 +884,9 @@ skip-networking not be accessible is rather complicated. A new installation method is currently in the works which should solve this by allowing files that shouldn't be accessible from the web to be placed in directory - outside the webroot. See - <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=44659">bug - 44659</ulink> for more information. + outside the webroot. See + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=44659"> + bug 44659</ulink> for more information. </para> <itemizedlist spacing="compact"> @@ -1047,9 +1047,10 @@ skip-networking <para> Templatization also makes localized versions of Bugzilla possible, - for the first time. In the future, a Bugzilla installation may - have templates installed for multiple localizations, and select - which ones to use based on the user's browser language setting. + for the first time. As of version <![%bz-devel;[2.17.4 which will soon + become ]]>2.18, it's possible to have Bugzilla's language determined by + the user's browser. More information is available in + <xref linkend="template-http-accept"/>. </para> <section> @@ -1113,6 +1114,13 @@ skip-networking changes will be lost when Template Toolkit recompiles them. </para> </note> + + <note> + <para>It is recommended that you run <command>./checksetup.pl</command> + after any template edits, especially if you've created a new file in + the <filename class="directory">custom</filename> directory. + </para> + </note> </section> <section> @@ -1321,6 +1329,29 @@ skip-networking </para> </section> + + <section id="template-http-accept"> + <title>Configuring Bugzilla to Detect the User's Language</title> + + <para>Begining in version 2.18<![%bz-devel;[ (first introduced in version + 2.17.4)]]>, it's now possible to have the users web browser tell Bugzilla + which language templates to use for each visitor (using the HTTP_ACCEPT + header). For this to work, Bugzilla needs to have the correct language + templates installed for the version of Bugzilla you are using. Many + language templates can be obtained from <ulink + url="http://www.bugzilla.org/download.html#localizations"/>. Instructions + for submitting new languages are also available from that location. + </para> + + <para>After untarring the localizations (or creating your own) in the + <filename class="directory">[Bugzilla_Root]/template</filename> directory, + you must update the <option>languages</option> parameter to contain any + localizations you'd like to permit. You may also wish to set the + <option>defaultlanguage</option> parameter to something other than + <quote>en</quote> if you don't want Engish to be the default language. + </para> + </section> + </section> <section id="cust-change-permissions"> @@ -1385,7 +1416,7 @@ skip-networking positive check, which returns 1 (allow) if certain conditions are true, or a negative check, which returns 0 (deny.) E.g.: <programlisting> if ($field eq "qacontact") { - if (UserInGroup("quality_assurance")) { + if (Bugzilla->user->groups("quality_assurance")) { return 1; } else { @@ -1395,7 +1426,7 @@ skip-networking This says that only users in the group "quality_assurance" can change the QA Contact field of a bug. Getting more weird: <programlisting> if (($field eq "priority") && - ($vars->{'user'}{'login'} =~ /.*\@example\.com$/)) + (Bugzilla->user->email =~ /.*\@example\.com$/)) { if ($oldvalue eq "P1") { return 1; @@ -1420,6 +1451,14 @@ skip-networking <section id="upgrading"> <title>Upgrading to New Releases</title> + <warning> + <para>Upgrading is a one-way process. You should backup your database + and current Bugzilla directory before attempting the upgrade. If you wish + to revert to the old Bugzilla version for any reason, you will have to + restore from these backups. + </para> + </warning> + <para>Upgrading Bugzilla is something we all want to do from time to time, be it to get new features or pick up the latest security fix. How easy it is to update depends on a few factors. diff --git a/docs/xml/database.xml b/docs/xml/database.xml index 25a3855ec7756e6eb1358a7d55620f5c100f9560..aea80640b2e02233405fec09b3b92d04d7010c24 100644 --- a/docs/xml/database.xml +++ b/docs/xml/database.xml @@ -68,7 +68,7 @@ <para>But Certain Death speaks up -- a tiny voice, from the dark corners of the conference room. "I have a concern," the voice hisses from the - darkness, "about the use of the word 'verified'.</para> + darkness, "about the use of the word 'verified'."</para> <para>The room, previously filled with happy chatter, lapses into reverential silence as Certain Death (better known as the Vice President @@ -103,10 +103,8 @@ and a <quote>tinyint</quote> - entry in MySQL. I recommend you refer to the MySQL documentation, - available at - <ulink url="http://www.mysql.com/doc.html">MySQL.com</ulink> - + entry in MySQL. I recommend you refer to the + <ulink url="http://www.mysql.com/documentation/">MySQL documentation</ulink> . Below are the basics you need to know about the Bugzilla database. Check the chart above for more details.</para> @@ -131,7 +129,7 @@ your database in the Bugzilla FAQ in this directory (under "Security"), or more robust security generalities in the <ulink url="http://www.mysql.com/php/manual.php3?section=Privilege_system">MySQL - searchable documentation</ulink>. + searchable documentation</ulink>. </para> </listitem> @@ -207,14 +205,14 @@ </para> <literallayout> - Here's an overview of what each table does. Most columns in each table have + Here's an overview of what each table does. Most columns in each table have descriptive names that make it fairly trivial to figure out their jobs. -attachments: This table stores all attachments to bugs. It tends to be your +attachments: This table stores all attachments to bugs. It tends to be your largest table, yet also generally has the fewest entries because file attachments are so (relatively) large. -bugs: This is the core of your system. The bugs table stores most of the +bugs: This is the core of your system. The bugs table stores most of the current information about a bug, with the exception of the info stored in the other tables. @@ -222,26 +220,26 @@ bugs_activity: This stores information regarding what changes are made to bugs when -- a history file. cc: This tiny table simply stores all the CC information for any bug which has -any entries in the CC field of the bug. Note that, like most other tables in +any entries in the CC field of the bug. Note that, like most other tables in Bugzilla, it does not refer to users by their user names, but by their unique userid, stored as a primary key in the profiles table. components: This stores the programs and components (or products and -components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program" +components, in newer Bugzilla parlance) for Bugzilla. Curiously, the "program" (product) field is the full name of the product, rather than some other unique identifier, like bug_id and user_id are elsewhere in the database. dependencies: Stores data about those cool dependency trees. -fielddefs: A nifty table that defines other tables. For instance, when you +fielddefs: A nifty table that defines other tables. For instance, when you submit a form that changes the value of "AssignedTo" this table allows translation to the actual field name "assigned_to" for entry into MySQL. -groups: defines bitmasks for groups. A bitmask is a number that can uniquely -identify group memberships. For instance, say the group that is allowed to +groups: defines bitmasks for groups. A bitmask is a number that can uniquely +identify group memberships. For instance, say the group that is allowed to tweak parameters is assigned a value of "1", the group that is allowed to edit users is assigned a "2", and the group that is allowed to create new groups is -assigned the bitmask of "4". By uniquely combining the group bitmasks (much +assigned the bitmask of "4". By uniquely combining the group bitmasks (much like the chmod command in UNIX,) you can identify a user is allowed to tweak parameters and create groups, but not edit users, by giving him a bitmask of "5", or a user allowed to edit users and create groups, but not tweak @@ -256,15 +254,15 @@ keywords: Unlike what you'd think, this table holds which keywords are associated with which bug id's. logincookies: This stores every login cookie ever assigned to you for every -machine you've ever logged into Bugzilla from. Curiously, it never does any -housecleaning -- I see cookies in this file I've not used for months. However, +machine you've ever logged into Bugzilla from. Curiously, it never does any +housecleaning -- I see cookies in this file I've not used for months. However, since Bugzilla never expires your cookie (for convenience' sake), it makes sense. longdescs: The meat of bugzilla -- here is where all user comments are stored! You've only got 2^24 bytes per comment (it's a mediumtext field), so speak sparingly -- that's only the amount of space the Old Testament from the Bible -would take (uncompressed, 16 megabytes). Each comment is keyed to the +would take (uncompressed, 16 megabytes). Each comment is keyed to the bug_id to which it's attached, so the order is necessarily chronological, for comments are played back in the order in which they are received. @@ -272,12 +270,12 @@ milestones: Interesting that milestones are associated with a specific product in this table, but Bugzilla does not yet support differing milestones by product through the standard configuration interfaces. -namedqueries: This is where everybody stores their "custom queries". Very +namedqueries: This is where everybody stores their "custom queries". Very cool feature; it beats the tar out of having to bookmark each cool query you construct. products: What products you have, whether new bug entries are allowed for the -product, what milestone you're working toward on that product, votes, etc. It +product, what milestone you're working toward on that product, votes, etc. It will be nice when the components table supports these same features, so you could close a particular component for bug entry without having to close an entire product... @@ -312,7 +310,7 @@ mysql> show columns from table; mysql> select * from table; -- note: this is a very bad idea to do on, for instance, the "bugs" table if -you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or +you have 50,000 bugs. You'll be sitting there a while until you ctrl-c or 50,000 bugs play across your screen. You can limit the display from above a little with the command, where @@ -325,7 +323,7 @@ mysql> select * from table where (column = "some info"); mysql> select * from table where (column != "some info"); Let's take our example from the introduction, and assume you need to change -the word "verified" to "approved" in the resolution field. We know from the +the word "verified" to "approved" in the resolution field. We know from the above information that the resolution is likely to be stored in the "bugs" table. Note we'll need to change a little perl code as well as this database change, but I won't plunge into that in this document. Let's verify the @@ -336,10 +334,10 @@ mysql> show columns from bugs (exceedingly long output truncated here) | bug_status| enum('UNCONFIRMED','NEW','ASSIGNED','REOPENED','RESOLVED','VERIFIED','CLOSED')||MUL | UNCONFIRMED|| - Sorry about that long line. We see from this that the "bug status" column is + Sorry about that long line. We see from this that the "bug status" column is an "enum field", which is a MySQL peculiarity where a string type field can -only have certain types of entries. While I think this is very cool, it's not -standard SQL. Anyway, we need to add the possible enum field entry +only have certain types of entries. While I think this is very cool, it's not +standard SQL. Anyway, we need to add the possible enum field entry 'APPROVED' by altering the "bugs" table. mysql> ALTER table bugs CHANGE bug_status bug_status @@ -355,15 +353,15 @@ mysql> show columns from bugs; you'll see that the bug_status field has an extra "APPROVED" enum that's available! Cool thing, too, is that this is reflected on your query page as -well -- you can query by the new status. But how's it fit into the existing +well -- you can query by the new status. But how's it fit into the existing scheme of things? Looks like you need to go back and look for instances of the word "verified" in the perl code for Bugzilla -- wherever you find "verified", change it to "approved" and you're in business (make sure that's a case-insensitive search). Although you can query by the enum field, you can't give something a status -of "APPROVED" until you make the perl changes. Note that this change I +of "APPROVED" until you make the perl changes. Note that this change I mentioned can also be done by editing checksetup.pl, which automates a lot of -this. But you need to know this stuff anyway, right? +this. But you need to know this stuff anyway, right? </literallayout> </section> </section> diff --git a/docs/xml/faq.xml b/docs/xml/faq.xml index bff9376aba3b18f9635ffe869f3c526c91641625..e2cebd6471ba5e02f152ed6efa58a4982980e41d 100644 --- a/docs/xml/faq.xml +++ b/docs/xml/faq.xml @@ -21,8 +21,7 @@ <answer> <para> You can stay up-to-date with the latest Bugzilla - information at <ulink url="http://www.bugzilla.org/"> - http://www.bugzilla.org/</ulink> + information at <ulink url="http://www.bugzilla.org/"/>. </para> </answer> </qandaentry> @@ -36,8 +35,7 @@ <answer> <para> Bugzilla is covered by the Mozilla Public License. - See details at <ulink url="http://www.mozilla.org/MPL/"> - http://www.mozilla.org/MPL/</ulink> + See details at <ulink url="http://www.mozilla.org/MPL/"/>. </para> </answer> </qandaentry> @@ -50,12 +48,12 @@ </question> <answer> <para> - <ulink url="http://bugzilla.org/consulting.html">http://bugzilla.org/consulting.html</ulink> + <ulink url="http://bugzilla.org/consulting.html"/> is a list of people and companies who have asked us to list them as consultants for Bugzilla. </para> <para> - <ulink url="http://www.collab.net/">www.collab.net</ulink> offers + <ulink url="http://www.collab.net/"/> offers Bugzilla as part of their standard offering to large projects. They do have some minimum fees that are pretty hefty, and generally aren't interested in small projects. @@ -79,29 +77,13 @@ <answer> <para> There are <emphasis>dozens</emphasis> of major companies with public - Bugzilla sites to track bugs in their products. A few include: - <simplelist> - <member>Netscape/AOL</member> - <member>Mozilla.org</member> - <member>NASA</member> - <member>Red Hat Software</member> - <member>SuSe Corp</member> - <member>The Horde Project</member> - <member>AbiSource</member> - <member>Real Time Enterprises, Inc</member> - <member>Eggheads.org</member> - <member>Strata Software</member> - <member>RockLinux</member> - <member>Creative Labs (makers of SoundBlaster)</member> - <member>The Apache Foundation</member> - <member>The Gnome Foundation</member> - <member>Ximian</member> - <member>Linux-Mandrake</member> - </simplelist> - </para> - <para> - Suffice to say, there are more than enough huge projects using Bugzilla - that we can safely say it's extremely popular. + Bugzilla sites to track bugs in their products. We have a fairly + complete list available on our website at + <ulink url="http://bugzilla.org/installation_list.html"/>. If you + have an installation of Bugzilla and would like to be added to the + list, whether it's a public install or not, simply e-mail + Gerv <email>gerv@mozilla.org</email>. Keep in mind that it's kinda + difficult to get onto the <quote>high-profile</quote> list ;). </para> </answer> </qandaentry> @@ -116,7 +98,7 @@ <para> A <ulink url="http://www.bugzilla.org/who_we_are.html">core team</ulink>, - led by Dave Miller (justdave@netscape.com). + led by Dave Miller (justdave@bugzilla.org). </para> </answer> </qandaentry> @@ -158,8 +140,8 @@ <answer> <para> It may be that the support has not been built yet, or that you - have not yet found it. Bugzilla is making tremendous strides in - usability, customizability, scalability, and user interface. It + have not yet found it. Bugzilla is making tremendous strides in + usability, customizability, scalability, and user interface. It is widely considered the most complete and popular open-source bug-tracking software in existence. </para> @@ -187,11 +169,11 @@ </para> <para> There is currently work in progress to make Bugzilla work on - PostgreSQL and Sybase in the default distribution. You can track - the progress of these initiatives in bugs <ulink - url="http://bugzilla.mozilla.org/show_bug.cgi?id=98304">98304</ulink> + PostgreSQL and Sybase in the default distribution. You can track + the progress of these initiatives in <ulink + url="http://bugzilla.mozilla.org/show_bug.cgi?id=98304">bug 98304</ulink> and <ulink - url="http://bugzilla.mozilla.org/show_bug.cgi?id=173130">173130</ulink> + url="http://bugzilla.mozilla.org/show_bug.cgi?id=173130">bug 173130</ulink> respectively. </para> <para> @@ -213,8 +195,8 @@ <filename>/usr/bonsaitools/bin/perl</filename> because when Terry first started writing the code for mozilla.org he needed a version of Perl and other tools that were completely under his - control. This location was abandoned for the 2.18 release in favor - of the more sensible <filename>/usr/bin/perl</filename>. If you + control. This location was abandoned for the 2.18 release in favor + of the more sensible <filename>/usr/bin/perl</filename>. If you installed an older verion of Bugzilla and created the symlink we suggested, you can remove it now (provided that you don't have anything else, such as Bonsai, using it and you don't intend to @@ -233,7 +215,7 @@ <answer> <para> Yes, the following bit of perl magic will change all the shebang - lines. Be sure to change <filename>/usr/local/bin/perl</filename> + lines. Be sure to change <filename>/usr/local/bin/perl</filename> to your path to the perl binary. </para> <programlisting> @@ -276,7 +258,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - It is web and e-mail based. You can edit bugs by sending specially + It is web and e-mail based. You can edit bugs by sending specially formatted email to a properly configured Bugzilla, or control via the web. </para> </answer> @@ -335,7 +317,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <answer> <para> Yes - any sort of attachment is allowed, although administrators can - configure a maximum size. + configure a maximum size. Bugzilla gives the user the option of either using the MIME-type supplied by the browser, choosing from a pre-defined list or manually typing any arbitrary MIME-type. @@ -353,15 +335,14 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Yes. However, modifying some fields, notably those related to bug + Yes. However, modifying some fields, notably those related to bug progression states, also require adjusting the program logic to compensate for the change. </para> <para> There is no GUI for adding fields to Bugzilla at this - time. You can follow development of this feature at - <ulink - url="http://bugzilla.mozilla.org/show_bug.cgi?id=91037">http://bugzilla.mozilla.org/show_bug.cgi?id=91037</ulink> + time. You can follow development of this feature in + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=91037">bug 91037</ulink> </para> </answer> </qandaentry> @@ -375,9 +356,8 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Yes. Look at <ulink url="http://bugzilla.mozilla.org/report.cgi"> - http://bugzilla.mozilla.org/report.cgi</ulink> for samples of what - Bugzilla can do in reporting and graphing. + Yes. Look at <ulink url="http://bugzilla.mozilla.org/report.cgi"/> + for samples of what Bugzilla can do in reporting and graphing. </para> <para> If you can not get the reports you want from the included reporting @@ -399,7 +379,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Email notification is user-configurable. By default, the bug id and + Email notification is user-configurable. By default, the bug id and Summary of the bug report accompany each email notification, along with a list of the changes made. </para> @@ -436,7 +416,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl If you decide to use the bugzilla_email integration features to allow Bugzilla to record responses to mail with the associated bug, you may need to caution your users to set their mailer to "respond - to messages in the format in which they were sent". For security reasons + to messages in the format in which they were sent". For security reasons Bugzilla ignores HTML tags in comments, and if a user sends HTML-based email into Bugzilla the resulting comment looks downright awful. </para> @@ -458,12 +438,12 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <para> Bugzilla can output buglists as HTML (the default), CSV or RDF. The link for CSV can be found at the bottom of the buglist in HTML - format. This CSV format can easily be imported into MS Excel or + format. This CSV format can easily be imported into MS Excel or other spread-sheet applications. </para> <para> To use the RDF format of the buglist it is necessary to append a - <computeroutput>&ctype=rdf</computeroutput> to the URL. RDF + <computeroutput>&ctype=rdf</computeroutput> to the URL. RDF is meant to be machine readable and thus it is assumed that the URL would be generated progmatically so there is no user visible link to this format. @@ -493,12 +473,12 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Yes. For more information including available translated templates, + Yes. For more information including available translated templates, see <ulink url="http://www.bugzilla.org/download.html#localizations"/>. The admin interfaces are still not included in these translated - templates and is therefore still English only. Also, there may be - issues with the charset not being declared. See <ulink + templates and is therefore still English only. Also, there may be + issues with the charset not being declared. See <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=126266">bug 126226</ulink> for more information. </para> @@ -514,7 +494,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Yes. No. Yes (using the CSV format). + Yes. No. Yes (using the CSV format). </para> </answer> </qandaentry> @@ -528,7 +508,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - You have no idea. Bugzilla's query interface, particularly with the + You have no idea. Bugzilla's query interface, particularly with the advanced Boolean operators, is incredibly versatile. </para> </answer> @@ -544,7 +524,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Bugzilla does not lock records. It provides mid-air collision detection, + Bugzilla does not lock records. It provides mid-air collision detection, and offers the offending user a choice of options to deal with the conflict. </para> </answer> @@ -560,8 +540,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <para> MySQL, the database back-end for Bugzilla, allows hot-backup of data. You can find strategies for dealing with backup considerations - at <ulink url="http://www.mysql.com/doc/B/a/Backup.html"> - http://www.mysql.com/doc/B/a/Backup.html</ulink> + at <ulink url="http://www.mysql.com/doc/B/a/Backup.html"/>. </para> </answer> </qandaentry> @@ -574,8 +553,8 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Yes. However, commits to the database must wait - until the tables are unlocked. Bugzilla databases are typically + Yes. However, commits to the database must wait + until the tables are unlocked. Bugzilla databases are typically very small, and backups routinely take less than a minute. </para> </answer> @@ -598,7 +577,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </para> <para> Commercial Bug-tracking software typically costs somewhere upwards - of $20,000 or more for 5-10 floating licenses. Bugzilla consultation + of $20,000 or more for 5-10 floating licenses. Bugzilla consultation is available from skilled members of the newsgroup. Simple questions are answered there and then. </para> @@ -617,9 +596,9 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - It all depends on your level of commitment. Someone with much Bugzilla + It all depends on your level of commitment. Someone with much Bugzilla experience can get you up and running in less than a day, and - your Bugzilla install can run untended for years. If your + your Bugzilla install can run untended for years. If your Bugzilla strategy is critical to your business workflow, hire somebody with reasonable UNIX or Perl skills to handle your process management and bug-tracking maintenance & customization. @@ -636,7 +615,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - No. MySQL asks, if you find their product valuable, that you purchase + No. MySQL asks, if you find their product valuable, that you purchase a support contract from them that suits your needs. </para> </answer> @@ -655,7 +634,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Run MySQL like this: "mysqld --skip-grant-tables". Please remember <emphasis>this + Run MySQL like this: "mysqld --skip-grant-tables". Please remember <emphasis>this makes MySQL as secure as taping a $100 to the floor of a football stadium bathroom for safekeeping.</emphasis> </para> @@ -741,12 +720,12 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Try Klaas Freitag's excellent patch for "whineatassigned" functionality. - You can find it at <ulink - url="http://bugzilla.mozilla.org/show_bug.cgi?id=6679"/>. This + Try Klaas Freitag's excellent patch for "whineatassigned" + functionality. You can find it in <ulink + url="http://bugzilla.mozilla.org/show_bug.cgi?id=6679">bug 6679</ulink>. This patch is against an older version of Bugzilla, so you must apply the diffs manually. - <!-- TODO: Mention Joel's "Fine Whine" patch" --> + <!-- TODO: Mention Joel's "Fine Whine" patch. --> </para> </answer> </qandaentry> @@ -769,7 +748,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </blockquote> However, this is fairly nasty and subject to problems; you also need to set up your smrsh (sendmail restricted shell) to allow - it. In a pinch, though, it can work. + it. In a pinch, though, it can work. </para> </answer> </qandaentry> @@ -826,7 +805,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </para> <para> If you never receive mail from Bugzilla, chances you do not have - sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked + sendmail in "/usr/lib/sendmail". Ensure sendmail lives in, or is symlinked to, "/usr/lib/sendmail". </para> </answer> @@ -846,7 +825,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <para> Red Hat's old version of Bugzilla (based on 2.8) worked on Oracle. Red Hat's newer version (based on 2.17.1 and soon to be merged into - the main distribution) runs on PostgreSQL. At this time we know of + the main distribution) runs on PostgreSQL. At this time we know of no recent ports of Bugzilla to Oracle but do intend to support it in the future (possibly the 2.20 time-frame). </para> @@ -866,15 +845,15 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl (<filename>./sanitycheck.cgi</filename> in the Bugzilla_home directory) from your web browser to see! If it finishes without errors, you're - <emphasis>probably</emphasis> OK. If it doesn't come back + <emphasis>probably</emphasis> OK. If it doesn't come back OK (i.e. any red letters), there are certain things - Bugzilla can recover from and certain things it can't. If + Bugzilla can recover from and certain things it can't. If it can't auto-recover, I hope you're familiar with mysqladmin commands or have installed another way to - manage your database. Sanity Check, although it is a good + manage your database. Sanity Check, although it is a good basic check on your database integrity, by no means is a substitute for competent database administration and - avoiding deletion of data. It is not exhaustive, and was + avoiding deletion of data. It is not exhaustive, and was created to do a basic check for the most common problems in Bugzilla databases. </para> @@ -893,7 +872,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl not a smart thing to do if you don't know exactly what you're doing. However, if you understand SQL you can use the <command>mysql</command> command line utility to manually insert, delete and modify table - information. There are also more intuitive GUI clients available. + information. There are also more intuitive GUI clients available. Personal favorites of the Bugzilla team are <ulink url="http://www.phpmyadmin.net/">phpMyAdmin</ulink> and <ulink url="http://www.mysql.com/downloads/gui-mycc.html">MySQL Control @@ -936,7 +915,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Well, you can synchronize or you can move bugs. Synchronization will + Well, you can synchronize or you can move bugs. Synchronization will only work one way -- you can create a read-only copy of the database at one site, and have it regularly updated at intervals from the main database. @@ -980,8 +959,8 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - Not currently. Bundle::Bugzilla enormously simplifies Bugzilla - installation on UNIX systems. If someone can volunteer to + Not currently. Bundle::Bugzilla enormously simplifies Bugzilla + installation on UNIX systems. If someone can volunteer to create a suitable PPM bundle for Win32, it would be appreciated. </para> </answer> @@ -1058,8 +1037,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </orderedlist> I reckon TimeDate and Data::Dumper come with the activeperl. You can check the ActiveState site for packages for installation through PPM. - <ulink url=" http://www.activestate.com/Packages/"> - http://www.activestate.com/Packages/</ulink> + <ulink url="http://www.activestate.com/Packages/"/>. </para> </answer> </qandaentry> @@ -1086,7 +1064,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <qandaentry> <question id="faq-use-query"> <para> - The query page is very confusing. Isn't there a simpler way to query? + The query page is very confusing. Isn't there a simpler way to query? </para> </question> <answer> @@ -1108,16 +1086,15 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <answer> <para> The current behavior is acceptable to bugzilla.mozilla.org and most - users. You have your choice of patches - to change this behavior, however. + users. You have your choice of patches to change this behavior, however. <simplelist> <member><ulink url="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8029"> Add a "and accept bug" radio button</ulink></member> <member><ulink url="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=8153"> "Accept" button automatically assigns to you</ulink></member> </simplelist> - Note that these patches are somewhat dated. You will need to apply - them manually. + Note that these patches are somewhat dated. You will need to apply + them manually. </para> </answer> </qandaentry> @@ -1126,13 +1103,13 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <question id="faq-use-attachment"> <para> I can't upload anything into the database via the "Create Attachment" - link. What am I doing wrong? + link. What am I doing wrong? </para> </question> <answer> <para> The most likely cause is a very old browser or a browser that is - incompatible with file upload via POST. Download the latest Netscape, + incompatible with file upload via POST. Download the latest Netscape, Microsoft, or Mozilla browser to handle uploads correctly. </para> </answer> @@ -1147,12 +1124,35 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <answer> <para> In the Bugzilla administrator UI, edit the keyword and it will let you - replace the old keyword name with a new one. This will cause a problem - with the keyword cache. Run sanitycheck.cgi to fix it. + replace the old keyword name with a new one. This will cause a problem + with the keyword cache. Run sanitycheck.cgi to fix it. </para> </answer> </qandaentry> + <qandaentry> + <question id="faq-use-close"> + <para> + Why can't I close bugs from the "Change Several Bugs at Once" page? + </para> + </question> + <answer> + <para> + The logic flow currently used is RESOLVED, then VERIFIED, then CLOSED. + You <emphasis>can</emphasis> mass-CLOSE bugs from the change several + bugs at once page. <emphasis>but</emphasis>, every bug listed on the + page has to be in VERIFIED state before the control to do it will show + up on the form. You can also mass-VERIFY, but every bug listed has to be + RESOLVED in order for the control to show up on the form. The logic + behind this is that if you pick one of the bugs that's not VERIFIED and + try to CLOSE it, the bug change will fail miserably (thus killing any + changes in the list after it while doing the bulk change) so it doesn't + even give you the choice. + </para> + </answer> + </qandaentry> + + </qandadiv> <qandadiv id="faq-hacking"> @@ -1167,7 +1167,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <answer> <para> Gerv and Myk suggest a 2-space indent, with embedded code sections on - their own line, in line with outer tags. Like this:</para> + their own line, in line with outer tags. Like this:</para> <programlisting><![CDATA[ <fred> [% IF foo %] @@ -1189,7 +1189,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <para>Please note that many have differing opinions on this subject, and the existing templates in Bugzilla espouse both this and a 4-space - style. Either is acceptable; the above is preferred.</para> + style. Either is acceptable; the above is preferred.</para> </answer> </qandaentry> @@ -1209,7 +1209,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl You can view bugs marked for &bz-nextver; release <ulink url="http://bugzilla.mozilla.org/buglist.cgi?product=Bugzilla&target_milestone=Bugzilla+&bz-nextver;">here</ulink>. This list includes bugs for the &bz-nextver; release that have already - been fixed and checked into CVS. Please consult the + been fixed and checked into CVS. Please consult the <ulink url="http://www.bugzilla.org/"> Bugzilla Project Page</ulink> for details on how to check current sources out of CVS so you can have these @@ -1227,11 +1227,10 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl </question> <answer> <para> - This is well-documented here: <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=49862"> - http://bugzilla.mozilla.org/show_bug.cgi?id=49862</ulink>. Ultimately, it's as easy - as adding the "---" priority field to your localconfig file in the appropriate area, - re-running checksetup.pl, and then changing the default priority in your browser using - "editparams.cgi". + This is well-documented in <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=49862"> + bug 49862</ulink>. Ultimately, it's as easy as adding the "---" priority field to your + localconfig file in the appropriate area, re-running checksetup.pl, and then changing the + default priority in your browser using "editparams.cgi". </para> </answer> </qandaentry> @@ -1259,7 +1258,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl or new source file by clicking "Create a new attachment" link on the bug page you've just created, and include any descriptions of database changes you may make, into the bug - ID you submitted in step #1. Be sure and click the "Patch" checkbox + ID you submitted in step #1. Be sure and click the "Patch" checkbox to indicate the text you are sending is a patch! </para> </listitem> @@ -1267,7 +1266,7 @@ perl -pi -e 's@#\!/usr/bin/perl@#\!/usr/local/bin/perl@' *cgi *pl <para> Announce your patch and the associated URL (http://bugzilla.mozilla.org/show_bug.cgi?id=XXXXXX) for discussion in - the newsgroup (netscape.public.mozilla.webtools). You'll get a really + the newsgroup (netscape.public.mozilla.webtools). You'll get a really good, fairly immediate reaction to the implications of your patch, which will also give us an idea how well-received the change would be. diff --git a/docs/xml/gd-makefile.patch b/docs/xml/gd-makefile.patch deleted file mode 100644 index 8ec35a23a5c2bfe241d991799eb4a3d15341010f..0000000000000000000000000000000000000000 --- a/docs/xml/gd-makefile.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- GD-1.33/Makefile.PL Fri Aug 4 16:59:22 2000 -+++ GD-1.33-darwin/Makefile.PL Tue Jun 26 01:29:32 2001 -@@ -3,8 +3,8 @@ - warn "NOTICE: This module requires libgd 1.8.3 or higher (shared library version 4.X).\n"; - - # =====> PATHS: CHECK AND ADJUST <===== --my @INC = qw(-I/usr/local/include -I/usr/local/include/gd); --my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib ); -+my @INC = qw(-I/sw/include -I/sw/include/gd -I/usr/local/include -I/usr/local/include/gd); -+my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/sw/lib -L/usr/local/lib); - my @LIBS = qw(-lgd -lpng -lz); - - # FEATURE FLAGS -@@ -23,7 +23,7 @@ - - push @LIBS,'-lttf' if $TTF; - push @LIBS,'-ljpeg' if $JPEG; --push @LIBS, '-lm' unless $^O eq 'MSWin32'; -+push @LIBS, '-lm' unless ($^O =~ /^MSWin32|darwin$/); - - # FreeBSD 3.3 with libgd built from ports croaks if -lXpm is specified - if ($^O ne 'freebsd' && $^O ne 'MSWin32') { diff --git a/docs/xml/gfdl.xml b/docs/xml/gfdl.xml index ae19501d28131db2f7e16602910083a1098c754f..93987caf6f4d01a15830b52a63809e132259d11e 100644 --- a/docs/xml/gfdl.xml +++ b/docs/xml/gfdl.xml @@ -381,10 +381,7 @@ the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See - <ulink url="http://www.gnu.org/copyleft/"> - http://www.gnu.org/copyleft/</ulink> - - .</para> + <ulink url="http://www.gnu.org/copyleft/"/>.</para> <para>Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of diff --git a/docs/xml/glossary.xml b/docs/xml/glossary.xml index 807b7e647583308e15114c32a89bdbb15137f73b..3893094c0b5b97552aa5d3585ea24896db296fc3 100644 --- a/docs/xml/glossary.xml +++ b/docs/xml/glossary.xml @@ -154,10 +154,10 @@ </glossentry> <glossentry id="gloss-cpan"> - <glossterm> - <acronym>CPAN</acronym> - </glossterm> + <glossterm>Comprehensive Perl Archive Network</glossterm> + <acronym>CPAN</acronym> + <!-- TODO: Rewrite def for CPAN --> <glossdef> <para> <acronym>CPAN</acronym> @@ -170,6 +170,26 @@ particular task.</para> </glossdef> </glossentry> + + <glossentry id="gloss-contrib"> + <glossterm><filename class="directory">contrib</filename></glossterm> + + <glossdef> + <para>The <filename class="directory">contrib</filename> directory is + a location to put scripts that have been contributed to Bugzilla but + are not a part of the official distribution. These scripts are written + by third parties and may be in languages other than perl. For those + that are in perl, there may be additional modules or other requirements + than those of the offical distribution. + <note> + <para>Scripts in the <filename class="directory">contrib</filename> + directory are not offically supported by the Bugzilla team and may + break in between versions. + </para> + </note> + </para> + </glossdef> + </glossentry> </glossdiv> <glossdiv id="gloss-d"> @@ -283,6 +303,16 @@ <glossdiv id="gloss-p"> <title>P</title> + <glossentry id="gloss-ppm"> + <glossterm>Perl Package Manager</glossterm> + <acronym>PPM</acronym> + + <glossdef> + <para><ulink url="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/"/> + </para> + </glossdef> + </glossentry> + <glossentry> <glossterm id="gloss-product">Product</glossterm> @@ -347,6 +377,17 @@ </para> </glossdef> </glossentry> + + <glossentry id="gloss-regexp"> + <glossterm>Regular Expression</glossterm> + <acronym>regexp</acronym> + + <glossdef> + <para>A regular expression is an expression used for pattern matching. + <ulink url="http://perldoc.com/perl5.6/pod/perlre.html#Regular-Expressions">Documentation</ulink> + </para> + </glossdef> + </glossentry> </glossdiv> <glossdiv id="gloss-s"> diff --git a/docs/xml/installation.xml b/docs/xml/installation.xml index 89dfc224c341683fb1933edeafa1c61985ab3e05..336cc0cccde4faadf2cd43e9dfbd331efee2651a 100644 --- a/docs/xml/installation.xml +++ b/docs/xml/installation.xml @@ -1,406 +1,450 @@ <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"> --> -<chapter id="installation" xreflabel="Bugzilla Installation"> +<!-- $Id: installation.xml,v 1.55 2003/10/30 18:42:21 jocuri%softhome.net Exp $ --> +<chapter id="installation"> <title>Installation</title> - <section id="stepbystep" xreflabel="Bugzilla Installation Step-by-step"> + <section id="stepbystep"> <title>Step-by-step Install</title> - <section id="intstall-into"> - <title>Introduction</title> - - <para>Bugzilla has been successfully installed under Solaris, Linux, - and Win32. Win32 is not yet officially supported, but many people - have got it working fine. - Please see - <xref linkend="os-win32" /> - for further advice on getting Bugzilla to work on Microsoft - Windows.</para> - - </section> - - <section id="install-package-list"> - <title>Package List</title> + <para>Bugzilla has been successfully installed under many different + operating systems including almost all Unix clones and + <productname class="registered">Microsoft Windows</productname>. Many + operating systems have utilities that make installation easier or quirks + that make it harder. We have tried to collect that information in + <xref linkend="os-specific"/>, so be sure to check out that section before + you start your installation. + </para> <note> - <para> If you are running the very most recent - version of Perl and MySQL (both the executables and development - libraries) on your system, you can skip these manual installation - steps for the Perl modules by using Bundle::Bugzilla; see - <xref linkend="bundlebugzilla" />. + <para>Windows is one of those operating systems that has many quirks + and is not yet officially supported by the Bugzilla team. If you wish + to install Bugzilla on Windows, be sure to see + <xref linkend="os-win32"/>. </para> </note> - <para>The software packages necessary for the proper running of - Bugzilla (with download links) are: - <orderedlist> - - -<listitem> - <para> - <ulink url="http://www.mysql.com/">MySQL database server</ulink> - (&min-mysql-ver; or greater) - </para> -</listitem> - -<listitem> - <para> - <ulink url="http://www.perl.org">Perl</ulink> - (&min-perl-ver;, 5.6.1 is recommended if you wish to - use Bundle::Bugzilla) - </para> -</listitem> - -<listitem> - <para>Perl Modules (minimum version): - <orderedlist> - - <listitem> - <para> - <ulink url="http://www.template-toolkit.org">Template</ulink> - (v&min-template-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.perldoc.com/perl5.6/lib/File/Temp.html"> - File::Temp</ulink> - (&min-file-temp-ver;) (Prerequisite for Template) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/AppConfig/">AppConfig - </ulink> - (&min-appconfig-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/authors/id/MUIR/modules/Text-Tabs%2BWrap-2001.0131.tar.gz">Text::Wrap</ulink> - (&min-text-wrap-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://search.cpan.org/search?dist=File-Spec">File::Spec - </ulink> - (&min-file-spec-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/Data/">Data::Dumper - </ulink> - (&min-data-dumper-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/Mysql/">DBD::mysql - </ulink> - (&min-dbd-mysql-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/DBI/">DBI</ulink> - (&min-dbi-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/Date/">Date::Parse - </ulink> - (&min-date-format-ver;) - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/CGI/">CGI - </ulink> - (&min-cgi-ver;) - </para> - </listitem> - - </orderedlist> - and, optionally: - <orderedlist> - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/GD/">GD</ulink> - (&min-gd-ver;) for bug charting - </para> - </listitem> - - <listitem> - <para> - GD::Graph - (&min-gd-graph-ver;) for bug charting - </para> - </listitem> - - <listitem> - <para> - GD::Text::Align - (&min-gd-text-align-ver;) for bug charting - </para> - </listitem> - - <listitem> - <para> - <ulink url="http://www.cpan.org/modules/by-module/Chart/">Chart::Base - </ulink> - (&min-chart-base-ver;) for bug charting - </para> - </listitem> - - <listitem> - <para> - XML::Parser - (&min-xml-parser-ver;) for the XML interface - </para> - </listitem> - - <listitem> - <para> - MIME::Parser - (&min-mime-parser-ver;) for the email interface - </para> - </listitem> - </orderedlist> - </para> -</listitem> - - -<listitem> - <para> - The web server of your choice. - <ulink url="http://www.apache.org/">Apache</ulink> - is highly recommended. - </para> -</listitem> - - - </orderedlist> - <warning> - <para>It is a good idea, while installing Bugzilla, to ensure that there - is some kind of firewall between you and the rest of the Internet, - because your machine may be insecure for periods during the install. - Many + <para>While installing Bugzilla, it is a good idea to ensure that there + is some kind of firewall between you and the rest of the Internet + as your machine may be insecure for periods during the install. Many installation steps require an active Internet connection to complete, but you must take care to ensure that at no point is your machine vulnerable to an attack.</para> </warning> + <para>This guide assumes that you already have your operating system + installed, network configured, and have administrative access to the + shell on the machine you are installing Bugzilla onto. It is possible to + install and run Bugzilla without administrative access, but you have to + either make sure all the required software is installed or get somebody + with administrative access to install it for you. </para> - </section> + + <para>The listing below is a basic step-by-step list. More information + can be found in the sections below. Minimum versions will be + included in parenthesis where appropriate. + </para> + + <procedure> + <step> + <para><link linkend="install-mysql">Install MySQL</link> + (&min-mysql-ver;) + </para> + </step> + <step> + <para><link linkend="install-perl">Install Perl</link> + (&min-perl-ver;) + </para> + </step> + <step> + <para><link linkend="install-perlmodules">Install Perl Modules</link> + </para> + </step> + <step> + <para><link linkend="install-webserver">Install a Webserver</link> + </para> + </step> + <step> + <para><link linkend="install-bzfiles">Put Bugzilla in the Webspace</link> + </para> + </step> + <step> + <para><link linkend="install-setupdatabase">Setup the MySQL Database</link> + </para> + </step> + </procedure> <section id="install-mysql"> <title>MySQL</title> <para>Visit the MySQL homepage at - <ulink url="http://www.mysql.com">www.mysql.com</ulink> + <ulink url="http://www.mysql.com"/> to grab and install the latest stable release of the server. </para> <note> <para> Many of the binary versions of MySQL store their data files in - <filename>/var</filename>. + <filename class="directory">/var</filename>. On some Unix systems, this is part of a smaller root partition, and may not have room for your bug database. You can set the data directory as an option to <filename>configure</filename> if you build MySQL from source yourself.</para> </note> - <para>If you install from something other than an RPM or Debian - package, you will need to add <filename>mysqld</filename> - to your init scripts so the server daemon will come back up whenever - your machine reboots. Further discussion of UNIX init sequences are - beyond the scope of this guide. + <para>If you install from something other than a packaging/installation + system (such as .rpm, .dep, .exe, or .msi) you will need to configure + your system so the MySQL server daemon will come back up whenever + your machine reboots. </para> - <para>Change your init script to start - <filename>mysqld</filename> - with the ability to accept large packets. By default, - <filename>mysqld</filename> - only accepts packets up to 64K long. This limits the size of - attachments you may put on bugs. If you add - <option>-O max_allowed_packet=1M</option> - to the command that starts - <filename>mysqld</filename> - (or <filename>safe_mysqld</filename>), - then you will be able to have attachments up to about 1 megabyte. - There is a Bugzilla parameter for maximum attachment size; - you should configure it to match the value you choose here.</para> - - <para>If you plan on running Bugzilla and MySQL on the same machine, - consider using the - <option>--skip-networking</option> - option in the init script. This enhances security by preventing - network access to MySQL.</para> - + <para>If you wish to have attachments larger than 64K, you will have to + configure MySQL to accept large packets. This is done by adding the text + in <xref linkend="install-mysql-packets"/> to your + <filename>my.conf</filename> file. There is also a parameter in Bugzilla + for setting the maximum allowable attachment size. + <!-- TODO: xref to a param() page for max attachment size --> + You should set this value to be slightly larger than that parameter. + </para> + + <figure id="install-mysql-packets"> + <title>Set Max Packet Size in MySQL</title> + + <programlisting> +[mysqld] +# Allow packets up to 1M +set-variable = max_allowed_packet=1M + </programlisting> + </figure> + + <para>If you are running Bugzilla and MySQL on the same machine, you may + also wish to utilize the <option>skip-networking</option> option as + mentioned in <xref linkend="security-mysql"/> for the added security. + </para> </section> <section id="install-perl"> <title>Perl</title> <para>Any machine that doesn't have Perl on it is a sad machine indeed. - Perl can be got in source form from - <ulink url="http://www.perl.com">perl.com</ulink> for the rare - *nix systems which don't have it. + Perl can be got in source form from <ulink url="http://www.perl.com"/>. + There are also binary versions available for many platforms, most of which + are linked to from perl.com. Although Bugzilla runs with perl &min-perl-ver;, it's a good idea to be up to the very latest version if you can when running Bugzilla. As of this writing, that is Perl version &newest-perl-ver;.</para> + </section> - <tip id="bundlebugzilla" - xreflabel="Using Bundle::Bugzilla instead of manually installing Perl modules"> - - <para>You can skip the following Perl module installation steps by - installing - <productname>Bundle::Bugzilla</productname> + <section id="install-perlmodules"> + <title>Perl Modules</title> + + <para>Perl modules can be found using + <glossterm linkend="gloss-cpan">CPAN</glossterm> on Unix based systems or + <glossterm linkend="gloss-ppm">PPM</glossterm> on Win32. The root servers + have a real tendency to bog down, so please use mirrors. + </para> + + <para>Good instuctions can be found for using each of these services on + their respective websites. The basics can be found in + <xref linkend="install-perlmodules-cpan"/> for CPAN and + <xref linkend="win32-perlmodules"/> for PPM. + </para> - from - <glossterm linkend="gloss-cpan">CPAN</glossterm>, - which installs all required modules for you.</para> + <example id="install-perlmodules-cpan"> + <title>Installing perl modules with CPAN</title> - <para> - <computeroutput> - <prompt>bash#</prompt> + <para>The easy way: + <screen> +<prompt>bash#</prompt> perl -MCPAN -e 'install "<modulename>"' + </screen> + </para> - <command>perl -MCPAN -e 'install "Bundle::Bugzilla"'</command> - </computeroutput> + <para>Or the hard way: + <screen> +<prompt>bash#</prompt> tar xzvf <module>.tar.gz <co id="cpan-moduletar"/> +<prompt>bash#</prompt> cd <module> <co id="cpan-moduledir"/> +<prompt>bash#</prompt> perl Makefile.PL +<prompt>bash#</prompt> make +<prompt>bash#</prompt> make test +<prompt>bash#</prompt> make install + </screen> + <calloutlist> + <callout arearefs="cpan-moduletar"> + <para>This assumes that you've already downloaded the + <filename><module>.tar.gz</filename> to the current working + directory. + </para> + </callout> + <callout arearefs="cpan-moduledir"> + <para>The process of untaring the module as defined in + <xref linkend="cpan-moduletar"/> will create the + <filename class="directory"><module></filename> directory. + </para> + </callout> + </calloutlist> </para> + </example> - <para>Bundle::Bugzilla doesn't include GD, Chart::Base, or - MIME::Parser, which are not essential to a basic Bugzilla install. If - installing this bundle fails, you should install each module - individually to isolate the problem.</para> + <tip> + <para>Many people complain that Perl modules will not install for + them. Most times, the error messages complain that they are missing a + file in + <quote>@INC</quote>. + Virtually every time, this error is due to permissions being set too + restrictively for you to compile Perl modules or not having the + necessary Perl development libraries installed on your system. + Consult your local UNIX systems administrator for help solving these + permissions issues; if you + <emphasis>are</emphasis> + the local UNIX sysadmin, please consult the newsgroup/mailing list + for further assistance or hire someone to help you out.</para> </tip> - </section> - - <section id="perl-modules"> - <title>Perl Modules</title> - - <para> - All Perl modules can be found on the - <ulink url="http://www.cpan.org">Comprehensive Perl - Archive Network</ulink> (CPAN). The - CPAN servers have a real tendency to bog down, so please use mirrors. - </para> - - <para>Quality, general Perl module installation instructions can be - found on the CPAN website, but the easy thing to do is to just use the - CPAN shell which does all the hard work for you. - To use the CPAN shell to install a module: - </para> - <para> - <computeroutput> - <prompt>bash#</prompt> - <command>perl -MCPAN -e 'install "<modulename>"'</command> - </computeroutput> - </para> - - <para> - To do it the hard way: - </para> - - <para>Untar the module tarball -- it should create its own - directory</para> - <para>CD to the directory just created, and enter the following - commands: + <para>Perl Modules (minimum version): <orderedlist> + + <!-- TODO: Don't think we actually care about AppConfig anymore --> <listitem> <para> - <computeroutput> - <prompt>bash#</prompt> + <link linkend="install-modules-bundle-bugzilla">Bundle::Bugzilla</link> + (Will allow you to skip the rest) + </para> + </listitem> - <command>perl Makefile.PL</command> - </computeroutput> + <listitem> + <para> + <link linkend="install-modules-appconfig">AppConfig</link> + (&min-appconfig-ver;) </para> </listitem> <listitem> <para> - <computeroutput> - <prompt>bash#</prompt> + <link linkend="install-modules-cgi">CGI</link> + (&min-cgi-ver;) + </para> + </listitem> - <command>make</command> - </computeroutput> + <listitem> + <para> + <link linkend="install-modules-data-dumper">Data::Dumper</link> + (&min-data-dumper-ver;) </para> </listitem> <listitem> <para> - <computeroutput> - <prompt>bash#</prompt> + <link linkend="install-modules-date-format">Date::Format</link> + (&min-date-format-ver;) + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-dbi">DBI</link> + (&min-dbi-ver;) + </para> + </listitem> - <command>make test</command> - </computeroutput> + <listitem> + <para> + <link linkend="install-modules-dbd-mysql">DBD::mysql</link> + (&min-dbd-mysql-ver;) </para> </listitem> <listitem> <para> - <computeroutput> - <prompt>bash#</prompt> + <link linkend="install-file-spec">File::Spec</link> + (&min-file-spec-ver;) + </para> + </listitem> - <command>make install</command> - </computeroutput> + <listitem> + <para> + <link linkend="install-modules-file-temp">File::Temp</link> + (&min-file-temp-ver;) + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-template">Template Toolkit</link> + (&min-template-ver;) + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-text-wrap">Text::Wrap</link> + (&min-text-wrap-ver;) </para> </listitem> </orderedlist> + + and, optionally: + <orderedlist> + <listitem> + <para> + <link linkend="install-modules-gd">GD</link> + (&min-gd-ver;) for bug charting + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-chart-base">Chart::Base</link> + (&min-chart-base-ver;) for bug charting + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-xml-parser">XML::Parser</link> + (&min-xml-parser-ver;) for the XML interface + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-gd-graph">GD::Graph</link> + (&min-gd-graph-ver;) for bug charting + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-gd-text-align">GD::Text::Align</link> + (&min-gd-text-align-ver;) for bug charting + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-mime-parser">MIME::Parser</link> + (&min-mime-parser-ver;) for the email interface + </para> + </listitem> + + <listitem> + <para> + <link linkend="install-modules-patchreader">PatchReader</link> + (&min-patchreader-ver;) for pretty HTML view of patches + </para> + </listitem> + </orderedlist> </para> - - <warning> - <para>Many people complain that Perl modules will not install for - them. Most times, the error messages complain that they are missing a - file in - <quote>@INC</quote>. - Virtually every time, this error is due to permissions being set too - restrictively for you to compile Perl modules or not having the - necessary Perl development libraries installed on your system. - Consult your local UNIX systems administrator for help solving these - permissions issues; if you - <emphasis>are</emphasis> - the local UNIX sysadmin, please consult the newsgroup/mailing list - for further assistance or hire someone to help you out.</para> - </warning> - <section> - <title>DBI</title> + <section id="install-modules-bundle-bugzilla"> + <title>Bundle::Bugzilla</title> + + <para>If you are running at least perl 5.6.1, you can save yourself a lot + of time by using Bundle::Bugzilla. This bundle contains every module + required to get Bugzilla running. It does not include GD and friends, but + these are not required for a base install and can always be added later + if the need arises. + </para> + + <para>Assuming your perl was installed with CPAN (most unix installations + are), using Bundle::Bugzilla is really easy. Simply follow along with the + commands below. + </para> + + + <screen> +<prompt>bash#</prompt> <command>perl -MCPAN -eshell</command> <co id="bundle-cpanconfig"/> +cpan shell -- CPAN exploration and modules installation (v1.63) +ReadLine support enabled + +<prompt>cpan></prompt> + + </screen> + + <calloutlist> + <callout arearefs="bundle-cpanconfig"> + <para>At this point, unless you've used CPAN on this machine before, + you'll have to go through a series of configuration steps. + </para> + </callout> + </calloutlist> + </section> + + <section id="install-modules-appconfig"> + <title>AppConfig (&min-appconfig-ver;)</title> + + <para>Dependency for Template Toolkit. We probably don't need to + specifically check for it anymore. + </para> + </section> + + <section id="install-modules-cgi"> + <title>CGI (&min-cgi-ver;)</title> + + <para>The CGI module parses form elements and cookies and does many + other usefule things. It come as a part of recent perl distributions, but + Bugzilla needs a fairly new version. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/CGI.pm/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/CGI.zip"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.8.0/lib/CGI.html"/> + </literallayout> + </section> + + <section id="install-modules-data-dumper"> + <title>Data::Dumper (&min-data-dumper-ver;)</title> + + <para>The Data::Dumper module provides data structure persistence for + Perl (similar to Java's serialization). It comes with later + sub-releases of Perl 5.004, but a re-installation just to be sure it's + available won't hurt anything. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/Data-Dumper/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Data-Dumper.zip"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.8.0/lib/Data/Dumper.html"/> + </literallayout> + </section> + + <section id="install-modules-date-format"> + <title>TimeDate modules (&min-date-format-ver;)</title> + + <para>Many of the more common date/time/calendar related Perl modules + have been grouped into a bundle similar to the MySQL modules bundle. + This bundle is stored on the CPAN under the name TimeDate. + The component module we're most interested in is the Date::Format + module, but installing all of them is probably a good idea anyway. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/TimeDate/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/TimeDate.zip"/> + Documentation: <ulink url="http://search.cpan.org/dist/TimeDate/lib/Date/Format.pm"/> + </literallayout> + </section> + + <section id="install-modules-dbi"> + <title>DBI (&min-dbi-ver;)</title> <para>The DBI module is a generic Perl module used the MySQL-related modules. As long as your Perl installation was done correctly the DBI module should be a breeze. It's a mixed Perl/C module, but Perl's MakeMaker system simplifies the C compilation greatly.</para> - </section> - - <section> - <title>Data::Dumper</title> - <para>The Data::Dumper module provides data structure persistence for - Perl (similar to Java's serialization). It comes with later - sub-releases of Perl 5.004, but a re-installation just to be sure it's - available won't hurt anything.</para> + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/DBI/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBI.zip"/> + Documentation: <ulink url="http://dbi.perl.org/doc/"/> + </literallayout> </section> - <section> + <section id="install-modules-dbd-mysql"> <title>MySQL-related modules</title> <para>The Perl/MySQL interface requires a few mutually-dependent Perl @@ -419,24 +463,77 @@ with a null password should find itself with sufficient access to run tests on the 'test' database which MySQL created upon installation. </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/DBD-mysql/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/DBD-Mysql.zip"/> + Documentation: <ulink url="http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pod"/> + </literallayout> </section> - <section> - <title>TimeDate modules</title> + <section id="install-file-spec"> + <title>File::Spec (&min-file-spec-ver;)</title> - <para>Many of the more common date/time/calendar related Perl modules - have been grouped into a bundle similar to the MySQL modules bundle. - This bundle is stored on the CPAN under the name TimeDate. - The component module we're most interested in is the Date::Format - module, but installing all of them is probably a good idea anyway. + <para>File::Spec is a perl module that allows file operations, such as + generating full path names, to work cross platform. </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/File-Spec/"/> + PPM Download Page: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.8.0/lib/File/Spec.html"/> + </literallayout> </section> - <section> - <title>GD (optional)</title> + <section id="install-modules-file-temp"> + <title>File::Temp (&min-file-temp-ver;)</title> + + <para>File::Temp is used to generate a temporary filename that is + guaranteed to be unique. It comes as a standard part of perl + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/File-Spec/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/File-Spec.zip"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.8.0/lib/File/Temp.html"/> + </literallayout> + </section> + + <section id="install-modules-template"> + <title>Template Toolkit (&min-template-ver;)</title> + + <para>When you install Template Toolkit, you'll get asked various + questions about features to enable. The defaults are fine, except + that it is recommended you use the high speed XS Stash of the Template + Toolkit, in order to achieve best performance. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/Template-Toolkit/"/> + PPM Download Link: <ulink url="http://openinteract.sourceforge.net/ppmpackages/5.6/Template-Toolkit.tar.gz"/> + Documentation: <ulink url="http://www.template-toolkit.org/docs.html"/> + </literallayout> + </section> + + <section id="install-modules-text-wrap"> + <title>Text::Wrap (&min-text-wrap-ver;)</title> + + <para>Text::Wrap is designed to proved intelligent text wrapping. + </para> + + <!-- TODO: Text::Wrap doesn't seem to be available from ActiveState --> + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/Text-Tabs+Wrap/"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.8.0/lib/Text/Wrap.html"/> + </literallayout> + </section> + + + <section id="install-modules-gd"> + <title>GD (&min-gd-ver;) [optional]</title> <para>The GD library was written by Thomas Boutell a long while ago to - programatically generate images in C. Since then it's become the + programmatically generate images in C. Since then it's become the defacto standard for programmatic image construction. The Perl bindings to it found in the GD library are used on millions of web pages to generate graphs on the fly. That's what Bugzilla will be using it for @@ -452,32 +549,118 @@ If compiling GD fails, it's probably because you're missing a required library.</para> </note> + + <tip> + <para>The version of the GD perl module you need is very closely tied + to the <classname>libgd</classname> version installed on your system. + If you have a version 1.x of <classname>libgd</classname> the 2.x + versions of the GD perl module won't work for you. + </para> + </tip> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/GD/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GD.zip"/> + Documentation: <ulink url="http://stein.cshl.org/WWW/software/GD/"/> + </literallayout> </section> - <section> - <title>Chart::Base (optional)</title> + <section id="install-modules-chart-base"> + <title>Chart::Base (&min-chart-base-ver;) [optional]</title> <para>The Chart module provides Bugzilla with on-the-fly charting abilities. It can be installed in the usual fashion after it has been fetched from CPAN. Note that earlier versions that 0.99c used GIFs, which are no longer supported by the latest versions of GD.</para> + + <!-- TODO: Chart::Base doesn't seem to have any documentation --> + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/Chart/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/Chart.zip"/> + </literallayout> </section> - - <section> - <title>Template Toolkit</title> - <para>When you install Template Toolkit, you'll get asked various - questions about features to enable. The defaults are fine, except - that it is recommended you use the high speed XS Stash of the Template - Toolkit, in order to achieve best performance. + <section id="install-modules-xml-parser"> + <title>XML::Parser (&min-xml-parser-ver;) [Optional]</title> + + <para>XML::Parser is used by the <filename>importxml.pl</filename> + script. You only need it if you are going to be importing bugs (such as + for bug moving). XML::Parser requires that the + <classname>expat</classname> library is already installed on your machine. </para> - </section> - + <!-- TODO: XML::Parser - the only PPM I see is XML-Parser-EasyTree.zip; + I'm not sure if it's the same thing or not. --> + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/XML-Parser/"/> + Documentation: <ulink url="http://www.perldoc.com/perl5.6.1/lib/XML/Parser.html"/> + </literallayout> + </section> + + <section id="install-modules-gd-graph"> + <title>GD::Graph (&min-gd-graph-ver;) [Optional]</title> + + <para>In addition to GD listed above, the reporting interface of Bugzilla + needs to have the GD::Graph module installed. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/GDGraph/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDGraph.zip"/> + Documentation: <ulink url="http://search.cpan.org/dist/GDGraph/Graph.pm"/> + </literallayout> + </section> + + <section id="install-modules-gd-text-align"> + <title>GD::Text::Align (&min-gd-text-align-ver;) [Optional]</title> + + <para>GD::Text::Align, as the name implies, is used to draw aligned + strings of text. It is needed by the reporting interface. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/GDTextUtil/"/> + PPM Download Page: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/GDTextUtil.zip"/> + Documentation: <ulink url="http://search.cpan.org/dist/GDTextUtil/Text/Align.pm"/> + </literallayout> + </section> + + <section id="install-modules-mime-parser"> + <title>MIME::Parser (&min-mime-parser-ver;) [Optional]</title> + + <para>MIME::Parser is only needed if you want to use the e-mail interface + located in the <filename class="directory">contrib</filename> directory. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/dist/MIME-tools/"/> + PPM Download Link: <ulink url="http://ppm.activestate.com/PPMPackages/zips/6xx-builds-only/MIME-tools.zip"/> + Documentation: <ulink url="http://search.cpan.org/dist/MIME-tools/lib/MIME/Parser.pm"/> + </literallayout> + </section> + + <section id="install-modules-patchreader"> + <title>PatchReader (&min-patchreader-ver;) [Optional]</title> + + <para>PatchReader is only needed if you want to use Patch Viewer, a + Bugzilla feature to format patches in a pretty HTML fashion. There are a + number of optional parameters you can configure Patch Viewer with as well, + including cvsroot, cvsroot_get, lxr_root, bonsai_url, lxr_url, and + lxr_root. Patch Viewer also optionally will use cvs, diff and interdiff + utilities if they exist on the system (interdiff can be found in the + patchutils package at <ulink url="http://cyberelk.net/tim/patchutils/"/>. + These programs' locations can be configured in localconfig. + </para> + + <literallayout> + CPAN Download Page: <ulink url="http://search.cpan.org/author/JKEISER/PatchReader/"/> + Documentation: <ulink url="http://www.johnkeiser.com/mozilla/Patch_Viewer.html"/> + </literallayout> + </section> </section> - <section id="sbs-http"> + <section id="install-webserver"> <title>HTTP Server</title> <para>You have freedom of choice here, pretty much any web server that @@ -490,12 +673,13 @@ <para>We strongly recommend Apache as the web server to use. The Bugzilla Guide installation instructions, in general, assume you are using Apache. If you have got Bugzilla working using another webserver, - please share your experiences with us.</para> + please share your experiences with us by filing a bug in &bzg-bugs;. + </para> </note> </section> - <section> + <section id="install-bzfiles"> <title>Bugzilla</title> <para>You should untar the Bugzilla files into a directory that you're @@ -522,94 +706,63 @@ until you run the post-install <filename>checksetup.pl</filename> script, which locks down your installation.</para> + + <caution> + <para>The default Bugzilla distribution is not designed to be placed + in a <filename class="directory">cgi-bin</filename> directory (this + includes any directory which is configured using the + <option>ScriptAlias</option> directive of Apache). This will probably + change as part of + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=44659">bug + 44659</ulink>. + </para> + </caution> </section> - <section> + <section id="install-setupdatabase"> <title>Setting Up the MySQL Database</title> <para>After you've gotten all the software installed and working you're ready to start preparing the database for its life as the back end to a high quality bug tracker.</para> - <para>First, you'll want to fix MySQL permissions to allow access from - Bugzilla. For the purpose of this Installation section, the Bugzilla - username will be - <quote>bugs</quote>, and will have minimal permissions. + <para>This first thing you'll want to do is make sure you've given the + <quote>root</quote> user a password as suggested in + <xref linkend="security-mysql"/>. For clarity, these instructions will + assume that your MySQL user for Bugzilla will be <quote>bugs_user</quote>, + the database will be called <quote>bugs_db</quote> and the password for + the <quote>bugs_user</quote> user is <quote>bugs_password</quote>. You + should, of course, substitute the values you intend to use for your site. </para> - <para>Begin by giving the MySQL root user a password. MySQL passwords are limited - to 16 characters. - <simplelist> - <member> - <computeroutput> - <prompt>bash#</prompt> - - <command>mysql -u root mysql</command> - </computeroutput> - </member> - - <member> - <computeroutput> - <prompt>mysql></prompt> - - <command>UPDATE user SET Password=PASSWORD('<new_password'>) - WHERE user='root';</command> - </computeroutput> - </member> - - <member> - <computeroutput> - <prompt>mysql></prompt> - - <command>FLUSH PRIVILEGES;</command> - </computeroutput> - </member> - </simplelist> - - From this point on, if you need to access MySQL as the MySQL root user, - you will need to use - <command>mysql -u root -p</command> - - and enter <new_password>. Remember that MySQL user names have - nothing to do with Unix user names (login names).</para> + <note> + <para>Most people use <quote>bugs</quote> for both the user and + database name. + </para> + </note> <para>Next, we use an SQL <command>GRANT</command> command to create a - <quote>bugs</quote> - + <quote>bugs_user</quote> user, and grant sufficient permissions for checksetup.pl, which we'll use later, to work its magic. This also restricts the - <quote>bugs</quote> + <quote>bugs_user</quote> user to operations within a database called - <quote>bugs</quote>, and only allows the account to connect from + <quote>bugs_db</quote>, and only allows the account to connect from <quote>localhost</quote>. Modify it to reflect your setup if you will be connecting from another machine or as a different user.</para> - <para>Remember to set <bugs_password> to some unique password. - <simplelist> - <member> - <computeroutput> - <prompt>mysql></prompt> - - <command>GRANT SELECT,INSERT,UPDATE,DELETE,INDEX, - ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost - IDENTIFIED BY '<bugs_password>';</command> - </computeroutput> - </member> - - <member> - <computeroutput> - <prompt>mysql></prompt> - - <command>FLUSH PRIVILEGES;</command> - </computeroutput> - </member> - </simplelist> - </para> + <screen> +<prompt>mysql></prompt> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,ALTER,CREATE, + DROP,REFERENCES ON bugs_db.* TO bugs_user@localhost + IDENTIFIED BY 'bugs_password'; +<prompt>mysql></prompt> FLUSH PRIVILEGES; + </screen> <note> <para>If you are using MySQL 4, the bugs user also needs to be granted - the LOCK TABLES and CREATE TEMPORARY TABLES permissions. + the <computeroutput>LOCK TABLES</computeroutput> and + <computeroutput>CREATE TEMPORARY TABLES</computeroutput> permissions. </para> </note> </section> @@ -620,24 +773,22 @@ </title> <para>Next, run the magic checksetup.pl script. (Many thanks to - <ulink url="mailto:holgerschurig@nikocity.de">Holger Schurig </ulink> + <ulink url="mailto:holgerschurig@nikocity.de">Holger Schurig</ulink> for writing this script!) - This script is designed to make sure your MySQL database and other + This script is designed to make sure your perl modules are the correct + version and your MySQL database and other configuration options are consistent with the Bugzilla CGI files. It will make sure Bugzilla files and directories have reasonable permissions, set up the <filename>data</filename> directory, and create all the MySQL tables. - <simplelist> - <member> - <computeroutput> - <prompt>bash#</prompt> + </para> - <command>./checksetup.pl</command> - </computeroutput> - </member> - </simplelist> + <screen> +<prompt>bash#</prompt> ./checksetup.pl + </screen> + <para> The first time you run it, it will create a file called <filename>localconfig</filename>.</para> @@ -654,20 +805,20 @@ <listitem> <para>database name: - <quote>bugs</quote> + <quote>bugs_db</quote> if you're following these directions</para> </listitem> <listitem> <para>MySQL username: - <quote>bugs</quote> + <quote>bugs_user</quote> if you're following these directions</para> </listitem> <listitem> <para>Password for the - <quote>bugs</quote> - MySQL account; (<bugs_password>) above</para> + <quote>bugs_user</quote> + MySQL account; (<quote>bugs_password</quote> above)</para> </listitem> </orderedlist> </para> @@ -809,15 +960,22 @@ man 5 crontab <section id="bzldap"> <title>LDAP Authentication</title> - <para> - <warning> - <para>This information on using the LDAP - authentication options with Bugzilla is old, and the authors do - not know of anyone who has tested it. Approach with caution. + + <note> + <para>LDAP authentication has been rewritten for the 2.18 release of + Bugzilla. It no longer requires the Mozilla::LDAP module and now uses + Net::LDAP instead. This rewrite was part of a larger landing that + allowed for additional authentication schemes to be easily added + (<ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=180642">bug + 180642</ulink>). + </para> + <![%bz-devel;[ + <para>This patch originally landed in 21-Mar-2003 and was included + in the 2.17.4 development release. </para> - </warning> - </para> - + ]]> + </note> + <para> The existing authentication scheme for Bugzilla uses email addresses as the primary user ID, and a @@ -836,63 +994,101 @@ man 5 crontab email address, not LDAP username. You still assign bugs by email address, query on users by email address, etc. </para> + + <caution> + <para>Because the Bugzilla account is not created until the first time + a user logs in, a user who has not yet logged is unknown to Bugzilla. + This means they cannot be used as an assignee or QA contact (default or + otherwise), added to any cc list, or any other such operation. One + possible workaround is the <filename>bugzilla_ldapsync.rb</filename> + script in the + <glossterm linkend="gloss-contrib"><filename class="directory">contrib</filename></glossterm> directory. Another possible solution is fixing + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=201069">bug + 201069</ulink>. + </para> + </caution> - <para>Using LDAP for Bugzilla authentication requires the - Mozilla::LDAP (aka PerLDAP) Perl module. The - Mozilla::LDAP module in turn requires Netscape's Directory SDK for C. - After you have installed the SDK, then install the PerLDAP module. - Mozilla::LDAP and the Directory SDK for C are both - <ulink url="http://www.mozilla.org/directory/">available for - download</ulink> from mozilla.org. - </para> - - <para> - Set the Param 'useLDAP' to "On" **only** if you will be using an LDAP - directory for - authentication. Be very careful when setting up this parameter; if you - set LDAP authentication, but do not have a valid LDAP directory set up, - you will not be able to log back in to Bugzilla once you log out. (If - this happens, you can get back in by manually editing the data/params - file, and setting useLDAP back to 0.) - </para> - - <para>If using LDAP, you must set the - three additional parameters: Set LDAPserver to the name (and optionally - port) of your LDAP server. If no port is specified, it defaults to the - default port of 389. (e.g "ldap.mycompany.com" or - "ldap.mycompany.com:1234") Set LDAPBaseDN to the base DN for searching - for users in your LDAP directory. (e.g. "ou=People,o=MyCompany") uids - must be unique under the DN specified here. Set LDAPmailattribute to - the name of the attribute in your LDAP directory which contains the - primary email address. On most directory servers available, this is - "mail", but you may need to change this. - </para> - - <para>You can also try using <ulink url="http://www.openldap.org/"> - OpenLDAP</ulink> with Bugzilla, using any of a number of administration - tools. You should apply the patch attached this bug: - <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=158630"> - http://bugzilla.mozilla.org/show_bug.cgi?id=158630</ulink>, then set - the following object classes for your users: + <para>Parameters required to use LDAP Authentication:</para> - <orderedlist> - <listitem><para>objectClass: person</para></listitem> - <listitem><para>objectClass: organizationalPerson</para></listitem> - <listitem><para>objectClass: inetOrgPerson</para></listitem> - <listitem><para>objectClass: top</para></listitem> - <listitem><para>objectClass: posixAccount</para></listitem> - <listitem><para>objectClass: shadowAccount</para></listitem> - </orderedlist> + <variablelist> + <varlistentry id="param-loginmethod"> + <term>loginmethod</term> + <listitem> + <para>This parameter should be set to <quote>LDAP</quote> + <emphasis>only</emphasis> if you will be using an LDAP directory + for authentication. If you set this param to <quote>LDAP</quote> but + fail to set up the other parameters listed below you will not be + able to log back in to Bugzilla one you log out. If this happens + to you, you will need to manually edit + <filename>data/params</filename> and set loginmethod to + <quote>DB</quote>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="param-LDAPserver"> + <term>LDAPserver</term> + <listitem> + <para>This parameter should be set to the name (and optionally the + port) of your LDAP server. If no port is specified, it assumes + the default LDAP port of 389. + </para> + <para>Ex. <quote>ldap.company.com</quote> + or <quote>ldap.company.com:3268</quote> + </para> + </listitem> + </varlistentry> + + <varlistentry id="param-LDAPbinddn"> + <term>LDAPbinddn [Optional]</term> + <listitem> + <para>Some LDAP servers will not allow an anonymous bind to search + the directory. If this is the case with your configuration you + should set the LDAPbinddn parameter to the user account Bugzilla + should use instead of the anonymous bind. + </para> + <para>Ex. <quote>cn=default,cn=user:password</quote></para> + </listitem> + </varlistentry> + + <varlistentry id="param-LDAPBaseDN"> + <term>LDAPBaseDN</term> + <listitem> + <para>The LDAPBaseDN parameter should be set to the location in + your LDAP tree that you would like to search for e-mail addresses. + Your uids should be unique under the DN specified here. + </para> + <para>Ex. <quote>ou=People,o=Company</quote></para> + </listitem> + </varlistentry> + + <varlistentry id="param-LDAPuidattribute"> + <term>LDAPuidattribute</term> + <listitem> + <para>The LDAPuidattribute parameter should be set to the attribute + which contains the unique UID of your users. The value retrieved + from this attribute will be used when attempting to bind as the + user to confirm their password. + </para> + <para>Ex. <quote>uid</quote></para> + </listitem> + </varlistentry> + + <varlistentry id="param-LDAPmailattribute"> + <term>LDAPmailattribute</term> + <listitem> + <para>The LDAPmailattribute parameter should be the name of the + attribute which contains the e-mail address your users will enter + into the Bugzilla login boxes. + </para> + <para>Ex. <quote>mail</quote></para> + </listitem> + </varlistentry> + </variablelist> - Please note that this patch <emphasis>has not</emphasis> yet been - accepted by the Bugzilla team, and so you may need to do some - manual tweaking. That said, it looks like Net::LDAP is probably - the way to go in the future. - </para> </section> - <section id="content-type" - xreflabel="Preventing untrusted Bugzilla content from executing malicious Javascript code"> + <section id="content-type"> <title>Preventing untrusted Bugzilla content from executing malicious Javascript code</title> @@ -902,38 +1098,33 @@ man 5 crontab incorporate the code changes necessary to fulfill the CERT advisory requirements mentioned in <ulink - url="http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3"> - http://www.cet.org/tech_tips/malicious_code_mitigation.html/#3</ulink>. - Executing the following code snippet from a UNIX command shell will - rectify the problem if your Bugzilla installation is intended for an - English-speaking audience. As always, be sure your Bugzilla - installation has a good backup before making changes, and I recommend - you understand what the script is doing before executing it.</para> - - <para> - <programlisting> -bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; charset=ISO-8859-1/i" *.cgi *.pl - </programlisting> + url="http://www.cert.org/tech_tips/malicious_code_mitigation.html/#3"/>. + Making the change below will fix the problem if your installation is for + an English speaking audience. </para> - <para>All this one-liner command does is search for all instances of - <quote>Content-type: text/html</quote> - - and replaces it with - <quote>Content-Type: text/html; charset=ISO-8859-1</quote> + <para>Telling Bugzilla to output a charset as part of the HTTP header is + much easier in version 2.18 and higher<![%bz-devel;[ (including any cvs + pull after 4-May-2003 and development release after 2.17.5)]]> than it was + in previous versions. Simply locate the following line in + <filename>Bugzilla/CGI.pm</filename>: + <programlisting> + # Make sure that we don't send any charset headers + $self->charset(''); + </programlisting> + and change it to: + <programlisting> + # Send all data using the ISO-8859-1 charset + $self->charset('ISO-8859-1'); + </programlisting> + </para> - . This specification prevents possible Javascript attacks on the - browser, and is suggested for all English-speaking sites. For - non-English-speaking Bugzilla sites, I suggest changing - <quote>ISO-8859-1</quote>, above, to - <quote>UTF-8</quote>.</para> - <note> <para>Using <meta> tags to set the charset is not recommended, as there's a bug in Netscape 4.x which causes pages - marked up in this way to load twice. See - <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=126266">bug - 126266</ulink> for more information including progress toward making + marked up in this way to load twice. See + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=126266">bug 126266</ulink> + for more information including progress toward making bugzilla charset aware by default. </para> </note> @@ -977,8 +1168,7 @@ bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; chars which can limit connections by ip-address. You may download this module at - <ulink url="http://www.snert.com/Software/Throttle/"> - http://www.snert.com/Software/Throttle/</ulink>. + <ulink url="http://www.snert.com/Software/mod_throttle/"/>. Follow the instructions to install into your Apache install. <emphasis>This module only functions with the Apache web server!</emphasis> @@ -986,7 +1176,7 @@ bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; chars <command>ThrottleClientIP</command> command provided by this module to accomplish this goal. See the - <ulink url="http://www.snert.com/Software/Throttle/">Module + <ulink url="http://www.snert.com/Software/mod_throttle/">Module Instructions</ulink> for more information.</para> </section> @@ -1033,16 +1223,17 @@ bash# perl -pi -e "s/Content-Type\: text\/html/Content-Type\: text\/html\; chars <para>Perl for Windows can be obtained from <ulink url="http://www.activestate.com/">ActiveState</ulink>. You should be able to find a compiled binary at <ulink - url="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/">http://aspn.activestate.com/ASPN/Downloads/ActivePerl/</ulink>. + url="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/"/>. </para> </section> - <section id="win32-perl-modules"> + <section id="win32-perlmodules"> <title>Perl Modules on Win32</title> <para>Bugzilla on Windows requires the same perl modules found in - <xref linkend="install-package-list"/>. The main difference is that - windows uses <command>ppm</command> instead of CPAN. + <xref linkend="install-perlmodules"/>. The main difference is that + windows uses <glossterm linkend="gloss-ppm">PPM</glossterm> instead of + CPAN. </para> <programlisting> @@ -1060,7 +1251,7 @@ C:\perl> <command>ppm <module name></command> <tip> <para>A complete list of modules that can be installed using ppm can - be found at <ulink url="http://www.activestate.com/PPMPackages/5.6plus">http://www.activestate.com/PPMPackages/5.6plus</ulink>. + be found at <ulink url="http://www.activestate.com/PPMPackages/5.6plus"/>. </para> </tip> </section> @@ -1100,6 +1291,46 @@ my $webservergid = '8' </programlisting> </section> + <section id="win32-code-bugmail"> + <title>Changes to <filename>BugMail.pm</filename></title> + + <para>To make bug e-mail work on Win32 (until + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=84876">bug + 84876</ulink> lands), the + simplest way is to have Net::SMTP installed and change this (in + <filename>Bugzilla/BugMail.pm</filename>):</para> + + <programlisting> +open(SENDMAIL, "|/usr/lib/sendmail $sendmailparam -t -i") || + die "Can't open sendmail"; + +print SENDMAIL trim($msg) . "\n"; +close SENDMAIL; + </programlisting> + <para>to</para> + <programlisting> +use Net::SMTP; +my $smtp_server = 'smtp.mycompany.com'; # change this + +# Use die on error, so that the mail will be in the 'unsent mails' and +# can be sent from the sanity check page. +my $smtp = Net::SMTP->new($smtp_server) || + die 'Cannot connect to server \'$smtp_server\''; + +$smtp->mail('bugzilla-daemon@mycompany.com'); # change this +$smtp->to($person); +$smtp->data(); +$smtp->datasend($msg); +$smtp->dataend(); +$smtp->quit; + </programlisting> + + <para>Don't forget to change the name of your SMTP server and the + domain of the sending e-mail address (after the '@') in the above + lines of code.</para> + + </section> + </section> <section id="win32-http"> @@ -1129,7 +1360,6 @@ my $webservergid = '8' <section id="os-macosx"> <title><productname>Mac OS X</productname></title> - <!-- TODO: Clean me up... (Mac OS X) --> <para>There are a lot of common libraries and utilities out there that Apple did not include with Mac OS X, but which run perfectly well on it. The GD library, which Bugzilla needs to do bug graphs, is one of @@ -1141,62 +1371,57 @@ my $webservergid = '8' <ulink url="http://sourceforge.net/projects/fink/"/>.</para> <para>Follow the instructions for setting up Fink. Once it's installed, - you'll want to run the following as root: - <command>fink install gd</command> + you'll want to use it to install the gd2 package. </para> <para>It will prompt you for a number of dependencies, type 'y' and hit - enter to install all of the dependencies. Then watch it work.</para> - - <para>To prevent creating conflicts with the software that Apple installs - by default, Fink creates its own directory tree at /sw where it installs - most of the software that it installs. This means your libraries and - headers for libgd will be at /sw/lib and /sw/include instead of /usr/lib - and /usr/local/include. Because of these changed locations for the - libraries, the Perl GD module will not install directly via CPAN, because it - looks for the specific paths instead of getting them from your - environment. But there's a way around that :-)</para> - - <para>Instead of typing - <quote>install GD</quote> - at the - <prompt>cpan></prompt> - prompt, type - <command>look GD</command>. - This should go through the motions of downloading the latest version of - the GD module, then it will open a shell and drop you into the build - directory. Apply <ulink url="../xml/gd-makefile.patch">this patch</ulink> - to the Makefile.PL file (save the - patch into a file and use the command - <command>patch < patchfile</command>.) + enter to install all of the dependencies and then watch it work. You will + then be able to use <glossterm linkend="gloss-cpan">CPAN</glossterm> to + install the GD perl module. </para> - - <para>Then, run these commands to finish the installation of the GD - module: - <simplelist> - <member> - <command>perl Makefile.PL</command> - </member> - - <member> - <command>make</command> - </member> - <member> - <command>make test</command> - </member> - - <member> - <command>make install</command> - </member> - - <member>And don't forget to run - <command>exit</command> + <note> + <para>To prevent creating conflicts with the software that Apple + installs by default, Fink creates its own directory tree at + <filename class="directory">/sw</filename> where it installs most of + the software that it installs. This means your libraries and headers be + at <filename class="directory">/sw/lib</filename> and + <filename class="directory">/sw/include</filename> instead of + <filename class="directory">/usr/lib</filename> and + <filename class="directory">/usr/local/include</filename>. When the + Perl module config script asks where your libgd is, be sure to tell it + <filename class="directory">/sw/lib</filename>. + </para> + </note> - to get back to CPAN.</member> - </simplelist> + <para>Also available via Fink is expat. Once running using fink to + install the expat package you will be able to install + XML::Parser using CPAN. There is one caveat. Unlike recent versions of + the GD module, XML::Parser doesn't prompt for the location of the + required libraries. When using CPAN, you will need to use the following + command sequence: </para> + <screen> +# perl -MCPAN -e'look XML::Parser' <co id="macosx-look"/> +# perl Makefile.PL EXPATLIBPATH=/sw/lib EXPATINCPATH=/sw/include +# make; make test; make install <co id="macosx-make"/> +# exit <co id="macosx-exit"/> + </screen> + <calloutlist> + <callout arearefs="macosx-look macosx-exit"> + <para>The look command will download the module and spawn a + new shell with the extracted files as the current working directory. + The exit command will return you to your original shell. + </para> + </callout> + <callout arearefs="macosx-make"> + <para>You should watch the output from these make commands, + especially <quote>make test</quote> as errors may prevent XML::Parser + from functioning correctly with Bugzilla. + </para> + </callout> + </calloutlist> </section> <section id="os-mandrake"> @@ -1214,7 +1439,7 @@ my $webservergid = '8' <prompt>bash#</prompt> <command>urpmi perl-mysql</command> <prompt>bash#</prompt> <command>urpmi perl-chart</command> <prompt>bash#</prompt> <command>urpmi perl-gd</command> -<prompt>bash#</prompt> <command>urpmi perl-MailTools</command> <co id="test-mailtools"/> +<prompt>bash#</prompt> <command>urpmi perl-MailTools</command> <co id="test-mailtools"/> <prompt>bash#</prompt> <command>urpmi apache-modules</command> </screen> <calloutlist> @@ -1363,7 +1588,7 @@ deny from all <productname>Personal Web Server</productname> you should be able to. You will need to configure them to know how to run CGI scripts, however. This is described in Microsoft Knowledge Base article - <ulink url="http://support.microsoft.com/support/kb/articles/Q245/2/25.asp">Q245225 </ulink> + <ulink url="http://support.microsoft.com/support/kb/articles/Q245/2/25.asp">Q245225</ulink> for <productname>Internet Information Services</productname> and <ulink url="http://support.microsoft.com/support/kb/articles/Q231/9/98.asp">Q231998</ulink> for <productname>Personal Web Server</productname>. @@ -1416,9 +1641,9 @@ proc filter_deny { why } { <warning> <para>This probably doesn't account for all possible editor backup files so you may wish to add some additional variations of - <filename>localconfig</filename>. For more information, see - <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=186383">bug - 186383</ulink> or <ulink + <filename>localconfig</filename>. For more information, see + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=186383"> + bug 186383</ulink> or <ulink url="http://online.securityfocus.com/bid/6501">Bugtraq ID 6501</ulink>. </para> </warning> diff --git a/docs/xml/integration.xml b/docs/xml/integration.xml index 514064d26ef9c0ed2e8c0304037ea60539402ba3..65451dc7559fcaa4446265632a40a07372aaac29 100644 --- a/docs/xml/integration.xml +++ b/docs/xml/integration.xml @@ -36,9 +36,7 @@ <para>There is also a CVSZilla project, based upon somewhat dated Bugzilla code, to integrate CVS and Bugzilla through CVS' ability to - email. Check it out at: - <ulink url="http://homepages.kcbbs.gen.nz/~tonyg/"> - http://homepages.kcbbs.gen.nz/~tonyg/</ulink>. + email. Check it out at: <ulink url="http://homepages.kcbbs.gen.nz/~tonyg/"/>. </para> </section> @@ -49,16 +47,14 @@ <para>You can find the project page for Bugzilla and Teamtrack Perforce integration (p4dti) at: - <ulink url="http://www.ravenbrook.com/project/p4dti/"> - http://www.ravenbrook.com/project/p4dti</ulink> + <ulink url="http://www.ravenbrook.com/project/p4dti/"/> . <quote>p4dti</quote> is now an officially supported product from Perforce, and you can find the "Perforce Public Depot" p4dti page at - <ulink url="http://public.perforce.com/public/perforce/p4dti/index.html"> - http://public.perforce.com/public/perforce/p4dti/index.html</ulink> + <ulink url="http://public.perforce.com/public/perforce/p4dti/index.html"/> .</para> diff --git a/docs/xml/patches.xml b/docs/xml/patches.xml index 84d83d3337d617a6b8b89f15344d43ba8d4ed3dc..b8c068fac51a0a6ce68db07f4d504e855dde9eff 100644 --- a/docs/xml/patches.xml +++ b/docs/xml/patches.xml @@ -37,7 +37,7 @@ RewriteRule ^/([0-9]+)$ http://foo.bar.com/show_bug.cgi?id=$1 [L,R] <listitem> <para>There are many, many more things you can do with mod_rewrite. Please refer to the mod_rewrite documentation at - <ulink url="http://www.apache.org">http://www.apache.org</ulink>. + <ulink url="http://www.apache.org"/>. </para> </listitem> </orderedlist> diff --git a/docs/xml/requiredsoftware.xml b/docs/xml/requiredsoftware.xml index 95988ec8354e0dba159a0e92f3dd29e591c36ba5..8a8c35774cdc048c1b8f641718459e554b7acfd0 100644 --- a/docs/xml/requiredsoftware.xml +++ b/docs/xml/requiredsoftware.xml @@ -6,59 +6,52 @@ stay current for a while.</para> <para>Apache Web Server: - <ulink url="http://www.apache.org/">http://www.apache.org</ulink> + <ulink url="http://www.apache.org/"/> Optional web server for Bugzilla, but recommended because of broad user base and support.</para> <para>Bugzilla: - <ulink url="http://www.bugzilla.org/"> - http://www.bugzilla.org/</ulink> + <ulink url="http://www.bugzilla.org/"/> </para> <para>MySQL: - <ulink url="http://www.mysql.com/">http://www.mysql.com/</ulink> + <ulink url="http://www.mysql.com/"/> </para> <para>Perl: - <ulink url="http://www.perl.org">http://www.perl.org/</ulink> + <ulink url="http://www.perl.org/"/> </para> <para>CPAN: - <ulink url="http://www.cpan.org/">http://www.cpan.org/</ulink> + <ulink url="http://www.cpan.org/"/> </para> <para>DBI Perl module: - <ulink url="http://www.cpan.org/modules/by-module/DBI/"> - http://www.cpan.org/modules/by-module/DBI/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/DBI/"/> </para> <para>Data::Dumper module: - <ulink url="http://www.cpan.org/modules/by-module/Data/"> - http://www.cpan.org/modules/by-module/Data/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/Data/"/> </para> <para>MySQL related Perl modules: - <ulink url="http://www.cpan.org/modules/by-module/Mysql/"> - http://www.cpan.org/modules/by-module/Mysql/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/Mysql/"/> </para> <para>TimeDate Perl module collection: - <ulink url="http://www.cpan.org/modules/by-module/Date/"> - http://www.cpan.org/modules/by-module/Date/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/Date/"/> </para> <para>GD Perl module: - <ulink url="http://www.cpan.org/modules/by-module/GD/"> - http://www.cpan.org/modules/by-module/GD/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/GD/"/> Alternately, you should be able to find the latest version of GD at - <ulink url="http://www.boutell.com/gd/">http://www.boutell.com/gd/</ulink> + <ulink url="http://www.boutell.com/gd/"/> </para> <para>Chart::Base module: - <ulink url="http://www.cpan.org/modules/by-module/Chart/"> - http://www.cpan.org/modules/by-module/Chart/</ulink> + <ulink url="http://www.cpan.org/modules/by-module/Chart/"/> </para> <para>(But remember, Bundle::Bugzilla will install all the modules for you.) diff --git a/docs/xml/using.xml b/docs/xml/using.xml index b5dab9d0a983aef168495ef6917ff16ffa62f6ca..f06969f570b241a2751c7b8279bc020366e242ac 100644 --- a/docs/xml/using.xml +++ b/docs/xml/using.xml @@ -22,8 +22,7 @@ Consult with the administrator responsible for your installation of Bugzilla for the URL you should use to access it. If you're test-driving Bugzilla, use this URL: - <ulink url="http://landfill.bugzilla.org/bugzilla-tip/"> - http://landfill.bugzilla.org/bugzilla-tip/</ulink> + <ulink url="http://landfill.bugzilla.org/bugzilla-tip/"/>. </para> <orderedlist> @@ -269,23 +268,19 @@ <para>The Bugzilla Search page is is the interface where you can find any bug report, comment, or patch currently in the Bugzilla system. You can play with it here: - <ulink url="http://landfill.bugzilla.org/bugzilla-tip/query.cgi"> - landfill.bugzilla.org/bugzilla-tip/query.cgi</ulink> - - .</para> + <ulink url="http://landfill.bugzilla.org/bugzilla-tip/query.cgi"/>.</para> <para>The Search page has controls for selecting different possible - values for all of the fields in a bug, as described above. Once you've - defined a search, you can either run it, or save it as a Remembered - Query, which can optionally appear in the footer of your pages.</para> - - <para>Highly advanced querying is done using Boolean Charts, which have - their own - <ulink - url="http://landfill.bugzilla.org/bugzilla-tip/booleanchart.html"> - context-sensitive help</ulink> + values for all of the fields in a bug, as described above. For some + fields, multiple values can be selected. In those cases, Bugzilla + returns bugs where the content of the field matches one of the selected + values. If none is selected, then the field can take any value.</para> + + <para>Once you've defined a search, you can either run it, or save it + as a Remembered Query, which can optionally appear in the footer of + your pages.</para> - .</para> + <para>Highly advanced querying is done using Boolean Charts.</para> </section> <section id="list"> @@ -377,6 +372,99 @@ </listitem> </orderedlist> </section> + + <section id="patchviewer"> + <title>Patch Viewer</title> + + <para>Viewing and reviewing patches in Bugzilla is often difficult due to + lack of context, improper format and the inherent readability issues that + raw patches present. Patch Viewer is an enhancement to Bugzilla designed + to fix that by offering increased context, linking to sections, and + integrating with Bonsai, LXR and CVS.</para> + + <para>Patch viewer allows you to:</para> + + <simplelist> + <member>View patches in color, with side-by-side view rather than trying + to interpret the contents of the patch.</member> + <member>See the difference between two patches.</member> + <member>Get more context in a patch.</member> + <member>Collapse and expand sections of a patch for easy + reading.</member> + <member>Link to a particular section of a patch for discussion or + review</member> + <member>Go to Bonsai or LXR to see more context, blame, and + cross-references for the part of the patch you are looking at</member> + <member>Create a rawtext unified format diff out of any patch, no + matter what format it came from</member> + </simplelist> + + <section id="patchviewer_view"> + <title>Viewing Patches in Patch Viewer</title> + <para>The main way to view a patch in patch viewer is to click on the + "Diff" link next to a patch in the Attachments list on a bug. You may + also do this within the edit window by clicking the "View Attachment As + Diff" button in the Edit Attachment screen.</para> + </section> + + <section id="patchviewer_diff"> + <title>Seeing the Difference Between Two Patches</title> + <para>To see the difference between two patches, you must first view the + newer patch in Patch Viewer. Then select the older patch from the + dropdown at the top of the page ("Differences between [dropdown] and + this patch") and click the "Diff" button. This will show you what + is new or changed in the newer patch.</para> + </section> + + <section id="patchviewer_context"> + <title>Getting More Context in a Patch</title> + <para>To get more context in a patch, you put a number in the textbox at + the top of Patch Viewer ("Patch / File / [textbox]") and hit enter. + This will give you that many lines of context before and after each + change. Alternatively, you can click on the "File" link there and it + will show each change in the full context of the file. This feature only + works against files that were diffed using "cvs diff".</para> + </section> + + <section id="patchviewer_collapse"> + <title>Collapsing and Expanding Sections of a Patch</title> + <para>To view only a certain set of files in a patch (for example, if a + patch is absolutely huge and you want to only review part of it at a + time), you can click the "(+)" and "(-)" links next to each file (to + expand it or collapse it). If you want to collapse all files or expand + all files, you can click the "Collapse All" and "Expand All" links at the + top of the page.</para> + </section> + + <section id="patchviewer_link"> + <title>Linking to a Section of a Patch</title> + <para>To link to a section of a patch (for example, if you want to be + able to give someone a URL to show them which part you are talking + about) you simply click the "Link Here" link on the section header. The + resulting URL can be copied and used in discussion. (Copy Link + Location in Mozilla works as well.)</para> + </section> + + <section id="patchviewer_bonsai_lxr"> + <title>Going to Bonsai and LXR</title> + <para>To go to Bonsai to get blame for the lines you are interested in, + you can click the "Lines XX-YY" link on the section header you are + interested in. This works even if the patch is against an old + version of the file, since Bonsai stores all versions of the file.</para> + + <para>To go to LXR, you click on the filename on the file header + (unfortunately, since LXR only does the most recent version, line + numbers are likely to rot).</para> + </section> + + <section id="patchviewer_unified_diff"> + <title>Creating a Unified Diff</title> + <para>If the patch is not in a format that you like, you can turn it + into a unified diff format by clicking the "Raw Unified" link at the top + of the page.</para> + </section> + + </section> </section> <section id="hintsandtips"> @@ -392,7 +480,7 @@ However, Bugzilla will automatically make hyperlinks out of certain sorts of text in comments. For example, the text http://www.bugzilla.org will be turned into - <ulink url="http://www.bugzilla.org">http://www.bugzilla.org</ulink>. + <ulink url="http://www.bugzilla.org"/>. Other strings which get linkified in the obvious manner are: <simplelist> <member>bug 12345</member> diff --git a/docs/xml/variants.xml b/docs/xml/variants.xml index 690b5098776778dcc13fc41c832a1ac562c4a400..4f1d2be1837d502e3fb77ca0d40eb3c9e12f9db5 100644 --- a/docs/xml/variants.xml +++ b/docs/xml/variants.xml @@ -6,28 +6,25 @@ and variants, then found a wonderful site which covers an awful lot of what I wanted to discuss. Rather than quote it in its entirety, I'll simply refer you here: - <ulink url="http://linas.org/linux/pm.html"> - http://linas.org/linux/pm.html</ulink> + <ulink url="http://linas.org/linux/pm.html"/>. </para> <section id="variant-redhat"> <title>Red Hat Bugzilla</title> <para>Red Hat's old fork of Bugzilla which was based on version 2.8 is now - obsolete. The newest version in use is based on version 2.17.1 and is in - the process of being integrated into the main Bugzilla source tree. The + obsolete. The newest version in use is based on version 2.17.1 and is in + the process of being integrated into the main Bugzilla source tree. The back-end is modified to work with PostgreSQL instead of MySQL and they have custom templates to get their desired look and feel, but other than that it - is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of + is Bugzilla 2.17.1. Dave Lawrence of Red Hat put forth a great deal of effort to make sure that the changes he made could be integrated back into the main tree. - <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=98304">Bug - 98304</ulink> exists to track this integration. + <ulink url="http://bugzilla.mozilla.org/show_bug.cgi?id=98304">Bug 98304</ulink> + exists to track this integration. </para> - <para>URL: - <ulink url="http://bugzilla.redhat.com/bugzilla/"> - http://bugzilla.redhat.com/bugzilla/</ulink> + <para>URL: <ulink url="http://bugzilla.redhat.com/bugzilla/"/> </para> <para>This section last updated 24 Dec 2002</para> @@ -61,8 +58,7 @@ <para>Scarab is a new open source bug-tracking system built using Java Servlet technology. It is currently at version 1.0 beta 13.</para> - <para>URL: - <ulink url="http://scarab.tigris.org/">http://scarab.tigris.org</ulink> + <para>URL: <ulink url="http://scarab.tigris.org/"/> </para> <para>This section last updated 18 Jan 2003</para> @@ -75,10 +71,7 @@ such through the <quote>jobs</quote> functionality.</para> - <para>URL: - <ulink url="http://www.perforce.com/perforce/technotes/note052.html"> - http://www.perforce.com/perforce/technotes/note052.html - </ulink> + <para>URL: <ulink url="http://www.perforce.com/perforce/technotes/note052.html"/> </para> <para>This section last updated 27 Jul 2002</para> @@ -91,9 +84,7 @@ distributed free software and open source projects over the Internet. It has a built-in bug tracker, but it's not highly thought of.</para> - <para>URL: - <ulink url="http://www.sourceforge.net"> - http://www.sourceforge.net</ulink> + <para>URL: <ulink url="http://www.sourceforge.net"/> </para> <para>This section last updated 27 Jul 2002</para> diff --git a/doeditparams.cgi b/doeditparams.cgi index 48c39bc7ab4faba4221dce85d65fac95a86165e6..04d0ac98bd339d95fdf1e0f830e1942b452631e9 100755 --- a/doeditparams.cgi +++ b/doeditparams.cgi @@ -25,6 +25,7 @@ use strict; use lib qw(.); +use Bugzilla; use Bugzilla::Config qw(:DEFAULT :admin); require "CGI.pl"; @@ -34,10 +35,12 @@ use vars %::MFORM; ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +my $cgi = Bugzilla->cgi; + +print $cgi->header(); if (!UserInGroup("tweakparams")) { - print "<H1>Sorry, you aren't a member of the 'tweakparams' group.</H1>\n"; + print "<h1>Sorry, you aren't a member of the 'tweakparams' group.</h1>\n"; print "And so, you aren't allowed to edit the parameters.\n"; PutFooter(); exit; @@ -45,6 +48,8 @@ if (!UserInGroup("tweakparams")) { PutHeader("Saving new parameters"); +my $howto = ""; + foreach my $i (GetParamList()) { my $name = $i->{'name'}; my $value = $::FORM{$name}; @@ -92,8 +97,14 @@ foreach my $i (GetParamList()) { exit; } } - print "Changed " . html_quote($name) . "<br>\n"; + print "Changed " . html_quote($name) . ".<br>\n"; SetParam($name, $value); + if (($name eq "shutdownhtml") && ($value ne "")) { + # The system is down, inform the user how to restore it + $howto = "<p>Bugzilla has now been shut down, to re-enable ". + "the system, please return to ". + "<a href=\"editparams.cgi\">editparams.cgi</a>.</p>"; + } } } @@ -102,8 +113,9 @@ WriteParams(); unlink "data/versioncache"; -print "OK, done.<p>\n"; -print "<a href=editparams.cgi>Edit the params some more.</a><p>\n"; -print "<a href=query.cgi>Go back to the query page.</a>\n"; +print "<p>OK, done.</p>\n"; +print $howto; +print "<a href=\"editparams.cgi\">Edit the params some more.</a><p>\n"; +print "<a href=\"query.cgi\">Go back to the query page.</a>\n"; PutFooter(); diff --git a/duplicates.cgi b/duplicates.cgi index 64a3f7ab3c6eb7584bfd43c1acc9fbc38dc49841..fb54972182503fe867574632e834977639070358 100644 --- a/duplicates.cgi +++ b/duplicates.cgi @@ -36,15 +36,18 @@ use vars qw($buffer); use Bugzilla; use Bugzilla::Search; -use Bugzilla::CGI; + +my $cgi = Bugzilla->cgi; # Go directly to the XUL version of the duplicates report (duplicates.xul) # if the user specified ctype=xul. Adds params if they exist, and directs # the user to a signed copy of the script in duplicates.jar if it exists. if ($::FORM{'ctype'} && $::FORM{'ctype'} eq "xul") { my $params = CanonicaliseParams($::buffer, ["format", "ctype"]); - print "Location: " . (-e "duplicates.jar" ? "duplicates.jar!/" : "") . + my $url = (-e "duplicates.jar" ? "duplicates.jar!/" : "") . "duplicates.xul" . ($params ? "?$params" : "") . "\n\n"; + + print $cgi->redirect($url); exit; } @@ -75,16 +78,16 @@ my $changedsince = formvalue("changedsince", 7); my $maxrows = formvalue("maxrows", 100); my $openonly = formvalue("openonly"); my $reverse = formvalue("reverse") ? 1 : 0; -my $product = formvalue("product"); +my @query_products = $cgi->param('product'); my $sortvisible = formvalue("sortvisible"); my @buglist = (split(/[:,]/, formvalue("bug_id"))); my $product_id; -if ($product) { - $product_id = get_product_id($product); +foreach my $p (@query_products) { + $product_id = get_product_id($p); if (!$product_id) { ThrowUserError("invalid_product_name", - { product => $product }); + { product => $p }); } } @@ -137,6 +140,15 @@ while (my ($key, $value) = each %count) { delete $count{$key} if $sortvisible && (lsearch(\@buglist, $key) == -1); } +my $origmaxrows = $maxrows; +detaint_natural($maxrows) + || ThrowUserError("invalid_maxrows", { maxrows => $origmaxrows}); + +my $origchangedsince = $changedsince; +detaint_natural($changedsince) + || ThrowUserError("invalid_changedsince", + { changedsince => $origchangedsince }); + # Try and open the database from "changedsince" days ago my $dobefore = 0; my %delta; @@ -159,15 +171,6 @@ if (!tie(%before, 'AnyDBM_File', "data/duplicates/dupes$whenever", $dobefore = 1; } -my $origmaxrows = $maxrows; -detaint_natural($maxrows) - || ThrowUserError("invalid_maxrows", { maxrows => $origmaxrows}); - -my $origchangedsince = $changedsince; -detaint_natural($changedsince) - || ThrowUserError("invalid_changedsince", - { changedsince => $origchangedsince }); - my @bugs; my @bug_ids; @@ -206,7 +209,7 @@ if (scalar(%count)) { # Restrict to product if requested if ($::FORM{'product'}) { - $params->param('product', $::FORM{'product'}); + $params->param('product', join(',', @query_products)); } my $query = new Bugzilla::Search('fields' => [qw(bugs.bug_id @@ -255,14 +258,14 @@ $vars->{'maxrows'} = $maxrows; $vars->{'openonly'} = $openonly; $vars->{'reverse'} = $reverse; $vars->{'format'} = $::FORM{'format'}; -$vars->{'product'} = $product; +$vars->{'query_products'} = \@query_products; $vars->{'products'} = \@::legal_product; my $format = GetFormat("reports/duplicates", $::FORM{'format'}, $::FORM{'ctype'}); - -print "Content-Type: $format->{'ctype'}\n\n"; + +print $cgi->header($format->{'ctype'}); # Generate and return the UI (HTML page) from the appropriate template. $template->process($format->{'template'}, $vars) diff --git a/editcomponents.cgi b/editcomponents.cgi index 35c6426b2c028de290cede0982142800cbf4a514..539da47a5d31021ca13e6e66f62758d4617acaee 100755 --- a/editcomponents.cgi +++ b/editcomponents.cgi @@ -31,6 +31,8 @@ use lib "."; require "CGI.pl"; require "globals.pl"; +use Bugzilla::Series; + # Shut up misguided -w warnings about "used only once". For some reason, # "use vars" chokes on me when I try it here. @@ -149,6 +151,10 @@ sub EmitFormElements ($$$$$) # # Displays a text like "a.", "a or b.", "a, b or c.", "a, b, c or d." +# +# XXX This implementation of PutTrailer outputs a default link back to the +# query page instead of the index, which is inconsistent with other +# PutTrailer() implementations. # sub PutTrailer (@) @@ -191,7 +197,7 @@ sub PutTrailer (@) ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); unless (UserInGroup("editcomponents")) { PutHeader("Not allowed"); @@ -352,6 +358,8 @@ if ($action eq 'add') { print "</TR></TABLE>\n<HR>\n"; print "<INPUT TYPE=SUBMIT VALUE=\"Add\">\n"; print "<INPUT TYPE=HIDDEN NAME=\"action\" VALUE=\"new\">\n"; + print "<INPUT TYPE=HIDDEN NAME='open_name' VALUE='All Open'>\n"; + print "<INPUT TYPE=HIDDEN NAME='closed_name' VALUE='All Closed'>\n"; print "</FORM>"; my $other = $localtrailer; @@ -440,14 +448,45 @@ if ($action eq 'new') { SqlQuote($initialownerid) . "," . SqlQuote($initialqacontactid) . ")"); + # Insert default charting queries for this product. + # If they aren't using charting, this won't do any harm. + GetVersionTable(); + + my @series; + my $prodcomp = "&product=$product&component=$component"; + + # For localisation reasons, we get the title of the queries from the + # submitted form. + my @openedstatuses = ("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"); + my $statuses = join("&", map { "bug_status=$_" } @openedstatuses); + push(@series, [$::FORM{'open_name'}, $statuses . $prodcomp]); + + my $resolved = "field0-0-0=resolution&type0-0-0=notequals&value0-0-0=---"; + push(@series, [$::FORM{'closed_name'}, $resolved . $prodcomp]); + + foreach my $sdata (@series) { + # We create the series with an nonsensical series_id, which is + # guaranteed not to exist. This is OK, because we immediately call + # createInDatabase(). + my $series = new Bugzilla::Series(-1, $product, $component, + $sdata->[0], $::userid, 1, + $sdata->[1]); + $series->createInDatabase(); + } + # Make versioncache flush unlink "data/versioncache"; print "OK, done.<p>\n"; if ($product) { - PutTrailer("<A HREF=\"editcomponents.cgi?product=" . url_quote($product) . "\">edit</A> more components or <A HREF=\"editcomponents.cgi?product=". url_quote($product) . "&action=add\">Add</A> another component"); + PutTrailer("<a href=\"editcomponents.cgi?product=" . + url_quote($product) . "\">edit</a> more components", + "<a href=\"editcomponents.cgi?product=". url_quote($product) . + "&action=add\">add</a> another component"); } else { - PutTrailer("<A HREF=\"editcomponents.cgi\">edit</A> more components or <A HREF=\"editcomponents.cgi?action=add\">Add</A> another component"); + PutTrailer("<a href=\"editcomponents.cgi\">edit</a> more components", + "<a href=\"editcomponents.cgi?action=add\">add</a>" . + "another component"); } exit; } diff --git a/editflagtypes.cgi b/editflagtypes.cgi index d7794ff9368376ce86efd60915c40cb091b1ef42..711828b6a768712b781d238bc840161e8d8bd7de 100755 --- a/editflagtypes.cgi +++ b/editflagtypes.cgi @@ -35,6 +35,7 @@ require "CGI.pl"; ConnectToDatabase(); # Use Bugzilla's flag modules for handling flag types. +use Bugzilla; use Bugzilla::Flag; use Bugzilla::FlagType; @@ -94,7 +95,7 @@ sub list { Bugzilla::FlagType::match({ 'target_type' => 'attachment' }, 1); # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("admin/flag-type/list.html.tmpl", $vars) @@ -138,7 +139,7 @@ sub edit { } # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("admin/flag-type/edit.html.tmpl", $vars) @@ -189,7 +190,7 @@ sub processCategoryChange { $vars->{'type'} = $type; # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("admin/flag-type/edit.html.tmpl", $vars) @@ -246,7 +247,7 @@ sub insert { $vars->{'message'} = "flag_type_created"; # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("global/message.html.tmpl", $vars) @@ -328,7 +329,7 @@ sub update { $vars->{'message'} = "flag_type_changes_saved"; # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("global/message.html.tmpl", $vars) @@ -348,7 +349,7 @@ sub confirmDelete $vars->{'flag_count'} = scalar($count); # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("admin/flag-type/confirm-delete.html.tmpl", $vars) @@ -380,7 +381,7 @@ sub delete { $vars->{'message'} = "flag_type_deleted"; # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("global/message.html.tmpl", $vars) @@ -400,7 +401,7 @@ sub deactivate { $vars->{'flag_type'} = Bugzilla::FlagType::get($::FORM{'id'}); # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("global/message.html.tmpl", $vars) diff --git a/editgroups.cgi b/editgroups.cgi index ca653b77a800cf08dfe62c8e1d22119b994d1da5..e793f296a83cc0dffa1e25500c8665d095a3e47b 100755 --- a/editgroups.cgi +++ b/editgroups.cgi @@ -33,7 +33,7 @@ require "CGI.pl"; ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); if (!UserInGroup("creategroups")) { PutHeader("Not Authorized","Edit Groups","","Not Authorized for this function!"); @@ -73,7 +73,7 @@ sub ShowError ($) sub PutTrailer (@) { - my (@links) = ("<a href=\"./\">Back to the Main Bugs Page</a>", @_); + my (@links) = ("Back to the <a href=\"./\">index</a>", @_); my $count = $#links; my $num = 0; @@ -271,7 +271,7 @@ if ($action eq 'changeform') { - PutTrailer("<a href=editgroups.cgi>Back to group list</a>"); + PutTrailer("back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } @@ -326,7 +326,7 @@ probably want it to be usable for bugs, in which case you should leave this chec print "products\" option will prevent this and make the group become "; print "visible only when its controls have been added to a product.<P>\n"; - PutTrailer("<a href=editgroups.cgi>Back to the group list</a>"); + PutTrailer("back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } @@ -409,8 +409,8 @@ if ($action eq 'new') { "FROM products"); } print "OK, done.<p>\n"; - PutTrailer("<a href=\"editgroups.cgi?action=add\">Add another group</a>", - "<a href=\"editgroups.cgi\">Back to the group list</a>"); + PutTrailer("<a href=\"editgroups.cgi?action=add\">add</a> another group", + "back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } @@ -558,9 +558,9 @@ if ($action eq 'delete') { "records in the database which refer to it. All such records " . "must be removed or altered to remove the reference to this " . "group before the group can be deleted."); - print "<A HREF=\"editgroups.cgi?action=del&group=$gid\">" . - "View the list of which records are affected</A><BR>"; - PutTrailer("<a href=editgroups.cgi>Back to group list</a>"); + print "<a href=\"editgroups.cgi?action=del&group=$gid\">" . + "View</a> the list of which records are affected.<br>"; + PutTrailer("back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } @@ -572,7 +572,7 @@ if ($action eq 'delete') { print "<B>Group $gid has been deleted.</B><BR>"; - PutTrailer("<a href=editgroups.cgi>Back to group list</a>"); + PutTrailer("back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } @@ -666,7 +666,7 @@ if ($action eq 'postchanges') { SendSQL("UPDATE groups SET last_changed = NOW() WHERE id = $gid"); print "Done.<p>\n"; } - PutTrailer("<a href=editgroups.cgi>Back to the group list</a>"); + PutTrailer("back to the <a href=\"editgroups.cgi\">group list</a>"); exit; } diff --git a/editkeywords.cgi b/editkeywords.cgi index 4d11a4aaea1d8fb3d13e93e2bbefb73b98830e68..7af0c1a6c2f7d92c0e0fb506b01fc20b2f702669 100755 --- a/editkeywords.cgi +++ b/editkeywords.cgi @@ -30,6 +30,10 @@ my $localtrailer = "<A HREF=\"editkeywords.cgi\">edit</A> more keywords"; # # Displays a text like "a.", "a or b.", "a, b or c.", "a, b, c or d." +# +# XXX This implementation of PutTrailer outputs a default link back to +# the query page instead of the index, which is inconsistent with other +# PutTrailer() implementations. # sub PutTrailer (@) @@ -110,7 +114,7 @@ sub Validate ($$) { ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); unless (UserInGroup("editkeywords")) { PutHeader("Not allowed"); @@ -122,6 +126,7 @@ unless (UserInGroup("editkeywords")) { my $action = trim($::FORM{action} || ''); +detaint_natural($::FORM{id}); if ($action eq "") { @@ -242,7 +247,8 @@ if ($action eq 'new') { unlink "data/versioncache"; print "OK, done.<p>\n"; - PutTrailer("<A HREF=\"editkeywords.cgi\">edit</A> more keywords or <A HREF=\"editkeywords.cgi?action=add\">add</a> another keyword"); + PutTrailer("<a href=\"editkeywords.cgi\">edit</a> more keywords", + "<a href=\"editkeywords.cgi?action=add\">add</a> another keyword"); exit; } diff --git a/editmilestones.cgi b/editmilestones.cgi index 1fd6009008de8c9ce317ff0681402e7e017c8a84..19582b4854f834df59f55bef6da3b1468039cff1 100755 --- a/editmilestones.cgi +++ b/editmilestones.cgi @@ -148,7 +148,7 @@ sub PutTrailer (@) ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); unless (UserInGroup("editcomponents")) { PutHeader("Not allowed"); @@ -295,6 +295,12 @@ if ($action eq 'new') { PutTrailer($localtrailer); exit; } + if ($sortkey!~/^[0-9]+$/) { + print "The sortkey for a milestone must be a number. Please press\n"; + print "<b>Back</b> and try again.\n"; + PutTrailer($localtrailer); + exit; + } if (TestMilestone($product,$milestone)) { print "The milestone '$milestone' already exists. Please press\n"; print "<b>Back</b> and try again.\n"; diff --git a/editparams.cgi b/editparams.cgi index 89099823f0a9ef1cd73c452e5e44aceca0e146da..dd61e9543774cac43138d4977e2f5cc39c171e41 100755 --- a/editparams.cgi +++ b/editparams.cgi @@ -32,7 +32,7 @@ require "CGI.pl"; ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); if (!UserInGroup("tweakparams")) { print "<H1>Sorry, you aren't a member of the 'tweakparams' group.</H1>\n"; diff --git a/editproducts.cgi b/editproducts.cgi index 9592c02ad815b7627fe90e929e56dbb51214ae37..c36537c2208c7b2656623055c7c46800ce780f2e 100755 --- a/editproducts.cgi +++ b/editproducts.cgi @@ -33,9 +33,11 @@ use vars qw ($template $vars); use Bugzilla::Constants; require "CGI.pl"; require "globals.pl"; +use Bugzilla::Series; # Shut up misguided -w warnings about "used only once". "use vars" just # doesn't work for me. +use vars qw(@legal_bug_status @legal_resolution); sub sillyness { my $zz; @@ -178,7 +180,7 @@ sub PutTrailer (@) ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); unless (UserInGroup("editcomponents")) { PutHeader("Not allowed"); @@ -272,6 +274,8 @@ if ($action eq 'add') { print "</TABLE>\n<HR>\n"; print "<INPUT TYPE=SUBMIT VALUE=\"Add\">\n"; print "<INPUT TYPE=HIDDEN NAME=\"action\" VALUE=\"new\">\n"; + print "<INPUT TYPE=HIDDEN NAME='subcategory' VALUE='-All-'>\n"; + print "<INPUT TYPE=HIDDEN NAME='open_name' VALUE='All Open'>\n"; print "</FORM>"; my $other = $localtrailer; @@ -333,8 +337,15 @@ if ($action eq 'new') { SqlQuote($product) . "," . SqlQuote($description) . "," . SqlQuote($milestoneurl) . "," . - $disallownew . "," . - "$votesperuser, $maxvotesperbug, $votestoconfirm, " . + # had tainting issues under cygwin, IIS 5.0, perl -T %s %s + # see bug 208647. http://bugzilla.mozilla.org/show_bug.cgi?id=208647 + # had to de-taint $disallownew, $votesperuser, $maxvotesperbug, + # and $votestoconfirm w/ SqlQuote() + # - jpyeron@pyerotechnics.com + SqlQuote($disallownew) . "," . + SqlQuote($votesperuser) . "," . + SqlQuote($maxvotesperbug) . "," . + SqlQuote($votestoconfirm) . "," . SqlQuote($defaultmilestone) . ")"); SendSQL("SELECT LAST_INSERT_ID()"); my $product_id = FetchOneColumn(); @@ -349,7 +360,7 @@ if ($action eq 'new') { # If we're using bug groups, then we need to create a group for this # product as well. -JMR, 2/16/00 - if(Param("makeproductgroups")) { + if (Param("makeproductgroups")) { # Next we insert into the groups table SendSQL("INSERT INTO groups " . "(name, description, isbuggroup, last_changed) " . @@ -390,15 +401,48 @@ if ($action eq 'new') { PopGlobalSQLState(); } } + } - + # Insert default charting queries for this product. + # If they aren't using charting, this won't do any harm. + GetVersionTable(); + + my @series; + + # We do every status, every resolution, and an "opened" one as well. + foreach my $bug_status (@::legal_bug_status) { + push(@series, [$bug_status, "bug_status=$bug_status"]); + } + + foreach my $resolution (@::legal_resolution) { + next if !$resolution; + push(@series, [$resolution, "resolution=$resolution"]); + } + + # For localisation reasons, we get the name of the "global" subcategory + # and the title of the "open" query from the submitted form. + my @openedstatuses = ("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"); + my $query = join("&", map { "bug_status=$_" } @openedstatuses); + push(@series, [$::FORM{'open_name'}, $query]); + + foreach my $sdata (@series) { + # We create the series with an nonsensical series_id, which is + # guaranteed not to exist. This is OK, because we immediately call + # createInDatabase(). + my $series = new Bugzilla::Series(-1, $product, + $::FORM{'subcategory'}, + $sdata->[0], $::userid, 1, + $sdata->[1] . "&product=$product"); + $series->createInDatabase(); } # Make versioncache flush unlink "data/versioncache"; print "OK, done.<p>\n"; - PutTrailer($localtrailer, "<a href=\"editcomponents.cgi?action=add&product=" . url_quote($product) . "\">add</a> components to this new product."); + PutTrailer($localtrailer, + "<a href=\"editcomponents.cgi?action=add&product=" . + url_quote($product) . "\">add</a> components to this new product"); exit; } @@ -1170,7 +1214,7 @@ if ($action eq 'update') { "FROM votes, bugs " . "WHERE bugs.bug_id = votes.bug_id " . " AND bugs.product_id = $product_id " . - " AND votes.count > $maxvotesperbug"); + " AND votes.vote_count > $maxvotesperbug"); my @list; while (MoreSQLData()) { my ($who, $id) = (FetchSQLData()); @@ -1183,7 +1227,7 @@ if ($action eq 'update') { print qq{<br>Removed votes for bug <A HREF="show_bug.cgi?id=$id">$id</A> from $name\n}; } } - SendSQL("SELECT votes.who, votes.count FROM votes, bugs " . + SendSQL("SELECT votes.who, votes.vote_count FROM votes, bugs " . "WHERE bugs.bug_id = votes.bug_id " . " AND bugs.product_id = $product_id"); my %counts; diff --git a/editusers.cgi b/editusers.cgi index 143e87442951066ec446da79229b54ea972958d0..823035fe50850cf5a7659a4ce3072deeb679dc2e 100755 --- a/editusers.cgi +++ b/editusers.cgi @@ -34,6 +34,8 @@ use lib "."; require "CGI.pl"; require "globals.pl"; +use Bugzilla::User; + # Shut up misguided -w warnings about "used only once". "use vars" just # doesn't work for me. @@ -205,8 +207,12 @@ sub EmitFormElements ($$$$) sub PutTrailer (@) { - my (@links) = ("Back to the <A HREF=\"./\">index</A>", - "<A HREF=\"editusers.cgi?action=add\">Add a new user</A>", @_); + my (@links) = ("Back to the <a href=\"./\">index</a>"); + if($editall && Bugzilla::Auth->can_edit) { + push(@links, + "<a href=\"editusers.cgi?action=add\">add</a> a new user"); + } + push(@links, @_); my $count = $#links; my $num = 0; @@ -236,12 +242,12 @@ sub PutTrailer (@) ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); $editall = UserInGroup("editusers"); if (!$editall) { - if (!UserCanBlessAnything()) { + if (!Bugzilla->user->can_bless) { PutHeader("Not allowed"); print "Sorry, you aren't a member of the 'editusers' group, and you\n"; print "don't have permissions to put people in or out of any group.\n"; @@ -483,11 +489,12 @@ if ($action eq 'new') { print "OK, done.<br>\n"; SendSQL("SELECT last_insert_id()"); my ($newuserid) = FetchSQLData(); - DeriveGroup($newuserid); - print "To change ${user}'s permissions, go back and <a href=\"editusers.cgi?action=edit&user=" . url_quote($user)."\">edit this user</A>"; + + print "To change ${user}'s permissions, go back and " . + "<a href=\"editusers.cgi?action=edit&user=" . url_quote($user) . + "\">edit</a> this user."; print "<p>\n"; - PutTrailer($localtrailer, - "<a href=\"editusers.cgi?action=add\">add</a> another user."); + PutTrailer($localtrailer); exit; } @@ -682,7 +689,9 @@ if ($action eq 'edit') { my ($thisuserid, $realname, $disabledtext) = FetchSQLData(); if ($thisuserid > 0) { - DeriveGroup($thisuserid); + # Force groups to be up to date + my $changeduser = new Bugzilla::User($thisuserid); + $changeduser->derive_groups(); } print "<FORM METHOD=POST ACTION=editusers.cgi>\n"; print "<TABLE BORDER=0 CELLPADDING=4 CELLSPACING=0><TR>\n"; @@ -844,7 +853,8 @@ if ($action eq 'update') { print "Updated user's name.<BR>\n"; } - DeriveGroup($thisuserid); + my $changeduser = new Bugzilla::User($thisuserid); + $changeduser->derive_groups(); PutTrailer($localtrailer); exit; diff --git a/editversions.cgi b/editversions.cgi index a1bd3e4e439190dcba07df30636862c49c4412cb..d47ec5d76eb218ddad8c6dafa18123c3259deedb 100755 --- a/editversions.cgi +++ b/editversions.cgi @@ -157,7 +157,7 @@ sub PutTrailer (@) ConnectToDatabase(); confirm_login(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); unless (UserInGroup("editcomponents")) { PutHeader("Not allowed"); diff --git a/enter_bug.cgi b/enter_bug.cgi index 9784b81a3f022a4b56541f17c1cbf741f4020578..1dd8aa96cbd97cc0cf5b758273369319eb53f63d 100755 --- a/enter_bug.cgi +++ b/enter_bug.cgi @@ -36,6 +36,7 @@ use strict; use lib qw(.); +use Bugzilla; use Bugzilla::Constants; require "CGI.pl"; @@ -65,6 +66,8 @@ ConnectToDatabase(); # user is right from the start. confirm_login() if AnyEntryGroups(); +my $cgi = Bugzilla->cgi; + if (!defined $::FORM{'product'}) { GetVersionTable(); quietly_check_login(); @@ -88,7 +91,7 @@ if (!defined $::FORM{'product'}) { $vars->{'target'} = "enter_bug.cgi"; $vars->{'format'} = $::FORM{'format'}; - print "Content-type: text/html\n\n"; + print $cgi->header(); $template->process("global/choose-product.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit; @@ -177,6 +180,7 @@ sub pickos { /\(.*QNX.*\)/ && do {return "Neutrino";}; /\(.*VMS.*\)/ && do {return "OpenVMS";}; /\(.*Windows XP.*\)/ && do {return "Windows XP";}; + /\(.*Windows NT 5\.2.*\)/ && do {return "Windows Server 2003";}; /\(.*Windows NT 5\.1.*\)/ && do {return "Windows XP";}; /\(.*Windows 2000.*\)/ && do {return "Windows 2000";}; /\(.*Windows NT 5.*\)/ && do {return "Windows 2000";}; @@ -242,17 +246,19 @@ elsif (1 == @{$::components{$product}}) { } my @components; -SendSQL("SELECT name, description FROM components " . - "WHERE product_id = $product_id ORDER BY name"); +SendSQL("SELECT name, description, login_name, realname + FROM components, profiles + WHERE product_id = $product_id + AND initialowner=userid + ORDER BY name"); while (MoreSQLData()) { - my ($name, $description) = FetchSQLData(); - - my %component; - - $component{'name'} = $name; - $component{'description'} = $description; - - push @components, \%component; + my ($name, $description, $login, $realname) = FetchSQLData(); + push @components, { + name => $name, + description => $description, + default_login => $login, + default_realname => $realname, + }; } my %default; @@ -362,7 +368,7 @@ $vars->{'use_keywords'} = 1 if (@::legal_keywords); my $format = GetFormat("bug/create/create", $::FORM{'format'}, $::FORM{'ctype'}); -print "Content-type: $format->{'ctype'}\n\n"; +print $cgi->header($format->{'ctype'}); $template->process($format->{'template'}, $vars) || ThrowTemplateError($template->error()); diff --git a/globals.pl b/globals.pl index 4caaa3f84306b01e3b50751ce2c2ff5d1a750c95..fd9595fbce880fa79bd3adcbdfbbade0bb79d7c9 100644 --- a/globals.pl +++ b/globals.pl @@ -39,8 +39,6 @@ use Bugzilla::Config qw(:DEFAULT ChmodDataFile); sub globals_pl_sillyness { my $zz; - $zz = @main::SqlStateStack; - $zz = $main::contenttypes; $zz = @main::default_column_list; $zz = $main::defaultqueryname; $zz = @main::enterable_products; @@ -76,7 +74,6 @@ use DBI; use Date::Format; # For time2str(). use Date::Parse; # For str2time(). -#use Carp; # for confess use RelationSet; # Use standard Perl libraries for cross-platform file/directory manipulation. @@ -99,7 +96,12 @@ $::SIG{PIPE} = 'IGNORE'; $::defaultqueryname = "(Default query)"; # This string not exposed in UI $::unconfirmedstate = "UNCONFIRMED"; +# The following subroutine is for debugging purposes only. +# Uncommenting this sub and the $::SIG{__DIE__} trap underneath it will +# cause any fatal errors to result in a call stack trace to help track +# down weird errors. #sub die_with_dignity { +# use Carp; # for confess() # my ($err_msg) = @_; # print $err_msg; # confess($err_msg); @@ -348,7 +350,7 @@ $::VersionTableLoaded = 0; sub GetVersionTable { return if $::VersionTableLoaded; my $mtime = ModTime("data/versioncache"); - if (!defined $mtime || $mtime eq "") { + if (!defined $mtime || $mtime eq "" || !-r "data/versioncache") { $mtime = 0; } if (time() - $mtime > 3600) { @@ -443,8 +445,10 @@ sub GenerateRandomPassword { $size ||= 8; # The list of characters that can appear in a randomly generated password. - # Note that users can put any character into a password they choose themselves. - my @pwchars = (0..9, 'A'..'Z', 'a'..'z', '-', '_', '!', '@', '#', '$', '%', '^', '&', '*'); + # Note that users can put any character into a password they choose + # themselves. + my @pwchars = (0..9, 'A'..'Z', 'a'..'z', '-', '_', '!', '@', '#', '$', + '%', '^', '*'); # The number of characters in the list. my $pwcharslen = scalar(@pwchars); @@ -511,10 +515,9 @@ sub CanEditProductId { my $query = "SELECT group_id FROM group_control_map " . "WHERE product_id = $productid " . "AND canedit != 0 "; - if ((defined @{$::vars->{user}{groupids}}) - && (@{$::vars->{user}{groupids}} > 0)) { + if (defined Bugzilla->user && %{Bugzilla->user->groups}) { $query .= "AND group_id NOT IN(" . - join(',',@{$::vars->{user}{groupids}}) . ") "; + join(',', values(%{Bugzilla->user->groups})) . ") "; } $query .= "LIMIT 1"; PushGlobalSQLState(); @@ -534,10 +537,9 @@ sub CanEnterProduct { "LEFT JOIN group_control_map " . "ON group_control_map.product_id = products.id " . "AND group_control_map.entry != 0 "; - if ((defined @{$::vars->{user}{groupids}}) - && (@{$::vars->{user}{groupids}} > 0)) { + if (defined Bugzilla->user && %{Bugzilla->user->groups}) { $query .= "AND group_id NOT IN(" . - join(',',@{$::vars->{user}{groupids}}) . ") "; + join(',', values(%{Bugzilla->user->groups})) . ") "; } $query .= "WHERE products.name = " . SqlQuote($productname) . " LIMIT 1"; PushGlobalSQLState(); @@ -567,10 +569,9 @@ sub GetSelectableProducts { $query .= "AND group_control_map.membercontrol = " . CONTROLMAPMANDATORY . " "; } - if ((defined @{$::vars->{user}{groupids}}) - && (@{$::vars->{user}{groupids}} > 0)) { + if (defined Bugzilla->user && %{Bugzilla->user->groups}) { $query .= "AND group_id NOT IN(" . - join(',',@{$::vars->{user}{groupids}}) . ") "; + join(',', values(%{Bugzilla->user->groups})) . ") "; } $query .= "WHERE group_id IS NULL ORDER BY name"; PushGlobalSQLState(); @@ -631,6 +632,26 @@ sub GetSelectableProductHash { } +sub GetFieldDefs { + my $extra = ""; + if (!UserInGroup(Param('timetrackinggroup'))) { + $extra = "WHERE name NOT IN ('estimated time', 'remaining_time', " . + "'work_time', 'percentage_complete')"; + } + + my @fields; + PushGlobalSQLState(); + SendSQL("SELECT name, description FROM fielddefs $extra ORDER BY sortkey"); + while (MoreSQLData()) { + my ($name, $description) = FetchSQLData(); + push(@fields, { name => $name, description => $description }); + } + PopGlobalSQLState(); + + return(@fields); +} + + sub CanSeeBug { my ($id, $userid) = @_; @@ -723,99 +744,6 @@ sub Crypt { return $cryptedpassword; } -# ConfirmGroup(userid) is called prior to any activity that relies -# on user_group_map to ensure that derived group permissions are up-to-date. -# Permissions must be rederived if ANY groups have a last_changed newer -# than the profiles.refreshed_when value. -sub ConfirmGroup { - my ($user, $locked) = (@_); - PushGlobalSQLState(); - SendSQL("SELECT userid FROM profiles, groups WHERE userid = $user " . - "AND profiles.refreshed_when <= groups.last_changed "); - my $ret = FetchSQLData(); - PopGlobalSQLState(); - if ($ret) { - DeriveGroup($user, $locked); - } -} - -# DeriveGroup removes and rederives all derived group permissions for -# the specified user. If $locked is true, Bugzilla has already locked -# the necessary tables as part of a larger transaction, so this function -# shouldn't lock them again (since then tables not part of this function's -# lock will get unlocked). -sub DeriveGroup { - my ($user, $locked) = (@_); - PushGlobalSQLState(); - - SendSQL("LOCK TABLES profiles WRITE, user_group_map WRITE, group_group_map READ, groups READ") - unless $locked; - - # avoid races, we are only as up to date as the BEGINNING of this process - SendSQL("SELECT login_name, NOW() FROM profiles WHERE userid = $user"); - my ($login, $starttime) = FetchSQLData(); - - # first remove any old derived stuff for this user - SendSQL("DELETE FROM user_group_map WHERE user_id = $user " . - "AND isderived = 1"); - - my %groupidsadded = (); - # add derived records for any matching regexps - SendSQL("SELECT id, userregexp FROM groups WHERE userregexp != ''"); - while (MoreSQLData()) { - my ($groupid, $rexp) = FetchSQLData(); - if ($login =~ m/$rexp/i) { - PushGlobalSQLState(); - $groupidsadded{$groupid} = 1; - SendSQL("INSERT INTO user_group_map " . - "(user_id, group_id, isbless, isderived) " . - "VALUES ($user, $groupid, 0, 1)"); - PopGlobalSQLState(); - - } - } - - # Get a list of the groups of which the user is a member. - my %groupidschecked = (); - my @groupidstocheck = (); - SendSQL("SELECT group_id FROM user_group_map WHERE user_id = $user - AND NOT isbless"); - while (MoreSQLData()) { - my ($groupid) = FetchSQLData(); - push(@groupidstocheck,$groupid); - } - - # Each group needs to be checked for inherited memberships once. - while (@groupidstocheck) { - my $group = shift @groupidstocheck; - if (!defined($groupidschecked{"$group"})) { - $groupidschecked{"$group"} = 1; - SendSQL("SELECT grantor_id FROM group_group_map WHERE" - . " member_id = $group AND NOT isbless"); - while (MoreSQLData()) { - my ($groupid) = FetchSQLData(); - if (!defined($groupidschecked{"$groupid"})) { - push(@groupidstocheck,$groupid); - } - if (!$groupidsadded{$groupid}) { - $groupidsadded{$groupid} = 1; - PushGlobalSQLState(); - SendSQL("INSERT INTO user_group_map" - . " (user_id, group_id, isbless, isderived)" - . " VALUES ($user, $groupid, 0, 1)"); - PopGlobalSQLState(); - } - } - } - } - - SendSQL("UPDATE profiles SET refreshed_when = " . - SqlQuote($starttime) . "WHERE userid = $user"); - SendSQL("UNLOCK TABLES"); - PopGlobalSQLState(); -}; - - sub DBID_to_real_or_loginname { my ($id) = (@_); PushGlobalSQLState(); @@ -960,7 +888,7 @@ sub quoteUrls { my $tmp; # non-mailto protocols - my $protocol_re = qr/(afs|cid|ftp|gopher|http|https|mid|news|nntp|prospero|telnet|wais)/i; + my $protocol_re = qr/(afs|cid|ftp|gopher|http|https|mid|news|nntp|prospero|telnet|view-source|wais)/i; $text =~ s~\b(${protocol_re}: # The protocol: [^\s<>\"]+ # Any non-whitespace @@ -982,10 +910,12 @@ sub quoteUrls { # attachment links - handle both cases separatly for simplicity $text =~ s~((?:^Created\ an\ |\b)attachment\s*\(id=(\d+)\)) - ~<a href=\"attachment.cgi?id=$2&action=view\">$1</a>~igx; + ~GetAttachmentLink($2, $1) + ~egmx; $text =~ s~\b(attachment\s*\#?\s*(\d+)) - ~<a href=\"attachment.cgi?id=$2&action=view\">$1</a>~igx; + ~GetAttachmentLink($2, $1) + ~egmx; # This handles bug a, comment b type stuff. Because we're using /g # we have to do this in one pattern, and so this is semi-messy. @@ -1014,6 +944,60 @@ sub quoteUrls { return $text; } +# GetAttachmentLink creates a link to an attachment, +# including its title. + +sub GetAttachmentLink { + my ($attachid, $link_text) = @_; + detaint_natural($attachid) || + die "GetAttachmentLink() called with non-integer attachment number"; + + # If we've run GetAttachmentLink() for this attachment before, + # %::attachlink will contain an anonymous array ref of relevant + # values. If not, we need to get the information from the database. + if (! defined $::attachlink{$attachid}) { + # Make sure any unfetched data from a currently running query + # is saved off rather than overwritten + PushGlobalSQLState(); + + SendSQL("SELECT bug_id, isobsolete, description + FROM attachments WHERE attach_id = $attachid"); + + if (MoreSQLData()) { + my ($bugid, $isobsolete, $desc) = FetchSQLData(); + my $title = ""; + my $className = ""; + if (CanSeeBug($bugid, $::userid)) { + $title = $desc; + } + if ($isobsolete) { + $className = "bz_obsolete"; + } + $::attachlink{$attachid} = [value_quote($title), $className]; + } + else { + # Even if there's nothing in the database, we want to save a blank + # anonymous array in the %::attachlink hash so the query doesn't get + # run again next time we're called for this attachment number. + $::attachlink{$attachid} = []; + } + # All done with this sidetrip + PopGlobalSQLState(); + } + + # Now that we know we've got all the information we're gonna get, let's + # return the link (which is the whole reason we were called :) + my ($title, $className) = @{$::attachlink{$attachid}}; + # $title will be undefined if the bug didn't exist in the database. + if (defined $title) { + my $linkval = "attachment.cgi?id=$attachid&action=view"; + return qq{<a href="$linkval" class="$className" title="$title">$link_text</a>}; + } + else { + return qq{$link_text}; + } +} + # GetBugLink creates a link to a bug, including its title. # It takes either two or three parameters: # - The bug number @@ -1089,7 +1073,7 @@ sub GetLongDescriptionAsText { my $result = ""; my $count = 0; my $anyprivate = 0; - my ($query) = ("SELECT profiles.login_name, DATE_FORMAT(longdescs.bug_when,'%Y.%d.%m %H:%i'), " . + my ($query) = ("SELECT profiles.login_name, DATE_FORMAT(longdescs.bug_when,'%Y.%m.%d %H:%i'), " . " longdescs.thetext, longdescs.isprivate " . "FROM longdescs, profiles " . "WHERE profiles.userid = longdescs.who " . @@ -1190,23 +1174,8 @@ sub SplitEnumType { return @result; } -# UserInGroup returns information aboout the current user if no second -# parameter is specified sub UserInGroup { - my ($groupname, $userid) = (@_); - if (!$userid) { - return $::vars->{'user'}{'groups'}{$_[0]}; - } - PushGlobalSQLState(); - $userid ||= $::userid; - SendSQL("SELECT groups.id FROM groups, user_group_map - WHERE groups.id = user_group_map.group_id - AND user_group_map.user_id = $userid - AND isbless = 0 - AND groups.name = " . SqlQuote($groupname)); - my $result = FetchOneColumn(); - PopGlobalSQLState(); - return defined($result); + return defined Bugzilla->user && defined Bugzilla->user->groups->{$_[0]}; } sub UserCanBlessGroup { @@ -1239,32 +1208,6 @@ sub UserCanBlessGroup { return $result; } -sub UserCanBlessAnything { - PushGlobalSQLState(); - # check if user explicitly can bless a group - SendSQL("SELECT group_id FROM user_group_map - WHERE user_id = $::userid AND isbless = 1"); - my $result = FetchOneColumn(); - PopGlobalSQLState(); - if ($result) { - return 1; - } - PushGlobalSQLState(); - # check if user is a member of a group that can bless this group - SendSQL("SELECT groups.id FROM groups, user_group_map, - group_group_map - WHERE groups.id = grantor_id - AND user_group_map.user_id = $::userid - AND group_group_map.isbless = 1 - AND user_group_map.group_id = member_id"); - $result = FetchOneColumn(); - PopGlobalSQLState(); - if ($result) { - return 1; - } - return 0; -} - sub BugInGroup { my ($bugid, $groupname) = (@_); PushGlobalSQLState(); @@ -1355,7 +1298,7 @@ sub RemoveVotes { if ($who) { $whopart = " AND votes.who = $who"; } - SendSQL("SELECT profiles.login_name, profiles.userid, votes.count, " . + SendSQL("SELECT profiles.login_name, profiles.userid, votes.vote_count, " . "products.votesperuser, products.maxvotesperbug " . "FROM profiles " . "LEFT JOIN votes ON profiles.userid = votes.who " . @@ -1393,7 +1336,7 @@ sub RemoveVotes { my $newvotestext; if ($newvotes) { - SendSQL("UPDATE votes SET count = $newvotes " . + SendSQL("UPDATE votes SET vote_count = $newvotes " . "WHERE bug_id = $id AND who = $userid"); $s = $newvotes == 1 ? "" : "s"; $newvotestext = "You still have $newvotes vote$s on this bug." @@ -1436,7 +1379,7 @@ sub RemoveVotes { close SENDMAIL; } } - SendSQL("SELECT SUM(count) FROM votes WHERE bug_id = $id"); + SendSQL("SELECT SUM(vote_count) FROM votes WHERE bug_id = $id"); my $v = FetchOneColumn(); $v ||= 0; SendSQL("UPDATE bugs SET votes = $v, delta_ts = delta_ts " . @@ -1536,7 +1479,7 @@ sub GetFormat { { 'template' => $template , 'extension' => $ctype , - 'ctype' => $::contenttypes->{$ctype} , + 'ctype' => Bugzilla::Constants::contenttypes->{$ctype} , }; } diff --git a/importxml.pl b/importxml.pl index 40182c9543d2ddd6500a0ef7649f130ff6fc7656..3d0ea6206bf94b87b97d8d18ae6328852155803c 100755 --- a/importxml.pl +++ b/importxml.pl @@ -59,6 +59,8 @@ BEGIN { chdir $::path; use lib ($::path); +use Bugzilla; + use XML::Parser; use Data::Dumper; $Data::Dumper::Useqq = 1; @@ -136,7 +138,7 @@ sub Lock { open(LOCKFID, ">>data/maillock") || die "Can't open data/maillock: $!"; my $val = flock(LOCKFID,2); if (!$val) { # '2' is magic 'exclusive lock' const. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); print "Lock failed: $val\n"; } chmod 0666, "data/maillock"; @@ -579,7 +581,7 @@ for (my $k=1 ; $k <= $bugqty ; $k++) { my $qa_contact; if ( (defined $bug_fields{'qa_contact'}) && ($qa_contact = DBname_to_id($bug_fields{'qa_contact'})) ){ - push (@values, SqlQuote($qa_contact)); + push (@values, $qa_contact); push (@query, "qa_contact"); } else { SendSQL("SELECT initialqacontact FROM components, products " . @@ -587,7 +589,7 @@ for (my $k=1 ; $k <= $bugqty ; $k++) { " AND products.name = " . SqlQuote($product[0]) . " AND components.name = " . SqlQuote($component[0]) ); $qa_contact = FetchOneColumn(); - push (@values, SqlQuote(DBname_to_id($qa_contact)) ); + push (@values, $qa_contact); push (@query, "qa_contact"); $err .= "Setting qa contact to the default for this product.\n"; $err .= " This bug either had no qa contact or an invalid one.\n"; diff --git a/index.cgi b/index.cgi index 1bdaa5351cb5b2eaea9aac95f572a05307cade25..f617965d3470fc610a501c32356c0f55952fac0d 100755 --- a/index.cgi +++ b/index.cgi @@ -51,10 +51,12 @@ quietly_check_login('permit_anonymous'); # Main Body Execution ############################################################################### +my $cgi = Bugzilla->cgi; + $vars->{'username'} = $::COOKIE{'Bugzilla_login'} || ''; # Return the appropriate HTTP response headers. -print "Content-Type: text/html\n\n"; +print $cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("index.html.tmpl", $vars) diff --git a/js/CVS/Entries b/js/CVS/Entries index beb8be8282099c60bebd9d67471df30ab83d49b6..1268451bf84f959279076cc9d4f7d19e290760e5 100644 --- a/js/CVS/Entries +++ b/js/CVS/Entries @@ -1,2 +1,2 @@ -/duplicates.js/1.1/Tue Nov 5 01:54:05 2002//TBUGZILLA-2_17_4 +/duplicates.js/1.1/Tue Nov 5 01:54:05 2002//TBUGZILLA-2_17_5 D diff --git a/js/CVS/Tag b/js/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/js/CVS/Tag +++ b/js/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/localconfig.js b/localconfig.js index 7cb01eb74a06344c41f5a309bf74ef6c2cf3f7ee..2cbe6f24f721a21f6bd78fac169e477d27f29ee4 100644 --- a/localconfig.js +++ b/localconfig.js @@ -9,7 +9,7 @@ var bugzilla = ""; //var bugzilla = "http://bugzilla.mozilla.org/"; // Status and Resolution -// ===================== +// --------------------- var statuses_open = new Array("UNCONFIRMED","NEW","ASSIGNED","REOPENED"); var statuses_resolved = new Array("RESOLVED","VERIFIED","CLOSED"); @@ -17,7 +17,7 @@ var resolutions = new Array("FIXED","INVALID","WONTFIX","LATER", "REMIND","DUPLICATE","WORKSFORME","MOVED"); // Keywords -// ======== +// -------- // // Enumerate all your keywords here. This is necessary to avoid // "foo is not a legal keyword" errors. This makes it possible @@ -28,7 +28,7 @@ var keywords = new Array( ); // Platforms -// ========= +// --------- // // A list of words <w> (substrings of platform values) // that will automatically be translated to "platform:<w>" @@ -44,7 +44,7 @@ var platforms = new Array( ); // Severities -// ========== +// ---------- // // A list of words <w> (substrings of severity values) // that will automatically be translated to "severity:<w>" @@ -54,7 +54,7 @@ var platforms = new Array( var severities = new Array("blo","cri","maj","nor","min","tri","enh"); // Products and Components -// ======================= +// ----------------------- // // It is not necessary to list all products and components here. // Instead, you can define a "blacklist" for some commonly used diff --git a/long_list.cgi b/long_list.cgi index 4c787a34e22c49d5278b1ab48463860384fbc50b..1f8126d19f9eb42ccd7c5154a6480eb7a320ebf0 100755 --- a/long_list.cgi +++ b/long_list.cgi @@ -24,6 +24,8 @@ use strict; use lib qw(.); +use Bugzilla; + require "CGI.pl"; use vars qw($userid @legal_keywords %FORM); @@ -37,9 +39,12 @@ quietly_check_login(); GetVersionTable(); +my $cgi = Bugzilla->cgi; + my $generic_query = " SELECT bugs.bug_id, + IFNULL(bugs.alias,''), products.name, bugs.version, bugs.rep_platform, @@ -78,7 +83,7 @@ foreach my $bug_id (split(/[:,]/, $buglist)) { my %bug; my @row = FetchSQLData(); - foreach my $field ("bug_id", "product", "version", "rep_platform", + foreach my $field ("bug_id", "alias", "product", "version", "rep_platform", "op_sys", "bug_status", "resolution", "priority", "bug_severity", "component", "assigned_to", "reporter", "bug_file_loc", "short_desc", "target_milestone", @@ -116,8 +121,7 @@ my @time = localtime(time()); my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; my $filename = "bugs-$date.html"; -print "Content-Type: text/html\n"; -print "Content-Disposition: inline; filename=$filename\n\n"; +print $cgi->header(-content_disposition => "inline; filename=$filename"); # Generate and return the UI (HTML page) from the appropriate template. $template->process("bug/show-multiple.html.tmpl", $vars) diff --git a/move.pl b/move.pl index fa34e758de7a7fdfcf370dd9eb50236850d74b9d..b00572705965c283022422057436763b04597c9e 100755 --- a/move.pl +++ b/move.pl @@ -20,7 +20,7 @@ # # Contributor(s): Dawn Endico <endico@mozilla.org> # Terry Weissman <terry@mozilla.org> -# Dave Miller <justdave@netscape.com> +# Dave Miller <justdave@bugzilla.org> use strict; @@ -31,6 +31,7 @@ require "CGI.pl"; use vars qw($template $userid %COOKIE); use Bug; +use Bugzilla; use Bugzilla::BugMail; $::lockcount = 0; @@ -44,6 +45,8 @@ unless ( Param("move-enabled") ) { ConnectToDatabase(); confirm_login(); +my $cgi = Bugzilla->cgi; + sub Log { my ($str) = (@_); Lock(); @@ -59,7 +62,7 @@ sub Lock { open(LOCKFID, ">>data/maillock") || die "Can't open data/maillock: $!"; my $val = flock(LOCKFID,2); if (!$val) { # '2' is magic 'exclusive lock' const. - print "Content-type: text/html\n\n"; + print $cgi->header(); print "Lock failed: $val\n"; } chmod 0666, "data/maillock"; @@ -76,7 +79,7 @@ sub Unlock { } if ( !defined $::FORM{'buglist'} ) { - print "Content-type: text/html\n\n"; + print $cgi->header(); PutHeader("Move Bugs"); print "Move bugs either from the bug display page or perform a "; print "<A HREF=\"query.cgi\">query</A> and change several bugs at once.\n"; @@ -91,7 +94,7 @@ my $movers = Param("movers"); $movers =~ s/\s?,\s?/|/g; $movers =~ s/@/\@/g; unless ($exporter =~ /($movers)/) { - print "Content-type: text/html\n\n"; + print $cgi->header(); PutHeader("Move Bugs"); print "<P>You do not have permission to move bugs<P>\n"; PutFooter(); diff --git a/page.cgi b/page.cgi index 48fafb38024ea9ba039b4bbd187ca432a801ea9c..1f1ef768fdee6b0552b0cb6fff5c1f94b401bf0f 100755 --- a/page.cgi +++ b/page.cgi @@ -31,6 +31,9 @@ use strict; use lib "."; + +use Bugzilla; + require "CGI.pl"; use vars qw($template $vars); @@ -39,18 +42,20 @@ ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + if ($::FORM{'id'}) { # Remove all dodgy chars, and split into name and ctype. $::FORM{'id'} =~ s/[^\w\-\.]//g; $::FORM{'id'} =~ /(.*)\.(.*)/; - my $format = GetFormat($1, undef, $2); + my $format = GetFormat("pages/$1", undef, $2); $vars->{'form'} = \%::FORM; - - print "Content-Type: $format->{'ctype'}\n\n"; - $template->process("pages/$format->{'template'}", $vars) + print $cgi->header($format->{'ctype'}); + + $template->process("$format->{'template'}", $vars) || ThrowTemplateError($template->error()); } else { diff --git a/post_bug.cgi b/post_bug.cgi index 37a43afb4591113efbd4a55721ddb60b4c6258e5..315ff3a995a2d3be3edf543fa26661db27351906 100755 --- a/post_bug.cgi +++ b/post_bug.cgi @@ -26,6 +26,7 @@ use strict; use lib qw(.); +use Bugzilla; use Bugzilla::Constants; require "CGI.pl"; @@ -53,7 +54,9 @@ sub sillyness { use vars qw($vars $template); ConnectToDatabase(); -my $whoid = confirm_login(); +my $user = confirm_login(); + +my $cgi = Bugzilla->cgi; # do a match on the fields if applicable @@ -85,16 +88,17 @@ if (!$product_id) { # Set cookies my $cookiepath = Param("cookiepath"); if (exists $::FORM{'product'}) { - if (exists $::FORM{'version'}) { - print "Set-Cookie: VERSION-$product=$::FORM{'version'} ; " . - "path=$cookiepath ; expires=Sun, 30-Jun-2029 00:00:00 GMT\n"; + if (exists $::FORM{'version'}) { + $cgi->send_cookie(-name => "VERSION-$product", + -value => $cgi->param('version'), + -expires => "Fri, 01-Jan-2038 00:00:00 GMT"); } } if (defined $::FORM{'maketemplate'}) { $vars->{'url'} = $::buffer; - print "Content-type: text/html\n\n"; + print $cgi->header(); $template->process("bug/create/make-template.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit; @@ -133,7 +137,7 @@ if ($::FORM{'assigned_to'} eq "") { my @bug_fields = ("version", "rep_platform", "bug_severity", "priority", "op_sys", "assigned_to", "bug_status", "bug_file_loc", "short_desc", - "target_milestone"); + "target_milestone", "status_whiteboard"); if (Param("useqacontact")) { SendSQL("SELECT initialqacontact FROM components " . @@ -450,7 +454,7 @@ if (UserInGroup("editbugs")) { "($id, $i)"); push(@all_deps, $i); # list for mailing dependent bugs # Log the activity for the other bug: - LogActivityEntry($i, $me, "", $id, $whoid, $timestamp); + LogActivityEntry($i, $me, "", $id, $user->id, $timestamp); } my $tmp = $me; $me = $target; @@ -473,7 +477,7 @@ $vars->{'id'} = $id; my $bug = new Bug($id, $::userid); $vars->{'bug'} = $bug; -ThrowCodeError("bug_error") if $bug->error; +ThrowCodeError("bug_error", { bug => $bug }) if $bug->error; $vars->{'sentmail'} = []; @@ -491,7 +495,7 @@ if ($::COOKIE{"BUGLIST"}) { } $vars->{'bug_list'} = \@bug_list; -print "Content-type: text/html\n\n"; +print $cgi->header(); $template->process("bug/create/created.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/process_bug.cgi b/process_bug.cgi index 83d601d332d9926d9a18b9de2959d0f348e5d525..ffad17b7076d2c25feb8a6c7e36874548cad5000 100755 --- a/process_bug.cgi +++ b/process_bug.cgi @@ -31,6 +31,7 @@ my $UserInCanConfirmGroupSet = -1; use lib qw(.); +use Bugzilla; use Bugzilla::Constants; require "CGI.pl"; @@ -56,7 +57,10 @@ use vars qw(%versions ); ConnectToDatabase(); -my $whoid = confirm_login(); +my $user = confirm_login(); +my $whoid = $user->id; + +my $cgi = Bugzilla->cgi; my $requiremilestone = 0; @@ -97,6 +101,7 @@ scalar(@idlist) || ThrowUserError("no_bugs_chosen"); &Bugzilla::User::match_field({ 'qa_contact' => { 'type' => 'single' }, 'newcc' => { 'type' => 'multi' }, + 'masscc' => { 'type' => 'multi' }, 'assigned_to' => { 'type' => 'single' }, '^requestee(_type)?-(\d+)$' => { 'type' => 'single' }, }); @@ -143,7 +148,7 @@ foreach my $field ("dependson", "blocked") { # End Data/Security Validation ###################################################################### -print "Content-type: text/html\n\n"; +print $cgi->header(); $vars->{'title_tag'} = "bug_processed"; # Set the title if we can see a mid-air coming. This test may have false @@ -493,7 +498,7 @@ sub DuplicateUserConfirm { # Confirm whether or not to add the reporter to the cc: list # of the original bug (the one this bug is being duped against). - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("bug/process/confirm-duplicate.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit; @@ -519,6 +524,10 @@ if (defined $::FORM{'id'}) { \@{$::versions{$::FORM{'product'}}}); CheckFormField(\%::FORM, 'op_sys', \@::legal_opsys); CheckFormFieldDefined(\%::FORM, 'longdesclength'); + + if (trim($::FORM{'short_desc'}) eq "") { + ThrowUserError("require_summary"); + } } my $action = ''; @@ -765,7 +774,7 @@ if (UserInGroup(Param('timetrackinggroup'))) { $::query .= "$field = " . SqlQuote($er_time); } else { ThrowUserError("need_positive_number", - field => $field); + {field => $field}); } } } @@ -968,9 +977,8 @@ SWITCH: for ($::FORM{'knob'}) { last SWITCH; }; - - $vars->{'action'} = $::FORM{'knob'}; - ThrowCodeError("unknown_action"); + + ThrowCodeError("unknown_action", { action => $::FORM{'knob'} }); } @@ -1090,9 +1098,10 @@ foreach my $id (@idlist) { "keywords $write, longdescs $write, fielddefs $write, " . "bug_group_map $write, flags $write, duplicates $write," . # user_group_map would be a READ lock except that Flag::process - # may call Flag::notify, which calls ConfirmGroup, which might - # call DeriveGroup, which wants a WRITE lock on that table. - # group_group_map is in here at all because DeriveGroups needs it. + # may call Flag::notify, which creates a new user object, + # which might call derive_groups, which wants a WRITE lock on that + # table. group_group_map is in here at all because derive_groups + # needs it. "user_group_map $write, group_group_map READ, flagtypes READ, " . "flaginclusions AS i READ, flagexclusions AS e READ, " . "keyworddefs READ, groups READ, attachments READ, " . @@ -1135,7 +1144,7 @@ foreach my $id (@idlist) { $oldhash{'product'} = get_product_name($oldhash{'product_id'}); if (!CanEditProductId($oldhash{'product_id'})) { ThrowUserError("product_edit_denied", - { product => $oldhash{'product'} }); + { product => $oldhash{'product'} }, "abort"); } if (defined $::FORM{'product'} @@ -1143,7 +1152,7 @@ foreach my $id (@idlist) { && $::FORM{'product'} ne $oldhash{'product'} && !CanEnterProduct($::FORM{'product'})) { ThrowUserError("entry_access_denied", - { product => $::FORM{'product'} }); + { product => $::FORM{'product'} }, "abort"); } if ($requiremilestone) { my $value = $::FORM{'target_milestone'}; @@ -1153,7 +1162,6 @@ foreach my $id (@idlist) { SendSQL("SELECT defaultmilestone FROM products WHERE name = " . SqlQuote($oldhash{'product'})); if ($value eq FetchOneColumn()) { - SendSQL("UNLOCK TABLES"); ThrowUserError("milestone_required", { bug_id => $id }, "abort"); @@ -1256,6 +1264,7 @@ foreach my $id (@idlist) { if ($::FORM{'comment'} || $::FORM{'work_time'}) { if ($::FORM{'work_time'} && (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/)) { + SendSQL("UNLOCK TABLES"); ThrowUserError('comment_required'); } else { AppendComment($id, $::COOKIE{'Bugzilla_login'}, $::FORM{'comment'}, @@ -1263,8 +1272,8 @@ foreach my $id (@idlist) { if ($::FORM{'work_time'}) { LogActivityEntry($id, "work_time", "", $::FORM{'work_time'}, $whoid, $timestamp); - $bug_changed = 1; } + $bug_changed = 1; } } @@ -1368,9 +1377,11 @@ foreach my $id (@idlist) { my $groupDelNames = join(',', @groupDelNames); my $groupAddNames = join(',', @groupAddNames); - LogActivityEntry($id, "bug_group", $groupDelNames, $groupAddNames, - $whoid, $timestamp); - $bug_changed = 1; + if ($groupDelNames ne $groupAddNames) { + LogActivityEntry($id, "bug_group", $groupDelNames, $groupAddNames, + $whoid, $timestamp); + $bug_changed = 1; + } my @ccRemoved = (); if (defined $::FORM{newcc} || defined $::FORM{removecc} || defined $::FORM{masscc}) { @@ -1736,9 +1747,11 @@ foreach my $id (@idlist) { if ($next_bug) { if (detaint_natural($next_bug) && CanSeeBug($next_bug, $::userid)) { my $bug = new Bug($next_bug, $::userid); - $vars->{'bug'} = $bug; - ThrowCodeError("bug_error") if $bug->error; + ThrowCodeError("bug_error", { bug => $bug }) if $bug->error; + # next.html.tmpl includes edit.html.tmpl, and therefore we + # need $bug defined in $vars. + $vars->{'bug'} = $bug; $template->process("bug/process/next.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/query.cgi b/query.cgi index 470e3dfbdbabb9605db698eedf38db255ef3b6ad..80c6ec5d436cd951ce5dba6b3b73a3dc16fb95d7 100755 --- a/query.cgi +++ b/query.cgi @@ -50,19 +50,24 @@ use vars qw( ); ConnectToDatabase(); -my $userid = 0; + +my $cgi = Bugzilla->cgi; + if (defined $::FORM{"GoAheadAndLogIn"}) { # We got here from a login page, probably from relogin.cgi. We better # make sure the password is legit. - $userid = confirm_login(); + confirm_login(); } else { - $userid = quietly_check_login(); + quietly_check_login(); } +my $user = Bugzilla->user; +my $userid = $user ? $user->id : 0; + # Backwards compatibility hack -- if there are any of the old QUERY_* # cookies around, and we are logged in, then move them into the database # and nuke the cookie. This is required for Bugzilla 2.8 and earlier. -if ($userid) { +if ($user) { my @oldquerycookies; foreach my $i (keys %::COOKIE) { if ($i =~ /^QUERY_(.*)$/) { @@ -87,14 +92,14 @@ if ($userid) { "($userid, $qname, " . SqlQuote($value) . ")"); } } - print "Set-Cookie: $cookiename= ; path=" . Param("cookiepath") . - "; expires=Sun, 30-Jun-1980 00:00:00 GMT\n"; + $cgi->send_cookie(-name => $cookiename, + -expires => "Fri, 01-Jan-2038 00:00:00 GMT"); } } } if ($::FORM{'nukedefaultquery'}) { - if ($userid) { + if ($user) { SendSQL("DELETE FROM namedqueries " . "WHERE userid = $userid AND name = '$::defaultqueryname'"); } @@ -102,7 +107,7 @@ if ($::FORM{'nukedefaultquery'}) { } my $userdefaultquery; -if ($userid) { +if ($user) { SendSQL("SELECT query FROM namedqueries " . "WHERE userid = $userid AND name = '$::defaultqueryname'"); $userdefaultquery = FetchOneColumn(); @@ -125,14 +130,16 @@ sub PrefillForm { "chfieldto", "chfieldvalue", "target_milestone", "email", "emailtype", "emailreporter", "emailassigned_to", "emailcc", "emailqa_contact", - "emaillongdesc", + "emaillongdesc", "content", "changedin", "votes", "short_desc", "short_desc_type", "long_desc", "long_desc_type", "bug_file_loc", "bug_file_loc_type", "status_whiteboard", "status_whiteboard_type", "bug_id", "bugidtype", "keywords", "keywords_type", "x_axis_field", "y_axis_field", "z_axis_field", - "chart_format", "cumulate", "x_labels_vertical") + "chart_format", "cumulate", "x_labels_vertical", + "category", "subcategory", "name", "newcategory", + "newsubcategory", "public", "frequency") { # This is a bit of a hack. The default, empty list has # three entries to accommodate the needs of the email fields - @@ -243,6 +250,11 @@ foreach my $m (@::legal_target_milestone) { for (my $i = 0; $i < @products; ++$i) { my $p = $products[$i]; + # Bug 190611: band-aid to avoid crashing with no versions defined + if (!defined ($::components{$p})) { + $::components{$p} = []; + } + # Create hash to hold attributes for each product. my %product = ( 'name' => $p, @@ -305,24 +317,11 @@ $vars->{'rep_platform'} = \@::legal_platform; $vars->{'op_sys'} = \@::legal_opsys; $vars->{'priority'} = \@::legal_priority; $vars->{'bug_severity'} = \@::legal_severity; -$vars->{'userid'} = $userid; # Boolean charts my @fields; push(@fields, { name => "noop", description => "---" }); -SendSQL("SELECT name, description FROM fielddefs ORDER BY sortkey"); -while (MoreSQLData()) { - my ($name, $description) = FetchSQLData(); - if (($name eq "estimated_time" || - $name eq "remaining_time" || - $name eq "work_time" || - $name eq "percentage_complete" ) && - (!UserInGroup(Param('timetrackinggroup')))) { - next; - } - push(@fields, { name => $name, description => $description }); -} - +push(@fields, GetFieldDefs()); $vars->{'fields'} = \@fields; # Creating new charts - if the cmd-add value is there, we define the field @@ -359,7 +358,7 @@ for (my $chart = 0; $::FORM{"field$chart-0-0"}; $chart++) { $default{'charts'} = \@charts; # Named queries -if ($userid) { +if ($user) { my @namedqueries; SendSQL("SELECT name FROM namedqueries " . "WHERE userid = $userid AND name != '$::defaultqueryname' " . @@ -386,10 +385,16 @@ $vars->{'userdefaultquery'} = $userdefaultquery; $vars->{'orders'} = \@orders; $default{'querytype'} = $deforder || 'Importance'; +if (($::FORM{'query_format'} || $::FORM{'format'} || "") eq "create-series") { + require Bugzilla::Chart; + $vars->{'category'} = Bugzilla::Chart::getVisibleSeries(); +} + # Add in the defaults. $vars->{'default'} = \%default; $vars->{'format'} = $::FORM{'format'}; +$vars->{'query_format'} = $::FORM{'query_format'}; # Generate and return the UI (HTML page) from the appropriate template. # If we submit back to ourselves (for e.g. boolean charts), we need to @@ -398,6 +403,8 @@ $vars->{'format'} = $::FORM{'format'}; my $format = GetFormat("search/search", $::FORM{'query_format'} || $::FORM{'format'}, $::FORM{'ctype'}); -print "Content-Type: $format->{'ctype'}\n\n"; + +print $cgi->header($format->{'ctype'}); + $template->process($format->{'template'}, $vars) || ThrowTemplateError($template->error()); diff --git a/queryhelp.cgi b/queryhelp.cgi index 175605d9a89b21974ca942a0785a4a2965c658a5..29407280f93166a629450f6bc2959b9f76828bdb 100755 --- a/queryhelp.cgi +++ b/queryhelp.cgi @@ -35,7 +35,7 @@ quietly_check_login(); GetVersionTable(); -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); my $product = $::FORM{'product'}; @@ -136,7 +136,11 @@ print qq{ <OPTION VALUE="REMIND">REMIND <OPTION VALUE="DUPLICATE">DUPLICATE <OPTION VALUE="WORKSFORME">WORKSFORME -<OPTION VALUE="MOVED">MOVED +}; + +print '<OPTION VALUE="MOVED">MOVED' if Param('move-enabled'); + +print qq{ <OPTION VALUE="---">--- </SELECT> @@ -289,6 +293,13 @@ bug description. code produces no clues as to why this behavior would occur. If more information appears later, please re-assign the bug, for now, file it. +}; + +print '<li><b>MOVED</b> - The problem described might be a bug but is not a bug in this database, +so it was transfered to a more appropriate database.' + if Param('move-enabled'); + +print qq{ </ul> <a name="platform"></a> @@ -800,28 +811,51 @@ bugs numbered: <INPUT TYPE="text" NAME="bug_id" VALUE="" SIZE=15> </td> </tr> +<tr><td> </td></tr> <tr> -<td> -Changed in the last <INPUT NAME=changedin SIZE=3 VALUE=""> days +<td colspan=2> +Only bugs changed between <INPUT NAME="chfieldfrom" SIZE="10" VALUE=""> +and <INPUT NAME="chfieldto" SIZE="10" VALUE="Now"> </td> </tr> -<tr> +<tr valign="top"> <td> -Containing at least <INPUT NAME=votes SIZE=3 VALUE=""> votes +Where one or more of the following changed: +</td><td> +<SELECT NAME="chfield" MULTIPLE SIZE=4> + <OPTION VALUE="[Bug creation]">[Bug creation] + <OPTION VALUE="assigned_to">assigned_to + <OPTION VALUE="bug_file_loc">bug_file_loc + <OPTION VALUE="bug_severity">bug_severity + <OPTION VALUE="bug_status">bug_status + <OPTION VALUE="component">component + <OPTION VALUE="everconfirmed">everconfirmed + <OPTION VALUE="groupset">groupset + <OPTION VALUE="keywords">keywords + <OPTION VALUE="op_sys">op_sys + <OPTION VALUE="priority">priority + <OPTION VALUE="product">product + <OPTION VALUE="qa_contact">qa_contact + <OPTION VALUE="rep_platform">rep_platform + <OPTION VALUE="reporter">reporter + <OPTION VALUE="resolution">resolution + <OPTION VALUE="short_desc">short_desc + <OPTION VALUE="status_whiteboard">status_whiteboard + <OPTION VALUE="target_milestone">target_milestone + <OPTION VALUE="version">version + <OPTION VALUE="votes">votes +</SELECT> </td> </tr> <tr> <td> -Where the field(s) -<SELECT NAME="chfield" MULTIPLE SIZE=4> -<OPTION VALUE="[Bug creation]">[Bug creation]<OPTION VALUE="assigned_to">assigned_to<OPTION VALUE="bug_file_loc">bug_file_loc<OPTION VALUE="bug_severity">bug_severity<OPTION VALUE="bug_status">bug_status<OPTION VALUE="component">component<OPTION VALUE="everconfirmed">everconfirmed<OPTION VALUE="groupset">groupset<OPTION VALUE="keywords">keywords<OPTION VALUE="op_sys">op_sys<OPTION VALUE="priority">priority<OPTION VALUE="product">product<OPTION VALUE="qa_contact">qa_contact<OPTION VALUE="rep_platform">rep_platform<OPTION VALUE="reporter">reporter<OPTION VALUE="resolution">resolution<OPTION VALUE="short_desc">short_desc<OPTION VALUE="status_whiteboard">status_whiteboard<OPTION VALUE="target_milestone">target_milestone<OPTION VALUE="version">version<OPTION VALUE="votes">votes -</SELECT> changed to <INPUT NAME="chfieldvalue" SIZE="10"> +and the result was: <INPUT NAME="chfieldvalue" SIZE="10"> </td> </tr> +<tr><td> </td></tr> <tr> -<td colspan=2> -During dates <INPUT NAME="chfieldfrom" SIZE="10" VALUE=""> -to <INPUT NAME="chfieldto" SIZE="10" VALUE="Now"> +<td> +Containing at least <INPUT NAME=votes SIZE=3 VALUE=""> votes </td> </tr> <tr> @@ -847,29 +881,23 @@ exclude bugs based on values you enter. of which you want to exclude. It would be nice in the future if you could type in ranges, i.e. [1-1000] for 1 to 1000. Unfortunately, you cannot do that as of now. -<p><b>Changed in the last [text] days</b> - -<p>Lets you specify how many days ago - at maximum - a bug could have changed state. - <p><b>At least [text] votes</b> <p>With this, you can choose how many votes - at minimum - a bug has. -<p><b>Where the field(s) [fields] changed to [text]</b> +<a name="changedbetween"> +<p><b>Only bugs changed between</b></p> -<p>With this, you can specify values to search for in fields that exist in the bug If you choose -one or more fields, you have to fill out one of the fields to the right. It might -be difficult to figure out what these fields mean if you are a newbie to the query. -They match various fields within the bug information. Optionally, you can -also enter what value you want the field to have changed to if you only entered one field. -For instance, if the bug changed who it was assigned to from jon\@netscape.com -to brian\@netscape.com , you could enter in -assigned_to changed to brian\@netscape.com. +<p>Here you can choose what dates the bugs changed. "Now" can be used as an +entry. Other entries should be in yyyy-mm-dd format, or in relative dates such +as 1d or 2w or 3m or 4y, which respectively mean 1 day, 2 weeks, 3 months, 4 +years ago. 0d is last midnight, and 0w, 0m, 0y is the beginning of this week, +month, or year.</p> -<p><b>During dates [text] to [text] </b> +<p><b>Where one or more of the following changed, and the result was</b></p> -<p>Here, you can choose what dates the fields changed. "Now" can be used as an entry. Other entries should be in -mm/dd/yyyy or yyyy-mm-dd format. +<p>With this you can specify which bug fields changed, and optionally to what +value, between the dates specified above. Leaving blank will match any change.</p> }; diff --git a/quips.cgi b/quips.cgi index 02109fcdaca87ca4518b7e4c1451ee3b7c7d0c45..4559e7b911135fcf9e2b41f2ea5764e87c88e65b 100755 --- a/quips.cgi +++ b/quips.cgi @@ -39,6 +39,8 @@ require "CGI.pl"; ConnectToDatabase(); confirm_login(); +my $cgi = Bugzilla->cgi; + if (Param('enablequips') eq "off") { ThrowUserError("quips_disabled"); } @@ -129,6 +131,6 @@ if ($action eq "delete") { SendSQL("DELETE FROM quips WHERE quipid = $quipid"); } -print "Content-type: text/html\n\n"; +print $cgi->header(); $template->process("list/quips.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/relogin.cgi b/relogin.cgi index c0182de491a4a2d896edfb39aa757521e1d11fa7..65cb07b25a3c9c8075923542e51992233ee3b46e 100755 --- a/relogin.cgi +++ b/relogin.cgi @@ -37,6 +37,8 @@ require "CGI.pl"; ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + if ($::userid) { # Even though we know the userid must match, we still check it in the # SQL as a sanity check, since there is no locking here, and if @@ -49,17 +51,19 @@ if ($::userid) { "AND userid = $::userid"); } -my $cookiepath = Param("cookiepath"); -print "Set-Cookie: Bugzilla_login= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT -Set-Cookie: Bugzilla_logincookie= ; path=$cookiepath; expires=Sun, 30-Jun-80 00:00:00 GMT -"; +$cgi->send_cookie(-name => "Bugzilla_login", + -expires => "Tue, 15-Sep-1998 21:49:00 GMT"); +$cgi->send_cookie(-name => "Bugzilla_logincookie", + -expires => "Tue, 15-Sep-1998 21:49:00 GMT"); delete $::COOKIE{"Bugzilla_login"}; -$vars->{'message'} = "logged_out"; -$vars->{'user'} = {}; +$vars->{'message'} = "logged_out"; + +# This entire script should eventually just become a call to Bugzilla->logout +Bugzilla->logout; -print "Content-Type: text/html\n\n"; +print $cgi->header(); $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/report.cgi b/report.cgi index 2a081606b0a53c8041619bce05c21125a371edd4..72e69a0fdaa58e5ffb89f553e4a7195cb3adfd58 100755 --- a/report.cgi +++ b/report.cgi @@ -26,15 +26,19 @@ use lib "."; require "CGI.pl"; -use vars qw($cgi $template $vars); +use vars qw($template $vars); use Bugzilla; +my $cgi = Bugzilla->cgi; + # Go straight back to query.cgi if we are adding a boolean chart. if (grep(/^cmd-/, $cgi->param())) { my $params = $cgi->canonicalise_query("format", "ctype"); - print "Location: query.cgi?format=" . $cgi->param('query_format') . - ($params ? "&$params" : "") . "\n\n"; + my $location = "query.cgi?format=" . $cgi->param('query_format') . + ($params ? "&$params" : "") . "\n\n"; + + print $cgi->redirect($location); exit; } @@ -52,7 +56,7 @@ my $action = $cgi->param('action') || 'menu'; if ($action eq "menu") { # No need to do any searching in this case, so bail out early. - print "Content-Type: text/html\n\n"; + print $cgi->header(); $template->process("reports/menu.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit; @@ -152,6 +156,13 @@ my %names; # Read the bug data and count the bugs for each possible value of row, column # and table. +# +# We detect a numerical field, and sort appropriately, if all the values are +# numeric. +my $col_isnumeric = 1; +my $row_isnumeric = 1; +my $tbl_isnumeric = 1; + while (MoreSQLData()) { my ($row, $col, $tbl) = FetchSQLData(); $row = "" if ($row eq $columns{''}); @@ -162,11 +173,35 @@ while (MoreSQLData()) { $names{"col"}{$col}++; $names{"row"}{$row}++; $names{"tbl"}{$tbl}++; + + $col_isnumeric &&= ($col =~ /^-?\d+(\.\d+)?$/o); + $row_isnumeric &&= ($row =~ /^-?\d+(\.\d+)?$/o); + $tbl_isnumeric &&= ($tbl =~ /^-?\d+(\.\d+)?$/o); +} + +my @col_names; +my @row_names; +my @tbl_names; +sub numerically { $a <=> $b } + +# Use the appropriate sort for each dimension +if ($col_isnumeric) { + @col_names = sort numerically keys(%{$names{"col"}}); +} else { + @col_names = sort(keys(%{$names{"col"}})); +} + +if ($row_isnumeric) { + @row_names = sort numerically keys(%{$names{"row"}}); +} else { + @row_names = sort(keys(%{$names{"row"}})); } -my @col_names = sort(keys(%{$names{"col"}})); -my @row_names = sort(keys(%{$names{"row"}})); -my @tbl_names = sort(keys(%{$names{"tbl"}})); +if ($tbl_isnumeric) { + @tbl_names = sort numerically keys(%{$names{"tbl"}}); +} else { + @tbl_names = sort(keys(%{$names{"tbl"}})); +} # The GD::Graph package requires a particular format of data, so once we've # gathered everything into the hashes and made sure we know the size of the @@ -194,7 +229,7 @@ foreach my $tbl (@tbl_names) { push(@tbl_data, \@col_data); } - push(@image_data, \@tbl_data); + unshift(@image_data, \@tbl_data); } $vars->{'col_field'} = $col_field; @@ -207,16 +242,14 @@ $vars->{'row_names'} = \@row_names; $vars->{'tbl_names'} = \@tbl_names; # Below a certain width, we don't see any bars, so there needs to be a minimum. -if ($cgi->param('format') eq "bar") { - my $min_width = (scalar(@col_names) || 1) * 10; +if ($width && $cgi->param('format') eq "bar") { + my $min_width = (scalar(@col_names) || 1) * 20; if (!$cgi->param('cumulate')) { $min_width *= (scalar(@row_names) || 1); } - if ($width < $min_width) { - $width = $min_width; - } + $vars->{'min_width'} = $min_width; } $vars->{'width'} = $width if $width; @@ -254,7 +287,7 @@ if ($action eq "wrap") { $vars->{'imagebase'} = $cgi->canonicalise_query( $tbl_field, "action", "ctype", "format", "width", "height"); $vars->{'switchbase'} = $cgi->canonicalise_query( - "action", "ctype", "format", "width", "height"); + "query_format", "action", "ctype", "format", "width", "height"); $vars->{'data'} = \%data; } elsif ($action eq "plot") { @@ -278,8 +311,8 @@ $format->{'ctype'} = "text/html" if $::FORM{'debug'}; my @time = localtime(time()); my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; my $filename = "report-$date.$format->{extension}"; -print "Content-Disposition: inline; filename=$filename\n"; -print "Content-Type: $format->{'ctype'}\n\n"; +print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "inline; filename=$filename"); # Problems with this CGI are often due to malformed data. Setting debug=1 # prints out both data structures. diff --git a/reports.cgi b/reports.cgi index d3b1d943171e6a1263d681b3db6457d91c3a8782..71ecf6c31d13e248223a9b4853821d4106293459 100755 --- a/reports.cgi +++ b/reports.cgi @@ -62,6 +62,8 @@ GetVersionTable(); Bugzilla->switch_to_shadow_db(); +my $cgi = Bugzilla->cgi; + # We only want those products that the user has permissions for. my @myproducts; push( @myproducts, "-All-"); @@ -69,7 +71,7 @@ push( @myproducts, GetSelectableProducts()); if (! defined $FORM{'product'}) { - print "Content-type: text/html\n\n"; + print $cgi->header(); PutHeader("Bug Charts"); choose_product(@myproducts); PutFooter(); @@ -93,10 +95,7 @@ if (! defined $FORM{'product'}) { # This means that is OK to detaint trick_taint($FORM{'product'}); - # Output appropriate HTTP response headers - print "Content-type: text/html\n"; - # Changing attachment to inline to resolve 46897 - zach@zachlipton.com - print "Content-disposition: inline; filename=bugzilla_report.html\n\n"; + print $cgi->header(-Content_Disposition=>'inline; filename=bugzilla_report.html'); PutHeader("Bug Charts"); diff --git a/request.cgi b/request.cgi index 7909163594935301d55a97eded8145668f9eeace..3672e0449426da3e5d97234d898f51e7ad8246e6 100755 --- a/request.cgi +++ b/request.cgi @@ -165,10 +165,10 @@ sub queue { push(@criteria, "bugs.component_id = $component_id"); push(@excluded_columns, 'component') unless $::FORM{'do_union'}; } - else { ThrowCodeError("unknown_component", { %::FORM }) } + else { ThrowCodeError("unknown_component", { component => $::FORM{component} }) } } } - else { ThrowCodeError("unknown_product", { %::FORM }) } + else { ThrowCodeError("unknown_product", { product => $::FORM{product} }) } } # Filter results by flag types. @@ -266,7 +266,7 @@ sub queue { $vars->{'types'} = \@types; # Return the appropriate HTTP response headers. - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. $template->process("request/queue.html.tmpl", $vars) @@ -281,7 +281,8 @@ sub validateStatus { return if !defined($::FORM{'status'}); grep($::FORM{'status'} eq $_, qw(? +- + - all)) - || ThrowCodeError("flag_status_invalid", { status => $::FORM{'status'} }); + || ThrowCodeError("flag_status_invalid", + { status => $::FORM{'status'} }); } sub validateGroup { diff --git a/sanitycheck.cgi b/sanitycheck.cgi index 16a12396782af4a2a2c1dabbb9c8e3de81d6f4b5..2daef91c3d809fe74570fcf4a88b9a2e47e439af 100755 --- a/sanitycheck.cgi +++ b/sanitycheck.cgi @@ -49,6 +49,23 @@ sub BugLink { return "<a href=\"show_bug.cgi?id=$id\">$id</a>"; } +# +# Parameter is a list of bug ids. +# +# Return is a string containing a list of all the bugids, as hrefs, +# followed by a link to them all as a buglist +sub BugListLinks { + my @bugs = @_; + + # Historically, GetBugLink() wasn't used here. I'm guessing this + # was because it didn't exist or is too performance heavy, or just + # plain unnecessary + my @bug_links = map(BugLink($_), @bugs); + + return join(', ',@bug_links) . " <a href=\"buglist.cgi?bug_id=" . + join(',',@bugs) . "\">(as buglist)</a>"; +} + ########################################################################### # Start ########################################################################### @@ -82,7 +99,7 @@ if (exists $::FORM{'rebuildvotecache'}) { Status("OK, now rebuilding vote cache."); SendSQL("lock tables bugs write, votes read"); SendSQL("update bugs set votes = 0, delta_ts=delta_ts"); - SendSQL("select bug_id, sum(count) from votes group by bug_id"); + SendSQL("select bug_id, sum(vote_count) from votes group by bug_id"); my %votes; while (@row = FetchSQLData()) { my ($id, $v) = (@row); @@ -106,12 +123,16 @@ if (exists $::FORM{'rederivegroups'}) { } # rederivegroupsnow is REALLY only for testing. +# If it wasn't, then we'd do this the faster way as a per-group +# thing rather than per-user for group inheritance if (exists $::FORM{'rederivegroupsnow'}) { + require Bugzilla::User; Status("OK, now rederiving groups."); SendSQL("SELECT userid FROM profiles"); while ((my $id) = FetchSQLData()) { - DeriveGroup($id); - Status("Group $id"); + my $user = new Bugzilla::User($id); + $user->derive_groups(); + Status("User $id"); } } @@ -195,7 +216,8 @@ foreach my $field (("bug_severity", "bug_status", "op_sys", push (@invalid, FetchOneColumn()); } if (@invalid) { - Alert("Bug(s) found with invalid $field value: ".join(', ',@invalid)); + Alert("Bug(s) found with invalid $field value: ". + BugListLinks(@invalid)); } } @@ -433,7 +455,7 @@ while (@row = FetchSQLData()) { } Status("Checking cached vote counts"); -SendSQL("select bug_id, sum(count) from votes group by bug_id"); +SendSQL("select bug_id, sum(vote_count) from votes group by bug_id"); while (@row = FetchSQLData()) { my ($id, $v) = (@row); @@ -531,8 +553,8 @@ foreach my $b (keys(%realk)) { } if (@badbugs) { @badbugs = sort {$a <=> $b} @badbugs; - Alert("Bug(s) found with incorrect keyword cache: " . - join(', ', @badbugs)); + Alert(scalar(@badbugs) . " bug(s) found with incorrect keyword cache: " . + BugListLinks(@badbugs)); if (exists $::FORM{'rebuildkeywordcache'}) { Status("OK, now fixing keyword cache."); foreach my $b (@badbugs) { @@ -571,11 +593,9 @@ sub BugCheck ($$) { my ($id) = (@row); push (@badbugs, $id); } - - @badbugs = map(BugLink($_), @badbugs); - + if (@badbugs) { - Alert("$errortext: " . join(', ', @badbugs)); + Alert("$errortext: " . BugListLinks(@badbugs)); } } @@ -705,7 +725,8 @@ while (@row = FetchSQLData()) { if (@badbugs > 0) { Alert("Bugs that have changes but no mail sent for at least half an hour: " . - join (", ", @badbugs)); + BugListLinks(@badbugs)); + print qq{<a href="sanitycheck.cgi?rescanallBugMail=1">Send these mails</a>.<p>\n}; } diff --git a/show_activity.cgi b/show_activity.cgi index c748c3df7621c9eeb40eed91b915495a1fcfb3aa..8c636ea0b9330ba6e2168f15e08c3936c72f4f98 100755 --- a/show_activity.cgi +++ b/show_activity.cgi @@ -51,7 +51,7 @@ ValidateBugID($::FORM{'id'}); $vars->{'bug_id'} = $::FORM{'id'}; -print "Content-type: text/html\n\n"; +print Bugzilla->cgi->header(); $template->process("bug/activity/show.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/show_bug.cgi b/show_bug.cgi index c4c05f42cc842ad2b3037ff870976e0978d88983..c7a780404895e57a6df2884746e509ed5b637c77 100755 --- a/show_bug.cgi +++ b/show_bug.cgi @@ -24,14 +24,18 @@ use strict; use lib qw(.); +use Bugzilla; + require "CGI.pl"; ConnectToDatabase(); -use vars qw($cgi $template $vars $userid); +use vars qw($template $vars $userid); use Bug; +my $cgi = Bugzilla->cgi; + if ($::FORM{'GoAheadAndLogIn'}) { confirm_login(); } else { @@ -44,7 +48,7 @@ my $single = !$cgi->param('format') # If we don't have an ID, _AND_ we're only doing a single bug, then prompt if (!defined $cgi->param('id') && $single) { - print "Content-type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("bug/choose.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit; @@ -69,6 +73,12 @@ if ($single) { } } +# Determine if Patch Viewer is installed, for Diff link +eval { + require PatchReader; + $vars->{'patchviewerinstalled'} = 1; +}; + $vars->{'bugs'} = \@bugs; # Next bug in list (if there is one) @@ -100,6 +110,7 @@ foreach ($cgi->param("excludefield")) { $vars->{'displayfields'} = \%displayfields; -print "Content-type: $format->{'ctype'}\n\n"; +print $cgi->header($format->{'ctype'}); + $template->process("$format->{'template'}", $vars) || ThrowTemplateError($template->error()); diff --git a/showattachment.cgi b/showattachment.cgi index bfe9ef9888a987d533534ac2047b6c0174f32674..82fc1ba9a9c91bbd6d013884be2ac92d89a6d78f 100755 --- a/showattachment.cgi +++ b/showattachment.cgi @@ -25,12 +25,16 @@ use strict; use lib qw(.); -require "CGI.pl"; +use Bugzilla; +use Bugzilla::Util; + +my $cgi = Bugzilla->cgi; + +my $id = $cgi->param('attach_id'); +detaint_natural($id) if defined $id; +$id ||= ""; + +print $cgi->redirect(-location=>"attachment.cgi?id=$id&action=view", + -status=>'301 Permanent Redirect'); -# Redirect to the new interface for displaying attachments. -detaint_natural($::FORM{'attach_id'}) if defined($::FORM{'attach_id'}); -my $id = $::FORM{'attach_id'} || ""; -print "Status: 301 Permanent Redirect\n"; -print "Location: attachment.cgi?id=$id&action=view\n\n"; exit; - diff --git a/showdependencygraph.cgi b/showdependencygraph.cgi index 61278b5f32b7de8ab652a1771c79355525e15637..d13f77c5db9fa63c264c2bbe3dd1cf5a107c40f6 100755 --- a/showdependencygraph.cgi +++ b/showdependencygraph.cgi @@ -26,6 +26,7 @@ use strict; use lib qw(.); use File::Temp; +use Bugzilla; require "CGI.pl"; @@ -33,6 +34,8 @@ ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + # Connect to the shadow database if this installation is using one to improve # performance. Bugzilla->switch_to_shadow_db(); @@ -157,7 +160,7 @@ foreach my $k (keys(%seen)) { push(@params, "shape=box"); } - if ($stat =~ /^(NEW|ASSIGNED|REOPENED)$/) { + if (IsOpenedState($stat)) { push(@params, "color=green"); } @@ -228,6 +231,6 @@ $vars->{'rankdir'} = $::FORM{'rankdir'}; $vars->{'showsummary'} = $::FORM{'showsummary'}; # Generate and return the UI (HTML page) from the appropriate template. -print "Content-type: text/html\n\n"; +print $cgi->header(); $template->process("bug/dependency-graph.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/showdependencytree.cgi b/showdependencytree.cgi index 9149296b75d26a58491d2d78db532712eab7e790..d9f642a3e5249833f1855d45e9c7327dee4ae558 100755 --- a/showdependencytree.cgi +++ b/showdependencytree.cgi @@ -37,6 +37,8 @@ ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + # Connect to the shadow database if this installation is using one to improve # performance. Bugzilla->switch_to_shadow_db(); @@ -95,7 +97,7 @@ $vars->{'maxdepth'} = $maxdepth; $vars->{'hide_resolved'} = $hide_resolved; $vars->{'canedit'} = UserInGroup("editbugs"); -print "Content-Type: text/html\n\n"; +print $cgi->header(); $template->process("bug/dependency-tree.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/sidebar.cgi b/sidebar.cgi index 7a054abc2b14a26543d1693d9ed2b0ce44244a21..cf801eba3337e93d2d0eaa43a4d4896ad66f83b5 100755 --- a/sidebar.cgi +++ b/sidebar.cgi @@ -29,30 +29,12 @@ use vars qw( ConnectToDatabase(); quietly_check_login(); +my $cgi = Bugzilla->cgi; + ############################################################################### # Main Body Execution ############################################################################### -$vars->{'username'} = $::COOKIE{'Bugzilla_login'} || ''; - -if (defined $::COOKIE{'Bugzilla_login'}) { - SendSQL("SELECT mybugslink, userid FROM profiles " . - "WHERE login_name = " . SqlQuote($::COOKIE{'Bugzilla_login'})); - my ($mybugslink, $userid) = (FetchSQLData()); - $vars->{'userid'} = $userid; - $vars->{'canblessanything'} = UserCanBlessAnything(); - if ($mybugslink) { - my $mybugstemplate = Param("mybugstemplate"); - my %substs = ( 'userid' => url_quote($::COOKIE{'Bugzilla_login'}) ); - $vars->{'mybugsurl'} = PerformSubsts($mybugstemplate, \%substs); - } - SendSQL("SELECT name FROM namedqueries WHERE userid = $userid AND linkinfooter"); - while (MoreSQLData()) { - my ($name) = FetchSQLData(); - push(@{$vars->{'namedqueries'}}, $name); - } -} - # This sidebar is currently for use with Mozilla based web browsers. # Internet Explorer 6 is supposed to have a similar feature, but it # most likely won't support XUL ;) When that does come out, this @@ -63,13 +45,10 @@ if (defined $::COOKIE{'Bugzilla_login'}) { my $useragent = $ENV{HTTP_USER_AGENT}; if ($useragent =~ m:Mozilla/([1-9][0-9]*):i && $1 >= 5 && $useragent !~ m/compatible/i) { - print "Content-type: application/vnd.mozilla.xul+xml\n\n"; + print $cgi->header("application/vnd.mozilla.xul+xml"); # Generate and return the XUL from the appropriate template. $template->process("sidebar.xul.tmpl", $vars) || ThrowTemplateError($template->error()); } else { ThrowUserError("sidebar_supports_mozilla_only"); } - - - diff --git a/t/004template.t b/t/004template.t index 8429b774f8e80697d5548c85ed70224367f7d9b2..136a74f069e062f7a18423e5862c9be5fb92a013 100644 --- a/t/004template.t +++ b/t/004template.t @@ -92,11 +92,13 @@ foreach my $include_path (@include_paths) { js => sub { return $_ } , strike => sub { return $_ } , url_quote => sub { return $_ } , + css_class_quote => sub { return $_ } , xml => sub { return $_ } , quoteUrls => sub { return $_ } , bug_link => [ sub { return sub { return $_; } }, 1] , csv => sub { return $_ } , time => sub { return $_ } , + none => sub { return $_ } , }, } ); diff --git a/t/008filter.t b/t/008filter.t index 10d7fc62c2028ed9e8a1c6756ea78a135fa81559..8b8b36d5cec7f6d389990a6d1e73dce167e1ea8f 100644 --- a/t/008filter.t +++ b/t/008filter.t @@ -41,14 +41,17 @@ use Cwd; # Undefine the record separator so we can read in whole files at once my $oldrecsep = $/; -$/ = undef; my $topdir = cwd; +$/ = undef; foreach my $path (@Support::Templates::include_paths) { - $path =~ m|template/([^/]+)/|; + $path =~ m|template/([^/]+)/([^/]+)|; my $lang = $1; + my $flavor = $2; + chdir $topdir; # absolute path my @testitems = Support::Templates::find_actual_files($path); + chdir $topdir; # absolute path next unless @testitems; @@ -79,7 +82,7 @@ foreach my $path (@Support::Templates::include_paths) { # There are some files we don't check, because there is no need to # filter their contents due to their content-type. if ($file =~ /\.(txt|png)\.tmpl$/) { - ok(1, "($lang) $file is filter-safe"); + ok(1, "($lang/$flavor) $file is filter-safe"); next; } @@ -98,64 +101,20 @@ foreach my $path (@Support::Templates::include_paths) { my @lineno = ($` =~ m/\n/gs); my $lineno = scalar(@lineno) + 1; - # Comments - next if $directive =~ /^[+-]?#/; - - # Remove any leading/trailing + or - and whitespace. - $directive =~ s/^[+-]?\s*//; - $directive =~ s/\s*[+-]?$//; + if (!directive_ok($file, $directive)) { - # Directives - next if $directive =~ /^(IF|END|UNLESS|FOREACH|PROCESS|INCLUDE| - BLOCK|USE|ELSE|NEXT|LAST|DEFAULT|FLUSH| - ELSIF|SET|SWITCH|CASE)/x; - - # Simple assignments - next if $directive =~ /^[\w\.\$]+\s+=\s+/; - - # Conditional literals with either sort of quotes - # There must be no $ in the string for it to be a literal - next if $directive =~ /^(["'])[^\$]*[^\\]\1/; - - # Special values always used for numbers - next if $directive =~ /^[ijkn]$/; - next if $directive =~ /^count$/; - - # Params - next if $directive =~ /^Param\(/; - - # Other functions guaranteed to return OK output - next if $directive =~ /^(time2str|GetBugLink)\(/; - - # Safe Template Toolkit virtual methods - next if $directive =~ /\.(size)$/; - - # Special Template Toolkit loop variable - next if $directive =~ /^loop\.(index|count)$/; - - # Things which are already filtered - # Note: If a single directive prints two things, and only one is - # filtered, we may not catch that case. - next if $directive =~ /FILTER\ (html|csv|js|url_quote|quoteUrls| - time|uri|xml)/x; - - # Exclude those on the nofilter list - if (defined($safe{$file}{$directive})) { - $safe{$file}{$directive}++; - next; - }; - - # This intentionally makes no effort to eliminate duplicates; to do - # so would merely make it more likely that the user would not - # escape all instances when attempting to correct an error. - push(@unfiltered, "$lineno:$directive"); + # This intentionally makes no effort to eliminate duplicates; to do + # so would merely make it more likely that the user would not + # escape all instances when attempting to correct an error. + push(@unfiltered, "$lineno:$directive"); + } } my $fullpath = File::Spec->catfile($path, $file); if (@unfiltered) { my $uflist = join("\n ", @unfiltered); - ok(0, "($lang) $fullpath has unfiltered directives:\n $uflist\n--ERROR"); + ok(0, "($lang/$flavor) $fullpath has unfiltered directives:\n $uflist\n--ERROR"); } else { # Find any members of the exclusion list which were not found @@ -166,17 +125,85 @@ foreach my $path (@Support::Templates::include_paths) { if (@notfound) { my $nflist = join("\n ", @notfound); - ok(0, "($lang) $fullpath - FEL has extra members:\n $nflist\n" . + ok(0, "($lang/$flavor) $fullpath - FEL has extra members:\n $nflist\n" . "--WARNING"); } else { # Don't use the full path here - it's too long and unwieldy. - ok(1, "($lang) $file is filter-safe"); + ok(1, "($lang/$flavor) $file is filter-safe"); } } } } +sub directive_ok { + my ($file, $directive) = @_; + + # Comments + return 1 if $directive =~ /^[+-]?#/; + + # Remove any leading/trailing + or - and whitespace. + $directive =~ s/^[+-]?\s*//; + $directive =~ s/\s*[+-]?$//; + + # Exclude those on the nofilter list + if (defined($safe{$file}{$directive})) { + $safe{$file}{$directive}++; + return 1; + }; + + # Directives + return 1 if $directive =~ /^(IF|END|UNLESS|FOREACH|PROCESS|INCLUDE| + BLOCK|USE|ELSE|NEXT|LAST|DEFAULT|FLUSH| + ELSIF|SET|SWITCH|CASE|WHILE)/x; + + # ? : + if ($directive =~ /.+\?(.+):(.+)/) { + return 1 if directive_ok($file, $1) && directive_ok($file, $2); + } + + # + - * / + return 1 if $directive =~ /[+\-*\/]/; + + # Numbers + return 1 if $directive =~ /^[0-9]+$/; + + # Simple assignments + return 1 if $directive =~ /^[\w\.\$]+\s+=\s+/; + + # Conditional literals with either sort of quotes + # There must be no $ in the string for it to be a literal + return 1 if $directive =~ /^(["'])[^\$]*[^\\]\1/; + return 1 if $directive =~ /^(["'])\1/; + + # Special values always used for numbers + return 1 if $directive =~ /^[ijkn]$/; + return 1 if $directive =~ /^count$/; + + # Params + return 1 if $directive =~ /^Param\(/; + + # Other functions guaranteed to return OK output + return 1 if $directive =~ /^(time2str|GetBugLink|url)\(/; + + # Safe Template Toolkit virtual methods + return 1 if $directive =~ /\.(size)$/; + + # Special Template Toolkit loop variable + return 1 if $directive =~ /^loop\.(index|count)$/; + + # Branding terms + return 1 if $directive =~ /^terms\./; + + # Things which are already filtered + # Note: If a single directive prints two things, and only one is + # filtered, we may not catch that case. + return 1 if $directive =~ /FILTER\ (html|csv|js|url_quote|css_class_quote| + quoteUrls|time|uri|xml|lower|none)/x; + + return 0; +} + $/ = $oldrecsep; exit 0; diff --git a/t/CVS/Entries b/t/CVS/Entries index 65cc7af66badc2fbc608b84001aa7dc025483c0c..50df48d96ed27ee2c2b1fa32398d832845b17aec 100644 --- a/t/CVS/Entries +++ b/t/CVS/Entries @@ -1,9 +1,9 @@ -/001compile.t/1.10/Mon Dec 9 22:32:09 2002//TBUGZILLA-2_17_4 -/002goodperl.t/1.12/Thu Mar 27 00:07:02 2003//TBUGZILLA-2_17_4 -/003safesys.t/1.5/Mon Dec 9 22:32:09 2002//TBUGZILLA-2_17_4 -/004template.t/1.24/Thu Jan 23 23:34:07 2003//TBUGZILLA-2_17_4 -/005no_tabs.t/1.12/Thu Jan 23 23:34:07 2003//TBUGZILLA-2_17_4 -/006spellcheck.t/1.3/Fri Jan 10 23:51:38 2003//TBUGZILLA-2_17_4 -/007util.t/1.4/Tue Jan 28 22:32:53 2003//TBUGZILLA-2_17_4 -/008filter.t/1.2/Thu Apr 24 20:49:29 2003//TBUGZILLA-2_17_4 +/001compile.t/1.10/Mon Dec 9 22:32:09 2002//TBUGZILLA-2_17_5 +/002goodperl.t/1.12/Thu Mar 27 00:07:02 2003//TBUGZILLA-2_17_5 +/003safesys.t/1.5/Mon Dec 9 22:32:09 2002//TBUGZILLA-2_17_5 +/004template.t/1.28/Thu Sep 11 22:57:19 2003//TBUGZILLA-2_17_5 +/005no_tabs.t/1.12/Thu Jan 23 23:34:07 2003//TBUGZILLA-2_17_5 +/006spellcheck.t/1.3/Fri Jan 10 23:51:38 2003//TBUGZILLA-2_17_5 +/007util.t/1.4/Tue Jan 28 22:32:53 2003//TBUGZILLA-2_17_5 +/008filter.t/1.7/Sat Sep 6 19:23:43 2003//TBUGZILLA-2_17_5 D/Support//// diff --git a/t/CVS/Tag b/t/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/t/CVS/Tag +++ b/t/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/t/Support/CVS/Entries b/t/Support/CVS/Entries index e0dadd93d6a7bf79883d22a6970b1f0b79631a05..88b2e6179cb681046319308bd3d9cd1fe96ffa4c 100644 --- a/t/Support/CVS/Entries +++ b/t/Support/CVS/Entries @@ -1,4 +1,4 @@ -/Files.pm/1.14/Sat Mar 22 04:47:23 2003//TBUGZILLA-2_17_4 -/Systemexec.pm/1.2/Fri Oct 19 22:39:51 2001//TBUGZILLA-2_17_4 -/Templates.pm/1.12/Thu Jan 23 23:34:10 2003//TBUGZILLA-2_17_4 +/Files.pm/1.14/Sat Mar 22 04:47:23 2003//TBUGZILLA-2_17_5 +/Systemexec.pm/1.2/Fri Oct 19 22:39:51 2001//TBUGZILLA-2_17_5 +/Templates.pm/1.12/Thu Jan 23 23:34:10 2003//TBUGZILLA-2_17_5 D diff --git a/t/Support/CVS/Tag b/t/Support/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/t/Support/CVS/Tag +++ b/t/Support/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/CVS/Entries b/template/CVS/Entries index ba6deb093a06647c3a1838067623a09e3c4130fb..4b9d85dc94db8c7b028bd6b3a0181fdf695cbc2d 100644 --- a/template/CVS/Entries +++ b/template/CVS/Entries @@ -1,2 +1,2 @@ -/.cvsignore/1.3/Tue May 7 21:33:53 2002//TBUGZILLA-2_17_4 +/.cvsignore/1.3/Tue May 7 21:33:53 2002//TBUGZILLA-2_17_5 D/en//// diff --git a/template/CVS/Tag b/template/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/CVS/Tag +++ b/template/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/CVS/Entries b/template/en/CVS/Entries index 39bbe35da8cd93f703f35aa4b24728d9d7888b90..e0cd445a845423c44af699bcc70f2206db58dab8 100644 --- a/template/en/CVS/Entries +++ b/template/en/CVS/Entries @@ -1,2 +1,2 @@ -/.cvsignore/1.1/Wed Apr 24 07:29:49 2002//TBUGZILLA-2_17_4 +/.cvsignore/1.1/Wed Apr 24 07:29:49 2002//TBUGZILLA-2_17_5 D/default//// diff --git a/template/en/CVS/Tag b/template/en/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/CVS/Tag +++ b/template/en/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/CVS/Entries b/template/en/default/CVS/Entries index 2a2cad63adfd9f51ff955b92420ceb736307cdc2..4dd605c3f6c4132c038f1be25be778aec23f46c1 100644 --- a/template/en/default/CVS/Entries +++ b/template/en/default/CVS/Entries @@ -1,6 +1,8 @@ -/filterexceptions.pl/1.2/Thu Apr 24 20:49:32 2003//TBUGZILLA-2_17_4 -/index.html.tmpl/1.10/Mon Dec 9 00:24:37 2002//TBUGZILLA-2_17_4 -/sidebar.xul.tmpl/1.9/Thu Apr 3 12:39:06 2003//TBUGZILLA-2_17_4 +/config.js.tmpl/1.4/Mon Jun 23 18:01:38 2003//TBUGZILLA-2_17_5 +/config.rdf.tmpl/1.4/Mon Jun 23 18:01:39 2003//TBUGZILLA-2_17_5 +/filterexceptions.pl/1.11/Wed Oct 29 04:51:15 2003//TBUGZILLA-2_17_5 +/index.html.tmpl/1.12/Wed Sep 24 08:00:13 2003//TBUGZILLA-2_17_5 +/sidebar.xul.tmpl/1.11/Thu Jul 3 21:31:53 2003//TBUGZILLA-2_17_5 D/account//// D/admin//// D/attachment//// diff --git a/template/en/default/CVS/Entries.Log b/template/en/default/CVS/Entries.Log new file mode 100644 index 0000000000000000000000000000000000000000..1d3f921a5b1d2c2e3db23f07aee249aacc129da0 --- /dev/null +++ b/template/en/default/CVS/Entries.Log @@ -0,0 +1,2 @@ +A D/email//// +R D/email//// diff --git a/template/en/default/CVS/Tag b/template/en/default/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/CVS/Tag +++ b/template/en/default/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/CVS/Entries b/template/en/default/account/CVS/Entries index 02558d596c369bec80d499c59a9332e18b4bb801..fee1de6fb4fd3dc1bbf9afb58f6b12dc07df7a05 100644 --- a/template/en/default/account/CVS/Entries +++ b/template/en/default/account/CVS/Entries @@ -1,7 +1,7 @@ -/cancel-token.txt.tmpl/1.3/Sun Feb 16 16:11:49 2003//TBUGZILLA-2_17_4 -/create.html.tmpl/1.3/Tue Apr 23 23:27:32 2002//TBUGZILLA-2_17_4 -/created.html.tmpl/1.4/Mon May 6 19:16:50 2002//TBUGZILLA-2_17_4 -/exists.html.tmpl/1.5/Tue May 21 17:53:08 2002//TBUGZILLA-2_17_4 +/cancel-token.txt.tmpl/1.5/Sun Sep 14 16:59:33 2003//TBUGZILLA-2_17_5 +/create.html.tmpl/1.4/Thu Jul 3 21:31:17 2003//TBUGZILLA-2_17_5 +/created.html.tmpl/1.4/Mon May 6 19:16:50 2002//TBUGZILLA-2_17_5 +/exists.html.tmpl/1.6/Thu Jul 3 21:31:17 2003//TBUGZILLA-2_17_5 D/auth//// D/email//// D/password//// diff --git a/template/en/default/account/CVS/Tag b/template/en/default/account/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/account/CVS/Tag +++ b/template/en/default/account/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/auth/CVS/Entries b/template/en/default/account/auth/CVS/Entries index 2780aebeb6fc83991b777b0951169b790d0e50c9..e272c0ced52c94871902465983ebf9b91017117d 100644 --- a/template/en/default/account/auth/CVS/Entries +++ b/template/en/default/account/auth/CVS/Entries @@ -1,3 +1,3 @@ -/ldap-error.html.tmpl/1.1/Sat Mar 22 04:47:27 2003//TBUGZILLA-2_17_4 -/login.html.tmpl/1.2/Thu Apr 24 20:49:34 2003//TBUGZILLA-2_17_4 +/ldap-error.html.tmpl/1.2/Thu Jul 3 21:31:13 2003//TBUGZILLA-2_17_5 +/login.html.tmpl/1.3/Thu Jul 3 21:31:13 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/account/auth/CVS/Tag b/template/en/default/account/auth/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/account/auth/CVS/Tag +++ b/template/en/default/account/auth/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/auth/ldap-error.html.tmpl b/template/en/default/account/auth/ldap-error.html.tmpl index 7615fb32627b858417f8735942f8edbfdf9ba1c9..cc21ba2778b7e40c95adec2f141308691075cc55 100644 --- a/template/en/default/account/auth/ldap-error.html.tmpl +++ b/template/en/default/account/auth/ldap-error.html.tmpl @@ -25,6 +25,8 @@ # of the error. #%] +[% PROCESS global/variables.none.tmpl %] + [% SWITCH auth_err_tag %] [% CASE "cannot_retreive_attr" %] The specified LDAP attribute [% info.attr FILTER html %] was not found. @@ -36,12 +38,12 @@ [% END %] [% CASE "no_userid" %] - Bugzilla created a new account for you, but then could not find the + [% terms.Bugzilla %] created a new account for you, but then could not find the new userid. [% CASE "server_not_defined" %] The LDAP server for authentication has not been defined. - + [% CASE %] Unhandled authentication error: [% auth_err_tag FILTER html %] diff --git a/template/en/default/account/auth/login.html.tmpl b/template/en/default/account/auth/login.html.tmpl index f342b17914034158b3b1966f41c0f9ee06c14470..a2587300eb2d1edf03f5b27d8bfe63da503ab7da 100644 --- a/template/en/default/account/auth/login.html.tmpl +++ b/template/en/default/account/auth/login.html.tmpl @@ -22,11 +22,13 @@ [%# INTERFACE: # target: string. URL to go to after login. # form: hash; the form values which need to be submitted to the target script - # mform: hash; the form values with multiple values which need to be + # mform: hash; the form values with multiple values which need to be # submitted to the target script #%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Login" %] @@ -68,23 +70,23 @@ [% END %] </tr> </table> - + [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password|restrictlogin)$" %] <input type="submit" name="GoAheadAndLogIn" value="Login"> </form> -[%# Allow the user to create a new account, or request a token to change +[%# Allow the user to create a new account, or request a token to change # their password, assuming that our auth method allows that. #%] - + [% IF caneditaccount %] <hr> [% IF Param("createemailregexp") %] <p> - If you don't have a Bugzilla account, you can + If you don't have a [% terms.Bugzilla %] account, you can <a href="createaccount.cgi">create a new account</a>. </p> [% END %] @@ -92,7 +94,7 @@ <form method="get" action="token.cgi"> <input type="hidden" name="a" value="reqpw"> If you have an account, but have forgotten your password, - enter your login name below and submit a request + enter your login name below and submit a request to change your password.<br> <input size="35" name="loginname"> <input type="submit" value="Submit Request"> diff --git a/template/en/default/account/cancel-token.txt.tmpl b/template/en/default/account/cancel-token.txt.tmpl index be926d5e2c32ec633db3a4d5ddaa418dd87c2e35..f014820ef5f2ec2a2556d09225af540e90937f08 100644 --- a/template/en/default/account/cancel-token.txt.tmpl +++ b/template/en/default/account/cancel-token.txt.tmpl @@ -19,16 +19,19 @@ # Contributor(s): John Vandenberg <zeroj@null.net> # Tobias Burnus <burnus@net-b.de> #%] + +[% PROCESS global/variables.none.tmpl %] + From: bugzilla-admin-daemon To: [% emailaddress %] Subject: [% PROCESS subject %] A request was cancelled from [% remoteaddress %]. -If you did not request this, it could be either an honest -mistake or someone attempting to break into your Bugzilla account. +If you did not request this, it could be either an honest +mistake or someone attempting to break into your [% terms.Bugzilla %] account. -Take a look at the information below and forward this email +Take a look at the information below and forward this email to [% maintainer %] if you suspect foul play. Token: [% token %] @@ -54,13 +57,13 @@ Cancelled Because: Account [% email %] already exists. [% ELSIF cancelaction == 'email_change_cancelled' %] - The request to change the email address for the - [% old_email %] account to [% new_email %] - has been cancelled. + The request to change the email address for + the [% old_email %] account to [% new_email %] has + been cancelled. [% ELSIF cancelaction == 'email_change_cancelled_reinstated' %] - The request to change the email address for your account to - [% new_email %] has been cancelled. Your old account + The request to change the email address for your account + to [% new_email %] has been cancelled. Your old account settings have been reinstated. [% ELSIF cancelaction == 'emailold_change_cancelled' %] @@ -84,12 +87,12 @@ Cancelled Because: [% ELSE %] [%# Give sensible error if the cancel-token function is used incorrectly. - #%] - You are using Bugzilla's cancel-token function incorrectly. You + #%] + You are using [% terms.Bugzilla %]'s cancel-token function incorrectly. You passed in the string '[% cancelaction %]'. The correct use is to pass in a tag, and define that tag in the file cancel-token.txt.tmpl. - If you are a Bugzilla end-user seeing this message, please forward this + If you are a [% terms.Bugzilla %] end-user seeing this message, please forward this email to [% Param('maintainer') %]. [% END %] [% END %] diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl index da8979c912cbcbca9acf97ded0e6caef474337c1..ec3964e9f5ca957f9b3329d5a8967ec6e5269ba1 100644 --- a/template/en/default/account/create.html.tmpl +++ b/template/en/default/account/create.html.tmpl @@ -19,14 +19,17 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% PROCESS global/header.html.tmpl - title = "Create a new Bugzilla account" -%] +[% PROCESS global/variables.none.tmpl %] + +[% title = BLOCK %] +Create a new [% terms.Bugzilla %] account +[% END %] +[% PROCESS global/header.html.tmpl %] <p> - To create a Bugzilla account, all that you need to do is to enter a + To create a [% terms.Bugzilla %] account, all that you need to do is to enter a legitimate e-mail address. The account will be created, and its - password will be mailed to you. Optionally you may enter your real name + password will be mailed to you. Optionally you may enter your real name as well. </p> @@ -41,7 +44,7 @@ [% Param('emailsuffix') FILTER html %] </td> </tr> - + <tr> <td align="right"> <b>Real name:</b> @@ -55,4 +58,4 @@ <input type="submit" value="Create Account"> </form> -[% PROCESS global/footer.html.tmpl %] +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/account/email/CVS/Entries b/template/en/default/account/email/CVS/Entries index 5509efb19caf01acf419dd2fc906abd88057889e..b7d9dea1878d4234061caa7c6f12da5420cf3fbf 100644 --- a/template/en/default/account/email/CVS/Entries +++ b/template/en/default/account/email/CVS/Entries @@ -1,4 +1,4 @@ -/change-new.txt.tmpl/1.3/Fri May 3 06:37:42 2002//TBUGZILLA-2_17_4 -/change-old.txt.tmpl/1.4/Mon May 6 19:16:46 2002//TBUGZILLA-2_17_4 -/confirm.html.tmpl/1.7/Sat Aug 10 08:06:52 2002//TBUGZILLA-2_17_4 +/change-new.txt.tmpl/1.4/Thu Jul 3 21:31:21 2003//TBUGZILLA-2_17_5 +/change-old.txt.tmpl/1.5/Thu Jul 3 21:31:21 2003//TBUGZILLA-2_17_5 +/confirm.html.tmpl/1.7/Sat Aug 10 08:06:52 2002//TBUGZILLA-2_17_5 D diff --git a/template/en/default/account/email/CVS/Tag b/template/en/default/account/email/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/account/email/CVS/Tag +++ b/template/en/default/account/email/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/email/change-new.txt.tmpl b/template/en/default/account/email/change-new.txt.tmpl index b07be609cce9f8d8b844b79a700f3f0e1a550c50..5568acc0ce4be96626aef3ee722b41ed2cb1f009 100644 --- a/template/en/default/account/email/change-new.txt.tmpl +++ b/template/en/default/account/email/change-new.txt.tmpl @@ -18,12 +18,15 @@ # # Contributor(s): John Vandenberg <zeroj@null.net> #%] + +[% PROCESS global/variables.none.tmpl %] + [% expiration_ts = token_ts + (max_token_age * 86400) %] From: bugzilla-admin-daemon To: [% emailaddress %] -Subject: Bugzilla Change Email Address Request +Subject: [% terms.Bugzilla %] Change Email Address Request -Bugzilla has received a request to change the email address +[% terms.Bugzilla %] has received a request to change the email address for the [% oldemailaddress %] account to your address. To confirm the change, visit the following link: @@ -35,5 +38,5 @@ this request, visit the following link: [% Param('urlbase') %]token.cgi?a=cxlem&t=[% token FILTER url_quote %] -If you do nothing, the request will lapse after +If you do nothing, the request will lapse after [%- max_token_age %] days ([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) %]). diff --git a/template/en/default/account/email/change-old.txt.tmpl b/template/en/default/account/email/change-old.txt.tmpl index cd1334d3f7ec9030390a00b762c94397da78d6eb..e5fa87e7fe5fdc339ff2f900be103c43d0778c8b 100644 --- a/template/en/default/account/email/change-old.txt.tmpl +++ b/template/en/default/account/email/change-old.txt.tmpl @@ -23,15 +23,18 @@ # newemailaddress: string. The user's new Bugzilla login email address. # token: string. The token associated with this change. #%] + +[% PROCESS global/variables.none.tmpl %] + [% expiration_ts = token_ts + (max_token_age * 86400) %] From: bugzilla-admin-daemon To: [% emailaddress %] -Subject: Bugzilla Change Email Address Request +Subject: [% terms.Bugzilla %] Change Email Address Request Importance: High X-MSMail-Priority: High X-Priority: 1 -Bugzilla has received a request to change the email address +[% terms.Bugzilla %] has received a request to change the email address for your account to [% newemailaddress %]. If you are not the person who made this request, or you wish to cancel @@ -39,6 +42,6 @@ this request, visit the following link: [% Param('urlbase') %]token.cgi?a=cxlem&t=[% token FILTER url_quote %] -If you do nothing, and [% newemailaddress %] confirms this request, the -change will be made permanent after +If you do nothing, and [% newemailaddress %] confirms this request, the +change will be made permanent after [%- max_token_age %] days ([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) %]). diff --git a/template/en/default/account/exists.html.tmpl b/template/en/default/account/exists.html.tmpl index 3516dc7ccb807c24288bb41f913a3cf6abe9f85d..4b3de22093fdaf86d454785da77e34a592faa4c7 100644 --- a/template/en/default/account/exists.html.tmpl +++ b/template/en/default/account/exists.html.tmpl @@ -23,15 +23,17 @@ # login: string. The user's Bugzilla login email address. #%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Account Exists" %] <form method="get" action="token.cgi"> <input type="hidden" name="a" value="reqpw"> <input type="hidden" name="loginname" value="[% login FILTER html %]"> - A Bugzilla account for <tt>[% login FILTER html %]</tt> already exists. If you - are the account holder and have forgotten your password, + A [% terms.Bugzilla %] account for <tt>[% login FILTER html %]</tt> already exists. If you + are the account holder and have forgotten your password, <input type="submit" value="submit a request to change it">. </form> diff --git a/template/en/default/account/password/CVS/Entries b/template/en/default/account/password/CVS/Entries index 397f2f70eefcf3efd3a4863b29b2451ba67b094b..d7cddb6e62c30e6a5b67ebbba9358d5191ff6495 100644 --- a/template/en/default/account/password/CVS/Entries +++ b/template/en/default/account/password/CVS/Entries @@ -1,3 +1,3 @@ -/forgotten-password.txt.tmpl/1.2/Fri May 3 06:37:47 2002//TBUGZILLA-2_17_4 -/set-forgotten-password.html.tmpl/1.5/Sat Aug 10 08:06:56 2002//TBUGZILLA-2_17_4 +/forgotten-password.txt.tmpl/1.3/Thu Jul 3 21:31:23 2003//TBUGZILLA-2_17_5 +/set-forgotten-password.html.tmpl/1.5/Sat Aug 10 08:06:56 2002//TBUGZILLA-2_17_5 D diff --git a/template/en/default/account/password/CVS/Tag b/template/en/default/account/password/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/account/password/CVS/Tag +++ b/template/en/default/account/password/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/password/forgotten-password.txt.tmpl b/template/en/default/account/password/forgotten-password.txt.tmpl index bf3242c08983f91e546b9cf3e1cf1f821d54e44f..c6b04b35a5ed21b9efed888489af9d87656f4677 100644 --- a/template/en/default/account/password/forgotten-password.txt.tmpl +++ b/template/en/default/account/password/forgotten-password.txt.tmpl @@ -18,13 +18,16 @@ # # Contributor(s): John Vandenberg <zeroj@null.net> #%] + +[% PROCESS global/variables.none.tmpl %] + [% expiration_ts = token_ts + (max_token_age * 86400) %] From: bugzilla-admin-daemon To: [% emailaddress %] -Subject: Bugzilla Change Password Request +Subject: [% terms.Bugzilla %] Change Password Request -You (or someone impersonating you) has requested to change your Bugzilla -password. To change your password, visit the following link: +You (or someone impersonating you) has requested to change your [% terms.Bugzilla %] + password. To change your password, visit the following link: [%+ Param('urlbase') %]token.cgi?a=cfmpw&t=[% token FILTER url_quote %] @@ -33,6 +36,6 @@ this request, visit the following link: [%+ Param('urlbase') %]token.cgi?a=cxlpw&t=[% token FILTER url_quote %] -If you do nothing, the request will lapse after -[%- max_token_age %] days +If you do nothing, the request will lapse after +[%- max_token_age %] days ([% time2str("%H:%M on the %o of %B, %Y", expiration_ts) -%]) or when you log in successfully. diff --git a/template/en/default/account/prefs/CVS/Entries b/template/en/default/account/prefs/CVS/Entries index ed09b440ae7a07f5d77494b05af95faf772d2f9c..9b5908f4217e240c05b662c69c9c9d4e9fd18baa 100644 --- a/template/en/default/account/prefs/CVS/Entries +++ b/template/en/default/account/prefs/CVS/Entries @@ -1,6 +1,6 @@ -/account.html.tmpl/1.2/Tue May 21 17:53:15 2002//TBUGZILLA-2_17_4 -/email.html.tmpl/1.8/Sat Feb 22 20:26:51 2003//TBUGZILLA-2_17_4 -/footer.html.tmpl/1.2/Tue May 21 17:53:16 2002//TBUGZILLA-2_17_4 -/permissions.html.tmpl/1.4/Sat Nov 9 17:23:55 2002//TBUGZILLA-2_17_4 -/prefs.html.tmpl/1.10/Mon Mar 24 21:33:06 2003//TBUGZILLA-2_17_4 +/account.html.tmpl/1.3/Sat Sep 6 19:23:37 2003//TBUGZILLA-2_17_5 +/email.html.tmpl/1.10/Sat Sep 6 19:23:38 2003//TBUGZILLA-2_17_5 +/footer.html.tmpl/1.3/Thu Jul 3 21:31:25 2003//TBUGZILLA-2_17_5 +/permissions.html.tmpl/1.5/Thu Jul 3 21:31:25 2003//TBUGZILLA-2_17_5 +/prefs.html.tmpl/1.10/Mon Mar 24 21:33:06 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/account/prefs/CVS/Tag b/template/en/default/account/prefs/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/account/prefs/CVS/Tag +++ b/template/en/default/account/prefs/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/account/prefs/account.html.tmpl b/template/en/default/account/prefs/account.html.tmpl index 798bb8e40449ec579caf6f1f484894d8e9c16e16..70190048ab36df36004fb33e6883b649e2b0c48a 100644 --- a/template/en/default/account/prefs/account.html.tmpl +++ b/template/en/default/account/prefs/account.html.tmpl @@ -74,7 +74,7 @@ </tr> <tr> <th align="right">Change request expires:</th> - <td>[% login_change_date %]</td> + <td>[% login_change_date FILTER time %]</td> </tr> [% ELSE %] <tr> @@ -83,7 +83,7 @@ </tr> <tr> <th align="right">Completion date:</th> - <td>[% login_change_date %]</td> + <td>[% login_change_date FILTER time %]</td> </tr> [% END %] [% ELSE %] diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl index 8bbb62dfc2b72b83fb417d382f14e322e4a9ab7b..24853a726dfc87e75de51fd92f2ff38e5a80d495 100644 --- a/template/en/default/account/prefs/email.html.tmpl +++ b/template/en/default/account/prefs/email.html.tmpl @@ -21,19 +21,21 @@ #%] [%# INTERFACE: - # watchedusers: string. + # watchedusers: string. # Comma-separated list of email addresses this user watches. # excludeself: boolean. # True if user is not receiving self-generated mail. - # <rolename>: Multiple hashes, one for each rolename (e.g. owner; see - # below), keyed by reasonname (e.g. comments; again, see - # below). The value is a boolean - true if the user is + # <rolename>: Multiple hashes, one for each rolename (e.g. owner; see + # below), keyed by reasonname (e.g. comments; again, see + # below). The value is a boolean - true if the user is # receiving mail for that reason when in that role. # Also references the 'supportwatchers' Param. #%] +[% PROCESS global/variables.none.tmpl %] + [% useqacontact = Param('useqacontact') %] - + <table> [% IF Param('supportwatchers') %] <tr> @@ -45,8 +47,8 @@ <tr> <td colspan="4"> If you want to help cover for someone when they're on vacation, or if - you need to do the QA related to all of their bugs, you can tell - Bugzilla to send mail related to their bugs to you also. List the + you need to do the QA related to all of their [% terms.bugs %], you can tell + [% terms.Bugzilla %] to send mail related to their [% terms.bugs %] to you also. List the email addresses of any users you wish to watch here, separated by commas. </td> @@ -55,7 +57,8 @@ <tr> <th align="right">Users to watch:</th> <td> - <input size="35" name="watchedusers" value="[% watchedusers %]"> + <input size="35" name="watchedusers" + value="[% watchedusers FILTER html %]"> </td> </tr> [% END %] @@ -64,7 +67,7 @@ <td colspan="2"> <p> If you don't like getting a notification for "trivial" - changes to bugs, you can use the settings below to + changes to [% terms.bugs %], you can use the settings below to filter some (or even all) notifications. </p> </td> @@ -138,7 +141,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb <table width="100%" border="1"> <tr> <td colspan="[% useqacontact ? '5' : '4' %]" align="center" width="50%"> - <b>When my relationship to this bug is:</b> + <b>When my relationship to this [% terms.bug %] is:</b> </td> <td rowspan="2" width="50%"> <b>I want to receive mail when:</b> @@ -165,28 +168,32 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb </td> </tr> - [% FOREACH reason = [ - { name = 'Removeme', - description = 'I\'m added to or removed from this capacity' }, - { name = 'Comments', - description = 'New Comments are added' }, - { name = 'Attachments', - description = 'New Attachments are added' }, - { name = 'Status', - description = 'Priority, status, severity, and/or milestone changes' }, - { name = 'Resolved', - description = 'The bug is resolved or verified' }, - { name = 'Keywords', - description = 'Keywords field changes' }, - { name = 'CC', - description = 'CC field changes' }, - { name = 'Other', - description = 'Any field not mentioned above changes' }, - { name = 'Unconfirmed', - description = 'The bug is in the unconfirmed state' }, +[% bugLabelLower = BLOCK %] +[% terms.bug %] +[% END %] + + [% FOREACH reason = [ + { name = 'Removeme', + description = "I'm added to or removed from this capacity" }, + { name = 'Comments', + description = "New Comments are added" }, + { name = 'Attachments', + description = "New Attachments are added" }, + { name = 'Status', + description = "Priority, status, severity, and/or milestone changes" }, + { name = 'Resolved', + description = "The ${bugLabelLower} is resolved or verified" }, + { name = 'Keywords', + description = "Keywords field changes" }, + { name = 'CC', + description = "CC field changes" }, + { name = 'Other', + description = "Any field not mentioned above changes" }, + { name = 'Unconfirmed', + description = "The ${bugLabelLower} is in the unconfirmed state" }, ] %] <tr> - [% FOREACH role = [ "Reporter", "Owner", "QAcontact", "CClist", "Voter" ] + [% FOREACH role = [ "Reporter", "Owner", "QAcontact", "CClist", "Voter" ] %] [% NEXT IF role == "QAcontact" AND NOT useqacontact %] <td align="center"> @@ -199,6 +206,6 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb </td> </tr> [% END %] -</table> +</table> <br> diff --git a/template/en/default/account/prefs/footer.html.tmpl b/template/en/default/account/prefs/footer.html.tmpl index 77ebd1e3acd68c1e3b1f6137f391125096e45b50..87728b16a498bcb31332fe6a363e2e5eba2bd7e4 100644 --- a/template/en/default/account/prefs/footer.html.tmpl +++ b/template/en/default/account/prefs/footer.html.tmpl @@ -20,25 +20,27 @@ #%] [%# INTERFACE: - # mybugslink: boolean. True if the user wishes the My Bugs link to appear. + # mybugslink: boolean. True if the user wishes the My Bugs link to appear. # queries: array of hashes. May be empty. Each hash has two members: # name: string. The name of the query. # footer: boolean. True if the query appears in the footer. #%] - + +[% PROCESS global/variables.none.tmpl %] + <table> <tr> - <th align="right">The 'My bugs' link:</th> + <th align="right">The 'My [% terms.bugs %]' link:</th> <td> <select name="mybugslink"> - <option value="1">should appear on the footer of every page</option> - <option value="0" + <option value="1">should appear on the footer of every page</option> + <option value="0" [% " selected" IF NOT mybugslink %]>should not be displayed - </option> + </option> </select> </td> - </tr> - + </tr> + <input type="hidden" name="numqueries" value="[% queries.size %]"> [% IF queries.size %] [% FOREACH query = queries %] @@ -46,31 +48,31 @@ <th align="right">Your query named '[% query.name FILTER html %]':</th> <td> <select name="query-[% loop.index %]"> - <option value="0">should only appear in the query page</option> - <option value="1" + <option value="0">should only appear in the query page</option> + <option value="1" [% " selected" IF query.footer %]> should appear on the footer of every page - </option> + </option> </select> </td> </tr> - <input type="hidden" name="name-[% loop.index %]" + <input type="hidden" name="name-[% loop.index %]" value="[% query.name FILTER html %]"> [% END %] [% ELSE %] <tr> <td colspan="4"> - <br> - If you create remembered queries using the + <br> + If you create remembered queries using the <a href="query.cgi">query page</a>, - you can then come to this page and choose to have some of them - appear in the footer of each Bugzilla page. + you can then come to this page and choose to have some of them + appear in the footer of each [% terms.Bugzilla %] page. <br> <br> </td> </tr> [% END %] - + </table> diff --git a/template/en/default/account/prefs/permissions.html.tmpl b/template/en/default/account/prefs/permissions.html.tmpl index cd516e769998b649568f2ef91f240d415208da9a..0575bbad47e632df762df30419716d64cd221812 100644 --- a/template/en/default/account/prefs/permissions.html.tmpl +++ b/template/en/default/account/prefs/permissions.html.tmpl @@ -21,20 +21,22 @@ [%# INTERFACE: # has_bits: array of hashes. May be empty. - # name => Names of the permissions the user has. - # desc => Descriptions of the permissions the user has. - # set_bits: array of hashes. May be empty. - # name => Names of the permissions the user can set for + # name => Names of the permissions the user has. + # desc => Descriptions of the permissions the user has. + # set_bits: array of hashes. May be empty. + # name => Names of the permissions the user can set for # other people. - # desc => Descriptions of the permissions the user can set for + # desc => Descriptions of the permissions the user can set for # other people. #%] - + +[% PROCESS global/variables.none.tmpl %] + <table align="center"> <tr> <td> [% IF has_bits.size %] - You have the following permission bits set on your account: + You have the following permission [% terms.bits %] set on your account: <p> <br> <table align="center"> @@ -46,16 +48,16 @@ [% END %] </table> [% ELSE %] - There are no permission bits set on your account. + There are no permission [% terms.bits %] set on your account. [% END %] [% IF user.groups.editusers %] <br> - You have editusers privileges. You can turn on and off + You have editusers privileges. You can turn on and off all permissions for all users. [% ELSIF set_bits.size %] <br> - And you can turn on or off the following bits for + And you can turn on or off the following [% terms.bits %] for <a href="editusers.cgi">other users</a>: <p> <table align="center"> diff --git a/template/en/default/admin/CVS/Tag b/template/en/default/admin/CVS/Tag index a3b2d0dcc6bb99eac32a9ac2b70191062f02d5f6..9850221a0eb3c0ab21c87ec0e071c7a10c0e874f 100644 --- a/template/en/default/admin/CVS/Tag +++ b/template/en/default/admin/CVS/Tag @@ -1 +1 @@ -TBUGZILLA-2_17_4 +TBUGZILLA-2_17_5 diff --git a/template/en/default/admin/flag-type/CVS/Entries b/template/en/default/admin/flag-type/CVS/Entries index ba9455b39dfb40e65dee01f7a0caf3cdfd05859c..32323b8dc4707838b9c92f47fa0ba4ea44b337f1 100644 --- a/template/en/default/admin/flag-type/CVS/Entries +++ b/template/en/default/admin/flag-type/CVS/Entries @@ -1,4 +1,4 @@ -/confirm-delete.html.tmpl/1.2/Tue Nov 19 00:16:24 2002//TBUGZILLA-2_17_4 -/edit.html.tmpl/1.3/Tue Nov 19 00:16:27 2002//TBUGZILLA-2_17_4 -/list.html.tmpl/1.4/Tue Nov 19 00:16:27 2002//TBUGZILLA-2_17_4 +/confirm-delete.html.tmpl/1.4/Sat Sep 6 19:23:36 2003//TBUGZILLA-2_17_5 +/edit.html.tmpl/1.5/Sat Sep 6 19:23:36 2003//TBUGZILLA-2_17_5 +/list.html.tmpl/1.6/Sat Sep 6 19:23:36 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/admin/flag-type/CVS/Tag b/template/en/default/admin/flag-type/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/admin/flag-type/CVS/Tag +++ b/template/en/default/admin/flag-type/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/admin/flag-type/confirm-delete.html.tmpl b/template/en/default/admin/flag-type/confirm-delete.html.tmpl index 46522000b51b94dabdba6a69e5c57628e81b3ae9..ddd99d7caaa4403d0eb274da9c06f1046b22c26e 100644 --- a/template/en/default/admin/flag-type/confirm-delete.html.tmpl +++ b/template/en/default/admin/flag-type/confirm-delete.html.tmpl @@ -19,20 +19,22 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [%# Filter off the name here to be used multiple times below %] [% name = BLOCK %][% flag_type.name FILTER html %][% END %] -[% PROCESS global/header.html.tmpl - title = "Confirm Deletion of Flag Type '$name'" +[% PROCESS global/header.html.tmpl + title = "Confirm Deletion of Flag Type '$name'" %] <p> - There are [% flag_count %] flags of type [% name %]. - If you delete this type, those flags will also be deleted. Note that - instead of deleting the type you can + There are [% flag_count %] flags of type [% name FILTER html %]. + If you delete this type, those flags will also be deleted. Note that + instead of deleting the type you can <a href="editflagtypes.cgi?action=deactivate&id=[% flag_type.id %]">deactivate it</a>, in which case the type and its flags will remain in the database - but will not appear in the Bugzilla UI. + but will not appear in the [% terms.Bugzilla %] UI. </p> <table> diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl index 157ad3592a7f36286671c45d323083bb9e9453b9..58519466d6f9dff4e91c72f1444f8077e8f9df9c 100644 --- a/template/en/default/admin/flag-type/edit.html.tmpl +++ b/template/en/default/admin/flag-type/edit.html.tmpl @@ -19,6 +19,8 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [%# The javascript and header_html blocks get used in header.html.tmpl. %] [% javascript = BLOCK %] var usetms = 0; // do we have target milestone? @@ -26,7 +28,7 @@ var last_sel = []; // caches last selection var cpts = new Array(); [% FOREACH p = products %] - cpts['[% p FILTER js %]'] = [ + cpts['[% p FILTER js %]'] = [ [%- FOREACH item = components_by_product.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; [% END %] [% END %] @@ -36,9 +38,13 @@ [% END %] [% IF type.target_type == "bug" %] - [% title = "Create Flag Type for Bugs" %] + [% title = BLOCK %]Create Flag Type for [% terms.Bugs %][% END %] + [% typeLabelLowerPlural = BLOCK %][% terms.bugs %][% END %] + [% typeLabelLowerSingular = BLOCK %][% terms.bug %][% END %] [% ELSE %] [% title = "Create Flag Type for Attachments" %] + [% typeLabelLowerPlural = BLOCK %]attachments[% END %] + [% typeLabelLowerSingular = BLOCK %]attachment[% END %] [% END %] [% IF last_action == "copy" %] @@ -47,7 +53,7 @@ [% title = "Edit Flag Type $type.name" %] [% END %] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl title = title style = " table#form th { text-align: right; vertical-align: baseline; white-space: nowrap; } @@ -61,18 +67,18 @@ <input type="hidden" name="id" value="[% type.id %]"> <input type="hidden" name="target_type" value="[% type.target_type %]"> [% FOREACH category = type.inclusions %] - <input type="hidden" name="inclusions" value="[% category %]"> + <input type="hidden" name="inclusions" value="[% category FILTER html %]"> [% END %] [% FOREACH category = type.exclusions %] - <input type="hidden" name="exclusions" value="[% category %]"> + <input type="hidden" name="exclusions" value="[% category FILTER html %]"> [% END %] - + <table id="form" cellspacing="0" cellpadding="4" border="0"> <tr> <th>Name:</th> <td> a short name identifying this type<br> - <input type="text" name="name" value="[% type.name FILTER html %]" + <input type="text" name="name" value="[% type.name FILTER html %]" size="50" maxlength="50"> </td> </tr> @@ -84,12 +90,13 @@ <textarea name="description" rows="4" cols="80">[% type.description FILTER html %]</textarea> </td> </tr> - + <tr> <th>Category:</th> + <td> - the products/components to which [% type.target_type %]s must - (inclusions) or must not (exclusions) belong in order for users + the products/components to which [% typeLabelLowerPlural %] must + (inclusions) or must not (exclusions) belong in order for users to be able to set flags of this type for them <table> <tr> @@ -98,13 +105,17 @@ <select name="product" onchange="selectProduct(this.form, 'product', 'component', '__Any__');"> <option value="">__Any__</option> [% FOREACH item = products %] - <option value="[% item %]" [% "selected" IF type.product.name == item %]>[% item %]</option> + <option value="[% item FILTER html %]" + [% "selected" IF type.product.name == item %]> + [% item FILTER html %]</option> [% END %] </select><br> <select name="component"> <option value="">__Any__</option> [% FOREACH item = components %] - <option value="[% item %]" [% "selected" IF type.component.name == item %]>[% item %]</option> + <option value="[% item FILTER html %]" + [% "selected" IF type.component.name == item %]> + [% item FILTER html %]</option> [% END %] </select><br> <input type="submit" name="categoryAction" value="Include"> @@ -124,11 +135,11 @@ </table> </td> </tr> - + <tr> <th>Sort Key:</th> <td> - a number between 1 and 32767 by which this type will be sorted + a number between 1 and 32767 by which this type will be sorted when displayed to users in a list; ignore if you don't care what order the types appear in or if you want them to appear in alphabetical order<br> @@ -147,7 +158,7 @@ <tr> <th> </th> <td> - <input type="checkbox" name="is_requestable" [% "checked" IF type.is_requestable || !type.is_requestable.defined %]> + <input type="checkbox" name="is_requestable" [% "checked" IF type.is_requestable || !type.is_requestable.defined %]> requestable (users can ask for flags of this type to be set) </td> </tr> @@ -159,11 +170,11 @@ <input type="text" name="cc_list" value="[% type.cc_list FILTER html %]" size="80" maxlength="200"> </td> </tr> - + <tr> <th> </th> <td> - <input type="checkbox" name="is_requesteeble" [% "checked" IF type.is_requesteeble || !type.is_requesteeble.defined %]> + <input type="checkbox" name="is_requesteeble" [% "checked" IF type.is_requesteeble || !type.is_requesteeble.defined %]> specifically requestable (users can ask specific other users to set flags of this type as opposed to just asking the wind) </td> </tr> @@ -172,14 +183,17 @@ <th> </th> <td> <input type="checkbox" name="is_multiplicable" [% "checked" IF type.is_multiplicable || !type.is_multiplicable.defined %]> - multiplicable (multiple flags of this type can be set on the same [% type.target_type %]) + multiplicable (multiple flags of this type can be set on the same [% typeLabelLowerSingular %]) </td> </tr> <tr> <th></th> <td> - <input type="submit" value="[% (last_action == "enter" || last_action == "copy") ? "Create" : "Save Changes" %]"> + <input type="submit" value=" + [% IF (last_action == "enter" || last_action == "copy") %]Create + [% ELSE %]Save Changes + [% END %]"> </td> </tr> diff --git a/template/en/default/admin/flag-type/list.html.tmpl b/template/en/default/admin/flag-type/list.html.tmpl index 43fbf8d560da20a4eb243f0911ff36b6fe1ab0e3..80764d6135ccb4470d8ff797fb12483d53b47b8c 100644 --- a/template/en/default/admin/flag-type/list.html.tmpl +++ b/template/en/default/admin/flag-type/list.html.tmpl @@ -19,7 +19,9 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = 'Administer Flag Types' style = " table#flag_types tr th { text-align: left; } @@ -28,7 +30,7 @@ %] <p> - Flags are markers that identify whether a bug or attachment has been granted + Flags are markers that identify whether [% terms.abug %] or attachment has been granted or denied some status. Flags appear in the UI as a name and a status symbol ("+" for granted, "-" for denied, and "?" for statuses requested by users). </p> @@ -40,13 +42,13 @@ either the string "review+" or the string "review-" will appear in the patch, depending on whether the patch passed or failed review. </p> - -<h3>Flag Types for Bugs</h3> + +<h3>Flag Types for [% terms.Bugs %]</h3> [% PROCESS display_flag_types types=bug_types %] <p> - <a href="editflagtypes.cgi?action=enter&target_type=bug">Create Flag Type for Bugs</a> + <a href="editflagtypes.cgi?action=enter&target_type=bug">Create Flag Type for [% terms.Bugs %]</a> </p> <h3>Flag Types for Attachments</h3> @@ -63,8 +65,8 @@ { if (count > 0) { var msg = 'There are ' + count + ' flags of type ' + name + '. ' + - 'If you delete this type, those flags will also be ' + - 'deleted.\n\nNote: to deactivate the type instead ' + + 'If you delete this type, those flags will also be ' + + 'deleted.\n\nNote: to deactivate the type instead ' + 'of deleting it, edit it and uncheck its "is active" ' + 'flag.\n\nDo you really want to delete this flag type?'; if (!confirm(msg)) return false; @@ -90,17 +92,17 @@ [% FOREACH type = types %] - <tr class="[% type.is_active ? "active" : "inactive" %]"> + <tr class="[% IF type.is_active %]active[% ELSE %]inactive[% END %]"> <td><a href="editflagtypes.cgi?action=edit&id=[% type.id %]">[% type.name FILTER html %]</a></td> <td>[% type.description FILTER html %]</td> <td> <a href="editflagtypes.cgi?action=copy&id=[% type.id %]">Copy</a> - | <a href="editflagtypes.cgi?action=confirmdelete&id=[% type.id %]" - onclick="return confirmDelete([% type.id %], '[% type.name FILTER js %]', + | <a href="editflagtypes.cgi?action=confirmdelete&id=[% type.id %]" + onclick="return confirmDelete([% type.id %], '[% type.name FILTER js %]', [% type.flag_count %]);">Delete</a> </td> </tr> - + [% END %] </table> diff --git a/template/en/default/admin/products/CVS/Tag b/template/en/default/admin/products/CVS/Tag index a3b2d0dcc6bb99eac32a9ac2b70191062f02d5f6..9850221a0eb3c0ab21c87ec0e071c7a10c0e874f 100644 --- a/template/en/default/admin/products/CVS/Tag +++ b/template/en/default/admin/products/CVS/Tag @@ -1 +1 @@ -TBUGZILLA-2_17_4 +TBUGZILLA-2_17_5 diff --git a/template/en/default/admin/products/groupcontrol/CVS/Entries b/template/en/default/admin/products/groupcontrol/CVS/Entries index e6e3125ebca225a0ca4f8e467533f875c2d3a0ad..5fdd532d4d1e5e2d733c1aded21b6d38142b1b3e 100644 --- a/template/en/default/admin/products/groupcontrol/CVS/Entries +++ b/template/en/default/admin/products/groupcontrol/CVS/Entries @@ -1,3 +1,3 @@ -/confirm-edit.html.tmpl/1.2/Sat Mar 22 04:47:31 2003//TBUGZILLA-2_17_4 -/edit.html.tmpl/1.1/Sun Nov 24 19:56:28 2002//TBUGZILLA-2_17_4 +/confirm-edit.html.tmpl/1.3/Thu Jul 3 21:31:29 2003//TBUGZILLA-2_17_5 +/edit.html.tmpl/1.2/Thu Jul 3 21:31:29 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/admin/products/groupcontrol/CVS/Tag b/template/en/default/admin/products/groupcontrol/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/admin/products/groupcontrol/CVS/Tag +++ b/template/en/default/admin/products/groupcontrol/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl index cf8fcca9cf018645f65da09ff388c787b2059997..8dfb97230cf2445327b977cfa85ea184446b8dac 100644 --- a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl +++ b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl @@ -17,29 +17,30 @@ # Rights Reserved. # # Contributor(s): Joel Peshkin <bugreport@peshkin.net> - # + # #%] - +[% PROCESS global/variables.none.tmpl %] [% PROCESS global/header.html.tmpl title="Confirm Group Control Change for product \'$product\'" %] [% FOREACH group = mandatory_groups %] <P> -group '[% group.name FILTER html %]' impacts [% group.count %] bugs for which the group is -newly mandatory and will be added. +group '[% group.name FILTER html %]' impacts [% group.count %] [% terms.bugs %] for +which the group is newly mandatory and will be added. [% END %] [% FOREACH group = na_groups %] <P> -group '[% group.name FILTER html %]' impacts [% group.count %] bugs for which the group is no longer applicable and will be removed. -[% END %] +group '[% group.name FILTER html %]' impacts [% group.count %] +[% terms.bugs %] for which the group is no longer applicable and will +be removed.[% END %] <form method="post" > [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %] <br> - Click "Continue" to proceed with the change including the changes + Click "Continue" to proceed with the change including the changes indicated above. If you do not want these changes, use "back" to return to the previous page. <p> diff --git a/template/en/default/admin/products/groupcontrol/edit.html.tmpl b/template/en/default/admin/products/groupcontrol/edit.html.tmpl index 11bb99de54022038dc3ea5d462ae661b59ffc22c..bc6ce11b494afeba84c4e7bcf5ecd49fdce18ab7 100644 --- a/template/en/default/admin/products/groupcontrol/edit.html.tmpl +++ b/template/en/default/admin/products/groupcontrol/edit.html.tmpl @@ -19,16 +19,17 @@ # Contributor(s): Joel Peshkin <bugreport@peshkin.net> #%] +[% PROCESS global/variables.none.tmpl %] [% filt_product = product FILTER html %] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl title = "Edit Group Controls for '$filt_product'" %] <form method="post" action="editproducts.cgi"> <input type="hidden" name="action" value="updategroupcontrols"> <input type="hidden" name="product" value="[% filt_product %]"> - + <table id="form" cellspacing="0" cellpadding="4" border="1"> <tr bgcolor="#6666ff"> <th>Group</th> @@ -36,7 +37,7 @@ <th>MemberControl</th> <th>OtherControl</th> <th>Canedit</th> - <th>Bugs</th> + <th>[% terms.Bugs %]</th> </tr> [% FOREACH group = groups %] [% IF group.isactive == 0 AND group.bugcount > 0 %] @@ -63,22 +64,22 @@ <td> <select name="membercontrol_[% group.id %]"> <option value=[% const.CONTROLMAPNA %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.membercontrol == const.CONTROLMAPNA %] >NA </option> <option value=[% const.CONTROLMAPSHOWN %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.membercontrol == const.CONTROLMAPSHOWN %] >Shown </option> <option value=[% const.CONTROLMAPDEFAULT %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.membercontrol == const.CONTROLMAPDEFAULT %] >Default </option> <option value=[% const.CONTROLMAPMANDATORY %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.membercontrol == const.CONTROLMAPMANDATORY %] >Mandatory </option> @@ -87,22 +88,22 @@ <td> <select name="othercontrol_[% group.id %]"> <option value=[% const.CONTROLMAPNA %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.othercontrol == const.CONTROLMAPNA %] >NA </option> <option value=[% const.CONTROLMAPSHOWN %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.othercontrol == const.CONTROLMAPSHOWN %] >Shown </option> <option value=[% const.CONTROLMAPDEFAULT %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.othercontrol == const.CONTROLMAPDEFAULT %] >Default </option> <option value=[% const.CONTROLMAPMANDATORY %] - [% " selected=\"selected\"" + [% " selected=\"selected\"" IF group.othercontrol == const.CONTROLMAPMANDATORY %] >Mandatory </option> @@ -131,7 +132,7 @@ These settings control the relationship of the groups to this product. <p> If any group has <b>Entry</b> selected, then this product will -restrict bug entry to only those users who are members of all the +restrict [% terms.bug %] entry to only those users who are members of all the groups with entry selected. <p> If any group has <b>Canedit</b> selected, then this product @@ -141,7 +142,7 @@ all the canedit groups will be able to edit. This is an additional restriction that further restricts what can be edited by a user. <p> The <b>MemberControl</b> and <b>OtherControl</b> fields -indicate which bugs will be placed in +indicate which [% terms.bugs %] will be placed in this group according to the following definitions. <br> <table border=1> @@ -164,7 +165,7 @@ this group according to the following definitions. NA </td> <td> - Bugs in this product are never associated with this group. + [% terms.Bugs %] in this product are never associated with this group. </td> </tr> <tr> @@ -175,9 +176,9 @@ this group according to the following definitions. NA </td> <td> - Bugs in this product are permitted to be restricted to this - group. Users who are a member of this group will be able - to place bugs in this group. + [% terms.Bugs %] in this product are permitted to be restricted to this + group. Users who are a member of this group will be able to place [% terms.bugs %] in + this group. </td> </tr> <tr> @@ -188,8 +189,8 @@ this group according to the following definitions. Shown </td> <td> - Bugs in this product can be placed in this group by anyone - with permission to edit the bug even if they are not a member + [% terms.Bugs %] in this product can be placed in this group by anyone + with permission to edit the [% terms.bug %] even if they are not a member of this group. </td> </tr> @@ -201,9 +202,9 @@ this group according to the following definitions. Default </td> <td> - Bugs in this product can be placed in this group by anyone - with permission to edit the bug even if they are not a member - of this group. Non-members place bugs in this group by default. + [% terms.Bugs %] in this product can be placed in this group by anyone + with permission to edit the [% terms.bug %] even if they are not a member + of this group. Non-members place [% terms.bugs %] in this group by default. </td> </tr> <tr> @@ -214,11 +215,10 @@ this group according to the following definitions. Mandatory </td> <td> - Bugs in this product are permitted to be restricted to this - group. Users who are a member of this group will be able - to place bugs in this group. - Non-members will be forced to restrict bugs to this group - when they initially enter a bug in this product. + [% terms.Bugs %] in this product are permitted to be restricted to this + group. Users who are a member of this group will be able to place [% terms.bugs %] + in this group. Non-members will be forced to restrict [% terms.bugs %] to + this group when they initially enter [% terms.abug %] in this product. </td> </tr> <tr> @@ -229,10 +229,9 @@ this group according to the following definitions. NA </td> <td> - Bugs in this product are permitted to be restricted to this - group and are placed in this group by default. - Users who are a member of this group will be able - to place bugs in this group. + [% terms.Bugs %] in this product are permitted to be restricted to this + group and are placed in this group by default. Users who are a member of this + group will be able to place [% terms.bugs %] in this group. </td> </tr> <tr> @@ -243,11 +242,10 @@ this group according to the following definitions. Default </td> <td> - Bugs in this product are permitted to be restricted to this - group and are placed in this group by default. - Users who are a member of this group will be able - to place bugs in this group. Non-members will be able to - restrict bugs to this group on entry and will do so by default + [% terms.Bugs %] in this product are permitted to be restricted to this + group and are placed in this group by default. Users who are a member of this group + will be able to place [% terms.bugs %] in this group. Non-members will be + able to restrict [% terms.bugs %] to this group on entry and will do so by default </td> </tr> <tr> @@ -258,11 +256,10 @@ this group according to the following definitions. Mandatory </td> <td> - Bugs in this product are permitted to be restricted to this - group and are placed in this group by default. - Users who are a member of this group will be able - to place bugs in this group. Non-members will be forced - to place bugs in this group on entry. + [% terms.Bugs %] in this product are permitted to be restricted to this + group and are placed in this group by default. Users who are a member of this group + will be able to place [% terms.bugs %] in this group. Non-members will be forced + to place [% terms.bugs %] in this group on entry. </td> </tr> <tr> @@ -273,7 +270,7 @@ this group according to the following definitions. Mandatory </td> <td> - Bugs in this product are required to be restricted to this + [% terms.Bugs %] in this product are required to be restricted to this group. Users are not given any option. </td> </tr> diff --git a/template/en/default/attachment/CVS/Entries b/template/en/default/attachment/CVS/Entries index dc2a73a400fbad52f8070236871e467efe19bd6f..15d2835ca0df66cb61b5d24a8d4ef55de1912d77 100644 --- a/template/en/default/attachment/CVS/Entries +++ b/template/en/default/attachment/CVS/Entries @@ -1,8 +1,11 @@ -/content-types.html.tmpl/1.3/Thu Oct 24 03:52:35 2002//TBUGZILLA-2_17_4 -/create.html.tmpl/1.14/Tue Jan 14 06:36:11 2003//TBUGZILLA-2_17_4 -/created.html.tmpl/1.8/Sun Feb 9 22:04:19 2003//TBUGZILLA-2_17_4 -/edit.html.tmpl/1.17/Thu Apr 24 20:49:38 2003//TBUGZILLA-2_17_4 -/list.html.tmpl/1.8/Wed Nov 27 16:00:37 2002//TBUGZILLA-2_17_4 -/show-multiple.html.tmpl/1.10/Tue Jan 14 06:36:12 2003//TBUGZILLA-2_17_4 -/updated.html.tmpl/1.8/Sun Feb 9 22:04:19 2003//TBUGZILLA-2_17_4 +/content-types.html.tmpl/1.3/Thu Oct 24 03:52:35 2002//TBUGZILLA-2_17_5 +/create.html.tmpl/1.16/Thu Jul 3 21:31:31 2003//TBUGZILLA-2_17_5 +/created.html.tmpl/1.9/Thu Jul 3 21:31:31 2003//TBUGZILLA-2_17_5 +/diff-file.html.tmpl/1.1/Wed Jul 30 20:04:59 2003//TBUGZILLA-2_17_5 +/diff-footer.html.tmpl/1.1/Wed Jul 30 20:05:00 2003//TBUGZILLA-2_17_5 +/diff-header.html.tmpl/1.1/Wed Jul 30 20:05:00 2003//TBUGZILLA-2_17_5 +/edit.html.tmpl/1.20/Wed Aug 20 00:45:43 2003//TBUGZILLA-2_17_5 +/list.html.tmpl/1.14/Sat Sep 6 19:23:33 2003//TBUGZILLA-2_17_5 +/show-multiple.html.tmpl/1.11/Thu Jul 3 21:31:31 2003//TBUGZILLA-2_17_5 +/updated.html.tmpl/1.9/Thu Jul 3 21:31:31 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/attachment/CVS/Tag b/template/en/default/attachment/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/attachment/CVS/Tag +++ b/template/en/default/attachment/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl index a298df5a94281a41a2a98bc682870f4b9b391166..c2e5378e16c477ec2eb71715202e96c4b4fee758 100644 --- a/template/en/default/attachment/create.html.tmpl +++ b/template/en/default/attachment/create.html.tmpl @@ -19,13 +19,15 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [%# Define strings that will serve as the title and header of this page %] -[% title = BLOCK %]Create New Attachment for Bug #[% bugid %][% END %] +[% title = BLOCK %]Create New Attachment for [% terms.Bug %] #[% bugid %][% END %] [% h1 = BLOCK %]Create New Attachment for - [%+ GetBugLink(bugid, "Bug $bugid") %][% END %] + [%+ GetBugLink(bugid, "$terms.Bug $bugid") %][% END %] [% h2 = BLOCK %][% bugsummary FILTER html %][% END %] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl title = title h1 = h1 h2 = h2 @@ -48,7 +50,7 @@ <form name="entryform" method="post" action="attachment.cgi" enctype="multipart/form-data"> <input type="hidden" name="bugid" value="[% bugid %]"> <input type="hidden" name="action" value="insert"> - + <table class="attachment_entry"> <tr> <th>File:</th> @@ -74,15 +76,15 @@ <td> <em>If the attachment is a patch, check the box below.</em><br> <input type="checkbox" id="ispatch" name="ispatch" value="1" - onchange="setContentTypeDisabledState();"> + onchange="setContentTypeDisabledState();"> <label for="ispatch">patch</label><br><br> <em>Otherwise, choose a method for determining the content type.</em><br> <input type="radio" id="autodetect" - name="contenttypemethod" value="autodetect"> + name="contenttypemethod" value="autodetect"> <label for="autodetect">auto-detect</label><br> <input type="radio" id="list" - name="contenttypemethod" value="list"> + name="contenttypemethod" value="list"> <label for="list">select from list:</label> <select name="contenttypeselection" onchange="this.form.contenttypemethod[1].checked = true;"> @@ -123,21 +125,22 @@ [% END %] </td> </tr> - [% IF (user.userid != bugassignee_id) AND UserInGroup("editbugs") %] + + [% IF (user.id != bugassignee_id) AND user.groups.editbugs %] <tr> <th>Reassignment:</th> <td> - <em>If you want to assign this bug to yourself, + <em>If you want to assign this [% terms.bug %] to yourself, check the box below.</em><br> - <input type="checkbox" id="takebug" name="takebug" value="1"> - <label for="takebug">take bug</label> + <input type="checkbox" id="takebug" name="takebug" value="1"> + <label for="takebug">take [% terms.bug %]</label> </td> </tr> [% END %] <tr> <th>Comment:</th> <td> - <em>(optional) Add a comment about this attachment to the bug.</em><br> + <em>(optional) Add a comment about this attachment to the [% terms.bug %].</em><br> <textarea wrap="soft" name="comment" rows="6" cols="80"></textarea> </td> </tr> @@ -151,12 +154,12 @@ <script language="JavaScript" type="text/javascript"> <!-- - function setContentTypeDisabledState() + function setContentTypeDisabledState() { var entryform = document.entryform; var isdisabled = false; - if (entryform.ispatch.checked) + if (entryform.ispatch.checked) isdisabled = true; for (var i=0 ; i<entryform.contenttypemethod.length ; i++) diff --git a/template/en/default/attachment/created.html.tmpl b/template/en/default/attachment/created.html.tmpl index 2b985bd0c8f3b84c02479e5fff43f9529a23101d..9fa7011fd2238ea70988b3f0c0f8c6d470e87b56 100644 --- a/template/en/default/attachment/created.html.tmpl +++ b/template/en/default/attachment/created.html.tmpl @@ -27,8 +27,10 @@ # contenttypemethod: string. How we got the content type of the attachment. # Possible values: autodetect, list, manual. #%] - -[% PROCESS global/header.html.tmpl + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Changes Submitted" style = "th { text-align: left; }" %] @@ -37,29 +39,30 @@ <tr> <td> <h2> - <a title="[% description FILTER html %]" href="attachment.cgi?id=[% attachid %]&action=edit">Attachment #[% attachid %]</a> - to <a href="show_bug.cgi?id=[% bugid %]">Bug #[% bugid %]</a> Created + <a title="[% description FILTER html %]" href="attachment.cgi?id=[% attachid %]&action=edit">Attachment #[% attachid %]</a> + to <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] #[% bugid %]</a> Created </h2> [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = bugid %] [% IF contenttypemethod == 'autodetect' %] <p> - <b>Note:</b> Bugzilla automatically detected the content type - <em>[% contenttype %]</em> for this attachment. If this is - incorrect, correct the value by + <b>Note:</b> [% terms.Bugzilla %] automatically detected the content type + <em>[% contenttype %]</em> for this attachment. If this is + incorrect, correct the value by <a href="attachment.cgi?id=[% attachid %]&action=edit">editing the attachment</a>. </p> [% END %] </td> <td> - <a href="show_bug.cgi?id=[% bugid %]">Go back to bug #[% bugid %]</a> + <a href="show_bug.cgi?id=[% bugid %]">Go back to [% terms.bug %] #[% bugid %]</a> </td> </tr> </table> <p> -<a href="attachment.cgi?bugid=[% bugid %]&action=enter">Create Another Attachment to Bug #[% bugid %]</a> +<a href="attachment.cgi?bugid=[% bugid %]&action=enter">Create + Another Attachment to [% terms.Bug %] #[% bugid %]</a> </p> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/attachment/diff-file.html.tmpl b/template/en/default/attachment/diff-file.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..51072269dca2982e4881129db1cf34caaf7389fb --- /dev/null +++ b/template/en/default/attachment/diff-file.html.tmpl @@ -0,0 +1,129 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): John Keiser <jkeiser@netscape.com> + #%] + +[%# This line is really long for a reason: to get rid of any possible textnodes + # between the elements. This is necessary because DOM parent-child-sibling + # relations can change and screw up the javascript for restoring, collapsing + # and expanding. Do not change without testing all three of those. + #%] +<table class="file_table"><thead><tr><td class="file_head" colspan="2"><a href="#" onclick="return twisty_click(this)">[% collapsed ? '(+)' : '(-)' %]</a><input type="checkbox" name="[% file.filename FILTER html %]"[% collapsed ? '' : ' checked' %] style="display: none"> + [% IF lxr_prefix && !file.is_add %] + <a href="[% lxr_prefix %]">[% file.filename FILTER html %]</a> + [% ELSE %] + [% file.filename FILTER html %] + [% END %] + [% IF file.plus_lines %] + [% IF file.minus_lines %] + (-[% file.minus_lines %] / +[% file.plus_lines %] lines) + [% ELSE %] + (+[% file.plus_lines %] lines) + [% END %] + [% ELSE %] + [% IF file.minus_lines %] + (-[% file.minus_lines %] lines) + [% END %] + [% END %] +</td></tr></thead><tbody class="[% collapsed ? 'file_collapse' : 'file' %]"> +<script type="application/x-javascript" language="JavaScript"> +incremental_restore() +</script> + +[% section_num = 0 %] +[% FOREACH section = sections %] + [% section_num = section_num + 1 %] + <tr><th class="section_head" colspan="2"> + [% IF file.is_add %] + Added + [% ELSIF file.is_remove %] + [% IF bonsai_prefix %] + <a href="[% bonsai_prefix %]">Removed</a> + [% ELSE %] + Removed + [% END %] + [% ELSE %] + [% IF bonsai_prefix %] + <a href="[% bonsai_prefix %]#[% section.old_start %]"> + [% END %] + [% IF section.old_lines > 1 %] + Lines [% section.old_start %]-[% section.old_start + section.old_lines - 1 %] + [% ELSE %] + Line [% section.old_start %] + [% END %] + [% IF bonsai_prefix %] + </a> + [% END %] + [% END %] + (<a name="[% file.filename FILTER html %]_sec[% section_num %]"><a href="#[% file.filename FILTER html %]_sec[% section_num %]">Link Here</a></a>) + </th></tr> + [% FOREACH group = section.groups %] + [% IF group.context %] + [% FOREACH line = group.context %] + <tr><td><pre>[% line FILTER html %]</pre></td><td><pre>[% line FILTER html %]</pre></td></tr> + [% END %] + [% END %] + [% IF group.plus.size %] + [% IF group.minus.size %] + [% i = 0 %] + [% WHILE (i < group.plus.size || i < group.minus.size) %] + [% currentloop = 0 %] + [% WHILE currentloop < 500 && (i < group.plus.size || i < group.minus.size) %] + <tr class="changed"> + <td><pre>[% group.minus.$i FILTER html %]</pre></td> + <td><pre>[% group.plus.$i FILTER html %]</pre></td> + </tr> + [% currentloop = currentloop + 1 %] + [% i = i + 1 %] + [% END %] + [% END %] + [% ELSE %] + [% FOREACH line = group.plus %] + [% IF file.is_add %] + <tr> + <td class="added" colspan="2"><pre>[% line FILTER html %]</pre></td> + </tr> + [% ELSE %] + <tr> + <td></td> + <td class="added"><pre>[% line FILTER html %]</pre></td> + </tr> + [% END %] + [% END %] + [% END %] + [% ELSE %] + [% IF group.minus.size %] + [% FOREACH line = group.minus %] + [% IF file.is_remove %] + <tr> + <td class="removed" colspan="2"><pre>[% line FILTER html %]</pre></td> + </tr> + [% ELSE %] + <tr> + <td class="removed"><pre>[% line FILTER html %]</pre></td> + <td></td> + </tr> + [% END %] + [% END %] + [% END %] + [% END %] + [% END %] +[% END %] + +</table> diff --git a/template/en/default/attachment/diff-footer.html.tmpl b/template/en/default/attachment/diff-footer.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..4eb94aca2c584f5cedd59b9bf007d475a86dd23f --- /dev/null +++ b/template/en/default/attachment/diff-footer.html.tmpl @@ -0,0 +1,33 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): John Keiser <jkeiser@netscape.com> + #%] + +</form> + +[% IF headers %] + + <br> + + [% PROCESS global/footer.html.tmpl %] + +[% ELSE %] +</body> +</html> +[% END %] diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..c1b70173e5486f145e9650b6965843114143c254 --- /dev/null +++ b/template/en/default/attachment/diff-header.html.tmpl @@ -0,0 +1,307 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): John Keiser <jkeiser@netscape.com> + #%] + +[%# Define strings that will serve as the title and header of this page %] + +[% title = BLOCK %]Attachment #[% attachid %] for Bug #[% bugid %][% END %] + +[% style = BLOCK %] +.file_head { + font-size: x-large; + font-weight: bold; + background-color: #d3d3d3; + border: 1px solid black; + width: 100%; +} +.file_collapse { + display: none; +} +.section_head { + width: 100%; + font-weight: bold; + background-color: #d3d3d3; + border: 1px solid black; + text-align: left; +} +table.file_table { + table-layout: fixed; + width: 100%; + empty-cells: show; + border-spacing: 0px; + border-collapse: collapse; +} +tbody.file td { + border-left: 1px dashed black; + border-right: 1px dashed black; + width: 50%; +} +tbody.file pre { + display: inline; + white-space: -moz-pre-wrap; + font-size: 0.9em; +} +tbody.file pre:empty { + display: block; + height: 1em; +} +.changed { + background-color: lightblue; +} +.added { + background-color: lightgreen; +} +.removed { + background-color: #FFCC99; +} +.warning { + color: red +} +[% END %] + +[%# SCRIPT FUNCTIONS %] +[% javascript = BLOCK %] + function collapse_all() { + var elem = document.checkboxform.firstChild; + while (elem != null) { + if (elem.firstChild != null) { + var tbody = elem.firstChild.nextSibling; + if (tbody.className == 'file') { + tbody.className = 'file_collapse'; + twisty = get_twisty_from_tbody(tbody); + twisty.firstChild.nodeValue = '(+)'; + twisty.nextSibling.checked = false; + } + } + elem = elem.nextSibling; + } + return false; + } + + function expand_all() { + var elem = document.checkboxform.firstChild; + while (elem != null) { + if (elem.firstChild != null) { + var tbody = elem.firstChild.nextSibling; + if (tbody.className == 'file_collapse') { + tbody.className = 'file'; + twisty = get_twisty_from_tbody(tbody); + twisty.firstChild.nodeValue = '(-)'; + twisty.nextSibling.checked = true; + } + } + elem = elem.nextSibling; + } + return false; + } + + var current_restore_elem; + + function restore_all() { + current_restore_elem = null; + incremental_restore(); + } + + function incremental_restore() { + if (!document.checkboxform.restore_indicator.checked) { + return; + } + var next_restore_elem; + if (current_restore_elem) { + next_restore_elem = current_restore_elem.nextSibling; + } else { + next_restore_elem = document.checkboxform.firstChild; + } + while (next_restore_elem != null) { + current_restore_elem = next_restore_elem; + if (current_restore_elem.firstChild != null) { + restore_elem(current_restore_elem.firstChild.nextSibling); + } + next_restore_elem = current_restore_elem.nextSibling; + } + } + + function restore_elem(elem, alertme) { + if (elem.className == 'file_collapse') { + twisty = get_twisty_from_tbody(elem); + if (twisty.nextSibling.checked) { + elem.className = 'file'; + twisty.firstChild.nodeValue = '(-)'; + } + } else if (elem.className == 'file') { + twisty = get_twisty_from_tbody(elem); + if (!twisty.nextSibling.checked) { + elem.className = 'file_collapse'; + twisty.firstChild.nodeValue = '(+)'; + } + } + } + + function twisty_click(twisty) { + tbody = get_tbody_from_twisty(twisty); + if (tbody.className == 'file') { + tbody.className = 'file_collapse'; + twisty.firstChild.nodeValue = '(+)'; + twisty.nextSibling.checked = false; + } else { + tbody.className = 'file'; + twisty.firstChild.nodeValue = '(-)'; + twisty.nextSibling.checked = true; + } + return false; + } + + function get_tbody_from_twisty(twisty) { + return twisty.parentNode.parentNode.parentNode.nextSibling; + } + function get_twisty_from_tbody(tbody) { + return tbody.previousSibling.firstChild.firstChild.firstChild; + } +[% END %] + +[% onload = 'restore_all(); document.checkboxform.restore_indicator.checked = true' %] + +[% IF headers %] + [% h1 = BLOCK %] + [% IF attachid %] + [% description FILTER html %] (#[% attachid %]) + [% ELSE %] + [% old_url = url('attachment.cgi', action = 'diff', id = oldid) %] + [% new_url = url('attachment.cgi', action = 'diff', id = newid) %] + Diff Between + <a href="[% old_url %]">[% old_desc FILTER html %]</a> + (<a href="[% old_url %]">#[% oldid %]</a>) + and + <a href="[% new_url %]">[% new_desc FILTER html %]</a> + (<a href="[% new_url %]">#[% newid %]</a>) + [% END %] + for <a href="show_bug.cgi?id=[% bugid %]">Bug #[% bugid %]</a> + [% END %] + [% h2 = BLOCK %] + [% bugsummary FILTER html %] + [% END %] + [% PROCESS global/header.html.tmpl %] +[% ELSE %] + <html> + <head> + <style type="text/css"> + [% style %] + </style> + <script type="text/javascript" language="JavaScript"> + <!-- + [% javascript %] + --> + </script> + </head> + <body onload="[% onload FILTER html %]"> +[% END %] + +[%# If we have attachid, we are in diff, otherwise we're in interdiff %] +[% IF attachid %] + [%# HEADER %] + [% IF headers %] + [% USE url('attachment.cgi', id = attachid) %] + <a href="[% url() %]">View</a> + | <a href="[% url(action = 'edit') %]">Edit</a> + [% USE url('attachment.cgi', id = attachid, context = context, + collapsed = collapsed, headers = headers, + action = 'diff') %] + | <a href="[% url(format = 'raw') %]">Raw Unified</a> + [% END %] + [% IF other_patches %] + [% IF headers %] |[%END%] + Differences between + <form style="display: inline"> + <select name="oldid"> + [% FOREACH patch = other_patches %] + <option value="[% patch.id %]" + [% IF patch.selected %] selected[% END %] + >[% patch.desc FILTER html %]</option> + [% END %] + </select> + and this patch + <input type="submit" value="Diff"> + <input type="hidden" name="action" value="interdiff"> + <input type="hidden" name="newid" value="[% attachid %]"> + <input type="hidden" name="headers" value="[% headers FILTER html %]"> + </form> + [% END %] + <br> +[% ELSE %] + [% IF headers %] + [% USE url('attachment.cgi', newid = newid, oldid = oldid, action = 'interdiff') %] + <a href="[% url(format = 'raw') %]">Raw Unified</a> + [% IF attachid %] + <br> + [% ELSE %] + | + [% END %] + [% END %] +[% END %] + +[%# Collapse / Expand %] +<a href="#" + onmouseover="lastStatus = window.status; window.status='Collapse All'; return true" + onmouseout="window.status = lastStatus; return true" + onclick="return collapse_all()">Collapse All</a> | +<a href="#" + onmouseover="lastStatus = window.status; window.status='Expand All'; return true" + onmouseout="window.status = lastStatus; return true" + onclick="return expand_all()">Expand All</a> + +[% IF do_context %] + | <span style='font-weight: bold'>Context:</span> + [% IF context == "patch" %] + (<strong>Patch</strong> / + [% ELSE %] + (<a href="[% url(context = '') %]">Patch</a> / + [% END %] + [% IF context == "file" %] + <strong>File</strong> / + [% ELSE %] + <a href="[% url(context = 'file') %]">File</a> / + [% END %] + + [% IF context == "patch" || context == "file" %] + [% context = 3 %] + [% END %] + [%# textbox for context %] + <form style="display: inline"><input type="hidden" name="action" value="diff"><input type="hidden" name="id" value="[% attachid %]"><input type="hidden" name="collapsed" value="[% collapsed FILTER html %]"><input type="hidden" name="headers" value="[% headers FILTER html %]"><input type="text" name="context" value="[% context FILTER html %]" size="3"></form>) +[% END %] + +[% IF warning %] +<h2 class="warning">Warning: + [% IF warning == "interdiff1" %] + this difference between two patches may show things in the wrong places due + to a limitation in Bugzilla when comparing patches with different sets of + files. + [% END %] + [% IF warning == "interdiff2" %] + this difference between two patches may be inaccurate due to a limitation in + Bugzilla when comparing patches made against different revisions. + [% END %] +</h2> +[% END %] + +[%# Restore Stuff %] +<form name="checkboxform"> +<input type="checkbox" name="restore_indicator" style="display: none"> + + diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index 7cd682cd575ffaef701a1f628c8aa351fea4c6cd..3de65766a7755a43965d3b8906079c6033826a37 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -19,13 +19,15 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [%# Define strings that will serve as the title and header of this page %] -[% title = BLOCK %]Edit Attachment #[% attachid %] for Bug #[% bugid %][% END %] +[% title = BLOCK %]Edit Attachment #[% attachid %] for [% terms.Bug %] #[% bugid %][% END %] [% h1 = BLOCK %]Edit Attachment #[% attachid %] for - [%+ GetBugLink(bugid, "Bug $bugid") %][% END %] + [%+ GetBugLink(bugid, "$terms.Bugs $bugid") %][% END %] [% h2 = BLOCK %][% bugsummary FILTER html %][% END %] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl title = title h1 = h1 h2 = h2 @@ -33,13 +35,17 @@ table.attachment_info th { text-align: right; vertical-align: top; } table.attachment_info td { text-align: left; vertical-align: top; } #noview { text-align: left; vertical-align: center; } - + table#flags th, table#flags td { font-size: small; vertical-align: baseline; text-align: left; } " %] <script type="application/x-javascript" language="JavaScript"> <!-- + var prev_mode = 'raw'; + var current_mode = 'raw'; + var has_edited = 0; + var has_viewed_as_diff = 0; function editAsComment() { // Get the content of the document as a string. @@ -67,44 +73,91 @@ // with a newline. theContent = theContent.replace( /(.*\n|.+)/g , ">$1" ); - hideElementById('viewFrame'); - hideElementById('editButton'); - hideElementById('smallCommentFrame'); - - showElementById('undoEditButton'); - - // Show the TEXTAREA that will contain the editable attachment - // and copy the content of the attachment into it. - showElementById('editFrame'); + switchToMode('edit'); + // Copy the contents of the diff into the textarea var editFrame = document.getElementById('editFrame'); editFrame.value = theContent; editFrame.value += "\n\n"; + + has_edited = 1; } function undoEditAsComment() { - // Hide the "edit attachment as comment" TEXTAREA and the "undo" button. - hideElementById('undoEditButton'); - hideElementById('editFrame'); - - // Show the "view attachment" IFRAME, the "redo" button that allows the user - // to go back to editing the attachment as a comment, and the small comment field. - showElementById('viewFrame'); - showElementById('redoEditButton'); - showElementById('smallCommentFrame'); - + switchToMode(prev_mode); } function redoEditAsComment() { - // Hide the "view attachment" IFRAME, the "redo" button that allows the user - // to go back to editing the attachment as a comment, and the small comment field. - hideElementById('viewFrame'); - hideElementById('redoEditButton'); - hideElementById('smallCommentFrame'); - - // Show the "edit attachment as comment" TEXTAREA and the "undo" button. - showElementById('undoEditButton'); - showElementById('editFrame'); + switchToMode('edit'); + } +[% IF patchviewerinstalled %] + function viewDiff() + { + switchToMode('diff'); + + // If we have not viewed as diff before, set the view diff frame URL + if (!has_viewed_as_diff) { + var viewDiffFrame = document.getElementById('viewDiffFrame'); + viewDiffFrame.src = + 'attachment.cgi?id=[% attachid %]&action=diff&headers=0'; + has_viewed_as_diff = 1; + } + } +[% END %] + function viewRaw() + { + switchToMode('raw'); + } + + function switchToMode(mode) + { + if (mode == current_mode) { + alert('switched to same mode! This should not happen.'); + return; + } + + // Switch out of current mode + if (current_mode == 'edit') { + hideElementById('editFrame'); + hideElementById('undoEditButton'); + } else if (current_mode == 'raw') { + hideElementById('viewFrame'); +[% IF patchviewerinstalled %] + hideElementById('viewDiffButton'); +[% END %] + hideElementById(has_edited ? 'redoEditButton' : 'editButton'); + hideElementById('smallCommentFrame'); + } else if (current_mode == 'diff') { +[% IF patchviewerinstalled %] + hideElementById('viewDiffFrame'); +[% END %] + hideElementById('viewRawButton'); + hideElementById(has_edited ? 'redoEditButton' : 'editButton'); + hideElementById('smallCommentFrame'); + } + + // Switch into new mode + if (mode == 'edit') { + showElementById('editFrame'); + showElementById('undoEditButton'); + } else if (mode == 'raw') { + showElementById('viewFrame'); +[% IF patchviewerinstalled %] + showElementById('viewDiffButton'); +[% END %] + showElementById(has_edited ? 'redoEditButton' : 'editButton'); + showElementById('smallCommentFrame'); + } else if (mode == 'diff') { +[% IF patchviewerinstalled %] + showElementById('viewDiffFrame'); +[% END %] + showElementById('viewRawButton'); + showElementById(has_edited ? 'redoEditButton' : 'editButton'); + showElementById('smallCommentFrame'); + } + + prev_mode = current_mode; + current_mode = mode; } function hideElementById(id) @@ -161,7 +214,7 @@ <b>MIME Type:</b><br> <input type="text" size="20" name="contenttypeentry" value="[% contenttype FILTER html %]"><br> - + <input type="checkbox" id="ispatch" name="ispatch" value="1" [% 'checked="checked"' IF ispatch %]> <label for="ispatch">patch</label> @@ -176,14 +229,17 @@ [% IF flag_types.size > 0 %] [% PROCESS "flag/list.html.tmpl" bug_id=bugid attach_id=attachid %]<br> [% END %] - + <div id="smallCommentFrame"> - <b>Comment (on the bug):</b><br> + <b>Comment (on the [% terms.bug %]):</b><br> <textarea name="comment" rows="5" cols="25" wrap="soft"></textarea><br> </div> - <input type="submit" value="Submit"> - + <input type="submit" value="Submit"><br><br> + <strong>Actions:</strong> <a href="attachment.cgi?id=[% attachid %]">View</a> + [% IF ispatch && patchviewerinstalled %] + | <a href="attachment.cgi?id=[% attachid %]&action=diff">Diff</a> + [% END %] </small> </td> @@ -197,9 +253,16 @@ <script type="application/x-javascript" language="JavaScript"> <!-- if (typeof document.getElementById == "function") { +[% IF patchviewerinstalled %] + document.write('<iframe id="viewDiffFrame" style="height: 400px; width: 100%; display: none;"></iframe>'); +[% END %] document.write('<button type="button" id="editButton" onclick="editAsComment();">Edit Attachment As Comment</button>'); document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment();" style="display: none;">Undo Edit As Comment</button>'); document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment();" style="display: none;">Redo Edit As Comment</button>'); +[% IF patchviewerinstalled %] + document.write('<button type="button" id="viewDiffButton" onclick="viewDiff();">View Attachment As Diff</button>'); +[% END %] + document.write('<button type="button" id="viewRawButton" onclick="viewRaw();" style="display: none;">View Attachment As Raw</button>'); } //--> </script> @@ -217,7 +280,7 @@ </table> - Attachments on this Bug: + Attachments on this [% terms.Bug %]: [% FOREACH a = attachments %] [% IF a == attachid %] #[% a %] diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl index d64e6595355f562f10f4b1c0ec0594a6bef7e18e..1e3618093a7079d1c99311c6e3bf1a092e065d16 100644 --- a/template/en/default/attachment/list.html.tmpl +++ b/template/en/default/attachment/list.html.tmpl @@ -35,11 +35,7 @@ [% IF !attachment.isprivate || canseeprivate %] <tr [% "class=\"bz_private\"" IF attachment.isprivate %]> <td valign="top"> - [% IF attachment.isobsolete %] - <strike><a href="attachment.cgi?id=[% attachment.attachid %]&action=view">[% attachment.description FILTER html %]</a></strike> - [% ELSE %] - <a href="attachment.cgi?id=[% attachment.attachid %]&action=view">[% attachment.description FILTER html %]</a> - [% END %] + <a href="attachment.cgi?id=[% attachment.attachid %]&action=view" [% "class=\"bz_obsolete\"" IF attachment.isobsolete %]>[% attachment.description FILTER html %]</a> </td> <td valign="top"> @@ -57,13 +53,13 @@ [% IF attachment.flags.size == 0 %] <i>none</i> [% ELSE %] - [% FOR flag = attachment.flags %] + [% FOREACH flag = attachment.flags %] [% IF flag.setter %] [% flag.setter.nick FILTER html %]: [% END %] - [%+ flag.type.name %][% flag.status %] + [%+ flag.type.name FILTER html %][% flag.status %] [%+ IF flag.status == "?" && flag.requestee %] - ([% flag.requestee.nick %]) + ([% flag.requestee.nick FILTER html %]) [% END %]<br> [% END %] [% END %] @@ -73,8 +69,12 @@ <td valign="top"> [% IF attachment.canedit %] <a href="attachment.cgi?id=[% attachment.attachid %]&action=edit">Edit</a> - [% ELSE %] - None + [% END %] + [% IF attachment.ispatch && patchviewerinstalled %] + [% IF attachment.canedit %] + | + [% END %] + <a href="attachment.cgi?id=[% attachment.attachid %]&action=diff">Diff</a> [% END %] </td> </tr> @@ -85,9 +85,15 @@ <td colspan="[% show_attachment_flags ? 4 : 3 %]"> <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.) </td> - <td colspan="1"> - <a href="attachment.cgi?bugid=[% bugid %]&action=viewall">View All</a> - </td> + [% IF attachments.size %] + <td> + <a href="attachment.cgi?bugid=[% bugid %]&action=viewall">View All</a> + </td> + [% ELSE %] + <td class="bz_disabled"> + View All + </td> + [% END %] </tr> </table> <br> diff --git a/template/en/default/attachment/show-multiple.html.tmpl b/template/en/default/attachment/show-multiple.html.tmpl index b137504e56103e96f186326c01a69bfb6c5bf252..28de784306a5ab9edf3c1ea725d6e13c6998b97a 100644 --- a/template/en/default/attachment/show-multiple.html.tmpl +++ b/template/en/default/attachment/show-multiple.html.tmpl @@ -19,11 +19,12 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] [% filtered_summary = bugsummary FILTER html %] [% h1 = BLOCK %]View All Attachments for - [%+ GetBugLink(bugid, "Bug $bugid") %][% END %] -[% PROCESS global/header.html.tmpl - title = "View All Attachments for Bug #$bugid" + [%+ GetBugLink(bugid, "$terms.Bug $bugid") %][% END %] +[% PROCESS global/header.html.tmpl + title = "View All Attachments for $terms.Bug #$bugid" h1 = h1 h2 = filtered_summary style = " @@ -73,7 +74,7 @@ </td> <td valign="top"> - <a href="attachment.cgi?id=[% a.attachid %]&action=edit">Edit</a> + <a href="attachment.cgi?id=[% a.attachid %]&action=edit">Edit</a> </td> </tr> </table> diff --git a/template/en/default/attachment/updated.html.tmpl b/template/en/default/attachment/updated.html.tmpl index df5f4665abd3994f47451835e046042a8875f69e..00b5a66f8696367754057f3ef74fb6711958ed20 100644 --- a/template/en/default/attachment/updated.html.tmpl +++ b/template/en/default/attachment/updated.html.tmpl @@ -24,8 +24,10 @@ # bugid: integer. ID of the bug we are updating. # attachid: integer. ID of the attachment we just attached. #%] - -[% PROCESS global/header.html.tmpl + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Changes Submitted" style = "th { text-align: left; }" %] @@ -35,15 +37,15 @@ <table border="1"> <tr> <td> - <h2>Changes to + <h2>Changes to <a href="attachment.cgi?id=[% attachid %]&action=edit">attachment [% attachid %]</a> - of bug [% bugid %] submitted + of [% terms.bug %] [% bugid %] submitted </h2> [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = bugid %] </td> <td> - <a href="show_bug.cgi?id=[% bugid %]">Back to Bug #[% bugid %]</a> + <a href="show_bug.cgi?id=[% bugid %]">Back to [% terms.Bug %] #[% bugid %]</a> </td> </tr> </table> diff --git a/template/en/default/bug/CVS/Entries b/template/en/default/bug/CVS/Entries index a0d0b7d3f70eddbf97e07624691cc88635be2061..470cc8c3c223c95aff58d986732163266e374172 100644 --- a/template/en/default/bug/CVS/Entries +++ b/template/en/default/bug/CVS/Entries @@ -1,13 +1,14 @@ -/choose.html.tmpl/1.4/Sun Dec 15 09:24:08 2002//TBUGZILLA-2_17_4 -/comments.html.tmpl/1.7/Thu Nov 28 10:49:50 2002//TBUGZILLA-2_17_4 -/dependency-graph.html.tmpl/1.7/Fri Jun 28 00:18:22 2002//TBUGZILLA-2_17_4 -/dependency-tree.html.tmpl/1.6/Tue Nov 19 00:16:29 2002//TBUGZILLA-2_17_4 -/edit.html.tmpl/1.32/Wed Apr 9 09:29:19 2003//TBUGZILLA-2_17_4 -/navigate.html.tmpl/1.3/Fri Nov 1 16:40:33 2002//TBUGZILLA-2_17_4 -/show-multiple.html.tmpl/1.10/Thu Apr 24 20:49:39 2003//TBUGZILLA-2_17_4 -/show.html.tmpl/1.2/Sun Dec 15 09:24:08 2002//TBUGZILLA-2_17_4 -/show.xml.tmpl/1.2/Wed Jan 15 07:59:48 2003//TBUGZILLA-2_17_4 -/time.html.tmpl/1.1/Sun Oct 13 04:26:14 2002//TBUGZILLA-2_17_4 +/choose.html.tmpl/1.5/Thu Jul 3 21:31:35 2003//TBUGZILLA-2_17_5 +/comments.html.tmpl/1.8/Tue Sep 2 00:11:25 2003//TBUGZILLA-2_17_5 +/dependency-graph.html.tmpl/1.8/Thu Jul 3 21:31:36 2003//TBUGZILLA-2_17_5 +/dependency-tree.html.tmpl/1.8/Sat Sep 6 19:23:24 2003//TBUGZILLA-2_17_5 +/edit.html.tmpl/1.36/Wed Oct 29 04:32:39 2003//TBUGZILLA-2_17_5 +/knob.html.tmpl/1.1/Wed Oct 29 04:32:39 2003//TBUGZILLA-2_17_5 +/navigate.html.tmpl/1.4/Thu Jul 3 21:31:37 2003//TBUGZILLA-2_17_5 +/show-multiple.html.tmpl/1.13/Sat Sep 6 19:23:23 2003//TBUGZILLA-2_17_5 +/show.html.tmpl/1.3/Thu Jul 3 21:31:37 2003//TBUGZILLA-2_17_5 +/show.xml.tmpl/1.3/Tue Jun 3 09:48:05 2003//TBUGZILLA-2_17_5 +/time.html.tmpl/1.1/Sun Oct 13 04:26:14 2002//TBUGZILLA-2_17_5 D/activity//// D/create//// D/process//// diff --git a/template/en/default/bug/CVS/Tag b/template/en/default/bug/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/bug/CVS/Tag +++ b/template/en/default/bug/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/bug/activity/CVS/Entries b/template/en/default/bug/activity/CVS/Entries index 932bf1a0c868440fb1c98e0b295845851eb1b82a..205d143991d5d13af14839adbfaeb4b9943bce59 100644 --- a/template/en/default/bug/activity/CVS/Entries +++ b/template/en/default/bug/activity/CVS/Entries @@ -1,3 +1,3 @@ -/show.html.tmpl/1.4/Tue May 21 17:53:28 2002//TBUGZILLA-2_17_4 -/table.html.tmpl/1.3/Wed Nov 27 16:00:42 2002//TBUGZILLA-2_17_4 +/show.html.tmpl/1.5/Thu Jul 3 21:31:33 2003//TBUGZILLA-2_17_5 +/table.html.tmpl/1.5/Sat Sep 6 19:23:31 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/bug/activity/CVS/Tag b/template/en/default/bug/activity/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/bug/activity/CVS/Tag +++ b/template/en/default/bug/activity/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/bug/activity/show.html.tmpl b/template/en/default/bug/activity/show.html.tmpl index 2e44f89fd0daf2ba55662dd29cd867af87a29876..4a7461b60a0da9b2d5b76c62900177f30ede1ad4 100644 --- a/template/en/default/bug/activity/show.html.tmpl +++ b/template/en/default/bug/activity/show.html.tmpl @@ -25,11 +25,13 @@ # This template also needs to be called with the interface to the # activity.html.tmpl template fulfilled. #%] - -[% PROCESS global/header.html.tmpl - title = "Changes made to bug $bug_id" + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Changes made to $terms.bug $bug_id" h1 = "Activity log" - h2 = "Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" + h2 = "$terms.Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" %] <br> @@ -37,7 +39,7 @@ [% PROCESS bug/activity/table.html.tmpl %] <p> - <a href="show_bug.cgi?id=[% bug_id %]">Back to bug [% bug_id %]</a> + <a href="show_bug.cgi?id=[% bug_id %]">Back to [% terms.bug %] [% bug_id %]</a> </p> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl index 95beaef14061d315e4699e2eb561b1076188a6c9..af6305b5dd7d2b1b12e8ad39ae6f94c9effaf5fd 100644 --- a/template/en/default/bug/activity/table.html.tmpl +++ b/template/en/default/bug/activity/table.html.tmpl @@ -23,7 +23,7 @@ # operations: array of hashes. May be empty. Each has has three members: # who: string. who performed the operation # when: string. when they performed it - # changes: hash. Details of what they changed. This hash has three + # changes: hash. Details of what they changed. This hash has three # compulsory and one optional member: # field: string. The name of the field # removed: string. What was removed from the field @@ -33,14 +33,16 @@ # it was affected by an old Bugzilla bug.) #%] +[% PROCESS global/variables.none.tmpl %] + [% PROCESS bug/time.html.tmpl %] - + [% IF incomplete_data %] <p> - There used to be a bug Bugzilla which caused activity data + There used to be a [% terms.bug %] in [% terms.Bugzilla %] which caused activity data to be lost if there was a large number of cc's or dependencies. That - has been fixed, however, there was some data already lost on this bug - that could not be regenerated. The changes that the script could not + has been fixed, however, there was some data already lost on this [% terms.bug %] that + could not be regenerated. The changes that the script could not reliably determine are prefixed by '?'. </p> [% END %] @@ -55,10 +57,10 @@ <th>Added</th> </tr> - [% FOREACH operation = operations %] + [% FOREACH operation = operations %] <tr> <td rowspan="[% operation.changes.size %]" valign="top"> - [% operation.who %] + [% operation.who FILTER html %] </td> <td rowspan="[% operation.changes.size %]" valign="top"> [% operation.when FILTER time %] @@ -68,7 +70,7 @@ <td> [% IF change.attachid %] <a href="attachment.cgi?id=[% change.attachid %]&action=view"> - Attachment #[% change.attachid %]</a> + Attachment #[% change.attachid %]</a> [% END %] [% change.field %] </td> diff --git a/template/en/default/bug/choose.html.tmpl b/template/en/default/bug/choose.html.tmpl index f965ccc4d6e9d171a88f812331ba3a31d15b310a..4b67c306ff20d515cb71c6ad9c7e4cb0514b1b57 100644 --- a/template/en/default/bug/choose.html.tmpl +++ b/template/en/default/bug/choose.html.tmpl @@ -19,15 +19,17 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% PROCESS global/header.html.tmpl - title = "Search by bug number" +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search by $terms.bug number" %] <form method="get" action="show_bug.cgi"> <p> - You may find a single bug by entering its bug id here: + You may find a single [% terms.bug %] by entering its [% terms.bug %] id here: <input name="id" size="6"> - <input type="submit" value="Show Me This Bug"> + <input type="submit" value="Show Me This [% terms.Bug %]"> </p> </form> diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl index 98d7ae3869a84d6e8954993f902fe81535b1d860..0ea28ef3b4dce3fc93240cb2924dc36ea9e4902f 100644 --- a/template/en/default/bug/comments.html.tmpl +++ b/template/en/default/bug/comments.html.tmpl @@ -41,12 +41,17 @@ <div [% "class=\"bz_private\"" IF comment.isprivate %]> [% IF count > 0 %] <br> - <i>------- Additional Comment + ------- <i>Additional Comment <a name="c[% count %]" href="#c[% count %]">#[% count %]</a> From - <a href="mailto:[% comment.email FILTER html %]">[% comment.name FILTER html %]</a> + <a href="mailto:[% comment.email FILTER html %]"> + [% comment.name FILTER html %]</a> [%+ comment.time FILTER time %] - ------- </i> + [% IF mode == "edit" %] + <script type="text/javascript" language="JavaScript"><!-- + addReplyLink([% count %]); //--></script> + [% END %] + ------- [% END %] [% IF mode == "edit" && isinsider %] @@ -64,10 +69,11 @@ Additional hours worked: [% PROCESS formattimeunit time_unit=comment.work_time %] [% END %] + [%# Don't indent the <pre> block, since then the spaces are displayed in the # generated HTML #%] -<pre> +<pre[% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]> [%- comment.body FILTER quoteUrls -%] </pre> </div> diff --git a/template/en/default/bug/create/CVS/Entries b/template/en/default/bug/create/CVS/Entries index 760d3262acd8e85a7e2cbb9c38b099d46a00f0ca..72d9a5984947376114d08c48087c8f70ab4e5138 100644 --- a/template/en/default/bug/create/CVS/Entries +++ b/template/en/default/bug/create/CVS/Entries @@ -1,8 +1,8 @@ -/comment-guided.txt.tmpl/1.1/Wed Oct 23 22:15:16 2002//TBUGZILLA-2_17_4 -/comment.txt.tmpl/1.2/Mon May 6 19:17:06 2002//TBUGZILLA-2_17_4 -/create-guided.html.tmpl/1.8/Thu Apr 24 20:49:42 2003//TBUGZILLA-2_17_4 -/create.html.tmpl/1.17/Thu Apr 24 20:49:42 2003//TBUGZILLA-2_17_4 -/created.html.tmpl/1.6/Sun Feb 16 12:01:14 2003//TBUGZILLA-2_17_4 -/make-template.html.tmpl/1.4/Thu Apr 24 20:49:42 2003//TBUGZILLA-2_17_4 -/user-message.html.tmpl/1.1/Wed Jun 5 03:40:28 2002//TBUGZILLA-2_17_4 +/comment-guided.txt.tmpl/1.1/Wed Oct 23 22:15:16 2002//TBUGZILLA-2_17_5 +/comment.txt.tmpl/1.2/Mon May 6 19:17:06 2002//TBUGZILLA-2_17_5 +/create-guided.html.tmpl/1.14/Sat Oct 18 22:24:51 2003//TBUGZILLA-2_17_5 +/create.html.tmpl/1.21/Wed Sep 17 22:13:06 2003//TBUGZILLA-2_17_5 +/created.html.tmpl/1.7/Thu Jul 3 21:31:40 2003//TBUGZILLA-2_17_5 +/make-template.html.tmpl/1.5/Thu Jul 3 21:31:40 2003//TBUGZILLA-2_17_5 +/user-message.html.tmpl/1.2/Thu Jul 3 21:31:40 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/bug/create/CVS/Tag b/template/en/default/bug/create/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/bug/create/CVS/Tag +++ b/template/en/default/bug/create/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl index 7ab7436a71e1c31ea3749ad2a687bc28606091ff..e42698cec1de4c8c87eaa0ef0ab366f12c6abd82 100644 --- a/template/en/default/bug/create/create-guided.html.tmpl +++ b/template/en/default/bug/create/create-guided.html.tmpl @@ -24,21 +24,23 @@ # This template has the same interface as create.html.tmpl #%] +[% PROCESS global/variables.none.tmpl %] + [% USE Bugzilla %] [% cgi = Bugzilla.cgi %] [% PROCESS global/header.html.tmpl - title = "Enter A Bug" + title = "Enter $terms.ABug" onload = "PutDescription()" %] <p> <font color="red"> - This is a template used on mozilla.org - it, along with the + This is a template used on mozilla.org - it, along with the comment-guided.txt.tmpl template, are included as a demo of what it's - possible to do with custom templates in general, and custom bug entry + possible to do with custom templates in general, and custom [% terms.bug %] entry templates in particular. It is recommended that this template be - customised if you want to use it on your Bugzilla installation. + customised if you want to use it on your [% terms.Bugzilla %] installation. </font> </p> @@ -66,15 +68,15 @@ function PutDescription() { [%# Browser sniff to try and reduce the incidence of 4.x and NS 6/7 bugs %] [% IF cgi.user_agent("Mozilla/4") AND NOT cgi.user_agent("compatible") %] - <div style="background-color: lightgrey; - border: 1px solid black; + <div style="background-color: lightgrey; + border: 1px solid black; padding: 2px"> <font color="#990000"> <b> - Note: This is a tool for reporting bugs in software from mozilla.org. + Note: This is a tool for reporting [% terms.bugs %] in software from mozilla.org. Use Netscape's - <a href="http://help.netscape.com/forms/bug-client.html">bug reporting - form</a> to report bugs with Netscape products like Navigator 4.x. + <a href="http://help.netscape.com/forms/bug-client.html">[% terms.bug %] reporting + form</a> to report [% terms.bugs %] with Netscape products like Navigator 4.x. Netscape products have a blue and black N in the top right hand corner. </b> @@ -84,96 +86,81 @@ function PutDescription() { [% IF cgi.user_agent('Netscape(\d)') %] [% matches = cgi.user_agent().match('Netscape(\d)') %] - <div style="background-color: lightgrey; - border: 1px solid black; + <div style="background-color: lightgrey; + border: 1px solid black; padding: 2px"> <font color="#990000"> <b> - You are using Netscape [% matches.0 %]. - Report bugs with this browser to the + You are using Netscape [% matches.0 %]. + Report [% terms.bugs %] with this browser to the <a href="http://home.netscape.com/browsers/[% matches.0 %]/feedback/index.html"> Netscape [% matches.0 %] Feedback Center.</a> </b> </font> - This form is only for reporting bugs in the Mozilla web browser and other - products from mozilla.org. To report a bug you find in - Netscape [% matches.0 %] with this form, - you must reproduce it first in a + This form is only for reporting [% terms.bugs %] in the Mozilla web browser and other + products from mozilla.org. To report [% terms.abug %] you find in + Netscape [% matches.0 %] with this form, + you must reproduce it first in a <a href="http://ftp.mozilla.org/pub/mozilla/nightly/latest/"> - recent build</a> of Mozilla to make sure the problem hasn't been + recent build</a> of Mozilla to make sure the problem hasn't been fixed already. </div> [% END %] <p> This form prompts you for the information required to - file a good bug report (or enhancement request.) - It may seem lengthy, but developers need all this information - to understand and reproduce the bug, which is the first step towards - fixing it. Please note that <strong>we do not accept bug reports by - email</strong> - please do not email developers or mozilla.org staff - with bug reports. <font color="red">Also, please do not - file Mozilla bugs on copies of Mozilla older than two weeks - first, - download a + file a good [% terms.bug %] report (or enhancement request.) + It may seem lengthy, but developers need all this information + to understand and reproduce the [% terms.bug %], which is the first step towards + fixing it. Please note that <strong>we do not accept [% terms.bug %] reports by + email</strong> - please do not email developers or mozilla.org staff + with [% terms.bug %] reports. <font color="red">Also, please do not + file Mozilla [% terms.bugs %] on copies of Mozilla older than two weeks - first, + download a <a href="http://ftp.mozilla.org/pub/mozilla/nightly/latest/">newer build</a> and check that the problem is still present. </font> </p> -<a name="step1"></a> -<h3>Step 1 - search for your bug</h3> +<a name="step1"></a> +<h3>Step 1 - search for your [% terms.bug %]</h3> <p> - You need to see if your bug has already been reported. - <font color="red">Please don't skip this step.</font> - 50% of the bugs filed in - Bugzilla are duplicates, and and this wastes a lot of our QA engineers' time. + Please see if your [% terms.bug %] has already been reported. + <font color="red">Please don't skip this step.</font> + 50% of the [% terms.bugs %] filed in + [% terms.Bugzilla %] are duplicates, and this wastes a lot of our QA engineers' time. </p> [%# Stop NS 4.x and all v.3 browsers from getting <iframe> code %] -[% IF (cgi.user_agent("Mozilla/4") - AND NOT cgi.user_agent("compatible")) +[% IF (cgi.user_agent("Mozilla/4") + AND NOT cgi.user_agent("compatible")) OR (cgi.user_agent("Mozilla/[123]")) %] <p> - Visit the <a href="duplicates.cgi">most-frequently-reported bugs page</a> - and see if your bug is there. If not, go to the - <a href="query.cgi?format=modern">search page</a> - and search Bugzilla by entering two or - three of the main words having to do with your bug in the top box. + Visit the <a href="duplicates.cgi">most-frequently-reported [% terms.bugs %] page</a> + and see if your [% terms.bug %] is there. If not, go to the + <a href="query.cgi?format=modern">search page</a> + and search [% terms.Bugzilla %] by entering two or + three of the main words having to do with your [% terms.bug %] in the top box. For example: <tt><b>pop3 mail</b></tt> or <tt><b>copy paste</b></tt>. - </p> + </p> [% ELSE %] <p> - Check the list of most-frequently-reported bugs below. - If your bug isn't there, search Bugzilla by entering two or - three of the main words having to do with your bug in this box. + Check the list of most-frequently-reported [% terms.bugs %] below. + If your [% terms.bug %] isn't there, search [% terms.Bugzilla %] by entering two or + three of the main words having to do with your [% terms.bug %] in this box. For example: <tt><b>pop3 mail</b></tt> or <tt><b>copy paste</b></tt>. - </p> - - <script type="text/javascript" language="JavaScript"> - [%# Tell QuickSearch to use the custom-supplied load_relative_url() - function. This was originally designed for the sidebar, hence the - variable name. %] - var sidebar = 1; - - function load_relative_url(url) { - frames['somebugs'].location.href = url + "&format=simple"; - } - </script> + </p> - <script type="text/javascript" language="JavaScript" - src="localconfig.js"></script> - <script type="text/javascript" language="JavaScript" - src="quicksearch.js"></script> - - <form name="f" action="show_bug.cgi" method="get" - onsubmit="QuickSearch(f.id.value); return false;"> - - <input type="text" name="id" size="40"> + <form action="buglist.cgi" method="get" target="somebugs"> + <input type="hidden" name="format" value="simple"> + <input type="hidden" name="bug_status" value="__open__"> + <input type="hidden" name="product" value="[% product FILTER html %]"> + <input type="text" name="content" size="40"> <input type="submit" value="Search"> </form> - <iframe name="somebugs" width="100%" height="80%" + <iframe name="somebugs" width="100%" height="80%" style="border: 2px black solid" src="duplicates.cgi?product=[% product FILTER uri %]&format=simple"> </iframe> @@ -181,41 +168,41 @@ function PutDescription() { <p> Look through the search results. If you get the - <tt><b>Zarro Boogs</b></tt> message, Bugzilla found no bugs that + <tt><b>Zarro Boogs</b></tt> message, [% terms.Bugzilla %] found no [% terms.bugs %] that match. Check for typos, or add fewer or different keywords. </p> <p> - If you find a bug that looks the same as yours, you can add - useful comments to that bug, but please don't open a new one. - Please don't add comments like "please fix this bug" - this + If you find [% terms.abug %] that looks the same as yours, you can add + useful comments to that [% terms.bug %], but please don't open a new one. + Please don't add comments like "please fix this [% terms.bug %]" - this tends to annoy engineers and slow, rather than speed, the fixing of it. </p> <p> - If you find bugs similar to yours, read them and note which component - they are in. You should file your bug in that same component. + If you find [% terms.bugs %] similar to yours, read them and note which component + they are in. You should file your [% terms.bug %] in that same component. </p> -<a name="step2"></a> +<a name="step2"></a> <h3>Step 2 - give information</h3> <p> - If you're pretty certain that your bug isn't in there already, then + If you're pretty certain that your [% terms.bug %] isn't in there already, then please try to complete this form as accurately as you can. The more you can tell us, the better our chance of being able - to understand and reproduce your bug. + to understand and reproduce your [% terms.bug %]. </p> -<form method="post" action="post_bug.cgi"> +<form method="post" action="post_bug.cgi"> <input type="hidden" name="format" value="guided"> <input type="hidden" name="assigned_to" value=""> - <input type="hidden" name="priority" + <input type="hidden" name="priority" value="[% default.priority FILTER html %]"> - <input type="hidden" name="version" + <input type="hidden" name="version" value="[% default.version FILTER html %]"> - + <table valign="top" cellpadding="5" cellspacing="5" border="0"> <tr bgcolor="[% tablecolour %]"> @@ -233,18 +220,19 @@ function PutDescription() { <b>Component</b> </td> <td valign="top"> - <p> + <p> The area where the problem occurs. - To pick the right component, you could use the same one as - similar bugs you found in your search, or read the full list of - <a href="describecomponents.cgi?product=[% product %]">component + To pick the right component, you could use the same one as + similar [% terms.bugs %] you found in your search, or read the full list of + <a href="describecomponents.cgi?product= + [% product FILTER url_quote %]">component descriptions</a> if you need more help. </p> - + <table border="0" cellpadding="0" cellspacing="0"> <tr> - <td valign="top"> - <select name="component" id="component" + <td valign="top"> + <select name="component" id="component" size="5" onchange="PutDescription()"> [% FOREACH c = component_ %] <option value="[% c.name FILTER html %]" @@ -257,7 +245,7 @@ function PutDescription() { <td valign="top" width="100%"> <div id="description" style="color: green; margin-left: 10px; height: 5em; overflow: auto;"> - <script type="text/javascript" language="JavaScript"> + <script type="text/javascript" language="JavaScript"> if ((document.getElementById) && (document.body.innerHTML)) { document.write("\ Select a component to see its description here."); @@ -291,7 +279,7 @@ function PutDescription() { <td align="right" valign="middle"> <b>Operating System</b> </td> - <td valign="top"> + <td valign="top"> [% PROCESS select sel = 'op_sys' %] </td> </tr> @@ -305,16 +293,16 @@ function PutDescription() { </td> <td valign="top"> <p> - If reporting a bug in Mozilla, - this is the line beginning <tt>"Mozilla/5.0"</tt> in - <tt>Help | About Mozilla</tt>. + If reporting [% terms.abug %] in Mozilla, + this is the line beginning <tt>"Mozilla/5.0"</tt> in + <tt>Help | About Mozilla</tt>. It identifies exactly the version of Mozilla you were using. If you are using the problem copy of Mozilla, this will be filled in correctly for you already. If Mozilla won't start, just enter the URL of the directory you downloaded it from. </p> - <input type="text" size="80" name="buildid" value="[% buildid %]"> + <input type="text" size="80" name="buildid" value="[% buildid %]"> </td> </tr> @@ -325,9 +313,9 @@ function PutDescription() { <td valign="top"> <p> URL that demonstrates the problem you are seeing (optional.) - <b>IMPORTANT</b>: If you are filing a bug about a broken web page, - you need to read the - <a href="http://www.mozilla.org/docs/web-developer/faq.html">Mozilla + <b>IMPORTANT</b>: If you are filing [% terms.abug %] about a broken web page, + please read the + <a href="http://www.mozilla.org/docs/web-developer/faq.html">Mozilla Web Developer FAQ</a>, which explains how we handle old or badly-coded web pages. </p> @@ -337,13 +325,13 @@ function PutDescription() { <tr bgcolor="[% tablecolour %]"> <td align="right" valign="middle"> - <b>Summary</b> + <b>Summary</b> </td> <td valign="top"> <p> A sentence which summarises the problem. Please be descriptive and use lots of keywords. - </p> + </p> <p> <tt> <font color="#990000">Bad example</font>: mail crashed @@ -360,7 +348,7 @@ function PutDescription() { <tr> <td align="right" valign="middle"> - <b>Details</b> + <b>Details</b> </td> <td valign="top"> <p> @@ -380,7 +368,7 @@ function PutDescription() { right margins. In Mozilla, the text is only left-justified. </tt> </p> - <textarea rows="6" cols="80" name="comment" + <textarea rows="6" cols="80" name="comment" wrap="hard"></textarea> </td> </tr> @@ -412,7 +400,7 @@ function PutDescription() { <tr> <td align="right" valign="middle"> - <b>Steps to Reproduce</b> + <b>Steps to Reproduce</b> </td> <td valign="top"> <p> @@ -429,12 +417,12 @@ function PutDescription() { <tr bgcolor="[% tablecolour %]"> <td valign="middle" align="right"> - <b>Actual Results</b> + <b>Actual Results</b> </td> <td valign="top"> <p> What happened after you performed the steps above? - </p> + </p> <textarea rows="4" cols="80" name="actual_results" wrap="hard"></textarea> </td> @@ -442,31 +430,34 @@ function PutDescription() { <tr> <td valign="middle" align="right"> - <b>Expected Results</b> + <b>Expected Results</b> </td> <td valign="top"> <p> What should the software have done instead? </p> - <textarea rows="4" cols="80" name="expected_results" + <textarea rows="4" cols="80" name="expected_results" wrap="hard"></textarea> </td> </tr> <tr bgcolor="[% tablecolour %]"> <td valign="middle" align="right"> - <b>Additional Information</b> + <b>Additional Information</b> </td> <td valign="top"> <p> Add any additional information you feel may be - relevant to this bug, such as the <b>theme</b> you were using - (does the bug still occur + relevant to this [% terms.bug %], such as the <b>theme</b> you were + using (does the [% terms.bug %] still occur with the default theme?), a <b>Talkback crash ID</b>, or special information about <b>your computer's configuration</b>. Any information longer than a few lines, such as a <b>stack trace</b> or <b>HTML - testcase</b>, should be added - using the "Create a new Attachment" link on the bug, after it is filed. + testcase</b>, should be added + using the "Create a new Attachment" link on the [% terms.bug %], after + it is filed. If you believe that it's relevant, please also include + your build configuration, obtained by typing <tt>about:buildconfig</tt> + into your URL bar. <br> <br> If you are reporting a crash, note the module in @@ -475,7 +466,7 @@ function PutDescription() { have MacsBug, attach the results of the <b><tt>how</tt></b> and <b><tt>sc</tt></b> commands. </p> - <textarea rows="8" cols="80" name="additional_info" + <textarea rows="8" cols="80" name="additional_info" wrap="hard"></textarea> </td> </tr> @@ -486,29 +477,29 @@ function PutDescription() { </td> <td valign="top"> <p> - How serious the problem is. Also, if your bug is a request for a new + How serious the problem is. Also, if your [% terms.bug %] is a request for a new feature or enhancement, say so here. </p> <select name="bug_severity"> <option name="blocker" value="blocker"> - Blocker: This bug prevents you from testing or developing the - software. + Blocker: This [% terms.bug %] prevents Mozilla developers from + testing or developing the software. </option> <option name="critical" value="critical"> - Critical: The software crashes, hangs, or causes you to + Critical: The software crashes, hangs, or causes you to lose data. </option> <option name="major" value="major"> Major: A major feature is broken. </option> <option name="normal" value="normal" selected="selected"> - Normal: It's a bug that should be fixed. + Normal: It's [% terms.abug %] that should be fixed. </option> <option name="minor" value="minor"> Minor: Minor loss of function, and there's an easy workaround. </option> <option name="trivial" value="trivial"> - Trivial: A cosmetic problem, such as a misspelled word or + Trivial: A cosmetic problem, such as a misspelled word or misaligned text. </option> <option name="enhancement" value="enhancement"> @@ -518,24 +509,24 @@ function PutDescription() { </td> </tr> </table> - - -<a name="step3"></a> -<h3>Step 3 - submit the bug</h3> + + +<a name="step3"></a> +<h3>Step 3 - submit the [% terms.bug %]</h3> <p> - <input type="submit" value=" Submit Bug Report " - onclick="if (this.form.comment.value == '') - { alert('Please enter some details about this bug.'); + <input type="submit" value=" Submit [% terms.Bug %] Report " + onclick="if (this.form.comment.value == '') + { alert('Please enter some details about this [% terms.bug %].'); this.form.comment.focus(); return false; } return true;"> </p> <p> That's it! Thanks very much. You'll be notified by email about any - progress that is made on fixing your bug. + progress that is made on fixing your [% terms.bug %]. </p> - + </form> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index fcc894e1e63cced466d8aac60243b9a37bc03323..507324bf7affe20b4eec1bc5bd885f2ea57fc00c 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -23,9 +23,52 @@ [% PROCESS global/header.html.tmpl title = "Enter Bug" h2 = "This page lets you enter a new bug into Bugzilla." + onload="set_assign_to();" %] -<form method="post" action="post_bug.cgi"> +<script type="text/javascript" language="JavaScript"> +<!-- + +var default_owners = new Array([% component_.size %]); +var components = new Array([% component_.size %]); +[% count = 0 %] +[%- FOREACH c = component_ %] + components[[% count %]] = "[% c.name FILTER js %]"; + default_owners[[% count %]] = "[% c.default_login FILTER js %]"; + [% count = count + 1 %] +[%- END %] +var last_default_owner; +function set_assign_to() { + // Based on the selected component, fill the "Assign To:" field + // with the default component owner. + var form = document.Create; + assigned_to = form.assigned_to.value + var index = -1; + if (form.component.type == 'select-one') { + index = form.component.selectedIndex; + } else if (form.component.type == 'hidden') { + // Assume there is only one component in the list + index = 0; + } + if (index != -1) { + var owner = default_owners[index]; + var component = components[index]; + if (assigned_to == last_default_owner + || assigned_to == owner + || assigned_to == '' + || confirm('Would you like to change\n\n' + + ' "Assign To: ' + assigned_to + '"\n\n' + + 'to the default "' + component + '" owner:\n\n' + + ' ' + owner + "?")) { + form.assigned_to.value = owner; + last_default_owner = owner; + } + } +} +--> +</script> + +<form name="Create" id="Create" method="post" action="post_bug.cgi"> <input type="hidden" name="product" value="[% product FILTER html %]"> <table cellspacing="2" cellpadding="0" border="0"> @@ -43,7 +86,7 @@ [% INCLUDE 'bug/create/user-message.html.tmpl' %] </td> </tr> - + <tr> <td><br></td> </tr> @@ -51,11 +94,11 @@ <tr> <td align="right" valign="top"><strong>Reporter:</strong></td> <td valign="top">[% reporter FILTER html %]</td> - + <td align="right" valign="top"><strong>Product:</strong></td> <td valign="top">[% product FILTER html %]</td> </tr> - + [%# We can't use the select block in these two cases for various reasons. %] <tr> <td align="right" valign="top"> @@ -69,8 +112,8 @@ </option> [%- END %] </select> - </td> - + </td> + <td align="right" valign="top"> <strong> <a href="describecomponents.cgi?product=[% product FILTER url_quote %]"> @@ -78,7 +121,7 @@ </strong> </td> <td> - <select name="component" size="5"> + <select name="component" onchange="set_assign_to();" size="5"> [%- FOREACH c = component_ %] <option value="[% c.name FILTER html %]" [% " selected=\"selected\"" IF c.name == default.component_ %]> @@ -86,61 +129,62 @@ </option> [%- END %] </select> - </td> + </td> </tr> - + <tr> <td> </td> <td colspan="3"></td> </tr> - + <tr> [% sel = { description => 'Platform', name => 'rep_platform' } %] [% INCLUDE select %] - + [% sel = { description => 'OS', name => 'op_sys' } %] [% INCLUDE select %] </tr> - - <tr> + + <tr> [% IF Param('letsubmitterchoosepriority') %] [% sel = { description => 'Priority', name => 'priority' } %] [% INCLUDE select %] [% ELSE %] - <input type="hidden" name="priority" + <input type="hidden" name="priority" value="[% default.priority FILTER html %]"> [% END %] [% sel = { description => 'Severity', name => 'bug_severity' } %] - [% INCLUDE select %] + [% INCLUDE select %] </tr> - + <tr> <td> </td> <td colspan="3"></td> </tr> -[% IF bug_status.size > 1 %] +[% IF bug_status.size > 1 %] <tr> [% sel = { description => 'Initial State', name => 'bug_status' } %] [% INCLUDE select %] - + <td colspan="2"></td> </tr> [% ELSE %] - <input type="hidden" name="bug_status" value="[% default.bug_status %]"> + <input type="hidden" name="bug_status" + value="[% default.bug_status FILTER html %]"> [% END %] <tr> <td align="right"> <strong> - <a href="bug_status.html#assigned_to">Assigned To</a>: + <a href="bug_status.html#assigned_to">Assign To</a>: </strong> </td> <td colspan="3"> <input name="assigned_to" size="32" value="[% assigned_to FILTER html %]"> - (Leave blank to assign to default component owner) + <noscript>(Leave blank to assign to default component owner)</noscript> </td> </tr> @@ -173,18 +217,18 @@ <tr> <td align="right"><strong>URL:</strong></td> <td colspan="3"> - <input name="bug_file_loc" size="60" + <input name="bug_file_loc" size="60" value="[% bug_file_loc FILTER html %]"> </td> </tr> - + <tr> <td align="right"><strong>Summary:</strong></td> <td colspan="3"> <input name="short_desc" size="60" value="[% short_desc FILTER html %]"> </td> </tr> - + <tr><td align="right" valign="top"><strong>Description:</strong></td> <td colspan="3"> <textarea wrap="hard" name="comment" rows="10" cols="80"> @@ -223,18 +267,18 @@ </td> </tr> [% END %] - + <tr> <td></td> <td colspan="3"> [% IF group.size %] <br> <strong> - Only users in all of the selected groups can view this bug: + Only users in all of the selected groups can view this [% terms.bug %]: </strong> <br> <font size="-1"> - (Leave all boxes unchecked to make this a public bug.) + (Leave all boxes unchecked to make this a public [% terms.bug %].) </font> <br> <br> @@ -251,16 +295,16 @@ [% END %] </td> </tr> - + <tr> <td></td> <td colspan="3"> - <input type="submit" value=" Commit " - onclick="if (this.form.short_desc.value == '') - { alert('Please enter a summary sentence for this bug.'); + <input type="submit" value=" Commit " + onclick="if (this.form.short_desc.value == '') + { alert('Please enter a summary sentence for this [% terms.bug %].'); return false; } return true;"> - <input type="submit" name="maketemplate" + <input type="submit" name="maketemplate" value="Remember values as bookmarkable template"> </td> </tr> @@ -270,8 +314,8 @@ <td></td> <td colspan="3"> <br> - We've made a guess at your operating system and platform. - Please check them and, if we got it wrong, email + We've made a guess at your operating system and platform. + Please check them and, if we got it wrong, email [% Param('maintainer') %]. </td> </tr> @@ -295,7 +339,7 @@ </strong> </td> [% END %] - + <td> <select name="[% sel.name %]"> [%- FOREACH x = ${sel.name} %] diff --git a/template/en/default/bug/create/created.html.tmpl b/template/en/default/bug/create/created.html.tmpl index 57f14cb17e3737362a84569f39584be7b939a694..06ecefadb90b20d0055ca352bc1cb567f78006f8 100644 --- a/template/en/default/bug/create/created.html.tmpl +++ b/template/en/default/bug/create/created.html.tmpl @@ -19,8 +19,10 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% PROCESS global/header.html.tmpl - title = "Bug $id Submitted" +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "$terms.Bug $id Submitted" %] [% header_done = 1 %] diff --git a/template/en/default/bug/create/make-template.html.tmpl b/template/en/default/bug/create/make-template.html.tmpl index 958d183cc9840b14e4aa11b1b31c86d6a3b77c02..6413bb307580d6994a6042b3edd79870e33232ce 100644 --- a/template/en/default/bug/create/make-template.html.tmpl +++ b/template/en/default/bug/create/make-template.html.tmpl @@ -19,14 +19,16 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Bookmarks are your friend" h1 = "Template constructed" %] <p> If you bookmark <a href="enter_bug.cgi?[% url FILTER html %]">this link</a>, -going to the bookmark will bring up the enter bug page with the fields +going to the bookmark will bring up the enter [% terms.bug %] page with the fields initialized as you've requested. </p> diff --git a/template/en/default/bug/create/user-message.html.tmpl b/template/en/default/bug/create/user-message.html.tmpl index d17ea6df0fb39641b8e429b3c3ad826ea47057ae..498925c41b1df55e3e16a343d731eeabc0af372c 100644 --- a/template/en/default/bug/create/user-message.html.tmpl +++ b/template/en/default/bug/create/user-message.html.tmpl @@ -28,7 +28,9 @@ # the 'product' variable. #%] -Before reporting a bug, please read the <a href="bugwritinghelp.html"> -bug writing guidelines</a>, please look at the list of -<a href="duplicates.cgi">most frequently reported bugs</a>, and please -<a href="query.cgi">search</a> for the bug. +[% PROCESS global/variables.none.tmpl %] + +Before reporting [% terms.abug %], please read the <a href="bugwritinghelp.html"> +[% terms.bug %] writing guidelines</a>, please look at the list of +<a href="duplicates.cgi">most frequently reported [% terms.bugs %]</a>, and please +<a href="query.cgi">search</a> for the [% terms.bug %]. diff --git a/template/en/default/bug/dependency-graph.html.tmpl b/template/en/default/bug/dependency-graph.html.tmpl index 2d505a3716b70ad5355e1e806dc886713b85d10f..a0b3fd80c481c4c7131d3159d68e910b7c4bf303 100644 --- a/template/en/default/bug/dependency-graph.html.tmpl +++ b/template/en/default/bug/dependency-graph.html.tmpl @@ -24,21 +24,23 @@ # multiple_bugs: boolean. True if bug_id contains > 1 bug number. # doall: boolean. True if we are displaying every bug in the database. # showsummary: boolean. True if we are showing bug summaries. - # rankdir: string. "TB" if we are ranking top-to-bottom, + # rankdir: string. "TB" if we are ranking top-to-bottom, "LR" if left-to-right. # image_url: string. The URL of the graphic showing the dependencies. # map_url: string. The URL of the map file for the image. (Optional) - # image_map: string. The image map for the graphic showing the + # image_map: string. The image map for the graphic showing the dependencies. (Optional) #%] +[% PROCESS global/variables.none.tmpl %] + [% title = "Dependency Graph" h1 = title %] - + [% IF NOT multiple_bugs AND NOT doall %] - [% title = "$title for bug $bug_id" - h1 = "$h1 for bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" + [% title = "$title for $terms.bug $bug_id" + h1 = "$h1 for $terms.bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" %] [% END %] @@ -47,14 +49,14 @@ [% image_map %] <p> - Green circles represent open bugs. + Green circles represent open [% terms.bugs %]. </p> [% IF image_map %] - <img src="[% image_url %]" alt="Dependency graph" usemap="#imagemap"> + <img src="[% image_url %]" alt="Dependency graph" usemap="#imagemap"> [% ELSE %] <a href="[% map_url %]"> - <img src="[% image_url %]" alt="Dependency graph" ismap="ismap"> + <img src="[% image_url %]" alt="Dependency graph" ismap="ismap"> </a> [% END %] @@ -64,27 +66,27 @@ <table> <tr> <td> - Bug numbers: + [% terms.Bug %] numbers: <input name="id" value="[% bug_id %]"> </td> </tr> - + <tr> <td> - <input type="checkbox" name="doall" + <input type="checkbox" name="doall" [% " checked" IF doall %]> - Show <b>every</b> bug in the system with dependencies + Show <b>every</b> [% terms.bug %] in the system with dependencies </td> </tr> - + <tr> <td colspan="3"> - <input type="checkbox" name="showsummary" + <input type="checkbox" name="showsummary" [% " checked" IF showsummary %]> - Show the summaries of all displayed bugs + Show the summaries of all displayed [% terms.bugs %] </td> </tr> - + <tr> <td colspan="3"> <select name="rankdir"> diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl index 64c452c8bb28db63fcb61aad87c87b2820685bad..16f68b394f8f4b08f46a2d4595840e73d7a6d208 100644 --- a/template/en/default/bug/dependency-tree.html.tmpl +++ b/template/en/default/bug/dependency-tree.html.tmpl @@ -3,7 +3,7 @@ # License Version 1.1 (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.mozilla.org/MPL/ - # + # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing @@ -21,20 +21,29 @@ # Myk Melez <myk@mozilla.org> #%] -[% PROCESS global/header.html.tmpl - title = "Dependency tree for Bug $bugid" - h1 = "Dependency tree for <a href=\"show_bug.cgi?id=$bugid\">bug $bugid</a>" +[% INCLUDE global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Dependency tree for $terms.Bug $bugid" + h1 = "Dependency tree for <a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>" style = "strike { background-color: #d9d9d9; color: #000000; }" %] [% PROCESS depthControlToolbar %] [%# Display the tree of bugs that this bug depends on. %] -<h3>[% hide_resolved ? "Open b" : "B" %]ugs that <a href="show_bug.cgi?id=[% bugid %]">bug [% bugid %]</a> depends on</h3> +<h3> + [% IF hide_resolved %] + Open [% terms.bugs %] + [% ELSE %] + [% terms.Bugs %] + [% END %] + that <a href="show_bug.cgi?id=[% bugid %]">[% terms.bug %] [% bugid %]</a> + depends on</h3> [% IF dependson_ids.size > 0 %] ( [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END %] - <a href="buglist.cgi?bug_id=[% dependson_ids.join(",") %]">view as bug list</a> + <a href="buglist.cgi?bug_id=[% dependson_ids.join(",") %]">view as [% terms.bug %] list</a> [% IF canedit && dependson_ids.size > 1 %] | <a href="buglist.cgi?bug_id=[% dependson_ids.join(",") %]&tweak=1">change several</a> [% END %]) @@ -45,11 +54,18 @@ [% END %] [%# Display the tree of bugs that this bug blocks. %] -<h3>[% hide_resolved ? "Open b" : "B" %]ugs that <a href="show_bug.cgi?id=[% bugid %]">bug [% bugid %]</a> blocks</h3> +<h3> + [% IF hide_resolved %] + Open [% terms.bugs %] + [% ELSE %] + [% terms.Bugs %] + [% END %] + that <a href="show_bug.cgi?id=[% bugid %]">[% terms.bug %] [% bugid %]</a> + blocks</h3> [% IF blocked_ids.size > 0 %] ( [% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END %] - <a href="buglist.cgi?bug_id=[% blocked_ids.join(",") %]">view as bug list</a> + <a href="buglist.cgi?bug_id=[% blocked_ids.join(",") %]">view as [% terms.bug %] list</a> [% IF canedit && blocked_ids.size > 1 %] | <a href="buglist.cgi?bug_id=[% blocked_ids.join(",") %]&tweak=1">change several</a> [% END %]) @@ -75,16 +91,16 @@ [% dep = tree.$dep_id %] <li> [% "<strike>" IF !dep.open %] - <a href="show_bug.cgi?id=[% dep_id %]">[% dep_id %] + <a href="show_bug.cgi?id=[% dep_id %]">[% dep_id %] [[% IF dep.milestone %][% dep.milestone FILTER html %], [% END %] - [% dep.assignee_email FILTER html %]] - + [% dep.assignee_email FILTER html %]] - [% IF dep.seen %] - <i>This bug appears elsewhere in this tree.</i></a> + <i>This [% terms.bug %] appears elsewhere in this tree.</i></a> [% ELSE %] [% dep.summary FILTER html %].</a> [% END %] [% "</strike>" IF !dep.open %] - [% INCLUDE display_tree bug_id=dep_id + [% INCLUDE display_tree bug_id=dep_id IF dep.dependencies.size > 0 && !dep.seen %] </li> [% END %] @@ -101,14 +117,15 @@ [%# Hide/show resolved button Swaps text depending on the state of hide_resolved %] <td align="center"> - <form method="get" action="showdependencytree.cgi" + <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> <input name="id" type="hidden" value="[% bugid %]"> [% IF maxdepth %] <input name="maxdepth" type="hidden" value="[% maxdepth %]"> [% END %] <input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]"> - <input type="submit" value="[% hide_resolved ? "Show" : "Hide" %] Resolved"> + <input type="submit" + value="[% IF hide_resolved %]Show[% ELSE %]Hide[% END %] Resolved"> </form> </td> @@ -124,9 +141,8 @@ <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> [%# set to one form %] - <input type="submit" value=" 1 " [% - realdepth < 2 || maxdepth == 1 ? "disabled" : "" - %]> + <input type="submit" value=" 1 " + [% "disabled" IF realdepth < 2 || maxdepth == 1 %]> <input name="id" type="hidden" value="[% bugid %]"> <input name="maxdepth" type="hidden" value="1"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> @@ -134,63 +150,61 @@ </td> <td> - <form method="get" action="showdependencytree.cgi" + <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> - [%# Minus one form + [%# Minus one form Allow subtracting only when realdepth and maxdepth > 1 %] <input name="id" type="hidden" value="[% bugid %]"> - <input name="maxdepth" type="hidden" value="[% - maxdepth == 1 ? 1 + <input name="maxdepth" type="hidden" value="[% + maxdepth == 1 ? 1 : ( maxdepth ? maxdepth - 1 : realdepth - 1 ) %]"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> - <input type="submit" value=" < " [% - realdepth < 2 || ( maxdepth && maxdepth < 2 ) ? "disabled" : "" - %]> + <input type="submit" value=" < " + [% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]> </form> </td> <td> - <form method="get" action="showdependencytree.cgi" + <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> [%# Limit entry form: the button can not do anything when total depth is less than two, so disable it %] - <input name="maxdepth" size="4" maxlength="4" value="[% + <input name="maxdepth" size="4" maxlength="4" value="[% maxdepth > 0 && maxdepth <= realdepth ? maxdepth : "" %]"> <input name="id" type="hidden" value="[% bugid %]"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> <noscript> - <input type="submit" value="Change" [% realdepth < 2 ? "disabled" : "" %]> + <input type="submit" value="Change" [% "disabled" IF realdepth < 2 %]> </noscript> </form> </td> <td> - <form method="get" action="showdependencytree.cgi" + <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> - [%# plus one form + [%# plus one form Disable button if total depth < 2, or if depth set to unlimited %] <input name="id" type="hidden" value="[% bugid %]"> [% IF maxdepth %] <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]"> [% END %] <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> - <input type="submit" value=" > " [% - realdepth < 2 || ! maxdepth || maxdepth >= realdepth ? - "disabled" : "" - %]> + <input type="submit" value=" > " + [% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %] + %]> </form> </td> <td> - <form method="get" action="showdependencytree.cgi" + <form method="get" action="showdependencytree.cgi" style="display: inline; margin: 0px;"> [%# Unlimited button %] <input name="id" type="hidden" value="[% bugid %]"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> - <input type="submit" value=" Unlimited " - [% maxdepth == 0 || maxdepth == realdepth ? "disabled" : "" %]> + <input type="submit" value=" Unlimited " + [% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]> </form> </td> </tr> diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index 6d512e1fd820efff0c7f6cfc2bb33f0a7874cd7c..7c5273be51352484c21def205d385220c88a8b90 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -17,14 +17,75 @@ # Rights Reserved. # # Contributor(s): Gervase Markham <gerv@gerv.net> - # Vaskin Kissoyan <vkissoyan@yahoo.com> + # Vaskin Kissoyan <vkissoyan@yahoo.com> #%] +[% PROCESS global/variables.none.tmpl %] + [% PROCESS bug/time.html.tmpl %] -[% IF UserInGroup(Param('timetrackinggroup')) %] <script type="text/javascript" language="JavaScript"> <!-- + + /* Outputs a link to call replyToComment(); used to reduce HTML output */ + function addReplyLink(id) { + /* XXX this should really be updated to use the DOM Core's + * createElement, but finding a container isn't trivial */ + document.write('[<a href="#add_comment" onclick="replyToComment(' + + id + ');">reply<' + '/a>]'); + } + + /* Adds the reply text to the `comment' textarea */ + function replyToComment(id) { + /* pre id="comment_name_N" */ + var text_elem = document.getElementById('comment_text_'+id); + var text = getText(text_elem); + + /* make sure we split on all newlines -- IE or Moz use \r and \n + * respectively */ + text = text.split(/\r|\n/); + + var replytext = ""; + for (var i=0; i < text.length; i++) { + replytext += "> " + text[i] + "\n"; + } + + replytext = "(In reply to comment #" + id + ")\n" + replytext + "\n"; + + /* <textarea id="comment"> */ + var textarea = document.getElementById('comment'); + textarea.value += replytext; + + textarea.focus(); + } + + if (!Node) { + /* MSIE doesn't define Node, so provide a compatibility array */ + var Node = { + TEXT_NODE: 3, + ENTITY_REFERENCE_NODE: 5 + }; + } + + /* Concatenates all text from element's childNodes. This is used + * instead of innerHTML because we want the actual text (and + * innerText is non-standard) */ + function getText(element) { + var child, text = ""; + for (var i=0; i < element.childNodes.length; i++) { + child = element.childNodes[i]; + var type = child.nodeType; + if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) { + text += child.nodeValue; + } else { + /* recurse into nodes of other types */ + text += getText(child); + } + } + return text; + } + +[% IF UserInGroup(Param('timetrackinggroup')) %] var fRemainingTime = [% bug.remaining_time %]; // holds the original value function adjustRemainingTime() { // subtracts time spent from remaining time @@ -33,7 +94,7 @@ new_time = fRemainingTime - document.changeform.work_time.value; // get upto 2 decimal places - document.changeform.remaining_time.value = + document.changeform.remaining_time.value = Math.round(new_time * 100)/100; } @@ -42,9 +103,10 @@ fRemainingTime = document.changeform.remaining_time.value; } +[% END %] + //--> </script> -[% END %] <form name="changeform" method="post" action="process_bug.cgi"> @@ -55,42 +117,43 @@ [%# *** Hardware Reporter Product OS AddCC *** %] <table cellspacing="1" cellpadding="1" border="0"> - <tr> + <tr> <td align="right"> - <b>Bug#:</b> + <b>[% terms.Bug %]#:</b> </td> <td> <a href="[% Param('urlbase') %]show_bug.cgi?id=[% bug.bug_id %]"> [% bug.bug_id %]</a> [% IF Param("usebugaliases") %] - <label title="a name for the bug that can be used in place of its ID number, f.e. when adding it to a list of dependencies"> + <label title="a name for the [% terms.bug %] that can be used in place of its ID number, f.e. when adding it to a list of dependencies"> <b>alias:</b> <input name="alias" value="[% bug.alias FILTER html %]" size="20" maxlength="20"> </label> [% END %] </td> - + <td> </td> <td align="right"> <b><u>H</u>ardware:</b> </td> [% PROCESS select selname => "rep_platform" accesskey => "h" %] - + <td align="right"> <b>Reporter:</b> </td> <td> - [% bug.reporter.identity FILTER html %] - </td> + <a href="mailto:[% bug.reporter.email FILTER html %]"> + [% bug.reporter.identity FILTER html %]</a> + </td> </tr> - + <tr> <td align="right"> <b><u>P</u>roduct:</b> </td> [% PROCESS select selname => "product" accesskey => "p" %] - + <td align="right"> <b><u>O</u>S:</b> </td> @@ -104,7 +167,7 @@ </td> </tr> -[%# *** Component Version CC Priority Severity AssignedTo Milestone *** %] +[%# *** Component Version CC Priority Severity AssignedTo Milestone *** %] <tr> <td align="right"> @@ -114,16 +177,16 @@ </b> </td> [% PROCESS select selname => "component" accesskey => "m" %] - + <td align="right"> <b><u>V</u>ersion:</b> </td> [% PROCESS select selname => "version" accesskey => "v" %] - + <td rowspan="4" align="right" valign="top"> <b>CC:</b> </td> - <td rowspan="4" valign="top"> + <td rowspan="4" valign="top"> [% IF bug.cc %] <select name="cc" multiple="multiple" size="5"> [% FOREACH c = bug.cc %] @@ -138,22 +201,22 @@ [% END %] </td> </tr> - + <tr> <td align="right"> <b> <a href="bug_status.html">Status</a>: </b> </td> - <td>[% bug.bug_status FILTER html %]</td> + <td>[% bug.bug_status FILTER html %]</td> <td> </td> - + <td align="right"> <b><a href="bug_status.html#priority">Pr<u>i</u>ority</a>:</b> </td> [% PROCESS select selname => "priority" accesskey => "i" %] </tr> - + <tr> <td align="right"> <b> @@ -163,18 +226,18 @@ <td> [% bug.resolution FILTER html %] [% IF bug.resolution == "DUPLICATE" %] - of [% "bug ${bug.dup_id}" FILTER bug_link(bug.dup_id) %] + of [% terms.bug %] [% "${bug.dup_id}" FILTER bug_link(bug.dup_id) %] [% END %] - </td> + </td> <td> </td> - + <td align="right"> <b><a href="bug_status.html#severity">S<u>e</u>verity</a>:</b> </td> [% PROCESS select selname = "bug_severity" accesskey => "e" %] - + </tr> - + <tr> <td align="right"> <b> @@ -183,7 +246,7 @@ </td> <td>[% bug.assigned_to.identity FILTER html %]</td> <td> </td> - + [% IF Param("usetargetmilestone") && bug.target_milestone %] <td align="right"> <b> @@ -228,7 +291,7 @@ <input name="bug_file_loc" accesskey="u" value="[% bug.bug_file_loc FILTER html %]" size="60"> </td> - <td rowspan="4" colspan="2" valign="top"> + <td rowspan="4" colspan="2" valign="top"> [% IF bug.flag_types.size > 0 %] [% PROCESS "flag/list.html.tmpl" flag_types = bug.flag_types @@ -236,7 +299,7 @@ [% END %] </td> </tr> - + <tr> <td align="right"> <b><u>S</u>ummary:</b> @@ -247,7 +310,7 @@ </td> </tr> - [% IF Param('usestatuswhiteboard') %] + [% IF Param('usestatuswhiteboard') %] <tr> <td align="right"> <b>Status <u>W</u>hiteboard:</b> @@ -269,7 +332,7 @@ <input name="keywords" accesskey="k" value="[% bug.keywords.join(', ') FILTER html %]" size="60"> </td> - </tr> + </tr> [% END %] </table> @@ -299,16 +362,16 @@ <tr> <td align="center"> <input name="estimated_time" - value="[% PROCESS formattimeunit + value="[% PROCESS formattimeunit time_unit=bug.estimated_time %]" size="6" maxlength="6"> </td> <td align="center"> - [% PROCESS formattimeunit + [% PROCESS formattimeunit time_unit=(bug.actual_time + bug.remaining_time) %] </td> <td align="center"> - [% PROCESS formattimeunit time_unit=bug.actual_time %] + + [% PROCESS formattimeunit time_unit=bug.actual_time %] + <input name="work_time" value="0" size="3" maxlength="6" onchange="adjustRemainingTime();"> </td> @@ -328,11 +391,11 @@ </tr> </table> [% END %] - + [%# *** Attachments *** %] - [% PROCESS attachment/list.html.tmpl - attachments = bug.attachments + [% PROCESS attachment/list.html.tmpl + attachments = bug.attachments bugid = bug.bug_id num_attachment_flag_types = bug.num_attachment_flag_types show_attachment_flags = bug.show_attachment_flags @@ -345,12 +408,12 @@ [% PROCESS dependencies accesskey = "d" dep = { title => "<u>d</u>epends on", fieldname => "dependson" } %] <td rowspan="2"> - <a href="showdependencytree.cgi?id=[% bug.bug_id %]">Show - dependency tree</a> + <a href="showdependencytree.cgi?id=[% bug.bug_id %]">Show + dependency tree</a> - [% IF Param('webdotbase') %] + [% IF Param('webdotbase') %] <br> - <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">Show + <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">Show dependency graph</a> [% END %] </td> @@ -370,10 +433,10 @@ </th> <td> [% bug.votes %] - <a href="votes.cgi?action=show_bug&bug_id=[% bug.bug_id %]">Show - votes for this bug</a> - <a href="votes.cgi?action=show_user&bug_id=[% bug.bug_id %]">Vote - for this bug</a> + <a href="votes.cgi?action=show_bug&bug_id=[% bug.bug_id %]">Show + votes for this [% terms.bug %]</a> + <a href="votes.cgi?action=show_user&bug_id=[% bug.bug_id %]">Vote + for this [% terms.bug %]</a> </td> </tr> </table> @@ -387,7 +450,8 @@ <input type="checkbox" name="commentprivacy" value="1"> Private [% END %] <br> - <textarea wrap="hard" name="comment" rows="10" cols="80" + <a name="add_comment"></a> + <textarea wrap="hard" name="comment" id="comment" rows="10" cols="80" accesskey="c"></textarea> <br> @@ -402,17 +466,17 @@ [% IF NOT emitted_description %] [% emitted_description = 1 %] <br> - <b>Only users in all of the selected groups can view this bug:</b> + <b>Only users in all of the selected groups can view this [% terms.bug %]:</b> <br> <font size="-1"> - (Unchecking all boxes makes this a more public bug.) + (Unchecking all boxes makes this a more public [% terms.bug %].) </font> <br> <br> [% END %] - <input type="checkbox" name="bit-[% group.bit %]" value="1" + <input type="checkbox" name="bit-[% group.bit %]" value="1" [% " checked=\"checked\"" IF group.ison %] [% " disabled=\"disabled\"" IF NOT group.ingroup %]> [% group.description %] @@ -422,7 +486,7 @@ [% IF NOT inallgroups %] <b> - Only members of a group can change the visibility of a bug for + Only members of a group can change the visibility of [% terms.abug %] for that group </b> <br> @@ -430,15 +494,15 @@ [% IF inagroup %] <p> - <b>Users in the roles selected below can always view this bug:</b> + <b>Users in the roles selected below can always view this [% terms.bug %]:</b> <br> <small> - (The assignee + (The assignee [% IF (Param('useqacontact')) %] and QA contact [% END %] - can always see a bug, and this section does not take effect unless - the bug is restricted to at least one group.) + can always see [% terms.abug %], and this section does not take effect unless + the [% terms.bug %] is restricted to at least one group.) </small> </p> @@ -447,151 +511,34 @@ [% " checked" IF bug.reporter_accessible %]>Reporter <input type="checkbox" name="cclist_accessible" value="1" [% " checked" IF bug.cclist_accessible %]>CC List - </p> + </p> [% END %] [% END %] -[%# *** Knob *** %] - - <br> - <input type="radio" name="knob" value="none" checked="checked"> - Leave as <b>[% bug.bug_status FILTER html %] - [% bug.resolution FILTER html %]</b> - <br> - - [% knum = 1 %] - - [% IF bug.bug_status == "UNCONFIRMED" && - bug.user.canconfirm %] - <input type="radio" name="knob" value="confirm"> - Confirm bug (change status to <b>NEW</b>) - <br> - [% knum = knum + 1 %] - [% END %] - - [% IF bug.user.canedit %] - [% IF bug.isopened %] - [% IF bug.bug_status != "ASSIGNED" && bug.user.canconfirm %] - <input type="radio" name="knob" value="accept"> - Accept bug ( - [% "confirm bug, " IF bug.isunconfirmed %]change - status to <b>ASSIGNED</b>) - <br> - [% knum = knum + 1 %] - [% END %] - - [% IF bug.resolution %] - <input type="radio" name="knob" value="clearresolution"> - Clear the resolution (remove the current resolution of - <b>[% bug.resolution FILTER html %]</b>)<br> - [% knum = knum + 1 %] - [% END %] - - <input type="radio" name="knob" value="resolve"> - Resolve bug, changing <a href="bug_status.html">resolution</a> to - <select name="resolution" - onchange="document.changeform.knob[[% knum %]].checked=true"> - [% FOREACH r = bug.choices.resolution %] - <option value="[% r FILTER html %]">[% r FILTER html %]</option> - [% END %] - </select> - <br> - [% knum = knum + 1 %] - - <input type="radio" name="knob" value="duplicate"> - Resolve bug, mark it as duplicate of bug # - <input name="dup_id" size="6" - onchange="if (this.value != '') - {document.changeform.knob[[% knum %]].checked=true}"> - <br> - [% knum = knum + 1 %] - - <input type="radio" name="knob" value="reassign"> - <a href="bug_status.html#assigned_to">Reassign</a> bug to - <input name="assigned_to" size="32" - onchange="if ((this.value != '[% bug.assigned_to.email FILTER js %]') && - (this.value != '')) { - document.changeform.knob[[% knum %]].checked=true; - }" - value="[% bug.assigned_to.email FILTER html %]"> - <br> - [% IF bug.isunconfirmed && bug.user.canconfirm %] - <input type="checkbox" name="andconfirm"> - and confirm bug (change status to <b>NEW</b>) - <br> - [% END %] - [% knum = knum + 1 %] - - <input type="radio" name="knob" value="reassignbycomponent"> - Reassign bug to owner - [% " and QA contact" IF Param('useqacontact') %] - of selected component - <br> - [% IF bug.isunconfirmed && bug.user.canconfirm %] - <input type="checkbox" name="compconfirm"> - and confirm bug (change status to <b>NEW</b>) - <br> - [% END %] - [% knum = knum + 1 %] - [% ELSE %] - [% IF bug.resolution != "MOVED" || - (bug.resolution == "MOVED" && bug.user.canmove) %] - <input type="radio" name="knob" value="reopen"> Reopen bug - <br> - [% knum = knum + 1 %] - [% END %] - [% IF bug.bug_status == "RESOLVED" %] - <input type="radio" name="knob" value="verify"> - Mark bug as <b>VERIFIED</b><br> - [% knum = knum + 1 %] - [% END %] - [% IF bug.bug_status != "CLOSED" %] - <input type="radio" name="knob" value="close"> - Mark bug as <b>CLOSED</b><br> - [% knum = knum + 1 %] - [% END %] - [% END %] - [% END %] - - <input type="submit" value="Commit"> - <input type="hidden" name="form_name" value="process_bug"> - <p> - <font size="+1"> - <b> - <a href="show_activity.cgi?id=[% bug.bug_id %]">View Bug Activity</a> - | - <a href="long_list.cgi?buglist=[% bug.bug_id %]">Format For Printing</a> - </b> - </font> - - [% IF bug.user.canmove %] - <font size="+1"><b> | </b></font> - <input type="submit" name="action" - value="[% Param("move-button-text") %]"> - [% END %] - </p> +[% PROCESS bug/knob.html.tmpl %] [%# *** Additional Comments *** %] +<hr> <table> <tr> <td align="left"> - <b> - <a name="c0" href="#c0">Description</a>: - </b> + <b><a name="c0" href="#c0">Description</a>:</b> <script + type="text/javascript" language="JavaScript"><!-- + addReplyLink(0); + //--></script> </td> <td align="right" width="100%"> Opened: [% bug.creation_ts FILTER time %] </td> </tr> </table> -<hr> -[% PROCESS bug/comments.html.tmpl - comments = bug.longdescs +[% PROCESS bug/comments.html.tmpl + comments = bug.longdescs mode = "edit" %] - + </form> [%############################################################################%] @@ -599,7 +546,7 @@ [%############################################################################%] [% BLOCK dependencies %] - <th align="right">Bug [% bug.bug_id %] [%+ dep.title %]:</th> + <th align="right">[% terms.Bug %] [% bug.bug_id %] [%+ dep.title %]:</th> <td> [% FOREACH depbug = bug.${dep.fieldname} %] [% depbug FILTER bug_link(depbug) %][% " " %] @@ -616,7 +563,7 @@ [%# Block for SELECT fields #%] [%############################################################################%] -[% BLOCK select %] +[% BLOCK select %] <td> <label for="[% selname %]" accesskey="[% accesskey %]"> <select name="[% selname %]" id="[% selname %]"> diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..dfcd4437bde6e27b9cd2d8af2dd78013fce3ebb5 --- /dev/null +++ b/template/en/default/bug/knob.html.tmpl @@ -0,0 +1,144 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + # Vaskin Kissoyan <vkissoyan@yahoo.com> + #%] + +[% PROCESS global/variables.none.tmpl %] + +[%# *** Knob *** %] + + <br> + <input type="radio" name="knob" value="none" checked="checked"> + Leave as <b>[% bug.bug_status FILTER html %] + [% bug.resolution FILTER html %]</b> + <br> + + [% knum = 1 %] + + [% IF bug.bug_status == "UNCONFIRMED" && + bug.user.canconfirm %] + <input type="radio" name="knob" value="confirm"> + Confirm [% terms.bug %] (change status to <b>NEW</b>) + <br> + [% knum = knum + 1 %] + [% END %] + + [% IF bug.user.canedit %] + [% IF bug.isopened %] + [% IF bug.bug_status != "ASSIGNED" && bug.user.canconfirm %] + <input type="radio" name="knob" value="accept"> + Accept [% terms.bug %] ( + [% IF bug.isunconfirmed %]confirm [% terms.bug %], [% END %]change + status to <b>ASSIGNED</b>) + <br> + [% knum = knum + 1 %] + [% END %] + + [% IF bug.resolution %] + <input type="radio" name="knob" value="clearresolution"> + Clear the resolution (remove the current resolution of + <b>[% bug.resolution FILTER html %]</b>)<br> + [% knum = knum + 1 %] + [% END %] + + <input type="radio" name="knob" value="resolve"> + Resolve [% terms.bug %], changing <a href="bug_status.html">resolution</a> to + <select name="resolution" + onchange="document.changeform.knob[[% knum %]].checked=true"> + [% FOREACH r = bug.choices.resolution %] + <option value="[% r FILTER html %]">[% r FILTER html %]</option> + [% END %] + </select> + <br> + [% knum = knum + 1 %] + + <input type="radio" name="knob" value="duplicate"> + Resolve [% terms.bug %], mark it as duplicate of [% terms.bug %] # + <input name="dup_id" size="6" + onchange="if (this.value != '') + {document.changeform.knob[[% knum %]].checked=true}"> + <br> + [% knum = knum + 1 %] + + <input type="radio" name="knob" value="reassign"> + <a href="bug_status.html#assigned_to">Reassign</a> [% terms.bug %] to + <input name="assigned_to" size="32" + onchange="if ((this.value != '[% bug.assigned_to.email FILTER js %]') && + (this.value != '')) { + document.changeform.knob[[% knum %]].checked=true; + }" + value="[% bug.assigned_to.email FILTER html %]"> + <br> + [% IF bug.isunconfirmed && bug.user.canconfirm %] + <input type="checkbox" name="andconfirm"> + and confirm [% terms.bug %] (change status to <b>NEW</b>) + <br> + [% END %] + [% knum = knum + 1 %] + + <input type="radio" name="knob" value="reassignbycomponent"> + Reassign [% terms.bug %] to owner + [% " and QA contact" IF Param('useqacontact') %] + of selected component + <br> + [% IF bug.isunconfirmed && bug.user.canconfirm %] + <input type="checkbox" name="compconfirm"> + and confirm [% terms.bug %] (change status to <b>NEW</b>) + <br> + [% END %] + [% knum = knum + 1 %] + [% ELSE %] + [% IF bug.resolution != "MOVED" || + (bug.resolution == "MOVED" && bug.user.canmove) %] + <input type="radio" name="knob" value="reopen"> Reopen [% terms.bug %] + <br> + [% knum = knum + 1 %] + [% END %] + [% IF bug.bug_status == "RESOLVED" %] + <input type="radio" name="knob" value="verify"> + Mark [% terms.bug %] as <b>VERIFIED</b><br> + [% knum = knum + 1 %] + [% END %] + [% IF bug.bug_status != "CLOSED" %] + <input type="radio" name="knob" value="close"> + Mark [% terms.bug %] as <b>CLOSED</b><br> + [% knum = knum + 1 %] + [% END %] + [% END %] + [% END %] + + <input type="submit" value="Commit"> + <input type="hidden" name="form_name" value="process_bug"> + <p> + <font size="+1"> + <b> + <a href="show_activity.cgi?id=[% bug.bug_id %]">View [% terms.Bug %] Activity</a> + | + <a href="long_list.cgi?buglist=[% bug.bug_id %]">Format For Printing</a> + </b> + </font> + + [% IF bug.user.canmove %] + <font size="+1"><b> | </b></font> + <input type="submit" name="action" + value="[% Param("move-button-text") %]"> + [% END %] + </p> + diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl index c8636e098e7d6cc8bfde43b5742171af12ac4060..a19779e4f91a95053ea929c7a61fede4d9b667f1 100644 --- a/template/en/default/bug/navigate.html.tmpl +++ b/template/en/default/bug/navigate.html.tmpl @@ -18,18 +18,20 @@ # # Contributor(s): Gervase Markham <gerv@gerv.net> #%] - + +[% PROCESS global/variables.none.tmpl %] + [% IF bug_list && bug_list.size > 0 %] [% this_bug_idx = lsearch(bug_list, bug.bug_id) %] - <b>Bug List:</b> + <b>[% terms.Bug %] List:</b> [% IF this_bug_idx != -1 %] ([% this_bug_idx + 1 %] of [% bug_list.size %]) [% END %] - + <a href="show_bug.cgi?id=[% bug_list.first %]">First</a> <a href="show_bug.cgi?id=[% bug_list.last %]">Last</a> - [% IF bug.bug_id %] + [% IF bug.bug_id %] [% IF this_bug_idx != -1 %] [% IF this_bug_idx > 0 %] [% prev_bug = this_bug_idx - 1 %] @@ -37,7 +39,7 @@ [% ELSE %] <i><font color="#777777">Prev</font></i> [% END %] - + [% IF this_bug_idx + 1 < bug_list.size %] [% next_bug = this_bug_idx + 1 %] <a href="show_bug.cgi?id=[% bug_list.$next_bug %]">Next</a> @@ -45,14 +47,14 @@ <i><font color="#777777">Next</font></i> [% END %] [% ELSE %] - (This bug is not in your list) + (This [% terms.bug %] is not in your list) [% END %] [% ELSE %] [% END %] - + <a href="buglist.cgi?regetlastlist=1">Show list</a> [% END %] <a href="query.cgi">Query page</a> - <a href="enter_bug.cgi">Enter new bug</a> + <a href="enter_bug.cgi">Enter new [% terms.bug %]</a> diff --git a/template/en/default/bug/process/CVS/Entries b/template/en/default/bug/process/CVS/Entries index 37ae85e9db88dd8cad0e543367a5c0d8dab4ccd8..3f2c01f8e6aac5376cd94c0bca33aeb6923794c2 100644 --- a/template/en/default/bug/process/CVS/Entries +++ b/template/en/default/bug/process/CVS/Entries @@ -1,8 +1,8 @@ -/bugmail.html.tmpl/1.1/Sun Feb 9 22:04:23 2003//TBUGZILLA-2_17_4 -/confirm-duplicate.html.tmpl/1.5/Sat Mar 22 04:47:33 2003//TBUGZILLA-2_17_4 -/header.html.tmpl/1.1/Thu Oct 10 19:02:28 2002//TBUGZILLA-2_17_4 -/midair.html.tmpl/1.7/Sat Mar 22 04:47:33 2003//TBUGZILLA-2_17_4 -/next.html.tmpl/1.2/Thu Nov 28 10:49:54 2002//TBUGZILLA-2_17_4 -/results.html.tmpl/1.5/Sat Feb 15 08:03:51 2003//TBUGZILLA-2_17_4 -/verify-new-product.html.tmpl/1.9/Sun Nov 24 19:56:32 2002//TBUGZILLA-2_17_4 +/bugmail.html.tmpl/1.3/Sat Sep 6 19:23:28 2003//TBUGZILLA-2_17_5 +/confirm-duplicate.html.tmpl/1.6/Thu Jul 3 21:31:43 2003//TBUGZILLA-2_17_5 +/header.html.tmpl/1.2/Thu Jul 3 21:31:44 2003//TBUGZILLA-2_17_5 +/midair.html.tmpl/1.8/Thu Jul 3 21:31:44 2003//TBUGZILLA-2_17_5 +/next.html.tmpl/1.3/Thu Jul 3 21:31:44 2003//TBUGZILLA-2_17_5 +/results.html.tmpl/1.6/Thu Jul 3 21:31:44 2003//TBUGZILLA-2_17_5 +/verify-new-product.html.tmpl/1.11/Sat Sep 6 19:23:27 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/bug/process/CVS/Tag b/template/en/default/bug/process/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/bug/process/CVS/Tag +++ b/template/en/default/bug/process/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/bug/process/bugmail.html.tmpl b/template/en/default/bug/process/bugmail.html.tmpl index 5445ef9cdac0981345eb308f60032f0158f9418e..1e9c13abe40077bf82376027ef106ee69aac476b 100644 --- a/template/en/default/bug/process/bugmail.html.tmpl +++ b/template/en/default/bug/process/bugmail.html.tmpl @@ -22,20 +22,22 @@ [%# INTERFACE: # mailing_bugid: string. ID of the bug this mail is concerning. - # mailrecipients: hash. People involved in this change. Hash has up to five + # mailrecipients: hash. People involved in this change. Hash has up to five # elements: - # changer: string. The login name of the user who made the + # changer: string. The login name of the user who made the # change. # # For bug changes where people need to be notified: # owner: string. The login name of the bug assignee. # reporter: string. The login name of the bug reporter. - # qacontact: string. The login name of the bug's QA contact. + # qacontact: string. The login name of the bug's QA contact. # Optional. - # cc: list of strings. The login names of those on the CC + # cc: list of strings. The login names of those on the CC # list. #%] +[% PROCESS global/variables.none.tmpl %] + [% mail = SendBugMail(mailing_bugid, mailrecipients) %] [% PROCESS emails @@ -49,7 +51,7 @@ %] <br> <center> - If you wish to tweak the kinds of mail Bugzilla sends you, you can + If you wish to tweak the kinds of mail [% terms.Bugzilla %] sends you, you can <a href="userprefs.cgi?tab=email">change your preferences</a>. </center> @@ -59,10 +61,10 @@ [%############################################################################%] [% BLOCK emails %] - <b>[% description %]:</b> + <b>[% description FILTER html %]:</b> [% IF names.size > 0 %] [%+ FOREACH name = names %] - [% name %][% ", " UNLESS loop.last() %] + [% name FILTER html %][% ", " UNLESS loop.last() %] [% END %] [% ELSE %] no one diff --git a/template/en/default/bug/process/confirm-duplicate.html.tmpl b/template/en/default/bug/process/confirm-duplicate.html.tmpl index 72472a83b5c60482fdd4e6293c498bd461bf9437..e7c030309a53b9bc8ea37f2fff0f468eb4e71497 100644 --- a/template/en/default/bug/process/confirm-duplicate.html.tmpl +++ b/template/en/default/bug/process/confirm-duplicate.html.tmpl @@ -26,45 +26,47 @@ # against which a bug is being duped # duplicate_bug_id: number; the bug number for the bug # being duped - # cclist_accessible: boolean; whether or not users on the cc: list + # cclist_accessible: boolean; whether or not users on the cc: list # of the original bug can access that bug. #%] - + +[% PROCESS global/variables.none.tmpl %] + [% PROCESS global/header.html.tmpl title="Duplicate Warning" %] - + <p> - When marking a bug as a duplicate, the reporter of the duplicate - is normally added to the CC list of the original. The permissions - on bug [% original_bug_id %] (the original) are currently set + When marking [% terms.abug %] as a duplicate, the reporter of the duplicate + is normally added to the CC list of the original. The permissions + on [% terms.bug %] [% original_bug_id %] (the original) are currently set such that the reporter would not normally be able to see it. </p> <p> - <b>Adding the reporter to the CC list of bug [% original_bug_id %] + <b>Adding the reporter to the CC list of [% terms.bug %] [% original_bug_id %] [% IF cclist_accessible %] will immediately [% ELSE %] might, in the future, [% END %] - allow him/her access to view this bug.</b> + allow him/her access to view this [% terms.bug %].</b> Do you wish to do this? </p> - + <form method="post" action="process_bug.cgi"> [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %] <p> - <input type="radio" name="confirm_add_duplicate" value="1"> - Yes, add the reporter to CC list on bug [% original_bug_id %] + <input type="radio" name="confirm_add_duplicate" value="1"> + Yes, add the reporter to CC list on [% terms.bug %] [% original_bug_id %] </p> <p> - <input type="radio" name="confirm_add_duplicate" value="0" checked="checked"> - No, do not add the reporter to CC list on bug [% original_bug_id %] + <input type="radio" name="confirm_add_duplicate" value="0" checked="checked"> + No, do not add the reporter to CC list on [% terms.bug %] [% original_bug_id %] </p> <p> - <a href="show_bug.cgi?id=[% duplicate_bug_id %]">Throw away my changes, - and revisit bug [% duplicate_bug_id %]</a> + <a href="show_bug.cgi?id=[% duplicate_bug_id %]">Throw away my changes, + and revisit [% terms.bug %] [% duplicate_bug_id %]</a> <p> <input type="submit" value="Submit"> </p> diff --git a/template/en/default/bug/process/header.html.tmpl b/template/en/default/bug/process/header.html.tmpl index 08e27ec56e984154930ab5839522f5aa80156e01..9c2f1fad75d7a9b15cd32ac6c2919befbd8615b1 100644 --- a/template/en/default/bug/process/header.html.tmpl +++ b/template/en/default/bug/process/header.html.tmpl @@ -22,11 +22,13 @@ [%# INTERFACE: # As global/header.html.tmpl. #%] - + +[% PROCESS global/variables.none.tmpl %] + [% IF title_tag == "bug_processed" %] - [% title = "Bug processed" %] + [% title = "$terms.Bug processed" %] [% ELSIF title_tag == "mid_air" %] [% title = "Mid-air collision!" %] [% END %] - + [% PROCESS global/header.html.tmpl %] diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl index e3698a64012232233b87b9064fe8e413c405cb69..f8b1986899aace4e5060d59446bd33e944876682 100644 --- a/template/en/default/bug/process/midair.html.tmpl +++ b/template/en/default/bug/process/midair.html.tmpl @@ -33,7 +33,9 @@ # comments: array; all the comments on the bug. # bug_id: number; the ID of the bug being changed. #%] - + +[% PROCESS global/variables.none.tmpl %] + [% UNLESS header_done %] [% PROCESS bug/process/header.html.tmpl %] [% END %] @@ -41,14 +43,14 @@ <h1>Mid-air collision detected!</h1> <p> - Someone else has made changes to this bug at the same time you were trying to. + Someone else has made changes to this [% terms.bug %] at the same time you were trying to. The changes made were: </p> <p> [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %] </p> - + [% IF comments.size > start_at %] <p> Added comments: @@ -72,8 +74,8 @@ You have the following choices: </form> </li> <li> - <a href="show_bug.cgi?id=[% bug_id %]">Throw away my changes, - and revisit bug [% bug_id %]</a> + <a href="show_bug.cgi?id=[% bug_id %]">Throw away my changes, + and revisit [% terms.bug %] [% bug_id %]</a> </li> </ul> diff --git a/template/en/default/bug/process/next.html.tmpl b/template/en/default/bug/process/next.html.tmpl index 1eeb9f367428e77d057c16d0d78985c05c681f33..73c8b52893a00d2408dedb5264e4160b42cd33f1 100644 --- a/template/en/default/bug/process/next.html.tmpl +++ b/template/en/default/bug/process/next.html.tmpl @@ -23,10 +23,12 @@ # bug : Bug object; the next bug to show #%] +[% PROCESS global/variables.none.tmpl %] + <hr> <p> - The next bug in your list is bug + The next [% terms.bug %] in your list is [% terms.bug %] <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>: </p> diff --git a/template/en/default/bug/process/results.html.tmpl b/template/en/default/bug/process/results.html.tmpl index 5c3592954d13a5495acc842e077dad56e75d829b..2097e047bbc6620e9beb406fdaa6c067599834f1 100644 --- a/template/en/default/bug/process/results.html.tmpl +++ b/template/en/default/bug/process/results.html.tmpl @@ -25,24 +25,26 @@ # type: string; the type of change/check that was made: "bug" when a bug # is changed, "dupe" when a duplication notation is added to a bug, # and "dep" when a bug is checked for changes to its dependencies. - # + # # mailrecipients: hash; BugMail recipient params. Optional. #%] +[% PROCESS global/variables.none.tmpl %] + [% UNLESS header_done %] [% PROCESS bug/process/header.html.tmpl %] [% END %] [% DEFAULT type="bug" %] -[% +[% title = { - 'bug' => "Changes submitted for bug $id" , - 'dupe' => "Duplicate notation added to bug $id" , - 'dep' => "Checking for dependency changes on bug $id" , - 'votes' => "Bug $id confirmed by number of votes" , - 'created' => "Bug $id has been added to the database" , - } + 'bug' => "Changes submitted for $terms.bug $id" , + 'dupe' => "Duplicate notation added to $terms.bug $id" , + 'dep' => "Checking for dependency changes on $terms.bug $id" , + 'votes' => "$terms.Bug $id confirmed by number of votes" , + 'created' => "$terms.Bug $id has been added to the database" , + } %] <table border="1"> @@ -52,7 +54,7 @@ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = id %] </td> <td> - <a href="show_bug.cgi?id=[% id %]">Back To BUG# [% id %]</a> + <a href="show_bug.cgi?id=[% id %]">Back To [% terms.Bug %]# [% id %]</a> </td> </tr> </table> diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl index bba85d637f53d43dbe18361a15e3ccaf0ce5620d..b3e6af2500312c543d6132042fce5b4562ef3280 100644 --- a/template/en/default/bug/process/verify-new-product.html.tmpl +++ b/template/en/default/bug/process/verify-new-product.html.tmpl @@ -22,7 +22,7 @@ [%# INTERFACE: # form: hash; the form values submitted to the script # mform: hash; the form multi-values submitted to the script - # verify_fields: boolean; whether or not to verify + # verify_fields: boolean; whether or not to verify # the version, component, and target milestone fields # versions: array; versions for the new product. # components: array; components for the new product. @@ -31,13 +31,15 @@ # those fields # verify_bug_group: boolean; whether or not to ask the user # if they want to add the bug to its new product's group - # use_target_milestone: boolean; whether or not to use + # use_target_milestone: boolean; whether or not to use # the target milestone field #%] - + +[% PROCESS global/variables.none.tmpl %] + <form action="process_bug.cgi" method="post"> -[% PROCESS "global/hidden-fields.html.tmpl" +[% PROCESS "global/hidden-fields.html.tmpl" exclude=(verify_fields ? "^version|component|target_milestone$" : "") %] [%# Verify the version, component, and target milestone fields. %] @@ -46,12 +48,14 @@ <p> [% IF use_target_milestone %] - You are moving the bug(s) to the product <b>[% form.product %]</b>, + You are moving the [% terms.bug %](s) to the product + <b>[% form.product FILTER html %]</b>, and the version, component, and/or target milestone fields are no longer correct. Please set the correct version, component, and target milestone now: [% ELSE %] - You are moving the bug(s) to the product <b>[% form.product %]</b>, - and the version and component fields are no longer correct. + You are moving the [% terms.bug %](s) to the product + <b>[% form.product FILTER html %]</b>, + and the version and component fields are no longer correct. Please set the correct version and component now: [% END %] <p> @@ -76,19 +80,19 @@ </table> [% END %] - + [% IF verify_bug_group %] - <h3>Verify Bug Group</h3> + <h3>Verify [% terms.Bug %] Group</h3> <p> - Do you want to add the bug to its new product's default groups (if any)? + Do you want to add the [% terms.bug %] to its new product's default groups (if any)? </p> <p> <input type="radio" name="addtonewgroup" value="no"><b>no</b><br> <input type="radio" name="addtonewgroup" value="yes"><b>yes</b><br> <input type="radio" name="addtonewgroup" value="yesifinold" checked="checked"> - <b>yes, but only if the bug was in any of its old product's default groups</b><br> + <b>yes, but only if the [% terms.bug %] was in any of its old product's default groups</b><br> </p> [% END %] diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl index 41d824eb3b9c054de428e1f2174d09f40df7dd0c..340a0ebf81525e1180682e6e47034af2fc3e8179 100644 --- a/template/en/default/bug/show-multiple.html.tmpl +++ b/template/en/default/bug/show-multiple.html.tmpl @@ -20,8 +20,10 @@ # Gervase Markham <gerv@gerv.net> #%] -[% PROCESS global/header.html.tmpl - title = "Full Text Bug Listing" +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Full Text $terms.Bug Listing" style_urls = [ "css/show_multiple.css" ] %] [% PROCESS bug/time.html.tmpl %] @@ -31,7 +33,7 @@ [% END %] [% ELSE %] <p> - You'd have more luck if you gave me some bug numbers. + You'd have more luck if you gave me some [% terms.bug %] numbers. </p> [% END %] @@ -47,54 +49,57 @@ <img alt="" src="1x1.gif" width="1" height="80" align="left"> <div align="center"> <b> - <font size="+3">Bug [% bug.bug_id %] - [% bug.short_desc FILTER html %]</font> + <font size="+3">[% terms.Bug %] [% bug.bug_id %] - [% bug.short_desc FILTER html %]</font> </b> </div> <table width="100%"> <tr> <td> - <b>Bug#:</b> + <b>[% terms.Bug %]#:</b> <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> + [% IF Param("usebugaliases") AND bug.alias %] + ([% bug.alias FILTER html %]) + [% END %] </td> - [% PROCESS cell attr = { description => "Product", + [% PROCESS cell attr = { description => "Product", name => "product" } %] - [% PROCESS cell attr = { description => "Version", + [% PROCESS cell attr = { description => "Version", name => "version" } %] - [% PROCESS cell attr = { description => "Platform", + [% PROCESS cell attr = { description => "Platform", name => "rep_platform" } %] </tr> - + <tr> - [% PROCESS cell attr = { description => "OS/Version", + [% PROCESS cell attr = { description => "OS/Version", name => "op_sys" } %] - [% PROCESS cell attr = { description => "Status", + [% PROCESS cell attr = { description => "Status", name => "bug_status" } %] - [% PROCESS cell attr = { description => "Severity", + [% PROCESS cell attr = { description => "Severity", name => "bug_severity" } %] - [% PROCESS cell attr = { description => "Priority", + [% PROCESS cell attr = { description => "Priority", name => "priority" } %] </tr> - + <tr> - [% PROCESS cell attr = { description => "Resolution", + [% PROCESS cell attr = { description => "Resolution", name => "resolution" } %] - [% PROCESS cell attr = { description => "Assigned To", + [% PROCESS cell attr = { description => "Assigned To", name => "assigned_to" } %] - [% PROCESS cell attr = { description => "Reported By", + [% PROCESS cell attr = { description => "Reported By", name => "reporter" } %] [% IF Param('useqacontact') %] - [% PROCESS cell attr = { description => "QA Contact", + [% PROCESS cell attr = { description => "QA Contact", name => "qa_contact" } %] [% END %] </tr> - + <tr> <td colspan="2"> <b>Component:</b> - [% bug.component %] + [% bug.component FILTER html %] </td> - + <td colspan="2"> [% IF Param('usetargetmilestone') %] <b>Target Milestone:</b> @@ -102,20 +107,20 @@ [% END %] </td> </tr> - + <tr> <td colspan="4"> <b>URL:</b> <a href="[% bug.bug_file_loc FILTER html %]"> - [% bug.bug_file_loc FILTER html %]</a> + [% bug.bug_file_loc FILTER html %]</a> </tr> - + <tr> <td colspan="4"> <b>Summary:</b> [% bug.short_desc FILTER html %] </td> </tr> - + [% IF use_keywords %] <tr> <td colspan="4"> @@ -140,7 +145,7 @@ [% PROCESS formattimeunit time_unit=bug.estimated_time %] <b>Current Est.:</b> - [% PROCESS formattimeunit + [% PROCESS formattimeunit time_unit=(bug.remaining_time + bug.actual_time) %] <b>Hours Worked:</b> @@ -149,10 +154,10 @@ [% PROCESS formattimeunit time_unit=bug.remaining_time %] <b>Percentage Complete:</b> - [% PROCESS calculatepercentage act=bug.actual_time + [% PROCESS calculatepercentage act=bug.actual_time rem=bug.remaining_time %] <b>Gain</b> - [% PROCESS formattimeunit + [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %] </td> @@ -172,9 +177,9 @@ </tr> </table> - [% PROCESS bug/comments.html.tmpl + [% PROCESS bug/comments.html.tmpl comments = bug.comments %] - + <hr> [% END %] @@ -185,7 +190,7 @@ [% BLOCK cell %] <td> - <b>[% attr.description%]:</b> + <b>[% attr.description FILTER html %]:</b> [% bug.${attr.name} FILTER html %] </td> [% END %] diff --git a/template/en/default/bug/show.html.tmpl b/template/en/default/bug/show.html.tmpl index 637583502b86b140423f338a56d3c0376f5a9196..44b9c72b49263e80a780d60cf2ac542bb00e7a90 100644 --- a/template/en/default/bug/show.html.tmpl +++ b/template/en/default/bug/show.html.tmpl @@ -21,14 +21,16 @@ # Bradley Baetz <bbaetz@student.usyd.edu.au> #%] +[% PROCESS global/variables.none.tmpl %] + [%# This script/template only handles one bug #%] [% bug = bugs.0 %] [% filtered_desc = bug.short_desc FILTER html %] [% filtered_timestamp = bug.delta_ts FILTER time %] -[% PROCESS global/header.html.tmpl - title = "Bug $bug.bug_id - $bug.short_desc" - h1 = "Bugzilla Bug $bug.bug_id" +[% PROCESS global/header.html.tmpl + title = "$terms.Bug $bug.bug_id - $bug.short_desc" + h1 = "$terms.Bugzilla $terms.Bug $bug.bug_id" h2 = filtered_desc h3 = "Last modified: $filtered_timestamp" style_urls = [ "css/edit_bug.css" ] diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl index 6187459027538b616342cdb66796bb4215875dac..45ef1712a8ea7089e06c69e3912deb5e4248bf5f 100644 --- a/template/en/default/bug/show.xml.tmpl +++ b/template/en/default/bug/show.xml.tmpl @@ -25,7 +25,7 @@ <bugzilla version="[% VERSION %]" urlbase="[% Param('urlbase') %]" maintainer="[% Param('maintainer') FILTER xml %]" -[% IF user.login %] +[% IF user %] exporter="[% user.login FILTER xml %]" [% END %] > diff --git a/template/en/default/bug/votes/CVS/Entries b/template/en/default/bug/votes/CVS/Entries index 442c00f90e75566651e6fb3f1544675b854f875a..db832b96e731d75f4f0a0faf2280a349522d96b0 100644 --- a/template/en/default/bug/votes/CVS/Entries +++ b/template/en/default/bug/votes/CVS/Entries @@ -1,4 +1,4 @@ -/delete-all.html.tmpl/1.4/Mon May 6 19:17:09 2002//TBUGZILLA-2_17_4 -/list-for-bug.html.tmpl/1.7/Sat Jun 22 10:32:38 2002//TBUGZILLA-2_17_4 -/list-for-user.html.tmpl/1.8/Sat Aug 10 08:22:42 2002//TBUGZILLA-2_17_4 +/delete-all.html.tmpl/1.5/Thu Jul 3 21:31:46 2003//TBUGZILLA-2_17_5 +/list-for-bug.html.tmpl/1.8/Thu Jul 3 21:31:46 2003//TBUGZILLA-2_17_5 +/list-for-user.html.tmpl/1.11/Sun Sep 28 20:42:33 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/bug/votes/CVS/Tag b/template/en/default/bug/votes/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/bug/votes/CVS/Tag +++ b/template/en/default/bug/votes/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/bug/votes/delete-all.html.tmpl b/template/en/default/bug/votes/delete-all.html.tmpl index c50b0cb1cacf5d6b9a84128fa7a4dd1ac5d0b8b4..d5ebae3497d88b69f1a141a133d3f774951041a1 100644 --- a/template/en/default/bug/votes/delete-all.html.tmpl +++ b/template/en/default/bug/votes/delete-all.html.tmpl @@ -20,16 +20,18 @@ #%] [%# INTERFACE: - # This template has no interface. + # This template has no interface. #%] - + +[% PROCESS global/variables.none.tmpl %] + [% PROCESS global/header.html.tmpl title = "Remove your votes?" %] <p> - You are about to remove all of your bug votes. Are you sure you wish to - remove your vote from every bug you've voted on? + You are about to remove all of your [% terms.bug %] votes. Are you sure you wish to + remove your vote from every [% terms.bug %] you've voted on? </p> <form action="votes.cgi" method="post"> diff --git a/template/en/default/bug/votes/list-for-bug.html.tmpl b/template/en/default/bug/votes/list-for-bug.html.tmpl index 32a786aa881595079445a29b30bdda4d58d82901..b4d1ed5862dd41bef0e99c093ffe67a26d25b246 100644 --- a/template/en/default/bug/votes/list-for-bug.html.tmpl +++ b/template/en/default/bug/votes/list-for-bug.html.tmpl @@ -24,14 +24,16 @@ # users: list of hashes. May be empty. Each hash has two members: # name: string. The login name of the user whose vote is attached # count: integer. The number of times that user has votes for this bug. - # total: integer. The total number of votes for this bug. + # total: integer. The total number of votes for this bug. #%] - + +[% PROCESS global/variables.none.tmpl %] + [% PROCESS global/header.html.tmpl title = "Show Votes" - h2 = "Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" + h2 = "$terms.Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>" %] - + <table cellspacing="4"> <tr> <th>Who</th> diff --git a/template/en/default/bug/votes/list-for-user.html.tmpl b/template/en/default/bug/votes/list-for-user.html.tmpl index 0c1e30e6e464e02001f7d91c3a104bb9c5519935..e40dbce9979254912165fa53b8d71de6dceb8740 100644 --- a/template/en/default/bug/votes/list-for-user.html.tmpl +++ b/template/en/default/bug/votes/list-for-user.html.tmpl @@ -19,9 +19,11 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] +[% PROCESS global/variables.none.tmpl %] + +[% h2 = voting_user.login FILTER html %] [% PROCESS global/header.html.tmpl title = "Show Votes" - h2 = voting_user.name %] [% canedit = 1 IF voting_user.login == user.login %] @@ -37,12 +39,12 @@ [% END %] [% IF products.size %] - <form action="votes.cgi"> + <form method="post" action="votes.cgi"> <input type="hidden" name="action" value="vote"> <table cellspacing="4"> <tr> <td></td> - <th>Bug #</th> + <th>[% terms.Bug %] #</th> <th>Summary</th> <th>Votes</th> </tr> @@ -63,7 +65,7 @@ <td> <font size="-1"> (Note: only [% product.maxperbug %] vote - [% "s" IF product.maxperbug != 1 %] allowed per bug in + [% "s" IF product.maxperbug != 1 %] allowed per [% terms.bug %] in this product.) </font> </td> @@ -90,7 +92,7 @@ <input type="checkbox" name="[% bug.id %]" value="1" [% " checked" IF bug.count %]> [% ELSE %] - <input name="[% bug.id %]" value="[% bug.count %]" + <input name="[% bug.id %]" value="[% bug.count %]" size="2"> [% END %] [% ELSE %] @@ -125,7 +127,7 @@ change the checkbox [% END %] and then click <b>Change My Votes</b>. - [% END %] + [% END %] </form> [% ELSE %] <p> @@ -134,7 +136,7 @@ [% ELSE %] This user is [% END %] - currently not voting on any bugs. + currently not voting on any [% terms.bugs %]. </p> [% END %] diff --git a/template/en/default/config.js.tmpl b/template/en/default/config.js.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..a74c5d34d6bc35515786b9a20c9a624514a99fe3 --- /dev/null +++ b/template/en/default/config.js.tmpl @@ -0,0 +1,129 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] +// +// This file contains the installation specific values for QuickSearch +// and other Bugzilla clients. See quicksearch.js for more details. +// +// Note: this interface is experimental and under development. +// We may and probably will make breaking changes to it in the future. + +// the global bugzilla url +var installation = { + base_url : '[% Param('urlbase') FILTER js %]', + install_version : '[% VERSION FILTER js %]', + maintainer : '[% Param('maintainer') FILTER js %]' +}; + + +// Status and Resolution +// ===================== +var status = [ [% FOREACH x = status %]'[% x FILTER js %]', [% END %] ]; +var status_open = [ [% FOREACH x = open_status %]'[% x FILTER js %]', [% END %] ]; +var status_closed = [ [% FOREACH x = closed_status %]'[% x FILTER js %]', [% END %] ]; +var resolution = [ [% FOREACH x = resolution %]'[% x FILTER js %]', [% END %] ]; + + +// Keywords +// ======== + +var keyword = [ [% FOREACH x = keyword %]'[% x FILTER js %]', [% END %] ]; + + +// Platforms +// ========= + +var platform = [ [% FOREACH x = platform %]'[% x FILTER js %]', [% END %] ]; + + +// Severities +// ========== + +var severity = [ [% FOREACH x = severity %]'[% x FILTER js %]', [% END %] ]; + + +// Products and Components +// ======================= +// +// It is not necessary to list all products and components here. +// Instead, you can define a "blacklist" for some commonly used words +// or word fragments that occur in a product or component name +// but should _not_ trigger product/component search. + + +// A list of all products and their components, versions, and target milestones: + +var component = new Object(); +var version = new Object(); +var target_milestone = new Object(); + +[% FOREACH p = legal_products %] + component['[% p FILTER js %]'] = [ [% FOREACH x = components_by_product.$p %]'[% x FILTER js %]', [% END %] ]; + version['[% p FILTER js %]'] = [ [% FOREACH x = versions_by_product.$p %]'[% x FILTER js %]', [% END %] ]; + target_milestone['[% p FILTER js %]'] = [ [% FOREACH x = milestones_by_product.$p %]'[% x FILTER js %]', [% END %] ]; +[% END %] + +// Product and Component Exceptions +// ================================ +// +// A blacklist for some commonly used words or word fragments +// that occur in a product or component name but should *not* +// trigger product/component search in QuickSearch. + +var product_exceptions = new Array( + // Example: + //"row" // [Browser] + // // ^^^ + //,"new" // [MailNews] + // // ^^^ +); + +var component_exceptions = new Array( + // Example: + //"hang" // [mozilla.org] Bugzilla: Component/Keyword Changes + // // ^^^^ +); + +// Queryable Fields +// ================ +[% PROCESS "global/field-descs.none.tmpl" %] +var field = [ +[% FOREACH x = field %] + { name: '[% x.name FILTER js %]', + description: '[% (field_descs.${x.name} OR x.description) FILTER js %]' }, +[% END %] +]; + +// Deprecated Variables +// ==================== +// +// Other names for various variables. These are deprecated +// and could go away at any time. Use them at your own risk! + +var bugzilla = installation.base_url; +var statuses = status; +var statuses_resolved = status_closed; +var resolutions = resolution; +var keywords = keyword; +var platforms = platform; +var severities = severity; +var cpts = component; +var vers = version; +var tms = target_milestone; diff --git a/template/en/default/config.rdf.tmpl b/template/en/default/config.rdf.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..884c26a0c33b9c4382d8cf3fee2b765a912e0330 --- /dev/null +++ b/template/en/default/config.rdf.tmpl @@ -0,0 +1,198 @@ +[% template_version = "1.0@bugzilla.org" %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +<?xml version="1.0"?> +<!-- Note: this interface is experimental and under development. + - We may and probably will make breaking changes to it in the future. --> + +<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:bz="http://www.bugzilla.org/rdf#"> + +<bz:installation rdf:about="[% Param('urlbase') FILTER html %]"> + <bz:install_version>[% VERSION FILTER html %]</bz:install_version> + <bz:maintainer>[% Param('maintainer') FILTER html %]</bz:maintainer> + + <bz:status> + <Seq> + [% FOREACH item = status %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:status> + + <bz:status_open> + <Seq> + [% FOREACH item = open_status %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:status_open> + + <bz:status_closed> + <Seq> + [% FOREACH item = closed_status %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:status_closed> + + <bz:resolution> + <Seq> + [% FOREACH item = resolution %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:resolution> + + <bz:keyword> + <Seq> + [% FOREACH item = keyword %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:keyword> + + <bz:platform> + <Seq> + [% FOREACH item = platform %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:platform> + + <bz:op_sys> + <Seq> + [% FOREACH item = op_sys %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:op_sys> + + <bz:priority> + <Seq> + [% FOREACH item = priority %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:priority> + + <bz:severity> + <Seq> + [% FOREACH item = severity %] + <li>[% item FILTER html %]</li> + [% END %] + </Seq> + </bz:severity> + + <bz:products> + <Seq> + [% FOREACH product = legal_products %] + <li> + <bz:product rdf:about="[% Param('urlbase') %]product.cgi?name=[% product FILTER uri %]"> + <bz:name>[% product FILTER html %]</bz:name> + + <bz:components> + <Seq> + [% FOREACH component = components_by_product.$product %] + <li resource="[% Param('urlbase') %]component.cgi?name=[% component FILTER uri %]"/> + [% END %] + </Seq> + </bz:components> + + <bz:versions> + <Seq> + [% FOREACH version = versions_by_product.$product %] + <li resource="[% Param('urlbase') %]version.cgi?name=[% version FILTER uri %]"/> + [% END %] + </Seq> + </bz:versions> + + [% IF Param('usetargetmilestone') %] + <bz:target_milestones> + <Seq> + [% FOREACH milestone = milestones_by_product.$product %] + <li resource="[% Param('urlbase') %]milestone.cgi?name=[% milestone FILTER uri %]"/> + [% END %] + </Seq> + </bz:target_milestones> + [% END %] + + </bz:product> + </li> + [% END %] + </Seq> + </bz:products> + + <bz:components> + <Seq> + [% FOREACH item = legal_components %] + <li> + <bz:component rdf:about="[% Param('urlbase') %]component.cgi?name=[% item FILTER uri %]"> + <bz:name>[% item FILTER html %]</bz:name> + </bz:component> + </li> + [% END %] + </Seq> + </bz:components> + + <bz:versions> + <Seq> + [% FOREACH item = legal_versions %] + <li> + <bz:version rdf:about="[% Param('urlbase') %]version.cgi?name=[% item FILTER uri %]"> + <bz:name>[% item FILTER html %]</bz:name> + </bz:version> + </li> + [% END %] + </Seq> + </bz:versions> + + [% IF Param('usetargetmilestone') %] + <bz:target_milestones> + <Seq> + [% FOREACH item = legal_milestones %] + <li> + <bz:target_milestone rdf:about="[% Param('urlbase') %]milestone.cgi?name=[% item FILTER uri %]"> + <bz:name>[% item FILTER html %]</bz:name> + </bz:target_milestone> + </li> + [% END %] + </Seq> + </bz:target_milestones> + [% END %] + + <bz:fields> + <Seq> + [% PROCESS "global/field-descs.none.tmpl" %] + [% FOREACH item = field %] + <li> + <bz:field rdf:about="[% Param('urlbase') %]field.cgi?name=[% item.name FILTER uri %]"> + <bz:name>[% item.name FILTER html %]</bz:name> + <bz:description>[% (field_descs.${item.name} OR item.description) FILTER html %]</bz:description> + </bz:field> + </li> + [% END %] + </Seq> + </bz:fields> +</bz:installation> + +</RDF> diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl index b462b7bcc87b8c5d684e47576826c7336a98933e..56f20be72f798aed508fe5c45c95c5f14cc0ea4e 100644 --- a/template/en/default/filterexceptions.pl +++ b/template/en/default/filterexceptions.pl @@ -33,17 +33,7 @@ # Safe vmethods - [% foo.size %] # TT loop variables - [% loop.count %] # Already-filtered stuff - [% wibble FILTER html %] -# where the filter is one of html|csv|js|url_quote|quoteUrls|time|uri|xml - -# Key: -# -# "#": directive should be filtered, but not doing so is not a security hole -# The plan is to come back and add filtering for all those marked "#" after -# the security release. -# -# "# Email": as above; but noting that it's an email address. -# Other sorts of comments denote cleanups noticed while doing this work; -# they should be fixed in the very short term. +# where the filter is one of html|csv|js|url_quote|quoteUrls|time|uri|xml|none %::safe = ( @@ -80,19 +70,15 @@ 'field.accesskey', 'sel.name', 'sel.accesskey', - 'button_name', # ], -'search/knob.html.tmpl' => [ - 'button_name', # +'search/search-specific.html.tmpl' => [ + 's', ], -'search/search-report-graph.html.tmpl' => [ - 'button_name', # -], - -'search/search-report-table.html.tmpl' => [ - 'button_name', # +'search/tabs.html.tmpl' => [ + 'tab.name', + 'tab.description', ], 'request/queue.html.tmpl' => [ @@ -105,32 +91,20 @@ 'reports/components.html.tmpl' => [ 'numcols', - 'numcols - 1', 'comp.description', - 'comp.initialowner', # email address - 'comp.initialqacontact', # email address -], - -'reports/duplicates-simple.html.tmpl' => [ - 'title', # ], 'reports/duplicates-table.html.tmpl' => [ - '"&maxrows=$maxrows" IF maxrows', - '"&changedsince=$changedsince" IF changedsince', - '"&product=$product" IF product', # - '"&format=$format" IF format', # - '"&bug_id=$bug_ids_string&sortvisible=1" IF sortvisible', + '"&maxrows=$maxrows" IF maxrows', + '"&changedsince=$changedsince" IF changedsince', + '"&bug_id=$bug_ids_string&sortvisible=1" + IF sortvisible', 'column.name', 'column.description', 'vis_bug_ids.push(bug.id)', 'bug.id', 'bug.count', 'bug.delta', - 'bug.component', # - 'bug.bug_severity', # - 'bug.op_sys', # - 'bug.target_milestone', # ], 'reports/duplicates.html.tmpl' => [ @@ -146,11 +120,9 @@ ], 'reports/report-table.csv.tmpl' => [ - '"$tbl_field_disp: $tbl\n" IF tbl_field', # - 'row_field_disp IF row_field', # - 'col_field_disp', # 'num_bugs', 'data.$tbl.$col.$row', + 'title', '', # This is not a bug in the filter exceptions - this template has an # empty directive which is necessary for it to work properly. ], @@ -160,7 +132,6 @@ '"&$tbl_vals" IF tbl_vals', '"&$col_vals" IF col_vals', '"&$row_vals" IF row_vals', - 'tbl_disp', # 'classes.$row_idx.$col_idx', 'urlbase', 'data.$tbl.$col.$row', @@ -170,21 +141,13 @@ ], 'reports/report.html.tmpl' => [ - 'tbl_field_disp IF tbl_field', # - 'row_field_disp IF row_field', # - 'col_field_disp', # 'imagebase', 'width', 'height', 'imageurl', 'formaturl', 'other_format.name', - 'other_format.description', # 'sizeurl', - 'height + 100', - 'height - 100', - 'width + 100', - 'width - 100', 'switchbase', 'format', 'cumulate', @@ -197,9 +160,38 @@ 'bug.delta', ], +'reports/chart.html.tmpl' => [ + 'width', + 'height', + 'imageurl', + 'sizeurl', + 'height + 100', + 'height - 100', + 'width + 100', + 'width - 100', +], + +'reports/series-common.html.tmpl' => [ + 'sel.name', + 'sel.accesskey', + '"onchange=\'$sel.onchange\'" IF sel.onchange', +], + +'reports/chart.csv.tmpl' => [ + 'data.$j.$i', +], + +'reports/create-chart.html.tmpl' => [ + 'series.series_id', + 'newidx', +], + +'reports/edit-series.html.tmpl' => [ + 'default.series_id', +], + 'list/change-columns.html.tmpl' => [ 'column', - 'field_descs.${column} || column', # ], 'list/edit-multiple.html.tmpl' => [ @@ -216,7 +208,6 @@ 'list/list.html.tmpl' => [ 'buglist', - 'bugowners', # email address ], 'list/list.rdf.tmpl' => [ @@ -226,13 +217,9 @@ ], 'list/table.html.tmpl' => [ - 'id', - 'splitheader ? 2 : 1', - 'abbrev.$id.title || field_descs.$id || column.title', # 'tableheader', - 'bug.bug_severity', # - 'bug.priority', # 'bug.bug_id', + 'abbrev.$id.title || field_descs.$id || column.title', ], 'list/list.csv.tmpl' => [ @@ -257,19 +244,12 @@ 'proddesc.$p', ], +# You are not permitted to add any values here. Everything in this file should +# be filtered unless there's an extremely good reason why not, in which case, +# use the "none" dummy filter. 'global/code-error.html.tmpl' => [ - 'parameters', - 'bug.bug_id', - 'field', - 'argument', # - 'function', # - 'bug_id', # Need to remove unused error no_bug_data - 'variables.id', - 'template_error_msg', # Should move filtering from CGI.pl to template - 'error', - 'error_message', ], - + 'global/header.html.tmpl' => [ 'javascript', 'style', @@ -281,54 +261,29 @@ 'h3', 'message', ], -'global/hidden-fields.html.tmpl' => [ - 'mvalue | html | html_linebreak', # Need to eliminate | usage - 'field.value | html | html_linebreak', -], 'global/messages.html.tmpl' => [ - 'parameters', - '# ---', # Work out what this is - 'namedcmd', # - 'old_email', # email address - 'new_email', # email address 'message_tag', + 'series.frequency * 2', ], 'global/select-menu.html.tmpl' => [ 'options', - 'onchange', # Again, need to be certain where we are filtering 'size', ], 'global/useful-links.html.tmpl' => [ 'email', - 'user.login', # Email address ], -# Need to change this and code-error to use a no-op filter, for safety +# You are not permitted to add any values here. Everything in this file should +# be filtered unless there's an extremely good reason why not, in which case, +# use the "none" dummy filter. 'global/user-error.html.tmpl' => [ - 'disabled_reason', - 'bug_link', - 'action', # - 'bug_id', - 'both', - 'filesize', - 'attach_id', - 'field', - 'field_descs.$field', - 'today', - 'product', # - 'max', - 'votes', - 'error_message', ], 'global/confirm-user-match.html.tmpl' => [ - '# use the global field descs', # Need to fix commenting style here 'script', - '# this is messy to allow later expansion', - '# ELSIF for things that don\'t belong in the field_descs hash here', 'fields.${field_name}.flag_type.name', ], @@ -339,7 +294,6 @@ 'bug_list.last', 'bug.bug_id', 'bug.votes', - 'PerformSubsts(Param(\'mybugstemplate\'), substs)', ], 'bug/comments.html.tmpl' => [ @@ -355,25 +309,16 @@ ], 'bug/dependency-tree.html.tmpl' => [ - 'hide_resolved ? "Open b" : "B"', 'bugid', 'maxdepth', 'dependson_ids.join(",")', 'blocked_ids.join(",")', 'dep_id', - 'hide_resolved ? 0 : 1', - 'hide_resolved ? "Show" : "Hide"', - 'realdepth < 2 || maxdepth == 1 ? "disabled" : ""', 'hide_resolved', - 'realdepth < 2 ? "disabled" : ""', 'maxdepth + 1', - 'maxdepth == 0 || maxdepth == realdepth ? "disabled" : ""', - 'realdepth < 2 || ( maxdepth && maxdepth < 2 ) ? "disabled" : ""', 'maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""', - 'maxdepth == 1 ? 1 + 'maxdepth == 1 ? 1 : ( maxdepth ? maxdepth - 1 : realdepth - 1 )', - 'realdepth < 2 || ! maxdepth || maxdepth >= realdepth ? - "disabled" : ""', ], 'bug/edit.html.tmpl' => [ @@ -383,18 +328,21 @@ 'bug.votes', 'group.bit', 'group.description', - 'knum', 'dep.title', 'dep.fieldname', 'accesskey', 'bug.${dep.fieldname}.join(\', \')', 'selname', 'depbug FILTER bug_link(depbug)', - '"bug ${bug.dup_id}" FILTER bug_link(bug.dup_id)', + '"${bug.dup_id}" FILTER bug_link(bug.dup_id)', +], + +'bug/knob.html.tmpl' => [ + 'bug.bug_id', + 'knum', ], 'bug/navigate.html.tmpl' => [ - 'this_bug_idx + 1', 'bug_list.first', 'bug_list.last', 'bug_list.$prev_bug', @@ -403,8 +351,6 @@ 'bug/show-multiple.html.tmpl' => [ 'bug.bug_id', - 'bug.component', # - 'attr.description', # ], 'bug/show.xml.tmpl' => [ @@ -432,7 +378,6 @@ 'product.total', 'product.maxvotes', ], -# h2 = voting_user.name # Email 'bug/process/confirm-duplicate.html.tmpl' => [ 'original_bug_id', @@ -452,21 +397,11 @@ 'id', ], -'bug/process/verify-new-product.html.tmpl' => [ - 'form.product', # -], - -'bug/process/bugmail.html.tmpl' => [ - 'description', - 'name', # Email -], - 'bug/create/comment.txt.tmpl' => [ 'form.comment', ], 'bug/create/create.html.tmpl' => [ - 'default.bug_status', # 'g.bit', 'g.description', 'sel.name', @@ -476,7 +411,6 @@ 'bug/create/create-guided.html.tmpl' => [ 'matches.0', 'tablecolour', - 'product', # 'buildid', 'sel', ], @@ -486,7 +420,6 @@ ], 'bug/activity/table.html.tmpl' => [ - 'operation.who', # Email 'change.attachid', 'change.field', ], @@ -510,11 +443,7 @@ 'attachment/list.html.tmpl' => [ 'attachment.attachid', - 'FOR flag = attachment.flags', # Bug? No FOR directive - 'flag.type.name', 'flag.status', - 'flag.requestee.nick', # Email - 'show_attachment_flags ? 4 : 3', 'bugid', ], @@ -527,6 +456,27 @@ 'bugid', ], +'attachment/diff-header.html.tmpl' => [ + 'attachid', + 'bugid', + 'old_url', + 'new_url', + 'oldid', + 'newid', + 'style', + 'javascript', + 'patch.id', +], + +'attachment/diff-file.html.tmpl' => [ + 'lxr_prefix', + 'file.minus_lines', + 'file.plus_lines', + 'bonsai_prefix', + 'section.old_start', + 'section_num' +], + 'admin/products/groupcontrol/confirm-edit.html.tmpl' => [ 'group.count', ], @@ -543,7 +493,6 @@ 'admin/flag-type/confirm-delete.html.tmpl' => [ 'flag_count', - 'name', # 'flag_type.id', ], @@ -551,14 +500,12 @@ 'action', 'type.id', 'type.target_type', - 'category', # - 'item', # 'type.sortkey || 1', - '(last_action == "enter" || last_action == "copy") ? "Create" : "Save Changes"', + 'typeLabelLowerPlural', + 'typeLabelLowerSingular', ], 'admin/flag-type/list.html.tmpl' => [ - 'type.is_active ? "active" : "inactive"', 'type.id', 'type.flag_count', ], @@ -567,13 +514,7 @@ 'target', ], -'account/prefs/account.html.tmpl' => [ - 'login_change_date', # -], - 'account/prefs/email.html.tmpl' => [ - 'watchedusers', # Email - 'useqacontact ? \'5\' : \'4\'', 'role', 'reason.name', 'reason.description', @@ -589,9 +530,6 @@ 'tab.description', 'current_tab.name', 'current_tab.description', - 'current_tab.description FILTER lower', ], ); - -# Should filter reports/report.html.tmpl:130 $format diff --git a/template/en/default/flag/CVS/Entries b/template/en/default/flag/CVS/Entries index 3e5f93d2166f636226c874fd58f7c0268bd44c12..ff2b8464533105565ba737ef12ae96d1779ae517 100644 --- a/template/en/default/flag/CVS/Entries +++ b/template/en/default/flag/CVS/Entries @@ -1,2 +1,2 @@ -/list.html.tmpl/1.10/Fri Mar 14 05:35:40 2003//TBUGZILLA-2_17_4 +/list.html.tmpl/1.11/Tue Jun 3 09:48:07 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/flag/CVS/Tag b/template/en/default/flag/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/flag/CVS/Tag +++ b/template/en/default/flag/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl index 9ca1c25c7ac4b63150d6643d7e3c11753faf072f..50752a0df9166e6bb3b7506035e81668359979d4 100644 --- a/template/en/default/flag/list.html.tmpl +++ b/template/en/default/flag/list.html.tmpl @@ -116,7 +116,7 @@ id="requestee-[% flag.id %]" name="requestee-[% flag.id %]" [% IF flag.status == "?" && flag.requestee %] - value="[% flag.requestee.email FILTER html %]" + value="[% flag.requestee.login FILTER html %]" [% END %] >) </span> diff --git a/template/en/default/global/CVS/Entries b/template/en/default/global/CVS/Entries index 385631eda247a3f47746758928eb0c0ae1063f7c..eba61ee22dcc03ffaf017bf33ebc3e837e88db7c 100644 --- a/template/en/default/global/CVS/Entries +++ b/template/en/default/global/CVS/Entries @@ -1,17 +1,18 @@ -/banner.html.tmpl/1.4/Thu Nov 21 23:55:58 2002//TBUGZILLA-2_17_4 -/choose-product.html.tmpl/1.8/Thu Apr 24 20:49:44 2003//TBUGZILLA-2_17_4 -/code-error.html.tmpl/1.26/Thu Apr 24 20:49:44 2003//TBUGZILLA-2_17_4 -/confirm-user-match.html.tmpl/1.5/Sat Mar 22 04:47:35 2003//TBUGZILLA-2_17_4 -/field-descs.none.tmpl/1.1/Mon Jan 6 07:56:28 2003//TBUGZILLA-2_17_4 -/footer.html.tmpl/1.9/Fri Dec 20 23:35:29 2002//TBUGZILLA-2_17_4 -/header.html.tmpl/1.19/Tue Nov 26 21:11:20 2002//TBUGZILLA-2_17_4 -/help-header.html.tmpl/1.2/Fri Dec 20 07:21:41 2002//TBUGZILLA-2_17_4 -/help.html.tmpl/1.2/Fri Dec 20 07:21:41 2002//TBUGZILLA-2_17_4 -/hidden-fields.html.tmpl/1.6/Thu Apr 24 20:49:46 2003//TBUGZILLA-2_17_4 -/message.html.tmpl/1.5/Thu Apr 24 20:49:46 2003//TBUGZILLA-2_17_4 -/messages.html.tmpl/1.9/Mon Sep 30 07:22:44 2002//TBUGZILLA-2_17_4 -/select-menu.html.tmpl/1.2/Sat Sep 28 18:42:51 2002//TBUGZILLA-2_17_4 -/site-navigation.html.tmpl/1.6/Fri Dec 20 07:21:42 2002//TBUGZILLA-2_17_4 -/useful-links.html.tmpl/1.16/Mon Dec 9 00:24:43 2002//TBUGZILLA-2_17_4 -/user-error.html.tmpl/1.34/Fri Apr 25 05:41:29 2003//TBUGZILLA-2_17_4 +/banner.html.tmpl/1.5/Thu Jul 3 21:31:49 2003//TBUGZILLA-2_17_5 +/choose-product.html.tmpl/1.9/Thu Jul 3 21:31:49 2003//TBUGZILLA-2_17_5 +/code-error.html.tmpl/1.34/Sat Oct 18 22:37:29 2003//TBUGZILLA-2_17_5 +/confirm-user-match.html.tmpl/1.6/Sat Sep 6 19:23:21 2003//TBUGZILLA-2_17_5 +/field-descs.none.tmpl/1.2/Thu Jul 3 21:31:50 2003//TBUGZILLA-2_17_5 +/footer.html.tmpl/1.10/Thu Jul 3 21:31:50 2003//TBUGZILLA-2_17_5 +/header.html.tmpl/1.20/Thu Jul 3 21:31:50 2003//TBUGZILLA-2_17_5 +/help-header.html.tmpl/1.2/Fri Dec 20 07:21:41 2002//TBUGZILLA-2_17_5 +/help.html.tmpl/1.2/Fri Dec 20 07:21:41 2002//TBUGZILLA-2_17_5 +/hidden-fields.html.tmpl/1.7/Thu Jul 3 21:31:51 2003//TBUGZILLA-2_17_5 +/message.html.tmpl/1.6/Thu Jul 3 21:31:51 2003//TBUGZILLA-2_17_5 +/messages.html.tmpl/1.15/Tue Sep 9 22:24:12 2003//TBUGZILLA-2_17_5 +/select-menu.html.tmpl/1.3/Sat Sep 6 19:23:21 2003//TBUGZILLA-2_17_5 +/site-navigation.html.tmpl/1.8/Thu Jul 3 21:31:51 2003//TBUGZILLA-2_17_5 +/useful-links.html.tmpl/1.19/Sat Sep 6 19:23:21 2003//TBUGZILLA-2_17_5 +/user-error.html.tmpl/1.40/Thu Oct 30 17:29:49 2003//TBUGZILLA-2_17_5 +/variables.none.tmpl/1.1/Thu Jul 3 21:32:11 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/global/CVS/Tag b/template/en/default/global/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/global/CVS/Tag +++ b/template/en/default/global/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/global/banner.html.tmpl b/template/en/default/global/banner.html.tmpl index b8bf4e06d143b706285fd61bfa763b61c88d89ba..f1a8f14aef1fb5cb0c1f95b2991bb7d3c51ad517 100644 --- a/template/en/default/global/banner.html.tmpl +++ b/template/en/default/global/banner.html.tmpl @@ -22,12 +22,14 @@ [%# Migration note: this file corresponds to the old Param 'bannerhtml' %] +[% PROCESS global/variables.none.tmpl %] + <table bgcolor="#000000" width="100%" border="0" cellpadding="0" cellspacing="0"> <tr> <td> <center><font color="#FFFFFF" size="8"> - This is Bugzilla + This is [% terms.Bugzilla %] </font></center> </td> </tr> diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl index e79f7820d4a188f9a4bee4a8e94ccb6e232da811..5d6da1fc5332160c5df2d5593f61f8c813ff7e4e 100644 --- a/template/en/default/global/choose-product.html.tmpl +++ b/template/en/default/global/choose-product.html.tmpl @@ -24,11 +24,13 @@ # are their descriptions. #%] +[% PROCESS global/variables.none.tmpl %] + [% IF target == "enter_bug.cgi" %] - [% title = "Enter Bug" %] - [% h2 = "First, you must pick a product on which to enter a bug." %] + [% title = "Enter $terms.Bug" %] + [% h2 = BLOCK %]First, you must pick a product on which to enter [% terms.abug %]. [% END %] [% ELSIF target == "describecomponents.cgi" %] - [% title = "Bugzilla Component Descriptions" %] + [% title = "$terms.Bugzilla Component Descriptions" %] [% h2 = "Please specify the product whose components you want described." %] [% END %] @@ -50,7 +52,7 @@ [% END %] </tr> [% END %] - + </table> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index 92836f4db0cbf1a9f4cf8c03609ecc29b6a9a987..82be89b1d027a6865c8acf23c5ffddf749c634dc 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -25,23 +25,21 @@ # variables: hash. Useful data about the problem. The keys are the variable # names, and the values the variable values. #%] - + [%# This is a list of all the possible code errors. Please keep them in # alphabetical order by error tag, and leave a blank line between errors. - #%] + # + # Note that you must explicitly filter every single template variable + # in this file; if you do not wish to change it, use the "none" filter. + #%] + +[% PROCESS global/variables.none.tmpl %] [% DEFAULT title = "Internal Error" %] - + [% error_message = BLOCK %] - [% IF error == "aaa_example_error_tag" %] - [% title = "Example Error" %] - This is an example error. The title is set above. This text is the body - of the error. It can contain arbitrary <b>HTML</b>, and also references - to any [% parameters %] which you may have set before calling - ThrowCodeError. - - [% ELSIF error == "action_unrecognized" %] - I don't recognize the value (<em>[% variables.action FILTER html %]</em>) + [% IF error == "action_unrecognized" %] + I don't recognize the value (<em>[% action FILTER html %]</em>) of the <em>action</em> variable. [% ELSIF error == "attachment_already_obsolete" %] @@ -59,16 +57,11 @@ An authorization handler return value was not handled by the login code. [% ELSIF error == "bug_error" %] - Trying to retrieve bug [% bug.bug_id %] returned the error - [% bug.error FILTER html %] - - [% ELSIF error == "cgi_error" %] - [% title = "CGI Error" %] - Bugzilla has had trouble interpreting your CGI request; - [%+ Param('browserbugmessage') %] + Trying to retrieve [% terms.bug %] [%+ bug.bug_id FILTER html %] returned + the error [% bug.error FILTER html %]. [% ELSIF error == "chart_data_not_generated" %] - The tool which gathers bug counts has not been run yet. + The tool which gathers [% terms.bug %] counts has not been run yet. [% ELSIF error == "chart_datafile_corrupt" %] The chart data file [% file FILTER html %] is corrupt. @@ -85,33 +78,30 @@ Run checksetup.pl for installation instructions. [% ELSIF error == "field_type_mismatch" %] - Cannot seem to handle <code>[% field %]</code> + Cannot seem to handle <code>[% field FILTER html %]</code> and <code>[% type FILTER html %]</code> together. - + [% ELSIF error == "gd_not_installed" %] Charts will not work without the GD Perl module being installed. Run checksetup.pl for installation instructions. - [% ELSIF error == "group_bit_invalid" %] - One of the group bits submitted was invalid. - [% ELSIF error == "illegal_content_type_method" %] Your form submission got corrupted somehow. The <em>content method</em> field, which specifies how the content type gets determined, - should have been either <em>autodetect</em>, <em>list</em>, - or <em>manual</em>, but was instead + should have been either <em>autodetect</em>, <em>list</em>, + or <em>manual</em>, but was instead <em>[% contenttypemethod FILTER html %]</em>. - + [% ELSIF error == "illegal_field" %] A legal [% field FILTER html %] was not set. - + [% ELSIF error == "inactive_group" %] - Attempted to add bug to an inactive group, identified by the bit + Attempted to add [% terms.bug %] to an inactive group, identified by the bit '[% bit FILTER html %]'. - + [% ELSIF error == "bad_arg" %] - Bad argument <code>[% argument %]</code> sent to - <code>[% function %]</code> function. + Bad argument <code>[% argument FILTER html %]</code> sent to + <code>[% function FILTER html %]</code> function. [% ELSIF error == "invalid_attach_id_to_obsolete" %] The attachment number of one of the attachments you wanted to obsolete, @@ -137,51 +127,59 @@ [% title = "Invalid Dimensions" %] The width or height specified is not a positive integer. + [% ELSIF error == "invalid_series_id" %] + [% title = "Invalid Series" %] + The series_id [% series_id FILTER html %] is not valid. It may be that + this series has been deleted. + [% ELSIF error == "mismatched_bug_ids_on_obsolete" %] Attachment [% attach_id FILTER html %] ([% description FILTER html %]) - is attached to bug [% attach_bug_id FILTER html %], but you tried to - flag it as obsolete while creating a new attachment to bug - [% my_bug_id FILTER html %]. + is attached to [% terms.bug %] [%+ attach_bug_id FILTER html %], + but you tried to flag it as obsolete while creating a new attachment to + [% terms.bug %] [%+ my_bug_id FILTER html %]. - [% ELSIF error == "no_bug_data" %] - No data when fetching bug [% bug_id %]. - [% ELSIF error == "flag_nonexistent" %] - There is no flag with ID #[% variables.id %]. + There is no flag with ID #[% id FILTER html %]. [% ELSIF error == "flag_status_invalid" %] - The flag status <em>[% variables.status FILTER html %]</em> is invalid. + The flag status <em>[% status FILTER html %]</em> + [% IF id %] + for flag ID #[% id FILTER html %] + [% END %] + is invalid. [% ELSIF error == "flag_type_component_nonexistent" %] - The component <em>[% variables.component FILTER html %]</em> does not exist - in the product <em>[% variables.product FILTER html %]</em>. + The component <em>[% component FILTER html %]</em> does not exist + in the product <em>[% product FILTER html %]</em>. [% ELSIF error == "flag_type_component_without_product" %] A component was selected without a product being selected. [% ELSIF error == "flag_type_id_invalid" %] - The flag type ID <em>[% variables.id FILTER html %]</em> is not + The flag type ID <em>[% id FILTER html %]</em> is not a positive integer. [% ELSIF error == "flag_type_nonexistent" %] - There is no flag type with the ID <em>[% variables.id %]</em>. + There is no flag type with the ID <em>[% id FILTER html %]</em>. [% ELSIF error == "flag_type_product_nonexistent" %] - The product <em>[% variables.product FILTER html %]</em> does not exist. + The product <em>[% product FILTER html %]</em> does not exist. [% ELSIF error == "flag_type_target_type_invalid" %] - The target type was neither <em>bug</em> nor <em>attachment</em> + The target type was neither <em>[% terms.bug %]</em> nor <em>attachment</em> but rather <em>[% variables.target_type FILTER html %]</em>. [% ELSIF error == "invalid_field_name" %] Can't use [% field FILTER html %] as a field name. - [% ELSIF error == "invalid_output_type" %] - [% title = "Invalid Output Type" %] - Invalid output type [% type FILTER html %]. - [% ELSIF error == "missing_bug_id" %] - No bug ID was given. + No [% terms.bug %] ID was given. + + [% ELSIF error == "missing_series_id" %] + Having inserted a series into the database, no series_id was returned for + it. Series: [% series.category FILTER html %] / + [%+ series.subcategory FILTER html %] / + [%+ series.name FILTER html %]. [% ELSIF error == "no_y_axis_defined" %] No Y axis was defined when creating report. The X axis is optional, @@ -194,23 +192,27 @@ The group field <em>[% group FILTER html %]</em> is invalid. [% ELSIF error == "report_axis_invalid" %] - <em>[% variables.val FILTER html %]</em> is not a valid value for - [%+ IF variables.fld == "x" %]the horizontal axis - [%+ ELSIF variables.fld == "y" %]the vertical axis - [%+ ELSIF variables.fld == "z" %]the multiple tables/images + <em>[% val FILTER html %]</em> is not a valid value for + [%+ IF fld == "x" %]the horizontal axis + [%+ ELSIF fld == "y" %]the vertical axis + [%+ ELSIF fld == "z" %]the multiple tables/images [%+ ELSE %]a report axis[% END %] field. [% ELSIF error == "token_generation_error" %] Something is seriously wrong with the token generation system. [% ELSIF error == "template_error" %] - [% template_error_msg %] + [% template_error_msg FILTER html %] [% ELSIF error == "unable_to_retrieve_password" %] I was unable to retrieve your old password from the database. - + [% ELSIF error == "undefined_field" %] - [% field FILTER html %] was not defined; [% Param('browserbugmessage') %] + Form field [% field FILTER html %] was not defined; [% Param('browserbugmessage') %] + [%# Useful message if browser did not select show_bug radio button %] + [% IF field == "knob" %] + Check that the "Leave as..." radio button was selected. + [% END %] [% ELSIF error == "unknown_action" %] [% IF action %] @@ -218,24 +220,22 @@ [% ELSE %] I could not figure out what you wanted to do. [% END %] - + [% ELSIF error == "unknown_component" %] [% title = "Unknown Component" %] - There is no component named <em>[% variables.component FILTER html %]</em>. + There is no component named <em>[% component FILTER html %]</em>. [% ELSIF error == "unknown_product" %] [% title = "Unknown Product" %] - There is no product named <em>[% variables.product FILTER html %]</em>. + There is no product named <em>[% product FILTER html %]</em>. [% ELSE %] - [%# Give sensible error if error functions are used incorrectly. - #%] - You are using Bugzilla's ThrowCodeError() function incorrectly. You - passed in the string '[% error %]'. The correct use is to pass - in a tag, and define that tag in the file code-error.html.tmpl.<br> - <br> - If you are a Bugzilla end-user seeing this message, please save this - page and send it to [% Param('maintainer') %]. + [% title = "Internal error" %] + An internal error has occured, but [% terms.Bugzilla %] doesn't know + what <code>[% error FILTER html %]</code> means. + + If you are a [% terms.Bugzilla %] end-user seeing this message, please save + this page and send it to [% Param('maintainer') %]. [% END %] [% END %] @@ -245,8 +245,8 @@ <tt> <p> - Bugzilla has suffered an internal error. Please save this page and send - it to [% Param("maintainer") %] with details of what you were doing at + [% terms.Bugzilla %] has suffered an internal error. Please save this page and send + it to [% Param("maintainer") %] with details of what you were doing at the time this message appeared. </p> <script type="text/javascript"> <!-- @@ -259,7 +259,7 @@ <tr> <td bgcolor="#ff0000"> <font size="+2"> - [% error_message %] + [% error_message FILTER none %] </font> </td> </tr> diff --git a/template/en/default/global/confirm-user-match.html.tmpl b/template/en/default/global/confirm-user-match.html.tmpl index 037f7385c175c49898b6997c63abe2f709f71f7b..ec4c4f15040b7a4731d14093c036145bed97110d 100644 --- a/template/en/default/global/confirm-user-match.html.tmpl +++ b/template/en/default/global/confirm-user-match.html.tmpl @@ -38,7 +38,7 @@ # self-referential URL #%] -[% # use the global field descs %] +[%# use the global field descs %] [% PROCESS "global/field-descs.none.tmpl" %] [% IF matchsuccess == 1 %] @@ -74,7 +74,7 @@ </td> </tr> - [% # this is messy to allow later expansion %] + [%# this is messy to allow later expansion %] [% FOREACH field = matches %] <tr> @@ -173,7 +173,7 @@ [% IF field_descs.${field_name} %] [% field_descs.${field_name} FILTER html -%] - [%- # ELSIF for things that don't belong in the field_descs hash here -%] + [%-# ELSIF for things that don't belong in the field_descs hash here -%] [% ELSIF field_name.match("^requestee") %] [% fields.${field_name}.flag_type.name %] requestee diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index 6d80864239e326d9cdb7a61444c768e2496d8e8e..7a21ca056a6825988037913234e9d6e3d69fed7e 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -20,12 +20,14 @@ #%] [%# Remember to PROCESS rather than INCLUDE this template. %] - -[% field_descs = { "[Bug creation]" => "[Bug creation]", + +[% PROCESS global/variables.none.tmpl %] + +[% field_descs = { "[Bug creation]" => "[$terms.Bug creation]", "alias" => "Alias", "assigned_to" => "Assignee", "bug_file_loc" => "URL", - "bug_id" => "Bug ID", + "bug_id" => "$terms.Bug ID", "bug_severity" => "Severity", "bug_status" => "Status", "changeddate" => "Last Changed Date", @@ -33,7 +35,7 @@ "cclist_accessible" => "CC list accessible?", "component_id" => "Component ID", "component" => "Component", - "creation_ts" => "Bug Creation time", + "creation_ts" => "$terms.Bug Creation time", "delta_ts" => "Last Changed time", "estimated_time" => "Orig. Est.", "everconfirmed" => "Ever confirmed?", diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl index 6e7aec377eaceb589c846683f66d00065feb76c4..6e220b49e7e26acb3cb73aaba58b9487b94be258 100644 --- a/template/en/default/global/footer.html.tmpl +++ b/template/en/default/global/footer.html.tmpl @@ -25,11 +25,11 @@ #%] [% INCLUDE "global/help.html.tmpl" %] - + [%# Migration note: below this point, this file corresponds to the old Param - # 'footerhtml' + # 'footerhtml' #%] - + <table border="0"> <tr> <td bgcolor="#000000" valign="top"> @@ -37,7 +37,7 @@ bgcolor="lightyellow"> <tr> <td> - + [%# Migration note: the old param 'blurbhtml' goes here %] [%# Migration note: useful-links.html.tmpl corresponds to %commandmenu% %] @@ -50,6 +50,5 @@ </td> </tr> </table> - </body> </html> diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl index 825f3c33389c47ebe67dcd5af393668453af692a..4d9de8684a2a095c240eb4afe7e3570d1e6ea521 100644 --- a/template/en/default/global/header.html.tmpl +++ b/template/en/default/global/header.html.tmpl @@ -40,7 +40,7 @@ [% DEFAULT h2 = "" - h3 = "" + h3 = "" bgcolor = "#ffffff" onload = "" %] @@ -58,33 +58,33 @@ <html> <head> <title>[% title FILTER html %]</title> - + [%# Migration note: contents of the old Param 'headerhtml' would go here %] [% PROCESS "global/site-navigation.html.tmpl" %] - + [% IF javascript %] <script type="text/javascript" language="JavaScript"> [% javascript %] </script> [% END %] - - [%+ INCLUDE "global/help-header.html.tmpl" %] + + [%+ INCLUDE "global/help-header.html.tmpl" %] [% IF style %] <style type="text/css"> [% style %] </style> [% END %] - + [% IF style_urls %] [% FOREACH style_url = style_urls %] <link href="[% style_url %]" rel="stylesheet" type="text/css"> [% END %] [% END %] - + </head> - + [%# Migration note: contents of the old Param 'bodyhtml' go in the body tag, # but set the bgcolor and onload attributes in the DEFAULT directive above. #%] @@ -94,9 +94,9 @@ [%# Migration note: the following file corresponds to the old Param # 'bannerhtml' #%] - + [% INCLUDE global/banner.html.tmpl %] - + [% IF h1 || h2 %] <table border="0" cellspacing="0" width="100%"> <tr> diff --git a/template/en/default/global/hidden-fields.html.tmpl b/template/en/default/global/hidden-fields.html.tmpl index a824c3489cb689c382d3290822a1c276bb2afcb1..b15232a8d729d64d723acf966f6d5ab94f91510d 100644 --- a/template/en/default/global/hidden-fields.html.tmpl +++ b/template/en/default/global/hidden-fields.html.tmpl @@ -26,17 +26,17 @@ # exclude: string; a regular expression matching fields to exclude # from the list of hidden fields generated by this template #%] - + [%# Generate hidden form fields for non-excluded fields. %] [% FOREACH field = form %] [% NEXT IF exclude && field.key.search(exclude) %] [% IF mform.${field.key}.size > 1 %] [% FOREACH mvalue = mform.${field.key} %] <input type="hidden" name="[% field.key FILTER html %]" - value="[% mvalue | html | html_linebreak %]"> + value="[% mvalue FILTER html FILTER html_linebreak %]"> [% END %] [% ELSE %] <input type="hidden" name="[% field.key FILTER html %]" - value="[% field.value | html | html_linebreak %]"> + value="[% field.value FILTER html FILTER html_linebreak %]"> [% END %] [% END %] diff --git a/template/en/default/global/message.html.tmpl b/template/en/default/global/message.html.tmpl index 58cd5690840577fd6cc7c496bb3a22e5d93598de..c411ea3511586ac030ef03de5b83ccbb3ae99413 100644 --- a/template/en/default/global/message.html.tmpl +++ b/template/en/default/global/message.html.tmpl @@ -18,13 +18,15 @@ # # Contributor(s): #%] - + [%# INTERFACE: # url: string. An optional URL to go to. # link: string. The link text for that URL. #%] -[% DEFAULT title = "Bugzilla Message" %] +[% PROCESS global/variables.none.tmpl %] + +[% DEFAULT title = "$terms.Bugzilla Message" %] [% PROCESS global/header.html.tmpl %] diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl index 482f7e35f60caf4e917f00f381cc9df8cfa7939b..41dd71f6cf6a55c0424b9b225459bef769cf3afd 100644 --- a/template/en/default/global/messages.html.tmpl +++ b/template/en/default/global/messages.html.tmpl @@ -18,28 +18,29 @@ # # Contributor(s): Gervase Markham <gerv@gerv.net> #%] - + [%# This is a list of all the possible messages. Please keep them in # alphabetical order by message tag, and leave a blank line between messages. - #%] - + #%] + +[% PROCESS global/variables.none.tmpl %] + [% message_tag = message %] [% message = BLOCK %] - [% IF message_tag == "aaa_example_message_tag" %] - [% title = "Example Message" %] - This is an example message. The title is set above. This text is the body - of the message. It can contain arbitrary <b>HTML</b>, and also references - to any [% parameters %] which you may have set. - - [% ELSIF message_tag == "buglist_adding_field" %] + [% IF message_tag == "buglist_adding_field" %] [% title = "Adding field to query page..." %] [% link = "Click here if the page does not redisplay automatically." %] - [% # --- %] + [% ELSIF message_tag == "buglist_load_named_query" %] - [% title = BLOCK %]Loading your query named [% namedcmd %][% END %] + [% title = BLOCK %] + Loading your query named [% namedcmd FILTER html %] + [% END %] [% link = "Click here if the page does not redisplay automatically." %] - [% # --- %] + + [% ELSIF message_tag == "buglist_updated_named_query" %] + OK, your query named <code>[% queryname FILTER html %]</code> is updated. + [% ELSIF message_tag == "buglist_new_default_query" %] OK, you now have a new default query. You may also bookmark the result of any individual query. @@ -52,6 +53,10 @@ [% link = "Go back to the query page." %] OK, the <b>[% namedcmd FILTER html %]</b> query is gone. + [% ELSIF message_tag == "buglist_sorted_by_relevance" %] + Bugs on this list are sorted by relevance, with the most relevant bugs + at the top. Only the 200 most relevant bugs are shown. + [% ELSIF message_tag == "change_columns" %] [% title = "Change columns" %] Resubmitting your query with new columns... @@ -70,20 +75,21 @@ [% ELSIF message_tag == "email_change_cancelled_reinstated" %] [% title = "Cancel Request to Change Email Address" %] The request to change the email address for the - [% old_email %] account to [% new_email %] has been cancelled. - Your old account settings have been reinstated. + [% old_email FILTER html %] account to + [% new_email FILTER html %] has been cancelled. + Your old account settings have been reinstated. [% ELSIF message_tag == "logged_out" %] [% title = "Logged Out" %] [% url = "query.cgi?GoAheadAndLogIn=1" %] [% link = "Log in again." %] <b>Your login has been forgotten</b>. - The cookie that was remembering your login is now gone. You will be + The cookie that was remembering your login is now gone. You will be prompted for a login the next time it is required. [% ELSIF message_tag == "login_changed" %] - [% title = "Bugzilla Login Changed" %] - Your Bugzilla login has been changed. + [% title = "$terms.Bugzilla Login Changed" %] + Your [% terms.Bugzilla %] login has been changed. [% ELSIF message_tag == "password_change_canceled" %] [% title = "Cancel Request to Change Password" %] @@ -126,19 +132,42 @@ <a href="editflagtypes.cgi">Back to flag types.</a> </p> + [% ELSIF message_tag == "series_already_exists" %] + [% title = "Series Already Exists" %] + A series <em>[% series.category FILTER html %] / + [%+ series.subcategory FILTER html %] / + [%+ series.name FILTER html %]</em> + already exists. If you want to create this series, you will need to give + it a different name. + <br><br> + Go back or + <a href="query.cgi?format=create-series">create another series</a>. + + [% ELSIF message_tag == "series_created" %] + [% title = "Series Created" %] + The series <em>[% series.category FILTER html %] / + [%+ series.subcategory FILTER html %] / + [%+ series.name FILTER html %]</em> + has been created. Note that you may need to wait up to + [% series.frequency * 2 %] days before there will be enough data for a + chart of this series to be produced. + <br><br> + Go back or + <a href="query.cgi?format=create-series">create another series</a>. + [% ELSIF message_tag == "shutdown" %] - [% title = "Bugzilla is Down" %] + [% title = "$terms.Bugzilla is Down" %] [% Param("shutdownhtml") %] [% ELSE %] [%# Give sensible error if error functions are used incorrectly. #%] - You are using Bugzilla's messaging functions incorrectly. You + You are using [% terms.Bugzilla %]'s messaging functions incorrectly. You passed in the string '[% message_tag %]'. The correct use is to pass in a tag, and define that tag in the file messages.html.tmpl.<br> <br> - If you are a Bugzilla end-user seeing this message, please save this - page and send it to [% Param('maintainer') %]. + If you are a [% terms.Bugzilla %] end-user seeing this message, please + save this page and send it to [% Param('maintainer') %]. [% END %] [% END %] diff --git a/template/en/default/global/select-menu.html.tmpl b/template/en/default/global/select-menu.html.tmpl index 7b7fddb29adb0bc2ce6d93a07195f6a51c92f389..f1768d0d564568587981d727150af659449b577f 100644 --- a/template/en/default/global/select-menu.html.tmpl +++ b/template/en/default/global/select-menu.html.tmpl @@ -44,7 +44,7 @@ [% options_type = BLOCK %][% options %][% END %] <select name="[% name FILTER html %]" - [% IF onchange %]onchange="[% onchange %]"[% END %] + [% IF onchange %]onchange="[% onchange FILTER html %]"[% END %] [% IF multiple %] multiple [% IF size %] size="[% size %]" [% END %] [% END %]> [% IF options_type.search("ARRAY") %] [% FOREACH value = options %] diff --git a/template/en/default/global/site-navigation.html.tmpl b/template/en/default/global/site-navigation.html.tmpl index 178a99167839b8b3054344a423977bbd247bdec3..be64c2a86c1a854796d3da9558ac3e0fe4d2e32b 100644 --- a/template/en/default/global/site-navigation.html.tmpl +++ b/template/en/default/global/site-navigation.html.tmpl @@ -21,10 +21,12 @@ #%] [%# INTERFACE: - # bug_list: list of integers. List of bug numbers of current query (if any). + # bug_list: list of integers. List of bug numbers of current query (if any). # bug.bug_id: integer. Number of current bug (for navigation purposes) #%] +[% PROCESS global/variables.none.tmpl %] + [% USE Bugzilla %] [% cgi = Bugzilla.cgi %] @@ -56,14 +58,14 @@ <link rel="Show" title="Dependency Tree" href="showdependencytree.cgi?id=[% bug.bug_id %]"> <link rel="Show" title="Dependency Graph" - href="showdependencygraph.cgi?id=[% bug.bug_id %]"> + href="showdependencygraph.cgi?id=[% bug.bug_id %]"> [% IF use_votes %] <link rel="Show" title="Votes ([% bug.votes %])" href="votes.cgi?action=show_bug&bug_id=[% bug.bug_id %]"> [% END %] - <link rel="Show" title="Bug Activity" + <link rel="Show" title="[% terms.Bug %] Activity" href="show_activity.cgi?id=[% bug.bug_id %]"> <link rel="Show" title="Printer-Friendly Version" href="long_list.cgi?buglist=[% bug.bug_id %]"> @@ -73,9 +75,8 @@ [%# *** Preset Queries *** %] [% IF user.showmybugslink %] [% user_login = user.login FILTER url_quote %] - [% substs = { userid => user_login } %] - <link rel="Preset Queries" title="My Bugs" - href="[% PerformSubsts(Param('mybugstemplate'), substs) %]"> + <link rel="Preset Queries" title="My [% terms.Bugs %]" + href="[% Param('mybugstemplate').replace('%userid%', user_login) %]"> [% END %] [% FOREACH q = user.queries %] diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl index fac714b0e97da09225a37f66215c578f5487c857..135dad987efcdd59604d17575c903cc3a617e4e0 100644 --- a/template/en/default/global/useful-links.html.tmpl +++ b/template/en/default/global/useful-links.html.tmpl @@ -19,22 +19,11 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[%# INTERFACE: - # user: hash. Information about the user. If the user is not logged in, - # user.login is undefined. - # login: string. The user's Bugzilla login email address. - # showmybugslink: boolean. True if user wants My Bugs in the footer. - # queries: list of strings. The names of those of the user's named - # queries which should be displayed in the footer. - # groups: hash. Keys are group names, values are true if user in that group. - # The keys used in this template are - # tweakparams, editcomponents, creategroups, editkeywords, confirm, - # editbugs, editusers. - #%] - [%# Migration note: this whole file corresponds to the old %commandmenu% substitution param in 'footerhtml' %] +[% PROCESS global/variables.none.tmpl %] + <form method="get" action="show_bug.cgi"> <table width="100%"> <tr> @@ -46,19 +35,19 @@ <a href="enter_bug.cgi">New</a> | <a href="query.cgi">Query</a> | - <input type="submit" value="Find"> bug # + <input type="submit" value="Find"> [% terms.bug %] # <input name="id" size="6"> | <a href="report.cgi">Reports</a> - [% IF user.login %] + [% IF user %] [% email = user.login FILTER url_quote %] | <a href="request.cgi?requester=[% email %]&requestee=[% email %]&do_union=1&group=type">My Requests</a> [% ELSE %] | <a href="request.cgi">Requests</a> [% END %] - [% IF user.login && Param('usevotes') %] + [% IF user && Param('usevotes') %] | <a href="votes.cgi?action=show_user">My Votes</a> [% END %] </td> @@ -72,7 +61,7 @@ [% ', <a href="editparams.cgi">parameters</a>' IF user.groups.tweakparams %] [% ', <a href="editusers.cgi">users</a>' IF user.groups.editusers - || user.canblessany %] + || user.can_bless %] [% ', <a href="editproducts.cgi">products</a>' IF user.groups.editcomponents %] [% ', <a href="editflagtypes.cgi">flags</a>' @@ -84,16 +73,22 @@ [% ' | <a href="sanitycheck.cgi">Sanity check</a>' IF user.groups.tweakparams %] - | <a href="relogin.cgi">Log out</a> [% user.login %] + | <a href="relogin.cgi">Log out</a> + [% user.login FILTER html %] </td> </tr> [%# Preset queries %] [% preset_queries = user.showmybugslink %] - [% FOREACH q = user.queries %] - [% SET preset_queries = 1 IF q.linkinfooter %] - [% END %] + [% IF NOT preset_queries %] + [% FOREACH q = user.queries %] + [% IF q.linkinfooter %] + [% preset_queries = 1 %] + [% LAST %] + [% END %] + [% END %] + [% END %] <tr> [% IF preset_queries %] @@ -105,7 +100,7 @@ <td colspan="3"> [% IF user.showmybugslink %] [% filtered_username = user.login FILTER url_quote %] - <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My Bugs</a> + <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a> [% print_pipe = 1 %] [% END %] @@ -114,20 +109,20 @@ [% " | " IF print_pipe %] <a href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER url_quote %]"><nobr>[% q.name FILTER html %]</nobr></a> [% print_pipe = 1 %] - [% END %] + [% END %] [% END %] </td> </tr> - - [% ELSE %] + + [% ELSE %] <td valign="middle" align="right"> [% IF Param('createemailregexp') %] - <a href="createaccount.cgi">New Account</a> | + <a href="createaccount.cgi">New Account</a> | [% END %] <a href="query.cgi?GoAheadAndLogIn=1">Log In</a> </td> </tr> [% END %] - - </table> + + </table> </form> diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 1aaa581b64d5fb230425c95dbc5abd9314e68819..a988102a8177240ee51dfa2a56dd2119d92f4b8f 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -27,10 +27,15 @@ [%# This is a list of all the possible user errors. Please keep them in # alphabetical order by error tag, and leave a blank line between errors. - #%] - + # + # Note that you must explicitly filter every single template variable + # in this file; if you do not wish to change it, use the "none" filter. + #%] + +[% PROCESS global/variables.none.tmpl %] + [% PROCESS "global/field-descs.none.tmpl" %] - + [% DEFAULT title = "Error" %] [% error_message = BLOCK %] @@ -42,11 +47,11 @@ [% ELSIF error == "account_disabled" %] [% title = "Account Disabled" %] - [% disabled_reason %] + [% disabled_reason FILTER none %] <hr> - If you believe your account should be restored, please + If you believe your account should be restored, please send email to [% Param("maintainer") %] explaining why. - + [% ELSIF error == "account_exists" %] [% title = "Account Already Exists" %] There is already an account with @@ -55,10 +60,10 @@ [% ELSE %] that login name. [% END %] - + [% ELSIF error == "account_inexistent" %] [% title = "Account Does Not Exist" %] - There is no Bugzilla account with that login name. + There is no [% terms.Bugzilla %] account with that login name. [% ELSIF error == "alias_has_comma_or_space" %] [% title = "Invalid Characters In Alias" %] @@ -67,22 +72,22 @@ commas or spaces because those characters are used to separate aliases from each other in lists. Please choose another alias that does not contain commas and spaces. - + [% ELSIF error == "alias_in_use" %] [% title = "Alias In Use" %] - [% bug_link %] has already taken the alias + [% bug_link FILTER none %] has already taken the alias <em>[% alias FILTER html %]</em>. Please choose another one. - + [% ELSIF error == "alias_is_numeric" %] [% title = "Alias Is Numeric" %] - You tried to give this bug the alias <em>[% alias FILTER html %]</em>, + You tried to give this [% terms.bug %] the alias <em>[% alias FILTER html %]</em>, but aliases cannot be merely numbers, since they could - then be confused with bug IDs. Please choose another - alias containing at least one letter. - + then be confused with [% terms.bug %] IDs. Please choose another + alias containing at least one letter. + [% ELSIF error == "alias_too_long" %] [% title = "Alias Too Long" %] - Bug aliases cannot be longer than 20 characters. + [% terms.Bug %] aliases cannot be longer than 20 characters. Please choose a shorter alias. [% ELSIF error == "auth_cant_create_account" %] @@ -93,39 +98,41 @@ [% ELSIF error == "authorization_failure" %] [% title = "Authorization Failed" %] - You are not allowed to [% action %]. + You are not allowed to [% action FILTER html %]. [% ELSIF error == "attachment_access_denied" %] [% title = "Access Denied" %] You are not authorized to access this attachment. - + [% ELSIF error == "bug_access_denied" %] [% title = "Access Denied" %] - You are not authorized to access bug #[% bug_id %]. + You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %]. [% ELSIF error == "bug_access_query" %] [% title = "Access Denied" %] - You are not authorized to access bug #[% bug_id %]. To see this bug, you - must first <a href="show_bug.cgi?id=[% bug_id %]&GoAheadAndLogIn=1">log + You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %]. + To see this [% terms.bug %], you must + first <a href="show_bug.cgi?id= + [% bug_id FILTER url_quote %]&GoAheadAndLogIn=1">log in to an account</a> with the appropriate permissions. - + [% ELSIF error == "buglist_parameters_required" %] [% title = "Parameters Required" %] [% url = "query.cgi" %] [% link = "Please use the search form to specify some search criteria." %] This script is not meant to be invoked without any search terms. - + [% ELSIF error == "bugs_not_changed" %] - [% title = "Bugs Not Changed" %] - Um, you apparently did not change anything on the selected bugs. - + [% title = BLOCK %][% terms.Bugs %] Not Changed[% END %] + Um, you apparently did not change anything on the selected [% terms.bugs %]. + [% ELSIF error == "chart_too_large" %] [% title = "Chart Too Large" %] Sorry, but 2000 x 2000 is the maximum size for a chart. - + [% ELSIF error == "comment_required" %] [% title = "Comment Required" %] - You have to specify a <b>comment</b> on this change. + You have to specify a <b>comment</b> on this change. Please give some words on the reason for your change. [% ELSIF error == "comment_too_long" %] @@ -134,81 +141,86 @@ [% ELSIF error == "dependency_loop_multi" %] [% title = "Dependency Loop Detected" %] - The following bug(s) would appear on both the "depends on" + The following [% terms.bug %](s) would appear on both the "depends on" and "blocks" parts of the dependency tree if these changes - are committed: [% both %]. This would create a circular + are committed: [% both FILTER none %]. This would create a circular dependency, which is not allowed. - + [% ELSIF error == "dependency_loop_single" %] [% title = "Dependency Loop Detected" %] - You can't make a bug blocked or dependent on itself. + You can't make [% terms.abug %] blocked or dependent on itself. [% ELSIF error == "dupe_invalid_bug_id" %] - [% title = "Valid Bug Number Required" %] - You must specify a valid bug number of which this bug - is a duplicate. The bug has not been changed. - + [% title = BLOCK %]Valid [% terms.Bug %] Number Required[% END %] + You must specify a valid bug number of which this [% terms.bug %] + is a duplicate. The [% terms.bug %] has not been changed. + [% ELSIF error == "dupe_of_self_disallowed" %] [% title = "Nice Try..." %] - Nice try, [% user.login FILTER html %], but it doesn't - really make sense to mark a bug as a duplicate of itself, + Nice try, [% user.login FILTER html %], but it doesn't + really make sense to mark [% terms.abug %] as a duplicate of itself, does it? - + [% ELSIF error == "email_change_in_progress" %] [% title = "Email Change Already In Progress" %] - Email change already in progress; please check your email. - + Email change already in progress; please check your email. + [% ELSIF error == "email_confirmation_failed" %] [% title = "Email Address Confirmation Failed" %] Email address confirmation failed. [% ELSIF error == "entry_access_denied" %] [% title = "Permission Denied" %] - Sorry; you do not have the permissions necessary to enter a bug against + Sorry; you do not have the permissions necessary to enter [% terms.abug %] against the [% product FILTER html %] product. - + [% ELSIF error == "file_not_specified" %] [% title = "No File Specified" %] You did not specify a file to attach. - + [% ELSIF error == "file_too_large" %] [% title = "File Too Large" %] - The file you are trying to attach is [% filesize %] kilobytes (KB) in size. + The file you are trying to attach is [% filesize FILTER html %] + kilobytes (KB) in size. Non-patch attachments cannot be more than [% Param('maxattachmentsize') %] KB. If your attachment is an image, try converting it to a compressable format like JPG or PNG, or put it elsewhere on the web and - link to it from the bug's URL field or in a comment on the bug. - + link to it from the [% terms.bug %]'s URL field or in a comment on the [% terms.bug %]. + [% ELSIF error == "flag_requestee_unauthorized" %] [% title = "Flag Requestee Not Authorized" %] You asked [% requestee.identity FILTER html %] - for <code>[% flag_type.name FILTER html %]</code> on bug [% bug_id -%] - [% IF attach_id %], attachment [% attach_id %][% END %], but that bug + for <code>[% flag_type.name FILTER html %]</code> on [% terms.bug %] + [% bug_id FILTER html -%] + [% IF attach_id %], attachment [% attach_id FILTER html %][% END %], + but that [% terms.bug %]&bnsp; has been restricted to users in certain groups, and the user you asked - isn't in all the groups to which the bug has been restricted. - Please choose someone else to ask, or make the bug accessible to users + isn't in all the groups to which the [% terms.bug %] has been restricted. + Please choose someone else to ask, or make the [% terms.bug %] accessible to users on its CC: list and add that user to the list. - + [% ELSIF error == "flag_requestee_unauthorized_attachment" %] [% title = "Flag Requestee Not Authorized" %] You asked [% requestee.identity FILTER html %] - for <code>[% flag_type.name FILTER html %]</code> on bug [% bug_id %], - attachment [% attach_id %], but that attachment is restricted to users + for <code>[% flag_type.name FILTER html %]</code> on + [% terms.bug %] [% bug_id FILTER html %], + attachment [% attach_id FILTER html %], but that attachment is restricted + to users in the [% Param("insidergroup") FILTER html %] group, and the user you asked isn't in that group. Please choose someone else to ask, or ask an administrator to add the user to the group. - + [% ELSIF error == "flag_type_cc_list_invalid" %] [% title = "Flag Type CC List Invalid" %] The CC list [% cc_list FILTER html %] must be less than 200 characters long. - + [% ELSIF error == "flag_type_description_invalid" %] [% title = "Flag Type Description Invalid" %] The description must be less than 32K. - + [% ELSIF error == "flag_type_name_invalid" %] [% title = "Flag Type Name Invalid" %] The name <em>[% name FILTER html %]</em> must be 1-50 characters long. @@ -230,11 +242,12 @@ [% ELSIF error == "illegal_attachment_edit" %] [% title = "Unauthorised Action" %] - You are not authorised to edit attachment [% attach_id %]. + You are not authorised to edit attachment [% attach_id FILTER html %]. [% ELSIF error == "illegal_attachment_edit_bug" %] [% title = "Unauthorised Action" %] - You are not authorised to edit attachments on bug [% bug_id %]. + You are not authorised to edit attachments on [% terms.bug %] + [%+ bug_id FILTER html %]. [% ELSIF error == "illegal_attachment_is_patch" %] [% title = "Your Query Makes No Sense" %] @@ -243,10 +256,11 @@ [% ELSIF error == "illegal_change" %] [% title = "Not allowed" %] - You tried to change the <strong>[% field %]</strong> field + You tried to change the + <strong>[% field_descs.$field FILTER html %]</strong> field from <em>[% oldvalue FILTER html %]</em> to <em>[% newvalue FILTER html %]</em>, - but only the owner or submitter of the bug, or a + but only the owner or submitter of the [% terms.bug %], or a sufficiently empowered user, may change that field. [% ELSIF error == "illegal_changed_in_last_x_days" %] @@ -255,7 +269,7 @@ You entered <tt>[% value FILTER html %]</tt>, which isn't. [% ELSIF error == "illegal_date" %] - [% title = "Your Query Makes No Sense" %] + [% title = "Illegal Date" %] '<tt>[% date FILTER html %]</tt>' is not a legal date. [% ELSIF error == "illegal_email_address" %] @@ -266,6 +280,11 @@ It must also not contain any of these special characters: <tt>\ ( ) & < > , ; : " [ ]</tt>, or any whitespace. + [% ELSIF error == "illegal_frequency" %] + [% title = "Too Frequent" %] + Unless you are an administrator, you may not create series which are + run more often than once every [% minimum FILTER html %] days. + [% ELSIF error == "illegal_group_control_combination" %] [% title = "Your Group Control Combination Is Illegal" %] Your group control combination for group " @@ -282,30 +301,44 @@ The name of your query cannot contain any of the following characters: <, >, &. + [% ELSIF error == "illegal_series_creation" %] + You are not authorised to create series. + + [% ELSIF error == "illegal_series_edit" %] + You are not authorised to edit this series. To do this, you must either + be its creator, or an administrator. + + [% ELSIF error == "insufficient_data" %] + [% title = "Insufficient Data" %] + None of the series you selected have any data associated with them, so a + chart cannot be plotted. + [% ELSIF error == "insufficient_data_points" %] We don't have enough data points to make a graph (yet). [% ELSIF error == "insufficient_privs_for_multi" %] [% title = "Insufficient Privileges" %] - Sorry, you do not have sufficient privileges to edit multiple bugs. + Sorry, you do not have sufficient privileges to edit multiple + [% terms.bugs %]. [% ELSIF error == "invalid_attach_id" %] [% title = "Invalid Attachment ID" %] The attachment id [% attach_id FILTER html %] is invalid. [% ELSIF error == "invalid_bug_id" %] - [% title = "Invalid Bug ID" %] - The bug id [% bug_id FILTER html %] is invalid. + [% title = BLOCK %]Invalid [% terms.Bug %] ID[% END %] + The [% terms.bug %] id [% bug_id FILTER html %] is invalid. [% ELSIF error == "invalid_bug_id_non_existent" %] - [% title = "Invalid Bug ID" %] - Bug #[% bug_id %] does not exist. + [% title = BLOCK %]Invalid [% terms.Bug %] ID[% END %] + [% terms.Bug %] #[% bug_id FILTER html %] does not exist. [% ELSIF error == "invalid_bug_id_or_alias" %] - [% title = "Invalid Bug ID" %] - The 'bug number' <em>[% bug_id FILTER html %]</em> is invalid. + [% title = BLOCK %]Invalid [% terms.Bug %] ID[% END %] + The '[% terms.bug %] number' <em>[% bug_id FILTER html %]</em> is invalid. [% IF Param("usebugaliases") %] - It is neither a bug number nor an alias to a bug number. + It is neither [% terms.abug %] number nor an alias to [% terms.abug %] + number. [% END %] If you are trying to use QuickSearch, you need to enable JavaScript in your browser. To help us fix this limitation, add your comments to @@ -319,10 +352,23 @@ [% ELSIF error == "invalid_content_type" %] [% title = "Invalid Content-Type" %] The content type <em>[% contenttype FILTER html %]</em> is invalid. - Valid types must be of the form <em>foo/bar</em> where <em>foo</em> - is either <em>application, audio, image, message, model, multipart, + Valid types must be of the form <em>foo/bar</em> where <em>foo</em> + is either <em>application, audio, image, message, model, multipart, text,</em> or <em>video</em>. + [% ELSIF error == "invalid_context" %] + [% title = "Invalid Context" %] + The context [% context FILTER html %] is invalid (must be a number, + "file" or "patch"). + + [% ELSIF error == "invalid_format" %] + [% title = "Invalid Format" %] + The format "[% format FILTER html %]" is invalid (must be one of + [% FOREACH my_format = formats %] + "[% my_format FILTER html %]" + [% END %] + ). + [% ELSIF error == "invalid_maxrow" %] [% title = "Invalid Max Rows" %] The maximum number of rows, '[% maxrows FILTER html %]', must be a positive @@ -336,7 +382,7 @@ [% title = "Invalid Username" %] The name <tt>[% name FILTER html %]</tt> is not a valid username. Either you misspelled it, or the person has not - registered for a Bugzilla account. + registered for a [% terms.Bugzilla %] account. [% ELSIF error == "invalid_username_or_password" %] [% title = "Invalid Username Or Password" %] @@ -348,17 +394,27 @@ [% ELSIF error == "milestone_required" %] [% title = "Milestone Required" %] - You must determine a target milestone for bug [% bug_id %] + You must determine a target milestone for [% terms.bug %] + [%+ bug_id FILTER html %] if you are going to accept it. Part of accepting - a bug is giving an estimate of when it will be fixed. + [% terms.abug %] is giving an estimate of when it will be fixed. + [% ELSIF error == "misarranged_dates" %] + [% title = "Misarranged Dates" %] + Your start date ([% datefrom FILTER html %]) is after + your end date ([% dateto FILTER html %]). + [% ELSIF error == "missing_attachment_description" %] [% title = "Missing Attachment Description" %] You must enter a description for the attachment. + [% ELSIF error == "missing_category" %] + [% title = "Missing Category" %] + You did not specify a category for this series. + [% ELSIF error == "missing_content_type" %] [% title = "Missing Content-Type" %] - You asked Bugzilla to auto-detect the content type, but + You asked [% terms.Bugzilla %] to auto-detect the content type, but your browser did not specify a content type when uploading the file, so you must enter a content type manually. @@ -383,14 +439,31 @@ You must specify one or more fields in which to search for <tt>[% email FILTER html %]</tt>. + [% ELSIF error == "missing_frequency" %] + [% title = "Missing Frequency" %] + You did not specify a valid frequency for this series. + + [% ELSIF error == "missing_name" %] + [% title = "Missing Name" %] + You did not specify a name for this series. + [% ELSIF error == "missing_query" %] [% title = "Missing Query" %] The query named <em>[% queryname FILTER html %]</em> does not exist. + [% ELSIF error == "must_be_patch" %] + [% title = "Attachment Must Be Patch" %] + Attachment #[% attach_id FILTER html %] must be a patch. + + [% ELSIF error == "missing_subcategory" %] + [% title = "Missing Subcategory" %] + You did not specify a subcategory for this series. + [% ELSIF error == "need_component" %] [% title = "Component Required" %] - You must specify a component to help determine the new owner of these bugs. + You must specify a component to help determine the new owner of these + [% terms.bugs %]. [% ELSIF error == "need_numeric_value" %] [% title = "Numeric Value Required" %] @@ -398,12 +471,13 @@ [% ELSIF error == "need_positive_number" %] [% title = "Positive Number Required" %] - The <em>[% field_descs.$field %]</em> field requires a positive number. + The <em>[% field_descs.$field FILTER html %]</em> field requires a positive + number. [% ELSIF error == "need_product" %] [% title = "Product Required" %] - You must specify a product to help determine the new owner of these bugs. - + You must specify a product to help determine the new owner of these [% terms.bugs %]. + [% ELSIF error == "need_quip" %] [% title = "Quip Required" %] Please enter a quip in the text field. @@ -411,103 +485,108 @@ [% ELSIF error == "new_password_missing" %] [% title = "New Password Missing" %] You must enter a new password. - + [% ELSIF error == "no_axes_defined" %] [% title = "No Axes Defined" %] You didn't define any axes to plot. [% ELSIF error == "no_bugs_chosen" %] - [% title = "No Bugs Chosen" %] - You apparently didn't choose any bugs to modify. + [% title = BLOCK %]No [% terms.Bugs %] Chosen[% END %] + You apparently didn't choose any [% terms.bugs %] to modify. [% ELSIF error == "no_component_change_for_multiple_products" %] [% title = "Action Not Permitted" %] - You cannot change the component for a list of bugs covering more than + You cannot change the component for a list of [% terms.bugs %] covering more than one product. - + [% ELSIF error == "no_components" %] [% title = "No Components" %] - Sorry; there needs to be at least one component for this product in order - to create a new bug. + Sorry; there needs to be at least one component for this product in order + to create a new [% terms.bug %]. [% IF UserInGroup("editcomponents") %] - <a href="editcomponents.cgi">Create a new component</a>. + <a href="editcomponents.cgi">Create a new component</a>. [% ELSE %] - Please contact [% Param("maintainer") %], giving the name of - the product in which you tried to create a new bug. + Please contact [% Param("maintainer") %], giving the name of + the product in which you tried to create a new [% terms.bug %]. [% END %] - + [% ELSIF error == "no_dupe_stats" %] [% title = "Cannot Find Duplicate Statistics" %] - There are no duplicate statistics for today ([% today %]) or yesterday. - + There are no duplicate statistics for today ([% today FILTER html %]) + or yesterday. + [% ELSIF error == "no_dupe_stats_error_today" %] [% title = "Error Reading Today's Dupes File" %] An error occurred opening today's dupes file: [% error_msg FILTER html %]. [% ELSIF error == "no_dupe_stats_error_whenever" %] [% title = "Error Reading Previous Dupes File" %] - An error occurred opening $changedsince days ago ($whenever)'s dupes file: + An error occurred opening [% changedsince FILTER html %] days ago + ([% whenever FILTER html %])'s dupes file: [% error_msg FILTER html %]. - + [% ELSIF error == "no_dupe_stats_error_yesterday" %] [% title = "Error Reading Yesterday's Dupes File" %] - There are no duplicate statistics for today ([% today %]), and an error + There are no duplicate statistics for today ([% today FILTER html %]), + and an error occurred opening yesterday's dupes file: [% error_msg FILTER html %]. - + [% ELSIF error == "no_html_in_quips" %] [% title = "No HTML In Quips" %] - Sorry - for security reasons, support for HTML tags has been turned off + Sorry - for security reasons, support for HTML tags has been turned off in quips. - + [% ELSIF error == "no_new_quips" %] [% title = "No New Quips" %] This site does not permit the addition of new quips. - + [% ELSIF error == "no_page_specified" %] [% title = "No Page Specified" %] You did not specify the id of a page to display. [% ELSIF error == "no_products" %] [% title = "No Products" %] - Either no products have been defined to enter bugs against or you have not + Either no products have been defined to enter [% terms.bugs %] against or you have not been given access to any. - + [% ELSIF error == "old_password_incorrect" %] [% title = "Incorrect Old Password" %] You did not enter your old password correctly. - + [% ELSIF error == "old_password_required" %] [% title = "Old Password Required" %] You must enter your old password to change email address. - + [% ELSIF error == "passwords_dont_match" %] [% title = "Passwords Don't Match" %] The two passwords you entered did not match. - + [% ELSIF error == "password_too_long" %] [% title = "Password Too Long" %] - The password is more than 16 characters long. It must be no more than + The password is more than 16 characters long. It must be no more than 16 characters. - + [% ELSIF error == "password_too_short" %] [% title = "Password Too Short" %] - The password is less than three characters long. It must be at least + The password is less than three characters long. It must be at least three characters. - + [% ELSIF error == "patch_too_large" %] [% title = "File Too Large" %] - The file you are trying to attach is [% filesize %] kilobytes (KB) in size. + The file you are trying to attach is [% filesize FILTER html %] + kilobytes (KB) in size. Patches cannot be more than [% Param('maxpatchsize') %] KB in size. - Try breaking your patch into several pieces. + Try breaking your patch into several pieces. [% ELSIF error == "product_access_denied" %] [% title = "Access Denied" %] You do not have the permissions necessary to access that product. - + [% ELSIF error == "product_edit_denied" %] [% title = "Product Edit Access Denied" %] - You are not permitted to edit bugs in product [% product %]. - + You are not permitted to edit [% terms.bugs %] in product + [% product FILTER html %]. + [% ELSIF error == "query_name_missing" %] [% title = "No Query Name Specified" %] You must enter a name for your query. @@ -522,8 +601,8 @@ [% ELSIF error == "reassign_to_empty" %] [% title = "Illegal Reassignment" %] - You cannot reassign to a bug to nobody. Unless you - intentionally cleared out the "Reassign bug to" + You cannot reassign to [% terms.abug %] to nobody. Unless you + intentionally cleared out the "Reassign [% terms.bug %] to" field, [% Param("browserbugmessage") %] [% ELSIF error == "report_access_denied" %] @@ -532,42 +611,43 @@ [% ELSIF error == "require_component" %] [% title = "Component Needed" %] - You must choose a component to file this bug in. If necessary, + You must choose a component to file this [% terms.bug %] in. If necessary, just guess. - + [% ELSIF error == "require_new_password" %] [% title = "New Password Needed" %] You cannot change your password without submitting a new one. [% ELSIF error == "require_summary" %] [% title = "Summary Needed" %] - You must enter a summary for this bug. - + You must enter a summary for this [% terms.bug %]. + [% ELSIF error == "resolving_remaining_time" %] [% title = "Trying to Resolve with Hours Remaining" %] - You cannot resolve a bug with hours still remaining. Set - Remaining Hours to zero if you want to resolve the bug. + You cannot resolve [% terms.abug %] with hours still remaining. Set + Remaining Hours to zero if you want to resolve the [% terms.bug %]. [% ELSIF error == "sanity_check_access_denied" %] [% title = "Access Denied" %] You do not have the permissions necessary to run a sanity check. - + [% ELSIF error == "sidebar_supports_mozilla_only" %] Sorry - sidebar.cgi currently only supports Mozilla based web browsers. <a href="http://www.mozilla.org">Upgrade today</a>. :-) [% ELSIF error == "too_many_votes_for_bug" %] [% title = "Illegal Vote" %] - You may only use at most [% max %] votes for a single bug in the - <tt>[% prod FILTER html %]</tt> product, but you are trying to use - [% votes %]. - + You may only use at most [% max FILTER html %] votes for a single + [%+ terms.bug %] in the + <tt>[% prod FILTER html %]</tt> product, but you are trying to + use [% votes FILTER html %]. + [% ELSIF error == "too_many_votes_for_product" %] [% title = "Illegal Vote" %] - You may only use at most [% max %] votes for bugs in the - <tt>[% prod FILTER html %]</tt> product, but you are trying to use - [% votes %]. - + You tried to use [% votes FILTER html %] votes, + which exceeds the [% max FILTER html %] vote per [% terms.bug %] limit + for the <tt>[% prod FILTER html %]</tt> product. + [% ELSIF error == "token_inexistent" %] [% title = "Token Does Not Exist" %] The token you submitted does not exist, has expired, or has @@ -575,17 +655,17 @@ [% ELSIF error == "unknown_keyword" %] [% title = "Unknown Keyword" %] - <code>[% keyword FILTER html %]</code> is not a known keyword. + <code>[% keyword FILTER html %]</code> is not a known keyword. The legal keyword names are <a href="describekeywords.cgi">listed here</a>. [% ELSIF error == "unknown_tab" %] [% title = "Unknown Tab" %] <code>[% current_tab_name FILTER html %]</code> is not a legal tab name. - + [% ELSIF error == "votes_must_be_nonnegative" %] [% title = "Votes Must Be Non-negative" %] - Only use non-negative numbers for your bug votes. - + Only use non-negative numbers for your [% terms.bug %] votes. + [% ELSIF error == "wrong_token_for_cancelling_email_change" %] [% title = "Wrong Token" %] That token cannot be used to cancel an email address change. @@ -600,12 +680,13 @@ [% ELSIF error == "value_out_of_range" %] [% title = "Value Out Of Range" %] - Value is out of range for field <em>[% field_descs.$field %]</em>. + Value is out of range for field + <em>[% field_descs.$field FILTER html %]</em>. [% ELSIF error == "zero_length_file" %] [% title = "File Is Empty" %] The file you are trying to attach is empty! - + [% ELSE %] [% title = "Error string not found" %] The user error string <code>[% error FILTER html %]</code> was not found. @@ -622,7 +703,7 @@ <tr> <td bgcolor="#ff0000"> <font size="+2"> - [% error_message %] + [% error_message FILTER none %] </font> </td> </tr> diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..c63d1bf6015fe5bfeb70e5c13b64df9022dbb59d --- /dev/null +++ b/template/en/default/global/variables.none.tmpl @@ -0,0 +1,44 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): + #%] + +[%# This is a list of terms that may be changed to "brand" the Bugzilla + # instance (for example, referring to "bugs" as "issues".) When used, these + # strings are used in several different types of content, and are not + # protected with Template-Toolkit FILTERs. Consequently, no special + # characters are allowed. + # + # Remember to PROCESS rather than INCLUDE this template. + #%] + +[% terms = { + "bug" => "bug", + "Bug" => "Bug", + "abug" = "a bug", + "Abug" = "A bug", + "ABug" = "A Bug", + "bugs" = "bugs", + "Bugs" = "Bugs", + "zeroSearchResults" = "Zarro Boogs found", + "bit" = "bit", + "bits" = "bits", + "Bugzilla" = "Bugzilla" + } +%] diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl index dccf43f58398f1aa0cbf5c364e03593a7ec6bc9d..07712a7085e8cb3f5c9f44c4f54bcaca1f7af0c8 100644 --- a/template/en/default/index.html.tmpl +++ b/template/en/default/index.html.tmpl @@ -25,9 +25,13 @@ # username: string. The login name of the user, if any. #%] -[% PROCESS global/header.html.tmpl - title = 'Bugzilla Main Page' -%] +[% PROCESS global/variables.none.tmpl %] + +[% title = BLOCK %] +[% terms.Bugzilla %] Main Page +[% END %] +[% PROCESS global/header.html.tmpl %] + <script type="text/javascript" language="JavaScript"> <!-- @@ -36,14 +40,14 @@ function addSidebar() { { var sidebarname=window.location.host; if (!/bug/i.test(sidebarname)) - sidebarname="Bugzilla "+sidebarname; + sidebarname="[% terms.Bugzilla %] "+sidebarname; window.sidebar.addPanel (sidebarname, "[% Param('urlbase') %]sidebar.cgi", ""); } else { - var rv = window.confirm ("This page is enhanced for use with Netscape 6. " + "Would you like to upgrade now?"); + var rv = window.confirm ("Your browser does not support the sidebar extension. " + "Would you like to upgrade now?"); if (rv) - document.location.href = "http://home.netscape.com/download/index.html"; + document.location.href = "http://www.mozilla.org/binaries.html"; } } //--> @@ -52,12 +56,12 @@ function addSidebar() { <table width="100%"><tr> <td> - <p>This is where we put in lots of nifty words explaining all about Bugzilla.</p> + <p>This is where we put in lots of nifty words explaining all about [% terms.Bugzilla %].</p> But it all boils down to a choice of: <p> - <a href="query.cgi">Query existing bug reports</a><br> - <a href="enter_bug.cgi">Enter a new bug report</a><br> + <a href="query.cgi">Query existing [% terms.bug %] reports</a><br> + <a href="enter_bug.cgi">Enter a new [% terms.bug %] report</a><br> <a href="report.cgi">Summary reports and charts</a><br> </p><p> [% IF username %] @@ -66,16 +70,16 @@ function addSidebar() { [% ELSE %] <a href="query.cgi?GoAheadAndLogIn=1">Log in to an existing account</a><br> [% IF Param('createemailregexp') %] - <a href="createaccount.cgi">Open a new Bugzilla account</a><br> + <a href="createaccount.cgi">Open a new [% terms.Bugzilla %] account</a><br> [% END %] [% END %] </p><p> <a href="javascript:addSidebar()">Add to Sidebar</a> (Requires Mozilla or Netscape 6)<br> </p> <form name="f" action="show_bug.cgi" method="get" - onsubmit="QuickSearch(f.id.value); return false;"> + onsubmit="QuickSearch(f.id.value); return false;"> <p> - Enter a bug # or some search terms:<br> + Enter a [% terms.bug %] # or some search terms:<br> <input type="text" name="id"> <input type="submit" value="Show"> <a href="quicksearch.html">[Help]</a> diff --git a/template/en/default/list/CVS/Entries b/template/en/default/list/CVS/Entries index 23749ff7fb352baae8e61b26c74e247e738fc9ed..3d496c036d73258cb0d7fb66ba60cffd71640156 100644 --- a/template/en/default/list/CVS/Entries +++ b/template/en/default/list/CVS/Entries @@ -1,11 +1,11 @@ -/change-columns.html.tmpl/1.9/Thu Apr 24 20:49:48 2003//TBUGZILLA-2_17_4 -/edit-multiple.html.tmpl/1.11/Sun Oct 13 04:26:24 2002//TBUGZILLA-2_17_4 -/list-simple.html.tmpl/1.5/Tue May 21 17:53:40 2002//TBUGZILLA-2_17_4 -/list.csv.tmpl/1.2/Tue Dec 17 00:00:46 2002//TBUGZILLA-2_17_4 -/list.html.tmpl/1.11/Thu Apr 24 20:49:48 2003//TBUGZILLA-2_17_4 -/list.js.tmpl/1.1/Tue Apr 1 07:13:19 2003//TBUGZILLA-2_17_4 -/list.rdf.tmpl/1.3/Mon Apr 7 20:13:30 2003//TBUGZILLA-2_17_4 -/quips.html.tmpl/1.9/Wed Jan 15 06:48:17 2003//TBUGZILLA-2_17_4 -/server-push.html.tmpl/1.2/Mon May 6 19:17:19 2002//TBUGZILLA-2_17_4 -/table.html.tmpl/1.12/Thu Apr 24 20:49:48 2003//TBUGZILLA-2_17_4 +/change-columns.html.tmpl/1.11/Sat Sep 6 19:23:19 2003//TBUGZILLA-2_17_5 +/edit-multiple.html.tmpl/1.12/Thu Jul 3 21:31:55 2003//TBUGZILLA-2_17_5 +/list-simple.html.tmpl/1.6/Thu Jul 3 21:31:56 2003//TBUGZILLA-2_17_5 +/list.csv.tmpl/1.3/Thu Jul 3 21:31:55 2003//TBUGZILLA-2_17_5 +/list.html.tmpl/1.14/Sat Sep 6 19:23:19 2003//TBUGZILLA-2_17_5 +/list.js.tmpl/1.1/Tue Apr 1 07:13:19 2003//TBUGZILLA-2_17_5 +/list.rdf.tmpl/1.3/Mon Apr 7 20:13:30 2003//TBUGZILLA-2_17_5 +/quips.html.tmpl/1.11/Thu Jul 3 21:31:57 2003//TBUGZILLA-2_17_5 +/server-push.html.tmpl/1.3/Thu Jul 3 21:31:57 2003//TBUGZILLA-2_17_5 +/table.html.tmpl/1.15/Wed Sep 3 02:03:44 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/list/CVS/Tag b/template/en/default/list/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/list/CVS/Tag +++ b/template/en/default/list/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl index 7730bf78c02d036c18f9620159c7ffe6ad81c20f..d49a152c8fd8359fbfd0c1fdcb53bf76881803c9 100644 --- a/template/en/default/list/change-columns.html.tmpl +++ b/template/en/default/list/change-columns.html.tmpl @@ -3,7 +3,7 @@ # License Version 1.1 (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.mozilla.org/MPL/ - # + # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing @@ -19,12 +19,14 @@ # Contributor(s): Dave Lawrence <dkl@redhat.com> #%] +[% PROCESS global/variables.none.tmpl %] + [% PROCESS global/header.html.tmpl title = "Change Columns" %] <p> - Select the columns you wish to appear in your buglists. Note that + Select the columns you wish to appear in your [% terms.bug %] lists. Note that this feature requires cookies to work. </p> @@ -38,27 +40,29 @@ <form action="colchange.cgi"> <input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]"> [% FOREACH column = masterlist %] - <input type="checkbox" id="[% column %]" name="column_[% column %]" + <input type="checkbox" id="[% column %]" name="column_[% column %]" [% "checked='checked'" IF lsearch(collist, column) != -1 %]> - <label for="[% column %]">[% field_descs.${column} || column %]</label> + <label for="[% column %]"> + [% (field_descs.${column} || column) FILTER html %] + </label> <br> [% END %] - + <p> - <input id="nosplitheader" type="radio" name="splitheader" value="0" + <input id="nosplitheader" type="radio" name="splitheader" value="0" [% "checked='checked'" IF NOT splitheader %]> <label for="nosplitheader"> Normal headers (prettier) </label> <br> - - <input id="splitheader" type="radio" name="splitheader" value="1" + + <input id="splitheader" type="radio" name="splitheader" value="1" [% "checked='checked'" IF splitheader %]> <label for="splitheader"> Stagger headers (often makes list more compact) </label> </p> - + <p> <input type="submit" value="Change Columns"> </p> @@ -67,7 +71,7 @@ <form action="colchange.cgi"> <input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]"> <input type="hidden" name="resetit" value="1"> - <input type="submit" value="Reset to Bugzilla default"> + <input type="submit" value="Reset to [% terms.Bugzilla %] default"> </form> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl index 4d769c5fafff478bf6d444ab6f87d678fc6685aa..f7b40a18f4d5fc912d4269e02ff002ea15108945 100644 --- a/template/en/default/list/edit-multiple.html.tmpl +++ b/template/en/default/list/edit-multiple.html.tmpl @@ -19,6 +19,8 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [% dontchange = "--do_not_change--" %] <input type="hidden" name="dontchange" value="[% dontchange FILTER html %]"> @@ -38,9 +40,9 @@ <hr> <p><font size="-1"> - To change multiple bugs: + To change multiple [% terms.bugs %]: <ol> - <li>Check the bugs you want to change above.</li> + <li>Check the [% terms.bugs %] you want to change above.</li> <li>Make your changes in the form fields below. If the change you are making requires an explanation, include it in the comments box.</li> @@ -53,13 +55,13 @@ <th><label for="product">Product:</label></th> <td> - [% PROCESS selectmenu menuname = "product" + [% PROCESS selectmenu menuname = "product" menuitems = products %] </td> <th><label for="version">Version:</label></th> <td> - [% PROCESS selectmenu menuname = "version" + [% PROCESS selectmenu menuname = "version" menuitems = versions %] </td> @@ -72,7 +74,7 @@ </label> </th> <td> - [% PROCESS selectmenu menuname = "rep_platform" + [% PROCESS selectmenu menuname = "rep_platform" menuitems = platforms %] </td> @@ -82,7 +84,7 @@ </label> </th> <td> - [% PROCESS selectmenu menuname = "priority" + [% PROCESS selectmenu menuname = "priority" menuitems = priorities %] </td> @@ -91,7 +93,7 @@ <th><label for="component">Component:</label></th> <td> - [% PROCESS selectmenu menuname = "component" + [% PROCESS selectmenu menuname = "component" menuitems = components %] </td> @@ -101,7 +103,7 @@ </label> </th> <td> - [% PROCESS selectmenu menuname = "bug_severity" + [% PROCESS selectmenu menuname = "bug_severity" menuitems = severities %] </td> @@ -110,7 +112,7 @@ <th><label for="target_milestone">Target Milestone:</label></th> <td colspan="3"> - [% PROCESS selectmenu menuname = "target_milestone" + [% PROCESS selectmenu menuname = "target_milestone" menuitems = targetmilestones %] </td> @@ -139,9 +141,9 @@ <tr> <th><label for="qa_contact">QA Contact:</label></th> <td colspan="3"> - <input id="qa_contact" - name="qa_contact" - value="[% dontchange FILTER html %]" + <input id="qa_contact" + name="qa_contact" + value="[% dontchange FILTER html %]" size="32"> </td> </tr> @@ -192,9 +194,9 @@ <b>Groupset:</b><br> <table border="1"> <tr> - <th>Don't<br>change<br>this group<br>restriction</td> - <th>Remove<br>bugs<br>from this<br>group</td> - <th>Add<br>bugs<br>to this<br>group</td> + <th>Don't<br>change<br>this group<br>restriction</td> + <th>Remove<br>[% terms.bugs %]<br>from this<br>group</td> + <th>Add<br>[% terms.bugs %]<br>to this<br>group</td> <th>Group Name:</td> </tr> @@ -229,7 +231,7 @@ </table> [% IF foundinactive %] - <font size="-1">(Note: Bugs may not be added to <strike>inactive + <font size="-1">(Note: [% terms.Bugs %] may not be added to <strike>inactive groups</strike>, only removed.)</font><br> [% END %] @@ -245,14 +247,14 @@ [% knum = knum + 1 %] <input id="knob-confirm" type="radio" name="knob" value="confirm"> <label for="knob-confirm"> - Confirm bugs (change status to <b>NEW</b>) + Confirm [% terms.bugs %] (change status to <b>NEW</b>) </label><br> [% END %] [% knum = knum + 1 %] <input id="knob-accept" type="radio" name="knob" value="accept"> <label for="knob-accept"> - Accept bugs (change status to <b>ASSIGNED</b>) + Accept [% terms.bugs %] (change status to <b>ASSIGNED</b>) </label><br> [%# If all the bugs being changed are open, allow the user to close them. %] @@ -264,7 +266,7 @@ [% knum = knum + 1 %] <input id="knob-resolve" type="radio" name="knob" value="resolve"> <label for="knob-resolve"> - Resolve bugs, changing <a href="bug_status.html">resolution</a> to + Resolve [% terms.bugs %], changing <a href="bug_status.html">resolution</a> to </label> <select name="resolution" onchange="document.forms.changeform.knob[[% knum %]].checked=true"> [% FOREACH resolution = resolutions %] @@ -281,38 +283,38 @@ [% IF !bugstatuses.containsany(openstates) %] [% knum = knum + 1 %] <input id="knob-reopen" type="radio" name="knob" value="reopen"> - <label for="knob-reopen">Reopen bugs</label><br> + <label for="knob-reopen">Reopen [% terms.bugs %]</label><br> [% END %] [% IF bugstatuses.size == 1 %] [% IF bugstatuses.contains('RESOLVED') %] [% knum = knum + 1 %] <input id="knob-verify" type="radio" name="knob" value="verify"> - <label for="knob-verify">Mark bugs as <b>VERIFIED</b></label><br> + <label for="knob-verify">Mark [% terms.bugs %] as <b>VERIFIED</b></label><br> [% ELSIF bugstatuses.contains('VERIFIED') %] [% knum = knum + 1 %] <input id="knob-close" type="radio" name="knob" value="close"> - <label for="knob-close">Mark bugs as <b>CLOSED</b></label><br> + <label for="knob-close">Mark [% terms.bugs %] as <b>CLOSED</b></label><br> [% END %] [% END %] [% knum = knum + 1 %] <input id="knob-reassign" type="radio" name="knob" value="reassign"> <label for="knob-reassign"><a href="bug_status.html#assigned_to"> - Reassign</a> bugs to + Reassign</a> [% terms.bugs %] to </label> -<input name="assigned_to" +<input name="assigned_to" value="[% user.login FILTER html %]" onchange="document.forms.changeform.knob[[% knum %]].checked = true;" size="32"><br> [% knum = knum + 1 %] -<input id="knob-reassignbycomponent" - type="radio" - name="knob" +<input id="knob-reassignbycomponent" + type="radio" + name="knob" value="reassignbycomponent"> <label for="knob-reassignbycomponent"> - Reassign bugs to owner of selected component + Reassign [% terms.bugs %] to owner of selected component </label><br> <input type="submit" value="Commit"> diff --git a/template/en/default/list/list-simple.html.tmpl b/template/en/default/list/list-simple.html.tmpl index 25c8c82ec412f751efc3c860eb3e79f98d3d6974..0ca3e976c7c6c62c0df663ffec5b2b4f0a5439f5 100644 --- a/template/en/default/list/list-simple.html.tmpl +++ b/template/en/default/list/list-simple.html.tmpl @@ -23,11 +23,13 @@ # title: string. The title for this page. (optional) #%] +[% PROCESS global/variables.none.tmpl %] + [%############################################################################%] [%# Initialization #%] [%############################################################################%] -[% DEFAULT title = "Bug List" %] +[% DEFAULT title = "$terms.Bug List" %] [% title = title FILTER html %] @@ -44,7 +46,7 @@ <body> [% IF bugs.size == 0 %] - <h3>Zarro Boogs found.</h3> + <h3>[% terms.zeroSearchResults %].</h3> [% ELSE %] [% PROCESS list/table.html.tmpl %] [% END %] diff --git a/template/en/default/list/list.csv.tmpl b/template/en/default/list/list.csv.tmpl index e2b3d1583c5e96a8df12d63d3ca5946c79c3df08..cb6bb6708dd168475d5de3b31ae17f632d3047a4 100644 --- a/template/en/default/list/list.csv.tmpl +++ b/template/en/default/list/list.csv.tmpl @@ -20,6 +20,8 @@ # Gervase Markham <gerv@gerv.net> #%] +[% PROCESS global/variables.none.tmpl %] + bug_id, [% FOREACH column = displaycolumns %] [% column FILTER csv %], @@ -30,5 +32,5 @@ bug_id, [% FOREACH column = displaycolumns %] [% bug.$column FILTER csv %], [% END %] - + [% END %] diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl index 91a5584cfd688791f79699f3d4dc846d627ae543..a61bdef9810826688eb51115dc0481fed19089fa 100644 --- a/template/en/default/list/list.html.tmpl +++ b/template/en/default/list/list.html.tmpl @@ -23,9 +23,12 @@ [%# Template Initialization #%] [%############################################################################%] -[% DEFAULT title = "Bug List" %] +[% PROCESS global/variables.none.tmpl %] + +[% DEFAULT title = "$terms.Bug List" %] [% style_urls = [ "css/buglist.css" ] %] [% qorder = order FILTER url_quote IF order %] +[% message = "buglist_sorted_by_relevance" IF sorted_by_relevance %] [%############################################################################%] @@ -45,7 +48,7 @@ [% END %] [% IF Param('enablequips') != 'off' %] - [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %] + [% DEFAULT quip = "$terms.Bugzilla would like to put a random quip here, but no one has entered any." %] <a href="quips.cgi"><i>[% quip FILTER html %]</i></a> [% END %] @@ -53,8 +56,8 @@ [% IF toolong %] <h2> - This list is too long for Bugzilla's little mind; the - Next/Prev/First/Last buttons won't appear on individual bugs. + This list is too long for [% terms.Bugzilla %]'s little mind; the + Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %]. </h2> [% END %] @@ -66,7 +69,7 @@ [%############################################################################%] [% IF bugs.size > 9 %] - [% bugs.size %] bugs found. + [% bugs.size %] [% terms.bugs %] found. [% END %] @@ -91,18 +94,18 @@ [%############################################################################%] [% IF bugs.size == 0 %] - Zarro Boogs found. + [% terms.zeroSearchResults %]. <p> <a href="query.cgi">Query Page</a> - <a href="enter_bug.cgi">Enter New Bug</a> + <a href="enter_bug.cgi">Enter New [% terms.Bug %]</a> <a href="query.cgi?[% urlquerypart FILTER html %]">Edit this query</a> </p> [% ELSIF bugs.size == 1 %] - One bug found. + One [% terms.bug %] found. [% ELSE %] - [% bugs.size %] bugs found. + [% bugs.size %] [% terms.bugs %] found. [% END %] @@ -116,7 +119,7 @@ [% IF dotweak %] [% PROCESS "list/edit-multiple.html.tmpl" %] - + </form> <hr> @@ -140,13 +143,15 @@ [% IF bugs.size > 1 && caneditbugs && !dotweak %] <a href="buglist.cgi?[% urlquerypart FILTER html %] - [%- "&order=$qorder" FILTER html IF order %]&tweak=1">Change Several - Bugs at Once</a> + [%- "&order=$qorder" FILTER html IF order %]&tweak=1">Change Several + [% terms.Bugs %] at Once</a> [% END %] [% IF bugowners %] - <a href="mailto:[% bugowners %]">Send Mail to Bug Owners</a> + <a href="mailto:[% bugowners FILTER html %]">Send + Mail to [% terms.Bug %] Owners</a> + [% END %] <a href="query.cgi? diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl index 4a6ef1ad50fe2e6db55ede9a3b069ca97046327d..661f7595b043ab71de0411874288fcfa59eed8ce 100644 --- a/template/en/default/list/quips.html.tmpl +++ b/template/en/default/list/quips.html.tmpl @@ -20,14 +20,16 @@ #%] [%# INTERFACE: - # added_quip: string. Defined if the CGI added a quip data before + # added_quip: string. Defined if the CGI added a quip data before # displaying anything; if defined, its value is that quip. # show_quips: boolean. True if we are showing the entire quip list. # quips: list of strings. Defined iff show_quips is true. List of all quips. #%] +[% PROCESS global/variables.none.tmpl %] + [% PROCESS global/header.html.tmpl - title = "Bugzilla Quip System" + title = "$terms.Bugzilla Quip System" h1 = "Add your own clever headline" %] @@ -35,7 +37,7 @@ <p> <font color="red"> Your quip '<tt>[% added_quip FILTER html %]</tt>' has been added. - [% IF Param("enablequips") == "approved" AND !UserInGroup('admin') %] + [% IF Param("enablequips") == "approved" AND !user.groups.admin %] It will be used as soon as it gets approved. [% END %] </font> @@ -55,10 +57,10 @@ [% END %] <p> - Bugzilla will pick a random quip for the headline on each bug list, and - you can extend the quip list. Type in something clever or funny or boring + [% terms.Bugzilla %] will pick a random quip for the headline on each [% terms.bug %] list, and + you can extend the quip list. Type in something clever or funny or boring (but not obscene or offensive, please) and bonk on the button. - [% IF Param("enablequips") == "approved" AND !UserInGroup('admin') %] + [% IF Param("enablequips") == "approved" AND !user.groups.admin %] Note that your quip has to be approved before it is used. [% END %] </p> @@ -141,8 +143,8 @@ [% END %] [% ELSE %] <p> - Those who like their wisdom in large doses can - <a href="quips.cgi?action=show">view + Those who like their wisdom in large doses can + <a href="quips.cgi?action=show">view [% IF UserInGroup('admin') %] and edit [% END %] diff --git a/template/en/default/list/server-push.html.tmpl b/template/en/default/list/server-push.html.tmpl index 9b7131654d03850f41febc1706fccdbe7c32679a..377a4378662b0faa13f3786858f29cf36c2ac3a9 100644 --- a/template/en/default/list/server-push.html.tmpl +++ b/template/en/default/list/server-push.html.tmpl @@ -23,10 +23,12 @@ # debug: boolean. True if we want the query displayed while we wait. # query: string. The SQL query which makes the buglist. #%] - + +[% PROCESS global/variables.none.tmpl %] + <html> <head> - <title>Bugzilla is pondering your query</title> + <title>[% terms.Bugzilla %] is pondering your query</title> </head> <body> <h1 style="margin-top: 20%; text-align: center;">Please stand by ...</h1> diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl index 53eb52b2d896a3ab32ee3a847f14ed13e836ed64..99be512578e8a829df09387280f22e7516b07521 100644 --- a/template/en/default/list/table.html.tmpl +++ b/template/en/default/list/table.html.tmpl @@ -76,14 +76,21 @@ <colgroup> <col class="bz_id_column"> [% FOREACH id = displaycolumns %] - <col class="bz_[% id %]_column"> + <col class="bz_[% id FILTER css_class_quote %]_column"> [% END %] </colgroup> <tr align="left"> + [% IF dotweak %] + <th> </th> + [% END %] <th colspan="[% splitheader ? 2 : 1 %]"> - <a href="buglist.cgi? - [% urlquerypart FILTER html %]&order=bugs.bug_id">ID</a> + [% IF sorted_by_relevance %] + ID + [% ELSE %] + <a href="buglist.cgi? + [% urlquerypart FILTER html %]&order=bugs.bug_id">ID</a> + [% END %] </th> [% IF splitheader %] @@ -116,10 +123,14 @@ [% BLOCK columnheader %] <th colspan="[% splitheader ? 2 : 1 %]"> - <a href="buglist.cgi?[% urlquerypart FILTER html %]&order= - [% column.name FILTER url_quote FILTER html %] - [% ",$qorder" FILTER html IF order %]"> - [%- abbrev.$id.title || field_descs.$id || column.title -%]</a> + [% IF sorted_by_relevance %] + [%- abbrev.$id.title || field_descs.$id || column.title -%] + [% ELSE %] + <a href="buglist.cgi?[% urlquerypart FILTER html %]&order= + [% column.name FILTER url_quote FILTER html %] + [% ",$qorder" FILTER html IF order %]"> + [%- abbrev.$id.title || field_descs.$id || column.title -%]</a> + [% END %] </th> [% END %] @@ -136,10 +147,18 @@ [% tableheader %] [% END %] - <tr class="bz_[% bug.bug_severity %] bz_[% bug.priority %] [%+ "bz_secure" IF bug.isingroups %]"> + <tr class="bz_[% bug.bug_severity FILTER css_class_quote %] + bz_[% bug.priority FILTER css_class_quote %] + bz_[% bug.bug_status FILTER css_class_quote %] + bz_[% bug.resolution FILTER css_class_quote %] + [%+ "bz_secure" IF bug.isingroups %]"> + [% IF dotweak %] + <td> + <input type="checkbox" name="id_[% bug.bug_id %]"> + </td> + [% END %] <td> - [% IF dotweak %]<input type="checkbox" name="id_[% bug.bug_id %]">[% END %] <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> </td> diff --git a/template/en/default/pages/CVS/Entries b/template/en/default/pages/CVS/Entries index a4d2d0fea396628e00ac9f6763f8cccbc2d73ee4..fc0c85d3d0f03c6043659d54be6bd0b2f206bec2 100644 --- a/template/en/default/pages/CVS/Entries +++ b/template/en/default/pages/CVS/Entries @@ -1,3 +1,3 @@ -/linked.html.tmpl/1.3/Thu Nov 28 10:49:58 2002//TBUGZILLA-2_17_4 -/linkify.html.tmpl/1.2/Thu Sep 26 23:31:52 2002//TBUGZILLA-2_17_4 +/linked.html.tmpl/1.3/Thu Nov 28 10:49:58 2002//TBUGZILLA-2_17_5 +/linkify.html.tmpl/1.3/Thu Jul 3 21:31:59 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/pages/CVS/Tag b/template/en/default/pages/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/pages/CVS/Tag +++ b/template/en/default/pages/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/pages/linkify.html.tmpl b/template/en/default/pages/linkify.html.tmpl index dd45c8fe2abec0d55aba5bd7ec35920c4bad534d..e205707e47b19465136eb8b6302d4bf70c0b1a4a 100644 --- a/template/en/default/pages/linkify.html.tmpl +++ b/template/en/default/pages/linkify.html.tmpl @@ -20,17 +20,18 @@ # Gervase Markham <gerv@gerv.net> #%] +[% PROCESS global/variables.none.tmpl %] [% INCLUDE global/header.html.tmpl title = "Linkify Text" %] <p> - If you enter some text, this form will return it marked up like a - standard Bugzilla comment. That is, valid bug numbers, URLs, email addresses - and so on will be replaced with appropriate HTML links. + If you enter some text, this form will return it marked up like a + standard [% terms.Bugzilla %] comment. That is, valid [% terms.bug %] numbers, + URLs, email addresses and so on will be replaced with appropriate HTML links. </p> <form action="page.cgi" method="post"> <textarea cols="80" rows="20" name="text" wrap="hard"></textarea> - <br> + <br> <input type="hidden" name="id" value="linked.html"> <input value="Linkify" type="submit"> </form> diff --git a/template/en/default/reports/CVS/Entries b/template/en/default/reports/CVS/Entries index 091dbb552c08691ddba311863b70b19f4ea9fa0e..fc108f01e7362e9b345b06b004ddcf0442e039b3 100644 --- a/template/en/default/reports/CVS/Entries +++ b/template/en/default/reports/CVS/Entries @@ -1,15 +1,22 @@ -/components.html.tmpl/1.6/Thu May 30 19:54:55 2002//TBUGZILLA-2_17_4 -/duplicates-simple.html.tmpl/1.1/Fri Apr 26 23:18:53 2002//TBUGZILLA-2_17_4 -/duplicates-table.html.tmpl/1.6/Sat Nov 16 10:07:13 2002//TBUGZILLA-2_17_4 -/duplicates.html.tmpl/1.10/Thu Apr 24 20:49:50 2003//TBUGZILLA-2_17_4 -/duplicates.rdf.tmpl/1.1/Tue Nov 5 01:54:15 2002//TBUGZILLA-2_17_4 -/keywords.html.tmpl/1.4/Wed Apr 24 18:27:43 2002//TBUGZILLA-2_17_4 -/menu.html.tmpl/1.2/Tue Oct 29 07:44:09 2002//TBUGZILLA-2_17_4 -/report-bar.png.tmpl/1.3/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 -/report-line.png.tmpl/1.3/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 -/report-pie.png.tmpl/1.3/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 -/report-table.csv.tmpl/1.3/Tue Nov 26 21:09:09 2002//TBUGZILLA-2_17_4 -/report-table.html.tmpl/1.7/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 -/report.csv.tmpl/1.2/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 -/report.html.tmpl/1.4/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_4 +/chart.csv.tmpl/1.1/Wed Jun 25 23:23:01 2003//TBUGZILLA-2_17_5 +/chart.html.tmpl/1.1/Wed Jun 25 23:23:01 2003//TBUGZILLA-2_17_5 +/chart.png.tmpl/1.1/Wed Jun 25 23:23:01 2003//TBUGZILLA-2_17_5 +/components.html.tmpl/1.7/Sat Sep 6 19:23:15 2003//TBUGZILLA-2_17_5 +/create-chart.html.tmpl/1.1/Wed Jun 25 23:23:02 2003//TBUGZILLA-2_17_5 +/duplicates-simple.html.tmpl/1.3/Sat Sep 6 19:23:16 2003//TBUGZILLA-2_17_5 +/duplicates-table.html.tmpl/1.9/Sun Oct 26 14:01:04 2003//TBUGZILLA-2_17_5 +/duplicates.html.tmpl/1.13/Sun Oct 26 14:01:04 2003//TBUGZILLA-2_17_5 +/duplicates.rdf.tmpl/1.1/Tue Nov 5 01:54:15 2002//TBUGZILLA-2_17_5 +/edit-series.html.tmpl/1.1/Wed Jun 25 23:23:02 2003//TBUGZILLA-2_17_5 +/keywords.html.tmpl/1.5/Thu Jul 3 21:32:02 2003//TBUGZILLA-2_17_5 +/menu.html.tmpl/1.4/Thu Jul 3 21:32:02 2003//TBUGZILLA-2_17_5 +/report-bar.png.tmpl/1.4/Thu Jul 3 21:32:03 2003//TBUGZILLA-2_17_5 +/report-line.png.tmpl/1.4/Thu Jul 3 21:32:03 2003//TBUGZILLA-2_17_5 +/report-pie.png.tmpl/1.3/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_5 +/report-table.csv.tmpl/1.5/Sat Sep 6 19:23:16 2003//TBUGZILLA-2_17_5 +/report-table.html.tmpl/1.8/Sat Sep 6 19:23:16 2003//TBUGZILLA-2_17_5 +/report.csv.tmpl/1.2/Mon Jan 6 07:54:22 2003//TBUGZILLA-2_17_5 +/report.html.tmpl/1.8/Sun Sep 14 23:00:08 2003//TBUGZILLA-2_17_5 +/series-common.html.tmpl/1.1/Wed Jun 25 23:23:01 2003//TBUGZILLA-2_17_5 +/series.html.tmpl/1.1/Wed Jun 25 23:23:01 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/reports/CVS/Tag b/template/en/default/reports/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/reports/CVS/Tag +++ b/template/en/default/reports/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/reports/chart.csv.tmpl b/template/en/default/reports/chart.csv.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..83620bf08c744c249ed2ad819390f6057030a3d7 --- /dev/null +++ b/template/en/default/reports/chart.csv.tmpl @@ -0,0 +1,40 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[% data = chart.data %] +Date\Series, +[% FOREACH label = chart.labels %] + [% label FILTER csv %][% "," UNLESS loop.last %] +[% END %] +[%# The data, which is in the correct format for GD, is conceptually the wrong + # way round for CSV output. So, we need to invert it here, which is why + # these loops aren't just plain FOREACH. + #%] +[% i = 0 %] +[% WHILE i < data.0.size %] + [% j = 0 %] + [% WHILE j < data.size %] + [% data.$j.$i %][% "," UNLESS (j == data.size - 1) %] + [% j = j + 1 %] + [% END %] + [% i = i + 1 %] + +[% END %] diff --git a/template/en/default/reports/chart.html.tmpl b/template/en/default/reports/chart.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..95d52d7250680a9842b31148312460e2eb9629b4 --- /dev/null +++ b/template/en/default/reports/chart.html.tmpl @@ -0,0 +1,66 @@ + <!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + #%] + +[% DEFAULT width = 600 + height = 350 +%] + +[% PROCESS global/header.html.tmpl + title = "Chart" + h3 = time2str("%Y-%m-%d %H:%M:%S", time) +%] + +<div align="center"> + + [% imageurl = BLOCK %]chart.cgi? + [% imagebase FILTER html %]&ctype=png&action=plot&width= + [% width %]&height=[% height -%] + [% END %] + + <img alt="Graphical report results" src="[% imageurl %]" + width="[% width %]" height="[% height %]"> + <p> + [% sizeurl = BLOCK %]chart.cgi? + [% imagebase FILTER html %]&action=wrap + [% END %] + <a href="[% sizeurl %]&width=[% width %]&height= + [% height + 100 %]">Taller</a><br> + <a href="[% sizeurl %]&width=[% width - 100 %]&height= + [% height %]">Thinner</a> * + <a href="[% sizeurl %]&width=[% width + 100 %]&height= + [% height %]">Fatter</a> <br> + <a href="[% sizeurl %]&width=[% width %]&height= + [% height - 100 %]">Shorter</a><br> + </p> + + <p> + <a href="chart.cgi? + [% imagebase FILTER html %]&ctype=csv&action=plot">CSV</a> | + <a href="chart.cgi?[% imagebase FILTER html %]&action=assemble">Edit + this chart</a> + </p> + +</div> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/chart.png.tmpl b/template/en/default/reports/chart.png.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..43d4e962dfbfbcf8accadeae8c812b252bcb4f3f --- /dev/null +++ b/template/en/default/reports/chart.png.tmpl @@ -0,0 +1,56 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[% y_label = "Bugs" %] +[% x_label = "Time" %] + +[% IF cumulate %] + [% USE graph = GD.Graph.area(width, height) %] + [% graph.set(cumulate => "true") %] +[% ELSE %] + [% USE graph = GD.Graph.lines(width, height) %] +[% END %] + +[% FILTER null; + x_label_skip = (30 * chart.data.0.size / width); + + graph.set(x_label => x_label, + y_label => y_label, + y_tick_number => 8, + x_label_position => 0.5, + x_labels_vertical => 1, + x_label_skip => x_label_skip, + legend_placement => "RT", + line_width => 2); + + # Workaround for the fact that set_legend won't take chart.labels directly, + # because chart.labels is an array reference rather than an array. + graph.set_legend(chart.labels.0, chart.labels.1, chart.labels.2, + chart.labels.3, chart.labels.4, chart.labels.5, + chart.labels.6, chart.labels.7, chart.labels.8, + chart.labels.9, chart.labels.10, chart.labels.11, + chart.labels.12, chart.labels.13, chart.labels.14, + chart.labels.15); + + graph.plot(chart.data).png | stdout(1); + END; +-%] + diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl index b6d5010d0fd701294979f62d1bd101c09ac40114..d1af07392dc9c291cd02c4348dc730f8632bcf47 100644 --- a/template/en/default/reports/components.html.tmpl +++ b/template/en/default/reports/components.html.tmpl @@ -79,13 +79,15 @@ <a name="[% comp.name FILTER html %]">[% comp.name FILTER html %]</a> </td> <td> - <a href="mailto:[% comp.initialowner %][% Param('emailsuffix') %]"> + <a href="mailto:[% comp.initialowner FILTER html %] + [% Param('emailsuffix') %]"> [% comp.initialowner FILTER html %]</a> </td> [% IF Param("useqacontact") %] <td> - <a href="mailto:[% comp.initialqacontact %][% Param('emailsuffix') %]"> - [% comp.initialqacontact %]</a> + <a href="mailto:[% comp.initialqacontact FILTER html %] + [% Param('emailsuffix') %]"> + [% comp.initialqacontact FILTER html %]</a> </td> [% END %] </tr> diff --git a/template/en/default/reports/create-chart.html.tmpl b/template/en/default/reports/create-chart.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..fe0b4a76ceac74944b73ecb7082463510c7ce826 --- /dev/null +++ b/template/en/default/reports/create-chart.html.tmpl @@ -0,0 +1,281 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + # chart: Chart object representing the currently assembled chart. + # category: hash (keyed by category) of hashes (keyed by subcategory) of + # hashes (keyed by name), with value being the series_id of the + # series. Contains details of all series the user can see. + #%] + +[% PROCESS global/header.html.tmpl + title = "Create Chart" +%] + +[% PROCESS "reports/series-common.html.tmpl" + donames = 1 +%] + +<script> +[%# This function takes necessary action on selection of a subcategory %] +function subcatSelected() { + var cat = document.chartform.category.value; + var subcat = document.chartform.subcategory.value; + var names = series[cat][subcat]; + + var namewidget = document.chartform.name; + + namewidget.options.length = 0; + var i = 0; + + for (x in names) { + namewidget.options[i] = new Option(x, names[x]); + i++; + } + + namewidget.options[0].selected = true; + + checkNewState(); +} +</script> + +[% gttext = "Grand Total" %] + +<h3>Current Data Sets:</h3> + +<form method="get" action="chart.cgi" name="chartform"> + [% IF chart.lines.size > 0 %] + <table border="0" cellspacing="2" cellpadding="2"> + <tr> + <th>Select</th> + <th>As</th> + <th></th> + <th>Data Set</th> + <th>Subs</th> + <th></th> + </tr> + + [%# The external loop has two counters; one which keeps track of where we + # are in the old labels array, and one which keeps track of the new + # indexes for the form elements. They are different if chart.lines has + # empty slots in it. + #%] + [% labelidx = 0 %] + [% newidx = 0 %] + + [% FOREACH line = chart.lines %] + [% IF NOT line %] + [%# chart.lines has an empty slot, so chart.labels will too. We + # increment labelidx only to keep the labels in sync with the data. + #%] + [% labelidx = labelidx + 1 %] + [% NEXT %] + [% END %] + + [% FOREACH series = line %] + <tr> + [% IF loop.first %] + <td align="center" rowspan="[% line.size %]"> + <input type="checkbox" value="1" name="select[% newidx %]"> + </td> + <td rowspan="[% line.size %]"> + <input type="text" size="20" name="label[% newidx %]" + value="[% (chart.labels.$labelidx OR series.name) + FILTER html %]"> + </td> + [% END %] + + <td> + [% "{" IF line.size > 1 %] + </td> + + <td> + <a href="buglist.cgi?cmdtype=dorem&namedcmd= + [% series.category FILTER html %]- + [% series.subcategory FILTER html %]- + [% series.name FILTER html -%]&series_id= + [% series.series_id %]&remaction=runseries"> + [% series.category FILTER html %] / + [%+ series.subcategory FILTER html %] / + [%+ series.name FILTER html %] + </a> + <input type="hidden" name="line[% newidx %]" + value="[% series.series_id %]"> + </td> + + <td> + [% IF series.creator != 0 %] + [% IF series.subscribed %] + <input type="submit" value="Unsubscribe" style="width: 12ex;" + name="action-unsubscribe[% series.series_id %]"> + [% ELSE %] + <input type="submit" value="Subscribe" style="width: 12ex;" + name="action-subscribe[% series.series_id %]"> + [% END %] + [% END %] + </td> + + <td align="center"> + [% IF user.userid == series.creator OR UserInGroup("admin") %] + <a href="chart.cgi?action=edit&series_id= + [% series.series_id %]">Edit</a> + [% END %] + </td> + </tr> + [% END %] + [% labelidx = labelidx + 1 %] + [% newidx = newidx + 1 %] + [% END %] + + [% IF chart.gt %] + <tr> + <td align="center"> + <input type="checkbox" value="1" name="select65536"> + <input type="hidden" value="1" name="gt"> + </td> + <td> + <input type="text" size="20" name="labelgt" + value="[% (chart.labelgt OR gttext) FILTER html %]"> + </td> + <td></td> + <td> + <i>[% gttext FILTER html %]</i> + </td> + <td></td> + <td></td> + </tr> + [% END %] + <tr> + <td colspan="6"> </td> + </tr> + + <tr> + <td valign="bottom" style="text-align: center;"> + <input type="submit" name="action-sum" value="Sum" + style="width: 5em;"><br> + <input type="submit" name="action-remove" value="Remove" + style="width: 5em;"> + </td> + + <td style="text-align: right; vertical-align: bottom;"> + <b>Cumulate:</b> + <input type="checkbox" name="cumulate" value="1"> + </td> + + <td></td> + <td valign="bottom"> + <b>Date Range:</b> + <input type="text" size="12" name="datefrom" + value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom%]"> + <b>to</b> + <input type="text" size="12" name="dateto" + value="[% time2str("%Y-%m-%d", chart.dateto) IF chart.dateto %]"> + </td> + + <td valign="bottom"> + </td> + + <td style="text-align: right" valign="bottom"> + <input type="submit" name="action-wrap" value="Chart" + style="width: 5em;"> + </td> + </tr> + </table> + [% ELSE %] + <p><i>None</i></p> + [% END %] + +<h3>Select Data Sets:</h3> + + <table cellpadding="2" cellspacing="2" border="0"> + [% IF NOT category OR category.size == 0 %] + <tr> + <td> + <i>You do not have permissions to see any data sets, or none + exist.</i> + </td> + </tr> + [% ELSE %] + <tr> + <th>Category:</th> + <noscript><th></th></noscript> + <th>Sub-category:</th> + <noscript><th></th></noscript> + <th>Name:</th> + <th><br> + </th> + </tr> + <tr> + + [% PROCESS series_select sel = { name => 'category', + size => 5, + onchange = "catSelected(); + subcatSelected();" } %] + + <noscript> + <td> + <input type="submit" name="action-assemble" value="Update -->"> + </td> + </noscript> + + [% PROCESS series_select sel = { name => 'subcategory', + size => 5, + onchange = "subcatSelected()" } %] + + <noscript> + <td> + <input type="submit" name="action-assemble" value="Update -->"> + </td> + </noscript> + + <td align="left"> + <label for="name" accesskey="N"> + <select name="name" id="name" style="width: 15em" + size="5" multiple="multiple" + [% FOREACH x = name.keys.sort %] + <option value="[% name.$x FILTER html %]" + [%# " selected" IF lsearch(default.name, x) != -1 %]> + [% x FILTER html %]</option> + [% END %] + </select> + </label> + </td> + + <td style="text-align: center; vertical-align: middle;"> + <input type="submit" name="action-add" value="Add" + style="width: 3em;"><br> + </td> + </tr> + [% END %] + </table> + + <script> + document.chartform.category[0].selected = true; + catSelected(); + subcatSelected(); + </script> +</form> + +[% IF UserInGroup('editbugs') %] + <h3><a href="query.cgi?format=create-series">New Data Set</a></h3> +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/duplicates-simple.html.tmpl b/template/en/default/reports/duplicates-simple.html.tmpl index 481dd6eca9990e65fbfd6fe64b9a6921d90f03d5..22055779aa19ea10304fb01955d525084363f170 100644 --- a/template/en/default/reports/duplicates-simple.html.tmpl +++ b/template/en/default/reports/duplicates-simple.html.tmpl @@ -22,17 +22,19 @@ [%# INTERFACE: # You need to fulfill the interface to duplicates-table.html.tmpl. #%] - + +[% PROCESS global/variables.none.tmpl %] + <html> [% IF product %] - [% title = "Most Frequently Reported Bugs for $product" %] - [% ELSE %] - [% title = "Most Frequently Reported Bugs" %] + [% title = "Most Frequently Reported $terms.Bugs for $product" %] + [% ELSE %] + [% title = "Most Frequently Reported $terms.Bugs" %] [% END%] <head> - <title>[% title %]</title> + <title>[% title FILTER html %]</title> </head> <body> diff --git a/template/en/default/reports/duplicates-table.html.tmpl b/template/en/default/reports/duplicates-table.html.tmpl index 073399ad64eafb038b5ef0cec9268cd1ab14d62b..d2205f2c05e6878661a476045e83b7a0c2f8aec9 100644 --- a/template/en/default/reports/duplicates-table.html.tmpl +++ b/template/en/default/reports/duplicates-table.html.tmpl @@ -31,36 +31,38 @@ # short_desc: string. The bug's summary. # bug_status: string. The bug's status. # resolution: string. The bug's resolution, if any. - # + # # bug_ids: list of integers. May be empty. The IDs of the bugs in $bugs. - # + # # sortby: string. the column on which we are sorting the buglist. # reverse: boolean. True if we are reversing the current sort. # maxrows: integer. Max number of rows to display. # changedsince: integer. The number of days ago for the changedsince column. - # openonly: boolean. True if we are only showing open bugs. - # product: string. Restrict to this product only. + # openonly: boolean. True if we are only showing open bugs. + # query_products: list of strings. Restrict to these products only. #%] - + +[% PROCESS global/variables.none.tmpl %] + [%# *** Column Headers *** %] [% IF bug_ids.size > 0 %] <table border> <tr bgcolor="#CCCCCC"> - [% FOREACH column = [ { name => "id", description => "Bug #" }, + [% FOREACH column = [ { name => "id", description => "$terms.Bug #" }, { name => "count", description => "Dupe<br>Count" }, - { name => "delta", + { name => "delta", description => "Change in last<br>$changedsince day(s)" }, { name => "component", description => "Component" }, { name => "bug_severity", description => "Severity" }, - { name => "op_sys", description => "Op Sys" }, - { name => "target_milestone", + { name => "op_sys", description => "Op Sys" }, + { name => "target_milestone", description => "Target<br>Milestone" }, - { name => "short_desc", description => "Summary" } ] + { name => "short_desc", description => "Summary" } ] %] [%# Small hack to keep delta column out if we don't need it %] - [% NEXT IF column.name == "delta" AND NOT dobefore %] + [% NEXT IF column.name == "delta" AND NOT dobefore %] <td> <center> @@ -68,17 +70,18 @@ [% bug_ids_string = bug_ids.join(',') %] <a href="duplicates.cgi?sortby=[% column.name %] [% IF sortby == column.name %] - [% "&reverse=1" IF NOT reverse %] + [% "&reverse=1" IF NOT reverse %] [% ELSE %] [%-# Some columns start off reversed %] - [% "&reverse=1" IF column.name.match('delta|count') %] + [% "&reverse=1" IF column.name.match('delta|count') %] [% END %] - [% "&maxrows=$maxrows" IF maxrows %] - [% "&changedsince=$changedsince" IF changedsince %] - [% "&openonly=1" IF openonly %] - [% "&product=$product" IF product %] - [% "&format=$format" IF format %] - [% "&bug_id=$bug_ids_string&sortvisible=1" IF sortvisible %]"> + [% "&maxrows=$maxrows" IF maxrows %] + [% "&changedsince=$changedsince" IF changedsince %] + [% "&openonly=1" IF openonly %] + [% FOREACH p = query_products %]&product=[% p FILTER html %][% END %] + [% IF format %]&format=[% format FILTER html %][% END %] + [% "&bug_id=$bug_ids_string&sortvisible=1" + IF sortvisible %]"> [% column.description %]</a> </b> </center> @@ -112,7 +115,7 @@ [% FOREACH bug = bugs %] [% LAST IF loop.index() >= maxrows %] - [% vis_bug_ids.push(bug.id) %] + [% vis_bug_ids.push(bug.id) %] <tr [% "class='resolved'" IF bug.resolution != "" %]> <td> @@ -133,15 +136,15 @@ <td><center>[% bug.delta %]</center></td> [% END %] - <td>[% bug.component %]</td> - <td><center>[% bug.bug_severity %]</center></td> - <td><center>[% bug.op_sys %]</center></td> - <td><center>[% bug.target_milestone %]</center></td> + <td>[% bug.component FILTER html %]</td> + <td><center>[% bug.bug_severity FILTER html %]</center></td> + <td><center>[% bug.op_sys FILTER html %]</center></td> + <td><center>[% bug.target_milestone FILTER html %]</center></td> <td>[% bug.short_desc FILTER html %]</td> </tr> [% END %] </table> [% ELSE %] - <h3>No duplicate bugs found.</h3> + <h3>No duplicate [% terms.bugs %] found.</h3> [% END %] diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl index a522c4db7ca0efc93809f445eeeb8524add42512..fb3184cf6922af648af2bb31da83d731a8157cf1 100644 --- a/template/en/default/reports/duplicates.html.tmpl +++ b/template/en/default/reports/duplicates.html.tmpl @@ -21,25 +21,27 @@ [%# INTERFACE: # products: list of strings. The products this user can see. - # + # # sortby: string. the column on which we are sorting the buglist. # reverse: boolean. True if we are reversing the current sort. # maxrows: integer. Max number of rows to display. # changedsince: integer. The number of days ago for the changedsince column. - # openonly: boolean. True if we are only showing open bugs. - # product: string. Restrict to this product only. + # openonly: boolean. True if we are only showing open bugs. + # query_products: list of strings. The set of products we check for dups. # # Additionally, you need to fulfill the interface to # duplicates-table.html.tmpl. #%] - -[% IF product %] - [% title = "Most Frequently Reported Bugs for $product" %] -[% ELSE %] - [% title = "Most Frequently Reported Bugs" %] + +[% PROCESS global/variables.none.tmpl %] + +[% IF query_products.size %] + [% title = "Most Frequently Reported $terms.Bugs for ${query_products.join(', ')}" %] +[% ELSE %] + [% title = "Most Frequently Reported $terms.Bugs" %] [% END%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl style = ".resolved { background-color: #d9d9d9; color: #000000; }" %] @@ -66,14 +68,14 @@ <td>When sorting or restricting, work with:</td> <td> - <input type="radio" name="sortvisible" id="entirelist" value="0" - [% "checked" IF NOT sortvisible %]> + <input type="radio" name="sortvisible" id="entirelist" value="0" + [% "checked" IF NOT sortvisible %]> <label for="entirelist"> entire list </label> - <br> - <input type="radio" name="sortvisible" id="visiblelist" value="1" - [% "checked" IF sortvisible %]> + <br> + <input type="radio" name="sortvisible" id="visiblelist" value="1" + [% "checked" IF sortvisible %]> <label for="visiblelist"> currently visible list </label> @@ -83,7 +85,8 @@ <select name="product" size="5" multiple="multiple"> [% FOREACH p = products %] <option name="[% p FILTER html %]" - [% " selected" IF product == p %]>[% p FILTER html %]</option> + [% " selected" IF lsearch(query_products, p) != -1 %] + >[% p FILTER html %]</option> [% END %] </select> </td> @@ -106,65 +109,65 @@ <tr> <td> <label for="openonly"> - Open bugs only: + Open [% terms.bugs %] only: </label> </td> <td> - <input type="checkbox" name="openonly" id="openonly" value="1" - [% "checked" IF openonly %]> + <input type="checkbox" name="openonly" id="openonly" value="1" + [% "checked" IF openonly %]> </td> </tr> </table> - <input type="submit" value="Change"> + <input type="submit" value="Change"> </form> <form method="post" action="buglist.cgi"> <input type="hidden" name="bug_id" value="[% bug_ids_string %]"> <input type="hidden" name="order" value="Reuse same sort as last time"> - Or just give this to me as a <input type="submit" value="bug list">. + Or just give this to me as a <input type="submit" value="[% terms.bug %] list">. (Note: the order may not be the same.) </form> <hr> <b> - <a name="explanation">What are "Most Frequently Reported Bugs"?</a> + <a name="explanation">What are "Most Frequently Reported [% terms.Bugs %]"?</a> </b> <blockquote> - The Most Frequent Bugs page lists the known open bugs which - are reported most frequently. It is - automatically generated from the Bugzilla database every 24 hours, by - counting the number of direct and indirect duplicates of bugs. + The Most Frequent [% terms.Bugs %] page lists the known open [% terms.bugs %] which + are reported most frequently. It is + automatically generated from the [% terms.Bugzilla %] database every 24 hours, by + counting the number of direct and indirect duplicates of [% terms.bugs %]. This information is provided in order to assist in minimizing - the amount of duplicate bugs entered into Bugzilla, which saves time - for Quality Assurance engineers who have to triage the bugs. + the amount of duplicate [% terms.bugs %] entered into [% terms.Bugzilla %], which + saves time for Quality Assurance engineers who have to triage the [% terms.bugs %]. </blockquote> <b>How do I use this list?</b> <ul> - <li>Review the most frequent bugs list.</li> + <li>Review the most frequent [% terms.bugs %] list.</li> <li>If your problem is listed:</li> <ul> - <li>Click on the bug number to confirm that you have found the same bug, - and comment if you have additional information or move on with your - testing of the product. + <li>Click on the [% terms.bug %] number to confirm that you have found the + same [% terms.bug %], and comment if you have additional information + or move on with your testing of the product. </li> </ul> <li>If your problem not listed:</li> <ul> - <li><a href="query.cgi">Try and locate a similar bug</a> + <li><a href="query.cgi">Try and locate a similar [% terms.bug %]</a> that has already been filed.</li> - <li>If you find your bug in Bugzilla, feel free to comment with any new or - additional data you may have.</li> - <li>If you cannot find your problem already documented in Bugzilla, - <a href="enter_bug.cgi">file a new bug</a>.</li> + <li>If you find your [% terms.bug %] in [% terms.Bugzilla %], + feel free to comment with any new or additional data you may have.</li> + <li>If you cannot find your problem already documented in [% terms.Bugzilla %], + <a href="enter_bug.cgi">file a new [% terms.bug %]</a>.</li> </ul> </ul> diff --git a/template/en/default/reports/edit-series.html.tmpl b/template/en/default/reports/edit-series.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..352e5fade54e44e2b0a1cee39545126a7cbb4888 --- /dev/null +++ b/template/en/default/reports/edit-series.html.tmpl @@ -0,0 +1,57 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[% title = "Edit Series" %] +[% h2 = BLOCK %] + [% default.category FILTER html %] / + [%+ default.subcategory FILTER html %] / + [%+ default.name FILTER html %] +[% END %] + +[% PROCESS global/header.html.tmpl %] + +<form method="get" action="chart.cgi" name="chartform"> + + [% button_name = "Change" %] + + [% PROCESS reports/series.html.tmpl %] + + [% IF default.series_id %] + <input type="hidden" name="series_id" value="[% default.series_id %]"> + [% END %] +</form> + +<p> + <b>Creator</b>: <a href="mailto:[% creator.email FILTER html %]"> + [% creator.email FILTER html %]</a> +</p> + +<p> + <a href="query.cgi?[% default.query FILTER html%]">View + series search parameters</a> | + <a href="buglist.cgi?cmdtype=dorem&namedcmd= + [% default.category FILTER html %]- + [% default.subcategory FILTER html %]- + [% default.name FILTER html %]&remaction=runseries&series_id= + [% default.series_id %]">Run series search</a> +</p> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl index 665e360c0e5be56874ddf514aee9ddb9ee52c094..2fc024b2cf5e633f29cfb812fffa84ec436a8fa4 100644 --- a/template/en/default/reports/keywords.html.tmpl +++ b/template/en/default/reports/keywords.html.tmpl @@ -26,9 +26,11 @@ # bugcount: number of bugs with that keyword # caneditkeywords: boolean. True if this user can edit keywords %] - -[% PROCESS global/header.html.tmpl - title = "Bugzilla Keyword Descriptions" + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "$terms.Bugzilla Keyword Descriptions" %] [% FOREACH keyword = keywords %] @@ -36,15 +38,15 @@ [% IF loop.index != 0 %] </table> [% END %] - + <table border="1" cellpadding="4" cellspacing="0"> <tr bgcolor="#6666FF"> <th align="left">Name</th> <th align="left">Description</th> - <th align="left">Bugs</th> + <th align="left">[% terms.Bugs %]</th> </tr> - [% END %] - + [% END %] + <tr> <th> <a name="[% keyword.name FILTER html %]"> diff --git a/template/en/default/reports/menu.html.tmpl b/template/en/default/reports/menu.html.tmpl index 4e21bf4d6229da83960752baa32c72619b1a9c3d..a6817a36acfe6cf9c5f5cce5f5877f8e17276c2e 100644 --- a/template/en/default/reports/menu.html.tmpl +++ b/template/en/default/reports/menu.html.tmpl @@ -24,12 +24,14 @@ # types in Bugzilla. #%] -[% PROCESS global/header.html.tmpl +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl title = "Reporting and Charting Kitchen" %] <p> - Bugzilla allows you to view and track the state of the bug database in + [% terms.Bugzilla %] allows you to view and track the state of the [% terms.bug %] database in all manner of exciting ways. </p> @@ -37,14 +39,14 @@ <ul> <li> - <strong><a href="query.cgi">Search</a></strong> - - list sets of bugs. + <strong><a href="query.cgi">Search</a></strong> - + list sets of [% terms.bugs %]. </li> <li> <strong> <a href="query.cgi?format=report-table">Tabular reports</a> </strong> - - tables of bug counts in 1, 2 or 3 dimensions, as HTML or CSV. + tables of [% terms.bug %] counts in 1, 2 or 3 dimensions, as HTML or CSV. </li> <li> <strong> @@ -58,10 +60,14 @@ <ul> <li> - <strong><a href="reports.cgi">Charts</a></strong> - - plot the status and/or resolution of bugs against + <strong><a href="reports.cgi">Old Charts</a></strong> - + plot the status and/or resolution of [% terms.bugs %] against time, for each product in your database. </li> + <li> + <strong><a href="chart.cgi">New Charts</a></strong> - + plot any arbitrary search against time. Far more powerful. + </li> </ul> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/report-bar.png.tmpl b/template/en/default/reports/report-bar.png.tmpl index 143768a25d9803b83a10f972fe441a25c9e43c98..72a5d9dd4b23b3dd66c84c5d2a7df762811f75c4 100644 --- a/template/en/default/reports/report-bar.png.tmpl +++ b/template/en/default/reports/report-bar.png.tmpl @@ -19,7 +19,9 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% y_label = "Bugs" %] +[% PROCESS global/variables.none.tmpl %] + +[% y_label = "$terms.Bugs" %] [% PROCESS "global/field-descs.none.tmpl" %] @@ -30,26 +32,26 @@ graph.set(x_label => col_field_disp, y_label => y_label, - y_tick_number => 8, - y_number_format => "%d", + y_tick_number => 8, + y_number_format => "%d", x_label_position => 0.5, x_labels_vertical => x_labels_vertical, bar_spacing => 8, - shadow_depth => 4, + shadow_depth => 4, shadowclr => 'dred', - show_values => 1, + show_values => 1, legend_placement => "RT"); - + graph.set(cumulate => "true", show_values => 0) IF cumulate; - - # Workaround for the fact that set_legend won't take row_names directly, + + # Workaround for the fact that set_legend won't take row_names directly, # because row_names is an array reference rather than an array. graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3, row_names.4, row_names.5, row_names.6, row_names.7, row_names.8, row_names.9, row_names.10, row_names.11, row_names.12, row_names.13, row_names.14, row_names.15); - + graph.plot(data.0).png | stdout(1); END; -%] diff --git a/template/en/default/reports/report-line.png.tmpl b/template/en/default/reports/report-line.png.tmpl index 5fe7663d0e2d529889dfb8d31b80d86824fef217..780ec37e3ea0d7d3e2f53f20e38e505edcb1c99a 100644 --- a/template/en/default/reports/report-line.png.tmpl +++ b/template/en/default/reports/report-line.png.tmpl @@ -19,7 +19,9 @@ # Contributor(s): Gervase Markham <gerv@gerv.net> #%] -[% y_label = "Bugs" %] +[% PROCESS global/variables.none.tmpl %] + +[% y_label = "$terms.Bugs" %] [% PROCESS "global/field-descs.none.tmpl" %] @@ -35,19 +37,19 @@ [% FILTER null; graph.set(x_label => col_field_disp, y_label => y_label, - y_tick_number => 8, + y_tick_number => 8, x_label_position => 0.5, x_labels_vertical => x_labels_vertical, legend_placement => "RT", line_width => 2); - - # Workaround for the fact that set_legend won't take row_names directly, + + # Workaround for the fact that set_legend won't take row_names directly, # because row_names is an array reference rather than an array. graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3, row_names.4, row_names.5, row_names.6, row_names.7, row_names.8, row_names.9, row_names.10, row_names.11, row_names.12, row_names.13, row_names.14, row_names.15); - + graph.plot(data.0).png | stdout(1); END; -%] diff --git a/template/en/default/reports/report-table.csv.tmpl b/template/en/default/reports/report-table.csv.tmpl index 3e702f3965c611328ffaea51950b335dc4f4e0af..216419fea5eb825cd6c23358a3f031e9d4043fe5 100644 --- a/template/en/default/reports/report-table.csv.tmpl +++ b/template/en/default/reports/report-table.csv.tmpl @@ -21,19 +21,26 @@ [%# INTERFACE: # See report-table.html.tmpl. #%] -[% num_bugs = "Number of bugs" %] +[% PROCESS global/variables.none.tmpl %] + +[% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %] [% tbl_field_disp = field_descs.$tbl_field || tbl_field %] [% col_field_disp = field_descs.$col_field || col_field %] [% row_field_disp = field_descs.$row_field || row_field %] [% title = BLOCK %] - [% "$tbl_field_disp: $tbl\n" IF tbl_field %] - [% row_field_disp IF row_field %] + [% IF tbl_field %] + [% tbl_field_disp FILTER csv %]: [% tbl FILTER csv %] + + [% END %] + [% IF row_field %] + [% row_field_disp FILTER csv %] + [% END %] [% " / " IF col_field AND row_field %] - [% col_field_disp %] + [% col_field_disp FILTER csv %] [% END %] -[% title FILTER csv %], +[% title %], [% IF col_field -%] [% FOREACH col = col_names -%] [% col FILTER csv -%], diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl index f28c39590a99c95253787a07167504a0e3eb3eaf..e4b52b4888fe432e3da294e8b8599d0197a509dc 100644 --- a/template/en/default/reports/report-table.html.tmpl +++ b/template/en/default/reports/report-table.html.tmpl @@ -50,7 +50,7 @@ <td> </td> <td align="center"> - <h2>[% tbl_disp %]</h2> + <h2>[% tbl_disp FILTER html %]</h2> </td> </tr> [% END %] diff --git a/template/en/default/reports/report.html.tmpl b/template/en/default/reports/report.html.tmpl index 00d58954153e6ccc596cfc0cc530aaef66db1f07..535a8c503575cbcd66c2119e4b8e1566c04ef50f 100644 --- a/template/en/default/reports/report.html.tmpl +++ b/template/en/default/reports/report.html.tmpl @@ -37,6 +37,10 @@ height = 350 %] +[% IF min_width AND width < min_width %] + [% width = min_width %] +[% END %] + [%# We ignore row_field for pie charts %] [% IF format == "pie" %] [% row_field = "" %] @@ -50,11 +54,15 @@ [% title = BLOCK %] Report: - [% tbl_field_disp IF tbl_field %] + [% IF tbl_field %] + [% tbl_field_disp FILTER html %] + [% END %] [% " / " IF tbl_field AND (col_field OR row_field) %] - [% row_field_disp IF row_field %] + [% IF row_field %] + [% row_field_disp FILTER html %] + [% END %] [% " / " IF col_field AND row_field %] - [% col_field_disp %] + [% col_field_disp FILTER html %] [% END %] [% PROCESS global/header.html.tmpl @@ -90,8 +98,16 @@ [% imageurl = BLOCK %]report.cgi?[% imagebase %]&format= [% format FILTER url_quote %]&ctype=png&action=plot& - [% IF tbl_field AND tbl != "-total-" %] - [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% IF tbl_field %] + [% IF tbl != "-total-" %] + [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% ELSE %] + [% FOREACH tblname = tbl_names %] + [% IF tblname != "-total-" %] + [% tbl_field FILTER url_quote %]=[% tblname FILTER url_quote %]& + [% END %] + [% END %] + [% END %] [% END %]width=[% width %]&height=[% height %] [% END %] @@ -116,7 +132,7 @@ [% UNLESS other_format.name == format %] <a href="[% formaturl %]&format=[% other_format.name %]"> [% END %] - [% other_format.description %] + [% other_format.description FILTER html %] [% "</a>" UNLESS other_format.name == format %] | [% END %] <a href="[% formaturl %]&ctype=csv&format=table">CSV</a> @@ -127,7 +143,9 @@ </td> - [% sizeurl = "report.cgi?$switchbase&action=wrap&format=$format" %] + [% sizeurl = BLOCK %]report.cgi? + [% switchbase %]&action=wrap&format= + [% format FILTER html %][% END %] <td align="center"> <a href="[% sizeurl %]&width=[% width %]&height= [% height + 100 %]">Taller</a><br> @@ -147,8 +165,8 @@ <a href="query.cgi?[% switchbase %]&format=report-table">Edit this report</a> [% ELSE %] - <a href="query.cgi?[% switchbase %]&format=report-graph& - chart_format=[% format %]&cumulate=[% cumulate %]"> + <a href="query.cgi?[% switchbase %]&chart_format= + [% format %]&format=report-graph&cumulate=[% cumulate %]"> Edit this report </a> [% END %] diff --git a/template/en/default/reports/series-common.html.tmpl b/template/en/default/reports/series-common.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..7fa34c6ec32a4cd077fc50ecfe62f96fa2eb3db9 --- /dev/null +++ b/template/en/default/reports/series-common.html.tmpl @@ -0,0 +1,117 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + # donames: boolean. True if we have a multi-select for names as well as + # categories and subcategories. + # category: hash (keyed by category) of hashes (keyed by subcategory) of + # hashes (keyed by name), with value being the series_id of the + # series. Contains details of all series the user can see. + #%] + +[% subcategory = category.${default.category} %] +[% name = subcategory.${default.subcategory} %] + +<script> +[%# This structure holds details of the series the user can select from. %] +var series = { +[% FOREACH c = category.keys.sort %] + "[%+ c FILTER js %]" : { + [% FOREACH s = category.$c.keys.sort %] + "[%+ s FILTER js %]" : { + [% IF donames %] + [% FOREACH n = category.$c.$s.keys.sort %] + "[% n FILTER js %]": + [% category.$c.$s.$n FILTER js %][% ", " UNLESS loop.last %] + [% END %] + [% END %] + }[% ", " UNLESS loop.last %] + [% END %] + }[% ", " UNLESS loop.last %] +[% END %] +}; + +[%# Should attempt to preserve selection across invocations @@@ %] +[%# This function takes necessary action on selection of a category %] +function catSelected() { + var cat = document.chartform.category.value; + var subcats = series[cat]; + + var subcatwidget = document.chartform.subcategory; + + subcatwidget.options.length = 0; + var i = 0; + + for (x in subcats) { + subcatwidget.options[i] = new Option(x, x); + i++; + } + + [% IF newtext %] + subcatwidget.options[i] = new Option("[% newtext FILTER js %]", ""); + [% END %] + + subcatwidget.options[0].selected = true; + + if (document.chartform.action[1]) { + [%# On the query form, select the right radio button. %] + document.chartform.action[1].checked = true; + } + + checkNewState(); +} + +[%# This function updates the disabled state of the two "new" textboxes %] +function checkNewState() { + var fm = document.chartform; + if (fm.newcategory) { + fm.newcategory.disabled = + (fm.category.value != "" || + fm.action[1] && fm.action[1].checked == false); + fm.newsubcategory.disabled = + (fm.subcategory.value != "" || + fm.action[1] && fm.action[1].checked == false); + } +} +</script> + +[%###########################################################################%] +[%# Block for SELECT fields - pinched from search/form.html.tmpl #%] +[%###########################################################################%] + +[% BLOCK series_select %] + <td align="left"> + <label for="[% sel.name %]" accesskey="[% sel.accesskey %]"> + <select name="[% sel.name %]" id="[% sel.name %]" + size="[% sel.size %]" style="width: 15em" + [%+ "onchange='$sel.onchange'" IF sel.onchange %]> + [% FOREACH x = ${sel.name}.keys.sort %] + <option value="[% x FILTER html %]" + [% " selected" IF default.${sel.name} == x %]> + [% x FILTER html %]</option> + [% END %] + [% IF newtext %] + <option value="">[% newtext FILTER html %]</option> + [% END %] + </select> + </label> + </td> +[% END %] diff --git a/template/en/default/reports/series.html.tmpl b/template/en/default/reports/series.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..a1474a1cf6317e6d55b7ad9b0579cb2e9111ae17 --- /dev/null +++ b/template/en/default/reports/series.html.tmpl @@ -0,0 +1,96 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + # default: hash. Defaults for category, subcategory, name etc. + # button_name: string. What the button will say. + # category: hash (keyed by category) of hashes (keyed by subcategory) of + # hashes (keyed by name), with value being the series_id of the + # series. Contains details of all series the user can see. + #%] + +[% PROCESS "reports/series-common.html.tmpl" + newtext = "New (name below)" + %] + +<table cellpadding="2" cellspacing="2" border="0" + style="text-align: left; margin-left: 20px"> + <tbody> + <tr> + <th>Category:</th> + <noscript><th></th></noscript> + <th>Sub-category:</th> + <th>Name:</th> + <td></td> + </tr> + <tr> + [% PROCESS series_select sel = { name => 'category', + size => 5, + onchange => "catSelected()" } %] + <noscript> + <td> + <input type="submit" name="action-edit" value="Update -->"> + </td> + </noscript> + + [% PROCESS series_select sel = { name => 'subcategory', + size => 5, + onchange => "checkNewState()" } %] + + <td valign="top" name="name"> + <input type="text" name="name" maxlength="64" + value="[% default.name.0 FILTER html %]" size="25"> + </td> + + <td valign="top"> + <span style="font-weight: bold;">Run every</span> + <input type="text" size="2" name="frequency" + value="[% (default.frequency.0 OR 7) FILTER html %]"> + <span style="font-weight: bold;"> day(s)</span><br> + [% IF UserInGroup('admin') %] + <input type="checkbox" name="public" + [% "checked='checked'" IF default.public.0 %]> + <span style="font-weight: bold;">Visible to all</span> + [% END %] + </td> + </tr> + + <tr> + <td> + <input type="text" style="width: 100%" name="newcategory" + maxlength="64" value="[% default.newcategory.0 FILTER html %]"> + </td> + <noscript><td></td></noscript> + <td> + <input type="text" style="width: 100%" name="newsubcategory" + maxlength="64" + value="[% default.newsubcategory.0 FILTER html %]"> + </td> + <td></td> + <td> + <input type="submit" value="[% button_name FILTER html %]"> + </td> + </tbody> +</table> + +<script> + checkNewState(); +</script> diff --git a/template/en/default/request/CVS/Entries b/template/en/default/request/CVS/Entries index 1303f64f26a6a1d3870316c1a34dfcb711de4f70..4da271d12abdc3901b68b0ecbf844b3f9386cb4f 100644 --- a/template/en/default/request/CVS/Entries +++ b/template/en/default/request/CVS/Entries @@ -1,3 +1,3 @@ -/email.txt.tmpl/1.1/Wed Nov 20 03:03:21 2002//TBUGZILLA-2_17_4 -/queue.html.tmpl/1.7/Wed Nov 27 16:00:44 2002//TBUGZILLA-2_17_4 +/email.txt.tmpl/1.3/Thu Jul 3 21:32:06 2003//TBUGZILLA-2_17_5 +/queue.html.tmpl/1.8/Thu Jul 3 21:32:06 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/request/CVS/Tag b/template/en/default/request/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/request/CVS/Tag +++ b/template/en/default/request/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/request/email.txt.tmpl b/template/en/default/request/email.txt.tmpl index e35132181fb9fd5a357103f601a06181ffd0cc01..9024a6fe06f9963a0030d1aedf6deca6ef203730 100644 --- a/template/en/default/request/email.txt.tmpl +++ b/template/en/default/request/email.txt.tmpl @@ -19,6 +19,9 @@ # Contributor(s): Myk Melez <myk@mozilla.org> # Jeff Hedlund <jeff.hedlund@matrixsi.com> #%] + +[% PROCESS global/variables.none.tmpl %] + [% bugidsummary = flag.target.bug.id _ ': ' _ flag.target.bug.summary %] [% attidsummary = flag.target.attachment.id _ ': ' _ flag.target.attachment.summary %] @@ -36,16 +39,16 @@ From: bugzilla-request-daemon To: [% to_email %] CC: [% flag.type.cc_list %] -Subject: [% flag.type.name %] [%+ subject_status %]: [Bug [% flag.target.bug.id %]] [% flag.target.bug.summary %] -[%- IF flag.target.attachment.exists %] : +Subject: [% flag.type.name %] [%+ subject_status %]: [[% terms.Bug %] [% flag.target.bug.id %]] [% flag.target.bug.summary %] +[%- IF flag.target.attachment.exists %] : [Attachment [% flag.target.attachment.id %]] [% flag.target.attachment.summary %][% END %] [%+ USE wrap -%] [%- FILTER bullet = wrap(80) -%] -[% user.realname %] <[% user.login %]> has [% statuses.${flag.status} %] [%+ to_identity %] for [% flag.type.name %]: +[% user.identity %] has [% statuses.${flag.status} %] [%+ to_identity %] for [% flag.type.name %]: -Bug [% bugidsummary %] +[% terms.Bug %] [% bugidsummary %] [% END %] [%+ Param('urlbase') %]show_bug.cgi?id=[% flag.target.bug.id %] [% IF flag.target.attachment.exists %] @@ -58,7 +61,7 @@ Attachment [% attidsummary %] [%- FILTER bullet = wrap(80) %] [% IF form.comment.length > 0 %] -------- Additional Comments from [% user.realname %] <[% user.login %]> +------- Additional Comments from [% user.identity %] [%+ form.comment %] [% END %] diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl index 19e2cbe54ceffa9db542da268a02ad0e96116f60..ed900d26385ba45738495155982a8e43b53c639f 100644 --- a/template/en/default/request/queue.html.tmpl +++ b/template/en/default/request/queue.html.tmpl @@ -19,6 +19,8 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[% PROCESS global/variables.none.tmpl %] + [%# The javascript and header_html blocks get used in header.html.tmpl. %] [% javascript = BLOCK %] var usetms = 0; // do we have target milestone? @@ -26,7 +28,7 @@ var last_sel = []; // caches last selection var cpts = new Array(); [% FOREACH p = products %] - cpts['[% p FILTER js %]'] = [ + cpts['[% p FILTER js %]'] = [ [%- FOREACH item = components_by_product.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; [% END %] [% END %] @@ -48,30 +50,30 @@ <select name="product" onchange="selectProduct(this.form, 'product', 'component', 'Any');"> <option value="">Any</option> [% FOREACH item = products %] - <option value="[% item FILTER html %]" + <option value="[% item FILTER html %]" [% "selected" IF form.product == item %]>[% item FILTER html %]</option> [% END %] </select> </td> <th>Flag:</th> <td> - [% PROCESS "global/select-menu.html.tmpl" - name="type" + [% PROCESS "global/select-menu.html.tmpl" + name="type" options=types default=form.type %] </td> - + [%# We could let people see a "queue" of non-pending requests. %] <!-- <th>Status:</th> <td> - [%# PROCESS "global/select-menu.html.tmpl" - name="status" + [%# PROCESS "global/select-menu.html.tmpl" + name="status" options=["all", "?", "+-", "+", "-"] default=form.status %] </td> --> - + </tr> <tr> <th>Requestee:</th> @@ -81,18 +83,18 @@ <select name="component"> <option value="">Any</option> [% FOREACH item = components %] - <option value="[% item FILTER html %]" [% "selected" IF form.component == item %]> + <option value="[% item FILTER html %]" [% "selected" IF form.component == item %]> [% item FILTER html %]</option> [% END %] </select> </td> <th>Group By:</th> <td> - [% groups = { - "Requester" => 'requester' , - "Requestee" => 'requestee', - "Flag" => 'type' , - "Product/Component" => 'category' + [% groups = { + "Requester" => 'requester' , + "Requestee" => 'requestee', + "Flag" => 'type' , + "Product/Component" => 'category' } %] [% PROCESS "global/select-menu.html.tmpl" name="group" options=groups default=form.group %] </td> @@ -103,14 +105,14 @@ </form> [% END %] -[% column_headers = { - "type" => "Flag" , - "status" => "Status" , - "bug" => "Bug" , - "attachment" => "Attachment" , +[% column_headers = { + "type" => "Flag" , + "status" => "Status" , + "bug" => "$terms.Bug" , + "attachment" => "Attachment" , "requester" => "Requester" , - "requestee" => "Requestee" , - "created" => "Created" , + "requestee" => "Requestee" , + "created" => "Created" , "category" => "Product/Component" } %] [% DEFAULT display_columns = ["requester", "requestee", "type", "bug", "attachment", "created"] @@ -119,7 +121,7 @@ %] -[% PROCESS global/header.html.tmpl +[% PROCESS global/header.html.tmpl title="Request Queue" h2=filter_form style = " diff --git a/template/en/default/search/CVS/Entries b/template/en/default/search/CVS/Entries index d7c5763295e6723ca9585dc0ddc37c62eb49b80c..f3894edf020a47e7a57a014f2f1cfd26f4f8d3e4 100644 --- a/template/en/default/search/CVS/Entries +++ b/template/en/default/search/CVS/Entries @@ -1,9 +1,12 @@ -/boolean-charts.html.tmpl/1.5/Sat Mar 8 05:47:58 2003//TBUGZILLA-2_17_4 -/form.html.tmpl/1.16/Thu Apr 24 20:49:52 2003//TBUGZILLA-2_17_4 -/knob.html.tmpl/1.9/Mon Mar 24 07:59:58 2003//TBUGZILLA-2_17_4 -/search-help.html.tmpl/1.1/Tue Nov 26 21:11:23 2002//TBUGZILLA-2_17_4 -/search-report-graph.html.tmpl/1.3/Tue Nov 19 00:16:44 2002//TBUGZILLA-2_17_4 -/search-report-select.html.tmpl/1.3/Mon Jan 6 07:54:24 2003//TBUGZILLA-2_17_4 -/search-report-table.html.tmpl/1.4/Tue Nov 19 00:16:44 2002//TBUGZILLA-2_17_4 -/search.html.tmpl/1.13/Fri Dec 20 07:21:43 2002//TBUGZILLA-2_17_4 +/boolean-charts.html.tmpl/1.6/Wed Sep 3 02:03:46 2003//TBUGZILLA-2_17_5 +/form.html.tmpl/1.19/Sat Sep 6 19:23:12 2003//TBUGZILLA-2_17_5 +/knob.html.tmpl/1.12/Sat Sep 6 19:23:12 2003//TBUGZILLA-2_17_5 +/search-create-series.html.tmpl/1.1/Wed Jun 25 23:23:04 2003//TBUGZILLA-2_17_5 +/search-help.html.tmpl/1.3/Thu Jul 3 21:32:09 2003//TBUGZILLA-2_17_5 +/search-report-graph.html.tmpl/1.6/Sun Sep 14 23:00:09 2003//TBUGZILLA-2_17_5 +/search-report-select.html.tmpl/1.3/Mon Jan 6 07:54:24 2003//TBUGZILLA-2_17_5 +/search-report-table.html.tmpl/1.7/Sun Sep 14 23:00:09 2003//TBUGZILLA-2_17_5 +/search-specific.html.tmpl/1.1/Wed Sep 3 02:03:46 2003//TBUGZILLA-2_17_5 +/search.html.tmpl/1.15/Wed Sep 3 02:03:47 2003//TBUGZILLA-2_17_5 +/tabs.html.tmpl/1.1/Wed Sep 3 02:03:48 2003//TBUGZILLA-2_17_5 D diff --git a/template/en/default/search/CVS/Tag b/template/en/default/search/CVS/Tag index a67fbcad0cbea188f7f5c02f82affa8ccaf7d5c9..6d56a75e0f98e74c4cb6ffc01f6640c1a51f7afd 100644 --- a/template/en/default/search/CVS/Tag +++ b/template/en/default/search/CVS/Tag @@ -1 +1 @@ -NBUGZILLA-2_17_4 +NBUGZILLA-2_17_5 diff --git a/template/en/default/search/boolean-charts.html.tmpl b/template/en/default/search/boolean-charts.html.tmpl index 3987352dc27e187ef8fe7471f1a6cb8ff795d9da..2d73ae4d71a574a48b606ebed9f13d4a6560f1d8 100644 --- a/template/en/default/search/boolean-charts.html.tmpl +++ b/template/en/default/search/boolean-charts.html.tmpl @@ -40,7 +40,8 @@ { name => "changedafter", description => "changed after" }, { name => "changedfrom", description => "changed from" }, { name => "changedto", description => "changed to" }, - { name => "changedby", description => "changed by" } ] %] + { name => "changedby", description => "changed by" }, + { name => "matches", description => "matches" } ] %] <p> <strong> diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl index efc5dd0b2dfb372caee3409f920a57944d329342..db20c6aa5920bfd96b4024bc9910ba1c8b667cad 100644 --- a/template/en/default/search/form.html.tmpl +++ b/template/en/default/search/form.html.tmpl @@ -20,7 +20,9 @@ # Christian Reis <kiko@async.com.br> [javascript rewrite] # Gervase Markham <gerv@gerv.net> #%] - + +[% PROCESS global/variables.none.tmpl %] + [%# Note: use Template comments and not JS ones here, to avoid bloating what we actually send to the browser %] @@ -35,17 +37,17 @@ var vers = new Array(); var tms = new Array(); [% END %] -[%# Create three arrays of components, versions and target milestones, indexed +[%# Create three arrays of components, versions and target milestones, indexed # numerically according to the product they refer to. #%] [% n = 0 %] [% FOREACH p = product %] - cpts[[% n %]] = [ + cpts[[% n %]] = [ [%- FOREACH item = p.components %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; - vers[[% n %]] = [ + vers[[% n %]] = [ [%- FOREACH item = p.versions -%]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; [% IF Param('usetargetmilestone') %] - tms[[% n %]] = [ + tms[[% n %]] = [ [%- FOREACH item = p.milestones %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; [% END %] [% n = n+1 %] @@ -57,7 +59,7 @@ var tms = new Array(); # correspond to the elements selected in source. # - array should be a array of arrays, indexed by number. the # array should contain the elements that correspond to that - # product. + # product. # - sel is a list of selected items, either whole or a diff # depending on merging. # - target should be the target select object. @@ -78,7 +80,7 @@ var tms = new Array(); %] function updateSelect(array, sel, target, merging) { - + var i, item; [%# If we have no versions/components/milestones %] @@ -119,7 +121,7 @@ function updateSelect(array, sel, target, merging) { return true; } -[%# Returns elements in a that are not in b. +[%# Returns elements in a that are not in b. # NOT A REAL DIFF: does not check the reverse. # - a,b: arrays of values to be compare. %] function fake_diff_array(a, b) { @@ -203,7 +205,7 @@ function merge_arrays(a, b, b_is_select) { [%# Returns an array of indexes or values from a select form control. # - control: select control from which to find selections - # - findall: boolean, store all options when true or just the selected + # - findall: boolean, store all options when true or just the selected # indexes # - want_values: boolean; we store values when true and indexes when # false %] @@ -263,7 +265,7 @@ function selectProduct(f) { first_load = false; return; } - + [%# turn first_load off. this is tricky, since it seems to be redundant with the above clause. It's not: if when we first load the page there is _one_ element selected, it won't fall into that @@ -273,7 +275,7 @@ function selectProduct(f) { without merge/sorting. %] first_load = false; - [%# - sel keeps the array of products we are selected. + [%# - sel keeps the array of products we are selected. - merging says if it is a full list or just a list of products that were added to the current selection. %] var merging = false; @@ -285,10 +287,10 @@ function selectProduct(f) { if (!findall) { [%# save sel for the next invocation of selectProduct() %] var tmp = sel; - + [%# this is an optimization: if we have just added products to an - existing selection, no need to clear the form controls and add - everybody again; just merge the new ones with the existing + existing selection, no need to clear the form controls and add + everybody again; just merge the new ones with the existing options. %] if ((last_sel.length > 0) && (last_sel.length < sel.length)) { sel = fake_diff_array(sel, last_sel); @@ -317,7 +319,7 @@ function selectProduct(f) { // --> </script> -[% query_variants = [ +[% query_variants = [ { value => "allwordssubstr", description => "contains all of the words/strings" }, { value => "anywordssubstr", description => "contains any of the words/strings" }, { value => "substring", description => "contains the string" }, @@ -342,7 +344,7 @@ function selectProduct(f) { [% FOREACH qv = query_variants %] <option value="[% qv.value %]" [% " selected" IF default.short_desc_type.0 == qv.value %]>[% qv.description %]</option> - [% END %] + [% END %] </select> </td> <td> @@ -350,9 +352,9 @@ function selectProduct(f) { value="[% default.short_desc.0 FILTER html %]"> </td> <td> - <input type="submit" value="[% button_name %]"> + <input type="submit" value="[% button_name FILTER html %]"> </td> - </tr> + </tr> [%# *** Product Component Version Target *** %] @@ -394,7 +396,7 @@ function selectProduct(f) { reserved word - we use 'component_' instead. %] <td align="left"> <label for="component" accesskey="m"> - <select name="component" id="component" + <select name="component" id="component" multiple="multiple" size="5"> [% FOREACH c = component_ %] <option value="[% c FILTER html %]" @@ -413,8 +415,8 @@ function selectProduct(f) { <th align="left"><u>V</u>ersion:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'version', - size => 5, + [% PROCESS select sel = { name => 'version', + size => 5, accesskey => 'v' } %] </tr> </table> @@ -426,7 +428,7 @@ function selectProduct(f) { <th align="left"><u>T</u>arget:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'target_milestone', + [% PROCESS select sel = { name => 'target_milestone', size => 5, accesskey => 't' } %] </tr> @@ -437,15 +439,15 @@ function selectProduct(f) { </table> </td> </tr> - + [%# *** Comment URL Whiteboard Keywords *** %] - [% FOREACH field = [ - { name => "long_desc", description => "A <u>C</u>omment", + [% FOREACH field = [ + { name => "long_desc", description => "A <u>C</u>omment", accesskey => 'c' }, - { name => "bug_file_loc", description => "The <u>U</u>RL", + { name => "bug_file_loc", description => "The <u>U</u>RL", accesskey => 'u' }, - { name => "status_whiteboard", description => "<u>W</u>hiteboard", + { name => "status_whiteboard", description => "<u>W</u>hiteboard", accesskey => 'w' } ] %] [% UNLESS field.name == 'status_whiteboard' AND NOT Param('usestatuswhiteboard') %] @@ -454,10 +456,10 @@ function selectProduct(f) { <td> <select name="[% field.name %]_type"> [% FOREACH qv = query_variants %] - [% type = "${field.name}_type" %] + [% type = "${field.name}_type" %] <option value="[% qv.value %]" [% " selected" IF default.$type.0 == qv.value %]>[% qv.description %]</option> - [% END %] + [% END %] </select> </td> <td><input name="[% field.name %]" size="40" @@ -465,7 +467,7 @@ function selectProduct(f) { value="[% default.${field.name}.0 FILTER html %]"> </td> <td></td> - </tr> + </tr> [% END %] [% END %] @@ -476,7 +478,7 @@ function selectProduct(f) { </th> <td> <select name="keywords_type"> - [% FOREACH qv = [ + [% FOREACH qv = [ { name => "allwords", description => "contains all of the keywords" }, { name => "anywords", description => "contains any of the keywords" }, { name => "nowords", description => "contains none of the keywords" } ] %] @@ -493,7 +495,7 @@ function selectProduct(f) { </td> </tr> [% END %] -</table> +</table> <hr> @@ -507,7 +509,7 @@ function selectProduct(f) { <th align="left"><a href="queryhelp.cgi#status">St<u>a</u>tus</a>:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'bug_status', + [% PROCESS select sel = { name => 'bug_status', size => 7, accesskey => 'a' } %] </tr> @@ -521,7 +523,7 @@ function selectProduct(f) { </th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'resolution', + [% PROCESS select sel = { name => 'resolution', size => 7, accesskey => 'r' } %] </tr> @@ -533,9 +535,9 @@ function selectProduct(f) { <th align="left"><a href="queryhelp.cgi#severity">S<u>e</u>verity</a>:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'bug_severity', + [% PROCESS select sel = { name => 'bug_severity', size => 7, - accesskey => 'e' } %] + accesskey => 'e' } %] </tr> </table> </td> @@ -545,9 +547,9 @@ function selectProduct(f) { <th align="left"><a href="queryhelp.cgi#priority">Pr<u>i</u>ority</a>:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'priority', - size => 7, - accesskey => 'i' } %] + [% PROCESS select sel = { name => 'priority', + size => 7, + accesskey => 'i' } %] </tr> </table> </td> @@ -557,7 +559,7 @@ function selectProduct(f) { <th align="left"><a href="queryhelp.cgi#platform"><u>H</u>ardware</a>:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'rep_platform', + [% PROCESS select sel = { name => 'rep_platform', size => 7, accesskey => 'h' } %] </tr> @@ -569,8 +571,8 @@ function selectProduct(f) { <th align="left"><a href="queryhelp.cgi#opsys"><u>O</u>S</a>:</th> </tr> <tr valign="top"> - [% PROCESS select sel = { name => 'op_sys', - size => 7, + [% PROCESS select sel = { name => 'op_sys', + size => 7, accesskey => 'o' } %] </tr> </table> @@ -589,7 +591,7 @@ function selectProduct(f) { <legend> <strong> <a href="queryhelp.cgi#peopleinvolved">Email</a> and Numbering - </strong> + </strong> </legend> @@ -607,17 +609,17 @@ function selectProduct(f) { </tr> <tr> <td> - <input type="checkbox" name="emailassigned_to[% n %]" + <input type="checkbox" name="emailassigned_to[% n %]" id="emailassigned_to[% n %]" value="1" [% " checked" IF default.emailassigned_to.$n %]> <label for="emailassigned_to[% n %]"> - bug owner + [% terms.bug %] owner </label> </td> </tr> <tr> <td> - <input type="checkbox" name="emailreporter[% n %]" + <input type="checkbox" name="emailreporter[% n %]" id="emailreporter[% n %]" value="1" [% " checked" IF default.emailreporter.$n %]> <label for="emailreporter[% n %]"> @@ -628,7 +630,7 @@ function selectProduct(f) { [% IF Param('useqacontact') %] <tr> <td> - <input type="checkbox" name="emailqa_contact[% n %]" + <input type="checkbox" name="emailqa_contact[% n %]" id="emailqa_contact[% n %]" value="1" [% " checked" IF default.emailqa_contact.$n %]> <label for="emailqa_contact[% n %]"> @@ -639,7 +641,7 @@ function selectProduct(f) { [% END %] <tr> <td> - <input type="checkbox" name="emailcc[% n %]" + <input type="checkbox" name="emailcc[% n %]" id="emailcc[% n %]" value="1" [% " checked" IF default.emailcc.$n %]> <label for="emailcc[% n %]"> @@ -649,7 +651,7 @@ function selectProduct(f) { </tr> <tr> <td> - <input type="checkbox" name="emaillongdesc[% n %]" + <input type="checkbox" name="emaillongdesc[% n %]" id="emaillongdesc[% n %]" value="1" [% " checked" IF default.emaillongdesc.$n %]> <label for="emaillongdesc[% n %]"> @@ -660,12 +662,12 @@ function selectProduct(f) { <tr> <td> <select name="emailtype[% n %]"> - [% FOREACH qv = [ + [% FOREACH qv = [ { name => "substring", description => "contains" }, { name => "exact", description => "is" }, { name => "regexp", description => "matches regexp" }, { name => "notregexp", description => "doesn't match regexp" } ] %] - + <option value="[% qv.name %]" [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option> [% END %] @@ -679,20 +681,20 @@ function selectProduct(f) { </tr> </table> - + </td> [% END %] </tr> </table> <hr> -<table> +<table> <tr> <td> <select name="bugidtype"> <option value="include"[% " selected" IF default.bugidtype.0 == "include" %]>Only include</option> <option value="exclude"[% " selected" IF default.bugidtype.0 == "exclude" %]>Exclude</option> </select> - bugs numbered: + [% terms.bugs %] numbered: </td> <td> <input type="text" name="bug_id" value="[% default.bug_id.0 FILTER html %]" size="20"> @@ -705,7 +707,7 @@ function selectProduct(f) { [% IF Param('usevotes') %] <tr> <td align="right"> - Only bugs with at least: + Only [% terms.bugs %] with at least: </td> <td> <input name="votes" size="3" value="[% default.votes.0 FILTER html %]"> votes @@ -722,16 +724,17 @@ function selectProduct(f) { <td valign="top"> <fieldset> - <legend><strong>Bug Changes</strong></legend> + <legend><strong>[% terms.Bug %] Changes</strong></legend> <dl> - <dt>Only bugs changed in the last </dt> - <dd><input name="changedin" size="3" value="[% default.changedin.0 FILTER html %]"> days</dd> -</dl> - -<dl> - <dt>Only bugs where any of the fields</dt> + <dt>Only [% terms.bugs %] changed between:</dt> + <dd> + <input name="chfieldfrom" size="10" value="[% default.chfieldfrom.0 FILTER html %]"> + and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]"> + <br>(YYYY-MM-DD or <a href="queryhelp.cgi#changedbetween">relative dates</a>) + </dd><br> + <dt>where one or more of the following changed:</dt> <dd> <select name="chfield" multiple="multiple" size="4"> [% FOREACH field = chfield %] @@ -740,21 +743,13 @@ function selectProduct(f) { [% (field_descs.$field || field) FILTER html %]</option> [% END %] </select> - </dd> - - <dt>were changed between</dt> - <dd> - <input name="chfieldfrom" size="10" value="[% default.chfieldfrom.0 FILTER html %]"> - and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]"> - <br>(YYYY-MM-DD) - </dd> - <dt>to this value: (optional)</dt> + </dd><br> + <dt>and the new value was:</dt> <dd> <input name="chfieldvalue" size="20" value="[% default.chfieldvalue.0 FILTER html %]"> - </dd> + </dd><br> </dl> - </fieldset> </td> </tr> diff --git a/template/en/default/search/knob.html.tmpl b/template/en/default/search/knob.html.tmpl index 50e8fc64671bfc3c3c06c3e200ef8fe88d12102b..8386eff042bfd365447a1feab4099f8200461304 100644 --- a/template/en/default/search/knob.html.tmpl +++ b/template/en/default/search/knob.html.tmpl @@ -21,16 +21,18 @@ # Jouni Heikniemi <jouni@heikniemi.net> #%] +[% PROCESS global/variables.none.tmpl %] + [%# This is not necessary for English templates, but useful for localisers. %] [% ordersdesc = { "Reuse same sort as last time" => "Reuse same sort as last time", - "Bug Number" => "Bug Number", + "Bug Number" => "$terms.Bug Number", "Importance" => "Importance", "Assignee" => "Assignee", "Last Changed" => "Last Changed" } %] <br> -[% IF NOT userid %] +[% IF NOT user %] <input type="hidden" name="cmdtype" value="doit"> [% ELSE %] <script type="text/javascript"> <!-- @@ -81,7 +83,7 @@ [% IF namedqueries.size > 0 %] [% END %] - <input type="checkbox" id="remember" name="remember" value="1" + <input type="checkbox" id="remember" name="remember" value="1" onclick="remCheckboxChanged()"> [% IF namedqueries.size > 0 %] <label for="remember">and remember it</label> @@ -108,7 +110,7 @@ </label><br> </td> </tr> - + <tr> <td colspan="2"> [% IF namedqueries.size > 0 %] @@ -124,12 +126,12 @@ <option value="[% query FILTER html %]"> [% query FILTER html %]</option> [% END %] - </select> + </select> [% END %] </td> </tr> </table> - + <script type="text/javascript"> <!-- remCheckboxChanged(); // --> @@ -142,12 +144,12 @@ [% FOREACH order = orders %] <option value="[% order FILTER html %]" [% " selected" IF default.order.0 == order %]> - [% ordersdesc.$order FILTER html %]</option> + [% ordersdesc.$order FILTER html %]</option> [% END %] </select> - <input type="submit" value="[% button_name %]"> - + <input type="submit" value="[% button_name FILTER html %]"> + [% IF userdefaultquery %] <p> <a href="query.cgi?nukedefaultquery=1"> diff --git a/template/en/default/search/search-create-series.html.tmpl b/template/en/default/search/search-create-series.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..9673a1838f5cfd9627d7c4fad66967cfa183cfe3 --- /dev/null +++ b/template/en/default/search/search-create-series.html.tmpl @@ -0,0 +1,67 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + #%] + +[%# INTERFACE: + # This template has no interface. However, to use it, you need to fulfill + # the interfaces of search/form.html.tmpl, reports/series.html.tmpl and + # search/boolean-charts.html.tmpl. + #%] + +[% PROCESS global/header.html.tmpl + title = "Create New Data Set" + onload = "selectProduct(document.forms['chartform']);" +%] + +[% button_name = "I'm Feeling Buggy" %] + +<form method="get" action="chart.cgi" name="chartform"> + +[% PROCESS search/form.html.tmpl %] + +<table> + <tr> + <td> + <input type="radio" id="action-search" + name="action" value="search" checked="checked"> + <label for="action-search">Run this search</label></td> + </tr> + + <tr> + <td> + <input type="radio" id="action-create" name="action" value="create"> + <label for="action-create"> + Start recording bug count data for this search, as follows: + </label> + <br> + + [% INCLUDE reports/series.html.tmpl %] + + </td> + </tr> +</table> + +<hr> + +[% PROCESS "search/boolean-charts.html.tmpl" %] + +</form> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/search/search-help.html.tmpl b/template/en/default/search/search-help.html.tmpl index 5572096907dc8a9e78e5c7682f26b1cf21e321c6..e3ab69ff7295e2a2eb73f6e59384b104432c4892 100644 --- a/template/en/default/search/search-help.html.tmpl +++ b/template/en/default/search/search-help.html.tmpl @@ -23,74 +23,79 @@ { id => "short_desc_type", html => "The type of summary search you would like" }, { id => "short_desc", - html => "The bug summary is a short sentence which succinctly describes <br> - what the bug is about." }, + html => "The $terms.bug summary is a short sentence which succinctly + describes <br> what the $terms.bug is about." }, { id => "product", - html => "Bugs are categorised into Products and Components. Product is the<br> - top-level categorisation." }, + html => "$terms.Bugs are categorised into Products and Components. Product is + the<br>top-level categorisation." }, { id => "component", html => "Components are second-level categories; each belongs to a<br> particular Product. Select a Product to narrow down this list." }, { id => "version", - html => "The version field defines the version of the software the bug<br> - was found in." }, + html => "The version field defines the version of the software the + $terms.bug<br>was found in." }, { id => "target_milestone", html => "The target_milestone field is used to define when the engineer<br> - the bug is assigned to expects to fix it." }, + the $terms.bug is assigned to expects to fix it." }, { id => "long_desc", - html => "Bugs have comments added to them by Bugzilla users. You can<br> - search for some text in those comments." }, + html => "$terms.Bugs have comments added to them by $terms.Bugzilla users. + You can<br>search for some text in those comments." }, { id => "long_desc_type", html => "The type of comment search you would like" }, { id => "bug_file_loc", - html => "Bugs can have a URL associated with them - for example, a pointer<br> - to a web site where the problem is seen." }, + html => "$terms.Bugs can have a URL associated with them - for example, a + pointer<br>to a web site where the problem is seen." }, { id => "bug_file_loc_type", html => "The type of URL search you would like" }, { id => "status_whiteboard", - html => "Each bug has a free-form single line text entry box for adding<br> - tags and status information." }, + html => "Each $terms.bug has a free-form single line text entry box for + adding<br>tags and status information." }, { id => "status_whiteboard_type", html => "The type of whiteboard search you would like" }, { id => "keywords", - html => "You can add keywords from a defined list to bugs, in order to<br> - tag and group them." }, + html => "You can add keywords from a defined list to $terms.bugs, in order + to<br>tag and group them." }, { id => "keywords_type", html => "The type of keyword search you would like" }, { id => "bug_status", - html => "A bug may be in any of a number of states." }, + html => "A $terms.bug may be in any of a number of states." }, { id => "resolution", - html => "If a bug is in a resolved state, then one of these reasons will<br> - be given for its resolution." }, + html => "If a $terms.bug is in a resolved state, then one of these reasons + will<br>be given for its resolution." }, { id => "bug_severity", - html => "How severe the bug is, or whether it's an enhancement." }, + html => "How severe the $terms.bug is, or whether it's an enhancement." }, { id => "priority", - html => "Engineers prioritise their bugs using this field." }, + html => "Engineers prioritise their $terms.bugs using this field." }, { id => "rep_platform", - html => "The hardware platform the bug was observed on." }, + html => "The hardware platform the $terms.bug was observed on." }, { id => "op_sys", - html => "The operating system the bug was observed on." }, + html => "The operating system the $terms.bug was observed on." }, { id => "email1", - html => "Every bug has people associated with it in different roles.<br> - Here, you can search on what people are in what role." }, + html => "Every $terms.bug has people associated with it in different + roles.<br>Here, you can search on what people are in what role." }, { id => "email2", - html => "Every bug has people associated with it in different roles.<br> - Here, you can search on what people are in what role." }, + html => "Every $terms.bug has people associated with it in different + roles.<br>Here, you can search on what people are in what role." }, { id => "bug_id", - html => "You can limit your search to a specific set of bugs." }, + html => "You can limit your search to a specific set of $terms.bugs ." }, { id => "votes", - html => "Some bugs can be voted for, and you can limit your search to bugs<br> - with more than a certain number of votes." }, -{ id => "changedin", - html => "You can search by when bugs have changed - this field defines the<br> - timeframe for the search." }, + html => "Some $terms.bugs can be voted for, and you can limit your search to + $terms.bugs<br>with more than a certain number of votes." }, { id => "chfield", html => "You can search for specific types of change - this field define <br> which field you are interested in changes for." }, { id => "chfieldfrom", - html => "The start time of the timeframe for the change." }, + html => "Specify the start and end dates either in YYYY-MM-DD format<br> + (optionally followed by HH:mm, in 24 hour clock), or in relative<br> + dates such as 1d, 2w, 3m, 4y, which respectively mean one day,<br> + two weeks, three months, or four years ago. 0d is last midnight,<br> + and 0w, 0m, 0y is the beginning of this week, month, or year." }, { id => "chfieldto", - html => "The end time of the timeframe for the change." }, + html => "Specify the start and end dates either in YYYY-MM-DD format<br> + (optionally followed by HH:mm, in 24 hour clock), or in relative<br> + dates such as 1d, 2w, 3m, 4y, which respectively mean one day,<br> + two weeks, three months, or four years ago. 0d is last midnight,<br> + and 0w, 0m, 0y is the beginning of this week, month, or year." }, { id => "chfieldvalue", html => "The value the field defined above changed to during that time." }, ] %] diff --git a/template/en/default/search/search-report-graph.html.tmpl b/template/en/default/search/search-report-graph.html.tmpl index f114a9931daf182ffa0fc1d468e1afea785fc869..d5f4a14dca10f7420c1bfe11041acfbef9a7219f 100644 --- a/template/en/default/search/search-report-graph.html.tmpl +++ b/template/en/default/search/search-report-graph.html.tmpl @@ -24,20 +24,37 @@ # the interfaces of the templates it contains. #%] -[% PROCESS global/header.html.tmpl - title = "Generate Report" - onload = "selectProduct(document.forms['reportform']);" +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Generate Graphical Report" + onload = "selectProduct(document.forms['reportform']);chartTypeChanged()" %] [% PROCESS "search/search-report-select.html.tmpl" %] <p> - Produce a pictorial graph of bug counts by choosing one or more fields as - your axes, and then refining your set of bugs using the rest of the form. - If you choose a third axis, it will be represented by multiple tables of data. - Note: vertical axis settings will be ignored for pie charts. + Choose one or more fields as your axes, and then refine your set of + [% terms.bugs %] using the rest of the form. </p> +<script type="text/javascript"><!-- + [%# The Y-axis fields are not used for pie charts %] + function chartTypeChanged() { + // format[2] is the pie chart radio button + if (document.reportform.format[2].checked == true) { + document.reportform.y_axis_field.disabled = true; + document.reportform.cumulate[0].disabled = true; + document.reportform.cumulate[1].disabled = true; + } else { + document.reportform.y_axis_field.disabled = false; + document.reportform.cumulate[0].disabled = false; + document.reportform.cumulate[1].disabled = false; + } + } +// --> +</script> + [% button_name = "Generate Report" %] <form method="get" action="report.cgi" name="reportform"> @@ -46,6 +63,7 @@ <tr> <td valign="middle"> <b>Vertical Axis:</b><br> + <noscript><small>(not for pie charts)</small><br></noscript> [% PROCESS select name = 'y_axis_field' %]<br> <br> <b>Plot Data Sets:</b><br> @@ -54,8 +72,7 @@ Individually<br> <input type="radio" name="cumulate" value="1" [% " checked" IF default.cumulate.0 == "1" %]> - Added - + Summed </td> <td width="150" height="150"> <table border="1" width="100%" height="100%"> @@ -74,38 +91,39 @@ { name => "bar", description => "Bar Chart" }, { name => "pie", description => "Pie Chart" } ] %] [% default.chart_format.0 = default.chart_format.0 || "bar" %] - + [% FOREACH chart_format = chart_formats %] - <input type="radio" name="format" - value="[% chart_format.name FILTER html %]" + <input type="radio" name="format" + value="[% chart_format.name FILTER html %]" + onchange="chartTypeChanged()" [% " checked" IF default.chart_format.0 == chart_format.name %]> [% chart_format.description FILTER html %]<br> [% END %] </td> </tr> - + <tr> <td> </td> <td align="left"> <b>Horizontal Axis:</b> [% PROCESS select name = 'x_axis_field' %]<br> - <label for="x_labels_vertical"><b>Vertical labels:</b></label> - <input type="checkbox" name="x_labels_vertical" id="x_labels_vertical" + <label for="x_labels_vertical"><b>Vertical labels:</b></label> + <input type="checkbox" name="x_labels_vertical" id="x_labels_vertical" value="1" [% " checked" IF default.x_labels_vertical.0 == "1" %]> </td> <td> </td> </tr> -</table> +</table> <hr> [% PROCESS search/form.html.tmpl %] <br> -<input type="submit" value="[% button_name %]"> +<input type="submit" value="[% button_name FILTER html %]"> <input type="hidden" name="action" value="wrap"> <hr> diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl index 6e098303f62be878d55fd3db13ce14ab56b3a86e..713ea88f915e2d802ea0e6eea57726446e2a60ec 100644 --- a/template/en/default/search/search-report-table.html.tmpl +++ b/template/en/default/search/search-report-table.html.tmpl @@ -24,17 +24,18 @@ # the interfaces of the templates it contains. #%] -[% PROCESS global/header.html.tmpl - title = "Generate Report" +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Generate Tabular Report" onload = "selectProduct(document.forms['reportform']);" %] [% PROCESS "search/search-report-select.html.tmpl" %] <p> - Produce a table of bug counts by choosing one or more fields as your axes, - and then refining your set of bugs using the rest of the form. - If you choose a third axis, it will be represented by multiple tables of data. + Choose one or more fields as your axes, and then refine your set of + [% terms.bugs %] using the rest of the form. </p> [% button_name = "Generate Report" %] @@ -49,14 +50,8 @@ <b>Horizontal Axis:</b> [% PROCESS select name = 'x_axis_field' %] </td> - <td> </td> - <td rowspan="2"> - <b>Format:</b><br> - <input type="radio" name="ctype" value="html" checked="checked">HTML<br> - <input type="radio" name="ctype" value="csv">CSV - </td> </tr> - + <tr> <td valign="middle" align="center"> <b>Vertical Axis:</b><br> @@ -73,14 +68,14 @@ </table> </td> </tr> -</table> +</table> <hr> [% PROCESS search/form.html.tmpl %] <br> -<input type="submit" value="[% button_name %]"> +<input type="submit" value="[% button_name FILTER html %]"> <input type="hidden" name="format" value="table"> <input type="hidden" name="action" value="wrap"> <hr> diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..72f86fb133b21064eecf8fa6b2b9190d5dfa3253 --- /dev/null +++ b/template/en/default/search/search-specific.html.tmpl @@ -0,0 +1,101 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[% PROCESS global/header.html.tmpl + title = "Find a Specific Bug" + h1 = "" + style = "td.selected_tab { + border-width: 2px 2px 0px; + border-style: solid; + } + td.unselected_tab, td.spacer { + border-width: 0px 0px 2px 0px; + border-style: solid; + }" +%] + +[% PROCESS search/tabs.html.tmpl %] + +<p> +Find a specific bug by entering words that describe it. Bugzilla will search +bug summaries, descriptions, and comments for those words and return a list +of matching bugs sorted by relevance. +</p> + +<p> +For example, if the bug you are looking for is a browser crash when you go +to a secure web site with an embedded Flash animation, you might search for +"crash secure SSL flash". +</p> + +<form method="get" action="buglist.cgi"> +<input type="hidden" name="query_format" value="specific"> + +<table> + <tr> + <td align="right" valign="baseline"> + <b><label for="bug_status">Status:</label></b> + </td> + <td> + <select name="bug_status"> + [% FOREACH s = ['open', 'closed', 'all'] %] + <option value="__[% s %]__" + [% " selected" IF default.bug_status.0 == "__${s}__" %]> + [% s %] + </option> + [% END %] + </select> + </td> + </tr> + <tr> + <td align="right" valign="baseline"> + <b><label for="product">Product:</label></b> + </td> + <td> + <select name="product"> + <option value="">All</option> + [% FOREACH p = product %] + <option value="[% p.name FILTER html %]" + [% " selected" IF lsearch(default.product, p.name) != -1 %]> + [% p.name FILTER html %]</option> + [% END %] + </select> + </td> + </tr> + <tr> + <td align="right" valign="baseline"> + <b><label for="content">Words:</label></b> + </td> + <td> + <input name="content" size="40" + value="[% default.content.0 FILTER html %]"> + </td> + </tr> + <tr> + <td></td> + <td> + <input type="submit" value="Search"> + </td> + +</form> + +[% PROCESS global/footer.html.tmpl %] + diff --git a/template/en/default/search/search.html.tmpl b/template/en/default/search/search.html.tmpl index 765f08e25c8fbe8e3655886ea1db850a1043feec..42207a122b07ce76617910b96a6226806bb2ffc2 100644 --- a/template/en/default/search/search.html.tmpl +++ b/template/en/default/search/search.html.tmpl @@ -25,14 +25,27 @@ # search/boolean-charts.html.tmpl. #%] +[% PROCESS global/variables.none.tmpl %] + [% USE Bugzilla %] [% cgi = Bugzilla.cgi %] -[% PROCESS global/header.html.tmpl - title = "Search for bugs" +[% PROCESS global/header.html.tmpl + title = "Search for $terms.bugs" + h1 = "" onload = "selectProduct(document.forms['queryform']);initHelp();" + style = "td.selected_tab { + border-width: 2px 2px 0px; + border-style: solid; + } + td.unselected_tab, td.spacer { + border-width: 0px 0px 2px 0px; + border-style: solid; + }" %] +[% PROCESS search/tabs.html.tmpl %] + [% button_name = "Search" %] [%# The decent help requires Javascript %] @@ -56,13 +69,13 @@ <font color="red"> [% IF cgi.user_agent("Mozilla/5") %] Note that if the help popups are hidden by form element scroll bars, - this is a bug in your browser, not in Bugzilla. + this is a bug in your browser, not in [% terms.Bugzilla %]. [% END %] - </font> + </font> </p> -[% END %] +[% END %] <form method="get" action="buglist.cgi" name="queryform"> - + [% PROCESS search/form.html.tmpl %] [% PROCESS search/knob.html.tmpl %] diff --git a/template/en/default/search/tabs.html.tmpl b/template/en/default/search/tabs.html.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..f6c14c0e6a276c2d9a323f17ac15e918a0403d04 --- /dev/null +++ b/template/en/default/search/tabs.html.tmpl @@ -0,0 +1,58 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (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.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + # Myk Melez <myk@mozilla.org> + #%] + +[%# INTERFACE: + # tabs: List of hashes. May not be empty. Each hash has two members: + # name: string. Name of the tab and the format it represents. + # description: string. Description of the tab (used in tab title). + #%] + +[% tabs = [ { name => '__DEFAULT__', description => "Advanced Search" }, + { name => 'specific', description => "Find a Specific Bug" } ] %] + +[% current_tab = query_format || format || "__DEFAULT__" %] + +<center> + <table cellspacing="0" cellpadding="10" border="0" width="100%"> + <tr> + <td class="spacer"> </td> + + [% FOREACH tab = tabs %] + [% IF tab.name == current_tab %] + <td align="center" bgcolor="lightblue" class="selected_tab"> + [% tab.description %] + </td> + [% ELSE %] + <td align="center" bgcolor="#BBBBEE" class="unselected_tab"> + <a href="query.cgi + [% IF tab.name != "__DEFAULT__" %]?format=[% tab.name %][% END %]" + > + [% tab.description %] + </a> + </td> + [% END %] + [% END %] + + <td class="spacer"> </td> + </tr> + </table> +</center> diff --git a/template/en/default/sidebar.xul.tmpl b/template/en/default/sidebar.xul.tmpl index a065d447a6372f0a1aaa678ea98e9ba316ede224..0d91b8401e22ef7c4da2a854d5f9507c74e5f04e 100644 --- a/template/en/default/sidebar.xul.tmpl +++ b/template/en/default/sidebar.xul.tmpl @@ -21,6 +21,9 @@ # Scott Collins <scc@mozilla.org> # Christopher A. Aillon <christopher@aillon.com> #%] + +[% PROCESS global/variables.none.tmpl %] + <?xml version="1.0"?> <!-- [% template_version %] --> <?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?> @@ -69,40 +72,41 @@ function normal_keypress_handler( aEvent ) { <box orient="vertical" flex="1"> <text class="text-link" onclick="load_relative_url('query.cgi')" value="new query"/> <text class="text-link" onclick="load_relative_url('report.cgi')" value="reports"/> - <text class="text-link" onclick="load_relative_url('enter_bug.cgi')" value="new bug"/> + <text class="text-link" onclick="load_relative_url('enter_bug.cgi')" value="new [% terms.bug %]"/> <separator class="thin"/> -[% IF username %] +[% IF user %] <text class="text-link" onclick="load_relative_url('userprefs.cgi')" value="edit prefs"/> - [%- IF UserInGroup('tweakparams') %] + [%- IF user.groups.tweakparams %] <text class="text-link" onclick="load_relative_url('editparams.cgi')" value="edit params"/> [%- END %] - [%- IF UserInGroup('editusers') || canblessany %] + [%- IF user.groups.editusers || user.can_bless %] <text class="text-link" onclick="load_relative_url('editusers.cgi')" value="edit users"/> [%- END %] - [%- IF UserInGroup('editcomponents') %] + [%- IF user.groups.editcomponents %] <text class="text-link" onclick="load_relative_url('editcomponents.cgi')" value="edit components"/> [%- END %] - [%- IF UserInGroup('creategroups') %] + [%- IF user.groups.creategroups %] <text class="text-link" onclick="load_relative_url('editgroups.cgi')" value="edit groups"/> [%- END %] - [%- IF UserInGroup('editkeywords') %] + [%- IF user.groups.editkeywords %] <text class="text-link" onclick="load_relative_url('editkeywords.cgi')" value="edit keywords"/> [%- END %] - [%- IF UserInGroup('tweakparams') %] + [%- IF user.groups.tweakparams %] <text class="text-link" onclick="load_relative_url('sanitycheck.cgi')" value="sanity check"/> [%- END %] - <text class="text-link" onclick="load_relative_url('relogin.cgi')" value="logout [% username FILTER html %]"/> + <text class="text-link" onclick="load_relative_url('relogin.cgi')" value="logout [% user.login FILTER html %]"/> <separator class="thin"/> - [%- IF mybugsurl %] - <text class="text-link" onclick="load_relative_url('[% mybugsurl FILTER html %]')" value="my bugs"/> + [%- IF user.showmybugslink %] + [% filtered_username = user.login FILTER url_quote %] + <text class="text-link" onclick="load_relative_url('[% Param('mybugstemplate').replace('%userid%', filtered_username) FILTER js FILTER html %]')" value="my [% terms.bugs %]"/> [%- END %] [%- IF Param('usevotes') %] <text class="text-link" onclick="load_relative_url('votes.cgi?action=show_user')" value="my votes"/> [%- END %] - [%- FOREACH name = namedqueries %] - <text class="text-link" onclick="load_relative_url('buglist.cgi?cmdtype=runnamed&namedcmd=[% name FILTER url_quote %]')" value="[% name FILTER html %]"/> + [%- FOREACH q = user.queries %] + <text class="text-link" onclick="load_relative_url('buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER url_quote %]')" value="[% q.name FILTER html %]"/> [% END %] [% ELSE %] diff --git a/token.cgi b/token.cgi index afe6d03614ae3773891900e15e486daa63c58db4..b2cd790f478ef8eb29200c3873e17f5b829fbda7 100755 --- a/token.cgi +++ b/token.cgi @@ -31,6 +31,8 @@ use lib qw(.); use vars qw($template $vars); +use Bugzilla; + # Include the Bugzilla CGI and general utility library. require "CGI.pl"; @@ -42,6 +44,8 @@ quietly_check_login('permit_anonymous'); # token-related tasks. use Token; +use Bugzilla::User; + ################################################################################ # Data Validation / Security Authorization ################################################################################ @@ -142,7 +146,7 @@ if ($::action eq 'reqpw') { # If the action that the user wants to take (specified in the "a" form field) # is none of the above listed actions, display an error telling the user # that we do not understand what they would like to do. - ThrowCodeError("unknown_action"); + ThrowCodeError("unknown_action", { action => $::action }); } exit; @@ -156,7 +160,7 @@ sub requestChangePassword { $vars->{'message'} = "password_change_request"; - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); } @@ -164,7 +168,7 @@ sub requestChangePassword { sub confirmChangePassword { $vars->{'token'} = $::token; - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("account/password/set-forgotten-password.html.tmpl", $vars) || ThrowTemplateError($template->error()); } @@ -173,7 +177,7 @@ sub cancelChangePassword { $vars->{'message'} = "password_change_canceled"; Token::Cancel($::token, $vars->{'message'}); - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); } @@ -200,14 +204,14 @@ sub changePassword { $vars->{'message'} = "password_changed"; - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); } sub confirmChangeEmail { # Return HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $vars->{'token'} = $::token; @@ -225,7 +229,7 @@ sub changeEmail { my $quotednewemail = SqlQuote($new_email); # Check the user entered the correct old email address - if($::FORM{'email'} ne $old_email) { + if(lc($::FORM{'email'}) ne lc($old_email)) { ThrowUserError("email_confirmation_failed"); } # The new email address should be available as this was @@ -246,10 +250,13 @@ sub changeEmail { SendSQL("DELETE FROM tokens WHERE userid = $userid AND tokentype = 'emailnew'"); SendSQL("UNLOCK TABLES"); - DeriveGroup($userid); + + # The email address has been changed, so we need to rederive the groups + my $user = new Bugzilla::User($userid); + $user->derive_groups; # Return HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); # Let the user know their email address has been changed. @@ -281,7 +288,16 @@ sub cancelChangeEmail { SET login_name = $quotedoldemail WHERE userid = $userid"); SendSQL("UNLOCK TABLES"); - DeriveGroup($userid); + + # email has changed, so rederive groups + # Note that this is done _after_ the tables are unlocked + # This is sort of a race condition (given the lack of transactions) + # but the user had access to it just now, so it's not a security + # issue + + my $user = new Bugzilla::User($userid); + $user->derive_groups; + $vars->{'message'} = "email_change_cancelled_reinstated"; } } @@ -300,7 +316,7 @@ sub cancelChangeEmail { SendSQL("UNLOCK TABLES"); # Return HTTP response headers. - print "Content-Type: text/html\n\n"; + print Bugzilla->cgi->header(); $template->process("global/message.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/userprefs.cgi b/userprefs.cgi index fa340f50f560fc6ce7ad13f61fc5569629e0f0e6..857665f7c33f6ebac033bf660ee2eb537b26bf30 100755 --- a/userprefs.cgi +++ b/userprefs.cgi @@ -24,6 +24,8 @@ use strict; use lib qw(.); +use Bugzilla; + require "CGI.pl"; use RelationSet; @@ -312,8 +314,13 @@ sub SaveFooter { SendSQL("UPDATE profiles SET mybugslink = " . SqlQuote($::FORM{'mybugslink'}) . " WHERE userid = $userid"); - # Regenerate cached info about queries in footer. - $vars->{'user'} = GetUserInfo($::userid); + # Make sure that cached queries in the user object are invalidated + # so that the footer is correct + my $user = Bugzilla->user; + $user->flush_queries_cache(); + + # Also need to update showmybugslink + $user->{showmybugslink} = $::FORM{'mybugslink'} ? 1 : 0; } @@ -354,6 +361,8 @@ confirm_login(); GetVersionTable(); +my $cgi = Bugzilla->cgi; + $vars->{'login'} = $::COOKIE{'Bugzilla_login'}; $vars->{'changes_saved'} = $::FORM{'dosave'}; @@ -390,7 +399,7 @@ SWITCH: for ($current_tab_name) { } # Generate and return the UI (HTML page) from the appropriate template. -print "Content-type: text/html\n\n"; +print $cgi->header(); $template->process("account/prefs/prefs.html.tmpl", $vars) || ThrowTemplateError($template->error()); diff --git a/votes.cgi b/votes.cgi index 6b35fc0276651bca697862dd86ede76b138f9a51..ed7f6ad5197f2be4e7c1acfd5e463ea222b6323c 100644 --- a/votes.cgi +++ b/votes.cgi @@ -26,14 +26,17 @@ use strict; use lib "."; -require "CGI.pl"; +use Bugzilla; +require "CGI.pl"; # Use global template variables use vars qw($template $vars); ConnectToDatabase(); +my $cgi = Bugzilla->cgi; + # If the action is show_bug, you need a bug_id. # If the action is show_user, you can supply a userid to show the votes for # another user, otherwise you see your own. @@ -86,13 +89,15 @@ exit; # Display the names of all the people voting for this one bug. sub show_bug { + my $cgi = Bugzilla->cgi; + my $bug_id = $::FORM{'bug_id'} || ThrowCodeError("missing_bug_id"); my $total = 0; my @users; - SendSQL("SELECT profiles.login_name, votes.who, votes.count + SendSQL("SELECT profiles.login_name, votes.who, votes.vote_count FROM votes, profiles WHERE votes.bug_id = $bug_id AND profiles.userid = votes.who"); @@ -107,7 +112,7 @@ sub show_bug { $vars->{'users'} = \@users; $vars->{'total'} = $total; - print "Content-type: text/html\n\n"; + print $cgi->header(); $template->process("bug/votes/list-for-bug.html.tmpl", $vars) || ThrowTemplateError($template->error()); } @@ -117,18 +122,17 @@ sub show_bug { sub show_user { GetVersionTable(); + my $cgi = Bugzilla->cgi; + # If a bug_id is given, and we're editing, we'll add it to the votes list. my $bug_id = $::FORM{'bug_id'} || ""; - my $name = $::FORM{'user'} || $::COOKIE{'Bugzilla_login'}; - my $who = DBname_to_id($name); - - # After DBNameToIdAndCheck is templatised and prints a Content-Type, - # the above should revert to a call to that function, and this - # special error handling should go away. - $who || ThrowUserError("invalid_username", {name => $name}); + my $name = $::FORM{'user'} || Bugzilla->user->login; + my $who = DBNameToIdAndCheck($name); + my $userid = Bugzilla->user ? Bugzilla->user->id : 0; - my $canedit = 1 if ($name eq $::COOKIE{'Bugzilla_login'}); + my $canedit = 1 if (Bugzilla->user && + $name eq Bugzilla->user->login); SendSQL("LOCK TABLES bugs READ, products READ, votes WRITE, cc READ, bug_group_map READ, user_group_map READ, @@ -137,10 +141,10 @@ sub show_user { if ($canedit && $bug_id) { # Make sure there is an entry for this bug # in the vote table, just so that things display right. - SendSQL("SELECT votes.count FROM votes + SendSQL("SELECT votes.vote_count FROM votes WHERE votes.bug_id = $bug_id AND votes.who = $who"); if (!FetchOneColumn()) { - SendSQL("INSERT INTO votes (who, bug_id, count) + SendSQL("INSERT INTO votes (who, bug_id, vote_count) VALUES ($who, $bug_id, 0)"); } } @@ -167,7 +171,7 @@ sub show_user { my $total = 0; my $onevoteonly = 0; - SendSQL("SELECT votes.bug_id, votes.count, bugs.short_desc, + SendSQL("SELECT votes.bug_id, votes.vote_count, bugs.short_desc, bugs.bug_status FROM votes, bugs, products WHERE votes.who = $who @@ -185,7 +189,7 @@ sub show_user { # and they can see there are votes 'missing', but not on what bug # they are. This seems a reasonable compromise; the alternative is # to lie in the totals. - next if !CanSeeBug($id, $who); + next if !CanSeeBug($id, $userid); push (@bugs, { id => $id, summary => $summary, @@ -193,6 +197,10 @@ sub show_user { opened => IsOpenedState($status) }); } + # In case we didn't populate this earlier (i.e. an error, or + # a not logged in user viewing a users votes) + $maxvotesperbug{$product} ||= 0; + $onevoteonly = 1 if (min($::prodmaxvotes{$product}, $maxvotesperbug{$product}) == 1); @@ -207,13 +215,13 @@ sub show_user { } } - SendSQL("DELETE FROM votes WHERE count <= 0"); + SendSQL("DELETE FROM votes WHERE vote_count <= 0"); SendSQL("UNLOCK TABLES"); $vars->{'voting_user'} = { "login" => $name }; $vars->{'products'} = \@products; - print "Content-type: text/html\n\n"; + print $cgi->header(); $template->process("bug/votes/list-for-user.html.tmpl", $vars) || ThrowTemplateError($template->error()); } @@ -224,6 +232,8 @@ sub record_votes { # Begin Data/Security Validation ############################################################################ + my $cgi = Bugzilla->cgi; + # Build a list of bug IDs for which votes have been submitted. Votes # are submitted in form fields in which the field names are the bug # IDs and the field values are the number of votes. @@ -233,13 +243,13 @@ sub record_votes { # that their votes will get nuked if they continue. if (scalar(@buglist) == 0) { if (!defined($::FORM{'delete_all_votes'})) { - print "Content-type: text/html\n\n"; + print $cgi->header(); $template->process("bug/votes/delete-all.html.tmpl", $vars) || ThrowTemplateError($template->error()); exit(); } elsif ($::FORM{'delete_all_votes'} == 0) { - print "Location: votes.cgi\n\n"; + print $cgi->redirect("votes.cgi"); exit(); } } @@ -261,7 +271,7 @@ sub record_votes { GetVersionTable(); - my $who = DBNameToIdAndCheck($::COOKIE{'Bugzilla_login'}); + my $who = Bugzilla->user->id; # If the user is voting for bugs, make sure they aren't overstuffing # the ballot box. @@ -304,7 +314,7 @@ sub record_votes { # need to clear the user's votes from the database. my %affected; SendSQL("LOCK TABLES bugs write, votes write, products read, cc read, - user_group_map read, bug_group_map read"); + fielddefs read, user_group_map read, bug_group_map read"); # Take note of, and delete the user's old votes from the database. SendSQL("SELECT bug_id FROM votes WHERE who = $who"); @@ -318,7 +328,7 @@ sub record_votes { # Insert the new values in their place foreach my $id (@buglist) { if ($::FORM{$id} > 0) { - SendSQL("INSERT INTO votes (who, bug_id, count) + SendSQL("INSERT INTO votes (who, bug_id, vote_count) VALUES ($who, $id, $::FORM{$id})"); } @@ -327,7 +337,7 @@ sub record_votes { # Update the cached values in the bugs table foreach my $id (keys %affected) { - SendSQL("SELECT sum(count) FROM votes WHERE bug_id = $id"); + SendSQL("SELECT sum(vote_count) FROM votes WHERE bug_id = $id"); my $v = FetchOneColumn(); $v ||= 0; SendSQL("UPDATE bugs SET votes = $v, delta_ts=delta_ts